@posthog/wizard 2.80.0 → 2.80.1
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.
- package/README.md +187 -57
- package/dist/{PickerMenu-m4CCPX4f.js → PickerMenu-BGGeYqd-.js} +104 -4
- package/dist/PickerMenu-BGGeYqd-.js.map +1 -0
- package/dist/README.md +9 -6
- package/dist/{agent-interface-CzyCmp7q.js → agent-interface-CemBvTAA.js} +115 -346
- package/dist/agent-interface-CemBvTAA.js.map +1 -0
- package/dist/{agent-prompt-loader-4wMxlYSX.js → agent-prompt-loader-DPnj6SwU.js} +6 -5
- package/dist/agent-prompt-loader-DPnj6SwU.js.map +1 -0
- package/dist/analytics-B3ROGuIr.js +2 -0
- package/dist/analytics-D21z3E5l.js +732 -0
- package/dist/analytics-D21z3E5l.js.map +1 -0
- package/dist/{api-C3Dc4LFl.js → api-DtGIqQ2U.js} +2 -3
- package/dist/api-DtGIqQ2U.js.map +1 -0
- package/dist/api-IhROOQNv.js +2 -0
- package/dist/api-key-login-OEntFvu5.js +2 -0
- package/dist/api-key-login-h3E2G3zu.js +55 -0
- package/dist/api-key-login-h3E2G3zu.js.map +1 -0
- package/dist/bin.js +2 -2
- package/dist/bin.js.map +1 -1
- package/dist/{bounded-fs-CC_NDtoP.js → bounded-fs-CAsuF6al.js} +3 -3
- package/dist/{bounded-fs-CC_NDtoP.js.map → bounded-fs-CAsuF6al.js.map} +1 -1
- package/dist/{ci-install-DfcAMhlu.js → ci-install-CEYE02t-.js} +21 -25
- package/dist/ci-install-CEYE02t-.js.map +1 -0
- package/dist/console-log-O828zyiq.js +32 -0
- package/dist/console-log-O828zyiq.js.map +1 -0
- package/dist/{debug-DyARf5TF.js → debug-BfQPD2Hg.js} +18 -52
- package/dist/debug-BfQPD2Hg.js.map +1 -0
- package/dist/{defaults-DpfMnH2q.js → defaults-DDVl3tKN.js} +2 -51
- package/dist/defaults-DDVl3tKN.js.map +1 -0
- package/dist/{emit-BSetXzDV.js → emit-RfAewcWv.js} +1 -1
- package/dist/{emit-BSetXzDV.js.map → emit-RfAewcWv.js.map} +1 -1
- package/dist/{errors-C2domSkK.js → errors-CHrJzAZb.js} +4 -4
- package/dist/{errors-C2domSkK.js.map → errors-CHrJzAZb.js.map} +1 -1
- package/dist/family-picker-BKs-tTyu.js +46 -0
- package/dist/family-picker-BKs-tTyu.js.map +1 -0
- package/dist/{gateway-BmjYUSua.js → gateway-D3gIlR6b.js} +122 -11
- package/dist/gateway-D3gIlR6b.js.map +1 -0
- package/dist/headless-BJjhP0SI.js +10 -0
- package/dist/headless-BJjhP0SI.js.map +1 -0
- package/dist/headless-DIX68UUA.js +3 -0
- package/dist/{host-resolution-DVSb7kXb.js → host-resolution-D8GhEVoX.js} +4 -4
- package/dist/{host-resolution-DVSb7kXb.js.map → host-resolution-D8GhEVoX.js.map} +1 -1
- package/dist/install-Bw8tvDvS.js +2 -0
- package/dist/{install-Bk5TNk27.js → install-paPCzPHI.js} +26 -93
- package/dist/install-paPCzPHI.js.map +1 -0
- package/dist/interactive-tdxZKWax.js +11 -0
- package/dist/interactive-tdxZKWax.js.map +1 -0
- package/dist/{links-9LWZPSCq.js → links-Cyj6v8kg.js} +3 -3
- package/dist/{links-9LWZPSCq.js.map → links-Cyj6v8kg.js.map} +1 -1
- package/dist/{main-DKPjFHEV.js → main-0p-YxUNa.js} +204 -469
- package/dist/main-0p-YxUNa.js.map +1 -0
- package/dist/{mcp-Co8VRF62.js → mcp-D3Z5MXhA.js} +3 -4
- package/dist/{mcp-Co8VRF62.js.map → mcp-D3Z5MXhA.js.map} +1 -1
- package/dist/mcp-install-smoke-test.ts +2 -2
- package/dist/{mcp-prompt-streaming-ljCVoQ9I.js → mcp-prompt-streaming-COVbWnHt.js} +12 -12
- package/dist/mcp-prompt-streaming-COVbWnHt.js.map +1 -0
- package/dist/mode-label-DB3ol_sj.js +9 -0
- package/dist/mode-label-DB3ol_sj.js.map +1 -0
- package/dist/{models-Dba8ITeo.js → models-D1SnCzvl.js} +2 -2
- package/dist/{models-Dba8ITeo.js.map → models-D1SnCzvl.js.map} +1 -1
- package/dist/non-interactive-DxRBc73O.js +18 -0
- package/dist/non-interactive-DxRBc73O.js.map +1 -0
- package/dist/{oauth-session-D-RfcVmr.js → oauth-session-Dde79Ycm.js} +3 -3
- package/dist/{oauth-session-D-RfcVmr.js.map → oauth-session-Dde79Ycm.js.map} +1 -1
- package/dist/{orchestrator-tools-CVJ1F9Ub.js → orchestrator-tools-BSNhzzkT.js} +3 -3
- package/dist/{orchestrator-tools-CVJ1F9Ub.js.map → orchestrator-tools-BSNhzzkT.js.map} +1 -1
- package/dist/{package-json-Cowya9-3.js → package-json-2UrhE6kP.js} +1 -1
- package/dist/{package-json-Cowya9-3.js.map → package-json-2UrhE6kP.js.map} +1 -1
- package/dist/package-json-Dblip2_X.js +2 -0
- package/dist/package-manager-BRXlXo0p.js +105 -0
- package/dist/package-manager-BRXlXo0p.js.map +1 -0
- package/dist/{pi-B5YTBRDv.js → pi-cM_4Gd_9.js} +16 -18
- package/dist/pi-cM_4Gd_9.js.map +1 -0
- package/dist/playground-DTKy0XHT.js +12 -0
- package/dist/playground-DTKy0XHT.js.map +1 -0
- package/dist/posthog-integration-bwHwE87a.js +10291 -0
- package/dist/posthog-integration-bwHwE87a.js.map +1 -0
- package/dist/programs-BhtyA3lE.js +3 -0
- package/dist/programs-SeT1qNik.js +5348 -0
- package/dist/programs-SeT1qNik.js.map +1 -0
- package/dist/provisioning-BcXfeCMc.js +2 -0
- package/dist/{provisioning-CLhuKqXH.js → provisioning-JbJtq7hq.js} +4 -5
- package/dist/{provisioning-CLhuKqXH.js.map → provisioning-JbJtq7hq.js.map} +1 -1
- package/dist/{queue-tools-knnPQP0e.js → queue-tools-BIZSJyt6.js} +6 -8
- package/dist/queue-tools-BIZSJyt6.js.map +1 -0
- package/dist/results-DtKICAdz.js +55 -0
- package/dist/results-DtKICAdz.js.map +1 -0
- package/dist/run-CDurA5tO.js +248 -0
- package/dist/run-CDurA5tO.js.map +1 -0
- package/dist/run-DDCvLILJ.js +246 -0
- package/dist/run-DDCvLILJ.js.map +1 -0
- package/dist/run-tool-CTq9OOdT.js +2 -0
- package/dist/run-tool-DML8JJvt.js +2420 -0
- package/dist/run-tool-DML8JJvt.js.map +1 -0
- package/dist/runners-Dhu4pZTN.js +253 -0
- package/dist/runners-Dhu4pZTN.js.map +1 -0
- package/dist/{security-BvdSFDuM.js → security-DEH8Rn0_.js} +5 -5
- package/dist/security-DEH8Rn0_.js.map +1 -0
- package/dist/setup-utils-C5-WM-hS.js +118 -0
- package/dist/setup-utils-C5-WM-hS.js.map +1 -0
- package/dist/smoke-test.sh +1 -1
- package/dist/{playground-BLsCfHmQ.js → start-playground-DL4mVEUx.js} +43 -34
- package/dist/start-playground-DL4mVEUx.js.map +1 -0
- package/dist/{subagent-D_Sqak94.js → subagent-CnFvAq6E.js} +3 -3
- package/dist/{subagent-D_Sqak94.js.map → subagent-CnFvAq6E.js.map} +1 -1
- package/dist/{task-DiTI6Sak.js → task-BOScSm4W.js} +16 -17
- package/dist/task-BOScSm4W.js.map +1 -0
- package/dist/{tasks-ChZ_F1YP.js → tasks-BfJhVky2.js} +1 -1
- package/dist/tasks-BfJhVky2.js.map +1 -0
- package/dist/{telemetry-BNKsDxNS.js → telemetry-CP4rGicd.js} +2 -2
- package/dist/{telemetry-BNKsDxNS.js.map → telemetry-CP4rGicd.js.map} +1 -1
- package/dist/terminal-J3OD3dN0.js +16162 -0
- package/dist/terminal-J3OD3dN0.js.map +1 -0
- package/dist/tools-CCMV3DmB.js +544 -0
- package/dist/tools-CCMV3DmB.js.map +1 -0
- package/dist/{tools-C8LQ8QFz.js → tools-Cz8tDptL.js} +9 -9
- package/dist/tools-Cz8tDptL.js.map +1 -0
- package/dist/tui-BUZ2PWqN.js +2 -0
- package/dist/tui-Csf7VJxt.js +25 -0
- package/dist/tui-Csf7VJxt.js.map +1 -0
- package/dist/{steps-Hc28zVc_.js → upload-step-CEacB2RV.js} +14 -16
- package/dist/upload-step-CEacB2RV.js.map +1 -0
- package/dist/{urls-BI4kJ4qQ.js → urls-BDELGZHq.js} +2 -2
- package/dist/{urls-BI4kJ4qQ.js.map → urls-BDELGZHq.js.map} +1 -1
- package/dist/warlock-smoke-test.ts +1 -2
- package/dist/{wizard-abort-DBKtfnBR.js → wizard-abort-D3-75KyV.js} +40 -33
- package/dist/wizard-abort-D3-75KyV.js.map +1 -0
- package/dist/yara-hooks-CZ1tKxy_.js +2 -0
- package/dist/{yara-hooks-C3L6lBij.js → yara-hooks-D8YDyX7o.js} +283 -21
- package/dist/yara-hooks-D8YDyX7o.js.map +1 -0
- package/package.json +6 -6
- package/dist/PickerMenu-m4CCPX4f.js.map +0 -1
- package/dist/agent-BkBbVuNq.js +0 -3189
- package/dist/agent-BkBbVuNq.js.map +0 -1
- package/dist/agent-QGK2YzlX.js +0 -6
- package/dist/agent-interface-CzyCmp7q.js.map +0 -1
- package/dist/agent-prompt-loader-4wMxlYSX.js.map +0 -1
- package/dist/analytics-B6q5PN7a.js +0 -301
- package/dist/analytics-B6q5PN7a.js.map +0 -1
- package/dist/analytics-BXtfK9o7.js +0 -2
- package/dist/api-C3Dc4LFl.js.map +0 -1
- package/dist/api-yNjrfZs2.js +0 -2
- package/dist/check-screens.tsx +0 -190
- package/dist/ci-install-DfcAMhlu.js.map +0 -1
- package/dist/constants-DO4X70po.js +0 -260
- package/dist/constants-DO4X70po.js.map +0 -1
- package/dist/debug-BueK5mRR.js +0 -2
- package/dist/debug-DyARf5TF.js.map +0 -1
- package/dist/defaults-DpfMnH2q.js.map +0 -1
- package/dist/endpoints-D-4KxZiB.js +0 -108
- package/dist/endpoints-D-4KxZiB.js.map +0 -1
- package/dist/env-api-key-CHGLe0iz.js +0 -2
- package/dist/env-api-key-COf0U-Au.js +0 -17
- package/dist/env-api-key-COf0U-Au.js.map +0 -1
- package/dist/environment-DrLaSsA8.js +0 -39
- package/dist/environment-DrLaSsA8.js.map +0 -1
- package/dist/environment-hBj7ngmO.js +0 -2
- package/dist/file-CVA9ocIC.js +0 -60
- package/dist/file-CVA9ocIC.js.map +0 -1
- package/dist/file-CmoKK_Pp.js +0 -2
- package/dist/file-watcher-C3Su8vXm.js +0 -123
- package/dist/file-watcher-C3Su8vXm.js.map +0 -1
- package/dist/gateway-BmjYUSua.js.map +0 -1
- package/dist/headless-ui-CUbv12Yx.js +0 -44
- package/dist/headless-ui-CUbv12Yx.js.map +0 -1
- package/dist/install-Bk5TNk27.js.map +0 -1
- package/dist/install-F4wm3RSl.js +0 -2
- package/dist/interactive-C5LNvDj6.js +0 -11
- package/dist/interactive-C5LNvDj6.js.map +0 -1
- package/dist/local-dev-McsurOC-.js +0 -135
- package/dist/local-dev-McsurOC-.js.map +0 -1
- package/dist/logging-ui-p6XKVmTx.js +0 -226
- package/dist/logging-ui-p6XKVmTx.js.map +0 -1
- package/dist/main-DKPjFHEV.js.map +0 -1
- package/dist/mcp-prompt-streaming-ljCVoQ9I.js.map +0 -1
- package/dist/mint-failure-C0HyvEwO.js +0 -6403
- package/dist/mint-failure-C0HyvEwO.js.map +0 -1
- package/dist/non-interactive-CLMJrj_7.js +0 -18
- package/dist/non-interactive-CLMJrj_7.js.map +0 -1
- package/dist/package-json--ppioh2F.js +0 -2
- package/dist/pi-B5YTBRDv.js.map +0 -1
- package/dist/playground-BLsCfHmQ.js.map +0 -1
- package/dist/posthog-B2E0hpZt.js +0 -2
- package/dist/posthog-B42rt_1S.js +0 -124
- package/dist/posthog-B42rt_1S.js.map +0 -1
- package/dist/project-data--L-WZyvj.js +0 -2
- package/dist/project-data-BO9IXn9y.js +0 -1131
- package/dist/project-data-BO9IXn9y.js.map +0 -1
- package/dist/provisioning-C01REIU2.js +0 -2
- package/dist/queue-tools-knnPQP0e.js.map +0 -1
- package/dist/registry-B3rC5U4b.js +0 -3464
- package/dist/registry-B3rC5U4b.js.map +0 -1
- package/dist/registry-BamsM7J9.js +0 -2
- package/dist/run-agent-legacy-CwUmPfQF.js +0 -2
- package/dist/run-agent-legacy-DWBajsMh.js +0 -3467
- package/dist/run-agent-legacy-DWBajsMh.js.map +0 -1
- package/dist/runners-D1PqqpjA.js +0 -834
- package/dist/runners-D1PqqpjA.js.map +0 -1
- package/dist/security-BvdSFDuM.js.map +0 -1
- package/dist/setup-utils-ChXXTi1m.js +0 -301
- package/dist/setup-utils-ChXXTi1m.js.map +0 -1
- package/dist/start-tui-DicLfgsj.js +0 -6964
- package/dist/start-tui-DicLfgsj.js.map +0 -1
- package/dist/steps-Hc28zVc_.js.map +0 -1
- package/dist/store-COCO6U0P.js +0 -5
- package/dist/store-D3509G87.js +0 -1030
- package/dist/store-D3509G87.js.map +0 -1
- package/dist/task-DiTI6Sak.js.map +0 -1
- package/dist/task-status-CmrrR7zo.js +0 -16
- package/dist/task-status-CmrrR7zo.js.map +0 -1
- package/dist/task-stream-BckhG_cB.js +0 -363
- package/dist/task-stream-BckhG_cB.js.map +0 -1
- package/dist/tasks-ChZ_F1YP.js.map +0 -1
- package/dist/terminal-PK9bCLRi.js +0 -7222
- package/dist/terminal-PK9bCLRi.js.map +0 -1
- package/dist/tools-C8LQ8QFz.js.map +0 -1
- package/dist/ui-tPNpM6vj.js +0 -15
- package/dist/ui-tPNpM6vj.js.map +0 -1
- package/dist/version-5_ydHkM6.js +0 -6
- package/dist/version-5_ydHkM6.js.map +0 -1
- package/dist/wizard-abort-BVjqLyeA.js +0 -3
- package/dist/wizard-abort-DBKtfnBR.js.map +0 -1
- package/dist/wizard-session-B7BHnay0.js +0 -2
- package/dist/wizard-session-BYw6LzpS.js +0 -133
- package/dist/wizard-session-BYw6LzpS.js.map +0 -1
- package/dist/yara-hooks-C3L6lBij.js.map +0 -1
- package/dist/yara-hooks-CF_IsoaA.js +0 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-CDurA5tO.js","names":[],"sources":["../src/tui/workflow.ts","../src/tui/run.ts"],"sourcesContent":["/** The TUI's answers to the steps `runProgram` waits on: its screens, gates and overlays. */\nimport { RunOutcome } from '@programs';\nimport type { ProgramId, ProgramWorkflowConnector } from '@programs/types';\nimport type { WizardStore } from './store.js';\n\nexport function tuiWorkflow(\n store: WizardStore,\n programId: ProgramId,\n): ProgramWorkflowConnector {\n return {\n async confirmStep(step) {\n switch (step.kind) {\n case 'ai-approval':\n // AiOptInRequiredScreen holds here, before any source leaves the machine.\n await store.getGate('ai-opt-in');\n return true;\n case 'service-outage':\n // The health-check screen shows the outage; the run stops.\n store.setReadinessResult(step.readiness);\n return false;\n case 'settings-conflict':\n await store.showSettingsOverride(step.conflicts, step.fix);\n return true;\n case 'run':\n // Each screen before the run's step settles first; a hidden step doesn't run.\n return store.reachStep(step.stepId);\n }\n },\n finishStep(step, result) {\n // Only a composed sub-run that succeeded completes its step; a failed one keeps its tasks for the outro and the stream. The program's run step follows its phase.\n if (\n step.programId !== programId &&\n result.outcome === RunOutcome.Success\n ) {\n store.completeRunStep(step.stepId);\n }\n },\n };\n}\n","/**\n * The TUI host: the full-screen wizard. It renders its screens over its own\n * store, settles the intro, and calls `runProgram` once with the OAuth login,\n * the WizardAsk screen as the answerer and its screens as the workflow. An\n * intro that hands off to a tool drives the tool's screens instead. The CLI\n * builds the launch values, owns the signals and applies the exit code.\n */\nimport { join } from 'node:path';\nimport {\n buildSession,\n createFileDestination,\n createWizardRunSync,\n getAuditChecks,\n getProgramConfig,\n loadWizardFlags,\n PostHogDestination,\n ProgramAbort,\n RunOutcome,\n runProgram,\n storeInteraction,\n TaskStreamPush,\n} from '@programs';\nimport type { CredentialsProvider, ProgramConfig } from '@programs/types';\nimport { classifyRunFailure } from '@shared/errors';\nimport { OutroKind } from '@shared/outro';\nimport { RunPhase } from '@shared/run-state';\nimport { VERSION } from '@shared/version';\nimport { analytics } from '@utils/analytics';\nimport { runCleanups } from '@utils/cleanup';\nimport { initLogFile, logToFile } from '@utils/debug';\nimport { flushAnalytics } from '@utils/flush-analytics';\nimport {\n registerShutdown,\n startHostExit,\n wizardAbort,\n} from '@host/wizard-abort';\nimport { printAbortOutro } from '@shared/console-log';\nimport { getTuiTool } from '@tui/tools/index';\nimport { abortOnScreens } from './abort.js';\nimport { displayProgress } from './agent-progress.js';\nimport { oauthCredentials } from './auth/login.js';\nimport { isRunFailure } from './mint-failure.js';\nimport { driveTuiTool, localServicesError, reportFatal } from './run-tool.js';\nimport { startTUI } from './start-tui.js';\nimport type { WizardStore } from './store.js';\nimport type { TuiLaunch } from './launch.js';\nimport { tuiWorkflow } from './workflow.js';\n\n/**\n * Run `config` in the TUI. Resolves with the exit code: the run's, a screen's\n * exit request, a decided failure's through `wizardAbort`, or 130 or 143 on a signal.\n */\nexport async function runTui(\n config: ProgramConfig,\n launch: TuiLaunch,\n): Promise<number> {\n const exit = startHostExit();\n let tui: ReturnType<typeof startTUI> | null = null;\n let stream: TaskStreamPush | null = null;\n let unregisterShutdown: (() => void) | undefined;\n // A signal cancels the run and any pending question before the exit.\n const runAbort = new AbortController();\n let exitInProgress = false;\n let signalled = false;\n // A tool the intro handed off to ends the run once its analytics flush.\n let handedOff = false;\n\n // Flush a terminal-phase push so the web app sees the run ended in error\n // rather than hanging on the last \"running\" snapshot. Registered before the\n // stream exists: Ctrl-C on the intro must still restore the terminal and run\n // the cleanups, and there is no run to report yet.\n const onSignal = (signal: 'SIGINT' | 'SIGTERM'): void => {\n if (signalled || exitInProgress || exit.ended) return;\n signalled = true;\n runAbort.abort();\n logToFile('[run-wizard] signal received, flushing task stream');\n // Settings restore is sync fs work, so it runs before a flush that may time out.\n runCleanups();\n if (tui?.store.session.runPhase === RunPhase.Running) {\n tui.store.setRunPhase(RunPhase.Error);\n }\n void Promise.all([\n stream?.shutdown(2000, 'cancelled'),\n analytics.shutdown('cancelled'),\n ])\n .catch(() => logToFile('[run-wizard] cancellation shutdown failed'))\n .finally(() => {\n unregisterShutdown?.();\n try {\n tui?.unmount();\n } catch {\n // terminal may already be torn down\n }\n exit.end(signal === 'SIGTERM' ? 143 : 130);\n });\n };\n const onAbort = () =>\n onSignal(launch.signal.reason === 'SIGTERM' ? 'SIGTERM' : 'SIGINT');\n // A signal that landed before this host subscribed ends the run too.\n if (launch.signal.aborted) onAbort();\n else launch.signal.addEventListener('abort', onAbort, { once: true });\n\n // Before the TUI mounts: once Ink owns the alt screen, anything written\n // to it is wiped on unmount (see the catch block below), so an abort here\n // would leave the user on a loading screen with no message.\n const localError = await localServicesError(launch.session.baseUrl);\n if (signalled) return exit.exited;\n if (localError) {\n wizardAbort(\n { present: printAbortOutro, exit },\n { message: localError },\n ).catch((error: unknown) => exit.fail(error));\n return exit.exited;\n }\n\n const main = async (): Promise<void> => {\n // Ink handles Ctrl-C itself in raw mode; it arrives here as an interrupt.\n tui = startTUI(VERSION, config.id, () => onSignal('SIGINT'));\n const activeTui = tui;\n const { store } = activeTui;\n // A screen's exit request ends the run with no shutdown; start-tui's exit listener unmounts.\n store.subscribe(() => {\n if (store.exitRequest !== null && !handedOff) exit.end(store.exitRequest);\n });\n\n const session = buildSession(launch.session);\n if (launch.skillId) {\n session.skillId = launch.skillId;\n } else if (config.skillId) {\n session.skillId = config.skillId;\n }\n store.launch(session, launch.session, config.id);\n\n const credentials = launch.credentials ?? oauthCredentials(store);\n launch.onStore?.(store);\n\n // Detection, then the intro, where the user may switch program.\n for (;;) {\n try {\n await store.runReadyHooks();\n } catch (error) {\n if (!(error instanceof ProgramAbort)) throw error;\n await abortOnScreens(store, {\n code: error.code,\n message: error.message,\n });\n }\n await store.getGate('intro');\n const active = store.router.activeProgram;\n if (active === config.id) break;\n const tool = getTuiTool(active);\n if (tool) {\n handedOff = true;\n const code = await driveTuiTool(store, tool, {\n toolId: active,\n signal: runAbort.signal,\n });\n if (signalled || exit.ended) return;\n exitInProgress = true;\n launch.signal.removeEventListener('abort', onAbort);\n activeTui.unmount();\n await flushAnalytics();\n exit.end(code);\n return;\n }\n config = getProgramConfig(active);\n }\n\n // After the switch loop, not before: the stream bakes its program id,\n // session id, and event-plan path in at construction, so a stream built\n // for the launch program would report the whole run under a program the\n // user left on the intro screen. Nothing before this point produces a\n // task to push.\n // Consent gates the push, not the dump: `--no-telemetry` still logs.\n const fileDestination = createFileDestination(launch.taskStreamLog);\n const destinations = [\n ...(session.noTelemetry\n ? []\n : [\n new PostHogDestination({\n getCredentials: () => store.session.credentials,\n onError: (err) => logToFile('[task-stream-push]', err.message),\n }),\n ]),\n ...(fileDestination ? [fileDestination] : []),\n ];\n const programConfig = config;\n const activeStream = new TaskStreamPush({\n store: store.sessions,\n getFlags: () => analytics.getCachedWizardFlags(),\n programId: programConfig.streamWorkflowId ?? programConfig.id,\n runSync: createWizardRunSync({\n mode: 'local',\n programId: programConfig.id,\n assignedId: launch.runId,\n noTelemetry: session.noTelemetry,\n getSession: () => store.session,\n }),\n destinations,\n eventPlanPath: programConfig.eventPlanFile\n ? join(session.installDir, programConfig.eventPlanFile)\n : undefined,\n auditChecks: programConfig.auditLedgerFile\n ? () => getAuditChecks(store.session)\n : undefined,\n enabled: destinations.length > 0,\n });\n stream = activeStream;\n activeStream.attach();\n unregisterShutdown = registerShutdown((outcome) => {\n if (store.session.runPhase === RunPhase.Running) {\n store.setRunPhase(RunPhase.Error);\n }\n return activeStream.shutdown(2000, outcome);\n });\n\n await store.getGate('integration-check');\n await store.getGate('health-check');\n\n try {\n await runProgramOnScreens(programConfig, store, {\n credentials,\n signal: runAbort.signal,\n });\n } catch (error) {\n // The run threw before its own error handling rendered an outro.\n // Show the handoff screen and let the user's agent take over.\n const failure = classifyRunFailure(error);\n logToFile('[run-wizard] run failed, handing off:', error);\n runCleanups();\n analytics.captureException(\n error instanceof Error ? error : new Error(String(error)),\n { error_code: failure.code },\n );\n store.showOutroError({\n kind: OutroKind.Error,\n errorCode: failure.code,\n message: failure.message,\n });\n }\n\n if (signalled) return;\n const runFailed = isRunFailure(store.session);\n await activeStream.finishRun(runFailed ? 'failed' : 'completed');\n await store.waitUntil((s) => s.mintHandoff === 'exit' || s.skillsComplete);\n // A screen already ended the run (KeepSkills after a success): start no flush it would cut off.\n if (exit.ended) return;\n\n exitInProgress = true;\n await activeStream.shutdown(2000);\n unregisterShutdown?.();\n launch.signal.removeEventListener('abort', onAbort);\n if (runFailed) await analytics.shutdown('error');\n activeTui.unmount();\n exit.end(runFailed ? 1 : 0);\n };\n\n main().catch(async (err: unknown) => {\n if (signalled || exit.ended) return;\n // File-log first — the cleanup below can throw or exit.\n logToFile('[run-wizard] FATAL:', err);\n // Run cleanups before anything async so settings are restored even if\n // the stream shutdown hangs.\n runCleanups();\n // The task-stream debounce timer keeps the event loop alive, so\n // we have to drain it before exiting on the error path.\n exitInProgress = true;\n launch.signal.removeEventListener('abort', onAbort);\n try {\n await stream?.shutdown(2000, 'failed');\n } catch {\n // ignore\n }\n unregisterShutdown?.();\n try {\n tui?.unmount();\n } catch {\n // ignore\n }\n reportFatal(err);\n exit.end(1);\n });\n\n return exit.exited;\n}\n\n/**\n * The program's run, answered by the screens: `credentials` logs in, the\n * WizardAsk screen answers, and the flow's screens settle each step. A failure\n * shows its outro and ends the run through `wizardAbort`.\n */\nexport async function runProgramOnScreens(\n config: ProgramConfig,\n store: WizardStore,\n {\n credentials,\n signal,\n }: { credentials: CredentialsProvider; signal?: AbortSignal },\n): Promise<void> {\n initLogFile();\n logToFile(`[agent-runner] START ${config.id} build=${analytics.build}`);\n\n // runProgram turns a throwing capability into a failed run; the TUI shows\n // the handoff for those, so the throw is kept and rethrown.\n let capabilityFailure: { error: unknown } | undefined;\n const keepFailure = <T>(work: Promise<T>): Promise<T> =>\n work.catch((error: unknown) => {\n capabilityFailure ??= { error };\n throw error;\n });\n const result = await runProgram(\n config.id,\n { store: store.sessions, config },\n {\n credentials: {\n resolve: (programId, context) =>\n keepFailure(credentials.resolve(programId, context)),\n },\n interaction: storeInteraction(store.sessions),\n workflow: tuiWorkflow(store, config.id),\n onProgress: displayProgress(store),\n featureFlags: () => keepFailure(loadWizardFlags()),\n signal,\n },\n );\n if (capabilityFailure) throw capabilityFailure.error;\n // A signal cancelled the run; the handler that aborted it settles.\n if (signal?.aborted) return;\n\n if (result.outcome === RunOutcome.Crashed) throw result.failure?.error;\n if (result.outcome !== RunOutcome.Success) {\n if (result.failure?.authErrorDetail) {\n store.showAuthError(result.failure.authErrorDetail);\n }\n // The terminal status follows how the run ended, not whether an Error came back.\n await abortOnScreens(store, {\n ...result.failure,\n status: result.outcome === RunOutcome.Aborted ? 'cancelled' : 'error',\n });\n return;\n }\n // The run already succeeded: a failed flush is logged, never the outcome.\n try {\n await analytics.shutdown('success');\n } catch (error) {\n logToFile('[agent-runner] analytics shutdown failed:', error);\n }\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
import { n as ErrorCodes } from "./emit-RfAewcWv.js";
|
|
2
|
+
import { o as logToFile } from "./debug-BfQPD2Hg.js";
|
|
3
|
+
import { ct as getLocalDev, n as analytics, ot as POSTHOG_LOCAL_URL, st as checkLocalServices } from "./analytics-D21z3E5l.js";
|
|
4
|
+
import { a as PostHogDestination, c as buildSession, d as SessionStore, et as getAuditChecks, i as createWizardRunSync, o as createFileDestination, r as TaskStreamPush, t as apiKeyCredentials, u as runProgram } from "./programs-SeT1qNik.js";
|
|
5
|
+
import { t as classifyRunFailure } from "./errors-CHrJzAZb.js";
|
|
6
|
+
import { n as printAbortOutro, t as consoleLog } from "./console-log-O828zyiq.js";
|
|
7
|
+
import { m as runCleanups } from "./agent-interface-CemBvTAA.js";
|
|
8
|
+
import { b as loadWizardFlags } from "./posthog-integration-bwHwE87a.js";
|
|
9
|
+
import { t as modeLabel } from "./mode-label-DB3ol_sj.js";
|
|
10
|
+
import { n as startHostExit, r as wizardAbort, t as registerShutdown } from "./wizard-abort-D3-75KyV.js";
|
|
11
|
+
import { join } from "node:path";
|
|
12
|
+
import "node:fs";
|
|
13
|
+
//#region src/shared/ci-gateway.ts
|
|
14
|
+
/** The pre-issued gateway token a dev or test `--ci` run uses, read once and then cleared from the environment. */
|
|
15
|
+
function readCiGatewayCredential(region) {
|
|
16
|
+
throw new Error("CI gateway auth requires a non-production build");
|
|
17
|
+
}
|
|
18
|
+
//#endregion
|
|
19
|
+
//#region src/headless/renderers/progress-log.ts
|
|
20
|
+
function logProgress(log) {
|
|
21
|
+
let spinner;
|
|
22
|
+
return ({ event }) => {
|
|
23
|
+
switch (event.kind) {
|
|
24
|
+
case "lifecycle":
|
|
25
|
+
if (event.phase === "completed") log.outro(event.message);
|
|
26
|
+
return;
|
|
27
|
+
case "spinner":
|
|
28
|
+
(spinner ??= log.spinner())[event.action](event.message);
|
|
29
|
+
return;
|
|
30
|
+
case "log":
|
|
31
|
+
log.log[event.level](event.message);
|
|
32
|
+
return;
|
|
33
|
+
case "status":
|
|
34
|
+
log.pushStatus(event.message);
|
|
35
|
+
return;
|
|
36
|
+
case "tasks":
|
|
37
|
+
log.syncTodos(event.tasks);
|
|
38
|
+
return;
|
|
39
|
+
case "authError":
|
|
40
|
+
log.showAuthError(event.detail);
|
|
41
|
+
return;
|
|
42
|
+
case "stage":
|
|
43
|
+
case "url":
|
|
44
|
+
case "usage":
|
|
45
|
+
case "finalCost":
|
|
46
|
+
case "handoff":
|
|
47
|
+
case "completion":
|
|
48
|
+
case "binding": return;
|
|
49
|
+
case "activity": return;
|
|
50
|
+
default: throw new Error(`Unhandled agent progress: ${JSON.stringify(event)}`);
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
//#endregion
|
|
55
|
+
//#region src/headless/renderers/logging-ui.ts
|
|
56
|
+
/**
|
|
57
|
+
* LoggingUI — Logging-only implementation for CI mode.
|
|
58
|
+
* No prompts, no TUI, no interactivity. Just console output.
|
|
59
|
+
*/
|
|
60
|
+
var LoggingUI = class {
|
|
61
|
+
intro = (message) => consoleLog.intro(message);
|
|
62
|
+
outro = (message) => consoleLog.outro(message);
|
|
63
|
+
log = consoleLog.log;
|
|
64
|
+
spinner() {
|
|
65
|
+
return {
|
|
66
|
+
start(message) {
|
|
67
|
+
if (message) console.log(`◌ ${message}`);
|
|
68
|
+
},
|
|
69
|
+
stop(message) {
|
|
70
|
+
if (message) console.log(`● ${message}`);
|
|
71
|
+
},
|
|
72
|
+
message(msg) {
|
|
73
|
+
if (msg) console.log(`◌ ${msg}`);
|
|
74
|
+
}
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
pushStatus(message) {
|
|
78
|
+
console.log(`◇ ${message}`);
|
|
79
|
+
}
|
|
80
|
+
showAuthError(detail) {
|
|
81
|
+
console.log(`✖ Authentication failed (401)`);
|
|
82
|
+
if (detail?.hasSettingsConflict) {
|
|
83
|
+
console.log(`│ Claude Code auth is conflicting with the wizard. Please try again after logging out:`);
|
|
84
|
+
console.log(`│ claude auth logout`);
|
|
85
|
+
} else {
|
|
86
|
+
console.log(`│ The PostHog LLM Gateway rejected the API key. Common causes:`);
|
|
87
|
+
console.log(`│ - Wrong key type: pass a personal API key (phx_xxx). pha_ is an OAuth access token, phc_ is a project key.`);
|
|
88
|
+
console.log(`│ - Missing scope: the personal API key needs the "llm_gateway:read" scope.`);
|
|
89
|
+
console.log(`│ - Expired or revoked key.`);
|
|
90
|
+
console.log(`│ - Region mismatch: --region must match the region the key was issued in (us vs eu).`);
|
|
91
|
+
}
|
|
92
|
+
if (detail?.logFilePath) console.log(`│ Verbose log: ${detail.logFilePath}`);
|
|
93
|
+
}
|
|
94
|
+
lastTodoLine = "";
|
|
95
|
+
syncTodos(todos) {
|
|
96
|
+
const completed = todos.filter((t) => t.status === "completed").length;
|
|
97
|
+
const active = todos.filter((t) => t.status === "in_progress");
|
|
98
|
+
if (active.length === 0) return;
|
|
99
|
+
const labels = active.map((t) => t.activeForm || t.content).join(" · ");
|
|
100
|
+
const line = `◌ [${completed}/${todos.length}] ${labels}`;
|
|
101
|
+
if (line === this.lastTodoLine) return;
|
|
102
|
+
this.lastTodoLine = line;
|
|
103
|
+
console.log(line);
|
|
104
|
+
}
|
|
105
|
+
};
|
|
106
|
+
//#endregion
|
|
107
|
+
//#region src/headless/run.ts
|
|
108
|
+
/**
|
|
109
|
+
* The headless host: one program run with no screens. It builds its own
|
|
110
|
+
* session store, prints progress as log lines, streams the run's state, and
|
|
111
|
+
* calls `runProgram`. The CLI builds the launch values and owns the signals.
|
|
112
|
+
*/
|
|
113
|
+
/** Run `config` headlessly. Resolves with the exit code: 0, a failure's through `wizardAbort`, or 130 or 143 on a signal. */
|
|
114
|
+
function runHeadless(config, launch) {
|
|
115
|
+
const exit = startHostExit();
|
|
116
|
+
main(config, launch, exit).catch((error) => exit.fail(error));
|
|
117
|
+
return exit.exited;
|
|
118
|
+
}
|
|
119
|
+
async function main(config, launch, exit) {
|
|
120
|
+
const log = new LoggingUI();
|
|
121
|
+
const abortHost = {
|
|
122
|
+
present: printAbortOutro,
|
|
123
|
+
exit
|
|
124
|
+
};
|
|
125
|
+
analytics.setTag("build", launch.mode);
|
|
126
|
+
const store = new SessionStore(buildSession({
|
|
127
|
+
...launch.session,
|
|
128
|
+
ci: true
|
|
129
|
+
}));
|
|
130
|
+
if (config.skillId) store.update({ skillId: config.skillId });
|
|
131
|
+
const { session } = store;
|
|
132
|
+
log.intro("Welcome to the PostHog setup wizard");
|
|
133
|
+
log.log.info(`Running ${config.id} in ${modeLabel(launch.mode)} mode`);
|
|
134
|
+
const localServicesError = await checkLocalServices({
|
|
135
|
+
...getLocalDev(),
|
|
136
|
+
localMcp: session.localMcp,
|
|
137
|
+
localPosthog: session.baseUrl === POSTHOG_LOCAL_URL
|
|
138
|
+
});
|
|
139
|
+
if (localServicesError) {
|
|
140
|
+
await wizardAbort(abortHost, {
|
|
141
|
+
code: ErrorCodes.EnvLocalServicesDown,
|
|
142
|
+
message: localServicesError
|
|
143
|
+
});
|
|
144
|
+
return;
|
|
145
|
+
}
|
|
146
|
+
const fileDestination = createFileDestination(launch.mode === "ci" ? launch.taskStreamLog ?? "" : launch.taskStreamLog);
|
|
147
|
+
const posthogDestination = launch.mode === "headless" && !session.noTelemetry ? new PostHogDestination({
|
|
148
|
+
getCredentials: () => store.session.credentials,
|
|
149
|
+
onError: (e) => logToFile("[headless task-stream]", e.message)
|
|
150
|
+
}) : null;
|
|
151
|
+
const destinations = [...posthogDestination ? [posthogDestination] : [], ...fileDestination ? [fileDestination] : []];
|
|
152
|
+
const taskStream = new TaskStreamPush({
|
|
153
|
+
store,
|
|
154
|
+
getFlags: () => analytics.getCachedWizardFlags(),
|
|
155
|
+
programId: config.streamWorkflowId ?? config.id,
|
|
156
|
+
runSync: createWizardRunSync({
|
|
157
|
+
mode: launch.mode,
|
|
158
|
+
programId: config.id,
|
|
159
|
+
assignedId: launch.runId,
|
|
160
|
+
noTelemetry: session.noTelemetry,
|
|
161
|
+
getSession: () => store.session
|
|
162
|
+
}),
|
|
163
|
+
destinations,
|
|
164
|
+
eventPlanPath: config.eventPlanFile ? join(session.installDir, config.eventPlanFile) : void 0,
|
|
165
|
+
auditChecks: config.auditLedgerFile ? () => getAuditChecks(store.session) : void 0,
|
|
166
|
+
enabled: destinations.length > 0
|
|
167
|
+
});
|
|
168
|
+
taskStream.attach();
|
|
169
|
+
if (fileDestination) logToFile(`[task-stream] ${launch.mode} dump: ${fileDestination.path}`);
|
|
170
|
+
const settleStream = async (outcome) => {
|
|
171
|
+
if (outcome !== "completed") store.setRunPhase("error");
|
|
172
|
+
await taskStream.shutdown(2e3, outcome);
|
|
173
|
+
unregisterShutdown();
|
|
174
|
+
};
|
|
175
|
+
const unregisterShutdown = registerShutdown((outcome) => settleStream(outcome));
|
|
176
|
+
const runAbort = new AbortController();
|
|
177
|
+
const onSignal = () => {
|
|
178
|
+
runAbort.abort();
|
|
179
|
+
runCleanups();
|
|
180
|
+
settleStream("cancelled").then(() => wizardAbort(abortHost, { exitCode: launch.signal.reason === "SIGTERM" ? 143 : 130 }));
|
|
181
|
+
};
|
|
182
|
+
if (launch.signal.aborted) return onSignal();
|
|
183
|
+
launch.signal.addEventListener("abort", onSignal, { once: true });
|
|
184
|
+
const credentials = apiKeyCredentials(session.apiKey ?? "", {
|
|
185
|
+
region: session.region,
|
|
186
|
+
baseUrl: session.baseUrl,
|
|
187
|
+
localMcp: session.localMcp,
|
|
188
|
+
projectId: session.projectId,
|
|
189
|
+
onInfo: (message) => log.log.info(message),
|
|
190
|
+
onWarning: (message) => log.log.warn(message)
|
|
191
|
+
});
|
|
192
|
+
try {
|
|
193
|
+
if (launch.mode === "ci") store.update({ ciGateway: readCiGatewayCredential(session.region ?? "us") });
|
|
194
|
+
const result = await runProgram(config.id, {
|
|
195
|
+
store,
|
|
196
|
+
config
|
|
197
|
+
}, {
|
|
198
|
+
credentials,
|
|
199
|
+
onProgress: logProgress(log),
|
|
200
|
+
featureFlags: loadWizardFlags,
|
|
201
|
+
signal: runAbort.signal
|
|
202
|
+
});
|
|
203
|
+
if (runAbort.signal.aborted) return;
|
|
204
|
+
if (result.outcome === "crashed") throw result.failure?.error;
|
|
205
|
+
if (result.outcome !== "success") {
|
|
206
|
+
if (result.failure?.authErrorDetail) log.showAuthError(result.failure.authErrorDetail);
|
|
207
|
+
await wizardAbort(abortHost, {
|
|
208
|
+
...result.failure,
|
|
209
|
+
status: result.outcome === "aborted" ? "cancelled" : "error"
|
|
210
|
+
});
|
|
211
|
+
return;
|
|
212
|
+
}
|
|
213
|
+
try {
|
|
214
|
+
await analytics.shutdown("success");
|
|
215
|
+
} catch (error) {
|
|
216
|
+
logToFile("[agent-runner] analytics shutdown failed:", error);
|
|
217
|
+
}
|
|
218
|
+
await settleStream("completed");
|
|
219
|
+
launch.signal.removeEventListener("abort", onSignal);
|
|
220
|
+
exit.end(0);
|
|
221
|
+
} catch (error) {
|
|
222
|
+
if (runAbort.signal.aborted) return;
|
|
223
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
224
|
+
const errorStack = error instanceof Error && error.stack ? error.stack : void 0;
|
|
225
|
+
logToFile(`[${launch.mode}] ERROR: ${errorMessage}`);
|
|
226
|
+
if (errorStack) logToFile(`[${launch.mode}] STACK: ${errorStack}`);
|
|
227
|
+
const debugInfo = store.session.debug && errorStack ? `\n\n${errorStack}` : "";
|
|
228
|
+
const docsUrl = store.session.frameworkConfig?.metadata.docsUrl ?? (typeof config.run === "object" ? config.run.docsUrl : void 0) ?? "https://posthog.com/docs";
|
|
229
|
+
const failure = classifyRunFailure(error);
|
|
230
|
+
store.setOutroData({
|
|
231
|
+
kind: "error",
|
|
232
|
+
message: errorMessage,
|
|
233
|
+
errorCode: failure.code
|
|
234
|
+
});
|
|
235
|
+
store.setRunPhase("error");
|
|
236
|
+
await wizardAbort(abortHost, {
|
|
237
|
+
code: failure.code,
|
|
238
|
+
message: failure.coded ? `${errorMessage}${debugInfo}` : `Something went wrong: ${errorMessage}\n\nYou can read the documentation at ${docsUrl} to set up manually.${debugInfo}`,
|
|
239
|
+
error
|
|
240
|
+
});
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
//#endregion
|
|
244
|
+
export { runHeadless };
|
|
245
|
+
|
|
246
|
+
//# sourceMappingURL=run-DDCvLILJ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-DDCvLILJ.js","names":[],"sources":["../src/shared/ci-gateway.ts","../src/headless/renderers/progress-log.ts","../src/headless/renderers/logging-ui.ts","../src/headless/run.ts"],"sourcesContent":["import { readFileSync } from 'node:fs';\nimport { IS_PRODUCTION_BUILD, runtimeEnv } from '@env';\nimport type { GatewayCredential } from '@shared/api';\nimport type { CloudRegion } from '@utils/types';\n\n/** The pre-issued gateway token a dev or test `--ci` run uses, read once and then cleared from the environment. */\nexport function readCiGatewayCredential(\n region: CloudRegion,\n): GatewayCredential {\n if (IS_PRODUCTION_BUILD)\n throw new Error('CI gateway auth requires a non-production build');\n const path = runtimeEnv('WIZARD_CI_GATEWAY_TOKEN_FILE');\n if (!path) throw new Error('WIZARD_CI_GATEWAY_TOKEN_FILE is required for CI');\n const token = readFileSync(path, 'utf8');\n delete process.env.WIZARD_CI_GATEWAY_TOKEN_FILE;\n return {\n token,\n url:\n runtimeEnv('WIZARD_CI_GATEWAY_URL') ||\n `https://ai-gateway.${region}.posthog.com`,\n };\n}\n","/** A run's progress as log lines: one `LoggingUI` call per event that has something to print. */\nimport type { SpinnerHandle } from '@agent/types';\nimport type { ProgramProgress } from '@programs/types';\nimport type { LoggingUI } from './logging-ui';\n\nexport function logProgress(\n log: LoggingUI,\n): (progress: ProgramProgress) => void {\n let spinner: SpinnerHandle | undefined;\n return ({ event }) => {\n switch (event.kind) {\n case 'lifecycle':\n if (event.phase === 'completed') log.outro(event.message);\n return;\n case 'spinner': {\n const handle = (spinner ??= log.spinner());\n handle[event.action](event.message);\n return;\n }\n case 'log':\n log.log[event.level](event.message);\n return;\n case 'status':\n log.pushStatus(event.message);\n return;\n case 'tasks':\n log.syncTodos(event.tasks);\n return;\n case 'authError':\n log.showAuthError(event.detail);\n return;\n case 'stage':\n case 'url':\n case 'usage':\n case 'finalCost':\n case 'handoff':\n case 'completion':\n case 'binding':\n return;\n case 'activity':\n // Step lines belong to the caller that asked for them, not the run UI.\n return;\n default: {\n const unhandled: never = event;\n throw new Error(\n `Unhandled agent progress: ${JSON.stringify(unhandled)}`,\n );\n }\n }\n };\n}\n","/* eslint-disable no-console */\n/**\n * LoggingUI — Logging-only implementation for CI mode.\n * No prompts, no TUI, no interactivity. Just console output.\n */\n\nimport { consoleLog } from '@shared/console-log';\nimport { TaskStatus } from '@shared/task-status';\nimport type { AuthErrorDetail, SpinnerHandle } from '@agent/types';\n\nexport class LoggingUI {\n intro = (message: string): void => consoleLog.intro(message);\n outro = (message: string): void => consoleLog.outro(message);\n log = consoleLog.log;\n\n spinner(): SpinnerHandle {\n return {\n start(message?: string) {\n if (message) console.log(`◌ ${message}`);\n },\n stop(message?: string) {\n if (message) console.log(`● ${message}`);\n },\n message(msg?: string) {\n if (msg) console.log(`◌ ${msg}`);\n },\n };\n }\n\n pushStatus(message: string): void {\n console.log(`◇ ${message}`);\n }\n\n showAuthError(detail?: AuthErrorDetail): void {\n console.log(`✖ Authentication failed (401)`);\n if (detail?.hasSettingsConflict) {\n console.log(\n `│ Claude Code auth is conflicting with the wizard. Please try again after logging out:`,\n );\n console.log(`│ claude auth logout`);\n } else {\n console.log(\n `│ The PostHog LLM Gateway rejected the API key. Common causes:`,\n );\n console.log(\n `│ - Wrong key type: pass a personal API key (phx_xxx). pha_ is an OAuth access token, phc_ is a project key.`,\n );\n console.log(\n `│ - Missing scope: the personal API key needs the \"llm_gateway:read\" scope.`,\n );\n console.log(`│ - Expired or revoked key.`);\n console.log(\n `│ - Region mismatch: --region must match the region the key was issued in (us vs eu).`,\n );\n }\n if (detail?.logFilePath) {\n console.log(`│ Verbose log: ${detail.logFilePath}`);\n }\n }\n\n private lastTodoLine = '';\n\n syncTodos(\n todos: Array<{\n id?: string;\n source?: string;\n content: string;\n status: string;\n activeForm?: string;\n }>,\n ): void {\n const completed = todos.filter(\n (t) => t.status === TaskStatus.Completed,\n ).length;\n const active = todos.filter((t) => t.status === TaskStatus.InProgress);\n if (active.length === 0) return;\n const labels = active.map((t) => t.activeForm || t.content).join(' · ');\n const line = `◌ [${completed}/${todos.length}] ${labels}`;\n // The queue re-renders on every transition; print only what changed.\n if (line === this.lastTodoLine) return;\n this.lastTodoLine = line;\n console.log(line);\n }\n}\n","/**\n * The headless host: one program run with no screens. It builds its own\n * session store, prints progress as log lines, streams the run's state, and\n * calls `runProgram`. The CLI builds the launch values and owns the signals.\n */\nimport { join } from 'node:path';\nimport {\n apiKeyCredentials,\n buildSession,\n createFileDestination,\n createWizardRunSync,\n getAuditChecks,\n loadWizardFlags,\n PostHogDestination,\n RunOutcome,\n runProgram,\n SessionStore,\n TaskStreamPush,\n} from '@programs';\nimport type {\n ProgramConfig,\n SessionArgs,\n TaskStreamOutcome,\n} from '@programs/types';\nimport { readCiGatewayCredential } from '@shared/ci-gateway';\nimport { ErrorCodes, classifyRunFailure } from '@shared/errors';\nimport {\n checkLocalServices,\n getLocalDev,\n POSTHOG_LOCAL_URL,\n} from '@shared/local-dev';\nimport { OutroKind } from '@shared/outro';\nimport { RunPhase } from '@shared/run-state';\nimport { POSTHOG_DOCS_URL } from '@shared/constants';\nimport { analytics } from '@utils/analytics';\nimport { runCleanups } from '@utils/cleanup';\nimport { logToFile } from '@utils/debug';\nimport { printAbortOutro } from '@shared/console-log';\nimport {\n registerShutdown,\n startHostExit,\n wizardAbort,\n type HostExit,\n} from '@host/wizard-abort';\nimport { modeLabel } from './mode-label';\nimport { logProgress } from './renderers/progress-log';\nimport { LoggingUI } from './renderers/logging-ui';\n\n/**\n * The two non-interactive run modes. Both drive the same pipeline today; the\n * mode is threaded explicitly (rather than sniffed from a flag) so the dispatch\n * picks an entry point — runWizardCI vs runWizardHeadless — and this core stays\n * mode-agnostic except at the few documented forks. The string values double as\n * the analytics `build` tag, so they segment runs in analytics and on\n * LLM-gateway traces (which read analytics.build).\n */\nexport type NonInteractiveMode = 'ci' | 'headless';\n\nexport type HeadlessLaunch = {\n mode: NonInteractiveMode;\n session: SessionArgs; // launch values, flags already merged over the environment\n taskStreamLog?: string; // --task-stream-log: a path, or '' for the default one\n runId?: string; // the cloud WizardRun this run reports under\n signal: AbortSignal; // the CLI aborts it on SIGINT or SIGTERM, with the signal name as the reason\n};\n\n/** Run `config` headlessly. Resolves with the exit code: 0, a failure's through `wizardAbort`, or 130 or 143 on a signal. */\nexport function runHeadless(\n config: ProgramConfig,\n launch: HeadlessLaunch,\n): Promise<number> {\n const exit = startHostExit();\n void main(config, launch, exit).catch((error: unknown) => exit.fail(error));\n return exit.exited;\n}\n\nasync function main(\n config: ProgramConfig,\n launch: HeadlessLaunch,\n exit: HostExit,\n): Promise<void> {\n const log = new LoggingUI();\n const abortHost = { present: printAbortOutro, exit };\n analytics.setTag('build', launch.mode);\n\n const store = new SessionStore(buildSession({ ...launch.session, ci: true }));\n if (config.skillId) store.update({ skillId: config.skillId });\n const { session } = store;\n\n log.intro('Welcome to the PostHog setup wizard');\n log.log.info(`Running ${config.id} in ${modeLabel(launch.mode)} mode`);\n\n // Before auth: a dead local PostHog otherwise surfaces as \"Failed to fetch\n // user data\". Aborts even non-interactively — a CI run pointed at a local\n // server that isn't there is testing nothing.\n const localServicesError = await checkLocalServices({\n ...getLocalDev(),\n localMcp: session.localMcp,\n localPosthog: session.baseUrl === POSTHOG_LOCAL_URL,\n });\n if (localServicesError) {\n await wizardAbort(abortHost, {\n code: ErrorCodes.EnvLocalServicesDown,\n message: localServicesError,\n });\n return;\n }\n\n // Headless streams run state to the PostHog backend so the web app can show\n // live progress. Headless pushes to PostHog (the web app is that run's only\n // UI); `--ci` is synthetic, so it dumps locally and pushes nothing. Telemetry\n // consent gates the push only.\n // `''` resolves to the default path, so `--ci` always dumps.\n const logTarget =\n launch.mode === 'ci' ? launch.taskStreamLog ?? '' : launch.taskStreamLog;\n const fileDestination = createFileDestination(logTarget);\n const posthogDestination =\n launch.mode === 'headless' && !session.noTelemetry\n ? new PostHogDestination({\n getCredentials: () => store.session.credentials,\n onError: (e) => logToFile('[headless task-stream]', e.message),\n })\n : null;\n const destinations = [\n ...(posthogDestination ? [posthogDestination] : []),\n ...(fileDestination ? [fileDestination] : []),\n ];\n const taskStream = new TaskStreamPush({\n store,\n getFlags: () => analytics.getCachedWizardFlags(),\n programId: config.streamWorkflowId ?? config.id,\n runSync: createWizardRunSync({\n mode: launch.mode,\n programId: config.id,\n assignedId: launch.runId,\n noTelemetry: session.noTelemetry,\n getSession: () => store.session,\n }),\n destinations,\n eventPlanPath: config.eventPlanFile\n ? join(session.installDir, config.eventPlanFile)\n : undefined,\n auditChecks: config.auditLedgerFile\n ? () => getAuditChecks(store.session)\n : undefined,\n enabled: destinations.length > 0,\n });\n taskStream.attach();\n if (fileDestination) {\n logToFile(`[task-stream] ${launch.mode} dump: ${fileDestination.path}`);\n }\n\n // wizardAbort ends the run, so flush the terminal phase before any exit.\n // No-op for CI.\n const settleStream = async (outcome: TaskStreamOutcome): Promise<void> => {\n if (outcome !== 'completed') store.setRunPhase(RunPhase.Error);\n await taskStream.shutdown(2000, outcome);\n unregisterShutdown();\n };\n const unregisterShutdown = registerShutdown((outcome) =>\n settleStream(outcome),\n );\n\n // A signal cancels the run and any pending question, then ends it 130 or 143.\n const runAbort = new AbortController();\n const onSignal = (): void => {\n runAbort.abort();\n runCleanups();\n void settleStream('cancelled').then(() =>\n wizardAbort(abortHost, {\n exitCode: launch.signal.reason === 'SIGTERM' ? 143 : 130,\n }),\n );\n };\n if (launch.signal.aborted) return onSignal();\n launch.signal.addEventListener('abort', onSignal, { once: true });\n\n const credentials = apiKeyCredentials(session.apiKey ?? '', {\n region: session.region,\n baseUrl: session.baseUrl,\n localMcp: session.localMcp,\n projectId: session.projectId,\n onInfo: (message) => log.log.info(message),\n onWarning: (message) => log.log.warn(message),\n });\n\n try {\n if (launch.mode === 'ci') {\n store.update({\n ciGateway: readCiGatewayCredential(session.region ?? 'us'),\n });\n }\n\n const result = await runProgram(\n config.id,\n { store, config },\n {\n credentials,\n onProgress: logProgress(log),\n featureFlags: loadWizardFlags,\n signal: runAbort.signal,\n },\n );\n // A signal cancelled the run; its handler settles and ends it.\n if (runAbort.signal.aborted) return;\n\n if (result.outcome === RunOutcome.Crashed) throw result.failure?.error;\n if (result.outcome !== RunOutcome.Success) {\n if (result.failure?.authErrorDetail) {\n log.showAuthError(result.failure.authErrorDetail);\n }\n // The store already holds the error outro, so the stream's last push carries its code.\n await wizardAbort(abortHost, {\n ...result.failure,\n status: result.outcome === RunOutcome.Aborted ? 'cancelled' : 'error',\n });\n return;\n }\n try {\n await analytics.shutdown('success');\n } catch (error) {\n logToFile('[agent-runner] analytics shutdown failed:', error);\n }\n await settleStream('completed');\n launch.signal.removeEventListener('abort', onSignal);\n exit.end(0);\n } catch (error) {\n if (runAbort.signal.aborted) return;\n const errorMessage = error instanceof Error ? error.message : String(error);\n const errorStack =\n error instanceof Error && error.stack ? error.stack : undefined;\n logToFile(`[${launch.mode}] ERROR: ${errorMessage}`);\n if (errorStack) logToFile(`[${launch.mode}] STACK: ${errorStack}`);\n\n const debugInfo =\n store.session.debug && errorStack ? `\\n\\n${errorStack}` : '';\n const docsUrl =\n store.session.frameworkConfig?.metadata.docsUrl ??\n (typeof config.run === 'object' ? config.run.docsUrl : undefined) ??\n POSTHOG_DOCS_URL;\n // A coded failure is a decision with its own message; anything else is\n // unexpected and gets the generic framing.\n const failure = classifyRunFailure(error);\n store.setOutroData({\n kind: OutroKind.Error,\n message: errorMessage,\n errorCode: failure.code,\n });\n store.setRunPhase(RunPhase.Error);\n await wizardAbort(abortHost, {\n code: failure.code,\n message: failure.coded\n ? `${errorMessage}${debugInfo}`\n : `Something went wrong: ${errorMessage}\\n\\nYou can read the documentation at ${docsUrl} to set up manually.${debugInfo}`,\n error: error as Error,\n });\n }\n}\n"],"mappings":"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"}
|