@posthog/wizard 2.64.0 → 2.65.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 (114) hide show
  1. package/README.md +7 -2
  2. package/dist/{add-mcp-server-to-clients-D9l1dyw9.js → add-mcp-server-to-clients-ArtlMX9-.js} +5 -5
  3. package/dist/{add-mcp-server-to-clients-D9l1dyw9.js.map → add-mcp-server-to-clients-ArtlMX9-.js.map} +1 -1
  4. package/dist/{agent-interface-BQfwaSe-.js → agent-interface-ORzGEFNM.js} +76 -11
  5. package/dist/agent-interface-ORzGEFNM.js.map +1 -0
  6. package/dist/{agent-prompt-loader-BRKe3VE6.js → agent-prompt-loader-D3w6sc34.js} +10 -5
  7. package/dist/agent-prompt-loader-D3w6sc34.js.map +1 -0
  8. package/dist/{agent-runner-B4ZdNkj4.js → agent-runner-Ca-e2TOQ.js} +25 -18
  9. package/dist/{agent-runner-B4ZdNkj4.js.map → agent-runner-Ca-e2TOQ.js.map} +1 -1
  10. package/dist/analytics-C4j6grao.js +2 -0
  11. package/dist/{analytics-Duy9Vfk-.js → analytics-zBrIVjMV.js} +2 -2
  12. package/dist/{analytics-Duy9Vfk-.js.map → analytics-zBrIVjMV.js.map} +1 -1
  13. package/dist/{api-DEb25KDf.js → api-Wgb7AhrP.js} +3 -3
  14. package/dist/{api-DEb25KDf.js.map → api-Wgb7AhrP.js.map} +1 -1
  15. package/dist/bin.js +200 -76
  16. package/dist/bin.js.map +1 -1
  17. package/dist/{bounded-fs-CvYIzQbg.js → bounded-fs-DqsVmh4r.js} +3 -3
  18. package/dist/{bounded-fs-CvYIzQbg.js.map → bounded-fs-DqsVmh4r.js.map} +1 -1
  19. package/dist/{ci-install-k2HWuLQ3.js → ci-install-D1QqmJIc.js} +4 -4
  20. package/dist/{ci-install-k2HWuLQ3.js.map → ci-install-D1QqmJIc.js.map} +1 -1
  21. package/dist/{debug-3FJsmlmC.js → debug-Cm1hvkVy.js} +14 -9
  22. package/dist/debug-Cm1hvkVy.js.map +1 -0
  23. package/dist/{debug-D7eikh3K.js → debug-CtQ13sCW.js} +1 -1
  24. package/dist/{defaults-mrAre0xM.js → defaults-BHhXrX9F.js} +1 -1
  25. package/dist/{defaults-mrAre0xM.js.map → defaults-BHhXrX9F.js.map} +1 -1
  26. package/dist/{env-api-key-uk6HInaB.js → env-api-key-CdI2XZIz.js} +2 -2
  27. package/dist/{env-api-key-uk6HInaB.js.map → env-api-key-CdI2XZIz.js.map} +1 -1
  28. package/dist/{environment-Cyq61jKV.js → environment-BhFvfkQg.js} +4 -4
  29. package/dist/{environment-Cyq61jKV.js.map → environment-BhFvfkQg.js.map} +1 -1
  30. package/dist/{file-watcher-DZDDYHrv.js → file-watcher-Dciz09Rr.js} +2 -2
  31. package/dist/{file-watcher-DZDDYHrv.js.map → file-watcher-Dciz09Rr.js.map} +1 -1
  32. package/dist/{headless-ui-MpPKNNH9.js → headless-ui-B4FnKm11.js} +2 -2
  33. package/dist/{headless-ui-MpPKNNH9.js.map → headless-ui-B4FnKm11.js.map} +1 -1
  34. package/dist/{interactive-BDCUPSmr.js → interactive-DxHFVYr2.js} +2 -2
  35. package/dist/{interactive-BDCUPSmr.js.map → interactive-DxHFVYr2.js.map} +1 -1
  36. package/dist/local-dev-BN6NKQ0B.js +135 -0
  37. package/dist/local-dev-BN6NKQ0B.js.map +1 -0
  38. package/dist/{mcp-prompt-streaming-BKY-srkT.js → mcp-prompt-streaming-ro98iUDc.js} +20 -4
  39. package/dist/mcp-prompt-streaming-ro98iUDc.js.map +1 -0
  40. package/dist/{mcp-DOH54TGI.js → mcp-t0UxAPur.js} +2 -2
  41. package/dist/{mcp-DOH54TGI.js.map → mcp-t0UxAPur.js.map} +1 -1
  42. package/dist/{non-interactive-DOG-p4ku.js → non-interactive-BA2L_jDT.js} +2 -2
  43. package/dist/{non-interactive-DOG-p4ku.js.map → non-interactive-BA2L_jDT.js.map} +1 -1
  44. package/dist/{orchestrator-tools-CfaYl_W4.js → orchestrator-tools-vZmNsHy9.js} +3 -3
  45. package/dist/{orchestrator-tools-CfaYl_W4.js.map → orchestrator-tools-vZmNsHy9.js.map} +1 -1
  46. package/dist/{package-json-CDs1ZVKu.js → package-json-D0DCWpe5.js} +1 -1
  47. package/dist/{package-json-CDs1ZVKu.js.map → package-json-D0DCWpe5.js.map} +1 -1
  48. package/dist/{package-manager-62MxCa1Y.js → package-manager-DgqJdAQk.js} +58 -3
  49. package/dist/package-manager-DgqJdAQk.js.map +1 -0
  50. package/dist/{pi-DohBskuT.js → pi-nwrCARRp.js} +11 -11
  51. package/dist/{pi-DohBskuT.js.map → pi-nwrCARRp.js.map} +1 -1
  52. package/dist/{playground-DaTeK9-L.js → playground-xkEke_h0.js} +7 -7
  53. package/dist/{playground-DaTeK9-L.js.map → playground-xkEke_h0.js.map} +1 -1
  54. package/dist/{posthog-DvM4V-to.js → posthog-9To56cSd.js} +2 -2
  55. package/dist/{posthog-DvM4V-to.js.map → posthog-9To56cSd.js.map} +1 -1
  56. package/dist/{posthog-integration-BHqFQd4U.js → posthog-integration-CoPvN6YZ.js} +34 -29
  57. package/dist/posthog-integration-CoPvN6YZ.js.map +1 -0
  58. package/dist/{provisioning-B41dKvno.js → provisioning-BYFSHSHY.js} +4 -4
  59. package/dist/{provisioning-B41dKvno.js.map → provisioning-BYFSHSHY.js.map} +1 -1
  60. package/dist/{queue-tools-DED9kPuc.js → queue-tools-BREbgGSC.js} +3 -3
  61. package/dist/{queue-tools-DED9kPuc.js.map → queue-tools-BREbgGSC.js.map} +1 -1
  62. package/dist/{registry-Dh9aqVC6.js → registry-DGJQ_8QI.js} +309 -6
  63. package/dist/registry-DGJQ_8QI.js.map +1 -0
  64. package/dist/{security-HZDvt7uh.js → security-wc-naGq5.js} +5 -5
  65. package/dist/{security-HZDvt7uh.js.map → security-wc-naGq5.js.map} +1 -1
  66. package/dist/{setup-utils-DJF-LjYE.js → setup-utils-Cz0wPLsQ.js} +40 -16
  67. package/dist/setup-utils-Cz0wPLsQ.js.map +1 -0
  68. package/dist/smoke-test-ci.sh +12 -1
  69. package/dist/{start-tui-0p-Ybwxe.js → start-tui-DDW9uVnD.js} +114 -25
  70. package/dist/start-tui-DDW9uVnD.js.map +1 -0
  71. package/dist/{steps-BSp0kHUG.js → steps-CZI0B24_.js} +7 -7
  72. package/dist/{steps-BSp0kHUG.js.map → steps-CZI0B24_.js.map} +1 -1
  73. package/dist/{store-BgOhG49V.js → store-xMkU8xAa.js} +20 -6
  74. package/dist/store-xMkU8xAa.js.map +1 -0
  75. package/dist/{subagent-DDsAb9we.js → subagent-BztacyoV.js} +2 -2
  76. package/dist/{subagent-DDsAb9we.js.map → subagent-BztacyoV.js.map} +1 -1
  77. package/dist/{task-CCZAWF2U.js → task-CJ7x3McC.js} +29 -18
  78. package/dist/task-CJ7x3McC.js.map +1 -0
  79. package/dist/{task-stream-B0Eo4KX1.js → task-stream-BK7JQ27G.js} +5 -5
  80. package/dist/{task-stream-B0Eo4KX1.js.map → task-stream-BK7JQ27G.js.map} +1 -1
  81. package/dist/{tasks-DRqU9G95.js → tasks-FGzp_zBd.js} +2 -2
  82. package/dist/{tasks-DRqU9G95.js.map → tasks-FGzp_zBd.js.map} +1 -1
  83. package/dist/{telemetry-4VTeK1h9.js → telemetry-By56gAtF.js} +3 -3
  84. package/dist/{telemetry-4VTeK1h9.js.map → telemetry-By56gAtF.js.map} +1 -1
  85. package/dist/{terminal-CDqEDXWF.js → terminal-C_rmkaku.js} +39 -31
  86. package/dist/terminal-C_rmkaku.js.map +1 -0
  87. package/dist/{tools-CjNt0TUI.js → tools-BpCJgMez.js} +7 -7
  88. package/dist/tools-BpCJgMez.js.map +1 -0
  89. package/dist/{wizard-abort-DNHeIZ8N.js → wizard-abort-BlDla_Jd.js} +1 -1
  90. package/dist/{wizard-abort-BeuIRy5a.js → wizard-abort-CzwID162.js} +4 -4
  91. package/dist/{wizard-abort-BeuIRy5a.js.map → wizard-abort-CzwID162.js.map} +1 -1
  92. package/dist/{wizard-session-BUhlJ1b8.js → wizard-session-Bn6dO1gE.js} +16 -3
  93. package/dist/wizard-session-Bn6dO1gE.js.map +1 -0
  94. package/dist/{wizard-session-DZUDtS5d.js → wizard-session-UxA_A0cA.js} +1 -1
  95. package/dist/{yara-hooks-CCGjiVA2.js → yara-hooks-BrisBebM.js} +4 -4
  96. package/dist/{yara-hooks-CCGjiVA2.js.map → yara-hooks-BrisBebM.js.map} +1 -1
  97. package/dist/yara-hooks-D2B7Fd9G.js +2 -0
  98. package/package.json +1 -1
  99. package/dist/agent-interface-BQfwaSe-.js.map +0 -1
  100. package/dist/agent-prompt-loader-BRKe3VE6.js.map +0 -1
  101. package/dist/analytics-BlE8Yjoh.js +0 -2
  102. package/dist/debug-3FJsmlmC.js.map +0 -1
  103. package/dist/mcp-prompt-streaming-BKY-srkT.js.map +0 -1
  104. package/dist/package-manager-62MxCa1Y.js.map +0 -1
  105. package/dist/posthog-integration-BHqFQd4U.js.map +0 -1
  106. package/dist/registry-Dh9aqVC6.js.map +0 -1
  107. package/dist/setup-utils-DJF-LjYE.js.map +0 -1
  108. package/dist/start-tui-0p-Ybwxe.js.map +0 -1
  109. package/dist/store-BgOhG49V.js.map +0 -1
  110. package/dist/task-CCZAWF2U.js.map +0 -1
  111. package/dist/terminal-CDqEDXWF.js.map +0 -1
  112. package/dist/tools-CjNt0TUI.js.map +0 -1
  113. package/dist/wizard-session-BUhlJ1b8.js.map +0 -1
  114. package/dist/yara-hooks-BE3OXk2V.js +0 -2
