@posthog/wizard 2.38.2 → 2.40.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 (97) hide show
  1. package/README.md +70 -13
  2. package/dist/{add-mcp-server-to-clients-CHSzsAG8.js → add-mcp-server-to-clients-Dtvqw5DO.js} +5 -5
  3. package/dist/{add-mcp-server-to-clients-CHSzsAG8.js.map → add-mcp-server-to-clients-Dtvqw5DO.js.map} +1 -1
  4. package/dist/{agent-interface-DExARWay.js → agent-interface-BTVAlvLW.js} +46 -623
  5. package/dist/agent-interface-BTVAlvLW.js.map +1 -0
  6. package/dist/{agent-runner-CMfTmM3B.js → agent-runner-CqNL9x2D.js} +36 -19
  7. package/dist/agent-runner-CqNL9x2D.js.map +1 -0
  8. package/dist/analytics-D6RSYOPO.js +2 -0
  9. package/dist/{analytics-Ciob-x8a.js → analytics-__4kRqZr.js} +3 -2
  10. package/dist/analytics-__4kRqZr.js.map +1 -0
  11. package/dist/{api-T_WHs3qZ.js → api-D0RqJPWO.js} +3 -3
  12. package/dist/{api-T_WHs3qZ.js.map → api-D0RqJPWO.js.map} +1 -1
  13. package/dist/bin.js +387 -105
  14. package/dist/bin.js.map +1 -1
  15. package/dist/{ci-install-DJN5aT7W.js → ci-install-SXJrlScZ.js} +4 -4
  16. package/dist/{ci-install-DJN5aT7W.js.map → ci-install-SXJrlScZ.js.map} +1 -1
  17. package/dist/{debug-D1lORUFs.js → debug-D_mboDpg.js} +38 -11
  18. package/dist/debug-D_mboDpg.js.map +1 -0
  19. package/dist/{debug-Cne-cLxd.js → debug-dh-I1XvJ.js} +1 -1
  20. package/dist/{defaults-a0e6IRjP.js → defaults-BxiMLkQY.js} +1 -1
  21. package/dist/{defaults-a0e6IRjP.js.map → defaults-BxiMLkQY.js.map} +1 -1
  22. package/dist/{env-api-key-DEl3LJBv.js → env-api-key-DDVkPQmo.js} +1 -1
  23. package/dist/{env-api-key-DEl3LJBv.js.map → env-api-key-DDVkPQmo.js.map} +1 -1
  24. package/dist/{environment-BEsDCA2q.js → environment-4zKc7kWr.js} +3 -3
  25. package/dist/{environment-BEsDCA2q.js.map → environment-4zKc7kWr.js.map} +1 -1
  26. package/dist/{file-utils-Cn3dzlo-.js → file-utils-Cb6HLPhu.js} +2 -2
  27. package/dist/{file-utils-Cn3dzlo-.js.map → file-utils-Cb6HLPhu.js.map} +1 -1
  28. package/dist/{headless-ui-DGunpK-s.js → headless-ui-CjdRKkTG.js} +2 -2
  29. package/dist/{headless-ui-DGunpK-s.js.map → headless-ui-CjdRKkTG.js.map} +1 -1
  30. package/dist/{host-resolution-BnUJZKId.js → host-resolution-Czw5O33G.js} +6 -6
  31. package/dist/{host-resolution-BnUJZKId.js.map → host-resolution-Czw5O33G.js.map} +1 -1
  32. package/dist/{interactive-BB2IDSWP.js → interactive-C3Ty8H5M.js} +2 -2
  33. package/dist/{interactive-BB2IDSWP.js.map → interactive-C3Ty8H5M.js.map} +1 -1
  34. package/dist/{mcp-CgA5vyiS.js → mcp-B_utnKAq.js} +2 -2
  35. package/dist/{mcp-CgA5vyiS.js.map → mcp-B_utnKAq.js.map} +1 -1
  36. package/dist/{mcp-prompt-streaming-CGAkq9qR.js → mcp-prompt-streaming-BzFu8dP6.js} +5 -5
  37. package/dist/mcp-prompt-streaming-BzFu8dP6.js.map +1 -0
  38. package/dist/{non-interactive-Dko5F3vh.js → non-interactive-B2a00UId.js} +2 -2
  39. package/dist/{non-interactive-Dko5F3vh.js.map → non-interactive-B2a00UId.js.map} +1 -1
  40. package/dist/{package-manager-WKKQADHM.js → package-manager-CRYusNaP.js} +2 -2
  41. package/dist/{package-manager-WKKQADHM.js.map → package-manager-CRYusNaP.js.map} +1 -1
  42. package/dist/{playground-UtT6zbjE.js → playground-CVIGzLGh.js} +5 -5
  43. package/dist/{playground-UtT6zbjE.js.map → playground-CVIGzLGh.js.map} +1 -1
  44. package/dist/{posthog-BESrI6-T.js → posthog-BHbtnNQE.js} +1 -1
  45. package/dist/{posthog-BESrI6-T.js.map → posthog-BHbtnNQE.js.map} +1 -1
  46. package/dist/{posthog-integration-CWXSng0W.js → posthog-integration-D2S9mCAv.js} +16 -15
  47. package/dist/{posthog-integration-CWXSng0W.js.map → posthog-integration-D2S9mCAv.js.map} +1 -1
  48. package/dist/{provisioning-CgomM26T.js → provisioning-B1KoQFFK.js} +4 -4
  49. package/dist/{provisioning-CgomM26T.js.map → provisioning-B1KoQFFK.js.map} +1 -1
  50. package/dist/{registry-BQIX-25O.js → registry-CgrvMaYt.js} +5 -4
  51. package/dist/{registry-BQIX-25O.js.map → registry-CgrvMaYt.js.map} +1 -1
  52. package/dist/security-DX5ey9g8.js +204 -0
  53. package/dist/security-DX5ey9g8.js.map +1 -0
  54. package/dist/{setup-utils-DLGNk8T6.js → setup-utils-CUeGnxBk.js} +9 -9
  55. package/dist/{setup-utils-DLGNk8T6.js.map → setup-utils-CUeGnxBk.js.map} +1 -1
  56. package/dist/{start-tui-BjCKghQq.js → start-tui-BC3yp_wW.js} +29 -27
  57. package/dist/start-tui-BC3yp_wW.js.map +1 -0
  58. package/dist/{steps-XjV9CiqH.js → steps-5YGQK7la.js} +7 -7
  59. package/dist/{steps-XjV9CiqH.js.map → steps-5YGQK7la.js.map} +1 -1
  60. package/dist/{store-CDIxU0rr.js → store-DQ0-oE_Y.js} +4 -4
  61. package/dist/{store-CDIxU0rr.js.map → store-DQ0-oE_Y.js.map} +1 -1
  62. package/dist/{subagent-S5Yh16IJ.js → subagent-DkTSX2ew.js} +2 -2
  63. package/dist/{subagent-S5Yh16IJ.js.map → subagent-DkTSX2ew.js.map} +1 -1
  64. package/dist/{task-stream-rC4IEUHC.js → task-stream-d-R9J0g4.js} +2 -2
  65. package/dist/{task-stream-rC4IEUHC.js.map → task-stream-d-R9J0g4.js.map} +1 -1
  66. package/dist/{tasks-wbjOdifO.js → tasks-SbUmyQPS.js} +2 -2
  67. package/dist/{tasks-wbjOdifO.js.map → tasks-SbUmyQPS.js.map} +1 -1
  68. package/dist/{telemetry-BfnR7gtf.js → telemetry-_7NXwx7o.js} +3 -3
  69. package/dist/{telemetry-BfnR7gtf.js.map → telemetry-_7NXwx7o.js.map} +1 -1
  70. package/dist/{terminal-BvRwVeQp.js → terminal-NhR2Seu_.js} +13 -12
  71. package/dist/{terminal-BvRwVeQp.js.map → terminal-NhR2Seu_.js.map} +1 -1
  72. package/dist/{tools-CbtYlZV4.js → tools-WDPzlrXc.js} +4 -4
  73. package/dist/{tools-CbtYlZV4.js.map → tools-WDPzlrXc.js.map} +1 -1
  74. package/dist/types-evL_rPob.js +46 -0
  75. package/dist/types-evL_rPob.js.map +1 -0
  76. package/dist/{urls-CilgPbS-.js → urls-DYIMfv29.js} +2 -2
  77. package/dist/{urls-CilgPbS-.js.map → urls-DYIMfv29.js.map} +1 -1
  78. package/dist/warlock-smoke-test.ts +165 -0
  79. package/dist/{wizard-abort-Cp5Y7f8C.js → wizard-abort-CWaKUNMI.js} +3 -3
  80. package/dist/{wizard-abort-Cp5Y7f8C.js.map → wizard-abort-CWaKUNMI.js.map} +1 -1
  81. package/dist/{wizard-abort-DHrEGqaC.js → wizard-abort-DGM_sAA9.js} +1 -1
  82. package/dist/{wizard-tools-DQTfAzSV.js → wizard-tools-CrpRaYkE.js} +26 -50
  83. package/dist/wizard-tools-CrpRaYkE.js.map +1 -0
  84. package/dist/yara-hooks-BPQ3VE-l.js +635 -0
  85. package/dist/yara-hooks-BPQ3VE-l.js.map +1 -0
  86. package/dist/yara-hooks-yy8OLJ43.js +2 -0
  87. package/package.json +4 -3
  88. package/dist/agent-interface-DExARWay.js.map +0 -1
  89. package/dist/agent-runner-CMfTmM3B.js.map +0 -1
  90. package/dist/analytics-Ciob-x8a.js.map +0 -1
  91. package/dist/analytics-DbfiRvPS.js +0 -2
  92. package/dist/debug-D1lORUFs.js.map +0 -1
  93. package/dist/mcp-prompt-streaming-CGAkq9qR.js.map +0 -1
  94. package/dist/security-pJOYY5LO.js +0 -431
  95. package/dist/security-pJOYY5LO.js.map +0 -1
  96. package/dist/start-tui-BjCKghQq.js.map +0 -1
  97. package/dist/wizard-tools-DQTfAzSV.js.map +0 -1
