@posthog/wizard 2.60.0 → 2.61.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (106) hide show
  1. package/dist/{add-mcp-server-to-clients-CM30npkB.js → add-mcp-server-to-clients-KNIHRN_m.js} +190 -60
  2. package/dist/add-mcp-server-to-clients-KNIHRN_m.js.map +1 -0
  3. package/dist/{agent-interface-CybBFwnk.js → agent-interface-Bm4ZNGGV.js} +7 -7
  4. package/dist/{agent-interface-CybBFwnk.js.map → agent-interface-Bm4ZNGGV.js.map} +1 -1
  5. package/dist/{agent-prompt-loader-DL32ioJX.js → agent-prompt-loader-CsHNQXsY.js} +38 -11
  6. package/dist/agent-prompt-loader-CsHNQXsY.js.map +1 -0
  7. package/dist/{agent-runner-DUyxA1TQ.js → agent-runner-DLAvB67P.js} +119 -19
  8. package/dist/agent-runner-DLAvB67P.js.map +1 -0
  9. package/dist/{analytics-B9V7x1Ma.js → analytics-CkIyBHfd.js} +2 -2
  10. package/dist/{analytics-B9V7x1Ma.js.map → analytics-CkIyBHfd.js.map} +1 -1
  11. package/dist/analytics-kxgLEv7U.js +2 -0
  12. package/dist/{api-OHLXhKTy.js → api-XHQTOfIi.js} +3 -3
  13. package/dist/{api-OHLXhKTy.js.map → api-XHQTOfIi.js.map} +1 -1
  14. package/dist/bin.js +288 -134
  15. package/dist/bin.js.map +1 -1
  16. package/dist/{bounded-fs-xkhfF3JS.js → bounded-fs-B-qlKB0h.js} +3 -3
  17. package/dist/{bounded-fs-xkhfF3JS.js.map → bounded-fs-B-qlKB0h.js.map} +1 -1
  18. package/dist/{ci-install-B31ciXo4.js → ci-install-C9BAoO2n.js} +4 -4
  19. package/dist/{ci-install-B31ciXo4.js.map → ci-install-C9BAoO2n.js.map} +1 -1
  20. package/dist/{debug-D3Ucw2y1.js → debug-8-IIHr5f.js} +6 -3
  21. package/dist/debug-8-IIHr5f.js.map +1 -0
  22. package/dist/{debug-Cx9Delbc.js → debug-npp6DzBK.js} +1 -1
  23. package/dist/{defaults-BWLIffh5.js → defaults-mrAre0xM.js} +28 -2
  24. package/dist/defaults-mrAre0xM.js.map +1 -0
  25. package/dist/{environment-BN8ROaHv.js → environment-BffaZJRI.js} +4 -4
  26. package/dist/{environment-BN8ROaHv.js.map → environment-BffaZJRI.js.map} +1 -1
  27. package/dist/{file-watcher-CzBnjben.js → file-watcher-BreVxzh0.js} +2 -2
  28. package/dist/{file-watcher-CzBnjben.js.map → file-watcher-BreVxzh0.js.map} +1 -1
  29. package/dist/{headless-ui-DoQlIoeh.js → headless-ui-Dy_l8hCT.js} +2 -2
  30. package/dist/{headless-ui-DoQlIoeh.js.map → headless-ui-Dy_l8hCT.js.map} +1 -1
  31. package/dist/{interactive-DeFFwXME.js → interactive-C9vepji1.js} +2 -2
  32. package/dist/{interactive-DeFFwXME.js.map → interactive-C9vepji1.js.map} +1 -1
  33. package/dist/{mcp-CBskrEsK.js → mcp-C5Zheplw.js} +2 -2
  34. package/dist/{mcp-CBskrEsK.js.map → mcp-C5Zheplw.js.map} +1 -1
  35. package/dist/{mcp-prompt-streaming-B1upRE9N.js → mcp-prompt-streaming-DEerU5M3.js} +3 -3
  36. package/dist/{mcp-prompt-streaming-B1upRE9N.js.map → mcp-prompt-streaming-DEerU5M3.js.map} +1 -1
  37. package/dist/{non-interactive-BUmW9f9P.js → non-interactive-C9vQaJF2.js} +2 -2
  38. package/dist/{non-interactive-BUmW9f9P.js.map → non-interactive-C9vQaJF2.js.map} +1 -1
  39. package/dist/{orchestrator-tools-bM9GOq3c.js → orchestrator-tools-Bw97ahf6.js} +3 -3
  40. package/dist/{orchestrator-tools-bM9GOq3c.js.map → orchestrator-tools-Bw97ahf6.js.map} +1 -1
  41. package/dist/{package-manager-ByVEmFPR.js → package-manager-Cm5vbUDR.js} +2 -2
  42. package/dist/{package-manager-ByVEmFPR.js.map → package-manager-Cm5vbUDR.js.map} +1 -1
  43. package/dist/{pi-C7wbP2z-.js → pi-BocAqBQZ.js} +11 -11
  44. package/dist/{pi-C7wbP2z-.js.map → pi-BocAqBQZ.js.map} +1 -1
  45. package/dist/{playground-Df_ZzalF.js → playground-DmGHAiON.js} +25 -788
  46. package/dist/playground-DmGHAiON.js.map +1 -0
  47. package/dist/{posthog-DLklk2yT.js → posthog-BitL59Wc.js} +2 -2
  48. package/dist/{posthog-DLklk2yT.js.map → posthog-BitL59Wc.js.map} +1 -1
  49. package/dist/{posthog-integration-CxIj49T4.js → posthog-integration-DbZ2oza2.js} +110 -33
  50. package/dist/posthog-integration-DbZ2oza2.js.map +1 -0
  51. package/dist/{provisioning-BpqrbURn.js → provisioning-CzRepu4H.js} +3 -3
  52. package/dist/{provisioning-BpqrbURn.js.map → provisioning-CzRepu4H.js.map} +1 -1
  53. package/dist/{queue-tools-QVKYMX_C.js → queue-tools-OynU-m2F.js} +37 -7
  54. package/dist/queue-tools-OynU-m2F.js.map +1 -0
  55. package/dist/{registry-CboWk-Ny.js → registry-eXzDlt51.js} +5 -5
  56. package/dist/{registry-CboWk-Ny.js.map → registry-eXzDlt51.js.map} +1 -1
  57. package/dist/{security-aWRzd8V1.js → security-DqByFEpl.js} +5 -5
  58. package/dist/{security-aWRzd8V1.js.map → security-DqByFEpl.js.map} +1 -1
  59. package/dist/{setup-utils-VtxhrSx8.js → setup-utils-C2rGcUFv.js} +9 -9
  60. package/dist/setup-utils-C2rGcUFv.js.map +1 -0
  61. package/dist/{start-tui-CzMiitZJ.js → start-tui-BYTQwgvK.js} +137 -42
  62. package/dist/start-tui-BYTQwgvK.js.map +1 -0
  63. package/dist/{steps-9PddZ-BV.js → steps-CMIyEySI.js} +7 -7
  64. package/dist/{steps-9PddZ-BV.js.map → steps-CMIyEySI.js.map} +1 -1
  65. package/dist/{store-V71P5KpB.js → store-pBYMaEuj.js} +25 -5
  66. package/dist/store-pBYMaEuj.js.map +1 -0
  67. package/dist/{subagent-CcBKBSR-.js → subagent-ZDD6XCmm.js} +2 -2
  68. package/dist/{subagent-CcBKBSR-.js.map → subagent-ZDD6XCmm.js.map} +1 -1
  69. package/dist/{task-BRktXvCV.js → task-1KHCdViK.js} +36 -23
  70. package/dist/task-1KHCdViK.js.map +1 -0
  71. package/dist/{task-stream-CFAXlJLv.js → task-stream-DAU6Z6u6.js} +5 -5
  72. package/dist/{task-stream-CFAXlJLv.js.map → task-stream-DAU6Z6u6.js.map} +1 -1
  73. package/dist/{tasks-CyLSHCmC.js → tasks-BBo0_AZG.js} +2 -2
  74. package/dist/{tasks-CyLSHCmC.js.map → tasks-BBo0_AZG.js.map} +1 -1
  75. package/dist/{telemetry-mi4dua6_.js → telemetry-DSzPCPtQ.js} +3 -3
  76. package/dist/{telemetry-mi4dua6_.js.map → telemetry-DSzPCPtQ.js.map} +1 -1
  77. package/dist/{terminal-B-37htZb.js → terminal-DW8x0UNT.js} +978 -71
  78. package/dist/terminal-DW8x0UNT.js.map +1 -0
  79. package/dist/{tools-BWaoKBAO.js → tools-DCH7Ji4V.js} +6 -6
  80. package/dist/{tools-BWaoKBAO.js.map → tools-DCH7Ji4V.js.map} +1 -1
  81. package/dist/{wizard-abort-D0HFMYCV.js → wizard-abort-B_Sa9K3g.js} +1 -1
  82. package/dist/{wizard-abort-Bgx_JOfw.js → wizard-abort-Cz916Qq5.js} +4 -4
  83. package/dist/{wizard-abort-Bgx_JOfw.js.map → wizard-abort-Cz916Qq5.js.map} +1 -1
  84. package/dist/{wizard-session-CwgR5y3-.js → wizard-session-BUhlJ1b8.js} +2 -1
  85. package/dist/wizard-session-BUhlJ1b8.js.map +1 -0
  86. package/dist/{wizard-session-DsK16SGs.js → wizard-session-DZUDtS5d.js} +1 -1
  87. package/dist/yara-hooks-BVEBOdMu.js +2 -0
  88. package/dist/{yara-hooks-Cj8x2YV4.js → yara-hooks-DgScuNrT.js} +4 -4
  89. package/dist/{yara-hooks-Cj8x2YV4.js.map → yara-hooks-DgScuNrT.js.map} +1 -1
  90. package/package.json +2 -1
  91. package/dist/add-mcp-server-to-clients-CM30npkB.js.map +0 -1
  92. package/dist/agent-prompt-loader-DL32ioJX.js.map +0 -1
  93. package/dist/agent-runner-DUyxA1TQ.js.map +0 -1
  94. package/dist/analytics-HdW5e8_o.js +0 -2
  95. package/dist/debug-D3Ucw2y1.js.map +0 -1
  96. package/dist/defaults-BWLIffh5.js.map +0 -1
  97. package/dist/playground-Df_ZzalF.js.map +0 -1
  98. package/dist/posthog-integration-CxIj49T4.js.map +0 -1
  99. package/dist/queue-tools-QVKYMX_C.js.map +0 -1
  100. package/dist/setup-utils-VtxhrSx8.js.map +0 -1
  101. package/dist/start-tui-CzMiitZJ.js.map +0 -1
  102. package/dist/store-V71P5KpB.js.map +0 -1
  103. package/dist/task-BRktXvCV.js.map +0 -1
  104. package/dist/terminal-B-37htZb.js.map +0 -1
  105. package/dist/wizard-session-CwgR5y3-.js.map +0 -1
  106. package/dist/yara-hooks-CIQRywtg.js +0 -2
