@posthog/wizard 2.34.0 → 2.35.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 (80) hide show
  1. package/dist/{add-mcp-server-to-clients-BjH4z7gH.js → add-mcp-server-to-clients-to65gLPl.js} +5 -5
  2. package/dist/{add-mcp-server-to-clients-BjH4z7gH.js.map → add-mcp-server-to-clients-to65gLPl.js.map} +1 -1
  3. package/dist/{agent-interface-BcUv1qeh.js → agent-interface-CXL9i_vX.js} +39 -10
  4. package/dist/agent-interface-CXL9i_vX.js.map +1 -0
  5. package/dist/{agent-runner-8g_pDAVs.js → agent-runner-CCTTG_Rn.js} +13 -12
  6. package/dist/agent-runner-CCTTG_Rn.js.map +1 -0
  7. package/dist/{analytics-DQ8IS1Hu.js → analytics-DP_j88IC.js} +2 -2
  8. package/dist/{analytics-DQ8IS1Hu.js.map → analytics-DP_j88IC.js.map} +1 -1
  9. package/dist/{api-EghEV_u9.js → api-Bdxv7mWH.js} +3 -3
  10. package/dist/{api-EghEV_u9.js.map → api-Bdxv7mWH.js.map} +1 -1
  11. package/dist/bin.js +78 -61
  12. package/dist/bin.js.map +1 -1
  13. package/dist/{ci-install-ouGSf4zp.js → ci-install-BO-KLPLD.js} +5 -5
  14. package/dist/ci-install-BO-KLPLD.js.map +1 -0
  15. package/dist/{debug-BM7yop-T.js → debug-Clw8ctxh.js} +1 -1
  16. package/dist/{debug-Cn4L5Ype.js → debug-DXWxKT5f.js} +3 -4
  17. package/dist/debug-DXWxKT5f.js.map +1 -0
  18. package/dist/{defaults-DII5CAog.js → defaults-4rSse24X.js} +1 -1
  19. package/dist/{defaults-DII5CAog.js.map → defaults-4rSse24X.js.map} +1 -1
  20. package/dist/{env-api-key-MlzJYAvt.js → env-api-key-B3gE9Un0.js} +1 -1
  21. package/dist/{env-api-key-MlzJYAvt.js.map → env-api-key-B3gE9Un0.js.map} +1 -1
  22. package/dist/{environment-D2WUIm8o.js → environment-C4HyCWTC.js} +3 -3
  23. package/dist/{environment-D2WUIm8o.js.map → environment-C4HyCWTC.js.map} +1 -1
  24. package/dist/{file-utils-CdQn6073.js → file-utils-CW8XbbZP.js} +2 -2
  25. package/dist/{file-utils-CdQn6073.js.map → file-utils-CW8XbbZP.js.map} +1 -1
  26. package/dist/{headless-ui-CSqtmW-d.js → headless-ui-BoZYhNpE.js} +2 -2
  27. package/dist/{headless-ui-CSqtmW-d.js.map → headless-ui-BoZYhNpE.js.map} +1 -1
  28. package/dist/host-resolution-Dw0fS8h5.js +115 -0
  29. package/dist/host-resolution-Dw0fS8h5.js.map +1 -0
  30. package/dist/{interactive-CFGcWw43.js → interactive-pwrc7QM-.js} +2 -2
  31. package/dist/{interactive-CFGcWw43.js.map → interactive-pwrc7QM-.js.map} +1 -1
  32. package/dist/{mcp-prompt-streaming-XZSpcXkG.js → mcp-prompt-streaming-DZjjoeu3.js} +5 -5
  33. package/dist/mcp-prompt-streaming-DZjjoeu3.js.map +1 -0
  34. package/dist/{non-interactive-D6eksWIw.js → non-interactive-BW-MZYrP.js} +2 -2
  35. package/dist/{non-interactive-D6eksWIw.js.map → non-interactive-BW-MZYrP.js.map} +1 -1
  36. package/dist/{package-manager-Dozr4x6K.js → package-manager-BgXgJ1Mu.js} +2 -2
  37. package/dist/{package-manager-Dozr4x6K.js.map → package-manager-BgXgJ1Mu.js.map} +1 -1
  38. package/dist/{playground-BB2O8GyY.js → playground-xuLBqzJM.js} +6 -6
  39. package/dist/{playground-BB2O8GyY.js.map → playground-xuLBqzJM.js.map} +1 -1
  40. package/dist/{posthog-DU6JXG00.js → posthog-BrLFkaji.js} +1 -1
  41. package/dist/{posthog-DU6JXG00.js.map → posthog-BrLFkaji.js.map} +1 -1
  42. package/dist/{posthog-integration-C3m_uR5A.js → posthog-integration-Bj9WmwDq.js} +16 -16
  43. package/dist/{posthog-integration-C3m_uR5A.js.map → posthog-integration-Bj9WmwDq.js.map} +1 -1
  44. package/dist/{provisioning-wMzPfaaP.js → provisioning-BF2reo5_.js} +28 -9
  45. package/dist/provisioning-BF2reo5_.js.map +1 -0
  46. package/dist/{registry-BfTeAX2z.js → registry-Dj17F0a-.js} +4 -4
  47. package/dist/{registry-BfTeAX2z.js.map → registry-Dj17F0a-.js.map} +1 -1
  48. package/dist/{setup-utils-B0oz3raQ.js → setup-utils-DyTlaGOV.js} +56 -29
  49. package/dist/setup-utils-DyTlaGOV.js.map +1 -0
  50. package/dist/{start-tui-B9qDcoGA.js → start-tui-S4fBBfmO.js} +46 -27
  51. package/dist/{start-tui-B9qDcoGA.js.map → start-tui-S4fBBfmO.js.map} +1 -1
  52. package/dist/{steps-BhERMRRI.js → steps-CHgikk6q.js} +7 -7
  53. package/dist/{steps-BhERMRRI.js.map → steps-CHgikk6q.js.map} +1 -1
  54. package/dist/{store-J2Rv955W.js → store-vr5j37CU.js} +4 -4
  55. package/dist/{store-J2Rv955W.js.map → store-vr5j37CU.js.map} +1 -1
  56. package/dist/{task-stream-CPjpHFhI.js → task-stream-BVF6gi8x.js} +3 -3
  57. package/dist/{task-stream-CPjpHFhI.js.map → task-stream-BVF6gi8x.js.map} +1 -1
  58. package/dist/{telemetry-BTLJ-YnG.js → telemetry-CR-ilpWe.js} +3 -3
  59. package/dist/{telemetry-BTLJ-YnG.js.map → telemetry-CR-ilpWe.js.map} +1 -1
  60. package/dist/{terminal-UwqFnPrL.js → terminal-uzjco-wz.js} +13 -13
  61. package/dist/{terminal-UwqFnPrL.js.map → terminal-uzjco-wz.js.map} +1 -1
  62. package/dist/urls-ChWit8SE.js +67 -0
  63. package/dist/urls-ChWit8SE.js.map +1 -0
  64. package/dist/{wizard-abort-DqeMgCVr.js → wizard-abort-BE_j8xUt.js} +4 -4
  65. package/dist/{wizard-abort-DqeMgCVr.js.map → wizard-abort-BE_j8xUt.js.map} +1 -1
  66. package/dist/{wizard-abort-BAB8yvGF.js → wizard-abort-CNYxdjJl.js} +1 -1
  67. package/dist/{wizard-session-CN55LYyZ.js → wizard-session-BHoLQueN.js} +2 -1
  68. package/dist/wizard-session-BHoLQueN.js.map +1 -0
  69. package/dist/{wizard-session-BKEdX9mO.js → wizard-session-D0PJ9lsl.js} +1 -1
  70. package/package.json +1 -1
  71. package/dist/agent-interface-BcUv1qeh.js.map +0 -1
  72. package/dist/agent-runner-8g_pDAVs.js.map +0 -1
  73. package/dist/ci-install-ouGSf4zp.js.map +0 -1
  74. package/dist/debug-Cn4L5Ype.js.map +0 -1
  75. package/dist/mcp-prompt-streaming-XZSpcXkG.js.map +0 -1
  76. package/dist/provisioning-wMzPfaaP.js.map +0 -1
  77. package/dist/setup-utils-B0oz3raQ.js.map +0 -1
  78. package/dist/urls-DAVzgHGZ.js +0 -35
  79. package/dist/urls-DAVzgHGZ.js.map +0 -1
  80. package/dist/wizard-session-CN55LYyZ.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"api-EghEV_u9.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-Bdxv7mWH.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,18 +1,19 @@
