@posthog/wizard 2.18.0 → 2.20.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 (71) hide show
  1. package/README.md +11 -0
  2. package/dist/{add-mcp-server-to-clients-DnPwZl1P.js → add-mcp-server-to-clients-iV7BuQpD.js} +72 -13
  3. package/dist/add-mcp-server-to-clients-iV7BuQpD.js.map +1 -0
  4. package/dist/{agent-interface-C2VEF-BD.js → agent-interface-B-LAvrNL.js} +165 -52
  5. package/dist/agent-interface-B-LAvrNL.js.map +1 -0
  6. package/dist/{agent-runner-Dw8cjZoN.js → agent-runner-w2Qu9M13.js} +16 -11
  7. package/dist/{agent-runner-Dw8cjZoN.js.map → agent-runner-w2Qu9M13.js.map} +1 -1
  8. package/dist/{analytics-C-zcTO6g.js → analytics-C8lJzXjY.js} +2 -2
  9. package/dist/{analytics-C-zcTO6g.js.map → analytics-C8lJzXjY.js.map} +1 -1
  10. package/dist/{api-B3MWP3vm.js → api-eUlUinVy.js} +25 -4
  11. package/dist/{api-B3MWP3vm.js.map → api-eUlUinVy.js.map} +1 -1
  12. package/dist/bin.js +79 -50
  13. package/dist/bin.js.map +1 -1
  14. package/dist/check-screens.tsx +124 -0
  15. package/dist/{ci-install-DLuSmSq6.js → ci-install-CSo7Q1pK.js} +4 -4
  16. package/dist/{ci-install-DLuSmSq6.js.map → ci-install-CSo7Q1pK.js.map} +1 -1
  17. package/dist/{debug-BorYMfpE.js → debug-BJu_sS4l.js} +36 -21
  18. package/dist/debug-BJu_sS4l.js.map +1 -0
  19. package/dist/{debug--gQGudnY.js → debug-CTViFiF-.js} +1 -1
  20. package/dist/{defaults-DA3-9dHT.js → defaults-BNWIWzjc.js} +34 -8
  21. package/dist/defaults-BNWIWzjc.js.map +1 -0
  22. package/dist/{environment-DIOtLqTQ.js → environment-Dk_dWk3t.js} +3 -3
  23. package/dist/{environment-DIOtLqTQ.js.map → environment-Dk_dWk3t.js.map} +1 -1
  24. package/dist/{interactive-DjGjlvY3.js → interactive-BS2rIf1v.js} +2 -2
  25. package/dist/{interactive-DjGjlvY3.js.map → interactive-BS2rIf1v.js.map} +1 -1
  26. package/dist/{mcp-prompt-streaming-Dm47tmiy.js → mcp-prompt-streaming-BiMrlLl0.js} +4 -4
  27. package/dist/{mcp-prompt-streaming-Dm47tmiy.js.map → mcp-prompt-streaming-BiMrlLl0.js.map} +1 -1
  28. package/dist/{non-interactive-C2f3Gwva.js → non-interactive-C39d_KIp.js} +2 -2
  29. package/dist/{non-interactive-C2f3Gwva.js.map → non-interactive-C39d_KIp.js.map} +1 -1
  30. package/dist/{package-manager-Bl2KOUFK.js → package-manager-BfOTvFt-.js} +2 -2
  31. package/dist/{package-manager-Bl2KOUFK.js.map → package-manager-BfOTvFt-.js.map} +1 -1
  32. package/dist/{playground-ZLG68cvx.js → playground-3OeRB7JU.js} +23 -9
  33. package/dist/playground-3OeRB7JU.js.map +1 -0
  34. package/dist/{posthog-integration-B_DLodqr.js → posthog-integration-8iTgqy2J.js} +20 -12
  35. package/dist/posthog-integration-8iTgqy2J.js.map +1 -0
  36. package/dist/{provisioning-Bk4E6VYn.js → provisioning-DxaT7bWw.js} +3 -3
  37. package/dist/{provisioning-Bk4E6VYn.js.map → provisioning-DxaT7bWw.js.map} +1 -1
  38. package/dist/{registry-DMM3UmZD.js → registry-apQfB3rf.js} +4 -4
  39. package/dist/{registry-DMM3UmZD.js.map → registry-apQfB3rf.js.map} +1 -1
  40. package/dist/{setup-utils-Df9ezAjZ.js → setup-utils-B9xqAXXl.js} +35 -20
  41. package/dist/{setup-utils-Df9ezAjZ.js.map → setup-utils-B9xqAXXl.js.map} +1 -1
  42. package/dist/{slides-DwvXZ8iS.js → slides-BEshbXqG.js} +448 -187
  43. package/dist/slides-BEshbXqG.js.map +1 -0
  44. package/dist/{start-tui-P9aMwBzt.js → start-tui-CCpKnZOY.js} +245 -57
  45. package/dist/start-tui-CCpKnZOY.js.map +1 -0
  46. package/dist/{steps-RCRZbLjZ.js → steps-DKbDDnVH.js} +6 -6
  47. package/dist/{steps-RCRZbLjZ.js.map → steps-DKbDDnVH.js.map} +1 -1
  48. package/dist/{task-stream-CZRj6auI.js → task-stream-CZawuzlz.js} +2 -2
  49. package/dist/{task-stream-CZRj6auI.js.map → task-stream-CZawuzlz.js.map} +1 -1
  50. package/dist/{telemetry-CMbVbpaY.js → telemetry-DUeOcmpo.js} +2 -2
  51. package/dist/{telemetry-CMbVbpaY.js.map → telemetry-DUeOcmpo.js.map} +1 -1
  52. package/dist/{urls-BzG_Jtw9.js → urls-B6wBIwr1.js} +2 -2
  53. package/dist/{urls-BzG_Jtw9.js.map → urls-B6wBIwr1.js.map} +1 -1
  54. package/dist/wizard-abort-D8XZdVAR.js +2 -0
  55. package/dist/{wizard-abort-QuKm_B5z.js → wizard-abort-DhGgTlUA.js} +14 -7
  56. package/dist/wizard-abort-DhGgTlUA.js.map +1 -0
  57. package/dist/{wizard-session-d27JGRGi.js → wizard-session-G3VWD6hv.js} +3 -1
  58. package/dist/{wizard-session-d27JGRGi.js.map → wizard-session-G3VWD6hv.js.map} +1 -1
  59. package/dist/{wizard-session-y304gEEI.js → wizard-session-wPJtNl4c.js} +1 -1
  60. package/dist/wizard-ui-YdGFRyu_.js.map +1 -1
  61. package/package.json +4 -2
  62. package/dist/add-mcp-server-to-clients-DnPwZl1P.js.map +0 -1
  63. package/dist/agent-interface-C2VEF-BD.js.map +0 -1
  64. package/dist/debug-BorYMfpE.js.map +0 -1
  65. package/dist/defaults-DA3-9dHT.js.map +0 -1
  66. package/dist/playground-ZLG68cvx.js.map +0 -1
  67. package/dist/posthog-integration-B_DLodqr.js.map +0 -1
  68. package/dist/slides-DwvXZ8iS.js.map +0 -1
  69. package/dist/start-tui-P9aMwBzt.js.map +0 -1
  70. package/dist/wizard-abort-Dl8WJQgJ.js +0 -2
  71. package/dist/wizard-abort-QuKm_B5z.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"api-B3MWP3vm.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-eUlUinVy.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, X as runtimeEnv, _ as SIGNUP_WIZARD_READINESS_CONFIG, h as LoggingUI, m as setUI, p as getUI, s as logToFile, v as evaluateWizardReadiness, y as getBlockingServiceKeys } from "./debug-BorYMfpE.js";
