@posthog/wizard 2.49.0 → 2.51.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.
- package/dist/{add-mcp-server-to-clients-DnyxFVhW.js → add-mcp-server-to-clients-C1f2al7N.js} +5 -5
- package/dist/{add-mcp-server-to-clients-DnyxFVhW.js.map → add-mcp-server-to-clients-C1f2al7N.js.map} +1 -1
- package/dist/{agent-interface-Doo3apDE.js → agent-interface-BL2wCV3b.js} +33 -71
- package/dist/agent-interface-BL2wCV3b.js.map +1 -0
- package/dist/agent-prompt-loader-CEWWA98d.js +275 -0
- package/dist/agent-prompt-loader-CEWWA98d.js.map +1 -0
- package/dist/{agent-runner-D7OZPgIV.js → agent-runner-DSKXFDXa.js} +101 -319
- package/dist/agent-runner-DSKXFDXa.js.map +1 -0
- package/dist/{analytics-D6gRGiqt.js → analytics-Ddf3zJgF.js} +20 -2
- package/dist/analytics-Ddf3zJgF.js.map +1 -0
- package/dist/analytics-GD_xM1XO.js +2 -0
- package/dist/{api-ZT2Zd5yp.js → api-BdanR3Zp.js} +3 -3
- package/dist/{api-ZT2Zd5yp.js.map → api-BdanR3Zp.js.map} +1 -1
- package/dist/bin.js +89 -90
- package/dist/bin.js.map +1 -1
- package/dist/bounded-fs-d0dw1Qv5.js +242 -0
- package/dist/bounded-fs-d0dw1Qv5.js.map +1 -0
- package/dist/{ci-install-CQWSPGdM.js → ci-install-DnVNVs0f.js} +4 -4
- package/dist/{ci-install-CQWSPGdM.js.map → ci-install-DnVNVs0f.js.map} +1 -1
- package/dist/commandments-BagyrYRW.js +2 -0
- package/dist/{commandments-DSNrOeOC.js → commandments-DiMtIz1o.js} +1 -1
- package/dist/{commandments-DSNrOeOC.js.map → commandments-DiMtIz1o.js.map} +1 -1
- package/dist/{debug-D8AJ_YCW.js → debug-By1_VtgZ.js} +1 -1
- package/dist/{debug-DF51kDvZ.js → debug-DaXKSXEy.js} +8 -27
- package/dist/debug-DaXKSXEy.js.map +1 -0
- package/dist/{defaults-CtWMmC8s.js → defaults-DAE9_QMn.js} +1 -1
- package/dist/{defaults-CtWMmC8s.js.map → defaults-DAE9_QMn.js.map} +1 -1
- package/dist/{env-api-key-C3LzH8Lr.js → env-api-key-DDVkPQmo.js} +1 -1
- package/dist/{env-api-key-C3LzH8Lr.js.map → env-api-key-DDVkPQmo.js.map} +1 -1
- package/dist/{environment-Csj7vBHM.js → environment-DJQOs7MR.js} +4 -4
- package/dist/environment-DJQOs7MR.js.map +1 -0
- package/dist/{file-watcher-CQB00KDS.js → file-watcher-LZe_W3hM.js} +2 -2
- package/dist/{file-watcher-CQB00KDS.js.map → file-watcher-LZe_W3hM.js.map} +1 -1
- package/dist/{headless-ui-DfSOfXEo.js → headless-ui-wIeUgvJ8.js} +2 -2
- package/dist/{headless-ui-DfSOfXEo.js.map → headless-ui-wIeUgvJ8.js.map} +1 -1
- package/dist/{interactive-DmRqhAUD.js → interactive-j4DoJDnk.js} +2 -2
- package/dist/{interactive-DmRqhAUD.js.map → interactive-j4DoJDnk.js.map} +1 -1
- package/dist/{mcp-B_ycbOus.js → mcp-Butt7ktW.js} +2 -2
- package/dist/{mcp-B_ycbOus.js.map → mcp-Butt7ktW.js.map} +1 -1
- package/dist/{mcp-prompt-streaming-ChEBHPQ-.js → mcp-prompt-streaming-D25BQfRa.js} +3 -3
- package/dist/{mcp-prompt-streaming-ChEBHPQ-.js.map → mcp-prompt-streaming-D25BQfRa.js.map} +1 -1
- package/dist/{non-interactive-ViR2FrQC.js → non-interactive-Cpof2JsA.js} +2 -2
- package/dist/{non-interactive-ViR2FrQC.js.map → non-interactive-Cpof2JsA.js.map} +1 -1
- package/dist/{orchestrator-tools-B0vrJlpS.js → orchestrator-tools-CsJizPpV.js} +3 -3
- package/dist/{orchestrator-tools-B0vrJlpS.js.map → orchestrator-tools-CsJizPpV.js.map} +1 -1
- package/dist/{package-json-DCuoye-H.js → package-json-CDs1ZVKu.js} +1 -1
- package/dist/{package-json-DCuoye-H.js.map → package-json-CDs1ZVKu.js.map} +1 -1
- package/dist/{package-manager-B6QAvLyt.js → package-manager-DnzNEjci.js} +2 -2
- package/dist/{package-manager-B6QAvLyt.js.map → package-manager-DnzNEjci.js.map} +1 -1
- package/dist/{pi-CXhGyUbi.js → pi-DE2cAVfO.js} +89 -138
- package/dist/pi-DE2cAVfO.js.map +1 -0
- package/dist/{playground-D_cP2oXt.js → playground-C3sLBq6A.js} +7 -7
- package/dist/{playground-D_cP2oXt.js.map → playground-C3sLBq6A.js.map} +1 -1
- package/dist/{posthog-integration-Bt8jQC7c.js → posthog-integration-_GSKRotZ.js} +45 -38
- package/dist/posthog-integration-_GSKRotZ.js.map +1 -0
- package/dist/{posthog-DZZbziJ1.js → posthog-mgz-FQlS.js} +1 -1
- package/dist/{posthog-DZZbziJ1.js.map → posthog-mgz-FQlS.js.map} +1 -1
- package/dist/{provisioning-By5DVLJr.js → provisioning-BndgugFk.js} +3 -3
- package/dist/{provisioning-By5DVLJr.js.map → provisioning-BndgugFk.js.map} +1 -1
- package/dist/{queue-tools-3iQHCpWF.js → queue-tools-DZjAjiqk.js} +97 -10
- package/dist/queue-tools-DZjAjiqk.js.map +1 -0
- package/dist/{registry-DG8r_Wks.js → registry-BMjfECF2.js} +272 -429
- package/dist/registry-BMjfECF2.js.map +1 -0
- package/dist/{security-BpbwefgM.js → security-D5hjYVFi.js} +4 -4
- package/dist/{security-BpbwefgM.js.map → security-D5hjYVFi.js.map} +1 -1
- package/dist/{setup-utils-CFejYe1M.js → setup-utils-ZKEk71yV.js} +14 -17
- package/dist/setup-utils-ZKEk71yV.js.map +1 -0
- package/dist/smoke-test.sh +1 -1
- package/dist/{start-tui-BINHq3Yp.js → start-tui-B2Tb427o.js} +19 -19
- package/dist/{start-tui-BINHq3Yp.js.map → start-tui-B2Tb427o.js.map} +1 -1
- package/dist/{steps-DhmMIChh.js → steps-ClMZ6MZd.js} +7 -7
- package/dist/{steps-DhmMIChh.js.map → steps-ClMZ6MZd.js.map} +1 -1
- package/dist/{store-Bj1m0ws-.js → store-Db77bfRv.js} +5 -5
- package/dist/{store-Bj1m0ws-.js.map → store-Db77bfRv.js.map} +1 -1
- package/dist/{subagent-DND7lZg6.js → subagent--VXEEc8S.js} +2 -2
- package/dist/{subagent-DND7lZg6.js.map → subagent--VXEEc8S.js.map} +1 -1
- package/dist/{task-CsAczwW6.js → task-CBQfx_f5.js} +30 -45
- package/dist/task-CBQfx_f5.js.map +1 -0
- package/dist/{task-stream-BaiI6TNY.js → task-stream-DCrqCmFa.js} +5 -5
- package/dist/{task-stream-BaiI6TNY.js.map → task-stream-DCrqCmFa.js.map} +1 -1
- package/dist/{tasks-DqDHx5pW.js → tasks-BJuz1XQ1.js} +2 -2
- package/dist/{tasks-DqDHx5pW.js.map → tasks-BJuz1XQ1.js.map} +1 -1
- package/dist/{telemetry-DXzPfSXl.js → telemetry-tdU6F90U.js} +3 -3
- package/dist/{telemetry-DXzPfSXl.js.map → telemetry-tdU6F90U.js.map} +1 -1
- package/dist/{terminal-DKsibL3T.js → terminal-ClWui_UN.js} +13 -13
- package/dist/{terminal-DKsibL3T.js.map → terminal-ClWui_UN.js.map} +1 -1
- package/dist/{tools-D5pL_r3K.js → tools-DwpaEyEv.js} +10 -8
- package/dist/tools-DwpaEyEv.js.map +1 -0
- package/dist/{wizard-abort-Br1Dps20.js → wizard-abort-B1iPXM3K.js} +4 -4
- package/dist/{wizard-abort-Br1Dps20.js.map → wizard-abort-B1iPXM3K.js.map} +1 -1
- package/dist/{wizard-abort-DG6Atd5I.js → wizard-abort-cX4Kytai.js} +1 -1
- package/dist/{wizard-session-tp4Zdbwl.js → wizard-session-BAZql11N.js} +1 -1
- package/dist/{wizard-session-tp4Zdbwl.js.map → wizard-session-BAZql11N.js.map} +1 -1
- package/dist/{wizard-session-DWHe83uk.js → wizard-session-C5lZPPEc.js} +1 -1
- package/dist/{yara-hooks-DEHfsDSF.js → yara-hooks-CEs3jx7j.js} +139 -56
- package/dist/yara-hooks-CEs3jx7j.js.map +1 -0
- package/dist/yara-hooks-gz4AceFG.js +2 -0
- package/package.json +2 -2
- package/dist/agent-interface-Doo3apDE.js.map +0 -1
- package/dist/agent-runner-D7OZPgIV.js.map +0 -1
- package/dist/analytics-AOHLZy1k.js +0 -2
- package/dist/analytics-D6gRGiqt.js.map +0 -1
- package/dist/commandments-qTW7pwaT.js +0 -2
- package/dist/debug-DF51kDvZ.js.map +0 -1
- package/dist/environment-Csj7vBHM.js.map +0 -1
- package/dist/file-utils-Dj3UqDJz.js +0 -116
- package/dist/file-utils-Dj3UqDJz.js.map +0 -1
- package/dist/pi-CXhGyUbi.js.map +0 -1
- package/dist/posthog-integration-Bt8jQC7c.js.map +0 -1
- package/dist/queue-tools-3iQHCpWF.js.map +0 -1
- package/dist/registry-DG8r_Wks.js.map +0 -1
- package/dist/setup-utils-CFejYe1M.js.map +0 -1
- package/dist/task-CsAczwW6.js.map +0 -1
- package/dist/tools-D5pL_r3K.js.map +0 -1
- package/dist/yara-hooks-BExxs6sG.js +0 -2
- package/dist/yara-hooks-DEHfsDSF.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api-ZT2Zd5yp.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-BdanR3Zp.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,19 +1,19 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import {
|
|
3
|
-
import { n as analytics } from "./analytics-
|
|
4
|
-
import { r as setEntryCommand } from "./telemetry-
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import "./
|
|
8
|
-
import
|
|
9
|
-
import {
|
|
10
|
-
import { n as
|
|
11
|
-
import {
|
|
12
|
-
import { _ as
|
|
13
|
-
import {
|
|
14
|
-
import {
|
|
15
|
-
import {
|
|
16
|
-
import { n as readApiKeyFromEnv } from "./env-api-key-
|
|
2
|
+
import { H as POSTHOG_DOCS_URL, I as Integration, a as getLogFilePath, bt as regionOption, dt as WIZARD_USER_AGENT, f as getUI, ft as getSkillsBaseUrl, m as LoggingUI, mt as VERSION, p as setUI, r as debug, s as logToFile, vt as headlessOption, yt as isHeadless } from "./debug-DaXKSXEy.js";
|
|
3
|
+
import { n as analytics } from "./analytics-Ddf3zJgF.js";
|
|
4
|
+
import { r as setEntryCommand } from "./telemetry-tdU6F90U.js";
|
|
5
|
+
import { a as walkProjectFiles, i as safeReadFile } from "./bounded-fs-d0dw1Qv5.js";
|
|
6
|
+
import { n as isUsingTypeScript } from "./setup-utils-ZKEk71yV.js";
|
|
7
|
+
import { o as handleApiError } from "./api-BdanR3Zp.js";
|
|
8
|
+
import "./wizard-session-BAZql11N.js";
|
|
9
|
+
import { r as runCleanups } from "./wizard-abort-B1iPXM3K.js";
|
|
10
|
+
import { n as isNonInteractiveEnvironment } from "./environment-DJQOs7MR.js";
|
|
11
|
+
import { n as runAgent, o as authenticate } from "./agent-runner-DSKXFDXa.js";
|
|
12
|
+
import { _ as WIZARD_TOOL_NAMES, b as fetchSkillMenu, l as recoverOrphanedSettingsBackups, p as AgentSignals } from "./agent-interface-BL2wCV3b.js";
|
|
13
|
+
import { S as SETUP_REPORT_FILE, _ as AUDIT_CHECKS_KEY, g as AUDIT_CHECKS_FILE, v as AUDIT_REPORT_FILE } from "./yara-hooks-CEs3jx7j.js";
|
|
14
|
+
import { i as SPINNER_MESSAGE } from "./registry-BMjfECF2.js";
|
|
15
|
+
import { S as gatherFrameworkContext, _ as detectWarehousePrerequisites, a as LINE_CHART_BLOCK, g as WAREHOUSE_ABORT_CASES, h as HEALTH_CHECK_STEP, i as FUNNEL_BLOCK, m as Icons, n as integrationRunStep, o as PRODUCT_SUITE_BLOCK, p as Colors, r as posthogIntegrationConfig, s as StatusPeekTrigger, u as isClearBlock, v as getDetectedWarehouseSources, x as resolveProjectDir, y as detectIntegrationProjects } from "./posthog-integration-_GSKRotZ.js";
|
|
16
|
+
import { n as readApiKeyFromEnv } from "./env-api-key-DDVkPQmo.js";
|
|
17
17
|
import { satisfies } from "semver";
|
|
18
18
|
import yargs from "yargs";
|
|
19
19
|
import { hideBin } from "yargs/helpers";
|
|
@@ -200,7 +200,7 @@ function runProvision(argv) {
|
|
|
200
200
|
}
|
|
201
201
|
async function provision({ email, region, name, baseUrl, jsonMode }) {
|
|
202
202
|
try {
|
|
203
|
-
const { provisionNewAccount } = await import("./provisioning-
|
|
203
|
+
const { provisionNewAccount } = await import("./provisioning-BndgugFk.js").then((n) => n.n);
|
|
204
204
|
if (!jsonMode) getUI().log.info(`Provisioning account for ${email} in ${region}...`);
|
|
205
205
|
emitResult(await provisionNewAccount(email, name, region, { baseUrl }), jsonMode);
|
|
206
206
|
process.exit(0);
|
|
@@ -267,73 +267,64 @@ const basicIntegrationCommand = {
|
|
|
267
267
|
setEntryCommand("integrate");
|
|
268
268
|
(async () => {
|
|
269
269
|
if (isHeadless(argv)) {
|
|
270
|
-
const { runHeadlessInstall } = await import("./ci-install-
|
|
270
|
+
const { runHeadlessInstall } = await import("./ci-install-DnVNVs0f.js");
|
|
271
271
|
return runHeadlessInstall(argv);
|
|
272
272
|
}
|
|
273
273
|
if (argv.ci) {
|
|
274
|
-
const { runCIInstall } = await import("./ci-install-
|
|
274
|
+
const { runCIInstall } = await import("./ci-install-DnVNVs0f.js");
|
|
275
275
|
return runCIInstall(argv);
|
|
276
276
|
}
|
|
277
277
|
if (isNonInteractiveEnvironment()) {
|
|
278
|
-
const { failNonInteractive } = await import("./non-interactive-
|
|
278
|
+
const { failNonInteractive } = await import("./non-interactive-Cpof2JsA.js");
|
|
279
279
|
return failNonInteractive();
|
|
280
280
|
}
|
|
281
281
|
if (argv.playground) {
|
|
282
|
-
const { runPlayground } = await import("./playground-
|
|
282
|
+
const { runPlayground } = await import("./playground-C3sLBq6A.js");
|
|
283
283
|
return runPlayground();
|
|
284
284
|
}
|
|
285
|
-
const { runInteractive } = await import("./interactive-
|
|
285
|
+
const { runInteractive } = await import("./interactive-j4DoJDnk.js");
|
|
286
286
|
runInteractive(argv);
|
|
287
287
|
})();
|
|
288
288
|
}
|
|
289
289
|
};
|
|
290
290
|
//#endregion
|
|
291
291
|
//#region src/lib/programs/shared/package-scanning.ts
|
|
292
|
-
const POSTHOG_SDKS = [
|
|
292
|
+
const POSTHOG_SDKS = new Set([
|
|
293
293
|
"posthog-js",
|
|
294
294
|
"posthog-node",
|
|
295
295
|
"posthog-react-native",
|
|
296
296
|
"posthog-android",
|
|
297
297
|
"posthog-ios"
|
|
298
|
-
];
|
|
299
|
-
const STRIPE_SDKS = [
|
|
298
|
+
]);
|
|
299
|
+
const STRIPE_SDKS = new Set([
|
|
300
300
|
"stripe",
|
|
301
301
|
"@stripe/stripe-js",
|
|
302
302
|
"@stripe/react-stripe-js"
|
|
303
|
-
];
|
|
303
|
+
]);
|
|
304
|
+
const MAX_PACKAGE_MATCHES = 500;
|
|
304
305
|
/**
|
|
305
|
-
*
|
|
306
|
-
*
|
|
306
|
+
* Find all package.json files under installDir via the shared bounded walk
|
|
307
|
+
* (depth cap, ignored dirs, symlink-loop protection, per-dir entry cap).
|
|
308
|
+
* Returns matches with detected SDKs.
|
|
307
309
|
*/
|
|
308
310
|
function findPackageJsons(installDir, maxDepth = 3) {
|
|
309
311
|
const matches = [];
|
|
310
|
-
|
|
311
|
-
if (
|
|
312
|
-
|
|
312
|
+
walkProjectFiles(installDir, (name, fullPath) => {
|
|
313
|
+
if (name !== "package.json" || matches.length >= MAX_PACKAGE_MATCHES) return;
|
|
314
|
+
const content = safeReadFile(fullPath);
|
|
315
|
+
if (content === null) return;
|
|
313
316
|
try {
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
const posthogSdks = depNames.filter((d) => POSTHOG_SDKS.includes(d));
|
|
326
|
-
const stripeSdks = depNames.filter((d) => STRIPE_SDKS.includes(d));
|
|
327
|
-
matches.push({
|
|
328
|
-
path: relative(installDir, fullPath) || "package.json",
|
|
329
|
-
posthogSdks,
|
|
330
|
-
stripeSdks
|
|
331
|
-
});
|
|
332
|
-
} catch {}
|
|
333
|
-
else if (entry.isDirectory()) scan(fullPath, depth + 1);
|
|
334
|
-
}
|
|
335
|
-
}
|
|
336
|
-
scan(installDir, 0);
|
|
317
|
+
const pkg = JSON.parse(content);
|
|
318
|
+
const depNames = [...Object.keys(pkg.dependencies ?? {}), ...Object.keys(pkg.devDependencies ?? {})];
|
|
319
|
+
const posthogSdks = depNames.filter((d) => POSTHOG_SDKS.has(d));
|
|
320
|
+
const stripeSdks = depNames.filter((d) => STRIPE_SDKS.has(d));
|
|
321
|
+
matches.push({
|
|
322
|
+
path: relative(installDir, fullPath) || "package.json",
|
|
323
|
+
posthogSdks,
|
|
324
|
+
stripeSdks
|
|
325
|
+
});
|
|
326
|
+
} catch {}
|
|
327
|
+
}, maxDepth);
|
|
337
328
|
return matches;
|
|
338
329
|
}
|
|
339
330
|
//#endregion
|
|
@@ -2663,23 +2654,30 @@ const WALK_MAX_DEPTH = 2;
|
|
|
2663
2654
|
*/
|
|
2664
2655
|
function scanDirs(installDir) {
|
|
2665
2656
|
const rels = new Set(POSTHOG_DIRS);
|
|
2666
|
-
const
|
|
2657
|
+
const stack = [{
|
|
2658
|
+
rel: ".",
|
|
2659
|
+
depth: 0
|
|
2660
|
+
}];
|
|
2661
|
+
while (stack.length > 0) {
|
|
2662
|
+
const { rel, depth } = stack.pop();
|
|
2667
2663
|
rels.add(rel);
|
|
2668
|
-
if (depth >= WALK_MAX_DEPTH)
|
|
2664
|
+
if (depth >= WALK_MAX_DEPTH) continue;
|
|
2669
2665
|
let entries;
|
|
2670
2666
|
try {
|
|
2671
2667
|
entries = readdirSync(join(installDir, rel), { withFileTypes: true });
|
|
2672
2668
|
} catch {
|
|
2673
|
-
|
|
2669
|
+
continue;
|
|
2674
2670
|
}
|
|
2675
2671
|
for (const e of entries) {
|
|
2676
2672
|
if (!e.isDirectory()) continue;
|
|
2677
2673
|
if (e.name.startsWith(".") || WALK_SKIP_DIRS.has(e.name)) continue;
|
|
2678
2674
|
if (e.name.endsWith(".xcodeproj") || e.name.endsWith(".xcworkspace")) continue;
|
|
2679
|
-
|
|
2675
|
+
stack.push({
|
|
2676
|
+
rel: rel === "." ? e.name : `${rel}/${e.name}`,
|
|
2677
|
+
depth: depth + 1
|
|
2678
|
+
});
|
|
2680
2679
|
}
|
|
2681
|
-
}
|
|
2682
|
-
walk(".", 0);
|
|
2680
|
+
}
|
|
2683
2681
|
return [...rels];
|
|
2684
2682
|
}
|
|
2685
2683
|
/**
|
|
@@ -3046,9 +3044,10 @@ STEP 5 — Offer issue-tracker integrations. (skill: "Connected tools")
|
|
|
3046
3044
|
a source only for a tool the user picked.
|
|
3047
3045
|
|
|
3048
3046
|
STEP 6 — Configure the scout troop. (skill: "Scouts")
|
|
3049
|
-
Materialize the troop,
|
|
3050
|
-
|
|
3051
|
-
|
|
3047
|
+
Materialize the troop, read the project's enforced scout-run budget
|
|
3048
|
+
(24 runs a day by default), then enable only a small set — the
|
|
3049
|
+
"general" scout plus the two or three specialists for the products
|
|
3050
|
+
this project uses most — and disable the rest, per the skill.
|
|
3052
3051
|
|
|
3053
3052
|
STEP 6b — Design custom scouts for this product. (skill: "Custom scouts")
|
|
3054
3053
|
You are the only actor that has read this repo — turn that into
|
|
@@ -3084,7 +3083,7 @@ const SELF_DRIVING_TIPS = [
|
|
|
3084
3083
|
{
|
|
3085
3084
|
id: "scout",
|
|
3086
3085
|
title: "Scout",
|
|
3087
|
-
description: "An agent on a schedule, watching your sources for anomalies and patterns."
|
|
3086
|
+
description: "An agent on a schedule, watching your sources for anomalies and patterns. Your project gets up to 24 scout runs a day by default."
|
|
3088
3087
|
},
|
|
3089
3088
|
{
|
|
3090
3089
|
id: "signal-report",
|
|
@@ -3786,13 +3785,13 @@ const mcpAddCommand = {
|
|
|
3786
3785
|
function runMcpAdd(argv) {
|
|
3787
3786
|
const features = parseFeatures(argv.features);
|
|
3788
3787
|
(async () => {
|
|
3789
|
-
const { readApiKeyFromEnv } = await import("./env-api-key-
|
|
3788
|
+
const { readApiKeyFromEnv } = await import("./env-api-key-DDVkPQmo.js").then((n) => n.t);
|
|
3790
3789
|
const apiKey = argv.apiKey || readApiKeyFromEnv();
|
|
3791
3790
|
const debug = argv.debug;
|
|
3792
3791
|
const localMcp = argv.local;
|
|
3793
3792
|
try {
|
|
3794
|
-
const { startTUI } = await import("./start-tui-
|
|
3795
|
-
const { buildSession } = await import("./wizard-session-
|
|
3793
|
+
const { startTUI } = await import("./start-tui-B2Tb427o.js");
|
|
3794
|
+
const { buildSession } = await import("./wizard-session-C5lZPPEc.js");
|
|
3796
3795
|
const tui = startTUI(VERSION, Program.McpAdd);
|
|
3797
3796
|
tui.store.session = buildSession({
|
|
3798
3797
|
debug,
|
|
@@ -3804,7 +3803,7 @@ function runMcpAdd(argv) {
|
|
|
3804
3803
|
} catch (error) {
|
|
3805
3804
|
if (!isTUIUnavailable(error)) throw error;
|
|
3806
3805
|
setUI(new LoggingUI());
|
|
3807
|
-
const { addMCPServerToClientsStep } = await import("./add-mcp-server-to-clients-
|
|
3806
|
+
const { addMCPServerToClientsStep } = await import("./add-mcp-server-to-clients-C1f2al7N.js").then((n) => n.r);
|
|
3808
3807
|
await addMCPServerToClientsStep({
|
|
3809
3808
|
local: localMcp,
|
|
3810
3809
|
features,
|
|
@@ -3843,8 +3842,8 @@ function runMcpRemove(argv) {
|
|
|
3843
3842
|
const debug = argv.debug;
|
|
3844
3843
|
const localMcp = argv.local;
|
|
3845
3844
|
try {
|
|
3846
|
-
const { startTUI } = await import("./start-tui-
|
|
3847
|
-
const { buildSession } = await import("./wizard-session-
|
|
3845
|
+
const { startTUI } = await import("./start-tui-B2Tb427o.js");
|
|
3846
|
+
const { buildSession } = await import("./wizard-session-C5lZPPEc.js");
|
|
3848
3847
|
const tui = startTUI(VERSION, Program.McpRemove);
|
|
3849
3848
|
tui.store.session = buildSession({
|
|
3850
3849
|
debug,
|
|
@@ -3853,7 +3852,7 @@ function runMcpRemove(argv) {
|
|
|
3853
3852
|
});
|
|
3854
3853
|
} catch {
|
|
3855
3854
|
setUI(new LoggingUI());
|
|
3856
|
-
const { removeMCPServerFromClientsStep } = await import("./add-mcp-server-to-clients-
|
|
3855
|
+
const { removeMCPServerFromClientsStep } = await import("./add-mcp-server-to-clients-C1f2al7N.js").then((n) => n.r);
|
|
3857
3856
|
await removeMCPServerFromClientsStep({ local: localMcp });
|
|
3858
3857
|
}
|
|
3859
3858
|
})();
|
|
@@ -3875,8 +3874,8 @@ function runMcpTutorial(argv) {
|
|
|
3875
3874
|
const debug = argv.debug;
|
|
3876
3875
|
const localMcp = argv.local;
|
|
3877
3876
|
try {
|
|
3878
|
-
const { startTUI } = await import("./start-tui-
|
|
3879
|
-
const { buildSession } = await import("./wizard-session-
|
|
3877
|
+
const { startTUI } = await import("./start-tui-B2Tb427o.js");
|
|
3878
|
+
const { buildSession } = await import("./wizard-session-C5lZPPEc.js");
|
|
3880
3879
|
const tui = startTUI(VERSION, Program.McpTutorial);
|
|
3881
3880
|
tui.store.session = buildSession({
|
|
3882
3881
|
debug,
|
|
@@ -3956,10 +3955,10 @@ function runWizard(config, options) {
|
|
|
3956
3955
|
(async () => {
|
|
3957
3956
|
try {
|
|
3958
3957
|
const installDir = options.installDir || process.cwd();
|
|
3959
|
-
const { startTUI } = await import("./start-tui-
|
|
3960
|
-
const { buildSession, RunPhase } = await import("./wizard-session-
|
|
3961
|
-
const { TaskStreamPush } = await import("./task-stream-
|
|
3962
|
-
const { PostHogDestination } = await import("./posthog-
|
|
3958
|
+
const { startTUI } = await import("./start-tui-B2Tb427o.js");
|
|
3959
|
+
const { buildSession, RunPhase } = await import("./wizard-session-C5lZPPEc.js");
|
|
3960
|
+
const { TaskStreamPush } = await import("./task-stream-DCrqCmFa.js");
|
|
3961
|
+
const { PostHogDestination } = await import("./posthog-mgz-FQlS.js");
|
|
3963
3962
|
tui = startTUI(WIZARD_VERSION, config.id);
|
|
3964
3963
|
const activeTui = tui;
|
|
3965
3964
|
const session = buildSession({
|
|
@@ -4024,7 +4023,7 @@ function runWizard(config, options) {
|
|
|
4024
4023
|
if (shown(step)) await advanceStep(step, activeTui.store, config);
|
|
4025
4024
|
}
|
|
4026
4025
|
else if (skipAgent) {
|
|
4027
|
-
const { getOrAskForProjectData } = await import("./setup-utils-
|
|
4026
|
+
const { getOrAskForProjectData } = await import("./setup-utils-ZKEk71yV.js").then((n) => n.r);
|
|
4028
4027
|
const { projectApiKey, host, accessToken, projectId } = await getOrAskForProjectData({
|
|
4029
4028
|
signup: session.signup,
|
|
4030
4029
|
ci: session.ci,
|
|
@@ -4125,11 +4124,11 @@ function runNonInteractive(config, options, mode) {
|
|
|
4125
4124
|
analytics.setTag("build", mode);
|
|
4126
4125
|
(async () => {
|
|
4127
4126
|
const path = await import("path");
|
|
4128
|
-
const { buildSession, RunPhase, OutroKind } = await import("./wizard-session-
|
|
4129
|
-
const { readEnvironment } = await import("./environment-
|
|
4130
|
-
const { readApiKeyFromEnv } = await import("./env-api-key-
|
|
4131
|
-
const { configureLogFileFromEnvironment, logToFile } = await import("./debug-
|
|
4132
|
-
const { wizardAbort, WizardError } = await import("./wizard-abort-
|
|
4127
|
+
const { buildSession, RunPhase, OutroKind } = await import("./wizard-session-C5lZPPEc.js");
|
|
4128
|
+
const { readEnvironment } = await import("./environment-DJQOs7MR.js").then((n) => n.t);
|
|
4129
|
+
const { readApiKeyFromEnv } = await import("./env-api-key-DDVkPQmo.js").then((n) => n.t);
|
|
4130
|
+
const { configureLogFileFromEnvironment, logToFile } = await import("./debug-By1_VtgZ.js");
|
|
4131
|
+
const { wizardAbort, WizardError } = await import("./wizard-abort-cX4Kytai.js");
|
|
4133
4132
|
configureLogFileFromEnvironment();
|
|
4134
4133
|
const env = readEnvironment();
|
|
4135
4134
|
const apiKey = options.apiKey ?? readApiKeyFromEnv() ?? void 0;
|
|
@@ -4161,9 +4160,9 @@ function runNonInteractive(config, options, mode) {
|
|
|
4161
4160
|
let store = null;
|
|
4162
4161
|
let taskStream = null;
|
|
4163
4162
|
if (mode === "headless") {
|
|
4164
|
-
const { WizardStore } = await import("./store-
|
|
4165
|
-
const { HeadlessUI } = await import("./headless-ui-
|
|
4166
|
-
const { TaskStreamPush, PostHogDestination } = await import("./task-stream-
|
|
4163
|
+
const { WizardStore } = await import("./store-Db77bfRv.js").then((n) => n.n);
|
|
4164
|
+
const { HeadlessUI } = await import("./headless-ui-wIeUgvJ8.js");
|
|
4165
|
+
const { TaskStreamPush, PostHogDestination } = await import("./task-stream-DCrqCmFa.js");
|
|
4167
4166
|
store = new WizardStore(config.id);
|
|
4168
4167
|
store.session = session;
|
|
4169
4168
|
setUI(new HeadlessUI(store));
|
|
@@ -4219,7 +4218,7 @@ function runNonInteractive(config, options, mode) {
|
|
|
4219
4218
|
});
|
|
4220
4219
|
}
|
|
4221
4220
|
}
|
|
4222
|
-
const { runAgent } = await import("./agent-runner-
|
|
4221
|
+
const { runAgent } = await import("./agent-runner-DSKXFDXa.js").then((n) => n.t);
|
|
4223
4222
|
await runAgent(config, session);
|
|
4224
4223
|
await settleStream(RunPhase.Completed);
|
|
4225
4224
|
} catch (error) {
|
|
@@ -5162,7 +5161,7 @@ async function runDoctorCI(options) {
|
|
|
5162
5161
|
getUI().intro("Welcome to the PostHog setup wizard");
|
|
5163
5162
|
getUI().log.info("Running posthog-doctor in CI mode");
|
|
5164
5163
|
try {
|
|
5165
|
-
const { getOrAskForProjectData } = await import("./setup-utils-
|
|
5164
|
+
const { getOrAskForProjectData } = await import("./setup-utils-ZKEk71yV.js").then((n) => n.r);
|
|
5166
5165
|
const { host, accessToken, projectId } = await getOrAskForProjectData({
|
|
5167
5166
|
signup: false,
|
|
5168
5167
|
ci: true,
|
|
@@ -5180,7 +5179,7 @@ async function runDoctorCI(options) {
|
|
|
5180
5179
|
for (const issue of sorted) getUI().log.info(` • [${issue.severity}] ${getKindMeta(issue.kind).title}`);
|
|
5181
5180
|
process.exit(1);
|
|
5182
5181
|
} catch (error) {
|
|
5183
|
-
const { ApiError } = await import("./api-
|
|
5182
|
+
const { ApiError } = await import("./api-BdanR3Zp.js").then((n) => n.n);
|
|
5184
5183
|
const message = error instanceof ApiError && error.statusCode === 401 ? "Your PostHog API key is invalid or expired." : error instanceof Error ? error.message : String(error);
|
|
5185
5184
|
getUI().log.error(`Doctor failed: ${message}`);
|
|
5186
5185
|
process.exit(1);
|
|
@@ -5262,8 +5261,8 @@ function runSlackConnect(argv) {
|
|
|
5262
5261
|
(async () => {
|
|
5263
5262
|
const debug = argv.debug;
|
|
5264
5263
|
try {
|
|
5265
|
-
const { startTUI } = await import("./start-tui-
|
|
5266
|
-
const { buildSession } = await import("./wizard-session-
|
|
5264
|
+
const { startTUI } = await import("./start-tui-B2Tb427o.js");
|
|
5265
|
+
const { buildSession } = await import("./wizard-session-C5lZPPEc.js");
|
|
5267
5266
|
const tui = startTUI(VERSION, Program.SlackConnect);
|
|
5268
5267
|
tui.store.session = buildSession({
|
|
5269
5268
|
debug,
|