@posthog/wizard 2.75.0 → 2.76.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (107) hide show
  1. package/dist/{add-mcp-server-to-clients-CjfnPMbO.js → add-mcp-server-to-clients-4yHaRvOo.js} +5 -5
  2. package/dist/{add-mcp-server-to-clients-CjfnPMbO.js.map → add-mcp-server-to-clients-4yHaRvOo.js.map} +1 -1
  3. package/dist/{agent-interface-BKLTDSyN.js → agent-interface-DPaPdIjS.js} +69 -46
  4. package/dist/agent-interface-DPaPdIjS.js.map +1 -0
  5. package/dist/{agent-prompt-loader-DAagxT3p.js → agent-prompt-loader-BlhabNM2.js} +5 -5
  6. package/dist/{agent-prompt-loader-DAagxT3p.js.map → agent-prompt-loader-BlhabNM2.js.map} +1 -1
  7. package/dist/{agent-runner-BkQontri.js → agent-runner-JFwQQj2k.js} +40 -16
  8. package/dist/agent-runner-JFwQQj2k.js.map +1 -0
  9. package/dist/analytics-CcHoyhE_.js +2 -0
  10. package/dist/{analytics-DSK0GXg1.js → analytics-DSVyjIVF.js} +3 -2
  11. package/dist/analytics-DSVyjIVF.js.map +1 -0
  12. package/dist/{api-CwNulLDK.js → api-Ci0dZWLR.js} +3 -3
  13. package/dist/{api-CwNulLDK.js.map → api-Ci0dZWLR.js.map} +1 -1
  14. package/dist/bin.js +83 -59
  15. package/dist/bin.js.map +1 -1
  16. package/dist/{bounded-fs-D85Tk3nS.js → bounded-fs-FbZJ_vJ_.js} +3 -3
  17. package/dist/{bounded-fs-D85Tk3nS.js.map → bounded-fs-FbZJ_vJ_.js.map} +1 -1
  18. package/dist/{ci-install-CQLi_a-r.js → ci-install-CEVCqahf.js} +4 -4
  19. package/dist/{ci-install-CQLi_a-r.js.map → ci-install-CEVCqahf.js.map} +1 -1
  20. package/dist/{debug-CBmI5YUF.js → debug-C6KWXbQi.js} +1 -1
  21. package/dist/{debug-DUmMVUHn.js → debug-DWYDVp0B.js} +8 -7
  22. package/dist/debug-DWYDVp0B.js.map +1 -0
  23. package/dist/{defaults-DDDwYTN5.js → defaults-DulzMJpN.js} +1 -1
  24. package/dist/{defaults-DDDwYTN5.js.map → defaults-DulzMJpN.js.map} +1 -1
  25. package/dist/{env-api-key-CGC1Bqwq.js → env-api-key-DwmkB3fm.js} +2 -2
  26. package/dist/{env-api-key-CGC1Bqwq.js.map → env-api-key-DwmkB3fm.js.map} +1 -1
  27. package/dist/{environment-DC4RDnzR.js → environment-1wA7uwAS.js} +4 -4
  28. package/dist/{environment-DC4RDnzR.js.map → environment-1wA7uwAS.js.map} +1 -1
  29. package/dist/file-C3HGL1IM.js +60 -0
  30. package/dist/file-C3HGL1IM.js.map +1 -0
  31. package/dist/{file-watcher-hafFFQib.js → file-watcher-D8s0b-VT.js} +2 -2
  32. package/dist/{file-watcher-hafFFQib.js.map → file-watcher-D8s0b-VT.js.map} +1 -1
  33. package/dist/{gateway-session-Ctc2xaz7.js → gateway-session-OqzCMpZ9.js} +4 -4
  34. package/dist/{gateway-session-Ctc2xaz7.js.map → gateway-session-OqzCMpZ9.js.map} +1 -1
  35. package/dist/{gateway-session-zwwZAyTt.js → gateway-session-s1xr8b48.js} +1 -1
  36. package/dist/{headless-ui-CQ46FOTh.js → headless-ui-DRGWDg9Z.js} +10 -5
  37. package/dist/headless-ui-DRGWDg9Z.js.map +1 -0
  38. package/dist/{interactive-5O4XQf59.js → interactive-B6OlvhSf.js} +2 -2
  39. package/dist/{interactive-5O4XQf59.js.map → interactive-B6OlvhSf.js.map} +1 -1
  40. package/dist/{mcp-D0Dni4tL.js → mcp-BprhJJ2c.js} +2 -2
  41. package/dist/{mcp-D0Dni4tL.js.map → mcp-BprhJJ2c.js.map} +1 -1
  42. package/dist/{mcp-prompt-streaming-DNCDeU51.js → mcp-prompt-streaming-E1d8DJcX.js} +5 -5
  43. package/dist/{mcp-prompt-streaming-DNCDeU51.js.map → mcp-prompt-streaming-E1d8DJcX.js.map} +1 -1
  44. package/dist/{mint-failure-CQqypC_v.js → mint-failure-C82j0RMC.js} +42 -17
  45. package/dist/mint-failure-C82j0RMC.js.map +1 -0
  46. package/dist/{non-interactive-D5-lCBy6.js → non-interactive-DGT2H_n4.js} +2 -2
  47. package/dist/{non-interactive-D5-lCBy6.js.map → non-interactive-DGT2H_n4.js.map} +1 -1
  48. package/dist/{orchestrator-tools-D8ZQS2DM.js → orchestrator-tools-BBBNV1z5.js} +3 -3
  49. package/dist/{orchestrator-tools-D8ZQS2DM.js.map → orchestrator-tools-BBBNV1z5.js.map} +1 -1
  50. package/dist/{package-manager-hyP-CPSZ.js → package-manager-DU3aVif4.js} +2 -2
  51. package/dist/{package-manager-hyP-CPSZ.js.map → package-manager-DU3aVif4.js.map} +1 -1
  52. package/dist/{pi-DARAk2I_.js → pi-fG5fT50Y.js} +12 -12
  53. package/dist/{pi-DARAk2I_.js.map → pi-fG5fT50Y.js.map} +1 -1
  54. package/dist/{playground-Djabnagq.js → playground-UFSHP-Yn.js} +6 -6
  55. package/dist/{playground-Djabnagq.js.map → playground-UFSHP-Yn.js.map} +1 -1
  56. package/dist/{posthog-C3Sncfan.js → posthog-O9kKcnda.js} +2 -2
  57. package/dist/{posthog-C3Sncfan.js.map → posthog-O9kKcnda.js.map} +1 -1
  58. package/dist/{provisioning-B74q1uSQ.js → provisioning-B-tzjG4r.js} +3 -3
  59. package/dist/{provisioning-B74q1uSQ.js.map → provisioning-B-tzjG4r.js.map} +1 -1
  60. package/dist/{queue-tools-FLMG8hcB.js → queue-tools-7Oso-fpt.js} +3 -3
  61. package/dist/{queue-tools-FLMG8hcB.js.map → queue-tools-7Oso-fpt.js.map} +1 -1
  62. package/dist/{registry-DZoReEU3.js → registry-D1L5e-WQ.js} +5 -5
  63. package/dist/{registry-DZoReEU3.js.map → registry-D1L5e-WQ.js.map} +1 -1
  64. package/dist/{security-DiBFYwh7.js → security-n3-xdINN.js} +5 -5
  65. package/dist/{security-DiBFYwh7.js.map → security-n3-xdINN.js.map} +1 -1
  66. package/dist/{setup-utils-C3tsa6D6.js → setup-utils-Bj0gejEf.js} +8 -8
  67. package/dist/{setup-utils-C3tsa6D6.js.map → setup-utils-Bj0gejEf.js.map} +1 -1
  68. package/dist/{start-tui-BXjJGNx2.js → start-tui-BowrTPXm.js} +20 -33
  69. package/dist/start-tui-BowrTPXm.js.map +1 -0
  70. package/dist/{steps-CeFanezY.js → steps-CpNTGu9N.js} +7 -7
  71. package/dist/{steps-CeFanezY.js.map → steps-CpNTGu9N.js.map} +1 -1
  72. package/dist/{store-DN_6FaoQ.js → store-CVkJKlny.js} +5 -5
  73. package/dist/store-CVkJKlny.js.map +1 -0
  74. package/dist/{subagent-BzhCH9c3.js → subagent-SxmvfDfp.js} +2 -2
  75. package/dist/{subagent-BzhCH9c3.js.map → subagent-SxmvfDfp.js.map} +1 -1
  76. package/dist/{task-DZKmaWYF.js → task-nF7Ry8ff.js} +17 -14
  77. package/dist/task-nF7Ry8ff.js.map +1 -0
  78. package/dist/{task-stream-h-b1nWdM.js → task-stream-C9BLiAhz.js} +48 -6
  79. package/dist/task-stream-C9BLiAhz.js.map +1 -0
  80. package/dist/{tasks-0Rb5AXpz.js → tasks-BEEVIBcT.js} +2 -2
  81. package/dist/{tasks-0Rb5AXpz.js.map → tasks-BEEVIBcT.js.map} +1 -1
  82. package/dist/{telemetry-QpeVhVtU.js → telemetry-PD7bhcda.js} +3 -3
  83. package/dist/{telemetry-QpeVhVtU.js.map → telemetry-PD7bhcda.js.map} +1 -1
  84. package/dist/{terminal-dLoYiXsd.js → terminal-NhNl-BIA.js} +12 -12
  85. package/dist/{terminal-dLoYiXsd.js.map → terminal-NhNl-BIA.js.map} +1 -1
  86. package/dist/{tools-DmwO0eBZ.js → tools-BBdpgcIf.js} +82 -18
  87. package/dist/tools-BBdpgcIf.js.map +1 -0
  88. package/dist/{wizard-abort-C9Jbm-m7.js → wizard-abort-D3YA1hXX.js} +1 -1
  89. package/dist/{wizard-abort-B0c5VDie.js → wizard-abort-hqHF-9xD.js} +3 -3
  90. package/dist/{wizard-abort-B0c5VDie.js.map → wizard-abort-hqHF-9xD.js.map} +1 -1
  91. package/dist/{yara-hooks-uCiAIcqU.js → yara-hooks-BaPKsm-B.js} +4 -4
  92. package/dist/{yara-hooks-uCiAIcqU.js.map → yara-hooks-BaPKsm-B.js.map} +1 -1
  93. package/dist/yara-hooks-CwfQuEl3.js +2 -0
  94. package/package.json +1 -1
  95. package/dist/agent-interface-BKLTDSyN.js.map +0 -1
  96. package/dist/agent-runner-BkQontri.js.map +0 -1
  97. package/dist/analytics-DSK0GXg1.js.map +0 -1
  98. package/dist/analytics-yurAACt5.js +0 -2
  99. package/dist/debug-DUmMVUHn.js.map +0 -1
  100. package/dist/headless-ui-CQ46FOTh.js.map +0 -1
  101. package/dist/mint-failure-CQqypC_v.js.map +0 -1
  102. package/dist/start-tui-BXjJGNx2.js.map +0 -1
  103. package/dist/store-DN_6FaoQ.js.map +0 -1
  104. package/dist/task-DZKmaWYF.js.map +0 -1
  105. package/dist/task-stream-h-b1nWdM.js.map +0 -1
  106. package/dist/tools-DmwO0eBZ.js.map +0 -1
  107. package/dist/yara-hooks-B7prW1Ng.js +0 -2
