@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.
Files changed (116) hide show
  1. package/dist/{add-mcp-server-to-clients-DnyxFVhW.js → add-mcp-server-to-clients-C1f2al7N.js} +5 -5
  2. package/dist/{add-mcp-server-to-clients-DnyxFVhW.js.map → add-mcp-server-to-clients-C1f2al7N.js.map} +1 -1
  3. package/dist/{agent-interface-Doo3apDE.js → agent-interface-BL2wCV3b.js} +33 -71
  4. package/dist/agent-interface-BL2wCV3b.js.map +1 -0
  5. package/dist/agent-prompt-loader-CEWWA98d.js +275 -0
  6. package/dist/agent-prompt-loader-CEWWA98d.js.map +1 -0
  7. package/dist/{agent-runner-D7OZPgIV.js → agent-runner-DSKXFDXa.js} +101 -319
  8. package/dist/agent-runner-DSKXFDXa.js.map +1 -0
  9. package/dist/{analytics-D6gRGiqt.js → analytics-Ddf3zJgF.js} +20 -2
  10. package/dist/analytics-Ddf3zJgF.js.map +1 -0
  11. package/dist/analytics-GD_xM1XO.js +2 -0
  12. package/dist/{api-ZT2Zd5yp.js → api-BdanR3Zp.js} +3 -3
  13. package/dist/{api-ZT2Zd5yp.js.map → api-BdanR3Zp.js.map} +1 -1
  14. package/dist/bin.js +89 -90
  15. package/dist/bin.js.map +1 -1
  16. package/dist/bounded-fs-d0dw1Qv5.js +242 -0
  17. package/dist/bounded-fs-d0dw1Qv5.js.map +1 -0
  18. package/dist/{ci-install-CQWSPGdM.js → ci-install-DnVNVs0f.js} +4 -4
  19. package/dist/{ci-install-CQWSPGdM.js.map → ci-install-DnVNVs0f.js.map} +1 -1
  20. package/dist/commandments-BagyrYRW.js +2 -0
  21. package/dist/{commandments-DSNrOeOC.js → commandments-DiMtIz1o.js} +1 -1
  22. package/dist/{commandments-DSNrOeOC.js.map → commandments-DiMtIz1o.js.map} +1 -1
  23. package/dist/{debug-D8AJ_YCW.js → debug-By1_VtgZ.js} +1 -1
  24. package/dist/{debug-DF51kDvZ.js → debug-DaXKSXEy.js} +8 -27
  25. package/dist/debug-DaXKSXEy.js.map +1 -0
  26. package/dist/{defaults-CtWMmC8s.js → defaults-DAE9_QMn.js} +1 -1
  27. package/dist/{defaults-CtWMmC8s.js.map → defaults-DAE9_QMn.js.map} +1 -1
  28. package/dist/{env-api-key-C3LzH8Lr.js → env-api-key-DDVkPQmo.js} +1 -1
  29. package/dist/{env-api-key-C3LzH8Lr.js.map → env-api-key-DDVkPQmo.js.map} +1 -1
  30. package/dist/{environment-Csj7vBHM.js → environment-DJQOs7MR.js} +4 -4
  31. package/dist/environment-DJQOs7MR.js.map +1 -0
  32. package/dist/{file-watcher-CQB00KDS.js → file-watcher-LZe_W3hM.js} +2 -2
  33. package/dist/{file-watcher-CQB00KDS.js.map → file-watcher-LZe_W3hM.js.map} +1 -1
  34. package/dist/{headless-ui-DfSOfXEo.js → headless-ui-wIeUgvJ8.js} +2 -2
  35. package/dist/{headless-ui-DfSOfXEo.js.map → headless-ui-wIeUgvJ8.js.map} +1 -1
  36. package/dist/{interactive-DmRqhAUD.js → interactive-j4DoJDnk.js} +2 -2
  37. package/dist/{interactive-DmRqhAUD.js.map → interactive-j4DoJDnk.js.map} +1 -1
  38. package/dist/{mcp-B_ycbOus.js → mcp-Butt7ktW.js} +2 -2
  39. package/dist/{mcp-B_ycbOus.js.map → mcp-Butt7ktW.js.map} +1 -1
  40. package/dist/{mcp-prompt-streaming-ChEBHPQ-.js → mcp-prompt-streaming-D25BQfRa.js} +3 -3
  41. package/dist/{mcp-prompt-streaming-ChEBHPQ-.js.map → mcp-prompt-streaming-D25BQfRa.js.map} +1 -1
  42. package/dist/{non-interactive-ViR2FrQC.js → non-interactive-Cpof2JsA.js} +2 -2
  43. package/dist/{non-interactive-ViR2FrQC.js.map → non-interactive-Cpof2JsA.js.map} +1 -1
  44. package/dist/{orchestrator-tools-B0vrJlpS.js → orchestrator-tools-CsJizPpV.js} +3 -3
  45. package/dist/{orchestrator-tools-B0vrJlpS.js.map → orchestrator-tools-CsJizPpV.js.map} +1 -1
  46. package/dist/{package-json-DCuoye-H.js → package-json-CDs1ZVKu.js} +1 -1
  47. package/dist/{package-json-DCuoye-H.js.map → package-json-CDs1ZVKu.js.map} +1 -1
  48. package/dist/{package-manager-B6QAvLyt.js → package-manager-DnzNEjci.js} +2 -2
  49. package/dist/{package-manager-B6QAvLyt.js.map → package-manager-DnzNEjci.js.map} +1 -1
  50. package/dist/{pi-CXhGyUbi.js → pi-DE2cAVfO.js} +89 -138
  51. package/dist/pi-DE2cAVfO.js.map +1 -0
  52. package/dist/{playground-D_cP2oXt.js → playground-C3sLBq6A.js} +7 -7
  53. package/dist/{playground-D_cP2oXt.js.map → playground-C3sLBq6A.js.map} +1 -1
  54. package/dist/{posthog-integration-Bt8jQC7c.js → posthog-integration-_GSKRotZ.js} +45 -38
  55. package/dist/posthog-integration-_GSKRotZ.js.map +1 -0
  56. package/dist/{posthog-DZZbziJ1.js → posthog-mgz-FQlS.js} +1 -1
  57. package/dist/{posthog-DZZbziJ1.js.map → posthog-mgz-FQlS.js.map} +1 -1
  58. package/dist/{provisioning-By5DVLJr.js → provisioning-BndgugFk.js} +3 -3
  59. package/dist/{provisioning-By5DVLJr.js.map → provisioning-BndgugFk.js.map} +1 -1
  60. package/dist/{queue-tools-3iQHCpWF.js → queue-tools-DZjAjiqk.js} +97 -10
  61. package/dist/queue-tools-DZjAjiqk.js.map +1 -0
  62. package/dist/{registry-DG8r_Wks.js → registry-BMjfECF2.js} +272 -429
  63. package/dist/registry-BMjfECF2.js.map +1 -0
  64. package/dist/{security-BpbwefgM.js → security-D5hjYVFi.js} +4 -4
  65. package/dist/{security-BpbwefgM.js.map → security-D5hjYVFi.js.map} +1 -1
  66. package/dist/{setup-utils-CFejYe1M.js → setup-utils-ZKEk71yV.js} +14 -17
  67. package/dist/setup-utils-ZKEk71yV.js.map +1 -0
  68. package/dist/smoke-test.sh +1 -1
  69. package/dist/{start-tui-BINHq3Yp.js → start-tui-B2Tb427o.js} +19 -19
  70. package/dist/{start-tui-BINHq3Yp.js.map → start-tui-B2Tb427o.js.map} +1 -1
  71. package/dist/{steps-DhmMIChh.js → steps-ClMZ6MZd.js} +7 -7
  72. package/dist/{steps-DhmMIChh.js.map → steps-ClMZ6MZd.js.map} +1 -1
  73. package/dist/{store-Bj1m0ws-.js → store-Db77bfRv.js} +5 -5
  74. package/dist/{store-Bj1m0ws-.js.map → store-Db77bfRv.js.map} +1 -1
  75. package/dist/{subagent-DND7lZg6.js → subagent--VXEEc8S.js} +2 -2
  76. package/dist/{subagent-DND7lZg6.js.map → subagent--VXEEc8S.js.map} +1 -1
  77. package/dist/{task-CsAczwW6.js → task-CBQfx_f5.js} +30 -45
  78. package/dist/task-CBQfx_f5.js.map +1 -0
  79. package/dist/{task-stream-BaiI6TNY.js → task-stream-DCrqCmFa.js} +5 -5
  80. package/dist/{task-stream-BaiI6TNY.js.map → task-stream-DCrqCmFa.js.map} +1 -1
  81. package/dist/{tasks-DqDHx5pW.js → tasks-BJuz1XQ1.js} +2 -2
  82. package/dist/{tasks-DqDHx5pW.js.map → tasks-BJuz1XQ1.js.map} +1 -1
  83. package/dist/{telemetry-DXzPfSXl.js → telemetry-tdU6F90U.js} +3 -3
  84. package/dist/{telemetry-DXzPfSXl.js.map → telemetry-tdU6F90U.js.map} +1 -1
  85. package/dist/{terminal-DKsibL3T.js → terminal-ClWui_UN.js} +13 -13
  86. package/dist/{terminal-DKsibL3T.js.map → terminal-ClWui_UN.js.map} +1 -1
  87. package/dist/{tools-D5pL_r3K.js → tools-DwpaEyEv.js} +10 -8
  88. package/dist/tools-DwpaEyEv.js.map +1 -0
  89. package/dist/{wizard-abort-Br1Dps20.js → wizard-abort-B1iPXM3K.js} +4 -4
  90. package/dist/{wizard-abort-Br1Dps20.js.map → wizard-abort-B1iPXM3K.js.map} +1 -1
  91. package/dist/{wizard-abort-DG6Atd5I.js → wizard-abort-cX4Kytai.js} +1 -1
  92. package/dist/{wizard-session-tp4Zdbwl.js → wizard-session-BAZql11N.js} +1 -1
  93. package/dist/{wizard-session-tp4Zdbwl.js.map → wizard-session-BAZql11N.js.map} +1 -1
  94. package/dist/{wizard-session-DWHe83uk.js → wizard-session-C5lZPPEc.js} +1 -1
  95. package/dist/{yara-hooks-DEHfsDSF.js → yara-hooks-CEs3jx7j.js} +139 -56
  96. package/dist/yara-hooks-CEs3jx7j.js.map +1 -0
  97. package/dist/yara-hooks-gz4AceFG.js +2 -0
  98. package/package.json +2 -2
  99. package/dist/agent-interface-Doo3apDE.js.map +0 -1
  100. package/dist/agent-runner-D7OZPgIV.js.map +0 -1
  101. package/dist/analytics-AOHLZy1k.js +0 -2
  102. package/dist/analytics-D6gRGiqt.js.map +0 -1
  103. package/dist/commandments-qTW7pwaT.js +0 -2
  104. package/dist/debug-DF51kDvZ.js.map +0 -1
  105. package/dist/environment-Csj7vBHM.js.map +0 -1
  106. package/dist/file-utils-Dj3UqDJz.js +0 -116
  107. package/dist/file-utils-Dj3UqDJz.js.map +0 -1
  108. package/dist/pi-CXhGyUbi.js.map +0 -1
  109. package/dist/posthog-integration-Bt8jQC7c.js.map +0 -1
  110. package/dist/queue-tools-3iQHCpWF.js.map +0 -1
  111. package/dist/registry-DG8r_Wks.js.map +0 -1
  112. package/dist/setup-utils-CFejYe1M.js.map +0 -1
  113. package/dist/task-CsAczwW6.js.map +0 -1
  114. package/dist/tools-D5pL_r3K.js.map +0 -1
  115. package/dist/yara-hooks-BExxs6sG.js +0 -2
  116. 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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkBA,MAAa,gBAAgB,EAC1B,OAAO;CAEN,aAAa,EAAE,QAAQ;CACvB,MAAM,EAAE,QAAQ,CAAC,SAAS;CAC1B,IAAI,EAAE,QAAQ,CAAC,SAAS;CAGxB,OAAO,EAAE,QAAQ,CAAC,SAAS;CAC3B,YAAY,EAAE,QAAQ,CAAC,SAAS;CAChC,WAAW,EAAE,QAAQ,CAAC,SAAS;CAC/B,aAAa,EAAE,QAAQ,CAAC,SAAS;CACjC,mBAAmB,EAAE,SAAS,CAAC,SAAS;CACxC,gBAAgB,EAAE,SAAS,CAAC,SAAS;CACrC,UAAU,EAAE,SAAS,CAAC,SAAS;CAG/B,YAAY,EAAE,QAAQ,CAAC,SAAS;CAChC,cAAc,EAAE,QAAQ,CAAC,SAAS;CAClC,gBAAgB,EAAE,SAAS,CAAC,SAAS;CAKrC,sBAAsB,EAAE,QAAQ,CAAC,SAAS;CAI1C,MAAM,EACH,OAAO;EACN,IAAI,EAAE,QAAQ;EACd,MAAM,EAAE,QAAQ,CAAC,SAAS;EAC1B,cAAc,EAAE,QAAQ,CAAC,MAAM;EAC/B,WAAW,EAAE,QAAQ,CAAC,SAAS;EAC/B,YAAY,EAAE,QAAQ,CAAC,SAAS;EAChC,MAAM,EAAE,QAAQ,CAAC,SAAS;EAC1B,UAAU,EAAE,QAAQ,CAAC,SAAS;EAC/B,CAAC,CACD,aAAa;CAChB,cAAc,EACX,OAAO;EACN,IAAI,EAAE,QAAQ,CAAC,MAAM;EACrB,MAAM,EAAE,QAAQ,CAAC,SAAS;EAC1B,MAAM,EAAE,QAAQ,CAAC,SAAS;EAC1B,kBAAkB,EAAE,QAAQ,CAAC,SAAS;EACtC,aAAa,EAAE,QAAQ,CAAC,SAAS;EAIjC,gCAAgC,EAAE,SAAS,CAAC,SAAS;EACtD,CAAC,CACD,aAAa;CAChB,eAAe,EAAE,MACf,EACG,OAAO;EACN,IAAI,EAAE,QAAQ,CAAC,MAAM;EACrB,MAAM,EAAE,QAAQ,CAAC,SAAS;EAC1B,kBAAkB,EAAE,QAAQ,CAAC,SAAS;EACvC,CAAC,CACD,aAAa,CACjB;CACF,CAAC,CACD,aAAa;;;;;;;;;;;;AAahB,MAAa,yBAAyB,EACnC,OAAO;CACN,OAAO,EAAE,QAAQ,CAAC,SAAS;CAC3B,UAAU,EAAE,QAAQ,CAAC,SAAS;CAC9B,YAAY,EAAE,QAAQ,CAAC,SAAS;CACjC,CAAC,CACD,aAAa;AAGyB,EAAE,OAAO,EAChD,SAAS,EAAE,MAAM,uBAAuB,EACzC,CAAC;AAKF,MAAa,mBAAmB,EAAE,OAAO;CACvC,IAAI,EAAE,QAAQ;CACd,MAAM,EAAE,QAAQ,CAAC,MAAM;CACvB,cAAc,EAAE,QAAQ,CAAC,MAAM;CAC/B,WAAW,EAAE,QAAQ;CACrB,MAAM,EAAE,QAAQ;CAOhB,0BAA0B,EAAE,SAAS,CAAC,SAAS;CAC/C,+BAA+B,EAAE,SAAS,CAAC,SAAS;CACpD,gBAAgB,EAAE,SAAS,CAAC,SAAS;CACtC,CAAC;AAKF,IAAa,WAAb,cAA8B,MAAM;CAClC,YACE,SACA,YACA,UACA;AACA,QAAM,QAAQ;AAHE,OAAA,aAAA;AACA,OAAA,WAAA;AAGhB,OAAK,OAAO;;;AAIhB,eAAsB,cACpB,aACA,SACkB;AAClB,KAAI;EACF,MAAM,WAAW,MAAM,MAAM,IAAI,GAAG,QAAQ,kBAAkB,EAC5D,SAAS;GACP,eAAe,UAAU;GACzB,cAAc;GACf,EACF,CAAC;AAEF,SAAO,cAAc,MAAM,SAAS,KAAK;UAClC,OAAO;EACd,MAAM,WAAW,eAAe,OAAO,kBAAkB;AACzD,YAAU,iBAAiB,UAAU;GACnC,UAAU;GACV;GACD,CAAC;AACF,QAAM;;;AA+CV,eAAsB,iBACpB,aACA,WACA,SACqB;AACrB,KAAI;EACF,MAAM,WAAW,MAAM,MAAM,IAAI,GAAG,QAAQ,gBAAgB,UAAU,IAAI,EACxE,SAAS;GACP,eAAe,UAAU;GACzB,cAAc;GACf,EACF,CAAC;AAEF,SAAO,iBAAiB,MAAM,SAAS,KAAK;UACrC,OAAO;EACd,MAAM,WAAW,eAAe,OAAO,qBAAqB;AAC5D,YAAU,iBAAiB,UAAU;GACnC,UAAU,iBAAiB,UAAU;GACrC;GACA;GACD,CAAC;AACF,QAAM;;;;AAKV,MAAM,6BAA6B,EAAE,OAAO,EAC1C,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,SAAS,EAAE,CAAC,CAAC,aAAa,CAAC,EACzE,CAAC;;;;;;;AAQF,eAAsB,oBACpB,aACA,WACA,SACA,QACkB;CAClB,MAAM,WAAW,MAAM,MAAM,IAC3B,GAAG,QAAQ,gBAAgB,UAAU,iBACrC;EACE,SAAS;GACP,eAAe,UAAU;GACzB,cAAc;GACf;EACD;EACD,CACF;CACD,MAAM,SAAS,2BAA2B,UAAU,SAAS,KAAK;AAClE,KAAI,CAAC,OAAO,QAAS,QAAO;AAC5B,QAAO,OAAO,KAAK,QAAQ,MAAM,MAAM,EAAE,SAAS,QAAQ;;AAG5D,SAAgB,eAAe,OAAgB,WAA6B;AAC1E,KAAI,MAAM,aAAa,MAAM,EAAE;EAC7B,MAAM,aAAa;EACnB,MAAM,SAAS,WAAW,UAAU;EACpC,MAAM,SAAS,WAAW,UAAU,MAAM;EAC1C,MAAM,WAAW,WAAW,QAAQ;AAEpC,MAAI,WAAW,IACb,QAAO,IAAI,SACT,yCAAyC,aACzC,QACA,SACD;AAGH,MAAI,WAAW,IACb,QAAO,IAAI,SACT,iCAAiC,aACjC,QACA,SACD;AAGH,MAAI,WAAW,IACb,QAAO,IAAI,SACT,sCAAsC,aACtC,QACA,SACD;AAIH,SAAO,IAAI,SADK,UAAU,aAAa,aACV,QAAQ,SAAS;;AAGhD,KAAI,iBAAiB,EAAE,SACrB,QAAO,IAAI,SAAS,2CAA2C,YAAY;AAG7E,QAAO,IAAI,SACT,oCAAoC,UAAU,IAC5C,iBAAiB,QAAQ,MAAM,UAAU,kBAE5C"}
