@posthog/wizard 2.33.0 → 2.34.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 (63) hide show
  1. package/dist/{add-mcp-server-to-clients-Dhq75Hda.js → add-mcp-server-to-clients-BjH4z7gH.js} +4 -4
  2. package/dist/{add-mcp-server-to-clients-Dhq75Hda.js.map → add-mcp-server-to-clients-BjH4z7gH.js.map} +1 -1
  3. package/dist/{agent-interface-DCeQ5Oiw.js → agent-interface-BcUv1qeh.js} +329 -44
  4. package/dist/agent-interface-BcUv1qeh.js.map +1 -0
  5. package/dist/{agent-runner-BRajaO84.js → agent-runner-8g_pDAVs.js} +29 -11
  6. package/dist/agent-runner-8g_pDAVs.js.map +1 -0
  7. package/dist/{analytics-CU4o3eF8.js → analytics-DQ8IS1Hu.js} +2 -2
  8. package/dist/{analytics-CU4o3eF8.js.map → analytics-DQ8IS1Hu.js.map} +1 -1
  9. package/dist/{api-BBRfHEZ-.js → api-EghEV_u9.js} +3 -3
  10. package/dist/{api-BBRfHEZ-.js.map → api-EghEV_u9.js.map} +1 -1
  11. package/dist/bin.js +35 -35
  12. package/dist/check-screens.tsx +25 -0
  13. package/dist/{ci-install-D-otkGW6.js → ci-install-ouGSf4zp.js} +4 -4
  14. package/dist/{ci-install-D-otkGW6.js.map → ci-install-ouGSf4zp.js.map} +1 -1
  15. package/dist/{debug-BewTLNNr.js → debug-BM7yop-T.js} +1 -1
  16. package/dist/{debug-BGMe1wP6.js → debug-Cn4L5Ype.js} +2 -2
  17. package/dist/{debug-BGMe1wP6.js.map → debug-Cn4L5Ype.js.map} +1 -1
  18. package/dist/{environment-G41UFzou.js → environment-D2WUIm8o.js} +3 -3
  19. package/dist/{environment-G41UFzou.js.map → environment-D2WUIm8o.js.map} +1 -1
  20. package/dist/{file-utils-D9InAvZd.js → file-utils-CdQn6073.js} +2 -2
  21. package/dist/{file-utils-D9InAvZd.js.map → file-utils-CdQn6073.js.map} +1 -1
  22. package/dist/{headless-ui-xjHVVUqe.js → headless-ui-CSqtmW-d.js} +2 -2
  23. package/dist/{headless-ui-xjHVVUqe.js.map → headless-ui-CSqtmW-d.js.map} +1 -1
  24. package/dist/{interactive-D2CKikzz.js → interactive-CFGcWw43.js} +2 -2
  25. package/dist/{interactive-D2CKikzz.js.map → interactive-CFGcWw43.js.map} +1 -1
  26. package/dist/{mcp-prompt-streaming-FrArGwfv.js → mcp-prompt-streaming-XZSpcXkG.js} +9 -6
  27. package/dist/mcp-prompt-streaming-XZSpcXkG.js.map +1 -0
  28. package/dist/{non-interactive-BXx6Q-D0.js → non-interactive-D6eksWIw.js} +2 -2
  29. package/dist/{non-interactive-BXx6Q-D0.js.map → non-interactive-D6eksWIw.js.map} +1 -1
  30. package/dist/{package-manager-D9ojA4jO.js → package-manager-Dozr4x6K.js} +2 -2
  31. package/dist/{package-manager-D9ojA4jO.js.map → package-manager-Dozr4x6K.js.map} +1 -1
  32. package/dist/{playground-Bgtxrusl.js → playground-BB2O8GyY.js} +5 -5
  33. package/dist/{playground-Bgtxrusl.js.map → playground-BB2O8GyY.js.map} +1 -1
  34. package/dist/{posthog-integration-gnC9v4kg.js → posthog-integration-C3m_uR5A.js} +12 -12
  35. package/dist/{posthog-integration-gnC9v4kg.js.map → posthog-integration-C3m_uR5A.js.map} +1 -1
  36. package/dist/{provisioning-C3qglLdc.js → provisioning-wMzPfaaP.js} +3 -3
  37. package/dist/{provisioning-C3qglLdc.js.map → provisioning-wMzPfaaP.js.map} +1 -1
  38. package/dist/{registry-BVrvFTZ0.js → registry-BfTeAX2z.js} +4 -4
  39. package/dist/{registry-BVrvFTZ0.js.map → registry-BfTeAX2z.js.map} +1 -1
  40. package/dist/{setup-utils-CanVlGbX.js → setup-utils-B0oz3raQ.js} +53 -11
  41. package/dist/setup-utils-B0oz3raQ.js.map +1 -0
  42. package/dist/{start-tui-YE7bybIr.js → start-tui-B9qDcoGA.js} +148 -29
  43. package/dist/{start-tui-YE7bybIr.js.map → start-tui-B9qDcoGA.js.map} +1 -1
  44. package/dist/{steps-N20e4IoE.js → steps-BhERMRRI.js} +7 -7
  45. package/dist/{steps-N20e4IoE.js.map → steps-BhERMRRI.js.map} +1 -1
  46. package/dist/{store-D15C9YSW.js → store-J2Rv955W.js} +3 -3
  47. package/dist/{store-D15C9YSW.js.map → store-J2Rv955W.js.map} +1 -1
  48. package/dist/{telemetry-DknCDWP6.js → telemetry-BTLJ-YnG.js} +3 -3
  49. package/dist/{telemetry-DknCDWP6.js.map → telemetry-BTLJ-YnG.js.map} +1 -1
  50. package/dist/{terminal-Cvv0a-7Q.js → terminal-UwqFnPrL.js} +83 -32
  51. package/dist/terminal-UwqFnPrL.js.map +1 -0
  52. package/dist/{urls-DrR6F_A3.js → urls-DAVzgHGZ.js} +2 -2
  53. package/dist/{urls-DrR6F_A3.js.map → urls-DAVzgHGZ.js.map} +1 -1
  54. package/dist/{wizard-abort-DMvS0YXD.js → wizard-abort-BAB8yvGF.js} +1 -1
  55. package/dist/{wizard-abort-Cw818xPr.js → wizard-abort-DqeMgCVr.js} +3 -3
  56. package/dist/{wizard-abort-Cw818xPr.js.map → wizard-abort-DqeMgCVr.js.map} +1 -1
  57. package/dist/wizard-ui-WZ48rUgr.js.map +1 -1
  58. package/package.json +1 -1
  59. package/dist/agent-interface-DCeQ5Oiw.js.map +0 -1
  60. package/dist/agent-runner-BRajaO84.js.map +0 -1
  61. package/dist/mcp-prompt-streaming-FrArGwfv.js.map +0 -1
  62. package/dist/setup-utils-CanVlGbX.js.map +0 -1
  63. package/dist/terminal-Cvv0a-7Q.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"api-BBRfHEZ-.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-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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"}
