@uluops/core 0.5.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 (167) hide show
  1. package/README.md +543 -0
  2. package/definitions/starter/code-validator.agent.yaml +134 -0
  3. package/definitions/starter/docs-validator.agent.yaml +142 -0
  4. package/definitions/starter/public-interface-validator.agent.yaml +138 -0
  5. package/definitions/starter/security-analyst.agent.yaml +144 -0
  6. package/definitions/starter/test-architect.agent.yaml +137 -0
  7. package/dist/ai/AIProvider.d.ts +198 -0
  8. package/dist/ai/AIProvider.d.ts.map +1 -0
  9. package/dist/ai/AIProvider.js +557 -0
  10. package/dist/ai/AIProvider.js.map +1 -0
  11. package/dist/ai/ModelCatalog.d.ts +78 -0
  12. package/dist/ai/ModelCatalog.d.ts.map +1 -0
  13. package/dist/ai/ModelCatalog.js +193 -0
  14. package/dist/ai/ModelCatalog.js.map +1 -0
  15. package/dist/ai/ShellExecutor.d.ts +42 -0
  16. package/dist/ai/ShellExecutor.d.ts.map +1 -0
  17. package/dist/ai/ShellExecutor.js +62 -0
  18. package/dist/ai/ShellExecutor.js.map +1 -0
  19. package/dist/ai/TokenBudgetTracker.d.ts +49 -0
  20. package/dist/ai/TokenBudgetTracker.d.ts.map +1 -0
  21. package/dist/ai/TokenBudgetTracker.js +61 -0
  22. package/dist/ai/TokenBudgetTracker.js.map +1 -0
  23. package/dist/ai/ToolAdapter.d.ts +25 -0
  24. package/dist/ai/ToolAdapter.d.ts.map +1 -0
  25. package/dist/ai/ToolAdapter.js +135 -0
  26. package/dist/ai/ToolAdapter.js.map +1 -0
  27. package/dist/ai/index.d.ts +6 -0
  28. package/dist/ai/index.d.ts.map +1 -0
  29. package/dist/ai/index.js +4 -0
  30. package/dist/ai/index.js.map +1 -0
  31. package/dist/client/UluOpsClient.d.ts +111 -0
  32. package/dist/client/UluOpsClient.d.ts.map +1 -0
  33. package/dist/client/UluOpsClient.js +329 -0
  34. package/dist/client/UluOpsClient.js.map +1 -0
  35. package/dist/constants.d.ts +6 -0
  36. package/dist/constants.d.ts.map +1 -0
  37. package/dist/constants.js +9 -0
  38. package/dist/constants.js.map +1 -0
  39. package/dist/errors/UluOpsError.d.ts +10 -0
  40. package/dist/errors/UluOpsError.d.ts.map +1 -0
  41. package/dist/errors/UluOpsError.js +13 -0
  42. package/dist/errors/UluOpsError.js.map +1 -0
  43. package/dist/errors/index.d.ts +64 -0
  44. package/dist/errors/index.d.ts.map +1 -0
  45. package/dist/errors/index.js +93 -0
  46. package/dist/errors/index.js.map +1 -0
  47. package/dist/executor/AgentExecutor.d.ts +57 -0
  48. package/dist/executor/AgentExecutor.d.ts.map +1 -0
  49. package/dist/executor/AgentExecutor.js +331 -0
  50. package/dist/executor/AgentExecutor.js.map +1 -0
  51. package/dist/executor/CommandExecutor.d.ts +33 -0
  52. package/dist/executor/CommandExecutor.d.ts.map +1 -0
  53. package/dist/executor/CommandExecutor.js +183 -0
  54. package/dist/executor/CommandExecutor.js.map +1 -0
  55. package/dist/executor/PipelineExecutor.d.ts +55 -0
  56. package/dist/executor/PipelineExecutor.d.ts.map +1 -0
  57. package/dist/executor/PipelineExecutor.js +273 -0
  58. package/dist/executor/PipelineExecutor.js.map +1 -0
  59. package/dist/executor/ToolHandler.d.ts +47 -0
  60. package/dist/executor/ToolHandler.d.ts.map +1 -0
  61. package/dist/executor/ToolHandler.js +615 -0
  62. package/dist/executor/ToolHandler.js.map +1 -0
  63. package/dist/executor/WorkflowExecutor.d.ts +55 -0
  64. package/dist/executor/WorkflowExecutor.d.ts.map +1 -0
  65. package/dist/executor/WorkflowExecutor.js +368 -0
  66. package/dist/executor/WorkflowExecutor.js.map +1 -0
  67. package/dist/executor/preflight.d.ts +8 -0
  68. package/dist/executor/preflight.d.ts.map +1 -0
  69. package/dist/executor/preflight.js +102 -0
  70. package/dist/executor/preflight.js.map +1 -0
  71. package/dist/executor/symbols.d.ts +13 -0
  72. package/dist/executor/symbols.d.ts.map +1 -0
  73. package/dist/executor/symbols.js +102 -0
  74. package/dist/executor/symbols.js.map +1 -0
  75. package/dist/index.d.ts +32 -0
  76. package/dist/index.d.ts.map +1 -0
  77. package/dist/index.js +25 -0
  78. package/dist/index.js.map +1 -0
  79. package/dist/parser/OutputExtractor.d.ts +52 -0
  80. package/dist/parser/OutputExtractor.d.ts.map +1 -0
  81. package/dist/parser/OutputExtractor.js +818 -0
  82. package/dist/parser/OutputExtractor.js.map +1 -0
  83. package/dist/parser/outputSchemas.d.ts +223 -0
  84. package/dist/parser/outputSchemas.d.ts.map +1 -0
  85. package/dist/parser/outputSchemas.js +73 -0
  86. package/dist/parser/outputSchemas.js.map +1 -0
  87. package/dist/registry/RegistryClient.d.ts +75 -0
  88. package/dist/registry/RegistryClient.d.ts.map +1 -0
  89. package/dist/registry/RegistryClient.js +419 -0
  90. package/dist/registry/RegistryClient.js.map +1 -0
  91. package/dist/registry/index.d.ts +2 -0
  92. package/dist/registry/index.d.ts.map +1 -0
  93. package/dist/registry/index.js +2 -0
  94. package/dist/registry/index.js.map +1 -0
  95. package/dist/types/agent.d.ts +406 -0
  96. package/dist/types/agent.d.ts.map +1 -0
  97. package/dist/types/agent.js +2 -0
  98. package/dist/types/agent.js.map +1 -0
  99. package/dist/types/ai.d.ts +14 -0
  100. package/dist/types/ai.d.ts.map +1 -0
  101. package/dist/types/ai.js +2 -0
  102. package/dist/types/ai.js.map +1 -0
  103. package/dist/types/command.d.ts +153 -0
  104. package/dist/types/command.d.ts.map +1 -0
  105. package/dist/types/command.js +2 -0
  106. package/dist/types/command.js.map +1 -0
  107. package/dist/types/config.d.ts +136 -0
  108. package/dist/types/config.d.ts.map +1 -0
  109. package/dist/types/config.js +2 -0
  110. package/dist/types/config.js.map +1 -0
  111. package/dist/types/execution.d.ts +172 -0
  112. package/dist/types/execution.d.ts.map +1 -0
  113. package/dist/types/execution.js +2 -0
  114. package/dist/types/execution.js.map +1 -0
  115. package/dist/types/index.d.ts +12 -0
  116. package/dist/types/index.d.ts.map +1 -0
  117. package/dist/types/index.js +2 -0
  118. package/dist/types/index.js.map +1 -0
  119. package/dist/types/parser.d.ts +75 -0
  120. package/dist/types/parser.d.ts.map +1 -0
  121. package/dist/types/parser.js +2 -0
  122. package/dist/types/parser.js.map +1 -0
  123. package/dist/types/pipeline.d.ts +155 -0
  124. package/dist/types/pipeline.d.ts.map +1 -0
  125. package/dist/types/pipeline.js +2 -0
  126. package/dist/types/pipeline.js.map +1 -0
  127. package/dist/types/registry.d.ts +232 -0
  128. package/dist/types/registry.d.ts.map +1 -0
  129. package/dist/types/registry.js +2 -0
  130. package/dist/types/registry.js.map +1 -0
  131. package/dist/types/tools.d.ts +29 -0
  132. package/dist/types/tools.d.ts.map +1 -0
  133. package/dist/types/tools.js +2 -0
  134. package/dist/types/tools.js.map +1 -0
  135. package/dist/types/validation.d.ts +237 -0
  136. package/dist/types/validation.d.ts.map +1 -0
  137. package/dist/types/validation.js +2 -0
  138. package/dist/types/validation.js.map +1 -0
  139. package/dist/types/workflow.d.ts +131 -0
  140. package/dist/types/workflow.d.ts.map +1 -0
  141. package/dist/types/workflow.js +2 -0
  142. package/dist/types/workflow.js.map +1 -0
  143. package/dist/utils/formatError.d.ts +6 -0
  144. package/dist/utils/formatError.d.ts.map +1 -0
  145. package/dist/utils/formatError.js +10 -0
  146. package/dist/utils/formatError.js.map +1 -0
  147. package/dist/utils/parseRef.d.ts +11 -0
  148. package/dist/utils/parseRef.d.ts.map +1 -0
  149. package/dist/utils/parseRef.js +16 -0
  150. package/dist/utils/parseRef.js.map +1 -0
  151. package/dist/utils/sumTokenMetrics.d.ts +9 -0
  152. package/dist/utils/sumTokenMetrics.d.ts.map +1 -0
  153. package/dist/utils/sumTokenMetrics.js +20 -0
  154. package/dist/utils/sumTokenMetrics.js.map +1 -0
  155. package/dist/utils/topoSort.d.ts +24 -0
  156. package/dist/utils/topoSort.d.ts.map +1 -0
  157. package/dist/utils/topoSort.js +60 -0
  158. package/dist/utils/topoSort.js.map +1 -0
  159. package/dist/validation/ValidationClient.d.ts +51 -0
  160. package/dist/validation/ValidationClient.d.ts.map +1 -0
  161. package/dist/validation/ValidationClient.js +179 -0
  162. package/dist/validation/ValidationClient.js.map +1 -0
  163. package/dist/validation/index.d.ts +2 -0
  164. package/dist/validation/index.d.ts.map +1 -0
  165. package/dist/validation/index.js +2 -0
  166. package/dist/validation/index.js.map +1 -0
  167. package/package.json +76 -0
