@linxiraos/pi-ai 1.0.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 (639) hide show
  1. package/CHANGELOG.md +5066 -0
  2. package/README.md +1195 -0
  3. package/dist/types/api-registry.d.ts +30 -0
  4. package/dist/types/auth/sqlite-credential-store.d.ts +117 -0
  5. package/dist/types/auth-broker/client.d.ts +93 -0
  6. package/dist/types/auth-broker/discover.d.ts +39 -0
  7. package/dist/types/auth-broker/index.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 +136 -0
  10. package/dist/types/auth-broker/server.d.ts +48 -0
  11. package/dist/types/auth-broker/snapshot-cache.d.ts +17 -0
  12. package/dist/types/auth-broker/types.d.ts +152 -0
  13. package/dist/types/auth-broker/wire-schema-resource.d.ts +53 -0
  14. package/dist/types/auth-broker/wire-schemas.d.ts +5 -0
  15. package/dist/types/auth-gateway/http.d.ts +56 -0
  16. package/dist/types/auth-gateway/index.d.ts +3 -0
  17. package/dist/types/auth-gateway/server.d.ts +36 -0
  18. package/dist/types/auth-gateway/types.d.ts +127 -0
  19. package/dist/types/auth-retry.d.ts +150 -0
  20. package/dist/types/auth-storage.d.ts +1258 -0
  21. package/dist/types/dialect/anthropic.d.ts +15 -0
  22. package/dist/types/dialect/catalog.d.ts +3 -0
  23. package/dist/types/dialect/coercion.d.ts +23 -0
  24. package/dist/types/dialect/deepseek.d.ts +14 -0
  25. package/dist/types/dialect/demotion.d.ts +30 -0
  26. package/dist/types/dialect/examples.d.ts +18 -0
  27. package/dist/types/dialect/factory.d.ts +3 -0
  28. package/dist/types/dialect/fenced-thinking.d.ts +53 -0
  29. package/dist/types/dialect/gemini.d.ts +17 -0
  30. package/dist/types/dialect/gemma.d.ts +15 -0
  31. package/dist/types/dialect/glm.d.ts +9 -0
  32. package/dist/types/dialect/harmony.d.ts +8 -0
  33. package/dist/types/dialect/hermes.d.ts +9 -0
  34. package/dist/types/dialect/history.d.ts +3 -0
  35. package/dist/types/dialect/index.d.ts +11 -0
  36. package/dist/types/dialect/inventory.d.ts +9 -0
  37. package/dist/types/dialect/kimi.d.ts +14 -0
  38. package/dist/types/dialect/minimax.d.ts +3 -0
  39. package/dist/types/dialect/owned-stream.d.ts +4 -0
  40. package/dist/types/dialect/qwen3.d.ts +9 -0
  41. package/dist/types/dialect/rendering.d.ts +54 -0
  42. package/dist/types/dialect/thinking.d.ts +6 -0
  43. package/dist/types/dialect/types.d.ts +68 -0
  44. package/dist/types/dialect/xml.d.ts +9 -0
  45. package/dist/types/error/abort.d.ts +14 -0
  46. package/dist/types/error/auth-classify.d.ts +20 -0
  47. package/dist/types/error/auth.d.ts +27 -0
  48. package/dist/types/error/aws.d.ts +27 -0
  49. package/dist/types/error/classes.d.ts +106 -0
  50. package/dist/types/error/finalize.d.ts +39 -0
  51. package/dist/types/error/flags.d.ts +94 -0
  52. package/dist/types/error/format.d.ts +20 -0
  53. package/dist/types/error/gateway.d.ts +20 -0
  54. package/dist/types/error/index.d.ts +14 -0
  55. package/dist/types/error/oauth.d.ts +43 -0
  56. package/dist/types/error/provider.d.ts +42 -0
  57. package/dist/types/error/rate-limit.d.ts +80 -0
  58. package/dist/types/error/retryable.d.ts +27 -0
  59. package/dist/types/error/validation.d.ts +32 -0
  60. package/dist/types/index.d.ts +51 -0
  61. package/dist/types/provider-details.d.ts +24 -0
  62. package/dist/types/providers/amazon-bedrock.d.ts +39 -0
  63. package/dist/types/providers/anthropic-client.d.ts +106 -0
  64. package/dist/types/providers/anthropic-messages-server-schema.d.ts +937 -0
  65. package/dist/types/providers/anthropic-messages-server.d.ts +17 -0
  66. package/dist/types/providers/anthropic-wire.d.ts +345 -0
  67. package/dist/types/providers/anthropic.d.ts +261 -0
  68. package/dist/types/providers/aws-credentials.d.ts +48 -0
  69. package/dist/types/providers/aws-eventstream.d.ts +39 -0
  70. package/dist/types/providers/aws-sigv4.d.ts +55 -0
  71. package/dist/types/providers/azure-openai-responses.d.ts +16 -0
  72. package/dist/types/providers/bedrock-mantle.d.ts +13 -0
  73. package/dist/types/providers/claude-code-fingerprint.d.ts +19 -0
  74. package/dist/types/providers/cowork-fetch.d.ts +3 -0
  75. package/dist/types/providers/cursor/exec-modern.d.ts +98 -0
  76. package/dist/types/providers/cursor-pi-args.d.ts +105 -0
  77. package/dist/types/providers/cursor.d.ts +221 -0
  78. package/dist/types/providers/devin.d.ts +12 -0
  79. package/dist/types/providers/error-message.d.ts +25 -0
  80. package/dist/types/providers/github-copilot-headers.d.ts +40 -0
  81. package/dist/types/providers/gitlab-duo-workflow.d.ts +254 -0
  82. package/dist/types/providers/gitlab-duo.d.ts +27 -0
  83. package/dist/types/providers/google-auth.d.ts +24 -0
  84. package/dist/types/providers/google-gemini-cli.d.ts +120 -0
  85. package/dist/types/providers/google-shared.d.ts +203 -0
  86. package/dist/types/providers/google-types.d.ts +155 -0
  87. package/dist/types/providers/google-vertex.d.ts +7 -0
  88. package/dist/types/providers/google.d.ts +4 -0
  89. package/dist/types/providers/grammar.d.ts +1 -0
  90. package/dist/types/providers/kimi.d.ts +27 -0
  91. package/dist/types/providers/mock.d.ts +179 -0
  92. package/dist/types/providers/ollama.d.ts +8 -0
  93. package/dist/types/providers/openai-anthropic-shim.d.ts +35 -0
  94. package/dist/types/providers/openai-chat-server-schema.d.ts +1311 -0
  95. package/dist/types/providers/openai-chat-server.d.ts +16 -0
  96. package/dist/types/providers/openai-chat-wire.d.ts +669 -0
  97. package/dist/types/providers/openai-codex/request-transformer.d.ts +109 -0
  98. package/dist/types/providers/openai-codex/response-handler.d.ts +26 -0
  99. package/dist/types/providers/openai-codex-responses.d.ts +238 -0
  100. package/dist/types/providers/openai-completions.d.ts +48 -0
  101. package/dist/types/providers/openai-reasoning-fallback.d.ts +25 -0
  102. package/dist/types/providers/openai-responses-server-schema.d.ts +1314 -0
  103. package/dist/types/providers/openai-responses-server.d.ts +17 -0
  104. package/dist/types/providers/openai-responses-wire.d.ts +6099 -0
  105. package/dist/types/providers/openai-responses.d.ts +131 -0
  106. package/dist/types/providers/openai-shared.d.ts +624 -0
  107. package/dist/types/providers/pi-native-client.d.ts +13 -0
  108. package/dist/types/providers/pi-native-server.d.ts +69 -0
  109. package/dist/types/providers/register-builtins.d.ts +37 -0
  110. package/dist/types/providers/synthetic.d.ts +26 -0
  111. package/dist/types/providers/transform-messages.d.ts +32 -0
  112. package/dist/types/providers/vision-guard.d.ts +20 -0
  113. package/dist/types/registry/aiand.d.ts +7 -0
  114. package/dist/types/registry/aimlapi.d.ts +4 -0
  115. package/dist/types/registry/alibaba-coding-plan.d.ts +8 -0
  116. package/dist/types/registry/alibaba-token-plan.d.ts +18 -0
  117. package/dist/types/registry/amazon-bedrock.d.ts +5 -0
  118. package/dist/types/registry/anthropic.d.ts +10 -0
  119. package/dist/types/registry/api-key-login.d.ts +42 -0
  120. package/dist/types/registry/api-key-validation.d.ts +43 -0
  121. package/dist/types/registry/aws.d.ts +13 -0
  122. package/dist/types/registry/azure.d.ts +4 -0
  123. package/dist/types/registry/baseten.d.ts +7 -0
  124. package/dist/types/registry/bedrock-mantle.d.ts +22 -0
  125. package/dist/types/registry/cerebras.d.ts +7 -0
  126. package/dist/types/registry/cloudflare-ai-gateway.d.ts +13 -0
  127. package/dist/types/registry/coreweave.d.ts +7 -0
  128. package/dist/types/registry/cursor.d.ts +7 -0
  129. package/dist/types/registry/deepseek.d.ts +8 -0
  130. package/dist/types/registry/derived.d.ts +5 -0
  131. package/dist/types/registry/devin.d.ts +8 -0
  132. package/dist/types/registry/exa.d.ts +8 -0
  133. package/dist/types/registry/firepass.d.ts +16 -0
  134. package/dist/types/registry/fireworks.d.ts +7 -0
  135. package/dist/types/registry/github-copilot.d.ts +7 -0
  136. package/dist/types/registry/gitlab-duo-workflow.d.ts +10 -0
  137. package/dist/types/registry/gitlab-duo.d.ts +9 -0
  138. package/dist/types/registry/gmi-cloud.d.ts +7 -0
  139. package/dist/types/registry/google-antigravity.d.ts +9 -0
  140. package/dist/types/registry/google-gemini-cli.d.ts +9 -0
  141. package/dist/types/registry/google-vertex.d.ts +5 -0
  142. package/dist/types/registry/google.d.ts +4 -0
  143. package/dist/types/registry/groq.d.ts +4 -0
  144. package/dist/types/registry/huggingface.d.ts +7 -0
  145. package/dist/types/registry/index.d.ts +4 -0
  146. package/dist/types/registry/kagi.d.ts +14 -0
  147. package/dist/types/registry/kilo.d.ts +7 -0
  148. package/dist/types/registry/kimi-code.d.ts +7 -0
  149. package/dist/types/registry/litellm.d.ts +13 -0
  150. package/dist/types/registry/llama-cpp.d.ts +8 -0
  151. package/dist/types/registry/lm-studio.d.ts +8 -0
  152. package/dist/types/registry/meta.d.ts +7 -0
  153. package/dist/types/registry/minimax-code-cn.d.ts +6 -0
  154. package/dist/types/registry/minimax-code.d.ts +6 -0
  155. package/dist/types/registry/minimax.d.ts +4 -0
  156. package/dist/types/registry/mistral.d.ts +4 -0
  157. package/dist/types/registry/moonshot.d.ts +7 -0
  158. package/dist/types/registry/nanogpt.d.ts +7 -0
  159. package/dist/types/registry/novita.d.ts +6 -0
  160. package/dist/types/registry/nvidia.d.ts +7 -0
  161. package/dist/types/registry/oauth/anthropic-constants.d.ts +12 -0
  162. package/dist/types/registry/oauth/anthropic.d.ts +24 -0
  163. package/dist/types/registry/oauth/callback-server.d.ts +74 -0
  164. package/dist/types/registry/oauth/cursor.d.ts +16 -0
  165. package/dist/types/registry/oauth/device-code.d.ts +25 -0
  166. package/dist/types/registry/oauth/devin.d.ts +5 -0
  167. package/dist/types/registry/oauth/github-copilot.d.ts +30 -0
  168. package/dist/types/registry/oauth/gitlab-duo-workflow.d.ts +6 -0
  169. package/dist/types/registry/oauth/gitlab-duo.d.ts +3 -0
  170. package/dist/types/registry/oauth/google-antigravity.d.ts +11 -0
  171. package/dist/types/registry/oauth/google-gemini-cli.d.ts +22 -0
  172. package/dist/types/registry/oauth/google-oauth-shared.d.ts +56 -0
  173. package/dist/types/registry/oauth/index.d.ts +45 -0
  174. package/dist/types/registry/oauth/kimi.d.ts +21 -0
  175. package/dist/types/registry/oauth/minimax-code.d.ts +27 -0
  176. package/dist/types/registry/oauth/openai-codex.d.ts +33 -0
  177. package/dist/types/registry/oauth/opencode.d.ts +18 -0
  178. package/dist/types/registry/oauth/perplexity.d.ts +9 -0
  179. package/dist/types/registry/oauth/pkce.d.ts +8 -0
  180. package/dist/types/registry/oauth/types.d.ts +87 -0
  181. package/dist/types/registry/oauth/wafer.d.ts +1 -0
  182. package/dist/types/registry/oauth/xai-oauth.d.ts +46 -0
  183. package/dist/types/registry/oauth/xiaomi.d.ts +25 -0
  184. package/dist/types/registry/oauth/zai.d.ts +25 -0
  185. package/dist/types/registry/ollama-cloud.d.ts +7 -0
  186. package/dist/types/registry/ollama.d.ts +12 -0
  187. package/dist/types/registry/openai-codex-device.d.ts +8 -0
  188. package/dist/types/registry/openai-codex.d.ts +9 -0
  189. package/dist/types/registry/openai.d.ts +4 -0
  190. package/dist/types/registry/opencode-go.d.ts +6 -0
  191. package/dist/types/registry/opencode-zen.d.ts +6 -0
  192. package/dist/types/registry/openrouter.d.ts +13 -0
  193. package/dist/types/registry/parallel.d.ts +14 -0
  194. package/dist/types/registry/perplexity.d.ts +7 -0
  195. package/dist/types/registry/qianfan.d.ts +7 -0
  196. package/dist/types/registry/qwen-portal.d.ts +7 -0
  197. package/dist/types/registry/registry.d.ts +367 -0
  198. package/dist/types/registry/sakana.d.ts +7 -0
  199. package/dist/types/registry/siliconflow-cn.d.ts +7 -0
  200. package/dist/types/registry/siliconflow.d.ts +7 -0
  201. package/dist/types/registry/synthetic.d.ts +6 -0
  202. package/dist/types/registry/tavily.d.ts +14 -0
  203. package/dist/types/registry/together.d.ts +6 -0
  204. package/dist/types/registry/types.d.ts +75 -0
  205. package/dist/types/registry/umans.d.ts +7 -0
  206. package/dist/types/registry/venice.d.ts +13 -0
  207. package/dist/types/registry/vercel-ai-gateway.d.ts +7 -0
  208. package/dist/types/registry/vllm.d.ts +7 -0
  209. package/dist/types/registry/wafer-serverless.d.ts +6 -0
  210. package/dist/types/registry/xai-oauth.d.ts +7 -0
  211. package/dist/types/registry/xai.d.ts +7 -0
  212. package/dist/types/registry/xiaomi-token-plan-ams.d.ts +6 -0
  213. package/dist/types/registry/xiaomi-token-plan-cn.d.ts +6 -0
  214. package/dist/types/registry/xiaomi-token-plan-sgp.d.ts +6 -0
  215. package/dist/types/registry/xiaomi.d.ts +6 -0
  216. package/dist/types/registry/zai.d.ts +15 -0
  217. package/dist/types/registry/zenmux.d.ts +7 -0
  218. package/dist/types/registry/zhipu-coding-plan.d.ts +7 -0
  219. package/dist/types/stream.d.ts +46 -0
  220. package/dist/types/types.d.ts +1064 -0
  221. package/dist/types/usage/alibaba-token-plan.d.ts +3 -0
  222. package/dist/types/usage/claude.d.ts +4 -0
  223. package/dist/types/usage/cursor.d.ts +4 -0
  224. package/dist/types/usage/gemini.d.ts +2 -0
  225. package/dist/types/usage/github-copilot.d.ts +7 -0
  226. package/dist/types/usage/google-antigravity.d.ts +15 -0
  227. package/dist/types/usage/kimi.d.ts +2 -0
  228. package/dist/types/usage/minimax-code.d.ts +3 -0
  229. package/dist/types/usage/ollama.d.ts +5 -0
  230. package/dist/types/usage/openai-codex-base-url.d.ts +18 -0
  231. package/dist/types/usage/openai-codex-reset.d.ts +88 -0
  232. package/dist/types/usage/openai-codex.d.ts +10 -0
  233. package/dist/types/usage/opencode-go.d.ts +2 -0
  234. package/dist/types/usage/shared.d.ts +1 -0
  235. package/dist/types/usage/synthetic.d.ts +2 -0
  236. package/dist/types/usage/umans.d.ts +2 -0
  237. package/dist/types/usage/xai-oauth.d.ts +12 -0
  238. package/dist/types/usage/zai.d.ts +3 -0
  239. package/dist/types/usage.d.ts +527 -0
  240. package/dist/types/utils/abort.d.ts +25 -0
  241. package/dist/types/utils/anthropic-auth.d.ts +35 -0
  242. package/dist/types/utils/aws-profile.d.ts +17 -0
  243. package/dist/types/utils/block-symbols.d.ts +62 -0
  244. package/dist/types/utils/deterministic-id.d.ts +16 -0
  245. package/dist/types/utils/empty-completion-retry.d.ts +21 -0
  246. package/dist/types/utils/event-stream.d.ts +39 -0
  247. package/dist/types/utils/foundry.d.ts +1 -0
  248. package/dist/types/utils/google-validation.d.ts +2 -0
  249. package/dist/types/utils/harmony-leak.d.ts +135 -0
  250. package/dist/types/utils/http-inspector.d.ts +49 -0
  251. package/dist/types/utils/idle-iterator.d.ts +149 -0
  252. package/dist/types/utils/leaked-thinking-stream.d.ts +33 -0
  253. package/dist/types/utils/openai-http.d.ts +48 -0
  254. package/dist/types/utils/openrouter-headers.d.ts +1 -0
  255. package/dist/types/utils/parse-bind.d.ts +23 -0
  256. package/dist/types/utils/provider-response.d.ts +3 -0
  257. package/dist/types/utils/proxy.d.ts +39 -0
  258. package/dist/types/utils/request-debug.d.ts +29 -0
  259. package/dist/types/utils/retry-after.d.ts +4 -0
  260. package/dist/types/utils/retry.d.ts +14 -0
  261. package/dist/types/utils/schema/adapt.d.ts +24 -0
  262. package/dist/types/utils/schema/compatibility.d.ts +30 -0
  263. package/dist/types/utils/schema/dereference.d.ts +11 -0
  264. package/dist/types/utils/schema/draft.d.ts +10 -0
  265. package/dist/types/utils/schema/equality.d.ts +4 -0
  266. package/dist/types/utils/schema/fields.d.ts +54 -0
  267. package/dist/types/utils/schema/index.d.ts +14 -0
  268. package/dist/types/utils/schema/json-schema-validator.d.ts +20 -0
  269. package/dist/types/utils/schema/meta-validator.d.ts +2 -0
  270. package/dist/types/utils/schema/normalize.d.ts +153 -0
  271. package/dist/types/utils/schema/spill.d.ts +8 -0
  272. package/dist/types/utils/schema/stamps.d.ts +17 -0
  273. package/dist/types/utils/schema/strict-tool-validation.d.ts +16 -0
  274. package/dist/types/utils/schema/types.d.ts +4 -0
  275. package/dist/types/utils/schema/typescript.d.ts +24 -0
  276. package/dist/types/utils/schema/wire.d.ts +52 -0
  277. package/dist/types/utils/sdk-stream-timeout.d.ts +33 -0
  278. package/dist/types/utils/sse-debug.d.ts +5 -0
  279. package/dist/types/utils/stream-markup-healing.d.ts +87 -0
  280. package/dist/types/utils/thinking-loop.d.ts +102 -0
  281. package/dist/types/utils/tool-call-loop-guard.d.ts +26 -0
  282. package/dist/types/utils/tool-choice.d.ts +52 -0
  283. package/dist/types/utils/validation.d.ts +28 -0
  284. package/dist/types/utils.d.ts +57 -0
  285. package/package.json +138 -0
  286. package/src/api-registry.ts +109 -0
  287. package/src/auth/sqlite-credential-store.ts +2066 -0
  288. package/src/auth-broker/client.ts +471 -0
  289. package/src/auth-broker/discover.ts +310 -0
  290. package/src/auth-broker/index.ts +7 -0
  291. package/src/auth-broker/refresher.ts +117 -0
  292. package/src/auth-broker/remote-store.ts +1332 -0
  293. package/src/auth-broker/server.ts +898 -0
  294. package/src/auth-broker/snapshot-cache.ts +200 -0
  295. package/src/auth-broker/types.ts +193 -0
  296. package/src/auth-broker/wire-schema-resource.ts +487 -0
  297. package/src/auth-broker/wire-schemas.ts +43 -0
  298. package/src/auth-gateway/http.ts +227 -0
  299. package/src/auth-gateway/index.ts +3 -0
  300. package/src/auth-gateway/server.ts +836 -0
  301. package/src/auth-gateway/types.ts +153 -0
  302. package/src/auth-retry.ts +401 -0
  303. package/src/auth-storage.ts +6540 -0
  304. package/src/dialect/anthropic.md +31 -0
  305. package/src/dialect/anthropic.ts +608 -0
  306. package/src/dialect/catalog.ts +29 -0
  307. package/src/dialect/coercion.ts +136 -0
  308. package/src/dialect/deepseek.md +24 -0
  309. package/src/dialect/deepseek.ts +609 -0
  310. package/src/dialect/demotion.ts +40 -0
  311. package/src/dialect/examples.ts +71 -0
  312. package/src/dialect/factory.ts +34 -0
  313. package/src/dialect/fenced-thinking.ts +184 -0
  314. package/src/dialect/gemini.md +44 -0
  315. package/src/dialect/gemini.ts +583 -0
  316. package/src/dialect/gemma.md +33 -0
  317. package/src/dialect/gemma.ts +387 -0
  318. package/src/dialect/glm.md +32 -0
  319. package/src/dialect/glm.ts +579 -0
  320. package/src/dialect/harmony.md +31 -0
  321. package/src/dialect/harmony.ts +345 -0
  322. package/src/dialect/hermes.md +25 -0
  323. package/src/dialect/hermes.ts +206 -0
  324. package/src/dialect/history.ts +81 -0
  325. package/src/dialect/index.ts +15 -0
  326. package/src/dialect/inventory.ts +30 -0
  327. package/src/dialect/kimi.md +24 -0
  328. package/src/dialect/kimi.ts +340 -0
  329. package/src/dialect/minimax.md +31 -0
  330. package/src/dialect/minimax.ts +95 -0
  331. package/src/dialect/owned-stream.ts +481 -0
  332. package/src/dialect/prompt-template.md +12 -0
  333. package/src/dialect/qwen3.md +28 -0
  334. package/src/dialect/qwen3.ts +240 -0
  335. package/src/dialect/rendering.ts +304 -0
  336. package/src/dialect/thinking.ts +292 -0
  337. package/src/dialect/types.ts +56 -0
  338. package/src/dialect/xml.md +22 -0
  339. package/src/dialect/xml.ts +90 -0
  340. package/src/error/abort.ts +18 -0
  341. package/src/error/auth-classify.ts +47 -0
  342. package/src/error/auth.ts +48 -0
  343. package/src/error/aws.ts +35 -0
  344. package/src/error/classes.ts +281 -0
  345. package/src/error/finalize.ts +69 -0
  346. package/src/error/flags.ts +602 -0
  347. package/src/error/format.ts +45 -0
  348. package/src/error/gateway.ts +96 -0
  349. package/src/error/index.ts +14 -0
  350. package/src/error/oauth.ts +58 -0
  351. package/src/error/provider.ts +63 -0
  352. package/src/error/rate-limit.ts +303 -0
  353. package/src/error/retryable.ts +70 -0
  354. package/src/error/validation.ts +44 -0
  355. package/src/index.ts +51 -0
  356. package/src/provider-details.ts +90 -0
  357. package/src/providers/amazon-bedrock.ts +1064 -0
  358. package/src/providers/anthropic-client.ts +317 -0
  359. package/src/providers/anthropic-messages-server-schema.ts +252 -0
  360. package/src/providers/anthropic-messages-server.ts +818 -0
  361. package/src/providers/anthropic-wire.ts +359 -0
  362. package/src/providers/anthropic.ts +4539 -0
  363. package/src/providers/aws-credentials.ts +772 -0
  364. package/src/providers/aws-eventstream.ts +181 -0
  365. package/src/providers/aws-sigv4.ts +218 -0
  366. package/src/providers/azure-openai-responses.ts +438 -0
  367. package/src/providers/bedrock-mantle.ts +110 -0
  368. package/src/providers/claude-code-fingerprint.ts +20 -0
  369. package/src/providers/cowork-fetch.ts +201 -0
  370. package/src/providers/cursor/exec-modern.ts +496 -0
  371. package/src/providers/cursor/proto/agent.proto +4533 -0
  372. package/src/providers/cursor/proto/buf.gen.yaml +6 -0
  373. package/src/providers/cursor/proto/buf.yaml +17 -0
  374. package/src/providers/cursor-pi-args.ts +165 -0
  375. package/src/providers/cursor.ts +4689 -0
  376. package/src/providers/devin/proto/buf/validate/validate.proto +468 -0
  377. package/src/providers/devin/proto/buf.gen.yaml +33 -0
  378. package/src/providers/devin/proto/buf.yaml +17 -0
  379. package/src/providers/devin/proto/cel/expr/checked.proto +103 -0
  380. package/src/providers/devin/proto/cel/expr/eval.proto +38 -0
  381. package/src/providers/devin/proto/cel/expr/explain.proto +15 -0
  382. package/src/providers/devin/proto/cel/expr/syntax.proto +113 -0
  383. package/src/providers/devin/proto/cel/expr/value.proto +41 -0
  384. package/src/providers/devin/proto/connectext/grpc/status/v1/status.proto +11 -0
  385. package/src/providers/devin/proto/errorspb/errors.proto +56 -0
  386. package/src/providers/devin/proto/errorspb/hintdetail.proto +7 -0
  387. package/src/providers/devin/proto/errorspb/markers.proto +10 -0
  388. package/src/providers/devin/proto/errorspb/tags.proto +12 -0
  389. package/src/providers/devin/proto/errorspb/testing.proto +6 -0
  390. package/src/providers/devin/proto/exa/analytics_pb/analytics.proto +188 -0
  391. package/src/providers/devin/proto/exa/api_server_pb/api_server.proto +2461 -0
  392. package/src/providers/devin/proto/exa/auth_pb/auth.proto +19 -0
  393. package/src/providers/devin/proto/exa/auto_cascade_common_pb/auto_cascade_common.proto +79 -0
  394. package/src/providers/devin/proto/exa/browser_preview_pb/browser_preview.proto +32 -0
  395. package/src/providers/devin/proto/exa/bug_checker_pb/bug_checker.proto +22 -0
  396. package/src/providers/devin/proto/exa/cascade_plugins_pb/cascade_plugins.proto +262 -0
  397. package/src/providers/devin/proto/exa/chat_client_server_pb/chat_client_server.proto +57 -0
  398. package/src/providers/devin/proto/exa/chat_pb/chat.proto +449 -0
  399. package/src/providers/devin/proto/exa/code_edit/code_edit_pb/code_edit.proto +186 -0
  400. package/src/providers/devin/proto/exa/codeium_common_pb/codeium_common.proto +4157 -0
  401. package/src/providers/devin/proto/exa/context_module_pb/context_module.proto +175 -0
  402. package/src/providers/devin/proto/exa/cortex_pb/cortex.proto +3268 -0
  403. package/src/providers/devin/proto/exa/dev_pb/dev.proto +26 -0
  404. package/src/providers/devin/proto/exa/diff_action_pb/diff_action.proto +75 -0
  405. package/src/providers/devin/proto/exa/eval/pr_eval/datasets_pb/datasets.proto +103 -0
  406. package/src/providers/devin/proto/exa/eval_pb/eval.proto +1315 -0
  407. package/src/providers/devin/proto/exa/extension_server_pb/extension_server.proto +556 -0
  408. package/src/providers/devin/proto/exa/file_system_provider_pb/file_system_provider.proto +75 -0
  409. package/src/providers/devin/proto/exa/index_pb/index.proto +461 -0
  410. package/src/providers/devin/proto/exa/knowledge_base_pb/knowledge_base.proto +144 -0
  411. package/src/providers/devin/proto/exa/language_server_pb/language_server.proto +2385 -0
  412. package/src/providers/devin/proto/exa/model_management_pb/model_management.proto +186 -0
  413. package/src/providers/devin/proto/exa/opensearch_clients_pb/opensearch_clients.proto +503 -0
  414. package/src/providers/devin/proto/exa/product_analytics_pb/product_analytics.proto +37 -0
  415. package/src/providers/devin/proto/exa/prompt_pb/prompt.proto +92 -0
  416. package/src/providers/devin/proto/exa/reactive_component_pb/reactive_component.proto +96 -0
  417. package/src/providers/devin/proto/exa/seat_management_pb/seat_management.proto +2680 -0
  418. package/src/providers/devin/proto/exa/tokenizer_pb/tokenizer.proto +37 -0
  419. package/src/providers/devin/proto/exa/trainer_pb/config.proto +647 -0
  420. package/src/providers/devin/proto/exa/tree_sitter/language_data_pb/language_data.proto +14 -0
  421. package/src/providers/devin/proto/exa/trust_pb/trust.proto +157 -0
  422. package/src/providers/devin/proto/exa/user_analytics_pb/user_analytics.proto +519 -0
  423. package/src/providers/devin/proto/google.golang.org/appengine/internal/base/api_base.proto +28 -0
  424. package/src/providers/devin/proto/google.golang.org/appengine/internal/datastore/datastore_v3.proto +484 -0
  425. package/src/providers/devin/proto/google.golang.org/appengine/internal/log/log_service.proto +136 -0
  426. package/src/providers/devin/proto/google.golang.org/appengine/internal/remote_api/remote_api.proto +42 -0
  427. package/src/providers/devin/proto/google.golang.org/appengine/internal/urlfetch/urlfetch_service.proto +61 -0
  428. package/src/providers/devin/proto/grpc/binlog/v1/binarylog.proto +84 -0
  429. package/src/providers/devin/proto/io/prometheus/client/metrics.proto +98 -0
  430. package/src/providers/devin.ts +679 -0
  431. package/src/providers/error-message.ts +23 -0
  432. package/src/providers/github-copilot-headers.ts +141 -0
  433. package/src/providers/gitlab-duo-workflow-chatml-note.md +1 -0
  434. package/src/providers/gitlab-duo-workflow.ts +3135 -0
  435. package/src/providers/gitlab-duo.ts +399 -0
  436. package/src/providers/google-auth.ts +330 -0
  437. package/src/providers/google-gemini-cli.ts +1370 -0
  438. package/src/providers/google-shared.ts +1122 -0
  439. package/src/providers/google-types.ts +180 -0
  440. package/src/providers/google-vertex.ts +135 -0
  441. package/src/providers/google.ts +47 -0
  442. package/src/providers/grammar.ts +70 -0
  443. package/src/providers/kimi.ts +51 -0
  444. package/src/providers/mock.ts +514 -0
  445. package/src/providers/ollama.ts +776 -0
  446. package/src/providers/openai-anthropic-shim.ts +166 -0
  447. package/src/providers/openai-chat-server-schema.ts +243 -0
  448. package/src/providers/openai-chat-server.ts +752 -0
  449. package/src/providers/openai-chat-wire.ts +859 -0
  450. package/src/providers/openai-codex/request-transformer.ts +491 -0
  451. package/src/providers/openai-codex/response-handler.ts +102 -0
  452. package/src/providers/openai-codex-responses.ts +4716 -0
  453. package/src/providers/openai-completions.ts +2389 -0
  454. package/src/providers/openai-reasoning-fallback.ts +269 -0
  455. package/src/providers/openai-responses-server-schema.ts +397 -0
  456. package/src/providers/openai-responses-server.ts +1466 -0
  457. package/src/providers/openai-responses-wire.ts +6416 -0
  458. package/src/providers/openai-responses.ts +1393 -0
  459. package/src/providers/openai-shared.ts +3500 -0
  460. package/src/providers/pi-native-client.ts +275 -0
  461. package/src/providers/pi-native-server.ts +245 -0
  462. package/src/providers/register-builtins.ts +503 -0
  463. package/src/providers/synthetic.ts +50 -0
  464. package/src/providers/transform-messages.ts +1083 -0
  465. package/src/providers/vision-guard.ts +54 -0
  466. package/src/registry/aiand.ts +22 -0
  467. package/src/registry/aimlapi.ts +6 -0
  468. package/src/registry/alibaba-coding-plan.ts +104 -0
  469. package/src/registry/alibaba-token-plan.ts +125 -0
  470. package/src/registry/amazon-bedrock.ts +22 -0
  471. package/src/registry/anthropic.ts +26 -0
  472. package/src/registry/api-key-login.ts +115 -0
  473. package/src/registry/api-key-validation.ts +145 -0
  474. package/src/registry/aws.ts +57 -0
  475. package/src/registry/azure.ts +6 -0
  476. package/src/registry/baseten.ts +22 -0
  477. package/src/registry/bedrock-mantle.ts +34 -0
  478. package/src/registry/cerebras.ts +23 -0
  479. package/src/registry/cloudflare-ai-gateway.ts +45 -0
  480. package/src/registry/coreweave.ts +40 -0
  481. package/src/registry/cursor.ts +20 -0
  482. package/src/registry/deepseek.ts +46 -0
  483. package/src/registry/derived.ts +9 -0
  484. package/src/registry/devin.ts +15 -0
  485. package/src/registry/exa.ts +19 -0
  486. package/src/registry/firepass.ts +32 -0
  487. package/src/registry/fireworks.ts +28 -0
  488. package/src/registry/github-copilot.ts +22 -0
  489. package/src/registry/gitlab-duo-workflow.ts +20 -0
  490. package/src/registry/gitlab-duo.ts +19 -0
  491. package/src/registry/gmi-cloud.ts +22 -0
  492. package/src/registry/google-antigravity.ts +22 -0
  493. package/src/registry/google-gemini-cli.ts +22 -0
  494. package/src/registry/google-vertex.ts +38 -0
  495. package/src/registry/google.ts +6 -0
  496. package/src/registry/groq.ts +6 -0
  497. package/src/registry/huggingface.ts +29 -0
  498. package/src/registry/index.ts +4 -0
  499. package/src/registry/kagi.ts +46 -0
  500. package/src/registry/kilo.ts +114 -0
  501. package/src/registry/kimi-code.ts +17 -0
  502. package/src/registry/litellm.ts +45 -0
  503. package/src/registry/llama-cpp.ts +35 -0
  504. package/src/registry/lm-studio.ts +31 -0
  505. package/src/registry/meta.ts +22 -0
  506. package/src/registry/minimax-code-cn.ts +12 -0
  507. package/src/registry/minimax-code.ts +12 -0
  508. package/src/registry/minimax.ts +6 -0
  509. package/src/registry/mistral.ts +6 -0
  510. package/src/registry/moonshot.ts +28 -0
  511. package/src/registry/nanogpt.ts +22 -0
  512. package/src/registry/novita.ts +25 -0
  513. package/src/registry/nvidia.ts +61 -0
  514. package/src/registry/oauth/anthropic-constants.ts +12 -0
  515. package/src/registry/oauth/anthropic.ts +346 -0
  516. package/src/registry/oauth/callback-server.ts +438 -0
  517. package/src/registry/oauth/cursor.ts +187 -0
  518. package/src/registry/oauth/device-code.ts +92 -0
  519. package/src/registry/oauth/devin.ts +124 -0
  520. package/src/registry/oauth/github-copilot.ts +369 -0
  521. package/src/registry/oauth/gitlab-duo-workflow.ts +146 -0
  522. package/src/registry/oauth/gitlab-duo.ts +222 -0
  523. package/src/registry/oauth/google-antigravity.ts +225 -0
  524. package/src/registry/oauth/google-gemini-cli.ts +297 -0
  525. package/src/registry/oauth/google-oauth-shared.ts +211 -0
  526. package/src/registry/oauth/index.ts +187 -0
  527. package/src/registry/oauth/kimi.ts +297 -0
  528. package/src/registry/oauth/minimax-code.ts +53 -0
  529. package/src/registry/oauth/oauth.html +317 -0
  530. package/src/registry/oauth/openai-codex.ts +384 -0
  531. package/src/registry/oauth/opencode.ts +50 -0
  532. package/src/registry/oauth/perplexity.ts +228 -0
  533. package/src/registry/oauth/pkce.ts +18 -0
  534. package/src/registry/oauth/types.ts +96 -0
  535. package/src/registry/oauth/wafer.ts +24 -0
  536. package/src/registry/oauth/xai-oauth.ts +559 -0
  537. package/src/registry/oauth/xiaomi.ts +211 -0
  538. package/src/registry/oauth/zai.ts +285 -0
  539. package/src/registry/ollama-cloud.ts +36 -0
  540. package/src/registry/ollama.ts +43 -0
  541. package/src/registry/openai-codex-device.ts +18 -0
  542. package/src/registry/openai-codex.ts +19 -0
  543. package/src/registry/openai.ts +6 -0
  544. package/src/registry/opencode-go.ts +12 -0
  545. package/src/registry/opencode-zen.ts +12 -0
  546. package/src/registry/openrouter.ts +28 -0
  547. package/src/registry/parallel.ts +45 -0
  548. package/src/registry/perplexity.ts +13 -0
  549. package/src/registry/qianfan.ts +27 -0
  550. package/src/registry/qwen-portal.ts +50 -0
  551. package/src/registry/registry.ts +182 -0
  552. package/src/registry/sakana.ts +22 -0
  553. package/src/registry/siliconflow-cn.ts +22 -0
  554. package/src/registry/siliconflow.ts +22 -0
  555. package/src/registry/synthetic.ts +21 -0
  556. package/src/registry/tavily.ts +45 -0
  557. package/src/registry/together.ts +22 -0
  558. package/src/registry/types.ts +86 -0
  559. package/src/registry/umans.ts +23 -0
  560. package/src/registry/venice.ts +33 -0
  561. package/src/registry/vercel-ai-gateway.ts +38 -0
  562. package/src/registry/vllm.ts +34 -0
  563. package/src/registry/wafer-serverless.ts +12 -0
  564. package/src/registry/xai-oauth.ts +17 -0
  565. package/src/registry/xai.ts +22 -0
  566. package/src/registry/xiaomi-token-plan-ams.ts +12 -0
  567. package/src/registry/xiaomi-token-plan-cn.ts +12 -0
  568. package/src/registry/xiaomi-token-plan-sgp.ts +12 -0
  569. package/src/registry/xiaomi.ts +12 -0
  570. package/src/registry/zai.ts +41 -0
  571. package/src/registry/zenmux.ts +22 -0
  572. package/src/registry/zhipu-coding-plan.ts +27 -0
  573. package/src/stream.ts +1944 -0
  574. package/src/types.ts +1243 -0
  575. package/src/usage/alibaba-token-plan.ts +230 -0
  576. package/src/usage/claude.ts +830 -0
  577. package/src/usage/cursor.ts +335 -0
  578. package/src/usage/gemini.ts +258 -0
  579. package/src/usage/github-copilot.ts +424 -0
  580. package/src/usage/google-antigravity.ts +497 -0
  581. package/src/usage/kimi.ts +277 -0
  582. package/src/usage/minimax-code.ts +291 -0
  583. package/src/usage/ollama.ts +41 -0
  584. package/src/usage/openai-codex-base-url.ts +35 -0
  585. package/src/usage/openai-codex-reset.ts +205 -0
  586. package/src/usage/openai-codex.ts +627 -0
  587. package/src/usage/opencode-go.ts +89 -0
  588. package/src/usage/shared.ts +10 -0
  589. package/src/usage/synthetic.ts +180 -0
  590. package/src/usage/umans.ts +192 -0
  591. package/src/usage/xai-oauth.ts +414 -0
  592. package/src/usage/zai.ts +370 -0
  593. package/src/usage.ts +411 -0
  594. package/src/utils/abort.ts +67 -0
  595. package/src/utils/anthropic-auth.ts +93 -0
  596. package/src/utils/aws-profile.ts +88 -0
  597. package/src/utils/block-symbols.ts +78 -0
  598. package/src/utils/deterministic-id.ts +20 -0
  599. package/src/utils/empty-completion-retry.ts +161 -0
  600. package/src/utils/event-stream.ts +202 -0
  601. package/src/utils/foundry.ts +8 -0
  602. package/src/utils/google-validation.ts +25 -0
  603. package/src/utils/harmony-leak.ts +500 -0
  604. package/src/utils/http-inspector.ts +196 -0
  605. package/src/utils/idle-iterator.ts +531 -0
  606. package/src/utils/leaked-thinking-stream.ts +483 -0
  607. package/src/utils/openai-http.ts +119 -0
  608. package/src/utils/openrouter-headers.ts +12 -0
  609. package/src/utils/parse-bind.ts +56 -0
  610. package/src/utils/provider-response.ts +30 -0
  611. package/src/utils/proxy.ts +314 -0
  612. package/src/utils/request-debug.ts +351 -0
  613. package/src/utils/retry-after.ts +121 -0
  614. package/src/utils/retry.ts +77 -0
  615. package/src/utils/schema/CONSTRAINTS.md +168 -0
  616. package/src/utils/schema/adapt.ts +36 -0
  617. package/src/utils/schema/compatibility.ts +435 -0
  618. package/src/utils/schema/dereference.ts +98 -0
  619. package/src/utils/schema/draft.ts +341 -0
  620. package/src/utils/schema/equality.ts +97 -0
  621. package/src/utils/schema/fields.ts +210 -0
  622. package/src/utils/schema/index.ts +14 -0
  623. package/src/utils/schema/json-schema-validator.ts +595 -0
  624. package/src/utils/schema/meta-validator.ts +167 -0
  625. package/src/utils/schema/normalize.ts +2314 -0
  626. package/src/utils/schema/spill.ts +43 -0
  627. package/src/utils/schema/stamps.ts +109 -0
  628. package/src/utils/schema/strict-tool-validation.ts +117 -0
  629. package/src/utils/schema/types.ts +10 -0
  630. package/src/utils/schema/typescript.ts +212 -0
  631. package/src/utils/schema/wire.ts +662 -0
  632. package/src/utils/sdk-stream-timeout.ts +43 -0
  633. package/src/utils/sse-debug.ts +18 -0
  634. package/src/utils/stream-markup-healing.ts +247 -0
  635. package/src/utils/thinking-loop.ts +552 -0
  636. package/src/utils/tool-call-loop-guard.ts +107 -0
  637. package/src/utils/tool-choice.ts +101 -0
  638. package/src/utils/validation.ts +1932 -0
  639. package/src/utils.ts +492 -0