package/dist/bin.js CHANGED
@@ -1,17 +1,17 @@
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-BGMe1wP6.js";
3
- import { t as analytics } from "./analytics-CU4o3eF8.js";
4
- import { r as setEntryCommand } from "./telemetry-DknCDWP6.js";
5
- import { n as isUsingTypeScript } from "./setup-utils-CanVlGbX.js";
6
- import { a as getUiHostFromHost, n as getCloudUrlFromRegion } from "./urls-DrR6F_A3.js";
7
- import { o as handleApiError } from "./api-BBRfHEZ-.js";
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
8
  import "./wizard-session-CN55LYyZ.js";
9
- import { r as runCleanups } from "./wizard-abort-Cw818xPr.js";
10
- import { n as isNonInteractiveEnvironment } from "./environment-G41UFzou.js";
11
- import { C as AUDIT_CHECKS_FILE, T as AUDIT_REPORT_FILE, c as recoverOrphanedSettingsBackups, g as WIZARD_TOOL_NAMES, h as SETUP_REPORT_FILE, u as AgentSignals, v as fetchSkillMenu, w as AUDIT_CHECKS_KEY } from "./agent-interface-DCeQ5Oiw.js";
12
- import { i as SPINNER_MESSAGE } from "./registry-BVrvFTZ0.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-gnC9v4kg.js";
14
- import { n as safeReadFile, r as walkProjectFiles, t as IGNORED_DIRS } from "./file-utils-D9InAvZd.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
15
  import { n as readApiKeyFromEnv } from "./env-api-key-MlzJYAvt.js";
16
16
  import { satisfies } from "semver";
17
17
  import yargs from "yargs";
@@ -227,7 +227,7 @@ function runProvision(argv) {
227
227
  }
