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 CHANGED
@@ -1,14 +1,14 @@
1
1
  # agent-inspect
2
2
 
3
- AgentInspect is a local-first execution-tree debugger for TypeScript AI agents.
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
- AgentInspect turns runs into structured execution trees with JSONL traces and CLI inspection.
9
+ agent-inspect turns runs into structured execution trees with JSONL traces and CLI inspection.
10
10
 
11
- AgentInspect is designed for inner-loop debugging, not as a replacement for production observability platforms.
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
- AgentInspect records the failed step, writes it to the trace file, and still rethrows the original error.
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
- AgentInspect writes one JSONL file per run.
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.0",
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 isRecord2(value) {
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 (!isRecord2(value)) return false;
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 (!isRecord2(event)) return false;
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 && !isRecord2(event.metadata)) {
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 && !isRecord2(event.metadata)) {
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 safeInstrumentation2(label, op) {
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 safeInstrumentation2("writeTraceEvent(step_started)", async () => {
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 safeInstrumentation2("printStepStart", () => {
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 safeInstrumentation2("writeTraceEvent(step_completed error)", async () => {
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 safeInstrumentation2("printStepComplete(error)", () => {
569
+ await safeInstrumentation("printStepComplete(error)", () => {
567
570
  printStepComplete(stepName, durationMs2, "error", renderDepth);
568
571
  });
569
- await safeInstrumentation2("printError", () => {
572
+ await safeInstrumentation("printError", () => {
570
573
  printError(formatted, renderDepth);
571
574
  });
572
- await safeInstrumentation2("printFailedAt", () => {
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 safeInstrumentation2("writeTraceEvent(step_completed success)", async () => {
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 safeInstrumentation2("printStepComplete(success)", () => {
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 isRecord2(value) {
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 (!isRecord2(value)) return false;
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 (!isRecord2(event)) return false;
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 && !isRecord2(event.metadata)) {
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 && !isRecord2(event.metadata)) {
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 safeInstrumentation2(label, op) {
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 safeInstrumentation2("writeTraceEvent(step_started)", async () => {
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 safeInstrumentation2("printStepStart", () => {
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 safeInstrumentation2("writeTraceEvent(step_completed error)", async () => {
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 safeInstrumentation2("printStepComplete(error)", () => {
560
+ await safeInstrumentation("printStepComplete(error)", () => {
558
561
  printStepComplete(stepName, durationMs2, "error", renderDepth);
559
562
  });
560
- await safeInstrumentation2("printError", () => {
563
+ await safeInstrumentation("printError", () => {
561
564
  printError(formatted, renderDepth);
562
565
  });
563
- await safeInstrumentation2("printFailedAt", () => {
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 safeInstrumentation2("writeTraceEvent(step_completed success)", async () => {
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 safeInstrumentation2("printStepComplete(success)", () => {
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"]}