Domainesemények
Eseménybusz
Szekció neve “Eseménybusz”A DomainEventBus egy folyamaton belüli, szórásos publish/subscribe busz. A közzétevők a publish(event) metódust hívják; az előfizetők egy típusos on<T>() adatfolyamot fogyasztanak. Minden esemény implementálja a DomainEvent interfészt, és hordozza az occurredAt értéket.
A busz a cc_server belsejében fut. Minden közzétevő és minden élő előfizető ott él. Ezt a buszt egyetlen kliens sem látja — a szerver egy válogatott részhalmazt notifications/* JSON-RPC keretekként továbbít, előfizetőnként a munkaterületi tagság szerint szűrve.
| Mérőszám | Darabszám |
|---|---|
| Konkrét eseményosztályok | 54 |
Forrásfájlok (packages/cc_domain/lib/core/domain/events/) |
14 (plusz domain_event_bus.dart) |
| Absztrakt alaposztályok, amelyeket soha nem teszünk közzé közvetlenül | 1 (TaskLifecycleEvent, lezárt hierarchia) |
Az alábbi katalógus minden eseménye ebben az egy könyvtárban él; máshol nincs deklarált domainesemény.
Munkaterület-, ügynök- és repóesemények
Szekció neve “Munkaterület-, ügynök- és repóesemények”| Esemény | Payload | Akkor tüzel, amikor |
|---|---|---|
WorkspaceCreated |
workspaceId |
Létrejön a munkaterület |
AgentRunCompleted |
agentId, runId?, workspaceId?, conversationId? |
Az ügynök befejez egy futást (sikeresen vagy sikertelenül) |
AgentAwaitingInput |
workspaceId, kind, summary, spaceId?, conversationId?, agentId?, agentName? |
Egy ügynök elkezd egy emberre várni: jóváhagyásra, egy ask_user kérdés megválaszolására, vagy egy futás egy hitelesítő adat miatt áll (a kind értéke approval, question vagy credential) |
RepoAdded |
repoId, path, workspaceId |
Regisztrálnak egy repót; elindítja a háttérbeli kódindexelést |
SkillUpdated |
workspaceId, slug, origin, computedHash, scanVerdict? |
Telepítenek vagy frissítenek egy készséget, hordozva az ellátásilánc-vizsgálat ítéletét |
PR- és átnézési események
Szekció neve “PR- és átnézési események”Az első blokk magának a PR-nak az életciklusa. A második a saját PR-ek figyelése: jelzések egy olyan PR-ről, amelyet Ön nyitott meg; mindegyik hordozza a forUserId értéket, hogy a lekérdezés a szóban forgó személyhez irányíthassa őket, ne pedig szórva küldje.
| Esemény | Payload | Akkor tüzel, amikor |
|---|---|---|
PullRequestPublished |
prId, workspaceId, repoOwner, repoName |
Az ügynök megnyit egy PR-t |
PullRequestStatusChanged |
status, workspaceId, prId?, repoFullName?, prNumber? |
A PR-t összefésülték/lecsukták/megnyitották/újranyitották/jóváhagyták |
PrMerged |
prId, workspaceId, agentId |
A PR össze van fésülve — egy szűk, csak az összefésülésre vonatkozó jelzés, amelyet elemzés és értesítések céljára tartunk meg |
PrReviewRequested |
workspaceId, repoOwner, repoName, prNumber, prTitle |
A GitHub a szerver felhasználójának átnézését kéri (értesítésfigyelő, review_requested) |
PrMentioned |
workspaceId, repoOwner, repoName, prNumber, prTitle |
A szerver felhasználóját megemlítik egy PR-ben (értesítésfigyelő, mention) |
ExternalPrMerged |
workspaceId, repoOwner, repoName, prNumber, prTitle, mergedByLogin? |
Egy kívülről követett (nem ügynöki) PR összefésülése, amelyet a GitHub értesítésfigyelője észlel; a prMerged értesítési kategóriára képeződik le |
ExternalPrDetected |
repoOwner, repoName, prNumber, prTitle, author, workspaceId? |
Lekérdezéssel talált, nem ügynöki PR — csak pipeline-hoz (az external_pr_welcome pipeline-t vezérli), nem kelt értesítést |
PrHeadChanged |
repoOwner, repoName, prNumber, prTitle, previousHeadSha, headSha, workspaceId |
A PR head SHA-ja elmozdult — a szerző pusholt |
ReviewBecameStale |
workspaceId, spaceId, repoOwner, repoName, prNumber, prTitle, reviewedHeadSha, headSha |
Egy befejezett MI-átnézés már nem azt a PR-t írja le, amelyet átnézett. Csak akkor indul, ha létezik átnézés a lecserélt commitra, így jelzés marad, nem pedig pushonkénti ping |
A saját PR-ek figyelése
Szekció neve “A saját PR-ek figyelése”Mind a hat hordozza a workspaceId, a repoOwner, a repoName, a prNumber és a prTitle értéket, valamint egy opcionális forUserId mezőt.
| Esemény | További payload | Akkor tüzel, amikor |
|---|---|---|
PrMergeReadinessChanged |
ready, reason |
Egy Ön által írt PR összefésülhetővé vált, vagy már nem az |
PrReviewDecisionChanged |
decision, reviewersRemaining, approverLogin? |
Egy átnéző jóváhagyott, módosítást kért, vagy elutasították a jóváhagyását |
PrChecksStatusChanged |
failing, failingCheckName?, failingCheckUrl? |
A CI elbukott, vagy helyreállt |
PrCommentMentioned |
commentId, authorLogin, bodyPreview, isReviewComment, threadId?, path?, line? |
Valaki megemlítette Önt egy PR-megjegyzésben vagy átnézési megjegyzésben |
PrThreadReplied |
commentId, authorLogin, bodyPreview, threadId?, path?, line? |
Valaki válaszolt egy olyan átnézési szálban, amelyben Ön benne van |
PrThreadResolved |
threadId, commentId?, path?, line? |
Valaki lezárt egy olyan átnézési szálat, amelyben Ön benne van |
Üzenetküldési események
Szekció neve “Üzenetküldési események”| Esemény | Payload | Akkor tüzel, amikor |
|---|---|---|
MessageReceived |
spaceId, messageId, senderName, contentPreview, isAgentMessage, workspaceId?, mentions, requestedByUserId?, senderUserId? |
Új üzenet érkezik |
SpaceCreated |
spaceId, workspaceId |
Létrejön a tér |
SpaceDeleted |
spaceId, workspaceId |
Törlik a teret |
SpaceProvisioningChanged |
workspaceId, spaceId, status, step? |
A tér munkaterülete provisionálásba kezd, elér egy lépést (repó klónozása, PR kicheckoutolása, ügynök beállítása), vagy kész/sikertelen állapotra billen — a csevegőhíd a feladatkártyáján meséli el |
Jegyesemények
Szekció neve “Jegyesemények”| Esemény | Payload | Akkor tüzel, amikor |
|---|---|---|
TicketCreated |
ticketId, workspaceId |
Létrejön a jegy |
TicketAssigned |
ticketId, ticketTitle, ticketBody?, ticketUrl?, assignedAgentId?, assigneeType, assignedTeamId?, workspaceId |
A jegyet hozzárendelik egy szereplőhöz vagy csapathoz |
TicketCompleted |
ticketId |
A munka befejeződik (végállapot) |
TicketFailed |
ticketId, errorMessage |
Az ügynök meghiúsul (végállapot) |
TicketCancelled |
ticketId |
A jegyet megszakítják (végállapot) |
TicketStatusChanged |
ticketId, workspaceId, from, to |
Bármely állapotváltozás |
TicketReassigned |
ticketId, workspaceId, fromAgentId?, toAgentId? |
A jegyet újrahozzárendelik |
TicketDetailsUpdated |
ticketId, workspaceId |
A cím, a leírás vagy a prioritás megváltozik |
Feladat-életciklus-események
Szekció neve “Feladat-életciklus-események”Az egységes feladat-életciklus-adatfolyam — egyetlen indított ügynökfuttatás, amelyet a futásnapló-azonosítója szerint kulcsolunk. Minden esemény hordozza a taskId, a feladatonként monoton seq, a workspaceId?, az agentId? értéket és egy phase mezőt; az alábbi sorok csak a további mezőket sorolják fel.
| Esemény | Payload | Akkor tüzel, amikor |
|---|---|---|
TaskDispatched |
— | A feladatot végrehajtásra átadják egy háttérrendszernek |
TaskRunning |
— | A feladat elkezdett kimenetet előállítani |
TaskWaitingLocalDirectory |
lockedPath, holderTaskId? |
A feladat parkol — egy másik feladat birtokolja a szükséges, lemezen lévő elérésiút-zárat |
TaskProgress |
note? |
Futás közbeni előrehaladási ellenőrzési pont |
TaskMessage |
messageType, content |
Adatfolyamban érkező üzenet (text/thinking/tool_use/tool_result/error); a progress fázis alatt jelentve |
TaskCompleted |
summary? |
A feladat sikeresen befejeződött |
TaskFailed |
errorMessage |
A feladat hibával fejeződött be |
TaskCancelled |
— | A feladatot a befejezés előtt megszakították |
A TaskPhase felsorolásnak van egy queued tagja is, de várakozó eseményt semmi sem tesz közzé — nincs TaskQueued osztály. Egy feladat első megfigyelhető kerete a TaskDispatched.
Pipeline-események
Szekció neve “Pipeline-események”| Esemény | Payload | Akkor tüzel, amikor |
|---|---|---|
PipelineRunCompleted |
workspaceId, pipelineRunId, templateId |
A futtatás befejeződik |
PipelineRunCancelled |
workspaceId, pipelineRunId, templateId |
A futtatást megszakítják (a felhasználó vagy a rendszer) — szándékos leállítás, nem hiba |
PipelineRunFailed |
workspaceId, pipelineRunId, templateId, errorMessage |
A futtatás meghiúsul |
Csak a végállapot-átmenetek kerülnek közzétételre. Nincs PipelineRunStarted, és nincs lépésenkénti esemény: egy lépés előrehaladása a futtatás saját soraiból és az általa indított ügynök feladat-életciklus-adatfolyamából jut el a kliensekhez, nem a buszon keresztül.
Megfigyelhetőségi események
Szekció neve “Megfigyelhetőségi események”| Esemény | Payload | Akkor tüzel, amikor |
|---|---|---|
ActivityLogged |
id, actorType, actorId?, action, entityType, entityId?, details?, workspaceId?, runId? |
Létrejön egy auditnapló-bejegyzés |
BudgetThresholdCrossed |
scopeType, scopeId, spentCents, budgetCents, isHardStop |
A költés meghaladja a küszöböt |
Identitás- és tagsági események
Szekció neve “Identitás- és tagsági események”| Esemény | Payload | Akkor tüzel, amikor |
|---|---|---|
WorkspaceMemberAdded |
workspaceId, userId, role |
Egy felhasználó csatlakozik egy munkaterülethez (meghívó beváltása vagy adminisztrátori hozzáadás) |
WorkspaceMemberRemoved |
workspaceId, userId |
Egy tagot eltávolítanak — az adott felhasználó munkaterületre szűkített élő munkameneteinek azonnal újra kell ellenőrizniük a hozzáférést |
WorkspaceMemberRoleChanged |
workspaceId, userId, role |
Egy tag szerepköre megváltozik |
A buszon a teljes identitásfelület a tagság. A felhasználók létrehozása és az eszközvisszavonás megtörténik, de nem domaineseményként kerül közzétételre — a visszavonást közvetlenül az élő munkameneteken kényszerítjük ki, nem a buszon keresztül vezetjük.
Naptár- és megbeszéléssemények
Szekció neve “Naptár- és megbeszéléssemények”| Esemény | Payload | Akkor tüzel, amikor |
|---|---|---|
CalendarAuthExpired |
workspaceId, accountEmail |
Egy csatlakoztatott fiók OAuth-frissítő tokenje véglegesen érvénytelen (leválasztási epizódonként egyszer kerül közzétételre) |
MeetingStartingSoon |
workspaceId, eventId, title, startTime, meetingUrl? |
Egy naptáresemény a beállított előzetes értesítési ablakon belül kezdődik |
MeetingRecordingStopped |
workspaceId, meetingId, title, userNotes, transcript, summaryInstructions? |
Egy megbeszélésfelvétel befejeződik, és elindítja a beépített meeting_summary pipeline-t |
Állomásesemények
Szekció neve “Állomásesemények”| Esemény | Payload | Akkor tüzel, amikor |
|---|---|---|
RigClosedEvent |
workspaceId, rigId, reason |
Egy állomás eltűnt, a lezárási okával együtt; a fogyasztók csak a backendFailure esetén cselekszenek — minden más ok kért, vagy egy RigReaped esemény kíséri |
RigControlChanged |
workspaceId, rigId, controller? |
Egy ember kizárólagos vezérlést vett át egy állomás fölött, vagy visszaadta azt (elengedéskor a controller null — az esemény nem rögzíti, ki engedte el) |
RigReaped |
workspaceId, rigId, reason, agentId? |
A rendszer visszaszerezte a gépet: tétlenség, TTL vagy memórianyomás miatti kilakoltatás (a jelentett érték idleTimeout), a vezérlő ügynökkel együtt |
Egy állomás megnyitása nem esemény. Az indítás befejeződik, és az állomás sora kész állapotra billen; semmi sem kerül közzétételre, így nincs RigOpened, amelyre elő lehetne fizetni.
Aldomainek, amelyeknél egyáltalán nincsenek események
Szekció neve “Aldomainek, amelyeknél egyáltalán nincsenek események”Több alrendszer, amely kívülről eseményvezéreltnek látszik, valójában nem az. Azért soroljuk fel őket itt, mert a hiányuk olyan tervezési döntés, amelyet érdemes ismerni, mielőtt hookot kezdene keresni:
| Aldomain | Hogyan mozog helyette az állapot |
|---|---|
| Memória | A record_memory_fact és társai írnak és visszatérnek; az előhívás olvas. Semmi sem tesz közzé tényt vagy ütközést |
| Orchestráció | A javaslat, annak jóváhagyása és a generált pipeline-futtatás sorok és RPC-hívások |
| Tervdokumentumok | A submit_plan ír egy revíziót; a jóváhagyás orchestrációt hoz létre. Egyik sem kerül bejelentésre |
| Artefaktumok | A publish_artifact / revise_artifact közvetlenül írja a revíziókat |
| Jóváhagyások | Az eszkalációt a jóváhagyási munkafolyamat-szolgáltatás kezeli |
| Jegyszinkronizáció | A szolgáltatói koordinátor az előbbi jegyeseményekre fizet elő; a bejövő webhookok közvetlenül kerülnek alkalmazásra |
| Naptárfrissítés | Egy szinkronizálás felvesz vagy frissít eseményeket, és a kliens újraolvassa őket; nincs frissítési szórás |
| Worktree-összefésülések | A worktree_merge_log rögzíti őket, és onnan olvashatók |
Előfizetők
Szekció neve “Előfizetők”Az alábbi előfizetők mindegyike a runCcServer belsejében jön létre (vagy egy olyan szolgáltatásban, amelyet az épít fel). Nincs kliensoldali előfizető.
| Előfizető | Az általa fogyasztott események |
|---|---|
WorkspaceSeeder |
WorkspaceCreated |
| Kezdő kiértékelési csomag elvetése (soron belüli) | WorkspaceCreated |
| Csevegőtér-provisionálás (soron belüli) | SpaceCreated |
PipelineTriggerDispatcher |
Minden DomainEvent; minden engedélyezett eseményindító a saját típusára szűr |
SubPipelineResumeListener |
PipelineRunCompleted, PipelineRunFailed |
PipelineCostRollupListener |
AgentRunCompleted |
BudgetEvaluationListener |
AgentRunCompleted |
MeetingSummaryReconciler |
PipelineRunCompleted, PipelineRunFailed, PipelineRunCancelled (csak meeting_summary futtatások esetén) |
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 — közérthető értesítést injektál a vezérlő ügynök irányítási sávjára |
StaleReviewWatcher |
PrHeadChanged — csak akkor tesz közzé ReviewBecameStale eseményt, ha létezik befejezett átnézés a lecserélt commitra |
GitHubPrConversationBridge |
AgentRunCompleted — kimenő PR-beszélgetés-válaszok |
NotificationFeedRecorder |
Az alábbi huszonkét értesítési osztályba tartozó eseményt |
RemoteEventForwarder |
Ugyanezt a huszonkettőt, valamint a TicketReassigned eseményt és minden TaskLifecycleEvent eseményt. A három tagsági esemény csak érvényteleníti a munkaterületenkénti tagsági gyorsítótárát; keretként nem kerülnek továbbításra |
LocalRpcServer / RemoteRelayHost |
WorkspaceMemberRemoved — eldobja az adott felhasználó csatolt munkaterület-előfizetéseit; a socket nyitva marad |
A TicketAssigned audit- és értesítési jelzés, valamint pipeline-eseményindító. Az ügynökhöz rendelés tulajdonjogot rögzít, és nem indít futtatást — nincs jegy-diszpécser. A csapathoz rendelés (beállított assignedTeamId) a kivétel: a TeamRoutingService elindítja a csapatvezetőt.
A TicketRemoteSyncHandler deklarálva van, de éles kódban soha nem példányosul, így ma semmire sem fizet elő. A kliensoldali NotificationEventMapper csak a saját tesztjében példányosul — a kliens–szerver szétválasztás előtti, folyamaton belüli útvonal maradványa. Az élő toastok az alábbi wire-frame-ekből érkeznek.
Az értesítések leképezése
Szekció neve “Az értesítések leképezése”A szerveren a NotificationFeedRecorder és a RemoteEventForwarder alakítja ezeket az eseményeket notifications/* wire-frame-ekké (notification_wire.dart). A kliensen az RpcNotificationMapper → mapNotificationFrame alakít egy keretet AppNotification értékké.
Pontosan tizenhét értesítési kategória van. Több esemény egynél több wire-metódusra képeződik le, mert a keret az élt hordozza (meghiúsult vagy helyreállt), míg a kategória a kérdést („mit tesz a CI?”).
| Kategória | Forrásesemény | Wire-metódus |
|---|---|---|
newMessage |
MessageReceived |
notifications/message_received (Önt említi) |
agentRunCompleted |
MessageReceived |
notifications/message_received (is_agent_message, Önt nem említi) |
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 |
Az állomás átvételéről szóló keretet nem kézbesítjük vissza annak, aki átvette a kormányt, az elengedés szűretlen (az esemény nem rögzíti, ki engedte el), és csak egy backendFailure lezárás állít elő rig_closed keretet — a többi ok vagy kért, vagy már lefedi a begyűjtési keret.
Az AgentAwaitingInput eseményt az AgentAwaitingInputPublisher teszi közzé, amely új bejegyzéseket keresve figyeli a jóváhagyások és a hitelesítőadat-blokkolások nyilvántartásait, az egyes ask_user kérdésekről pedig az AgentQuestionService értesíti. Egy várakozás egy esemény; amikor a várakozás véget ér, semmi sem kerül közzétételre.
Az öt saját PR-höz tartozó kategória hordozza a forUserId értéket, így azok a szerzőhöz jutnak el, nem a munkaterület minden tagjához.
A RemoteEventForwarder ezenfelül továbbítja a TicketReassigned eseményt notifications/ticket_reassigned néven, és minden TaskLifecycleEvent eseményt notifications/task_<phase> néven. Egyik sem képeződik le értesítési kategóriára — élő felületet vezérelnek, nem az értesítési központot. A tagsági események nem kerülnek továbbításra keretként: érvénytelenítik a továbbító gyorsítótárát, a munkamenet-gazdák pedig eldobják az eltávolított tag munkaterület-előfizetéseit.