@code-yeongyu/senpi-ai 2026.9.29 → 2026.9.30

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 (754) hide show
  1. package/dist/api/bedrock-converse-stream.js +4 -2
  2. package/dist/api/lazy.js +2 -1
  3. package/dist/api/openai-completions.js +13 -8
  4. package/dist/api/openai-responses-shared.js +4 -1
  5. package/dist/api/openai-responses.js +10 -7
  6. package/dist/models.js +6 -2
  7. package/dist/providers/data/.manifest.json +1 -1
  8. package/dist/providers/data/amazon-bedrock.json +1 -1
  9. package/dist/providers/data/azure-openai-responses.json +1 -1
  10. package/dist/providers/data/baseten.json +1 -1
  11. package/dist/providers/data/cerebras.json +1 -1
  12. package/dist/providers/data/chatgpt-subscription.json +1 -1
  13. package/dist/providers/data/github-copilot.json +1 -1
  14. package/dist/providers/data/openai.json +1 -1
  15. package/dist/providers/data/opencode.json +1 -1
  16. package/dist/providers/data/opengateway.json +1 -1
  17. package/dist/providers/data/openrouter.json +1 -1
  18. package/dist/providers/data/venice.json +1 -1
  19. package/dist/providers/data/vercel-ai-gateway.json +1 -1
  20. package/dist/utils/prompt-cache-ttl.js +33 -2
  21. package/dist/utils/provider-failure-description.d.ts +7 -0
  22. package/dist/utils/provider-failure-description.js +21 -0
  23. package/dist/utils/retry.js +9 -0
  24. package/dist/utils/tool-schema-compat.d.ts +2 -0
  25. package/dist/utils/tool-schema-compat.js +28 -9
  26. package/package.json +3 -2
  27. package/dist/api/anthropic-messages.d.ts.map +0 -1
  28. package/dist/api/anthropic-messages.js.map +0 -1
  29. package/dist/api/anthropic-messages.lazy.d.ts.map +0 -1
  30. package/dist/api/anthropic-messages.lazy.js.map +0 -1
  31. package/dist/api/anthropic-tool-pairs.d.ts.map +0 -1
  32. package/dist/api/anthropic-tool-pairs.js.map +0 -1
  33. package/dist/api/anthropic-tool-references.d.ts.map +0 -1
  34. package/dist/api/anthropic-tool-references.js.map +0 -1
  35. package/dist/api/azure-openai-responses.d.ts.map +0 -1
  36. package/dist/api/azure-openai-responses.js.map +0 -1
  37. package/dist/api/azure-openai-responses.lazy.d.ts.map +0 -1
  38. package/dist/api/azure-openai-responses.lazy.js.map +0 -1
  39. package/dist/api/bedrock-converse-stream.d.ts.map +0 -1
  40. package/dist/api/bedrock-converse-stream.js.map +0 -1
  41. package/dist/api/bedrock-converse-stream.lazy.d.ts.map +0 -1
  42. package/dist/api/bedrock-converse-stream.lazy.js.map +0 -1
  43. package/dist/api/cloudflare-ai-binding.d.ts.map +0 -1
  44. package/dist/api/cloudflare-ai-binding.js.map +0 -1
  45. package/dist/api/cloudflare.d.ts.map +0 -1
  46. package/dist/api/cloudflare.js.map +0 -1
  47. package/dist/api/constrained-sampling.d.ts.map +0 -1
  48. package/dist/api/constrained-sampling.js.map +0 -1
  49. package/dist/api/context-room.d.ts.map +0 -1
  50. package/dist/api/context-room.js.map +0 -1
  51. package/dist/api/cursor-agent/deterministic-id.d.ts.map +0 -1
  52. package/dist/api/cursor-agent/deterministic-id.js.map +0 -1
  53. package/dist/api/cursor-agent/exec-lifecycle.d.ts.map +0 -1
  54. package/dist/api/cursor-agent/exec-lifecycle.js.map +0 -1
  55. package/dist/api/cursor-agent/exec-modern.d.ts.map +0 -1
  56. package/dist/api/cursor-agent/exec-modern.js.map +0 -1
  57. package/dist/api/cursor-agent/gen/agent_pb.d.ts.map +0 -1
  58. package/dist/api/cursor-agent/gen/agent_pb.js.map +0 -1
  59. package/dist/api/cursor-agent/measure.d.ts.map +0 -1
  60. package/dist/api/cursor-agent/measure.js.map +0 -1
  61. package/dist/api/cursor-agent/pi-args.d.ts.map +0 -1
  62. package/dist/api/cursor-agent/pi-args.js.map +0 -1
  63. package/dist/api/cursor-agent/reasoning-params.d.ts.map +0 -1
  64. package/dist/api/cursor-agent/reasoning-params.js.map +0 -1
  65. package/dist/api/cursor-agent/stream-retry.d.ts.map +0 -1
  66. package/dist/api/cursor-agent/stream-retry.js.map +0 -1
  67. package/dist/api/cursor-agent/types.d.ts.map +0 -1
  68. package/dist/api/cursor-agent/types.js.map +0 -1
  69. package/dist/api/cursor-agent.d.ts.map +0 -1
  70. package/dist/api/cursor-agent.js.map +0 -1
  71. package/dist/api/cursor-agent.lazy.d.ts.map +0 -1
  72. package/dist/api/cursor-agent.lazy.js.map +0 -1
  73. package/dist/api/cursor-conversation-rotation.d.ts.map +0 -1
  74. package/dist/api/cursor-conversation-rotation.js.map +0 -1
  75. package/dist/api/cursor-task-args.d.ts.map +0 -1
  76. package/dist/api/cursor-task-args.js.map +0 -1
  77. package/dist/api/devin-agent/discovery.d.ts.map +0 -1
  78. package/dist/api/devin-agent/discovery.js.map +0 -1
  79. package/dist/api/devin-agent/frames.d.ts.map +0 -1
  80. package/dist/api/devin-agent/frames.js.map +0 -1
  81. package/dist/api/devin-agent/gen/cascade_pb.d.ts.map +0 -1
  82. package/dist/api/devin-agent/gen/cascade_pb.js.map +0 -1
  83. package/dist/api/devin-agent/metadata.d.ts.map +0 -1
  84. package/dist/api/devin-agent/metadata.js.map +0 -1
  85. package/dist/api/devin-agent/paths.d.ts.map +0 -1
  86. package/dist/api/devin-agent/paths.js.map +0 -1
  87. package/dist/api/devin-agent/request.d.ts.map +0 -1
  88. package/dist/api/devin-agent/request.js.map +0 -1
  89. package/dist/api/devin-agent/stream-state.d.ts.map +0 -1
  90. package/dist/api/devin-agent/stream-state.js.map +0 -1
  91. package/dist/api/devin-agent/trailer.d.ts.map +0 -1
  92. package/dist/api/devin-agent/trailer.js.map +0 -1
  93. package/dist/api/devin-agent/types.d.ts.map +0 -1
  94. package/dist/api/devin-agent/types.js.map +0 -1
  95. package/dist/api/devin-agent/unary.d.ts.map +0 -1
  96. package/dist/api/devin-agent/unary.js.map +0 -1
  97. package/dist/api/devin-agent/wire.d.ts.map +0 -1
  98. package/dist/api/devin-agent/wire.js.map +0 -1
  99. package/dist/api/devin-agent.d.ts.map +0 -1
  100. package/dist/api/devin-agent.js.map +0 -1
  101. package/dist/api/devin-agent.lazy.d.ts.map +0 -1
  102. package/dist/api/devin-agent.lazy.js.map +0 -1
  103. package/dist/api/github-copilot-endpoint.d.ts.map +0 -1
  104. package/dist/api/github-copilot-endpoint.js.map +0 -1
  105. package/dist/api/github-copilot-errors.d.ts.map +0 -1
  106. package/dist/api/github-copilot-errors.js.map +0 -1
  107. package/dist/api/github-copilot-headers.d.ts.map +0 -1
  108. package/dist/api/github-copilot-headers.js.map +0 -1
  109. package/dist/api/google-generative-ai.d.ts.map +0 -1
  110. package/dist/api/google-generative-ai.js.map +0 -1
  111. package/dist/api/google-generative-ai.lazy.d.ts.map +0 -1
  112. package/dist/api/google-generative-ai.lazy.js.map +0 -1
  113. package/dist/api/google-shared.d.ts.map +0 -1
  114. package/dist/api/google-shared.js.map +0 -1
  115. package/dist/api/google-vertex.d.ts.map +0 -1
  116. package/dist/api/google-vertex.js.map +0 -1
  117. package/dist/api/google-vertex.lazy.d.ts.map +0 -1
  118. package/dist/api/google-vertex.lazy.js.map +0 -1
  119. package/dist/api/lazy.d.ts.map +0 -1
  120. package/dist/api/lazy.js.map +0 -1
  121. package/dist/api/mistral-conversations.d.ts.map +0 -1
  122. package/dist/api/mistral-conversations.js.map +0 -1
  123. package/dist/api/mistral-conversations.lazy.d.ts.map +0 -1
  124. package/dist/api/mistral-conversations.lazy.js.map +0 -1
  125. package/dist/api/openai-client-auth.d.ts.map +0 -1
  126. package/dist/api/openai-client-auth.js.map +0 -1
  127. package/dist/api/openai-codex-responses/fallback-state.d.ts.map +0 -1
  128. package/dist/api/openai-codex-responses/fallback-state.js.map +0 -1
  129. package/dist/api/openai-codex-responses/reasoning.d.ts.map +0 -1
  130. package/dist/api/openai-codex-responses/reasoning.js.map +0 -1
  131. package/dist/api/openai-codex-responses.d.ts.map +0 -1
  132. package/dist/api/openai-codex-responses.js.map +0 -1
  133. package/dist/api/openai-codex-responses.lazy.d.ts.map +0 -1
  134. package/dist/api/openai-codex-responses.lazy.js.map +0 -1
  135. package/dist/api/openai-completions.d.ts.map +0 -1
  136. package/dist/api/openai-completions.js.map +0 -1
  137. package/dist/api/openai-completions.lazy.d.ts.map +0 -1
  138. package/dist/api/openai-completions.lazy.js.map +0 -1
  139. package/dist/api/openai-images-edit.d.ts.map +0 -1
  140. package/dist/api/openai-images-edit.js.map +0 -1
  141. package/dist/api/openai-images-params.d.ts.map +0 -1
  142. package/dist/api/openai-images-params.js.map +0 -1
  143. package/dist/api/openai-images-result.d.ts.map +0 -1
  144. package/dist/api/openai-images-result.js.map +0 -1
  145. package/dist/api/openai-images.d.ts.map +0 -1
  146. package/dist/api/openai-images.js.map +0 -1
  147. package/dist/api/openai-images.lazy.d.ts.map +0 -1
  148. package/dist/api/openai-images.lazy.js.map +0 -1
  149. package/dist/api/openai-prompt-cache.d.ts.map +0 -1
  150. package/dist/api/openai-prompt-cache.js.map +0 -1
  151. package/dist/api/openai-responses-prompt-cache.d.ts.map +0 -1
  152. package/dist/api/openai-responses-prompt-cache.js.map +0 -1
  153. package/dist/api/openai-responses-shared.d.ts.map +0 -1
  154. package/dist/api/openai-responses-shared.js.map +0 -1
  155. package/dist/api/openai-responses.d.ts.map +0 -1
  156. package/dist/api/openai-responses.js.map +0 -1
  157. package/dist/api/openai-responses.lazy.d.ts.map +0 -1
  158. package/dist/api/openai-responses.lazy.js.map +0 -1
  159. package/dist/api/openrouter-images.d.ts.map +0 -1
  160. package/dist/api/openrouter-images.js.map +0 -1
  161. package/dist/api/openrouter-images.lazy.d.ts.map +0 -1
  162. package/dist/api/openrouter-images.lazy.js.map +0 -1
  163. package/dist/api/pi-messages.d.ts.map +0 -1
  164. package/dist/api/pi-messages.js.map +0 -1
  165. package/dist/api/pi-messages.lazy.d.ts.map +0 -1
  166. package/dist/api/pi-messages.lazy.js.map +0 -1
  167. package/dist/api/prompt-cache-warmers.d.ts.map +0 -1
  168. package/dist/api/prompt-cache-warmers.js.map +0 -1
  169. package/dist/api/responses-completion-grace.d.ts.map +0 -1
  170. package/dist/api/responses-completion-grace.js.map +0 -1
  171. package/dist/api/simple-options.d.ts.map +0 -1
  172. package/dist/api/simple-options.js.map +0 -1
  173. package/dist/api/transform-messages.d.ts.map +0 -1
  174. package/dist/api/transform-messages.js.map +0 -1
  175. package/dist/api/warm-prompt-cache.d.ts.map +0 -1
  176. package/dist/api/warm-prompt-cache.js.map +0 -1
  177. package/dist/api/websocket-liveness.d.ts.map +0 -1
  178. package/dist/api/websocket-liveness.js.map +0 -1
  179. package/dist/api/websocket-transport-failure.d.ts.map +0 -1
  180. package/dist/api/websocket-transport-failure.js.map +0 -1
  181. package/dist/api-registry.d.ts.map +0 -1
  182. package/dist/api-registry.js.map +0 -1
  183. package/dist/auth/context.d.ts.map +0 -1
  184. package/dist/auth/context.js.map +0 -1
  185. package/dist/auth/credential-store.d.ts.map +0 -1
  186. package/dist/auth/credential-store.js.map +0 -1
  187. package/dist/auth/headers.d.ts.map +0 -1
  188. package/dist/auth/headers.js.map +0 -1
  189. package/dist/auth/helpers.d.ts.map +0 -1
  190. package/dist/auth/helpers.js.map +0 -1
  191. package/dist/auth/oauth/anthropic-callback-listener.d.ts.map +0 -1
  192. package/dist/auth/oauth/anthropic-callback-listener.js.map +0 -1
  193. package/dist/auth/oauth/anthropic.d.ts.map +0 -1
  194. package/dist/auth/oauth/anthropic.js.map +0 -1
  195. package/dist/auth/oauth/authorization-input.d.ts.map +0 -1
  196. package/dist/auth/oauth/authorization-input.js.map +0 -1
  197. package/dist/auth/oauth/chatgpt-subscription.d.ts.map +0 -1
  198. package/dist/auth/oauth/chatgpt-subscription.js.map +0 -1
  199. package/dist/auth/oauth/cursor.d.ts.map +0 -1
  200. package/dist/auth/oauth/cursor.js.map +0 -1
  201. package/dist/auth/oauth/device-code.d.ts.map +0 -1
  202. package/dist/auth/oauth/device-code.js.map +0 -1
  203. package/dist/auth/oauth/devin-callback.d.ts.map +0 -1
  204. package/dist/auth/oauth/devin-callback.js.map +0 -1
  205. package/dist/auth/oauth/devin-token.d.ts.map +0 -1
  206. package/dist/auth/oauth/devin-token.js.map +0 -1
  207. package/dist/auth/oauth/devin.d.ts.map +0 -1
  208. package/dist/auth/oauth/devin.js.map +0 -1
  209. package/dist/auth/oauth/error-details.d.ts.map +0 -1
  210. package/dist/auth/oauth/error-details.js.map +0 -1
  211. package/dist/auth/oauth/github-copilot-model-catalog.d.ts.map +0 -1
  212. package/dist/auth/oauth/github-copilot-model-catalog.js.map +0 -1
  213. package/dist/auth/oauth/github-copilot.d.ts.map +0 -1
  214. package/dist/auth/oauth/github-copilot.js.map +0 -1
  215. package/dist/auth/oauth/kimi-coding.d.ts.map +0 -1
  216. package/dist/auth/oauth/kimi-coding.js.map +0 -1
  217. package/dist/auth/oauth/kimi-identity.d.ts.map +0 -1
  218. package/dist/auth/oauth/kimi-identity.js.map +0 -1
  219. package/dist/auth/oauth/kimi-region.d.ts.map +0 -1
  220. package/dist/auth/oauth/kimi-region.js.map +0 -1
  221. package/dist/auth/oauth/load.d.ts.map +0 -1
  222. package/dist/auth/oauth/load.js.map +0 -1
  223. package/dist/auth/oauth/oauth-page.d.ts.map +0 -1
  224. package/dist/auth/oauth/oauth-page.js.map +0 -1
  225. package/dist/auth/oauth/openrouter.d.ts.map +0 -1
  226. package/dist/auth/oauth/openrouter.js.map +0 -1
  227. package/dist/auth/oauth/pkce.d.ts.map +0 -1
  228. package/dist/auth/oauth/pkce.js.map +0 -1
  229. package/dist/auth/oauth/radius.d.ts.map +0 -1
  230. package/dist/auth/oauth/radius.js.map +0 -1
  231. package/dist/auth/oauth/xai.d.ts.map +0 -1
  232. package/dist/auth/oauth/xai.js.map +0 -1
  233. package/dist/auth/oauth-refresh.d.ts.map +0 -1
  234. package/dist/auth/oauth-refresh.js.map +0 -1
  235. package/dist/auth/pool/classify.d.ts.map +0 -1
  236. package/dist/auth/pool/classify.js.map +0 -1
  237. package/dist/auth/pool/failover.d.ts.map +0 -1
  238. package/dist/auth/pool/failover.js.map +0 -1
  239. package/dist/auth/pool/select.d.ts.map +0 -1
  240. package/dist/auth/pool/select.js.map +0 -1
  241. package/dist/auth/pool/slots.d.ts.map +0 -1
  242. package/dist/auth/pool/slots.js.map +0 -1
  243. package/dist/auth/refresh-credential.d.ts.map +0 -1
  244. package/dist/auth/refresh-credential.js.map +0 -1
  245. package/dist/auth/resolve.d.ts.map +0 -1
  246. package/dist/auth/resolve.js.map +0 -1
  247. package/dist/auth/types.d.ts.map +0 -1
  248. package/dist/auth/types.js.map +0 -1
  249. package/dist/bedrock-provider.d.ts.map +0 -1
  250. package/dist/bedrock-provider.js.map +0 -1
  251. package/dist/bun-oauth.d.ts.map +0 -1
  252. package/dist/bun-oauth.js.map +0 -1
  253. package/dist/cli.d.ts.map +0 -1
  254. package/dist/cli.js.map +0 -1
  255. package/dist/compat/extension-oauth-types.d.ts.map +0 -1
  256. package/dist/compat/extension-oauth-types.js.map +0 -1
  257. package/dist/compat.d.ts.map +0 -1
  258. package/dist/compat.js.map +0 -1
  259. package/dist/context-provenance.d.ts.map +0 -1
  260. package/dist/context-provenance.js.map +0 -1
  261. package/dist/cursor/catalog-grouping.d.ts.map +0 -1
  262. package/dist/cursor/catalog-grouping.js.map +0 -1
  263. package/dist/cursor/composer-prompt.d.ts.map +0 -1
  264. package/dist/cursor/composer-prompt.js.map +0 -1
  265. package/dist/cursor/context-limit-store.d.ts.map +0 -1
  266. package/dist/cursor/context-limit-store.js.map +0 -1
  267. package/dist/cursor/model-capabilities.d.ts.map +0 -1
  268. package/dist/cursor/model-capabilities.js.map +0 -1
  269. package/dist/cursor/selection-descriptor.d.ts.map +0 -1
  270. package/dist/cursor/selection-descriptor.js.map +0 -1
  271. package/dist/cursor/store-migration.d.ts.map +0 -1
  272. package/dist/cursor/store-migration.js.map +0 -1
  273. package/dist/cursor-agent-provider.d.ts.map +0 -1
  274. package/dist/cursor-agent-provider.js.map +0 -1
  275. package/dist/devin-provider.d.ts.map +0 -1
  276. package/dist/devin-provider.js.map +0 -1
  277. package/dist/endpoint-reasoning-efforts.d.ts.map +0 -1
  278. package/dist/endpoint-reasoning-efforts.js.map +0 -1
  279. package/dist/env-api-keys.d.ts.map +0 -1
  280. package/dist/env-api-keys.js.map +0 -1
  281. package/dist/image-models.d.ts.map +0 -1
  282. package/dist/image-models.generated.d.ts.map +0 -1
  283. package/dist/image-models.generated.js.map +0 -1
  284. package/dist/image-models.js.map +0 -1
  285. package/dist/images-api-registry.d.ts.map +0 -1
  286. package/dist/images-api-registry.js.map +0 -1
  287. package/dist/images-models.d.ts.map +0 -1
  288. package/dist/images-models.js.map +0 -1
  289. package/dist/images.d.ts.map +0 -1
  290. package/dist/images.js.map +0 -1
  291. package/dist/index.d.ts.map +0 -1
  292. package/dist/index.js.map +0 -1
  293. package/dist/legacy-api-aliases.d.ts.map +0 -1
  294. package/dist/legacy-api-aliases.js.map +0 -1
  295. package/dist/legacy-provider-ids.d.ts.map +0 -1
  296. package/dist/legacy-provider-ids.js.map +0 -1
  297. package/dist/model-catalog.d.ts.map +0 -1
  298. package/dist/model-catalog.js.map +0 -1
  299. package/dist/model.d.ts.map +0 -1
  300. package/dist/model.js.map +0 -1
  301. package/dist/models-store.d.ts.map +0 -1
  302. package/dist/models-store.js.map +0 -1
  303. package/dist/models.d.ts.map +0 -1
  304. package/dist/models.generated.d.ts.map +0 -1
  305. package/dist/models.generated.js.map +0 -1
  306. package/dist/models.js.map +0 -1
  307. package/dist/node/provider-scope.d.ts.map +0 -1
  308. package/dist/node/provider-scope.js.map +0 -1
  309. package/dist/oauth.d.ts.map +0 -1
  310. package/dist/oauth.js.map +0 -1
  311. package/dist/openai-responses-compat.d.ts.map +0 -1
  312. package/dist/openai-responses-compat.js.map +0 -1
  313. package/dist/provider-diagnostic.d.ts.map +0 -1
  314. package/dist/provider-diagnostic.js.map +0 -1
  315. package/dist/providers/alibaba-token-plan.d.ts.map +0 -1
  316. package/dist/providers/alibaba-token-plan.js.map +0 -1
  317. package/dist/providers/alibaba-token-plan.models.d.ts.map +0 -1
  318. package/dist/providers/alibaba-token-plan.models.js.map +0 -1
  319. package/dist/providers/all.d.ts.map +0 -1
  320. package/dist/providers/all.js.map +0 -1
  321. package/dist/providers/amazon-bedrock.d.ts.map +0 -1
  322. package/dist/providers/amazon-bedrock.js.map +0 -1
  323. package/dist/providers/amazon-bedrock.models.d.ts.map +0 -1
  324. package/dist/providers/amazon-bedrock.models.js.map +0 -1
  325. package/dist/providers/ant-ling.d.ts.map +0 -1
  326. package/dist/providers/ant-ling.js.map +0 -1
  327. package/dist/providers/ant-ling.models.d.ts.map +0 -1
  328. package/dist/providers/ant-ling.models.js.map +0 -1
  329. package/dist/providers/anthropic.d.ts.map +0 -1
  330. package/dist/providers/anthropic.js.map +0 -1
  331. package/dist/providers/anthropic.models.d.ts.map +0 -1
  332. package/dist/providers/anthropic.models.js.map +0 -1
  333. package/dist/providers/azure-openai-responses.d.ts.map +0 -1
  334. package/dist/providers/azure-openai-responses.js.map +0 -1
  335. package/dist/providers/azure-openai-responses.models.d.ts.map +0 -1
  336. package/dist/providers/azure-openai-responses.models.js.map +0 -1
  337. package/dist/providers/bai-stream.d.ts.map +0 -1
  338. package/dist/providers/bai-stream.js.map +0 -1
  339. package/dist/providers/bai.d.ts.map +0 -1
  340. package/dist/providers/bai.js.map +0 -1
  341. package/dist/providers/bai.models.d.ts.map +0 -1
  342. package/dist/providers/bai.models.js.map +0 -1
  343. package/dist/providers/baseten.d.ts.map +0 -1
  344. package/dist/providers/baseten.js.map +0 -1
  345. package/dist/providers/baseten.models.d.ts.map +0 -1
  346. package/dist/providers/baseten.models.js.map +0 -1
  347. package/dist/providers/cerebras.d.ts.map +0 -1
  348. package/dist/providers/cerebras.js.map +0 -1
  349. package/dist/providers/cerebras.models.d.ts.map +0 -1
  350. package/dist/providers/cerebras.models.js.map +0 -1
  351. package/dist/providers/chatgpt-subscription.d.ts.map +0 -1
  352. package/dist/providers/chatgpt-subscription.js.map +0 -1
  353. package/dist/providers/chatgpt-subscription.models.d.ts.map +0 -1
  354. package/dist/providers/chatgpt-subscription.models.js.map +0 -1
  355. package/dist/providers/cloudflare-ai-gateway.d.ts.map +0 -1
  356. package/dist/providers/cloudflare-ai-gateway.js.map +0 -1
  357. package/dist/providers/cloudflare-ai-gateway.models.d.ts.map +0 -1
  358. package/dist/providers/cloudflare-ai-gateway.models.js.map +0 -1
  359. package/dist/providers/cloudflare-auth.d.ts.map +0 -1
  360. package/dist/providers/cloudflare-auth.js.map +0 -1
  361. package/dist/providers/cloudflare-stream.d.ts.map +0 -1
  362. package/dist/providers/cloudflare-stream.js.map +0 -1
  363. package/dist/providers/cloudflare-workers-ai.d.ts.map +0 -1
  364. package/dist/providers/cloudflare-workers-ai.js.map +0 -1
  365. package/dist/providers/cloudflare-workers-ai.models.d.ts.map +0 -1
  366. package/dist/providers/cloudflare-workers-ai.models.js.map +0 -1
  367. package/dist/providers/cursor.d.ts.map +0 -1
  368. package/dist/providers/cursor.js.map +0 -1
  369. package/dist/providers/deepseek.d.ts.map +0 -1
  370. package/dist/providers/deepseek.js.map +0 -1
  371. package/dist/providers/deepseek.models.d.ts.map +0 -1
  372. package/dist/providers/deepseek.models.js.map +0 -1
  373. package/dist/providers/devin.d.ts.map +0 -1
  374. package/dist/providers/devin.js.map +0 -1
  375. package/dist/providers/devin.models.d.ts.map +0 -1
  376. package/dist/providers/devin.models.js.map +0 -1
  377. package/dist/providers/faux.d.ts.map +0 -1
  378. package/dist/providers/faux.js.map +0 -1
  379. package/dist/providers/fireworks.d.ts.map +0 -1
  380. package/dist/providers/fireworks.js.map +0 -1
  381. package/dist/providers/fireworks.models.d.ts.map +0 -1
  382. package/dist/providers/fireworks.models.js.map +0 -1
  383. package/dist/providers/github-copilot-limits.d.ts.map +0 -1
  384. package/dist/providers/github-copilot-limits.js.map +0 -1
  385. package/dist/providers/github-copilot.d.ts.map +0 -1
  386. package/dist/providers/github-copilot.js.map +0 -1
  387. package/dist/providers/github-copilot.models.d.ts.map +0 -1
  388. package/dist/providers/github-copilot.models.js.map +0 -1
  389. package/dist/providers/google-shared.d.ts.map +0 -1
  390. package/dist/providers/google-shared.js.map +0 -1
  391. package/dist/providers/google-vertex.d.ts.map +0 -1
  392. package/dist/providers/google-vertex.js.map +0 -1
  393. package/dist/providers/google-vertex.models.d.ts.map +0 -1
  394. package/dist/providers/google-vertex.models.js.map +0 -1
  395. package/dist/providers/google.d.ts.map +0 -1
  396. package/dist/providers/google.js.map +0 -1
  397. package/dist/providers/google.models.d.ts.map +0 -1
  398. package/dist/providers/google.models.js.map +0 -1
  399. package/dist/providers/groq.d.ts.map +0 -1
  400. package/dist/providers/groq.js.map +0 -1
  401. package/dist/providers/groq.models.d.ts.map +0 -1
  402. package/dist/providers/groq.models.js.map +0 -1
  403. package/dist/providers/huggingface.d.ts.map +0 -1
  404. package/dist/providers/huggingface.js.map +0 -1
  405. package/dist/providers/huggingface.models.d.ts.map +0 -1
  406. package/dist/providers/huggingface.models.js.map +0 -1
  407. package/dist/providers/images/register-builtins.d.ts.map +0 -1
  408. package/dist/providers/images/register-builtins.js.map +0 -1
  409. package/dist/providers/kimi-coding-auth.d.ts.map +0 -1
  410. package/dist/providers/kimi-coding-auth.js.map +0 -1
  411. package/dist/providers/kimi-coding.d.ts.map +0 -1
  412. package/dist/providers/kimi-coding.js.map +0 -1
  413. package/dist/providers/kimi-coding.models.d.ts.map +0 -1
  414. package/dist/providers/kimi-coding.models.js.map +0 -1
  415. package/dist/providers/minimax-cn.d.ts.map +0 -1
  416. package/dist/providers/minimax-cn.js.map +0 -1
  417. package/dist/providers/minimax-cn.models.d.ts.map +0 -1
  418. package/dist/providers/minimax-cn.models.js.map +0 -1
  419. package/dist/providers/minimax.d.ts.map +0 -1
  420. package/dist/providers/minimax.js.map +0 -1
  421. package/dist/providers/minimax.models.d.ts.map +0 -1
  422. package/dist/providers/minimax.models.js.map +0 -1
  423. package/dist/providers/mistral.d.ts.map +0 -1
  424. package/dist/providers/mistral.js.map +0 -1
  425. package/dist/providers/mistral.models.d.ts.map +0 -1
  426. package/dist/providers/mistral.models.js.map +0 -1
  427. package/dist/providers/moonshotai-cn.d.ts.map +0 -1
  428. package/dist/providers/moonshotai-cn.js.map +0 -1
  429. package/dist/providers/moonshotai-cn.models.d.ts.map +0 -1
  430. package/dist/providers/moonshotai-cn.models.js.map +0 -1
  431. package/dist/providers/moonshotai.d.ts.map +0 -1
  432. package/dist/providers/moonshotai.js.map +0 -1
  433. package/dist/providers/moonshotai.models.d.ts.map +0 -1
  434. package/dist/providers/moonshotai.models.js.map +0 -1
  435. package/dist/providers/nvidia.d.ts.map +0 -1
  436. package/dist/providers/nvidia.js.map +0 -1
  437. package/dist/providers/nvidia.models.d.ts.map +0 -1
  438. package/dist/providers/nvidia.models.js.map +0 -1
  439. package/dist/providers/ollama.d.ts.map +0 -1
  440. package/dist/providers/ollama.js.map +0 -1
  441. package/dist/providers/openai-completions.d.ts.map +0 -1
  442. package/dist/providers/openai-completions.js.map +0 -1
  443. package/dist/providers/openai-images.d.ts.map +0 -1
  444. package/dist/providers/openai-images.js.map +0 -1
  445. package/dist/providers/openai-responses-shared.d.ts.map +0 -1
  446. package/dist/providers/openai-responses-shared.js.map +0 -1
  447. package/dist/providers/openai-responses.d.ts.map +0 -1
  448. package/dist/providers/openai-responses.js.map +0 -1
  449. package/dist/providers/openai.d.ts.map +0 -1
  450. package/dist/providers/openai.js.map +0 -1
  451. package/dist/providers/openai.models.d.ts.map +0 -1
  452. package/dist/providers/openai.models.js.map +0 -1
  453. package/dist/providers/opencode-go.d.ts.map +0 -1
  454. package/dist/providers/opencode-go.js.map +0 -1
  455. package/dist/providers/opencode-go.models.d.ts.map +0 -1
  456. package/dist/providers/opencode-go.models.js.map +0 -1
  457. package/dist/providers/opencode-headers.d.ts.map +0 -1
  458. package/dist/providers/opencode-headers.js.map +0 -1
  459. package/dist/providers/opencode.d.ts.map +0 -1
  460. package/dist/providers/opencode.js.map +0 -1
  461. package/dist/providers/opencode.models.d.ts.map +0 -1
  462. package/dist/providers/opencode.models.js.map +0 -1
  463. package/dist/providers/opengateway.d.ts.map +0 -1
  464. package/dist/providers/opengateway.js.map +0 -1
  465. package/dist/providers/opengateway.models.d.ts.map +0 -1
  466. package/dist/providers/opengateway.models.js.map +0 -1
  467. package/dist/providers/openrouter-images.d.ts.map +0 -1
  468. package/dist/providers/openrouter-images.js.map +0 -1
  469. package/dist/providers/openrouter.d.ts.map +0 -1
  470. package/dist/providers/openrouter.js.map +0 -1
  471. package/dist/providers/openrouter.models.d.ts.map +0 -1
  472. package/dist/providers/openrouter.models.js.map +0 -1
  473. package/dist/providers/qwen-token-plan-cn.d.ts.map +0 -1
  474. package/dist/providers/qwen-token-plan-cn.js.map +0 -1
  475. package/dist/providers/qwen-token-plan-cn.models.d.ts.map +0 -1
  476. package/dist/providers/qwen-token-plan-cn.models.js.map +0 -1
  477. package/dist/providers/qwen-token-plan-individual.d.ts.map +0 -1
  478. package/dist/providers/qwen-token-plan-individual.js.map +0 -1
  479. package/dist/providers/qwen-token-plan-individual.models.d.ts.map +0 -1
  480. package/dist/providers/qwen-token-plan-individual.models.js.map +0 -1
  481. package/dist/providers/qwen-token-plan.d.ts.map +0 -1
  482. package/dist/providers/qwen-token-plan.js.map +0 -1
  483. package/dist/providers/qwen-token-plan.models.d.ts.map +0 -1
  484. package/dist/providers/qwen-token-plan.models.js.map +0 -1
  485. package/dist/providers/radius-config.d.ts.map +0 -1
  486. package/dist/providers/radius-config.js.map +0 -1
  487. package/dist/providers/radius.d.ts.map +0 -1
  488. package/dist/providers/radius.js.map +0 -1
  489. package/dist/providers/register-builtins.d.ts.map +0 -1
  490. package/dist/providers/register-builtins.js.map +0 -1
  491. package/dist/providers/together.d.ts.map +0 -1
  492. package/dist/providers/together.js.map +0 -1
  493. package/dist/providers/together.models.d.ts.map +0 -1
  494. package/dist/providers/together.models.js.map +0 -1
  495. package/dist/providers/venice.d.ts.map +0 -1
  496. package/dist/providers/venice.js.map +0 -1
  497. package/dist/providers/venice.models.d.ts.map +0 -1
  498. package/dist/providers/venice.models.js.map +0 -1
  499. package/dist/providers/vercel-ai-gateway.d.ts.map +0 -1
  500. package/dist/providers/vercel-ai-gateway.js.map +0 -1
  501. package/dist/providers/vercel-ai-gateway.models.d.ts.map +0 -1
  502. package/dist/providers/vercel-ai-gateway.models.js.map +0 -1
  503. package/dist/providers/xai.d.ts.map +0 -1
  504. package/dist/providers/xai.js.map +0 -1
  505. package/dist/providers/xai.models.d.ts.map +0 -1
  506. package/dist/providers/xai.models.js.map +0 -1
  507. package/dist/providers/xiaomi-token-plan-ams.d.ts.map +0 -1
  508. package/dist/providers/xiaomi-token-plan-ams.js.map +0 -1
  509. package/dist/providers/xiaomi-token-plan-ams.models.d.ts.map +0 -1
  510. package/dist/providers/xiaomi-token-plan-ams.models.js.map +0 -1
  511. package/dist/providers/xiaomi-token-plan-cn.d.ts.map +0 -1
  512. package/dist/providers/xiaomi-token-plan-cn.js.map +0 -1
  513. package/dist/providers/xiaomi-token-plan-cn.models.d.ts.map +0 -1
  514. package/dist/providers/xiaomi-token-plan-cn.models.js.map +0 -1
  515. package/dist/providers/xiaomi-token-plan-sgp.d.ts.map +0 -1
  516. package/dist/providers/xiaomi-token-plan-sgp.js.map +0 -1
  517. package/dist/providers/xiaomi-token-plan-sgp.models.d.ts.map +0 -1
  518. package/dist/providers/xiaomi-token-plan-sgp.models.js.map +0 -1
  519. package/dist/providers/xiaomi.d.ts.map +0 -1
  520. package/dist/providers/xiaomi.js.map +0 -1
  521. package/dist/providers/xiaomi.models.d.ts.map +0 -1
  522. package/dist/providers/xiaomi.models.js.map +0 -1
  523. package/dist/providers/zai-coding-cn.d.ts.map +0 -1
  524. package/dist/providers/zai-coding-cn.js.map +0 -1
  525. package/dist/providers/zai-coding-cn.models.d.ts.map +0 -1
  526. package/dist/providers/zai-coding-cn.models.js.map +0 -1
  527. package/dist/providers/zai.d.ts.map +0 -1
  528. package/dist/providers/zai.js.map +0 -1
  529. package/dist/providers/zai.models.d.ts.map +0 -1
  530. package/dist/providers/zai.models.js.map +0 -1
  531. package/dist/session-resources.d.ts.map +0 -1
  532. package/dist/session-resources.js.map +0 -1
  533. package/dist/stream.d.ts.map +0 -1
  534. package/dist/stream.js.map +0 -1
  535. package/dist/tool-call-middleware/context-transformer.d.ts.map +0 -1
  536. package/dist/tool-call-middleware/context-transformer.js.map +0 -1
  537. package/dist/tool-call-middleware/index.d.ts.map +0 -1
  538. package/dist/tool-call-middleware/index.js.map +0 -1
  539. package/dist/tool-call-middleware/protocols/anthropic-xml/coerce-parameters.d.ts.map +0 -1
  540. package/dist/tool-call-middleware/protocols/anthropic-xml/coerce-parameters.js.map +0 -1
  541. package/dist/tool-call-middleware/protocols/anthropic-xml/format.d.ts.map +0 -1
  542. package/dist/tool-call-middleware/protocols/anthropic-xml/format.js.map +0 -1
  543. package/dist/tool-call-middleware/protocols/anthropic-xml/index.d.ts.map +0 -1
  544. package/dist/tool-call-middleware/protocols/anthropic-xml/index.js.map +0 -1
  545. package/dist/tool-call-middleware/protocols/anthropic-xml/invoke-match.d.ts.map +0 -1
  546. package/dist/tool-call-middleware/protocols/anthropic-xml/invoke-match.js.map +0 -1
  547. package/dist/tool-call-middleware/protocols/anthropic-xml/invoke-protocol.d.ts.map +0 -1
  548. package/dist/tool-call-middleware/protocols/anthropic-xml/invoke-protocol.js.map +0 -1
  549. package/dist/tool-call-middleware/protocols/anthropic-xml/invoke-stream-helpers.d.ts.map +0 -1
  550. package/dist/tool-call-middleware/protocols/anthropic-xml/invoke-stream-helpers.js.map +0 -1
  551. package/dist/tool-call-middleware/protocols/anthropic-xml/invoke-tag-scanner.d.ts.map +0 -1
  552. package/dist/tool-call-middleware/protocols/anthropic-xml/invoke-tag-scanner.js.map +0 -1
  553. package/dist/tool-call-middleware/protocols/anthropic-xml/invoke-tag-syntax.d.ts.map +0 -1
  554. package/dist/tool-call-middleware/protocols/anthropic-xml/invoke-tag-syntax.js.map +0 -1
  555. package/dist/tool-call-middleware/protocols/anthropic-xml/parse.d.ts.map +0 -1
  556. package/dist/tool-call-middleware/protocols/anthropic-xml/parse.js.map +0 -1
  557. package/dist/tool-call-middleware/protocols/anthropic-xml/recovery-stream.d.ts.map +0 -1
  558. package/dist/tool-call-middleware/protocols/anthropic-xml/recovery-stream.js.map +0 -1
  559. package/dist/tool-call-middleware/protocols/anthropic-xml/recovery-wrapper-state.d.ts.map +0 -1
  560. package/dist/tool-call-middleware/protocols/anthropic-xml/recovery-wrapper-state.js.map +0 -1
  561. package/dist/tool-call-middleware/protocols/anthropic-xml/stream-boundary.d.ts.map +0 -1
  562. package/dist/tool-call-middleware/protocols/anthropic-xml/stream-boundary.js.map +0 -1
  563. package/dist/tool-call-middleware/protocols/anthropic-xml/stream.d.ts.map +0 -1
  564. package/dist/tool-call-middleware/protocols/anthropic-xml/stream.js.map +0 -1
  565. package/dist/tool-call-middleware/protocols/anthropic-xml/tool-resolver.d.ts.map +0 -1
  566. package/dist/tool-call-middleware/protocols/anthropic-xml/tool-resolver.js.map +0 -1
  567. package/dist/tool-call-middleware/protocols/anthropic-xml/xml-entities.d.ts.map +0 -1
  568. package/dist/tool-call-middleware/protocols/anthropic-xml/xml-entities.js.map +0 -1
  569. package/dist/tool-call-middleware/protocols/antml/coerce-parameters.d.ts.map +0 -1
  570. package/dist/tool-call-middleware/protocols/antml/coerce-parameters.js.map +0 -1
  571. package/dist/tool-call-middleware/protocols/antml/config.d.ts.map +0 -1
  572. package/dist/tool-call-middleware/protocols/antml/config.js.map +0 -1
  573. package/dist/tool-call-middleware/protocols/antml/format.d.ts.map +0 -1
  574. package/dist/tool-call-middleware/protocols/antml/format.js.map +0 -1
  575. package/dist/tool-call-middleware/protocols/antml/index.d.ts.map +0 -1
  576. package/dist/tool-call-middleware/protocols/antml/index.js.map +0 -1
  577. package/dist/tool-call-middleware/protocols/antml/parse.d.ts.map +0 -1
  578. package/dist/tool-call-middleware/protocols/antml/parse.js.map +0 -1
  579. package/dist/tool-call-middleware/protocols/antml/recovery-stream.d.ts.map +0 -1
  580. package/dist/tool-call-middleware/protocols/antml/recovery-stream.js.map +0 -1
  581. package/dist/tool-call-middleware/protocols/antml/repair.d.ts.map +0 -1
  582. package/dist/tool-call-middleware/protocols/antml/repair.js.map +0 -1
  583. package/dist/tool-call-middleware/protocols/antml/stream.d.ts.map +0 -1
  584. package/dist/tool-call-middleware/protocols/antml/stream.js.map +0 -1
  585. package/dist/tool-call-middleware/protocols/gemma4.d.ts.map +0 -1
  586. package/dist/tool-call-middleware/protocols/gemma4.js.map +0 -1
  587. package/dist/tool-call-middleware/protocols/hermes.d.ts.map +0 -1
  588. package/dist/tool-call-middleware/protocols/hermes.js.map +0 -1
  589. package/dist/tool-call-middleware/protocols/json-mix.d.ts.map +0 -1
  590. package/dist/tool-call-middleware/protocols/json-mix.js.map +0 -1
  591. package/dist/tool-call-middleware/protocols/kimi-xtml/format.d.ts.map +0 -1
  592. package/dist/tool-call-middleware/protocols/kimi-xtml/format.js.map +0 -1
  593. package/dist/tool-call-middleware/protocols/kimi-xtml/index.d.ts.map +0 -1
  594. package/dist/tool-call-middleware/protocols/kimi-xtml/index.js.map +0 -1
  595. package/dist/tool-call-middleware/protocols/kimi-xtml/markers.d.ts.map +0 -1
  596. package/dist/tool-call-middleware/protocols/kimi-xtml/markers.js.map +0 -1
  597. package/dist/tool-call-middleware/protocols/kimi-xtml/parse.d.ts.map +0 -1
  598. package/dist/tool-call-middleware/protocols/kimi-xtml/parse.js.map +0 -1
  599. package/dist/tool-call-middleware/protocols/kimi-xtml/recovery-stream.d.ts.map +0 -1
  600. package/dist/tool-call-middleware/protocols/kimi-xtml/recovery-stream.js.map +0 -1
  601. package/dist/tool-call-middleware/protocols/kimi-xtml/stream.d.ts.map +0 -1
  602. package/dist/tool-call-middleware/protocols/kimi-xtml/stream.js.map +0 -1
  603. package/dist/tool-call-middleware/protocols/kimi-xtml/thinking-recovery-stream.d.ts.map +0 -1
  604. package/dist/tool-call-middleware/protocols/kimi-xtml/thinking-recovery-stream.js.map +0 -1
  605. package/dist/tool-call-middleware/protocols/kimi-xtml/thinking-recovery.d.ts.map +0 -1
  606. package/dist/tool-call-middleware/protocols/kimi-xtml/thinking-recovery.js.map +0 -1
  607. package/dist/tool-call-middleware/protocols/morph-xml.d.ts.map +0 -1
  608. package/dist/tool-call-middleware/protocols/morph-xml.js.map +0 -1
  609. package/dist/tool-call-middleware/protocols/xml-tool-tag-scanner.d.ts.map +0 -1
  610. package/dist/tool-call-middleware/protocols/xml-tool-tag-scanner.js.map +0 -1
  611. package/dist/tool-call-middleware/protocols/yaml-xml.d.ts.map +0 -1
  612. package/dist/tool-call-middleware/protocols/yaml-xml.js.map +0 -1
  613. package/dist/tool-call-middleware/recovery-code-mask.d.ts.map +0 -1
  614. package/dist/tool-call-middleware/recovery-code-mask.js.map +0 -1
  615. package/dist/tool-call-middleware/recovery-content-lifecycle.d.ts.map +0 -1
  616. package/dist/tool-call-middleware/recovery-content-lifecycle.js.map +0 -1
  617. package/dist/tool-call-middleware/recovery-diagnostics.d.ts.map +0 -1
  618. package/dist/tool-call-middleware/recovery-diagnostics.js.map +0 -1
  619. package/dist/tool-call-middleware/recovery-event-stream.d.ts.map +0 -1
  620. package/dist/tool-call-middleware/recovery-event-stream.js.map +0 -1
  621. package/dist/tool-call-middleware/recovery-message-snapshot.d.ts.map +0 -1
  622. package/dist/tool-call-middleware/recovery-message-snapshot.js.map +0 -1
  623. package/dist/tool-call-middleware/recovery-native-projection.d.ts.map +0 -1
  624. package/dist/tool-call-middleware/recovery-native-projection.js.map +0 -1
  625. package/dist/tool-call-middleware/recovery-stream-failure.d.ts.map +0 -1
  626. package/dist/tool-call-middleware/recovery-stream-failure.js.map +0 -1
  627. package/dist/tool-call-middleware/recovery-stream-terminal.d.ts.map +0 -1
  628. package/dist/tool-call-middleware/recovery-stream-terminal.js.map +0 -1
  629. package/dist/tool-call-middleware/recovery-stream-wrapper.d.ts.map +0 -1
  630. package/dist/tool-call-middleware/recovery-stream-wrapper.js.map +0 -1
  631. package/dist/tool-call-middleware/recovery-text-projection.d.ts.map +0 -1
  632. package/dist/tool-call-middleware/recovery-text-projection.js.map +0 -1
  633. package/dist/tool-call-middleware/stream-message-metadata.d.ts.map +0 -1
  634. package/dist/tool-call-middleware/stream-message-metadata.js.map +0 -1
  635. package/dist/tool-call-middleware/stream-thinking-projection.d.ts.map +0 -1
  636. package/dist/tool-call-middleware/stream-thinking-projection.js.map +0 -1
  637. package/dist/tool-call-middleware/stream-wrapper-shared.d.ts.map +0 -1
  638. package/dist/tool-call-middleware/stream-wrapper-shared.js.map +0 -1
  639. package/dist/tool-call-middleware/stream-wrapper.d.ts.map +0 -1
  640. package/dist/tool-call-middleware/stream-wrapper.js.map +0 -1
  641. package/dist/tool-call-middleware/types.d.ts.map +0 -1
  642. package/dist/tool-call-middleware/types.js.map +0 -1
  643. package/dist/types.d.ts.map +0 -1
  644. package/dist/types.js.map +0 -1
  645. package/dist/utils/abort-signals.d.ts.map +0 -1
  646. package/dist/utils/abort-signals.js.map +0 -1
  647. package/dist/utils/abort.d.ts.map +0 -1
  648. package/dist/utils/abort.js.map +0 -1
  649. package/dist/utils/assistant-message-frame.d.ts.map +0 -1
  650. package/dist/utils/assistant-message-frame.js.map +0 -1
  651. package/dist/utils/block-symbols.d.ts.map +0 -1
  652. package/dist/utils/block-symbols.js.map +0 -1
  653. package/dist/utils/chatgpt-subscription-auth.d.ts.map +0 -1
  654. package/dist/utils/chatgpt-subscription-auth.js.map +0 -1
  655. package/dist/utils/claude-code-version-cache.d.ts.map +0 -1
  656. package/dist/utils/claude-code-version-cache.js.map +0 -1
  657. package/dist/utils/claude-code-version.d.ts.map +0 -1
  658. package/dist/utils/claude-code-version.js.map +0 -1
  659. package/dist/utils/cursor-context-limit.d.ts.map +0 -1
  660. package/dist/utils/cursor-context-limit.js.map +0 -1
  661. package/dist/utils/deferred-tools.d.ts.map +0 -1
  662. package/dist/utils/deferred-tools.js.map +0 -1
  663. package/dist/utils/diagnostics.d.ts.map +0 -1
  664. package/dist/utils/diagnostics.js.map +0 -1
  665. package/dist/utils/drop-failed-assistant-turns.d.ts.map +0 -1
  666. package/dist/utils/drop-failed-assistant-turns.js.map +0 -1
  667. package/dist/utils/empty-response-errors.d.ts.map +0 -1
  668. package/dist/utils/empty-response-errors.js.map +0 -1
  669. package/dist/utils/error-body.d.ts.map +0 -1
  670. package/dist/utils/error-body.js.map +0 -1
  671. package/dist/utils/estimate.d.ts.map +0 -1
  672. package/dist/utils/estimate.js.map +0 -1
  673. package/dist/utils/event-stream.d.ts.map +0 -1
  674. package/dist/utils/event-stream.js.map +0 -1
  675. package/dist/utils/github-copilot-tool-limit.d.ts.map +0 -1
  676. package/dist/utils/github-copilot-tool-limit.js.map +0 -1
  677. package/dist/utils/hash.d.ts.map +0 -1
  678. package/dist/utils/hash.js.map +0 -1
  679. package/dist/utils/headers.d.ts.map +0 -1
  680. package/dist/utils/headers.js.map +0 -1
  681. package/dist/utils/json-parse.d.ts.map +0 -1
  682. package/dist/utils/json-parse.js.map +0 -1
  683. package/dist/utils/node-http-proxy.d.ts.map +0 -1
  684. package/dist/utils/node-http-proxy.js.map +0 -1
  685. package/dist/utils/overflow.d.ts.map +0 -1
  686. package/dist/utils/overflow.js.map +0 -1
  687. package/dist/utils/pi-user-agent.d.ts.map +0 -1
  688. package/dist/utils/pi-user-agent.js.map +0 -1
  689. package/dist/utils/process-singleton.d.ts.map +0 -1
  690. package/dist/utils/process-singleton.js.map +0 -1
  691. package/dist/utils/prompt-cache-ttl.d.ts.map +0 -1
  692. package/dist/utils/prompt-cache-ttl.js.map +0 -1
  693. package/dist/utils/provider-diagnostic-carrier.d.ts.map +0 -1
  694. package/dist/utils/provider-diagnostic-carrier.js.map +0 -1
  695. package/dist/utils/provider-diagnostic-sources.d.ts.map +0 -1
  696. package/dist/utils/provider-diagnostic-sources.js.map +0 -1
  697. package/dist/utils/provider-diagnostic-vocabulary.d.ts.map +0 -1
  698. package/dist/utils/provider-diagnostic-vocabulary.js.map +0 -1
  699. package/dist/utils/provider-env.d.ts.map +0 -1
  700. package/dist/utils/provider-env.js.map +0 -1
  701. package/dist/utils/provider-failure-description.d.ts.map +0 -1
  702. package/dist/utils/provider-failure-description.js.map +0 -1
  703. package/dist/utils/provider-retry.d.ts.map +0 -1
  704. package/dist/utils/provider-retry.js.map +0 -1
  705. package/dist/utils/retry-hint.d.ts.map +0 -1
  706. package/dist/utils/retry-hint.js.map +0 -1
  707. package/dist/utils/retry-profile/backoff.d.ts.map +0 -1
  708. package/dist/utils/retry-profile/backoff.js.map +0 -1
  709. package/dist/utils/retry-profile/classifiers.d.ts.map +0 -1
  710. package/dist/utils/retry-profile/classifiers.js.map +0 -1
  711. package/dist/utils/retry-profile/failure.d.ts.map +0 -1
  712. package/dist/utils/retry-profile/failure.js.map +0 -1
  713. package/dist/utils/retry-profile/index.d.ts.map +0 -1
  714. package/dist/utils/retry-profile/index.js.map +0 -1
  715. package/dist/utils/retry-profile/planner.d.ts.map +0 -1
  716. package/dist/utils/retry-profile/planner.js.map +0 -1
  717. package/dist/utils/retry-profile/profiles.d.ts.map +0 -1
  718. package/dist/utils/retry-profile/profiles.js.map +0 -1
  719. package/dist/utils/retry-profile/types.d.ts.map +0 -1
  720. package/dist/utils/retry-profile/types.js.map +0 -1
  721. package/dist/utils/retry.d.ts.map +0 -1
  722. package/dist/utils/retry.js.map +0 -1
  723. package/dist/utils/sanitize-unicode.d.ts.map +0 -1
  724. package/dist/utils/sanitize-unicode.js.map +0 -1
  725. package/dist/utils/server-fallback-receipt.d.ts.map +0 -1
  726. package/dist/utils/server-fallback-receipt.js.map +0 -1
  727. package/dist/utils/sleep.d.ts.map +0 -1
  728. package/dist/utils/sleep.js.map +0 -1
  729. package/dist/utils/stop-details.d.ts.map +0 -1
  730. package/dist/utils/stop-details.js.map +0 -1
  731. package/dist/utils/text.d.ts.map +0 -1
  732. package/dist/utils/text.js.map +0 -1
  733. package/dist/utils/tool-call-id.d.ts.map +0 -1
  734. package/dist/utils/tool-call-id.js.map +0 -1
  735. package/dist/utils/tool-choice-fallback.d.ts.map +0 -1
  736. package/dist/utils/tool-choice-fallback.js.map +0 -1
  737. package/dist/utils/tool-name-match.d.ts.map +0 -1
  738. package/dist/utils/tool-name-match.js.map +0 -1
  739. package/dist/utils/tool-pair-repair.d.ts.map +0 -1
  740. package/dist/utils/tool-pair-repair.js.map +0 -1
  741. package/dist/utils/tool-schema-compat.d.ts.map +0 -1
  742. package/dist/utils/tool-schema-compat.js.map +0 -1
  743. package/dist/utils/typebox-helpers.d.ts.map +0 -1
  744. package/dist/utils/typebox-helpers.js.map +0 -1
  745. package/dist/utils/unavailable-tool-text.d.ts.map +0 -1
  746. package/dist/utils/unavailable-tool-text.js.map +0 -1
  747. package/dist/utils/uuid.d.ts.map +0 -1
  748. package/dist/utils/uuid.js.map +0 -1
  749. package/dist/utils/validation.d.ts.map +0 -1
  750. package/dist/utils/validation.js.map +0 -1
  751. package/dist/utils/visible-text.d.ts.map +0 -1
  752. package/dist/utils/visible-text.js.map +0 -1
  753. package/dist/wire-identity.d.ts.map +0 -1
  754. package/dist/wire-identity.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"simple-options.js","sourceRoot":"","sources":["../../src/api/simple-options.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n\tApi,\n\tContext,\n\tModel,\n\tSimpleStreamOptions,\n\tStreamOptions,\n\tThinkingBudgets,\n\tThinkingLevel,\n} from \"../types.ts\";\nimport { clampMaxTokensToContext, MIN_ANSWER_TOKENS } from \"./context-room.ts\";\n\nexport {\n\tCONTEXT_GUARD_MIN_WINDOW,\n\tCONTEXT_SAFETY_TOKENS,\n\tContextWindowExhaustedError,\n\tclampMaxTokensToContext,\n\tMIN_ANSWER_TOKENS,\n} from \"./context-room.ts\";\n\n/**\n * Merge user-supplied extraBody fields into a provider request payload, skipping\n * any key the provider manages itself (model id, messages, stream flag, etc.).\n * Mutates `target` in place for zero-copy integration into per-provider builders.\n */\nexport function applyExtraBody(\n\ttarget: object,\n\textraBody: Record<string, unknown> | undefined,\n\treservedKeys: ReadonlySet<string>,\n): void {\n\tif (!extraBody) return;\n\tfor (const [key, value] of Object.entries(extraBody)) {\n\t\tif (reservedKeys.has(key)) continue;\n\t\tReflect.set(target, key, value);\n\t}\n}\n\nexport const OPENAI_COMPLETIONS_RESERVED_BODY_KEYS: ReadonlySet<string> = new Set([\n\t\"model\",\n\t\"messages\",\n\t\"stream\",\n\t\"stream_options\",\n\t\"tools\",\n\t\"tool_choice\",\n\t\"store\",\n\t\"temperature\",\n\t\"max_tokens\",\n\t\"max_completion_tokens\",\n\t\"reasoning_effort\",\n\t\"reasoning\",\n\t\"thinking\",\n\t\"enable_thinking\",\n\t\"chat_template_kwargs\",\n\t\"tool_stream\",\n\t\"provider\",\n\t\"providerOptions\",\n]);\n\nexport const OPENAI_RESPONSES_RESERVED_BODY_KEYS: ReadonlySet<string> = new Set([\n\t\"model\",\n\t\"input\",\n\t\"instructions\",\n\t\"stream\",\n\t\"tools\",\n\t\"tool_choice\",\n\t\"parallel_tool_calls\",\n\t\"reasoning\",\n\t\"max_output_tokens\",\n\t\"temperature\",\n\t\"text\",\n\t\"store\",\n\t\"include\",\n\t\"prompt_cache_key\",\n\t\"prompt_cache_retention\",\n\t\"service_tier\",\n]);\n\n/**\n * Reserved keys for the inner Google `config` object (which is serialized as the\n * request body's generationConfig/tools/systemInstruction by the @google/genai SDK).\n * extraBody is merged into `config`, not the top-level GenerateContentParameters.\n */\nexport const GOOGLE_RESERVED_BODY_KEYS: ReadonlySet<string> = new Set([\n\t\"systemInstruction\",\n\t\"tools\",\n\t\"toolConfig\",\n\t\"temperature\",\n\t\"maxOutputTokens\",\n\t\"thinkingConfig\",\n\t\"responseMimeType\",\n\t\"responseSchema\",\n\t\"cachedContent\",\n\t\"abortSignal\",\n\t\"httpOptions\",\n]);\n\nexport const ANTHROPIC_RESERVED_BODY_KEYS: ReadonlySet<string> = new Set([\n\t\"model\",\n\t\"messages\",\n\t\"system\",\n\t\"stream\",\n\t\"tools\",\n\t\"tool_choice\",\n\t\"temperature\",\n\t\"max_tokens\",\n\t\"thinking\",\n\t\"output_config\",\n\t\"metadata\",\n]);\n\nexport const MISTRAL_RESERVED_BODY_KEYS: ReadonlySet<string> = new Set([\n\t\"model\",\n\t\"messages\",\n\t\"stream\",\n\t\"tools\",\n\t\"toolChoice\",\n\t\"temperature\",\n\t\"maxTokens\",\n\t\"promptMode\",\n]);\n\nexport const BEDROCK_RESERVED_BODY_KEYS: ReadonlySet<string> = new Set([\n\t\"modelId\",\n\t\"messages\",\n\t\"system\",\n\t\"toolConfig\",\n\t\"additionalModelRequestFields\",\n\t\"inferenceConfig\",\n\t\"requestMetadata\",\n]);\n\nexport function buildBaseOptions(\n\tmodel: Model<Api>,\n\tcontext: Context,\n\toptions?: SimpleStreamOptions,\n\tapiKey?: string,\n): StreamOptions {\n\tconst samplingParams =\n\t\tmodel.samplingParams || options?.samplingParams\n\t\t\t? { ...model.samplingParams, ...options?.samplingParams }\n\t\t\t: undefined;\n\treturn {\n\t\ttemperature: options?.temperature,\n\t\tsamplingParams,\n\t\tmaxTokens: clampMaxTokensToContext(model, context, options?.maxTokens ?? model.maxTokens),\n\t\tsignal: options?.signal,\n\t\tabortServerSideFallback: options?.abortServerSideFallback,\n\t\ttelemetryContext: options?.telemetryContext,\n\t\tapiKey: apiKey || options?.apiKey,\n\t\tfetch: options?.fetch,\n\t\ttransport: options?.transport,\n\t\tcacheRetention: options?.cacheRetention ?? model.cacheRetention,\n\t\tsessionId: options?.sessionId,\n\t\theaders: options?.headers,\n\t\textraBody: options?.extraBody,\n\t\tonPayload: options?.onPayload,\n\t\tonResponse: options?.onResponse,\n\t\ttimeoutMs: options?.timeoutMs,\n\t\twebsocketConnectTimeoutMs: options?.websocketConnectTimeoutMs,\n\t\tmaxRetries: options?.maxRetries,\n\t\tmaxRetryDelayMs: options?.maxRetryDelayMs,\n\t\tmetadata: options?.metadata,\n\t\tenv: options?.env,\n\t};\n}\n\nexport const DEFAULT_THINKING_BUDGETS: ThinkingBudgets = {\n\tminimal: 1024,\n\tlow: 2048,\n\tmedium: 8192,\n\thigh: 16384,\n};\n\nexport function clampReasoning(effort: ThinkingLevel | undefined): Exclude<ThinkingLevel, \"xhigh\" | \"max\"> | undefined {\n\tif (effort === \"xhigh\" || effort === \"max\") return \"high\";\n\treturn effort;\n}\n\n/**\n * Clamp \"max\" to an OpenAI-compatible effort. OpenAI-style reasoning APIs accept\n * low|medium|high|xhigh but not \"max\". Callers that know the model supports xhigh\n * should pass through xhigh; \"max\" downgrades to \"xhigh\" on xhigh-capable models\n * and to \"high\" otherwise.\n */\nexport function clampMaxForOpenAI(\n\teffort: ThinkingLevel | undefined,\n\txhighSupported: boolean,\n): Exclude<ThinkingLevel, \"max\"> | undefined {\n\tif (effort === \"max\") return xhighSupported ? \"xhigh\" : \"high\";\n\treturn effort;\n}\n\nexport function thinkingBudgetForLevel(reasoningLevel: ThinkingLevel, customBudgets?: ThinkingBudgets): number {\n\tconst budgets = { ...DEFAULT_THINKING_BUDGETS, ...customBudgets };\n\tconst level = clampReasoning(reasoningLevel)!;\n\treturn budgets[level]!;\n}\n\n/** Cap a thinking budget so at least MIN_ANSWER_TOKENS remain under a shared response ceiling. */\nexport function clampThinkingBudgetToAnswerRoom(thinkingBudget: number, ceiling: number): number {\n\treturn Math.min(thinkingBudget, Math.max(0, ceiling - MIN_ANSWER_TOKENS));\n}\n\nexport function adjustMaxTokensForThinking(\n\t// Undefined means no explicit caller cap. Use the model cap and fit thinking inside it.\n\tbaseMaxTokens: number | undefined,\n\tmodelMaxTokens: number,\n\treasoningLevel: ThinkingLevel,\n\tcustomBudgets?: ThinkingBudgets,\n): { maxTokens: number; thinkingBudget: number } {\n\t// Fork: an absent/unresolvable level means \"no thinking\", not a NaN budget.\n\tconst level = clampReasoning(reasoningLevel);\n\tif (!level) {\n\t\treturn { maxTokens: baseMaxTokens ?? modelMaxTokens, thinkingBudget: 0 };\n\t}\n\tlet thinkingBudget = thinkingBudgetForLevel(level, customBudgets);\n\tconst maxTokens =\n\t\tbaseMaxTokens === undefined ? modelMaxTokens : Math.min(baseMaxTokens + thinkingBudget, modelMaxTokens);\n\n\tif (maxTokens <= thinkingBudget) {\n\t\tthinkingBudget = clampThinkingBudgetToAnswerRoom(thinkingBudget, maxTokens);\n\t}\n\n\treturn { maxTokens, thinkingBudget };\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"transform-messages.d.ts","sourceRoot":"","sources":["../../src/api/transform-messages.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACX,GAAG,EACH,gBAAgB,EAEhB,OAAO,EACP,KAAK,EAIL,MAAM,aAAa,CAAC;AA+FrB,MAAM,WAAW,wBAAwB;IACxC;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC;;;;OAIG;IACH,wBAAwB,CAAC,EAAE,OAAO,CAAC;IACnC;;;OAGG;IACH,6BAA6B,CAAC,EAAE,OAAO,CAAC;CACxC;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,SAAS,GAAG,EACjD,QAAQ,EAAE,OAAO,EAAE,EACnB,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,EAClB,mBAAmB,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,gBAAgB,KAAK,MAAM,EAC1F,OAAO,GAAE,wBAA6B,GACpC,OAAO,EAAE,CAmMX"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"transform-messages.js","sourceRoot":"","sources":["../../src/api/transform-messages.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n\tApi,\n\tAssistantMessage,\n\tImageContent,\n\tMessage,\n\tModel,\n\tTextContent,\n\tToolCall,\n\tToolResultMessage,\n} from \"../types.ts\";\nimport { isVideoMimeType } from \"../types.ts\";\n\nconst NON_VISION_USER_IMAGE_PLACEHOLDER = \"(image omitted: model does not support images)\";\nconst NON_VISION_TOOL_IMAGE_PLACEHOLDER = \"(tool image omitted: model does not support images)\";\nconst NO_VIDEO_USER_PLACEHOLDER = \"(video omitted: model does not support video input)\";\nconst NO_VIDEO_TOOL_PLACEHOLDER = \"(tool video omitted: model does not support video input)\";\n\nfunction replaceMediaWithPlaceholder(\n\tcontent: (TextContent | ImageContent)[],\n\tplaceholder: string,\n\tmatches: (block: ImageContent) => boolean,\n): (TextContent | ImageContent)[] {\n\tif (!content.some((block) => block.type === \"image\" && matches(block))) {\n\t\treturn content;\n\t}\n\tconst result: (TextContent | ImageContent)[] = [];\n\tlet previousWasPlaceholder = false;\n\n\tfor (const block of content) {\n\t\tif (block.type === \"image\" && matches(block)) {\n\t\t\tif (!previousWasPlaceholder) {\n\t\t\t\tresult.push({ type: \"text\", text: placeholder });\n\t\t\t}\n\t\t\tpreviousWasPlaceholder = true;\n\t\t\tcontinue;\n\t\t}\n\n\t\tresult.push(block);\n\t\tpreviousWasPlaceholder = block.type === \"text\" && block.text === placeholder;\n\t}\n\n\treturn result;\n}\n\nfunction replaceImagesWithPlaceholder(content: (TextContent | ImageContent)[], placeholder: string): TextContent[] {\n\tconst result: TextContent[] = [];\n\tlet previousWasPlaceholder = false;\n\n\tfor (const block of content) {\n\t\tif (block.type === \"image\") {\n\t\t\tif (!previousWasPlaceholder) {\n\t\t\t\tresult.push({ type: \"text\", text: placeholder });\n\t\t\t}\n\t\t\tpreviousWasPlaceholder = true;\n\t\t\tcontinue;\n\t\t}\n\n\t\tresult.push(block);\n\t\tpreviousWasPlaceholder = block.text === placeholder;\n\t}\n\n\treturn result;\n}\n\nfunction downgradeUnsupportedImages<TApi extends Api>(messages: Message[], model: Model<TApi>): Message[] {\n\tconst supportsImages = model.input.includes(\"image\");\n\tconst supportsVideo = model.input.includes(\"video\");\n\tif (supportsImages && supportsVideo) {\n\t\treturn messages;\n\t}\n\n\treturn messages.map((msg) => {\n\t\tif (msg.role === \"user\" && Array.isArray(msg.content)) {\n\t\t\tlet content = msg.content;\n\t\t\t// Video payloads ride ImageContent blocks; strip them first for models\n\t\t\t// without the \"video\" modality so they never hit an incompatible wire.\n\t\t\tif (!supportsVideo) {\n\t\t\t\tcontent = replaceMediaWithPlaceholder(content, NO_VIDEO_USER_PLACEHOLDER, (b) =>\n\t\t\t\t\tisVideoMimeType(b.mimeType),\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (!supportsImages) {\n\t\t\t\tcontent = replaceImagesWithPlaceholder(content, NON_VISION_USER_IMAGE_PLACEHOLDER);\n\t\t\t}\n\t\t\treturn { ...msg, content };\n\t\t}\n\n\t\tif (msg.role === \"toolResult\") {\n\t\t\tlet content = msg.content;\n\t\t\tif (!supportsVideo) {\n\t\t\t\tcontent = replaceMediaWithPlaceholder(content, NO_VIDEO_TOOL_PLACEHOLDER, (b) =>\n\t\t\t\t\tisVideoMimeType(b.mimeType),\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (!supportsImages) {\n\t\t\t\tcontent = replaceImagesWithPlaceholder(content, NON_VISION_TOOL_IMAGE_PLACEHOLDER);\n\t\t\t}\n\t\t\treturn { ...msg, content };\n\t\t}\n\n\t\treturn msg;\n\t});\n}\n\nexport interface TransformMessagesOptions {\n\t/**\n\t * Preserve provider-native thinking/reasoning replay state for the current\n\t * model. When false, standalone same-model thinking is omitted, while\n\t * thinking attached to tool calls is preserved for provider validation.\n\t */\n\tpreserveThinking?: boolean;\n\tpreserveTextSignatures?: boolean;\n\t/**\n\t * Preserve same-model thinking blocks that do not carry a usable signature\n\t * so provider adapters can downgrade them to plain text or provider-specific\n\t * compatibility payloads.\n\t */\n\tpreserveUnsignedThinking?: boolean;\n\t/**\n\t * Normalize tool-call IDs even when stored provider/API/model metadata match\n\t * the target. Enable only for target protocols whose wire contract requires it.\n\t */\n\tnormalizeSameModelToolCallIds?: boolean;\n}\n\n/**\n * Normalize tool call ID for cross-provider compatibility.\n * OpenAI Responses API generates IDs that are 450+ chars with special characters like `|`.\n * Anthropic APIs require IDs matching ^[a-zA-Z0-9_-]+$ (max 64 chars).\n */\nexport function transformMessages<TApi extends Api>(\n\tmessages: Message[],\n\tmodel: Model<TApi>,\n\tnormalizeToolCallId?: (id: string, model: Model<TApi>, source: AssistantMessage) => string,\n\toptions: TransformMessagesOptions = {},\n): Message[] {\n\t// Build a map of original tool call IDs to normalized IDs\n\tconst toolCallIdMap = new Map<string, string>();\n\t// Normalize null/undefined content from untyped callers (custom tools, hand-built\n\t// histories, old session files) so downstream code can rely on the type contract.\n\tconst normalizedMessages = messages.map((msg) => (msg.content == null ? { ...msg, content: [] } : msg));\n\tconst imageAwareMessages = downgradeUnsupportedImages(normalizedMessages, model);\n\tconst preserveThinking = options.preserveThinking ?? true;\n\tconst preserveTextSignatures = options.preserveTextSignatures ?? false;\n\tconst preserveUnsignedThinking = options.preserveUnsignedThinking ?? false;\n\tconst normalizeSameModelToolCallIds = options.normalizeSameModelToolCallIds ?? false;\n\n\t// First pass: transform messages (unsupported image downgrade, thinking blocks, tool call ID normalization)\n\tconst transformed = imageAwareMessages.map((msg) => {\n\t\t// User messages pass through unchanged\n\t\tif (msg.role === \"user\") {\n\t\t\treturn msg;\n\t\t}\n\n\t\t// Handle toolResult messages - normalize toolCallId if we have a mapping\n\t\tif (msg.role === \"toolResult\") {\n\t\t\tconst normalizedId = toolCallIdMap.get(msg.toolCallId);\n\t\t\tif (normalizedId && normalizedId !== msg.toolCallId) {\n\t\t\t\treturn { ...msg, toolCallId: normalizedId };\n\t\t\t}\n\t\t\treturn msg;\n\t\t}\n\n\t\t// Assistant messages need transformation check\n\t\tif (msg.role === \"assistant\") {\n\t\t\tconst assistantMsg = msg as AssistantMessage;\n\t\t\tconst isSameModel =\n\t\t\t\tassistantMsg.provider === model.provider &&\n\t\t\t\tassistantMsg.api === model.api &&\n\t\t\t\tassistantMsg.model === model.id;\n\t\t\tconst hasToolCalls = assistantMsg.content.some((block) => block.type === \"toolCall\");\n\t\t\tconst preserveProviderState = preserveThinking || hasToolCalls;\n\n\t\t\tconst transformedContent = assistantMsg.content.flatMap((block) => {\n\t\t\t\tif (block.type === \"thinking\") {\n\t\t\t\t\t// Redacted thinking is opaque encrypted content, only valid for the same model.\n\t\t\t\t\t// Drop it for cross-model to avoid API errors.\n\t\t\t\t\tif (block.redacted) {\n\t\t\t\t\t\treturn isSameModel ? { ...block } : [];\n\t\t\t\t\t}\n\t\t\t\t\tconst hasUsableSignature =\n\t\t\t\t\t\ttypeof block.thinkingSignature === \"string\" && block.thinkingSignature.trim().length > 0;\n\t\t\t\t\t// For same model: keep signed thinking only while replaying provider state.\n\t\t\t\t\t// Empty signed blocks are opaque compatibility state, not visible reasoning.\n\t\t\t\t\tif (isSameModel && hasUsableSignature && (preserveProviderState || block.thinking.trim() === \"\")) {\n\t\t\t\t\t\treturn { ...block };\n\t\t\t\t\t}\n\t\t\t\t\t// Skip empty thinking blocks, convert others to plain text\n\t\t\t\t\tif (!block.thinking || block.thinking.trim() === \"\") return [];\n\t\t\t\t\tif (isSameModel) {\n\t\t\t\t\t\treturn preserveProviderState || (preserveUnsignedThinking && !hasUsableSignature) ? { ...block } : [];\n\t\t\t\t\t}\n\t\t\t\t\treturn {\n\t\t\t\t\t\ttype: \"text\" as const,\n\t\t\t\t\t\ttext: block.thinking,\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tif (block.type === \"text\") {\n\t\t\t\t\tif (isSameModel && (preserveProviderState || preserveTextSignatures)) return { ...block };\n\t\t\t\t\treturn {\n\t\t\t\t\t\ttype: \"text\" as const,\n\t\t\t\t\t\ttext: block.text,\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tif (block.type === \"toolCall\") {\n\t\t\t\t\tconst toolCall = block as ToolCall;\n\t\t\t\t\tlet normalizedToolCall: ToolCall = { ...toolCall };\n\n\t\t\t\t\tif ((!isSameModel || !preserveProviderState) && toolCall.thoughtSignature) {\n\t\t\t\t\t\tdelete (normalizedToolCall as { thoughtSignature?: string }).thoughtSignature;\n\t\t\t\t\t}\n\n\t\t\t\t\tif ((!isSameModel || normalizeSameModelToolCallIds) && normalizeToolCallId) {\n\t\t\t\t\t\tconst normalizedId = normalizeToolCallId(toolCall.id, model, assistantMsg);\n\t\t\t\t\t\tif (normalizedId !== toolCall.id) {\n\t\t\t\t\t\t\ttoolCallIdMap.set(toolCall.id, normalizedId);\n\t\t\t\t\t\t\tnormalizedToolCall = { ...normalizedToolCall, id: normalizedId };\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\treturn normalizedToolCall;\n\t\t\t\t}\n\n\t\t\t\treturn block;\n\t\t\t});\n\n\t\t\treturn {\n\t\t\t\t...assistantMsg,\n\t\t\t\tcontent: transformedContent,\n\t\t\t};\n\t\t}\n\t\treturn msg;\n\t});\n\n\t// Second pass: pair every replayable tool call with the earliest unconsumed\n\t// result after its declaring assistant. Results are emitted adjacent to their\n\t// calls because Anthropic requires that ordering. A reused ID starts a new\n\t// pairing window, so a later result cannot repair an earlier call.\n\tconst result: Message[] = [];\n\tconst toolResultsById = new Map<string, { message: ToolResultMessage; sourceIndex: number; consumed: boolean }[]>();\n\tconst nextToolCallIndexById = new Map<string, number[]>();\n\t// Tool calls declared only by assistants the emit loop drops (errored/aborted).\n\t// Their results must not be emitted either: a strict provider rejects a tool\n\t// message whose tool_call_id no assistant in the request declares.\n\tconst droppedCallIds = new Set<string>();\n\n\tfor (let sourceIndex = 0; sourceIndex < transformed.length; sourceIndex++) {\n\t\tconst message = transformed[sourceIndex];\n\t\tif (message.role === \"toolResult\") {\n\t\t\tconst entries = toolResultsById.get(message.toolCallId) ?? [];\n\t\t\tentries.push({ message, sourceIndex, consumed: false });\n\t\t\ttoolResultsById.set(message.toolCallId, entries);\n\t\t\tcontinue;\n\t\t}\n\t\tif (message.role !== \"assistant\") {\n\t\t\tcontinue;\n\t\t}\n\t\tif (message.stopReason === \"error\" || message.stopReason === \"aborted\") {\n\t\t\tfor (const block of message.content) {\n\t\t\t\tif (block.type === \"toolCall\") droppedCallIds.add(block.id);\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\t\tfor (const block of message.content) {\n\t\t\tif (block.type !== \"toolCall\") continue;\n\t\t\tconst indexes = nextToolCallIndexById.get(block.id) ?? [];\n\t\t\tindexes.push(sourceIndex);\n\t\t\tnextToolCallIndexById.set(block.id, indexes);\n\t\t}\n\t}\n\n\tfor (let sourceIndex = 0; sourceIndex < transformed.length; sourceIndex++) {\n\t\tconst message = transformed[sourceIndex];\n\t\tif (message.role === \"toolResult\") {\n\t\t\tconst entry = toolResultsById\n\t\t\t\t.get(message.toolCallId)\n\t\t\t\t?.find((candidate) => candidate.sourceIndex === sourceIndex);\n\t\t\tif (!entry?.consumed) {\n\t\t\t\t// Skip results whose call was declared only by a dropped\n\t\t\t\t// (errored/aborted) assistant. An id re-declared by a kept assistant\n\t\t\t\t// still pairs through the normal windows, so keep those results.\n\t\t\t\tif (!droppedCallIds.has(message.toolCallId) || nextToolCallIndexById.has(message.toolCallId)) {\n\t\t\t\t\tresult.push(message);\n\t\t\t\t}\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\t\tif (message.role !== \"assistant\") {\n\t\t\tresult.push(message);\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Skip errored/aborted assistant messages entirely. These incomplete turns\n\t\t// must not be revived merely because a matching result appears later.\n\t\tif (message.stopReason === \"error\" || message.stopReason === \"aborted\") continue;\n\n\t\tresult.push(message);\n\t\tfor (const block of message.content) {\n\t\t\tif (block.type !== \"toolCall\") continue;\n\t\t\tconst laterDeclarations = nextToolCallIndexById.get(block.id) ?? [];\n\t\t\tconst nextDeclarationIndex = laterDeclarations.find((index) => index > sourceIndex) ?? Infinity;\n\t\t\tconst matchedResult = toolResultsById\n\t\t\t\t.get(block.id)\n\t\t\t\t?.find(\n\t\t\t\t\t(candidate) =>\n\t\t\t\t\t\t!candidate.consumed &&\n\t\t\t\t\t\tcandidate.sourceIndex > sourceIndex &&\n\t\t\t\t\t\tcandidate.sourceIndex < nextDeclarationIndex,\n\t\t\t\t);\n\n\t\t\tif (matchedResult) {\n\t\t\t\tmatchedResult.consumed = true;\n\t\t\t\tresult.push(matchedResult.message);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tresult.push({\n\t\t\t\trole: \"toolResult\",\n\t\t\t\ttoolCallId: block.id,\n\t\t\t\ttoolName: block.name,\n\t\t\t\tcontent: [{ type: \"text\", text: \"No result provided\" }],\n\t\t\t\tisError: true,\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t} as ToolResultMessage);\n\t\t}\n\t}\n\n\treturn result;\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"warm-prompt-cache.d.ts","sourceRoot":"","sources":["../../src/api/warm-prompt-cache.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,KAAK,EAAmB,mBAAmB,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAO/F,MAAM,WAAW,oBAAoB;IACpC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,2EAA2E;IAC3E,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;CAC9B;AAED,MAAM,MAAM,qBAAqB,GAC9B;IAAE,QAAQ,CAAC,SAAS,EAAE,KAAK,CAAA;CAAE,GAC7B;IAAE,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,oBAAoB,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAA;CAAE,CAAC;AAElG,MAAM,MAAM,sBAAsB,GAAG,IAAI,CACxC,mBAAmB,EACjB,QAAQ,GACR,gBAAgB,GAChB,KAAK,GACL,WAAW,GACX,OAAO,GACP,SAAS,GACT,WAAW,GACX,WAAW,GACX,aAAa,GACb,WAAW,GACX,QAAQ,GACR,iBAAiB,GACjB,mBAAmB,GACnB,WAAW,CACb,CAAC;AAEF,wBAAsB,eAAe,CACpC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,EACjB,OAAO,EAAE,OAAO,EAChB,OAAO,GAAE,sBAA2B,GAClC,OAAO,CAAC,qBAAqB,CAAC,CAmEhC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"warm-prompt-cache.js","sourceRoot":"","sources":["../../src/api/warm-prompt-cache.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Context, Model, ProviderHeaders, SimpleStreamOptions, Usage } from \"../types.ts\";\nimport { providerHeadersToRecord } from \"../utils/headers.ts\";\nimport { isAnthropicApiBaseUrl } from \"../utils/prompt-cache-ttl.ts\";\nimport type { AnthropicOptions } from \"./anthropic-messages.ts\";\nimport { isOpenAIResponsesPromptCacheModel } from \"./openai-responses-prompt-cache.ts\";\nimport { getPromptCacheWarmer } from \"./prompt-cache-warmers.ts\";\n\nexport interface WarmPromptCacheUsage {\n\treadonly input: number;\n\treadonly output: number;\n\treadonly cacheRead: number;\n\treadonly cacheWrite: number;\n\t/** Priced cost of the warm request, when the provider path computes it. */\n\treadonly cost?: Usage[\"cost\"];\n}\n\nexport type WarmPromptCacheResult =\n\t| { readonly supported: false }\n\t| { readonly supported: true; readonly usage: WarmPromptCacheUsage; readonly usageRaw: unknown };\n\nexport type WarmPromptCacheOptions = Pick<\n\tSimpleStreamOptions,\n\t| \"apiKey\"\n\t| \"cacheRetention\"\n\t| \"env\"\n\t| \"extraBody\"\n\t| \"fetch\"\n\t| \"headers\"\n\t| \"onPayload\"\n\t| \"reasoning\"\n\t| \"serviceTier\"\n\t| \"sessionId\"\n\t| \"signal\"\n\t| \"thinkingBudgets\"\n\t| \"thinkingSelection\"\n\t| \"timeoutMs\"\n>;\n\nexport async function warmPromptCache(\n\tmodel: Model<any>,\n\tcontext: Context,\n\toptions: WarmPromptCacheOptions = {},\n): Promise<WarmPromptCacheResult> {\n\tif (isOpenAIResponsesPromptCacheModel(model)) {\n\t\tif ((options.cacheRetention ?? model.cacheRetention) === \"none\") return { supported: false };\n\t\t// Registered by openai-responses.lazy.ts, so the root barrel never reaches the OpenAI SDK.\n\t\tconst warmer = getPromptCacheWarmer(model.api);\n\t\tif (warmer === undefined) return { supported: false };\n\t\tconst { usage, usageRaw } = await warmer(model, context, options);\n\t\treturn {\n\t\t\tsupported: true,\n\t\t\tusage: {\n\t\t\t\tinput: usage.input,\n\t\t\t\toutput: usage.output,\n\t\t\t\tcacheRead: usage.cacheRead,\n\t\t\t\tcacheWrite: usage.cacheWrite,\n\t\t\t\tcost: usage.cost,\n\t\t\t},\n\t\t\tusageRaw,\n\t\t};\n\t}\n\tif (model.api !== \"anthropic-messages\" || !isAnthropicApiBaseUrl(model.baseUrl)) {\n\t\treturn { supported: false };\n\t}\n\n\tconst anthropicModel = model as Model<\"anthropic-messages\">;\n\t// Loaded lazily: a static import would pull the Anthropic SDK into the root\n\t// barrel and break the lazy provider-loading contract (lazy-module-load.test.ts).\n\tconst [{ default: Anthropic }, { buildAnthropicWarmPromptCacheParams }] = await Promise.all([\n\t\timport(\"@anthropic-ai/sdk\"),\n\t\timport(\"./anthropic-messages.ts\"),\n\t]);\n\tconst headers = providerHeadersToRecord(options.headers);\n\tconst client = new Anthropic({\n\t\tapiKey: options.apiKey ?? null,\n\t\tbaseURL: anthropicModel.baseUrl,\n\t\tdangerouslyAllowBrowser: true,\n\t\tfetch: options.fetch,\n\t\tdefaultHeaders: { ...anthropicModel.headers, ...headers },\n\t});\n\tlet params = buildAnthropicWarmPromptCacheParams(anthropicModel, context, options as AnthropicOptions);\n\tconst transformed = await options.onPayload?.(params, anthropicModel, {\n\t\tmodel: anthropicModel,\n\t\theaders: headers as ProviderHeaders,\n\t});\n\tif (transformed !== undefined) params = transformed as typeof params;\n\tconst sanitized = { ...params } as Record<string, unknown>;\n\tdelete sanitized.stream;\n\tdelete sanitized.thinking;\n\tdelete sanitized.output_config;\n\tdelete sanitized.tool_choice;\n\tsanitized.max_tokens = 0;\n\n\tconst response = await client.beta.messages.create(sanitized as unknown as typeof params, {\n\t\tmaxRetries: 0,\n\t\t...(options.signal ? { signal: options.signal } : {}),\n\t\t...(options.timeoutMs !== undefined ? { timeout: options.timeoutMs } : {}),\n\t});\n\tconst usageRaw = response.usage;\n\treturn {\n\t\tsupported: true,\n\t\tusage: {\n\t\t\tinput: usageRaw.input_tokens,\n\t\t\toutput: usageRaw.output_tokens,\n\t\t\tcacheRead: usageRaw.cache_read_input_tokens ?? 0,\n\t\t\tcacheWrite: usageRaw.cache_creation_input_tokens ?? 0,\n\t\t},\n\t\tusageRaw,\n\t};\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"websocket-liveness.d.ts","sourceRoot":"","sources":["../../src/api/websocket-liveness.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,eAAO,MAAM,mCAAmC,QAAS,CAAC;AAC1D,eAAO,MAAM,kCAAkC,QAAS,CAAC;AACzD,eAAO,MAAM,uCAAuC,IAAI,CAAC;AAEzD,MAAM,WAAW,uBAAuB;IACvC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;CACpC;AAED,eAAO,MAAM,iCAAiC,EAAE,uBAI/C,CAAC;AAEF,KAAK,iBAAiB,GAAG,MAAM,GAAG,MAAM,CAAC;AACzC,KAAK,gBAAgB,GAAG,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;AAEjD,MAAM,WAAW,qBAAqB;IACrC,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,gBAAgB,CAAC,IAAI,EAAE,iBAAiB,EAAE,QAAQ,EAAE,gBAAgB,GAAG,IAAI,CAAC;IAC5E,mBAAmB,CAAC,IAAI,EAAE,iBAAiB,EAAE,QAAQ,EAAE,gBAAgB,GAAG,IAAI,CAAC;CAC/E;AAED,MAAM,WAAW,wBAAwB;IACxC,YAAY,IAAI,IAAI,CAAC;IACrB,IAAI,IAAI,IAAI,CAAC;CACb;AAED,wBAAgB,8BAA8B,CAAC,QAAQ,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,GAAG,MAAM,CAEhG;AAED,qBAAa,sBAAuB,SAAQ,KAAK;IAChD,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IAEjC,YAAY,QAAQ,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE,EAKnF;CACD;AAOD,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,qBAAqB,GAAG,OAAO,CAEhF;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CACrC,MAAM,EAAE,qBAAqB,EAC7B,MAAM,EAAE,CAAC,KAAK,EAAE,sBAAsB,KAAK,IAAI,EAC/C,MAAM,GAAE,uBAA2D,GACjE,wBAAwB,CAiE1B"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"websocket-liveness.js","sourceRoot":"","sources":["../../src/api/websocket-liveness.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Ping/pong liveness for provider WebSocket streams.\n *\n * Without it a stream is judged dead only by the caller's idle budget (five\n * minutes by default), so a half-open connection - the network dropped without\n * a close frame - costs that whole budget before the retry that fixes it. The\n * monitor pings once the connection has been silent for `pingIntervalMs` and\n * reports the connection dead after `maxUnansweredPings` consecutive pings draw\n * no frame of any kind. Runtimes whose WebSocket has no `ping()` (Node's\n * built-in client) get an inert monitor, so their behavior is unchanged.\n */\n\nexport const WEBSOCKET_LIVENESS_PING_INTERVAL_MS = 30_000;\nexport const WEBSOCKET_LIVENESS_PONG_TIMEOUT_MS = 20_000;\nexport const WEBSOCKET_LIVENESS_MAX_UNANSWERED_PINGS = 2;\n\nexport interface WebSocketLivenessPolicy {\n\treadonly pingIntervalMs: number;\n\treadonly pongTimeoutMs: number;\n\treadonly maxUnansweredPings: number;\n}\n\nexport const DEFAULT_WEBSOCKET_LIVENESS_POLICY: WebSocketLivenessPolicy = {\n\tpingIntervalMs: WEBSOCKET_LIVENESS_PING_INTERVAL_MS,\n\tpongTimeoutMs: WEBSOCKET_LIVENESS_PONG_TIMEOUT_MS,\n\tmaxUnansweredPings: WEBSOCKET_LIVENESS_MAX_UNANSWERED_PINGS,\n};\n\ntype LivenessEventType = \"ping\" | \"pong\";\ntype LivenessListener = (event: unknown) => void;\n\nexport interface LivenessCapableSocket {\n\tping?(data?: string): void;\n\taddEventListener(type: LivenessEventType, listener: LivenessListener): void;\n\tremoveEventListener(type: LivenessEventType, listener: LivenessListener): void;\n}\n\nexport interface WebSocketLivenessMonitor {\n\tnoteActivity(): void;\n\tstop(): void;\n}\n\nexport function formatWebSocketLivenessFailure(silentMs: number, unansweredPings: number): string {\n\treturn `WebSocket liveness timeout after ${silentMs}ms (${unansweredPings} pings unanswered)`;\n}\n\nexport class WebSocketLivenessError extends Error {\n\treadonly silentMs: number;\n\treadonly unansweredPings: number;\n\n\tconstructor(silentMs: number, unansweredPings: number, options?: { cause?: unknown }) {\n\t\tsuper(formatWebSocketLivenessFailure(silentMs, unansweredPings), options);\n\t\tthis.name = \"WebSocketLivenessError\";\n\t\tthis.silentMs = silentMs;\n\t\tthis.unansweredPings = unansweredPings;\n\t}\n}\n\nconst INERT_MONITOR: WebSocketLivenessMonitor = {\n\tnoteActivity() {},\n\tstop() {},\n};\n\nexport function supportsWebSocketLiveness(socket: LivenessCapableSocket): boolean {\n\treturn typeof socket.ping === \"function\";\n}\n\n/**\n * Starts the heartbeat for one request on `socket`. Every inbound message must\n * be reported through `noteActivity()`; the monitor must be stopped when the\n * request settles. `onDead` fires at most once, after the monitor stopped itself.\n */\nexport function startWebSocketLiveness(\n\tsocket: LivenessCapableSocket,\n\tonDead: (error: WebSocketLivenessError) => void,\n\tpolicy: WebSocketLivenessPolicy = DEFAULT_WEBSOCKET_LIVENESS_POLICY,\n): WebSocketLivenessMonitor {\n\tconst ping = socket.ping;\n\tif (typeof ping !== \"function\") return INERT_MONITOR;\n\tconst sendPing = ping.bind(socket);\n\n\tlet timer: ReturnType<typeof setTimeout> | undefined;\n\tlet silentSince = Date.now();\n\tlet unansweredPings = 0;\n\tlet stopped = false;\n\n\tconst onFrame: LivenessListener = () => noteActivity();\n\tsocket.addEventListener(\"pong\", onFrame);\n\tsocket.addEventListener(\"ping\", onFrame);\n\n\tconst stop = (): void => {\n\t\tif (stopped) return;\n\t\tstopped = true;\n\t\tif (timer !== undefined) clearTimeout(timer);\n\t\ttimer = undefined;\n\t\tsocket.removeEventListener(\"pong\", onFrame);\n\t\tsocket.removeEventListener(\"ping\", onFrame);\n\t};\n\n\tconst declareDead = (cause?: unknown): void => {\n\t\tconst error = new WebSocketLivenessError(\n\t\t\tDate.now() - silentSince,\n\t\t\tunansweredPings,\n\t\t\tcause === undefined ? undefined : { cause },\n\t\t);\n\t\tstop();\n\t\tonDead(error);\n\t};\n\n\tconst arm = (delayMs: number): void => {\n\t\tif (timer !== undefined) clearTimeout(timer);\n\t\ttimer = setTimeout(onDeadline, delayMs);\n\t};\n\n\tconst onDeadline = (): void => {\n\t\ttimer = undefined;\n\t\tif (stopped) return;\n\t\tif (unansweredPings >= policy.maxUnansweredPings) {\n\t\t\tdeclareDead();\n\t\t\treturn;\n\t\t}\n\t\tunansweredPings++;\n\t\ttry {\n\t\t\tsendPing(\"liveness\");\n\t\t} catch (cause) {\n\t\t\t// A ping that cannot be written is the same verdict as an unanswered one, reached sooner.\n\t\t\tdeclareDead(cause);\n\t\t\treturn;\n\t\t}\n\t\tarm(policy.pongTimeoutMs);\n\t};\n\n\tconst noteActivity = (): void => {\n\t\tif (stopped) return;\n\t\tsilentSince = Date.now();\n\t\tunansweredPings = 0;\n\t\tarm(policy.pingIntervalMs);\n\t};\n\n\tarm(policy.pingIntervalMs);\n\treturn { noteActivity, stop };\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"websocket-transport-failure.d.ts","sourceRoot":"","sources":["../../src/api/websocket-transport-failure.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,eAAO,MAAM,8BAA8B,MAAM,CAAC;AAClD,eAAO,MAAM,oCAAoC,OAAO,CAAC;AAEzD,qBAAa,mBAAoB,SAAQ,KAAK;IAC7C,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAE5B,YAAY,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;KAAE,EAM5F;CACD;AAMD,sFAAsF;AACtF,wBAAgB,4BAA4B,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,GAAG,SAAS,CAW9E;AAED,wBAAgB,qBAAqB,IAAI,KAAK,CAE7C;AAED,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,CAahE;AAED,MAAM,WAAW,yBAAyB;IACzC,OAAO,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAAC;IAC9B,OAAO,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAAC;IAC9B,OAAO,IAAI,IAAI,CAAC;CAChB;AAED;;;;;GAKG;AACH,wBAAgB,+BAA+B,CAC9C,IAAI,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,EAC5B,OAAO,SAAiC,GACtC,yBAAyB,CAkC3B"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"websocket-transport-failure.js","sourceRoot":"","sources":["../../src/api/websocket-transport-failure.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Turns a WebSocket runtime's `error` / `close` event pair into ONE failure\n * that names the cause.\n *\n * On an unclean disconnect Bun (and Node's undici client) fire an `error`\n * event that carries no message, followed by the `close` event that holds the\n * code and reason - `1006 Connection ended` for a dropped TCP session. Failing\n * on the first event reported a bare \"WebSocket error\" and threw that diagnosis\n * away (senpi#1628). A message-less error therefore waits for the close frame,\n * bounded by a short grace so a runtime that never sends one still fails.\n */\n\nexport const WEBSOCKET_ERROR_CLOSE_GRACE_MS = 250;\nexport const WEBSOCKET_MESSAGE_TOO_BIG_CLOSE_CODE = 1009;\n\nexport class WebSocketCloseError extends Error {\n\treadonly code?: number;\n\treadonly reason?: string;\n\treadonly wasClean?: boolean;\n\n\tconstructor(message: string, options?: { code?: number; reason?: string; wasClean?: boolean }) {\n\t\tsuper(message);\n\t\tthis.name = \"WebSocketCloseError\";\n\t\tthis.code = options?.code;\n\t\tthis.reason = options?.reason;\n\t\tthis.wasClean = options?.wasClean;\n\t}\n}\n\nfunction nonEmptyString(value: unknown): string | undefined {\n\treturn typeof value === \"string\" && value.length > 0 ? value : undefined;\n}\n\n/** The runtime's own message for an `error` event, or undefined when it sent none. */\nexport function extractWebSocketErrorMessage(event: unknown): Error | undefined {\n\tif (!event || typeof event !== \"object\") return undefined;\n\tconst message = nonEmptyString((event as { message?: unknown }).message);\n\tif (message !== undefined) return new Error(message);\n\tconst nested = (event as { error?: unknown }).error;\n\tif (nested instanceof Error && nested.message.length > 0) return nested;\n\tif (nested && typeof nested === \"object\") {\n\t\tconst nestedMessage = nonEmptyString((nested as { message?: unknown }).message);\n\t\tif (nestedMessage !== undefined) return new Error(nestedMessage);\n\t}\n\treturn undefined;\n}\n\nexport function genericWebSocketError(): Error {\n\treturn new Error(\"WebSocket error\");\n}\n\nexport function extractWebSocketCloseError(event: unknown): Error {\n\tif (!event || typeof event !== \"object\") return new Error(\"WebSocket closed\");\n\tconst code = (event as { code?: unknown }).code;\n\tconst reason = nonEmptyString((event as { reason?: unknown }).reason);\n\tconst wasClean = (event as { wasClean?: unknown }).wasClean;\n\tconst codeText = typeof code === \"number\" ? ` ${code}` : \"\";\n\tconst reasonText =\n\t\treason !== undefined ? ` ${reason}` : code === WEBSOCKET_MESSAGE_TOO_BIG_CLOSE_CODE ? \" message too big\" : \"\";\n\treturn new WebSocketCloseError(`WebSocket closed${codeText}${reasonText}`.trim(), {\n\t\tcode: typeof code === \"number\" ? code : undefined,\n\t\treason,\n\t\twasClean: typeof wasClean === \"boolean\" ? wasClean : undefined,\n\t});\n}\n\nexport interface WebSocketTransportFailure {\n\tonError(event: unknown): void;\n\tonClose(event: unknown): void;\n\tdispose(): void;\n}\n\n/**\n * Reports at most one failure to `fail`. A message-bearing `error` reports at\n * once; a message-less one defers to the `close` that follows, or to the\n * generic error once the grace expires. `dispose` cancels a pending grace when\n * the caller settles the stream some other way (completion, abort, idle).\n */\nexport function createWebSocketTransportFailure(\n\tfail: (error: Error) => void,\n\tgraceMs = WEBSOCKET_ERROR_CLOSE_GRACE_MS,\n): WebSocketTransportFailure {\n\tlet grace: ReturnType<typeof setTimeout> | undefined;\n\tlet reported = false;\n\n\tconst report = (error: Error): void => {\n\t\tif (reported) return;\n\t\treported = true;\n\t\tdispose();\n\t\tfail(error);\n\t};\n\tconst dispose = (): void => {\n\t\tif (grace === undefined) return;\n\t\tclearTimeout(grace);\n\t\tgrace = undefined;\n\t};\n\n\treturn {\n\t\tonError(event) {\n\t\t\tconst error = extractWebSocketErrorMessage(event);\n\t\t\tif (error !== undefined) {\n\t\t\t\treport(error);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (reported || grace !== undefined) return;\n\t\t\tgrace = setTimeout(() => {\n\t\t\t\tgrace = undefined;\n\t\t\t\treport(genericWebSocketError());\n\t\t\t}, graceMs);\n\t\t},\n\t\tonClose(event) {\n\t\t\treport(extractWebSocketCloseError(event));\n\t\t},\n\t\tdispose,\n\t};\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"api-registry.d.ts","sourceRoot":"","sources":["../src/api-registry.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACX,GAAG,EACH,2BAA2B,EAC3B,OAAO,EACP,KAAK,EACL,mBAAmB,EACnB,cAAc,EACd,aAAa,EACb,MAAM,YAAY,CAAC;AAEpB,MAAM,MAAM,iBAAiB,GAAG,CAC/B,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,EACjB,OAAO,EAAE,OAAO,EAChB,OAAO,CAAC,EAAE,aAAa,KACnB,2BAA2B,CAAC;AAEjC,MAAM,MAAM,uBAAuB,GAAG,CACrC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,EACjB,OAAO,EAAE,OAAO,EAChB,OAAO,CAAC,EAAE,mBAAmB,KACzB,2BAA2B,CAAC;AAEjC,MAAM,WAAW,WAAW,CAAC,IAAI,SAAS,GAAG,GAAG,GAAG,EAAE,QAAQ,SAAS,aAAa,GAAG,aAAa;IAClG,GAAG,EAAE,IAAI,CAAC;IACV,MAAM,EAAE,cAAc,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IACvC,YAAY,EAAE,cAAc,CAAC,IAAI,EAAE,mBAAmB,CAAC,CAAC;CACxD;AAED,MAAM,WAAW,mBAAmB;IACnC,GAAG,EAAE,GAAG,CAAC;IACT,MAAM,EAAE,iBAAiB,CAAC;IAC1B,YAAY,EAAE,uBAAuB,CAAC;CACtC;AAED,MAAM,MAAM,qBAAqB,GAAG;IACnC,QAAQ,EAAE,mBAAmB,CAAC;IAC9B,QAAQ,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,+EAA+E;AAC/E,MAAM,WAAW,mBAAmB;IACnC,KAAK,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAC3B,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,qBAAqB,CAAC,CAAC;CAC5C;AAOD,qFAAqF;AACrF,wBAAgB,4BAA4B,CAAC,QAAQ,EAAE,MAAM,mBAAmB,GAAG,SAAS,GAAG,IAAI,CAElG;AAED,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAEjE;AA2CD,wBAAgB,mBAAmB,CAAC,IAAI,SAAS,GAAG,EAAE,QAAQ,SAAS,aAAa,EACnF,QAAQ,EAAE,WAAW,CAAC,IAAI,EAAE,QAAQ,CAAC,EACrC,QAAQ,CAAC,EAAE,MAAM,GACf,IAAI,CAIN;AAED,oFAAoF;AACpF,wBAAgB,0BAA0B,CAAC,IAAI,SAAS,GAAG,EAAE,QAAQ,SAAS,aAAa,EAC1F,QAAQ,EAAE,WAAW,CAAC,IAAI,EAAE,QAAQ,CAAC,GACnC,IAAI,CAIN;AAED,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,GAAG,GAAG,mBAAmB,GAAG,SAAS,CAE/E;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,GAAG,GAAG,mBAAmB,GAAG,SAAS,CAaxE;AAED,wBAAgB,eAAe,IAAI,mBAAmB,EAAE,CAQvD;AAED,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAM7D;AAED,wBAAgB,iBAAiB,IAAI,IAAI,CAGxC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"api-registry.js","sourceRoot":"","sources":["../src/api-registry.ts"],"names":[],"mappings":"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","sourcesContent":["import { getRegisteredFauxProvider } from \"./providers/faux.ts\";\nimport type {\n\tApi,\n\tAssistantMessageEventStream,\n\tContext,\n\tModel,\n\tSimpleStreamOptions,\n\tStreamFunction,\n\tStreamOptions,\n} from \"./types.ts\";\n\nexport type ApiStreamFunction = (\n\tmodel: Model<Api>,\n\tcontext: Context,\n\toptions?: StreamOptions,\n) => AssistantMessageEventStream;\n\nexport type ApiStreamSimpleFunction = (\n\tmodel: Model<Api>,\n\tcontext: Context,\n\toptions?: SimpleStreamOptions,\n) => AssistantMessageEventStream;\n\nexport interface ApiProvider<TApi extends Api = Api, TOptions extends StreamOptions = StreamOptions> {\n\tapi: TApi;\n\tstream: StreamFunction<TApi, TOptions>;\n\tstreamSimple: StreamFunction<TApi, SimpleStreamOptions>;\n}\n\nexport interface ApiProviderInternal {\n\tapi: Api;\n\tstream: ApiStreamFunction;\n\tstreamSimple: ApiStreamSimpleFunction;\n}\n\nexport type RegisteredApiProvider = {\n\tprovider: ApiProviderInternal;\n\tsourceId?: string;\n};\n\n/** Browser-neutral shape installed by the node-only provider-scope subpath. */\nexport interface ProviderScopeAccess {\n\tstate: \"active\" | \"closed\";\n\toverlay: Map<string, RegisteredApiProvider>;\n}\n\nconst apiProviderRegistry = new Map<string, RegisteredApiProvider>();\nconst builtinApiProviderRegistry = new Map<string, RegisteredApiProvider>();\nlet getProviderScope: () => ProviderScopeAccess | undefined = () => undefined;\nlet providerScopeStrictMode = false;\n\n/** Installs the optional node-only scope lookup without importing node APIs here. */\nexport function installProviderScopeAccessor(accessor: () => ProviderScopeAccess | undefined): void {\n\tgetProviderScope = accessor;\n}\n\nexport function setProviderScopeStrictMode(enabled: boolean): void {\n\tproviderScopeStrictMode = enabled;\n}\n\nfunction getActiveProviderScope(): ProviderScopeAccess | undefined {\n\tconst scope = getProviderScope();\n\tif (scope?.state === \"closed\") throw new Error(\"Provider scope is closed\");\n\tif (!scope && providerScopeStrictMode) throw new Error(\"Provider scope is required in strict mode\");\n\treturn scope;\n}\n\nfunction wrapStream<TApi extends Api, TOptions extends StreamOptions>(\n\tapi: TApi,\n\tstream: StreamFunction<TApi, TOptions>,\n): ApiStreamFunction {\n\treturn (model, context, options) => {\n\t\tif (model.api !== api) throw new Error(`Mismatched api: ${model.api} expected ${api}`);\n\t\treturn stream(model as Model<TApi>, context, options as TOptions);\n\t};\n}\n\nfunction wrapStreamSimple<TApi extends Api>(\n\tapi: TApi,\n\tstreamSimple: StreamFunction<TApi, SimpleStreamOptions>,\n): ApiStreamSimpleFunction {\n\treturn (model, context, options) => {\n\t\tif (model.api !== api) throw new Error(`Mismatched api: ${model.api} expected ${api}`);\n\t\treturn streamSimple(model as Model<TApi>, context, options);\n\t};\n}\n\nfunction createRegisteredProvider<TApi extends Api, TOptions extends StreamOptions>(\n\tprovider: ApiProvider<TApi, TOptions>,\n\tsourceId?: string,\n): RegisteredApiProvider {\n\treturn {\n\t\tprovider: {\n\t\t\tapi: provider.api,\n\t\t\tstream: wrapStream(provider.api, provider.stream),\n\t\t\tstreamSimple: wrapStreamSimple(provider.api, provider.streamSimple),\n\t\t},\n\t\tsourceId,\n\t};\n}\n\nexport function registerApiProvider<TApi extends Api, TOptions extends StreamOptions>(\n\tprovider: ApiProvider<TApi, TOptions>,\n\tsourceId?: string,\n): void {\n\tconst scope = getActiveProviderScope();\n\tconst registry = scope ? scope.overlay : apiProviderRegistry;\n\tregistry.set(provider.api, createRegisteredProvider(provider, sourceId));\n}\n\n/** Registers a builtin once, retaining its immutable identity for active scopes. */\nexport function registerBuiltinApiProvider<TApi extends Api, TOptions extends StreamOptions>(\n\tprovider: ApiProvider<TApi, TOptions>,\n): void {\n\tconst registered = builtinApiProviderRegistry.get(provider.api) ?? createRegisteredProvider(provider);\n\tbuiltinApiProviderRegistry.set(provider.api, registered);\n\tif (!apiProviderRegistry.has(provider.api)) apiProviderRegistry.set(provider.api, registered);\n}\n\nexport function getBuiltinApiProvider(api: Api): ApiProviderInternal | undefined {\n\treturn builtinApiProviderRegistry.get(api)?.provider;\n}\n\nexport function getApiProvider(api: Api): ApiProviderInternal | undefined {\n\tconst scope = getActiveProviderScope();\n\tif (scope) return scope.overlay.get(api)?.provider ?? builtinApiProviderRegistry.get(api)?.provider;\n\n\tconst faux = getRegisteredFauxProvider(api);\n\tif (faux) {\n\t\treturn {\n\t\t\tapi: faux.api,\n\t\t\tstream: wrapStream(faux.api, faux.stream),\n\t\t\tstreamSimple: wrapStreamSimple(faux.api, faux.streamSimple),\n\t\t};\n\t}\n\treturn apiProviderRegistry.get(api)?.provider;\n}\n\nexport function getApiProviders(): ApiProviderInternal[] {\n\tconst scope = getActiveProviderScope();\n\tif (scope) {\n\t\tconst providers = new Map(builtinApiProviderRegistry);\n\t\tfor (const [api, entry] of scope.overlay) providers.set(api, entry);\n\t\treturn Array.from(providers.values(), (entry) => entry.provider);\n\t}\n\treturn Array.from(apiProviderRegistry.values(), (entry) => entry.provider);\n}\n\nexport function unregisterApiProviders(sourceId: string): void {\n\tconst scope = getActiveProviderScope();\n\tconst registry = scope ? scope.overlay : apiProviderRegistry;\n\tfor (const [api, entry] of registry.entries()) {\n\t\tif (entry.sourceId === sourceId) registry.delete(api);\n\t}\n}\n\nexport function clearApiProviders(): void {\n\tconst scope = getActiveProviderScope();\n\t(scope ? scope.overlay : apiProviderRegistry).clear();\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/auth/context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAkB9C;;;GAGG;AACH,wBAAgB,0BAA0B,IAAI,WAAW,CAsBxD"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/auth/context.ts"],"names":[],"mappings":";;;;;;;;AAUA,8EAA8E;AAC9E,MAAM,gBAAgB,GAAG,CAAC,SAAiB,EAAoB,EAAE,CAAC,MAAM,kCAAC,SAAS,EAAC,CAAC;AAEpF,SAAS,aAAa;IACrB,MAAM,IAAI,GAAI,UAAyE,CAAC,OAAO,CAAC;IAChG,OAAO,IAAI,EAAE,GAAG,CAAC;AAClB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,0BAA0B;IACzC,OAAO;QACN,KAAK,CAAC,GAAG,CAAC,IAAY;YACrB,MAAM,KAAK,GAAG,aAAa,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;YACtC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;QACjF,CAAC;QAED,KAAK,CAAC,UAAU,CAAC,IAAY;YAC5B,IAAI,CAAC;gBACJ,MAAM,EAAE,GAAG,CAAC,MAAM,gBAAgB,CAAC,kBAAkB,CAAC,CAAiB,CAAC;gBACxE,IAAI,QAAQ,GAAG,IAAI,CAAC;gBACpB,IAAI,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;oBAC9B,MAAM,EAAE,GAAG,CAAC,MAAM,gBAAgB,CAAC,SAAS,CAAC,CAAiB,CAAC;oBAC/D,QAAQ,GAAG,EAAE,CAAC,OAAO,EAAE,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;gBAC7C,CAAC;gBACD,MAAM,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;gBAC1B,OAAO,IAAI,CAAC;YACb,CAAC;YAAC,MAAM,CAAC;gBACR,OAAO,KAAK,CAAC;YACd,CAAC;QACF,CAAC;KACD,CAAC;AACH,CAAC","sourcesContent":["import type { AuthContext } from \"./types.ts\";\n\ninterface NodeFsModule {\n\taccess(path: string): Promise<void>;\n}\n\ninterface NodeOsModule {\n\thomedir(): string;\n}\n\n// Variable specifier so browser bundlers do not try to resolve node builtins.\nconst importNodeModule = (specifier: string): Promise<unknown> => import(specifier);\n\nfunction getProcessEnv(): Record<string, string | undefined> | undefined {\n\tconst proc = (globalThis as { process?: { env?: Record<string, string | undefined> } }).process;\n\treturn proc?.env;\n}\n\n/**\n * Default auth context: env vars from `process.env` (undefined in browsers),\n * file existence via node:fs (always false in browsers).\n */\nexport function defaultProviderAuthContext(): AuthContext {\n\treturn {\n\t\tasync env(name: string): Promise<string | undefined> {\n\t\t\tconst value = getProcessEnv()?.[name];\n\t\t\treturn typeof value === \"string\" && value.trim().length > 0 ? value : undefined;\n\t\t},\n\n\t\tasync fileExists(path: string): Promise<boolean> {\n\t\t\ttry {\n\t\t\t\tconst fs = (await importNodeModule(\"node:fs/promises\")) as NodeFsModule;\n\t\t\t\tlet resolved = path;\n\t\t\t\tif (resolved.startsWith(\"~\")) {\n\t\t\t\t\tconst os = (await importNodeModule(\"node:os\")) as NodeOsModule;\n\t\t\t\t\tresolved = os.homedir() + resolved.slice(1);\n\t\t\t\t}\n\t\t\t\tawait fs.access(resolved);\n\t\t\t\treturn true;\n\t\t\t} catch {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t},\n\t};\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"credential-store.d.ts","sourceRoot":"","sources":["../../src/auth/credential-store.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,oBAAoB,EAAE,UAAU,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAEpG;;;;;GAKG;AACH,qBAAa,uBAAwB,YAAW,eAAe;IAC9D,OAAO,CAAC,WAAW,CAAiC;IACpD,OAAO,CAAC,MAAM,CAAuC;IAErD,8FAA8F;IAC9F,OAAO,CAAC,OAAO;IAgBT,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,oBAAoB,GAAG,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC,CAG9F;IAEK,IAAI,CAAC,OAAO,CAAC,EAAE,oBAAoB,GAAG,OAAO,CAAC,SAAS,cAAc,EAAE,CAAC,CAG7E;IAED,MAAM,CACL,UAAU,EAAE,MAAM,EAClB,EAAE,EAAE,CAAC,OAAO,EAAE,UAAU,GAAG,SAAS,KAAK,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC,EACxE,OAAO,CAAC,EAAE,oBAAoB,GAC5B,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC,CAYjC;IAED,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC,CAQxE;CACD"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"credential-store.js","sourceRoot":"","sources":["../../src/auth/credential-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAGzE;;;;;GAKG;AACH,MAAM,OAAO,uBAAuB;IAApC;QACS,gBAAW,GAAG,IAAI,GAAG,EAAsB,CAAC;QAC5C,WAAM,GAAG,IAAI,GAAG,EAA4B,CAAC;IAwDtD,CAAC;IAtDA,8FAA8F;IACtF,OAAO,CAAI,UAAkB,EAAE,IAAsB,EAAE,OAA8B;QAC5F,MAAM,MAAM,GAAG,eAAe,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAChD,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QAClE,MAAM,MAAM,GAAG,CAAC,KAAK,IAAI,EAAE;YAC1B,MAAM,QAAQ,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;YAC/B,MAAM,CAAC,cAAc,EAAE,CAAC;YACxB,OAAO,IAAI,EAAE,CAAC;QACf,CAAC,CAAC,EAAE,CAAC;QACL,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QACpC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;QAClC,KAAK,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE;YACnB,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,IAAI;gBAAE,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QAC1E,CAAC,CAAC,CAAC;QACH,OAAO,mBAAmB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5C,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,UAAkB,EAAE,OAA8B;QAC5D,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC;QAClC,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IACzC,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,OAA8B;QACxC,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC;QAClC,OAAO,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,EAAE,UAAU,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IACzG,CAAC;IAED,MAAM,CACL,UAAkB,EAClB,EAAwE,EACxE,OAA8B;QAE9B,OAAO,IAAI,CAAC,OAAO,CAClB,UAAU,EACV,KAAK,IAAI,EAAE;YACV,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;YACjD,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,CAAC;YAC/B,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC;YAClC,IAAI,IAAI,KAAK,SAAS;gBAAE,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;YAC/D,OAAO,IAAI,IAAI,OAAO,CAAC;QACxB,CAAC,EACD,OAAO,CACP,CAAC;IACH,CAAC;IAED,MAAM,CAAC,UAAkB,EAAE,OAA8B;QACxD,OAAO,IAAI,CAAC,OAAO,CAClB,UAAU,EACV,KAAK,IAAI,EAAE;YACV,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QACrC,CAAC,EACD,OAAO,CACP,CAAC;IACH,CAAC;CACD","sourcesContent":["import { operationSignal, raceWithAbortSignal } from \"../utils/abort.ts\";\nimport type { AuthOperationOptions, Credential, CredentialInfo, CredentialStore } from \"./types.ts\";\n\n/**\n * Default in-memory credential store. Apps inject persistent stores.\n * Keyed by `Provider.id`, one entry per provider (possibly a pooled one);\n * see `CredentialStore`.\n * Writes are serialized per provider through a promise chain.\n */\nexport class InMemoryCredentialStore implements CredentialStore {\n\tprivate credentials = new Map<string, Credential>();\n\tprivate chains = new Map<string, Promise<unknown>>();\n\n\t/** Serialize tasks per provider id without releasing the chain before active work settles. */\n\tprivate enqueue<T>(providerId: string, task: () => Promise<T>, options?: AuthOperationOptions): Promise<T> {\n\t\tconst signal = operationSignal(options?.signal);\n\t\tconst previous = this.chains.get(providerId) ?? Promise.resolve();\n\t\tconst queued = (async () => {\n\t\t\tawait previous.catch(() => {});\n\t\t\tsignal.throwIfAborted();\n\t\t\treturn task();\n\t\t})();\n\t\tconst tail = queued.catch(() => {});\n\t\tthis.chains.set(providerId, tail);\n\t\tvoid tail.then(() => {\n\t\t\tif (this.chains.get(providerId) === tail) this.chains.delete(providerId);\n\t\t});\n\t\treturn raceWithAbortSignal(queued, signal);\n\t}\n\n\tasync read(providerId: string, options?: AuthOperationOptions): Promise<Credential | undefined> {\n\t\toptions?.signal?.throwIfAborted();\n\t\treturn this.credentials.get(providerId);\n\t}\n\n\tasync list(options?: AuthOperationOptions): Promise<readonly CredentialInfo[]> {\n\t\toptions?.signal?.throwIfAborted();\n\t\treturn [...this.credentials].map(([providerId, credential]) => ({ providerId, type: credential.type }));\n\t}\n\n\tmodify(\n\t\tproviderId: string,\n\t\tfn: (current: Credential | undefined) => Promise<Credential | undefined>,\n\t\toptions?: AuthOperationOptions,\n\t): Promise<Credential | undefined> {\n\t\treturn this.enqueue(\n\t\t\tproviderId,\n\t\t\tasync () => {\n\t\t\t\tconst current = this.credentials.get(providerId);\n\t\t\t\tconst next = await fn(current);\n\t\t\t\toptions?.signal?.throwIfAborted();\n\t\t\t\tif (next !== undefined) this.credentials.set(providerId, next);\n\t\t\t\treturn next ?? current;\n\t\t\t},\n\t\t\toptions,\n\t\t);\n\t}\n\n\tdelete(providerId: string, options?: AuthOperationOptions): Promise<void> {\n\t\treturn this.enqueue(\n\t\t\tproviderId,\n\t\t\tasync () => {\n\t\t\t\tthis.credentials.delete(providerId);\n\t\t\t},\n\t\t\toptions,\n\t\t);\n\t}\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"headers.d.ts","sourceRoot":"","sources":["../../src/auth/headers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAWnD,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAG5D;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,eAAe,GAAG,SAAS,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAIrF;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,eAAe,GAAG,SAAS,GAAG,OAAO,CAUlF"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"headers.js","sourceRoot":"","sources":["../../src/auth/headers.ts"],"names":[],"mappings":"AAEA,MAAM,0BAA0B,GAAG;IAClC,SAAS;IACT,WAAW;IACX,YAAY;IACZ,cAAc;IACd,eAAe;IACf,eAAe;CACN,CAAC;AAEX,MAAM,UAAU,sBAAsB,CAAC,IAAY;IAClD,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;IACtC,OAAO,0BAA0B,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,UAAU,KAAK,MAAM,IAAI,UAAU,CAAC,QAAQ,CAAC,IAAI,MAAM,EAAE,CAAC,CAAC,CAAC;AAChH,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,OAAoC,EAAE,IAAY;IAC3E,IAAI,CAAC,OAAO;QAAE,OAAO,KAAK,CAAC;IAC3B,MAAM,KAAK,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;IAChE,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;AAC7D,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,OAAoC;IACxE,IAAI,CAAC,OAAO;QAAE,OAAO,KAAK,CAAC;IAC3B,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,gBAAgB,CAAC,OAAO,CAAC,EAAE,CAAC;QACvD,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,SAAS;QACzE,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;QAChC,IAAI,CAAC,UAAU;YAAE,SAAS;QAC1B,IAAI,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,IAAI,wBAAwB,CAAC,IAAI,CAAC,UAAU,CAAC;YAAE,SAAS;QAC1F,OAAO,IAAI,CAAC;IACb,CAAC;IACD,OAAO,KAAK,CAAC;AACd,CAAC;AAED,SAAS,gBAAgB,CAAC,OAAwB;IACjD,MAAM,SAAS,GAAG,IAAI,GAAG,EAAyB,CAAC;IACnD,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QACrD,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,KAAK,IAAI,IAAI,CAAC,CAAC;IAClD,CAAC;IACD,OAAO,SAAS,CAAC;AAClB,CAAC","sourcesContent":["import type { ProviderHeaders } from \"../types.ts\";\n\nconst CREDENTIAL_HEADER_SUFFIXES = [\n\t\"api-key\",\n\t\"api-token\",\n\t\"auth-token\",\n\t\"access-token\",\n\t\"authorization\",\n\t\"client-secret\",\n] as const;\n\nexport function isCredentialHeaderName(name: string): boolean {\n\tconst normalized = name.toLowerCase();\n\treturn CREDENTIAL_HEADER_SUFFIXES.some((suffix) => normalized === suffix || normalized.endsWith(`-${suffix}`));\n}\n\nexport function hasHeader(headers: ProviderHeaders | undefined, name: string): boolean {\n\tif (!headers) return false;\n\tconst value = effectiveHeaders(headers).get(name.toLowerCase());\n\treturn typeof value === \"string\" && value.trim().length > 0;\n}\n\nexport function hasCredentialHeaders(headers: ProviderHeaders | undefined): boolean {\n\tif (!headers) return false;\n\tfor (const [name, value] of effectiveHeaders(headers)) {\n\t\tif (!isCredentialHeaderName(name) || typeof value !== \"string\") continue;\n\t\tconst normalized = value.trim();\n\t\tif (!normalized) continue;\n\t\tif (name.endsWith(\"authorization\") && /^(?:basic|bearer)\\s*$/i.test(normalized)) continue;\n\t\treturn true;\n\t}\n\treturn false;\n}\n\nfunction effectiveHeaders(headers: ProviderHeaders): Map<string, string | null> {\n\tconst effective = new Map<string, string | null>();\n\tfor (const [name, value] of Object.entries(headers)) {\n\t\teffective.set(name.toLowerCase(), value ?? null);\n\t}\n\treturn effective;\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../src/auth/helpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAExD;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,MAAM,EAAE,GAAG,UAAU,CAsBlF;AAED;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,qBAAqB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1C,IAAI,EAAE,MAAM,OAAO,CAAC,SAAS,CAAC,CAAC;CAC/B,GAAG,SAAS,CAeZ"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../src/auth/helpers.ts"],"names":[],"mappings":"AAEA;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAAC,IAAY,EAAE,OAA0B;IACrE,OAAO;QACN,IAAI;QACJ,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,EAAE;YAC5B,WAAW,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC;YACpC,MAAM,GAAG,GAAG,MAAM,WAAW,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,IAAI,EAAE,EAAE,CAAC,CAAC;YACnF,WAAW,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC;YACpC,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC;QACjC,CAAC;QACD,OAAO,EAAE,KAAK,EAAE,EAAE,GAAG,EAAE,UAAU,EAAE,MAAM,EAAE,EAAE,EAAE;YAC9C,MAAM,CAAC,cAAc,EAAE,CAAC;YACxB,IAAI,UAAU,EAAE,GAAG,EAAE,CAAC;gBACrB,OAAO,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,UAAU,CAAC,GAAG,EAAE,EAAE,GAAG,EAAE,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,mBAAmB,EAAE,CAAC;YAC/F,CAAC;YACD,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;gBAC9B,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;gBACpC,MAAM,CAAC,cAAc,EAAE,CAAC;gBACxB,IAAI,KAAK;oBAAE,OAAO,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;YAC/D,CAAC;YACD,OAAO,SAAS,CAAC;QAClB,CAAC;KACD,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,SAAS,CAAC,KAMzB;IACA,IAAI,OAAuC,CAAC;IAC5C,MAAM,MAAM,GAAG,GAAG,EAAE;QACnB,OAAO,KAAK,KAAK,CAAC,IAAI,EAAE,CAAC;QACzB,OAAO,OAAO,CAAC;IAChB,CAAC,CAAC;IACF,OAAO;QACN,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,cAAc,EAAE,KAAK,CAAC,cAAc;QACpC,UAAU,EAAE,KAAK,CAAC,UAAU;QAC5B,GAAG,CAAC,KAAK,CAAC,qBAAqB,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,qBAAqB,EAAE,KAAK,CAAC,qBAAqB,EAAE,CAAC;QAC5G,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,EAAE,CAAC,CAAC,MAAM,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC;QACjE,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,MAAM,CAAC;QACnF,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE,CAAC,CAAC,MAAM,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC;KACjE,CAAC;AACH,CAAC","sourcesContent":["import type { ApiKeyAuth, OAuthAuth } from \"./types.ts\";\n\n/**\n * Standard api-key auth: a stored credential key wins, otherwise the first\n * set env var resolves. Includes a `login` that prompts for the key.\n * Providers with non-standard resolution (provider env, ambient files, IAM)\n * write their own `ApiKeyAuth`.\n */\nexport function envApiKeyAuth(name: string, envVars: readonly string[]): ApiKeyAuth {\n\treturn {\n\t\tname,\n\t\tlogin: async (interaction) => {\n\t\t\tinteraction.signal.throwIfAborted();\n\t\t\tconst key = await interaction.prompt({ type: \"secret\", message: `Enter ${name}` });\n\t\t\tinteraction.signal.throwIfAborted();\n\t\t\treturn { type: \"api_key\", key };\n\t\t},\n\t\tresolve: async ({ ctx, credential, signal }) => {\n\t\t\tsignal.throwIfAborted();\n\t\t\tif (credential?.key) {\n\t\t\t\treturn { auth: { apiKey: credential.key }, env: credential.env, source: \"stored credential\" };\n\t\t\t}\n\t\t\tfor (const envVar of envVars) {\n\t\t\t\tconst value = await ctx.env(envVar);\n\t\t\t\tsignal.throwIfAborted();\n\t\t\t\tif (value) return { auth: { apiKey: value }, source: envVar };\n\t\t\t}\n\t\t\treturn undefined;\n\t\t},\n\t};\n}\n\n/**\n * Wraps a dynamically imported `OAuthAuth` so provider definitions can\n * advertise OAuth without importing the implementation. The flow loads on\n * first `login`/`refresh`/`toAuth` call; callers keep Node-only flow code out\n * of bundles by loading through a bundler-opaque dynamic import (variable\n * specifier, see the bedrock lazy wrapper).\n */\nexport function lazyOAuth(input: {\n\tname: string;\n\tisSubscription?: boolean;\n\tloginLabel?: string;\n\trejectedTokenStatuses?: readonly number[];\n\tload: () => Promise<OAuthAuth>;\n}): OAuthAuth {\n\tlet promise: Promise<OAuthAuth> | undefined;\n\tconst loaded = () => {\n\t\tpromise ??= input.load();\n\t\treturn promise;\n\t};\n\treturn {\n\t\tname: input.name,\n\t\tisSubscription: input.isSubscription,\n\t\tloginLabel: input.loginLabel,\n\t\t...(input.rejectedTokenStatuses === undefined ? {} : { rejectedTokenStatuses: input.rejectedTokenStatuses }),\n\t\tlogin: async (interaction) => (await loaded()).login(interaction),\n\t\trefresh: async (credential, signal) => (await loaded()).refresh(credential, signal),\n\t\ttoAuth: async (credential) => (await loaded()).toAuth(credential),\n\t};\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"anthropic-callback-listener.d.ts","sourceRoot":"","sources":["../../../src/auth/oauth/anthropic-callback-listener.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAMH,MAAM,MAAM,YAAY,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAE3D,MAAM,MAAM,gBAAgB,GAAG;IAC9B,wFAAwF;IACxF,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,mBAAmB,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IACvC,WAAW,EAAE,MAAM,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAAC;IAChD,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IAClC,YAAY,EAAE,cAAc,WAAW,EAAE,YAAY,CAAC;CACtD,CAAC;AAEF,eAAO,MAAM,uBAAuB,QAAQ,CAAC;AAC7C,eAAO,MAAM,aAAa,cAAc,CAAC;AAGzC,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAExD;AA+FD;;;;GAIG;AACH,wBAAsB,qBAAqB,CAC1C,IAAI,EAAE,oBAAoB,EAC1B,aAAa,EAAE,MAAM,EACrB,IAAI,EAAE,MAAM,GACV,OAAO,CAAC,gBAAgB,CAAC,CAqC3B"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"anthropic-callback-listener.js","sourceRoot":"","sources":["../../../src/auth/oauth/anthropic-callback-listener.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Loopback callback listener for the Anthropic OAuth flow.\n *\n * The OAuth client accepts any `localhost` port on the `/callback` path (the\n * Claude Code CLI itself binds a random port per login), so the listener\n * prefers the historical port 53692 and falls back to an ephemeral port when\n * another login - in this process or in another one - still holds it. With a\n * fixed port, a second login on the same machine sent its browser redirect to\n * the OTHER process's listener, which could only answer \"State mismatch\".\n *\n * NOTE: Node-only (http.createServer); reached through the lazy OAuth loader.\n */\n\nimport type { IncomingMessage, Server, ServerResponse } from \"node:http\";\nimport { formatErrorDetails } from \"./error-details.ts\";\nimport { oauthErrorHtml, oauthSuccessHtml } from \"./oauth-page.ts\";\n\nexport type CallbackCode = { code: string; state: string };\n\nexport type CallbackListener = {\n\t/** Bound loopback port; `undefined` when no port could be bound (manual-only login). */\n\tport?: number;\n\tredirectUri: string;\n\tcallbackUnavailable?: { code: string };\n\twaitForCode: () => Promise<CallbackCode | null>;\n\tcancelWait: () => void;\n\tclose: () => Promise<void>;\n};\n\nexport type CallbackListenerApis = {\n\tcreateServer: typeof import(\"node:http\").createServer;\n};\n\nexport const PREFERRED_CALLBACK_PORT = 53692;\nexport const CALLBACK_PATH = \"/callback\";\nconst BIND_FAILURE_CODES = new Set([\"EACCES\", \"EADDRINUSE\", \"EPERM\"]);\n\nexport function callbackRedirectUri(port: number): string {\n\treturn `http://localhost:${port}${CALLBACK_PATH}`;\n}\n\nfunction respondHtml(res: ServerResponse, status: number, html: string): void {\n\tres.writeHead(status, { \"Content-Type\": \"text/html; charset=utf-8\" });\n\tres.end(html);\n}\n\n/**\n * A callback whose `state` belongs to another login. Either a different\n * session's login could not bind its own port and is waiting for a pasted\n * redirect URL, or this tab belongs to an attempt that no longer exists.\n */\nfunction foreignLoginHtml(requestUrl: string): string {\n\treturn oauthErrorHtml(\n\t\t\"This browser login belongs to a different session of this app, or to an earlier login attempt.\",\n\t\t[\n\t\t\t\"If a session is still waiting for this login (it shows a prompt to paste the redirect URL), copy the full address from the browser's address bar and paste it there.\",\n\t\t\t\"Otherwise this attempt is stale: close this tab and run the login again from the session that needs it.\",\n\t\t\t\"\",\n\t\t\trequestUrl,\n\t\t].join(\"\\n\"),\n\t);\n}\n\nfunction handleCallback(\n\treq: IncomingMessage,\n\tres: ServerResponse,\n\tport: number,\n\texpectedState: string,\n\tsettle: (value: CallbackCode) => void,\n): void {\n\ttry {\n\t\tconst url = new URL(req.url ?? \"\", `http://localhost:${port}`);\n\t\tif (url.pathname !== CALLBACK_PATH) {\n\t\t\trespondHtml(res, 404, oauthErrorHtml(\"Callback route not found.\"));\n\t\t\treturn;\n\t\t}\n\t\tconst code = url.searchParams.get(\"code\");\n\t\tconst state = url.searchParams.get(\"state\");\n\t\tconst error = url.searchParams.get(\"error\");\n\t\tif (error) {\n\t\t\trespondHtml(res, 400, oauthErrorHtml(\"Anthropic authentication did not complete.\", `Error: ${error}`));\n\t\t\treturn;\n\t\t}\n\t\tif (!code || !state) {\n\t\t\trespondHtml(res, 400, oauthErrorHtml(\"Missing code or state parameter.\"));\n\t\t\treturn;\n\t\t}\n\t\tif (state !== expectedState) {\n\t\t\trespondHtml(res, 400, foreignLoginHtml(url.toString()));\n\t\t\treturn;\n\t\t}\n\t\trespondHtml(res, 200, oauthSuccessHtml(\"Anthropic authentication completed. You can close this window.\"));\n\t\tsettle({ code, state });\n\t} catch {\n\t\tres.writeHead(500, { \"Content-Type\": \"text/plain; charset=utf-8\" });\n\t\tres.end(\"Internal error\");\n\t}\n}\n\nfunction errorCode(error: unknown): string | undefined {\n\tconst code = (error as { code?: unknown } | null)?.code;\n\treturn typeof code === \"string\" ? code : undefined;\n}\n\nfunction boundPort(server: Server): number | undefined {\n\tconst address = server.address();\n\treturn typeof address === \"object\" && address !== null ? address.port : undefined;\n}\n\nfunction closeServer(server: Server): Promise<void> {\n\treturn new Promise((resolve) => {\n\t\tserver.close(() => resolve());\n\t\t// Keep-alive connections from the browser would otherwise delay the close\n\t\t// callback until they idle out.\n\t\tserver.closeAllConnections?.();\n\t});\n}\n\nfunction bind(\n\tapis: CallbackListenerApis,\n\tport: number,\n\thost: string,\n\texpectedState: string,\n\tsettle: (value: CallbackCode) => void,\n): Promise<Server> {\n\treturn new Promise((resolve, reject) => {\n\t\tconst server = apis.createServer((req, res) => {\n\t\t\thandleCallback(req, res, boundPort(server) ?? port, expectedState, settle);\n\t\t});\n\t\tserver.on(\"error\", reject);\n\t\tserver.listen(port, host, () => resolve(server));\n\t});\n}\n\n/**\n * Binds the preferred port, then an ephemeral one; when neither can be bound\n * the login continues in manual mode with the registered preferred-port\n * redirect URI, so a pasted redirect URL still exchanges.\n */\nexport async function startCallbackListener(\n\tapis: CallbackListenerApis,\n\texpectedState: string,\n\thost: string,\n): Promise<CallbackListener> {\n\tlet settled = false;\n\tlet settle!: (value: CallbackCode | null) => void;\n\tconst waitForCodePromise = new Promise<CallbackCode | null>((resolve) => {\n\t\tsettle = (value) => {\n\t\t\tif (settled) return;\n\t\t\tsettled = true;\n\t\t\tresolve(value);\n\t\t};\n\t});\n\tlet lastBindFailure: string | undefined;\n\tfor (const port of [PREFERRED_CALLBACK_PORT, 0]) {\n\t\ttry {\n\t\t\tconst server = await bind(apis, port, host, expectedState, settle);\n\t\t\tconst actualPort = boundPort(server) ?? port;\n\t\t\treturn {\n\t\t\t\tport: actualPort,\n\t\t\t\tredirectUri: callbackRedirectUri(actualPort),\n\t\t\t\twaitForCode: () => waitForCodePromise,\n\t\t\t\tcancelWait: () => settle(null),\n\t\t\t\tclose: () => closeServer(server),\n\t\t\t};\n\t\t} catch (error) {\n\t\t\tconst code = errorCode(error);\n\t\t\tif (code === undefined || !BIND_FAILURE_CODES.has(code)) {\n\t\t\t\tthrow new Error(`Could not open OAuth callback listener at ${host}:${port}: ${formatErrorDetails(error)}`);\n\t\t\t}\n\t\t\tlastBindFailure = code;\n\t\t}\n\t}\n\treturn {\n\t\tredirectUri: callbackRedirectUri(PREFERRED_CALLBACK_PORT),\n\t\tcallbackUnavailable: { code: lastBindFailure ?? \"EADDRINUSE\" },\n\t\twaitForCode: async () => null,\n\t\tcancelWait: () => {},\n\t\tclose: async () => {},\n\t};\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"anthropic.d.ts","sourceRoot":"","sources":["../../../src/auth/oauth/anthropic.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,SAAS,EAA4C,MAAM,aAAa,CAAC;AACvF,OAAO,EACN,KAAK,oBAAoB,EAGzB,MAAM,kCAAkC,CAAC;AAK1C,wBAAgB,mCAAmC,CAAC,IAAI,EAAE,QAAQ,GAAG,IAAI,GAAG,IAAI,CAG/E;AAED,KAAK,QAAQ,GAAG,oBAAoB,CAAC;AA+OrC,eAAO,MAAM,cAAc,EAAE,SAS5B,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"anthropic.js","sourceRoot":"","sources":["../../../src/auth/oauth/anthropic.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Anthropic OAuth flow (Claude Pro/Max)\n *\n * NOTE: This module uses Node.js http.createServer for the OAuth callback server.\n * It is only intended for CLI use, not browser environments.\n */\n\nimport { getProviderEnvValue } from \"../../utils/provider-env.ts\";\nimport type { OAuthAuth, OAuthCredential, ProviderAuthInteraction } from \"../types.ts\";\nimport {\n\ttype CallbackListenerApis,\n\tPREFERRED_CALLBACK_PORT,\n\tstartCallbackListener,\n} from \"./anthropic-callback-listener.ts\";\nimport { parseAuthorizationInput } from \"./authorization-input.ts\";\nimport { formatErrorDetails } from \"./error-details.ts\";\nimport { generatePKCE } from \"./pkce.ts\";\n\nexport function __setAnthropicOAuthNodeApisForTests(apis: NodeApis | null): void {\n\tnodeApis = apis;\n\tnodeApisPromise = null;\n}\n\ntype NodeApis = CallbackListenerApis;\n\nlet nodeApis: NodeApis | null = null;\nlet nodeApisPromise: Promise<NodeApis> | null = null;\n\nconst decode = (s: string) => atob(s);\nconst CLIENT_ID = decode(\"OWQxYzI1MGEtZTYxYi00NGQ5LTg4ZWQtNTk0NGQxOTYyZjVl\");\nconst AUTHORIZE_URL = \"https://claude.ai/oauth/authorize\";\nconst TOKEN_URL = \"https://platform.claude.com/v1/oauth/token\";\nconst CALLBACK_HOST = getProviderEnvValue(\"PI_OAUTH_CALLBACK_HOST\") || \"127.0.0.1\";\n/**\n * A login nobody finishes must not keep its listener (and its manual prompt)\n * alive forever: the stale listener would answer a later login's browser\n * redirect on this machine with \"State mismatch\".\n */\nconst LOGIN_IDLE_TIMEOUT_MS = 10 * 60 * 1000;\nconst SCOPES =\n\t\"org:create_api_key user:profile user:inference user:sessions:claude_code user:mcp_servers user:file_upload\";\nasync function getNodeApis(): Promise<NodeApis> {\n\tif (nodeApis) return nodeApis;\n\tif (!nodeApisPromise) {\n\t\tif (typeof process === \"undefined\" || (!process.versions?.node && !process.versions?.bun)) {\n\t\t\tthrow new Error(\"Anthropic OAuth is only available in Node.js environments\");\n\t\t}\n\t\tnodeApisPromise = import(\"node:http\").then((httpModule) => ({\n\t\t\tcreateServer: httpModule.createServer,\n\t\t}));\n\t}\n\tnodeApis = await nodeApisPromise;\n\treturn nodeApis;\n}\n\nasync function postJson(url: string, body: Record<string, string | number>, signal: AbortSignal): Promise<string> {\n\tconst response = await fetch(url, {\n\t\tmethod: \"POST\",\n\t\theaders: {\n\t\t\t\"Content-Type\": \"application/json\",\n\t\t\tAccept: \"application/json\",\n\t\t},\n\t\tbody: JSON.stringify(body),\n\t\tsignal: AbortSignal.any([signal, AbortSignal.timeout(30_000)]),\n\t});\n\n\tconst responseBody = await response.text();\n\n\tif (!response.ok) {\n\t\tthrow new Error(`HTTP request failed. status=${response.status}; url=${url}; body=${responseBody}`);\n\t}\n\n\treturn responseBody;\n}\n\nasync function exchangeAuthorizationCode(\n\tcode: string,\n\tstate: string,\n\tverifier: string,\n\tredirectUri: string,\n\tsignal: AbortSignal,\n): Promise<OAuthCredential> {\n\tlet responseBody: string;\n\ttry {\n\t\tresponseBody = await postJson(\n\t\t\tTOKEN_URL,\n\t\t\t{\n\t\t\t\tgrant_type: \"authorization_code\",\n\t\t\t\tclient_id: CLIENT_ID,\n\t\t\t\tcode,\n\t\t\t\tstate,\n\t\t\t\tredirect_uri: redirectUri,\n\t\t\t\tcode_verifier: verifier,\n\t\t\t},\n\t\t\tsignal,\n\t\t);\n\t} catch (error) {\n\t\tthrow new Error(\n\t\t\t`Token exchange request failed. url=${TOKEN_URL}; redirect_uri=${redirectUri}; response_type=authorization_code; details=${formatErrorDetails(error)}`,\n\t\t);\n\t}\n\n\tlet tokenData: { access_token: string; refresh_token: string; expires_in: number };\n\ttry {\n\t\ttokenData = JSON.parse(responseBody) as { access_token: string; refresh_token: string; expires_in: number };\n\t} catch (error) {\n\t\tthrow new Error(\n\t\t\t`Token exchange returned invalid JSON. url=${TOKEN_URL}; body=${responseBody}; details=${formatErrorDetails(error)}`,\n\t\t);\n\t}\n\n\treturn {\n\t\ttype: \"oauth\",\n\t\trefresh: tokenData.refresh_token,\n\t\taccess: tokenData.access_token,\n\t\texpires: Date.now() + tokenData.expires_in * 1000 - 5 * 60 * 1000,\n\t};\n}\n\nasync function loginAnthropic(interaction: ProviderAuthInteraction): Promise<OAuthCredential> {\n\tconst { verifier, challenge } = await generatePKCE();\n\tconst listener = await startCallbackListener(await getNodeApis(), verifier, CALLBACK_HOST);\n\tconst manualAbort = new AbortController();\n\tlet timedOut = false;\n\t// Cancelling the login must release BOTH waits: the callback listener and the\n\t// manual prompt. In manual-only mode (no callback port could be bound) the\n\t// prompt is the only thing keeping the login alive, so leaving it open would\n\t// hang cleanup.\n\tconst releaseWaits = () => {\n\t\tlistener.cancelWait();\n\t\tmanualAbort.abort();\n\t};\n\tinteraction.signal.addEventListener(\"abort\", releaseWaits, { once: true });\n\tif (interaction.signal.aborted) releaseWaits();\n\tconst idleTimer = setTimeout(() => {\n\t\ttimedOut = true;\n\t\treleaseWaits();\n\t}, LOGIN_IDLE_TIMEOUT_MS);\n\tidleTimer.unref?.();\n\tlet code: string | undefined;\n\tlet state: string | undefined;\n\tlet manualInput: string | undefined;\n\tlet manualError: Error | undefined;\n\n\ttry {\n\t\tconst authParams = new URLSearchParams({\n\t\t\tcode: \"true\",\n\t\t\tclient_id: CLIENT_ID,\n\t\t\tresponse_type: \"code\",\n\t\t\tredirect_uri: listener.redirectUri,\n\t\t\tscope: SCOPES,\n\t\t\tcode_challenge: challenge,\n\t\t\tcode_challenge_method: \"S256\",\n\t\t\tstate: verifier,\n\t\t});\n\t\tinteraction.notify({\n\t\t\ttype: \"auth_url\",\n\t\t\turl: `${AUTHORIZE_URL}?${authParams.toString()}`,\n\t\t\tinstructions: listener.callbackUnavailable\n\t\t\t\t? `No local OAuth callback port could be opened (port ${PREFERRED_CALLBACK_PORT} and an ephemeral port both failed: ${listener.callbackUnavailable.code}). Complete login in your browser, then copy the final redirect URL from the address bar and paste it here.`\n\t\t\t\t: \"Complete login in your browser. If the browser is on another machine, paste the final redirect URL here.\",\n\t\t});\n\n\t\tconst manualPromise = interaction\n\t\t\t.prompt({\n\t\t\t\ttype: \"manual_code\",\n\t\t\t\tmessage: \"Complete login in your browser, or paste the authorization code / redirect URL here:\",\n\t\t\t\tplaceholder: listener.redirectUri,\n\t\t\t\tsignal: manualAbort.signal,\n\t\t\t})\n\t\t\t.then((input) => {\n\t\t\t\tmanualInput = input;\n\t\t\t\tlistener.cancelWait();\n\t\t\t})\n\t\t\t.catch((error) => {\n\t\t\t\tmanualError = error instanceof Error ? error : new Error(String(error));\n\t\t\t\tlistener.cancelWait();\n\t\t\t});\n\n\t\tconst result = await listener.waitForCode();\n\t\tif (timedOut) throw new Error(loginTimedOutMessage());\n\t\tif (manualError) throw manualError;\n\t\tif (result?.code) {\n\t\t\tcode = result.code;\n\t\t\tstate = result.state;\n\t\t} else if (manualInput) {\n\t\t\tconst parsed = parseAuthorizationInput(manualInput);\n\t\t\tif (parsed.state && parsed.state !== verifier) throw new Error(\"OAuth state mismatch\");\n\t\t\tcode = parsed.code;\n\t\t\tstate = parsed.state ?? verifier;\n\t\t}\n\n\t\tif (!code) {\n\t\t\tawait manualPromise;\n\t\t\tif (timedOut) throw new Error(loginTimedOutMessage());\n\t\t\tif (manualError) throw manualError;\n\t\t\tif (manualInput) {\n\t\t\t\tconst parsed = parseAuthorizationInput(manualInput);\n\t\t\t\tif (parsed.state && parsed.state !== verifier) throw new Error(\"OAuth state mismatch\");\n\t\t\t\tcode = parsed.code;\n\t\t\t\tstate = parsed.state ?? verifier;\n\t\t\t}\n\t\t}\n\n\t\tif (!code) throw new Error(\"Missing authorization code\");\n\t\tif (!state) throw new Error(\"Missing OAuth state\");\n\t\tinteraction.notify({ type: \"progress\", message: \"Exchanging authorization code for tokens...\" });\n\t\treturn await exchangeAuthorizationCode(code, state, verifier, listener.redirectUri, interaction.signal);\n\t} finally {\n\t\tclearTimeout(idleTimer);\n\t\tinteraction.signal.removeEventListener(\"abort\", releaseWaits);\n\t\tmanualAbort.abort();\n\t\tawait listener.close();\n\t}\n}\n\nfunction loginTimedOutMessage(): string {\n\tconst minutes = Math.round(LOGIN_IDLE_TIMEOUT_MS / 60_000);\n\treturn `Anthropic login timed out after ${minutes} minutes without a browser callback or a pasted redirect URL. Run the login again.`;\n}\n\n/**\n * Refresh Anthropic OAuth token\n */\nasync function refreshAnthropicToken(refreshToken: string, signal: AbortSignal): Promise<OAuthCredential> {\n\tlet responseBody: string;\n\ttry {\n\t\tresponseBody = await postJson(\n\t\t\tTOKEN_URL,\n\t\t\t{\n\t\t\t\tgrant_type: \"refresh_token\",\n\t\t\t\tclient_id: CLIENT_ID,\n\t\t\t\trefresh_token: refreshToken,\n\t\t\t},\n\t\t\tsignal,\n\t\t);\n\t} catch (error) {\n\t\tthrow new Error(`Anthropic token refresh request failed. url=${TOKEN_URL}; details=${formatErrorDetails(error)}`);\n\t}\n\n\tlet data: { access_token: string; refresh_token: string; expires_in: number; scope?: string };\n\ttry {\n\t\tdata = JSON.parse(responseBody) as {\n\t\t\taccess_token: string;\n\t\t\trefresh_token: string;\n\t\t\texpires_in: number;\n\t\t\tscope?: string;\n\t\t};\n\t} catch (error) {\n\t\tthrow new Error(\n\t\t\t`Anthropic token refresh returned invalid JSON. url=${TOKEN_URL}; body=${responseBody}; details=${formatErrorDetails(error)}`,\n\t\t);\n\t}\n\n\treturn {\n\t\ttype: \"oauth\",\n\t\trefresh: data.refresh_token,\n\t\taccess: data.access_token,\n\t\texpires: Date.now() + data.expires_in * 1000 - 5 * 60 * 1000,\n\t};\n}\n\nexport const anthropicOAuth: OAuthAuth = {\n\tname: \"Anthropic (Claude Pro/Max)\",\n\tisSubscription: true,\n\tlogin: loginAnthropic,\n\trefresh: (credential, signal) => refreshAnthropicToken(credential.refresh, signal),\n\n\tasync toAuth(credential) {\n\t\treturn { apiKey: credential.access };\n\t},\n};\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"authorization-input.d.ts","sourceRoot":"","sources":["../../../src/auth/oauth/authorization-input.ts"],"names":[],"mappings":"AAAA,mFAAmF;AACnF,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM,GAAG;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CA4BxF"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"authorization-input.js","sourceRoot":"","sources":["../../../src/auth/oauth/authorization-input.ts"],"names":[],"mappings":"AAAA,mFAAmF;AACnF,MAAM,UAAU,uBAAuB,CAAC,KAAa;IACpD,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC3B,IAAI,CAAC,KAAK;QAAE,OAAO,EAAE,CAAC;IAEtB,IAAI,CAAC;QACJ,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC;QAC3B,OAAO;YACN,IAAI,EAAE,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,SAAS;YAC/C,KAAK,EAAE,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,SAAS;SACjD,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACR,YAAY;IACb,CAAC;IAED,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QACzB,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QAC1C,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;IACxB,CAAC;IAED,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QAC7B,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,KAAK,CAAC,CAAC;QAC1C,OAAO;YACN,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,SAAS;YACrC,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,SAAS;SACvC,CAAC;IACH,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;AACxB,CAAC","sourcesContent":["/** Parses a pasted redirect URL, `code#state` pair, query string, or bare code. */\nexport function parseAuthorizationInput(input: string): { code?: string; state?: string } {\n\tconst value = input.trim();\n\tif (!value) return {};\n\n\ttry {\n\t\tconst url = new URL(value);\n\t\treturn {\n\t\t\tcode: url.searchParams.get(\"code\") ?? undefined,\n\t\t\tstate: url.searchParams.get(\"state\") ?? undefined,\n\t\t};\n\t} catch {\n\t\t// not a URL\n\t}\n\n\tif (value.includes(\"#\")) {\n\t\tconst [code, state] = value.split(\"#\", 2);\n\t\treturn { code, state };\n\t}\n\n\tif (value.includes(\"code=\")) {\n\t\tconst params = new URLSearchParams(value);\n\t\treturn {\n\t\t\tcode: params.get(\"code\") ?? undefined,\n\t\t\tstate: params.get(\"state\") ?? undefined,\n\t\t};\n\t}\n\n\treturn { code: value };\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"chatgpt-subscription.d.ts","sourceRoot":"","sources":["../../../src/auth/oauth/chatgpt-subscription.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAiBH,OAAO,KAAK,EAAE,SAAS,EAA4C,MAAM,aAAa,CAAC;AA8dvF,eAAO,MAAM,wBAAwB,EAAE,SA6BtC,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"chatgpt-subscription.js","sourceRoot":"","sources":["../../../src/auth/oauth/chatgpt-subscription.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * ChatGPT Subscription OAuth flow\n *\n * NOTE: This module uses Node.js crypto and http for the OAuth callback.\n * It is only intended for CLI use, not browser environments.\n */\n\n// NEVER convert to top-level imports - breaks browser/Vite builds\nlet _randomBytes: typeof import(\"node:crypto\").randomBytes | null = null;\nlet _http: typeof import(\"node:http\") | null = null;\nif (typeof process !== \"undefined\" && (process.versions?.node || process.versions?.bun)) {\n\timport(\"node:crypto\").then((m) => {\n\t\t_randomBytes = m.randomBytes;\n\t});\n\timport(\"node:http\").then((m) => {\n\t\t_http = m;\n\t});\n}\n\nimport { extractChatGptSubscriptionAccountId } from \"../../utils/chatgpt-subscription-auth.ts\";\nimport { getProviderEnvValue } from \"../../utils/provider-env.ts\";\nimport { getWireIdentity } from \"../../wire-identity.ts\";\nimport type { OAuthAuth, OAuthCredential, ProviderAuthInteraction } from \"../types.ts\";\nimport { pollOAuthDeviceCodeFlow } from \"./device-code.ts\";\nimport { oauthErrorHtml, oauthSuccessHtml } from \"./oauth-page.ts\";\nimport { generatePKCE } from \"./pkce.ts\";\n\nconst CLIENT_ID = \"app_EMoamEEZ73f0CkXaXp7hrann\";\nconst AUTH_BASE_URL = \"https://auth.openai.com\";\nconst AUTHORIZE_URL = `${AUTH_BASE_URL}/oauth/authorize`;\nconst TOKEN_URL = `${AUTH_BASE_URL}/oauth/token`;\nconst REDIRECT_URI = \"http://localhost:1455/auth/callback\";\nconst DEVICE_USER_CODE_URL = `${AUTH_BASE_URL}/api/accounts/deviceauth/usercode`;\nconst DEVICE_TOKEN_URL = `${AUTH_BASE_URL}/api/accounts/deviceauth/token`;\nconst DEVICE_VERIFICATION_URI = `${AUTH_BASE_URL}/codex/device`;\nconst DEVICE_REDIRECT_URI = `${AUTH_BASE_URL}/deviceauth/callback`;\nconst DEVICE_CODE_TIMEOUT_SECONDS = 15 * 60;\nconst CHATGPT_SUBSCRIPTION_BROWSER_LOGIN_METHOD = \"browser\";\nconst CHATGPT_SUBSCRIPTION_DEVICE_CODE_LOGIN_METHOD = \"device_code\";\nconst SCOPE = \"openid profile email offline_access\";\n\ntype OAuthToken = { access: string; refresh: string; expires: number };\ntype TokenOperation = \"exchange\" | \"refresh\";\n\nfunction getCallbackHost(): string {\n\treturn getProviderEnvValue(\"PI_OAUTH_CALLBACK_HOST\") || \"127.0.0.1\";\n}\n\ntype DeviceAuthInfo = {\n\tdeviceAuthId: string;\n\tuserCode: string;\n\tintervalSeconds: number;\n};\n\ntype DeviceTokenSuccess = {\n\tauthorizationCode: string;\n\tcodeVerifier: string;\n};\n\nfunction createState(): string {\n\tif (!_randomBytes) {\n\t\tthrow new Error(\"ChatGPT Subscription OAuth is only available in Node.js environments\");\n\t}\n\treturn _randomBytes(16).toString(\"hex\");\n}\n\nfunction parseAuthorizationInput(input: string): { code?: string; state?: string } {\n\tconst value = input.trim();\n\tif (!value) return {};\n\n\ttry {\n\t\tconst url = new URL(value);\n\t\treturn {\n\t\t\tcode: url.searchParams.get(\"code\") ?? undefined,\n\t\t\tstate: url.searchParams.get(\"state\") ?? undefined,\n\t\t};\n\t} catch {\n\t\t// not a URL\n\t}\n\n\tif (value.includes(\"#\")) {\n\t\tconst [code, state] = value.split(\"#\", 2);\n\t\treturn { code, state };\n\t}\n\n\tif (value.includes(\"code=\")) {\n\t\tconst params = new URLSearchParams(value);\n\t\treturn {\n\t\t\tcode: params.get(\"code\") ?? undefined,\n\t\t\tstate: params.get(\"state\") ?? undefined,\n\t\t};\n\t}\n\n\treturn { code: value };\n}\n\nasync function fetchWithLoginCancellation(input: string, init: RequestInit): Promise<Response> {\n\ttry {\n\t\treturn await fetch(input, init);\n\t} catch (error) {\n\t\tif (init.signal?.aborted) {\n\t\t\tthrow new Error(\"Login cancelled\");\n\t\t}\n\t\tthrow error;\n\t}\n}\n\nasync function readTokenResponse(response: Response, operation: TokenOperation): Promise<OAuthToken> {\n\tif (!response.ok) {\n\t\tconst text = await response.text().catch(() => \"\");\n\t\tthrow new Error(\n\t\t\t`ChatGPT Subscription token ${operation} failed (${response.status}): ${text || response.statusText}`,\n\t\t);\n\t}\n\n\tconst rawJson = await response.json();\n\tconst json = rawJson as {\n\t\taccess_token?: string;\n\t\trefresh_token?: string;\n\t\texpires_in?: number;\n\t} | null;\n\tif (!json?.access_token || !json.refresh_token || typeof json.expires_in !== \"number\") {\n\t\tthrow new Error(`ChatGPT Subscription token ${operation} response missing fields: ${JSON.stringify(json)}`);\n\t}\n\n\treturn {\n\t\taccess: json.access_token,\n\t\trefresh: json.refresh_token,\n\t\texpires: Date.now() + json.expires_in * 1000,\n\t};\n}\n\nasync function exchangeAuthorizationCode(\n\tcode: string,\n\tverifier: string,\n\tredirectUri: string,\n\tsignal: AbortSignal,\n): Promise<OAuthToken> {\n\tconst response = await fetchWithLoginCancellation(TOKEN_URL, {\n\t\tmethod: \"POST\",\n\t\theaders: { \"Content-Type\": \"application/x-www-form-urlencoded\" },\n\t\tbody: new URLSearchParams({\n\t\t\tgrant_type: \"authorization_code\",\n\t\t\tclient_id: CLIENT_ID,\n\t\t\tcode,\n\t\t\tcode_verifier: verifier,\n\t\t\tredirect_uri: redirectUri,\n\t\t}),\n\t\tsignal,\n\t});\n\n\treturn readTokenResponse(response, \"exchange\");\n}\n\nasync function refreshAccessToken(refreshToken: string, signal: AbortSignal): Promise<OAuthToken> {\n\tlet response: Response;\n\ttry {\n\t\tresponse = await fetch(TOKEN_URL, {\n\t\t\tmethod: \"POST\",\n\t\t\theaders: { \"Content-Type\": \"application/x-www-form-urlencoded\" },\n\t\t\tbody: new URLSearchParams({\n\t\t\t\tgrant_type: \"refresh_token\",\n\t\t\t\trefresh_token: refreshToken,\n\t\t\t\tclient_id: CLIENT_ID,\n\t\t\t}),\n\t\t\tsignal,\n\t\t});\n\t} catch (error) {\n\t\tthrow new Error(\n\t\t\t`ChatGPT Subscription token refresh error: ${error instanceof Error ? error.message : String(error)}`,\n\t\t);\n\t}\n\n\treturn readTokenResponse(response, \"refresh\");\n}\n\nasync function startChatGptSubscriptionDeviceAuth(signal: AbortSignal): Promise<DeviceAuthInfo> {\n\tconst response = await fetchWithLoginCancellation(DEVICE_USER_CODE_URL, {\n\t\tmethod: \"POST\",\n\t\theaders: { \"Content-Type\": \"application/json\" },\n\t\tbody: JSON.stringify({ client_id: CLIENT_ID }),\n\t\tsignal,\n\t});\n\n\tif (!response.ok) {\n\t\tif (response.status === 404) {\n\t\t\tthrow new Error(\n\t\t\t\t\"ChatGPT Subscription device code login is not enabled for this server. Use browser login or verify the server URL.\",\n\t\t\t);\n\t\t}\n\t\tconst responseBody = await response.text().catch(() => \"\");\n\t\tthrow new Error(\n\t\t\t`ChatGPT Subscription device code request failed with status ${response.status}${responseBody ? `: ${responseBody}` : \"\"}`,\n\t\t);\n\t}\n\n\tconst rawJson = await response.json();\n\tconst json = rawJson as {\n\t\tdevice_auth_id?: string;\n\t\tuser_code?: string;\n\t\tinterval?: number | string;\n\t} | null;\n\tconst intervalSeconds = typeof json?.interval === \"string\" ? Number(json.interval.trim()) : json?.interval;\n\tif (\n\t\t!json?.device_auth_id ||\n\t\t!json.user_code ||\n\t\ttypeof intervalSeconds !== \"number\" ||\n\t\t!Number.isFinite(intervalSeconds) ||\n\t\tintervalSeconds < 0\n\t) {\n\t\tthrow new Error(`Invalid ChatGPT Subscription device code response: ${JSON.stringify(json)}`);\n\t}\n\n\treturn {\n\t\tdeviceAuthId: json.device_auth_id,\n\t\tuserCode: json.user_code,\n\t\tintervalSeconds,\n\t};\n}\n\nasync function pollChatGptSubscriptionDeviceAuth(\n\tdevice: DeviceAuthInfo,\n\tsignal: AbortSignal,\n): Promise<DeviceTokenSuccess> {\n\treturn pollOAuthDeviceCodeFlow<DeviceTokenSuccess>({\n\t\tintervalSeconds: device.intervalSeconds,\n\t\texpiresInSeconds: DEVICE_CODE_TIMEOUT_SECONDS,\n\t\tsignal,\n\t\tpoll: async () => {\n\t\t\tconst response = await fetchWithLoginCancellation(DEVICE_TOKEN_URL, {\n\t\t\t\tmethod: \"POST\",\n\t\t\t\theaders: { \"Content-Type\": \"application/json\" },\n\t\t\t\tbody: JSON.stringify({\n\t\t\t\t\tdevice_auth_id: device.deviceAuthId,\n\t\t\t\t\tuser_code: device.userCode,\n\t\t\t\t}),\n\t\t\t\tsignal,\n\t\t\t});\n\n\t\t\tif (response.ok) {\n\t\t\t\tconst rawJson = await response.json();\n\t\t\t\tconst json = rawJson as { authorization_code?: string; code_verifier?: string } | null;\n\t\t\t\tif (!json?.authorization_code || !json.code_verifier) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tstatus: \"failed\",\n\t\t\t\t\t\tmessage: `Invalid ChatGPT Subscription device auth token response: ${JSON.stringify(json)}`,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\treturn {\n\t\t\t\t\tstatus: \"complete\",\n\t\t\t\t\tvalue: { authorizationCode: json.authorization_code, codeVerifier: json.code_verifier },\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tif (response.status === 403 || response.status === 404) {\n\t\t\t\treturn { status: \"pending\" };\n\t\t\t}\n\n\t\t\tconst responseBody = await response.text().catch(() => \"\");\n\t\t\tlet errorCode: unknown;\n\t\t\ttry {\n\t\t\t\tconst json = JSON.parse(responseBody) as { error?: string | { code?: string } } | null;\n\t\t\t\tconst error = json?.error;\n\t\t\t\terrorCode = typeof error === \"object\" ? error?.code : error;\n\t\t\t} catch {}\n\n\t\t\tif (errorCode === \"deviceauth_authorization_pending\") {\n\t\t\t\treturn { status: \"pending\" };\n\t\t\t}\n\t\t\tif (errorCode === \"slow_down\") {\n\t\t\t\treturn { status: \"slow_down\" };\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tstatus: \"failed\",\n\t\t\t\tmessage: `ChatGPT Subscription device auth failed with status ${response.status}${responseBody ? `: ${responseBody}` : \"\"}`,\n\t\t\t};\n\t\t},\n\t});\n}\n\nasync function createAuthorizationFlow(\n\toriginator: string = getWireIdentity(),\n): Promise<{ verifier: string; state: string; url: string }> {\n\tconst { verifier, challenge } = await generatePKCE();\n\tconst state = createState();\n\n\tconst url = new URL(AUTHORIZE_URL);\n\turl.searchParams.set(\"response_type\", \"code\");\n\turl.searchParams.set(\"client_id\", CLIENT_ID);\n\turl.searchParams.set(\"redirect_uri\", REDIRECT_URI);\n\turl.searchParams.set(\"scope\", SCOPE);\n\turl.searchParams.set(\"code_challenge\", challenge);\n\turl.searchParams.set(\"code_challenge_method\", \"S256\");\n\turl.searchParams.set(\"state\", state);\n\turl.searchParams.set(\"id_token_add_organizations\", \"true\");\n\turl.searchParams.set(\"codex_cli_simplified_flow\", \"true\");\n\turl.searchParams.set(\"originator\", originator);\n\n\treturn { verifier, state, url: url.toString() };\n}\n\ntype OAuthServerInfo = {\n\tclose: () => void;\n\tcancelWait: () => void;\n\twaitForCode: () => Promise<{ code: string } | null>;\n};\n\nfunction startLocalOAuthServer(state: string): Promise<OAuthServerInfo> {\n\tif (!_http) {\n\t\tthrow new Error(\"ChatGPT Subscription OAuth is only available in Node.js environments\");\n\t}\n\n\tlet settleWait: ((value: { code: string } | null) => void) | undefined;\n\tconst waitForCodePromise = new Promise<{ code: string } | null>((resolve) => {\n\t\tlet settled = false;\n\t\tsettleWait = (value) => {\n\t\t\tif (settled) return;\n\t\t\tsettled = true;\n\t\t\tresolve(value);\n\t\t};\n\t});\n\n\tconst server = _http.createServer((req, res) => {\n\t\ttry {\n\t\t\tconst url = new URL(req.url || \"\", \"http://localhost\");\n\t\t\tif (url.pathname !== \"/auth/callback\") {\n\t\t\t\tres.statusCode = 404;\n\t\t\t\tres.setHeader(\"Content-Type\", \"text/html; charset=utf-8\");\n\t\t\t\tres.end(oauthErrorHtml(\"Callback route not found.\"));\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (url.searchParams.get(\"state\") !== state) {\n\t\t\t\tres.statusCode = 400;\n\t\t\t\tres.setHeader(\"Content-Type\", \"text/html; charset=utf-8\");\n\t\t\t\tres.end(oauthErrorHtml(\"State mismatch.\"));\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst code = url.searchParams.get(\"code\");\n\t\t\tif (!code) {\n\t\t\t\tres.statusCode = 400;\n\t\t\t\tres.setHeader(\"Content-Type\", \"text/html; charset=utf-8\");\n\t\t\t\tres.end(oauthErrorHtml(\"Missing authorization code.\"));\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tres.statusCode = 200;\n\t\t\tres.setHeader(\"Content-Type\", \"text/html; charset=utf-8\");\n\t\t\tres.end(oauthSuccessHtml(\"OpenAI authentication completed. You can close this window.\"));\n\t\t\tsettleWait?.({ code });\n\t\t} catch {\n\t\t\tres.statusCode = 500;\n\t\t\tres.setHeader(\"Content-Type\", \"text/html; charset=utf-8\");\n\t\t\tres.end(oauthErrorHtml(\"Internal error while processing OAuth callback.\"));\n\t\t}\n\t});\n\n\treturn new Promise((resolve) => {\n\t\tserver\n\t\t\t.listen(1455, getCallbackHost(), () => {\n\t\t\t\tresolve({\n\t\t\t\t\tclose: () => server.close(),\n\t\t\t\t\tcancelWait: () => {\n\t\t\t\t\t\tsettleWait?.(null);\n\t\t\t\t\t},\n\t\t\t\t\twaitForCode: () => waitForCodePromise,\n\t\t\t\t});\n\t\t\t})\n\t\t\t.on(\"error\", (_err: NodeJS.ErrnoException) => {\n\t\t\t\tsettleWait?.(null);\n\t\t\t\tresolve({\n\t\t\t\t\tclose: () => {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tserver.close();\n\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\t// ignore\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\tcancelWait: () => {},\n\t\t\t\t\twaitForCode: async () => null,\n\t\t\t\t});\n\t\t\t});\n\t});\n}\n\nfunction getAccountId(accessToken: string): string | null {\n\treturn extractChatGptSubscriptionAccountId(accessToken) ?? null;\n}\n\nfunction credentialsFromToken(token: OAuthToken): OAuthCredential {\n\tconst accountId = getAccountId(token.access);\n\tif (!accountId) {\n\t\tthrow new Error(\"Failed to extract accountId from token\");\n\t}\n\n\treturn {\n\t\ttype: \"oauth\",\n\t\taccess: token.access,\n\t\trefresh: token.refresh,\n\t\texpires: token.expires,\n\t\taccountId,\n\t};\n}\n\nasync function exchangeAuthorizationCodeForCredentials(\n\tcode: string,\n\tverifier: string,\n\tredirectUri: string,\n\tsignal: AbortSignal,\n): Promise<OAuthCredential> {\n\treturn credentialsFromToken(await exchangeAuthorizationCode(code, verifier, redirectUri, signal));\n}\n\nasync function loginChatGptSubscriptionDeviceCode(interaction: ProviderAuthInteraction): Promise<OAuthCredential> {\n\tconst device = await startChatGptSubscriptionDeviceAuth(interaction.signal);\n\tinteraction.notify({\n\t\ttype: \"device_code\",\n\t\tuserCode: device.userCode,\n\t\tverificationUri: DEVICE_VERIFICATION_URI,\n\t\tintervalSeconds: device.intervalSeconds,\n\t\texpiresInSeconds: DEVICE_CODE_TIMEOUT_SECONDS,\n\t});\n\tconst code = await pollChatGptSubscriptionDeviceAuth(device, interaction.signal);\n\treturn exchangeAuthorizationCodeForCredentials(\n\t\tcode.authorizationCode,\n\t\tcode.codeVerifier,\n\t\tDEVICE_REDIRECT_URI,\n\t\tinteraction.signal,\n\t);\n}\n\nasync function loginChatGptSubscription(interaction: ProviderAuthInteraction): Promise<OAuthCredential> {\n\tconst { verifier, state, url } = await createAuthorizationFlow();\n\tconst server = await startLocalOAuthServer(state);\n\tconst manualAbort = new AbortController();\n\tconst onAbort = () => server.cancelWait();\n\tinteraction.signal.addEventListener(\"abort\", onAbort, { once: true });\n\tif (interaction.signal.aborted) onAbort();\n\tlet code: string | undefined;\n\tlet manualCode: string | undefined;\n\tlet manualError: Error | undefined;\n\n\tinteraction.notify({\n\t\ttype: \"auth_url\",\n\t\turl,\n\t\tinstructions: \"A browser window should open. Complete login to finish.\",\n\t});\n\n\ttry {\n\t\tconst manualPromise = interaction\n\t\t\t.prompt({\n\t\t\t\ttype: \"manual_code\",\n\t\t\t\tmessage: \"Complete login in your browser, or paste the authorization code / redirect URL here:\",\n\t\t\t\tplaceholder: REDIRECT_URI,\n\t\t\t\tsignal: manualAbort.signal,\n\t\t\t})\n\t\t\t.then((input) => {\n\t\t\t\tmanualCode = input;\n\t\t\t\tserver.cancelWait();\n\t\t\t})\n\t\t\t.catch((error) => {\n\t\t\t\tmanualError = error instanceof Error ? error : new Error(String(error));\n\t\t\t\tserver.cancelWait();\n\t\t\t});\n\n\t\tconst result = await server.waitForCode();\n\t\tif (manualError) throw manualError;\n\t\tif (result?.code) {\n\t\t\tcode = result.code;\n\t\t} else if (manualCode) {\n\t\t\tconst parsed = parseAuthorizationInput(manualCode);\n\t\t\tif (parsed.state && parsed.state !== state) throw new Error(\"State mismatch\");\n\t\t\tcode = parsed.code;\n\t\t}\n\n\t\tif (!code) {\n\t\t\tawait manualPromise;\n\t\t\tif (manualError) throw manualError;\n\t\t\tif (manualCode) {\n\t\t\t\tconst parsed = parseAuthorizationInput(manualCode);\n\t\t\t\tif (parsed.state && parsed.state !== state) throw new Error(\"State mismatch\");\n\t\t\t\tcode = parsed.code;\n\t\t\t}\n\t\t}\n\n\t\tif (!code) throw new Error(\"Missing authorization code\");\n\t\treturn exchangeAuthorizationCodeForCredentials(code, verifier, REDIRECT_URI, interaction.signal);\n\t} finally {\n\t\tinteraction.signal.removeEventListener(\"abort\", onAbort);\n\t\tmanualAbort.abort();\n\t\tserver.close();\n\t}\n}\n\n/**\n * Refresh ChatGPT Subscription OAuth token\n */\nasync function refreshChatGptSubscriptionToken(refreshToken: string, signal: AbortSignal): Promise<OAuthCredential> {\n\treturn credentialsFromToken(await refreshAccessToken(refreshToken, signal));\n}\n\nexport const chatgptSubscriptionOAuth: OAuthAuth = {\n\tname: \"ChatGPT Subscription (Plus/Pro)\",\n\tisSubscription: true,\n\n\tasync login(interaction) {\n\t\tconst method = await interaction.prompt({\n\t\t\ttype: \"select\",\n\t\t\tmessage: \"Select ChatGPT Subscription login method:\",\n\t\t\toptions: [\n\t\t\t\t{ id: CHATGPT_SUBSCRIPTION_BROWSER_LOGIN_METHOD, label: \"Browser login (default)\" },\n\t\t\t\t{ id: CHATGPT_SUBSCRIPTION_DEVICE_CODE_LOGIN_METHOD, label: \"Device code login (headless)\" },\n\t\t\t],\n\t\t});\n\n\t\tif (method === CHATGPT_SUBSCRIPTION_DEVICE_CODE_LOGIN_METHOD) {\n\t\t\treturn loginChatGptSubscriptionDeviceCode(interaction);\n\t\t}\n\t\tif (method !== CHATGPT_SUBSCRIPTION_BROWSER_LOGIN_METHOD) {\n\t\t\tthrow new Error(`Unknown ChatGPT Subscription login method: ${method}`);\n\t\t}\n\n\t\treturn loginChatGptSubscription(interaction);\n\t},\n\n\trefresh: (credential, signal) => refreshChatGptSubscriptionToken(credential.refresh, signal),\n\n\tasync toAuth(credential) {\n\t\treturn { apiKey: credential.access };\n\t},\n};\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"cursor.d.ts","sourceRoot":"","sources":["../../../src/auth/oauth/cursor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,SAAS,EAA4C,MAAM,aAAa,CAAC;AAyGvF,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAO3E;AA6HD,eAAO,MAAM,WAAW,EAAE,SAUzB,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"cursor.js","sourceRoot":"","sources":["../../../src/auth/oauth/cursor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAEzC,MAAM,gBAAgB,GAAG,qCAAqC,CAAC;AAC/D,MAAM,eAAe,GAAG,kCAAkC,CAAC;AAC3D,MAAM,kBAAkB,GAAG,mDAAmD,CAAC;AAE/E,MAAM,wBAAwB,GAAG,IAAI,CAAC;AACtC,MAAM,oBAAoB,GAAG,MAAM,CAAC;AACpC,MAAM,uBAAuB,GAAG,GAAG,CAAC;AACpC,gFAAgF;AAChF,MAAM,iBAAiB,GAAG,GAAG,CAAC;AAC9B,2EAA2E;AAC3E,wEAAwE;AACxE,MAAM,uCAAuC,GAAG,CAAC,CAAC;AAClD,2EAA2E;AAC3E,MAAM,eAAe,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;AACtC,MAAM,yBAAyB,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AACjD,MAAM,cAAc,GAAG,iBAAiB,CAAC;AAIzC,SAAS,cAAc,CAAC,IAAgB,EAAE,KAAa;IACtD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;IAC1B,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACrD,MAAM,IAAI,KAAK,CAAC,wCAAwC,KAAK,EAAE,CAAC,CAAC;IAClE,CAAC;IACD,OAAO,KAAK,CAAC;AACd,CAAC;AAED;;;;GAIG;AACH,SAAS,eAAe,CAAC,MAAc,EAAE,IAA4B;IACpE,MAAM,MAAM,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,iBAAiB,EAAE,IAAI,EAAE,OAAO,CAAC;SAClE,MAAM,CAAC,CAAC,KAAK,EAAmB,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;SACjF,IAAI,CAAC,IAAI,CAAC,CAAC;IACb,OAAO,QAAQ,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,KAAK,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;AACvD,CAAC;AAED,KAAK,UAAU,YAAY,CAAC,QAAkB;IAC7C,IAAI,CAAC;QACJ,MAAM,MAAM,GAAY,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QAC9C,OAAO,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAE,MAAqB,CAAC,CAAC,CAAC,SAAS,CAAC;IAC5G,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,SAAS,CAAC;IAClB,CAAC;AACF,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAa;IACtC,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC/B,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC1D,IAAI,CAAC,OAAO;QAAE,OAAO,SAAS,CAAC;IAC/B,IAAI,CAAC;QACJ,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QACjE,MAAM,MAAM,GAAG,UAAU,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAC1E,MAAM,MAAM,GAAY,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;QACjD,OAAO,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAE,MAAqB,CAAC,CAAC,CAAC,SAAS,CAAC;IAC5G,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,SAAS,CAAC;IAClB,CAAC;AACF,CAAC;AAED;;;;GAIG;AACH,SAAS,iBAAiB,CAAC,WAAmB,EAAE,GAAW;IAC1D,MAAM,GAAG,GAAG,gBAAgB,CAAC,WAAW,CAAC,EAAE,GAAG,CAAC;IAC/C,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,EAAE,CAAC;QACzE,OAAO,GAAG,GAAG,IAAI,GAAG,eAAe,CAAC;IACrC,CAAC;IACD,OAAO,GAAG,GAAG,yBAAyB,GAAG,eAAe,CAAC;AAC1D,CAAC;AAED,SAAS,oBAAoB,CAAC,WAAmB,EAAE,YAAoB;IACtE,OAAO;QACN,IAAI,EAAE,OAAO;QACb,MAAM,EAAE,WAAW;QACnB,OAAO,EAAE,YAAY;QACrB,OAAO,EAAE,iBAAiB,CAAC,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC;KACnD,CAAC;AACH,CAAC;AAED,SAAS,cAAc,CAAC,EAAU,EAAE,MAAmB;IACtD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACtC,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,MAAM,CAAC,IAAI,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC;YAClC,OAAO;QACR,CAAC;QACD,MAAM,OAAO,GAAG,GAAG,EAAE;YACpB,YAAY,CAAC,OAAO,CAAC,CAAC;YACtB,MAAM,CAAC,IAAI,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC;QACnC,CAAC,CAAC;QACF,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE;YAC/B,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAC7C,OAAO,EAAE,CAAC;QACX,CAAC,EAAE,EAAE,CAAC,CAAC;QACP,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,SAAiB,EAAE,IAAY;IAClE,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,gBAAgB,CAAC,CAAC;IACtC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;IAC7C,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IACnC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACtC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC;IAC9C,OAAO,GAAG,CAAC,IAAI,CAAC;AACjB,CAAC;AAED;;;;;;GAMG;AACH,KAAK,UAAU,aAAa,CAAC,IAAY,EAAE,QAAgB,EAAE,MAAmB;IAC/E,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,eAAe,CAAC,CAAC;IACzC,OAAO,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IACvC,OAAO,CAAC,YAAY,CAAC,GAAG,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;IAE/C,IAAI,UAAU,GAAG,wBAAwB,CAAC;IAC1C,IAAI,4BAA4B,GAAG,CAAC,CAAC;IAErC,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,iBAAiB,EAAE,OAAO,EAAE,EAAE,CAAC;QAC9D,MAAM,cAAc,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QACzC,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,GAAG,uBAAuB,EAAE,oBAAoB,CAAC,CAAC;QAElF,IAAI,QAAkB,CAAC;QACvB,IAAI,CAAC;YACJ,QAAQ,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,kBAAkB,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;QAC3F,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,IAAI,MAAM,CAAC,OAAO;gBAAE,MAAM,IAAI,KAAK,CAAC,cAAc,CAAC,CAAC;YACpD,4BAA4B,EAAE,CAAC;YAC/B,IAAI,4BAA4B,IAAI,uCAAuC,EAAE,CAAC;gBAC7E,MAAM,IAAI,KAAK,CACd,8DAA8D,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CACtH,CAAC;YACH,CAAC;YACD,SAAS;QACV,CAAC;QAED,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YAC7B,kCAAkC;YAClC,4BAA4B,GAAG,CAAC,CAAC;YACjC,SAAS;QACV,CAAC;QAED,IAAI,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,GAAG,CAAC,MAAM,YAAY,CAAC,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC;YAClD,OAAO,oBAAoB,CAAC,cAAc,CAAC,IAAI,EAAE,aAAa,CAAC,EAAE,cAAc,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC,CAAC;QACxG,CAAC;QAED,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YAC9G,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,QAAQ,CAAC,CAAC;YAC1C,MAAM,IAAI,KAAK,CAAC,8BAA8B,eAAe,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;QAC1F,CAAC;QAED,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YAC7B,oEAAoE;YACpE,SAAS;QACV,CAAC;QAED,4BAA4B,EAAE,CAAC;QAC/B,IAAI,4BAA4B,IAAI,uCAAuC,EAAE,CAAC;YAC7E,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,QAAQ,CAAC,CAAC;YAC1C,MAAM,IAAI,KAAK,CAAC,gCAAgC,eAAe,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;QAC5F,CAAC;IACF,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;AACxE,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,WAAoC;IAC9D,WAAW,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC;IACpC,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,MAAM,YAAY,EAAE,CAAC;IACrD,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC;IAEjC,WAAW,CAAC,MAAM,CAAC;QAClB,IAAI,EAAE,UAAU;QAChB,GAAG,EAAE,mBAAmB,CAAC,SAAS,EAAE,IAAI,CAAC;QACzC,YAAY,EAAE,2EAA2E;KACzF,CAAC,CAAC;IACH,WAAW,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,uCAAuC,EAAE,CAAC,CAAC;IAE3F,OAAO,aAAa,CAAC,IAAI,EAAE,QAAQ,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;AAC1D,CAAC;AAED;;;;;GAKG;AACH,KAAK,UAAU,uBAAuB,CAAC,UAA2B,EAAE,MAAmB;IACtF,MAAM,YAAY,GAAG,UAAU,CAAC,OAAO,CAAC;IACxC,IAAI,OAAO,YAAY,KAAK,QAAQ,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACnE,MAAM,IAAI,KAAK,CAAC,uEAAuE,CAAC,CAAC;IAC1F,CAAC;IAED,IAAI,QAAkB,CAAC;IACvB,IAAI,CAAC;QACJ,QAAQ,GAAG,MAAM,KAAK,CAAC,kBAAkB,EAAE;YAC1C,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACR,aAAa,EAAE,UAAU,YAAY,EAAE;gBACvC,cAAc,EAAE,kBAAkB;gBAClC,MAAM,EAAE,kBAAkB;aAC1B;YACD,IAAI,EAAE,IAAI;YACV,MAAM;SACN,CAAC,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,IAAI,MAAM,CAAC,OAAO;YAAE,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;QACtE,MAAM,KAAK,CAAC;IACb,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,QAAQ,CAAC,CAAC;IAC1C,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QAClB,MAAM,IAAI,KAAK,CAAC,gCAAgC,eAAe,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;IAC5F,CAAC;IAED,MAAM,MAAM,GAAG,cAAc,CAAC,IAAI,IAAI,EAAE,EAAE,aAAa,CAAC,CAAC;IACzD,MAAM,OAAO,GAAG,IAAI,EAAE,YAAY,CAAC;IACnC,OAAO;QACN,IAAI,EAAE,OAAO;QACb,MAAM;QACN,OAAO,EAAE,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,YAAY;QACnF,OAAO,EAAE,iBAAiB,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC;KAC9C,CAAC;AACH,CAAC;AAED,MAAM,CAAC,MAAM,WAAW,GAAc;IACrC,IAAI,EAAE,0BAA0B;IAChC,cAAc,EAAE,IAAI;IACpB,UAAU,EAAE,qBAAqB;IACjC,KAAK,EAAE,WAAW;IAClB,OAAO,EAAE,uBAAuB;IAEhC,KAAK,CAAC,MAAM,CAAC,UAAU;QACtB,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,CAAC;IACtC,CAAC;CACD,CAAC","sourcesContent":["/**\n * Cursor OAuth flow (Cursor Pro/Ultra/Teams subscription).\n *\n * Cursor uses a browser deep-link + poll handshake instead of a device-code\n * or loopback-callback grant: the CLI opens\n * `https://cursor.com/loginDeepControl` with a PKCE S256 challenge and a\n * request uuid, the user approves the login in the browser, and the CLI\n * polls `https://api2.cursor.sh/auth/poll` with the uuid and PKCE verifier\n * until the tokens are released. Refresh exchanges the stored refresh token\n * (or a dashboard user API key) at `auth/exchange_user_api_key` for a fresh\n * session JWT.\n */\n\nimport type { OAuthAuth, OAuthCredential, ProviderAuthInteraction } from \"../types.ts\";\nimport { generatePKCE } from \"./pkce.ts\";\n\nconst CURSOR_LOGIN_URL = \"https://cursor.com/loginDeepControl\";\nconst CURSOR_POLL_URL = \"https://api2.cursor.sh/auth/poll\";\nconst CURSOR_REFRESH_URL = \"https://api2.cursor.sh/auth/exchange_user_api_key\";\n\nconst POLL_INITIAL_INTERVAL_MS = 1000;\nconst POLL_MAX_INTERVAL_MS = 10_000;\nconst POLL_BACKOFF_MULTIPLIER = 1.2;\n// ~24 minutes of wall-clock budget once the interval has backed off to its cap.\nconst POLL_MAX_ATTEMPTS = 150;\n// Transient failures (network errors, 5xx) are tolerated while the user is\n// still completing the browser step; a pending poll resets the counter.\nconst POLL_MAX_CONSECUTIVE_TRANSIENT_FAILURES = 3;\n// Refresh slightly before the JWT `exp` so a token cannot die mid-request.\nconst REFRESH_SKEW_MS = 5 * 60 * 1000;\nconst DEFAULT_TOKEN_LIFETIME_MS = 60 * 60 * 1000;\nconst CANCEL_MESSAGE = \"Login cancelled\";\n\ntype JsonObject = Record<string, unknown>;\n\nfunction requiredString(body: JsonObject, field: string): string {\n\tconst value = body[field];\n\tif (typeof value !== \"string\" || value.length === 0) {\n\t\tthrow new Error(`Invalid Cursor OAuth response field: ${field}`);\n\t}\n\treturn value;\n}\n\n/**\n * Builds a safe error detail from a Cursor error response: HTTP status plus\n * any short server-provided error strings. Never echoes the raw body, which\n * could carry token material into logs.\n */\nfunction describeFailure(status: number, body: JsonObject | undefined): string {\n\tconst detail = [body?.error, body?.error_description, body?.message]\n\t\t.filter((value): value is string => typeof value === \"string\" && value.length > 0)\n\t\t.join(\": \");\n\treturn `HTTP ${status}${detail ? `: ${detail}` : \"\"}`;\n}\n\nasync function readJsonBody(response: Response): Promise<JsonObject | undefined> {\n\ttry {\n\t\tconst parsed: unknown = await response.json();\n\t\treturn parsed && typeof parsed === \"object\" && !Array.isArray(parsed) ? (parsed as JsonObject) : undefined;\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\nfunction decodeJwtPayload(token: string): JsonObject | undefined {\n\tconst parts = token.split(\".\");\n\tconst payload = parts.length === 3 ? parts[1] : undefined;\n\tif (!payload) return undefined;\n\ttry {\n\t\tconst normalized = payload.replace(/-/g, \"+\").replace(/_/g, \"/\");\n\t\tconst padded = normalized + \"=\".repeat((4 - (normalized.length % 4)) % 4);\n\t\tconst parsed: unknown = JSON.parse(atob(padded));\n\t\treturn parsed && typeof parsed === \"object\" && !Array.isArray(parsed) ? (parsed as JsonObject) : undefined;\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\n/**\n * Cursor's poll/refresh responses carry no `expires_in`; the access token is\n * a JWT whose `exp` claim is authoritative. Tokens without a readable `exp`\n * get a conservative one-hour lifetime.\n */\nfunction accessTokenExpiry(accessToken: string, now: number): number {\n\tconst exp = decodeJwtPayload(accessToken)?.exp;\n\tif (typeof exp === \"number\" && Number.isFinite(exp) && exp * 1000 > now) {\n\t\treturn exp * 1000 - REFRESH_SKEW_MS;\n\t}\n\treturn now + DEFAULT_TOKEN_LIFETIME_MS - REFRESH_SKEW_MS;\n}\n\nfunction credentialFromTokens(accessToken: string, refreshToken: string): OAuthCredential {\n\treturn {\n\t\ttype: \"oauth\",\n\t\taccess: accessToken,\n\t\trefresh: refreshToken,\n\t\texpires: accessTokenExpiry(accessToken, Date.now()),\n\t};\n}\n\nfunction abortableSleep(ms: number, signal: AbortSignal): Promise<void> {\n\treturn new Promise((resolve, reject) => {\n\t\tif (signal.aborted) {\n\t\t\treject(new Error(CANCEL_MESSAGE));\n\t\t\treturn;\n\t\t}\n\t\tconst onAbort = () => {\n\t\t\tclearTimeout(timeout);\n\t\t\treject(new Error(CANCEL_MESSAGE));\n\t\t};\n\t\tconst timeout = setTimeout(() => {\n\t\t\tsignal.removeEventListener(\"abort\", onAbort);\n\t\t\tresolve();\n\t\t}, ms);\n\t\tsignal.addEventListener(\"abort\", onAbort, { once: true });\n\t});\n}\n\nexport function buildCursorLoginUrl(challenge: string, uuid: string): string {\n\tconst url = new URL(CURSOR_LOGIN_URL);\n\turl.searchParams.set(\"challenge\", challenge);\n\turl.searchParams.set(\"uuid\", uuid);\n\turl.searchParams.set(\"mode\", \"login\");\n\turl.searchParams.set(\"redirectTarget\", \"cli\");\n\treturn url.href;\n}\n\n/**\n * Polls the token release endpoint until the user approves the browser\n * request. 404 means \"not released yet\". Definitive rejections (400/401/403/\n * 410) fail immediately instead of being retried as if they were network\n * hiccups; 429 and other statuses back off without burning the transient\n * failure budget the way hard errors do.\n */\nasync function pollForTokens(uuid: string, verifier: string, signal: AbortSignal): Promise<OAuthCredential> {\n\tconst pollUrl = new URL(CURSOR_POLL_URL);\n\tpollUrl.searchParams.set(\"uuid\", uuid);\n\tpollUrl.searchParams.set(\"verifier\", verifier);\n\n\tlet intervalMs = POLL_INITIAL_INTERVAL_MS;\n\tlet consecutiveTransientFailures = 0;\n\n\tfor (let attempt = 0; attempt < POLL_MAX_ATTEMPTS; attempt++) {\n\t\tawait abortableSleep(intervalMs, signal);\n\t\tintervalMs = Math.min(intervalMs * POLL_BACKOFF_MULTIPLIER, POLL_MAX_INTERVAL_MS);\n\n\t\tlet response: Response;\n\t\ttry {\n\t\t\tresponse = await fetch(pollUrl.href, { headers: { Accept: \"application/json\" }, signal });\n\t\t} catch (error) {\n\t\t\tif (signal.aborted) throw new Error(CANCEL_MESSAGE);\n\t\t\tconsecutiveTransientFailures++;\n\t\t\tif (consecutiveTransientFailures >= POLL_MAX_CONSECUTIVE_TRANSIENT_FAILURES) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Cursor login polling failed after repeated network errors: ${error instanceof Error ? error.message : String(error)}`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (response.status === 404) {\n\t\t\t// Not approved yet; keep waiting.\n\t\t\tconsecutiveTransientFailures = 0;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (response.ok) {\n\t\t\tconst body = (await readJsonBody(response)) ?? {};\n\t\t\treturn credentialFromTokens(requiredString(body, \"accessToken\"), requiredString(body, \"refreshToken\"));\n\t\t}\n\n\t\tif (response.status === 400 || response.status === 401 || response.status === 403 || response.status === 410) {\n\t\t\tconst body = await readJsonBody(response);\n\t\t\tthrow new Error(`Cursor login was rejected (${describeFailure(response.status, body)})`);\n\t\t}\n\n\t\tif (response.status === 429) {\n\t\t\t// Rate limited: the next capped-backoff wait already slows us down.\n\t\t\tcontinue;\n\t\t}\n\n\t\tconsecutiveTransientFailures++;\n\t\tif (consecutiveTransientFailures >= POLL_MAX_CONSECUTIVE_TRANSIENT_FAILURES) {\n\t\t\tconst body = await readJsonBody(response);\n\t\t\tthrow new Error(`Cursor login polling failed (${describeFailure(response.status, body)})`);\n\t\t}\n\t}\n\n\tthrow new Error(\"Cursor login timed out waiting for browser approval\");\n}\n\nasync function loginCursor(interaction: ProviderAuthInteraction): Promise<OAuthCredential> {\n\tinteraction.signal.throwIfAborted();\n\tconst { verifier, challenge } = await generatePKCE();\n\tconst uuid = crypto.randomUUID();\n\n\tinteraction.notify({\n\t\ttype: \"auth_url\",\n\t\turl: buildCursorLoginUrl(challenge, uuid),\n\t\tinstructions: \"Approve the login request in your browser to connect your Cursor account.\",\n\t});\n\tinteraction.notify({ type: \"progress\", message: \"Waiting for browser authentication...\" });\n\n\treturn pollForTokens(uuid, verifier, interaction.signal);\n}\n\n/**\n * Exchanges the stored refresh token (Cursor also accepts a dashboard user\n * API key here) for a fresh session JWT. Cursor may omit or rotate the\n * refresh token in the response; an omitted token keeps the previous one so\n * a non-rotating server cannot strand the credential.\n */\nasync function refreshCursorCredential(credential: OAuthCredential, signal: AbortSignal): Promise<OAuthCredential> {\n\tconst refreshToken = credential.refresh;\n\tif (typeof refreshToken !== \"string\" || refreshToken.length === 0) {\n\t\tthrow new Error(\"Cursor token refresh failed: no refresh token stored; run login again\");\n\t}\n\n\tlet response: Response;\n\ttry {\n\t\tresponse = await fetch(CURSOR_REFRESH_URL, {\n\t\t\tmethod: \"POST\",\n\t\t\theaders: {\n\t\t\t\tAuthorization: `Bearer ${refreshToken}`,\n\t\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t\tAccept: \"application/json\",\n\t\t\t},\n\t\t\tbody: \"{}\",\n\t\t\tsignal,\n\t\t});\n\t} catch (error) {\n\t\tif (signal.aborted) throw new Error(\"Cursor token refresh cancelled\");\n\t\tthrow error;\n\t}\n\n\tconst body = await readJsonBody(response);\n\tif (!response.ok) {\n\t\tthrow new Error(`Cursor token refresh failed (${describeFailure(response.status, body)})`);\n\t}\n\n\tconst access = requiredString(body ?? {}, \"accessToken\");\n\tconst rotated = body?.refreshToken;\n\treturn {\n\t\ttype: \"oauth\",\n\t\taccess,\n\t\trefresh: typeof rotated === \"string\" && rotated.length > 0 ? rotated : refreshToken,\n\t\texpires: accessTokenExpiry(access, Date.now()),\n\t};\n}\n\nexport const cursorOAuth: OAuthAuth = {\n\tname: \"Cursor (Pro/Ultra/Teams)\",\n\tisSubscription: true,\n\tloginLabel: \"Sign in with Cursor\",\n\tlogin: loginCursor,\n\trefresh: refreshCursorCredential,\n\n\tasync toAuth(credential) {\n\t\treturn { apiKey: credential.access };\n\t},\n};\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"device-code.d.ts","sourceRoot":"","sources":["../../../src/auth/oauth/device-code.ts"],"names":[],"mappings":"AAUA,KAAK,mCAAmC,GACrC;IAAE,MAAM,EAAE,SAAS,CAAA;CAAE,GACrB;IAAE,MAAM,EAAE,WAAW,CAAC;IAAC,eAAe,CAAC,EAAE,MAAM,CAAA;CAAE,GACjD;IAAE,MAAM,EAAE,QAAQ,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAEzC,MAAM,MAAM,yBAAyB,CAAC,CAAC,IAAI,mCAAmC,GAAG;IAAE,MAAM,EAAE,UAAU,CAAC;IAAC,KAAK,EAAE,CAAC,CAAA;CAAE,CAAC;AAElH,MAAM,MAAM,0BAA0B,CAAC,CAAC,IAAI;IAC3C,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,IAAI,EAAE,MAAM,OAAO,CAAC,yBAAyB,CAAC,CAAC,CAAC,CAAC,CAAC;IAClD,MAAM,EAAE,WAAW,CAAC;CACpB,CAAC;AAEF,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAkBpG;AAED,wBAAsB,uBAAuB,CAAC,CAAC,EAAE,OAAO,EAAE,0BAA0B,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAoDnG"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"device-code.js","sourceRoot":"","sources":["../../../src/auth/oauth/device-code.ts"],"names":[],"mappings":"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","sourcesContent":["const CANCEL_MESSAGE = \"Login cancelled\";\nconst TIMEOUT_MESSAGE = \"Device flow timed out\";\nconst SLOW_DOWN_TIMEOUT_MESSAGE =\n\t\"Device flow timed out after one or more slow_down responses. This is often caused by clock drift in WSL or VM environments. Please sync or restart the VM clock and try again.\";\nconst MINIMUM_INTERVAL_MS = 1000;\n// RFC 8628 section 3.2: if the authorization server omits `interval`, the client must use 5 seconds.\nconst DEFAULT_POLL_INTERVAL_SECONDS = 5;\n// RFC 8628 section 3.5: `slow_down` means the polling interval must increase by 5 seconds.\nconst SLOW_DOWN_INTERVAL_INCREMENT_MS = 5000;\n\ntype OAuthDeviceCodeIncompletePollResult =\n\t| { status: \"pending\" }\n\t| { status: \"slow_down\"; intervalSeconds?: number }\n\t| { status: \"failed\"; message: string };\n\nexport type OAuthDeviceCodePollResult<T> = OAuthDeviceCodeIncompletePollResult | { status: \"complete\"; value: T };\n\nexport type OAuthDeviceCodePollOptions<T> = {\n\tintervalSeconds?: number;\n\texpiresInSeconds?: number;\n\twaitBeforeFirstPoll?: boolean;\n\tpoll: () => Promise<OAuthDeviceCodePollResult<T>>;\n\tsignal: AbortSignal;\n};\n\nexport function abortableSleep(ms: number, signal: AbortSignal, cancelMessage: string): Promise<void> {\n\treturn new Promise((resolve, reject) => {\n\t\tif (signal.aborted) {\n\t\t\treject(new Error(cancelMessage));\n\t\t\treturn;\n\t\t}\n\n\t\tconst onAbort = () => {\n\t\t\tclearTimeout(timeout);\n\t\t\treject(new Error(cancelMessage));\n\t\t};\n\t\tconst timeout = setTimeout(() => {\n\t\t\tsignal.removeEventListener(\"abort\", onAbort);\n\t\t\tresolve();\n\t\t}, ms);\n\n\t\tsignal.addEventListener(\"abort\", onAbort, { once: true });\n\t});\n}\n\nexport async function pollOAuthDeviceCodeFlow<T>(options: OAuthDeviceCodePollOptions<T>): Promise<T> {\n\tconst deadline =\n\t\ttypeof options.expiresInSeconds === \"number\"\n\t\t\t? Date.now() + options.expiresInSeconds * 1000\n\t\t\t: Number.POSITIVE_INFINITY;\n\tlet intervalMs = Math.max(\n\t\tMINIMUM_INTERVAL_MS,\n\t\tMath.floor((options.intervalSeconds ?? DEFAULT_POLL_INTERVAL_SECONDS) * 1000),\n\t);\n\n\tlet slowDownResponses = 0;\n\tif (options.waitBeforeFirstPoll) {\n\t\tconst remainingMs = deadline - Date.now();\n\t\tif (remainingMs > 0) {\n\t\t\tawait abortableSleep(Math.min(intervalMs, remainingMs), options.signal, CANCEL_MESSAGE);\n\t\t}\n\t}\n\n\twhile (Date.now() < deadline) {\n\t\tif (options.signal.aborted) {\n\t\t\tthrow new Error(CANCEL_MESSAGE);\n\t\t}\n\n\t\tconst result = await options.poll();\n\t\tif (result.status === \"complete\") {\n\t\t\treturn result.value;\n\t\t}\n\t\tif (result.status === \"failed\") {\n\t\t\tthrow new Error(result.message);\n\t\t}\n\t\tif (result.status === \"slow_down\") {\n\t\t\tslowDownResponses += 1;\n\t\t\t// Use the server-provided interval when given (GitHub reports the new required minimum\n\t\t\t// in `interval`); trusting only a client-tracked value risks polling early forever under\n\t\t\t// WSL/VM clock drift. Otherwise apply RFC 8628 section 3.5: increase by 5 seconds.\n\t\t\tintervalMs =\n\t\t\t\ttypeof result.intervalSeconds === \"number\" &&\n\t\t\t\tNumber.isFinite(result.intervalSeconds) &&\n\t\t\t\tresult.intervalSeconds > 0\n\t\t\t\t\t? Math.max(MINIMUM_INTERVAL_MS, Math.floor(result.intervalSeconds * 1000))\n\t\t\t\t\t: Math.max(MINIMUM_INTERVAL_MS, intervalMs + SLOW_DOWN_INTERVAL_INCREMENT_MS);\n\t\t}\n\n\t\tconst remainingMs = deadline - Date.now();\n\t\tif (remainingMs <= 0) {\n\t\t\tbreak;\n\t\t}\n\n\t\tawait abortableSleep(Math.min(intervalMs, remainingMs), options.signal, CANCEL_MESSAGE);\n\t}\n\n\tthrow new Error(slowDownResponses > 0 ? SLOW_DOWN_TIMEOUT_MESSAGE : TIMEOUT_MESSAGE);\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"devin-callback.d.ts","sourceRoot":"","sources":["../../../src/auth/oauth/devin-callback.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAInD,eAAO,MAAM,mBAAmB,QAAQ,CAAC;AACzC,eAAO,MAAM,mBAAmB,cAAc,CAAC;AAE/C,MAAM,MAAM,mBAAmB,GAAG;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,gFAAgF;IAChF,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB,iBAAiB,EAAE,MAAM,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAAC;CACzD,CAAC;AAaF,wBAAsB,wBAAwB,CAAC,KAAK,EAAE;IACrD,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,WAAW,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;CACvB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAsG/B"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"devin-callback.js","sourceRoot":"","sources":["../../../src/auth/oauth/devin-callback.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Devin CLI OAuth loopback callback.\n *\n * Devin registers ONE redirect URI for the CLI, so the callback binds the fixed\n * loopback port 59653 instead of an ephemeral one: a different port is rejected\n * by the authorize page. The server is one-shot, validates the issued state\n * before spending the code, and renders the shared OAuth result pages.\n */\n\nimport { createServer, type Server, type ServerResponse } from \"node:http\";\nimport { getProviderEnvValue } from \"../../utils/provider-env.ts\";\nimport type { OAuthCredential } from \"../types.ts\";\nimport { exchangeDevinAuthorizationCode } from \"./devin-token.ts\";\nimport { oauthErrorHtml, oauthSuccessHtml } from \"./oauth-page.ts\";\n\nexport const DEVIN_CALLBACK_PORT = 59653;\nexport const DEVIN_CALLBACK_PATH = \"/callback\";\n\nexport type DevinCallbackServer = {\n\tcallbackUrl: string;\n\tclose: () => void;\n\t/** Hand the login to manual code entry unless a callback already claimed it. */\n\tcancelWait: () => void;\n\twaitForCredential: () => Promise<OAuthCredential | null>;\n};\n\nfunction callbackHost(): string {\n\treturn getProviderEnvValue(\"PI_OAUTH_CALLBACK_HOST\") || \"127.0.0.1\";\n}\n\nfunction sendHtml(response: ServerResponse, status: number, html: string): void {\n\tresponse.statusCode = status;\n\tresponse.setHeader(\"content-type\", \"text/html; charset=utf-8\");\n\tresponse.setHeader(\"cache-control\", \"no-store\");\n\tresponse.end(html);\n}\n\nexport async function startDevinCallbackServer(input: {\n\tstate: string;\n\tverifier: string;\n\tsignal: AbortSignal;\n\tloginTimeoutMs: number;\n}): Promise<DevinCallbackServer> {\n\tif (input.signal.aborted) throw new Error(\"Login cancelled\");\n\tconst host = callbackHost();\n\tlet resolveCredential: (credential: OAuthCredential | null) => void = () => {};\n\tlet rejectCredential: (error: Error) => void = () => {};\n\tconst credential = new Promise<OAuthCredential | null>((resolve, reject) => {\n\t\tresolveCredential = resolve;\n\t\trejectCredential = reject;\n\t});\n\n\tlet claimed = false;\n\tlet settled = false;\n\tlet timeout: ReturnType<typeof setTimeout> | undefined;\n\tlet onAbort: (() => void) | undefined;\n\n\tconst close = (): void => {\n\t\tif (timeout) clearTimeout(timeout);\n\t\tif (onAbort) input.signal.removeEventListener(\"abort\", onAbort);\n\t\tserver.close();\n\t};\n\n\tconst finish = (result: { credential: OAuthCredential | null } | { error: Error }): void => {\n\t\tif (settled) return;\n\t\tsettled = true;\n\t\tclose();\n\t\tif (\"credential\" in result) resolveCredential(result.credential);\n\t\telse rejectCredential(result.error);\n\t};\n\n\tconst server: Server = createServer((request, response) => {\n\t\tvoid (async () => {\n\t\t\tconst requestUrl = new URL(request.url ?? \"/\", `http://${host}`);\n\t\t\tif (request.method !== \"GET\" || requestUrl.pathname !== DEVIN_CALLBACK_PATH) {\n\t\t\t\tsendHtml(response, 404, oauthErrorHtml(\"OAuth callback route not found.\"));\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (claimed || settled) {\n\t\t\t\tsendHtml(response, 409, oauthErrorHtml(\"This OAuth callback has already been used.\"));\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst oauthError = requestUrl.searchParams.get(\"error\");\n\t\t\tif (oauthError) {\n\t\t\t\tconst description = requestUrl.searchParams.get(\"error_description\") ?? oauthError;\n\t\t\t\tsendHtml(response, 400, oauthErrorHtml(\"Devin authorization was denied.\", description));\n\t\t\t\tfinish({ error: new Error(`Devin authorization failed: ${description}`) });\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// The state guard runs before the code is spent: a forged callback must\n\t\t\t// never reach the token endpoint.\n\t\t\tconst state = requestUrl.searchParams.get(\"state\") ?? \"\";\n\t\t\tif (state !== input.state) {\n\t\t\t\tsendHtml(response, 400, oauthErrorHtml(\"Devin authorization state mismatch.\"));\n\t\t\t\tfinish({ error: new Error(\"Devin OAuth callback state mismatch\") });\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst code = requestUrl.searchParams.get(\"code\");\n\t\t\tif (!code) {\n\t\t\t\tsendHtml(response, 400, oauthErrorHtml(\"Devin returned no authorization code.\"));\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tclaimed = true;\n\n\t\t\ttry {\n\t\t\t\tconst result = await exchangeDevinAuthorizationCode(code, input.verifier, input.signal);\n\t\t\t\tsendHtml(response, 200, oauthSuccessHtml(\"Signed in to Devin. You may now close this page.\"));\n\t\t\t\tfinish({ credential: result });\n\t\t\t} catch (error) {\n\t\t\t\tconst message = error instanceof Error ? error.message : \"Unknown token exchange error\";\n\t\t\t\tsendHtml(response, 502, oauthErrorHtml(\"Devin token exchange failed.\", message));\n\t\t\t\tfinish({ error: error instanceof Error ? error : new Error(message) });\n\t\t\t}\n\t\t})();\n\t});\n\n\tawait new Promise<void>((resolve, reject) => {\n\t\tserver.once(\"error\", reject);\n\t\tserver.listen(DEVIN_CALLBACK_PORT, host, () => {\n\t\t\tserver.removeListener(\"error\", reject);\n\t\t\tresolve();\n\t\t});\n\t});\n\n\tserver.on(\"error\", (error) => finish({ error }));\n\tonAbort = () => finish({ error: new Error(\"Login cancelled\") });\n\tinput.signal.addEventListener(\"abort\", onAbort, { once: true });\n\tif (input.signal.aborted) {\n\t\tclose();\n\t\tthrow new Error(\"Login cancelled\");\n\t}\n\ttimeout = setTimeout(() => finish({ error: new Error(\"Devin OAuth login timed out\") }), input.loginTimeoutMs);\n\n\treturn {\n\t\tcallbackUrl: `http://${host}:${DEVIN_CALLBACK_PORT}${DEVIN_CALLBACK_PATH}`,\n\t\tclose,\n\t\tcancelWait: () => {\n\t\t\tif (!claimed) finish({ credential: null });\n\t\t},\n\t\twaitForCredential: () => credential,\n\t};\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"devin-token.d.ts","sourceRoot":"","sources":["../../../src/auth/oauth/devin-token.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAEnD,eAAO,MAAM,eAAe,wCAAwC,CAAC;AACrE,eAAO,MAAM,kBAAkB,yBAAyB,CAAC;AAEzD,mFAAmF;AACnF,eAAO,MAAM,wBAAwB,cAAiB,CAAC;AAgCvD,kFAAkF;AAClF,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,eAAe,CAO9D;AAED,wBAAsB,8BAA8B,CACnD,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,WAAW,GACjB,OAAO,CAAC,eAAe,CAAC,CA4C1B"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"devin-token.js","sourceRoot":"","sources":["../../../src/auth/oauth/devin-token.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Devin (Cognition) CLI token exchange.\n *\n * Devin's CLI grant is deliberately non-standard: the authorization code is\n * redeemed with a bare JSON body carrying only the code and the PKCE verifier\n * (no client_id, no grant_type), and the response returns ONE opaque JWT in\n * \"token\" that serves as both the access and the refresh credential. Expiry is\n * read from the JWT itself because the response carries no expires_in.\n */\n\nimport type { OAuthCredential } from \"../types.ts\";\n\nexport const DEVIN_TOKEN_URL = \"https://api.devin.ai/auth/cli/token\";\nexport const DEVIN_API_ENDPOINT = \"https://api.devin.ai\";\n\n/** Devin issues long-lived CLI tokens; used when the JWT carries no usable exp. */\nexport const DEVIN_FALLBACK_EXPIRY_MS = 31_536_000_000;\n\nconst TOKEN_EXCHANGE_TIMEOUT_MS = 30_000;\n\ntype JsonObject = Record<string, unknown>;\n\nfunction decodeJwtExpiry(token: string): number | undefined {\n\tconst payload = token.split(\".\")[1];\n\tif (!payload) return undefined;\n\tconst base64 = payload.replaceAll(\"-\", \"+\").replaceAll(\"_\", \"/\");\n\tconst padded = base64.padEnd(base64.length + ((4 - (base64.length % 4)) % 4), \"=\");\n\ttry {\n\t\tconst parsed = JSON.parse(atob(padded)) as JsonObject;\n\t\tconst exp = parsed.exp;\n\t\tif (typeof exp === \"number\" && Number.isFinite(exp) && exp > 0) return Math.trunc(exp * 1000);\n\t} catch {\n\t\t// A token whose payload is not readable JSON falls back to the fixed window.\n\t}\n\treturn undefined;\n}\n\nfunction errorDetail(body: JsonObject): string | undefined {\n\tif (typeof body.error_description === \"string\") return body.error_description;\n\tif (typeof body.message === \"string\") return body.message;\n\tif (typeof body.error === \"string\") return body.error;\n\tif (body.error && typeof body.error === \"object\" && !Array.isArray(body.error)) {\n\t\tconst message = (body.error as JsonObject).message;\n\t\tif (typeof message === \"string\") return message;\n\t}\n\treturn undefined;\n}\n\n/** Builds the credential Devin's CLI stores: one token for access and refresh. */\nexport function devinCredential(token: string): OAuthCredential {\n\treturn {\n\t\ttype: \"oauth\",\n\t\taccess: token,\n\t\trefresh: token,\n\t\texpires: decodeJwtExpiry(token) ?? Date.now() + DEVIN_FALLBACK_EXPIRY_MS,\n\t};\n}\n\nexport async function exchangeDevinAuthorizationCode(\n\tcode: string,\n\tverifier: string,\n\tsignal: AbortSignal,\n): Promise<OAuthCredential> {\n\tif (signal.aborted) throw new Error(\"Login cancelled\");\n\tconst controller = new AbortController();\n\tconst onAbort = () => controller.abort(signal.reason);\n\tsignal.addEventListener(\"abort\", onAbort, { once: true });\n\tconst timeout = setTimeout(\n\t\t() => controller.abort(new Error(\"Devin OAuth token exchange timed out\")),\n\t\tTOKEN_EXCHANGE_TIMEOUT_MS,\n\t);\n\n\tlet response: Response;\n\tlet body: JsonObject = {};\n\ttry {\n\t\tresponse = await fetch(DEVIN_TOKEN_URL, {\n\t\t\tmethod: \"POST\",\n\t\t\theaders: { accept: \"application/json\", \"content-type\": \"application/json\" },\n\t\t\tbody: JSON.stringify({ code, code_verifier: verifier }),\n\t\t\tsignal: controller.signal,\n\t\t});\n\t\ttry {\n\t\t\tconst parsed = (await response.json()) as unknown;\n\t\t\tif (parsed && typeof parsed === \"object\" && !Array.isArray(parsed)) body = parsed as JsonObject;\n\t\t} catch {\n\t\t\tif (response.ok) throw new Error(\"Devin OAuth returned invalid JSON\");\n\t\t}\n\t} catch (error) {\n\t\tif (signal.aborted) throw new Error(\"Login cancelled\");\n\t\tif (controller.signal.aborted) throw new Error(\"Devin OAuth token exchange timed out\");\n\t\tthrow error;\n\t} finally {\n\t\tclearTimeout(timeout);\n\t\tsignal.removeEventListener(\"abort\", onAbort);\n\t}\n\n\tif (!response.ok) {\n\t\tconst detail = errorDetail(body);\n\t\tthrow new Error(`Devin OAuth token exchange failed (HTTP ${response.status})${detail ? `: ${detail}` : \"\"}`);\n\t}\n\n\tif (typeof body.token !== \"string\" || body.token.length === 0) {\n\t\tthrow new Error('Devin OAuth response carries no \"token\"');\n\t}\n\n\treturn devinCredential(body.token);\n}\n"]}