228
228
  async function provision({ email, region, name, jsonMode }) {
229
229
  try {
230
- const { provisionNewAccount } = await import("./provisioning-C3qglLdc.js").then((n) => n.n);
230
+ const { provisionNewAccount } = await import("./provisioning-wMzPfaaP.js").then((n) => n.n);
231
231
  if (!jsonMode) getUI().log.info(`Provisioning account for ${email} in ${region}...`);
232
232
  emitResult(await provisionNewAccount(email, name, region), jsonMode);
233
233
  process.exit(0);
@@ -292,22 +292,22 @@ const basicIntegrationCommand = {
292
292
  setEntryCommand("integrate");
293
293
  (async () => {
294
294
  if (isHeadless(argv)) {
295
- const { runHeadlessInstall } = await import("./ci-install-D-otkGW6.js");
295
+ const { runHeadlessInstall } = await import("./ci-install-ouGSf4zp.js");
296
296
  return runHeadlessInstall(argv);
297
297
  }
298
298
  if (argv.ci) {
299
- const { runCIInstall } = await import("./ci-install-D-otkGW6.js");
299
+ const { runCIInstall } = await import("./ci-install-ouGSf4zp.js");
300
300
  return runCIInstall(argv);
301
301
  }
302
302
  if (isNonInteractiveEnvironment()) {
303
- const { failNonInteractive } = await import("./non-interactive-BXx6Q-D0.js");
303
+ const { failNonInteractive } = await import("./non-interactive-D6eksWIw.js");
304
304
  return failNonInteractive();
305
305
  }
306
306
  if (argv.playground) {
307
- const { runPlayground } = await import("./playground-Bgtxrusl.js");
307
+ const { runPlayground } = await import("./playground-BB2O8GyY.js");
308
308
  return runPlayground();
309
309
  }
310
- const { runInteractive } = await import("./interactive-D2CKikzz.js");
310
+ const { runInteractive } = await import("./interactive-CFGcWw43.js");
311
311
  runInteractive(argv);
312
312
  })();
313
313
  }
@@ -3841,7 +3841,7 @@ function runMcpAdd(argv) {
3841
3841
  const debug = argv.debug;
3842
3842
  const localMcp = argv.local;
3843
3843
  try {
3844
- const { startTUI } = await import("./start-tui-YE7bybIr.js");
3844
+ const { startTUI } = await import("./start-tui-B9qDcoGA.js");
3845
3845
  const { buildSession } = await import("./wizard-session-BKEdX9mO.js");
3846
3846
  const tui = startTUI(VERSION, Program.McpAdd);
3847
3847
  tui.store.session = buildSession({
@@ -3853,7 +3853,7 @@ function runMcpAdd(argv) {
3853
3853
  } catch (error) {
3854
3854
  if (!isTUIUnavailable(error)) throw error;
3855
3855
  setUI(new LoggingUI());
3856
- const { addMCPServerToClientsStep } = await import("./add-mcp-server-to-clients-Dhq75Hda.js").then((n) => n.r);
3856
+ const { addMCPServerToClientsStep } = await import("./add-mcp-server-to-clients-BjH4z7gH.js").then((n) => n.r);
3857
3857
  await addMCPServerToClientsStep({
3858
3858
  local: localMcp,
3859
3859
  features,
@@ -3892,7 +3892,7 @@ function runMcpRemove(argv) {
3892
3892
  const debug = argv.debug;
3893
3893
  const localMcp = argv.local;
3894
3894
  try {
3895
- const { startTUI } = await import("./start-tui-YE7bybIr.js");
3895
+ const { startTUI } = await import("./start-tui-B9qDcoGA.js");
3896
3896
  const { buildSession } = await import("./wizard-session-BKEdX9mO.js");
3897
3897
  const tui = startTUI(VERSION, Program.McpRemove);
3898
3898
  tui.store.session = buildSession({
@@ -3901,7 +3901,7 @@ function runMcpRemove(argv) {
3901
3901
  });
3902
3902
  } catch {
3903
3903
  setUI(new LoggingUI());
3904
- const { removeMCPServerFromClientsStep } = await import("./add-mcp-server-to-clients-Dhq75Hda.js").then((n) => n.r);
3904
+ const { removeMCPServerFromClientsStep } = await import("./add-mcp-server-to-clients-BjH4z7gH.js").then((n) => n.r);
3905
3905
  await removeMCPServerFromClientsStep({ local: localMcp });
3906
3906
  }
3907
3907
  })();
@@ -3923,7 +3923,7 @@ function runMcpTutorial(argv) {
3923
3923
  const debug = argv.debug;
3924
3924
  const localMcp = argv.local;
3925
3925
  try {
3926
- const { startTUI } = await import("./start-tui-YE7bybIr.js");
3926
+ const { startTUI } = await import("./start-tui-B9qDcoGA.js");
3927
3927
  const { buildSession } = await import("./wizard-session-BKEdX9mO.js");
3928
3928
  const tui = startTUI(VERSION, Program.McpTutorial);
3929
3929
  tui.store.session = buildSession({
@@ -3978,7 +3978,7 @@ function runWizard(config, options) {
3978
3978
  (async () => {
3979
3979
  try {
3980
3980
  const installDir = options.installDir || process.cwd();
3981
- const { startTUI } = await import("./start-tui-YE7bybIr.js");
3981
+ const { startTUI } = await import("./start-tui-B9qDcoGA.js");
3982
3982
  const { buildSession, RunPhase } = await import("./wizard-session-BKEdX9mO.js");
3983
3983
  const { TaskStreamPush } = await import("./task-stream-CPjpHFhI.js");
3984
3984
  const { PostHogDestination } = await import("./posthog-DU6JXG00.js");
@@ -4034,7 +4034,7 @@ function runWizard(config, options) {
4034
4034
  await activeTui.store.getGate("health-check");
4035
4035
  const skipAgent = config.run == null;
4036
4036
  if (skipAgent) {
4037
- const { getOrAskForProjectData } = await import("./setup-utils-CanVlGbX.js").then((n) => n.r);
4037
+ const { getOrAskForProjectData } = await import("./setup-utils-B0oz3raQ.js").then((n) => n.r);
4038
4038
  const { projectApiKey, host, accessToken, projectId } = await getOrAskForProjectData({
4039
4039
  signup: session.signup,
4040
4040
  ci: session.ci,
@@ -4049,7 +4049,7 @@ function runWizard(config, options) {
4049
4049
  projectId
4050
4050
  });
4051
4051
  } else {
4052
- const { runAgent } = await import("./agent-runner-BRajaO84.js");
4052
+ const { runAgent } = await import("./agent-runner-8g_pDAVs.js");
4053
4053
  await runAgent(config, activeTui.store.session);
4054
4054
  }
4055
4055
  const isDone = () => skipAgent ? activeTui.store.session.outroDismissed : activeTui.store.session.skillsComplete;
@@ -4139,10 +4139,10 @@ function runNonInteractive(config, options, mode) {
4139
4139
  (async () => {
4140
4140
  const path = await import("path");
4141
4141
  const { buildSession, RunPhase, OutroKind } = await import("./wizard-session-BKEdX9mO.js");
4142
- const { readEnvironment } = await import("./environment-G41UFzou.js").then((n) => n.t);
4142
+ const { readEnvironment } = await import("./environment-D2WUIm8o.js").then((n) => n.t);
4143
4143
  const { readApiKeyFromEnv } = await import("./env-api-key-MlzJYAvt.js").then((n) => n.t);
4144
- const { configureLogFileFromEnvironment, logToFile } = await import("./debug-BewTLNNr.js");
4145
- const { wizardAbort, WizardError } = await import("./wizard-abort-DMvS0YXD.js");
4144
+ const { configureLogFileFromEnvironment, logToFile } = await import("./debug-BM7yop-T.js");
4145
+ const { wizardAbort, WizardError } = await import("./wizard-abort-BAB8yvGF.js");
4146
4146
  configureLogFileFromEnvironment();
4147
4147
  const env = readEnvironment();
4148
4148
  const apiKey = options.apiKey ?? readApiKeyFromEnv() ?? void 0;
@@ -4169,8 +4169,8 @@ function runNonInteractive(config, options, mode) {
4169
4169
  let store = null;
4170
4170
  let taskStream = null;
4171
4171
  if (mode === "headless") {
4172
- const { WizardStore } = await import("./store-D15C9YSW.js").then((n) => n.n);
4173
- const { HeadlessUI } = await import("./headless-ui-xjHVVUqe.js");
4172
+ const { WizardStore } = await import("./store-J2Rv955W.js").then((n) => n.n);
4173
+ const { HeadlessUI } = await import("./headless-ui-CSqtmW-d.js");
4174
4174
  const { TaskStreamPush, PostHogDestination } = await import("./task-stream-CPjpHFhI.js");
4175
4175
  store = new WizardStore(config.id);
4176
4176
  store.session = session;
@@ -4226,7 +4226,7 @@ function runNonInteractive(config, options, mode) {
4226
4226
  });
4227
4227
  }
4228
4228
  }
4229
- const { runAgent } = await import("./agent-runner-BRajaO84.js");
4229
+ const { runAgent } = await import("./agent-runner-8g_pDAVs.js");
4230
4230
  await runAgent(config, session);
4231
4231
  await settleStream(RunPhase.Completed);
4232
4232
  } catch (error) {
@@ -5153,7 +5153,7 @@ async function runDoctorCI(options) {
5153
5153
  getUI().intro("Welcome to the PostHog setup wizard");
5154
5154
  getUI().log.info("Running posthog-doctor in CI mode");
5155
5155
  try {
5156
- const { getOrAskForProjectData } = await import("./setup-utils-CanVlGbX.js").then((n) => n.r);
5156
+ const { getOrAskForProjectData } = await import("./setup-utils-B0oz3raQ.js").then((n) => n.r);
5157
5157
  const { host, accessToken, projectId } = await getOrAskForProjectData({
5158
5158
  signup: false,
5159
5159
  ci: true,
@@ -5170,7 +5170,7 @@ async function runDoctorCI(options) {
5170
5170
  for (const issue of sorted) getUI().log.info(` • [${issue.severity}] ${getKindMeta(issue.kind).title}`);
5171
5171
  process.exit(1);
5172
5172
  } catch (error) {
5173
- const { ApiError } = await import("./api-BBRfHEZ-.js").then((n) => n.n);
5173
+ const { ApiError } = await import("./api-EghEV_u9.js").then((n) => n.n);
5174
5174
  const message = error instanceof ApiError && error.statusCode === 401 ? "Your PostHog API key is invalid or expired." : error instanceof Error ? error.message : String(error);
5175
5175
  getUI().log.error(`Doctor failed: ${message}`);
5176
5176
  process.exit(1);
@@ -5247,7 +5247,7 @@ function runSlackConnect(argv) {
5247
5247
  (async () => {
5248
5248
  const debug = argv.debug;
5249
5249
  try {
5250
- const { startTUI } = await import("./start-tui-YE7bybIr.js");
5250
+ const { startTUI } = await import("./start-tui-B9qDcoGA.js");
5251
5251
  const { buildSession } = await import("./wizard-session-BKEdX9mO.js");
5252
5252
  const tui = startTUI(VERSION, Program.SlackConnect);
5253
5253
  tui.store.session = buildSession({ debug });
@@ -77,6 +77,31 @@ check(
77
77
  ['/home/dev/.claude/settings.json', 'apiKeyHelper', 'claude auth logout'],
78
78
  );
79
79
 
80
+ check(
81
+ 'AuthErrorScreen — managed login names conflicting credentials + places',
82
+ <AuthErrorScreen
83
+ store={fakeStore({
84
+ authErrorDetail: {
85
+ hasSettingsConflict: false,
86
+ usingManagedLogin: true,
87
+ credentialPlaces: [
88
+ 'A logged-in Claude session: /home/dev/.claude/.credentials.json',
89
+ 'A logged-in Claude session: macOS keychain item "Claude Code-credentials"',
90
+ ],
91
+ logFilePath: '/tmp/posthog-wizard.log',
92
+ },
93
+ })}
94
+ />,
95
+ [
96
+ 'Conflicting Anthropic credentials',
97
+ '/home/dev/.claude/.credentials.json',
98
+ 'Claude Code-credentials',
99
+ 'claude auth logout',
100
+ ],
101
+ // Must not fall through to the generic key-guidance copy.
102
+ ['Region mismatch'],
103
+ );
104
+
80
105
  check(
81
106
  'AuthErrorScreen — no conflict falls back to key guidance',
82
107
  <AuthErrorScreen
@@ -1,6 +1,6 @@
1
- import { h as LoggingUI, m as setUI, p as getUI } from "./debug-BGMe1wP6.js";
2
- import { t as provisionNewAccount } from "./provisioning-C3qglLdc.js";
3
- import { t as posthogIntegrationConfig } from "./posthog-integration-gnC9v4kg.js";
1
+ import { h as LoggingUI, m as setUI, p as getUI } from "./debug-Cn4L5Ype.js";
2
+ import { t as provisionNewAccount } from "./provisioning-wMzPfaaP.js";
3
+ import { t as posthogIntegrationConfig } from "./posthog-integration-C3m_uR5A.js";
4
4
  import { c as runWizardCI, s as runWizardHeadless } from "./bin.js";
5
5
  //#region src/commands/basic-integration/ci-install.ts
6
6
  /**
@@ -110,4 +110,4 @@ async function provisionForSignup(options) {
110
110
  //#endregion
111
111
  export { runCIInstall, runHeadlessInstall };
112
112
 
113
- //# sourceMappingURL=ci-install-D-otkGW6.js.map
113
+ //# sourceMappingURL=ci-install-ouGSf4zp.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ci-install-D-otkGW6.js","names":[],"sources":["../src/commands/basic-integration/ci-install.ts"],"sourcesContent":["import type { Arguments } from 'yargs';\nimport { getUI, setUI } from '@ui';\nimport { LoggingUI } from '@ui/logging-ui';\nimport { runWizardCI, runWizardHeadless } from '@lib/runners';\nimport type { NonInteractiveMode } from '@lib/runners';\nimport { provisionNewAccount } from '@utils/provisioning';\nimport { posthogIntegrationConfig } from '@lib/programs/posthog-integration/index';\n\ntype Options = Arguments & {\n region?: string;\n installDir?: string;\n apiKey?: string;\n signup?: boolean;\n email?: string;\n name?: string;\n projectId?: string;\n};\n\n/**\n * CI-mode install entry point (`--ci`, dev/test builds). Thin shell over the\n * shared non-interactive install — see `runNonInteractiveInstall`.\n */\nexport function runCIInstall(argv: Arguments): void {\n runNonInteractiveInstall(argv, 'ci');\n}\n\n/**\n * Headless install entry point (the experimental published-build run path; see\n * @lib/headless-mode). Thin shell over the shared non-interactive install.\n * Today it behaves exactly like `runCIInstall`; it is a separate function so\n * headless can diverge later (auth, prompts, …) without touching the CI path.\n */\nexport function runHeadlessInstall(argv: Arguments): void {\n runNonInteractiveInstall(argv, 'headless');\n}\n\n/**\n * Non-interactive install shared by CI and headless. Validates signup flags,\n * optionally provisions an account, then installs. `mode` only changes\n * user-facing labels, which api-key prefixes are accepted, and which runner is\n * invoked — the install itself is identical (see runNonInteractive).\n */\nfunction runNonInteractiveInstall(\n argv: Arguments,\n mode: NonInteractiveMode,\n): void {\n const options = { ...argv } as Options;\n const headless = mode === 'headless';\n const label = headless ? 'Headless' : 'CI';\n const runWizard = headless ? runWizardHeadless : runWizardCI;\n\n // Base validation (region/install-dir/api-key) is owned by the runner.\n // This layer only adds the signup branch on top.\n if (!options.apiKey && !options.signup) {\n const keyHint = headless\n ? 'personal API key phx_xxx or pha_ OAuth access token'\n : 'personal API key phx_xxx';\n return failCI(\n `${label} mode requires --api-key (${keyHint}). ` +\n 'To create a new account instead, use --signup --email you@example.com.',\n );\n }\n if (!options.apiKey && options.signup && !options.email) {\n return failCI(\n `${label} --signup requires --email to create a new account.`,\n );\n }\n warnOnUnexpectedKeyPrefix(options.apiKey, headless);\n\n void (async () => {\n if (!options.apiKey && options.signup) {\n // Fail before the irreversible provisioning step rather than after it.\n if (!options.installDir) {\n return failCI(\n `${label} mode requires --install-dir (directory to install in)`,\n );\n }\n const provisioned = await provisionForSignup(options);\n options.apiKey = provisioned.personalApiKey;\n if (options.projectId == null) options.projectId = provisioned.projectId;\n }\n runWizard(posthogIntegrationConfig, options);\n })().catch(() => {\n process.exit(1);\n });\n}\n\nfunction failCI(message: string): void {\n setUI(new LoggingUI());\n getUI().intro('PostHog Wizard');\n getUI().log.error(message);\n process.exit(1);\n}\n\n/**\n * Decide whether to warn about an unexpected `--api-key` prefix, and with what\n * message. Returns `null` when the key is acceptable for the mode.\n *\n * This is the one behavioral fork between `--ci` and headless mode: the LLM\n * Gateway accepts a personal API key (`phx_`) in either mode, but in headless\n * a `pha_` OAuth access token is *also* first-class — PostHog mints one under\n * the wizard's own OAuth application for cloud runs and passes it as the\n * api-key. Outside headless that token is unexpected and still warns.\n *\n * Extracted as a pure predicate so the fork can be unit-tested without a UI.\n */\nexport function keyPrefixWarning(\n apiKey: string | undefined,\n headless: boolean,\n): string | null {\n if (!apiKey || apiKey.startsWith('phx_')) return null;\n if (headless && apiKey.startsWith('pha_')) return null;\n const prefix = apiKey.slice(0, 4);\n const hint =\n prefix === 'pha_'\n ? ' (pha_ is an OAuth access token — CI mode expects a personal API key)'\n : prefix === 'phc_'\n ? ' (phc_ is a project/client key — expected a personal API key)'\n : '';\n return `--api-key does not start with \"phx_\"${hint}. Continuing anyway, but the LLM Gateway may reject it with a 401.`;\n}\n\nfunction warnOnUnexpectedKeyPrefix(\n apiKey: string | undefined,\n headless: boolean,\n): void {\n const message = keyPrefixWarning(apiKey, headless);\n if (!message) return;\n setUI(new LoggingUI());\n getUI().intro('PostHog Wizard');\n getUI().log.warn(message);\n}\n\n/**\n * Provision a new account and return its credentials. Throws on any failure\n * (after logging a user-facing message); the caller's `.catch` turns that\n * into a non-zero exit. The return type carries no failure sentinel.\n */\nasync function provisionForSignup(\n options: Options,\n): Promise<{ personalApiKey: string; projectId: string }> {\n setUI(new LoggingUI());\n getUI().intro('PostHog Wizard');\n const signupRegion = ((options.region as string) || 'us').toUpperCase() as\n | 'US'\n | 'EU';\n getUI().log.info(\n `Provisioning new PostHog account for ${String(\n options.email,\n )} in ${signupRegion}...`,\n );\n\n let result;\n try {\n result = await provisionNewAccount(\n options.email as string,\n options.name ?? '',\n signupRegion,\n );\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n getUI().log.error(`Provisioning failed: ${msg}`);\n throw error;\n }\n\n if (!result.personalApiKey) {\n getUI().log.error(\n 'Provisioning succeeded but no personal API key was returned — cannot continue install.',\n );\n throw new Error('provisioning returned no personal API key');\n }\n\n getUI().log.success('Account ready.');\n getUI().log.info(` Project API Key: ${result.projectApiKey}`);\n getUI().log.info(` Personal API Key: ${result.personalApiKey}`);\n getUI().log.info(` Host: ${result.host}`);\n return {\n personalApiKey: result.personalApiKey,\n projectId: result.projectId,\n };\n}\n"],"mappings":";;;;;;;;;AAsBA,SAAgB,aAAa,MAAuB;AAClD,0BAAyB,MAAM,KAAK;;;;;;;;AAStC,SAAgB,mBAAmB,MAAuB;AACxD,0BAAyB,MAAM,WAAW;;;;;;;;AAS5C,SAAS,yBACP,MACA,MACM;CACN,MAAM,UAAU,EAAE,GAAG,MAAM;CAC3B,MAAM,WAAW,SAAS;CAC1B,MAAM,QAAQ,WAAW,aAAa;CACtC,MAAM,YAAY,WAAW,oBAAoB;AAIjD,KAAI,CAAC,QAAQ,UAAU,CAAC,QAAQ,OAI9B,QAAO,OACL,GAAG,MAAM,4BAJK,WACZ,wDACA,2BAE2C,2EAE9C;AAEH,KAAI,CAAC,QAAQ,UAAU,QAAQ,UAAU,CAAC,QAAQ,MAChD,QAAO,OACL,GAAG,MAAM,qDACV;AAEH,2BAA0B,QAAQ,QAAQ,SAAS;AAEnD,EAAM,YAAY;AAChB,MAAI,CAAC,QAAQ,UAAU,QAAQ,QAAQ;AAErC,OAAI,CAAC,QAAQ,WACX,QAAO,OACL,GAAG,MAAM,wDACV;GAEH,MAAM,cAAc,MAAM,mBAAmB,QAAQ;AACrD,WAAQ,SAAS,YAAY;AAC7B,OAAI,QAAQ,aAAa,KAAM,SAAQ,YAAY,YAAY;;AAEjE,YAAU,0BAA0B,QAAQ;KAC1C,CAAC,YAAY;AACf,UAAQ,KAAK,EAAE;GACf;;AAGJ,SAAS,OAAO,SAAuB;AACrC,OAAM,IAAI,WAAW,CAAC;AACtB,QAAO,CAAC,MAAM,iBAAiB;AAC/B,QAAO,CAAC,IAAI,MAAM,QAAQ;AAC1B,SAAQ,KAAK,EAAE;;;;;;;;;;;;;;AAejB,SAAgB,iBACd,QACA,UACe;AACf,KAAI,CAAC,UAAU,OAAO,WAAW,OAAO,CAAE,QAAO;AACjD,KAAI,YAAY,OAAO,WAAW,OAAO,CAAE,QAAO;CAClD,MAAM,SAAS,OAAO,MAAM,GAAG,EAAE;AAOjC,QAAO,uCALL,WAAW,SACP,0EACA,WAAW,SACX,kEACA,GAC6C;;AAGrD,SAAS,0BACP,QACA,UACM;CACN,MAAM,UAAU,iBAAiB,QAAQ,SAAS;AAClD,KAAI,CAAC,QAAS;AACd,OAAM,IAAI,WAAW,CAAC;AACtB,QAAO,CAAC,MAAM,iBAAiB;AAC/B,QAAO,CAAC,IAAI,KAAK,QAAQ;;;;;;;AAQ3B,eAAe,mBACb,SACwD;AACxD,OAAM,IAAI,WAAW,CAAC;AACtB,QAAO,CAAC,MAAM,iBAAiB;CAC/B,MAAM,gBAAiB,QAAQ,UAAqB,MAAM,aAAa;AAGvE,QAAO,CAAC,IAAI,KACV,wCAAwC,OACtC,QAAQ,MACT,CAAC,MAAM,aAAa,KACtB;CAED,IAAI;AACJ,KAAI;AACF,WAAS,MAAM,oBACb,QAAQ,OACR,QAAQ,QAAQ,IAChB,aACD;UACM,OAAO;EACd,MAAM,MAAM,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM;AAClE,SAAO,CAAC,IAAI,MAAM,wBAAwB,MAAM;AAChD,QAAM;;AAGR,KAAI,CAAC,OAAO,gBAAgB;AAC1B,SAAO,CAAC,IAAI,MACV,yFACD;AACD,QAAM,IAAI,MAAM,4CAA4C;;AAG9D,QAAO,CAAC,IAAI,QAAQ,iBAAiB;AACrC,QAAO,CAAC,IAAI,KAAK,uBAAuB,OAAO,gBAAgB;AAC/D,QAAO,CAAC,IAAI,KAAK,uBAAuB,OAAO,iBAAiB;AAChE,QAAO,CAAC,IAAI,KAAK,uBAAuB,OAAO,OAAO;AACtD,QAAO;EACL,gBAAgB,OAAO;EACvB,WAAW,OAAO;EACnB"}
1
+ {"version":3,"file":"ci-install-ouGSf4zp.js","names":[],"sources":["../src/commands/basic-integration/ci-install.ts"],"sourcesContent":["import type { Arguments } from 'yargs';\nimport { getUI, setUI } from '@ui';\nimport { LoggingUI } from '@ui/logging-ui';\nimport { runWizardCI, runWizardHeadless } from '@lib/runners';\nimport type { NonInteractiveMode } from '@lib/runners';\nimport { provisionNewAccount } from '@utils/provisioning';\nimport { posthogIntegrationConfig } from '@lib/programs/posthog-integration/index';\n\ntype Options = Arguments & {\n region?: string;\n installDir?: string;\n apiKey?: string;\n signup?: boolean;\n email?: string;\n name?: string;\n projectId?: string;\n};\n\n/**\n * CI-mode install entry point (`--ci`, dev/test builds). Thin shell over the\n * shared non-interactive install — see `runNonInteractiveInstall`.\n */\nexport function runCIInstall(argv: Arguments): void {\n runNonInteractiveInstall(argv, 'ci');\n}\n\n/**\n * Headless install entry point (the experimental published-build run path; see\n * @lib/headless-mode). Thin shell over the shared non-interactive install.\n * Today it behaves exactly like `runCIInstall`; it is a separate function so\n * headless can diverge later (auth, prompts, …) without touching the CI path.\n */\nexport function runHeadlessInstall(argv: Arguments): void {\n runNonInteractiveInstall(argv, 'headless');\n}\n\n/**\n * Non-interactive install shared by CI and headless. Validates signup flags,\n * optionally provisions an account, then installs. `mode` only changes\n * user-facing labels, which api-key prefixes are accepted, and which runner is\n * invoked — the install itself is identical (see runNonInteractive).\n */\nfunction runNonInteractiveInstall(\n argv: Arguments,\n mode: NonInteractiveMode,\n): void {\n const options = { ...argv } as Options;\n const headless = mode === 'headless';\n const label = headless ? 'Headless' : 'CI';\n const runWizard = headless ? runWizardHeadless : runWizardCI;\n\n // Base validation (region/install-dir/api-key) is owned by the runner.\n // This layer only adds the signup branch on top.\n if (!options.apiKey && !options.signup) {\n const keyHint = headless\n ? 'personal API key phx_xxx or pha_ OAuth access token'\n : 'personal API key phx_xxx';\n return failCI(\n `${label} mode requires --api-key (${keyHint}). ` +\n 'To create a new account instead, use --signup --email you@example.com.',\n );\n }\n if (!options.apiKey && options.signup && !options.email) {\n return failCI(\n `${label} --signup requires --email to create a new account.`,\n );\n }\n warnOnUnexpectedKeyPrefix(options.apiKey, headless);\n\n void (async () => {\n if (!options.apiKey && options.signup) {\n // Fail before the irreversible provisioning step rather than after it.\n if (!options.installDir) {\n return failCI(\n `${label} mode requires --install-dir (directory to install in)`,\n );\n }\n const provisioned = await provisionForSignup(options);\n options.apiKey = provisioned.personalApiKey;\n if (options.projectId == null) options.projectId = provisioned.projectId;\n }\n runWizard(posthogIntegrationConfig, options);\n })().catch(() => {\n process.exit(1);\n });\n}\n\nfunction failCI(message: string): void {\n setUI(new LoggingUI());\n getUI().intro('PostHog Wizard');\n getUI().log.error(message);\n process.exit(1);\n}\n\n/**\n * Decide whether to warn about an unexpected `--api-key` prefix, and with what\n * message. Returns `null` when the key is acceptable for the mode.\n *\n * This is the one behavioral fork between `--ci` and headless mode: the LLM\n * Gateway accepts a personal API key (`phx_`) in either mode, but in headless\n * a `pha_` OAuth access token is *also* first-class — PostHog mints one under\n * the wizard's own OAuth application for cloud runs and passes it as the\n * api-key. Outside headless that token is unexpected and still warns.\n *\n * Extracted as a pure predicate so the fork can be unit-tested without a UI.\n */\nexport function keyPrefixWarning(\n apiKey: string | undefined,\n headless: boolean,\n): string | null {\n if (!apiKey || apiKey.startsWith('phx_')) return null;\n if (headless && apiKey.startsWith('pha_')) return null;\n const prefix = apiKey.slice(0, 4);\n const hint =\n prefix === 'pha_'\n ? ' (pha_ is an OAuth access token — CI mode expects a personal API key)'\n : prefix === 'phc_'\n ? ' (phc_ is a project/client key — expected a personal API key)'\n : '';\n return `--api-key does not start with \"phx_\"${hint}. Continuing anyway, but the LLM Gateway may reject it with a 401.`;\n}\n\nfunction warnOnUnexpectedKeyPrefix(\n apiKey: string | undefined,\n headless: boolean,\n): void {\n const message = keyPrefixWarning(apiKey, headless);\n if (!message) return;\n setUI(new LoggingUI());\n getUI().intro('PostHog Wizard');\n getUI().log.warn(message);\n}\n\n/**\n * Provision a new account and return its credentials. Throws on any failure\n * (after logging a user-facing message); the caller's `.catch` turns that\n * into a non-zero exit. The return type carries no failure sentinel.\n */\nasync function provisionForSignup(\n options: Options,\n): Promise<{ personalApiKey: string; projectId: string }> {\n setUI(new LoggingUI());\n getUI().intro('PostHog Wizard');\n const signupRegion = ((options.region as string) || 'us').toUpperCase() as\n | 'US'\n | 'EU';\n getUI().log.info(\n `Provisioning new PostHog account for ${String(\n options.email,\n )} in ${signupRegion}...`,\n );\n\n let result;\n try {\n result = await provisionNewAccount(\n options.email as string,\n options.name ?? '',\n signupRegion,\n );\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n getUI().log.error(`Provisioning failed: ${msg}`);\n throw error;\n }\n\n if (!result.personalApiKey) {\n getUI().log.error(\n 'Provisioning succeeded but no personal API key was returned — cannot continue install.',\n );\n throw new Error('provisioning returned no personal API key');\n }\n\n getUI().log.success('Account ready.');\n getUI().log.info(` Project API Key: ${result.projectApiKey}`);\n getUI().log.info(` Personal API Key: ${result.personalApiKey}`);\n getUI().log.info(` Host: ${result.host}`);\n return {\n personalApiKey: result.personalApiKey,\n projectId: result.projectId,\n };\n}\n"],"mappings":";;;;;;;;;AAsBA,SAAgB,aAAa,MAAuB;AAClD,0BAAyB,MAAM,KAAK;;;;;;;;AAStC,SAAgB,mBAAmB,MAAuB;AACxD,0BAAyB,MAAM,WAAW;;;;;;;;AAS5C,SAAS,yBACP,MACA,MACM;CACN,MAAM,UAAU,EAAE,GAAG,MAAM;CAC3B,MAAM,WAAW,SAAS;CAC1B,MAAM,QAAQ,WAAW,aAAa;CACtC,MAAM,YAAY,WAAW,oBAAoB;AAIjD,KAAI,CAAC,QAAQ,UAAU,CAAC,QAAQ,OAI9B,QAAO,OACL,GAAG,MAAM,4BAJK,WACZ,wDACA,2BAE2C,2EAE9C;AAEH,KAAI,CAAC,QAAQ,UAAU,QAAQ,UAAU,CAAC,QAAQ,MAChD,QAAO,OACL,GAAG,MAAM,qDACV;AAEH,2BAA0B,QAAQ,QAAQ,SAAS;AAEnD,EAAM,YAAY;AAChB,MAAI,CAAC,QAAQ,UAAU,QAAQ,QAAQ;AAErC,OAAI,CAAC,QAAQ,WACX,QAAO,OACL,GAAG,MAAM,wDACV;GAEH,MAAM,cAAc,MAAM,mBAAmB,QAAQ;AACrD,WAAQ,SAAS,YAAY;AAC7B,OAAI,QAAQ,aAAa,KAAM,SAAQ,YAAY,YAAY;;AAEjE,YAAU,0BAA0B,QAAQ;KAC1C,CAAC,YAAY;AACf,UAAQ,KAAK,EAAE;GACf;;AAGJ,SAAS,OAAO,SAAuB;AACrC,OAAM,IAAI,WAAW,CAAC;AACtB,QAAO,CAAC,MAAM,iBAAiB;AAC/B,QAAO,CAAC,IAAI,MAAM,QAAQ;AAC1B,SAAQ,KAAK,EAAE;;;;;;;;;;;;;;AAejB,SAAgB,iBACd,QACA,UACe;AACf,KAAI,CAAC,UAAU,OAAO,WAAW,OAAO,CAAE,QAAO;AACjD,KAAI,YAAY,OAAO,WAAW,OAAO,CAAE,QAAO;CAClD,MAAM,SAAS,OAAO,MAAM,GAAG,EAAE;AAOjC,QAAO,uCALL,WAAW,SACP,0EACA,WAAW,SACX,kEACA,GAC6C;;AAGrD,SAAS,0BACP,QACA,UACM;CACN,MAAM,UAAU,iBAAiB,QAAQ,SAAS;AAClD,KAAI,CAAC,QAAS;AACd,OAAM,IAAI,WAAW,CAAC;AACtB,QAAO,CAAC,MAAM,iBAAiB;AAC/B,QAAO,CAAC,IAAI,KAAK,QAAQ;;;;;;;AAQ3B,eAAe,mBACb,SACwD;AACxD,OAAM,IAAI,WAAW,CAAC;AACtB,QAAO,CAAC,MAAM,iBAAiB;CAC/B,MAAM,gBAAiB,QAAQ,UAAqB,MAAM,aAAa;AAGvE,QAAO,CAAC,IAAI,KACV,wCAAwC,OACtC,QAAQ,MACT,CAAC,MAAM,aAAa,KACtB;CAED,IAAI;AACJ,KAAI;AACF,WAAS,MAAM,oBACb,QAAQ,OACR,QAAQ,QAAQ,IAChB,aACD;UACM,OAAO;EACd,MAAM,MAAM,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM;AAClE,SAAO,CAAC,IAAI,MAAM,wBAAwB,MAAM;AAChD,QAAM;;AAGR,KAAI,CAAC,OAAO,gBAAgB;AAC1B,SAAO,CAAC,IAAI,MACV,yFACD;AACD,QAAM,IAAI,MAAM,4CAA4C;;AAG9D,QAAO,CAAC,IAAI,QAAQ,iBAAiB;AACrC,QAAO,CAAC,IAAI,KAAK,uBAAuB,OAAO,gBAAgB;AAC/D,QAAO,CAAC,IAAI,KAAK,uBAAuB,OAAO,iBAAiB;AAChE,QAAO,CAAC,IAAI,KAAK,uBAAuB,OAAO,OAAO;AACtD,QAAO;EACL,gBAAgB,OAAO;EACvB,WAAW,OAAO;EACnB"}
@@ -1,2 +1,2 @@
1
- import { n as configureLogFileFromEnvironment, s as logToFile } from "./debug-BGMe1wP6.js";
1
+ import { n as configureLogFileFromEnvironment, s as logToFile } from "./debug-Cn4L5Ype.js";
2
2
  export { configureLogFileFromEnvironment, logToFile };
@@ -28,7 +28,7 @@ function runtimeEnv(key) {
28
28
  }
29
29
  //#endregion
30
30
  //#region src/lib/version.ts
31
- const VERSION = "2.33.0";
31
+ const VERSION = "2.34.0";
32
32
  //#endregion
33
33
  //#region src/lib/constants.ts
34
34
  /**
@@ -891,4 +891,4 @@ function enableDebugLogs() {
891
891
  //#endregion
892
892
  export { WIZARD_WARLOCK_DISABLED_FLAG_KEY as $, ISSUES_URL as A, POSTHOG_PRIVACY_URL as B, CONTEXT_MILL_RELEASES_URL as C, DETECTION_TIMEOUT_MS as D, DEFAULT_HOST_URL as E, POSTHOG_DEV_CLIENT_ID as F, REMOTE_SKILLS_BASE_URL as G, POSTHOG_PROXY_CLIENT_ID as H, POSTHOG_DOCS_URL as I, WIZARD_ORCHESTRATOR_FLAG_KEY as J, WIZARD_INTERACTION_EVENT_NAME as K, POSTHOG_FLAG_HEADER_PREFIX as L, OAUTH_PORTS as M, OAUTH_TIMEOUT_MS as N, DUMMY_PROJECT_API_KEY as O, POSTHOG_APP_URL as P, WIZARD_USER_AGENT as Q, POSTHOG_OAUTH_URL as R, ANALYTICS_TEAM_TAG as S, DEFAULT_AGENT_MODEL as T, POSTHOG_TERMS_URL as U, POSTHOG_PROPERTY_HEADER_PREFIX as V, POSTHOG_US_CLIENT_ID as W, WIZARD_REMARK_EVENT_NAME as X, WIZARD_PROVISIONING_SCOPES as Y, WIZARD_TOOLS_MENU_FLAG_KEY as Z, SIGNUP_WIZARD_READINESS_CONFIG as _, getLogFilePath as a, ANALYTICS_HOST_URL as b, WIZARD_BENCHMARK_FILE as c, relativeToInstallDir as d, getSkillsBaseUrl as et, skillTmpPath as f, SERVICE_LABELS as g, LoggingUI as h, enableDebugLogs as i, Integration as j, HAIKU_MODEL as k, WIZARD_LOG_FILE as l, setUI as m, configureLogFileFromEnvironment as n, NODE_ENV as nt, initLogFile as o, getUI as p, WIZARD_OAUTH_SCOPES as q, debug as r, runtimeEnv as rt, logToFile as s, configureLogFile as t, VERSION as tt, WIZARD_YARA_REPORT_FILE as u, evaluateWizardReadiness as v, CONTEXT_MILL_URL as w, ANALYTICS_POSTHOG_PUBLIC_PROJECT_WRITE_KEY as x, getBlockingServiceKeys as y, POSTHOG_ORG_AI_SETTINGS_URL as z };
893
893
 
894
- //# sourceMappingURL=debug-BGMe1wP6.js.map
894
+ //# sourceMappingURL=debug-Cn4L5Ype.js.map