@@ -1,4 +1,4 @@
1
- import { s as logToFile } from "./debug-3FJsmlmC.js";
1
+ import { s as logToFile } from "./debug-Cm1hvkVy.js";
2
2
  //#region src/lib/task-stream/destinations/posthog.ts
3
3
  const MAX_ATTEMPTS = 3;
4
4
  const BASE_BACKOFF_MS = 500;
@@ -121,4 +121,4 @@ var PostHogDestination = class {
121
121
  //#endregion
122
122
  export { PostHogDestination };
123
123
 
124
- //# sourceMappingURL=posthog-DvM4V-to.js.map
124
+ //# sourceMappingURL=posthog-9To56cSd.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"posthog-DvM4V-to.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';\nimport { logToFile } from '@utils/debug';\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.apiHost.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) {\n logToFile(`[task-stream] wizard/sessions push ok: ${response.status}`);\n return;\n }\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-9To56cSd.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';\nimport { logToFile } from '@utils/debug';\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.apiHost.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) {\n logToFile(`[task-stream] wizard/sessions push ok: ${response.status}`);\n return;\n }\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 { L as Integration, N as HAIKU_MODEL, O as DETECTION_TIMEOUT_MS, _ as evaluateWizardReadiness, at as WIZARD_INTERACTION_EVENT_NAME, f as getUI, g as SIGNUP_WIZARD_READINESS_CONFIG, mt as getSkillsBaseUrl, s as logToFile, v as getBlockingServiceKeys, x as AGENTIC_DETECTION_TIMEOUT_MS } from "./debug-3FJsmlmC.js";
2
- import { n as analytics } from "./analytics-Duy9Vfk-.js";
3
- import { i as withUtm, n as openTrackedLink } from "./telemetry-4VTeK1h9.js";
4
- import { a as safeReadFile, i as readProjectFile, o as walkProjectFiles } from "./bounded-fs-CvYIzQbg.js";
5
- import { i as tryGetPackageJson, n as isUsingTypeScript } from "./setup-utils-DJF-LjYE.js";
6
- import { i as requestDeepLink } from "./provisioning-B41dKvno.js";
7
- import "./wizard-session-BUhlJ1b8.js";
8
- import { i as wizardAbort } from "./wizard-abort-BeuIRy5a.js";
9
- import { n as runAgent, r as shouldDisableAsk, s as authenticate } from "./agent-runner-B4ZdNkj4.js";
10
- import { S as WIZARD_TOOL_NAMES, i as runAgent$1, p as AgentSignals, r as initializeAgent } from "./agent-interface-BQfwaSe-.js";
11
- import { h as EVENT_PLAN_FILE } from "./yara-hooks-CCGjiVA2.js";
12
- import { r as detectNodePackageManagers } from "./package-manager-62MxCa1Y.js";
13
- import { i as SPINNER_MESSAGE, t as FRAMEWORK_REGISTRY } from "./registry-Dh9aqVC6.js";
1
+ import { L as Integration, N as HAIKU_MODEL, O as DETECTION_TIMEOUT_MS, _ as evaluateWizardReadiness, at as WIZARD_INTERACTION_EVENT_NAME, f as getUI, g as SIGNUP_WIZARD_READINESS_CONFIG, mt as getSkillsBaseUrl, s as logToFile, v as getBlockingServiceKeys, x as AGENTIC_DETECTION_TIMEOUT_MS } from "./debug-Cm1hvkVy.js";
2
+ import { n as analytics } from "./analytics-zBrIVjMV.js";
3
+ import { i as withUtm, n as openTrackedLink } from "./telemetry-By56gAtF.js";
4
+ import { a as safeReadFile, i as readProjectFile, o as walkProjectFiles } from "./bounded-fs-DqsVmh4r.js";
5
+ import { i as tryGetPackageJson, n as isUsingTypeScript } from "./setup-utils-Cz0wPLsQ.js";
6
+ import { i as requestDeepLink } from "./provisioning-BYFSHSHY.js";
7
+ import "./wizard-session-Bn6dO1gE.js";
8
+ import { i as wizardAbort } from "./wizard-abort-CzwID162.js";
9
+ import { n as runAgent, r as shouldDisableAsk, s as authenticate } from "./agent-runner-Ca-e2TOQ.js";
10
+ import { C as WIZARD_TOOL_NAMES, i as runAgent$1, n as buildRunTags, p as AgentSignals, r as initializeAgent } from "./agent-interface-ORzGEFNM.js";
11
+ import { h as EVENT_PLAN_FILE } from "./yara-hooks-BrisBebM.js";
12
+ import { a as detectNodePackageManagers } from "./package-manager-DgqJdAQk.js";
13
+ import { i as SPINNER_MESSAGE, t as FRAMEWORK_REGISTRY } from "./registry-DGJQ_8QI.js";
14
14
  import * as semver from "semver";
15
15
  import { existsSync, statSync } from "fs";
16
16
  import { isAbsolute, join, resolve, sep } from "path";
@@ -240,10 +240,10 @@ const PROJECT_MANIFESTS = [
240
240
  "manage.py",
241
241
  "Gemfile",
242
242
  "composer.json",
243
+ "pom.xml",
243
244
  "Cargo.toml",
244
- "go.mod",
245
245
  "mix.exs",
246
- "pom.xml",
246
+ "go.mod",
247
247
  "*.csproj",
248
248
  "Package.swift",
249
249
  "Podfile",
@@ -390,13 +390,11 @@ function sessionToWizardOptions(session) {
390
390
  installDir: session.installDir,
391
391
  ci: session.ci,
392
392
  debug: session.debug,
393
- default: false,
394
393
  benchmark: session.benchmark,
395
394
  yaraReport: session.yaraReport,
396
395
  signup: session.signup,
397
396
  apiKey: session.apiKey,
398
- projectId: session.projectId,
399
- localMcp: session.localMcp
397
+ projectId: session.projectId
400
398
  };
401
399
  }
402
400
  const NOOP_SPINNER = {
@@ -411,18 +409,28 @@ const NOOP_SPINNER = {
411
409
  */
412
410
  async function detectProjectsWithAgent(session, options) {
413
411
  if (!session.credentials) throw new Error("Detection requires authenticated credentials.");
414
- const { targets, purpose = "set up a PostHog integration", recommend = false, rerankIds, onEvent } = options;
412
+ const { targets, programId, purpose = "set up a PostHog integration", recommend = false, rerankIds, onEvent } = options;
415
413
  const { accessToken, host } = session.credentials;
416
414
  const cwd = session.installDir;
417
415
  const runOptions = sessionToWizardOptions(session);
416
+ const wizardMetadata = {
417
+ ...buildRunTags({
418
+ programId,
419
+ integration: "agentic-detect",
420
+ runId: analytics.runId,
421
+ build: analytics.build
422
+ }),
423
+ call_type: "detection"
424
+ };
418
425
  const agent = await initializeAgent({
419
426
  workingDirectory: cwd,
420
427
  posthogMcpUrl: host.mcpUrl,
421
428
  posthogApiKey: accessToken,
422
429
  host,
423
430
  detectPackageManager: detectNodePackageManagers,
424
- skillsBaseUrl: getSkillsBaseUrl(session.localMcp),
431
+ skillsBaseUrl: getSkillsBaseUrl(),
425
432
  integrationLabel: "agentic-detect",
433
+ wizardMetadata,
426
434
  allowedTools: [
427
435
  "Read",
428
436
  "Grep",
@@ -480,7 +488,7 @@ const INTEGRATION_TARGETS = Object.entries(FRAMEWORK_REGISTRY).map(([id, config]
480
488
  name: config.metadata.name
481
489
  }));
482
490
  /** Run the agentic detector for the wizard's integration frameworks — the single home of targets + purpose. */
483
- async function detectIntegrationProjects(session, options = {}) {
491
+ async function detectIntegrationProjects(session, options) {
484
492
  return detectProjectsWithAgent(session, {
485
493
  ...options,
486
494
  targets: INTEGRATION_TARGETS,
@@ -511,6 +519,7 @@ async function scopeInstallDirToProject(session) {
511
519
  let report;
512
520
  try {
513
521
  report = await Promise.race([detectIntegrationProjects(session, {
522
+ programId: "posthog-integration",
514
523
  recommend: true,
515
524
  onEvent: (line) => logToFile("[agentic detect]", line)
516
525
  }), new Promise((resolve) => setTimeout(() => resolve(TIMED_OUT), AGENTIC_DETECTION_TIMEOUT_MS))]);
@@ -2521,9 +2530,7 @@ async function detectPostHogIntegration(ctx) {
2521
2530
  const sessionOptions = {
2522
2531
  installDir,
2523
2532
  debug: session.debug,
2524
- default: false,
2525
2533
  signup: session.signup,
2526
- localMcp: session.localMcp,
2527
2534
  ci: session.ci,
2528
2535
  benchmark: session.benchmark,
2529
2536
  yaraReport: session.yaraReport
@@ -3495,7 +3502,7 @@ const FUNNEL_BLOCK = {
3495
3502
  */
3496
3503
  const getContentBlocks = (store) => [
3497
3504
  {
3498
- content: "Welcome.",
3505
+ content: store?.session.apiUser?.first_name ? `Welcome, ${store.session.apiUser.first_name}.` : "Welcome.",
3499
3506
  pause: 3e3,
3500
3507
  mode: 0,
3501
3508
  animationInterval: 160
@@ -3771,9 +3778,7 @@ const posthogIntegrationConfig = {
3771
3778
  const context = await gatherFrameworkContext(frameworkConfig, {
3772
3779
  installDir: session.installDir,
3773
3780
  debug: session.debug,
3774
- default: false,
3775
3781
  signup: session.signup,
3776
- localMcp: session.localMcp,
3777
3782
  ci: true,
3778
3783
  benchmark: session.benchmark,
3779
3784
  yaraReport: session.yaraReport
@@ -3790,7 +3795,7 @@ const posthogIntegrationConfig = {
3790
3795
  if (usesPackageJson) {
3791
3796
  const packageJson = await tryGetPackageJson({ installDir: session.installDir });
3792
3797
  if (packageJson) {
3793
- const { hasDeclaredDependency } = await import("./package-json-CDs1ZVKu.js").then((n) => n.i);
3798
+ const { hasDeclaredDependency } = await import("./package-json-D0DCWpe5.js").then((n) => n.i);
3794
3799
  if (!hasDeclaredDependency(config.detection.packageName, packageJson)) getUI().log.warn(`${config.detection.packageDisplayName} does not seem to be installed. Continuing anyway — the agent will handle it.`);
3795
3800
  frameworkVersion = config.detection.getVersion(packageJson);
3796
3801
  } else getUI().log.warn("Could not find package.json. Continuing anyway — the agent will handle it.");
@@ -3859,7 +3864,7 @@ ${warehouseReportInstruction(session)}
3859
3864
  postRun: async (sess, credentials) => {
3860
3865
  const envVars = config.environment.getEnvVars(credentials.projectApiKey, credentials.host.apiHost);
3861
3866
  if (config.environment.uploadToHosting) {
3862
- const { uploadEnvironmentVariablesStep } = await import("./steps-BSp0kHUG.js");
3867
+ const { uploadEnvironmentVariablesStep } = await import("./steps-CZI0B24_.js");
3863
3868
  const uploadedEnvVars = await uploadEnvironmentVariablesStep(envVars, {
3864
3869
  integration: config.metadata.integration,
3865
3870
  session: sess
@@ -3915,4 +3920,4 @@ const integrationRunStep = {
3915
3920
  //#endregion
3916
3921
  export { scopeInstallDirToProject as C, detectFramework as D, gatherFrameworkContext as E, detectIntegrationProjects as S, resolveProjectDir as T, HEALTH_CHECK_STEP as _, LINE_CHART_BLOCK as a, getDetectedWarehouseSources as b, TextBlock as c, isClearBlock as d, isLinesBlock as f, detectPostHogIntegration as g, Icons as h, FUNNEL_BLOCK as i, computeVisibleRange as l, Colors as m, integrationRunStep as n, PRODUCT_SUITE_BLOCK as o, isObjectBlock as p, posthogIntegrationConfig as r, StatusPeekTrigger as s, SETUP_REPORT_FILE as t, wordWrap as u, WAREHOUSE_ABORT_CASES as v, detectProjectsWithAgent as w, detectWarehouseSources as x, detectWarehousePrerequisites as y };
3917
3922
 
3918
- //# sourceMappingURL=posthog-integration-BHqFQd4U.js.map
3923
+ //# sourceMappingURL=posthog-integration-CoPvN6YZ.js.map