@vib-rato/ai 0.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (525) hide show
  1. package/CHANGELOG.md +3354 -0
  2. package/README.md +1194 -0
  3. package/dist/types/adapter-internals/provider-safety-stop.d.ts +45 -0
  4. package/dist/types/api-registry.d.ts +30 -0
  5. package/dist/types/auth-broker/client.d.ts +80 -0
  6. package/dist/types/auth-broker/index.d.ts +5 -0
  7. package/dist/types/auth-broker/redact.d.ts +7 -0
  8. package/dist/types/auth-broker/refresher.d.ts +25 -0
  9. package/dist/types/auth-broker/remote-store.d.ts +153 -0
  10. package/dist/types/auth-broker/server.d.ts +32 -0
  11. package/dist/types/auth-broker/types.d.ts +132 -0
  12. package/dist/types/auth-broker/wire-schemas.d.ts +555 -0
  13. package/dist/types/auth-gateway/http.d.ts +40 -0
  14. package/dist/types/auth-gateway/index.d.ts +3 -0
  15. package/dist/types/auth-gateway/server.d.ts +70 -0
  16. package/dist/types/auth-gateway/types.d.ts +129 -0
  17. package/dist/types/auth-storage.d.ts +1074 -0
  18. package/dist/types/cli.d.ts +2 -0
  19. package/dist/types/codex-tools.d.ts +4 -0
  20. package/dist/types/context-cap-policy.d.ts +68 -0
  21. package/dist/types/core.d.ts +35 -0
  22. package/dist/types/index.d.ts +55 -0
  23. package/dist/types/model-cache.d.ts +24 -0
  24. package/dist/types/model-manager.d.ts +77 -0
  25. package/dist/types/model-pricing.d.ts +3 -0
  26. package/dist/types/model-retirements.d.ts +6 -0
  27. package/dist/types/model-thinking.d.ts +100 -0
  28. package/dist/types/models.d.ts +21 -0
  29. package/dist/types/openai-completions-compat.d.ts +34 -0
  30. package/dist/types/provider-details.d.ts +24 -0
  31. package/dist/types/provider-models/bundled-references.d.ts +4 -0
  32. package/dist/types/provider-models/descriptors.d.ts +48 -0
  33. package/dist/types/provider-models/google.d.ts +20 -0
  34. package/dist/types/provider-models/index.d.ts +5 -0
  35. package/dist/types/provider-models/ollama.d.ts +7 -0
  36. package/dist/types/provider-models/openai-compat.d.ts +293 -0
  37. package/dist/types/provider-models/special.d.ts +29 -0
  38. package/dist/types/providers/amazon-bedrock.d.ts +60 -0
  39. package/dist/types/providers/anthropic-messages-server-schema.d.ts +450 -0
  40. package/dist/types/providers/anthropic-messages-server.d.ts +17 -0
  41. package/dist/types/providers/anthropic.d.ts +280 -0
  42. package/dist/types/providers/aws-credential-config.d.ts +19 -0
  43. package/dist/types/providers/aws-credentials.d.ts +43 -0
  44. package/dist/types/providers/aws-eventstream.d.ts +38 -0
  45. package/dist/types/providers/aws-sigv4.d.ts +55 -0
  46. package/dist/types/providers/azure-openai-responses.d.ts +22 -0
  47. package/dist/types/providers/composer-discipline.d.ts +32 -0
  48. package/dist/types/providers/cursor/client-version.d.ts +10 -0
  49. package/dist/types/providers/cursor/exec-modern.d.ts +98 -0
  50. package/dist/types/providers/cursor/gen/agent_pb.d.ts +16769 -0
  51. package/dist/types/providers/cursor-pi-args.d.ts +119 -0
  52. package/dist/types/providers/cursor.d.ts +72 -0
  53. package/dist/types/providers/dashscope-token-plan-headers.d.ts +57 -0
  54. package/dist/types/providers/error-message.d.ts +27 -0
  55. package/dist/types/providers/github-copilot-headers.d.ts +40 -0
  56. package/dist/types/providers/gitlab-duo.d.ts +27 -0
  57. package/dist/types/providers/google-auth.d.ts +26 -0
  58. package/dist/types/providers/google-gemini-cli.d.ts +75 -0
  59. package/dist/types/providers/google-gemini-headers.d.ts +43 -0
  60. package/dist/types/providers/google-shared.d.ts +183 -0
  61. package/dist/types/providers/google-types.d.ts +138 -0
  62. package/dist/types/providers/google-vertex.d.ts +11 -0
  63. package/dist/types/providers/google.d.ts +4 -0
  64. package/dist/types/providers/grammar.d.ts +1 -0
  65. package/dist/types/providers/kimi.d.ts +27 -0
  66. package/dist/types/providers/kiro-api-key.d.ts +50 -0
  67. package/dist/types/providers/kiro-codewhisperer.d.ts +11 -0
  68. package/dist/types/providers/mock.d.ts +189 -0
  69. package/dist/types/providers/ollama.d.ts +41 -0
  70. package/dist/types/providers/openai-anthropic-shim.d.ts +31 -0
  71. package/dist/types/providers/openai-bounded-rate-limits.d.ts +3 -0
  72. package/dist/types/providers/openai-chat-server-schema.d.ts +1733 -0
  73. package/dist/types/providers/openai-chat-server.d.ts +16 -0
  74. package/dist/types/providers/openai-codex/constants.d.ts +26 -0
  75. package/dist/types/providers/openai-codex/request-transformer.d.ts +50 -0
  76. package/dist/types/providers/openai-codex/response-handler.d.ts +18 -0
  77. package/dist/types/providers/openai-codex-responses.d.ts +71 -0
  78. package/dist/types/providers/openai-completions-compat.d.ts +6 -0
  79. package/dist/types/providers/openai-completions.d.ts +35 -0
  80. package/dist/types/providers/openai-opencodex-responses.d.ts +10 -0
  81. package/dist/types/providers/openai-request-transform.d.ts +4 -0
  82. package/dist/types/providers/openai-responses-server-schema.d.ts +392 -0
  83. package/dist/types/providers/openai-responses-server.d.ts +17 -0
  84. package/dist/types/providers/openai-responses-shared.d.ts +106 -0
  85. package/dist/types/providers/openai-responses.d.ts +37 -0
  86. package/dist/types/providers/pi-native-client.d.ts +29 -0
  87. package/dist/types/providers/pi-native-server.d.ts +60 -0
  88. package/dist/types/providers/register-builtins.d.ts +59 -0
  89. package/dist/types/providers/synthetic.d.ts +26 -0
  90. package/dist/types/providers/transform-messages.d.ts +33 -0
  91. package/dist/types/providers/vision-guard.d.ts +8 -0
  92. package/dist/types/rate-limit-utils.d.ts +19 -0
  93. package/dist/types/stream.d.ts +45 -0
  94. package/dist/types/types.d.ts +1073 -0
  95. package/dist/types/usage/claude.d.ts +3 -0
  96. package/dist/types/usage/gemini.d.ts +2 -0
  97. package/dist/types/usage/github-copilot.d.ts +7 -0
  98. package/dist/types/usage/google-antigravity.d.ts +2 -0
  99. package/dist/types/usage/grok-cli.d.ts +17 -0
  100. package/dist/types/usage/kimi.d.ts +4 -0
  101. package/dist/types/usage/minimax-code.d.ts +2 -0
  102. package/dist/types/usage/openai-codex.d.ts +3 -0
  103. package/dist/types/usage/shared.d.ts +1 -0
  104. package/dist/types/usage/zai.d.ts +2 -0
  105. package/dist/types/usage.d.ts +264 -0
  106. package/dist/types/utils/abort.d.ts +19 -0
  107. package/dist/types/utils/anthropic-auth.d.ts +39 -0
  108. package/dist/types/utils/block-symbols.d.ts +6 -0
  109. package/dist/types/utils/discovery/antigravity.d.ts +67 -0
  110. package/dist/types/utils/discovery/codex.d.ts +38 -0
  111. package/dist/types/utils/discovery/cursor.d.ts +49 -0
  112. package/dist/types/utils/discovery/gemini.d.ts +25 -0
  113. package/dist/types/utils/discovery/index.d.ts +4 -0
  114. package/dist/types/utils/discovery/openai-compatible.d.ts +81 -0
  115. package/dist/types/utils/event-stream.d.ts +41 -0
  116. package/dist/types/utils/fallback-transport.d.ts +110 -0
  117. package/dist/types/utils/fireworks-model-id.d.ts +10 -0
  118. package/dist/types/utils/foundry.d.ts +11 -0
  119. package/dist/types/utils/h2-fetch.d.ts +22 -0
  120. package/dist/types/utils/http-inspector.d.ts +59 -0
  121. package/dist/types/utils/idle-iterator.d.ts +122 -0
  122. package/dist/types/utils/json-parse.d.ts +98 -0
  123. package/dist/types/utils/oauth/alibaba-token-plan.d.ts +19 -0
  124. package/dist/types/utils/oauth/anthropic.d.ts +41 -0
  125. package/dist/types/utils/oauth/api-key-login.d.ts +38 -0
  126. package/dist/types/utils/oauth/api-key-validation.d.ts +39 -0
  127. package/dist/types/utils/oauth/bizrouter.d.ts +1 -0
  128. package/dist/types/utils/oauth/callback-server.d.ts +80 -0
  129. package/dist/types/utils/oauth/cerebras.d.ts +1 -0
  130. package/dist/types/utils/oauth/cloudflare-ai-gateway.d.ts +18 -0
  131. package/dist/types/utils/oauth/commandcode.d.ts +1 -0
  132. package/dist/types/utils/oauth/cursor.d.ts +15 -0
  133. package/dist/types/utils/oauth/deepinfra.d.ts +1 -0
  134. package/dist/types/utils/oauth/deepseek.d.ts +10 -0
  135. package/dist/types/utils/oauth/firepass.d.ts +1 -0
  136. package/dist/types/utils/oauth/fireworks.d.ts +1 -0
  137. package/dist/types/utils/oauth/fugu.d.ts +1 -0
  138. package/dist/types/utils/oauth/github-copilot.d.ts +38 -0
  139. package/dist/types/utils/oauth/gitlab-duo.d.ts +3 -0
  140. package/dist/types/utils/oauth/glm-zcode.d.ts +71 -0
  141. package/dist/types/utils/oauth/google-antigravity.d.ts +11 -0
  142. package/dist/types/utils/oauth/google-gemini-cli.d.ts +10 -0
  143. package/dist/types/utils/oauth/google-oauth-shared.d.ts +28 -0
  144. package/dist/types/utils/oauth/huggingface.d.ts +19 -0
  145. package/dist/types/utils/oauth/index.d.ts +39 -0
  146. package/dist/types/utils/oauth/kagi.d.ts +17 -0
  147. package/dist/types/utils/oauth/kilo.d.ts +5 -0
  148. package/dist/types/utils/oauth/kimi.d.ts +17 -0
  149. package/dist/types/utils/oauth/kiro.d.ts +71 -0
  150. package/dist/types/utils/oauth/litellm.d.ts +18 -0
  151. package/dist/types/utils/oauth/lm-studio.d.ts +17 -0
  152. package/dist/types/utils/oauth/mara.d.ts +1 -0
  153. package/dist/types/utils/oauth/minimax-code.d.ts +28 -0
  154. package/dist/types/utils/oauth/moonshot.d.ts +1 -0
  155. package/dist/types/utils/oauth/nanogpt.d.ts +1 -0
  156. package/dist/types/utils/oauth/nvidia.d.ts +18 -0
  157. package/dist/types/utils/oauth/ollama-cloud.d.ts +2 -0
  158. package/dist/types/utils/oauth/ollama.d.ts +18 -0
  159. package/dist/types/utils/oauth/openai-codex.d.ts +21 -0
  160. package/dist/types/utils/oauth/opencode.d.ts +18 -0
  161. package/dist/types/utils/oauth/opengateway.d.ts +1 -0
  162. package/dist/types/utils/oauth/openrouter.d.ts +1 -0
  163. package/dist/types/utils/oauth/parallel.d.ts +17 -0
  164. package/dist/types/utils/oauth/perplexity.d.ts +4 -0
  165. package/dist/types/utils/oauth/pkce.d.ts +8 -0
  166. package/dist/types/utils/oauth/qianfan.d.ts +17 -0
  167. package/dist/types/utils/oauth/qwen-portal.d.ts +19 -0
  168. package/dist/types/utils/oauth/sglang.d.ts +16 -0
  169. package/dist/types/utils/oauth/synthetic.d.ts +1 -0
  170. package/dist/types/utils/oauth/tavily.d.ts +17 -0
  171. package/dist/types/utils/oauth/together.d.ts +1 -0
  172. package/dist/types/utils/oauth/types.d.ts +56 -0
  173. package/dist/types/utils/oauth/venice.d.ts +18 -0
  174. package/dist/types/utils/oauth/vercel-ai-gateway.d.ts +18 -0
  175. package/dist/types/utils/oauth/vllm.d.ts +16 -0
  176. package/dist/types/utils/oauth/xai.d.ts +30 -0
  177. package/dist/types/utils/oauth/xiaomi.d.ts +25 -0
  178. package/dist/types/utils/oauth/zai.d.ts +18 -0
  179. package/dist/types/utils/oauth/zenmux.d.ts +1 -0
  180. package/dist/types/utils/overflow.d.ts +14 -0
  181. package/dist/types/utils/parse-bind.d.ts +26 -0
  182. package/dist/types/utils/provider-response.d.ts +6 -0
  183. package/dist/types/utils/provider-safety-stop.d.ts +8 -0
  184. package/dist/types/utils/proxy.d.ts +7 -0
  185. package/dist/types/utils/retry-after.d.ts +3 -0
  186. package/dist/types/utils/retry-budget.d.ts +1 -0
  187. package/dist/types/utils/retry.d.ts +29 -0
  188. package/dist/types/utils/schema/adapt.d.ts +24 -0
  189. package/dist/types/utils/schema/compatibility.d.ts +30 -0
  190. package/dist/types/utils/schema/dereference.d.ts +11 -0
  191. package/dist/types/utils/schema/draft.d.ts +10 -0
  192. package/dist/types/utils/schema/equality.d.ts +4 -0
  193. package/dist/types/utils/schema/fields.d.ts +49 -0
  194. package/dist/types/utils/schema/index.d.ts +14 -0
  195. package/dist/types/utils/schema/json-schema-validator.d.ts +12 -0
  196. package/dist/types/utils/schema/meta-validator.d.ts +2 -0
  197. package/dist/types/utils/schema/normalize.d.ts +93 -0
  198. package/dist/types/utils/schema/root-combinator.d.ts +12 -0
  199. package/dist/types/utils/schema/spill.d.ts +8 -0
  200. package/dist/types/utils/schema/stamps.d.ts +25 -0
  201. package/dist/types/utils/schema/types.d.ts +4 -0
  202. package/dist/types/utils/schema/wire.d.ts +54 -0
  203. package/dist/types/utils/schema/zod-decontaminate.d.ts +31 -0
  204. package/dist/types/utils/sse-debug.d.ts +10 -0
  205. package/dist/types/utils/tool-call-healing.d.ts +80 -0
  206. package/dist/types/utils/tool-choice-capability.d.ts +57 -0
  207. package/dist/types/utils/tool-choice.d.ts +50 -0
  208. package/dist/types/utils/validation.d.ts +17 -0
  209. package/dist/types/utils.d.ts +117 -0
  210. package/package.json +152 -0
  211. package/src/adapter-internals/provider-safety-stop.d.ts +45 -0
  212. package/src/adapter-internals/provider-safety-stop.ts +156 -0
  213. package/src/api-registry.d.ts +30 -0
  214. package/src/api-registry.ts +96 -0
  215. package/src/auth-broker/client.ts +444 -0
  216. package/src/auth-broker/index.ts +5 -0
  217. package/src/auth-broker/redact.ts +39 -0
  218. package/src/auth-broker/refresher.ts +130 -0
  219. package/src/auth-broker/remote-store.ts +1576 -0
  220. package/src/auth-broker/server.ts +764 -0
  221. package/src/auth-broker/types.ts +164 -0
  222. package/src/auth-broker/wire-schemas.ts +261 -0
  223. package/src/auth-gateway/http.ts +198 -0
  224. package/src/auth-gateway/index.ts +3 -0
  225. package/src/auth-gateway/server.ts +1315 -0
  226. package/src/auth-gateway/types.ts +160 -0
  227. package/src/auth-storage.ts +7312 -0
  228. package/src/cli.ts +269 -0
  229. package/src/codex-tools.d.ts +4 -0
  230. package/src/codex-tools.ts +24 -0
  231. package/src/context-cap-policy.d.ts +68 -0
  232. package/src/context-cap-policy.ts +123 -0
  233. package/src/core.ts +44 -0
  234. package/src/index.ts +61 -0
  235. package/src/model-cache.ts +236 -0
  236. package/src/model-manager.ts +744 -0
  237. package/src/model-pricing.d.ts +3 -0
  238. package/src/model-pricing.ts +68 -0
  239. package/src/model-retirements.d.ts +6 -0
  240. package/src/model-retirements.ts +19 -0
  241. package/src/model-thinking.d.ts +100 -0
  242. package/src/model-thinking.ts +1054 -0
  243. package/src/models.d.ts +21 -0
  244. package/src/models.json +94672 -0
  245. package/src/models.json.d.ts +9 -0
  246. package/src/models.ts +126 -0
  247. package/src/openai-completions-compat.d.ts +34 -0
  248. package/src/openai-completions-compat.ts +383 -0
  249. package/src/prompts/composer-bash-policy-recovery.md +1 -0
  250. package/src/prompts/cursor-composer-bash-policy-recovery.md +1 -0
  251. package/src/prompts/cursor-composer-edit-discipline.md +7 -0
  252. package/src/prompts/turn-aborted-guidance.md +4 -0
  253. package/src/provider-details.ts +90 -0
  254. package/src/provider-models/bundled-references.ts +38 -0
  255. package/src/provider-models/descriptors.ts +392 -0
  256. package/src/provider-models/google.ts +92 -0
  257. package/src/provider-models/index.ts +5 -0
  258. package/src/provider-models/ollama.ts +159 -0
  259. package/src/provider-models/openai-compat.ts +2920 -0
  260. package/src/provider-models/special.ts +185 -0
  261. package/src/providers/amazon-bedrock.d.ts +60 -0
  262. package/src/providers/amazon-bedrock.ts +939 -0
  263. package/src/providers/anthropic-messages-server-schema.ts +229 -0
  264. package/src/providers/anthropic-messages-server.ts +839 -0
  265. package/src/providers/anthropic.d.ts +280 -0
  266. package/src/providers/anthropic.ts +4421 -0
  267. package/src/providers/aws-credential-config.d.ts +19 -0
  268. package/src/providers/aws-credential-config.ts +179 -0
  269. package/src/providers/aws-credentials.d.ts +43 -0
  270. package/src/providers/aws-credentials.ts +457 -0
  271. package/src/providers/aws-eventstream.d.ts +38 -0
  272. package/src/providers/aws-eventstream.ts +185 -0
  273. package/src/providers/aws-sigv4.d.ts +55 -0
  274. package/src/providers/aws-sigv4.ts +218 -0
  275. package/src/providers/azure-openai-responses.d.ts +22 -0
  276. package/src/providers/azure-openai-responses.ts +447 -0
  277. package/src/providers/composer-discipline.d.ts +32 -0
  278. package/src/providers/composer-discipline.ts +95 -0
  279. package/src/providers/cursor/client-version.d.ts +10 -0
  280. package/src/providers/cursor/client-version.ts +10 -0
  281. package/src/providers/cursor/exec-modern.d.ts +98 -0
  282. package/src/providers/cursor/exec-modern.ts +497 -0
  283. package/src/providers/cursor/gen/agent_pb.d.ts +16769 -0
  284. package/src/providers/cursor/gen/agent_pb.ts +19780 -0
  285. package/src/providers/cursor/proto/agent.proto +4533 -0
  286. package/src/providers/cursor/proto/buf.gen.yaml +6 -0
  287. package/src/providers/cursor/proto/buf.yaml +17 -0
  288. package/src/providers/cursor-pi-args.d.ts +119 -0
  289. package/src/providers/cursor-pi-args.ts +187 -0
  290. package/src/providers/cursor.d.ts +72 -0
  291. package/src/providers/cursor.ts +3396 -0
  292. package/src/providers/dashscope-token-plan-headers.d.ts +57 -0
  293. package/src/providers/dashscope-token-plan-headers.ts +84 -0
  294. package/src/providers/error-message.d.ts +27 -0
  295. package/src/providers/error-message.ts +21 -0
  296. package/src/providers/github-copilot-headers.d.ts +40 -0
  297. package/src/providers/github-copilot-headers.ts +140 -0
  298. package/src/providers/gitlab-duo.d.ts +27 -0
  299. package/src/providers/gitlab-duo.ts +393 -0
  300. package/src/providers/google-auth.d.ts +26 -0
  301. package/src/providers/google-auth.ts +262 -0
  302. package/src/providers/google-gemini-cli.d.ts +75 -0
  303. package/src/providers/google-gemini-cli.ts +969 -0
  304. package/src/providers/google-gemini-headers.d.ts +43 -0
  305. package/src/providers/google-gemini-headers.ts +100 -0
  306. package/src/providers/google-shared.d.ts +183 -0
  307. package/src/providers/google-shared.ts +1105 -0
  308. package/src/providers/google-types.d.ts +138 -0
  309. package/src/providers/google-types.ts +167 -0
  310. package/src/providers/google-vertex.d.ts +11 -0
  311. package/src/providers/google-vertex.ts +124 -0
  312. package/src/providers/google.d.ts +4 -0
  313. package/src/providers/google.ts +41 -0
  314. package/src/providers/grammar.d.ts +1 -0
  315. package/src/providers/grammar.ts +70 -0
  316. package/src/providers/kimi.d.ts +27 -0
  317. package/src/providers/kimi.ts +52 -0
  318. package/src/providers/kiro-api-key.d.ts +50 -0
  319. package/src/providers/kiro-api-key.ts +786 -0
  320. package/src/providers/kiro-codewhisperer.d.ts +11 -0
  321. package/src/providers/kiro-codewhisperer.ts +600 -0
  322. package/src/providers/mock.ts +526 -0
  323. package/src/providers/ollama.d.ts +41 -0
  324. package/src/providers/ollama.ts +645 -0
  325. package/src/providers/openai-anthropic-shim.d.ts +31 -0
  326. package/src/providers/openai-anthropic-shim.ts +156 -0
  327. package/src/providers/openai-bounded-rate-limits.d.ts +3 -0
  328. package/src/providers/openai-bounded-rate-limits.ts +57 -0
  329. package/src/providers/openai-chat-server-schema.ts +254 -0
  330. package/src/providers/openai-chat-server.ts +724 -0
  331. package/src/providers/openai-codex/constants.d.ts +26 -0
  332. package/src/providers/openai-codex/constants.ts +43 -0
  333. package/src/providers/openai-codex/request-transformer.d.ts +50 -0
  334. package/src/providers/openai-codex/request-transformer.ts +219 -0
  335. package/src/providers/openai-codex/response-handler.d.ts +18 -0
  336. package/src/providers/openai-codex/response-handler.ts +111 -0
  337. package/src/providers/openai-codex-responses.d.ts +71 -0
  338. package/src/providers/openai-codex-responses.ts +3288 -0
  339. package/src/providers/openai-completions-compat.d.ts +6 -0
  340. package/src/providers/openai-completions-compat.ts +6 -0
  341. package/src/providers/openai-completions.d.ts +35 -0
  342. package/src/providers/openai-completions.ts +2294 -0
  343. package/src/providers/openai-opencodex-responses.ts +174 -0
  344. package/src/providers/openai-request-transform.d.ts +4 -0
  345. package/src/providers/openai-request-transform.ts +136 -0
  346. package/src/providers/openai-responses-server-schema.ts +290 -0
  347. package/src/providers/openai-responses-server.ts +1268 -0
  348. package/src/providers/openai-responses-shared.d.ts +106 -0
  349. package/src/providers/openai-responses-shared.ts +1253 -0
  350. package/src/providers/openai-responses.d.ts +37 -0
  351. package/src/providers/openai-responses.ts +989 -0
  352. package/src/providers/pi-native-client.d.ts +29 -0
  353. package/src/providers/pi-native-client.ts +243 -0
  354. package/src/providers/pi-native-server.ts +488 -0
  355. package/src/providers/register-builtins.d.ts +59 -0
  356. package/src/providers/register-builtins.ts +544 -0
  357. package/src/providers/synthetic.d.ts +26 -0
  358. package/src/providers/synthetic.ts +50 -0
  359. package/src/providers/transform-messages.d.ts +33 -0
  360. package/src/providers/transform-messages.ts +408 -0
  361. package/src/providers/vision-guard.d.ts +8 -0
  362. package/src/providers/vision-guard.ts +31 -0
  363. package/src/rate-limit-utils.d.ts +19 -0
  364. package/src/rate-limit-utils.ts +102 -0
  365. package/src/stream.d.ts +45 -0
  366. package/src/stream.ts +1306 -0
  367. package/src/types.d.ts +1073 -0
  368. package/src/types.ts +1305 -0
  369. package/src/usage/claude.ts +449 -0
  370. package/src/usage/gemini.ts +250 -0
  371. package/src/usage/github-copilot.ts +421 -0
  372. package/src/usage/google-antigravity.ts +201 -0
  373. package/src/usage/grok-cli.ts +259 -0
  374. package/src/usage/kimi.ts +285 -0
  375. package/src/usage/minimax-code.ts +31 -0
  376. package/src/usage/openai-codex.ts +503 -0
  377. package/src/usage/shared.ts +10 -0
  378. package/src/usage/zai.ts +247 -0
  379. package/src/usage.ts +190 -0
  380. package/src/utils/abort.d.ts +19 -0
  381. package/src/utils/abort.ts +51 -0
  382. package/src/utils/anthropic-auth.ts +95 -0
  383. package/src/utils/block-symbols.d.ts +6 -0
  384. package/src/utils/block-symbols.ts +11 -0
  385. package/src/utils/discovery/antigravity.ts +275 -0
  386. package/src/utils/discovery/codex.ts +362 -0
  387. package/src/utils/discovery/cursor.ts +388 -0
  388. package/src/utils/discovery/gemini.ts +248 -0
  389. package/src/utils/discovery/index.ts +4 -0
  390. package/src/utils/discovery/openai-compatible.ts +379 -0
  391. package/src/utils/event-stream.d.ts +41 -0
  392. package/src/utils/event-stream.ts +269 -0
  393. package/src/utils/fallback-transport.d.ts +110 -0
  394. package/src/utils/fallback-transport.ts +411 -0
  395. package/src/utils/fireworks-model-id.d.ts +10 -0
  396. package/src/utils/fireworks-model-id.ts +30 -0
  397. package/src/utils/foundry.d.ts +11 -0
  398. package/src/utils/foundry.ts +18 -0
  399. package/src/utils/h2-fetch.ts +60 -0
  400. package/src/utils/http-inspector.d.ts +59 -0
  401. package/src/utils/http-inspector.ts +380 -0
  402. package/src/utils/idle-iterator.d.ts +122 -0
  403. package/src/utils/idle-iterator.ts +410 -0
  404. package/src/utils/json-parse.d.ts +98 -0
  405. package/src/utils/json-parse.ts +607 -0
  406. package/src/utils/oauth/alibaba-token-plan.ts +60 -0
  407. package/src/utils/oauth/anthropic.ts +233 -0
  408. package/src/utils/oauth/api-key-login.ts +98 -0
  409. package/src/utils/oauth/api-key-validation.ts +344 -0
  410. package/src/utils/oauth/bizrouter.ts +15 -0
  411. package/src/utils/oauth/callback-server.d.ts +80 -0
  412. package/src/utils/oauth/callback-server.ts +359 -0
  413. package/src/utils/oauth/cerebras.ts +16 -0
  414. package/src/utils/oauth/cloudflare-ai-gateway.ts +48 -0
  415. package/src/utils/oauth/commandcode.ts +17 -0
  416. package/src/utils/oauth/cursor.ts +157 -0
  417. package/src/utils/oauth/deepinfra.ts +15 -0
  418. package/src/utils/oauth/deepseek.ts +53 -0
  419. package/src/utils/oauth/firepass.ts +24 -0
  420. package/src/utils/oauth/fireworks.ts +15 -0
  421. package/src/utils/oauth/fugu.ts +15 -0
  422. package/src/utils/oauth/github-copilot.d.ts +38 -0
  423. package/src/utils/oauth/github-copilot.ts +362 -0
  424. package/src/utils/oauth/gitlab-duo.ts +123 -0
  425. package/src/utils/oauth/glm-zcode.d.ts +71 -0
  426. package/src/utils/oauth/glm-zcode.ts +433 -0
  427. package/src/utils/oauth/google-antigravity.ts +200 -0
  428. package/src/utils/oauth/google-gemini-cli.ts +256 -0
  429. package/src/utils/oauth/google-oauth-shared.ts +110 -0
  430. package/src/utils/oauth/huggingface.ts +62 -0
  431. package/src/utils/oauth/index.ts +558 -0
  432. package/src/utils/oauth/kagi.ts +47 -0
  433. package/src/utils/oauth/kilo.ts +87 -0
  434. package/src/utils/oauth/kimi.d.ts +17 -0
  435. package/src/utils/oauth/kimi.ts +275 -0
  436. package/src/utils/oauth/kiro.ts +448 -0
  437. package/src/utils/oauth/litellm.ts +47 -0
  438. package/src/utils/oauth/lm-studio.ts +38 -0
  439. package/src/utils/oauth/mara.ts +16 -0
  440. package/src/utils/oauth/minimax-code.ts +78 -0
  441. package/src/utils/oauth/moonshot.ts +16 -0
  442. package/src/utils/oauth/nanogpt.ts +15 -0
  443. package/src/utils/oauth/nvidia.ts +70 -0
  444. package/src/utils/oauth/oauth.html +199 -0
  445. package/src/utils/oauth/ollama-cloud.ts +28 -0
  446. package/src/utils/oauth/ollama.ts +47 -0
  447. package/src/utils/oauth/openai-codex.ts +299 -0
  448. package/src/utils/oauth/opencode.ts +49 -0
  449. package/src/utils/oauth/opengateway.ts +15 -0
  450. package/src/utils/oauth/openrouter.ts +16 -0
  451. package/src/utils/oauth/parallel.ts +46 -0
  452. package/src/utils/oauth/perplexity.ts +225 -0
  453. package/src/utils/oauth/pkce.ts +18 -0
  454. package/src/utils/oauth/qianfan.ts +58 -0
  455. package/src/utils/oauth/qwen-portal.ts +60 -0
  456. package/src/utils/oauth/sglang.ts +42 -0
  457. package/src/utils/oauth/synthetic.ts +15 -0
  458. package/src/utils/oauth/tavily.ts +46 -0
  459. package/src/utils/oauth/together.ts +16 -0
  460. package/src/utils/oauth/types.d.ts +56 -0
  461. package/src/utils/oauth/types.ts +122 -0
  462. package/src/utils/oauth/venice.ts +59 -0
  463. package/src/utils/oauth/vercel-ai-gateway.ts +47 -0
  464. package/src/utils/oauth/vllm.ts +42 -0
  465. package/src/utils/oauth/xai.ts +246 -0
  466. package/src/utils/oauth/xiaomi.ts +199 -0
  467. package/src/utils/oauth/zai.ts +60 -0
  468. package/src/utils/oauth/zenmux.ts +15 -0
  469. package/src/utils/overflow.ts +275 -0
  470. package/src/utils/parse-bind.ts +81 -0
  471. package/src/utils/provider-response.d.ts +6 -0
  472. package/src/utils/provider-response.ts +30 -0
  473. package/src/utils/provider-safety-stop.ts +8 -0
  474. package/src/utils/proxy.d.ts +7 -0
  475. package/src/utils/proxy.ts +652 -0
  476. package/src/utils/retry-after.d.ts +3 -0
  477. package/src/utils/retry-after.ts +110 -0
  478. package/src/utils/retry-budget.d.ts +1 -0
  479. package/src/utils/retry-budget.ts +4 -0
  480. package/src/utils/retry.d.ts +29 -0
  481. package/src/utils/retry.ts +67 -0
  482. package/src/utils/schema/CONSTRAINTS.md +164 -0
  483. package/src/utils/schema/adapt.d.ts +24 -0
  484. package/src/utils/schema/adapt.ts +36 -0
  485. package/src/utils/schema/compatibility.d.ts +30 -0
  486. package/src/utils/schema/compatibility.ts +435 -0
  487. package/src/utils/schema/dereference.d.ts +11 -0
  488. package/src/utils/schema/dereference.ts +98 -0
  489. package/src/utils/schema/draft.d.ts +10 -0
  490. package/src/utils/schema/draft.ts +341 -0
  491. package/src/utils/schema/equality.d.ts +4 -0
  492. package/src/utils/schema/equality.ts +97 -0
  493. package/src/utils/schema/fields.d.ts +49 -0
  494. package/src/utils/schema/fields.ts +190 -0
  495. package/src/utils/schema/index.d.ts +14 -0
  496. package/src/utils/schema/index.ts +14 -0
  497. package/src/utils/schema/json-schema-validator.d.ts +12 -0
  498. package/src/utils/schema/json-schema-validator.ts +577 -0
  499. package/src/utils/schema/meta-validator.d.ts +2 -0
  500. package/src/utils/schema/meta-validator.ts +167 -0
  501. package/src/utils/schema/normalize.d.ts +93 -0
  502. package/src/utils/schema/normalize.ts +1588 -0
  503. package/src/utils/schema/root-combinator.d.ts +12 -0
  504. package/src/utils/schema/root-combinator.ts +143 -0
  505. package/src/utils/schema/spill.d.ts +8 -0
  506. package/src/utils/schema/spill.ts +43 -0
  507. package/src/utils/schema/stamps.d.ts +25 -0
  508. package/src/utils/schema/stamps.ts +97 -0
  509. package/src/utils/schema/types.d.ts +4 -0
  510. package/src/utils/schema/types.ts +11 -0
  511. package/src/utils/schema/wire.d.ts +54 -0
  512. package/src/utils/schema/wire.ts +213 -0
  513. package/src/utils/schema/zod-decontaminate.d.ts +31 -0
  514. package/src/utils/schema/zod-decontaminate.ts +331 -0
  515. package/src/utils/sse-debug.d.ts +10 -0
  516. package/src/utils/sse-debug.ts +289 -0
  517. package/src/utils/tool-call-healing.d.ts +80 -0
  518. package/src/utils/tool-call-healing.ts +298 -0
  519. package/src/utils/tool-choice-capability.d.ts +57 -0
  520. package/src/utils/tool-choice-capability.ts +633 -0
  521. package/src/utils/tool-choice.d.ts +50 -0
  522. package/src/utils/tool-choice.ts +99 -0
  523. package/src/utils/validation.ts +1080 -0
  524. package/src/utils.d.ts +117 -0
  525. package/src/utils.ts +523 -0
