@posthog/wizard 2.82.0 → 2.83.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 (121) hide show
  1. package/dist/{agent-interface-3YfIWZmY.js → agent-interface-fcDXqb-_.js} +84 -30
  2. package/dist/agent-interface-fcDXqb-_.js.map +1 -0
  3. package/dist/{agent-prompt-loader-hOHONY7u.js → agent-prompt-loader-F9gGPMt0.js} +6 -6
  4. package/dist/{agent-prompt-loader-hOHONY7u.js.map → agent-prompt-loader-F9gGPMt0.js.map} +1 -1
  5. package/dist/analytics-C9QnGvuc.js +2 -0
  6. package/dist/{analytics-B_xFshPY.js → analytics-GQv--mQm.js} +4 -3
  7. package/dist/analytics-GQv--mQm.js.map +1 -0
  8. package/dist/api-CsXfZKkq.js +2 -0
  9. package/dist/{api-C_9KsN-7.js → api-WUOSLXPJ.js} +2 -2
  10. package/dist/{api-C_9KsN-7.js.map → api-WUOSLXPJ.js.map} +1 -1
  11. package/dist/api-key-login-CDSxsYtP.js +2 -0
  12. package/dist/{api-key-login-oUJQDmOV.js → api-key-login-tysMeZnR.js} +5 -5
  13. package/dist/{api-key-login-oUJQDmOV.js.map → api-key-login-tysMeZnR.js.map} +1 -1
  14. package/dist/bin.js +1 -1
  15. package/dist/{bounded-fs-iRaQcKYL.js → bounded-fs-B31zq2ir.js} +3 -3
  16. package/dist/{bounded-fs-iRaQcKYL.js.map → bounded-fs-B31zq2ir.js.map} +1 -1
  17. package/dist/{ci-install-BGlijoTo.js → ci-install-CYSFbFXd.js} +4 -4
  18. package/dist/{ci-install-BGlijoTo.js.map → ci-install-CYSFbFXd.js.map} +1 -1
  19. package/dist/{debug-BvEbemym.js → debug-BTUMatFI.js} +3 -3
  20. package/dist/{debug-BvEbemym.js.map → debug-BTUMatFI.js.map} +1 -1
  21. package/dist/{gateway-CWoYlPz7.js → gateway-CJ8Jqbll.js} +20 -6
  22. package/dist/{gateway-CWoYlPz7.js.map → gateway-CJ8Jqbll.js.map} +1 -1
  23. package/dist/{headless-Gisv3faN.js → headless-DZ3mq07K.js} +1 -1
  24. package/dist/{headless-Bfi950Qh.js → headless-le-QqOuj.js} +2 -2
  25. package/dist/{headless-Bfi950Qh.js.map → headless-le-QqOuj.js.map} +1 -1
  26. package/dist/{host-resolution-BxnNn8Jm.js → host-resolution-Cht8bL39.js} +4 -4
  27. package/dist/{host-resolution-BxnNn8Jm.js.map → host-resolution-Cht8bL39.js.map} +1 -1
  28. package/dist/{install-CX65IxGa.js → install-55JbRsO-.js} +1 -1
  29. package/dist/{install-CDVeUT_5.js → install-BhnFP3p3.js} +5 -5
  30. package/dist/{install-CDVeUT_5.js.map → install-BhnFP3p3.js.map} +1 -1
  31. package/dist/{interactive-5-Numwwb.js → interactive-9qRL8259.js} +3 -3
  32. package/dist/{interactive-5-Numwwb.js.map → interactive-9qRL8259.js.map} +1 -1
  33. package/dist/{links-Dmj3Wj9X.js → links-5Blqk4Im.js} +3 -3
  34. package/dist/{links-Dmj3Wj9X.js.map → links-5Blqk4Im.js.map} +1 -1
  35. package/dist/{main-5KNn80Vt.js → main-CUIcozEG.js} +24 -21
  36. package/dist/main-CUIcozEG.js.map +1 -0
  37. package/dist/{mcp-Buf9sfFm.js → mcp-D73aCOHK.js} +3 -3
  38. package/dist/{mcp-Buf9sfFm.js.map → mcp-D73aCOHK.js.map} +1 -1
  39. package/dist/{mcp-prompt-streaming-DHPxJK-F.js → mcp-prompt-streaming-B5lIQ0l1.js} +5 -5
  40. package/dist/{mcp-prompt-streaming-DHPxJK-F.js.map → mcp-prompt-streaming-B5lIQ0l1.js.map} +1 -1
  41. package/dist/{models-C9rjXPZ6.js → models-CLTglHFZ.js} +6 -2
  42. package/dist/models-CLTglHFZ.js.map +1 -0
  43. package/dist/{oauth-session-Bi1MLRCC.js → oauth-session-CfkZ339p.js} +2 -2
  44. package/dist/{oauth-session-Bi1MLRCC.js.map → oauth-session-CfkZ339p.js.map} +1 -1
  45. package/dist/{orchestrator-tools-DyKws92o.js → orchestrator-tools-lvNVQhzs.js} +3 -3
  46. package/dist/{orchestrator-tools-DyKws92o.js.map → orchestrator-tools-lvNVQhzs.js.map} +1 -1
  47. package/dist/{package-manager-DpCdmMmB.js → package-manager-BqRNp5y_.js} +4 -4
  48. package/dist/{package-manager-DpCdmMmB.js.map → package-manager-BqRNp5y_.js.map} +1 -1
  49. package/dist/{pi-DTj1hsJe.js → pi-2pYz2OY3.js} +43 -23
  50. package/dist/pi-2pYz2OY3.js.map +1 -0
  51. package/dist/{playground-CiH6zZPb.js → playground-jxZNxRwC.js} +4 -4
  52. package/dist/{playground-CiH6zZPb.js.map → playground-jxZNxRwC.js.map} +1 -1
  53. package/dist/{posthog-integration-CpinLWNO.js → posthog-integration-DxRkw5DI.js} +21 -21
  54. package/dist/{posthog-integration-CpinLWNO.js.map → posthog-integration-DxRkw5DI.js.map} +1 -1
  55. package/dist/programs-D2793-PK.js +3 -0
  56. package/dist/{programs-Bq9Ju9xk.js → programs-eTv2T2rs.js} +129 -54
  57. package/dist/programs-eTv2T2rs.js.map +1 -0
  58. package/dist/provisioning-CtQ0GEHa.js +2 -0
  59. package/dist/{provisioning-D-AM_7DG.js → provisioning-c5JJ30KX.js} +4 -4
  60. package/dist/{provisioning-D-AM_7DG.js.map → provisioning-c5JJ30KX.js.map} +1 -1
  61. package/dist/{queue-tools-BoIITT7w.js → queue-tools-10w8lhEs.js} +14 -5
  62. package/dist/queue-tools-10w8lhEs.js.map +1 -0
  63. package/dist/{results-CDqlHogZ.js → results-C45prSKD.js} +2 -2
  64. package/dist/{results-CDqlHogZ.js.map → results-C45prSKD.js.map} +1 -1
  65. package/dist/{run-DcaVJSeI.js → run-CM24OgPF.js} +10 -10
  66. package/dist/{run-DcaVJSeI.js.map → run-CM24OgPF.js.map} +1 -1
  67. package/dist/{run-CfMArkpV.js → run-jugssomh.js} +7 -7
  68. package/dist/{run-CfMArkpV.js.map → run-jugssomh.js.map} +1 -1
  69. package/dist/run-tool-BZFgFb_2.js +2 -0
  70. package/dist/{run-tool-DJZWnnR9.js → run-tool-DZrZFoGq.js} +13 -13
  71. package/dist/{run-tool-DJZWnnR9.js.map → run-tool-DZrZFoGq.js.map} +1 -1
  72. package/dist/{runners-Cvnk9BcA.js → runners-CoIYt0iI.js} +8 -8
  73. package/dist/{runners-Cvnk9BcA.js.map → runners-CoIYt0iI.js.map} +1 -1
  74. package/dist/{security-Cz3a-d7r.js → security-ppK2MwCn.js} +6 -5
  75. package/dist/{security-Cz3a-d7r.js.map → security-ppK2MwCn.js.map} +1 -1
  76. package/dist/{setup-utils-C7kaDP5X.js → setup-utils-B5E1rXLa.js} +3 -3
  77. package/dist/{setup-utils-C7kaDP5X.js.map → setup-utils-B5E1rXLa.js.map} +1 -1
  78. package/dist/{start-playground-B62_pYfu.js → start-playground-DujiUNFT.js} +7 -7
  79. package/dist/{start-playground-B62_pYfu.js.map → start-playground-DujiUNFT.js.map} +1 -1
  80. package/dist/{subagent-BBfETG17.js → subagent-BdDWA8j5.js} +12 -4
  81. package/dist/subagent-BdDWA8j5.js.map +1 -0
  82. package/dist/{task-CmNe3xeg.js → task-Y8lWoDE7.js} +34 -23
  83. package/dist/task-Y8lWoDE7.js.map +1 -0
  84. package/dist/{telemetry-DKM7VGuJ.js → telemetry-Cwqf0iur.js} +2 -2
  85. package/dist/{telemetry-DKM7VGuJ.js.map → telemetry-Cwqf0iur.js.map} +1 -1
  86. package/dist/{terminal-Bkxwzkhn.js → terminal-BLL-X6YP.js} +397 -36
  87. package/dist/terminal-BLL-X6YP.js.map +1 -0
  88. package/dist/{tools-DZCEvDv9.js → tools-C8k90ISV.js} +13 -13
  89. package/dist/{tools-DZCEvDv9.js.map → tools-C8k90ISV.js.map} +1 -1
  90. package/dist/{tools-Bm0FDT6f.js → tools-g42e5kJz.js} +8 -8
  91. package/dist/{tools-Bm0FDT6f.js.map → tools-g42e5kJz.js.map} +1 -1
  92. package/dist/{tui-tKI95MSr.js → tui-BPWJ-J-k.js} +1 -1
  93. package/dist/{tui-B56jvkbi.js → tui-CBnRWnrm.js} +4 -4
  94. package/dist/tui-CBnRWnrm.js.map +1 -0
  95. package/dist/{upload-step-DqTgn6UB.js → upload-step-CFoxwd5t.js} +3 -3
  96. package/dist/{upload-step-DqTgn6UB.js.map → upload-step-CFoxwd5t.js.map} +1 -1
  97. package/dist/{urls-B82v7gfO.js → urls-BTZhm5eA.js} +2 -2
  98. package/dist/{urls-B82v7gfO.js.map → urls-BTZhm5eA.js.map} +1 -1
  99. package/dist/{wizard-abort-Cd-7sfCw.js → wizard-abort-HtpiSsQO.js} +4 -4
  100. package/dist/{wizard-abort-Cd-7sfCw.js.map → wizard-abort-HtpiSsQO.js.map} +1 -1
  101. package/dist/{yara-hooks-BS0n3ekf.js → yara-hooks-BPYhN9WM.js} +4 -4
  102. package/dist/{yara-hooks-BS0n3ekf.js.map → yara-hooks-BPYhN9WM.js.map} +1 -1
  103. package/dist/{yara-hooks-CxksH-GZ.js → yara-hooks-BwhEDXIt.js} +1 -1
  104. package/package.json +1 -1
  105. package/dist/agent-interface-3YfIWZmY.js.map +0 -1
  106. package/dist/analytics-B_xFshPY.js.map +0 -1
  107. package/dist/analytics-DGDr6-iD.js +0 -2
  108. package/dist/api-DhLSO3ai.js +0 -2
  109. package/dist/api-key-login-DiRuZ8Lm.js +0 -2
  110. package/dist/main-5KNn80Vt.js.map +0 -1
  111. package/dist/models-C9rjXPZ6.js.map +0 -1
  112. package/dist/pi-DTj1hsJe.js.map +0 -1
  113. package/dist/programs-Bq9Ju9xk.js.map +0 -1
  114. package/dist/programs-CnOSdQo1.js +0 -3
  115. package/dist/provisioning-D6Cqbc36.js +0 -2
  116. package/dist/queue-tools-BoIITT7w.js.map +0 -1
  117. package/dist/run-tool-zMLQroVh.js +0 -2
  118. package/dist/subagent-BBfETG17.js.map +0 -1
  119. package/dist/task-CmNe3xeg.js.map +0 -1
  120. package/dist/terminal-Bkxwzkhn.js.map +0 -1
  121. package/dist/tui-B56jvkbi.js.map +0 -1
