@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.
Files changed (148) hide show
  1. package/.claude/skills/qodo-agent/SKILL.md +233 -3
  2. package/.claude/skills/qodo-agent/assets/programmatic-agent.ts +74 -1
  3. package/.claude/skills/qodo-agent/references/common-issues.md +79 -0
  4. package/dist/api/agent.d.ts.map +1 -1
  5. package/dist/api/agent.js +13 -8
  6. package/dist/api/agent.js.map +1 -1
  7. package/dist/api/http.d.ts.map +1 -1
  8. package/dist/api/http.js +5 -2
  9. package/dist/api/http.js.map +1 -1
  10. package/dist/api/websocket.d.ts.map +1 -1
  11. package/dist/api/websocket.js +6 -3
  12. package/dist/api/websocket.js.map +1 -1
  13. package/dist/auth/index.d.ts +18 -0
  14. package/dist/auth/index.d.ts.map +1 -1
  15. package/dist/auth/index.js +69 -10
  16. package/dist/auth/index.js.map +1 -1
  17. package/dist/context/messageManager.d.ts +1 -1
  18. package/dist/context/messageManager.d.ts.map +1 -1
  19. package/dist/context/messageManager.js +1 -1
  20. package/dist/context/messageManager.js.map +1 -1
  21. package/dist/index.d.ts +21 -2
  22. package/dist/index.d.ts.map +1 -1
  23. package/dist/index.js +18 -1
  24. package/dist/index.js.map +1 -1
  25. package/dist/mcp/MCPManager.js +2 -2
  26. package/dist/mcp/MCPManager.js.map +1 -1
  27. package/dist/mcp/baseServer.js +1 -1
  28. package/dist/mcp/baseServer.js.map +1 -1
  29. package/dist/mcp/servers/ripgrep.d.ts.map +1 -1
  30. package/dist/mcp/servers/ripgrep.js +6 -2
  31. package/dist/mcp/servers/ripgrep.js.map +1 -1
  32. package/dist/mcp/servers/shell.js +1 -1
  33. package/dist/mcp/servers/shell.js.map +1 -1
  34. package/dist/mcp/serversRegistry.d.ts.map +1 -1
  35. package/dist/mcp/serversRegistry.js +7 -1
  36. package/dist/mcp/serversRegistry.js.map +1 -1
  37. package/dist/mcp/toolProcessor.d.ts +44 -4
  38. package/dist/mcp/toolProcessor.d.ts.map +1 -1
  39. package/dist/mcp/toolProcessor.js +255 -20
  40. package/dist/mcp/toolProcessor.js.map +1 -1
  41. package/dist/messages/index.d.ts +8 -0
  42. package/dist/messages/index.d.ts.map +1 -0
  43. package/dist/messages/index.js +7 -0
  44. package/dist/messages/index.js.map +1 -0
  45. package/dist/messages/openai.d.ts +26 -0
  46. package/dist/messages/openai.d.ts.map +1 -0
  47. package/dist/messages/openai.js +55 -0
  48. package/dist/messages/openai.js.map +1 -0
  49. package/dist/messages/types.d.ts +73 -0
  50. package/dist/messages/types.d.ts.map +1 -0
  51. package/dist/messages/types.js +78 -0
  52. package/dist/messages/types.js.map +1 -0
  53. package/dist/parser/index.js +3 -3
  54. package/dist/parser/index.js.map +1 -1
  55. package/dist/sdk/QodoSDK.d.ts +30 -10
  56. package/dist/sdk/QodoSDK.d.ts.map +1 -1
  57. package/dist/sdk/QodoSDK.js +165 -33
  58. package/dist/sdk/QodoSDK.js.map +1 -1
  59. package/dist/sdk/artifacts.d.ts +156 -0
  60. package/dist/sdk/artifacts.d.ts.map +1 -0
  61. package/dist/sdk/artifacts.js +166 -0
  62. package/dist/sdk/artifacts.js.map +1 -0
  63. package/dist/sdk/bootstrap.d.ts.map +1 -1
  64. package/dist/sdk/bootstrap.js +11 -4
  65. package/dist/sdk/bootstrap.js.map +1 -1
  66. package/dist/sdk/discovery.js +1 -1
  67. package/dist/sdk/discovery.js.map +1 -1
  68. package/dist/sdk/events.d.ts +46 -1
  69. package/dist/sdk/events.d.ts.map +1 -1
  70. package/dist/sdk/events.js +6 -0
  71. package/dist/sdk/events.js.map +1 -1
  72. package/dist/sdk/middleware.d.ts +59 -0
  73. package/dist/sdk/middleware.d.ts.map +1 -0
  74. package/dist/sdk/middleware.js +69 -0
  75. package/dist/sdk/middleware.js.map +1 -0
  76. package/dist/sdk/pipeline/PipelineBuilder.d.ts +61 -0
  77. package/dist/sdk/pipeline/PipelineBuilder.d.ts.map +1 -0
  78. package/dist/sdk/pipeline/PipelineBuilder.js +91 -0
  79. package/dist/sdk/pipeline/PipelineBuilder.js.map +1 -0
  80. package/dist/sdk/pipeline/PipelineRunner.d.ts +28 -0
  81. package/dist/sdk/pipeline/PipelineRunner.d.ts.map +1 -0
  82. package/dist/sdk/pipeline/PipelineRunner.js +210 -0
  83. package/dist/sdk/pipeline/PipelineRunner.js.map +1 -0
  84. package/dist/sdk/pipeline/compiler.d.ts +24 -0
  85. package/dist/sdk/pipeline/compiler.d.ts.map +1 -0
  86. package/dist/sdk/pipeline/compiler.js +197 -0
  87. package/dist/sdk/pipeline/compiler.js.map +1 -0
  88. package/dist/sdk/pipeline/declarative.d.ts +34 -0
  89. package/dist/sdk/pipeline/declarative.d.ts.map +1 -0
  90. package/dist/sdk/pipeline/declarative.js +9 -0
  91. package/dist/sdk/pipeline/declarative.js.map +1 -0
  92. package/dist/sdk/pipeline/index.d.ts +20 -0
  93. package/dist/sdk/pipeline/index.d.ts.map +1 -0
  94. package/dist/sdk/pipeline/index.js +19 -0
  95. package/dist/sdk/pipeline/index.js.map +1 -0
  96. package/dist/sdk/pipeline/types.d.ts +75 -0
  97. package/dist/sdk/pipeline/types.d.ts.map +1 -0
  98. package/dist/sdk/pipeline/types.js +10 -0
  99. package/dist/sdk/pipeline/types.js.map +1 -0
  100. package/dist/sdk/policies.d.ts +163 -0
  101. package/dist/sdk/policies.d.ts.map +1 -0
  102. package/dist/sdk/policies.js +243 -0
  103. package/dist/sdk/policies.js.map +1 -0
  104. package/dist/sdk/runner/AgentRunner.js +5 -5
  105. package/dist/sdk/runner/AgentRunner.js.map +1 -1
  106. package/dist/sdk/runner/finalize.d.ts +47 -0
  107. package/dist/sdk/runner/finalize.d.ts.map +1 -1
  108. package/dist/sdk/runner/finalize.js +42 -2
  109. package/dist/sdk/runner/finalize.js.map +1 -1
  110. package/dist/sdk/runner/formats.d.ts +1 -1
  111. package/dist/sdk/runner/formats.d.ts.map +1 -1
  112. package/dist/sdk/runner/formats.js +22 -37
  113. package/dist/sdk/runner/formats.js.map +1 -1
  114. package/dist/sdk/runner/progress.d.ts +1 -1
  115. package/dist/sdk/runner/progress.d.ts.map +1 -1
  116. package/dist/sdk/runner/progress.js +1 -1
  117. package/dist/sdk/runner/progress.js.map +1 -1
  118. package/dist/session/SessionContext.d.ts +1 -0
  119. package/dist/session/SessionContext.d.ts.map +1 -1
  120. package/dist/session/SessionContext.js +3 -0
  121. package/dist/session/SessionContext.js.map +1 -1
  122. package/dist/session/environment.d.ts +16 -6
  123. package/dist/session/environment.d.ts.map +1 -1
  124. package/dist/session/environment.js.map +1 -1
  125. package/dist/session/serverData.d.ts.map +1 -1
  126. package/dist/session/serverData.js +21 -3
  127. package/dist/session/serverData.js.map +1 -1
  128. package/dist/tracing/PipelineTracer.d.ts +37 -0
  129. package/dist/tracing/PipelineTracer.d.ts.map +1 -0
  130. package/dist/tracing/PipelineTracer.js +64 -0
  131. package/dist/tracing/PipelineTracer.js.map +1 -0
  132. package/dist/tracing/SdkTracer.d.ts +91 -0
  133. package/dist/tracing/SdkTracer.d.ts.map +1 -0
  134. package/dist/tracing/SdkTracer.js +243 -0
  135. package/dist/tracing/SdkTracer.js.map +1 -0
  136. package/dist/tracing/index.d.ts +6 -0
  137. package/dist/tracing/index.d.ts.map +1 -0
  138. package/dist/tracing/index.js +3 -0
  139. package/dist/tracing/index.js.map +1 -0
  140. package/dist/tracing/pipelineHelpers.d.ts +20 -0
  141. package/dist/tracing/pipelineHelpers.d.ts.map +1 -0
  142. package/dist/tracing/pipelineHelpers.js +140 -0
  143. package/dist/tracing/pipelineHelpers.js.map +1 -0
  144. package/dist/tracing/types.d.ts +46 -0
  145. package/dist/tracing/types.d.ts.map +1 -0
  146. package/dist/tracing/types.js +9 -0
  147. package/dist/tracing/types.js.map +1 -0
  148. 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":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,eAAe,EAAY,MAAM,sBAAsB,CAAC;AAIjE,8EAA8E;AAC9E,mBAAmB;AACnB,8EAA8E;AAE9E,MAAM,OAAO,kCAAmC,SAAQ,KAAK;IAC3D,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,oCAAoC,CAAC;IACnD,CAAC;CACF;AAED,8EAA8E;AAC9E,WAAW;AACX,8EAA8E;AAE9E;;;;;;;;;;GAUG;AACH,MAAM,UAAU,0BAA0B,CACxC,UAA+B;IAE/B,QAAQ,CAAC,UAAU,CAAC,CAAC;IAErB,sEAAsE;IACtE,mDAAmD;IACnD,MAAM,iBAAiB,GAAG,IAAI,GAAG,EAAU,CAAC;IAC5C,MAAM,yBAAyB,GAAG,IAAI,GAAG,EAAoB,CAAC;IAE9D,IAAI,UAAU,CAAC,cAAc,EAAE,CAAC;QAC9B,KAAK,MAAM,KAAK,IAAI,UAAU,CAAC,cAAc,EAAE,CAAC;YAC9C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAC9B,CAAC;YACD,+DAA+D;YAC/D,gEAAgE;YAChE,8BAA8B;YAC9B,yBAAyB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;QACjD,CAAC;IACH,CAAC;IAED,uCAAuC;IACvC,MAAM,WAAW,GAAG,IAAI,GAAG,EAAmC,CAAC;IAC/D,KAAK,MAAM,IAAI,IAAI,UAAU,CAAC,KAAK,EAAE,CAAC;QACpC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACnC,CAAC;IAED,IAAI,OAAO,GAAG,IAAI,eAAe,EAAU,CAAC;IAE5C,uEAAuE;IACvE,mEAAmE;IACnE,kCAAkC;IAClC,MAAM,qBAAqB,GAAG,IAAI,GAAG,EAAU,CAAC;IAEhD,KAAK,MAAM,IAAI,IAAI,UAAU,CAAC,KAAK,EAAE,CAAC;QACpC,IAAI,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACrC,gDAAgD;YAChD,MAAM,KAAK,GAAG,gBAAgB,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,cAAe,CAAC,CAAC;YACtE,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAEjC,IAAI,qBAAqB,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACxC,iEAAiE;gBACjE,SAAS;YACX,CAAC;YACD,qBAAqB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YAEpC,uBAAuB;YACvB,MAAM,aAAa,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;gBACvC,MAAM,CAAC,GAAG,WAAW,CAAC,GAAG,CAAC,IAAI,CAAE,CAAC;gBACjC,OAAO;oBACL,IAAI,EAAE,CAAC,CAAC,IAAI;oBACZ,EAAE,EAAE,WAAW,CAAS,CAAC,CAAC;oBAC1B,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,CAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;oBACtD,OAAO,EAAE,CAAC,CAAC,CAAC,aAAa,IAAI,OAAO,CAA+B;iBACpE,CAAC;YACJ,CAAC,CAAC,CAAC;YAEH,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAQ,CAAC;QACnD,CAAC;aAAM,CAAC;YACN,mBAAmB;YACnB,OAAO,GAAG,OAAO,CAAC,IAAI,CACpB,IAAI,CAAC,IAAI,EACT,WAAW,CAAS,IAAI,CAAC,EACzB;gBACE,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,CAAS,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;gBAC5D,OAAO,EAAE,IAAI,CAAC,aAAa,IAAI,OAAO;aACvC,CACK,CAAC;QACX,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC,KAAK,EAAsB,CAAC;AAC7C,CAAC;AAED,8EAA8E;AAC9E,UAAU;AACV,8EAA8E;AAE9E,SAAS,WAAW,CAAS,IAA6B;IACxD,OAAO,KAAK,EAAE,GAAG,EAAE,EAAE;QACnB,wDAAwD;QACxD,IAAI,iBAAqC,CAAC;QAC1C,IAAI,IAAI,CAAC,YAAY,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACnE,MAAM,WAAW,GAAa,EAAE,CAAC;YACjC,KAAK,MAAM,CAAC,GAAG,EAAE,UAAU,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC;gBAClE,iDAAiD;gBACjD,MAAM,KAAK,GAAG,iBAAiB,CAAC,GAAG,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;gBACvD,WAAW,CAAC,IAAI,CAAC,GAAG,GAAG,KAAK,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAC3F,CAAC;YACD,iBAAiB,GAAG,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7C,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,EAAE;YAC5C,GAAG,CAAC,iBAAiB,CAAC,CAAC,CAAC,EAAE,iBAAiB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACpD,CAAC,CAAC;QAEH,OAAO,EAAE,CAAC,GAAG,IAAI,CAAC,IAAI,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;IACjE,CAAC,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,SAAS,iBAAiB,CAAC,KAA0B,EAAE,UAAkB;IACvE,IAAI,IAAI,GAAG,UAAU,CAAC;IACtB,kCAAkC;IAClC,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC9B,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACvB,CAAC;IAED,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC9B,IAAI,OAAO,GAAQ,KAAK,CAAC;IACzB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,OAAO,IAAI,IAAI,IAAI,OAAO,OAAO,KAAK,QAAQ;YAAE,OAAO,SAAS,CAAC;QACrE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;;;GAKG;AACH,SAAS,WAAW,CAAS,UAAkB;IAC7C,6DAA6D;IAC7D,iDAAiD;IACjD,MAAM,EAAE,GAAG,IAAI,QAAQ,CAAC,OAAO,EAAE,SAAS,GAAG,UAAU,CAAyC,CAAC;IACjG,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;AAC9B,CAAC;AAED,SAAS,gBAAgB,CAAC,QAAgB,EAAE,MAAkB;IAC5D,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC;YAAE,OAAO,KAAK,CAAC;IAC7C,CAAC;IACD,qDAAqD;IACrD,OAAO,CAAC,QAAQ,CAAC,CAAC;AACpB,CAAC;AAED,8EAA8E;AAC9E,aAAa;AACb,8EAA8E;AAE9E,SAAS,QAAQ,CAAC,UAA+B;IAC/C,IAAI,CAAC,UAAU,CAAC,IAAI,IAAI,OAAO,UAAU,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC5D,MAAM,IAAI,kCAAkC,CAAC,sCAAsC,CAAC,CAAC;IACvF,CAAC;IAED,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,UAAU,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtE,MAAM,IAAI,kCAAkC,CAAC,uCAAuC,CAAC,CAAC;IACxF,CAAC;IAED,kCAAkC;IAClC,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;IAChC,KAAK,MAAM,IAAI,IAAI,UAAU,CAAC,KAAK,EAAE,CAAC;QACpC,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAChD,MAAM,IAAI,kCAAkC,CAAC,wCAAwC,CAAC,CAAC;QACzF,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,OAAO,IAAI,CAAC,UAAU,KAAK,QAAQ,EAAE,CAAC;YAC5D,MAAM,IAAI,kCAAkC,CAC1C,SAAS,IAAI,CAAC,IAAI,qCAAqC,CACxD,CAAC;QACJ,CAAC;QACD,IAAI,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACzB,MAAM,IAAI,kCAAkC,CAC1C,yBAAyB,IAAI,CAAC,IAAI,IAAI,CACvC,CAAC;QACJ,CAAC;QACD,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACvB,CAAC;IAED,4BAA4B;IAC5B,IAAI,UAAU,CAAC,cAAc,EAAE,CAAC;QAC9B,MAAM,eAAe,GAAG,IAAI,GAAG,EAAU,CAAC;QAE1C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC1D,MAAM,KAAK,GAAG,UAAU,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;YAE3C,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC9C,MAAM,IAAI,kCAAkC,CAC1C,2BAA2B,CAAC,mCAAmC,CAChE,CAAC;YACJ,CAAC;YAED,KAAK,MAAM,QAAQ,IAAI,KAAK,EAAE,CAAC;gBAC7B,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;oBACzB,MAAM,IAAI,kCAAkC,CAC1C,4CAA4C,QAAQ,IAAI,CACzD,CAAC;gBACJ,CAAC;gBACD,IAAI,eAAe,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;oBAClC,MAAM,IAAI,kCAAkC,CAC1C,SAAS,QAAQ,wCAAwC,CAC1D,CAAC;gBACJ,CAAC;gBACD,eAAe,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YAChC,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC"}