@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.
Files changed (41) hide show
  1. package/dist/bootstrap.d.ts.map +1 -1
  2. package/dist/bootstrap.js +3 -2
  3. package/dist/bootstrap.js.map +1 -1
  4. package/dist/commands/agent.d.ts.map +1 -1
  5. package/dist/commands/agent.js +63 -38
  6. package/dist/commands/agent.js.map +1 -1
  7. package/dist/commands/cleanup.d.ts.map +1 -1
  8. package/dist/commands/cleanup.js +2 -15
  9. package/dist/commands/cleanup.js.map +1 -1
  10. package/dist/commands/config.d.ts +0 -10
  11. package/dist/commands/config.d.ts.map +1 -1
  12. package/dist/commands/config.js +99 -327
  13. package/dist/commands/config.js.map +1 -1
  14. package/dist/commands/doctor.d.ts.map +1 -1
  15. package/dist/commands/doctor.js +3 -5
  16. package/dist/commands/doctor.js.map +1 -1
  17. package/dist/commands/list.d.ts.map +1 -1
  18. package/dist/commands/list.js +13 -34
  19. package/dist/commands/list.js.map +1 -1
  20. package/dist/commands/review.d.ts +1 -0
  21. package/dist/commands/review.d.ts.map +1 -1
  22. package/dist/commands/review.js +145 -2
  23. package/dist/commands/review.js.map +1 -1
  24. package/dist/commands/run.d.ts.map +1 -1
  25. package/dist/commands/run.js +34 -87
  26. package/dist/commands/run.js.map +1 -1
  27. package/dist/commands/session.d.ts.map +1 -1
  28. package/dist/commands/session.js +121 -341
  29. package/dist/commands/session.js.map +1 -1
  30. package/dist/commands/trace.d.ts.map +1 -1
  31. package/dist/commands/trace.js +45 -95
  32. package/dist/commands/trace.js.map +1 -1
  33. package/dist/utils/formatters.d.ts +29 -0
  34. package/dist/utils/formatters.d.ts.map +1 -1
  35. package/dist/utils/formatters.js +40 -0
  36. package/dist/utils/formatters.js.map +1 -1
  37. package/dist/web/api.d.ts.map +1 -1
  38. package/dist/web/api.js +81 -48
  39. package/dist/web/api.js.map +1 -1
  40. package/dist/web/dashboard.js +1 -1
  41. package/package.json +21 -21
@@ -1,61 +1,47 @@
1
- import { LIMIT_DEFAULT, getErrorMessage } from '@defai.digital/contracts';
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
- // If no trace ID, list recent traces
9
- if (traceId === undefined) {
10
- return listTraces(options);
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
- // Get traces (in real implementation, from trace store)
21
- const traces = await getRecentTraces(options.limit ?? LIMIT_DEFAULT);
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
- // Format as text table
39
- const header = 'Trace ID | Start Time | Status | Events | Duration';
40
- const separator = '-'.repeat(header.length);
41
- const rows = traces.map((trace) => {
42
- const duration = trace.durationMs !== undefined ? `${String(trace.durationMs)}ms` : 'N/A';
43
- return `${trace.traceId} | ${trace.startTime.slice(0, 19)} | ${trace.status.padEnd(7)} | ${String(trace.eventCount).padEnd(6)} | ${duration}`;
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 events = await getTraceEvents(traceId);
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: ${String(events.length)}`,
64
+ `Events: ${events.length}`,
87
65
  '',
88
66
  'Timeline:',
67
+ ...events.map(e => formatEventLine(e, options.verbose)),
89
68
  ];
90
- for (const event of events) {
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
- * Gets recent traces from the trace store
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
- async function getTraceEvents(traceId) {
135
- const store = getTraceStore();
136
- return store.getTrace(traceId);
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":"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"}
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"}
@@ -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":"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;AAQD;;GAEG;AACH,MAAM,UAAU,OAAO,CAAC,OAAe,EAAE,IAAc;IACrD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;AACvD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,IAAa;IACvC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;AAClE,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,OAAO,CAAC,OAAe,EAAE,QAAQ,GAAG,CAAC;IACnD,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC;AAChE,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,MAAc,EAAE,KAAc;IAC7D,MAAM,GAAG,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACnE,OAAO,OAAO,CAAC,aAAa,MAAM,KAAK,GAAG,EAAE,CAAC,CAAC;AAChD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,KAAa;IACtC,OAAO,OAAO,CAAC,UAAU,KAAK,EAAE,CAAC,CAAC;AACpC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CACxB,KAAU,EACV,OAA2E;IAE3E,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACtE,MAAM,SAAS,GAAG,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC5C,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAC5B,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAClF,CAAC;IACF,OAAO,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACjD,CAAC"}
@@ -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,CAiG/F"}
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
- searchFilters.limit = parseInt(pLimit, 10);
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
- res.writeHead(200, { 'Content-Type': 'application/json' });
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 instanceof Error ? error.message : 'Internal server 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 : 1.0,
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 instanceof Error ? error.message : 'Failed to fetch agent details',
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 instanceof Error ? error.message : 'Failed to fetch trace',
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 instanceof Error ? error.message : 'Failed to fetch workflow',
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 instanceof Error ? error.message : 'Failed to fetch provider history',
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 instanceof Error ? error.message : 'Failed to fetch agent history',
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 instanceof Error ? error.message : 'Failed to search traces',
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 instanceof Error ? error.message : 'Failed to get trace tree',
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 instanceof Error ? error.message : 'Failed to fetch workflow events',
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
- let name = `Trace ${trace.traceId.slice(0, 8)}`;
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
- try {
1066
- const events = await traceStore.getTrace(trace.traceId);
1067
- const firstEvent = events[0];
1068
- if (firstEvent) {
1069
- const payload = firstEvent.payload;
1070
- const context = firstEvent.context;
1071
- // Extract command from payload
1072
- if (payload?.command) {
1073
- command = String(payload.command);
1074
- name = command;
1075
- }
1076
- // Extract providers from payload (for discussions) or context (for single calls)
1077
- if (payload?.providers && Array.isArray(payload.providers)) {
1078
- providers = payload.providers;
1079
- }
1080
- else if (context?.providerId) {
1081
- providers = [String(context.providerId)];
1082
- }
1083
- // Add additional context for different command types
1084
- if (payload?.agentId) {
1085
- name = `ax agent run ${payload.agentId}`;
1086
- }
1087
- else if (payload?.topic) {
1088
- const topic = String(payload.topic).slice(0, 40);
1089
- name = `ax discuss "${topic}${String(payload.topic).length > 40 ? '...' : ''}"`;
1090
- }
1091
- else if (payload?.prompt) {
1092
- const prompt = String(payload.prompt).slice(0, 40);
1093
- name = `${command ?? 'ax call'} "${prompt}${String(payload.prompt).length > 40 ? '...' : ''}"`;
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
- catch {
1098
- // Ignore errors fetching events
1129
+ catch {
1130
+ // Ignore errors fetching events
1131
+ }
1099
1132
  }
1100
1133
  return {
1101
1134
  traceId: trace.traceId,