Pipeline-stegtyper
Et pipeline-steg har to uavhengige akser:
- Type (
StepKind) — hvordan motoren planlegger steget i forhold til utløserne sine. - Kroppsnøkkel (
BuiltInBodyKeys) — hvilken registrert kropp-closure som utfører arbeidet til steget.
Stegtyper
Seksjon med tittelen «Stegtyper»Definert i packages/cc_domain/lib/features/pipelines/domain/entities/step_kind.dart.
| Type | Planleggingssemantikk |
|---|---|
trigger |
Obligatorisk inngangspunkt — nøyaktig én per mal, alltid den første noden. Gjør ingenting selv; det som starter kjøringen (manuelt / hendelse / tidsplan), spores separat som PipelineTrigger-rader. Kroppen er den virkningsløse pipeline.trigger. |
listen |
Utløses når alle kildesteg (i StepTrigger.sourceStepIds) er fullført. |
join |
Utløses når alle steg i waitForStepIds når en terminaltilstand. |
router |
Betinget forgrening — kroppen returnerer StepResult.route(key), som bare utløser kanten nedstrøms der routeKey samsvarer; grener som ikke velges, merkes som hoppet over. |
forEach |
Planlegges som listen (utløses når alle sourceStepIds er fullført). Det er den registrerte kroppen flow.forEach som itererer; motoren oppretter ikke ett barnesteg per element. |
terminal |
Vaktpost i planleggeren uten kropp. Pipeline-kjøringen fullføres når et terminalsteg er ferdig. |
Stegkropper
Seksjon med tittelen «Stegkropper»Registrerte kropp-closures med nøkkel fra konstantene i BuiltInBodyKeys (packages/cc_domain/lib/features/pipelines/domain/templates/builtin_template_seeds.dart). Det finnes 25, og alle er listet opp nedenfor. Konfigurasjonen leses fra stegets PipelineNodeConfig (se nedenfor) hvis ikke annet er nevnt; «tilstandsnøkler» leses fra pipeline-tilstanden / utløsernyttelasten ved kjøring.
Et steg der bodyKey ikke er registrert, gir en advarsel ved innlasting av malen og kjører deretter aldri — det får ikke kjøringen til å feile. trigger- og terminal-steg er unntatt fra den advarselen: triggeren kjører fortsatt den virkningsløse kroppen pipeline.trigger; et terminal-steg har ingen kropp.
pipeline.trigger
Seksjon med tittelen «pipeline.trigger»Virkningsløs kropp for den obligatoriske trigger-noden — fullføres umiddelbart slik at motoren sprer seg videre til lyttere nedstrøms. Ingen konfigurasjon.
pipeline.bashScript
Seksjon med tittelen «pipeline.bashScript»Shell-steg uten agent (bash -c). {{key}}-plassholdere i skriptet erstattes fra tilstand + utløsernyttelast med verdier som er escapet for shell.
| Konfigurasjonsfelt | Beskrivelse |
|---|---|
script |
Shell-kommando som skal kjøres (obligatorisk) |
outputKey |
Tilstandsnøkkel som mottar trimmet stdout ved avslutningskode 0 |
Kjører med cwd <cc_root>/pipelines/<pipelineRunId>/ (delt av alle bash-steg i en kjøring) og GITHUB_TOKEN i miljøet. Skriver også <stepId>_runDir til tilstanden. En avslutningskode ulik null feiler steget, med halen av stderr.
conversation.promptAgent
Seksjon med tittelen «conversation.promptAgent»Generisk node for prompt og utsending: renderer prompten, sender agenten ut i en samtale og suspenderer til kjøringen er ferdig. Nyttelasten fra agentens submit_output høstes inn i tilstanden under outputKey.
| Konfigurasjonsfelt | Beskrivelse |
|---|---|
agentId |
Agent-UUID med arbeidsområdeomfang som skal sendes ut (obligatorisk) |
prompt |
Instruksjonstekst; støtter {{key}}-substitusjon (obligatorisk) |
outputKey |
Tilstandsnøkkel for den høstede utdataen |
outputSchema |
JSON Schema som utdataen må oppfylle |
label |
Menneskelesbar etikett som vises på lerretet |
extras.spaceId |
Eksisterende samtale å jobbe i (standard: en skjult en) |
extras.conversationTitle |
Navngitt strøm inne i det området (valgfritt) |
extras.mode |
Leses på noden som åpner rommet (messaging.createSpace), ikke her. Standard review. |
pipeline.condition
Seksjon med tittelen «pipeline.condition»Ruterkropp — leser config.extras, evaluerer en betingelse og returnerer StepResult.route(key). Betingelser er ikke JavaScript-uttrykk; tre former for utforming støttes, i prioritert rekkefølge:
- Predikattre (
extras.predicate) — et boolsk tre som ruter"true"/"false". Hver node er et map med entype:{"type": "fileExists", "paths": [...], "baseKey": "repo_local_path", "negate": false, "recursive": false}— sann når en av de oppførte stiene finnes på disken;negatesnur den;recursivesøker også i underkataloger (og hopper over.git,node_modules,build,.dart_tool). Relative stier løses motstate[baseKey](standardrepo_local_path), ellers mot arbeidsområdekatalogen for kjøringen.{"type": "comparison", "left": "{{score}}", "op": "gt", "right": 80}— operatoreneequals,notEquals,contains,exists,notExists,gt,lt; leser pipeline-tilstanden, ikke filsystemet.{"type": "and" | "or", "of": [<predicate>, ...]}— boolske grupper.{"type": "not", "of": <predicate>}— negasjon.
- Switch (
extras.switchKey) —{"switchKey": "pr_class", "cases": [...], "default": "standard"}; ruter til det første tilfellet tilstandsverdien inneholder uten hensyn til store og små bokstaver, ellersdefault. - Sammenligning (eldre toppnivå
extras.left/extras.op/extras.right) — tilsvarer etcomparison-predikat, beholdt for maler som ble laget før treet.
Kanter ut av noden har en routeKey som må samsvare med nøkkelen som returneres.
prReview.comment
Seksjon med tittelen «prReview.comment»Legger ut de samlede funnene som en PR-gjennomgangskommentar via GitHub-PR-klienten.
| Tilstandsnøkkel | Beskrivelse |
|---|---|
repo_full_name |
owner/repo (obligatorisk) |
pr_number |
PR-nummer — int eller numerisk streng (obligatorisk) |
consolidated_findings |
Kommentartekst (obligatorisk) |
Returnerer StepResult.terminal med comment_review_id og commented_at i tilstanden.
messaging.postSpace
Seksjon med tittelen «messaging.postSpace»Legger ut en melding i et meldingsområde via MessagingPort.
| Tilstandsnøkkel | Beskrivelse |
|---|---|
space_id |
Målområde (obligatorisk) |
content |
Meldingstekst, lest ordrett fra tilstanden (obligatorisk) |
Skriver posted_space_id og posted_at til tilstanden.
team.dispatch
Seksjon med tittelen «team.dispatch»Sender ut et helt team i stedet for en enkelt agent, og suspenderer deretter til medlemmenes kjøringer er ferdige.
| Konfigurasjonsfelt | Beskrivelse |
|---|---|
teamId |
Team med arbeidsområdeomfang som skal sendes ut (obligatorisk; gjensidig utelukkende med agentId) |
prompt |
Måltekst; støtter {{key}}-substitusjon (obligatorisk) |
dispatchMode |
allParallel (standard — én oppgave per medlem) eller manager (send bare ut lederen til å koordinere) |
outputKey |
Tilstandsnøkkel for medlemmenes høstede utdata |
outputSchema, label, extras.spaceId |
Som for conversation.promptAgent |
human.gate
Seksjon med tittelen «human.gate»Godkjenningsport. Sender godkjenneragenten ut i en samtale (gjennomgangsmodus) med portens prompt og en utdatakontrakt {decision, reason}, og suspenderer deretter til godkjenneren sender inn via submit_output.
| Konfigurasjonsfelt | Beskrivelse |
|---|---|
agentId |
Godkjenneragenten (obligatorisk) |
prompt |
Portens prompt (valgfritt; en standard brukes når den mangler) |
outputKey |
Tilstandsnøkkel for den høstede nyttelasten {decision, reason} |
outputSchema |
Standard er et godkjenningsskjema (decision: approved / rejected, reason) |
label, extras.spaceId |
Som for conversation.promptAgent |
Porten løses bare gjennom submit_output. BuiltInBodyKeys.humanGate, biblioteket over nodetyper og promptteksten til én innebygd mal nevner alle MCP-verktøyene approve_step og reject_step; ingen av verktøyene finnes i noen pakke eller noe register.
repos.cleanup
Seksjon med tittelen «repos.cleanup»Fjerner foreldede isolerte worktrees; velger modus fra utløsernyttelasten. Respekterer kjøringens dryRun-flagg.
| Tilstandsnøkkel | Beskrivelse |
|---|---|
ticket_id |
Frigir worktreene til den saken |
repo_full_name + pr_number |
Frigir den midlertidige PR-redigerings-worktreen |
space_id |
River ned worktreene og mappen til den samtalen |
| (ingen av de ovenstående) | Feier gjennom arbeidsområdet: forsvunne kataloger, døde områder, foreldreløse samtalemapper |
outputKey (valgfritt) mottar en sammendragsstreng.
flow.forEach
Seksjon med tittelen «flow.forEach»Map / fan-out over en tilstandssamling: renderer prompten én gang per element, sender deretter ut agenten én gang med disse promptene sammenslått (----skilletegn) og suspenderer til den kjøringen er ferdig. En tom samling fullføres umiddelbart med en tom liste. Det er ikke én parallell utsending per element.
| Konfigurasjonsfelt | Beskrivelse |
|---|---|
agentId |
Agent som skal sendes ut per element (obligatorisk) |
prompt |
Prompt per element; støtter {{key}}-substitusjon (obligatorisk) |
extras.iterableKey |
Tilstandsnøkkel som holder samlingen (obligatorisk) |
extras.itemKey |
Nøkkelen det gjeldende elementet er bundet til i prompten (standard item) |
outputKey |
Tilstandsnøkkel for den høstede utdataen (én utsending, ikke en liste) |
flow.callPipeline
Seksjon med tittelen «flow.callPipeline»Kjører en annen pipeline-mal som et nestet delsteg (delpipelinen kjører som en barnekjøring med parentPipelineRunId satt). Steget suspenderer til barnet når en terminaltilstand, og deretter flettes barnets endelige tilstand inn under outputKey.
| Konfigurasjonsfelt | Beskrivelse |
|---|---|
extras.templateId |
Barnemalen som skal kjøres (obligatorisk; en pipeline kan ikke kalle seg selv) |
inputKeys |
Tilstandsnøkler som kopieres inn i barnets utløsernyttelast |
outputKey |
Tilstandsnøkkel for barnets sammenflettede sluttilstand |
code.index
Seksjon med tittelen «code.index»Bakgrunnsindeksering med tree-sitter: går gjennom et repo, trekker ut symboler/kanter i worker-isolater og leser dem inn i arbeidsområdets kodegraf. Strømmer fremdrift inn i stegets kjøringsrad; støtter tørrkjøring. Tree-sitter og grammatikkene er påkrevde native-biblioteker — en manglende dylib betyr at serveren aldri startet, og en grammatikk som ikke lar seg løse midt i en kjøring, feiler steget i stedet for å hoppe over det.
| Tilstandsnøkkel | Beskrivelse |
|---|---|
repo_id |
Repoet som skal indekseres (obligatorisk) |
repo_local_path |
Lokal sti til checkouten (obligatorisk) |
meeting.diarize
Seksjon med tittelen «meeting.diarize»Frakoblet talerdiarisering. Leser møtets beholdte lyd, grupperer den i talere (Person 1, Person 2, …), merker transkriptsegmentene på nytt og skriver transcript-tilstanden på nytt; sender også ut diarization_spans for det parallelle steget meeting.updateTranscript. Sender transkriptet uendret videre når ingen lyd er beholdt, eller når modellene ikke er installert.
| Tilstandsnøkkel | Beskrivelse |
|---|---|
meeting_id |
Møtet som skal diariseres (obligatorisk) |
meeting.saveNotes, meeting.addActionItems, meeting.addDecisions
Seksjon med tittelen «meeting.saveNotes, meeting.addActionItems, meeting.addDecisions»Deterministiske kropper som lagrer møtesammendrag. Hver av dem leser meeting_id og agentstegets strukturerte meeting_outcome-nyttelast ({summary, enhancedNotes, actionItems[], decisions[]}) fra tilstanden og skriver sin del til sin egen tabell — notater, tiltak eller beslutninger. Rader som er lagret tidligere, slettes aldri ved en degradert kjøring.
Andre innebygde kropper
Seksjon med tittelen «Andre innebygde kropper»| Kroppsnøkkel | Beskrivelse |
|---|---|
meeting.identifySpeakers |
Talergjenkjenning på tvers av møter: matcher diariserte talere mot lagrede stemmeprofiler og bruker treff med høy sikkerhet automatisk. Virkningsløs uten profiler/innbygginger. |
meeting.updateTranscript |
Bruker Person N-etiketter fra diarization_spans og slår sammen fragmenter per vindu til replikker per taler, og lagrer deretter det rensede transkriptet. Virkningsløs når diariseringen ikke ga noe. |
meeting.assemblePlayback |
Setter sammen møtets miksete avspillingsspor fra beholdte WAV-filer per kanal. Virkningsløs når ingen lyd er beholdt. |
orchestration.markPhase |
Ved slutten av arbeids-DAG-en skriver den feilvaktposter for delsaker uten utdata og setter orkestreringen til synthesizing. |
orchestration.persistDeliverable |
Skriver synteseutdataen til foreldresaken, fullfører den, legger ut leveransen og merker orkestreringen som completed. |
orchestration.awaitApproval |
Port for delvis godkjenning: fullføres umiddelbart når stegets nodenøkkel er i orkestreringens godkjente sett, ellers suspenderes den til en senere godkjenning gjenopptar den. Dette er den eneste kroppen som setter extras.awaitApproval, noe som fritar den fra tidsavbruddet på 24 timer for suspenderte steg. |
messaging.createSpace |
Åpner samtalen resten av malen jobber i, publisert under stegets outputKey (innebygde bruker pipeline_space_id). En tom repoIds-liste sjekker ikke ut noe; extras['allRepos'] sjekker ut alle repoer i arbeidsområdet. extras['createConversation'] (av som standard) åpner også en navngitt strøm. Et agentsteg blir med i et rom og åpner aldri ett, så en fan-out uten denne noden feiler ved utsending — og å koble den inn én gang betyr at hele fan-outen deler én checkout i stedet for at hver av dem klargjør sin egen. |
prReview.finalize |
Det siste steget i PR-gjennomgangs-malen: sorterer de akkumulerte gjennomgangsnodene i konsensusbøtter og beregner dommen per PR. |
skills.analyze |
Kjører forsyningskjedeskannet for skills over de installerte skillene i et arbeidsområde og registrerer hver dom. |
Stegresultater
Seksjon med tittelen «Stegresultater»En stegkropp returnerer en StepResult (packages/cc_domain/lib/features/pipelines/domain/entities/step_result.dart). Alle fabrikkene godtar et valgfritt mutatedState-map som flettes inn i pipeline-tilstanden, bortsett fra failed.
| Fabrikk | Signatur | Beskrivelse |
|---|---|---|
ok |
StepResult.ok({mutatedState}) |
Normal fullføring; lyttere nedstrøms evalueres |
route |
StepResult.route(nextRouterKey, {mutatedState}) |
Ruterfullføring; velger grenen nedstrøms der routeKey samsvarer |
suspendUntilEvent |
StepResult.suspendUntilEvent(eventType, {mutatedState}) |
Pause til en bestemt domenehendelsestype utløses |
suspendUntilTasksComplete |
StepResult.suspendUntilTasksComplete(taskIds, {mutatedState}) |
Pause til alle oppførte oppgaver når en terminaltilstand |
terminal |
StepResult.terminal({mutatedState}) |
Pipeline-kjøringen er ferdig — ingen flere steg |
failed |
StepResult.failed(errorMessage) |
Steget feilet med en feilmelding |
StepRetryPolicy
Seksjon med tittelen «StepRetryPolicy»Atferd for nye forsøk når en nodekropp feiler (PipelineNodeConfig.retryPolicy; null deaktiverer nye forsøk).
| Felt | Type | Beskrivelse |
|---|---|---|
maxAttempts |
int |
Totalt antall forsøk inkludert det første (3 = 1 forsøk + 2 nye forsøk); må være ≥ 1 |
backoff |
String |
linear eller exponential (standard) |
initialDelayMs |
int |
Forsinkelse før det første nye forsøket, i millisekunder; senere forsinkelser vokser i henhold til backoff |
PipelineNodeConfig
Seksjon med tittelen «PipelineNodeConfig»Konfigurasjon per node, som følger med inne i stegdefinisjonen (packages/cc_domain/lib/features/pipelines/domain/entities/pipeline_node_config.dart). Både innebygde og egendefinerte noder har denne formen; hver kropp leser bare feltene den bryr seg om.
| Felt | Type | Beskrivelse |
|---|---|---|
prompt |
String? |
Promptmal med {{key}}-substitusjon |
script |
String? |
Bash-skriptkropp med {{key}}-substitusjon |
agentId |
String? |
Agent-UUID med arbeidsområdeomfang som skal sendes ut |
inputKeys |
List<String> |
Tilstandsnøkler denne noden bruker som inndata |
repoIds |
List<String> |
Repoene som messaging.createSpace-noden sjekker ut (<repoId> eller <repoId>@<branch>). Tom = ingen; extras['allRepos'] = alle repoer i arbeidsområdet. Ignoreres på agentsteg. |
outputKey |
String? |
Tilstandsnøkkelen denne nodens utdata skrives under |
label |
String? |
Menneskelesbar etikett som vises på lerretet (standard er steg-ID-en) |
outputSchema |
Map<String, dynamic>? |
JSON Schema (delmengde) som utdataverdien må oppfylle |
reducer |
String? |
Flettestrategi når parallelle grener skriver til samme outputKey: append, mergeLists, mergeMaps, sum eller override (standard) |
retryPolicy |
StepRetryPolicy? |
Policy for nye forsøk ved kroppssvikt; null = ett enkelt forsøk |
continueOnFail |
bool |
Når true, feiler ikke en terminal feil kjøringen; feilen lagres under state['_stepErrors'][stepId] |
timeoutMs |
int? |
Tidsavbrudd i veggklokketid for nodekroppen i millisekunder; null = ingen tidsavbrudd |
teamId |
String? |
Team som skal sendes ut (team.dispatch-noder); gjensidig utelukkende med agentId |
dispatchMode |
String? |
Teamets utførelsesmodus: allParallel eller manager |
extras |
Map<String, dynamic> |
Fri, kroppsspesifikk konfigurasjon (f.eks. iterableKey, templateId, betingelsestreer) |
Avledede tilgangsfunksjoner: spaceId (extras['spaceId'] — eksisterende samtale å jobbe i), createsConversation (extras['createConversation']), conversationTitle (extras['conversationTitle']), modeName (extras['mode'] — chat / review / plan, leses på noden som åpner området) og runWhen (extras['runWhen'] — hopp over noden når den ikke er oppfylt).