@posthog/wizard 2.44.0 → 2.45.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-D5qsqCkj.js → add-mcp-server-to-clients-CNzZMSat.js} +5 -5
- package/dist/{add-mcp-server-to-clients-D5qsqCkj.js.map → add-mcp-server-to-clients-CNzZMSat.js.map} +1 -1
- package/dist/{agent-interface-BvTxWiol.js → agent-interface-CF7GsdFf.js} +297 -157
- package/dist/agent-interface-CF7GsdFf.js.map +1 -0
- package/dist/{agent-runner-BF6_f8Qh.js → agent-runner-B0LTVFfw.js} +130 -598
- package/dist/agent-runner-B0LTVFfw.js.map +1 -0
- package/dist/{analytics-DSlQuwOT.js → analytics-DQEuL6qS.js} +2 -2
- package/dist/{analytics-DSlQuwOT.js.map → analytics-DQEuL6qS.js.map} +1 -1
- package/dist/analytics-YD3D38z2.js +2 -0
- package/dist/{api-BXduJZrw.js → api-uCMvDII5.js} +3 -3
- package/dist/{api-BXduJZrw.js.map → api-uCMvDII5.js.map} +1 -1
- package/dist/bin.js +57 -101
- package/dist/bin.js.map +1 -1
- package/dist/{ci-install-GirEJqu2.js → ci-install-Bow8-f0j.js} +4 -4
- package/dist/{ci-install-GirEJqu2.js.map → ci-install-Bow8-f0j.js.map} +1 -1
- package/dist/commandments-CyB7Icr1.js +42 -0
- package/dist/commandments-CyB7Icr1.js.map +1 -0
- package/dist/commandments-DguPfCX8.js +2 -0
- package/dist/{debug-BOFxiVVs.js → debug-BixHZmHv.js} +1 -1
- package/dist/{debug-DXfQFmcM.js → debug-DBmxx59Q.js} +21 -5
- package/dist/debug-DBmxx59Q.js.map +1 -0
- package/dist/{defaults-BWLIffh5.js → defaults-8zjNjGGi.js} +1 -1
- package/dist/{defaults-BWLIffh5.js.map → defaults-8zjNjGGi.js.map} +1 -1
- package/dist/{env-api-key-cjD4yfGT.js → env-api-key-AcC_tz8G.js} +1 -1
- package/dist/{env-api-key-cjD4yfGT.js.map → env-api-key-AcC_tz8G.js.map} +1 -1
- package/dist/{environment-F1yw21dG.js → environment-kZtkp7eG.js} +3 -3
- package/dist/{environment-F1yw21dG.js.map → environment-kZtkp7eG.js.map} +1 -1
- package/dist/{file-utils-D-7YfJ7A.js → file-utils-BAhYy5vC.js} +2 -2
- package/dist/{file-utils-D-7YfJ7A.js.map → file-utils-BAhYy5vC.js.map} +1 -1
- package/dist/file-watcher-BL-IRbR7.js +123 -0
- package/dist/file-watcher-BL-IRbR7.js.map +1 -0
- package/dist/{headless-ui-Dni0gPND.js → headless-ui-DWmMyhaP.js} +5 -4
- package/dist/headless-ui-DWmMyhaP.js.map +1 -0
- package/dist/{interactive-Bmi82rsO.js → interactive-Cyic0bGL.js} +2 -2
- package/dist/{interactive-Bmi82rsO.js.map → interactive-Cyic0bGL.js.map} +1 -1
- package/dist/{mcp-xKRDnrcq.js → mcp-BSGmEWjt.js} +3 -3
- package/dist/mcp-BSGmEWjt.js.map +1 -0
- package/dist/{mcp-prompt-streaming-AtntLsJ8.js → mcp-prompt-streaming-C227vG1X.js} +3 -3
- package/dist/{mcp-prompt-streaming-AtntLsJ8.js.map → mcp-prompt-streaming-C227vG1X.js.map} +1 -1
- package/dist/{non-interactive-BIHqcW8g.js → non-interactive-DQA9vn9f.js} +2 -2
- package/dist/{non-interactive-BIHqcW8g.js.map → non-interactive-DQA9vn9f.js.map} +1 -1
- package/dist/orchestrator-tools-NuWONNkF.js +99 -0
- package/dist/orchestrator-tools-NuWONNkF.js.map +1 -0
- package/dist/{package-json-CDs1ZVKu.js → package-json-DCuoye-H.js} +1 -1
- package/dist/{package-json-CDs1ZVKu.js.map → package-json-DCuoye-H.js.map} +1 -1
- package/dist/{package-manager-C6R_zpML.js → package-manager-DKtR3xzM.js} +2 -2
- package/dist/{package-manager-C6R_zpML.js.map → package-manager-DKtR3xzM.js.map} +1 -1
- package/dist/pi-DJCln9jJ.js +603 -0
- package/dist/pi-DJCln9jJ.js.map +1 -0
- package/dist/{playground-DwL36I2u.js → playground-CbEndzc8.js} +7 -8
- package/dist/{playground-DwL36I2u.js.map → playground-CbEndzc8.js.map} +1 -1
- package/dist/{posthog-DwKlq0HM.js → posthog-DFyux4Vw.js} +1 -1
- package/dist/{posthog-DwKlq0HM.js.map → posthog-DFyux4Vw.js.map} +1 -1
- package/dist/{posthog-integration-BhLKCFsI.js → posthog-integration-dmWJZ8mj.js} +131 -26
- package/dist/posthog-integration-dmWJZ8mj.js.map +1 -0
- package/dist/{provisioning-jVZm2E-A.js → provisioning-CcxCry5p.js} +3 -3
- package/dist/{provisioning-jVZm2E-A.js.map → provisioning-CcxCry5p.js.map} +1 -1
- package/dist/queue-tools-Bw-AANLM.js +366 -0
- package/dist/queue-tools-Bw-AANLM.js.map +1 -0
- package/dist/{registry-DcoBCMQR.js → registry-D2V88NoC.js} +96 -18
- package/dist/registry-D2V88NoC.js.map +1 -0
- package/dist/{security-jxjVsOpd.js → security-DOtBCBvx.js} +4 -4
- package/dist/{security-jxjVsOpd.js.map → security-DOtBCBvx.js.map} +1 -1
- package/dist/{setup-utils-BQCl28D8.js → setup-utils-Qp-u6BZk.js} +7 -7
- package/dist/{setup-utils-BQCl28D8.js.map → setup-utils-Qp-u6BZk.js.map} +1 -1
- package/dist/{start-tui-DgSKFMVh.js → start-tui-DHa_9aiB.js} +19 -80
- package/dist/start-tui-DHa_9aiB.js.map +1 -0
- package/dist/{steps-erepgD0V.js → steps-D07HUQyE.js} +7 -7
- package/dist/{steps-erepgD0V.js.map → steps-D07HUQyE.js.map} +1 -1
- package/dist/{store-C79GoHCQ.js → store-DSwsITKX.js} +5 -6
- package/dist/store-DSwsITKX.js.map +1 -0
- package/dist/{subagent-aDlD_Ltz.js → subagent-Dk4K5MDa.js} +2 -2
- package/dist/{subagent-aDlD_Ltz.js.map → subagent-Dk4K5MDa.js.map} +1 -1
- package/dist/task-CQnV9Qd2.js +305 -0
- package/dist/task-CQnV9Qd2.js.map +1 -0
- package/dist/{task-stream-0Pk0tPBN.js → task-stream-B7qia9eW.js} +72 -7
- package/dist/task-stream-B7qia9eW.js.map +1 -0
- package/dist/{tasks-ZkrluXCa.js → tasks-C7BQp659.js} +2 -2
- package/dist/{tasks-ZkrluXCa.js.map → tasks-C7BQp659.js.map} +1 -1
- package/dist/{telemetry-DZShaH-y.js → telemetry-DgahJGSx.js} +3 -3
- package/dist/{telemetry-DZShaH-y.js.map → telemetry-DgahJGSx.js.map} +1 -1
- package/dist/{terminal-CEhufbJ4.js → terminal-Bb6tZkf-.js} +13 -13
- package/dist/{terminal-CEhufbJ4.js.map → terminal-Bb6tZkf-.js.map} +1 -1
- package/dist/{tools-BIPMan6l.js → tools-BJEvSUWN.js} +4 -4
- package/dist/{tools-BIPMan6l.js.map → tools-BJEvSUWN.js.map} +1 -1
- package/dist/{types-y3HkjtSq.js → types-BRe_EzTW.js} +1 -1
- package/dist/{types-y3HkjtSq.js.map → types-BRe_EzTW.js.map} +1 -1
- package/dist/{wizard-abort-C14PzXZ8.js → wizard-abort-BxtdkgI-.js} +4 -4
- package/dist/{wizard-abort-C14PzXZ8.js.map → wizard-abort-BxtdkgI-.js.map} +1 -1
- package/dist/{wizard-abort-UCm4Pd5m.js → wizard-abort-DpDmuCfA.js} +1 -1
- package/dist/{wizard-session-C5lZPPEc.js → wizard-session-DWHe83uk.js} +1 -1
- package/dist/{wizard-session-BAZql11N.js → wizard-session-tp4Zdbwl.js} +1 -1
- package/dist/{wizard-session-BAZql11N.js.map → wizard-session-tp4Zdbwl.js.map} +1 -1
- package/dist/{wizard-tools-B7SLjCic.js → wizard-tools-Dg8o2lcH.js} +64 -387
- package/dist/wizard-tools-Dg8o2lcH.js.map +1 -0
- package/dist/yara-hooks-CncaWRuC.js +2 -0
- package/dist/{yara-hooks-CPH8N4yz.js → yara-hooks-pw86rZ8y.js} +4 -4
- package/dist/{yara-hooks-CPH8N4yz.js.map → yara-hooks-pw86rZ8y.js.map} +1 -1
- package/package.json +1 -1
- package/dist/agent-interface-BvTxWiol.js.map +0 -1
- package/dist/agent-runner-BF6_f8Qh.js.map +0 -1
- package/dist/analytics-C7Xx6csw.js +0 -2
- package/dist/debug-DXfQFmcM.js.map +0 -1
- package/dist/headless-ui-Dni0gPND.js.map +0 -1
- package/dist/mcp-xKRDnrcq.js.map +0 -1
- package/dist/posthog-integration-BhLKCFsI.js.map +0 -1
- package/dist/registry-DcoBCMQR.js.map +0 -1
- package/dist/start-tui-DgSKFMVh.js.map +0 -1
- package/dist/store-C79GoHCQ.js.map +0 -1
- package/dist/task-stream-0Pk0tPBN.js.map +0 -1
- package/dist/wizard-tools-B7SLjCic.js.map +0 -1
- package/dist/wizard-ui-WZ48rUgr.js +0 -15
- package/dist/wizard-ui-WZ48rUgr.js.map +0 -1
- package/dist/yara-hooks-VZlj4Lib.js +0 -2
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { t as __exportAll } from "./rolldown-runtime-B_-DWIq7.js";
|
|
2
|
-
import {
|
|
3
|
-
import { n as analytics } from "./analytics-
|
|
2
|
+
import { ht as WIZARD_USER_AGENT } from "./debug-DBmxx59Q.js";
|
|
3
|
+
import { n as analytics } from "./analytics-DQEuL6qS.js";
|
|
4
4
|
import axios from "axios";
|
|
5
5
|
import { z } from "zod";
|
|
6
6
|
//#region src/lib/api.ts
|
|
@@ -170,4 +170,4 @@ function handleApiError(error, operation) {
|
|
|
170
170
|
//#endregion
|
|
171
171
|
export { fetchUserData as a, fetchSlackConnected as i, api_exports as n, handleApiError as o, fetchProjectData as r, ApiError as t };
|
|
172
172
|
|
|
173
|
-
//# sourceMappingURL=api-
|
|
173
|
+
//# sourceMappingURL=api-uCMvDII5.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api-BXduJZrw.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-uCMvDII5.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,28 +1,29 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import {
|
|
3
|
-
import { n as analytics } from "./analytics-
|
|
4
|
-
import { r as setEntryCommand } from "./telemetry-
|
|
5
|
-
import { n as isUsingTypeScript } from "./setup-utils-
|
|
6
|
-
import { o as handleApiError } from "./api-
|
|
7
|
-
import "./wizard-session-
|
|
8
|
-
import { r as runCleanups } from "./wizard-abort-
|
|
9
|
-
import { n as isNonInteractiveEnvironment } from "./environment-
|
|
10
|
-
import { n as runAgent, o as authenticate } from "./agent-runner-
|
|
11
|
-
import { l as recoverOrphanedSettingsBackups, p as AgentSignals } from "./agent-interface-
|
|
12
|
-
import {
|
|
13
|
-
import {
|
|
14
|
-
import { h as SETUP_REPORT_FILE } from "./yara-hooks-
|
|
15
|
-
import { i as SPINNER_MESSAGE
|
|
16
|
-
import {
|
|
17
|
-
import { n as safeReadFile, r as walkProjectFiles, t as IGNORED_DIRS } from "./file-utils-
|
|
18
|
-
import { n as readApiKeyFromEnv } from "./env-api-key-
|
|
2
|
+
import { B as Integration, Ct as headlessOption, K as POSTHOG_DOCS_URL, _t as getSkillsBaseUrl, a as getLogFilePath, f as getUI, ht as WIZARD_USER_AGENT, m as LoggingUI, p as setUI, r as debug, s as logToFile, wt as isHeadless, yt as VERSION } from "./debug-DBmxx59Q.js";
|
|
3
|
+
import { n as analytics } from "./analytics-DQEuL6qS.js";
|
|
4
|
+
import { r as setEntryCommand } from "./telemetry-DgahJGSx.js";
|
|
5
|
+
import { n as isUsingTypeScript } from "./setup-utils-Qp-u6BZk.js";
|
|
6
|
+
import { o as handleApiError } from "./api-uCMvDII5.js";
|
|
7
|
+
import "./wizard-session-tp4Zdbwl.js";
|
|
8
|
+
import { r as runCleanups } from "./wizard-abort-BxtdkgI-.js";
|
|
9
|
+
import { n as isNonInteractiveEnvironment } from "./environment-kZtkp7eG.js";
|
|
10
|
+
import { n as runAgent, o as authenticate } from "./agent-runner-B0LTVFfw.js";
|
|
11
|
+
import { l as recoverOrphanedSettingsBackups, p as AgentSignals } from "./agent-interface-CF7GsdFf.js";
|
|
12
|
+
import { n as AUDIT_CHECKS_KEY, r as AUDIT_REPORT_FILE, t as AUDIT_CHECKS_FILE } from "./types-BRe_EzTW.js";
|
|
13
|
+
import { i as fetchSkillMenu, t as WIZARD_TOOL_NAMES } from "./wizard-tools-Dg8o2lcH.js";
|
|
14
|
+
import { h as SETUP_REPORT_FILE } from "./yara-hooks-pw86rZ8y.js";
|
|
15
|
+
import { i as SPINNER_MESSAGE } from "./registry-D2V88NoC.js";
|
|
16
|
+
import { S as parseRequirementsTxt, a as LINE_CHART_BLOCK, b as parsePipfile, g as detectIntegrationProjects, 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 resolveProjectDir, x as parsePyprojectToml, y as gatherFrameworkContext } from "./posthog-integration-dmWJZ8mj.js";
|
|
17
|
+
import { n as safeReadFile, r as walkProjectFiles, t as IGNORED_DIRS } from "./file-utils-BAhYy5vC.js";
|
|
18
|
+
import { n as readApiKeyFromEnv } from "./env-api-key-AcC_tz8G.js";
|
|
19
19
|
import { satisfies } from "semver";
|
|
20
20
|
import yargs from "yargs";
|
|
21
21
|
import { hideBin } from "yargs/helpers";
|
|
22
22
|
import fs, { existsSync, readFileSync, readdirSync, statSync } from "fs";
|
|
23
|
-
import path, { join, relative
|
|
23
|
+
import path, { join, relative } from "path";
|
|
24
24
|
import * as os from "node:os";
|
|
25
25
|
import * as path$1 from "node:path";
|
|
26
|
+
import { join as join$1 } from "node:path";
|
|
26
27
|
import { spawnSync } from "node:child_process";
|
|
27
28
|
import * as fs$1 from "node:fs";
|
|
28
29
|
import axios from "axios";
|
|
@@ -206,7 +207,7 @@ function runProvision(argv) {
|
|
|
206
207
|
}
|
|
207
208
|
async function provision({ email, region, name, baseUrl, jsonMode }) {
|
|
208
209
|
try {
|
|
209
|
-
const { provisionNewAccount } = await import("./provisioning-
|
|
210
|
+
const { provisionNewAccount } = await import("./provisioning-CcxCry5p.js").then((n) => n.n);
|
|
210
211
|
if (!jsonMode) getUI().log.info(`Provisioning account for ${email} in ${region}...`);
|
|
211
212
|
emitResult(await provisionNewAccount(email, name, region, { baseUrl }), jsonMode);
|
|
212
213
|
process.exit(0);
|
|
@@ -272,22 +273,22 @@ const basicIntegrationCommand = {
|
|
|
272
273
|
setEntryCommand("integrate");
|
|
273
274
|
(async () => {
|
|
274
275
|
if (isHeadless(argv)) {
|
|
275
|
-
const { runHeadlessInstall } = await import("./ci-install-
|
|
276
|
+
const { runHeadlessInstall } = await import("./ci-install-Bow8-f0j.js");
|
|
276
277
|
return runHeadlessInstall(argv);
|
|
277
278
|
}
|
|
278
279
|
if (argv.ci) {
|
|
279
|
-
const { runCIInstall } = await import("./ci-install-
|
|
280
|
+
const { runCIInstall } = await import("./ci-install-Bow8-f0j.js");
|
|
280
281
|
return runCIInstall(argv);
|
|
281
282
|
}
|
|
282
283
|
if (isNonInteractiveEnvironment()) {
|
|
283
|
-
const { failNonInteractive } = await import("./non-interactive-
|
|
284
|
+
const { failNonInteractive } = await import("./non-interactive-DQA9vn9f.js");
|
|
284
285
|
return failNonInteractive();
|
|
285
286
|
}
|
|
286
287
|
if (argv.playground) {
|
|
287
|
-
const { runPlayground } = await import("./playground-
|
|
288
|
+
const { runPlayground } = await import("./playground-CbEndzc8.js");
|
|
288
289
|
return runPlayground();
|
|
289
290
|
}
|
|
290
|
-
const { runInteractive } = await import("./interactive-
|
|
291
|
+
const { runInteractive } = await import("./interactive-Cyic0bGL.js");
|
|
291
292
|
runInteractive(argv);
|
|
292
293
|
})();
|
|
293
294
|
}
|
|
@@ -3444,23 +3445,6 @@ function detectSelfDrivingPrerequisites(session, setFrameworkContext) {
|
|
|
3444
3445
|
}
|
|
3445
3446
|
//#endregion
|
|
3446
3447
|
//#region src/lib/programs/self-driving/detect-agentic.ts
|
|
3447
|
-
/**
|
|
3448
|
-
* Agentic (Haiku) detection for self-driving's integration phase.
|
|
3449
|
-
*
|
|
3450
|
-
* Mirrors source-maps: the integration-detect screen runs `detectSelfDriving-
|
|
3451
|
-
* IntegrationProjects` (the shared Haiku detector with the integration framework
|
|
3452
|
-
* targets), shows a project map, and the user picks one. This file supplies the
|
|
3453
|
-
* targets, maps the result back to `Integration`s, and classifies each project
|
|
3454
|
-
* as instrumentable (a framework the wizard supports that doesn't already have
|
|
3455
|
-
* PostHog). The screen writes the choice to the session; `prepSelfDriving-
|
|
3456
|
-
* Integration` then gathers the chosen project's framework context before the
|
|
3457
|
-
* integration agent runs (the runner scopes the install dir).
|
|
3458
|
-
*/
|
|
3459
|
-
/** Integration framework targets for the agentic detector (id → display name). */
|
|
3460
|
-
const INTEGRATION_TARGETS = Object.entries(FRAMEWORK_REGISTRY).map(([id, config]) => ({
|
|
3461
|
-
id,
|
|
3462
|
-
name: config.metadata.name
|
|
3463
|
-
}));
|
|
3464
3448
|
const INTEGRATION_IDS = new Set(Object.values(Integration));
|
|
3465
3449
|
function classify(integration, hasPostHog) {
|
|
3466
3450
|
if (integration == null) return {
|
|
@@ -3492,11 +3476,7 @@ function toIntegrationReport(report) {
|
|
|
3492
3476
|
}
|
|
3493
3477
|
/** Run the Haiku detector over the repo and classify projects for integration. */
|
|
3494
3478
|
async function detectSelfDrivingIntegrationProjects(session, onEvent) {
|
|
3495
|
-
return toIntegrationReport(await
|
|
3496
|
-
targets: INTEGRATION_TARGETS,
|
|
3497
|
-
purpose: "set up a PostHog SDK integration",
|
|
3498
|
-
onEvent
|
|
3499
|
-
}));
|
|
3479
|
+
return toIntegrationReport(await detectIntegrationProjects(session, { onEvent }));
|
|
3500
3480
|
}
|
|
3501
3481
|
/**
|
|
3502
3482
|
* Prepare the integration phase after the user picked a project on the
|
|
@@ -3523,36 +3503,10 @@ async function prepSelfDrivingIntegration(session) {
|
|
|
3523
3503
|
}
|
|
3524
3504
|
//#endregion
|
|
3525
3505
|
//#region src/lib/programs/self-driving/steps.ts
|
|
3526
|
-
/**
|
|
3527
|
-
* Self-driving program step list.
|
|
3528
|
-
*
|
|
3529
|
-
* detect → intro → integration-check → health-check → auth → integrate-detect →
|
|
3530
|
-
* integrate-run → self-driving-handoff → run → outro. A deterministic check in
|
|
3531
|
-
* `detect` decides whether PostHog is already in the project: found → the
|
|
3532
|
-
* integration screens are skipped and the integrate-run phase never shows; not
|
|
3533
|
-
* found → integration-check reports it and the only action sets up PostHog.
|
|
3534
|
-
* After auth, `integrate-detect` runs the Haiku detector and has the user pick
|
|
3535
|
-
* which project to set PostHog up in (a monorepo can have several);
|
|
3536
|
-
* `integrate-run` then runs the real integration program's agent (its own task
|
|
3537
|
-
* list) in that project. `self-driving-handoff` then bridges to Self-driving
|
|
3538
|
-
* ("PostHog is installed — now set up Self-driving") before the Self-driving
|
|
3539
|
-
* run. No keep-skills step: the setup skill is transient, so postRun removes it.
|
|
3540
|
-
*/
|
|
3541
3506
|
/** True once detection found PostHog already present in the project. */
|
|
3542
3507
|
const postHogPresent = (session) => session.frameworkContext[POSTHOG_PRESENT_KEY] === true;
|
|
3543
|
-
/**
|
|
3544
|
-
|
|
3545
|
-
* The picked path originates from LLM output; if it resolves outside the
|
|
3546
|
-
* repo (defense-in-depth on top of the coerce-layer clamp), fall back to
|
|
3547
|
-
* the root rather than run the agent elsewhere.
|
|
3548
|
-
*/
|
|
3549
|
-
const integrationDir = (session) => {
|
|
3550
|
-
const rel = session.frameworkContext[SELF_DRIVING_INTEGRATE_PATH_KEY];
|
|
3551
|
-
if (typeof rel !== "string" || rel === ".") return session.installDir;
|
|
3552
|
-
const root = resolve(session.installDir);
|
|
3553
|
-
const dir = resolve(root, rel);
|
|
3554
|
-
return dir === root || dir.startsWith(root + sep) ? dir : root;
|
|
3555
|
-
};
|
|
3508
|
+
/** Absolute dir to integrate into: the picked sub-app (LLM output — the shared resolver clamps escapes), else the repo root. */
|
|
3509
|
+
const integrationDir = (session) => resolveProjectDir(session.installDir, session.frameworkContext[SELF_DRIVING_INTEGRATE_PATH_KEY]);
|
|
3556
3510
|
const SELF_DRIVING_PROGRAM = [
|
|
3557
3511
|
{
|
|
3558
3512
|
id: "detect",
|
|
@@ -4433,13 +4387,13 @@ const mcpAddCommand = {
|
|
|
4433
4387
|
function runMcpAdd(argv) {
|
|
4434
4388
|
const features = parseFeatures(argv.features);
|
|
4435
4389
|
(async () => {
|
|
4436
|
-
const { readApiKeyFromEnv } = await import("./env-api-key-
|
|
4390
|
+
const { readApiKeyFromEnv } = await import("./env-api-key-AcC_tz8G.js").then((n) => n.t);
|
|
4437
4391
|
const apiKey = argv.apiKey || readApiKeyFromEnv();
|
|
4438
4392
|
const debug = argv.debug;
|
|
4439
4393
|
const localMcp = argv.local;
|
|
4440
4394
|
try {
|
|
4441
|
-
const { startTUI } = await import("./start-tui-
|
|
4442
|
-
const { buildSession } = await import("./wizard-session-
|
|
4395
|
+
const { startTUI } = await import("./start-tui-DHa_9aiB.js");
|
|
4396
|
+
const { buildSession } = await import("./wizard-session-DWHe83uk.js");
|
|
4443
4397
|
const tui = startTUI(VERSION, Program.McpAdd);
|
|
4444
4398
|
tui.store.session = buildSession({
|
|
4445
4399
|
debug,
|
|
@@ -4451,7 +4405,7 @@ function runMcpAdd(argv) {
|
|
|
4451
4405
|
} catch (error) {
|
|
4452
4406
|
if (!isTUIUnavailable(error)) throw error;
|
|
4453
4407
|
setUI(new LoggingUI());
|
|
4454
|
-
const { addMCPServerToClientsStep } = await import("./add-mcp-server-to-clients-
|
|
4408
|
+
const { addMCPServerToClientsStep } = await import("./add-mcp-server-to-clients-CNzZMSat.js").then((n) => n.r);
|
|
4455
4409
|
await addMCPServerToClientsStep({
|
|
4456
4410
|
local: localMcp,
|
|
4457
4411
|
features,
|
|
@@ -4490,8 +4444,8 @@ function runMcpRemove(argv) {
|
|
|
4490
4444
|
const debug = argv.debug;
|
|
4491
4445
|
const localMcp = argv.local;
|
|
4492
4446
|
try {
|
|
4493
|
-
const { startTUI } = await import("./start-tui-
|
|
4494
|
-
const { buildSession } = await import("./wizard-session-
|
|
4447
|
+
const { startTUI } = await import("./start-tui-DHa_9aiB.js");
|
|
4448
|
+
const { buildSession } = await import("./wizard-session-DWHe83uk.js");
|
|
4495
4449
|
const tui = startTUI(VERSION, Program.McpRemove);
|
|
4496
4450
|
tui.store.session = buildSession({
|
|
4497
4451
|
debug,
|
|
@@ -4500,7 +4454,7 @@ function runMcpRemove(argv) {
|
|
|
4500
4454
|
});
|
|
4501
4455
|
} catch {
|
|
4502
4456
|
setUI(new LoggingUI());
|
|
4503
|
-
const { removeMCPServerFromClientsStep } = await import("./add-mcp-server-to-clients-
|
|
4457
|
+
const { removeMCPServerFromClientsStep } = await import("./add-mcp-server-to-clients-CNzZMSat.js").then((n) => n.r);
|
|
4504
4458
|
await removeMCPServerFromClientsStep({ local: localMcp });
|
|
4505
4459
|
}
|
|
4506
4460
|
})();
|
|
@@ -4522,8 +4476,8 @@ function runMcpTutorial(argv) {
|
|
|
4522
4476
|
const debug = argv.debug;
|
|
4523
4477
|
const localMcp = argv.local;
|
|
4524
4478
|
try {
|
|
4525
|
-
const { startTUI } = await import("./start-tui-
|
|
4526
|
-
const { buildSession } = await import("./wizard-session-
|
|
4479
|
+
const { startTUI } = await import("./start-tui-DHa_9aiB.js");
|
|
4480
|
+
const { buildSession } = await import("./wizard-session-DWHe83uk.js");
|
|
4527
4481
|
const tui = startTUI(VERSION, Program.McpTutorial);
|
|
4528
4482
|
tui.store.session = buildSession({
|
|
4529
4483
|
debug,
|
|
@@ -4603,10 +4557,10 @@ function runWizard(config, options) {
|
|
|
4603
4557
|
(async () => {
|
|
4604
4558
|
try {
|
|
4605
4559
|
const installDir = options.installDir || process.cwd();
|
|
4606
|
-
const { startTUI } = await import("./start-tui-
|
|
4607
|
-
const { buildSession, RunPhase } = await import("./wizard-session-
|
|
4608
|
-
const { TaskStreamPush } = await import("./task-stream-
|
|
4609
|
-
const { PostHogDestination } = await import("./posthog-
|
|
4560
|
+
const { startTUI } = await import("./start-tui-DHa_9aiB.js");
|
|
4561
|
+
const { buildSession, RunPhase } = await import("./wizard-session-DWHe83uk.js");
|
|
4562
|
+
const { TaskStreamPush } = await import("./task-stream-B7qia9eW.js");
|
|
4563
|
+
const { PostHogDestination } = await import("./posthog-DFyux4Vw.js");
|
|
4610
4564
|
tui = startTUI(WIZARD_VERSION, config.id);
|
|
4611
4565
|
const activeTui = tui;
|
|
4612
4566
|
const session = buildSession({
|
|
@@ -4639,6 +4593,7 @@ function runWizard(config, options) {
|
|
|
4639
4593
|
getCredentials: () => activeTui.store.session.credentials,
|
|
4640
4594
|
onError: (err) => logToFile("[task-stream-push]", err.message)
|
|
4641
4595
|
})],
|
|
4596
|
+
eventPlanPath: config.eventPlanFile ? join$1(session.installDir, config.eventPlanFile) : void 0,
|
|
4642
4597
|
enabled: taskStreamEnabled
|
|
4643
4598
|
});
|
|
4644
4599
|
const activeStream = taskStream;
|
|
@@ -4670,7 +4625,7 @@ function runWizard(config, options) {
|
|
|
4670
4625
|
if (shown(step)) await advanceStep(step, activeTui.store, config);
|
|
4671
4626
|
}
|
|
4672
4627
|
else if (skipAgent) {
|
|
4673
|
-
const { getOrAskForProjectData } = await import("./setup-utils-
|
|
4628
|
+
const { getOrAskForProjectData } = await import("./setup-utils-Qp-u6BZk.js").then((n) => n.r);
|
|
4674
4629
|
const { projectApiKey, host, accessToken, projectId } = await getOrAskForProjectData({
|
|
4675
4630
|
signup: session.signup,
|
|
4676
4631
|
ci: session.ci,
|
|
@@ -4772,11 +4727,11 @@ function runNonInteractive(config, options, mode) {
|
|
|
4772
4727
|
analytics.setTag("build", mode);
|
|
4773
4728
|
(async () => {
|
|
4774
4729
|
const path = await import("path");
|
|
4775
|
-
const { buildSession, RunPhase, OutroKind } = await import("./wizard-session-
|
|
4776
|
-
const { readEnvironment } = await import("./environment-
|
|
4777
|
-
const { readApiKeyFromEnv } = await import("./env-api-key-
|
|
4778
|
-
const { configureLogFileFromEnvironment, logToFile } = await import("./debug-
|
|
4779
|
-
const { wizardAbort, WizardError } = await import("./wizard-abort-
|
|
4730
|
+
const { buildSession, RunPhase, OutroKind } = await import("./wizard-session-DWHe83uk.js");
|
|
4731
|
+
const { readEnvironment } = await import("./environment-kZtkp7eG.js").then((n) => n.t);
|
|
4732
|
+
const { readApiKeyFromEnv } = await import("./env-api-key-AcC_tz8G.js").then((n) => n.t);
|
|
4733
|
+
const { configureLogFileFromEnvironment, logToFile } = await import("./debug-BixHZmHv.js");
|
|
4734
|
+
const { wizardAbort, WizardError } = await import("./wizard-abort-DpDmuCfA.js");
|
|
4780
4735
|
configureLogFileFromEnvironment();
|
|
4781
4736
|
const env = readEnvironment();
|
|
4782
4737
|
const apiKey = options.apiKey ?? readApiKeyFromEnv() ?? void 0;
|
|
@@ -4807,9 +4762,9 @@ function runNonInteractive(config, options, mode) {
|
|
|
4807
4762
|
let store = null;
|
|
4808
4763
|
let taskStream = null;
|
|
4809
4764
|
if (mode === "headless") {
|
|
4810
|
-
const { WizardStore } = await import("./store-
|
|
4811
|
-
const { HeadlessUI } = await import("./headless-ui-
|
|
4812
|
-
const { TaskStreamPush, PostHogDestination } = await import("./task-stream-
|
|
4765
|
+
const { WizardStore } = await import("./store-DSwsITKX.js").then((n) => n.n);
|
|
4766
|
+
const { HeadlessUI } = await import("./headless-ui-DWmMyhaP.js");
|
|
4767
|
+
const { TaskStreamPush, PostHogDestination } = await import("./task-stream-B7qia9eW.js");
|
|
4813
4768
|
store = new WizardStore(config.id);
|
|
4814
4769
|
store.session = session;
|
|
4815
4770
|
setUI(new HeadlessUI(store));
|
|
@@ -4820,6 +4775,7 @@ function runNonInteractive(config, options, mode) {
|
|
|
4820
4775
|
getCredentials: () => session.credentials,
|
|
4821
4776
|
onError: (e) => logToFile("[headless task-stream]", e.message)
|
|
4822
4777
|
})],
|
|
4778
|
+
eventPlanPath: config.eventPlanFile ? join$1(session.installDir, config.eventPlanFile) : void 0,
|
|
4823
4779
|
enabled: !session.noTelemetry
|
|
4824
4780
|
});
|
|
4825
4781
|
taskStream.attach();
|
|
@@ -4864,7 +4820,7 @@ function runNonInteractive(config, options, mode) {
|
|
|
4864
4820
|
});
|
|
4865
4821
|
}
|
|
4866
4822
|
}
|
|
4867
|
-
const { runAgent } = await import("./agent-runner-
|
|
4823
|
+
const { runAgent } = await import("./agent-runner-B0LTVFfw.js").then((n) => n.t);
|
|
4868
4824
|
await runAgent(config, session);
|
|
4869
4825
|
await settleStream(RunPhase.Completed);
|
|
4870
4826
|
} catch (error) {
|
|
@@ -5793,7 +5749,7 @@ async function runDoctorCI(options) {
|
|
|
5793
5749
|
getUI().intro("Welcome to the PostHog setup wizard");
|
|
5794
5750
|
getUI().log.info("Running posthog-doctor in CI mode");
|
|
5795
5751
|
try {
|
|
5796
|
-
const { getOrAskForProjectData } = await import("./setup-utils-
|
|
5752
|
+
const { getOrAskForProjectData } = await import("./setup-utils-Qp-u6BZk.js").then((n) => n.r);
|
|
5797
5753
|
const { host, accessToken, projectId } = await getOrAskForProjectData({
|
|
5798
5754
|
signup: false,
|
|
5799
5755
|
ci: true,
|
|
@@ -5811,7 +5767,7 @@ async function runDoctorCI(options) {
|
|
|
5811
5767
|
for (const issue of sorted) getUI().log.info(` • [${issue.severity}] ${getKindMeta(issue.kind).title}`);
|
|
5812
5768
|
process.exit(1);
|
|
5813
5769
|
} catch (error) {
|
|
5814
|
-
const { ApiError } = await import("./api-
|
|
5770
|
+
const { ApiError } = await import("./api-uCMvDII5.js").then((n) => n.n);
|
|
5815
5771
|
const message = error instanceof ApiError && error.statusCode === 401 ? "Your PostHog API key is invalid or expired." : error instanceof Error ? error.message : String(error);
|
|
5816
5772
|
getUI().log.error(`Doctor failed: ${message}`);
|
|
5817
5773
|
process.exit(1);
|
|
@@ -5893,8 +5849,8 @@ function runSlackConnect(argv) {
|
|
|
5893
5849
|
(async () => {
|
|
5894
5850
|
const debug = argv.debug;
|
|
5895
5851
|
try {
|
|
5896
|
-
const { startTUI } = await import("./start-tui-
|
|
5897
|
-
const { buildSession } = await import("./wizard-session-
|
|
5852
|
+
const { startTUI } = await import("./start-tui-DHa_9aiB.js");
|
|
5853
|
+
const { buildSession } = await import("./wizard-session-DWHe83uk.js");
|
|
5898
5854
|
const tui = startTUI(VERSION, Program.SlackConnect);
|
|
5899
5855
|
tui.store.session = buildSession({
|
|
5900
5856
|
debug,
|