@posthog/wizard 2.44.0 → 2.45.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 (114) hide show
  1. package/dist/{add-mcp-server-to-clients-D5qsqCkj.js → add-mcp-server-to-clients-CNzZMSat.js} +5 -5
  2. package/dist/{add-mcp-server-to-clients-D5qsqCkj.js.map → add-mcp-server-to-clients-CNzZMSat.js.map} +1 -1
  3. package/dist/{agent-interface-BvTxWiol.js → agent-interface-CF7GsdFf.js} +297 -157
  4. package/dist/agent-interface-CF7GsdFf.js.map +1 -0
  5. package/dist/{agent-runner-BF6_f8Qh.js → agent-runner-B0LTVFfw.js} +130 -598
  6. package/dist/agent-runner-B0LTVFfw.js.map +1 -0
  7. package/dist/{analytics-DSlQuwOT.js → analytics-DQEuL6qS.js} +2 -2
  8. package/dist/{analytics-DSlQuwOT.js.map → analytics-DQEuL6qS.js.map} +1 -1
  9. package/dist/analytics-YD3D38z2.js +2 -0
  10. package/dist/{api-BXduJZrw.js → api-uCMvDII5.js} +3 -3
  11. package/dist/{api-BXduJZrw.js.map → api-uCMvDII5.js.map} +1 -1
  12. package/dist/bin.js +57 -101
  13. package/dist/bin.js.map +1 -1
  14. package/dist/{ci-install-GirEJqu2.js → ci-install-Bow8-f0j.js} +4 -4
  15. package/dist/{ci-install-GirEJqu2.js.map → ci-install-Bow8-f0j.js.map} +1 -1
  16. package/dist/commandments-CyB7Icr1.js +42 -0
  17. package/dist/commandments-CyB7Icr1.js.map +1 -0
  18. package/dist/commandments-DguPfCX8.js +2 -0
  19. package/dist/{debug-BOFxiVVs.js → debug-BixHZmHv.js} +1 -1
  20. package/dist/{debug-DXfQFmcM.js → debug-DBmxx59Q.js} +21 -5
  21. package/dist/debug-DBmxx59Q.js.map +1 -0
  22. package/dist/{defaults-BWLIffh5.js → defaults-8zjNjGGi.js} +1 -1
  23. package/dist/{defaults-BWLIffh5.js.map → defaults-8zjNjGGi.js.map} +1 -1
  24. package/dist/{env-api-key-cjD4yfGT.js → env-api-key-AcC_tz8G.js} +1 -1
  25. package/dist/{env-api-key-cjD4yfGT.js.map → env-api-key-AcC_tz8G.js.map} +1 -1
  26. package/dist/{environment-F1yw21dG.js → environment-kZtkp7eG.js} +3 -3
  27. package/dist/{environment-F1yw21dG.js.map → environment-kZtkp7eG.js.map} +1 -1
  28. package/dist/{file-utils-D-7YfJ7A.js → file-utils-BAhYy5vC.js} +2 -2
  29. package/dist/{file-utils-D-7YfJ7A.js.map → file-utils-BAhYy5vC.js.map} +1 -1
  30. package/dist/file-watcher-BL-IRbR7.js +123 -0
  31. package/dist/file-watcher-BL-IRbR7.js.map +1 -0
  32. package/dist/{headless-ui-Dni0gPND.js → headless-ui-DWmMyhaP.js} +5 -4
  33. package/dist/headless-ui-DWmMyhaP.js.map +1 -0
  34. package/dist/{interactive-Bmi82rsO.js → interactive-Cyic0bGL.js} +2 -2
  35. package/dist/{interactive-Bmi82rsO.js.map → interactive-Cyic0bGL.js.map} +1 -1
  36. package/dist/{mcp-xKRDnrcq.js → mcp-BSGmEWjt.js} +3 -3
  37. package/dist/mcp-BSGmEWjt.js.map +1 -0
  38. package/dist/{mcp-prompt-streaming-AtntLsJ8.js → mcp-prompt-streaming-C227vG1X.js} +3 -3
  39. package/dist/{mcp-prompt-streaming-AtntLsJ8.js.map → mcp-prompt-streaming-C227vG1X.js.map} +1 -1
  40. package/dist/{non-interactive-BIHqcW8g.js → non-interactive-DQA9vn9f.js} +2 -2
  41. package/dist/{non-interactive-BIHqcW8g.js.map → non-interactive-DQA9vn9f.js.map} +1 -1
  42. package/dist/orchestrator-tools-NuWONNkF.js +99 -0
  43. package/dist/orchestrator-tools-NuWONNkF.js.map +1 -0
  44. package/dist/{package-json-CDs1ZVKu.js → package-json-DCuoye-H.js} +1 -1
  45. package/dist/{package-json-CDs1ZVKu.js.map → package-json-DCuoye-H.js.map} +1 -1
  46. package/dist/{package-manager-C6R_zpML.js → package-manager-DKtR3xzM.js} +2 -2
  47. package/dist/{package-manager-C6R_zpML.js.map → package-manager-DKtR3xzM.js.map} +1 -1
  48. package/dist/pi-DJCln9jJ.js +603 -0
  49. package/dist/pi-DJCln9jJ.js.map +1 -0
  50. package/dist/{playground-DwL36I2u.js → playground-CbEndzc8.js} +7 -8
  51. package/dist/{playground-DwL36I2u.js.map → playground-CbEndzc8.js.map} +1 -1
  52. package/dist/{posthog-DwKlq0HM.js → posthog-DFyux4Vw.js} +1 -1
  53. package/dist/{posthog-DwKlq0HM.js.map → posthog-DFyux4Vw.js.map} +1 -1
  54. package/dist/{posthog-integration-BhLKCFsI.js → posthog-integration-dmWJZ8mj.js} +131 -26
  55. package/dist/posthog-integration-dmWJZ8mj.js.map +1 -0
  56. package/dist/{provisioning-jVZm2E-A.js → provisioning-CcxCry5p.js} +3 -3
  57. package/dist/{provisioning-jVZm2E-A.js.map → provisioning-CcxCry5p.js.map} +1 -1
  58. package/dist/queue-tools-Bw-AANLM.js +366 -0
  59. package/dist/queue-tools-Bw-AANLM.js.map +1 -0
  60. package/dist/{registry-DcoBCMQR.js → registry-D2V88NoC.js} +96 -18
  61. package/dist/registry-D2V88NoC.js.map +1 -0
  62. package/dist/{security-jxjVsOpd.js → security-DOtBCBvx.js} +4 -4
  63. package/dist/{security-jxjVsOpd.js.map → security-DOtBCBvx.js.map} +1 -1
  64. package/dist/{setup-utils-BQCl28D8.js → setup-utils-Qp-u6BZk.js} +7 -7
  65. package/dist/{setup-utils-BQCl28D8.js.map → setup-utils-Qp-u6BZk.js.map} +1 -1
  66. package/dist/{start-tui-DgSKFMVh.js → start-tui-DHa_9aiB.js} +19 -80
  67. package/dist/start-tui-DHa_9aiB.js.map +1 -0
  68. package/dist/{steps-erepgD0V.js → steps-D07HUQyE.js} +7 -7
  69. package/dist/{steps-erepgD0V.js.map → steps-D07HUQyE.js.map} +1 -1
  70. package/dist/{store-C79GoHCQ.js → store-DSwsITKX.js} +5 -6
  71. package/dist/store-DSwsITKX.js.map +1 -0
  72. package/dist/{subagent-aDlD_Ltz.js → subagent-Dk4K5MDa.js} +2 -2
  73. package/dist/{subagent-aDlD_Ltz.js.map → subagent-Dk4K5MDa.js.map} +1 -1
  74. package/dist/task-CQnV9Qd2.js +305 -0
  75. package/dist/task-CQnV9Qd2.js.map +1 -0
  76. package/dist/{task-stream-0Pk0tPBN.js → task-stream-B7qia9eW.js} +72 -7
  77. package/dist/task-stream-B7qia9eW.js.map +1 -0
  78. package/dist/{tasks-ZkrluXCa.js → tasks-C7BQp659.js} +2 -2
  79. package/dist/{tasks-ZkrluXCa.js.map → tasks-C7BQp659.js.map} +1 -1
  80. package/dist/{telemetry-DZShaH-y.js → telemetry-DgahJGSx.js} +3 -3
  81. package/dist/{telemetry-DZShaH-y.js.map → telemetry-DgahJGSx.js.map} +1 -1
  82. package/dist/{terminal-CEhufbJ4.js → terminal-Bb6tZkf-.js} +13 -13
  83. package/dist/{terminal-CEhufbJ4.js.map → terminal-Bb6tZkf-.js.map} +1 -1
  84. package/dist/{tools-BIPMan6l.js → tools-BJEvSUWN.js} +4 -4
  85. package/dist/{tools-BIPMan6l.js.map → tools-BJEvSUWN.js.map} +1 -1
  86. package/dist/{types-y3HkjtSq.js → types-BRe_EzTW.js} +1 -1
  87. package/dist/{types-y3HkjtSq.js.map → types-BRe_EzTW.js.map} +1 -1
  88. package/dist/{wizard-abort-C14PzXZ8.js → wizard-abort-BxtdkgI-.js} +4 -4
  89. package/dist/{wizard-abort-C14PzXZ8.js.map → wizard-abort-BxtdkgI-.js.map} +1 -1
  90. package/dist/{wizard-abort-UCm4Pd5m.js → wizard-abort-DpDmuCfA.js} +1 -1
  91. package/dist/{wizard-session-C5lZPPEc.js → wizard-session-DWHe83uk.js} +1 -1
  92. package/dist/{wizard-session-BAZql11N.js → wizard-session-tp4Zdbwl.js} +1 -1
  93. package/dist/{wizard-session-BAZql11N.js.map → wizard-session-tp4Zdbwl.js.map} +1 -1
  94. package/dist/{wizard-tools-B7SLjCic.js → wizard-tools-Dg8o2lcH.js} +64 -387
  95. package/dist/wizard-tools-Dg8o2lcH.js.map +1 -0
  96. package/dist/yara-hooks-CncaWRuC.js +2 -0
  97. package/dist/{yara-hooks-CPH8N4yz.js → yara-hooks-pw86rZ8y.js} +4 -4
  98. package/dist/{yara-hooks-CPH8N4yz.js.map → yara-hooks-pw86rZ8y.js.map} +1 -1
  99. package/package.json +1 -1
  100. package/dist/agent-interface-BvTxWiol.js.map +0 -1
  101. package/dist/agent-runner-BF6_f8Qh.js.map +0 -1
  102. package/dist/analytics-C7Xx6csw.js +0 -2
  103. package/dist/debug-DXfQFmcM.js.map +0 -1
  104. package/dist/headless-ui-Dni0gPND.js.map +0 -1
  105. package/dist/mcp-xKRDnrcq.js.map +0 -1
  106. package/dist/posthog-integration-BhLKCFsI.js.map +0 -1
  107. package/dist/registry-DcoBCMQR.js.map +0 -1
  108. package/dist/start-tui-DgSKFMVh.js.map +0 -1
  109. package/dist/store-C79GoHCQ.js.map +0 -1
  110. package/dist/task-stream-0Pk0tPBN.js.map +0 -1
  111. package/dist/wizard-tools-B7SLjCic.js.map +0 -1
  112. package/dist/wizard-ui-WZ48rUgr.js +0 -15
  113. package/dist/wizard-ui-WZ48rUgr.js.map +0 -1
  114. package/dist/yara-hooks-VZlj4Lib.js +0 -2