@@ -1,8 +1,10 @@
1
- import { s as logToFile } from "./debug-DUmMVUHn.js";
2
- import { n as analytics } from "./analytics-DSK0GXg1.js";
3
- import { A as WIZARD_ASK_TOOL_DESCRIPTION, B as mergeEnvValues, C as publishHandoff, D as WIZARD_ASK_KIND_DESCRIPTION, E as ENV_FILE_PATH_DESCRIPTION, G as templateEnvWriteRefusal, H as resolveAskQuestionKinds, I as ensureGitignoreCoverage, K as vaultSensitiveAnswers, L as fetchSkillMenu, M as checkEnvKeys, N as createAskAccounting, O as WIZARD_ASK_SENSITIVE_DESCRIPTION, P as describeAskCancellation, R as installSkillById, S as PUBLISH_HANDOFF_TOOL_NAME, T as CHECK_ENV_KEYS_FILE_PATH_DESCRIPTION, U as resolveEnvPath, V as normaliseAskSubject, W as resolveEnvSecretRefs, X as isFullyCancelled, b as PUBLISH_HANDOFF_CONTENT_DESCRIPTION, j as WIZARD_TOOL_NAMES, k as WIZARD_ASK_SUBJECT_DESCRIPTION, w as CHECK_ENV_KEYS_DESCRIPTION, x as PUBLISH_HANDOFF_DESCRIPTION, y as createSecretVault, z as legacyKeyNameRefusal } from "./agent-interface-BKLTDSyN.js";
4
- import { a as detectNodePackageManagers } from "./package-manager-hyP-CPSZ.js";
5
- import { o as withMode } from "./pi-DARAk2I_.js";
1
+ import { s as logToFile } from "./debug-DWYDVp0B.js";
2
+ import { n as analytics } from "./analytics-DSVyjIVF.js";
3
+ import { $ as resolveEnvSecretRefs, A as AUDIT_STATUSES, B as checkEnvKeys, C as publishHandoff, D as AUDIT_RESOLVE_CHECKS_PARAM_DESCRIPTION, E as AUDIT_RESOLVE_CHECKS_DESCRIPTION, F as WIZARD_ASK_SENSITIVE_DESCRIPTION, G as fetchSkillMenu, H as describeAskCancellation, I as WIZARD_ASK_SUBJECT_DESCRIPTION, J as mergeEnvValues, K as installSkillById, L as WIZARD_ASK_TOOL_DESCRIPTION, M as CHECK_ENV_KEYS_FILE_PATH_DESCRIPTION, N as ENV_FILE_PATH_DESCRIPTION, O as AUDIT_SEED_CHECKS_DESCRIPTION, P as WIZARD_ASK_KIND_DESCRIPTION, Q as resolveEnvPath, R as WIZARD_TOOL_NAMES, S as PUBLISH_HANDOFF_TOOL_NAME, T as AUDIT_ADD_CHECKS_PARAM_DESCRIPTION, V as createAskAccounting, W as ensureGitignoreCoverage, X as resolveAskQuestionKinds, Y as normaliseAskSubject, Z as resolveAuditChecks, b as PUBLISH_HANDOFF_CONTENT_DESCRIPTION, et as seedAuditChecks, j as CHECK_ENV_KEYS_DESCRIPTION, k as AUDIT_SEED_CHECKS_PARAM_DESCRIPTION, nt as vaultSensitiveAnswers, ot as isFullyCancelled, q as legacyKeyNameRefusal, tt as templateEnvWriteRefusal, w as AUDIT_ADD_CHECKS_DESCRIPTION, x as PUBLISH_HANDOFF_DESCRIPTION, y as createSecretVault, z as addAuditChecks } from "./agent-interface-DPaPdIjS.js";
4
+ import { a as detectNodePackageManagers } from "./package-manager-DU3aVif4.js";
5
+ import { g as AUDIT_CHECKS_FILE } from "./yara-hooks-BaPKsm-B.js";
6
+ import { S as makeMutex } from "./queue-tools-7Oso-fpt.js";
7
+ import { o as withMode } from "./pi-fG5fT50Y.js";
6
8
  import fs from "fs";
7
9
  import path from "path";
