Gå til innholdet

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.

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.

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.

Virkningsløs kropp for den obligatoriske trigger-noden — fullføres umiddelbart slik at motoren sprer seg videre til lyttere nedstrøms. Ingen konfigurasjon.

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.

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.

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 en type:
    • {"type": "fileExists", "paths": [...], "baseKey": "repo_local_path", "negate": false, "recursive": false} — sann når en av de oppførte stiene finnes på disken; negate snur den; recursive søker også i underkataloger (og hopper over .git, node_modules, build, .dart_tool). Relative stier løses mot state[baseKey] (standard repo_local_path), ellers mot arbeidsområdekatalogen for kjøringen.
    • {"type": "comparison", "left": "{{score}}", "op": "gt", "right": 80} — operatorene equals, 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, ellers default.
  • Sammenligning (eldre toppnivå extras.left / extras.op / extras.right) — tilsvarer et comparison-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.

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.

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.

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

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.

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.

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)

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

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)

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.

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.

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

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

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