@aid-framework/cli 0.1.63 → 0.1.65

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.
@@ -1,5 +1,5 @@
1
1
  /**
2
- * `aid cost` — a cost and latency report read from the local trace sink.
2
+ * `aid cost` — a cost and latency report read from the local trace sink.
3
3
  *
4
4
  * The numbers already exist. `runtimes/{python,typescript}` write one JSONL span per line
5
5
  * whenever `AID_TRACE_DIR` is set, and those spans carry the GenAI token attributes and
@@ -10,13 +10,19 @@
10
10
  *
11
11
  * Exit codes follow the CLI's taxonomy rather than "did the bill look big":
12
12
  *
13
- * - `2` when there is nowhere to read from (no directory, or one that does not exist), or
14
- * when `--since` is not a date. The invocation or the environment is wrong, so no
15
- * judgement about the project has been made.
16
- * - `1` only when a trace file exists and could not be read. The report still prints what
17
- * was readable, because a partial report is more useful than none.
13
+ * - `2` when there is nowhere to read from (no directory, or one that does not exist), when
14
+ * `--since` is not a date, or when `--budget` is not a non-negative number. The
15
+ * invocation or the environment is wrong, so no judgement about the project has been
16
+ * made.
17
+ * - `1` when a trace file exists and could not be read, or when `--budget` was given and
18
+ * the measured spend exceeds it. The report still prints what was readable, because a
19
+ * partial report is more useful than none.
18
20
  * - `0` otherwise, including for an empty directory: a report of zero spans is true, and
19
21
  * the warning on stderr says why it is zero.
22
+ *
23
+ * `--budget` is a ceiling on the directory's total, not a price model: it compares the
24
+ * runtime's recorded `aid.cost.usd` against a number the caller chose, so the CLI still
25
+ * holds exactly one answer to "what does this cost".
20
26
  */
21
27
  import type { CliContext } from '../context.js';
22
28
  import type { CommandOutcome } from '../output.js';
@@ -24,6 +30,8 @@ export interface CostOptions {
24
30
  /** The directory to read; defaults to `$AID_TRACE_DIR`. */
25
31
  readonly dir: string | undefined;
26
32
  readonly since: string | undefined;
33
+ /** A ceiling in USD for the directory's total measured spend; unset means report only. */
34
+ readonly budget: string | undefined;
27
35
  }
28
36
  export declare function cost(context: CliContext, options: CostOptions): CommandOutcome;
29
37
  //# sourceMappingURL=cost.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"cost.d.ts","sourceRoot":"","sources":["../../src/commands/cost.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAKH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAIhD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAQnD,MAAM,WAAW,WAAW;IAC1B,2DAA2D;IAC3D,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;CACpC;AAyDD,wBAAgB,IAAI,CAAC,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,WAAW,GAAG,cAAc,CA4I9E"}
