Acara domain
Bas acara
Bahagian bertajuk “Bas acara”DomainEventBus ialah bas terbit/langgan siaran dalam proses. Penerbit memanggil publish(event); pelanggan menggunakan strim on<T>() yang bertaip. Setiap acara melaksanakan DomainEvent dan membawa occurredAt.
Bas ini berjalan dalam cc_server. Setiap penerbit dan setiap pelanggan yang hidup berada di situ. Tiada klien melihat bas ini — pelayan memajukan subset terpilih sebagai bingkai JSON-RPC notifications/*, ditapis bagi setiap pelanggan mengikut keahlian ruang kerja.
| Ukuran | Bilangan |
|---|---|
| Kelas acara konkrit | 54 |
Fail sumber (packages/cc_domain/lib/core/domain/events/) |
14 (serta domain_event_bus.dart) |
| Asas abstrak yang tidak pernah diterbitkan secara langsung | 1 (TaskLifecycleEvent, satu hierarki tertutup) |
Setiap acara dalam katalog di bawah berada dalam direktori yang sama itu; tiada acara domain diisytiharkan di tempat lain.
Acara ruang kerja, ejen dan repo
Bahagian bertajuk “Acara ruang kerja, ejen dan repo”| Acara | Muatan | Tercetus apabila |
|---|---|---|
WorkspaceCreated |
workspaceId |
Ruang kerja dicipta |
AgentRunCompleted |
agentId, runId?, workspaceId?, conversationId? |
Ejen menamatkan satu larian (berjaya atau gagal) |
AgentAwaitingInput |
workspaceId, kind, summary, spaceId?, conversationId?, agentId?, agentName? |
Ejen mula menunggu manusia: kelulusan, soalan ask_user atau larian yang tertahan pada kelayakan (kind ialah approval, question atau credential) |
RepoAdded |
repoId, path, workspaceId |
Repo didaftarkan; mencetuskan pengindeksan kod latar belakang |
SkillUpdated |
workspaceId, slug, origin, computedHash, scanVerdict? |
Kemahiran dipasang atau dikemas kini, sambil membawa keputusan imbasan rantaian bekalan |
Acara PR dan semakan
Bahagian bertajuk “Acara PR dan semakan”Blok pertama ialah kitaran hayat PR itu sendiri. Blok kedua ialah pemantauan PR yang ditulis sendiri: isyarat tentang PR yang anda buka, setiap satu membawa forUserId supaya pengundian boleh menghalakannya kepada orang yang berkenaan dan bukan menyiarkannya kepada semua orang.
| Acara | Muatan | Tercetus apabila |
|---|---|---|
PullRequestPublished |
prId, workspaceId, repoOwner, repoName |
Ejen membuka satu PR |
PullRequestStatusChanged |
status, workspaceId, prId?, repoFullName?, prNumber? |
PR dicantum/ditutup/dibuka/dibuka semula/diluluskan |
PrMerged |
prId, workspaceId, agentId |
PR dicantum — isyarat khusus cantuman yang disimpan untuk analitik/pemberitahuan |
PrReviewRequested |
workspaceId, repoOwner, repoName, prNumber, prTitle |
GitHub meminta semakan daripada pengguna pelayan (pengundian pemberitahuan, review_requested) |
PrMentioned |
workspaceId, repoOwner, repoName, prNumber, prTitle |
Pengguna pelayan disebut pada satu PR (pengundian pemberitahuan, mention) |
ExternalPrMerged |
workspaceId, repoOwner, repoName, prNumber, prTitle, mergedByLogin? |
PR yang dipantau secara luaran (bukan ejen) dicantum, dikesan oleh pengundian pemberitahuan GitHub; memetakan kepada kategori pemberitahuan prMerged |
ExternalPrDetected |
repoOwner, repoName, prNumber, prTitle, author, workspaceId? |
PR bukan ejen ditemui melalui pengundian — untuk pipeline sahaja (memacu external_pr_welcome), tidak menimbulkan sebarang pemberitahuan |
PrHeadChanged |
repoOwner, repoName, prNumber, prTitle, previousHeadSha, headSha, workspaceId |
SHA kepala PR berubah — penulis membuat push |
ReviewBecameStale |
workspaceId, spaceId, repoOwner, repoName, prNumber, prTitle, reviewedHeadSha, headSha |
Semakan AI yang sudah selesai tidak lagi menerangkan PR yang disemaknya. Hanya tercetus apabila wujud semakan bagi commit yang digantikan, jadi ia kekal sebagai isyarat dan bukan ping bagi setiap push |
Pemantauan PR yang ditulis sendiri
Bahagian bertajuk “Pemantauan PR yang ditulis sendiri”Kesemua enam membawa workspaceId, repoOwner, repoName, prNumber, prTitle dan forUserId yang pilihan.
| Acara | Muatan tambahan | Tercetus apabila |
|---|---|---|
PrMergeReadinessChanged |
ready, reason |
PR yang anda tulis menjadi boleh dicantum, atau tidak lagi |
PrReviewDecisionChanged |
decision, reviewersRemaining, approverLogin? |
Penyemak meluluskan, meminta perubahan, atau kelulusannya ditolak |
PrChecksStatusChanged |
failing, failingCheckName?, failingCheckUrl? |
CI menjadi merah, atau pulih semula |
PrCommentMentioned |
commentId, authorLogin, bodyPreview, isReviewComment, threadId?, path?, line? |
Seseorang menyebut anda dalam ulasan PR atau ulasan semakan |
PrThreadReplied |
commentId, authorLogin, bodyPreview, threadId?, path?, line? |
Seseorang membalas dalam benang semakan yang anda sertai |
PrThreadResolved |
threadId, commentId?, path?, line? |
Seseorang menyelesaikan benang semakan yang anda sertai |
Acara pemesejan
Bahagian bertajuk “Acara pemesejan”| Acara | Muatan | Tercetus apabila |
|---|---|---|
MessageReceived |
spaceId, messageId, senderName, contentPreview, isAgentMessage, workspaceId?, mentions, requestedByUserId?, senderUserId? |
Mesej baharu tiba |
SpaceCreated |
spaceId, workspaceId |
Ruang dicipta |
SpaceDeleted |
spaceId, workspaceId |
Ruang dipadam |
SpaceProvisioningChanged |
workspaceId, spaceId, status, step? |
Ruang kerja bagi ruang itu memasuki penyediaan, mencapai satu langkah (mengklon repo, checkout PR, menyediakan ejen), atau bertukar kepada sedia/gagal — jambatan sembang menceritakannya pada kad tugasnya |
Acara penetikan
Bahagian bertajuk “Acara penetikan”| Acara | Muatan | Tercetus apabila |
|---|---|---|
TicketCreated |
ticketId, workspaceId |
Tiket dicipta |
TicketAssigned |
ticketId, ticketTitle, ticketBody?, ticketUrl?, assignedAgentId?, assigneeType, assignedTeamId?, workspaceId |
Tiket ditugaskan kepada prinsipal atau pasukan |
TicketCompleted |
ticketId |
Kerja selesai (terminal) |
TicketFailed |
ticketId, errorMessage |
Ejen gagal (terminal) |
TicketCancelled |
ticketId |
Tiket dibatalkan (terminal) |
TicketStatusChanged |
ticketId, workspaceId, from, to |
Sebarang perubahan status |
TicketReassigned |
ticketId, workspaceId, fromAgentId?, toAgentId? |
Tiket ditugaskan semula |
TicketDetailsUpdated |
ticketId, workspaceId |
Tajuk, perihalan, atau keutamaan berubah |
Acara kitaran hayat tugas
Bahagian bertajuk “Acara kitaran hayat tugas”Strim kitaran hayat tugas yang bersatu — satu larian ejen yang dihantar, dikunci oleh id log lariannya. Setiap acara membawa taskId, seq monotonik bagi setiap tugas, workspaceId?, agentId? dan satu phase; baris di bawah menyenaraikan medan tambahan sahaja.
| Acara | Muatan | Tercetus apabila |
|---|---|---|
TaskDispatched |
— | Tugas diserahkan kepada bahagian belakang untuk dilaksanakan |
TaskRunning |
— | Tugas mula menghasilkan output |
TaskWaitingLocalDirectory |
lockedPath, holderTaskId? |
Tugas diletakkan — tugas lain memiliki kunci laluan pada cakera yang diperlukannya |
TaskProgress |
note? |
Titik semak kemajuan pertengahan larian |
TaskMessage |
messageType, content |
Mesej yang distrim (text/thinking/tool_use/tool_result/error); dilaporkan di bawah fasa progress |
TaskCompleted |
summary? |
Tugas selesai dengan jayanya |
TaskFailed |
errorMessage |
Tugas tamat dengan ralat |
TaskCancelled |
— | Tugas dibatalkan sebelum selesai |
Enum TaskPhase juga mempunyai ahli queued, tetapi tiada apa-apa menerbitkan acara queued — tiada kelas TaskQueued. Bingkai pertama yang boleh diperhatikan bagi sesuatu tugas ialah TaskDispatched.
Acara pipeline
Bahagian bertajuk “Acara pipeline”| Acara | Muatan | Tercetus apabila |
|---|---|---|
PipelineRunCompleted |
workspaceId, pipelineRunId, templateId |
Larian selesai |
PipelineRunCancelled |
workspaceId, pipelineRunId, templateId |
Larian dibatalkan (oleh pengguna atau sistem) — hentian yang disengajakan, bukan ralat |
PipelineRunFailed |
workspaceId, pipelineRunId, templateId, errorMessage |
Larian gagal |
Hanya peralihan terminal diterbitkan. Tiada PipelineRunStarted dan tiada acara bagi setiap langkah: kemajuan sesuatu langkah sampai kepada klien melalui baris larian itu sendiri dan strim kitaran hayat tugas bagi mana-mana ejen yang dihantarnya, bukan melalui bas.
Acara kebolehcerapan
Bahagian bertajuk “Acara kebolehcerapan”| Acara | Muatan | Tercetus apabila |
|---|---|---|
ActivityLogged |
id, actorType, actorId?, action, entityType, entityId?, details?, workspaceId?, runId? |
Entri jejak audit dicipta |
BudgetThresholdCrossed |
scopeType, scopeId, spentCents, budgetCents, isHardStop |
Perbelanjaan melebihi ambang |
Acara identiti dan keahlian
Bahagian bertajuk “Acara identiti dan keahlian”| Acara | Muatan | Tercetus apabila |
|---|---|---|
WorkspaceMemberAdded |
workspaceId, userId, role |
Pengguna menyertai ruang kerja (penebusan jemputan atau penambahan oleh pentadbir) |
WorkspaceMemberRemoved |
workspaceId, userId |
Ahli dibuang — sesi hidup pengguna itu yang berskop kepada ruang kerja mesti menyemak semula akses dengan segera |
WorkspaceMemberRoleChanged |
workspaceId, userId, role |
Peranan ahli berubah |
Keahlian ialah keseluruhan permukaan identiti pada bas ini. Penciptaan pengguna dan pembatalan peranti berlaku, tetapi ia tidak diterbitkan sebagai acara domain — pembatalan dikuatkuasakan secara terus terhadap sesi hidup dan bukan dialihkan melalui bas.
Acara kalendar dan mesyuarat
Bahagian bertajuk “Acara kalendar dan mesyuarat”| Acara | Muatan | Tercetus apabila |
|---|---|---|
CalendarAuthExpired |
workspaceId, accountEmail |
Token penyegaran OAuth bagi akaun yang bersambung menjadi tidak sah secara kekal (diterbitkan sekali bagi setiap episod pemutusan sambungan) |
MeetingStartingSoon |
workspaceId, eventId, title, startTime, meetingUrl? |
Acara kalendar akan bermula dalam tetingkap amaran awal yang dikonfigurasikan |
MeetingRecordingStopped |
workspaceId, meetingId, title, userNotes, transcript, summaryInstructions? |
Rakaman mesyuarat tamat dan mencetuskan pipeline meeting_summary terbina |
Acara stesen
Bahagian bertajuk “Acara stesen”| Acara | Muatan | Tercetus apabila |
|---|---|---|
RigClosedEvent |
workspaceId, rigId, reason |
Sebuah stesen hilang, berserta sebab penutupannya; pelanggan bertindak hanya pada backendFailure — setiap sebab lain diminta atau disertai oleh RigReaped |
RigControlChanged |
workspaceId, rigId, controller? |
Seorang manusia mengambil kawalan eksklusif ke atas stesen atau memulangkannya (controller null apabila dilepaskan — acara ini tidak merekod siapa yang melepaskannya) |
RigReaped |
workspaceId, rigId, reason, agentId? |
Sistem menuntut semula sebuah mesin: melahu, TTL, atau penyingkiran akibat tekanan memori (dilaporkan sebagai idleTimeout), berserta ejen pemandunya |
Pembukaan stesen bukan satu acara. But selesai dan baris stesen bertukar kepada sedia; tiada apa-apa diterbitkan, jadi tiada RigOpened untuk dilanggan.
Subdomain yang langsung tiada acara
Bahagian bertajuk “Subdomain yang langsung tiada acara”Beberapa subsistem yang kelihatan dipacu acara dari luar sebenarnya tidak. Ia disenaraikan di sini kerana ketiadaannya ialah keputusan reka bentuk yang wajar diketahui sebelum anda mencari sebarang cangkuk:
| Subdomain | Bagaimana keadaan bergerak sebaliknya |
|---|---|
| Memori | record_memory_fact dan rakan-rakannya menulis dan kembali; dapatan semula membaca. Tiada apa-apa menerbitkan tentang sesuatu fakta atau konflik |
| Orkestrasi | Cadangan, kelulusannya dan larian pipeline yang dijana ialah baris dan panggilan RPC |
| Dokumen pelan | submit_plan menulis satu revisi; kelulusan mewujudkan satu orkestrasi. Kedua-duanya tidak diumumkan |
| Artifak | publish_artifact / revise_artifact menulis revisi secara terus |
| Kelulusan | Eskalasi dikendalikan dalam perkhidmatan aliran kerja kelulusan |
| Penyegerakan tiket | Penyelaras vendor melanggan acara tiket di atas; webhook masuk digunakan secara terus |
| Penyegaran kalendar | Satu penyegerakan upsert acara dan klien membaca semula; tiada siaran penyegaran |
| Cantuman worktree | Direkodkan dalam worktree_merge_log dan dibaca dari situ |
Pelanggan
Bahagian bertajuk “Pelanggan”Setiap pelanggan di bawah dibina dalam runCcServer (atau perkhidmatan yang dibinanya). Tiada pelanggan di pihak klien.
| Pelanggan | Acara yang digunakannya |
|---|---|
WorkspaceSeeder |
WorkspaceCreated |
| Penyemaian suite eval permulaan (sebaris) | WorkspaceCreated |
| Penyediaan ruang sembang (sebaris) | SpaceCreated |
PipelineTriggerDispatcher |
Setiap DomainEvent; setiap pencetus yang didayakan menapis mengikut jenisnya sendiri |
SubPipelineResumeListener |
PipelineRunCompleted, PipelineRunFailed |
PipelineCostRollupListener |
AgentRunCompleted |
BudgetEvaluationListener |
AgentRunCompleted |
MeetingSummaryReconciler |
PipelineRunCompleted, PipelineRunFailed, PipelineRunCancelled (larian meeting_summary sahaja) |
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 — menyuntik notis dalam bahasa mudah ke lorong pemanduan ejen pemandunya |
StaleReviewWatcher |
PrHeadChanged — menerbitkan ReviewBecameStale hanya apabila wujud semakan selesai bagi commit yang digantikan |
GitHubPrConversationBridge |
AgentRunCompleted — balasan perbualan PR keluar |
NotificationFeedRecorder |
Kedua puluh dua acara kelas pemberitahuan di bawah |
RemoteEventForwarder |
Kedua puluh dua itu serta TicketReassigned dan setiap TaskLifecycleEvent. Tiga acara keahlian itu hanya membatalkan kesahihan cache keahlian bagi setiap ruang kerjanya; ia tidak dimajukan sebagai bingkai |
LocalRpcServer / RemoteRelayHost |
WorkspaceMemberRemoved — menggugurkan langganan ruang kerja yang dilampirkan oleh pengguna itu; soket kekal terbuka |
TicketAssigned ialah isyarat audit dan pemberitahuan serta pencetus pipeline. Penugasan kepada ejen merekodkan pemilikan dan tidak memulakan sebarang larian — tiada penghantar tiket. Penugasan kepada pasukan (assignedTeamId ditetapkan) ialah pengecualiannya: TeamRoutingService menghantar ketua pasukan.
TicketRemoteSyncHandler diisytiharkan tetapi tidak pernah dibina dalam kod pengeluaran, jadi ia tidak melanggan apa-apa hari ini. NotificationEventMapper di pihak klien dibina hanya dalam ujiannya sendiri — ia ialah sisa laluan dalam proses dari sebelum pemisahan klien/pelayan. Toast langsung datang daripada bingkai wayar di bawah.
Pemetaan pemberitahuan
Bahagian bertajuk “Pemetaan pemberitahuan”Di pelayan, NotificationFeedRecorder dan RemoteEventForwarder menukar acara ini menjadi bingkai wayar notifications/* (notification_wire.dart). Di klien, RpcNotificationMapper → mapNotificationFrame menukar bingkai menjadi AppNotification.
Terdapat tepat tujuh belas kategori pemberitahuan. Beberapa acara memetakan kepada lebih daripada satu kaedah wayar, kerana bingkai membawa tepi itu (gagal berbanding pulih) manakala kategori membawa soalan (“apa yang sedang CI lakukan?”).
| Kategori | Acara sumber | Kaedah wayar |
|---|---|---|
newMessage |
MessageReceived |
notifications/message_received (menyebut anda) |
agentRunCompleted |
MessageReceived |
notifications/message_received (is_agent_message, tidak menyebut anda) |
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 |
Bingkai pengambilalihan stesen tidak dihantar kembali kepada sesiapa yang
mengambil alihnya, pelepasan tidak ditapis (acara tidak merekod siapa yang
melepaskannya), dan hanya penutupan backendFailure menghasilkan bingkai
rig_closed — sebab-sebab lain sama ada diminta atau sudah diliputi oleh
bingkai penuaian.
AgentAwaitingInput diterbitkan oleh AgentAwaitingInputPublisher, yang
memerhati daftar kelulusan dan daftar sekatan kelayakan untuk entri baharu, dan
dimaklumkan tentang setiap soalan ask_user oleh AgentQuestionService. Satu
penantian ialah satu acara; tiada apa-apa diterbitkan apabila penantian
berakhir.
Kelima-lima kategori PR yang ditulis sendiri membawa forUserId, jadi ia sampai kepada penulis dan bukan kepada semua orang dalam ruang kerja.
RemoteEventForwarder turut memajukan TicketReassigned sebagai notifications/ticket_reassigned dan setiap TaskLifecycleEvent sebagai notifications/task_<phase>. Kedua-duanya tidak memetakan kepada mana-mana kategori pemberitahuan — ia memacu UI langsung, bukan pusat pemberitahuan. Acara keahlian tidak dimajukan sebagai bingkai: ia membatalkan kesahihan cache pemaju itu, dan hos sesi menggugurkan langganan ruang kerja ahli yang dibuang.