3
- import { t as analytics } from "./analytics-C-zcTO6g.js";
4
- import { n as isUsingTypeScript } from "./setup-utils-Df9ezAjZ.js";
5
- import { a as getUiHostFromHost, n as getCloudUrlFromRegion } from "./urls-BzG_Jtw9.js";
6
- import { a as handleApiError } from "./api-B3MWP3vm.js";
7
- import "./wizard-session-d27JGRGi.js";
8
- import { n as isNonInteractiveEnvironment } from "./environment-DIOtLqTQ.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-C2VEF-BD.js";
10
- import { i as SPINNER_MESSAGE } from "./registry-DMM3UmZD.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-B_DLodqr.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-BJu_sS4l.js";
3
+ import { t as analytics } from "./analytics-C8lJzXjY.js";
4
+ import { n as isUsingTypeScript } from "./setup-utils-B9xqAXXl.js";
5
+ import { a as getUiHostFromHost, n as getCloudUrlFromRegion } from "./urls-B6wBIwr1.js";
6
+ import { o as handleApiError } from "./api-eUlUinVy.js";
7
+ import "./wizard-session-G3VWD6hv.js";
8
+ import { r as runCleanups } from "./wizard-abort-DhGgTlUA.js";
9
+ import { n as isNonInteractiveEnvironment } from "./environment-Dk_dWk3t.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-B-LAvrNL.js";
11
+ import { i as SPINNER_MESSAGE } from "./registry-apQfB3rf.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-8iTgqy2J.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-Bk4E6VYn.js").then((n) => n.n);
164
+ const { provisionNewAccount } = await import("./provisioning-DxaT7bWw.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-DLuSmSq6.js");
238
+ const { runCIInstall } = await import("./ci-install-CSo7Q1pK.js");
238
239
  return runCIInstall(argv);