8
10
  import { Type } from "typebox";
@@ -112,6 +114,64 @@ function createWizardPiTools(ctx) {
112
114
  return text(`Wrote ${Object.keys(args.values).length} key(s) to ${args.filePath}.`);
113
115
  }
114
116
  });
117
+ const auditLedgerPath = path.join(workingDirectory, AUDIT_CHECKS_FILE);
118
+ const auditMutex = makeMutex();
119
+ const auditStatus = Type.Union(AUDIT_STATUSES.map((s) => Type.Literal(s)), { description: "Check outcome" });
120
+ const auditCheck = Type.Object({
121
+ id: Type.String({ description: "Stable kebab-case check id" }),
122
+ area: Type.String({ description: "Short group name, e.g. Installation" }),
123
+ label: Type.String({ description: "Short human name for the check" }),
124
+ status: auditStatus,
125
+ file: Type.Optional(Type.String({ description: "Optional path:line" })),
126
+ details: Type.Optional(Type.String({ description: "Optional one-line explanation" }))
127
+ });
128
+ const auditSeedChecks = defineTool({
129
+ name: "audit_seed_checks",
130
+ label: "Seed audit checks",
131
+ description: AUDIT_SEED_CHECKS_DESCRIPTION,
132
+ promptSnippet: "audit_seed_checks(checks) — write the full pending checklist to the audit ledger",
133
+ parameters: Type.Object({ checks: Type.Array(auditCheck, { description: AUDIT_SEED_CHECKS_PARAM_DESCRIPTION }) }),
134
+ execute: (_id, args) => auditMutex(() => {
135
+ const result = seedAuditChecks(auditLedgerPath, args.checks);
136
+ logToFile(`[pi] audit_seed_checks: ${result.message}`);
137
+ return text(result.message);
138
+ })
139
+ });
140
+ const auditAddChecks = defineTool({
141
+ name: "audit_add_checks",
142
+ label: "Add audit checks",
143
+ description: AUDIT_ADD_CHECKS_DESCRIPTION,
144
+ promptSnippet: "audit_add_checks(checks) — append runtime-discovered checks to the ledger",
145
+ parameters: Type.Object({ checks: Type.Array(auditCheck, {
146
+ minItems: 1,
147
+ description: AUDIT_ADD_CHECKS_PARAM_DESCRIPTION
148
+ }) }),
149
+ execute: (_id, args) => auditMutex(() => {
150
+ const result = addAuditChecks(auditLedgerPath, args.checks);
151
+ logToFile(`[pi] audit_add_checks: ${result.message}`);
152
+ return text(result.message);
153
+ })
154
+ });
155
+ const auditResolveChecks = defineTool({
156
+ name: "audit_resolve_checks",
157
+ label: "Resolve audit checks",
158
+ description: AUDIT_RESOLVE_CHECKS_DESCRIPTION,
159
+ promptSnippet: "audit_resolve_checks(updates) — patch each check by id as you finish it",
160
+ parameters: Type.Object({ updates: Type.Array(Type.Object({
161
+ id: Type.String({ description: "Existing check id" }),
162
+ status: auditStatus,
163
+ file: Type.Optional(Type.String({ description: "Optional path:line" })),
164
+ details: Type.Optional(Type.String({ description: "Optional one-line explanation" }))
165
+ }), {
166
+ minItems: 1,
167
+ description: AUDIT_RESOLVE_CHECKS_PARAM_DESCRIPTION
168
+ }) }),
169
+ execute: (_id, args) => auditMutex(() => {
170
+ const result = resolveAuditChecks(auditLedgerPath, args.updates);
171
+ logToFile(`[pi] audit_resolve_checks: ${result.message}`);
172
+ return text(result.message);
173
+ })
174
+ });
115
175
  const detectPm = defineTool({
116
176
  name: "detect_package_manager",
117
177
  label: "Detect package manager",
@@ -199,24 +259,28 @@ function createWizardPiTools(ctx) {
199
259
  }
200
260
  }
201
261
  });
262
+ const publishHandoffTool = defineTool({
263
+ name: PUBLISH_HANDOFF_TOOL_NAME,
264
+ label: "Publish handoff",
265
+ description: PUBLISH_HANDOFF_DESCRIPTION,
266
+ promptSnippet: "publish_handoff(content) — publish the full report markdown to the wizard session",
267
+ parameters: Type.Object({ content: Type.String({ description: PUBLISH_HANDOFF_CONTENT_DESCRIPTION }) }),
268
+ execute(_id, args) {
269
+ const result = publishHandoff(args.content);
270
+ logToFile(`[pi] publish_handoff: ${result.message}`);
271
+ return Promise.resolve(text(result.message));
272
+ }
273
+ });
202
274
  const tools = [
203
275
  loadSkillMenu,
204
276
  installSkill,
205
277
  checkEnvKeys$1,
206
278
  setEnvValues,
207
279
  detectPm,
208
- withMode(defineTool({
209
- name: PUBLISH_HANDOFF_TOOL_NAME,
210
- label: "Publish handoff",
211
- description: PUBLISH_HANDOFF_DESCRIPTION,
212
- promptSnippet: "publish_handoff(content) — publish the full report markdown to the wizard session",
213
- parameters: Type.Object({ content: Type.String({ description: PUBLISH_HANDOFF_CONTENT_DESCRIPTION }) }),
214
- execute(_id, args) {
215
- const result = publishHandoff(args.content);
216
- logToFile(`[pi] publish_handoff: ${result.message}`);
217
- return Promise.resolve(text(result.message));
218
- }
219
- }), "sequential")
280
+ withMode(auditSeedChecks, "parallel"),
281
+ withMode(auditAddChecks, "parallel"),
282
+ withMode(auditResolveChecks, "parallel"),
283
+ withMode(publishHandoffTool, "sequential")
220
284
  ];
221
285
  if (!(ctx.disallowedTools?.includes(WIZARD_TOOL_NAMES.wizardAsk) ?? false)) tools.push(withMode(wizardAsk, "sequential"));
222
286
  return tools;
