@posthog/wizard 2.37.0 → 2.38.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 (97) hide show
  1. package/dist/{add-mcp-server-to-clients-CNn9br9l.js → add-mcp-server-to-clients-BB1_aH5M.js} +5 -5
  2. package/dist/{add-mcp-server-to-clients-CNn9br9l.js.map → add-mcp-server-to-clients-BB1_aH5M.js.map} +1 -1
  3. package/dist/{agent-interface-D8jnkEnB.js → agent-interface-kOuzXg84.js} +69 -1119
  4. package/dist/agent-interface-kOuzXg84.js.map +1 -0
  5. package/dist/{agent-runner-BxIYcxmA.js → agent-runner-DZhaiwD5.js} +2571 -1648
  6. package/dist/agent-runner-DZhaiwD5.js.map +1 -0
  7. package/dist/analytics-B1SC2jaf.js +2 -0
  8. package/dist/{analytics-Du8Z_3oX.js → analytics-Z_2kCTpB.js} +4 -3
  9. package/dist/{analytics-Du8Z_3oX.js.map → analytics-Z_2kCTpB.js.map} +1 -1
  10. package/dist/{api-BqKMQVhj.js → api-CwhOyprf.js} +3 -3
  11. package/dist/{api-BqKMQVhj.js.map → api-CwhOyprf.js.map} +1 -1
  12. package/dist/bin.js +64 -50
  13. package/dist/bin.js.map +1 -1
  14. package/dist/{ci-install-UlWb3u5t.js → ci-install-CWDY86uB.js} +4 -4
  15. package/dist/{ci-install-UlWb3u5t.js.map → ci-install-CWDY86uB.js.map} +1 -1
  16. package/dist/{debug-B4AH8Ahp.js → debug-BmdpjMub.js} +1 -1
  17. package/dist/{debug-CZwmzyDx.js → debug-CaRHQrDY.js} +91 -13
  18. package/dist/debug-CaRHQrDY.js.map +1 -0
  19. package/dist/{defaults-UswXMiTx.js → defaults-a0e6IRjP.js} +1 -1
  20. package/dist/{defaults-UswXMiTx.js.map → defaults-a0e6IRjP.js.map} +1 -1
  21. package/dist/{env-api-key-Db-mNPK2.js → env-api-key-DEl3LJBv.js} +1 -1
  22. package/dist/{env-api-key-Db-mNPK2.js.map → env-api-key-DEl3LJBv.js.map} +1 -1
  23. package/dist/{environment-BRXwshJO.js → environment-knibpXF2.js} +3 -3
  24. package/dist/{environment-BRXwshJO.js.map → environment-knibpXF2.js.map} +1 -1
  25. package/dist/{file-utils-D6CWLaOm.js → file-utils-DWYX_G1o.js} +2 -2
  26. package/dist/{file-utils-D6CWLaOm.js.map → file-utils-DWYX_G1o.js.map} +1 -1
  27. package/dist/{headless-ui-DvkogF0b.js → headless-ui-C4JCi9Zz.js} +2 -2
  28. package/dist/{headless-ui-DvkogF0b.js.map → headless-ui-C4JCi9Zz.js.map} +1 -1
  29. package/dist/{host-resolution-DrOzdKdY.js → host-resolution-C18FwVrM.js} +3 -3
  30. package/dist/{host-resolution-DrOzdKdY.js.map → host-resolution-C18FwVrM.js.map} +1 -1
  31. package/dist/{interactive-CXL8oJwb.js → interactive-46qgS-UA.js} +2 -2
  32. package/dist/{interactive-CXL8oJwb.js.map → interactive-46qgS-UA.js.map} +1 -1
  33. package/dist/mcp-QWL5Obf3.js +108 -0
  34. package/dist/mcp-QWL5Obf3.js.map +1 -0
  35. package/dist/{mcp-prompt-streaming-Dumivcgi.js → mcp-prompt-streaming-BpNkFksF.js} +5 -5
  36. package/dist/mcp-prompt-streaming-BpNkFksF.js.map +1 -0
  37. package/dist/{non-interactive-BI5b25U7.js → non-interactive-3_T1d0cj.js} +2 -2
  38. package/dist/{non-interactive-BI5b25U7.js.map → non-interactive-3_T1d0cj.js.map} +1 -1
  39. package/dist/{package-json-DCuoye-H.js → package-json-CDs1ZVKu.js} +1 -1
  40. package/dist/{package-json-DCuoye-H.js.map → package-json-CDs1ZVKu.js.map} +1 -1
  41. package/dist/{package-manager-9nhQBKAy.js → package-manager-C5VVQHQ-.js} +2 -2
  42. package/dist/{package-manager-9nhQBKAy.js.map → package-manager-C5VVQHQ-.js.map} +1 -1
  43. package/dist/{playground-DDYYs2ub.js → playground-CbzUpMuN.js} +783 -7
  44. package/dist/playground-CbzUpMuN.js.map +1 -0
  45. package/dist/{posthog-BrLFkaji.js → posthog-BESrI6-T.js} +1 -1
  46. package/dist/{posthog-BrLFkaji.js.map → posthog-BESrI6-T.js.map} +1 -1
  47. package/dist/{posthog-integration-Cx4RvC7E.js → posthog-integration-6vdi4wRB.js} +19 -18
  48. package/dist/posthog-integration-6vdi4wRB.js.map +1 -0
  49. package/dist/{provisioning-PosLaOt4.js → provisioning-DK0tS98H.js} +4 -4
  50. package/dist/{provisioning-PosLaOt4.js.map → provisioning-DK0tS98H.js.map} +1 -1
  51. package/dist/{registry-B43CNAAx.js → registry-DfXVjxsP.js} +5 -5
  52. package/dist/{registry-B43CNAAx.js.map → registry-DfXVjxsP.js.map} +1 -1
  53. package/dist/security-BMVH_bjk.js +431 -0
  54. package/dist/security-BMVH_bjk.js.map +1 -0
  55. package/dist/{setup-utils-CR8X8Fmf.js → setup-utils-v9I6PQyP.js} +192 -20
  56. package/dist/setup-utils-v9I6PQyP.js.map +1 -0
  57. package/dist/{start-tui-DeewAqJg.js → start-tui-CylEL6i_.js} +63 -38
  58. package/dist/start-tui-CylEL6i_.js.map +1 -0
  59. package/dist/{steps-CPvI-2Ms.js → steps-DQdpexNM.js} +7 -7
  60. package/dist/{steps-CPvI-2Ms.js.map → steps-DQdpexNM.js.map} +1 -1
  61. package/dist/{store-0uzey9Am.js → store-Db0X2V5D.js} +68 -6
  62. package/dist/store-Db0X2V5D.js.map +1 -0
  63. package/dist/subagent-Pk9jRXRf.js +108 -0
  64. package/dist/subagent-Pk9jRXRf.js.map +1 -0
  65. package/dist/{task-stream-DkbGqxZv.js → task-stream-rC4IEUHC.js} +3 -3
  66. package/dist/{task-stream-DkbGqxZv.js.map → task-stream-rC4IEUHC.js.map} +1 -1
  67. package/dist/tasks-B46phMJu.js +112 -0
  68. package/dist/tasks-B46phMJu.js.map +1 -0
  69. package/dist/{telemetry-DJNpvkYP.js → telemetry-BJAHymMq.js} +3 -3
  70. package/dist/{telemetry-DJNpvkYP.js.map → telemetry-BJAHymMq.js.map} +1 -1
  71. package/dist/{terminal-Bd6q58zn.js → terminal-BTQSAkC-.js} +143 -793
  72. package/dist/terminal-BTQSAkC-.js.map +1 -0
  73. package/dist/tools-C_m5knXt.js +122 -0
  74. package/dist/tools-C_m5knXt.js.map +1 -0
  75. package/dist/{urls-B1a2v93j.js → urls-BCmeQMIb.js} +2 -2
  76. package/dist/{urls-B1a2v93j.js.map → urls-BCmeQMIb.js.map} +1 -1
  77. package/dist/{wizard-abort-DyAGpw-u.js → wizard-abort-CMzW4LVM.js} +1 -1
  78. package/dist/{wizard-abort-BG8VNOI9.js → wizard-abort-DkngXmxN.js} +4 -4
  79. package/dist/{wizard-abort-BG8VNOI9.js.map → wizard-abort-DkngXmxN.js.map} +1 -1
  80. package/dist/{wizard-session-CqihOtk3.js → wizard-session-BoXAZEOf.js} +4 -1
  81. package/dist/wizard-session-BoXAZEOf.js.map +1 -0
  82. package/dist/{wizard-session-xzqycI7i.js → wizard-session-C8W_6X0j.js} +1 -1
  83. package/dist/wizard-tools-C8nVWLeI.js +1162 -0
  84. package/dist/wizard-tools-C8nVWLeI.js.map +1 -0
  85. package/dist/wizard-ui-WZ48rUgr.js.map +1 -1
  86. package/package.json +7 -2
  87. package/dist/agent-interface-D8jnkEnB.js.map +0 -1
  88. package/dist/agent-runner-BxIYcxmA.js.map +0 -1
  89. package/dist/debug-CZwmzyDx.js.map +0 -1
  90. package/dist/mcp-prompt-streaming-Dumivcgi.js.map +0 -1
  91. package/dist/playground-DDYYs2ub.js.map +0 -1
  92. package/dist/posthog-integration-Cx4RvC7E.js.map +0 -1
  93. package/dist/setup-utils-CR8X8Fmf.js.map +0 -1
  94. package/dist/start-tui-DeewAqJg.js.map +0 -1
  95. package/dist/store-0uzey9Am.js.map +0 -1
  96. package/dist/terminal-Bd6q58zn.js.map +0 -1
  97. package/dist/wizard-session-CqihOtk3.js.map +0 -1