@@ -1,5 +1,5 @@
1
- import { o as logToFile } from "./debug-BvEbemym.js";
2
- import { a as gatewayTerminalFailure } from "./gateway-CWoYlPz7.js";
1
+ import { o as logToFile } from "./debug-BTUMatFI.js";
2
+ import { a as gatewayTerminalFailure, s as AgentSignals, u as policyAbortReason } from "./gateway-CJ8Jqbll.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
@@ -87,16 +87,24 @@ function createDispatchAgentTool(ctx) {
87
87
  });
88
88
  let result = "";
89
89
  let finalTurn;
90
+ let refusal;
90
91
  const unsub = child.subscribe((e) => {
91
92
  if (e.type === "message_end") {
92
- if (e.message?.role === "assistant") finalTurn = e.message;
93
+ const assistant = e.message?.role === "assistant";
94
+ if (assistant) finalTurn = e.message;
93
95
  const t = extractText(e.message).trim();
94
96
  if (t) result = t;
97
+ const reason = assistant && !refusal && policyAbortReason(t);
98
+ if (reason) {
99
+ refusal = `${AgentSignals.POLICY_ABORT} ${reason}`;
100
+ child.abort();
101
+ }
95
102
  }
96
103
  });
97
104
  logToFile(`[pi] subagent dispatch: ${args.description}`);
