@deepagents/devtool 7.3.0 → 7.5.0

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.
@@ -365,14 +365,15 @@ function fileTelemetry(options) {
365
365
  };
366
366
  }
367
367
  function fileExporter(path, calls, onWriteError) {
368
- let initialized = false;
368
+ let ensureDirectory = () => {
369
+ mkdirSync(dirname(path), { recursive: true });
370
+ ensureDirectory = () => {
371
+ };
372
+ };
369
373
  return {
370
374
  export(spans, done) {
371
375
  try {
372
- if (!initialized) {
373
- mkdirSync(dirname(path), { recursive: true });
374
- initialized = true;
375
- }
376
+ ensureDirectory();
376
377
  appendFileSync(
377
378
  path,
378
379
  `${spans.map((span) => JSON.stringify(flattenSpan(span, calls))).join("\n")}
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/traces/index.ts", "../../src/traces/file-trace-adapter.ts", "../../src/traces/http.ts"],
4
- "sourcesContent": ["import { OpenTelemetry } from '@ai-sdk/otel';\nimport { type HrTime, SpanKind, SpanStatusCode } from '@opentelemetry/api';\nimport { ExportResultCode } from '@opentelemetry/core';\nimport {\n BasicTracerProvider,\n type ReadableSpan,\n SimpleSpanProcessor,\n type SpanExporter,\n} from '@opentelemetry/sdk-trace-base';\nimport {\n ATTR_GEN_AI_AGENT_NAME,\n ATTR_SESSION_ID,\n ATTR_USER_ID,\n} from '@opentelemetry/semantic-conventions/incubating';\nimport { appendFileSync, mkdirSync } from 'node:fs';\nimport { dirname, resolve } from 'node:path';\nimport { pathToFileURL } from 'node:url';\n\nimport type { FileTelemetryOptions } from '@deepagents/context/telemetry/file';\nimport type {\n AgentPluginDefinition,\n AgentPluginToolContext,\n} from '@deepagents/experimental/zukhruf';\n\nimport { FileTraceAdapter } from './file-trace-adapter.ts';\nimport type { AgentTraceReader } from './file-trace-adapter.ts';\n\nexport * from './file-trace-adapter.ts';\nexport { tracesHttp } from './http.ts';\n\nconst CALL_ID = 'deepagents.call.id';\nconst RECORD_INPUTS = 'deepagents.record.inputs';\nconst RECORD_OUTPUTS = 'deepagents.record.outputs';\nconst SPAN_STATUS = 'deepagents.span.status';\nconst SPAN_TYPE = 'deepagents.span.type';\n\ninterface TraceCallState {\n recordInputs: boolean;\n recordOutputs: boolean;\n status?: 'cancelled';\n}\n\nexport interface FileTelemetryInstance {\n readonly traces: AgentTraceReader;\n}\n\n/** AI SDK OpenTelemetry spans persisted in Halo's flat JSONL format. */\nexport function fileTelemetry(\n options: FileTelemetryOptions,\n): AgentPluginDefinition<FileTelemetryInstance> {\n const path = resolve(options.path);\n return {\n name: `file-telemetry:${pathToFileURL(path).href}`,\n create: () => {\n const calls = new Map<string, TraceCallState>();\n const provider = new BasicTracerProvider({\n spanProcessors: [\n new SimpleSpanProcessor(\n fileExporter(path, calls, options.onWriteError),\n ),\n ],\n });\n return {\n traces: new FileTraceAdapter(pathToFileURL(path)),\n telemetry: (context: AgentPluginToolContext) =>\n openTelemetry(provider, context, calls),\n work: () =>\n Promise.resolve({\n [Symbol.asyncDispose]: async () => {\n await provider.shutdown();\n calls.clear();\n },\n }),\n };\n },\n };\n}\n\nfunction fileExporter(\n path: string,\n calls: Map<string, TraceCallState>,\n onWriteError?: FileTelemetryOptions['onWriteError'],\n): SpanExporter {\n let initialized = false;\n return {\n export(spans, done) {\n try {\n if (!initialized) {\n mkdirSync(dirname(path), { recursive: true });\n initialized = true;\n }\n appendFileSync(\n path,\n `${spans\n .map((span) => JSON.stringify(flattenSpan(span, calls)))\n .join('\\n')}\\n`,\n );\n done({ code: ExportResultCode.SUCCESS });\n } catch (error) {\n try {\n Promise.resolve(onWriteError?.(error)).catch(() => {});\n } catch {\n // Telemetry must never affect the observed operation.\n }\n done({\n code: ExportResultCode.FAILED,\n error: error instanceof Error ? error : new Error(String(error)),\n });\n }\n },\n shutdown: () => Promise.resolve(),\n };\n}\n\nfunction openTelemetry(\n provider: BasicTracerProvider,\n context: AgentPluginToolContext,\n calls: Map<string, TraceCallState>,\n) {\n const telemetry = new OpenTelemetry({\n tracer: provider.getTracer('@deepagents/devtool/traces'),\n usage: true,\n providerMetadata: true,\n enrichSpan: ({ spanType, callId }) => {\n const call = calls.get(callId);\n return {\n [ATTR_SESSION_ID]: context.conversation.chatId,\n [ATTR_USER_ID]: context.conversation.userId,\n [ATTR_GEN_AI_AGENT_NAME]: context.agentName,\n 'deepagents.stream.id': context.streamId,\n 'deepagents.agent.path': context.agentPath,\n [CALL_ID]: callId,\n [SPAN_TYPE]: spanType,\n ...(call\n ? {\n [RECORD_INPUTS]: call.recordInputs,\n [RECORD_OUTPUTS]: call.recordOutputs,\n }\n : {}),\n };\n },\n });\n const onStart = telemetry.onStart.bind(telemetry);\n telemetry.onStart = (event) => {\n calls.set(event.callId, {\n recordInputs: event.recordInputs !== false,\n recordOutputs: event.recordOutputs !== false,\n });\n onStart(event);\n };\n const onAbort = telemetry.onAbort.bind(telemetry);\n telemetry.onAbort = (event) => {\n const call = calls.get(event.callId);\n if (call) call.status = 'cancelled';\n onAbort(event);\n };\n return telemetry;\n}\n\nfunction flattenSpan(span: ReadableSpan, calls: Map<string, TraceCallState>) {\n const context = span.spanContext();\n const callId = span.attributes[CALL_ID];\n const call = typeof callId === 'string' ? calls.get(callId) : undefined;\n const flattened = {\n trace_id: context.traceId,\n span_id: context.spanId,\n parent_span_id: span.parentSpanContext?.spanId ?? '',\n trace_state: context.traceState?.serialize() ?? '',\n name: span.name,\n kind: `SPAN_KIND_${SpanKind[span.kind]}`,\n start_time: timestamp(span.startTime),\n end_time: timestamp(span.endTime),\n status: {\n code: `STATUS_CODE_${SpanStatusCode[span.status.code]}`,\n message: span.status.message ?? '',\n },\n resource: { attributes: span.resource.attributes },\n scope: span.instrumentationScope,\n attributes: haloAttributes(span, call),\n events: span.events.map((event) => ({\n name: event.name,\n timestamp: timestamp(event.time),\n attributes: event.attributes ?? {},\n })),\n };\n if (span.attributes[SPAN_TYPE] === 'operation' && typeof callId === 'string')\n calls.delete(callId);\n return flattened;\n}\n\nfunction haloAttributes(span: ReadableSpan, call?: TraceCallState) {\n const attributes = span.attributes;\n const kind = {\n operation: 'AGENT',\n step: 'CHAIN',\n languageModel: 'LLM',\n tool: 'TOOL',\n }[String(attributes['deepagents.span.type'])];\n return {\n ...attributes,\n 'openinference.span.kind': kind,\n ...(call?.status ? { [SPAN_STATUS]: call.status } : {}),\n };\n}\n\nfunction timestamp([seconds, nanoseconds]: HrTime): string {\n return `${new Date(seconds * 1_000).toISOString().slice(0, -5)}.${String(nanoseconds).padStart(9, '0')}Z`;\n}\n", "import {\n ATTR_GEN_AI_AGENT_NAME,\n ATTR_GEN_AI_INPUT_MESSAGES,\n ATTR_GEN_AI_OPERATION_NAME,\n ATTR_GEN_AI_OUTPUT_MESSAGES,\n ATTR_GEN_AI_REQUEST_MODEL,\n ATTR_GEN_AI_RESPONSE_FINISH_REASONS,\n ATTR_GEN_AI_TOOL_CALL_ARGUMENTS,\n ATTR_GEN_AI_TOOL_CALL_RESULT,\n ATTR_GEN_AI_TOOL_NAME,\n ATTR_GEN_AI_USAGE_INPUT_TOKENS,\n ATTR_GEN_AI_USAGE_OUTPUT_TOKENS,\n ATTR_SESSION_ID,\n ATTR_USER_ID,\n} from '@opentelemetry/semantic-conventions/incubating';\nimport { readFile } from 'node:fs/promises';\nimport { fileURLToPath } from 'node:url';\n\nimport type { StreamStatus } from '@deepagents/context';\nimport type { ConversationId } from '@deepagents/experimental/zukhruf';\n\nconst AGENT_PATH = 'deepagents.agent.path';\nconst RECORD_INPUTS = 'deepagents.record.inputs';\nconst RECORD_OUTPUTS = 'deepagents.record.outputs';\nconst SPAN_STATUS = 'deepagents.span.status';\nconst SPAN_TYPE = 'deepagents.span.type';\nconst STREAM_ID = 'deepagents.stream.id';\nconst ERROR = 'STATUS_CODE_ERROR';\n\nexport type RecordingState = 'recorded' | 'not-recorded';\n\nexport interface AgentTraceSummary {\n id: string;\n chatId: string;\n userId: string;\n streamId: string;\n agentName: string;\n agentPath: string;\n workflowName: string;\n startedAt: string | null;\n endedAt: string | null;\n /** The durable turn's status when the HTTP layer can read it, so a turn can be `queued`. */\n status: StreamStatus;\n stepCount: number;\n finishReason: string | null;\n usage: { inputTokens: number; outputTokens: number };\n recording: { inputs: RecordingState; outputs: RecordingState };\n}\n\nexport interface AgentTraceSpan {\n id: string;\n traceId: string;\n parentId: string | null;\n startedAt: string;\n endedAt: string | null;\n status: 'running' | 'completed' | 'failed' | 'cancelled';\n type: string;\n name: string;\n input?: unknown;\n output?: unknown;\n usage?: unknown;\n error?: unknown;\n data: Record<string, unknown>;\n}\n\nexport type AgentTrace = AgentTraceSummary & { spans: AgentTraceSpan[] };\n\nexport interface AgentTraceReader {\n list(conversation: ConversationId): Promise<AgentTraceSummary[]>;\n get(\n conversation: ConversationId,\n traceId: string,\n ): Promise<AgentTrace | undefined>;\n}\n\ntype SpanType = 'agent' | 'generation' | 'function';\n\ninterface FlatSpan {\n trace_id: string;\n span_id: string;\n parent_span_id: string;\n name: string;\n kind: string;\n start_time: string;\n end_time: string;\n status: { code: string; message: string };\n attributes: Record<string, unknown>;\n events: Array<{ name: string; attributes: Record<string, unknown> }>;\n}\n\nexport class FileTraceAdapter implements AgentTraceReader {\n readonly #path: string;\n\n constructor(path: URL) {\n this.#path = fileURLToPath(path);\n }\n\n async list({ chatId, userId }: ConversationId): Promise<AgentTraceSummary[]> {\n return (await this.#project())\n .filter((trace) => trace.chatId === chatId && trace.userId === userId)\n .sort((left, right) =>\n (right.startedAt ?? '').localeCompare(left.startedAt ?? ''),\n )\n .map(({ spans: _spans, ...summary }) => summary);\n }\n\n async get(\n { chatId, userId }: ConversationId,\n traceId: string,\n ): Promise<AgentTrace | undefined> {\n return (await this.#project()).find(\n (trace) =>\n trace.id === traceId &&\n trace.chatId === chatId &&\n trace.userId === userId,\n );\n }\n\n async #project(): Promise<AgentTrace[]> {\n return [\n ...Map.groupBy(await readSpans(this.#path), (span) => span.trace_id),\n ]\n .map(([traceId, spans]) => projectTrace(traceId, spans))\n .filter((trace) => trace !== undefined);\n }\n}\n\nfunction projectTrace(\n traceId: string,\n spans: FlatSpan[],\n): AgentTrace | undefined {\n const context = readContext(spans);\n if (!context) return undefined;\n const root = spans.find(\n (span) =>\n span.attributes[SPAN_TYPE] === 'operation' &&\n span.attributes[ATTR_GEN_AI_OPERATION_NAME] === 'invoke_agent',\n );\n const visible = spans\n .flatMap((span) => {\n const type = spanType(span);\n return type ? [{ span, type }] : [];\n })\n .sort((left, right) =>\n left.span.start_time.localeCompare(right.span.start_time),\n );\n const byId = new Map(spans.map((span) => [span.span_id, span]));\n const generationByStep = new Map(\n spans.flatMap((span) =>\n span.attributes[SPAN_TYPE] === 'languageModel' && span.parent_span_id\n ? [[span.parent_span_id, span.span_id]]\n : [],\n ),\n );\n const projected = visible.map(({ span, type }) =>\n projectSpan(span, type, byId, generationByStep, context.agentName),\n );\n return {\n id: traceId,\n ...context,\n workflowName: context.agentName,\n startedAt: root?.start_time ?? spans[0]?.start_time ?? null,\n endedAt: root?.end_time ?? null,\n status: root ? spanStatus(root) : 'running',\n stepCount: projected.filter(({ type }) => type === 'generation').length,\n finishReason:\n firstString(root?.attributes[ATTR_GEN_AI_RESPONSE_FINISH_REASONS]) ??\n null,\n usage:\n readUsage(root?.attributes) ?? sumUsage(visible.map(({ span }) => span)),\n recording: {\n inputs: recordingState(\n root?.attributes[RECORD_INPUTS],\n spans.some(({ attributes }) =>\n has(\n attributes,\n ATTR_GEN_AI_INPUT_MESSAGES,\n ATTR_GEN_AI_TOOL_CALL_ARGUMENTS,\n ),\n ),\n ),\n outputs: recordingState(\n root?.attributes[RECORD_OUTPUTS],\n spans.some(({ attributes }) =>\n has(\n attributes,\n ATTR_GEN_AI_OUTPUT_MESSAGES,\n ATTR_GEN_AI_TOOL_CALL_RESULT,\n ),\n ),\n ),\n },\n spans: projected,\n };\n}\n\nfunction projectSpan(\n span: FlatSpan,\n type: SpanType,\n byId: ReadonlyMap<string, FlatSpan>,\n generationByStep: ReadonlyMap<string, string>,\n agentName: string,\n): AgentTraceSpan {\n const input = jsonAttribute(\n span.attributes,\n type === 'function'\n ? ATTR_GEN_AI_TOOL_CALL_ARGUMENTS\n : ATTR_GEN_AI_INPUT_MESSAGES,\n );\n const output = jsonAttribute(\n span.attributes,\n type === 'function'\n ? ATTR_GEN_AI_TOOL_CALL_RESULT\n : ATTR_GEN_AI_OUTPUT_MESSAGES,\n );\n const usage = readUsage(span.attributes);\n const exceptions = span.events\n .filter(({ name }) => name === 'exception')\n .map(({ attributes }) => attributes);\n const error =\n span.status.code === ERROR || exceptions.length\n ? { ...span.status, exceptions }\n : undefined;\n return {\n id: span.span_id,\n traceId: span.trace_id,\n parentId: visibleParent(span, byId, generationByStep),\n startedAt: span.start_time,\n endedAt: span.end_time,\n status: spanStatus(span),\n type,\n name:\n type === 'agent'\n ? agentName\n : String(\n span.attributes[\n type === 'generation'\n ? ATTR_GEN_AI_REQUEST_MODEL\n : ATTR_GEN_AI_TOOL_NAME\n ] ?? span.name,\n ),\n ...(input === undefined ? {} : { input }),\n ...(output === undefined ? {} : { output }),\n ...(usage === undefined ? {} : { usage }),\n ...(error === undefined ? {} : { error }),\n data: {\n name: span.name,\n kind: span.kind,\n attributes: span.attributes,\n events: span.events,\n status: span.status,\n },\n };\n}\n\nfunction visibleParent(\n span: FlatSpan,\n byId: ReadonlyMap<string, FlatSpan>,\n generationByStep: ReadonlyMap<string, string>,\n): string | null {\n if (!span.parent_span_id) return null;\n const parent = byId.get(span.parent_span_id);\n if (!parent) return null;\n if (parent.attributes[SPAN_TYPE] !== 'step') return span.parent_span_id;\n return span.attributes[SPAN_TYPE] === 'tool'\n ? (generationByStep.get(parent.span_id) ?? parent.parent_span_id ?? null)\n : parent.parent_span_id || null;\n}\n\nfunction readContext(spans: FlatSpan[]) {\n for (const { attributes } of spans) {\n const chatId = attributes[ATTR_SESSION_ID];\n const userId = attributes[ATTR_USER_ID];\n const streamId = attributes[STREAM_ID];\n const agentName = attributes[ATTR_GEN_AI_AGENT_NAME];\n const agentPath = attributes[AGENT_PATH];\n if (\n typeof chatId === 'string' &&\n typeof userId === 'string' &&\n typeof streamId === 'string' &&\n typeof agentName === 'string' &&\n typeof agentPath === 'string'\n ) {\n return { chatId, userId, streamId, agentName, agentPath };\n }\n }\n return undefined;\n}\n\nfunction spanType(span: FlatSpan): SpanType | undefined {\n switch (span.attributes[SPAN_TYPE]) {\n case 'operation':\n return 'agent';\n case 'languageModel':\n return 'generation';\n case 'tool':\n return 'function';\n default:\n return undefined;\n }\n}\n\nfunction readUsage(attributes: Record<string, unknown> | undefined) {\n const inputTokens = attributes?.[ATTR_GEN_AI_USAGE_INPUT_TOKENS];\n const outputTokens = attributes?.[ATTR_GEN_AI_USAGE_OUTPUT_TOKENS];\n return typeof inputTokens === 'number' && typeof outputTokens === 'number'\n ? { inputTokens, outputTokens }\n : undefined;\n}\n\nfunction sumUsage(spans: FlatSpan[]) {\n return spans.reduce(\n (total, span) => {\n const usage = readUsage(span.attributes);\n return usage\n ? {\n inputTokens: total.inputTokens + usage.inputTokens,\n outputTokens: total.outputTokens + usage.outputTokens,\n }\n : total;\n },\n { inputTokens: 0, outputTokens: 0 },\n );\n}\n\nfunction jsonAttribute(attributes: Record<string, unknown>, key: string) {\n const value = attributes[key];\n if (typeof value !== 'string') return undefined;\n try {\n return JSON.parse(value);\n } catch {\n return value;\n }\n}\n\nfunction has(attributes: Record<string, unknown>, ...keys: string[]) {\n return keys.some((key) => Object.hasOwn(attributes, key));\n}\n\nfunction recordingState(policy: unknown, observed: boolean): RecordingState {\n return policy === true || (policy !== false && observed)\n ? 'recorded'\n : 'not-recorded';\n}\n\nfunction spanStatus(span: FlatSpan): 'completed' | 'failed' | 'cancelled' {\n if (span.attributes[SPAN_STATUS] === 'cancelled') return 'cancelled';\n return span.status.code === ERROR ? 'failed' : 'completed';\n}\n\nfunction firstString(value: unknown): string | undefined {\n return Array.isArray(value) && typeof value[0] === 'string'\n ? value[0]\n : undefined;\n}\n\nasync function readSpans(path: string): Promise<FlatSpan[]> {\n let contents: string;\n try {\n contents = await readFile(path, 'utf8');\n } catch (error) {\n if (isRecord(error) && error.code === 'ENOENT') return [];\n throw error;\n }\n const lines = contents.split('\\n');\n if (lines.at(-1) === '') lines.pop();\n return lines.flatMap((line, index) => {\n if (!line.trim()) return [];\n let span: unknown;\n try {\n span = JSON.parse(line);\n } catch (error) {\n if (index === lines.length - 1 && !contents.endsWith('\\n')) return [];\n throw error;\n }\n if (!isFlatSpan(span)) {\n throw new TypeError(`Invalid Halo trace record in \"${path}\"`);\n }\n return [span];\n });\n}\n\n/** The record `fileTelemetry()` appends for each span (see `flattenSpan`). */\nfunction isFlatSpan(value: unknown): value is FlatSpan {\n return (\n isRecord(value) &&\n typeof value.trace_id === 'string' &&\n typeof value.span_id === 'string' &&\n typeof value.parent_span_id === 'string' &&\n typeof value.name === 'string' &&\n typeof value.kind === 'string' &&\n typeof value.start_time === 'string' &&\n Number.isFinite(Date.parse(value.start_time)) &&\n typeof value.end_time === 'string' &&\n isRecord(value.status) &&\n typeof value.status.code === 'string' &&\n typeof value.status.message === 'string' &&\n isRecord(value.attributes) &&\n Array.isArray(value.events) &&\n value.events.every(\n (event) =>\n isRecord(event) &&\n typeof event.name === 'string' &&\n isRecord(event.attributes),\n )\n );\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n", "import { Hono } from 'hono';\nimport { HTTPException } from 'hono/http-exception';\n\nimport type { StreamStatus } from '@deepagents/context';\nimport type {\n AgentPluginDefinition,\n ConversationId,\n} from '@deepagents/experimental/zukhruf';\nimport {\n type HttpEnv,\n type HttpRuntime,\n projectHttp,\n} from '@deepagents/experimental/zukhruf/http';\n\nimport type {\n AgentTraceReader,\n AgentTraceSummary,\n} from './file-trace-adapter.ts';\nimport type { FileTelemetryInstance } from './index.ts';\n\nconst TRACES_PATH = '/traces';\nconst NO_STORE = { 'cache-control': 'no-store' } as const;\n\nexport function tracesHttp(\n definition: AgentPluginDefinition<FileTelemetryInstance>,\n) {\n return projectHttp(definition, (plugin, runtime) => ({\n capabilities: { traces: { path: TRACES_PATH } },\n authenticatedRoutes: traceRoutes(plugin.traces, runtime),\n }));\n}\n\nfunction traceRoutes(reader: AgentTraceReader, runtime: HttpRuntime) {\n const app = new Hono<HttpEnv>();\n app.get(`${TRACES_PATH}/:chatId`, async (context) => {\n const conversation = await requireConversation(runtime, {\n chatId: context.req.param('chatId'),\n userId: context.get('userId'),\n });\n return context.json(\n await Promise.all(\n (await reader.list(conversation)).map(async (trace) => ({\n ...trace,\n status: await durableStatus(runtime, trace),\n })),\n ),\n 200,\n NO_STORE,\n );\n });\n app.get(`${TRACES_PATH}/:chatId/:traceId`, async (context) => {\n const conversation = await requireConversation(runtime, {\n chatId: context.req.param('chatId'),\n userId: context.get('userId'),\n });\n const traceId = context.req.param('traceId');\n const trace = await reader.get(conversation, traceId);\n if (!trace) {\n throw new HTTPException(404, {\n message: 'Trace not found',\n cause: {\n code: 'traces/trace-not-found',\n detail: `Trace ${traceId} does not exist in conversation ${conversation.chatId}`,\n },\n });\n }\n return context.json(\n { ...trace, status: await durableStatus(runtime, trace) },\n 200,\n NO_STORE,\n );\n });\n return app;\n}\n\nasync function requireConversation(\n runtime: Pick<HttpRuntime, 'listHistory'>,\n conversation: ConversationId,\n): Promise<ConversationId> {\n const owned = (await runtime.listHistory(conversation.userId)).some(\n (item) =>\n item.chatId === conversation.chatId &&\n item.userId === conversation.userId,\n );\n if (owned) return conversation;\n throw new HTTPException(404, {\n message: 'Conversation not found',\n cause: {\n code: 'traces/conversation-not-found',\n detail: `Conversation ${conversation.chatId} does not exist`,\n },\n });\n}\n\n/** The durable turn's status, or the trace's own once the turn is gone. */\nasync function durableStatus(\n runtime: Pick<HttpRuntime, 'observe'>,\n trace: AgentTraceSummary,\n): Promise<StreamStatus> {\n const turn = await runtime\n .observe({ chatId: trace.chatId, userId: trace.userId })\n .status(trace.streamId);\n return turn?.status ?? trace.status;\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { OpenTelemetry } from '@ai-sdk/otel';\nimport { type HrTime, SpanKind, SpanStatusCode } from '@opentelemetry/api';\nimport { ExportResultCode } from '@opentelemetry/core';\nimport {\n BasicTracerProvider,\n type ReadableSpan,\n SimpleSpanProcessor,\n type SpanExporter,\n} from '@opentelemetry/sdk-trace-base';\nimport {\n ATTR_GEN_AI_AGENT_NAME,\n ATTR_SESSION_ID,\n ATTR_USER_ID,\n} from '@opentelemetry/semantic-conventions/incubating';\nimport { appendFileSync, mkdirSync } from 'node:fs';\nimport { dirname, resolve } from 'node:path';\nimport { pathToFileURL } from 'node:url';\n\nimport type { FileTelemetryOptions } from '@deepagents/context/telemetry/file';\nimport type {\n AgentPluginDefinition,\n AgentPluginToolContext,\n} from '@deepagents/experimental/zukhruf';\n\nimport { FileTraceAdapter } from './file-trace-adapter.ts';\nimport type { AgentTraceReader } from './file-trace-adapter.ts';\n\nexport * from './file-trace-adapter.ts';\nexport { tracesHttp } from './http.ts';\n\nconst CALL_ID = 'deepagents.call.id';\nconst RECORD_INPUTS = 'deepagents.record.inputs';\nconst RECORD_OUTPUTS = 'deepagents.record.outputs';\nconst SPAN_STATUS = 'deepagents.span.status';\nconst SPAN_TYPE = 'deepagents.span.type';\n\ninterface TraceCallState {\n recordInputs: boolean;\n recordOutputs: boolean;\n status?: 'cancelled';\n}\n\nexport interface FileTelemetryInstance {\n readonly traces: AgentTraceReader;\n}\n\n/** AI SDK OpenTelemetry spans persisted in Halo's flat JSONL format. */\nexport function fileTelemetry(\n options: FileTelemetryOptions,\n): AgentPluginDefinition<FileTelemetryInstance> {\n const path = resolve(options.path);\n return {\n name: `file-telemetry:${pathToFileURL(path).href}`,\n create: () => {\n const calls = new Map<string, TraceCallState>();\n const provider = new BasicTracerProvider({\n spanProcessors: [\n new SimpleSpanProcessor(\n fileExporter(path, calls, options.onWriteError),\n ),\n ],\n });\n return {\n traces: new FileTraceAdapter(pathToFileURL(path)),\n telemetry: (context: AgentPluginToolContext) =>\n openTelemetry(provider, context, calls),\n work: () =>\n Promise.resolve({\n [Symbol.asyncDispose]: async () => {\n await provider.shutdown();\n calls.clear();\n },\n }),\n };\n },\n };\n}\n\nfunction fileExporter(\n path: string,\n calls: Map<string, TraceCallState>,\n onWriteError?: FileTelemetryOptions['onWriteError'],\n): SpanExporter {\n let ensureDirectory = () => {\n mkdirSync(dirname(path), { recursive: true });\n ensureDirectory = () => {};\n };\n return {\n export(spans, done) {\n try {\n ensureDirectory();\n appendFileSync(\n path,\n `${spans\n .map((span) => JSON.stringify(flattenSpan(span, calls)))\n .join('\\n')}\\n`,\n );\n done({ code: ExportResultCode.SUCCESS });\n } catch (error) {\n try {\n Promise.resolve(onWriteError?.(error)).catch(() => {});\n } catch {\n // Telemetry must never affect the observed operation.\n }\n done({\n code: ExportResultCode.FAILED,\n error: error instanceof Error ? error : new Error(String(error)),\n });\n }\n },\n shutdown: () => Promise.resolve(),\n };\n}\n\nfunction openTelemetry(\n provider: BasicTracerProvider,\n context: AgentPluginToolContext,\n calls: Map<string, TraceCallState>,\n) {\n const telemetry = new OpenTelemetry({\n tracer: provider.getTracer('@deepagents/devtool/traces'),\n usage: true,\n providerMetadata: true,\n enrichSpan: ({ spanType, callId }) => {\n const call = calls.get(callId);\n return {\n [ATTR_SESSION_ID]: context.conversation.chatId,\n [ATTR_USER_ID]: context.conversation.userId,\n [ATTR_GEN_AI_AGENT_NAME]: context.agentName,\n 'deepagents.stream.id': context.streamId,\n 'deepagents.agent.path': context.agentPath,\n [CALL_ID]: callId,\n [SPAN_TYPE]: spanType,\n ...(call\n ? {\n [RECORD_INPUTS]: call.recordInputs,\n [RECORD_OUTPUTS]: call.recordOutputs,\n }\n : {}),\n };\n },\n });\n const onStart = telemetry.onStart.bind(telemetry);\n telemetry.onStart = (event) => {\n calls.set(event.callId, {\n recordInputs: event.recordInputs !== false,\n recordOutputs: event.recordOutputs !== false,\n });\n onStart(event);\n };\n const onAbort = telemetry.onAbort.bind(telemetry);\n telemetry.onAbort = (event) => {\n const call = calls.get(event.callId);\n if (call) call.status = 'cancelled';\n onAbort(event);\n };\n return telemetry;\n}\n\nfunction flattenSpan(span: ReadableSpan, calls: Map<string, TraceCallState>) {\n const context = span.spanContext();\n const callId = span.attributes[CALL_ID];\n const call = typeof callId === 'string' ? calls.get(callId) : undefined;\n const flattened = {\n trace_id: context.traceId,\n span_id: context.spanId,\n parent_span_id: span.parentSpanContext?.spanId ?? '',\n trace_state: context.traceState?.serialize() ?? '',\n name: span.name,\n kind: `SPAN_KIND_${SpanKind[span.kind]}`,\n start_time: timestamp(span.startTime),\n end_time: timestamp(span.endTime),\n status: {\n code: `STATUS_CODE_${SpanStatusCode[span.status.code]}`,\n message: span.status.message ?? '',\n },\n resource: { attributes: span.resource.attributes },\n scope: span.instrumentationScope,\n attributes: haloAttributes(span, call),\n events: span.events.map((event) => ({\n name: event.name,\n timestamp: timestamp(event.time),\n attributes: event.attributes ?? {},\n })),\n };\n if (span.attributes[SPAN_TYPE] === 'operation' && typeof callId === 'string')\n calls.delete(callId);\n return flattened;\n}\n\nfunction haloAttributes(span: ReadableSpan, call?: TraceCallState) {\n const attributes = span.attributes;\n const kind = {\n operation: 'AGENT',\n step: 'CHAIN',\n languageModel: 'LLM',\n tool: 'TOOL',\n }[String(attributes['deepagents.span.type'])];\n return {\n ...attributes,\n 'openinference.span.kind': kind,\n ...(call?.status ? { [SPAN_STATUS]: call.status } : {}),\n };\n}\n\nfunction timestamp([seconds, nanoseconds]: HrTime): string {\n return `${new Date(seconds * 1_000).toISOString().slice(0, -5)}.${String(nanoseconds).padStart(9, '0')}Z`;\n}\n", "import {\n ATTR_GEN_AI_AGENT_NAME,\n ATTR_GEN_AI_INPUT_MESSAGES,\n ATTR_GEN_AI_OPERATION_NAME,\n ATTR_GEN_AI_OUTPUT_MESSAGES,\n ATTR_GEN_AI_REQUEST_MODEL,\n ATTR_GEN_AI_RESPONSE_FINISH_REASONS,\n ATTR_GEN_AI_TOOL_CALL_ARGUMENTS,\n ATTR_GEN_AI_TOOL_CALL_RESULT,\n ATTR_GEN_AI_TOOL_NAME,\n ATTR_GEN_AI_USAGE_INPUT_TOKENS,\n ATTR_GEN_AI_USAGE_OUTPUT_TOKENS,\n ATTR_SESSION_ID,\n ATTR_USER_ID,\n} from '@opentelemetry/semantic-conventions/incubating';\nimport { readFile } from 'node:fs/promises';\nimport { fileURLToPath } from 'node:url';\n\nimport type { StreamStatus } from '@deepagents/context';\nimport type { ConversationId } from '@deepagents/experimental/zukhruf';\n\nconst AGENT_PATH = 'deepagents.agent.path';\nconst RECORD_INPUTS = 'deepagents.record.inputs';\nconst RECORD_OUTPUTS = 'deepagents.record.outputs';\nconst SPAN_STATUS = 'deepagents.span.status';\nconst SPAN_TYPE = 'deepagents.span.type';\nconst STREAM_ID = 'deepagents.stream.id';\nconst ERROR = 'STATUS_CODE_ERROR';\n\nexport type RecordingState = 'recorded' | 'not-recorded';\n\nexport interface AgentTraceSummary {\n id: string;\n chatId: string;\n userId: string;\n streamId: string;\n agentName: string;\n agentPath: string;\n workflowName: string;\n startedAt: string | null;\n endedAt: string | null;\n /** The durable turn's status when the HTTP layer can read it, so a turn can be `queued`. */\n status: StreamStatus;\n stepCount: number;\n finishReason: string | null;\n usage: { inputTokens: number; outputTokens: number };\n recording: { inputs: RecordingState; outputs: RecordingState };\n}\n\nexport interface AgentTraceSpan {\n id: string;\n traceId: string;\n parentId: string | null;\n startedAt: string;\n endedAt: string | null;\n status: 'running' | 'completed' | 'failed' | 'cancelled';\n type: string;\n name: string;\n input?: unknown;\n output?: unknown;\n usage?: unknown;\n error?: unknown;\n data: Record<string, unknown>;\n}\n\nexport type AgentTrace = AgentTraceSummary & { spans: AgentTraceSpan[] };\n\nexport interface AgentTraceReader {\n list(conversation: ConversationId): Promise<AgentTraceSummary[]>;\n get(\n conversation: ConversationId,\n traceId: string,\n ): Promise<AgentTrace | undefined>;\n}\n\ntype SpanType = 'agent' | 'generation' | 'function';\n\ninterface FlatSpan {\n trace_id: string;\n span_id: string;\n parent_span_id: string;\n name: string;\n kind: string;\n start_time: string;\n end_time: string;\n status: { code: string; message: string };\n attributes: Record<string, unknown>;\n events: Array<{ name: string; attributes: Record<string, unknown> }>;\n}\n\nexport class FileTraceAdapter implements AgentTraceReader {\n readonly #path: string;\n\n constructor(path: URL) {\n this.#path = fileURLToPath(path);\n }\n\n async list({ chatId, userId }: ConversationId): Promise<AgentTraceSummary[]> {\n return (await this.#project())\n .filter((trace) => trace.chatId === chatId && trace.userId === userId)\n .sort((left, right) =>\n (right.startedAt ?? '').localeCompare(left.startedAt ?? ''),\n )\n .map(({ spans: _spans, ...summary }) => summary);\n }\n\n async get(\n { chatId, userId }: ConversationId,\n traceId: string,\n ): Promise<AgentTrace | undefined> {\n return (await this.#project()).find(\n (trace) =>\n trace.id === traceId &&\n trace.chatId === chatId &&\n trace.userId === userId,\n );\n }\n\n async #project(): Promise<AgentTrace[]> {\n return [\n ...Map.groupBy(await readSpans(this.#path), (span) => span.trace_id),\n ]\n .map(([traceId, spans]) => projectTrace(traceId, spans))\n .filter((trace) => trace !== undefined);\n }\n}\n\nfunction projectTrace(\n traceId: string,\n spans: FlatSpan[],\n): AgentTrace | undefined {\n const context = readContext(spans);\n if (!context) return undefined;\n const root = spans.find(\n (span) =>\n span.attributes[SPAN_TYPE] === 'operation' &&\n span.attributes[ATTR_GEN_AI_OPERATION_NAME] === 'invoke_agent',\n );\n const visible = spans\n .flatMap((span) => {\n const type = spanType(span);\n return type ? [{ span, type }] : [];\n })\n .sort((left, right) =>\n left.span.start_time.localeCompare(right.span.start_time),\n );\n const byId = new Map(spans.map((span) => [span.span_id, span]));\n const generationByStep = new Map(\n spans.flatMap((span) =>\n span.attributes[SPAN_TYPE] === 'languageModel' && span.parent_span_id\n ? [[span.parent_span_id, span.span_id]]\n : [],\n ),\n );\n const projected = visible.map(({ span, type }) =>\n projectSpan(span, type, byId, generationByStep, context.agentName),\n );\n return {\n id: traceId,\n ...context,\n workflowName: context.agentName,\n startedAt: root?.start_time ?? spans[0]?.start_time ?? null,\n endedAt: root?.end_time ?? null,\n status: root ? spanStatus(root) : 'running',\n stepCount: projected.filter(({ type }) => type === 'generation').length,\n finishReason:\n firstString(root?.attributes[ATTR_GEN_AI_RESPONSE_FINISH_REASONS]) ??\n null,\n usage:\n readUsage(root?.attributes) ?? sumUsage(visible.map(({ span }) => span)),\n recording: {\n inputs: recordingState(\n root?.attributes[RECORD_INPUTS],\n spans.some(({ attributes }) =>\n has(\n attributes,\n ATTR_GEN_AI_INPUT_MESSAGES,\n ATTR_GEN_AI_TOOL_CALL_ARGUMENTS,\n ),\n ),\n ),\n outputs: recordingState(\n root?.attributes[RECORD_OUTPUTS],\n spans.some(({ attributes }) =>\n has(\n attributes,\n ATTR_GEN_AI_OUTPUT_MESSAGES,\n ATTR_GEN_AI_TOOL_CALL_RESULT,\n ),\n ),\n ),\n },\n spans: projected,\n };\n}\n\nfunction projectSpan(\n span: FlatSpan,\n type: SpanType,\n byId: ReadonlyMap<string, FlatSpan>,\n generationByStep: ReadonlyMap<string, string>,\n agentName: string,\n): AgentTraceSpan {\n const input = jsonAttribute(\n span.attributes,\n type === 'function'\n ? ATTR_GEN_AI_TOOL_CALL_ARGUMENTS\n : ATTR_GEN_AI_INPUT_MESSAGES,\n );\n const output = jsonAttribute(\n span.attributes,\n type === 'function'\n ? ATTR_GEN_AI_TOOL_CALL_RESULT\n : ATTR_GEN_AI_OUTPUT_MESSAGES,\n );\n const usage = readUsage(span.attributes);\n const exceptions = span.events\n .filter(({ name }) => name === 'exception')\n .map(({ attributes }) => attributes);\n const error =\n span.status.code === ERROR || exceptions.length\n ? { ...span.status, exceptions }\n : undefined;\n return {\n id: span.span_id,\n traceId: span.trace_id,\n parentId: visibleParent(span, byId, generationByStep),\n startedAt: span.start_time,\n endedAt: span.end_time,\n status: spanStatus(span),\n type,\n name:\n type === 'agent'\n ? agentName\n : String(\n span.attributes[\n type === 'generation'\n ? ATTR_GEN_AI_REQUEST_MODEL\n : ATTR_GEN_AI_TOOL_NAME\n ] ?? span.name,\n ),\n ...(input === undefined ? {} : { input }),\n ...(output === undefined ? {} : { output }),\n ...(usage === undefined ? {} : { usage }),\n ...(error === undefined ? {} : { error }),\n data: {\n name: span.name,\n kind: span.kind,\n attributes: span.attributes,\n events: span.events,\n status: span.status,\n },\n };\n}\n\nfunction visibleParent(\n span: FlatSpan,\n byId: ReadonlyMap<string, FlatSpan>,\n generationByStep: ReadonlyMap<string, string>,\n): string | null {\n if (!span.parent_span_id) return null;\n const parent = byId.get(span.parent_span_id);\n if (!parent) return null;\n if (parent.attributes[SPAN_TYPE] !== 'step') return span.parent_span_id;\n return span.attributes[SPAN_TYPE] === 'tool'\n ? (generationByStep.get(parent.span_id) ?? parent.parent_span_id ?? null)\n : parent.parent_span_id || null;\n}\n\nfunction readContext(spans: FlatSpan[]) {\n for (const { attributes } of spans) {\n const chatId = attributes[ATTR_SESSION_ID];\n const userId = attributes[ATTR_USER_ID];\n const streamId = attributes[STREAM_ID];\n const agentName = attributes[ATTR_GEN_AI_AGENT_NAME];\n const agentPath = attributes[AGENT_PATH];\n if (\n typeof chatId === 'string' &&\n typeof userId === 'string' &&\n typeof streamId === 'string' &&\n typeof agentName === 'string' &&\n typeof agentPath === 'string'\n ) {\n return { chatId, userId, streamId, agentName, agentPath };\n }\n }\n return undefined;\n}\n\nfunction spanType(span: FlatSpan): SpanType | undefined {\n switch (span.attributes[SPAN_TYPE]) {\n case 'operation':\n return 'agent';\n case 'languageModel':\n return 'generation';\n case 'tool':\n return 'function';\n default:\n return undefined;\n }\n}\n\nfunction readUsage(attributes: Record<string, unknown> | undefined) {\n const inputTokens = attributes?.[ATTR_GEN_AI_USAGE_INPUT_TOKENS];\n const outputTokens = attributes?.[ATTR_GEN_AI_USAGE_OUTPUT_TOKENS];\n return typeof inputTokens === 'number' && typeof outputTokens === 'number'\n ? { inputTokens, outputTokens }\n : undefined;\n}\n\nfunction sumUsage(spans: FlatSpan[]) {\n return spans.reduce(\n (total, span) => {\n const usage = readUsage(span.attributes);\n return usage\n ? {\n inputTokens: total.inputTokens + usage.inputTokens,\n outputTokens: total.outputTokens + usage.outputTokens,\n }\n : total;\n },\n { inputTokens: 0, outputTokens: 0 },\n );\n}\n\nfunction jsonAttribute(attributes: Record<string, unknown>, key: string) {\n const value = attributes[key];\n if (typeof value !== 'string') return undefined;\n try {\n return JSON.parse(value);\n } catch {\n return value;\n }\n}\n\nfunction has(attributes: Record<string, unknown>, ...keys: string[]) {\n return keys.some((key) => Object.hasOwn(attributes, key));\n}\n\nfunction recordingState(policy: unknown, observed: boolean): RecordingState {\n return policy === true || (policy !== false && observed)\n ? 'recorded'\n : 'not-recorded';\n}\n\nfunction spanStatus(span: FlatSpan): 'completed' | 'failed' | 'cancelled' {\n if (span.attributes[SPAN_STATUS] === 'cancelled') return 'cancelled';\n return span.status.code === ERROR ? 'failed' : 'completed';\n}\n\nfunction firstString(value: unknown): string | undefined {\n return Array.isArray(value) && typeof value[0] === 'string'\n ? value[0]\n : undefined;\n}\n\nasync function readSpans(path: string): Promise<FlatSpan[]> {\n let contents: string;\n try {\n contents = await readFile(path, 'utf8');\n } catch (error) {\n if (isRecord(error) && error.code === 'ENOENT') return [];\n throw error;\n }\n const lines = contents.split('\\n');\n if (lines.at(-1) === '') lines.pop();\n return lines.flatMap((line, index) => {\n if (!line.trim()) return [];\n let span: unknown;\n try {\n span = JSON.parse(line);\n } catch (error) {\n if (index === lines.length - 1 && !contents.endsWith('\\n')) return [];\n throw error;\n }\n if (!isFlatSpan(span)) {\n throw new TypeError(`Invalid Halo trace record in \"${path}\"`);\n }\n return [span];\n });\n}\n\n/** The record `fileTelemetry()` appends for each span (see `flattenSpan`). */\nfunction isFlatSpan(value: unknown): value is FlatSpan {\n return (\n isRecord(value) &&\n typeof value.trace_id === 'string' &&\n typeof value.span_id === 'string' &&\n typeof value.parent_span_id === 'string' &&\n typeof value.name === 'string' &&\n typeof value.kind === 'string' &&\n typeof value.start_time === 'string' &&\n Number.isFinite(Date.parse(value.start_time)) &&\n typeof value.end_time === 'string' &&\n isRecord(value.status) &&\n typeof value.status.code === 'string' &&\n typeof value.status.message === 'string' &&\n isRecord(value.attributes) &&\n Array.isArray(value.events) &&\n value.events.every(\n (event) =>\n isRecord(event) &&\n typeof event.name === 'string' &&\n isRecord(event.attributes),\n )\n );\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n", "import { Hono } from 'hono';\nimport { HTTPException } from 'hono/http-exception';\n\nimport type { StreamStatus } from '@deepagents/context';\nimport type {\n AgentPluginDefinition,\n ConversationId,\n} from '@deepagents/experimental/zukhruf';\nimport {\n type HttpEnv,\n type HttpRuntime,\n projectHttp,\n} from '@deepagents/experimental/zukhruf/http';\n\nimport type {\n AgentTraceReader,\n AgentTraceSummary,\n} from './file-trace-adapter.ts';\nimport type { FileTelemetryInstance } from './index.ts';\n\nconst TRACES_PATH = '/traces';\nconst NO_STORE = { 'cache-control': 'no-store' } as const;\n\nexport function tracesHttp(\n definition: AgentPluginDefinition<FileTelemetryInstance>,\n) {\n return projectHttp(definition, (plugin, runtime) => ({\n capabilities: { traces: { path: TRACES_PATH } },\n authenticatedRoutes: traceRoutes(plugin.traces, runtime),\n }));\n}\n\nfunction traceRoutes(reader: AgentTraceReader, runtime: HttpRuntime) {\n const app = new Hono<HttpEnv>();\n app.get(`${TRACES_PATH}/:chatId`, async (context) => {\n const conversation = await requireConversation(runtime, {\n chatId: context.req.param('chatId'),\n userId: context.get('userId'),\n });\n return context.json(\n await Promise.all(\n (await reader.list(conversation)).map(async (trace) => ({\n ...trace,\n status: await durableStatus(runtime, trace),\n })),\n ),\n 200,\n NO_STORE,\n );\n });\n app.get(`${TRACES_PATH}/:chatId/:traceId`, async (context) => {\n const conversation = await requireConversation(runtime, {\n chatId: context.req.param('chatId'),\n userId: context.get('userId'),\n });\n const traceId = context.req.param('traceId');\n const trace = await reader.get(conversation, traceId);\n if (!trace) {\n throw new HTTPException(404, {\n message: 'Trace not found',\n cause: {\n code: 'traces/trace-not-found',\n detail: `Trace ${traceId} does not exist in conversation ${conversation.chatId}`,\n },\n });\n }\n return context.json(\n { ...trace, status: await durableStatus(runtime, trace) },\n 200,\n NO_STORE,\n );\n });\n return app;\n}\n\nasync function requireConversation(\n runtime: Pick<HttpRuntime, 'listHistory'>,\n conversation: ConversationId,\n): Promise<ConversationId> {\n const owned = (await runtime.listHistory(conversation.userId)).some(\n (item) =>\n item.chatId === conversation.chatId &&\n item.userId === conversation.userId,\n );\n if (owned) return conversation;\n throw new HTTPException(404, {\n message: 'Conversation not found',\n cause: {\n code: 'traces/conversation-not-found',\n detail: `Conversation ${conversation.chatId} does not exist`,\n },\n });\n}\n\n/** The durable turn's status, or the trace's own once the turn is gone. */\nasync function durableStatus(\n runtime: Pick<HttpRuntime, 'observe'>,\n trace: AgentTraceSummary,\n): Promise<StreamStatus> {\n const turn = await runtime\n .observe({ chatId: trace.chatId, userId: trace.userId })\n .status(trace.streamId);\n return turn?.status ?? trace.status;\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["ATTR_GEN_AI_AGENT_NAME", "ATTR_SESSION_ID", "ATTR_USER_ID", "RECORD_INPUTS", "RECORD_OUTPUTS", "SPAN_STATUS", "SPAN_TYPE", "spanType", "ATTR_SESSION_ID", "ATTR_USER_ID", "ATTR_GEN_AI_AGENT_NAME"]
7
7
  }