@posthog/wizard 2.19.0 → 2.21.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 (67) hide show
  1. package/README.md +11 -0
  2. package/dist/{slides-mT2s9wM_.js → OutroScreen-CqF6SdBo.js} +614 -122
  3. package/dist/OutroScreen-CqF6SdBo.js.map +1 -0
  4. package/dist/{add-mcp-server-to-clients-CjnvTVj0.js → add-mcp-server-to-clients-DQHGhzt6.js} +4 -4
  5. package/dist/{add-mcp-server-to-clients-CjnvTVj0.js.map → add-mcp-server-to-clients-DQHGhzt6.js.map} +1 -1
  6. package/dist/{agent-interface-CQU6x4Hj.js → agent-interface-DE7txTqh.js} +163 -52
  7. package/dist/agent-interface-DE7txTqh.js.map +1 -0
  8. package/dist/{agent-runner-Cj7saDkL.js → agent-runner-DUZ5OD6e.js} +10 -9
  9. package/dist/{agent-runner-Cj7saDkL.js.map → agent-runner-DUZ5OD6e.js.map} +1 -1
  10. package/dist/{analytics-Df-Xb81i.js → analytics-Bl5DPj_0.js} +2 -2
  11. package/dist/{analytics-Df-Xb81i.js.map → analytics-Bl5DPj_0.js.map} +1 -1
  12. package/dist/{api-Dw6_orDE.js → api-DuA0_88V.js} +25 -4
  13. package/dist/{api-Dw6_orDE.js.map → api-DuA0_88V.js.map} +1 -1
  14. package/dist/bin.js +74 -47
  15. package/dist/bin.js.map +1 -1
  16. package/dist/check-screens.tsx +124 -0
  17. package/dist/{ci-install-BKAvFfK6.js → ci-install-BnOYI4mZ.js} +4 -4
  18. package/dist/{ci-install-BKAvFfK6.js.map → ci-install-BnOYI4mZ.js.map} +1 -1
  19. package/dist/{debug-Cp_wNn8i.js → debug-BVC48wlb.js} +1 -1
  20. package/dist/{debug-DnMO6O8O.js → debug-h7Z9zEbD.js} +2 -2
  21. package/dist/{debug-DnMO6O8O.js.map → debug-h7Z9zEbD.js.map} +1 -1
  22. package/dist/{environment-Ls0H9ljT.js → environment-uaLmtlH_.js} +3 -3
  23. package/dist/{environment-Ls0H9ljT.js.map → environment-uaLmtlH_.js.map} +1 -1
  24. package/dist/{interactive-D15byhpc.js → interactive-CW5gjyDd.js} +2 -2
  25. package/dist/{interactive-D15byhpc.js.map → interactive-CW5gjyDd.js.map} +1 -1
  26. package/dist/{mcp-prompt-streaming-DQOTQfW1.js → mcp-prompt-streaming-DMDwaark.js} +4 -4
  27. package/dist/{mcp-prompt-streaming-DQOTQfW1.js.map → mcp-prompt-streaming-DMDwaark.js.map} +1 -1
  28. package/dist/{non-interactive-DcFLJtl_.js → non-interactive-DJrVQ4nS.js} +2 -2
  29. package/dist/{non-interactive-DcFLJtl_.js.map → non-interactive-DJrVQ4nS.js.map} +1 -1
  30. package/dist/{package-manager-DUPgLGpQ.js → package-manager-DCUBRbr-.js} +2 -2
  31. package/dist/{package-manager-DUPgLGpQ.js.map → package-manager-DCUBRbr-.js.map} +1 -1
  32. package/dist/{playground-BZ0hGjbL.js → playground-DCVaVeVD.js} +138 -9
  33. package/dist/playground-DCVaVeVD.js.map +1 -0
  34. package/dist/{posthog-integration-C8qhJnI3.js → posthog-integration-ChdwFPMj.js} +17 -11
  35. package/dist/posthog-integration-ChdwFPMj.js.map +1 -0
  36. package/dist/{provisioning-C-2ExcqY.js → provisioning-GeMkBMSR.js} +3 -3
  37. package/dist/{provisioning-C-2ExcqY.js.map → provisioning-GeMkBMSR.js.map} +1 -1
  38. package/dist/{registry-hBUgaWFx.js → registry-VSSRH3sU.js} +4 -4
  39. package/dist/{registry-hBUgaWFx.js.map → registry-VSSRH3sU.js.map} +1 -1
  40. package/dist/{setup-utils-DetnhXo0.js → setup-utils-BfV4pydt.js} +12 -10
  41. package/dist/setup-utils-BfV4pydt.js.map +1 -0
  42. package/dist/{start-tui-BfXoErKg.js → start-tui-BRvm5VP9.js} +93 -228
  43. package/dist/start-tui-BRvm5VP9.js.map +1 -0
  44. package/dist/{steps-SoDXSUxe.js → steps-DA4uvSbg.js} +6 -6
  45. package/dist/{steps-SoDXSUxe.js.map → steps-DA4uvSbg.js.map} +1 -1
  46. package/dist/{task-stream-CZRj6auI.js → task-stream-CZawuzlz.js} +2 -2
  47. package/dist/{task-stream-CZRj6auI.js.map → task-stream-CZawuzlz.js.map} +1 -1
  48. package/dist/{telemetry-CPcMFxcO.js → telemetry-BRAonUea.js} +2 -2
  49. package/dist/{telemetry-CPcMFxcO.js.map → telemetry-BRAonUea.js.map} +1 -1
  50. package/dist/{urls-BO7doNJG.js → urls-B66Ib2jT.js} +2 -2
  51. package/dist/{urls-BO7doNJG.js.map → urls-B66Ib2jT.js.map} +1 -1
  52. package/dist/{wizard-abort-CDXufkqJ.js → wizard-abort-D1_DnFjm.js} +12 -7
  53. package/dist/wizard-abort-D1_DnFjm.js.map +1 -0
  54. package/dist/wizard-abort-gMB1eV6T.js +2 -0
  55. package/dist/{wizard-session-d27JGRGi.js → wizard-session-G3VWD6hv.js} +3 -1
  56. package/dist/{wizard-session-d27JGRGi.js.map → wizard-session-G3VWD6hv.js.map} +1 -1
  57. package/dist/{wizard-session-y304gEEI.js → wizard-session-wPJtNl4c.js} +1 -1
  58. package/dist/wizard-ui-YdGFRyu_.js.map +1 -1
  59. package/package.json +4 -2
  60. package/dist/agent-interface-CQU6x4Hj.js.map +0 -1
  61. package/dist/playground-BZ0hGjbL.js.map +0 -1
  62. package/dist/posthog-integration-C8qhJnI3.js.map +0 -1
  63. package/dist/setup-utils-DetnhXo0.js.map +0 -1
  64. package/dist/slides-mT2s9wM_.js.map +0 -1
  65. package/dist/start-tui-BfXoErKg.js.map +0 -1
  66. package/dist/wizard-abort-CDXufkqJ.js.map +0 -1
  67. package/dist/wizard-abort-CtMY57ZE.js +0 -2