98
105
  try {
99
106
  await child.prompt(args.prompt);
107
+ if (refusal) return text(refusal);
100
108
  const failure = gatewayTerminalFailure(finalTurn);
101
109
  if (failure) throw new Error(`Subagent failed: ${failure.message}`);
102
110
  } finally {
@@ -110,4 +118,4 @@ function createDispatchAgentTool(ctx) {
110
118
  //#endregion
111
119
  export { createDispatchAgentTool };
112
120
 
113
- //# sourceMappingURL=subagent-BBfETG17.js.map
121
+ //# sourceMappingURL=subagent-BdDWA8j5.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subagent-BdDWA8j5.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 /** Registry holding the gateway provider. */\n modelRegistry: import('@earendil-works/pi-coding-agent').ModelRegistry;\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 modelRegistry: ctx.modelRegistry,\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,eAAe,IAAI;IACnB,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-BvEbemym.js";
3
- import { $ as WIZARD_REMARK_EVENT_NAME, it as wizardUserAgentForProgram, n as analytics } from "./analytics-B_xFshPY.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
4
  import { t as classifyRunFailure } from "./errors-DhFeR8Sp.js";
5
- import { n as currentAccessToken } from "./oauth-session-Bi1MLRCC.js";
6
- import { c as REMARK_INSTRUCTION, d as gatewayAuth, o as withGatewayRemint, r as buildGatewayProvider, t as GATEWAY_PROVIDER } from "./gateway-CWoYlPz7.js";
7
- import { g as assembleCommandments, h as AgentOutputSignals } from "./agent-interface-3YfIWZmY.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-DTj1hsJe.js";
9
- import { g as TaskStatus } from "./queue-tools-BoIITT7w.js";
10
- import { c as queueTools, l as renderToolInventory, r as allowsPostHogMcp } from "./agent-prompt-loader-hOHONY7u.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";
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 —
@@ -98,8 +98,7 @@ const SEED_NUDGE = "The queue is still empty. Seed it now with enqueue_task call
98
98
  /** Whether this unit of work has reached its terminal state. */
99
99
  function isSettled(ctx) {
100
100
  if (!ctx.currentTaskId) return ctx.store.list().length > 0;
101
- const task = ctx.store.get(ctx.currentTaskId);
102
- return !!task && (task.status === TaskStatus.Done || task.status === TaskStatus.Failed || task.status === TaskStatus.Skipped);
101
+ return taskReported(ctx);
103
102
  }
104
103
  async function runPiTask(inputs) {
105
104
  if (inputs.signal?.aborted) return {
@@ -125,8 +124,9 @@ async function runPiTask(inputs) {
125
124
  duration_seconds: Math.round(durationMs / 1e3)
126
125
  };
127
126
  };
128
- const captureAborted = (failureMode) => analytics.wizardCapture("agent aborted", {
127
+ const captureAborted = (failureMode, source) => analytics.wizardCapture("agent aborted", {
129
128
  failure_mode: failureMode,
129
+ ...source && { source },
130
130
  ...runDurations(),
131
131
  model: modelId,
132
132
  ...analyticsProperties
@@ -134,6 +134,8 @@ async function runPiTask(inputs) {
134
134
  let mcpCleanup;
135
135
  let aioFailed = true;
136
136
  let cancellation;
137
+ let abortReason;
138
+ let remarkTurn = false;
137
139
  try {
138
140
  const { createAgentSession, DefaultResourceLoader, SessionManager, AuthStorage, ModelRegistry, getAgentDir, createLsToolDefinition, createFindToolDefinition, createGrepToolDefinition, createBashToolDefinition, createReadToolDefinition, createEditToolDefinition, createWriteToolDefinition } = await import("@earendil-works/pi-coding-agent");
139
141
  const refreshAuth = async () => gatewayAuth(boot.credentials.host, await currentAccessToken(boot.credentials), boot.programId);
@@ -157,19 +159,19 @@ async function runPiTask(inputs) {
157
159
  message: "pi: gateway model could not be resolved"
158
160
  };
159
161
  const askState = { pending: false };
160
- const { createSecurityExtension } = await import("./security-Cz3a-d7r.js");
162
+ const { createSecurityExtension } = await import("./security-ppK2MwCn.js");
161
163
  const security = createSecurityExtension({
162
164
  disallowedTools: fenceDisallowList(disallowedTools),
163
165
  triageProvider: boot.triageProvider,
164
166
  getWizardAskPending: () => askState.pending,
165
167
  workingDirectory: input.installDir
166
168
  });
167
- const { prewarmYaraScanner } = await import("./yara-hooks-CxksH-GZ.js");
169
+ const { prewarmYaraScanner } = await import("./yara-hooks-BwhEDXIt.js");
168
170
  prewarmYaraScanner();
169
171
  const extensionFactories = [security.factory];
170
172
  let posthogMcp = false;
171
173
  if (allowsPostHogMcp(allowedTools)) try {
172
- const { setupPostHogMcp } = await import("./mcp-Buf9sfFm.js");
174
+ const { setupPostHogMcp } = await import("./mcp-D73aCOHK.js");
173
175
  const mcp = await setupPostHogMcp({
174
176
  mcpUrl: boot.credentials.host.mcpUrl,
175
177
  accessToken: await currentAccessToken(boot.credentials),
@@ -225,7 +227,7 @@ async function runPiTask(inputs) {
225
227
  find: () => withMode(createFindToolDefinition(dir), "parallel"),
226
228
  grep: () => withMode(createGrepToolDefinition(dir), "parallel")
227
229
  }).filter(([name]) => codingTools.has(name)).map(([, make]) => make());
228
- const { createWizardPiTools } = await import("./tools-Bm0FDT6f.js");
230
+ const { createWizardPiTools } = await import("./tools-g42e5kJz.js");
229
231
  const wizardToolNames = allowedPiWizardTools(allowedTools);
230
232
  const wizardTools = createWizardPiTools({
231
233
  workingDirectory: dir,
@@ -240,7 +242,7 @@ async function runPiTask(inputs) {
240
242
  askState.pending = pending;
241
243
  }
242
244
  }).filter((t) => wizardToolNames.has(t.name));
243
- const { createPiOrchestratorTools } = await import("./orchestrator-tools-DyKws92o.js");
245
+ const { createPiOrchestratorTools } = await import("./orchestrator-tools-lvNVQhzs.js");
244
246
  const queueTools = createPiOrchestratorTools(orchestrator).filter((t) => orchestratorTools.has(t.name));
245
247
  const customTools = [
246
248
  ...codingToolDefs,
@@ -285,6 +287,8 @@ async function runPiTask(inputs) {
285
287
  assistantTurns += 1;
286
288
  turns.noteAssistantTurn(event.message);
287
289
  const assistant = extractText(event.message).trim();
290
+ if (!remarkTurn && !taskReported(orchestrator)) abortReason ??= policyAbortReason(assistant);
291
+ if (abortReason) cancellation?.abort();
288
292
  if (assistant) {
289
293
  logToFile(`[pi-task] assistant: ${assistant.slice(0, 1e3)}`);
290
294
  applyOutroMarkers(assistant, emit);
@@ -325,16 +329,19 @@ async function runPiTask(inputs) {
325
329
  await turns.prompt(taskPrompt);
326
330
  terminal = turns.terminalFailure();
327
331
  let nudges = 0;
328
- while (nudges < MAX_TASK_NUDGES && !security.state.criticalViolation && !inputs.signal?.aborted && !terminal && !setupSignalFailure(signals) && !isSettled(orchestrator)) {
332
+ while (nudges < MAX_TASK_NUDGES && !security.state.criticalViolation && !inputs.signal?.aborted && !terminal && !abortReason && !setupSignalFailure(signals) && !isSettled(orchestrator)) {
329
333
  nudges += 1;
330
334
  logToFile(`[pi-task] completion guard: not settled, nudge ${nudges}/${MAX_TASK_NUDGES}`);
331
335
  await turns.prompt(orchestrator.currentTaskId ? TASK_NUDGE : SEED_NUDGE);
332
336
  terminal = turns.terminalFailure();
333
337
  }
334
- if (requestRemark && !security.state.criticalViolation && !terminal && !setupSignalFailure(signals) && !inputs.signal?.aborted) try {
335
- await agentSession.prompt(REMARK_INSTRUCTION);
336
- } catch (err) {
337
- logToFile(`[pi-task] remark request failed: ${String(err)}`);
338
+ if (requestRemark && !security.state.criticalViolation && !terminal && !abortReason && !setupSignalFailure(signals) && !inputs.signal?.aborted) {
339
+ remarkTurn = true;
340
+ try {
341
+ await agentSession.prompt(REMARK_INSTRUCTION);
342
+ } catch (err) {
343
+ logToFile(`[pi-task] remark request failed: ${String(err)}`);
344
+ }
338
345
  }
339
346
  } finally {
340
347
  try {
@@ -346,9 +353,13 @@ async function runPiTask(inputs) {
346
353
  classification: "WIZARD_ABORT",
347
354
  message: "Agent run cancelled"
348
355
  };
356
+ if (abortReason) terminal = {
357
+ classification: "WIZARD_ABORT",
358
+ message: abortReason
359
+ };
349
360
  if (terminal && !security.state.criticalViolation) {
350
361
  if (errorMessage || spinnerMessage) spinner.stop(errorMessage ?? "Task failed");
351
- captureAborted(terminal.classification);
362
+ captureAborted(terminal.classification, abortReason ? "gateway_policy" : void 0);
352
363
  if (terminal.status === 401) return {
353
364
  kind: "decided_failure",
354
365
  failure: {
@@ -446,4 +457,4 @@ async function runPiTask(inputs) {
446
457
  //#endregion
447
458
  export { runPiTask };
448
459
 
449
- //# sourceMappingURL=task-CmNe3xeg.js.map
460
+ //# sourceMappingURL=task-Y8lWoDE7.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-Y8lWoDE7.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} 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 AuthStorage,\n ModelRegistry,\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 = ModelRegistry.inMemory(AuthStorage.create());\n registry.registerProvider(GATEWAY_PROVIDER, provider as never);\n const model = registry.find(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 modelRegistry: 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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"}
@@ -1,4 +1,4 @@
1
- import { n as analytics } from "./analytics-B_xFshPY.js";
1
+ import { n as analytics } from "./analytics-GQv--mQm.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-DKM7VGuJ.js.map
13
+ //# sourceMappingURL=telemetry-Cwqf0iur.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"telemetry-DKM7VGuJ.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-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"}