239
240
  }
240
241
  if (isNonInteractiveEnvironment()) {
241
- const { failNonInteractive } = await import("./non-interactive-C2f3Gwva.js");
242
+ const { failNonInteractive } = await import("./non-interactive-C39d_KIp.js");
242
243
  return failNonInteractive();
243
244
  }
244
245
  if (argv.playground) {
245
- const { runPlayground } = await import("./playground-ZLG68cvx.js");
246
+ const { runPlayground } = await import("./playground-3OeRB7JU.js");
246
247
  return runPlayground();
247
248
  }
248
- const { runInteractive } = await import("./interactive-DjGjlvY3.js");
249
+ const { runInteractive } = await import("./interactive-BS2rIf1v.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-P9aMwBzt.js");
2781
- const { buildSession } = await import("./wizard-session-y304gEEI.js");
2796
+ const { startTUI } = await import("./start-tui-CCpKnZOY.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-DnPwZl1P.js").then((n) => n.r);
2808
+ const { addMCPServerToClientsStep } = await import("./add-mcp-server-to-clients-iV7BuQpD.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-P9aMwBzt.js");
2832
- const { buildSession } = await import("./wizard-session-y304gEEI.js");
2847
+ const { startTUI } = await import("./start-tui-CCpKnZOY.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-DnPwZl1P.js").then((n) => n.r);
2856
+ const { removeMCPServerFromClientsStep } = await import("./add-mcp-server-to-clients-iV7BuQpD.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-P9aMwBzt.js");
2863
- const { buildSession } = await import("./wizard-session-y304gEEI.js");
2878
+ const { startTUI } = await import("./start-tui-CCpKnZOY.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,11 +2930,10 @@ 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-P9aMwBzt.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-CCpKnZOY.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
- const { logToFile } = await import("./debug--gQGudnY.js");
2922
2937
  tui = startTUI(WIZARD_VERSION, config.id);
2923
2938
  const activeTui = tui;
2924
2939
  const session = buildSession({
@@ -2954,8 +2969,10 @@ function runWizard(config, options) {
2954
2969
  onSignal = () => {
2955
2970
  if (signalled || exitInProgress) return;
2956
2971
  signalled = true;
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
- activeStream.shutdown(2e3).finally(() => {
2975
+ activeStream.shutdown(2e3).catch((e) => logToFile("[run-wizard] task stream shutdown error on signal:", e)).finally(() => {
2959
2976
  try {
2960
2977
  activeTui.unmount();
2961
2978
  } catch {}
@@ -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-Df9ezAjZ.js").then((n) => n.r);
2989
+ const { getOrAskForProjectData } = await import("./setup-utils-B9xqAXXl.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-Dw8cjZoN.js");
3004
+ const { runAgent } = await import("./agent-runner-w2Qu9M13.js");
2988
3005
  await runAgent(config, activeTui.store.session);
2989
3006
  }
2990
3007
  const isDone = () => skipAgent ? activeTui.store.session.outroDismissed : activeTui.store.session.skillsComplete;
@@ -3007,7 +3024,8 @@ function runWizard(config, options) {
3007
3024
  activeTui.unmount();
3008
3025
  process.exit(0);
3009
3026
  } catch (err) {
3010
- if (runtimeEnv("DEBUG") || runtimeEnv("POSTHOG_WIZARD_DEBUG")) console.error("TUI init failed:", err);
3027
+ logToFile("[run-wizard] FATAL:", err);
3028
+ runCleanups();
3011
3029
  exitInProgress = true;
3012
3030
  if (onSignal) {
3013
3031
  process.off("SIGINT", onSignal);
@@ -3019,6 +3037,8 @@ function runWizard(config, options) {
3019
3037
  if (tui) try {
3020
3038
  tui.unmount();
3021
3039
  } catch {}
3040
+ console.error("Wizard run failed:", err);
3041
+ console.error(`Full logs: ${getLogFilePath()}`);
3022
3042
  process.exit(1);
3023
3043
  }
3024
3044
  })();
@@ -3056,11 +3076,11 @@ function runWizardCI(config, options) {
3056
3076
  validateCiOptions(options);
3057
3077
  (async () => {
3058
3078
  const path = await import("path");
3059
- const { buildSession } = await import("./wizard-session-y304gEEI.js");
3060
- const { readEnvironment } = await import("./environment-DIOtLqTQ.js").then((n) => n.t);
3079
+ const { buildSession } = await import("./wizard-session-wPJtNl4c.js");
3080
+ const { readEnvironment } = await import("./environment-Dk_dWk3t.js").then((n) => n.t);
3061
3081
  const { readApiKeyFromEnv } = await import("./env-api-key-MlzJYAvt.js").then((n) => n.t);
3062
- const { configureLogFileFromEnvironment, logToFile } = await import("./debug--gQGudnY.js");
3063
- const { wizardAbort, WizardError } = await import("./wizard-abort-Dl8WJQgJ.js");
3082
+ const { configureLogFileFromEnvironment, logToFile } = await import("./debug-CTViFiF-.js");
3083
+ const { wizardAbort, WizardError } = await import("./wizard-abort-D8XZdVAR.js");
3064
3084
  configureLogFileFromEnvironment();
3065
3085
  const env = readEnvironment();
3066
3086
  const apiKey = options.apiKey ?? readApiKeyFromEnv() ?? void 0;
@@ -3108,7 +3128,7 @@ function runWizardCI(config, options) {
3108
3128
  })
3109
3129
  });
3110
3130
  }
3111
- const { runAgent } = await import("./agent-runner-Dw8cjZoN.js");
3131
+ const { runAgent } = await import("./agent-runner-w2Qu9M13.js");
3112
3132
  await runAgent(config, session);
3113
3133
  } catch (error) {
3114
3134
  const errorMessage = error instanceof Error ? error.message : String(error);
@@ -3262,7 +3282,7 @@ async function runDoctorCI(options) {
3262
3282
  getUI().intro("Welcome to the PostHog setup wizard");
3263
3283
  getUI().log.info("Running posthog-doctor in CI mode");
3264
3284
  try {
3265
- const { getOrAskForProjectData } = await import("./setup-utils-Df9ezAjZ.js").then((n) => n.r);
3285
+ const { getOrAskForProjectData } = await import("./setup-utils-B9xqAXXl.js").then((n) => n.r);
3266
3286
  const { host, accessToken, projectId } = await getOrAskForProjectData({
3267
3287
  signup: false,
3268
3288
  ci: true,
@@ -3279,7 +3299,7 @@ async function runDoctorCI(options) {
3279
3299
  for (const issue of sorted) getUI().log.info(` • [${issue.severity}] ${getKindMeta(issue.kind).title}`);
3280
3300
  process.exit(1);
3281
3301
  } catch (error) {
3282
- const { ApiError } = await import("./api-B3MWP3vm.js").then((n) => n.n);
3302
+ const { ApiError } = await import("./api-eUlUinVy.js").then((n) => n.n);
3283
3303
  const message = error instanceof ApiError && error.statusCode === 401 ? "Your PostHog API key is invalid or expired." : error instanceof Error ? error.message : String(error);
3284
3304
  getUI().log.error(`Doctor failed: ${message}`);
3285
3305
  process.exit(1);
@@ -3420,6 +3440,15 @@ if (!satisfies(process.version, NODE_VERSION_RANGE)) {
3420
3440
  console.log(`PostHog wizard requires Node.js ${NODE_VERSION_RANGE}. You are using Node.js ${process.version}. Please upgrade your Node.js version.`);
3421
3441
  process.exit(1);
3422
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
+ }
3423
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();
3424
3453
  //#endregion
3425
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 };