Tovább a tartalomhoz

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.

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.

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.

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.

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

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

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 egy type mezővel rendelkező map:
    • {"type": "fileExists", "paths": [...], "baseKey": "repo_local_path", "negate": false, "recursive": false} — igaz, ha bármelyik felsorolt útvonal létezik a lemezen; a negate megfordítja; a recursive az alkönyvtárakat is átkutatja (kihagyva a .git, node_modules, build, .dart_tool könyvtárat). A relatív útvonalak a state[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 a default-ra.
  • Összehasonlítás (örökölt, legfelső szintű extras.left / extras.op / extras.right) — egyenértékű egy comparison prediká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.

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.

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

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

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.

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.

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)

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

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

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.

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.

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

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

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