@icex-labs/icex-flow 0.3.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 (85) hide show
  1. package/README.md +158 -0
  2. package/SKILL.md +141 -0
  3. package/bin/icex-flow.mjs +3 -0
  4. package/dist/src/adapters/index.d.ts +1 -0
  5. package/dist/src/adapters/index.js +2 -0
  6. package/dist/src/adapters/index.js.map +1 -0
  7. package/dist/src/adapters/openclaw.d.ts +31 -0
  8. package/dist/src/adapters/openclaw.js +118 -0
  9. package/dist/src/adapters/openclaw.js.map +1 -0
  10. package/dist/src/cli.d.ts +1 -0
  11. package/dist/src/cli.js +95 -0
  12. package/dist/src/cli.js.map +1 -0
  13. package/dist/src/commands/context.d.ts +1 -0
  14. package/dist/src/commands/context.js +40 -0
  15. package/dist/src/commands/context.js.map +1 -0
  16. package/dist/src/commands/generate.d.ts +2 -0
  17. package/dist/src/commands/generate.js +230 -0
  18. package/dist/src/commands/generate.js.map +1 -0
  19. package/dist/src/commands/init.d.ts +1 -0
  20. package/dist/src/commands/init.js +104 -0
  21. package/dist/src/commands/init.js.map +1 -0
  22. package/dist/src/commands/learn.d.ts +13 -0
  23. package/dist/src/commands/learn.js +108 -0
  24. package/dist/src/commands/learn.js.map +1 -0
  25. package/dist/src/commands/list.d.ts +1 -0
  26. package/dist/src/commands/list.js +104 -0
  27. package/dist/src/commands/list.js.map +1 -0
  28. package/dist/src/commands/plan.d.ts +1 -0
  29. package/dist/src/commands/plan.js +88 -0
  30. package/dist/src/commands/plan.js.map +1 -0
  31. package/dist/src/commands/projects.d.ts +1 -0
  32. package/dist/src/commands/projects.js +69 -0
  33. package/dist/src/commands/projects.js.map +1 -0
  34. package/dist/src/commands/route.d.ts +1 -0
  35. package/dist/src/commands/route.js +38 -0
  36. package/dist/src/commands/route.js.map +1 -0
  37. package/dist/src/commands/validate.d.ts +1 -0
  38. package/dist/src/commands/validate.js +194 -0
  39. package/dist/src/commands/validate.js.map +1 -0
  40. package/dist/src/commands/verify.d.ts +1 -0
  41. package/dist/src/commands/verify.js +50 -0
  42. package/dist/src/commands/verify.js.map +1 -0
  43. package/dist/src/engine/architecture.d.ts +12 -0
  44. package/dist/src/engine/architecture.js +367 -0
  45. package/dist/src/engine/architecture.js.map +1 -0
  46. package/dist/src/engine/config.d.ts +24 -0
  47. package/dist/src/engine/config.js +164 -0
  48. package/dist/src/engine/config.js.map +1 -0
  49. package/dist/src/engine/context.d.ts +12 -0
  50. package/dist/src/engine/context.js +171 -0
  51. package/dist/src/engine/context.js.map +1 -0
  52. package/dist/src/engine/detect.d.ts +6 -0
  53. package/dist/src/engine/detect.js +300 -0
  54. package/dist/src/engine/detect.js.map +1 -0
  55. package/dist/src/engine/environment.d.ts +12 -0
  56. package/dist/src/engine/environment.js +399 -0
  57. package/dist/src/engine/environment.js.map +1 -0
  58. package/dist/src/engine/planner.d.ts +12 -0
  59. package/dist/src/engine/planner.js +130 -0
  60. package/dist/src/engine/planner.js.map +1 -0
  61. package/dist/src/engine/router.d.ts +7 -0
  62. package/dist/src/engine/router.js +56 -0
  63. package/dist/src/engine/router.js.map +1 -0
  64. package/dist/src/engine/verifier.d.ts +8 -0
  65. package/dist/src/engine/verifier.js +55 -0
  66. package/dist/src/engine/verifier.js.map +1 -0
  67. package/dist/src/index.d.ts +14 -0
  68. package/dist/src/index.js +13 -0
  69. package/dist/src/index.js.map +1 -0
  70. package/dist/src/presets/index.d.ts +11 -0
  71. package/dist/src/presets/index.js +352 -0
  72. package/dist/src/presets/index.js.map +1 -0
  73. package/dist/src/types.d.ts +161 -0
  74. package/dist/src/types.js +8 -0
  75. package/dist/src/types.js.map +1 -0
  76. package/dist/src/utils.d.ts +8 -0
  77. package/dist/src/utils.js +65 -0
  78. package/dist/src/utils.js.map +1 -0
  79. package/package.json +48 -0
  80. package/schemas/context.schema.json +38 -0
  81. package/schemas/routes.schema.json +33 -0
  82. package/schemas/workflow.schema.json +84 -0
  83. package/templates/context.manifest.json +21 -0
  84. package/templates/dev-chain.flow.json +112 -0
  85. package/templates/routes.json +37 -0