1
+ {"version":3,"file":"cost.d.ts","sourceRoot":"","sources":["../../src/commands/cost.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAIhD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAMnD,MAAM,WAAW,WAAW;IAC1B,2DAA2D;IAC3D,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,0FAA0F;IAC1F,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;CACrC;AAiED,wBAAgB,IAAI,CAAC,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,WAAW,GAAG,cAAc,CA4H9E"}
@@ -1,5 +1,5 @@
1
1
  /**
2
- * `aid cost` — a cost and latency report read from the local trace sink.
2
+ * `aid cost` — a cost and latency report read from the local trace sink.
3
3
  *
4
4
  * The numbers already exist. `runtimes/{python,typescript}` write one JSONL span per line
5
5
  * whenever `AID_TRACE_DIR` is set, and those spans carry the GenAI token attributes and
@@ -10,35 +10,34 @@
10
10
  *
11
11
  * Exit codes follow the CLI's taxonomy rather than "did the bill look big":
12
12
  *
13
- * - `2` when there is nowhere to read from (no directory, or one that does not exist), or
14
- * when `--since` is not a date. The invocation or the environment is wrong, so no
15
- * judgement about the project has been made.
16
- * - `1` only when a trace file exists and could not be read. The report still prints what
17
- * was readable, because a partial report is more useful than none.
13
+ * - `2` when there is nowhere to read from (no directory, or one that does not exist), when
14
+ * `--since` is not a date, or when `--budget` is not a non-negative number. The
15
+ * invocation or the environment is wrong, so no judgement about the project has been
16
+ * made.
17
+ * - `1` when a trace file exists and could not be read, or when `--budget` was given and
18
+ * the measured spend exceeds it. The report still prints what was readable, because a
19
+ * partial report is more useful than none.
18
20
  * - `0` otherwise, including for an empty directory: a report of zero spans is true, and
19
21
  * the warning on stderr says why it is zero.
22
+ *
23
+ * `--budget` is a ceiling on the directory's total, not a price model: it compares the
24
+ * runtime's recorded `aid.cost.usd` against a number the caller chose, so the CLI still
25
+ * holds exactly one answer to "what does this cost".
20
26
  */
21
- import { readdirSync, readFileSync, statSync } from 'node:fs';
22
- import { isAbsolute, join, relative, resolve, sep } from 'node:path';
23
27
  import { CLI_DIAGNOSTIC_CODES, cliError, cliWarning } from '../diagnostics.js';
24
28
  import { EXIT_FAILURE, EXIT_OK, EXIT_USAGE } from '../exit.js';
25
- import { outcome } from '../output.js';
26
- import { parseSince, parseTraceLines, summariseSpans } from '../trace.js';
27
- /** The variable the runtimes read. Named here, not imported, because it is a runtime knob. */
28
- const TRACE_DIR_ENV = 'AID_TRACE_DIR';
29
- function displayPath(cwd, absolute) {
30
- const path = relative(cwd, absolute);
31
- if (path === '')
32
- return '.';
33
- if (path.startsWith('..') || isAbsolute(path))
34
- return absolute;
35
- return path.split(sep).join('/');
36
- }
37
- function group(value) {
38
- return String(Math.trunc(value)).replace(/\B(?=(\d{3})+(?!\d))/g, ',');
39
- }
40
- function usd(value) {
41
- return `$${value.toFixed(6)}`;
29
+ import { group, outcome, usd } from '../output.js';
30
+ import { parseSince, summariseSpans } from '../trace.js';
31
+ import { confirmTraceDir, locateTraceDir, readTraceDir, TRACE_DIR_ENV } from '../trace-dir.js';
32
+ /**
33
+ * A budget is a plain non-negative decimal. `Number('')` is `0` and `Number('0x10')` is
34
+ * `16`, so the accepted shape is pinned here rather than left to the constructor.
35
+ */
36
+ function parseBudget(raw) {
37
+ const text = raw.trim();
38
+ if (!/^(\d+(\.\d+)?|\.\d+)$/.test(text))
39
+ return undefined;
40
+ return Number(text);
42
41
  }
43
42
  function modelLines(models) {
44
43
  if (models.length === 0)
@@ -52,22 +51,28 @@ function modelLines(models) {
52
51
  `${String(model.calls).padStart(4)} calls`,
53
52
  `${group(model.inputTokens).padStart(9)} in`,
54
53
  `${group(model.outputTokens).padStart(9)} out`,
55
- usd(model.costUsd).padStart(14),
54
+ usd(model.costUsd, 6).padStart(14),
56
55
  unpriced,
57
56
  ].join(' '));
58
57
  }
59
58
  return lines;
60
59
  }