@@ -0,0 +1,112 @@
1
+ import { p as getUI } from "./debug-CaRHQrDY.js";
2
+ import { Type } from "typebox";
3
+ import { defineTool } from "@earendil-works/pi-coding-agent";
4
+ //#region src/lib/agent/runner/harness/pi/tasks.ts
5
+ /**
6
+ * Task/todo parity for pi (#526). The same four Task tools the anthropic path
7
+ * exposes (TaskCreate/Update/Get/List), as pi `defineTool` tools backed by a
8
+ * shared in-memory store. Every mutation pushes the list to the TUI via
9
+ * `getUI().syncTodos`, so the todo panel updates live under pi exactly like the
10
+ * anthropic path — the thing that was missing before.
11
+ */
12
+ function text(s) {
13
+ return {
14
+ content: [{
15
+ type: "text",
16
+ text: s
17
+ }],
18
+ details: {}
19
+ };
20
+ }
21
+ function syncToTui(store) {
22
+ getUI().syncTodos(Array.from(store.values()).map((t) => ({
23
+ content: t.content,
24
+ status: t.status,
25
+ activeForm: t.activeForm
26
+ })));
27
+ }
28
+ /** Build the four Task tools over a fresh store. */
29
+ function createWizardPiTaskTools() {
30
+ const store = /* @__PURE__ */ new Map();
31
+ return {
32
+ tools: [
33
+ defineTool({
34
+ name: "TaskCreate",
35
+ label: "Create task",
36
+ description: "Create a task in the shared todo list. Returns its assigned id.",
37
+ promptSnippet: "TaskCreate(content) — add a todo (surfaces progress in the UI)",
38
+ parameters: Type.Object({
39
+ content: Type.String({ description: "Imperative task description" }),
40
+ activeForm: Type.Optional(Type.String({ description: "Present-continuous form for the spinner" }))
41
+ }),
42
+ async execute(_id, args) {
43
+ const id = `task-${store.size + 1}`;
44
+ store.set(id, {
45
+ content: args.content,
46
+ status: "pending",
47
+ activeForm: args.activeForm
48
+ });
49
+ syncToTui(store);
50
+ return text(`Created ${id}`);
51
+ }
52
+ }),
53
+ defineTool({
54
+ name: "TaskUpdate",
55
+ label: "Update task",
56
+ description: "Update an existing task by id (status, content, or activeForm).",
57
+ promptSnippet: "TaskUpdate(taskId, status) — mark a todo in_progress/completed",
58
+ parameters: Type.Object({
59
+ taskId: Type.String(),
60
+ status: Type.Optional(Type.Union([
61
+ Type.Literal("pending"),
62
+ Type.Literal("in_progress"),
63
+ Type.Literal("completed")
64
+ ])),
65
+ content: Type.Optional(Type.String()),
66
+ activeForm: Type.Optional(Type.String())
67
+ }),
68
+ async execute(_id, args) {
69
+ const existing = store.get(args.taskId);
70
+ if (!existing) return text(`No such task: ${args.taskId}`);
71
+ store.set(args.taskId, {
72
+ content: args.content ?? existing.content,
73
+ status: args.status ?? existing.status,
74
+ activeForm: args.activeForm ?? existing.activeForm
75
+ });
76
+ syncToTui(store);
77
+ return text(`Updated ${args.taskId}`);
78
+ }
79
+ }),
80
+ defineTool({
81
+ name: "TaskGet",
82
+ label: "Get task",
83
+ description: "Fetch a single task by id.",
84
+ parameters: Type.Object({ taskId: Type.String() }),
85
+ async execute(_id, args) {
86
+ const t = store.get(args.taskId);
87
+ return text(t ? JSON.stringify({
88
+ id: args.taskId,
89
+ ...t
90
+ }) : `No such task: ${args.taskId}`);
91
+ }
92
+ }),
93
+ defineTool({
94
+ name: "TaskList",
95
+ label: "List tasks",
96
+ description: "List all tasks in the shared todo list.",
97
+ parameters: Type.Object({}),
98
+ async execute() {
99
+ return text(JSON.stringify(Array.from(store.entries()).map(([id, t]) => ({
100
+ id,
101
+ ...t
102
+ }))));
103
+ }
104
+ })
105
+ ],
106
+ store
107
+ };
108
+ }
109
+ //#endregion
110
+ export { createWizardPiTaskTools };
111
+
112
+ //# sourceMappingURL=tasks-B46phMJu.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tasks-B46phMJu.js","names":[],"sources":["../src/lib/agent/runner/harness/pi/tasks.ts"],"sourcesContent":["/**\n * Task/todo parity for pi (#526). The same four Task tools the anthropic path\n * exposes (TaskCreate/Update/Get/List), as pi `defineTool` tools backed by a\n * shared in-memory store. Every mutation pushes the list to the TUI via\n * `getUI().syncTodos`, so the todo panel updates live under pi exactly like the\n * anthropic path — the thing that was missing before.\n */\n\nimport { Type } from 'typebox';\nimport { defineTool } from '@earendil-works/pi-coding-agent';\nimport type { ToolDefinition } from '@earendil-works/pi-coding-agent';\nimport { getUI } from '@ui';\n\nexport type TaskStatus = 'pending' | 'in_progress' | 'completed';\nexport interface TaskEntry {\n content: string;\n status: TaskStatus;\n activeForm?: string;\n}\nexport type TaskStore = Map<string, TaskEntry>;\n\nfunction text(s: string): {\n content: [{ type: 'text'; text: string }];\n details: unknown;\n} {\n return { content: [{ type: 'text', text: s }], details: {} };\n}\n\nfunction syncToTui(store: TaskStore): void {\n getUI().syncTodos(\n Array.from(store.values()).map((t) => ({\n content: t.content,\n status: t.status,\n activeForm: t.activeForm,\n })),\n );\n}\n\n/** Build the four Task tools over a fresh store. */\nexport function createWizardPiTaskTools(): {\n tools: ToolDefinition[];\n store: TaskStore;\n} {\n const store: TaskStore = new Map();\n\n const taskCreate = defineTool({\n name: 'TaskCreate',\n label: 'Create task',\n description:\n 'Create a task in the shared todo list. Returns its assigned id.',\n promptSnippet:\n 'TaskCreate(content) — add a todo (surfaces progress in the UI)',\n parameters: Type.Object({\n content: Type.String({ description: 'Imperative task description' }),\n activeForm: Type.Optional(\n Type.String({ description: 'Present-continuous form for the spinner' }),\n ),\n }),\n // eslint-disable-next-line @typescript-eslint/require-await -- pi tool contract returns a Promise\n async execute(_id, args) {\n const id = `task-${store.size + 1}`;\n store.set(id, {\n content: args.content,\n status: 'pending',\n activeForm: args.activeForm,\n });\n syncToTui(store);\n return text(`Created ${id}`);\n },\n });\n\n const taskUpdate = defineTool({\n name: 'TaskUpdate',\n label: 'Update task',\n description:\n 'Update an existing task by id (status, content, or activeForm).',\n promptSnippet:\n 'TaskUpdate(taskId, status) — mark a todo in_progress/completed',\n parameters: Type.Object({\n taskId: Type.String(),\n status: Type.Optional(\n Type.Union([\n Type.Literal('pending'),\n Type.Literal('in_progress'),\n Type.Literal('completed'),\n ]),\n ),\n content: Type.Optional(Type.String()),\n activeForm: Type.Optional(Type.String()),\n }),\n // eslint-disable-next-line @typescript-eslint/require-await -- pi tool contract returns a Promise\n async execute(_id, args) {\n const existing = store.get(args.taskId);\n if (!existing) return text(`No such task: ${args.taskId}`);\n store.set(args.taskId, {\n content: args.content ?? existing.content,\n status: (args.status as TaskStatus) ?? existing.status,\n activeForm: args.activeForm ?? existing.activeForm,\n });\n syncToTui(store);\n return text(`Updated ${args.taskId}`);\n },\n });\n\n const taskGet = defineTool({\n name: 'TaskGet',\n label: 'Get task',\n description: 'Fetch a single task by id.',\n parameters: Type.Object({ taskId: Type.String() }),\n // eslint-disable-next-line @typescript-eslint/require-await -- pi tool contract returns a Promise\n async execute(_id, args) {\n const t = store.get(args.taskId);\n return text(\n t\n ? JSON.stringify({ id: args.taskId, ...t })\n : `No such task: ${args.taskId}`,\n );\n },\n });\n\n const taskList = defineTool({\n name: 'TaskList',\n label: 'List tasks',\n description: 'List all tasks in the shared todo list.',\n parameters: Type.Object({}),\n // eslint-disable-next-line @typescript-eslint/require-await -- pi tool contract returns a Promise\n async execute() {\n return text(\n JSON.stringify(\n Array.from(store.entries()).map(([id, t]) => ({ id, ...t })),\n ),\n );\n },\n });\n\n return { tools: [taskCreate, taskUpdate, taskGet, taskList], store };\n}\n"],"mappings":";;;;;;;;;;;AAqBA,SAAS,KAAK,GAGZ;AACA,QAAO;EAAE,SAAS,CAAC;GAAE,MAAM;GAAQ,MAAM;GAAG,CAAC;EAAE,SAAS,EAAE;EAAE;;AAG9D,SAAS,UAAU,OAAwB;AACzC,QAAO,CAAC,UACN,MAAM,KAAK,MAAM,QAAQ,CAAC,CAAC,KAAK,OAAO;EACrC,SAAS,EAAE;EACX,QAAQ,EAAE;EACV,YAAY,EAAE;EACf,EAAE,CACJ;;;AAIH,SAAgB,0BAGd;CACA,MAAM,wBAAmB,IAAI,KAAK;AA4FlC,QAAO;EAAE,OAAO;GA1FG,WAAW;IAC5B,MAAM;IACN,OAAO;IACP,aACE;IACF,eACE;IACF,YAAY,KAAK,OAAO;KACtB,SAAS,KAAK,OAAO,EAAE,aAAa,+BAA+B,CAAC;KACpE,YAAY,KAAK,SACf,KAAK,OAAO,EAAE,aAAa,2CAA2C,CAAC,CACxE;KACF,CAAC;IAEF,MAAM,QAAQ,KAAK,MAAM;KACvB,MAAM,KAAK,QAAQ,MAAM,OAAO;AAChC,WAAM,IAAI,IAAI;MACZ,SAAS,KAAK;MACd,QAAQ;MACR,YAAY,KAAK;MAClB,CAAC;AACF,eAAU,MAAM;AAChB,YAAO,KAAK,WAAW,KAAK;;IAE/B,CAAC;GAEiB,WAAW;IAC5B,MAAM;IACN,OAAO;IACP,aACE;IACF,eACE;IACF,YAAY,KAAK,OAAO;KACtB,QAAQ,KAAK,QAAQ;KACrB,QAAQ,KAAK,SACX,KAAK,MAAM;MACT,KAAK,QAAQ,UAAU;MACvB,KAAK,QAAQ,cAAc;MAC3B,KAAK,QAAQ,YAAY;MAC1B,CAAC,CACH;KACD,SAAS,KAAK,SAAS,KAAK,QAAQ,CAAC;KACrC,YAAY,KAAK,SAAS,KAAK,QAAQ,CAAC;KACzC,CAAC;IAEF,MAAM,QAAQ,KAAK,MAAM;KACvB,MAAM,WAAW,MAAM,IAAI,KAAK,OAAO;AACvC,SAAI,CAAC,SAAU,QAAO,KAAK,iBAAiB,KAAK,SAAS;AAC1D,WAAM,IAAI,KAAK,QAAQ;MACrB,SAAS,KAAK,WAAW,SAAS;MAClC,QAAS,KAAK,UAAyB,SAAS;MAChD,YAAY,KAAK,cAAc,SAAS;MACzC,CAAC;AACF,eAAU,MAAM;AAChB,YAAO,KAAK,WAAW,KAAK,SAAS;;IAExC,CAAC;GAEc,WAAW;IACzB,MAAM;IACN,OAAO;IACP,aAAa;IACb,YAAY,KAAK,OAAO,EAAE,QAAQ,KAAK,QAAQ,EAAE,CAAC;IAElD,MAAM,QAAQ,KAAK,MAAM;KACvB,MAAM,IAAI,MAAM,IAAI,KAAK,OAAO;AAChC,YAAO,KACL,IACI,KAAK,UAAU;MAAE,IAAI,KAAK;MAAQ,GAAG;MAAG,CAAC,GACzC,iBAAiB,KAAK,SAC3B;;IAEJ,CAAC;GAEe,WAAW;IAC1B,MAAM;IACN,OAAO;IACP,aAAa;IACb,YAAY,KAAK,OAAO,EAAE,CAAC;IAE3B,MAAM,UAAU;AACd,YAAO,KACL,KAAK,UACH,MAAM,KAAK,MAAM,SAAS,CAAC,CAAC,KAAK,CAAC,IAAI,QAAQ;MAAE;MAAI,GAAG;MAAG,EAAE,CAC7D,CACF;;IAEJ,CAAC;GAEyD;EAAE;EAAO"}
@@ -1,5 +1,5 @@
1
- import "./debug-CZwmzyDx.js";
2
- import { t as analytics } from "./analytics-Du8Z_3oX.js";
1
+ import "./debug-CaRHQrDY.js";
2
+ import { n as analytics } from "./analytics-Z_2kCTpB.js";
3
3
  import opn from "opn";
