@posthog/wizard 2.83.0 → 2.84.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 (145) hide show
  1. package/README.md +1 -29
  2. package/dist/{PickerMenu-BGGeYqd-.js → PickerMenu-BtheKi1o.js} +1 -1
  3. package/dist/{PickerMenu-BGGeYqd-.js.map → PickerMenu-BtheKi1o.js.map} +1 -1
  4. package/dist/_dev-only-stub-B0db0Klc.js +1 -0
  5. package/dist/{agent-interface-fcDXqb-_.js → agent-interface-BNssNetq.js} +12 -12
  6. package/dist/agent-interface-BNssNetq.js.map +1 -0
  7. package/dist/{agent-prompt-loader-F9gGPMt0.js → agent-prompt-loader-iV11XVEF.js} +16 -8
  8. package/dist/agent-prompt-loader-iV11XVEF.js.map +1 -0
  9. package/dist/{analytics-GQv--mQm.js → analytics-Drox5LSW.js} +6 -5
  10. package/dist/analytics-Drox5LSW.js.map +1 -0
  11. package/dist/analytics-Ix9HEra3.js +2 -0
  12. package/dist/{api-WUOSLXPJ.js → api-Dfu655Qt.js} +2 -2
  13. package/dist/{api-WUOSLXPJ.js.map → api-Dfu655Qt.js.map} +1 -1
  14. package/dist/api-H2UaPgjv.js +2 -0
  15. package/dist/{api-key-login-tysMeZnR.js → api-key-login-BgwfAXfv.js} +5 -5
  16. package/dist/{api-key-login-tysMeZnR.js.map → api-key-login-BgwfAXfv.js.map} +1 -1
  17. package/dist/api-key-login-Cow3UDAN.js +2 -0
  18. package/dist/bin.js +1 -1
  19. package/dist/{bounded-fs-B31zq2ir.js → bounded-fs-TRL6IsoU.js} +32 -16
  20. package/dist/bounded-fs-TRL6IsoU.js.map +1 -0
  21. package/dist/{ci-install-CYSFbFXd.js → ci-install-nc1IKuX2.js} +6 -6
  22. package/dist/{ci-install-CYSFbFXd.js.map → ci-install-nc1IKuX2.js.map} +1 -1
  23. package/dist/{console-log-DJiTqYT2.js → console-log-BMhBoX-o.js} +2 -2
  24. package/dist/{console-log-DJiTqYT2.js.map → console-log-BMhBoX-o.js.map} +1 -1
  25. package/dist/{debug-BTUMatFI.js → debug-BfO_Txo8.js} +3 -3
  26. package/dist/debug-BfO_Txo8.js.map +1 -0
  27. package/dist/{defaults-DDVl3tKN.js → defaults-BWLIffh5.js} +1 -1
  28. package/dist/{defaults-DDVl3tKN.js.map → defaults-BWLIffh5.js.map} +1 -1
  29. package/dist/{errors-DhFeR8Sp.js → errors-BXlWujEw.js} +1 -1
  30. package/dist/{errors-DhFeR8Sp.js.map → errors-BXlWujEw.js.map} +1 -1
  31. package/dist/{family-picker-BKs-tTyu.js → family-picker-CAW_VtYf.js} +2 -2
  32. package/dist/{family-picker-BKs-tTyu.js.map → family-picker-CAW_VtYf.js.map} +1 -1
  33. package/dist/{gateway-CJ8Jqbll.js → gateway-CLQQb96F.js} +25 -9
  34. package/dist/{gateway-CJ8Jqbll.js.map → gateway-CLQQb96F.js.map} +1 -1
  35. package/dist/headless-CHGNEzO3.js +3 -0
  36. package/dist/{headless-le-QqOuj.js → headless-DMO8N_FD.js} +2 -2
  37. package/dist/{headless-le-QqOuj.js.map → headless-DMO8N_FD.js.map} +1 -1
  38. package/dist/{host-resolution-Cht8bL39.js → host-resolution-DftfSjJD.js} +4 -4
  39. package/dist/{host-resolution-Cht8bL39.js.map → host-resolution-DftfSjJD.js.map} +1 -1
  40. package/dist/{install-BhnFP3p3.js → install-C9FPM37m.js} +6 -6
  41. package/dist/{install-BhnFP3p3.js.map → install-C9FPM37m.js.map} +1 -1
  42. package/dist/{install-55JbRsO-.js → install-MWoo1hXL.js} +1 -1
  43. package/dist/{interactive-9qRL8259.js → interactive-DOnolJHB.js} +3 -3
  44. package/dist/{interactive-9qRL8259.js.map → interactive-DOnolJHB.js.map} +1 -1
  45. package/dist/{links-5Blqk4Im.js → links-CatXPRxH.js} +3 -3
  46. package/dist/{links-5Blqk4Im.js.map → links-CatXPRxH.js.map} +1 -1
  47. package/dist/{main-CUIcozEG.js → main-CINmZtoW.js} +23 -23
  48. package/dist/{main-CUIcozEG.js.map → main-CINmZtoW.js.map} +1 -1
  49. package/dist/{mcp-D73aCOHK.js → mcp-KVV6Z_bq.js} +3 -3
  50. package/dist/{mcp-D73aCOHK.js.map → mcp-KVV6Z_bq.js.map} +1 -1
  51. package/dist/{mcp-prompt-streaming-B5lIQ0l1.js → mcp-prompt-streaming-M6UnLgGX.js} +5 -5
  52. package/dist/{mcp-prompt-streaming-B5lIQ0l1.js.map → mcp-prompt-streaming-M6UnLgGX.js.map} +1 -1
  53. package/dist/{mode-label-DB3ol_sj.js → mode-label--bJuXny5.js} +1 -1
  54. package/dist/{mode-label-DB3ol_sj.js.map → mode-label--bJuXny5.js.map} +1 -1
  55. package/dist/{models-CLTglHFZ.js → models-B0huHItG.js} +2 -2
  56. package/dist/{models-CLTglHFZ.js.map → models-B0huHItG.js.map} +1 -1
  57. package/dist/{non-interactive-DkldwWDM.js → non-interactive-DiEu4_6l.js} +3 -3
  58. package/dist/{non-interactive-DkldwWDM.js.map → non-interactive-DiEu4_6l.js.map} +1 -1
  59. package/dist/{oauth-session-CfkZ339p.js → oauth-session-9EU3ky0v.js} +2 -2
  60. package/dist/{oauth-session-CfkZ339p.js.map → oauth-session-9EU3ky0v.js.map} +1 -1
  61. package/dist/{orchestrator-tools-lvNVQhzs.js → orchestrator-tools-QWyDLu_7.js} +3 -3
  62. package/dist/{orchestrator-tools-lvNVQhzs.js.map → orchestrator-tools-QWyDLu_7.js.map} +1 -1
  63. package/dist/package-json-BAtJRHSq.js +2 -0
  64. package/dist/{package-json-2UrhE6kP.js → package-json-z1agAYXs.js} +1 -1
  65. package/dist/{package-json-2UrhE6kP.js.map → package-json-z1agAYXs.js.map} +1 -1
  66. package/dist/{package-manager-BqRNp5y_.js → package-manager-B-9I_fAT.js} +4 -4
  67. package/dist/{package-manager-BqRNp5y_.js.map → package-manager-B-9I_fAT.js.map} +1 -1
  68. package/dist/{pi-2pYz2OY3.js → pi-BSnSk6rv.js} +19 -20
  69. package/dist/pi-BSnSk6rv.js.map +1 -0
  70. package/dist/{playground-jxZNxRwC.js → playground-Drz1qszs.js} +4 -4
  71. package/dist/{playground-jxZNxRwC.js.map → playground-Drz1qszs.js.map} +1 -1
  72. package/dist/{posthog-integration-DxRkw5DI.js → posthog-integration-mIQGBc1f.js} +882 -2512
  73. package/dist/posthog-integration-mIQGBc1f.js.map +1 -0
  74. package/dist/programs-Bv0_YHzE.js +3 -0
  75. package/dist/{programs-eTv2T2rs.js → programs-mxhRXwP-.js} +194 -88
  76. package/dist/programs-mxhRXwP-.js.map +1 -0
  77. package/dist/provisioning-BVsxSNve.js +2 -0
  78. package/dist/{provisioning-c5JJ30KX.js → provisioning-CHUjae9V.js} +4 -4
  79. package/dist/{provisioning-c5JJ30KX.js.map → provisioning-CHUjae9V.js.map} +1 -1
  80. package/dist/{queue-tools-10w8lhEs.js → queue-tools-PFG6H93Q.js} +4 -4
  81. package/dist/{queue-tools-10w8lhEs.js.map → queue-tools-PFG6H93Q.js.map} +1 -1
  82. package/dist/{results-C45prSKD.js → results-5yCKf2cI.js} +2 -2
  83. package/dist/{results-C45prSKD.js.map → results-5yCKf2cI.js.map} +1 -1
  84. package/dist/{run-jugssomh.js → run-D5TKJuSL.js} +10 -10
  85. package/dist/{run-jugssomh.js.map → run-D5TKJuSL.js.map} +1 -1
  86. package/dist/{run-CM24OgPF.js → run-W03b6jNM.js} +12 -12
  87. package/dist/{run-CM24OgPF.js.map → run-W03b6jNM.js.map} +1 -1
  88. package/dist/{run-tool-DZrZFoGq.js → run-tool-DTQF8mmI.js} +17 -17
  89. package/dist/{run-tool-DZrZFoGq.js.map → run-tool-DTQF8mmI.js.map} +1 -1
  90. package/dist/run-tool-DjERhu7G.js +2 -0
  91. package/dist/{runners-CoIYt0iI.js → runners-B_84kPyf.js} +11 -11
  92. package/dist/{runners-CoIYt0iI.js.map → runners-B_84kPyf.js.map} +1 -1
  93. package/dist/{security-ppK2MwCn.js → security-pApVawYb.js} +5 -5
  94. package/dist/{security-ppK2MwCn.js.map → security-pApVawYb.js.map} +1 -1
  95. package/dist/{setup-utils-B5E1rXLa.js → setup-utils-CQY8PHjR.js} +3 -3
  96. package/dist/{setup-utils-B5E1rXLa.js.map → setup-utils-CQY8PHjR.js.map} +1 -1
  97. package/dist/{start-playground-DujiUNFT.js → start-playground-DAw1GbLt.js} +8 -8
  98. package/dist/{start-playground-DujiUNFT.js.map → start-playground-DAw1GbLt.js.map} +1 -1
  99. package/dist/{subagent-BdDWA8j5.js → subagent-YLGSvgoZ.js} +4 -4
  100. package/dist/subagent-YLGSvgoZ.js.map +1 -0
  101. package/dist/{task-Y8lWoDE7.js → task-3hRSovmK.js} +19 -20
  102. package/dist/task-3hRSovmK.js.map +1 -0
  103. package/dist/{tasks-BfJhVky2.js → tasks-C03QbXTx.js} +1 -1
  104. package/dist/{tasks-BfJhVky2.js.map → tasks-C03QbXTx.js.map} +1 -1
  105. package/dist/{telemetry-Cwqf0iur.js → telemetry-BPBzqsb_.js} +2 -2
  106. package/dist/{telemetry-Cwqf0iur.js.map → telemetry-BPBzqsb_.js.map} +1 -1
  107. package/dist/{terminal-BLL-X6YP.js → terminal-DZsYFbm9.js} +92 -63
  108. package/dist/terminal-DZsYFbm9.js.map +1 -0
  109. package/dist/{tools-C8k90ISV.js → tools-D_AtrhbO.js} +15 -15
  110. package/dist/{tools-C8k90ISV.js.map → tools-D_AtrhbO.js.map} +1 -1
  111. package/dist/{tools-g42e5kJz.js → tools-DyzRi_dQ.js} +8 -8
  112. package/dist/{tools-g42e5kJz.js.map → tools-DyzRi_dQ.js.map} +1 -1
  113. package/dist/{tui-CBnRWnrm.js → tui-CRp0iCuT.js} +5 -5
  114. package/dist/{tui-CBnRWnrm.js.map → tui-CRp0iCuT.js.map} +1 -1
  115. package/dist/{tui-BPWJ-J-k.js → tui-UI6ctBQJ.js} +1 -1
  116. package/dist/{upload-step-CFoxwd5t.js → upload-step-DrYXnpzI.js} +3 -3
  117. package/dist/{upload-step-CFoxwd5t.js.map → upload-step-DrYXnpzI.js.map} +1 -1
  118. package/dist/{urls-BTZhm5eA.js → urls-WeqfBLP4.js} +2 -2
  119. package/dist/{urls-BTZhm5eA.js.map → urls-WeqfBLP4.js.map} +1 -1
  120. package/dist/{wizard-abort-HtpiSsQO.js → wizard-abort-BwEefm6P.js} +5 -5
  121. package/dist/{wizard-abort-HtpiSsQO.js.map → wizard-abort-BwEefm6P.js.map} +1 -1
  122. package/dist/yara-hooks-MDtFbuoM.js +2 -0
  123. package/dist/{yara-hooks-BPYhN9WM.js → yara-hooks-aDbdsitJ.js} +41 -5
  124. package/dist/{yara-hooks-BPYhN9WM.js.map → yara-hooks-aDbdsitJ.js.map} +1 -1
  125. package/package.json +9 -7
  126. package/dist/agent-interface-fcDXqb-_.js.map +0 -1
  127. package/dist/agent-prompt-loader-F9gGPMt0.js.map +0 -1
  128. package/dist/analytics-C9QnGvuc.js +0 -2
  129. package/dist/analytics-GQv--mQm.js.map +0 -1
  130. package/dist/api-CsXfZKkq.js +0 -2
  131. package/dist/api-key-login-CDSxsYtP.js +0 -2
  132. package/dist/bounded-fs-B31zq2ir.js.map +0 -1
  133. package/dist/debug-BTUMatFI.js.map +0 -1
  134. package/dist/headless-DZ3mq07K.js +0 -3
  135. package/dist/package-json-Dblip2_X.js +0 -2
  136. package/dist/pi-2pYz2OY3.js.map +0 -1
  137. package/dist/posthog-integration-DxRkw5DI.js.map +0 -1
  138. package/dist/programs-D2793-PK.js +0 -3
  139. package/dist/programs-eTv2T2rs.js.map +0 -1
  140. package/dist/provisioning-CtQ0GEHa.js +0 -2
  141. package/dist/run-tool-BZFgFb_2.js +0 -2
  142. package/dist/subagent-BdDWA8j5.js.map +0 -1
  143. package/dist/task-Y8lWoDE7.js.map +0 -1
  144. package/dist/terminal-BLL-X6YP.js.map +0 -1
  145. package/dist/yara-hooks-BwhEDXIt.js +0 -2
