@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.
- package/README.md +1 -29
- package/dist/{PickerMenu-BGGeYqd-.js → PickerMenu-BtheKi1o.js} +1 -1
- package/dist/{PickerMenu-BGGeYqd-.js.map → PickerMenu-BtheKi1o.js.map} +1 -1
- package/dist/_dev-only-stub-B0db0Klc.js +1 -0
- package/dist/{agent-interface-fcDXqb-_.js → agent-interface-BNssNetq.js} +12 -12
- package/dist/agent-interface-BNssNetq.js.map +1 -0
- package/dist/{agent-prompt-loader-F9gGPMt0.js → agent-prompt-loader-iV11XVEF.js} +16 -8
- package/dist/agent-prompt-loader-iV11XVEF.js.map +1 -0
- package/dist/{analytics-GQv--mQm.js → analytics-Drox5LSW.js} +6 -5
- package/dist/analytics-Drox5LSW.js.map +1 -0
- package/dist/analytics-Ix9HEra3.js +2 -0
- package/dist/{api-WUOSLXPJ.js → api-Dfu655Qt.js} +2 -2
- package/dist/{api-WUOSLXPJ.js.map → api-Dfu655Qt.js.map} +1 -1
- package/dist/api-H2UaPgjv.js +2 -0
- package/dist/{api-key-login-tysMeZnR.js → api-key-login-BgwfAXfv.js} +5 -5
- package/dist/{api-key-login-tysMeZnR.js.map → api-key-login-BgwfAXfv.js.map} +1 -1
- package/dist/api-key-login-Cow3UDAN.js +2 -0
- package/dist/bin.js +1 -1
- package/dist/{bounded-fs-B31zq2ir.js → bounded-fs-TRL6IsoU.js} +32 -16
- package/dist/bounded-fs-TRL6IsoU.js.map +1 -0
- package/dist/{ci-install-CYSFbFXd.js → ci-install-nc1IKuX2.js} +6 -6
- package/dist/{ci-install-CYSFbFXd.js.map → ci-install-nc1IKuX2.js.map} +1 -1
- package/dist/{console-log-DJiTqYT2.js → console-log-BMhBoX-o.js} +2 -2
- package/dist/{console-log-DJiTqYT2.js.map → console-log-BMhBoX-o.js.map} +1 -1
- package/dist/{debug-BTUMatFI.js → debug-BfO_Txo8.js} +3 -3
- package/dist/debug-BfO_Txo8.js.map +1 -0
- package/dist/{defaults-DDVl3tKN.js → defaults-BWLIffh5.js} +1 -1
- package/dist/{defaults-DDVl3tKN.js.map → defaults-BWLIffh5.js.map} +1 -1
- package/dist/{errors-DhFeR8Sp.js → errors-BXlWujEw.js} +1 -1
- package/dist/{errors-DhFeR8Sp.js.map → errors-BXlWujEw.js.map} +1 -1
- package/dist/{family-picker-BKs-tTyu.js → family-picker-CAW_VtYf.js} +2 -2
- package/dist/{family-picker-BKs-tTyu.js.map → family-picker-CAW_VtYf.js.map} +1 -1
- package/dist/{gateway-CJ8Jqbll.js → gateway-CLQQb96F.js} +25 -9
- package/dist/{gateway-CJ8Jqbll.js.map → gateway-CLQQb96F.js.map} +1 -1
- package/dist/headless-CHGNEzO3.js +3 -0
- package/dist/{headless-le-QqOuj.js → headless-DMO8N_FD.js} +2 -2
- package/dist/{headless-le-QqOuj.js.map → headless-DMO8N_FD.js.map} +1 -1
- package/dist/{host-resolution-Cht8bL39.js → host-resolution-DftfSjJD.js} +4 -4
- package/dist/{host-resolution-Cht8bL39.js.map → host-resolution-DftfSjJD.js.map} +1 -1
- package/dist/{install-BhnFP3p3.js → install-C9FPM37m.js} +6 -6
- package/dist/{install-BhnFP3p3.js.map → install-C9FPM37m.js.map} +1 -1
- package/dist/{install-55JbRsO-.js → install-MWoo1hXL.js} +1 -1
- package/dist/{interactive-9qRL8259.js → interactive-DOnolJHB.js} +3 -3
- package/dist/{interactive-9qRL8259.js.map → interactive-DOnolJHB.js.map} +1 -1
- package/dist/{links-5Blqk4Im.js → links-CatXPRxH.js} +3 -3
- package/dist/{links-5Blqk4Im.js.map → links-CatXPRxH.js.map} +1 -1
- package/dist/{main-CUIcozEG.js → main-CINmZtoW.js} +23 -23
- package/dist/{main-CUIcozEG.js.map → main-CINmZtoW.js.map} +1 -1
- package/dist/{mcp-D73aCOHK.js → mcp-KVV6Z_bq.js} +3 -3
- package/dist/{mcp-D73aCOHK.js.map → mcp-KVV6Z_bq.js.map} +1 -1
- package/dist/{mcp-prompt-streaming-B5lIQ0l1.js → mcp-prompt-streaming-M6UnLgGX.js} +5 -5
- package/dist/{mcp-prompt-streaming-B5lIQ0l1.js.map → mcp-prompt-streaming-M6UnLgGX.js.map} +1 -1
- package/dist/{mode-label-DB3ol_sj.js → mode-label--bJuXny5.js} +1 -1
- package/dist/{mode-label-DB3ol_sj.js.map → mode-label--bJuXny5.js.map} +1 -1
- package/dist/{models-CLTglHFZ.js → models-B0huHItG.js} +2 -2
- package/dist/{models-CLTglHFZ.js.map → models-B0huHItG.js.map} +1 -1
- package/dist/{non-interactive-DkldwWDM.js → non-interactive-DiEu4_6l.js} +3 -3
- package/dist/{non-interactive-DkldwWDM.js.map → non-interactive-DiEu4_6l.js.map} +1 -1
- package/dist/{oauth-session-CfkZ339p.js → oauth-session-9EU3ky0v.js} +2 -2
- package/dist/{oauth-session-CfkZ339p.js.map → oauth-session-9EU3ky0v.js.map} +1 -1
- package/dist/{orchestrator-tools-lvNVQhzs.js → orchestrator-tools-QWyDLu_7.js} +3 -3
- package/dist/{orchestrator-tools-lvNVQhzs.js.map → orchestrator-tools-QWyDLu_7.js.map} +1 -1
- package/dist/package-json-BAtJRHSq.js +2 -0
- package/dist/{package-json-2UrhE6kP.js → package-json-z1agAYXs.js} +1 -1
- package/dist/{package-json-2UrhE6kP.js.map → package-json-z1agAYXs.js.map} +1 -1
- package/dist/{package-manager-BqRNp5y_.js → package-manager-B-9I_fAT.js} +4 -4
- package/dist/{package-manager-BqRNp5y_.js.map → package-manager-B-9I_fAT.js.map} +1 -1
- package/dist/{pi-2pYz2OY3.js → pi-BSnSk6rv.js} +19 -20
- package/dist/pi-BSnSk6rv.js.map +1 -0
- package/dist/{playground-jxZNxRwC.js → playground-Drz1qszs.js} +4 -4
- package/dist/{playground-jxZNxRwC.js.map → playground-Drz1qszs.js.map} +1 -1
- package/dist/{posthog-integration-DxRkw5DI.js → posthog-integration-mIQGBc1f.js} +882 -2512
- package/dist/posthog-integration-mIQGBc1f.js.map +1 -0
- package/dist/programs-Bv0_YHzE.js +3 -0
- package/dist/{programs-eTv2T2rs.js → programs-mxhRXwP-.js} +194 -88
- package/dist/programs-mxhRXwP-.js.map +1 -0
- package/dist/provisioning-BVsxSNve.js +2 -0
- package/dist/{provisioning-c5JJ30KX.js → provisioning-CHUjae9V.js} +4 -4
- package/dist/{provisioning-c5JJ30KX.js.map → provisioning-CHUjae9V.js.map} +1 -1
- package/dist/{queue-tools-10w8lhEs.js → queue-tools-PFG6H93Q.js} +4 -4
- package/dist/{queue-tools-10w8lhEs.js.map → queue-tools-PFG6H93Q.js.map} +1 -1
- package/dist/{results-C45prSKD.js → results-5yCKf2cI.js} +2 -2
- package/dist/{results-C45prSKD.js.map → results-5yCKf2cI.js.map} +1 -1
- package/dist/{run-jugssomh.js → run-D5TKJuSL.js} +10 -10
- package/dist/{run-jugssomh.js.map → run-D5TKJuSL.js.map} +1 -1
- package/dist/{run-CM24OgPF.js → run-W03b6jNM.js} +12 -12
- package/dist/{run-CM24OgPF.js.map → run-W03b6jNM.js.map} +1 -1
- package/dist/{run-tool-DZrZFoGq.js → run-tool-DTQF8mmI.js} +17 -17
- package/dist/{run-tool-DZrZFoGq.js.map → run-tool-DTQF8mmI.js.map} +1 -1
- package/dist/run-tool-DjERhu7G.js +2 -0
- package/dist/{runners-CoIYt0iI.js → runners-B_84kPyf.js} +11 -11
- package/dist/{runners-CoIYt0iI.js.map → runners-B_84kPyf.js.map} +1 -1
- package/dist/{security-ppK2MwCn.js → security-pApVawYb.js} +5 -5
- package/dist/{security-ppK2MwCn.js.map → security-pApVawYb.js.map} +1 -1
- package/dist/{setup-utils-B5E1rXLa.js → setup-utils-CQY8PHjR.js} +3 -3
- package/dist/{setup-utils-B5E1rXLa.js.map → setup-utils-CQY8PHjR.js.map} +1 -1
- package/dist/{start-playground-DujiUNFT.js → start-playground-DAw1GbLt.js} +8 -8
- package/dist/{start-playground-DujiUNFT.js.map → start-playground-DAw1GbLt.js.map} +1 -1
- package/dist/{subagent-BdDWA8j5.js → subagent-YLGSvgoZ.js} +4 -4
- package/dist/subagent-YLGSvgoZ.js.map +1 -0
- package/dist/{task-Y8lWoDE7.js → task-3hRSovmK.js} +19 -20
- package/dist/task-3hRSovmK.js.map +1 -0
- package/dist/{tasks-BfJhVky2.js → tasks-C03QbXTx.js} +1 -1
- package/dist/{tasks-BfJhVky2.js.map → tasks-C03QbXTx.js.map} +1 -1
- package/dist/{telemetry-Cwqf0iur.js → telemetry-BPBzqsb_.js} +2 -2
- package/dist/{telemetry-Cwqf0iur.js.map → telemetry-BPBzqsb_.js.map} +1 -1
- package/dist/{terminal-BLL-X6YP.js → terminal-DZsYFbm9.js} +92 -63
- package/dist/terminal-DZsYFbm9.js.map +1 -0
- package/dist/{tools-C8k90ISV.js → tools-D_AtrhbO.js} +15 -15
- package/dist/{tools-C8k90ISV.js.map → tools-D_AtrhbO.js.map} +1 -1
- package/dist/{tools-g42e5kJz.js → tools-DyzRi_dQ.js} +8 -8
- package/dist/{tools-g42e5kJz.js.map → tools-DyzRi_dQ.js.map} +1 -1
- package/dist/{tui-CBnRWnrm.js → tui-CRp0iCuT.js} +5 -5
- package/dist/{tui-CBnRWnrm.js.map → tui-CRp0iCuT.js.map} +1 -1
- package/dist/{tui-BPWJ-J-k.js → tui-UI6ctBQJ.js} +1 -1
- package/dist/{upload-step-CFoxwd5t.js → upload-step-DrYXnpzI.js} +3 -3
- package/dist/{upload-step-CFoxwd5t.js.map → upload-step-DrYXnpzI.js.map} +1 -1
- package/dist/{urls-BTZhm5eA.js → urls-WeqfBLP4.js} +2 -2
- package/dist/{urls-BTZhm5eA.js.map → urls-WeqfBLP4.js.map} +1 -1
- package/dist/{wizard-abort-HtpiSsQO.js → wizard-abort-BwEefm6P.js} +5 -5
- package/dist/{wizard-abort-HtpiSsQO.js.map → wizard-abort-BwEefm6P.js.map} +1 -1
- package/dist/yara-hooks-MDtFbuoM.js +2 -0
- package/dist/{yara-hooks-BPYhN9WM.js → yara-hooks-aDbdsitJ.js} +41 -5
- package/dist/{yara-hooks-BPYhN9WM.js.map → yara-hooks-aDbdsitJ.js.map} +1 -1
- package/package.json +9 -7
- package/dist/agent-interface-fcDXqb-_.js.map +0 -1
- package/dist/agent-prompt-loader-F9gGPMt0.js.map +0 -1
- package/dist/analytics-C9QnGvuc.js +0 -2
- package/dist/analytics-GQv--mQm.js.map +0 -1
- package/dist/api-CsXfZKkq.js +0 -2
- package/dist/api-key-login-CDSxsYtP.js +0 -2
- package/dist/bounded-fs-B31zq2ir.js.map +0 -1
- package/dist/debug-BTUMatFI.js.map +0 -1
- package/dist/headless-DZ3mq07K.js +0 -3
- package/dist/package-json-Dblip2_X.js +0 -2
- package/dist/pi-2pYz2OY3.js.map +0 -1
- package/dist/posthog-integration-DxRkw5DI.js.map +0 -1
- package/dist/programs-D2793-PK.js +0 -3
- package/dist/programs-eTv2T2rs.js.map +0 -1
- package/dist/provisioning-CtQ0GEHa.js +0 -2
- package/dist/run-tool-BZFgFb_2.js +0 -2
- package/dist/subagent-BdDWA8j5.js.map +0 -1
- package/dist/task-Y8lWoDE7.js.map +0 -1
- package/dist/terminal-BLL-X6YP.js.map +0 -1
- package/dist/yara-hooks-BwhEDXIt.js +0 -2
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { o as logToFile } from "./debug-
|
|
2
|
-
import {
|
|
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
|
-
|
|
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-
|
|
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-
|
|
3
|
-
import {
|
|
4
|
-
import { t as classifyRunFailure } from "./errors-
|
|
5
|
-
import { n as currentAccessToken } from "./oauth-session-
|
|
6
|
-
import {
|
|
7
|
-
import { g as assembleCommandments, h as AgentOutputSignals } from "./agent-interface-
|
|
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-
|
|
9
|
-
import { d as taskReported } from "./queue-tools-
|
|
10
|
-
import {
|
|
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,
|
|
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 =
|
|
154
|
-
registry.
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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
|
-
|
|
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-
|
|
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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6DA,MAAM,kBAAqD;CACzD,MAAM,CAAC,OAAO;CACd,MAAM,CAAC,OAAO;CACd,OAAO,CAAC,QAAQ;CAChB,MAAM,CAAC,OAAO;CACd,MAAM,CAAC,QAAQ,KAAK;CACpB,MAAM,CAAC,OAAO;CACf;;AAGD,SAAS,cAAc,MAAsB;AAC3C,QAAO,KAAK,QAAQ,eAAe,GAAG;;;;;;AAOxC,SAAgB,qBACd,cACa;CACb,MAAM,WAAW,gBAAgB,EAAE,EAAE,IAAI,cAAc;CACvD,MAAM,QAAQ,QAAQ,SAClB,QAAQ,SAAS,SAAS,gBAAgB,SAAS,EAAE,CAAC,GACtD,OAAO,OAAO,gBAAgB,CAAC,MAAM;AACzC,QAAO,IAAI,IAAI,MAAM;;;;;;;AAQvB,SAAgB,yBACd,iBACa;AACb,QAAO,IAAI,IAAI,WAAW,mBAAmB,EAAE,CAAC,CAAC;;;;;;;;;AAUnD,MAAM,yBAAyB;CAC7B;CACA;CACA;CACA;CACD;AAED,MAAM,sBAAsB;CAC1B;CACA;CACA;CAEA;CACA;CACA;CACD;AAED,SAAgB,qBACd,cACa;CACb,MAAM,WAAW,gBAAgB,EAAE,EAAE,IAAI,cAAc;AACvD,QAAO,IAAI,IAAI,CACb,GAAG,wBACH,GAAG,oBAAoB,QAAQ,SAAS,QAAQ,SAAS,KAAK,CAAC,CAChE,CAAC;;;;;;;;AASJ,SAAgB,kBACd,iBACU;CACV,MAAM,QAAQ,mBAAmB,EAAE;AACnC,QAAO,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,OAAO,GAAG,MAAM,IAAI,cAAc,CAAC,CAAC,CAAC;;;AAI9D,MAAM,kBAAkB;AAExB,MAAM,aACJ;AAEF,MAAM,aACJ;;AAGF,SAAS,UAAU,KAAwC;AACzD,KAAI,CAAC,IAAI,cAEP,QAAO,IAAI,MAAM,MAAM,CAAC,SAAS;AAEnC,QAAO,aAAa,IAAI;;AAG1B,eAAsB,UAAU,QAA6C;AAC3E,KAAI,OAAO,QAAQ,QACjB,QAAO;EACL,MAAM;EACN,gBAAA;EACA,SAAS;EACV;CAEH,MAAM,EACJ,QACA,OACA,MACA,MACA,QACA,SACA,OAAO,SACP,QACA,cACA,iBACA,WACA,cACA,gBACA,gBACA,cACA,eACA,wBACE;AAEJ,KAAI,eAAgB,SAAQ,MAAM,eAAe;CAEjD,MAAM,UAAU,iBAAiB;EAC/B,SAAS,MAAM,MAAM;EACrB,eAAe,KAAK,YAAY;EAChC,SAAS,KAAK,YAAY,KAAK;EAC/B,SAAS,KAAK;EACf,CAAC;CAEF,MAAM,YAAY,KAAK,KAAK;CAC5B,MAAM,UAAU,IAAI,oBAAoB;CACxC,IAAI,iBAAiB;CACrB,MAAM,qBAAqB;EACzB,MAAM,aAAa,KAAK,KAAK,GAAG;AAChC,SAAO;GACL,aAAa;GACb,kBAAkB,KAAK,MAAM,aAAa,IAAK;GAChD;;CAYH,MAAM,kBACJ,aACA,WAEA,UAAU,cAAc,iBAAiB;EACvC,cAAc;EACd,GAAI,UAAU,EAAE,QAAQ;EACxB,GAAG,cAAc;EACjB,OAAO;EACP,GAAG;EACJ,CAAC;CAEJ,IAAI;CACJ,IAAI,YAAY;CAChB,IAAI;CACJ,IAAI;CACJ,IAAI,aAAa;AACjB,KAAI;EAEF,MAAM,EACJ,oBACA,uBACA,gBACA,aACA,wBACA,0BACA,0BACA,0BACA,0BACA,0BACA,8BAZU,MAAM,OAAO;EAgBzB,MAAM,cAAc,YAClB,YACE,KAAK,YAAY,MACjB,MAAM,mBAAmB,KAAK,YAAY,EAC1C,KAAK,UACN;EACH,MAAM,OAAO,MAAM,aAAa;EAChC,MAAM,kBAAkB,aAA0B;GAChD,YAAY,QAAQ;GACpB,aAAa,QAAQ;GACrB,QAAQ,QAAQ;GAChB,gBAAgB,KAAK;GACrB,aAAa,KAAK;GAClB;GAGA;GACD;EACD,MAAM,EAAE,UAAU,SAAS,qBAAqB,eAAe,KAAK,CAAC;EACrE,MAAM,WAAW,MAAM,qBAAqB,SAAS;EACrD,MAAM,QAAQ,SAAS,SAAS,kBAAkB,QAAQ;AAC1D,MAAI,CAAC,MACH,QAAO;GACL,MAAM;GACN,gBAAA;GACA,SAAS;GACV;EAQH,MAAM,WAAW,EAAE,SAAS,OAAO;EAInC,MAAM,EAAE,4BAA4B,MAAM,OAAO;EACjD,MAAM,WAAW,wBAAwB;GACvC,iBAAiB,kBAAkB,gBAAgB;GACnD,gBAAgB,KAAK;GACrB,2BAA2B,SAAS;GACpC,kBAAkB,MAAM;GACzB,CAAC;EACF,MAAM,EAAE,uBAAuB,MAAM,OAAO;AACvC,sBAAoB;EAIzB,MAAM,qBAAqB,CAAC,SAAS,QAAQ;EAG7C,IAAI,aAAa;AACjB,MAAI,iBAAiB,aAAa,CAChC,KAAI;GACF,MAAM,EAAE,oBAAoB,MAAM,OAAO;GACzC,MAAM,MAAM,MAAM,gBAAgB;IAChC,QAAQ,KAAK,YAAY,KAAK;IAC9B,aAAa,MAAM,mBAAmB,KAAK,YAAY;IAIvD,WAAW,0BAA0B,OAAO,UAAU;IACvD,CAAC;AACF,sBAAmB,KAAK,IAAI,iBAAiB;AAC7C,gBAAa,IAAI;AACjB,gBAAa;WACN,KAAK;AACZ,OAAI;AACF,kBAAc;WACR;AAGR,gBAAa,KAAA;AAGb,aAAU,wCAAwC,OAAO,IAAI,GAAG;AAChE,aAAU,cAAc,oBAAoB;IAC1C,SAAS;IACT,OAAO;IACP,OAAO,OAAO,IAAI,CAAC,MAAM,GAAG,IAAI;IACjC,CAAC;;EAIN,MAAM,cAAc,qBAAqB,aAAa;EACtD,MAAM,oBAAoB,yBAAyB,gBAAgB;EAEnE,MAAM,iBAAiB,IAAI,sBAAsB;GAC/C,KAAK,MAAM;GACX,UAAU,aAAa;GACvB,cAAc,qBAAqB;IACjC,SAAS,OAAO;IAChB,UAAA;IACA,SAAA;IACA,MAAM;KAAE,MAAM,YAAY,IAAI,OAAO;KAAE;KAAY;IACpD,CAAC;GACF,cAAc;GACd,UAAU;GACV,gBAAgB;GAChB,mBAAmB;GACnB,UAAU;GACV;GACD,CAAC;AACF,QAAM,eAAe,QAAQ;EAK7B,MAAM,MAAM,MAAM;EAgBlB,MAAM,iBAAiB,OAAO,QAfF;GAC1B,YAAY,SAAS,yBAAyB,IAAI,EAAE,WAAW;GAC/D,YAAY,SAAS,yBAAyB,IAAI,EAAE,aAAa;GACjE,aAAa,SAAS,0BAA0B,IAAI,EAAE,aAAa;GACnE,YACE,SACE,yBAAyB,KAAK,EAC5B,YAAY,SAAS;IAAE,GAAG;IAAK,KAAK,kBAAkB;IAAE,GACzD,CAAC,EACF,aACD;GACH,UAAU,SAAS,uBAAuB,IAAI,EAAE,WAAW;GAC3D,YAAY,SAAS,yBAAyB,IAAI,EAAE,WAAW;GAC/D,YAAY,SAAS,yBAAyB,IAAI,EAAE,WAAW;GAChE,CACyD,CACvD,QAAQ,CAAC,UAAU,YAAY,IAAI,KAAK,CAAC,CACzC,KAAK,GAAG,UAAU,MAAM,CAAC;EAM5B,MAAM,EAAE,wBAAwB,MAAM,OAAO;EAC7C,MAAM,kBAAkB,qBAAqB,aAAa;EAC1D,MAAM,cAAc,oBAAoB;GACtC,kBAAkB;GAClB,eAAe,KAAK;GACpB,gBAAgB,KAAK;GACrB;GACA,WAAW,aAAa,kBAAkB,KAAA;GAC1C,WAAW,KAAK;GAChB,iBAAiB,KAAK;GAGtB;GAEA,qBAAqB,YAAY;AAC/B,aAAS,UAAU;;GAEtB,CAAC,CAAC,QAAQ,MAAM,gBAAgB,IAAI,EAAE,KAAK,CAAC;EAE7C,MAAM,EAAE,8BAA8B,MAAM,OAAO;EACnD,MAAM,aAAa,0BAA0B,aAAa,CAAC,QAAQ,MACjE,kBAAkB,IAAI,EAAE,KAAK,CAC9B;EAED,MAAM,cAAc;GAAC,GAAG;GAAgB,GAAG;GAAa,GAAG;GAAW;EACtE,MAAM,EAAE,SAAS,iBAAiB,MAAM,mBAAmB;GACzD;GACA,cAAc;GACd,eAAe,KAAK;GACpB,KAAK;GACL,gBAAgB,eAAe,SAAS,IAAI;GAC5C;GACA,SAAS;GACT;GACD,CAAC;AACF,iBAAe,mBAAmB,OAAO,QAAQ,eAAe,UAAU;AACxE,aAAU,2BAA2B,OAAO,MAAM,GAAG;IACrD;AACF,QAAM,aAAa,eAAe,EAAE,CAAC;EAIrC,MAAM,QAAQ,kBAAkB;GAC9B,QAAQ,OAAO;GACf,SAAS;GACT;GACA;GACA;GACA;GACA,oBACE,aAAa,gBAAgB,aAAa;GAC5C,gBAAgB;AACd,cAAU,0DAA0D;AACpE,cAAU,cAAc,0BAA0B,EAAE,SAAS,MAAM,CAAC;;GAEvE,CAAC;EAIF,MAAM,YAAY,CAChB,GAAG,YAAY,KAAK,MAAM,EAAE,KAAK,EACjC,GAAI,aAAa,CAAC,eAAe,GAAG,EAAE,CACvC;AACD,YAAU,oCAAoC,UAAU,KAAK,KAAK,GAAG;EACrE,MAAM,aAAa,GAAG,OAAO,MAAM,oBAAoB,UAAU;EAEjE,MAAM,cAAc,aAAa,WAAW,UAAU;AAGpD,WAAQ,6BAA6B,MAAM;AAE3C,WAAQ,MAAM,MAAd;IACE,KAAK,eAAe;AAElB,SAAK,MAAM,SAA+B,SAAS,YACjD;AAEF,uBAAkB;AAClB,WAAM,kBAAkB,MAAM,QAAQ;KACtC,MAAM,YAAY,YAAY,MAAM,QAAQ,CAAC,MAAM;AAEnD,SAAI,CAAC,cAAc,CAAC,aAAa,aAAa,CAC5C,iBAAgB,kBAAkB,UAAU;AAC9C,SAAI,YAAa,eAAc,OAAO;AACtC,SAAI,WAAW;AACb,gBAAU,wBAAwB,UAAU,MAAM,GAAG,IAAK,GAAG;AAC7D,wBAAkB,WAAW,KAAK;MAClC,MAAM,aAAa,eAAe,UAAU;AAC5C,UAAI,YAAY;AACd,YAAK;QAAE,MAAM;QAAU,SAAS;QAAY,CAAC;AAC7C,eAAQ,QAAQ,WAAW;;AAE7B,WAAK,MAAM,QAAQ,UAAU,MAAM,KAAK,CAAE,SAAQ,KAAK,KAAK;;AAE9D;;IAEF,KAAK,wBAAwB;KAC3B,MAAM,OAAO,KAAK,UAAU,MAAM,QAAQ,EAAE,CAAC,CAAC,MAAM,GAAG,IAAI;AAC3D,eAAU,eAAe,MAAM,SAAS,GAAG,OAAO;AAClD;;IAEF,KAAK;AACH,SAAI,MAAM,SAAS;MACjB,MAAM,SACJ,OAAO,MAAM,WAAW,WACpB,MAAM,SACN,KAAK,UAAU,MAAM,UAAU,GAAG;AACxC,gBAAU,eAAe,MAAM,SAAS,IAAI,OAAO,MAAM,GAAG,IAAI,GAAG;;AAErE;IAEF,QACE;;IAEJ;AAKF,UAAQ,iBAAiB,WAAW;EAEpC,IAAI,WAAW,MAAM,iBAAiB;AACtC,MAAI;AACF,OAAI,OAAO,QAAQ,QACjB,QAAO;IACL,MAAM;IACN,gBAAA;IACA,SAAS;IACV;AACH,SAAM,MAAM,OAAO,WAAW;AAC9B,cAAW,MAAM,iBAAiB;GAKlC,IAAI,SAAS;AACb,UACE,SAAS,mBACT,CAAC,SAAS,MAAM,qBAChB,CAAC,OAAO,QAAQ,WAChB,CAAC,YACD,CAAC,eACD,CAAC,mBAAmB,QAAQ,IAC5B,CAAC,UAAU,aAAa,EACxB;AACA,cAAU;AACV,cACE,kDAAkD,OAAO,GAAG,kBAC7D;AACD,UAAM,MAAM,OACV,aAAa,gBAAgB,aAAa,WAC3C;AACD,eAAW,MAAM,iBAAiB;;AAGpC,OACE,iBACA,CAAC,SAAS,MAAM,qBAChB,CAAC,YACD,CAAC,eACD,CAAC,mBAAmB,QAAQ,IAC5B,CAAC,OAAO,QAAQ,SAChB;AACA,iBAAa;AACb,QAAI;AACF,WAAM,aAAa,OAAO,mBAAmB;aACtC,KAAK;AACZ,eAAU,oCAAoC,OAAO,IAAI,GAAG;;;YAGxD;AACR,OAAI;AACF,iBAAa;WACP;;AAKV,MAAI,OAAO,QAAQ,QACjB,QAAO;GACL,MAAM;GACN,gBAAA;GACA,SAAS;GACV;AAGH,MAAI,YACF,YAAW;GAAE,gBAAA;GAAsC,SAAS;GAAa;AAC3E,MAAI,YAAY,CAAC,SAAS,MAAM,mBAAmB;AACjD,OAAI,gBAAgB,eAClB,SAAQ,KAAK,gBAAgB,cAAc;AAC7C,kBACE,SAAS,gBACT,cAAc,mBAAmB,KAAA,EAClC;AACD,OAAI,SAAS,WAAW,IACtB,QAAO;IACL,MAAM;IACN,SAAS;KACP,MAAM,WAAW;KACjB,SAAS;KACT,QAAQ,EAAE,iBAAiB,SAAS,SAAS;KAC9C;IACF;AAEH,UAAO,SAAS,mBAAA,iBACZ;IACE,MAAM;IACN,gBAAA;IACA,SAAS,SAAS;IACnB,GACD;IACE,MAAM;IACN,gBAAgB,SAAS;IACzB,SAAS,SAAS;IACnB;;AAGP,MAAI,SAAS,MAAM,mBAAmB;AACpC,WAAQ,KAAK,8BAA8B;AAC3C,aACE,iDAAiD,SAAS,MAAM,aAAa,WAC9E;AACD,kBAAA,wBAA6C;AAC7C,UAAO;IAAE,MAAM;IAAW,gBAAA;IAA+C;;EAG3E,MAAM,eAAe,mBAAmB,QAAQ;AAChD,MAAI,cAAc;AAChB,WAAQ,KAAK,4CAA4C;AACzD,aAAU,2BAA2B,eAAe;AACpD,kBAAe,aAAa;AAC5B,UAAO;IAAE,MAAM;IAAW,gBAAgB;IAAc;;EAG1D,MAAM,SAAS,QAAQ,QAAQ;AAC/B,MAAI,OACF,WAAU,QAAQ,0BAA0B,EAAE,QAAQ,CAAC;EAGzD,MAAM,QAAQ,aAAa,iBAAiB;EAC5C,MAAM,YAAY,cAAc;AAChC,YAAU,cAAc,mBAAmB;GACzC,GAAG;GACH,OAAO;GACP,WAAW;GACX,cAAc,MAAM,OAAO;GAC3B,eAAe,MAAM,OAAO;GAC5B,6BAA6B,MAAM,OAAO;GAC1C,yBAAyB,MAAM,OAAO;GACtC,GAAG;GACJ,CAAC;AAQF,YACE,wBALA,OAAQ,qBAAiD,cACzD,WACK,oBAA8C,YAC/C,QAE6B,SAAS,QAAQ,UAAU,KAAK,cAAc,OAAO,UAAU,iBAAiB,UAAU,eAAe,MAAM,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,OAAO,UAAU,MAAM,OAAO,UAAU,UAAU,MAAM,OAAO,aACvP;AACD,MAAI,eAAgB,SAAQ,KAAK,eAAe;AAChD,cAAY;AACZ,SAAO,EAAE,MAAM,WAAW;UACnB,KAAK;AACZ,MAAI,OAAO,QAAQ,QACjB,QAAO;GACL,MAAM;GACN,gBAAA;GACA,SAAS;GACV;EAEH,MAAM,UAAU,eAAe,QAAQ,IAAI,UAAU,OAAO,IAAI;AAChE,YAAU,wBAAwB,UAAU;AAC5C,MAAI,gBAAgB,eAClB,SAAQ,KAAK,gBAAgB,cAAc;EAE7C,MAAM,QAAQ,mBAAmB,IAAI;AACrC,MAAI,MAAM,SAAS,eAAe,OAAO;AACvC,kBAAA,mBAAwC;AACxC,UAAO;IACL,MAAM;IACN,SAAS;KAAE,MAAM,MAAM;KAAM,SAAS,MAAM;KAAS,OAAO;KAAK;IAClE;;EAEH,MAAM,iBAAiB,aAAa,QAAQ;AAC5C,iBAAe,eAAe;AAC9B,SAAO;GACL,MAAM;GACN;GACA;GACA,OAAO,eAAe,QAAQ,MAAM,KAAA;GACrC;WACO;AACR,QAAM,cAAc,QAAQ;AAC5B,MAAI;AACF,iBAAc;UACR;AAGR,MAAI;AACF,WAAQ,YAAY,UAAU;UACxB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tasks-
|
|
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-
|
|
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-
|
|
13
|
+
//# sourceMappingURL=telemetry-BPBzqsb_.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"telemetry-
|
|
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-
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import "./errors-
|
|
6
|
-
import { r as withUtm, t as openTrackedLink } from "./links-
|
|
7
|
-
import { t as withProgress } from "./telemetry-
|
|
8
|
-
import { t as detectOrgAndProject } from "./setup-utils-
|
|
9
|
-
import { r as currentCredentials, s as rotateAfterUnauthorized } from "./oauth-session-
|
|
10
|
-
import { a as getOAuthUrl, i as getIntegrationAuthorizeUrl, s as resolveBaseUrl } from "./urls-
|
|
11
|
-
import { t as HostResolution } from "./host-resolution-
|
|
12
|
-
import { A as
|
|
13
|
-
import {
|
|
14
|
-
import { c as fetchProjectData, l as fetchSlackConnected, n as ApiError, o as fetchGithubConnected, u as fetchUserData } from "./api-
|
|
15
|
-
import { n as namesWithStatus, o as summarizeFailure, t as isOk } from "./results-
|
|
16
|
-
import { f as getKindMeta, l as MCP_TUTORIAL_SCOPE_ADDITIONS, n as getTool, p as fetchHealthIssues } from "./tools-
|
|
17
|
-
import { n as AVAILABLE_FEATURES, o as isAllFeaturesSelected, t as ALL_FEATURE_VALUES } from "./defaults-
|
|
18
|
-
import { n as provisionNewAccount, r as requestDeepLink, t as ProvisionedAccountUnreadableError } from "./provisioning-
|
|
19
|
-
import { r as wizardAbort } from "./wizard-abort-
|
|
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-
|
|
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
|
|
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-
|
|
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 =
|
|
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
|
|
7622
|
-
else if (value === "no-share") store.declineSharing();
|
|
7638
|
+
else if (applySharingChoice(store, value)) return;
|
|
7623
7639
|
else if (value === "continue") {
|
|
7624
|
-
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
|
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-
|
|
16603
|
+
//# sourceMappingURL=terminal-DZsYFbm9.js.map
|