@cat-factory/orchestration 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/dist/container.d.ts +460 -0
- package/dist/container.d.ts.map +1 -0
- package/dist/container.js +657 -0
- package/dist/container.js.map +1 -0
- package/dist/index.d.ts +29 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +31 -0
- package/dist/index.js.map +1 -0
- package/dist/modules/board/BoardService.d.ts +125 -0
- package/dist/modules/board/BoardService.d.ts.map +1 -0
- package/dist/modules/board/BoardService.js +496 -0
- package/dist/modules/board/BoardService.js.map +1 -0
- package/dist/modules/board/board.logic.d.ts +17 -0
- package/dist/modules/board/board.logic.d.ts.map +1 -0
- package/dist/modules/board/board.logic.js +51 -0
- package/dist/modules/board/board.logic.js.map +1 -0
- package/dist/modules/boardScan/BoardScanService.d.ts +35 -0
- package/dist/modules/boardScan/BoardScanService.d.ts.map +1 -0
- package/dist/modules/boardScan/BoardScanService.js +91 -0
- package/dist/modules/boardScan/BoardScanService.js.map +1 -0
- package/dist/modules/boardScan/board-scan.logic.d.ts +10 -0
- package/dist/modules/boardScan/board-scan.logic.d.ts.map +1 -0
- package/dist/modules/boardScan/board-scan.logic.js +26 -0
- package/dist/modules/boardScan/board-scan.logic.js.map +1 -0
- package/dist/modules/bootstrap/BootstrapService.d.ts +114 -0
- package/dist/modules/bootstrap/BootstrapService.d.ts.map +1 -0
- package/dist/modules/bootstrap/BootstrapService.js +516 -0
- package/dist/modules/bootstrap/BootstrapService.js.map +1 -0
- package/dist/modules/clarity/ClarityReviewService.d.ts +48 -0
- package/dist/modules/clarity/ClarityReviewService.d.ts.map +1 -0
- package/dist/modules/clarity/ClarityReviewService.js +63 -0
- package/dist/modules/clarity/ClarityReviewService.js.map +1 -0
- package/dist/modules/clarity/clarity.logic.d.ts +36 -0
- package/dist/modules/clarity/clarity.logic.d.ts.map +1 -0
- package/dist/modules/clarity/clarity.logic.js +98 -0
- package/dist/modules/clarity/clarity.logic.js.map +1 -0
- package/dist/modules/estimation/estimate.logic.d.ts +11 -0
- package/dist/modules/estimation/estimate.logic.d.ts.map +1 -0
- package/dist/modules/estimation/estimate.logic.js +37 -0
- package/dist/modules/estimation/estimate.logic.js.map +1 -0
- package/dist/modules/execution/AgentContextBuilder.d.ts +114 -0
- package/dist/modules/execution/AgentContextBuilder.d.ts.map +1 -0
- package/dist/modules/execution/AgentContextBuilder.js +316 -0
- package/dist/modules/execution/AgentContextBuilder.js.map +1 -0
- package/dist/modules/execution/CompanionController.d.ts +60 -0
- package/dist/modules/execution/CompanionController.d.ts.map +1 -0
- package/dist/modules/execution/CompanionController.js +216 -0
- package/dist/modules/execution/CompanionController.js.map +1 -0
- package/dist/modules/execution/ExecutionService.d.ts +874 -0
- package/dist/modules/execution/ExecutionService.d.ts.map +1 -0
- package/dist/modules/execution/ExecutionService.js +2921 -0
- package/dist/modules/execution/ExecutionService.js.map +1 -0
- package/dist/modules/execution/MergeResolver.d.ts +34 -0
- package/dist/modules/execution/MergeResolver.d.ts.map +1 -0
- package/dist/modules/execution/MergeResolver.js +81 -0
- package/dist/modules/execution/MergeResolver.js.map +1 -0
- package/dist/modules/execution/ReviewGateController.d.ts +163 -0
- package/dist/modules/execution/ReviewGateController.d.ts.map +1 -0
- package/dist/modules/execution/ReviewGateController.js +251 -0
- package/dist/modules/execution/ReviewGateController.js.map +1 -0
- package/dist/modules/execution/TesterController.d.ts +61 -0
- package/dist/modules/execution/TesterController.d.ts.map +1 -0
- package/dist/modules/execution/TesterController.js +215 -0
- package/dist/modules/execution/TesterController.js.map +1 -0
- package/dist/modules/execution/advance.d.ts +84 -0
- package/dist/modules/execution/advance.d.ts.map +1 -0
- package/dist/modules/execution/advance.js +2 -0
- package/dist/modules/execution/advance.js.map +1 -0
- package/dist/modules/execution/artifact-review.logic.d.ts +25 -0
- package/dist/modules/execution/artifact-review.logic.d.ts.map +1 -0
- package/dist/modules/execution/artifact-review.logic.js +39 -0
- package/dist/modules/execution/artifact-review.logic.js.map +1 -0
- package/dist/modules/execution/ci.logic.d.ts +101 -0
- package/dist/modules/execution/ci.logic.d.ts.map +1 -0
- package/dist/modules/execution/ci.logic.js +117 -0
- package/dist/modules/execution/ci.logic.js.map +1 -0
- package/dist/modules/execution/drive.d.ts +47 -0
- package/dist/modules/execution/drive.d.ts.map +1 -0
- package/dist/modules/execution/drive.js +112 -0
- package/dist/modules/execution/drive.js.map +1 -0
- package/dist/modules/execution/gates.d.ts +97 -0
- package/dist/modules/execution/gates.d.ts.map +1 -0
- package/dist/modules/execution/gates.js +2 -0
- package/dist/modules/execution/gates.js.map +1 -0
- package/dist/modules/execution/individualVendors.logic.d.ts +22 -0
- package/dist/modules/execution/individualVendors.logic.d.ts.map +1 -0
- package/dist/modules/execution/individualVendors.logic.js +33 -0
- package/dist/modules/execution/individualVendors.logic.js.map +1 -0
- package/dist/modules/execution/job.logic.d.ts +52 -0
- package/dist/modules/execution/job.logic.d.ts.map +1 -0
- package/dist/modules/execution/job.logic.js +56 -0
- package/dist/modules/execution/job.logic.js.map +1 -0
- package/dist/modules/execution/release.logic.d.ts +43 -0
- package/dist/modules/execution/release.logic.d.ts.map +1 -0
- package/dist/modules/execution/release.logic.js +49 -0
- package/dist/modules/execution/release.logic.js.map +1 -0
- package/dist/modules/execution/retry.logic.d.ts +40 -0
- package/dist/modules/execution/retry.logic.d.ts.map +1 -0
- package/dist/modules/execution/retry.logic.js +83 -0
- package/dist/modules/execution/retry.logic.js.map +1 -0
- package/dist/modules/execution/stepGating.logic.d.ts +15 -0
- package/dist/modules/execution/stepGating.logic.d.ts.map +1 -0
- package/dist/modules/execution/stepGating.logic.js +29 -0
- package/dist/modules/execution/stepGating.logic.js.map +1 -0
- package/dist/modules/execution/stepResolvers.d.ts +41 -0
- package/dist/modules/execution/stepResolvers.d.ts.map +1 -0
- package/dist/modules/execution/stepResolvers.js +2 -0
- package/dist/modules/execution/stepResolvers.js.map +1 -0
- package/dist/modules/execution/tester-infra.logic.d.ts +42 -0
- package/dist/modules/execution/tester-infra.logic.d.ts.map +1 -0
- package/dist/modules/execution/tester-infra.logic.js +46 -0
- package/dist/modules/execution/tester-infra.logic.js.map +1 -0
- package/dist/modules/merge/MergePresetService.d.ts +32 -0
- package/dist/modules/merge/MergePresetService.d.ts.map +1 -0
- package/dist/modules/merge/MergePresetService.js +109 -0
- package/dist/modules/merge/MergePresetService.js.map +1 -0
- package/dist/modules/modelDefaults/ModelDefaultsService.d.ts +22 -0
- package/dist/modules/modelDefaults/ModelDefaultsService.d.ts.map +1 -0
- package/dist/modules/modelDefaults/ModelDefaultsService.js +28 -0
- package/dist/modules/modelDefaults/ModelDefaultsService.js.map +1 -0
- package/dist/modules/notifications/NotificationService.d.ts +74 -0
- package/dist/modules/notifications/NotificationService.d.ts.map +1 -0
- package/dist/modules/notifications/NotificationService.js +131 -0
- package/dist/modules/notifications/NotificationService.js.map +1 -0
- package/dist/modules/observability/LlmObservabilityService.d.ts +121 -0
- package/dist/modules/observability/LlmObservabilityService.d.ts.map +1 -0
- package/dist/modules/observability/LlmObservabilityService.js +140 -0
- package/dist/modules/observability/LlmObservabilityService.js.map +1 -0
- package/dist/modules/observability/observability.logic.d.ts +57 -0
- package/dist/modules/observability/observability.logic.d.ts.map +1 -0
- package/dist/modules/observability/observability.logic.js +186 -0
- package/dist/modules/observability/observability.logic.js.map +1 -0
- package/dist/modules/pipelines/PipelineService.d.ts +54 -0
- package/dist/modules/pipelines/PipelineService.d.ts.map +1 -0
- package/dist/modules/pipelines/PipelineService.js +226 -0
- package/dist/modules/pipelines/PipelineService.js.map +1 -0
- package/dist/modules/pipelines/pipelineShape.d.ts +53 -0
- package/dist/modules/pipelines/pipelineShape.d.ts.map +1 -0
- package/dist/modules/pipelines/pipelineShape.js +74 -0
- package/dist/modules/pipelines/pipelineShape.js.map +1 -0
- package/dist/modules/recurring/RecurringPipelineService.d.ts +76 -0
- package/dist/modules/recurring/RecurringPipelineService.d.ts.map +1 -0
- package/dist/modules/recurring/RecurringPipelineService.js +295 -0
- package/dist/modules/recurring/RecurringPipelineService.js.map +1 -0
- package/dist/modules/recurring/TrackerSettingsService.d.ts +16 -0
- package/dist/modules/recurring/TrackerSettingsService.d.ts.map +1 -0
- package/dist/modules/recurring/TrackerSettingsService.js +30 -0
- package/dist/modules/recurring/TrackerSettingsService.js.map +1 -0
- package/dist/modules/recurring/schedule.logic.d.ts +14 -0
- package/dist/modules/recurring/schedule.logic.d.ts.map +1 -0
- package/dist/modules/recurring/schedule.logic.js +85 -0
- package/dist/modules/recurring/schedule.logic.js.map +1 -0
- package/dist/modules/releaseHealth/ReleaseHealthService.d.ts +38 -0
- package/dist/modules/releaseHealth/ReleaseHealthService.d.ts.map +1 -0
- package/dist/modules/releaseHealth/ReleaseHealthService.js +96 -0
- package/dist/modules/releaseHealth/ReleaseHealthService.js.map +1 -0
- package/dist/modules/requirements/RequirementReviewService.d.ts +48 -0
- package/dist/modules/requirements/RequirementReviewService.d.ts.map +1 -0
- package/dist/modules/requirements/RequirementReviewService.js +83 -0
- package/dist/modules/requirements/RequirementReviewService.js.map +1 -0
- package/dist/modules/requirements/requirements.logic.d.ts +93 -0
- package/dist/modules/requirements/requirements.logic.d.ts.map +1 -0
- package/dist/modules/requirements/requirements.logic.js +203 -0
- package/dist/modules/requirements/requirements.logic.js.map +1 -0
- package/dist/modules/review/IterativeReviewService.d.ts +175 -0
- package/dist/modules/review/IterativeReviewService.d.ts.map +1 -0
- package/dist/modules/review/IterativeReviewService.js +327 -0
- package/dist/modules/review/IterativeReviewService.js.map +1 -0
- package/dist/modules/serviceFragmentDefaults/ServiceFragmentDefaultsService.d.ts +20 -0
- package/dist/modules/serviceFragmentDefaults/ServiceFragmentDefaultsService.d.ts.map +1 -0
- package/dist/modules/serviceFragmentDefaults/ServiceFragmentDefaultsService.js +26 -0
- package/dist/modules/serviceFragmentDefaults/ServiceFragmentDefaultsService.js.map +1 -0
- package/dist/modules/services/ServiceMountService.d.ts +48 -0
- package/dist/modules/services/ServiceMountService.d.ts.map +1 -0
- package/dist/modules/services/ServiceMountService.js +90 -0
- package/dist/modules/services/ServiceMountService.js.map +1 -0
- package/dist/modules/settings/WorkspaceSettingsService.d.ts +22 -0
- package/dist/modules/settings/WorkspaceSettingsService.d.ts.map +1 -0
- package/dist/modules/settings/WorkspaceSettingsService.js +50 -0
- package/dist/modules/settings/WorkspaceSettingsService.js.map +1 -0
- package/package.json +41 -0
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import type { Block, ExecutionInstance, GateStepState, MergeThresholdPreset, PipelineStep } from '@cat-factory/kernel';
|
|
2
|
+
/** The outcome of a single gate precheck against its provider. */
|
|
3
|
+
export interface GateProbe {
|
|
4
|
+
/**
|
|
5
|
+
* - `pass` — the precheck is satisfied; the step finishes and the run advances
|
|
6
|
+
* (the "skip the agent" path — nothing was spun up).
|
|
7
|
+
* - `pending` — the provider is still computing; keep polling.
|
|
8
|
+
* - `fail` — the precheck failed; escalate to the helper agent (or give up once
|
|
9
|
+
* the attempt budget is spent).
|
|
10
|
+
*/
|
|
11
|
+
status: 'pass' | 'pending' | 'fail';
|
|
12
|
+
/** The PR head commit the precheck ran against, or null when there is no open PR. */
|
|
13
|
+
headSha: string | null;
|
|
14
|
+
/** Step output recorded on `pass` (a short human-readable reason). */
|
|
15
|
+
passOutput?: string;
|
|
16
|
+
/** A summary of what failed on `fail` — fed to the helper agent and the give-up error. */
|
|
17
|
+
failureSummary?: string;
|
|
18
|
+
/**
|
|
19
|
+
* Structured failing checks behind {@link failureSummary} (the CI gate populates
|
|
20
|
+
* this from the red check runs; the conflicts gate leaves it undefined). Persisted
|
|
21
|
+
* onto `step.gate` so the run-detail UI can list each failing check.
|
|
22
|
+
*/
|
|
23
|
+
failingChecks?: {
|
|
24
|
+
name: string;
|
|
25
|
+
conclusion: string | null;
|
|
26
|
+
}[];
|
|
27
|
+
}
|
|
28
|
+
/** Inputs to a gate's exhaustion handler (budget spent / no executor to escalate to). */
|
|
29
|
+
export interface GateExhaustedArgs {
|
|
30
|
+
workspaceId: string;
|
|
31
|
+
instance: ExecutionInstance;
|
|
32
|
+
block: Block;
|
|
33
|
+
step: PipelineStep;
|
|
34
|
+
summary?: string;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* The per-gate differentiators the engine's generic gate machine needs. Everything
|
|
38
|
+
* shared (the state machine, persistence, dispatch, budget) lives in ExecutionService.
|
|
39
|
+
*/
|
|
40
|
+
export interface GateDefinition {
|
|
41
|
+
/** Matches the step's `agentKind` (e.g. `ci`, `conflicts`). */
|
|
42
|
+
kind: string;
|
|
43
|
+
/** The container agent kind dispatched on a failed precheck (e.g. `ci-fixer`). */
|
|
44
|
+
helperKind: string;
|
|
45
|
+
/** Whether the gate's provider is wired. When false the gate is a pass-through. */
|
|
46
|
+
wired(): boolean;
|
|
47
|
+
/** Step output recorded when the gate passes through (no provider configured). */
|
|
48
|
+
unwiredOutput: string;
|
|
49
|
+
/**
|
|
50
|
+
* What to do when the durable driver's poll budget (ciMaxPolls × ciPollInterval) is
|
|
51
|
+
* spent while the gate is still `pending` — distinct from the attempt budget (helper
|
|
52
|
+
* dispatches) handled by {@link onExhausted}:
|
|
53
|
+
* - `fail` (default) — the precheck never settled, which is a failure for the CI /
|
|
54
|
+
* conflicts gates (CI never went green / the PR never became mergeable).
|
|
55
|
+
* - `pass` — for a time-windowed watch gate (post-release-health), running out of
|
|
56
|
+
* polls just means the watch window outlasted the budget with NO regression seen,
|
|
57
|
+
* which is a healthy pass — not a timeout failure.
|
|
58
|
+
* Resolved by {@link ExecutionService.resolveGatePollExhaustion}.
|
|
59
|
+
*/
|
|
60
|
+
pollExhaustion?: 'pass' | 'fail';
|
|
61
|
+
/**
|
|
62
|
+
* Run the precheck against the provider and classify it. Receives the live gate
|
|
63
|
+
* state so a time-windowed gate (post-release-health) can read its `watchSince`.
|
|
64
|
+
*/
|
|
65
|
+
probe(workspaceId: string, blockId: string, gateState: GateStepState): Promise<GateProbe>;
|
|
66
|
+
/**
|
|
67
|
+
* Optional: the attempt budget for this gate, resolved from the task's merge preset.
|
|
68
|
+
* Defaults to `ciMaxAttempts` when omitted (the CI/conflicts gates use that).
|
|
69
|
+
*/
|
|
70
|
+
attemptBudget?(preset: Pick<MergeThresholdPreset, 'ciMaxAttempts' | 'releaseMaxAttempts'>): number;
|
|
71
|
+
/**
|
|
72
|
+
* Optional extra context handed to the helper agent on escalation (the CI gate
|
|
73
|
+
* passes the failing-check summary; the conflicts gate passes nothing).
|
|
74
|
+
*/
|
|
75
|
+
helperPriorOutput?(summary: string): {
|
|
76
|
+
agentKind: string;
|
|
77
|
+
output: string;
|
|
78
|
+
} | undefined;
|
|
79
|
+
/**
|
|
80
|
+
* Optional async builder for richer helper context (gathered at dispatch time), used
|
|
81
|
+
* when a gate's helper needs more than the precheck summary — e.g. the on-call agent
|
|
82
|
+
* gets the full Datadog evidence bundle. Returns prior-output entries appended after
|
|
83
|
+
* the base context's. Takes precedence over {@link helperPriorOutput} when present.
|
|
84
|
+
*/
|
|
85
|
+
gatherHelperPriorOutputs?(workspaceId: string, blockId: string, gateState: GateStepState): Promise<{
|
|
86
|
+
agentKind: string;
|
|
87
|
+
output: string;
|
|
88
|
+
}[]>;
|
|
89
|
+
/**
|
|
90
|
+
* Called when the attempt budget is spent (or there is no async executor to escalate
|
|
91
|
+
* to). May raise a notification; returns the message used to fail the run.
|
|
92
|
+
*/
|
|
93
|
+
onExhausted(args: GateExhaustedArgs): Promise<{
|
|
94
|
+
error: string;
|
|
95
|
+
}>;
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=gates.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gates.d.ts","sourceRoot":"","sources":["../../../src/modules/execution/gates.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,KAAK,EACL,iBAAiB,EACjB,aAAa,EACb,oBAAoB,EACpB,YAAY,EACb,MAAM,qBAAqB,CAAA;AAa5B,kEAAkE;AAClE,MAAM,WAAW,SAAS;IACxB;;;;;;OAMG;IACH,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAAA;IACnC,qFAAqF;IACrF,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB,sEAAsE;IACtE,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,0FAA0F;IAC1F,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB;;;;OAIG;IACH,aAAa,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,EAAE,CAAA;CAC9D;AAED,yFAAyF;AACzF,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,MAAM,CAAA;IACnB,QAAQ,EAAE,iBAAiB,CAAA;IAC3B,KAAK,EAAE,KAAK,CAAA;IACZ,IAAI,EAAE,YAAY,CAAA;IAClB,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,+DAA+D;IAC/D,IAAI,EAAE,MAAM,CAAA;IACZ,kFAAkF;IAClF,UAAU,EAAE,MAAM,CAAA;IAClB,mFAAmF;IACnF,KAAK,IAAI,OAAO,CAAA;IAChB,kFAAkF;IAClF,aAAa,EAAE,MAAM,CAAA;IACrB;;;;;;;;;;OAUG;IACH,cAAc,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;IAChC;;;OAGG;IACH,KAAK,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,aAAa,GAAG,OAAO,CAAC,SAAS,CAAC,CAAA;IACzF;;;OAGG;IACH,aAAa,CAAC,CAAC,MAAM,EAAE,IAAI,CAAC,oBAAoB,EAAE,eAAe,GAAG,oBAAoB,CAAC,GAAG,MAAM,CAAA;IAClG;;;OAGG;IACH,iBAAiB,CAAC,CAAC,OAAO,EAAE,MAAM,GAAG;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,CAAA;IACtF;;;;;OAKG;IACH,wBAAwB,CAAC,CACvB,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,aAAa,GACvB,OAAO,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC,CAAA;IACnD;;;OAGG;IACH,WAAW,CAAC,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAAC;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CACjE"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gates.js","sourceRoot":"","sources":["../../../src/modules/execution/gates.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { type SubscriptionVendor } from '@cat-factory/kernel';
|
|
2
|
+
/** Resolve the workspace per-kind default model id (the model-defaults feature). */
|
|
3
|
+
export type WorkspaceModelDefaultResolver = (kind: string) => Promise<string | undefined>;
|
|
4
|
+
/** Whether the run's user has their OWN personal subscription for an individual vendor. */
|
|
5
|
+
export type HasPersonalSubscription = (vendor: SubscriptionVendor) => boolean;
|
|
6
|
+
/**
|
|
7
|
+
* The individual-usage subscription vendors (Claude / Codex / GLM-for-a-subscriber) a run
|
|
8
|
+
* will ACTUALLY lease a personal credential for, so the caller can gate it on the
|
|
9
|
+
* initiator's personal subscription(s) up-front. Mirrors dispatch on TWO axes:
|
|
10
|
+
*
|
|
11
|
+
* - Model precedence ({@link resolveStepModelRef}): a RESOLVABLE block pin applies to
|
|
12
|
+
* every step, so it alone decides the set; only an unpinned run (or a stale/unknown
|
|
13
|
+
* id) falls to the workspace per-kind defaults. Env-routing defaults (dispatch's last
|
|
14
|
+
* fallback) are operator-level and not gated.
|
|
15
|
+
* - Personal-credential need ({@link personalCredentialVendorForModelId}, mirroring
|
|
16
|
+
* `ContainerAgentExecutor.resolveEffectiveRef`): a credential is leased for a
|
|
17
|
+
* subscription-only individual model (Claude / Codex) always, and for a DUAL-MODE
|
|
18
|
+
* individual model (GLM) only when THIS user has their own subscription for it (else
|
|
19
|
+
* it runs on the Cloudflare base, ungated). `hasPersonalSubscription` reports that.
|
|
20
|
+
*/
|
|
21
|
+
export declare function resolveIndividualVendors(blockModelId: string | undefined, agentKinds: string[], resolveWorkspaceModelDefault: WorkspaceModelDefaultResolver | undefined, hasPersonalSubscription: HasPersonalSubscription): Promise<SubscriptionVendor[]>;
|
|
22
|
+
//# sourceMappingURL=individualVendors.logic.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"individualVendors.logic.d.ts","sourceRoot":"","sources":["../../../src/modules/execution/individualVendors.logic.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,kBAAkB,EACxB,MAAM,qBAAqB,CAAA;AAE5B,oFAAoF;AACpF,MAAM,MAAM,6BAA6B,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAA;AAEzF,2FAA2F;AAC3F,MAAM,MAAM,uBAAuB,GAAG,CAAC,MAAM,EAAE,kBAAkB,KAAK,OAAO,CAAA;AAE7E;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,wBAAwB,CAC5C,YAAY,EAAE,MAAM,GAAG,SAAS,EAChC,UAAU,EAAE,MAAM,EAAE,EACpB,4BAA4B,EAAE,6BAA6B,GAAG,SAAS,EACvE,uBAAuB,EAAE,uBAAuB,GAC/C,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAa/B"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { getSelectableModel, personalCredentialVendorForModelId, } from '@cat-factory/kernel';
|
|
2
|
+
/**
|
|
3
|
+
* The individual-usage subscription vendors (Claude / Codex / GLM-for-a-subscriber) a run
|
|
4
|
+
* will ACTUALLY lease a personal credential for, so the caller can gate it on the
|
|
5
|
+
* initiator's personal subscription(s) up-front. Mirrors dispatch on TWO axes:
|
|
6
|
+
*
|
|
7
|
+
* - Model precedence ({@link resolveStepModelRef}): a RESOLVABLE block pin applies to
|
|
8
|
+
* every step, so it alone decides the set; only an unpinned run (or a stale/unknown
|
|
9
|
+
* id) falls to the workspace per-kind defaults. Env-routing defaults (dispatch's last
|
|
10
|
+
* fallback) are operator-level and not gated.
|
|
11
|
+
* - Personal-credential need ({@link personalCredentialVendorForModelId}, mirroring
|
|
12
|
+
* `ContainerAgentExecutor.resolveEffectiveRef`): a credential is leased for a
|
|
13
|
+
* subscription-only individual model (Claude / Codex) always, and for a DUAL-MODE
|
|
14
|
+
* individual model (GLM) only when THIS user has their own subscription for it (else
|
|
15
|
+
* it runs on the Cloudflare base, ungated). `hasPersonalSubscription` reports that.
|
|
16
|
+
*/
|
|
17
|
+
export async function resolveIndividualVendors(blockModelId, agentKinds, resolveWorkspaceModelDefault, hasPersonalSubscription) {
|
|
18
|
+
if (blockModelId && getSelectableModel(blockModelId)) {
|
|
19
|
+
const pinned = personalCredentialVendorForModelId(blockModelId, hasPersonalSubscription);
|
|
20
|
+
return pinned ? [pinned] : [];
|
|
21
|
+
}
|
|
22
|
+
if (!resolveWorkspaceModelDefault || agentKinds.length === 0)
|
|
23
|
+
return [];
|
|
24
|
+
const vendors = new Set();
|
|
25
|
+
for (const kind of agentKinds) {
|
|
26
|
+
const defaultId = await resolveWorkspaceModelDefault(kind);
|
|
27
|
+
const vendor = personalCredentialVendorForModelId(defaultId, hasPersonalSubscription);
|
|
28
|
+
if (vendor)
|
|
29
|
+
vendors.add(vendor);
|
|
30
|
+
}
|
|
31
|
+
return [...vendors];
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=individualVendors.logic.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"individualVendors.logic.js","sourceRoot":"","sources":["../../../src/modules/execution/individualVendors.logic.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,kCAAkC,GAEnC,MAAM,qBAAqB,CAAA;AAQ5B;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC5C,YAAgC,EAChC,UAAoB,EACpB,4BAAuE,EACvE,uBAAgD;IAEhD,IAAI,YAAY,IAAI,kBAAkB,CAAC,YAAY,CAAC,EAAE,CAAC;QACrD,MAAM,MAAM,GAAG,kCAAkC,CAAC,YAAY,EAAE,uBAAuB,CAAC,CAAA;QACxF,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;IAC/B,CAAC;IACD,IAAI,CAAC,4BAA4B,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAA;IACvE,MAAM,OAAO,GAAG,IAAI,GAAG,EAAsB,CAAA;IAC7C,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;QAC9B,MAAM,SAAS,GAAG,MAAM,4BAA4B,CAAC,IAAI,CAAC,CAAA;QAC1D,MAAM,MAAM,GAAG,kCAAkC,CAAC,SAAS,EAAE,uBAAuB,CAAC,CAAA;QACrF,IAAI,MAAM;YAAE,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;IACjC,CAAC;IACD,OAAO,CAAC,GAAG,OAAO,CAAC,CAAA;AACrB,CAAC"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Maximum number of times a step's *crash* eviction (OOM / a genuine crash) is
|
|
3
|
+
* recovered automatically by re-dispatching a fresh container for the same step.
|
|
4
|
+
* Set to 1: one blip is recovered silently; a second crash of the same step is
|
|
5
|
+
* treated as deterministic and fails the run (`evicted`). Evictions a runtime flags
|
|
6
|
+
* as transient infra churn get their own, larger budget — see
|
|
7
|
+
* {@link MAX_TRANSIENT_EVICTION_RECOVERIES}.
|
|
8
|
+
*/
|
|
9
|
+
export declare const MAX_EVICTION_RECOVERIES = 1;
|
|
10
|
+
/**
|
|
11
|
+
* Recovery budget for evictions a runtime flags as *transient infrastructure churn*
|
|
12
|
+
* (see {@link isTransientEviction}) rather than a crash. Larger than
|
|
13
|
+
* {@link MAX_EVICTION_RECOVERIES} because such churn can recur several times in a
|
|
14
|
+
* short window (e.g. a deploy that drains the sandbox repeatedly). Each recovery
|
|
15
|
+
* re-dispatches a fresh container, naturally spaced by the job poll interval, so a
|
|
16
|
+
* bounded handful rides out the window instead of deterministically failing a
|
|
17
|
+
* healthy run. The engine stays runtime-neutral: which infra events count as
|
|
18
|
+
* transient is the facade's call — it opts in by tagging the eviction with
|
|
19
|
+
* {@link TRANSIENT_EVICTION_MARKER} (Cloudflare maps a new-version rollout / exit
|
|
20
|
+
* 143 to it; another runtime might map a node drain or a placement move).
|
|
21
|
+
*/
|
|
22
|
+
export declare const MAX_TRANSIENT_EVICTION_RECOVERIES = 5;
|
|
23
|
+
/**
|
|
24
|
+
* Neutral marker a runtime facade appends to an eviction error to declare it
|
|
25
|
+
* transient infrastructure churn (recover leniently), not a crash. Kept generic on
|
|
26
|
+
* purpose: the engine knows only "transient vs crash"; the facade owns the mapping
|
|
27
|
+
* from its own signal (a Cloudflare rollout, a node drain, …) to this marker. The
|
|
28
|
+
* tagged string still contains "evicted or crashed" so {@link isContainerEvictionError}
|
|
29
|
+
* also matches and the shared recovery machinery engages.
|
|
30
|
+
*/
|
|
31
|
+
export declare const TRANSIENT_EVICTION_MARKER = "transient infrastructure eviction";
|
|
32
|
+
/**
|
|
33
|
+
* Whether a failed job poll is a *container eviction/crash* (the per-run container
|
|
34
|
+
* vanished and its in-memory job registry is gone) rather than a genuine agent
|
|
35
|
+
* failure. The Cloudflare transport maps a 404 job poll to a failed view whose
|
|
36
|
+
* message ends `(container evicted or crashed)`; the worker bootstrap flow
|
|
37
|
+
* classifies the identical string. Matching it here lets the execution engine
|
|
38
|
+
* recover a transient eviction by spinning a fresh container instead of failing
|
|
39
|
+
* the whole run on the first blip. Covers transient-tagged evictions too (their
|
|
40
|
+
* message also contains this phrase) — {@link isTransientEviction} sub-classifies them.
|
|
41
|
+
*/
|
|
42
|
+
export declare function isContainerEvictionError(error: string | undefined): boolean;
|
|
43
|
+
/**
|
|
44
|
+
* Whether a container eviction was flagged by the runtime facade as *transient
|
|
45
|
+
* infrastructure churn* (the facade tagged it with {@link TRANSIENT_EVICTION_MARKER})
|
|
46
|
+
* rather than a crash/OOM. Transient evictions recover on the larger
|
|
47
|
+
* {@link MAX_TRANSIENT_EVICTION_RECOVERIES} budget. This is intentionally agnostic to
|
|
48
|
+
* what the underlying event was: the facade decides (Cloudflare, for instance, maps a
|
|
49
|
+
* new-version rollout to it after asking the container Durable Object).
|
|
50
|
+
*/
|
|
51
|
+
export declare function isTransientEviction(error: string | undefined): boolean;
|
|
52
|
+
//# sourceMappingURL=job.logic.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"job.logic.d.ts","sourceRoot":"","sources":["../../../src/modules/execution/job.logic.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,eAAO,MAAM,uBAAuB,IAAI,CAAA;AAExC;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,iCAAiC,IAAI,CAAA;AAElD;;;;;;;GAOG;AACH,eAAO,MAAM,yBAAyB,sCAAsC,CAAA;AAE5E;;;;;;;;;GASG;AACH,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAE3E;AAED;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAEtE"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Maximum number of times a step's *crash* eviction (OOM / a genuine crash) is
|
|
3
|
+
* recovered automatically by re-dispatching a fresh container for the same step.
|
|
4
|
+
* Set to 1: one blip is recovered silently; a second crash of the same step is
|
|
5
|
+
* treated as deterministic and fails the run (`evicted`). Evictions a runtime flags
|
|
6
|
+
* as transient infra churn get their own, larger budget — see
|
|
7
|
+
* {@link MAX_TRANSIENT_EVICTION_RECOVERIES}.
|
|
8
|
+
*/
|
|
9
|
+
export const MAX_EVICTION_RECOVERIES = 1;
|
|
10
|
+
/**
|
|
11
|
+
* Recovery budget for evictions a runtime flags as *transient infrastructure churn*
|
|
12
|
+
* (see {@link isTransientEviction}) rather than a crash. Larger than
|
|
13
|
+
* {@link MAX_EVICTION_RECOVERIES} because such churn can recur several times in a
|
|
14
|
+
* short window (e.g. a deploy that drains the sandbox repeatedly). Each recovery
|
|
15
|
+
* re-dispatches a fresh container, naturally spaced by the job poll interval, so a
|
|
16
|
+
* bounded handful rides out the window instead of deterministically failing a
|
|
17
|
+
* healthy run. The engine stays runtime-neutral: which infra events count as
|
|
18
|
+
* transient is the facade's call — it opts in by tagging the eviction with
|
|
19
|
+
* {@link TRANSIENT_EVICTION_MARKER} (Cloudflare maps a new-version rollout / exit
|
|
20
|
+
* 143 to it; another runtime might map a node drain or a placement move).
|
|
21
|
+
*/
|
|
22
|
+
export const MAX_TRANSIENT_EVICTION_RECOVERIES = 5;
|
|
23
|
+
/**
|
|
24
|
+
* Neutral marker a runtime facade appends to an eviction error to declare it
|
|
25
|
+
* transient infrastructure churn (recover leniently), not a crash. Kept generic on
|
|
26
|
+
* purpose: the engine knows only "transient vs crash"; the facade owns the mapping
|
|
27
|
+
* from its own signal (a Cloudflare rollout, a node drain, …) to this marker. The
|
|
28
|
+
* tagged string still contains "evicted or crashed" so {@link isContainerEvictionError}
|
|
29
|
+
* also matches and the shared recovery machinery engages.
|
|
30
|
+
*/
|
|
31
|
+
export const TRANSIENT_EVICTION_MARKER = 'transient infrastructure eviction';
|
|
32
|
+
/**
|
|
33
|
+
* Whether a failed job poll is a *container eviction/crash* (the per-run container
|
|
34
|
+
* vanished and its in-memory job registry is gone) rather than a genuine agent
|
|
35
|
+
* failure. The Cloudflare transport maps a 404 job poll to a failed view whose
|
|
36
|
+
* message ends `(container evicted or crashed)`; the worker bootstrap flow
|
|
37
|
+
* classifies the identical string. Matching it here lets the execution engine
|
|
38
|
+
* recover a transient eviction by spinning a fresh container instead of failing
|
|
39
|
+
* the whole run on the first blip. Covers transient-tagged evictions too (their
|
|
40
|
+
* message also contains this phrase) — {@link isTransientEviction} sub-classifies them.
|
|
41
|
+
*/
|
|
42
|
+
export function isContainerEvictionError(error) {
|
|
43
|
+
return error !== undefined && /evicted or crashed/i.test(error);
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Whether a container eviction was flagged by the runtime facade as *transient
|
|
47
|
+
* infrastructure churn* (the facade tagged it with {@link TRANSIENT_EVICTION_MARKER})
|
|
48
|
+
* rather than a crash/OOM. Transient evictions recover on the larger
|
|
49
|
+
* {@link MAX_TRANSIENT_EVICTION_RECOVERIES} budget. This is intentionally agnostic to
|
|
50
|
+
* what the underlying event was: the facade decides (Cloudflare, for instance, maps a
|
|
51
|
+
* new-version rollout to it after asking the container Durable Object).
|
|
52
|
+
*/
|
|
53
|
+
export function isTransientEviction(error) {
|
|
54
|
+
return error !== undefined && error.includes(TRANSIENT_EVICTION_MARKER);
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=job.logic.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"job.logic.js","sourceRoot":"","sources":["../../../src/modules/execution/job.logic.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,CAAA;AAExC;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,MAAM,iCAAiC,GAAG,CAAC,CAAA;AAElD;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,mCAAmC,CAAA;AAE5E;;;;;;;;;GASG;AACH,MAAM,UAAU,wBAAwB,CAAC,KAAyB;IAChE,OAAO,KAAK,KAAK,SAAS,IAAI,qBAAqB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;AACjE,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,mBAAmB,CAAC,KAAyB;IAC3D,OAAO,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,QAAQ,CAAC,yBAAyB,CAAC,CAAA;AACzE,CAAC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import type { ReleaseHealthReport, ReleaseSignal } from '@cat-factory/kernel';
|
|
2
|
+
/**
|
|
3
|
+
* The agent kind of the special post-release-health gate step. Like `ci`/`conflicts`
|
|
4
|
+
* it is NOT a container/inline LLM agent: it polls a `ReleaseHealthProvider` (Datadog
|
|
5
|
+
* monitors/SLOs) over a monitoring window after deploy and only escalates to the
|
|
6
|
+
* `on-call` agent on a regression. Passes through when no provider/config is wired.
|
|
7
|
+
*/
|
|
8
|
+
export declare const POST_RELEASE_HEALTH_AGENT_KIND = "post-release-health";
|
|
9
|
+
/**
|
|
10
|
+
* The agent kind of the `on-call` container agent dispatched on a release regression.
|
|
11
|
+
* It clones the released PR head, reasons over the evidence bundle (alerting
|
|
12
|
+
* monitors/SLOs + recent error logs) against the diff, and returns a JSON assessment
|
|
13
|
+
* (culprit confidence + recommendation). It makes NO commits and reverts nothing —
|
|
14
|
+
* the engine raises a `release_regression` notification for a human to decide.
|
|
15
|
+
*/
|
|
16
|
+
export declare const ON_CALL_AGENT_KIND = "on-call";
|
|
17
|
+
/** The gate verdict for one post-release-health probe. */
|
|
18
|
+
export type ReleaseGateVerdict = 'pass' | 'pending' | 'fail';
|
|
19
|
+
/**
|
|
20
|
+
* Decide the gate verdict from the provider's signal verdict + the monitoring-window
|
|
21
|
+
* timing:
|
|
22
|
+
* - `regressed` → `fail` (escalate to the on-call agent).
|
|
23
|
+
* - anything else & window not elapsed → `pending` (keep watching the rest of the window).
|
|
24
|
+
* - anything else & window elapsed → `pass` (no regression observed in the window).
|
|
25
|
+
*
|
|
26
|
+
* The non-regressed states (`healthy` AND `pending`/`no_data`) are treated the same way:
|
|
27
|
+
* keep watching until the window elapses, then pass. This is deliberate — a `pending`
|
|
28
|
+
* verdict means "no regression detected yet" (e.g. a quiet or `no_data` monitor right
|
|
29
|
+
* after deploy), NOT "broken". Blocking advancement on it forever (the old behaviour)
|
|
30
|
+
* meant a permanently-`no_data` monitor burned the whole poll budget and then failed an
|
|
31
|
+
* otherwise-healthy release as a false `timeout`. The window is the grace period; once it
|
|
32
|
+
* elapses with nothing alerting, the release ships.
|
|
33
|
+
*
|
|
34
|
+
* `warn` states do not regress the gate — only `alert`/SLO-breach (which the provider
|
|
35
|
+
* maps to `regressed`) do — so a warning threshold doesn't pause the pipeline.
|
|
36
|
+
*/
|
|
37
|
+
export declare function classifyReleaseHealth(args: {
|
|
38
|
+
report: ReleaseHealthReport;
|
|
39
|
+
windowElapsed: boolean;
|
|
40
|
+
}): ReleaseGateVerdict;
|
|
41
|
+
/** A short, human-readable summary of the regressed signals, for the notification + on-call. */
|
|
42
|
+
export declare function describeRegressedSignals(signals: ReleaseSignal[]): string;
|
|
43
|
+
//# sourceMappingURL=release.logic.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"release.logic.d.ts","sourceRoot":"","sources":["../../../src/modules/execution/release.logic.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAE7E;;;;;GAKG;AACH,eAAO,MAAM,8BAA8B,wBAAwB,CAAA;AAEnE;;;;;;GAMG;AACH,eAAO,MAAM,kBAAkB,YAAY,CAAA;AAE3C,0DAA0D;AAC1D,MAAM,MAAM,kBAAkB,GAAG,MAAM,GAAG,SAAS,GAAG,MAAM,CAAA;AAE5D;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE;IAC1C,MAAM,EAAE,mBAAmB,CAAA;IAC3B,aAAa,EAAE,OAAO,CAAA;CACvB,GAAG,kBAAkB,CAGrB;AAED,gGAAgG;AAChG,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,aAAa,EAAE,GAAG,MAAM,CAOzE"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The agent kind of the special post-release-health gate step. Like `ci`/`conflicts`
|
|
3
|
+
* it is NOT a container/inline LLM agent: it polls a `ReleaseHealthProvider` (Datadog
|
|
4
|
+
* monitors/SLOs) over a monitoring window after deploy and only escalates to the
|
|
5
|
+
* `on-call` agent on a regression. Passes through when no provider/config is wired.
|
|
6
|
+
*/
|
|
7
|
+
export const POST_RELEASE_HEALTH_AGENT_KIND = 'post-release-health';
|
|
8
|
+
/**
|
|
9
|
+
* The agent kind of the `on-call` container agent dispatched on a release regression.
|
|
10
|
+
* It clones the released PR head, reasons over the evidence bundle (alerting
|
|
11
|
+
* monitors/SLOs + recent error logs) against the diff, and returns a JSON assessment
|
|
12
|
+
* (culprit confidence + recommendation). It makes NO commits and reverts nothing —
|
|
13
|
+
* the engine raises a `release_regression` notification for a human to decide.
|
|
14
|
+
*/
|
|
15
|
+
export const ON_CALL_AGENT_KIND = 'on-call';
|
|
16
|
+
/**
|
|
17
|
+
* Decide the gate verdict from the provider's signal verdict + the monitoring-window
|
|
18
|
+
* timing:
|
|
19
|
+
* - `regressed` → `fail` (escalate to the on-call agent).
|
|
20
|
+
* - anything else & window not elapsed → `pending` (keep watching the rest of the window).
|
|
21
|
+
* - anything else & window elapsed → `pass` (no regression observed in the window).
|
|
22
|
+
*
|
|
23
|
+
* The non-regressed states (`healthy` AND `pending`/`no_data`) are treated the same way:
|
|
24
|
+
* keep watching until the window elapses, then pass. This is deliberate — a `pending`
|
|
25
|
+
* verdict means "no regression detected yet" (e.g. a quiet or `no_data` monitor right
|
|
26
|
+
* after deploy), NOT "broken". Blocking advancement on it forever (the old behaviour)
|
|
27
|
+
* meant a permanently-`no_data` monitor burned the whole poll budget and then failed an
|
|
28
|
+
* otherwise-healthy release as a false `timeout`. The window is the grace period; once it
|
|
29
|
+
* elapses with nothing alerting, the release ships.
|
|
30
|
+
*
|
|
31
|
+
* `warn` states do not regress the gate — only `alert`/SLO-breach (which the provider
|
|
32
|
+
* maps to `regressed`) do — so a warning threshold doesn't pause the pipeline.
|
|
33
|
+
*/
|
|
34
|
+
export function classifyReleaseHealth(args) {
|
|
35
|
+
if (args.report.status === 'regressed')
|
|
36
|
+
return 'fail';
|
|
37
|
+
return args.windowElapsed ? 'pass' : 'pending';
|
|
38
|
+
}
|
|
39
|
+
/** A short, human-readable summary of the regressed signals, for the notification + on-call. */
|
|
40
|
+
export function describeRegressedSignals(signals) {
|
|
41
|
+
const bad = signals.filter((s) => s.state === 'alert');
|
|
42
|
+
if (bad.length === 0)
|
|
43
|
+
return 'A monitored release signal regressed.';
|
|
44
|
+
const names = bad
|
|
45
|
+
.map((s) => `${s.name} (${s.state}${s.detail ? `: ${s.detail}` : ''})`)
|
|
46
|
+
.join(', ');
|
|
47
|
+
return `Regressed signals: ${names}`;
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=release.logic.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"release.logic.js","sourceRoot":"","sources":["../../../src/modules/execution/release.logic.ts"],"names":[],"mappings":"AAEA;;;;;GAKG;AACH,MAAM,CAAC,MAAM,8BAA8B,GAAG,qBAAqB,CAAA;AAEnE;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,SAAS,CAAA;AAK3C;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,qBAAqB,CAAC,IAGrC;IACC,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,KAAK,WAAW;QAAE,OAAO,MAAM,CAAA;IACrD,OAAO,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAA;AAChD,CAAC;AAED,gGAAgG;AAChG,MAAM,UAAU,wBAAwB,CAAC,OAAwB;IAC/D,MAAM,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,OAAO,CAAC,CAAA;IACtD,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,uCAAuC,CAAA;IACpE,MAAM,KAAK,GAAG,GAAG;SACd,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC;SACtE,IAAI,CAAC,IAAI,CAAC,CAAA;IACb,OAAO,sBAAsB,KAAK,EAAE,CAAA;AACtC,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { PipelineStep } from '@cat-factory/kernel';
|
|
2
|
+
/**
|
|
3
|
+
* Plan how a failed run resumes on retry: keep the steps that already completed
|
|
4
|
+
* and re-run from the one that actually failed, rather than restarting the whole
|
|
5
|
+
* pipeline from step 0. For `pl_full` (`requirements → spec-writer → architect →
|
|
6
|
+
* researcher → coder → …`) a coder failure otherwise re-runs the human-gated steps
|
|
7
|
+
* before it; resuming skips straight back to `coder`.
|
|
8
|
+
*
|
|
9
|
+
* Pure + deterministic so it can be unit-tested without the service's ports. The
|
|
10
|
+
* caller mints the new instance id and re-drives the durable runner.
|
|
11
|
+
*/
|
|
12
|
+
export declare function planResumedSteps(prev: {
|
|
13
|
+
steps: PipelineStep[];
|
|
14
|
+
currentStep: number;
|
|
15
|
+
}): {
|
|
16
|
+
steps: PipelineStep[];
|
|
17
|
+
currentStep: number;
|
|
18
|
+
};
|
|
19
|
+
/**
|
|
20
|
+
* Plan a user-driven "restart from this step": re-run from the explicitly chosen
|
|
21
|
+
* `fromIndex` regardless of how far the run had progressed (even a fully `done`
|
|
22
|
+
* run), keeping every step before it intact and resetting that step + all later
|
|
23
|
+
* ones to a clean, re-runnable state. Unlike {@link planResumedSteps} the target is
|
|
24
|
+
* the human's pick, not the first failure — so it can rewind past already-completed
|
|
25
|
+
* steps. The preserved earlier steps keep their `output`, so the engine still hands
|
|
26
|
+
* the restarted step its predecessors' work as `priorOutputs` (a useful handoff); a
|
|
27
|
+
* block's incorporated requirements are NOT touched here — they live on the
|
|
28
|
+
* requirement-review record, so a restarted spec-writer/coder still reads them (and
|
|
29
|
+
* restarting AT the requirements-review step itself re-runs the reviewer, which
|
|
30
|
+
* mints a fresh iteration-1 review).
|
|
31
|
+
*
|
|
32
|
+
* Pure + deterministic so it can be unit-tested without the service's ports.
|
|
33
|
+
*/
|
|
34
|
+
export declare function planRestartFromStep(prev: {
|
|
35
|
+
steps: PipelineStep[];
|
|
36
|
+
}, fromIndex: number): {
|
|
37
|
+
steps: PipelineStep[];
|
|
38
|
+
currentStep: number;
|
|
39
|
+
};
|
|
40
|
+
//# sourceMappingURL=retry.logic.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry.logic.d.ts","sourceRoot":"","sources":["../../../src/modules/execution/retry.logic.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAEvD;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE;IAAE,KAAK,EAAE,YAAY,EAAE,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,GAAG;IACtF,KAAK,EAAE,YAAY,EAAE,CAAA;IACrB,WAAW,EAAE,MAAM,CAAA;CACpB,CASA;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,mBAAmB,CACjC,IAAI,EAAE;IAAE,KAAK,EAAE,YAAY,EAAE,CAAA;CAAE,EAC/B,SAAS,EAAE,MAAM,GAChB;IAAE,KAAK,EAAE,YAAY,EAAE,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,CAShD"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Plan how a failed run resumes on retry: keep the steps that already completed
|
|
3
|
+
* and re-run from the one that actually failed, rather than restarting the whole
|
|
4
|
+
* pipeline from step 0. For `pl_full` (`requirements → spec-writer → architect →
|
|
5
|
+
* researcher → coder → …`) a coder failure otherwise re-runs the human-gated steps
|
|
6
|
+
* before it; resuming skips straight back to `coder`.
|
|
7
|
+
*
|
|
8
|
+
* Pure + deterministic so it can be unit-tested without the service's ports. The
|
|
9
|
+
* caller mints the new instance id and re-drives the durable runner.
|
|
10
|
+
*/
|
|
11
|
+
export function planResumedSteps(prev) {
|
|
12
|
+
// Resume at the first step that did not complete. A failed run normally parked
|
|
13
|
+
// on `currentStep`, but deriving it from the `done` states is robust to a stale
|
|
14
|
+
// index and means the steps before it are exactly the ones we preserve.
|
|
15
|
+
const firstUnfinished = prev.steps.findIndex((s) => s.state !== 'done');
|
|
16
|
+
// All steps done (shouldn't happen for a failed run): nothing to resume — re-run
|
|
17
|
+
// the last step so the retry still does something rather than no-op.
|
|
18
|
+
const resumeIndex = firstUnfinished === -1 ? Math.max(prev.steps.length - 1, 0) : firstUnfinished;
|
|
19
|
+
return planFromStep(prev.steps, resumeIndex);
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Plan a user-driven "restart from this step": re-run from the explicitly chosen
|
|
23
|
+
* `fromIndex` regardless of how far the run had progressed (even a fully `done`
|
|
24
|
+
* run), keeping every step before it intact and resetting that step + all later
|
|
25
|
+
* ones to a clean, re-runnable state. Unlike {@link planResumedSteps} the target is
|
|
26
|
+
* the human's pick, not the first failure — so it can rewind past already-completed
|
|
27
|
+
* steps. The preserved earlier steps keep their `output`, so the engine still hands
|
|
28
|
+
* the restarted step its predecessors' work as `priorOutputs` (a useful handoff); a
|
|
29
|
+
* block's incorporated requirements are NOT touched here — they live on the
|
|
30
|
+
* requirement-review record, so a restarted spec-writer/coder still reads them (and
|
|
31
|
+
* restarting AT the requirements-review step itself re-runs the reviewer, which
|
|
32
|
+
* mints a fresh iteration-1 review).
|
|
33
|
+
*
|
|
34
|
+
* Pure + deterministic so it can be unit-tested without the service's ports.
|
|
35
|
+
*/
|
|
36
|
+
export function planRestartFromStep(prev, fromIndex) {
|
|
37
|
+
// Clamp into range so an out-of-bounds index can't strand the run with a
|
|
38
|
+
// `currentStep` past the last step (the service validates first, but the pure fn
|
|
39
|
+
// stays total).
|
|
40
|
+
const resumeIndex = Math.min(Math.max(Math.trunc(fromIndex), 0), Math.max(prev.steps.length - 1, 0));
|
|
41
|
+
return planFromStep(prev.steps, resumeIndex);
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Shared core of {@link planResumedSteps} / {@link planRestartFromStep}: keep the
|
|
45
|
+
* steps before `resumeIndex` exactly as-is (their output/approval/timing are the
|
|
46
|
+
* preserved handoff context) and reset that step + everything after it.
|
|
47
|
+
*/
|
|
48
|
+
function planFromStep(prevSteps, resumeIndex) {
|
|
49
|
+
const steps = prevSteps.map((step, i) => {
|
|
50
|
+
if (i < resumeIndex)
|
|
51
|
+
return step; // completed: preserve output/approval/timing as-is
|
|
52
|
+
return resetStep(step, i === resumeIndex ? 'working' : 'pending');
|
|
53
|
+
});
|
|
54
|
+
return { steps, currentStep: resumeIndex };
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Reset a step to a clean, re-runnable state, dropping every transient field a
|
|
58
|
+
* prior (partial) attempt may have left behind so the fresh run starts from
|
|
59
|
+
* scratch: no in-flight job handle, no stale gate/subtask state, no prior output,
|
|
60
|
+
* fresh timing (`startStep` re-stamps `startedAt`). The structural fields the
|
|
61
|
+
* pipeline defined — `agentKind` and `requiresApproval` — are preserved so the
|
|
62
|
+
* approval gate still fires after the re-run.
|
|
63
|
+
*/
|
|
64
|
+
function resetStep(step, state) {
|
|
65
|
+
return {
|
|
66
|
+
agentKind: step.agentKind,
|
|
67
|
+
state,
|
|
68
|
+
progress: 0,
|
|
69
|
+
gate: null,
|
|
70
|
+
subtasks: undefined,
|
|
71
|
+
decision: null,
|
|
72
|
+
requiresApproval: step.requiresApproval,
|
|
73
|
+
approval: null,
|
|
74
|
+
output: undefined,
|
|
75
|
+
model: undefined,
|
|
76
|
+
selectedFragmentIds: undefined,
|
|
77
|
+
jobId: undefined,
|
|
78
|
+
startedAt: undefined,
|
|
79
|
+
finishedAt: undefined,
|
|
80
|
+
pausedAt: undefined,
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=retry.logic.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry.logic.js","sourceRoot":"","sources":["../../../src/modules/execution/retry.logic.ts"],"names":[],"mappings":"AAEA;;;;;;;;;GASG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAoD;IAInF,+EAA+E;IAC/E,gFAAgF;IAChF,wEAAwE;IACxE,MAAM,eAAe,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,MAAM,CAAC,CAAA;IACvE,iFAAiF;IACjF,qEAAqE;IACrE,MAAM,WAAW,GAAG,eAAe,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,eAAe,CAAA;IACjG,OAAO,YAAY,CAAC,IAAI,CAAC,KAAK,EAAE,WAAW,CAAC,CAAA;AAC9C,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,mBAAmB,CACjC,IAA+B,EAC/B,SAAiB;IAEjB,yEAAyE;IACzE,iFAAiF;IACjF,gBAAgB;IAChB,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAC1B,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,EAClC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,CAAC,CACnC,CAAA;IACD,OAAO,YAAY,CAAC,IAAI,CAAC,KAAK,EAAE,WAAW,CAAC,CAAA;AAC9C,CAAC;AAED;;;;GAIG;AACH,SAAS,YAAY,CACnB,SAAyB,EACzB,WAAmB;IAEnB,MAAM,KAAK,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE;QACtC,IAAI,CAAC,GAAG,WAAW;YAAE,OAAO,IAAI,CAAA,CAAC,mDAAmD;QACpF,OAAO,SAAS,CAAC,IAAI,EAAE,CAAC,KAAK,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAA;IACnE,CAAC,CAAC,CAAA;IACF,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,CAAA;AAC5C,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,SAAS,CAAC,IAAkB,EAAE,KAA4B;IACjE,OAAO;QACL,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,KAAK;QACL,QAAQ,EAAE,CAAC;QACX,IAAI,EAAE,IAAI;QACV,QAAQ,EAAE,SAAS;QACnB,QAAQ,EAAE,IAAI;QACd,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;QACvC,QAAQ,EAAE,IAAI;QACd,MAAM,EAAE,SAAS;QACjB,KAAK,EAAE,SAAS;QAChB,mBAAmB,EAAE,SAAS;QAC9B,KAAK,EAAE,SAAS;QAChB,SAAS,EAAE,SAAS;QACpB,UAAU,EAAE,SAAS;QACrB,QAAQ,EAAE,SAAS;KACpB,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { StepGating, TaskEstimate } from '@cat-factory/kernel';
|
|
2
|
+
/**
|
|
3
|
+
* Decide whether a gated pipeline step should run, given the task estimate and the step's
|
|
4
|
+
* gating config. Mirrors the consensus-gating decision (OR across axes) but yields a plain
|
|
5
|
+
* run/skip:
|
|
6
|
+
*
|
|
7
|
+
* - No gating / gating disabled → run (the step is unconditional).
|
|
8
|
+
* - Gating enabled, estimate present → run iff ANY supplied axis is met or exceeded
|
|
9
|
+
* (risk ≥ minRisk OR impact ≥ minImpact OR complexity ≥ minComplexity). A gating block
|
|
10
|
+
* with no thresholds set never triggers on score → skip.
|
|
11
|
+
* - Gating enabled, estimate absent → `gating.onMissingEstimate` (default `run`, fail-safe
|
|
12
|
+
* to thoroughness).
|
|
13
|
+
*/
|
|
14
|
+
export declare function shouldRunGatedStep(estimate: TaskEstimate | null | undefined, gating: StepGating | null | undefined): boolean;
|
|
15
|
+
//# sourceMappingURL=stepGating.logic.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stepGating.logic.d.ts","sourceRoot":"","sources":["../../../src/modules/execution/stepGating.logic.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAEnE;;;;;;;;;;;GAWG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,YAAY,GAAG,IAAI,GAAG,SAAS,EACzC,MAAM,EAAE,UAAU,GAAG,IAAI,GAAG,SAAS,GACpC,OAAO,CAYT"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Decide whether a gated pipeline step should run, given the task estimate and the step's
|
|
3
|
+
* gating config. Mirrors the consensus-gating decision (OR across axes) but yields a plain
|
|
4
|
+
* run/skip:
|
|
5
|
+
*
|
|
6
|
+
* - No gating / gating disabled → run (the step is unconditional).
|
|
7
|
+
* - Gating enabled, estimate present → run iff ANY supplied axis is met or exceeded
|
|
8
|
+
* (risk ≥ minRisk OR impact ≥ minImpact OR complexity ≥ minComplexity). A gating block
|
|
9
|
+
* with no thresholds set never triggers on score → skip.
|
|
10
|
+
* - Gating enabled, estimate absent → `gating.onMissingEstimate` (default `run`, fail-safe
|
|
11
|
+
* to thoroughness).
|
|
12
|
+
*/
|
|
13
|
+
export function shouldRunGatedStep(estimate, gating) {
|
|
14
|
+
if (!gating || !gating.enabled)
|
|
15
|
+
return true;
|
|
16
|
+
if (!estimate)
|
|
17
|
+
return (gating.onMissingEstimate ?? 'run') === 'run';
|
|
18
|
+
const axes = [
|
|
19
|
+
[gating.minComplexity, estimate.complexity],
|
|
20
|
+
[gating.minRisk, estimate.risk],
|
|
21
|
+
[gating.minImpact, estimate.impact],
|
|
22
|
+
];
|
|
23
|
+
for (const [threshold, value] of axes) {
|
|
24
|
+
if (threshold !== undefined && value >= threshold)
|
|
25
|
+
return true;
|
|
26
|
+
}
|
|
27
|
+
return false;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=stepGating.logic.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stepGating.logic.js","sourceRoot":"","sources":["../../../src/modules/execution/stepGating.logic.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,kBAAkB,CAChC,QAAyC,EACzC,MAAqC;IAErC,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO;QAAE,OAAO,IAAI,CAAA;IAC3C,IAAI,CAAC,QAAQ;QAAE,OAAO,CAAC,MAAM,CAAC,iBAAiB,IAAI,KAAK,CAAC,KAAK,KAAK,CAAA;IACnE,MAAM,IAAI,GAAwC;QAChD,CAAC,MAAM,CAAC,aAAa,EAAE,QAAQ,CAAC,UAAU,CAAC;QAC3C,CAAC,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,IAAI,CAAC;QAC/B,CAAC,MAAM,CAAC,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC;KACpC,CAAA;IACD,KAAK,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC;QACtC,IAAI,SAAS,KAAK,SAAS,IAAI,KAAK,IAAI,SAAS;YAAE,OAAO,IAAI,CAAA;IAChE,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import type { AgentRunResult, ExecutionInstance, PipelineStep } from '@cat-factory/kernel';
|
|
2
|
+
/** Context handed to a step-completion resolver after its step's agent finished. */
|
|
3
|
+
export interface StepResolverContext {
|
|
4
|
+
workspaceId: string;
|
|
5
|
+
instance: ExecutionInstance;
|
|
6
|
+
step: PipelineStep;
|
|
7
|
+
/** The finished agent's structured result (the resolver acts on it mechanically). */
|
|
8
|
+
result: AgentRunResult;
|
|
9
|
+
/** Whether this step is the pipeline's last (resolvers rarely need it). */
|
|
10
|
+
isFinalStep: boolean;
|
|
11
|
+
}
|
|
12
|
+
/** The outcome of a post-completion resolver. */
|
|
13
|
+
export interface StepResolution {
|
|
14
|
+
/** Replacement step output (e.g. a human-readable merge summary). */
|
|
15
|
+
output?: string;
|
|
16
|
+
/**
|
|
17
|
+
* Set when the resolver has already decided the block's TERMINAL status itself (the
|
|
18
|
+
* merger flips the block to `done` on a real merge or `pr_ready` on a review). The
|
|
19
|
+
* engine's `finalizeBlock` then only backstops a block the resolver left untouched.
|
|
20
|
+
*/
|
|
21
|
+
ownsTerminalStatus?: boolean;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Deterministic backend logic run after an agent step completes, keyed by `agentKind`.
|
|
25
|
+
* Registered in {@link ExecutionService} (see `buildStepResolverRegistry`); the engine
|
|
26
|
+
* runs the matching resolver in `recordStepResult` once the step's agent has finished,
|
|
27
|
+
* regardless of the step's position in the pipeline.
|
|
28
|
+
*/
|
|
29
|
+
export interface StepCompletionResolver {
|
|
30
|
+
/** Matches the step's `agentKind` (e.g. `merger`). */
|
|
31
|
+
kind: string;
|
|
32
|
+
/**
|
|
33
|
+
* Whether this resolver applies to the finished step's result — lets a resolver no-op
|
|
34
|
+
* when its agent produced nothing to act on (e.g. the merger returned no assessment).
|
|
35
|
+
* Defaults to always-applies when omitted.
|
|
36
|
+
*/
|
|
37
|
+
applies?(result: AgentRunResult): boolean;
|
|
38
|
+
/** Run the mechanical post-completion logic. */
|
|
39
|
+
resolve(ctx: StepResolverContext): Promise<StepResolution | void>;
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=stepResolvers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stepResolvers.d.ts","sourceRoot":"","sources":["../../../src/modules/execution/stepResolvers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAqB1F,oFAAoF;AACpF,MAAM,WAAW,mBAAmB;IAClC,WAAW,EAAE,MAAM,CAAA;IACnB,QAAQ,EAAE,iBAAiB,CAAA;IAC3B,IAAI,EAAE,YAAY,CAAA;IAClB,qFAAqF;IACrF,MAAM,EAAE,cAAc,CAAA;IACtB,2EAA2E;IAC3E,WAAW,EAAE,OAAO,CAAA;CACrB;AAED,iDAAiD;AACjD,MAAM,WAAW,cAAc;IAC7B,qEAAqE;IACrE,MAAM,CAAC,EAAE,MAAM,CAAA;IACf;;;;OAIG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAA;CAC7B;AAED;;;;;GAKG;AACH,MAAM,WAAW,sBAAsB;IACrC,sDAAsD;IACtD,IAAI,EAAE,MAAM,CAAA;IACZ;;;;OAIG;IACH,OAAO,CAAC,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAA;IACzC,gDAAgD;IAChD,OAAO,CAAC,GAAG,EAAE,mBAAmB,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAAA;CAClE"}
|