@posthog/wizard 2.43.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 (118) hide show
  1. package/dist/{add-mcp-server-to-clients-BiZmRLE6.js → add-mcp-server-to-clients-CNzZMSat.js} +5 -5
  2. package/dist/{add-mcp-server-to-clients-BiZmRLE6.js.map → add-mcp-server-to-clients-CNzZMSat.js.map} +1 -1
  3. package/dist/{agent-interface-CUaNjvqq.js → agent-interface-CF7GsdFf.js} +298 -158
  4. package/dist/agent-interface-CF7GsdFf.js.map +1 -0
  5. package/dist/{agent-runner-BuH7W62W.js → agent-runner-B0LTVFfw.js} +130 -598
  6. package/dist/agent-runner-B0LTVFfw.js.map +1 -0
  7. package/dist/{analytics-C_9Kh6J1.js → analytics-DQEuL6qS.js} +2 -2
  8. package/dist/{analytics-C_9Kh6J1.js.map → analytics-DQEuL6qS.js.map} +1 -1
  9. package/dist/analytics-YD3D38z2.js +2 -0
  10. package/dist/{api-Kgk7BFqo.js → api-uCMvDII5.js} +3 -3
  11. package/dist/{api-Kgk7BFqo.js.map → api-uCMvDII5.js.map} +1 -1
  12. package/dist/bin.js +69 -116
  13. package/dist/bin.js.map +1 -1
  14. package/dist/{ci-install-DoARcA-j.js → ci-install-Bow8-f0j.js} +4 -4
  15. package/dist/{ci-install-DoARcA-j.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-CI0PLD6X.js → debug-BixHZmHv.js} +1 -1
  20. package/dist/{debug-DNEQR5DL.js → debug-DBmxx59Q.js} +42 -21
  21. package/dist/debug-DBmxx59Q.js.map +1 -0
  22. package/dist/{defaults-CeNThA-1.js → defaults-8zjNjGGi.js} +2 -2
  23. package/dist/defaults-8zjNjGGi.js.map +1 -0
  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-D44UP2Nu.js → environment-kZtkp7eG.js} +3 -3
  27. package/dist/{environment-D44UP2Nu.js.map → environment-kZtkp7eG.js.map} +1 -1
  28. package/dist/{file-utils-C2PNKLhr.js → file-utils-BAhYy5vC.js} +2 -2
  29. package/dist/{file-utils-C2PNKLhr.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-C3C0wWUi.js → headless-ui-DWmMyhaP.js} +5 -4
  33. package/dist/headless-ui-DWmMyhaP.js.map +1 -0
  34. package/dist/{interactive-k4xQiftO.js → interactive-Cyic0bGL.js} +2 -2
  35. package/dist/{interactive-k4xQiftO.js.map → interactive-Cyic0bGL.js.map} +1 -1
  36. package/dist/{mcp-CJn_ryMN.js → mcp-BSGmEWjt.js} +3 -3
  37. package/dist/mcp-BSGmEWjt.js.map +1 -0
  38. package/dist/{mcp-prompt-streaming-BB5nO--L.js → mcp-prompt-streaming-C227vG1X.js} +3 -3
  39. package/dist/{mcp-prompt-streaming-BB5nO--L.js.map → mcp-prompt-streaming-C227vG1X.js.map} +1 -1
  40. package/dist/{non-interactive-0x0Due8h.js → non-interactive-DQA9vn9f.js} +2 -2
  41. package/dist/{non-interactive-0x0Due8h.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-CBRR4_i4.js → package-manager-DKtR3xzM.js} +2 -2
  47. package/dist/{package-manager-CBRR4_i4.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-CK617U6k.js → playground-CbEndzc8.js} +7 -8
  51. package/dist/{playground-CK617U6k.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-qRjKkLcu.js → posthog-integration-dmWJZ8mj.js} +132 -27
  55. package/dist/posthog-integration-dmWJZ8mj.js.map +1 -0
  56. package/dist/{provisioning-BMXR8fS1.js → provisioning-CcxCry5p.js} +21 -14
  57. package/dist/provisioning-CcxCry5p.js.map +1 -0
  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-CsUUdVCd.js → registry-D2V88NoC.js} +96 -18
  61. package/dist/registry-D2V88NoC.js.map +1 -0
  62. package/dist/{security-CIP3lpp6.js → security-DOtBCBvx.js} +4 -4
  63. package/dist/{security-CIP3lpp6.js.map → security-DOtBCBvx.js.map} +1 -1
  64. package/dist/{setup-utils-DkyEOBDx.js → setup-utils-Qp-u6BZk.js} +7 -7
  65. package/dist/{setup-utils-DkyEOBDx.js.map → setup-utils-Qp-u6BZk.js.map} +1 -1
  66. package/dist/{start-tui-CJlIgYjf.js → start-tui-DHa_9aiB.js} +429 -234
  67. package/dist/start-tui-DHa_9aiB.js.map +1 -0
  68. package/dist/{steps-CuNjxYsA.js → steps-D07HUQyE.js} +7 -7
  69. package/dist/{steps-CuNjxYsA.js.map → steps-D07HUQyE.js.map} +1 -1
  70. package/dist/{store-UKAJftq6.js → store-DSwsITKX.js} +30 -9
  71. package/dist/store-DSwsITKX.js.map +1 -0
  72. package/dist/{subagent-_syej145.js → subagent-Dk4K5MDa.js} +2 -2
  73. package/dist/{subagent-_syej145.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-Ne-9ZOnf.js → task-stream-B7qia9eW.js} +72 -7
  77. package/dist/task-stream-B7qia9eW.js.map +1 -0
  78. package/dist/{tasks-CUvCA1OY.js → tasks-C7BQp659.js} +2 -2
  79. package/dist/{tasks-CUvCA1OY.js.map → tasks-C7BQp659.js.map} +1 -1
  80. package/dist/{telemetry-DFYgJHH-.js → telemetry-DgahJGSx.js} +3 -3
  81. package/dist/{telemetry-DFYgJHH-.js.map → telemetry-DgahJGSx.js.map} +1 -1
  82. package/dist/{terminal-DLFgIxhg.js → terminal-Bb6tZkf-.js} +14 -14
  83. package/dist/terminal-Bb6tZkf-.js.map +1 -0
  84. package/dist/{tools-CNyhLqlK.js → tools-BJEvSUWN.js} +4 -4
  85. package/dist/{tools-CNyhLqlK.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-BM3pISoR.js → wizard-abort-BxtdkgI-.js} +4 -4
  89. package/dist/{wizard-abort-BM3pISoR.js.map → wizard-abort-BxtdkgI-.js.map} +1 -1
  90. package/dist/{wizard-abort-DCv08-op.js → wizard-abort-DpDmuCfA.js} +1 -1
  91. package/dist/{wizard-session-DXivb7kv.js → wizard-session-DWHe83uk.js} +1 -1
  92. package/dist/{wizard-session-BudcixsA.js → wizard-session-tp4Zdbwl.js} +3 -3
  93. package/dist/wizard-session-tp4Zdbwl.js.map +1 -0
  94. package/dist/{wizard-tools-BcuRxp1A.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-GIs-R_g1.js → yara-hooks-pw86rZ8y.js} +4 -4
  98. package/dist/{yara-hooks-GIs-R_g1.js.map → yara-hooks-pw86rZ8y.js.map} +1 -1
  99. package/package.json +1 -1
  100. package/dist/agent-interface-CUaNjvqq.js.map +0 -1
  101. package/dist/agent-runner-BuH7W62W.js.map +0 -1
  102. package/dist/analytics-o-WJHD8Z.js +0 -2
  103. package/dist/debug-DNEQR5DL.js.map +0 -1
  104. package/dist/defaults-CeNThA-1.js.map +0 -1
  105. package/dist/headless-ui-C3C0wWUi.js.map +0 -1
  106. package/dist/mcp-CJn_ryMN.js.map +0 -1
  107. package/dist/posthog-integration-qRjKkLcu.js.map +0 -1
  108. package/dist/provisioning-BMXR8fS1.js.map +0 -1
  109. package/dist/registry-CsUUdVCd.js.map +0 -1
  110. package/dist/start-tui-CJlIgYjf.js.map +0 -1
  111. package/dist/store-UKAJftq6.js.map +0 -1
  112. package/dist/task-stream-Ne-9ZOnf.js.map +0 -1
  113. package/dist/terminal-DLFgIxhg.js.map +0 -1
  114. package/dist/wizard-session-BudcixsA.js.map +0 -1
  115. package/dist/wizard-tools-BcuRxp1A.js.map +0 -1
  116. package/dist/wizard-ui-WZ48rUgr.js +0 -15
  117. package/dist/wizard-ui-WZ48rUgr.js.map +0 -1
  118. package/dist/yara-hooks-DKbfESYf.js +0 -2
