{"version":3,"sources":["../src/step.ts","../src/observe.ts","../src/observe-outcome.ts"],"names":["endTime","durationMs"],"mappings":"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","file":"index.mjs","sourcesContent":["import {\n  getCurrentContext,\n  getCurrentDepth,\n  getParentStepId,\n  getTraceSafetyFromContext,\n  runWithStepContext,\n} 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 { prepareTraceEventForDisk } from \"./trace-event-safety.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 traceSafety = getTraceSafetyFromContext();\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    const safe =\n      traceSafety !== undefined\n        ? prepareTraceEventForDisk(started, traceSafety)\n        : started;\n    await writeTraceEvent(safe, 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      const safe =\n        traceSafety !== undefined\n          ? prepareTraceEventForDisk(completed, traceSafety)\n          : completed;\n      await writeTraceEvent(safe, 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    const safe =\n      traceSafety !== undefined\n        ? prepareTraceEventForDisk(completed, traceSafety)\n        : completed;\n    await writeTraceEvent(safe, context.traceDir);\n  });\n\n  await safeInstrumentation(\"printStepComplete(success)\", () => {\n    printStepComplete(stepName, durationMs, \"success\", renderDepth);\n  });\n\n  return result;\n}\n\n/**\n * Stable v1.0 API for instrumenting a named step inside an AgentInspect run.\n *\n * Callable step tracer plus {@link step.llm} and {@link step.tool} shortcuts.\n */\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 { inspectRun } from \"./inspect-run.js\";\nimport type { ObserveOptions } from \"./types.js\";\nimport { truncateName, warn } from \"./utils.js\";\n\nconst INSTRUMENTABLE_METHODS = [\"run\", \"execute\", \"invoke\"] as const;\n\nfunction isInstrumentableProp(\n  prop: string | symbol,\n): prop is (typeof INSTRUMENTABLE_METHODS)[number] {\n  if (typeof prop !== \"string\") return false;\n  return (INSTRUMENTABLE_METHODS as readonly string[]).includes(prop);\n}\n\nfunction getAgentLabel(target: object): string {\n  try {\n    const ctor = Reflect.get(target, \"constructor\") as { name?: string } | undefined;\n    const name = ctor?.name;\n    if (typeof name === \"string\" && name.trim() !== \"\" && name !== \"Object\") {\n      return name.trim();\n    }\n  } catch {\n    /* ignore */\n  }\n  return \"Agent\";\n}\n\nfunction buildRunName(target: object, methodKey: string): string {\n  const label = getAgentLabel(target);\n  return truncateName(`${label}.${methodKey}`, 100);\n}\n\n/**\n * Stable v1.0 API for observing agent-like objects locally.\n *\n * Returns a Proxy that traces top-level `run`, `execute`, and `invoke` via {@link inspectRun}.\n * Other properties pass through; function members are bound to the real target so class private fields work.\n * Invalid agents are returned unchanged (with a warn); this function never throws.\n */\nexport function observe<T>(agent: T, options?: ObserveOptions): T {\n  if (agent === null || agent === undefined) {\n    warn(\"observe() requires an object\");\n    return agent;\n  }\n  const agentType = typeof agent;\n  if (agentType !== \"object\" && agentType !== \"function\") {\n    warn(\"observe() requires an object\");\n    return agent;\n  }\n\n  const target = agent as object;\n\n  const handlers: ProxyHandler<object> = {\n    get(proxyTarget, prop, receiver) {\n      try {\n        const value = Reflect.get(proxyTarget, prop, receiver);\n\n        if (isInstrumentableProp(prop)) {\n          if (typeof value !== \"function\") {\n            return value;\n          }\n          const methodKey = prop;\n          return function observedWrapper(...args: unknown[]) {\n            let runName: string;\n            try {\n              runName = buildRunName(proxyTarget, methodKey);\n            } catch (e) {\n              warn(\"observe() method wrapping failed\", e);\n              return value.apply(proxyTarget, args);\n            }\n            return inspectRun(runName, () => value.apply(proxyTarget, args), options);\n          };\n        }\n\n        if (typeof value === \"function\" && prop !== \"constructor\") {\n          return value.bind(proxyTarget);\n        }\n        return value;\n      } catch (e) {\n        warn(\"observe() method wrapping failed\", e);\n        try {\n          return Reflect.get(proxyTarget, prop, receiver);\n        } catch {\n          return undefined;\n        }\n      }\n    },\n  };\n\n  try {\n    return new Proxy(target, handlers) as T;\n  } catch (e) {\n    warn(\"observe() failed\", e);\n    return agent;\n  }\n}\n","import {\n  getCurrentContext,\n  getParentStepId,\n  getTraceSafetyFromContext,\n} from \"./context.js\";\nimport {\n  normalizeObserveOutcomeInput,\n  prepareOutcomeEventForDisk,\n  type ObserveOutcomeOptions,\n} from \"./outcomes/index.js\";\nimport type { OutcomeObservedEvent } from \"./types.js\";\nimport { writeTraceEvent } from \"./storage.js\";\nimport { createStepId, warn } from \"./utils.js\";\n\nasync function safeWrite(label: string, op: () => Promise<void>): Promise<void> {\n  try {\n    await op();\n  } catch (error) {\n    warn(`observeOutcome: ${label}`, error);\n  }\n}\n\n/**\n * Records an observed real-world outcome inside an active `inspectRun` context.\n * Outside a run, logs a warning and returns without throwing.\n */\nexport async function observeOutcome(\n  name: string,\n  options: ObserveOutcomeOptions,\n): Promise<void> {\n  const context = getCurrentContext();\n  if (!context) {\n    warn(\"observeOutcome() called outside inspectRun(); skipping\");\n    return;\n  }\n\n  let normalized;\n  try {\n    normalized = normalizeObserveOutcomeInput(name, options);\n  } catch (error) {\n    warn(\"observeOutcome() invalid arguments\", error);\n    return;\n  }\n\n  const traceSafety = getTraceSafetyFromContext();\n  const parentId = getParentStepId();\n  const event: OutcomeObservedEvent = {\n    schemaVersion: \"0.1\",\n    event: \"outcome_observed\",\n    timestamp: normalized.observedAt,\n    runId: context.runId,\n    outcomeId: createStepId(),\n    ...(parentId !== undefined ? { parentId } : {}),\n    name: normalized.name,\n    expectation: normalized.expectation,\n    status: normalized.status,\n    ...(normalized.method !== undefined ? { method: normalized.method } : {}),\n    ...(normalized.actual !== undefined ? { actual: normalized.actual } : {}),\n    ...(normalized.evidence !== undefined ? { evidence: normalized.evidence } : {}),\n    observedAt: normalized.observedAt,\n  };\n\n  const prepared =\n    traceSafety !== undefined\n      ? prepareOutcomeEventForDisk(event, traceSafety)\n      : event;\n\n  await safeWrite(\"writeTraceEvent\", async () => {\n    await writeTraceEvent(prepared, context.traceDir);\n  });\n}\n\nexport type { ObserveOutcomeOptions } from \"./outcomes/index.js\";\n"]}