@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,201 @@
1
+ import type { ClientRequest, IncomingMessage } from "node:http";
2
+ import * as https from "node:https";
3
+ import * as stream from "node:stream";
4
+ import * as tls from "node:tls";
5
+ import * as zlib from "node:zlib";
6
+ import type { FetchImpl } from "../types";
7
+ import { connectProxiedSocket } from "../utils/proxy";
8
+
9
+ type CoworkTlsOptions = {
10
+ ca?: string | string[];
11
+ cert?: string;
12
+ key?: string;
13
+ rejectUnauthorized?: boolean;
14
+ serverName?: string;
15
+ ciphers?: string;
16
+ };
17
+
18
+ type CoworkRequestInit = RequestInit & {
19
+ proxy?: string;
20
+ tls?: CoworkTlsOptions;
21
+ };
22
+
23
+ type RequestBody = string | Uint8Array;
24
+
25
+ type AgentLease = {
26
+ agent: https.Agent;
27
+ release?: () => void;
28
+ };
29
+
30
+ const directAgent = new https.Agent({ keepAlive: true });
31
+ const fallbackFetch: FetchImpl = globalThis.fetch;
32
+
33
+ function isHeaderRecord(headers: RequestInit["headers"]): headers is Record<string, string> {
34
+ return headers !== undefined && !(headers instanceof Headers) && !Array.isArray(headers);
35
+ }
36
+
37
+ function resolveBody(body: RequestInit["body"]): RequestBody | undefined {
38
+ if (typeof body === "string" || body instanceof Uint8Array) return body;
39
+ return undefined;
40
+ }
41
+
42
+ function buildOrderedHeaders(
43
+ url: URL,
44
+ source: Record<string, string>,
45
+ body: RequestBody | undefined,
46
+ ): Record<string, string> {
47
+ const headers: Record<string, string> = {};
48
+ let hasHost = false;
49
+ let hasContentLength = false;
50
+ for (const name in source) {
51
+ const lowerName = name.toLowerCase();
52
+ if (lowerName === "host") hasHost = true;
53
+ if (lowerName === "content-length") hasContentLength = true;
54
+ if (lowerName === "accept-encoding" && !hasHost) {
55
+ headers.Host = url.host;
56
+ hasHost = true;
57
+ }
58
+ headers[name] = source[name];
59
+ }
60
+ if (!hasHost) headers.Host = url.host;
61
+ const length = typeof body === "string" ? Buffer.byteLength(body) : body?.byteLength;
62
+ if (!hasContentLength && length !== undefined) headers["Content-Length"] = String(length);
63
+ return headers;
64
+ }
65
+
66
+ function resolveTlsOptions(url: URL, options: CoworkTlsOptions | undefined): tls.ConnectionOptions {
67
+ const resolved: tls.ConnectionOptions = {
68
+ ALPNProtocols: ["http/1.1"],
69
+ ciphers: options?.ciphers ?? tls.DEFAULT_CIPHERS,
70
+ rejectUnauthorized: options?.rejectUnauthorized ?? true,
71
+ servername: options?.serverName ?? url.hostname,
72
+ };
73
+ if (options?.ca !== undefined) resolved.ca = options.ca;
74
+ if (options?.cert !== undefined) resolved.cert = options.cert;
75
+ if (options?.key !== undefined) resolved.key = options.key;
76
+ return resolved;
77
+ }
78
+
79
+ async function acquireAgent(
80
+ url: URL,
81
+ proxy: string | undefined,
82
+ tlsOptions: tls.ConnectionOptions,
83
+ signal: AbortSignal | undefined,
84
+ ): Promise<AgentLease> {
85
+ if (!proxy) return { agent: directAgent };
86
+ const socket = await connectProxiedSocket(proxy, url.origin, { signal, tls: tlsOptions });
87
+ const agent = new https.Agent({ keepAlive: false });
88
+ agent.createConnection = () => socket;
89
+ return { agent, release: () => agent.destroy() };
90
+ }
91
+
92
+ function responseHeaders(message: IncomingMessage): Headers {
93
+ const headers = new Headers();
94
+ for (let index = 0; index < message.rawHeaders.length; index += 2) {
95
+ headers.append(message.rawHeaders[index], message.rawHeaders[index + 1]);
96
+ }
97
+ return headers;
98
+ }
99
+
100
+ function decodedResponseStream(message: IncomingMessage): stream.Readable {
101
+ const rawEncoding = message.headers["content-encoding"];
102
+ const encoding = (Array.isArray(rawEncoding) ? rawEncoding[0] : rawEncoding)?.trim().toLowerCase();
103
+ switch (encoding) {
104
+ case "gzip":
105
+ return message.pipe(zlib.createGunzip());
106
+ case "deflate":
107
+ return message.pipe(zlib.createInflate());
108
+ case "br":
109
+ return message.pipe(zlib.createBrotliDecompress());
110
+ case "zstd":
111
+ return message.pipe(zlib.createZstdDecompress());
112
+ default:
113
+ return message;
114
+ }
115
+ }
116
+
117
+ function createResponse(message: IncomingMessage, method: string): Response {
118
+ const status = message.statusCode;
119
+ if (status === undefined) throw new Error("Cowork transport received a response without an HTTP status.");
120
+ const hasBody = method !== "HEAD" && status !== 204 && status !== 304;
121
+ const body = hasBody ? stream.Readable.toWeb(decodedResponseStream(message)) : null;
122
+ return new Response(body, {
123
+ status,
124
+ statusText: message.statusMessage,
125
+ headers: responseHeaders(message),
126
+ });
127
+ }
128
+
129
+ async function sendCoworkRequest(
130
+ url: URL,
131
+ init: CoworkRequestInit,
132
+ sourceHeaders: Record<string, string>,
133
+ body: RequestBody | undefined,
134
+ ): Promise<Response> {
135
+ const method = init.method ?? "GET";
136
+ const signal = init.signal ?? undefined;
137
+ const tlsOptions = resolveTlsOptions(url, init.tls);
138
+ const lease = await acquireAgent(url, init.proxy, tlsOptions, signal);
139
+ const headers = buildOrderedHeaders(url, sourceHeaders, body);
140
+ const result = Promise.withResolvers<Response>();
141
+ let request: ClientRequest | undefined;
142
+ const release = (): void => {
143
+ signal?.removeEventListener("abort", abort);
144
+ lease.release?.();
145
+ };
146
+ const abort = (): void => {
147
+ const reason = signal?.reason;
148
+ request?.destroy(reason instanceof Error ? reason : new DOMException("The operation was aborted.", "AbortError"));
149
+ };
150
+ if (signal?.aborted) {
151
+ release();
152
+ signal.throwIfAborted();
153
+ }
154
+ signal?.addEventListener("abort", abort, { once: true });
155
+ request = https.request(
156
+ {
157
+ protocol: url.protocol,
158
+ hostname: url.hostname,
159
+ port: url.port || 443,
160
+ path: `${url.pathname}${url.search}`,
161
+ method,
162
+ headers,
163
+ agent: lease.agent,
164
+ ...tlsOptions,
165
+ },
166
+ message => {
167
+ message.once("close", release);
168
+ try {
169
+ result.resolve(createResponse(message, method));
170
+ } catch (error) {
171
+ message.destroy();
172
+ release();
173
+ result.reject(error);
174
+ }
175
+ },
176
+ );
177
+ request.once("error", error => {
178
+ release();
179
+ result.reject(error);
180
+ });
181
+ request.end(body);
182
+ return result.promise;
183
+ }
184
+
185
+ /** Sends Cowork-profiled HTTPS requests with stable header order, HTTP/1.1, and streaming decompression. */
186
+ export const coworkFetch: FetchImpl = async (input, init) => {
187
+ if (input instanceof Request || init === undefined || !isHeaderRecord(init.headers)) {
188
+ return fallbackFetch(input, init);
189
+ }
190
+ let url: URL;
191
+ try {
192
+ url = new URL(input);
193
+ } catch {
194
+ return fallbackFetch(input, init);
195
+ }
196
+ if (url.protocol !== "https:") return fallbackFetch(input, init);
197
+ const body = resolveBody(init.body);
198
+ if (init.body != null && body === undefined) return fallbackFetch(input, init);
199
+ const coworkInit: CoworkRequestInit = init;
200
+ return sendCoworkRequest(url, coworkInit, init.headers, body);
201
+ };
@@ -0,0 +1,496 @@
1
+ /**
2
+ * Proto builders for the modern Cursor CLI exec frames (`ExecServerMessage`
3
+ * 27-31, 36-38, 40-55).
4
+ *
5
+ * Split out of `cursor.ts` because these are pure `create(...)` shapes with no
6
+ * transport, stream, or block-state coupling: the dispatcher decides *which*
7
+ * answer a frame gets, this module knows *what* that answer looks like on the
8
+ * wire. Every builder returns a result whose oneof case is set — an
9
+ * `ExecClientMessage` carrying a result with an unset oneof is a fake success
10
+ * the server reads as "the tool ran and produced nothing".
11
+ */
12
+
13
+ import { create } from "@bufbuild/protobuf";
14
+ import {
15
+ AfterAgentResponseRequestResponseSchema,
16
+ AfterAgentThoughtRequestResponseSchema,
17
+ BeforeSubmitPromptRequestResponseSchema,
18
+ type ExecuteHookRequest,
19
+ type ExecuteHookResponse,
20
+ ExecuteHookResponseSchema,
21
+ type ExecuteHookResult,
22
+ ExecuteHookResultSchema,
23
+ type McpStateExecResult,
24
+ McpStateExecResultSchema,
25
+ McpStateServerSchema,
26
+ McpStateSuccessSchema,
27
+ type McpToolDefinition,
28
+ PiBashExecErrorSchema,
29
+ type PiBashExecResult,
30
+ PiBashExecResultSchema,
31
+ PiBashExecSuccessSchema,
32
+ PiEditExecErrorSchema,
33
+ PiEditExecRejectedSchema,
34
+ type PiEditExecResult,
35
+ PiEditExecResultSchema,
36
+ PiEditExecSuccessSchema,
37
+ PiFindExecErrorSchema,
38
+ type PiFindExecResult,
39
+ PiFindExecResultSchema,
40
+ PiFindExecSuccessSchema,
41
+ PiGrepExecErrorSchema,
42
+ type PiGrepExecResult,
43
+ PiGrepExecResultSchema,
44
+ PiGrepExecSuccessSchema,
45
+ PiLsExecErrorSchema,
46
+ type PiLsExecResult,
47
+ PiLsExecResultSchema,
48
+ PiLsExecSuccessSchema,
49
+ PiReadExecErrorSchema,
50
+ type PiReadExecResult,
51
+ PiReadExecResultSchema,
52
+ PiReadExecSuccessSchema,
53
+ type PiTruncation,
54
+ PiTruncationSchema,
55
+ PiWriteExecErrorSchema,
56
+ PiWriteExecRejectedSchema,
57
+ type PiWriteExecResult,
58
+ PiWriteExecResultSchema,
59
+ PiWriteExecSuccessSchema,
60
+ PostToolUseFailureRequestResponseSchema,
61
+ PostToolUseRequestResponseSchema,
62
+ PreCompactRequestResponseSchema,
63
+ PreToolUseRequestResponseSchema,
64
+ StopRequestResponseSchema,
65
+ SubagentStartRequestResponseSchema,
66
+ SubagentStopRequestResponseSchema,
67
+ } from "@linxiraos/pi-catalog/discovery/cursor-gen/agent_pb";
68
+ import type { ToolResultMessage } from "../../types";
69
+
70
+ /**
71
+ * The pure arg translation lives in `../cursor-pi-args` so the legacy pi shim
72
+ * can share it without pulling this module's protobuf graph into the bundled
73
+ * virtual registry. Re-exported here because this is where the frame builders
74
+ * and their translation are consumed together.
75
+ */
76
+ export {
77
+ piEscapeRegexLiteral,
78
+ piGrepSkip,
79
+ piJoinPath,
80
+ piLimit,
81
+ piLsPath,
82
+ piReadDisplayPath,
83
+ piReadPath,
84
+ piReadPathHasRange,
85
+ piTimeout,
86
+ } from "../cursor-pi-args";
87
+
88
+ /** Flatten a tool result's content into the single `output` string the Pi frames carry. */
89
+ export function piOutputText(toolResult: ToolResultMessage): string {
90
+ return toolResult.content.map(item => (item.type === "text" ? item.text : `[${item.mimeType} image]`)).join("\n");
91
+ }
92
+
93
+ /**
94
+ * Read one field off a tool result's `details` bag, or off a nested object
95
+ * inside it.
96
+ *
97
+ * `details` is `unknown` by design — every tool ships its own shape — so each
98
+ * read is narrowed rather than asserted, and the caller decides what a value of
99
+ * the wrong type means.
100
+ */
101
+ function bagValue(bag: unknown, key: string): unknown {
102
+ if (!bag || typeof bag !== "object" || !(key in bag)) return undefined;
103
+ return Reflect.get(bag, key);
104
+ }
105
+
106
+ /**
107
+ * A positive integer count from `details`, or `undefined`.
108
+ *
109
+ * The Pi frames model their limit counters as `optional uint32`: zero means
110
+ * "the limit was reached at zero results", so a missing, non-numeric, or
111
+ * non-positive value must stay unset rather than be sent as 0.
112
+ */
113
+ function detailCount(toolResult: ToolResultMessage, key: string): number | undefined {
114
+ const value = bagValue(toolResult.details, key);
115
+ return positiveCount(value);
116
+ }
117
+
118
+ function positiveCount(value: unknown): number | undefined {
119
+ return typeof value === "number" && Number.isFinite(value) && value > 0 ? Math.floor(value) : undefined;
120
+ }
121
+
122
+ /**
123
+ * The entry cap a listing hit, from either shape a local tool records it in.
124
+ *
125
+ * `glob` sets a flat `details.resultLimitReached` alongside the structured
126
+ * meta; `read` — which serves `pi_ls` — records the cap only through
127
+ * `OutputMeta` at `details.meta.limits.resultLimit.reached`. Reading just the
128
+ * flat field dropped `entry_limit_reached` for every real listing, so Cursor
129
+ * received clipped output with no incompleteness signal.
130
+ */
131
+ function resultLimitReached(toolResult: ToolResultMessage): number | undefined {
132
+ const flat = detailCount(toolResult, "resultLimitReached");
133
+ if (flat !== undefined) return flat;
134
+ const limits = bagValue(bagValue(toolResult.details, "meta"), "limits");
135
+ return positiveCount(bagValue(bagValue(limits, "resultLimit"), "reached"));
136
+ }
137
+
138
+ /**
139
+ * Translate a local tool's truncation summary into `PiTruncation`.
140
+ *
141
+ * Two shapes reach here. `read`/`grep` set `details.truncation`
142
+ * (`TruncationResult`), which carries an explicit `truncated` boolean. `bash`
143
+ * sets `details.meta.truncation` (`TruncationMeta`), which has **no** such
144
+ * flag — its presence *is* the signal, and requiring the boolean silently
145
+ * dropped every Bash truncation, handing Cursor clipped output with no notice
146
+ * that it was clipped.
147
+ *
148
+ * Returns `undefined` when nothing was truncated: the field is `optional` on
149
+ * every Pi success message, and emitting a zeroed `PiTruncation` would tell the
150
+ * server the output was trimmed to nothing.
151
+ */
152
+ export function piTruncation(toolResult: ToolResultMessage): PiTruncation | undefined {
153
+ const direct = bagValue(toolResult.details, "truncation");
154
+ // `TruncationResult` is authoritative when present and explicitly false.
155
+ const truncation = direct !== undefined ? direct : bagValue(bagValue(toolResult.details, "meta"), "truncation");
156
+ if (truncation === undefined || truncation === null) return undefined;
157
+ // `TruncationResult` gates on its flag; `TruncationMeta` has none and is
158
+ // only ever attached when output was actually trimmed.
159
+ const flag = bagValue(truncation, "truncated");
160
+ if (flag !== undefined && flag !== true) return undefined;
161
+ const truncatedBy = bagValue(truncation, "truncatedBy");
162
+ const totalLines = bagValue(truncation, "totalLines");
163
+ const outputLines = bagValue(truncation, "outputLines");
164
+ const outputBytes = bagValue(truncation, "outputBytes");
165
+ return create(PiTruncationSchema, {
166
+ truncated: true,
167
+ truncatedBy: typeof truncatedBy === "string" ? truncatedBy : "",
168
+ totalLines: typeof totalLines === "number" ? totalLines : 0,
169
+ outputLines: typeof outputLines === "number" ? outputLines : 0,
170
+ outputBytes: typeof outputBytes === "number" ? outputBytes : 0,
171
+ firstLineExceedsLimit: bagValue(truncation, "firstLineExceedsLimit") === true,
172
+ lastLinePartial: bagValue(truncation, "lastLinePartial") === true,
173
+ });
174
+ }
175
+
176
+ export function buildPiReadResult(toolResult: ToolResultMessage): PiReadExecResult {
177
+ const text = piOutputText(toolResult);
178
+ if (toolResult.isError) return buildPiReadError(text || "Read failed");
179
+ return create(PiReadExecResultSchema, {
180
+ result: {
181
+ case: "success",
182
+ value: create(PiReadExecSuccessSchema, { output: text, truncation: piTruncation(toolResult) }),
183
+ },
184
+ });
185
+ }
186
+
187
+ export function buildPiReadError(error: string): PiReadExecResult {
188
+ return create(PiReadExecResultSchema, {
189
+ result: { case: "error", value: create(PiReadExecErrorSchema, { error }) },
190
+ });
191
+ }
192
+
193
+ export function buildPiBashResult(toolResult: ToolResultMessage): PiBashExecResult {
194
+ const text = piOutputText(toolResult);
195
+ const truncation = piTruncation(toolResult);
196
+ if (toolResult.isError) {
197
+ return create(PiBashExecResultSchema, {
198
+ result: {
199
+ case: "error",
200
+ value: create(PiBashExecErrorSchema, { error: text || "Command failed", truncation }),
201
+ },
202
+ });
203
+ }
204
+ return create(PiBashExecResultSchema, {
205
+ result: {
206
+ case: "success",
207
+ value: create(PiBashExecSuccessSchema, { output: text, truncation }),
208
+ },
209
+ });
210
+ }
211
+
212
+ export function buildPiBashError(error: string): PiBashExecResult {
213
+ return create(PiBashExecResultSchema, {
214
+ result: { case: "error", value: create(PiBashExecErrorSchema, { error }) },
215
+ });
216
+ }
217
+
218
+ /**
219
+ * `PiEditExecSuccess` requires `diff` and `patch` alongside `output`. The local
220
+ * `edit` tool reports them under `details`; when it does not, the strings stay
221
+ * empty rather than being faked from the output text.
222
+ */
223
+ export function buildPiEditResult(toolResult: ToolResultMessage): PiEditExecResult {
224
+ const text = piOutputText(toolResult);
225
+ if (toolResult.isError) return buildPiEditError(text || "Edit failed");
226
+ const diff = bagValue(toolResult.details, "diff");
227
+ const patch = bagValue(toolResult.details, "patch");
228
+ return create(PiEditExecResultSchema, {
229
+ result: {
230
+ case: "success",
231
+ value: create(PiEditExecSuccessSchema, {
232
+ output: text,
233
+ diff: typeof diff === "string" ? diff : "",
234
+ patch: typeof patch === "string" ? patch : "",
235
+ firstChangedLine: detailCount(toolResult, "firstChangedLine"),
236
+ }),
237
+ },
238
+ });
239
+ }
240
+
241
+ export function buildPiEditError(error: string): PiEditExecResult {
242
+ return create(PiEditExecResultSchema, {
243
+ result: { case: "error", value: create(PiEditExecErrorSchema, { error }) },
244
+ });
245
+ }
246
+
247
+ /**
248
+ * A refusal is not an execution failure: `PiEditExecResult` models them as
249
+ * separate variants, and answering a denied call with `error` reads as "the
250
+ * edit ran and broke", which invites a retry of an operation that was never
251
+ * permitted.
252
+ */
253
+ export function buildPiEditRejected(reason: string): PiEditExecResult {
254
+ return create(PiEditExecResultSchema, {
255
+ result: { case: "rejected", value: create(PiEditExecRejectedSchema, { reason }) },
256
+ });
257
+ }
258
+
259
+ export function buildPiWriteResult(toolResult: ToolResultMessage): PiWriteExecResult {
260
+ const text = piOutputText(toolResult);
261
+ if (toolResult.isError) return buildPiWriteError(text || "Write failed");
262
+ return create(PiWriteExecResultSchema, {
263
+ result: { case: "success", value: create(PiWriteExecSuccessSchema, { output: text }) },
264
+ });
265
+ }
266
+
267
+ export function buildPiWriteError(error: string): PiWriteExecResult {
268
+ return create(PiWriteExecResultSchema, {
269
+ result: { case: "error", value: create(PiWriteExecErrorSchema, { error }) },
270
+ });
271
+ }
272
+
273
+ /** Same variant split as {@link buildPiEditRejected}. */
274
+ export function buildPiWriteRejected(reason: string): PiWriteExecResult {
275
+ return create(PiWriteExecResultSchema, {
276
+ result: { case: "rejected", value: create(PiWriteExecRejectedSchema, { reason }) },
277
+ });
278
+ }
279
+
280
+ export function buildPiGrepResult(toolResult: ToolResultMessage): PiGrepExecResult {
281
+ const text = piOutputText(toolResult);
282
+ if (toolResult.isError) return buildPiGrepError(text || "Grep failed");
283
+ const matchLimitReached = detailCount(toolResult, "perFileLimitReached");
284
+ return create(PiGrepExecResultSchema, {
285
+ result: {
286
+ case: "success",
287
+ value: create(PiGrepExecSuccessSchema, {
288
+ output: text,
289
+ truncation: piTruncation(toolResult) ?? grepInternalCapTruncation(toolResult, text, matchLimitReached),
290
+ matchLimitReached,
291
+ linesTruncated: bagValue(toolResult.details, "linesTruncated") === true,
292
+ }),
293
+ },
294
+ });
295
+ }
296
+
297
+ /**
298
+ * The one grep cap that reaches Cursor through no other field.
299
+ *
300
+ * `GrepTool` folds every cap into the flat `details.truncated`, but only
301
+ * populates `details.truncation` when the output text itself was trimmed and
302
+ * `perFileLimitReached` when a per-file or explicit total cap fired. Its native
303
+ * backend's own ceiling (`INTERNAL_TOTAL_CAP`) sets neither, so a search that
304
+ * hit it answered as an unqualified success over incomplete results — the one
305
+ * failure mode a caller cannot detect and cannot retry around.
306
+ *
307
+ * Only consulted once the specific signals came back empty, so a cap that did
308
+ * report itself is never restated. `totalLines` stays 0: the flat flag says
309
+ * that results were dropped, not how many there were.
310
+ */
311
+ function grepInternalCapTruncation(
312
+ toolResult: ToolResultMessage,
313
+ text: string,
314
+ matchLimitReached: number | undefined,
315
+ ): PiTruncation | undefined {
316
+ if (matchLimitReached !== undefined) return undefined;
317
+ if (bagValue(toolResult.details, "truncated") !== true) return undefined;
318
+ return create(PiTruncationSchema, {
319
+ truncated: true,
320
+ truncatedBy: "matches",
321
+ totalLines: 0,
322
+ outputLines: text ? text.split("\n").length : 0,
323
+ outputBytes: Buffer.byteLength(text, "utf-8"),
324
+ firstLineExceedsLimit: false,
325
+ lastLinePartial: false,
326
+ });
327
+ }
328
+
329
+ export function buildPiGrepError(error: string): PiGrepExecResult {
330
+ return create(PiGrepExecResultSchema, {
331
+ result: { case: "error", value: create(PiGrepExecErrorSchema, { error }) },
332
+ });
333
+ }
334
+
335
+ export function buildPiFindResult(toolResult: ToolResultMessage): PiFindExecResult {
336
+ const text = piOutputText(toolResult);
337
+ if (toolResult.isError) return buildPiFindError(text || "Find failed");
338
+ return create(PiFindExecResultSchema, {
339
+ result: {
340
+ case: "success",
341
+ value: create(PiFindExecSuccessSchema, {
342
+ output: text,
343
+ truncation: piTruncation(toolResult),
344
+ resultLimitReached: resultLimitReached(toolResult),
345
+ }),
346
+ },
347
+ });
348
+ }
349
+
350
+ export function buildPiFindError(error: string): PiFindExecResult {
351
+ return create(PiFindExecResultSchema, {
352
+ result: { case: "error", value: create(PiFindExecErrorSchema, { error }) },
353
+ });
354
+ }
355
+
356
+ export function buildPiLsResult(toolResult: ToolResultMessage): PiLsExecResult {
357
+ const text = piOutputText(toolResult);
358
+ if (toolResult.isError) return buildPiLsError(text || "Ls failed");
359
+ return create(PiLsExecResultSchema, {
360
+ result: {
361
+ case: "success",
362
+ value: create(PiLsExecSuccessSchema, {
363
+ output: text,
364
+ truncation: piTruncation(toolResult),
365
+ entryLimitReached: resultLimitReached(toolResult),
366
+ }),
367
+ },
368
+ });
369
+ }
370
+
371
+ export function buildPiLsError(error: string): PiLsExecResult {
372
+ return create(PiLsExecResultSchema, {
373
+ result: { case: "error", value: create(PiLsExecErrorSchema, { error }) },
374
+ });
375
+ }
376
+
377
+ /**
378
+ * Answer `mcpStateExecArgs` (frame 36) from the catalog already advertised in
379
+ * `RequestContext.tools`.
380
+ *
381
+ * This client hosts no MCP servers of its own: every forwarded tool is a local
382
+ * pi-agent tool published under a synthetic `providerIdentifier`. Regrouping
383
+ * the same list keeps the server's view of "which servers exist and what do
384
+ * they expose" consistent with what it was told at context time, instead of
385
+ * claiming zero servers while tool calls for them keep arriving.
386
+ *
387
+ * `serverIdentifiers` filters the answer when the server asks about specific
388
+ * servers. `kickOnly` is a restart request — there is nothing to restart, so it
389
+ * is answered with the same state rather than an error.
390
+ */
391
+ export function buildMcpStateResult(
392
+ tools: McpToolDefinition[],
393
+ serverIdentifiers: readonly string[],
394
+ ): McpStateExecResult {
395
+ const byProvider = new Map<string, McpToolDefinition[]>();
396
+ for (const tool of tools) {
397
+ const identifier = tool.providerIdentifier;
398
+ const existing = byProvider.get(identifier);
399
+ if (existing) existing.push(tool);
400
+ else byProvider.set(identifier, [tool]);
401
+ }
402
+
403
+ const wanted = serverIdentifiers.length > 0 ? new Set(serverIdentifiers) : undefined;
404
+ const servers = [];
405
+ for (const [identifier, serverTools] of byProvider) {
406
+ if (wanted && !wanted.has(identifier)) continue;
407
+ servers.push(
408
+ create(McpStateServerSchema, {
409
+ serverName: identifier,
410
+ serverIdentifier: identifier,
411
+ tools: serverTools,
412
+ status: "connected",
413
+ }),
414
+ );
415
+ }
416
+
417
+ return create(McpStateExecResultSchema, {
418
+ result: { case: "success", value: create(McpStateSuccessSchema, { servers }) },
419
+ });
420
+ }
421
+
422
+ /**
423
+ * Build the neutral response for a hook query: the matching response case with
424
+ * every field unset.
425
+ *
426
+ * This client runs no Cursor hooks, and every field of every response variant
427
+ * is `optional` — so an empty response of the right case means "no hook had
428
+ * anything to say", which is exactly true. It is NOT the unset-oneof fake
429
+ * success: the case itself is set, only the payload is empty.
430
+ *
431
+ * `ExecuteHookRequest` and `ExecuteHookResponse` are parallel oneofs whose case
432
+ * names line up, but the two unions are unrelated to the compiler: a `switch`
433
+ * is what makes each pairing individually type-checked, and it forces a
434
+ * deliberate branch when a future regen adds a request case.
435
+ *
436
+ * Returns `null` for a request case this build does not model, which the
437
+ * dispatcher answers with `ExecClientThrow` rather than guessing a case.
438
+ */
439
+ export function buildNeutralHookResult(request: ExecuteHookRequest | undefined): ExecuteHookResult | null {
440
+ let response: ExecuteHookResponse;
441
+ switch (request?.request.case) {
442
+ case "preCompact":
443
+ response = create(ExecuteHookResponseSchema, {
444
+ response: { case: "preCompact", value: create(PreCompactRequestResponseSchema, {}) },
445
+ });
446
+ break;
447
+ case "subagentStart":
448
+ response = create(ExecuteHookResponseSchema, {
449
+ response: { case: "subagentStart", value: create(SubagentStartRequestResponseSchema, {}) },
450
+ });
451
+ break;
452
+ case "subagentStop":
453
+ response = create(ExecuteHookResponseSchema, {
454
+ response: { case: "subagentStop", value: create(SubagentStopRequestResponseSchema, {}) },
455
+ });
456
+ break;
457
+ case "preToolUse":
458
+ response = create(ExecuteHookResponseSchema, {
459
+ response: { case: "preToolUse", value: create(PreToolUseRequestResponseSchema, {}) },
460
+ });
461
+ break;
462
+ case "postToolUse":
463
+ response = create(ExecuteHookResponseSchema, {
464
+ response: { case: "postToolUse", value: create(PostToolUseRequestResponseSchema, {}) },
465
+ });
466
+ break;
467
+ case "postToolUseFailure":
468
+ response = create(ExecuteHookResponseSchema, {
469
+ response: { case: "postToolUseFailure", value: create(PostToolUseFailureRequestResponseSchema, {}) },
470
+ });
471
+ break;
472
+ case "beforeSubmitPrompt":
473
+ response = create(ExecuteHookResponseSchema, {
474
+ response: { case: "beforeSubmitPrompt", value: create(BeforeSubmitPromptRequestResponseSchema, {}) },
475
+ });
476
+ break;
477
+ case "afterAgentResponse":
478
+ response = create(ExecuteHookResponseSchema, {
479
+ response: { case: "afterAgentResponse", value: create(AfterAgentResponseRequestResponseSchema, {}) },
480
+ });
481
+ break;
482
+ case "afterAgentThought":
483
+ response = create(ExecuteHookResponseSchema, {
484
+ response: { case: "afterAgentThought", value: create(AfterAgentThoughtRequestResponseSchema, {}) },
485
+ });
486
+ break;
487
+ case "stop":
488
+ response = create(ExecuteHookResponseSchema, {
489
+ response: { case: "stop", value: create(StopRequestResponseSchema, {}) },
490
+ });
491
+ break;
492
+ default:
493
+ return null;
494
+ }
495
+ return create(ExecuteHookResultSchema, { response });
496
+ }