@@ -0,0 +1,292 @@
1
+ import { partialSuffixOverlapAny } from "./coercion";
2
+ import { FencedThinkingScanner } from "./fenced-thinking";
3
+ import type { InbandScanEvent, InbandScanner } from "./types";
4
+
5
+ type Tag = { readonly open: string; readonly close: string; readonly fenced?: boolean };
6
+
7
+ /**
8
+ * Every dialect's in-band thinking section in its canonical `renderThinking`
9
+ * form (see the sibling `./*.ts` scanners). {@link ThinkingInbandScanner} heals
10
+ * reasoning a model leaked into its visible text channel back into thinking
11
+ * events, whichever dialect idiom the leak used.
12
+ *
13
+ * Plain (attribute-free) delimiters only — matching what `renderThinking`
14
+ * emits and what models leak in practice. Attributed or namespaced XML thinking
15
+ * tags (`<thinking signature="…">`, `antml:thinking`) are recovered by the owned
16
+ * anthropic-dialect parser, not this text-channel healing fallback.
17
+ */
18
+ const TAGS: readonly Tag[] = [
19
+ { open: "<think>", close: "</think>" }, // deepseek, glm, hermes, kimi, qwen3 (and anthropic/minimax/xml)
20
+ { open: "<thinking>", close: "</thinking>" }, // anthropic, minimax, xml
21
+ { open: "<scratchpad>", close: "</scratchpad>" }, // anthropic
22
+ { open: "```thinking\n", close: "```", fenced: true }, // gemini fenced thinking
23
+ { open: "<|channel>thought\n", close: "<channel|>" }, // gemma reasoning channel
24
+ { open: "<|start|>assistant<|channel|>analysis<|message|>", close: "<|end|>" }, // harmony analysis (rendered)
25
+ { open: "<|channel|>analysis<|message|>", close: "<|end|>" }, // harmony analysis (bare leak)
26
+ ];
27
+ const OPENS = TAGS.map(tag => tag.open);
28
+
29
+ export class ThinkingInbandScanner implements InbandScanner {
30
+ #buffer = "";
31
+ #closeTag = "";
32
+ #thinking = "";
33
+ /** Fence-aware close-matcher while inside a ` ```thinking ` block; undefined otherwise. */
34
+ #fenced: FencedThinkingScanner | undefined;
35
+ /** Backtick count that opened the Markdown code span/fence we are inside; 0 when not in code. */
36
+ #codeTicks = 0;
37
+ /** True when {@link #codeTicks} opened a fenced block (closes on a fence line), not an inline span. */
38
+ #codeFenced = false;
39
+ /**
40
+ * Leading-space count on the current output line, or -1 once a non-space
41
+ * character has appeared. Starts at 0 (line start) so a fence opening the
42
+ * stream — or one indented ≤3 spaces, as CommonMark allows — is recognized.
43
+ */
44
+ #lineIndent = 0;
45
+
46
+ feed(text: string): InbandScanEvent[] {
47
+ if (text.length === 0) return [];
48
+ this.#buffer += text;
49
+ return this.#consume(false);
50
+ }
51
+
52
+ flush(): InbandScanEvent[] {
53
+ const events = this.#consume(true);
54
+ if (this.#buffer.length === 0) return events;
55
+ if (this.#closeTag) {
56
+ this.#emitThinking(this.#buffer, events);
57
+ events.push({ type: "thinkingEnd", thinking: this.#thinking });
58
+ } else {
59
+ events.push({ type: "text", text: this.#buffer });
60
+ }
61
+ this.#buffer = "";
62
+ this.#closeTag = "";
63
+ return events;
64
+ }
65
+
66
+ #consume(final: boolean): InbandScanEvent[] {
67
+ const events: InbandScanEvent[] = [];
68
+ for (;;) {
69
+ if (this.#fenced) {
70
+ // Run even with an empty buffer so a held partial close flushes on final.
71
+ const result = this.#fenced.feed(this.#buffer, final);
72
+ this.#buffer = result.closed ? result.rest : "";
73
+ this.#emitThinking(result.thinking, events);
74
+ if (result.closed || final) {
75
+ events.push({ type: "thinkingEnd", thinking: this.#thinking });
76
+ this.#thinking = "";
77
+ this.#closeTag = "";
78
+ this.#fenced = undefined;
79
+ }
80
+ if (this.#fenced) break;
81
+ continue;
82
+ }
83
+ if (this.#buffer.length === 0) break;
84
+ if (this.#closeTag) {
85
+ const close = this.#buffer.indexOf(this.#closeTag);
86
+ if (close === -1) {
87
+ const hold = final ? 0 : partialSuffixOverlapAny(this.#buffer, [this.#closeTag]);
88
+ this.#emitThinking(this.#buffer.slice(0, this.#buffer.length - hold), events);
89
+ this.#buffer = this.#buffer.slice(this.#buffer.length - hold);
90
+ break;
91
+ }
92
+ this.#emitThinking(this.#buffer.slice(0, close), events);
93
+ this.#buffer = this.#buffer.slice(close + this.#closeTag.length);
94
+ events.push({ type: "thinkingEnd", thinking: this.#thinking });
95
+ this.#thinking = "";
96
+ this.#closeTag = "";
97
+ continue;
98
+ }
99
+ if (this.#codeTicks > 0) {
100
+ if (this.#emitCode(final, events)) continue;
101
+ break;
102
+ }
103
+
104
+ const hit = scanVisible(this.#buffer, final);
105
+ if (hit.kind === "none") {
106
+ this.#emitText(this.#buffer, events);
107
+ this.#buffer = "";
108
+ break;
109
+ }
110
+ if (hit.index > 0) this.#emitText(this.#buffer.slice(0, hit.index), events);
111
+ if (hit.kind === "hold") {
112
+ this.#buffer = this.#buffer.slice(hit.index);
113
+ break;
114
+ }
115
+ if (hit.kind === "code") {
116
+ const fenced = hit.ticks >= 3 && this.#lineIndent >= 0 && this.#lineIndent <= 3;
117
+ this.#emitText(this.#buffer.slice(hit.index, hit.index + hit.ticks), events);
118
+ this.#buffer = this.#buffer.slice(hit.index + hit.ticks);
119
+ this.#codeTicks = hit.ticks;
120
+ this.#codeFenced = fenced;
121
+ continue;
122
+ }
123
+ this.#buffer = this.#buffer.slice(hit.index + hit.tag.open.length);
124
+ this.#closeTag = hit.tag.close;
125
+ this.#thinking = "";
126
+ if (hit.tag.fenced) this.#fenced = new FencedThinkingScanner();
127
+ events.push({ type: "thinkingStart" });
128
+ }
129
+ return events;
130
+ }
131
+
132
+ /**
133
+ * Emit buffered content while inside a Markdown code region, suppressing
134
+ * reasoning-tag detection. A fenced block closes only on a fence line (a line
135
+ * of backticks ≥ the opener); an inline span closes on the first backtick run
136
+ * of exactly the opener length. Returns true when the region closed and the
137
+ * loop should continue, false when it held back and should break.
138
+ */
139
+ #emitCode(final: boolean, events: InbandScanEvent[]): boolean {
140
+ if (this.#codeFenced) {
141
+ const end = findFenceCloseEnd(this.#buffer, this.#codeTicks, final);
142
+ if (end !== -1) {
143
+ this.#emitText(this.#buffer.slice(0, end), events);
144
+ this.#buffer = this.#buffer.slice(end);
145
+ this.#codeTicks = 0;
146
+ this.#codeFenced = false;
147
+ return true;
148
+ }
149
+ if (final) {
150
+ this.#emitText(this.#buffer, events);
151
+ this.#buffer = "";
152
+ this.#codeTicks = 0;
153
+ this.#codeFenced = false;
154
+ return false;
155
+ }
156
+ // Stream committed lines; hold only the last (possibly partial) fence line.
157
+ const lastNl = this.#buffer.lastIndexOf("\n");
158
+ if (lastNl !== -1) {
159
+ this.#emitText(this.#buffer.slice(0, lastNl + 1), events);
160
+ this.#buffer = this.#buffer.slice(lastNl + 1);
161
+ }
162
+ return false;
163
+ }
164
+ const close = findBacktickRun(this.#buffer, 0, this.#codeTicks);
165
+ if (close !== -1 && (final || close + this.#codeTicks < this.#buffer.length)) {
166
+ this.#emitText(this.#buffer.slice(0, close + this.#codeTicks), events);
167
+ this.#buffer = this.#buffer.slice(close + this.#codeTicks);
168
+ this.#codeTicks = 0;
169
+ return true;
170
+ }
171
+ // No committed close yet: emit text, holding a trailing backtick run that
172
+ // may still grow into — or past — the closing delimiter.
173
+ const hold = final ? 0 : trailingBacktickRun(this.#buffer);
174
+ this.#emitText(this.#buffer.slice(0, this.#buffer.length - hold), events);
175
+ this.#buffer = this.#buffer.slice(this.#buffer.length - hold);
176
+ if (final) this.#codeTicks = 0;
177
+ return false;
178
+ }
179
+
180
+ #emitText(text: string, events: InbandScanEvent[]): void {
181
+ if (text.length === 0) return;
182
+ events.push({ type: "text", text });
183
+ this.#lineIndent = trailingLineIndent(text, this.#lineIndent);
184
+ }
185
+
186
+ #emitThinking(delta: string, events: InbandScanEvent[]): void {
187
+ if (delta.length === 0) return;
188
+ this.#thinking += delta;
189
+ events.push({ type: "thinkingDelta", delta });
190
+ }
191
+ }
192
+
193
+ /** Outcome of scanning idle visible text for the next reasoning-tag or code-span boundary. */
194
+ type VisibleHit =
195
+ | { readonly kind: "tag"; readonly index: number; readonly tag: Tag }
196
+ | { readonly kind: "code"; readonly index: number; readonly ticks: number }
197
+ | { readonly kind: "hold"; readonly index: number }
198
+ | { readonly kind: "none" };
199
+
200
+ /**
201
+ * Walk idle visible text for the earliest boundary: a leaked reasoning-tag open,
202
+ * a Markdown code-span/fence opener (a backtick run), or — when more chunks may
203
+ * follow — a held partial delimiter at the buffer tail.
204
+ *
205
+ * Reasoning tags win at any position so the gemini ` ```thinking ` fence is
206
+ * healed instead of being read as a code fence. Backtick runs enter code mode so
207
+ * a literal `<think>` inside inline code or a fenced block stays visible text.
208
+ */
209
+ function scanVisible(buffer: string, final: boolean): VisibleHit {
210
+ for (let i = 0; i < buffer.length; i++) {
211
+ const tag = TAGS.find(candidate => buffer.startsWith(candidate.open, i));
212
+ if (tag) return { kind: "tag", index: i, tag };
213
+ if (!final) {
214
+ const rest = buffer.slice(i);
215
+ if (OPENS.some(open => open.length > rest.length && open.startsWith(rest))) {
216
+ return { kind: "hold", index: i };
217
+ }
218
+ }
219
+ if (buffer[i] === "`") {
220
+ const ticks = backtickRun(buffer, i);
221
+ if (!final && i + ticks === buffer.length) return { kind: "hold", index: i };
222
+ return { kind: "code", index: i, ticks };
223
+ }
224
+ }
225
+ return { kind: "none" };
226
+ }
227
+
228
+ /** Length of the maximal backtick run beginning at `from`. */
229
+ function backtickRun(buffer: string, from: number): number {
230
+ let end = from;
231
+ while (end < buffer.length && buffer[end] === "`") end++;
232
+ return end - from;
233
+ }
234
+
235
+ /** Index of the first maximal backtick run of exactly `ticks` at/after `from`, else -1. */
236
+ function findBacktickRun(buffer: string, from: number, ticks: number): number {
237
+ for (let i = buffer.indexOf("`", from); i !== -1; i = buffer.indexOf("`", i)) {
238
+ const run = backtickRun(buffer, i);
239
+ if (run === ticks) return i;
240
+ i += run;
241
+ }
242
+ return -1;
243
+ }
244
+
245
+ /** Length of a backtick run that ends at the buffer tail; 0 when the tail is not a backtick. */
246
+ function trailingBacktickRun(buffer: string): number {
247
+ let start = buffer.length;
248
+ while (start > 0 && buffer[start - 1] === "`") start--;
249
+ return buffer.length - start;
250
+ }
251
+
252
+ /**
253
+ * Leading-space count of the line at the tail of `text`, continuing from the
254
+ * prior line's `indent` state (see {@link ThinkingInbandScanner.#lineIndent}).
255
+ * Returns -1 once any non-space character has appeared on the current line.
256
+ */
257
+ function trailingLineIndent(text: string, prior: number): number {
258
+ const lastNl = text.lastIndexOf("\n");
259
+ let indent = lastNl === -1 ? prior : 0;
260
+ for (let i = lastNl + 1; i < text.length; i++) {
261
+ if (indent === -1) break;
262
+ indent = text[i] === " " ? indent + 1 : -1;
263
+ }
264
+ return indent;
265
+ }
266
+
267
+ /**
268
+ * Index just past the first closing fence line for a fenced block opened with
269
+ * `ticks` backticks, or -1 when none is committed yet. A closing fence is a whole
270
+ * line whose trimmed content is only backticks, at least `ticks` of them. A line
271
+ * without a terminating newline is committed only when `final` (no more input can
272
+ * extend it into a non-fence line).
273
+ */
274
+ function findFenceCloseEnd(buffer: string, ticks: number, final: boolean): number {
275
+ for (let start = 0; start <= buffer.length; ) {
276
+ const nl = buffer.indexOf("\n", start);
277
+ const terminated = nl !== -1;
278
+ const line = buffer.slice(start, terminated ? nl : buffer.length).trim();
279
+ if (line.length >= ticks && isAllBackticks(line) && (terminated || final)) {
280
+ return terminated ? nl + 1 : buffer.length;
281
+ }
282
+ if (!terminated) break;
283
+ start = nl + 1;
284
+ }
285
+ return -1;
286
+ }
287
+
288
+ /** True when `text` is non-empty and every character is a backtick. */
289
+ function isAllBackticks(text: string): boolean {
290
+ for (let i = 0; i < text.length; i++) if (text[i] !== "`") return false;
291
+ return text.length > 0;
292
+ }
@@ -0,0 +1,56 @@
1
+ import type { Dialect as CatalogDialect } from "@linxiraos/pi-catalog/identity";
2
+ import type { Context, Message, ToolCall } from "../types";
3
+
4
+ export type { Dialect } from "@linxiraos/pi-catalog/identity";
5
+
6
+ export type InbandScanEvent =
7
+ | { type: "text"; text: string }
8
+ | { type: "thinkingStart" }
9
+ | { type: "thinkingDelta"; delta: string }
10
+ | { type: "thinkingEnd"; thinking: string }
11
+ | { type: "toolStart"; id: string; name: string }
12
+ | { type: "toolArgDelta"; id: string; name: string; key: string; delta: string }
13
+ | { type: "toolEnd"; id: string; name: string; arguments: Record<string, unknown>; rawBlock?: string };
14
+
15
+ export interface InbandScanner {
16
+ feed(text: string): InbandScanEvent[];
17
+ flush(): InbandScanEvent[];
18
+ }
19
+
20
+ export interface DialectToolResult {
21
+ readonly id: string;
22
+ readonly name: string;
23
+ readonly index: number;
24
+ readonly text: string;
25
+ readonly isError: boolean;
26
+ }
27
+
28
+ export interface DialectRenderOptions {
29
+ readonly tools?: readonly InbandTool[];
30
+ }
31
+
32
+ export interface DialectDefinition {
33
+ readonly dialect: CatalogDialect;
34
+ readonly prompt: string;
35
+ createScanner(options?: InbandScannerOptions): InbandScanner;
36
+ /** Render a single tool-call invocation — the inner element only, WITHOUT any parallel-call block envelope (e.g. anthropic's `<function_calls>` / kimi's section wrapper). */
37
+ renderToolCall(call: ToolCall, options?: DialectRenderOptions): string;
38
+ /** Render a batch of (parallel) tool calls as one complete block, including whatever envelope the dialect wraps multiple calls in. */
39
+ renderAssistantToolCalls(calls: readonly ToolCall[], options?: DialectRenderOptions): string;
40
+ renderToolResults(results: readonly DialectToolResult[], options?: DialectRenderOptions): string;
41
+ renderThinking(text: string): string;
42
+ renderTranscript(messages: readonly Message[], options?: DialectRenderOptions): string;
43
+ }
44
+
45
+ export interface InbandScannerOptions {
46
+ /** string-typed arg names for a tool → read verbatim. Ignored by JSON-carrying dialects. */
47
+ stringArgs?: (toolName: string) => ReadonlySet<string>;
48
+ /** Full tool schemas for schema-driven dialects such as GLM XML and pi-native. */
49
+ tools?: readonly InbandTool[];
50
+ /** XML only: parse pipe-wrapped DeepSeek DSML tags vs plain Anthropic invoke/parameter tags. */
51
+ xmlTagset?: "anthropic" | "dsml";
52
+ /** Emit thinking markers as thinking events instead of visible text when the dialect defines them. */
53
+ parseThinking?: boolean;
54
+ }
55
+
56
+ export type InbandTool = NonNullable<Context["tools"]>[number];
@@ -0,0 +1,22 @@
1
+ ## Format guide
2
+
3
+ A call is one `<invoke>` element whose `<parameter>` children carry its arguments:
4
+
5
+ ```text
6
+ <invoke name="fn"><parameter name="arg">value</parameter></invoke>
7
+ ```
8
+
9
+ Emit consecutive `<invoke>…</invoke>` blocks for multiple calls; you MAY wrap them in `<tool_calls>…</tool_calls>`. Each call's result arrives as a response block:
10
+
11
+ ```text
12
+ <tool_response>
13
+ verbatim tool result
14
+ </tool_response>
15
+ ```
16
+
17
+ ## Rules
18
+
19
+ - `name` MUST match a listed function.
20
+ - Parameter values are read literally by regex (delimiter matching), NOT a real XML parser: write them verbatim and never HTML-escape (emit `a & b`, never `a &amp; b`; `<`/`>` stay literal too). Only the body's own `</parameter>` closing tag is reserved. Non-string values are JSON; add `string="false"` to a parameter only to force JSON parsing of a value the schema treats as a string.
21
+ - Read each `<tool_response>` in call order. NEVER emit `<tool_response>` yourself.
22
+ - Emit the stop sequence ONLY after the call is fully written — NEVER announce a tool then stop (e.g. halting at "Let's run `cargo clippy`" with no `<invoke>` emitted). Write the complete call, THEN the stop sequence, THEN halt.
@@ -0,0 +1,90 @@
1
+ import type { Message, ToolCall } from "../types";
2
+ import { AnthropicInbandScanner } from "./anthropic";
3
+ import { buildArgShapes, type ToolArgShape } from "./coercion";
4
+ import { DeepSeekInbandScanner } from "./deepseek";
5
+ import {
6
+ escapeXmlAttr,
7
+ renderDelimitedThinking,
8
+ renderLegacyTextTranscript,
9
+ renderToolResponseResults,
10
+ stringifyJson,
11
+ } from "./rendering";
12
+ import type {
13
+ DialectDefinition,
14
+ DialectRenderOptions,
15
+ DialectToolResult,
16
+ InbandScanEvent,
17
+ InbandScanner,
18
+ InbandScannerOptions,
19
+ } from "./types";
20
+ import dialectPrompt from "./xml.md" with { type: "text" };
21
+
22
+ export class XmlInbandScanner implements InbandScanner {
23
+ readonly #inner: InbandScanner;
24
+
25
+ constructor(options: InbandScannerOptions = {}) {
26
+ this.#inner =
27
+ options.xmlTagset === "dsml" ? new DeepSeekInbandScanner(options) : new AnthropicInbandScanner(options);
28
+ }
29
+
30
+ feed(text: string): InbandScanEvent[] {
31
+ return this.#inner.feed(text);
32
+ }
33
+
34
+ flush(): InbandScanEvent[] {
35
+ return this.#inner.flush();
36
+ }
37
+ }
38
+
39
+ function renderToolCall(call: ToolCall, options: DialectRenderOptions = {}): string {
40
+ return renderInvoke(call, buildArgShapes(options.tools).get(call.name));
41
+ }
42
+
43
+ function renderAssistantToolCalls(calls: readonly ToolCall[], options: DialectRenderOptions = {}): string {
44
+ return renderInvokes(calls, options.tools ?? []);
45
+ }
46
+
47
+ function renderToolResults(results: readonly DialectToolResult[]): string {
48
+ return renderToolResponseResults(results);
49
+ }
50
+
51
+ function renderThinking(text: string): string {
52
+ return renderDelimitedThinking("<thinking>", "</thinking>", text);
53
+ }
54
+
55
+ function renderTranscript(messages: readonly Message[], options: DialectRenderOptions = {}): string {
56
+ return renderLegacyTextTranscript(messages, options, {
57
+ renderThinking,
58
+ renderCalls: renderAssistantToolCalls,
59
+ renderResults: renderToolResults,
60
+ });
61
+ }
62
+
63
+ function renderInvoke(call: ToolCall, shape: ToolArgShape | undefined): string {
64
+ let body = `<invoke name="${escapeXmlAttr(call.name)}">`;
65
+ for (const key in call.arguments) {
66
+ const value = call.arguments[key];
67
+ const isString = shape?.stringArgs.has(key) === true;
68
+ const rendered = isString && typeof value === "string" ? value : stringifyJson(value);
69
+ body += `<parameter name="${escapeXmlAttr(key)}">${rendered}</parameter>`;
70
+ }
71
+ return `${body}</invoke>`;
72
+ }
73
+
74
+ function renderInvokes(calls: readonly ToolCall[], tools: NonNullable<DialectRenderOptions["tools"]>): string {
75
+ const shapes = buildArgShapes(tools);
76
+ return calls.map(call => renderInvoke(call, shapes.get(call.name))).join("\n");
77
+ }
78
+
79
+ const definition: DialectDefinition = {
80
+ dialect: "xml",
81
+ prompt: dialectPrompt,
82
+ createScanner: options => new XmlInbandScanner(options),
83
+ renderToolCall,
84
+ renderAssistantToolCalls,
85
+ renderToolResults,
86
+ renderThinking,
87
+ renderTranscript,
88
+ };
89
+
90
+ export default definition;
@@ -0,0 +1,18 @@
1
+ import { attach, create, Flag } from "./flags";
2
+
3
+ /**
4
+ * A request was cancelled — by the caller's `AbortSignal` or a provider-local
5
+ * watchdog. Carries the {@link Flag.Abort} classification structurally so retry
6
+ * logic does not have to regex the message text.
7
+ *
8
+ * The default message is kept byte-identical to the historical
9
+ * `"Request was aborted"` string so any remaining text-based matchers keep
10
+ * working through the migration.
11
+ */
12
+ export class AbortError extends Error {
13
+ constructor(message = "Request was aborted", options?: { cause?: unknown }) {
14
+ super(message, options?.cause === undefined ? undefined : { cause: options.cause });
15
+ this.name = "AbortError";
16
+ attach(this, create(Flag.Abort));
17
+ }
18
+ }
@@ -0,0 +1,47 @@
1
+ import { extractHttpStatusFromError } from "@linxiraos/pi-utils";
2
+ import { isOAuthExpiry, isUsageLimit } from "./flags";
3
+ import { isConcurrencyCapExclusion, isUsageLimitOutcome } from "./rate-limit";
4
+
5
+ /**
6
+ * Whether an OAuth refresh failure is definitive (the credential must be
7
+ * disabled) versus transient. Thin alias over the {@link Flag.OAuthExpiry}
8
+ * text classifier {@link isOAuthExpiry}; retained as the public
9
+ * `@linxiraos/pi-ai` entrypoint name used by the coding agent and auth-broker.
10
+ */
11
+ export function isDefinitiveOAuthFailure(errorMsg: string): boolean {
12
+ return isOAuthExpiry(errorMsg);
13
+ }
14
+
15
+ const INVALIDATED_OAUTH_TOKEN_PATTERN = /\binvalidated oauth token\b/i;
16
+
17
+ /** Whether an upstream response explicitly says the supplied OAuth bearer was invalidated. */
18
+ export function isInvalidatedOAuthTokenError(error: unknown): boolean {
19
+ if (typeof error === "object" && error !== null && "errorMessage" in error) {
20
+ const errorMessage = error.errorMessage;
21
+ if (typeof errorMessage === "string" && INVALIDATED_OAUTH_TOKEN_PATTERN.test(errorMessage)) return true;
22
+ }
23
+ const message = error instanceof Error ? error.message : typeof error === "string" ? error : undefined;
24
+ return message !== undefined && INVALIDATED_OAUTH_TOKEN_PATTERN.test(message);
25
+ }
26
+
27
+ /**
28
+ * Whether an upstream failure should rotate to a sibling credential: a hard
29
+ * `401`, a `403` (token valid but access denied — plan, model policy, or org
30
+ * restriction a sibling account may not share), a body-classified usage limit
31
+ * (Codex `usage_limit_reached`, Anthropic account rate-limit, Google
32
+ * `resource_exhausted`, OpenAI `insufficient_quota`, …), or a bare `429`
33
+ * whose payload did not preserve a richer quota code.
34
+ * Transient 429s (`Too many requests`, per-minute caps) stay in the
35
+ * upstream-backoff lane.
36
+ */
37
+ export function isAuthRetryableError(error: unknown): boolean {
38
+ if (isUsageLimit(error)) return true;
39
+ if (isInvalidatedOAuthTokenError(error)) return true;
40
+ const httpStatus = extractHttpStatusFromError(error);
41
+ const message = error instanceof Error ? error.message : typeof error === "string" ? error : undefined;
42
+ const embeddedStatus = message ? extractHttpStatusFromError({ message }) : undefined;
43
+ const status = httpStatus ?? embeddedStatus;
44
+ if (isConcurrencyCapExclusion(status, message)) return false;
45
+ if (status === 401 || status === 403) return true;
46
+ return isUsageLimitOutcome(status, message);
47
+ }
@@ -0,0 +1,48 @@
1
+ import { attach, create, Flag } from "./flags";
2
+
3
+ /**
4
+ * No API key / credential was available to dispatch a request.
5
+ *
6
+ * The default message preserves the historical `"No API key for provider: X"`
7
+ * wording, which {@link Flag.AuthFailed}'s regex (`no api key`) keys off — but
8
+ * the flag is also attached structurally so classification never depends on the
9
+ * exact phrasing.
10
+ */
11
+ export class MissingApiKeyError extends Error {
12
+ readonly provider: string | undefined;
13
+
14
+ constructor(provider?: string, message?: string) {
15
+ super(message ?? (provider ? `No API key for provider: ${provider}` : "No API key available"));
16
+ this.name = "MissingApiKeyError";
17
+ this.provider = provider;
18
+ attach(this, create(Flag.AuthFailed));
19
+ }
20
+ }
21
+
22
+ /** A user-facing login flow required an `onPrompt` callback that was not supplied. */
23
+ export class OnPromptRequiredError extends Error {
24
+ constructor(providerLabel: string) {
25
+ super(`${providerLabel} login requires onPrompt callback`);
26
+ this.name = "OnPromptRequiredError";
27
+ }
28
+ }
29
+
30
+ /** An interactive login asked for an API key but the user supplied an empty value. */
31
+ export class ApiKeyRequiredError extends Error {
32
+ constructor(message = "API key is required") {
33
+ super(message);
34
+ this.name = "ApiKeyRequiredError";
35
+ }
36
+ }
37
+
38
+ /**
39
+ * A user cancelled an interactive login / device flow. Classified as an abort
40
+ * so it is never surfaced as a retryable transient failure.
41
+ */
42
+ export class LoginCancelledError extends Error {
43
+ constructor(message = "Login cancelled") {
44
+ super(message);
45
+ this.name = "LoginCancelledError";
46
+ attach(this, create(Flag.Abort));
47
+ }
48
+ }
@@ -0,0 +1,35 @@
1
+ /** Which AWS credential-resolution path failed. */
2
+ export type AwsCredentialsErrorKind =
3
+ /** No usable credential source resolved (chain exhausted). */
4
+ | "resolution"
5
+ /** SSO cache token missing (`aws sso login` not run). */
6
+ | "sso-token-missing"
7
+ /** SSO cache token present but expired. */
8
+ | "sso-token-expired"
9
+ /** SSO `GetRoleCredentials` call failed or returned no role. */
10
+ | "sso-role"
11
+ /** External `credential_process` failed, timed out, or emitted bad output. */
12
+ | "credential-process"
13
+ /** STS web-identity exchange failed or returned malformed credentials. */
14
+ | "web-identity"
15
+ /** ECS/container credential endpoint failed or returned malformed credentials. */
16
+ | "container";
17
+
18
+ /** A failure resolving AWS credentials for the Bedrock provider. */
19
+ export class AwsCredentialsError extends Error {
20
+ readonly kind: AwsCredentialsErrorKind;
21
+
22
+ constructor(message: string, kind: AwsCredentialsErrorKind, options?: { cause?: unknown }) {
23
+ super(message, options?.cause === undefined ? undefined : { cause: options.cause });
24
+ this.name = "AwsCredentialsError";
25
+ this.kind = kind;
26
+ }
27
+ }
28
+
29
+ /** A malformed AWS event-stream frame (bad length, CRC mismatch, unknown header type). */
30
+ export class EventStreamFrameError extends Error {
31
+ constructor(detail: string) {
32
+ super(`eventstream: ${detail}`);
33
+ this.name = "EventStreamFrameError";
34
+ }
35
+ }