Pipeline-lépésfajták
Egy pipeline-lépésnek két egymástól független tengelye van:
- Fajta (
StepKind) — hogyan ütemezi a motor a lépést az eseményindítóihoz képest. - Törzskulcs (
BuiltInBodyKeys) — melyik regisztrált törzs-closure végzi a lépés munkáját.
Lépésfajták
Szekció neve “Lépésfajták”A packages/cc_domain/lib/features/pipelines/domain/entities/step_kind.dart fájlban definiálva.
| Fajta | Ütemezési szemantika |
|---|---|
trigger |
Kötelező belépési pont — sablononként pontosan egy, mindig az első csomópont. Maga nem végez munkát; azt, hogy mi indítja a futtatást (kézi / esemény / ütemezés), külön PipelineTrigger sorok követik. A törzse a semmittevő pipeline.trigger. |
listen |
Akkor sül el, amikor az összes forráslépés (a StepTrigger.sourceStepIds-ban) befejeződik. |
join |
Akkor sül el, amikor a waitForStepIds összes lépése végállapotba kerül. |
router |
Feltételes elágazás — a törzs StepResult.route(key) értéket ad vissza, amely csak az ahhoz illeszkedő routeKey-ű alsóbb élt tüzeli; a ki nem választott ágak kihagyottként jelölődnek meg. |
forEach |
A listenhez hasonlóan ütemeződik (akkor sül el, amikor az összes sourceStepIds befejeződik). A regisztrált flow.forEach törzs az, amely iterál; a motor nem indít elemenként egy gyermeklépést. |
terminal |
Törzs nélküli ütemező-őrszem. A pipeline-futtatás akkor fejeződik be, amikor egy terminál lépés befejeződik. |
Lépéstörzsek
Szekció neve “Lépéstörzsek”A BuiltInBodyKeys konstansaival kulcsolt, regisztrált törzs-closure-ök (packages/cc_domain/lib/features/pipelines/domain/templates/builtin_template_seeds.dart). Számuk 25, mindegyik alább szerepel. A konfiguráció — hacsak másképp nem jelezzük — a lépés PipelineNodeConfigjából olvasódik (lásd alább); az „állapotkulcsok” végrehajtáskor a pipeline állapotából / trigger payloadjából olvasódnak.
Egy lépés, amelynek bodyKey-je nincs regisztrálva, figyelmeztetést ad a sablon betöltésekor, majd soha nem fut le — a futtatást nem buktatja meg. A trigger és a terminal lépés mentesül ez alól a figyelmeztetés alól: a trigger továbbra is lefuttatja a semmittevő pipeline.trigger törzset; a terminal lépésnek nincs törzse.
pipeline.trigger
Szekció neve “pipeline.trigger”A kötelező trigger csomópont semmittevő törzse — azonnal befejeződik, hogy a motor elindíthassa az alsóbb figyelőket. Nincs konfigurációja.
pipeline.bashScript
Szekció neve “pipeline.bashScript”Ügynök nélküli shell-lépés (bash -c). A szkript {{key}} helyőrzői az állapotból és a trigger payloadjából, shell szerint escape-elt értékekkel helyettesítődnek.
| Konfigurációs mező | Leírás |
|---|---|
script |
Végrehajtandó shell-parancs (kötelező) |
outputKey |
Állapotkulcs, amely 0-s kilépésnél a levágott stdoutot kapja |
A cwd a <cc_root>/pipelines/<pipelineRunId>/ (ezt egy futtatás összes bash-lépése megosztja), a környezetben pedig ott van a GITHUB_TOKEN. Emellett a <stepId>_runDir értéket is az állapotba írja. A nem nulla kilépés a stderr utolsó soraival megbuktatja a lépést.
conversation.promptAgent
Szekció neve “conversation.promptAgent”Általános prompt-és-kiosztás csomópont: rendereli a promptot, elindítja az ügynököt egy beszélgetésbe, majd felfüggeszti magát, amíg a futtatás be nem fejeződik. Az ügynök submit_output payloadja az outputKey alatt begyűjtődik az állapotba.
| Konfigurációs mező | Leírás |
|---|---|
agentId |
A kiosztandó, munkaterület-hatókörű ügynök UUID (kötelező) |
prompt |
Utasításszöveg; támogatja a {{key}} helyettesítést (kötelező) |
outputKey |
Állapotkulcs a begyűjtött kimenetnek |
outputSchema |
JSON-séma, amelynek a kimenetnek meg kell felelnie |
label |
A vásznon megjelenő címke |
extras.spaceId |
Létező beszélgetés, amelyben dolgozni kell (alapértelmezés: egy rejtett) |
extras.conversationTitle |
Nevesített adatfolyam azon a téren belül (nem kötelező) |
extras.mode |
Annál a csomópontnál olvasódik, amelyik megnyitja a szobát (messaging.createSpace), nem itt. Alapértelmezés: review. |
pipeline.condition
Szekció neve “pipeline.condition”Routertörzs — beolvassa a config.extras értéket, kiértékel egy feltételt, és StepResult.route(key) értéket ad vissza. A feltételek nem JavaScript-kifejezések; három szerzői alak támogatott, elsőbbségi sorrendben:
- Predikátumfa (
extras.predicate) — logikai fa, amely"true"/"false"útvonalra visz. Minden csomópont egytypemezővel rendelkező map:{"type": "fileExists", "paths": [...], "baseKey": "repo_local_path", "negate": false, "recursive": false}— igaz, ha bármelyik felsorolt útvonal létezik a lemezen; anegatemegfordítja; arecursiveaz alkönyvtárakat is átkutatja (kihagyva a.git,node_modules,build,.dart_toolkönyvtárat). A relatív útvonalak astate[baseKey]-hez (alapértelmezés:repo_local_path) képest oldódnak fel, egyébként a futtatásonkénti munkaterület-könyvtárhoz képest.{"type": "comparison", "left": "{{score}}", "op": "gt", "right": 80}— operátorok:equals,notEquals,contains,exists,notExists,gt,lt; a pipeline állapotát olvassa, nem a fájlrendszert.{"type": "and" | "or", "of": [<predicate>, ...]}— logikai csoportok.{"type": "not", "of": <predicate>}— tagadás.
- Kapcsoló (
extras.switchKey) —{"switchKey": "pr_class", "cases": [...], "default": "standard"}; arra az első esetre visz, amelyet az állapotérték kis-nagybetűtől függetlenül tartalmaz, egyébként adefault-ra. - Összehasonlítás (örökölt, legfelső szintű
extras.left/extras.op/extras.right) — egyenértékű egycomparisonpredikátummal, a fa előtt szerződött sablonok miatt megőrizve.
A csomópontból kimenő élek routeKey-t hordoznak, amelynek egyeznie kell a visszaadott kulccsal.
prReview.comment
Szekció neve “prReview.comment”A konszolidált megállapításokat PR-átnézési hozzászólásként teszi közzé a GitHub PR-kliensen keresztül.
| Állapotkulcs | Leírás |
|---|---|
repo_full_name |
owner/repo (kötelező) |
pr_number |
PR-szám — int vagy numerikus sztring (kötelező) |
consolidated_findings |
A hozzászólás törzse (kötelező) |
StepResult.terminal értéket ad vissza, az állapotban comment_review_id és commented_at kulccsal.
messaging.postSpace
Szekció neve “messaging.postSpace”Üzenetet tesz közzé egy üzenetküldő térben a MessagingPorton keresztül.
| Állapotkulcs | Leírás |
|---|---|
space_id |
Cél-tér (kötelező) |
content |
Az üzenet törzse, szó szerint az állapotból beolvasva (kötelező) |
A posted_space_id és a posted_at értéket az állapotba írja.
team.dispatch
Szekció neve “team.dispatch”Egy egész csapatot oszt ki egyetlen ügynök helyett, majd felfüggeszti magát, amíg a tagok futtatásai be nem fejeződnek.
| Konfigurációs mező | Leírás |
|---|---|
teamId |
A kiosztandó, munkaterület-hatókörű csapat (kötelező; kölcsönösen kizárja az agentId-t) |
prompt |
Célszöveg; támogatja a {{key}} helyettesítést (kötelező) |
dispatchMode |
allParallel (alapértelmezés — tagonként egy feladat) vagy manager (csak a vezetőt osztja ki, hogy koordináljon) |
outputKey |
Állapotkulcs a begyűjtött tagkimeneteknek |
outputSchema, label, extras.spaceId |
Mint a conversation.promptAgent esetében |
human.gate
Szekció neve “human.gate”Jóváhagyási kapu. Elindítja a jóváhagyó ügynököt egy beszélgetésbe (átnézési mód) a kapu promptjával és egy {decision, reason} kimeneti szerződéssel, majd felfüggeszti magát, amíg a jóváhagyó be nem küldi a választ a submit_output híváson keresztül.
| Konfigurációs mező | Leírás |
|---|---|
agentId |
A jóváhagyó ügynök (kötelező) |
prompt |
A kapu promptja (nem kötelező; hiányában egy alapértelmezett lép a helyére) |
outputKey |
Állapotkulcs a begyűjtött {decision, reason} payloadnak |
outputSchema |
Alapértelmezésben egy jóváhagyási séma (decision: approved / rejected, reason) |
label, extras.spaceId |
Mint a conversation.promptAgent esetében |
A kapu kizárólag a submit_output híváson keresztül oldódik fel. A BuiltInBodyKeys.humanGate, a csomóponttípus-könyvtár és egy beépített sablon promptszövege egyaránt approve_step és reject_step MCP-eszközöket nevez meg; egyik eszköz sem létezik egyetlen csomagban vagy regisztrériumban sem.
repos.cleanup
Szekció neve “repos.cleanup”Eltávolítja az elavult, elszigetelt worktree-ket; a módját a trigger payloadjából választja. Tiszteletben tartja a futtatás dryRun kapcsolóját.
| Állapotkulcs | Leírás |
|---|---|
ticket_id |
Felszabadítja az adott jegy worktree-jeit |
repo_full_name + pr_number |
Felszabadítja a rövid életű PR-szerkesztő worktree-t |
space_id |
Lebontja az adott beszélgetés worktree-jeit és mappáját |
| (a fentiek egyike sem) | Végigsöpri a munkaterületet: eltűnt könyvtárak, halott terek, árva beszélgetésmappák |
Az outputKey (nem kötelező) egy összegző sztringet kap.
flow.forEach
Szekció neve “flow.forEach”Leképezés / fan-out egy állapotgyűjtemény fölött: elemenként egyszer rendereli a promptot, majd egyszer osztja ki az ügynököt az így összefűzött promptokkal (--- elválasztókkal), és felfüggeszti magát, amíg az a futtatás be nem fejeződik. Egy üres gyűjtemény azonnal befejeződik egy üres listával. Ez nem elemenkénti párhuzamos kiosztás.
| Konfigurációs mező | Leírás |
|---|---|
agentId |
Elemenként kiosztandó ügynök (kötelező) |
prompt |
Elemenkénti prompt; támogatja a {{key}} helyettesítést (kötelező) |
extras.iterableKey |
A gyűjteményt tartó állapotkulcs (kötelező) |
extras.itemKey |
Kulcs, amelyhez az aktuális elem a promptban kötődik (alapértelmezés: item) |
outputKey |
Állapotkulcs a begyűjtött kimenetnek (egy kiosztás, nem lista) |
flow.callPipeline
Szekció neve “flow.callPipeline”Egy másik pipeline-sablont futtat beágyazott al-lépésként (az al-pipeline gyermekfuttatásként fut, beállított parentPipelineRunId-vel). A lépés felfüggeszti magát, amíg a gyermek végállapotba nem kerül, majd a gyermek végleges állapota az outputKey alá fésülődik.
| Konfigurációs mező | Leírás |
|---|---|
extras.templateId |
A futtatandó gyermeksablon (kötelező; egy pipeline nem hívhatja meg önmagát) |
inputKeys |
A gyermek trigger payloadjába másolt állapotkulcsok |
outputKey |
Állapotkulcs a gyermek összefésült végleges állapotának |
code.index
Szekció neve “code.index”Háttérbeli tree-sitter indexelés: bejár egy repót, worker-izolátumokban szimbólumokat/éleket nyer ki, és beolvasztja őket a munkaterület kódgráfjába. A folyamatjelzést a lépésfuttatási sorba streameli; támogatja a száraz futtatást. A tree-sitter és a nyelvtanai kötelező natívok — egy hiányzó dylib azt jelenti, hogy a szerver soha nem indult el, egy futás közben fel nem oldható nyelvtan pedig kihagyás helyett megbuktatja a lépést.
| Állapotkulcs | Leírás |
|---|---|
repo_id |
Indexelendő repó (kötelező) |
repo_local_path |
A checkout helyi útvonala (kötelező) |
meeting.diarize
Szekció neve “meeting.diarize”Offline beszélőszétválasztás. Beolvassa a megbeszélés megőrzött hangját, beszélőkre csoportosítja (Person 1, Person 2, …), újracímkézi az átirat szegmenseit és újraírja a transcript állapotot; emellett diarization_spans értéket bocsát ki a párhuzamos meeting.updateTranscript lépésnek. Az átiratot változatlanul engedi át, ha nem őrződött meg hang, vagy a modellek nincsenek telepítve.
| Állapotkulcs | Leírás |
|---|---|
meeting_id |
A szétválasztandó megbeszélés (kötelező) |
meeting.saveNotes, meeting.addActionItems, meeting.addDecisions
Szekció neve “meeting.saveNotes, meeting.addActionItems, meeting.addDecisions”Determinisztikus, megbeszélés-összefoglalót mentő törzsek. Mindegyik beolvassa az állapotból a meeting_id-t és az ügynöklépés strukturált meeting_outcome payloadját ({summary, enhancedNotes, actionItems[], decisions[]}), és a saját táblájába írja a maga részét — a jegyzeteket, a teendőket vagy a döntéseket. A korábban mentett sorok egy degradált futtatás során sem törlődnek soha.
Egyéb beépített törzsek
Szekció neve “Egyéb beépített törzsek”| Törzskulcs | Leírás |
|---|---|
meeting.identifySpeakers |
Megbeszélések közötti beszélőfelismerés: a szétválasztott beszélőket a mentett hangprofilokhoz illeszti, és a magabiztos egyezéseket automatikusan alkalmazza. Profilok/beágyazások nélkül semmittevő. |
meeting.updateTranscript |
A diarization_spans-ból származó Person N címkéket alkalmazza, és az ablakonkénti töredékeket beszélőnkénti megszólalásokká vonja össze, majd elmenti a megtisztított átiratot. Ha a szétválasztás nem hozott létre semmit, semmittevő. |
meeting.assemblePlayback |
A megbeszélés kevert lejátszási sávját állítja össze a megőrzött, csatornánkénti WAV-okból. Ha nem őrződött meg hang, semmittevő. |
orchestration.markPhase |
A munka-DAG végén hiba-őrszemeket ír azon aljegyekhez, amelyeknek nincs kimenetük, és az orchestrációt synthesizing állapotra billenti. |
orchestration.persistDeliverable |
Az összegzés kimenetét a szülőjegybe írja, befejezi azt, közzéteszi a szállítandót, és az orchestrációt completed állapotúnak jelöli. |
orchestration.awaitApproval |
Részleges jóváhagyási kapu: azonnal befejeződik, ha a lépés csomópontkulcsa benne van az orchestráció jóváhagyott halmazában, egyébként felfüggeszti magát, amíg egy későbbi jóváhagyás fel nem ébreszti. Ez az egyetlen törzs, amely beállítja az extras.awaitApproval értéket, ami mentesíti a 24 órás felfüggesztett lépés időtúllépése alól. |
messaging.createSpace |
Megnyitja azt a beszélgetést, amelyben a sablon többi része dolgozik, a lépés outputKey-je alatt közzétéve (a beépítettek a pipeline_space_id-t használják). Egy üres repoIds lista egyet sem checkoutol; az extras['allRepos'] a munkaterület minden repóját checkoutolja. Az extras['createConversation'] (alapértelmezésben kikapcsolva) egy nevesített adatfolyamot is megnyit. Egy ügynöklépés CSATLAKOZIK egy szobához, és soha nem nyit újat, így egy fan-out e csomópont nélkül a kiosztásnál megbukik — egyszeri bekötése viszont azt jelenti, hogy az egész fan-out egyetlen checkouton osztozik ahelyett, hogy mindegyik kapna sajátot. |
prReview.finalize |
A PR-átnézési sablon utolsó lépése: az összegyűlt átnézési csomópontokat konszenzuscsoportokba rendezi, és kiszámítja a PR-enkénti ítéletet. |
skills.analyze |
Lefuttatja a készségek ellátásilánc-vizsgálatát a munkaterület telepített készségein, és rögzíti az egyes ítéleteket. |
Lépéseredmények
Szekció neve “Lépéseredmények”Egy lépéstörzs StepResult értéket ad vissza (packages/cc_domain/lib/features/pipelines/domain/entities/step_result.dart). Minden gyártómetódus elfogad egy nem kötelező mutatedState mapet, amely a pipeline állapotába fésülődik — kivéve a failed-et.
| Gyártómetódus | Aláírás | Leírás |
|---|---|---|
ok |
StepResult.ok({mutatedState}) |
Normál befejezés; az alsóbb figyelők kiértékelődnek |
route |
StepResult.route(nextRouterKey, {mutatedState}) |
Router befejezés; kiválasztja azt az alsóbb ágat, amelynek routeKey-je illeszkedik |
suspendUntilEvent |
StepResult.suspendUntilEvent(eventType, {mutatedState}) |
Szüneteltetés, amíg egy adott domainesemény-típus el nem sül |
suspendUntilTasksComplete |
StepResult.suspendUntilTasksComplete(taskIds, {mutatedState}) |
Szüneteltetés, amíg a felsorolt feladatok mindegyike végállapotba nem kerül |
terminal |
StepResult.terminal({mutatedState}) |
A pipeline-futtatás befejeződött — nincs több lépés |
failed |
StepResult.failed(errorMessage) |
A lépés meghibásodott egy hibaüzenettel |
StepRetryPolicy
Szekció neve “StepRetryPolicy”Egy meghibásodó csomóponttörzs újrapróbálkozási viselkedése (PipelineNodeConfig.retryPolicy; a null letiltja az újrapróbálkozásokat).
| Mező | Típus | Leírás |
|---|---|---|
maxAttempts |
int |
A teljes kísérletszám az elsővel együtt (3 = 1 próba + 2 újrapróbálkozás); ≥ 1 kell legyen |
backoff |
String |
linear vagy exponential (alapértelmezés) |
initialDelayMs |
int |
Az első újrapróbálkozás előtti késleltetés ezredmásodpercben; a későbbi késleltetések a backoff szerint nőnek |
PipelineNodeConfig
Szekció neve “PipelineNodeConfig”A lépésdefinícióban hordozott, csomópontonkénti konfiguráció (packages/cc_domain/lib/features/pipelines/domain/entities/pipeline_node_config.dart). A beépített és az egyéni csomópontok is ezt az alakot használják; minden törzs csak azokat a mezőket olvassa, amelyek érdeklik.
| Mező | Típus | Leírás |
|---|---|---|
prompt |
String? |
Prompt-sablon {{key}} helyettesítéssel |
script |
String? |
Bash-szkripttörzs {{key}} helyettesítéssel |
agentId |
String? |
A kiosztandó, munkaterület-hatókörű ügynök UUID |
inputKeys |
List<String> |
Állapotkulcsok, amelyeket ez a csomópont bemenetként fogyaszt |
repoIds |
List<String> |
A messaging.createSpace csomópont által checkoutolt repók (<repoId> vagy <repoId>@<branch>). Üres = egy sem; extras['allRepos'] = a munkaterület minden repója. Az ügynöklépéseken figyelmen kívül marad. |
outputKey |
String? |
Állapotkulcs, amely alá a csomópont kimenete íródik |
label |
String? |
A vásznon megjelenő címke (alapértelmezés: a lépés azonosítója) |
outputSchema |
Map<String, dynamic>? |
JSON-séma (részhalmaz), amelynek a kimeneti értéknek meg kell felelnie |
reducer |
String? |
Összefésülési stratégia, amikor párhuzamos ágak ugyanazt az outputKey-t írják: append, mergeLists, mergeMaps, sum vagy override (alapértelmezés) |
retryPolicy |
StepRetryPolicy? |
Újrapróbálkozási szabályzat törzshiba esetén; null = egyetlen próba |
continueOnFail |
bool |
Ha igaz, a végleges hiba nem buktatja meg a futtatást; a hiba a state['_stepErrors'][stepId] alatt tárolódik |
timeoutMs |
int? |
A csomóponttörzs falióra szerinti időtúllépése ezredmásodpercben; null = nincs időtúllépés |
teamId |
String? |
A kiosztandó csapat (team.dispatch csomópontok); kölcsönösen kizárja az agentId-t |
dispatchMode |
String? |
Csapat-végrehajtási mód: allParallel vagy manager |
extras |
Map<String, dynamic> |
Szabad formájú, törzsspecifikus konfiguráció (pl. iterableKey, templateId, feltételfák) |
Származtatott getterek: spaceId (extras['spaceId'] — létező beszélgetés, amelyben dolgozni kell), createsConversation (extras['createConversation']), conversationTitle (extras['conversationTitle']), modeName (extras['mode'] — chat / review / plan, a teret megnyitó csomópontnál olvasódik) és runWhen (extras['runWhen'] — a csomópont kihagyása, ha a feltétel nem teljesül).