package/dist/bin.js CHANGED
@@ -1,19 +1,19 @@
1
1
  #!/usr/bin/env node
2
- import { B as Integration, Et as regionOption, K as POSTHOG_DOCS_URL, Tt as isHeadless, a as getLogFilePath, bt as VERSION, f as getUI, gt as WIZARD_USER_AGENT, m as LoggingUI, p as setUI, r as debug, s as logToFile, vt as getSkillsBaseUrl, wt as headlessOption } from "./debug-DF51kDvZ.js";
3
- import { n as analytics } from "./analytics-D6gRGiqt.js";
4
- import { r as setEntryCommand } from "./telemetry-DXzPfSXl.js";
5
- import { n as isUsingTypeScript } from "./setup-utils-CFejYe1M.js";
6
- import { o as handleApiError } from "./api-ZT2Zd5yp.js";
7
- import "./wizard-session-tp4Zdbwl.js";
8
- import { r as runCleanups } from "./wizard-abort-Br1Dps20.js";
9
- import { n as isNonInteractiveEnvironment } from "./environment-Csj7vBHM.js";
10
- import { n as runAgent, o as authenticate } from "./agent-runner-D7OZPgIV.js";
11
- import { l as recoverOrphanedSettingsBackups, p as AgentSignals, v as WIZARD_TOOL_NAMES, x as fetchSkillMenu } from "./agent-interface-Doo3apDE.js";
12
- import { _ as AUDIT_CHECKS_FILE, h as SETUP_REPORT_FILE, v as AUDIT_CHECKS_KEY, y as AUDIT_REPORT_FILE } from "./yara-hooks-DEHfsDSF.js";
13
- import { i as SPINNER_MESSAGE } from "./registry-DG8r_Wks.js";
14
- 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-Bt8jQC7c.js";
15
- import { t as IGNORED_DIRS } from "./file-utils-Dj3UqDJz.js";
16
- import { n as readApiKeyFromEnv } from "./env-api-key-C3LzH8Lr.js";
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-By5DVLJr.js").then((n) => n.n);
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-CQWSPGdM.js");
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-CQWSPGdM.js");
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-ViR2FrQC.js");
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-D_cP2oXt.js");
282
+ const { runPlayground } = await import("./playground-C3sLBq6A.js");
283
283
  return runPlayground();