@@ -1,6 +1,6 @@
1
1
  import { t as __exportAll } from "./rolldown-runtime-B_-DWIq7.js";
2
- import { ut as WIZARD_USER_AGENT } from "./debug-DNEQR5DL.js";
3
- import { n as analytics } from "./analytics-C_9Kh6J1.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-Kgk7BFqo.js.map
173
+ //# sourceMappingURL=api-uCMvDII5.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"api-Kgk7BFqo.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, _t as HEADLESS_FLAG, a as getLogFilePath, f as getUI, ft as getSkillsBaseUrl, m as LoggingUI, p as setUI, pt as VERSION, r as debug, s as logToFile, ut as WIZARD_USER_AGENT, vt as isHeadless } from "./debug-DNEQR5DL.js";
3
- import { n as analytics } from "./analytics-C_9Kh6J1.js";
4
- import { r as setEntryCommand } from "./telemetry-DFYgJHH-.js";
5
- import { n as isUsingTypeScript } from "./setup-utils-DkyEOBDx.js";
6
- import { o as handleApiError } from "./api-Kgk7BFqo.js";
7
- import "./wizard-session-BudcixsA.js";
8
- import { r as runCleanups } from "./wizard-abort-BM3pISoR.js";
9
- import { n as isNonInteractiveEnvironment } from "./environment-D44UP2Nu.js";
10
- import { n as runAgent, o as authenticate } from "./agent-runner-BuH7W62W.js";
11
- import { l as recoverOrphanedSettingsBackups, p as AgentSignals } from "./agent-interface-CUaNjvqq.js";
12
- import { i as fetchSkillMenu, t as WIZARD_TOOL_NAMES } from "./wizard-tools-BcuRxp1A.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-GIs-R_g1.js";
15
- import { i as SPINNER_MESSAGE, t as FRAMEWORK_REGISTRY } from "./registry-CsUUdVCd.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-qRjKkLcu.js";
17
- import { n as safeReadFile, r as walkProjectFiles, t as IGNORED_DIRS } from "./file-utils-C2PNKLhr.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";
@@ -101,12 +102,6 @@ const GLOBAL_OPTIONS = {
101
102
  describe: "Email address for signup (used with --signup)\nenv: POSTHOG_WIZARD_EMAIL",
102
103
  type: "string"
103
104
  },