@@ -0,0 +1,183 @@
1
+ import { runPreflightChecks } from './preflight.js';
2
+ import { parseRef } from '../utils/parseRef.js';
3
+ import { sumTokenMetrics } from '../utils/sumTokenMetrics.js';
4
+ /**
5
+ * Executes command definitions.
6
+ *
7
+ * - Single-agent commands: delegates to AgentExecutor
8
+ * - Multi-agent commands: runs agents in sequence, aggregates results
9
+ *
10
+ * Handles preflight checks, model/threshold overrides from command definition,
11
+ * and multi-agent score aggregation.
12
+ */
13
+ export class CommandExecutor {
14
+ agentExecutor;
15
+ registry;
16
+ constructor(agentExecutor, registry) {
17
+ this.agentExecutor = agentExecutor;
18
+ this.registry = registry;
19
+ }
20
+ /**
21
+ * Execute a command definition
22
+ */
23
+ async execute(resolved, input) {
24
+ const startTime = Date.now();
25
+ const def = resolved.definition;
26
+ // 1. Run preflight checks
27
+ if (def.command.execution.preflight) {
28
+ await runPreflightChecks(def.command.execution.preflight, input);
29
+ }
30
+ // 2. Resolve referenced agents
31
+ const agentRefs = def.command.agents;
32
+ // 3. Single-agent: delegate to AgentExecutor
33
+ if (agentRefs.length === 1) {
34
+ const ref = agentRefs[0];
35
+ if (!ref)
36
+ throw new Error('Agent refs array is empty despite length check');
37
+ const [name, version] = parseRef(ref);
38
+ const agentResolved = await this.registry.resolve(name, version, 'agent');
39
+ const agentResult = await this.agentExecutor.execute(agentResolved, input, {
40
+ model: def.command.execution.model.default,
41
+ timeoutMs: def.command.execution.timeout,
42
+ thresholds: def.command.execution.thresholds,
43
+ });
44
+ return this.wrapAgentResult(agentResult, def, resolved.hash, startTime);
45
+ }
46
+ // 4. Multi-agent: execute each and aggregate
47
+ const executeAgent = async (ref) => {
48
+ const [name, version] = parseRef(ref);
49
+ const agentResolved = await this.registry.resolve(name, version, 'agent');
50
+ return this.agentExecutor.execute(agentResolved, input, {
51
+ model: def.command.execution.model.default,
52
+ timeoutMs: def.command.execution.timeout,
53
+ });
54
+ };
55
+ const agentResults = def.command.execution.sequential === false
56
+ ? await Promise.all(agentRefs.map(executeAgent))
57
+ : await this.executeSequentially(agentRefs, executeAgent);
58
+ return this.aggregateResults(agentResults, def, resolved.hash, startTime, def.command.aggregation ?? { method: 'average' });
59
+ }
60
+ async executeSequentially(refs, fn) {
61
+ const results = [];
62
+ for (const ref of refs) {
63
+ results.push(await fn(ref));
64
+ }
65
+ return results;
66
+ }
67
+ /**
68
+ * Wrap a single agent result as a CommandResult
69
+ */
70
+ wrapAgentResult(agentResult, def, hash, startTime) {
71
+ const durationMs = Date.now() - startTime;
72
+ const metrics = {
73
+ ...agentResult.metrics,
74
+ durationMs,
75
+ toolCalls: agentResult.metrics.toolCallCount ?? 0,
76
+ };
77
+ const base = {
78
+ type: 'command',
79
+ name: def.command.interface.name,
80
+ version: def.command.interface.version,
81
+ definitionHash: hash,
82
+ agentType: agentResult.agentType,
83
+ decision: agentResult.decision,
84
+ threshold: def.command.execution.thresholds?.pass,
85
+ recommendations: agentResult.recommendations,
86
+ durationMs,
87
+ metrics,
88
+ };
89
+ if (agentResult.agentType === 'validator') {
90
+ return {
91
+ ...base,
92
+ score: agentResult.score,
93
+ maxScore: agentResult.maxScore,
94
+ categories: agentResult.categories?.map(c => ({
95
+ name: c.name,
96
+ score: c.score,
97
+ maxPoints: c.maxScore,
98
+ findings: c.findings,
99
+ })),
100
+ };
101
+ }
102
+ return { ...base, artifacts: agentResult.artifacts };
103
+ }
104
+ /**
105
+ * Aggregate multiple agent results into a single CommandResult
106
+ */
107
+ aggregateResults(results, def, hash, startTime, aggregation) {
108
+ const durationMs = Date.now() - startTime;
109
+ // Collect all recommendations
110
+ const recommendations = results.flatMap(r => r.recommendations);
111
+ // Aggregate scores (for validators)
112
+ const validatorResults = results.filter((r) => r.agentType === 'validator');
113
+ let score;
114
+ let maxScore;
115
+ if (validatorResults.length > 0) {
116
+ const scores = validatorResults.map(r => r.score);
117
+ switch (aggregation.method) {
118
+ case 'min':
119
+ score = Math.min(...scores);
120
+ break;
121
+ case 'max':
122
+ score = Math.max(...scores);
123
+ break;
124
+ case 'weighted_average': {
125
+ const weights = aggregation.weights ?? {};
126
+ let totalWeight = 0;
127
+ let weightedSum = 0;
128
+ for (const r of validatorResults) {
129
+ const w = weights[r.name] ?? 1;
130
+ totalWeight += w;
131
+ weightedSum += r.score * w;
132
+ }
133
+ score = totalWeight > 0 ? weightedSum / totalWeight : 0;
134
+ break;
135
+ }
136
+ case 'average':
137
+ default:
138
+ score = scores.reduce((a, b) => a + b, 0) / scores.length;
139
+ }
140
+ maxScore = Math.max(...validatorResults.map(r => r.maxScore ?? 100));
141
+ }
142
+ // Determine overall decision
143
+ const threshold = def.command.execution.thresholds?.pass ?? 70;
144
+ const warnThreshold = def.command.execution.thresholds?.warn ?? 50;
145
+ let decision;
146
+ if (score !== undefined) {
147
+ if (score >= threshold)
148
+ decision = 'PASS';
149
+ else if (score >= warnThreshold)
150
+ decision = 'WARN';
151
+ else
152
+ decision = 'FAIL';
153
+ }
154
+ else {
155
+ const failed = results.some(r => r.decision === 'FAILED');
156
+ const partial = results.some(r => r.decision === 'PARTIAL');
157
+ decision = failed ? 'FAILED' : partial ? 'PARTIAL' : 'COMPLETE';
158
+ }
159
+ // Aggregate metrics
160
+ const totalToolCalls = results.reduce((sum, r) => sum + (r.metrics.toolCallCount ?? 0), 0);
161
+ const metrics = {
162
+ ...sumTokenMetrics(results.map(r => r.metrics)),
163
+ durationMs,
164
+ model: 'mixed',
165
+ toolCalls: totalToolCalls,
166
+ };
167
+ return {
168
+ type: 'command',
169
+ name: def.command.interface.name,
170
+ version: def.command.interface.version,
171
+ definitionHash: hash,
172
+ agentType: validatorResults.length > 0 ? 'validator' : 'executor',
173
+ decision,
174
+ score,
175
+ maxScore,
176
+ threshold,
177
+ recommendations,
178
+ durationMs,
179
+ metrics,
180
+ };
181
+ }
182
+ }
183
+ //# sourceMappingURL=CommandExecutor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CommandExecutor.js","sourceRoot":"","sources":["../../src/executor/CommandExecutor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ import type { CommandExecutor } from './CommandExecutor.js';
2
+ import type { WorkflowExecutor } from './WorkflowExecutor.js';
3
+ import type { RegistryClient } from '../registry/RegistryClient.js';
4
+ import type { ResolvedDefinition } from '../types/registry.js';
5
+ import type { PipelineResult, PipelineState, PipelineHandle as IPipelineHandle } from '../types/pipeline.js';
6
+ import type { ExecutionInput } from '../types/execution.js';
7
+ /**
8
+ * Executes pipelines with multi-stage orchestration and async support.
9
+ *
10
+ * Handles stage dependency resolution, conditional execution,
11
+ * mix of workflow and command stages, and state tracking.
12
+ */
13
+ export declare class PipelineExecutor {
14
+ private workflowExecutor;
15
+ private commandExecutor;
16
+ private registry;
17
+ constructor(workflowExecutor: WorkflowExecutor, commandExecutor: CommandExecutor, registry: RegistryClient);
18
+ /**
19
+ * Start pipeline execution asynchronously.
20
+ * Returns a PipelineHandle for monitoring progress and retrieving results.
21
+ */
22
+ start(resolved: ResolvedDefinition, input: ExecutionInput): Promise<PipelineHandle>;
23
+ /**
24
+ * Execute pipeline synchronously (blocking).
25
+ */
26
+ execute(resolved: ResolvedDefinition, input: ExecutionInput): Promise<PipelineResult>;
27
+ private executeAsync;
28
+ private executeStage;
29
+ private checkStageDependencies;
30
+ /**
31
+ * Safe condition evaluator for stage conditions.
32
+ * Supports: "stage.field op value" expressions
33
+ */
34
+ private evaluateCondition;
35
+ /** Safely access a field on an object via runtime narrowing (avoids double assertion). */
36
+ private getField;
37
+ private createSkippedStage;
38
+ }
39
+ /**
40
+ * Handle for monitoring and controlling an async pipeline execution
41
+ */
42
+ declare class PipelineHandle implements IPipelineHandle {
43
+ readonly executionId: string;
44
+ private state;
45
+ private execution;
46
+ constructor(executionId: string, state: PipelineState, execution: Promise<void>);
47
+ status(): Promise<PipelineResult>;
48
+ isComplete(): boolean;
49
+ wait(_pollIntervalMs?: number): Promise<PipelineResult>;
50
+ cancel(): Promise<void>;
51
+ private buildResult;
52
+ private computeDecision;
53
+ }
54
+ export {};
55
+ //# sourceMappingURL=PipelineExecutor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PipelineExecutor.d.ts","sourceRoot":"","sources":["../../src/executor/PipelineExecutor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AACpE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC/D,OAAO,KAAK,EAAuC,cAAc,EAAe,aAAa,EAAE,cAAc,IAAI,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC/J,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAM5D;;;;;GAKG;AACH,qBAAa,gBAAgB;IAEzB,OAAO,CAAC,gBAAgB;IACxB,OAAO,CAAC,eAAe;IACvB,OAAO,CAAC,QAAQ;gBAFR,gBAAgB,EAAE,gBAAgB,EAClC,eAAe,EAAE,eAAe,EAChC,QAAQ,EAAE,cAAc;IAGlC;;;OAGG;IACG,KAAK,CAAC,QAAQ,EAAE,kBAAkB,EAAE,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC;IA0BzF;;OAEG;IACG,OAAO,CAAC,QAAQ,EAAE,kBAAkB,EAAE,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC;YAK7E,YAAY;YAyCZ,YAAY;IAuC1B,OAAO,CAAC,sBAAsB;IAO9B;;;OAGG;IACH,OAAO,CAAC,iBAAiB;IA2BzB,0FAA0F;IAC1F,OAAO,CAAC,QAAQ;IAIhB,OAAO,CAAC,kBAAkB;CAU3B;AAED;;GAEG;AACH,cAAM,cAAe,YAAW,eAAe;IAC7C,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,OAAO,CAAC,KAAK,CAAgB;IAC7B,OAAO,CAAC,SAAS,CAAgB;gBAErB,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,OAAO,CAAC,IAAI,CAAC;IAMzE,MAAM,IAAI,OAAO,CAAC,cAAc,CAAC;IAIvC,UAAU,IAAI,OAAO;IAIf,IAAI,CAAC,eAAe,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAevD,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAU7B,OAAO,CAAC,WAAW;IAiDnB,OAAO,CAAC,eAAe;CAkBxB"}
@@ -0,0 +1,273 @@
1
+ import { PipelineError } from '../errors/index.js';
2
+ import { parseRef } from '../utils/parseRef.js';
3
+ import { formatErrorMessage } from '../utils/formatError.js';
4
+ import { sumTokenMetrics } from '../utils/sumTokenMetrics.js';
5
+ /**
6
+ * Executes pipelines with multi-stage orchestration and async support.
7
+ *
8
+ * Handles stage dependency resolution, conditional execution,
9
+ * mix of workflow and command stages, and state tracking.
10
+ */
11
+ export class PipelineExecutor {
12
+ workflowExecutor;
13
+ commandExecutor;
14
+ registry;
15
+ constructor(workflowExecutor, commandExecutor, registry) {
16
+ this.workflowExecutor = workflowExecutor;
17
+ this.commandExecutor = commandExecutor;
18
+ this.registry = registry;
19
+ }
20
+ /**
21
+ * Start pipeline execution asynchronously.
22
+ * Returns a PipelineHandle for monitoring progress and retrieving results.
23
+ */
24
+ async start(resolved, input) {
25
+ const def = resolved.definition;
26
+ const pipelineId = `pipeline_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`;
27
+ const state = {
28
+ pipelineId,
29
+ definitionVersion: def.pipeline.interface.version,
30
+ definitionHash: resolved.hash,
31
+ status: 'running',
32
+ currentStageIndex: 0,
33
+ stageResults: [],
34
+ startTime: Date.now(),
35
+ };
36
+ // Start execution in background, capturing errors into state
37
+ const execution = this.executeAsync(resolved, input, state);
38
+ execution.catch((error) => {
39
+ if (state.status === 'running') {
40
+ state.status = 'failed';
41
+ state.error = formatErrorMessage(error);
42
+ }
43
+ });
44
+ return new PipelineHandle(pipelineId, state, execution);
45
+ }
46
+ /**
47
+ * Execute pipeline synchronously (blocking).
48
+ */
49
+ async execute(resolved, input) {
50
+ const handle = await this.start(resolved, input);
51
+ return handle.wait(10); // Very short poll for sync mode
52
+ }
53
+ async executeAsync(resolved, input, state) {
54
+ const def = resolved.definition;
55
+ try {
56
+ for (let i = 0; i < def.pipeline.stages.length; i++) {
57
+ if (state.status === 'cancelled')
58
+ break;
59
+ const stage = def.pipeline.stages[i];
60
+ if (!stage)
61
+ break;
62
+ state.currentStageIndex = i;
63
+ // Check dependencies
64
+ if (!this.checkStageDependencies(stage.depends_on, state.stageResults)) {
65
+ state.stageResults.push(this.createSkippedStage(stage, 'dependencies_not_met'));
66
+ continue;
67
+ }
68
+ // Evaluate skip condition
69
+ if (stage.skip_if && this.evaluateCondition(stage.skip_if, state.stageResults)) {
70
+ state.stageResults.push(this.createSkippedStage(stage, 'skip_if_true'));
71
+ continue;
72
+ }
73
+ // Execute stage
74
+ const stageResult = await this.executeStage(stage, input);
75
+ state.stageResults.push(stageResult);
76
+ }
77
+ if (state.status === 'running') {
78
+ state.status = 'completed';
79
+ }
80
+ }
81
+ catch (error) {
82
+ state.status = 'failed';
83
+ state.error = formatErrorMessage(error);
84
+ }
85
+ }
86
+ async executeStage(stage, input) {
87
+ const [refName, refVersion] = parseRef(stage.ref);
88
+ const resolved = await this.registry.resolve(refName, refVersion, stage.type);
89
+ const startTime = Date.now();
90
+ try {
91
+ if (stage.type === 'workflow') {
92
+ const result = await this.workflowExecutor.execute(resolved, input);
93
+ return {
94
+ id: stage.id,
95
+ name: stage.name,
96
+ type: 'workflow',
97
+ status: 'completed',
98
+ result,
99
+ durationMs: Date.now() - startTime,
100
+ };
101
+ }
102
+ const result = await this.commandExecutor.execute(resolved, input);
103
+ return {
104
+ id: stage.id,
105
+ name: stage.name,
106
+ type: 'command',
107
+ status: 'completed',
108
+ result,
109
+ durationMs: Date.now() - startTime,
110
+ };
111
+ }
112
+ catch (error) {
113
+ return {
114
+ id: stage.id,
115
+ name: stage.name,
116
+ type: stage.type,
117
+ status: 'failed',
118
+ skipReason: formatErrorMessage(error),
119
+ durationMs: Date.now() - startTime,
120
+ };
121
+ }
122
+ }
123
+ checkStageDependencies(deps, results) {
124
+ if (!deps || deps.length === 0)
125
+ return true;
126
+ return deps.every(dep => results.some(r => r.id === dep && r.status === 'completed'));
127
+ }
128
+ /**
129
+ * Safe condition evaluator for stage conditions.
130
+ * Supports: "stage.field op value" expressions
131
+ */
132
+ evaluateCondition(condition, results) {
133
+ const context = Object.fromEntries(results.map(r => [r.id, r.result]));
134
+ const match = condition.match(/^([\w-]+)\.([\w]+)\s*(==|!=|>=|<=|>|<)\s*(?:'([^']*)'|"([^"]*)"|(\d+(?:\.\d+)?))$/);
135
+ if (!match)
136
+ return false;
137
+ const [, stageId, field, op, strVal1, strVal2, numVal] = match;
138
+ const stageResult = stageId ? context[stageId] : undefined;
139
+ if (!stageResult || typeof stageResult !== 'object')
140
+ return false;
141
+ const actual = this.getField(stageResult, field);
142
+ const expected = numVal !== undefined ? Number(numVal) : (strVal1 ?? strVal2);
143
+ switch (op) {
144
+ case '==': return String(actual) === String(expected);
145
+ case '!=': return String(actual) !== String(expected);
146
+ case '>=': return Number(actual) >= Number(expected);
147
+ case '<=': return Number(actual) <= Number(expected);
148
+ case '>': return Number(actual) > Number(expected);
149
+ case '<': return Number(actual) < Number(expected);
150
+ default: return false;
151
+ }
152
+ }
153
+ /** Safely access a field on an object via runtime narrowing (avoids double assertion). */
154
+ getField(obj, field) {
155
+ return field in obj ? obj[field] : undefined;
156
+ }
157
+ createSkippedStage(stage, reason) {
158
+ return {
159
+ id: stage.id,
160
+ name: stage.name,
161
+ type: stage.type,
162
+ status: 'skipped',
163
+ skipReason: reason,
164
+ durationMs: 0,
165
+ };
166
+ }
167
+ }
168
+ /**
169
+ * Handle for monitoring and controlling an async pipeline execution
170
+ */
171
+ class PipelineHandle {
172
+ executionId;
173
+ state;
174
+ execution;
175
+ constructor(executionId, state, execution) {
176
+ this.executionId = executionId;
177
+ this.state = state;
178
+ this.execution = execution;
179
+ }
180
+ async status() {
181
+ return this.buildResult();
182
+ }
183
+ isComplete() {
184
+ return this.state.status !== 'running' && this.state.status !== 'pending';
185
+ }
186
+ async wait(_pollIntervalMs) {
187
+ // Await the actual execution promise instead of polling
188
+ await this.execution;
189
+ const result = this.buildResult();
190
+ if (this.state.status === 'failed') {
191
+ throw new PipelineError(`Pipeline ${this.executionId} failed: ${this.state.error ?? 'Unknown error'}`);
192
+ }
193
+ return result;
194
+ }
195
+ async cancel() {
196
+ if (this.isComplete()) {
197
+ throw new PipelineError(`Pipeline ${this.executionId} is already complete (status: ${this.state.status})`);
198
+ }
199
+ this.state.status = 'cancelled';
200
+ this.state.error = 'Pipeline cancelled by user';
201
+ }
202
+ buildResult() {
203
+ const durationMs = Date.now() - this.state.startTime;
204
+ const stageScores = this.state.stageResults
205
+ .map(s => s.result?.score)
206
+ .filter((score) => score !== undefined);
207
+ const score = stageScores.length > 0
208
+ ? stageScores.reduce((a, b) => a + b, 0) / stageScores.length
209
+ : 0;
210
+ const recommendations = this.state.stageResults
211
+ .flatMap(s => s.result?.recommendations ?? []);
212
+ const decision = this.computeDecision();
213
+ return {
214
+ type: 'pipeline',
215
+ name: this.state.pipelineId,
216
+ version: this.state.definitionVersion,
217
+ definitionHash: this.state.definitionHash,
218
+ decision,
219
+ score,
220
+ durationMs,
221
+ status: mapPipelineStatus(this.state.status),
222
+ stages: this.state.stageResults,
223
+ recommendations,
224
+ metrics: {
225
+ ...sumTokenMetrics(this.state.stageResults
226
+ .map(s => s.result?.metrics)
227
+ .filter((m) => m != null)),
228
+ durationMs,
229
+ model: 'mixed',
230
+ stagesExecuted: this.state.stageResults.filter(s => s.status === 'completed').length,
231
+ stagesPassed: this.state.stageResults.filter(s => {
232
+ const d = s.result?.decision;
233
+ return d === 'PASS' || d === 'SHIP' || d === 'COMPLETE';
234
+ }).length,
235
+ stagesFailed: this.state.stageResults.filter(s => {
236
+ const d = s.result?.decision;
237
+ return d === 'FAIL' || d === 'BLOCK' || d === 'FAILED';
238
+ }).length,
239
+ stagesSkipped: this.state.stageResults.filter(s => s.status === 'skipped').length,
240
+ },
241
+ };
242
+ }
243
+ computeDecision() {
244
+ if (this.state.status === 'cancelled')
245
+ return 'CANCELLED';
246
+ if (this.state.status === 'failed')
247
+ return 'FAIL';
248
+ const hasFailures = this.state.stageResults.some(s => {
249
+ const d = s.result?.decision;
250
+ return d === 'FAIL' || d === 'FAILED' || d === 'BLOCK';
251
+ });
252
+ if (hasFailures)
253
+ return 'FAIL';
254
+ const hasWarnings = this.state.stageResults.some(s => {
255
+ const d = s.result?.decision;
256
+ return d === 'WARN' || d === 'HOLD';
257
+ });
258
+ if (hasWarnings)
259
+ return 'WARN';
260
+ return 'PASS';
261
+ }
262
+ }
263
+ /** Map internal PipelineState status to PipelineResult status (completed → complete). */
264
+ function mapPipelineStatus(status) {
265
+ switch (status) {
266
+ case 'completed': return 'complete';
267
+ case 'pending': return 'pending';
268
+ case 'running': return 'running';
269
+ case 'failed': return 'failed';
270
+ case 'cancelled': return 'cancelled';
271
+ }
272
+ }
273
+ //# sourceMappingURL=PipelineExecutor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PipelineExecutor.js","sourceRoot":"","sources":["../../src/executor/PipelineExecutor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ import type { Tool, ToolUseBlock, ToolResult } from '../types/index.js';
2
+ import type { Logger } from '@uluops/sdk-core';
3
+ /**
4
+ * Handles filesystem tool calls, fulfilling them against the local target directory.
5
+ * All paths are sandboxed to the base path to prevent directory traversal.
6
+ */
7
+ export declare class ToolHandler {
8
+ private basePath;
9
+ private logger;
10
+ constructor(basePath: string, logger?: Logger);
11
+ /**
12
+ * Get tool definitions for LLM API.
13
+ */
14
+ getTools(): Tool[];
15
+ /**
16
+ * Fulfill a tool call from the LLM.
17
+ * Dispatches to read_file, list_files, or search_content handlers.
18
+ * All paths are sandboxed to the base path.
19
+ *
20
+ * @param toolUse - Tool use block from the LLM response
21
+ * @returns Tool result with content or error
22
+ */
23
+ fulfill(toolUse: ToolUseBlock): Promise<ToolResult>;
24
+ /**
25
+ * Check if resolved path is within base path (security).
26
+ * Uses fs.realpath() to follow symlinks and detect escape attempts.
27
+ */
28
+ private isPathSafe;
29
+ private readFile;
30
+ private listFiles;
31
+ private searchContent;
32
+ private searchFileMode;
33
+ private searchCountMode;
34
+ private searchMatchesMode;
35
+ private getFileInfo;
36
+ private getDirectoryTree;
37
+ /**
38
+ * Recursively build directory tree, returning lines and accumulated stats.
39
+ * Stats bubble up so parent directories can display file count + total size
40
+ * without a redundant recursive glob + stat pass.
41
+ */
42
+ private buildTree;
43
+ private formatFileEntry;
44
+ private getSymbols;
45
+ }
46
+ export declare function extToLanguage(ext: string): string;
47
+ //# sourceMappingURL=ToolHandler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ToolHandler.d.ts","sourceRoot":"","sources":["../../src/executor/ToolHandler.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,IAAI,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACxE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAsB/C;;;GAGG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,MAAM,CAAS;gBAEX,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM;IAK7C;;OAEG;IACH,QAAQ,IAAI,IAAI,EAAE;IA4IlB;;;;;;;OAOG;IACG,OAAO,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,UAAU,CAAC;IAwEzD;;;OAGG;YACW,UAAU;YAeV,QAAQ;YAyCR,SAAS;YAuCT,aAAa;YA2Cb,cAAc;YAkBd,eAAe;YAyBf,iBAAiB;YAiDjB,WAAW;YAoBX,gBAAgB;IAW9B;;;;OAIG;YACW,SAAS;YA+ET,eAAe;YAyBf,UAAU;CAmBzB;AAoDD,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEjD"}