4
4
  //#region src/utils/links.ts
5
5
  /**
@@ -65,4 +65,4 @@ function updateProgress(step) {
65
65
  //#endregion
66
66
  export { withUtm as i, openTrackedLink as n, setEntryCommand as r, withProgress as t };
67
67
 
68
- //# sourceMappingURL=telemetry-DJNpvkYP.js.map
68
+ //# sourceMappingURL=telemetry-BJAHymMq.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"telemetry-DJNpvkYP.js","names":[],"sources":["../src/utils/links.ts","../src/telemetry.ts"],"sourcesContent":["/**\n * Outbound links: UTM tagging and tracked opens.\n *\n * Every URL the wizard sends a user to — auto-opened or printed in the TUI —\n * carries `utm_source=wizard`, `utm_medium=cli`, `utm_content=<which link>`.\n * The command dimension rides on every wizard event as the `command` tag.\n * Opening a link also captures a wizard event.\n */\nimport opn from 'opn';\nimport { NODE_ENV } from '@env';\nimport { analytics } from './analytics';\n\n/**\n * Record the CLI command this run was started with (e.g. `integrate`,\n * `slack`, `mcp-add`). Set once at dispatch; tagged onto every wizard\n * event so wizard-side events segment by command.\n */\nexport function setEntryCommand(command: string): void {\n analytics.setTag('command', command);\n}\n\n/**\n * Tag a URL with the wizard's UTM params. `content` names the specific link\n * (e.g. `oauth-signup`, `slack-connect-setup`). URLs that already carry a\n * utm_source — or don't parse — are returned untouched.\n */\nexport function withUtm(url: string, content: string): string {\n let parsed: URL;\n try {\n parsed = new URL(url);\n } catch {\n return url;\n }\n if (parsed.searchParams.has('utm_source')) return url;\n parsed.searchParams.set('utm_source', 'wizard');\n parsed.searchParams.set('utm_medium', 'cli');\n parsed.searchParams.set('utm_content', content);\n return parsed.toString();\n}\n\n/**\n * Open a URL in the user's browser, UTM-tagged (pass `skipUtm` for\n * destinations that aren't PostHog properties or are already final), and\n * capture the interaction. `auto` marks opens the wizard initiated itself,\n * as opposed to a user picking a link on screen. opn throws in headless\n * environments — the URL is always also printed on screen, so the failure\n * is swallowed.\n */\nexport function openTrackedLink(\n url: string,\n content: string,\n opts?: { auto?: boolean; skipUtm?: boolean },\n): void {\n const finalUrl = opts?.skipUtm ? url : withUtm(url, content);\n analytics.wizardCapture('link opened', {\n content,\n url: finalUrl,\n auto: opts?.auto ?? false,\n });\n if (NODE_ENV !== 'test') {\n opn(finalUrl, { wait: false }).catch(() => {\n // No browser available — the printed URL is the fallback.\n });\n }\n}\n","import { analytics } from '@utils/analytics';\n\nexport function withProgress<T>(step: string, callback: () => T): T {\n updateProgress(step);\n return callback();\n}\n\nexport function updateProgress(step: string) {\n analytics.setTag('progress', step);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;AAiBA,SAAgB,gBAAgB,SAAuB;AACrD,WAAU,OAAO,WAAW,QAAQ;;;;;;;AAQtC,SAAgB,QAAQ,KAAa,SAAyB;CAC5D,IAAI;AACJ,KAAI;AACF,WAAS,IAAI,IAAI,IAAI;SACf;AACN,SAAO;;AAET,KAAI,OAAO,aAAa,IAAI,aAAa,CAAE,QAAO;AAClD,QAAO,aAAa,IAAI,cAAc,SAAS;AAC/C,QAAO,aAAa,IAAI,cAAc,MAAM;AAC5C,QAAO,aAAa,IAAI,eAAe,QAAQ;AAC/C,QAAO,OAAO,UAAU;;;;;;;;;;AAW1B,SAAgB,gBACd,KACA,SACA,MACM;CACN,MAAM,WAAW,MAAM,UAAU,MAAM,QAAQ,KAAK,QAAQ;AAC5D,WAAU,cAAc,eAAe;EACrC;EACA,KAAK;EACL,MAAM,MAAM,QAAQ;EACrB,CAAC;AAEA,KAAI,UAAU,EAAE,MAAM,OAAO,CAAC,CAAC,YAAY,GAEzC;;;;AC5DN,SAAgB,aAAgB,MAAc,UAAsB;AAClE,gBAAe,KAAK;AACpB,QAAO,UAAU;;AAGnB,SAAgB,eAAe,MAAc;AAC3C,WAAU,OAAO,YAAY,KAAK"}
1
+ {"version":3,"file":"telemetry-BJAHymMq.js","names":[],"sources":["../src/utils/links.ts","../src/telemetry.ts"],"sourcesContent":["/**\n * Outbound links: UTM tagging and tracked opens.\n *\n * Every URL the wizard sends a user to — auto-opened or printed in the TUI —\n * carries `utm_source=wizard`, `utm_medium=cli`, `utm_content=<which link>`.\n * The command dimension rides on every wizard event as the `command` tag.\n * Opening a link also captures a wizard event.\n */\nimport opn from 'opn';\nimport { NODE_ENV } from '@env';\nimport { analytics } from './analytics';\n\n/**\n * Record the CLI command this run was started with (e.g. `integrate`,\n * `slack`, `mcp-add`). Set once at dispatch; tagged onto every wizard\n * event so wizard-side events segment by command.\n */\nexport function setEntryCommand(command: string): void {\n analytics.setTag('command', command);\n}\n\n/**\n * Tag a URL with the wizard's UTM params. `content` names the specific link\n * (e.g. `oauth-signup`, `slack-connect-setup`). URLs that already carry a\n * utm_source — or don't parse — are returned untouched.\n */\nexport function withUtm(url: string, content: string): string {\n let parsed: URL;\n try {\n parsed = new URL(url);\n } catch {\n return url;\n }\n if (parsed.searchParams.has('utm_source')) return url;\n parsed.searchParams.set('utm_source', 'wizard');\n parsed.searchParams.set('utm_medium', 'cli');\n parsed.searchParams.set('utm_content', content);\n return parsed.toString();\n}\n\n/**\n * Open a URL in the user's browser, UTM-tagged (pass `skipUtm` for\n * destinations that aren't PostHog properties or are already final), and\n * capture the interaction. `auto` marks opens the wizard initiated itself,\n * as opposed to a user picking a link on screen. opn throws in headless\n * environments — the URL is always also printed on screen, so the failure\n * is swallowed.\n */\nexport function openTrackedLink(\n url: string,\n content: string,\n opts?: { auto?: boolean; skipUtm?: boolean },\n): void {\n const finalUrl = opts?.skipUtm ? url : withUtm(url, content);\n analytics.wizardCapture('link opened', {\n content,\n url: finalUrl,\n auto: opts?.auto ?? false,\n });\n if (NODE_ENV !== 'test') {\n opn(finalUrl, { wait: false }).catch(() => {\n // No browser available — the printed URL is the fallback.\n });\n }\n}\n","import { analytics } from '@utils/analytics';\n\nexport function withProgress<T>(step: string, callback: () => T): T {\n updateProgress(step);\n return callback();\n}\n\nexport function updateProgress(step: string) {\n analytics.setTag('progress', step);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;AAiBA,SAAgB,gBAAgB,SAAuB;AACrD,WAAU,OAAO,WAAW,QAAQ;;;;;;;AAQtC,SAAgB,QAAQ,KAAa,SAAyB;CAC5D,IAAI;AACJ,KAAI;AACF,WAAS,IAAI,IAAI,IAAI;SACf;AACN,SAAO;;AAET,KAAI,OAAO,aAAa,IAAI,aAAa,CAAE,QAAO;AAClD,QAAO,aAAa,IAAI,cAAc,SAAS;AAC/C,QAAO,aAAa,IAAI,cAAc,MAAM;AAC5C,QAAO,aAAa,IAAI,eAAe,QAAQ;AAC/C,QAAO,OAAO,UAAU;;;;;;;;;;AAW1B,SAAgB,gBACd,KACA,SACA,MACM;CACN,MAAM,WAAW,MAAM,UAAU,MAAM,QAAQ,KAAK,QAAQ;AAC5D,WAAU,cAAc,eAAe;EACrC;EACA,KAAK;EACL,MAAM,MAAM,QAAQ;EACrB,CAAC;AAEA,KAAI,UAAU,EAAE,MAAM,OAAO,CAAC,CAAC,YAAY,GAEzC;;;;AC5DN,SAAgB,aAAgB,MAAc,UAAsB;AAClE,gBAAe,KAAK;AACpB,QAAO,UAAU;;AAGnB,SAAgB,eAAe,MAAc;AAC3C,WAAU,OAAO,YAAY,KAAK"}