@qodo/sdk 0.7.0 → 0.8.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/.claude/skills/qodo-agent/SKILL.md +233 -3
- package/.claude/skills/qodo-agent/assets/programmatic-agent.ts +74 -1
- package/.claude/skills/qodo-agent/references/common-issues.md +79 -0
- package/dist/api/agent.d.ts.map +1 -1
- package/dist/api/agent.js +13 -8
- package/dist/api/agent.js.map +1 -1
- package/dist/api/http.d.ts.map +1 -1
- package/dist/api/http.js +5 -2
- package/dist/api/http.js.map +1 -1
- package/dist/api/websocket.d.ts.map +1 -1
- package/dist/api/websocket.js +6 -3
- package/dist/api/websocket.js.map +1 -1
- package/dist/auth/index.d.ts +18 -0
- package/dist/auth/index.d.ts.map +1 -1
- package/dist/auth/index.js +69 -10
- package/dist/auth/index.js.map +1 -1
- package/dist/context/messageManager.d.ts +1 -1
- package/dist/context/messageManager.d.ts.map +1 -1
- package/dist/context/messageManager.js +1 -1
- package/dist/context/messageManager.js.map +1 -1
- package/dist/index.d.ts +21 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +18 -1
- package/dist/index.js.map +1 -1
- package/dist/mcp/MCPManager.js +2 -2
- package/dist/mcp/MCPManager.js.map +1 -1
- package/dist/mcp/baseServer.js +1 -1
- package/dist/mcp/baseServer.js.map +1 -1
- package/dist/mcp/servers/ripgrep.d.ts.map +1 -1
- package/dist/mcp/servers/ripgrep.js +6 -2
- package/dist/mcp/servers/ripgrep.js.map +1 -1
- package/dist/mcp/servers/shell.js +1 -1
- package/dist/mcp/servers/shell.js.map +1 -1
- package/dist/mcp/serversRegistry.d.ts.map +1 -1
- package/dist/mcp/serversRegistry.js +7 -1
- package/dist/mcp/serversRegistry.js.map +1 -1
- package/dist/mcp/toolProcessor.d.ts +44 -4
- package/dist/mcp/toolProcessor.d.ts.map +1 -1
- package/dist/mcp/toolProcessor.js +255 -20
- package/dist/mcp/toolProcessor.js.map +1 -1
- package/dist/messages/index.d.ts +8 -0
- package/dist/messages/index.d.ts.map +1 -0
- package/dist/messages/index.js +7 -0
- package/dist/messages/index.js.map +1 -0
- package/dist/messages/openai.d.ts +26 -0
- package/dist/messages/openai.d.ts.map +1 -0
- package/dist/messages/openai.js +55 -0
- package/dist/messages/openai.js.map +1 -0
- package/dist/messages/types.d.ts +73 -0
- package/dist/messages/types.d.ts.map +1 -0
- package/dist/messages/types.js +78 -0
- package/dist/messages/types.js.map +1 -0
- package/dist/parser/index.js +3 -3
- package/dist/parser/index.js.map +1 -1
- package/dist/sdk/QodoSDK.d.ts +30 -10
- package/dist/sdk/QodoSDK.d.ts.map +1 -1
- package/dist/sdk/QodoSDK.js +165 -33
- package/dist/sdk/QodoSDK.js.map +1 -1
- package/dist/sdk/artifacts.d.ts +156 -0
- package/dist/sdk/artifacts.d.ts.map +1 -0
- package/dist/sdk/artifacts.js +166 -0
- package/dist/sdk/artifacts.js.map +1 -0
- package/dist/sdk/bootstrap.d.ts.map +1 -1
- package/dist/sdk/bootstrap.js +11 -4
- package/dist/sdk/bootstrap.js.map +1 -1
- package/dist/sdk/discovery.js +1 -1
- package/dist/sdk/discovery.js.map +1 -1
- package/dist/sdk/events.d.ts +46 -1
- package/dist/sdk/events.d.ts.map +1 -1
- package/dist/sdk/events.js +6 -0
- package/dist/sdk/events.js.map +1 -1
- package/dist/sdk/middleware.d.ts +59 -0
- package/dist/sdk/middleware.d.ts.map +1 -0
- package/dist/sdk/middleware.js +69 -0
- package/dist/sdk/middleware.js.map +1 -0
- package/dist/sdk/pipeline/PipelineBuilder.d.ts +61 -0
- package/dist/sdk/pipeline/PipelineBuilder.d.ts.map +1 -0
- package/dist/sdk/pipeline/PipelineBuilder.js +91 -0
- package/dist/sdk/pipeline/PipelineBuilder.js.map +1 -0
- package/dist/sdk/pipeline/PipelineRunner.d.ts +28 -0
- package/dist/sdk/pipeline/PipelineRunner.d.ts.map +1 -0
- package/dist/sdk/pipeline/PipelineRunner.js +210 -0
- package/dist/sdk/pipeline/PipelineRunner.js.map +1 -0
- package/dist/sdk/pipeline/compiler.d.ts +24 -0
- package/dist/sdk/pipeline/compiler.d.ts.map +1 -0
- package/dist/sdk/pipeline/compiler.js +197 -0
- package/dist/sdk/pipeline/compiler.js.map +1 -0
- package/dist/sdk/pipeline/declarative.d.ts +34 -0
- package/dist/sdk/pipeline/declarative.d.ts.map +1 -0
- package/dist/sdk/pipeline/declarative.js +9 -0
- package/dist/sdk/pipeline/declarative.js.map +1 -0
- package/dist/sdk/pipeline/index.d.ts +20 -0
- package/dist/sdk/pipeline/index.d.ts.map +1 -0
- package/dist/sdk/pipeline/index.js +19 -0
- package/dist/sdk/pipeline/index.js.map +1 -0
- package/dist/sdk/pipeline/types.d.ts +75 -0
- package/dist/sdk/pipeline/types.d.ts.map +1 -0
- package/dist/sdk/pipeline/types.js +10 -0
- package/dist/sdk/pipeline/types.js.map +1 -0
- package/dist/sdk/policies.d.ts +163 -0
- package/dist/sdk/policies.d.ts.map +1 -0
- package/dist/sdk/policies.js +243 -0
- package/dist/sdk/policies.js.map +1 -0
- package/dist/sdk/runner/AgentRunner.js +5 -5
- package/dist/sdk/runner/AgentRunner.js.map +1 -1
- package/dist/sdk/runner/finalize.d.ts +47 -0
- package/dist/sdk/runner/finalize.d.ts.map +1 -1
- package/dist/sdk/runner/finalize.js +42 -2
- package/dist/sdk/runner/finalize.js.map +1 -1
- package/dist/sdk/runner/formats.d.ts +1 -1
- package/dist/sdk/runner/formats.d.ts.map +1 -1
- package/dist/sdk/runner/formats.js +22 -37
- package/dist/sdk/runner/formats.js.map +1 -1
- package/dist/sdk/runner/progress.d.ts +1 -1
- package/dist/sdk/runner/progress.d.ts.map +1 -1
- package/dist/sdk/runner/progress.js +1 -1
- package/dist/sdk/runner/progress.js.map +1 -1
- package/dist/session/SessionContext.d.ts +1 -0
- package/dist/session/SessionContext.d.ts.map +1 -1
- package/dist/session/SessionContext.js +3 -0
- package/dist/session/SessionContext.js.map +1 -1
- package/dist/session/environment.d.ts +16 -6
- package/dist/session/environment.d.ts.map +1 -1
- package/dist/session/environment.js.map +1 -1
- package/dist/session/serverData.d.ts.map +1 -1
- package/dist/session/serverData.js +21 -3
- package/dist/session/serverData.js.map +1 -1
- package/dist/tracing/PipelineTracer.d.ts +37 -0
- package/dist/tracing/PipelineTracer.d.ts.map +1 -0
- package/dist/tracing/PipelineTracer.js +64 -0
- package/dist/tracing/PipelineTracer.js.map +1 -0
- package/dist/tracing/SdkTracer.d.ts +91 -0
- package/dist/tracing/SdkTracer.d.ts.map +1 -0
- package/dist/tracing/SdkTracer.js +243 -0
- package/dist/tracing/SdkTracer.js.map +1 -0
- package/dist/tracing/index.d.ts +6 -0
- package/dist/tracing/index.d.ts.map +1 -0
- package/dist/tracing/index.js +3 -0
- package/dist/tracing/index.js.map +1 -0
- package/dist/tracing/pipelineHelpers.d.ts +20 -0
- package/dist/tracing/pipelineHelpers.d.ts.map +1 -0
- package/dist/tracing/pipelineHelpers.js +140 -0
- package/dist/tracing/pipelineHelpers.js.map +1 -0
- package/dist/tracing/types.d.ts +46 -0
- package/dist/tracing/types.d.ts.map +1 -0
- package/dist/tracing/types.js +9 -0
- package/dist/tracing/types.js.map +1 -0
- package/package.json +10 -7
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fluent builder for constructing typed pipelines.
|
|
3
|
+
*
|
|
4
|
+
* Usage:
|
|
5
|
+
* const pipeline = sdkPipeline<{ repo: string }>()
|
|
6
|
+
* .step('lint', async ({ state, run }) => {
|
|
7
|
+
* const result = await run('lint', { args: { path: state.repo } });
|
|
8
|
+
* return { lintOutput: result.result.final_output };
|
|
9
|
+
* })
|
|
10
|
+
* .step('review', async ({ state, run }) => {
|
|
11
|
+
* const result = await run('review', { extraInstructions: state.lintOutput });
|
|
12
|
+
* return { reviewOutput: result.result.final_output };
|
|
13
|
+
* })
|
|
14
|
+
* .build();
|
|
15
|
+
*/
|
|
16
|
+
import type { PipelineEntry, StepFn, GateFn, ErrorStrategy } from './types.js';
|
|
17
|
+
export interface StepOptions<TState, TOut> {
|
|
18
|
+
/** Skip this step when the gate returns false. */
|
|
19
|
+
gate?: GateFn<TState>;
|
|
20
|
+
/** Error recovery strategy (default: 'throw'). */
|
|
21
|
+
onError?: ErrorStrategy<TState, TOut>;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Immutable pipeline builder that tracks accumulated state type TState.
|
|
25
|
+
*
|
|
26
|
+
* Each .step() call produces a new builder whose TState is the intersection
|
|
27
|
+
* of the previous state and the step's output type. This gives full type
|
|
28
|
+
* inference through the chain without explicit generics at each step.
|
|
29
|
+
*/
|
|
30
|
+
export declare class PipelineBuilder<TState extends Record<string, any>, TInit extends Record<string, any> = TState> {
|
|
31
|
+
constructor(entries?: PipelineEntry<TState>[]);
|
|
32
|
+
/**
|
|
33
|
+
* Add a sequential step to the pipeline.
|
|
34
|
+
*
|
|
35
|
+
* The step function receives the accumulated state and must return an
|
|
36
|
+
* object whose keys are merged into the state for subsequent steps.
|
|
37
|
+
*/
|
|
38
|
+
step<TOut extends Record<string, any>>(name: string, fn: StepFn<TState, TOut>, options?: StepOptions<TState, TOut>): PipelineBuilder<TState & TOut, TInit>;
|
|
39
|
+
/**
|
|
40
|
+
* Add a group of steps that execute in parallel.
|
|
41
|
+
*
|
|
42
|
+
* All steps in the group receive the same snapshot of state. Their
|
|
43
|
+
* outputs are merged (Object.assign order matches declaration order).
|
|
44
|
+
*/
|
|
45
|
+
parallel<TOut extends Record<string, any>>(steps: Array<{
|
|
46
|
+
name: string;
|
|
47
|
+
fn: StepFn<TState, TOut>;
|
|
48
|
+
gate?: GateFn<TState>;
|
|
49
|
+
onError?: ErrorStrategy<TState, TOut>;
|
|
50
|
+
}>): PipelineBuilder<TState & TOut, TInit>;
|
|
51
|
+
/**
|
|
52
|
+
* Finalize the pipeline definition.
|
|
53
|
+
*
|
|
54
|
+
* Returns the frozen list of entries for the runner to execute.
|
|
55
|
+
*/
|
|
56
|
+
build(): Pipeline<TState, TInit>;
|
|
57
|
+
}
|
|
58
|
+
export declare class Pipeline<TState extends Record<string, any>, TInit extends Record<string, any> = TState> {
|
|
59
|
+
constructor(entries: readonly PipelineEntry<TState>[]);
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=PipelineBuilder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PipelineBuilder.d.ts","sourceRoot":"","sources":["../../../src/sdk/pipeline/PipelineBuilder.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAGV,aAAa,EACb,MAAM,EACN,MAAM,EACN,aAAa,EACd,MAAM,YAAY,CAAC;AAMpB,MAAM,WAAW,WAAW,CAAC,MAAM,EAAE,IAAI;IACvC,kDAAkD;IAClD,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IAEtB,kDAAkD;IAClD,OAAO,CAAC,EAAE,aAAa,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;CACvC;AAMD;;;;;;GAMG;AACH,qBAAa,eAAe,CAAC,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,MAAM;gBAI7F,OAAO,GAAE,aAAa,CAAC,MAAM,CAAC,EAAO;IAIjD;;;;;OAKG;IACH,IAAI,CAAC,IAAI,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACnC,IAAI,EAAE,MAAM,EACZ,EAAE,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,EACxB,OAAO,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,IAAI,CAAC,GAClC,eAAe,CAAC,MAAM,GAAG,IAAI,EAAE,KAAK,CAAC;IAcxC;;;;;OAKG;IACH,QAAQ,CAAC,IAAI,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACvC,KAAK,EAAE,KAAK,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,EAAE,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QACzB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;QACtB,OAAO,CAAC,EAAE,aAAa,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;KACvC,CAAC,GACD,eAAe,CAAC,MAAM,GAAG,IAAI,EAAE,KAAK,CAAC;IAgBxC;;;;OAIG;IACH,KAAK,IAAI,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAC;CAGjC;AAMD,qBAAa,QAAQ,CAAC,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,MAAM;gBAItF,OAAO,EAAE,SAAS,aAAa,CAAC,MAAM,CAAC,EAAE;CAGtD"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fluent builder for constructing typed pipelines.
|
|
3
|
+
*
|
|
4
|
+
* Usage:
|
|
5
|
+
* const pipeline = sdkPipeline<{ repo: string }>()
|
|
6
|
+
* .step('lint', async ({ state, run }) => {
|
|
7
|
+
* const result = await run('lint', { args: { path: state.repo } });
|
|
8
|
+
* return { lintOutput: result.result.final_output };
|
|
9
|
+
* })
|
|
10
|
+
* .step('review', async ({ state, run }) => {
|
|
11
|
+
* const result = await run('review', { extraInstructions: state.lintOutput });
|
|
12
|
+
* return { reviewOutput: result.result.final_output };
|
|
13
|
+
* })
|
|
14
|
+
* .build();
|
|
15
|
+
*/
|
|
16
|
+
// ---------------------------------------------------------------------------
|
|
17
|
+
// Builder
|
|
18
|
+
// ---------------------------------------------------------------------------
|
|
19
|
+
/**
|
|
20
|
+
* Immutable pipeline builder that tracks accumulated state type TState.
|
|
21
|
+
*
|
|
22
|
+
* Each .step() call produces a new builder whose TState is the intersection
|
|
23
|
+
* of the previous state and the step's output type. This gives full type
|
|
24
|
+
* inference through the chain without explicit generics at each step.
|
|
25
|
+
*/
|
|
26
|
+
export class PipelineBuilder {
|
|
27
|
+
/** @internal */
|
|
28
|
+
_entries;
|
|
29
|
+
constructor(entries = []) {
|
|
30
|
+
this._entries = entries;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Add a sequential step to the pipeline.
|
|
34
|
+
*
|
|
35
|
+
* The step function receives the accumulated state and must return an
|
|
36
|
+
* object whose keys are merged into the state for subsequent steps.
|
|
37
|
+
*/
|
|
38
|
+
step(name, fn, options) {
|
|
39
|
+
const entry = {
|
|
40
|
+
name,
|
|
41
|
+
fn,
|
|
42
|
+
gate: options?.gate,
|
|
43
|
+
onError: options?.onError ?? 'throw',
|
|
44
|
+
};
|
|
45
|
+
// Cast is safe: we widen TState to TState & TOut going forward
|
|
46
|
+
return new PipelineBuilder([
|
|
47
|
+
...this._entries,
|
|
48
|
+
entry,
|
|
49
|
+
]);
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Add a group of steps that execute in parallel.
|
|
53
|
+
*
|
|
54
|
+
* All steps in the group receive the same snapshot of state. Their
|
|
55
|
+
* outputs are merged (Object.assign order matches declaration order).
|
|
56
|
+
*/
|
|
57
|
+
parallel(steps) {
|
|
58
|
+
const group = {
|
|
59
|
+
kind: 'parallel',
|
|
60
|
+
steps: steps.map((s) => ({
|
|
61
|
+
name: s.name,
|
|
62
|
+
fn: s.fn,
|
|
63
|
+
gate: s.gate,
|
|
64
|
+
onError: s.onError ?? 'throw',
|
|
65
|
+
})),
|
|
66
|
+
};
|
|
67
|
+
return new PipelineBuilder([
|
|
68
|
+
...this._entries,
|
|
69
|
+
group,
|
|
70
|
+
]);
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Finalize the pipeline definition.
|
|
74
|
+
*
|
|
75
|
+
* Returns the frozen list of entries for the runner to execute.
|
|
76
|
+
*/
|
|
77
|
+
build() {
|
|
78
|
+
return new Pipeline(Object.freeze([...this._entries]));
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
// ---------------------------------------------------------------------------
|
|
82
|
+
// Pipeline (frozen, executable definition)
|
|
83
|
+
// ---------------------------------------------------------------------------
|
|
84
|
+
export class Pipeline {
|
|
85
|
+
/** @internal */
|
|
86
|
+
entries;
|
|
87
|
+
constructor(entries) {
|
|
88
|
+
this.entries = entries;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=PipelineBuilder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PipelineBuilder.js","sourceRoot":"","sources":["../../../src/sdk/pipeline/PipelineBuilder.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAuBH,8EAA8E;AAC9E,UAAU;AACV,8EAA8E;AAE9E;;;;;;GAMG;AACH,MAAM,OAAO,eAAe;IAC1B,gBAAgB;IACP,QAAQ,CAA0B;IAE3C,YAAY,UAAmC,EAAE;QAC/C,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;IAC1B,CAAC;IAED;;;;;OAKG;IACH,IAAI,CACF,IAAY,EACZ,EAAwB,EACxB,OAAmC;QAEnC,MAAM,KAAK,GAA+B;YACxC,IAAI;YACJ,EAAE;YACF,IAAI,EAAE,OAAO,EAAE,IAAI;YACnB,OAAO,EAAE,OAAO,EAAE,OAAO,IAAI,OAAO;SACrC,CAAC;QACF,+DAA+D;QAC/D,OAAO,IAAI,eAAe,CAAuB;YAC/C,GAAG,IAAI,CAAC,QAAiB;YACzB,KAAK;SACN,CAAC,CAAC;IACL,CAAC;IAED;;;;;OAKG;IACH,QAAQ,CACN,KAKE;QAEF,MAAM,KAAK,GAA0B;YACnC,IAAI,EAAE,UAAU;YAChB,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBACvB,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,EAAE,EAAE,CAAC,CAAC,EAAyB;gBAC/B,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,OAAO,EAAE,CAAC,CAAC,OAAO,IAAI,OAAO;aAC9B,CAAC,CAAC;SACJ,CAAC;QACF,OAAO,IAAI,eAAe,CAAuB;YAC/C,GAAG,IAAI,CAAC,QAAiB;YACzB,KAAK;SACN,CAAC,CAAC;IACL,CAAC;IAED;;;;OAIG;IACH,KAAK;QACH,OAAO,IAAI,QAAQ,CAAgB,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,CAA4B,CAAC,CAAC;IACnG,CAAC;CACF;AAED,8EAA8E;AAC9E,2CAA2C;AAC3C,8EAA8E;AAE9E,MAAM,OAAO,QAAQ;IACnB,gBAAgB;IACP,OAAO,CAAmC;IAEnD,YAAY,OAAyC;QACnD,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;CACF"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Executes a Pipeline definition against a QodoSDK instance.
|
|
3
|
+
*
|
|
4
|
+
* The runner is intentionally decoupled from the builder so that a single
|
|
5
|
+
* pipeline definition can be executed multiple times with different SDK
|
|
6
|
+
* instances and initial states.
|
|
7
|
+
*/
|
|
8
|
+
import type { QodoSDK } from '../QodoSDK.js';
|
|
9
|
+
import type { Pipeline } from './PipelineBuilder.js';
|
|
10
|
+
import type { PipelineResult } from './types.js';
|
|
11
|
+
import type { QodoSdkEvent } from '../events.js';
|
|
12
|
+
export declare class PipelineExecutionError extends Error {
|
|
13
|
+
readonly stepName: string;
|
|
14
|
+
readonly cause?: Error | undefined;
|
|
15
|
+
constructor(message: string, stepName: string, cause?: Error | undefined);
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Callback type for pipeline event notifications.
|
|
19
|
+
*/
|
|
20
|
+
export interface PipelineEventCallback {
|
|
21
|
+
(event: QodoSdkEvent): void;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Execute a pipeline with the given SDK instance and initial state.
|
|
25
|
+
* Optionally accepts an event callback to receive pipeline execution events.
|
|
26
|
+
*/
|
|
27
|
+
export declare function runPipeline<TState extends Record<string, any>, TInit extends Record<string, any> = TState>(sdk: QodoSDK, pipeline: Pipeline<TState, TInit>, initialState: TInit, onEvent?: PipelineEventCallback): Promise<PipelineResult<TState>>;
|
|
28
|
+
//# sourceMappingURL=PipelineRunner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PipelineRunner.d.ts","sourceRoot":"","sources":["../../../src/sdk/pipeline/PipelineRunner.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAuC,MAAM,eAAe,CAAC;AAClF,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,KAAK,EAIV,cAAc,EAGf,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAGjD,qBAAa,sBAAuB,SAAQ,KAAK;aAG7B,QAAQ,EAAE,MAAM;aAChB,KAAK,CAAC,EAAE,KAAK;gBAF7B,OAAO,EAAE,MAAM,EACC,QAAQ,EAAE,MAAM,EAChB,KAAK,CAAC,EAAE,KAAK,YAAA;CAKhC;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI,CAAC;CAC7B;AAED;;;GAGG;AACH,wBAAsB,WAAW,CAAC,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,MAAM,EAC9G,GAAG,EAAE,OAAO,EACZ,QAAQ,EAAE,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAC,EACjC,YAAY,EAAE,KAAK,EACnB,OAAO,CAAC,EAAE,qBAAqB,GAC9B,OAAO,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAyDjC"}
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Executes a Pipeline definition against a QodoSDK instance.
|
|
3
|
+
*
|
|
4
|
+
* The runner is intentionally decoupled from the builder so that a single
|
|
5
|
+
* pipeline definition can be executed multiple times with different SDK
|
|
6
|
+
* instances and initial states.
|
|
7
|
+
*/
|
|
8
|
+
import { SdkEventType, SDK_PROTOCOL_V2 } from '../events.js';
|
|
9
|
+
export class PipelineExecutionError extends Error {
|
|
10
|
+
stepName;
|
|
11
|
+
cause;
|
|
12
|
+
constructor(message, stepName, cause) {
|
|
13
|
+
super(message);
|
|
14
|
+
this.stepName = stepName;
|
|
15
|
+
this.cause = cause;
|
|
16
|
+
this.name = 'PipelineExecutionError';
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Execute a pipeline with the given SDK instance and initial state.
|
|
21
|
+
* Optionally accepts an event callback to receive pipeline execution events.
|
|
22
|
+
*/
|
|
23
|
+
export async function runPipeline(sdk, pipeline, initialState, onEvent) {
|
|
24
|
+
const pipelineStart = Date.now();
|
|
25
|
+
// State starts as TInit and accumulates step outputs to become TState at runtime
|
|
26
|
+
let state = { ...initialState };
|
|
27
|
+
const stepLogs = [];
|
|
28
|
+
let seq = 0;
|
|
29
|
+
const runId = `pipeline-${Date.now()}`;
|
|
30
|
+
// Collect all step names for the started event.
|
|
31
|
+
const allStepNames = collectStepNames(pipeline);
|
|
32
|
+
emitEvent(onEvent, runId, seq++, SdkEventType.PipelineStarted, {
|
|
33
|
+
entry_count: pipeline.entries.length,
|
|
34
|
+
step_names: allStepNames,
|
|
35
|
+
});
|
|
36
|
+
try {
|
|
37
|
+
for (const entry of pipeline.entries) {
|
|
38
|
+
if (isParallelGroup(entry)) {
|
|
39
|
+
const { newState, logs, nextSeq } = await executeParallelGroup(sdk, entry, state, onEvent, runId, seq);
|
|
40
|
+
seq = nextSeq;
|
|
41
|
+
state = { ...state, ...newState };
|
|
42
|
+
stepLogs.push(...logs);
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
const { newState, log, nextSeq } = await executeStep(sdk, entry, state, false, onEvent, runId, seq);
|
|
46
|
+
seq = nextSeq;
|
|
47
|
+
state = { ...state, ...newState };
|
|
48
|
+
stepLogs.push(log);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
const completed = stepLogs.filter((s) => s.status === 'completed').length;
|
|
52
|
+
const skipped = stepLogs.filter((s) => s.status === 'skipped').length;
|
|
53
|
+
emitEvent(onEvent, runId, seq++, SdkEventType.PipelineCompleted, {
|
|
54
|
+
duration_ms: Date.now() - pipelineStart,
|
|
55
|
+
steps_completed: completed,
|
|
56
|
+
steps_skipped: skipped,
|
|
57
|
+
});
|
|
58
|
+
return { state, steps: stepLogs };
|
|
59
|
+
}
|
|
60
|
+
catch (err) {
|
|
61
|
+
const error = err instanceof Error ? err : new Error(String(err));
|
|
62
|
+
const stepName = err instanceof PipelineExecutionError ? err.stepName : 'unknown';
|
|
63
|
+
emitEvent(onEvent, runId, seq++, SdkEventType.PipelineError, {
|
|
64
|
+
step_name: stepName,
|
|
65
|
+
message: error.message,
|
|
66
|
+
cause: err instanceof PipelineExecutionError ? err.cause : undefined,
|
|
67
|
+
});
|
|
68
|
+
throw err;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
// ---------------------------------------------------------------------------
|
|
72
|
+
// Internal helpers
|
|
73
|
+
// ---------------------------------------------------------------------------
|
|
74
|
+
function isParallelGroup(entry) {
|
|
75
|
+
return entry.kind === 'parallel';
|
|
76
|
+
}
|
|
77
|
+
function collectStepNames(pipeline) {
|
|
78
|
+
const names = [];
|
|
79
|
+
for (const entry of pipeline.entries) {
|
|
80
|
+
if (isParallelGroup(entry)) {
|
|
81
|
+
for (const step of entry.steps) {
|
|
82
|
+
names.push(step.name);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
names.push(entry.name);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
return names;
|
|
90
|
+
}
|
|
91
|
+
function emitEvent(onEvent, runId, seq, type, data) {
|
|
92
|
+
if (!onEvent)
|
|
93
|
+
return;
|
|
94
|
+
onEvent({
|
|
95
|
+
protocol: SDK_PROTOCOL_V2,
|
|
96
|
+
type,
|
|
97
|
+
timestamp: Date.now(),
|
|
98
|
+
seq,
|
|
99
|
+
run_id: runId,
|
|
100
|
+
session_id: '',
|
|
101
|
+
data,
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
async function executeStep(sdk, step, state, parallel, onEvent, runId, seq) {
|
|
105
|
+
const start = Date.now();
|
|
106
|
+
// Evaluate gate
|
|
107
|
+
if (step.gate) {
|
|
108
|
+
let pass;
|
|
109
|
+
try {
|
|
110
|
+
pass = await step.gate(state);
|
|
111
|
+
}
|
|
112
|
+
catch {
|
|
113
|
+
pass = false;
|
|
114
|
+
}
|
|
115
|
+
emitEvent(onEvent, runId, seq++, SdkEventType.PipelineGateEvaluated, {
|
|
116
|
+
step_name: step.name,
|
|
117
|
+
passed: pass,
|
|
118
|
+
});
|
|
119
|
+
if (!pass) {
|
|
120
|
+
const log = { name: step.name, status: 'skipped', durationMs: Date.now() - start };
|
|
121
|
+
emitEvent(onEvent, runId, seq++, SdkEventType.PipelineStepCompleted, {
|
|
122
|
+
step_name: step.name,
|
|
123
|
+
status: 'skipped',
|
|
124
|
+
duration_ms: log.durationMs,
|
|
125
|
+
});
|
|
126
|
+
return { newState: {}, log, nextSeq: seq };
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
emitEvent(onEvent, runId, seq++, SdkEventType.PipelineStepStarted, {
|
|
130
|
+
step_name: step.name,
|
|
131
|
+
parallel,
|
|
132
|
+
});
|
|
133
|
+
// Build step context
|
|
134
|
+
const ctx = {
|
|
135
|
+
state,
|
|
136
|
+
run: (commandOrPrompt, options) => {
|
|
137
|
+
return sdk.run(commandOrPrompt, options);
|
|
138
|
+
},
|
|
139
|
+
stepName: step.name,
|
|
140
|
+
};
|
|
141
|
+
try {
|
|
142
|
+
const output = await step.fn(ctx);
|
|
143
|
+
const log = { name: step.name, status: 'completed', durationMs: Date.now() - start };
|
|
144
|
+
emitEvent(onEvent, runId, seq++, SdkEventType.PipelineStepCompleted, {
|
|
145
|
+
step_name: step.name,
|
|
146
|
+
status: 'completed',
|
|
147
|
+
duration_ms: log.durationMs,
|
|
148
|
+
});
|
|
149
|
+
return { newState: output ?? {}, log, nextSeq: seq };
|
|
150
|
+
}
|
|
151
|
+
catch (err) {
|
|
152
|
+
const error = err instanceof Error ? err : new Error(String(err));
|
|
153
|
+
if (step.onError === 'skip') {
|
|
154
|
+
const log = {
|
|
155
|
+
name: step.name,
|
|
156
|
+
status: 'skipped',
|
|
157
|
+
durationMs: Date.now() - start,
|
|
158
|
+
error: error.message,
|
|
159
|
+
};
|
|
160
|
+
emitEvent(onEvent, runId, seq++, SdkEventType.PipelineStepCompleted, {
|
|
161
|
+
step_name: step.name,
|
|
162
|
+
status: 'skipped',
|
|
163
|
+
duration_ms: log.durationMs,
|
|
164
|
+
error: error.message,
|
|
165
|
+
});
|
|
166
|
+
return { newState: {}, log, nextSeq: seq };
|
|
167
|
+
}
|
|
168
|
+
if (typeof step.onError === 'function') {
|
|
169
|
+
try {
|
|
170
|
+
const recovered = await step.onError(error, state);
|
|
171
|
+
const log = { name: step.name, status: 'completed', durationMs: Date.now() - start };
|
|
172
|
+
emitEvent(onEvent, runId, seq++, SdkEventType.PipelineStepCompleted, {
|
|
173
|
+
step_name: step.name,
|
|
174
|
+
status: 'completed',
|
|
175
|
+
duration_ms: log.durationMs,
|
|
176
|
+
});
|
|
177
|
+
return { newState: recovered ?? {}, log, nextSeq: seq };
|
|
178
|
+
}
|
|
179
|
+
catch (recoveryErr) {
|
|
180
|
+
throw new PipelineExecutionError(`Step "${step.name}" recovery failed: ${recoveryErr?.message || recoveryErr}`, step.name, recoveryErr instanceof Error ? recoveryErr : undefined);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
// 'throw' (default)
|
|
184
|
+
throw new PipelineExecutionError(`Step "${step.name}" failed: ${error.message}`, step.name, error);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
async function executeParallelGroup(sdk, group, state, onEvent, runId, seq) {
|
|
188
|
+
// Each parallel step gets its own starting seq to avoid conflicts.
|
|
189
|
+
// We'll collect events and replay them after all settle.
|
|
190
|
+
const results = await Promise.allSettled(group.steps.map((step, i) => executeStep(sdk, step, state, true, onEvent, runId, seq + (i * 10))));
|
|
191
|
+
// Advance seq past all parallel steps.
|
|
192
|
+
seq += group.steps.length * 10;
|
|
193
|
+
let merged = {};
|
|
194
|
+
const logs = [];
|
|
195
|
+
for (let i = 0; i < results.length; i++) {
|
|
196
|
+
const result = results[i];
|
|
197
|
+
if (result.status === 'fulfilled') {
|
|
198
|
+
merged = { ...merged, ...result.value.newState };
|
|
199
|
+
logs.push(result.value.log);
|
|
200
|
+
}
|
|
201
|
+
else {
|
|
202
|
+
// If any parallel step throws (after its own onError handling),
|
|
203
|
+
// the entire parallel group fails.
|
|
204
|
+
const stepName = group.steps[i].name;
|
|
205
|
+
throw new PipelineExecutionError(`Parallel step "${stepName}" failed: ${result.reason?.message || result.reason}`, stepName, result.reason instanceof Error ? result.reason : undefined);
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
return { newState: merged, logs, nextSeq: seq };
|
|
209
|
+
}
|
|
210
|
+
//# sourceMappingURL=PipelineRunner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PipelineRunner.js","sourceRoot":"","sources":["../../../src/sdk/pipeline/PipelineRunner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Compiles a DeclarativePipeline definition into an executable Pipeline.
|
|
3
|
+
*
|
|
4
|
+
* This bridges the JSON-serializable visual builder format and the typed
|
|
5
|
+
* Pipeline runtime.
|
|
6
|
+
*/
|
|
7
|
+
import { Pipeline } from './PipelineBuilder.js';
|
|
8
|
+
import type { DeclarativePipeline } from './declarative.js';
|
|
9
|
+
export declare class DeclarativePipelineValidationError extends Error {
|
|
10
|
+
constructor(message: string);
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Compile a DeclarativePipeline into a Pipeline<TState>.
|
|
14
|
+
*
|
|
15
|
+
* Validates the definition for:
|
|
16
|
+
* - No duplicate step names
|
|
17
|
+
* - Parallel group step names must exist in the steps array
|
|
18
|
+
* - No step appearing in multiple parallel groups
|
|
19
|
+
*
|
|
20
|
+
* Sequential steps not in any parallel group are added via builder.step().
|
|
21
|
+
* Steps referenced in parallelGroups are collected and added via builder.parallel().
|
|
22
|
+
*/
|
|
23
|
+
export declare function compileDeclarativePipeline<TState extends Record<string, any>>(definition: DeclarativePipeline): Pipeline<TState>;
|
|
24
|
+
//# sourceMappingURL=compiler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compiler.d.ts","sourceRoot":"","sources":["../../../src/sdk/pipeline/compiler.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAmB,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAEjE,OAAO,KAAK,EAAE,mBAAmB,EAA2B,MAAM,kBAAkB,CAAC;AAMrF,qBAAa,kCAAmC,SAAQ,KAAK;gBAC/C,OAAO,EAAE,MAAM;CAI5B;AAMD;;;;;;;;;;GAUG;AACH,wBAAgB,0BAA0B,CAAC,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC3E,UAAU,EAAE,mBAAmB,GAC9B,QAAQ,CAAC,MAAM,CAAC,CAuElB"}
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Compiles a DeclarativePipeline definition into an executable Pipeline.
|
|
3
|
+
*
|
|
4
|
+
* This bridges the JSON-serializable visual builder format and the typed
|
|
5
|
+
* Pipeline runtime.
|
|
6
|
+
*/
|
|
7
|
+
import { PipelineBuilder } from './PipelineBuilder.js';
|
|
8
|
+
// ---------------------------------------------------------------------------
|
|
9
|
+
// Validation error
|
|
10
|
+
// ---------------------------------------------------------------------------
|
|
11
|
+
export class DeclarativePipelineValidationError extends Error {
|
|
12
|
+
constructor(message) {
|
|
13
|
+
super(message);
|
|
14
|
+
this.name = 'DeclarativePipelineValidationError';
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
// ---------------------------------------------------------------------------
|
|
18
|
+
// Compiler
|
|
19
|
+
// ---------------------------------------------------------------------------
|
|
20
|
+
/**
|
|
21
|
+
* Compile a DeclarativePipeline into a Pipeline<TState>.
|
|
22
|
+
*
|
|
23
|
+
* Validates the definition for:
|
|
24
|
+
* - No duplicate step names
|
|
25
|
+
* - Parallel group step names must exist in the steps array
|
|
26
|
+
* - No step appearing in multiple parallel groups
|
|
27
|
+
*
|
|
28
|
+
* Sequential steps not in any parallel group are added via builder.step().
|
|
29
|
+
* Steps referenced in parallelGroups are collected and added via builder.parallel().
|
|
30
|
+
*/
|
|
31
|
+
export function compileDeclarativePipeline(definition) {
|
|
32
|
+
validate(definition);
|
|
33
|
+
// Build a set of step names that belong to parallel groups so we know
|
|
34
|
+
// which steps to skip when iterating sequentially.
|
|
35
|
+
const parallelStepNames = new Set();
|
|
36
|
+
const parallelGroupsByFirstStep = new Map();
|
|
37
|
+
if (definition.parallelGroups) {
|
|
38
|
+
for (const group of definition.parallelGroups) {
|
|
39
|
+
for (const name of group) {
|
|
40
|
+
parallelStepNames.add(name);
|
|
41
|
+
}
|
|
42
|
+
// Index by the first step name in the group so we can emit the
|
|
43
|
+
// parallel() call when we encounter the first step of the group
|
|
44
|
+
// during the sequential walk.
|
|
45
|
+
parallelGroupsByFirstStep.set(group[0], group);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
// Index steps by name for fast lookup.
|
|
49
|
+
const stepsByName = new Map();
|
|
50
|
+
for (const step of definition.steps) {
|
|
51
|
+
stepsByName.set(step.name, step);
|
|
52
|
+
}
|
|
53
|
+
let builder = new PipelineBuilder();
|
|
54
|
+
// Walk the steps array in order. When we encounter the first step of a
|
|
55
|
+
// parallel group, emit a builder.parallel() call. Otherwise emit a
|
|
56
|
+
// sequential builder.step() call.
|
|
57
|
+
const emittedParallelGroups = new Set();
|
|
58
|
+
for (const step of definition.steps) {
|
|
59
|
+
if (parallelStepNames.has(step.name)) {
|
|
60
|
+
// Find the parallel group this step belongs to.
|
|
61
|
+
const group = findGroupForStep(step.name, definition.parallelGroups);
|
|
62
|
+
const groupKey = group.join(',');
|
|
63
|
+
if (emittedParallelGroups.has(groupKey)) {
|
|
64
|
+
// Already emitted this group when we encountered its first step.
|
|
65
|
+
continue;
|
|
66
|
+
}
|
|
67
|
+
emittedParallelGroups.add(groupKey);
|
|
68
|
+
// Emit parallel group.
|
|
69
|
+
const parallelSteps = group.map((name) => {
|
|
70
|
+
const s = stepsByName.get(name);
|
|
71
|
+
return {
|
|
72
|
+
name: s.name,
|
|
73
|
+
fn: buildStepFn(s),
|
|
74
|
+
gate: s.gate ? buildGateFn(s.gate) : undefined,
|
|
75
|
+
onError: (s.errorStrategy ?? 'throw'),
|
|
76
|
+
};
|
|
77
|
+
});
|
|
78
|
+
builder = builder.parallel(parallelSteps);
|
|
79
|
+
}
|
|
80
|
+
else {
|
|
81
|
+
// Sequential step.
|
|
82
|
+
builder = builder.step(step.name, buildStepFn(step), {
|
|
83
|
+
gate: step.gate ? buildGateFn(step.gate) : undefined,
|
|
84
|
+
onError: step.errorStrategy ?? 'throw',
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
return builder.build();
|
|
89
|
+
}
|
|
90
|
+
// ---------------------------------------------------------------------------
|
|
91
|
+
// Helpers
|
|
92
|
+
// ---------------------------------------------------------------------------
|
|
93
|
+
function buildStepFn(step) {
|
|
94
|
+
return async (ctx) => {
|
|
95
|
+
// Build extraInstructions from inputMapping if present.
|
|
96
|
+
let extraInstructions;
|
|
97
|
+
if (step.inputMapping && Object.keys(step.inputMapping).length > 0) {
|
|
98
|
+
const mappedParts = [];
|
|
99
|
+
for (const [key, expression] of Object.entries(step.inputMapping)) {
|
|
100
|
+
// Resolve the expression against pipeline state.
|
|
101
|
+
const value = resolveExpression(ctx.state, expression);
|
|
102
|
+
mappedParts.push(`${key}: ${typeof value === 'string' ? value : JSON.stringify(value)}`);
|
|
103
|
+
}
|
|
104
|
+
extraInstructions = mappedParts.join('\n');
|
|
105
|
+
}
|
|
106
|
+
const result = await ctx.run(step.commandKey, {
|
|
107
|
+
...(extraInstructions ? { extraInstructions } : {}),
|
|
108
|
+
});
|
|
109
|
+
return { [`${step.name}_result`]: result.result.final_output };
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Resolve a simple expression against pipeline state.
|
|
114
|
+
*
|
|
115
|
+
* Supports dot-notation paths like "state.foo.bar" or just "foo.bar".
|
|
116
|
+
* The leading "state." prefix is optional.
|
|
117
|
+
*/
|
|
118
|
+
function resolveExpression(state, expression) {
|
|
119
|
+
let path = expression;
|
|
120
|
+
// Strip optional "state." prefix.
|
|
121
|
+
if (path.startsWith('state.')) {
|
|
122
|
+
path = path.slice(6);
|
|
123
|
+
}
|
|
124
|
+
const parts = path.split('.');
|
|
125
|
+
let current = state;
|
|
126
|
+
for (const part of parts) {
|
|
127
|
+
if (current == null || typeof current !== 'object')
|
|
128
|
+
return undefined;
|
|
129
|
+
current = current[part];
|
|
130
|
+
}
|
|
131
|
+
return current;
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* @security Gate expressions are compiled via `new Function()` which executes
|
|
135
|
+
* arbitrary JavaScript. Only use declarative pipelines with trusted
|
|
136
|
+
* configuration sources. **Never** pass user-provided strings as gate
|
|
137
|
+
* expressions.
|
|
138
|
+
*/
|
|
139
|
+
function buildGateFn(expression) {
|
|
140
|
+
// Use Function constructor for simple expression evaluation.
|
|
141
|
+
// The expression has access to the state object.
|
|
142
|
+
const fn = new Function('state', 'return ' + expression);
|
|
143
|
+
return (state) => fn(state);
|
|
144
|
+
}
|
|
145
|
+
function findGroupForStep(stepName, groups) {
|
|
146
|
+
for (const group of groups) {
|
|
147
|
+
if (group.includes(stepName))
|
|
148
|
+
return group;
|
|
149
|
+
}
|
|
150
|
+
// Should not happen after validation, but defensive.
|
|
151
|
+
return [stepName];
|
|
152
|
+
}
|
|
153
|
+
// ---------------------------------------------------------------------------
|
|
154
|
+
// Validation
|
|
155
|
+
// ---------------------------------------------------------------------------
|
|
156
|
+
function validate(definition) {
|
|
157
|
+
if (!definition.name || typeof definition.name !== 'string') {
|
|
158
|
+
throw new DeclarativePipelineValidationError('Pipeline must have a non-empty name.');
|
|
159
|
+
}
|
|
160
|
+
if (!Array.isArray(definition.steps) || definition.steps.length === 0) {
|
|
161
|
+
throw new DeclarativePipelineValidationError('Pipeline must have at least one step.');
|
|
162
|
+
}
|
|
163
|
+
// Check for duplicate step names.
|
|
164
|
+
const names = new Set();
|
|
165
|
+
for (const step of definition.steps) {
|
|
166
|
+
if (!step.name || typeof step.name !== 'string') {
|
|
167
|
+
throw new DeclarativePipelineValidationError('Every step must have a non-empty name.');
|
|
168
|
+
}
|
|
169
|
+
if (!step.commandKey || typeof step.commandKey !== 'string') {
|
|
170
|
+
throw new DeclarativePipelineValidationError(`Step "${step.name}" must have a non-empty commandKey.`);
|
|
171
|
+
}
|
|
172
|
+
if (names.has(step.name)) {
|
|
173
|
+
throw new DeclarativePipelineValidationError(`Duplicate step name: "${step.name}".`);
|
|
174
|
+
}
|
|
175
|
+
names.add(step.name);
|
|
176
|
+
}
|
|
177
|
+
// Validate parallel groups.
|
|
178
|
+
if (definition.parallelGroups) {
|
|
179
|
+
const assignedToGroup = new Set();
|
|
180
|
+
for (let i = 0; i < definition.parallelGroups.length; i++) {
|
|
181
|
+
const group = definition.parallelGroups[i];
|
|
182
|
+
if (!Array.isArray(group) || group.length < 2) {
|
|
183
|
+
throw new DeclarativePipelineValidationError(`Parallel group at index ${i} must have at least 2 step names.`);
|
|
184
|
+
}
|
|
185
|
+
for (const stepName of group) {
|
|
186
|
+
if (!names.has(stepName)) {
|
|
187
|
+
throw new DeclarativePipelineValidationError(`Parallel group references unknown step: "${stepName}".`);
|
|
188
|
+
}
|
|
189
|
+
if (assignedToGroup.has(stepName)) {
|
|
190
|
+
throw new DeclarativePipelineValidationError(`Step "${stepName}" appears in multiple parallel groups.`);
|
|
191
|
+
}
|
|
192
|
+
assignedToGroup.add(stepName);
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
//# sourceMappingURL=compiler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compiler.js","sourceRoot":"","sources":["../../../src/sdk/pipeline/compiler.ts"],"names":[],"mappings":"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"}
|