Alan olayları
Olay veri yolu
Bölüm başlığı “Olay veri yolu”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.
Çalışma alanı, ajan ve depo olayları
Bölüm başlığı “Çalışma alanı, ajan ve depo olayları”| 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 |
PR ve inceleme olayları
Bölüm başlığı “PR ve inceleme olayları”İ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 |
Yazdığınız PR’ların izlenmesi
Bölüm başlığı “Yazdığınız PR’ların izlenmesi”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ü |
Mesajlaşma olayları
Bölüm başlığı “Mesajlaşma olayları”| 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 |
Biletleme olayları
Bölüm başlığı “Biletleme olayları”| 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 |
Görev yaşam döngüsü olayları
Bölüm başlığı “Görev yaşam döngüsü olayları”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.
Pipeline olayları
Bölüm başlığı “Pipeline olayları”| 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.
Gözlemlenebilirlik olayları
Bölüm başlığı “Gözlemlenebilirlik olayları”| 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 |
Kimlik ve üyelik olayları
Bölüm başlığı “Kimlik ve üyelik olayları”| 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.
Takvim ve toplantı olayları
Bölüm başlığı “Takvim ve toplantı olayları”| 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 |
Rig olayları
Bölüm başlığı “Rig olayları”| 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.
Hiç olayı olmayan alt alanlar
Bölüm başlığı “Hiç olayı olmayan alt alanlar”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 |
Aboneler
Bölüm başlığı “Aboneler”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.
Bildirim eşlemesi
Bölüm başlığı “Bildirim eşlemesi”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.