{
  "version": 3,
  "sources": ["../src/analytics.ts", "../src/collector.ts", "../src/errors.ts", "../src/menu.ts", "../src/storage/queries.ts", "../src/skills.ts", "../src/storage/files.ts", "../src/storage/format.ts", "../src/storage/store.ts"],
  "sourcesContent": ["import { randomUUID } from \"node:crypto\";\nimport path from \"node:path\";\nimport { type ExtensionAPI, type ExtensionContext, getAgentDir } from \"@earendil-works/pi-coding-agent\";\nimport { ResponseCollector } from \"./collector.js\";\nimport { type AnalyticsMenuDataSource, showAnalyticsMenu } from \"./menu.js\";\nimport { SkillTracker } from \"./skills.js\";\nimport type { ClearAnalyticsResult } from \"./storage/files.js\";\nimport type { AnalyticsSnapshot, TimeRange } from \"./storage/queries.js\";\nimport { AnalyticsStore } from \"./storage/store.js\";\nimport type { ModelIdentity, SettledRun, TriggerSource } from \"./types.js\";\n\ninterface PendingProviderGeneration {\n  id: string;\n  startedAtMs: number;\n  model?: ModelIdentity;\n  responses: Array<{ status: number; occurredAtMs: number }>;\n}\n\nconst STORAGE_DIRECTORY = \"pi-analytics\";\n\nexport interface AnalyticsStorePort {\n  readonly path: string;\n  recordRun(run: SettledRun, signal?: AbortSignal): Promise<void>;\n  getSnapshot(range: TimeRange, signal?: AbortSignal): Promise<AnalyticsSnapshot>;\n  clearAll(signal?: AbortSignal): Promise<ClearAnalyticsResult>;\n  close(): Promise<void>;\n}\n\ninterface AnalyticsDependencies {\n  createStore(path: string): AnalyticsStorePort;\n  createSkillTracker(cwd: string): SkillTracker;\n  getAgentDir(): string;\n  now(): number;\n  createId(): string;\n}\n\nexport function createAnalyticsExtension(\n  dependencies: Partial<AnalyticsDependencies> = {},\n): (pi: ExtensionAPI) => void {\n  const deps: AnalyticsDependencies = {\n    createStore: dependencies.createStore ?? ((rootPath) => new AnalyticsStore(rootPath)),\n    createSkillTracker: dependencies.createSkillTracker ?? ((cwd) => new SkillTracker(cwd)),\n    getAgentDir: dependencies.getAgentDir ?? getAgentDir,\n    now: dependencies.now ?? Date.now,\n    createId: dependencies.createId ?? randomUUID,\n  };\n\n  return function analyticsExtension(pi: ExtensionAPI): void {\n    let sessionGeneration = 0;\n    let sessionController = new AbortController();\n    let collector = new ResponseCollector();\n    let skillTracker: SkillTracker | undefined;\n    let store: AnalyticsStorePort | undefined;\n    let storageFailure: string | undefined;\n    const retiredCloseTasks = new Set<Promise<boolean>>();\n    let writeFailureActive = false;\n    let pendingTriggerSource: TriggerSource = \"unknown\";\n    let pendingAttemptWithoutRun = false;\n    let pendingProviderGeneration: PendingProviderGeneration | undefined;\n\n    pi.registerCommand(\"analytics\", {\n      description: \"Open local Pi usage analytics\",\n      handler: async (args, ctx) => {\n        if (args.trim()) {\n          if (!ctx.hasUI || (ctx.mode !== \"tui\" && ctx.mode !== \"rpc\")) {\n            throw new Error(\"/analytics does not accept arguments.\");\n          }\n          ctx.ui.notify(\"/analytics does not accept arguments.\", \"warning\");\n          return;\n        }\n        if (!ctx.hasUI || (ctx.mode !== \"tui\" && ctx.mode !== \"rpc\")) {\n          throw new Error(\"/analytics requires Pi TUI or RPC mode.\");\n        }\n        const generation = sessionGeneration;\n        const owner = sessionController;\n        const source = menuSource(generation, owner.signal);\n        await showAnalyticsMenu(ctx, source, {\n          signal: owner.signal,\n          isCurrent: () => generation === sessionGeneration && !owner.signal.aborted,\n        });\n      },\n    });\n\n    pi.on(\"session_start\", (_event, ctx) => {\n      ++sessionGeneration;\n      const previousStore = store;\n      sessionController.abort(new DOMException(\"Analytics session replaced\", \"AbortError\"));\n      if (previousStore) retire(previousStore);\n      sessionController = new AbortController();\n      collector = new ResponseCollector();\n      skillTracker = deps.createSkillTracker(ctx.cwd);\n      store = undefined;\n      storageFailure = undefined;\n      writeFailureActive = false;\n      pendingTriggerSource = \"unknown\";\n      pendingAttemptWithoutRun = false;\n      pendingProviderGeneration = undefined;\n      const storageRoot = path.join(deps.getAgentDir(), STORAGE_DIRECTORY);\n      try {\n        store = deps.createStore(storageRoot);\n      } catch {\n        storageFailure = unavailableMessage();\n        safeNotify(ctx, storageFailure, \"warning\");\n      }\n    });\n\n    pi.on(\"input\", (event, ctx) => {\n      const now = deps.now();\n      const tracker = skillTracker;\n      tracker?.observeInput(event.text, event.source, now);\n      if (event.source !== \"extension\") pendingTriggerSource = event.source;\n      if (!tracker || !collector.hasActiveRun()) return;\n      const explicit = tracker.consumeExplicitSkill();\n      if (!explicit || !tracker.hasAvailableSkill(explicit.name)) return;\n      collector.activateSkill({\n        name: explicit.name,\n        initiatedBy: \"user\",\n        now: explicit.observedAtMs,\n        model: modelIdentity(ctx, pi),\n      });\n    });\n\n    pi.on(\"before_agent_start\", async (event, ctx) => {\n      // A cache warm has provider hooks but no assistant lifecycle. Drop any unclaimed\n      // warm metadata when the next real agent run begins instead of classifying by timing.\n      pendingProviderGeneration = undefined;\n      const generation = sessionGeneration;\n      const tracker = skillTracker;\n      const activeCollector = collector;\n      if (!tracker) return;\n      const skills = availableSkills(pi, event.systemPromptOptions.skills ?? []);\n      await tracker.setAvailableSkills(skills);\n      if (generation !== sessionGeneration || tracker !== skillTracker || activeCollector !== collector) {\n        return;\n      }\n      const explicit = tracker.consumeExplicitSkill();\n      const interrupted = activeCollector.begin({\n        id: deps.createId(),\n        now: deps.now(),\n        triggerSource: explicit?.source ?? pendingTriggerSource,\n        model: modelIdentity(ctx, pi),\n      });\n      pendingTriggerSource = \"unknown\";\n      if (interrupted) {\n        await persistRun(interrupted, ctx, generation, sessionController.signal);\n        if (generation !== sessionGeneration || tracker !== skillTracker || activeCollector !== collector) {\n          return;\n        }\n      }\n      if (explicit && skills.some(({ name }) => name === explicit.name)) {\n        activeCollector.activateSkill({\n          name: explicit.name,\n          initiatedBy: \"user\",\n          now: explicit.observedAtMs,\n          model: modelIdentity(ctx, pi),\n        });\n      }\n    });\n\n    pi.on(\"agent_start\", () => {\n      if (collector.hasActiveRun()) collector.beginAttempt();\n      else pendingAttemptWithoutRun = true;\n    });\n\n    pi.on(\"turn_start\", (_event, ctx) => ensureRun(ctx, \"extension\"));\n\n    pi.on(\"before_provider_request\", (_event, ctx) => {\n      pendingProviderGeneration = {\n        id: deps.createId(),\n        startedAtMs: deps.now(),\n        model: modelIdentity(ctx, pi),\n        responses: [],\n      };\n    });\n\n    pi.on(\"after_provider_response\", (event) => {\n      pendingProviderGeneration?.responses.push({ status: event.status, occurredAtMs: deps.now() });\n    });\n\n    pi.on(\"message_start\", (event, ctx) => {\n      if (event.message.role === \"assistant\") claimPendingProviderGeneration(ctx);\n    });\n\n    pi.on(\"message_end\", (event, ctx) => {\n      if (event.message.role !== \"assistant\") return;\n      claimPendingProviderGeneration(ctx);\n      collector.finishGeneration({\n        now: deps.now(),\n        stopReason: event.message.stopReason,\n        errorMessage: event.message.errorMessage,\n      });\n    });\n\n    pi.on(\"tool_execution_start\", (event, ctx) => {\n      ensureRun(ctx, \"extension\");\n      collector.beginTool({\n        id: event.toolCallId,\n        name: event.toolName,\n        now: deps.now(),\n        model: modelIdentity(ctx, pi),\n      });\n    });\n\n    pi.on(\"tool_result\", async (event, ctx) => {\n      if (event.toolName === \"read\" && !isBuiltinReadTool(pi)) return;\n      const generation = sessionGeneration;\n      const tracker = skillTracker;\n      const activeCollector = collector;\n      const runId = activeCollector.getActiveRunId();\n      if (!tracker || !runId) return;\n      const name = await tracker.matchSuccessfulRead({\n        toolName: event.toolName,\n        input: event.input,\n        isError: event.isError,\n      });\n      if (\n        !name ||\n        generation !== sessionGeneration ||\n        tracker !== skillTracker ||\n        activeCollector !== collector ||\n        activeCollector.getActiveRunId() !== runId\n      ) {\n        return;\n      }\n      activeCollector.activateSkill({\n        name,\n        initiatedBy: \"model\",\n        now: deps.now(),\n        model: modelIdentity(ctx, pi),\n      });\n    });\n\n    pi.on(\"tool_execution_end\", (event) => {\n      collector.finishTool({ id: event.toolCallId, now: deps.now(), isError: event.isError });\n    });\n\n    pi.on(\"agent_settled\", async (_event, ctx) => {\n      const generation = sessionGeneration;\n      const owner = sessionController;\n      const run = collector.settle(deps.now());\n      pendingAttemptWithoutRun = false;\n      pendingProviderGeneration = undefined;\n      pendingTriggerSource = \"unknown\";\n      skillTracker?.clearPending();\n      if (run) await persistRun(run, ctx, generation, owner.signal);\n    });\n\n    pi.on(\"session_shutdown\", async (_event, ctx) => {\n      const activeStore = store;\n      ++sessionGeneration;\n      sessionController.abort(new DOMException(\"Analytics session shut down\", \"AbortError\"));\n      skillTracker?.clearPending();\n      skillTracker = undefined;\n      store = undefined;\n      pendingProviderGeneration = undefined;\n      collector.interrupt(deps.now());\n      const closing = activeStore ? [closeResult(activeStore), ...retiredCloseTasks] : [...retiredCloseTasks];\n      const results = await Promise.all(closing);\n      if (results.some((closed) => !closed)) {\n        safeNotify(ctx, \"Analytics storage shutdown was incomplete.\", \"warning\");\n      }\n    });\n\n    function retire(retiredStore: AnalyticsStorePort): void {\n      const task = closeResult(retiredStore).finally(() => retiredCloseTasks.delete(task));\n      retiredCloseTasks.add(task);\n    }\n\n    async function closeResult(activeStore: AnalyticsStorePort): Promise<boolean> {\n      try {\n        await activeStore.close();\n        return true;\n      } catch {\n        return false;\n      }\n    }\n\n    function claimPendingProviderGeneration(ctx: ExtensionContext): void {\n      const pending = pendingProviderGeneration;\n      if (!pending) return;\n      pendingProviderGeneration = undefined;\n      ensureRun(ctx, \"extension\");\n      collector.beginGeneration({\n        id: pending.id,\n        now: pending.startedAtMs,\n        model: pending.model,\n      });\n      for (const response of pending.responses) {\n        collector.recordProviderResponse({ status: response.status, now: response.occurredAtMs });\n      }\n    }\n\n    function ensureRun(ctx: ExtensionContext, triggerSource: TriggerSource): void {\n      if (collector.hasActiveRun()) return;\n      collector.begin({\n        id: deps.createId(),\n        now: deps.now(),\n        triggerSource,\n        model: modelIdentity(ctx, pi),\n      });\n      if (pendingAttemptWithoutRun) {\n        pendingAttemptWithoutRun = false;\n        collector.beginAttempt();\n      }\n    }\n\n    async function persistRun(\n      run: SettledRun,\n      ctx: ExtensionContext,\n      generation: number,\n      signal: AbortSignal,\n    ): Promise<void> {\n      const activeStore = store;\n      if (!activeStore || signal.aborted) return;\n      try {\n        await activeStore.recordRun(run, signal);\n        if (generation !== sessionGeneration || activeStore !== store || signal.aborted) return;\n        if (writeFailureActive) {\n          writeFailureActive = false;\n          safeNotify(ctx, \"Local analytics storage recovered.\", \"info\");\n        }\n      } catch {\n        if (generation !== sessionGeneration || activeStore !== store || signal.aborted || writeFailureActive) {\n          return;\n        }\n        writeFailureActive = true;\n        safeNotify(ctx, \"Analytics could not save this response cycle; its metrics were dropped.\", \"warning\");\n      }\n    }\n\n    function menuSource(generation: number, signal: AbortSignal): AnalyticsMenuDataSource {\n      return {\n        path: store?.path ?? path.join(deps.getAgentDir(), STORAGE_DIRECTORY),\n        async load(range, actionSignal) {\n          assertCurrent(generation, signal);\n          const activeStore = store;\n          if (!activeStore) {\n            return { kind: \"unavailable\", message: storageFailure ?? unavailableMessage() };\n          }\n          const snapshot = await activeStore.getSnapshot(range, actionSignal);\n          assertCurrent(generation, signal);\n          return { kind: \"ready\", snapshot };\n        },\n        async clearAll(actionSignal) {\n          assertCurrent(generation, signal);\n          const activeStore = store;\n          if (!activeStore) return { cleanupIncomplete: false };\n          return activeStore.clearAll(actionSignal);\n        },\n      };\n    }\n\n    function assertCurrent(generation: number, signal: AbortSignal): void {\n      if (generation !== sessionGeneration || signal.aborted) {\n        throw new DOMException(\"Analytics interaction replaced\", \"AbortError\");\n      }\n    }\n  };\n}\n\nfunction modelIdentity(ctx: ExtensionContext, pi: ExtensionAPI): ModelIdentity | undefined {\n  if (!ctx.model) return undefined;\n  return {\n    provider: ctx.model.provider,\n    model: ctx.model.id,\n    thinkingLevel: pi.getThinkingLevel(),\n  };\n}\n\nexport function isBuiltinReadTool(pi: ExtensionAPI): boolean {\n  const read = pi.getAllTools().find(({ name }) => name === \"read\");\n  return read?.sourceInfo.source === \"builtin\";\n}\n\nfunction availableSkills(\n  pi: ExtensionAPI,\n  systemSkills: ReadonlyArray<{ name: string; filePath: string }>,\n): Array<{ name: string; filePath: string }> {\n  const result = [...systemSkills];\n  const seen = new Set(result.map(({ name }) => name));\n  const getCommands = (pi as ExtensionAPI & { getCommands?: ExtensionAPI[\"getCommands\"] }).getCommands;\n  for (const command of typeof getCommands === \"function\" ? getCommands.call(pi) : []) {\n    if (command.source !== \"skill\" || seen.has(command.name.replace(/^skill:/u, \"\"))) continue;\n    const name = command.name.replace(/^skill:/u, \"\");\n    seen.add(name);\n    result.push({ name, filePath: command.sourceInfo.path });\n  }\n  return result;\n}\n\nfunction unavailableMessage(): string {\n  return [\n    \"Local analytics storage could not be initialized safely.\",\n    \"Existing files were not replaced.\",\n    \"No analytics are being collected.\",\n  ].join(\"\\n\");\n}\n\nfunction safeNotify(ctx: ExtensionContext, message: string, level: \"info\" | \"warning\"): void {\n  try {\n    ctx.ui.notify(message, level);\n  } catch {\n    // A replaced Pi context cannot receive lifecycle feedback.\n  }\n}\n\nexport default createAnalyticsExtension();\n", "import { randomUUID } from \"node:crypto\";\nimport { classifyProviderError } from \"./errors.js\";\nimport type {\n  GenerationOutcome,\n  GenerationRecord,\n  ModelIdentity,\n  ProviderErrorRecord,\n  RunOutcome,\n  SettledRun,\n  SkillActivationRecord,\n  ToolCallRecord,\n  TriggerSource,\n} from \"./types.js\";\n\ninterface ActiveRun {\n  id: string;\n  startedAtMs: number;\n  triggerSource: TriggerSource;\n  initialModel?: ModelIdentity;\n  attemptCount: number;\n  generations: GenerationRecord[];\n  generationIds: Set<string>;\n  tools: ToolCallRecord[];\n  toolIds: Set<string>;\n  skills: SkillActivationRecord[];\n  skillIndexes: Map<string, number>;\n  providerErrors: ProviderErrorRecord[];\n}\n\nexport class ResponseCollector {\n  private active: ActiveRun | undefined;\n\n  hasActiveRun(): boolean {\n    return this.active !== undefined;\n  }\n\n  getActiveRunId(): string | undefined {\n    return this.active?.id;\n  }\n\n  begin(input: {\n    id: string;\n    now: number;\n    triggerSource: TriggerSource;\n    model?: ModelIdentity;\n  }): SettledRun | undefined {\n    const interrupted = this.active ? this.finalize(input.now, \"interrupted\") : undefined;\n    this.active = {\n      id: input.id,\n      startedAtMs: input.now,\n      triggerSource: input.triggerSource,\n      initialModel: input.model,\n      attemptCount: 0,\n      generations: [],\n      generationIds: new Set(),\n      tools: [],\n      toolIds: new Set(),\n      skills: [],\n      skillIndexes: new Map(),\n      providerErrors: [],\n    };\n    return interrupted;\n  }\n\n  beginAttempt(): void {\n    if (this.active) this.active.attemptCount += 1;\n  }\n\n  beginGeneration(input: { id: string; now: number; model?: ModelIdentity }): void {\n    const active = this.active;\n    if (!active || active.generationIds.has(input.id)) return;\n    active.generationIds.add(input.id);\n    active.generations.push({\n      id: input.id,\n      ordinal: active.generations.length,\n      provider: input.model?.provider,\n      model: input.model?.model,\n      thinkingLevel: input.model?.thinkingLevel,\n      startedAtMs: input.now,\n      outcome: \"pending\",\n      responses: [],\n    });\n  }\n\n  recordProviderResponse(input: { status: number; now: number }): void {\n    const generation = this.latestGeneration();\n    if (generation?.outcome !== \"pending\") return;\n    generation.responses.push({\n      ordinal: generation.responses.length,\n      occurredAtMs: input.now,\n      status: input.status,\n    });\n  }\n\n  finishGeneration(input: { now: number; stopReason: string; errorMessage?: string }): void {\n    const active = this.active;\n    const generation = this.latestGeneration();\n    if (!active || !generation || generation.outcome !== \"pending\") return;\n    generation.finishedAtMs = input.now;\n    generation.durationMs = elapsed(generation.startedAtMs, input.now);\n    generation.stopReason = input.stopReason;\n    generation.outcome = generationOutcome(input.stopReason);\n    if (generation.outcome === \"error\") {\n      active.providerErrors.push({\n        id: randomUUID(),\n        generationId: generation.id,\n        occurredAtMs: input.now,\n        provider: generation.provider,\n        model: generation.model,\n        category: classifyProviderError(input.errorMessage),\n        recovered: false,\n        terminal: true,\n      });\n    }\n  }\n\n  beginTool(input: { id: string; name: string; now: number; model?: ModelIdentity }): void {\n    const active = this.active;\n    if (!active || active.toolIds.has(input.id)) return;\n    active.toolIds.add(input.id);\n    active.tools.push({\n      id: input.id,\n      ordinal: active.tools.length,\n      name: input.name,\n      provider: input.model?.provider,\n      model: input.model?.model,\n      startedAtMs: input.now,\n      isError: false,\n      completionState: \"running\",\n    });\n  }\n\n  finishTool(input: { id: string; now: number; isError: boolean }): void {\n    const tool = this.active?.tools.find(({ id }) => id === input.id);\n    if (tool?.completionState !== \"running\") return;\n    tool.finishedAtMs = input.now;\n    tool.durationMs = elapsed(tool.startedAtMs, input.now);\n    tool.isError = input.isError;\n    tool.completionState = \"finished\";\n  }\n\n  activateSkill(input: { name: string; initiatedBy: \"user\" | \"model\"; now: number; model?: ModelIdentity }): void {\n    const active = this.active;\n    if (!active) return;\n    const existingIndex = active.skillIndexes.get(input.name);\n    if (existingIndex !== undefined) {\n      const existing = active.skills[existingIndex];\n      if (existing && existing.initiatedBy === \"model\" && input.initiatedBy === \"user\") {\n        existing.initiatedBy = \"user\";\n        existing.occurredAtMs = input.now;\n        existing.provider = input.model?.provider;\n        existing.model = input.model?.model;\n      }\n      return;\n    }\n    active.skillIndexes.set(input.name, active.skills.length);\n    active.skills.push({\n      id: randomUUID(),\n      name: input.name,\n      initiatedBy: input.initiatedBy,\n      occurredAtMs: input.now,\n      provider: input.model?.provider,\n      model: input.model?.model,\n    });\n  }\n\n  settle(now: number): SettledRun | undefined {\n    return this.finalize(now);\n  }\n\n  interrupt(now: number): SettledRun | undefined {\n    return this.finalize(now, \"interrupted\");\n  }\n\n  private latestGeneration(): GenerationRecord | undefined {\n    return this.active?.generations.at(-1);\n  }\n\n  private finalize(now: number, forcedOutcome?: RunOutcome): SettledRun | undefined {\n    const active = this.active;\n    if (!active) return undefined;\n    this.active = undefined;\n\n    for (const generation of active.generations) {\n      if (generation.outcome !== \"pending\") continue;\n      generation.outcome = \"interrupted\";\n      generation.finishedAtMs = now;\n      generation.durationMs = elapsed(generation.startedAtMs, now);\n    }\n    for (const tool of active.tools) {\n      if (tool.completionState !== \"running\") continue;\n      tool.completionState = \"interrupted\";\n      tool.finishedAtMs = now;\n      tool.durationMs = elapsed(tool.startedAtMs, now);\n    }\n\n    const successfulGenerationIndexes = new Set(\n      active.generations\n        .map((generation, index) => ({ generation, index }))\n        .filter(({ generation }) => isSuccessfulGeneration(generation))\n        .map(({ index }) => index),\n    );\n    let recoveredHttpErrors = 0;\n    let httpErrors = 0;\n    for (const [generationIndex, generation] of active.generations.entries()) {\n      const hasLaterSuccess = [...successfulGenerationIndexes].some((index) => index > generationIndex);\n      for (const [responseIndex, response] of generation.responses.entries()) {\n        if (response.status < 400) continue;\n        httpErrors += 1;\n        const laterSuccessInGeneration = generation.responses\n          .slice(responseIndex + 1)\n          .some(({ status }) => status >= 200 && status < 400);\n        if (laterSuccessInGeneration || hasLaterSuccess) recoveredHttpErrors += 1;\n      }\n    }\n    for (const error of active.providerErrors) {\n      const generationIndex = active.generations.findIndex(({ id }) => id === error.generationId);\n      error.recovered = [...successfulGenerationIndexes].some((index) => index > generationIndex);\n      error.terminal = !error.recovered;\n    }\n\n    const recoveredGenerationErrors = active.providerErrors.filter(({ recovered }) => recovered).length;\n    const providerErrorCount = httpErrors + active.providerErrors.length;\n    const recoveredErrorCount = recoveredHttpErrors + recoveredGenerationErrors;\n    const outcome = forcedOutcome ?? deriveOutcome(active.generations, providerErrorCount);\n\n    return {\n      id: active.id,\n      startedAtMs: active.startedAtMs,\n      finishedAtMs: now,\n      durationMs: elapsed(active.startedAtMs, now),\n      triggerSource: active.triggerSource,\n      initialProvider: active.initialModel?.provider,\n      initialModel: active.initialModel?.model,\n      outcome,\n      attemptCount: active.attemptCount,\n      generations: active.generations,\n      tools: active.tools,\n      skills: active.skills,\n      providerErrors: active.providerErrors,\n      toolErrorCount: active.tools.filter(({ isError }) => isError).length,\n      providerErrorCount,\n      recoveredErrorCount,\n    };\n  }\n}\n\nfunction elapsed(start: number, end: number): number {\n  return Math.max(0, end - start);\n}\n\nfunction generationOutcome(stopReason: string): GenerationOutcome {\n  switch (stopReason) {\n    case \"stop\":\n      return \"stop\";\n    case \"toolUse\":\n      return \"tool_use\";\n    case \"error\":\n      return \"error\";\n    case \"aborted\":\n      return \"aborted\";\n    case \"length\":\n      return \"length\";\n    default:\n      return \"interrupted\";\n  }\n}\n\nfunction isSuccessfulGeneration(generation: GenerationRecord): boolean {\n  return generation.outcome === \"stop\" || generation.outcome === \"tool_use\";\n}\n\nfunction deriveOutcome(generations: readonly GenerationRecord[], providerErrors: number): RunOutcome {\n  const last = generations.at(-1);\n  if (!last) return providerErrors > 0 ? \"error\" : \"success\";\n  switch (last.outcome) {\n    case \"stop\":\n    case \"tool_use\":\n      return providerErrors > 0 ? \"recovered_success\" : \"success\";\n    case \"error\":\n      return \"error\";\n    case \"aborted\":\n      return \"aborted\";\n    case \"length\":\n      return \"length\";\n    default:\n      return \"interrupted\";\n  }\n}\n", "import type { ProviderErrorCategory } from \"./types.js\";\n\nexport function classifyProviderError(message: string | undefined): ProviderErrorCategory {\n  const value = message?.toLowerCase() ?? \"\";\n  if (/\\b(enotfound|eai_again|dns|getaddrinfo)\\b/u.test(value)) return \"dns\";\n  if (/\\b(etimedout|timeout|timed out)\\b/u.test(value)) return \"timeout\";\n  if (/\\b(econnrefused|connection refused)\\b/u.test(value)) return \"connection_refused\";\n  if (/\\b(econnreset|connection reset|socket hang up)\\b/u.test(value)) {\n    return \"connection_reset\";\n  }\n  if (/\\b(tls|ssl|certificate|cert_|handshake)\\b/u.test(value)) return \"tls\";\n  if (/\\b(fetch failed|network|socket|connection|transport)\\b/u.test(value)) {\n    return \"network_other\";\n  }\n  return \"provider_other\";\n}\n", "import { stripVTControlCharacters } from \"node:util\";\nimport type { ExtensionCommandContext } from \"@earendil-works/pi-coding-agent\";\nimport type { MenuDefinition } from \"@narumitw/pi-tui-kit\";\nimport type { ClearAnalyticsResult } from \"./storage/files.js\";\nimport type { AnalyticsSnapshot, SkillStats, TimeRange, TimeRangeId, ToolStats } from \"./storage/queries.js\";\nimport { resolveTimeRange } from \"./storage/queries.js\";\n\nexport type AnalyticsLoadResult =\n  | { kind: \"ready\"; snapshot: AnalyticsSnapshot }\n  | { kind: \"unavailable\"; message: string };\n\nexport interface AnalyticsMenuDataSource {\n  path: string;\n  load(range: TimeRange, signal: AbortSignal): Promise<AnalyticsLoadResult>;\n  clearAll(signal: AbortSignal): Promise<ClearAnalyticsResult>;\n}\n\nexport interface AnalyticsMenuState {\n  rangeId: TimeRangeId;\n  range: TimeRange;\n  path: string;\n  result: AnalyticsLoadResult;\n}\n\nexport interface AnalyticsMenuOptions {\n  runConfirmation: typeof import(\"@narumitw/pi-tui-kit\")[\"runConfirmation\"];\n  isCurrent(): boolean;\n}\n\ntype Screen = \"main\" | \"range\" | \"skills\" | \"tools\" | \"reliability\" | \"responses\" | \"privacy\";\ntype Action = \"setRange\" | \"clearData\";\n\nconst RANGE_LABELS: Record<TimeRangeId, string> = {\n  today: \"Today\",\n  \"7d\": \"Last 7 days\",\n  \"30d\": \"Last 30 days\",\n  all: \"All time\",\n};\n\nexport function createAnalyticsMenu(\n  source: AnalyticsMenuDataSource,\n  now: () => number = Date.now,\n  options?: AnalyticsMenuOptions,\n) {\n  let rangeId: TimeRangeId = \"7d\";\n  let cachedState: AnalyticsMenuState | undefined;\n  const loadState = async (signal: AbortSignal): Promise<AnalyticsMenuState> => {\n    if (cachedState?.rangeId === rangeId) return cachedState;\n    const range = resolveTimeRange(rangeId, now());\n    const loaded = { rangeId, range, path: source.path, result: await source.load(range, signal) };\n    if (!signal.aborted && rangeId === loaded.rangeId) cachedState = loaded;\n    return loaded;\n  };\n  const getState = ({ signal }: { signal: AbortSignal }): Promise<AnalyticsMenuState> => loadState(signal);\n  const menu: MenuDefinition<AnalyticsMenuState, Screen, Action> = {\n    start: \"main\",\n    screens: {\n      main: ({ state }) => ({\n        kind: \"actions\",\n        title: `Analytics \u00B7 ${RANGE_LABELS[state.rangeId]}`,\n        lines: overviewLines(state.result),\n        items: [\n          { id: \"range\", label: \"Change time range\", to: \"range\" },\n          { id: \"skills\", label: \"Skills\", to: \"skills\" },\n          { id: \"tools\", label: \"Tools\", to: \"tools\" },\n          { id: \"reliability\", label: \"Provider reliability\", to: \"reliability\" },\n          { id: \"responses\", label: \"Response cycles\", to: \"responses\" },\n          { id: \"privacy\", label: \"Data & privacy\", to: \"privacy\" },\n          { id: \"close\", label: \"Close\", close: true },\n        ],\n        hint: \"close\",\n      }),\n      range: ({ state }) => ({\n        kind: \"choice\",\n        title: \"Analytics time range\",\n        items: (Object.keys(RANGE_LABELS) as TimeRangeId[]).map((id) => ({\n          id,\n          label: RANGE_LABELS[id],\n        })),\n        action: \"setRange\",\n        currentItemId: state.rangeId,\n        initialItemId: state.rangeId,\n        hint: \"back\",\n      }),\n      skills: ({ state }) => skillsScreen(state.result),\n      tools: ({ state }) => toolsScreen(state.result),\n      reliability: ({ state }) => ({\n        kind: \"detail\",\n        title: `Provider reliability \u00B7 ${RANGE_LABELS[state.rangeId]}`,\n        lines: reliabilityLines(state.result),\n        hint: \"back\",\n      }),\n      responses: ({ state }) => ({\n        kind: \"detail\",\n        title: `Response cycles \u00B7 ${RANGE_LABELS[state.rangeId]}`,\n        lines: responseLines(state.result),\n        hint: \"back\",\n      }),\n      privacy: ({ state }) => ({\n        kind: \"actions\",\n        title: \"Analytics data & privacy\",\n        lines: privacyLines(state),\n        items: [\n          {\n            id: \"clear\",\n            label: \"Clear analytics data\u2026\",\n            action: \"clearData\",\n            disabled: state.result.kind !== \"ready\",\n          },\n        ],\n        hint: \"back\",\n      }),\n    },\n    actions: {\n      setRange: async ({ itemId, signal }) => {\n        if (!isRangeId(itemId)) return { kind: \"rejected\", error: new Error(\"Unknown range\") };\n        rangeId = itemId;\n        cachedState = undefined;\n        await loadState(signal);\n        return signal.aborted ? { kind: \"close\" } : { kind: \"to\", screen: \"main\" };\n      },\n      clearData: async ({ ctx, state, signal }) => {\n        if (state.result.kind !== \"ready\") return { kind: \"stay\" };\n        if (!options) throw new Error(\"Analytics confirmation is unavailable\");\n        const count = state.result.snapshot.overview.responseCycles;\n        const confirmation = await options.runConfirmation(ctx, {\n          title: \"Delete analytics data?\",\n          message: `This will clear all local analytics history from:\\n\\n${safeDisplayText(state.path)}\\n\\nThe selected range currently shows ${count} response cycles. Other running Pi processes may add new records afterward.`,\n          confirmLabel: \"Delete data\",\n          cancelLabel: \"Keep data\",\n          signal,\n          isCurrent: options.isCurrent,\n          // Keep the dashboard's existing domain-level error route as the only notifier.\n          onError: () => undefined,\n        });\n        if (signal.aborted || !options.isCurrent()) return { kind: \"close\" };\n        if (confirmation.kind === \"closed\") {\n          return confirmation.reason === \"close\" ? { kind: \"close\" } : { kind: \"stay\" };\n        }\n        if (confirmation.kind === \"stale\") return { kind: \"close\" };\n        if (confirmation.kind === \"unsupported\") {\n          throw new Error(`Analytics confirmation is unavailable in ${confirmation.mode} mode`);\n        }\n        if (confirmation.kind === \"error\") throw confirmation.error;\n\n        const result = await source.clearAll(signal);\n        cachedState = undefined;\n        const isCurrent = options.isCurrent();\n        if (isCurrent) {\n          try {\n            ctx.ui.notify(\"Cleared local analytics data.\", \"info\");\n            if (result.cleanupIncomplete) {\n              ctx.ui.notify(\n                \"Some obsolete analytics files are still in use. Stop other Pi processes and clear again to remove them.\",\n                \"warning\",\n              );\n            }\n          } catch {\n            // The host can dispose the current UI after the ownership check.\n          }\n        }\n        return signal.aborted || !isCurrent ? { kind: \"close\" } : { kind: \"to\", screen: \"main\" };\n      },\n    },\n  };\n  return {\n    menu,\n    getState,\n    preload: (signal: AbortSignal) => loadState(signal),\n    get rangeId() {\n      return rangeId;\n    },\n  };\n}\n\nexport async function showAnalyticsMenu(\n  ctx: ExtensionCommandContext,\n  source: AnalyticsMenuDataSource,\n  options: { signal: AbortSignal; isCurrent: () => boolean },\n): Promise<void> {\n  const { runConfirmation, runMenu, runTask } = await import(\"@narumitw/pi-tui-kit\");\n  if (options.signal.aborted || !options.isCurrent()) return;\n  const controller = createAnalyticsMenu(source, Date.now, {\n    runConfirmation,\n    isCurrent: options.isCurrent,\n  });\n  const loading = await runTask(ctx, {\n    label: \"Loading local analytics\u2026\",\n    signal: options.signal,\n    isCurrent: options.isCurrent,\n    task: ({ signal }) => controller.preload(signal),\n    onError: () => undefined,\n  });\n  if (loading.kind !== \"completed\") {\n    if (loading.kind === \"error\") {\n      ctx.ui.notify(\n        \"Analytics failed: The local analytics query could not be completed. Existing data was not changed.\",\n        \"error\",\n      );\n    }\n    return;\n  }\n  await runMenu(ctx, controller.menu, {\n    getState: controller.getState,\n    signal: options.signal,\n    isCurrent: options.isCurrent,\n    onError: (_ctx, error) => {\n      ctx.ui.notify(`Analytics failed: ${safeErrorMessage(error)}`, \"error\");\n    },\n  });\n}\n\nfunction overviewLines(result: AnalyticsLoadResult): string[] {\n  if (result.kind === \"unavailable\") {\n    return [result.message, \"\", \"No analytics are being collected.\"];\n  }\n  const stats = result.snapshot.overview;\n  if (stats.responseCycles === 0) {\n    return [\n      \"No analytics yet.\",\n      \"Collection is active. Complete one Pi response cycle, then open /analytics again.\",\n      \"\",\n      \"Includes settled response cycles only.\",\n    ];\n  }\n  return [\n    metric(\"Response cycles\", stats.responseCycles),\n    metric(\"LLM calls\", stats.llmCalls),\n    metric(\"Calls per response\", `${formatDecimal(stats.callsPerResponse)} \u00B7 P95 ${stats.p95CallsPerResponse}`),\n    metric(\"Tool calls\", stats.toolCalls),\n    metric(\"Tool errors\", stats.toolErrors),\n    metric(\"Skill activations\", stats.skillActivations),\n    metric(\"Provider errors\", stats.providerErrors),\n    metric(\"Recovered errors\", stats.recoveredErrors),\n    \"\",\n    \"Includes settled response cycles only.\",\n  ];\n}\n\nfunction skillsScreen(result: AnalyticsLoadResult) {\n  if (result.kind === \"unavailable\") {\n    return {\n      kind: \"browse\" as const,\n      title: \"Skills\",\n      lines: [result.message],\n      items: [],\n      hint: \"back\" as const,\n    };\n  }\n  return {\n    kind: \"browse\" as const,\n    title: \"Skills\",\n    lines: result.snapshot.skills.length === 0 ? [\"No skill activations detected in this time range.\"] : undefined,\n    items: result.snapshot.skills.map(skillItem),\n    viewportSize: \"adaptive\" as const,\n    hint: \"back\" as const,\n  };\n}\n\nfunction skillItem(skill: SkillStats) {\n  return {\n    id: skill.name,\n    label: safeDisplayText(skill.name),\n    statusText: `${skill.count} \u00B7 ${skill.modelInitiated} model / ${skill.userInitiated} user`,\n    searchText: skill.models.map(modelLabel).join(\" \"),\n    details: [\n      metric(\"Activations\", skill.count),\n      metric(\"Model initiated\", skill.modelInitiated),\n      metric(\"User initiated\", skill.userInitiated),\n      \"\",\n      \"By model\",\n      ...skill.models.map((model) => `${modelLabel(model)}: ${model.count}`),\n      \"\",\n      `Last detected: ${formatTimestamp(skill.lastOccurredAtMs)}`,\n    ],\n  };\n}\n\nfunction toolsScreen(result: AnalyticsLoadResult) {\n  if (result.kind === \"unavailable\") {\n    return {\n      kind: \"browse\" as const,\n      title: \"Tools\",\n      lines: [result.message],\n      items: [],\n      hint: \"back\" as const,\n    };\n  }\n  return {\n    kind: \"browse\" as const,\n    title: \"Tools\",\n    lines: result.snapshot.tools.length === 0 ? [\"No tool calls detected in this time range.\"] : undefined,\n    items: result.snapshot.tools.map(toolItem),\n    viewportSize: \"adaptive\" as const,\n    hint: \"back\" as const,\n  };\n}\n\nfunction toolItem(tool: ToolStats) {\n  return {\n    id: tool.name,\n    label: safeDisplayText(tool.name),\n    statusText: `${tool.count} \u00B7 ${tool.errors} errors`,\n    searchText: tool.models.map(modelLabel).join(\" \"),\n    details: [\n      metric(\"Calls\", tool.count),\n      metric(\"Errors\", tool.errors),\n      `Average duration: ${formatDecimal(tool.averageDurationMs)} ms`,\n      \"\",\n      \"By model\",\n      ...tool.models.map((model) => `${modelLabel(model)}: ${model.count}`),\n      \"\",\n      `Last detected: ${formatTimestamp(tool.lastOccurredAtMs)}`,\n    ],\n  };\n}\n\nfunction reliabilityLines(result: AnalyticsLoadResult): string[] {\n  if (result.kind === \"unavailable\") return [result.message];\n  const value = result.snapshot.reliability;\n  return [\n    \"Observed provider errors only; provider-internal failures may be invisible.\",\n    \"\",\n    metric(\"HTTP 429\", value.http429),\n    metric(\"HTTP 5xx\", value.http5xx),\n    metric(\"DNS\", value.categories.dns),\n    metric(\"Connection timeout\", value.categories.timeout),\n    metric(\"Connection refused\", value.categories.connection_refused),\n    metric(\"Connection reset\", value.categories.connection_reset),\n    metric(\"TLS\", value.categories.tls),\n    metric(\"Other network\", value.categories.network_other),\n    metric(\"Other provider\", value.categories.provider_other),\n    \"\",\n    metric(\"Recovered\", value.recovered),\n    metric(\"Terminal failures\", value.terminal),\n  ];\n}\n\nfunction responseLines(result: AnalyticsLoadResult): string[] {\n  if (result.kind === \"unavailable\") return [result.message];\n  const value = result.snapshot.responses;\n  return [\n    metric(\"Cycles\", value.count),\n    metric(\"LLM calls\", value.llmCalls),\n    metric(\"Average\", formatDecimal(value.average)),\n    metric(\"Median\", formatDecimal(value.median)),\n    metric(\"P95\", value.p95),\n    metric(\"Maximum\", value.maximum),\n    \"\",\n    \"Calls per response\",\n    metric(\"1 call\", value.distribution.one),\n    metric(\"2\u20133 calls\", value.distribution.twoToThree),\n    metric(\"4\u20136 calls\", value.distribution.fourToSix),\n    metric(\"7+ calls\", value.distribution.sevenPlus),\n  ];\n}\n\nfunction privacyLines(state: AnalyticsMenuState): string[] {\n  return [\n    \"Local analytics files:\",\n    safeDisplayText(state.path),\n    \"\",\n    \"Stored: timestamps, extension-generated record IDs, model/provider IDs, thinking level, tool and skill names, durations, counts, HTTP statuses, and classified errors.\",\n    \"Not stored: prompts, responses, thinking, tool arguments/results, raw errors, headers, cwd/file paths, session identity, or credentials.\",\n    \"\",\n    \"No database server, cloud connection, or other remote telemetry is used.\",\n    \"Analytics are non-critical derived metadata; a failed local write may be dropped.\",\n  ];\n}\n\nfunction metric(label: string, value: string | number): string {\n  return `${label.padEnd(24)} ${value}`;\n}\n\nfunction formatDecimal(value: number): string {\n  return Number.isInteger(value) ? String(value) : value.toFixed(2).replace(/0+$/u, \"\").replace(/\\.$/u, \"\");\n}\n\nfunction formatTimestamp(value: number): string {\n  return new Date(value).toLocaleString();\n}\n\nfunction modelLabel(model: { provider?: string; model?: string }): string {\n  if (!model.provider && !model.model) return \"unknown\";\n  return safeDisplayText(`${model.provider ?? \"unknown\"}/${model.model ?? \"unknown\"}`);\n}\n\nfunction safeDisplayText(value: unknown): string {\n  return Array.from(stripVTControlCharacters(String(value)), (character) => {\n    const codePoint = character.codePointAt(0) ?? 0;\n    return codePoint <= 0x1f || (codePoint >= 0x7f && codePoint <= 0x9f) ? \" \" : character;\n  }).join(\"\");\n}\n\nfunction isRangeId(value: string): value is TimeRangeId {\n  return value === \"today\" || value === \"7d\" || value === \"30d\" || value === \"all\";\n}\n\nfunction safeErrorMessage(_error: unknown): string {\n  return \"The local analytics query could not be completed. Try again; existing data was not changed.\";\n}\n", "import type { ProviderErrorCategory, SettledRun } from \"../types.js\";\n\nexport type TimeRangeId = \"today\" | \"7d\" | \"30d\" | \"all\";\nexport interface TimeRange {\n  id?: TimeRangeId;\n  fromMs: number;\n  toMs: number;\n}\n\nexport interface OverviewStats {\n  responseCycles: number;\n  llmCalls: number;\n  callsPerResponse: number;\n  p95CallsPerResponse: number;\n  toolCalls: number;\n  toolErrors: number;\n  skillActivations: number;\n  providerErrors: number;\n  recoveredErrors: number;\n}\n\nexport interface ModelCount {\n  provider?: string;\n  model?: string;\n  count: number;\n}\n\nexport interface SkillStats {\n  name: string;\n  count: number;\n  modelInitiated: number;\n  userInitiated: number;\n  lastOccurredAtMs: number;\n  models: ModelCount[];\n}\n\nexport interface ToolStats {\n  name: string;\n  count: number;\n  errors: number;\n  averageDurationMs: number;\n  lastOccurredAtMs: number;\n  models: ModelCount[];\n}\n\nexport interface ReliabilityStats {\n  http429: number;\n  http5xx: number;\n  recovered: number;\n  terminal: number;\n  categories: Record<ProviderErrorCategory, number>;\n}\n\nexport interface ResponseStats {\n  count: number;\n  llmCalls: number;\n  average: number;\n  median: number;\n  p95: number;\n  maximum: number;\n  distribution: { one: number; twoToThree: number; fourToSix: number; sevenPlus: number };\n}\n\nexport interface AnalyticsSnapshot {\n  overview: OverviewStats;\n  skills: SkillStats[];\n  tools: ToolStats[];\n  reliability: ReliabilityStats;\n  responses: ResponseStats;\n}\n\nconst DAY_MS = 24 * 60 * 60 * 1_000;\nconst ERROR_CATEGORIES: readonly ProviderErrorCategory[] = [\n  \"dns\",\n  \"timeout\",\n  \"connection_refused\",\n  \"connection_reset\",\n  \"tls\",\n  \"network_other\",\n  \"provider_other\",\n];\n\nexport function resolveTimeRange(id: TimeRangeId, now = Date.now()): TimeRange {\n  let fromMs = 0;\n  if (id === \"today\") {\n    const date = new Date(now);\n    fromMs = new Date(date.getFullYear(), date.getMonth(), date.getDate()).getTime();\n  } else if (id === \"7d\") fromMs = now - 7 * DAY_MS;\n  else if (id === \"30d\") fromMs = now - 30 * DAY_MS;\n  return { id, fromMs, toMs: now + 1 };\n}\n\nexport async function querySnapshot(\n  runs: AsyncIterable<SettledRun> | Iterable<SettledRun>,\n  range: TimeRange,\n  signal?: AbortSignal,\n): Promise<AnalyticsSnapshot> {\n  const generationCounts: number[] = [];\n  const seenRunIds = new Set<string>();\n  const skills = new Map<string, SkillStats>();\n  const tools = new Map<string, ToolStats & { totalDurationMs: number }>();\n  const categories = Object.fromEntries(ERROR_CATEGORIES.map((category) => [category, 0])) as Record<\n    ProviderErrorCategory,\n    number\n  >;\n  let toolErrors = 0;\n  let providerErrors = 0;\n  let recoveredErrors = 0;\n  let http429 = 0;\n  let http5xx = 0;\n  let terminal = 0;\n\n  for await (const run of runs) {\n    throwIfAborted(signal);\n    if (seenRunIds.has(run.id)) continue;\n    seenRunIds.add(run.id);\n    if (run.startedAtMs < range.fromMs || run.startedAtMs >= range.toMs) continue;\n    generationCounts.push(run.generations.length);\n    toolErrors += run.toolErrorCount;\n    providerErrors += run.providerErrorCount;\n    recoveredErrors += run.recoveredErrorCount;\n\n    for (const skill of run.skills) {\n      const item = skills.get(skill.name) ?? {\n        name: skill.name,\n        count: 0,\n        modelInitiated: 0,\n        userInitiated: 0,\n        lastOccurredAtMs: 0,\n        models: [],\n      };\n      item.count += 1;\n      if (skill.initiatedBy === \"user\") item.userInitiated += 1;\n      else item.modelInitiated += 1;\n      item.lastOccurredAtMs = Math.max(item.lastOccurredAtMs, skill.occurredAtMs);\n      mergeModelCount(item.models, {\n        provider: skill.provider,\n        model: skill.model,\n        count: 1,\n      });\n      skills.set(skill.name, item);\n    }\n\n    for (const tool of run.tools) {\n      const item = tools.get(tool.name) ?? {\n        name: tool.name,\n        count: 0,\n        errors: 0,\n        averageDurationMs: 0,\n        totalDurationMs: 0,\n        lastOccurredAtMs: 0,\n        models: [],\n      };\n      item.count += 1;\n      item.errors += tool.isError ? 1 : 0;\n      item.totalDurationMs += tool.durationMs ?? 0;\n      item.averageDurationMs = item.totalDurationMs / item.count;\n      item.lastOccurredAtMs = Math.max(item.lastOccurredAtMs, tool.startedAtMs);\n      mergeModelCount(item.models, {\n        provider: tool.provider,\n        model: tool.model,\n        count: 1,\n      });\n      tools.set(tool.name, item);\n    }\n\n    for (const error of run.providerErrors) {\n      categories[error.category] += 1;\n      terminal += error.terminal ? 1 : 0;\n    }\n    for (const generation of run.generations) {\n      for (const response of generation.responses) {\n        if (response.status === 429) http429 += 1;\n        if (response.status >= 500 && response.status < 600) http5xx += 1;\n      }\n    }\n  }\n\n  const responses = responseStatistics(generationCounts);\n  return {\n    overview: {\n      responseCycles: responses.count,\n      llmCalls: responses.llmCalls,\n      callsPerResponse: responses.average,\n      p95CallsPerResponse: responses.p95,\n      toolCalls: sum([...tools.values()].map(({ count }) => count)),\n      toolErrors,\n      skillActivations: sum([...skills.values()].map(({ count }) => count)),\n      providerErrors,\n      recoveredErrors,\n    },\n    skills: [...skills.values()]\n      .map((item) => ({ ...item, models: sortModels(item.models) }))\n      .sort((left, right) => right.count - left.count || left.name.localeCompare(right.name)),\n    tools: [...tools.values()]\n      .map(({ totalDurationMs: _, ...item }) => ({ ...item, models: sortModels(item.models) }))\n      .sort((left, right) => right.count - left.count || left.name.localeCompare(right.name)),\n    reliability: {\n      http429,\n      http5xx,\n      recovered: recoveredErrors,\n      terminal,\n      categories,\n    },\n    responses,\n  };\n}\n\nfunction responseStatistics(generationCounts: number[]): ResponseStats {\n  const sorted = [...generationCounts].sort((left, right) => left - right);\n  const count = sorted.length;\n  const llmCalls = sum(sorted);\n  const nearestRank = (percentile: number) =>\n    count === 0 ? 0 : (sorted[Math.max(0, Math.ceil(percentile * count) - 1)] ?? 0);\n  const median =\n    count === 0\n      ? 0\n      : count % 2 === 1\n        ? (sorted[Math.floor(count / 2)] ?? 0)\n        : ((sorted[count / 2 - 1] ?? 0) + (sorted[count / 2] ?? 0)) / 2;\n  return {\n    count,\n    llmCalls,\n    average: count > 0 ? llmCalls / count : 0,\n    median,\n    p95: nearestRank(0.95),\n    maximum: sorted.at(-1) ?? 0,\n    distribution: {\n      one: sorted.filter((value) => value === 1).length,\n      twoToThree: sorted.filter((value) => value >= 2 && value <= 3).length,\n      fourToSix: sorted.filter((value) => value >= 4 && value <= 6).length,\n      sevenPlus: sorted.filter((value) => value >= 7).length,\n    },\n  };\n}\n\nfunction mergeModelCount(models: ModelCount[], next: ModelCount): void {\n  const existing = models.find(({ provider, model }) => provider === next.provider && model === next.model);\n  if (existing) existing.count += next.count;\n  else models.push(next);\n}\n\nfunction sortModels(models: ModelCount[]): ModelCount[] {\n  return models.sort(\n    (left, right) =>\n      right.count - left.count ||\n      `${left.provider ?? \"\"}/${left.model ?? \"\"}`.localeCompare(`${right.provider ?? \"\"}/${right.model ?? \"\"}`),\n  );\n}\n\nfunction throwIfAborted(signal?: AbortSignal): void {\n  if (signal?.aborted) throw signal.reason ?? new DOMException(\"Analytics query aborted\", \"AbortError\");\n}\n\nfunction sum(values: readonly number[]): number {\n  return values.reduce((total, value) => total + value, 0);\n}\n", "import { realpath } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport type { InputSource } from \"@earendil-works/pi-coding-agent\";\n\nexport interface AvailableSkill {\n  name: string;\n  filePath: string;\n}\n\nexport interface PendingExplicitSkill {\n  name: string;\n  observedAtMs: number;\n  source: \"interactive\" | \"rpc\";\n}\n\nexport function explicitSkillName(text: string): string | undefined {\n  return text.match(/^\\/skill:([a-z0-9](?:[a-z0-9-]{0,62}[a-z0-9])?)(?:\\s|$)/u)?.[1];\n}\n\nexport class SkillTracker {\n  private pending: PendingExplicitSkill | undefined;\n  private readonly skillByPath = new Map<string, string>();\n  private readonly availableNames = new Set<string>();\n\n  constructor(\n    private readonly cwd: string,\n    private readonly canonicalize: (filePath: string) => Promise<string> = realpath,\n  ) {}\n\n  observeInput(text: string, source: InputSource, now: number): void {\n    if (source === \"extension\") return;\n    const name = explicitSkillName(text);\n    this.pending = name ? { name, observedAtMs: now, source } : undefined;\n  }\n\n  consumeExplicitSkill(): PendingExplicitSkill | undefined {\n    const pending = this.pending;\n    this.pending = undefined;\n    return pending;\n  }\n\n  clearPending(): void {\n    this.pending = undefined;\n  }\n\n  hasAvailableSkill(name: string): boolean {\n    return this.availableNames.has(name);\n  }\n\n  async setAvailableSkills(skills: readonly AvailableSkill[]): Promise<void> {\n    this.skillByPath.clear();\n    this.availableNames.clear();\n    const seenNames = new Set<string>();\n    for (const skill of skills) {\n      if (seenNames.has(skill.name)) continue;\n      seenNames.add(skill.name);\n      this.availableNames.add(skill.name);\n      const canonical = await this.canonicalize(skill.filePath).catch(() => path.resolve(this.cwd, skill.filePath));\n      this.skillByPath.set(canonical, skill.name);\n    }\n  }\n\n  async matchSuccessfulRead(input: {\n    toolName: string;\n    input: unknown;\n    isError: boolean;\n  }): Promise<string | undefined> {\n    if (input.toolName !== \"read\" || input.isError || !isRecord(input.input)) return undefined;\n    const rawPath = input.input.path;\n    if (typeof rawPath !== \"string\" || rawPath.length === 0) return undefined;\n    const normalized = rawPath.startsWith(\"@\") ? rawPath.slice(1) : rawPath;\n    const absolute = path.resolve(this.cwd, normalized);\n    const canonical = await this.canonicalize(absolute).catch(() => absolute);\n    return this.skillByPath.get(canonical);\n  }\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n  return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n", "import { randomUUID } from \"node:crypto\";\nimport { createReadStream, type Dirent } from \"node:fs\";\nimport { chmod, lstat, mkdir, open, readdir, readFile, rename, rm, rmdir, unlink, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport type { SettledRun } from \"../types.js\";\nimport { AnalyticsStorageFormatError, decodeStoredRun, encodeStoredRun, MAX_STORED_RUN_BYTES } from \"./format.js\";\n\nconst GENERATION_PATTERN = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/u;\nconst DEFAULT_WRITE_TIMEOUT_MS = 5_000;\nconst YIELD_EVERY_RECORDS = 100;\n\nexport interface ClearAnalyticsResult {\n  cleanupIncomplete: boolean;\n}\n\nexport class AnalyticsGenerationChangedError extends Error {\n  constructor() {\n    super(\"The active analytics generation changed during the read.\");\n    this.name = \"AnalyticsGenerationChangedError\";\n  }\n}\n\nexport class AnalyticsRunFiles {\n  private readonly createId: () => string;\n  private readonly writeTimeoutMs: number;\n  private readonly beforeAppend?: (generation: string, signal: AbortSignal) => Promise<void>;\n  private readonly beforeCleanupEntry?: (signal?: AbortSignal) => Promise<void>;\n  private readonly beforeReadFile?: (signal?: AbortSignal) => Promise<void>;\n  private writerId: string;\n  private mutationTail: Promise<void> = Promise.resolve();\n  private readonly lifecycle = new AbortController();\n  private closed = false;\n\n  constructor(\n    readonly path: string,\n    options: {\n      createId?: () => string;\n      writeTimeoutMs?: number;\n      beforeAppend?: (generation: string, signal: AbortSignal) => Promise<void>;\n      beforeCleanupEntry?: (signal?: AbortSignal) => Promise<void>;\n      beforeReadFile?: (signal?: AbortSignal) => Promise<void>;\n    } = {},\n  ) {\n    this.createId = options.createId ?? randomUUID;\n    this.writeTimeoutMs = options.writeTimeoutMs ?? DEFAULT_WRITE_TIMEOUT_MS;\n    this.beforeAppend = options.beforeAppend;\n    this.beforeCleanupEntry = options.beforeCleanupEntry;\n    this.beforeReadFile = options.beforeReadFile;\n    this.writerId = validCreatedId(this.createId());\n  }\n\n  append(run: SettledRun, signal?: AbortSignal): Promise<void> {\n    if (this.closed) return Promise.reject(new Error(\"Analytics storage is closed.\"));\n    const frame = encodeStoredRun(run);\n    return this.enqueueMutation(() =>\n      withDeadline(signal, this.lifecycle.signal, this.writeTimeoutMs, (operationSignal) =>\n        this.appendFrame(frame, operationSignal),\n      ),\n    );\n  }\n\n  async *read(signal?: AbortSignal): AsyncIterable<SettledRun> {\n    throwIfAborted(signal);\n    const generation = await this.readOrCreateGeneration(signal);\n    const directory = this.generationPath(generation);\n    let entries: Dirent[];\n    try {\n      entries = await readdir(directory, { withFileTypes: true });\n    } catch (error) {\n      if (isNodeError(error) && error.code === \"ENOENT\") {\n        await this.assertGenerationUnchanged(generation, signal);\n        throw new AnalyticsGenerationChangedError();\n      }\n      throw error;\n    }\n    let count = 0;\n    for (const entry of entries.sort((left, right) => left.name.localeCompare(right.name))) {\n      throwIfAborted(signal);\n      if (!entry.name.endsWith(\".jsonl\")) continue;\n      const filePath = path.join(directory, entry.name);\n      try {\n        await this.beforeReadFile?.(signal);\n        throwIfAborted(signal);\n        await assertPrivateRegularFile(filePath);\n        for await (const run of readFrames(filePath, signal)) {\n          yield run;\n          count += 1;\n          if (count % YIELD_EVERY_RECORDS === 0) await yieldToEventLoop(signal);\n        }\n      } catch (error) {\n        if (isNodeError(error) && error.code === \"ENOENT\") {\n          await this.assertGenerationUnchanged(generation, signal);\n          throw new AnalyticsGenerationChangedError();\n        }\n        throw error;\n      }\n    }\n    await this.assertGenerationUnchanged(generation, signal);\n  }\n\n  clear(signal?: AbortSignal): Promise<ClearAnalyticsResult> {\n    if (this.closed) return Promise.reject(new Error(\"Analytics storage is closed.\"));\n    let result: ClearAnalyticsResult = { cleanupIncomplete: false };\n    return this.enqueueMutation(() =>\n      withLinkedSignals(signal, this.lifecycle.signal, async (operationSignal) => {\n        throwIfAborted(operationSignal);\n        await this.readOrCreateGeneration(operationSignal);\n        const next = validCreatedId(this.createId());\n        await this.publishGeneration(next);\n        this.writerId = validCreatedId(this.createId());\n        const current = await readGenerationMarker(path.join(this.path, \"current\"));\n        await ensurePrivateDirectory(this.generationPath(current));\n        if (!(await this.cleanupObsoleteGenerations(operationSignal))) {\n          result = { cleanupIncomplete: true };\n        }\n      }),\n    ).then(() => result);\n  }\n\n  async close(): Promise<void> {\n    if (this.closed) return;\n    this.closed = true;\n    this.lifecycle.abort(new DOMException(\"Analytics storage closed\", \"AbortError\"));\n    await this.mutationTail.catch(() => undefined);\n  }\n\n  private enqueueMutation(operation: () => Promise<void>): Promise<void> {\n    const result = this.mutationTail.then(operation);\n    this.mutationTail = result.catch(() => undefined);\n    return result;\n  }\n\n  private async appendFrame(frame: string, signal: AbortSignal): Promise<void> {\n    throwIfAborted(signal);\n    let obsoleteDirectory: string | undefined;\n    for (let attempt = 0; attempt < 3; attempt += 1) {\n      const generation = await this.readOrCreateGeneration(signal);\n      const directory = this.generationPath(generation);\n      await ensurePrivateDirectory(directory);\n      const filePath = path.join(directory, `${this.writerId}.jsonl`);\n      await assertOptionalPrivateRegularFile(filePath);\n      throwIfAborted(signal);\n      await this.beforeAppend?.(generation, signal);\n      throwIfAborted(signal);\n      try {\n        await writeFile(filePath, frame, {\n          encoding: \"utf8\",\n          flag: \"a\",\n          mode: 0o600,\n          signal,\n        });\n        if (process.platform !== \"win32\") await chmod(filePath, 0o600);\n        const current = await readGenerationMarker(path.join(this.path, \"current\"), signal);\n        if (current === generation) {\n          if (obsoleteDirectory) {\n            await cleanupGeneration(obsoleteDirectory, signal).catch(() => undefined);\n          }\n          return;\n        }\n        obsoleteDirectory = directory;\n      } catch (error) {\n        this.writerId = validCreatedId(this.createId());\n        throwIfAborted(signal);\n        if (!isNodeError(error) || error.code !== \"ENOENT\") throw error;\n      }\n    }\n    throw new AnalyticsGenerationChangedError();\n  }\n\n  private async readOrCreateGeneration(signal?: AbortSignal): Promise<string> {\n    throwIfAborted(signal);\n    await ensurePrivateDirectory(this.path);\n    await ensurePrivateDirectory(path.join(this.path, \"generations\"));\n    const markerPath = path.join(this.path, \"current\");\n    for (let attempt = 0; attempt < 3; attempt += 1) {\n      let generation: string;\n      try {\n        generation = await readGenerationMarker(markerPath, signal);\n      } catch (error) {\n        if (!isNodeError(error) || error.code !== \"ENOENT\") throw error;\n        generation = validCreatedId(this.createId());\n        throwIfAborted(signal);\n        try {\n          await createPrivateFile(markerPath, `${generation}\\n`);\n        } catch (createError) {\n          if (!isNodeError(createError) || createError.code !== \"EEXIST\") throw createError;\n          generation = await readGenerationMarker(markerPath, signal);\n        }\n      }\n      await ensurePrivateDirectory(this.generationPath(generation));\n      const current = await readGenerationMarker(markerPath, signal);\n      if (current === generation) return generation;\n    }\n    throw new AnalyticsGenerationChangedError();\n  }\n\n  private async publishGeneration(generation: string): Promise<void> {\n    const markerPath = path.join(this.path, \"current\");\n    const temporaryPath = path.join(this.path, `.current.${validCreatedId(this.createId())}.tmp`);\n    await createPrivateFile(temporaryPath, `${generation}\\n`);\n    try {\n      await rename(temporaryPath, markerPath);\n      if (process.platform !== \"win32\") await chmod(markerPath, 0o600);\n    } catch (error) {\n      await rm(temporaryPath, { force: true }).catch(() => undefined);\n      throw error;\n    }\n  }\n\n  private async cleanupObsoleteGenerations(signal?: AbortSignal): Promise<boolean> {\n    let complete = true;\n    const root = path.join(this.path, \"generations\");\n    for (const entry of await readdir(root, { withFileTypes: true })) {\n      const active = await readGenerationMarker(path.join(this.path, \"current\"));\n      if (entry.name === active) continue;\n      if (!entry.isDirectory() || !GENERATION_PATTERN.test(entry.name)) {\n        complete = false;\n        continue;\n      }\n      try {\n        await cleanupGeneration(path.join(root, entry.name), signal, this.beforeCleanupEntry);\n      } catch {\n        complete = false;\n        if (signal?.aborted) break;\n      }\n    }\n    const active = await readGenerationMarker(path.join(this.path, \"current\"));\n    const remaining = await readdir(root, { withFileTypes: true });\n    return complete && remaining.every((entry) => entry.isDirectory() && entry.name === active);\n  }\n\n  private async assertGenerationUnchanged(generation: string, signal?: AbortSignal): Promise<void> {\n    const current = await readGenerationMarker(path.join(this.path, \"current\"), signal);\n    if (current !== generation) throw new AnalyticsGenerationChangedError();\n  }\n\n  private generationPath(generation: string): string {\n    return path.join(this.path, \"generations\", generation);\n  }\n}\n\nasync function* readFrames(filePath: string, signal?: AbortSignal): AsyncIterable<SettledRun> {\n  let pending = \"\";\n  const stream = createReadStream(filePath, { encoding: \"utf8\", signal });\n  for await (const chunk of stream) {\n    throwIfAborted(signal);\n    pending += String(chunk);\n    while (true) {\n      const newline = pending.indexOf(\"\\n\");\n      if (newline < 0) break;\n      const line = pending.slice(0, newline);\n      pending = pending.slice(newline + 1);\n      if (!line) continue;\n      yield decodeStoredRun(line);\n    }\n    if (Buffer.byteLength(pending) > MAX_STORED_RUN_BYTES) {\n      throw new AnalyticsStorageFormatError(\"Analytics record is too large to read safely.\");\n    }\n  }\n  // A writer always terminates complete frames with a newline. An unterminated tail is a\n  // crash residue and is ignored; this writer file will not be reused after its process exits.\n}\n\nasync function readGenerationMarker(markerPath: string, signal?: AbortSignal): Promise<string> {\n  await assertPrivateRegularFile(markerPath);\n  throwIfAborted(signal);\n  const value = (await readFile(markerPath, { encoding: \"utf8\", signal })).trim();\n  if (!GENERATION_PATTERN.test(value)) {\n    throw new AnalyticsStorageFormatError(\"Analytics generation marker is invalid.\");\n  }\n  return value;\n}\n\nasync function ensurePrivateDirectory(directoryPath: string): Promise<void> {\n  try {\n    const metadata = await lstat(directoryPath);\n    if (!metadata.isDirectory() || metadata.isSymbolicLink()) {\n      throw new Error(\"Analytics storage paths must be regular directories, not links.\");\n    }\n  } catch (error) {\n    if (!isNodeError(error) || error.code !== \"ENOENT\") throw error;\n    await mkdir(directoryPath, { recursive: true, mode: 0o700 });\n    const metadata = await lstat(directoryPath);\n    if (!metadata.isDirectory() || metadata.isSymbolicLink()) {\n      throw new Error(\"Analytics storage paths must be regular directories, not links.\");\n    }\n  }\n  if (process.platform !== \"win32\") await chmod(directoryPath, 0o700);\n}\n\nasync function assertOptionalPrivateRegularFile(filePath: string): Promise<void> {\n  try {\n    await assertPrivateRegularFile(filePath);\n  } catch (error) {\n    if (isNodeError(error) && error.code === \"ENOENT\") return;\n    throw error;\n  }\n}\n\nasync function assertPrivateRegularFile(filePath: string): Promise<void> {\n  const metadata = await lstat(filePath);\n  if (!metadata.isFile() || metadata.isSymbolicLink()) {\n    throw new Error(\"Analytics storage files must be regular files, not links.\");\n  }\n  if (process.platform !== \"win32\") await chmod(filePath, 0o600);\n}\n\nasync function createPrivateFile(filePath: string, content: string): Promise<void> {\n  const handle = await open(filePath, \"wx\", 0o600);\n  try {\n    await handle.writeFile(content, \"utf8\");\n    await handle.sync();\n  } finally {\n    await handle.close();\n  }\n}\n\nasync function cleanupGeneration(\n  directoryPath: string,\n  signal?: AbortSignal,\n  beforeEntry?: (signal?: AbortSignal) => Promise<void>,\n): Promise<void> {\n  throwIfAborted(signal);\n  let entries: Dirent[];\n  try {\n    entries = await readdir(directoryPath, { withFileTypes: true });\n  } catch (error) {\n    if (isNodeError(error) && error.code === \"ENOENT\") return;\n    throw error;\n  }\n  for (const entry of entries) {\n    throwIfAborted(signal);\n    await beforeEntry?.(signal);\n    throwIfAborted(signal);\n    if (!entry.isFile() || !entry.name.endsWith(\".jsonl\")) {\n      throw new Error(\"Analytics generation contains an unexpected storage entry.\");\n    }\n    await unlink(path.join(directoryPath, entry.name));\n  }\n  throwIfAborted(signal);\n  await rmdir(directoryPath);\n}\n\nasync function withLinkedSignals<T>(\n  callerSignal: AbortSignal | undefined,\n  lifecycleSignal: AbortSignal,\n  operation: (signal: AbortSignal) => Promise<T>,\n): Promise<T> {\n  throwIfAborted(callerSignal);\n  throwIfAborted(lifecycleSignal);\n  const controller = new AbortController();\n  const abort = (signal: AbortSignal) =>\n    controller.abort(signal.reason ?? new DOMException(\"Analytics operation aborted\", \"AbortError\"));\n  const callerAbort = () => callerSignal && abort(callerSignal);\n  const lifecycleAbort = () => abort(lifecycleSignal);\n  callerSignal?.addEventListener(\"abort\", callerAbort, { once: true });\n  lifecycleSignal.addEventListener(\"abort\", lifecycleAbort, { once: true });\n  try {\n    return await operation(controller.signal);\n  } finally {\n    callerSignal?.removeEventListener(\"abort\", callerAbort);\n    lifecycleSignal.removeEventListener(\"abort\", lifecycleAbort);\n  }\n}\n\nasync function withDeadline<T>(\n  callerSignal: AbortSignal | undefined,\n  lifecycleSignal: AbortSignal,\n  timeoutMs: number,\n  operation: (signal: AbortSignal) => Promise<T>,\n): Promise<T> {\n  throwIfAborted(callerSignal);\n  throwIfAborted(lifecycleSignal);\n  const controller = new AbortController();\n  const abort = (signal: AbortSignal) =>\n    controller.abort(signal.reason ?? new DOMException(\"Analytics operation aborted\", \"AbortError\"));\n  const callerAbort = () => callerSignal && abort(callerSignal);\n  const lifecycleAbort = () => abort(lifecycleSignal);\n  callerSignal?.addEventListener(\"abort\", callerAbort, { once: true });\n  lifecycleSignal.addEventListener(\"abort\", lifecycleAbort, { once: true });\n  const timer = setTimeout(\n    () => controller.abort(new DOMException(\"Analytics write timed out\", \"TimeoutError\")),\n    Math.max(1, timeoutMs),\n  );\n  try {\n    return await operation(controller.signal);\n  } catch (error) {\n    if (\n      controller.signal.aborted &&\n      error instanceof Error &&\n      error.name === \"AbortError\" &&\n      error.cause === controller.signal.reason\n    ) {\n      throw controller.signal.reason;\n    }\n    throw error;\n  } finally {\n    clearTimeout(timer);\n    callerSignal?.removeEventListener(\"abort\", callerAbort);\n    lifecycleSignal.removeEventListener(\"abort\", lifecycleAbort);\n  }\n}\n\nasync function yieldToEventLoop(signal?: AbortSignal): Promise<void> {\n  await new Promise<void>((resolve) => setImmediate(resolve));\n  throwIfAborted(signal);\n}\n\nfunction validCreatedId(value: string): string {\n  if (!GENERATION_PATTERN.test(value)) throw new Error(\"Analytics storage received an invalid ID.\");\n  return value;\n}\n\nfunction throwIfAborted(signal?: AbortSignal): void {\n  if (signal?.aborted) {\n    throw signal.reason ?? new DOMException(\"Analytics operation aborted\", \"AbortError\");\n  }\n}\n\nfunction isNodeError(error: unknown): error is NodeJS.ErrnoException {\n  return error instanceof Error && \"code\" in error;\n}\n", "import type {\n  GenerationOutcome,\n  GenerationRecord,\n  ProviderErrorCategory,\n  ProviderErrorRecord,\n  ProviderResponseRecord,\n  RunOutcome,\n  SettledRun,\n  SkillActivationRecord,\n  ToolCallRecord,\n} from \"../types.js\";\n\nexport const MAX_STORED_RUN_BYTES = 1024 * 1024;\nconst MAX_STRING_LENGTH = 4096;\nconst MAX_NESTED_RECORDS = 20_000;\nconst TRIGGER_SOURCES = [\"interactive\", \"rpc\", \"extension\", \"unknown\"] as const;\nconst RUN_OUTCOMES = [\"success\", \"recovered_success\", \"error\", \"aborted\", \"length\", \"interrupted\"] as const;\nconst GENERATION_OUTCOMES = [\"pending\", \"stop\", \"tool_use\", \"error\", \"aborted\", \"length\", \"interrupted\"] as const;\nconst ERROR_CATEGORIES = [\n  \"dns\",\n  \"timeout\",\n  \"connection_refused\",\n  \"connection_reset\",\n  \"tls\",\n  \"network_other\",\n  \"provider_other\",\n] as const;\n\nexport class AnalyticsStorageFormatError extends Error {\n  constructor(message: string, options: { cause?: unknown } = {}) {\n    super(message, options);\n    this.name = \"AnalyticsStorageFormatError\";\n  }\n}\n\nexport function encodeStoredRun(run: SettledRun): string {\n  const encoded = `${JSON.stringify({\n    formatVersion: 1,\n    run: parseRun(run, { remaining: MAX_NESTED_RECORDS }),\n  })}\\n`;\n  if (Buffer.byteLength(encoded) > MAX_STORED_RUN_BYTES) {\n    throw new AnalyticsStorageFormatError(\"Analytics record is too large to store safely.\");\n  }\n  return encoded;\n}\n\nexport function decodeStoredRun(line: string): SettledRun {\n  if (Buffer.byteLength(line) > MAX_STORED_RUN_BYTES) {\n    throw new AnalyticsStorageFormatError(\"Analytics record is too large to read safely.\");\n  }\n  let value: unknown;\n  try {\n    value = JSON.parse(line);\n  } catch (error) {\n    throw new AnalyticsStorageFormatError(\"Analytics record contains invalid JSON.\", {\n      cause: error,\n    });\n  }\n  const envelope = asRecord(value, \"analytics record\");\n  if (envelope.formatVersion !== 1) {\n    throw new AnalyticsStorageFormatError(\"Analytics record uses an unsupported format version.\");\n  }\n  return parseRun(envelope.run, { remaining: MAX_NESTED_RECORDS });\n}\n\ninterface ParseBudget {\n  remaining: number;\n}\n\nfunction parseRun(value: unknown, budget: ParseBudget): SettledRun {\n  const run = asRecord(value, \"run\");\n  return {\n    id: requiredString(run.id, \"run.id\"),\n    startedAtMs: timestampValue(run.startedAtMs, \"run.startedAtMs\"),\n    finishedAtMs: timestampValue(run.finishedAtMs, \"run.finishedAtMs\"),\n    durationMs: durationValue(run.durationMs, \"run.durationMs\"),\n    triggerSource: enumValue(run.triggerSource, TRIGGER_SOURCES, \"run.triggerSource\"),\n    ...optionalProperty(\"initialProvider\", optionalString(run.initialProvider, \"run.initialProvider\")),\n    ...optionalProperty(\"initialModel\", optionalString(run.initialModel, \"run.initialModel\")),\n    outcome: enumValue(run.outcome, RUN_OUTCOMES, \"run.outcome\") as RunOutcome,\n    attemptCount: boundedCount(run.attemptCount, \"run.attemptCount\"),\n    generations: boundedArray(run.generations, \"run.generations\", budget).map((item, index) =>\n      parseGeneration(item, index, budget),\n    ),\n    tools: boundedArray(run.tools, \"run.tools\", budget).map(parseTool),\n    skills: boundedArray(run.skills, \"run.skills\", budget).map(parseSkill),\n    providerErrors: boundedArray(run.providerErrors, \"run.providerErrors\", budget).map(parseProviderError),\n    toolErrorCount: boundedCount(run.toolErrorCount, \"run.toolErrorCount\"),\n    providerErrorCount: boundedCount(run.providerErrorCount, \"run.providerErrorCount\"),\n    recoveredErrorCount: boundedCount(run.recoveredErrorCount, \"run.recoveredErrorCount\"),\n  };\n}\n\nfunction parseGeneration(value: unknown, index: number, budget: ParseBudget): GenerationRecord {\n  const item = asRecord(value, `run.generations[${index}]`);\n  const prefix = `run.generations[${index}]`;\n  return {\n    id: requiredString(item.id, `${prefix}.id`),\n    ordinal: boundedCount(item.ordinal, `${prefix}.ordinal`),\n    ...optionalProperty(\"provider\", optionalString(item.provider, `${prefix}.provider`)),\n    ...optionalProperty(\"model\", optionalString(item.model, `${prefix}.model`)),\n    ...optionalProperty(\"thinkingLevel\", optionalString(item.thinkingLevel, `${prefix}.thinkingLevel`)),\n    startedAtMs: timestampValue(item.startedAtMs, `${prefix}.startedAtMs`),\n    ...optionalProperty(\"finishedAtMs\", optionalTimestamp(item.finishedAtMs, `${prefix}.finishedAtMs`)),\n    ...optionalProperty(\"durationMs\", optionalDuration(item.durationMs, `${prefix}.durationMs`)),\n    ...optionalProperty(\"stopReason\", optionalString(item.stopReason, `${prefix}.stopReason`)),\n    outcome: enumValue(item.outcome, GENERATION_OUTCOMES, `${prefix}.outcome`) as GenerationOutcome,\n    responses: boundedArray(item.responses, `${prefix}.responses`, budget).map(parseProviderResponse),\n  };\n}\n\nfunction parseProviderResponse(value: unknown, index: number): ProviderResponseRecord {\n  const item = asRecord(value, `provider response ${index}`);\n  return {\n    ordinal: boundedCount(item.ordinal, \"providerResponse.ordinal\"),\n    occurredAtMs: timestampValue(item.occurredAtMs, \"providerResponse.occurredAtMs\"),\n    status: boundedInteger(item.status, \"providerResponse.status\", 999),\n  };\n}\n\nfunction parseTool(value: unknown, index: number): ToolCallRecord {\n  const item = asRecord(value, `run.tools[${index}]`);\n  const prefix = `run.tools[${index}]`;\n  const ordinal = boundedCount(item.ordinal, `${prefix}.ordinal`);\n  return {\n    id: `tool-${ordinal}`,\n    ordinal,\n    name: requiredString(item.name, `${prefix}.name`),\n    ...optionalProperty(\"provider\", optionalString(item.provider, `${prefix}.provider`)),\n    ...optionalProperty(\"model\", optionalString(item.model, `${prefix}.model`)),\n    startedAtMs: timestampValue(item.startedAtMs, `${prefix}.startedAtMs`),\n    ...optionalProperty(\"finishedAtMs\", optionalTimestamp(item.finishedAtMs, `${prefix}.finishedAtMs`)),\n    ...optionalProperty(\"durationMs\", optionalDuration(item.durationMs, `${prefix}.durationMs`)),\n    isError: booleanValue(item.isError, `${prefix}.isError`),\n    completionState: enumValue(\n      item.completionState,\n      [\"running\", \"finished\", \"interrupted\"] as const,\n      `${prefix}.completionState`,\n    ),\n  };\n}\n\nfunction parseSkill(value: unknown, index: number): SkillActivationRecord {\n  const item = asRecord(value, `run.skills[${index}]`);\n  const prefix = `run.skills[${index}]`;\n  return {\n    id: requiredString(item.id, `${prefix}.id`),\n    name: requiredString(item.name, `${prefix}.name`),\n    initiatedBy: enumValue(item.initiatedBy, [\"user\", \"model\"] as const, `${prefix}.initiatedBy`),\n    occurredAtMs: timestampValue(item.occurredAtMs, `${prefix}.occurredAtMs`),\n    ...optionalProperty(\"provider\", optionalString(item.provider, `${prefix}.provider`)),\n    ...optionalProperty(\"model\", optionalString(item.model, `${prefix}.model`)),\n  };\n}\n\nfunction parseProviderError(value: unknown, index: number): ProviderErrorRecord {\n  const item = asRecord(value, `run.providerErrors[${index}]`);\n  const prefix = `run.providerErrors[${index}]`;\n  return {\n    id: requiredString(item.id, `${prefix}.id`),\n    ...optionalProperty(\"generationId\", optionalString(item.generationId, `${prefix}.generationId`)),\n    occurredAtMs: timestampValue(item.occurredAtMs, `${prefix}.occurredAtMs`),\n    ...optionalProperty(\"provider\", optionalString(item.provider, `${prefix}.provider`)),\n    ...optionalProperty(\"model\", optionalString(item.model, `${prefix}.model`)),\n    category: enumValue(item.category, ERROR_CATEGORIES, `${prefix}.category`) as ProviderErrorCategory,\n    recovered: booleanValue(item.recovered, `${prefix}.recovered`),\n    terminal: booleanValue(item.terminal, `${prefix}.terminal`),\n  };\n}\n\nfunction asRecord(value: unknown, name: string): Record<string, unknown> {\n  if (typeof value !== \"object\" || value === null || Array.isArray(value)) invalid(name);\n  return value as Record<string, unknown>;\n}\n\nfunction boundedArray(value: unknown, name: string, budget: ParseBudget): unknown[] {\n  if (!Array.isArray(value)) invalid(name);\n  budget.remaining -= value.length;\n  if (budget.remaining < 0) {\n    throw new AnalyticsStorageFormatError(\"Analytics record is too large to process safely.\");\n  }\n  return value;\n}\n\nfunction requiredString(value: unknown, name: string): string {\n  if (typeof value !== \"string\" || value.length === 0 || value.length > MAX_STRING_LENGTH) {\n    invalid(name);\n  }\n  return value;\n}\n\nfunction optionalString(value: unknown, name: string): string | undefined {\n  return value === undefined ? undefined : requiredString(value, name);\n}\n\nfunction boundedInteger(value: unknown, name: string, maximum: number): number {\n  if (typeof value !== \"number\" || !Number.isSafeInteger(value) || value < 0 || value > maximum) {\n    invalid(name);\n  }\n  return value;\n}\n\nfunction timestampValue(value: unknown, name: string): number {\n  return boundedInteger(value, name, Number.MAX_SAFE_INTEGER);\n}\n\nfunction optionalTimestamp(value: unknown, name: string): number | undefined {\n  return value === undefined ? undefined : timestampValue(value, name);\n}\n\nfunction durationValue(value: unknown, name: string): number {\n  return boundedInteger(value, name, Math.floor(Number.MAX_SAFE_INTEGER / MAX_NESTED_RECORDS));\n}\n\nfunction optionalDuration(value: unknown, name: string): number | undefined {\n  return value === undefined ? undefined : durationValue(value, name);\n}\n\nfunction boundedCount(value: unknown, name: string): number {\n  return boundedInteger(value, name, MAX_NESTED_RECORDS);\n}\n\nfunction booleanValue(value: unknown, name: string): boolean {\n  if (typeof value !== \"boolean\") invalid(name);\n  return value;\n}\n\nfunction enumValue<const T extends readonly string[]>(value: unknown, values: T, name: string): T[number] {\n  if (typeof value !== \"string\" || !values.includes(value)) invalid(name);\n  return value as T[number];\n}\n\nfunction optionalProperty<K extends string, T>(key: K, value: T | undefined): { [P in K]?: T } {\n  return value === undefined ? {} : ({ [key]: value } as { [P in K]?: T });\n}\n\nfunction invalid(name: string): never {\n  throw new AnalyticsStorageFormatError(`Analytics record has an invalid ${name}.`);\n}\n", "import type { SettledRun } from \"../types.js\";\nimport { AnalyticsGenerationChangedError, AnalyticsRunFiles, type ClearAnalyticsResult } from \"./files.js\";\nimport { type AnalyticsSnapshot, querySnapshot, type TimeRange } from \"./queries.js\";\n\nexport class AnalyticsStore {\n  private readonly files: AnalyticsRunFiles;\n\n  constructor(\n    rootPath: string,\n    dependencies: {\n      files?: AnalyticsRunFiles;\n      createId?: () => string;\n      writeTimeoutMs?: number;\n    } = {},\n  ) {\n    this.files =\n      dependencies.files ??\n      new AnalyticsRunFiles(rootPath, {\n        createId: dependencies.createId,\n        writeTimeoutMs: dependencies.writeTimeoutMs,\n      });\n  }\n\n  get path(): string {\n    return this.files.path;\n  }\n\n  recordRun(run: SettledRun, signal?: AbortSignal): Promise<void> {\n    return this.files.append(run, signal);\n  }\n\n  async getSnapshot(range: TimeRange, signal?: AbortSignal): Promise<AnalyticsSnapshot> {\n    for (let attempt = 0; attempt < 2; attempt += 1) {\n      try {\n        return await querySnapshot(this.files.read(signal), range, signal);\n      } catch (error) {\n        if (!(error instanceof AnalyticsGenerationChangedError) || attempt > 0) throw error;\n      }\n    }\n    throw new AnalyticsGenerationChangedError();\n  }\n\n  clearAll(signal?: AbortSignal): Promise<ClearAnalyticsResult> {\n    return this.files.clear(signal);\n  }\n\n  close(): Promise<void> {\n    return this.files.close();\n  }\n}\n"],
  "mappings": "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",
  "names": ["randomUUID", "path", "randomUUID", "path", "ERROR_CATEGORIES", "path", "randomUUID", "throwIfAborted", "active", "randomUUID", "path"]
}