@@ -1,5 +1,5 @@
1
- import { o as logToFile } from "./debug-BTUMatFI.js";
2
- import { a as gatewayTerminalFailure, s as AgentSignals, u as policyAbortReason } from "./gateway-CJ8Jqbll.js";
1
+ import { o as logToFile } from "./debug-BfO_Txo8.js";
2
+ import { c as AgentSignals, d as policyAbortReason, o as gatewayTerminalFailure } from "./gateway-CLQQb96F.js";
3
3
  import { Type } from "typebox";
4
4
  import { defineTool } from "@earendil-works/pi-coding-agent";
5
5
  //#region src/agent/runner/harness/pi/subagent.ts
@@ -78,7 +78,7 @@ function createDispatchAgentTool(ctx) {
78
78
  await loader.reload();
79
79
  const { session: child } = await createAgentSession({
80
80
  model: ctx.model,
81
- modelRegistry: ctx.modelRegistry,
81
+ modelRuntime: ctx.modelRuntime,
82
82
  cwd: ctx.cwd,
83
83
  sessionManager: SessionManager.inMemory(ctx.cwd),
84
84
  resourceLoader: loader,
@@ -118,4 +118,4 @@ function createDispatchAgentTool(ctx) {
118
118
  //#endregion
119
119
  export { createDispatchAgentTool };
120
120
 
121
- //# sourceMappingURL=subagent-BdDWA8j5.js.map
121
+ //# sourceMappingURL=subagent-YLGSvgoZ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subagent-YLGSvgoZ.js","names":[],"sources":["../src/agent/runner/harness/pi/subagent.ts"],"sourcesContent":["/**\n * Controlled subagent dispatch for pi (#526). pi has no native subagent\n * mechanism, so a subagent is a nested `createAgentSession` we construct — which\n * means WE decide its powers, closing the leak the claude-agent-sdk path warns\n * about (it can't propagate the parent's disallowedTools into subagents).\n *\n * Controls on every child:\n * - the parent's subagent security gate (canUseTool + YARA, fail-closed, no\n * `rm`) — shared state, so the child shares the tool-call cap and latch;\n * - a read-only built-in toolset (read/grep/find/ls) plus allowlisted bash —\n * no write/edit tools;\n * - no custom tools — no .env writes, and crucially no `dispatch_agent`, so a\n * child cannot recurse (depth is hard-capped at 1).\n */\n\nimport { Type } from 'typebox';\nimport { defineTool } from '@earendil-works/pi-coding-agent';\nimport type { ToolDefinition } from '@earendil-works/pi-coding-agent';\nimport { logToFile } from '@utils/debug';\nimport { AgentSignals, policyAbortReason } from '../../../signals';\nimport { gatewayTerminalFailure } from './gateway';\nimport type { SubagentSecurityFactory } from './security';\n\n/**\n * Read-only built-ins a subagent may use. bash is supplied separately as the\n * parent's env-scrubbed tool (below), not the built-in, so a subagent's\n * subprocesses are locked down too.\n */\nconst SUBAGENT_TOOLS = ['read', 'grep', 'find', 'ls'];\n\nconst SUBAGENT_SYSTEM_PROMPT = [\n 'You are a read-only research subagent for the PostHog wizard.',\n 'You can read and search files and run safe build/inspect shell commands.',\n 'You cannot edit files, modify .env, or dispatch further subagents.',\n 'Investigate the task you are given and report concise findings as your final message.',\n].join('\\n');\n\nfunction text(s: string): {\n content: [{ type: 'text'; text: string }];\n details: unknown;\n} {\n return { content: [{ type: 'text', text: s }], details: {} };\n}\n\nfunction extractText(message: unknown): string {\n const content = (message as { content?: unknown })?.content;\n if (typeof content === 'string') return content;\n if (Array.isArray(content)) {\n return content\n .filter((c): c is { type: string; text: string } => {\n const b = c as { type?: string; text?: unknown };\n return b?.type === 'text' && typeof b.text === 'string';\n })\n .map((c) => c.text)\n .join('');\n }\n return '';\n}\n\nexport interface SubagentContext {\n /** Resolved gateway model (same as the parent). */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n model: import('@earendil-works/pi-ai').Model<any>;\n /** Runtime holding the gateway provider. */\n modelRuntime: import('@earendil-works/pi-coding-agent').ModelRuntime;\n cwd: string;\n agentDir: string;\n /** The parent's subagent gate: the same fence and shared state, with no rm. */\n securityFactory: SubagentSecurityFactory;\n /** The parent's env-scrubbed bash, so a subagent's subprocesses are locked down too. */\n bashTool: ToolDefinition;\n /** pi SDK entrypoints, already imported by the backend. */\n sdk: {\n createAgentSession: typeof import('@earendil-works/pi-coding-agent')['createAgentSession'];\n DefaultResourceLoader: typeof import('@earendil-works/pi-coding-agent')['DefaultResourceLoader'];\n SessionManager: typeof import('@earendil-works/pi-coding-agent')['SessionManager'];\n };\n}\n\nexport function createDispatchAgentTool(ctx: SubagentContext): ToolDefinition {\n return defineTool({\n name: 'dispatch_agent',\n label: 'Dispatch subagent',\n description:\n 'Delegate a focused, read-only research subtask to a subagent (e.g. \"find where events are captured\"). The subagent can read/search files and run safe shell, but CANNOT edit files, change .env, or dispatch further subagents. Returns its findings.',\n promptSnippet:\n 'dispatch_agent(description, prompt) — delegate a read-only research subtask',\n parameters: Type.Object({\n description: Type.String({ description: 'Short label for the subtask' }),\n prompt: Type.String({ description: 'Full instruction for the subagent' }),\n }),\n // eslint-disable-next-line @typescript-eslint/require-await -- pi tool contract returns a Promise\n async execute(_id, args) {\n const { createAgentSession, DefaultResourceLoader, SessionManager } =\n ctx.sdk;\n\n const loader = new DefaultResourceLoader({\n cwd: ctx.cwd,\n agentDir: ctx.agentDir,\n systemPrompt: SUBAGENT_SYSTEM_PROMPT,\n noExtensions: true,\n noSkills: true,\n noContextFiles: true,\n noPromptTemplates: true,\n noThemes: true,\n extensionFactories: [ctx.securityFactory as (pi: unknown) => void],\n });\n await loader.reload();\n\n const { session: child } = await createAgentSession({\n model: ctx.model,\n modelRuntime: ctx.modelRuntime,\n cwd: ctx.cwd,\n sessionManager: SessionManager.inMemory(ctx.cwd),\n resourceLoader: loader,\n tools: SUBAGENT_TOOLS, // read-only built-ins; no write/edit, no dispatch_agent\n customTools: [ctx.bashTool], // env-scrubbed bash only (still allowlist-fenced)\n });\n\n let result = '';\n let finalTurn:\n | {\n stopReason?: string;\n errorMessage?: string;\n diagnostics?: {\n error?: { name?: string; code?: string | number };\n }[];\n }\n | undefined;\n // A refusal on any turn ends the child, since a later reply would overwrite it.\n let refusal: string | undefined;\n const unsub = child.subscribe((e) => {\n if (e.type === 'message_end') {\n const assistant =\n (e.message as { role?: string })?.role === 'assistant';\n if (assistant) finalTurn = e.message as typeof finalTurn;\n const t = extractText(e.message).trim();\n if (t) result = t;\n const reason = assistant && !refusal && policyAbortReason(t);\n if (reason) {\n refusal = `${AgentSignals.POLICY_ABORT} ${reason}`;\n void child.abort();\n }\n }\n });\n logToFile(`[pi] subagent dispatch: ${args.description}`);\n try {\n await child.prompt(args.prompt);\n if (refusal) return text(refusal);\n const failure = gatewayTerminalFailure(finalTurn);\n if (failure) throw new Error(`Subagent failed: ${failure.message}`);\n } finally {\n unsub();\n }\n logToFile(`[pi] subagent \"${args.description}\" → ${result.length} chars`);\n return text(result || 'Subagent completed with no textual result.');\n },\n });\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AA4BA,MAAM,iBAAiB;CAAC;CAAQ;CAAQ;CAAQ;CAAK;AAErD,MAAM,yBAAyB;CAC7B;CACA;CACA;CACA;CACD,CAAC,KAAK,KAAK;AAEZ,SAAS,KAAK,GAGZ;AACA,QAAO;EAAE,SAAS,CAAC;GAAE,MAAM;GAAQ,MAAM;GAAG,CAAC;EAAE,SAAS,EAAE;EAAE;;AAG9D,SAAS,YAAY,SAA0B;CAC7C,MAAM,UAAW,SAAmC;AACpD,KAAI,OAAO,YAAY,SAAU,QAAO;AACxC,KAAI,MAAM,QAAQ,QAAQ,CACxB,QAAO,QACJ,QAAQ,MAA2C;EAClD,MAAM,IAAI;AACV,SAAO,GAAG,SAAS,UAAU,OAAO,EAAE,SAAS;GAC/C,CACD,KAAK,MAAM,EAAE,KAAK,CAClB,KAAK,GAAG;AAEb,QAAO;;AAuBT,SAAgB,wBAAwB,KAAsC;AAC5E,QAAO,WAAW;EAChB,MAAM;EACN,OAAO;EACP,aACE;EACF,eACE;EACF,YAAY,KAAK,OAAO;GACtB,aAAa,KAAK,OAAO,EAAE,aAAa,+BAA+B,CAAC;GACxE,QAAQ,KAAK,OAAO,EAAE,aAAa,qCAAqC,CAAC;GAC1E,CAAC;EAEF,MAAM,QAAQ,KAAK,MAAM;GACvB,MAAM,EAAE,oBAAoB,uBAAuB,mBACjD,IAAI;GAEN,MAAM,SAAS,IAAI,sBAAsB;IACvC,KAAK,IAAI;IACT,UAAU,IAAI;IACd,cAAc;IACd,cAAc;IACd,UAAU;IACV,gBAAgB;IAChB,mBAAmB;IACnB,UAAU;IACV,oBAAoB,CAAC,IAAI,gBAAyC;IACnE,CAAC;AACF,SAAM,OAAO,QAAQ;GAErB,MAAM,EAAE,SAAS,UAAU,MAAM,mBAAmB;IAClD,OAAO,IAAI;IACX,cAAc,IAAI;IAClB,KAAK,IAAI;IACT,gBAAgB,eAAe,SAAS,IAAI,IAAI;IAChD,gBAAgB;IAChB,OAAO;IACP,aAAa,CAAC,IAAI,SAAS;IAC5B,CAAC;GAEF,IAAI,SAAS;GACb,IAAI;GAUJ,IAAI;GACJ,MAAM,QAAQ,MAAM,WAAW,MAAM;AACnC,QAAI,EAAE,SAAS,eAAe;KAC5B,MAAM,YACH,EAAE,SAA+B,SAAS;AAC7C,SAAI,UAAW,aAAY,EAAE;KAC7B,MAAM,IAAI,YAAY,EAAE,QAAQ,CAAC,MAAM;AACvC,SAAI,EAAG,UAAS;KAChB,MAAM,SAAS,aAAa,CAAC,WAAW,kBAAkB,EAAE;AAC5D,SAAI,QAAQ;AACV,gBAAU,GAAG,aAAa,aAAa,GAAG;AACrC,YAAM,OAAO;;;KAGtB;AACF,aAAU,2BAA2B,KAAK,cAAc;AACxD,OAAI;AACF,UAAM,MAAM,OAAO,KAAK,OAAO;AAC/B,QAAI,QAAS,QAAO,KAAK,QAAQ;IACjC,MAAM,UAAU,uBAAuB,UAAU;AACjD,QAAI,QAAS,OAAM,IAAI,MAAM,oBAAoB,QAAQ,UAAU;aAC3D;AACR,WAAO;;AAET,aAAU,kBAAkB,KAAK,YAAY,MAAM,OAAO,OAAO,QAAQ;AACzE,UAAO,KAAK,UAAU,6CAA6C;;EAEtE,CAAC"}
@@ -1,13 +1,13 @@
1
1
  import { n as ErrorCodes } from "./emit-BqLCdV8Y.js";
2
- import { o as logToFile } from "./debug-BTUMatFI.js";
3
- import { at as wizardUserAgentForProgram, et as WIZARD_REMARK_EVENT_NAME, n as analytics } from "./analytics-GQv--mQm.js";
4
- import { t as classifyRunFailure } from "./errors-DhFeR8Sp.js";
5
- import { n as currentAccessToken } from "./oauth-session-CfkZ339p.js";
6
- import { c as REMARK_INSTRUCTION, f as gatewayAuth, o as withGatewayRemint, r as buildGatewayProvider, t as GATEWAY_PROVIDER, u as policyAbortReason } from "./gateway-CJ8Jqbll.js";
7
- import { g as assembleCommandments, h as AgentOutputSignals } from "./agent-interface-fcDXqb-_.js";
8
- import { c as runErrorType, i as lastStatusLine, l as setupSignalFailure, n as buildScrubbedEnv, o as withMode, r as extractText, s as bindPiCancellation, t as applyOutroMarkers, u as createAioCapture } from "./pi-2pYz2OY3.js";
9
- import { d as taskReported } from "./queue-tools-10w8lhEs.js";
10
- import { c as queueTools, l as renderToolInventory, r as allowsPostHogMcp } from "./agent-prompt-loader-F9gGPMt0.js";
2
+ import { o as logToFile } from "./debug-BfO_Txo8.js";
3
+ import { n as analytics, ot as wizardUserAgentForProgram, tt as WIZARD_REMARK_EVENT_NAME } from "./analytics-Drox5LSW.js";
4
+ import { t as classifyRunFailure } from "./errors-BXlWujEw.js";
5
+ import { n as currentAccessToken } from "./oauth-session-9EU3ky0v.js";
6
+ import { d as policyAbortReason, i as createGatewayRuntime, l as REMARK_INSTRUCTION, p as gatewayAuth, r as buildGatewayProvider, s as withGatewayRemint, t as GATEWAY_PROVIDER } from "./gateway-CLQQb96F.js";
7
+ import { g as assembleCommandments, h as AgentOutputSignals } from "./agent-interface-BNssNetq.js";
8
+ import { c as runErrorType, i as lastStatusLine, l as setupSignalFailure, n as buildScrubbedEnv, o as withMode, r as extractText, s as bindPiCancellation, t as applyOutroMarkers, u as createAioCapture } from "./pi-BSnSk6rv.js";
9
+ import { d as taskReported } from "./queue-tools-PFG6H93Q.js";
10
+ import { l as queueTools, r as allowsPostHogMcp, u as renderToolInventory } from "./agent-prompt-loader-iV11XVEF.js";
11
11
  //#region src/agent/runner/harness/pi/task.ts
12
12
  /**
13
13
  * Orchestrator-mode execution on pi: one fresh pi session per unit of work —
@@ -137,7 +137,7 @@ async function runPiTask(inputs) {
137
137
  let abortReason;
138
138
  let remarkTurn = false;
139
139
  try {
140
- const { createAgentSession, DefaultResourceLoader, SessionManager, AuthStorage, ModelRegistry, getAgentDir, createLsToolDefinition, createFindToolDefinition, createGrepToolDefinition, createBashToolDefinition, createReadToolDefinition, createEditToolDefinition, createWriteToolDefinition } = await import("@earendil-works/pi-coding-agent");
140
+ const { createAgentSession, DefaultResourceLoader, SessionManager, getAgentDir, createLsToolDefinition, createFindToolDefinition, createGrepToolDefinition, createBashToolDefinition, createReadToolDefinition, createEditToolDefinition, createWriteToolDefinition } = await import("@earendil-works/pi-coding-agent");
141
141
  const refreshAuth = async () => gatewayAuth(boot.credentials.host, await currentAccessToken(boot.credentials), boot.programId);
142
142
  const auth = await refreshAuth();
143
143
  const providerInputs = (current) => ({
@@ -150,28 +150,27 @@ async function runPiTask(inputs) {
150
150
  effort
151
151
  });
152
152
  const { provider, caps } = buildGatewayProvider(providerInputs(auth));
153
- const registry = ModelRegistry.inMemory(AuthStorage.create());
154
- registry.registerProvider(GATEWAY_PROVIDER, provider);
155
- const model = registry.find(GATEWAY_PROVIDER, modelId);
153
+ const registry = await createGatewayRuntime(provider);
154
+ const model = registry.getModel(GATEWAY_PROVIDER, modelId);
156
155
  if (!model) return {
157
156
  kind: "failure",
158
157
  classification: "WIZARD_API_ERROR",
159
158
  message: "pi: gateway model could not be resolved"
160
159
  };
161
160
  const askState = { pending: false };
162
- const { createSecurityExtension } = await import("./security-ppK2MwCn.js");
161
+ const { createSecurityExtension } = await import("./security-pApVawYb.js");
163
162
  const security = createSecurityExtension({
164
163
  disallowedTools: fenceDisallowList(disallowedTools),
165
164
  triageProvider: boot.triageProvider,
166
165
  getWizardAskPending: () => askState.pending,
167
166
  workingDirectory: input.installDir
168
167
  });
169
- const { prewarmYaraScanner } = await import("./yara-hooks-BwhEDXIt.js");
168
+ const { prewarmYaraScanner } = await import("./yara-hooks-MDtFbuoM.js");
170
169
  prewarmYaraScanner();
171
170
  const extensionFactories = [security.factory];
172
171
  let posthogMcp = false;
173
172
  if (allowsPostHogMcp(allowedTools)) try {
174
- const { setupPostHogMcp } = await import("./mcp-D73aCOHK.js");
173
+ const { setupPostHogMcp } = await import("./mcp-KVV6Z_bq.js");
175
174
  const mcp = await setupPostHogMcp({
176
175
  mcpUrl: boot.credentials.host.mcpUrl,
177
176
  accessToken: await currentAccessToken(boot.credentials),
@@ -227,7 +226,7 @@ async function runPiTask(inputs) {
227
226
  find: () => withMode(createFindToolDefinition(dir), "parallel"),
228
227
  grep: () => withMode(createGrepToolDefinition(dir), "parallel")
229
228
  }).filter(([name]) => codingTools.has(name)).map(([, make]) => make());
230
- const { createWizardPiTools } = await import("./tools-g42e5kJz.js");
229
+ const { createWizardPiTools } = await import("./tools-DyzRi_dQ.js");
231
230
  const wizardToolNames = allowedPiWizardTools(allowedTools);
232
231
  const wizardTools = createWizardPiTools({
233
232
  workingDirectory: dir,
@@ -242,7 +241,7 @@ async function runPiTask(inputs) {
242
241
  askState.pending = pending;
243
242
  }
244
243
  }).filter((t) => wizardToolNames.has(t.name));
245
- const { createPiOrchestratorTools } = await import("./orchestrator-tools-lvNVQhzs.js");
244
+ const { createPiOrchestratorTools } = await import("./orchestrator-tools-QWyDLu_7.js");
246
245
  const queueTools = createPiOrchestratorTools(orchestrator).filter((t) => orchestratorTools.has(t.name));
247
246
  const customTools = [
248
247
  ...codingToolDefs,
@@ -251,7 +250,7 @@ async function runPiTask(inputs) {
251
250
  ];
252
251
  const { session: agentSession } = await createAgentSession({
253
252
  model,
254
- modelRegistry: registry,
253
+ modelRuntime: registry,
255
254
  thinkingLevel: caps.thinkingLevel,
256
255
  cwd: dir,
257
256
  sessionManager: SessionManager.inMemory(dir),
@@ -457,4 +456,4 @@ async function runPiTask(inputs) {
457
456
  //#endregion
458
457
  export { runPiTask };
459
458
 
460
- //# sourceMappingURL=task-Y8lWoDE7.js.map
459
+ //# sourceMappingURL=task-3hRSovmK.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-3hRSovmK.js","names":[],"sources":["../src/agent/runner/harness/pi/task.ts"],"sourcesContent":["/**\n * Orchestrator-mode execution on pi: one fresh pi session per unit of work —\n * the seed plan, or one drained task. The linear pipeline's concerns (skill\n * menu, todo panel, event-plan cleanup) stay in `index.ts`; this module builds\n * the leaner per-task session: gateway model, security fence, the task's\n * allowed coding tools, the wizard env tools, and the in-process orchestrator\n * queue tools.\n *\n * The task's `allowedTools` / `disallowedTools` arrive in the wizard's tool\n * vocabulary (`Read`, `Edit`, `Glob`, …, plus MCP-qualified orchestrator names\n * from `agentRunTools`). pi is where they become real: allowed names decide\n * which pi tool definitions get registered at all, and the disallow list is\n * ALSO handed to the security fence, so a name that never got registered stays\n * blocked even if the model hallucinates it.\n *\n * Loaded lazily from `index.ts` (typebox/ESM constraint, same as tools.ts).\n */\n\nimport { logToFile } from '@utils/debug';\nimport { analytics } from '@utils/analytics';\nimport {\n Harness,\n Sequence,\n WIZARD_REMARK_EVENT_NAME,\n wizardUserAgentForProgram,\n} from '@shared/constants';\nimport {\n allowsPostHogMcp,\n queueTools,\n renderToolInventory,\n} from '../../../agent-prompt-loader';\nimport { AgentErrorType } from '../../../agent-interface';\nimport { REMARK_INSTRUCTION, policyAbortReason } from '../../../signals';\nimport { AgentOutputSignals } from '../../../output-signals';\nimport {\n taskReported,\n type OrchestratorToolsContext,\n} from '../../sequence/orchestrator/queue-tools';\nimport type { AgentResult, TaskRunInputs } from '../types';\nimport { gatewayAuth, type GatewayAuth } from '../../../gateway-session';\nimport { currentAccessToken } from '@shared/oauth-session';\nimport {\n buildGatewayProvider,\n GATEWAY_PROVIDER,\n withGatewayRemint,\n createGatewayRuntime,\n} from './gateway';\nimport { runErrorType, setupSignalFailure } from './completion';\nimport { bindPiCancellation } from './cancellation';\nimport { classifyRunFailure, ErrorCodes } from '@shared/errors';\nimport { assembleCommandments } from '../../switchboard/commandments';\nimport {\n applyOutroMarkers,\n buildScrubbedEnv,\n extractText,\n lastStatusLine,\n withMode,\n} from './index';\nimport { createAioCapture } from '../../../aio-capture';\n\n/** wizard tool vocabulary → the pi tool definitions it unlocks. */\nconst CODING_TOOL_MAP: Record<string, readonly string[]> = {\n Read: ['read'],\n Edit: ['edit'],\n Write: ['write'],\n Bash: ['bash'],\n Glob: ['find', 'ls'],\n Grep: ['grep'],\n};\n\n/** `mcp__wizard-tools__wizard_ask` → `wizard_ask`; native names pass through. */\nfunction shortToolName(name: string): string {\n return name.replace(/^mcp__.+?__/, '');\n}\n\n/**\n * The pi coding tools a task may use. An empty allow list means \"no\n * restriction\" (mirrors the SDK), so every coding tool registers.\n */\nexport function allowedPiCodingTools(\n allowedTools: readonly string[] | undefined,\n): Set<string> {\n const allowed = (allowedTools ?? []).map(shortToolName);\n const names = allowed.length\n ? allowed.flatMap((name) => CODING_TOOL_MAP[name] ?? [])\n : Object.values(CODING_TOOL_MAP).flat();\n return new Set(names);\n}\n\n/**\n * The orchestrator queue tools this agent gets. Everything not disallowed:\n * the seed's frontmatter disallows `complete_task` (it is not a task), a\n * task's disallows `enqueue_task` (the seed owns the graph).\n */\nexport function allowedOrchestratorTools(\n disallowedTools: readonly string[] | undefined,\n): Set<string> {\n return new Set(queueTools(disallowedTools ?? []));\n}\n\n/**\n * The wizard tools a task gets. Four are always on — their handlers are fenced\n * and the coding tasks depend on them. The rest are opt-in per task through\n * its frontmatter: `wizard_ask` stops the run until a person answers, and the\n * skill-menu pair (`load_skill_menu`, `install_skill`) lets a task pull its\n * own skill variant.\n */\nconst ALWAYS_ON_WIZARD_TOOLS = [\n 'check_env_keys',\n 'set_env_values',\n 'detect_package_manager',\n 'publish_handoff',\n];\n\nconst OPT_IN_WIZARD_TOOLS = [\n 'wizard_ask',\n 'load_skill_menu',\n 'install_skill',\n // Audit programs only: they declare the ledger tools on `allowedTools`.\n 'audit_seed_checks',\n 'audit_add_checks',\n 'audit_resolve_checks',\n];\n\nexport function allowedPiWizardTools(\n allowedTools: readonly string[] | undefined,\n): Set<string> {\n const allowed = (allowedTools ?? []).map(shortToolName);\n return new Set([\n ...ALWAYS_ON_WIZARD_TOOLS,\n ...OPT_IN_WIZARD_TOOLS.filter((tool) => allowed.includes(tool)),\n ]);\n}\n\n/**\n * The disallow list for the security fence: the wizard-vocabulary names as\n * given (the fence translates pi built-ins to the same vocabulary) plus the\n * short names, so a disallowed orchestrator tool is blocked under the name pi\n * would call it by.\n */\nexport function fenceDisallowList(\n disallowedTools: readonly string[] | undefined,\n): string[] {\n const names = disallowedTools ?? [];\n return [...new Set([...names, ...names.map(shortToolName)])];\n}\n\n/** Nudges when the session returns without the work reaching a terminal state. */\nconst MAX_TASK_NUDGES = 3;\n\nconst TASK_NUDGE =\n 'You have not called complete_task yet. Finish your task now: if the work is done, call complete_task with your handoff; if it cannot be done, call it with status \"failed\" or \"not needed\" and say why.';\n\nconst SEED_NUDGE =\n 'The queue is still empty. Seed it now with enqueue_task calls for the task graph you planned.';\n\n/** Whether this unit of work has reached its terminal state. */\nfunction isSettled(ctx: OrchestratorToolsContext): boolean {\n if (!ctx.currentTaskId) {\n // The seed's job is a seeded queue, not a complete_task call.\n return ctx.store.list().length > 0;\n }\n return taskReported(ctx);\n}\n\nexport async function runPiTask(inputs: TaskRunInputs): Promise<AgentResult> {\n if (inputs.signal?.aborted) {\n return {\n kind: 'abort',\n classification: AgentErrorType.ABORT,\n message: 'Agent run cancelled',\n };\n }\n const {\n config,\n input,\n boot,\n emit,\n prompt,\n spinner,\n model: modelId,\n effort,\n allowedTools,\n disallowedTools,\n askBridge,\n orchestrator,\n spinnerMessage,\n successMessage,\n errorMessage,\n requestRemark,\n analyticsProperties,\n } = inputs;\n\n if (spinnerMessage) spinner.start(spinnerMessage);\n\n const capture = createAioCapture({\n enabled: input.flags.captureAio,\n projectApiKey: boot.credentials.projectApiKey,\n apiHost: boot.credentials.host.apiHost,\n runTags: boot.wizardMetadata,\n });\n\n const startTime = Date.now();\n const signals = new AgentOutputSignals();\n let assistantTurns = 0;\n const runDurations = () => {\n const durationMs = Date.now() - startTime;\n return {\n duration_ms: durationMs,\n duration_seconds: Math.round(durationMs / 1000),\n };\n };\n // How this task run failed: the closed AgentErrorType it is about to return.\n // Without it every terminal path below — a security termination, a rate\n // limit, a gateway error — arrived as the same unlabelled event, so a task\n // agent that died could be counted but not diagnosed. A security stop is not\n // an error, hence \"failure mode\" over \"error\".\n //\n // Not `reason`: the linear sequence emits this same event with a `reason`\n // holding the agent's free-text [ABORT] string, and one property cannot be\n // both a closed enum and unbounded prose without making either unreadable.\n // `source` tells a gateway policy refusal apart from a program's [ABORT].\n const captureAborted = (\n failureMode: AgentErrorType,\n source?: 'gateway_policy',\n ) =>\n analytics.wizardCapture('agent aborted', {\n failure_mode: failureMode,\n ...(source && { source }),\n ...runDurations(),\n model: modelId,\n ...analyticsProperties,\n });\n\n let mcpCleanup: (() => void) | undefined;\n let aioFailed = true;\n let cancellation: ReturnType<typeof bindPiCancellation> | undefined;\n let abortReason: string | undefined;\n let remarkTurn = false;\n try {\n const sdk = await import('@earendil-works/pi-coding-agent');\n const {\n createAgentSession,\n DefaultResourceLoader,\n SessionManager,\n getAgentDir,\n createLsToolDefinition,\n createFindToolDefinition,\n createGrepToolDefinition,\n createBashToolDefinition,\n createReadToolDefinition,\n createEditToolDefinition,\n createWriteToolDefinition,\n } = sdk;\n\n // Reads the live OAuth token, so a mid-run rotation re-mints on the new one.\n const refreshAuth = async () =>\n gatewayAuth(\n boot.credentials.host,\n await currentAccessToken(boot.credentials),\n boot.programId,\n );\n const auth = await refreshAuth();\n const providerInputs = (current: GatewayAuth) => ({\n gatewayUrl: current.gatewayUrl,\n accessToken: current.token,\n teamId: current.teamId,\n wizardMetadata: boot.wizardMetadata,\n wizardFlags: boot.wizardFlags,\n modelId,\n // Per-task agents own their effort via the prompt frontmatter, falling\n // back to the model table.\n effort,\n });\n const { provider, caps } = buildGatewayProvider(providerInputs(auth));\n const registry = await createGatewayRuntime(provider);\n const model = registry.getModel(GATEWAY_PROVIDER, modelId);\n if (!model) {\n return {\n kind: 'failure',\n classification: AgentErrorType.API_ERROR,\n message: 'pi: gateway model could not be resolved',\n };\n }\n\n // Shared flag: true while a wizard_ask overlay is open. The ask tool sets\n // it (onAskPendingChange, below); the security fence reads it to pause\n // Write/Edit until the answer comes back. Wired the same way as the linear\n // pi run — without it the warehouse task could mutate files while its\n // credential prompt sits open (up to LONGER_ASK_TIMEOUT_MS).\n const askState = { pending: false };\n\n // The same fail-closed fence as the linear run, with the task's disallow\n // list layered in (both the wizard-vocabulary and pi-short names).\n const { createSecurityExtension } = await import('./security');\n const security = createSecurityExtension({\n disallowedTools: fenceDisallowList(disallowedTools),\n triageProvider: boot.triageProvider,\n getWizardAskPending: () => askState.pending,\n workingDirectory: input.installDir,\n });\n const { prewarmYaraScanner } = await import('../../../yara-hooks');\n void prewarmYaraScanner();\n\n // PostHog MCP, for the tasks whose prompt requests it. Tasks that never\n // asked skip the handshake and never see a posthog tool.\n const extensionFactories = [security.factory] as Array<\n (pi: unknown) => void\n >;\n let posthogMcp = false;\n if (allowsPostHogMcp(allowedTools)) {\n try {\n const { setupPostHogMcp } = await import('./mcp');\n const mcp = await setupPostHogMcp({\n mcpUrl: boot.credentials.host.mcpUrl,\n accessToken: await currentAccessToken(boot.credentials),\n // Same `program:` marker as the linear run, so a task's MCP writes are\n // attributed to the program that queued it. `anthropic/index.ts` uses\n // `programId` as the label on the task path too.\n userAgent: wizardUserAgentForProgram(config.programId),\n });\n extensionFactories.push(mcp.extensionFactory);\n mcpCleanup = mcp.cleanup;\n posthogMcp = true;\n } catch (err) {\n try {\n mcpCleanup?.();\n } catch {\n /* Setup cleanup is best effort. */\n }\n mcpCleanup = undefined;\n // Silent here reads as a task failure minutes later: a task that asked\n // for this tool can only skip or fail without it.\n logToFile(`[pi-task] PostHog MCP setup skipped: ${String(err)}`);\n analytics.wizardCapture('mcp setup failed', {\n harness: 'pi',\n scope: 'task',\n error: String(err).slice(0, 300),\n });\n }\n }\n\n const codingTools = allowedPiCodingTools(allowedTools);\n const orchestratorTools = allowedOrchestratorTools(disallowedTools);\n\n const resourceLoader = new DefaultResourceLoader({\n cwd: input.installDir,\n agentDir: getAgentDir(),\n systemPrompt: assembleCommandments({\n program: config.programId,\n sequence: Sequence.orchestrator,\n harness: Harness.pi,\n caps: { bash: codingTools.has('bash'), posthogMcp },\n }),\n noExtensions: true,\n noSkills: true,\n noContextFiles: true,\n noPromptTemplates: true,\n noThemes: true,\n extensionFactories,\n });\n await resourceLoader.reload();\n\n // The task's coding tools, gated by its allow list. Reads and searches run\n // in parallel; mutating tools stay sequential. Bash subprocesses get the\n // scrubbed env, same as the linear run.\n const dir = input.installDir;\n const codingToolFactories = {\n read: () => withMode(createReadToolDefinition(dir), 'parallel'),\n edit: () => withMode(createEditToolDefinition(dir), 'sequential'),\n write: () => withMode(createWriteToolDefinition(dir), 'sequential'),\n bash: () =>\n withMode(\n createBashToolDefinition(dir, {\n spawnHook: (ctx) => ({ ...ctx, env: buildScrubbedEnv() }),\n }),\n 'sequential',\n ),\n ls: () => withMode(createLsToolDefinition(dir), 'parallel'),\n find: () => withMode(createFindToolDefinition(dir), 'parallel'),\n grep: () => withMode(createGrepToolDefinition(dir), 'parallel'),\n } as const;\n const codingToolDefs = Object.entries(codingToolFactories)\n .filter(([name]) => codingTools.has(name))\n .map(([, make]) => make());\n\n // Wizard env + package-manager tools are always on — their handlers are\n // fenced, and init/build tasks depend on them. publish_handoff rides\n // along (it only emits) so the report task can publish the handoff; every\n // other task is told, on the call, that it still owes a complete_task.\n const { createWizardPiTools } = await import('./tools');\n const wizardToolNames = allowedPiWizardTools(allowedTools);\n const wizardTools = createWizardPiTools({\n workingDirectory: dir,\n skillsBaseUrl: boot.skillsBaseUrl,\n triageProvider: boot.triageProvider,\n emit,\n taskAgent: orchestrator.currentTaskId !== undefined,\n programId: boot.programId,\n handoffNotebook: boot.handoffNotebook,\n // Present only for a task allowed to ask; without it wizard_ask errors\n // instead of hanging on a prompt nobody will ever see.\n askBridge,\n // Pause Write/Edit while the ask overlay is open (see askState above).\n onAskPendingChange: (pending) => {\n askState.pending = pending;\n },\n }).filter((t) => wizardToolNames.has(t.name));\n\n const { createPiOrchestratorTools } = await import('./orchestrator-tools');\n const queueTools = createPiOrchestratorTools(orchestrator).filter((t) =>\n orchestratorTools.has(t.name),\n );\n\n const customTools = [...codingToolDefs, ...wizardTools, ...queueTools];\n const { session: agentSession } = await createAgentSession({\n model,\n modelRuntime: registry,\n thinkingLevel: caps.thinkingLevel,\n cwd: dir,\n sessionManager: SessionManager.inMemory(dir),\n resourceLoader,\n noTools: 'builtin',\n customTools,\n });\n cancellation = bindPiCancellation(inputs.signal, agentSession, (error) => {\n logToFile(`[pi-task] abort failed: ${String(error)}`);\n });\n await agentSession.bindExtensions({});\n\n // A turn that ends on a 401 from an aged bearer re-mints once and\n // continues with the nudge the task would get anyway.\n const turns = withGatewayRemint({\n signal: inputs.signal,\n session: agentSession,\n registry,\n auth,\n refreshAuth,\n providerInputs,\n continueText: () =>\n orchestrator.currentTaskId ? TASK_NUDGE : SEED_NUDGE,\n onRemint: () => {\n logToFile('[pi-task] gateway token renewed after a 401; continuing');\n analytics.wizardCapture('gateway token reminted', { harness: 'pi' });\n },\n });\n\n // The one complete list: exactly the tools registered on this session, in\n // the names the agent will call them by. posthog_exec binds as an extension.\n const toolNames = [\n ...customTools.map((t) => t.name),\n ...(posthogMcp ? ['posthog_exec'] : []),\n ];\n logToFile(`[pi-task] tools passed to model: ${toolNames.join(', ')}`);\n const taskPrompt = `${prompt}\\n\\n${renderToolInventory(toolNames)}`;\n\n const unsubscribe = agentSession.subscribe((event) => {\n // Mirror the turn into AIO. No-op when --capture-aio is off. Runs\n // before the role guard so the module's own filter is authoritative.\n capture.captureFromPiMessageEndEvent(event);\n\n switch (event.type) {\n case 'message_end': {\n // User prompts also emit message_end; only assistant turns count.\n if ((event.message as { role?: string })?.role !== 'assistant') {\n break;\n }\n assistantTurns += 1;\n turns.noteAssistantTurn(event.message);\n const assistant = extractText(event.message).trim();\n // The refusal marker ends the run from a work turn, not the remark or a turn after complete_task.\n if (!remarkTurn && !taskReported(orchestrator))\n abortReason ??= policyAbortReason(assistant);\n if (abortReason) cancellation?.abort();\n if (assistant) {\n logToFile(`[pi-task] assistant: ${assistant.slice(0, 1000)}`);\n applyOutroMarkers(assistant, emit);\n const statusText = lastStatusLine(assistant);\n if (statusText) {\n emit({ kind: 'status', message: statusText });\n spinner.message(statusText);\n }\n for (const line of assistant.split('\\n')) signals.push(line);\n }\n break;\n }\n case 'tool_execution_start': {\n const args = JSON.stringify(event.args ?? {}).slice(0, 200);\n logToFile(`[pi-task] → ${event.toolName} ${args}`);\n break;\n }\n case 'tool_execution_end': {\n if (event.isError) {\n const detail =\n typeof event.result === 'string'\n ? event.result\n : JSON.stringify(event.result ?? '');\n logToFile(`[pi-task] ✗ ${event.toolName}: ${detail.slice(0, 300)}`);\n }\n break;\n }\n default:\n break;\n }\n });\n\n // Seed AIO capture with this task's prompt — includes any handoff data\n // from prior tasks (the orchestrator bakes it into the prompt string\n // before it reaches this call site).\n capture.setInitialPrompt(taskPrompt);\n\n let terminal = turns.terminalFailure();\n try {\n if (inputs.signal?.aborted)\n return {\n kind: 'abort',\n classification: AgentErrorType.ABORT,\n message: 'Agent run cancelled',\n };\n await turns.prompt(taskPrompt);\n terminal = turns.terminalFailure();\n\n // pi's prompt() resolves the moment a turn carries no tool call — which\n // an agent mid-plan does emit. While the work has not reached its\n // terminal state (task not reported, seed queue still empty), nudge.\n let nudges = 0;\n while (\n nudges < MAX_TASK_NUDGES &&\n !security.state.criticalViolation &&\n !inputs.signal?.aborted &&\n !terminal &&\n !abortReason &&\n !setupSignalFailure(signals) &&\n !isSettled(orchestrator)\n ) {\n nudges += 1;\n logToFile(\n `[pi-task] completion guard: not settled, nudge ${nudges}/${MAX_TASK_NUDGES}`,\n );\n await turns.prompt(\n orchestrator.currentTaskId ? TASK_NUDGE : SEED_NUDGE,\n );\n terminal = turns.terminalFailure();\n }\n\n if (\n requestRemark &&\n !security.state.criticalViolation &&\n !terminal &&\n !abortReason &&\n !setupSignalFailure(signals) &&\n !inputs.signal?.aborted\n ) {\n remarkTurn = true;\n try {\n await agentSession.prompt(REMARK_INSTRUCTION);\n } catch (err) {\n logToFile(`[pi-task] remark request failed: ${String(err)}`);\n }\n }\n } finally {\n try {\n unsubscribe();\n } catch {\n /* Keep the terminal result. */\n }\n }\n\n if (inputs.signal?.aborted) {\n return {\n kind: 'abort',\n classification: AgentErrorType.ABORT,\n message: 'Agent run cancelled',\n };\n }\n\n if (abortReason)\n terminal = { classification: AgentErrorType.ABORT, message: abortReason };\n if (terminal && !security.state.criticalViolation) {\n if (errorMessage || spinnerMessage)\n spinner.stop(errorMessage ?? 'Task failed');\n captureAborted(\n terminal.classification,\n abortReason ? 'gateway_policy' : undefined,\n );\n if (terminal.status === 401) {\n return {\n kind: 'decided_failure',\n failure: {\n code: ErrorCodes.AuthInvalidOrExpired,\n message: 'Authentication failed (401)',\n detail: { providerMessage: terminal.message },\n },\n };\n }\n return terminal.classification === AgentErrorType.ABORT\n ? {\n kind: 'abort',\n classification: AgentErrorType.ABORT,\n message: terminal.message,\n }\n : {\n kind: 'failure',\n classification: terminal.classification,\n message: terminal.message,\n };\n }\n\n if (security.state.criticalViolation) {\n spinner.stop('Security violation detected');\n logToFile(\n `[pi-task] terminated: YARA violation (blocked ${security.state.blockedCount} call(s))`,\n );\n captureAborted(AgentErrorType.YARA_VIOLATION);\n return { kind: 'failure', classification: AgentErrorType.YARA_VIOLATION };\n }\n\n const setupFailure = setupSignalFailure(signals);\n if (setupFailure) {\n spinner.stop('Agent could not access setup instructions');\n logToFile(`[pi-task] setup failed: ${setupFailure}`);\n captureAborted(setupFailure);\n return { kind: 'failure', classification: setupFailure };\n }\n\n const remark = signals.remark();\n if (remark) {\n analytics.capture(WIZARD_REMARK_EVENT_NAME, { remark });\n }\n\n const stats = agentSession.getSessionStats();\n const durations = runDurations();\n analytics.wizardCapture('agent completed', {\n ...durations,\n model: modelId,\n num_turns: assistantTurns,\n input_tokens: stats.tokens.input,\n output_tokens: stats.tokens.output,\n cache_creation_input_tokens: stats.tokens.cacheWrite,\n cache_read_input_tokens: stats.tokens.cacheRead,\n ...analyticsProperties,\n });\n // Per-task usage on one parseable line so a run's per-task time and cost are\n // observable from the log, not only from analytics.\n const taskType =\n typeof (analyticsProperties as { task_type?: unknown })?.task_type ===\n 'string'\n ? (analyticsProperties as { task_type: string }).task_type\n : modelId;\n logToFile(\n `[pi-task] usage task=${taskType} model=${modelId} effort=${caps.thinkingLevel} dur=${durations.duration_seconds}s turns=${assistantTurns} in=${stats.tokens.input} out=${stats.tokens.output} cacheR=${stats.tokens.cacheRead} cacheW=${stats.tokens.cacheWrite}`,\n );\n if (successMessage) spinner.stop(successMessage);\n aioFailed = false;\n return { kind: 'success' };\n } catch (err) {\n if (inputs.signal?.aborted) {\n return {\n kind: 'abort',\n classification: AgentErrorType.ABORT,\n message: 'Agent run cancelled',\n };\n }\n const message = err instanceof Error ? err.message : String(err);\n logToFile(`[pi-task] run error: ${message}`);\n if (errorMessage || spinnerMessage) {\n spinner.stop(errorMessage ?? 'Task failed');\n }\n const coded = classifyRunFailure(err);\n if (coded.coded && err instanceof Error) {\n captureAborted(AgentErrorType.API_ERROR);\n return {\n kind: 'decided_failure',\n failure: { code: coded.code, message: coded.message, error: err },\n };\n }\n const classification = runErrorType(message);\n captureAborted(classification);\n return {\n kind: 'failure',\n classification,\n message,\n error: err instanceof Error ? err : undefined,\n };\n } finally {\n await cancellation?.settle();\n try {\n mcpCleanup?.();\n } catch {\n /* Keep the terminal result. */\n }\n try {\n capture.finishPiRun(aioFailed);\n } catch {\n /* Telemetry is best effort. */\n }\n }\n}\n"],"mappings":"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"}
@@ -113,4 +113,4 @@ function createWizardPiTaskTools(onSync = () => void 0) {
113
113
  //#endregion
114
114
  export { createWizardPiTaskTools };
115
115
 
116
- //# sourceMappingURL=tasks-BfJhVky2.js.map
116
+ //# sourceMappingURL=tasks-C03QbXTx.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"tasks-BfJhVky2.js","names":[],"sources":["../src/agent/runner/harness/pi/tasks.ts"],"sourcesContent":["/**\n * Task/todo parity for pi (#526). The same four Task tools the anthropic path\n * exposes (TaskCreate/Update/Get/List), as pi `defineTool` tools backed by a\n * shared in-memory store. Every mutation reports the list through `onSync`\n * (a `tasks` progress event), so the todo panel updates live under pi exactly\n * like the anthropic path — the thing that was missing before.\n */\n\nimport { randomUUID } from 'node:crypto';\nimport { Type } from 'typebox';\nimport { defineTool } from '@earendil-works/pi-coding-agent';\nimport type { ToolDefinition } from '@earendil-works/pi-coding-agent';\nimport type { TaskSnapshot } from '../../../progress';\n\nexport type TaskStatus = 'pending' | 'in_progress' | 'completed';\nexport interface TaskEntry {\n content: string;\n status: TaskStatus;\n activeForm?: string;\n}\nexport type TaskStore = Map<string, TaskEntry>;\n\nfunction text(s: string): {\n content: [{ type: 'text'; text: string }];\n details: unknown;\n} {\n return { content: [{ type: 'text', text: s }], details: {} };\n}\n\nfunction snapshot(store: TaskStore, source: string): TaskSnapshot[] {\n return Array.from(store.entries()).map(([id, t]) => ({\n id: `${source}:${id}`,\n source,\n content: t.content,\n status: t.status,\n activeForm: t.activeForm,\n }));\n}\n\n/** Build the four Task tools over a fresh store. `onSync` gets the list after every mutation. */\nexport function createWizardPiTaskTools(\n onSync: (tasks: TaskSnapshot[]) => void = () => undefined,\n): {\n tools: ToolDefinition[];\n store: TaskStore;\n} {\n const store: TaskStore = new Map();\n const source = randomUUID();\n const syncToTui = (): void => onSync(snapshot(store, source));\n\n const taskCreate = defineTool({\n name: 'TaskCreate',\n label: 'Create task',\n description:\n 'Create a task in the shared todo list. Returns its assigned id.',\n promptSnippet:\n 'TaskCreate(content) — add a todo (surfaces progress in the UI)',\n parameters: Type.Object({\n content: Type.String({ description: 'Imperative task description' }),\n activeForm: Type.Optional(\n Type.String({ description: 'Present-continuous form for the spinner' }),\n ),\n }),\n // eslint-disable-next-line @typescript-eslint/require-await -- pi tool contract returns a Promise\n async execute(_id, args) {\n const id = `task-${store.size + 1}`;\n store.set(id, {\n content: args.content,\n status: 'pending',\n activeForm: args.activeForm,\n });\n syncToTui();\n return text(`Created ${id}`);\n },\n });\n\n const taskUpdate = defineTool({\n name: 'TaskUpdate',\n label: 'Update task',\n description:\n 'Update an existing task by id (status, content, or activeForm).',\n promptSnippet:\n 'TaskUpdate(taskId, status) — mark a todo in_progress/completed',\n parameters: Type.Object({\n taskId: Type.String(),\n status: Type.Optional(\n Type.Union([\n Type.Literal('pending'),\n Type.Literal('in_progress'),\n Type.Literal('completed'),\n ]),\n ),\n content: Type.Optional(Type.String()),\n activeForm: Type.Optional(Type.String()),\n }),\n // eslint-disable-next-line @typescript-eslint/require-await -- pi tool contract returns a Promise\n async execute(_id, args) {\n const existing = store.get(args.taskId);\n if (!existing) return text(`No such task: ${args.taskId}`);\n store.set(args.taskId, {\n content: args.content ?? existing.content,\n status: (args.status as TaskStatus) ?? existing.status,\n activeForm: args.activeForm ?? existing.activeForm,\n });\n syncToTui();\n return text(`Updated ${args.taskId}`);\n },\n });\n\n const taskGet = defineTool({\n name: 'TaskGet',\n label: 'Get task',\n description: 'Fetch a single task by id.',\n parameters: Type.Object({ taskId: Type.String() }),\n // eslint-disable-next-line @typescript-eslint/require-await -- pi tool contract returns a Promise\n async execute(_id, args) {\n const t = store.get(args.taskId);\n return text(\n t\n ? JSON.stringify({ id: args.taskId, ...t })\n : `No such task: ${args.taskId}`,\n );\n },\n });\n\n const taskList = defineTool({\n name: 'TaskList',\n label: 'List tasks',\n description: 'List all tasks in the shared todo list.',\n parameters: Type.Object({}),\n // eslint-disable-next-line @typescript-eslint/require-await -- pi tool contract returns a Promise\n async execute() {\n return text(\n JSON.stringify(\n Array.from(store.entries()).map(([id, t]) => ({ id, ...t })),\n ),\n );\n },\n });\n\n return { tools: [taskCreate, taskUpdate, taskGet, taskList], store };\n}\n"],"mappings":";;;;;;;;;;;AAsBA,SAAS,KAAK,GAGZ;AACA,QAAO;EAAE,SAAS,CAAC;GAAE,MAAM;GAAQ,MAAM;GAAG,CAAC;EAAE,SAAS,EAAE;EAAE;;AAG9D,SAAS,SAAS,OAAkB,QAAgC;AAClE,QAAO,MAAM,KAAK,MAAM,SAAS,CAAC,CAAC,KAAK,CAAC,IAAI,QAAQ;EACnD,IAAI,GAAG,OAAO,GAAG;EACjB;EACA,SAAS,EAAE;EACX,QAAQ,EAAE;EACV,YAAY,EAAE;EACf,EAAE;;;AAIL,SAAgB,wBACd,eAAgD,KAAA,GAIhD;CACA,MAAM,wBAAmB,IAAI,KAAK;CAClC,MAAM,SAAS,YAAY;CAC3B,MAAM,kBAAwB,OAAO,SAAS,OAAO,OAAO,CAAC;AA4F7D,QAAO;EAAE,OAAO;GA1FG,WAAW;IAC5B,MAAM;IACN,OAAO;IACP,aACE;IACF,eACE;IACF,YAAY,KAAK,OAAO;KACtB,SAAS,KAAK,OAAO,EAAE,aAAa,+BAA+B,CAAC;KACpE,YAAY,KAAK,SACf,KAAK,OAAO,EAAE,aAAa,2CAA2C,CAAC,CACxE;KACF,CAAC;IAEF,MAAM,QAAQ,KAAK,MAAM;KACvB,MAAM,KAAK,QAAQ,MAAM,OAAO;AAChC,WAAM,IAAI,IAAI;MACZ,SAAS,KAAK;MACd,QAAQ;MACR,YAAY,KAAK;MAClB,CAAC;AACF,gBAAW;AACX,YAAO,KAAK,WAAW,KAAK;;IAE/B,CAAC;GAEiB,WAAW;IAC5B,MAAM;IACN,OAAO;IACP,aACE;IACF,eACE;IACF,YAAY,KAAK,OAAO;KACtB,QAAQ,KAAK,QAAQ;KACrB,QAAQ,KAAK,SACX,KAAK,MAAM;MACT,KAAK,QAAQ,UAAU;MACvB,KAAK,QAAQ,cAAc;MAC3B,KAAK,QAAQ,YAAY;MAC1B,CAAC,CACH;KACD,SAAS,KAAK,SAAS,KAAK,QAAQ,CAAC;KACrC,YAAY,KAAK,SAAS,KAAK,QAAQ,CAAC;KACzC,CAAC;IAEF,MAAM,QAAQ,KAAK,MAAM;KACvB,MAAM,WAAW,MAAM,IAAI,KAAK,OAAO;AACvC,SAAI,CAAC,SAAU,QAAO,KAAK,iBAAiB,KAAK,SAAS;AAC1D,WAAM,IAAI,KAAK,QAAQ;MACrB,SAAS,KAAK,WAAW,SAAS;MAClC,QAAS,KAAK,UAAyB,SAAS;MAChD,YAAY,KAAK,cAAc,SAAS;MACzC,CAAC;AACF,gBAAW;AACX,YAAO,KAAK,WAAW,KAAK,SAAS;;IAExC,CAAC;GAEc,WAAW;IACzB,MAAM;IACN,OAAO;IACP,aAAa;IACb,YAAY,KAAK,OAAO,EAAE,QAAQ,KAAK,QAAQ,EAAE,CAAC;IAElD,MAAM,QAAQ,KAAK,MAAM;KACvB,MAAM,IAAI,MAAM,IAAI,KAAK,OAAO;AAChC,YAAO,KACL,IACI,KAAK,UAAU;MAAE,IAAI,KAAK;MAAQ,GAAG;MAAG,CAAC,GACzC,iBAAiB,KAAK,SAC3B;;IAEJ,CAAC;GAEe,WAAW;IAC1B,MAAM;IACN,OAAO;IACP,aAAa;IACb,YAAY,KAAK,OAAO,EAAE,CAAC;IAE3B,MAAM,UAAU;AACd,YAAO,KACL,KAAK,UACH,MAAM,KAAK,MAAM,SAAS,CAAC,CAAC,KAAK,CAAC,IAAI,QAAQ;MAAE;MAAI,GAAG;MAAG,EAAE,CAC7D,CACF;;IAEJ,CAAC;GAEyD;EAAE;EAAO"}
1
+ {"version":3,"file":"tasks-C03QbXTx.js","names":[],"sources":["../src/agent/runner/harness/pi/tasks.ts"],"sourcesContent":["/**\n * Task/todo parity for pi (#526). The same four Task tools the anthropic path\n * exposes (TaskCreate/Update/Get/List), as pi `defineTool` tools backed by a\n * shared in-memory store. Every mutation reports the list through `onSync`\n * (a `tasks` progress event), so the todo panel updates live under pi exactly\n * like the anthropic path — the thing that was missing before.\n */\n\nimport { randomUUID } from 'node:crypto';\nimport { Type } from 'typebox';\nimport { defineTool } from '@earendil-works/pi-coding-agent';\nimport type { ToolDefinition } from '@earendil-works/pi-coding-agent';\nimport type { TaskSnapshot } from '../../../progress';\n\nexport type TaskStatus = 'pending' | 'in_progress' | 'completed';\nexport interface TaskEntry {\n content: string;\n status: TaskStatus;\n activeForm?: string;\n}\nexport type TaskStore = Map<string, TaskEntry>;\n\nfunction text(s: string): {\n content: [{ type: 'text'; text: string }];\n details: unknown;\n} {\n return { content: [{ type: 'text', text: s }], details: {} };\n}\n\nfunction snapshot(store: TaskStore, source: string): TaskSnapshot[] {\n return Array.from(store.entries()).map(([id, t]) => ({\n id: `${source}:${id}`,\n source,\n content: t.content,\n status: t.status,\n activeForm: t.activeForm,\n }));\n}\n\n/** Build the four Task tools over a fresh store. `onSync` gets the list after every mutation. */\nexport function createWizardPiTaskTools(\n onSync: (tasks: TaskSnapshot[]) => void = () => undefined,\n): {\n tools: ToolDefinition[];\n store: TaskStore;\n} {\n const store: TaskStore = new Map();\n const source = randomUUID();\n const syncToTui = (): void => onSync(snapshot(store, source));\n\n const taskCreate = defineTool({\n name: 'TaskCreate',\n label: 'Create task',\n description:\n 'Create a task in the shared todo list. Returns its assigned id.',\n promptSnippet:\n 'TaskCreate(content) — add a todo (surfaces progress in the UI)',\n parameters: Type.Object({\n content: Type.String({ description: 'Imperative task description' }),\n activeForm: Type.Optional(\n Type.String({ description: 'Present-continuous form for the spinner' }),\n ),\n }),\n // eslint-disable-next-line @typescript-eslint/require-await -- pi tool contract returns a Promise\n async execute(_id, args) {\n const id = `task-${store.size + 1}`;\n store.set(id, {\n content: args.content,\n status: 'pending',\n activeForm: args.activeForm,\n });\n syncToTui();\n return text(`Created ${id}`);\n },\n });\n\n const taskUpdate = defineTool({\n name: 'TaskUpdate',\n label: 'Update task',\n description:\n 'Update an existing task by id (status, content, or activeForm).',\n promptSnippet:\n 'TaskUpdate(taskId, status) — mark a todo in_progress/completed',\n parameters: Type.Object({\n taskId: Type.String(),\n status: Type.Optional(\n Type.Union([\n Type.Literal('pending'),\n Type.Literal('in_progress'),\n Type.Literal('completed'),\n ]),\n ),\n content: Type.Optional(Type.String()),\n activeForm: Type.Optional(Type.String()),\n }),\n // eslint-disable-next-line @typescript-eslint/require-await -- pi tool contract returns a Promise\n async execute(_id, args) {\n const existing = store.get(args.taskId);\n if (!existing) return text(`No such task: ${args.taskId}`);\n store.set(args.taskId, {\n content: args.content ?? existing.content,\n status: (args.status as TaskStatus) ?? existing.status,\n activeForm: args.activeForm ?? existing.activeForm,\n });\n syncToTui();\n return text(`Updated ${args.taskId}`);\n },\n });\n\n const taskGet = defineTool({\n name: 'TaskGet',\n label: 'Get task',\n description: 'Fetch a single task by id.',\n parameters: Type.Object({ taskId: Type.String() }),\n // eslint-disable-next-line @typescript-eslint/require-await -- pi tool contract returns a Promise\n async execute(_id, args) {\n const t = store.get(args.taskId);\n return text(\n t\n ? JSON.stringify({ id: args.taskId, ...t })\n : `No such task: ${args.taskId}`,\n );\n },\n });\n\n const taskList = defineTool({\n name: 'TaskList',\n label: 'List tasks',\n description: 'List all tasks in the shared todo list.',\n parameters: Type.Object({}),\n // eslint-disable-next-line @typescript-eslint/require-await -- pi tool contract returns a Promise\n async execute() {\n return text(\n JSON.stringify(\n Array.from(store.entries()).map(([id, t]) => ({ id, ...t })),\n ),\n );\n },\n });\n\n return { tools: [taskCreate, taskUpdate, taskGet, taskList], store };\n}\n"],"mappings":";;;;;;;;;;;AAsBA,SAAS,KAAK,GAGZ;AACA,QAAO;EAAE,SAAS,CAAC;GAAE,MAAM;GAAQ,MAAM;GAAG,CAAC;EAAE,SAAS,EAAE;EAAE;;AAG9D,SAAS,SAAS,OAAkB,QAAgC;AAClE,QAAO,MAAM,KAAK,MAAM,SAAS,CAAC,CAAC,KAAK,CAAC,IAAI,QAAQ;EACnD,IAAI,GAAG,OAAO,GAAG;EACjB;EACA,SAAS,EAAE;EACX,QAAQ,EAAE;EACV,YAAY,EAAE;EACf,EAAE;;;AAIL,SAAgB,wBACd,eAAgD,KAAA,GAIhD;CACA,MAAM,wBAAmB,IAAI,KAAK;CAClC,MAAM,SAAS,YAAY;CAC3B,MAAM,kBAAwB,OAAO,SAAS,OAAO,OAAO,CAAC;AA4F7D,QAAO;EAAE,OAAO;GA1FG,WAAW;IAC5B,MAAM;IACN,OAAO;IACP,aACE;IACF,eACE;IACF,YAAY,KAAK,OAAO;KACtB,SAAS,KAAK,OAAO,EAAE,aAAa,+BAA+B,CAAC;KACpE,YAAY,KAAK,SACf,KAAK,OAAO,EAAE,aAAa,2CAA2C,CAAC,CACxE;KACF,CAAC;IAEF,MAAM,QAAQ,KAAK,MAAM;KACvB,MAAM,KAAK,QAAQ,MAAM,OAAO;AAChC,WAAM,IAAI,IAAI;MACZ,SAAS,KAAK;MACd,QAAQ;MACR,YAAY,KAAK;MAClB,CAAC;AACF,gBAAW;AACX,YAAO,KAAK,WAAW,KAAK;;IAE/B,CAAC;GAEiB,WAAW;IAC5B,MAAM;IACN,OAAO;IACP,aACE;IACF,eACE;IACF,YAAY,KAAK,OAAO;KACtB,QAAQ,KAAK,QAAQ;KACrB,QAAQ,KAAK,SACX,KAAK,MAAM;MACT,KAAK,QAAQ,UAAU;MACvB,KAAK,QAAQ,cAAc;MAC3B,KAAK,QAAQ,YAAY;MAC1B,CAAC,CACH;KACD,SAAS,KAAK,SAAS,KAAK,QAAQ,CAAC;KACrC,YAAY,KAAK,SAAS,KAAK,QAAQ,CAAC;KACzC,CAAC;IAEF,MAAM,QAAQ,KAAK,MAAM;KACvB,MAAM,WAAW,MAAM,IAAI,KAAK,OAAO;AACvC,SAAI,CAAC,SAAU,QAAO,KAAK,iBAAiB,KAAK,SAAS;AAC1D,WAAM,IAAI,KAAK,QAAQ;MACrB,SAAS,KAAK,WAAW,SAAS;MAClC,QAAS,KAAK,UAAyB,SAAS;MAChD,YAAY,KAAK,cAAc,SAAS;MACzC,CAAC;AACF,gBAAW;AACX,YAAO,KAAK,WAAW,KAAK,SAAS;;IAExC,CAAC;GAEc,WAAW;IACzB,MAAM;IACN,OAAO;IACP,aAAa;IACb,YAAY,KAAK,OAAO,EAAE,QAAQ,KAAK,QAAQ,EAAE,CAAC;IAElD,MAAM,QAAQ,KAAK,MAAM;KACvB,MAAM,IAAI,MAAM,IAAI,KAAK,OAAO;AAChC,YAAO,KACL,IACI,KAAK,UAAU;MAAE,IAAI,KAAK;MAAQ,GAAG;MAAG,CAAC,GACzC,iBAAiB,KAAK,SAC3B;;IAEJ,CAAC;GAEe,WAAW;IAC1B,MAAM;IACN,OAAO;IACP,aAAa;IACb,YAAY,KAAK,OAAO,EAAE,CAAC;IAE3B,MAAM,UAAU;AACd,YAAO,KACL,KAAK,UACH,MAAM,KAAK,MAAM,SAAS,CAAC,CAAC,KAAK,CAAC,IAAI,QAAQ;MAAE;MAAI,GAAG;MAAG,EAAE,CAC7D,CACF;;IAEJ,CAAC;GAEyD;EAAE;EAAO"}
@@ -1,4 +1,4 @@
1
- import { n as analytics } from "./analytics-GQv--mQm.js";
1
+ import { n as analytics } from "./analytics-Drox5LSW.js";
2
2
  //#region src/shared/utils/telemetry.ts
3
3
  function withProgress(step, callback) {
4
4
  updateProgress(step);
@@ -10,4 +10,4 @@ function updateProgress(step) {
10
10
  //#endregion
11
11
  export { withProgress as t };
12
12
 
13
- //# sourceMappingURL=telemetry-Cwqf0iur.js.map
13
+ //# sourceMappingURL=telemetry-BPBzqsb_.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"telemetry-Cwqf0iur.js","names":[],"sources":["../src/shared/utils/telemetry.ts"],"sourcesContent":["import { analytics } from './analytics';\n\nexport function withProgress<T>(step: string, callback: () => T): T {\n updateProgress(step);\n return callback();\n}\n\nexport function updateProgress(step: string) {\n analytics.setTag('progress', step);\n}\n"],"mappings":";;AAEA,SAAgB,aAAgB,MAAc,UAAsB;AAClE,gBAAe,KAAK;AACpB,QAAO,UAAU;;AAGnB,SAAgB,eAAe,MAAc;AAC3C,WAAU,OAAO,YAAY,KAAK"}
1
+ {"version":3,"file":"telemetry-BPBzqsb_.js","names":[],"sources":["../src/shared/utils/telemetry.ts"],"sourcesContent":["import { analytics } from './analytics';\n\nexport function withProgress<T>(step: string, callback: () => T): T {\n updateProgress(step);\n return callback();\n}\n\nexport function updateProgress(step: string) {\n analytics.setTag('progress', step);\n}\n"],"mappings":";;AAEA,SAAgB,aAAgB,MAAc,UAAsB;AAClE,gBAAe,KAAK;AACpB,QAAO,UAAU;;AAGnB,SAAgB,eAAe,MAAc;AAC3C,WAAU,OAAO,YAAY,KAAK"}
@@ -1,23 +1,23 @@
1
1
  import { n as ErrorCodes } from "./emit-BqLCdV8Y.js";
2
- import { d as relativeToInstallDir, i as getLogFilePath, o as logToFile } from "./debug-BTUMatFI.js";
3
- import { $ as WIZARD_PROVISIONING_SCOPES, A as OAUTH_TIMEOUT_MS, D as ISSUES_URL, F as POSTHOG_ORG_AI_SETTINGS_URL, H as SETUP_REPORT_FILE, I as POSTHOG_PRIVACY_URL, N as POSTHOG_DOCS_URL, O as Integration, V as REPLAY_VISION_SUPPORTED, Y as WIZARD_OAUTH_SCOPES, i as sessionProperties, it as getSkillsBaseUrl, j as POSTHOG_APP_URL, k as OAUTH_PORTS, m as DUMMY_PROJECT_API_KEY, n as analytics, rt as WIZARD_USER_AGENT, z as POSTHOG_TERMS_URL } from "./analytics-GQv--mQm.js";
4
- import { A as getProvisioningScopesForProgram, B as detectSourceMapsProjects, C as oauthErrorFromTokenBody, D as getCommandPath, E as findProgramConfig, G as NO_DEFAULT_LIMIT, H as MANUAL_SDK_VARIANTS, J as detectSelfDrivingIntegrationProjects, K as PRICING_LONG, L as ERROR_TRACKING_PROJECT_PATH_KEY, N as FEATURE_FLAGS_STEP_SKILL_ID, O as getOAuthScopesForProgram, P as FEATURE_FLAGS_UNSUPPORTED, Q as SELF_DRIVING_INTEGRATE_PATH_KEY, R as detectErrorTrackingProjects, S as oauthErrorFromCallbackParams, T as Program, U as SOURCE_MAPS_CONTEXT_KEYS, V as DISPLAY_NAME, X as GITHUB_REQUIRED_MESSAGE, Y as GITHUB_REQUIRED_BODY, Z as POSTHOG_PRESENT_KEY, _ as missingOAuthScopes, at as getAuditChecks, b as buildCallbackErrorHtml, c as buildSession, ct as evaluateWizardReadiness, d as SessionStore, f as applyAgentProgress, g as getOAuthClientId, h as OAuthTokenResponseSchema, it as withScopeAdditions, j as getSubcommandPrograms, k as getProgramConfig, lt as getBlockingServiceKeys, ot as SERVICE_LABELS, q as PRICING_SHORT, rt as CONNECT_SLACK_SCOPE_ADDITIONS, st as SIGNUP_WIZARD_READINESS_CONFIG, v as parseOAuthScopes, x as buildOAuthFailureMessage, y as OAuthError } from "./programs-eTv2T2rs.js";
5
- import "./errors-DhFeR8Sp.js";
6
- import { r as withUtm, t as openTrackedLink } from "./links-5Blqk4Im.js";
7
- import { t as withProgress } from "./telemetry-Cwqf0iur.js";
8
- import { t as detectOrgAndProject } from "./setup-utils-B5E1rXLa.js";
9
- import { r as currentCredentials, s as rotateAfterUnauthorized } from "./oauth-session-CfkZ339p.js";
10
- import { a as getOAuthUrl, i as getIntegrationAuthorizeUrl, s as resolveBaseUrl } from "./urls-BTZhm5eA.js";
11
- import { t as HostResolution } from "./host-resolution-Cht8bL39.js";
12
- import { A as formatCostUsd, C as FRAMEWORK_REGISTRY, E as streamMcpPrompt, c as POSTHOG_SDKS, j as formatTokenCount, k as computeTokenCostUsd, l as STRIPE_SDKS, p as getDetectedWarehouseSources } from "./posthog-integration-DxRkw5DI.js";
13
- import { y as fetchSkillMenu } from "./yara-hooks-BPYhN9WM.js";
14
- import { c as fetchProjectData, l as fetchSlackConnected, n as ApiError, o as fetchGithubConnected, u as fetchUserData } from "./api-WUOSLXPJ.js";
15
- import { n as namesWithStatus, o as summarizeFailure, t as isOk } from "./results-C45prSKD.js";
16
- import { f as getKindMeta, l as MCP_TUTORIAL_SCOPE_ADDITIONS, n as getTool, p as fetchHealthIssues } from "./tools-C8k90ISV.js";
17
- import { n as AVAILABLE_FEATURES, o as isAllFeaturesSelected, t as ALL_FEATURE_VALUES } from "./defaults-DDVl3tKN.js";
18
- import { n as provisionNewAccount, r as requestDeepLink, t as ProvisionedAccountUnreadableError } from "./provisioning-c5JJ30KX.js";
19
- import { r as wizardAbort } from "./wizard-abort-HtpiSsQO.js";
20
- import { a as useStdoutDimensions, c as wrapAndTruncate, d as isObjectBlock, f as ConfirmButton, h as Icons, i as useKeyboardHintsContext, l as isClearBlock, m as Colors, n as useKeyBindings, o as computeVisibleRange, p as PromptLabel, r as KeyboardHintsProvider, s as wordWrap, t as PickerMenu, u as isLinesBlock } from "./PickerMenu-BGGeYqd-.js";
2
+ import { d as relativeToInstallDir, i as getLogFilePath, o as logToFile } from "./debug-BfO_Txo8.js";
3
+ import { A as OAUTH_PORTS, B as POSTHOG_TERMS_URL, H as REPLAY_VISION_SUPPORTED, I as POSTHOG_ORG_AI_SETTINGS_URL, L as POSTHOG_PRIVACY_URL, M as POSTHOG_APP_URL, O as ISSUES_URL, P as POSTHOG_DOCS_URL, U as SETUP_REPORT_FILE, X as WIZARD_OAUTH_SCOPES, at as getSkillsBaseUrl, et as WIZARD_PROVISIONING_SCOPES, h as DUMMY_PROJECT_API_KEY, i as sessionProperties, it as WIZARD_USER_AGENT, j as OAUTH_TIMEOUT_MS, k as Integration, n as analytics } from "./analytics-Drox5LSW.js";
4
+ import { $ as SELF_DRIVING_INTEGRATE_PATH_KEY, A as getProgramConfig, C as oauthErrorFromTokenBody, D as findProgramConfig, E as Program, F as FEATURE_FLAGS_UNSUPPORTED, H as DISPLAY_NAME, J as PRICING_SHORT, K as NO_DEFAULT_LIMIT, M as getSubcommandPrograms, O as getCommandPath, P as FEATURE_FLAGS_STEP_SKILL_ID, Q as POSTHOG_PRESENT_KEY, R as ERROR_TRACKING_PROJECT_PATH_KEY, S as oauthErrorFromCallbackParams, U as MANUAL_SDK_VARIANTS, V as detectSourceMapsProjects, W as SOURCE_MAPS_CONTEXT_KEYS, X as GITHUB_REQUIRED_BODY, Y as detectSelfDrivingIntegrationProjects, Z as GITHUB_REQUIRED_MESSAGE, _ as missingOAuthScopes, at as withScopeAdditions, b as buildCallbackErrorHtml, c as buildSession, ct as SIGNUP_WIZARD_READINESS_CONFIG, d as SessionStore, f as applyAgentProgress, g as getOAuthClientId, h as OAuthTokenResponseSchema, it as CONNECT_SLACK_SCOPE_ADDITIONS, j as getProvisioningScopesForProgram, k as getOAuthScopesForProgram, lt as evaluateWizardReadiness, ot as getAuditChecks, q as PRICING_LONG, st as SERVICE_LABELS, ut as getBlockingServiceKeys, v as parseOAuthScopes, w as reportCodebaseScan, x as buildOAuthFailureMessage, y as OAuthError, z as detectErrorTrackingProjects } from "./programs-mxhRXwP-.js";
5
+ import "./errors-BXlWujEw.js";
6
+ import { r as withUtm, t as openTrackedLink } from "./links-CatXPRxH.js";
7
+ import { t as withProgress } from "./telemetry-BPBzqsb_.js";
8
+ import { t as detectOrgAndProject } from "./setup-utils-CQY8PHjR.js";
9
+ import { r as currentCredentials, s as rotateAfterUnauthorized } from "./oauth-session-9EU3ky0v.js";
10
+ import { a as getOAuthUrl, i as getIntegrationAuthorizeUrl, s as resolveBaseUrl } from "./urls-WeqfBLP4.js";
11
+ import { t as HostResolution } from "./host-resolution-DftfSjJD.js";
12
+ import { A as streamMcpPrompt, D as FRAMEWORK_REGISTRY, F as formatTokenCount, N as computeTokenCostUsd, P as formatCostUsd, c as STRIPE_SDKS, d as scanCodebaseFor, m as getDetectedWarehouseSources, s as POSTHOG_SDKS } from "./posthog-integration-mIQGBc1f.js";
13
+ import { b as fetchSkillMenu } from "./yara-hooks-aDbdsitJ.js";
14
+ import { c as fetchProjectData, l as fetchSlackConnected, n as ApiError, o as fetchGithubConnected, u as fetchUserData } from "./api-Dfu655Qt.js";
15
+ import { n as namesWithStatus, o as summarizeFailure, t as isOk } from "./results-5yCKf2cI.js";
16
+ import { f as getKindMeta, l as MCP_TUTORIAL_SCOPE_ADDITIONS, n as getTool, p as fetchHealthIssues } from "./tools-D_AtrhbO.js";
17
+ import { n as AVAILABLE_FEATURES, o as isAllFeaturesSelected, t as ALL_FEATURE_VALUES } from "./defaults-BWLIffh5.js";
18
+ import { n as provisionNewAccount, r as requestDeepLink, t as ProvisionedAccountUnreadableError } from "./provisioning-CHUjae9V.js";
19
+ import { r as wizardAbort } from "./wizard-abort-BwEefm6P.js";
20
+ import { a as useStdoutDimensions, c as wrapAndTruncate, d as isObjectBlock, f as ConfirmButton, h as Icons, i as useKeyboardHintsContext, l as isClearBlock, m as Colors, n as useKeyBindings, o as computeVisibleRange, p as PromptLabel, r as KeyboardHintsProvider, s as wordWrap, t as PickerMenu, u as isLinesBlock } from "./PickerMenu-BtheKi1o.js";
21
21
  import * as fs$1 from "fs";
22
22
  import path from "path";
23
23
  import { join as join$1 } from "node:path";
@@ -1923,7 +1923,7 @@ const PrivacyPanel = ({ canOptOut = false } = {}) => {
1923
1923
  }),
1924
1924
  canOptOut && /* @__PURE__ */ jsx(Box, {
1925
1925
  marginTop: 1,
1926
- children: /* @__PURE__ */ jsx(Text, { children: "We also read dependency files and .env variable names to discover tools we can connect to and integrate with. We share that list with PostHog to suggest features. You can opt out of sharing below." })
1926
+ children: /* @__PURE__ */ jsx(Text, { children: "We also read your file tree, dependency files, templates, and .env variable names, never values, to find this project's tools and pick the right setup. We share each tool with PostHog to improve our products, with the file and name that matched it, and the setup we chose, such as the framework. You can opt out of sharing below." })
1927
1927
  })
1928
1928
  ]
1929
1929
  });
@@ -7269,6 +7269,56 @@ const getContentBlocks$1 = (store) => [
7269
7269
  }
7270
7270
  ];
7271
7271
  //#endregion
7272
+ //#region src/tui/components/sharing-options.ts
7273
+ /**
7274
+ * A blank, unselectable row. Navigation skips disabled options, so this is a
7275
+ * margin the menu can hold rather than one the layout has to special-case.
7276
+ */
7277
+ const MENU_SPACER = {
7278
+ label: "",
7279
+ value: "spacer",
7280
+ disabled: true
7281
+ };
7282
+ /**
7283
+ * The sharing choice, as two explicit rows rather than one toggle. A toggle
7284
+ * label has to describe either the current state or the next action, and a
7285
+ * reader cannot tell which; two rows with the filled diamond on the live one
7286
+ * say both at once. The trailing spacer separates them from the Back that
7287
+ * IntroScreenLayout appends, since leaving the screen is a different kind of
7288
+ * act from changing something on it.
7289
+ */
7290
+ function sharingOptions(sharing) {
7291
+ const mark = (on) => ({ glyph: on ? Icons.diamond : Icons.diamondOpen });
7292
+ return [
7293
+ {
7294
+ label: "Share tools",
7295
+ value: "share",
7296
+ icon: mark(sharing)
7297
+ },
7298
+ {
7299
+ label: "Don't share tools",
7300
+ value: "no-share",
7301
+ icon: mark(!sharing)
7302
+ },
7303
+ MENU_SPACER
7304
+ ];
7305
+ }
7306
+ /** Sharing is on by default, so only an explicit decline turns it off. */
7307
+ function isSharing(store) {
7308
+ return store.session.scanConsent !== "declined";
7309
+ }
7310
+ /** Apply a sharing row the user picked. Returns false for any other value. */
7311
+ function applySharingChoice(store, value) {
7312
+ if (value === "share") store.grantSharing();
7313
+ else if (value === "no-share") store.declineSharing();
7314
+ else return false;
7315
+ return true;
7316
+ }
7317
+ /** Continue with no choice made means sharing, the default. A choice already made stands. */
7318
+ function resolveSharingOnContinue(store) {
7319
+ if (store.session.scanConsent === "undecided") store.grantSharing();
7320
+ }
7321
+ //#endregion
7272
7322
  //#region src/tui/programs/posthog-integration/intro-menu.ts
7273
7323
  const CONTINUE_LABEL = "Continue";
7274
7324
  const CONTINUE_ANYWAY_LABEL = "Continue anyway";
@@ -7368,39 +7418,6 @@ const SUBTITLE = /* @__PURE__ */ jsxs(Fragment$1, { children: [
7368
7418
  children: ".env* values stay on your machine."
7369
7419
  })
7370
7420
  ] });
7371
- /**
7372
- * A blank, unselectable row. Navigation skips disabled options, so this is a
7373
- * margin the menu can hold rather than one the layout has to special-case.
7374
- */
7375
- const MENU_SPACER = {
7376
- label: "",
7377
- value: "spacer",
7378
- disabled: true
7379
- };
7380
- /**
7381
- * The sharing choice, as two explicit rows rather than one toggle. A toggle
7382
- * label has to describe either the current state or the next action, and a
7383
- * reader cannot tell which; two rows with the filled diamond on the live one
7384
- * say both at once. The trailing spacer separates them from the Back that
7385
- * IntroScreenLayout appends, since leaving the screen is a different kind of
7386
- * act from changing something on it.
7387
- */
7388
- function sharingOptions(sharing) {
7389
- const mark = (on) => ({ glyph: on ? Icons.diamond : Icons.diamondOpen });
7390
- return [
7391
- {
7392
- label: "Share tools",
7393
- value: "share",
7394
- icon: mark(sharing)
7395
- },
7396
- {
7397
- label: "Don't share tools",
7398
- value: "no-share",
7399
- icon: mark(!sharing)
7400
- },
7401
- MENU_SPACER
7402
- ];
7403
- }
7404
7421
  /** Framework picker shown when auto-detection fails. */
7405
7422
  const FrameworkPicker = ({ store, onComplete }) => {
7406
7423
  return /* @__PURE__ */ jsx(PickerMenu, {
@@ -7413,7 +7430,7 @@ const FrameworkPicker = ({ store, onComplete }) => {
7413
7430
  })),
7414
7431
  onSelect: (value) => {
7415
7432
  const integration = Array.isArray(value) ? value[0] : value;
7416
- import("./programs-D2793-PK.js").then(({ FRAMEWORK_REGISTRY }) => {
7433
+ import("./programs-Bv0_YHzE.js").then(({ FRAMEWORK_REGISTRY }) => {
7417
7434
  const config = FRAMEWORK_REGISTRY[integration];
7418
7435
  store.setFrameworkConfig(integration, config);
7419
7436
  store.setDetectedFramework(config.metadata.name);
@@ -7428,7 +7445,7 @@ const PostHogIntegrationIntroScreen = ({ store }) => {
7428
7445
  const [manuallySelected, setManuallySelected] = useState(false);
7429
7446
  const [view, setView] = useState("default");
7430
7447
  const { session } = store;
7431
- const sharing = session.scanConsent !== "declined";
7448
+ const sharing = isSharing(store);
7432
7449
  const config = session.frameworkConfig;
7433
7450
  const frameworkLabel = session.detectedFrameworkLabel ?? config?.metadata.name;
7434
7451
  const { skillEntry, fetchFailed } = useSkillEntry(session.skillId);
@@ -7618,10 +7635,9 @@ const PostHogIntegrationIntroScreen = ({ store }) => {
7618
7635
  } else if (value === "more-info") setView("more-info");
7619
7636
  else if (value === "commands") setView("commands");
7620
7637
  else if (value === "back") setView("default");
7621
- else if (value === "share") store.grantSharing();
7622
- else if (value === "no-share") store.declineSharing();
7638
+ else if (applySharingChoice(store, value)) return;
7623
7639
  else if (value === "continue") {
7624
- if (session.scanConsent === "undecided") store.grantSharing();
7640
+ resolveSharingOnContinue(store);
7625
7641
  store.completeSetup();
7626
7642
  }
7627
7643
  };
@@ -8532,11 +8548,16 @@ const SelfDrivingIntroScreen = ({ store }) => {
8532
8548
  programLabel: store.programLabel,
8533
8549
  skillId: session.skillId,
8534
8550
  menuOptions,
8551
+ privacyOptions: sharingOptions(isSharing(store)),
8535
8552
  onSelect: (value) => {
8553
+ if (applySharingChoice(store, value)) return;
8536
8554
  if (value === "cancel") store.requestExit(0);
8537
8555
  else if (value === "more-info") setShowingMoreInfo(true);
8538
8556
  else if (value === "back") setShowingMoreInfo(false);
8539
- else store.completeSetup();
8557
+ else {
8558
+ resolveSharingOnContinue(store);
8559
+ store.completeSetup();
8560
+ }
8540
8561
  }
8541
8562
  });
8542
8563
  };
@@ -9574,12 +9595,17 @@ const WarehouseIntroScreen = ({ store }) => {
9574
9595
  programLabel: store.programLabel,
9575
9596
  skillId: session.skillId,
9576
9597
  menuOptions,
9598
+ privacyOptions: sharingOptions(isSharing(store)),
9577
9599
  errorView,
9578
9600
  onSelect: (value) => {
9601
+ if (applySharingChoice(store, value)) return;
9579
9602
  if (value === "cancel") store.requestExit(0);
9580
9603
  else if (value === "more-info") setShowingMoreInfo(true);
9581
9604
  else if (value === "back") setShowingMoreInfo(false);
9582
- else store.completeSetup();
9605
+ else {
9606
+ resolveSharingOnContinue(store);
9607
+ store.completeSetup();
9608
+ }
9583
9609
  }
9584
9610
  });
9585
9611
  };
@@ -15828,7 +15854,10 @@ var WizardStore = class {
15828
15854
  * the session is set, so it sees the real installDir.
15829
15855
  */
15830
15856
  async runReadyHooks() {
15831
- await findProgramConfig(this.router.activeProgram)?.onReady?.(this.sessions.readyContext());
15857
+ const config = findProgramConfig(this.router.activeProgram);
15858
+ const ctx = this.sessions.readyContext();
15859
+ if (config) await scanCodebaseFor(config, ctx);
15860
+ await config?.onReady?.(ctx);
15832
15861
  this.sessions.setDetectionComplete();
15833
15862
  }
15834
15863
  /**
@@ -16050,7 +16079,7 @@ var WizardStore = class {
16050
16079
  }
16051
16080
  /** Sets setupConfirmed, and is the point consent becomes final. */
16052
16081
  completeSetup() {
16053
- this.sessions.markWarehouseSourcesReportedIfNeeded();
16082
+ reportCodebaseScan(this.sessions);
16054
16083
  analytics.wizardCapture("setup confirmed", sessionProperties(this.session));
16055
16084
  this._write({ setupConfirmed: true });
16056
16085
  }
@@ -16571,4 +16600,4 @@ function releaseTerminal() {
16571
16600
  //#endregion
16572
16601
  export { AUDIT_AREA_SLIDES as A, totalTokenCount as B, assembleProfile as C, getTuiProgram as D, IssueTable as E, ContentSequencer as F, ModalOverlay as G, LogViewer as H, HNViewer as I, ProgressList as J, ConfirmationInput as K, TabContainer as L, IntroScreenLayout as M, PRIVACY_PANEL_LABEL as N, displayProgress as O, PrivacyPanel as P, getContentBlocks$6 as Q, ScreenContainer as R, McpSuggestedPromptsScreen as S, McpScreen as T, LinkText as U, EventPlanViewer as V, extractUrls as W, SplitView as X, LoadingBox as Y, CardLayout as Z, getTuiTool as _, SlackConnectScreen as a, extractOAuthCode as b, LearnCard as c, MINT_FAILURE_BODY as d, MINT_FAILURE_CONTACT as f, listFlowOwners as g, flowOwner as h, OutroScreen as i, AuditChecksViewer as j, useDismissOnAnyKey as k, AiOptInRequiredScreen as l, isRunFailure as m, releaseTerminal as n, TipsCard as o, MINT_FAILURE_MESSAGE as p, GroupedPickerMenu as q, WizardStore as r, VisualizerTab as s, enterDarkTerminal as t, ServiceHealthList as u, seededProfile as v, TAILORED_ROLES as w, abortOnScreens as x, getOrAskForProjectData as y, ViewportTooSmall as z };
16573
16602
 
16574
- //# sourceMappingURL=terminal-BLL-X6YP.js.map
16603
+ //# sourceMappingURL=terminal-DZsYFbm9.js.map