284
284
  }
285
- const { runInteractive } = await import("./interactive-DmRqhAUD.js");
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
- * Recursively find all package.json files under installDir (max depth 3),
306
- * skipping common ignored directories. Returns matches with detected SDKs.
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
- function scan(dir, depth) {
311
- if (depth > maxDepth) return;
312
- let entries;
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
- entries = readdirSync(dir, { withFileTypes: true });
315
- } catch {
316
- return;
317
- }
318
- for (const entry of entries) {
319
- if (entry.name.startsWith(".") && entry.name !== ".") continue;
320
- if (IGNORED_DIRS.has(entry.name)) continue;
321
- const fullPath = join(dir, entry.name);
322
- if (entry.isFile() && entry.name === "package.json") try {
323
- const pkg = JSON.parse(readFileSync(fullPath, "utf-8"));
324
- const depNames = [...Object.keys(pkg.dependencies ?? {}), ...Object.keys(pkg.devDependencies ?? {})];
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 walk = (rel, depth) => {
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) return;
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
- return;
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
- walk(rel === "." ? e.name : `${rel}/${e.name}`, depth + 1);
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, then enable only a small set — the "general"
3050
- scout plus the one or two specialists for the products this project
3051
- uses most — and disable the rest, per the skill.
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-C3LzH8Lr.js").then((n) => n.t);
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-BINHq3Yp.js");
3795
- const { buildSession } = await import("./wizard-session-DWHe83uk.js");
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-DnyxFVhW.js").then((n) => n.r);
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-BINHq3Yp.js");
3847
- const { buildSession } = await import("./wizard-session-DWHe83uk.js");
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-DnyxFVhW.js").then((n) => n.r);
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-BINHq3Yp.js");
3879
- const { buildSession } = await import("./wizard-session-DWHe83uk.js");
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-BINHq3Yp.js");
3960
- const { buildSession, RunPhase } = await import("./wizard-session-DWHe83uk.js");
3961
- const { TaskStreamPush } = await import("./task-stream-BaiI6TNY.js");
3962
- const { PostHogDestination } = await import("./posthog-DZZbziJ1.js");
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-CFejYe1M.js").then((n) => n.r);
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-DWHe83uk.js");
4129
- const { readEnvironment } = await import("./environment-Csj7vBHM.js").then((n) => n.t);
4130
- const { readApiKeyFromEnv } = await import("./env-api-key-C3LzH8Lr.js").then((n) => n.t);
4131
- const { configureLogFileFromEnvironment, logToFile } = await import("./debug-D8AJ_YCW.js");
4132
- const { wizardAbort, WizardError } = await import("./wizard-abort-DG6Atd5I.js");
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-Bj1m0ws-.js").then((n) => n.n);
4165
- const { HeadlessUI } = await import("./headless-ui-DfSOfXEo.js");
4166
- const { TaskStreamPush, PostHogDestination } = await import("./task-stream-BaiI6TNY.js");
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-D7OZPgIV.js").then((n) => n.t);
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-CFejYe1M.js").then((n) => n.r);
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-ZT2Zd5yp.js").then((n) => n.n);
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-BINHq3Yp.js");
5266
- const { buildSession } = await import("./wizard-session-DWHe83uk.js");
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,