@@ -0,0 +1,399 @@
1
+ import { existsSync, readFileSync, readdirSync, statSync } from 'node:fs';
2
+ import { join, basename } from 'node:path';
3
+ import { homedir } from 'node:os';
4
+ // ── Helpers ──────────────────────────────────────────────────────────
5
+ function isProdName(name) {
6
+ const lower = name.toLowerCase();
7
+ return /\bprod(uction)?\b/.test(lower) || lower === 'prd' || lower === 'live';
8
+ }
9
+ function envNameFromSuffix(filename) {
10
+ // .env.production -> production, .env.dev -> dev
11
+ const m = filename.match(/\.env\.(.+)$/);
12
+ if (m)
13
+ return m[1];
14
+ return 'default';
15
+ }
16
+ function readFileSafe(path) {
17
+ try {
18
+ return readFileSync(path, 'utf-8');
19
+ }
20
+ catch {
21
+ return null;
22
+ }
23
+ }
24
+ // ── Scanners ─────────────────────────────────────────────────────────
25
+ function scanKubeConfig() {
26
+ const envs = [];
27
+ const kubeconfigPath = process.env['KUBECONFIG'] || join(homedir(), '.kube', 'config');
28
+ const content = readFileSafe(kubeconfigPath);
29
+ if (!content)
30
+ return envs;
31
+ // Parse YAML-like kubeconfig (simple regex extraction, no YAML parser dep)
32
+ // Extract contexts
33
+ const contextBlocks = content.split(/^- context:/gm);
34
+ const nameMatches = content.matchAll(/^- name:\s*(.+)$/gm);
35
+ // Simpler approach: extract context names
36
+ const contextNames = [];
37
+ for (const m of nameMatches) {
38
+ contextNames.push(m[1].trim());
39
+ }
40
+ // Extract clusters and namespaces per context
41
+ // Pattern: "- context:\n cluster: <cluster>\n namespace: <ns>\n user: <user>\n name: <name>"
42
+ const contextRegex = /-\s*context:\s*\n\s*cluster:\s*(.+)\n(?:\s*namespace:\s*(.+)\n)?\s*(?:user:\s*.+\n)?\s*name:\s*(.+)/gm;
43
+ let match;
44
+ while ((match = contextRegex.exec(content)) !== null) {
45
+ const cluster = match[1].trim();
46
+ const namespace = match[2]?.trim() || undefined;
47
+ const name = match[3].trim();
48
+ envs.push({
49
+ name,
50
+ type: 'kubernetes',
51
+ endpoint: cluster,
52
+ namespace,
53
+ isProduction: isProdName(name) || isProdName(cluster),
54
+ });
55
+ }
56
+ // If regex didn't match (different YAML formatting), fall back to simpler extraction
57
+ if (envs.length === 0 && contextNames.length > 0) {
58
+ for (const name of contextNames) {
59
+ // Skip entries that look like cluster/user definitions rather than contexts
60
+ envs.push({
61
+ name,
62
+ type: 'kubernetes',
63
+ isProduction: isProdName(name),
64
+ });
65
+ }
66
+ // Deduplicate: only keep unique context names (the contexts: section names)
67
+ // In kubeconfig, names appear under contexts, clusters, and users sections
68
+ // We try to identify context-specific ones
69
+ }
70
+ return envs;
71
+ }
72
+ function scanDockerCompose(dir) {
73
+ const envs = [];
74
+ const composeFiles = ['docker-compose.yml', 'docker-compose.yaml', 'docker-compose.dev.yml',
75
+ 'docker-compose.dev.yaml', 'docker-compose.prod.yml', 'docker-compose.prod.yaml',
76
+ 'docker-compose.staging.yml', 'docker-compose.staging.yaml',
77
+ 'docker-compose.override.yml', 'docker-compose.override.yaml',
78
+ 'compose.yml', 'compose.yaml'];
79
+ for (const file of composeFiles) {
80
+ const filePath = join(dir, file);
81
+ const content = readFileSafe(filePath);
82
+ if (!content)
83
+ continue;
84
+ // Extract environment name from filename
85
+ const envMatch = file.match(/docker-compose\.(\w+)\.(yml|yaml)$/) || file.match(/compose\.(\w+)\.(yml|yaml)$/);
86
+ const envName = envMatch ? envMatch[1] : 'local';
87
+ // Extract services
88
+ const services = [];
89
+ const ports = [];
90
+ const volumes = [];
91
+ // Simple YAML parsing: find services section and extract top-level keys
92
+ const lines = content.split('\n');
93
+ let inServices = false;
94
+ let indent = 0;
95
+ for (const line of lines) {
96
+ if (/^services:\s*$/.test(line)) {
97
+ inServices = true;
98
+ continue;
99
+ }
100
+ if (inServices) {
101
+ // Top-level service key (2-space or 4-space indent)
102
+ const svcMatch = line.match(/^(\s{2}|\s{4})(\w[\w-]*):\s*$/);
103
+ if (svcMatch && !line.startsWith(' ')) {
104
+ services.push(svcMatch[2]);
105
+ }
106
+ else if (/^\S/.test(line) && line.trim() !== '') {
107
+ inServices = false;
108
+ }
109
+ }
110
+ // Extract ports
111
+ const portMatch = line.match(/["']?(\d+:\d+)["']?/);
112
+ if (portMatch)
113
+ ports.push(portMatch[1]);
114
+ // Extract volumes
115
+ const volMatch = line.match(/-\s*["']?([./\w-]+:[./\w-]+)["']?/);
116
+ if (volMatch)
117
+ volumes.push(volMatch[1]);
118
+ }
119
+ envs.push({
120
+ name: envName === 'override' ? 'local' : envName,
121
+ type: 'docker-compose',
122
+ isProduction: isProdName(envName),
123
+ details: {
124
+ file,
125
+ services,
126
+ ports,
127
+ volumes,
128
+ },
129
+ });
130
+ }
131
+ return envs;
132
+ }
133
+ function scanEnvFiles(dir) {
134
+ const envs = [];
135
+ try {
136
+ const files = readdirSync(dir);
137
+ for (const file of files) {
138
+ if (file === '.env' || /^\.env\.\w+$/.test(file)) {
139
+ const envName = file === '.env' ? 'default' : envNameFromSuffix(file);
140
+ // Don't add if it's just '.env.example' or '.env.template'
141
+ if (envName === 'example' || envName === 'template' || envName === 'sample')
142
+ continue;
143
+ envs.push({
144
+ name: envName,
145
+ type: 'env-file',
146
+ isProduction: isProdName(envName),
147
+ details: { file },
148
+ });
149
+ }
150
+ }
151
+ }
152
+ catch {
153
+ // Directory not readable
154
+ }
155
+ return envs;
156
+ }
157
+ function scanContainerFiles(dir) {
158
+ const envs = [];
159
+ const containerFiles = ['Dockerfile', 'Containerfile'];
160
+ for (const file of containerFiles) {
161
+ if (existsSync(join(dir, file))) {
162
+ envs.push({
163
+ name: 'container',
164
+ type: 'container',
165
+ isProduction: false,
166
+ details: { file },
167
+ });
168
+ break; // Only add once
169
+ }
170
+ }
171
+ return envs;
172
+ }
173
+ function scanTerraform(dir) {
174
+ const envs = [];
175
+ const tfDir = join(dir, 'terraform');
176
+ const tfDirs = [tfDir, dir];
177
+ for (const d of tfDirs) {
178
+ try {
179
+ if (!existsSync(d))
180
+ continue;
181
+ const files = readdirSync(d);
182
+ const hasTf = files.some(f => f.endsWith('.tf'));
183
+ if (!hasTf)
184
+ continue;
185
+ // Check for environment-specific directories
186
+ const envDirs = files.filter(f => {
187
+ try {
188
+ return statSync(join(d, f)).isDirectory() &&
189
+ ['dev', 'staging', 'prod', 'production', 'test', 'uat'].includes(f.toLowerCase());
190
+ }
191
+ catch {
192
+ return false;
193
+ }
194
+ });
195
+ if (envDirs.length > 0) {
196
+ for (const envDir of envDirs) {
197
+ envs.push({
198
+ name: envDir,
199
+ type: 'terraform',
200
+ isProduction: isProdName(envDir),
201
+ });
202
+ }
203
+ }
204
+ else if (d === tfDir) {
205
+ envs.push({
206
+ name: 'terraform',
207
+ type: 'terraform',
208
+ isProduction: false,
209
+ });
210
+ }
211
+ break;
212
+ }
213
+ catch { /* skip */ }
214
+ }
215
+ return envs;
216
+ }
217
+ function scanPulumi(dir) {
218
+ const envs = [];
219
+ if (existsSync(join(dir, 'Pulumi.yaml')) || existsSync(join(dir, 'Pulumi.yml'))) {
220
+ // Check for stack files: Pulumi.<stack>.yaml
221
+ try {
222
+ const files = readdirSync(dir);
223
+ const stacks = files
224
+ .filter(f => /^Pulumi\.\w+\.(yaml|yml)$/.test(f) && f !== 'Pulumi.yaml' && f !== 'Pulumi.yml')
225
+ .map(f => {
226
+ const m = f.match(/^Pulumi\.(\w+)\.(yaml|yml)$/);
227
+ return m ? m[1] : null;
228
+ })
229
+ .filter((s) => s !== null);
230
+ if (stacks.length > 0) {
231
+ for (const stack of stacks) {
232
+ envs.push({
233
+ name: stack,
234
+ type: 'pulumi',
235
+ isProduction: isProdName(stack),
236
+ });
237
+ }
238
+ }
239
+ else {
240
+ envs.push({
241
+ name: 'pulumi',
242
+ type: 'pulumi',
243
+ isProduction: false,
244
+ });
245
+ }
246
+ }
247
+ catch {
248
+ envs.push({
249
+ name: 'pulumi',
250
+ type: 'pulumi',
251
+ isProduction: false,
252
+ });
253
+ }
254
+ }
255
+ return envs;
256
+ }
257
+ function scanArgoCD(dir) {
258
+ const envs = [];
259
+ const argoDir = join(dir, 'argocd');
260
+ const appDir = join(dir, 'apps');
261
+ for (const d of [argoDir, appDir, dir]) {
262
+ try {
263
+ if (!existsSync(d))
264
+ continue;
265
+ const files = readdirSync(d);
266
+ for (const file of files) {
267
+ if (!file.endsWith('.yaml') && !file.endsWith('.yml'))
268
+ continue;
269
+ const content = readFileSafe(join(d, file));
270
+ if (!content)
271
+ continue;
272
+ if (content.includes('kind: Application') && content.includes('argoproj.io')) {
273
+ const nameMatch = content.match(/^\s*name:\s*(.+)$/m);
274
+ const nsMatch = content.match(/^\s*namespace:\s*(.+)$/m);
275
+ const name = nameMatch ? nameMatch[1].trim() : basename(file, '.yaml').replace('.yml', '');
276
+ envs.push({
277
+ name,
278
+ type: 'argocd',
279
+ namespace: nsMatch ? nsMatch[1].trim() : undefined,
280
+ isProduction: isProdName(name),
281
+ });
282
+ }
283
+ }
284
+ }
285
+ catch { /* skip */ }
286
+ }
287
+ return envs;
288
+ }
289
+ function scanFlux(dir) {
290
+ const envs = [];
291
+ const fluxDir = join(dir, 'flux-system');
292
+ const clusterDir = join(dir, 'clusters');
293
+ for (const d of [fluxDir, clusterDir, dir]) {
294
+ try {
295
+ if (!existsSync(d))
296
+ continue;
297
+ const files = readdirSync(d);
298
+ for (const file of files) {
299
+ if (!file.endsWith('.yaml') && !file.endsWith('.yml'))
300
+ continue;
301
+ const content = readFileSafe(join(d, file));
302
+ if (!content)
303
+ continue;
304
+ if (content.includes('fluxcd.io') || content.includes('toolkit.fluxcd.io')) {
305
+ const nameMatch = content.match(/^\s*name:\s*(.+)$/m);
306
+ const name = nameMatch ? nameMatch[1].trim() : basename(file).replace(/\.(yaml|yml)$/, '');
307
+ envs.push({
308
+ name,
309
+ type: 'flux',
310
+ isProduction: isProdName(name),
311
+ });
312
+ }
313
+ }
314
+ }
315
+ catch { /* skip */ }
316
+ }
317
+ return envs;
318
+ }
319
+ function scanHelmValues(dir) {
320
+ const envs = [];
321
+ const searchDirs = [dir, join(dir, 'helm'), join(dir, 'charts')];
322
+ for (const d of searchDirs) {
323
+ try {
324
+ if (!existsSync(d))
325
+ continue;
326
+ const files = readdirSync(d);
327
+ for (const file of files) {
328
+ const m = file.match(/^values[-.](\w+)\.(yaml|yml)$/);
329
+ if (m) {
330
+ const envName = m[1];
331
+ if (envName === 'schema' || envName === 'template')
332
+ continue;
333
+ envs.push({
334
+ name: envName,
335
+ type: 'helm',
336
+ isProduction: isProdName(envName),
337
+ });
338
+ }
339
+ }
340
+ // Also scan chart subdirectories
341
+ if (d !== dir)
342
+ continue;
343
+ const chartsDir = join(d, 'charts');
344
+ if (!existsSync(chartsDir))
345
+ continue;
346
+ const chartSubs = readdirSync(chartsDir).filter(f => {
347
+ try {
348
+ return statSync(join(chartsDir, f)).isDirectory();
349
+ }
350
+ catch {
351
+ return false;
352
+ }
353
+ });
354
+ for (const chart of chartSubs) {
355
+ const chartFiles = readdirSync(join(chartsDir, chart));
356
+ for (const file of chartFiles) {
357
+ const cm = file.match(/^values[-.](\w+)\.(yaml|yml)$/);
358
+ if (cm) {
359
+ const envName = cm[1];
360
+ if (envName === 'schema' || envName === 'template')
361
+ continue;
362
+ envs.push({
363
+ name: `${chart}/${envName}`,
364
+ type: 'helm',
365
+ isProduction: isProdName(envName),
366
+ });
367
+ }
368
+ }
369
+ }
370
+ }
371
+ catch { /* skip */ }
372
+ }
373
+ return envs;
374
+ }
375
+ // ── Main ─────────────────────────────────────────────────────────────
376
+ export function discoverEnvironments(dir) {
377
+ const environments = [
378
+ ...scanKubeConfig(),
379
+ ...scanDockerCompose(dir),
380
+ ...scanEnvFiles(dir),
381
+ ...scanContainerFiles(dir),
382
+ ...scanTerraform(dir),
383
+ ...scanPulumi(dir),
384
+ ...scanArgoCD(dir),
385
+ ...scanFlux(dir),
386
+ ...scanHelmValues(dir),
387
+ ];
388
+ // Deduplicate by name+type
389
+ const seen = new Set();
390
+ const unique = environments.filter(e => {
391
+ const key = `${e.type}:${e.name}`;
392
+ if (seen.has(key))
393
+ return false;
394
+ seen.add(key);
395
+ return true;
396
+ });
397
+ return { environments: unique };
398
+ }
399
+ //# sourceMappingURL=environment.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"environment.js","sourceRoot":"","sources":["../../../src/engine/environment.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { WorkflowDefinition, ExecutionPlan } from '../types.js';
2
+ /**
3
+ * Generate a deterministic execution plan from a workflow definition + input variables.
4
+ *
5
+ * The plan is a fully-resolved, step-by-step sequence with all templates expanded.
6
+ * The LLM follows this plan mechanically — no freestyle decisions.
7
+ */
8
+ export declare function planWorkflow(workflow: WorkflowDefinition, input: Record<string, string>): ExecutionPlan;
9
+ /**
10
+ * Format an execution plan as human/agent-readable text output.
11
+ */
12
+ export declare function formatPlan(plan: ExecutionPlan): string;
@@ -0,0 +1,130 @@
1
+ import { resolveTemplate } from '../utils.js';
2
+ /**
3
+ * Generate a deterministic execution plan from a workflow definition + input variables.
4
+ *
5
+ * The plan is a fully-resolved, step-by-step sequence with all templates expanded.
6
+ * The LLM follows this plan mechanically — no freestyle decisions.
7
+ */
8
+ export function planWorkflow(workflow, input) {
9
+ const vars = resolveInputs(workflow, input);
10
+ const steps = workflow.steps.map((step) => {
11
+ // Evaluate condition
12
+ if (step.condition) {
13
+ const resolved = resolveTemplate(step.condition, vars);
14
+ // Simple truthy check: skip if variable is empty or "false"
15
+ if (!resolved || resolved === 'false' || resolved === '{{' + step.condition.slice(2)) {
16
+ return {
17
+ id: step.id,
18
+ name: step.name,
19
+ action: step.action,
20
+ status: 'skipped',
21
+ };
22
+ }
23
+ }
24
+ return {
25
+ id: step.id,
26
+ name: step.name,
27
+ action: step.action,
28
+ resolved_command: step.command
29
+ ? resolveTemplate(step.command, vars)
30
+ : undefined,
31
+ resolved_input: step.input
32
+ ? resolveTemplate(step.input, vars)
33
+ : undefined,
34
+ timeout: step.timeout,
35
+ verify: step.verify
36
+ ? {
37
+ command: resolveTemplate(step.verify.command, vars),
38
+ expect: step.verify.expect
39
+ ? resolveTemplate(step.verify.expect, vars)
40
+ : undefined,
41
+ expect_exit: step.verify.expect_exit,
42
+ }
43
+ : undefined,
44
+ status: 'pending',
45
+ };
46
+ });
47
+ return {
48
+ workflow: workflow.name,
49
+ steps,
50
+ context_files: workflow.context?.always ?? [],
51
+ variables: vars,
52
+ };
53
+ }
54
+ /**
55
+ * Format an execution plan as human/agent-readable text output.
56
+ */
57
+ export function formatPlan(plan) {
58
+ const lines = [];
59
+ lines.push(`# Execution Plan: ${plan.workflow}`);
60
+ lines.push('');
61
+ lines.push(`Variables: ${JSON.stringify(plan.variables, null, 2)}`);
62
+ lines.push('');
63
+ if (plan.context_files.length) {
64
+ lines.push('## Context Files');
65
+ for (const f of plan.context_files) {
66
+ lines.push(` - ${f}`);
67
+ }
68
+ lines.push('');
69
+ }
70
+ lines.push('## Steps');
71
+ lines.push('');
72
+ for (let i = 0; i < plan.steps.length; i++) {
73
+ const step = plan.steps[i];
74
+ const num = i + 1;
75
+ if (step.status === 'skipped') {
76
+ lines.push(`### Step ${num}: ${step.name} [SKIPPED]`);
77
+ lines.push('');
78
+ continue;
79
+ }
80
+ lines.push(`### Step ${num}: ${step.name}`);
81
+ lines.push(`- Action: ${step.action}`);
82
+ if (step.resolved_command) {
83
+ lines.push(`- Command: \`${step.resolved_command}\``);
84
+ }
85
+ if (step.resolved_input) {
86
+ lines.push(`- Input: ${step.resolved_input}`);
87
+ }
88
+ if (step.timeout) {
89
+ lines.push(`- Timeout: ${step.timeout}s`);
90
+ }
91
+ if (step.verify) {
92
+ lines.push(`- Verify: \`${step.verify.command}\``);
93
+ if (step.verify.expect) {
94
+ lines.push(` - Expect output: "${step.verify.expect}"`);
95
+ }
96
+ if (step.verify.expect_exit !== undefined) {
97
+ lines.push(` - Expect exit code: ${step.verify.expect_exit}`);
98
+ }
99
+ }
100
+ lines.push('');
101
+ }
102
+ lines.push('---');
103
+ lines.push('IMPORTANT: Execute steps in order. Do NOT skip steps. Run verification after each step. Stop on failure.');
104
+ return lines.join('\n');
105
+ }
106
+ function resolveInputs(workflow, input) {
107
+ const vars = {};
108
+ // Apply defaults from workflow definition
109
+ if (workflow.inputs) {
110
+ for (const [key, def] of Object.entries(workflow.inputs)) {
111
+ if (input[key] !== undefined) {
112
+ vars[key] = String(input[key]);
113
+ }
114
+ else if (def.default !== undefined) {
115
+ vars[key] = String(def.default);
116
+ }
117
+ else if (def.required) {
118
+ throw new Error(`Missing required input: ${key} (${def.description ?? 'no description'})`);
119
+ }
120
+ }
121
+ }
122
+ // Include any extra input vars not in the definition
123
+ for (const [key, val] of Object.entries(input)) {
124
+ if (!(key in vars)) {
125
+ vars[key] = val;
126
+ }
127
+ }
128
+ return vars;
129
+ }
130
+ //# sourceMappingURL=planner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"planner.js","sourceRoot":"","sources":["../../../src/engine/planner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { RoutesConfig, TaskInput, RouteResult } from '../types.js';
2
+ /**
3
+ * Deterministic task routing — no LLM judgment, pure rule matching.
4
+ *
5
+ * Priority: label match (exact) → keyword match (scored) → channel match → default
6
+ */
7
+ export declare function routeTask(config: RoutesConfig, task: TaskInput): RouteResult;
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Deterministic task routing — no LLM judgment, pure rule matching.
3
+ *
4
+ * Priority: label match (exact) → keyword match (scored) → channel match → default
5
+ */
6
+ export function routeTask(config, task) {
7
+ // 1. Label match (exact — highest priority)
8
+ if (task.labels?.length) {
9
+ for (const route of config.routes) {
10
+ if (route.match.labels?.some((l) => task.labels.includes(l))) {
11
+ return hit(route, 'exact');
12
+ }
13
+ }
14
+ }
15
+ // 2. Keyword match (scored — best match wins)
16
+ const desc = task.description.toLowerCase();
17
+ let best = null;
18
+ for (const route of config.routes) {
19
+ if (!route.match.keywords?.length)
20
+ continue;
21
+ const score = route.match.keywords.filter((k) => desc.includes(k.toLowerCase())).length;
22
+ if (score > 0 &&
23
+ (!best ||
24
+ score > best.score ||
25
+ (score === best.score &&
26
+ (route.priority ?? 0) > (best.route.priority ?? 0)))) {
27
+ best = { route, score };
28
+ }
29
+ }
30
+ if (best) {
31
+ return hit(best.route, 'keyword');
32
+ }
33
+ // 3. Channel match
34
+ if (task.channel) {
35
+ for (const route of config.routes) {
36
+ if (route.match.channel === task.channel) {
37
+ return hit(route, 'exact');
38
+ }
39
+ }
40
+ }
41
+ // 4. Default
42
+ return {
43
+ agent: config.default_agent,
44
+ workflow: config.default_workflow ?? 'default',
45
+ confidence: 'default',
46
+ };
47
+ }
48
+ function hit(route, confidence) {
49
+ return {
50
+ agent: route.agent,
51
+ workflow: route.workflow,
52
+ matched_route: route,
53
+ confidence,
54
+ };
55
+ }
56
+ //# sourceMappingURL=router.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"router.js","sourceRoot":"","sources":["../../../src/engine/router.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,MAAM,UAAU,SAAS,CACvB,MAAoB,EACpB,IAAe;IAEf,4CAA4C;IAC5C,IAAI,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC;QACxB,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAClC,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,MAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC9D,OAAO,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;YAC7B,CAAC;QACH,CAAC;IACH,CAAC;IAED,8CAA8C;IAC9C,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC;IAC5C,IAAI,IAAI,GAA2C,IAAI,CAAC;IAExD,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAClC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,EAAE,MAAM;YAAE,SAAS;QAC5C,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAC9C,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAC/B,CAAC,MAAM,CAAC;QACT,IACE,KAAK,GAAG,CAAC;YACT,CAAC,CAAC,IAAI;gBACJ,KAAK,GAAG,IAAI,CAAC,KAAK;gBAClB,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK;oBACnB,CAAC,KAAK,CAAC,QAAQ,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC,CAAC,EACxD,CAAC;YACD,IAAI,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;QAC1B,CAAC;IACH,CAAC;IAED,IAAI,IAAI,EAAE,CAAC;QACT,OAAO,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;IACpC,CAAC;IAED,mBAAmB;IACnB,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;QACjB,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAClC,IAAI,KAAK,CAAC,KAAK,CAAC,OAAO,KAAK,IAAI,CAAC,OAAO,EAAE,CAAC;gBACzC,OAAO,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;YAC7B,CAAC;QACH,CAAC;IACH,CAAC;IAED,aAAa;IACb,OAAO;QACL,KAAK,EAAE,MAAM,CAAC,aAAa;QAC3B,QAAQ,EAAE,MAAM,CAAC,gBAAgB,IAAI,SAAS;QAC9C,UAAU,EAAE,SAAS;KACtB,CAAC;AACJ,CAAC;AAED,SAAS,GAAG,CACV,KAAY,EACZ,UAA+B;IAE/B,OAAO;QACL,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,aAAa,EAAE,KAAK;QACpB,UAAU;KACX,CAAC;AACJ,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { StepVerification, VerifyResult } from '../types.js';
2
+ /**
3
+ * Run a verification command and check the result.
4
+ *
5
+ * Supports retries with delay. Matching is substring-based for `expect`,
6
+ * exact for `expect_exit`.
7
+ */
8
+ export declare function verifyStep(verify: StepVerification, vars: Record<string, string>, cwd?: string): VerifyResult;