agent-inspect 0.1.0 → 0.1.1
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/README.md +5 -11
- package/package.json +12 -15
- package/packages/cli/dist/index.cjs +17 -14
- package/packages/cli/dist/index.cjs.map +1 -1
- package/packages/cli/dist/index.mjs +17 -14
- package/packages/cli/dist/index.mjs.map +1 -1
package/README.md
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
# agent-inspect
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
agent-inspect is a local-first execution-tree debugger for TypeScript AI agents.
|
|
4
4
|
|
|
5
5
|
## Why
|
|
6
6
|
|
|
7
7
|
AI agents are multi-step. Console logs are flat.
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
agent-inspect turns runs into structured execution trees with JSONL traces and CLI inspection.
|
|
10
10
|
|
|
11
|
-
|
|
11
|
+
agent-inspect is designed for inner-loop debugging, not as a replacement for production observability platforms.
|
|
12
12
|
|
|
13
13
|
## What you get
|
|
14
14
|
|
|
@@ -186,7 +186,7 @@ try {
|
|
|
186
186
|
}
|
|
187
187
|
```
|
|
188
188
|
|
|
189
|
-
|
|
189
|
+
agent-inspect records the failed step, writes it to the trace file, and still rethrows the original error.
|
|
190
190
|
|
|
191
191
|
### Example 4: `observe()` wrapper
|
|
192
192
|
|
|
@@ -249,7 +249,7 @@ node packages/cli/dist/index.cjs view run_abc123
|
|
|
249
249
|
|
|
250
250
|
## Local traces
|
|
251
251
|
|
|
252
|
-
|
|
252
|
+
agent-inspect writes one JSONL file per run.
|
|
253
253
|
|
|
254
254
|
Default location:
|
|
255
255
|
|
|
@@ -331,9 +331,3 @@ pnpm build
|
|
|
331
331
|
pnpm test
|
|
332
332
|
pnpm test:all
|
|
333
333
|
```
|
|
334
|
-
|
|
335
|
-
## More context
|
|
336
|
-
|
|
337
|
-
- [Examples roadmap](docs/EXAMPLES_ROADMAP.md)
|
|
338
|
-
- [Console log case study](docs/CASE_STUDY_CONSOLE_LOG_TO_AGENT_INSPECT.md)
|
|
339
|
-
- [Product requirements](docs/AGENT_INSPECT_PRD_FINAL.md)
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "agent-inspect",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.1",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"description": "Local-first execution-tree debugger for TypeScript AI agents",
|
|
@@ -12,7 +12,6 @@
|
|
|
12
12
|
"url": "https://github.com/rajudandigam/agent-inspect/issues"
|
|
13
13
|
},
|
|
14
14
|
"homepage": "https://github.com/rajudandigam/agent-inspect#readme",
|
|
15
|
-
"packageManager": "pnpm@9.15.0",
|
|
16
15
|
"main": "./packages/core/dist/index.cjs",
|
|
17
16
|
"module": "./packages/core/dist/index.mjs",
|
|
18
17
|
"types": "./packages/core/dist/index.d.ts",
|
|
@@ -51,6 +50,16 @@
|
|
|
51
50
|
"nanoid": "^5.0.9",
|
|
52
51
|
"commander": "^12.1.0"
|
|
53
52
|
},
|
|
53
|
+
"devDependencies": {
|
|
54
|
+
"@changesets/cli": "^2.27.10",
|
|
55
|
+
"@size-limit/preset-small-lib": "^11.1.6",
|
|
56
|
+
"@types/node": "^22.10.2",
|
|
57
|
+
"@vitest/coverage-v8": "^2.1.8",
|
|
58
|
+
"size-limit": "^11.1.6",
|
|
59
|
+
"tsup": "^8.3.5",
|
|
60
|
+
"typescript": "^5.7.2",
|
|
61
|
+
"vitest": "^2.1.8"
|
|
62
|
+
},
|
|
54
63
|
"scripts": {
|
|
55
64
|
"clean": "pnpm -r exec -- rm -rf dist",
|
|
56
65
|
"build": "pnpm exec tsup --config tsup.core.config.ts && pnpm exec tsup --config tsup.cli.config.ts",
|
|
@@ -61,22 +70,10 @@
|
|
|
61
70
|
"size": "size-limit --config size-limit.config.mjs",
|
|
62
71
|
"test:all": "pnpm run typecheck && pnpm run test && pnpm run build && pnpm run size",
|
|
63
72
|
"prepublish:checks": "pnpm run typecheck && pnpm run test && pnpm run build && pnpm run size && pnpm run pack:smoke",
|
|
64
|
-
"prepublishOnly": "pnpm run prepublish:checks",
|
|
65
|
-
"prepack": "pnpm run clean && pnpm run build",
|
|
66
73
|
"pack:dry-run": "pnpm run build && npm pack --dry-run",
|
|
67
74
|
"pack:smoke": "pnpm run build && node scripts/package-smoke.mjs",
|
|
68
75
|
"examples:check": "pnpm install && pnpm --filter agent-inspect-example-01-basic run start",
|
|
69
76
|
"changeset": "changeset",
|
|
70
77
|
"release": "changeset publish"
|
|
71
|
-
},
|
|
72
|
-
"devDependencies": {
|
|
73
|
-
"@changesets/cli": "^2.27.10",
|
|
74
|
-
"@size-limit/preset-small-lib": "^11.1.6",
|
|
75
|
-
"@types/node": "^22.10.2",
|
|
76
|
-
"@vitest/coverage-v8": "^2.1.8",
|
|
77
|
-
"size-limit": "^11.1.6",
|
|
78
|
-
"tsup": "^8.3.5",
|
|
79
|
-
"typescript": "^5.7.2",
|
|
80
|
-
"vitest": "^2.1.8"
|
|
81
78
|
}
|
|
82
|
-
}
|
|
79
|
+
}
|
|
@@ -18,6 +18,7 @@ var path__default = /*#__PURE__*/_interopDefault(path);
|
|
|
18
18
|
var os__default = /*#__PURE__*/_interopDefault(os);
|
|
19
19
|
var chalk__default = /*#__PURE__*/_interopDefault(chalk);
|
|
20
20
|
|
|
21
|
+
// packages/core/src/types.ts
|
|
21
22
|
var STEP_TYPES = [
|
|
22
23
|
"run",
|
|
23
24
|
"llm",
|
|
@@ -236,7 +237,7 @@ function runWithStepContext(stepId, fn) {
|
|
|
236
237
|
});
|
|
237
238
|
});
|
|
238
239
|
}
|
|
239
|
-
function
|
|
240
|
+
function isRecord(value) {
|
|
240
241
|
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
241
242
|
}
|
|
242
243
|
function nonEmptyString(value) {
|
|
@@ -247,7 +248,7 @@ function finiteNumber(value) {
|
|
|
247
248
|
}
|
|
248
249
|
function optionalErrorInfo(value) {
|
|
249
250
|
if (value === void 0) return true;
|
|
250
|
-
if (!
|
|
251
|
+
if (!isRecord(value)) return false;
|
|
251
252
|
if (typeof value.message !== "string") return false;
|
|
252
253
|
if ("stack" in value && value.stack !== void 0) {
|
|
253
254
|
if (typeof value.stack !== "string") return false;
|
|
@@ -255,7 +256,7 @@ function optionalErrorInfo(value) {
|
|
|
255
256
|
return true;
|
|
256
257
|
}
|
|
257
258
|
function validateEvent(event) {
|
|
258
|
-
if (!
|
|
259
|
+
if (!isRecord(event)) return false;
|
|
259
260
|
if (event.schemaVersion !== "0.1") return false;
|
|
260
261
|
if (!finiteNumber(event.timestamp)) return false;
|
|
261
262
|
if (typeof event.event !== "string") return false;
|
|
@@ -264,7 +265,7 @@ function validateEvent(event) {
|
|
|
264
265
|
if (!nonEmptyString(event.runId) || !nonEmptyString(event.name) || !finiteNumber(event.startTime)) {
|
|
265
266
|
return false;
|
|
266
267
|
}
|
|
267
|
-
if (event.metadata !== void 0 && !
|
|
268
|
+
if (event.metadata !== void 0 && !isRecord(event.metadata)) {
|
|
268
269
|
return false;
|
|
269
270
|
}
|
|
270
271
|
return true;
|
|
@@ -279,7 +280,7 @@ function validateEvent(event) {
|
|
|
279
280
|
if (event.parentId !== void 0 && typeof event.parentId !== "string") {
|
|
280
281
|
return false;
|
|
281
282
|
}
|
|
282
|
-
if (event.metadata !== void 0 && !
|
|
283
|
+
if (event.metadata !== void 0 && !isRecord(event.metadata)) {
|
|
283
284
|
return false;
|
|
284
285
|
}
|
|
285
286
|
return true;
|
|
@@ -493,13 +494,15 @@ function printFailedAt(stepName) {
|
|
|
493
494
|
} catch {
|
|
494
495
|
}
|
|
495
496
|
}
|
|
497
|
+
|
|
498
|
+
// packages/core/src/step.ts
|
|
496
499
|
function normalizeStepName(name) {
|
|
497
500
|
if (typeof name !== "string" || name.trim() === "") {
|
|
498
501
|
return "unnamed-step";
|
|
499
502
|
}
|
|
500
503
|
return truncateName(name.trim(), 100);
|
|
501
504
|
}
|
|
502
|
-
async function
|
|
505
|
+
async function safeInstrumentation(label, op) {
|
|
503
506
|
try {
|
|
504
507
|
await Promise.resolve(op());
|
|
505
508
|
} catch (e) {
|
|
@@ -522,7 +525,7 @@ async function stepImpl(name, fn, options) {
|
|
|
522
525
|
const stepType = options?.type ?? "logic";
|
|
523
526
|
const metadata = options?.metadata;
|
|
524
527
|
const startTime = Date.now();
|
|
525
|
-
await
|
|
528
|
+
await safeInstrumentation("writeTraceEvent(step_started)", async () => {
|
|
526
529
|
const started = {
|
|
527
530
|
schemaVersion: "0.1",
|
|
528
531
|
event: "step_started",
|
|
@@ -537,7 +540,7 @@ async function stepImpl(name, fn, options) {
|
|
|
537
540
|
};
|
|
538
541
|
await writeTraceEvent(started, context.traceDir);
|
|
539
542
|
});
|
|
540
|
-
await
|
|
543
|
+
await safeInstrumentation("printStepStart", () => {
|
|
541
544
|
printStepStart(stepName, renderDepth);
|
|
542
545
|
});
|
|
543
546
|
let result;
|
|
@@ -549,7 +552,7 @@ async function stepImpl(name, fn, options) {
|
|
|
549
552
|
const endTime2 = Date.now();
|
|
550
553
|
const durationMs2 = endTime2 - startTime;
|
|
551
554
|
const formatted = formatError(userError);
|
|
552
|
-
await
|
|
555
|
+
await safeInstrumentation("writeTraceEvent(step_completed error)", async () => {
|
|
553
556
|
const completed = {
|
|
554
557
|
schemaVersion: "0.1",
|
|
555
558
|
event: "step_completed",
|
|
@@ -563,20 +566,20 @@ async function stepImpl(name, fn, options) {
|
|
|
563
566
|
};
|
|
564
567
|
await writeTraceEvent(completed, context.traceDir);
|
|
565
568
|
});
|
|
566
|
-
await
|
|
569
|
+
await safeInstrumentation("printStepComplete(error)", () => {
|
|
567
570
|
printStepComplete(stepName, durationMs2, "error", renderDepth);
|
|
568
571
|
});
|
|
569
|
-
await
|
|
572
|
+
await safeInstrumentation("printError", () => {
|
|
570
573
|
printError(formatted, renderDepth);
|
|
571
574
|
});
|
|
572
|
-
await
|
|
575
|
+
await safeInstrumentation("printFailedAt", () => {
|
|
573
576
|
printFailedAt(stepName);
|
|
574
577
|
});
|
|
575
578
|
throw userError;
|
|
576
579
|
}
|
|
577
580
|
const endTime = Date.now();
|
|
578
581
|
const durationMs = endTime - startTime;
|
|
579
|
-
await
|
|
582
|
+
await safeInstrumentation("writeTraceEvent(step_completed success)", async () => {
|
|
580
583
|
const completed = {
|
|
581
584
|
schemaVersion: "0.1",
|
|
582
585
|
event: "step_completed",
|
|
@@ -589,7 +592,7 @@ async function stepImpl(name, fn, options) {
|
|
|
589
592
|
};
|
|
590
593
|
await writeTraceEvent(completed, context.traceDir);
|
|
591
594
|
});
|
|
592
|
-
await
|
|
595
|
+
await safeInstrumentation("printStepComplete(success)", () => {
|
|
593
596
|
printStepComplete(stepName, durationMs, "success", renderDepth);
|
|
594
597
|
});
|
|
595
598
|
return result;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../core/src/types.ts","../../core/src/utils.ts","../../core/src/context.ts","../../core/src/storage.ts","../../core/src/terminal.ts","../../core/src/step.ts","../src/list.ts","../src/view.ts","../src/index.ts"],"names":["path","os","nanoid","mkdir","AsyncLocalStorage","isRecord","appendFile","readFile","readdir","stat","chalk","safeInstrumentation","endTime","durationMs","Command","Option","fileURLToPath","realpathSync"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Discriminator for what kind of work a {@link Step} represents.\n * `\"decision\"` captures agent branching/choices; other values cover runs, LLM calls, tools, and user-defined steps.\n */\nexport type StepType =\n | \"run\"\n | \"llm\"\n | \"tool\"\n | \"decision\"\n | \"logic\"\n | \"state\"\n | \"custom\";\n\n/** Lifecycle state of a single {@link Step}. */\nexport type StepStatus = \"running\" | \"success\" | \"error\";\n\n/** Lifecycle state of an entire {@link Run}. */\nexport type RunStatus = \"running\" | \"success\" | \"error\";\n\n/** Structured error attached to a run or step when status is `\"error\"`. */\nexport interface ErrorInfo {\n message: string;\n stack?: string;\n}\n\n/**\n * Optional token counts for a step (e.g. LLM usage).\n * Reserved for future roadmap; MVP does not compute or persist token usage.\n */\nexport interface TokenMetadata {\n input?: number;\n output?: number;\n}\n\n/** Arbitrary structured fields for a step; safe extensions use string keys. */\nexport interface StepMetadata {\n model?: string;\n toolName?: string;\n tokens?: TokenMetadata;\n retryCount?: number;\n [key: string]: unknown;\n}\n\n/**\n * One traced agent run (root of an execution tree).\n * MVP intentionally omits `input` / `output` on the run to limit PII, secrets, and serialization risk.\n */\nexport interface Run {\n id: string;\n name: string;\n status: RunStatus;\n startTime: number;\n endTime?: number;\n durationMs?: number;\n error?: ErrorInfo;\n metadata?: Record<string, unknown>;\n}\n\n/**\n * One node in the execution tree under a {@link Run}.\n * MVP intentionally omits `input` / `output`; capture/redaction may come in a later version.\n */\nexport interface Step {\n id: string;\n runId: string;\n parentId?: string;\n name: string;\n type: StepType;\n status: StepStatus;\n startTime: number;\n endTime?: number;\n durationMs?: number;\n error?: ErrorInfo;\n metadata?: StepMetadata;\n}\n\n/** Version of the JSONL trace line schema consumed by AgentInspect tooling. */\nexport type TraceSchemaVersion = \"0.1\";\n\n/** Fields shared by every persisted trace event line. */\nexport interface TraceEventBase {\n schemaVersion: TraceSchemaVersion;\n event: string;\n timestamp: number;\n}\n\n/** Emitted when a run begins. */\nexport interface RunStartedEvent extends TraceEventBase {\n event: \"run_started\";\n runId: string;\n name: string;\n startTime: number;\n metadata?: Record<string, unknown>;\n}\n\n/** Emitted when a run finishes successfully or with an error. */\nexport interface RunCompletedEvent extends TraceEventBase {\n event: \"run_completed\";\n runId: string;\n status: \"success\" | \"error\";\n endTime: number;\n durationMs: number;\n error?: ErrorInfo;\n}\n\n/** Emitted when a step begins (including nested steps under `parentId`). */\nexport interface StepStartedEvent extends TraceEventBase {\n event: \"step_started\";\n runId: string;\n stepId: string;\n parentId?: string;\n name: string;\n type: StepType;\n startTime: number;\n metadata?: StepMetadata;\n}\n\n/**\n * Emitted when a step finishes (success or failure).\n * Failures use `status: \"error\"` and optional {@link ErrorInfo}; there is no separate `step_failed` event in MVP.\n */\nexport interface StepCompletedEvent extends TraceEventBase {\n event: \"step_completed\";\n runId: string;\n stepId: string;\n status: \"success\" | \"error\";\n endTime: number;\n durationMs: number;\n error?: ErrorInfo;\n}\n\n/** Discriminated union of all MVP trace events written as JSONL lines. */\nexport type TraceEvent =\n | RunStartedEvent\n | RunCompletedEvent\n | StepStartedEvent\n | StepCompletedEvent;\n\n/** Options for `inspectRun()` (implemented in a later step). */\nexport interface InspectRunOptions {\n traceDir?: string;\n silent?: boolean;\n metadata?: Record<string, unknown>;\n}\n\n/** Options passed when opening a logical step (implemented in a later step). */\nexport interface StepOptions {\n type?: StepType;\n metadata?: StepMetadata;\n}\n\n/** Options for `observe()` — same surface as {@link InspectRunOptions} in MVP. */\nexport type ObserveOptions = InspectRunOptions;\n\n/**\n * Resolved settings for the active run while tracing is enabled.\n * Populated by runtime code in a later step; defined here for `context.ts`.\n */\nexport interface ExecutionContext {\n runId: string;\n runName: string;\n traceDir: string;\n silent: boolean;\n metadata?: Record<string, unknown>;\n}\n\n/** Stack position of the step currently executing (used by future context tracking). */\nexport interface ActiveStepContext {\n stepId: string;\n parentId?: string;\n depth: number;\n}\n\nconst STEP_TYPES: readonly StepType[] = [\n \"run\",\n \"llm\",\n \"tool\",\n \"decision\",\n \"logic\",\n \"state\",\n \"custom\",\n] as const;\n\nconst STEP_STATUSES: readonly StepStatus[] = [\n \"running\",\n \"success\",\n \"error\",\n] as const;\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\n/** Returns true if `value` is one of the MVP {@link StepType} literals. */\nexport function isStepType(value: unknown): value is StepType {\n return (\n typeof value === \"string\" &&\n (STEP_TYPES as readonly string[]).includes(value)\n );\n}\n\n/** Returns true if `value` is one of the MVP {@link StepStatus} literals. */\nexport function isStepStatus(value: unknown): value is StepStatus {\n return (\n typeof value === \"string\" &&\n (STEP_STATUSES as readonly string[]).includes(value)\n );\n}\n\n/**\n * Narrowing guard for a {@link TraceEvent} object with required MVP fields.\n * Does not deeply validate optional `metadata` shapes.\n */\nexport function isTraceEvent(value: unknown): value is TraceEvent {\n if (!isRecord(value)) return false;\n if (value.schemaVersion !== \"0.1\") return false;\n if (typeof value.timestamp !== \"number\") return false;\n if (typeof value.event !== \"string\") return false;\n\n switch (value.event) {\n case \"run_started\": {\n return (\n typeof value.runId === \"string\" &&\n typeof value.name === \"string\" &&\n typeof value.startTime === \"number\"\n );\n }\n case \"run_completed\": {\n return (\n typeof value.runId === \"string\" &&\n (value.status === \"success\" || value.status === \"error\") &&\n typeof value.endTime === \"number\" &&\n typeof value.durationMs === \"number\"\n );\n }\n case \"step_started\": {\n return (\n typeof value.runId === \"string\" &&\n typeof value.stepId === \"string\" &&\n typeof value.name === \"string\" &&\n isStepType(value.type) &&\n typeof value.startTime === \"number\"\n );\n }\n case \"step_completed\": {\n return (\n typeof value.runId === \"string\" &&\n typeof value.stepId === \"string\" &&\n (value.status === \"success\" || value.status === \"error\") &&\n typeof value.endTime === \"number\" &&\n typeof value.durationMs === \"number\"\n );\n }\n default:\n return false;\n }\n}\n","import { mkdir } from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\n\nimport { nanoid } from \"nanoid\";\n\nimport type { ErrorInfo } from \"./types.js\";\n\n/** Default folder under the user home for AgentInspect data. */\nexport const DEFAULT_TRACE_DIR_NAME = \".agent-inspect\";\n\n/** Subfolder where JSONL run traces are stored. */\nexport const RUNS_DIR_NAME = \"runs\";\n\n/** Writable trace root when the default home path cannot be used. */\nexport const FALLBACK_TRACE_DIR = path.join(\n os.tmpdir(),\n \"agent-inspect\",\n RUNS_DIR_NAME,\n);\n\n/** Maximum display length for run/step names before truncation. */\nexport const MAX_NAME_LENGTH = 100;\n\n/** Returns `run_` + a 10-character nanoid segment. */\nexport function createRunId(): string {\n return `run_${nanoid(10)}`;\n}\n\n/** Returns `step_` + a 10-character nanoid segment. */\nexport function createStepId(): string {\n return `step_${nanoid(10)}`;\n}\n\n/**\n * Formats a duration for CLI display.\n * Under 1000 ms uses whole milliseconds; from 1000 ms uses seconds with one decimal.\n */\nexport function formatDuration(ms: number): string {\n if (!Number.isFinite(ms) || ms < 0) {\n return \"0ms\";\n }\n if (ms < 1000) {\n return `${Math.floor(ms)}ms`;\n }\n const seconds = ms / 1000;\n return `${(Math.round(seconds * 10) / 10).toFixed(1)}s`;\n}\n\n/**\n * Formats a Unix timestamp (ms) as local `YYYY-MM-DD HH:mm:ss`.\n * Invalid values yield `\"Invalid date\"` (no throw).\n */\nexport function formatTimestamp(timestamp: number): string {\n if (!Number.isFinite(timestamp)) {\n return \"Invalid date\";\n }\n const d = new Date(timestamp);\n if (Number.isNaN(d.getTime())) {\n return \"Invalid date\";\n }\n const y = d.getFullYear();\n const mo = String(d.getMonth() + 1).padStart(2, \"0\");\n const day = String(d.getDate()).padStart(2, \"0\");\n const h = String(d.getHours()).padStart(2, \"0\");\n const min = String(d.getMinutes()).padStart(2, \"0\");\n const s = String(d.getSeconds()).padStart(2, \"0\");\n return `${y}-${mo}-${day} ${h}:${min}:${s}`;\n}\n\n/**\n * Default directory for trace files: `~/DEFAULT_TRACE_DIR_NAME/RUNS_DIR_NAME`.\n * Falls back to {@link FALLBACK_TRACE_DIR} when home cannot be resolved.\n */\nexport function getDefaultTraceDir(): string {\n try {\n const home = os.homedir();\n if (typeof home !== \"string\" || home.trim() === \"\") {\n return FALLBACK_TRACE_DIR;\n }\n return path.join(home, DEFAULT_TRACE_DIR_NAME, RUNS_DIR_NAME);\n } catch {\n return FALLBACK_TRACE_DIR;\n }\n}\n\n/**\n * Full path to the JSONL trace file for a run.\n * `runId` is passed through `path.basename` to avoid traversal; empty ids become `run_unknown`.\n */\nexport function getTraceFilePath(runId: string, traceDir?: string): string {\n const baseDir = traceDir ?? getDefaultTraceDir();\n let safeId =\n typeof runId === \"string\" && runId.trim() !== \"\" ? runId.trim() : \"run_unknown\";\n safeId = path.basename(safeId);\n if (safeId === \"\" || safeId === \".\" || safeId === \"..\") {\n safeId = \"run_unknown\";\n }\n return path.join(baseDir, `${safeId}.jsonl`);\n}\n\n/**\n * Ensures a trace directory exists (recursive). Tries {@link FALLBACK_TRACE_DIR} on failure.\n * Returns the directory path that callers should prefer: primary, fallback, or original if both mkdir attempts fail.\n * Emits concise `[AgentInspect]` warnings on failure; never throws.\n */\nexport async function ensureTraceDir(traceDir: string): Promise<string> {\n const primary = path.resolve(traceDir);\n try {\n await mkdir(primary, { recursive: true });\n return primary;\n } catch {\n warn(`Failed to create trace directory: ${primary}`);\n const fallback = path.resolve(FALLBACK_TRACE_DIR);\n try {\n await mkdir(fallback, { recursive: true });\n return fallback;\n } catch {\n warn(`Failed to create fallback trace directory: ${fallback}`);\n return primary;\n }\n }\n}\n\n/**\n * Normalizes any thrown/caught value into {@link ErrorInfo}.\n * Never throws (circular structures and non-JSON values fall back to a generic message).\n */\nexport function formatError(error: unknown): ErrorInfo {\n if (error instanceof Error) {\n const out: ErrorInfo = { message: error.message };\n if (typeof error.stack === \"string\" && error.stack.length > 0) {\n out.stack = error.stack;\n }\n return out;\n }\n if (typeof error === \"string\") {\n return { message: error };\n }\n if (error === null) {\n return { message: \"Unknown error: null\" };\n }\n if (error === undefined) {\n return { message: \"Unknown error: undefined\" };\n }\n if (\n typeof error === \"number\" ||\n typeof error === \"boolean\" ||\n typeof error === \"bigint\"\n ) {\n return { message: String(error) };\n }\n if (typeof error === \"object\") {\n try {\n return { message: JSON.stringify(error) };\n } catch {\n return { message: \"Unknown error\" };\n }\n }\n return { message: \"Unknown error\" };\n}\n\n/**\n * Truncates a display name to `maxLength`, appending `\"...\"` when shortened.\n * Empty or non-string input becomes `\"unnamed\"`.\n */\nexport function truncateName(name: string, maxLength = MAX_NAME_LENGTH): string {\n if (typeof name !== \"string\" || name.trim() === \"\") {\n return \"unnamed\";\n }\n const trimmed = name.trim();\n if (trimmed.length <= maxLength) {\n return trimmed;\n }\n const ellipsis = \"...\";\n const head = Math.max(0, maxLength - ellipsis.length);\n return `${trimmed.slice(0, head)}${ellipsis}`;\n}\n\n/**\n * Instrumentation-only warning to stderr. Not a general-purpose logger.\n * Optional `error` is summarized via {@link formatError} (message only).\n */\nexport function warn(message: string, error?: unknown): void {\n const base = `[AgentInspect] ${message}`;\n if (error === undefined) {\n console.warn(base);\n return;\n }\n console.warn(`${base}: ${formatError(error).message}`);\n}\n","import { AsyncLocalStorage } from \"node:async_hooks\";\n\nimport type { ExecutionContext } from \"./types.js\";\n\ntype RuntimeExecutionContext = ExecutionContext & {\n currentStepId?: string;\n currentDepth: number;\n};\n\nconst storage = new AsyncLocalStorage<RuntimeExecutionContext>();\n\nfunction toPublicContext(ctx: RuntimeExecutionContext): ExecutionContext {\n return {\n runId: ctx.runId,\n runName: ctx.runName,\n traceDir: ctx.traceDir,\n silent: ctx.silent,\n metadata: ctx.metadata,\n };\n}\n\nfunction invoke<T>(fn: () => T | Promise<T>): Promise<T> {\n return new Promise((resolve, reject) => {\n try {\n Promise.resolve(fn()).then(resolve, reject);\n } catch (e) {\n reject(e);\n }\n });\n}\n\n/** Returns the active run context, without internal step fields. */\nexport function getCurrentContext(): ExecutionContext | undefined {\n try {\n const s = storage.getStore();\n if (!s) return undefined;\n return toPublicContext(s);\n } catch {\n return undefined;\n }\n}\n\n/** Active `runId` when inside `runWithContext`, else `undefined`. */\nexport function getCurrentRunId(): string | undefined {\n try {\n return storage.getStore()?.runId;\n } catch {\n return undefined;\n }\n}\n\n/** Active `runName` when inside `runWithContext`, else `undefined`. */\nexport function getCurrentRunName(): string | undefined {\n try {\n return storage.getStore()?.runName;\n } catch {\n return undefined;\n }\n}\n\n/**\n * Active step id in this async scope (parent for nested `step()` calls).\n * `undefined` at run root or outside any run.\n */\nexport function getCurrentStepId(): string | undefined {\n try {\n return storage.getStore()?.currentStepId;\n } catch {\n return undefined;\n }\n}\n\n/** Alias of {@link getCurrentStepId} for readability in step instrumentation. */\nexport function getParentStepId(): string | undefined {\n return getCurrentStepId();\n}\n\n/**\n * Nesting depth: `0` at run root, increments by one per nested `runWithStepContext`.\n * Returns `0` outside any run.\n */\nexport function getCurrentDepth(): number {\n try {\n const d = storage.getStore()?.currentDepth;\n return typeof d === \"number\" && Number.isFinite(d) ? d : 0;\n } catch {\n return 0;\n }\n}\n\nexport function hasActiveContext(): boolean {\n try {\n return storage.getStore() !== undefined;\n } catch {\n return false;\n }\n}\n\nexport function getTraceDirFromContext(): string | undefined {\n try {\n return storage.getStore()?.traceDir;\n } catch {\n return undefined;\n }\n}\n\nexport function isSilentContext(): boolean {\n try {\n const s = storage.getStore();\n return s ? s.silent : false;\n } catch {\n return false;\n }\n}\n\n/**\n * Runs `fn` with a fresh AgentInspect run context (depth 0, no active step).\n * Propagates sync/async results and rejections; does not swallow user errors.\n */\nexport function runWithContext<T>(\n context: ExecutionContext,\n fn: () => Promise<T> | T,\n): Promise<T> {\n const runtime: RuntimeExecutionContext = {\n runId: context.runId,\n runName: context.runName,\n traceDir: context.traceDir,\n silent: context.silent,\n metadata: context.metadata,\n currentDepth: 0,\n };\n\n return new Promise((resolve, reject) => {\n storage.run(runtime, () => {\n try {\n Promise.resolve(fn()).then(resolve, reject);\n } catch (e) {\n reject(e);\n }\n });\n });\n}\n\n/**\n * Runs `fn` with `stepId` as the active step (incremented depth).\n * If no run is active, runs `fn` without altering async context.\n */\nexport function runWithStepContext<T>(\n stepId: string,\n fn: () => Promise<T> | T,\n): Promise<T> {\n let parent: RuntimeExecutionContext | undefined;\n try {\n parent = storage.getStore();\n } catch {\n parent = undefined;\n }\n\n if (!parent) {\n return invoke(fn);\n }\n\n const derived: RuntimeExecutionContext = {\n runId: parent.runId,\n runName: parent.runName,\n traceDir: parent.traceDir,\n silent: parent.silent,\n metadata: parent.metadata,\n currentStepId: stepId,\n currentDepth: parent.currentDepth + 1,\n };\n\n return new Promise((resolve, reject) => {\n storage.run(derived, () => {\n try {\n Promise.resolve(fn()).then(resolve, reject);\n } catch (e) {\n reject(e);\n }\n });\n });\n}\n","import { appendFile, readdir, readFile, stat, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nimport type { TraceEvent } from \"./types.js\";\nimport { isStepType } from \"./types.js\";\nimport {\n ensureTraceDir,\n FALLBACK_TRACE_DIR,\n getTraceFilePath,\n warn,\n} from \"./utils.js\";\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction nonEmptyString(value: unknown): value is string {\n return typeof value === \"string\" && value.trim() !== \"\";\n}\n\nfunction finiteNumber(value: unknown): value is number {\n return typeof value === \"number\" && Number.isFinite(value);\n}\n\nfunction optionalErrorInfo(value: unknown): boolean {\n if (value === undefined) return true;\n if (!isRecord(value)) return false;\n if (typeof value.message !== \"string\") return false;\n if (\"stack\" in value && value.stack !== undefined) {\n if (typeof value.stack !== \"string\") return false;\n }\n return true;\n}\n\n/**\n * Strict MVP validation before writing JSONL. Rejects empty ids, non-finite times, and malformed payloads.\n */\nexport function validateEvent(event: unknown): event is TraceEvent {\n if (!isRecord(event)) return false;\n if (event.schemaVersion !== \"0.1\") return false;\n if (!finiteNumber(event.timestamp)) return false;\n if (typeof event.event !== \"string\") return false;\n\n switch (event.event) {\n case \"run_started\": {\n if (\n !nonEmptyString(event.runId) ||\n !nonEmptyString(event.name) ||\n !finiteNumber(event.startTime)\n ) {\n return false;\n }\n if (event.metadata !== undefined && !isRecord(event.metadata)) {\n return false;\n }\n return true;\n }\n case \"run_completed\": {\n return (\n nonEmptyString(event.runId) &&\n (event.status === \"success\" || event.status === \"error\") &&\n finiteNumber(event.endTime) &&\n finiteNumber(event.durationMs) &&\n optionalErrorInfo(event.error)\n );\n }\n case \"step_started\": {\n if (\n !nonEmptyString(event.runId) ||\n !nonEmptyString(event.stepId) ||\n !nonEmptyString(event.name) ||\n !isStepType(event.type) ||\n !finiteNumber(event.startTime)\n ) {\n return false;\n }\n if (event.parentId !== undefined && typeof event.parentId !== \"string\") {\n return false;\n }\n if (event.metadata !== undefined && !isRecord(event.metadata)) {\n return false;\n }\n return true;\n }\n case \"step_completed\": {\n return (\n nonEmptyString(event.runId) &&\n nonEmptyString(event.stepId) &&\n (event.status === \"success\" || event.status === \"error\") &&\n finiteNumber(event.endTime) &&\n finiteNumber(event.durationMs) &&\n optionalErrorInfo(event.error)\n );\n }\n default:\n return false;\n }\n}\n\n/** Serializes a trace line as compact JSON without a trailing newline. */\nexport function serializeEvent(event: TraceEvent): string {\n try {\n return JSON.stringify(event);\n } catch {\n return \"\";\n }\n}\n\n/**\n * Creates (or truncates) an empty JSONL file for a run. Uses {@link ensureTraceDir} then {@link getTraceFilePath}.\n * On failure, retries once under {@link FALLBACK_TRACE_DIR}.\n */\nexport async function initializeTraceFile(\n runId: string,\n traceDir: string,\n): Promise<string | undefined> {\n try {\n const usable = await ensureTraceDir(traceDir);\n const filePath = getTraceFilePath(runId, usable);\n await writeFile(filePath, \"\", \"utf-8\");\n return filePath;\n } catch (e) {\n warn(\"Failed to initialize trace file\", e);\n }\n\n try {\n const usable = await ensureTraceDir(FALLBACK_TRACE_DIR);\n const filePath = getTraceFilePath(runId, usable);\n await writeFile(filePath, \"\", \"utf-8\");\n return filePath;\n } catch (e) {\n warn(\"Failed to initialize trace file on fallback directory\", e);\n return undefined;\n }\n}\n\n/**\n * Appends one validated JSONL line for `event.runId`. Falls back to {@link FALLBACK_TRACE_DIR} on append failure.\n */\nexport async function writeTraceEvent(\n event: TraceEvent,\n traceDir: string,\n): Promise<void> {\n if (!validateEvent(event)) {\n warn(\"Skipped invalid trace event (validation failed)\");\n return;\n }\n\n const line = serializeEvent(event);\n if (line === \"\") {\n warn(\"Skipped trace event (serialization failed)\");\n return;\n }\n\n const payload = `${line}\\n`;\n\n const tryAppend = async (dir: string): Promise<boolean> => {\n try {\n const usable = await ensureTraceDir(dir);\n const filePath = getTraceFilePath(event.runId, usable);\n await appendFile(filePath, payload, \"utf-8\");\n return true;\n } catch {\n return false;\n }\n };\n\n if (await tryAppend(traceDir)) {\n return;\n }\n\n warn(`Failed to append trace event for run ${event.runId}`);\n\n if (await tryAppend(FALLBACK_TRACE_DIR)) {\n return;\n }\n\n warn(\"Failed to append trace event to fallback directory\");\n}\n\n/**\n * Reads raw JSONL file contents for a run, or `undefined` if missing or unreadable.\n */\nexport async function readTraceFile(\n runId: string,\n traceDir: string,\n): Promise<string | undefined> {\n try {\n const filePath = getTraceFilePath(runId, traceDir);\n return await readFile(filePath, \"utf-8\");\n } catch (e) {\n if (e && typeof e === \"object\" && \"code\" in e && e.code === \"ENOENT\") {\n return undefined;\n }\n warn(\"Unexpected error reading trace file\", e);\n return undefined;\n }\n}\n\n/** Parses JSONL into validated {@link TraceEvent} rows; invalid lines are skipped with a warning. */\nexport async function readTraceEvents(\n runId: string,\n traceDir: string,\n): Promise<TraceEvent[]> {\n const out: TraceEvent[] = [];\n try {\n const raw = await readTraceFile(runId, traceDir);\n if (raw === undefined) {\n return out;\n }\n const lines = raw.split(\"\\n\");\n for (const line of lines) {\n const trimmed = line.trim();\n if (trimmed === \"\") continue;\n let parsed: unknown;\n try {\n parsed = JSON.parse(trimmed) as unknown;\n } catch {\n warn(\"Skipped invalid JSON line in trace file\");\n continue;\n }\n if (validateEvent(parsed)) {\n out.push(parsed);\n } else {\n warn(\"Skipped invalid trace event line in trace file\");\n }\n }\n } catch (e) {\n warn(\"Failed to read trace events\", e);\n }\n return out;\n}\n\n/**\n * Lists `.jsonl` file names in `traceDir`, newest by mtime first (name sort as tie-breaker).\n */\nexport async function listTraceFiles(traceDir: string): Promise<string[]> {\n try {\n const usable = path.resolve(traceDir);\n const names = await readdir(usable);\n const jsonl = names.filter((n) => n.endsWith(\".jsonl\"));\n const withStat = await Promise.all(\n jsonl.map(async (name) => {\n try {\n const st = await stat(path.join(usable, name));\n return { name, mtime: st.mtimeMs };\n } catch {\n return { name, mtime: 0 };\n }\n }),\n );\n withStat.sort((a, b) => {\n if (b.mtime !== a.mtime) return b.mtime - a.mtime;\n return a.name.localeCompare(b.name);\n });\n return withStat.map((x) => x.name);\n } catch {\n return [];\n }\n}\n\n/** Maps a `.jsonl` file name to its run id (basename only; no traversal). */\nexport function getRunIdFromTraceFileName(fileName: string): string | undefined {\n try {\n const base = path.basename(fileName);\n if (!base.endsWith(\".jsonl\")) return undefined;\n const id = base.slice(0, -\".jsonl\".length);\n return id === \"\" ? undefined : id;\n } catch {\n return undefined;\n }\n}\n","import chalk from \"chalk\";\n\nimport { isSilentContext } from \"./context.js\";\nimport type { ErrorInfo, RunStatus, StepStatus } from \"./types.js\";\nimport { formatDuration, truncateName } from \"./utils.js\";\n\n/** Two spaces per nesting level in terminal output. */\nexport const TERMINAL_INDENT = \" \";\n\n/** Max display length for names in terminal output. */\nexport const MAX_TERMINAL_NAME_LENGTH = 80;\n\n/** Max nesting depth used for indentation (prevents huge indents). */\nexport const MAX_TERMINAL_DEPTH = 10;\n\nfunction normalizeDepth(depth: number): number {\n if (!Number.isFinite(depth) || depth < 0) {\n return 0;\n }\n return Math.min(Math.floor(depth), MAX_TERMINAL_DEPTH);\n}\n\nfunction safePrint(line = \"\"): void {\n try {\n console.log(line);\n } catch {\n /* never break callers */\n }\n}\n\n/** Indentation string for a nesting depth (capped, never negative). */\nexport function getIndent(depth: number): string {\n return TERMINAL_INDENT.repeat(normalizeDepth(depth));\n}\n\n/** Truncates a display name for terminal use; invalid input becomes `\"unnamed\"`. */\nexport function formatTerminalName(name: string): string {\n if (typeof name !== \"string\" || name.trim() === \"\") {\n return \"unnamed\";\n }\n return truncateName(name, MAX_TERMINAL_NAME_LENGTH);\n}\n\nfunction getStatusIcon(status: StepStatus | RunStatus): string {\n if (status === \"success\") return chalk.green(\"✔\");\n if (status === \"error\") return chalk.red(\"✖\");\n return chalk.yellow(\"⏳\");\n}\n\n/** Renders a single step line (colored); does not consult silent mode. */\nexport function renderStepLine(\n name: string,\n durationMs: number | undefined,\n status: StepStatus,\n depth?: number,\n): string {\n try {\n const nm = formatTerminalName(name);\n const ind = getIndent(depth ?? 0);\n if (status === \"running\" && durationMs === undefined) {\n return `${ind}${chalk.yellow(\"⏳\")} ${nm}`;\n }\n const hasDur =\n durationMs !== undefined && Number.isFinite(durationMs as number);\n const dur = hasDur ? formatDuration(durationMs as number) : undefined;\n if (status === \"running\") {\n return dur !== undefined\n ? `${ind}${chalk.yellow(\"⏳\")} ${nm} (${dur})`\n : `${ind}${chalk.yellow(\"⏳\")} ${nm}`;\n }\n if (!hasDur || dur === undefined) {\n return `${ind}${chalk.yellow(\"⏳\")} ${nm}`;\n }\n if (status === \"success\") {\n return `${ind}${getStatusIcon(\"success\")} ${nm} (${dur})`;\n }\n return `${ind}${getStatusIcon(\"error\")} ${nm} (${dur})`;\n } catch {\n return \"\";\n }\n}\n\n/** Renders an error summary line (no stack in MVP). */\nexport function renderErrorLine(error: ErrorInfo, depth?: number): string {\n try {\n const msg =\n typeof error.message === \"string\" ? error.message : \"\";\n const ind = getIndent((depth ?? 0) + 1);\n return `${ind}Error: ${msg}`;\n } catch {\n return \"\";\n }\n}\n\n/** Plain-text run summary lines (no chalk) for stable testing and CLI reuse. */\nexport function renderRunSummary(\n durationMs: number,\n status: RunStatus,\n traceFilePath?: string,\n): string[] {\n try {\n const dur = Number.isFinite(durationMs)\n ? formatDuration(durationMs)\n : formatDuration(0);\n const head =\n status === \"error\" ? `Failed in ${dur}` : `Completed in ${dur}`;\n const lines = [head];\n if (traceFilePath !== undefined && traceFilePath.trim() !== \"\") {\n lines.push(`Trace: ${traceFilePath}`);\n }\n return lines;\n } catch {\n return [];\n }\n}\n\n/** Prints run header with icon and dim run id. */\nexport function printRunStart(runId: string, name: string): void {\n if (isSilentContext()) return;\n try {\n safePrint(\"\");\n const header = `${chalk.cyan.bold(\"🔍 AgentInspect:\")} ${formatTerminalName(name)} ${chalk.dim(`(${runId})`)}`;\n safePrint(header);\n } catch {\n /* noop */\n }\n}\n\n/** Prints a running step line. */\nexport function printStepStart(name: string, depth = 0): void {\n if (isSilentContext()) return;\n try {\n safePrint(renderStepLine(name, undefined, \"running\", depth));\n } catch {\n /* noop */\n }\n}\n\n/** Prints a completed step line with duration and status icon. */\nexport function printStepComplete(\n name: string,\n durationMs: number,\n status: StepStatus,\n depth = 0,\n): void {\n if (isSilentContext()) return;\n try {\n safePrint(renderStepLine(name, durationMs, status, depth));\n } catch {\n /* noop */\n }\n}\n\n/** Prints a structured error line (message only, no stack). */\nexport function printError(error: ErrorInfo, depth = 0): void {\n if (isSilentContext()) return;\n try {\n safePrint(renderErrorLine(error, depth));\n } catch {\n /* noop */\n }\n}\n\n/** Prints run completion summary and optional trace path. */\nexport function printRunComplete(\n _name: string,\n _runId: string,\n durationMs: number,\n status: RunStatus,\n traceFilePath?: string,\n): void {\n if (isSilentContext()) return;\n try {\n const lines = renderRunSummary(durationMs, status, traceFilePath);\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i]!;\n if (i === 0) {\n const color =\n status === \"error\"\n ? chalk.red\n : status === \"running\"\n ? chalk.yellow\n : chalk.green;\n safePrint(color(line));\n } else {\n safePrint(chalk.dim(line));\n }\n }\n } catch {\n /* noop */\n }\n}\n\n/** Prints which step failed. */\nexport function printFailedAt(stepName: string): void {\n if (isSilentContext()) return;\n try {\n safePrint(`Failed at: ${formatTerminalName(stepName)}`);\n } catch {\n /* noop */\n }\n}\n","import { getCurrentContext, getCurrentDepth, getParentStepId, runWithStepContext } from \"./context.js\";\nimport type { StepOptions, StepType, TraceEvent } from \"./types.js\";\nimport { writeTraceEvent } from \"./storage.js\";\nimport { printFailedAt, printError, printStepComplete, printStepStart } from \"./terminal.js\";\nimport { createStepId, formatError, truncateName, warn } from \"./utils.js\";\n\nfunction normalizeStepName(name: unknown): string {\n if (typeof name !== \"string\" || name.trim() === \"\") {\n return \"unnamed-step\";\n }\n return truncateName(name.trim(), 100);\n}\n\nasync function safeInstrumentation(\n label: string,\n op: () => void | Promise<void>,\n): Promise<void> {\n try {\n await Promise.resolve(op());\n } catch (e) {\n warn(`step: ${label}`, e);\n }\n}\n\nasync function stepImpl<T>(\n name: string,\n fn: () => Promise<T> | T,\n options?: StepOptions,\n): Promise<T> {\n if (typeof fn !== \"function\") {\n throw new TypeError(\"step requires `fn` to be a function\");\n }\n\n const stepName = normalizeStepName(name);\n const context = getCurrentContext();\n\n if (!context) {\n warn(\"step() called outside inspectRun(); executing without instrumentation\");\n return Promise.resolve(fn());\n }\n\n const stepId = createStepId();\n const renderDepth = getCurrentDepth();\n const parentId = getParentStepId();\n const stepType: StepType = options?.type ?? \"logic\";\n const metadata = options?.metadata;\n const startTime = Date.now();\n\n await safeInstrumentation(\"writeTraceEvent(step_started)\", async () => {\n const started: TraceEvent = {\n schemaVersion: \"0.1\",\n event: \"step_started\",\n timestamp: startTime,\n runId: context.runId,\n stepId,\n ...(typeof parentId === \"string\" && parentId.trim() !== \"\"\n ? { parentId }\n : {}),\n name: stepName,\n type: stepType,\n startTime,\n ...(metadata !== undefined ? { metadata } : {}),\n };\n await writeTraceEvent(started, context.traceDir);\n });\n\n await safeInstrumentation(\"printStepStart\", () => {\n printStepStart(stepName, renderDepth);\n });\n\n let result: T;\n try {\n result = await runWithStepContext(stepId, async () => {\n return await Promise.resolve(fn());\n });\n } catch (userError) {\n const endTime = Date.now();\n const durationMs = endTime - startTime;\n const formatted = formatError(userError);\n\n await safeInstrumentation(\"writeTraceEvent(step_completed error)\", async () => {\n const completed: TraceEvent = {\n schemaVersion: \"0.1\",\n event: \"step_completed\",\n timestamp: endTime,\n runId: context.runId,\n stepId,\n status: \"error\",\n endTime,\n durationMs,\n error: formatted,\n };\n await writeTraceEvent(completed, context.traceDir);\n });\n\n await safeInstrumentation(\"printStepComplete(error)\", () => {\n printStepComplete(stepName, durationMs, \"error\", renderDepth);\n });\n await safeInstrumentation(\"printError\", () => {\n printError(formatted, renderDepth);\n });\n await safeInstrumentation(\"printFailedAt\", () => {\n printFailedAt(stepName);\n });\n\n throw userError;\n }\n\n const endTime = Date.now();\n const durationMs = endTime - startTime;\n\n await safeInstrumentation(\"writeTraceEvent(step_completed success)\", async () => {\n const completed: TraceEvent = {\n schemaVersion: \"0.1\",\n event: \"step_completed\",\n timestamp: endTime,\n runId: context.runId,\n stepId,\n status: \"success\",\n endTime,\n durationMs,\n };\n await writeTraceEvent(completed, context.traceDir);\n });\n\n await safeInstrumentation(\"printStepComplete(success)\", () => {\n printStepComplete(stepName, durationMs, \"success\", renderDepth);\n });\n\n return result;\n}\n\n/** Callable step tracer plus {@link step.llm} and {@link step.tool} shortcuts. */\nexport type StepFunction = {\n <T>(name: string, fn: () => Promise<T> | T, options?: StepOptions): Promise<T>;\n llm: <T>(model: string, fn: () => Promise<T> | T) => Promise<T>;\n tool: <T>(toolName: string, fn: () => Promise<T> | T) => Promise<T>;\n};\n\nasync function stepLlm<T>(model: string, fn: () => Promise<T> | T): Promise<T> {\n const modelName =\n typeof model === \"string\" && model.trim() !== \"\"\n ? model.trim()\n : \"unknown-model\";\n return stepImpl<T>(`llm:${modelName}`, fn, {\n type: \"llm\",\n metadata: { model: modelName },\n });\n}\n\nasync function stepTool<T>(\n toolName: string,\n fn: () => Promise<T> | T,\n): Promise<T> {\n const normalized =\n typeof toolName === \"string\" && toolName.trim() !== \"\"\n ? toolName.trim()\n : \"unknown-tool\";\n return stepImpl<T>(`tool:${normalized}`, fn, {\n type: \"tool\",\n metadata: { toolName: normalized },\n });\n}\n\n/**\n * Traces a named unit of work inside `inspectRun` (`step_started` / `step_completed`, optional terminal).\n * Outside a run, executes `fn` with a warn only. Preserves return values and rethrows user errors unchanged.\n *\n * - `step.llm(model, fn)` — `type: \"llm\"`, `metadata.model` (no SDK calls or token counting).\n * - `step.tool(toolName, fn)` — `type: \"tool\"`, `metadata.toolName` (no framework interception).\n */\nexport const step = Object.assign(stepImpl, {\n llm: stepLlm,\n tool: stepTool,\n}) as StepFunction;\n","import {\n formatDuration,\n formatTimestamp,\n getDefaultTraceDir,\n listTraceFiles,\n readTraceEvents,\n getRunIdFromTraceFileName,\n truncateName,\n} from \"@agent-inspect/core\";\nimport type {\n RunCompletedEvent,\n RunStartedEvent,\n TraceEvent,\n} from \"@agent-inspect/core\";\n\nexport interface ListOptions {\n dir?: string;\n limit?: string;\n status?: \"running\" | \"success\" | \"error\";\n}\n\ntype RunSummary = {\n runId: string;\n name: string;\n status: \"running\" | \"success\" | \"error\";\n durationMs?: number;\n startTime: number;\n};\n\nfunction parseLimit(raw?: string): number {\n const fallback = 20;\n if (raw === undefined || raw.trim() === \"\") return fallback;\n const n = Number.parseInt(raw, 10);\n if (!Number.isFinite(n) || n <= 0) return fallback;\n return Math.min(n, 100);\n}\n\nfunction isStatusFilter(\n value: unknown,\n): value is \"running\" | \"success\" | \"error\" {\n return value === \"running\" || value === \"success\" || value === \"error\";\n}\n\nfunction buildRunSummary(\n runId: string,\n events: TraceEvent[],\n): RunSummary | undefined {\n const started = events.find(\n (e): e is RunStartedEvent => e.event === \"run_started\",\n );\n if (!started) return undefined;\n\n const completed = events.filter(\n (e): e is RunCompletedEvent => e.event === \"run_completed\",\n );\n const last = completed[completed.length - 1];\n\n const status: RunSummary[\"status\"] = last ? last.status : \"running\";\n const startTime = Number.isFinite(started.startTime)\n ? started.startTime\n : Number.isFinite(started.timestamp)\n ? started.timestamp\n : 0;\n\n const name =\n typeof started.name === \"string\" && started.name.trim() !== \"\"\n ? started.name.trim()\n : \"unknown-run\";\n\n return {\n runId,\n name,\n status,\n durationMs: last !== undefined ? last.durationMs : undefined,\n startTime,\n };\n}\n\nfunction statusIcon(status: RunSummary[\"status\"]): string {\n if (status === \"success\") return \"✓\";\n if (status === \"error\") return \"✗\";\n return \"⏳\";\n}\n\nfunction durationCell(\n status: RunSummary[\"status\"],\n durationMs?: number,\n): string {\n if (status === \"running\") return \"-\";\n if (durationMs !== undefined && Number.isFinite(durationMs)) {\n return formatDuration(durationMs);\n }\n return \"-\";\n}\n\nfunction timestampCell(startTime: number): string {\n if (!Number.isFinite(startTime) || startTime <= 0) return \"Invalid date\";\n const s = formatTimestamp(startTime);\n return s === \"Invalid date\" ? \"Invalid date\" : s;\n}\n\n/**\n * Prints a table of recent runs under the trace directory. Swallows expected I/O issues;\n * unexpected failures set `process.exitCode` and log a short message (no `process.exit`).\n */\nexport async function list(options: ListOptions = {}): Promise<void> {\n try {\n const traceDir =\n typeof options.dir === \"string\" && options.dir.trim() !== \"\"\n ? options.dir.trim()\n : getDefaultTraceDir();\n\n const files = await listTraceFiles(traceDir);\n if (files.length === 0) {\n console.log(\"No AgentInspect runs found\");\n console.log(`Trace directory: ${traceDir}`);\n return;\n }\n\n const summaries: RunSummary[] = [];\n for (const fileName of files) {\n try {\n const runId = getRunIdFromTraceFileName(fileName);\n if (runId === undefined) continue;\n const events = await readTraceEvents(runId, traceDir);\n const row = buildRunSummary(runId, events);\n if (row !== undefined) summaries.push(row);\n } catch {\n /* skip malformed */\n }\n }\n\n if (summaries.length === 0) {\n console.log(\"No AgentInspect runs found\");\n console.log(`Trace directory: ${traceDir}`);\n return;\n }\n\n summaries.sort((a, b) => b.startTime - a.startTime);\n\n const statusFilter = isStatusFilter(options.status)\n ? options.status\n : undefined;\n const filtered =\n statusFilter === undefined\n ? summaries\n : summaries.filter((s) => s.status === statusFilter);\n\n const limit = parseLimit(options.limit);\n const shown = filtered.slice(0, limit);\n\n console.log(\"Recent AgentInspect Runs\");\n for (const s of shown) {\n const icon = statusIcon(s.status);\n const dur = durationCell(s.status, s.durationMs);\n const ts = timestampCell(s.startTime);\n const nm = truncateName(s.name, 80);\n console.log(`${icon} ${s.runId} | ${nm} | ${dur} | ${ts}`);\n }\n\n console.log(\"\");\n console.log(`Showing ${shown.length} of ${filtered.length} runs`);\n console.log(`Trace directory: ${traceDir}`);\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n console.error(`[AgentInspect] list failed: ${msg}`);\n process.exitCode = 1;\n }\n}\n","import {\n formatDuration,\n formatTimestamp,\n getDefaultTraceDir,\n getIndent,\n getTraceFilePath,\n readTraceEvents,\n renderErrorLine,\n renderStepLine,\n} from \"@agent-inspect/core\";\nimport type {\n ErrorInfo,\n RunCompletedEvent,\n RunStartedEvent,\n RunStatus,\n StepCompletedEvent,\n StepStartedEvent,\n StepMetadata,\n StepStatus,\n StepType,\n TraceEvent,\n} from \"@agent-inspect/core\";\n\nexport interface ViewOptions {\n dir?: string;\n verbose?: boolean;\n json?: boolean;\n}\n\ntype StepNode = {\n id: string;\n parentId?: string;\n name: string;\n type: StepType;\n status: StepStatus;\n durationMs?: number;\n error?: ErrorInfo;\n startedAt: number;\n metadata?: StepMetadata;\n children: StepNode[];\n};\n\nfunction buildStepTree(events: TraceEvent[]): StepNode[] {\n const nodes = new Map<string, StepNode>();\n\n for (const e of events) {\n if (e.event === \"step_started\") {\n const s = e as StepStartedEvent;\n nodes.set(s.stepId, {\n id: s.stepId,\n parentId: s.parentId,\n name: s.name,\n type: s.type,\n status: \"running\",\n startedAt: s.startTime,\n metadata: s.metadata,\n children: [],\n });\n }\n }\n\n for (const e of events) {\n if (e.event !== \"step_completed\") continue;\n const c = e as StepCompletedEvent;\n const node = nodes.get(c.stepId);\n if (!node) continue;\n node.status = c.status;\n node.durationMs = c.durationMs;\n node.error = c.error;\n }\n\n const roots: StepNode[] = [];\n for (const n of nodes.values()) {\n if (n.parentId !== undefined && nodes.has(n.parentId)) {\n nodes.get(n.parentId)!.children.push(n);\n } else {\n roots.push(n);\n }\n }\n\n const sortByStarted = (a: StepNode, b: StepNode) => a.startedAt - b.startedAt;\n roots.sort(sortByStarted);\n for (const n of nodes.values()) {\n n.children.sort(sortByStarted);\n }\n\n return roots;\n}\n\nfunction printStepTree(\n nodes: StepNode[],\n depth: number,\n verbose: boolean,\n): void {\n for (const node of nodes) {\n console.log(\n renderStepLine(node.name, node.durationMs, node.status, depth),\n );\n if (node.error !== undefined) {\n if (verbose) {\n console.log(renderErrorLine(node.error, depth + 1));\n if (\n typeof node.error.stack === \"string\" &&\n node.error.stack.trim() !== \"\"\n ) {\n console.log(node.error.stack);\n }\n } else {\n console.log(\n renderErrorLine({ message: node.error.message }, depth + 1),\n );\n }\n }\n if (verbose) {\n console.log(`${getIndent(depth + 1)}type: ${node.type}`);\n if (\n node.metadata !== undefined &&\n Object.keys(node.metadata).length > 0\n ) {\n try {\n console.log(\n `${getIndent(depth + 1)}metadata: ${JSON.stringify(node.metadata)}`,\n );\n } catch {\n /* ignore */\n }\n }\n }\n printStepTree(node.children, depth + 1, verbose);\n }\n}\n\n/**\n * Prints a single run as a tree (or JSON). Missing runs and invalid traces set `process.exitCode`\n * without throwing from normal paths.\n */\nexport async function view(\n runId: string,\n options: ViewOptions = {},\n): Promise<void> {\n try {\n const id =\n typeof runId === \"string\" && runId.trim() !== \"\" ? runId.trim() : \"\";\n if (id === \"\") {\n console.error(\"Run id is required\");\n process.exitCode = 1;\n return;\n }\n\n const traceDir =\n typeof options.dir === \"string\" && options.dir.trim() !== \"\"\n ? options.dir.trim()\n : getDefaultTraceDir();\n\n const events = await readTraceEvents(id, traceDir);\n if (events.length === 0) {\n console.log(`Run not found: ${id}`);\n console.log(`Trace directory: ${traceDir}`);\n process.exitCode = 1;\n return;\n }\n\n if (options.json) {\n console.log(JSON.stringify(events, null, 2));\n return;\n }\n\n const started = events.find(\n (e): e is RunStartedEvent => e.event === \"run_started\",\n );\n if (!started) {\n console.error(\"Invalid trace: missing run_started\");\n process.exitCode = 1;\n return;\n }\n\n const completed = events.filter(\n (e): e is RunCompletedEvent => e.event === \"run_completed\",\n );\n const last = completed[completed.length - 1];\n const status: RunStatus = last ? last.status : \"running\";\n const durationLine =\n last !== undefined && Number.isFinite(last.durationMs)\n ? formatDuration(last.durationMs)\n : \"-\";\n\n const startedTs = Number.isFinite(started.startTime)\n ? started.startTime\n : started.timestamp;\n const startedLabel = formatTimestamp(startedTs);\n\n console.log(`AgentInspect Run: ${started.name}`);\n console.log(`ID: ${id}`);\n console.log(`Status: ${status}`);\n console.log(`Duration: ${durationLine}`);\n console.log(`Started: ${startedLabel}`);\n console.log(\"\");\n\n const tree = buildStepTree(events);\n console.log(\"Execution Tree:\");\n if (tree.length === 0) {\n console.log(\"No steps recorded\");\n } else {\n printStepTree(tree, 0, options.verbose === true);\n }\n\n console.log(\"\");\n console.log(`Trace file: ${getTraceFilePath(id, traceDir)}`);\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n console.error(`[AgentInspect] view failed: ${msg}`);\n process.exitCode = 1;\n }\n}\n","#!/usr/bin/env node\nimport { realpathSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nimport { Command, Option } from \"commander\";\n\nimport type { ListOptions } from \"./list.js\";\nimport { list } from \"./list.js\";\nimport { view } from \"./view.js\";\n\nexport function runCommand(action: () => Promise<void>): void {\n void action().catch((error: unknown) => {\n const msg = error instanceof Error ? error.message : String(error);\n console.error(`[AgentInspect] ${msg}`);\n process.exitCode = 1;\n });\n}\n\nexport function createCliProgram(): Command {\n const program = new Command(\"agent-inspect\")\n .description(\"Local-first execution-tree debugger for AI agents\")\n .version(\"0.1.0\");\n\n program\n .command(\"list\")\n .description(\"List recent AgentInspect runs\")\n .option(\"--dir <path>\", \"trace directory\")\n .option(\"--limit <number>\", \"max runs to show (default 20, max 100)\")\n .addOption(\n new Option(\"--status <status>\", \"filter by run status\").choices([\n \"running\",\n \"success\",\n \"error\",\n ]),\n )\n .action(\n (opts: {\n dir?: string;\n limit?: string;\n status?: ListOptions[\"status\"];\n }) => {\n runCommand(() => list(opts));\n },\n );\n\n program\n .command(\"view\")\n .description(\"View a single run trace\")\n .argument(\"<run-id>\", \"run id (e.g. from list output)\")\n .option(\"--dir <path>\", \"trace directory\")\n .option(\"--verbose\", \"show extra detail (types, metadata, error stacks)\")\n .option(\"--json\", \"print raw trace events as JSON\")\n .action(\n (\n runId: string,\n opts: { dir?: string; verbose?: boolean; json?: boolean },\n ) => {\n runCommand(() => view(runId, opts));\n },\n );\n\n return program;\n}\n\nfunction isPrimaryModule(): boolean {\n const entry = process.argv[1];\n if (!entry) return false;\n const selfPath = fileURLToPath(import.meta.url);\n try {\n return (\n realpathSync(path.resolve(entry)) === realpathSync(path.resolve(selfPath))\n );\n } catch {\n return path.resolve(entry) === path.resolve(selfPath);\n }\n}\n\nif (isPrimaryModule()) {\n createCliProgram().parse(process.argv);\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../core/src/types.ts","../../core/src/utils.ts","../../core/src/context.ts","../../core/src/storage.ts","../../core/src/terminal.ts","../../core/src/step.ts","../src/list.ts","../src/view.ts","../src/index.ts"],"names":["path","os","nanoid","mkdir","AsyncLocalStorage","appendFile","readFile","readdir","stat","chalk","endTime","durationMs","Command","Option","fileURLToPath","realpathSync"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Discriminator for what kind of work a {@link Step} represents.\n * `\"decision\"` captures agent branching/choices; other values cover runs, LLM calls, tools, and user-defined steps.\n */\nexport type StepType =\n | \"run\"\n | \"llm\"\n | \"tool\"\n | \"decision\"\n | \"logic\"\n | \"state\"\n | \"custom\";\n\n/** Lifecycle state of a single {@link Step}. */\nexport type StepStatus = \"running\" | \"success\" | \"error\";\n\n/** Lifecycle state of an entire {@link Run}. */\nexport type RunStatus = \"running\" | \"success\" | \"error\";\n\n/** Structured error attached to a run or step when status is `\"error\"`. */\nexport interface ErrorInfo {\n message: string;\n stack?: string;\n}\n\n/**\n * Optional token counts for a step (e.g. LLM usage).\n * Reserved for future roadmap; MVP does not compute or persist token usage.\n */\nexport interface TokenMetadata {\n input?: number;\n output?: number;\n}\n\n/** Arbitrary structured fields for a step; safe extensions use string keys. */\nexport interface StepMetadata {\n model?: string;\n toolName?: string;\n tokens?: TokenMetadata;\n retryCount?: number;\n [key: string]: unknown;\n}\n\n/**\n * One traced agent run (root of an execution tree).\n * MVP intentionally omits `input` / `output` on the run to limit PII, secrets, and serialization risk.\n */\nexport interface Run {\n id: string;\n name: string;\n status: RunStatus;\n startTime: number;\n endTime?: number;\n durationMs?: number;\n error?: ErrorInfo;\n metadata?: Record<string, unknown>;\n}\n\n/**\n * One node in the execution tree under a {@link Run}.\n * MVP intentionally omits `input` / `output`; capture/redaction may come in a later version.\n */\nexport interface Step {\n id: string;\n runId: string;\n parentId?: string;\n name: string;\n type: StepType;\n status: StepStatus;\n startTime: number;\n endTime?: number;\n durationMs?: number;\n error?: ErrorInfo;\n metadata?: StepMetadata;\n}\n\n/** Version of the JSONL trace line schema consumed by AgentInspect tooling. */\nexport type TraceSchemaVersion = \"0.1\";\n\n/** Fields shared by every persisted trace event line. */\nexport interface TraceEventBase {\n schemaVersion: TraceSchemaVersion;\n event: string;\n timestamp: number;\n}\n\n/** Emitted when a run begins. */\nexport interface RunStartedEvent extends TraceEventBase {\n event: \"run_started\";\n runId: string;\n name: string;\n startTime: number;\n metadata?: Record<string, unknown>;\n}\n\n/** Emitted when a run finishes successfully or with an error. */\nexport interface RunCompletedEvent extends TraceEventBase {\n event: \"run_completed\";\n runId: string;\n status: \"success\" | \"error\";\n endTime: number;\n durationMs: number;\n error?: ErrorInfo;\n}\n\n/** Emitted when a step begins (including nested steps under `parentId`). */\nexport interface StepStartedEvent extends TraceEventBase {\n event: \"step_started\";\n runId: string;\n stepId: string;\n parentId?: string;\n name: string;\n type: StepType;\n startTime: number;\n metadata?: StepMetadata;\n}\n\n/**\n * Emitted when a step finishes (success or failure).\n * Failures use `status: \"error\"` and optional {@link ErrorInfo}; there is no separate `step_failed` event in MVP.\n */\nexport interface StepCompletedEvent extends TraceEventBase {\n event: \"step_completed\";\n runId: string;\n stepId: string;\n status: \"success\" | \"error\";\n endTime: number;\n durationMs: number;\n error?: ErrorInfo;\n}\n\n/** Discriminated union of all MVP trace events written as JSONL lines. */\nexport type TraceEvent =\n | RunStartedEvent\n | RunCompletedEvent\n | StepStartedEvent\n | StepCompletedEvent;\n\n/** Options for `inspectRun()` (implemented in a later step). */\nexport interface InspectRunOptions {\n traceDir?: string;\n silent?: boolean;\n metadata?: Record<string, unknown>;\n}\n\n/** Options passed when opening a logical step (implemented in a later step). */\nexport interface StepOptions {\n type?: StepType;\n metadata?: StepMetadata;\n}\n\n/** Options for `observe()` — same surface as {@link InspectRunOptions} in MVP. */\nexport type ObserveOptions = InspectRunOptions;\n\n/**\n * Resolved settings for the active run while tracing is enabled.\n * Populated by runtime code in a later step; defined here for `context.ts`.\n */\nexport interface ExecutionContext {\n runId: string;\n runName: string;\n traceDir: string;\n silent: boolean;\n metadata?: Record<string, unknown>;\n}\n\n/** Stack position of the step currently executing (used by future context tracking). */\nexport interface ActiveStepContext {\n stepId: string;\n parentId?: string;\n depth: number;\n}\n\nconst STEP_TYPES: readonly StepType[] = [\n \"run\",\n \"llm\",\n \"tool\",\n \"decision\",\n \"logic\",\n \"state\",\n \"custom\",\n] as const;\n\nconst STEP_STATUSES: readonly StepStatus[] = [\n \"running\",\n \"success\",\n \"error\",\n] as const;\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\n/** Returns true if `value` is one of the MVP {@link StepType} literals. */\nexport function isStepType(value: unknown): value is StepType {\n return (\n typeof value === \"string\" &&\n (STEP_TYPES as readonly string[]).includes(value)\n );\n}\n\n/** Returns true if `value` is one of the MVP {@link StepStatus} literals. */\nexport function isStepStatus(value: unknown): value is StepStatus {\n return (\n typeof value === \"string\" &&\n (STEP_STATUSES as readonly string[]).includes(value)\n );\n}\n\n/**\n * Narrowing guard for a {@link TraceEvent} object with required MVP fields.\n * Does not deeply validate optional `metadata` shapes.\n */\nexport function isTraceEvent(value: unknown): value is TraceEvent {\n if (!isRecord(value)) return false;\n if (value.schemaVersion !== \"0.1\") return false;\n if (typeof value.timestamp !== \"number\") return false;\n if (typeof value.event !== \"string\") return false;\n\n switch (value.event) {\n case \"run_started\": {\n return (\n typeof value.runId === \"string\" &&\n typeof value.name === \"string\" &&\n typeof value.startTime === \"number\"\n );\n }\n case \"run_completed\": {\n return (\n typeof value.runId === \"string\" &&\n (value.status === \"success\" || value.status === \"error\") &&\n typeof value.endTime === \"number\" &&\n typeof value.durationMs === \"number\"\n );\n }\n case \"step_started\": {\n return (\n typeof value.runId === \"string\" &&\n typeof value.stepId === \"string\" &&\n typeof value.name === \"string\" &&\n isStepType(value.type) &&\n typeof value.startTime === \"number\"\n );\n }\n case \"step_completed\": {\n return (\n typeof value.runId === \"string\" &&\n typeof value.stepId === \"string\" &&\n (value.status === \"success\" || value.status === \"error\") &&\n typeof value.endTime === \"number\" &&\n typeof value.durationMs === \"number\"\n );\n }\n default:\n return false;\n }\n}\n","import { mkdir } from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\n\nimport { nanoid } from \"nanoid\";\n\nimport type { ErrorInfo } from \"./types.js\";\n\n/** Default folder under the user home for AgentInspect data. */\nexport const DEFAULT_TRACE_DIR_NAME = \".agent-inspect\";\n\n/** Subfolder where JSONL run traces are stored. */\nexport const RUNS_DIR_NAME = \"runs\";\n\n/** Writable trace root when the default home path cannot be used. */\nexport const FALLBACK_TRACE_DIR = path.join(\n os.tmpdir(),\n \"agent-inspect\",\n RUNS_DIR_NAME,\n);\n\n/** Maximum display length for run/step names before truncation. */\nexport const MAX_NAME_LENGTH = 100;\n\n/** Returns `run_` + a 10-character nanoid segment. */\nexport function createRunId(): string {\n return `run_${nanoid(10)}`;\n}\n\n/** Returns `step_` + a 10-character nanoid segment. */\nexport function createStepId(): string {\n return `step_${nanoid(10)}`;\n}\n\n/**\n * Formats a duration for CLI display.\n * Under 1000 ms uses whole milliseconds; from 1000 ms uses seconds with one decimal.\n */\nexport function formatDuration(ms: number): string {\n if (!Number.isFinite(ms) || ms < 0) {\n return \"0ms\";\n }\n if (ms < 1000) {\n return `${Math.floor(ms)}ms`;\n }\n const seconds = ms / 1000;\n return `${(Math.round(seconds * 10) / 10).toFixed(1)}s`;\n}\n\n/**\n * Formats a Unix timestamp (ms) as local `YYYY-MM-DD HH:mm:ss`.\n * Invalid values yield `\"Invalid date\"` (no throw).\n */\nexport function formatTimestamp(timestamp: number): string {\n if (!Number.isFinite(timestamp)) {\n return \"Invalid date\";\n }\n const d = new Date(timestamp);\n if (Number.isNaN(d.getTime())) {\n return \"Invalid date\";\n }\n const y = d.getFullYear();\n const mo = String(d.getMonth() + 1).padStart(2, \"0\");\n const day = String(d.getDate()).padStart(2, \"0\");\n const h = String(d.getHours()).padStart(2, \"0\");\n const min = String(d.getMinutes()).padStart(2, \"0\");\n const s = String(d.getSeconds()).padStart(2, \"0\");\n return `${y}-${mo}-${day} ${h}:${min}:${s}`;\n}\n\n/**\n * Default directory for trace files: `~/DEFAULT_TRACE_DIR_NAME/RUNS_DIR_NAME`.\n * Falls back to {@link FALLBACK_TRACE_DIR} when home cannot be resolved.\n */\nexport function getDefaultTraceDir(): string {\n try {\n const home = os.homedir();\n if (typeof home !== \"string\" || home.trim() === \"\") {\n return FALLBACK_TRACE_DIR;\n }\n return path.join(home, DEFAULT_TRACE_DIR_NAME, RUNS_DIR_NAME);\n } catch {\n return FALLBACK_TRACE_DIR;\n }\n}\n\n/**\n * Full path to the JSONL trace file for a run.\n * `runId` is passed through `path.basename` to avoid traversal; empty ids become `run_unknown`.\n */\nexport function getTraceFilePath(runId: string, traceDir?: string): string {\n const baseDir = traceDir ?? getDefaultTraceDir();\n let safeId =\n typeof runId === \"string\" && runId.trim() !== \"\" ? runId.trim() : \"run_unknown\";\n safeId = path.basename(safeId);\n if (safeId === \"\" || safeId === \".\" || safeId === \"..\") {\n safeId = \"run_unknown\";\n }\n return path.join(baseDir, `${safeId}.jsonl`);\n}\n\n/**\n * Ensures a trace directory exists (recursive). Tries {@link FALLBACK_TRACE_DIR} on failure.\n * Returns the directory path that callers should prefer: primary, fallback, or original if both mkdir attempts fail.\n * Emits concise `[AgentInspect]` warnings on failure; never throws.\n */\nexport async function ensureTraceDir(traceDir: string): Promise<string> {\n const primary = path.resolve(traceDir);\n try {\n await mkdir(primary, { recursive: true });\n return primary;\n } catch {\n warn(`Failed to create trace directory: ${primary}`);\n const fallback = path.resolve(FALLBACK_TRACE_DIR);\n try {\n await mkdir(fallback, { recursive: true });\n return fallback;\n } catch {\n warn(`Failed to create fallback trace directory: ${fallback}`);\n return primary;\n }\n }\n}\n\n/**\n * Normalizes any thrown/caught value into {@link ErrorInfo}.\n * Never throws (circular structures and non-JSON values fall back to a generic message).\n */\nexport function formatError(error: unknown): ErrorInfo {\n if (error instanceof Error) {\n const out: ErrorInfo = { message: error.message };\n if (typeof error.stack === \"string\" && error.stack.length > 0) {\n out.stack = error.stack;\n }\n return out;\n }\n if (typeof error === \"string\") {\n return { message: error };\n }\n if (error === null) {\n return { message: \"Unknown error: null\" };\n }\n if (error === undefined) {\n return { message: \"Unknown error: undefined\" };\n }\n if (\n typeof error === \"number\" ||\n typeof error === \"boolean\" ||\n typeof error === \"bigint\"\n ) {\n return { message: String(error) };\n }\n if (typeof error === \"object\") {\n try {\n return { message: JSON.stringify(error) };\n } catch {\n return { message: \"Unknown error\" };\n }\n }\n return { message: \"Unknown error\" };\n}\n\n/**\n * Truncates a display name to `maxLength`, appending `\"...\"` when shortened.\n * Empty or non-string input becomes `\"unnamed\"`.\n */\nexport function truncateName(name: string, maxLength = MAX_NAME_LENGTH): string {\n if (typeof name !== \"string\" || name.trim() === \"\") {\n return \"unnamed\";\n }\n const trimmed = name.trim();\n if (trimmed.length <= maxLength) {\n return trimmed;\n }\n const ellipsis = \"...\";\n const head = Math.max(0, maxLength - ellipsis.length);\n return `${trimmed.slice(0, head)}${ellipsis}`;\n}\n\n/**\n * Instrumentation-only warning to stderr. Not a general-purpose logger.\n * Optional `error` is summarized via {@link formatError} (message only).\n */\nexport function warn(message: string, error?: unknown): void {\n const base = `[AgentInspect] ${message}`;\n if (error === undefined) {\n console.warn(base);\n return;\n }\n console.warn(`${base}: ${formatError(error).message}`);\n}\n","import { AsyncLocalStorage } from \"node:async_hooks\";\n\nimport type { ExecutionContext } from \"./types.js\";\n\ntype RuntimeExecutionContext = ExecutionContext & {\n currentStepId?: string;\n currentDepth: number;\n};\n\nconst storage = new AsyncLocalStorage<RuntimeExecutionContext>();\n\nfunction toPublicContext(ctx: RuntimeExecutionContext): ExecutionContext {\n return {\n runId: ctx.runId,\n runName: ctx.runName,\n traceDir: ctx.traceDir,\n silent: ctx.silent,\n metadata: ctx.metadata,\n };\n}\n\nfunction invoke<T>(fn: () => T | Promise<T>): Promise<T> {\n return new Promise((resolve, reject) => {\n try {\n Promise.resolve(fn()).then(resolve, reject);\n } catch (e) {\n reject(e);\n }\n });\n}\n\n/** Returns the active run context, without internal step fields. */\nexport function getCurrentContext(): ExecutionContext | undefined {\n try {\n const s = storage.getStore();\n if (!s) return undefined;\n return toPublicContext(s);\n } catch {\n return undefined;\n }\n}\n\n/** Active `runId` when inside `runWithContext`, else `undefined`. */\nexport function getCurrentRunId(): string | undefined {\n try {\n return storage.getStore()?.runId;\n } catch {\n return undefined;\n }\n}\n\n/** Active `runName` when inside `runWithContext`, else `undefined`. */\nexport function getCurrentRunName(): string | undefined {\n try {\n return storage.getStore()?.runName;\n } catch {\n return undefined;\n }\n}\n\n/**\n * Active step id in this async scope (parent for nested `step()` calls).\n * `undefined` at run root or outside any run.\n */\nexport function getCurrentStepId(): string | undefined {\n try {\n return storage.getStore()?.currentStepId;\n } catch {\n return undefined;\n }\n}\n\n/** Alias of {@link getCurrentStepId} for readability in step instrumentation. */\nexport function getParentStepId(): string | undefined {\n return getCurrentStepId();\n}\n\n/**\n * Nesting depth: `0` at run root, increments by one per nested `runWithStepContext`.\n * Returns `0` outside any run.\n */\nexport function getCurrentDepth(): number {\n try {\n const d = storage.getStore()?.currentDepth;\n return typeof d === \"number\" && Number.isFinite(d) ? d : 0;\n } catch {\n return 0;\n }\n}\n\nexport function hasActiveContext(): boolean {\n try {\n return storage.getStore() !== undefined;\n } catch {\n return false;\n }\n}\n\nexport function getTraceDirFromContext(): string | undefined {\n try {\n return storage.getStore()?.traceDir;\n } catch {\n return undefined;\n }\n}\n\nexport function isSilentContext(): boolean {\n try {\n const s = storage.getStore();\n return s ? s.silent : false;\n } catch {\n return false;\n }\n}\n\n/**\n * Runs `fn` with a fresh AgentInspect run context (depth 0, no active step).\n * Propagates sync/async results and rejections; does not swallow user errors.\n */\nexport function runWithContext<T>(\n context: ExecutionContext,\n fn: () => Promise<T> | T,\n): Promise<T> {\n const runtime: RuntimeExecutionContext = {\n runId: context.runId,\n runName: context.runName,\n traceDir: context.traceDir,\n silent: context.silent,\n metadata: context.metadata,\n currentDepth: 0,\n };\n\n return new Promise((resolve, reject) => {\n storage.run(runtime, () => {\n try {\n Promise.resolve(fn()).then(resolve, reject);\n } catch (e) {\n reject(e);\n }\n });\n });\n}\n\n/**\n * Runs `fn` with `stepId` as the active step (incremented depth).\n * If no run is active, runs `fn` without altering async context.\n */\nexport function runWithStepContext<T>(\n stepId: string,\n fn: () => Promise<T> | T,\n): Promise<T> {\n let parent: RuntimeExecutionContext | undefined;\n try {\n parent = storage.getStore();\n } catch {\n parent = undefined;\n }\n\n if (!parent) {\n return invoke(fn);\n }\n\n const derived: RuntimeExecutionContext = {\n runId: parent.runId,\n runName: parent.runName,\n traceDir: parent.traceDir,\n silent: parent.silent,\n metadata: parent.metadata,\n currentStepId: stepId,\n currentDepth: parent.currentDepth + 1,\n };\n\n return new Promise((resolve, reject) => {\n storage.run(derived, () => {\n try {\n Promise.resolve(fn()).then(resolve, reject);\n } catch (e) {\n reject(e);\n }\n });\n });\n}\n","import { appendFile, readdir, readFile, stat, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nimport type { TraceEvent } from \"./types.js\";\nimport { isStepType } from \"./types.js\";\nimport {\n ensureTraceDir,\n FALLBACK_TRACE_DIR,\n getTraceFilePath,\n warn,\n} from \"./utils.js\";\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction nonEmptyString(value: unknown): value is string {\n return typeof value === \"string\" && value.trim() !== \"\";\n}\n\nfunction finiteNumber(value: unknown): value is number {\n return typeof value === \"number\" && Number.isFinite(value);\n}\n\nfunction optionalErrorInfo(value: unknown): boolean {\n if (value === undefined) return true;\n if (!isRecord(value)) return false;\n if (typeof value.message !== \"string\") return false;\n if (\"stack\" in value && value.stack !== undefined) {\n if (typeof value.stack !== \"string\") return false;\n }\n return true;\n}\n\n/**\n * Strict MVP validation before writing JSONL. Rejects empty ids, non-finite times, and malformed payloads.\n */\nexport function validateEvent(event: unknown): event is TraceEvent {\n if (!isRecord(event)) return false;\n if (event.schemaVersion !== \"0.1\") return false;\n if (!finiteNumber(event.timestamp)) return false;\n if (typeof event.event !== \"string\") return false;\n\n switch (event.event) {\n case \"run_started\": {\n if (\n !nonEmptyString(event.runId) ||\n !nonEmptyString(event.name) ||\n !finiteNumber(event.startTime)\n ) {\n return false;\n }\n if (event.metadata !== undefined && !isRecord(event.metadata)) {\n return false;\n }\n return true;\n }\n case \"run_completed\": {\n return (\n nonEmptyString(event.runId) &&\n (event.status === \"success\" || event.status === \"error\") &&\n finiteNumber(event.endTime) &&\n finiteNumber(event.durationMs) &&\n optionalErrorInfo(event.error)\n );\n }\n case \"step_started\": {\n if (\n !nonEmptyString(event.runId) ||\n !nonEmptyString(event.stepId) ||\n !nonEmptyString(event.name) ||\n !isStepType(event.type) ||\n !finiteNumber(event.startTime)\n ) {\n return false;\n }\n if (event.parentId !== undefined && typeof event.parentId !== \"string\") {\n return false;\n }\n if (event.metadata !== undefined && !isRecord(event.metadata)) {\n return false;\n }\n return true;\n }\n case \"step_completed\": {\n return (\n nonEmptyString(event.runId) &&\n nonEmptyString(event.stepId) &&\n (event.status === \"success\" || event.status === \"error\") &&\n finiteNumber(event.endTime) &&\n finiteNumber(event.durationMs) &&\n optionalErrorInfo(event.error)\n );\n }\n default:\n return false;\n }\n}\n\n/** Serializes a trace line as compact JSON without a trailing newline. */\nexport function serializeEvent(event: TraceEvent): string {\n try {\n return JSON.stringify(event);\n } catch {\n return \"\";\n }\n}\n\n/**\n * Creates (or truncates) an empty JSONL file for a run. Uses {@link ensureTraceDir} then {@link getTraceFilePath}.\n * On failure, retries once under {@link FALLBACK_TRACE_DIR}.\n */\nexport async function initializeTraceFile(\n runId: string,\n traceDir: string,\n): Promise<string | undefined> {\n try {\n const usable = await ensureTraceDir(traceDir);\n const filePath = getTraceFilePath(runId, usable);\n await writeFile(filePath, \"\", \"utf-8\");\n return filePath;\n } catch (e) {\n warn(\"Failed to initialize trace file\", e);\n }\n\n try {\n const usable = await ensureTraceDir(FALLBACK_TRACE_DIR);\n const filePath = getTraceFilePath(runId, usable);\n await writeFile(filePath, \"\", \"utf-8\");\n return filePath;\n } catch (e) {\n warn(\"Failed to initialize trace file on fallback directory\", e);\n return undefined;\n }\n}\n\n/**\n * Appends one validated JSONL line for `event.runId`. Falls back to {@link FALLBACK_TRACE_DIR} on append failure.\n */\nexport async function writeTraceEvent(\n event: TraceEvent,\n traceDir: string,\n): Promise<void> {\n if (!validateEvent(event)) {\n warn(\"Skipped invalid trace event (validation failed)\");\n return;\n }\n\n const line = serializeEvent(event);\n if (line === \"\") {\n warn(\"Skipped trace event (serialization failed)\");\n return;\n }\n\n const payload = `${line}\\n`;\n\n const tryAppend = async (dir: string): Promise<boolean> => {\n try {\n const usable = await ensureTraceDir(dir);\n const filePath = getTraceFilePath(event.runId, usable);\n await appendFile(filePath, payload, \"utf-8\");\n return true;\n } catch {\n return false;\n }\n };\n\n if (await tryAppend(traceDir)) {\n return;\n }\n\n warn(`Failed to append trace event for run ${event.runId}`);\n\n if (await tryAppend(FALLBACK_TRACE_DIR)) {\n return;\n }\n\n warn(\"Failed to append trace event to fallback directory\");\n}\n\n/**\n * Reads raw JSONL file contents for a run, or `undefined` if missing or unreadable.\n */\nexport async function readTraceFile(\n runId: string,\n traceDir: string,\n): Promise<string | undefined> {\n try {\n const filePath = getTraceFilePath(runId, traceDir);\n return await readFile(filePath, \"utf-8\");\n } catch (e) {\n if (e && typeof e === \"object\" && \"code\" in e && e.code === \"ENOENT\") {\n return undefined;\n }\n warn(\"Unexpected error reading trace file\", e);\n return undefined;\n }\n}\n\n/** Parses JSONL into validated {@link TraceEvent} rows; invalid lines are skipped with a warning. */\nexport async function readTraceEvents(\n runId: string,\n traceDir: string,\n): Promise<TraceEvent[]> {\n const out: TraceEvent[] = [];\n try {\n const raw = await readTraceFile(runId, traceDir);\n if (raw === undefined) {\n return out;\n }\n const lines = raw.split(\"\\n\");\n for (const line of lines) {\n const trimmed = line.trim();\n if (trimmed === \"\") continue;\n let parsed: unknown;\n try {\n parsed = JSON.parse(trimmed) as unknown;\n } catch {\n warn(\"Skipped invalid JSON line in trace file\");\n continue;\n }\n if (validateEvent(parsed)) {\n out.push(parsed);\n } else {\n warn(\"Skipped invalid trace event line in trace file\");\n }\n }\n } catch (e) {\n warn(\"Failed to read trace events\", e);\n }\n return out;\n}\n\n/**\n * Lists `.jsonl` file names in `traceDir`, newest by mtime first (name sort as tie-breaker).\n */\nexport async function listTraceFiles(traceDir: string): Promise<string[]> {\n try {\n const usable = path.resolve(traceDir);\n const names = await readdir(usable);\n const jsonl = names.filter((n) => n.endsWith(\".jsonl\"));\n const withStat = await Promise.all(\n jsonl.map(async (name) => {\n try {\n const st = await stat(path.join(usable, name));\n return { name, mtime: st.mtimeMs };\n } catch {\n return { name, mtime: 0 };\n }\n }),\n );\n withStat.sort((a, b) => {\n if (b.mtime !== a.mtime) return b.mtime - a.mtime;\n return a.name.localeCompare(b.name);\n });\n return withStat.map((x) => x.name);\n } catch {\n return [];\n }\n}\n\n/** Maps a `.jsonl` file name to its run id (basename only; no traversal). */\nexport function getRunIdFromTraceFileName(fileName: string): string | undefined {\n try {\n const base = path.basename(fileName);\n if (!base.endsWith(\".jsonl\")) return undefined;\n const id = base.slice(0, -\".jsonl\".length);\n return id === \"\" ? undefined : id;\n } catch {\n return undefined;\n }\n}\n","import chalk from \"chalk\";\n\nimport { isSilentContext } from \"./context.js\";\nimport type { ErrorInfo, RunStatus, StepStatus } from \"./types.js\";\nimport { formatDuration, truncateName } from \"./utils.js\";\n\n/** Two spaces per nesting level in terminal output. */\nexport const TERMINAL_INDENT = \" \";\n\n/** Max display length for names in terminal output. */\nexport const MAX_TERMINAL_NAME_LENGTH = 80;\n\n/** Max nesting depth used for indentation (prevents huge indents). */\nexport const MAX_TERMINAL_DEPTH = 10;\n\nfunction normalizeDepth(depth: number): number {\n if (!Number.isFinite(depth) || depth < 0) {\n return 0;\n }\n return Math.min(Math.floor(depth), MAX_TERMINAL_DEPTH);\n}\n\nfunction safePrint(line = \"\"): void {\n try {\n console.log(line);\n } catch {\n /* never break callers */\n }\n}\n\n/** Indentation string for a nesting depth (capped, never negative). */\nexport function getIndent(depth: number): string {\n return TERMINAL_INDENT.repeat(normalizeDepth(depth));\n}\n\n/** Truncates a display name for terminal use; invalid input becomes `\"unnamed\"`. */\nexport function formatTerminalName(name: string): string {\n if (typeof name !== \"string\" || name.trim() === \"\") {\n return \"unnamed\";\n }\n return truncateName(name, MAX_TERMINAL_NAME_LENGTH);\n}\n\nfunction getStatusIcon(status: StepStatus | RunStatus): string {\n if (status === \"success\") return chalk.green(\"✔\");\n if (status === \"error\") return chalk.red(\"✖\");\n return chalk.yellow(\"⏳\");\n}\n\n/** Renders a single step line (colored); does not consult silent mode. */\nexport function renderStepLine(\n name: string,\n durationMs: number | undefined,\n status: StepStatus,\n depth?: number,\n): string {\n try {\n const nm = formatTerminalName(name);\n const ind = getIndent(depth ?? 0);\n if (status === \"running\" && durationMs === undefined) {\n return `${ind}${chalk.yellow(\"⏳\")} ${nm}`;\n }\n const hasDur =\n durationMs !== undefined && Number.isFinite(durationMs as number);\n const dur = hasDur ? formatDuration(durationMs as number) : undefined;\n if (status === \"running\") {\n return dur !== undefined\n ? `${ind}${chalk.yellow(\"⏳\")} ${nm} (${dur})`\n : `${ind}${chalk.yellow(\"⏳\")} ${nm}`;\n }\n if (!hasDur || dur === undefined) {\n return `${ind}${chalk.yellow(\"⏳\")} ${nm}`;\n }\n if (status === \"success\") {\n return `${ind}${getStatusIcon(\"success\")} ${nm} (${dur})`;\n }\n return `${ind}${getStatusIcon(\"error\")} ${nm} (${dur})`;\n } catch {\n return \"\";\n }\n}\n\n/** Renders an error summary line (no stack in MVP). */\nexport function renderErrorLine(error: ErrorInfo, depth?: number): string {\n try {\n const msg =\n typeof error.message === \"string\" ? error.message : \"\";\n const ind = getIndent((depth ?? 0) + 1);\n return `${ind}Error: ${msg}`;\n } catch {\n return \"\";\n }\n}\n\n/** Plain-text run summary lines (no chalk) for stable testing and CLI reuse. */\nexport function renderRunSummary(\n durationMs: number,\n status: RunStatus,\n traceFilePath?: string,\n): string[] {\n try {\n const dur = Number.isFinite(durationMs)\n ? formatDuration(durationMs)\n : formatDuration(0);\n const head =\n status === \"error\" ? `Failed in ${dur}` : `Completed in ${dur}`;\n const lines = [head];\n if (traceFilePath !== undefined && traceFilePath.trim() !== \"\") {\n lines.push(`Trace: ${traceFilePath}`);\n }\n return lines;\n } catch {\n return [];\n }\n}\n\n/** Prints run header with icon and dim run id. */\nexport function printRunStart(runId: string, name: string): void {\n if (isSilentContext()) return;\n try {\n safePrint(\"\");\n const header = `${chalk.cyan.bold(\"🔍 AgentInspect:\")} ${formatTerminalName(name)} ${chalk.dim(`(${runId})`)}`;\n safePrint(header);\n } catch {\n /* noop */\n }\n}\n\n/** Prints a running step line. */\nexport function printStepStart(name: string, depth = 0): void {\n if (isSilentContext()) return;\n try {\n safePrint(renderStepLine(name, undefined, \"running\", depth));\n } catch {\n /* noop */\n }\n}\n\n/** Prints a completed step line with duration and status icon. */\nexport function printStepComplete(\n name: string,\n durationMs: number,\n status: StepStatus,\n depth = 0,\n): void {\n if (isSilentContext()) return;\n try {\n safePrint(renderStepLine(name, durationMs, status, depth));\n } catch {\n /* noop */\n }\n}\n\n/** Prints a structured error line (message only, no stack). */\nexport function printError(error: ErrorInfo, depth = 0): void {\n if (isSilentContext()) return;\n try {\n safePrint(renderErrorLine(error, depth));\n } catch {\n /* noop */\n }\n}\n\n/** Prints run completion summary and optional trace path. */\nexport function printRunComplete(\n _name: string,\n _runId: string,\n durationMs: number,\n status: RunStatus,\n traceFilePath?: string,\n): void {\n if (isSilentContext()) return;\n try {\n const lines = renderRunSummary(durationMs, status, traceFilePath);\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i]!;\n if (i === 0) {\n const color =\n status === \"error\"\n ? chalk.red\n : status === \"running\"\n ? chalk.yellow\n : chalk.green;\n safePrint(color(line));\n } else {\n safePrint(chalk.dim(line));\n }\n }\n } catch {\n /* noop */\n }\n}\n\n/** Prints which step failed. */\nexport function printFailedAt(stepName: string): void {\n if (isSilentContext()) return;\n try {\n safePrint(`Failed at: ${formatTerminalName(stepName)}`);\n } catch {\n /* noop */\n }\n}\n","import { getCurrentContext, getCurrentDepth, getParentStepId, runWithStepContext } from \"./context.js\";\nimport type { StepOptions, StepType, TraceEvent } from \"./types.js\";\nimport { writeTraceEvent } from \"./storage.js\";\nimport { printFailedAt, printError, printStepComplete, printStepStart } from \"./terminal.js\";\nimport { createStepId, formatError, truncateName, warn } from \"./utils.js\";\n\nfunction normalizeStepName(name: unknown): string {\n if (typeof name !== \"string\" || name.trim() === \"\") {\n return \"unnamed-step\";\n }\n return truncateName(name.trim(), 100);\n}\n\nasync function safeInstrumentation(\n label: string,\n op: () => void | Promise<void>,\n): Promise<void> {\n try {\n await Promise.resolve(op());\n } catch (e) {\n warn(`step: ${label}`, e);\n }\n}\n\nasync function stepImpl<T>(\n name: string,\n fn: () => Promise<T> | T,\n options?: StepOptions,\n): Promise<T> {\n if (typeof fn !== \"function\") {\n throw new TypeError(\"step requires `fn` to be a function\");\n }\n\n const stepName = normalizeStepName(name);\n const context = getCurrentContext();\n\n if (!context) {\n warn(\"step() called outside inspectRun(); executing without instrumentation\");\n return Promise.resolve(fn());\n }\n\n const stepId = createStepId();\n const renderDepth = getCurrentDepth();\n const parentId = getParentStepId();\n const stepType: StepType = options?.type ?? \"logic\";\n const metadata = options?.metadata;\n const startTime = Date.now();\n\n await safeInstrumentation(\"writeTraceEvent(step_started)\", async () => {\n const started: TraceEvent = {\n schemaVersion: \"0.1\",\n event: \"step_started\",\n timestamp: startTime,\n runId: context.runId,\n stepId,\n ...(typeof parentId === \"string\" && parentId.trim() !== \"\"\n ? { parentId }\n : {}),\n name: stepName,\n type: stepType,\n startTime,\n ...(metadata !== undefined ? { metadata } : {}),\n };\n await writeTraceEvent(started, context.traceDir);\n });\n\n await safeInstrumentation(\"printStepStart\", () => {\n printStepStart(stepName, renderDepth);\n });\n\n let result: T;\n try {\n result = await runWithStepContext(stepId, async () => {\n return await Promise.resolve(fn());\n });\n } catch (userError) {\n const endTime = Date.now();\n const durationMs = endTime - startTime;\n const formatted = formatError(userError);\n\n await safeInstrumentation(\"writeTraceEvent(step_completed error)\", async () => {\n const completed: TraceEvent = {\n schemaVersion: \"0.1\",\n event: \"step_completed\",\n timestamp: endTime,\n runId: context.runId,\n stepId,\n status: \"error\",\n endTime,\n durationMs,\n error: formatted,\n };\n await writeTraceEvent(completed, context.traceDir);\n });\n\n await safeInstrumentation(\"printStepComplete(error)\", () => {\n printStepComplete(stepName, durationMs, \"error\", renderDepth);\n });\n await safeInstrumentation(\"printError\", () => {\n printError(formatted, renderDepth);\n });\n await safeInstrumentation(\"printFailedAt\", () => {\n printFailedAt(stepName);\n });\n\n throw userError;\n }\n\n const endTime = Date.now();\n const durationMs = endTime - startTime;\n\n await safeInstrumentation(\"writeTraceEvent(step_completed success)\", async () => {\n const completed: TraceEvent = {\n schemaVersion: \"0.1\",\n event: \"step_completed\",\n timestamp: endTime,\n runId: context.runId,\n stepId,\n status: \"success\",\n endTime,\n durationMs,\n };\n await writeTraceEvent(completed, context.traceDir);\n });\n\n await safeInstrumentation(\"printStepComplete(success)\", () => {\n printStepComplete(stepName, durationMs, \"success\", renderDepth);\n });\n\n return result;\n}\n\n/** Callable step tracer plus {@link step.llm} and {@link step.tool} shortcuts. */\nexport type StepFunction = {\n <T>(name: string, fn: () => Promise<T> | T, options?: StepOptions): Promise<T>;\n llm: <T>(model: string, fn: () => Promise<T> | T) => Promise<T>;\n tool: <T>(toolName: string, fn: () => Promise<T> | T) => Promise<T>;\n};\n\nasync function stepLlm<T>(model: string, fn: () => Promise<T> | T): Promise<T> {\n const modelName =\n typeof model === \"string\" && model.trim() !== \"\"\n ? model.trim()\n : \"unknown-model\";\n return stepImpl<T>(`llm:${modelName}`, fn, {\n type: \"llm\",\n metadata: { model: modelName },\n });\n}\n\nasync function stepTool<T>(\n toolName: string,\n fn: () => Promise<T> | T,\n): Promise<T> {\n const normalized =\n typeof toolName === \"string\" && toolName.trim() !== \"\"\n ? toolName.trim()\n : \"unknown-tool\";\n return stepImpl<T>(`tool:${normalized}`, fn, {\n type: \"tool\",\n metadata: { toolName: normalized },\n });\n}\n\n/**\n * Traces a named unit of work inside `inspectRun` (`step_started` / `step_completed`, optional terminal).\n * Outside a run, executes `fn` with a warn only. Preserves return values and rethrows user errors unchanged.\n *\n * - `step.llm(model, fn)` — `type: \"llm\"`, `metadata.model` (no SDK calls or token counting).\n * - `step.tool(toolName, fn)` — `type: \"tool\"`, `metadata.toolName` (no framework interception).\n */\nexport const step = Object.assign(stepImpl, {\n llm: stepLlm,\n tool: stepTool,\n}) as StepFunction;\n","import {\n formatDuration,\n formatTimestamp,\n getDefaultTraceDir,\n listTraceFiles,\n readTraceEvents,\n getRunIdFromTraceFileName,\n truncateName,\n} from \"@agent-inspect/core\";\nimport type {\n RunCompletedEvent,\n RunStartedEvent,\n TraceEvent,\n} from \"@agent-inspect/core\";\n\nexport interface ListOptions {\n dir?: string;\n limit?: string;\n status?: \"running\" | \"success\" | \"error\";\n}\n\ntype RunSummary = {\n runId: string;\n name: string;\n status: \"running\" | \"success\" | \"error\";\n durationMs?: number;\n startTime: number;\n};\n\nfunction parseLimit(raw?: string): number {\n const fallback = 20;\n if (raw === undefined || raw.trim() === \"\") return fallback;\n const n = Number.parseInt(raw, 10);\n if (!Number.isFinite(n) || n <= 0) return fallback;\n return Math.min(n, 100);\n}\n\nfunction isStatusFilter(\n value: unknown,\n): value is \"running\" | \"success\" | \"error\" {\n return value === \"running\" || value === \"success\" || value === \"error\";\n}\n\nfunction buildRunSummary(\n runId: string,\n events: TraceEvent[],\n): RunSummary | undefined {\n const started = events.find(\n (e): e is RunStartedEvent => e.event === \"run_started\",\n );\n if (!started) return undefined;\n\n const completed = events.filter(\n (e): e is RunCompletedEvent => e.event === \"run_completed\",\n );\n const last = completed[completed.length - 1];\n\n const status: RunSummary[\"status\"] = last ? last.status : \"running\";\n const startTime = Number.isFinite(started.startTime)\n ? started.startTime\n : Number.isFinite(started.timestamp)\n ? started.timestamp\n : 0;\n\n const name =\n typeof started.name === \"string\" && started.name.trim() !== \"\"\n ? started.name.trim()\n : \"unknown-run\";\n\n return {\n runId,\n name,\n status,\n durationMs: last !== undefined ? last.durationMs : undefined,\n startTime,\n };\n}\n\nfunction statusIcon(status: RunSummary[\"status\"]): string {\n if (status === \"success\") return \"✓\";\n if (status === \"error\") return \"✗\";\n return \"⏳\";\n}\n\nfunction durationCell(\n status: RunSummary[\"status\"],\n durationMs?: number,\n): string {\n if (status === \"running\") return \"-\";\n if (durationMs !== undefined && Number.isFinite(durationMs)) {\n return formatDuration(durationMs);\n }\n return \"-\";\n}\n\nfunction timestampCell(startTime: number): string {\n if (!Number.isFinite(startTime) || startTime <= 0) return \"Invalid date\";\n const s = formatTimestamp(startTime);\n return s === \"Invalid date\" ? \"Invalid date\" : s;\n}\n\n/**\n * Prints a table of recent runs under the trace directory. Swallows expected I/O issues;\n * unexpected failures set `process.exitCode` and log a short message (no `process.exit`).\n */\nexport async function list(options: ListOptions = {}): Promise<void> {\n try {\n const traceDir =\n typeof options.dir === \"string\" && options.dir.trim() !== \"\"\n ? options.dir.trim()\n : getDefaultTraceDir();\n\n const files = await listTraceFiles(traceDir);\n if (files.length === 0) {\n console.log(\"No AgentInspect runs found\");\n console.log(`Trace directory: ${traceDir}`);\n return;\n }\n\n const summaries: RunSummary[] = [];\n for (const fileName of files) {\n try {\n const runId = getRunIdFromTraceFileName(fileName);\n if (runId === undefined) continue;\n const events = await readTraceEvents(runId, traceDir);\n const row = buildRunSummary(runId, events);\n if (row !== undefined) summaries.push(row);\n } catch {\n /* skip malformed */\n }\n }\n\n if (summaries.length === 0) {\n console.log(\"No AgentInspect runs found\");\n console.log(`Trace directory: ${traceDir}`);\n return;\n }\n\n summaries.sort((a, b) => b.startTime - a.startTime);\n\n const statusFilter = isStatusFilter(options.status)\n ? options.status\n : undefined;\n const filtered =\n statusFilter === undefined\n ? summaries\n : summaries.filter((s) => s.status === statusFilter);\n\n const limit = parseLimit(options.limit);\n const shown = filtered.slice(0, limit);\n\n console.log(\"Recent AgentInspect Runs\");\n for (const s of shown) {\n const icon = statusIcon(s.status);\n const dur = durationCell(s.status, s.durationMs);\n const ts = timestampCell(s.startTime);\n const nm = truncateName(s.name, 80);\n console.log(`${icon} ${s.runId} | ${nm} | ${dur} | ${ts}`);\n }\n\n console.log(\"\");\n console.log(`Showing ${shown.length} of ${filtered.length} runs`);\n console.log(`Trace directory: ${traceDir}`);\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n console.error(`[AgentInspect] list failed: ${msg}`);\n process.exitCode = 1;\n }\n}\n","import {\n formatDuration,\n formatTimestamp,\n getDefaultTraceDir,\n getIndent,\n getTraceFilePath,\n readTraceEvents,\n renderErrorLine,\n renderStepLine,\n} from \"@agent-inspect/core\";\nimport type {\n ErrorInfo,\n RunCompletedEvent,\n RunStartedEvent,\n RunStatus,\n StepCompletedEvent,\n StepStartedEvent,\n StepMetadata,\n StepStatus,\n StepType,\n TraceEvent,\n} from \"@agent-inspect/core\";\n\nexport interface ViewOptions {\n dir?: string;\n verbose?: boolean;\n json?: boolean;\n}\n\ntype StepNode = {\n id: string;\n parentId?: string;\n name: string;\n type: StepType;\n status: StepStatus;\n durationMs?: number;\n error?: ErrorInfo;\n startedAt: number;\n metadata?: StepMetadata;\n children: StepNode[];\n};\n\nfunction buildStepTree(events: TraceEvent[]): StepNode[] {\n const nodes = new Map<string, StepNode>();\n\n for (const e of events) {\n if (e.event === \"step_started\") {\n const s = e as StepStartedEvent;\n nodes.set(s.stepId, {\n id: s.stepId,\n parentId: s.parentId,\n name: s.name,\n type: s.type,\n status: \"running\",\n startedAt: s.startTime,\n metadata: s.metadata,\n children: [],\n });\n }\n }\n\n for (const e of events) {\n if (e.event !== \"step_completed\") continue;\n const c = e as StepCompletedEvent;\n const node = nodes.get(c.stepId);\n if (!node) continue;\n node.status = c.status;\n node.durationMs = c.durationMs;\n node.error = c.error;\n }\n\n const roots: StepNode[] = [];\n for (const n of nodes.values()) {\n if (n.parentId !== undefined && nodes.has(n.parentId)) {\n nodes.get(n.parentId)!.children.push(n);\n } else {\n roots.push(n);\n }\n }\n\n const sortByStarted = (a: StepNode, b: StepNode) => a.startedAt - b.startedAt;\n roots.sort(sortByStarted);\n for (const n of nodes.values()) {\n n.children.sort(sortByStarted);\n }\n\n return roots;\n}\n\nfunction printStepTree(\n nodes: StepNode[],\n depth: number,\n verbose: boolean,\n): void {\n for (const node of nodes) {\n console.log(\n renderStepLine(node.name, node.durationMs, node.status, depth),\n );\n if (node.error !== undefined) {\n if (verbose) {\n console.log(renderErrorLine(node.error, depth + 1));\n if (\n typeof node.error.stack === \"string\" &&\n node.error.stack.trim() !== \"\"\n ) {\n console.log(node.error.stack);\n }\n } else {\n console.log(\n renderErrorLine({ message: node.error.message }, depth + 1),\n );\n }\n }\n if (verbose) {\n console.log(`${getIndent(depth + 1)}type: ${node.type}`);\n if (\n node.metadata !== undefined &&\n Object.keys(node.metadata).length > 0\n ) {\n try {\n console.log(\n `${getIndent(depth + 1)}metadata: ${JSON.stringify(node.metadata)}`,\n );\n } catch {\n /* ignore */\n }\n }\n }\n printStepTree(node.children, depth + 1, verbose);\n }\n}\n\n/**\n * Prints a single run as a tree (or JSON). Missing runs and invalid traces set `process.exitCode`\n * without throwing from normal paths.\n */\nexport async function view(\n runId: string,\n options: ViewOptions = {},\n): Promise<void> {\n try {\n const id =\n typeof runId === \"string\" && runId.trim() !== \"\" ? runId.trim() : \"\";\n if (id === \"\") {\n console.error(\"Run id is required\");\n process.exitCode = 1;\n return;\n }\n\n const traceDir =\n typeof options.dir === \"string\" && options.dir.trim() !== \"\"\n ? options.dir.trim()\n : getDefaultTraceDir();\n\n const events = await readTraceEvents(id, traceDir);\n if (events.length === 0) {\n console.log(`Run not found: ${id}`);\n console.log(`Trace directory: ${traceDir}`);\n process.exitCode = 1;\n return;\n }\n\n if (options.json) {\n console.log(JSON.stringify(events, null, 2));\n return;\n }\n\n const started = events.find(\n (e): e is RunStartedEvent => e.event === \"run_started\",\n );\n if (!started) {\n console.error(\"Invalid trace: missing run_started\");\n process.exitCode = 1;\n return;\n }\n\n const completed = events.filter(\n (e): e is RunCompletedEvent => e.event === \"run_completed\",\n );\n const last = completed[completed.length - 1];\n const status: RunStatus = last ? last.status : \"running\";\n const durationLine =\n last !== undefined && Number.isFinite(last.durationMs)\n ? formatDuration(last.durationMs)\n : \"-\";\n\n const startedTs = Number.isFinite(started.startTime)\n ? started.startTime\n : started.timestamp;\n const startedLabel = formatTimestamp(startedTs);\n\n console.log(`AgentInspect Run: ${started.name}`);\n console.log(`ID: ${id}`);\n console.log(`Status: ${status}`);\n console.log(`Duration: ${durationLine}`);\n console.log(`Started: ${startedLabel}`);\n console.log(\"\");\n\n const tree = buildStepTree(events);\n console.log(\"Execution Tree:\");\n if (tree.length === 0) {\n console.log(\"No steps recorded\");\n } else {\n printStepTree(tree, 0, options.verbose === true);\n }\n\n console.log(\"\");\n console.log(`Trace file: ${getTraceFilePath(id, traceDir)}`);\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n console.error(`[AgentInspect] view failed: ${msg}`);\n process.exitCode = 1;\n }\n}\n","#!/usr/bin/env node\nimport { realpathSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nimport { Command, Option } from \"commander\";\n\nimport type { ListOptions } from \"./list.js\";\nimport { list } from \"./list.js\";\nimport { view } from \"./view.js\";\n\nexport function runCommand(action: () => Promise<void>): void {\n void action().catch((error: unknown) => {\n const msg = error instanceof Error ? error.message : String(error);\n console.error(`[AgentInspect] ${msg}`);\n process.exitCode = 1;\n });\n}\n\nexport function createCliProgram(): Command {\n const program = new Command(\"agent-inspect\")\n .description(\"Local-first execution-tree debugger for AI agents\")\n .version(\"0.1.0\");\n\n program\n .command(\"list\")\n .description(\"List recent AgentInspect runs\")\n .option(\"--dir <path>\", \"trace directory\")\n .option(\"--limit <number>\", \"max runs to show (default 20, max 100)\")\n .addOption(\n new Option(\"--status <status>\", \"filter by run status\").choices([\n \"running\",\n \"success\",\n \"error\",\n ]),\n )\n .action(\n (opts: {\n dir?: string;\n limit?: string;\n status?: ListOptions[\"status\"];\n }) => {\n runCommand(() => list(opts));\n },\n );\n\n program\n .command(\"view\")\n .description(\"View a single run trace\")\n .argument(\"<run-id>\", \"run id (e.g. from list output)\")\n .option(\"--dir <path>\", \"trace directory\")\n .option(\"--verbose\", \"show extra detail (types, metadata, error stacks)\")\n .option(\"--json\", \"print raw trace events as JSON\")\n .action(\n (\n runId: string,\n opts: { dir?: string; verbose?: boolean; json?: boolean },\n ) => {\n runCommand(() => view(runId, opts));\n },\n );\n\n return program;\n}\n\nfunction isPrimaryModule(): boolean {\n const entry = process.argv[1];\n if (!entry) return false;\n const selfPath = fileURLToPath(import.meta.url);\n try {\n return (\n realpathSync(path.resolve(entry)) === realpathSync(path.resolve(selfPath))\n );\n } catch {\n return path.resolve(entry) === path.resolve(selfPath);\n }\n}\n\nif (isPrimaryModule()) {\n createCliProgram().parse(process.argv);\n}\n"]}
|
|
@@ -9,6 +9,7 @@ import { nanoid } from 'nanoid';
|
|
|
9
9
|
import { AsyncLocalStorage } from 'async_hooks';
|
|
10
10
|
import chalk from 'chalk';
|
|
11
11
|
|
|
12
|
+
// packages/core/src/types.ts
|
|
12
13
|
var STEP_TYPES = [
|
|
13
14
|
"run",
|
|
14
15
|
"llm",
|
|
@@ -227,7 +228,7 @@ function runWithStepContext(stepId, fn) {
|
|
|
227
228
|
});
|
|
228
229
|
});
|
|
229
230
|
}
|
|
230
|
-
function
|
|
231
|
+
function isRecord(value) {
|
|
231
232
|
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
232
233
|
}
|
|
233
234
|
function nonEmptyString(value) {
|
|
@@ -238,7 +239,7 @@ function finiteNumber(value) {
|
|
|
238
239
|
}
|
|
239
240
|
function optionalErrorInfo(value) {
|
|
240
241
|
if (value === void 0) return true;
|
|
241
|
-
if (!
|
|
242
|
+
if (!isRecord(value)) return false;
|
|
242
243
|
if (typeof value.message !== "string") return false;
|
|
243
244
|
if ("stack" in value && value.stack !== void 0) {
|
|
244
245
|
if (typeof value.stack !== "string") return false;
|
|
@@ -246,7 +247,7 @@ function optionalErrorInfo(value) {
|
|
|
246
247
|
return true;
|
|
247
248
|
}
|
|
248
249
|
function validateEvent(event) {
|
|
249
|
-
if (!
|
|
250
|
+
if (!isRecord(event)) return false;
|
|
250
251
|
if (event.schemaVersion !== "0.1") return false;
|
|
251
252
|
if (!finiteNumber(event.timestamp)) return false;
|
|
252
253
|
if (typeof event.event !== "string") return false;
|
|
@@ -255,7 +256,7 @@ function validateEvent(event) {
|
|
|
255
256
|
if (!nonEmptyString(event.runId) || !nonEmptyString(event.name) || !finiteNumber(event.startTime)) {
|
|
256
257
|
return false;
|
|
257
258
|
}
|
|
258
|
-
if (event.metadata !== void 0 && !
|
|
259
|
+
if (event.metadata !== void 0 && !isRecord(event.metadata)) {
|
|
259
260
|
return false;
|
|
260
261
|
}
|
|
261
262
|
return true;
|
|
@@ -270,7 +271,7 @@ function validateEvent(event) {
|
|
|
270
271
|
if (event.parentId !== void 0 && typeof event.parentId !== "string") {
|
|
271
272
|
return false;
|
|
272
273
|
}
|
|
273
|
-
if (event.metadata !== void 0 && !
|
|
274
|
+
if (event.metadata !== void 0 && !isRecord(event.metadata)) {
|
|
274
275
|
return false;
|
|
275
276
|
}
|
|
276
277
|
return true;
|
|
@@ -484,13 +485,15 @@ function printFailedAt(stepName) {
|
|
|
484
485
|
} catch {
|
|
485
486
|
}
|
|
486
487
|
}
|
|
488
|
+
|
|
489
|
+
// packages/core/src/step.ts
|
|
487
490
|
function normalizeStepName(name) {
|
|
488
491
|
if (typeof name !== "string" || name.trim() === "") {
|
|
489
492
|
return "unnamed-step";
|
|
490
493
|
}
|
|
491
494
|
return truncateName(name.trim(), 100);
|
|
492
495
|
}
|
|
493
|
-
async function
|
|
496
|
+
async function safeInstrumentation(label, op) {
|
|
494
497
|
try {
|
|
495
498
|
await Promise.resolve(op());
|
|
496
499
|
} catch (e) {
|
|
@@ -513,7 +516,7 @@ async function stepImpl(name, fn, options) {
|
|
|
513
516
|
const stepType = options?.type ?? "logic";
|
|
514
517
|
const metadata = options?.metadata;
|
|
515
518
|
const startTime = Date.now();
|
|
516
|
-
await
|
|
519
|
+
await safeInstrumentation("writeTraceEvent(step_started)", async () => {
|
|
517
520
|
const started = {
|
|
518
521
|
schemaVersion: "0.1",
|
|
519
522
|
event: "step_started",
|
|
@@ -528,7 +531,7 @@ async function stepImpl(name, fn, options) {
|
|
|
528
531
|
};
|
|
529
532
|
await writeTraceEvent(started, context.traceDir);
|
|
530
533
|
});
|
|
531
|
-
await
|
|
534
|
+
await safeInstrumentation("printStepStart", () => {
|
|
532
535
|
printStepStart(stepName, renderDepth);
|
|
533
536
|
});
|
|
534
537
|
let result;
|
|
@@ -540,7 +543,7 @@ async function stepImpl(name, fn, options) {
|
|
|
540
543
|
const endTime2 = Date.now();
|
|
541
544
|
const durationMs2 = endTime2 - startTime;
|
|
542
545
|
const formatted = formatError(userError);
|
|
543
|
-
await
|
|
546
|
+
await safeInstrumentation("writeTraceEvent(step_completed error)", async () => {
|
|
544
547
|
const completed = {
|
|
545
548
|
schemaVersion: "0.1",
|
|
546
549
|
event: "step_completed",
|
|
@@ -554,20 +557,20 @@ async function stepImpl(name, fn, options) {
|
|
|
554
557
|
};
|
|
555
558
|
await writeTraceEvent(completed, context.traceDir);
|
|
556
559
|
});
|
|
557
|
-
await
|
|
560
|
+
await safeInstrumentation("printStepComplete(error)", () => {
|
|
558
561
|
printStepComplete(stepName, durationMs2, "error", renderDepth);
|
|
559
562
|
});
|
|
560
|
-
await
|
|
563
|
+
await safeInstrumentation("printError", () => {
|
|
561
564
|
printError(formatted, renderDepth);
|
|
562
565
|
});
|
|
563
|
-
await
|
|
566
|
+
await safeInstrumentation("printFailedAt", () => {
|
|
564
567
|
printFailedAt(stepName);
|
|
565
568
|
});
|
|
566
569
|
throw userError;
|
|
567
570
|
}
|
|
568
571
|
const endTime = Date.now();
|
|
569
572
|
const durationMs = endTime - startTime;
|
|
570
|
-
await
|
|
573
|
+
await safeInstrumentation("writeTraceEvent(step_completed success)", async () => {
|
|
571
574
|
const completed = {
|
|
572
575
|
schemaVersion: "0.1",
|
|
573
576
|
event: "step_completed",
|
|
@@ -580,7 +583,7 @@ async function stepImpl(name, fn, options) {
|
|
|
580
583
|
};
|
|
581
584
|
await writeTraceEvent(completed, context.traceDir);
|
|
582
585
|
});
|
|
583
|
-
await
|
|
586
|
+
await safeInstrumentation("printStepComplete(success)", () => {
|
|
584
587
|
printStepComplete(stepName, durationMs, "success", renderDepth);
|
|
585
588
|
});
|
|
586
589
|
return result;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../core/src/types.ts","../../core/src/utils.ts","../../core/src/context.ts","../../core/src/storage.ts","../../core/src/terminal.ts","../../core/src/step.ts","../src/list.ts","../src/view.ts","../src/index.ts"],"names":["isRecord","path","safeInstrumentation","endTime","durationMs"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * Discriminator for what kind of work a {@link Step} represents.\n * `\"decision\"` captures agent branching/choices; other values cover runs, LLM calls, tools, and user-defined steps.\n */\nexport type StepType =\n | \"run\"\n | \"llm\"\n | \"tool\"\n | \"decision\"\n | \"logic\"\n | \"state\"\n | \"custom\";\n\n/** Lifecycle state of a single {@link Step}. */\nexport type StepStatus = \"running\" | \"success\" | \"error\";\n\n/** Lifecycle state of an entire {@link Run}. */\nexport type RunStatus = \"running\" | \"success\" | \"error\";\n\n/** Structured error attached to a run or step when status is `\"error\"`. */\nexport interface ErrorInfo {\n message: string;\n stack?: string;\n}\n\n/**\n * Optional token counts for a step (e.g. LLM usage).\n * Reserved for future roadmap; MVP does not compute or persist token usage.\n */\nexport interface TokenMetadata {\n input?: number;\n output?: number;\n}\n\n/** Arbitrary structured fields for a step; safe extensions use string keys. */\nexport interface StepMetadata {\n model?: string;\n toolName?: string;\n tokens?: TokenMetadata;\n retryCount?: number;\n [key: string]: unknown;\n}\n\n/**\n * One traced agent run (root of an execution tree).\n * MVP intentionally omits `input` / `output` on the run to limit PII, secrets, and serialization risk.\n */\nexport interface Run {\n id: string;\n name: string;\n status: RunStatus;\n startTime: number;\n endTime?: number;\n durationMs?: number;\n error?: ErrorInfo;\n metadata?: Record<string, unknown>;\n}\n\n/**\n * One node in the execution tree under a {@link Run}.\n * MVP intentionally omits `input` / `output`; capture/redaction may come in a later version.\n */\nexport interface Step {\n id: string;\n runId: string;\n parentId?: string;\n name: string;\n type: StepType;\n status: StepStatus;\n startTime: number;\n endTime?: number;\n durationMs?: number;\n error?: ErrorInfo;\n metadata?: StepMetadata;\n}\n\n/** Version of the JSONL trace line schema consumed by AgentInspect tooling. */\nexport type TraceSchemaVersion = \"0.1\";\n\n/** Fields shared by every persisted trace event line. */\nexport interface TraceEventBase {\n schemaVersion: TraceSchemaVersion;\n event: string;\n timestamp: number;\n}\n\n/** Emitted when a run begins. */\nexport interface RunStartedEvent extends TraceEventBase {\n event: \"run_started\";\n runId: string;\n name: string;\n startTime: number;\n metadata?: Record<string, unknown>;\n}\n\n/** Emitted when a run finishes successfully or with an error. */\nexport interface RunCompletedEvent extends TraceEventBase {\n event: \"run_completed\";\n runId: string;\n status: \"success\" | \"error\";\n endTime: number;\n durationMs: number;\n error?: ErrorInfo;\n}\n\n/** Emitted when a step begins (including nested steps under `parentId`). */\nexport interface StepStartedEvent extends TraceEventBase {\n event: \"step_started\";\n runId: string;\n stepId: string;\n parentId?: string;\n name: string;\n type: StepType;\n startTime: number;\n metadata?: StepMetadata;\n}\n\n/**\n * Emitted when a step finishes (success or failure).\n * Failures use `status: \"error\"` and optional {@link ErrorInfo}; there is no separate `step_failed` event in MVP.\n */\nexport interface StepCompletedEvent extends TraceEventBase {\n event: \"step_completed\";\n runId: string;\n stepId: string;\n status: \"success\" | \"error\";\n endTime: number;\n durationMs: number;\n error?: ErrorInfo;\n}\n\n/** Discriminated union of all MVP trace events written as JSONL lines. */\nexport type TraceEvent =\n | RunStartedEvent\n | RunCompletedEvent\n | StepStartedEvent\n | StepCompletedEvent;\n\n/** Options for `inspectRun()` (implemented in a later step). */\nexport interface InspectRunOptions {\n traceDir?: string;\n silent?: boolean;\n metadata?: Record<string, unknown>;\n}\n\n/** Options passed when opening a logical step (implemented in a later step). */\nexport interface StepOptions {\n type?: StepType;\n metadata?: StepMetadata;\n}\n\n/** Options for `observe()` — same surface as {@link InspectRunOptions} in MVP. */\nexport type ObserveOptions = InspectRunOptions;\n\n/**\n * Resolved settings for the active run while tracing is enabled.\n * Populated by runtime code in a later step; defined here for `context.ts`.\n */\nexport interface ExecutionContext {\n runId: string;\n runName: string;\n traceDir: string;\n silent: boolean;\n metadata?: Record<string, unknown>;\n}\n\n/** Stack position of the step currently executing (used by future context tracking). */\nexport interface ActiveStepContext {\n stepId: string;\n parentId?: string;\n depth: number;\n}\n\nconst STEP_TYPES: readonly StepType[] = [\n \"run\",\n \"llm\",\n \"tool\",\n \"decision\",\n \"logic\",\n \"state\",\n \"custom\",\n] as const;\n\nconst STEP_STATUSES: readonly StepStatus[] = [\n \"running\",\n \"success\",\n \"error\",\n] as const;\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\n/** Returns true if `value` is one of the MVP {@link StepType} literals. */\nexport function isStepType(value: unknown): value is StepType {\n return (\n typeof value === \"string\" &&\n (STEP_TYPES as readonly string[]).includes(value)\n );\n}\n\n/** Returns true if `value` is one of the MVP {@link StepStatus} literals. */\nexport function isStepStatus(value: unknown): value is StepStatus {\n return (\n typeof value === \"string\" &&\n (STEP_STATUSES as readonly string[]).includes(value)\n );\n}\n\n/**\n * Narrowing guard for a {@link TraceEvent} object with required MVP fields.\n * Does not deeply validate optional `metadata` shapes.\n */\nexport function isTraceEvent(value: unknown): value is TraceEvent {\n if (!isRecord(value)) return false;\n if (value.schemaVersion !== \"0.1\") return false;\n if (typeof value.timestamp !== \"number\") return false;\n if (typeof value.event !== \"string\") return false;\n\n switch (value.event) {\n case \"run_started\": {\n return (\n typeof value.runId === \"string\" &&\n typeof value.name === \"string\" &&\n typeof value.startTime === \"number\"\n );\n }\n case \"run_completed\": {\n return (\n typeof value.runId === \"string\" &&\n (value.status === \"success\" || value.status === \"error\") &&\n typeof value.endTime === \"number\" &&\n typeof value.durationMs === \"number\"\n );\n }\n case \"step_started\": {\n return (\n typeof value.runId === \"string\" &&\n typeof value.stepId === \"string\" &&\n typeof value.name === \"string\" &&\n isStepType(value.type) &&\n typeof value.startTime === \"number\"\n );\n }\n case \"step_completed\": {\n return (\n typeof value.runId === \"string\" &&\n typeof value.stepId === \"string\" &&\n (value.status === \"success\" || value.status === \"error\") &&\n typeof value.endTime === \"number\" &&\n typeof value.durationMs === \"number\"\n );\n }\n default:\n return false;\n }\n}\n","import { mkdir } from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\n\nimport { nanoid } from \"nanoid\";\n\nimport type { ErrorInfo } from \"./types.js\";\n\n/** Default folder under the user home for AgentInspect data. */\nexport const DEFAULT_TRACE_DIR_NAME = \".agent-inspect\";\n\n/** Subfolder where JSONL run traces are stored. */\nexport const RUNS_DIR_NAME = \"runs\";\n\n/** Writable trace root when the default home path cannot be used. */\nexport const FALLBACK_TRACE_DIR = path.join(\n os.tmpdir(),\n \"agent-inspect\",\n RUNS_DIR_NAME,\n);\n\n/** Maximum display length for run/step names before truncation. */\nexport const MAX_NAME_LENGTH = 100;\n\n/** Returns `run_` + a 10-character nanoid segment. */\nexport function createRunId(): string {\n return `run_${nanoid(10)}`;\n}\n\n/** Returns `step_` + a 10-character nanoid segment. */\nexport function createStepId(): string {\n return `step_${nanoid(10)}`;\n}\n\n/**\n * Formats a duration for CLI display.\n * Under 1000 ms uses whole milliseconds; from 1000 ms uses seconds with one decimal.\n */\nexport function formatDuration(ms: number): string {\n if (!Number.isFinite(ms) || ms < 0) {\n return \"0ms\";\n }\n if (ms < 1000) {\n return `${Math.floor(ms)}ms`;\n }\n const seconds = ms / 1000;\n return `${(Math.round(seconds * 10) / 10).toFixed(1)}s`;\n}\n\n/**\n * Formats a Unix timestamp (ms) as local `YYYY-MM-DD HH:mm:ss`.\n * Invalid values yield `\"Invalid date\"` (no throw).\n */\nexport function formatTimestamp(timestamp: number): string {\n if (!Number.isFinite(timestamp)) {\n return \"Invalid date\";\n }\n const d = new Date(timestamp);\n if (Number.isNaN(d.getTime())) {\n return \"Invalid date\";\n }\n const y = d.getFullYear();\n const mo = String(d.getMonth() + 1).padStart(2, \"0\");\n const day = String(d.getDate()).padStart(2, \"0\");\n const h = String(d.getHours()).padStart(2, \"0\");\n const min = String(d.getMinutes()).padStart(2, \"0\");\n const s = String(d.getSeconds()).padStart(2, \"0\");\n return `${y}-${mo}-${day} ${h}:${min}:${s}`;\n}\n\n/**\n * Default directory for trace files: `~/DEFAULT_TRACE_DIR_NAME/RUNS_DIR_NAME`.\n * Falls back to {@link FALLBACK_TRACE_DIR} when home cannot be resolved.\n */\nexport function getDefaultTraceDir(): string {\n try {\n const home = os.homedir();\n if (typeof home !== \"string\" || home.trim() === \"\") {\n return FALLBACK_TRACE_DIR;\n }\n return path.join(home, DEFAULT_TRACE_DIR_NAME, RUNS_DIR_NAME);\n } catch {\n return FALLBACK_TRACE_DIR;\n }\n}\n\n/**\n * Full path to the JSONL trace file for a run.\n * `runId` is passed through `path.basename` to avoid traversal; empty ids become `run_unknown`.\n */\nexport function getTraceFilePath(runId: string, traceDir?: string): string {\n const baseDir = traceDir ?? getDefaultTraceDir();\n let safeId =\n typeof runId === \"string\" && runId.trim() !== \"\" ? runId.trim() : \"run_unknown\";\n safeId = path.basename(safeId);\n if (safeId === \"\" || safeId === \".\" || safeId === \"..\") {\n safeId = \"run_unknown\";\n }\n return path.join(baseDir, `${safeId}.jsonl`);\n}\n\n/**\n * Ensures a trace directory exists (recursive). Tries {@link FALLBACK_TRACE_DIR} on failure.\n * Returns the directory path that callers should prefer: primary, fallback, or original if both mkdir attempts fail.\n * Emits concise `[AgentInspect]` warnings on failure; never throws.\n */\nexport async function ensureTraceDir(traceDir: string): Promise<string> {\n const primary = path.resolve(traceDir);\n try {\n await mkdir(primary, { recursive: true });\n return primary;\n } catch {\n warn(`Failed to create trace directory: ${primary}`);\n const fallback = path.resolve(FALLBACK_TRACE_DIR);\n try {\n await mkdir(fallback, { recursive: true });\n return fallback;\n } catch {\n warn(`Failed to create fallback trace directory: ${fallback}`);\n return primary;\n }\n }\n}\n\n/**\n * Normalizes any thrown/caught value into {@link ErrorInfo}.\n * Never throws (circular structures and non-JSON values fall back to a generic message).\n */\nexport function formatError(error: unknown): ErrorInfo {\n if (error instanceof Error) {\n const out: ErrorInfo = { message: error.message };\n if (typeof error.stack === \"string\" && error.stack.length > 0) {\n out.stack = error.stack;\n }\n return out;\n }\n if (typeof error === \"string\") {\n return { message: error };\n }\n if (error === null) {\n return { message: \"Unknown error: null\" };\n }\n if (error === undefined) {\n return { message: \"Unknown error: undefined\" };\n }\n if (\n typeof error === \"number\" ||\n typeof error === \"boolean\" ||\n typeof error === \"bigint\"\n ) {\n return { message: String(error) };\n }\n if (typeof error === \"object\") {\n try {\n return { message: JSON.stringify(error) };\n } catch {\n return { message: \"Unknown error\" };\n }\n }\n return { message: \"Unknown error\" };\n}\n\n/**\n * Truncates a display name to `maxLength`, appending `\"...\"` when shortened.\n * Empty or non-string input becomes `\"unnamed\"`.\n */\nexport function truncateName(name: string, maxLength = MAX_NAME_LENGTH): string {\n if (typeof name !== \"string\" || name.trim() === \"\") {\n return \"unnamed\";\n }\n const trimmed = name.trim();\n if (trimmed.length <= maxLength) {\n return trimmed;\n }\n const ellipsis = \"...\";\n const head = Math.max(0, maxLength - ellipsis.length);\n return `${trimmed.slice(0, head)}${ellipsis}`;\n}\n\n/**\n * Instrumentation-only warning to stderr. Not a general-purpose logger.\n * Optional `error` is summarized via {@link formatError} (message only).\n */\nexport function warn(message: string, error?: unknown): void {\n const base = `[AgentInspect] ${message}`;\n if (error === undefined) {\n console.warn(base);\n return;\n }\n console.warn(`${base}: ${formatError(error).message}`);\n}\n","import { AsyncLocalStorage } from \"node:async_hooks\";\n\nimport type { ExecutionContext } from \"./types.js\";\n\ntype RuntimeExecutionContext = ExecutionContext & {\n currentStepId?: string;\n currentDepth: number;\n};\n\nconst storage = new AsyncLocalStorage<RuntimeExecutionContext>();\n\nfunction toPublicContext(ctx: RuntimeExecutionContext): ExecutionContext {\n return {\n runId: ctx.runId,\n runName: ctx.runName,\n traceDir: ctx.traceDir,\n silent: ctx.silent,\n metadata: ctx.metadata,\n };\n}\n\nfunction invoke<T>(fn: () => T | Promise<T>): Promise<T> {\n return new Promise((resolve, reject) => {\n try {\n Promise.resolve(fn()).then(resolve, reject);\n } catch (e) {\n reject(e);\n }\n });\n}\n\n/** Returns the active run context, without internal step fields. */\nexport function getCurrentContext(): ExecutionContext | undefined {\n try {\n const s = storage.getStore();\n if (!s) return undefined;\n return toPublicContext(s);\n } catch {\n return undefined;\n }\n}\n\n/** Active `runId` when inside `runWithContext`, else `undefined`. */\nexport function getCurrentRunId(): string | undefined {\n try {\n return storage.getStore()?.runId;\n } catch {\n return undefined;\n }\n}\n\n/** Active `runName` when inside `runWithContext`, else `undefined`. */\nexport function getCurrentRunName(): string | undefined {\n try {\n return storage.getStore()?.runName;\n } catch {\n return undefined;\n }\n}\n\n/**\n * Active step id in this async scope (parent for nested `step()` calls).\n * `undefined` at run root or outside any run.\n */\nexport function getCurrentStepId(): string | undefined {\n try {\n return storage.getStore()?.currentStepId;\n } catch {\n return undefined;\n }\n}\n\n/** Alias of {@link getCurrentStepId} for readability in step instrumentation. */\nexport function getParentStepId(): string | undefined {\n return getCurrentStepId();\n}\n\n/**\n * Nesting depth: `0` at run root, increments by one per nested `runWithStepContext`.\n * Returns `0` outside any run.\n */\nexport function getCurrentDepth(): number {\n try {\n const d = storage.getStore()?.currentDepth;\n return typeof d === \"number\" && Number.isFinite(d) ? d : 0;\n } catch {\n return 0;\n }\n}\n\nexport function hasActiveContext(): boolean {\n try {\n return storage.getStore() !== undefined;\n } catch {\n return false;\n }\n}\n\nexport function getTraceDirFromContext(): string | undefined {\n try {\n return storage.getStore()?.traceDir;\n } catch {\n return undefined;\n }\n}\n\nexport function isSilentContext(): boolean {\n try {\n const s = storage.getStore();\n return s ? s.silent : false;\n } catch {\n return false;\n }\n}\n\n/**\n * Runs `fn` with a fresh AgentInspect run context (depth 0, no active step).\n * Propagates sync/async results and rejections; does not swallow user errors.\n */\nexport function runWithContext<T>(\n context: ExecutionContext,\n fn: () => Promise<T> | T,\n): Promise<T> {\n const runtime: RuntimeExecutionContext = {\n runId: context.runId,\n runName: context.runName,\n traceDir: context.traceDir,\n silent: context.silent,\n metadata: context.metadata,\n currentDepth: 0,\n };\n\n return new Promise((resolve, reject) => {\n storage.run(runtime, () => {\n try {\n Promise.resolve(fn()).then(resolve, reject);\n } catch (e) {\n reject(e);\n }\n });\n });\n}\n\n/**\n * Runs `fn` with `stepId` as the active step (incremented depth).\n * If no run is active, runs `fn` without altering async context.\n */\nexport function runWithStepContext<T>(\n stepId: string,\n fn: () => Promise<T> | T,\n): Promise<T> {\n let parent: RuntimeExecutionContext | undefined;\n try {\n parent = storage.getStore();\n } catch {\n parent = undefined;\n }\n\n if (!parent) {\n return invoke(fn);\n }\n\n const derived: RuntimeExecutionContext = {\n runId: parent.runId,\n runName: parent.runName,\n traceDir: parent.traceDir,\n silent: parent.silent,\n metadata: parent.metadata,\n currentStepId: stepId,\n currentDepth: parent.currentDepth + 1,\n };\n\n return new Promise((resolve, reject) => {\n storage.run(derived, () => {\n try {\n Promise.resolve(fn()).then(resolve, reject);\n } catch (e) {\n reject(e);\n }\n });\n });\n}\n","import { appendFile, readdir, readFile, stat, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nimport type { TraceEvent } from \"./types.js\";\nimport { isStepType } from \"./types.js\";\nimport {\n ensureTraceDir,\n FALLBACK_TRACE_DIR,\n getTraceFilePath,\n warn,\n} from \"./utils.js\";\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction nonEmptyString(value: unknown): value is string {\n return typeof value === \"string\" && value.trim() !== \"\";\n}\n\nfunction finiteNumber(value: unknown): value is number {\n return typeof value === \"number\" && Number.isFinite(value);\n}\n\nfunction optionalErrorInfo(value: unknown): boolean {\n if (value === undefined) return true;\n if (!isRecord(value)) return false;\n if (typeof value.message !== \"string\") return false;\n if (\"stack\" in value && value.stack !== undefined) {\n if (typeof value.stack !== \"string\") return false;\n }\n return true;\n}\n\n/**\n * Strict MVP validation before writing JSONL. Rejects empty ids, non-finite times, and malformed payloads.\n */\nexport function validateEvent(event: unknown): event is TraceEvent {\n if (!isRecord(event)) return false;\n if (event.schemaVersion !== \"0.1\") return false;\n if (!finiteNumber(event.timestamp)) return false;\n if (typeof event.event !== \"string\") return false;\n\n switch (event.event) {\n case \"run_started\": {\n if (\n !nonEmptyString(event.runId) ||\n !nonEmptyString(event.name) ||\n !finiteNumber(event.startTime)\n ) {\n return false;\n }\n if (event.metadata !== undefined && !isRecord(event.metadata)) {\n return false;\n }\n return true;\n }\n case \"run_completed\": {\n return (\n nonEmptyString(event.runId) &&\n (event.status === \"success\" || event.status === \"error\") &&\n finiteNumber(event.endTime) &&\n finiteNumber(event.durationMs) &&\n optionalErrorInfo(event.error)\n );\n }\n case \"step_started\": {\n if (\n !nonEmptyString(event.runId) ||\n !nonEmptyString(event.stepId) ||\n !nonEmptyString(event.name) ||\n !isStepType(event.type) ||\n !finiteNumber(event.startTime)\n ) {\n return false;\n }\n if (event.parentId !== undefined && typeof event.parentId !== \"string\") {\n return false;\n }\n if (event.metadata !== undefined && !isRecord(event.metadata)) {\n return false;\n }\n return true;\n }\n case \"step_completed\": {\n return (\n nonEmptyString(event.runId) &&\n nonEmptyString(event.stepId) &&\n (event.status === \"success\" || event.status === \"error\") &&\n finiteNumber(event.endTime) &&\n finiteNumber(event.durationMs) &&\n optionalErrorInfo(event.error)\n );\n }\n default:\n return false;\n }\n}\n\n/** Serializes a trace line as compact JSON without a trailing newline. */\nexport function serializeEvent(event: TraceEvent): string {\n try {\n return JSON.stringify(event);\n } catch {\n return \"\";\n }\n}\n\n/**\n * Creates (or truncates) an empty JSONL file for a run. Uses {@link ensureTraceDir} then {@link getTraceFilePath}.\n * On failure, retries once under {@link FALLBACK_TRACE_DIR}.\n */\nexport async function initializeTraceFile(\n runId: string,\n traceDir: string,\n): Promise<string | undefined> {\n try {\n const usable = await ensureTraceDir(traceDir);\n const filePath = getTraceFilePath(runId, usable);\n await writeFile(filePath, \"\", \"utf-8\");\n return filePath;\n } catch (e) {\n warn(\"Failed to initialize trace file\", e);\n }\n\n try {\n const usable = await ensureTraceDir(FALLBACK_TRACE_DIR);\n const filePath = getTraceFilePath(runId, usable);\n await writeFile(filePath, \"\", \"utf-8\");\n return filePath;\n } catch (e) {\n warn(\"Failed to initialize trace file on fallback directory\", e);\n return undefined;\n }\n}\n\n/**\n * Appends one validated JSONL line for `event.runId`. Falls back to {@link FALLBACK_TRACE_DIR} on append failure.\n */\nexport async function writeTraceEvent(\n event: TraceEvent,\n traceDir: string,\n): Promise<void> {\n if (!validateEvent(event)) {\n warn(\"Skipped invalid trace event (validation failed)\");\n return;\n }\n\n const line = serializeEvent(event);\n if (line === \"\") {\n warn(\"Skipped trace event (serialization failed)\");\n return;\n }\n\n const payload = `${line}\\n`;\n\n const tryAppend = async (dir: string): Promise<boolean> => {\n try {\n const usable = await ensureTraceDir(dir);\n const filePath = getTraceFilePath(event.runId, usable);\n await appendFile(filePath, payload, \"utf-8\");\n return true;\n } catch {\n return false;\n }\n };\n\n if (await tryAppend(traceDir)) {\n return;\n }\n\n warn(`Failed to append trace event for run ${event.runId}`);\n\n if (await tryAppend(FALLBACK_TRACE_DIR)) {\n return;\n }\n\n warn(\"Failed to append trace event to fallback directory\");\n}\n\n/**\n * Reads raw JSONL file contents for a run, or `undefined` if missing or unreadable.\n */\nexport async function readTraceFile(\n runId: string,\n traceDir: string,\n): Promise<string | undefined> {\n try {\n const filePath = getTraceFilePath(runId, traceDir);\n return await readFile(filePath, \"utf-8\");\n } catch (e) {\n if (e && typeof e === \"object\" && \"code\" in e && e.code === \"ENOENT\") {\n return undefined;\n }\n warn(\"Unexpected error reading trace file\", e);\n return undefined;\n }\n}\n\n/** Parses JSONL into validated {@link TraceEvent} rows; invalid lines are skipped with a warning. */\nexport async function readTraceEvents(\n runId: string,\n traceDir: string,\n): Promise<TraceEvent[]> {\n const out: TraceEvent[] = [];\n try {\n const raw = await readTraceFile(runId, traceDir);\n if (raw === undefined) {\n return out;\n }\n const lines = raw.split(\"\\n\");\n for (const line of lines) {\n const trimmed = line.trim();\n if (trimmed === \"\") continue;\n let parsed: unknown;\n try {\n parsed = JSON.parse(trimmed) as unknown;\n } catch {\n warn(\"Skipped invalid JSON line in trace file\");\n continue;\n }\n if (validateEvent(parsed)) {\n out.push(parsed);\n } else {\n warn(\"Skipped invalid trace event line in trace file\");\n }\n }\n } catch (e) {\n warn(\"Failed to read trace events\", e);\n }\n return out;\n}\n\n/**\n * Lists `.jsonl` file names in `traceDir`, newest by mtime first (name sort as tie-breaker).\n */\nexport async function listTraceFiles(traceDir: string): Promise<string[]> {\n try {\n const usable = path.resolve(traceDir);\n const names = await readdir(usable);\n const jsonl = names.filter((n) => n.endsWith(\".jsonl\"));\n const withStat = await Promise.all(\n jsonl.map(async (name) => {\n try {\n const st = await stat(path.join(usable, name));\n return { name, mtime: st.mtimeMs };\n } catch {\n return { name, mtime: 0 };\n }\n }),\n );\n withStat.sort((a, b) => {\n if (b.mtime !== a.mtime) return b.mtime - a.mtime;\n return a.name.localeCompare(b.name);\n });\n return withStat.map((x) => x.name);\n } catch {\n return [];\n }\n}\n\n/** Maps a `.jsonl` file name to its run id (basename only; no traversal). */\nexport function getRunIdFromTraceFileName(fileName: string): string | undefined {\n try {\n const base = path.basename(fileName);\n if (!base.endsWith(\".jsonl\")) return undefined;\n const id = base.slice(0, -\".jsonl\".length);\n return id === \"\" ? undefined : id;\n } catch {\n return undefined;\n }\n}\n","import chalk from \"chalk\";\n\nimport { isSilentContext } from \"./context.js\";\nimport type { ErrorInfo, RunStatus, StepStatus } from \"./types.js\";\nimport { formatDuration, truncateName } from \"./utils.js\";\n\n/** Two spaces per nesting level in terminal output. */\nexport const TERMINAL_INDENT = \" \";\n\n/** Max display length for names in terminal output. */\nexport const MAX_TERMINAL_NAME_LENGTH = 80;\n\n/** Max nesting depth used for indentation (prevents huge indents). */\nexport const MAX_TERMINAL_DEPTH = 10;\n\nfunction normalizeDepth(depth: number): number {\n if (!Number.isFinite(depth) || depth < 0) {\n return 0;\n }\n return Math.min(Math.floor(depth), MAX_TERMINAL_DEPTH);\n}\n\nfunction safePrint(line = \"\"): void {\n try {\n console.log(line);\n } catch {\n /* never break callers */\n }\n}\n\n/** Indentation string for a nesting depth (capped, never negative). */\nexport function getIndent(depth: number): string {\n return TERMINAL_INDENT.repeat(normalizeDepth(depth));\n}\n\n/** Truncates a display name for terminal use; invalid input becomes `\"unnamed\"`. */\nexport function formatTerminalName(name: string): string {\n if (typeof name !== \"string\" || name.trim() === \"\") {\n return \"unnamed\";\n }\n return truncateName(name, MAX_TERMINAL_NAME_LENGTH);\n}\n\nfunction getStatusIcon(status: StepStatus | RunStatus): string {\n if (status === \"success\") return chalk.green(\"✔\");\n if (status === \"error\") return chalk.red(\"✖\");\n return chalk.yellow(\"⏳\");\n}\n\n/** Renders a single step line (colored); does not consult silent mode. */\nexport function renderStepLine(\n name: string,\n durationMs: number | undefined,\n status: StepStatus,\n depth?: number,\n): string {\n try {\n const nm = formatTerminalName(name);\n const ind = getIndent(depth ?? 0);\n if (status === \"running\" && durationMs === undefined) {\n return `${ind}${chalk.yellow(\"⏳\")} ${nm}`;\n }\n const hasDur =\n durationMs !== undefined && Number.isFinite(durationMs as number);\n const dur = hasDur ? formatDuration(durationMs as number) : undefined;\n if (status === \"running\") {\n return dur !== undefined\n ? `${ind}${chalk.yellow(\"⏳\")} ${nm} (${dur})`\n : `${ind}${chalk.yellow(\"⏳\")} ${nm}`;\n }\n if (!hasDur || dur === undefined) {\n return `${ind}${chalk.yellow(\"⏳\")} ${nm}`;\n }\n if (status === \"success\") {\n return `${ind}${getStatusIcon(\"success\")} ${nm} (${dur})`;\n }\n return `${ind}${getStatusIcon(\"error\")} ${nm} (${dur})`;\n } catch {\n return \"\";\n }\n}\n\n/** Renders an error summary line (no stack in MVP). */\nexport function renderErrorLine(error: ErrorInfo, depth?: number): string {\n try {\n const msg =\n typeof error.message === \"string\" ? error.message : \"\";\n const ind = getIndent((depth ?? 0) + 1);\n return `${ind}Error: ${msg}`;\n } catch {\n return \"\";\n }\n}\n\n/** Plain-text run summary lines (no chalk) for stable testing and CLI reuse. */\nexport function renderRunSummary(\n durationMs: number,\n status: RunStatus,\n traceFilePath?: string,\n): string[] {\n try {\n const dur = Number.isFinite(durationMs)\n ? formatDuration(durationMs)\n : formatDuration(0);\n const head =\n status === \"error\" ? `Failed in ${dur}` : `Completed in ${dur}`;\n const lines = [head];\n if (traceFilePath !== undefined && traceFilePath.trim() !== \"\") {\n lines.push(`Trace: ${traceFilePath}`);\n }\n return lines;\n } catch {\n return [];\n }\n}\n\n/** Prints run header with icon and dim run id. */\nexport function printRunStart(runId: string, name: string): void {\n if (isSilentContext()) return;\n try {\n safePrint(\"\");\n const header = `${chalk.cyan.bold(\"🔍 AgentInspect:\")} ${formatTerminalName(name)} ${chalk.dim(`(${runId})`)}`;\n safePrint(header);\n } catch {\n /* noop */\n }\n}\n\n/** Prints a running step line. */\nexport function printStepStart(name: string, depth = 0): void {\n if (isSilentContext()) return;\n try {\n safePrint(renderStepLine(name, undefined, \"running\", depth));\n } catch {\n /* noop */\n }\n}\n\n/** Prints a completed step line with duration and status icon. */\nexport function printStepComplete(\n name: string,\n durationMs: number,\n status: StepStatus,\n depth = 0,\n): void {\n if (isSilentContext()) return;\n try {\n safePrint(renderStepLine(name, durationMs, status, depth));\n } catch {\n /* noop */\n }\n}\n\n/** Prints a structured error line (message only, no stack). */\nexport function printError(error: ErrorInfo, depth = 0): void {\n if (isSilentContext()) return;\n try {\n safePrint(renderErrorLine(error, depth));\n } catch {\n /* noop */\n }\n}\n\n/** Prints run completion summary and optional trace path. */\nexport function printRunComplete(\n _name: string,\n _runId: string,\n durationMs: number,\n status: RunStatus,\n traceFilePath?: string,\n): void {\n if (isSilentContext()) return;\n try {\n const lines = renderRunSummary(durationMs, status, traceFilePath);\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i]!;\n if (i === 0) {\n const color =\n status === \"error\"\n ? chalk.red\n : status === \"running\"\n ? chalk.yellow\n : chalk.green;\n safePrint(color(line));\n } else {\n safePrint(chalk.dim(line));\n }\n }\n } catch {\n /* noop */\n }\n}\n\n/** Prints which step failed. */\nexport function printFailedAt(stepName: string): void {\n if (isSilentContext()) return;\n try {\n safePrint(`Failed at: ${formatTerminalName(stepName)}`);\n } catch {\n /* noop */\n }\n}\n","import { getCurrentContext, getCurrentDepth, getParentStepId, runWithStepContext } from \"./context.js\";\nimport type { StepOptions, StepType, TraceEvent } from \"./types.js\";\nimport { writeTraceEvent } from \"./storage.js\";\nimport { printFailedAt, printError, printStepComplete, printStepStart } from \"./terminal.js\";\nimport { createStepId, formatError, truncateName, warn } from \"./utils.js\";\n\nfunction normalizeStepName(name: unknown): string {\n if (typeof name !== \"string\" || name.trim() === \"\") {\n return \"unnamed-step\";\n }\n return truncateName(name.trim(), 100);\n}\n\nasync function safeInstrumentation(\n label: string,\n op: () => void | Promise<void>,\n): Promise<void> {\n try {\n await Promise.resolve(op());\n } catch (e) {\n warn(`step: ${label}`, e);\n }\n}\n\nasync function stepImpl<T>(\n name: string,\n fn: () => Promise<T> | T,\n options?: StepOptions,\n): Promise<T> {\n if (typeof fn !== \"function\") {\n throw new TypeError(\"step requires `fn` to be a function\");\n }\n\n const stepName = normalizeStepName(name);\n const context = getCurrentContext();\n\n if (!context) {\n warn(\"step() called outside inspectRun(); executing without instrumentation\");\n return Promise.resolve(fn());\n }\n\n const stepId = createStepId();\n const renderDepth = getCurrentDepth();\n const parentId = getParentStepId();\n const stepType: StepType = options?.type ?? \"logic\";\n const metadata = options?.metadata;\n const startTime = Date.now();\n\n await safeInstrumentation(\"writeTraceEvent(step_started)\", async () => {\n const started: TraceEvent = {\n schemaVersion: \"0.1\",\n event: \"step_started\",\n timestamp: startTime,\n runId: context.runId,\n stepId,\n ...(typeof parentId === \"string\" && parentId.trim() !== \"\"\n ? { parentId }\n : {}),\n name: stepName,\n type: stepType,\n startTime,\n ...(metadata !== undefined ? { metadata } : {}),\n };\n await writeTraceEvent(started, context.traceDir);\n });\n\n await safeInstrumentation(\"printStepStart\", () => {\n printStepStart(stepName, renderDepth);\n });\n\n let result: T;\n try {\n result = await runWithStepContext(stepId, async () => {\n return await Promise.resolve(fn());\n });\n } catch (userError) {\n const endTime = Date.now();\n const durationMs = endTime - startTime;\n const formatted = formatError(userError);\n\n await safeInstrumentation(\"writeTraceEvent(step_completed error)\", async () => {\n const completed: TraceEvent = {\n schemaVersion: \"0.1\",\n event: \"step_completed\",\n timestamp: endTime,\n runId: context.runId,\n stepId,\n status: \"error\",\n endTime,\n durationMs,\n error: formatted,\n };\n await writeTraceEvent(completed, context.traceDir);\n });\n\n await safeInstrumentation(\"printStepComplete(error)\", () => {\n printStepComplete(stepName, durationMs, \"error\", renderDepth);\n });\n await safeInstrumentation(\"printError\", () => {\n printError(formatted, renderDepth);\n });\n await safeInstrumentation(\"printFailedAt\", () => {\n printFailedAt(stepName);\n });\n\n throw userError;\n }\n\n const endTime = Date.now();\n const durationMs = endTime - startTime;\n\n await safeInstrumentation(\"writeTraceEvent(step_completed success)\", async () => {\n const completed: TraceEvent = {\n schemaVersion: \"0.1\",\n event: \"step_completed\",\n timestamp: endTime,\n runId: context.runId,\n stepId,\n status: \"success\",\n endTime,\n durationMs,\n };\n await writeTraceEvent(completed, context.traceDir);\n });\n\n await safeInstrumentation(\"printStepComplete(success)\", () => {\n printStepComplete(stepName, durationMs, \"success\", renderDepth);\n });\n\n return result;\n}\n\n/** Callable step tracer plus {@link step.llm} and {@link step.tool} shortcuts. */\nexport type StepFunction = {\n <T>(name: string, fn: () => Promise<T> | T, options?: StepOptions): Promise<T>;\n llm: <T>(model: string, fn: () => Promise<T> | T) => Promise<T>;\n tool: <T>(toolName: string, fn: () => Promise<T> | T) => Promise<T>;\n};\n\nasync function stepLlm<T>(model: string, fn: () => Promise<T> | T): Promise<T> {\n const modelName =\n typeof model === \"string\" && model.trim() !== \"\"\n ? model.trim()\n : \"unknown-model\";\n return stepImpl<T>(`llm:${modelName}`, fn, {\n type: \"llm\",\n metadata: { model: modelName },\n });\n}\n\nasync function stepTool<T>(\n toolName: string,\n fn: () => Promise<T> | T,\n): Promise<T> {\n const normalized =\n typeof toolName === \"string\" && toolName.trim() !== \"\"\n ? toolName.trim()\n : \"unknown-tool\";\n return stepImpl<T>(`tool:${normalized}`, fn, {\n type: \"tool\",\n metadata: { toolName: normalized },\n });\n}\n\n/**\n * Traces a named unit of work inside `inspectRun` (`step_started` / `step_completed`, optional terminal).\n * Outside a run, executes `fn` with a warn only. Preserves return values and rethrows user errors unchanged.\n *\n * - `step.llm(model, fn)` — `type: \"llm\"`, `metadata.model` (no SDK calls or token counting).\n * - `step.tool(toolName, fn)` — `type: \"tool\"`, `metadata.toolName` (no framework interception).\n */\nexport const step = Object.assign(stepImpl, {\n llm: stepLlm,\n tool: stepTool,\n}) as StepFunction;\n","import {\n formatDuration,\n formatTimestamp,\n getDefaultTraceDir,\n listTraceFiles,\n readTraceEvents,\n getRunIdFromTraceFileName,\n truncateName,\n} from \"@agent-inspect/core\";\nimport type {\n RunCompletedEvent,\n RunStartedEvent,\n TraceEvent,\n} from \"@agent-inspect/core\";\n\nexport interface ListOptions {\n dir?: string;\n limit?: string;\n status?: \"running\" | \"success\" | \"error\";\n}\n\ntype RunSummary = {\n runId: string;\n name: string;\n status: \"running\" | \"success\" | \"error\";\n durationMs?: number;\n startTime: number;\n};\n\nfunction parseLimit(raw?: string): number {\n const fallback = 20;\n if (raw === undefined || raw.trim() === \"\") return fallback;\n const n = Number.parseInt(raw, 10);\n if (!Number.isFinite(n) || n <= 0) return fallback;\n return Math.min(n, 100);\n}\n\nfunction isStatusFilter(\n value: unknown,\n): value is \"running\" | \"success\" | \"error\" {\n return value === \"running\" || value === \"success\" || value === \"error\";\n}\n\nfunction buildRunSummary(\n runId: string,\n events: TraceEvent[],\n): RunSummary | undefined {\n const started = events.find(\n (e): e is RunStartedEvent => e.event === \"run_started\",\n );\n if (!started) return undefined;\n\n const completed = events.filter(\n (e): e is RunCompletedEvent => e.event === \"run_completed\",\n );\n const last = completed[completed.length - 1];\n\n const status: RunSummary[\"status\"] = last ? last.status : \"running\";\n const startTime = Number.isFinite(started.startTime)\n ? started.startTime\n : Number.isFinite(started.timestamp)\n ? started.timestamp\n : 0;\n\n const name =\n typeof started.name === \"string\" && started.name.trim() !== \"\"\n ? started.name.trim()\n : \"unknown-run\";\n\n return {\n runId,\n name,\n status,\n durationMs: last !== undefined ? last.durationMs : undefined,\n startTime,\n };\n}\n\nfunction statusIcon(status: RunSummary[\"status\"]): string {\n if (status === \"success\") return \"✓\";\n if (status === \"error\") return \"✗\";\n return \"⏳\";\n}\n\nfunction durationCell(\n status: RunSummary[\"status\"],\n durationMs?: number,\n): string {\n if (status === \"running\") return \"-\";\n if (durationMs !== undefined && Number.isFinite(durationMs)) {\n return formatDuration(durationMs);\n }\n return \"-\";\n}\n\nfunction timestampCell(startTime: number): string {\n if (!Number.isFinite(startTime) || startTime <= 0) return \"Invalid date\";\n const s = formatTimestamp(startTime);\n return s === \"Invalid date\" ? \"Invalid date\" : s;\n}\n\n/**\n * Prints a table of recent runs under the trace directory. Swallows expected I/O issues;\n * unexpected failures set `process.exitCode` and log a short message (no `process.exit`).\n */\nexport async function list(options: ListOptions = {}): Promise<void> {\n try {\n const traceDir =\n typeof options.dir === \"string\" && options.dir.trim() !== \"\"\n ? options.dir.trim()\n : getDefaultTraceDir();\n\n const files = await listTraceFiles(traceDir);\n if (files.length === 0) {\n console.log(\"No AgentInspect runs found\");\n console.log(`Trace directory: ${traceDir}`);\n return;\n }\n\n const summaries: RunSummary[] = [];\n for (const fileName of files) {\n try {\n const runId = getRunIdFromTraceFileName(fileName);\n if (runId === undefined) continue;\n const events = await readTraceEvents(runId, traceDir);\n const row = buildRunSummary(runId, events);\n if (row !== undefined) summaries.push(row);\n } catch {\n /* skip malformed */\n }\n }\n\n if (summaries.length === 0) {\n console.log(\"No AgentInspect runs found\");\n console.log(`Trace directory: ${traceDir}`);\n return;\n }\n\n summaries.sort((a, b) => b.startTime - a.startTime);\n\n const statusFilter = isStatusFilter(options.status)\n ? options.status\n : undefined;\n const filtered =\n statusFilter === undefined\n ? summaries\n : summaries.filter((s) => s.status === statusFilter);\n\n const limit = parseLimit(options.limit);\n const shown = filtered.slice(0, limit);\n\n console.log(\"Recent AgentInspect Runs\");\n for (const s of shown) {\n const icon = statusIcon(s.status);\n const dur = durationCell(s.status, s.durationMs);\n const ts = timestampCell(s.startTime);\n const nm = truncateName(s.name, 80);\n console.log(`${icon} ${s.runId} | ${nm} | ${dur} | ${ts}`);\n }\n\n console.log(\"\");\n console.log(`Showing ${shown.length} of ${filtered.length} runs`);\n console.log(`Trace directory: ${traceDir}`);\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n console.error(`[AgentInspect] list failed: ${msg}`);\n process.exitCode = 1;\n }\n}\n","import {\n formatDuration,\n formatTimestamp,\n getDefaultTraceDir,\n getIndent,\n getTraceFilePath,\n readTraceEvents,\n renderErrorLine,\n renderStepLine,\n} from \"@agent-inspect/core\";\nimport type {\n ErrorInfo,\n RunCompletedEvent,\n RunStartedEvent,\n RunStatus,\n StepCompletedEvent,\n StepStartedEvent,\n StepMetadata,\n StepStatus,\n StepType,\n TraceEvent,\n} from \"@agent-inspect/core\";\n\nexport interface ViewOptions {\n dir?: string;\n verbose?: boolean;\n json?: boolean;\n}\n\ntype StepNode = {\n id: string;\n parentId?: string;\n name: string;\n type: StepType;\n status: StepStatus;\n durationMs?: number;\n error?: ErrorInfo;\n startedAt: number;\n metadata?: StepMetadata;\n children: StepNode[];\n};\n\nfunction buildStepTree(events: TraceEvent[]): StepNode[] {\n const nodes = new Map<string, StepNode>();\n\n for (const e of events) {\n if (e.event === \"step_started\") {\n const s = e as StepStartedEvent;\n nodes.set(s.stepId, {\n id: s.stepId,\n parentId: s.parentId,\n name: s.name,\n type: s.type,\n status: \"running\",\n startedAt: s.startTime,\n metadata: s.metadata,\n children: [],\n });\n }\n }\n\n for (const e of events) {\n if (e.event !== \"step_completed\") continue;\n const c = e as StepCompletedEvent;\n const node = nodes.get(c.stepId);\n if (!node) continue;\n node.status = c.status;\n node.durationMs = c.durationMs;\n node.error = c.error;\n }\n\n const roots: StepNode[] = [];\n for (const n of nodes.values()) {\n if (n.parentId !== undefined && nodes.has(n.parentId)) {\n nodes.get(n.parentId)!.children.push(n);\n } else {\n roots.push(n);\n }\n }\n\n const sortByStarted = (a: StepNode, b: StepNode) => a.startedAt - b.startedAt;\n roots.sort(sortByStarted);\n for (const n of nodes.values()) {\n n.children.sort(sortByStarted);\n }\n\n return roots;\n}\n\nfunction printStepTree(\n nodes: StepNode[],\n depth: number,\n verbose: boolean,\n): void {\n for (const node of nodes) {\n console.log(\n renderStepLine(node.name, node.durationMs, node.status, depth),\n );\n if (node.error !== undefined) {\n if (verbose) {\n console.log(renderErrorLine(node.error, depth + 1));\n if (\n typeof node.error.stack === \"string\" &&\n node.error.stack.trim() !== \"\"\n ) {\n console.log(node.error.stack);\n }\n } else {\n console.log(\n renderErrorLine({ message: node.error.message }, depth + 1),\n );\n }\n }\n if (verbose) {\n console.log(`${getIndent(depth + 1)}type: ${node.type}`);\n if (\n node.metadata !== undefined &&\n Object.keys(node.metadata).length > 0\n ) {\n try {\n console.log(\n `${getIndent(depth + 1)}metadata: ${JSON.stringify(node.metadata)}`,\n );\n } catch {\n /* ignore */\n }\n }\n }\n printStepTree(node.children, depth + 1, verbose);\n }\n}\n\n/**\n * Prints a single run as a tree (or JSON). Missing runs and invalid traces set `process.exitCode`\n * without throwing from normal paths.\n */\nexport async function view(\n runId: string,\n options: ViewOptions = {},\n): Promise<void> {\n try {\n const id =\n typeof runId === \"string\" && runId.trim() !== \"\" ? runId.trim() : \"\";\n if (id === \"\") {\n console.error(\"Run id is required\");\n process.exitCode = 1;\n return;\n }\n\n const traceDir =\n typeof options.dir === \"string\" && options.dir.trim() !== \"\"\n ? options.dir.trim()\n : getDefaultTraceDir();\n\n const events = await readTraceEvents(id, traceDir);\n if (events.length === 0) {\n console.log(`Run not found: ${id}`);\n console.log(`Trace directory: ${traceDir}`);\n process.exitCode = 1;\n return;\n }\n\n if (options.json) {\n console.log(JSON.stringify(events, null, 2));\n return;\n }\n\n const started = events.find(\n (e): e is RunStartedEvent => e.event === \"run_started\",\n );\n if (!started) {\n console.error(\"Invalid trace: missing run_started\");\n process.exitCode = 1;\n return;\n }\n\n const completed = events.filter(\n (e): e is RunCompletedEvent => e.event === \"run_completed\",\n );\n const last = completed[completed.length - 1];\n const status: RunStatus = last ? last.status : \"running\";\n const durationLine =\n last !== undefined && Number.isFinite(last.durationMs)\n ? formatDuration(last.durationMs)\n : \"-\";\n\n const startedTs = Number.isFinite(started.startTime)\n ? started.startTime\n : started.timestamp;\n const startedLabel = formatTimestamp(startedTs);\n\n console.log(`AgentInspect Run: ${started.name}`);\n console.log(`ID: ${id}`);\n console.log(`Status: ${status}`);\n console.log(`Duration: ${durationLine}`);\n console.log(`Started: ${startedLabel}`);\n console.log(\"\");\n\n const tree = buildStepTree(events);\n console.log(\"Execution Tree:\");\n if (tree.length === 0) {\n console.log(\"No steps recorded\");\n } else {\n printStepTree(tree, 0, options.verbose === true);\n }\n\n console.log(\"\");\n console.log(`Trace file: ${getTraceFilePath(id, traceDir)}`);\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n console.error(`[AgentInspect] view failed: ${msg}`);\n process.exitCode = 1;\n }\n}\n","#!/usr/bin/env node\nimport { realpathSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nimport { Command, Option } from \"commander\";\n\nimport type { ListOptions } from \"./list.js\";\nimport { list } from \"./list.js\";\nimport { view } from \"./view.js\";\n\nexport function runCommand(action: () => Promise<void>): void {\n void action().catch((error: unknown) => {\n const msg = error instanceof Error ? error.message : String(error);\n console.error(`[AgentInspect] ${msg}`);\n process.exitCode = 1;\n });\n}\n\nexport function createCliProgram(): Command {\n const program = new Command(\"agent-inspect\")\n .description(\"Local-first execution-tree debugger for AI agents\")\n .version(\"0.1.0\");\n\n program\n .command(\"list\")\n .description(\"List recent AgentInspect runs\")\n .option(\"--dir <path>\", \"trace directory\")\n .option(\"--limit <number>\", \"max runs to show (default 20, max 100)\")\n .addOption(\n new Option(\"--status <status>\", \"filter by run status\").choices([\n \"running\",\n \"success\",\n \"error\",\n ]),\n )\n .action(\n (opts: {\n dir?: string;\n limit?: string;\n status?: ListOptions[\"status\"];\n }) => {\n runCommand(() => list(opts));\n },\n );\n\n program\n .command(\"view\")\n .description(\"View a single run trace\")\n .argument(\"<run-id>\", \"run id (e.g. from list output)\")\n .option(\"--dir <path>\", \"trace directory\")\n .option(\"--verbose\", \"show extra detail (types, metadata, error stacks)\")\n .option(\"--json\", \"print raw trace events as JSON\")\n .action(\n (\n runId: string,\n opts: { dir?: string; verbose?: boolean; json?: boolean },\n ) => {\n runCommand(() => view(runId, opts));\n },\n );\n\n return program;\n}\n\nfunction isPrimaryModule(): boolean {\n const entry = process.argv[1];\n if (!entry) return false;\n const selfPath = fileURLToPath(import.meta.url);\n try {\n return (\n realpathSync(path.resolve(entry)) === realpathSync(path.resolve(selfPath))\n );\n } catch {\n return path.resolve(entry) === path.resolve(selfPath);\n }\n}\n\nif (isPrimaryModule()) {\n createCliProgram().parse(process.argv);\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../core/src/types.ts","../../core/src/utils.ts","../../core/src/context.ts","../../core/src/storage.ts","../../core/src/terminal.ts","../../core/src/step.ts","../src/list.ts","../src/view.ts","../src/index.ts"],"names":["path","endTime","durationMs"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * Discriminator for what kind of work a {@link Step} represents.\n * `\"decision\"` captures agent branching/choices; other values cover runs, LLM calls, tools, and user-defined steps.\n */\nexport type StepType =\n | \"run\"\n | \"llm\"\n | \"tool\"\n | \"decision\"\n | \"logic\"\n | \"state\"\n | \"custom\";\n\n/** Lifecycle state of a single {@link Step}. */\nexport type StepStatus = \"running\" | \"success\" | \"error\";\n\n/** Lifecycle state of an entire {@link Run}. */\nexport type RunStatus = \"running\" | \"success\" | \"error\";\n\n/** Structured error attached to a run or step when status is `\"error\"`. */\nexport interface ErrorInfo {\n message: string;\n stack?: string;\n}\n\n/**\n * Optional token counts for a step (e.g. LLM usage).\n * Reserved for future roadmap; MVP does not compute or persist token usage.\n */\nexport interface TokenMetadata {\n input?: number;\n output?: number;\n}\n\n/** Arbitrary structured fields for a step; safe extensions use string keys. */\nexport interface StepMetadata {\n model?: string;\n toolName?: string;\n tokens?: TokenMetadata;\n retryCount?: number;\n [key: string]: unknown;\n}\n\n/**\n * One traced agent run (root of an execution tree).\n * MVP intentionally omits `input` / `output` on the run to limit PII, secrets, and serialization risk.\n */\nexport interface Run {\n id: string;\n name: string;\n status: RunStatus;\n startTime: number;\n endTime?: number;\n durationMs?: number;\n error?: ErrorInfo;\n metadata?: Record<string, unknown>;\n}\n\n/**\n * One node in the execution tree under a {@link Run}.\n * MVP intentionally omits `input` / `output`; capture/redaction may come in a later version.\n */\nexport interface Step {\n id: string;\n runId: string;\n parentId?: string;\n name: string;\n type: StepType;\n status: StepStatus;\n startTime: number;\n endTime?: number;\n durationMs?: number;\n error?: ErrorInfo;\n metadata?: StepMetadata;\n}\n\n/** Version of the JSONL trace line schema consumed by AgentInspect tooling. */\nexport type TraceSchemaVersion = \"0.1\";\n\n/** Fields shared by every persisted trace event line. */\nexport interface TraceEventBase {\n schemaVersion: TraceSchemaVersion;\n event: string;\n timestamp: number;\n}\n\n/** Emitted when a run begins. */\nexport interface RunStartedEvent extends TraceEventBase {\n event: \"run_started\";\n runId: string;\n name: string;\n startTime: number;\n metadata?: Record<string, unknown>;\n}\n\n/** Emitted when a run finishes successfully or with an error. */\nexport interface RunCompletedEvent extends TraceEventBase {\n event: \"run_completed\";\n runId: string;\n status: \"success\" | \"error\";\n endTime: number;\n durationMs: number;\n error?: ErrorInfo;\n}\n\n/** Emitted when a step begins (including nested steps under `parentId`). */\nexport interface StepStartedEvent extends TraceEventBase {\n event: \"step_started\";\n runId: string;\n stepId: string;\n parentId?: string;\n name: string;\n type: StepType;\n startTime: number;\n metadata?: StepMetadata;\n}\n\n/**\n * Emitted when a step finishes (success or failure).\n * Failures use `status: \"error\"` and optional {@link ErrorInfo}; there is no separate `step_failed` event in MVP.\n */\nexport interface StepCompletedEvent extends TraceEventBase {\n event: \"step_completed\";\n runId: string;\n stepId: string;\n status: \"success\" | \"error\";\n endTime: number;\n durationMs: number;\n error?: ErrorInfo;\n}\n\n/** Discriminated union of all MVP trace events written as JSONL lines. */\nexport type TraceEvent =\n | RunStartedEvent\n | RunCompletedEvent\n | StepStartedEvent\n | StepCompletedEvent;\n\n/** Options for `inspectRun()` (implemented in a later step). */\nexport interface InspectRunOptions {\n traceDir?: string;\n silent?: boolean;\n metadata?: Record<string, unknown>;\n}\n\n/** Options passed when opening a logical step (implemented in a later step). */\nexport interface StepOptions {\n type?: StepType;\n metadata?: StepMetadata;\n}\n\n/** Options for `observe()` — same surface as {@link InspectRunOptions} in MVP. */\nexport type ObserveOptions = InspectRunOptions;\n\n/**\n * Resolved settings for the active run while tracing is enabled.\n * Populated by runtime code in a later step; defined here for `context.ts`.\n */\nexport interface ExecutionContext {\n runId: string;\n runName: string;\n traceDir: string;\n silent: boolean;\n metadata?: Record<string, unknown>;\n}\n\n/** Stack position of the step currently executing (used by future context tracking). */\nexport interface ActiveStepContext {\n stepId: string;\n parentId?: string;\n depth: number;\n}\n\nconst STEP_TYPES: readonly StepType[] = [\n \"run\",\n \"llm\",\n \"tool\",\n \"decision\",\n \"logic\",\n \"state\",\n \"custom\",\n] as const;\n\nconst STEP_STATUSES: readonly StepStatus[] = [\n \"running\",\n \"success\",\n \"error\",\n] as const;\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\n/** Returns true if `value` is one of the MVP {@link StepType} literals. */\nexport function isStepType(value: unknown): value is StepType {\n return (\n typeof value === \"string\" &&\n (STEP_TYPES as readonly string[]).includes(value)\n );\n}\n\n/** Returns true if `value` is one of the MVP {@link StepStatus} literals. */\nexport function isStepStatus(value: unknown): value is StepStatus {\n return (\n typeof value === \"string\" &&\n (STEP_STATUSES as readonly string[]).includes(value)\n );\n}\n\n/**\n * Narrowing guard for a {@link TraceEvent} object with required MVP fields.\n * Does not deeply validate optional `metadata` shapes.\n */\nexport function isTraceEvent(value: unknown): value is TraceEvent {\n if (!isRecord(value)) return false;\n if (value.schemaVersion !== \"0.1\") return false;\n if (typeof value.timestamp !== \"number\") return false;\n if (typeof value.event !== \"string\") return false;\n\n switch (value.event) {\n case \"run_started\": {\n return (\n typeof value.runId === \"string\" &&\n typeof value.name === \"string\" &&\n typeof value.startTime === \"number\"\n );\n }\n case \"run_completed\": {\n return (\n typeof value.runId === \"string\" &&\n (value.status === \"success\" || value.status === \"error\") &&\n typeof value.endTime === \"number\" &&\n typeof value.durationMs === \"number\"\n );\n }\n case \"step_started\": {\n return (\n typeof value.runId === \"string\" &&\n typeof value.stepId === \"string\" &&\n typeof value.name === \"string\" &&\n isStepType(value.type) &&\n typeof value.startTime === \"number\"\n );\n }\n case \"step_completed\": {\n return (\n typeof value.runId === \"string\" &&\n typeof value.stepId === \"string\" &&\n (value.status === \"success\" || value.status === \"error\") &&\n typeof value.endTime === \"number\" &&\n typeof value.durationMs === \"number\"\n );\n }\n default:\n return false;\n }\n}\n","import { mkdir } from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\n\nimport { nanoid } from \"nanoid\";\n\nimport type { ErrorInfo } from \"./types.js\";\n\n/** Default folder under the user home for AgentInspect data. */\nexport const DEFAULT_TRACE_DIR_NAME = \".agent-inspect\";\n\n/** Subfolder where JSONL run traces are stored. */\nexport const RUNS_DIR_NAME = \"runs\";\n\n/** Writable trace root when the default home path cannot be used. */\nexport const FALLBACK_TRACE_DIR = path.join(\n os.tmpdir(),\n \"agent-inspect\",\n RUNS_DIR_NAME,\n);\n\n/** Maximum display length for run/step names before truncation. */\nexport const MAX_NAME_LENGTH = 100;\n\n/** Returns `run_` + a 10-character nanoid segment. */\nexport function createRunId(): string {\n return `run_${nanoid(10)}`;\n}\n\n/** Returns `step_` + a 10-character nanoid segment. */\nexport function createStepId(): string {\n return `step_${nanoid(10)}`;\n}\n\n/**\n * Formats a duration for CLI display.\n * Under 1000 ms uses whole milliseconds; from 1000 ms uses seconds with one decimal.\n */\nexport function formatDuration(ms: number): string {\n if (!Number.isFinite(ms) || ms < 0) {\n return \"0ms\";\n }\n if (ms < 1000) {\n return `${Math.floor(ms)}ms`;\n }\n const seconds = ms / 1000;\n return `${(Math.round(seconds * 10) / 10).toFixed(1)}s`;\n}\n\n/**\n * Formats a Unix timestamp (ms) as local `YYYY-MM-DD HH:mm:ss`.\n * Invalid values yield `\"Invalid date\"` (no throw).\n */\nexport function formatTimestamp(timestamp: number): string {\n if (!Number.isFinite(timestamp)) {\n return \"Invalid date\";\n }\n const d = new Date(timestamp);\n if (Number.isNaN(d.getTime())) {\n return \"Invalid date\";\n }\n const y = d.getFullYear();\n const mo = String(d.getMonth() + 1).padStart(2, \"0\");\n const day = String(d.getDate()).padStart(2, \"0\");\n const h = String(d.getHours()).padStart(2, \"0\");\n const min = String(d.getMinutes()).padStart(2, \"0\");\n const s = String(d.getSeconds()).padStart(2, \"0\");\n return `${y}-${mo}-${day} ${h}:${min}:${s}`;\n}\n\n/**\n * Default directory for trace files: `~/DEFAULT_TRACE_DIR_NAME/RUNS_DIR_NAME`.\n * Falls back to {@link FALLBACK_TRACE_DIR} when home cannot be resolved.\n */\nexport function getDefaultTraceDir(): string {\n try {\n const home = os.homedir();\n if (typeof home !== \"string\" || home.trim() === \"\") {\n return FALLBACK_TRACE_DIR;\n }\n return path.join(home, DEFAULT_TRACE_DIR_NAME, RUNS_DIR_NAME);\n } catch {\n return FALLBACK_TRACE_DIR;\n }\n}\n\n/**\n * Full path to the JSONL trace file for a run.\n * `runId` is passed through `path.basename` to avoid traversal; empty ids become `run_unknown`.\n */\nexport function getTraceFilePath(runId: string, traceDir?: string): string {\n const baseDir = traceDir ?? getDefaultTraceDir();\n let safeId =\n typeof runId === \"string\" && runId.trim() !== \"\" ? runId.trim() : \"run_unknown\";\n safeId = path.basename(safeId);\n if (safeId === \"\" || safeId === \".\" || safeId === \"..\") {\n safeId = \"run_unknown\";\n }\n return path.join(baseDir, `${safeId}.jsonl`);\n}\n\n/**\n * Ensures a trace directory exists (recursive). Tries {@link FALLBACK_TRACE_DIR} on failure.\n * Returns the directory path that callers should prefer: primary, fallback, or original if both mkdir attempts fail.\n * Emits concise `[AgentInspect]` warnings on failure; never throws.\n */\nexport async function ensureTraceDir(traceDir: string): Promise<string> {\n const primary = path.resolve(traceDir);\n try {\n await mkdir(primary, { recursive: true });\n return primary;\n } catch {\n warn(`Failed to create trace directory: ${primary}`);\n const fallback = path.resolve(FALLBACK_TRACE_DIR);\n try {\n await mkdir(fallback, { recursive: true });\n return fallback;\n } catch {\n warn(`Failed to create fallback trace directory: ${fallback}`);\n return primary;\n }\n }\n}\n\n/**\n * Normalizes any thrown/caught value into {@link ErrorInfo}.\n * Never throws (circular structures and non-JSON values fall back to a generic message).\n */\nexport function formatError(error: unknown): ErrorInfo {\n if (error instanceof Error) {\n const out: ErrorInfo = { message: error.message };\n if (typeof error.stack === \"string\" && error.stack.length > 0) {\n out.stack = error.stack;\n }\n return out;\n }\n if (typeof error === \"string\") {\n return { message: error };\n }\n if (error === null) {\n return { message: \"Unknown error: null\" };\n }\n if (error === undefined) {\n return { message: \"Unknown error: undefined\" };\n }\n if (\n typeof error === \"number\" ||\n typeof error === \"boolean\" ||\n typeof error === \"bigint\"\n ) {\n return { message: String(error) };\n }\n if (typeof error === \"object\") {\n try {\n return { message: JSON.stringify(error) };\n } catch {\n return { message: \"Unknown error\" };\n }\n }\n return { message: \"Unknown error\" };\n}\n\n/**\n * Truncates a display name to `maxLength`, appending `\"...\"` when shortened.\n * Empty or non-string input becomes `\"unnamed\"`.\n */\nexport function truncateName(name: string, maxLength = MAX_NAME_LENGTH): string {\n if (typeof name !== \"string\" || name.trim() === \"\") {\n return \"unnamed\";\n }\n const trimmed = name.trim();\n if (trimmed.length <= maxLength) {\n return trimmed;\n }\n const ellipsis = \"...\";\n const head = Math.max(0, maxLength - ellipsis.length);\n return `${trimmed.slice(0, head)}${ellipsis}`;\n}\n\n/**\n * Instrumentation-only warning to stderr. Not a general-purpose logger.\n * Optional `error` is summarized via {@link formatError} (message only).\n */\nexport function warn(message: string, error?: unknown): void {\n const base = `[AgentInspect] ${message}`;\n if (error === undefined) {\n console.warn(base);\n return;\n }\n console.warn(`${base}: ${formatError(error).message}`);\n}\n","import { AsyncLocalStorage } from \"node:async_hooks\";\n\nimport type { ExecutionContext } from \"./types.js\";\n\ntype RuntimeExecutionContext = ExecutionContext & {\n currentStepId?: string;\n currentDepth: number;\n};\n\nconst storage = new AsyncLocalStorage<RuntimeExecutionContext>();\n\nfunction toPublicContext(ctx: RuntimeExecutionContext): ExecutionContext {\n return {\n runId: ctx.runId,\n runName: ctx.runName,\n traceDir: ctx.traceDir,\n silent: ctx.silent,\n metadata: ctx.metadata,\n };\n}\n\nfunction invoke<T>(fn: () => T | Promise<T>): Promise<T> {\n return new Promise((resolve, reject) => {\n try {\n Promise.resolve(fn()).then(resolve, reject);\n } catch (e) {\n reject(e);\n }\n });\n}\n\n/** Returns the active run context, without internal step fields. */\nexport function getCurrentContext(): ExecutionContext | undefined {\n try {\n const s = storage.getStore();\n if (!s) return undefined;\n return toPublicContext(s);\n } catch {\n return undefined;\n }\n}\n\n/** Active `runId` when inside `runWithContext`, else `undefined`. */\nexport function getCurrentRunId(): string | undefined {\n try {\n return storage.getStore()?.runId;\n } catch {\n return undefined;\n }\n}\n\n/** Active `runName` when inside `runWithContext`, else `undefined`. */\nexport function getCurrentRunName(): string | undefined {\n try {\n return storage.getStore()?.runName;\n } catch {\n return undefined;\n }\n}\n\n/**\n * Active step id in this async scope (parent for nested `step()` calls).\n * `undefined` at run root or outside any run.\n */\nexport function getCurrentStepId(): string | undefined {\n try {\n return storage.getStore()?.currentStepId;\n } catch {\n return undefined;\n }\n}\n\n/** Alias of {@link getCurrentStepId} for readability in step instrumentation. */\nexport function getParentStepId(): string | undefined {\n return getCurrentStepId();\n}\n\n/**\n * Nesting depth: `0` at run root, increments by one per nested `runWithStepContext`.\n * Returns `0` outside any run.\n */\nexport function getCurrentDepth(): number {\n try {\n const d = storage.getStore()?.currentDepth;\n return typeof d === \"number\" && Number.isFinite(d) ? d : 0;\n } catch {\n return 0;\n }\n}\n\nexport function hasActiveContext(): boolean {\n try {\n return storage.getStore() !== undefined;\n } catch {\n return false;\n }\n}\n\nexport function getTraceDirFromContext(): string | undefined {\n try {\n return storage.getStore()?.traceDir;\n } catch {\n return undefined;\n }\n}\n\nexport function isSilentContext(): boolean {\n try {\n const s = storage.getStore();\n return s ? s.silent : false;\n } catch {\n return false;\n }\n}\n\n/**\n * Runs `fn` with a fresh AgentInspect run context (depth 0, no active step).\n * Propagates sync/async results and rejections; does not swallow user errors.\n */\nexport function runWithContext<T>(\n context: ExecutionContext,\n fn: () => Promise<T> | T,\n): Promise<T> {\n const runtime: RuntimeExecutionContext = {\n runId: context.runId,\n runName: context.runName,\n traceDir: context.traceDir,\n silent: context.silent,\n metadata: context.metadata,\n currentDepth: 0,\n };\n\n return new Promise((resolve, reject) => {\n storage.run(runtime, () => {\n try {\n Promise.resolve(fn()).then(resolve, reject);\n } catch (e) {\n reject(e);\n }\n });\n });\n}\n\n/**\n * Runs `fn` with `stepId` as the active step (incremented depth).\n * If no run is active, runs `fn` without altering async context.\n */\nexport function runWithStepContext<T>(\n stepId: string,\n fn: () => Promise<T> | T,\n): Promise<T> {\n let parent: RuntimeExecutionContext | undefined;\n try {\n parent = storage.getStore();\n } catch {\n parent = undefined;\n }\n\n if (!parent) {\n return invoke(fn);\n }\n\n const derived: RuntimeExecutionContext = {\n runId: parent.runId,\n runName: parent.runName,\n traceDir: parent.traceDir,\n silent: parent.silent,\n metadata: parent.metadata,\n currentStepId: stepId,\n currentDepth: parent.currentDepth + 1,\n };\n\n return new Promise((resolve, reject) => {\n storage.run(derived, () => {\n try {\n Promise.resolve(fn()).then(resolve, reject);\n } catch (e) {\n reject(e);\n }\n });\n });\n}\n","import { appendFile, readdir, readFile, stat, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nimport type { TraceEvent } from \"./types.js\";\nimport { isStepType } from \"./types.js\";\nimport {\n ensureTraceDir,\n FALLBACK_TRACE_DIR,\n getTraceFilePath,\n warn,\n} from \"./utils.js\";\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction nonEmptyString(value: unknown): value is string {\n return typeof value === \"string\" && value.trim() !== \"\";\n}\n\nfunction finiteNumber(value: unknown): value is number {\n return typeof value === \"number\" && Number.isFinite(value);\n}\n\nfunction optionalErrorInfo(value: unknown): boolean {\n if (value === undefined) return true;\n if (!isRecord(value)) return false;\n if (typeof value.message !== \"string\") return false;\n if (\"stack\" in value && value.stack !== undefined) {\n if (typeof value.stack !== \"string\") return false;\n }\n return true;\n}\n\n/**\n * Strict MVP validation before writing JSONL. Rejects empty ids, non-finite times, and malformed payloads.\n */\nexport function validateEvent(event: unknown): event is TraceEvent {\n if (!isRecord(event)) return false;\n if (event.schemaVersion !== \"0.1\") return false;\n if (!finiteNumber(event.timestamp)) return false;\n if (typeof event.event !== \"string\") return false;\n\n switch (event.event) {\n case \"run_started\": {\n if (\n !nonEmptyString(event.runId) ||\n !nonEmptyString(event.name) ||\n !finiteNumber(event.startTime)\n ) {\n return false;\n }\n if (event.metadata !== undefined && !isRecord(event.metadata)) {\n return false;\n }\n return true;\n }\n case \"run_completed\": {\n return (\n nonEmptyString(event.runId) &&\n (event.status === \"success\" || event.status === \"error\") &&\n finiteNumber(event.endTime) &&\n finiteNumber(event.durationMs) &&\n optionalErrorInfo(event.error)\n );\n }\n case \"step_started\": {\n if (\n !nonEmptyString(event.runId) ||\n !nonEmptyString(event.stepId) ||\n !nonEmptyString(event.name) ||\n !isStepType(event.type) ||\n !finiteNumber(event.startTime)\n ) {\n return false;\n }\n if (event.parentId !== undefined && typeof event.parentId !== \"string\") {\n return false;\n }\n if (event.metadata !== undefined && !isRecord(event.metadata)) {\n return false;\n }\n return true;\n }\n case \"step_completed\": {\n return (\n nonEmptyString(event.runId) &&\n nonEmptyString(event.stepId) &&\n (event.status === \"success\" || event.status === \"error\") &&\n finiteNumber(event.endTime) &&\n finiteNumber(event.durationMs) &&\n optionalErrorInfo(event.error)\n );\n }\n default:\n return false;\n }\n}\n\n/** Serializes a trace line as compact JSON without a trailing newline. */\nexport function serializeEvent(event: TraceEvent): string {\n try {\n return JSON.stringify(event);\n } catch {\n return \"\";\n }\n}\n\n/**\n * Creates (or truncates) an empty JSONL file for a run. Uses {@link ensureTraceDir} then {@link getTraceFilePath}.\n * On failure, retries once under {@link FALLBACK_TRACE_DIR}.\n */\nexport async function initializeTraceFile(\n runId: string,\n traceDir: string,\n): Promise<string | undefined> {\n try {\n const usable = await ensureTraceDir(traceDir);\n const filePath = getTraceFilePath(runId, usable);\n await writeFile(filePath, \"\", \"utf-8\");\n return filePath;\n } catch (e) {\n warn(\"Failed to initialize trace file\", e);\n }\n\n try {\n const usable = await ensureTraceDir(FALLBACK_TRACE_DIR);\n const filePath = getTraceFilePath(runId, usable);\n await writeFile(filePath, \"\", \"utf-8\");\n return filePath;\n } catch (e) {\n warn(\"Failed to initialize trace file on fallback directory\", e);\n return undefined;\n }\n}\n\n/**\n * Appends one validated JSONL line for `event.runId`. Falls back to {@link FALLBACK_TRACE_DIR} on append failure.\n */\nexport async function writeTraceEvent(\n event: TraceEvent,\n traceDir: string,\n): Promise<void> {\n if (!validateEvent(event)) {\n warn(\"Skipped invalid trace event (validation failed)\");\n return;\n }\n\n const line = serializeEvent(event);\n if (line === \"\") {\n warn(\"Skipped trace event (serialization failed)\");\n return;\n }\n\n const payload = `${line}\\n`;\n\n const tryAppend = async (dir: string): Promise<boolean> => {\n try {\n const usable = await ensureTraceDir(dir);\n const filePath = getTraceFilePath(event.runId, usable);\n await appendFile(filePath, payload, \"utf-8\");\n return true;\n } catch {\n return false;\n }\n };\n\n if (await tryAppend(traceDir)) {\n return;\n }\n\n warn(`Failed to append trace event for run ${event.runId}`);\n\n if (await tryAppend(FALLBACK_TRACE_DIR)) {\n return;\n }\n\n warn(\"Failed to append trace event to fallback directory\");\n}\n\n/**\n * Reads raw JSONL file contents for a run, or `undefined` if missing or unreadable.\n */\nexport async function readTraceFile(\n runId: string,\n traceDir: string,\n): Promise<string | undefined> {\n try {\n const filePath = getTraceFilePath(runId, traceDir);\n return await readFile(filePath, \"utf-8\");\n } catch (e) {\n if (e && typeof e === \"object\" && \"code\" in e && e.code === \"ENOENT\") {\n return undefined;\n }\n warn(\"Unexpected error reading trace file\", e);\n return undefined;\n }\n}\n\n/** Parses JSONL into validated {@link TraceEvent} rows; invalid lines are skipped with a warning. */\nexport async function readTraceEvents(\n runId: string,\n traceDir: string,\n): Promise<TraceEvent[]> {\n const out: TraceEvent[] = [];\n try {\n const raw = await readTraceFile(runId, traceDir);\n if (raw === undefined) {\n return out;\n }\n const lines = raw.split(\"\\n\");\n for (const line of lines) {\n const trimmed = line.trim();\n if (trimmed === \"\") continue;\n let parsed: unknown;\n try {\n parsed = JSON.parse(trimmed) as unknown;\n } catch {\n warn(\"Skipped invalid JSON line in trace file\");\n continue;\n }\n if (validateEvent(parsed)) {\n out.push(parsed);\n } else {\n warn(\"Skipped invalid trace event line in trace file\");\n }\n }\n } catch (e) {\n warn(\"Failed to read trace events\", e);\n }\n return out;\n}\n\n/**\n * Lists `.jsonl` file names in `traceDir`, newest by mtime first (name sort as tie-breaker).\n */\nexport async function listTraceFiles(traceDir: string): Promise<string[]> {\n try {\n const usable = path.resolve(traceDir);\n const names = await readdir(usable);\n const jsonl = names.filter((n) => n.endsWith(\".jsonl\"));\n const withStat = await Promise.all(\n jsonl.map(async (name) => {\n try {\n const st = await stat(path.join(usable, name));\n return { name, mtime: st.mtimeMs };\n } catch {\n return { name, mtime: 0 };\n }\n }),\n );\n withStat.sort((a, b) => {\n if (b.mtime !== a.mtime) return b.mtime - a.mtime;\n return a.name.localeCompare(b.name);\n });\n return withStat.map((x) => x.name);\n } catch {\n return [];\n }\n}\n\n/** Maps a `.jsonl` file name to its run id (basename only; no traversal). */\nexport function getRunIdFromTraceFileName(fileName: string): string | undefined {\n try {\n const base = path.basename(fileName);\n if (!base.endsWith(\".jsonl\")) return undefined;\n const id = base.slice(0, -\".jsonl\".length);\n return id === \"\" ? undefined : id;\n } catch {\n return undefined;\n }\n}\n","import chalk from \"chalk\";\n\nimport { isSilentContext } from \"./context.js\";\nimport type { ErrorInfo, RunStatus, StepStatus } from \"./types.js\";\nimport { formatDuration, truncateName } from \"./utils.js\";\n\n/** Two spaces per nesting level in terminal output. */\nexport const TERMINAL_INDENT = \" \";\n\n/** Max display length for names in terminal output. */\nexport const MAX_TERMINAL_NAME_LENGTH = 80;\n\n/** Max nesting depth used for indentation (prevents huge indents). */\nexport const MAX_TERMINAL_DEPTH = 10;\n\nfunction normalizeDepth(depth: number): number {\n if (!Number.isFinite(depth) || depth < 0) {\n return 0;\n }\n return Math.min(Math.floor(depth), MAX_TERMINAL_DEPTH);\n}\n\nfunction safePrint(line = \"\"): void {\n try {\n console.log(line);\n } catch {\n /* never break callers */\n }\n}\n\n/** Indentation string for a nesting depth (capped, never negative). */\nexport function getIndent(depth: number): string {\n return TERMINAL_INDENT.repeat(normalizeDepth(depth));\n}\n\n/** Truncates a display name for terminal use; invalid input becomes `\"unnamed\"`. */\nexport function formatTerminalName(name: string): string {\n if (typeof name !== \"string\" || name.trim() === \"\") {\n return \"unnamed\";\n }\n return truncateName(name, MAX_TERMINAL_NAME_LENGTH);\n}\n\nfunction getStatusIcon(status: StepStatus | RunStatus): string {\n if (status === \"success\") return chalk.green(\"✔\");\n if (status === \"error\") return chalk.red(\"✖\");\n return chalk.yellow(\"⏳\");\n}\n\n/** Renders a single step line (colored); does not consult silent mode. */\nexport function renderStepLine(\n name: string,\n durationMs: number | undefined,\n status: StepStatus,\n depth?: number,\n): string {\n try {\n const nm = formatTerminalName(name);\n const ind = getIndent(depth ?? 0);\n if (status === \"running\" && durationMs === undefined) {\n return `${ind}${chalk.yellow(\"⏳\")} ${nm}`;\n }\n const hasDur =\n durationMs !== undefined && Number.isFinite(durationMs as number);\n const dur = hasDur ? formatDuration(durationMs as number) : undefined;\n if (status === \"running\") {\n return dur !== undefined\n ? `${ind}${chalk.yellow(\"⏳\")} ${nm} (${dur})`\n : `${ind}${chalk.yellow(\"⏳\")} ${nm}`;\n }\n if (!hasDur || dur === undefined) {\n return `${ind}${chalk.yellow(\"⏳\")} ${nm}`;\n }\n if (status === \"success\") {\n return `${ind}${getStatusIcon(\"success\")} ${nm} (${dur})`;\n }\n return `${ind}${getStatusIcon(\"error\")} ${nm} (${dur})`;\n } catch {\n return \"\";\n }\n}\n\n/** Renders an error summary line (no stack in MVP). */\nexport function renderErrorLine(error: ErrorInfo, depth?: number): string {\n try {\n const msg =\n typeof error.message === \"string\" ? error.message : \"\";\n const ind = getIndent((depth ?? 0) + 1);\n return `${ind}Error: ${msg}`;\n } catch {\n return \"\";\n }\n}\n\n/** Plain-text run summary lines (no chalk) for stable testing and CLI reuse. */\nexport function renderRunSummary(\n durationMs: number,\n status: RunStatus,\n traceFilePath?: string,\n): string[] {\n try {\n const dur = Number.isFinite(durationMs)\n ? formatDuration(durationMs)\n : formatDuration(0);\n const head =\n status === \"error\" ? `Failed in ${dur}` : `Completed in ${dur}`;\n const lines = [head];\n if (traceFilePath !== undefined && traceFilePath.trim() !== \"\") {\n lines.push(`Trace: ${traceFilePath}`);\n }\n return lines;\n } catch {\n return [];\n }\n}\n\n/** Prints run header with icon and dim run id. */\nexport function printRunStart(runId: string, name: string): void {\n if (isSilentContext()) return;\n try {\n safePrint(\"\");\n const header = `${chalk.cyan.bold(\"🔍 AgentInspect:\")} ${formatTerminalName(name)} ${chalk.dim(`(${runId})`)}`;\n safePrint(header);\n } catch {\n /* noop */\n }\n}\n\n/** Prints a running step line. */\nexport function printStepStart(name: string, depth = 0): void {\n if (isSilentContext()) return;\n try {\n safePrint(renderStepLine(name, undefined, \"running\", depth));\n } catch {\n /* noop */\n }\n}\n\n/** Prints a completed step line with duration and status icon. */\nexport function printStepComplete(\n name: string,\n durationMs: number,\n status: StepStatus,\n depth = 0,\n): void {\n if (isSilentContext()) return;\n try {\n safePrint(renderStepLine(name, durationMs, status, depth));\n } catch {\n /* noop */\n }\n}\n\n/** Prints a structured error line (message only, no stack). */\nexport function printError(error: ErrorInfo, depth = 0): void {\n if (isSilentContext()) return;\n try {\n safePrint(renderErrorLine(error, depth));\n } catch {\n /* noop */\n }\n}\n\n/** Prints run completion summary and optional trace path. */\nexport function printRunComplete(\n _name: string,\n _runId: string,\n durationMs: number,\n status: RunStatus,\n traceFilePath?: string,\n): void {\n if (isSilentContext()) return;\n try {\n const lines = renderRunSummary(durationMs, status, traceFilePath);\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i]!;\n if (i === 0) {\n const color =\n status === \"error\"\n ? chalk.red\n : status === \"running\"\n ? chalk.yellow\n : chalk.green;\n safePrint(color(line));\n } else {\n safePrint(chalk.dim(line));\n }\n }\n } catch {\n /* noop */\n }\n}\n\n/** Prints which step failed. */\nexport function printFailedAt(stepName: string): void {\n if (isSilentContext()) return;\n try {\n safePrint(`Failed at: ${formatTerminalName(stepName)}`);\n } catch {\n /* noop */\n }\n}\n","import { getCurrentContext, getCurrentDepth, getParentStepId, runWithStepContext } from \"./context.js\";\nimport type { StepOptions, StepType, TraceEvent } from \"./types.js\";\nimport { writeTraceEvent } from \"./storage.js\";\nimport { printFailedAt, printError, printStepComplete, printStepStart } from \"./terminal.js\";\nimport { createStepId, formatError, truncateName, warn } from \"./utils.js\";\n\nfunction normalizeStepName(name: unknown): string {\n if (typeof name !== \"string\" || name.trim() === \"\") {\n return \"unnamed-step\";\n }\n return truncateName(name.trim(), 100);\n}\n\nasync function safeInstrumentation(\n label: string,\n op: () => void | Promise<void>,\n): Promise<void> {\n try {\n await Promise.resolve(op());\n } catch (e) {\n warn(`step: ${label}`, e);\n }\n}\n\nasync function stepImpl<T>(\n name: string,\n fn: () => Promise<T> | T,\n options?: StepOptions,\n): Promise<T> {\n if (typeof fn !== \"function\") {\n throw new TypeError(\"step requires `fn` to be a function\");\n }\n\n const stepName = normalizeStepName(name);\n const context = getCurrentContext();\n\n if (!context) {\n warn(\"step() called outside inspectRun(); executing without instrumentation\");\n return Promise.resolve(fn());\n }\n\n const stepId = createStepId();\n const renderDepth = getCurrentDepth();\n const parentId = getParentStepId();\n const stepType: StepType = options?.type ?? \"logic\";\n const metadata = options?.metadata;\n const startTime = Date.now();\n\n await safeInstrumentation(\"writeTraceEvent(step_started)\", async () => {\n const started: TraceEvent = {\n schemaVersion: \"0.1\",\n event: \"step_started\",\n timestamp: startTime,\n runId: context.runId,\n stepId,\n ...(typeof parentId === \"string\" && parentId.trim() !== \"\"\n ? { parentId }\n : {}),\n name: stepName,\n type: stepType,\n startTime,\n ...(metadata !== undefined ? { metadata } : {}),\n };\n await writeTraceEvent(started, context.traceDir);\n });\n\n await safeInstrumentation(\"printStepStart\", () => {\n printStepStart(stepName, renderDepth);\n });\n\n let result: T;\n try {\n result = await runWithStepContext(stepId, async () => {\n return await Promise.resolve(fn());\n });\n } catch (userError) {\n const endTime = Date.now();\n const durationMs = endTime - startTime;\n const formatted = formatError(userError);\n\n await safeInstrumentation(\"writeTraceEvent(step_completed error)\", async () => {\n const completed: TraceEvent = {\n schemaVersion: \"0.1\",\n event: \"step_completed\",\n timestamp: endTime,\n runId: context.runId,\n stepId,\n status: \"error\",\n endTime,\n durationMs,\n error: formatted,\n };\n await writeTraceEvent(completed, context.traceDir);\n });\n\n await safeInstrumentation(\"printStepComplete(error)\", () => {\n printStepComplete(stepName, durationMs, \"error\", renderDepth);\n });\n await safeInstrumentation(\"printError\", () => {\n printError(formatted, renderDepth);\n });\n await safeInstrumentation(\"printFailedAt\", () => {\n printFailedAt(stepName);\n });\n\n throw userError;\n }\n\n const endTime = Date.now();\n const durationMs = endTime - startTime;\n\n await safeInstrumentation(\"writeTraceEvent(step_completed success)\", async () => {\n const completed: TraceEvent = {\n schemaVersion: \"0.1\",\n event: \"step_completed\",\n timestamp: endTime,\n runId: context.runId,\n stepId,\n status: \"success\",\n endTime,\n durationMs,\n };\n await writeTraceEvent(completed, context.traceDir);\n });\n\n await safeInstrumentation(\"printStepComplete(success)\", () => {\n printStepComplete(stepName, durationMs, \"success\", renderDepth);\n });\n\n return result;\n}\n\n/** Callable step tracer plus {@link step.llm} and {@link step.tool} shortcuts. */\nexport type StepFunction = {\n <T>(name: string, fn: () => Promise<T> | T, options?: StepOptions): Promise<T>;\n llm: <T>(model: string, fn: () => Promise<T> | T) => Promise<T>;\n tool: <T>(toolName: string, fn: () => Promise<T> | T) => Promise<T>;\n};\n\nasync function stepLlm<T>(model: string, fn: () => Promise<T> | T): Promise<T> {\n const modelName =\n typeof model === \"string\" && model.trim() !== \"\"\n ? model.trim()\n : \"unknown-model\";\n return stepImpl<T>(`llm:${modelName}`, fn, {\n type: \"llm\",\n metadata: { model: modelName },\n });\n}\n\nasync function stepTool<T>(\n toolName: string,\n fn: () => Promise<T> | T,\n): Promise<T> {\n const normalized =\n typeof toolName === \"string\" && toolName.trim() !== \"\"\n ? toolName.trim()\n : \"unknown-tool\";\n return stepImpl<T>(`tool:${normalized}`, fn, {\n type: \"tool\",\n metadata: { toolName: normalized },\n });\n}\n\n/**\n * Traces a named unit of work inside `inspectRun` (`step_started` / `step_completed`, optional terminal).\n * Outside a run, executes `fn` with a warn only. Preserves return values and rethrows user errors unchanged.\n *\n * - `step.llm(model, fn)` — `type: \"llm\"`, `metadata.model` (no SDK calls or token counting).\n * - `step.tool(toolName, fn)` — `type: \"tool\"`, `metadata.toolName` (no framework interception).\n */\nexport const step = Object.assign(stepImpl, {\n llm: stepLlm,\n tool: stepTool,\n}) as StepFunction;\n","import {\n formatDuration,\n formatTimestamp,\n getDefaultTraceDir,\n listTraceFiles,\n readTraceEvents,\n getRunIdFromTraceFileName,\n truncateName,\n} from \"@agent-inspect/core\";\nimport type {\n RunCompletedEvent,\n RunStartedEvent,\n TraceEvent,\n} from \"@agent-inspect/core\";\n\nexport interface ListOptions {\n dir?: string;\n limit?: string;\n status?: \"running\" | \"success\" | \"error\";\n}\n\ntype RunSummary = {\n runId: string;\n name: string;\n status: \"running\" | \"success\" | \"error\";\n durationMs?: number;\n startTime: number;\n};\n\nfunction parseLimit(raw?: string): number {\n const fallback = 20;\n if (raw === undefined || raw.trim() === \"\") return fallback;\n const n = Number.parseInt(raw, 10);\n if (!Number.isFinite(n) || n <= 0) return fallback;\n return Math.min(n, 100);\n}\n\nfunction isStatusFilter(\n value: unknown,\n): value is \"running\" | \"success\" | \"error\" {\n return value === \"running\" || value === \"success\" || value === \"error\";\n}\n\nfunction buildRunSummary(\n runId: string,\n events: TraceEvent[],\n): RunSummary | undefined {\n const started = events.find(\n (e): e is RunStartedEvent => e.event === \"run_started\",\n );\n if (!started) return undefined;\n\n const completed = events.filter(\n (e): e is RunCompletedEvent => e.event === \"run_completed\",\n );\n const last = completed[completed.length - 1];\n\n const status: RunSummary[\"status\"] = last ? last.status : \"running\";\n const startTime = Number.isFinite(started.startTime)\n ? started.startTime\n : Number.isFinite(started.timestamp)\n ? started.timestamp\n : 0;\n\n const name =\n typeof started.name === \"string\" && started.name.trim() !== \"\"\n ? started.name.trim()\n : \"unknown-run\";\n\n return {\n runId,\n name,\n status,\n durationMs: last !== undefined ? last.durationMs : undefined,\n startTime,\n };\n}\n\nfunction statusIcon(status: RunSummary[\"status\"]): string {\n if (status === \"success\") return \"✓\";\n if (status === \"error\") return \"✗\";\n return \"⏳\";\n}\n\nfunction durationCell(\n status: RunSummary[\"status\"],\n durationMs?: number,\n): string {\n if (status === \"running\") return \"-\";\n if (durationMs !== undefined && Number.isFinite(durationMs)) {\n return formatDuration(durationMs);\n }\n return \"-\";\n}\n\nfunction timestampCell(startTime: number): string {\n if (!Number.isFinite(startTime) || startTime <= 0) return \"Invalid date\";\n const s = formatTimestamp(startTime);\n return s === \"Invalid date\" ? \"Invalid date\" : s;\n}\n\n/**\n * Prints a table of recent runs under the trace directory. Swallows expected I/O issues;\n * unexpected failures set `process.exitCode` and log a short message (no `process.exit`).\n */\nexport async function list(options: ListOptions = {}): Promise<void> {\n try {\n const traceDir =\n typeof options.dir === \"string\" && options.dir.trim() !== \"\"\n ? options.dir.trim()\n : getDefaultTraceDir();\n\n const files = await listTraceFiles(traceDir);\n if (files.length === 0) {\n console.log(\"No AgentInspect runs found\");\n console.log(`Trace directory: ${traceDir}`);\n return;\n }\n\n const summaries: RunSummary[] = [];\n for (const fileName of files) {\n try {\n const runId = getRunIdFromTraceFileName(fileName);\n if (runId === undefined) continue;\n const events = await readTraceEvents(runId, traceDir);\n const row = buildRunSummary(runId, events);\n if (row !== undefined) summaries.push(row);\n } catch {\n /* skip malformed */\n }\n }\n\n if (summaries.length === 0) {\n console.log(\"No AgentInspect runs found\");\n console.log(`Trace directory: ${traceDir}`);\n return;\n }\n\n summaries.sort((a, b) => b.startTime - a.startTime);\n\n const statusFilter = isStatusFilter(options.status)\n ? options.status\n : undefined;\n const filtered =\n statusFilter === undefined\n ? summaries\n : summaries.filter((s) => s.status === statusFilter);\n\n const limit = parseLimit(options.limit);\n const shown = filtered.slice(0, limit);\n\n console.log(\"Recent AgentInspect Runs\");\n for (const s of shown) {\n const icon = statusIcon(s.status);\n const dur = durationCell(s.status, s.durationMs);\n const ts = timestampCell(s.startTime);\n const nm = truncateName(s.name, 80);\n console.log(`${icon} ${s.runId} | ${nm} | ${dur} | ${ts}`);\n }\n\n console.log(\"\");\n console.log(`Showing ${shown.length} of ${filtered.length} runs`);\n console.log(`Trace directory: ${traceDir}`);\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n console.error(`[AgentInspect] list failed: ${msg}`);\n process.exitCode = 1;\n }\n}\n","import {\n formatDuration,\n formatTimestamp,\n getDefaultTraceDir,\n getIndent,\n getTraceFilePath,\n readTraceEvents,\n renderErrorLine,\n renderStepLine,\n} from \"@agent-inspect/core\";\nimport type {\n ErrorInfo,\n RunCompletedEvent,\n RunStartedEvent,\n RunStatus,\n StepCompletedEvent,\n StepStartedEvent,\n StepMetadata,\n StepStatus,\n StepType,\n TraceEvent,\n} from \"@agent-inspect/core\";\n\nexport interface ViewOptions {\n dir?: string;\n verbose?: boolean;\n json?: boolean;\n}\n\ntype StepNode = {\n id: string;\n parentId?: string;\n name: string;\n type: StepType;\n status: StepStatus;\n durationMs?: number;\n error?: ErrorInfo;\n startedAt: number;\n metadata?: StepMetadata;\n children: StepNode[];\n};\n\nfunction buildStepTree(events: TraceEvent[]): StepNode[] {\n const nodes = new Map<string, StepNode>();\n\n for (const e of events) {\n if (e.event === \"step_started\") {\n const s = e as StepStartedEvent;\n nodes.set(s.stepId, {\n id: s.stepId,\n parentId: s.parentId,\n name: s.name,\n type: s.type,\n status: \"running\",\n startedAt: s.startTime,\n metadata: s.metadata,\n children: [],\n });\n }\n }\n\n for (const e of events) {\n if (e.event !== \"step_completed\") continue;\n const c = e as StepCompletedEvent;\n const node = nodes.get(c.stepId);\n if (!node) continue;\n node.status = c.status;\n node.durationMs = c.durationMs;\n node.error = c.error;\n }\n\n const roots: StepNode[] = [];\n for (const n of nodes.values()) {\n if (n.parentId !== undefined && nodes.has(n.parentId)) {\n nodes.get(n.parentId)!.children.push(n);\n } else {\n roots.push(n);\n }\n }\n\n const sortByStarted = (a: StepNode, b: StepNode) => a.startedAt - b.startedAt;\n roots.sort(sortByStarted);\n for (const n of nodes.values()) {\n n.children.sort(sortByStarted);\n }\n\n return roots;\n}\n\nfunction printStepTree(\n nodes: StepNode[],\n depth: number,\n verbose: boolean,\n): void {\n for (const node of nodes) {\n console.log(\n renderStepLine(node.name, node.durationMs, node.status, depth),\n );\n if (node.error !== undefined) {\n if (verbose) {\n console.log(renderErrorLine(node.error, depth + 1));\n if (\n typeof node.error.stack === \"string\" &&\n node.error.stack.trim() !== \"\"\n ) {\n console.log(node.error.stack);\n }\n } else {\n console.log(\n renderErrorLine({ message: node.error.message }, depth + 1),\n );\n }\n }\n if (verbose) {\n console.log(`${getIndent(depth + 1)}type: ${node.type}`);\n if (\n node.metadata !== undefined &&\n Object.keys(node.metadata).length > 0\n ) {\n try {\n console.log(\n `${getIndent(depth + 1)}metadata: ${JSON.stringify(node.metadata)}`,\n );\n } catch {\n /* ignore */\n }\n }\n }\n printStepTree(node.children, depth + 1, verbose);\n }\n}\n\n/**\n * Prints a single run as a tree (or JSON). Missing runs and invalid traces set `process.exitCode`\n * without throwing from normal paths.\n */\nexport async function view(\n runId: string,\n options: ViewOptions = {},\n): Promise<void> {\n try {\n const id =\n typeof runId === \"string\" && runId.trim() !== \"\" ? runId.trim() : \"\";\n if (id === \"\") {\n console.error(\"Run id is required\");\n process.exitCode = 1;\n return;\n }\n\n const traceDir =\n typeof options.dir === \"string\" && options.dir.trim() !== \"\"\n ? options.dir.trim()\n : getDefaultTraceDir();\n\n const events = await readTraceEvents(id, traceDir);\n if (events.length === 0) {\n console.log(`Run not found: ${id}`);\n console.log(`Trace directory: ${traceDir}`);\n process.exitCode = 1;\n return;\n }\n\n if (options.json) {\n console.log(JSON.stringify(events, null, 2));\n return;\n }\n\n const started = events.find(\n (e): e is RunStartedEvent => e.event === \"run_started\",\n );\n if (!started) {\n console.error(\"Invalid trace: missing run_started\");\n process.exitCode = 1;\n return;\n }\n\n const completed = events.filter(\n (e): e is RunCompletedEvent => e.event === \"run_completed\",\n );\n const last = completed[completed.length - 1];\n const status: RunStatus = last ? last.status : \"running\";\n const durationLine =\n last !== undefined && Number.isFinite(last.durationMs)\n ? formatDuration(last.durationMs)\n : \"-\";\n\n const startedTs = Number.isFinite(started.startTime)\n ? started.startTime\n : started.timestamp;\n const startedLabel = formatTimestamp(startedTs);\n\n console.log(`AgentInspect Run: ${started.name}`);\n console.log(`ID: ${id}`);\n console.log(`Status: ${status}`);\n console.log(`Duration: ${durationLine}`);\n console.log(`Started: ${startedLabel}`);\n console.log(\"\");\n\n const tree = buildStepTree(events);\n console.log(\"Execution Tree:\");\n if (tree.length === 0) {\n console.log(\"No steps recorded\");\n } else {\n printStepTree(tree, 0, options.verbose === true);\n }\n\n console.log(\"\");\n console.log(`Trace file: ${getTraceFilePath(id, traceDir)}`);\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n console.error(`[AgentInspect] view failed: ${msg}`);\n process.exitCode = 1;\n }\n}\n","#!/usr/bin/env node\nimport { realpathSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nimport { Command, Option } from \"commander\";\n\nimport type { ListOptions } from \"./list.js\";\nimport { list } from \"./list.js\";\nimport { view } from \"./view.js\";\n\nexport function runCommand(action: () => Promise<void>): void {\n void action().catch((error: unknown) => {\n const msg = error instanceof Error ? error.message : String(error);\n console.error(`[AgentInspect] ${msg}`);\n process.exitCode = 1;\n });\n}\n\nexport function createCliProgram(): Command {\n const program = new Command(\"agent-inspect\")\n .description(\"Local-first execution-tree debugger for AI agents\")\n .version(\"0.1.0\");\n\n program\n .command(\"list\")\n .description(\"List recent AgentInspect runs\")\n .option(\"--dir <path>\", \"trace directory\")\n .option(\"--limit <number>\", \"max runs to show (default 20, max 100)\")\n .addOption(\n new Option(\"--status <status>\", \"filter by run status\").choices([\n \"running\",\n \"success\",\n \"error\",\n ]),\n )\n .action(\n (opts: {\n dir?: string;\n limit?: string;\n status?: ListOptions[\"status\"];\n }) => {\n runCommand(() => list(opts));\n },\n );\n\n program\n .command(\"view\")\n .description(\"View a single run trace\")\n .argument(\"<run-id>\", \"run id (e.g. from list output)\")\n .option(\"--dir <path>\", \"trace directory\")\n .option(\"--verbose\", \"show extra detail (types, metadata, error stacks)\")\n .option(\"--json\", \"print raw trace events as JSON\")\n .action(\n (\n runId: string,\n opts: { dir?: string; verbose?: boolean; json?: boolean },\n ) => {\n runCommand(() => view(runId, opts));\n },\n );\n\n return program;\n}\n\nfunction isPrimaryModule(): boolean {\n const entry = process.argv[1];\n if (!entry) return false;\n const selfPath = fileURLToPath(import.meta.url);\n try {\n return (\n realpathSync(path.resolve(entry)) === realpathSync(path.resolve(selfPath))\n );\n } catch {\n return path.resolve(entry) === path.resolve(selfPath);\n }\n}\n\nif (isPrimaryModule()) {\n createCliProgram().parse(process.argv);\n}\n"]}
|