@posthog/wizard 2.29.0 → 2.30.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. package/dist/{add-mcp-server-to-clients-B6Pj4IKt.js → add-mcp-server-to-clients-D0G4cmPf.js} +4 -4
  2. package/dist/{add-mcp-server-to-clients-B6Pj4IKt.js.map → add-mcp-server-to-clients-D0G4cmPf.js.map} +1 -1
  3. package/dist/{agent-interface-CVW8H9eF.js → agent-interface-CYFyWCMj.js} +26 -14
  4. package/dist/{agent-interface-CVW8H9eF.js.map → agent-interface-CYFyWCMj.js.map} +1 -1
  5. package/dist/{agent-runner-VzTpPaVT.js → agent-runner-HTfFCUrR.js} +11 -10
  6. package/dist/{agent-runner-VzTpPaVT.js.map → agent-runner-HTfFCUrR.js.map} +1 -1
  7. package/dist/{analytics-DvDjbNmK.js → analytics-CdT0VV8s.js} +2 -2
  8. package/dist/{analytics-DvDjbNmK.js.map → analytics-CdT0VV8s.js.map} +1 -1
  9. package/dist/{api-DfpSG5xU.js → api-D9CerM6x.js} +3 -3
  10. package/dist/{api-DfpSG5xU.js.map → api-D9CerM6x.js.map} +1 -1
  11. package/dist/bin.js +33 -32
  12. package/dist/bin.js.map +1 -1
  13. package/dist/{ci-install-Bzfo3nON.js → ci-install-CTydrjHu.js} +4 -4
  14. package/dist/{ci-install-Bzfo3nON.js.map → ci-install-CTydrjHu.js.map} +1 -1
  15. package/dist/{debug-HQ0NrBA2.js → debug-Bmq9KH4W.js} +1 -1
  16. package/dist/{debug-CMZ7kqW1.js → debug-D9giWww2.js} +2 -2
  17. package/dist/{debug-CMZ7kqW1.js.map → debug-D9giWww2.js.map} +1 -1
  18. package/dist/{environment-cVP7bGnh.js → environment-C6j-a4Gz.js} +3 -3
  19. package/dist/{environment-cVP7bGnh.js.map → environment-C6j-a4Gz.js.map} +1 -1
  20. package/dist/{file-utils-D1632P4x.js → file-utils-BiElGS_N.js} +2 -2
  21. package/dist/{file-utils-D1632P4x.js.map → file-utils-BiElGS_N.js.map} +1 -1
  22. package/dist/{interactive-DCIL3NcQ.js → interactive-C0Vssetd.js} +2 -2
  23. package/dist/{interactive-DCIL3NcQ.js.map → interactive-C0Vssetd.js.map} +1 -1
  24. package/dist/{mcp-prompt-streaming-BRoVSf3N.js → mcp-prompt-streaming-DQXxG2Pg.js} +4 -4
  25. package/dist/{mcp-prompt-streaming-BRoVSf3N.js.map → mcp-prompt-streaming-DQXxG2Pg.js.map} +1 -1
  26. package/dist/{non-interactive-u4VG76Vi.js → non-interactive-DX-N3ZEb.js} +2 -2
  27. package/dist/{non-interactive-u4VG76Vi.js.map → non-interactive-DX-N3ZEb.js.map} +1 -1
  28. package/dist/{package-manager-0M_uIOP0.js → package-manager-cIPAT7g3.js} +2 -2
  29. package/dist/{package-manager-0M_uIOP0.js.map → package-manager-cIPAT7g3.js.map} +1 -1
  30. package/dist/{playground-B6wgUvH-.js → playground-DQI2vpr0.js} +4 -4
  31. package/dist/{playground-B6wgUvH-.js.map → playground-DQI2vpr0.js.map} +1 -1
  32. package/dist/{posthog-integration-C_9G_kTS.js → posthog-integration-EUokB9U1.js} +12 -12
  33. package/dist/{posthog-integration-C_9G_kTS.js.map → posthog-integration-EUokB9U1.js.map} +1 -1
  34. package/dist/{provisioning-CgCxuoe6.js → provisioning-BCCeBATw.js} +3 -3
  35. package/dist/{provisioning-CgCxuoe6.js.map → provisioning-BCCeBATw.js.map} +1 -1
  36. package/dist/{registry-BgsYtCkS.js → registry-DCxIW2G5.js} +4 -4
  37. package/dist/{registry-BgsYtCkS.js.map → registry-DCxIW2G5.js.map} +1 -1
  38. package/dist/{setup-utils-DF6EKEeA.js → setup-utils-DmX3o2bT.js} +8 -8
  39. package/dist/{setup-utils-DF6EKEeA.js.map → setup-utils-DmX3o2bT.js.map} +1 -1
  40. package/dist/{start-tui-Deaj99It.js → start-tui-B9dCp0hW.js} +13 -13
  41. package/dist/{start-tui-Deaj99It.js.map → start-tui-B9dCp0hW.js.map} +1 -1
  42. package/dist/{steps-AF3ulYYe.js → steps-3XbXMf0T.js} +7 -7
  43. package/dist/{steps-AF3ulYYe.js.map → steps-3XbXMf0T.js.map} +1 -1
  44. package/dist/{telemetry-DPVvKu5X.js → telemetry-GFq8wmz0.js} +3 -3
  45. package/dist/{telemetry-DPVvKu5X.js.map → telemetry-GFq8wmz0.js.map} +1 -1
  46. package/dist/{terminal-BVKeWPb3.js → terminal-oI1dOWQI.js} +9 -9
  47. package/dist/{terminal-BVKeWPb3.js.map → terminal-oI1dOWQI.js.map} +1 -1
  48. package/dist/{urls-Bur7Zb7A.js → urls-93eQ-Rd0.js} +2 -2
  49. package/dist/{urls-Bur7Zb7A.js.map → urls-93eQ-Rd0.js.map} +1 -1
  50. package/dist/{wizard-abort-D0UMhCP5.js → wizard-abort-BehJBPpy.js} +3 -3
  51. package/dist/{wizard-abort-D0UMhCP5.js.map → wizard-abort-BehJBPpy.js.map} +1 -1
  52. package/dist/{wizard-abort-D3vY7K9a.js → wizard-abort-dmkJqxAb.js} +1 -1
  53. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"agent-runner-VzTpPaVT.js","names":["path","runAgent","executeAgent"],"sources":["../src/lib/agent/runner/orchestrator/executor.ts","../src/lib/agent/runner/orchestrator/run-metrics.ts","../src/lib/agent/agent-prompt-loader.ts","../src/lib/agent/runner/orchestrator/orchestrator-runner.ts","../src/lib/agent/runner/shared/bootstrap.ts","../src/lib/middleware/phase-detector.ts","../src/lib/middleware/pipeline.ts","../src/lib/middleware/config.ts","../src/lib/middleware/benchmarks/turn-counter.ts","../src/lib/middleware/benchmarks/token-tracker.ts","../src/lib/middleware/benchmarks/cache-tracker.ts","../src/lib/middleware/benchmarks/compaction-tracker.ts","../src/lib/middleware/benchmarks/context-size-tracker.ts","../src/lib/middleware/benchmarks/cost-tracker.ts","../src/lib/middleware/benchmarks/duration-tracker.ts","../src/lib/middleware/benchmarks/summary.ts","../src/lib/middleware/benchmarks/json-writer.ts","../src/lib/middleware/benchmarks/index.ts","../src/lib/middleware/benchmark.ts","../src/lib/wizard-ask-bridge.ts","../src/lib/agent/agent-prompt.ts","../src/lib/agent/runner/shared/errors.ts","../src/lib/agent/runner/linear.ts","../src/lib/agent/runner/index.ts"],"sourcesContent":["/**\n * The executor drains the queue. It starts every runnable task (dependencies\n * satisfied) as soon as it becomes runnable — parallelism is decided by the\n * task graph, not by an executor knob. Each task runs through an injected\n * `runTask` function and reports its outcome via `complete_task`; a task that\n * ends without reporting is retried while attempts remain, then failed. A\n * `maxStarts` backstop guarantees termination.\n *\n * The drain loop is independent of how a task actually runs. `runTask` is\n * injected: the real one spins up a fresh agent, the tests use a fake.\n */\nimport { analytics } from '@utils/analytics';\nimport { logToFile } from '@utils/debug';\nimport { TaskStatus, type QueueStore, type QueuedTask } from './queue';\n\n/** Per-task agent configuration the resolver produces from a task's type. */\nexport interface ResolvedTask {\n model: string;\n allowedTools: readonly string[];\n disallowedTools: readonly string[];\n /** Mini-skills to install before the task runs (the HOW). */\n skills: readonly string[];\n prompt: string;\n}\n\n/** Resolves a queued task to what the agent needs. The real one is markdown-backed. */\nexport type TaskResolver = (\n task: QueuedTask,\n store: QueueStore,\n) => ResolvedTask;\n\n/** Runs one task's agent. It is expected to drive the task to a terminal state\n * (via the task agent calling complete_task). */\nexport type RunTask = (task: QueuedTask) => Promise<void>;\n\nexport interface DrainOptions {\n /** Backstop against a pathological always-one-more-pending loop. */\n maxStarts: number;\n}\n\nexport const DEFAULT_DRAIN_OPTIONS: DrainOptions = {\n maxStarts: 200,\n};\n\nasync function runOne(\n store: QueueStore,\n runTask: RunTask,\n task: QueuedTask,\n): Promise<void> {\n store.start(task.id);\n try {\n await runTask(task);\n } catch (error) {\n // The task threw rather than reporting. The outcome check below handles\n // the queue; the exception itself should never be silent.\n logToFile(`[executor] runTask threw for ${task.type}:`, error);\n analytics.captureException(\n error instanceof Error ? error : new Error(String(error)),\n { step: 'orchestrator_run_task', task_type: task.type },\n );\n }\n\n const after = store.get(task.id);\n if (!after) return;\n\n if (after.status === TaskStatus.Running) {\n // The agent ended without calling complete_task. Retry or fail.\n if (after.attempts < after.maxAttempts) {\n store.requeue(task.id);\n } else {\n store.fail(task.id, {\n type: 'no-report',\n message: 'Task ended without calling complete_task.',\n });\n }\n return;\n }\n\n if (\n after.status === TaskStatus.Failed &&\n after.attempts < after.maxAttempts\n ) {\n store.requeue(task.id);\n }\n}\n\n/**\n * Drain the queue to a terminal state. Every runnable task starts the moment\n * its dependencies finish; independent branches run concurrently. Returns when\n * every task is done, failed, or blocked by a failed dependency, or when the\n * start backstop trips.\n */\nexport async function drainQueue(\n store: QueueStore,\n runTask: RunTask,\n opts: DrainOptions = DEFAULT_DRAIN_OPTIONS,\n): Promise<void> {\n const running = new Map<string, Promise<void>>();\n let starts = 0;\n\n for (;;) {\n for (const task of store.nextRunnable()) {\n if (++starts > opts.maxStarts) break;\n // runOne marks the task running synchronously, so the next\n // nextRunnable() call no longer offers it.\n const p = runOne(store, runTask, task).finally(() =>\n running.delete(task.id),\n );\n running.set(task.id, p);\n }\n if (running.size === 0) break;\n // Wake on the first finish; it may have unblocked dependents or requeued.\n await Promise.race(running.values());\n }\n}\n","/**\n * Responsiveness metrics for an orchestrator run.\n *\n * Responsiveness is the experiment's headline: how quickly the user sees the\n * first progress, and whether progress stays steady (no long silences). The math\n * is accumulated from queue transitions but kept here, pure and time-injected, so\n * it is unit-testable away from the runner. Wall-clock times are passed in as\n * milliseconds; the caller owns the clock.\n */\n\nexport interface RunMetricsSummary {\n /** Run start → first task started. */\n time_to_first_task_ms?: number;\n /** Run start → first task completed (the first visible \"done\"). */\n time_to_first_completion_ms?: number;\n /** Longest silence between two consecutive user-visible transitions. */\n max_gap_ms?: number;\n}\n\n/** The per-event timing the `orchestrator task started` event reports. */\nexport interface StartTiming {\n ms_since_run_start: number;\n gap_since_prev_start_ms?: number;\n}\n\nexport class RunMetrics {\n private firstStartMs?: number;\n private lastStartMs?: number;\n private firstCompleteMs?: number;\n private lastVisibleMs?: number;\n private maxGapMs = 0;\n\n constructor(private readonly runStartMs: number) {}\n\n /** A task started. Returns the per-start-event timing for the start event. */\n recordStart(nowMs: number): StartTiming {\n const timing: StartTiming = {\n ms_since_run_start: nowMs - this.runStartMs,\n gap_since_prev_start_ms:\n this.lastStartMs === undefined ? undefined : nowMs - this.lastStartMs,\n };\n this.firstStartMs ??= nowMs;\n this.lastStartMs = nowMs;\n this.markVisible(nowMs);\n return timing;\n }\n\n /** A task completed. */\n recordComplete(nowMs: number): void {\n this.firstCompleteMs ??= nowMs;\n this.markVisible(nowMs);\n }\n\n /** A task reached a terminal non-complete state the user sees (skip/fail). */\n recordTerminal(nowMs: number): void {\n this.markVisible(nowMs);\n }\n\n /**\n * The run-level responsiveness summary. Timings are `undefined` when the\n * relevant transition never happened (e.g. a run that started no task), so a\n * no-task run stays distinguishable from a genuine zero.\n */\n summary(): RunMetricsSummary {\n return {\n time_to_first_task_ms:\n this.firstStartMs === undefined\n ? undefined\n : this.firstStartMs - this.runStartMs,\n time_to_first_completion_ms:\n this.firstCompleteMs === undefined\n ? undefined\n : this.firstCompleteMs - this.runStartMs,\n max_gap_ms: this.lastVisibleMs === undefined ? undefined : this.maxGapMs,\n };\n }\n\n /** requeue is not user-visible, so a retry stall counts as silence here. */\n private markVisible(nowMs: number): void {\n if (this.lastVisibleMs !== undefined) {\n this.maxGapMs = Math.max(this.maxGapMs, nowMs - this.lastVisibleMs);\n }\n this.lastVisibleMs = nowMs;\n }\n}\n","/**\n * Agent-prompt loader + registry.\n *\n * Agent prompts are the WHAT of a task: a markdown file per type, served from\n * context-mill as the `agents` content type (parallel to skills). The frontmatter\n * carries the artifacts the executor needs — model, the mini-skills to load (the\n * HOW), the tools the task may use, and its dependencies — and the body is the\n * instruction the agent reads.\n *\n * The registry is fetched once at startup and scoped to one flow — agents\n * declare `flow` and (for the planner) `seed: true` in frontmatter, so each\n * program (integration, audit, migration, ...) ships its own agent set and the\n * loader stays generic. Every prompt is downloaded and parsed up front, so\n * resolving a task to its run config is synchronous and adds no mid-drain\n * network latency. The registry's type list also drives `enqueue_task`\n * validation.\n */\nimport type { QueueStore, QueuedTask } from './runner/orchestrator/queue';\nimport type { ResolvedTask } from './runner/orchestrator/executor';\n\n/**\n * The basics the client injects around every agent-prompt body. The `/agents/`\n * files carry intent only (goal, success criteria); the wizard owns the I/O\n * contract — who the agent is, how it reports, how it surfaces progress — so the\n * authored prompts never restate it.\n */\nexport interface OrchestratorPromptContext {\n projectId: number;\n projectApiKey: string;\n host: string;\n /** Path to the framework's reference implementation (EXAMPLE.md), if available. */\n examplePath?: string;\n /** Path to the framework's rules (COMMANDMENTS.md), if available. */\n commandmentsPath?: string;\n}\n\nfunction projectContext(ctx: OrchestratorPromptContext): string {\n return `You have access to the PostHog MCP server and the wizard tools.\n\nProject context:\n- PostHog Project ID: ${ctx.projectId}\n- PostHog public token: ${ctx.projectApiKey}\n- PostHog Host: ${ctx.host}`;\n}\n\n/** Points the agent at the framework's reference integration to learn patterns from. */\nfunction exampleReference(ctx: OrchestratorPromptContext): string | null {\n if (!ctx.examplePath) return null;\n return `A reference PostHog integration for this framework is at \\`${ctx.examplePath}\\`. It shows the target implementation pattern. Reference its patterns and conventions, adapting them to this codebase.`;\n}\n\n/** The framework's rules ship with the reference skill; every task follows them. */\nfunction commandmentsReference(ctx: OrchestratorPromptContext): string | null {\n if (!ctx.commandmentsPath) return null;\n return `Framework rules for this integration are at \\`${ctx.commandmentsPath}\\`. Read them before you edit and follow them.`;\n}\n\nconst TASK_BASICS = `You are one isolated task in a larger PostHog workflow, run as a fresh agent with no memory of the other tasks beyond the context you are given. Do only your task, then report exactly once by calling complete_task with a structured handoff: what your goal was, what you did, and what the next agent should know. When you are given context from previous steps, trust it — those agents already did their work, so do not re-verify or re-read what their handoffs tell you. Build on it and move fast. Read a file before you edit it, so your own changes do not duplicate what is already there. Work only inside this project's own directory: never read, list, or search (find, ls, grep, glob) outside it — not the OS, not other projects, not global package caches. If your task seems to need something outside this directory, it does not — skip that part and say so in your handoff rather than hunting across the filesystem. If your task does not apply to this project — there is genuinely nothing for it to do — report it with status \\`skipped\\` and say why, rather than marking it done.`;\n\nconst SEED_BASICS = `You are the orchestrator. Plan the work and seed the queue with enqueue_task — each call returns an id you can pass as a dependency to a later task. Give each task a short label for the UI — the action in a few words, not file names, class names, or other specifics. You are not a task yourself: do not call complete_task and do not edit the project.`;\n\n/**\n * Points the agent at its installed task instructions (the HOW). They live under\n * the wizard's run dir, not `.claude/skills/`, so the SDK does not auto-load\n * them — the prompt has to name them.\n */\nfunction skillReference(paths: readonly string[]): string | null {\n if (paths.length === 0) return null;\n const list = paths.map((p) => `\\`${p}\\``).join(', ');\n return `Your task instructions are at ${list}. Read them before you start and follow them. They are wizard scaffolding, not part of the project.`;\n}\n\n/** A task agent's full prompt: injected basics, then the authored intent. */\nexport function assembleTaskPrompt(\n ctx: OrchestratorPromptContext,\n body: string,\n skillPaths: readonly string[] = [],\n): string {\n return [\n projectContext(ctx),\n exampleReference(ctx),\n commandmentsReference(ctx),\n skillReference(skillPaths),\n TASK_BASICS,\n body,\n ]\n .filter(Boolean)\n .join('\\n\\n');\n}\n\n/** The seed agent's full prompt: injected basics, then the authored intent. */\nexport function assembleSeedPrompt(\n ctx: OrchestratorPromptContext,\n body: string,\n): string {\n return [projectContext(ctx), SEED_BASICS, body].join('\\n\\n');\n}\n\n/** Used when neither the enqueue call nor the prompt frontmatter names a model. */\nconst DEFAULT_TASK_MODEL = 'claude-sonnet-4-6';\n\n/** Orchestrator tools are MCP tools under the `posthog-wizard` server. Frontmatter\n * names them short (e.g. `enqueue_task`); the SDK gates on the full name. */\nconst ORCHESTRATOR_TOOL_PREFIX = 'mcp__posthog-wizard__';\nconst ORCHESTRATOR_TOOLS = new Set([\n 'enqueue_task',\n 'complete_task',\n 'read_handoffs',\n]);\n\n/** A parsed agent prompt. The frontmatter fields plus the markdown body. */\nexport interface AgentPrompt {\n type: string;\n /** Human-readable title for the TUI; falls back to `type` when absent. */\n label?: string;\n /** The flow this agent belongs to (the program id, e.g. \\`posthog-integration\\`). */\n flow?: string;\n /** Marks the flow's planner: it seeds the queue and is not an enqueueable task. */\n seed: boolean;\n model?: string;\n skills: string[];\n allowedTools: string[];\n disallowedTools: string[];\n dependsOn: string[];\n body: string;\n}\n\nexport interface AgentRegistry {\n /** The flow's enqueueable task types — every prompt except the seed. */\n readonly types: string[];\n /** The flow's planner, the one prompt marked `seed: true` in its frontmatter. */\n readonly seed?: AgentPrompt;\n get(type: string): AgentPrompt | undefined;\n}\n\n/** The registry for one flow's prompts. Pure; the loader feeds it the fetched set. */\nexport function buildRegistry(\n prompts: readonly AgentPrompt[],\n flow: string,\n opts?: { exclude?: readonly string[] },\n): AgentRegistry {\n // The harness can exclude task types (CI excludes dashboards). An excluded\n // type does not exist for the run: the seed cannot enqueue it and no agent\n // is ever spun up for it.\n const excluded = new Set(opts?.exclude ?? []);\n const inFlow = prompts.filter(\n (p) => p.flow === flow && !excluded.has(p.type),\n );\n const byType = new Map(inFlow.map((p) => [p.type, p]));\n return {\n types: inFlow.filter((p) => !p.seed).map((p) => p.type),\n seed: inFlow.find((p) => p.seed),\n get: (type) => byType.get(type),\n };\n}\n\ninterface AgentMenu {\n agents: { id: string; downloadUrl: string }[];\n}\n\n/** A native tool passes through; an orchestrator tool gets its MCP-qualified name. */\nfunction expandToolName(name: string): string {\n return ORCHESTRATOR_TOOLS.has(name)\n ? `${ORCHESTRATOR_TOOL_PREFIX}${name}`\n : name;\n}\n\n/** A prompt's allow/disallow lists with orchestrator tool names MCP-qualified. */\nexport function agentRunTools(prompt: AgentPrompt): {\n allowedTools: string[];\n disallowedTools: string[];\n} {\n return {\n allowedTools: prompt.allowedTools.map(expandToolName),\n disallowedTools: prompt.disallowedTools.map(expandToolName),\n };\n}\n\nfunction toStringArray(value: unknown): string[] {\n if (!Array.isArray(value)) return [];\n return value.filter((v): v is string => typeof v === 'string');\n}\n\n/**\n * Parse the leading `---` frontmatter block and the markdown body. The\n * frontmatter is a small, known schema (scalars and inline `[a, b]` arrays), so\n * a tiny parser covers it without a YAML dependency. Inline `# comments` after a\n * value are stripped. `fallbackType` is the menu id, used when the body omits\n * `type:`.\n */\nexport function parseAgentPrompt(\n text: string,\n fallbackType: string,\n): AgentPrompt {\n const match = text.match(/^---\\r?\\n([\\s\\S]*?)\\r?\\n---\\r?\\n?([\\s\\S]*)$/);\n const frontmatter = match ? match[1] : '';\n const body = (match ? match[2] : text).trim();\n\n const fields: Record<string, unknown> = {};\n for (const rawLine of frontmatter.split(/\\r?\\n/)) {\n const line = rawLine.replace(/\\s+#.*$/, '').trim();\n if (!line || line.startsWith('#')) continue;\n const kv = line.match(/^([\\w-]+):\\s*(.*)$/);\n if (!kv) continue;\n const [, key, raw] = kv;\n if (raw.startsWith('[') && raw.endsWith(']')) {\n fields[key] = raw\n .slice(1, -1)\n .split(',')\n .map((s) => s.trim().replace(/^['\"]|['\"]$/g, ''))\n .filter(Boolean);\n } else {\n fields[key] = raw.replace(/^['\"]|['\"]$/g, '');\n }\n }\n\n const model = typeof fields.model === 'string' ? fields.model : undefined;\n return {\n type: typeof fields.type === 'string' ? fields.type : fallbackType,\n label: typeof fields.label === 'string' ? fields.label : undefined,\n flow: typeof fields.flow === 'string' ? fields.flow : undefined,\n seed: fields.seed === 'true',\n model,\n skills: toStringArray(fields.skills),\n allowedTools: toStringArray(fields.allowedTools),\n disallowedTools: toStringArray(fields.disallowedTools),\n dependsOn: toStringArray(fields.dependsOn),\n body,\n };\n}\n\nasync function fetchText(url: string): Promise<string> {\n const res = await fetch(url);\n if (!res.ok) {\n throw new Error(`Fetch ${url} failed: ${res.status} ${res.statusText}`);\n }\n return res.text();\n}\n\n/**\n * Fetch the agent menu and every agent prompt it lists, parse them, and build\n * the registry for one flow. Throws if the menu cannot be fetched — the\n * orchestrator cannot run without its prompts.\n */\nexport async function loadAgentRegistry(\n skillsBaseUrl: string,\n flow: string,\n opts?: { exclude?: readonly string[] },\n): Promise<AgentRegistry> {\n const menuRaw = await fetchText(`${skillsBaseUrl}/agent-menu.json`);\n const menu = JSON.parse(menuRaw) as AgentMenu;\n\n const prompts = await Promise.all(\n (menu.agents ?? []).map(async (entry) => {\n const text = await fetchText(entry.downloadUrl);\n return parseAgentPrompt(text, entry.id);\n }),\n );\n\n return buildRegistry(prompts, flow, opts);\n}\n\n/**\n * Render a task's own inputs into a section, so a fanned-out task (e.g. one\n * `capture` per event) sees the specific thing it owns. Empty when there are none.\n */\nfunction renderInputs(task: QueuedTask): string {\n const entries = Object.entries(task.inputs ?? {});\n if (entries.length === 0) return '';\n const lines = entries.map(([k, v]) => `- ${k}: ${formatInputValue(v)}`);\n return `## Your task input\\n\\n${lines.join('\\n')}`;\n}\n\nfunction formatInputValue(value: unknown): string {\n if (typeof value === 'string') return value;\n return JSON.stringify(value);\n}\n\n/**\n * The ids of every task `task` transitively depends on — the full upstream\n * chain, not just direct dependencies — ordered roots-first, each once. A `seen`\n * set dedupes diamonds and guards against cycles.\n */\nfunction ancestorIds(task: QueuedTask, store: QueueStore): string[] {\n const seen = new Set<string>();\n const ordered: string[] = [];\n const visit = (id: string): void => {\n if (seen.has(id)) return;\n seen.add(id);\n const t = store.get(id);\n if (!t) return;\n for (const dep of t.dependsOn) visit(dep); // ancestors before dependents\n ordered.push(id);\n };\n for (const dep of task.dependsOn) visit(dep);\n return ordered;\n}\n\n/**\n * Render the handoffs of every step `task` transitively depends on into a context\n * section, so a fresh agent sees the whole upstream chain — not just its direct\n * dependencies. Reliability over token economy: a step must never have to\n * re-discover what any ancestor already established just because an intermediate\n * handoff happened to omit it. Empty when there are no completed ancestors.\n */\nfunction renderHandoffContext(task: QueuedTask, store: QueueStore): string {\n const lines: string[] = [];\n for (const id of ancestorIds(task, store)) {\n const dep = store.get(id);\n const handoff = store.readHandoff(id);\n if (!dep || !handoff) continue;\n lines.push(`### ${dep.type}`);\n lines.push(`- did: ${handoff.did}`);\n lines.push(`- for you: ${handoff.forNextAgent}`);\n if (handoff.filesTouched?.length) {\n lines.push(`- files: ${handoff.filesTouched.join(', ')}`);\n }\n lines.push('');\n }\n if (lines.length === 0) return '';\n return `## Context from previous steps\\n\\n${lines.join('\\n')}`.trim();\n}\n\n/**\n * Resolve a queued task to its run config: the prompt body (with upstream\n * handoffs appended), the model, and the tool lists with orchestrator tool names\n * MCP-qualified. The model precedence is enqueue override, then prompt, then\n * default. Throws if no prompt is registered for the task's type.\n */\nexport function resolveTask(\n registry: AgentRegistry,\n task: QueuedTask,\n store: QueueStore,\n): ResolvedTask {\n const prompt = registry.get(task.type);\n if (!prompt) {\n throw new Error(`No agent prompt registered for task type \"${task.type}\"`);\n }\n\n const body = [\n renderInputs(task),\n prompt.body,\n renderHandoffContext(task, store),\n ]\n .filter(Boolean)\n .join('\\n\\n');\n\n return {\n model: taskModel(registry, task),\n ...agentRunTools(prompt),\n prompt: body,\n skills: prompt.skills,\n };\n}\n\n/** The model a task runs on: enqueue override, then prompt frontmatter, then default. */\nexport function taskModel(registry: AgentRegistry, task: QueuedTask): string {\n return task.model ?? registry.get(task.type)?.model ?? DEFAULT_TASK_MODEL;\n}\n","/**\n * Experimental task-queue orchestrator runner.\n *\n * Branches from the linear runner when the `wizard-orchestrator` flag is on. An\n * orchestrator agent inspects the repo and seeds an in-memory task queue; an\n * executor drains it, running one fresh agent per task.\n *\n * Both the WHAT (agent prompts: model, goal, success criteria, tools) and the\n * HOW (mini-skills) are markdown served from context-mill — the seed and every\n * task resolve to a prompt fetched at startup into the registry. The wizard side\n * stays product-ignorant: it is the queue, the executor, and the loader.\n */\nimport { randomUUID } from 'crypto';\nimport { existsSync, rmSync } from 'fs';\nimport * as path from 'path';\nimport {\n initializeAgent,\n runAgent,\n type AgentConfig,\n} from '@lib/agent/agent-interface';\nimport { OutroKind, type WizardSession } from '@lib/wizard-session';\nimport { detectNodePackageManagers } from '@lib/detection/package-manager';\nimport { installSkillById, fetchSkillMenu } from '@lib/wizard-tools';\nimport { getUI } from '@ui';\nimport { analytics } from '@utils/analytics';\nimport { ciExcludedTaskTypes } from '@utils/ci-flag-overrides';\nimport { logToFile } from '@utils/debug';\nimport type { ProgramConfig } from '@lib/programs/program-step';\nimport type { BootstrapResult } from '../shared/types';\nimport type { WizardRunOptions } from '@utils/types';\nimport {\n QueueStore,\n QUEUE_DIR_NAME,\n TaskStatus,\n type QueuedTask,\n} from './queue';\nimport { drainQueue, type RunTask } from './executor';\nimport { RunMetrics } from './run-metrics';\nimport {\n agentRunTools,\n assembleSeedPrompt,\n assembleTaskPrompt,\n loadAgentRegistry,\n resolveTask,\n taskModel,\n type OrchestratorPromptContext,\n} from '@lib/agent/agent-prompt-loader';\n\nfunction toTodoStatus(status: TaskStatus): string {\n switch (status) {\n case TaskStatus.Running:\n return 'in_progress';\n case TaskStatus.Done:\n case TaskStatus.Failed:\n return 'completed';\n case TaskStatus.Skipped:\n return 'skipped';\n default:\n return 'pending';\n }\n}\n\nfunction sessionRunOptions(session: WizardSession): WizardRunOptions {\n return {\n installDir: session.installDir,\n debug: session.debug,\n default: false,\n signup: session.signup,\n localMcp: session.localMcp,\n ci: session.ci,\n benchmark: session.benchmark,\n projectId: session.projectId,\n apiKey: session.apiKey,\n yaraReport: session.yaraReport,\n };\n}\n\n/**\n * The framework reference is the full `integration` skill. `session.skillId` is\n * the bare framework (e.g. `django`), but the skill menu ids it as\n * `integration-<variant>`. Resolve to the menu id: exact `integration-<framework>`\n * (the 1:1 frameworks — django, python, flask, …), else the first granular variant\n * under it (e.g. `integration-nextjs-app-router`). Undefined when none exists.\n */\nasync function resolveReferenceSkillId(\n skillsBaseUrl: string,\n framework: string,\n): Promise<string | undefined> {\n const menu = await fetchSkillMenu(skillsBaseUrl);\n if (!menu) return undefined;\n const ids = Object.values(menu.categories)\n .flat()\n .map((s) => s.id);\n const exact = `integration-${framework}`;\n if (ids.includes(exact)) return exact;\n return ids.find((id) => id.startsWith(`integration-${framework}-`));\n}\n\nexport async function runOrchestrator(\n session: WizardSession,\n programConfig: ProgramConfig,\n boot: BootstrapResult,\n): Promise<void> {\n const runId = randomUUID();\n\n const options = sessionRunOptions(session);\n\n // The WHAT (agent prompts) is served from context-mill. Fetch the registry\n // once up front: its types drive enqueue validation, and resolving a task to\n // its run config is then synchronous, with no mid-drain network latency.\n const registry = await loadAgentRegistry(\n boot.skillsBaseUrl,\n programConfig.id,\n { exclude: ciExcludedTaskTypes() },\n );\n const seedPrompt = registry.seed;\n if (!seedPrompt) {\n throw new Error(\n `No seed agent prompt (frontmatter \\`seed: true\\`) for flow \"${programConfig.id}\" is available from ${boot.skillsBaseUrl}.`,\n );\n }\n\n // Every wizard event from here on carries the variant, so orchestrator runs\n // segment cleanly from the linear baseline.\n analytics.setTag('variant', 'orchestrator');\n\n // Responsiveness is the headline metric of the dark launch: time to first\n // visible progress, and no single step dominating wall-clock. Track it from\n // queue transitions, with the resolved model so cheap work is attributable\n // to cheap models.\n const runStartMs = Date.now();\n const metrics = new RunMetrics(runStartMs);\n const durationMs = (t: QueuedTask) =>\n t.startedAt && t.finishedAt\n ? Date.parse(t.finishedAt) - Date.parse(t.startedAt)\n : undefined;\n\n const store = new QueueStore(session.installDir, runId, {\n onTransition: (event, task) => {\n const base = {\n type: task.type,\n model: taskModel(registry, task),\n attempts: task.attempts,\n };\n switch (event) {\n case 'enqueue':\n analytics.wizardCapture('orchestrator task enqueued', {\n type: task.type,\n enqueued_by: task.enqueuedBy,\n dynamic: task.enqueuedBy !== 'orchestrator',\n });\n break;\n case 'start':\n analytics.wizardCapture('orchestrator task started', {\n ...base,\n ...metrics.recordStart(Date.now()),\n });\n break;\n case 'complete':\n metrics.recordComplete(Date.now());\n analytics.wizardCapture('orchestrator task completed', {\n ...base,\n duration_ms: durationMs(task),\n });\n break;\n case 'skip':\n metrics.recordTerminal(Date.now());\n analytics.wizardCapture('orchestrator task skipped', {\n ...base,\n duration_ms: durationMs(task),\n });\n break;\n case 'fail':\n metrics.recordTerminal(Date.now());\n analytics.wizardCapture('orchestrator task failed', {\n ...base,\n duration_ms: durationMs(task),\n error: task.error?.type,\n });\n break;\n case 'requeue':\n break;\n }\n },\n });\n\n // Give task agents the framework's finished reference integration to match,\n // the same EXAMPLE.md the linear flow uses. Install it under the run dir rather\n // than .claude/skills so its \"do everything\" workflow is not auto-loaded as a\n // skill — only the example file is read, when the agent's prompt points at it.\n let examplePath: string | undefined;\n let commandmentsPath: string | undefined;\n const referenceSkillId = session.skillId\n ? await resolveReferenceSkillId(boot.skillsBaseUrl, session.skillId)\n : undefined;\n if (referenceSkillId) {\n const ref = await installSkillById(\n referenceSkillId,\n session.installDir,\n boot.skillsBaseUrl,\n path.join(QUEUE_DIR_NAME, 'reference'),\n );\n if (ref.kind === 'ok') {\n const example = path.join(ref.path, 'references', 'EXAMPLE.md');\n if (existsSync(path.join(session.installDir, example))) {\n examplePath = example;\n }\n const commandments = path.join(ref.path, 'references', 'COMMANDMENTS.md');\n if (existsSync(path.join(session.installDir, commandments))) {\n commandmentsPath = commandments;\n }\n } else {\n logToFile(\n `[orchestrator] reference unavailable: ${ref.kind} (${referenceSkillId})`,\n );\n }\n } else if (session.skillId) {\n logToFile(\n `[orchestrator] no integration skill for framework \"${session.skillId}\"`,\n );\n }\n\n // The client injects the basics (project context + the I/O contract) around\n // every authored agent-prompt body.\n const promptContext: OrchestratorPromptContext = {\n projectId: boot.projectId,\n projectApiKey: boot.projectApiKey,\n host: boot.host,\n examplePath,\n commandmentsPath,\n };\n\n logToFile(\n `[orchestrator] START program=${programConfig.id} dir=${session.installDir} run=${runId}`,\n );\n analytics.wizardCapture('orchestrator started', {\n program_id: programConfig.id,\n });\n getUI().startRun();\n\n // Label precedence: what the orchestrator set at enqueue, then the agent\n // prompt's default, then the bare type.\n const labelFor = (t: { type: string; label?: string }) =>\n t.label ?? registry.get(t.type)?.label ?? t.type;\n const renderQueue = () =>\n getUI().syncTodos(\n store.list().map((t) => ({\n content: labelFor(t),\n status: toTodoStatus(t.status),\n activeForm: labelFor(t),\n })),\n );\n\n // Each agent gets its own config so its wizard-tools server is bound to the\n // task it runs — independent tasks run in parallel, and attribution of\n // complete_task / enqueue_task must hold per agent. The seed is not a task,\n // so its context has no task id.\n const agentConfigFor = (currentTaskId?: string): AgentConfig => ({\n workingDirectory: session.installDir,\n posthogMcpUrl: boot.mcpUrl,\n posthogApiKey: boot.accessToken,\n posthogApiHost: boot.host,\n detectPackageManager: detectNodePackageManagers,\n skillsBaseUrl: boot.skillsBaseUrl,\n wizardFlags: boot.wizardFlags,\n // Tag agent events as orchestrator so telemetry segments from the baseline.\n wizardMetadata: { ...boot.wizardMetadata, VARIANT: 'orchestrator' },\n integrationLabel: programConfig.id,\n orchestrator: {\n store,\n validTypes: registry.types,\n currentTaskId,\n },\n });\n\n const spinner = getUI().spinner();\n\n // 1. Seed the queue with the orchestrator agent. It is itself an agent prompt\n // (the WHAT), so its model and tools come from its frontmatter. The seed\n // plans the graph, it is not a task.\n const seedAgent = await initializeAgent(agentConfigFor(), options);\n const seedResult = await runAgent(\n {\n ...seedAgent,\n model: seedPrompt.model ?? seedAgent.model,\n ...agentRunTools(seedPrompt),\n },\n assembleSeedPrompt(promptContext, seedPrompt.body),\n options,\n spinner,\n {\n spinnerMessage: 'Planning the integration...',\n successMessage: 'Planned the integration',\n additionalFeatureQueue: [],\n requestRemark: false,\n analyticsProperties: { task_type: 'seed' },\n },\n );\n if (seedResult.error) {\n logToFile(\n `[orchestrator] seed error: ${seedResult.error} ${\n seedResult.message ?? ''\n }`,\n );\n }\n analytics.wizardCapture('orchestrator seeded', {\n task_count: store.list().length,\n types: store.list().map((t) => t.type),\n });\n renderQueue();\n\n // 2. Drain the queue, one fresh agent per task; independent tasks run in\n // parallel, the seed's graph being the only schedule. Each task resolves to\n // its agent prompt (the WHAT) and the mini-skills it needs (the HOW), then\n // runs on its own model and tools.\n const taskSkillsRoot = path.join(QUEUE_DIR_NAME, 'skills');\n let remarkRequested = false;\n const runTask: RunTask = async (task) => {\n renderQueue();\n try {\n const resolved = resolveTask(registry, task, store);\n const agent = await initializeAgent(agentConfigFor(task.id), options);\n // Task instructions are one-run scaffolding, not durable skills, so they\n // install under the run dir rather than .claude/skills — the SDK must not\n // auto-load them and they must never land in the project (or a CI PR).\n // The prompt points the agent at them instead.\n const skillPaths: string[] = [];\n for (const skillId of resolved.skills) {\n const result = await installSkillById(\n skillId,\n session.installDir,\n boot.skillsBaseUrl,\n taskSkillsRoot,\n );\n if (result.kind === 'ok') {\n skillPaths.push(path.join(result.path, 'SKILL.md'));\n } else {\n logToFile(\n `[orchestrator] skill install failed type=${task.type} skill=${skillId} ${result.kind}`,\n );\n }\n }\n // The run-end reflection fires once, on the task that is last in the\n // queue when it starts — nothing else pending or running alongside it.\n const isLastTask = !store\n .list()\n .some(\n (t) =>\n t.id !== task.id &&\n (t.status === TaskStatus.Pending ||\n t.status === TaskStatus.Running),\n );\n const requestRemark = isLastTask && !remarkRequested;\n if (requestRemark) remarkRequested = true;\n await runAgent(\n {\n ...agent,\n model: resolved.model,\n allowedTools: resolved.allowedTools,\n disallowedTools: resolved.disallowedTools,\n },\n assembleTaskPrompt(promptContext, resolved.prompt, skillPaths),\n options,\n spinner,\n // Empty messages suppress the per-task spinner lines (the spinner renders\n // only when a message is set); the queue panel shows progress. Errors\n // still surface — runAgent stops the spinner with its own error text.\n {\n spinnerMessage: '',\n successMessage: '',\n additionalFeatureQueue: [],\n requestRemark,\n analyticsProperties: { task_type: task.type, task_id: task.id },\n },\n );\n } finally {\n renderQueue();\n }\n };\n try {\n await drainQueue(store, runTask);\n } finally {\n // Success or failure, no run artifact outlives the run — wipe the whole\n // cache folder (queue, handoffs, reference example, installed task\n // instructions). The .DELETE-ME.md inside is the fallback if we don't.\n try {\n rmSync(path.join(session.installDir, QUEUE_DIR_NAME), {\n recursive: true,\n force: true,\n });\n } catch (err) {\n analytics.captureException(\n err instanceof Error ? err : new Error(String(err)),\n { step: 'orchestrator_cache_cleanup' },\n );\n }\n }\n\n renderQueue();\n\n const summary = store.summary();\n logToFile(\n `[orchestrator] DONE done=${summary.done} failed=${summary.failed} total=${summary.total}`,\n );\n analytics.wizardCapture('orchestrator run finished', {\n tasks_total: summary.total,\n tasks_done: summary.done,\n tasks_failed: summary.failed,\n tasks_skipped: summary.skipped,\n total_duration_ms: Date.now() - runStartMs,\n ...metrics.summary(),\n dynamic_enqueue_count: store\n .list()\n .filter((t) => t.enqueuedBy !== 'orchestrator').length,\n retried_task_count: store.list().filter((t) => t.attempts > 1).length,\n });\n\n // The build step flags any unresolved conflict in its handoff; surface the\n // one-liner here and point the user at the report for the detail.\n const buildTask = store.list().find((t) => t.type === 'build');\n const conflict = buildTask\n ? store.readHandoff(buildTask.id)?.conflict\n : undefined;\n\n // Prefer the report the run wrote; fall back to the raw queue if it is missing.\n const reportPath = path.join(session.installDir, 'posthog-setup-report.md');\n const reportFile = existsSync(reportPath)\n ? 'posthog-setup-report.md'\n : store.queuePath;\n\n const message = conflict\n ? 'PostHog set up, with one conflict to review.'\n : `PostHog set up: ${summary.done}/${summary.total} steps completed.`;\n getUI().setOutroData({\n kind: OutroKind.Success,\n message,\n body: conflict\n ? `⚠ Build conflict: ${conflict}\\nFull details are in the report.`\n : undefined,\n reportFile,\n docsUrl: 'https://posthog.com/docs/ai-engineering/ai-wizard',\n });\n getUI().outro(message);\n await analytics.shutdown('success');\n}\n","/**\n * Shared bootstrap for the runner pipeline.\n *\n * Runs before the fork into the linear or orchestrator arm: logging, health\n * check, settings conflicts, OAuth and credentials, feature flags, variant\n * metadata, and MCP url. Sets `session.credentials`, role, and user as side\n * effects. Returns the values the arms still need.\n */\n\nimport type { WizardSession } from '@lib/wizard-session';\nimport { getOrAskForProjectData } from '@utils/setup-utils';\nimport { analytics, groupsFromUser } from '@utils/analytics';\nimport { getUI } from '@ui';\nimport { buildWizardMetadata } from '@lib/agent/agent-interface';\nimport {\n checkAllSettingsConflicts,\n backupAndFixClaudeSettings,\n} from '@lib/agent/claude-settings';\nimport {\n evaluateWizardReadiness,\n WizardReadiness,\n SIGNUP_WIZARD_READINESS_CONFIG,\n getBlockingServiceKeys,\n SERVICE_LABELS,\n} from '@lib/health-checks/readiness';\nimport { enableDebugLogs, logToFile, initLogFile } from '@utils/debug';\nimport { wizardAbort } from '@utils/wizard-abort';\nimport { isNonInteractiveEnvironment } from '@utils/environment';\nimport { getSkillsBaseUrl } from '@lib/constants';\nimport { runtimeEnv } from '@env';\nimport type { WizardRunOptions } from '@utils/types';\nimport type { ProgramConfig } from '@lib/programs/program-step';\nimport type { ProgramRun, BootstrapResult } from './types';\n\n// ── Helpers ──────────────────────────────────────────────────────────\n\n/**\n * Decide whether the `wizard_ask` overlay should be wired for this run.\n * Disabled in non-interactive modes (CI, signup) — there's no human to\n * answer. Per-program disabling is done by adding WIZARD_ASK_TOOL_NAME to\n * the program's `disallowedTools` so the SDK rejects calls outright.\n * Extracted so the policy can be unit-tested directly.\n */\nexport function shouldDisableAsk(\n session: Pick<WizardSession, 'ci' | 'signup'>,\n): boolean {\n return session.ci || session.signup;\n}\n\nexport function sessionToOptions(session: WizardSession): WizardRunOptions {\n return {\n installDir: session.installDir,\n debug: session.debug,\n default: false,\n signup: session.signup,\n localMcp: session.localMcp,\n ci: session.ci,\n benchmark: session.benchmark,\n projectId: session.projectId,\n apiKey: session.apiKey,\n yaraReport: session.yaraReport,\n };\n}\n\n// ── Bootstrap ─────────────────────────────────────────────────────────\n\n/**\n * Shared setup for both arms: logging, health check, settings conflicts, OAuth\n * and credentials, then the feature flags, variant metadata, and MCP url. Sets\n * `session.credentials`, role, and user as a side effect. Returns the values the\n * arms still need.\n */\nexport async function bootstrapProgram(\n session: WizardSession,\n config: ProgramRun,\n programConfig: ProgramConfig,\n): Promise<BootstrapResult> {\n // 1. Init logging + debug\n initLogFile();\n session.skillId = config.skillId ?? config.integrationLabel;\n logToFile(`[agent-runner] START ${config.integrationLabel}`);\n\n if (session.debug) {\n enableDebugLogs();\n }\n\n const skillsBaseUrl = getSkillsBaseUrl(session.localMcp);\n\n // 2. Health check (guarded — skip if TUI already ran it). Only\n // programs that declare a health-check screen get pre-flight checks;\n // for everything else the checks never fire and never block.\n const hasHealthCheckScreen = programConfig.steps.some(\n (s) => s.screenId === 'health-check',\n );\n if (session.readinessResult) {\n logToFile(\n `[agent-runner] readiness pre-computed by TUI: decision=${session.readinessResult.decision}` +\n `${\n session.outageDismissed ? ' (outage dismissed by user)' : ''\n } — skipping re-check`,\n );\n }\n if (hasHealthCheckScreen && !session.readinessResult) {\n logToFile('[agent-runner] evaluating wizard readiness');\n const readinessConfig = session.signup\n ? SIGNUP_WIZARD_READINESS_CONFIG\n : undefined;\n const readiness = await evaluateWizardReadiness(readinessConfig);\n logToFile(`[agent-runner] readiness=${readiness.decision}`);\n if (readiness.decision === WizardReadiness.No) {\n const blockingKeys = getBlockingServiceKeys(\n readiness.health,\n readinessConfig,\n );\n const blockingLabels = blockingKeys.map(\n (k) => `${SERVICE_LABELS[k]} (${readiness.health[k].status})`,\n );\n logToFile(`[agent-runner] blocked by: ${blockingLabels.join(', ')}`);\n\n await getUI().showBlockingOutage(readiness);\n\n // The TUI lets the user continue past an outage; non-interactive runs\n // (CI) do the same automatically — the degraded services are reported\n // above, but we proceed rather than aborting on a transient upstream blip.\n if (!isNonInteractiveEnvironment()) {\n await wizardAbort({\n message:\n 'Cannot start — external services are down:\\n' +\n blockingLabels.map((l) => ` - ${l}`).join('\\n') +\n '\\n\\nPlease try again later.',\n });\n }\n } else if (readiness.decision === WizardReadiness.YesWithWarnings) {\n getUI().setReadinessWarnings(readiness);\n }\n }\n\n // 3. Settings conflicts\n const settingsConflicts = checkAllSettingsConflicts(session.installDir);\n logToFile(\n `[agent-runner] settings conflicts: ${\n settingsConflicts.length > 0\n ? settingsConflicts\n .map((c) => `${c.source}(${c.keys.join(',')})`)\n .join('; ')\n : 'none'\n }`,\n );\n\n if (settingsConflicts.length > 0) {\n for (const conflict of settingsConflicts) {\n const level = conflict.source === 'managed' ? 'org' : conflict.source;\n analytics.wizardCapture('settings conflict detected', {\n level,\n keys: conflict.keys,\n });\n }\n await getUI().showSettingsOverride(settingsConflicts, () =>\n backupAndFixClaudeSettings(session.installDir),\n );\n logToFile('[agent-runner] settings override resolved');\n }\n\n analytics.wizardCapture('agent started', {\n integration: config.integrationLabel,\n program_id: programConfig.id,\n skill_id: config.skillId ?? null,\n });\n\n // 4. OAuth\n logToFile('[agent-runner] starting OAuth');\n const {\n projectApiKey,\n host,\n accessToken,\n projectId,\n cloudRegion,\n roleAtOrganization,\n user,\n project,\n } = await getOrAskForProjectData({\n signup: session.signup,\n ci: session.ci,\n apiKey: session.apiKey,\n projectId: session.projectId,\n email: session.email,\n region: session.region,\n programId: programConfig.id,\n });\n\n session.credentials = { accessToken, projectApiKey, host, projectId };\n session.roleAtOrganization = roleAtOrganization;\n session.apiUser = user;\n getUI().setCredentials(session.credentials);\n getUI().setRoleAtOrganization(roleAtOrganization);\n getUI().setApiUser(user);\n\n // Identify the user (email, name) before evaluating flags, so flags can target\n // the individual user and not just $app_name.\n if (user) analytics.identifyUser(user);\n analytics.setGroups(groupsFromUser(user, host));\n\n // 4.5. AI opt-in enforcement. Parks here while AiOptInRequiredScreen is\n // up if the org hasn't approved third-party AI — BEFORE the skill\n // install and agent start, so no source leaves the machine. The screen\n // alone is cosmetic; this await is the actual gate. Resolves\n // immediately when the program declared requiresAi: false or in CI.\n // In bootstrapProgram so both the linear and orchestrator arms gate.\n logToFile('[agent-runner] checking AI opt-in gate');\n await getUI().waitForAiOptIn();\n logToFile('[agent-runner] AI opt-in gate cleared');\n\n // Park for any interactive step the user must complete AFTER authenticating\n // but BEFORE the agent runs — e.g. the source-maps project picker, which\n // needs credentials to scan and writes its choice to frameworkContext that\n // the run prompt reads. Generic: await every gated step between auth and run.\n const authIndex = programConfig.steps.findIndex((s) => s.screenId === 'auth');\n const runIndex = programConfig.steps.findIndex((s) => s.screenId === 'run');\n if (authIndex !== -1 && runIndex > authIndex) {\n for (const step of programConfig.steps.slice(authIndex + 1, runIndex)) {\n if (step.gate) {\n logToFile(`[agent-runner] awaiting post-auth gate: ${step.id}`);\n await getUI().waitForGate(step.id);\n logToFile(`[agent-runner] post-auth gate cleared: ${step.id}`);\n }\n }\n }\n\n // Feature flags, variant metadata, and MCP url. Both arms need these, and the\n // fork decision reads the flags.\n const wizardFlags = await analytics.getAllFlagsForWizard();\n const wizardMetadata = buildWizardMetadata(wizardFlags);\n // Tag every wizard event with the variant so runs segment in PostHog; the\n // orchestrator arm overwrites this with its own variant when it forks.\n analytics.setTag('variant', wizardMetadata.VARIANT);\n\n // One MCP url for every region: the server resolves the user's region from\n // the bearer token, so the EU subdomain (a Claude Code OAuth workaround) is\n // not needed here.\n const mcpUrl = session.localMcp\n ? 'http://localhost:8787/mcp'\n : runtimeEnv('MCP_URL') || 'https://mcp.posthog.com/mcp';\n\n return {\n skillsBaseUrl,\n projectApiKey,\n host,\n accessToken,\n projectId,\n cloudRegion,\n mcpUrl,\n wizardFlags,\n wizardMetadata,\n project,\n };\n}\n","/** Phase transitions from [STATUS] in assistant text. Keep in sync with program \"Status to report\" bullets. */\n\nconst PHASES_ORDER = [\n '1.0-begin',\n '1.1-edit',\n '1.2-revise',\n '1.3-conclude',\n] as const;\n\nconst STATUS_PHRASES_BY_PHASE: Record<(typeof PHASES_ORDER)[number], string[]> =\n {\n '1.0-begin': [\n 'Checking project structure',\n 'Verifying PostHog dependencies',\n 'Generating events based on project',\n ],\n '1.1-edit': ['Inserting PostHog capture code'],\n '1.2-revise': [\n 'Finding and correcting errors',\n 'Report details of any errors you fix',\n 'Linting, building and prettying',\n ],\n '1.3-conclude': ['Configured dashboard', 'Created setup report'],\n };\n\nexport class PhaseDetector {\n private currentPhase: 'setup' | (typeof PHASES_ORDER)[number] = 'setup';\n\n detect(message: any): string | null {\n if (message.type !== 'assistant') return null;\n\n const nextPhase = this.getNextPhase();\n if (nextPhase === null) return null;\n\n const content = message.message?.content;\n if (!Array.isArray(content)) return null;\n\n for (const block of content) {\n if (block.type !== 'text' || typeof block.text !== 'string') continue;\n if (!block.text.includes('[STATUS]')) continue;\n\n const phrases = STATUS_PHRASES_BY_PHASE[nextPhase];\n for (const phrase of phrases) {\n if (block.text.includes(phrase)) {\n this.currentPhase = nextPhase;\n return nextPhase;\n }\n }\n }\n\n return null;\n }\n\n private getNextPhase(): (typeof PHASES_ORDER)[number] | null {\n if (this.currentPhase === 'setup') return '1.0-begin';\n const i = PHASES_ORDER.indexOf(this.currentPhase);\n if (i < 0 || i >= PHASES_ORDER.length - 1) return null;\n return PHASES_ORDER[i + 1];\n }\n\n reset(): void {\n this.currentPhase = 'setup';\n }\n}\n","/**\n * Middleware pipeline orchestrator.\n *\n * Implements the same { onMessage, finalize } interface that runAgent() expects,\n * while internally dispatching to an ordered list of middleware plugins.\n */\n\nimport { PhaseDetector } from './phase-detector';\nimport type {\n Middleware,\n MiddlewareContext,\n MiddlewareStore,\n SDKMessage,\n} from './types';\n\nexport class MiddlewarePipeline {\n private middlewares: Middleware[];\n private store = new Map<string, unknown>();\n private phaseDetector: PhaseDetector;\n private autoDetectPhases: boolean;\n private _currentPhase = 'setup';\n private _currentPhaseFreshContext = true;\n\n constructor(\n middlewares: Middleware[],\n opts?: { phaseDetector?: PhaseDetector; autoDetectPhases?: boolean },\n ) {\n this.middlewares = middlewares;\n this.phaseDetector = opts?.phaseDetector ?? new PhaseDetector();\n this.autoDetectPhases = opts?.autoDetectPhases ?? true;\n\n const ctx = this.createContext();\n for (const mw of this.middlewares) {\n mw.onInit?.(ctx);\n }\n }\n\n /** Feed an SDK message through all middleware (satisfies tracker.onMessage) */\n onMessage(message: SDKMessage): void {\n // Phase detection first — updates context before middleware sees it\n if (this.autoDetectPhases) {\n const newPhase = this.phaseDetector.detect(message);\n if (newPhase && newPhase !== this._currentPhase) {\n this.transitionPhase(newPhase, false);\n }\n }\n\n const ctx = this.createContext();\n const storeHandle = this.createStore();\n for (const mw of this.middlewares) {\n mw.onMessage?.(message, ctx, storeHandle);\n }\n }\n\n /** Finalize the run (satisfies tracker.finalize) */\n finalize(resultMessage: any, totalDurationMs: number): any {\n const ctx = this.createContext();\n const storeHandle = this.createStore();\n let result: any;\n for (const mw of this.middlewares) {\n const r = mw.onFinalize?.(\n resultMessage,\n totalDurationMs,\n ctx,\n storeHandle,\n );\n if (r !== undefined) result = r;\n }\n return result;\n }\n\n /** Explicit phase start (for phased runner support) */\n startPhase(name: string, freshContext: boolean): void {\n this.transitionPhase(name, freshContext);\n }\n\n private transitionPhase(newPhase: string, freshContext: boolean): void {\n const oldPhase = this._currentPhase;\n this._currentPhase = newPhase;\n this._currentPhaseFreshContext = freshContext;\n const ctx = this.createContext();\n const storeHandle = this.createStore();\n for (const mw of this.middlewares) {\n mw.onPhaseTransition?.(oldPhase, newPhase, ctx, storeHandle);\n }\n }\n\n private createContext(): MiddlewareContext {\n return {\n currentPhase: this._currentPhase,\n currentPhaseFreshContext: this._currentPhaseFreshContext,\n get: <T>(key: string) => this.store.get(key) as T | undefined,\n };\n }\n\n private createStore(): MiddlewareStore {\n return {\n set: (key: string, value: unknown) => this.store.set(key, value),\n };\n }\n}\n","/**\n * Benchmark configuration loader.\n *\n * Loads .benchmark-config.json from the working directory with sensible defaults.\n * All fields are optional — missing fields fall back to defaults.\n */\n\nimport fs from 'fs';\nimport path from 'path';\nimport { logToFile } from '@utils/debug';\nimport { AgentSignals } from '@lib/agent/agent-interface';\nimport { runtimeEnv } from '@env';\nimport { WIZARD_BENCHMARK_FILE, WIZARD_LOG_FILE } from '@utils/paths';\n\nexport interface BenchmarkConfig {\n /** Enable/disable individual metric plugins */\n plugins: Record<string, boolean>;\n output: {\n /** Path for the benchmark JSON output file */\n benchmarkPath: string;\n /** Whether to write the benchmark JSON file */\n benchmarkEnabled: boolean;\n /** Path for the main wizard debug log file */\n logPath: string;\n /** Whether to write the main wizard debug log */\n logEnabled: boolean;\n /** Suppress benchmark console output (disables the summary plugin) */\n suppressWizardLogs: boolean;\n };\n}\n\nconst DEFAULT_CONFIG: BenchmarkConfig = {\n plugins: {\n tokens: true,\n cache: true,\n turns: true,\n compactions: true,\n contextSize: true,\n cost: true,\n duration: true,\n summary: true,\n jsonWriter: true,\n },\n output: {\n benchmarkPath: WIZARD_BENCHMARK_FILE,\n benchmarkEnabled: true,\n logPath: WIZARD_LOG_FILE,\n logEnabled: true,\n suppressWizardLogs: false,\n },\n};\n\nexport function loadBenchmarkConfig(installDir: string): BenchmarkConfig {\n const configPath =\n runtimeEnv('POSTHOG_WIZARD_BENCHMARK_CONFIG') ??\n path.join(installDir, '.benchmark-config.json');\n try {\n const raw = fs.readFileSync(configPath, 'utf-8');\n const parsed = JSON.parse(raw);\n const config: BenchmarkConfig = {\n plugins: { ...DEFAULT_CONFIG.plugins, ...parsed.plugins },\n output: { ...DEFAULT_CONFIG.output, ...parsed.output },\n };\n\n // Env var overrides for parallel runs\n const benchFile = runtimeEnv('POSTHOG_WIZARD_BENCHMARK_FILE');\n if (benchFile) {\n config.output.benchmarkPath = benchFile;\n }\n const logDir = runtimeEnv('POSTHOG_WIZARD_LOG_DIR');\n if (logDir) {\n config.output.logPath = path.join(logDir, 'posthog-wizard.log');\n }\n\n // If benchmark output is disabled, disable the jsonWriter plugin\n if (!config.output.benchmarkEnabled) {\n config.plugins.jsonWriter = false;\n }\n\n logToFile(`${AgentSignals.BENCHMARK} Loaded config from ${configPath}`);\n return config;\n } catch {\n // No config file or invalid JSON — use defaults\n const config = structuredClone(DEFAULT_CONFIG);\n\n // Env var overrides\n const benchFile2 = runtimeEnv('POSTHOG_WIZARD_BENCHMARK_FILE');\n if (benchFile2) {\n config.output.benchmarkPath = benchFile2;\n }\n const logDir2 = runtimeEnv('POSTHOG_WIZARD_LOG_DIR');\n if (logDir2) {\n config.output.logPath = path.join(logDir2, 'posthog-wizard.log');\n }\n\n return config;\n }\n}\n\nexport function getDefaultConfig(): BenchmarkConfig {\n return structuredClone(DEFAULT_CONFIG);\n}\n","/**\n * Turn counting plugin with message deduplication.\n *\n * The SDK emits multiple assistant events per turn (one per content block)\n * with the same message ID. This plugin deduplicates and publishes turn\n * counts + a duplicate flag for downstream plugins.\n */\n\nimport type {\n Middleware,\n MiddlewareContext,\n MiddlewareStore,\n} from '@lib/middleware/types';\n\nexport interface TurnData {\n /** Whether the current message is a duplicate of the last processed turn */\n isDuplicate: boolean;\n /** Turns in the current phase */\n phaseTurns: number;\n /** Total turns across all phases */\n totalTurns: number;\n /** Per-phase turn snapshots: [{ phase, turns }] */\n phaseSnapshots: Array<{ phase: string; turns: number }>;\n}\n\nexport class TurnCounterPlugin implements Middleware {\n readonly name = 'turns';\n\n private lastMessageId: string | null = null;\n private phaseTurns = 0;\n private totalTurns = 0;\n private isDuplicate = false;\n private phaseSnapshots: Array<{ phase: string; turns: number }> = [];\n private currentPhase = 'setup';\n\n onMessage(\n message: any,\n _ctx: MiddlewareContext,\n store: MiddlewareStore,\n ): void {\n if (message.type !== 'assistant') {\n this.isDuplicate = false;\n store.set('turns', this.getData());\n return;\n }\n\n const msgId: string | undefined = message.message?.id;\n this.isDuplicate = msgId != null && msgId === this.lastMessageId;\n if (msgId) this.lastMessageId = msgId;\n\n if (!this.isDuplicate) {\n this.phaseTurns++;\n this.totalTurns++;\n }\n\n store.set('turns', this.getData());\n }\n\n onPhaseTransition(\n fromPhase: string,\n _toPhase: string,\n _ctx: MiddlewareContext,\n store: MiddlewareStore,\n ): void {\n this.phaseSnapshots.push({ phase: fromPhase, turns: this.phaseTurns });\n this.currentPhase = _toPhase;\n this.phaseTurns = 0;\n this.lastMessageId = null;\n store.set('turns', this.getData());\n }\n\n onFinalize(\n _resultMessage: any,\n _totalDurationMs: number,\n _ctx: MiddlewareContext,\n store: MiddlewareStore,\n ): void {\n this.phaseSnapshots.push({\n phase: this.currentPhase,\n turns: this.phaseTurns,\n });\n store.set('turns', this.getData());\n }\n\n private getData(): TurnData {\n return {\n isDuplicate: this.isDuplicate,\n phaseTurns: this.phaseTurns,\n totalTurns: this.totalTurns,\n phaseSnapshots: [...this.phaseSnapshots],\n };\n }\n}\n","/**\n * Token tracking plugin for input/output tokens.\n *\n * Accumulates per-turn token usage (input_tokens + cache_read_input_tokens\n * + cache_creation_input_tokens = total input; output_tokens = output).\n * Respects the dedup flag from TurnCounterPlugin. Cache breakdown (r/5m/1h)\n * is tracked by CacheTrackerPlugin for reporting and pricing.\n */\n\nimport type {\n Middleware,\n MiddlewareContext,\n MiddlewareStore,\n} from '@lib/middleware/types';\nimport type { TurnData } from './turn-counter';\n\nexport interface TokenData {\n phaseInput: number;\n phaseOutput: number;\n totalInput: number;\n totalOutput: number;\n /** The raw usage object from the last non-duplicate assistant message */\n lastUsage: any;\n /** Per-phase token snapshots */\n phaseSnapshots: Array<{\n phase: string;\n inputTokens: number;\n outputTokens: number;\n /** Number of turns in this phase that had usage (SDK may not report all) */\n messagesWithUsage: number;\n }>;\n}\n\nexport class TokenTrackerPlugin implements Middleware {\n readonly name = 'tokens';\n\n private phaseInput = 0;\n private phaseOutput = 0;\n private totalInput = 0;\n private totalOutput = 0;\n private lastUsage: any = null;\n private phaseSnapshots: Array<{\n phase: string;\n inputTokens: number;\n outputTokens: number;\n messagesWithUsage: number;\n }> = [];\n private currentPhase = 'setup';\n private phaseMessagesWithUsage = 0;\n\n onMessage(\n message: any,\n ctx: MiddlewareContext,\n store: MiddlewareStore,\n ): void {\n if (message.type !== 'assistant') return;\n\n const turns = ctx.get<TurnData>('turns');\n if (turns?.isDuplicate) return;\n\n const usage = message.message?.usage;\n if (usage) {\n const input =\n Number(usage.input_tokens ?? 0) +\n Number(usage.cache_read_input_tokens ?? 0) +\n Number(usage.cache_creation_input_tokens ?? 0);\n const output = Number(usage.output_tokens ?? 0);\n this.phaseInput += input;\n this.phaseOutput += output;\n this.totalInput += input;\n this.totalOutput += output;\n this.lastUsage = usage;\n this.phaseMessagesWithUsage += 1;\n }\n\n store.set('tokens', this.getData());\n }\n\n onPhaseTransition(\n fromPhase: string,\n toPhase: string,\n _ctx: MiddlewareContext,\n store: MiddlewareStore,\n ): void {\n this.phaseSnapshots.push({\n phase: fromPhase,\n inputTokens: this.phaseInput,\n outputTokens: this.phaseOutput,\n messagesWithUsage: this.phaseMessagesWithUsage,\n });\n this.currentPhase = toPhase;\n this.phaseInput = 0;\n this.phaseOutput = 0;\n this.phaseMessagesWithUsage = 0;\n store.set('tokens', this.getData());\n }\n\n onFinalize(\n _resultMessage: any,\n _totalDurationMs: number,\n _ctx: MiddlewareContext,\n store: MiddlewareStore,\n ): void {\n this.phaseSnapshots.push({\n phase: this.currentPhase,\n inputTokens: this.phaseInput,\n outputTokens: this.phaseOutput,\n messagesWithUsage: this.phaseMessagesWithUsage,\n });\n store.set('tokens', this.getData());\n }\n\n private getData(): TokenData {\n return {\n phaseInput: this.phaseInput,\n phaseOutput: this.phaseOutput,\n totalInput: this.totalInput,\n totalOutput: this.totalOutput,\n lastUsage: this.lastUsage,\n phaseSnapshots: [...this.phaseSnapshots],\n };\n }\n}\n","/**\n * Cache token tracking plugin (cache_read and cache_creation).\n *\n * Respects the dedup flag from TurnCounterPlugin.\n */\n\nimport type {\n Middleware,\n MiddlewareContext,\n MiddlewareStore,\n} from '@lib/middleware/types';\nimport type { TurnData } from './turn-counter';\n\n/** Matches SDK usage.cache_creation (ephemeral 5m vs 1h for pricing). */\nexport interface CacheCreationBreakdown {\n ephemeral_5m_input_tokens: number;\n ephemeral_1h_input_tokens: number;\n}\n\nexport interface CacheData {\n phaseRead: number;\n phaseCreation: number;\n totalRead: number;\n totalCreation: number;\n totalCreation5m: number;\n totalCreation1h: number;\n phaseSnapshots: Array<{\n phase: string;\n cacheReadTokens: number;\n cacheCreationTokens: number;\n /** When present, use for pricing (5m vs 1h rates). */\n cacheCreation5m: number;\n cacheCreation1h: number;\n }>;\n}\n\nexport class CacheTrackerPlugin implements Middleware {\n readonly name = 'cache';\n\n private phaseRead = 0;\n private phaseCreation = 0;\n private phaseCreation5m = 0;\n private phaseCreation1h = 0;\n private totalRead = 0;\n private totalCreation = 0;\n private totalCreation5m = 0;\n private totalCreation1h = 0;\n private phaseSnapshots: Array<{\n phase: string;\n cacheReadTokens: number;\n cacheCreationTokens: number;\n cacheCreation5m: number;\n cacheCreation1h: number;\n }> = [];\n private currentPhase = 'setup';\n\n onMessage(\n message: any,\n ctx: MiddlewareContext,\n store: MiddlewareStore,\n ): void {\n if (message.type !== 'assistant') return;\n\n const turns = ctx.get<TurnData>('turns');\n if (turns?.isDuplicate) return;\n\n const usage = message.message?.usage;\n if (usage) {\n const read = Number(usage.cache_read_input_tokens ?? 0);\n const creation = Number(usage.cache_creation_input_tokens ?? 0);\n const cc = usage.cache_creation;\n const creation5m = Number(cc?.ephemeral_5m_input_tokens ?? 0);\n const creation1h = Number(cc?.ephemeral_1h_input_tokens ?? 0);\n this.phaseRead += read;\n this.phaseCreation += creation;\n this.phaseCreation5m += creation5m;\n this.phaseCreation1h += creation1h;\n this.totalRead += read;\n this.totalCreation += creation;\n }\n\n store.set('cache', this.getData());\n }\n\n onPhaseTransition(\n fromPhase: string,\n toPhase: string,\n _ctx: MiddlewareContext,\n store: MiddlewareStore,\n ): void {\n this.phaseSnapshots.push({\n phase: fromPhase,\n cacheReadTokens: this.phaseRead,\n cacheCreationTokens: this.phaseCreation,\n cacheCreation5m: this.phaseCreation5m,\n cacheCreation1h: this.phaseCreation1h,\n });\n this.currentPhase = toPhase;\n this.phaseRead = 0;\n this.phaseCreation = 0;\n this.phaseCreation5m = 0;\n this.phaseCreation1h = 0;\n store.set('cache', this.getData());\n }\n\n onFinalize(\n _resultMessage: any,\n _totalDurationMs: number,\n _ctx: MiddlewareContext,\n store: MiddlewareStore,\n ): void {\n this.phaseSnapshots.push({\n phase: this.currentPhase,\n cacheReadTokens: this.phaseRead,\n cacheCreationTokens: this.phaseCreation,\n cacheCreation5m: this.phaseCreation5m,\n cacheCreation1h: this.phaseCreation1h,\n });\n store.set('cache', this.getData());\n }\n\n private getData(): CacheData {\n return {\n phaseRead: this.phaseRead,\n phaseCreation: this.phaseCreation,\n totalRead: this.totalRead,\n totalCreation: this.totalCreation,\n totalCreation5m: this.totalCreation5m,\n totalCreation1h: this.totalCreation1h,\n phaseSnapshots: [...this.phaseSnapshots],\n };\n }\n}\n","/**\n * Compaction event tracking plugin.\n *\n * Tracks context compaction events (compact_boundary system messages)\n * including pre-compaction token counts per phase.\n */\n\nimport type {\n Middleware,\n MiddlewareContext,\n MiddlewareStore,\n} from '@lib/middleware/types';\nimport { logToFile } from '@utils/debug';\nimport { AgentSignals } from '@lib/agent/agent-interface';\n\nexport interface CompactionData {\n phaseCompactions: number;\n phasePreTokens: number[];\n totalCompactions: number;\n phaseSnapshots: Array<{\n phase: string;\n compactions: number;\n preTokens: number[];\n }>;\n}\n\nexport class CompactionTrackerPlugin implements Middleware {\n readonly name = 'compactions';\n\n private phaseCompactions = 0;\n private phasePreTokens: number[] = [];\n private totalCompactions = 0;\n private phaseSnapshots: Array<{\n phase: string;\n compactions: number;\n preTokens: number[];\n }> = [];\n private currentPhase = 'setup';\n\n onMessage(\n message: any,\n ctx: MiddlewareContext,\n store: MiddlewareStore,\n ): void {\n if (message.type !== 'system' || message.subtype !== 'compact_boundary') {\n return;\n }\n\n const preTokens = message.compact_metadata?.pre_tokens ?? 0;\n const trigger = message.compact_metadata?.trigger ?? 'unknown';\n this.phaseCompactions++;\n this.totalCompactions++;\n this.phasePreTokens.push(preTokens);\n\n logToFile(\n `${AgentSignals.BENCHMARK} [COMPACTION] Context compacted during \"${ctx.currentPhase}\" (trigger: ${trigger}, pre_tokens: ${preTokens})`,\n );\n\n store.set('compactions', this.getData());\n }\n\n onPhaseTransition(\n fromPhase: string,\n toPhase: string,\n _ctx: MiddlewareContext,\n store: MiddlewareStore,\n ): void {\n this.phaseSnapshots.push({\n phase: fromPhase,\n compactions: this.phaseCompactions,\n preTokens: [...this.phasePreTokens],\n });\n this.currentPhase = toPhase;\n this.phaseCompactions = 0;\n this.phasePreTokens = [];\n store.set('compactions', this.getData());\n }\n\n onFinalize(\n _resultMessage: any,\n _totalDurationMs: number,\n _ctx: MiddlewareContext,\n store: MiddlewareStore,\n ): void {\n this.phaseSnapshots.push({\n phase: this.currentPhase,\n compactions: this.phaseCompactions,\n preTokens: [...this.phasePreTokens],\n });\n store.set('compactions', this.getData());\n }\n\n private getData(): CompactionData {\n return {\n phaseCompactions: this.phaseCompactions,\n phasePreTokens: [...this.phasePreTokens],\n totalCompactions: this.totalCompactions,\n phaseSnapshots: [...this.phaseSnapshots],\n };\n }\n}\n","/**\n * Context size tracking plugin (context tokens in/out per phase).\n *\n * Context tokens out = sum of input + cache_read + cache_creation from the\n * last assistant message's usage (per-turn, NOT aggregate).\n * Context tokens in = previous phase's context tokens out.\n */\n\nimport type {\n Middleware,\n MiddlewareContext,\n MiddlewareStore,\n} from '@lib/middleware/types';\nimport type { TokenData } from './token-tracker';\n\nexport interface ContextSizeData {\n /** Per-phase context size snapshots */\n phaseSnapshots: Array<{\n phase: string;\n contextTokensIn?: number;\n contextTokensOut?: number;\n freshContext: boolean;\n }>;\n}\n\nexport class ContextSizeTrackerPlugin implements Middleware {\n readonly name = 'contextSize';\n\n private phaseSnapshots: Array<{\n phase: string;\n contextTokensIn?: number;\n contextTokensOut?: number;\n freshContext: boolean;\n }> = [];\n private lastContextTokensOut?: number;\n\n onPhaseTransition(\n fromPhase: string,\n _toPhase: string,\n ctx: MiddlewareContext,\n store: MiddlewareStore,\n ): void {\n const tokens = ctx.get<TokenData>('tokens');\n const contextTokensOut = this.computeContextTokensOut(tokens?.lastUsage);\n\n this.phaseSnapshots.push({\n phase: fromPhase,\n contextTokensIn: ctx.currentPhaseFreshContext\n ? undefined\n : this.lastContextTokensOut,\n contextTokensOut,\n freshContext: ctx.currentPhaseFreshContext,\n });\n\n this.lastContextTokensOut = contextTokensOut;\n store.set('contextSize', this.getData());\n }\n\n onFinalize(\n _resultMessage: any,\n _totalDurationMs: number,\n ctx: MiddlewareContext,\n store: MiddlewareStore,\n ): void {\n const tokens = ctx.get<TokenData>('tokens');\n const contextTokensOut = this.computeContextTokensOut(tokens?.lastUsage);\n\n this.phaseSnapshots.push({\n phase: ctx.currentPhase,\n contextTokensIn: ctx.currentPhaseFreshContext\n ? undefined\n : this.lastContextTokensOut,\n contextTokensOut,\n freshContext: ctx.currentPhaseFreshContext,\n });\n\n store.set('contextSize', this.getData());\n }\n\n private computeContextTokensOut(usage: any): number | undefined {\n if (!usage) return undefined;\n return (\n Number(usage.input_tokens ?? 0) +\n Number(usage.cache_read_input_tokens ?? 0) +\n Number(usage.cache_creation_input_tokens ?? 0)\n );\n }\n\n private getData(): ContextSizeData {\n return {\n phaseSnapshots: [...this.phaseSnapshots],\n };\n }\n}\n","import type {\n Middleware,\n MiddlewareContext,\n MiddlewareStore,\n} from '@lib/middleware/types';\nimport type { TokenData } from './token-tracker';\nimport type { CacheData } from './cache-tracker';\n\nexport interface CostData {\n totalCost: number;\n phaseCosts: Array<{ phase: string; cost: number }>;\n}\n\n/** Claude Sonnet 4.6 pricing (USD per 1M tokens) */\nconst PRICE_PER_MTOK = {\n input: 3,\n output: 15,\n cacheRead: 0.3,\n cacheCreation5m: 3.75,\n cacheCreation1h: 6,\n} as const;\n\nfunction computeCost(\n inputTokens: number,\n outputTokens: number,\n cacheReadTokens: number,\n cacheCreation5m: number,\n cacheCreation1h: number,\n cacheCreationFallback: number,\n): number {\n const hasBreakdown = cacheCreation5m > 0 || cacheCreation1h > 0;\n return (\n inputTokens * (PRICE_PER_MTOK.input / 1e6) +\n outputTokens * (PRICE_PER_MTOK.output / 1e6) +\n cacheReadTokens * (PRICE_PER_MTOK.cacheRead / 1e6) +\n (hasBreakdown\n ? cacheCreation5m * (PRICE_PER_MTOK.cacheCreation5m / 1e6) +\n cacheCreation1h * (PRICE_PER_MTOK.cacheCreation1h / 1e6)\n : cacheCreationFallback * (PRICE_PER_MTOK.cacheCreation5m / 1e6))\n );\n}\n\nexport class CostTrackerPlugin implements Middleware {\n readonly name = 'cost';\n\n private phaseCosts: Array<{ phase: string; cost: number }> = [];\n private totalCost = 0;\n\n onPhaseTransition(\n fromPhase: string,\n _toPhase: string,\n ctx: MiddlewareContext,\n store: MiddlewareStore,\n ): void {\n const tokens = ctx.get<TokenData>('tokens');\n const cache = ctx.get<CacheData>('cache');\n const tokenSnap = tokens?.phaseSnapshots.at(-1);\n const cacheSnap = cache?.phaseSnapshots.at(-1);\n\n const totalIn = tokenSnap?.inputTokens ?? 0;\n const read = cacheSnap?.cacheReadTokens ?? 0;\n const creation = cacheSnap?.cacheCreationTokens ?? 0;\n const c5m = cacheSnap?.cacheCreation5m ?? 0;\n const c1h = cacheSnap?.cacheCreation1h ?? 0;\n const baseIn = Math.max(0, totalIn - read - creation);\n\n const phaseCost = computeCost(\n baseIn,\n tokenSnap?.outputTokens ?? 0,\n read,\n c5m,\n c1h,\n creation,\n );\n\n this.phaseCosts.push({ phase: fromPhase, cost: phaseCost });\n this.totalCost += phaseCost;\n store.set('cost', this.getData());\n }\n\n onFinalize(\n resultMessage: any,\n _totalDurationMs: number,\n ctx: MiddlewareContext,\n store: MiddlewareStore,\n ): void {\n const tokens = ctx.get<TokenData>('tokens');\n const cache = ctx.get<CacheData>('cache');\n const tokenSnap = tokens?.phaseSnapshots.at(-1);\n const cacheSnap = cache?.phaseSnapshots.at(-1);\n\n const totalIn = tokenSnap?.inputTokens ?? 0;\n const read = cacheSnap?.cacheReadTokens ?? 0;\n const creation = cacheSnap?.cacheCreationTokens ?? 0;\n const c5m = cacheSnap?.cacheCreation5m ?? 0;\n const c1h = cacheSnap?.cacheCreation1h ?? 0;\n const baseIn = Math.max(0, totalIn - read - creation);\n\n const lastPhaseCost = computeCost(\n baseIn,\n tokenSnap?.outputTokens ?? 0,\n read,\n c5m,\n c1h,\n creation,\n );\n\n this.phaseCosts.push({ phase: ctx.currentPhase, cost: lastPhaseCost });\n this.totalCost += lastPhaseCost;\n\n const sdkTotal =\n Number(resultMessage?.usage?.total_cost_usd ?? 0) ||\n Number(resultMessage?.total_cost_usd ?? 0);\n\n if (sdkTotal > 0 && this.totalCost > 0) {\n const scale = sdkTotal / this.totalCost;\n this.phaseCosts = this.phaseCosts.map((p) => ({\n phase: p.phase,\n cost: p.cost * scale,\n }));\n this.totalCost = sdkTotal;\n }\n\n store.set('cost', this.getData());\n }\n\n private getData(): CostData {\n return {\n totalCost: this.totalCost,\n phaseCosts: [...this.phaseCosts],\n };\n }\n}\n","/**\n * Duration tracking plugin (per-phase and total).\n */\n\nimport type {\n Middleware,\n MiddlewareContext,\n MiddlewareStore,\n} from '@lib/middleware/types';\n\nexport interface DurationData {\n phaseSnapshots: Array<{\n phase: string;\n startTime: number;\n endTime: number;\n durationMs: number;\n }>;\n totalDurationMs: number;\n}\n\nexport class DurationTrackerPlugin implements Middleware {\n readonly name = 'duration';\n\n private phaseStartTime = Date.now();\n private phaseSnapshots: Array<{\n phase: string;\n startTime: number;\n endTime: number;\n durationMs: number;\n }> = [];\n\n onPhaseTransition(\n fromPhase: string,\n _toPhase: string,\n _ctx: MiddlewareContext,\n store: MiddlewareStore,\n ): void {\n const now = Date.now();\n this.phaseSnapshots.push({\n phase: fromPhase,\n startTime: this.phaseStartTime,\n endTime: now,\n durationMs: now - this.phaseStartTime,\n });\n this.phaseStartTime = now;\n store.set('duration', {\n phaseSnapshots: [...this.phaseSnapshots],\n totalDurationMs: 0,\n } satisfies DurationData);\n }\n\n onFinalize(\n _resultMessage: any,\n totalDurationMs: number,\n ctx: MiddlewareContext,\n store: MiddlewareStore,\n ): void {\n const now = Date.now();\n this.phaseSnapshots.push({\n phase: ctx.currentPhase,\n startTime: this.phaseStartTime,\n endTime: now,\n durationMs: now - this.phaseStartTime,\n });\n\n store.set('duration', {\n phaseSnapshots: [...this.phaseSnapshots],\n totalDurationMs,\n } satisfies DurationData);\n }\n}\n","import { getUI, type SpinnerHandle } from '@ui';\nimport { AgentSignals } from '@lib/agent/agent-interface';\nimport type {\n Middleware,\n MiddlewareContext,\n MiddlewareStore,\n} from '@lib/middleware/types';\nimport type { TokenData } from './token-tracker';\nimport type { TurnData } from './turn-counter';\nimport type { CostData } from './cost-tracker';\nimport type { DurationData } from './duration-tracker';\nimport type { CompactionData } from './compaction-tracker';\nimport type { ContextSizeData } from './context-size-tracker';\nimport type { CacheData } from './cache-tracker';\n\nfunction fmtDuration(ms: number): string {\n const s = Math.round(ms / 1000);\n const m = Math.floor(s / 60);\n return m > 0 ? `${m}m ${s % 60}s` : `${s}s`;\n}\n\nfunction fmtTok(n: number): string {\n if (n >= 1_000_000) return `${(n / 1_000_000).toFixed(1)}M`;\n if (n >= 1_000) return `${(n / 1000).toFixed(1)}K`;\n return n.toLocaleString();\n}\n\nfunction fmtCost(usd: number): string {\n if (usd > 0 && usd < 0.01) return `$${usd.toFixed(4)}`;\n return `$${usd.toFixed(2)}`;\n}\n\ninterface PhaseStats {\n phase: string;\n durationMs: number;\n turns: number;\n inputTokens: number;\n outputTokens: number;\n cacheRead: number;\n cacheCreation5m: number;\n cacheCreation1h: number;\n cost: number;\n compactions: number;\n contextOut: number | undefined;\n}\n\nfunction printPhase(s: PhaseStats): string {\n const baseIn = Math.max(\n 0,\n s.inputTokens - s.cacheRead - s.cacheCreation5m - s.cacheCreation1h,\n );\n return [\n `${s.phase}: ${fmtDuration(s.durationMs)}, ${\n s.turns\n } turns, cost: ${fmtCost(s.cost)}`,\n ` in: ${fmtTok(baseIn)}, out: ${fmtTok(\n s.outputTokens,\n )}, cache_read: ${fmtTok(s.cacheRead)}, cache_5m: ${fmtTok(\n s.cacheCreation5m,\n )}, cache_1h: ${fmtTok(s.cacheCreation1h)}`,\n s.compactions > 0 ? ` ${s.compactions} compaction(s)` : null,\n s.contextOut !== undefined ? ` ctx_out: ${fmtTok(s.contextOut)}` : null,\n ]\n .filter(Boolean)\n .join('\\n');\n}\n\nfunction getPhaseStats(i: number, ctx: MiddlewareContext): PhaseStats | null {\n const duration = ctx.get<DurationData>('duration');\n const dur = duration?.phaseSnapshots[i];\n if (!dur) return null;\n\n const tokens = ctx.get<TokenData>('tokens');\n const turns = ctx.get<TurnData>('turns');\n const cost = ctx.get<CostData>('cost');\n const compactions = ctx.get<CompactionData>('compactions');\n const contextSize = ctx.get<ContextSizeData>('contextSize');\n const cache = ctx.get<CacheData>('cache');\n\n return {\n phase: dur.phase,\n durationMs: dur.durationMs,\n turns: turns?.phaseSnapshots[i]?.turns ?? 0,\n inputTokens: tokens?.phaseSnapshots[i]?.inputTokens ?? 0,\n outputTokens: tokens?.phaseSnapshots[i]?.outputTokens ?? 0,\n cacheRead: cache?.phaseSnapshots[i]?.cacheReadTokens ?? 0,\n cacheCreation5m: cache?.phaseSnapshots[i]?.cacheCreation5m ?? 0,\n cacheCreation1h: cache?.phaseSnapshots[i]?.cacheCreation1h ?? 0,\n cost: cost?.phaseCosts[i]?.cost ?? 0,\n compactions: compactions?.phaseSnapshots[i]?.compactions ?? 0,\n contextOut: contextSize?.phaseSnapshots[i]?.contextTokensOut,\n };\n}\n\nexport class SummaryPlugin implements Middleware {\n readonly name = 'summary';\n\n private spinner: SpinnerHandle;\n\n constructor(spinner: SpinnerHandle) {\n this.spinner = spinner;\n }\n\n onPhaseTransition(\n fromPhase: string,\n toPhase: string,\n ctx: MiddlewareContext,\n _store: MiddlewareStore,\n ): void {\n const duration = ctx.get<DurationData>('duration');\n const idx = (duration?.phaseSnapshots.length ?? 1) - 1;\n const stats = getPhaseStats(idx, ctx);\n\n if (stats) {\n this.spinner.stop(`${AgentSignals.BENCHMARK} ${printPhase(stats)}`);\n } else {\n this.spinner.stop(`${AgentSignals.BENCHMARK} ${fromPhase}`);\n }\n\n getUI().log.info(`${AgentSignals.BENCHMARK} Starting phase: ${toPhase}`);\n this.spinner.start(`Integrating PostHog (${toPhase})...`);\n }\n\n onFinalize(\n _resultMessage: any,\n totalDurationMs: number,\n ctx: MiddlewareContext,\n _store: MiddlewareStore,\n ): void {\n const duration = ctx.get<DurationData>('duration');\n const cost = ctx.get<CostData>('cost');\n const tokens = ctx.get<TokenData>('tokens');\n const cache = ctx.get<CacheData>('cache');\n\n const phaseCount = duration?.phaseSnapshots.length ?? 0;\n const totalCost = cost?.totalCost ?? 0;\n\n getUI().log.info('');\n getUI().log.info(\n `◇ ${AgentSignals.BENCHMARK} ${phaseCount} phases in ${fmtDuration(\n totalDurationMs,\n )}, cost: ${fmtCost(totalCost)}`,\n );\n getUI().log.info(\n ` total in: ${fmtTok(tokens?.totalInput ?? 0)}, out: ${fmtTok(\n tokens?.totalOutput ?? 0,\n )}, cache_read: ${fmtTok(cache?.totalRead ?? 0)}, cache_5m: ${fmtTok(\n cache?.totalCreation5m ?? 0,\n )}, cache_1h: ${fmtTok(cache?.totalCreation1h ?? 0)}`,\n );\n getUI().log.info('');\n getUI().log.info(`● ${AgentSignals.BENCHMARK} Summary by phase:`);\n\n if (duration?.phaseSnapshots) {\n for (let i = 0; i < duration.phaseSnapshots.length; i++) {\n const stats = getPhaseStats(i, ctx);\n if (stats) {\n getUI().log.info(printPhase(stats));\n }\n }\n }\n\n getUI().log.info('');\n }\n}\n","/**\n * JSON file output plugin.\n *\n * Assembles the BenchmarkData structure from all upstream plugin data\n * and writes it to a JSON file. Returns the BenchmarkData for backward compat.\n */\n\nimport fs from 'fs';\nimport { getUI } from '@ui';\nimport { logToFile } from '@utils/debug';\nimport { AgentSignals } from '@lib/agent/agent-interface';\nimport type {\n Middleware,\n MiddlewareContext,\n MiddlewareStore,\n} from '@lib/middleware/types';\nimport type { TokenData } from './token-tracker';\nimport type { CacheData } from './cache-tracker';\nimport type { TurnData } from './turn-counter';\nimport type { CostData } from './cost-tracker';\nimport type { DurationData } from './duration-tracker';\nimport type { CompactionData } from './compaction-tracker';\nimport type { ContextSizeData } from './context-size-tracker';\nimport type { BenchmarkData, StepUsage } from '@lib/middleware/benchmark';\n\n/**\n * Sum token usage across all models from the SDK's modelUsage field.\n */\nfunction sumModelUsage(modelUsage: Record<string, any>): {\n input_tokens: number;\n output_tokens: number;\n cache_creation_input_tokens: number;\n cache_read_input_tokens: number;\n} {\n let input_tokens = 0;\n let output_tokens = 0;\n let cache_creation_input_tokens = 0;\n let cache_read_input_tokens = 0;\n\n for (const model of Object.values(modelUsage)) {\n input_tokens += model.inputTokens ?? 0;\n output_tokens += model.outputTokens ?? 0;\n cache_creation_input_tokens += model.cacheCreationInputTokens ?? 0;\n cache_read_input_tokens += model.cacheReadInputTokens ?? 0;\n }\n\n return {\n input_tokens,\n output_tokens,\n cache_creation_input_tokens,\n cache_read_input_tokens,\n };\n}\n\nexport class JsonWriterPlugin implements Middleware {\n readonly name = 'jsonWriter';\n\n private outputPath: string;\n\n constructor(outputPath: string) {\n this.outputPath = outputPath;\n }\n\n onFinalize(\n resultMessage: any,\n totalDurationMs: number,\n ctx: MiddlewareContext,\n _store: MiddlewareStore,\n ): BenchmarkData {\n const tokens = ctx.get<TokenData>('tokens');\n const cache = ctx.get<CacheData>('cache');\n const turns = ctx.get<TurnData>('turns');\n const cost = ctx.get<CostData>('cost');\n const duration = ctx.get<DurationData>('duration');\n const compactions = ctx.get<CompactionData>('compactions');\n const contextSize = ctx.get<ContextSizeData>('contextSize');\n\n const modelUsage = resultMessage?.modelUsage ?? {};\n const aggregateUsage = sumModelUsage(modelUsage);\n\n const phaseCount = duration?.phaseSnapshots.length ?? 0;\n const steps: StepUsage[] = [];\n\n for (let i = 0; i < phaseCount; i++) {\n const dur = duration!.phaseSnapshots[i];\n const tokenSnap = tokens?.phaseSnapshots[i];\n const cacheSnap = cache?.phaseSnapshots[i];\n const turnSnap = turns?.phaseSnapshots[i];\n const costSnap = cost?.phaseCosts[i];\n const compSnap = compactions?.phaseSnapshots[i];\n const ctxSnap = contextSize?.phaseSnapshots[i];\n\n const step: StepUsage = {\n name: dur.phase,\n usage: {\n input_tokens: tokenSnap?.inputTokens ?? 0,\n output_tokens: tokenSnap?.outputTokens ?? 0,\n cache_creation_input_tokens: cacheSnap?.cacheCreationTokens ?? 0,\n cache_read_input_tokens: cacheSnap?.cacheReadTokens ?? 0,\n ...((cacheSnap?.cacheCreation5m ?? 0) +\n (cacheSnap?.cacheCreation1h ?? 0) >\n 0 && {\n cache_creation: {\n ephemeral_5m_input_tokens: cacheSnap?.cacheCreation5m ?? 0,\n ephemeral_1h_input_tokens: cacheSnap?.cacheCreation1h ?? 0,\n },\n }),\n },\n modelUsage: {},\n totalCostUsd: costSnap?.cost ?? 0,\n durationMs: dur.durationMs,\n durationApiMs: 0,\n numTurns: turnSnap?.turns ?? 0,\n ...(ctxSnap?.contextTokensIn !== undefined && {\n contextTokensIn: ctxSnap.contextTokensIn,\n }),\n ...(ctxSnap?.contextTokensOut !== undefined && {\n contextTokensOut: ctxSnap.contextTokensOut,\n }),\n ...(compSnap && compSnap.compactions > 0\n ? {\n compactions: compSnap.compactions,\n compactionPreTokens: compSnap.preTokens,\n }\n : {}),\n };\n\n steps.push(step);\n }\n\n const totalTurns = turns?.totalTurns ?? 0;\n const totalCost = cost?.totalCost ?? 0;\n const totalCompactions = compactions?.totalCompactions ?? 0;\n const fromModelUsage =\n aggregateUsage.input_tokens +\n aggregateUsage.cache_read_input_tokens +\n aggregateUsage.cache_creation_input_tokens;\n const inputTokens =\n fromModelUsage > 0\n ? fromModelUsage\n : (tokens?.totalInput ?? 0) +\n (cache?.totalRead ?? 0) +\n (cache?.totalCreation ?? 0);\n const outputTokens =\n aggregateUsage.output_tokens > 0\n ? aggregateUsage.output_tokens\n : tokens?.totalOutput ?? 0;\n\n const benchmark: BenchmarkData = {\n timestamp: new Date().toISOString(),\n steps,\n totals: {\n totalCostUsd: totalCost,\n durationMs: totalDurationMs,\n inputTokens,\n outputTokens,\n numTurns: resultMessage?.num_turns ?? totalTurns,\n totalCompactions,\n totalCacheReadTokens: cache?.totalRead ?? 0,\n totalCacheCreation5mTokens: cache?.totalCreation5m ?? 0,\n totalCacheCreation1hTokens: cache?.totalCreation1h ?? 0,\n },\n };\n\n this.writeBenchmarkData(benchmark);\n return benchmark;\n }\n\n private writeBenchmarkData(data: BenchmarkData): void {\n try {\n fs.writeFileSync(this.outputPath, JSON.stringify(data, null, 2));\n logToFile(`Benchmark data written to ${this.outputPath}`);\n getUI().log.info(\n `● ${AgentSignals.BENCHMARK} Results written to ${this.outputPath}`,\n );\n } catch (error) {\n logToFile('Failed to write benchmark data:', error);\n }\n }\n}\n","/**\n * Plugin registry and factory.\n *\n * Maps plugin names to constructors and creates the ordered plugin list\n * from a BenchmarkConfig.\n */\n\nimport type {\n Middleware,\n MiddlewareFactoryOptions,\n} from '@lib/middleware/types';\nimport type { BenchmarkConfig } from '@lib/middleware/config';\nimport { TurnCounterPlugin } from './turn-counter';\nimport { TokenTrackerPlugin } from './token-tracker';\nimport { CacheTrackerPlugin } from './cache-tracker';\nimport { CompactionTrackerPlugin } from './compaction-tracker';\nimport { ContextSizeTrackerPlugin } from './context-size-tracker';\nimport { CostTrackerPlugin } from './cost-tracker';\nimport { DurationTrackerPlugin } from './duration-tracker';\nimport { SummaryPlugin } from './summary';\nimport { JsonWriterPlugin } from './json-writer';\n\ntype PluginFactory = (opts: MiddlewareFactoryOptions) => Middleware;\n\nconst PLUGIN_REGISTRY: Record<string, PluginFactory> = {\n turns: () => new TurnCounterPlugin(),\n tokens: () => new TokenTrackerPlugin(),\n cache: () => new CacheTrackerPlugin(),\n compactions: () => new CompactionTrackerPlugin(),\n contextSize: () => new ContextSizeTrackerPlugin(),\n cost: () => new CostTrackerPlugin(),\n duration: () => new DurationTrackerPlugin(),\n summary: (opts) => new SummaryPlugin(opts.spinner!),\n jsonWriter: (opts) => new JsonWriterPlugin(opts.outputPath!),\n};\n\n/**\n * Execution order — data producers before consumers:\n * turns (dedup) -> tokens -> cache -> compactions -> contextSize -> cost -> duration -> summary -> jsonWriter\n */\nconst PLUGIN_ORDER = [\n 'turns',\n 'tokens',\n 'cache',\n 'compactions',\n 'contextSize',\n 'cost',\n 'duration',\n 'summary',\n 'jsonWriter',\n];\n\nexport function createPluginsFromConfig(\n config: BenchmarkConfig,\n opts: MiddlewareFactoryOptions,\n): Middleware[] {\n const resolvedOpts: MiddlewareFactoryOptions = {\n ...opts,\n outputPath: opts.outputPath ?? config.output.benchmarkPath,\n };\n\n // If suppressWizardLogs is set, disable the summary plugin\n const effectivePlugins = { ...config.plugins };\n if (config.output.suppressWizardLogs) {\n effectivePlugins.summary = false;\n }\n\n return PLUGIN_ORDER.filter((name) => effectivePlugins[name] !== false)\n .map((name) => PLUGIN_REGISTRY[name])\n .filter(Boolean)\n .map((factory) => factory(resolvedOpts));\n}\n","/**\n * Benchmark tracking for wizard runs.\n *\n * Usage:\n * const pipeline = createBenchmarkPipeline(spinner, options);\n * pipeline.onMessage(message);\n * pipeline.finalize(resultMessage, durationMs);\n */\n\nimport { getUI, type SpinnerHandle } from '@ui';\nimport { logToFile, getLogFilePath, configureLogFile } from '@utils/debug';\nimport { MiddlewarePipeline } from './pipeline';\nimport { PhaseDetector } from './phase-detector';\nimport { loadBenchmarkConfig } from './config';\nimport { createPluginsFromConfig } from './benchmarks';\nimport type { BenchmarkConfig } from './config';\nimport type { WizardRunOptions } from '@utils/types';\nimport { AgentSignals } from '@lib/agent/agent-interface';\n\n// ── Types ──────────────────────────────────────────────────────────────\n\nexport interface StepUsage {\n name: string;\n usage: {\n input_tokens: number;\n output_tokens: number;\n cache_creation_input_tokens: number;\n cache_read_input_tokens: number;\n cache_creation?: {\n ephemeral_5m_input_tokens: number;\n ephemeral_1h_input_tokens: number;\n };\n };\n modelUsage: Record<string, unknown>;\n totalCostUsd: number;\n durationMs: number;\n durationApiMs: number;\n numTurns: number;\n contextTokensIn?: number;\n contextTokensOut?: number;\n compactions?: number;\n compactionPreTokens?: number[];\n}\n\nexport interface BenchmarkData {\n timestamp: string;\n steps: StepUsage[];\n totals: {\n totalCostUsd: number;\n durationMs: number;\n inputTokens: number;\n outputTokens: number;\n numTurns: number;\n totalCompactions: number;\n totalCacheReadTokens: number;\n totalCacheCreation5mTokens: number;\n totalCacheCreation1hTokens: number;\n };\n}\n\n// ── Factory ────────────────────────────────────────────────────────────\n\n/**\n * Create a middleware pipeline configured for benchmarking.\n * Loads .benchmark-config.json from the install dir, falls back to defaults.\n */\nexport function createBenchmarkPipeline(\n spinner: SpinnerHandle,\n options: WizardRunOptions,\n configOverride?: BenchmarkConfig,\n): MiddlewarePipeline {\n const config = configOverride ?? loadBenchmarkConfig(options.installDir);\n\n configureLogFile({\n path: config.output.logPath,\n enabled: config.output.logEnabled,\n });\n\n const plugins = createPluginsFromConfig(config, {\n spinner,\n phased: false,\n outputPath: config.output.benchmarkPath,\n });\n\n if (!config.output.suppressWizardLogs) {\n getUI().log.info(\n `${AgentSignals.BENCHMARK} Verbose logs: ${getLogFilePath()}`,\n );\n getUI().log.info(\n `${AgentSignals.BENCHMARK} Benchmark data will be written to: ${config.output.benchmarkPath}`,\n );\n }\n\n logToFile(\n `${AgentSignals.BENCHMARK} Tracking enabled, starting with setup phase`,\n );\n\n return new MiddlewarePipeline(plugins, {\n phaseDetector: new PhaseDetector(),\n autoDetectPhases: true,\n });\n}\n","/**\n * WizardAskBridge — host-side promise broker for the `wizard_ask` MCP tool.\n *\n * The `wizard_ask` tool needs to (a) read information from the wizard\n * session (the active skill id, used as the analytics `source`) and\n * (b) drive the TUI overlay. Wiring `wizard-tools.ts` directly to either\n * would couple our pure-data MCP server to the runtime UI layer.\n *\n * The bridge is the seam: `wizard-tools.ts` depends on this interface,\n * and `agent-runner.ts` constructs an implementation that knows about\n * both the session and `getUI()`.\n */\nimport { randomUUID } from 'crypto';\n\nimport { analytics } from '@utils/analytics';\nimport type {\n AskAnswers,\n AskQuestion,\n PendingQuestion,\n} from './wizard-session';\n\nexport interface WizardAskRequest {\n questions: AskQuestion[];\n}\n\nexport interface WizardAskBridge {\n /**\n * Open the WizardAsk overlay and resolve with the user's answers.\n * One answer per question id (string for `single`/`text`, string[] for\n * `multi`). Cancelled fields come back as the literal `\"__cancelled__\"`.\n */\n request(req: WizardAskRequest): Promise<AskAnswers>;\n}\n\nexport interface WizardAskBridgeOptions {\n /** Returns the active skill id, used as the analytics `source` on the request. */\n getSource: () => string;\n /** Opens the overlay and resolves once the user submits or cancels. */\n showQuestion: (question: PendingQuestion) => Promise<AskAnswers>;\n /**\n * Per-question timeout in milliseconds. When the user takes longer than\n * this to answer, every unanswered field resolves with the\n * {@link CANCELLED_SENTINEL} value. Defaults to {@link DEFAULT_ASK_TIMEOUT_MS}.\n */\n timeoutMs?: number;\n /**\n * Opt the rendered overlay into rich link handling (OSC 8 hyperlinks +\n * clipboard copy for prompt URLs). Set per program; defaults to false.\n * Propagated onto every {@link PendingQuestion} this bridge creates.\n */\n richLinks?: boolean;\n}\n\n/** Sentinel returned for unanswered fields on cancellation or timeout. */\nexport const CANCELLED_SENTINEL = '__cancelled__';\n\n/** Default per-question timeout (5 minutes). */\nexport const DEFAULT_ASK_TIMEOUT_MS = 5 * 60 * 1000;\n\nfunction buildCancelledAnswers(questions: AskQuestion[]): AskAnswers {\n const out: AskAnswers = {};\n for (const q of questions) {\n out[q.id] = CANCELLED_SENTINEL;\n }\n return out;\n}\n\nfunction isFullyCancelled(answers: AskAnswers): boolean {\n const values = Object.values(answers);\n if (values.length === 0) return false;\n return values.every((v) => v === CANCELLED_SENTINEL);\n}\n\nexport function createWizardAskBridge(\n opts: WizardAskBridgeOptions,\n): WizardAskBridge {\n const timeoutMs = opts.timeoutMs ?? DEFAULT_ASK_TIMEOUT_MS;\n\n return {\n async request({ questions }) {\n const pending: PendingQuestion = {\n id: randomUUID(),\n questions,\n source: opts.getSource(),\n richLinks: opts.richLinks ?? false,\n };\n\n const startedAt = Date.now();\n let timer: ReturnType<typeof setTimeout> | undefined;\n\n // Race the user against the timeout. Whichever fires first wins; the\n // other branch is harmless because the overlay still resolves via the\n // store when the user eventually submits (and the answers are simply\n // discarded).\n const timeoutPromise = new Promise<AskAnswers>((resolve) => {\n timer = setTimeout(() => {\n resolve(buildCancelledAnswers(questions));\n }, timeoutMs);\n });\n\n try {\n const answers = await Promise.race([\n opts.showQuestion(pending),\n timeoutPromise,\n ]);\n const durationMs = Date.now() - startedAt;\n\n if (isFullyCancelled(answers)) {\n analytics.wizardCapture('wizard_ask cancelled', {\n source: pending.source,\n question_count: questions.length,\n duration_ms: durationMs,\n timed_out: durationMs >= timeoutMs,\n });\n } else {\n analytics.wizardCapture('wizard_ask answered', {\n source: pending.source,\n question_count: questions.length,\n duration_ms: durationMs,\n });\n }\n\n return answers;\n } finally {\n if (timer) clearTimeout(timer);\n }\n },\n };\n}\n","/**\n * Agent prompt assembly.\n *\n * Three sections, always in this order:\n * 1. Default project prompt — credentials and base context (always included)\n * 2. Custom prompt — additional program-specific instructions (if set)\n * 3. Skill prompt — \"follow SKILL.md\" instructions (if a skill was installed)\n */\n\nimport type { ProgramRun } from './agent-runner.js';\n\n/**\n * Values available to prompt builders after OAuth completes.\n */\nexport interface PromptContext {\n projectId: number;\n projectApiKey: string;\n host: string;\n /** Set when skillId was provided and the skill was installed successfully. */\n skillPath?: string;\n /**\n * Org-level AI consent (`is_ai_data_processing_approved`) read from the\n * `/api/users/@me/` payload at auth time. `null` = unknown (older orgs,\n * or the user fetch failed). Lets prompts pre-resolve consent state so\n * agents only ask the user when it is actually off or unknown.\n */\n orgAiDataProcessingApproved?: boolean | null;\n /**\n * Team product opt-ins from the `/api/projects/:id/` payload at auth\n * time. Project-level truth for \"is this product enabled\" — products\n * can be instrumented from other repos or the snippet, so repo-local\n * evidence must never rule them out. `null` field = unknown.\n */\n teamProductOptIns?: {\n sessionReplay?: boolean | null;\n exceptionAutocapture?: boolean | null;\n surveys?: boolean | null;\n } | null;\n}\n\nfunction defaultProjectPrompt(ctx: PromptContext): string {\n return `You have access to the PostHog MCP server.\n\nProject context:\n- PostHog Project ID: ${ctx.projectId}\n- PostHog public token: ${ctx.projectApiKey}\n- PostHog Host: ${ctx.host}`;\n}\n\nfunction skillPrompt(skillPath: string, reportFile: string): string {\n return `A PostHog skill has been installed at ${skillPath}/. Read ${skillPath}/SKILL.md and follow its instructions completely.\n\nAfter completing the skill workflow, write a brief markdown report to ./${reportFile} summarizing:\n- What changes were made to the project\n- Which files were modified or created\n- Any manual steps the user should take next\n\nImportant: You must read a file immediately before attempting to write it, even if you have previously read it; failure to do so will cause a tool failure.`;\n}\n\n/**\n * Assemble the final agent prompt from the program's run config.\n */\nexport function assemblePrompt(runDef: ProgramRun, ctx: PromptContext): string {\n const parts: string[] = [];\n\n // Always include the default project prompt\n parts.push(defaultProjectPrompt(ctx));\n\n // Additional program-specific instructions\n if (runDef.customPrompt) {\n parts.push(runDef.customPrompt(ctx));\n }\n\n // Skill prompt (appended when a skill was pre-installed)\n if (ctx.skillPath) {\n parts.push(skillPrompt(ctx.skillPath, runDef.reportFile));\n }\n\n return parts.join('\\n\\n');\n}\n","/**\n * Shared error helpers for the runner pipeline.\n */\n\nimport type { InstallSkillResult } from '@lib/wizard-tools';\nimport { wizardAbort, WizardError } from '@utils/wizard-abort';\n\nexport async function abortOnInstallFailure(\n integrationLabel: string,\n result: InstallSkillResult,\n): Promise<void> {\n if (result.kind === 'ok') return;\n\n const message = (() => {\n switch (result.kind) {\n case 'menu-fetch-failed':\n return 'Could not fetch the skill menu from context-mill.\\nCheck your network connection and try again.';\n case 'skill-not-found':\n return `Could not find the \"${result.skillId}\" skill in the context-mill menu.\\nPlease try again later.`;\n case 'download-failed':\n return `Failed to install skill: ${result.message}\\nPlease try again.`;\n }\n })();\n\n await wizardAbort({\n message,\n error: new WizardError(`Skill install failed: ${result.kind}`, {\n integration: integrationLabel,\n error_type: result.kind,\n }),\n });\n}\n","/**\n * The linear pipeline. Single execution path for all non-orchestrator programs,\n * both skill-based (revenue analytics) and framework-based (core integration).\n * The `ProgramRun` controls what varies between them; `programConfig` carries the\n * program-level static metadata (tool allow/disallow lists, etc.).\n */\n\nimport type { WizardSession } from '../../wizard-session';\nimport { OutroKind } from '../../wizard-session';\nimport { getUI } from '../../../ui';\nimport {\n initializeAgent,\n runAgent as executeAgent,\n AgentErrorType,\n AgentSignals,\n} from '../agent-interface';\nimport { restoreClaudeSettings } from '../claude-settings';\nimport { getCloudUrlFromRegion } from '../../../utils/urls';\nimport { logToFile, getLogFilePath } from '../../../utils/debug';\nimport { createBenchmarkPipeline } from '../../middleware/benchmark';\nimport {\n wizardAbort,\n WizardError,\n registerCleanup,\n} from '../../../utils/wizard-abort';\nimport { analytics } from '../../../utils/analytics';\nimport { formatScanReport, writeScanReport } from '../../yara-hooks';\nimport { detectNodePackageManagers } from '../../detection/package-manager';\nimport { installSkillById } from '../../wizard-tools';\nimport { createWizardAskBridge } from '../../wizard-ask-bridge';\nimport type { ProgramConfig } from '../../programs/program-step';\nimport { assemblePrompt } from '../agent-prompt';\nimport type { ProgramRun, BootstrapResult } from './shared/types';\nimport { abortOnInstallFailure } from './shared/errors';\nimport { shouldDisableAsk, sessionToOptions } from './shared/bootstrap';\n\nexport async function runLinearProgram(\n session: WizardSession,\n config: ProgramRun,\n programConfig: ProgramConfig,\n boot: BootstrapResult,\n): Promise<void> {\n const {\n skillsBaseUrl,\n projectApiKey,\n host,\n accessToken,\n projectId,\n cloudRegion,\n mcpUrl,\n wizardFlags,\n wizardMetadata,\n project,\n } = boot;\n\n // 5. Skill install (if skillId provided)\n let skillPath: string | undefined;\n if (config.skillId) {\n logToFile(`[agent-runner] installing skill ${config.skillId}`);\n const installResult = await installSkillById(\n config.skillId,\n session.installDir,\n skillsBaseUrl,\n );\n if (installResult.kind !== 'ok') {\n await abortOnInstallFailure(config.integrationLabel, installResult);\n return;\n }\n skillPath = installResult.path;\n logToFile(`[agent-runner] skill installed at ${skillPath}`);\n }\n\n // 6. Initialize agent\n const spinner = getUI().spinner();\n\n const restoreSettings = () => restoreClaudeSettings(session.installDir);\n getUI().onEnterScreen('outro', restoreSettings);\n\n if (session.yaraReport) {\n registerCleanup(() => {\n const reportPath = writeScanReport();\n if (reportPath) {\n const summary = formatScanReport();\n getUI().log.info(`YARA scan report: ${reportPath}${summary ?? ''}`);\n }\n });\n }\n\n getUI().startRun();\n\n // wizard_ask is only available in interactive mode. CI/signup users have\n // no way to answer; we omit the bridge so the tool returns an actionable\n // error rather than hanging on a never-resolving prompt.\n const askDisabled = shouldDisableAsk(session);\n const askBridge = askDisabled\n ? undefined\n : createWizardAskBridge({\n getSource: () => session.skillId ?? config.integrationLabel,\n showQuestion: (q) => getUI().requestQuestion(q),\n richLinks: config.richLinks ?? false,\n timeoutMs: config.askTimeoutMs,\n });\n\n getUI().log.step('Initializing Claude agent...');\n const agent = await initializeAgent(\n {\n workingDirectory: session.installDir,\n posthogMcpUrl: mcpUrl,\n posthogApiKey: accessToken,\n posthogApiHost: host,\n additionalMcpServers: config.additionalMcpServers,\n detectPackageManager:\n config.detectPackageManager ?? detectNodePackageManagers,\n skillsBaseUrl,\n wizardFlags,\n wizardMetadata,\n integrationLabel: config.integrationLabel,\n askBridge,\n askMaxQuestions: config.maxQuestions,\n allowedTools: programConfig.allowedTools,\n disallowedTools: programConfig.disallowedTools,\n getPendingQuestion: () => session.pendingQuestion,\n },\n sessionToOptions(session),\n );\n getUI().log.step(`Verbose logs: ${getLogFilePath()}`);\n getUI().log.success(\"Agent initialized. Let's get cooking!\");\n\n logToFile('[agent-runner] agent initialized');\n\n const middleware = session.benchmark\n ? createBenchmarkPipeline(spinner, sessionToOptions(session))\n : undefined;\n\n // 7. Build prompt\n const prompt = assemblePrompt(config, {\n projectId,\n projectApiKey,\n host,\n skillPath,\n orgAiDataProcessingApproved:\n session.apiUser?.organization?.is_ai_data_processing_approved ?? null,\n teamProductOptIns: project\n ? {\n sessionReplay: project.session_recording_opt_in ?? null,\n exceptionAutocapture: project.autocapture_exceptions_opt_in ?? null,\n surveys: project.surveys_opt_in ?? null,\n }\n : null,\n });\n logToFile(`[agent-runner] prompt assembled (${prompt.length} chars)`);\n\n // 8. Run agent\n const agentResult = await executeAgent(\n agent,\n prompt,\n sessionToOptions(session),\n spinner,\n {\n estimatedDurationMinutes: config.estimatedDurationMinutes,\n spinnerMessage: config.spinnerMessage,\n successMessage: config.successMessage,\n errorMessage: config.errorMessage ?? `${config.integrationLabel} failed`,\n additionalFeatureQueue: config.additionalFeatureQueue ?? [],\n abortCases: config.abortCases,\n },\n middleware,\n );\n\n // 9. Error handling (full set from both runners)\n if (agentResult.error === AgentErrorType.ABORT) {\n const reason = agentResult.message ?? '';\n const matched = config.abortCases?.find((c) => c.match.test(reason));\n const outroData: WizardSession['outroData'] = matched\n ? {\n kind: OutroKind.Error,\n message: matched.message,\n body: matched.body,\n docsUrl: matched.docsUrl,\n }\n : {\n kind: OutroKind.Error,\n message: `${config.integrationLabel} aborted`,\n body: reason || 'The agent aborted the program.',\n docsUrl: config.docsUrl,\n };\n analytics.wizardCapture('agent aborted', {\n integration: config.integrationLabel,\n reason,\n matched: matched?.message ?? null,\n });\n await wizardAbort({\n outroData,\n error: new WizardError(`Agent aborted: ${reason}`, {\n integration: config.integrationLabel,\n error_type: AgentErrorType.ABORT,\n reason,\n }),\n });\n }\n\n if (agentResult.error === AgentErrorType.MCP_MISSING) {\n await wizardAbort({\n message:\n 'Could not access the PostHog MCP server\\n\\n' +\n 'The wizard was unable to connect to the PostHog MCP server.\\n' +\n 'This could be due to a network issue or a configuration problem.\\n\\n' +\n `Please try again, or check the documentation:\\n${config.docsUrl}`,\n error: new WizardError('Agent could not access PostHog MCP server', {\n integration: config.integrationLabel,\n error_type: AgentErrorType.MCP_MISSING,\n signal: AgentSignals.ERROR_MCP_MISSING,\n }),\n });\n }\n\n if (agentResult.error === AgentErrorType.RESOURCE_MISSING) {\n await wizardAbort({\n message:\n 'Could not access the setup resource\\n\\n' +\n 'This may indicate a version mismatch or a temporary service issue.\\n\\n' +\n `Please try again, or check the documentation:\\n${config.docsUrl}`,\n error: new WizardError('Agent could not access setup resource', {\n integration: config.integrationLabel,\n error_type: AgentErrorType.RESOURCE_MISSING,\n signal: AgentSignals.ERROR_RESOURCE_MISSING,\n }),\n });\n }\n\n if (agentResult.error === AgentErrorType.YARA_VIOLATION) {\n await wizardAbort({\n message:\n 'Security violation detected.\\nPlease report this to: wizard@posthog.com',\n error: new WizardError('YARA scanner terminated session', {\n integration: config.integrationLabel,\n error_type: AgentErrorType.YARA_VIOLATION,\n }),\n });\n }\n\n if (\n agentResult.error === AgentErrorType.RATE_LIMIT ||\n agentResult.error === AgentErrorType.API_ERROR\n ) {\n analytics.wizardCapture('agent api error', {\n integration: config.integrationLabel,\n error_type: agentResult.error,\n error_message: agentResult.message,\n });\n\n await wizardAbort({\n message: `API Error\\n\\n${\n agentResult.message || 'Unknown error'\n }\\n\\nPlease report this to: wizard@posthog.com`,\n error: new WizardError(`API error: ${agentResult.message}`, {\n integration: config.integrationLabel,\n error_type: agentResult.error,\n }),\n });\n }\n\n // 10. Post-run hooks\n if (config.postRun) {\n await config.postRun(session, {\n accessToken,\n projectApiKey,\n host,\n projectId,\n });\n }\n\n // 11. Outro\n // Push outro data through the UI (not via direct `session.outroData = ...`\n // mutation) so the live store gets the value. agent-runner's `session`\n // parameter is captured at runAgent() invocation time, and any `setKey`\n // call between then and here (e.g. setDashboardUrl, setNotebookUrl) forks\n // the session reference — direct mutation then lands on a stale snapshot\n // that the screen never reads. UI.setOutroData() goes through the store\n // and also merges in any post-snapshot URLs from the live session.\n const outroData = config.buildOutroData\n ? config.buildOutroData(\n session,\n { accessToken, projectApiKey, host, projectId },\n cloudRegion,\n )\n : {\n kind: OutroKind.Success,\n message: config.successMessage,\n reportFile: config.reportFile,\n docsUrl: config.docsUrl,\n continueUrl: session.signup\n ? `${getCloudUrlFromRegion(cloudRegion)}/products?source=wizard`\n : undefined,\n };\n if (outroData) {\n getUI().setOutroData(outroData);\n }\n\n getUI().outro(config.successMessage);\n\n // 12. Analytics shutdown\n await analytics.shutdown('success');\n}\n","/**\n * Unified program runner — dispatcher.\n *\n * Single configurable pipeline for all programs. Each program\n * provides a ProgramRun (via the `run` field on ProgramConfig)\n * that controls:\n * - Whether a skill is pre-installed or discovered at runtime\n * - How the agent prompt is built\n * - What MCP servers and package manager detector to use\n * - What happens after the agent completes\n *\n * The pipeline runs a shared bootstrap (logging, health check, settings, OAuth,\n * flags, MCP url), then forks. The `orchestrator` variant routes to the\n * experimental task-queue runner. Every other variant runs the fixed linear\n * pipeline:\n * [skill install] → agent init → prompt → run → errors → [postRun] → outro\n */\n\nimport type { WizardSession } from '../../wizard-session';\nimport { isOrchestratorEnabled } from '../agent-interface';\nimport { getUI } from '../../../ui';\nimport { runOrchestrator } from './orchestrator/orchestrator-runner';\nimport type { ProgramConfig } from '../../programs/program-step';\nimport type { ProgramRun } from './shared/types';\nimport { bootstrapProgram } from './shared/bootstrap';\nimport { runLinearProgram } from './linear';\n\nexport type {\n ProgramRun,\n BootstrapResult,\n AbortCase,\n PromptContext,\n Credentials,\n} from './shared/types';\nexport { shouldDisableAsk } from './shared/bootstrap';\n\n/**\n * Resolve a ProgramConfig's agent run definition and execute the pipeline.\n * Entry point for bin.ts — handles buildRunConfig, bootstrap, and (future) run field.\n */\nexport async function runAgent(\n programConfig: ProgramConfig,\n session: WizardSession,\n): Promise<void> {\n if (!programConfig.run) {\n throw new Error(`Program \"${programConfig.id}\" has no run configuration.`);\n }\n\n const runDef =\n typeof programConfig.run === 'function'\n ? await programConfig.run(session)\n : programConfig.run;\n\n await runProgram(session, runDef, programConfig);\n}\n\n/**\n * Run a program's agent pipeline.\n *\n * Runs the shared bootstrap, then forks on the `wizard-variant` flag. The\n * `orchestrator` variant routes to the experimental task-queue runner; every\n * other variant runs the linear pipeline.\n */\nexport async function runProgram(\n session: WizardSession,\n config: ProgramRun,\n programConfig: ProgramConfig,\n): Promise<void> {\n const boot = await bootstrapProgram(session, config, programConfig);\n\n if (isOrchestratorEnabled(boot.wizardFlags)) {\n getUI().log.info('Task-queue orchestrator enabled.');\n return runOrchestrator(session, programConfig, boot);\n }\n\n return runLinearProgram(session, config, programConfig, boot);\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"agent-runner-HTfFCUrR.js","names":["path","runAgent","executeAgent"],"sources":["../src/lib/agent/runner/orchestrator/executor.ts","../src/lib/agent/runner/orchestrator/run-metrics.ts","../src/lib/agent/agent-prompt-loader.ts","../src/lib/agent/runner/orchestrator/orchestrator-runner.ts","../src/lib/agent/runner/shared/bootstrap.ts","../src/lib/middleware/phase-detector.ts","../src/lib/middleware/pipeline.ts","../src/lib/middleware/config.ts","../src/lib/middleware/benchmarks/turn-counter.ts","../src/lib/middleware/benchmarks/token-tracker.ts","../src/lib/middleware/benchmarks/cache-tracker.ts","../src/lib/middleware/benchmarks/compaction-tracker.ts","../src/lib/middleware/benchmarks/context-size-tracker.ts","../src/lib/middleware/benchmarks/cost-tracker.ts","../src/lib/middleware/benchmarks/duration-tracker.ts","../src/lib/middleware/benchmarks/summary.ts","../src/lib/middleware/benchmarks/json-writer.ts","../src/lib/middleware/benchmarks/index.ts","../src/lib/middleware/benchmark.ts","../src/lib/wizard-ask-bridge.ts","../src/lib/agent/agent-prompt.ts","../src/lib/agent/runner/shared/errors.ts","../src/lib/agent/runner/linear.ts","../src/lib/agent/runner/index.ts"],"sourcesContent":["/**\n * The executor drains the queue. It starts every runnable task (dependencies\n * satisfied) as soon as it becomes runnable — parallelism is decided by the\n * task graph, not by an executor knob. Each task runs through an injected\n * `runTask` function and reports its outcome via `complete_task`; a task that\n * ends without reporting is retried while attempts remain, then failed. A\n * `maxStarts` backstop guarantees termination.\n *\n * The drain loop is independent of how a task actually runs. `runTask` is\n * injected: the real one spins up a fresh agent, the tests use a fake.\n */\nimport { analytics } from '@utils/analytics';\nimport { logToFile } from '@utils/debug';\nimport { TaskStatus, type QueueStore, type QueuedTask } from './queue';\n\n/** Per-task agent configuration the resolver produces from a task's type. */\nexport interface ResolvedTask {\n model: string;\n allowedTools: readonly string[];\n disallowedTools: readonly string[];\n /** Mini-skills to install before the task runs (the HOW). */\n skills: readonly string[];\n prompt: string;\n}\n\n/** Resolves a queued task to what the agent needs. The real one is markdown-backed. */\nexport type TaskResolver = (\n task: QueuedTask,\n store: QueueStore,\n) => ResolvedTask;\n\n/** Runs one task's agent. It is expected to drive the task to a terminal state\n * (via the task agent calling complete_task). */\nexport type RunTask = (task: QueuedTask) => Promise<void>;\n\nexport interface DrainOptions {\n /** Backstop against a pathological always-one-more-pending loop. */\n maxStarts: number;\n}\n\nexport const DEFAULT_DRAIN_OPTIONS: DrainOptions = {\n maxStarts: 200,\n};\n\nasync function runOne(\n store: QueueStore,\n runTask: RunTask,\n task: QueuedTask,\n): Promise<void> {\n store.start(task.id);\n try {\n await runTask(task);\n } catch (error) {\n // The task threw rather than reporting. The outcome check below handles\n // the queue; the exception itself should never be silent.\n logToFile(`[executor] runTask threw for ${task.type}:`, error);\n analytics.captureException(\n error instanceof Error ? error : new Error(String(error)),\n { step: 'orchestrator_run_task', task_type: task.type },\n );\n }\n\n const after = store.get(task.id);\n if (!after) return;\n\n if (after.status === TaskStatus.Running) {\n // The agent ended without calling complete_task. Retry or fail.\n if (after.attempts < after.maxAttempts) {\n store.requeue(task.id);\n } else {\n store.fail(task.id, {\n type: 'no-report',\n message: 'Task ended without calling complete_task.',\n });\n }\n return;\n }\n\n if (\n after.status === TaskStatus.Failed &&\n after.attempts < after.maxAttempts\n ) {\n store.requeue(task.id);\n }\n}\n\n/**\n * Drain the queue to a terminal state. Every runnable task starts the moment\n * its dependencies finish; independent branches run concurrently. Returns when\n * every task is done, failed, or blocked by a failed dependency, or when the\n * start backstop trips.\n */\nexport async function drainQueue(\n store: QueueStore,\n runTask: RunTask,\n opts: DrainOptions = DEFAULT_DRAIN_OPTIONS,\n): Promise<void> {\n const running = new Map<string, Promise<void>>();\n let starts = 0;\n\n for (;;) {\n for (const task of store.nextRunnable()) {\n if (++starts > opts.maxStarts) break;\n // runOne marks the task running synchronously, so the next\n // nextRunnable() call no longer offers it.\n const p = runOne(store, runTask, task).finally(() =>\n running.delete(task.id),\n );\n running.set(task.id, p);\n }\n if (running.size === 0) break;\n // Wake on the first finish; it may have unblocked dependents or requeued.\n await Promise.race(running.values());\n }\n}\n","/**\n * Responsiveness metrics for an orchestrator run.\n *\n * Responsiveness is the experiment's headline: how quickly the user sees the\n * first progress, and whether progress stays steady (no long silences). The math\n * is accumulated from queue transitions but kept here, pure and time-injected, so\n * it is unit-testable away from the runner. Wall-clock times are passed in as\n * milliseconds; the caller owns the clock.\n */\n\nexport interface RunMetricsSummary {\n /** Run start → first task started. */\n time_to_first_task_ms?: number;\n /** Run start → first task completed (the first visible \"done\"). */\n time_to_first_completion_ms?: number;\n /** Longest silence between two consecutive user-visible transitions. */\n max_gap_ms?: number;\n}\n\n/** The per-event timing the `orchestrator task started` event reports. */\nexport interface StartTiming {\n ms_since_run_start: number;\n gap_since_prev_start_ms?: number;\n}\n\nexport class RunMetrics {\n private firstStartMs?: number;\n private lastStartMs?: number;\n private firstCompleteMs?: number;\n private lastVisibleMs?: number;\n private maxGapMs = 0;\n\n constructor(private readonly runStartMs: number) {}\n\n /** A task started. Returns the per-start-event timing for the start event. */\n recordStart(nowMs: number): StartTiming {\n const timing: StartTiming = {\n ms_since_run_start: nowMs - this.runStartMs,\n gap_since_prev_start_ms:\n this.lastStartMs === undefined ? undefined : nowMs - this.lastStartMs,\n };\n this.firstStartMs ??= nowMs;\n this.lastStartMs = nowMs;\n this.markVisible(nowMs);\n return timing;\n }\n\n /** A task completed. */\n recordComplete(nowMs: number): void {\n this.firstCompleteMs ??= nowMs;\n this.markVisible(nowMs);\n }\n\n /** A task reached a terminal non-complete state the user sees (skip/fail). */\n recordTerminal(nowMs: number): void {\n this.markVisible(nowMs);\n }\n\n /**\n * The run-level responsiveness summary. Timings are `undefined` when the\n * relevant transition never happened (e.g. a run that started no task), so a\n * no-task run stays distinguishable from a genuine zero.\n */\n summary(): RunMetricsSummary {\n return {\n time_to_first_task_ms:\n this.firstStartMs === undefined\n ? undefined\n : this.firstStartMs - this.runStartMs,\n time_to_first_completion_ms:\n this.firstCompleteMs === undefined\n ? undefined\n : this.firstCompleteMs - this.runStartMs,\n max_gap_ms: this.lastVisibleMs === undefined ? undefined : this.maxGapMs,\n };\n }\n\n /** requeue is not user-visible, so a retry stall counts as silence here. */\n private markVisible(nowMs: number): void {\n if (this.lastVisibleMs !== undefined) {\n this.maxGapMs = Math.max(this.maxGapMs, nowMs - this.lastVisibleMs);\n }\n this.lastVisibleMs = nowMs;\n }\n}\n","/**\n * Agent-prompt loader + registry.\n *\n * Agent prompts are the WHAT of a task: a markdown file per type, served from\n * context-mill as the `agents` content type (parallel to skills). The frontmatter\n * carries the artifacts the executor needs — model, the mini-skills to load (the\n * HOW), the tools the task may use, and its dependencies — and the body is the\n * instruction the agent reads.\n *\n * The registry is fetched once at startup and scoped to one flow — agents\n * declare `flow` and (for the planner) `seed: true` in frontmatter, so each\n * program (integration, audit, migration, ...) ships its own agent set and the\n * loader stays generic. Every prompt is downloaded and parsed up front, so\n * resolving a task to its run config is synchronous and adds no mid-drain\n * network latency. The registry's type list also drives `enqueue_task`\n * validation.\n */\nimport type { QueueStore, QueuedTask } from './runner/orchestrator/queue';\nimport type { ResolvedTask } from './runner/orchestrator/executor';\n\n/**\n * The basics the client injects around every agent-prompt body. The `/agents/`\n * files carry intent only (goal, success criteria); the wizard owns the I/O\n * contract — who the agent is, how it reports, how it surfaces progress — so the\n * authored prompts never restate it.\n */\nexport interface OrchestratorPromptContext {\n projectId: number;\n projectApiKey: string;\n host: string;\n /** Path to the framework's reference implementation (EXAMPLE.md), if available. */\n examplePath?: string;\n /** Path to the framework's rules (COMMANDMENTS.md), if available. */\n commandmentsPath?: string;\n}\n\nfunction projectContext(ctx: OrchestratorPromptContext): string {\n return `You have access to the PostHog MCP server and the wizard tools.\n\nProject context:\n- PostHog Project ID: ${ctx.projectId}\n- PostHog public token: ${ctx.projectApiKey}\n- PostHog Host: ${ctx.host}`;\n}\n\n/** Points the agent at the framework's reference integration to learn patterns from. */\nfunction exampleReference(ctx: OrchestratorPromptContext): string | null {\n if (!ctx.examplePath) return null;\n return `A reference PostHog integration for this framework is at \\`${ctx.examplePath}\\`. It shows the target implementation pattern. Reference its patterns and conventions, adapting them to this codebase.`;\n}\n\n/** The framework's rules ship with the reference skill; every task follows them. */\nfunction commandmentsReference(ctx: OrchestratorPromptContext): string | null {\n if (!ctx.commandmentsPath) return null;\n return `Framework rules for this integration are at \\`${ctx.commandmentsPath}\\`. Read them before you edit and follow them.`;\n}\n\nconst TASK_BASICS = `You are one isolated task in a larger PostHog workflow, run as a fresh agent with no memory of the other tasks beyond the context you are given. Do only your task, then report exactly once by calling complete_task with a structured handoff: what your goal was, what you did, and what the next agent should know. When you are given context from previous steps, trust it — those agents already did their work, so do not re-verify or re-read what their handoffs tell you. Build on it and move fast. Read a file before you edit it, so your own changes do not duplicate what is already there. Work only inside this project's own directory: never read, list, or search (find, ls, grep, glob) outside it — not the OS, not other projects, not global package caches. If your task seems to need something outside this directory, it does not — skip that part and say so in your handoff rather than hunting across the filesystem. If your task does not apply to this project — there is genuinely nothing for it to do — report it with status \\`skipped\\` and say why, rather than marking it done.`;\n\nconst SEED_BASICS = `You are the orchestrator. Plan the work and seed the queue with enqueue_task — each call returns an id you can pass as a dependency to a later task. Give each task a short label for the UI — the action in a few words, not file names, class names, or other specifics. You are not a task yourself: do not call complete_task and do not edit the project.`;\n\n/**\n * Points the agent at its installed task instructions (the HOW). They live under\n * the wizard's run dir, not `.claude/skills/`, so the SDK does not auto-load\n * them — the prompt has to name them.\n */\nfunction skillReference(paths: readonly string[]): string | null {\n if (paths.length === 0) return null;\n const list = paths.map((p) => `\\`${p}\\``).join(', ');\n return `Your task instructions are at ${list}. Read them before you start and follow them. They are wizard scaffolding, not part of the project.`;\n}\n\n/** A task agent's full prompt: injected basics, then the authored intent. */\nexport function assembleTaskPrompt(\n ctx: OrchestratorPromptContext,\n body: string,\n skillPaths: readonly string[] = [],\n): string {\n return [\n projectContext(ctx),\n exampleReference(ctx),\n commandmentsReference(ctx),\n skillReference(skillPaths),\n TASK_BASICS,\n body,\n ]\n .filter(Boolean)\n .join('\\n\\n');\n}\n\n/** The seed agent's full prompt: injected basics, then the authored intent. */\nexport function assembleSeedPrompt(\n ctx: OrchestratorPromptContext,\n body: string,\n): string {\n return [projectContext(ctx), SEED_BASICS, body].join('\\n\\n');\n}\n\n/** Used when neither the enqueue call nor the prompt frontmatter names a model. */\nconst DEFAULT_TASK_MODEL = 'claude-sonnet-4-6';\n\n/** Orchestrator tools are MCP tools under the `posthog-wizard` server. Frontmatter\n * names them short (e.g. `enqueue_task`); the SDK gates on the full name. */\nconst ORCHESTRATOR_TOOL_PREFIX = 'mcp__posthog-wizard__';\nconst ORCHESTRATOR_TOOLS = new Set([\n 'enqueue_task',\n 'complete_task',\n 'read_handoffs',\n]);\n\n/** A parsed agent prompt. The frontmatter fields plus the markdown body. */\nexport interface AgentPrompt {\n type: string;\n /** Human-readable title for the TUI; falls back to `type` when absent. */\n label?: string;\n /** The flow this agent belongs to (the program id, e.g. \\`posthog-integration\\`). */\n flow?: string;\n /** Marks the flow's planner: it seeds the queue and is not an enqueueable task. */\n seed: boolean;\n model?: string;\n skills: string[];\n allowedTools: string[];\n disallowedTools: string[];\n dependsOn: string[];\n body: string;\n}\n\nexport interface AgentRegistry {\n /** The flow's enqueueable task types — every prompt except the seed. */\n readonly types: string[];\n /** The flow's planner, the one prompt marked `seed: true` in its frontmatter. */\n readonly seed?: AgentPrompt;\n get(type: string): AgentPrompt | undefined;\n}\n\n/** The registry for one flow's prompts. Pure; the loader feeds it the fetched set. */\nexport function buildRegistry(\n prompts: readonly AgentPrompt[],\n flow: string,\n opts?: { exclude?: readonly string[] },\n): AgentRegistry {\n // The harness can exclude task types (CI excludes dashboards). An excluded\n // type does not exist for the run: the seed cannot enqueue it and no agent\n // is ever spun up for it.\n const excluded = new Set(opts?.exclude ?? []);\n const inFlow = prompts.filter(\n (p) => p.flow === flow && !excluded.has(p.type),\n );\n const byType = new Map(inFlow.map((p) => [p.type, p]));\n return {\n types: inFlow.filter((p) => !p.seed).map((p) => p.type),\n seed: inFlow.find((p) => p.seed),\n get: (type) => byType.get(type),\n };\n}\n\ninterface AgentMenu {\n agents: { id: string; downloadUrl: string }[];\n}\n\n/** A native tool passes through; an orchestrator tool gets its MCP-qualified name. */\nfunction expandToolName(name: string): string {\n return ORCHESTRATOR_TOOLS.has(name)\n ? `${ORCHESTRATOR_TOOL_PREFIX}${name}`\n : name;\n}\n\n/** A prompt's allow/disallow lists with orchestrator tool names MCP-qualified. */\nexport function agentRunTools(prompt: AgentPrompt): {\n allowedTools: string[];\n disallowedTools: string[];\n} {\n return {\n allowedTools: prompt.allowedTools.map(expandToolName),\n disallowedTools: prompt.disallowedTools.map(expandToolName),\n };\n}\n\nfunction toStringArray(value: unknown): string[] {\n if (!Array.isArray(value)) return [];\n return value.filter((v): v is string => typeof v === 'string');\n}\n\n/**\n * Parse the leading `---` frontmatter block and the markdown body. The\n * frontmatter is a small, known schema (scalars and inline `[a, b]` arrays), so\n * a tiny parser covers it without a YAML dependency. Inline `# comments` after a\n * value are stripped. `fallbackType` is the menu id, used when the body omits\n * `type:`.\n */\nexport function parseAgentPrompt(\n text: string,\n fallbackType: string,\n): AgentPrompt {\n const match = text.match(/^---\\r?\\n([\\s\\S]*?)\\r?\\n---\\r?\\n?([\\s\\S]*)$/);\n const frontmatter = match ? match[1] : '';\n const body = (match ? match[2] : text).trim();\n\n const fields: Record<string, unknown> = {};\n for (const rawLine of frontmatter.split(/\\r?\\n/)) {\n const line = rawLine.replace(/\\s+#.*$/, '').trim();\n if (!line || line.startsWith('#')) continue;\n const kv = line.match(/^([\\w-]+):\\s*(.*)$/);\n if (!kv) continue;\n const [, key, raw] = kv;\n if (raw.startsWith('[') && raw.endsWith(']')) {\n fields[key] = raw\n .slice(1, -1)\n .split(',')\n .map((s) => s.trim().replace(/^['\"]|['\"]$/g, ''))\n .filter(Boolean);\n } else {\n fields[key] = raw.replace(/^['\"]|['\"]$/g, '');\n }\n }\n\n const model = typeof fields.model === 'string' ? fields.model : undefined;\n return {\n type: typeof fields.type === 'string' ? fields.type : fallbackType,\n label: typeof fields.label === 'string' ? fields.label : undefined,\n flow: typeof fields.flow === 'string' ? fields.flow : undefined,\n seed: fields.seed === 'true',\n model,\n skills: toStringArray(fields.skills),\n allowedTools: toStringArray(fields.allowedTools),\n disallowedTools: toStringArray(fields.disallowedTools),\n dependsOn: toStringArray(fields.dependsOn),\n body,\n };\n}\n\nasync function fetchText(url: string): Promise<string> {\n const res = await fetch(url);\n if (!res.ok) {\n throw new Error(`Fetch ${url} failed: ${res.status} ${res.statusText}`);\n }\n return res.text();\n}\n\n/**\n * Fetch the agent menu and every agent prompt it lists, parse them, and build\n * the registry for one flow. Throws if the menu cannot be fetched — the\n * orchestrator cannot run without its prompts.\n */\nexport async function loadAgentRegistry(\n skillsBaseUrl: string,\n flow: string,\n opts?: { exclude?: readonly string[] },\n): Promise<AgentRegistry> {\n const menuRaw = await fetchText(`${skillsBaseUrl}/agent-menu.json`);\n const menu = JSON.parse(menuRaw) as AgentMenu;\n\n const prompts = await Promise.all(\n (menu.agents ?? []).map(async (entry) => {\n const text = await fetchText(entry.downloadUrl);\n return parseAgentPrompt(text, entry.id);\n }),\n );\n\n return buildRegistry(prompts, flow, opts);\n}\n\n/**\n * Render a task's own inputs into a section, so a fanned-out task (e.g. one\n * `capture` per event) sees the specific thing it owns. Empty when there are none.\n */\nfunction renderInputs(task: QueuedTask): string {\n const entries = Object.entries(task.inputs ?? {});\n if (entries.length === 0) return '';\n const lines = entries.map(([k, v]) => `- ${k}: ${formatInputValue(v)}`);\n return `## Your task input\\n\\n${lines.join('\\n')}`;\n}\n\nfunction formatInputValue(value: unknown): string {\n if (typeof value === 'string') return value;\n return JSON.stringify(value);\n}\n\n/**\n * The ids of every task `task` transitively depends on — the full upstream\n * chain, not just direct dependencies — ordered roots-first, each once. A `seen`\n * set dedupes diamonds and guards against cycles.\n */\nfunction ancestorIds(task: QueuedTask, store: QueueStore): string[] {\n const seen = new Set<string>();\n const ordered: string[] = [];\n const visit = (id: string): void => {\n if (seen.has(id)) return;\n seen.add(id);\n const t = store.get(id);\n if (!t) return;\n for (const dep of t.dependsOn) visit(dep); // ancestors before dependents\n ordered.push(id);\n };\n for (const dep of task.dependsOn) visit(dep);\n return ordered;\n}\n\n/**\n * Render the handoffs of every step `task` transitively depends on into a context\n * section, so a fresh agent sees the whole upstream chain — not just its direct\n * dependencies. Reliability over token economy: a step must never have to\n * re-discover what any ancestor already established just because an intermediate\n * handoff happened to omit it. Empty when there are no completed ancestors.\n */\nfunction renderHandoffContext(task: QueuedTask, store: QueueStore): string {\n const lines: string[] = [];\n for (const id of ancestorIds(task, store)) {\n const dep = store.get(id);\n const handoff = store.readHandoff(id);\n if (!dep || !handoff) continue;\n lines.push(`### ${dep.type}`);\n lines.push(`- did: ${handoff.did}`);\n lines.push(`- for you: ${handoff.forNextAgent}`);\n if (handoff.filesTouched?.length) {\n lines.push(`- files: ${handoff.filesTouched.join(', ')}`);\n }\n lines.push('');\n }\n if (lines.length === 0) return '';\n return `## Context from previous steps\\n\\n${lines.join('\\n')}`.trim();\n}\n\n/**\n * Resolve a queued task to its run config: the prompt body (with upstream\n * handoffs appended), the model, and the tool lists with orchestrator tool names\n * MCP-qualified. The model precedence is enqueue override, then prompt, then\n * default. Throws if no prompt is registered for the task's type.\n */\nexport function resolveTask(\n registry: AgentRegistry,\n task: QueuedTask,\n store: QueueStore,\n): ResolvedTask {\n const prompt = registry.get(task.type);\n if (!prompt) {\n throw new Error(`No agent prompt registered for task type \"${task.type}\"`);\n }\n\n const body = [\n renderInputs(task),\n prompt.body,\n renderHandoffContext(task, store),\n ]\n .filter(Boolean)\n .join('\\n\\n');\n\n return {\n model: taskModel(registry, task),\n ...agentRunTools(prompt),\n prompt: body,\n skills: prompt.skills,\n };\n}\n\n/** The model a task runs on: enqueue override, then prompt frontmatter, then default. */\nexport function taskModel(registry: AgentRegistry, task: QueuedTask): string {\n return task.model ?? registry.get(task.type)?.model ?? DEFAULT_TASK_MODEL;\n}\n","/**\n * Experimental task-queue orchestrator runner.\n *\n * Branches from the linear runner when the `wizard-orchestrator` flag is on. An\n * orchestrator agent inspects the repo and seeds an in-memory task queue; an\n * executor drains it, running one fresh agent per task.\n *\n * Both the WHAT (agent prompts: model, goal, success criteria, tools) and the\n * HOW (mini-skills) are markdown served from context-mill — the seed and every\n * task resolve to a prompt fetched at startup into the registry. The wizard side\n * stays product-ignorant: it is the queue, the executor, and the loader.\n */\nimport { randomUUID } from 'crypto';\nimport { existsSync, rmSync } from 'fs';\nimport * as path from 'path';\nimport {\n initializeAgent,\n runAgent,\n type AgentConfig,\n} from '@lib/agent/agent-interface';\nimport { OutroKind, type WizardSession } from '@lib/wizard-session';\nimport { detectNodePackageManagers } from '@lib/detection/package-manager';\nimport { installSkillById, fetchSkillMenu } from '@lib/wizard-tools';\nimport { getUI } from '@ui';\nimport { analytics } from '@utils/analytics';\nimport { ciExcludedTaskTypes } from '@utils/ci-flag-overrides';\nimport { logToFile } from '@utils/debug';\nimport type { ProgramConfig } from '@lib/programs/program-step';\nimport type { BootstrapResult } from '../shared/types';\nimport type { WizardRunOptions } from '@utils/types';\nimport {\n QueueStore,\n QUEUE_DIR_NAME,\n TaskStatus,\n type QueuedTask,\n} from './queue';\nimport { drainQueue, type RunTask } from './executor';\nimport { RunMetrics } from './run-metrics';\nimport {\n agentRunTools,\n assembleSeedPrompt,\n assembleTaskPrompt,\n loadAgentRegistry,\n resolveTask,\n taskModel,\n type OrchestratorPromptContext,\n} from '@lib/agent/agent-prompt-loader';\n\nfunction toTodoStatus(status: TaskStatus): string {\n switch (status) {\n case TaskStatus.Running:\n return 'in_progress';\n case TaskStatus.Done:\n case TaskStatus.Failed:\n return 'completed';\n case TaskStatus.Skipped:\n return 'skipped';\n default:\n return 'pending';\n }\n}\n\nfunction sessionRunOptions(session: WizardSession): WizardRunOptions {\n return {\n installDir: session.installDir,\n debug: session.debug,\n default: false,\n signup: session.signup,\n localMcp: session.localMcp,\n ci: session.ci,\n benchmark: session.benchmark,\n projectId: session.projectId,\n apiKey: session.apiKey,\n yaraReport: session.yaraReport,\n };\n}\n\n/**\n * The framework reference is the full `integration` skill. `session.skillId` is\n * the bare framework (e.g. `django`), but the skill menu ids it as\n * `integration-<variant>`. Resolve to the menu id: exact `integration-<framework>`\n * (the 1:1 frameworks — django, python, flask, …), else the first granular variant\n * under it (e.g. `integration-nextjs-app-router`). Undefined when none exists.\n */\nasync function resolveReferenceSkillId(\n skillsBaseUrl: string,\n framework: string,\n): Promise<string | undefined> {\n const menu = await fetchSkillMenu(skillsBaseUrl);\n if (!menu) return undefined;\n const ids = Object.values(menu.categories)\n .flat()\n .map((s) => s.id);\n const exact = `integration-${framework}`;\n if (ids.includes(exact)) return exact;\n return ids.find((id) => id.startsWith(`integration-${framework}-`));\n}\n\nexport async function runOrchestrator(\n session: WizardSession,\n programConfig: ProgramConfig,\n boot: BootstrapResult,\n): Promise<void> {\n const runId = randomUUID();\n\n const options = sessionRunOptions(session);\n\n // The WHAT (agent prompts) is served from context-mill. Fetch the registry\n // once up front: its types drive enqueue validation, and resolving a task to\n // its run config is then synchronous, with no mid-drain network latency.\n const registry = await loadAgentRegistry(\n boot.skillsBaseUrl,\n programConfig.id,\n { exclude: ciExcludedTaskTypes() },\n );\n const seedPrompt = registry.seed;\n if (!seedPrompt) {\n throw new Error(\n `No seed agent prompt (frontmatter \\`seed: true\\`) for flow \"${programConfig.id}\" is available from ${boot.skillsBaseUrl}.`,\n );\n }\n\n // Every wizard event from here on carries the variant, so orchestrator runs\n // segment cleanly from the linear baseline.\n analytics.setTag('variant', 'orchestrator');\n\n // Responsiveness is the headline metric of the dark launch: time to first\n // visible progress, and no single step dominating wall-clock. Track it from\n // queue transitions, with the resolved model so cheap work is attributable\n // to cheap models.\n const runStartMs = Date.now();\n const metrics = new RunMetrics(runStartMs);\n const durationMs = (t: QueuedTask) =>\n t.startedAt && t.finishedAt\n ? Date.parse(t.finishedAt) - Date.parse(t.startedAt)\n : undefined;\n\n const store = new QueueStore(session.installDir, runId, {\n onTransition: (event, task) => {\n const base = {\n type: task.type,\n model: taskModel(registry, task),\n attempts: task.attempts,\n };\n switch (event) {\n case 'enqueue':\n analytics.wizardCapture('orchestrator task enqueued', {\n type: task.type,\n enqueued_by: task.enqueuedBy,\n dynamic: task.enqueuedBy !== 'orchestrator',\n });\n break;\n case 'start':\n analytics.wizardCapture('orchestrator task started', {\n ...base,\n ...metrics.recordStart(Date.now()),\n });\n break;\n case 'complete':\n metrics.recordComplete(Date.now());\n analytics.wizardCapture('orchestrator task completed', {\n ...base,\n duration_ms: durationMs(task),\n });\n break;\n case 'skip':\n metrics.recordTerminal(Date.now());\n analytics.wizardCapture('orchestrator task skipped', {\n ...base,\n duration_ms: durationMs(task),\n });\n break;\n case 'fail':\n metrics.recordTerminal(Date.now());\n analytics.wizardCapture('orchestrator task failed', {\n ...base,\n duration_ms: durationMs(task),\n error: task.error?.type,\n });\n break;\n case 'requeue':\n break;\n }\n },\n });\n\n // Give task agents the framework's finished reference integration to match,\n // the same EXAMPLE.md the linear flow uses. Install it under the run dir rather\n // than .claude/skills so its \"do everything\" workflow is not auto-loaded as a\n // skill — only the example file is read, when the agent's prompt points at it.\n let examplePath: string | undefined;\n let commandmentsPath: string | undefined;\n const referenceSkillId = session.skillId\n ? await resolveReferenceSkillId(boot.skillsBaseUrl, session.skillId)\n : undefined;\n if (referenceSkillId) {\n const ref = await installSkillById(\n referenceSkillId,\n session.installDir,\n boot.skillsBaseUrl,\n path.join(QUEUE_DIR_NAME, 'reference'),\n );\n if (ref.kind === 'ok') {\n const example = path.join(ref.path, 'references', 'EXAMPLE.md');\n if (existsSync(path.join(session.installDir, example))) {\n examplePath = example;\n }\n const commandments = path.join(ref.path, 'references', 'COMMANDMENTS.md');\n if (existsSync(path.join(session.installDir, commandments))) {\n commandmentsPath = commandments;\n }\n } else {\n logToFile(\n `[orchestrator] reference unavailable: ${ref.kind} (${referenceSkillId})`,\n );\n }\n } else if (session.skillId) {\n logToFile(\n `[orchestrator] no integration skill for framework \"${session.skillId}\"`,\n );\n }\n\n // The client injects the basics (project context + the I/O contract) around\n // every authored agent-prompt body.\n const promptContext: OrchestratorPromptContext = {\n projectId: boot.projectId,\n projectApiKey: boot.projectApiKey,\n host: boot.host,\n examplePath,\n commandmentsPath,\n };\n\n logToFile(\n `[orchestrator] START program=${programConfig.id} dir=${session.installDir} run=${runId}`,\n );\n analytics.wizardCapture('orchestrator started', {\n program_id: programConfig.id,\n });\n getUI().startRun();\n\n // Label precedence: what the orchestrator set at enqueue, then the agent\n // prompt's default, then the bare type.\n const labelFor = (t: { type: string; label?: string }) =>\n t.label ?? registry.get(t.type)?.label ?? t.type;\n const renderQueue = () =>\n getUI().syncTodos(\n store.list().map((t) => ({\n content: labelFor(t),\n status: toTodoStatus(t.status),\n activeForm: labelFor(t),\n })),\n );\n\n // Each agent gets its own config so its wizard-tools server is bound to the\n // task it runs — independent tasks run in parallel, and attribution of\n // complete_task / enqueue_task must hold per agent. The seed is not a task,\n // so its context has no task id.\n const agentConfigFor = (currentTaskId?: string): AgentConfig => ({\n workingDirectory: session.installDir,\n posthogMcpUrl: boot.mcpUrl,\n posthogApiKey: boot.accessToken,\n posthogApiHost: boot.host,\n detectPackageManager: detectNodePackageManagers,\n skillsBaseUrl: boot.skillsBaseUrl,\n wizardFlags: boot.wizardFlags,\n // Tag agent events as orchestrator so telemetry segments from the baseline.\n wizardMetadata: { ...boot.wizardMetadata, VARIANT: 'orchestrator' },\n integrationLabel: programConfig.id,\n orchestrator: {\n store,\n validTypes: registry.types,\n currentTaskId,\n },\n });\n\n const spinner = getUI().spinner();\n\n // 1. Seed the queue with the orchestrator agent. It is itself an agent prompt\n // (the WHAT), so its model and tools come from its frontmatter. The seed\n // plans the graph, it is not a task.\n const seedAgent = await initializeAgent(agentConfigFor(), options);\n const seedResult = await runAgent(\n {\n ...seedAgent,\n model: seedPrompt.model ?? seedAgent.model,\n ...agentRunTools(seedPrompt),\n },\n assembleSeedPrompt(promptContext, seedPrompt.body),\n options,\n spinner,\n {\n spinnerMessage: 'Planning the integration...',\n successMessage: 'Planned the integration',\n additionalFeatureQueue: [],\n requestRemark: false,\n analyticsProperties: { task_type: 'seed' },\n },\n );\n if (seedResult.error) {\n logToFile(\n `[orchestrator] seed error: ${seedResult.error} ${\n seedResult.message ?? ''\n }`,\n );\n }\n analytics.wizardCapture('orchestrator seeded', {\n task_count: store.list().length,\n types: store.list().map((t) => t.type),\n });\n renderQueue();\n\n // 2. Drain the queue, one fresh agent per task; independent tasks run in\n // parallel, the seed's graph being the only schedule. Each task resolves to\n // its agent prompt (the WHAT) and the mini-skills it needs (the HOW), then\n // runs on its own model and tools.\n const taskSkillsRoot = path.join(QUEUE_DIR_NAME, 'skills');\n let remarkRequested = false;\n const runTask: RunTask = async (task) => {\n renderQueue();\n try {\n const resolved = resolveTask(registry, task, store);\n const agent = await initializeAgent(agentConfigFor(task.id), options);\n // Task instructions are one-run scaffolding, not durable skills, so they\n // install under the run dir rather than .claude/skills — the SDK must not\n // auto-load them and they must never land in the project (or a CI PR).\n // The prompt points the agent at them instead.\n const skillPaths: string[] = [];\n for (const skillId of resolved.skills) {\n const result = await installSkillById(\n skillId,\n session.installDir,\n boot.skillsBaseUrl,\n taskSkillsRoot,\n );\n if (result.kind === 'ok') {\n skillPaths.push(path.join(result.path, 'SKILL.md'));\n } else {\n logToFile(\n `[orchestrator] skill install failed type=${task.type} skill=${skillId} ${result.kind}`,\n );\n }\n }\n // The run-end reflection fires once, on the task that is last in the\n // queue when it starts — nothing else pending or running alongside it.\n const isLastTask = !store\n .list()\n .some(\n (t) =>\n t.id !== task.id &&\n (t.status === TaskStatus.Pending ||\n t.status === TaskStatus.Running),\n );\n const requestRemark = isLastTask && !remarkRequested;\n if (requestRemark) remarkRequested = true;\n await runAgent(\n {\n ...agent,\n model: resolved.model,\n allowedTools: resolved.allowedTools,\n disallowedTools: resolved.disallowedTools,\n },\n assembleTaskPrompt(promptContext, resolved.prompt, skillPaths),\n options,\n spinner,\n // Empty messages suppress the per-task spinner lines (the spinner renders\n // only when a message is set); the queue panel shows progress. Errors\n // still surface — runAgent stops the spinner with its own error text.\n {\n spinnerMessage: '',\n successMessage: '',\n additionalFeatureQueue: [],\n requestRemark,\n analyticsProperties: { task_type: task.type, task_id: task.id },\n },\n );\n } finally {\n renderQueue();\n }\n };\n try {\n await drainQueue(store, runTask);\n } finally {\n // Success or failure, no run artifact outlives the run — wipe the whole\n // cache folder (queue, handoffs, reference example, installed task\n // instructions). The .DELETE-ME.md inside is the fallback if we don't.\n try {\n rmSync(path.join(session.installDir, QUEUE_DIR_NAME), {\n recursive: true,\n force: true,\n });\n } catch (err) {\n analytics.captureException(\n err instanceof Error ? err : new Error(String(err)),\n { step: 'orchestrator_cache_cleanup' },\n );\n }\n }\n\n renderQueue();\n\n const summary = store.summary();\n logToFile(\n `[orchestrator] DONE done=${summary.done} failed=${summary.failed} total=${summary.total}`,\n );\n analytics.wizardCapture('orchestrator run finished', {\n tasks_total: summary.total,\n tasks_done: summary.done,\n tasks_failed: summary.failed,\n tasks_skipped: summary.skipped,\n total_duration_ms: Date.now() - runStartMs,\n ...metrics.summary(),\n dynamic_enqueue_count: store\n .list()\n .filter((t) => t.enqueuedBy !== 'orchestrator').length,\n retried_task_count: store.list().filter((t) => t.attempts > 1).length,\n });\n\n // The build step flags any unresolved conflict in its handoff; surface the\n // one-liner here and point the user at the report for the detail.\n const buildTask = store.list().find((t) => t.type === 'build');\n const conflict = buildTask\n ? store.readHandoff(buildTask.id)?.conflict\n : undefined;\n\n // Prefer the report the run wrote; fall back to the raw queue if it is missing.\n const reportPath = path.join(session.installDir, 'posthog-setup-report.md');\n const reportFile = existsSync(reportPath)\n ? 'posthog-setup-report.md'\n : store.queuePath;\n\n const message = conflict\n ? 'PostHog set up, with one conflict to review.'\n : `PostHog set up: ${summary.done}/${summary.total} steps completed.`;\n getUI().setOutroData({\n kind: OutroKind.Success,\n message,\n body: conflict\n ? `⚠ Build conflict: ${conflict}\\nFull details are in the report.`\n : undefined,\n reportFile,\n docsUrl: 'https://posthog.com/docs/ai-engineering/ai-wizard',\n });\n getUI().outro(message);\n await analytics.shutdown('success');\n}\n","/**\n * Shared bootstrap for the runner pipeline.\n *\n * Runs before the fork into the linear or orchestrator arm: logging, health\n * check, settings conflicts, OAuth and credentials, feature flags, variant\n * metadata, and MCP url. Sets `session.credentials`, role, and user as side\n * effects. Returns the values the arms still need.\n */\n\nimport type { WizardSession } from '@lib/wizard-session';\nimport { getOrAskForProjectData } from '@utils/setup-utils';\nimport { analytics, groupsFromUser } from '@utils/analytics';\nimport { getUI } from '@ui';\nimport { buildWizardMetadata } from '@lib/agent/agent-interface';\nimport {\n checkAllSettingsConflicts,\n backupAndFixClaudeSettings,\n} from '@lib/agent/claude-settings';\nimport {\n evaluateWizardReadiness,\n WizardReadiness,\n SIGNUP_WIZARD_READINESS_CONFIG,\n getBlockingServiceKeys,\n SERVICE_LABELS,\n} from '@lib/health-checks/readiness';\nimport { enableDebugLogs, logToFile, initLogFile } from '@utils/debug';\nimport { wizardAbort } from '@utils/wizard-abort';\nimport { isNonInteractiveEnvironment } from '@utils/environment';\nimport { getSkillsBaseUrl } from '@lib/constants';\nimport { runtimeEnv } from '@env';\nimport type { WizardRunOptions } from '@utils/types';\nimport type { ProgramConfig } from '@lib/programs/program-step';\nimport type { ProgramRun, BootstrapResult } from './types';\n\n// ── Helpers ──────────────────────────────────────────────────────────\n\n/**\n * Decide whether the `wizard_ask` overlay should be wired for this run.\n * Disabled in non-interactive modes (CI, signup) — there's no human to\n * answer. Per-program disabling is done by adding WIZARD_ASK_TOOL_NAME to\n * the program's `disallowedTools` so the SDK rejects calls outright.\n * Extracted so the policy can be unit-tested directly.\n */\nexport function shouldDisableAsk(\n session: Pick<WizardSession, 'ci' | 'signup'>,\n): boolean {\n return session.ci || session.signup;\n}\n\nexport function sessionToOptions(session: WizardSession): WizardRunOptions {\n return {\n installDir: session.installDir,\n debug: session.debug,\n default: false,\n signup: session.signup,\n localMcp: session.localMcp,\n ci: session.ci,\n benchmark: session.benchmark,\n projectId: session.projectId,\n apiKey: session.apiKey,\n yaraReport: session.yaraReport,\n };\n}\n\n// ── Bootstrap ─────────────────────────────────────────────────────────\n\n/**\n * Shared setup for both arms: logging, health check, settings conflicts, OAuth\n * and credentials, then the feature flags, variant metadata, and MCP url. Sets\n * `session.credentials`, role, and user as a side effect. Returns the values the\n * arms still need.\n */\nexport async function bootstrapProgram(\n session: WizardSession,\n config: ProgramRun,\n programConfig: ProgramConfig,\n): Promise<BootstrapResult> {\n // 1. Init logging + debug\n initLogFile();\n session.skillId = config.skillId ?? config.integrationLabel;\n logToFile(`[agent-runner] START ${config.integrationLabel}`);\n\n if (session.debug) {\n enableDebugLogs();\n }\n\n const skillsBaseUrl = getSkillsBaseUrl(session.localMcp);\n\n // 2. Health check (guarded — skip if TUI already ran it). Only\n // programs that declare a health-check screen get pre-flight checks;\n // for everything else the checks never fire and never block.\n const hasHealthCheckScreen = programConfig.steps.some(\n (s) => s.screenId === 'health-check',\n );\n if (session.readinessResult) {\n logToFile(\n `[agent-runner] readiness pre-computed by TUI: decision=${session.readinessResult.decision}` +\n `${\n session.outageDismissed ? ' (outage dismissed by user)' : ''\n } — skipping re-check`,\n );\n }\n if (hasHealthCheckScreen && !session.readinessResult) {\n logToFile('[agent-runner] evaluating wizard readiness');\n const readinessConfig = session.signup\n ? SIGNUP_WIZARD_READINESS_CONFIG\n : undefined;\n const readiness = await evaluateWizardReadiness(readinessConfig);\n logToFile(`[agent-runner] readiness=${readiness.decision}`);\n if (readiness.decision === WizardReadiness.No) {\n const blockingKeys = getBlockingServiceKeys(\n readiness.health,\n readinessConfig,\n );\n const blockingLabels = blockingKeys.map(\n (k) => `${SERVICE_LABELS[k]} (${readiness.health[k].status})`,\n );\n logToFile(`[agent-runner] blocked by: ${blockingLabels.join(', ')}`);\n\n await getUI().showBlockingOutage(readiness);\n\n // The TUI lets the user continue past an outage; non-interactive runs\n // (CI) do the same automatically — the degraded services are reported\n // above, but we proceed rather than aborting on a transient upstream blip.\n if (!isNonInteractiveEnvironment()) {\n await wizardAbort({\n message:\n 'Cannot start — external services are down:\\n' +\n blockingLabels.map((l) => ` - ${l}`).join('\\n') +\n '\\n\\nPlease try again later.',\n });\n }\n } else if (readiness.decision === WizardReadiness.YesWithWarnings) {\n getUI().setReadinessWarnings(readiness);\n }\n }\n\n // 3. Settings conflicts\n const settingsConflicts = checkAllSettingsConflicts(session.installDir);\n logToFile(\n `[agent-runner] settings conflicts: ${\n settingsConflicts.length > 0\n ? settingsConflicts\n .map((c) => `${c.source}(${c.keys.join(',')})`)\n .join('; ')\n : 'none'\n }`,\n );\n\n if (settingsConflicts.length > 0) {\n for (const conflict of settingsConflicts) {\n const level = conflict.source === 'managed' ? 'org' : conflict.source;\n analytics.wizardCapture('settings conflict detected', {\n level,\n keys: conflict.keys,\n });\n }\n await getUI().showSettingsOverride(settingsConflicts, () =>\n backupAndFixClaudeSettings(session.installDir),\n );\n logToFile('[agent-runner] settings override resolved');\n }\n\n analytics.wizardCapture('agent started', {\n integration: config.integrationLabel,\n program_id: programConfig.id,\n skill_id: config.skillId ?? null,\n });\n\n // 4. OAuth\n logToFile('[agent-runner] starting OAuth');\n const {\n projectApiKey,\n host,\n accessToken,\n projectId,\n cloudRegion,\n roleAtOrganization,\n user,\n project,\n } = await getOrAskForProjectData({\n signup: session.signup,\n ci: session.ci,\n apiKey: session.apiKey,\n projectId: session.projectId,\n email: session.email,\n region: session.region,\n programId: programConfig.id,\n });\n\n session.credentials = { accessToken, projectApiKey, host, projectId };\n session.roleAtOrganization = roleAtOrganization;\n session.apiUser = user;\n getUI().setCredentials(session.credentials);\n getUI().setRoleAtOrganization(roleAtOrganization);\n getUI().setApiUser(user);\n\n // Identify the user (email, name) before evaluating flags, so flags can target\n // the individual user and not just $app_name.\n if (user) analytics.identifyUser(user);\n analytics.setGroups(groupsFromUser(user, host));\n\n // 4.5. AI opt-in enforcement. Parks here while AiOptInRequiredScreen is\n // up if the org hasn't approved third-party AI — BEFORE the skill\n // install and agent start, so no source leaves the machine. The screen\n // alone is cosmetic; this await is the actual gate. Resolves\n // immediately when the program declared requiresAi: false or in CI.\n // In bootstrapProgram so both the linear and orchestrator arms gate.\n logToFile('[agent-runner] checking AI opt-in gate');\n await getUI().waitForAiOptIn();\n logToFile('[agent-runner] AI opt-in gate cleared');\n\n // Park for any interactive step the user must complete AFTER authenticating\n // but BEFORE the agent runs — e.g. the source-maps project picker, which\n // needs credentials to scan and writes its choice to frameworkContext that\n // the run prompt reads. Generic: await every gated step between auth and run.\n const authIndex = programConfig.steps.findIndex((s) => s.screenId === 'auth');\n const runIndex = programConfig.steps.findIndex((s) => s.screenId === 'run');\n if (authIndex !== -1 && runIndex > authIndex) {\n for (const step of programConfig.steps.slice(authIndex + 1, runIndex)) {\n if (step.gate) {\n logToFile(`[agent-runner] awaiting post-auth gate: ${step.id}`);\n await getUI().waitForGate(step.id);\n logToFile(`[agent-runner] post-auth gate cleared: ${step.id}`);\n }\n }\n }\n\n // Feature flags, variant metadata, and MCP url. Both arms need these, and the\n // fork decision reads the flags.\n const wizardFlags = await analytics.getAllFlagsForWizard();\n const wizardMetadata = buildWizardMetadata(wizardFlags);\n // Tag every wizard event with the variant so runs segment in PostHog; the\n // orchestrator arm overwrites this with its own variant when it forks.\n analytics.setTag('variant', wizardMetadata.VARIANT);\n\n // One MCP url for every region: the server resolves the user's region from\n // the bearer token, so the EU subdomain (a Claude Code OAuth workaround) is\n // not needed here.\n const mcpUrl = session.localMcp\n ? 'http://localhost:8787/mcp'\n : runtimeEnv('MCP_URL') || 'https://mcp.posthog.com/mcp';\n\n return {\n skillsBaseUrl,\n projectApiKey,\n host,\n accessToken,\n projectId,\n cloudRegion,\n mcpUrl,\n wizardFlags,\n wizardMetadata,\n project,\n };\n}\n","/** Phase transitions from [STATUS] in assistant text. Keep in sync with program \"Status to report\" bullets. */\n\nconst PHASES_ORDER = [\n '1.0-begin',\n '1.1-edit',\n '1.2-revise',\n '1.3-conclude',\n] as const;\n\nconst STATUS_PHRASES_BY_PHASE: Record<(typeof PHASES_ORDER)[number], string[]> =\n {\n '1.0-begin': [\n 'Checking project structure',\n 'Verifying PostHog dependencies',\n 'Generating events based on project',\n ],\n '1.1-edit': ['Inserting PostHog capture code'],\n '1.2-revise': [\n 'Finding and correcting errors',\n 'Report details of any errors you fix',\n 'Linting, building and prettying',\n ],\n '1.3-conclude': ['Configured dashboard', 'Created setup report'],\n };\n\nexport class PhaseDetector {\n private currentPhase: 'setup' | (typeof PHASES_ORDER)[number] = 'setup';\n\n detect(message: any): string | null {\n if (message.type !== 'assistant') return null;\n\n const nextPhase = this.getNextPhase();\n if (nextPhase === null) return null;\n\n const content = message.message?.content;\n if (!Array.isArray(content)) return null;\n\n for (const block of content) {\n if (block.type !== 'text' || typeof block.text !== 'string') continue;\n if (!block.text.includes('[STATUS]')) continue;\n\n const phrases = STATUS_PHRASES_BY_PHASE[nextPhase];\n for (const phrase of phrases) {\n if (block.text.includes(phrase)) {\n this.currentPhase = nextPhase;\n return nextPhase;\n }\n }\n }\n\n return null;\n }\n\n private getNextPhase(): (typeof PHASES_ORDER)[number] | null {\n if (this.currentPhase === 'setup') return '1.0-begin';\n const i = PHASES_ORDER.indexOf(this.currentPhase);\n if (i < 0 || i >= PHASES_ORDER.length - 1) return null;\n return PHASES_ORDER[i + 1];\n }\n\n reset(): void {\n this.currentPhase = 'setup';\n }\n}\n","/**\n * Middleware pipeline orchestrator.\n *\n * Implements the same { onMessage, finalize } interface that runAgent() expects,\n * while internally dispatching to an ordered list of middleware plugins.\n */\n\nimport { PhaseDetector } from './phase-detector';\nimport type {\n Middleware,\n MiddlewareContext,\n MiddlewareStore,\n SDKMessage,\n} from './types';\n\nexport class MiddlewarePipeline {\n private middlewares: Middleware[];\n private store = new Map<string, unknown>();\n private phaseDetector: PhaseDetector;\n private autoDetectPhases: boolean;\n private _currentPhase = 'setup';\n private _currentPhaseFreshContext = true;\n\n constructor(\n middlewares: Middleware[],\n opts?: { phaseDetector?: PhaseDetector; autoDetectPhases?: boolean },\n ) {\n this.middlewares = middlewares;\n this.phaseDetector = opts?.phaseDetector ?? new PhaseDetector();\n this.autoDetectPhases = opts?.autoDetectPhases ?? true;\n\n const ctx = this.createContext();\n for (const mw of this.middlewares) {\n mw.onInit?.(ctx);\n }\n }\n\n /** Feed an SDK message through all middleware (satisfies tracker.onMessage) */\n onMessage(message: SDKMessage): void {\n // Phase detection first — updates context before middleware sees it\n if (this.autoDetectPhases) {\n const newPhase = this.phaseDetector.detect(message);\n if (newPhase && newPhase !== this._currentPhase) {\n this.transitionPhase(newPhase, false);\n }\n }\n\n const ctx = this.createContext();\n const storeHandle = this.createStore();\n for (const mw of this.middlewares) {\n mw.onMessage?.(message, ctx, storeHandle);\n }\n }\n\n /** Finalize the run (satisfies tracker.finalize) */\n finalize(resultMessage: any, totalDurationMs: number): any {\n const ctx = this.createContext();\n const storeHandle = this.createStore();\n let result: any;\n for (const mw of this.middlewares) {\n const r = mw.onFinalize?.(\n resultMessage,\n totalDurationMs,\n ctx,\n storeHandle,\n );\n if (r !== undefined) result = r;\n }\n return result;\n }\n\n /** Explicit phase start (for phased runner support) */\n startPhase(name: string, freshContext: boolean): void {\n this.transitionPhase(name, freshContext);\n }\n\n private transitionPhase(newPhase: string, freshContext: boolean): void {\n const oldPhase = this._currentPhase;\n this._currentPhase = newPhase;\n this._currentPhaseFreshContext = freshContext;\n const ctx = this.createContext();\n const storeHandle = this.createStore();\n for (const mw of this.middlewares) {\n mw.onPhaseTransition?.(oldPhase, newPhase, ctx, storeHandle);\n }\n }\n\n private createContext(): MiddlewareContext {\n return {\n currentPhase: this._currentPhase,\n currentPhaseFreshContext: this._currentPhaseFreshContext,\n get: <T>(key: string) => this.store.get(key) as T | undefined,\n };\n }\n\n private createStore(): MiddlewareStore {\n return {\n set: (key: string, value: unknown) => this.store.set(key, value),\n };\n }\n}\n","/**\n * Benchmark configuration loader.\n *\n * Loads .benchmark-config.json from the working directory with sensible defaults.\n * All fields are optional — missing fields fall back to defaults.\n */\n\nimport fs from 'fs';\nimport path from 'path';\nimport { logToFile } from '@utils/debug';\nimport { AgentSignals } from '@lib/agent/agent-interface';\nimport { runtimeEnv } from '@env';\nimport { WIZARD_BENCHMARK_FILE, WIZARD_LOG_FILE } from '@utils/paths';\n\nexport interface BenchmarkConfig {\n /** Enable/disable individual metric plugins */\n plugins: Record<string, boolean>;\n output: {\n /** Path for the benchmark JSON output file */\n benchmarkPath: string;\n /** Whether to write the benchmark JSON file */\n benchmarkEnabled: boolean;\n /** Path for the main wizard debug log file */\n logPath: string;\n /** Whether to write the main wizard debug log */\n logEnabled: boolean;\n /** Suppress benchmark console output (disables the summary plugin) */\n suppressWizardLogs: boolean;\n };\n}\n\nconst DEFAULT_CONFIG: BenchmarkConfig = {\n plugins: {\n tokens: true,\n cache: true,\n turns: true,\n compactions: true,\n contextSize: true,\n cost: true,\n duration: true,\n summary: true,\n jsonWriter: true,\n },\n output: {\n benchmarkPath: WIZARD_BENCHMARK_FILE,\n benchmarkEnabled: true,\n logPath: WIZARD_LOG_FILE,\n logEnabled: true,\n suppressWizardLogs: false,\n },\n};\n\nexport function loadBenchmarkConfig(installDir: string): BenchmarkConfig {\n const configPath =\n runtimeEnv('POSTHOG_WIZARD_BENCHMARK_CONFIG') ??\n path.join(installDir, '.benchmark-config.json');\n try {\n const raw = fs.readFileSync(configPath, 'utf-8');\n const parsed = JSON.parse(raw);\n const config: BenchmarkConfig = {\n plugins: { ...DEFAULT_CONFIG.plugins, ...parsed.plugins },\n output: { ...DEFAULT_CONFIG.output, ...parsed.output },\n };\n\n // Env var overrides for parallel runs\n const benchFile = runtimeEnv('POSTHOG_WIZARD_BENCHMARK_FILE');\n if (benchFile) {\n config.output.benchmarkPath = benchFile;\n }\n const logDir = runtimeEnv('POSTHOG_WIZARD_LOG_DIR');\n if (logDir) {\n config.output.logPath = path.join(logDir, 'posthog-wizard.log');\n }\n\n // If benchmark output is disabled, disable the jsonWriter plugin\n if (!config.output.benchmarkEnabled) {\n config.plugins.jsonWriter = false;\n }\n\n logToFile(`${AgentSignals.BENCHMARK} Loaded config from ${configPath}`);\n return config;\n } catch {\n // No config file or invalid JSON — use defaults\n const config = structuredClone(DEFAULT_CONFIG);\n\n // Env var overrides\n const benchFile2 = runtimeEnv('POSTHOG_WIZARD_BENCHMARK_FILE');\n if (benchFile2) {\n config.output.benchmarkPath = benchFile2;\n }\n const logDir2 = runtimeEnv('POSTHOG_WIZARD_LOG_DIR');\n if (logDir2) {\n config.output.logPath = path.join(logDir2, 'posthog-wizard.log');\n }\n\n return config;\n }\n}\n\nexport function getDefaultConfig(): BenchmarkConfig {\n return structuredClone(DEFAULT_CONFIG);\n}\n","/**\n * Turn counting plugin with message deduplication.\n *\n * The SDK emits multiple assistant events per turn (one per content block)\n * with the same message ID. This plugin deduplicates and publishes turn\n * counts + a duplicate flag for downstream plugins.\n */\n\nimport type {\n Middleware,\n MiddlewareContext,\n MiddlewareStore,\n} from '@lib/middleware/types';\n\nexport interface TurnData {\n /** Whether the current message is a duplicate of the last processed turn */\n isDuplicate: boolean;\n /** Turns in the current phase */\n phaseTurns: number;\n /** Total turns across all phases */\n totalTurns: number;\n /** Per-phase turn snapshots: [{ phase, turns }] */\n phaseSnapshots: Array<{ phase: string; turns: number }>;\n}\n\nexport class TurnCounterPlugin implements Middleware {\n readonly name = 'turns';\n\n private lastMessageId: string | null = null;\n private phaseTurns = 0;\n private totalTurns = 0;\n private isDuplicate = false;\n private phaseSnapshots: Array<{ phase: string; turns: number }> = [];\n private currentPhase = 'setup';\n\n onMessage(\n message: any,\n _ctx: MiddlewareContext,\n store: MiddlewareStore,\n ): void {\n if (message.type !== 'assistant') {\n this.isDuplicate = false;\n store.set('turns', this.getData());\n return;\n }\n\n const msgId: string | undefined = message.message?.id;\n this.isDuplicate = msgId != null && msgId === this.lastMessageId;\n if (msgId) this.lastMessageId = msgId;\n\n if (!this.isDuplicate) {\n this.phaseTurns++;\n this.totalTurns++;\n }\n\n store.set('turns', this.getData());\n }\n\n onPhaseTransition(\n fromPhase: string,\n _toPhase: string,\n _ctx: MiddlewareContext,\n store: MiddlewareStore,\n ): void {\n this.phaseSnapshots.push({ phase: fromPhase, turns: this.phaseTurns });\n this.currentPhase = _toPhase;\n this.phaseTurns = 0;\n this.lastMessageId = null;\n store.set('turns', this.getData());\n }\n\n onFinalize(\n _resultMessage: any,\n _totalDurationMs: number,\n _ctx: MiddlewareContext,\n store: MiddlewareStore,\n ): void {\n this.phaseSnapshots.push({\n phase: this.currentPhase,\n turns: this.phaseTurns,\n });\n store.set('turns', this.getData());\n }\n\n private getData(): TurnData {\n return {\n isDuplicate: this.isDuplicate,\n phaseTurns: this.phaseTurns,\n totalTurns: this.totalTurns,\n phaseSnapshots: [...this.phaseSnapshots],\n };\n }\n}\n","/**\n * Token tracking plugin for input/output tokens.\n *\n * Accumulates per-turn token usage (input_tokens + cache_read_input_tokens\n * + cache_creation_input_tokens = total input; output_tokens = output).\n * Respects the dedup flag from TurnCounterPlugin. Cache breakdown (r/5m/1h)\n * is tracked by CacheTrackerPlugin for reporting and pricing.\n */\n\nimport type {\n Middleware,\n MiddlewareContext,\n MiddlewareStore,\n} from '@lib/middleware/types';\nimport type { TurnData } from './turn-counter';\n\nexport interface TokenData {\n phaseInput: number;\n phaseOutput: number;\n totalInput: number;\n totalOutput: number;\n /** The raw usage object from the last non-duplicate assistant message */\n lastUsage: any;\n /** Per-phase token snapshots */\n phaseSnapshots: Array<{\n phase: string;\n inputTokens: number;\n outputTokens: number;\n /** Number of turns in this phase that had usage (SDK may not report all) */\n messagesWithUsage: number;\n }>;\n}\n\nexport class TokenTrackerPlugin implements Middleware {\n readonly name = 'tokens';\n\n private phaseInput = 0;\n private phaseOutput = 0;\n private totalInput = 0;\n private totalOutput = 0;\n private lastUsage: any = null;\n private phaseSnapshots: Array<{\n phase: string;\n inputTokens: number;\n outputTokens: number;\n messagesWithUsage: number;\n }> = [];\n private currentPhase = 'setup';\n private phaseMessagesWithUsage = 0;\n\n onMessage(\n message: any,\n ctx: MiddlewareContext,\n store: MiddlewareStore,\n ): void {\n if (message.type !== 'assistant') return;\n\n const turns = ctx.get<TurnData>('turns');\n if (turns?.isDuplicate) return;\n\n const usage = message.message?.usage;\n if (usage) {\n const input =\n Number(usage.input_tokens ?? 0) +\n Number(usage.cache_read_input_tokens ?? 0) +\n Number(usage.cache_creation_input_tokens ?? 0);\n const output = Number(usage.output_tokens ?? 0);\n this.phaseInput += input;\n this.phaseOutput += output;\n this.totalInput += input;\n this.totalOutput += output;\n this.lastUsage = usage;\n this.phaseMessagesWithUsage += 1;\n }\n\n store.set('tokens', this.getData());\n }\n\n onPhaseTransition(\n fromPhase: string,\n toPhase: string,\n _ctx: MiddlewareContext,\n store: MiddlewareStore,\n ): void {\n this.phaseSnapshots.push({\n phase: fromPhase,\n inputTokens: this.phaseInput,\n outputTokens: this.phaseOutput,\n messagesWithUsage: this.phaseMessagesWithUsage,\n });\n this.currentPhase = toPhase;\n this.phaseInput = 0;\n this.phaseOutput = 0;\n this.phaseMessagesWithUsage = 0;\n store.set('tokens', this.getData());\n }\n\n onFinalize(\n _resultMessage: any,\n _totalDurationMs: number,\n _ctx: MiddlewareContext,\n store: MiddlewareStore,\n ): void {\n this.phaseSnapshots.push({\n phase: this.currentPhase,\n inputTokens: this.phaseInput,\n outputTokens: this.phaseOutput,\n messagesWithUsage: this.phaseMessagesWithUsage,\n });\n store.set('tokens', this.getData());\n }\n\n private getData(): TokenData {\n return {\n phaseInput: this.phaseInput,\n phaseOutput: this.phaseOutput,\n totalInput: this.totalInput,\n totalOutput: this.totalOutput,\n lastUsage: this.lastUsage,\n phaseSnapshots: [...this.phaseSnapshots],\n };\n }\n}\n","/**\n * Cache token tracking plugin (cache_read and cache_creation).\n *\n * Respects the dedup flag from TurnCounterPlugin.\n */\n\nimport type {\n Middleware,\n MiddlewareContext,\n MiddlewareStore,\n} from '@lib/middleware/types';\nimport type { TurnData } from './turn-counter';\n\n/** Matches SDK usage.cache_creation (ephemeral 5m vs 1h for pricing). */\nexport interface CacheCreationBreakdown {\n ephemeral_5m_input_tokens: number;\n ephemeral_1h_input_tokens: number;\n}\n\nexport interface CacheData {\n phaseRead: number;\n phaseCreation: number;\n totalRead: number;\n totalCreation: number;\n totalCreation5m: number;\n totalCreation1h: number;\n phaseSnapshots: Array<{\n phase: string;\n cacheReadTokens: number;\n cacheCreationTokens: number;\n /** When present, use for pricing (5m vs 1h rates). */\n cacheCreation5m: number;\n cacheCreation1h: number;\n }>;\n}\n\nexport class CacheTrackerPlugin implements Middleware {\n readonly name = 'cache';\n\n private phaseRead = 0;\n private phaseCreation = 0;\n private phaseCreation5m = 0;\n private phaseCreation1h = 0;\n private totalRead = 0;\n private totalCreation = 0;\n private totalCreation5m = 0;\n private totalCreation1h = 0;\n private phaseSnapshots: Array<{\n phase: string;\n cacheReadTokens: number;\n cacheCreationTokens: number;\n cacheCreation5m: number;\n cacheCreation1h: number;\n }> = [];\n private currentPhase = 'setup';\n\n onMessage(\n message: any,\n ctx: MiddlewareContext,\n store: MiddlewareStore,\n ): void {\n if (message.type !== 'assistant') return;\n\n const turns = ctx.get<TurnData>('turns');\n if (turns?.isDuplicate) return;\n\n const usage = message.message?.usage;\n if (usage) {\n const read = Number(usage.cache_read_input_tokens ?? 0);\n const creation = Number(usage.cache_creation_input_tokens ?? 0);\n const cc = usage.cache_creation;\n const creation5m = Number(cc?.ephemeral_5m_input_tokens ?? 0);\n const creation1h = Number(cc?.ephemeral_1h_input_tokens ?? 0);\n this.phaseRead += read;\n this.phaseCreation += creation;\n this.phaseCreation5m += creation5m;\n this.phaseCreation1h += creation1h;\n this.totalRead += read;\n this.totalCreation += creation;\n }\n\n store.set('cache', this.getData());\n }\n\n onPhaseTransition(\n fromPhase: string,\n toPhase: string,\n _ctx: MiddlewareContext,\n store: MiddlewareStore,\n ): void {\n this.phaseSnapshots.push({\n phase: fromPhase,\n cacheReadTokens: this.phaseRead,\n cacheCreationTokens: this.phaseCreation,\n cacheCreation5m: this.phaseCreation5m,\n cacheCreation1h: this.phaseCreation1h,\n });\n this.currentPhase = toPhase;\n this.phaseRead = 0;\n this.phaseCreation = 0;\n this.phaseCreation5m = 0;\n this.phaseCreation1h = 0;\n store.set('cache', this.getData());\n }\n\n onFinalize(\n _resultMessage: any,\n _totalDurationMs: number,\n _ctx: MiddlewareContext,\n store: MiddlewareStore,\n ): void {\n this.phaseSnapshots.push({\n phase: this.currentPhase,\n cacheReadTokens: this.phaseRead,\n cacheCreationTokens: this.phaseCreation,\n cacheCreation5m: this.phaseCreation5m,\n cacheCreation1h: this.phaseCreation1h,\n });\n store.set('cache', this.getData());\n }\n\n private getData(): CacheData {\n return {\n phaseRead: this.phaseRead,\n phaseCreation: this.phaseCreation,\n totalRead: this.totalRead,\n totalCreation: this.totalCreation,\n totalCreation5m: this.totalCreation5m,\n totalCreation1h: this.totalCreation1h,\n phaseSnapshots: [...this.phaseSnapshots],\n };\n }\n}\n","/**\n * Compaction event tracking plugin.\n *\n * Tracks context compaction events (compact_boundary system messages)\n * including pre-compaction token counts per phase.\n */\n\nimport type {\n Middleware,\n MiddlewareContext,\n MiddlewareStore,\n} from '@lib/middleware/types';\nimport { logToFile } from '@utils/debug';\nimport { AgentSignals } from '@lib/agent/agent-interface';\n\nexport interface CompactionData {\n phaseCompactions: number;\n phasePreTokens: number[];\n totalCompactions: number;\n phaseSnapshots: Array<{\n phase: string;\n compactions: number;\n preTokens: number[];\n }>;\n}\n\nexport class CompactionTrackerPlugin implements Middleware {\n readonly name = 'compactions';\n\n private phaseCompactions = 0;\n private phasePreTokens: number[] = [];\n private totalCompactions = 0;\n private phaseSnapshots: Array<{\n phase: string;\n compactions: number;\n preTokens: number[];\n }> = [];\n private currentPhase = 'setup';\n\n onMessage(\n message: any,\n ctx: MiddlewareContext,\n store: MiddlewareStore,\n ): void {\n if (message.type !== 'system' || message.subtype !== 'compact_boundary') {\n return;\n }\n\n const preTokens = message.compact_metadata?.pre_tokens ?? 0;\n const trigger = message.compact_metadata?.trigger ?? 'unknown';\n this.phaseCompactions++;\n this.totalCompactions++;\n this.phasePreTokens.push(preTokens);\n\n logToFile(\n `${AgentSignals.BENCHMARK} [COMPACTION] Context compacted during \"${ctx.currentPhase}\" (trigger: ${trigger}, pre_tokens: ${preTokens})`,\n );\n\n store.set('compactions', this.getData());\n }\n\n onPhaseTransition(\n fromPhase: string,\n toPhase: string,\n _ctx: MiddlewareContext,\n store: MiddlewareStore,\n ): void {\n this.phaseSnapshots.push({\n phase: fromPhase,\n compactions: this.phaseCompactions,\n preTokens: [...this.phasePreTokens],\n });\n this.currentPhase = toPhase;\n this.phaseCompactions = 0;\n this.phasePreTokens = [];\n store.set('compactions', this.getData());\n }\n\n onFinalize(\n _resultMessage: any,\n _totalDurationMs: number,\n _ctx: MiddlewareContext,\n store: MiddlewareStore,\n ): void {\n this.phaseSnapshots.push({\n phase: this.currentPhase,\n compactions: this.phaseCompactions,\n preTokens: [...this.phasePreTokens],\n });\n store.set('compactions', this.getData());\n }\n\n private getData(): CompactionData {\n return {\n phaseCompactions: this.phaseCompactions,\n phasePreTokens: [...this.phasePreTokens],\n totalCompactions: this.totalCompactions,\n phaseSnapshots: [...this.phaseSnapshots],\n };\n }\n}\n","/**\n * Context size tracking plugin (context tokens in/out per phase).\n *\n * Context tokens out = sum of input + cache_read + cache_creation from the\n * last assistant message's usage (per-turn, NOT aggregate).\n * Context tokens in = previous phase's context tokens out.\n */\n\nimport type {\n Middleware,\n MiddlewareContext,\n MiddlewareStore,\n} from '@lib/middleware/types';\nimport type { TokenData } from './token-tracker';\n\nexport interface ContextSizeData {\n /** Per-phase context size snapshots */\n phaseSnapshots: Array<{\n phase: string;\n contextTokensIn?: number;\n contextTokensOut?: number;\n freshContext: boolean;\n }>;\n}\n\nexport class ContextSizeTrackerPlugin implements Middleware {\n readonly name = 'contextSize';\n\n private phaseSnapshots: Array<{\n phase: string;\n contextTokensIn?: number;\n contextTokensOut?: number;\n freshContext: boolean;\n }> = [];\n private lastContextTokensOut?: number;\n\n onPhaseTransition(\n fromPhase: string,\n _toPhase: string,\n ctx: MiddlewareContext,\n store: MiddlewareStore,\n ): void {\n const tokens = ctx.get<TokenData>('tokens');\n const contextTokensOut = this.computeContextTokensOut(tokens?.lastUsage);\n\n this.phaseSnapshots.push({\n phase: fromPhase,\n contextTokensIn: ctx.currentPhaseFreshContext\n ? undefined\n : this.lastContextTokensOut,\n contextTokensOut,\n freshContext: ctx.currentPhaseFreshContext,\n });\n\n this.lastContextTokensOut = contextTokensOut;\n store.set('contextSize', this.getData());\n }\n\n onFinalize(\n _resultMessage: any,\n _totalDurationMs: number,\n ctx: MiddlewareContext,\n store: MiddlewareStore,\n ): void {\n const tokens = ctx.get<TokenData>('tokens');\n const contextTokensOut = this.computeContextTokensOut(tokens?.lastUsage);\n\n this.phaseSnapshots.push({\n phase: ctx.currentPhase,\n contextTokensIn: ctx.currentPhaseFreshContext\n ? undefined\n : this.lastContextTokensOut,\n contextTokensOut,\n freshContext: ctx.currentPhaseFreshContext,\n });\n\n store.set('contextSize', this.getData());\n }\n\n private computeContextTokensOut(usage: any): number | undefined {\n if (!usage) return undefined;\n return (\n Number(usage.input_tokens ?? 0) +\n Number(usage.cache_read_input_tokens ?? 0) +\n Number(usage.cache_creation_input_tokens ?? 0)\n );\n }\n\n private getData(): ContextSizeData {\n return {\n phaseSnapshots: [...this.phaseSnapshots],\n };\n }\n}\n","import type {\n Middleware,\n MiddlewareContext,\n MiddlewareStore,\n} from '@lib/middleware/types';\nimport type { TokenData } from './token-tracker';\nimport type { CacheData } from './cache-tracker';\n\nexport interface CostData {\n totalCost: number;\n phaseCosts: Array<{ phase: string; cost: number }>;\n}\n\n/** Claude Sonnet 4.6 pricing (USD per 1M tokens) */\nconst PRICE_PER_MTOK = {\n input: 3,\n output: 15,\n cacheRead: 0.3,\n cacheCreation5m: 3.75,\n cacheCreation1h: 6,\n} as const;\n\nfunction computeCost(\n inputTokens: number,\n outputTokens: number,\n cacheReadTokens: number,\n cacheCreation5m: number,\n cacheCreation1h: number,\n cacheCreationFallback: number,\n): number {\n const hasBreakdown = cacheCreation5m > 0 || cacheCreation1h > 0;\n return (\n inputTokens * (PRICE_PER_MTOK.input / 1e6) +\n outputTokens * (PRICE_PER_MTOK.output / 1e6) +\n cacheReadTokens * (PRICE_PER_MTOK.cacheRead / 1e6) +\n (hasBreakdown\n ? cacheCreation5m * (PRICE_PER_MTOK.cacheCreation5m / 1e6) +\n cacheCreation1h * (PRICE_PER_MTOK.cacheCreation1h / 1e6)\n : cacheCreationFallback * (PRICE_PER_MTOK.cacheCreation5m / 1e6))\n );\n}\n\nexport class CostTrackerPlugin implements Middleware {\n readonly name = 'cost';\n\n private phaseCosts: Array<{ phase: string; cost: number }> = [];\n private totalCost = 0;\n\n onPhaseTransition(\n fromPhase: string,\n _toPhase: string,\n ctx: MiddlewareContext,\n store: MiddlewareStore,\n ): void {\n const tokens = ctx.get<TokenData>('tokens');\n const cache = ctx.get<CacheData>('cache');\n const tokenSnap = tokens?.phaseSnapshots.at(-1);\n const cacheSnap = cache?.phaseSnapshots.at(-1);\n\n const totalIn = tokenSnap?.inputTokens ?? 0;\n const read = cacheSnap?.cacheReadTokens ?? 0;\n const creation = cacheSnap?.cacheCreationTokens ?? 0;\n const c5m = cacheSnap?.cacheCreation5m ?? 0;\n const c1h = cacheSnap?.cacheCreation1h ?? 0;\n const baseIn = Math.max(0, totalIn - read - creation);\n\n const phaseCost = computeCost(\n baseIn,\n tokenSnap?.outputTokens ?? 0,\n read,\n c5m,\n c1h,\n creation,\n );\n\n this.phaseCosts.push({ phase: fromPhase, cost: phaseCost });\n this.totalCost += phaseCost;\n store.set('cost', this.getData());\n }\n\n onFinalize(\n resultMessage: any,\n _totalDurationMs: number,\n ctx: MiddlewareContext,\n store: MiddlewareStore,\n ): void {\n const tokens = ctx.get<TokenData>('tokens');\n const cache = ctx.get<CacheData>('cache');\n const tokenSnap = tokens?.phaseSnapshots.at(-1);\n const cacheSnap = cache?.phaseSnapshots.at(-1);\n\n const totalIn = tokenSnap?.inputTokens ?? 0;\n const read = cacheSnap?.cacheReadTokens ?? 0;\n const creation = cacheSnap?.cacheCreationTokens ?? 0;\n const c5m = cacheSnap?.cacheCreation5m ?? 0;\n const c1h = cacheSnap?.cacheCreation1h ?? 0;\n const baseIn = Math.max(0, totalIn - read - creation);\n\n const lastPhaseCost = computeCost(\n baseIn,\n tokenSnap?.outputTokens ?? 0,\n read,\n c5m,\n c1h,\n creation,\n );\n\n this.phaseCosts.push({ phase: ctx.currentPhase, cost: lastPhaseCost });\n this.totalCost += lastPhaseCost;\n\n const sdkTotal =\n Number(resultMessage?.usage?.total_cost_usd ?? 0) ||\n Number(resultMessage?.total_cost_usd ?? 0);\n\n if (sdkTotal > 0 && this.totalCost > 0) {\n const scale = sdkTotal / this.totalCost;\n this.phaseCosts = this.phaseCosts.map((p) => ({\n phase: p.phase,\n cost: p.cost * scale,\n }));\n this.totalCost = sdkTotal;\n }\n\n store.set('cost', this.getData());\n }\n\n private getData(): CostData {\n return {\n totalCost: this.totalCost,\n phaseCosts: [...this.phaseCosts],\n };\n }\n}\n","/**\n * Duration tracking plugin (per-phase and total).\n */\n\nimport type {\n Middleware,\n MiddlewareContext,\n MiddlewareStore,\n} from '@lib/middleware/types';\n\nexport interface DurationData {\n phaseSnapshots: Array<{\n phase: string;\n startTime: number;\n endTime: number;\n durationMs: number;\n }>;\n totalDurationMs: number;\n}\n\nexport class DurationTrackerPlugin implements Middleware {\n readonly name = 'duration';\n\n private phaseStartTime = Date.now();\n private phaseSnapshots: Array<{\n phase: string;\n startTime: number;\n endTime: number;\n durationMs: number;\n }> = [];\n\n onPhaseTransition(\n fromPhase: string,\n _toPhase: string,\n _ctx: MiddlewareContext,\n store: MiddlewareStore,\n ): void {\n const now = Date.now();\n this.phaseSnapshots.push({\n phase: fromPhase,\n startTime: this.phaseStartTime,\n endTime: now,\n durationMs: now - this.phaseStartTime,\n });\n this.phaseStartTime = now;\n store.set('duration', {\n phaseSnapshots: [...this.phaseSnapshots],\n totalDurationMs: 0,\n } satisfies DurationData);\n }\n\n onFinalize(\n _resultMessage: any,\n totalDurationMs: number,\n ctx: MiddlewareContext,\n store: MiddlewareStore,\n ): void {\n const now = Date.now();\n this.phaseSnapshots.push({\n phase: ctx.currentPhase,\n startTime: this.phaseStartTime,\n endTime: now,\n durationMs: now - this.phaseStartTime,\n });\n\n store.set('duration', {\n phaseSnapshots: [...this.phaseSnapshots],\n totalDurationMs,\n } satisfies DurationData);\n }\n}\n","import { getUI, type SpinnerHandle } from '@ui';\nimport { AgentSignals } from '@lib/agent/agent-interface';\nimport type {\n Middleware,\n MiddlewareContext,\n MiddlewareStore,\n} from '@lib/middleware/types';\nimport type { TokenData } from './token-tracker';\nimport type { TurnData } from './turn-counter';\nimport type { CostData } from './cost-tracker';\nimport type { DurationData } from './duration-tracker';\nimport type { CompactionData } from './compaction-tracker';\nimport type { ContextSizeData } from './context-size-tracker';\nimport type { CacheData } from './cache-tracker';\n\nfunction fmtDuration(ms: number): string {\n const s = Math.round(ms / 1000);\n const m = Math.floor(s / 60);\n return m > 0 ? `${m}m ${s % 60}s` : `${s}s`;\n}\n\nfunction fmtTok(n: number): string {\n if (n >= 1_000_000) return `${(n / 1_000_000).toFixed(1)}M`;\n if (n >= 1_000) return `${(n / 1000).toFixed(1)}K`;\n return n.toLocaleString();\n}\n\nfunction fmtCost(usd: number): string {\n if (usd > 0 && usd < 0.01) return `$${usd.toFixed(4)}`;\n return `$${usd.toFixed(2)}`;\n}\n\ninterface PhaseStats {\n phase: string;\n durationMs: number;\n turns: number;\n inputTokens: number;\n outputTokens: number;\n cacheRead: number;\n cacheCreation5m: number;\n cacheCreation1h: number;\n cost: number;\n compactions: number;\n contextOut: number | undefined;\n}\n\nfunction printPhase(s: PhaseStats): string {\n const baseIn = Math.max(\n 0,\n s.inputTokens - s.cacheRead - s.cacheCreation5m - s.cacheCreation1h,\n );\n return [\n `${s.phase}: ${fmtDuration(s.durationMs)}, ${\n s.turns\n } turns, cost: ${fmtCost(s.cost)}`,\n ` in: ${fmtTok(baseIn)}, out: ${fmtTok(\n s.outputTokens,\n )}, cache_read: ${fmtTok(s.cacheRead)}, cache_5m: ${fmtTok(\n s.cacheCreation5m,\n )}, cache_1h: ${fmtTok(s.cacheCreation1h)}`,\n s.compactions > 0 ? ` ${s.compactions} compaction(s)` : null,\n s.contextOut !== undefined ? ` ctx_out: ${fmtTok(s.contextOut)}` : null,\n ]\n .filter(Boolean)\n .join('\\n');\n}\n\nfunction getPhaseStats(i: number, ctx: MiddlewareContext): PhaseStats | null {\n const duration = ctx.get<DurationData>('duration');\n const dur = duration?.phaseSnapshots[i];\n if (!dur) return null;\n\n const tokens = ctx.get<TokenData>('tokens');\n const turns = ctx.get<TurnData>('turns');\n const cost = ctx.get<CostData>('cost');\n const compactions = ctx.get<CompactionData>('compactions');\n const contextSize = ctx.get<ContextSizeData>('contextSize');\n const cache = ctx.get<CacheData>('cache');\n\n return {\n phase: dur.phase,\n durationMs: dur.durationMs,\n turns: turns?.phaseSnapshots[i]?.turns ?? 0,\n inputTokens: tokens?.phaseSnapshots[i]?.inputTokens ?? 0,\n outputTokens: tokens?.phaseSnapshots[i]?.outputTokens ?? 0,\n cacheRead: cache?.phaseSnapshots[i]?.cacheReadTokens ?? 0,\n cacheCreation5m: cache?.phaseSnapshots[i]?.cacheCreation5m ?? 0,\n cacheCreation1h: cache?.phaseSnapshots[i]?.cacheCreation1h ?? 0,\n cost: cost?.phaseCosts[i]?.cost ?? 0,\n compactions: compactions?.phaseSnapshots[i]?.compactions ?? 0,\n contextOut: contextSize?.phaseSnapshots[i]?.contextTokensOut,\n };\n}\n\nexport class SummaryPlugin implements Middleware {\n readonly name = 'summary';\n\n private spinner: SpinnerHandle;\n\n constructor(spinner: SpinnerHandle) {\n this.spinner = spinner;\n }\n\n onPhaseTransition(\n fromPhase: string,\n toPhase: string,\n ctx: MiddlewareContext,\n _store: MiddlewareStore,\n ): void {\n const duration = ctx.get<DurationData>('duration');\n const idx = (duration?.phaseSnapshots.length ?? 1) - 1;\n const stats = getPhaseStats(idx, ctx);\n\n if (stats) {\n this.spinner.stop(`${AgentSignals.BENCHMARK} ${printPhase(stats)}`);\n } else {\n this.spinner.stop(`${AgentSignals.BENCHMARK} ${fromPhase}`);\n }\n\n getUI().log.info(`${AgentSignals.BENCHMARK} Starting phase: ${toPhase}`);\n this.spinner.start(`Integrating PostHog (${toPhase})...`);\n }\n\n onFinalize(\n _resultMessage: any,\n totalDurationMs: number,\n ctx: MiddlewareContext,\n _store: MiddlewareStore,\n ): void {\n const duration = ctx.get<DurationData>('duration');\n const cost = ctx.get<CostData>('cost');\n const tokens = ctx.get<TokenData>('tokens');\n const cache = ctx.get<CacheData>('cache');\n\n const phaseCount = duration?.phaseSnapshots.length ?? 0;\n const totalCost = cost?.totalCost ?? 0;\n\n getUI().log.info('');\n getUI().log.info(\n `◇ ${AgentSignals.BENCHMARK} ${phaseCount} phases in ${fmtDuration(\n totalDurationMs,\n )}, cost: ${fmtCost(totalCost)}`,\n );\n getUI().log.info(\n ` total in: ${fmtTok(tokens?.totalInput ?? 0)}, out: ${fmtTok(\n tokens?.totalOutput ?? 0,\n )}, cache_read: ${fmtTok(cache?.totalRead ?? 0)}, cache_5m: ${fmtTok(\n cache?.totalCreation5m ?? 0,\n )}, cache_1h: ${fmtTok(cache?.totalCreation1h ?? 0)}`,\n );\n getUI().log.info('');\n getUI().log.info(`● ${AgentSignals.BENCHMARK} Summary by phase:`);\n\n if (duration?.phaseSnapshots) {\n for (let i = 0; i < duration.phaseSnapshots.length; i++) {\n const stats = getPhaseStats(i, ctx);\n if (stats) {\n getUI().log.info(printPhase(stats));\n }\n }\n }\n\n getUI().log.info('');\n }\n}\n","/**\n * JSON file output plugin.\n *\n * Assembles the BenchmarkData structure from all upstream plugin data\n * and writes it to a JSON file. Returns the BenchmarkData for backward compat.\n */\n\nimport fs from 'fs';\nimport { getUI } from '@ui';\nimport { logToFile } from '@utils/debug';\nimport { AgentSignals } from '@lib/agent/agent-interface';\nimport type {\n Middleware,\n MiddlewareContext,\n MiddlewareStore,\n} from '@lib/middleware/types';\nimport type { TokenData } from './token-tracker';\nimport type { CacheData } from './cache-tracker';\nimport type { TurnData } from './turn-counter';\nimport type { CostData } from './cost-tracker';\nimport type { DurationData } from './duration-tracker';\nimport type { CompactionData } from './compaction-tracker';\nimport type { ContextSizeData } from './context-size-tracker';\nimport type { BenchmarkData, StepUsage } from '@lib/middleware/benchmark';\n\n/**\n * Sum token usage across all models from the SDK's modelUsage field.\n */\nfunction sumModelUsage(modelUsage: Record<string, any>): {\n input_tokens: number;\n output_tokens: number;\n cache_creation_input_tokens: number;\n cache_read_input_tokens: number;\n} {\n let input_tokens = 0;\n let output_tokens = 0;\n let cache_creation_input_tokens = 0;\n let cache_read_input_tokens = 0;\n\n for (const model of Object.values(modelUsage)) {\n input_tokens += model.inputTokens ?? 0;\n output_tokens += model.outputTokens ?? 0;\n cache_creation_input_tokens += model.cacheCreationInputTokens ?? 0;\n cache_read_input_tokens += model.cacheReadInputTokens ?? 0;\n }\n\n return {\n input_tokens,\n output_tokens,\n cache_creation_input_tokens,\n cache_read_input_tokens,\n };\n}\n\nexport class JsonWriterPlugin implements Middleware {\n readonly name = 'jsonWriter';\n\n private outputPath: string;\n\n constructor(outputPath: string) {\n this.outputPath = outputPath;\n }\n\n onFinalize(\n resultMessage: any,\n totalDurationMs: number,\n ctx: MiddlewareContext,\n _store: MiddlewareStore,\n ): BenchmarkData {\n const tokens = ctx.get<TokenData>('tokens');\n const cache = ctx.get<CacheData>('cache');\n const turns = ctx.get<TurnData>('turns');\n const cost = ctx.get<CostData>('cost');\n const duration = ctx.get<DurationData>('duration');\n const compactions = ctx.get<CompactionData>('compactions');\n const contextSize = ctx.get<ContextSizeData>('contextSize');\n\n const modelUsage = resultMessage?.modelUsage ?? {};\n const aggregateUsage = sumModelUsage(modelUsage);\n\n const phaseCount = duration?.phaseSnapshots.length ?? 0;\n const steps: StepUsage[] = [];\n\n for (let i = 0; i < phaseCount; i++) {\n const dur = duration!.phaseSnapshots[i];\n const tokenSnap = tokens?.phaseSnapshots[i];\n const cacheSnap = cache?.phaseSnapshots[i];\n const turnSnap = turns?.phaseSnapshots[i];\n const costSnap = cost?.phaseCosts[i];\n const compSnap = compactions?.phaseSnapshots[i];\n const ctxSnap = contextSize?.phaseSnapshots[i];\n\n const step: StepUsage = {\n name: dur.phase,\n usage: {\n input_tokens: tokenSnap?.inputTokens ?? 0,\n output_tokens: tokenSnap?.outputTokens ?? 0,\n cache_creation_input_tokens: cacheSnap?.cacheCreationTokens ?? 0,\n cache_read_input_tokens: cacheSnap?.cacheReadTokens ?? 0,\n ...((cacheSnap?.cacheCreation5m ?? 0) +\n (cacheSnap?.cacheCreation1h ?? 0) >\n 0 && {\n cache_creation: {\n ephemeral_5m_input_tokens: cacheSnap?.cacheCreation5m ?? 0,\n ephemeral_1h_input_tokens: cacheSnap?.cacheCreation1h ?? 0,\n },\n }),\n },\n modelUsage: {},\n totalCostUsd: costSnap?.cost ?? 0,\n durationMs: dur.durationMs,\n durationApiMs: 0,\n numTurns: turnSnap?.turns ?? 0,\n ...(ctxSnap?.contextTokensIn !== undefined && {\n contextTokensIn: ctxSnap.contextTokensIn,\n }),\n ...(ctxSnap?.contextTokensOut !== undefined && {\n contextTokensOut: ctxSnap.contextTokensOut,\n }),\n ...(compSnap && compSnap.compactions > 0\n ? {\n compactions: compSnap.compactions,\n compactionPreTokens: compSnap.preTokens,\n }\n : {}),\n };\n\n steps.push(step);\n }\n\n const totalTurns = turns?.totalTurns ?? 0;\n const totalCost = cost?.totalCost ?? 0;\n const totalCompactions = compactions?.totalCompactions ?? 0;\n const fromModelUsage =\n aggregateUsage.input_tokens +\n aggregateUsage.cache_read_input_tokens +\n aggregateUsage.cache_creation_input_tokens;\n const inputTokens =\n fromModelUsage > 0\n ? fromModelUsage\n : (tokens?.totalInput ?? 0) +\n (cache?.totalRead ?? 0) +\n (cache?.totalCreation ?? 0);\n const outputTokens =\n aggregateUsage.output_tokens > 0\n ? aggregateUsage.output_tokens\n : tokens?.totalOutput ?? 0;\n\n const benchmark: BenchmarkData = {\n timestamp: new Date().toISOString(),\n steps,\n totals: {\n totalCostUsd: totalCost,\n durationMs: totalDurationMs,\n inputTokens,\n outputTokens,\n numTurns: resultMessage?.num_turns ?? totalTurns,\n totalCompactions,\n totalCacheReadTokens: cache?.totalRead ?? 0,\n totalCacheCreation5mTokens: cache?.totalCreation5m ?? 0,\n totalCacheCreation1hTokens: cache?.totalCreation1h ?? 0,\n },\n };\n\n this.writeBenchmarkData(benchmark);\n return benchmark;\n }\n\n private writeBenchmarkData(data: BenchmarkData): void {\n try {\n fs.writeFileSync(this.outputPath, JSON.stringify(data, null, 2));\n logToFile(`Benchmark data written to ${this.outputPath}`);\n getUI().log.info(\n `● ${AgentSignals.BENCHMARK} Results written to ${this.outputPath}`,\n );\n } catch (error) {\n logToFile('Failed to write benchmark data:', error);\n }\n }\n}\n","/**\n * Plugin registry and factory.\n *\n * Maps plugin names to constructors and creates the ordered plugin list\n * from a BenchmarkConfig.\n */\n\nimport type {\n Middleware,\n MiddlewareFactoryOptions,\n} from '@lib/middleware/types';\nimport type { BenchmarkConfig } from '@lib/middleware/config';\nimport { TurnCounterPlugin } from './turn-counter';\nimport { TokenTrackerPlugin } from './token-tracker';\nimport { CacheTrackerPlugin } from './cache-tracker';\nimport { CompactionTrackerPlugin } from './compaction-tracker';\nimport { ContextSizeTrackerPlugin } from './context-size-tracker';\nimport { CostTrackerPlugin } from './cost-tracker';\nimport { DurationTrackerPlugin } from './duration-tracker';\nimport { SummaryPlugin } from './summary';\nimport { JsonWriterPlugin } from './json-writer';\n\ntype PluginFactory = (opts: MiddlewareFactoryOptions) => Middleware;\n\nconst PLUGIN_REGISTRY: Record<string, PluginFactory> = {\n turns: () => new TurnCounterPlugin(),\n tokens: () => new TokenTrackerPlugin(),\n cache: () => new CacheTrackerPlugin(),\n compactions: () => new CompactionTrackerPlugin(),\n contextSize: () => new ContextSizeTrackerPlugin(),\n cost: () => new CostTrackerPlugin(),\n duration: () => new DurationTrackerPlugin(),\n summary: (opts) => new SummaryPlugin(opts.spinner!),\n jsonWriter: (opts) => new JsonWriterPlugin(opts.outputPath!),\n};\n\n/**\n * Execution order — data producers before consumers:\n * turns (dedup) -> tokens -> cache -> compactions -> contextSize -> cost -> duration -> summary -> jsonWriter\n */\nconst PLUGIN_ORDER = [\n 'turns',\n 'tokens',\n 'cache',\n 'compactions',\n 'contextSize',\n 'cost',\n 'duration',\n 'summary',\n 'jsonWriter',\n];\n\nexport function createPluginsFromConfig(\n config: BenchmarkConfig,\n opts: MiddlewareFactoryOptions,\n): Middleware[] {\n const resolvedOpts: MiddlewareFactoryOptions = {\n ...opts,\n outputPath: opts.outputPath ?? config.output.benchmarkPath,\n };\n\n // If suppressWizardLogs is set, disable the summary plugin\n const effectivePlugins = { ...config.plugins };\n if (config.output.suppressWizardLogs) {\n effectivePlugins.summary = false;\n }\n\n return PLUGIN_ORDER.filter((name) => effectivePlugins[name] !== false)\n .map((name) => PLUGIN_REGISTRY[name])\n .filter(Boolean)\n .map((factory) => factory(resolvedOpts));\n}\n","/**\n * Benchmark tracking for wizard runs.\n *\n * Usage:\n * const pipeline = createBenchmarkPipeline(spinner, options);\n * pipeline.onMessage(message);\n * pipeline.finalize(resultMessage, durationMs);\n */\n\nimport { getUI, type SpinnerHandle } from '@ui';\nimport { logToFile, getLogFilePath, configureLogFile } from '@utils/debug';\nimport { MiddlewarePipeline } from './pipeline';\nimport { PhaseDetector } from './phase-detector';\nimport { loadBenchmarkConfig } from './config';\nimport { createPluginsFromConfig } from './benchmarks';\nimport type { BenchmarkConfig } from './config';\nimport type { WizardRunOptions } from '@utils/types';\nimport { AgentSignals } from '@lib/agent/agent-interface';\n\n// ── Types ──────────────────────────────────────────────────────────────\n\nexport interface StepUsage {\n name: string;\n usage: {\n input_tokens: number;\n output_tokens: number;\n cache_creation_input_tokens: number;\n cache_read_input_tokens: number;\n cache_creation?: {\n ephemeral_5m_input_tokens: number;\n ephemeral_1h_input_tokens: number;\n };\n };\n modelUsage: Record<string, unknown>;\n totalCostUsd: number;\n durationMs: number;\n durationApiMs: number;\n numTurns: number;\n contextTokensIn?: number;\n contextTokensOut?: number;\n compactions?: number;\n compactionPreTokens?: number[];\n}\n\nexport interface BenchmarkData {\n timestamp: string;\n steps: StepUsage[];\n totals: {\n totalCostUsd: number;\n durationMs: number;\n inputTokens: number;\n outputTokens: number;\n numTurns: number;\n totalCompactions: number;\n totalCacheReadTokens: number;\n totalCacheCreation5mTokens: number;\n totalCacheCreation1hTokens: number;\n };\n}\n\n// ── Factory ────────────────────────────────────────────────────────────\n\n/**\n * Create a middleware pipeline configured for benchmarking.\n * Loads .benchmark-config.json from the install dir, falls back to defaults.\n */\nexport function createBenchmarkPipeline(\n spinner: SpinnerHandle,\n options: WizardRunOptions,\n configOverride?: BenchmarkConfig,\n): MiddlewarePipeline {\n const config = configOverride ?? loadBenchmarkConfig(options.installDir);\n\n configureLogFile({\n path: config.output.logPath,\n enabled: config.output.logEnabled,\n });\n\n const plugins = createPluginsFromConfig(config, {\n spinner,\n phased: false,\n outputPath: config.output.benchmarkPath,\n });\n\n if (!config.output.suppressWizardLogs) {\n getUI().log.info(\n `${AgentSignals.BENCHMARK} Verbose logs: ${getLogFilePath()}`,\n );\n getUI().log.info(\n `${AgentSignals.BENCHMARK} Benchmark data will be written to: ${config.output.benchmarkPath}`,\n );\n }\n\n logToFile(\n `${AgentSignals.BENCHMARK} Tracking enabled, starting with setup phase`,\n );\n\n return new MiddlewarePipeline(plugins, {\n phaseDetector: new PhaseDetector(),\n autoDetectPhases: true,\n });\n}\n","/**\n * WizardAskBridge — host-side promise broker for the `wizard_ask` MCP tool.\n *\n * The `wizard_ask` tool needs to (a) read information from the wizard\n * session (the active skill id, used as the analytics `source`) and\n * (b) drive the TUI overlay. Wiring `wizard-tools.ts` directly to either\n * would couple our pure-data MCP server to the runtime UI layer.\n *\n * The bridge is the seam: `wizard-tools.ts` depends on this interface,\n * and `agent-runner.ts` constructs an implementation that knows about\n * both the session and `getUI()`.\n */\nimport { randomUUID } from 'crypto';\n\nimport { analytics } from '@utils/analytics';\nimport type {\n AskAnswers,\n AskQuestion,\n PendingQuestion,\n} from './wizard-session';\n\nexport interface WizardAskRequest {\n questions: AskQuestion[];\n}\n\nexport interface WizardAskBridge {\n /**\n * Open the WizardAsk overlay and resolve with the user's answers.\n * One answer per question id (string for `single`/`text`, string[] for\n * `multi`). Cancelled fields come back as the literal `\"__cancelled__\"`.\n */\n request(req: WizardAskRequest): Promise<AskAnswers>;\n}\n\nexport interface WizardAskBridgeOptions {\n /** Returns the active skill id, used as the analytics `source` on the request. */\n getSource: () => string;\n /** Opens the overlay and resolves once the user submits or cancels. */\n showQuestion: (question: PendingQuestion) => Promise<AskAnswers>;\n /**\n * Per-question timeout in milliseconds. When the user takes longer than\n * this to answer, every unanswered field resolves with the\n * {@link CANCELLED_SENTINEL} value. Defaults to {@link DEFAULT_ASK_TIMEOUT_MS}.\n */\n timeoutMs?: number;\n /**\n * Opt the rendered overlay into rich link handling (OSC 8 hyperlinks +\n * clipboard copy for prompt URLs). Set per program; defaults to false.\n * Propagated onto every {@link PendingQuestion} this bridge creates.\n */\n richLinks?: boolean;\n}\n\n/** Sentinel returned for unanswered fields on cancellation or timeout. */\nexport const CANCELLED_SENTINEL = '__cancelled__';\n\n/** Default per-question timeout (5 minutes). */\nexport const DEFAULT_ASK_TIMEOUT_MS = 5 * 60 * 1000;\n\nfunction buildCancelledAnswers(questions: AskQuestion[]): AskAnswers {\n const out: AskAnswers = {};\n for (const q of questions) {\n out[q.id] = CANCELLED_SENTINEL;\n }\n return out;\n}\n\nfunction isFullyCancelled(answers: AskAnswers): boolean {\n const values = Object.values(answers);\n if (values.length === 0) return false;\n return values.every((v) => v === CANCELLED_SENTINEL);\n}\n\nexport function createWizardAskBridge(\n opts: WizardAskBridgeOptions,\n): WizardAskBridge {\n const timeoutMs = opts.timeoutMs ?? DEFAULT_ASK_TIMEOUT_MS;\n\n return {\n async request({ questions }) {\n const pending: PendingQuestion = {\n id: randomUUID(),\n questions,\n source: opts.getSource(),\n richLinks: opts.richLinks ?? false,\n };\n\n const startedAt = Date.now();\n let timer: ReturnType<typeof setTimeout> | undefined;\n\n // Race the user against the timeout. Whichever fires first wins; the\n // other branch is harmless because the overlay still resolves via the\n // store when the user eventually submits (and the answers are simply\n // discarded).\n const timeoutPromise = new Promise<AskAnswers>((resolve) => {\n timer = setTimeout(() => {\n resolve(buildCancelledAnswers(questions));\n }, timeoutMs);\n });\n\n try {\n const answers = await Promise.race([\n opts.showQuestion(pending),\n timeoutPromise,\n ]);\n const durationMs = Date.now() - startedAt;\n\n if (isFullyCancelled(answers)) {\n analytics.wizardCapture('wizard_ask cancelled', {\n source: pending.source,\n question_count: questions.length,\n duration_ms: durationMs,\n timed_out: durationMs >= timeoutMs,\n });\n } else {\n analytics.wizardCapture('wizard_ask answered', {\n source: pending.source,\n question_count: questions.length,\n duration_ms: durationMs,\n });\n }\n\n return answers;\n } finally {\n if (timer) clearTimeout(timer);\n }\n },\n };\n}\n","/**\n * Agent prompt assembly.\n *\n * Three sections, always in this order:\n * 1. Default project prompt — credentials and base context (always included)\n * 2. Custom prompt — additional program-specific instructions (if set)\n * 3. Skill prompt — \"follow SKILL.md\" instructions (if a skill was installed)\n */\n\nimport type { ProgramRun } from './agent-runner.js';\n\n/**\n * Values available to prompt builders after OAuth completes.\n */\nexport interface PromptContext {\n projectId: number;\n projectApiKey: string;\n host: string;\n /** Set when skillId was provided and the skill was installed successfully. */\n skillPath?: string;\n /**\n * Org-level AI consent (`is_ai_data_processing_approved`) read from the\n * `/api/users/@me/` payload at auth time. `null` = unknown (older orgs,\n * or the user fetch failed). Lets prompts pre-resolve consent state so\n * agents only ask the user when it is actually off or unknown.\n */\n orgAiDataProcessingApproved?: boolean | null;\n /**\n * Team product opt-ins from the `/api/projects/:id/` payload at auth\n * time. Project-level truth for \"is this product enabled\" — products\n * can be instrumented from other repos or the snippet, so repo-local\n * evidence must never rule them out. `null` field = unknown.\n */\n teamProductOptIns?: {\n sessionReplay?: boolean | null;\n exceptionAutocapture?: boolean | null;\n surveys?: boolean | null;\n } | null;\n}\n\nfunction defaultProjectPrompt(ctx: PromptContext): string {\n return `You have access to the PostHog MCP server.\n\nProject context:\n- PostHog Project ID: ${ctx.projectId}\n- PostHog public token: ${ctx.projectApiKey}\n- PostHog Host: ${ctx.host}`;\n}\n\nfunction skillPrompt(skillPath: string, reportFile: string): string {\n return `A PostHog skill has been installed at ${skillPath}/. Read ${skillPath}/SKILL.md and follow its instructions completely.\n\nAfter completing the skill workflow, write a brief markdown report to ./${reportFile} summarizing:\n- What changes were made to the project\n- Which files were modified or created\n- Any manual steps the user should take next\n\nImportant: You must read a file immediately before attempting to write it, even if you have previously read it; failure to do so will cause a tool failure.`;\n}\n\n/**\n * Assemble the final agent prompt from the program's run config.\n */\nexport function assemblePrompt(runDef: ProgramRun, ctx: PromptContext): string {\n const parts: string[] = [];\n\n // Always include the default project prompt\n parts.push(defaultProjectPrompt(ctx));\n\n // Additional program-specific instructions\n if (runDef.customPrompt) {\n parts.push(runDef.customPrompt(ctx));\n }\n\n // Skill prompt (appended when a skill was pre-installed)\n if (ctx.skillPath) {\n parts.push(skillPrompt(ctx.skillPath, runDef.reportFile));\n }\n\n return parts.join('\\n\\n');\n}\n","/**\n * Shared error helpers for the runner pipeline.\n */\n\nimport type { InstallSkillResult } from '@lib/wizard-tools';\nimport { wizardAbort, WizardError } from '@utils/wizard-abort';\n\nexport async function abortOnInstallFailure(\n integrationLabel: string,\n result: InstallSkillResult,\n): Promise<void> {\n if (result.kind === 'ok') return;\n\n const message = (() => {\n switch (result.kind) {\n case 'menu-fetch-failed':\n return 'Could not fetch the skill menu from context-mill.\\nCheck your network connection and try again.';\n case 'skill-not-found':\n return `Could not find the \"${result.skillId}\" skill in the context-mill menu.\\nPlease try again later.`;\n case 'download-failed':\n return `Failed to install skill: ${result.message}\\nPlease try again.`;\n }\n })();\n\n await wizardAbort({\n message,\n error: new WizardError(`Skill install failed: ${result.kind}`, {\n integration: integrationLabel,\n error_type: result.kind,\n }),\n });\n}\n","/**\n * The linear pipeline. Single execution path for all non-orchestrator programs,\n * both skill-based (revenue analytics) and framework-based (core integration).\n * The `ProgramRun` controls what varies between them; `programConfig` carries the\n * program-level static metadata (tool allow/disallow lists, etc.).\n */\n\nimport type { WizardSession } from '../../wizard-session';\nimport { OutroKind } from '../../wizard-session';\nimport { getUI } from '../../../ui';\nimport {\n initializeAgent,\n runAgent as executeAgent,\n AgentErrorType,\n AgentSignals,\n} from '../agent-interface';\nimport { restoreClaudeSettings } from '../claude-settings';\nimport { getCloudUrlFromRegion } from '../../../utils/urls';\nimport { logToFile, getLogFilePath } from '../../../utils/debug';\nimport { createBenchmarkPipeline } from '../../middleware/benchmark';\nimport {\n wizardAbort,\n WizardError,\n registerCleanup,\n} from '../../../utils/wizard-abort';\nimport { analytics } from '../../../utils/analytics';\nimport { formatScanReport, writeScanReport } from '../../yara-hooks';\nimport { detectNodePackageManagers } from '../../detection/package-manager';\nimport { installSkillById } from '../../wizard-tools';\nimport { createWizardAskBridge } from '../../wizard-ask-bridge';\nimport type { ProgramConfig } from '../../programs/program-step';\nimport { assemblePrompt } from '../agent-prompt';\nimport type { ProgramRun, BootstrapResult } from './shared/types';\nimport { abortOnInstallFailure } from './shared/errors';\nimport { shouldDisableAsk, sessionToOptions } from './shared/bootstrap';\n\nexport async function runLinearProgram(\n session: WizardSession,\n config: ProgramRun,\n programConfig: ProgramConfig,\n boot: BootstrapResult,\n): Promise<void> {\n const {\n skillsBaseUrl,\n projectApiKey,\n host,\n accessToken,\n projectId,\n cloudRegion,\n mcpUrl,\n wizardFlags,\n wizardMetadata,\n project,\n } = boot;\n\n // 5. Skill install (if skillId provided)\n let skillPath: string | undefined;\n if (config.skillId) {\n logToFile(`[agent-runner] installing skill ${config.skillId}`);\n const installResult = await installSkillById(\n config.skillId,\n session.installDir,\n skillsBaseUrl,\n );\n if (installResult.kind !== 'ok') {\n await abortOnInstallFailure(config.integrationLabel, installResult);\n return;\n }\n skillPath = installResult.path;\n logToFile(`[agent-runner] skill installed at ${skillPath}`);\n }\n\n // 6. Initialize agent\n const spinner = getUI().spinner();\n\n const restoreSettings = () => restoreClaudeSettings(session.installDir);\n getUI().onEnterScreen('outro', restoreSettings);\n\n if (session.yaraReport) {\n registerCleanup(() => {\n const reportPath = writeScanReport();\n if (reportPath) {\n const summary = formatScanReport();\n getUI().log.info(`YARA scan report: ${reportPath}${summary ?? ''}`);\n }\n });\n }\n\n getUI().startRun();\n\n // wizard_ask is only available in interactive mode. CI/signup users have\n // no way to answer; we omit the bridge so the tool returns an actionable\n // error rather than hanging on a never-resolving prompt.\n const askDisabled = shouldDisableAsk(session);\n const askBridge = askDisabled\n ? undefined\n : createWizardAskBridge({\n getSource: () => session.skillId ?? config.integrationLabel,\n showQuestion: (q) => getUI().requestQuestion(q),\n richLinks: config.richLinks ?? false,\n timeoutMs: config.askTimeoutMs,\n });\n\n getUI().log.step('Initializing Claude agent...');\n const agent = await initializeAgent(\n {\n workingDirectory: session.installDir,\n posthogMcpUrl: mcpUrl,\n posthogApiKey: accessToken,\n posthogApiHost: host,\n additionalMcpServers: config.additionalMcpServers,\n detectPackageManager:\n config.detectPackageManager ?? detectNodePackageManagers,\n skillsBaseUrl,\n wizardFlags,\n wizardMetadata,\n integrationLabel: config.integrationLabel,\n askBridge,\n askMaxQuestions: config.maxQuestions,\n allowedTools: programConfig.allowedTools,\n disallowedTools: programConfig.disallowedTools,\n getPendingQuestion: () => session.pendingQuestion,\n },\n sessionToOptions(session),\n );\n getUI().log.step(`Verbose logs: ${getLogFilePath()}`);\n getUI().log.success(\"Agent initialized. Let's get cooking!\");\n\n logToFile('[agent-runner] agent initialized');\n\n const middleware = session.benchmark\n ? createBenchmarkPipeline(spinner, sessionToOptions(session))\n : undefined;\n\n // 7. Build prompt\n const prompt = assemblePrompt(config, {\n projectId,\n projectApiKey,\n host,\n skillPath,\n orgAiDataProcessingApproved:\n session.apiUser?.organization?.is_ai_data_processing_approved ?? null,\n teamProductOptIns: project\n ? {\n sessionReplay: project.session_recording_opt_in ?? null,\n exceptionAutocapture: project.autocapture_exceptions_opt_in ?? null,\n surveys: project.surveys_opt_in ?? null,\n }\n : null,\n });\n logToFile(`[agent-runner] prompt assembled (${prompt.length} chars)`);\n\n // 8. Run agent\n const agentResult = await executeAgent(\n agent,\n prompt,\n sessionToOptions(session),\n spinner,\n {\n estimatedDurationMinutes: config.estimatedDurationMinutes,\n spinnerMessage: config.spinnerMessage,\n successMessage: config.successMessage,\n errorMessage: config.errorMessage ?? `${config.integrationLabel} failed`,\n additionalFeatureQueue: config.additionalFeatureQueue ?? [],\n abortCases: config.abortCases,\n emitStepEvents: config.trackStepProgress ?? false,\n },\n middleware,\n );\n\n // 9. Error handling (full set from both runners)\n if (agentResult.error === AgentErrorType.ABORT) {\n const reason = agentResult.message ?? '';\n const matched = config.abortCases?.find((c) => c.match.test(reason));\n const outroData: WizardSession['outroData'] = matched\n ? {\n kind: OutroKind.Error,\n message: matched.message,\n body: matched.body,\n docsUrl: matched.docsUrl,\n }\n : {\n kind: OutroKind.Error,\n message: `${config.integrationLabel} aborted`,\n body: reason || 'The agent aborted the program.',\n docsUrl: config.docsUrl,\n };\n analytics.wizardCapture('agent aborted', {\n integration: config.integrationLabel,\n reason,\n matched: matched?.message ?? null,\n });\n await wizardAbort({\n outroData,\n error: new WizardError(`Agent aborted: ${reason}`, {\n integration: config.integrationLabel,\n error_type: AgentErrorType.ABORT,\n reason,\n }),\n });\n }\n\n if (agentResult.error === AgentErrorType.MCP_MISSING) {\n await wizardAbort({\n message:\n 'Could not access the PostHog MCP server\\n\\n' +\n 'The wizard was unable to connect to the PostHog MCP server.\\n' +\n 'This could be due to a network issue or a configuration problem.\\n\\n' +\n `Please try again, or check the documentation:\\n${config.docsUrl}`,\n error: new WizardError('Agent could not access PostHog MCP server', {\n integration: config.integrationLabel,\n error_type: AgentErrorType.MCP_MISSING,\n signal: AgentSignals.ERROR_MCP_MISSING,\n }),\n });\n }\n\n if (agentResult.error === AgentErrorType.RESOURCE_MISSING) {\n await wizardAbort({\n message:\n 'Could not access the setup resource\\n\\n' +\n 'This may indicate a version mismatch or a temporary service issue.\\n\\n' +\n `Please try again, or check the documentation:\\n${config.docsUrl}`,\n error: new WizardError('Agent could not access setup resource', {\n integration: config.integrationLabel,\n error_type: AgentErrorType.RESOURCE_MISSING,\n signal: AgentSignals.ERROR_RESOURCE_MISSING,\n }),\n });\n }\n\n if (agentResult.error === AgentErrorType.YARA_VIOLATION) {\n await wizardAbort({\n message:\n 'Security violation detected.\\nPlease report this to: wizard@posthog.com',\n error: new WizardError('YARA scanner terminated session', {\n integration: config.integrationLabel,\n error_type: AgentErrorType.YARA_VIOLATION,\n }),\n });\n }\n\n if (\n agentResult.error === AgentErrorType.RATE_LIMIT ||\n agentResult.error === AgentErrorType.API_ERROR\n ) {\n analytics.wizardCapture('agent api error', {\n integration: config.integrationLabel,\n error_type: agentResult.error,\n error_message: agentResult.message,\n });\n\n await wizardAbort({\n message: `API Error\\n\\n${\n agentResult.message || 'Unknown error'\n }\\n\\nPlease report this to: wizard@posthog.com`,\n error: new WizardError(`API error: ${agentResult.message}`, {\n integration: config.integrationLabel,\n error_type: agentResult.error,\n }),\n });\n }\n\n // 10. Post-run hooks\n if (config.postRun) {\n await config.postRun(session, {\n accessToken,\n projectApiKey,\n host,\n projectId,\n });\n }\n\n // 11. Outro\n // Push outro data through the UI (not via direct `session.outroData = ...`\n // mutation) so the live store gets the value. agent-runner's `session`\n // parameter is captured at runAgent() invocation time, and any `setKey`\n // call between then and here (e.g. setDashboardUrl, setNotebookUrl) forks\n // the session reference — direct mutation then lands on a stale snapshot\n // that the screen never reads. UI.setOutroData() goes through the store\n // and also merges in any post-snapshot URLs from the live session.\n const outroData = config.buildOutroData\n ? config.buildOutroData(\n session,\n { accessToken, projectApiKey, host, projectId },\n cloudRegion,\n )\n : {\n kind: OutroKind.Success,\n message: config.successMessage,\n reportFile: config.reportFile,\n docsUrl: config.docsUrl,\n continueUrl: session.signup\n ? `${getCloudUrlFromRegion(cloudRegion)}/products?source=wizard`\n : undefined,\n };\n if (outroData) {\n getUI().setOutroData(outroData);\n }\n\n getUI().outro(config.successMessage);\n\n // 12. Analytics shutdown\n await analytics.shutdown('success');\n}\n","/**\n * Unified program runner — dispatcher.\n *\n * Single configurable pipeline for all programs. Each program\n * provides a ProgramRun (via the `run` field on ProgramConfig)\n * that controls:\n * - Whether a skill is pre-installed or discovered at runtime\n * - How the agent prompt is built\n * - What MCP servers and package manager detector to use\n * - What happens after the agent completes\n *\n * The pipeline runs a shared bootstrap (logging, health check, settings, OAuth,\n * flags, MCP url), then forks. The `orchestrator` variant routes to the\n * experimental task-queue runner. Every other variant runs the fixed linear\n * pipeline:\n * [skill install] → agent init → prompt → run → errors → [postRun] → outro\n */\n\nimport type { WizardSession } from '../../wizard-session';\nimport { isOrchestratorEnabled } from '../agent-interface';\nimport { getUI } from '../../../ui';\nimport { runOrchestrator } from './orchestrator/orchestrator-runner';\nimport type { ProgramConfig } from '../../programs/program-step';\nimport type { ProgramRun } from './shared/types';\nimport { bootstrapProgram } from './shared/bootstrap';\nimport { runLinearProgram } from './linear';\n\nexport type {\n ProgramRun,\n BootstrapResult,\n AbortCase,\n PromptContext,\n Credentials,\n} from './shared/types';\nexport { shouldDisableAsk } from './shared/bootstrap';\n\n/**\n * Resolve a ProgramConfig's agent run definition and execute the pipeline.\n * Entry point for bin.ts — handles buildRunConfig, bootstrap, and (future) run field.\n */\nexport async function runAgent(\n programConfig: ProgramConfig,\n session: WizardSession,\n): Promise<void> {\n if (!programConfig.run) {\n throw new Error(`Program \"${programConfig.id}\" has no run configuration.`);\n }\n\n const runDef =\n typeof programConfig.run === 'function'\n ? await programConfig.run(session)\n : programConfig.run;\n\n await runProgram(session, runDef, programConfig);\n}\n\n/**\n * Run a program's agent pipeline.\n *\n * Runs the shared bootstrap, then forks on the `wizard-variant` flag. The\n * `orchestrator` variant routes to the experimental task-queue runner; every\n * other variant runs the linear pipeline.\n */\nexport async function runProgram(\n session: WizardSession,\n config: ProgramRun,\n programConfig: ProgramConfig,\n): Promise<void> {\n const boot = await bootstrapProgram(session, config, programConfig);\n\n if (isOrchestratorEnabled(boot.wizardFlags)) {\n getUI().log.info('Task-queue orchestrator enabled.');\n return runOrchestrator(session, programConfig, boot);\n }\n\n return runLinearProgram(session, config, programConfig, boot);\n}\n"],"mappings":"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"}