1
1
  #!/usr/bin/env node
2
- import { I as POSTHOG_DOCS_URL, Q as WIZARD_USER_AGENT, a as getLogFilePath, et as getSkillsBaseUrl, h as LoggingUI, m as setUI, p as getUI, r as debug, s as logToFile, tt as VERSION } from "./debug-Cn4L5Ype.js";
3
- import { t as analytics } from "./analytics-DQ8IS1Hu.js";
4
- import { r as setEntryCommand } from "./telemetry-BTLJ-YnG.js";
5
- import { n as isUsingTypeScript } from "./setup-utils-B0oz3raQ.js";
6
- import { a as getUiHostFromHost, n as getCloudUrlFromRegion } from "./urls-DAVzgHGZ.js";
7
- import { o as handleApiError } from "./api-EghEV_u9.js";
8
- import "./wizard-session-CN55LYyZ.js";
9
- import { r as runCleanups } from "./wizard-abort-DqeMgCVr.js";
10
- import { n as isNonInteractiveEnvironment } from "./environment-D2WUIm8o.js";
11
- import { D as AUDIT_REPORT_FILE, E as AUDIT_CHECKS_KEY, T as AUDIT_CHECKS_FILE, _ as SETUP_REPORT_FILE, b as fetchSkillMenu, f as AgentSignals, l as recoverOrphanedSettingsBackups, v as WIZARD_TOOL_NAMES } from "./agent-interface-BcUv1qeh.js";
12
- import { i as SPINNER_MESSAGE } from "./registry-BfTeAX2z.js";
13
- import { _ as parseRequirementsTxt, a as StatusPeekTrigger, c as isClearBlock, d as Colors, f as Icons, g as parsePyprojectToml, h as parsePipfile, i as PRODUCT_SUITE_BLOCK, n as FUNNEL_BLOCK, p as HEALTH_CHECK_STEP, r as LINE_CHART_BLOCK, t as posthogIntegrationConfig } from "./posthog-integration-C3m_uR5A.js";
14
- import { n as safeReadFile, r as walkProjectFiles, t as IGNORED_DIRS } from "./file-utils-CdQn6073.js";
15
- import { n as readApiKeyFromEnv } from "./env-api-key-MlzJYAvt.js";
2
+ import { $ as getSkillsBaseUrl, I as POSTHOG_DOCS_URL, Z as WIZARD_USER_AGENT, a as getLogFilePath, et as VERSION, h as LoggingUI, m as setUI, p as getUI, r as debug, s as logToFile } from "./debug-DXWxKT5f.js";
3
+ import { t as analytics } from "./analytics-DP_j88IC.js";
4
+ import { r as setEntryCommand } from "./telemetry-CR-ilpWe.js";
5
+ import { n as isUsingTypeScript } from "./setup-utils-DyTlaGOV.js";
6
+ import { o as getUiHostFromHost } from "./urls-ChWit8SE.js";
7
+ import { t as HostResolution } from "./host-resolution-Dw0fS8h5.js";
8
+ import { o as handleApiError } from "./api-Bdxv7mWH.js";
9
+ import "./wizard-session-BHoLQueN.js";
10
+ import { r as runCleanups } from "./wizard-abort-BE_j8xUt.js";
11
+ import { n as isNonInteractiveEnvironment } from "./environment-C4HyCWTC.js";
12
+ import { D as AUDIT_CHECKS_KEY, E as AUDIT_CHECKS_FILE, O as AUDIT_REPORT_FILE, f as AgentSignals, l as recoverOrphanedSettingsBackups, v as SETUP_REPORT_FILE, x as fetchSkillMenu, y as WIZARD_TOOL_NAMES } from "./agent-interface-CXL9i_vX.js";
13
+ import { i as SPINNER_MESSAGE } from "./registry-Dj17F0a-.js";
14
+ import { _ as parseRequirementsTxt, a as StatusPeekTrigger, c as isClearBlock, d as Colors, f as Icons, g as parsePyprojectToml, h as parsePipfile, i as PRODUCT_SUITE_BLOCK, n as FUNNEL_BLOCK, p as HEALTH_CHECK_STEP, r as LINE_CHART_BLOCK, t as posthogIntegrationConfig } from "./posthog-integration-Bj9WmwDq.js";
15
+ import { n as safeReadFile, r as walkProjectFiles, t as IGNORED_DIRS } from "./file-utils-CW8XbbZP.js";
16
+ import { n as readApiKeyFromEnv } from "./env-api-key-B3gE9Un0.js";
16
17
  import { satisfies } from "semver";
