דלגו לתוכן

אירועי תחום

ה-DomainEventBus הוא אפיק פרסום/מינוי לשידור בתוך התהליך. המפרסמים קוראים ל-publish(event); המנויים צורכים זרם on<T>() טיפוסי. כל אירוע מממש DomainEvent ונושא occurredAt.

האפיק פועל בתוך cc_server. כל מפרסם וכל מנוי פעיל יושבים שם. שום לקוח אינו רואה את האפיק הזה — השרת מעביר הלאה תת־קבוצה נבחרת כמסגרות notifications/* ב־JSON-RPC, מסוננת לכל מנוי לפי החברות שלו בסביבת עבודה.

מדד מספר
מחלקות אירועים קונקרטיות 54
קובצי מקור (packages/cc_domain/lib/core/domain/events/) 14 (בתוספת domain_event_bus.dart)
בסיסים מופשטים שלעולם אינם מפורסמים ישירות 1 (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? מיומנות מותקנת או מתעדכנת, ונושאת את תוצאת סריקת שרשרת האספקה שלה

אירועי בקשת משיכה וסקירה

קטע בשם “אירועי בקשת משיכה וסקירה”

הבלוק הראשון הוא מחזור החיים של בקשת המשיכה עצמה. השני הוא המעקב אחר בקשות משיכה שיצרתם: אותות על בקשת משיכה שאתם פתחתם, שכל אחד מהם נושא 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 זז — המחבר דחף
ReviewBecameStale workspaceId, spaceId, repoOwner, repoName, prNumber, prTitle, reviewedHeadSha, headSha סקירת AI שהסתיימה אינה מתארת עוד את ה-PR שהיא סקרה. נורה רק כשקיימת סקירה עבור הקומיט שהוחלף, ולכן נשאר אות ולא פינג בכל דחיפה

המעקב אחר בקשות משיכה שיצרתם

קטע בשם “המעקב אחר בקשות משיכה שיצרתם”

כל השישה נושאים workspaceId, repoOwner, repoName, prNumber, prTitle ו-forUserId אופציונלי.

אירוע מטען נוסף נורה כאשר
PrMergeReadinessChanged ready, reason בקשת משיכה שיצרתם הפכה לניתנת למיזוג, או חדלה מלהיות
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 — המשימה בוטלה לפני שהסתיימה

למבנה 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 וחבריו כותבים ומחזירים; האחזור קורא. שום דבר אינו מפרסם על עובדה או התנגשות
תזמור ההצעה, האישור שלה והרצת הפייפליין שנוצרה הם שורות וקריאות RPC
מסמכי תוכנית submit_plan כותב גרסה; אישור מממש תזמור. אף אחד מהם אינו מוכרז
ארטיפקטים publish_artifact / revise_artifact כותבים גרסאות ישירות
אישורים ההסלמה מטופלת בתוך שירות זרימת העבודה של האישורים
סנכרון כרטיסים מתאם הספקים נרשם לאירועי הכרטיסים שלמעלה; וובהוקים נכנסים מיושמים ישירות
רענון לוח שנה סנכרון מבצע upsert לאירועים והלקוח קורא מחדש; אין שידור רענון
מיזוגי עצי עבודה נרשמים ב-worktree_merge_log ונקראים משם

כל מנוי שלהלן נבנה בתוך runCcServer (או בשירות שהוא בונה). אין מנוי בצד הלקוח.

מנוי אירועים שהוא צורך
WorkspaceSeeder WorkspaceCreated
זריעת חבילות הערכה התחלתיות (inline) WorkspaceCreated
הקצאת מרחב צ’אט (inline) 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. המתנה אחת היא אירוע אחד; כשההמתנה מסתיימת, לא מתפרסם דבר.

חמש הקטגוריות של בקשות משיכה שיצרתם נושאות forUserId, ולכן הן מגיעות למחבר ולא לכולם בסביבת העבודה.

RemoteEventForwarder מעביר בנוסף את TicketReassigned בתור notifications/ticket_reassigned ואת כל TaskLifecycleEvent בתור notifications/task_<phase>. אף אחד מהם אינו ממופה לקטגוריית התראה — הם מניעים ממשק משתמש חי, לא את מרכז ההתראות. אירועי חברות אינם מועברים כמסגרות: הם מבטלים את המטמון של המעביר, ומארחי הסשנים מפילים את המינויים של החבר שהוסר.