104
- [HEADLESS_FLAG]: {
105
- default: false,
106
- describe: "EXPERIMENTAL — do not use. Unstable, subject to breaking changes.",
107
- type: "boolean",
108
- hidden: true
109
- },
110
105
  "local-mcp": {
111
106
  default: false,
112
107
  describe: "Use local MCP server at http://localhost:8787/mcp\nenv: POSTHOG_WIZARD_LOCAL_MCP",
@@ -212,7 +207,7 @@ function runProvision(argv) {
212
207
  }
213
208
  async function provision({ email, region, name, baseUrl, jsonMode }) {
214
209
  try {
215
- const { provisionNewAccount } = await import("./provisioning-BMXR8fS1.js").then((n) => n.n);
210
+ const { provisionNewAccount } = await import("./provisioning-CcxCry5p.js").then((n) => n.n);
216
211
  if (!jsonMode) getUI().log.info(`Provisioning account for ${email} in ${region}...`);
217
212
  emitResult(await provisionNewAccount(email, name, region, { baseUrl }), jsonMode);
218
213
  process.exit(0);
@@ -267,7 +262,8 @@ const basicIntegrationCommand = {
267
262
  describe: "Launch the TUI primitives playground",
268
263
  type: "boolean",
269
264
  hidden: true
270
- }
265
+ },
266
+ ...headlessOption
271
267
  },
272
268
  check: (argv) => {
273
269
  if (argv.playground && (argv.ci || isHeadless(argv))) throw new Error("--playground cannot be combined with a headless run.");
@@ -277,22 +273,22 @@ const basicIntegrationCommand = {
277
273
  setEntryCommand("integrate");
278
274
  (async () => {
279
275
  if (isHeadless(argv)) {
280
- const { runHeadlessInstall } = await import("./ci-install-DoARcA-j.js");
276
+ const { runHeadlessInstall } = await import("./ci-install-Bow8-f0j.js");
281
277
  return runHeadlessInstall(argv);
282
278
  }
283
279
  if (argv.ci) {
284
- const { runCIInstall } = await import("./ci-install-DoARcA-j.js");
280
+ const { runCIInstall } = await import("./ci-install-Bow8-f0j.js");
285
281
  return runCIInstall(argv);
286
282
  }
287
283
  if (isNonInteractiveEnvironment()) {
288
- const { failNonInteractive } = await import("./non-interactive-0x0Due8h.js");
284
+ const { failNonInteractive } = await import("./non-interactive-DQA9vn9f.js");
289
285
  return failNonInteractive();
290
286
  }
291
287
  if (argv.playground) {
292
- const { runPlayground } = await import("./playground-CK617U6k.js");
288
+ const { runPlayground } = await import("./playground-CbEndzc8.js");
293
289
  return runPlayground();
294
290
  }
295
- const { runInteractive } = await import("./interactive-k4xQiftO.js");
291
+ const { runInteractive } = await import("./interactive-Cyic0bGL.js");
296
292
  runInteractive(argv);
297
293
  })();
298
294
  }
@@ -1640,7 +1636,8 @@ const auditConfig = {
1640
1636
  steps: auditSteps,
1641
1637
  run: auditRun,
1642
1638
  allowedTools: ["Agent"],
1643
- disallowedTools: [WIZARD_TOOL_NAMES.wizardAsk]
1639
+ disallowedTools: [WIZARD_TOOL_NAMES.wizardAsk],
1640
+ cliOptions: { ...headlessOption }
1644
1641
  };
1645
1642
  //#endregion
1646
1643
  //#region src/lib/programs/events-audit/steps.ts
@@ -2136,7 +2133,7 @@ const VENDOR_STACK_BLOCK = {
2136
2133
  color: "gray",
2137
2134
  children: " Braintrust"
2138
2135
  }),
2139
- /* @__PURE__ */ jsx(Text, { children: " LLM analytics " }),
2136
+ /* @__PURE__ */ jsx(Text, { children: " AI observability " }),
2140
2137
  /* @__PURE__ */ jsx(Text, {
2141
2138
  color: "red",
2142
2139
  children: "$50/mo+"
@@ -2229,7 +2226,7 @@ const FREE_TIER_BLOCK = {
2229
2226
  /* @__PURE__ */ jsx(Text, { children: "events " }),
2230
2227
  /* @__PURE__ */ jsx(Text, {
2231
2228
  dimColor: true,
2232
- children: "LLM analytics"
2229
+ children: "AI observability"
2233
2230
  })
2234
2231
  ] }),
2235
2232
  /* @__PURE__ */ jsxs(Text, { children: [
@@ -3448,23 +3445,6 @@ function detectSelfDrivingPrerequisites(session, setFrameworkContext) {
3448
3445
  }
3449
3446
  //#endregion
3450
3447
  //#region src/lib/programs/self-driving/detect-agentic.ts
3451
- /**
3452
- * Agentic (Haiku) detection for self-driving's integration phase.
3453
- *
3454
- * Mirrors source-maps: the integration-detect screen runs `detectSelfDriving-
3455
- * IntegrationProjects` (the shared Haiku detector with the integration framework
3456
- * targets), shows a project map, and the user picks one. This file supplies the
3457
- * targets, maps the result back to `Integration`s, and classifies each project
3458
- * as instrumentable (a framework the wizard supports that doesn't already have
3459
- * PostHog). The screen writes the choice to the session; `prepSelfDriving-
3460
- * Integration` then gathers the chosen project's framework context before the
3461
- * integration agent runs (the runner scopes the install dir).
3462
- */
3463
- /** Integration framework targets for the agentic detector (id → display name). */
3464
- const INTEGRATION_TARGETS = Object.entries(FRAMEWORK_REGISTRY).map(([id, config]) => ({
3465
- id,
3466
- name: config.metadata.name
3467
- }));
3468
3448
  const INTEGRATION_IDS = new Set(Object.values(Integration));
3469
3449
  function classify(integration, hasPostHog) {
3470
3450
  if (integration == null) return {
@@ -3496,11 +3476,7 @@ function toIntegrationReport(report) {
3496
3476
  }
3497
3477
  /** Run the Haiku detector over the repo and classify projects for integration. */
3498
3478
  async function detectSelfDrivingIntegrationProjects(session, onEvent) {
3499
- return toIntegrationReport(await detectProjectsWithAgent(session, {
3500
- targets: INTEGRATION_TARGETS,
3501
- purpose: "set up a PostHog SDK integration",
3502
- onEvent
3503
- }));
3479
+ return toIntegrationReport(await detectIntegrationProjects(session, { onEvent }));
3504
3480
  }
3505
3481
  /**
3506
3482
  * Prepare the integration phase after the user picked a project on the
@@ -3527,36 +3503,10 @@ async function prepSelfDrivingIntegration(session) {
3527
3503
  }
3528
3504
  //#endregion
3529
3505
  //#region src/lib/programs/self-driving/steps.ts
3530
- /**
3531
- * Self-driving program step list.
3532
- *
3533
- * detect → intro → integration-check → health-check → auth → integrate-detect →
3534
- * integrate-run → self-driving-handoff → run → outro. A deterministic check in
3535
- * `detect` decides whether PostHog is already in the project: found → the
3536
- * integration screens are skipped and the integrate-run phase never shows; not
3537
- * found → integration-check reports it and the only action sets up PostHog.
3538
- * After auth, `integrate-detect` runs the Haiku detector and has the user pick
3539
- * which project to set PostHog up in (a monorepo can have several);
3540
- * `integrate-run` then runs the real integration program's agent (its own task
3541
- * list) in that project. `self-driving-handoff` then bridges to Self-driving
3542
- * ("PostHog is installed — now set up Self-driving") before the Self-driving
3543
- * run. No keep-skills step: the setup skill is transient, so postRun removes it.
3544
- */
3545
3506
  /** True once detection found PostHog already present in the project. */
3546
3507
  const postHogPresent = (session) => session.frameworkContext[POSTHOG_PRESENT_KEY] === true;
3547
- /**
3548
- * Absolute dir to integrate into: the picked sub-app, else the repo root.
3549
- * The picked path originates from LLM output; if it resolves outside the
3550
- * repo (defense-in-depth on top of the coerce-layer clamp), fall back to
3551
- * the root rather than run the agent elsewhere.
3552
- */
3553
- const integrationDir = (session) => {
3554
- const rel = session.frameworkContext[SELF_DRIVING_INTEGRATE_PATH_KEY];
3555
- if (typeof rel !== "string" || rel === ".") return session.installDir;
3556
- const root = resolve(session.installDir);
3557
- const dir = resolve(root, rel);
3558
- return dir === root || dir.startsWith(root + sep) ? dir : root;
3559
- };
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]);
3560
3510
  const SELF_DRIVING_PROGRAM = [
3561
3511
  {
3562
3512
  id: "detect",
@@ -4437,13 +4387,13 @@ const mcpAddCommand = {
4437
4387
  function runMcpAdd(argv) {
4438
4388
  const features = parseFeatures(argv.features);
4439
4389
  (async () => {
4440
- 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);
4441
4391
  const apiKey = argv.apiKey || readApiKeyFromEnv();
4442
4392
  const debug = argv.debug;
4443
4393
  const localMcp = argv.local;
4444
4394
  try {
4445
- const { startTUI } = await import("./start-tui-CJlIgYjf.js");
4446
- const { buildSession } = await import("./wizard-session-DXivb7kv.js");
4395
+ const { startTUI } = await import("./start-tui-DHa_9aiB.js");
4396
+ const { buildSession } = await import("./wizard-session-DWHe83uk.js");
4447
4397
  const tui = startTUI(VERSION, Program.McpAdd);
4448
4398
  tui.store.session = buildSession({
4449
4399
  debug,
@@ -4455,7 +4405,7 @@ function runMcpAdd(argv) {
4455
4405
  } catch (error) {
4456
4406
  if (!isTUIUnavailable(error)) throw error;
4457
4407
  setUI(new LoggingUI());
4458
- const { addMCPServerToClientsStep } = await import("./add-mcp-server-to-clients-BiZmRLE6.js").then((n) => n.r);
4408
+ const { addMCPServerToClientsStep } = await import("./add-mcp-server-to-clients-CNzZMSat.js").then((n) => n.r);
4459
4409
  await addMCPServerToClientsStep({
4460
4410
  local: localMcp,
4461
4411
  features,
@@ -4494,8 +4444,8 @@ function runMcpRemove(argv) {
4494
4444
  const debug = argv.debug;
4495
4445
  const localMcp = argv.local;
4496
4446
  try {
4497
- const { startTUI } = await import("./start-tui-CJlIgYjf.js");
4498
- const { buildSession } = await import("./wizard-session-DXivb7kv.js");
4447
+ const { startTUI } = await import("./start-tui-DHa_9aiB.js");
4448
+ const { buildSession } = await import("./wizard-session-DWHe83uk.js");
4499
4449
  const tui = startTUI(VERSION, Program.McpRemove);
4500
4450
  tui.store.session = buildSession({
4501
4451
  debug,
@@ -4504,7 +4454,7 @@ function runMcpRemove(argv) {
4504
4454
  });
4505
4455
  } catch {
4506
4456
  setUI(new LoggingUI());
4507
- const { removeMCPServerFromClientsStep } = await import("./add-mcp-server-to-clients-BiZmRLE6.js").then((n) => n.r);
4457
+ const { removeMCPServerFromClientsStep } = await import("./add-mcp-server-to-clients-CNzZMSat.js").then((n) => n.r);
4508
4458
  await removeMCPServerFromClientsStep({ local: localMcp });
4509
4459
  }
4510
4460
  })();
@@ -4526,8 +4476,8 @@ function runMcpTutorial(argv) {
4526
4476
  const debug = argv.debug;
4527
4477
  const localMcp = argv.local;
4528
4478
  try {
4529
- const { startTUI } = await import("./start-tui-CJlIgYjf.js");
4530
- const { buildSession } = await import("./wizard-session-DXivb7kv.js");
4479
+ const { startTUI } = await import("./start-tui-DHa_9aiB.js");
4480
+ const { buildSession } = await import("./wizard-session-DWHe83uk.js");
4531
4481
  const tui = startTUI(VERSION, Program.McpTutorial);
4532
4482
  tui.store.session = buildSession({
4533
4483
  debug,
@@ -4607,10 +4557,10 @@ function runWizard(config, options) {
4607
4557
  (async () => {
4608
4558
  try {
4609
4559
  const installDir = options.installDir || process.cwd();
4610
- const { startTUI } = await import("./start-tui-CJlIgYjf.js");
4611
- const { buildSession, RunPhase } = await import("./wizard-session-DXivb7kv.js");
4612
- const { TaskStreamPush } = await import("./task-stream-Ne-9ZOnf.js");
4613
- 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");
4614
4564
  tui = startTUI(WIZARD_VERSION, config.id);
4615
4565
  const activeTui = tui;
4616
4566
  const session = buildSession({
@@ -4643,6 +4593,7 @@ function runWizard(config, options) {
4643
4593
  getCredentials: () => activeTui.store.session.credentials,
4644
4594
  onError: (err) => logToFile("[task-stream-push]", err.message)
4645
4595
  })],
4596
+ eventPlanPath: config.eventPlanFile ? join$1(session.installDir, config.eventPlanFile) : void 0,
4646
4597
  enabled: taskStreamEnabled
4647
4598
  });
4648
4599
  const activeStream = taskStream;
@@ -4674,7 +4625,7 @@ function runWizard(config, options) {
4674
4625
  if (shown(step)) await advanceStep(step, activeTui.store, config);
4675
4626
  }
4676
4627
  else if (skipAgent) {
4677
- const { getOrAskForProjectData } = await import("./setup-utils-DkyEOBDx.js").then((n) => n.r);
4628
+ const { getOrAskForProjectData } = await import("./setup-utils-Qp-u6BZk.js").then((n) => n.r);
4678
4629
  const { projectApiKey, host, accessToken, projectId } = await getOrAskForProjectData({
4679
4630
  signup: session.signup,
4680
4631
  ci: session.ci,
@@ -4776,11 +4727,11 @@ function runNonInteractive(config, options, mode) {
4776
4727
  analytics.setTag("build", mode);
4777
4728
  (async () => {
4778
4729
  const path = await import("path");
4779
- const { buildSession, RunPhase, OutroKind } = await import("./wizard-session-DXivb7kv.js");
4780
- const { readEnvironment } = await import("./environment-D44UP2Nu.js").then((n) => n.t);
4781
- const { readApiKeyFromEnv } = await import("./env-api-key-cjD4yfGT.js").then((n) => n.t);
4782
- const { configureLogFileFromEnvironment, logToFile } = await import("./debug-CI0PLD6X.js");
4783
- const { wizardAbort, WizardError } = await import("./wizard-abort-DCv08-op.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");
4784
4735
  configureLogFileFromEnvironment();
4785
4736
  const env = readEnvironment();
4786
4737
  const apiKey = options.apiKey ?? readApiKeyFromEnv() ?? void 0;
@@ -4811,9 +4762,9 @@ function runNonInteractive(config, options, mode) {
4811
4762
  let store = null;
4812
4763
  let taskStream = null;
4813
4764
  if (mode === "headless") {
4814
- const { WizardStore } = await import("./store-UKAJftq6.js").then((n) => n.n);
4815
- const { HeadlessUI } = await import("./headless-ui-C3C0wWUi.js");
4816
- const { TaskStreamPush, PostHogDestination } = await import("./task-stream-Ne-9ZOnf.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");
4817
4768
  store = new WizardStore(config.id);
4818
4769
  store.session = session;
4819
4770
  setUI(new HeadlessUI(store));
@@ -4824,6 +4775,7 @@ function runNonInteractive(config, options, mode) {
4824
4775
  getCredentials: () => session.credentials,
4825
4776
  onError: (e) => logToFile("[headless task-stream]", e.message)
4826
4777
  })],
4778
+ eventPlanPath: config.eventPlanFile ? join$1(session.installDir, config.eventPlanFile) : void 0,
4827
4779
  enabled: !session.noTelemetry
4828
4780
  });
4829
4781
  taskStream.attach();
@@ -4868,7 +4820,7 @@ function runNonInteractive(config, options, mode) {
4868
4820
  });
4869
4821
  }
4870
4822
  }
4871
- const { runAgent } = await import("./agent-runner-BuH7W62W.js").then((n) => n.t);
4823
+ const { runAgent } = await import("./agent-runner-B0LTVFfw.js").then((n) => n.t);
4872
4824
  await runAgent(config, session);
4873
4825
  await settleStream(RunPhase.Completed);
4874
4826
  } catch (error) {
@@ -4935,8 +4887,8 @@ const skillProgramOptions = { "install-dir": {
4935
4887
  //#region src/commands/factories/shared.ts
4936
4888
  /**
4937
4889
  * Dispatch a parsed yargs invocation to the wizard runner. Applies the
4938
- * program's `mapCliOptions` transform, then routes to `runWizard` or
4939
- * `runWizardCI` based on the `--ci` flag.
4890
+ * program's `mapCliOptions` transform, then routes to `runWizardHeadless`,
4891
+ * `runWizardCI`, or `runWizard` based on the headless / `--ci` flags.
4940
4892
  *
4941
4893
  * Every command file used to inline this; the factories call it instead.
4942
4894
  */
@@ -4965,7 +4917,8 @@ function dispatchProgram(config, argv) {
4965
4917
  ...argvRecord,
4966
4918
  ...extras
4967
4919
  };
4968
- if (options.ci) runWizardCI(config, options);
4920
+ if (isHeadless(options)) runWizardHeadless(config, options);
4921
+ else if (options.ci) runWizardCI(config, options);
4969
4922
  else runWizard(config, options);
4970
4923
  }
4971
4924
  /**
@@ -5796,7 +5749,7 @@ async function runDoctorCI(options) {
5796
5749
  getUI().intro("Welcome to the PostHog setup wizard");
5797
5750
  getUI().log.info("Running posthog-doctor in CI mode");
5798
5751
  try {
5799
- const { getOrAskForProjectData } = await import("./setup-utils-DkyEOBDx.js").then((n) => n.r);
5752
+ const { getOrAskForProjectData } = await import("./setup-utils-Qp-u6BZk.js").then((n) => n.r);
5800
5753
  const { host, accessToken, projectId } = await getOrAskForProjectData({
5801
5754
  signup: false,
5802
5755
  ci: true,
@@ -5814,7 +5767,7 @@ async function runDoctorCI(options) {
5814
5767
  for (const issue of sorted) getUI().log.info(` • [${issue.severity}] ${getKindMeta(issue.kind).title}`);
5815
5768
  process.exit(1);
5816
5769
  } catch (error) {
5817
- const { ApiError } = await import("./api-Kgk7BFqo.js").then((n) => n.n);
5770
+ const { ApiError } = await import("./api-uCMvDII5.js").then((n) => n.n);
5818
5771
  const message = error instanceof ApiError && error.statusCode === 401 ? "Your PostHog API key is invalid or expired." : error instanceof Error ? error.message : String(error);
5819
5772
  getUI().log.error(`Doctor failed: ${message}`);
5820
5773
  process.exit(1);
@@ -5859,14 +5812,14 @@ const selfDrivingCommand = {
5859
5812
  options: {
5860
5813
  ...skillProgramOptions,
5861
5814
  integrate: {
5862
- describe: "Integrate the PostHog SDK first, then set up Self-driving — skips the \"do you already have PostHog?\" question. Use when the project isn't set up yet.",
5815
+ describe: "Integrate the PostHog SDK first, then set up Self-driving — skips the integration prompt and logs you in via OAuth (no \"create an account?\" question). Use when the project isn't set up yet but you already have a PostHog account.",
5863
5816
  type: "boolean",
5864
5817
  default: false
5865
5818
  },
5866
5819
  ...selfDrivingConfig.cliOptions ?? {}
5867
5820
  },
5868
5821
  check: (argv) => {
5869
- if (argv.signup) throw new Error("`self-driving` cannot run with --signup. It builds on an existing PostHog integration — run the base `wizard` to create your account and set up PostHog first, then run `wizard self-driving`.");
5822
+ if (argv.signup) throw new Error("`self-driving` cannot run with --signup. Just run `wizard self-driving`: when your project has no PostHog, it asks whether you already have an account and offers to create one for you (no flag needed).");
5870
5823
  if (argv.ci) throw new Error("`self-driving` cannot run in CI mode — it requires interactive steps (GitHub connect, issue-tracker selection, custom-scout approval).");
5871
5824
  return true;
5872
5825
  },
@@ -5896,8 +5849,8 @@ function runSlackConnect(argv) {
5896
5849
  (async () => {
5897
5850
  const debug = argv.debug;
5898
5851
  try {
5899
- const { startTUI } = await import("./start-tui-CJlIgYjf.js");
5900
- const { buildSession } = await import("./wizard-session-DXivb7kv.js");
5852
+ const { startTUI } = await import("./start-tui-DHa_9aiB.js");
5853
+ const { buildSession } = await import("./wizard-session-DWHe83uk.js");
5901
5854
  const tui = startTUI(VERSION, Program.SlackConnect);
5902
5855
  tui.store.session = buildSession({
5903
5856
  debug,