17
18
  import yargs from "yargs";
18
19
  import { hideBin } from "yargs/helpers";
@@ -141,6 +142,11 @@ const GLOBAL_OPTIONS = {
141
142
  type: "boolean",
142
143
  hidden: true
143
144
  },
145
+ "base-url": {
146
+ describe: "Override the PostHog base URL (e.g. http://localhost:8010), bypassing region resolution. Pins the API host, cloud URL, and OAuth server.\nenv: POSTHOG_WIZARD_BASE_URL",
147
+ type: "string",
148
+ hidden: true
149
+ },
144
150
  benchmark: {
145
151
  default: false,
146
152
  describe: "Run in benchmark mode with per-phase token tracking\nenv: POSTHOG_WIZARD_BENCHMARK",
@@ -222,14 +228,15 @@ function runProvision(argv) {
222
228
  email: argv.email,
223
229
  region: argv.region.toUpperCase(),
224
230
  name: argv.name ?? "",
231
+ baseUrl: argv.baseUrl,
225
232
  jsonMode
226
233
  });
227
234
  }
228
- async function provision({ email, region, name, jsonMode }) {
235
+ async function provision({ email, region, name, baseUrl, jsonMode }) {
229
236
  try {
230
- const { provisionNewAccount } = await import("./provisioning-wMzPfaaP.js").then((n) => n.n);
237
+ const { provisionNewAccount } = await import("./provisioning-BF2reo5_.js").then((n) => n.n);
231
238
  if (!jsonMode) getUI().log.info(`Provisioning account for ${email} in ${region}...`);
232
- emitResult(await provisionNewAccount(email, name, region), jsonMode);
239
+ emitResult(await provisionNewAccount(email, name, region, { baseUrl }), jsonMode);
233
240
  process.exit(0);
234
241
  } catch (error) {
235
242
  emitError(error, jsonMode);
@@ -292,22 +299,22 @@ const basicIntegrationCommand = {
292
299
  setEntryCommand("integrate");
293
300
  (async () => {
294
301
  if (isHeadless(argv)) {
295
- const { runHeadlessInstall } = await import("./ci-install-ouGSf4zp.js");
302
+ const { runHeadlessInstall } = await import("./ci-install-BO-KLPLD.js");
296
303
  return runHeadlessInstall(argv);
297
304
  }
298
305
  if (argv.ci) {
299
- const { runCIInstall } = await import("./ci-install-ouGSf4zp.js");
306
+ const { runCIInstall } = await import("./ci-install-BO-KLPLD.js");
300
307
  return runCIInstall(argv);
301
308
  }
302
309
  if (isNonInteractiveEnvironment()) {
303
- const { failNonInteractive } = await import("./non-interactive-D6eksWIw.js");
310
+ const { failNonInteractive } = await import("./non-interactive-BW-MZYrP.js");
304
311
  return failNonInteractive();
305
312
  }
306
313
  if (argv.playground) {
307
- const { runPlayground } = await import("./playground-BB2O8GyY.js");
314
+ const { runPlayground } = await import("./playground-xuLBqzJM.js");
308
315
  return runPlayground();
309
316
  }
310
- const { runInteractive } = await import("./interactive-CFGcWw43.js");
317
+ const { runInteractive } = await import("./interactive-pwrc7QM-.js");
311
318
  runInteractive(argv);
312
319
  })();
313
320
  }
@@ -1632,17 +1639,17 @@ const auditRun = async (session) => {
1632
1639
  const baseRun = typeof baseConfig.run === "function" ? await baseConfig.run(session) : baseConfig.run;
1633
1640
  return {
1634
1641
  ...baseRun,
1635
- buildOutroData: (sess, _credentials, cloudRegion) => {
1636
- const cloudUrl = cloudRegion ? getCloudUrlFromRegion(cloudRegion) : void 0;
1637
- const continueUrl = sess.signup && cloudUrl ? `${cloudUrl}/products?source=wizard` : void 0;
1642
+ buildOutroData: (session, _credentials, cloudRegion) => {
1643
+ const cloudUrl = cloudRegion ? HostResolution.fromRegion(cloudRegion, { baseUrl: session.baseUrl }).appHost : void 0;
1644
+ const continueUrl = session.signup && cloudUrl ? `${cloudUrl}/products?source=wizard` : void 0;
1638
1645
  return {
1639
1646
  kind: "success",
1640
1647
  message: baseRun.successMessage,
1641
1648
  reportFile: baseRun.reportFile,
1642
1649
  docsUrl: baseRun.docsUrl,
1643
1650
  continueUrl,
1644
- dashboardUrl: sess.dashboardUrl ?? void 0,
1645
- notebookUrl: sess.notebookUrl ?? void 0
1651
+ dashboardUrl: session.dashboardUrl ?? void 0,
1652
+ notebookUrl: session.notebookUrl ?? void 0
1646
1653
  };
1647
1654
  }
1648
1655
  };
@@ -1798,7 +1805,7 @@ Project context:
1798
1805
  - PostHog Host: ${ctx.host}
1799
1806
  `,
1800
1807
  buildOutroData: (sess, _credentials, cloudRegion) => {
1801
- const cloudUrl = cloudRegion ? getCloudUrlFromRegion(cloudRegion) : void 0;
1808
+ const cloudUrl = cloudRegion ? HostResolution.fromRegion(cloudRegion, { baseUrl: sess.baseUrl }).appHost : void 0;
1802
1809
  return {
1803
1810
  kind: "success",
1804
1811
  message: "Your events audit was successful",
@@ -3836,24 +3843,25 @@ const mcpAddCommand = {
3836
3843
  function runMcpAdd(argv) {
3837
3844
  const features = parseFeatures(argv.features);
3838
3845
  (async () => {
3839
- const { readApiKeyFromEnv } = await import("./env-api-key-MlzJYAvt.js").then((n) => n.t);
3846
+ const { readApiKeyFromEnv } = await import("./env-api-key-B3gE9Un0.js").then((n) => n.t);
3840
3847
  const apiKey = argv.apiKey || readApiKeyFromEnv();
3841
3848
  const debug = argv.debug;
3842
3849
  const localMcp = argv.local;
3843
3850
  try {
3844
- const { startTUI } = await import("./start-tui-B9qDcoGA.js");
3845
- const { buildSession } = await import("./wizard-session-BKEdX9mO.js");
3851
+ const { startTUI } = await import("./start-tui-S4fBBfmO.js");
3852
+ const { buildSession } = await import("./wizard-session-D0PJ9lsl.js");
3846
3853
  const tui = startTUI(VERSION, Program.McpAdd);
3847
3854
  tui.store.session = buildSession({
3848
3855
  debug,
3849
3856
  localMcp,
3850
3857
  mcpFeatures: features,
3851
- apiKey
3858
+ apiKey,
3859
+ baseUrl: argv.baseUrl
3852
3860
  });
3853
3861
  } catch (error) {
3854
3862
  if (!isTUIUnavailable(error)) throw error;
3855
3863
  setUI(new LoggingUI());
3856
- const { addMCPServerToClientsStep } = await import("./add-mcp-server-to-clients-BjH4z7gH.js").then((n) => n.r);
3864
+ const { addMCPServerToClientsStep } = await import("./add-mcp-server-to-clients-to65gLPl.js").then((n) => n.r);
3857
3865
  await addMCPServerToClientsStep({
3858
3866
  local: localMcp,
3859
3867
  features,
@@ -3892,16 +3900,17 @@ function runMcpRemove(argv) {
3892
3900
  const debug = argv.debug;
3893
3901
  const localMcp = argv.local;
3894
3902
  try {
3895
- const { startTUI } = await import("./start-tui-B9qDcoGA.js");
3896
- const { buildSession } = await import("./wizard-session-BKEdX9mO.js");
3903
+ const { startTUI } = await import("./start-tui-S4fBBfmO.js");
3904
+ const { buildSession } = await import("./wizard-session-D0PJ9lsl.js");
3897
3905
  const tui = startTUI(VERSION, Program.McpRemove);
3898
3906
  tui.store.session = buildSession({
3899
3907
  debug,
3900
- localMcp
3908
+ localMcp,
3909
+ baseUrl: argv.baseUrl
3901
3910
  });
3902
3911
  } catch {
3903
3912
  setUI(new LoggingUI());
3904
- const { removeMCPServerFromClientsStep } = await import("./add-mcp-server-to-clients-BjH4z7gH.js").then((n) => n.r);
3913
+ const { removeMCPServerFromClientsStep } = await import("./add-mcp-server-to-clients-to65gLPl.js").then((n) => n.r);
3905
3914
  await removeMCPServerFromClientsStep({ local: localMcp });
3906
3915
  }
3907
3916
  })();
@@ -3923,12 +3932,13 @@ function runMcpTutorial(argv) {
3923
3932
  const debug = argv.debug;
3924
3933
  const localMcp = argv.local;
3925
3934
  try {
3926
- const { startTUI } = await import("./start-tui-B9qDcoGA.js");
3927
- const { buildSession } = await import("./wizard-session-BKEdX9mO.js");
3935
+ const { startTUI } = await import("./start-tui-S4fBBfmO.js");
3936
+ const { buildSession } = await import("./wizard-session-D0PJ9lsl.js");
3928
3937
  const tui = startTUI(VERSION, Program.McpTutorial);
3929
3938
  tui.store.session = buildSession({
3930
3939
  debug,
3931
- localMcp
3940
+ localMcp,
3941
+ baseUrl: argv.baseUrl
3932
3942
  });
3933
3943
  } catch (err) {
3934
3944
  setUI(new LoggingUI());
@@ -3978,10 +3988,10 @@ function runWizard(config, options) {
3978
3988
  (async () => {
3979
3989
  try {
3980
3990
  const installDir = options.installDir || process.cwd();
3981
- const { startTUI } = await import("./start-tui-B9qDcoGA.js");
3982
- const { buildSession, RunPhase } = await import("./wizard-session-BKEdX9mO.js");
3983
- const { TaskStreamPush } = await import("./task-stream-CPjpHFhI.js");
3984
- const { PostHogDestination } = await import("./posthog-DU6JXG00.js");
3991
+ const { startTUI } = await import("./start-tui-S4fBBfmO.js");
3992
+ const { buildSession, RunPhase } = await import("./wizard-session-D0PJ9lsl.js");
3993
+ const { TaskStreamPush } = await import("./task-stream-BVF6gi8x.js");
3994
+ const { PostHogDestination } = await import("./posthog-BrLFkaji.js");
3985
3995
  tui = startTUI(WIZARD_VERSION, config.id);
3986
3996
  const activeTui = tui;
3987
3997
  const session = buildSession({
@@ -3993,6 +4003,7 @@ function runWizard(config, options) {
3993
4003
  apiKey: options.apiKey,
3994
4004
  projectId: options.projectId,
3995
4005
  email: options.email,
4006
+ baseUrl: options.baseUrl,
3996
4007
  benchmark: options.benchmark,
3997
4008
  yaraReport: options.yaraReport,
3998
4009
  noTelemetry: resolveNoTelemetry(options)
@@ -4034,12 +4045,13 @@ function runWizard(config, options) {
4034
4045
  await activeTui.store.getGate("health-check");
4035
4046
  const skipAgent = config.run == null;
4036
4047
  if (skipAgent) {
4037
- const { getOrAskForProjectData } = await import("./setup-utils-B0oz3raQ.js").then((n) => n.r);
4048
+ const { getOrAskForProjectData } = await import("./setup-utils-DyTlaGOV.js").then((n) => n.r);
4038
4049
  const { projectApiKey, host, accessToken, projectId } = await getOrAskForProjectData({
4039
4050
  signup: session.signup,
4040
4051
  ci: session.ci,
4041
4052
  apiKey: session.apiKey,
4042
4053
  projectId: session.projectId,
4054
+ baseUrl: session.baseUrl,
4043
4055
  programId: config.id
4044
4056
  });
4045
4057
  activeTui.store.setCredentials({
@@ -4049,7 +4061,7 @@ function runWizard(config, options) {
4049
4061
  projectId
4050
4062
  });
4051
4063
  } else {
4052
- const { runAgent } = await import("./agent-runner-8g_pDAVs.js");
4064
+ const { runAgent } = await import("./agent-runner-CCTTG_Rn.js");
4053
4065
  await runAgent(config, activeTui.store.session);
4054
4066
  }
4055
4067
  const isDone = () => skipAgent ? activeTui.store.session.outroDismissed : activeTui.store.session.skillsComplete;
@@ -4138,11 +4150,11 @@ function runNonInteractive(config, options, mode) {
4138
4150
  analytics.setTag("build", mode);
4139
4151
  (async () => {
4140
4152
  const path = await import("path");
4141
- const { buildSession, RunPhase, OutroKind } = await import("./wizard-session-BKEdX9mO.js");
4142
- const { readEnvironment } = await import("./environment-D2WUIm8o.js").then((n) => n.t);
4143
- const { readApiKeyFromEnv } = await import("./env-api-key-MlzJYAvt.js").then((n) => n.t);
4144
- const { configureLogFileFromEnvironment, logToFile } = await import("./debug-BM7yop-T.js");
4145
- const { wizardAbort, WizardError } = await import("./wizard-abort-BAB8yvGF.js");
4153
+ const { buildSession, RunPhase, OutroKind } = await import("./wizard-session-D0PJ9lsl.js");
4154
+ const { readEnvironment } = await import("./environment-C4HyCWTC.js").then((n) => n.t);
4155
+ const { readApiKeyFromEnv } = await import("./env-api-key-B3gE9Un0.js").then((n) => n.t);
4156
+ const { configureLogFileFromEnvironment, logToFile } = await import("./debug-Clw8ctxh.js");
4157
+ const { wizardAbort, WizardError } = await import("./wizard-abort-CNYxdjJl.js");
4146
4158
  configureLogFileFromEnvironment();
4147
4159
  const env = readEnvironment();
4148
4160
  const apiKey = options.apiKey ?? readApiKeyFromEnv() ?? void 0;
@@ -4156,6 +4168,7 @@ function runNonInteractive(config, options, mode) {
4156
4168
  apiKey,
4157
4169
  email: options.email,
4158
4170
  projectId: options.projectId,
4171
+ baseUrl: options.baseUrl,
4159
4172
  benchmark: options.benchmark,
4160
4173
  yaraReport: options.yaraReport,
4161
4174
  noTelemetry: resolveNoTelemetry(options),
@@ -4169,9 +4182,9 @@ function runNonInteractive(config, options, mode) {
4169
4182
  let store = null;
4170
4183
  let taskStream = null;
4171
4184
  if (mode === "headless") {
4172
- const { WizardStore } = await import("./store-J2Rv955W.js").then((n) => n.n);
4173
- const { HeadlessUI } = await import("./headless-ui-CSqtmW-d.js");
4174
- const { TaskStreamPush, PostHogDestination } = await import("./task-stream-CPjpHFhI.js");
4185
+ const { WizardStore } = await import("./store-vr5j37CU.js").then((n) => n.n);
4186
+ const { HeadlessUI } = await import("./headless-ui-BoZYhNpE.js");
4187
+ const { TaskStreamPush, PostHogDestination } = await import("./task-stream-BVF6gi8x.js");
4175
4188
  store = new WizardStore(config.id);
4176
4189
  store.session = session;
4177
4190
  setUI(new HeadlessUI(store));
@@ -4226,7 +4239,7 @@ function runNonInteractive(config, options, mode) {
4226
4239
  });
4227
4240
  }
4228
4241
  }
4229
- const { runAgent } = await import("./agent-runner-8g_pDAVs.js");
4242
+ const { runAgent } = await import("./agent-runner-CCTTG_Rn.js");
4230
4243
  await runAgent(config, session);
4231
4244
  await settleStream(RunPhase.Completed);
4232
4245
  } catch (error) {
@@ -5153,12 +5166,13 @@ async function runDoctorCI(options) {
5153
5166
  getUI().intro("Welcome to the PostHog setup wizard");
5154
5167
  getUI().log.info("Running posthog-doctor in CI mode");
5155
5168
  try {
5156
- const { getOrAskForProjectData } = await import("./setup-utils-B0oz3raQ.js").then((n) => n.r);
5169
+ const { getOrAskForProjectData } = await import("./setup-utils-DyTlaGOV.js").then((n) => n.r);
5157
5170
  const { host, accessToken, projectId } = await getOrAskForProjectData({
5158
5171
  signup: false,
5159
5172
  ci: true,
5160
5173
  apiKey,
5161
- projectId: options.projectId ? Number(options.projectId) : void 0
5174
+ projectId: options.projectId ? Number(options.projectId) : void 0,
5175
+ baseUrl: options.baseUrl
5162
5176
  });
5163
5177
  const issues = await fetchHealthIssues(accessToken, host, projectId);
5164
5178
  if (issues.length === 0) {
@@ -5170,7 +5184,7 @@ async function runDoctorCI(options) {
5170
5184
  for (const issue of sorted) getUI().log.info(` • [${issue.severity}] ${getKindMeta(issue.kind).title}`);
5171
5185
  process.exit(1);
5172
5186
  } catch (error) {
5173
- const { ApiError } = await import("./api-EghEV_u9.js").then((n) => n.n);
5187
+ const { ApiError } = await import("./api-Bdxv7mWH.js").then((n) => n.n);
5174
5188
  const message = error instanceof ApiError && error.statusCode === 401 ? "Your PostHog API key is invalid or expired." : error instanceof Error ? error.message : String(error);
5175
5189
  getUI().log.error(`Doctor failed: ${message}`);
5176
5190
  process.exit(1);
@@ -5247,10 +5261,13 @@ function runSlackConnect(argv) {
5247
5261
  (async () => {
5248
5262
  const debug = argv.debug;
5249
5263
  try {
5250
- const { startTUI } = await import("./start-tui-B9qDcoGA.js");
5251
- const { buildSession } = await import("./wizard-session-BKEdX9mO.js");
5264
+ const { startTUI } = await import("./start-tui-S4fBBfmO.js");
5265
+ const { buildSession } = await import("./wizard-session-D0PJ9lsl.js");
5252
5266
  const tui = startTUI(VERSION, Program.SlackConnect);
5253
- tui.store.session = buildSession({ debug });
5267
+ tui.store.session = buildSession({
5268
+ debug,
5269
+ baseUrl: argv.baseUrl
5270
+ });
5254
5271
  } catch (err) {
5255
5272
  setUI(new LoggingUI());
5256
5273
  getUI().log.error(`Connecting Slack requires an interactive terminal. ${err instanceof Error ? err.message : String(err)}`);