@@ -117,4 +117,4 @@ var PostHogDestination = class {
117
117
  //#endregion
118
118
  export { PostHogDestination };
119
119
 
120
- //# sourceMappingURL=posthog-BESrI6-T.js.map
120
+ //# sourceMappingURL=posthog-BHbtnNQE.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"posthog-BESrI6-T.js","names":[],"sources":["../src/lib/task-stream/destinations/posthog.ts"],"sourcesContent":["/**\n * PostHog destination — pushes wizard run state to the PostHog backend\n * via `POST /api/projects/{project_id}/wizard/sessions/`.\n *\n * The endpoint is an upsert keyed by `(team, session_id)`: 201 means\n * the row was created, 200 means it was updated. Both are success.\n *\n * Failure handling is fail-silent: never throws to the caller, never\n * writes to stdout/stderr, never blocks the agent. Errors flow through\n * the optional `onError` callback for the wizard's debug log.\n *\n * Retry policy:\n * 5xx / network → exponential backoff base 500ms cap 8s, max 3 attempts\n * 429 → honour `Retry-After` (seconds), single retry\n * 401 / 403 → disable for the rest of the run, no further pushes\n * 400 → give up for this push, do not disable\n * other 4xx → give up for this push, do not disable\n */\n\nimport type {\n TaskStreamDestination,\n TaskStreamUpdate,\n StreamEvent,\n} from '@lib/task-stream/types';\nimport type { Credentials } from '@lib/wizard-session';\n\nexport interface PostHogDestinationOptions {\n /**\n * Lazy credential resolver — called on every send. Returns null\n * before authentication has completed; in that case the send is a\n * no-op (no HTTP request).\n */\n getCredentials: () => Credentials | null;\n /** Receives every error for the wizard's internal logfile. */\n onError?: (err: Error) => void;\n /** Override for tests. Defaults to global fetch. */\n fetchImpl?: typeof fetch;\n /** Override for tests. Defaults to setTimeout. */\n sleep?: (ms: number) => Promise<void>;\n}\n\nconst MAX_ATTEMPTS = 3;\nconst BASE_BACKOFF_MS = 500;\nconst MAX_BACKOFF_MS = 8000;\nconst DEFAULT_RETRY_AFTER_MS = 1000;\n// setTimeout silently clamps anything above 2^31-1 ms to fire\n// immediately, so any Retry-After-derived sleep must be capped.\nconst MAX_RETRY_AFTER_MS = 60_000;\n\nfunction defaultSleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nfunction parseRetryAfter(value: string | null): number {\n if (!value) return DEFAULT_RETRY_AFTER_MS;\n const seconds = Number(value);\n if (Number.isFinite(seconds) && seconds >= 0) {\n return Math.min(Math.ceil(seconds * 1000), MAX_RETRY_AFTER_MS);\n }\n // HTTP-date form — best-effort.\n const date = Date.parse(value);\n if (Number.isFinite(date)) {\n return Math.min(Math.max(0, date - Date.now()), MAX_RETRY_AFTER_MS);\n }\n return DEFAULT_RETRY_AFTER_MS;\n}\n\n/**\n * Strip the internal-only `timestamp` field before sending. The\n * backend schema in the RFC does not define it.\n */\nfunction toWirePayload(\n payload: TaskStreamUpdate,\n): Omit<TaskStreamUpdate, 'timestamp'> {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { timestamp: _unused, ...rest } = payload;\n return rest;\n}\n\nexport class PostHogDestination implements TaskStreamDestination {\n readonly name = 'posthog';\n\n private readonly getCredentials: () => Credentials | null;\n private readonly onError: (err: Error) => void;\n private readonly fetchImpl: typeof fetch;\n private readonly sleep: (ms: number) => Promise<void>;\n\n private disabled = false;\n\n constructor(opts: PostHogDestinationOptions) {\n this.getCredentials = opts.getCredentials;\n this.onError = opts.onError ?? (() => undefined);\n this.fetchImpl = opts.fetchImpl ?? ((...args) => fetch(...args));\n this.sleep = opts.sleep ?? defaultSleep;\n }\n\n async send(_event: StreamEvent, payload: TaskStreamUpdate): Promise<void> {\n if (this.disabled) return;\n const creds = this.getCredentials();\n if (!creds) return;\n\n await this.postWithRetry(creds, toWirePayload(payload));\n }\n\n private buildRequest(\n creds: Credentials,\n body: object,\n ): { url: string; init: Parameters<typeof fetch>[1] } {\n const url = `${creds.host.replace(/\\/$/, '')}/api/projects/${\n creds.projectId\n }/wizard/sessions/`;\n return {\n url,\n init: {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${creds.accessToken}`,\n },\n body: JSON.stringify(body),\n },\n };\n }\n\n private async postWithRetry(creds: Credentials, body: object): Promise<void> {\n const { url, init } = this.buildRequest(creds, body);\n let attempt = 0;\n let backoff = BASE_BACKOFF_MS;\n let retriedAfter429 = false;\n\n while (attempt < MAX_ATTEMPTS) {\n attempt += 1;\n let response: Response;\n try {\n response = await this.fetchImpl(url, init);\n } catch (err) {\n if (attempt >= MAX_ATTEMPTS) {\n this.onError(err instanceof Error ? err : new Error(String(err)));\n return;\n }\n await this.sleep(backoff);\n backoff = Math.min(backoff * 2, MAX_BACKOFF_MS);\n continue;\n }\n\n if (response.ok) return;\n\n const status = response.status;\n\n if (status === 401 || status === 403) {\n this.disabled = true;\n this.onError(new Error(`wizard/sessions auth failed: ${status}`));\n return;\n }\n\n if (status === 429) {\n if (retriedAfter429) {\n this.onError(new Error('wizard/sessions rate limited'));\n return;\n }\n retriedAfter429 = true;\n const wait = parseRetryAfter(response.headers.get('Retry-After'));\n await this.sleep(wait);\n // Don't count this against the 5xx attempt budget.\n attempt -= 1;\n continue;\n }\n\n if (status >= 500) {\n if (attempt >= MAX_ATTEMPTS) {\n this.onError(new Error(`wizard/sessions server error: ${status}`));\n return;\n }\n await this.sleep(backoff);\n backoff = Math.min(backoff * 2, MAX_BACKOFF_MS);\n continue;\n }\n\n if (status === 400) {\n let detail = '';\n try {\n detail = await response.text();\n } catch {\n // ignore\n }\n this.onError(new Error(`wizard/sessions bad request (400): ${detail}`));\n return;\n }\n\n this.onError(new Error(`wizard/sessions unexpected status: ${status}`));\n return;\n }\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"posthog-BHbtnNQE.js","names":[],"sources":["../src/lib/task-stream/destinations/posthog.ts"],"sourcesContent":["/**\n * PostHog destination — pushes wizard run state to the PostHog backend\n * via `POST /api/projects/{project_id}/wizard/sessions/`.\n *\n * The endpoint is an upsert keyed by `(team, session_id)`: 201 means\n * the row was created, 200 means it was updated. Both are success.\n *\n * Failure handling is fail-silent: never throws to the caller, never\n * writes to stdout/stderr, never blocks the agent. Errors flow through\n * the optional `onError` callback for the wizard's debug log.\n *\n * Retry policy:\n * 5xx / network → exponential backoff base 500ms cap 8s, max 3 attempts\n * 429 → honour `Retry-After` (seconds), single retry\n * 401 / 403 → disable for the rest of the run, no further pushes\n * 400 → give up for this push, do not disable\n * other 4xx → give up for this push, do not disable\n */\n\nimport type {\n TaskStreamDestination,\n TaskStreamUpdate,\n StreamEvent,\n} from '@lib/task-stream/types';\nimport type { Credentials } from '@lib/wizard-session';\n\nexport interface PostHogDestinationOptions {\n /**\n * Lazy credential resolver — called on every send. Returns null\n * before authentication has completed; in that case the send is a\n * no-op (no HTTP request).\n */\n getCredentials: () => Credentials | null;\n /** Receives every error for the wizard's internal logfile. */\n onError?: (err: Error) => void;\n /** Override for tests. Defaults to global fetch. */\n fetchImpl?: typeof fetch;\n /** Override for tests. Defaults to setTimeout. */\n sleep?: (ms: number) => Promise<void>;\n}\n\nconst MAX_ATTEMPTS = 3;\nconst BASE_BACKOFF_MS = 500;\nconst MAX_BACKOFF_MS = 8000;\nconst DEFAULT_RETRY_AFTER_MS = 1000;\n// setTimeout silently clamps anything above 2^31-1 ms to fire\n// immediately, so any Retry-After-derived sleep must be capped.\nconst MAX_RETRY_AFTER_MS = 60_000;\n\nfunction defaultSleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nfunction parseRetryAfter(value: string | null): number {\n if (!value) return DEFAULT_RETRY_AFTER_MS;\n const seconds = Number(value);\n if (Number.isFinite(seconds) && seconds >= 0) {\n return Math.min(Math.ceil(seconds * 1000), MAX_RETRY_AFTER_MS);\n }\n // HTTP-date form — best-effort.\n const date = Date.parse(value);\n if (Number.isFinite(date)) {\n return Math.min(Math.max(0, date - Date.now()), MAX_RETRY_AFTER_MS);\n }\n return DEFAULT_RETRY_AFTER_MS;\n}\n\n/**\n * Strip the internal-only `timestamp` field before sending. The\n * backend schema in the RFC does not define it.\n */\nfunction toWirePayload(\n payload: TaskStreamUpdate,\n): Omit<TaskStreamUpdate, 'timestamp'> {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { timestamp: _unused, ...rest } = payload;\n return rest;\n}\n\nexport class PostHogDestination implements TaskStreamDestination {\n readonly name = 'posthog';\n\n private readonly getCredentials: () => Credentials | null;\n private readonly onError: (err: Error) => void;\n private readonly fetchImpl: typeof fetch;\n private readonly sleep: (ms: number) => Promise<void>;\n\n private disabled = false;\n\n constructor(opts: PostHogDestinationOptions) {\n this.getCredentials = opts.getCredentials;\n this.onError = opts.onError ?? (() => undefined);\n this.fetchImpl = opts.fetchImpl ?? ((...args) => fetch(...args));\n this.sleep = opts.sleep ?? defaultSleep;\n }\n\n async send(_event: StreamEvent, payload: TaskStreamUpdate): Promise<void> {\n if (this.disabled) return;\n const creds = this.getCredentials();\n if (!creds) return;\n\n await this.postWithRetry(creds, toWirePayload(payload));\n }\n\n private buildRequest(\n creds: Credentials,\n body: object,\n ): { url: string; init: Parameters<typeof fetch>[1] } {\n const url = `${creds.host.replace(/\\/$/, '')}/api/projects/${\n creds.projectId\n }/wizard/sessions/`;\n return {\n url,\n init: {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${creds.accessToken}`,\n },\n body: JSON.stringify(body),\n },\n };\n }\n\n private async postWithRetry(creds: Credentials, body: object): Promise<void> {\n const { url, init } = this.buildRequest(creds, body);\n let attempt = 0;\n let backoff = BASE_BACKOFF_MS;\n let retriedAfter429 = false;\n\n while (attempt < MAX_ATTEMPTS) {\n attempt += 1;\n let response: Response;\n try {\n response = await this.fetchImpl(url, init);\n } catch (err) {\n if (attempt >= MAX_ATTEMPTS) {\n this.onError(err instanceof Error ? err : new Error(String(err)));\n return;\n }\n await this.sleep(backoff);\n backoff = Math.min(backoff * 2, MAX_BACKOFF_MS);\n continue;\n }\n\n if (response.ok) return;\n\n const status = response.status;\n\n if (status === 401 || status === 403) {\n this.disabled = true;\n this.onError(new Error(`wizard/sessions auth failed: ${status}`));\n return;\n }\n\n if (status === 429) {\n if (retriedAfter429) {\n this.onError(new Error('wizard/sessions rate limited'));\n return;\n }\n retriedAfter429 = true;\n const wait = parseRetryAfter(response.headers.get('Retry-After'));\n await this.sleep(wait);\n // Don't count this against the 5xx attempt budget.\n attempt -= 1;\n continue;\n }\n\n if (status >= 500) {\n if (attempt >= MAX_ATTEMPTS) {\n this.onError(new Error(`wizard/sessions server error: ${status}`));\n return;\n }\n await this.sleep(backoff);\n backoff = Math.min(backoff * 2, MAX_BACKOFF_MS);\n continue;\n }\n\n if (status === 400) {\n let detail = '';\n try {\n detail = await response.text();\n } catch {\n // ignore\n }\n this.onError(new Error(`wizard/sessions bad request (400): ${detail}`));\n return;\n }\n\n this.onError(new Error(`wizard/sessions unexpected status: ${status}`));\n return;\n }\n }\n}\n"],"mappings":"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"}
@@ -1,16 +1,16 @@
1
- import { $ as WIZARD_INTERACTION_EVENT_NAME, E as DETECTION_TIMEOUT_MS, P as Integration, _ as evaluateWizardReadiness, f as getUI, g as SIGNUP_WIZARD_READINESS_CONFIG, j as HAIKU_MODEL, s as logToFile, ut as getSkillsBaseUrl, v as getBlockingServiceKeys } from "./debug-D1lORUFs.js";
2
- import { n as analytics } from "./analytics-Ciob-x8a.js";
3
- import { i as withUtm, n as openTrackedLink } from "./telemetry-BfnR7gtf.js";
4
- import { i as tryGetPackageJson, n as isUsingTypeScript } from "./setup-utils-DLGNk8T6.js";
5
- import { t as HostResolution } from "./host-resolution-BnUJZKId.js";
6
- import { r as requestDeepLink } from "./provisioning-CgomM26T.js";
1
+ import { $ as WIZARD_INTERACTION_EVENT_NAME, E as DETECTION_TIMEOUT_MS, P as Integration, _ as evaluateWizardReadiness, f as getUI, g as SIGNUP_WIZARD_READINESS_CONFIG, j as HAIKU_MODEL, lt as getSkillsBaseUrl, s as logToFile, v as getBlockingServiceKeys } from "./debug-D_mboDpg.js";
2
+ import { n as analytics } from "./analytics-__4kRqZr.js";
3
+ import { i as withUtm, n as openTrackedLink } from "./telemetry-_7NXwx7o.js";
4
+ import { i as tryGetPackageJson, n as isUsingTypeScript } from "./setup-utils-CUeGnxBk.js";
5
+ import { t as HostResolution } from "./host-resolution-Czw5O33G.js";
6
+ import { r as requestDeepLink } from "./provisioning-B1KoQFFK.js";
7
7
  import "./wizard-session-BoXAZEOf.js";
8
- import { i as wizardAbort } from "./wizard-abort-Cp5Y7f8C.js";
9
- import { n as runAgent } from "./agent-runner-CMfTmM3B.js";
10
- import { i as runAgent$1, p as AgentSignals, r as initializeAgent } from "./agent-interface-DExARWay.js";
11
- import { t as WIZARD_TOOL_NAMES } from "./wizard-tools-DQTfAzSV.js";
12
- import { r as detectNodePackageManagers } from "./package-manager-WKKQADHM.js";
13
- import { i as SPINNER_MESSAGE, t as FRAMEWORK_REGISTRY } from "./registry-BQIX-25O.js";
8
+ import { i as wizardAbort } from "./wizard-abort-CWaKUNMI.js";
9
+ import { n as runAgent } from "./agent-runner-CqNL9x2D.js";
10
+ import { i as runAgent$1, p as AgentSignals, r as initializeAgent } from "./agent-interface-BTVAlvLW.js";
11
+ import { t as WIZARD_TOOL_NAMES } from "./wizard-tools-CrpRaYkE.js";
12
+ import { r as detectNodePackageManagers } from "./package-manager-CRYusNaP.js";
13
+ import { i as SPINNER_MESSAGE, t as FRAMEWORK_REGISTRY } from "./registry-CgrvMaYt.js";
14
14
  import * as semver from "semver";
15
15
  import { readFileSync } from "fs";
16
16
  import { isAbsolute, join } from "path";
@@ -1649,6 +1649,7 @@ STEP 1: Call load_skill_menu (from the wizard-tools MCP server) to see available
1649
1649
 
1650
1650
  STEP 2: Call install_skill (from the wizard-tools MCP server) with the chosen skill ID (e.g., "integration-nextjs-app-router").
1651
1651
  Do NOT run any shell commands to install skills.
1652
+ If install_skill fails, emit on its own line: ${AgentSignals.SKILL_INSTALL_FAILED} <skill id — one-line reason>. Then CONTINUE and SKIP to STEP 5 the integration without the skill, following these steps and your knowledge of ${config.metadata.name} and PostHog's official docs, and note in the setup report that the skill could not be installed.
1652
1653
 
1653
1654
  STEP 3: Load the installed skill's SKILL.md file to understand what references are available.
1654
1655
 
@@ -1659,7 +1660,7 @@ STEP 5: Set up environment variables for PostHog using the wizard-tools MCP serv
1659
1660
  - Use set_env_values to create or update the PostHog public token and host, using the appropriate environment variable naming convention for ${config.metadata.name}, which you'll find in example code. The tool will also ensure .gitignore coverage. Don't assume the presence of keys means the value is up to date. Write the correct value each time.
1660
1661
  - Reference these environment variables in the code files you create instead of hardcoding the public token and host.
1661
1662
 
1662
- Important: Use the detect_package_manager tool (from the wizard-tools MCP server) to determine which package manager the project uses, then run its install command to add the SDK. Do not manually search for lockfiles or config files. You must read a file immediately before attempting to write it, even if you have previously read it; failure to do so will cause a tool failure.
1663
+ Important: Use the detect_package_manager tool (from the wizard-tools MCP server) to determine which package manager the project uses, then run its install command to add the SDK. Do not manually search for lockfiles or config files. If a file already EXISTS, read it immediately before you edit or overwrite it — writing from a stale read causes a tool failure. Creating a brand-new file needs no prior read: never read a path that does not exist yet; just write it.
1663
1664
 
1664
1665
 
1665
1666
  `;
@@ -1667,7 +1668,7 @@ Important: Use the detect_package_manager tool (from the wizard-tools MCP server
1667
1668
  postRun: async (sess, credentials) => {
1668
1669
  const envVars = config.environment.getEnvVars(credentials.projectApiKey, credentials.host);
1669
1670
  if (config.environment.uploadToHosting) {
1670
- const { uploadEnvironmentVariablesStep } = await import("./steps-XjV9CiqH.js");
1671
+ const { uploadEnvironmentVariablesStep } = await import("./steps-5YGQK7la.js");
1671
1672
  const uploadedEnvVars = await uploadEnvironmentVariablesStep(envVars, {
1672
1673
  integration: config.metadata.integration,
1673
1674
  session: sess
@@ -1722,4 +1723,4 @@ const integrationRunStep = {
1722
1723
  //#endregion
1723
1724
  export { gatherFrameworkContext as _, LINE_CHART_BLOCK as a, parseRequirementsTxt as b, TextBlock as c, isLinesBlock as d, isObjectBlock as f, detectProjectsWithAgent as g, HEALTH_CHECK_STEP as h, FUNNEL_BLOCK as i, computeVisibleRange as l, Icons as m, integrationRunStep as n, PRODUCT_SUITE_BLOCK as o, Colors as p, posthogIntegrationConfig as r, StatusPeekTrigger as s, SETUP_REPORT_FILE as t, isClearBlock as u, parsePipfile as v, parsePyprojectToml as y };
1724
1725
 
1725
- //# sourceMappingURL=posthog-integration-CWXSng0W.js.map
1726
+ //# sourceMappingURL=posthog-integration-D2S9mCAv.js.map