رویدادهای دامنه
گذرگاه رویداد
بخش با عنوان “گذرگاه رویداد”DomainEventBus یک گذرگاه انتشار/اشتراک پخشهمگانی درونفرایندی است. ناشران publish(event) را فراخوانی میکنند؛ مشترکان یک جریان نوعدار on<T>() را مصرف میکنند. هر رویداد DomainEvent را پیادهسازی میکند و occurredAt را با خود دارد.
گذرگاه درون cc_server اجرا میشود. هر ناشر و هر مشترک زنده همانجا زندگی میکند. هیچ کلاینتی این گذرگاه را نمیبیند — سرور زیرمجموعهای گزینششده را بهصورت فریمهای JSON-RPC با نام notifications/* بازپخش میکند که برای هر مشترک بر پایهٔ عضویت در فضای کاری فیلتر شده است.
| سنجه | شمار |
|---|---|
| کلاسهای رویداد مشخص | ۵۴ |
فایلهای منبع (packages/cc_domain/lib/core/domain/events/) |
۱۴ (بهعلاوهٔ domain_event_bus.dart) |
| بنیادهای انتزاعی که هرگز مستقیماً منتشر نمیشوند | ۱ (TaskLifecycleEvent، یک سلسلهمراتب مهرومومشده) |
هر رویداد در سیاههٔ زیر در همان یک دایرکتوری زندگی میکند؛ هیچ رویداد دامنهای جای دیگری اعلام نشده است.
رویدادهای فضای کاری، عامل و مخزن
بخش با عنوان “رویدادهای فضای کاری، عامل و مخزن”| رویداد | بار داده | زمان انتشار |
|---|---|---|
WorkspaceCreated |
workspaceId |
فضای کاری ساخته میشود |
AgentRunCompleted |
agentId, runId?, workspaceId?, conversationId? |
عامل یک اجرا را تمام میکند (موفق یا ناموفق) |
AgentAwaitingInput |
workspaceId, kind, summary, spaceId?, conversationId?, agentId?, agentName? |
عاملی شروع به انتظار برای یک انسان میکند: یک تأیید، یک پرسش ask_user یا اجرایی که بهخاطر اعتبارنامه متوقف مانده (kind یکی از approval، question یا credential است) |
RepoAdded |
repoId, path, workspaceId |
مخزنی ثبت میشود؛ ایندکسکردن کد در پسزمینه را راه میاندازد |
SkillUpdated |
workspaceId, slug, origin, computedHash, scanVerdict? |
مهارتی نصب یا بهروزرسانی میشود، همراه با حکم اسکن زنجیرهٔ تأمین آن |
رویدادهای PR و بازبینی
بخش با عنوان “رویدادهای PR و بازبینی”بلوک نخست چرخهٔ عمر خود PR است. بلوک دوم پایش PRهای تألیفشده است: نشانههایی دربارهٔ PRی که شما باز کردهاید و هرکدام forUserId را با خود دارند تا نظرسنجی بتواند آنها را بهجای پخش همگانی، به فرد مربوطه برساند.
| رویداد | بار داده | زمان انتشار |
|---|---|---|
PullRequestPublished |
prId, workspaceId, repoOwner, repoName |
عامل یک PR باز میکند |
PullRequestStatusChanged |
status, workspaceId, prId?, repoFullName?, prNumber? |
PR ادغام/بسته/باز/بازگشایی/تأیید میشود |
PrMerged |
prId, workspaceId, agentId |
PR ادغام میشود — نشانهای باریک و فقط مخصوص ادغام که برای تحلیلها/اعلانها نگه داشته شده است |
PrReviewRequested |
workspaceId, repoOwner, repoName, prNumber, prTitle |
GitHub بازبینی کاربر سرور را میخواهد (نظرسنجی اعلانها، review_requested) |
PrMentioned |
workspaceId, repoOwner, repoName, prNumber, prTitle |
کاربر سرور در یک PR منشن میشود (نظرسنجی اعلانها، mention) |
ExternalPrMerged |
workspaceId, repoOwner, repoName, prNumber, prTitle, mergedByLogin? |
یک PR دارای ردیابی بیرونی (غیرعاملی) ادغام میشود که نظرسنجی اعلانهای GitHub آن را شناسایی کرده است؛ به دستهٔ اعلان prMerged نگاشت میشود |
ExternalPrDetected |
repoOwner, repoName, prNumber, prTitle, author, workspaceId? |
PR غیرعاملی با نظرسنجی پیدا میشود — فقط پایپلاین (برانگیزندهٔ external_pr_welcome)، هیچ اعلانی برنمیانگیزد |
PrHeadChanged |
repoOwner, repoName, prNumber, prTitle, previousHeadSha, headSha, workspaceId |
SHA سرِ PR جابهجا میشود — نویسنده push کرده است |
ReviewBecameStale |
workspaceId, spaceId, repoOwner, repoName, prNumber, prTitle, reviewedHeadSha, headSha |
یک بازبینی هوش مصنوعی تمامشده دیگر PRی را که بازبینی کرده توصیف نمیکند. تنها زمانی منتشر میشود که بازبینیای برای کامیت جایگزینشده وجود داشته باشد، پس بهجای پینگی در هر push یک نشانه باقی میماند |
پایش PRهای تألیفشده
بخش با عنوان “پایش PRهای تألیفشده”هر شش رویداد workspaceId، repoOwner، repoName، prNumber، prTitle و یک forUserId اختیاری را با خود دارند.
| رویداد | بار دادهٔ افزوده | زمان انتشار |
|---|---|---|
PrMergeReadinessChanged |
ready, reason |
PRی که شما تألیف کردهاید قابل ادغام شد، یا دیگر نیست |
PrReviewDecisionChanged |
decision, reviewersRemaining, approverLogin? |
بازبینی تأیید کرد، تغییرات درخواست کرد، یا تأییدش رد شد |
PrChecksStatusChanged |
failing, failingCheckName?, failingCheckUrl? |
CI قرمز شد، یا بهبود یافت |
PrCommentMentioned |
commentId, authorLogin, bodyPreview, isReviewComment, threadId?, path?, line? |
کسی شما را در یک دیدگاه PR یا دیدگاه بازبینی منشن کرده است |
PrThreadReplied |
commentId, authorLogin, bodyPreview, threadId?, path?, line? |
کسی در رشتهٔ بازبینیای که شما در آن هستید پاسخ داده است |
PrThreadResolved |
threadId, commentId?, path?, line? |
کسی رشتهٔ بازبینیای که شما در آن هستید را حل کرده است |
رویدادهای پیامرسانی
بخش با عنوان “رویدادهای پیامرسانی”| رویداد | بار داده | زمان انتشار |
|---|---|---|
MessageReceived |
spaceId, messageId, senderName, contentPreview, isAgentMessage, workspaceId?, mentions, requestedByUserId?, senderUserId? |
پیام تازه میرسد |
SpaceCreated |
spaceId, workspaceId |
فضا ساخته میشود |
SpaceDeleted |
spaceId, workspaceId |
فضا حذف میشود |
SpaceProvisioningChanged |
workspaceId, spaceId, status, step? |
فضای کاریِ فضا وارد تأمین میشود، به گامی میرسد (کلون کردن یک مخزن، checkout کردن یک PR، راهاندازی یک عامل)، یا به آماده/ناموفق تغییر میکند — پل گفتگو آن را روی کارت وظیفهاش روایت میکند |
رویدادهای تیکتینگ
بخش با عنوان “رویدادهای تیکتینگ”| رویداد | بار داده | زمان انتشار |
|---|---|---|
TicketCreated |
ticketId, workspaceId |
تیکت ساخته میشود |
TicketAssigned |
ticketId, ticketTitle, ticketBody?, ticketUrl?, assignedAgentId?, assigneeType, assignedTeamId?, workspaceId |
تیکت به یک کنشگر یا تیم تخصیص مییابد |
TicketCompleted |
ticketId |
کار تمام میشود (پایانی) |
TicketFailed |
ticketId, errorMessage |
عامل شکست میخورد (پایانی) |
TicketCancelled |
ticketId |
تیکت لغو میشود (پایانی) |
TicketStatusChanged |
ticketId, workspaceId, from, to |
هر تغییر وضعیت |
TicketReassigned |
ticketId, workspaceId, fromAgentId?, toAgentId? |
تیکت تخصیص مجدد مییابد |
TicketDetailsUpdated |
ticketId, workspaceId |
عنوان، توضیح یا اولویت تغییر میکند |
رویدادهای چرخهٔ عمر وظیفه
بخش با عنوان “رویدادهای چرخهٔ عمر وظیفه”جریان یکپارچهٔ چرخهٔ عمر وظیفه — یک اجرای اعزامشدهٔ عامل که با شناسهٔ گزارش اجرایش کلید میخورد. هر رویداد taskId، یک seq یکنوا بهازای هر وظیفه، workspaceId?، agentId? و یک phase را با خود دارد؛ سطرهای زیر تنها فیلدهای افزوده را فهرست میکنند.
| رویداد | بار داده | زمان انتشار |
|---|---|---|
TaskDispatched |
— | وظیفه برای اجرا به یک بکاند سپرده میشود |
TaskRunning |
— | وظیفه شروع به تولید خروجی میکند |
TaskWaitingLocalDirectory |
lockedPath, holderTaskId? |
وظیفه متوقف میشود — وظیفهٔ دیگری مالک قفل مسیر روی دیسکی است که به آن نیاز دارد |
TaskProgress |
note? |
نقطهٔ بازرسی پیشرفت در میانهٔ اجرا |
TaskMessage |
messageType, content |
پیام جریانی (text/thinking/tool_use/tool_result/error)؛ زیر فاز progress گزارش میشود |
TaskCompleted |
summary? |
وظیفه با موفقیت تمام میشود |
TaskFailed |
errorMessage |
وظیفه با یک خطا تمام میشود |
TaskCancelled |
— | وظیفه پیش از تکمیل لغو میشود |
enum TaskPhase عضوی به نام queued هم دارد، اما هیچچیز رویداد queued را منتشر نمیکند — کلاسی به نام TaskQueued وجود ندارد. نخستین فریم قابل مشاهدهٔ یک وظیفه TaskDispatched است.
رویدادهای پایپلاین
بخش با عنوان “رویدادهای پایپلاین”| رویداد | بار داده | زمان انتشار |
|---|---|---|
PipelineRunCompleted |
workspaceId, pipelineRunId, templateId |
اجرا تمام میشود |
PipelineRunCancelled |
workspaceId, pipelineRunId, templateId |
اجرا لغو میشود (توسط کاربر یا سیستم) — توقفی عامدانه، نه یک خطا |
PipelineRunFailed |
workspaceId, pipelineRunId, templateId, errorMessage |
اجرا شکست میخورد |
تنها گذارهای پایانی منتشر میشوند. PipelineRunStarted وجود ندارد و رویدادی بهازای هر گام هم نیست: پیشرفت یک گام از طریق سطرهای خود اجرا و جریان چرخهٔ عمر وظیفهٔ هر عاملی که اعزام کرده به کلاینتها میرسد، نه از طریق گذرگاه.
رویدادهای رصدپذیری
بخش با عنوان “رویدادهای رصدپذیری”| رویداد | بار داده | زمان انتشار |
|---|---|---|
ActivityLogged |
id, actorType, actorId?, action, entityType, entityId?, details?, workspaceId?, runId? |
ورودی ردّ حسابرسی ساخته میشود |
BudgetThresholdCrossed |
scopeType, scopeId, spentCents, budgetCents, isHardStop |
هزینه از آستانه فراتر میرود |
رویدادهای هویت و عضویت
بخش با عنوان “رویدادهای هویت و عضویت”| رویداد | بار داده | زمان انتشار |
|---|---|---|
WorkspaceMemberAdded |
workspaceId, userId, role |
کاربری به یک فضای کاری میپیوندد (بازخرید دعوت یا افزودن توسط مدیر) |
WorkspaceMemberRemoved |
workspaceId, userId |
عضوی حذف میشود — نشستهای زندهٔ آن کاربر که به فضای کاری محدود شدهاند باید دسترسی را بیدرنگ دوباره بررسی کنند |
WorkspaceMemberRoleChanged |
workspaceId, userId, role |
نقش یک عضو تغییر میکند |
عضویت تمام سطح هویت روی گذرگاه است. ساخت کاربر و لغو دستگاه رخ میدهند، اما بهعنوان رویداد دامنه منتشر نمیشوند — لغو مستقیماً روی نشستهای زنده اعمال میشود، نه از مسیر گذرگاه.
رویدادهای تقویم و جلسه
بخش با عنوان “رویدادهای تقویم و جلسه”| رویداد | بار داده | زمان انتشار |
|---|---|---|
CalendarAuthExpired |
workspaceId, accountEmail |
توکن تازهسازی OAuth یک حساب متصل برای همیشه نامعتبر میشود (یک بار بهازای هر رخداد قطع اتصال منتشر میشود) |
MeetingStartingSoon |
workspaceId, eventId, title, startTime, meetingUrl? |
یک رویداد تقویم در پنجرهٔ مقدماتی پیکربندیشده آغاز میشود |
MeetingRecordingStopped |
workspaceId, meetingId, title, userNotes, transcript, summaryInstructions? |
ضبط یک جلسه تمام میشود و پایپلاین درونی meeting_summary را راه میاندازد |
رویدادهای ریگ
بخش با عنوان “رویدادهای ریگ”| رویداد | بار داده | زمان انتشار |
|---|---|---|
RigClosedEvent |
workspaceId, rigId, reason |
ریگی از میان میرود، همراه با دلیل بستهشدنش؛ مصرفکنندگان تنها به backendFailure واکنش نشان میدهند — هر دلیل دیگری درخواستی است یا با یک RigReaped همراه است |
RigControlChanged |
workspaceId, rigId, controller? |
انسانی کنترل انحصاری یک ریگ را به دست میگیرد یا آن را بازمیگرداند (controller هنگام رهاسازی null است — رویداد ثبت نمیکند که چه کسی رها کرده) |
RigReaped |
workspaceId, rigId, reason, agentId? |
سیستم ماشینی را بازپس میگیرد: بیکاری، TTL، یا بیرونراندن به دلیل فشار حافظه (که بهصورت idleTimeout گزارش میشود)، همراه با عامل گرداننده |
باز شدن یک ریگ رویداد نیست. بوت کامل میشود و سطر ریگ به آماده تغییر میکند؛ چیزی منتشر نمیشود، پس RigOpenedی برای اشتراک وجود ندارد.
زیردامنههایی که هیچ رویدادی ندارند
بخش با عنوان “زیردامنههایی که هیچ رویدادی ندارند”چند زیرسیستم که از بیرون رویدادمحور به نظر میرسند، چنین نیستند. اینجا فهرست شدهاند چون نبودشان تصمیمی طراحی است که ارزش دانستن دارد، پیش از آنکه به دنبال قلابی بگردید:
| زیردامنه | بهجای آن، وضعیت چگونه جابهجا میشود |
|---|---|
| حافظه | record_memory_fact و همخانوادههایش مینویسند و بازمیگردند؛ recall میخواند. هیچچیز روی یک واقعیت یا تعارض منتشر نمیشود |
| ارکستراسیون | پیشنهاد، تأییدش و اجرای پایپلاین تولیدشده سطر و فراخوانی RPCاند |
| اسناد برنامه | submit_plan یک بازنگری مینویسد؛ تأیید یک ارکستراسیون را محقق میکند. هیچکدام اعلام نمیشوند |
| مصنوعات | publish_artifact / revise_artifact بازنگریها را مستقیماً مینویسند |
| تأییدها | تشدید درون سرویس جریان کاری تأیید رسیدگی میشود |
| همگامسازی تیکت | هماهنگکنندهٔ سرویسدهنده در رویدادهای تیکت بالا مشترک میشود؛ وبهوکهای ورودی مستقیماً اعمال میشوند |
| بازتازهسازی تقویم | یک همگامسازی رویدادها را درج/بهروزرسانی میکند و کلاینت دوباره میخواند؛ هیچ پخش همگانیِ بازتازهسازی وجود ندارد |
| ادغامهای worktree | در worktree_merge_log ثبت و از همانجا خوانده میشوند |
مشترکان
بخش با عنوان “مشترکان”هر مشترک زیر درون runCcServer ساخته میشود (یا در سرویسی که آن میسازد). هیچ مشترک سمت کلاینتی وجود ندارد.
| مشترک | رویدادهایی که مصرف میکند |
|---|---|
WorkspaceSeeder |
WorkspaceCreated |
| کاشت مجموعهٔ ارزیابی آغازین (درونخط) | WorkspaceCreated |
| تأمین فضای گفتگو (درونخط) | SpaceCreated |
PipelineTriggerDispatcher |
هر DomainEvent؛ هر تریگر فعال برای نوع خودش فیلتر میکند |
SubPipelineResumeListener |
PipelineRunCompleted, PipelineRunFailed |
PipelineCostRollupListener |
AgentRunCompleted |
BudgetEvaluationListener |
AgentRunCompleted |
MeetingSummaryReconciler |
PipelineRunCompleted, PipelineRunFailed, PipelineRunCancelled (تنها اجراهای meeting_summary) |
PipelineStepResumeListener |
AgentRunCompleted |
AgentRunTaskCompleter |
AgentRunCompleted |
GoalSupervisor |
AgentRunCompleted |
CheckerDispatchListener |
AgentRunCompleted |
TeamRoutingService |
AgentRunCompleted, TicketAssigned |
OrchestrationRunListener |
PipelineRunCancelled, PipelineRunFailed |
MultiVendorTicketSyncCoordinator |
TicketCreated, TicketAssigned, TicketReassigned, TicketStatusChanged, TicketDetailsUpdated |
WorktreeGcListener |
TicketCompleted, TicketCancelled, SpaceDeleted, PrMerged, PullRequestStatusChanged |
ChatBridgeService |
MessageReceived, SpaceProvisioningChanged |
ActivityLogPersister |
ActivityLogged |
RigEventListener |
RigControlChanged, RigReaped, RigClosedEvent — اطلاعیهای به زبان ساده روی خط هدایت عامل گرداننده تزریق میکند |
StaleReviewWatcher |
PrHeadChanged — تنها زمانی ReviewBecameStale را منتشر میکند که بازبینیای تمامشده برای کامیت جایگزینشده وجود داشته باشد |
GitHubPrConversationBridge |
AgentRunCompleted — پاسخهای بیرونروی گفتگوی PR |
NotificationFeedRecorder |
بیستودو رویداد کلاس اعلان در زیر |
RemoteEventForwarder |
همان بیستودو رویداد بهعلاوهٔ TicketReassigned و هر TaskLifecycleEvent. سه رویداد عضویت تنها کش عضویت بهازای هر فضای کاری آن را باطل میکنند؛ بهصورت فریم بازپخش نمیشوند |
LocalRpcServer / RemoteRelayHost |
WorkspaceMemberRemoved — اشتراکهای فضای کاری متصل آن کاربر را میاندازد؛ سوکت باز میماند |
TicketAssigned همزمان یک نشانهٔ حسابرسی و اعلان و یک تریگر پایپلاین است. تخصیص به یک عامل مالکیت را ثبت میکند و هیچ اجرایی شروع نمیکند — هیچ اعزامکنندهٔ تیکتی وجود ندارد. تخصیص به یک تیم (با مقدارگرفتن assignedTeamId) استثناست: TeamRoutingService رهبر تیم را اعزام میکند.
TicketRemoteSyncHandler اعلام شده اما هرگز در کد تولیدی ساخته نمیشود، پس امروز در هیچچیز مشترک نیست. NotificationEventMapper سمت کلاینت تنها در تست خودش ساخته میشود — بازماندهٔ مسیر درونفرایندی از پیش از تفکیک کلاینت/سرور است. نشانهای شناور زنده از فریمهای شبکهای زیر میآیند.
نگاشت اعلان
بخش با عنوان “نگاشت اعلان”روی سرور، NotificationFeedRecorder و RemoteEventForwarder این رویدادها را به فریمهای شبکهای notifications/* تبدیل میکنند (notification_wire.dart). روی کلاینت، RpcNotificationMapper → mapNotificationFrame یک فریم را به یک AppNotification تبدیل میکند.
دقیقاً هفده دستهٔ اعلان وجود دارد. چند رویداد به بیش از یک متد شبکهای نگاشت میشوند، چون فریم لبه را حمل میکند (ناموفق در برابر بهبودیافته) و دسته پرسش را («CI چه میکند؟»).
| دسته | رویداد مبدأ | متد شبکهای |
|---|---|---|
newMessage |
MessageReceived |
notifications/message_received (شما را منشن میکند) |
agentRunCompleted |
MessageReceived |
notifications/message_received (is_agent_message، بدون منشن شما) |
agentAwaitingInput |
AgentAwaitingInput |
notifications/agent_awaiting_input |
ticketAssigned |
TicketAssigned |
notifications/ticket_assigned |
ticketStatusChanged |
TicketStatusChanged |
notifications/ticket_status_changed |
pullRequestPublished |
PullRequestPublished |
notifications/pr_published |
prMerged |
PrMerged |
notifications/pr_merged |
prMerged |
ExternalPrMerged |
notifications/external_pr_merged |
prMentioned |
PrMentioned |
notifications/pr_mentioned |
prMentioned |
PrCommentMentioned |
notifications/pr_comment_mentioned |
reviewRequested |
PrReviewRequested |
notifications/pr_review_requested |
reviewStale |
ReviewBecameStale |
notifications/review_stale |
prMergeReadiness |
PrMergeReadinessChanged |
notifications/pr_ready_to_merge / pr_merge_blocked |
prReviewDecision |
PrReviewDecisionChanged |
notifications/pr_approved / pr_changes_requested / pr_review_dismissed |
prChecksStatus |
PrChecksStatusChanged |
notifications/pr_checks_failed / pr_checks_recovered |
prThreadActivity |
PrThreadReplied |
notifications/pr_thread_replied |
prThreadActivity |
PrThreadResolved |
notifications/pr_thread_resolved |
meetingStartsSoon |
MeetingStartingSoon |
notifications/meeting_starting_soon |
calendarAuthExpired |
CalendarAuthExpired |
notifications/calendar_auth_expired |
rigStatusChanged |
RigControlChanged |
notifications/rig_control_changed |
rigStatusChanged |
RigReaped |
notifications/rig_reaped |
rigStatusChanged |
RigClosedEvent |
notifications/rig_closed |
فریم تحویل گرفتن ریگ به کسی که فرمان را به دست گرفته بازگردانده نمیشود، رهاسازی
بیفیلتر است (رویداد ثبت نمیکند که چه کسی رها کرده)، و تنها بستهشدنی با
backendFailure یک فریم rig_closed تولید میکند — دلیلهای دیگر یا درخواستیاند
یا از پیش با فریم بازپسگیری پوشش داده شدهاند.
AgentAwaitingInput را AgentAwaitingInputPublisher منتشر میکند. این ناشر
رجیستریهای تأییدها و اعتبارنامههای مسدودشده را برای ورودیهای تازه زیر نظر
دارد و AgentQuestionService هر پرسش ask_user را به آن خبر میدهد. هر انتظار
یک رویداد است؛ وقتی انتظار تمام میشود، چیزی منتشر نمیشود.
پنج دستهٔ PRهای تألیفشده forUserId را با خود دارند، پس به نویسنده میرسند نه به همهٔ اعضای فضای کاری.
RemoteEventForwarder بهعلاوهٔ TicketReassigned را بهعنوان notifications/ticket_reassigned و هر TaskLifecycleEvent را بهعنوان notifications/task_<phase> بازپخش میکند. هیچیک به دستهٔ اعلانی نگاشت نمیشوند — آنها رابط کاربری زنده را به حرکت درمیآورند، نه مرکز اعلانها را. رویدادهای عضویت بهصورت فریم بازپخش نمیشوند: کش بازپخشکننده را باطل میکنند و میزبانهای نشست اشتراکهای فضای کاری عضو حذفشده را میاندازند.