@@ -1,8 +1,8 @@
1
1
  import { t as __exportAll } from "./rolldown-runtime-B_-DWIq7.js";
2
- import { bt as runtimeEnv, f as getUI, r as debug } from "./debug-D3Ucw2y1.js";
3
- import { n as analytics } from "./analytics-B9V7x1Ma.js";
4
- import { n as openTrackedLink, t as withProgress } from "./telemetry-mi4dua6_.js";
5
- import { a as getNativeHTTPServerConfig, i as getDefaultServerConfig, r as buildMCPUrl, t as ALL_FEATURE_VALUES } from "./defaults-BWLIffh5.js";
2
+ import { bt as runtimeEnv, f as getUI, r as debug } from "./debug-8-IIHr5f.js";
3
+ import { n as analytics } from "./analytics-CkIyBHfd.js";
4
+ import { n as openTrackedLink, t as withProgress } from "./telemetry-DSzPCPtQ.js";
5
+ import { a as getNativeHTTPServerConfig, c as namesWithStatus, d as toClientResult, i as getDefaultServerConfig, l as redactSecrets, r as buildMCPUrl, t as ALL_FEATURE_VALUES } from "./defaults-mrAre0xM.js";
6
6
  import * as fs$2 from "fs";
7
7
  import * as path$2 from "path";
8
8
  import * as os from "node:os";
