@defai.digital/cli 13.4.1 → 13.4.3
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 +63 -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/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/dist/web/dashboard.js +1 -1
- package/package.json +21 -21
package/dist/commands/trace.js
CHANGED
|
@@ -1,61 +1,47 @@
|
|
|
1
|
-
import { LIMIT_DEFAULT
|
|
1
|
+
import { LIMIT_DEFAULT } from '@defai.digital/contracts';
|
|
2
2
|
import { getTraceStore } from '../bootstrap.js';
|
|
3
|
+
import { success, successJson, failure, failureFromError, formatList, } from '../utils/formatters.js';
|
|
3
4
|
/**
|
|
4
5
|
* Handles the 'trace' command - views trace information
|
|
5
6
|
*/
|
|
6
7
|
export async function traceCommand(args, options) {
|
|
7
8
|
const traceId = args[0] ?? options.traceId;
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
}
|
|
12
|
-
// Get specific trace
|
|
13
|
-
return getTrace(traceId, options);
|
|
9
|
+
return traceId === undefined
|
|
10
|
+
? listTraces(options)
|
|
11
|
+
: getTrace(traceId, options);
|
|
14
12
|
}
|
|
15
13
|
/**
|
|
16
14
|
* Lists recent traces
|
|
17
15
|
*/
|
|
18
16
|
async function listTraces(options) {
|
|
19
17
|
try {
|
|
20
|
-
|
|
21
|
-
const
|
|
18
|
+
const store = getTraceStore();
|
|
19
|
+
const summaries = await store.listTraces(options.limit ?? LIMIT_DEFAULT);
|
|
20
|
+
const traces = summaries.map(s => ({
|
|
21
|
+
traceId: s.traceId,
|
|
22
|
+
startTime: s.startTime,
|
|
23
|
+
endTime: s.endTime,
|
|
24
|
+
status: s.status,
|
|
25
|
+
eventCount: s.eventCount,
|
|
26
|
+
durationMs: s.durationMs,
|
|
27
|
+
}));
|
|
22
28
|
if (traces.length === 0) {
|
|
23
|
-
return
|
|
24
|
-
success: true,
|
|
25
|
-
message: 'No traces found.',
|
|
26
|
-
data: [],
|
|
27
|
-
exitCode: 0,
|
|
28
|
-
};
|
|
29
|
+
return success('No traces found.', []);
|
|
29
30
|
}
|
|
30
31
|
if (options.format === 'json') {
|
|
31
|
-
return
|
|
32
|
-
success: true,
|
|
33
|
-
message: undefined,
|
|
34
|
-
data: traces,
|
|
35
|
-
exitCode: 0,
|
|
36
|
-
};
|
|
32
|
+
return successJson(traces);
|
|
37
33
|
}
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
return
|
|
46
|
-
success: true,
|
|
47
|
-
message: [header, separator, ...rows].join('\n'),
|
|
48
|
-
data: traces,
|
|
49
|
-
exitCode: 0,
|
|
50
|
-
};
|
|
34
|
+
const table = formatList(traces, [
|
|
35
|
+
{ header: 'Trace ID', width: 36, getValue: t => t.traceId },
|
|
36
|
+
{ header: 'Start Time', width: 19, getValue: t => t.startTime.slice(0, 19) },
|
|
37
|
+
{ header: 'Status', width: 7, getValue: t => t.status },
|
|
38
|
+
{ header: 'Events', width: 6, getValue: t => String(t.eventCount) },
|
|
39
|
+
{ header: 'Duration', width: 10, getValue: t => t.durationMs !== undefined ? `${t.durationMs}ms` : 'N/A' },
|
|
40
|
+
]);
|
|
41
|
+
return success(table, traces);
|
|
51
42
|
}
|
|
52
43
|
catch (error) {
|
|
53
|
-
return
|
|
54
|
-
success: false,
|
|
55
|
-
message: `Failed to list traces: ${getErrorMessage(error)}`,
|
|
56
|
-
data: undefined,
|
|
57
|
-
exitCode: 1,
|
|
58
|
-
};
|
|
44
|
+
return failureFromError('list traces', error);
|
|
59
45
|
}
|
|
60
46
|
}
|
|
61
47
|
/**
|
|
@@ -63,76 +49,40 @@ async function listTraces(options) {
|
|
|
63
49
|
*/
|
|
64
50
|
async function getTrace(traceId, options) {
|
|
65
51
|
try {
|
|
66
|
-
const
|
|
52
|
+
const store = getTraceStore();
|
|
53
|
+
const events = await store.getTrace(traceId);
|
|
67
54
|
if (events.length === 0) {
|
|
68
|
-
return {
|
|
69
|
-
success: false,
|
|
70
|
-
message: `Trace not found: ${traceId}`,
|
|
71
|
-
data: undefined,
|
|
72
|
-
exitCode: 1,
|
|
73
|
-
};
|
|
55
|
+
return failure(`Trace not found: ${traceId}`);
|
|
74
56
|
}
|
|
57
|
+
const data = { traceId, events };
|
|
75
58
|
if (options.format === 'json') {
|
|
76
|
-
return
|
|
77
|
-
success: true,
|
|
78
|
-
message: undefined,
|
|
79
|
-
data: { traceId, events },
|
|
80
|
-
exitCode: 0,
|
|
81
|
-
};
|
|
59
|
+
return successJson(data);
|
|
82
60
|
}
|
|
83
61
|
// Format as timeline
|
|
84
62
|
const lines = [
|
|
85
63
|
`Trace: ${traceId}`,
|
|
86
|
-
`Events: ${
|
|
64
|
+
`Events: ${events.length}`,
|
|
87
65
|
'',
|
|
88
66
|
'Timeline:',
|
|
67
|
+
...events.map(e => formatEventLine(e, options.verbose)),
|
|
89
68
|
];
|
|
90
|
-
|
|
91
|
-
const seq = event.sequence !== undefined ? `[${String(event.sequence)}]` : '[-]';
|
|
92
|
-
const status = event.status !== undefined ? ` (${event.status})` : '';
|
|
93
|
-
const duration = event.durationMs !== undefined ? ` - ${String(event.durationMs)}ms` : '';
|
|
94
|
-
lines.push(` ${seq} ${event.type}${status}${duration}`);
|
|
95
|
-
if (options.verbose && event.payload !== undefined) {
|
|
96
|
-
lines.push(` Payload: ${JSON.stringify(event.payload)}`);
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
return {
|
|
100
|
-
success: true,
|
|
101
|
-
message: lines.join('\n'),
|
|
102
|
-
data: { traceId, events },
|
|
103
|
-
exitCode: 0,
|
|
104
|
-
};
|
|
69
|
+
return success(lines.join('\n'), data);
|
|
105
70
|
}
|
|
106
71
|
catch (error) {
|
|
107
|
-
return
|
|
108
|
-
success: false,
|
|
109
|
-
message: `Failed to get trace: ${getErrorMessage(error)}`,
|
|
110
|
-
data: undefined,
|
|
111
|
-
exitCode: 1,
|
|
112
|
-
};
|
|
72
|
+
return failureFromError('get trace', error);
|
|
113
73
|
}
|
|
114
74
|
}
|
|
115
75
|
/**
|
|
116
|
-
*
|
|
117
|
-
*/
|
|
118
|
-
async function getRecentTraces(limit) {
|
|
119
|
-
const store = getTraceStore();
|
|
120
|
-
const summaries = await store.listTraces(limit);
|
|
121
|
-
// Map TraceSummary from trace-domain to our local TraceSummary type
|
|
122
|
-
return summaries.map((summary) => ({
|
|
123
|
-
traceId: summary.traceId,
|
|
124
|
-
startTime: summary.startTime,
|
|
125
|
-
endTime: summary.endTime,
|
|
126
|
-
status: summary.status,
|
|
127
|
-
eventCount: summary.eventCount,
|
|
128
|
-
durationMs: summary.durationMs,
|
|
129
|
-
}));
|
|
130
|
-
}
|
|
131
|
-
/**
|
|
132
|
-
* Gets events for a specific trace from the trace store
|
|
76
|
+
* Formats a single trace event as a timeline line
|
|
133
77
|
*/
|
|
134
|
-
|
|
135
|
-
const
|
|
136
|
-
|
|
78
|
+
function formatEventLine(event, verbose) {
|
|
79
|
+
const seq = event.sequence !== undefined ? `[${event.sequence}]` : '[-]';
|
|
80
|
+
const status = event.status !== undefined ? ` (${event.status})` : '';
|
|
81
|
+
const duration = event.durationMs !== undefined ? ` - ${event.durationMs}ms` : '';
|
|
82
|
+
let line = ` ${seq} ${event.type}${status}${duration}`;
|
|
83
|
+
if (verbose && event.payload !== undefined) {
|
|
84
|
+
line += `\n Payload: ${JSON.stringify(event.payload)}`;
|
|
85
|
+
}
|
|
86
|
+
return line;
|
|
137
87
|
}
|
|
138
88
|
//# sourceMappingURL=trace.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"trace.js","sourceRoot":"","sources":["../../src/commands/trace.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,
|
|
1
|
+
{"version":3,"file":"trace.js","sourceRoot":"","sources":["../../src/commands/trace.ts"],"names":[],"mappings":"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"}
|
|
@@ -23,4 +23,33 @@ export declare function truncate(str: string, maxLength: number): string;
|
|
|
23
23
|
* Pads a string to a fixed width (for aligned output)
|
|
24
24
|
*/
|
|
25
25
|
export declare function padEnd(str: string, width: number): string;
|
|
26
|
+
import type { CommandResult } from '../types.js';
|
|
27
|
+
/**
|
|
28
|
+
* Creates a success CommandResult
|
|
29
|
+
*/
|
|
30
|
+
export declare function success(message: string, data?: unknown): CommandResult;
|
|
31
|
+
/**
|
|
32
|
+
* Creates a success CommandResult with JSON data (for --format json)
|
|
33
|
+
*/
|
|
34
|
+
export declare function successJson(data: unknown): CommandResult;
|
|
35
|
+
/**
|
|
36
|
+
* Creates a failure CommandResult
|
|
37
|
+
*/
|
|
38
|
+
export declare function failure(message: string, exitCode?: number): CommandResult;
|
|
39
|
+
/**
|
|
40
|
+
* Creates a failure CommandResult from an error
|
|
41
|
+
*/
|
|
42
|
+
export declare function failureFromError(action: string, error: unknown): CommandResult;
|
|
43
|
+
/**
|
|
44
|
+
* Creates a usage error CommandResult
|
|
45
|
+
*/
|
|
46
|
+
export declare function usageError(usage: string): CommandResult;
|
|
47
|
+
/**
|
|
48
|
+
* Formats a list with header and separator for CLI display
|
|
49
|
+
*/
|
|
50
|
+
export declare function formatList<T>(items: T[], columns: {
|
|
51
|
+
header: string;
|
|
52
|
+
width: number;
|
|
53
|
+
getValue: (item: T) => string;
|
|
54
|
+
}[]): string;
|
|
26
55
|
//# sourceMappingURL=formatters.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"formatters.d.ts","sourceRoot":"","sources":["../../src/utils/formatters.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAoBH;;GAEG;AACH,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAMjD;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAKjD;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAUjD;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAG/D;AAED;;GAEG;AACH,wBAAgB,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAEzD"}
|
|
1
|
+
{"version":3,"file":"formatters.d.ts","sourceRoot":"","sources":["../../src/utils/formatters.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAoBH;;GAEG;AACH,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAMjD;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAKjD;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAUjD;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAG/D;AAED;;GAEG;AACH,wBAAgB,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAEzD;AAMD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD;;GAEG;AACH,wBAAgB,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,aAAa,CAEtE;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,OAAO,GAAG,aAAa,CAExD;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,SAAI,GAAG,aAAa,CAEpE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,aAAa,CAG9E;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa,CAEvD;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,CAAC,EAC1B,KAAK,EAAE,CAAC,EAAE,EACV,OAAO,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,MAAM,CAAA;CAAE,EAAE,GAC1E,MAAM,CAOR"}
|
package/dist/utils/formatters.js
CHANGED
|
@@ -66,4 +66,44 @@ export function truncate(str, maxLength) {
|
|
|
66
66
|
export function padEnd(str, width) {
|
|
67
67
|
return str.padEnd(width);
|
|
68
68
|
}
|
|
69
|
+
/**
|
|
70
|
+
* Creates a success CommandResult
|
|
71
|
+
*/
|
|
72
|
+
export function success(message, data) {
|
|
73
|
+
return { success: true, message, data, exitCode: 0 };
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Creates a success CommandResult with JSON data (for --format json)
|
|
77
|
+
*/
|
|
78
|
+
export function successJson(data) {
|
|
79
|
+
return { success: true, message: undefined, data, exitCode: 0 };
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Creates a failure CommandResult
|
|
83
|
+
*/
|
|
84
|
+
export function failure(message, exitCode = 1) {
|
|
85
|
+
return { success: false, message, data: undefined, exitCode };
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Creates a failure CommandResult from an error
|
|
89
|
+
*/
|
|
90
|
+
export function failureFromError(action, error) {
|
|
91
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
92
|
+
return failure(`Failed to ${action}: ${msg}`);
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Creates a usage error CommandResult
|
|
96
|
+
*/
|
|
97
|
+
export function usageError(usage) {
|
|
98
|
+
return failure(`Usage: ${usage}`);
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Formats a list with header and separator for CLI display
|
|
102
|
+
*/
|
|
103
|
+
export function formatList(items, columns) {
|
|
104
|
+
const header = columns.map(c => c.header.padEnd(c.width)).join(' | ');
|
|
105
|
+
const separator = '-'.repeat(header.length);
|
|
106
|
+
const rows = items.map(item => columns.map(c => truncate(c.getValue(item), c.width).padEnd(c.width)).join(' | '));
|
|
107
|
+
return [header, separator, ...rows].join('\n');
|
|
108
|
+
}
|
|
69
109
|
//# sourceMappingURL=formatters.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"formatters.js","sourceRoot":"","sources":["../../src/utils/formatters.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,kBAAkB,EAClB,gBAAgB,EAChB,eAAe,GAChB,MAAM,0BAA0B,CAAC;AAElC,8BAA8B;AAC9B,MAAM,aAAa,GAAG,IAAI,CAAC;AAE3B,8BAA8B;AAC9B,MAAM,aAAa,GAAG,kBAAkB,GAAG,aAAa,CAAC;AAEzD,4BAA4B;AAC5B,MAAM,WAAW,GAAG,gBAAgB,GAAG,aAAa,CAAC;AAErD,2BAA2B;AAC3B,MAAM,UAAU,GAAG,eAAe,GAAG,aAAa,CAAC;AAEnD;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,EAAU;IACvC,IAAI,EAAE,GAAG,aAAa;QAAE,OAAO,GAAG,EAAE,IAAI,CAAC;IACzC,IAAI,EAAE,GAAG,aAAa;QAAE,OAAO,GAAG,CAAC,EAAE,GAAG,aAAa,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;IACrE,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,aAAa,CAAC,CAAC;IAC/C,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,aAAa,CAAC,GAAG,aAAa,CAAC,CAAC;IACjE,OAAO,GAAG,OAAO,KAAK,OAAO,GAAG,CAAC;AACnC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,KAAa;IACvC,IAAI,KAAK,GAAG,IAAI;QAAE,OAAO,GAAG,KAAK,GAAG,CAAC;IACrC,IAAI,KAAK,GAAG,IAAI,GAAG,IAAI;QAAE,OAAO,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;IACjE,IAAI,KAAK,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI;QAAE,OAAO,GAAG,CAAC,KAAK,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;IACjF,OAAO,GAAG,CAAC,KAAK,GAAG,CAAC,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;AAC1D,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,SAAS,CAAC,OAAe;IACvC,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,CAAC;IACxD,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,aAAa,CAAC,CAAC;IACnD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,WAAW,CAAC,CAAC;IAC/C,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,UAAU,CAAC,CAAC;IAE7C,IAAI,IAAI,GAAG,CAAC;QAAE,OAAO,GAAG,IAAI,OAAO,CAAC;IACpC,IAAI,KAAK,GAAG,CAAC;QAAE,OAAO,GAAG,KAAK,OAAO,CAAC;IACtC,IAAI,OAAO,GAAG,CAAC;QAAE,OAAO,GAAG,OAAO,OAAO,CAAC;IAC1C,OAAO,UAAU,CAAC;AACpB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,QAAQ,CAAC,GAAW,EAAE,SAAiB;IACrD,IAAI,GAAG,CAAC,MAAM,IAAI,SAAS;QAAE,OAAO,GAAG,CAAC;IACxC,OAAO,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC;AAC7C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,MAAM,CAAC,GAAW,EAAE,KAAa;IAC/C,OAAO,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC3B,CAAC"}
|
|
1
|
+
{"version":3,"file":"formatters.js","sourceRoot":"","sources":["../../src/utils/formatters.ts"],"names":[],"mappings":"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"}
|
package/dist/web/api.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/web/api.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AA8KjE;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,CAAC,GAAG,EAAE,eAAe,EAAE,GAAG,EAAE,cAAc,KAAK,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/web/api.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AA8KjE;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,CAAC,GAAG,EAAE,eAAe,EAAE,GAAG,EAAE,cAAc,KAAK,OAAO,CAAC,IAAI,CAAC,CA2G/F"}
|
package/dist/web/api.js
CHANGED
|
@@ -8,7 +8,7 @@ import * as os from 'node:os';
|
|
|
8
8
|
import * as fs from 'node:fs';
|
|
9
9
|
import * as path from 'node:path';
|
|
10
10
|
import { fileURLToPath } from 'node:url';
|
|
11
|
-
import { DATA_DIR_NAME, AGENTS_FILENAME } from '@defai.digital/contracts';
|
|
11
|
+
import { DATA_DIR_NAME, AGENTS_FILENAME, getErrorMessage } from '@defai.digital/contracts';
|
|
12
12
|
// Get the directory of this module (for finding bundled examples)
|
|
13
13
|
const __filename = fileURLToPath(import.meta.url);
|
|
14
14
|
const __dirname = path.dirname(__filename);
|
|
@@ -163,8 +163,12 @@ export function createAPIHandler() {
|
|
|
163
163
|
searchFilters.agentId = aId;
|
|
164
164
|
if (pType)
|
|
165
165
|
searchFilters.type = pType;
|
|
166
|
-
if (pLimit)
|
|
167
|
-
|
|
166
|
+
if (pLimit) {
|
|
167
|
+
const limit = parseInt(pLimit, 10);
|
|
168
|
+
if (!isNaN(limit) && limit > 0 && limit <= 200) {
|
|
169
|
+
searchFilters.limit = limit;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
168
172
|
response = await handleTraceSearch(searchFilters);
|
|
169
173
|
}
|
|
170
174
|
else {
|
|
@@ -200,14 +204,19 @@ export function createAPIHandler() {
|
|
|
200
204
|
return;
|
|
201
205
|
}
|
|
202
206
|
}
|
|
203
|
-
|
|
207
|
+
let statusCode = 200;
|
|
208
|
+
if (!response.success) {
|
|
209
|
+
const errorMsg = response.error ?? '';
|
|
210
|
+
statusCode = errorMsg.toLowerCase().includes('not found') ? 404 : 400;
|
|
211
|
+
}
|
|
212
|
+
res.writeHead(statusCode, { 'Content-Type': 'application/json' });
|
|
204
213
|
res.end(JSON.stringify(response));
|
|
205
214
|
}
|
|
206
215
|
catch (error) {
|
|
207
216
|
res.writeHead(500, { 'Content-Type': 'application/json' });
|
|
208
217
|
res.end(JSON.stringify({
|
|
209
218
|
success: false,
|
|
210
|
-
error: error
|
|
219
|
+
error: getErrorMessage(error, 'Internal server error'),
|
|
211
220
|
}));
|
|
212
221
|
}
|
|
213
222
|
};
|
|
@@ -321,7 +330,7 @@ async function handleAgentDetail(agentId) {
|
|
|
321
330
|
// Stats
|
|
322
331
|
stats: {
|
|
323
332
|
executionCount,
|
|
324
|
-
successRate: executionCount > 0 ? successCount / executionCount :
|
|
333
|
+
successRate: executionCount > 0 ? successCount / executionCount : 0,
|
|
325
334
|
avgDurationMs: executionCount > 0 ? Math.round(totalDurationMs / executionCount) : 0,
|
|
326
335
|
},
|
|
327
336
|
},
|
|
@@ -330,7 +339,7 @@ async function handleAgentDetail(agentId) {
|
|
|
330
339
|
catch (error) {
|
|
331
340
|
return {
|
|
332
341
|
success: false,
|
|
333
|
-
error: error
|
|
342
|
+
error: getErrorMessage(error, 'Failed to fetch agent details'),
|
|
334
343
|
};
|
|
335
344
|
}
|
|
336
345
|
}
|
|
@@ -531,7 +540,7 @@ async function handleTraceDetail(traceId) {
|
|
|
531
540
|
catch (error) {
|
|
532
541
|
return {
|
|
533
542
|
success: false,
|
|
534
|
-
error: error
|
|
543
|
+
error: getErrorMessage(error, 'Failed to fetch trace'),
|
|
535
544
|
};
|
|
536
545
|
}
|
|
537
546
|
}
|
|
@@ -580,7 +589,7 @@ async function handleWorkflowDetail(workflowId) {
|
|
|
580
589
|
catch (error) {
|
|
581
590
|
return {
|
|
582
591
|
success: false,
|
|
583
|
-
error: error
|
|
592
|
+
error: getErrorMessage(error, 'Failed to fetch workflow'),
|
|
584
593
|
};
|
|
585
594
|
}
|
|
586
595
|
}
|
|
@@ -651,7 +660,7 @@ async function handleProviderHistory(providerId) {
|
|
|
651
660
|
catch (error) {
|
|
652
661
|
return {
|
|
653
662
|
success: false,
|
|
654
|
-
error: error
|
|
663
|
+
error: getErrorMessage(error, 'Failed to fetch provider history'),
|
|
655
664
|
};
|
|
656
665
|
}
|
|
657
666
|
}
|
|
@@ -723,7 +732,7 @@ async function handleAgentHistory(agentId) {
|
|
|
723
732
|
catch (error) {
|
|
724
733
|
return {
|
|
725
734
|
success: false,
|
|
726
|
-
error: error
|
|
735
|
+
error: getErrorMessage(error, 'Failed to fetch agent history'),
|
|
727
736
|
};
|
|
728
737
|
}
|
|
729
738
|
}
|
|
@@ -780,7 +789,7 @@ async function handleTraceSearch(filters) {
|
|
|
780
789
|
catch (error) {
|
|
781
790
|
return {
|
|
782
791
|
success: false,
|
|
783
|
-
error: error
|
|
792
|
+
error: getErrorMessage(error, 'Failed to search traces'),
|
|
784
793
|
};
|
|
785
794
|
}
|
|
786
795
|
}
|
|
@@ -854,7 +863,7 @@ async function handleTraceTree(traceId) {
|
|
|
854
863
|
catch (error) {
|
|
855
864
|
return {
|
|
856
865
|
success: false,
|
|
857
|
-
error: error
|
|
866
|
+
error: getErrorMessage(error, 'Failed to get trace tree'),
|
|
858
867
|
};
|
|
859
868
|
}
|
|
860
869
|
}
|
|
@@ -963,7 +972,7 @@ async function handleWorkflowEvents(workflowId) {
|
|
|
963
972
|
catch (error) {
|
|
964
973
|
return {
|
|
965
974
|
success: false,
|
|
966
|
-
error: error
|
|
975
|
+
error: getErrorMessage(error, 'Failed to fetch workflow events'),
|
|
967
976
|
};
|
|
968
977
|
}
|
|
969
978
|
}
|
|
@@ -1057,45 +1066,69 @@ async function getTraceData() {
|
|
|
1057
1066
|
try {
|
|
1058
1067
|
const traceStore = getTraceStore();
|
|
1059
1068
|
const traces = await traceStore.listTraces(200); // Increased for histogram
|
|
1060
|
-
// Fetch first event of each trace to get command info
|
|
1069
|
+
// Fetch first event of each trace to get command info (only if name not stored)
|
|
1061
1070
|
const tracesWithNames = await Promise.all(traces.map(async (trace) => {
|
|
1062
|
-
|
|
1071
|
+
// Use stored name if available, otherwise fall back to default
|
|
1072
|
+
let name = trace.name ?? `Trace ${trace.traceId.slice(0, 8)}`;
|
|
1063
1073
|
let command;
|
|
1064
1074
|
let providers;
|
|
1065
|
-
|
|
1066
|
-
|
|
1067
|
-
|
|
1068
|
-
|
|
1069
|
-
const
|
|
1070
|
-
|
|
1071
|
-
|
|
1072
|
-
|
|
1073
|
-
command
|
|
1074
|
-
|
|
1075
|
-
|
|
1076
|
-
|
|
1077
|
-
|
|
1078
|
-
providers
|
|
1079
|
-
|
|
1080
|
-
|
|
1081
|
-
|
|
1082
|
-
|
|
1083
|
-
|
|
1084
|
-
|
|
1085
|
-
name
|
|
1086
|
-
|
|
1087
|
-
|
|
1088
|
-
|
|
1089
|
-
|
|
1090
|
-
|
|
1091
|
-
|
|
1092
|
-
|
|
1093
|
-
|
|
1075
|
+
// Only fetch events if we need to derive providers or name isn't stored
|
|
1076
|
+
if (!trace.name || !providers) {
|
|
1077
|
+
try {
|
|
1078
|
+
const events = await traceStore.getTrace(trace.traceId);
|
|
1079
|
+
const firstEvent = events[0];
|
|
1080
|
+
if (firstEvent) {
|
|
1081
|
+
const payload = firstEvent.payload;
|
|
1082
|
+
const context = firstEvent.context;
|
|
1083
|
+
// Extract command from payload
|
|
1084
|
+
if (payload?.command) {
|
|
1085
|
+
command = String(payload.command);
|
|
1086
|
+
}
|
|
1087
|
+
// Extract providers from payload (for discussions) or context (for single calls)
|
|
1088
|
+
if (payload?.providers && Array.isArray(payload.providers)) {
|
|
1089
|
+
providers = payload.providers;
|
|
1090
|
+
}
|
|
1091
|
+
else if (context?.providerId) {
|
|
1092
|
+
providers = [String(context.providerId)];
|
|
1093
|
+
}
|
|
1094
|
+
// Derive name from events only if not stored
|
|
1095
|
+
if (!trace.name) {
|
|
1096
|
+
if (payload?.agentId) {
|
|
1097
|
+
name = `ax agent run ${payload.agentId}`;
|
|
1098
|
+
}
|
|
1099
|
+
else if (context?.agentId) {
|
|
1100
|
+
name = `ax agent run ${context.agentId}`;
|
|
1101
|
+
}
|
|
1102
|
+
else if (payload?.topic) {
|
|
1103
|
+
const topic = String(payload.topic).slice(0, 40);
|
|
1104
|
+
name = `ax discuss "${topic}${String(payload.topic).length > 40 ? '...' : ''}"`;
|
|
1105
|
+
}
|
|
1106
|
+
else if (payload?.prompt) {
|
|
1107
|
+
const prompt = String(payload.prompt).slice(0, 40);
|
|
1108
|
+
name = `${command ?? 'ax call'} "${prompt}${String(payload.prompt).length > 40 ? '...' : ''}"`;
|
|
1109
|
+
}
|
|
1110
|
+
else if (command) {
|
|
1111
|
+
name = command;
|
|
1112
|
+
}
|
|
1113
|
+
else if (payload?.tool) {
|
|
1114
|
+
// MCP tool invocation (parallel_run, review_analyze, etc.)
|
|
1115
|
+
const tool = String(payload.tool).replace(/_/g, ' ');
|
|
1116
|
+
name = `ax ${tool}`;
|
|
1117
|
+
}
|
|
1118
|
+
else if (payload?.workflowId) {
|
|
1119
|
+
// Workflow execution
|
|
1120
|
+
const workflowName = payload.workflowName ? String(payload.workflowName) : String(payload.workflowId);
|
|
1121
|
+
name = `workflow ${workflowName}`;
|
|
1122
|
+
}
|
|
1123
|
+
else if (context?.workflowId) {
|
|
1124
|
+
name = `workflow ${context.workflowId}`;
|
|
1125
|
+
}
|
|
1126
|
+
}
|
|
1094
1127
|
}
|
|
1095
1128
|
}
|
|
1096
|
-
|
|
1097
|
-
|
|
1098
|
-
|
|
1129
|
+
catch {
|
|
1130
|
+
// Ignore errors fetching events
|
|
1131
|
+
}
|
|
1099
1132
|
}
|
|
1100
1133
|
return {
|
|
1101
1134
|
traceId: trace.traceId,
|