{"version":3,"sources":["../src/errors.ts","../src/primitives.ts","../src/agent-loop.ts","../src/rag.ts","../src/controller-helpers.ts","../src/controller.ts","../src/memory.ts","../src/types/tool.ts","../src/budget.ts","../src/progressive.ts","../src/virtualized-memory.ts","../src/types/content.ts"],"names":["DOCS_BASE","formatError","code","message","hint","docsUrl","lines","AgentsKitError","options","AdapterError","ToolError","MemoryError","ConfigError","RuntimeError","SandboxError","SkillError","ErrorCodes","nextId","generateId","prefix","createEventEmitter","observers","observer","event","result","buildMessage","params","isAsyncIterable","value","serializeToolResult","executeToolCall","tool","args","context","onPartialResult","raw","accumulated","chunk","safeParseArgs","parsed","lifecycleStates","retirementPromise","state","resolve","scheduleLifecycleDisposal","names","name","createToolLifecycle","tools","lifecycle","pending","initialization","completion","acquireToolLifecycle","released","consumeStream","source","handlers","accumulatedText","accumulatedReasoning","iterator","error","detail","err","buildToolMap","sources","map","activateSkills","skills","prompt","prompts","s","system","skill","a","auth","fn","call","m","executeSafeTool","toolCall","emitter","onPartial","onConfirm","validate","authorize","began","v","releaseLifecycle","scoreDocument","document","query","haystack","tokens","score","token","createStaticRetriever","config","documents","limit","request","b","formatRetrievedDocuments","index","normalizeLlmUsage","usage","promptTokens","completionTokens","accumulateUsage","current","total","mapMessageById","messages","messageId","updater","mapToolCallById","toolCallId","patch","sameToolLifecycle","previous","next","replacement","buildToolContinuation","assistantId","calls","buildMsg","results","nextA","buildAdapterRequest","text","systemPrompt","withSystem","mergeSystemMessages","retrievedDocuments","retrievalMessage","buildRetrievalMessage","documentsText","createChatController","initial","gen","listeners","toolMap","skillTools","hydrated","active","saving","queued","decision","rebuild","nextToolMap","previousLifecycle","activate","emit","listener","set","persist","memory","hydrate","loaded","setMsg","aid","patchCall","tid","runTool","handleCall","g","outcome","partial","run","q","first","turnUsage","content","normalized","finalize","done","continueTools","nextAssistantId","resume","id","remaining","waits","start","controller","user","assistant","stopped","last","lastUser","prior","rep","newContent","opts","target","regenerate","truncated","idx","ui","p","n","msg","tc","c","reason","nextConfig","serializeMessages","deserializeMessages","record","createInMemoryMemory","initialMessages","nextMessages","createLocalStorageMemory","key","defineTool","approximateCounter","perMessage","countTools","counter","t","toNumber","compileBudget","input","strategy","keepRecent","reserved","effectiveBudget","systemMsg","systemTokens","toolTokens","floor","working","dropped","messageTokens","msgs","summary","createProgressiveArgParser","buffer","events","started","finished","pos","skipWs","scanString","i","ch","scanBalanced","open","close","depth","inStr","esc","scanPrimitive","readValue","end","tryConsume","out","keyEnd","keyRaw","savedPos","scanned","ev","tail","executeToolProgressively","chunks","parser","trigger","useFirst","startResolve","startArgs","res","finalArgs","handle","consume","execution","consumer","argsAtStart","execPromise","createVirtualizedMemory","backing","maxActive","maxRetrieved","splitHotCold","all","hot","cold","retrieved","seen","interleaved","mergeByCreatedAt","visible","visibleIds","coldKept","x","y","textPart","imagePart","audioPart","videoPart","filePart","partsToText","parts","normalizeContent","filterParts","kind"],"mappings":"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","file":"index.cjs","sourcesContent":["// ---------------------------------------------------------------------------\n// AgentsKit didactic error system — Rust-compiler-style helpful errors\n// ---------------------------------------------------------------------------\n\nconst DOCS_BASE = 'https://www.agentskit.io/docs'\n\n/**\n * Format an error for display, Rust-compiler style.\n *\n * Example output:\n * ```\n * error[AK_ADAPTER_MISSING]: No adapter provided\n *   --> Hint: Pass an adapter when creating the chat controller, e.g.\n *             createChatController({ adapter: openai({ apiKey, model: 'gpt-4o' }) })\n *   --> Docs: https://www.agentskit.io/docs/data/providers\n * ```\n */\nfunction formatError(code: string, message: string, hint?: string, docsUrl?: string): string {\n  const lines: string[] = [`error[${code}]: ${message}`]\n  if (hint) lines.push(`  --> Hint: ${hint}`)\n  if (docsUrl) lines.push(`  --> Docs: ${docsUrl}`)\n  return lines.join('\\n')\n}\n\n// ---------------------------------------------------------------------------\n// Base class\n// ---------------------------------------------------------------------------\n\nexport class AgentsKitError extends Error {\n  readonly code: string\n  readonly hint: string | undefined\n  readonly docsUrl: string | undefined\n  readonly cause: unknown\n\n  constructor(options: {\n    code: string\n    message: string\n    hint?: string\n    docsUrl?: string\n    cause?: unknown\n  }) {\n    super(options.message)\n    this.name = 'AgentsKitError'\n    this.code = options.code\n    this.hint = options.hint\n    this.docsUrl = options.docsUrl\n    this.cause = options.cause\n  }\n\n  override toString(): string {\n    return formatError(this.code, this.message, this.hint, this.docsUrl)\n  }\n}\n\n// ---------------------------------------------------------------------------\n// Subclasses\n// ---------------------------------------------------------------------------\n\nexport class AdapterError extends AgentsKitError {\n  constructor(options: {\n    code: string\n    message: string\n    hint?: string\n    docsUrl?: string\n    cause?: unknown\n  }) {\n    super({ docsUrl: `${DOCS_BASE}/data/providers`, ...options })\n    this.name = 'AdapterError'\n  }\n}\n\nexport class ToolError extends AgentsKitError {\n  constructor(options: {\n    code: string\n    message: string\n    hint?: string\n    docsUrl?: string\n    cause?: unknown\n  }) {\n    super({ docsUrl: `${DOCS_BASE}/agents/tools`, ...options })\n    this.name = 'ToolError'\n  }\n}\n\nexport class MemoryError extends AgentsKitError {\n  constructor(options: {\n    code: string\n    message: string\n    hint?: string\n    docsUrl?: string\n    cause?: unknown\n  }) {\n    super({ docsUrl: `${DOCS_BASE}/data/memory`, ...options })\n    this.name = 'MemoryError'\n  }\n}\n\nexport class ConfigError extends AgentsKitError {\n  constructor(options: {\n    code: string\n    message: string\n    hint?: string\n    docsUrl?: string\n    cause?: unknown\n  }) {\n    super({ docsUrl: `${DOCS_BASE}/get-started/concepts/errors`, ...options })\n    this.name = 'ConfigError'\n  }\n}\n\nexport class RuntimeError extends AgentsKitError {\n  constructor(options: {\n    code: string\n    message: string\n    hint?: string\n    docsUrl?: string\n    cause?: unknown\n  }) {\n    super({ docsUrl: `${DOCS_BASE}/agents/runtime`, ...options })\n    this.name = 'RuntimeError'\n  }\n}\n\nexport class SandboxError extends AgentsKitError {\n  constructor(options: {\n    code: string\n    message: string\n    hint?: string\n    docsUrl?: string\n    cause?: unknown\n  }) {\n    super({ docsUrl: `${DOCS_BASE}/production/security/mandatory-sandbox`, ...options })\n    this.name = 'SandboxError'\n  }\n}\n\nexport class SkillError extends AgentsKitError {\n  constructor(options: {\n    code: string\n    message: string\n    hint?: string\n    docsUrl?: string\n    cause?: unknown\n  }) {\n    super({ docsUrl: `${DOCS_BASE}/agents/skills`, ...options })\n    this.name = 'SkillError'\n  }\n}\n\n// ---------------------------------------------------------------------------\n// Error code constants\n// ---------------------------------------------------------------------------\n\nexport const ErrorCodes = {\n  // Adapter errors\n  AK_ADAPTER_MISSING: 'AK_ADAPTER_MISSING',\n  AK_ADAPTER_STREAM_FAILED: 'AK_ADAPTER_STREAM_FAILED',\n\n  // Tool errors\n  AK_TOOL_NOT_FOUND: 'AK_TOOL_NOT_FOUND',\n  AK_TOOL_EXEC_FAILED: 'AK_TOOL_EXEC_FAILED',\n  AK_TOOL_PEER_MISSING: 'AK_TOOL_PEER_MISSING',\n  AK_TOOL_INVALID_INPUT: 'AK_TOOL_INVALID_INPUT',\n  AK_TOOL_QUOTA_EXCEEDED: 'AK_TOOL_QUOTA_EXCEEDED',\n  AK_TOOL_FORBIDDEN: 'AK_TOOL_FORBIDDEN',\n\n  // Memory errors\n  AK_MEMORY_LOAD_FAILED: 'AK_MEMORY_LOAD_FAILED',\n  AK_MEMORY_SAVE_FAILED: 'AK_MEMORY_SAVE_FAILED',\n  AK_MEMORY_DESERIALIZE_FAILED: 'AK_MEMORY_DESERIALIZE_FAILED',\n  AK_MEMORY_PEER_MISSING: 'AK_MEMORY_PEER_MISSING',\n  AK_MEMORY_REMOTE_HTTP: 'AK_MEMORY_REMOTE_HTTP',\n\n  // Config errors\n  AK_CONFIG_INVALID: 'AK_CONFIG_INVALID',\n\n  // Runtime errors\n  AK_RUNTIME_INVALID_INPUT: 'AK_RUNTIME_INVALID_INPUT',\n  AK_RUNTIME_STEP_FAILED: 'AK_RUNTIME_STEP_FAILED',\n  AK_RUNTIME_DELEGATE_FAILED: 'AK_RUNTIME_DELEGATE_FAILED',\n\n  // Sandbox errors\n  AK_SANDBOX_DENIED: 'AK_SANDBOX_DENIED',\n  AK_SANDBOX_INVALID_TOOL: 'AK_SANDBOX_INVALID_TOOL',\n  AK_SANDBOX_PEER_MISSING: 'AK_SANDBOX_PEER_MISSING',\n  AK_SANDBOX_BACKEND_FAILED: 'AK_SANDBOX_BACKEND_FAILED',\n\n  // Skill errors\n  AK_SKILL_INVALID: 'AK_SKILL_INVALID',\n  AK_SKILL_DUPLICATE: 'AK_SKILL_DUPLICATE',\n} as const\n","import { AdapterError, AgentsKitError, ErrorCodes } from './errors'\nimport type {\n  AgentEvent,\n  Message,\n  MessageRole,\n  MessageStatus,\n  Observer,\n  StreamChunk,\n  StreamSource,\n  ToolDefinition,\n  ToolExecutionContext,\n} from './types'\nimport type { TokenUsage } from './types/stream'\n\nlet nextId = 0\n\nexport function generateId(prefix: string): string {\n  return `${prefix}-${Date.now()}-${nextId++}`\n}\n\nexport function createEventEmitter() {\n  const observers = new Set<Observer>()\n\n  return {\n    addObserver(observer: Observer): () => void {\n      observers.add(observer)\n      return () => { observers.delete(observer) }\n    },\n    emit(event: AgentEvent): void {\n      for (const observer of observers) {\n        try {\n          const result = observer.on(event)\n          if (result && typeof (result as Promise<void>).catch === 'function') {\n            (result as Promise<void>).catch(() => {})\n          }\n        } catch {\n          // Observer errors must never break the main loop.\n        }\n      }\n    },\n  }\n}\n\nexport function buildMessage(params: {\n  role: MessageRole\n  content: string\n  status?: MessageStatus\n  metadata?: Record<string, unknown>\n  toolCallId?: string\n}): Message {\n  return {\n    id: generateId('msg'),\n    role: params.role,\n    content: params.content,\n    status: params.status ?? 'complete',\n    metadata: params.metadata,\n    toolCallId: params.toolCallId,\n    createdAt: new Date(),\n  }\n}\n\nfunction isAsyncIterable(value: unknown): value is AsyncIterable<unknown> {\n  return value != null && typeof value === 'object' && Symbol.asyncIterator in value\n}\n\nfunction serializeToolResult(result: unknown): string {\n  if (result == null) return ''\n  if (typeof result === 'string' || result instanceof Error) return String(result)\n\n  try {\n    return JSON.stringify(result) ?? String(result)\n  } catch {\n    return String(result)\n  }\n}\n\nexport async function executeToolCall(\n  tool: ToolDefinition,\n  args: Record<string, unknown>,\n  context: ToolExecutionContext,\n  onPartialResult?: (accumulated: string) => void,\n): Promise<string> {\n  const raw = tool.execute?.(args, context)\n\n  if (isAsyncIterable(raw)) {\n    let accumulated = ''\n    for await (const chunk of raw) {\n      accumulated += String(chunk)\n      onPartialResult?.(accumulated)\n    }\n    return accumulated\n  }\n\n  const result = await raw\n  return serializeToolResult(result)\n}\n\nexport function safeParseArgs(args: string): Record<string, unknown> {\n  try {\n    const parsed = JSON.parse(args)\n    return parsed && typeof parsed === 'object' ? (parsed as Record<string, unknown>) : {}\n  } catch {\n    return {}\n  }\n}\n\ninterface ToolLifecycleState {\n  initialized: Set<string>\n  initializing: Map<string, Promise<void>>\n  activeExecutions: number\n  retired: boolean\n  disposal: Promise<void> | undefined\n  retirement: Promise<void> | undefined\n  resolveRetirement: (() => void) | undefined\n  tools: Map<string, ToolDefinition>\n}\n\nconst lifecycleStates = new WeakMap<object, ToolLifecycleState>()\n\nfunction retirementPromise(state: ToolLifecycleState): Promise<void> {\n  if (!state.retirement) {\n    state.retirement = new Promise<void>(resolve => {\n      state.resolveRetirement = resolve\n    })\n  }\n  return state.retirement\n}\n\nfunction scheduleLifecycleDisposal(state: ToolLifecycleState): void {\n  if (\n    !state.retired\n    || state.activeExecutions > 0\n    || state.initializing.size > 0\n    || state.disposal\n  ) return\n\n  state.disposal = (async () => {\n    const names = [...state.initialized]\n    state.initialized.clear()\n    for (const name of names) {\n      try {\n        await state.tools.get(name)?.dispose?.()\n      } catch {\n        // Dispose errors should not propagate.\n      }\n    }\n  })().finally(() => {\n    state.disposal = undefined\n    state.resolveRetirement?.()\n    state.resolveRetirement = undefined\n  })\n}\n\nexport function createToolLifecycle(tools: Map<string, ToolDefinition>) {\n  const state: ToolLifecycleState = {\n    initialized: new Set<string>(),\n    initializing: new Map<string, Promise<void>>(),\n    activeExecutions: 0,\n    retired: false,\n    disposal: undefined,\n    retirement: undefined,\n    resolveRetirement: undefined,\n    tools,\n  }\n\n  const lifecycle = {\n    async init(tool: ToolDefinition): Promise<void> {\n      // A retired lifecycle cannot start new work. An execution that acquired\n      // it before retirement may still finish initialization safely.\n      if (state.retired && state.activeExecutions === 0) return\n      if (!tool.init || state.initialized.has(tool.name)) return\n\n      const pending = state.initializing.get(tool.name)\n      if (pending) {\n        await pending\n        return\n      }\n\n      const initialization = (async () => {\n        await tool.init?.()\n        state.initialized.add(tool.name)\n      })()\n      state.initializing.set(tool.name, initialization)\n      try {\n        await initialization\n      } finally {\n        state.initializing.delete(tool.name)\n        scheduleLifecycleDisposal(state)\n      }\n    },\n    async disposeAll(): Promise<void> {\n      state.retired = true\n      const completion = retirementPromise(state)\n      scheduleLifecycleDisposal(state)\n      await completion\n    },\n  }\n\n  lifecycleStates.set(lifecycle, state)\n  return lifecycle\n}\n\n/** Hold a lifecycle open for one tool execution without changing its public shape. */\nexport function acquireToolLifecycle(\n  lifecycle: ReturnType<typeof createToolLifecycle>,\n): (() => Promise<void>) | undefined {\n  const state = lifecycleStates.get(lifecycle)\n  if (!state || state.retired) return undefined\n\n  state.activeExecutions++\n  let released = false\n  return async () => {\n    if (released) return\n    released = true\n    state.activeExecutions--\n    scheduleLifecycleDisposal(state)\n    if (state.retirement) await state.retirement\n  }\n}\n\nexport interface ConsumeStreamHandlers {\n  onText?: (accumulated: string) => void\n  onReasoning?: (accumulated: string) => void\n  onToolCall?: (chunk: StreamChunk) => Promise<void> | void\n  onToolResult?: (content: string) => void\n  onUsage?: (usage: TokenUsage) => void\n  onError?: (error: Error) => void\n  onDone: (accumulatedText: string) => void\n}\n\nexport async function consumeStream(\n  source: StreamSource,\n  handlers: ConsumeStreamHandlers,\n): Promise<void> {\n  let accumulatedText = ''\n  let accumulatedReasoning = ''\n\n  try {\n    const iterator = source.stream()\n    for await (const chunk of iterator) {\n      if (chunk.type === 'text' && chunk.content) {\n        accumulatedText += chunk.content\n        handlers.onText?.(accumulatedText)\n      } else if (chunk.type === 'reasoning' && chunk.content) {\n        accumulatedReasoning += chunk.content\n        handlers.onReasoning?.(accumulatedReasoning)\n      } else if (chunk.type === 'tool_call') {\n        await handlers.onToolCall?.(chunk)\n      } else if (chunk.type === 'tool_result' && chunk.content) {\n        handlers.onToolResult?.(chunk.content)\n      } else if (chunk.type === 'usage' && chunk.usage) {\n        handlers.onUsage?.(chunk.usage)\n      } else if (chunk.type === 'error') {\n        handlers.onError?.(new AdapterError({\n          code: ErrorCodes.AK_ADAPTER_STREAM_FAILED,\n          message: chunk.content ?? 'Stream error',\n          hint: 'Key/network/model/provider',\n        }))\n        return\n      } else if (chunk.type === 'done') {\n        break\n      }\n    }\n    handlers.onDone(accumulatedText)\n  } catch (error) {\n    const detail = error instanceof Error ? error.message : String(error)\n    const err = error instanceof AgentsKitError\n      ? error\n      : new AdapterError({\n          code: ErrorCodes.AK_ADAPTER_STREAM_FAILED,\n          message: `Stream failed: ${detail}`,\n          hint: 'Adapter/provider',\n          cause: error,\n        })\n    handlers.onError?.(err)\n  }\n}\n","import { ToolError, ErrorCodes } from './errors'\nimport { acquireToolLifecycle, executeToolCall, createToolLifecycle, createEventEmitter } from './primitives'\nimport type {\n  ArgsValidator,\n  MaybePromise,\n  SkillDefinition,\n  ToolCall,\n  ToolAuthorizationContext,\n  ToolAuthorizer,\n  ToolDefinition,\n  ToolExecutionContext,\n} from './types'\n\n// --- buildToolMap ---\n\nexport function buildToolMap(\n  ...sources: Array<ToolDefinition[] | undefined>\n): Map<string, ToolDefinition> {\n  const map = new Map<string, ToolDefinition>()\n  for (const source of sources) {\n    if (!source) continue\n    for (const tool of source) map.set(tool.name, tool)\n  }\n  return map\n}\n\n// --- activateSkills ---\n\nexport interface ActivateSkillsResult {\n  systemPrompt: string | undefined\n  skillTools: ToolDefinition[]\n}\n\nexport async function activateSkills(\n  skills: SkillDefinition[],\n  prompt?: string,\n): Promise<ActivateSkillsResult> {\n  if (skills.length === 0) {\n    return { systemPrompt: prompt, skillTools: [] }\n  }\n\n  const prompts = skills.map(s => `--- ${s.name} ---\\n${s.systemPrompt}`)\n  const base = prompt ? `${prompt}\\n\\n` : ''\n  const system = `${base}${prompts.join('\\n\\n')}`\n\n  const tools: ToolDefinition[] = []\n  for (const skill of skills) {\n    if (skill.onActivate) {\n      const a = await skill.onActivate()\n      tools.push(...(a.tools ?? []))\n    }\n  }\n\n  return { systemPrompt: system, skillTools: tools }\n}\n\n// --- executeSafeTool ---\n\nexport interface ToolExecResult {\n  status: 'complete' | 'error' | 'skipped'\n  result?: string\n  error?: string\n  durationMs: number\n}\n\nexport interface ExecuteSafeToolOptions {\n  tool: ToolDefinition | undefined\n  toolCall: ToolCall\n  context: ToolExecutionContext\n  emitter: ReturnType<typeof createEventEmitter>\n  lifecycle: ReturnType<typeof createToolLifecycle>\n  onPartial?: (result: string) => void\n  onConfirm?: (toolCall: ToolCall) => MaybePromise<boolean>\n  /** Opt-in arg validation against `tool.schema` (ADR-0008). */\n  validate?: ArgsValidator\n  authorize?: ToolAuthorizer\n}\n\nexport async function auth(fn: ToolAuthorizer | undefined, call: ToolCall, context: ToolAuthorizationContext): Promise<void> {\n  if (!fn) return\n  await import('./tool-authorization-internal.js').then(m => m.authorize(fn, call, context))\n}\n\n\nexport async function executeSafeTool(\n  options: ExecuteSafeToolOptions,\n): Promise<ToolExecResult> {\n  const { tool, toolCall, context, emitter, lifecycle, onPartial, onConfirm, validate, authorize } = options\n  const began = Date.now()\n\n  // Missing tool\n  if (!tool?.execute) {\n    const err = new ToolError({\n      code: ErrorCodes.AK_TOOL_NOT_FOUND,\n      message: `Tool \"${toolCall.name}\" not found or has no execute function`,\n      hint: 'Register an executable tool in ChatConfig, e.g. { tools: [myTool] }.',\n    })\n    emitter.emit({ type: 'error', error: err })\n    return { status: 'error', error: err.toString(), durationMs: Date.now() - began }\n  }\n\n  if (validate && tool.schema) {\n    const v = validate(tool.schema, toolCall.args)\n    if (!v.valid) {\n      const err = new ToolError({\n        code: ErrorCodes.AK_TOOL_INVALID_INPUT,\n        message: v.message ?? `Tool \"${toolCall.name}\" received invalid arguments`,\n      })\n      emitter.emit({ type: 'error', error: err })\n      return { status: 'error', error: err.toString(), durationMs: Date.now() - began }\n    }\n  }\n\n  // Requires confirmation — refuse by default when no approver is configured (RT6)\n  if (tool.requiresConfirmation) {\n    if (!onConfirm) {\n      return {\n        status: 'skipped',\n        result: 'No confirmation handler',\n        durationMs: Date.now() - began,\n      }\n    }\n    const confirmed = await onConfirm(toolCall)\n    if (!confirmed) {\n      return { status: 'skipped', result: 'Tool execution declined by confirmation handler', durationMs: Date.now() - began }\n    }\n  }\n\n  try {\n    await auth(authorize, toolCall, { ...context, tool, phase: 'execute' })\n  } catch (error) {\n    const err = error as ToolError\n    emitter.emit({ type: 'error', error: err })\n    return { status: 'error', error: err.toString(), durationMs: Date.now() - began }\n  }\n\n  const releaseLifecycle = acquireToolLifecycle(lifecycle)\n  if (!releaseLifecycle) {\n    return {\n      status: 'skipped',\n      result: 'Tool execution superseded by a configuration update',\n      durationMs: Date.now() - began,\n    }\n  }\n\n  try {\n    await lifecycle.init(tool)\n  } catch (error) {\n    await releaseLifecycle()\n    throw error\n  }\n\n  emitter.emit({ type: 'tool:start', name: toolCall.name, args: toolCall.args })\n\n  try {\n    const result = await executeToolCall(\n      tool,\n      toolCall.args,\n      context,\n      onPartial,\n    )\n    emitter.emit({\n      type: 'tool:end',\n      name: toolCall.name,\n      result,\n      durationMs: Date.now() - began,\n    })\n    return { status: 'complete', result, durationMs: Date.now() - began }\n  } catch (error) {\n    const detail = error instanceof Error ? error.message : String(error)\n    const err = error instanceof ToolError\n      ? error\n      : new ToolError({\n          code: ErrorCodes.AK_TOOL_EXEC_FAILED,\n          message: `Tool \"${toolCall.name}\" threw during execution: ${detail}`,\n          hint: 'Check the tool execute() implementation.',\n          cause: error,\n        })\n    // Emit error before tool:end so trackers can mark the active tool span.\n    emitter.emit({ type: 'error', error: err })\n    emitter.emit({\n      type: 'tool:end',\n      name: toolCall.name,\n      result: `Error: ${err.message}`,\n      durationMs: Date.now() - began,\n    })\n    return { status: 'error', error: err.toString(), durationMs: Date.now() - began }\n  } finally {\n    await releaseLifecycle()\n  }\n}\n","import type { RetrievedDocument, Retriever, RetrieverRequest } from './types'\n\nexport interface StaticRetrieverConfig {\n  documents: RetrievedDocument[]\n  limit?: number\n}\n\nfunction scoreDocument(document: RetrievedDocument, query: string): number {\n  const haystack = `${document.content} ${document.source ?? ''}`.toLowerCase()\n  const tokens = query.toLowerCase().split(/\\s+/).filter(Boolean)\n  if (tokens.length === 0) return 0\n\n  return tokens.reduce((score, token) => (\n    haystack.includes(token) ? score + 1 : score\n  ), 0)\n}\n\nexport function createStaticRetriever(config: StaticRetrieverConfig): Retriever {\n  const { documents, limit = 4 } = config\n\n  return {\n    async retrieve(request: RetrieverRequest) {\n      return [...documents]\n        .map(document => ({\n          ...document,\n          score: document.score ?? scoreDocument(document, request.query),\n        }))\n        .filter(document => (document.score ?? 0) > 0)\n        .sort((a, b) => (b.score ?? 0) - (a.score ?? 0))\n        .slice(0, limit)\n    },\n  }\n}\n\nexport function formatRetrievedDocuments(documents: RetrievedDocument[]): string {\n  if (documents.length === 0) return ''\n\n  return documents\n    .map((document, index) => {\n      const source = document.source ? `Source: ${document.source}\\n` : ''\n      return `[${index + 1}]\\n${source}${document.content}`\n    })\n    .join('\\n\\n')\n}\n","import { buildMessage } from './primitives'\nimport { formatRetrievedDocuments } from './rag'\nimport type { AdapterRequest, ChatConfig, Message, ToolCall, ToolDefinition } from './types'\nimport type { TokenUsage } from './types/stream'\n\n/** Normalize stream usage to finite nonnegative prompt/completion counts for llm:end. */\nexport function normalizeLlmUsage(\n  usage: TokenUsage | undefined,\n): { promptTokens: number; completionTokens: number } | undefined {\n  if (!usage) return undefined\n  const promptTokens = Number.isFinite(usage.promptTokens) && usage.promptTokens >= 0\n    ? usage.promptTokens\n    : 0\n  const completionTokens = Number.isFinite(usage.completionTokens) && usage.completionTokens >= 0\n    ? usage.completionTokens\n    : 0\n  return { promptTokens, completionTokens }\n}\n\n/** Add one stream usage chunk into cumulative session totals (hostile values → 0). */\nexport function accumulateUsage(\n  current: TokenUsage,\n  usage: TokenUsage,\n): TokenUsage {\n  const prompt = Number.isFinite(usage.promptTokens) && usage.promptTokens >= 0 ? usage.promptTokens : 0\n  const completion = Number.isFinite(usage.completionTokens) && usage.completionTokens >= 0\n    ? usage.completionTokens\n    : 0\n  const total = Number.isFinite(usage.totalTokens) && usage.totalTokens >= 0 ? usage.totalTokens : 0\n  return {\n    promptTokens: current.promptTokens + prompt,\n    completionTokens: current.completionTokens + completion,\n    totalTokens: current.totalTokens + total,\n  }\n}\n\n/** Immutable map over a single message by id. */\nexport function mapMessageById(\n  messages: Message[],\n  messageId: string,\n  updater: (message: Message) => Message,\n): Message[] {\n  return messages.map(message => (message.id === messageId ? updater(message) : message))\n}\n\n/** Immutable patch of one tool call nested under an assistant message. */\nexport function mapToolCallById(\n  messages: Message[],\n  messageId: string,\n  toolCallId: string,\n  patch: Partial<ToolCall>,\n): Message[] {\n  return mapMessageById(messages, messageId, message => ({\n    ...message,\n    toolCalls: (message.toolCalls ?? []).map(call =>\n      call.id === toolCallId ? { ...call, ...patch } : call,\n    ),\n  }))\n}\n\nexport function sameToolLifecycle(\n  previous: Map<string, ToolDefinition>,\n  next: Map<string, ToolDefinition>,\n): boolean {\n  if (previous.size !== next.size) return false\n  for (const [name, tool] of previous) {\n    const replacement = next.get(name)\n    if (\n      !replacement\n      || replacement.execute !== tool.execute\n      || replacement.init !== tool.init\n      || replacement.dispose !== tool.dispose\n    ) return false\n  }\n  return true\n}\n\n/** Build tool-result messages + a fresh streaming assistant for multi-turn tool loops. */\nexport function buildToolContinuation(\n  messages: Message[],\n  assistantId: string,\n  calls: ToolCall[],\n  buildMsg: (init: { role: Message['role']; content: string; toolCallId?: string; status?: Message['status'] }) => Message,\n): { messages: Message[]; nextAssistantId: string } {\n  const results = calls.map(call =>\n    buildMsg({\n      role: 'tool',\n      content: call.result ?? call.error ?? '',\n      toolCallId: call.id,\n    }),\n  )\n  const nextA = buildMsg({ role: 'assistant', content: '', status: 'streaming' })\n  return {\n    messages: [\n      ...messages.map(message =>\n        message.id === assistantId ? { ...message, status: 'complete' as const } : message\n      ),\n      ...results,\n      nextA,\n    ],\n    nextAssistantId: nextA.id,\n  }\n}\n\nexport async function buildAdapterRequest(\n  config: ChatConfig,\n  messages: Message[],\n  text: string,\n  systemPrompt: string | undefined,\n  tools: ToolDefinition[],\n): Promise<AdapterRequest> {\n  const withSystem = mergeSystemMessages(messages, systemPrompt)\n  const retrievedDocuments = config.retriever && text\n    ? await config.retriever.retrieve({ query: text, messages })\n    : []\n  const retrievalMessage = buildRetrievalMessage(formatRetrievedDocuments(retrievedDocuments))\n\n  return {\n    messages: retrievalMessage ? [retrievalMessage, ...withSystem] : withSystem,\n    context: {\n      systemPrompt,\n      temperature: config.temperature,\n      maxTokens: config.maxTokens,\n      tools,\n      metadata: retrievedDocuments.length > 0 ? { retrievedDocuments } : undefined,\n    },\n  }\n}\n\n/**\n * Ensure a system prompt is present at the head of the message list.\n *\n * The chat controller threads `config.systemPrompt` through on every\n * stream; this helper keeps the message-array transform out of the\n * controller body so it can be tested + reasoned about in isolation.\n * Returns the original array (no-op) when the prompt is empty or\n * already at any position in the list — re-prepending would duplicate\n * the prompt on the second turn.\n */\nexport function mergeSystemMessages(\n  messages: Message[],\n  systemPrompt?: string,\n): Message[] {\n  if (!systemPrompt) return messages\n  if (\n    messages.some(\n      message => message.role === 'system' && message.content === systemPrompt,\n    )\n  ) {\n    return messages\n  }\n  return [buildMessage({ role: 'system', content: systemPrompt }), ...messages]\n}\n\n/**\n * Wrap retrieved RAG documents in a system-role message so the model\n * receives them as authoritative context rather than as part of the\n * user turn. Returns `null` when there is nothing to inject so the\n * caller can skip pushing an empty message.\n */\nexport function buildRetrievalMessage(documentsText: string): Message | null {\n  if (!documentsText) return null\n  return buildMessage({\n    role: 'system',\n    content: `Use the retrieved context below when it is relevant.\\n\\n${documentsText}`,\n  })\n}\n","import { buildMessage as message, consumeStream, createEventEmitter, safeParseArgs, createToolLifecycle } from './primitives'\nimport { buildToolMap, activateSkills, auth, executeSafeTool as execute } from './agent-loop'\nimport {\n  accumulateUsage,\n  buildAdapterRequest,\n  buildToolContinuation,\n  mapMessageById,\n  mapToolCallById,\n  normalizeLlmUsage,\n  sameToolLifecycle,\n} from './controller-helpers'\nimport type {\n  ChatConfig,\n  ChatController,\n  ChatState,\n  Message,\n  StreamChunk,\n  StreamSource,\n  ToolCall,\n  ToolDefinition,\n} from './types'\n\nexport function createChatController(initial: ChatConfig): ChatController {\n  let config = initial\n  let system = config.systemPrompt\n  let source: StreamSource | undefined\n  let gen = 0\n  let state: ChatState = {\n    messages: initial.initialMessages ?? [],\n    status: 'idle',\n    input: '',\n    error: null,\n    usage: { promptTokens: 0, completionTokens: 0, totalTokens: 0 },\n  }\n  const listeners = new Set<() => void>()\n  const emitter = createEventEmitter()\n  let toolMap = buildToolMap(config.tools)\n  let lifecycle = createToolLifecycle(toolMap)\n  let skillTools: ToolDefinition[] = []\n  let hydrated = false\n  let active = false\n  let saving = false\n  let queued: [Message[], ChatConfig['memory']] | undefined\n  const authorize: NonNullable<ChatConfig['authorizeToolCall']> = async (call, context) => {\n    const fn = config.authorizeToolCall\n    const decision = fn ? await fn(call, context) : { allowed: true }\n    return fn === config.authorizeToolCall && toolMap.get(call.name)?.execute === context.tool?.execute ? decision : { allowed: false }\n  }\n\n  const rebuild = () => {\n    const nextToolMap = buildToolMap(config.tools, skillTools)\n    if (!sameToolLifecycle(toolMap, nextToolMap)) {\n      const previousLifecycle = lifecycle\n      lifecycle = createToolLifecycle(nextToolMap)\n      void previousLifecycle.disposeAll()\n    }\n    toolMap = nextToolMap\n  }\n\n  const activate = async () => {\n    if (active) return\n    active = true\n    const result = await activateSkills(config.skills ?? [], config.systemPrompt)\n    system = result.systemPrompt\n    skillTools = result.skillTools\n    rebuild()\n  }\n  void activate()\n\n  for (const observer of config.observers ?? []) {\n    emitter.addObserver(observer)\n  }\n\n  const emit = () => {\n    for (const listener of listeners) listener()\n  }\n\n  const set = (updater: ChatState | ((current: ChatState) => ChatState)) => {\n    state = typeof updater === 'function' ? updater(state) : updater\n    void persist(state.messages)\n    emit()\n  }\n\n  const persist = async (messages: Message[]) => {\n    queued = [messages, config.memory]\n    if (saving) return\n    saving = true\n    while (queued) {\n      const [next, memory] = queued\n      queued = undefined\n      try {\n        await memory?.save(next)\n        if (memory) emitter.emit({ type: 'memory:save', messageCount: next.length })\n      } catch {}\n    }\n    saving = false\n  }\n\n  const hydrate = async () => {\n    if (hydrated || !config.memory) return\n    hydrated = true\n\n    try {\n      const loaded = await config.memory.load()\n      if (loaded.length > 0 && state.messages.length === 0) {\n        state = { ...state, messages: loaded }\n        emitter.emit({ type: 'memory:load', messageCount: loaded.length })\n        emit()\n      }\n    } catch {\n      // Ignore hydration failures and continue with in-memory state.\n    }\n  }\n\n  void hydrate()\n\n  const setMsg = (aid: string, updater: (message: Message) => Message) => {\n    set(current => ({\n      ...current,\n      messages: mapMessageById(current.messages, aid, updater),\n    }))\n  }\n\n  const patchCall = (aid: string, tid: string, patch: Partial<ToolCall>) => {\n    set(current => ({\n      ...current,\n      messages: mapToolCallById(current.messages, aid, tid, patch),\n    }))\n  }\n\n  const runTool = (\n    tool: ToolDefinition | undefined,\n    call: ToolCall,\n    onPartial: (result: string) => void,\n  ) => execute({\n    tool,\n    toolCall: call,\n    context: { messages: state.messages, call },\n    emitter,\n    lifecycle,\n    validate: config.validateArgs,\n    authorize,\n    onPartial,\n  })\n\n  const handleCall = async (aid: string, chunk: StreamChunk, g: number) => {\n    const call = chunk.toolCall\n    if (!call) return\n\n    const tool = toolMap.get(call.name)\n    const toolCall: ToolCall = {\n      id: call.id,\n      name: call.name,\n      args: safeParseArgs(call.args),\n      result: call.result,\n      status: tool?.requiresConfirmation ? 'requires_confirmation' : 'pending',\n    }\n\n    await auth(authorize, toolCall, { messages: state.messages, tool, phase: 'propose' })\n    if (g !== gen) return\n\n    setMsg(aid, message => ({\n      ...message,\n      toolCalls: [...(message.toolCalls ?? []), toolCall],\n    }))\n\n    await config.onToolCall?.(toolCall, { messages: state.messages, tool })\n    if (g !== gen) return\n\n    // Handle requiresConfirmation: controller keeps existing behavior —\n    // sets status to 'requires_confirmation' and waits for external confirmation\n    if (tool?.requiresConfirmation) {\n      if (call.result) {\n        patchCall(aid, toolCall.id, {\n          result: call.result,\n          status: 'complete',\n        })\n      }\n      return\n    }\n\n    if (tool?.execute) patchCall(aid, toolCall.id, { status: 'running' })\n\n    const outcome = await runTool(tool, toolCall, partial => {\n        if (g !== gen) return\n        patchCall(aid, toolCall.id, { result: partial })\n    })\n    if (g !== gen) return\n\n    patchCall(aid, toolCall.id, {\n      status: outcome.status === 'complete' ? 'complete' : 'error',\n      result: outcome.result,\n      error: outcome.error,\n    })\n  }\n\n  const run = async (aid: string, q: string, g: number): Promise<boolean> => {\n    await activate()\n    const request = await buildAdapterRequest(config, state.messages, q, system, [...toolMap.values()])\n    if (g !== gen) return false\n    source = config.adapter.createSource(request)\n\n    const began = Date.now()\n    let first = false\n    let turnUsage: { promptTokens: number; completionTokens: number } | undefined\n    emitter.emit({ type: 'llm:start', messageCount: request.messages.length })\n\n    await consumeStream(source, {\n      onText(text) {\n        if (g !== gen) return; if (!first) {\n          emitter.emit({ type: 'llm:first-token', latencyMs: Date.now() - began })\n          first = true\n        }\n        setMsg(aid, message => ({ ...message, content: text }))\n      },\n      onReasoning(text) {\n        if (g !== gen) return; setMsg(aid, message => ({\n          ...message,\n          metadata: { ...message.metadata, reasoning: text },\n        }))\n      },\n      async onToolCall(chunk) {\n        if (g !== gen) return; await handleCall(aid, chunk, g)\n      },\n      onToolResult(content) {\n        if (g !== gen) return; setMsg(aid, message => ({\n          ...message,\n          metadata: { ...message.metadata, toolResult: content },\n        }))\n      },\n      onUsage(usage) {\n        if (g !== gen) return\n        // Per-turn usage for llm:end (last chunk wins; adapters emit totals once).\n        const normalized = normalizeLlmUsage(usage)\n        if (normalized) turnUsage = normalized\n        // Attach to this turn's assistant message + accumulate the session total.\n        set(current => ({\n          ...current,\n          messages: mapMessageById(current.messages, aid, m => ({\n            ...m,\n            metadata: { ...m.metadata, usage },\n          })),\n          usage: accumulateUsage(current.usage, usage),\n        }))\n      },\n      onError(error) {\n        if (g !== gen) return; gen++\n        setMsg(aid, message => ({ ...message, status: 'error' }))\n        set(current => ({ ...current, status: 'error', error }))\n        emitter.emit({ type: 'error', error })\n        config.onError?.(error)\n      },\n      onDone(text) {\n        if (g !== gen) return\n        emitter.emit({\n          type: 'llm:end',\n          content: text,\n          ...(turnUsage ? { usage: turnUsage } : {}),\n          durationMs: Date.now() - began,\n        })\n      },\n    })\n\n    return g === gen\n  }\n\n  const finalize = (aid: string) => {\n    let done: Message | undefined\n    set(current => ({\n      ...current,\n      messages: current.messages.map(message => {\n        if (message.id !== aid) return message\n        done = { ...message, status: 'complete' as const }\n        return done\n      }),\n      status: 'idle',\n      error: null,\n    }))\n    if (done) config.onMessage?.(done)\n  }\n\n  const continueTools = (aid: string, calls: ToolCall[]): string => {\n    let nextId = ''\n    set(current => {\n      const { messages: next, nextAssistantId } = buildToolContinuation(\n        current.messages,\n        aid,\n        calls,\n        message,\n      )\n      nextId = nextAssistantId\n      return {\n        ...current,\n        messages: next,\n        status: 'streaming',\n        error: null,\n      }\n    })\n    return nextId\n  }\n\n  /**\n   * Resume the agent loop after tool calls on `aid` have settled\n   * (no new LLM turn has been issued yet). Used by both `startStream` and\n   * `approve`/`deny` so the flow is identical whether tools auto-run or\n   * wait for user confirmation.\n   */\n  const resume = async (aid: string, g: number) => {\n    let id = aid\n\n    for (let remaining = config.maxToolIterations ?? 5; remaining > 0; remaining--) {\n      const assistant = state.messages.find(message => message.id === id)\n      const calls = assistant?.toolCalls ?? []\n      const waits = calls.some(call => call.status !== 'complete' && call.status !== 'error')\n\n      // Nothing to feed back, or something still awaiting confirmation —\n      // stop here; the caller drives the next step.\n      if (!calls.length || waits) {\n        finalize(id)\n        return\n      }\n\n      id = continueTools(id, calls)\n      const ok = await run(id, '', g)\n      if (!ok) return\n    }\n\n    finalize(id)\n  }\n\n  /**\n   * Runs one `send` — an LLM turn, plus any follow-up turns needed to feed\n   * completed tool results back to the model.\n   */\n  const start = async (aid: string, text: string, g: number) => {\n    const ok = await run(aid, text, g)\n    if (!ok) return\n    await resume(aid, g)\n  }\n\n  const controller: ChatController = {\n    getState: () => state,\n    subscribe(listener) {\n      listeners.add(listener)\n      return () => { listeners.delete(listener) }\n    },\n    async send(text) {\n      if (!text.trim()) return\n      if (state.status === 'streaming') controller.stop()\n      gen++\n\n      const user = message({ role: 'user', content: text })\n      const assistant = message({ role: 'assistant', content: '', status: 'streaming' })\n\n      set(current => ({\n        ...current,\n        messages: [...current.messages, user, assistant],\n        status: 'streaming',\n        input: '',\n        error: null,\n      }))\n\n      await start(assistant.id, text, gen)\n    },\n    stop() {\n      gen++\n      source?.abort()\n      const stopped = state.messages.filter(message => message.status === 'streaming')\n      set(current => ({ ...current, messages: current.messages.map(message => message.status === 'streaming' ? { ...message, status: 'complete' as const } : message), status: 'idle' }))\n      stopped.forEach(message => config.onMessage?.({ ...message, status: 'complete' }))\n    },\n    async retry() {\n      const messages = [...state.messages]\n      if (messages.length < 2) return\n\n      const last = messages[messages.length - 1]\n      const lastUser = messages[messages.length - 2]\n      if (last.role !== 'assistant' || lastUser.role !== 'user') return\n      gen++\n\n      const prior = messages.slice(0, -1)\n      const rep = message({ role: 'assistant', content: '', status: 'streaming' })\n\n      set(current => ({\n        ...current,\n        messages: [...prior, rep],\n        status: 'streaming',\n        error: null,\n      }))\n\n      await start(rep.id, lastUser.content, gen)\n    },\n    async edit(messageId, newContent, opts = {}) {\n      const messages = state.messages\n      const index = messages.findIndex(m => m.id === messageId)\n      if (index === -1) return\n\n      const target = messages[index]\n\n      // Assistant messages: in-place content edit, no regeneration.\n      if (target.role !== 'user') {\n        set(current => ({\n          ...current,\n          messages: current.messages.map(m =>\n            m.id === messageId ? { ...m, content: newContent } : m,\n          ),\n        }))\n        return\n      }\n\n      // User messages: replace content, drop following turns, optionally\n      // regenerate the assistant response.\n      const regenerate = opts.regenerate !== false\n      const truncated = messages.slice(0, index).concat({ ...target, content: newContent })\n\n      if (!regenerate) {\n        set(current => ({ ...current, messages: truncated }))\n        return\n      }\n\n      gen++\n      source?.abort()\n      const rep = message({\n        role: 'assistant',\n        content: '',\n        status: 'streaming',\n      })\n\n      const next = [...truncated, rep]\n      set(current => ({\n        ...current,\n        messages: next,\n        status: 'streaming',\n        error: null,\n      }))\n\n      await start(rep.id, newContent, gen)\n    },\n    async regenerate(messageId) {\n      const messages = state.messages\n      if (messages.length < 2) return\n\n      // Find the target assistant message.\n      let idx: number\n      if (messageId) {\n        idx = messages.findIndex(m => m.id === messageId && m.role === 'assistant')\n        if (idx === -1) return\n      } else {\n        idx = messages.length - 1\n        if (messages[idx].role !== 'assistant') return\n      }\n\n      // The preceding user message drives the regeneration.\n      let ui = idx - 1\n      while (ui >= 0 && messages[ui].role !== 'user') ui--\n      if (ui < 0) return\n\n      gen++\n      source?.abort()\n      const prior = messages.slice(0, idx)\n      const rep = message({\n        role: 'assistant',\n        content: '',\n        status: 'streaming',\n      })\n      const next = [...prior, rep]\n\n      set(current => ({\n        ...current,\n        messages: next,\n        status: 'streaming',\n        error: null,\n      }))\n\n      await start(rep.id, messages[ui].content, gen)\n    },\n    setInput(value) {\n      set(current => ({ ...current, input: value }))\n    },\n    setMessages(messages) {\n      set(current => ({ ...current, messages }))\n    },\n    async clear() {\n      await lifecycle.disposeAll()\n      set(current => ({\n        ...current,\n        messages: [],\n        status: 'idle',\n        error: null,\n        usage: { promptTokens: 0, completionTokens: 0, totalTokens: 0 },\n      }))\n      await config.memory?.clear?.()\n    },\n    proposeToolCall: p => import('./tool-proposal-internal.js').then(m => m.withAuthority(\n      controller,\n      p,\n      n => [toolMap.get(n), config.validateArgs, config.onToolCall, authorize],\n    )),\n    async approve(tid) {\n      const msg = state.messages.find(m =>\n        m.toolCalls?.some(tc => tc.id === tid && tc.status === 'requires_confirmation')\n      )\n      const tc = msg?.toolCalls?.find(c => c.id === tid)\n      if (!msg || !tc) return\n\n      const tool = toolMap.get(tc.name)\n      if (!tool?.execute) return\n\n      patchCall(msg.id, tid, { status: 'running' })\n\n      const outcome = await runTool(\n        { ...tool, requiresConfirmation: false },\n        tc,\n        partial => patchCall(msg.id, tid, { result: partial }),\n      )\n\n      patchCall(msg.id, tid, {\n        status: outcome.status === 'complete' ? 'complete' : 'error',\n        result: outcome.result,\n        error: outcome.error,\n      })\n\n      await resume(msg.id, gen)\n    },\n    async deny(tid, reason) {\n      const msg = state.messages.find(m =>\n        m.toolCalls?.some(tc => tc.id === tid && tc.status === 'requires_confirmation')\n      )\n      const tc = msg?.toolCalls?.find(c => c.id === tid)\n      if (!msg || !tc) return\n\n      patchCall(msg.id, tid, {\n        status: 'error',\n        error: `Permission denied: ${reason ?? 'user denied access'}`,\n      })\n\n      await resume(msg.id, gen)\n    },\n    updateConfig(nextConfig) {\n      config = { ...config, ...nextConfig }\n      active = false\n      rebuild()\n      void activate()\n      void hydrate()\n    },\n  }\n  return controller\n}\n","import type { ChatMemory, MemoryRecord, Message } from './types'\n\nexport function serializeMessages(messages: Message[]): MemoryRecord {\n  return JSON.parse(JSON.stringify({\n    version: 1,\n    messages,\n  })) as MemoryRecord\n}\n\nexport function deserializeMessages(record: MemoryRecord | null | undefined): Message[] {\n  if (!record?.messages) return []\n  return record.messages.map(message => ({\n    ...message,\n    createdAt: new Date(message.createdAt),\n  }))\n}\n\nexport function createInMemoryMemory(initialMessages: Message[] = []): ChatMemory {\n  let messages = [...initialMessages]\n\n  return {\n    async load() {\n      return [...messages]\n    },\n    async save(nextMessages) {\n      messages = [...nextMessages]\n    },\n    async clear() {\n      messages = []\n    },\n  }\n}\n\nexport function createLocalStorageMemory(key: string): ChatMemory {\n  return {\n    async load() {\n      if (typeof localStorage === 'undefined') return []\n      const raw = localStorage.getItem(key)\n      if (!raw) return []\n      try {\n        return deserializeMessages(JSON.parse(raw) as MemoryRecord)\n      } catch {\n        return []\n      }\n    },\n    async save(messages) {\n      if (typeof localStorage === 'undefined') return\n      localStorage.setItem(key, JSON.stringify(serializeMessages(messages)))\n    },\n    async clear() {\n      if (typeof localStorage === 'undefined') return\n      localStorage.removeItem(key)\n    },\n  }\n}\n","import type { JSONSchema7 } from 'json-schema'\nimport type { MaybePromise } from './common'\nimport type { Message } from './message'\n\nexport type ToolCallStatus = 'pending' | 'running' | 'complete' | 'error' | 'requires_confirmation'\n\nexport interface ToolCall {\n  id: string\n  name: string\n  args: Record<string, unknown>\n  result?: string\n  error?: string\n  status: ToolCallStatus\n}\n\nexport interface ToolExecutionContext {\n  messages: Message[]\n  call: ToolCall\n}\n\n// ---------------------------------------------------------------------------\n// Runtime argument validation (ADR-0008)\n//\n// Validation is an injectable, opt-in capability. Core ships no validator and\n// stays zero-dependency; callers provide an `ArgsValidator` (e.g. from\n// `@agentskit/tools/validation`) to enforce a tool's JSON Schema against the args a\n// model produced. Default behaviour (no validator) is passthrough.\n// ---------------------------------------------------------------------------\n\nexport interface ArgsValidationError {\n  /** JSON pointer / dotted path to the offending field, or '' for root. */\n  path: string\n  message: string\n}\n\nexport interface ArgsValidationResult {\n  valid: boolean\n  errors?: ArgsValidationError[]\n  /** Optional pre-built human summary; used verbatim in the thrown error. */\n  message?: string\n}\n\n/**\n * Validate parsed tool-call args against the tool's JSON Schema.\n * Returns `{ valid: true }` to allow execution, or `{ valid: false, errors }`\n * to reject it with `AK_TOOL_INVALID_INPUT`.\n */\nexport type ArgsValidator = (\n  schema: JSONSchema7,\n  args: Record<string, unknown>,\n) => ArgsValidationResult\n\n// ---------------------------------------------------------------------------\n// JSON Schema -> TypeScript type inference (works with `as const` schemas)\n// ---------------------------------------------------------------------------\n\n/** Map JSON Schema `type` strings to TypeScript types. */\ntype JSONSchemaTypeMap = {\n  string: string\n  number: number\n  integer: number\n  boolean: boolean\n  null: null\n  object: Record<string, unknown>\n  array: unknown[]\n}\n\n/** Resolve a single JSON Schema property to a TypeScript type. */\ntype InferJSONSchemaProperty<T> =\n  T extends { type: 'object'; properties: infer P }\n    ? InferJSONSchemaObject<T>\n    : T extends { type: 'array'; items: infer I }\n      ? Array<InferJSONSchemaProperty<I>>\n      : T extends { type: infer U }\n        ? U extends keyof JSONSchemaTypeMap\n          ? JSONSchemaTypeMap[U]\n          : unknown\n        : unknown\n\n/** Resolve an object schema to a mapped type with required/optional handling. */\ntype InferJSONSchemaObject<T> =\n  T extends { properties: infer P; required: infer R }\n    ? R extends readonly string[]\n      ? { [K in keyof P & string as K extends R[number] ? K : never]: InferJSONSchemaProperty<P[K]> }\n        & { [K in keyof P & string as K extends R[number] ? never : K]?: InferJSONSchemaProperty<P[K]> }\n      : { [K in keyof P & string]?: InferJSONSchemaProperty<P[K]> }\n    : T extends { properties: infer P }\n      ? { [K in keyof P & string]?: InferJSONSchemaProperty<P[K]> }\n      : Record<string, unknown>\n\n/** Top-level inference: extract args type from a JSON Schema definition. */\nexport type InferSchemaType<T> =\n  T extends { type: 'object'; properties: infer _P }\n    ? InferJSONSchemaObject<T>\n    : Record<string, unknown>\n\n// ---------------------------------------------------------------------------\n// ToolDefinition — generic with backward-compatible default\n// ---------------------------------------------------------------------------\n\nexport interface ToolDefinition<TArgs = Record<string, unknown>> {\n  name: string\n  description?: string\n  schema?: JSONSchema7\n  requiresConfirmation?: boolean\n  execute?: (\n    args: TArgs,\n    context: ToolExecutionContext,\n  ) => MaybePromise<unknown> | AsyncIterable<unknown>\n  init?: () => MaybePromise<void>\n  dispose?: () => MaybePromise<void>\n  tags?: string[]\n  category?: string\n}\n\n// ---------------------------------------------------------------------------\n// defineTool() — factory with automatic type inference from `as const` schemas\n// ---------------------------------------------------------------------------\n\n/** Config for defineTool: schema is narrowed to a const type for inference. */\nexport interface DefineToolConfig<TSchema extends JSONSchema7> {\n  name: string\n  description?: string\n  schema?: TSchema\n  requiresConfirmation?: boolean\n  execute?: (\n    args: InferSchemaType<TSchema>,\n    context: ToolExecutionContext,\n  ) => MaybePromise<unknown> | AsyncIterable<unknown>\n  init?: () => MaybePromise<void>\n  dispose?: () => MaybePromise<void>\n  tags?: string[]\n  category?: string\n}\n\n/** Create a ToolDefinition with automatic type inference from the JSON schema. */\nexport function defineTool<TSchema extends JSONSchema7>(\n  config: DefineToolConfig<TSchema>,\n): ToolDefinition<InferSchemaType<TSchema>> {\n  return config as ToolDefinition<InferSchemaType<TSchema>>\n}\n\nexport interface ToolCallHandlerContext {\n  messages: Message[]\n  tool?: ToolDefinition\n}\n\nexport type ToolAuthorizationPhase = 'propose' | 'execute'\nexport interface ToolAuthorizationContext extends ToolCallHandlerContext { phase: ToolAuthorizationPhase }\nexport interface ToolAuthorizationDecision { allowed: boolean; reason?: string }\nexport type ToolAuthorizer = (toolCall: ToolCall, context: ToolAuthorizationContext) => MaybePromise<ToolAuthorizationDecision>\n","import type { Message } from './types/message'\nimport type { TokenCounter } from './types/token-counter'\nimport type { ToolDefinition } from './types/tool'\n\nexport type BudgetStrategy = 'drop-oldest' | 'sliding-window' | 'summarize'\n\nexport interface CompileBudgetInput {\n  /** Hard upper bound (model context limit - reserveForOutput). */\n  budget: number\n  messages: Message[]\n  systemPrompt?: string\n  tools?: ToolDefinition[]\n  /** Token counter. Defaults to `approximateCounter` (chars/4 heuristic). */\n  counter?: TokenCounter\n  /** Trimming strategy. Default 'drop-oldest'. */\n  strategy?: BudgetStrategy\n  /** Required when strategy === 'summarize'. */\n  summarizer?: (dropped: Message[]) => Message | Promise<Message>\n  /** Tokens reserved for the model's output. Subtracted from budget. */\n  reserveForOutput?: number\n  /**\n   * Minimum number of recent messages to keep regardless of strategy.\n   * Protects against dropping the turn that actually matters. Default 1.\n   */\n  keepRecent?: number\n}\n\nexport interface CompileBudgetResult {\n  messages: Message[]\n  systemPrompt?: string\n  tokens: {\n    system: number\n    messages: number\n    tools: number\n    total: number\n    budget: number\n  }\n  dropped: Message[]\n  fits: boolean\n  strategy: BudgetStrategy\n}\n\n/**\n * Zero-dependency approximate token counter. Rule of thumb: ~4 chars\n * per token. Good enough for budget planning; swap for a real\n * tokenizer (tiktoken etc.) via the `counter` option in prod.\n */\nexport const approximateCounter: TokenCounter = {\n  name: 'approximate',\n  count(messages) {\n    let total = 0\n    for (const m of messages) {\n      total += Math.ceil(((m.role?.length ?? 0) + (m.content?.length ?? 0)) / 4) + 2\n    }\n    return total\n  },\n  countDetailed(messages) {\n    const perMessage = messages.map(m => Math.ceil(((m.role?.length ?? 0) + (m.content?.length ?? 0)) / 4) + 2)\n    return { total: perMessage.reduce((a, b) => a + b, 0), perMessage }\n  },\n}\n\nfunction countTools(tools: ToolDefinition[] | undefined, counter: TokenCounter): number | Promise<number> {\n  if (!tools || tools.length === 0) return 0\n  return counter.count(\n    tools.map(t => ({ role: 'system' as const, content: `${t.name}:${t.description ?? ''}:${JSON.stringify(t.schema ?? {})}` })),\n  )\n}\n\nasync function toNumber(v: number | Promise<number>): Promise<number> {\n  return typeof v === 'number' ? v : await v\n}\n\n/**\n * Take a declared `budget` and a set of messages/system/tools, then\n * return a trimmed request guaranteed to fit under `budget`. Three\n * strategies:\n *  - 'drop-oldest': remove oldest messages until it fits\n *  - 'sliding-window': keep only the most recent N messages\n *  - 'summarize': fold dropped messages into a single summary message\n */\nexport async function compileBudget(input: CompileBudgetInput): Promise<CompileBudgetResult> {\n  const counter = input.counter ?? approximateCounter\n  const strategy = input.strategy ?? 'drop-oldest'\n  const keepRecent = Math.max(1, input.keepRecent ?? 1)\n  const reserved = input.reserveForOutput ?? 0\n  const effectiveBudget = input.budget - reserved\n\n  if (effectiveBudget <= 0) {\n    throw new Error(`Budget must exceed reserveForOutput (${input.budget} ≤ ${reserved})`)\n  }\n\n  const systemMsg: Message | undefined = input.systemPrompt\n    ? {\n        id: '__system',\n        role: 'system',\n        content: input.systemPrompt,\n        status: 'complete',\n        createdAt: new Date(0),\n      }\n    : undefined\n\n  const systemTokens = systemMsg ? await toNumber(counter.count([systemMsg])) : 0\n  const toolTokens = await toNumber(countTools(input.tools, counter))\n  const floor = systemTokens + toolTokens\n\n  if (floor > effectiveBudget) {\n    throw new Error(\n      `System prompt + tools (${floor} tokens) exceed budget (${effectiveBudget}). Shrink system prompt or raise budget.`,\n    )\n  }\n\n  const working = [...input.messages]\n  const dropped: Message[] = []\n\n  const messageTokens = async (msgs: Message[]): Promise<number> => toNumber(counter.count(msgs))\n\n  let total = floor + (await messageTokens(working))\n\n  if (strategy === 'sliding-window') {\n    while (working.length > keepRecent && total > effectiveBudget) {\n      dropped.push(working.shift()!)\n      total = floor + (await messageTokens(working))\n    }\n  } else if (strategy === 'drop-oldest') {\n    while (working.length > keepRecent && total > effectiveBudget) {\n      dropped.push(working.shift()!)\n      total = floor + (await messageTokens(working))\n    }\n  } else if (strategy === 'summarize') {\n    if (!input.summarizer) {\n      throw new Error(`strategy='summarize' requires a summarizer function`)\n    }\n    while (working.length > keepRecent && total > effectiveBudget) {\n      dropped.push(working.shift()!)\n      total = floor + (await messageTokens(working))\n    }\n    if (dropped.length > 0) {\n      const summary = await input.summarizer(dropped)\n      working.unshift(summary)\n      total = floor + (await messageTokens(working))\n    }\n  }\n\n  return {\n    messages: working,\n    systemPrompt: input.systemPrompt,\n    tokens: {\n      system: systemTokens,\n      messages: total - floor,\n      tools: toolTokens,\n      total,\n      budget: effectiveBudget,\n    },\n    dropped,\n    fits: total <= effectiveBudget,\n    strategy,\n  }\n}\n","import type { ToolCall, ToolDefinition, ToolExecutionContext } from './types/tool'\nimport type { Message } from './types/message'\n\nexport interface ProgressiveFieldEvent {\n  /** Top-level field name whose value just finished being streamed. */\n  field: string\n  /** Parsed value (string / number / boolean / array / object / null). */\n  value: unknown\n  /** Raw JSON text for that field. */\n  raw: string\n  /** Byte offset in the accumulated buffer where this field ended. */\n  offset: number\n}\n\nexport interface ProgressiveArgParser {\n  /** Append a new chunk of JSON text. Emits `onField` for each top-level field that completes. */\n  push: (chunk: string) => ProgressiveFieldEvent[]\n  /** Mark the stream finished — validates the object closed cleanly. Returns any final events. */\n  end: () => ProgressiveFieldEvent[]\n  /** All events seen so far, in order. */\n  readonly events: ReadonlyArray<ProgressiveFieldEvent>\n  /** Current parsed partial object (fields completed so far). */\n  readonly value: Record<string, unknown>\n  /** Accumulated raw buffer. */\n  readonly buffer: string\n}\n\n/**\n * Stream-parse a JSON object where top-level field values arrive\n * incrementally. Fires an event as soon as each top-level field has a\n * syntactically complete value, enabling \"progressive\" tool execution\n * — the tool can begin work on the first field before the LLM has\n * finished emitting the rest.\n *\n * Only works at the top level of a JSON object — nested structures\n * are parsed atomically when their enclosing top-level field closes.\n * That matches the common tool-args shape: a flat `{ query, limit, ...}`\n * object where the expensive operation depends on one key.\n */\nexport function createProgressiveArgParser(): ProgressiveArgParser {\n  let buffer = ''\n  const events: ProgressiveFieldEvent[] = []\n  const value: Record<string, unknown> = {}\n\n  // Parser state — we track whether we have entered the top-level `{`,\n  // are between fields, reading a key, between `:` and value, reading\n  // a value, etc.\n  let started = false\n  let finished = false\n  let pos = 0\n\n  const skipWs = (): void => {\n    while (pos < buffer.length && /\\s/.test(buffer[pos]!)) pos++\n  }\n\n  /** Try to parse a JSON string starting at `pos`. Returns end index or -1 if incomplete. */\n  const scanString = (): number => {\n    if (buffer[pos] !== '\"') return -1\n    let i = pos + 1\n    while (i < buffer.length) {\n      const ch = buffer[i]\n      if (ch === '\\\\') {\n        i += 2\n        continue\n      }\n      if (ch === '\"') return i + 1\n      i++\n    }\n    return -1\n  }\n\n  /** Scan a balanced nested value ({...} / [...]). Returns end index or -1. */\n  const scanBalanced = (open: string, close: string): number => {\n    let depth = 0\n    let i = pos\n    let inStr = false\n    let esc = false\n    while (i < buffer.length) {\n      const ch = buffer[i]!\n      if (inStr) {\n        if (esc) esc = false\n        else if (ch === '\\\\') esc = true\n        else if (ch === '\"') inStr = false\n      } else {\n        if (ch === '\"') inStr = true\n        else if (ch === open) depth++\n        else if (ch === close) {\n          depth--\n          if (depth === 0) return i + 1\n        }\n      }\n      i++\n    }\n    return -1\n  }\n\n  /** Scan a primitive (number / bool / null). Returns end or -1 if not terminated. */\n  const scanPrimitive = (): number => {\n    let i = pos\n    while (i < buffer.length) {\n      const ch = buffer[i]!\n      if (ch === ',' || ch === '}' || /\\s/.test(ch)) return i\n      i++\n    }\n    return -1\n  }\n\n  const readValue = (): { end: number; raw: string; value: unknown } | null => {\n    skipWs()\n    if (pos >= buffer.length) return null\n    const ch = buffer[pos]!\n    let end = -1\n    if (ch === '\"') end = scanString()\n    else if (ch === '{') end = scanBalanced('{', '}')\n    else if (ch === '[') end = scanBalanced('[', ']')\n    else end = scanPrimitive()\n    if (end < 0) return null\n    const raw = buffer.slice(pos, end)\n    try {\n      return { end, raw, value: JSON.parse(raw) }\n    } catch {\n      return null\n    }\n  }\n\n  const tryConsume = (): ProgressiveFieldEvent[] => {\n    const out: ProgressiveFieldEvent[] = []\n    if (finished) return out\n\n    if (!started) {\n      skipWs()\n      if (pos >= buffer.length) return out\n      if (buffer[pos] !== '{') throw new Error(`Expected '{' at position ${pos}`)\n      pos++\n      started = true\n    }\n\n    while (true) {\n      skipWs()\n      if (pos >= buffer.length) return out\n      if (buffer[pos] === '}') {\n        pos++\n        finished = true\n        return out\n      }\n      if (buffer[pos] === ',') {\n        pos++\n        continue\n      }\n      const keyEnd = scanString()\n      if (keyEnd < 0) return out\n      const keyRaw = buffer.slice(pos, keyEnd)\n      const key = JSON.parse(keyRaw) as string\n      const savedPos = pos\n      pos = keyEnd\n      skipWs()\n      if (buffer[pos] !== ':') {\n        pos = savedPos\n        return out\n      }\n      pos++\n      const scanned = readValue()\n      if (!scanned) {\n        pos = savedPos\n        return out\n      }\n      const ev: ProgressiveFieldEvent = {\n        field: key,\n        value: scanned.value,\n        raw: scanned.raw,\n        offset: scanned.end,\n      }\n      value[key] = scanned.value\n      events.push(ev)\n      out.push(ev)\n      pos = scanned.end\n    }\n  }\n\n  return {\n    push(chunk) {\n      buffer += chunk\n      return tryConsume()\n    },\n    end() {\n      const tail = tryConsume()\n      if (!finished) {\n        throw new Error('Progressive JSON ended without closing `}`')\n      }\n      return tail\n    },\n    get events() {\n      return events\n    },\n    get value() {\n      return value\n    },\n    get buffer() {\n      return buffer\n    },\n  }\n}\n\nexport interface ProgressiveExecOptions {\n  /** Start executing after these fields have been received. Default: first field. */\n  triggerFields?: string[]\n  /** Called for each field event, including those after execution starts. */\n  onField?: (event: ProgressiveFieldEvent) => void\n}\n\nexport interface ProgressiveExecResult {\n  fields: ProgressiveFieldEvent[]\n  finalArgs: Record<string, unknown>\n  /** Resolves with the tool's return value. */\n  execution: Promise<unknown>\n}\n\n/**\n * Run a tool \"progressively\": feed argument-text chunks as they\n * stream, and kick off `tool.execute` as soon as the trigger fields\n * have arrived. Additional field events keep landing in the same\n * `onField` callback so the tool can adapt.\n *\n * The tool's `args` parameter reflects whichever fields had arrived\n * by the trigger point — callers that need the complete object should\n * wait for `finalArgs`.\n */\nexport function executeToolProgressively<TArgs extends Record<string, unknown>>(\n  tool: ToolDefinition<TArgs>,\n  chunks: AsyncIterable<string>,\n  context: Omit<ToolExecutionContext, 'call'> & { messages: Message[]; callId: string },\n  options: ProgressiveExecOptions = {},\n): ProgressiveExecResult {\n  const parser = createProgressiveArgParser()\n  const trigger = new Set(options.triggerFields ?? [])\n  const useFirst = trigger.size === 0\n  let started = false\n  let startResolve: (args: Record<string, unknown>) => void = () => {}\n  const startArgs = new Promise<Record<string, unknown>>(res => {\n    startResolve = res\n  })\n  const finalArgs: Record<string, unknown> = {}\n\n  const handle = (ev: ProgressiveFieldEvent): void => {\n    finalArgs[ev.field] = ev.value\n    options.onField?.(ev)\n    if (!started) {\n      if (useFirst || trigger.has(ev.field)) {\n        if (!useFirst) trigger.delete(ev.field)\n        if (useFirst || trigger.size === 0) {\n          started = true\n          startResolve({ ...finalArgs })\n        }\n      }\n    }\n  }\n\n  const consume = async (): Promise<void> => {\n    for await (const chunk of chunks) {\n      for (const ev of parser.push(chunk)) handle(ev)\n    }\n    for (const ev of parser.end()) handle(ev)\n    if (!started) {\n      started = true\n      startResolve({ ...finalArgs })\n    }\n  }\n\n  const execution = (async (): Promise<unknown> => {\n    const consumer = consume()\n    const argsAtStart = await startArgs\n    const toolCall: ToolCall = {\n      id: context.callId,\n      name: tool.name,\n      args: argsAtStart,\n      status: 'running',\n    }\n    const execPromise = tool.execute\n      ? Promise.resolve(tool.execute(argsAtStart as TArgs, { messages: context.messages, call: toolCall }))\n      : Promise.resolve(undefined)\n    const [result] = await Promise.all([execPromise, consumer])\n    return result\n  })()\n\n  return {\n    get fields() {\n      return parser.events.slice()\n    },\n    get finalArgs() {\n      return finalArgs\n    },\n    execution,\n  }\n}\n","import type { ChatMemory } from './types/memory'\nimport type { Message } from './types/message'\n\nexport interface VirtualizedMemoryOptions {\n  /** Maximum number of recent messages to keep \"hot\" (always loaded). Default 50. */\n  maxActive?: number\n  /**\n   * Optional retriever used to surface relevant \"cold\" messages on\n   * each `load()`. Given the hot window, returns up to `maxRetrieved`\n   * older messages to splice back in (in chronological order).\n   */\n  retriever?: (input: {\n    hot: Message[]\n    cold: Message[]\n    maxRetrieved: number\n  }) => Message[] | Promise<Message[]>\n  /** Maximum retrieved cold messages per load. Default 10. */\n  maxRetrieved?: number\n}\n\n/**\n * Wrap any `ChatMemory` implementation with a fixed active window.\n * Older messages (cold) are preserved on disk / in the backing store\n * but omitted from `load()` unless a `retriever` surfaces them.\n *\n * Key guarantees:\n *  - Backing store always holds the full conversation. No data loss.\n *  - `load()` returns at most `maxActive + maxRetrieved` messages.\n *  - `save()` merges the caller's messages with any cold tail the\n *    caller did not see, so callers that load -> mutate -> save do not\n *    accidentally truncate history.\n */\nexport function createVirtualizedMemory(\n  backing: ChatMemory,\n  options: VirtualizedMemoryOptions = {},\n): ChatMemory & {\n  /** Total messages in the backing store (hot + cold). */\n  size: () => Promise<number>\n  /** Read the full (cold + hot) message list, bypassing virtualization. */\n  loadAll: () => Promise<Message[]>\n} {\n  const maxActive = Math.max(1, options.maxActive ?? 50)\n  const maxRetrieved = Math.max(0, options.maxRetrieved ?? 10)\n\n  const splitHotCold = (msgs: Message[]): { hot: Message[]; cold: Message[] } => {\n    if (msgs.length <= maxActive) return { hot: msgs.slice(), cold: [] }\n    return { hot: msgs.slice(msgs.length - maxActive), cold: msgs.slice(0, msgs.length - maxActive) }\n  }\n\n  return {\n    async load() {\n      const all = [...(await backing.load())]\n      const { hot, cold } = splitHotCold(all)\n      if (cold.length === 0) return hot\n      let retrieved: Message[] = []\n      if (options.retriever && maxRetrieved > 0) {\n        retrieved = [...(await options.retriever({ hot, cold, maxRetrieved }))]\n      }\n      const seen = new Set(hot.map(m => m.id))\n      const interleaved = retrieved.filter(m => !seen.has(m.id))\n      return mergeByCreatedAt(interleaved, hot)\n    },\n\n    async save(visible) {\n      const all = [...(await backing.load())]\n      const { cold } = splitHotCold(all)\n      const visibleIds = new Set(visible.map(m => m.id))\n      const coldKept = cold.filter(m => !visibleIds.has(m.id))\n      await backing.save(mergeByCreatedAt(coldKept, visible))\n    },\n\n    async clear() {\n      await backing.clear?.()\n    },\n\n    async size() {\n      return (await backing.load()).length\n    },\n\n    async loadAll() {\n      return [...(await backing.load())]\n    },\n  }\n}\n\nfunction mergeByCreatedAt(a: Message[], b: Message[]): Message[] {\n  const out = [...a, ...b]\n  out.sort((x, y) => x.createdAt.getTime() - y.createdAt.getTime())\n  return out\n}\n","/**\n * Provider-neutral multi-modal content parts. A single `Message.content`\n * is a string (classic path); multi-modal messages populate `parts`\n * alongside — adapters that understand parts read them, the rest fall\n * back to `content` (which we keep as a text projection via\n * `partsToText`).\n */\n\nexport interface TextPart {\n  type: 'text'\n  text: string\n}\n\nexport interface ImagePart {\n  type: 'image'\n  /** Data URL, http(s) URL, or provider-hosted reference id. */\n  source: string\n  mimeType?: string\n  /** Provider-neutral hint, e.g. 'low' / 'high'. */\n  detail?: 'low' | 'high' | 'auto'\n}\n\nexport interface AudioPart {\n  type: 'audio'\n  source: string\n  mimeType?: string\n  /** Duration in seconds, if known. */\n  durationSec?: number\n}\n\nexport interface VideoPart {\n  type: 'video'\n  source: string\n  mimeType?: string\n  durationSec?: number\n}\n\nexport interface FilePart {\n  type: 'file'\n  source: string\n  mimeType?: string\n  /** Original filename, when available. */\n  filename?: string\n}\n\nexport type ContentPart = TextPart | ImagePart | AudioPart | VideoPart | FilePart\n\nexport type PartKind = ContentPart['type']\n\n/** Build a text part. */\nexport function textPart(text: string): TextPart {\n  return { type: 'text', text }\n}\n\n/** Build an image part from a URL / data URI / hosted id. */\nexport function imagePart(source: string, opts: Omit<ImagePart, 'type' | 'source'> = {}): ImagePart {\n  return { type: 'image', source, ...opts }\n}\n\nexport function audioPart(source: string, opts: Omit<AudioPart, 'type' | 'source'> = {}): AudioPart {\n  return { type: 'audio', source, ...opts }\n}\n\nexport function videoPart(source: string, opts: Omit<VideoPart, 'type' | 'source'> = {}): VideoPart {\n  return { type: 'video', source, ...opts }\n}\n\nexport function filePart(source: string, opts: Omit<FilePart, 'type' | 'source'> = {}): FilePart {\n  return { type: 'file', source, ...opts }\n}\n\n/**\n * Collapse a parts array into a text-only projection. Non-text parts\n * are rendered as `[image: url]` / `[audio: url]` etc. so plain-text\n * adapters see *something* meaningful.\n */\nexport function partsToText(parts: ContentPart[]): string {\n  const out: string[] = []\n  for (const p of parts) {\n    switch (p.type) {\n      case 'text':\n        out.push(p.text)\n        break\n      case 'image':\n        out.push(`[image: ${p.source}]`)\n        break\n      case 'audio':\n        out.push(`[audio: ${p.source}]`)\n        break\n      case 'video':\n        out.push(`[video: ${p.source}]`)\n        break\n      case 'file':\n        out.push(`[file: ${p.filename ?? p.source}]`)\n        break\n    }\n  }\n  return out.join('\\n')\n}\n\n/**\n * Normalize any of (string | ContentPart[] | undefined) into\n * `{ text, parts }`. Callers that have both the legacy `content`\n * string and the new `parts` array use this to pick the right one.\n */\nexport function normalizeContent(\n  content: string | undefined,\n  parts: ContentPart[] | undefined,\n): { text: string; parts: ContentPart[] } {\n  if (parts && parts.length > 0) {\n    return { text: partsToText(parts), parts }\n  }\n  const text = content ?? ''\n  return { text, parts: text ? [textPart(text)] : [] }\n}\n\n/** Filter parts by kind. */\nexport function filterParts<T extends PartKind>(\n  parts: ContentPart[],\n  kind: T,\n): Extract<ContentPart, { type: T }>[] {\n  return parts.filter(p => p.type === kind) as Extract<ContentPart, { type: T }>[]\n}\n"]}