İçeriğe geç

Alan olayları

DomainEventBus, süreç içi çalışan, yayın tabanlı bir yayımla/abone ol veri yoludur. Yayıncılar publish(event) çağırır; aboneler tipli bir on<T>() akışı tüketir. Her olay DomainEvent uygular ve occurredAt taşır.

Veri yolu cc_server içinde çalışır. Her yayıncı ve her canlı abone orada yaşar. Hiçbir istemci bu veri yolunu görmez — sunucu, abone başına çalışma alanı üyeliğine göre süzülen özenle seçilmiş bir alt kümeyi notifications/* JSON-RPC çerçeveleri olarak iletir.

Ölçüt Sayı
Somut olay sınıfları 54
Kaynak dosyalar (packages/cc_domain/lib/core/domain/events/) 14 (artı domain_event_bus.dart)
Doğrudan hiç yayımlanmayan soyut temel sınıflar 1 (TaskLifecycleEvent, kapalı bir hiyerarşi)

Aşağıdaki katalogdaki her olay bu tek dizinde yaşar; başka hiçbir yerde bildirilmiş alan olayı yoktur.

Olay Yük Ne zaman tetiklenir
WorkspaceCreated workspaceId Çalışma alanı oluşturulur
AgentRunCompleted agentId, runId?, workspaceId?, conversationId? Ajan bir çalıştırmayı bitirir (başarılı ya da başarısız)
AgentAwaitingInput workspaceId, kind, summary, spaceId?, conversationId?, agentId?, agentName? Bir ajan bir insanı beklemeye başlar: bir onay, bir ask_user sorusu ya da kimlik bilgisi yüzünden bekletilen bir çalıştırma (kind değeri approval, question veya credential olur)
RepoAdded repoId, path, workspaceId Bir depo kaydedilir; arka planda kod dizinlemeyi tetikler
SkillUpdated workspaceId, slug, origin, computedHash, scanVerdict? Bir beceri kurulur veya güncellenir; tedarik zinciri tarama kararını taşır

İlk blok, PR’ın kendi yaşam döngüsüdür. İkincisi ise yazdığınız PR’ların izlenmesidir: sizin açtığınız bir PR hakkındaki sinyaller; her biri forUserId taşır; böylece yoklama bunları herkese yayınlamak yerine ilgili kişiye yönlendirebilir.

Olay Yük Ne zaman tetiklenir
PullRequestPublished prId, workspaceId, repoOwner, repoName Ajan bir PR açar
PullRequestStatusChanged status, workspaceId, prId?, repoFullName?, prNumber? PR birleştirildi/kapatıldı/açıldı/yeniden açıldı/onaylandı
PrMerged prId, workspaceId, agentId PR birleştirilir — analitik ve bildirimler için tutulan, yalnızca birleştirmeye özel dar bir sinyal
PrReviewRequested workspaceId, repoOwner, repoName, prNumber, prTitle GitHub, sunucu kullanıcısından inceleme ister (bildirim yoklaması, review_requested)
PrMentioned workspaceId, repoOwner, repoName, prNumber, prTitle Sunucu kullanıcısından bir PR’da söz edilir (bildirim yoklaması, mention)
ExternalPrMerged workspaceId, repoOwner, repoName, prNumber, prTitle, mergedByLogin? Dışarıdan izlenen (ajan dışı) bir PR birleştirildi; GitHub bildirim yoklaması tarafından algılanır; prMerged bildirim kategorisine eşlenir
ExternalPrDetected repoOwner, repoName, prNumber, prTitle, author, workspaceId? Yoklama ile ajan dışı bir PR bulundu — yalnızca pipeline’a yönelik (external_pr_welcome tetikler), bildirim üretmez
PrHeadChanged repoOwner, repoName, prNumber, prTitle, previousHeadSha, headSha, workspaceId PR’ın head SHA’sı değişti — yazar push’ladı
ReviewBecameStale workspaceId, spaceId, repoOwner, repoName, prNumber, prTitle, reviewedHeadSha, headSha Tamamlanmış bir YZ incelemesi, incelediği PR’ı artık tanımlamıyor. Yalnızca değiştirilen commit için bir inceleme varsa tetiklenir; böylece her push’ta bir uyarı değil, bir sinyal olarak kalır

Altısının tamamı workspaceId, repoOwner, repoName, prNumber, prTitle ve isteğe bağlı bir forUserId taşır.

Olay Ek yük Ne zaman tetiklenir
PrMergeReadinessChanged ready, reason Yazdığınız bir PR birleştirilebilir hâle geldi ya da artık değil
PrReviewDecisionChanged decision, reviewersRemaining, approverLogin? Bir inceleyici onayladı, değişiklik istedi ya da bir onay geçersiz kılındı
PrChecksStatusChanged failing, failingCheckName?, failingCheckUrl? CI kırmızıya döndü ya da yeniden yeşile döndü
PrCommentMentioned commentId, authorLogin, bodyPreview, isReviewComment, threadId?, path?, line? Biri sizi bir PR yorumunda ya da inceleme yorumunda andı
PrThreadReplied commentId, authorLogin, bodyPreview, threadId?, path?, line? Katıldığınız bir inceleme konusunda biri yanıtladı
PrThreadResolved threadId, commentId?, path?, line? Katıldığınız bir inceleme konusunu biri çözdü
Olay Yük Ne zaman tetiklenir
MessageReceived spaceId, messageId, senderName, contentPreview, isAgentMessage, workspaceId?, mentions, requestedByUserId?, senderUserId? Yeni mesaj gelir
SpaceCreated spaceId, workspaceId Alan oluşturulur
SpaceDeleted spaceId, workspaceId Alan silinir
SpaceProvisioningChanged workspaceId, spaceId, status, step? Alanın çalışma alanı sağlamaya girer, bir adıma ulaşır (depo klonlama, PR çıkarma, ajan kurma) ya da hazır/başarısız durumuna geçer — sohbet köprüsü bunu görev kartında anlatır
Olay Yük Ne zaman tetiklenir
TicketCreated ticketId, workspaceId Bilet oluşturulur
TicketAssigned ticketId, ticketTitle, ticketBody?, ticketUrl?, assignedAgentId?, assigneeType, assignedTeamId?, workspaceId Bilet bir sorumluya ya da ekibe atanır
TicketCompleted ticketId İş biter (nihai)
TicketFailed ticketId, errorMessage Ajan başarısız olur (nihai)
TicketCancelled ticketId Bilet iptal edilir (nihai)
TicketStatusChanged ticketId, workspaceId, from, to Herhangi bir durum değişikliği
TicketReassigned ticketId, workspaceId, fromAgentId?, toAgentId? Bilet yeniden atanır
TicketDetailsUpdated ticketId, workspaceId Başlık, açıklama veya öncelik değişir

Birleşik görev yaşam döngüsü akışı — çalıştırma günlüğü kimliğiyle anahtarlanan, gönderilmiş tek bir ajan çalıştırması. Her olay taskId, görev başına monoton bir seq, workspaceId?, agentId? ve bir phase taşır; aşağıdaki satırlar yalnızca ek alanları listeler.

Olay Yük Ne zaman tetiklenir
TaskDispatched — Görev, yürütülmek üzere bir arka uca teslim edilir
TaskRunning — Görev çıktı üretmeye başladı
TaskWaitingLocalDirectory lockedPath, holderTaskId? Görev park edildi — ihtiyaç duyduğu diskteki yol kilidinin sahibi başka bir görev
TaskProgress note? Çalıştırma ortasında ilerleme kontrol noktası
TaskMessage messageType, content Akışa verilen mesaj (text/thinking/tool_use/tool_result/error); progress aşaması altında bildirilir
TaskCompleted summary? Görev başarıyla tamamlandı
TaskFailed errorMessage Görev bir hatayla sonuçlandı
TaskCancelled — Görev tamamlanmadan iptal edildi

TaskPhase numaralandırmasında ayrıca bir queued üyesi vardır, ancak hiçbir şey kuyruğa alınma olayı yayımlamaz — TaskQueued diye bir sınıf yoktur. Bir görevin gözlemlenebilir ilk çerçevesi TaskDispatched’tır.

Olay Yük Ne zaman tetiklenir
PipelineRunCompleted workspaceId, pipelineRunId, templateId Çalıştırma biter
PipelineRunCancelled workspaceId, pipelineRunId, templateId Çalıştırma iptal edilir (kullanıcı ya da sistem tarafından) — hata değil, bilinçli bir durdurma
PipelineRunFailed workspaceId, pipelineRunId, templateId, errorMessage Çalıştırma başarısız olur

Yalnızca nihai geçişler yayımlanır. Ne bir PipelineRunStarted ne de adım başına bir olay vardır: bir adımın ilerlemesi istemcilere veri yolu üzerinden değil, çalıştırmanın kendi satırları ve gönderdiği ajanın görev yaşam döngüsü akışı üzerinden ulaşır.

Olay Yük Ne zaman tetiklenir
ActivityLogged id, actorType, actorId?, action, entityType, entityId?, details?, workspaceId?, runId? Denetim kaydı girdisi oluşturulur
BudgetThresholdCrossed scopeType, scopeId, spentCents, budgetCents, isHardStop Harcama eşiği aşar
Olay Yük Ne zaman tetiklenir
WorkspaceMemberAdded workspaceId, userId, role Bir kullanıcı bir çalışma alanına katılır (davet kullanımı ya da yönetici eklemesi)
WorkspaceMemberRemoved workspaceId, userId Bir üye çıkarılır — o kullanıcının çalışma alanına kapsanmış canlı oturumları erişimi hemen yeniden denetlemelidir
WorkspaceMemberRoleChanged workspaceId, userId, role Bir üyenin rolü değişir

Üyelik, veri yolundaki kimlik yüzeyinin tamamıdır. Kullanıcı oluşturma ve cihaz iptali gerçekleşir, ancak alan olayı olarak yayımlanmaz — iptal, veri yolundan geçirilmek yerine doğrudan canlı oturumlara karşı uygulanır.

Olay Yük Ne zaman tetiklenir
CalendarAuthExpired workspaceId, accountEmail Bağlı bir hesabın OAuth yenileme belirteci kalıcı olarak geçersiz (bağlantı kesilme olayı başına bir kez yayımlanır)
MeetingStartingSoon workspaceId, eventId, title, startTime, meetingUrl? Bir takvim etkinliği ayarlanan ön uyarı aralığı içinde başlıyor
MeetingRecordingStopped workspaceId, meetingId, title, userNotes, transcript, summaryInstructions? Bir toplantı kaydı tamamlanır ve yerleşik meeting_summary pipeline’ını tetikler
Olay Yük Ne zaman tetiklenir
RigClosedEvent workspaceId, rigId, reason Bir rig ortadan kalktı, kapanma nedeniyle birlikte; tüketiciler yalnızca backendFailure üzerine işlem yapar — diğer tüm nedenler ya istenmiştir ya da bir RigReaped ile birlikte gelir
RigControlChanged workspaceId, rigId, controller? Bir insan bir rig’in özel denetimini aldı ya da geri verdi (bırakıldığında controller null — olay kimin bıraktığını kaydetmez)
RigReaped workspaceId, rigId, reason, agentId? Sistem bir makineyi geri aldı: boşta kalma, TTL veya bellek baskısı tahliyesi (idleTimeout olarak bildirilir); sürücü ajanla birlikte

Bir rig’in açılması bir olay değildir. Önyükleme tamamlanır ve rig’in satırı hazır durumuna geçer; hiçbir şey yayımlanmaz, dolayısıyla abone olunacak bir RigOpened yoktur.

Dışarıdan olay güdümlü görünen birkaç alt sistem aslında öyle değildir. Burada listelenmelerinin nedeni, yokluklarının bir kanca aramaya başlamadan önce bilinmeye değer bir tasarım kararı olmasıdır:

Alt alan Durumun bunun yerine nasıl ilerlediği
Bellek record_memory_fact ve benzerleri yazar ve döner; geri çağırma okur. Bir olgu ya da çakışma üzerine hiçbir şey yayımlanmaz
Orkestrasyon Öneri, onayı ve üretilen pipeline çalıştırması satırlar ve RPC çağrılarıdır
Plan belgeleri submit_plan bir revizyon yazar; onay bir orkestrasyonu somutlaştırır. İkisi de duyurulmaz
Artifaktlar publish_artifact / revise_artifact doğrudan revizyon yazar
Onaylar Yükseltme, onay iş akışı hizmetinin içinde ele alınır
Bilet eşitleme Sağlayıcı koordinatörü yukarıdaki bilet olaylarına abone olur; gelen web kancaları doğrudan uygulanır
Takvim yenileme Bir eşitleme etkinlikleri upsert eder ve istemci yeniden okur; yenileme yayını yoktur
Çalışma ağacı birleştirmeleri worktree_merge_log içine kaydedilir ve oradan okunur

Aşağıdaki her abone, runCcServer içinde (ya da onun oluşturduğu bir hizmette) kurulur. İstemci tarafında abone yoktur.

Abone Tükettiği olaylar
WorkspaceSeeder WorkspaceCreated
Başlangıç eval paketi tohumlama (satır içi) WorkspaceCreated
Sohbet alanı sağlama (satır içi) SpaceCreated
PipelineTriggerDispatcher Her DomainEvent; etkinleştirilmiş her tetikleyici kendi türüne göre süzer
SubPipelineResumeListener PipelineRunCompleted, PipelineRunFailed
PipelineCostRollupListener AgentRunCompleted
BudgetEvaluationListener AgentRunCompleted
MeetingSummaryReconciler PipelineRunCompleted, PipelineRunFailed, PipelineRunCancelled (yalnızca meeting_summary çalıştırmaları)
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 — sürücü ajanın yönlendirme şeridine sade dille bir bildirim enjekte eder
StaleReviewWatcher PrHeadChanged — ReviewBecameStale’i yalnızca değiştirilen commit için tamamlanmış bir inceleme varsa yayımlar
GitHubPrConversationBridge AgentRunCompleted — giden PR konuşması yanıtları
NotificationFeedRecorder Aşağıdaki yirmi iki bildirim sınıfı olayı
RemoteEventForwarder Bu yirmi iki olay artı TicketReassigned ve her TaskLifecycleEvent’i. Üç üyelik olayı yalnızca çalışma alanı başına üyelik önbelleğini geçersiz kılar; çerçeve olarak iletilmezler
LocalRpcServer / RemoteRelayHost WorkspaceMemberRemoved — o kullanıcının bağlı çalışma alanı aboneliklerini düşürür; soket açık kalır

TicketAssigned bir denetim ve bildirim sinyali ile bir pipeline tetikleyicisidir. Bir ajana atama sahipliği kaydeder ve hiçbir çalıştırma başlatmaz — bilet dağıtıcısı yoktur. Bir ekibe atama (assignedTeamId ayarlı) istisnadır: TeamRoutingService ekip liderini gönderir.

TicketRemoteSyncHandler bildirilmiştir ancak üretim kodunda hiç oluşturulmaz; dolayısıyla bugün hiçbir şeye abone değildir. İstemci tarafındaki NotificationEventMapper yalnızca kendi testinde oluşturulur — istemci/sunucu ayrımından önceki süreç içi yolun kalıntısıdır. Canlı bildirim balonları aşağıdaki iletişim çerçevelerinden gelir.

Sunucuda NotificationFeedRecorder ve RemoteEventForwarder bu olayları notifications/* iletişim çerçevelerine dönüştürür (notification_wire.dart). İstemcide RpcNotificationMapper → mapNotificationFrame bir çerçeveyi AppNotification’a dönüştürür.

Tam olarak on yedi bildirim kategorisi vardır. Birkaç olay birden fazla iletişim yöntemine eşlenir; çünkü çerçeve geçişi (başarısız mı, yoksa kurtarıldı mı) taşırken kategori soruyu (“CI ne yapıyor?”) taşır.

Kategori Kaynak olay İletişim yöntemi
newMessage MessageReceived notifications/message_received (sizden bahseder)
agentRunCompleted MessageReceived notifications/message_received (is_agent_message, sizden bahsetmez)
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

Rig devralma çerçevesi, direksiyona geçen kişiye geri teslim edilmez; bırakma süzülmez (olay kimin bıraktığını kaydetmez) ve yalnızca backendFailure ile kapanma bir rig_closed çerçevesi üretir — diğer nedenler ya istenmiştir ya da toplama çerçevesi tarafından zaten kapsanır.

AgentAwaitingInput’u, onay ve kimlik bilgisi engeli kayıtlarındaki yeni girdileri izleyen ve her ask_user sorusundan AgentQuestionService tarafından haberdar edilen AgentAwaitingInputPublisher yayımlar. Bir bekleme bir olaydır; bekleme sona erdiğinde hiçbir şey yayımlanmaz.

Beş yazarlık PR kategorisi forUserId taşır; böylece çalışma alanındaki herkese değil, yazara ulaşır.

RemoteEventForwarder ayrıca TicketReassigned’i notifications/ticket_reassigned olarak ve her TaskLifecycleEvent’i notifications/task_<phase> olarak iletir. Hiçbiri bir bildirim kategorisine eşlenmez — bunlar bildirim merkezini değil, canlı arayüzü yürütür. Üyelik olayları çerçeve olarak iletilmez: ileticinin önbelleğini geçersiz kılarlar ve oturum barındırıcıları çıkarılan üyenin çalışma alanı aboneliklerini düşürür.