@@ -1,6 +1,6 @@
1
1
  import { t as __exportAll } from "./rolldown-runtime-B_-DWIq7.js";
2
- import { dt as WIZARD_USER_AGENT } from "./debug-DXfQFmcM.js";
3
- import { n as analytics } from "./analytics-DSlQuwOT.js";
2
+ import { ht as WIZARD_USER_AGENT } from "./debug-DBmxx59Q.js";
3
+ import { n as analytics } from "./analytics-DQEuL6qS.js";
4
4
  import axios from "axios";
5
5
  import { z } from "zod";
6
6
  //#region src/lib/api.ts
@@ -170,4 +170,4 @@ function handleApiError(error, operation) {
170
170
  //#endregion
171
171
  export { fetchUserData as a, fetchSlackConnected as i, api_exports as n, handleApiError as o, fetchProjectData as r, ApiError as t };
172
172
 
173
- //# sourceMappingURL=api-BXduJZrw.js.map
173
+ //# sourceMappingURL=api-uCMvDII5.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"api-BXduJZrw.js","names":[],"sources":["../src/lib/api.ts"],"sourcesContent":["import axios, { AxiosError } from 'axios';\nimport { z } from 'zod';\nimport { analytics } from '@utils/analytics';\nimport { WIZARD_USER_AGENT } from './constants';\n\n/**\n * User payload from `/api/users/@me/`. Schema typed for the fields the\n * wizard actually reads + passthrough on everything else so the full\n * upstream response rides through to the session for downstream features\n * (account-aware copy, plan-gated flows, org/team metadata, etc.).\n *\n * Top-level uses `.passthrough()` so unknown fields aren't stripped;\n * the few nested objects we care about (team, organization,\n * organizations[]) do the same so their additional fields survive too.\n *\n * Keep `distinct_id` required — analytics depends on it. Everything\n * else added here is nullish so partial responses don't fail parsing.\n */\nexport const ApiUserSchema = z\n .object({\n // Identifiers\n distinct_id: z.string(),\n uuid: z.string().nullish(),\n id: z.number().nullish(),\n\n // Profile\n email: z.string().nullish(),\n first_name: z.string().nullish(),\n last_name: z.string().nullish(),\n date_joined: z.string().nullish(),\n is_email_verified: z.boolean().nullish(),\n is_2fa_enabled: z.boolean().nullish(),\n is_staff: z.boolean().nullish(),\n\n // Preferences\n theme_mode: z.string().nullish(),\n toolbar_mode: z.string().nullish(),\n hide_mcp_hints: z.boolean().nullish(),\n\n // Optional / nullable on the backend — pre-onboarding signup paths\n // return null and older accounts may not have it set. Treat as a\n // hint, never a guarantee.\n role_at_organization: z.string().nullish(),\n\n // Current team + organization (objects from the API, kept typed on\n // the fields the wizard uses; passthrough preserves the rest).\n team: z\n .object({\n id: z.number(),\n uuid: z.string().nullish(),\n organization: z.string().uuid(),\n api_token: z.string().nullish(),\n project_id: z.number().nullish(),\n name: z.string().nullish(),\n timezone: z.string().nullish(),\n })\n .passthrough(),\n organization: z\n .object({\n id: z.string().uuid(),\n name: z.string().nullish(),\n slug: z.string().nullish(),\n membership_level: z.number().nullish(),\n customer_id: z.string().nullish(),\n // Org-level AI consent gate. Signals drops all findings while\n // this is not true. Null on older orgs (pre-2026-05 default\n // flip) — treat null as \"unknown\", not \"off\".\n is_ai_data_processing_approved: z.boolean().nullish(),\n })\n .passthrough(),\n organizations: z.array(\n z\n .object({\n id: z.string().uuid(),\n name: z.string().nullish(),\n membership_level: z.number().nullish(),\n })\n .passthrough(),\n ),\n })\n .passthrough();\n\n/**\n * Single activity log entry the wizard cares about. The PostHog endpoint\n * returns much more — schema kept minimal so changes upstream don't break us.\n *\n * @unused — no current caller after the Phase 6 streaming-agent pivot\n * dropped activity_log polling. Deliberately retained: this is a thin,\n * well-typed wrapper around a stable PostHog endpoint, and we're likely\n * to want it again for a future feature (e.g. \"what changed in your\n * project recently\"). Re-deriving the schema is more work than letting\n * it sit dormant.\n */\nexport const ActivityLogEntrySchema = z\n .object({\n scope: z.string().nullish(),\n activity: z.string().nullish(),\n created_at: z.string().nullish(),\n })\n .passthrough();\n\n/** @unused — see ActivityLogEntrySchema. */\nexport const ActivityLogResponseSchema = z.object({\n results: z.array(ActivityLogEntrySchema),\n});\n\n/** @unused — see ActivityLogEntrySchema. */\nexport type ActivityLogEntry = z.infer<typeof ActivityLogEntrySchema>;\n\nexport const ApiProjectSchema = z.object({\n id: z.number(),\n uuid: z.string().uuid(),\n organization: z.string().uuid(),\n api_token: z.string(),\n name: z.string(),\n // Product opt-ins (TeamSerializer-compat fields on /api/projects/:id).\n // Project-level truth for \"is this product enabled\" — a product can be\n // instrumented from another repo or the snippet, so these settings\n // override repo-local evidence. Null/absent = unknown. Only the\n // opt-ins a signals decision consumes: replay + exception autocapture\n // feed signal-source choices; surveys feeds the surveys-scout tuning.\n session_recording_opt_in: z.boolean().nullish(),\n autocapture_exceptions_opt_in: z.boolean().nullish(),\n surveys_opt_in: z.boolean().nullish(),\n});\n\nexport type ApiUser = z.infer<typeof ApiUserSchema>;\nexport type ApiProject = z.infer<typeof ApiProjectSchema>;\n\nexport class ApiError extends Error {\n constructor(\n message: string,\n public readonly statusCode?: number,\n public readonly endpoint?: string,\n ) {\n super(message);\n this.name = 'ApiError';\n }\n}\n\nexport async function fetchUserData(\n accessToken: string,\n baseUrl: string,\n): Promise<ApiUser> {\n try {\n const response = await axios.get(`${baseUrl}/api/users/@me/`, {\n headers: {\n Authorization: `Bearer ${accessToken}`,\n 'User-Agent': WIZARD_USER_AGENT,\n },\n });\n\n return ApiUserSchema.parse(response.data);\n } catch (error) {\n const apiError = handleApiError(error, 'fetch user data');\n analytics.captureException(apiError, {\n endpoint: '/api/users/@me/',\n baseUrl,\n });\n throw apiError;\n }\n}\n\n/**\n * Best-effort fetch of recent activity log entries. Returns [] on any error\n * so callers can treat absence of results as \"haven't detected anything yet\"\n * rather than a hard failure.\n *\n * @unused — no current caller after the Phase 6 streaming-agent pivot\n * dropped activity_log polling from McpSuggestedPromptsScreen.\n * Deliberately retained for future features that want a soft signal of\n * recent project changes (e.g. dashboards, audit summaries). See the\n * ActivityLogEntrySchema doc comment for the keep-vs-delete rationale.\n */\nexport async function fetchRecentActivity(\n accessToken: string,\n projectId: number,\n baseUrl: string,\n since: Date,\n): Promise<ActivityLogEntry[]> {\n try {\n const response = await axios.get(\n `${baseUrl}/api/projects/${projectId}/activity_log/`,\n {\n params: { limit: 10 },\n headers: {\n Authorization: `Bearer ${accessToken}`,\n 'User-Agent': WIZARD_USER_AGENT,\n },\n // Short timeout — best-effort probe, not a critical path.\n timeout: 4000,\n },\n );\n const parsed = ActivityLogResponseSchema.safeParse(response.data);\n if (!parsed.success) return [];\n const sinceMs = since.getTime();\n return parsed.data.results.filter((entry) => {\n if (!entry.created_at) return false;\n const t = Date.parse(entry.created_at);\n return Number.isFinite(t) && t >= sinceMs;\n });\n } catch {\n return [];\n }\n}\n\nexport async function fetchProjectData(\n accessToken: string,\n projectId: number,\n baseUrl: string,\n): Promise<ApiProject> {\n try {\n const response = await axios.get(`${baseUrl}/api/projects/${projectId}/`, {\n headers: {\n Authorization: `Bearer ${accessToken}`,\n 'User-Agent': WIZARD_USER_AGENT,\n },\n });\n\n return ApiProjectSchema.parse(response.data);\n } catch (error) {\n const apiError = handleApiError(error, 'fetch project data');\n analytics.captureException(apiError, {\n endpoint: `/api/projects/${projectId}/`,\n baseUrl,\n projectId,\n });\n throw apiError;\n }\n}\n\n/** Minimal shape of `/api/projects/:id/integrations/` — we only read `kind`. */\nconst IntegrationsResponseSchema = z.object({\n results: z.array(z.object({ kind: z.string().nullish() }).passthrough()),\n});\n\n/**\n * Check whether the project already has a Slack integration connected.\n * Requires the `integration:read` scope. Throws on failure — callers\n * (including the SlackConnectScreen poll) decide how to degrade and\n * are responsible for capturing the error exactly once.\n */\nexport async function fetchSlackConnected(\n accessToken: string,\n projectId: number,\n baseUrl: string,\n signal?: AbortSignal,\n): Promise<boolean> {\n const response = await axios.get(\n `${baseUrl}/api/projects/${projectId}/integrations/`,\n {\n headers: {\n Authorization: `Bearer ${accessToken}`,\n 'User-Agent': WIZARD_USER_AGENT,\n },\n signal,\n },\n );\n const parsed = IntegrationsResponseSchema.safeParse(response.data);\n if (!parsed.success) return false;\n return parsed.data.results.some((i) => i.kind === 'slack');\n}\n\nexport function handleApiError(error: unknown, operation: string): ApiError {\n if (axios.isAxiosError(error)) {\n const axiosError = error as AxiosError<{ detail?: string }>;\n const status = axiosError.response?.status;\n const detail = axiosError.response?.data?.detail;\n const endpoint = axiosError.config?.url;\n\n if (status === 401) {\n return new ApiError(\n `Authentication failed while trying to ${operation}`,\n status,\n endpoint,\n );\n }\n\n if (status === 403) {\n return new ApiError(\n `Access denied while trying to ${operation}`,\n status,\n endpoint,\n );\n }\n\n if (status === 404) {\n return new ApiError(\n `Resource not found while trying to ${operation}`,\n status,\n endpoint,\n );\n }\n\n const message = detail || `Failed to ${operation}`;\n return new ApiError(message, status, endpoint);\n }\n\n if (error instanceof z.ZodError) {\n return new ApiError(`Invalid response format while trying to ${operation}`);\n }\n\n return new ApiError(\n `Unexpected error while trying to ${operation}: ${\n error instanceof Error ? error.message : 'Unknown error'\n }`,\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"api-uCMvDII5.js","names":[],"sources":["../src/lib/api.ts"],"sourcesContent":["import axios, { AxiosError } from 'axios';\nimport { z } from 'zod';\nimport { analytics } from '@utils/analytics';\nimport { WIZARD_USER_AGENT } from './constants';\n\n/**\n * User payload from `/api/users/@me/`. Schema typed for the fields the\n * wizard actually reads + passthrough on everything else so the full\n * upstream response rides through to the session for downstream features\n * (account-aware copy, plan-gated flows, org/team metadata, etc.).\n *\n * Top-level uses `.passthrough()` so unknown fields aren't stripped;\n * the few nested objects we care about (team, organization,\n * organizations[]) do the same so their additional fields survive too.\n *\n * Keep `distinct_id` required — analytics depends on it. Everything\n * else added here is nullish so partial responses don't fail parsing.\n */\nexport const ApiUserSchema = z\n .object({\n // Identifiers\n distinct_id: z.string(),\n uuid: z.string().nullish(),\n id: z.number().nullish(),\n\n // Profile\n email: z.string().nullish(),\n first_name: z.string().nullish(),\n last_name: z.string().nullish(),\n date_joined: z.string().nullish(),\n is_email_verified: z.boolean().nullish(),\n is_2fa_enabled: z.boolean().nullish(),\n is_staff: z.boolean().nullish(),\n\n // Preferences\n theme_mode: z.string().nullish(),\n toolbar_mode: z.string().nullish(),\n hide_mcp_hints: z.boolean().nullish(),\n\n // Optional / nullable on the backend — pre-onboarding signup paths\n // return null and older accounts may not have it set. Treat as a\n // hint, never a guarantee.\n role_at_organization: z.string().nullish(),\n\n // Current team + organization (objects from the API, kept typed on\n // the fields the wizard uses; passthrough preserves the rest).\n team: z\n .object({\n id: z.number(),\n uuid: z.string().nullish(),\n organization: z.string().uuid(),\n api_token: z.string().nullish(),\n project_id: z.number().nullish(),\n name: z.string().nullish(),\n timezone: z.string().nullish(),\n })\n .passthrough(),\n organization: z\n .object({\n id: z.string().uuid(),\n name: z.string().nullish(),\n slug: z.string().nullish(),\n membership_level: z.number().nullish(),\n customer_id: z.string().nullish(),\n // Org-level AI consent gate. Signals drops all findings while\n // this is not true. Null on older orgs (pre-2026-05 default\n // flip) — treat null as \"unknown\", not \"off\".\n is_ai_data_processing_approved: z.boolean().nullish(),\n })\n .passthrough(),\n organizations: z.array(\n z\n .object({\n id: z.string().uuid(),\n name: z.string().nullish(),\n membership_level: z.number().nullish(),\n })\n .passthrough(),\n ),\n })\n .passthrough();\n\n/**\n * Single activity log entry the wizard cares about. The PostHog endpoint\n * returns much more — schema kept minimal so changes upstream don't break us.\n *\n * @unused — no current caller after the Phase 6 streaming-agent pivot\n * dropped activity_log polling. Deliberately retained: this is a thin,\n * well-typed wrapper around a stable PostHog endpoint, and we're likely\n * to want it again for a future feature (e.g. \"what changed in your\n * project recently\"). Re-deriving the schema is more work than letting\n * it sit dormant.\n */\nexport const ActivityLogEntrySchema = z\n .object({\n scope: z.string().nullish(),\n activity: z.string().nullish(),\n created_at: z.string().nullish(),\n })\n .passthrough();\n\n/** @unused — see ActivityLogEntrySchema. */\nexport const ActivityLogResponseSchema = z.object({\n results: z.array(ActivityLogEntrySchema),\n});\n\n/** @unused — see ActivityLogEntrySchema. */\nexport type ActivityLogEntry = z.infer<typeof ActivityLogEntrySchema>;\n\nexport const ApiProjectSchema = z.object({\n id: z.number(),\n uuid: z.string().uuid(),\n organization: z.string().uuid(),\n api_token: z.string(),\n name: z.string(),\n // Product opt-ins (TeamSerializer-compat fields on /api/projects/:id).\n // Project-level truth for \"is this product enabled\" — a product can be\n // instrumented from another repo or the snippet, so these settings\n // override repo-local evidence. Null/absent = unknown. Only the\n // opt-ins a signals decision consumes: replay + exception autocapture\n // feed signal-source choices; surveys feeds the surveys-scout tuning.\n session_recording_opt_in: z.boolean().nullish(),\n autocapture_exceptions_opt_in: z.boolean().nullish(),\n surveys_opt_in: z.boolean().nullish(),\n});\n\nexport type ApiUser = z.infer<typeof ApiUserSchema>;\nexport type ApiProject = z.infer<typeof ApiProjectSchema>;\n\nexport class ApiError extends Error {\n constructor(\n message: string,\n public readonly statusCode?: number,\n public readonly endpoint?: string,\n ) {\n super(message);\n this.name = 'ApiError';\n }\n}\n\nexport async function fetchUserData(\n accessToken: string,\n baseUrl: string,\n): Promise<ApiUser> {\n try {\n const response = await axios.get(`${baseUrl}/api/users/@me/`, {\n headers: {\n Authorization: `Bearer ${accessToken}`,\n 'User-Agent': WIZARD_USER_AGENT,\n },\n });\n\n return ApiUserSchema.parse(response.data);\n } catch (error) {\n const apiError = handleApiError(error, 'fetch user data');\n analytics.captureException(apiError, {\n endpoint: '/api/users/@me/',\n baseUrl,\n });\n throw apiError;\n }\n}\n\n/**\n * Best-effort fetch of recent activity log entries. Returns [] on any error\n * so callers can treat absence of results as \"haven't detected anything yet\"\n * rather than a hard failure.\n *\n * @unused — no current caller after the Phase 6 streaming-agent pivot\n * dropped activity_log polling from McpSuggestedPromptsScreen.\n * Deliberately retained for future features that want a soft signal of\n * recent project changes (e.g. dashboards, audit summaries). See the\n * ActivityLogEntrySchema doc comment for the keep-vs-delete rationale.\n */\nexport async function fetchRecentActivity(\n accessToken: string,\n projectId: number,\n baseUrl: string,\n since: Date,\n): Promise<ActivityLogEntry[]> {\n try {\n const response = await axios.get(\n `${baseUrl}/api/projects/${projectId}/activity_log/`,\n {\n params: { limit: 10 },\n headers: {\n Authorization: `Bearer ${accessToken}`,\n 'User-Agent': WIZARD_USER_AGENT,\n },\n // Short timeout — best-effort probe, not a critical path.\n timeout: 4000,\n },\n );\n const parsed = ActivityLogResponseSchema.safeParse(response.data);\n if (!parsed.success) return [];\n const sinceMs = since.getTime();\n return parsed.data.results.filter((entry) => {\n if (!entry.created_at) return false;\n const t = Date.parse(entry.created_at);\n return Number.isFinite(t) && t >= sinceMs;\n });\n } catch {\n return [];\n }\n}\n\nexport async function fetchProjectData(\n accessToken: string,\n projectId: number,\n baseUrl: string,\n): Promise<ApiProject> {\n try {\n const response = await axios.get(`${baseUrl}/api/projects/${projectId}/`, {\n headers: {\n Authorization: `Bearer ${accessToken}`,\n 'User-Agent': WIZARD_USER_AGENT,\n },\n });\n\n return ApiProjectSchema.parse(response.data);\n } catch (error) {\n const apiError = handleApiError(error, 'fetch project data');\n analytics.captureException(apiError, {\n endpoint: `/api/projects/${projectId}/`,\n baseUrl,\n projectId,\n });\n throw apiError;\n }\n}\n\n/** Minimal shape of `/api/projects/:id/integrations/` — we only read `kind`. */\nconst IntegrationsResponseSchema = z.object({\n results: z.array(z.object({ kind: z.string().nullish() }).passthrough()),\n});\n\n/**\n * Check whether the project already has a Slack integration connected.\n * Requires the `integration:read` scope. Throws on failure — callers\n * (including the SlackConnectScreen poll) decide how to degrade and\n * are responsible for capturing the error exactly once.\n */\nexport async function fetchSlackConnected(\n accessToken: string,\n projectId: number,\n baseUrl: string,\n signal?: AbortSignal,\n): Promise<boolean> {\n const response = await axios.get(\n `${baseUrl}/api/projects/${projectId}/integrations/`,\n {\n headers: {\n Authorization: `Bearer ${accessToken}`,\n 'User-Agent': WIZARD_USER_AGENT,\n },\n signal,\n },\n );\n const parsed = IntegrationsResponseSchema.safeParse(response.data);\n if (!parsed.success) return false;\n return parsed.data.results.some((i) => i.kind === 'slack');\n}\n\nexport function handleApiError(error: unknown, operation: string): ApiError {\n if (axios.isAxiosError(error)) {\n const axiosError = error as AxiosError<{ detail?: string }>;\n const status = axiosError.response?.status;\n const detail = axiosError.response?.data?.detail;\n const endpoint = axiosError.config?.url;\n\n if (status === 401) {\n return new ApiError(\n `Authentication failed while trying to ${operation}`,\n status,\n endpoint,\n );\n }\n\n if (status === 403) {\n return new ApiError(\n `Access denied while trying to ${operation}`,\n status,\n endpoint,\n );\n }\n\n if (status === 404) {\n return new ApiError(\n `Resource not found while trying to ${operation}`,\n status,\n endpoint,\n );\n }\n\n const message = detail || `Failed to ${operation}`;\n return new ApiError(message, status, endpoint);\n }\n\n if (error instanceof z.ZodError) {\n return new ApiError(`Invalid response format while trying to ${operation}`);\n }\n\n return new ApiError(\n `Unexpected error while trying to ${operation}: ${\n error instanceof Error ? error.message : 'Unknown error'\n }`,\n );\n}\n"],"mappings":"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"}
package/dist/bin.js CHANGED
@@ -1,28 +1,29 @@
1
1
  #!/usr/bin/env node
2
- import { L as Integration, U as POSTHOG_DOCS_URL, a as getLogFilePath, bt as isHeadless, dt as WIZARD_USER_AGENT, f as getUI, ht as VERSION, m as LoggingUI, p as setUI, pt as getSkillsBaseUrl, r as debug, s as logToFile, yt as headlessOption } from "./debug-DXfQFmcM.js";
3
- import { n as analytics } from "./analytics-DSlQuwOT.js";
4
- import { r as setEntryCommand } from "./telemetry-DZShaH-y.js";
5
- import { n as isUsingTypeScript } from "./setup-utils-BQCl28D8.js";
6
- import { o as handleApiError } from "./api-BXduJZrw.js";
7
- import "./wizard-session-BAZql11N.js";
8
- import { r as runCleanups } from "./wizard-abort-C14PzXZ8.js";
9
- import { n as isNonInteractiveEnvironment } from "./environment-F1yw21dG.js";
10
- import { n as runAgent, o as authenticate } from "./agent-runner-BF6_f8Qh.js";
11
- import { l as recoverOrphanedSettingsBackups, p as AgentSignals } from "./agent-interface-BvTxWiol.js";
12
- import { i as fetchSkillMenu, t as WIZARD_TOOL_NAMES } from "./wizard-tools-B7SLjCic.js";
13
- import { n as AUDIT_CHECKS_KEY, r as AUDIT_REPORT_FILE, t as AUDIT_CHECKS_FILE } from "./types-y3HkjtSq.js";
14
- import { h as SETUP_REPORT_FILE } from "./yara-hooks-CPH8N4yz.js";
15
- import { i as SPINNER_MESSAGE, t as FRAMEWORK_REGISTRY } from "./registry-DcoBCMQR.js";
16
- import { _ as gatherFrameworkContext, a as LINE_CHART_BLOCK, b as parseRequirementsTxt, g as detectProjectsWithAgent, h as HEALTH_CHECK_STEP, i as FUNNEL_BLOCK, m as Icons, n as integrationRunStep, o as PRODUCT_SUITE_BLOCK, p as Colors, r as posthogIntegrationConfig, s as StatusPeekTrigger, u as isClearBlock, v as parsePipfile, y as parsePyprojectToml } from "./posthog-integration-BhLKCFsI.js";
17
- import { n as safeReadFile, r as walkProjectFiles, t as IGNORED_DIRS } from "./file-utils-D-7YfJ7A.js";
18
- import { n as readApiKeyFromEnv } from "./env-api-key-cjD4yfGT.js";
2
+ import { B as Integration, Ct as headlessOption, K as POSTHOG_DOCS_URL, _t as getSkillsBaseUrl, a as getLogFilePath, f as getUI, ht as WIZARD_USER_AGENT, m as LoggingUI, p as setUI, r as debug, s as logToFile, wt as isHeadless, yt as VERSION } from "./debug-DBmxx59Q.js";
3
+ import { n as analytics } from "./analytics-DQEuL6qS.js";
4
+ import { r as setEntryCommand } from "./telemetry-DgahJGSx.js";
5
+ import { n as isUsingTypeScript } from "./setup-utils-Qp-u6BZk.js";
6
+ import { o as handleApiError } from "./api-uCMvDII5.js";
7
+ import "./wizard-session-tp4Zdbwl.js";
8
+ import { r as runCleanups } from "./wizard-abort-BxtdkgI-.js";
9
+ import { n as isNonInteractiveEnvironment } from "./environment-kZtkp7eG.js";
10
+ import { n as runAgent, o as authenticate } from "./agent-runner-B0LTVFfw.js";
11
+ import { l as recoverOrphanedSettingsBackups, p as AgentSignals } from "./agent-interface-CF7GsdFf.js";
12
+ import { n as AUDIT_CHECKS_KEY, r as AUDIT_REPORT_FILE, t as AUDIT_CHECKS_FILE } from "./types-BRe_EzTW.js";
13
+ import { i as fetchSkillMenu, t as WIZARD_TOOL_NAMES } from "./wizard-tools-Dg8o2lcH.js";
14
+ import { h as SETUP_REPORT_FILE } from "./yara-hooks-pw86rZ8y.js";
15
+ import { i as SPINNER_MESSAGE } from "./registry-D2V88NoC.js";
16
+ import { S as parseRequirementsTxt, a as LINE_CHART_BLOCK, b as parsePipfile, g as detectIntegrationProjects, h as HEALTH_CHECK_STEP, i as FUNNEL_BLOCK, m as Icons, n as integrationRunStep, o as PRODUCT_SUITE_BLOCK, p as Colors, r as posthogIntegrationConfig, s as StatusPeekTrigger, u as isClearBlock, v as resolveProjectDir, x as parsePyprojectToml, y as gatherFrameworkContext } from "./posthog-integration-dmWJZ8mj.js";
17
+ import { n as safeReadFile, r as walkProjectFiles, t as IGNORED_DIRS } from "./file-utils-BAhYy5vC.js";
18
+ import { n as readApiKeyFromEnv } from "./env-api-key-AcC_tz8G.js";
19
19
  import { satisfies } from "semver";
20
20
  import yargs from "yargs";
21
21
  import { hideBin } from "yargs/helpers";
22
22
  import fs, { existsSync, readFileSync, readdirSync, statSync } from "fs";
23
- import path, { join, relative, resolve, sep } from "path";
23
+ import path, { join, relative } from "path";
24
24
  import * as os from "node:os";
25
25
  import * as path$1 from "node:path";
26
+ import { join as join$1 } from "node:path";
26
27
  import { spawnSync } from "node:child_process";
27
28
  import * as fs$1 from "node:fs";
28
29
  import axios from "axios";
@@ -206,7 +207,7 @@ function runProvision(argv) {
206
207
  }
207
208
  async function provision({ email, region, name, baseUrl, jsonMode }) {
208
209
  try {
209
- const { provisionNewAccount } = await import("./provisioning-jVZm2E-A.js").then((n) => n.n);
210
+ const { provisionNewAccount } = await import("./provisioning-CcxCry5p.js").then((n) => n.n);
210
211
  if (!jsonMode) getUI().log.info(`Provisioning account for ${email} in ${region}...`);
211
212
  emitResult(await provisionNewAccount(email, name, region, { baseUrl }), jsonMode);
212
213
  process.exit(0);
@@ -272,22 +273,22 @@ const basicIntegrationCommand = {
272
273
  setEntryCommand("integrate");
273
274
  (async () => {
274
275
  if (isHeadless(argv)) {
275
- const { runHeadlessInstall } = await import("./ci-install-GirEJqu2.js");
276
+ const { runHeadlessInstall } = await import("./ci-install-Bow8-f0j.js");
276
277
  return runHeadlessInstall(argv);
277
278
  }
278
279
  if (argv.ci) {
279
- const { runCIInstall } = await import("./ci-install-GirEJqu2.js");
280
+ const { runCIInstall } = await import("./ci-install-Bow8-f0j.js");
280
281
  return runCIInstall(argv);
281
282
  }
282
283
  if (isNonInteractiveEnvironment()) {
283
- const { failNonInteractive } = await import("./non-interactive-BIHqcW8g.js");
284
+ const { failNonInteractive } = await import("./non-interactive-DQA9vn9f.js");
284
285
  return failNonInteractive();
285
286
  }
286
287
  if (argv.playground) {
287
- const { runPlayground } = await import("./playground-DwL36I2u.js");
288
+ const { runPlayground } = await import("./playground-CbEndzc8.js");
288
289
  return runPlayground();
289
290
  }
290
- const { runInteractive } = await import("./interactive-Bmi82rsO.js");
291
+ const { runInteractive } = await import("./interactive-Cyic0bGL.js");
291
292
  runInteractive(argv);
292
293
  })();
293
294
  }
@@ -3444,23 +3445,6 @@ function detectSelfDrivingPrerequisites(session, setFrameworkContext) {
3444
3445
  }
3445
3446
  //#endregion
3446
3447
  //#region src/lib/programs/self-driving/detect-agentic.ts
3447
- /**
3448
- * Agentic (Haiku) detection for self-driving's integration phase.
3449
- *
3450
- * Mirrors source-maps: the integration-detect screen runs `detectSelfDriving-
3451
- * IntegrationProjects` (the shared Haiku detector with the integration framework
3452
- * targets), shows a project map, and the user picks one. This file supplies the
3453
- * targets, maps the result back to `Integration`s, and classifies each project
3454
- * as instrumentable (a framework the wizard supports that doesn't already have
3455
- * PostHog). The screen writes the choice to the session; `prepSelfDriving-
3456
- * Integration` then gathers the chosen project's framework context before the
3457
- * integration agent runs (the runner scopes the install dir).
3458
- */
3459
- /** Integration framework targets for the agentic detector (id → display name). */
3460
- const INTEGRATION_TARGETS = Object.entries(FRAMEWORK_REGISTRY).map(([id, config]) => ({
3461
- id,
3462
- name: config.metadata.name
3463
- }));
3464
3448
  const INTEGRATION_IDS = new Set(Object.values(Integration));
3465
3449
  function classify(integration, hasPostHog) {
3466
3450
  if (integration == null) return {
@@ -3492,11 +3476,7 @@ function toIntegrationReport(report) {
3492
3476
  }
3493
3477
  /** Run the Haiku detector over the repo and classify projects for integration. */
3494
3478
  async function detectSelfDrivingIntegrationProjects(session, onEvent) {
3495
- return toIntegrationReport(await detectProjectsWithAgent(session, {
3496
- targets: INTEGRATION_TARGETS,
3497
- purpose: "set up a PostHog SDK integration",
3498
- onEvent
3499
- }));
3479
+ return toIntegrationReport(await detectIntegrationProjects(session, { onEvent }));
3500
3480
  }
3501
3481
  /**
3502
3482
  * Prepare the integration phase after the user picked a project on the
@@ -3523,36 +3503,10 @@ async function prepSelfDrivingIntegration(session) {
3523
3503
  }
3524
3504
  //#endregion
3525
3505
  //#region src/lib/programs/self-driving/steps.ts
3526
- /**
3527
- * Self-driving program step list.
3528
- *
3529
- * detect → intro → integration-check → health-check → auth → integrate-detect →
3530
- * integrate-run → self-driving-handoff → run → outro. A deterministic check in
3531
- * `detect` decides whether PostHog is already in the project: found → the
3532
- * integration screens are skipped and the integrate-run phase never shows; not
3533
- * found → integration-check reports it and the only action sets up PostHog.
3534
- * After auth, `integrate-detect` runs the Haiku detector and has the user pick
3535
- * which project to set PostHog up in (a monorepo can have several);
3536
- * `integrate-run` then runs the real integration program's agent (its own task
3537
- * list) in that project. `self-driving-handoff` then bridges to Self-driving
3538
- * ("PostHog is installed — now set up Self-driving") before the Self-driving
3539
- * run. No keep-skills step: the setup skill is transient, so postRun removes it.
3540
- */
3541
3506
  /** True once detection found PostHog already present in the project. */
3542
3507
  const postHogPresent = (session) => session.frameworkContext[POSTHOG_PRESENT_KEY] === true;
3543
- /**
3544
- * Absolute dir to integrate into: the picked sub-app, else the repo root.
3545
- * The picked path originates from LLM output; if it resolves outside the
3546
- * repo (defense-in-depth on top of the coerce-layer clamp), fall back to
3547
- * the root rather than run the agent elsewhere.
3548
- */
3549
- const integrationDir = (session) => {
3550
- const rel = session.frameworkContext[SELF_DRIVING_INTEGRATE_PATH_KEY];
3551
- if (typeof rel !== "string" || rel === ".") return session.installDir;
3552
- const root = resolve(session.installDir);
3553
- const dir = resolve(root, rel);
3554
- return dir === root || dir.startsWith(root + sep) ? dir : root;
3555
- };
3508
+ /** Absolute dir to integrate into: the picked sub-app (LLM output — the shared resolver clamps escapes), else the repo root. */
3509
+ const integrationDir = (session) => resolveProjectDir(session.installDir, session.frameworkContext[SELF_DRIVING_INTEGRATE_PATH_KEY]);
3556
3510
  const SELF_DRIVING_PROGRAM = [
3557
3511
  {
3558
3512
  id: "detect",
@@ -4433,13 +4387,13 @@ const mcpAddCommand = {
4433
4387
  function runMcpAdd(argv) {
4434
4388
  const features = parseFeatures(argv.features);
4435
4389
  (async () => {
4436
- const { readApiKeyFromEnv } = await import("./env-api-key-cjD4yfGT.js").then((n) => n.t);
4390
+ const { readApiKeyFromEnv } = await import("./env-api-key-AcC_tz8G.js").then((n) => n.t);
4437
4391
  const apiKey = argv.apiKey || readApiKeyFromEnv();
4438
4392
  const debug = argv.debug;
4439
4393
  const localMcp = argv.local;
4440
4394
  try {
4441
- const { startTUI } = await import("./start-tui-DgSKFMVh.js");
4442
- const { buildSession } = await import("./wizard-session-C5lZPPEc.js");
4395
+ const { startTUI } = await import("./start-tui-DHa_9aiB.js");
4396
+ const { buildSession } = await import("./wizard-session-DWHe83uk.js");
4443
4397
  const tui = startTUI(VERSION, Program.McpAdd);
4444
4398
  tui.store.session = buildSession({
4445
4399
  debug,
@@ -4451,7 +4405,7 @@ function runMcpAdd(argv) {
4451
4405
  } catch (error) {
4452
4406
  if (!isTUIUnavailable(error)) throw error;
4453
4407
  setUI(new LoggingUI());
4454
- const { addMCPServerToClientsStep } = await import("./add-mcp-server-to-clients-D5qsqCkj.js").then((n) => n.r);
4408
+ const { addMCPServerToClientsStep } = await import("./add-mcp-server-to-clients-CNzZMSat.js").then((n) => n.r);
4455
4409
  await addMCPServerToClientsStep({
4456
4410
  local: localMcp,
4457
4411
  features,
@@ -4490,8 +4444,8 @@ function runMcpRemove(argv) {
4490
4444
  const debug = argv.debug;
4491
4445
  const localMcp = argv.local;
4492
4446
  try {
4493
- const { startTUI } = await import("./start-tui-DgSKFMVh.js");
4494
- const { buildSession } = await import("./wizard-session-C5lZPPEc.js");
4447
+ const { startTUI } = await import("./start-tui-DHa_9aiB.js");
4448
+ const { buildSession } = await import("./wizard-session-DWHe83uk.js");
4495
4449
  const tui = startTUI(VERSION, Program.McpRemove);
4496
4450
  tui.store.session = buildSession({
4497
4451
  debug,
@@ -4500,7 +4454,7 @@ function runMcpRemove(argv) {
4500
4454
  });
4501
4455
  } catch {
4502
4456
  setUI(new LoggingUI());
4503
- const { removeMCPServerFromClientsStep } = await import("./add-mcp-server-to-clients-D5qsqCkj.js").then((n) => n.r);
4457
+ const { removeMCPServerFromClientsStep } = await import("./add-mcp-server-to-clients-CNzZMSat.js").then((n) => n.r);
4504
4458
  await removeMCPServerFromClientsStep({ local: localMcp });
4505
4459
  }
4506
4460
  })();
@@ -4522,8 +4476,8 @@ function runMcpTutorial(argv) {
4522
4476
  const debug = argv.debug;
4523
4477
  const localMcp = argv.local;
4524
4478
  try {
4525
- const { startTUI } = await import("./start-tui-DgSKFMVh.js");
4526
- const { buildSession } = await import("./wizard-session-C5lZPPEc.js");
4479
+ const { startTUI } = await import("./start-tui-DHa_9aiB.js");
4480
+ const { buildSession } = await import("./wizard-session-DWHe83uk.js");
4527
4481
  const tui = startTUI(VERSION, Program.McpTutorial);
4528
4482
  tui.store.session = buildSession({
4529
4483
  debug,
@@ -4603,10 +4557,10 @@ function runWizard(config, options) {
4603
4557
  (async () => {
4604
4558
  try {
4605
4559
  const installDir = options.installDir || process.cwd();
4606
- const { startTUI } = await import("./start-tui-DgSKFMVh.js");
4607
- const { buildSession, RunPhase } = await import("./wizard-session-C5lZPPEc.js");
4608
- const { TaskStreamPush } = await import("./task-stream-0Pk0tPBN.js");
4609
- const { PostHogDestination } = await import("./posthog-DwKlq0HM.js");
4560
+ const { startTUI } = await import("./start-tui-DHa_9aiB.js");
4561
+ const { buildSession, RunPhase } = await import("./wizard-session-DWHe83uk.js");
4562
+ const { TaskStreamPush } = await import("./task-stream-B7qia9eW.js");
4563
+ const { PostHogDestination } = await import("./posthog-DFyux4Vw.js");
4610
4564
  tui = startTUI(WIZARD_VERSION, config.id);
4611
4565
  const activeTui = tui;
4612
4566
  const session = buildSession({
@@ -4639,6 +4593,7 @@ function runWizard(config, options) {
4639
4593
  getCredentials: () => activeTui.store.session.credentials,
4640
4594
  onError: (err) => logToFile("[task-stream-push]", err.message)
4641
4595
  })],
4596
+ eventPlanPath: config.eventPlanFile ? join$1(session.installDir, config.eventPlanFile) : void 0,
4642
4597
  enabled: taskStreamEnabled
4643
4598
  });
4644
4599
  const activeStream = taskStream;
@@ -4670,7 +4625,7 @@ function runWizard(config, options) {
4670
4625
  if (shown(step)) await advanceStep(step, activeTui.store, config);
4671
4626
  }
4672
4627
  else if (skipAgent) {
4673
- const { getOrAskForProjectData } = await import("./setup-utils-BQCl28D8.js").then((n) => n.r);
4628
+ const { getOrAskForProjectData } = await import("./setup-utils-Qp-u6BZk.js").then((n) => n.r);
4674
4629
  const { projectApiKey, host, accessToken, projectId } = await getOrAskForProjectData({
4675
4630
  signup: session.signup,
4676
4631
  ci: session.ci,
@@ -4772,11 +4727,11 @@ function runNonInteractive(config, options, mode) {
4772
4727
  analytics.setTag("build", mode);
4773
4728
  (async () => {
4774
4729
  const path = await import("path");
4775
- const { buildSession, RunPhase, OutroKind } = await import("./wizard-session-C5lZPPEc.js");
4776
- const { readEnvironment } = await import("./environment-F1yw21dG.js").then((n) => n.t);
4777
- const { readApiKeyFromEnv } = await import("./env-api-key-cjD4yfGT.js").then((n) => n.t);
4778
- const { configureLogFileFromEnvironment, logToFile } = await import("./debug-BOFxiVVs.js");
4779
- const { wizardAbort, WizardError } = await import("./wizard-abort-UCm4Pd5m.js");
4730
+ const { buildSession, RunPhase, OutroKind } = await import("./wizard-session-DWHe83uk.js");
4731
+ const { readEnvironment } = await import("./environment-kZtkp7eG.js").then((n) => n.t);
4732
+ const { readApiKeyFromEnv } = await import("./env-api-key-AcC_tz8G.js").then((n) => n.t);
4733
+ const { configureLogFileFromEnvironment, logToFile } = await import("./debug-BixHZmHv.js");
4734
+ const { wizardAbort, WizardError } = await import("./wizard-abort-DpDmuCfA.js");
4780
4735
  configureLogFileFromEnvironment();
4781
4736
  const env = readEnvironment();
4782
4737
  const apiKey = options.apiKey ?? readApiKeyFromEnv() ?? void 0;
@@ -4807,9 +4762,9 @@ function runNonInteractive(config, options, mode) {
4807
4762
  let store = null;
4808
4763
  let taskStream = null;
4809
4764
  if (mode === "headless") {
4810
- const { WizardStore } = await import("./store-C79GoHCQ.js").then((n) => n.n);
4811
- const { HeadlessUI } = await import("./headless-ui-Dni0gPND.js");
4812
- const { TaskStreamPush, PostHogDestination } = await import("./task-stream-0Pk0tPBN.js");
4765
+ const { WizardStore } = await import("./store-DSwsITKX.js").then((n) => n.n);
4766
+ const { HeadlessUI } = await import("./headless-ui-DWmMyhaP.js");
4767
+ const { TaskStreamPush, PostHogDestination } = await import("./task-stream-B7qia9eW.js");
4813
4768
  store = new WizardStore(config.id);
4814
4769
  store.session = session;
4815
4770
  setUI(new HeadlessUI(store));
@@ -4820,6 +4775,7 @@ function runNonInteractive(config, options, mode) {
4820
4775
  getCredentials: () => session.credentials,
4821
4776
  onError: (e) => logToFile("[headless task-stream]", e.message)
4822
4777
  })],
4778
+ eventPlanPath: config.eventPlanFile ? join$1(session.installDir, config.eventPlanFile) : void 0,
4823
4779
  enabled: !session.noTelemetry
4824
4780
  });
4825
4781
  taskStream.attach();
@@ -4864,7 +4820,7 @@ function runNonInteractive(config, options, mode) {
4864
4820
  });
4865
4821
  }
4866
4822
  }
4867
- const { runAgent } = await import("./agent-runner-BF6_f8Qh.js").then((n) => n.t);
4823
+ const { runAgent } = await import("./agent-runner-B0LTVFfw.js").then((n) => n.t);
4868
4824
  await runAgent(config, session);
4869
4825
  await settleStream(RunPhase.Completed);
4870
4826
  } catch (error) {
@@ -5793,7 +5749,7 @@ async function runDoctorCI(options) {
5793
5749
  getUI().intro("Welcome to the PostHog setup wizard");
5794
5750
  getUI().log.info("Running posthog-doctor in CI mode");
5795
5751
  try {
5796
- const { getOrAskForProjectData } = await import("./setup-utils-BQCl28D8.js").then((n) => n.r);
5752
+ const { getOrAskForProjectData } = await import("./setup-utils-Qp-u6BZk.js").then((n) => n.r);
5797
5753
  const { host, accessToken, projectId } = await getOrAskForProjectData({
5798
5754
  signup: false,
5799
5755
  ci: true,
@@ -5811,7 +5767,7 @@ async function runDoctorCI(options) {
5811
5767
  for (const issue of sorted) getUI().log.info(` • [${issue.severity}] ${getKindMeta(issue.kind).title}`);
5812
5768
  process.exit(1);
5813
5769
  } catch (error) {
5814
- const { ApiError } = await import("./api-BXduJZrw.js").then((n) => n.n);
5770
+ const { ApiError } = await import("./api-uCMvDII5.js").then((n) => n.n);
5815
5771
  const message = error instanceof ApiError && error.statusCode === 401 ? "Your PostHog API key is invalid or expired." : error instanceof Error ? error.message : String(error);
5816
5772
  getUI().log.error(`Doctor failed: ${message}`);
5817
5773
  process.exit(1);
@@ -5893,8 +5849,8 @@ function runSlackConnect(argv) {
5893
5849
  (async () => {
5894
5850
  const debug = argv.debug;
5895
5851
  try {
5896
- const { startTUI } = await import("./start-tui-DgSKFMVh.js");
5897
- const { buildSession } = await import("./wizard-session-C5lZPPEc.js");
5852
+ const { startTUI } = await import("./start-tui-DHa_9aiB.js");
5853
+ const { buildSession } = await import("./wizard-session-DWHe83uk.js");
5898
5854
  const tui = startTUI(VERSION, Program.SlackConnect);
5899
5855
  tui.store.session = buildSession({
5900
5856
  debug,