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