رفتن به محتوا

رویدادهای دامنه

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ی که شما باز کرده‌اید و هرکدام 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 یک نشانه باقی می‌ماند

هر شش رویداد 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> بازپخش می‌کند. هیچ‌یک به دستهٔ اعلانی نگاشت نمی‌شوند — آن‌ها رابط کاربری زنده را به حرکت درمی‌آورند، نه مرکز اعلان‌ها را. رویدادهای عضویت به‌صورت فریم بازپخش نمی‌شوند: کش بازپخش‌کننده را باطل می‌کنند و میزبان‌های نشست اشتراک‌های فضای کاری عضو حذف‌شده را می‌اندازند.