@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,275 @@
1
+ /**
2
+ * Client half of the pi-native auth-gateway protocol.
3
+ *
4
+ * Dispatches a {@link streamSimple}-shaped request to an `omp auth-gateway`
5
+ * via `POST /v1/pi/stream`, reads the SSE event stream back, and pushes the
6
+ * parsed events into a local {@link AssistantMessageEventStream} — the same
7
+ * stream type every other provider client produces. Callers downstream of
8
+ * `streamSimple` cannot tell whether the events came from a real provider
9
+ * SDK or from a gateway hop; they consume `AssistantMessageEvent`s either
10
+ * way.
11
+ *
12
+ * Activated when a {@link Model} has `transport: "pi-native"` set; the
13
+ * dispatch hook lives in `streamSimple()` (see `../stream.ts`). Used by
14
+ * containerized omp deployments (such as robomp slots) that
15
+ * route every LLM call through a credential-holding sidecar so the slot
16
+ * itself stays credential-free.
17
+ */
18
+ import { readSseJson } from "@linxiraos/pi-utils";
19
+ import * as AIError from "../error";
20
+ import type {
21
+ Api,
22
+ AssistantMessage,
23
+ AssistantMessageEvent,
24
+ AssistantMessageEventStream as AssistantMessageEventStreamType,
25
+ Context,
26
+ Model,
27
+ SimpleStreamOptions,
28
+ } from "../types";
29
+ import { createAbortSourceTracker } from "../utils/abort";
30
+ import { AssistantMessageEventStream } from "../utils/event-stream";
31
+ import { getStreamFirstEventTimeoutMs, getStreamIdleTimeoutMs, iterateWithIdleTimeout } from "../utils/idle-iterator";
32
+ import { notifyProviderResponse } from "../utils/provider-response";
33
+
34
+ /**
35
+ * Fields that must not cross the wire — either non-serializable (functions,
36
+ * `AbortSignal`, the provider-session `Map`) or server-controlled
37
+ * (`apiKey`, which the gateway injects from its own credential store; the
38
+ * client's `apiKey` is the gateway *bearer*, sent in the `Authorization`
39
+ * header rather than the request body).
40
+ */
41
+ const NON_WIRE_KEYS = new Set<keyof SimpleStreamOptions>([
42
+ "signal",
43
+ "apiKey",
44
+ "fetch",
45
+ "onPayload",
46
+ "onResponse",
47
+ "onSseEvent",
48
+ "execHandlers",
49
+ "cursorExecHandlers",
50
+ "cursorOnToolResult",
51
+ "providerSessionState",
52
+ ]);
53
+ const PI_NATIVE_STREAM_IDLE_TIMEOUT_ERROR = "pi-native stream stalled while waiting for the next event";
54
+ const PI_NATIVE_STREAM_FIRST_EVENT_TIMEOUT_ERROR = "pi-native stream timed out while waiting for the first event";
55
+
56
+ function isPiNativeProgressEvent(event: unknown): boolean {
57
+ if (typeof event !== "object" || event === null || !("type" in event)) return true;
58
+ return event.type !== "start";
59
+ }
60
+
61
+ function buildWireOptions(options: SimpleStreamOptions | undefined): Record<string, unknown> {
62
+ if (!options) return {};
63
+ const wire: Record<string, unknown> = {};
64
+ for (const [k, v] of Object.entries(options)) {
65
+ if (v === undefined) continue;
66
+ if (NON_WIRE_KEYS.has(k as keyof SimpleStreamOptions)) continue;
67
+ wire[k] = v;
68
+ }
69
+ return wire;
70
+ }
71
+
72
+ async function decodeGatewayError(response: Response): Promise<AIError.AuthGatewayError> {
73
+ const status = response.status;
74
+ let body: unknown;
75
+ try {
76
+ body = await response.json();
77
+ } catch {
78
+ body = await response.text().catch(() => "");
79
+ }
80
+ if (typeof body === "object" && body !== null && "error" in body) {
81
+ const err = (body as { error: unknown }).error;
82
+ if (typeof err === "object" && err !== null) {
83
+ const message = (err as { message?: unknown }).message;
84
+ const type = (err as { type?: unknown }).type;
85
+ return new AIError.AuthGatewayError(
86
+ typeof message === "string" ? message : `auth-gateway ${status}`,
87
+ status,
88
+ response.headers,
89
+ typeof type === "string" ? type : undefined,
90
+ );
91
+ }
92
+ }
93
+ const text = typeof body === "string" ? body : JSON.stringify(body);
94
+ return new AIError.AuthGatewayError(
95
+ `auth-gateway ${status}: ${text || response.statusText}`,
96
+ status,
97
+ response.headers,
98
+ );
99
+ }
100
+
101
+ /**
102
+ * Resolve the `/v1/pi/stream` endpoint URL from the model's `baseUrl`.
103
+ * Trims a trailing slash so concatenation can't double-slash; throws when
104
+ * the baseUrl is missing (transport=pi-native without a gateway target is
105
+ * a configuration error, not a runtime recoverable one).
106
+ */
107
+ function resolveStreamUrl(model: Model<Api>): string {
108
+ if (!model.baseUrl) {
109
+ throw new AIError.ConfigurationError(
110
+ `pi-native transport requires \`baseUrl\` on model ${model.id} (set it on the provider config in models.yml)`,
111
+ );
112
+ }
113
+ return `${model.baseUrl.replace(/\/+$/, "")}/v1/pi/stream`;
114
+ }
115
+
116
+ function buildHeaders(model: Model<Api>, apiKey: string | undefined): Record<string, string> {
117
+ const headers: Record<string, string> = {
118
+ "Content-Type": "application/json",
119
+ Accept: "text/event-stream",
120
+ ...(model.headers ?? {}),
121
+ };
122
+ if (apiKey && !headers.Authorization) {
123
+ headers.Authorization = `Bearer ${apiKey}`;
124
+ }
125
+ return headers;
126
+ }
127
+
128
+ /**
129
+ * Stream a turn through an `omp auth-gateway` over the pi-native protocol.
130
+ *
131
+ * The returned {@link AssistantMessageEventStream} receives each parsed
132
+ * `AssistantMessageEvent` verbatim from the gateway; the terminal `done` /
133
+ * `error` event resolves `.result()` automatically via the base class's
134
+ * completion check. Non-streaming consumers just call `.result()` and pay
135
+ * for SSE framing they don't use — that overhead is dominated by provider
136
+ * latency, so we always stream rather than maintaining a parallel
137
+ * non-streaming path.
138
+ */
139
+ export function streamPiNative<TApi extends Api>(
140
+ model: Model<TApi>,
141
+ context: Context,
142
+ options?: SimpleStreamOptions,
143
+ ): AssistantMessageEventStreamType {
144
+ const stream = new AssistantMessageEventStream();
145
+
146
+ void (async () => {
147
+ const callerSignal = options?.signal;
148
+ const abortTracker = createAbortSourceTracker(callerSignal);
149
+ // Abort propagation: cancel the response body when the caller's signal
150
+ // fires. Mirror `streamProxy`'s shape — explicit listener + finally
151
+ // cleanup — so we don't leak listeners on the long-running case.
152
+ let response: Response | null = null;
153
+ const onAbort = (): void => {
154
+ const body = response?.body;
155
+ if (body) body.cancel("Request aborted by caller").catch(() => {});
156
+ };
157
+ if (callerSignal) {
158
+ if (callerSignal.aborted) {
159
+ stream.fail(
160
+ callerSignal.reason instanceof Error
161
+ ? callerSignal.reason
162
+ : new Error(String(callerSignal.reason ?? "aborted")),
163
+ );
164
+ return;
165
+ }
166
+ callerSignal.addEventListener("abort", onAbort, { once: true });
167
+ }
168
+
169
+ try {
170
+ const url = resolveStreamUrl(model as Model<Api>);
171
+ const fetchImpl = options?.fetch ?? globalThis.fetch;
172
+ const headers = buildHeaders(
173
+ model as Model<Api>,
174
+ typeof options?.apiKey === "string" ? options.apiKey : undefined,
175
+ );
176
+ const body = JSON.stringify({
177
+ modelId: `${model.provider}/${model.id}`,
178
+ context,
179
+ options: buildWireOptions(options),
180
+ stream: true,
181
+ });
182
+
183
+ response = await fetchImpl(url, { method: "POST", headers, body, signal: abortTracker.requestSignal });
184
+ if (!response.ok) {
185
+ stream.fail(await decodeGatewayError(response));
186
+ return;
187
+ }
188
+ // Callers can truthfully inspect the gateway HTTP response, but its
189
+ // request body is opaque here; callbacks themselves never cross the wire.
190
+ await notifyProviderResponse(
191
+ options,
192
+ response,
193
+ model,
194
+ response.headers.get("x-request-id") ?? response.headers.get("request-id"),
195
+ );
196
+ if (!response.body) {
197
+ stream.fail(
198
+ new AIError.AuthGatewayError("auth-gateway returned empty body", response.status, response.headers),
199
+ );
200
+ return;
201
+ }
202
+
203
+ const idleTimeoutMs = options?.streamIdleTimeoutMs ?? getStreamIdleTimeoutMs();
204
+ const firstEventTimeoutMs = options?.streamFirstEventTimeoutMs ?? getStreamFirstEventTimeoutMs(idleTimeoutMs);
205
+ const source = readSseJson<AssistantMessageEvent>(
206
+ response.body as ReadableStream<Uint8Array>,
207
+ abortTracker.requestSignal,
208
+ );
209
+ const watchedSource = iterateWithIdleTimeout(source, {
210
+ idleTimeoutMs,
211
+ firstItemTimeoutMs: firstEventTimeoutMs,
212
+ errorMessage: PI_NATIVE_STREAM_IDLE_TIMEOUT_ERROR,
213
+ firstItemErrorMessage: PI_NATIVE_STREAM_FIRST_EVENT_TIMEOUT_ERROR,
214
+ onIdle: () =>
215
+ abortTracker.abortLocally(new AIError.StreamTimeoutError(PI_NATIVE_STREAM_IDLE_TIMEOUT_ERROR)),
216
+ onFirstItemTimeout: () =>
217
+ abortTracker.abortLocally(new AIError.StreamTimeoutError(PI_NATIVE_STREAM_FIRST_EVENT_TIMEOUT_ERROR)),
218
+ isProgressItem: isPiNativeProgressEvent,
219
+ });
220
+ let sawTerminal = false;
221
+ for await (const event of watchedSource) {
222
+ if (event.type === "done" || event.type === "error") sawTerminal = true;
223
+ stream.push(event);
224
+ // `stream.push` resolves `.result()` on `done`/`error`; subsequent
225
+ // pushes are silently dropped by the base class. We still iterate
226
+ // to drain any trailing bytes from the wire so the underlying TCP
227
+ // stream closes cleanly.
228
+ }
229
+
230
+ if (!sawTerminal) {
231
+ // SSE closed before a terminal event reached us — synthesize one
232
+ // so awaiters of `.result()` resolve instead of hanging forever.
233
+ // Matches the gateway's own defensive fallback in
234
+ // `pi-native-server.encodeStream`.
235
+ const aborted = abortTracker.wasCallerAbort();
236
+ const partial = makeSyntheticAssistant(model as Model<Api>);
237
+ if (aborted) {
238
+ partial.stopReason = "aborted";
239
+ partial.errorMessage = "stream closed without terminal event";
240
+ stream.push({ type: "error", reason: "aborted", error: partial });
241
+ } else {
242
+ partial.stopReason = "stop";
243
+ stream.push({ type: "done", reason: "stop", message: partial });
244
+ }
245
+ }
246
+ stream.end();
247
+ } catch (err) {
248
+ stream.fail(err);
249
+ } finally {
250
+ if (callerSignal) callerSignal.removeEventListener("abort", onAbort);
251
+ }
252
+ })();
253
+
254
+ return stream;
255
+ }
256
+
257
+ function makeSyntheticAssistant(model: Model<Api>): AssistantMessage {
258
+ return {
259
+ role: "assistant",
260
+ content: [],
261
+ api: model.api,
262
+ provider: model.provider,
263
+ model: model.id,
264
+ usage: {
265
+ input: 0,
266
+ output: 0,
267
+ cacheRead: 0,
268
+ cacheWrite: 0,
269
+ totalTokens: 0,
270
+ cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },
271
+ },
272
+ stopReason: "stop",
273
+ timestamp: Date.now(),
274
+ };
275
+ }
@@ -0,0 +1,245 @@
1
+ /**
2
+ * Pi-native wire format for the auth-gateway.
3
+ *
4
+ * Where the OpenAI / Anthropic / Responses route modules translate foreign
5
+ * wire shapes through pi-ai's canonical {@link Context}, this module accepts
6
+ * the canonical shape *directly* — for clients that already speak pi-ai
7
+ * (containerized omp, robomp's sidecar auth-gateway).
8
+ * Skipping the wire-format → Context → wire-format round-trip cuts
9
+ * per-request CPU but, more importantly, avoids the quantization that those
10
+ * translations impose on first-class pi-ai fields (service tier, cache
11
+ * markers, thinking budgets, tool-choice variants, …).
12
+ *
13
+ * The streaming wire is {@link AssistantMessageEvent} serialized verbatim and
14
+ * SSE-framed. Same type pi-ai already produces internally; the client feeds
15
+ * each parsed event straight into `AssistantMessageEventStream.push()` with
16
+ * no translation. Including `partial: AssistantMessage` on every delta is
17
+ * O(N²) in turn length on the wire — acceptable for the loopback / sidecar
18
+ * topology this transport is designed for; provider latency dominates the
19
+ * actual cost.
20
+ *
21
+ * Endpoint contract:
22
+ * POST /v1/pi/stream
23
+ * body: { modelId, context, options?, stream? } // `stream` defaults to true
24
+ * 200 SSE: stream of `AssistantMessageEvent` (terminated by `data: [DONE]`)
25
+ * 200 JSON (stream=false): { message: AssistantMessage }
26
+ * 4xx/5xx: { error: { type, message } }
27
+ */
28
+
29
+ import type { AuthGatewayStreamControl } from "../auth-gateway/types";
30
+ import * as AIError from "../error";
31
+ import type { AssistantMessageEventStream, Context, SimpleStreamOptions } from "../types";
32
+
33
+ export interface PiNativeParsedRequest {
34
+ modelId: string;
35
+ context: Context;
36
+ options: SimpleStreamOptions;
37
+ stream: boolean;
38
+ }
39
+ /**
40
+ * Subset of {@link SimpleStreamOptions} accepted from the wire. Function-valued
41
+ * fields (`fetch`, `onPayload`, `onResponse`, `onSseEvent`, exec handlers, the
42
+ * provider-session map) and gateway-owned controls (`apiKey`, `signal`) are
43
+ * intentionally absent — those are server-side concerns. Anything outside this
44
+ * allow-list is dropped silently rather than 400ing, so clients can forward
45
+ * `SimpleStreamOptions` from older / newer omp builds without per-version
46
+ * conditionals.
47
+ */
48
+ const ALLOWED_OPTION_KEYS: ReadonlySet<keyof SimpleStreamOptions> = new Set([
49
+ "temperature",
50
+ "topP",
51
+ "topK",
52
+ "minP",
53
+ "presencePenalty",
54
+ "frequencyPenalty",
55
+ "repetitionPenalty",
56
+ "stopSequences",
57
+ "maxTokens",
58
+ "cacheRetention",
59
+ "cachedContent",
60
+ "headers",
61
+ "initiatorOverride",
62
+ "maxRetryDelayMs",
63
+ "metadata",
64
+ "sessionId",
65
+ "promptCacheKey",
66
+ "promptCache",
67
+ "statefulResponses",
68
+ "streamFirstEventTimeoutMs",
69
+ "streamIdleTimeoutMs",
70
+ "reasoning",
71
+ "disableReasoning",
72
+ "hideThinkingSummary",
73
+ "thinkingBudgets",
74
+ "toolChoice",
75
+ "serviceTier",
76
+ "kimiApiFormat",
77
+ "syntheticApiFormat",
78
+ "preferWebsockets",
79
+ "openrouterVariant",
80
+ "loopGuard",
81
+ ] as const satisfies readonly (keyof SimpleStreamOptions)[]);
82
+
83
+ // ---------------------------------------------------------------------------
84
+ // parseRequest
85
+ // ---------------------------------------------------------------------------
86
+
87
+ /**
88
+ * Parse a pi-native request body. Validation is intentionally minimal — only
89
+ * the shape the gateway itself reads is checked (`modelId`, `context.messages`
90
+ * array, options is an object). Everything downstream is the canonical pi-ai
91
+ * type surface; mis-shaped values surface as a `502 upstream_error` from
92
+ * `streamSimple` rather than being re-validated here.
93
+ *
94
+ * Accepts both `{ modelId: string }` and `{ model: { id: string } }` so the
95
+ * existing `streamProxy` client (which sends the full Model object) can target
96
+ * the gateway with only a URL swap.
97
+ */
98
+ export function parseRequest(body: unknown, _headers?: Headers): PiNativeParsedRequest {
99
+ if (typeof body !== "object" || body === null || Array.isArray(body)) {
100
+ throw new AIError.ValidationError("Request body must be a JSON object");
101
+ }
102
+ const obj = body as Record<string, unknown>;
103
+
104
+ let modelId: string | undefined;
105
+ if (typeof obj.modelId === "string" && obj.modelId.length > 0) {
106
+ modelId = obj.modelId;
107
+ } else if (typeof obj.model === "string" && obj.model.length > 0) {
108
+ modelId = obj.model;
109
+ } else if (typeof obj.model === "object" && obj.model !== null) {
110
+ const m = obj.model as Record<string, unknown>;
111
+ if (typeof m.id === "string" && m.id.length > 0) modelId = m.id;
112
+ }
113
+ if (!modelId) throw new AIError.ValidationError("Missing `modelId` (or `model.id`) field");
114
+
115
+ const context = obj.context;
116
+ if (typeof context !== "object" || context === null || Array.isArray(context)) {
117
+ throw new AIError.ValidationError("Missing `context` object");
118
+ }
119
+ const ctxObj = context as Record<string, unknown>;
120
+ if (!Array.isArray(ctxObj.messages)) {
121
+ throw new AIError.ValidationError("`context.messages` must be an array");
122
+ }
123
+ if (ctxObj.systemPrompt !== undefined && !Array.isArray(ctxObj.systemPrompt)) {
124
+ throw new AIError.ValidationError("`context.systemPrompt` must be an array of strings when present");
125
+ }
126
+ if (ctxObj.tools !== undefined && !Array.isArray(ctxObj.tools)) {
127
+ throw new AIError.ValidationError("`context.tools` must be an array when present");
128
+ }
129
+
130
+ const options: SimpleStreamOptions = {};
131
+ const rawOpts = obj.options;
132
+ if (typeof rawOpts === "object" && rawOpts !== null && !Array.isArray(rawOpts)) {
133
+ const optsBag = options as Record<string, unknown>;
134
+ for (const [k, v] of Object.entries(rawOpts)) {
135
+ if (v === undefined || v === null) continue;
136
+ if (!ALLOWED_OPTION_KEYS.has(k as keyof SimpleStreamOptions)) continue;
137
+ optsBag[k] = v;
138
+ }
139
+ }
140
+
141
+ // `stream` defaults to true — pi-native clients overwhelmingly stream, and
142
+ // matching `streamProxy`'s implicit-stream behavior avoids a one-flag papercut.
143
+ const stream = typeof obj.stream === "boolean" ? obj.stream : true;
144
+
145
+ return {
146
+ modelId,
147
+ context: context as Context,
148
+ options,
149
+ stream,
150
+ };
151
+ }
152
+ // ---------------------------------------------------------------------------
153
+ // encodeStream (SSE)
154
+ // ---------------------------------------------------------------------------
155
+
156
+ const SSE_ENCODER = new TextEncoder();
157
+ const SSE_DONE = SSE_ENCODER.encode("data: [DONE]\n\n");
158
+
159
+ /**
160
+ * Ship every {@link AssistantMessageEvent} verbatim, SSE-framed.
161
+ *
162
+ * No per-event re-shaping: the pi-native client is pi-ai itself, so the
163
+ * canonical event type IS the wire type. Including the rolling
164
+ * `partial: AssistantMessage` on every delta is quadratic in turn length
165
+ * on the wire, but for the loopback / sidecar topology this transport
166
+ * targets (containerized omp → host gateway, robomp slot → omp-auth-gateway
167
+ * sidecar) the bandwidth cost is negligible compared to provider latency —
168
+ * and the client gets to feed the events straight into its existing
169
+ * `AssistantMessageEventStream.push()` plumbing with zero translation.
170
+ */
171
+ export function encodeStream(
172
+ events: AssistantMessageEventStream,
173
+ _requestedModelId?: string,
174
+ _options?: SimpleStreamOptions,
175
+ control?: AuthGatewayStreamControl,
176
+ ): ReadableStream<Uint8Array> {
177
+ let cancelled = control?.signal?.aborted === true;
178
+ const markCancelled = () => {
179
+ cancelled = true;
180
+ };
181
+ control?.signal?.addEventListener("abort", markCancelled, { once: true });
182
+ return new ReadableStream<Uint8Array>({
183
+ async start(controller) {
184
+ try {
185
+ if (cancelled) {
186
+ controller.close();
187
+ return;
188
+ }
189
+ for await (const event of events) {
190
+ if (cancelled) return;
191
+ controller.enqueue(SSE_ENCODER.encode(`data: ${JSON.stringify(event)}\n\n`));
192
+ if (event.type === "done" || event.type === "error") break;
193
+ }
194
+ if (!cancelled) {
195
+ controller.enqueue(SSE_DONE);
196
+ controller.close();
197
+ }
198
+ } catch (err) {
199
+ if (!cancelled) {
200
+ // Best-effort error envelope so the client iterator resolves
201
+ // instead of hanging on the dropped connection. Shape matches the
202
+ // canonical `error` event minus the unrecoverable `error:
203
+ // AssistantMessage` payload (we don't have a usable one here).
204
+ const message = err instanceof Error ? err.message : String(err);
205
+ controller.enqueue(
206
+ SSE_ENCODER.encode(
207
+ `data: ${JSON.stringify({ type: "error", reason: "error", errorMessage: message })}\n\n`,
208
+ ),
209
+ );
210
+ controller.enqueue(SSE_DONE);
211
+ controller.close();
212
+ }
213
+ } finally {
214
+ control?.signal?.removeEventListener("abort", markCancelled);
215
+ }
216
+ },
217
+ cancel(reason) {
218
+ cancelled = true;
219
+ control?.signal?.removeEventListener("abort", markCancelled);
220
+ control?.onCancel?.(reason);
221
+ },
222
+ });
223
+ }
224
+
225
+ // ---------------------------------------------------------------------------
226
+ // formatError
227
+ // ---------------------------------------------------------------------------
228
+
229
+ /**
230
+ * Pi-native error envelope:
231
+ * `{ error: { type, message } }`
232
+ *
233
+ * Mirrors OpenAI's outer shape (which clients/SDKs already parse) without the
234
+ * provider-specific status taxonomy — pi-native callers consume `type`
235
+ * directly.
236
+ */
237
+ export function formatError(status: number, type: string, message: string): Response {
238
+ return new Response(JSON.stringify({ error: { type, message } }), {
239
+ status,
240
+ headers: {
241
+ "Content-Type": "application/json; charset=utf-8",
242
+ "Cache-Control": "no-store",
243
+ },
244
+ });
245
+ }