Tovább a tartalomhoz

Domainesemények

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

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

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
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
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

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.

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.

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
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.

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
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

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.

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.