@defai.digital/cli 13.4.0 → 13.4.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bootstrap.d.ts.map +1 -1
- package/dist/bootstrap.js +3 -2
- package/dist/bootstrap.js.map +1 -1
- package/dist/commands/agent.d.ts.map +1 -1
- package/dist/commands/agent.js +59 -38
- package/dist/commands/agent.js.map +1 -1
- package/dist/commands/cleanup.d.ts.map +1 -1
- package/dist/commands/cleanup.js +2 -15
- package/dist/commands/cleanup.js.map +1 -1
- package/dist/commands/config.d.ts +0 -10
- package/dist/commands/config.d.ts.map +1 -1
- package/dist/commands/config.js +99 -327
- package/dist/commands/config.js.map +1 -1
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +3 -5
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/list.d.ts.map +1 -1
- package/dist/commands/list.js +13 -34
- package/dist/commands/list.js.map +1 -1
- package/dist/commands/review.d.ts +1 -0
- package/dist/commands/review.d.ts.map +1 -1
- package/dist/commands/review.js +145 -2
- package/dist/commands/review.js.map +1 -1
- package/dist/commands/run.d.ts.map +1 -1
- package/dist/commands/run.js +34 -87
- package/dist/commands/run.js.map +1 -1
- package/dist/commands/session.d.ts.map +1 -1
- package/dist/commands/session.js +121 -341
- package/dist/commands/session.js.map +1 -1
- package/dist/commands/trace.d.ts.map +1 -1
- package/dist/commands/trace.js +45 -95
- package/dist/commands/trace.js.map +1 -1
- package/dist/parser.d.ts.map +1 -1
- package/dist/parser.js +11 -0
- package/dist/parser.js.map +1 -1
- package/dist/types.d.ts +1 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/utils/formatters.d.ts +29 -0
- package/dist/utils/formatters.d.ts.map +1 -1
- package/dist/utils/formatters.js +40 -0
- package/dist/utils/formatters.js.map +1 -1
- package/dist/web/api.d.ts.map +1 -1
- package/dist/web/api.js +81 -48
- package/dist/web/api.js.map +1 -1
- package/package.json +21 -21
package/dist/commands/run.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { createWorkflowRunner, createWorkflowLoader, findWorkflowDir, defaultStepExecutor, } from '@defai.digital/workflow-engine';
|
|
2
|
-
import {
|
|
2
|
+
import { TIMEOUT_AGENT_STEP_DEFAULT } from '@defai.digital/contracts';
|
|
3
3
|
import { getStepExecutor } from '../bootstrap.js';
|
|
4
|
-
|
|
4
|
+
import { success, failure, failureFromError, usageError } from '../utils/formatters.js';
|
|
5
5
|
const isTestEnv = process.env.VITEST === 'true' || process.env.NODE_ENV === 'test';
|
|
6
6
|
/**
|
|
7
7
|
* Handles the 'run' command - executes a workflow
|
|
@@ -9,149 +9,96 @@ const isTestEnv = process.env.VITEST === 'true' || process.env.NODE_ENV === 'tes
|
|
|
9
9
|
export async function runCommand(args, options) {
|
|
10
10
|
const workflowId = args[0] ?? options.workflowId;
|
|
11
11
|
if (workflowId === undefined) {
|
|
12
|
-
return
|
|
13
|
-
success: false,
|
|
14
|
-
message: 'Workflow ID is required. Usage: ax run <workflow-id>',
|
|
15
|
-
data: undefined,
|
|
16
|
-
exitCode: 1,
|
|
17
|
-
};
|
|
12
|
+
return usageError('ax run <workflow-id>');
|
|
18
13
|
}
|
|
19
14
|
try {
|
|
20
|
-
// Find workflow directory
|
|
21
15
|
const workflowDir = options.workflowDir ?? findWorkflowDir(process.cwd());
|
|
22
16
|
if (!workflowDir) {
|
|
23
|
-
return
|
|
24
|
-
success: false,
|
|
25
|
-
message: 'No workflow directory found. Create examples/workflows/ or use --workflow-dir.',
|
|
26
|
-
data: undefined,
|
|
27
|
-
exitCode: 1,
|
|
28
|
-
};
|
|
17
|
+
return failure('No workflow directory found. Create examples/workflows/ or use --workflow-dir.');
|
|
29
18
|
}
|
|
30
|
-
// Load workflow from file
|
|
31
19
|
const loader = createWorkflowLoader({ workflowsDir: workflowDir });
|
|
32
20
|
const workflow = await loader.load(workflowId);
|
|
33
21
|
if (!workflow) {
|
|
34
|
-
// Try to list available workflows for help
|
|
35
22
|
const available = await loader.loadAll();
|
|
36
23
|
const ids = available.map(wf => wf.workflowId).slice(0, 5).join(', ');
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
message: `Workflow "${workflowId}" not found.\n\nAvailable workflows: ${ids}${available.length > 5 ? '...' : ''}\nRun 'ax list' to see all workflows.`,
|
|
40
|
-
data: undefined,
|
|
41
|
-
exitCode: 1,
|
|
42
|
-
};
|
|
24
|
+
const more = available.length > 5 ? '...' : '';
|
|
25
|
+
return failure(`Workflow "${workflowId}" not found.\n\nAvailable workflows: ${ids}${more}\nRun 'ax list' to see all workflows.`);
|
|
43
26
|
}
|
|
44
|
-
// Parse input JSON
|
|
27
|
+
// Parse input JSON
|
|
45
28
|
let input = {};
|
|
46
29
|
if (options.input) {
|
|
47
30
|
try {
|
|
48
31
|
input = JSON.parse(options.input);
|
|
49
32
|
}
|
|
50
33
|
catch {
|
|
51
|
-
return
|
|
52
|
-
success: false,
|
|
53
|
-
message: 'Invalid JSON in --input parameter',
|
|
54
|
-
data: undefined,
|
|
55
|
-
exitCode: 1,
|
|
56
|
-
};
|
|
34
|
+
return failure('Invalid JSON in --input parameter');
|
|
57
35
|
}
|
|
58
36
|
}
|
|
59
37
|
if (options.verbose) {
|
|
60
38
|
console.log(`Loading workflow: ${workflow.workflowId}`);
|
|
61
39
|
console.log(` Name: ${workflow.name ?? workflowId}`);
|
|
62
40
|
console.log(` Version: ${workflow.version}`);
|
|
63
|
-
console.log(` Steps: ${workflow.steps.length}`);
|
|
64
|
-
console.log('');
|
|
41
|
+
console.log(` Steps: ${workflow.steps.length}\n`);
|
|
65
42
|
}
|
|
66
|
-
// Create workflow runner with step execution logging
|
|
67
43
|
const runner = createWorkflowRunner({
|
|
68
44
|
stepExecutor: createLoggingStepExecutor(options.verbose ?? false),
|
|
69
45
|
onStepStart: options.verbose
|
|
70
|
-
? (step) =>
|
|
46
|
+
? (step) => console.log(` → Starting step: ${step.stepId} (${step.type})`)
|
|
71
47
|
: undefined,
|
|
72
48
|
onStepComplete: options.verbose
|
|
73
|
-
? (step, result) =>
|
|
49
|
+
? (step, result) => console.log(` ${result.success ? '✓' : '✗'} Completed: ${step.stepId} (${result.durationMs}ms)`)
|
|
74
50
|
: undefined,
|
|
75
51
|
});
|
|
76
52
|
if (options.verbose) {
|
|
77
53
|
console.log('Executing workflow...\n');
|
|
78
54
|
}
|
|
79
|
-
// Execute workflow
|
|
80
55
|
const result = await runner.run(workflow, input);
|
|
81
|
-
// Format result message
|
|
82
56
|
const duration = (result.totalDurationMs / 1000).toFixed(2);
|
|
83
|
-
const stepSummary = result.stepResults.map(
|
|
57
|
+
const stepSummary = result.stepResults.map(s => `${s.stepId}: ${s.success ? '✓' : '✗'}`).join(', ');
|
|
58
|
+
const data = {
|
|
59
|
+
workflowId,
|
|
60
|
+
success: result.success,
|
|
61
|
+
durationMs: result.totalDurationMs,
|
|
62
|
+
output: result.output,
|
|
63
|
+
error: result.error,
|
|
64
|
+
steps: result.stepResults.map(s => ({
|
|
65
|
+
stepId: s.stepId,
|
|
66
|
+
success: s.success,
|
|
67
|
+
durationMs: s.durationMs,
|
|
68
|
+
error: s.error?.message,
|
|
69
|
+
})),
|
|
70
|
+
};
|
|
84
71
|
if (result.success) {
|
|
85
|
-
return {
|
|
86
|
-
success: true,
|
|
87
|
-
message: `Workflow "${workflowId}" completed successfully in ${duration}s\n\nSteps: ${stepSummary}`,
|
|
88
|
-
data: {
|
|
89
|
-
workflowId,
|
|
90
|
-
success: true,
|
|
91
|
-
durationMs: result.totalDurationMs,
|
|
92
|
-
output: result.output,
|
|
93
|
-
steps: result.stepResults.map((stepResult) => ({
|
|
94
|
-
stepId: stepResult.stepId,
|
|
95
|
-
success: stepResult.success,
|
|
96
|
-
durationMs: stepResult.durationMs,
|
|
97
|
-
})),
|
|
98
|
-
},
|
|
99
|
-
exitCode: 0,
|
|
100
|
-
};
|
|
101
|
-
}
|
|
102
|
-
else {
|
|
103
|
-
return {
|
|
104
|
-
success: false,
|
|
105
|
-
message: `Workflow "${workflowId}" failed: ${result.error?.message ?? 'Unknown error'}\n\nSteps: ${stepSummary}`,
|
|
106
|
-
data: {
|
|
107
|
-
workflowId,
|
|
108
|
-
success: false,
|
|
109
|
-
error: result.error,
|
|
110
|
-
steps: result.stepResults.map((stepResult) => ({
|
|
111
|
-
stepId: stepResult.stepId,
|
|
112
|
-
success: stepResult.success,
|
|
113
|
-
error: stepResult.error?.message,
|
|
114
|
-
})),
|
|
115
|
-
},
|
|
116
|
-
exitCode: 1,
|
|
117
|
-
};
|
|
72
|
+
return success(`Workflow "${workflowId}" completed successfully in ${duration}s\n\nSteps: ${stepSummary}`, data);
|
|
118
73
|
}
|
|
119
|
-
}
|
|
120
|
-
catch (error) {
|
|
121
74
|
return {
|
|
122
75
|
success: false,
|
|
123
|
-
message: `
|
|
124
|
-
data
|
|
76
|
+
message: `Workflow "${workflowId}" failed: ${result.error?.message ?? 'Unknown error'}\n\nSteps: ${stepSummary}`,
|
|
77
|
+
data,
|
|
125
78
|
exitCode: 1,
|
|
126
79
|
};
|
|
127
80
|
}
|
|
81
|
+
catch (error) {
|
|
82
|
+
return failureFromError('run workflow', error);
|
|
83
|
+
}
|
|
128
84
|
}
|
|
129
85
|
/**
|
|
130
86
|
* Creates a step executor that logs progress
|
|
131
|
-
* Uses the production step executor for real LLM calls in production,
|
|
132
|
-
* or the default placeholder executor in test environments.
|
|
133
87
|
*/
|
|
134
88
|
function createLoggingStepExecutor(verbose) {
|
|
135
|
-
// Use placeholder executor in test environment to avoid real LLM calls
|
|
136
89
|
const baseExecutor = isTestEnv
|
|
137
90
|
? defaultStepExecutor
|
|
138
91
|
: getStepExecutor({
|
|
139
92
|
defaultProvider: 'claude',
|
|
140
|
-
defaultTimeout:
|
|
93
|
+
defaultTimeout: TIMEOUT_AGENT_STEP_DEFAULT,
|
|
141
94
|
checkProviderHealth: false,
|
|
142
95
|
});
|
|
143
96
|
return async (step, context) => {
|
|
144
|
-
// Execute step (real LLM in prod, placeholder in tests)
|
|
145
97
|
const result = await baseExecutor(step, context);
|
|
146
|
-
// In verbose mode, show step details
|
|
147
98
|
if (verbose && result.output) {
|
|
148
99
|
const outputStr = JSON.stringify(result.output, null, 2);
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
}
|
|
152
|
-
else {
|
|
153
|
-
console.log(` Output: (${outputStr.length} chars)`);
|
|
154
|
-
}
|
|
100
|
+
const display = outputStr.length < 500 ? outputStr.replace(/\n/g, '\n ') : `(${outputStr.length} chars)`;
|
|
101
|
+
console.log(` Output: ${display}`);
|
|
155
102
|
}
|
|
156
103
|
return result;
|
|
157
104
|
};
|
package/dist/commands/run.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/commands/run.ts"],"names":[],"mappings":"AACA,OAAO,EACL,oBAAoB,EACpB,oBAAoB,EACpB,eAAe,EACf,mBAAmB,GACpB,MAAM,gCAAgC,CAAC;AAGxC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/commands/run.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/commands/session.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/commands/session.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAoC7D;;;;;;;;;;;GAWG;AACH,wBAAsB,cAAc,CAClC,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,EAAE,UAAU,GAClB,OAAO,CAAC,aAAa,CAAC,CAsBxB"}
|