@@ -57,6 +57,11 @@ var DefaultMCPClient = class extends MCPClient {
57
57
  const typedConfig = existingConfig;
58
58
  if (!typedConfig[serverPropertyName]) typedConfig[serverPropertyName] = {};
59
59
  const serverName = local ? "posthog-local" : "posthog";
60
+ const existingServerConfig = typedConfig[serverPropertyName][serverName];
61
+ if (existingServerConfig !== void 0 && JSON.stringify(existingServerConfig) === JSON.stringify(newServerConfig)) return {
62
+ success: true,
63
+ alreadyInstalled: true
64
+ };
60
65
  typedConfig[serverPropertyName][serverName] = newServerConfig;
61
66
  const edits = jsonc.modify(configContent, [serverPropertyName, serverName], newServerConfig, { formattingOptions: {
62
67
  tabSize: 2,
@@ -65,14 +70,21 @@ var DefaultMCPClient = class extends MCPClient {
65
70
  const modifiedContent = jsonc.applyEdits(configContent, edits);
66
71
  await fs$2.promises.writeFile(configPath, modifiedContent, "utf8");
67
72
  return { success: true };
68
- } catch {
69
- return { success: false };
73
+ } catch (error) {
74
+ return {
75
+ success: false,
76
+ reason: error instanceof Error ? error.message : String(error)
77
+ };
70
78
  }
71
79
  }
72
80
  async removeServer(local) {
81
+ let configPath = "";
73
82
  try {
74
- const configPath = await this.getConfigPath();
75
- if (!fs$2.existsSync(configPath)) return { success: false };
83
+ configPath = await this.getConfigPath();
84
+ if (!fs$2.existsSync(configPath)) return {
85
+ success: true,
86
+ alreadyInstalled: true
87
+ };
76
88
  const configContent = await fs$2.promises.readFile(configPath, "utf8");
77
89
  const config = jsonc.parse(configContent);
78
90
  const serverPropertyName = this.getServerPropertyName();
@@ -86,8 +98,16 @@ var DefaultMCPClient = class extends MCPClient {
86
98
  await fs$2.promises.writeFile(configPath, modifiedContent, "utf8");
87
99
  return { success: true };
88
100
  }
89
- } catch {}
90
- return { success: false };
101
+ return {
102
+ success: true,
103
+ alreadyInstalled: true
104
+ };
105
+ } catch (error) {
106
+ return {
107
+ success: false,
108
+ reason: `${configPath}: ${error instanceof Error ? error.message : String(error)}`
109
+ };
110
+ }
91
111
  }
92
112
  };
93
113
  //#endregion
@@ -170,7 +190,10 @@ var ClaudeCodeMCPClient = class extends DefaultMCPClient {
170
190
  }
171
191
  addServer(apiKey, selectedFeatures, local) {
172
192
  const binary = this.findClaudeBinary();
173
- if (!binary) return Promise.resolve({ success: false });
193
+ if (!binary) return Promise.resolve({
194
+ success: false,
195
+ reason: "The claude CLI is no longer on your PATH."
196
+ });
174
197
  const args = [
175
198
  "mcp",
176
199
  "add",
@@ -186,21 +209,38 @@ var ClaudeCodeMCPClient = class extends DefaultMCPClient {
186
209
  execSync$1(`${binary} ${args.map((a) => JSON.stringify(a)).join(" ")}`, { stdio: "pipe" });
187
210
  return Promise.resolve({ success: true });
188
211
  } catch (error) {
189
- const msg = error instanceof Error ? error.message : String(error);
190
- if (msg.includes("already exists")) return Promise.resolve({ success: true });
212
+ const msg = redactSecrets(error instanceof Error ? error.message : String(error));
213
+ if (msg.includes("already exists")) return Promise.resolve({
214
+ success: true,
215
+ alreadyInstalled: true
216
+ });
191
217
  analytics.captureException(/* @__PURE__ */ new Error(`Claude Code MCP add failed: ${msg}`));
192
- return Promise.resolve({ success: false });
218
+ return Promise.resolve({
219
+ success: false,
220
+ reason: msg
221
+ });
193
222
  }
194
223
  }
195
224
  removeServer(local) {
196
225
  const claudeBinary = this.findClaudeBinary();
197
- if (!claudeBinary) return Promise.resolve({ success: false });
226
+ if (!claudeBinary) return Promise.resolve({
227
+ success: false,
228
+ reason: "The claude CLI is no longer on your PATH."
229
+ });
198
230
  const command = `${claudeBinary} mcp remove --scope user ${local ? "posthog-local" : "posthog"}`;
199
231
  try {
200
- execSync$1(command);
232
+ execSync$1(command, { stdio: "pipe" });
201
233
  } catch (error) {
202
- analytics.captureException(/* @__PURE__ */ new Error(`Failed to remove server from Claude Code: ${error instanceof Error ? error.message : String(error)}`));
203
- return Promise.resolve({ success: false });
234
+ const reason = redactSecrets(error instanceof Error ? error.message : String(error));
235
+ if (/no( such)? mcp server|not found/i.test(reason)) return Promise.resolve({
236
+ success: true,
237
+ alreadyInstalled: true
238
+ });
239
+ analytics.captureException(/* @__PURE__ */ new Error(`Failed to remove server from Claude Code: ${reason}`));
240
+ return Promise.resolve({
241
+ success: false,
242
+ reason
243
+ });
204
244
  }
205
245
  return Promise.resolve({ success: true });
206
246
  }
@@ -217,20 +257,30 @@ var ClaudeCodeMCPClient = class extends DefaultMCPClient {
217
257
  return Promise.resolve(false);
218
258
  }
219
259
  }
220
- installPlugin() {
260
+ async installPlugin() {
221
261
  const binary = this.findClaudeBinary();
222
- if (!binary) return Promise.resolve({ success: false });
262
+ if (!binary) return {
263
+ success: false,
264
+ reason: "The claude CLI is no longer on your PATH."
265
+ };
266
+ if (await this.isPluginInstalled()) return {
267
+ success: true,
268
+ alreadyInstalled: true
269
+ };
223
270
  try {
224
271
  execSync$1(`${binary} plugin install posthog`, { stdio: "pipe" });
225
- return Promise.resolve({ success: true });
272
+ return { success: true };
226
273
  } catch (error) {
227
274
  const msg = error instanceof Error ? error.message : String(error);
228
- if (msg.includes("already installed") || msg.includes("already exists")) return Promise.resolve({
275
+ if (msg.includes("already installed") || msg.includes("already exists")) return {
229
276
  success: true,
230
277
  alreadyInstalled: true
231
- });
278
+ };
232
279
  analytics.captureException(/* @__PURE__ */ new Error(`Claude Code plugin install failed: ${msg}`));
233
- return Promise.resolve({ success: false });
280
+ return {
281
+ success: false,
282
+ reason: msg
283
+ };
234
284
  }
235
285
  }
236
286
  };
@@ -259,7 +309,10 @@ var ClaudeWebMCPClient = class extends MCPClient {
259
309
  return Promise.resolve({ success: true });
260
310
  }
261
311
  removeServer() {
262
- return Promise.resolve({ success: false });
312
+ return Promise.resolve({
313
+ success: false,
314
+ reason: "This connector is managed in your Claude account — remove it at claude.ai/settings/connectors."
315
+ });
263
316
  }
264
317
  getConfigPath() {
265
318
  throw new Error("Not implemented");
@@ -342,6 +395,10 @@ var ZedClient = class extends DefaultMCPClient {
342
395
  };
343
396
  //#endregion
344
397
  //#region src/steps/add-mcp-server-to-clients/clients/codex.ts
398
+ /** Wording codex uses when the thing we're adding is already registered. */
399
+ const ALREADY_INSTALLED_PATTERN = /already (installed|exists|added|registered)/i;
400
+ /** Wording that means the opposite: a cache entry exists but the plugin doesn't. */
401
+ const STALE_MARKETPLACE_CACHE = /already added from a different source/i;
345
402
  var CodexMCPClient = class extends DefaultMCPClient {
346
403
  name = "Codex";
347
404
  codexBinaryPath = null;
@@ -375,7 +432,10 @@ var CodexMCPClient = class extends DefaultMCPClient {
375
432
  }
376
433
  addServer(apiKey, selectedFeatures, local) {
377
434
  const binary = this.findCodexBinary();
378
- if (!binary) return Promise.resolve({ success: false });
435
+ if (!binary) return Promise.resolve({
436
+ success: false,
437
+ reason: "The codex CLI is no longer on your PATH."
438
+ });
379
439
  const args = [
380
440
  "mcp",
381
441
  "add",
@@ -395,23 +455,37 @@ var CodexMCPClient = class extends DefaultMCPClient {
395
455
  });
396
456
  if (result.status !== 0) {
397
457
  const stderr = result.stderr ?? "";
398
- if (stderr.toLowerCase().includes("already")) return Promise.resolve({ success: true });
399
- analytics.captureException(/* @__PURE__ */ new Error(`Codex MCP add failed: ${stderr}`));
400
- return Promise.resolve({ success: false });
458
+ if (ALREADY_INSTALLED_PATTERN.test(stderr)) return Promise.resolve({
459
+ success: true,
460
+ alreadyInstalled: true
461
+ });
462
+ const reason = redactSecrets(stderr);
463
+ analytics.captureException(/* @__PURE__ */ new Error(`Codex MCP add failed: ${reason}`));
464
+ return Promise.resolve({
465
+ success: false,
466
+ reason
467
+ });
401
468
  }
402
469
  return Promise.resolve({ success: true });
403
470
  }
404
- removeServer() {
471
+ removeServer(local) {
405
472
  const binary = this.findCodexBinary();
406
- if (!binary) return Promise.resolve({ success: false });
473
+ if (!binary) return Promise.resolve({
474
+ success: false,
475
+ reason: "The codex CLI is no longer on your PATH."
476
+ });
407
477
  const result = spawnSync(binary, [
408
478
  "mcp",
409
479
  "remove",
410
- "posthog"
411
- ], { stdio: "ignore" });
480
+ local ? "posthog-local" : "posthog"
481
+ ], { encoding: "utf-8" });
412
482
  if (result.error || result.status !== 0) {
413
- analytics.captureException(/* @__PURE__ */ new Error("Failed to remove server from Codex CLI."));
414
- return Promise.resolve({ success: false });
483
+ const reason = redactSecrets(result.error?.message ?? result.stderr ?? "codex mcp remove failed");
484
+ analytics.captureException(/* @__PURE__ */ new Error(`Failed to remove server from Codex CLI: ${reason}`));
485
+ return Promise.resolve({
486
+ success: false,
487
+ reason
488
+ });
415
489
  }
416
490
  return Promise.resolve({ success: true });
417
491
  }
@@ -427,9 +501,16 @@ var CodexMCPClient = class extends DefaultMCPClient {
427
501
  return Promise.resolve(false);
428
502
  }
429
503
  }
430
- installPlugin() {
504
+ async installPlugin() {
431
505
  const binary = this.findCodexBinary();
432
- if (!binary) return Promise.resolve({ success: false });
506
+ if (!binary) return {
507
+ success: false,
508
+ reason: "The codex CLI is no longer on your PATH."
509
+ };
510
+ if (await this.isPluginInstalled()) return {
511
+ success: true,
512
+ alreadyInstalled: true
513
+ };
433
514
  const run = () => spawnSync(binary, [
434
515
  "plugin",
435
516
  "marketplace",
@@ -437,7 +518,7 @@ var CodexMCPClient = class extends DefaultMCPClient {
437
518
  "PostHog/ai-plugin"
438
519
  ], { encoding: "utf-8" });
439
520
  let result = run();
440
- if (result.status !== 0 && (result.stderr ?? "").includes("already added from a different source")) {
521
+ if (result.status !== 0 && STALE_MARKETPLACE_CACHE.test(result.stderr ?? "")) {
441
522
  const staleDir = path$1.join(os.homedir(), ".codex", ".tmp", "marketplaces", "posthog");
442
523
  try {
443
524
  fs$1.rmSync(staleDir, {
@@ -448,10 +529,19 @@ var CodexMCPClient = class extends DefaultMCPClient {
448
529
  result = run();
449
530
  }
450
531
  if (result.status !== 0) {
451
- analytics.captureException(/* @__PURE__ */ new Error(`Codex plugin install failed: ${result.stderr ?? ""}`));
452
- return Promise.resolve({ success: false });
532
+ const stderr = result.stderr ?? "";
533
+ if (ALREADY_INSTALLED_PATTERN.test(stderr) && !STALE_MARKETPLACE_CACHE.test(stderr)) return {
534
+ success: true,
535
+ alreadyInstalled: true
536
+ };
537
+ const reason = redactSecrets(stderr);
538
+ analytics.captureException(/* @__PURE__ */ new Error(`Codex plugin install failed: ${reason}`));
539
+ return {
540
+ success: false,
541
+ reason
542
+ };
453
543
  }
454
- return Promise.resolve({ success: true });
544
+ return { success: true };
455
545
  }
456
546
  };
457
547
  z$1.object({ mcp: z$1.record(z$1.string(), z$1.object({
@@ -552,32 +642,47 @@ const addMCPServerToClientsStep = async ({ integration, local = false, ci = fals
552
642
  ui.log.info("No supported MCP clients detected. Skipping MCP installation.");
553
643
  return [];
554
644
  }
555
- await withProgress("adding mcp servers", async () => {
556
- await addMCPServer(supportedClients, apiKey, features ?? [...ALL_FEATURE_VALUES], local);
557
- });
558
- ui.log.success(`Added the MCP server to:
559
- ${supportedClients.map((c) => `- ${c.name}`).join("\n ")} `);
645
+ const results = await withProgress("adding mcp servers", () => addMCPServer(supportedClients, apiKey, features ?? [...ALL_FEATURE_VALUES], local));
646
+ const installed = namesWithStatus(results, "changed");
647
+ const already = namesWithStatus(results, "unchanged");
648
+ const failed = results.filter((r) => r.status === "failed");
649
+ if (installed.length > 0) ui.log.success(`Added the MCP server to:\n${bulletList(installed)}`);
650
+ if (already.length > 0) ui.log.info(`The PostHog MCP server was already installed, so nothing changed for:\n${bulletList(already)}`);
651
+ if (failed.length > 0) ui.log.warn(`Couldn't add the MCP server to:\n${bulletList(failed.map((r) => r.detail ? `${r.name} — ${r.detail}` : r.name))}`);
652
+ const withServer = [...installed, ...already];
560
653
  analytics.wizardCapture("mcp servers added", {
561
- clients: supportedClients.map((c) => c.name),
654
+ clients: withServer,
655
+ already_installed_clients: already,
656
+ failed_clients: failed.map((r) => r.name),
657
+ attempted_clients: supportedClients.map((c) => c.name),
562
658
  integration
563
659
  });
564
- return supportedClients.map((c) => c.name);
660
+ return withServer;
565
661
  };
662
+ const bulletList = (items) => items.map((item) => ` - ${item}`).join("\n");
566
663
  const removeMCPServerFromClientsStep = async ({ integration, local = false }) => {
664
+ const ui = getUI();
567
665
  const installedClients = await getInstalledClients(local);
568
666
  if (installedClients.length === 0) {
667
+ ui.log.info("The PostHog MCP server is not installed for any supported client. Nothing to remove.");
569
668
  analytics.wizardCapture("mcp no servers to remove", { integration });
570
669
  return [];
571
670
  }
572
- const results = await withProgress("removing mcp servers", async () => {
573
- await removeMCPServer(installedClients, local);
574
- return installedClients.map((c) => c.name);
575
- });
671
+ const results = await withProgress("removing mcp servers", () => removeMCPServer(installedClients, local));
672
+ const removed = namesWithStatus(results, "changed");
673
+ const nothingToDo = namesWithStatus(results, "unchanged");
674
+ const failed = results.filter((r) => r.status === "failed");
675
+ if (removed.length > 0) ui.log.success(`Removed the MCP server from:\n${bulletList(removed)}`);
676
+ if (nothingToDo.length > 0) ui.log.info(`No PostHog MCP entry left to remove for:\n${bulletList(nothingToDo)}`);
677
+ if (failed.length > 0) ui.log.warn(`Couldn't remove the MCP server from:\n${bulletList(failed.map((r) => r.detail ? `${r.name} — ${r.detail}` : r.name))}`);
576
678
  analytics.wizardCapture("mcp servers removed", {
577
- clients: results,
679
+ clients: removed,
680
+ nothing_to_remove_clients: nothingToDo,
681
+ failed_clients: failed.map((r) => r.name),
682
+ attempted_clients: installedClients.map((c) => c.name),
578
683
  integration
579
684
  });
580
- return results;
685
+ return removed;
581
686
  };
582
687
  const getInstalledClients = async (local) => {
583
688
  const clients = await getSupportedClients();
@@ -586,24 +691,49 @@ const getInstalledClients = async (local) => {
586
691
  return installedClients;
587
692
  };
588
693
  const addMCPServer = async (clients, personalApiKey, selectedFeatures, local) => {
589
- for (const client of clients) await client.addServer(personalApiKey, selectedFeatures, local);
694
+ const results = [];
695
+ for (const client of clients) try {
696
+ const result = await client.addServer(personalApiKey, selectedFeatures, local);
697
+ results.push(toClientResult(client.name, result));
698
+ } catch (err) {
699
+ debug(`[addMCPServer] addServer threw for ${client.name}: ${err}`);
700
+ results.push(toClientResult(client.name, {
701
+ success: false,
702
+ reason: err instanceof Error ? err.message : String(err)
703
+ }));
704
+ }
705
+ return results;
590
706
  };
591
707
  const getSupportedPluginClients = (clients) => {
592
708
  return clients.filter(isPluginCapable).filter((c) => c.supportsPlugin());
593
709
  };
594
710
  const installPlugins = async (clients) => {
595
- const installed = [];
711
+ const results = [];
596
712
  for (const client of clients) try {
597
- if ((await client.installPlugin()).success) installed.push(client.name);
713
+ results.push(toClientResult(client.name, await client.installPlugin()));
598
714
  } catch (err) {
599
715
  debug(`[installPlugins] installPlugin threw for ${client.name}: ${err}`);
716
+ results.push(toClientResult(client.name, {
717
+ success: false,
718
+ reason: err instanceof Error ? err.message : String(err)
719
+ }));
600
720
  }
601
- return installed;
721
+ return results;
602
722
  };
603
723
  const removeMCPServer = async (clients, local) => {
604
- for (const client of clients) await client.removeServer(local);
724
+ const results = [];
725
+ for (const client of clients) try {
726
+ results.push(toClientResult(client.name, await client.removeServer(local)));
727
+ } catch (err) {
728
+ debug(`[removeMCPServer] removeServer threw for ${client.name}: ${err}`);
729
+ results.push(toClientResult(client.name, {
730
+ success: false,
731
+ reason: err instanceof Error ? err.message : String(err)
732
+ }));
733
+ }
734
+ return results;
605
735
  };
606
736
  //#endregion
607
737
  export { getSupportedClients as a, removeMCPServer as c, getInstalledClients as i, removeMCPServerFromClientsStep as l, addMCPServerToClientsStep as n, getSupportedPluginClients as o, add_mcp_server_to_clients_exports as r, installPlugins as s, addMCPServer as t, isPluginCapable as u };
608
738
 
609
- //# sourceMappingURL=add-mcp-server-to-clients-CM30npkB.js.map
739
+ //# sourceMappingURL=add-mcp-server-to-clients-KNIHRN_m.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add-mcp-server-to-clients-KNIHRN_m.js","names":["fs","path","path","os","path","os","fs","execSync","z","os","path","z","os","path","path","fs","z","path","fs","os"],"sources":["../src/steps/add-mcp-server-to-clients/MCPClient.ts","../src/steps/add-mcp-server-to-clients/clients/cursor.ts","../src/steps/add-mcp-server-to-clients/clients/claude-code.ts","../src/steps/add-mcp-server-to-clients/clients/claude-web.ts","../src/steps/add-mcp-server-to-clients/clients/visual-studio-code.ts","../src/steps/add-mcp-server-to-clients/clients/zed.ts","../src/steps/add-mcp-server-to-clients/clients/codex.ts","../src/steps/add-mcp-server-to-clients/clients/opencode.ts","../src/steps/add-mcp-server-to-clients/plugin-client.ts","../src/steps/add-mcp-server-to-clients/index.ts"],"sourcesContent":["import * as fs from 'fs';\nimport * as path from 'path';\nimport * as jsonc from 'jsonc-parser';\nimport { getDefaultServerConfig } from './defaults';\nimport type { InstallResult } from './results';\n\nexport type MCPServerConfig = Record<string, unknown>;\n\nexport abstract class MCPClient {\n name: string;\n abstract getConfigPath(): Promise<string>;\n abstract getServerPropertyName(): string;\n abstract isServerInstalled(local?: boolean): Promise<boolean>;\n abstract addServer(\n apiKey?: string,\n selectedFeatures?: string[],\n local?: boolean,\n ): Promise<InstallResult>;\n abstract removeServer(local?: boolean): Promise<InstallResult>;\n abstract isClientSupported(): Promise<boolean>;\n}\n\nexport abstract class DefaultMCPClient extends MCPClient {\n name = 'Default';\n\n constructor() {\n super();\n }\n\n getServerPropertyName(): string {\n return 'mcpServers';\n }\n\n getServerConfig(\n apiKey: string | undefined,\n selectedFeatures?: string[],\n local?: boolean,\n ): MCPServerConfig {\n return getDefaultServerConfig(apiKey, selectedFeatures, local);\n }\n\n async isServerInstalled(local?: boolean): Promise<boolean> {\n try {\n const configPath = await this.getConfigPath();\n\n if (!fs.existsSync(configPath)) {\n return false;\n }\n\n const configContent = await fs.promises.readFile(configPath, 'utf8');\n const config = jsonc.parse(configContent) as Record<string, any>;\n const serverPropertyName = this.getServerPropertyName();\n const serverName = local ? 'posthog-local' : 'posthog';\n\n return (\n serverPropertyName in config && serverName in config[serverPropertyName]\n );\n } catch {\n return false;\n }\n }\n\n async addServer(\n apiKey?: string,\n selectedFeatures?: string[],\n local?: boolean,\n ): Promise<InstallResult> {\n try {\n const configPath = await this.getConfigPath();\n const configDir = path.dirname(configPath);\n\n await fs.promises.mkdir(configDir, { recursive: true });\n\n const serverPropertyName = this.getServerPropertyName();\n let configContent = '';\n let existingConfig = {};\n\n if (fs.existsSync(configPath)) {\n configContent = await fs.promises.readFile(configPath, 'utf8');\n existingConfig = jsonc.parse(configContent) || {};\n }\n\n const newServerConfig = this.getServerConfig(\n apiKey,\n selectedFeatures,\n local,\n );\n const typedConfig = existingConfig as Record<string, any>;\n if (!typedConfig[serverPropertyName]) {\n typedConfig[serverPropertyName] = {};\n }\n const serverName = local ? 'posthog-local' : 'posthog';\n\n // An identical entry means this config is already set up — leave the file\n // untouched and report it, so a re-run says \"already installed\" instead of\n // claiming a write that changed nothing. A differing entry (new features,\n // new key) still gets overwritten and reported as installed.\n const existingServerConfig = typedConfig[serverPropertyName][serverName];\n if (\n existingServerConfig !== undefined &&\n JSON.stringify(existingServerConfig) === JSON.stringify(newServerConfig)\n ) {\n return { success: true, alreadyInstalled: true };\n }\n\n typedConfig[serverPropertyName][serverName] = newServerConfig;\n\n const edits = jsonc.modify(\n configContent,\n [serverPropertyName, serverName],\n newServerConfig,\n {\n formattingOptions: {\n tabSize: 2,\n insertSpaces: true,\n },\n },\n );\n\n const modifiedContent = jsonc.applyEdits(configContent, edits);\n\n await fs.promises.writeFile(configPath, modifiedContent, 'utf8');\n\n return { success: true };\n } catch (error) {\n return {\n success: false,\n reason: error instanceof Error ? error.message : String(error),\n };\n }\n }\n\n async removeServer(local?: boolean): Promise<InstallResult> {\n let configPath = '';\n try {\n configPath = await this.getConfigPath();\n\n if (!fs.existsSync(configPath)) {\n return { success: true, alreadyInstalled: true };\n }\n\n const configContent = await fs.promises.readFile(configPath, 'utf8');\n const config = jsonc.parse(configContent) as Record<string, any>;\n const serverPropertyName = this.getServerPropertyName();\n\n const serverName = local ? 'posthog-local' : 'posthog';\n\n if (\n serverPropertyName in config &&\n serverName in config[serverPropertyName]\n ) {\n const edits = jsonc.modify(\n configContent,\n [serverPropertyName, serverName],\n undefined,\n {\n formattingOptions: {\n tabSize: 2,\n insertSpaces: true,\n },\n },\n );\n\n const modifiedContent = jsonc.applyEdits(configContent, edits);\n\n await fs.promises.writeFile(configPath, modifiedContent, 'utf8');\n\n return { success: true };\n }\n // No PostHog entry to delete — the config changed under us between the\n // detection pass and now. Nothing failed, so don't report a failure.\n return { success: true, alreadyInstalled: true };\n } catch (error) {\n return {\n success: false,\n reason: `${configPath}: ${\n error instanceof Error ? error.message : String(error)\n }`,\n };\n }\n }\n}\n","import {\n DefaultMCPClient,\n MCPServerConfig,\n} from '@steps/add-mcp-server-to-clients/MCPClient';\nimport * as path from 'path';\nimport * as os from 'os';\nimport {\n DefaultMCPClientConfig,\n getNativeHTTPServerConfig,\n} from '@steps/add-mcp-server-to-clients/defaults';\nimport { z } from 'zod';\n\nexport const CursorMCPConfig = DefaultMCPClientConfig;\n\nexport type CursorMCPConfig = z.infer<typeof DefaultMCPClientConfig>;\n\nexport class CursorMCPClient extends DefaultMCPClient {\n name = 'Cursor';\n\n constructor() {\n super();\n }\n\n async isClientSupported(): Promise<boolean> {\n return Promise.resolve(\n process.platform === 'darwin' || process.platform === 'win32',\n );\n }\n\n async getConfigPath(): Promise<string> {\n return Promise.resolve(path.join(os.homedir(), '.cursor', 'mcp.json'));\n }\n\n getServerConfig(\n apiKey: string | undefined,\n selectedFeatures?: string[],\n local?: boolean,\n ): MCPServerConfig {\n return getNativeHTTPServerConfig(apiKey, selectedFeatures, local);\n }\n}\n","import { DefaultMCPClient } from '@steps/add-mcp-server-to-clients/MCPClient';\nimport {\n DefaultMCPClientConfig,\n buildMCPUrl,\n} from '@steps/add-mcp-server-to-clients/defaults';\nimport {\n PluginCapable,\n PluginInstallResult,\n} from '@steps/add-mcp-server-to-clients/plugin-client';\nimport {\n redactSecrets,\n type InstallResult,\n} from '@steps/add-mcp-server-to-clients/results';\nimport { z } from 'zod';\nimport { execSync } from 'child_process';\nimport { analytics } from '@utils/analytics';\nimport { debug } from '@utils/debug';\nimport * as os from 'os';\nimport * as path from 'path';\nimport * as fs from 'fs';\n\nexport const ClaudeCodeMCPConfig = DefaultMCPClientConfig;\n\nexport type ClaudeCodeMCPConfig = z.infer<typeof DefaultMCPClientConfig>;\n\nexport class ClaudeCodeMCPClient\n extends DefaultMCPClient\n implements PluginCapable\n{\n name = 'Claude Code';\n private claudeBinaryPath: string | null = null;\n\n constructor() {\n super();\n }\n\n private findClaudeBinary(): string | null {\n if (this.claudeBinaryPath) {\n return this.claudeBinaryPath;\n }\n\n // Common installation paths for Claude Code CLI\n const possiblePaths = [\n path.join(os.homedir(), '.claude', 'local', 'claude'),\n '/usr/local/bin/claude',\n '/opt/homebrew/bin/claude',\n ];\n\n for (const claudePath of possiblePaths) {\n if (fs.existsSync(claudePath)) {\n debug(` Found claude binary at: ${claudePath}`);\n this.claudeBinaryPath = claudePath;\n return claudePath;\n }\n }\n\n // Try PATH as fallback\n try {\n execSync('command -v claude', { stdio: 'pipe' });\n debug(' Found claude in PATH');\n this.claudeBinaryPath = 'claude';\n return 'claude';\n } catch {\n // Not in PATH\n }\n\n return null;\n }\n\n isClientSupported(): Promise<boolean> {\n try {\n debug(' Checking for Claude Code...');\n const claudeBinary = this.findClaudeBinary();\n\n if (!claudeBinary) {\n debug(' Claude Code not found. Installation paths checked:');\n debug(` - ${path.join(os.homedir(), '.claude', 'local', 'claude')}`);\n debug(` - /usr/local/bin/claude`);\n debug(` - /opt/homebrew/bin/claude`);\n debug(` - PATH`);\n return Promise.resolve(false);\n }\n\n const output = execSync(`${claudeBinary} --version`, { stdio: 'pipe' });\n const version = output.toString().trim();\n debug(` Claude Code detected: ${version}`);\n return Promise.resolve(true);\n } catch (error) {\n debug(\n ` Claude Code check failed: ${\n error instanceof Error ? error.message : String(error)\n }`,\n );\n return Promise.resolve(false);\n }\n }\n\n isServerInstalled(local?: boolean): Promise<boolean> {\n const binary = this.findClaudeBinary();\n if (!binary) return Promise.resolve(false);\n const serverName = local ? 'posthog-local' : 'posthog';\n try {\n const output = execSync(`${binary} mcp list`, { stdio: 'pipe' })\n .toString()\n .toLowerCase();\n return Promise.resolve(output.includes(serverName));\n } catch {\n return Promise.resolve(false);\n }\n }\n\n getConfigPath(): Promise<string> {\n throw new Error('Not implemented');\n }\n\n addServer(\n apiKey?: string,\n selectedFeatures?: string[],\n local?: boolean,\n ): Promise<InstallResult> {\n const binary = this.findClaudeBinary();\n if (!binary)\n return Promise.resolve({\n success: false,\n reason: 'The claude CLI is no longer on your PATH.',\n });\n\n const serverName = local ? 'posthog-local' : 'posthog';\n const url = buildMCPUrl(selectedFeatures, local);\n const args = [\n 'mcp',\n 'add',\n '--transport',\n 'http',\n '--scope',\n 'user',\n serverName,\n url,\n ];\n if (apiKey) {\n args.push('--header', `Authorization: Bearer ${apiKey}`);\n }\n\n try {\n execSync(`${binary} ${args.map((a) => JSON.stringify(a)).join(' ')}`, {\n stdio: 'pipe',\n });\n return Promise.resolve({ success: true });\n } catch (error) {\n // The failing command echoes back the Authorization header we passed, so\n // redact before this reaches a log, the screen, or an exception report.\n const msg = redactSecrets(\n error instanceof Error ? error.message : String(error),\n );\n if (msg.includes('already exists')) {\n return Promise.resolve({ success: true, alreadyInstalled: true });\n }\n analytics.captureException(\n new Error(`Claude Code MCP add failed: ${msg}`),\n );\n return Promise.resolve({ success: false, reason: msg });\n }\n }\n\n removeServer(local?: boolean): Promise<InstallResult> {\n const claudeBinary = this.findClaudeBinary();\n if (!claudeBinary) {\n return Promise.resolve({\n success: false,\n reason: 'The claude CLI is no longer on your PATH.',\n });\n }\n\n const serverName = local ? 'posthog-local' : 'posthog';\n const command = `${claudeBinary} mcp remove --scope user ${serverName}`;\n\n try {\n execSync(command, { stdio: 'pipe' });\n } catch (error) {\n const reason = redactSecrets(\n error instanceof Error ? error.message : String(error),\n );\n // Removing something that isn't there is the requested end state, not a\n // failure to report.\n if (/no( such)? mcp server|not found/i.test(reason)) {\n return Promise.resolve({ success: true, alreadyInstalled: true });\n }\n analytics.captureException(\n new Error(`Failed to remove server from Claude Code: ${reason}`),\n );\n return Promise.resolve({ success: false, reason });\n }\n\n return Promise.resolve({ success: true });\n }\n\n supportsPlugin(): boolean {\n return this.findClaudeBinary() !== null;\n }\n\n isPluginInstalled(): Promise<boolean> {\n const binary = this.findClaudeBinary();\n if (!binary) return Promise.resolve(false);\n try {\n const output = execSync(`${binary} plugin list`, {\n stdio: 'pipe',\n }).toString();\n return Promise.resolve(output.toLowerCase().includes('posthog'));\n } catch {\n return Promise.resolve(false);\n }\n }\n\n async installPlugin(): Promise<PluginInstallResult> {\n const binary = this.findClaudeBinary();\n if (!binary)\n return {\n success: false,\n reason: 'The claude CLI is no longer on your PATH.',\n };\n\n // Ask before installing so a re-run reports \"already installed\" rather than\n // relying on the CLI's error text to spot the no-op.\n if (await this.isPluginInstalled()) {\n return { success: true, alreadyInstalled: true };\n }\n\n try {\n execSync(`${binary} plugin install posthog`, { stdio: 'pipe' });\n return { success: true };\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n if (msg.includes('already installed') || msg.includes('already exists')) {\n return { success: true, alreadyInstalled: true };\n }\n analytics.captureException(\n new Error(`Claude Code plugin install failed: ${msg}`),\n );\n return { success: false, reason: msg };\n }\n }\n}\n","import { MCPClient } from '@steps/add-mcp-server-to-clients/MCPClient';\nimport type { InstallResult } from '@steps/add-mcp-server-to-clients/results';\nimport { BrowserFinishable } from '@steps/add-mcp-server-to-clients/browser-client';\nimport { openTrackedLink } from '@utils/links';\n\n/**\n * Claude Desktop / Claude.ai (web). PostHog ships here as a hosted connector,\n * not a local config — so instead of writing files we open the connector\n * directory page and let the user sign in and click \"Connect\".\n */\nexport class ClaudeWebMCPClient extends MCPClient implements BrowserFinishable {\n name = 'Claude Desktop/Web';\n connectorUrl = 'https://claude.ai/directory/connectors/posthog';\n finishInstruction = 'Sign in and click \"Connect\" to finish.';\n\n isClientSupported(): Promise<boolean> {\n // Browser-based — available on every platform.\n return Promise.resolve(true);\n }\n\n isServerInstalled(): Promise<boolean> {\n // The connector lives in the user's Claude account; nothing local to\n // inspect. Returning false also keeps it out of `mcp remove`.\n return Promise.resolve(false);\n }\n\n addServer(): Promise<InstallResult> {\n // Not a PostHog property, so no UTMs — just the tracked open.\n openTrackedLink(this.connectorUrl, 'claude-web-connector', {\n auto: true,\n skipUtm: true,\n });\n return Promise.resolve({ success: true });\n }\n\n removeServer(): Promise<InstallResult> {\n // The connector lives in the user's Claude account, so `mcp remove` can't\n // touch it. It never reaches here today (isServerInstalled is always\n // false), but say where to go if it ever does.\n return Promise.resolve({\n success: false,\n reason:\n 'This connector is managed in your Claude account — remove it at claude.ai/settings/connectors.',\n });\n }\n\n getConfigPath(): Promise<string> {\n throw new Error('Not implemented');\n }\n\n getServerPropertyName(): string {\n throw new Error('Not implemented');\n }\n}\n\nexport default ClaudeWebMCPClient;\n","import z from 'zod';\nimport * as path from 'path';\nimport * as os from 'os';\nimport {\n DefaultMCPClient,\n MCPServerConfig,\n} from '@steps/add-mcp-server-to-clients/MCPClient';\nimport { getNativeHTTPServerConfig } from '@steps/add-mcp-server-to-clients/defaults';\nimport { runtimeEnv } from '@env';\n\nexport const VisualStudioCodeMCPConfig = z\n .object({\n servers: z.record(\n z.string(),\n z.union([\n z.object({\n command: z.string().optional(),\n args: z.array(z.string()).optional(),\n env: z.record(z.string(), z.string()).optional(),\n }),\n z.object({\n type: z.enum(['http', 'sse']),\n url: z.string(),\n headers: z.record(z.string(), z.string()).optional(),\n }),\n ]),\n ),\n })\n .passthrough();\n\nexport type VisualStudioCodeMCPConfig = z.infer<\n typeof VisualStudioCodeMCPConfig\n>;\n\nexport class VisualStudioCodeClient extends DefaultMCPClient {\n name = 'Visual Studio Code';\n\n getServerPropertyName(): string {\n return 'servers';\n }\n\n async isClientSupported(): Promise<boolean> {\n return Promise.resolve(\n process.platform === 'darwin' ||\n process.platform === 'win32' ||\n process.platform === 'linux',\n );\n }\n\n async getConfigPath(): Promise<string> {\n const homeDir = os.homedir();\n const isWindows = process.platform === 'win32';\n const isMac = process.platform === 'darwin';\n const isLinux = process.platform === 'linux';\n\n if (isMac) {\n return Promise.resolve(\n path.join(\n homeDir,\n 'Library',\n 'Application Support',\n 'Code',\n 'User',\n 'mcp.json',\n ),\n );\n }\n\n if (isWindows) {\n return Promise.resolve(\n path.join(runtimeEnv('APPDATA') || '', 'Code', 'User', 'mcp.json'),\n );\n }\n\n if (isLinux) {\n return Promise.resolve(\n path.join(homeDir, '.config', 'Code', 'User', 'mcp.json'),\n );\n }\n\n throw new Error(`Unsupported platform: ${process.platform}`);\n }\n\n getServerConfig(\n apiKey: string | undefined,\n selectedFeatures?: string[],\n local?: boolean,\n ): MCPServerConfig {\n return {\n type: 'http',\n ...getNativeHTTPServerConfig(apiKey, selectedFeatures, local),\n };\n }\n}\n","import z from 'zod';\nimport * as path from 'path';\nimport * as os from 'os';\nimport {\n DefaultMCPClient,\n MCPServerConfig,\n} from '@steps/add-mcp-server-to-clients/MCPClient';\nimport { getNativeHTTPServerConfig } from '@steps/add-mcp-server-to-clients/defaults';\nimport { runtimeEnv } from '@env';\n\nexport const ZedMCPConfig = z\n .object({\n context_servers: z.record(\n z.string(),\n z.union([\n z.object({\n enabled: z.boolean().optional(),\n source: z.string().optional(),\n command: z.string().optional(),\n args: z.array(z.string()).optional(),\n env: z.record(z.string(), z.string()).optional(),\n }),\n z.object({\n enabled: z.boolean().optional(),\n url: z.string(),\n headers: z.record(z.string(), z.string()).optional(),\n }),\n ]),\n ),\n })\n .passthrough();\n\nexport type ZedMCPConfig = z.infer<typeof ZedMCPConfig>;\n\nexport class ZedClient extends DefaultMCPClient {\n name = 'Zed';\n\n getServerPropertyName(): string {\n return 'context_servers';\n }\n\n async isClientSupported(): Promise<boolean> {\n return Promise.resolve(\n process.platform === 'darwin' || process.platform === 'linux',\n );\n }\n\n async getConfigPath(): Promise<string> {\n const homeDir = os.homedir();\n const isMac = process.platform === 'darwin';\n const isLinux = process.platform === 'linux';\n\n if (isMac) {\n return Promise.resolve(\n path.join(homeDir, '.config', 'zed', 'settings.json'),\n );\n }\n\n if (isLinux) {\n // https://zed.dev/docs/configuring-zed#settings-files\n const xdgConfigHome = runtimeEnv('XDG_CONFIG_HOME');\n if (xdgConfigHome) {\n return Promise.resolve(\n path.join(xdgConfigHome, 'zed', 'settings.json'),\n );\n }\n return Promise.resolve(\n path.join(homeDir, '.config', 'zed', 'settings.json'),\n );\n }\n\n throw new Error(`Unsupported platform: ${process.platform}`);\n }\n\n getServerConfig(\n apiKey: string | undefined,\n selectedFeatures?: string[],\n local?: boolean,\n ): MCPServerConfig {\n return {\n enabled: true,\n ...getNativeHTTPServerConfig(apiKey, selectedFeatures, local),\n };\n }\n}\n","import { z } from 'zod';\nimport { execSync, spawnSync } from 'node:child_process';\nimport * as fs from 'node:fs';\nimport * as os from 'node:os';\nimport * as path from 'node:path';\n\nimport { DefaultMCPClient } from '@steps/add-mcp-server-to-clients/MCPClient';\nimport {\n DefaultMCPClientConfig,\n buildMCPUrl,\n} from '@steps/add-mcp-server-to-clients/defaults';\nimport {\n PluginCapable,\n PluginInstallResult,\n} from '@steps/add-mcp-server-to-clients/plugin-client';\nimport {\n redactSecrets,\n type InstallResult,\n} from '@steps/add-mcp-server-to-clients/results';\n\nimport { analytics } from '@utils/analytics';\n\n/** Wording codex uses when the thing we're adding is already registered. */\nconst ALREADY_INSTALLED_PATTERN =\n /already (installed|exists|added|registered)/i;\n/** Wording that means the opposite: a cache entry exists but the plugin doesn't. */\nconst STALE_MARKETPLACE_CACHE = /already added from a different source/i;\n\nexport const CodexMCPConfig = DefaultMCPClientConfig;\n\nexport type CodexMCPConfig = z.infer<typeof DefaultMCPClientConfig>;\n\nexport class CodexMCPClient extends DefaultMCPClient implements PluginCapable {\n name = 'Codex';\n private codexBinaryPath: string | null = null;\n\n constructor() {\n super();\n }\n\n private findCodexBinary(): string | null {\n if (this.codexBinaryPath) return this.codexBinaryPath;\n try {\n const resolved = execSync('command -v codex', { stdio: 'pipe' })\n .toString()\n .trim();\n if (resolved) {\n this.codexBinaryPath = resolved;\n return resolved;\n }\n } catch {\n // not in PATH\n }\n return null;\n }\n\n isClientSupported(): Promise<boolean> {\n return Promise.resolve(this.findCodexBinary() !== null);\n }\n\n getConfigPath(): Promise<string> {\n throw new Error('Not implemented');\n }\n\n isServerInstalled(local?: boolean): Promise<boolean> {\n const binary = this.findCodexBinary();\n if (!binary) return Promise.resolve(false);\n const serverName = local ? 'posthog-local' : 'posthog';\n const result = spawnSync(binary, ['mcp', 'list'], { encoding: 'utf-8' });\n if (result.status !== 0) return Promise.resolve(false);\n return Promise.resolve(\n (result.stdout ?? '').toLowerCase().includes(serverName),\n );\n }\n\n addServer(\n apiKey?: string,\n selectedFeatures?: string[],\n local?: boolean,\n ): Promise<InstallResult> {\n const binary = this.findCodexBinary();\n if (!binary)\n return Promise.resolve({\n success: false,\n reason: 'The codex CLI is no longer on your PATH.',\n });\n\n const serverName = local ? 'posthog-local' : 'posthog';\n const url = buildMCPUrl(selectedFeatures, local);\n const args = ['mcp', 'add', serverName, '--url', url];\n const env = { ...process.env };\n if (apiKey) {\n const tokenVar = 'POSTHOG_AUTH_HEADER';\n env[tokenVar] = `Bearer ${apiKey}`;\n args.push('--bearer-token-env-var', tokenVar);\n }\n\n const result = spawnSync(binary, args, { encoding: 'utf-8', env });\n if (result.status !== 0) {\n const stderr = result.stderr ?? '';\n if (ALREADY_INSTALLED_PATTERN.test(stderr)) {\n return Promise.resolve({ success: true, alreadyInstalled: true });\n }\n const reason = redactSecrets(stderr);\n analytics.captureException(new Error(`Codex MCP add failed: ${reason}`));\n return Promise.resolve({ success: false, reason });\n }\n return Promise.resolve({ success: true });\n }\n\n removeServer(local?: boolean): Promise<InstallResult> {\n const binary = this.findCodexBinary();\n if (!binary)\n return Promise.resolve({\n success: false,\n reason: 'The codex CLI is no longer on your PATH.',\n });\n\n // `local` was ignored here, so `mcp remove --local` reported success while\n // leaving the posthog-local server in place.\n const serverName = local ? 'posthog-local' : 'posthog';\n const result = spawnSync(binary, ['mcp', 'remove', serverName], {\n encoding: 'utf-8',\n });\n\n if (result.error || result.status !== 0) {\n const reason = redactSecrets(\n result.error?.message ?? result.stderr ?? 'codex mcp remove failed',\n );\n analytics.captureException(\n new Error(`Failed to remove server from Codex CLI: ${reason}`),\n );\n return Promise.resolve({ success: false, reason });\n }\n\n return Promise.resolve({ success: true });\n }\n\n supportsPlugin(): boolean {\n return this.findCodexBinary() !== null;\n }\n\n isPluginInstalled(): Promise<boolean> {\n const configPath = path.join(os.homedir(), '.codex', 'config.toml');\n try {\n const contents = fs.readFileSync(configPath, 'utf-8');\n // Marketplace installs appear as [marketplaces.posthog] in config.toml\n return Promise.resolve(\n contents.toLowerCase().includes('[marketplaces.posthog]'),\n );\n } catch {\n return Promise.resolve(false);\n }\n }\n\n async installPlugin(): Promise<PluginInstallResult> {\n const binary = this.findCodexBinary();\n if (!binary)\n return {\n success: false,\n reason: 'The codex CLI is no longer on your PATH.',\n };\n\n // `codex plugin marketplace add` exits non-zero once the marketplace is\n // registered, so ask config.toml first. Without this the second run of\n // `mcp add` looked like a failure and reported nothing at all.\n if (await this.isPluginInstalled()) {\n return { success: true, alreadyInstalled: true };\n }\n\n const run = () =>\n spawnSync(binary, ['plugin', 'marketplace', 'add', 'PostHog/ai-plugin'], {\n encoding: 'utf-8',\n });\n\n let result = run();\n\n // Stale cache directory with no config.toml entry — clear it and retry\n if (\n result.status !== 0 &&\n STALE_MARKETPLACE_CACHE.test(result.stderr ?? '')\n ) {\n const staleDir = path.join(\n os.homedir(),\n '.codex',\n '.tmp',\n 'marketplaces',\n 'posthog',\n );\n try {\n fs.rmSync(staleDir, { recursive: true, force: true });\n } catch {\n // ignore — retry anyway\n }\n result = run();\n }\n\n if (result.status !== 0) {\n const stderr = result.stderr ?? '';\n // The marketplace was registered by something other than us (a manual\n // `codex plugin marketplace add`, or a version that writes config.toml\n // differently) — that's still \"already installed\", not a failure. The\n // stale-cache wording above is deliberately excluded: that one means the\n // plugin is NOT registered, and it only reaches here if the retry failed.\n if (\n ALREADY_INSTALLED_PATTERN.test(stderr) &&\n !STALE_MARKETPLACE_CACHE.test(stderr)\n ) {\n return { success: true, alreadyInstalled: true };\n }\n const reason = redactSecrets(stderr);\n analytics.captureException(\n new Error(`Codex plugin install failed: ${reason}`),\n );\n return { success: false, reason };\n }\n\n return { success: true };\n }\n}\n\nexport default CodexMCPClient;\n","import z from 'zod';\nimport * as path from 'path';\nimport * as os from 'os';\nimport * as fs from 'fs';\nimport { execSync } from 'node:child_process';\nimport {\n DefaultMCPClient,\n MCPServerConfig,\n} from '@steps/add-mcp-server-to-clients/MCPClient';\nimport { getNativeHTTPServerConfig } from '@steps/add-mcp-server-to-clients/defaults';\nimport { runtimeEnv } from '@env';\n\nexport const OpenCodeMCPConfig = z\n .object({\n mcp: z.record(\n z.string(),\n z.object({\n type: z.literal('remote'),\n url: z.string(),\n headers: z.record(z.string(), z.string()).optional(),\n }),\n ),\n })\n .passthrough();\n\nexport type OpenCodeMCPConfig = z.infer<typeof OpenCodeMCPConfig>;\n\nexport class OpenCodeMCPClient extends DefaultMCPClient {\n name = 'OpenCode';\n private opencodeBinaryPath: string | null = null;\n\n override getServerPropertyName(): string {\n return 'mcp';\n }\n\n private findOpenCodeBinary(): string | null {\n if (this.opencodeBinaryPath) return this.opencodeBinaryPath;\n try {\n const resolved = execSync('command -v opencode', { stdio: 'pipe' })\n .toString()\n .trim();\n if (resolved) {\n this.opencodeBinaryPath = resolved;\n return resolved;\n }\n } catch {\n // not in PATH\n }\n return null;\n }\n\n isClientSupported(): Promise<boolean> {\n return Promise.resolve(this.findOpenCodeBinary() !== null);\n }\n\n getConfigPath(): Promise<string> {\n const configDir = this.resolveConfigDir();\n const jsoncPath = path.join(configDir, 'opencode.jsonc');\n const jsonPath = path.join(configDir, 'opencode.json');\n if (fs.existsSync(jsoncPath)) return Promise.resolve(jsoncPath);\n return Promise.resolve(jsonPath);\n }\n\n private resolveConfigDir(): string {\n const envDir = runtimeEnv('OPENCODE_CONFIG_DIR');\n if (envDir) return envDir;\n\n const xdgHome = runtimeEnv('XDG_CONFIG_HOME');\n if (xdgHome) return path.join(xdgHome, 'opencode');\n\n return path.join(os.homedir(), '.config', 'opencode');\n }\n\n override getServerConfig(\n apiKey: string | undefined,\n selectedFeatures?: string[],\n local?: boolean,\n ): MCPServerConfig {\n return {\n type: 'remote',\n ...getNativeHTTPServerConfig(apiKey, selectedFeatures, local),\n };\n }\n}\n","import type { InstallResult } from './results';\n\nexport type PluginInstallResult = InstallResult;\n\nexport interface PluginCapable {\n supportsPlugin(): boolean;\n isPluginInstalled(): Promise<boolean>;\n installPlugin(): Promise<PluginInstallResult>;\n}\n\nexport function isPluginCapable<T>(client: T): client is T & PluginCapable {\n return (\n typeof client === 'object' &&\n client !== null &&\n 'supportsPlugin' in client &&\n 'installPlugin' in client\n );\n}\n","import type { Integration } from '@lib/constants';\nimport type { CloudRegion } from '@utils/types';\nimport { withProgress } from '../../telemetry';\nimport { analytics } from '@utils/analytics';\nimport { getUI } from '@ui';\nimport { MCPClient } from './MCPClient';\nimport { CursorMCPClient } from './clients/cursor';\nimport { ClaudeCodeMCPClient } from './clients/claude-code';\nimport { ClaudeWebMCPClient } from './clients/claude-web';\nimport { VisualStudioCodeClient } from './clients/visual-studio-code';\nimport { ZedClient } from './clients/zed';\nimport { CodexMCPClient } from './clients/codex';\nimport { OpenCodeMCPClient } from './clients/opencode';\nimport { ALL_FEATURE_VALUES } from './defaults';\nimport { debug } from '@utils/debug';\nimport { isPluginCapable, PluginCapable } from './plugin-client';\nimport {\n McpClientStatus,\n namesWithStatus,\n toClientResult,\n type McpClientResult,\n} from './results';\n\nexport const getSupportedClients = async (): Promise<MCPClient[]> => {\n const allClients = [\n new ClaudeCodeMCPClient(),\n new ClaudeWebMCPClient(),\n new CodexMCPClient(),\n new CursorMCPClient(),\n new VisualStudioCodeClient(),\n new ZedClient(),\n new OpenCodeMCPClient(),\n ];\n const supportedClients: MCPClient[] = [];\n\n debug('Checking for supported MCP clients...');\n for (const client of allClients) {\n const isSupported = await client.isClientSupported();\n debug(`${client.name}: ${isSupported ? '✓ supported' : '✗ not supported'}`);\n if (isSupported) {\n supportedClients.push(client);\n }\n }\n debug(\n `Found ${supportedClients.length} supported client(s): ${supportedClients\n .map((c) => c.name)\n .join(', ')}`,\n );\n\n return supportedClients;\n};\n\n/**\n * Add MCP server to clients. No prompts — pure orchestration.\n * Prompts are handled by McpScreen (TUI) or auto-accepted (CI).\n */\nexport const addMCPServerToClientsStep = async ({\n integration,\n local = false,\n ci = false,\n cloudRegion: _cloudRegion,\n features,\n apiKey,\n}: {\n integration?: Integration;\n local?: boolean;\n ci?: boolean;\n cloudRegion?: CloudRegion;\n features?: string[];\n apiKey?: string;\n}): Promise<string[]> => {\n const ui = getUI();\n\n // CI mode: skip MCP installation entirely\n if (ci) {\n ui.log.info('Skipping MCP installation (CI mode)');\n return [];\n }\n\n const supportedClients = await getSupportedClients();\n\n if (supportedClients.length === 0) {\n ui.log.info(\n 'No supported MCP clients detected. Skipping MCP installation.',\n );\n return [];\n }\n\n // Auto-install to all supported clients\n const results = await withProgress('adding mcp servers', () =>\n addMCPServer(\n supportedClients,\n apiKey,\n features ?? [...ALL_FEATURE_VALUES],\n local,\n ),\n );\n\n const installed = namesWithStatus(results, McpClientStatus.Changed);\n const already = namesWithStatus(results, McpClientStatus.Unchanged);\n const failed = results.filter((r) => r.status === McpClientStatus.Failed);\n\n // Report each outcome on its own — a blanket \"Added the MCP server to: ...\"\n // hid both the no-op re-runs and the outright failures.\n if (installed.length > 0) {\n ui.log.success(`Added the MCP server to:\\n${bulletList(installed)}`);\n }\n if (already.length > 0) {\n ui.log.info(\n `The PostHog MCP server was already installed, so nothing changed for:\\n${bulletList(\n already,\n )}`,\n );\n }\n if (failed.length > 0) {\n ui.log.warn(\n `Couldn't add the MCP server to:\\n${bulletList(\n failed.map((r) => (r.detail ? `${r.name} — ${r.detail}` : r.name)),\n )}`,\n );\n }\n\n const withServer = [...installed, ...already];\n\n analytics.wizardCapture('mcp servers added', {\n // `clients` stays \"every client that ended up with the MCP server\", which is\n // what it meant before — the new properties break that down.\n clients: withServer,\n already_installed_clients: already,\n failed_clients: failed.map((r) => r.name),\n attempted_clients: supportedClients.map((c) => c.name),\n integration,\n });\n\n return withServer;\n};\n\nconst bulletList = (items: string[]): string =>\n items.map((item) => ` - ${item}`).join('\\n');\n\nexport const removeMCPServerFromClientsStep = async ({\n integration,\n local = false,\n}: {\n integration?: Integration;\n local?: boolean;\n}): Promise<string[]> => {\n const ui = getUI();\n const installedClients = await getInstalledClients(local);\n if (installedClients.length === 0) {\n ui.log.info(\n 'The PostHog MCP server is not installed for any supported client. Nothing to remove.',\n );\n analytics.wizardCapture('mcp no servers to remove', {\n integration,\n });\n return [];\n }\n\n // Auto-remove from all installed clients\n const results = await withProgress('removing mcp servers', () =>\n removeMCPServer(installedClients, local),\n );\n\n const removed = namesWithStatus(results, McpClientStatus.Changed);\n const nothingToDo = namesWithStatus(results, McpClientStatus.Unchanged);\n const failed = results.filter((r) => r.status === McpClientStatus.Failed);\n\n // This step used to print nothing at all, so a non-TTY `mcp remove` gave no\n // hint whether anything happened — let alone whether a client failed.\n if (removed.length > 0) {\n ui.log.success(`Removed the MCP server from:\\n${bulletList(removed)}`);\n }\n if (nothingToDo.length > 0) {\n ui.log.info(\n `No PostHog MCP entry left to remove for:\\n${bulletList(nothingToDo)}`,\n );\n }\n if (failed.length > 0) {\n ui.log.warn(\n `Couldn't remove the MCP server from:\\n${bulletList(\n failed.map((r) => (r.detail ? `${r.name} — ${r.detail}` : r.name)),\n )}`,\n );\n }\n\n analytics.wizardCapture('mcp servers removed', {\n clients: removed,\n nothing_to_remove_clients: nothingToDo,\n failed_clients: failed.map((r) => r.name),\n attempted_clients: installedClients.map((c) => c.name),\n integration,\n });\n\n return removed;\n};\n\nexport const getInstalledClients = async (\n local?: boolean,\n): Promise<MCPClient[]> => {\n const clients = await getSupportedClients();\n const installedClients: MCPClient[] = [];\n\n for (const client of clients) {\n if (await client.isServerInstalled(local)) {\n installedClients.push(client);\n }\n }\n\n return installedClients;\n};\n\nexport const addMCPServer = async (\n clients: MCPClient[],\n personalApiKey?: string,\n selectedFeatures?: string[],\n local?: boolean,\n): Promise<McpClientResult[]> => {\n const results: McpClientResult[] = [];\n for (const client of clients) {\n try {\n const result = await client.addServer(\n personalApiKey,\n selectedFeatures,\n local,\n );\n results.push(toClientResult(client.name, result));\n } catch (err) {\n debug(`[addMCPServer] addServer threw for ${client.name}: ${err}`);\n results.push(\n toClientResult(client.name, {\n success: false,\n reason: err instanceof Error ? err.message : String(err),\n }),\n );\n }\n }\n return results;\n};\n\nexport const getSupportedPluginClients = (\n clients: MCPClient[],\n): Array<MCPClient & PluginCapable> => {\n return clients.filter(isPluginCapable).filter((c) => c.supportsPlugin());\n};\n\nexport const installPlugins = async (\n clients: Array<MCPClient & PluginCapable>,\n): Promise<McpClientResult[]> => {\n const results: McpClientResult[] = [];\n for (const client of clients) {\n try {\n results.push(toClientResult(client.name, await client.installPlugin()));\n } catch (err) {\n debug(`[installPlugins] installPlugin threw for ${client.name}: ${err}`);\n results.push(\n toClientResult(client.name, {\n success: false,\n reason: err instanceof Error ? err.message : String(err),\n }),\n );\n }\n }\n return results;\n};\n\nexport const removeMCPServer = async (\n clients: MCPClient[],\n local?: boolean,\n): Promise<McpClientResult[]> => {\n const results: McpClientResult[] = [];\n for (const client of clients) {\n try {\n results.push(\n toClientResult(client.name, await client.removeServer(local)),\n );\n } catch (err) {\n debug(`[removeMCPServer] removeServer threw for ${client.name}: ${err}`);\n results.push(\n toClientResult(client.name, {\n success: false,\n reason: err instanceof Error ? err.message : String(err),\n }),\n );\n }\n }\n return results;\n};\n"],"mappings":"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"}
@@ -1,10 +1,10 @@
1
1
  import { n as __require } from "./rolldown-runtime-B_-DWIq7.js";
2
- import { G as POSTHOG_FLAG_HEADER_PREFIX, J as POSTHOG_PROPERTY_HEADER_PREFIX, a as getLogFilePath, bt as runtimeEnv, f as getUI, mt as wizardUserAgentForProgram, o as initLogFile, r as debug, s as logToFile, ut as WIZARD_REMARK_EVENT_NAME } from "./debug-D3Ucw2y1.js";
3
- import { n as analytics } from "./analytics-B9V7x1Ma.js";
4
- import { n as ADDITIONAL_FEATURE_PROMPTS } from "./wizard-session-CwgR5y3-.js";
5
- import { i as wizardAbort, n as registerCleanup, t as WizardError } from "./wizard-abort-Bgx_JOfw.js";
6
- import { a as buildOrchestratorTools, h as triageModelFor, l as makeMutex, p as modelCapabilities, u as writeJsonAtomic } from "./queue-tools-QVKYMX_C.js";
7
- import { b as coerceAuditChecks, g as AUDIT_CHECKS_FILE, l as prewarmYaraScanner, n as createPostToolUseYaraHooks, p as scanInstalledSkill, r as createPreToolUseYaraHooks } from "./yara-hooks-Cj8x2YV4.js";
2
+ import { G as POSTHOG_FLAG_HEADER_PREFIX, J as POSTHOG_PROPERTY_HEADER_PREFIX, a as getLogFilePath, bt as runtimeEnv, f as getUI, mt as wizardUserAgentForProgram, o as initLogFile, r as debug, s as logToFile, ut as WIZARD_REMARK_EVENT_NAME } from "./debug-8-IIHr5f.js";
3
+ import { n as analytics } from "./analytics-CkIyBHfd.js";
4
+ import { n as ADDITIONAL_FEATURE_PROMPTS } from "./wizard-session-BUhlJ1b8.js";
5
+ import { i as wizardAbort, n as registerCleanup, t as WizardError } from "./wizard-abort-Cz916Qq5.js";
6
+ import { a as buildOrchestratorTools, d as writeJsonAtomic, g as triageModelFor, m as modelCapabilities, u as makeMutex } from "./queue-tools-OynU-m2F.js";
7
+ import { b as coerceAuditChecks, g as AUDIT_CHECKS_FILE, l as prewarmYaraScanner, n as createPostToolUseYaraHooks, p as scanInstalledSkill, r as createPreToolUseYaraHooks } from "./yara-hooks-DgScuNrT.js";
8
8
  import { createRequire } from "node:module";
9
9
  import * as fs$1 from "fs";
10
10
  import fs from "fs";
@@ -3119,4 +3119,4 @@ function handleSDKMessage(message, options, spinner, signals, receivedSuccessRes
3119
3119
  //#endregion
3120
3120
  export { resolveEnvSecretRefs as A, downloadSkill as C, mergeEnvValues as D, installSkillById as E, createTriageLLMProvider as F, GATEWAY_PROVIDER as I, buildGatewayProvider as L, fetchWithRetry as M, createWizardAskBridge as N, parseEnvKeys as O, isFullyCancelled as P, WIZARD_TOOL_NAMES as S, fetchSkillMenu as T, PUBLISH_HANDOFF_CONTENT_DESCRIPTION as _, wizardCanUseTool as a, publishHandoff as b, classifySettingsConflicts as c, sanitizeAgentSubprocessEnv as d, AgentOutputSignals as f, createSecretVault as g, assembleCommandments as h, runAgent as i, vaultSensitiveAnswers as j, resolveEnvPath as k, recoverOrphanedSettingsBackups as l, REMARK_INSTRUCTION as m, buildRunTags as n, backupAndFixClaudeSettings as o, AgentSignals as p, initializeAgent as r, checkAllSettingsConflicts as s, buildAgentEnv as t, restoreClaudeSettings as u, PUBLISH_HANDOFF_DESCRIPTION as v, evaluateAskCap as w, ENV_FILE_PATH_DESCRIPTION as x, PUBLISH_HANDOFF_TOOL_NAME as y };
3121
3121
 
3122
- //# sourceMappingURL=agent-interface-CybBFwnk.js.map
3122
+ //# sourceMappingURL=agent-interface-Bm4ZNGGV.js.map