@@ -224,4 +288,4 @@ function createWizardPiTools(ctx) {
224
288
  //#endregion
225
289
  export { createWizardPiTools };
226
290
 
227
- //# sourceMappingURL=tools-DmwO0eBZ.js.map
291
+ //# sourceMappingURL=tools-BBdpgcIf.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools-BBdpgcIf.js","names":["checkEnvKeys","checkEnvKeysCore"],"sources":["../src/lib/agent/runner/harness/pi/tools.ts"],"sourcesContent":["/**\n * Wizard capabilities as pi custom tools (#5). pi does not mount MCP servers,\n * so the tools the wizard prompt depends on — skill discovery/install and\n * fenced `.env` edits — are exposed to pi as native `defineTool` tools backed\n * by the same helpers the claude-agent-sdk path uses (`fetchSkillMenu`,\n * `installSkillById`, `checkEnvKeys`, `mergeEnvValues`). Same tool names as the\n * MCP server so the shared prompt is unchanged. `wizard_ask` is wired here too\n * (same schema, caps, and askBridge as the MCP tool) so interactive programs\n * can interview the user on pi; without a bridge (CI) it errors on call.\n * Sensitive answers are vaulted to `{secretRef}` and resolved host-side by\n * set_env_values — the raw value never enters the model conversation.\n */\n\nimport fs from 'fs';\nimport path from 'path';\nimport { Type } from 'typebox';\nimport { defineTool } from '@earendil-works/pi-coding-agent';\nimport type { ToolDefinition } from '@earendil-works/pi-coding-agent';\nimport { analytics } from '@utils/analytics';\nimport { logToFile } from '@utils/debug';\nimport {\n AUDIT_ADD_CHECKS_DESCRIPTION,\n AUDIT_ADD_CHECKS_PARAM_DESCRIPTION,\n AUDIT_RESOLVE_CHECKS_DESCRIPTION,\n AUDIT_RESOLVE_CHECKS_PARAM_DESCRIPTION,\n AUDIT_SEED_CHECKS_DESCRIPTION,\n AUDIT_SEED_CHECKS_PARAM_DESCRIPTION,\n AUDIT_STATUSES,\n CHECK_ENV_KEYS_DESCRIPTION,\n CHECK_ENV_KEYS_FILE_PATH_DESCRIPTION,\n DEFAULT_ASK_MAX_QUESTIONS,\n ENV_FILE_PATH_DESCRIPTION,\n WIZARD_TOOL_NAMES,\n addAuditChecks,\n checkEnvKeys as checkEnvKeysCore,\n resolveAuditChecks,\n seedAuditChecks,\n createAskAccounting,\n describeAskCancellation,\n ensureGitignoreCoverage,\n fetchSkillMenu,\n installSkillById,\n mergeEnvValues,\n normaliseAskSubject,\n resolveAskQuestionKinds,\n resolveEnvPath,\n resolveEnvSecretRefs,\n templateEnvWriteRefusal,\n legacyKeyNameRefusal,\n vaultSensitiveAnswers,\n WIZARD_ASK_KIND_DESCRIPTION,\n WIZARD_ASK_SENSITIVE_DESCRIPTION,\n WIZARD_ASK_SUBJECT_DESCRIPTION,\n WIZARD_ASK_TOOL_DESCRIPTION,\n} from '@lib/wizard-tools/tools';\nimport type { LLMProvider } from '@posthog/warlock';\nimport { isFullyCancelled, type WizardAskBridge } from '@lib/wizard-ask-bridge';\nimport {\n PUBLISH_HANDOFF_CONTENT_DESCRIPTION,\n PUBLISH_HANDOFF_DESCRIPTION,\n PUBLISH_HANDOFF_TOOL_NAME,\n publishHandoff,\n} from '@lib/wizard-tools/handoff';\nimport { createSecretVault } from '@lib/secret-vault';\nimport { AUDIT_CHECKS_FILE } from '@lib/programs/audit/types';\nimport type { AuditCheck, AuditStatus } from '@lib/programs/audit/types';\nimport { makeMutex } from '@utils/atomic-ledger';\nimport { withMode } from './index';\nimport {\n detectNodePackageManagers,\n type PackageManagerDetector,\n} from '@lib/detection/package-manager';\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\nexport interface PiToolsContext {\n workingDirectory: string;\n skillsBaseUrl: string;\n /** Framework's package-manager detector. Defaults to Node detection. */\n detectPackageManager?: PackageManagerDetector;\n /** Drives the `wizard_ask` overlay. Omitted in CI → the tool errors on call. */\n askBridge?: WizardAskBridge;\n /** Per-run cap on wizard_ask calls. Defaults to {@link DEFAULT_ASK_MAX_QUESTIONS}. */\n maxQuestions?: number;\n /** Overlay open/closed signal — the security gate blocks Write/Edit while open. */\n onAskPendingChange?: (pending: boolean) => void;\n /** Program disallow list; gates wizard_ask here since pi tools carry bare names the MCP-prefixed security gate misses. */\n disallowedTools?: readonly string[];\n /** Scan-triage classifier, resolved once in bootstrap. Absent → scans fail closed. */\n triageProvider?: LLMProvider;\n}\n\nexport function createWizardPiTools(ctx: PiToolsContext): ToolDefinition[] {\n const {\n workingDirectory,\n skillsBaseUrl,\n askBridge,\n onAskPendingChange,\n triageProvider,\n } = ctx;\n const detectPackageManager =\n ctx.detectPackageManager ?? detectNodePackageManagers;\n const askMaxQuestions = ctx.maxQuestions ?? DEFAULT_ASK_MAX_QUESTIONS;\n // Per-run wizard_ask accounting (total cap + one-time per-subject adjacency\n // nudge). Same shared implementation the MCP server drives, so the two\n // facades cannot diverge on the cap, the nudge or the refund.\n const askAccounting = createAskAccounting(askMaxQuestions);\n // Session-scoped secret vault, same contract as the MCP server: wizard_ask\n // mints `{secretRef}` for sensitive answers, set_env_values resolves them.\n const secretVault = createSecretVault();\n\n // Fetch the skill menu at most once per run — the agent calls load_skill_menu\n // 2-3× otherwise, each a fresh HTTP round-trip (profiled slowness).\n let menuPromise: ReturnType<typeof fetchSkillMenu> | undefined;\n const getSkillMenu = () => (menuPromise ??= fetchSkillMenu(skillsBaseUrl));\n\n const loadSkillMenu = defineTool({\n name: 'load_skill_menu',\n label: 'Load skill menu',\n description:\n 'Load available PostHog skills for a category. Returns skill IDs and names. Call this first, then install_skill with the chosen ID.',\n promptSnippet:\n 'load_skill_menu(category) — list installable PostHog skills',\n parameters: Type.Object({\n category: Type.String({\n description: 'Skill category, e.g. \"integration\"',\n }),\n }),\n async execute(_id, args) {\n const menu = await getSkillMenu();\n if (!menu) return text('Error: could not load the skill menu.');\n const skills = menu.categories[args.category] ?? [];\n if (skills.length === 0) {\n return text(`No skills found for category \"${args.category}\".`);\n }\n logToFile(`[pi] load_skill_menu: ${skills.length} skills`);\n return text(skills.map((s) => `- ${s.id}: ${s.name}`).join('\\n'));\n },\n });\n\n const installSkill = defineTool({\n name: 'install_skill',\n label: 'Install skill',\n description:\n 'Download and install a PostHog skill by ID into .claude/skills/<skillId>/. Call load_skill_menu first. Then read the installed SKILL.md and follow it.',\n promptSnippet:\n 'install_skill(skillId) — install a skill, then read its SKILL.md',\n parameters: Type.Object({\n skillId: Type.String({ description: 'Skill ID from load_skill_menu' }),\n }),\n async execute(_id, args) {\n const result = await installSkillById(\n args.skillId,\n workingDirectory,\n skillsBaseUrl,\n { triage: triageProvider },\n );\n if (result.kind !== 'ok') {\n logToFile(`[pi] install_skill ${args.skillId}: ${result.kind}`);\n return text(\n `Error installing skill \"${args.skillId}\": ${result.kind}. Use load_skill_menu to see valid IDs.`,\n );\n }\n logToFile(`[pi] install_skill ${args.skillId} -> ${result.path}`);\n return text(\n `Installed \"${args.skillId}\" at ${result.path}. Read ${result.path}/SKILL.md and follow it.`,\n );\n },\n });\n\n const checkEnvKeys = defineTool({\n name: 'check_env_keys',\n label: 'Check env keys',\n description: CHECK_ENV_KEYS_DESCRIPTION,\n promptSnippet:\n 'check_env_keys(keys) — see which .env keys exist, and in which file',\n parameters: Type.Object({\n filePath: Type.Optional(\n Type.String({\n description: CHECK_ENV_KEYS_FILE_PATH_DESCRIPTION,\n }),\n ),\n keys: Type.Array(Type.String(), {\n description: 'Environment variable key names to check',\n }),\n }),\n // `async` with nothing to await, on purpose: it is what turns a thrown\n // error into a rejection. `checkEnvKeys` throws on a filePath that escapes\n // the working directory, and pi wraps `execute` in a plain (non-async)\n // arrow, so without this the throw leaves the tool synchronously instead\n // of arriving as a failed tool call. The scan replaced an awaited read,\n // which is the only reason there is nothing left to await.\n // eslint-disable-next-line @typescript-eslint/require-await\n async execute(_id, args) {\n const results = checkEnvKeysCore(\n workingDirectory,\n args.keys,\n args.filePath,\n );\n return text(JSON.stringify(results, null, 2));\n },\n });\n\n const setEnvValues = defineTool({\n name: 'set_env_values',\n label: 'Set env values',\n description:\n 'Create or update environment variable keys in a .env file (creates the file if missing). Each value is either a literal string or a secret reference `{ \"secretRef\": \"secret:...\" }` returned by wizard_ask — refs are resolved locally, so the actual value is written to the file but never returned to the agent.',\n promptSnippet:\n 'set_env_values(filePath, values) — write .env keys (never hardcode secrets in source)',\n parameters: Type.Object({\n filePath: Type.String({\n description: ENV_FILE_PATH_DESCRIPTION,\n }),\n values: Type.Record(\n Type.String(),\n Type.Union([Type.String(), Type.Object({ secretRef: Type.String() })]),\n {\n description:\n 'Key → (literal string OR { secretRef } pointing to a vaulted secret)',\n },\n ),\n }),\n async execute(_id, args) {\n const keyRefusal = legacyKeyNameRefusal(\n workingDirectory,\n Object.keys(args.values),\n );\n if (keyRefusal) return text(keyRefusal);\n // Resolve secret refs host-side; the value never reaches the agent.\n const resolution = resolveEnvSecretRefs(args.values, secretVault);\n if (!resolution.ok) {\n return text(\n `Error: secret reference \"${resolution.secretRef}\" for key \"${resolution.key}\" is not known to the vault. The ref may have expired, been minted in a different run, or been mistyped.`,\n );\n }\n const resolved = resolveEnvPath(workingDirectory, args.filePath);\n const templateRefusal = templateEnvWriteRefusal(resolved);\n if (templateRefusal) {\n logToFile(`[pi] set_env_values: refused template target ${resolved}`);\n analytics.wizardCapture('set_env_values template target refused', {\n file_name: path.basename(resolved),\n });\n return text(templateRefusal);\n }\n const existing = fs.existsSync(resolved)\n ? await fs.promises.readFile(resolved, 'utf8')\n : '';\n const merged = mergeEnvValues(existing, resolution.values);\n const dir = path.dirname(resolved);\n if (!fs.existsSync(dir))\n await fs.promises.mkdir(dir, { recursive: true });\n await fs.promises.writeFile(resolved, merged, 'utf8');\n // Same post-write pass as the MCP facade: a credential file the\n // project does not ignore yet gets committed by the next `git add`.\n ensureGitignoreCoverage(workingDirectory, path.basename(resolved));\n logToFile(\n `[pi] set_env_values: ${resolved} keys=${Object.keys(args.values).join(\n ',',\n )}`,\n );\n return text(\n `Wrote ${Object.keys(args.values).length} key(s) to ${args.filePath}.`,\n );\n },\n });\n\n // ── Audit ledger ────────────────────────────────────────────────────\n // Native mirror of the three MCP audit tools; pi mounts no MCP server, so\n // without these an audit cannot move a check off pending. Descriptions and\n // write semantics come from the shared helpers, so the facades cannot drift.\n const auditLedgerPath = path.join(workingDirectory, AUDIT_CHECKS_FILE);\n const auditMutex = makeMutex();\n const auditStatus = Type.Union(\n AUDIT_STATUSES.map((s) => Type.Literal(s)),\n { description: 'Check outcome' },\n );\n const auditCheck = Type.Object({\n id: Type.String({ description: 'Stable kebab-case check id' }),\n area: Type.String({ description: 'Short group name, e.g. Installation' }),\n label: Type.String({ description: 'Short human name for the check' }),\n status: auditStatus,\n file: Type.Optional(Type.String({ description: 'Optional path:line' })),\n details: Type.Optional(\n Type.String({ description: 'Optional one-line explanation' }),\n ),\n });\n\n const auditSeedChecks = defineTool({\n name: 'audit_seed_checks',\n label: 'Seed audit checks',\n description: AUDIT_SEED_CHECKS_DESCRIPTION,\n promptSnippet:\n 'audit_seed_checks(checks) — write the full pending checklist to the audit ledger',\n parameters: Type.Object({\n checks: Type.Array(auditCheck, {\n description: AUDIT_SEED_CHECKS_PARAM_DESCRIPTION,\n }),\n }),\n execute: (_id, args) =>\n auditMutex(() => {\n const result = seedAuditChecks(\n auditLedgerPath,\n args.checks as AuditCheck[],\n );\n logToFile(`[pi] audit_seed_checks: ${result.message}`);\n return text(result.message);\n }),\n });\n\n const auditAddChecks = defineTool({\n name: 'audit_add_checks',\n label: 'Add audit checks',\n description: AUDIT_ADD_CHECKS_DESCRIPTION,\n promptSnippet:\n 'audit_add_checks(checks) — append runtime-discovered checks to the ledger',\n parameters: Type.Object({\n checks: Type.Array(auditCheck, {\n minItems: 1,\n description: AUDIT_ADD_CHECKS_PARAM_DESCRIPTION,\n }),\n }),\n execute: (_id, args) =>\n auditMutex(() => {\n const result = addAuditChecks(\n auditLedgerPath,\n args.checks as AuditCheck[],\n );\n logToFile(`[pi] audit_add_checks: ${result.message}`);\n return text(result.message);\n }),\n });\n\n const auditResolveChecks = defineTool({\n name: 'audit_resolve_checks',\n label: 'Resolve audit checks',\n description: AUDIT_RESOLVE_CHECKS_DESCRIPTION,\n promptSnippet:\n 'audit_resolve_checks(updates) — patch each check by id as you finish it',\n parameters: Type.Object({\n updates: Type.Array(\n Type.Object({\n id: Type.String({ description: 'Existing check id' }),\n status: auditStatus,\n file: Type.Optional(\n Type.String({ description: 'Optional path:line' }),\n ),\n details: Type.Optional(\n Type.String({ description: 'Optional one-line explanation' }),\n ),\n }),\n { minItems: 1, description: AUDIT_RESOLVE_CHECKS_PARAM_DESCRIPTION },\n ),\n }),\n execute: (_id, args) =>\n auditMutex(() => {\n const result = resolveAuditChecks(\n auditLedgerPath,\n args.updates as Array<{\n id: string;\n status: AuditStatus;\n file?: string;\n details?: string;\n }>,\n );\n logToFile(`[pi] audit_resolve_checks: ${result.message}`);\n return text(result.message);\n }),\n });\n\n const detectPm = defineTool({\n name: 'detect_package_manager',\n label: 'Detect package manager',\n description:\n \"Detect the project's package manager(s). Returns the name and the install command for each. Call this before installing a dependency, then RUN the returned install command (with the posthog package) via bash — the SDK package must end up in the project manifest, or the app will not build.\",\n promptSnippet:\n 'detect_package_manager() — find the PM + install command, then run it via bash to add the SDK',\n parameters: Type.Object({}),\n async execute() {\n const result = await detectPackageManager(workingDirectory);\n logToFile(\n `[pi] detect_package_manager: ${result.detected.length} detected`,\n );\n return text(JSON.stringify(result, null, 2));\n },\n });\n\n // Native mirror of the MCP `wizard_ask` tool: same name, schema, and\n // askBridge, so the shared prompt is unchanged.\n const wizardAsk = defineTool({\n name: 'wizard_ask',\n label: 'Ask the user',\n description: WIZARD_ASK_TOOL_DESCRIPTION,\n promptSnippet:\n 'wizard_ask(questions, subject) — ask the user structured questions and wait for answers; tag each call with the subject it collects for',\n parameters: Type.Object({\n questions: Type.Array(\n Type.Object({\n id: Type.String({\n description: 'Stable key for the answer in the response map',\n }),\n prompt: Type.String({\n description: 'Question text shown to the user',\n }),\n kind: Type.Optional(\n Type.Union(\n [\n Type.Literal('single'),\n Type.Literal('multi'),\n Type.Literal('text'),\n ],\n { description: WIZARD_ASK_KIND_DESCRIPTION },\n ),\n ),\n options: Type.Optional(\n Type.Array(\n Type.Object({\n label: Type.String(),\n value: Type.String(),\n description: Type.Optional(Type.String()),\n }),\n {\n description:\n 'Required for kind=single|multi; ignored for kind=text',\n },\n ),\n ),\n required: Type.Optional(\n Type.Boolean({ description: 'Defaults to true' }),\n ),\n sensitive: Type.Optional(\n Type.Boolean({\n description: WIZARD_ASK_SENSITIVE_DESCRIPTION,\n }),\n ),\n }),\n { minItems: 1, maxItems: 8 },\n ),\n subject: Type.Optional(\n Type.String({ description: WIZARD_ASK_SUBJECT_DESCRIPTION }),\n ),\n }),\n async execute(_id, args) {\n if (!askBridge) {\n return text(\n 'Error: wizard_ask is not available in this environment (CI / non-interactive). Proceed with sensible defaults or emit [ABORT] requirements-incomplete.',\n );\n }\n\n const cap = askAccounting.evaluate(args.subject);\n if (cap.kind === 'capped') {\n const { callCount } = askAccounting.snapshot();\n logToFile(\n `[pi] wizard_ask capped: reason=${cap.reason} count=${callCount} subject=${cap.subject} run=${cap.subjectRunLength}`,\n );\n analytics.wizardCapture('wizard_ask capped', {\n reason: cap.reason,\n call_count: callCount,\n max_questions: askMaxQuestions,\n subject: cap.subject,\n subject_run_length: cap.subjectRunLength,\n });\n return text(cap.message);\n }\n\n // A question with no kind takes the one its options imply, so the\n // overlay always has an input to render. See resolveAskQuestionKinds.\n const questions = resolveAskQuestionKinds(args.questions);\n\n // The schema can't enforce per-kind requirements or unique ids.\n const ids = new Set<string>();\n for (const q of questions) {\n if ((q.kind === 'single' || q.kind === 'multi') && !q.options?.length) {\n return text(\n `Error: question \"${q.id}\" has kind=\"${q.kind}\" but no options. Provide at least one { label, value }, or use kind=\"text\".`,\n );\n }\n if (q.sensitive && q.kind !== 'text') {\n return text(\n `Error: question \"${q.id}\" sets sensitive=true but kind=\"${q.kind}\". Only kind=\"text\" answers can be sensitive.`,\n );\n }\n if (ids.has(q.id)) {\n return text(\n `Error: duplicate question id \"${q.id}\". Each question needs a unique id.`,\n );\n }\n ids.add(q.id);\n }\n\n // Optimistically take the slot; refund it on a cancellation or a bridge\n // error so a declined/failed ask doesn't burn the budget for later ones.\n askAccounting.record(args.subject);\n // Block Write/Edit for as long as the overlay is open, so the agent can't\n // mutate files while it's waiting on the user's answer.\n onAskPendingChange?.(true);\n try {\n const { answers, timedOut } = await askBridge.request({\n questions,\n subject: normaliseAskSubject(args.subject),\n });\n if (isFullyCancelled(answers)) askAccounting.refund(args.subject);\n // Sensitive answers go to the vault; the agent sees an opaque ref\n // (same contract as the MCP wizard_ask).\n const sanitised = vaultSensitiveAnswers(\n questions,\n answers,\n secretVault,\n );\n // State an uncollected field as an outcome rather than leaving the\n // agent to recognise a sentinel answer value (same as the MCP facade).\n const cancelled = describeAskCancellation(sanitised, timedOut);\n logToFile(\n `[pi] wizard_ask: resolved ${\n Object.keys(answers).length\n } answer(s) for ${args.questions.length} question(s)${\n cancelled ? `, cancelled: ${cancelled.reason}` : ''\n }`,\n );\n return text(\n JSON.stringify(\n { answers: sanitised, ...(cancelled ? { cancelled } : {}) },\n null,\n 2,\n ),\n );\n } catch (err) {\n askAccounting.refund(args.subject);\n const message = err instanceof Error ? err.message : String(err);\n logToFile(`[pi] wizard_ask: error: ${message}`);\n return text(`Error: wizard_ask failed: ${message}`);\n } finally {\n onAskPendingChange?.(false);\n }\n },\n });\n\n // Native mirror of the MCP `publish_handoff` tool (shared description, so no drift).\n const publishHandoffTool = defineTool({\n name: PUBLISH_HANDOFF_TOOL_NAME,\n label: 'Publish handoff',\n description: PUBLISH_HANDOFF_DESCRIPTION,\n promptSnippet:\n 'publish_handoff(content) — publish the full report markdown to the wizard session',\n parameters: Type.Object({\n content: Type.String({\n description: PUBLISH_HANDOFF_CONTENT_DESCRIPTION,\n }),\n }),\n execute(_id, args) {\n const result = publishHandoff(args.content);\n logToFile(`[pi] publish_handoff: ${result.message}`);\n return Promise.resolve(text(result.message));\n },\n });\n\n const tools = [\n loadSkillMenu,\n installSkill,\n checkEnvKeys,\n setEnvValues,\n detectPm,\n // Parallel: the mutex serializes the writes, so a subagent fan-out is safe.\n withMode(auditSeedChecks, 'parallel'),\n withMode(auditAddChecks, 'parallel'),\n withMode(auditResolveChecks, 'parallel'),\n // Sequential: it mutates the store's handoff state.\n withMode(publishHandoffTool, 'sequential'),\n ];\n // Register wizard_ask only when the program allows it. posthog-integration\n // disallows it (runs without structured user input); self-driving keeps it.\n // Sequential: the ask bridge holds a single in-flight question slot, so a\n // batched turn must never dispatch two asks (or an ask + a write) at once.\n const askDisallowed =\n ctx.disallowedTools?.includes(WIZARD_TOOL_NAMES.wizardAsk) ?? false;\n if (!askDisallowed) tools.push(withMode(wizardAsk, 'sequential'));\n return tools;\n}\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import { i as wizardAbort, t as WizardError } from "./wizard-abort-B0c5VDie.js";
1
+ import { i as wizardAbort, t as WizardError } from "./wizard-abort-hqHF-9xD.js";
2
2
  export { WizardError, wizardAbort };
@@ -1,7 +1,7 @@
1
1
  import { n as sanitizeErrorDetail, u as emitWizardError } from "./errors--OqLxmWR.js";
2
- import { f as getUI, m as LoggingUI, s as logToFile } from "./debug-DUmMVUHn.js";
2
+ import { h as LoggingUI, p as getUI, s as logToFile } from "./debug-DWYDVp0B.js";
3
3
  import "./wizard-session-FSJCkTcP.js";
4
- import { n as analytics } from "./analytics-DSK0GXg1.js";
4
+ import { n as analytics } from "./analytics-DSVyjIVF.js";
5
5
  //#region src/utils/wizard-abort.ts
6
6
  /**
7
7
  * Single exit point for the wizard. Use instead of process.exit() directly.
@@ -68,4 +68,4 @@ async function wizardAbort(options) {
68
68
  //#endregion
69
69
  export { wizardAbort as i, registerCleanup as n, runCleanups as r, WizardError as t };
70
70
 
71
- //# sourceMappingURL=wizard-abort-B0c5VDie.js.map
71
+ //# sourceMappingURL=wizard-abort-hqHF-9xD.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"wizard-abort-B0c5VDie.js","names":[],"sources":["../src/utils/wizard-abort.ts"],"sourcesContent":["/**\n * Single exit point for the wizard. Use instead of process.exit() directly.\n *\n * Sequence: cleanup -> error capture (optional) -> analytics shutdown -> outro -> process.exit\n *\n * WizardError is a data carrier passed to wizardAbort() for analytics context, never thrown.\n * The legacy abort() in setup-utils.ts delegates here.\n */\nimport { analytics } from './analytics';\nimport { logToFile } from './debug';\nimport { getUI } from '@ui';\nimport { LoggingUI } from '@ui/logging-ui';\nimport { OutroKind, type OutroData } from '@lib/wizard-session';\nimport type { ErrorCode } from '@lib/errors';\nimport { emitWizardError, sanitizeErrorDetail } from '@lib/errors';\n\nexport class WizardError extends Error {\n readonly code?: ErrorCode;\n\n constructor(\n message: string,\n public readonly context?: Record<string, unknown>,\n code?: ErrorCode,\n ) {\n super(message);\n this.name = 'WizardError';\n this.code = code;\n }\n}\n\ninterface WizardAbortOptions {\n message?: string;\n /** Structured error data. Renders via `outroError` instead of `outro`. */\n outroData?: OutroData;\n error?: Error | WizardError;\n exitCode?: number;\n code?: ErrorCode;\n detail?: Record<string, unknown>;\n}\n\nconst cleanupFns: Array<() => void> = [];\n\nexport function registerCleanup(fn: () => void): void {\n cleanupFns.push(fn);\n}\n\nexport function clearCleanup(): void {\n cleanupFns.length = 0;\n}\n\n/** Runs all registered cleanup functions and drains the array. */\nexport function runCleanups(): void {\n const fns = cleanupFns.splice(0);\n for (const fn of fns) {\n try {\n fn();\n } catch {\n /* cleanup should not prevent exit */\n }\n }\n}\n\nfunction resolveErrorCode(\n options: WizardAbortOptions,\n error: Error | WizardError | undefined,\n): ErrorCode | undefined {\n if (options.code) return options.code;\n if (error instanceof WizardError) return error.code;\n return undefined;\n}\n\nexport async function wizardAbort(\n options?: WizardAbortOptions,\n): Promise<never> {\n const {\n message = 'Wizard setup cancelled.',\n outroData,\n error,\n exitCode = 1,\n } = options ?? {};\n\n const code = resolveErrorCode(options ?? {}, error);\n const detail = options?.detail;\n\n logToFile(\n `[wizard-abort] exitCode=${exitCode}, code=${\n code ?? 'none'\n }, message: ${message}`,\n );\n if (error) {\n logToFile('[wizard-abort] error:', error);\n }\n\n // 1. Run registered cleanup functions\n runCleanups();\n\n // 2. Capture error in analytics (if provided)\n if (error) {\n analytics.captureException(error, {\n ...((error instanceof WizardError && error.context) || {}),\n ...(code ? { error_code: code } : {}),\n });\n }\n\n // 3. Shutdown analytics\n await analytics.shutdown(error ? 'error' : 'cancelled');\n\n // 4. Render the error outro. Synthesize OutroData from `message`\n // when the caller didn't provide structured data.\n const ui = getUI();\n const resolvedOutroData: OutroData = outroData ?? {\n kind: OutroKind.Error,\n message,\n };\n if (code && resolvedOutroData.kind === OutroKind.Error) {\n resolvedOutroData.errorCode ??= code;\n if (detail) resolvedOutroData.errorDetail ??= detail;\n }\n ui.outroError(resolvedOutroData);\n\n // 5. Wait for the user to dismiss the outro screen. In a TUI this gives\n // them time to read the error; in non-TUI environments it resolves\n // immediately.\n await ui.waitForOutroDismissed();\n\n // 6. Emit the machine-readable error line for non-interactive hosts\n // (LoggingUI and its HeadlessUI subclass); the TUI never sees it.\n if (code && ui instanceof LoggingUI) {\n emitWizardError({\n code,\n message: resolvedOutroData.message ?? message,\n detail: sanitizeErrorDetail(resolvedOutroData.errorDetail ?? detail),\n });\n }\n\n // 7. Exit (fires 'exit' event so TUI cleanup runs)\n return process.exit(exitCode);\n}\n"],"mappings":";;;;;;;;;;;;;AAgBA,IAAa,cAAb,cAAiC,MAAM;CACrC;CAEA,YACE,SACA,SACA,MACA;AACA,QAAM,QAAQ;AAHE,OAAA,UAAA;AAIhB,OAAK,OAAO;AACZ,OAAK,OAAO;;;AAchB,MAAM,aAAgC,EAAE;AAExC,SAAgB,gBAAgB,IAAsB;AACpD,YAAW,KAAK,GAAG;;;AAQrB,SAAgB,cAAoB;CAClC,MAAM,MAAM,WAAW,OAAO,EAAE;AAChC,MAAK,MAAM,MAAM,IACf,KAAI;AACF,MAAI;SACE;;AAMZ,SAAS,iBACP,SACA,OACuB;AACvB,KAAI,QAAQ,KAAM,QAAO,QAAQ;AACjC,KAAI,iBAAiB,YAAa,QAAO,MAAM;;AAIjD,eAAsB,YACpB,SACgB;CAChB,MAAM,EACJ,UAAU,2BACV,WACA,OACA,WAAW,MACT,WAAW,EAAE;CAEjB,MAAM,OAAO,iBAAiB,WAAW,EAAE,EAAE,MAAM;CACnD,MAAM,SAAS,SAAS;AAExB,WACE,2BAA2B,SAAS,SAClC,QAAQ,OACT,aAAa,UACf;AACD,KAAI,MACF,WAAU,yBAAyB,MAAM;AAI3C,cAAa;AAGb,KAAI,MACF,WAAU,iBAAiB,OAAO;EAChC,GAAK,iBAAiB,eAAe,MAAM,WAAY,EAAE;EACzD,GAAI,OAAO,EAAE,YAAY,MAAM,GAAG,EAAE;EACrC,CAAC;AAIJ,OAAM,UAAU,SAAS,QAAQ,UAAU,YAAY;CAIvD,MAAM,KAAK,OAAO;CAClB,MAAM,oBAA+B,aAAa;EAChD,MAAA;EACA;EACD;AACD,KAAI,QAAQ,kBAAkB,SAAA,SAA0B;AACtD,oBAAkB,cAAc;AAChC,MAAI,OAAQ,mBAAkB,gBAAgB;;AAEhD,IAAG,WAAW,kBAAkB;AAKhC,OAAM,GAAG,uBAAuB;AAIhC,KAAI,QAAQ,cAAc,UACxB,iBAAgB;EACd;EACA,SAAS,kBAAkB,WAAW;EACtC,QAAQ,oBAAoB,kBAAkB,eAAe,OAAO;EACrE,CAAC;AAIJ,QAAO,QAAQ,KAAK,SAAS"}
1
+ {"version":3,"file":"wizard-abort-hqHF-9xD.js","names":[],"sources":["../src/utils/wizard-abort.ts"],"sourcesContent":["/**\n * Single exit point for the wizard. Use instead of process.exit() directly.\n *\n * Sequence: cleanup -> error capture (optional) -> analytics shutdown -> outro -> process.exit\n *\n * WizardError is a data carrier passed to wizardAbort() for analytics context, never thrown.\n * The legacy abort() in setup-utils.ts delegates here.\n */\nimport { analytics } from './analytics';\nimport { logToFile } from './debug';\nimport { getUI } from '@ui';\nimport { LoggingUI } from '@ui/logging-ui';\nimport { OutroKind, type OutroData } from '@lib/wizard-session';\nimport type { ErrorCode } from '@lib/errors';\nimport { emitWizardError, sanitizeErrorDetail } from '@lib/errors';\n\nexport class WizardError extends Error {\n readonly code?: ErrorCode;\n\n constructor(\n message: string,\n public readonly context?: Record<string, unknown>,\n code?: ErrorCode,\n ) {\n super(message);\n this.name = 'WizardError';\n this.code = code;\n }\n}\n\ninterface WizardAbortOptions {\n message?: string;\n /** Structured error data. Renders via `outroError` instead of `outro`. */\n outroData?: OutroData;\n error?: Error | WizardError;\n exitCode?: number;\n code?: ErrorCode;\n detail?: Record<string, unknown>;\n}\n\nconst cleanupFns: Array<() => void> = [];\n\nexport function registerCleanup(fn: () => void): void {\n cleanupFns.push(fn);\n}\n\nexport function clearCleanup(): void {\n cleanupFns.length = 0;\n}\n\n/** Runs all registered cleanup functions and drains the array. */\nexport function runCleanups(): void {\n const fns = cleanupFns.splice(0);\n for (const fn of fns) {\n try {\n fn();\n } catch {\n /* cleanup should not prevent exit */\n }\n }\n}\n\nfunction resolveErrorCode(\n options: WizardAbortOptions,\n error: Error | WizardError | undefined,\n): ErrorCode | undefined {\n if (options.code) return options.code;\n if (error instanceof WizardError) return error.code;\n return undefined;\n}\n\nexport async function wizardAbort(\n options?: WizardAbortOptions,\n): Promise<never> {\n const {\n message = 'Wizard setup cancelled.',\n outroData,\n error,\n exitCode = 1,\n } = options ?? {};\n\n const code = resolveErrorCode(options ?? {}, error);\n const detail = options?.detail;\n\n logToFile(\n `[wizard-abort] exitCode=${exitCode}, code=${\n code ?? 'none'\n }, message: ${message}`,\n );\n if (error) {\n logToFile('[wizard-abort] error:', error);\n }\n\n // 1. Run registered cleanup functions\n runCleanups();\n\n // 2. Capture error in analytics (if provided)\n if (error) {\n analytics.captureException(error, {\n ...((error instanceof WizardError && error.context) || {}),\n ...(code ? { error_code: code } : {}),\n });\n }\n\n // 3. Shutdown analytics\n await analytics.shutdown(error ? 'error' : 'cancelled');\n\n // 4. Render the error outro. Synthesize OutroData from `message`\n // when the caller didn't provide structured data.\n const ui = getUI();\n const resolvedOutroData: OutroData = outroData ?? {\n kind: OutroKind.Error,\n message,\n };\n if (code && resolvedOutroData.kind === OutroKind.Error) {\n resolvedOutroData.errorCode ??= code;\n if (detail) resolvedOutroData.errorDetail ??= detail;\n }\n ui.outroError(resolvedOutroData);\n\n // 5. Wait for the user to dismiss the outro screen. In a TUI this gives\n // them time to read the error; in non-TUI environments it resolves\n // immediately.\n await ui.waitForOutroDismissed();\n\n // 6. Emit the machine-readable error line for non-interactive hosts\n // (LoggingUI and its HeadlessUI subclass); the TUI never sees it.\n if (code && ui instanceof LoggingUI) {\n emitWizardError({\n code,\n message: resolvedOutroData.message ?? message,\n detail: sanitizeErrorDetail(resolvedOutroData.errorDetail ?? detail),\n });\n }\n\n // 7. Exit (fires 'exit' event so TUI cleanup runs)\n return process.exit(exitCode);\n}\n"],"mappings":";;;;;;;;;;;;;AAgBA,IAAa,cAAb,cAAiC,MAAM;CACrC;CAEA,YACE,SACA,SACA,MACA;AACA,QAAM,QAAQ;AAHE,OAAA,UAAA;AAIhB,OAAK,OAAO;AACZ,OAAK,OAAO;;;AAchB,MAAM,aAAgC,EAAE;AAExC,SAAgB,gBAAgB,IAAsB;AACpD,YAAW,KAAK,GAAG;;;AAQrB,SAAgB,cAAoB;CAClC,MAAM,MAAM,WAAW,OAAO,EAAE;AAChC,MAAK,MAAM,MAAM,IACf,KAAI;AACF,MAAI;SACE;;AAMZ,SAAS,iBACP,SACA,OACuB;AACvB,KAAI,QAAQ,KAAM,QAAO,QAAQ;AACjC,KAAI,iBAAiB,YAAa,QAAO,MAAM;;AAIjD,eAAsB,YACpB,SACgB;CAChB,MAAM,EACJ,UAAU,2BACV,WACA,OACA,WAAW,MACT,WAAW,EAAE;CAEjB,MAAM,OAAO,iBAAiB,WAAW,EAAE,EAAE,MAAM;CACnD,MAAM,SAAS,SAAS;AAExB,WACE,2BAA2B,SAAS,SAClC,QAAQ,OACT,aAAa,UACf;AACD,KAAI,MACF,WAAU,yBAAyB,MAAM;AAI3C,cAAa;AAGb,KAAI,MACF,WAAU,iBAAiB,OAAO;EAChC,GAAK,iBAAiB,eAAe,MAAM,WAAY,EAAE;EACzD,GAAI,OAAO,EAAE,YAAY,MAAM,GAAG,EAAE;EACrC,CAAC;AAIJ,OAAM,UAAU,SAAS,QAAQ,UAAU,YAAY;CAIvD,MAAM,KAAK,OAAO;CAClB,MAAM,oBAA+B,aAAa;EAChD,MAAA;EACA;EACD;AACD,KAAI,QAAQ,kBAAkB,SAAA,SAA0B;AACtD,oBAAkB,cAAc;AAChC,MAAI,OAAQ,mBAAkB,gBAAgB;;AAEhD,IAAG,WAAW,kBAAkB;AAKhC,OAAM,GAAG,uBAAuB;AAIhC,KAAI,QAAQ,cAAc,UACxB,iBAAgB;EACd;EACA,SAAS,kBAAkB,WAAW;EACtC,QAAQ,oBAAoB,kBAAkB,eAAe,OAAO;EACrE,CAAC;AAIJ,QAAO,QAAQ,KAAK,SAAS"}
@@ -1,6 +1,6 @@
1
- import { f as getUI, s as logToFile, u as WIZARD_YARA_REPORT_FILE } from "./debug-DUmMVUHn.js";
2
- import { n as analytics } from "./analytics-DSK0GXg1.js";
3
- import { r as readFileHead } from "./bounded-fs-D85Tk3nS.js";
1
+ import { d as WIZARD_YARA_REPORT_FILE, p as getUI, s as logToFile } from "./debug-DWYDVp0B.js";
2
+ import { n as analytics } from "./analytics-DSVyjIVF.js";
3
+ import { r as readFileHead } from "./bounded-fs-FbZJ_vJ_.js";
4
4
  import fs from "fs";
5
5
  import path from "path";
6
6
  import fg from "fast-glob";
@@ -782,4 +782,4 @@ async function scanSkillFiles(cwd, skillDir, llmProvider) {
782
782
  //#endregion
783
783
  export { publishBlockingMatch as C, SETUP_REPORT_FILE as S, AUDIT_CHECKS_KEY as _, flushScanReport as a, coerceAuditChecks as b, isWizardDocumentationPath as c, repeatBlockReason as d, scanAndTriage as f, AUDIT_CHECKS_FILE as g, EVENT_PLAN_FILE as h, createRepeatBlockTracker as i, prewarmYaraScanner as l, writeScanReport as m, createPostToolUseYaraHooks as n, formatScanReport as o, scanInstalledSkill as p, createPreToolUseYaraHooks as r, formatYaraAbortMessage as s, captureScanReport as t, recordExternalScan as u, AUDIT_REPORT_FILE as v, scanVerdict as w, getAuditChecks as x, AUDIT_SEVERITY_STYLE as y };
784
784
 
785
- //# sourceMappingURL=yara-hooks-uCiAIcqU.js.map
785
+ //# sourceMappingURL=yara-hooks-BaPKsm-B.js.map