@@ -1 +1 @@
1
- {"version":3,"file":"api-Dw6_orDE.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 })\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});\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\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-DuA0_88V.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 })\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});\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,14 +1,15 @@
1
1
  #!/usr/bin/env node
2
- import { J as VERSION, M as POSTHOG_DOCS_URL, W as WIZARD_USER_AGENT, _ as SIGNUP_WIZARD_READINESS_CONFIG, a as getLogFilePath, h as LoggingUI, m as setUI, p as getUI, s as logToFile, v as evaluateWizardReadiness, y as getBlockingServiceKeys } from "./debug-DnMO6O8O.js";
3
- import { t as analytics } from "./analytics-Df-Xb81i.js";
4
- import { n as isUsingTypeScript } from "./setup-utils-DetnhXo0.js";
5
- import { a as getUiHostFromHost, n as getCloudUrlFromRegion } from "./urls-BO7doNJG.js";
6
- import { a as handleApiError } from "./api-Dw6_orDE.js";
7
- import "./wizard-session-d27JGRGi.js";
8
- import { n as isNonInteractiveEnvironment } from "./environment-Ls0H9ljT.js";
9
- import { _ as AUDIT_REPORT_FILE, c as AgentSignals, d as WIZARD_TOOL_NAMES, g as AUDIT_CHECKS_KEY, h as AUDIT_CHECKS_FILE } from "./agent-interface-CQU6x4Hj.js";
10
- import { i as SPINNER_MESSAGE } from "./registry-hBUgaWFx.js";
11
- import { a as PRODUCT_SUITE_BLOCK, f as Colors, i as LINE_CHART_BLOCK, l as isClearBlock, m as HEALTH_CHECK_STEP, n as posthogIntegrationConfig, o as StatusPeekTrigger, r as FUNNEL_BLOCK } from "./posthog-integration-C8qhJnI3.js";
2
+ import { J as VERSION, M as POSTHOG_DOCS_URL, W as WIZARD_USER_AGENT, _ as SIGNUP_WIZARD_READINESS_CONFIG, a as getLogFilePath, h as LoggingUI, m as setUI, p as getUI, s as logToFile, v as evaluateWizardReadiness, y as getBlockingServiceKeys } from "./debug-h7Z9zEbD.js";
3
+ import { t as analytics } from "./analytics-Bl5DPj_0.js";
4
+ import { n as isUsingTypeScript } from "./setup-utils-BfV4pydt.js";
5
+ import { a as getUiHostFromHost, n as getCloudUrlFromRegion } from "./urls-B66Ib2jT.js";
6
+ import { o as handleApiError } from "./api-DuA0_88V.js";
7
+ import "./wizard-session-G3VWD6hv.js";
8
+ import { r as runCleanups } from "./wizard-abort-D1_DnFjm.js";
9
+ import { n as isNonInteractiveEnvironment } from "./environment-uaLmtlH_.js";
10
+ import { _ as AUDIT_CHECKS_KEY, f as WIZARD_TOOL_NAMES, g as AUDIT_CHECKS_FILE, l as AgentSignals, s as recoverOrphanedSettingsBackups, v as AUDIT_REPORT_FILE } from "./agent-interface-DE7txTqh.js";
11
+ import { i as SPINNER_MESSAGE } from "./registry-VSSRH3sU.js";
12
+ import { a as PRODUCT_SUITE_BLOCK, f as Colors, i as LINE_CHART_BLOCK, l as isClearBlock, m as HEALTH_CHECK_STEP, n as posthogIntegrationConfig, o as StatusPeekTrigger, r as FUNNEL_BLOCK } from "./posthog-integration-ChdwFPMj.js";
12
13
  import { t as IGNORED_DIRS } from "./file-utils-VAXoyXVA.js";
13
14
  import { n as readApiKeyFromEnv } from "./env-api-key-MlzJYAvt.js";
14
15
  import { satisfies } from "semver";
@@ -160,7 +161,7 @@ function runProvision(argv) {
160
161
  }
161
162
  async function provision({ email, region, name, jsonMode }) {
162
163
  try {
163
- const { provisionNewAccount } = await import("./provisioning-C-2ExcqY.js").then((n) => n.n);
164
+ const { provisionNewAccount } = await import("./provisioning-GeMkBMSR.js").then((n) => n.n);
164
165
  if (!jsonMode) getUI().log.info(`Provisioning account for ${email} in ${region}...`);
165
166
  emitResult(await provisionNewAccount(email, name, region), jsonMode);
166
167
  process.exit(0);
@@ -234,18 +235,18 @@ const basicIntegrationCommand = {
234
235
  handler: (argv) => {
235
236
  (async () => {
236
237
  if (argv.ci) {
237
- const { runCIInstall } = await import("./ci-install-BKAvFfK6.js");
238
+ const { runCIInstall } = await import("./ci-install-BnOYI4mZ.js");
238
239
  return runCIInstall(argv);
239
240
  }
240
241
  if (isNonInteractiveEnvironment()) {
241
- const { failNonInteractive } = await import("./non-interactive-DcFLJtl_.js");
242
+ const { failNonInteractive } = await import("./non-interactive-DJrVQ4nS.js");
242
243
  return failNonInteractive();
243
244
  }
244
245
  if (argv.playground) {
245
- const { runPlayground } = await import("./playground-BZ0hGjbL.js");
246
+ const { runPlayground } = await import("./playground-DCVaVeVD.js");
246
247
  return runPlayground();
247
248
  }
248
- const { runInteractive } = await import("./interactive-D15byhpc.js");
249
+ const { runInteractive } = await import("./interactive-CW5gjyDd.js");
249
250
  runInteractive(argv);
250
251
  })();
251
252
  }
@@ -2638,18 +2639,28 @@ const errorTrackingUploadSourceMapsConfig = {
2638
2639
  const mcpAddConfig = {
2639
2640
  id: "mcp-add",
2640
2641
  description: "Add PostHog MCP server to supported clients",
2641
- steps: [{
2642
- id: "mcp-add",
2643
- label: "Add MCP server",
2644
- screenId: "mcp-add",
2645
- isComplete: (s) => s.mcpComplete
2646
- }, {
2647
- id: "mcp-suggested-prompts",
2648
- label: "Suggested prompts",
2649
- screenId: "mcp-suggested-prompts",
2650
- show: (s) => s.mcpOutcome === "installed",
2651
- isComplete: (s) => s.mcpSuggestedPromptsDismissed
2652
- }]
2642
+ steps: [
2643
+ {
2644
+ id: "mcp-add",
2645
+ label: "Add MCP server",
2646
+ screenId: "mcp-add",
2647
+ isComplete: (s) => s.mcpComplete
2648
+ },
2649
+ {
2650
+ id: "mcp-suggested-prompts",
2651
+ label: "Suggested prompts",
2652
+ screenId: "mcp-suggested-prompts",
2653
+ show: (s) => s.mcpOutcome === "installed",
2654
+ isComplete: (s) => s.mcpSuggestedPromptsDismissed
2655
+ },
2656
+ {
2657
+ id: "slack-connect",
2658
+ label: "Connect Slack",
2659
+ screenId: "slack-connect",
2660
+ show: (s) => s.mcpOutcome === "installed",
2661
+ isComplete: (s) => s.slackStepDismissed
2662
+ }
2663
+ ]
2653
2664
  };
2654
2665
  /**
2655
2666
  * `wizard mcp remove` — single-step uninstall flow.
@@ -2693,6 +2704,11 @@ const mcpTutorialConfig = {
2693
2704
  label: "MCP tutorial",
2694
2705
  screenId: "mcp-suggested-prompts",
2695
2706
  isComplete: (s) => s.mcpSuggestedPromptsDismissed
2707
+ }, {
2708
+ id: "slack-connect",
2709
+ label: "Connect Slack",
2710
+ screenId: "slack-connect",
2711
+ isComplete: (s) => s.slackStepDismissed
2696
2712
  }]
2697
2713
  };
2698
2714
  //#endregion
@@ -2777,8 +2793,8 @@ function runMcpAdd(argv) {
2777
2793
  const debug = argv.debug;
2778
2794
  const localMcp = argv.local;
2779
2795
  try {
2780
- const { startTUI } = await import("./start-tui-BfXoErKg.js");
2781
- const { buildSession } = await import("./wizard-session-y304gEEI.js");
2796
+ const { startTUI } = await import("./start-tui-BRvm5VP9.js");
2797
+ const { buildSession } = await import("./wizard-session-wPJtNl4c.js");
2782
2798
  const tui = startTUI(VERSION, Program.McpAdd);
2783
2799
  tui.store.session = buildSession({
2784
2800
  debug,
@@ -2789,7 +2805,7 @@ function runMcpAdd(argv) {
2789
2805
  } catch (error) {
2790
2806
  if (!isTUIUnavailable(error)) throw error;
2791
2807
  setUI(new LoggingUI());
2792
- const { addMCPServerToClientsStep } = await import("./add-mcp-server-to-clients-CjnvTVj0.js").then((n) => n.r);
2808
+ const { addMCPServerToClientsStep } = await import("./add-mcp-server-to-clients-DQHGhzt6.js").then((n) => n.r);
2793
2809
  await addMCPServerToClientsStep({
2794
2810
  local: localMcp,
2795
2811
  features,
@@ -2828,8 +2844,8 @@ function runMcpRemove(argv) {
2828
2844
  const debug = argv.debug;
2829
2845
  const localMcp = argv.local;
2830
2846
  try {
2831
- const { startTUI } = await import("./start-tui-BfXoErKg.js");
2832
- const { buildSession } = await import("./wizard-session-y304gEEI.js");
2847
+ const { startTUI } = await import("./start-tui-BRvm5VP9.js");
2848
+ const { buildSession } = await import("./wizard-session-wPJtNl4c.js");
2833
2849
  const tui = startTUI(VERSION, Program.McpRemove);
2834
2850
  tui.store.session = buildSession({
2835
2851
  debug,
@@ -2837,7 +2853,7 @@ function runMcpRemove(argv) {
2837
2853
  });
2838
2854
  } catch {
2839
2855
  setUI(new LoggingUI());
2840
- const { removeMCPServerFromClientsStep } = await import("./add-mcp-server-to-clients-CjnvTVj0.js").then((n) => n.r);
2856
+ const { removeMCPServerFromClientsStep } = await import("./add-mcp-server-to-clients-DQHGhzt6.js").then((n) => n.r);
2841
2857
  await removeMCPServerFromClientsStep({ local: localMcp });
2842
2858
  }
2843
2859
  })();
@@ -2859,8 +2875,8 @@ function runMcpTutorial(argv) {
2859
2875
  const debug = argv.debug;
2860
2876
  const localMcp = argv.local;
2861
2877
  try {
2862
- const { startTUI } = await import("./start-tui-BfXoErKg.js");
2863
- const { buildSession } = await import("./wizard-session-y304gEEI.js");
2878
+ const { startTUI } = await import("./start-tui-BRvm5VP9.js");
2879
+ const { buildSession } = await import("./wizard-session-wPJtNl4c.js");
2864
2880
  const tui = startTUI(VERSION, Program.McpTutorial);
2865
2881
  tui.store.session = buildSession({
2866
2882
  debug,
@@ -2914,9 +2930,9 @@ function runWizard(config, options) {
2914
2930
  (async () => {
2915
2931
  try {
2916
2932
  const installDir = options.installDir || process.cwd();
2917
- const { startTUI } = await import("./start-tui-BfXoErKg.js");
2918
- const { buildSession, RunPhase } = await import("./wizard-session-y304gEEI.js");
2919
- const { TaskStreamPush } = await import("./task-stream-CZRj6auI.js");
2933
+ const { startTUI } = await import("./start-tui-BRvm5VP9.js");
2934
+ const { buildSession, RunPhase } = await import("./wizard-session-wPJtNl4c.js");
2935
+ const { TaskStreamPush } = await import("./task-stream-CZawuzlz.js");
2920
2936
  const { PostHogDestination } = await import("./posthog-Cr37rnla.js");
2921
2937
  tui = startTUI(WIZARD_VERSION, config.id);
2922
2938
  const activeTui = tui;
@@ -2954,6 +2970,7 @@ function runWizard(config, options) {
2954
2970
  if (signalled || exitInProgress) return;
2955
2971
  signalled = true;
2956
2972
  logToFile("[run-wizard] signal received, flushing task stream");
2973
+ runCleanups();
2957
2974
  if (activeTui.store.session.runPhase === RunPhase.Running) activeTui.store.setRunPhase(RunPhase.Error);
2958
2975
  activeStream.shutdown(2e3).catch((e) => logToFile("[run-wizard] task stream shutdown error on signal:", e)).finally(() => {
2959
2976
  try {
@@ -2969,7 +2986,7 @@ function runWizard(config, options) {
2969
2986
  await activeTui.store.getGate("health-check");
2970
2987
  const skipAgent = config.run == null;
2971
2988
  if (skipAgent) {
2972
- const { getOrAskForProjectData } = await import("./setup-utils-DetnhXo0.js").then((n) => n.r);
2989
+ const { getOrAskForProjectData } = await import("./setup-utils-BfV4pydt.js").then((n) => n.r);
2973
2990
  const { projectApiKey, host, accessToken, projectId } = await getOrAskForProjectData({
2974
2991
  signup: session.signup,
2975
2992
  ci: session.ci,
@@ -2984,7 +3001,7 @@ function runWizard(config, options) {
2984
3001
  projectId
2985
3002
  });
2986
3003
  } else {
2987
- const { runAgent } = await import("./agent-runner-Cj7saDkL.js");
3004
+ const { runAgent } = await import("./agent-runner-DUZ5OD6e.js");
2988
3005
  await runAgent(config, activeTui.store.session);
2989
3006
  }
2990
3007
  const isDone = () => skipAgent ? activeTui.store.session.outroDismissed : activeTui.store.session.skillsComplete;
@@ -3008,6 +3025,7 @@ function runWizard(config, options) {
3008
3025
  process.exit(0);
3009
3026
  } catch (err) {
3010
3027
  logToFile("[run-wizard] FATAL:", err);
3028
+ runCleanups();
3011
3029
  exitInProgress = true;
3012
3030
  if (onSignal) {
3013
3031
  process.off("SIGINT", onSignal);
@@ -3058,11 +3076,11 @@ function runWizardCI(config, options) {
3058
3076
  validateCiOptions(options);
3059
3077
  (async () => {
3060
3078
  const path = await import("path");
3061
- const { buildSession } = await import("./wizard-session-y304gEEI.js");
3062
- const { readEnvironment } = await import("./environment-Ls0H9ljT.js").then((n) => n.t);
3079
+ const { buildSession } = await import("./wizard-session-wPJtNl4c.js");
3080
+ const { readEnvironment } = await import("./environment-uaLmtlH_.js").then((n) => n.t);
3063
3081
  const { readApiKeyFromEnv } = await import("./env-api-key-MlzJYAvt.js").then((n) => n.t);
3064
- const { configureLogFileFromEnvironment, logToFile } = await import("./debug-Cp_wNn8i.js");
3065
- const { wizardAbort, WizardError } = await import("./wizard-abort-CtMY57ZE.js");
3082
+ const { configureLogFileFromEnvironment, logToFile } = await import("./debug-BVC48wlb.js");
3083
+ const { wizardAbort, WizardError } = await import("./wizard-abort-gMB1eV6T.js");
3066
3084
  configureLogFileFromEnvironment();
3067
3085
  const env = readEnvironment();
3068
3086
  const apiKey = options.apiKey ?? readApiKeyFromEnv() ?? void 0;
@@ -3110,7 +3128,7 @@ function runWizardCI(config, options) {
3110
3128
  })
3111
3129
  });
3112
3130
  }
3113
- const { runAgent } = await import("./agent-runner-Cj7saDkL.js");
3131
+ const { runAgent } = await import("./agent-runner-DUZ5OD6e.js");
3114
3132
  await runAgent(config, session);
3115
3133
  } catch (error) {
3116
3134
  const errorMessage = error instanceof Error ? error.message : String(error);
@@ -3264,7 +3282,7 @@ async function runDoctorCI(options) {
3264
3282
  getUI().intro("Welcome to the PostHog setup wizard");
3265
3283
  getUI().log.info("Running posthog-doctor in CI mode");
3266
3284
  try {
3267
- const { getOrAskForProjectData } = await import("./setup-utils-DetnhXo0.js").then((n) => n.r);
3285
+ const { getOrAskForProjectData } = await import("./setup-utils-BfV4pydt.js").then((n) => n.r);
3268
3286
  const { host, accessToken, projectId } = await getOrAskForProjectData({
3269
3287
  signup: false,
3270
3288
  ci: true,
@@ -3281,7 +3299,7 @@ async function runDoctorCI(options) {
3281
3299
  for (const issue of sorted) getUI().log.info(` • [${issue.severity}] ${getKindMeta(issue.kind).title}`);
3282
3300
  process.exit(1);
3283
3301
  } catch (error) {
3284
- const { ApiError } = await import("./api-Dw6_orDE.js").then((n) => n.n);
3302
+ const { ApiError } = await import("./api-DuA0_88V.js").then((n) => n.n);
3285
3303
  const message = error instanceof ApiError && error.statusCode === 401 ? "Your PostHog API key is invalid or expired." : error instanceof Error ? error.message : String(error);
3286
3304
  getUI().log.error(`Doctor failed: ${message}`);
3287
3305
  process.exit(1);
@@ -3422,6 +3440,15 @@ if (!satisfies(process.version, NODE_VERSION_RANGE)) {
3422
3440
  console.log(`PostHog wizard requires Node.js ${NODE_VERSION_RANGE}. You are using Node.js ${process.version}. Please upgrade your Node.js version.`);
3423
3441
  process.exit(1);
3424
3442
  }
3443
+ recoverOrphanedSettingsBackups(resolveInstallDir());
3444
+ function resolveInstallDir() {
3445
+ const args = process.argv.slice(2);
3446
+ const flagIndex = args.indexOf("--install-dir");
3447
+ if (flagIndex !== -1 && args[flagIndex + 1]) return args[flagIndex + 1];
3448
+ const inline = args.find((a) => a.startsWith("--install-dir="));
3449
+ if (inline) return inline.slice(14);
3450
+ return process.env.POSTHOG_WIZARD_INSTALL_DIR ?? process.cwd();
3451
+ }
3425
3452
  Wizard.use(basicIntegrationCommand).use(mcpCommand).use(integrateCommand).use(auditCommand).use(audit3000Command).use(doctorCommand).use(migrateCommand).use(eventsAuditCommand).use(revenueCommand).use(uploadSourcemapsCommand).use(skillCommand).init();
3426
3453
  //#endregion
3427
3454
  export { getProgramConfig as a, getContentBlocks$1 as c, getContentBlocks$2 as d, POSTHOG_SDKS$1 as f, Program as i, getKindMeta as l, runWizard as n, DISPLAY_NAME as o, STRIPE_SDKS as p, PROGRAM_REGISTRY as r, SOURCE_MAPS_CONTEXT_KEYS as s, runWizardCI as t, fetchHealthIssues as u };