@@ -0,0 +1,19 @@
1
+ import type { AwsCredentials } from "./aws-sigv4";
2
+ export type AwsIniFile = Record<string, Record<string, string>>;
3
+ export interface AwsCredentialSourceOptions {
4
+ profile?: string;
5
+ }
6
+ export interface AwsCredentialSource {
7
+ profile: string;
8
+ credentialsPath: string;
9
+ configPath: string;
10
+ }
11
+ export type AwsProfileCapability = "static" | "process" | "sso" | undefined;
12
+ export declare function parseAwsIni(text: string): AwsIniFile;
13
+ export declare function resolveAwsCredentialSource(options?: AwsCredentialSourceOptions): AwsCredentialSource;
14
+ export declare function readAwsStaticEnvironmentCredentials(): AwsCredentials | undefined;
15
+ export declare function classifyAwsProfileCapability(profile: string, credentialsIni: AwsIniFile | undefined, configIni: AwsIniFile | undefined): AwsProfileCapability;
16
+ export declare function hasResolvableAwsProfileSource(options?: AwsCredentialSourceOptions & {
17
+ onScan?: () => void;
18
+ }, now?: number): boolean;
19
+ export declare function isValidBedrockBearerToken(token: string | undefined): token is string;
@@ -0,0 +1,179 @@
1
+ import * as fs from "node:fs";
2
+ import * as path from "node:path";
3
+ import { $credentialEnv, getTrustedHomeDir } from "@vib-rato/utils";
4
+ import type { AwsCredentials } from "./aws-sigv4";
5
+
6
+ export type AwsIniFile = Record<string, Record<string, string>>;
7
+
8
+ export interface AwsCredentialSourceOptions {
9
+ profile?: string;
10
+ }
11
+
12
+ export interface AwsCredentialSource {
13
+ profile: string;
14
+ credentialsPath: string;
15
+ configPath: string;
16
+ }
17
+
18
+ export type AwsProfileCapability = "static" | "process" | "sso" | undefined;
19
+
20
+ const AVAILABILITY_CACHE_MAX_AGE_MS = 1_000;
21
+ const MAX_AWS_INI_FILE_BYTES = 1024 * 1024;
22
+
23
+ interface FileFingerprint {
24
+ exists: boolean;
25
+ size?: number;
26
+ mtimeMs?: number;
27
+ ctimeMs?: number;
28
+ ino?: number;
29
+ }
30
+
31
+ interface AvailabilityCacheEntry {
32
+ source: AwsCredentialSource;
33
+ credentials: FileFingerprint;
34
+ config: FileFingerprint;
35
+ value: boolean;
36
+ checkedAt: number;
37
+ }
38
+
39
+ let availabilityCache: AvailabilityCacheEntry | undefined;
40
+
41
+ export function parseAwsIni(text: string): AwsIniFile {
42
+ const out: AwsIniFile = {};
43
+ let current: Record<string, string> | undefined;
44
+ for (const rawLine of text.split(/\r?\n/)) {
45
+ const line = rawLine.trim();
46
+ if (!line || line.startsWith("#") || line.startsWith(";")) continue;
47
+ if (line.startsWith("[") && line.endsWith("]")) {
48
+ let name = line.slice(1, -1).trim();
49
+ if (name.startsWith("profile ")) name = name.slice(8).trim();
50
+ if (name.startsWith("sso-session ")) name = `sso-session:${name.slice(12).trim()}`;
51
+ current = out[name] ??= {};
52
+ continue;
53
+ }
54
+ if (!current) continue;
55
+ const equals = line.indexOf("=");
56
+ if (equals === -1) continue;
57
+ const key = line.slice(0, equals).trim();
58
+ const value = line.slice(equals + 1).trim();
59
+ if (key) current[key] = value;
60
+ }
61
+ return out;
62
+ }
63
+
64
+ export function resolveAwsCredentialSource(options: AwsCredentialSourceOptions = {}): AwsCredentialSource {
65
+ const profile = options.profile || $credentialEnv("AWS_PROFILE") || "default";
66
+ const home = getTrustedHomeDir();
67
+ return {
68
+ profile,
69
+ credentialsPath: path.resolve(
70
+ $credentialEnv("AWS_SHARED_CREDENTIALS_FILE") || path.join(home, ".aws", "credentials"),
71
+ ),
72
+ configPath: path.resolve($credentialEnv("AWS_CONFIG_FILE") || path.join(home, ".aws", "config")),
73
+ };
74
+ }
75
+
76
+ export function readAwsStaticEnvironmentCredentials(): AwsCredentials | undefined {
77
+ const accessKeyId = $credentialEnv("AWS_ACCESS_KEY_ID");
78
+ const secretAccessKey = $credentialEnv("AWS_SECRET_ACCESS_KEY");
79
+ if (!accessKeyId || !secretAccessKey) return undefined;
80
+ const sessionToken = $credentialEnv("AWS_SESSION_TOKEN");
81
+ return sessionToken ? { accessKeyId, secretAccessKey, sessionToken } : { accessKeyId, secretAccessKey };
82
+ }
83
+
84
+ export function classifyAwsProfileCapability(
85
+ profile: string,
86
+ credentialsIni: AwsIniFile | undefined,
87
+ configIni: AwsIniFile | undefined,
88
+ ): AwsProfileCapability {
89
+ const merged = { ...(configIni?.[profile] ?? {}), ...(credentialsIni?.[profile] ?? {}) };
90
+ if (merged.aws_access_key_id && merged.aws_secret_access_key) return "static";
91
+ if (merged.sso_account_id && merged.sso_role_name) {
92
+ if (merged.sso_start_url && merged.sso_region) return "sso";
93
+ const session = merged.sso_session ? configIni?.[`sso-session:${merged.sso_session}`] : undefined;
94
+ if (session?.sso_start_url && session.sso_region) return "sso";
95
+ }
96
+ if (merged.credential_process) return "process";
97
+ return undefined;
98
+ }
99
+
100
+ export function hasResolvableAwsProfileSource(
101
+ options: AwsCredentialSourceOptions & { /** @internal Test-only cache scan observer. */ onScan?: () => void } = {},
102
+ now = Date.now(),
103
+ ): boolean {
104
+ const source = resolveAwsCredentialSource(options);
105
+ const credentials = fingerprint(source.credentialsPath);
106
+ const config = fingerprint(source.configPath);
107
+ if (
108
+ availabilityCache &&
109
+ now >= availabilityCache.checkedAt &&
110
+ now - availabilityCache.checkedAt < AVAILABILITY_CACHE_MAX_AGE_MS &&
111
+ sameSource(availabilityCache.source, source) &&
112
+ sameFingerprint(availabilityCache.credentials, credentials) &&
113
+ sameFingerprint(availabilityCache.config, config)
114
+ ) {
115
+ return availabilityCache.value;
116
+ }
117
+ options.onScan?.();
118
+ const credentialsIni = readAwsIniSync(source.credentialsPath);
119
+ const configIni = readAwsIniSync(source.configPath);
120
+ const value = classifyAwsProfileCapability(source.profile, credentialsIni, configIni) !== undefined;
121
+ availabilityCache = { source, credentials, config, value, checkedAt: now };
122
+ return value;
123
+ }
124
+
125
+ export function isValidBedrockBearerToken(token: string | undefined): token is string {
126
+ if (!token) return false;
127
+ return !/[\x00-\x1f\x7f]/.test(token);
128
+ }
129
+
130
+ function readAwsIniSync(filePath: string): AwsIniFile | undefined {
131
+ let fd: number | undefined;
132
+ try {
133
+ fd = fs.openSync(filePath, fs.constants.O_RDONLY | fs.constants.O_NONBLOCK);
134
+ const stat = fs.fstatSync(fd);
135
+ if (!stat.isFile() || stat.size > MAX_AWS_INI_FILE_BYTES) return undefined;
136
+ const contents = Buffer.allocUnsafe(MAX_AWS_INI_FILE_BYTES + 1);
137
+ let bytesRead = 0;
138
+ while (bytesRead < contents.length) {
139
+ const count = fs.readSync(fd, contents, bytesRead, contents.length - bytesRead, bytesRead);
140
+ if (count === 0) break;
141
+ bytesRead += count;
142
+ }
143
+ if (bytesRead > MAX_AWS_INI_FILE_BYTES) return undefined;
144
+ return parseAwsIni(contents.toString("utf8", 0, bytesRead));
145
+ } catch {
146
+ return undefined;
147
+ } finally {
148
+ if (fd !== undefined) {
149
+ try {
150
+ fs.closeSync(fd);
151
+ } catch {
152
+ // Ignore close errors because file availability has already been determined.
153
+ }
154
+ }
155
+ }
156
+ }
157
+
158
+ function fingerprint(filePath: string): FileFingerprint {
159
+ try {
160
+ const stat = fs.statSync(filePath);
161
+ return { exists: true, size: stat.size, mtimeMs: stat.mtimeMs, ctimeMs: stat.ctimeMs, ino: stat.ino };
162
+ } catch {
163
+ return { exists: false };
164
+ }
165
+ }
166
+
167
+ function sameSource(a: AwsCredentialSource, b: AwsCredentialSource): boolean {
168
+ return a.profile === b.profile && a.credentialsPath === b.credentialsPath && a.configPath === b.configPath;
169
+ }
170
+
171
+ function sameFingerprint(a: FileFingerprint, b: FileFingerprint): boolean {
172
+ return (
173
+ a.exists === b.exists &&
174
+ a.size === b.size &&
175
+ a.mtimeMs === b.mtimeMs &&
176
+ a.ctimeMs === b.ctimeMs &&
177
+ a.ino === b.ino
178
+ );
179
+ }
@@ -0,0 +1,43 @@
1
+ /**
2
+ * AWS credential resolution for the Bedrock provider.
3
+ *
4
+ * Chain (first hit wins):
5
+ * 1. Static credentials from the environment
6
+ * (`AWS_ACCESS_KEY_ID` + `AWS_SECRET_ACCESS_KEY` [+ `AWS_SESSION_TOKEN`]).
7
+ * 2. Profile in `~/.aws/credentials` (and `~/.aws/config` for SSO):
8
+ * - static `aws_access_key_id` / `aws_secret_access_key` / `aws_session_token`
9
+ * - SSO profile referencing a cached token in `~/.aws/sso/cache/*.json`,
10
+ * which we exchange for short-lived role credentials via
11
+ * `https://portal.sso.{region}.amazonaws.com/federation/credentials`.
12
+ * - `credential_process` — an external command emitting the AWS SDK
13
+ * `Version: 1` JSON envelope on stdout. Used by `aws-vault`, `granted`,
14
+ * in-house brokers, etc.
15
+ * 3. EC2 IMDSv2 (only when `AWS_EC2_METADATA_DISABLED` is unset / falsey and
16
+ * `169.254.169.254` is reachable within a 1 s timeout).
17
+ *
18
+ * Resolved credentials are cached process-wide per profile and refreshed
19
+ * 60 s before `Expiration` to absorb clock skew.
20
+ */
21
+ import type { AwsCredentials } from "./aws-sigv4";
22
+ export interface ResolvedCredentials extends AwsCredentials {
23
+ /** Absolute expiration timestamp in ms. `undefined` for non-expiring static creds. */
24
+ expiresAt?: number;
25
+ }
26
+ export interface CredentialResolveOptions {
27
+ /** Named profile from `~/.aws/credentials` / `~/.aws/config`. */
28
+ profile?: string;
29
+ /** Falls back to env (`AWS_REGION` / `AWS_DEFAULT_REGION`) and finally `us-east-1`. */
30
+ region?: string;
31
+ signal?: AbortSignal;
32
+ }
33
+ export declare function resolveAwsCredentials(opts?: CredentialResolveOptions): Promise<ResolvedCredentials>;
34
+ /** POSIX-shell-style tokenizer used by the AWS CLI for `credential_process`.
35
+ *
36
+ * Outside quotes a backslash escapes the next character. Inside single quotes
37
+ * everything is literal (no escapes, cannot contain `'`). Inside double quotes
38
+ * a backslash only escapes `$`, `` ` ``, `"`, and `\` — every other backslash
39
+ * is preserved verbatim, which is what makes Windows paths like
40
+ * `"C:\Program Files\tool\auth.exe"` survive tokenization. */
41
+ export declare function tokenizeCredentialProcessCommand(cmd: string): string[];
42
+ /** Test/diagnostic helper — drops cached credentials. */
43
+ export declare function clearAwsCredentialCache(): void;
@@ -0,0 +1,457 @@
1
+ /**
2
+ * AWS credential resolution for the Bedrock provider.
3
+ *
4
+ * Chain (first hit wins):
5
+ * 1. Static credentials from the environment
6
+ * (`AWS_ACCESS_KEY_ID` + `AWS_SECRET_ACCESS_KEY` [+ `AWS_SESSION_TOKEN`]).
7
+ * 2. Profile in `~/.aws/credentials` (and `~/.aws/config` for SSO):
8
+ * - static `aws_access_key_id` / `aws_secret_access_key` / `aws_session_token`
9
+ * - SSO profile referencing a cached token in `~/.aws/sso/cache/*.json`,
10
+ * which we exchange for short-lived role credentials via
11
+ * `https://portal.sso.{region}.amazonaws.com/federation/credentials`.
12
+ * - `credential_process` — an external command emitting the AWS SDK
13
+ * `Version: 1` JSON envelope on stdout. Used by `aws-vault`, `granted`,
14
+ * in-house brokers, etc.
15
+ * 3. EC2 IMDSv2 (only when `AWS_EC2_METADATA_DISABLED` is unset / falsey and
16
+ * `169.254.169.254` is reachable within a 1 s timeout).
17
+ *
18
+ * Resolved credentials are cached process-wide per profile and refreshed
19
+ * 60 s before `Expiration` to absorb clock skew.
20
+ */
21
+
22
+ import * as fs from "node:fs";
23
+ import * as path from "node:path";
24
+ import { $env, getTrustedHomeDir, isEnoent, logger } from "@vib-rato/utils";
25
+ import {
26
+ type AwsIniFile,
27
+ classifyAwsProfileCapability,
28
+ parseAwsIni,
29
+ readAwsStaticEnvironmentCredentials,
30
+ resolveAwsCredentialSource,
31
+ } from "./aws-credential-config";
32
+ import type { AwsCredentials } from "./aws-sigv4";
33
+
34
+ export interface ResolvedCredentials extends AwsCredentials {
35
+ /** Absolute expiration timestamp in ms. `undefined` for non-expiring static creds. */
36
+ expiresAt?: number;
37
+ }
38
+
39
+ export interface CredentialResolveOptions {
40
+ /** Named profile from `~/.aws/credentials` / `~/.aws/config`. */
41
+ profile?: string;
42
+ /** Falls back to env (`AWS_REGION` / `AWS_DEFAULT_REGION`) and finally `us-east-1`. */
43
+ region?: string;
44
+ signal?: AbortSignal;
45
+ }
46
+
47
+ const REFRESH_SKEW_MS = 60_000;
48
+
49
+ interface CacheEntry {
50
+ creds: ResolvedCredentials;
51
+ expiresAt: number;
52
+ }
53
+
54
+ const cache: Map<string, CacheEntry> = new Map();
55
+
56
+ export async function resolveAwsCredentials(opts: CredentialResolveOptions = {}): Promise<ResolvedCredentials> {
57
+ const profile = resolveAwsCredentialSource({ profile: opts.profile }).profile;
58
+ const region = opts.region || $env.AWS_REGION || $env.AWS_DEFAULT_REGION || "us-east-1";
59
+ const cacheKey = `${profile}\x00${region}`;
60
+
61
+ const hit = cache.get(cacheKey);
62
+ if (hit && hit.expiresAt - REFRESH_SKEW_MS > Date.now()) return hit.creds;
63
+
64
+ const creds = await resolveFresh(profile, region, opts.signal);
65
+ cache.set(cacheKey, { creds, expiresAt: creds.expiresAt ?? Number.POSITIVE_INFINITY });
66
+ return creds;
67
+ }
68
+
69
+ async function resolveFresh(profile: string, region: string, signal?: AbortSignal): Promise<ResolvedCredentials> {
70
+ // 1. Environment first — matches the AWS SDK chain order.
71
+ const envCreds = readAwsStaticEnvironmentCredentials();
72
+ if (envCreds) return envCreds;
73
+
74
+ // 2. Profile (static or SSO).
75
+ const profileCreds = await readProfileCredentials(profile, region, signal);
76
+ if (profileCreds) return profileCreds;
77
+
78
+ // 3. EC2 IMDSv2.
79
+ if ($env.AWS_EC2_METADATA_DISABLED?.toLowerCase() !== "true") {
80
+ const imdsCreds = await readImdsCredentials(signal);
81
+ if (imdsCreds) return imdsCreds;
82
+ }
83
+
84
+ throw new Error(
85
+ `Unable to resolve AWS credentials. Set AWS_ACCESS_KEY_ID+AWS_SECRET_ACCESS_KEY, ` +
86
+ `or configure profile '${profile}' in ~/.aws/credentials (or ~/.aws/config for SSO).`,
87
+ );
88
+ }
89
+
90
+ async function readIniFile(p: string): Promise<AwsIniFile | undefined> {
91
+ try {
92
+ const text = await fs.promises.readFile(p, "utf8");
93
+ return parseAwsIni(text);
94
+ } catch (err) {
95
+ if (isEnoent(err)) return undefined;
96
+ throw err;
97
+ }
98
+ }
99
+
100
+ // ---------- Profile / SSO ----------
101
+
102
+ async function readProfileCredentials(
103
+ profile: string,
104
+ region: string,
105
+ signal: AbortSignal | undefined,
106
+ ): Promise<ResolvedCredentials | undefined> {
107
+ const { credentialsPath, configPath } = resolveAwsCredentialSource({ profile });
108
+
109
+ const credentialsIni = await readIniFile(credentialsPath);
110
+ const configIni = await readIniFile(configPath);
111
+
112
+ // Static credentials live in ~/.aws/credentials; SSO config lives in
113
+ // ~/.aws/config under `[profile foo]`. Merge into a single view.
114
+ const merged: Record<string, string> = { ...(configIni?.[profile] ?? {}), ...(credentialsIni?.[profile] ?? {}) };
115
+ if (Object.keys(merged).length === 0) return undefined;
116
+
117
+ const capability = classifyAwsProfileCapability(profile, credentialsIni, configIni);
118
+ if (capability === "static") {
119
+ const { aws_access_key_id: accessKeyId, aws_secret_access_key: secretAccessKey } = merged;
120
+ if (!accessKeyId || !secretAccessKey) return undefined;
121
+ const out: ResolvedCredentials = { accessKeyId, secretAccessKey };
122
+ if (merged.aws_session_token) out.sessionToken = merged.aws_session_token;
123
+ return out;
124
+ }
125
+ if (capability === "sso") return readSsoCredentials(merged, configIni, region, signal);
126
+ if (capability === "process") return readCredentialProcess(profile, merged.credential_process, signal);
127
+
128
+ return undefined;
129
+ }
130
+
131
+ interface SsoCachedToken {
132
+ accessToken?: string;
133
+ expiresAt?: string;
134
+ startUrl?: string;
135
+ region?: string;
136
+ }
137
+
138
+ async function readSsoCredentials(
139
+ profileCfg: Record<string, string>,
140
+ configIni: AwsIniFile | undefined,
141
+ defaultRegion: string,
142
+ signal: AbortSignal | undefined,
143
+ ): Promise<ResolvedCredentials | undefined> {
144
+ // Two SSO profile shapes:
145
+ // - legacy: `sso_start_url` + `sso_region` directly on the profile
146
+ // - sso-session: `sso_session = my-session` references a `[sso-session my-session]` block
147
+ let startUrl = profileCfg.sso_start_url;
148
+ let ssoRegion = profileCfg.sso_region;
149
+ const sessionName = profileCfg.sso_session;
150
+ if (sessionName && configIni) {
151
+ const session = configIni[`sso-session:${sessionName}`];
152
+ if (session) {
153
+ startUrl = startUrl || session.sso_start_url;
154
+ ssoRegion = ssoRegion || session.sso_region;
155
+ }
156
+ }
157
+ if (!startUrl || !ssoRegion) return undefined;
158
+
159
+ const token = await loadSsoCachedToken(startUrl, sessionName);
160
+ if (!token?.accessToken) {
161
+ throw new Error(`AWS SSO token for ${startUrl} not found in ~/.aws/sso/cache. Run 'aws sso login' first.`);
162
+ }
163
+ const expiresAt = token.expiresAt ? Date.parse(token.expiresAt) : Number.POSITIVE_INFINITY;
164
+ if (Number.isFinite(expiresAt) && expiresAt <= Date.now()) {
165
+ throw new Error(`AWS SSO token for ${startUrl} has expired. Run 'aws sso login' to refresh.`);
166
+ }
167
+
168
+ const url =
169
+ `https://portal.sso.${ssoRegion}.amazonaws.com/federation/credentials` +
170
+ `?account_id=${encodeURIComponent(profileCfg.sso_account_id)}` +
171
+ `&role_name=${encodeURIComponent(profileCfg.sso_role_name)}`;
172
+ const response = await fetch(url, {
173
+ method: "GET",
174
+ headers: { "x-amz-sso_bearer_token": token.accessToken },
175
+ signal,
176
+ });
177
+ if (!response.ok) {
178
+ const body = await response.text().catch(() => "");
179
+ throw new Error(`AWS SSO GetRoleCredentials failed: ${response.status} ${body.slice(0, 200)}`);
180
+ }
181
+ const json = (await response.json()) as {
182
+ roleCredentials?: { accessKeyId: string; secretAccessKey: string; sessionToken: string; expiration: number };
183
+ };
184
+ const role = json.roleCredentials;
185
+ if (!role) throw new Error("AWS SSO GetRoleCredentials: missing roleCredentials in response");
186
+
187
+ // region is honored at the caller; we only consume defaultRegion to keep the
188
+ // param wired for symmetry with other resolution paths.
189
+ void defaultRegion;
190
+
191
+ return {
192
+ accessKeyId: role.accessKeyId,
193
+ secretAccessKey: role.secretAccessKey,
194
+ sessionToken: role.sessionToken,
195
+ expiresAt: role.expiration,
196
+ };
197
+ }
198
+
199
+ async function loadSsoCachedToken(
200
+ startUrl: string,
201
+ sessionName: string | undefined,
202
+ ): Promise<SsoCachedToken | undefined> {
203
+ const cacheDir = path.join(getTrustedHomeDir(), ".aws", "sso", "cache");
204
+ let entries: string[];
205
+ try {
206
+ entries = await fs.promises.readdir(cacheDir);
207
+ } catch (err) {
208
+ if (isEnoent(err)) return undefined;
209
+ throw err;
210
+ }
211
+ // Prefer the deterministic hash for legacy `sso_start_url` profiles or the
212
+ // session name for the newer `sso-session` shape; otherwise scan.
213
+ const candidates: string[] = [];
214
+ const hash = await sha1Hex(sessionName || startUrl);
215
+ candidates.push(`${hash}.json`);
216
+ for (const entry of entries) {
217
+ if (entry.endsWith(".json") && !candidates.includes(entry)) candidates.push(entry);
218
+ }
219
+ for (const file of candidates) {
220
+ if (!entries.includes(file)) continue;
221
+ try {
222
+ const text = await fs.promises.readFile(path.join(cacheDir, file), "utf8");
223
+ const parsed = JSON.parse(text) as SsoCachedToken;
224
+ if (parsed.startUrl === startUrl || (sessionName && file === `${hash}.json`)) {
225
+ return parsed;
226
+ }
227
+ } catch (err) {
228
+ logger.debug("aws-credentials: failed to read SSO cache", { file, err: String(err) });
229
+ }
230
+ }
231
+ return undefined;
232
+ }
233
+
234
+ async function sha1Hex(input: string): Promise<string> {
235
+ const digest = await globalThis.crypto.subtle.digest("SHA-1", new TextEncoder().encode(input));
236
+ const bytes = new Uint8Array(digest);
237
+ let out = "";
238
+ for (let i = 0; i < bytes.length; i++) out += bytes[i].toString(16).padStart(2, "0");
239
+ return out;
240
+ }
241
+
242
+ // ---------- credential_process ----------
243
+
244
+ /** JSON envelope emitted by an external credential process. Matches the
245
+ * AWS CLI / SDK contract documented at
246
+ * https://docs.aws.amazon.com/sdkref/latest/guide/feature-process-credentials.html */
247
+ interface CredentialProcessEnvelope {
248
+ Version?: number;
249
+ AccessKeyId?: string;
250
+ SecretAccessKey?: string;
251
+ SessionToken?: string;
252
+ Expiration?: string;
253
+ }
254
+
255
+ async function readCredentialProcess(
256
+ profile: string,
257
+ command: string,
258
+ signal: AbortSignal | undefined,
259
+ ): Promise<ResolvedCredentials> {
260
+ const argv = buildCredentialProcessArgv(profile, command);
261
+
262
+ const child = Bun.spawn(argv, {
263
+ stdin: "ignore",
264
+ stdout: "pipe",
265
+ stderr: "pipe",
266
+ windowsHide: true,
267
+ signal,
268
+ });
269
+ const [stdout, stderr, exitCode] = await Promise.all([
270
+ new Response(child.stdout).text(),
271
+ new Response(child.stderr).text(),
272
+ child.exited,
273
+ ]);
274
+ if (exitCode !== 0) {
275
+ const tail = stderr.trim().slice(-512) || stdout.trim().slice(-512) || "(no output)";
276
+ throw new Error(`AWS credential_process for profile '${profile}' exited ${exitCode}: ${tail}`);
277
+ }
278
+
279
+ let parsed: CredentialProcessEnvelope;
280
+ try {
281
+ parsed = JSON.parse(stdout) as CredentialProcessEnvelope;
282
+ } catch (err) {
283
+ throw new Error(`AWS credential_process for profile '${profile}' did not emit valid JSON: ${String(err)}`);
284
+ }
285
+ if (parsed.Version !== 1) {
286
+ throw new Error(
287
+ `AWS credential_process for profile '${profile}' returned unsupported Version ${parsed.Version ?? "<missing>"}; expected 1.`,
288
+ );
289
+ }
290
+ if (!parsed.AccessKeyId || !parsed.SecretAccessKey) {
291
+ throw new Error(
292
+ `AWS credential_process for profile '${profile}' returned envelope without AccessKeyId/SecretAccessKey.`,
293
+ );
294
+ }
295
+
296
+ const out: ResolvedCredentials = {
297
+ accessKeyId: parsed.AccessKeyId,
298
+ secretAccessKey: parsed.SecretAccessKey,
299
+ };
300
+ if (parsed.SessionToken) out.sessionToken = parsed.SessionToken;
301
+ if (parsed.Expiration) {
302
+ const exp = Date.parse(parsed.Expiration);
303
+ if (!Number.isNaN(exp)) out.expiresAt = exp;
304
+ }
305
+ return out;
306
+ }
307
+
308
+ /** Resolve the argv for `Bun.spawn`. On Windows we route `.cmd`/`.bat` helpers
309
+ * through `cmd.exe /c` because direct execution refuses batch files (mirrors
310
+ * Node's `execFile` policy and avoids surprise no-ops). */
311
+ function buildCredentialProcessArgv(profile: string, command: string): string[] {
312
+ const tokens = tokenizeCredentialProcessCommand(command);
313
+ if (tokens.length === 0) {
314
+ throw new Error(`AWS credential_process for profile '${profile}' is empty.`);
315
+ }
316
+ if (process.platform === "win32" && isBatchScript(tokens[0])) {
317
+ return ["cmd.exe", "/d", "/s", "/c", command];
318
+ }
319
+ return tokens;
320
+ }
321
+
322
+ function isBatchScript(executable: string): boolean {
323
+ const lower = executable.toLowerCase();
324
+ return lower.endsWith(".cmd") || lower.endsWith(".bat");
325
+ }
326
+
327
+ /** POSIX-shell-style tokenizer used by the AWS CLI for `credential_process`.
328
+ *
329
+ * Outside quotes a backslash escapes the next character. Inside single quotes
330
+ * everything is literal (no escapes, cannot contain `'`). Inside double quotes
331
+ * a backslash only escapes `$`, `` ` ``, `"`, and `\` — every other backslash
332
+ * is preserved verbatim, which is what makes Windows paths like
333
+ * `"C:\Program Files\tool\auth.exe"` survive tokenization. */
334
+ export function tokenizeCredentialProcessCommand(cmd: string): string[] {
335
+ const tokens: string[] = [];
336
+ let current = "";
337
+ let hasToken = false;
338
+ let mode: "normal" | "single" | "double" = "normal";
339
+ for (let i = 0; i < cmd.length; i++) {
340
+ const ch = cmd[i];
341
+ if (mode === "normal") {
342
+ if (ch === "'") {
343
+ mode = "single";
344
+ hasToken = true;
345
+ continue;
346
+ }
347
+ if (ch === '"') {
348
+ mode = "double";
349
+ hasToken = true;
350
+ continue;
351
+ }
352
+ if (ch === "\\" && i + 1 < cmd.length) {
353
+ current += cmd[++i];
354
+ hasToken = true;
355
+ continue;
356
+ }
357
+ if (ch === " " || ch === "\t" || ch === "\n" || ch === "\r") {
358
+ if (hasToken) {
359
+ tokens.push(current);
360
+ current = "";
361
+ hasToken = false;
362
+ }
363
+ continue;
364
+ }
365
+ current += ch;
366
+ hasToken = true;
367
+ continue;
368
+ }
369
+ if (mode === "single") {
370
+ if (ch === "'") {
371
+ mode = "normal";
372
+ continue;
373
+ }
374
+ current += ch;
375
+ continue;
376
+ }
377
+ // double-quote
378
+ if (ch === '"') {
379
+ mode = "normal";
380
+ continue;
381
+ }
382
+ if (ch === "\\" && i + 1 < cmd.length) {
383
+ const next = cmd[i + 1];
384
+ if (next === "$" || next === "`" || next === '"' || next === "\\") {
385
+ current += next;
386
+ i++;
387
+ continue;
388
+ }
389
+ // Preserve literal backslash for Windows paths.
390
+ current += ch;
391
+ continue;
392
+ }
393
+ current += ch;
394
+ }
395
+ if (mode !== "normal") {
396
+ throw new Error("AWS credential_process command has an unterminated quote.");
397
+ }
398
+ if (hasToken) tokens.push(current);
399
+ return tokens;
400
+ }
401
+
402
+ // ---------- IMDSv2 ----------
403
+
404
+ const IMDS_HOST = "169.254.169.254";
405
+ const IMDS_TIMEOUT_MS = 1000;
406
+
407
+ async function readImdsCredentials(parentSignal: AbortSignal | undefined): Promise<ResolvedCredentials | undefined> {
408
+ const timeout = AbortSignal.timeout(IMDS_TIMEOUT_MS);
409
+ const signal = parentSignal ? AbortSignal.any([parentSignal, timeout]) : timeout;
410
+ try {
411
+ const tokenRes = await fetch(`http://${IMDS_HOST}/latest/api/token`, {
412
+ method: "PUT",
413
+ headers: { "x-aws-ec2-metadata-token-ttl-seconds": "21600" },
414
+ signal,
415
+ });
416
+ if (!tokenRes.ok) return undefined;
417
+ const token = await tokenRes.text();
418
+
419
+ const roleRes = await fetch(`http://${IMDS_HOST}/latest/meta-data/iam/security-credentials/`, {
420
+ headers: { "x-aws-ec2-metadata-token": token },
421
+ signal,
422
+ });
423
+ if (!roleRes.ok) return undefined;
424
+ const role = (await roleRes.text()).trim();
425
+ if (!role) return undefined;
426
+
427
+ const credsRes = await fetch(
428
+ `http://${IMDS_HOST}/latest/meta-data/iam/security-credentials/${encodeURIComponent(role)}`,
429
+ {
430
+ headers: { "x-aws-ec2-metadata-token": token },
431
+ signal,
432
+ },
433
+ );
434
+ if (!credsRes.ok) return undefined;
435
+ const body = (await credsRes.json()) as {
436
+ AccessKeyId?: string;
437
+ SecretAccessKey?: string;
438
+ Token?: string;
439
+ Expiration?: string;
440
+ };
441
+ if (!body.AccessKeyId || !body.SecretAccessKey) return undefined;
442
+ const out: ResolvedCredentials = {
443
+ accessKeyId: body.AccessKeyId,
444
+ secretAccessKey: body.SecretAccessKey,
445
+ };
446
+ if (body.Token) out.sessionToken = body.Token;
447
+ if (body.Expiration) out.expiresAt = Date.parse(body.Expiration);
448
+ return out;
449
+ } catch {
450
+ return undefined;
451
+ }
452
+ }
453
+
454
+ /** Test/diagnostic helper — drops cached credentials. */
455
+ export function clearAwsCredentialCache(): void {
456
+ cache.clear();
457
+ }