61
- function reportLines(summary, dir, since) {
60
+ function reportLines(summary, dir, since, budget) {
62
61
  const scope = since === undefined ? '' : ` since ${since}`;
63
62
  const lines = [
64
63
  `dir: ${dir}`,
65
64
  `spans: ${group(summary.spans)} in ${group(summary.traces)} trace(s)${scope}`,
66
65
  summary.unpricedSpans === 0
67
- ? `cost: ${usd(summary.costUsd)}`
68
- : `cost: ${usd(summary.costUsd)} (${summary.unpricedSpans} unpriced span(s) not included)`,
66
+ ? `cost: ${usd(summary.costUsd, 6)}`
67
+ : `cost: ${usd(summary.costUsd, 6)} (${summary.unpricedSpans} unpriced span(s) not included)`,
69
68
  `tokens: ${group(summary.inputTokens)} input, ${group(summary.outputTokens)} output`,
70
69
  ];
70
+ if (budget !== undefined) {
71
+ const over = summary.costUsd - budget;
72
+ lines.push(over > 0
73
+ ? `budget: ${usd(budget, 6)} (over by ${usd(over, 6)})`
74
+ : `budget: ${usd(budget, 6)} (within)`);
75
+ }
71
76
  if (summary.latency !== undefined) {
72
77
  lines.push(`latency: p50 ${group(summary.latency.p50)}ms, p95 ${group(summary.latency.p95)}ms over ${group(summary.latency.samples)} model call(s)`);
73
78
  }
@@ -78,21 +83,10 @@ function reportLines(summary, dir, since) {
78
83
  }
79
84
  export function cost(context, options) {
80
85
  const command = 'cost';
81
- const configured = options.dir ?? context.env[TRACE_DIR_ENV]?.trim();
82
- if (configured === undefined || configured === '') {
83
- return outcome({
84
- command,
85
- exitCode: EXIT_USAGE,
86
- diagnostics: [
87
- cliError({
88
- code: CLI_DIAGNOSTIC_CODES.traceDirMissing,
89
- message: `no trace directory: \`aid cost\` needs one to read.`,
90
- hint: `Pass it as \`aid ${command} <dir>\`, or set ${TRACE_DIR_ENV} to the directory the runtime writes to.`,
91
- }),
92
- ],
93
- text: `aid: no trace directory. Pass one, or set ${TRACE_DIR_ENV}.\n`,
94
- });
95
- }
86
+ const located = locateTraceDir(context, options.dir, command);
87
+ if (located.kind === 'refused')
88
+ return located.outcome;
89
+ const shown = located.shown;
96
90
  let since;
97
91
  if (options.since !== undefined) {
98
92
  since = parseSince(options.since);
@@ -111,51 +105,29 @@ export function cost(context, options) {
111
105
  });
112
106
  }
113
107
  }
114
- const absolute = resolve(context.cwd, configured);
115
- const shown = displayPath(context.cwd, absolute);
116
- const diagnostics = [];
117
- let isDirectory = false;
118
- try {
119
- isDirectory = statSync(absolute).isDirectory();
120
- }
121
- catch {
122
- isDirectory = false;
123
- }
124
- if (!isDirectory) {
125
- return outcome({
126
- command,
127
- exitCode: EXIT_USAGE,
128
- diagnostics: [
129
- cliError({
130
- code: CLI_DIAGNOSTIC_CODES.traceDirNotFound,
131
- message: `"${shown}" is not a directory.`,
132
- hint: `Point \`aid ${command}\` at the directory ${TRACE_DIR_ENV} names, or unset it to be told which is missing.`,
133
- }),
134
- ],
135
- text: `aid: "${shown}" is not a directory.\n`,
136
- });
137
- }
138
- const names = readdirSync(absolute, { withFileTypes: true })
139
- .filter((entry) => entry.isFile() && entry.name.endsWith('.jsonl'))
140
- .map((entry) => entry.name)
141
- .sort();
142
- let skipped = 0;
143
- const all = [];
144
- let unreadable = 0;
145
- for (const name of names) {
146
- let text;
147
- try {
148
- text = readFileSync(join(absolute, name), 'utf8');
149
- }
150
- catch {
151
- // Counted, not thrown: one unreadable file should not hide the spans in the rest.
152
- unreadable += 1;
153
- continue;
108
+ const confirmed = confirmTraceDir(located, command);
109
+ if (confirmed.kind === 'refused')
110
+ return confirmed.outcome;
111
+ let budget;
112
+ if (options.budget !== undefined) {
113
+ budget = parseBudget(options.budget);
114
+ if (budget === undefined) {
115
+ return outcome({
116
+ command,
117
+ exitCode: EXIT_USAGE,
118
+ diagnostics: [
119
+ cliError({
120
+ code: CLI_DIAGNOSTIC_CODES.costBudgetInvalid,
121
+ message: `--budget "${options.budget}" is not a non-negative amount in USD.`,
122
+ hint: 'Use a decimal amount, such as 0.25 or 5. The value is compared against the cost the runtime recorded.',
123
+ }),
124
+ ],
125
+ text: `aid: --budget "${options.budget}" is not a non-negative amount in USD.\n`,
126
+ });
154
127
  }
155
- const parsed = parseTraceLines(text);
156
- all.push(...parsed.spans);
157
- skipped += parsed.skipped;
158
128
  }
129
+ const diagnostics = [];
130
+ const { files: names, spans: all, skipped, unreadable } = readTraceDir(confirmed.absolute);
159
131
  if (unreadable > 0) {
160
132
  diagnostics.push(cliError({
161
133
  code: CLI_DIAGNOSTIC_CODES.traceUnreadable,
@@ -178,7 +150,19 @@ export function cost(context, options) {
178
150
  }));
179
151
  }
180
152
  const summary = summariseSpans(all, since === undefined ? {} : { since });
181
- const exitCode = unreadable > 0 ? EXIT_FAILURE : EXIT_OK;
153
+ let budgetExceeded = false;
154
+ if (budget !== undefined && summary.costUsd > budget) {
155
+ budgetExceeded = true;
156
+ const unpriced = summary.unpricedSpans === 0
157
+ ? ''
158
+ : ` ${summary.unpricedSpans} span(s) recorded no cost, so the total is a lower bound.`;
159
+ diagnostics.push(cliError({
160
+ code: CLI_DIAGNOSTIC_CODES.costOverBudget,
161
+ message: `cost ${usd(summary.costUsd, 6)} exceeds the --budget ceiling ${usd(budget, 6)} by ${usd(summary.costUsd - budget, 6)}.`,
162
+ hint: `The report above names the model that spent it.${unpriced}`,
163
+ }));
164
+ }
165
+ const exitCode = unreadable > 0 || budgetExceeded ? EXIT_FAILURE : EXIT_OK;
182
166
  return outcome({
183
167
  command,
184
168
  exitCode,
@@ -193,13 +177,14 @@ export function cost(context, options) {
193
177
  outputTokens: summary.outputTokens,
194
178
  costUsd: summary.costUsd,
195
179
  unpricedSpans: summary.unpricedSpans,
180
+ ...(budget === undefined ? {} : { budgetUsd: budget, overBudget: budgetExceeded }),
196
181
  ...(summary.latency === undefined
197
182
  ? {}
198
183
  : { latencyMs: { p50: summary.latency.p50, p95: summary.latency.p95 } }),
199
184
  models: summary.models,
200
185
  },
201
186
  diagnostics,
202
- text: reportLines(summary, shown, since).join('\n'),
187
+ text: reportLines(summary, shown, since, budget).join('\n'),
203
188
  });
204
189
  }
205
190
  //# sourceMappingURL=cost.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"cost.js","sourceRoot":"","sources":["../../src/commands/cost.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cost.js","sourceRoot":"","sources":["../../src/commands/cost.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * `aid trace` — read a traced run back out of the local trace sink.
3
+ *
4
+ * The sink records *what happened*, not *what was said*: spans carry timing, kind, model,
5
+ * token counts and priced cost, but no prompts and no completions. So this command
6
+ * **inspects** a run; it does not replay one. A replay needs the request payloads, and
7
+ * inventing them -- asking the model again -- would answer a different question than "what
8
+ * happened here", while looking like an answer to it. Replay stays unimplemented until the
9
+ * sink records payloads, and the help text says so rather than letting a reader assume.
10
+ *
11
+ * Exit codes:
12
+ *
13
+ * - `2` when the invocation is wrong: no directory, a selector that matches no run or more
14
+ * than one, or `--run` together with `--all`.
15
+ * - `1` only when a trace file exists and could not be read. The tree still prints: what
16
+ * was readable is worth seeing.
17
+ * - `0` otherwise, including a directory with no runs yet -- "nothing ran" is a true
18
+ * answer, and the warning on stderr says why it is empty.
19
+ */
20
+ import type { CliContext } from '../context.js';
21
+ import type { CommandOutcome } from '../output.js';
22
+ export interface TraceOptions {
23
+ /** The directory to read; defaults to `$AID_TRACE_DIR`. */
24
+ readonly dir: string | undefined;
25
+ /** A full trace id, or an unambiguous prefix of one. */
26
+ readonly run: string | undefined;
27
+ /** Print every run's tree instead of the run list. */
28
+ readonly all: boolean;
29
+ }
30
+ export declare function trace(context: CliContext, options: TraceOptions): CommandOutcome;
31
+ //# sourceMappingURL=trace.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trace.d.ts","sourceRoot":"","sources":["../../src/commands/trace.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAIhD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAMnD,MAAM,WAAW,YAAY;IAC3B,2DAA2D;IAC3D,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,wDAAwD;IACxD,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,sDAAsD;IACtD,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC;CACvB;AAgJD,wBAAgB,KAAK,CAAC,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,YAAY,GAAG,cAAc,CA6GhF"}
@@ -0,0 +1,240 @@
1
+ /**
2
+ * `aid trace` — read a traced run back out of the local trace sink.
3
+ *
4
+ * The sink records *what happened*, not *what was said*: spans carry timing, kind, model,
5
+ * token counts and priced cost, but no prompts and no completions. So this command
6
+ * **inspects** a run; it does not replay one. A replay needs the request payloads, and
7
+ * inventing them -- asking the model again -- would answer a different question than "what
8
+ * happened here", while looking like an answer to it. Replay stays unimplemented until the
9
+ * sink records payloads, and the help text says so rather than letting a reader assume.
10
+ *
11
+ * Exit codes:
12
+ *
13
+ * - `2` when the invocation is wrong: no directory, a selector that matches no run or more
14
+ * than one, or `--run` together with `--all`.
15
+ * - `1` only when a trace file exists and could not be read. The tree still prints: what
16
+ * was readable is worth seeing.
17
+ * - `0` otherwise, including a directory with no runs yet -- "nothing ran" is a true
18
+ * answer, and the warning on stderr says why it is empty.
19
+ */
20
+ import { CLI_DIAGNOSTIC_CODES, cliError, cliWarning } from '../diagnostics.js';
21
+ import { EXIT_FAILURE, EXIT_OK, EXIT_USAGE } from '../exit.js';
22
+ import { group, outcome, usd } from '../output.js';
23
+ import { runsOf, treeRowsOf } from '../trace.js';
24
+ import { readTraceDir, resolveTraceDir, TRACE_DIR_ENV } from '../trace-dir.js';
25
+ /** What a reader wants to know about a run before opening it. */
26
+ function summaryOf(run) {
27
+ return {
28
+ traceId: run.traceId,
29
+ startedAt: run.startedAt,
30
+ durationMs: run.durationMs,
31
+ spans: run.spans.length,
32
+ errors: run.errors,
33
+ costUsd: run.costUsd,
34
+ unpricedSpans: run.unpricedSpans,
35
+ ...(run.root === undefined ? {} : { rootSpanId: run.root.span_id, rootName: run.root.name }),
36
+ };
37
+ }
38
+ function rowOf(row) {
39
+ const { facts } = row;
40
+ return {
41
+ spanId: row.span.span_id,
42
+ ...(row.span.parent_span_id == null ? {} : { parentSpanId: row.span.parent_span_id }),
43
+ name: row.span.name,
44
+ ...(row.span.kind === undefined ? {} : { kind: row.span.kind }),
45
+ depth: row.depth,
46
+ ...(row.offsetMs === undefined ? {} : { offsetMs: row.offsetMs }),
47
+ ...(row.span.started_at === undefined ? {} : { startedAt: row.span.started_at }),
48
+ ...(facts.durationMs === undefined ? {} : { durationMs: facts.durationMs }),
49
+ ...(facts.model === undefined ? {} : { model: facts.model }),
50
+ ...(facts.inputTokens === undefined ? {} : { inputTokens: facts.inputTokens }),
51
+ ...(facts.outputTokens === undefined ? {} : { outputTokens: facts.outputTokens }),
52
+ ...(facts.costUsd === undefined ? {} : { costUsd: facts.costUsd }),
53
+ ...(row.span.status?.message == null ? {} : { statusMessage: row.span.status.message }),
54
+ error: facts.error,
55
+ };
56
+ }
57
+ function maxNameWidth(rows) {
58
+ return Math.max(0, ...rows.map((row) => row.span.name.length));
59
+ }
60
+ function treeLines(rows) {
61
+ const width = maxNameWidth(rows);
62
+ return rows.map((row) => {
63
+ const indent = ' '.repeat(row.depth);
64
+ const offset = row.offsetMs === undefined ? '-' : `+${group(row.offsetMs)}ms`;
65
+ const duration = row.facts.durationMs === undefined ? '-' : `${group(row.facts.durationMs)}ms`;
66
+ const parts = [indent + row.span.name.padEnd(width), row.span.kind ?? '-'];
67
+ if (row.facts.model !== undefined) {
68
+ const tokens = row.facts.inputTokens === undefined && row.facts.outputTokens === undefined
69
+ ? ''
70
+ : ` ${group(row.facts.inputTokens ?? 0)}→${group(row.facts.outputTokens ?? 0)}`;
71
+ parts.push(row.facts.model + tokens);
72
+ }
73
+ if (row.facts.costUsd !== undefined)
74
+ parts.push(usd(row.facts.costUsd, 6));
75
+ if (row.facts.error) {
76
+ const message = row.span.status?.message;
77
+ parts.push(message == null || message === '' ? 'ERROR' : `ERROR ${message}`);
78
+ }
79
+ return `${offset.padStart(9)} ${duration.padStart(9)} ${parts.join(' ')}`;
80
+ });
81
+ }
82
+ function runHeader(run, spanCount) {
83
+ const label = run.root === undefined ? '(no single root)' : run.root.name;
84
+ const cost = run.unpricedSpans === 0
85
+ ? usd(run.costUsd, 6)
86
+ : `${usd(run.costUsd, 6)} + ${group(run.unpricedSpans)} unpriced`;
87
+ return [
88
+ `run: ${run.traceId} ${label}`,
89
+ `started: ${run.startedAt === '' ? '-' : run.startedAt}`,
90
+ `wall: ${group(run.durationMs)}ms spans: ${group(spanCount)} errors: ${group(run.errors)}`,
91
+ `cost: ${cost}`,
92
+ ];
93
+ }
94
+ function listLines(runs) {
95
+ if (runs.length === 0)
96
+ return ['no runs recorded.'];
97
+ const ids = Math.max(...runs.map((run) => run.traceId.length));
98
+ const lines = [`${group(runs.length)} run(s), newest first:`];
99
+ for (const run of runs) {
100
+ const label = run.root === undefined ? '-' : run.root.name;
101
+ const cost = run.unpricedSpans === 0 ? usd(run.costUsd, 6) : `${usd(run.costUsd, 6)}+`;
102
+ const errors = run.errors === 0 ? '' : ` ${group(run.errors)} ERROR`;
103
+ lines.push(` ${run.traceId.padEnd(ids)} ${run.startedAt.padEnd(24)} ${`${group(run.durationMs)}ms`.padStart(9)} ${`${group(run.spans.length)} spans`.padStart(10)} ${label} ${cost}${errors}`);
104
+ }
105
+ return lines;
106
+ }
107
+ /** Exact id first, then a unique prefix; ambiguity is reported, never guessed through. */
108
+ function selectRun(runs, selector) {
109
+ const exact = runs.find((run) => run.traceId === selector);
110
+ if (exact !== undefined)
111
+ return { run: exact };
112
+ const matches = runs.filter((run) => run.traceId.startsWith(selector)).map((run) => run.traceId);
113
+ if (matches.length === 1) {
114
+ const only = runs.find((run) => run.traceId === matches[0]);
115
+ if (only !== undefined)
116
+ return { run: only };
117
+ }
118
+ if (matches.length > 1)
119
+ return { matches };
120
+ return undefined;
121
+ }
122
+ function selectionRefusal(command, selector, matches) {
123
+ if (matches === undefined) {
124
+ return outcome({
125
+ command,
126
+ exitCode: EXIT_USAGE,
127
+ diagnostics: [
128
+ cliError({
129
+ code: CLI_DIAGNOSTIC_CODES.traceRunNotFound,
130
+ message: `no run starts with "${selector}".`,
131
+ hint: 'Run `aid trace` with no selector to list the runs in the directory, then pass an id or an unambiguous prefix.',
132
+ }),
133
+ ],
134
+ text: `aid: no run starts with "${selector}".\n`,
135
+ });
136
+ }
137
+ return outcome({
138
+ command,
139
+ exitCode: EXIT_USAGE,
140
+ diagnostics: [
141
+ cliError({
142
+ code: CLI_DIAGNOSTIC_CODES.traceRunAmbiguous,
143
+ message: `"${selector}" matches ${matches.length} runs: ${matches.join(', ')}.`,
144
+ hint: 'Pass a longer prefix, or the whole id.',
145
+ }),
146
+ ],
147
+ text: `aid: "${selector}" matches ${matches.length} runs. Pass a longer prefix.\n`,
148
+ });
149
+ }
150
+ export function trace(context, options) {
151
+ const command = 'trace';
152
+ if (options.run !== undefined && options.all) {
153
+ return outcome({
154
+ command,
155
+ exitCode: EXIT_USAGE,
156
+ diagnostics: [
157
+ cliError({
158
+ code: CLI_DIAGNOSTIC_CODES.traceFlagsConflict,
159
+ message: '--run and --all ask for different reports.',
160
+ hint: 'Pass --run <id> for one run, or --all for every run, not both.',
161
+ }),
162
+ ],
163
+ text: 'aid: --run and --all ask for different reports.\n',
164
+ });
165
+ }
166
+ const resolved = resolveTraceDir(context, options.dir, command, '--dir <dir>');
167
+ if (resolved.kind === 'refused')
168
+ return resolved.outcome;
169
+ const shown = resolved.shown;
170
+ const diagnostics = [];
171
+ const { files, spans, skipped, unreadable } = readTraceDir(resolved.absolute);
172
+ if (unreadable > 0) {
173
+ diagnostics.push(cliError({
174
+ code: CLI_DIAGNOSTIC_CODES.traceUnreadable,
175
+ message: `could not read ${unreadable} trace file(s) in "${shown}": this view covers only the files that were readable.`,
176
+ hint: 'Check the file permissions, or move the unreadable file out of the directory.',
177
+ }));
178
+ }
179
+ if (skipped > 0) {
180
+ diagnostics.push(cliWarning({
181
+ code: CLI_DIAGNOSTIC_CODES.traceMalformed,
182
+ message: `skipped ${skipped} line(s) in "${shown}" that are not complete span records.`,
183
+ hint: 'A trace file is appended to while it is read, so a truncated last line is normal; a large count is not.',
184
+ }));
185
+ }
186
+ if (files.length === 0) {
187
+ diagnostics.push(cliWarning({
188
+ code: CLI_DIAGNOSTIC_CODES.traceEmpty,
189
+ message: `no trace files in "${shown}".`,
190
+ hint: `The runtime writes one when ${TRACE_DIR_ENV} is set and a model call runs; check that this is the directory it names.`,
191
+ }));
192
+ }
193
+ const runs = runsOf(spans);
194
+ const exitCode = unreadable > 0 ? EXIT_FAILURE : EXIT_OK;
195
+ const base = { dir: shown, files: files.length, spans: spans.length };
196
+ if (options.run !== undefined) {
197
+ const selected = selectRun(runs, options.run);
198
+ if (selected === undefined || !('run' in selected)) {
199
+ return selectionRefusal(command, options.run, selected?.matches);
200
+ }
201
+ const rows = treeRowsOf(selected.run);
202
+ return outcome({
203
+ command,
204
+ exitCode,
205
+ fields: { ...base, run: summaryOf(selected.run), tree: rows.map(rowOf) },
206
+ diagnostics,
207
+ text: [...runHeader(selected.run, rows.length), '', ...treeLines(rows)].join('\n'),
208
+ });
209
+ }
210
+ if (runs.length === 0 && files.length > 0) {
211
+ diagnostics.push(cliWarning({
212
+ code: CLI_DIAGNOSTIC_CODES.traceNoRuns,
213
+ message: `"${shown}" has ${files.length} trace file(s) but no complete span records.`,
214
+ hint: 'Check that the runtime finished the call it was tracing, and that the files are not empty.',
215
+ }));
216
+ }
217
+ if (options.all) {
218
+ const blocks = [];
219
+ for (const run of runs)
220
+ blocks.push([...runHeader(run, run.spans.length), '', ...treeLines(treeRowsOf(run))].join('\n'));
221
+ return outcome({
222
+ command,
223
+ exitCode,
224
+ fields: {
225
+ ...base,
226
+ runs: runs.map((run) => ({ ...summaryOf(run), tree: treeRowsOf(run).map(rowOf) })),
227
+ },
228
+ diagnostics,
229
+ text: blocks.length === 0 ? 'no runs recorded.\n' : blocks.join('\n\n'),
230
+ });
231
+ }
232
+ return outcome({
233
+ command,
234
+ exitCode,
235
+ fields: { ...base, runs: runs.map(summaryOf) },
236
+ diagnostics,
237
+ text: listLines(runs).join('\n'),
238
+ });
239
+ }
240
+ //# sourceMappingURL=trace.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trace.js","sourceRoot":"","sources":["../../src/commands/trace.ts"],"names":[],"mappings":"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"}
@@ -54,6 +54,12 @@ export declare const CLI_DIAGNOSTIC_CODES: {
54
54
  readonly traceUnreadable: 'cli/trace-unreadable';
55
55
  readonly traceMalformed: 'cli/trace-malformed';
56
56
  readonly traceEmpty: 'cli/trace-empty';
57
+ readonly costBudgetInvalid: 'cli/cost-budget-invalid';
58
+ readonly costOverBudget: 'cli/cost-over-budget';
59
+ readonly traceRunNotFound: 'cli/trace-run-not-found';
60
+ readonly traceRunAmbiguous: 'cli/trace-run-ambiguous';
61
+ readonly traceNoRuns: 'cli/trace-no-runs';
62
+ readonly traceFlagsConflict: 'cli/trace-flags-conflict';
57
63
  readonly devPortInvalid: 'cli/dev-port-invalid';
58
64
  readonly devEntryMissing: 'cli/dev-entry-missing';
59
65
  readonly devUvicornMissing: 'cli/dev-uvicorn-missing';
@@ -1 +1 @@
1
- {"version":3,"file":"diagnostics.d.ts","sourceRoot":"","sources":["../src/diagnostics.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAGtD,gEAAgE;AAChE,MAAM,MAAM,aAAa,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;AAE/C,eAAO,MAAM,oBAAoB;aAC/B,cAAc,EAAE,qBAAqB;aACrC,aAAa,EAAE,oBAAoB;aACnC,mBAAmB,EAAE,2BAA2B;aAChD,aAAa,EAAE,oBAAoB;aACnC,aAAa,EAAE,qBAAqB;aACpC,kBAAkB,EAAE,0BAA0B;aAC9C,iBAAiB,EAAE,wBAAwB;aAC3C,iBAAiB,EAAE,wBAAwB;aAC3C,iBAAiB,EAAE,yBAAyB;aAC5C,oBAAoB,EAAE,4BAA4B;aAClD,iBAAiB,EAAE,wBAAwB;aAC3C,YAAY,EAAE,mBAAmB;aACjC,YAAY,EAAE,mBAAmB;aAGjC,eAAe,EAAE,sBAAsB;aACvC,kBAAkB,EAAE,yBAAyB;aAC7C,eAAe,EAAE,sBAAsB;aACvC,YAAY,EAAE,mBAAmB;aACjC,eAAe,EAAE,sBAAsB;aACvC,aAAa,EAAE,oBAAoB;aAGnC,uBAAuB,EAAE,+BAA+B;aACxD,sBAAsB,EAAE,8BAA8B;aACtD,eAAe,EAAE,uBAAuB;aACxC,sBAAsB,EAAE,8BAA8B;aACtD,iBAAiB,EAAE,yBAAyB;aAC5C,mBAAmB,EAAE,4BAA4B;aACjD,gBAAgB,EAAE,wBAAwB;aAC1C,eAAe,EAAE,uBAAuB;aACxC,eAAe,EAAE,uBAAuB;aACxC,cAAc,EAAE,sBAAsB;aACtC,kBAAkB,EAAE,0BAA0B;aAC9C,wBAAwB,EAAE,iCAAiC;aAI3D,kBAAkB,EAAE,0BAA0B;aAI9C,eAAe,EAAE,uBAAuB;aACxC,gBAAgB,EAAE,yBAAyB;aAC3C,iBAAiB,EAAE,yBAAyB;aAC5C,eAAe,EAAE,sBAAsB;aACvC,cAAc,EAAE,qBAAqB;aACrC,UAAU,EAAE,iBAAiB;aAI7B,cAAc,EAAE,sBAAsB;aACtC,eAAe,EAAE,uBAAuB;aACxC,iBAAiB,EAAE,yBAAyB;aAI5C,cAAc,EAAE,sBAAsB;aACtC,gBAAgB,EAAE,wBAAwB;aAC1C,eAAe,EAAE,wBAAwB;aACzC,gBAAgB,EAAE,wBAAwB;aAC1C,kBAAkB,EAAE,0BAA0B;aAC9C,qBAAqB,EAAE,6BAA6B;aACpD,WAAW,EAAE,kBAAkB;aAC/B,mBAAmB,EAAE,2BAA2B;aAChD,iBAAiB,EAAE,yBAAyB;aAI5C,yBAAyB,EAAE,iCAAiC;aAG5D,iBAAiB,EAAE,yBAAyB;CACpC,CAAC;AAEX,MAAM,MAAM,iBAAiB,GAAG,CAAC,OAAO,oBAAoB,CAAC,CAAC,MAAM,OAAO,oBAAoB,CAAC,CAAC;AAEjG,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,IAAI,EAAE,iBAAiB,CAAC;IACjC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,wBAAgB,QAAQ,CAAC,IAAI,EAAE,iBAAiB,GAAG,aAAa,CAO/D;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,iBAAiB,GAAG,aAAa,CAOjE"}
1
+ {"version":3,"file":"diagnostics.d.ts","sourceRoot":"","sources":["../src/diagnostics.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAGtD,gEAAgE;AAChE,MAAM,MAAM,aAAa,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;AAE/C,eAAO,MAAM,oBAAoB;aAC/B,cAAc,EAAE,qBAAqB;aACrC,aAAa,EAAE,oBAAoB;aACnC,mBAAmB,EAAE,2BAA2B;aAChD,aAAa,EAAE,oBAAoB;aACnC,aAAa,EAAE,qBAAqB;aACpC,kBAAkB,EAAE,0BAA0B;aAC9C,iBAAiB,EAAE,wBAAwB;aAC3C,iBAAiB,EAAE,wBAAwB;aAC3C,iBAAiB,EAAE,yBAAyB;aAC5C,oBAAoB,EAAE,4BAA4B;aAClD,iBAAiB,EAAE,wBAAwB;aAC3C,YAAY,EAAE,mBAAmB;aACjC,YAAY,EAAE,mBAAmB;aAGjC,eAAe,EAAE,sBAAsB;aACvC,kBAAkB,EAAE,yBAAyB;aAC7C,eAAe,EAAE,sBAAsB;aACvC,YAAY,EAAE,mBAAmB;aACjC,eAAe,EAAE,sBAAsB;aACvC,aAAa,EAAE,oBAAoB;aAGnC,uBAAuB,EAAE,+BAA+B;aACxD,sBAAsB,EAAE,8BAA8B;aACtD,eAAe,EAAE,uBAAuB;aACxC,sBAAsB,EAAE,8BAA8B;aACtD,iBAAiB,EAAE,yBAAyB;aAC5C,mBAAmB,EAAE,4BAA4B;aACjD,gBAAgB,EAAE,wBAAwB;aAC1C,eAAe,EAAE,uBAAuB;aACxC,eAAe,EAAE,uBAAuB;aACxC,cAAc,EAAE,sBAAsB;aACtC,kBAAkB,EAAE,0BAA0B;aAC9C,wBAAwB,EAAE,iCAAiC;aAI3D,kBAAkB,EAAE,0BAA0B;aAI9C,eAAe,EAAE,uBAAuB;aACxC,gBAAgB,EAAE,yBAAyB;aAC3C,iBAAiB,EAAE,yBAAyB;aAC5C,eAAe,EAAE,sBAAsB;aACvC,cAAc,EAAE,qBAAqB;aACrC,UAAU,EAAE,iBAAiB;aAI7B,iBAAiB,EAAE,yBAAyB;aAC5C,cAAc,EAAE,sBAAsB;aAGtC,gBAAgB,EAAE,yBAAyB;aAC3C,iBAAiB,EAAE,yBAAyB;aAC5C,WAAW,EAAE,mBAAmB;aAChC,kBAAkB,EAAE,0BAA0B;aAI9C,cAAc,EAAE,sBAAsB;aACtC,eAAe,EAAE,uBAAuB;aACxC,iBAAiB,EAAE,yBAAyB;aAI5C,cAAc,EAAE,sBAAsB;aACtC,gBAAgB,EAAE,wBAAwB;aAC1C,eAAe,EAAE,wBAAwB;aACzC,gBAAgB,EAAE,wBAAwB;aAC1C,kBAAkB,EAAE,0BAA0B;aAC9C,qBAAqB,EAAE,6BAA6B;aACpD,WAAW,EAAE,kBAAkB;aAC/B,mBAAmB,EAAE,2BAA2B;aAChD,iBAAiB,EAAE,yBAAyB;aAI5C,yBAAyB,EAAE,iCAAiC;aAG5D,iBAAiB,EAAE,yBAAyB;CACpC,CAAC;AAEX,MAAM,MAAM,iBAAiB,GAAG,CAAC,OAAO,oBAAoB,CAAC,CAAC,MAAM,OAAO,oBAAoB,CAAC,CAAC;AAEjG,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,IAAI,EAAE,iBAAiB,CAAC;IACjC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,wBAAgB,QAAQ,CAAC,IAAI,EAAE,iBAAiB,GAAG,aAAa,CAO/D;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,iBAAiB,GAAG,aAAa,CAOjE"}