pi-oxidized 0.1.1

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 (1517) hide show
  1. package/.agent-tasks/pi-rust-rewrite/Cargo.lock +5022 -0
  2. package/.agent-tasks/pi-rust-rewrite/Cargo.toml +22 -0
  3. package/.agent-tasks/pi-rust-rewrite/GOALS.md +1 -0
  4. package/.agent-tasks/pi-rust-rewrite/fixtures/phase7/goldens/branch_summary.json +8 -0
  5. package/.agent-tasks/pi-rust-rewrite/fixtures/phase7/goldens/changelog.md +16 -0
  6. package/.agent-tasks/pi-rust-rewrite/fixtures/phase7/goldens/debug_dump.txt +11 -0
  7. package/.agent-tasks/pi-rust-rewrite/fixtures/phase7/goldens/events.jsonl +6 -0
  8. package/.agent-tasks/pi-rust-rewrite/fixtures/phase7/goldens/legacy_auth_migration.json +16 -0
  9. package/.agent-tasks/pi-rust-rewrite/fixtures/phase7/goldens/selector_snapshot.txt +9 -0
  10. package/.agent-tasks/pi-rust-rewrite/fixtures/phase7/goldens/session_stats.json +16 -0
  11. package/.agent-tasks/pi-rust-rewrite/fixtures/phase7/goldens/share_result.json +7 -0
  12. package/.agent-tasks/pi-rust-rewrite/fixtures/phase7/sessions/export-roundtrip.jsonl +6 -0
  13. package/.agent-tasks/pi-rust-rewrite/fixtures/provider-drain/isolation-expectations.json +21 -0
  14. package/.agent-tasks/pi-rust-rewrite/fixtures/rpc/commands.json +238 -0
  15. package/.agent-tasks/pi-rust-rewrite/fixtures/rpc/host-state.json +128 -0
  16. package/.agent-tasks/pi-rust-rewrite/fixtures/rpc/ts-goldens.json +1 -0
  17. package/.agent-tasks/pi-rust-rewrite/fixtures/rpc/ts-replay.ts +317 -0
  18. package/.agent-tasks/pi-rust-rewrite/fixtures/sessions/v1/linear-with-compaction.expected.json +576 -0
  19. package/.agent-tasks/pi-rust-rewrite/fixtures/sessions/v1/linear-with-compaction.jsonl +12 -0
  20. package/.agent-tasks/pi-rust-rewrite/fixtures/sessions/v2/branched.expected.json +387 -0
  21. package/.agent-tasks/pi-rust-rewrite/fixtures/sessions/v2/branched.jsonl +8 -0
  22. package/.agent-tasks/pi-rust-rewrite/fixtures/sessions/v3/basic.expected.json +256 -0
  23. package/.agent-tasks/pi-rust-rewrite/fixtures/sessions/v3/basic.jsonl +5 -0
  24. package/.agent-tasks/pi-rust-rewrite/fixtures/sessions/v3/branched-labels.expected.json +474 -0
  25. package/.agent-tasks/pi-rust-rewrite/fixtures/sessions/v3/branched-labels.jsonl +13 -0
  26. package/.agent-tasks/pi-rust-rewrite/fixtures/sessions/v3/branched-session.expected.json +352 -0
  27. package/.agent-tasks/pi-rust-rewrite/fixtures/sessions/v3/branched-session.jsonl +9 -0
  28. package/.agent-tasks/pi-rust-rewrite/fixtures/sessions/v3/compacted-twice.expected.json +590 -0
  29. package/.agent-tasks/pi-rust-rewrite/fixtures/sessions/v3/compacted-twice.jsonl +13 -0
  30. package/.agent-tasks/pi-rust-rewrite/fixtures/sessions/v3/custom-messages.expected.json +400 -0
  31. package/.agent-tasks/pi-rust-rewrite/fixtures/sessions/v3/custom-messages.jsonl +8 -0
  32. package/.agent-tasks/pi-rust-rewrite/fixtures/sessions/v3/forked-header.expected.json +257 -0
  33. package/.agent-tasks/pi-rust-rewrite/fixtures/sessions/v3/forked-header.jsonl +5 -0
  34. package/.agent-tasks/pi-rust-rewrite/fixtures/sessions/v3/unknown-entries.expected.json +297 -0
  35. package/.agent-tasks/pi-rust-rewrite/fixtures/sessions/v3/unknown-entries.jsonl +6 -0
  36. package/.agent-tasks/pi-rust-rewrite/fixtures/tool-schemas/bash.json +16 -0
  37. package/.agent-tasks/pi-rust-rewrite/fixtures/tool-schemas/edit.json +34 -0
  38. package/.agent-tasks/pi-rust-rewrite/fixtures/tool-schemas/find.json +20 -0
  39. package/.agent-tasks/pi-rust-rewrite/fixtures/tool-schemas/grep.json +36 -0
  40. package/.agent-tasks/pi-rust-rewrite/fixtures/tool-schemas/ls.json +13 -0
  41. package/.agent-tasks/pi-rust-rewrite/fixtures/tool-schemas/read.json +20 -0
  42. package/.agent-tasks/pi-rust-rewrite/fixtures/tool-schemas/write.json +17 -0
  43. package/.agent-tasks/pi-rust-rewrite/fixtures/tools/edit-cases.json +93 -0
  44. package/.agent-tasks/pi-rust-rewrite/helpers/reopen_session.ts +168 -0
  45. package/.agent-tasks/pi-rust-rewrite/src/lib.rs +13 -0
  46. package/.agent-tasks/pi-rust-rewrite/tests/phase7_fixtures.rs +742 -0
  47. package/.agent-tasks/pi-rust-rewrite/tests/pi_ai_contract.rs +101 -0
  48. package/.agent-tasks/pi-rust-rewrite/tests/provider_drain_isolation.rs +760 -0
  49. package/.agent-tasks/pi-rust-rewrite/tests/rpc_parity.rs +679 -0
  50. package/.agent-tasks/pi-rust-rewrite/tests/session_compat.rs +839 -0
  51. package/.agent-tasks/pi-rust-rewrite/tests/tool_parity.rs +761 -0
  52. package/.github/workflows/release-verification.yml +204 -0
  53. package/.gitmodules +5 -0
  54. package/.outline/audit/coverage.json +3262 -0
  55. package/.outline/audit/queue.json +4841 -0
  56. package/.outline/review-fix-grill/iterations/1.json +767 -0
  57. package/.outline/review-fix-grill/iterations/2.json +69 -0
  58. package/.outline/review-fix-grill/iterations/3.json +81 -0
  59. package/.outline/review-fix-grill/iterations/4.json +35 -0
  60. package/.outline/review-fix-grill/iterations/5.json +21 -0
  61. package/.outline/review-fix-grill/queue.json +6454 -0
  62. package/.references/pi/.gitattributes +23 -0
  63. package/.references/pi/.github/APPROVED_CONTRIBUTORS +281 -0
  64. package/.references/pi/.github/ISSUE_TEMPLATE/bug.yml +45 -0
  65. package/.references/pi/.github/ISSUE_TEMPLATE/config.yml +5 -0
  66. package/.references/pi/.github/ISSUE_TEMPLATE/contribution.yml +36 -0
  67. package/.references/pi/.github/ISSUE_TEMPLATE/package-report.yml +49 -0
  68. package/.references/pi/.github/workflows/approve-contributor.yml +179 -0
  69. package/.references/pi/.github/workflows/build-binaries.yml +294 -0
  70. package/.references/pi/.github/workflows/ci.yml +42 -0
  71. package/.references/pi/.github/workflows/issue-analysis.yml +634 -0
  72. package/.references/pi/.github/workflows/issue-gate.yml +129 -0
  73. package/.references/pi/.github/workflows/issue-triage-labels.yml +142 -0
  74. package/.references/pi/.github/workflows/npm-audit.yml +31 -0
  75. package/.references/pi/.github/workflows/pr-gate.yml +128 -0
  76. package/.references/pi/.github/workflows/publish-model-catalog.yml +112 -0
  77. package/.references/pi/.github/workflows/remove-inprogress-on-close.yml +31 -0
  78. package/.references/pi/.husky/pre-commit +45 -0
  79. package/.references/pi/.pi/extensions/import-repro.ts +351 -0
  80. package/.references/pi/.pi/extensions/prompt-url-widget.ts +270 -0
  81. package/.references/pi/.pi/extensions/redraws.ts +24 -0
  82. package/.references/pi/.pi/extensions/tps.ts +47 -0
  83. package/.references/pi/.pi/git/.gitignore +2 -0
  84. package/.references/pi/.pi/npm/.gitignore +2 -0
  85. package/.references/pi/.pi/prompts/cl.md +54 -0
  86. package/.references/pi/.pi/prompts/is.md +28 -0
  87. package/.references/pi/.pi/prompts/pr.md +37 -0
  88. package/.references/pi/.pi/prompts/sa.md +163 -0
  89. package/.references/pi/.pi/prompts/wr.md +40 -0
  90. package/.references/pi/.pi/skills/add-llm-provider.md +57 -0
  91. package/.references/pi/AGENTS.md +162 -0
  92. package/.references/pi/CONTRIBUTING.md +102 -0
  93. package/.references/pi/LICENSE +21 -0
  94. package/.references/pi/README.md +99 -0
  95. package/.references/pi/SECURITY.md +87 -0
  96. package/.references/pi/biome.json +39 -0
  97. package/.references/pi/bun.lock +961 -0
  98. package/.references/pi/package-lock.json +6172 -0
  99. package/.references/pi/package.json +66 -0
  100. package/.references/pi/packages/agent/CHANGELOG.md +594 -0
  101. package/.references/pi/packages/agent/README.md +488 -0
  102. package/.references/pi/packages/agent/docs/agent-harness.md +488 -0
  103. package/.references/pi/packages/agent/docs/durable-harness.md +212 -0
  104. package/.references/pi/packages/agent/docs/hooks.md +445 -0
  105. package/.references/pi/packages/agent/docs/models.md +964 -0
  106. package/.references/pi/packages/agent/docs/observability.md +376 -0
  107. package/.references/pi/packages/agent/package.json +60 -0
  108. package/.references/pi/packages/agent/src/agent-loop.ts +792 -0
  109. package/.references/pi/packages/agent/src/agent.ts +575 -0
  110. package/.references/pi/packages/agent/src/harness/agent-harness.ts +1029 -0
  111. package/.references/pi/packages/agent/src/harness/compaction/branch-summarization.ts +261 -0
  112. package/.references/pi/packages/agent/src/harness/compaction/compaction.ts +753 -0
  113. package/.references/pi/packages/agent/src/harness/compaction/utils.ts +144 -0
  114. package/.references/pi/packages/agent/src/harness/env/nodejs.ts +569 -0
  115. package/.references/pi/packages/agent/src/harness/messages.ts +164 -0
  116. package/.references/pi/packages/agent/src/harness/prompt-templates.ts +267 -0
  117. package/.references/pi/packages/agent/src/harness/session/jsonl-repo.ts +179 -0
  118. package/.references/pi/packages/agent/src/harness/session/jsonl-storage.ts +314 -0
  119. package/.references/pi/packages/agent/src/harness/session/memory-repo.ts +50 -0
  120. package/.references/pi/packages/agent/src/harness/session/memory-storage.ts +133 -0
  121. package/.references/pi/packages/agent/src/harness/session/repo-utils.ts +51 -0
  122. package/.references/pi/packages/agent/src/harness/session/session.ts +338 -0
  123. package/.references/pi/packages/agent/src/harness/session/uuid.ts +54 -0
  124. package/.references/pi/packages/agent/src/harness/skills.ts +375 -0
  125. package/.references/pi/packages/agent/src/harness/system-prompt.ts +34 -0
  126. package/.references/pi/packages/agent/src/harness/types.ts +838 -0
  127. package/.references/pi/packages/agent/src/harness/utils/shell-output.ts +135 -0
  128. package/.references/pi/packages/agent/src/harness/utils/truncate.ts +344 -0
  129. package/.references/pi/packages/agent/src/index.ts +46 -0
  130. package/.references/pi/packages/agent/src/node.ts +2 -0
  131. package/.references/pi/packages/agent/src/proxy.ts +367 -0
  132. package/.references/pi/packages/agent/src/types.ts +430 -0
  133. package/.references/pi/packages/agent/test/agent-loop.test.ts +1424 -0
  134. package/.references/pi/packages/agent/test/agent.test.ts +699 -0
  135. package/.references/pi/packages/agent/test/e2e.test.ts +404 -0
  136. package/.references/pi/packages/agent/test/harness/agent-harness-stream.test.ts +213 -0
  137. package/.references/pi/packages/agent/test/harness/agent-harness.test.ts +608 -0
  138. package/.references/pi/packages/agent/test/harness/compaction.test.ts +655 -0
  139. package/.references/pi/packages/agent/test/harness/nodejs-env.test.ts +321 -0
  140. package/.references/pi/packages/agent/test/harness/prompt-templates.test.ts +90 -0
  141. package/.references/pi/packages/agent/test/harness/repo.test.ts +92 -0
  142. package/.references/pi/packages/agent/test/harness/resource-formatting.test.ts +24 -0
  143. package/.references/pi/packages/agent/test/harness/session-test-utils.ts +55 -0
  144. package/.references/pi/packages/agent/test/harness/session-uuid.test.ts +50 -0
  145. package/.references/pi/packages/agent/test/harness/session.test.ts +203 -0
  146. package/.references/pi/packages/agent/test/harness/skills.test.ts +116 -0
  147. package/.references/pi/packages/agent/test/harness/storage.test.ts +341 -0
  148. package/.references/pi/packages/agent/test/harness/system-prompt.test.ts +66 -0
  149. package/.references/pi/packages/agent/test/harness/truncate.test.ts +169 -0
  150. package/.references/pi/packages/agent/test/scratch/simple.ts +72 -0
  151. package/.references/pi/packages/agent/test/utils/calculate.ts +32 -0
  152. package/.references/pi/packages/agent/test/utils/get-current-time.ts +46 -0
  153. package/.references/pi/packages/agent/tsconfig.build.json +13 -0
  154. package/.references/pi/packages/agent/vitest.config.ts +21 -0
  155. package/.references/pi/packages/agent/vitest.harness.config.ts +28 -0
  156. package/.references/pi/packages/ai/CHANGELOG.md +1739 -0
  157. package/.references/pi/packages/ai/README.md +1621 -0
  158. package/.references/pi/packages/ai/bedrock-provider.d.ts +1 -0
  159. package/.references/pi/packages/ai/bedrock-provider.js +1 -0
  160. package/.references/pi/packages/ai/package.json +97 -0
  161. package/.references/pi/packages/ai/scripts/generate-image-models.ts +131 -0
  162. package/.references/pi/packages/ai/scripts/generate-models.ts +2401 -0
  163. package/.references/pi/packages/ai/scripts/generate-test-image.ts +33 -0
  164. package/.references/pi/packages/ai/src/api/anthropic-messages.lazy.ts +4 -0
  165. package/.references/pi/packages/ai/src/api/anthropic-messages.ts +1313 -0
  166. package/.references/pi/packages/ai/src/api/azure-openai-responses.lazy.ts +4 -0
  167. package/.references/pi/packages/ai/src/api/azure-openai-responses.ts +298 -0
  168. package/.references/pi/packages/ai/src/api/bedrock-converse-stream.lazy.ts +30 -0
  169. package/.references/pi/packages/ai/src/api/bedrock-converse-stream.ts +1091 -0
  170. package/.references/pi/packages/ai/src/api/cloudflare.ts +15 -0
  171. package/.references/pi/packages/ai/src/api/github-copilot-headers.ts +37 -0
  172. package/.references/pi/packages/ai/src/api/google-generative-ai.lazy.ts +4 -0
  173. package/.references/pi/packages/ai/src/api/google-generative-ai.ts +509 -0
  174. package/.references/pi/packages/ai/src/api/google-shared.ts +350 -0
  175. package/.references/pi/packages/ai/src/api/google-vertex.lazy.ts +4 -0
  176. package/.references/pi/packages/ai/src/api/google-vertex.ts +584 -0
  177. package/.references/pi/packages/ai/src/api/lazy.ts +75 -0
  178. package/.references/pi/packages/ai/src/api/mistral-conversations.lazy.ts +4 -0
  179. package/.references/pi/packages/ai/src/api/mistral-conversations.ts +664 -0
  180. package/.references/pi/packages/ai/src/api/openai-codex-responses.lazy.ts +4 -0
  181. package/.references/pi/packages/ai/src/api/openai-codex-responses.ts +1573 -0
  182. package/.references/pi/packages/ai/src/api/openai-completions.lazy.ts +4 -0
  183. package/.references/pi/packages/ai/src/api/openai-completions.ts +1355 -0
  184. package/.references/pi/packages/ai/src/api/openai-prompt-cache.ts +8 -0
  185. package/.references/pi/packages/ai/src/api/openai-responses-shared.ts +613 -0
  186. package/.references/pi/packages/ai/src/api/openai-responses.lazy.ts +4 -0
  187. package/.references/pi/packages/ai/src/api/openai-responses.ts +318 -0
  188. package/.references/pi/packages/ai/src/api/openrouter-images.lazy.ts +10 -0
  189. package/.references/pi/packages/ai/src/api/openrouter-images.ts +185 -0
  190. package/.references/pi/packages/ai/src/api/pi-messages.lazy.ts +4 -0
  191. package/.references/pi/packages/ai/src/api/pi-messages.ts +436 -0
  192. package/.references/pi/packages/ai/src/api/simple-options.ts +77 -0
  193. package/.references/pi/packages/ai/src/api/transform-messages.ts +223 -0
  194. package/.references/pi/packages/ai/src/auth/context.ts +45 -0
  195. package/.references/pi/packages/ai/src/auth/credential-store.ts +51 -0
  196. package/.references/pi/packages/ai/src/auth/helpers.ts +47 -0
  197. package/.references/pi/packages/ai/src/auth/oauth/anthropic.ts +350 -0
  198. package/.references/pi/packages/ai/src/auth/oauth/device-code.ts +98 -0
  199. package/.references/pi/packages/ai/src/auth/oauth/github-copilot.ts +379 -0
  200. package/.references/pi/packages/ai/src/auth/oauth/load.ts +56 -0
  201. package/.references/pi/packages/ai/src/auth/oauth/oauth-page.ts +109 -0
  202. package/.references/pi/packages/ai/src/auth/oauth/openai-codex.ts +538 -0
  203. package/.references/pi/packages/ai/src/auth/oauth/pkce.ts +34 -0
  204. package/.references/pi/packages/ai/src/auth/oauth/radius.ts +410 -0
  205. package/.references/pi/packages/ai/src/auth/oauth/xai.ts +238 -0
  206. package/.references/pi/packages/ai/src/auth/resolve.ts +139 -0
  207. package/.references/pi/packages/ai/src/auth/types.ts +220 -0
  208. package/.references/pi/packages/ai/src/bedrock-provider.ts +6 -0
  209. package/.references/pi/packages/ai/src/bun-oauth.ts +17 -0
  210. package/.references/pi/packages/ai/src/cli.ts +118 -0
  211. package/.references/pi/packages/ai/src/compat/extension-oauth-types.ts +45 -0
  212. package/.references/pi/packages/ai/src/compat.ts +298 -0
  213. package/.references/pi/packages/ai/src/env-api-keys.ts +178 -0
  214. package/.references/pi/packages/ai/src/image-models.generated.ts +534 -0
  215. package/.references/pi/packages/ai/src/image-models.ts +42 -0
  216. package/.references/pi/packages/ai/src/images-api-registry.ts +53 -0
  217. package/.references/pi/packages/ai/src/images-models.ts +274 -0
  218. package/.references/pi/packages/ai/src/images.ts +21 -0
  219. package/.references/pi/packages/ai/src/index.ts +45 -0
  220. package/.references/pi/packages/ai/src/legacy-api-aliases.ts +108 -0
  221. package/.references/pi/packages/ai/src/models-store.ts +38 -0
  222. package/.references/pi/packages/ai/src/models.generated.ts +76 -0
  223. package/.references/pi/packages/ai/src/models.ts +705 -0
  224. package/.references/pi/packages/ai/src/oauth.ts +10 -0
  225. package/.references/pi/packages/ai/src/providers/all.ts +140 -0
  226. package/.references/pi/packages/ai/src/providers/amazon-bedrock.models.ts +1897 -0
  227. package/.references/pi/packages/ai/src/providers/amazon-bedrock.ts +80 -0
  228. package/.references/pi/packages/ai/src/providers/ant-ling.models.ts +62 -0
  229. package/.references/pi/packages/ai/src/providers/ant-ling.ts +15 -0
  230. package/.references/pi/packages/ai/src/providers/anthropic.models.ts +257 -0
  231. package/.references/pi/packages/ai/src/providers/anthropic.ts +20 -0
  232. package/.references/pi/packages/ai/src/providers/azure-openai-responses.models.ts +816 -0
  233. package/.references/pi/packages/ai/src/providers/azure-openai-responses.ts +14 -0
  234. package/.references/pi/packages/ai/src/providers/cerebras.models.ts +61 -0
  235. package/.references/pi/packages/ai/src/providers/cerebras.ts +15 -0
  236. package/.references/pi/packages/ai/src/providers/cloudflare-ai-gateway.models.ts +760 -0
  237. package/.references/pi/packages/ai/src/providers/cloudflare-ai-gateway.ts +23 -0
  238. package/.references/pi/packages/ai/src/providers/cloudflare-auth.ts +96 -0
  239. package/.references/pi/packages/ai/src/providers/cloudflare-stream.ts +28 -0
  240. package/.references/pi/packages/ai/src/providers/cloudflare-workers-ai.models.ts +241 -0
  241. package/.references/pi/packages/ai/src/providers/cloudflare-workers-ai.ts +15 -0
  242. package/.references/pi/packages/ai/src/providers/deepseek.models.ts +45 -0
  243. package/.references/pi/packages/ai/src/providers/deepseek.ts +15 -0
  244. package/.references/pi/packages/ai/src/providers/faux.ts +538 -0
  245. package/.references/pi/packages/ai/src/providers/fireworks.models.ts +297 -0
  246. package/.references/pi/packages/ai/src/providers/fireworks.ts +19 -0
  247. package/.references/pi/packages/ai/src/providers/github-copilot.models.ts +543 -0
  248. package/.references/pi/packages/ai/src/providers/github-copilot.ts +34 -0
  249. package/.references/pi/packages/ai/src/providers/google-vertex.models.ts +184 -0
  250. package/.references/pi/packages/ai/src/providers/google-vertex.ts +93 -0
  251. package/.references/pi/packages/ai/src/providers/google.models.ts +290 -0
  252. package/.references/pi/packages/ai/src/providers/google.ts +15 -0
  253. package/.references/pi/packages/ai/src/providers/groq.models.ts +127 -0
  254. package/.references/pi/packages/ai/src/providers/groq.ts +15 -0
  255. package/.references/pi/packages/ai/src/providers/huggingface.models.ts +889 -0
  256. package/.references/pi/packages/ai/src/providers/huggingface.ts +15 -0
  257. package/.references/pi/packages/ai/src/providers/images/register-builtins.ts +50 -0
  258. package/.references/pi/packages/ai/src/providers/kimi-coding.models.ts +103 -0
  259. package/.references/pi/packages/ai/src/providers/kimi-coding.ts +15 -0
  260. package/.references/pi/packages/ai/src/providers/minimax-cn.models.ts +58 -0
  261. package/.references/pi/packages/ai/src/providers/minimax-cn.ts +15 -0
  262. package/.references/pi/packages/ai/src/providers/minimax.models.ts +58 -0
  263. package/.references/pi/packages/ai/src/providers/minimax.ts +15 -0
  264. package/.references/pi/packages/ai/src/providers/mistral.models.ts +517 -0
  265. package/.references/pi/packages/ai/src/providers/mistral.ts +15 -0
  266. package/.references/pi/packages/ai/src/providers/moonshotai-cn.models.ts +190 -0
  267. package/.references/pi/packages/ai/src/providers/moonshotai-cn.ts +15 -0
  268. package/.references/pi/packages/ai/src/providers/moonshotai.models.ts +190 -0
  269. package/.references/pi/packages/ai/src/providers/moonshotai.ts +15 -0
  270. package/.references/pi/packages/ai/src/providers/nvidia.models.ts +387 -0
  271. package/.references/pi/packages/ai/src/providers/nvidia.ts +15 -0
  272. package/.references/pi/packages/ai/src/providers/openai-codex.models.ts +144 -0
  273. package/.references/pi/packages/ai/src/providers/openai-codex.ts +18 -0
  274. package/.references/pi/packages/ai/src/providers/openai.models.ts +830 -0
  275. package/.references/pi/packages/ai/src/providers/openai.ts +15 -0
  276. package/.references/pi/packages/ai/src/providers/opencode-go.models.ts +278 -0
  277. package/.references/pi/packages/ai/src/providers/opencode-go.ts +18 -0
  278. package/.references/pi/packages/ai/src/providers/opencode.models.ts +1001 -0
  279. package/.references/pi/packages/ai/src/providers/opencode.ts +24 -0
  280. package/.references/pi/packages/ai/src/providers/openrouter-images.ts +14 -0
  281. package/.references/pi/packages/ai/src/providers/openrouter.models.ts +4915 -0
  282. package/.references/pi/packages/ai/src/providers/openrouter.ts +15 -0
  283. package/.references/pi/packages/ai/src/providers/radius-config.ts +95 -0
  284. package/.references/pi/packages/ai/src/providers/radius.ts +67 -0
  285. package/.references/pi/packages/ai/src/providers/together.models.ts +382 -0
  286. package/.references/pi/packages/ai/src/providers/together.ts +15 -0
  287. package/.references/pi/packages/ai/src/providers/vercel-ai-gateway.models.ts +3268 -0
  288. package/.references/pi/packages/ai/src/providers/vercel-ai-gateway.ts +15 -0
  289. package/.references/pi/packages/ai/src/providers/xai.models.ts +62 -0
  290. package/.references/pi/packages/ai/src/providers/xai.ts +27 -0
  291. package/.references/pi/packages/ai/src/providers/xiaomi-token-plan-ams.models.ts +61 -0
  292. package/.references/pi/packages/ai/src/providers/xiaomi-token-plan-ams.ts +15 -0
  293. package/.references/pi/packages/ai/src/providers/xiaomi-token-plan-cn.models.ts +61 -0
  294. package/.references/pi/packages/ai/src/providers/xiaomi-token-plan-cn.ts +15 -0
  295. package/.references/pi/packages/ai/src/providers/xiaomi-token-plan-sgp.models.ts +61 -0
  296. package/.references/pi/packages/ai/src/providers/xiaomi-token-plan-sgp.ts +15 -0
  297. package/.references/pi/packages/ai/src/providers/xiaomi.models.ts +115 -0
  298. package/.references/pi/packages/ai/src/providers/xiaomi.ts +15 -0
  299. package/.references/pi/packages/ai/src/providers/zai-coding-cn.models.ts +116 -0
  300. package/.references/pi/packages/ai/src/providers/zai-coding-cn.ts +15 -0
  301. package/.references/pi/packages/ai/src/providers/zai.models.ts +116 -0
  302. package/.references/pi/packages/ai/src/providers/zai.ts +15 -0
  303. package/.references/pi/packages/ai/src/session-resources.ts +24 -0
  304. package/.references/pi/packages/ai/src/types.ts +738 -0
  305. package/.references/pi/packages/ai/src/utils/abort-signals.ts +41 -0
  306. package/.references/pi/packages/ai/src/utils/deferred-tools.ts +39 -0
  307. package/.references/pi/packages/ai/src/utils/diagnostics.ts +45 -0
  308. package/.references/pi/packages/ai/src/utils/error-body.ts +127 -0
  309. package/.references/pi/packages/ai/src/utils/estimate.ts +143 -0
  310. package/.references/pi/packages/ai/src/utils/event-stream.ts +88 -0
  311. package/.references/pi/packages/ai/src/utils/hash.ts +13 -0
  312. package/.references/pi/packages/ai/src/utils/headers.ts +18 -0
  313. package/.references/pi/packages/ai/src/utils/json-parse.ts +124 -0
  314. package/.references/pi/packages/ai/src/utils/node-http-proxy.ts +112 -0
  315. package/.references/pi/packages/ai/src/utils/overflow.ts +165 -0
  316. package/.references/pi/packages/ai/src/utils/provider-env.ts +52 -0
  317. package/.references/pi/packages/ai/src/utils/retry.ts +101 -0
  318. package/.references/pi/packages/ai/src/utils/sanitize-unicode.ts +25 -0
  319. package/.references/pi/packages/ai/src/utils/typebox-helpers.ts +24 -0
  320. package/.references/pi/packages/ai/src/utils/validation.ts +310 -0
  321. package/.references/pi/packages/ai/test/abort.test.ts +303 -0
  322. package/.references/pi/packages/ai/test/anthropic-adaptive-thinking-models.test.ts +39 -0
  323. package/.references/pi/packages/ai/test/anthropic-cache-write-1h-cost.test.ts +86 -0
  324. package/.references/pi/packages/ai/test/anthropic-eager-tool-input-compat.test.ts +122 -0
  325. package/.references/pi/packages/ai/test/anthropic-eager-tool-input-e2e.test.ts +155 -0
  326. package/.references/pi/packages/ai/test/anthropic-empty-thinking-signature-compat.test.ts +108 -0
  327. package/.references/pi/packages/ai/test/anthropic-force-adaptive-thinking.test.ts +125 -0
  328. package/.references/pi/packages/ai/test/anthropic-long-cache-retention-e2e.test.ts +127 -0
  329. package/.references/pi/packages/ai/test/anthropic-oauth.test.ts +137 -0
  330. package/.references/pi/packages/ai/test/anthropic-opus-4-8-smoke.test.ts +71 -0
  331. package/.references/pi/packages/ai/test/anthropic-sse-parsing.test.ts +275 -0
  332. package/.references/pi/packages/ai/test/anthropic-temperature-compat.test.ts +103 -0
  333. package/.references/pi/packages/ai/test/anthropic-thinking-disable.test.ts +172 -0
  334. package/.references/pi/packages/ai/test/anthropic-tool-name-normalization.test.ts +204 -0
  335. package/.references/pi/packages/ai/test/azure-openai-base-url.test.ts +175 -0
  336. package/.references/pi/packages/ai/test/azure-openai-responses-reasoning-replay.test.ts +136 -0
  337. package/.references/pi/packages/ai/test/azure-utils.ts +28 -0
  338. package/.references/pi/packages/ai/test/bedrock-convert-messages.test.ts +245 -0
  339. package/.references/pi/packages/ai/test/bedrock-custom-headers.test.ts +202 -0
  340. package/.references/pi/packages/ai/test/bedrock-endpoint-resolution.test.ts +208 -0
  341. package/.references/pi/packages/ai/test/bedrock-models.test.ts +65 -0
  342. package/.references/pi/packages/ai/test/bedrock-thinking-payload.test.ts +246 -0
  343. package/.references/pi/packages/ai/test/bedrock-utils.ts +18 -0
  344. package/.references/pi/packages/ai/test/cache-retention.test.ts +498 -0
  345. package/.references/pi/packages/ai/test/cloudflare-stream.test.ts +65 -0
  346. package/.references/pi/packages/ai/test/cloudflare-utils.ts +9 -0
  347. package/.references/pi/packages/ai/test/codex-websocket-cached-probe.ts +299 -0
  348. package/.references/pi/packages/ai/test/compat-env.test.ts +74 -0
  349. package/.references/pi/packages/ai/test/context-estimate.test.ts +81 -0
  350. package/.references/pi/packages/ai/test/context-overflow.test.ts +734 -0
  351. package/.references/pi/packages/ai/test/cross-provider-handoff.test.ts +502 -0
  352. package/.references/pi/packages/ai/test/data/red-circle.png +0 -0
  353. package/.references/pi/packages/ai/test/deferred-tools.test.ts +481 -0
  354. package/.references/pi/packages/ai/test/empty.test.ts +741 -0
  355. package/.references/pi/packages/ai/test/env-api-keys.test.ts +60 -0
  356. package/.references/pi/packages/ai/test/error-body.test.ts +154 -0
  357. package/.references/pi/packages/ai/test/faux-provider.test.ts +597 -0
  358. package/.references/pi/packages/ai/test/fireworks-models.test.ts +269 -0
  359. package/.references/pi/packages/ai/test/github-copilot-anthropic.test.ts +120 -0
  360. package/.references/pi/packages/ai/test/github-copilot-oauth.test.ts +444 -0
  361. package/.references/pi/packages/ai/test/google-shared-convert-tools.test.ts +187 -0
  362. package/.references/pi/packages/ai/test/google-shared-gemini3-unsigned-tool-call.test.ts +116 -0
  363. package/.references/pi/packages/ai/test/google-shared-image-tool-result-routing.test.ts +102 -0
  364. package/.references/pi/packages/ai/test/google-thinking-disable.test.ts +160 -0
  365. package/.references/pi/packages/ai/test/google-thinking-signature.test.ts +38 -0
  366. package/.references/pi/packages/ai/test/google-vertex-api-key-resolution.test.ts +223 -0
  367. package/.references/pi/packages/ai/test/image-tool-result.test.ts +501 -0
  368. package/.references/pi/packages/ai/test/images-models.test.ts +209 -0
  369. package/.references/pi/packages/ai/test/images.test.ts +90 -0
  370. package/.references/pi/packages/ai/test/interleaved-thinking.test.ts +144 -0
  371. package/.references/pi/packages/ai/test/lax-message-content.test.ts +67 -0
  372. package/.references/pi/packages/ai/test/lazy-module-load.test.ts +119 -0
  373. package/.references/pi/packages/ai/test/max-thinking.test.ts +89 -0
  374. package/.references/pi/packages/ai/test/mistral-reasoning-mode.test.ts +97 -0
  375. package/.references/pi/packages/ai/test/mistral-tool-schema.test.ts +60 -0
  376. package/.references/pi/packages/ai/test/models-runtime.test.ts +689 -0
  377. package/.references/pi/packages/ai/test/node-http-proxy.test.ts +76 -0
  378. package/.references/pi/packages/ai/test/oauth-auth.test.ts +141 -0
  379. package/.references/pi/packages/ai/test/oauth-device-code.test.ts +139 -0
  380. package/.references/pi/packages/ai/test/oauth.ts +83 -0
  381. package/.references/pi/packages/ai/test/openai-codex-cache-affinity-e2e.test.ts +35 -0
  382. package/.references/pi/packages/ai/test/openai-codex-oauth.test.ts +479 -0
  383. package/.references/pi/packages/ai/test/openai-codex-stream.test.ts +2028 -0
  384. package/.references/pi/packages/ai/test/openai-completions-cache-control-format.test.ts +189 -0
  385. package/.references/pi/packages/ai/test/openai-completions-empty-tools.test.ts +304 -0
  386. package/.references/pi/packages/ai/test/openai-completions-prompt-cache.test.ts +264 -0
  387. package/.references/pi/packages/ai/test/openai-completions-reasoning-details.test.ts +118 -0
  388. package/.references/pi/packages/ai/test/openai-completions-response-model.test.ts +140 -0
  389. package/.references/pi/packages/ai/test/openai-completions-retry.test.ts +86 -0
  390. package/.references/pi/packages/ai/test/openai-completions-thinking-as-text.test.ts +218 -0
  391. package/.references/pi/packages/ai/test/openai-completions-tool-choice.test.ts +1716 -0
  392. package/.references/pi/packages/ai/test/openai-completions-tool-result-images.test.ts +152 -0
  393. package/.references/pi/packages/ai/test/openai-responses-cache-affinity-e2e.test.ts +31 -0
  394. package/.references/pi/packages/ai/test/openai-responses-compat.test.ts +472 -0
  395. package/.references/pi/packages/ai/test/openai-responses-empty-tool-result.test.ts +58 -0
  396. package/.references/pi/packages/ai/test/openai-responses-foreign-toolcall-id.test.ts +66 -0
  397. package/.references/pi/packages/ai/test/openai-responses-message-id.test.ts +48 -0
  398. package/.references/pi/packages/ai/test/openai-responses-partial-json-cleanup.test.ts +106 -0
  399. package/.references/pi/packages/ai/test/openai-responses-reasoning-replay-e2e.test.ts +291 -0
  400. package/.references/pi/packages/ai/test/openai-responses-terminal-event.test.ts +233 -0
  401. package/.references/pi/packages/ai/test/openai-responses-tool-result-images.test.ts +194 -0
  402. package/.references/pi/packages/ai/test/openrouter-cache-write-repro.test.ts +77 -0
  403. package/.references/pi/packages/ai/test/openrouter-images.test.ts +140 -0
  404. package/.references/pi/packages/ai/test/overflow.test.ts +139 -0
  405. package/.references/pi/packages/ai/test/pi-messages.test.ts +243 -0
  406. package/.references/pi/packages/ai/test/provider-error-body-passthrough.test.ts +78 -0
  407. package/.references/pi/packages/ai/test/provider-error-body-regression.test.ts +189 -0
  408. package/.references/pi/packages/ai/test/providers.test.ts +404 -0
  409. package/.references/pi/packages/ai/test/responseid.test.ts +120 -0
  410. package/.references/pi/packages/ai/test/retry.test.ts +59 -0
  411. package/.references/pi/packages/ai/test/scratch.ts +57 -0
  412. package/.references/pi/packages/ai/test/stream.test.ts +1632 -0
  413. package/.references/pi/packages/ai/test/supports-xhigh.test.ts +145 -0
  414. package/.references/pi/packages/ai/test/together-models.test.ts +78 -0
  415. package/.references/pi/packages/ai/test/tokens.test.ts +333 -0
  416. package/.references/pi/packages/ai/test/tool-call-id-normalization.test.ts +290 -0
  417. package/.references/pi/packages/ai/test/tool-call-without-result.test.ts +327 -0
  418. package/.references/pi/packages/ai/test/total-tokens.test.ts +789 -0
  419. package/.references/pi/packages/ai/test/transform-messages-copilot-openai-to-anthropic.test.ts +191 -0
  420. package/.references/pi/packages/ai/test/unicode-surrogate.test.ts +774 -0
  421. package/.references/pi/packages/ai/test/validation.test.ts +116 -0
  422. package/.references/pi/packages/ai/test/xai-oauth.test.ts +330 -0
  423. package/.references/pi/packages/ai/test/xai-responses.test.ts +117 -0
  424. package/.references/pi/packages/ai/test/xhigh.test.ts +70 -0
  425. package/.references/pi/packages/ai/test/xiaomi-models.test.ts +17 -0
  426. package/.references/pi/packages/ai/test/xiaomi-token-plan-ams-anthropic-empty-signature-smoke.test.ts +114 -0
  427. package/.references/pi/packages/ai/test/zen.test.ts +25 -0
  428. package/.references/pi/packages/ai/tsconfig.build.json +9 -0
  429. package/.references/pi/packages/ai/vitest.config.ts +11 -0
  430. package/.references/pi/packages/coding-agent/CHANGELOG.md +5038 -0
  431. package/.references/pi/packages/coding-agent/README.md +691 -0
  432. package/.references/pi/packages/coding-agent/docs/compaction.md +396 -0
  433. package/.references/pi/packages/coding-agent/docs/containerization.md +111 -0
  434. package/.references/pi/packages/coding-agent/docs/custom-provider.md +735 -0
  435. package/.references/pi/packages/coding-agent/docs/development.md +71 -0
  436. package/.references/pi/packages/coding-agent/docs/docs.json +156 -0
  437. package/.references/pi/packages/coding-agent/docs/extensions.md +2911 -0
  438. package/.references/pi/packages/coding-agent/docs/images/doom-extension.png +0 -0
  439. package/.references/pi/packages/coding-agent/docs/images/exy.png +0 -0
  440. package/.references/pi/packages/coding-agent/docs/images/interactive-mode.png +0 -0
  441. package/.references/pi/packages/coding-agent/docs/images/tree-view.png +0 -0
  442. package/.references/pi/packages/coding-agent/docs/index.md +82 -0
  443. package/.references/pi/packages/coding-agent/docs/json.md +82 -0
  444. package/.references/pi/packages/coding-agent/docs/keybindings.md +198 -0
  445. package/.references/pi/packages/coding-agent/docs/models.md +540 -0
  446. package/.references/pi/packages/coding-agent/docs/packages.md +228 -0
  447. package/.references/pi/packages/coding-agent/docs/prompt-templates.md +95 -0
  448. package/.references/pi/packages/coding-agent/docs/providers.md +290 -0
  449. package/.references/pi/packages/coding-agent/docs/quickstart.md +165 -0
  450. package/.references/pi/packages/coding-agent/docs/rpc.md +1480 -0
  451. package/.references/pi/packages/coding-agent/docs/sdk.md +1183 -0
  452. package/.references/pi/packages/coding-agent/docs/security.md +59 -0
  453. package/.references/pi/packages/coding-agent/docs/session-format.md +422 -0
  454. package/.references/pi/packages/coding-agent/docs/sessions.md +145 -0
  455. package/.references/pi/packages/coding-agent/docs/settings.md +319 -0
  456. package/.references/pi/packages/coding-agent/docs/shell-aliases.md +13 -0
  457. package/.references/pi/packages/coding-agent/docs/skills.md +231 -0
  458. package/.references/pi/packages/coding-agent/docs/terminal-setup.md +142 -0
  459. package/.references/pi/packages/coding-agent/docs/termux.md +127 -0
  460. package/.references/pi/packages/coding-agent/docs/themes.md +297 -0
  461. package/.references/pi/packages/coding-agent/docs/tmux.md +63 -0
  462. package/.references/pi/packages/coding-agent/docs/tui.md +927 -0
  463. package/.references/pi/packages/coding-agent/docs/usage.md +310 -0
  464. package/.references/pi/packages/coding-agent/docs/windows.md +17 -0
  465. package/.references/pi/packages/coding-agent/examples/README.md +25 -0
  466. package/.references/pi/packages/coding-agent/examples/extensions/README.md +213 -0
  467. package/.references/pi/packages/coding-agent/examples/extensions/auto-commit-on-exit.ts +49 -0
  468. package/.references/pi/packages/coding-agent/examples/extensions/bash-spawn-hook.ts +30 -0
  469. package/.references/pi/packages/coding-agent/examples/extensions/bookmark.ts +50 -0
  470. package/.references/pi/packages/coding-agent/examples/extensions/border-status-editor.ts +150 -0
  471. package/.references/pi/packages/coding-agent/examples/extensions/built-in-tool-renderer.ts +249 -0
  472. package/.references/pi/packages/coding-agent/examples/extensions/claude-rules.ts +86 -0
  473. package/.references/pi/packages/coding-agent/examples/extensions/commands.ts +72 -0
  474. package/.references/pi/packages/coding-agent/examples/extensions/confirm-destructive.ts +59 -0
  475. package/.references/pi/packages/coding-agent/examples/extensions/custom-compaction.ts +128 -0
  476. package/.references/pi/packages/coding-agent/examples/extensions/custom-footer.ts +64 -0
  477. package/.references/pi/packages/coding-agent/examples/extensions/custom-header.ts +73 -0
  478. package/.references/pi/packages/coding-agent/examples/extensions/custom-provider-anthropic/index.ts +604 -0
  479. package/.references/pi/packages/coding-agent/examples/extensions/custom-provider-anthropic/package-lock.json +24 -0
  480. package/.references/pi/packages/coding-agent/examples/extensions/custom-provider-anthropic/package.json +19 -0
  481. package/.references/pi/packages/coding-agent/examples/extensions/custom-provider-gitlab-duo/index.ts +404 -0
  482. package/.references/pi/packages/coding-agent/examples/extensions/custom-provider-gitlab-duo/package.json +16 -0
  483. package/.references/pi/packages/coding-agent/examples/extensions/custom-provider-gitlab-duo/test.ts +82 -0
  484. package/.references/pi/packages/coding-agent/examples/extensions/dirty-repo-guard.ts +56 -0
  485. package/.references/pi/packages/coding-agent/examples/extensions/doom-overlay/README.md +46 -0
  486. package/.references/pi/packages/coding-agent/examples/extensions/doom-overlay/doom/build/doom.js +21 -0
  487. package/.references/pi/packages/coding-agent/examples/extensions/doom-overlay/doom/build/doom.wasm +0 -0
  488. package/.references/pi/packages/coding-agent/examples/extensions/doom-overlay/doom/build.sh +152 -0
  489. package/.references/pi/packages/coding-agent/examples/extensions/doom-overlay/doom/doomgeneric_pi.c +72 -0
  490. package/.references/pi/packages/coding-agent/examples/extensions/doom-overlay/doom-component.ts +132 -0
  491. package/.references/pi/packages/coding-agent/examples/extensions/doom-overlay/doom-engine.ts +173 -0
  492. package/.references/pi/packages/coding-agent/examples/extensions/doom-overlay/doom-keys.ts +104 -0
  493. package/.references/pi/packages/coding-agent/examples/extensions/doom-overlay/index.ts +74 -0
  494. package/.references/pi/packages/coding-agent/examples/extensions/doom-overlay/wad-finder.ts +51 -0
  495. package/.references/pi/packages/coding-agent/examples/extensions/dynamic-resources/SKILL.md +8 -0
  496. package/.references/pi/packages/coding-agent/examples/extensions/dynamic-resources/dynamic.json +79 -0
  497. package/.references/pi/packages/coding-agent/examples/extensions/dynamic-resources/dynamic.md +5 -0
  498. package/.references/pi/packages/coding-agent/examples/extensions/dynamic-resources/index.ts +15 -0
  499. package/.references/pi/packages/coding-agent/examples/extensions/dynamic-tools.ts +74 -0
  500. package/.references/pi/packages/coding-agent/examples/extensions/entry-renderer.ts +41 -0
  501. package/.references/pi/packages/coding-agent/examples/extensions/event-bus.ts +43 -0
  502. package/.references/pi/packages/coding-agent/examples/extensions/file-trigger.ts +41 -0
  503. package/.references/pi/packages/coding-agent/examples/extensions/git-checkpoint.ts +53 -0
  504. package/.references/pi/packages/coding-agent/examples/extensions/git-merge-and-resolve.ts +115 -0
  505. package/.references/pi/packages/coding-agent/examples/extensions/github-issue-autocomplete.ts +185 -0
  506. package/.references/pi/packages/coding-agent/examples/extensions/gondolin/index.ts +531 -0
  507. package/.references/pi/packages/coding-agent/examples/extensions/gondolin/package-lock.json +185 -0
  508. package/.references/pi/packages/coding-agent/examples/extensions/gondolin/package.json +19 -0
  509. package/.references/pi/packages/coding-agent/examples/extensions/handoff.ts +191 -0
  510. package/.references/pi/packages/coding-agent/examples/extensions/hello.ts +26 -0
  511. package/.references/pi/packages/coding-agent/examples/extensions/hidden-thinking-label.ts +53 -0
  512. package/.references/pi/packages/coding-agent/examples/extensions/inline-bash.ts +94 -0
  513. package/.references/pi/packages/coding-agent/examples/extensions/input-transform-streaming.ts +39 -0
  514. package/.references/pi/packages/coding-agent/examples/extensions/input-transform.ts +43 -0
  515. package/.references/pi/packages/coding-agent/examples/extensions/interactive-shell.ts +196 -0
  516. package/.references/pi/packages/coding-agent/examples/extensions/kimi-deferred-tools.ts +61 -0
  517. package/.references/pi/packages/coding-agent/examples/extensions/mac-system-theme.ts +47 -0
  518. package/.references/pi/packages/coding-agent/examples/extensions/message-renderer.ts +59 -0
  519. package/.references/pi/packages/coding-agent/examples/extensions/minimal-mode.ts +426 -0
  520. package/.references/pi/packages/coding-agent/examples/extensions/modal-editor.ts +85 -0
  521. package/.references/pi/packages/coding-agent/examples/extensions/model-status.ts +31 -0
  522. package/.references/pi/packages/coding-agent/examples/extensions/notify.ts +55 -0
  523. package/.references/pi/packages/coding-agent/examples/extensions/overlay-qa-tests.ts +1450 -0
  524. package/.references/pi/packages/coding-agent/examples/extensions/overlay-test.ts +153 -0
  525. package/.references/pi/packages/coding-agent/examples/extensions/permission-gate.ts +34 -0
  526. package/.references/pi/packages/coding-agent/examples/extensions/pirate.ts +47 -0
  527. package/.references/pi/packages/coding-agent/examples/extensions/plan-mode/README.md +66 -0
  528. package/.references/pi/packages/coding-agent/examples/extensions/plan-mode/index.ts +390 -0
  529. package/.references/pi/packages/coding-agent/examples/extensions/plan-mode/utils.ts +168 -0
  530. package/.references/pi/packages/coding-agent/examples/extensions/preset.ts +436 -0
  531. package/.references/pi/packages/coding-agent/examples/extensions/project-trust.ts +64 -0
  532. package/.references/pi/packages/coding-agent/examples/extensions/prompt-customizer.ts +97 -0
  533. package/.references/pi/packages/coding-agent/examples/extensions/protected-paths.ts +30 -0
  534. package/.references/pi/packages/coding-agent/examples/extensions/provider-payload.ts +18 -0
  535. package/.references/pi/packages/coding-agent/examples/extensions/qna.ts +122 -0
  536. package/.references/pi/packages/coding-agent/examples/extensions/question.ts +286 -0
  537. package/.references/pi/packages/coding-agent/examples/extensions/questionnaire.ts +448 -0
  538. package/.references/pi/packages/coding-agent/examples/extensions/rainbow-editor.ts +88 -0
  539. package/.references/pi/packages/coding-agent/examples/extensions/reload-runtime.ts +37 -0
  540. package/.references/pi/packages/coding-agent/examples/extensions/rpc-demo.ts +118 -0
  541. package/.references/pi/packages/coding-agent/examples/extensions/sandbox/index.ts +321 -0
  542. package/.references/pi/packages/coding-agent/examples/extensions/sandbox/package-lock.json +92 -0
  543. package/.references/pi/packages/coding-agent/examples/extensions/sandbox/package.json +19 -0
  544. package/.references/pi/packages/coding-agent/examples/extensions/send-user-message.ts +97 -0
  545. package/.references/pi/packages/coding-agent/examples/extensions/session-name.ts +27 -0
  546. package/.references/pi/packages/coding-agent/examples/extensions/shutdown-command.ts +63 -0
  547. package/.references/pi/packages/coding-agent/examples/extensions/snake.ts +343 -0
  548. package/.references/pi/packages/coding-agent/examples/extensions/space-invaders.ts +560 -0
  549. package/.references/pi/packages/coding-agent/examples/extensions/ssh.ts +220 -0
  550. package/.references/pi/packages/coding-agent/examples/extensions/status-line.ts +32 -0
  551. package/.references/pi/packages/coding-agent/examples/extensions/structured-output.ts +65 -0
  552. package/.references/pi/packages/coding-agent/examples/extensions/subagent/README.md +175 -0
  553. package/.references/pi/packages/coding-agent/examples/extensions/subagent/agents/planner.md +37 -0
  554. package/.references/pi/packages/coding-agent/examples/extensions/subagent/agents/reviewer.md +35 -0
  555. package/.references/pi/packages/coding-agent/examples/extensions/subagent/agents/scout.md +50 -0
  556. package/.references/pi/packages/coding-agent/examples/extensions/subagent/agents/worker.md +24 -0
  557. package/.references/pi/packages/coding-agent/examples/extensions/subagent/agents.ts +126 -0
  558. package/.references/pi/packages/coding-agent/examples/extensions/subagent/index.ts +1015 -0
  559. package/.references/pi/packages/coding-agent/examples/extensions/subagent/prompts/implement-and-review.md +10 -0
  560. package/.references/pi/packages/coding-agent/examples/extensions/subagent/prompts/implement.md +10 -0
  561. package/.references/pi/packages/coding-agent/examples/extensions/subagent/prompts/scout-and-plan.md +9 -0
  562. package/.references/pi/packages/coding-agent/examples/extensions/summarize.ts +207 -0
  563. package/.references/pi/packages/coding-agent/examples/extensions/system-prompt-header.ts +17 -0
  564. package/.references/pi/packages/coding-agent/examples/extensions/tic-tac-toe.ts +1008 -0
  565. package/.references/pi/packages/coding-agent/examples/extensions/timed-confirm.ts +70 -0
  566. package/.references/pi/packages/coding-agent/examples/extensions/titlebar-spinner.ts +58 -0
  567. package/.references/pi/packages/coding-agent/examples/extensions/todo.ts +297 -0
  568. package/.references/pi/packages/coding-agent/examples/extensions/tool-override.ts +144 -0
  569. package/.references/pi/packages/coding-agent/examples/extensions/tools.ts +146 -0
  570. package/.references/pi/packages/coding-agent/examples/extensions/trigger-compact.ts +50 -0
  571. package/.references/pi/packages/coding-agent/examples/extensions/truncated-tool.ts +195 -0
  572. package/.references/pi/packages/coding-agent/examples/extensions/widget-placement.ts +9 -0
  573. package/.references/pi/packages/coding-agent/examples/extensions/with-deps/index.ts +32 -0
  574. package/.references/pi/packages/coding-agent/examples/extensions/with-deps/package-lock.json +31 -0
  575. package/.references/pi/packages/coding-agent/examples/extensions/with-deps/package.json +22 -0
  576. package/.references/pi/packages/coding-agent/examples/extensions/working-indicator.ts +123 -0
  577. package/.references/pi/packages/coding-agent/examples/extensions/working-message-test.ts +25 -0
  578. package/.references/pi/packages/coding-agent/examples/rpc-extension-ui.ts +632 -0
  579. package/.references/pi/packages/coding-agent/examples/sdk/01-minimal.ts +26 -0
  580. package/.references/pi/packages/coding-agent/examples/sdk/02-custom-model.ts +50 -0
  581. package/.references/pi/packages/coding-agent/examples/sdk/03-custom-prompt.ts +75 -0
  582. package/.references/pi/packages/coding-agent/examples/sdk/04-skills.ts +55 -0
  583. package/.references/pi/packages/coding-agent/examples/sdk/05-tools.ts +48 -0
  584. package/.references/pi/packages/coding-agent/examples/sdk/06-extensions.ts +99 -0
  585. package/.references/pi/packages/coding-agent/examples/sdk/07-context-files.ts +47 -0
  586. package/.references/pi/packages/coding-agent/examples/sdk/08-prompt-templates.ts +51 -0
  587. package/.references/pi/packages/coding-agent/examples/sdk/09-api-keys-and-oauth.ts +34 -0
  588. package/.references/pi/packages/coding-agent/examples/sdk/10-settings.ts +53 -0
  589. package/.references/pi/packages/coding-agent/examples/sdk/11-sessions.ts +52 -0
  590. package/.references/pi/packages/coding-agent/examples/sdk/12-full-control.ts +72 -0
  591. package/.references/pi/packages/coding-agent/examples/sdk/13-session-runtime.ts +67 -0
  592. package/.references/pi/packages/coding-agent/examples/sdk/README.md +140 -0
  593. package/.references/pi/packages/coding-agent/install-lock/package-lock.json +1849 -0
  594. package/.references/pi/packages/coding-agent/install-lock/package.json +18 -0
  595. package/.references/pi/packages/coding-agent/npm-shrinkwrap.json +1839 -0
  596. package/.references/pi/packages/coding-agent/package.json +100 -0
  597. package/.references/pi/packages/coding-agent/scripts/migrate-sessions.sh +93 -0
  598. package/.references/pi/packages/coding-agent/src/bun/cli.ts +15 -0
  599. package/.references/pi/packages/coding-agent/src/bun/register-bedrock.ts +4 -0
  600. package/.references/pi/packages/coding-agent/src/bun/restore-sandbox-env.ts +36 -0
  601. package/.references/pi/packages/coding-agent/src/cli/args.ts +390 -0
  602. package/.references/pi/packages/coding-agent/src/cli/config-selector.ts +56 -0
  603. package/.references/pi/packages/coding-agent/src/cli/file-processor.ts +87 -0
  604. package/.references/pi/packages/coding-agent/src/cli/initial-message.ts +43 -0
  605. package/.references/pi/packages/coding-agent/src/cli/list-models.ts +111 -0
  606. package/.references/pi/packages/coding-agent/src/cli/project-trust.ts +62 -0
  607. package/.references/pi/packages/coding-agent/src/cli/session-picker.ts +55 -0
  608. package/.references/pi/packages/coding-agent/src/cli/startup-ui.ts +239 -0
  609. package/.references/pi/packages/coding-agent/src/cli.ts +20 -0
  610. package/.references/pi/packages/coding-agent/src/config.ts +566 -0
  611. package/.references/pi/packages/coding-agent/src/core/agent-session-runtime.ts +438 -0
  612. package/.references/pi/packages/coding-agent/src/core/agent-session-services.ts +207 -0
  613. package/.references/pi/packages/coding-agent/src/core/agent-session.ts +3279 -0
  614. package/.references/pi/packages/coding-agent/src/core/auth-guidance.ts +25 -0
  615. package/.references/pi/packages/coding-agent/src/core/auth-storage.ts +271 -0
  616. package/.references/pi/packages/coding-agent/src/core/bash-executor.ts +156 -0
  617. package/.references/pi/packages/coding-agent/src/core/cache-stats.ts +164 -0
  618. package/.references/pi/packages/coding-agent/src/core/compaction/branch-summarization.ts +371 -0
  619. package/.references/pi/packages/coding-agent/src/core/compaction/compaction.ts +872 -0
  620. package/.references/pi/packages/coding-agent/src/core/compaction/index.ts +7 -0
  621. package/.references/pi/packages/coding-agent/src/core/compaction/utils.ts +170 -0
  622. package/.references/pi/packages/coding-agent/src/core/defaults.ts +3 -0
  623. package/.references/pi/packages/coding-agent/src/core/diagnostics.ts +15 -0
  624. package/.references/pi/packages/coding-agent/src/core/event-bus.ts +33 -0
  625. package/.references/pi/packages/coding-agent/src/core/exec.ts +107 -0
  626. package/.references/pi/packages/coding-agent/src/core/experimental.ts +3 -0
  627. package/.references/pi/packages/coding-agent/src/core/export-html/ansi-to-html.ts +258 -0
  628. package/.references/pi/packages/coding-agent/src/core/export-html/index.ts +316 -0
  629. package/.references/pi/packages/coding-agent/src/core/export-html/template.css +1066 -0
  630. package/.references/pi/packages/coding-agent/src/core/export-html/template.html +55 -0
  631. package/.references/pi/packages/coding-agent/src/core/export-html/template.js +1864 -0
  632. package/.references/pi/packages/coding-agent/src/core/export-html/tool-renderer.ts +172 -0
  633. package/.references/pi/packages/coding-agent/src/core/export-html/vendor/highlight.min.js +1213 -0
  634. package/.references/pi/packages/coding-agent/src/core/export-html/vendor/marked.min.js +78 -0
  635. package/.references/pi/packages/coding-agent/src/core/extensions/index.ts +184 -0
  636. package/.references/pi/packages/coding-agent/src/core/extensions/loader.ts +708 -0
  637. package/.references/pi/packages/coding-agent/src/core/extensions/runner.ts +1189 -0
  638. package/.references/pi/packages/coding-agent/src/core/extensions/types.ts +1674 -0
  639. package/.references/pi/packages/coding-agent/src/core/extensions/wrapper.ts +45 -0
  640. package/.references/pi/packages/coding-agent/src/core/footer-data-provider.ts +388 -0
  641. package/.references/pi/packages/coding-agent/src/core/http-dispatcher.ts +106 -0
  642. package/.references/pi/packages/coding-agent/src/core/index.ts +80 -0
  643. package/.references/pi/packages/coding-agent/src/core/keybindings.ts +370 -0
  644. package/.references/pi/packages/coding-agent/src/core/messages.ts +195 -0
  645. package/.references/pi/packages/coding-agent/src/core/model-config.ts +287 -0
  646. package/.references/pi/packages/coding-agent/src/core/model-registry.ts +126 -0
  647. package/.references/pi/packages/coding-agent/src/core/model-resolver.ts +705 -0
  648. package/.references/pi/packages/coding-agent/src/core/model-runtime.ts +566 -0
  649. package/.references/pi/packages/coding-agent/src/core/models-store.ts +57 -0
  650. package/.references/pi/packages/coding-agent/src/core/output-guard.ts +108 -0
  651. package/.references/pi/packages/coding-agent/src/core/package-manager.ts +2650 -0
  652. package/.references/pi/packages/coding-agent/src/core/project-trust.ts +96 -0
  653. package/.references/pi/packages/coding-agent/src/core/prompt-templates.ts +284 -0
  654. package/.references/pi/packages/coding-agent/src/core/provider-attribution.ts +97 -0
  655. package/.references/pi/packages/coding-agent/src/core/provider-composer.ts +548 -0
  656. package/.references/pi/packages/coding-agent/src/core/radius.ts +1 -0
  657. package/.references/pi/packages/coding-agent/src/core/remote-catalog-provider.ts +83 -0
  658. package/.references/pi/packages/coding-agent/src/core/resolve-config-value.ts +287 -0
  659. package/.references/pi/packages/coding-agent/src/core/resource-loader.ts +1039 -0
  660. package/.references/pi/packages/coding-agent/src/core/runtime-credentials.ts +48 -0
  661. package/.references/pi/packages/coding-agent/src/core/sdk.ts +393 -0
  662. package/.references/pi/packages/coding-agent/src/core/session-cwd.ts +59 -0
  663. package/.references/pi/packages/coding-agent/src/core/session-manager.ts +1623 -0
  664. package/.references/pi/packages/coding-agent/src/core/settings-manager.ts +1234 -0
  665. package/.references/pi/packages/coding-agent/src/core/skills.ts +487 -0
  666. package/.references/pi/packages/coding-agent/src/core/slash-commands.ts +42 -0
  667. package/.references/pi/packages/coding-agent/src/core/source-info.ts +40 -0
  668. package/.references/pi/packages/coding-agent/src/core/system-prompt.ts +162 -0
  669. package/.references/pi/packages/coding-agent/src/core/telemetry.ts +13 -0
  670. package/.references/pi/packages/coding-agent/src/core/timings.ts +50 -0
  671. package/.references/pi/packages/coding-agent/src/core/tools/bash.ts +470 -0
  672. package/.references/pi/packages/coding-agent/src/core/tools/edit-diff.ts +560 -0
  673. package/.references/pi/packages/coding-agent/src/core/tools/edit.ts +437 -0
  674. package/.references/pi/packages/coding-agent/src/core/tools/file-mutation-queue.ts +61 -0
  675. package/.references/pi/packages/coding-agent/src/core/tools/find.ts +374 -0
  676. package/.references/pi/packages/coding-agent/src/core/tools/grep.ts +385 -0
  677. package/.references/pi/packages/coding-agent/src/core/tools/index.ts +196 -0
  678. package/.references/pi/packages/coding-agent/src/core/tools/ls.ts +225 -0
  679. package/.references/pi/packages/coding-agent/src/core/tools/output-accumulator.ts +222 -0
  680. package/.references/pi/packages/coding-agent/src/core/tools/path-utils.ts +118 -0
  681. package/.references/pi/packages/coding-agent/src/core/tools/read.ts +351 -0
  682. package/.references/pi/packages/coding-agent/src/core/tools/render-utils.ts +85 -0
  683. package/.references/pi/packages/coding-agent/src/core/tools/tool-definition-wrapper.ts +45 -0
  684. package/.references/pi/packages/coding-agent/src/core/tools/truncate.ts +276 -0
  685. package/.references/pi/packages/coding-agent/src/core/tools/write.ts +267 -0
  686. package/.references/pi/packages/coding-agent/src/core/trust-manager.ts +244 -0
  687. package/.references/pi/packages/coding-agent/src/index.ts +394 -0
  688. package/.references/pi/packages/coding-agent/src/main.ts +857 -0
  689. package/.references/pi/packages/coding-agent/src/migrations.ts +315 -0
  690. package/.references/pi/packages/coding-agent/src/modes/index.ts +15 -0
  691. package/.references/pi/packages/coding-agent/src/modes/interactive/assets/clankolas.png +0 -0
  692. package/.references/pi/packages/coding-agent/src/modes/interactive/components/armin.ts +382 -0
  693. package/.references/pi/packages/coding-agent/src/modes/interactive/components/assistant-message.ts +180 -0
  694. package/.references/pi/packages/coding-agent/src/modes/interactive/components/bash-execution.ts +220 -0
  695. package/.references/pi/packages/coding-agent/src/modes/interactive/components/bordered-loader.ts +68 -0
  696. package/.references/pi/packages/coding-agent/src/modes/interactive/components/branch-summary-message.ts +58 -0
  697. package/.references/pi/packages/coding-agent/src/modes/interactive/components/compaction-summary-message.ts +59 -0
  698. package/.references/pi/packages/coding-agent/src/modes/interactive/components/config-selector.ts +942 -0
  699. package/.references/pi/packages/coding-agent/src/modes/interactive/components/countdown-timer.ts +39 -0
  700. package/.references/pi/packages/coding-agent/src/modes/interactive/components/custom-editor.ts +80 -0
  701. package/.references/pi/packages/coding-agent/src/modes/interactive/components/custom-entry.ts +62 -0
  702. package/.references/pi/packages/coding-agent/src/modes/interactive/components/custom-message.ts +99 -0
  703. package/.references/pi/packages/coding-agent/src/modes/interactive/components/daxnuts.ts +164 -0
  704. package/.references/pi/packages/coding-agent/src/modes/interactive/components/diff.ts +147 -0
  705. package/.references/pi/packages/coding-agent/src/modes/interactive/components/dynamic-border.ts +25 -0
  706. package/.references/pi/packages/coding-agent/src/modes/interactive/components/earendil-announcement.ts +53 -0
  707. package/.references/pi/packages/coding-agent/src/modes/interactive/components/extension-editor.ts +167 -0
  708. package/.references/pi/packages/coding-agent/src/modes/interactive/components/extension-input.ts +87 -0
  709. package/.references/pi/packages/coding-agent/src/modes/interactive/components/extension-selector.ts +112 -0
  710. package/.references/pi/packages/coding-agent/src/modes/interactive/components/first-time-setup.ts +145 -0
  711. package/.references/pi/packages/coding-agent/src/modes/interactive/components/footer.ts +245 -0
  712. package/.references/pi/packages/coding-agent/src/modes/interactive/components/index.ts +38 -0
  713. package/.references/pi/packages/coding-agent/src/modes/interactive/components/keybinding-hints.ts +48 -0
  714. package/.references/pi/packages/coding-agent/src/modes/interactive/components/login-dialog.ts +233 -0
  715. package/.references/pi/packages/coding-agent/src/modes/interactive/components/model-selector.ts +361 -0
  716. package/.references/pi/packages/coding-agent/src/modes/interactive/components/oauth-selector.ts +214 -0
  717. package/.references/pi/packages/coding-agent/src/modes/interactive/components/scoped-models-selector.ts +360 -0
  718. package/.references/pi/packages/coding-agent/src/modes/interactive/components/session-selector-search.ts +194 -0
  719. package/.references/pi/packages/coding-agent/src/modes/interactive/components/session-selector.ts +1031 -0
  720. package/.references/pi/packages/coding-agent/src/modes/interactive/components/settings-selector.ts +838 -0
  721. package/.references/pi/packages/coding-agent/src/modes/interactive/components/show-images-selector.ts +50 -0
  722. package/.references/pi/packages/coding-agent/src/modes/interactive/components/skill-invocation-message.ts +55 -0
  723. package/.references/pi/packages/coding-agent/src/modes/interactive/components/status-indicator.ts +114 -0
  724. package/.references/pi/packages/coding-agent/src/modes/interactive/components/theme-selector.ts +67 -0
  725. package/.references/pi/packages/coding-agent/src/modes/interactive/components/thinking-selector.ts +75 -0
  726. package/.references/pi/packages/coding-agent/src/modes/interactive/components/tool-execution.ts +377 -0
  727. package/.references/pi/packages/coding-agent/src/modes/interactive/components/tree-selector.ts +1427 -0
  728. package/.references/pi/packages/coding-agent/src/modes/interactive/components/trust-selector.ts +134 -0
  729. package/.references/pi/packages/coding-agent/src/modes/interactive/components/user-message-selector.ts +155 -0
  730. package/.references/pi/packages/coding-agent/src/modes/interactive/components/user-message.ts +57 -0
  731. package/.references/pi/packages/coding-agent/src/modes/interactive/components/visual-truncate.ts +50 -0
  732. package/.references/pi/packages/coding-agent/src/modes/interactive/interactive-mode.ts +6005 -0
  733. package/.references/pi/packages/coding-agent/src/modes/interactive/model-search.ts +21 -0
  734. package/.references/pi/packages/coding-agent/src/modes/interactive/theme/dark.json +87 -0
  735. package/.references/pi/packages/coding-agent/src/modes/interactive/theme/light.json +86 -0
  736. package/.references/pi/packages/coding-agent/src/modes/interactive/theme/theme-controller.ts +126 -0
  737. package/.references/pi/packages/coding-agent/src/modes/interactive/theme/theme-schema.json +340 -0
  738. package/.references/pi/packages/coding-agent/src/modes/interactive/theme/theme.ts +1294 -0
  739. package/.references/pi/packages/coding-agent/src/modes/print-mode.ts +159 -0
  740. package/.references/pi/packages/coding-agent/src/modes/rpc/jsonl.ts +58 -0
  741. package/.references/pi/packages/coding-agent/src/modes/rpc/rpc-client.ts +592 -0
  742. package/.references/pi/packages/coding-agent/src/modes/rpc/rpc-mode.ts +795 -0
  743. package/.references/pi/packages/coding-agent/src/modes/rpc/rpc-types.ts +281 -0
  744. package/.references/pi/packages/coding-agent/src/package-manager-cli.ts +887 -0
  745. package/.references/pi/packages/coding-agent/src/rpc-entry.ts +12 -0
  746. package/.references/pi/packages/coding-agent/src/utils/ansi.ts +60 -0
  747. package/.references/pi/packages/coding-agent/src/utils/changelog.ts +196 -0
  748. package/.references/pi/packages/coding-agent/src/utils/child-process.ts +137 -0
  749. package/.references/pi/packages/coding-agent/src/utils/clipboard-image.ts +300 -0
  750. package/.references/pi/packages/coding-agent/src/utils/clipboard-native.ts +33 -0
  751. package/.references/pi/packages/coding-agent/src/utils/clipboard.ts +141 -0
  752. package/.references/pi/packages/coding-agent/src/utils/deprecation.ts +14 -0
  753. package/.references/pi/packages/coding-agent/src/utils/exif-orientation.ts +183 -0
  754. package/.references/pi/packages/coding-agent/src/utils/frontmatter.ts +39 -0
  755. package/.references/pi/packages/coding-agent/src/utils/fs-watch.ts +30 -0
  756. package/.references/pi/packages/coding-agent/src/utils/git.ts +226 -0
  757. package/.references/pi/packages/coding-agent/src/utils/highlight-js-lib-index.d.ts +19 -0
  758. package/.references/pi/packages/coding-agent/src/utils/html.ts +51 -0
  759. package/.references/pi/packages/coding-agent/src/utils/image-convert.ts +49 -0
  760. package/.references/pi/packages/coding-agent/src/utils/image-process.ts +119 -0
  761. package/.references/pi/packages/coding-agent/src/utils/image-resize-core.ts +164 -0
  762. package/.references/pi/packages/coding-agent/src/utils/image-resize-worker.ts +42 -0
  763. package/.references/pi/packages/coding-agent/src/utils/image-resize.ts +123 -0
  764. package/.references/pi/packages/coding-agent/src/utils/json.ts +6 -0
  765. package/.references/pi/packages/coding-agent/src/utils/mime.ts +116 -0
  766. package/.references/pi/packages/coding-agent/src/utils/open-browser.ts +24 -0
  767. package/.references/pi/packages/coding-agent/src/utils/paths.ts +118 -0
  768. package/.references/pi/packages/coding-agent/src/utils/photon.ts +139 -0
  769. package/.references/pi/packages/coding-agent/src/utils/pi-user-agent.ts +4 -0
  770. package/.references/pi/packages/coding-agent/src/utils/shell.ts +225 -0
  771. package/.references/pi/packages/coding-agent/src/utils/sleep.ts +18 -0
  772. package/.references/pi/packages/coding-agent/src/utils/syntax-highlight.ts +146 -0
  773. package/.references/pi/packages/coding-agent/src/utils/tools-manager.ts +369 -0
  774. package/.references/pi/packages/coding-agent/src/utils/version-check.ts +80 -0
  775. package/.references/pi/packages/coding-agent/src/utils/windows-self-update.ts +84 -0
  776. package/.references/pi/packages/coding-agent/test/agent-session-auto-compaction-queue.test.ts +450 -0
  777. package/.references/pi/packages/coding-agent/test/agent-session-branching.test.ts +156 -0
  778. package/.references/pi/packages/coding-agent/test/agent-session-compaction.test.ts +208 -0
  779. package/.references/pi/packages/coding-agent/test/agent-session-concurrent.test.ts +629 -0
  780. package/.references/pi/packages/coding-agent/test/agent-session-dynamic-provider.test.ts +122 -0
  781. package/.references/pi/packages/coding-agent/test/agent-session-dynamic-tools.test.ts +185 -0
  782. package/.references/pi/packages/coding-agent/test/agent-session-retry.test.ts +322 -0
  783. package/.references/pi/packages/coding-agent/test/agent-session-runtime-events.test.ts +257 -0
  784. package/.references/pi/packages/coding-agent/test/agent-session-stats.test.ts +169 -0
  785. package/.references/pi/packages/coding-agent/test/agent-session-tree-navigation.test.ts +323 -0
  786. package/.references/pi/packages/coding-agent/test/ansi-utils.test.ts +110 -0
  787. package/.references/pi/packages/coding-agent/test/args.test.ts +441 -0
  788. package/.references/pi/packages/coding-agent/test/assistant-message.test.ts +130 -0
  789. package/.references/pi/packages/coding-agent/test/auth-storage.test.ts +217 -0
  790. package/.references/pi/packages/coding-agent/test/bash-close-hang-windows.test.ts +126 -0
  791. package/.references/pi/packages/coding-agent/test/bash-execution-width.test.ts +80 -0
  792. package/.references/pi/packages/coding-agent/test/block-images.test.ts +148 -0
  793. package/.references/pi/packages/coding-agent/test/cache-stats.test.ts +143 -0
  794. package/.references/pi/packages/coding-agent/test/changelog.test.ts +49 -0
  795. package/.references/pi/packages/coding-agent/test/clipboard-image-bmp-conversion.test.ts +88 -0
  796. package/.references/pi/packages/coding-agent/test/clipboard-image.test.ts +184 -0
  797. package/.references/pi/packages/coding-agent/test/clipboard-native.test.ts +32 -0
  798. package/.references/pi/packages/coding-agent/test/clipboard.test.ts +166 -0
  799. package/.references/pi/packages/coding-agent/test/compaction-extensions-example.test.ts +66 -0
  800. package/.references/pi/packages/coding-agent/test/compaction-extensions.test.ts +415 -0
  801. package/.references/pi/packages/coding-agent/test/compaction-serialization.test.ts +79 -0
  802. package/.references/pi/packages/coding-agent/test/compaction-summary-reasoning.test.ts +134 -0
  803. package/.references/pi/packages/coding-agent/test/compaction.test.ts +596 -0
  804. package/.references/pi/packages/coding-agent/test/config-value-migration.test.ts +178 -0
  805. package/.references/pi/packages/coding-agent/test/config.test.ts +437 -0
  806. package/.references/pi/packages/coding-agent/test/edit-tool-legacy-input.test.ts +116 -0
  807. package/.references/pi/packages/coding-agent/test/edit-tool-no-full-redraw.test.ts +235 -0
  808. package/.references/pi/packages/coding-agent/test/experimental.test.ts +44 -0
  809. package/.references/pi/packages/coding-agent/test/export-html-skill-block.test.ts +40 -0
  810. package/.references/pi/packages/coding-agent/test/export-html-whitespace.test.ts +42 -0
  811. package/.references/pi/packages/coding-agent/test/export-html-xss.test.ts +67 -0
  812. package/.references/pi/packages/coding-agent/test/extensions-discovery.test.ts +528 -0
  813. package/.references/pi/packages/coding-agent/test/extensions-input-event.test.ts +125 -0
  814. package/.references/pi/packages/coding-agent/test/extensions-runner.test.ts +986 -0
  815. package/.references/pi/packages/coding-agent/test/file-mutation-queue.test.ts +274 -0
  816. package/.references/pi/packages/coding-agent/test/first-time-setup-fork.test.ts +39 -0
  817. package/.references/pi/packages/coding-agent/test/first-time-setup.test.ts +95 -0
  818. package/.references/pi/packages/coding-agent/test/fixtures/assistant-message-with-thinking-code.json +33 -0
  819. package/.references/pi/packages/coding-agent/test/fixtures/before-compaction.jsonl +1003 -0
  820. package/.references/pi/packages/coding-agent/test/fixtures/empty-agent/.gitkeep +0 -0
  821. package/.references/pi/packages/coding-agent/test/fixtures/empty-cwd/.gitkeep +0 -0
  822. package/.references/pi/packages/coding-agent/test/fixtures/large-session.jsonl +1019 -0
  823. package/.references/pi/packages/coding-agent/test/fixtures/skills/consecutive-hyphens/SKILL.md +8 -0
  824. package/.references/pi/packages/coding-agent/test/fixtures/skills/disable-model-invocation/SKILL.md +9 -0
  825. package/.references/pi/packages/coding-agent/test/fixtures/skills/invalid-name-chars/SKILL.md +8 -0
  826. package/.references/pi/packages/coding-agent/test/fixtures/skills/invalid-yaml/SKILL.md +8 -0
  827. package/.references/pi/packages/coding-agent/test/fixtures/skills/long-name/SKILL.md +8 -0
  828. package/.references/pi/packages/coding-agent/test/fixtures/skills/missing-description/SKILL.md +7 -0
  829. package/.references/pi/packages/coding-agent/test/fixtures/skills/multiline-description/SKILL.md +11 -0
  830. package/.references/pi/packages/coding-agent/test/fixtures/skills/name-mismatch/SKILL.md +8 -0
  831. package/.references/pi/packages/coding-agent/test/fixtures/skills/nested/child-skill/SKILL.md +8 -0
  832. package/.references/pi/packages/coding-agent/test/fixtures/skills/no-frontmatter/SKILL.md +3 -0
  833. package/.references/pi/packages/coding-agent/test/fixtures/skills/root-skill-preferred/SKILL.md +3 -0
  834. package/.references/pi/packages/coding-agent/test/fixtures/skills/root-skill-preferred/nested-child/SKILL.md +3 -0
  835. package/.references/pi/packages/coding-agent/test/fixtures/skills/unknown-field/SKILL.md +10 -0
  836. package/.references/pi/packages/coding-agent/test/fixtures/skills/valid-skill/SKILL.md +8 -0
  837. package/.references/pi/packages/coding-agent/test/fixtures/skills-collision/first/calendar/SKILL.md +8 -0
  838. package/.references/pi/packages/coding-agent/test/fixtures/skills-collision/second/calendar/SKILL.md +8 -0
  839. package/.references/pi/packages/coding-agent/test/footer-data-provider.test.ts +265 -0
  840. package/.references/pi/packages/coding-agent/test/footer-width.test.ts +144 -0
  841. package/.references/pi/packages/coding-agent/test/format-resume-command.test.ts +135 -0
  842. package/.references/pi/packages/coding-agent/test/frontmatter.test.ts +60 -0
  843. package/.references/pi/packages/coding-agent/test/git-merge-and-resolve-extension.test.ts +206 -0
  844. package/.references/pi/packages/coding-agent/test/git-ssh-url.test.ts +91 -0
  845. package/.references/pi/packages/coding-agent/test/git-update.test.ts +484 -0
  846. package/.references/pi/packages/coding-agent/test/http-dispatcher.test.ts +53 -0
  847. package/.references/pi/packages/coding-agent/test/image-process.test.ts +53 -0
  848. package/.references/pi/packages/coding-agent/test/image-processing.test.ts +170 -0
  849. package/.references/pi/packages/coding-agent/test/image-resize-callers.test.ts +53 -0
  850. package/.references/pi/packages/coding-agent/test/initial-message.test.ts +48 -0
  851. package/.references/pi/packages/coding-agent/test/input-transform-streaming-example.test.ts +84 -0
  852. package/.references/pi/packages/coding-agent/test/interactive-mode-anthropic-warning.test.ts +89 -0
  853. package/.references/pi/packages/coding-agent/test/interactive-mode-clone-command.test.ts +72 -0
  854. package/.references/pi/packages/coding-agent/test/interactive-mode-compaction.test.ts +85 -0
  855. package/.references/pi/packages/coding-agent/test/interactive-mode-import-command.test.ts +143 -0
  856. package/.references/pi/packages/coding-agent/test/interactive-mode-startup-input.test.ts +72 -0
  857. package/.references/pi/packages/coding-agent/test/interactive-mode-status.test.ts +1123 -0
  858. package/.references/pi/packages/coding-agent/test/interactive-mode-suspend.test.ts +149 -0
  859. package/.references/pi/packages/coding-agent/test/keybindings-migration.test.ts +88 -0
  860. package/.references/pi/packages/coding-agent/test/max-thinking.test.ts +45 -0
  861. package/.references/pi/packages/coding-agent/test/model-registry.test.ts +1934 -0
  862. package/.references/pi/packages/coding-agent/test/model-resolver.test.ts +690 -0
  863. package/.references/pi/packages/coding-agent/test/model-runtime-auth-options.test.ts +256 -0
  864. package/.references/pi/packages/coding-agent/test/model-runtime-cloudflare-compat.test.ts +95 -0
  865. package/.references/pi/packages/coding-agent/test/model-runtime-modify-models-compat.test.ts +85 -0
  866. package/.references/pi/packages/coding-agent/test/model-runtime-test-utils.ts +25 -0
  867. package/.references/pi/packages/coding-agent/test/models-store.test.ts +51 -0
  868. package/.references/pi/packages/coding-agent/test/oauth-selector.test.ts +147 -0
  869. package/.references/pi/packages/coding-agent/test/package-command-paths.test.ts +746 -0
  870. package/.references/pi/packages/coding-agent/test/package-manager-ssh.test.ts +97 -0
  871. package/.references/pi/packages/coding-agent/test/package-manager.test.ts +2512 -0
  872. package/.references/pi/packages/coding-agent/test/path-utils.test.ts +174 -0
  873. package/.references/pi/packages/coding-agent/test/paths.test.ts +150 -0
  874. package/.references/pi/packages/coding-agent/test/pi-user-agent.test.ts +12 -0
  875. package/.references/pi/packages/coding-agent/test/plan-mode-extension.test.ts +167 -0
  876. package/.references/pi/packages/coding-agent/test/plan-mode-utils.test.ts +261 -0
  877. package/.references/pi/packages/coding-agent/test/print-mode.test.ts +142 -0
  878. package/.references/pi/packages/coding-agent/test/prompt-templates.test.ts +615 -0
  879. package/.references/pi/packages/coding-agent/test/radius.test.ts +151 -0
  880. package/.references/pi/packages/coding-agent/test/remote-catalog-provider.test.ts +118 -0
  881. package/.references/pi/packages/coding-agent/test/resolve-config-value.test.ts +121 -0
  882. package/.references/pi/packages/coding-agent/test/resource-loader.test.ts +739 -0
  883. package/.references/pi/packages/coding-agent/test/restore-sandbox-env.test.ts +77 -0
  884. package/.references/pi/packages/coding-agent/test/rpc-client-clone.test.ts +29 -0
  885. package/.references/pi/packages/coding-agent/test/rpc-client-process-exit.test.ts +38 -0
  886. package/.references/pi/packages/coding-agent/test/rpc-example.ts +86 -0
  887. package/.references/pi/packages/coding-agent/test/rpc-jsonl.test.ts +65 -0
  888. package/.references/pi/packages/coding-agent/test/rpc-prompt-response-semantics.test.ts +288 -0
  889. package/.references/pi/packages/coding-agent/test/rpc.test.ts +377 -0
  890. package/.references/pi/packages/coding-agent/test/runtime-credentials.test.ts +42 -0
  891. package/.references/pi/packages/coding-agent/test/sdk-codex-cache-probe-tool-loop.ts +497 -0
  892. package/.references/pi/packages/coding-agent/test/sdk-openrouter-attribution.test.ts +266 -0
  893. package/.references/pi/packages/coding-agent/test/sdk-session-manager.test.ts +95 -0
  894. package/.references/pi/packages/coding-agent/test/sdk-skills.test.ts +109 -0
  895. package/.references/pi/packages/coding-agent/test/sdk-stream-options.test.ts +188 -0
  896. package/.references/pi/packages/coding-agent/test/session-cwd.test.ts +91 -0
  897. package/.references/pi/packages/coding-agent/test/session-file-invalid.test.ts +65 -0
  898. package/.references/pi/packages/coding-agent/test/session-id-readonly.test.ts +190 -0
  899. package/.references/pi/packages/coding-agent/test/session-info-modified-timestamp.test.ts +83 -0
  900. package/.references/pi/packages/coding-agent/test/session-manager/build-context.test.ts +305 -0
  901. package/.references/pi/packages/coding-agent/test/session-manager/custom-session-id.test.ts +169 -0
  902. package/.references/pi/packages/coding-agent/test/session-manager/file-operations.test.ts +315 -0
  903. package/.references/pi/packages/coding-agent/test/session-manager/labels.test.ts +211 -0
  904. package/.references/pi/packages/coding-agent/test/session-manager/migration.test.ts +78 -0
  905. package/.references/pi/packages/coding-agent/test/session-manager/save-entry.test.ts +55 -0
  906. package/.references/pi/packages/coding-agent/test/session-manager/tree-traversal.test.ts +533 -0
  907. package/.references/pi/packages/coding-agent/test/session-selector-path-delete.test.ts +354 -0
  908. package/.references/pi/packages/coding-agent/test/session-selector-rename.test.ts +111 -0
  909. package/.references/pi/packages/coding-agent/test/session-selector-search.test.ts +195 -0
  910. package/.references/pi/packages/coding-agent/test/settings-manager-bug.test.ts +147 -0
  911. package/.references/pi/packages/coding-agent/test/settings-manager.test.ts +511 -0
  912. package/.references/pi/packages/coding-agent/test/skills.test.ts +432 -0
  913. package/.references/pi/packages/coding-agent/test/startup-session-name.test.ts +135 -0
  914. package/.references/pi/packages/coding-agent/test/status-indicator.test.ts +32 -0
  915. package/.references/pi/packages/coding-agent/test/stdout-cleanliness.test.ts +128 -0
  916. package/.references/pi/packages/coding-agent/test/streaming-render-debug.ts +97 -0
  917. package/.references/pi/packages/coding-agent/test/suite/README.md +16 -0
  918. package/.references/pi/packages/coding-agent/test/suite/agent-session-bash-persistence.test.ts +242 -0
  919. package/.references/pi/packages/coding-agent/test/suite/agent-session-compaction.test.ts +446 -0
  920. package/.references/pi/packages/coding-agent/test/suite/agent-session-model-extension.test.ts +373 -0
  921. package/.references/pi/packages/coding-agent/test/suite/agent-session-prompt.test.ts +398 -0
  922. package/.references/pi/packages/coding-agent/test/suite/agent-session-queue.test.ts +445 -0
  923. package/.references/pi/packages/coding-agent/test/suite/agent-session-retry-events.test.ts +364 -0
  924. package/.references/pi/packages/coding-agent/test/suite/agent-session-runtime.test.ts +609 -0
  925. package/.references/pi/packages/coding-agent/test/suite/harness.ts +219 -0
  926. package/.references/pi/packages/coding-agent/test/suite/lax-message-content.test.ts +162 -0
  927. package/.references/pi/packages/coding-agent/test/suite/regressions/1717-2113-agent-session-event-settlement.test.ts +95 -0
  928. package/.references/pi/packages/coding-agent/test/suite/regressions/2023-queued-slash-command-followup.test.ts +80 -0
  929. package/.references/pi/packages/coding-agent/test/suite/regressions/2753-reload-stale-resource-settings.test.ts +105 -0
  930. package/.references/pi/packages/coding-agent/test/suite/regressions/2781-skill-collision-precedence.test.ts +120 -0
  931. package/.references/pi/packages/coding-agent/test/suite/regressions/2791-fswatch-error-crash.test.ts +106 -0
  932. package/.references/pi/packages/coding-agent/test/suite/regressions/2835-tools-allowlist-filters-extension-tools.test.ts +94 -0
  933. package/.references/pi/packages/coding-agent/test/suite/regressions/2860-replaced-session-context.test.ts +279 -0
  934. package/.references/pi/packages/coding-agent/test/suite/regressions/3217-scoped-model-order.test.ts +104 -0
  935. package/.references/pi/packages/coding-agent/test/suite/regressions/3302-find-path-glob.test.ts +72 -0
  936. package/.references/pi/packages/coding-agent/test/suite/regressions/3303-find-nested-gitignore.test.ts +83 -0
  937. package/.references/pi/packages/coding-agent/test/suite/regressions/3317-network-connection-lost-retry.test.ts +33 -0
  938. package/.references/pi/packages/coding-agent/test/suite/regressions/3592-no-builtin-tools-keeps-extension-tools.test.ts +119 -0
  939. package/.references/pi/packages/coding-agent/test/suite/regressions/3616-settings-inmemory-reload.test.ts +86 -0
  940. package/.references/pi/packages/coding-agent/test/suite/regressions/3686-session-name-event.test.ts +61 -0
  941. package/.references/pi/packages/coding-agent/test/suite/regressions/3688-tree-cancel-compacting.test.ts +36 -0
  942. package/.references/pi/packages/coding-agent/test/suite/regressions/3982-message-end-cost-override.test.ts +56 -0
  943. package/.references/pi/packages/coding-agent/test/suite/regressions/4167-thinking-toggle-pending-tool-render.test.ts +182 -0
  944. package/.references/pi/packages/coding-agent/test/suite/regressions/5080-signal-shutdown-extension-cleanup.test.ts +185 -0
  945. package/.references/pi/packages/coding-agent/test/suite/regressions/5109-exclude-tools.test.ts +81 -0
  946. package/.references/pi/packages/coding-agent/test/suite/regressions/5208-late-bash-output.test.ts +29 -0
  947. package/.references/pi/packages/coding-agent/test/suite/regressions/5217-compaction-reason.test.ts +95 -0
  948. package/.references/pi/packages/coding-agent/test/suite/regressions/5303-bash-output-truncation.test.ts +79 -0
  949. package/.references/pi/packages/coding-agent/test/suite/regressions/5433-extension-oauth-prompt-input.test.ts +119 -0
  950. package/.references/pi/packages/coding-agent/test/suite/regressions/5596-missing-theme-export.test.ts +89 -0
  951. package/.references/pi/packages/coding-agent/test/suite/regressions/5661-uppercase-header-values.test.ts +91 -0
  952. package/.references/pi/packages/coding-agent/test/suite/regressions/5724-sigterm-signal-exit.test.ts +94 -0
  953. package/.references/pi/packages/coding-agent/test/suite/regressions/5868-rpc-unknown-command-id.test.ts +113 -0
  954. package/.references/pi/packages/coding-agent/test/suite/regressions/5943-session-start-notify.test.ts +515 -0
  955. package/.references/pi/packages/coding-agent/test/suite/regressions/5996-session-name-newlines.test.ts +40 -0
  956. package/.references/pi/packages/coding-agent/test/suite/regressions/6019-explicit-provider-retry-message.test.ts +31 -0
  957. package/.references/pi/packages/coding-agent/test/suite/regressions/6162-extension-active-tools-next-turn.test.ts +192 -0
  958. package/.references/pi/packages/coding-agent/test/suite/regressions/6260-inline-extension-naming.test.ts +99 -0
  959. package/.references/pi/packages/coding-agent/test/suite/regressions/6324-branch-summary-ambient-auth.test.ts +61 -0
  960. package/.references/pi/packages/coding-agent/test/suite/regressions/6363-agent-settled-event.test.ts +158 -0
  961. package/.references/pi/packages/coding-agent/test/suite/regressions/extension-factory-cache.test.ts +131 -0
  962. package/.references/pi/packages/coding-agent/test/suite/regressions/pre-prompt-compaction-no-continue.test.ts +75 -0
  963. package/.references/pi/packages/coding-agent/test/syntax-highlight.test.ts +76 -0
  964. package/.references/pi/packages/coding-agent/test/system-prompt.test.ts +114 -0
  965. package/.references/pi/packages/coding-agent/test/test-harness.test.ts +321 -0
  966. package/.references/pi/packages/coding-agent/test/test-harness.ts +463 -0
  967. package/.references/pi/packages/coding-agent/test/test-theme-colors.ts +246 -0
  968. package/.references/pi/packages/coding-agent/test/theme-detection.test.ts +133 -0
  969. package/.references/pi/packages/coding-agent/test/theme-export.test.ts +104 -0
  970. package/.references/pi/packages/coding-agent/test/theme-picker.test.ts +51 -0
  971. package/.references/pi/packages/coding-agent/test/tool-execution-component.test.ts +529 -0
  972. package/.references/pi/packages/coding-agent/test/tools.test.ts +1213 -0
  973. package/.references/pi/packages/coding-agent/test/tree-selector.test.ts +702 -0
  974. package/.references/pi/packages/coding-agent/test/trigger-compact-extension.test.ts +59 -0
  975. package/.references/pi/packages/coding-agent/test/truncate-to-width.test.ts +81 -0
  976. package/.references/pi/packages/coding-agent/test/trust-manager.test.ts +67 -0
  977. package/.references/pi/packages/coding-agent/test/trust-selector.test.ts +87 -0
  978. package/.references/pi/packages/coding-agent/test/user-message.test.ts +25 -0
  979. package/.references/pi/packages/coding-agent/test/utilities.ts +318 -0
  980. package/.references/pi/packages/coding-agent/test/version-check.test.ts +91 -0
  981. package/.references/pi/packages/coding-agent/tsconfig.build.json +17 -0
  982. package/.references/pi/packages/coding-agent/tsconfig.examples.json +16 -0
  983. package/.references/pi/packages/coding-agent/vitest.config.ts +38 -0
  984. package/.references/pi/packages/orchestrator/CHANGELOG.md +19 -0
  985. package/.references/pi/packages/orchestrator/README.md +11 -0
  986. package/.references/pi/packages/orchestrator/package.json +45 -0
  987. package/.references/pi/packages/orchestrator/src/cli.ts +161 -0
  988. package/.references/pi/packages/orchestrator/src/config.ts +69 -0
  989. package/.references/pi/packages/orchestrator/src/handler.ts +161 -0
  990. package/.references/pi/packages/orchestrator/src/index.ts +10 -0
  991. package/.references/pi/packages/orchestrator/src/ipc/client.ts +63 -0
  992. package/.references/pi/packages/orchestrator/src/ipc/protocol.ts +142 -0
  993. package/.references/pi/packages/orchestrator/src/ipc/server.ts +209 -0
  994. package/.references/pi/packages/orchestrator/src/radius.ts +440 -0
  995. package/.references/pi/packages/orchestrator/src/rpc-process.ts +201 -0
  996. package/.references/pi/packages/orchestrator/src/serve.ts +77 -0
  997. package/.references/pi/packages/orchestrator/src/storage.ts +70 -0
  998. package/.references/pi/packages/orchestrator/src/supervisor.ts +354 -0
  999. package/.references/pi/packages/orchestrator/src/types.ts +25 -0
  1000. package/.references/pi/packages/orchestrator/tsconfig.build.json +9 -0
  1001. package/.references/pi/packages/tui/CHANGELOG.md +1005 -0
  1002. package/.references/pi/packages/tui/README.md +791 -0
  1003. package/.references/pi/packages/tui/native/darwin/prebuilds/darwin-arm64/darwin-modifiers.node +0 -0
  1004. package/.references/pi/packages/tui/native/darwin/prebuilds/darwin-x64/darwin-modifiers.node +0 -0
  1005. package/.references/pi/packages/tui/native/darwin/src/darwin-modifiers.c +70 -0
  1006. package/.references/pi/packages/tui/native/win32/prebuilds/win32-arm64/win32-console-mode.node +0 -0
  1007. package/.references/pi/packages/tui/native/win32/prebuilds/win32-x64/win32-console-mode.node +0 -0
  1008. package/.references/pi/packages/tui/native/win32/src/win32-console-mode.c +53 -0
  1009. package/.references/pi/packages/tui/package.json +47 -0
  1010. package/.references/pi/packages/tui/src/autocomplete.ts +786 -0
  1011. package/.references/pi/packages/tui/src/components/box.ts +137 -0
  1012. package/.references/pi/packages/tui/src/components/cancellable-loader.ts +40 -0
  1013. package/.references/pi/packages/tui/src/components/editor.ts +2333 -0
  1014. package/.references/pi/packages/tui/src/components/image.ts +126 -0
  1015. package/.references/pi/packages/tui/src/components/input.ts +447 -0
  1016. package/.references/pi/packages/tui/src/components/loader.ts +92 -0
  1017. package/.references/pi/packages/tui/src/components/markdown.ts +858 -0
  1018. package/.references/pi/packages/tui/src/components/select-list.ts +229 -0
  1019. package/.references/pi/packages/tui/src/components/settings-list.ts +250 -0
  1020. package/.references/pi/packages/tui/src/components/spacer.ts +28 -0
  1021. package/.references/pi/packages/tui/src/components/text.ts +106 -0
  1022. package/.references/pi/packages/tui/src/components/truncated-text.ts +65 -0
  1023. package/.references/pi/packages/tui/src/editor-component.ts +74 -0
  1024. package/.references/pi/packages/tui/src/fuzzy.ts +137 -0
  1025. package/.references/pi/packages/tui/src/index.ts +114 -0
  1026. package/.references/pi/packages/tui/src/keybindings.ts +244 -0
  1027. package/.references/pi/packages/tui/src/keys.ts +1401 -0
  1028. package/.references/pi/packages/tui/src/kill-ring.ts +46 -0
  1029. package/.references/pi/packages/tui/src/native-modifiers.ts +59 -0
  1030. package/.references/pi/packages/tui/src/stdin-buffer.ts +434 -0
  1031. package/.references/pi/packages/tui/src/terminal-colors.ts +73 -0
  1032. package/.references/pi/packages/tui/src/terminal-image.ts +488 -0
  1033. package/.references/pi/packages/tui/src/terminal.ts +531 -0
  1034. package/.references/pi/packages/tui/src/tui.ts +1714 -0
  1035. package/.references/pi/packages/tui/src/undo-stack.ts +28 -0
  1036. package/.references/pi/packages/tui/src/utils.ts +1209 -0
  1037. package/.references/pi/packages/tui/src/word-navigation.ts +117 -0
  1038. package/.references/pi/packages/tui/test/autocomplete.test.ts +542 -0
  1039. package/.references/pi/packages/tui/test/bug-regression-isimageline-startswith-bug.test.ts +237 -0
  1040. package/.references/pi/packages/tui/test/chat-simple.ts +129 -0
  1041. package/.references/pi/packages/tui/test/editor.test.ts +4051 -0
  1042. package/.references/pi/packages/tui/test/fuzzy.test.ts +112 -0
  1043. package/.references/pi/packages/tui/test/image-test.ts +56 -0
  1044. package/.references/pi/packages/tui/test/input.test.ts +647 -0
  1045. package/.references/pi/packages/tui/test/key-tester.ts +123 -0
  1046. package/.references/pi/packages/tui/test/keybindings.test.ts +46 -0
  1047. package/.references/pi/packages/tui/test/keys.test.ts +622 -0
  1048. package/.references/pi/packages/tui/test/markdown.test.ts +1442 -0
  1049. package/.references/pi/packages/tui/test/overlay-non-capturing.test.ts +1202 -0
  1050. package/.references/pi/packages/tui/test/overlay-options.test.ts +541 -0
  1051. package/.references/pi/packages/tui/test/overlay-short-content.test.ts +61 -0
  1052. package/.references/pi/packages/tui/test/regression-overlay-cjk-boundary.test.ts +68 -0
  1053. package/.references/pi/packages/tui/test/regression-regional-indicator-width.test.ts +52 -0
  1054. package/.references/pi/packages/tui/test/select-list.test.ts +116 -0
  1055. package/.references/pi/packages/tui/test/stdin-buffer.test.ts +458 -0
  1056. package/.references/pi/packages/tui/test/tab-width.test.ts +87 -0
  1057. package/.references/pi/packages/tui/test/terminal-colors.test.ts +249 -0
  1058. package/.references/pi/packages/tui/test/terminal-image.test.ts +492 -0
  1059. package/.references/pi/packages/tui/test/terminal.test.ts +233 -0
  1060. package/.references/pi/packages/tui/test/test-themes.ts +38 -0
  1061. package/.references/pi/packages/tui/test/truncate-to-width.test.ts +76 -0
  1062. package/.references/pi/packages/tui/test/truncated-text.test.ts +129 -0
  1063. package/.references/pi/packages/tui/test/tui-cell-size-input.test.ts +81 -0
  1064. package/.references/pi/packages/tui/test/tui-overlay-style-leak.test.ts +80 -0
  1065. package/.references/pi/packages/tui/test/tui-render.test.ts +767 -0
  1066. package/.references/pi/packages/tui/test/tui-shrink.test.ts +44 -0
  1067. package/.references/pi/packages/tui/test/viewport-overwrite-repro.ts +106 -0
  1068. package/.references/pi/packages/tui/test/virtual-terminal.ts +218 -0
  1069. package/.references/pi/packages/tui/test/word-navigation.test.ts +191 -0
  1070. package/.references/pi/packages/tui/test/wrap-ansi.test.ts +266 -0
  1071. package/.references/pi/packages/tui/tsconfig.build.json +9 -0
  1072. package/.references/pi/packages/tui/vitest.config.ts +7 -0
  1073. package/.references/pi/pi-test.bat +14 -0
  1074. package/.references/pi/pi-test.ps1 +71 -0
  1075. package/.references/pi/pi-test.sh +57 -0
  1076. package/.references/pi/scripts/browser-smoke-entry.ts +61 -0
  1077. package/.references/pi/scripts/build-binaries.sh +245 -0
  1078. package/.references/pi/scripts/check-browser-smoke.mjs +36 -0
  1079. package/.references/pi/scripts/check-lockfile-commit.mjs +120 -0
  1080. package/.references/pi/scripts/check-pinned-deps.mjs +63 -0
  1081. package/.references/pi/scripts/check-ts-relative-imports.mjs +74 -0
  1082. package/.references/pi/scripts/cost.ts +183 -0
  1083. package/.references/pi/scripts/edit-tool-stats.mjs +834 -0
  1084. package/.references/pi/scripts/generate-coding-agent-install-lock.mjs +439 -0
  1085. package/.references/pi/scripts/generate-coding-agent-shrinkwrap.mjs +365 -0
  1086. package/.references/pi/scripts/local-release.mjs +284 -0
  1087. package/.references/pi/scripts/profile-coding-agent-node.mjs +639 -0
  1088. package/.references/pi/scripts/publish-model-catalog.mjs +295 -0
  1089. package/.references/pi/scripts/publish.mjs +125 -0
  1090. package/.references/pi/scripts/read-tool-stats.mjs +505 -0
  1091. package/.references/pi/scripts/release-notes.mjs +364 -0
  1092. package/.references/pi/scripts/release.mjs +207 -0
  1093. package/.references/pi/scripts/repro-5893-wsl-bash.mjs +55 -0
  1094. package/.references/pi/scripts/session-context-stats.mjs +405 -0
  1095. package/.references/pi/scripts/session-transcripts.ts +406 -0
  1096. package/.references/pi/scripts/stats.ts +233 -0
  1097. package/.references/pi/scripts/sync-versions.js +96 -0
  1098. package/.references/pi/scripts/tool-stats.ts +232 -0
  1099. package/.references/pi/scripts/update-source-imports-to-ts.sh +10 -0
  1100. package/.references/pi/test.sh +81 -0
  1101. package/.references/pi/tsconfig.base.json +25 -0
  1102. package/.references/pi/tsconfig.json +27 -0
  1103. package/AGENTS.md +8 -0
  1104. package/Cargo.lock +5169 -0
  1105. package/Cargo.toml +39 -0
  1106. package/LICENSE +21 -0
  1107. package/README.md +43 -0
  1108. package/aliases/pi-rusty/Cargo.toml +19 -0
  1109. package/aliases/pi-rusty/LICENSE +21 -0
  1110. package/aliases/pi-rusty/README.md +10 -0
  1111. package/aliases/pi-rusty/src/main.rs +8 -0
  1112. package/bun.lock +687 -0
  1113. package/crates/pi/Cargo.toml +66 -0
  1114. package/crates/pi/LICENSE +21 -0
  1115. package/crates/pi/assets/export-html/template.css +1066 -0
  1116. package/crates/pi/assets/export-html/template.html +55 -0
  1117. package/crates/pi/assets/export-html/template.js +1864 -0
  1118. package/crates/pi/assets/export-html/vendor/dark.json +29 -0
  1119. package/crates/pi/assets/export-html/vendor/highlight.min.js +1213 -0
  1120. package/crates/pi/assets/export-html/vendor/light.json +6 -0
  1121. package/crates/pi/assets/export-html/vendor/marked.min.js +78 -0
  1122. package/crates/pi/src/cli/args.rs +889 -0
  1123. package/crates/pi/src/cli/bootstrap.rs +2134 -0
  1124. package/crates/pi/src/cli/entry.rs +1332 -0
  1125. package/crates/pi/src/cli/help.rs +326 -0
  1126. package/crates/pi/src/cli/mod.rs +22 -0
  1127. package/crates/pi/src/cli/package_manager_cli.rs +1515 -0
  1128. package/crates/pi/src/core/agent_session/bash.rs +453 -0
  1129. package/crates/pi/src/core/agent_session/compaction.rs +1804 -0
  1130. package/crates/pi/src/core/agent_session/events.rs +621 -0
  1131. package/crates/pi/src/core/agent_session/extension.rs +2146 -0
  1132. package/crates/pi/src/core/agent_session/extension_runner.rs +471 -0
  1133. package/crates/pi/src/core/agent_session/mod.rs +1768 -0
  1134. package/crates/pi/src/core/agent_session/model.rs +775 -0
  1135. package/crates/pi/src/core/agent_session/persistence.rs +265 -0
  1136. package/crates/pi/src/core/agent_session/prompt.rs +2289 -0
  1137. package/crates/pi/src/core/agent_session/retry.rs +448 -0
  1138. package/crates/pi/src/core/agent_session/stats.rs +302 -0
  1139. package/crates/pi/src/core/agent_session/subscribe.rs +450 -0
  1140. package/crates/pi/src/core/agent_session/tools.rs +515 -0
  1141. package/crates/pi/src/core/agent_session/tree.rs +1219 -0
  1142. package/crates/pi/src/core/agent_session_runtime.rs +1612 -0
  1143. package/crates/pi/src/core/agent_session_services.rs +1613 -0
  1144. package/crates/pi/src/core/compaction/branch.rs +767 -0
  1145. package/crates/pi/src/core/compaction/mod.rs +1955 -0
  1146. package/crates/pi/src/core/compaction/utils.rs +357 -0
  1147. package/crates/pi/src/core/config.rs +1102 -0
  1148. package/crates/pi/src/core/config_value.rs +179 -0
  1149. package/crates/pi/src/core/experimental.rs +29 -0
  1150. package/crates/pi/src/core/export_html/ansi_to_html.rs +279 -0
  1151. package/crates/pi/src/core/export_html/mod.rs +787 -0
  1152. package/crates/pi/src/core/export_html/session_data.rs +149 -0
  1153. package/crates/pi/src/core/extension_host/acquire/tests.rs +579 -0
  1154. package/crates/pi/src/core/extension_host/acquire.rs +431 -0
  1155. package/crates/pi/src/core/extension_host/tests.rs +2353 -0
  1156. package/crates/pi/src/core/extension_host.rs +2541 -0
  1157. package/crates/pi/src/core/lockfile.rs +913 -0
  1158. package/crates/pi/src/core/messages.rs +706 -0
  1159. package/crates/pi/src/core/migrations.rs +828 -0
  1160. package/crates/pi/src/core/mod.rs +28 -0
  1161. package/crates/pi/src/core/model_resolver.rs +1473 -0
  1162. package/crates/pi/src/core/model_runtime.rs +2720 -0
  1163. package/crates/pi/src/core/output_guard.rs +977 -0
  1164. package/crates/pi/src/core/package_manager/tests.rs +1304 -0
  1165. package/crates/pi/src/core/package_manager.rs +2015 -0
  1166. package/crates/pi/src/core/platform/clipboard.rs +702 -0
  1167. package/crates/pi/src/core/platform/command.rs +223 -0
  1168. package/crates/pi/src/core/platform/debug_dump.rs +274 -0
  1169. package/crates/pi/src/core/platform/external_editor.rs +294 -0
  1170. package/crates/pi/src/core/platform/first_run.rs +120 -0
  1171. package/crates/pi/src/core/platform/image.rs +237 -0
  1172. package/crates/pi/src/core/platform/mod.rs +27 -0
  1173. package/crates/pi/src/core/platform/open_browser.rs +187 -0
  1174. package/crates/pi/src/core/platform/release_packaging.rs +785 -0
  1175. package/crates/pi/src/core/resources/diagnostics.rs +148 -0
  1176. package/crates/pi/src/core/resources/discovery.rs +2570 -0
  1177. package/crates/pi/src/core/resources/frontmatter.rs +205 -0
  1178. package/crates/pi/src/core/resources/mod.rs +1402 -0
  1179. package/crates/pi/src/core/resources/prompts.rs +510 -0
  1180. package/crates/pi/src/core/resources/skills.rs +981 -0
  1181. package/crates/pi/src/core/resources/slash.rs +199 -0
  1182. package/crates/pi/src/core/resources/source_info.rs +141 -0
  1183. package/crates/pi/src/core/resources/themes.rs +297 -0
  1184. package/crates/pi/src/core/session_transfer.rs +390 -0
  1185. package/crates/pi/src/core/sessions/context.rs +657 -0
  1186. package/crates/pi/src/core/sessions/cwd.rs +176 -0
  1187. package/crates/pi/src/core/sessions/entries.rs +1364 -0
  1188. package/crates/pi/src/core/sessions/list.rs +610 -0
  1189. package/crates/pi/src/core/sessions/mod.rs +2117 -0
  1190. package/crates/pi/src/core/settings.rs +3794 -0
  1191. package/crates/pi/src/core/share.rs +577 -0
  1192. package/crates/pi/src/core/system_prompt.rs +654 -0
  1193. package/crates/pi/src/core/tools/bash.rs +1574 -0
  1194. package/crates/pi/src/core/tools/edit.rs +919 -0
  1195. package/crates/pi/src/core/tools/edit_diff.rs +1150 -0
  1196. package/crates/pi/src/core/tools/find.rs +652 -0
  1197. package/crates/pi/src/core/tools/grep.rs +965 -0
  1198. package/crates/pi/src/core/tools/ls.rs +545 -0
  1199. package/crates/pi/src/core/tools/mod.rs +312 -0
  1200. package/crates/pi/src/core/tools/mutation_queue.rs +392 -0
  1201. package/crates/pi/src/core/tools/output_accumulator.rs +689 -0
  1202. package/crates/pi/src/core/tools/path_utils.rs +517 -0
  1203. package/crates/pi/src/core/tools/read.rs +1413 -0
  1204. package/crates/pi/src/core/tools/truncate.rs +644 -0
  1205. package/crates/pi/src/core/tools/write.rs +524 -0
  1206. package/crates/pi/src/core/trust.rs +1414 -0
  1207. package/crates/pi/src/core/update/changelog.rs +583 -0
  1208. package/crates/pi/src/core/update/deprecation.rs +148 -0
  1209. package/crates/pi/src/core/update/mod.rs +8 -0
  1210. package/crates/pi/src/core/update/self_update.rs +1327 -0
  1211. package/crates/pi/src/core/update/user_agent.rs +59 -0
  1212. package/crates/pi/src/core/update/version_check.rs +511 -0
  1213. package/crates/pi/src/core/update/windows_quarantine.rs +262 -0
  1214. package/crates/pi/src/lib.rs +23 -0
  1215. package/crates/pi/src/main.rs +13 -0
  1216. package/crates/pi/src/modes/interactive/footer.rs +260 -0
  1217. package/crates/pi/src/modes/interactive/header.rs +83 -0
  1218. package/crates/pi/src/modes/interactive/input.rs +923 -0
  1219. package/crates/pi/src/modes/interactive/messages.rs +640 -0
  1220. package/crates/pi/src/modes/interactive/mod.rs +51 -0
  1221. package/crates/pi/src/modes/interactive/progress.rs +181 -0
  1222. package/crates/pi/src/modes/interactive/runtime.rs +7227 -0
  1223. package/crates/pi/src/modes/interactive/selectors.rs +146 -0
  1224. package/crates/pi/src/modes/interactive/snapshots/pi__modes__interactive__tests__bash_state_widths.snap +138 -0
  1225. package/crates/pi/src/modes/interactive/snapshots/pi__modes__interactive__tests__compact_state_widths.snap +137 -0
  1226. package/crates/pi/src/modes/interactive/snapshots/pi__modes__interactive__tests__custom_branch_skill_messages.snap +145 -0
  1227. package/crates/pi/src/modes/interactive/snapshots/pi__modes__interactive__tests__empty_state_widths.snap +136 -0
  1228. package/crates/pi/src/modes/interactive/snapshots/pi__modes__interactive__tests__error_state_widths.snap +139 -0
  1229. package/crates/pi/src/modes/interactive/snapshots/pi__modes__interactive__tests__loading_state_widths.snap +136 -0
  1230. package/crates/pi/src/modes/interactive/snapshots/pi__modes__interactive__tests__queue_state_widths.snap +139 -0
  1231. package/crates/pi/src/modes/interactive/snapshots/pi__modes__interactive__tests__retry_state_widths.snap +136 -0
  1232. package/crates/pi/src/modes/interactive/snapshots/pi__modes__interactive__tests__streaming_state_widths.snap +137 -0
  1233. package/crates/pi/src/modes/interactive/snapshots/pi__modes__interactive__tests__user_assistant_messages.snap +145 -0
  1234. package/crates/pi/src/modes/interactive/startup.rs +194 -0
  1235. package/crates/pi/src/modes/interactive/state.rs +759 -0
  1236. package/crates/pi/src/modes/interactive/status.rs +70 -0
  1237. package/crates/pi/src/modes/interactive/tests.rs +945 -0
  1238. package/crates/pi/src/modes/interactive/theme.rs +1402 -0
  1239. package/crates/pi/src/modes/interactive/tool_renderer.rs +152 -0
  1240. package/crates/pi/src/modes/interactive/view.rs +511 -0
  1241. package/crates/pi/src/modes/mod.rs +6 -0
  1242. package/crates/pi/src/modes/print/input.rs +415 -0
  1243. package/crates/pi/src/modes/print/json.rs +195 -0
  1244. package/crates/pi/src/modes/print/mod.rs +403 -0
  1245. package/crates/pi/src/modes/print/text.rs +412 -0
  1246. package/crates/pi/src/modes/rpc/extension_ui.rs +361 -0
  1247. package/crates/pi/src/modes/rpc/jsonl.rs +429 -0
  1248. package/crates/pi/src/modes/rpc/mod.rs +19 -0
  1249. package/crates/pi/src/modes/rpc/mode_host.rs +466 -0
  1250. package/crates/pi/src/modes/rpc/server.rs +3037 -0
  1251. package/crates/pi/src/modes/rpc/types.rs +2999 -0
  1252. package/crates/pi/src/modes/run.rs +636 -0
  1253. package/crates/pi/tests/fixtures/fake_extension_host.rs +104 -0
  1254. package/crates/pi/tests/fixtures/tool-schemas/bash.json +16 -0
  1255. package/crates/pi/tests/fixtures/tool-schemas/edit.json +34 -0
  1256. package/crates/pi/tests/fixtures/tool-schemas/find.json +20 -0
  1257. package/crates/pi/tests/fixtures/tool-schemas/grep.json +36 -0
  1258. package/crates/pi/tests/fixtures/tool-schemas/ls.json +13 -0
  1259. package/crates/pi/tests/fixtures/tool-schemas/read.json +20 -0
  1260. package/crates/pi/tests/fixtures/tool-schemas/write.json +17 -0
  1261. package/crates/pi-agent/Cargo.toml +30 -0
  1262. package/crates/pi-agent/LICENSE +21 -0
  1263. package/crates/pi-agent/src/agent.rs +1780 -0
  1264. package/crates/pi-agent/src/bus.rs +770 -0
  1265. package/crates/pi-agent/src/config.rs +445 -0
  1266. package/crates/pi-agent/src/drain.rs +941 -0
  1267. package/crates/pi-agent/src/error.rs +61 -0
  1268. package/crates/pi-agent/src/event.rs +270 -0
  1269. package/crates/pi-agent/src/lib.rs +49 -0
  1270. package/crates/pi-agent/src/message.rs +296 -0
  1271. package/crates/pi-agent/src/queue.rs +222 -0
  1272. package/crates/pi-agent/src/run.rs +1870 -0
  1273. package/crates/pi-agent/src/schedule.rs +2153 -0
  1274. package/crates/pi-agent/src/state.rs +377 -0
  1275. package/crates/pi-agent/src/tool.rs +496 -0
  1276. package/crates/pi-ai/Cargo.toml +45 -0
  1277. package/crates/pi-ai/LICENSE +21 -0
  1278. package/crates/pi-ai/data/builtin-models.json +25193 -0
  1279. package/crates/pi-ai/src/auth/config_value.rs +598 -0
  1280. package/crates/pi-ai/src/auth/context.rs +215 -0
  1281. package/crates/pi-ai/src/auth/credential_store.rs +318 -0
  1282. package/crates/pi-ai/src/auth/env_keys.rs +647 -0
  1283. package/crates/pi-ai/src/auth/error.rs +194 -0
  1284. package/crates/pi-ai/src/auth/file_store.rs +1179 -0
  1285. package/crates/pi-ai/src/auth/http.rs +526 -0
  1286. package/crates/pi-ai/src/auth/mod.rs +29 -0
  1287. package/crates/pi-ai/src/auth/oauth/anthropic.rs +1482 -0
  1288. package/crates/pi-ai/src/auth/oauth/callback_server.rs +584 -0
  1289. package/crates/pi-ai/src/auth/oauth/device_code.rs +573 -0
  1290. package/crates/pi-ai/src/auth/oauth/github_copilot.rs +1527 -0
  1291. package/crates/pi-ai/src/auth/oauth/mod.rs +26 -0
  1292. package/crates/pi-ai/src/auth/oauth/openai_codex.rs +2005 -0
  1293. package/crates/pi-ai/src/auth/oauth/page.rs +159 -0
  1294. package/crates/pi-ai/src/auth/oauth/pkce.rs +145 -0
  1295. package/crates/pi-ai/src/auth/oauth/radius.rs +1685 -0
  1296. package/crates/pi-ai/src/auth/oauth/xai.rs +989 -0
  1297. package/crates/pi-ai/src/auth/resolve.rs +701 -0
  1298. package/crates/pi-ai/src/auth/runtime_credentials.rs +226 -0
  1299. package/crates/pi-ai/src/auth/types.rs +534 -0
  1300. package/crates/pi-ai/src/catalog/merge.rs +316 -0
  1301. package/crates/pi-ai/src/catalog/mod.rs +485 -0
  1302. package/crates/pi-ai/src/lib.rs +13 -0
  1303. package/crates/pi-ai/src/models_store.rs +974 -0
  1304. package/crates/pi-ai/src/provider.rs +285 -0
  1305. package/crates/pi-ai/src/providers/anthropic_messages.rs +1473 -0
  1306. package/crates/pi-ai/src/providers/azure_openai_responses.rs +559 -0
  1307. package/crates/pi-ai/src/providers/bedrock_converse_stream.rs +2430 -0
  1308. package/crates/pi-ai/src/providers/google_generative_ai.rs +622 -0
  1309. package/crates/pi-ai/src/providers/google_vertex.rs +1565 -0
  1310. package/crates/pi-ai/src/providers/mistral_conversations.rs +1245 -0
  1311. package/crates/pi-ai/src/providers/mod.rs +35 -0
  1312. package/crates/pi-ai/src/providers/openai_codex_responses.rs +2003 -0
  1313. package/crates/pi-ai/src/providers/openai_completions.rs +1873 -0
  1314. package/crates/pi-ai/src/providers/openai_responses.rs +757 -0
  1315. package/crates/pi-ai/src/providers/pi_messages.rs +1235 -0
  1316. package/crates/pi-ai/src/providers/registry.rs +923 -0
  1317. package/crates/pi-ai/src/providers/shared/google.rs +1193 -0
  1318. package/crates/pi-ai/src/providers/shared/responses.rs +1873 -0
  1319. package/crates/pi-ai/src/providers/shared.rs +671 -0
  1320. package/crates/pi-ai/src/providers/stream_state.rs +683 -0
  1321. package/crates/pi-ai/src/providers/transport.rs +488 -0
  1322. package/crates/pi-ai/src/text.rs +322 -0
  1323. package/crates/pi-ai/src/types.rs +1050 -0
  1324. package/crates/pi-ai/tests/conformance_anthropic_mistral.rs +664 -0
  1325. package/crates/pi-ai/tests/conformance_bedrock_pi_messages.rs +908 -0
  1326. package/crates/pi-ai/tests/conformance_codex.rs +815 -0
  1327. package/crates/pi-ai/tests/conformance_google.rs +743 -0
  1328. package/crates/pi-ai/tests/conformance_openai.rs +607 -0
  1329. package/crates/pi-ai/tests/fixtures/provenance/anthropic-sse-parsing.test.ts +275 -0
  1330. package/crates/pi-ai/tests/fixtures/provenance/mistral-reasoning-mode.test.ts +97 -0
  1331. package/crates/pi-ai/tests/fixtures/provenance/upstream/src/api/anthropic-messages.ts +1313 -0
  1332. package/crates/pi-ai/tests/fixtures/provenance/upstream/src/api/bedrock-converse-stream.ts +1091 -0
  1333. package/crates/pi-ai/tests/fixtures/provenance/upstream/src/api/google-generative-ai.ts +509 -0
  1334. package/crates/pi-ai/tests/fixtures/provenance/upstream/src/api/google-shared.ts +350 -0
  1335. package/crates/pi-ai/tests/fixtures/provenance/upstream/src/api/mistral-conversations.ts +664 -0
  1336. package/crates/pi-ai/tests/fixtures/provenance/upstream/src/api/openai-completions.ts +1355 -0
  1337. package/crates/pi-ai/tests/fixtures/provenance/upstream/src/api/openai-responses-shared.ts +613 -0
  1338. package/crates/pi-ai/tests/fixtures/provenance/upstream/src/api/openai-responses.ts +318 -0
  1339. package/crates/pi-ai/tests/fixtures/provenance/upstream/test/abort.test.ts +303 -0
  1340. package/crates/pi-ai/tests/fixtures/provenance/upstream/test/azure-openai-base-url.test.ts +175 -0
  1341. package/crates/pi-ai/tests/fixtures/provenance/upstream/test/bedrock-endpoint-resolution.test.ts +208 -0
  1342. package/crates/pi-ai/tests/fixtures/provenance/upstream/test/bedrock-thinking-payload.test.ts +246 -0
  1343. package/crates/pi-ai/tests/fixtures/provenance/upstream/test/google-vertex-api-key-resolution.test.ts +223 -0
  1344. package/crates/pi-ai/tests/fixtures/provenance/upstream/test/openai-codex-stream.test.ts +2028 -0
  1345. package/crates/pi-ai/tests/fixtures/provenance/upstream/test/openai-completions-prompt-cache.test.ts +264 -0
  1346. package/crates/pi-ai/tests/fixtures/provenance/upstream/test/openai-completions-retry.test.ts +86 -0
  1347. package/crates/pi-ai/tests/fixtures/provenance/upstream/test/openai-completions-thinking-as-text.test.ts +218 -0
  1348. package/crates/pi-ai/tests/fixtures/provenance/upstream/test/openai-completions-tool-choice.test.ts +1716 -0
  1349. package/crates/pi-ai/tests/fixtures/provenance/upstream/test/openai-responses-partial-json-cleanup.test.ts +106 -0
  1350. package/crates/pi-ai/tests/fixtures/provenance/upstream/test/openai-responses-terminal-event.test.ts +233 -0
  1351. package/crates/pi-ai/tests/fixtures/provenance/upstream/test/pi-messages.test.ts +243 -0
  1352. package/crates/pi-ai/tests/fixtures/provenance/upstream/test/provider-error-body-passthrough.test.ts +78 -0
  1353. package/crates/pi-ai/tests/fixtures/providers/anthropic-messages/cases.jsonl +4 -0
  1354. package/crates/pi-ai/tests/fixtures/providers/azure-openai-responses/cases.jsonl +2 -0
  1355. package/crates/pi-ai/tests/fixtures/providers/bedrock-converse-stream/cases.jsonl +8 -0
  1356. package/crates/pi-ai/tests/fixtures/providers/google-generative-ai/cases.jsonl +6 -0
  1357. package/crates/pi-ai/tests/fixtures/providers/google-vertex/cases.jsonl +6 -0
  1358. package/crates/pi-ai/tests/fixtures/providers/mistral-conversations/cases.jsonl +4 -0
  1359. package/crates/pi-ai/tests/fixtures/providers/openai-codex-responses/cases.jsonl +7 -0
  1360. package/crates/pi-ai/tests/fixtures/providers/openai-completions/cases.jsonl +9 -0
  1361. package/crates/pi-ai/tests/fixtures/providers/openai-responses/cases.jsonl +5 -0
  1362. package/crates/pi-ai/tests/fixtures/providers/pi-messages/cases.jsonl +8 -0
  1363. package/crates/pi-ai/tests/provider_registry_contract.rs +85 -0
  1364. package/crates/pi-ai/tests/support/golden.rs +191 -0
  1365. package/crates/pi-ai/tests/support/http.rs +525 -0
  1366. package/crates/pi-ai/tests/support/mod.rs +4 -0
  1367. package/crates/pi-ext/Cargo.toml +34 -0
  1368. package/crates/pi-ext/LICENSE +21 -0
  1369. package/crates/pi-ext/src/adapters.rs +1915 -0
  1370. package/crates/pi-ext/src/client.rs +1883 -0
  1371. package/crates/pi-ext/src/host.rs +318 -0
  1372. package/crates/pi-ext/src/lib.rs +10 -0
  1373. package/crates/pi-ext/src/protocol.rs +1880 -0
  1374. package/crates/pi-ext/src/sanitize.rs +524 -0
  1375. package/crates/pi-ext/src/test_support.rs +93 -0
  1376. package/crates/pi-ext/tests/fixtures/fake_jsonl_host.rs +35 -0
  1377. package/crates/pi-ext/tests/fixtures/protocol/frames.jsonl +30 -0
  1378. package/crates/pi-ext/tests/scaling.rs +530 -0
  1379. package/crates/pi-tui/Cargo.toml +56 -0
  1380. package/crates/pi-tui/LICENSE +21 -0
  1381. package/crates/pi-tui/src/bin/pi_tui_pty_fixture.rs +722 -0
  1382. package/crates/pi-tui/src/component.rs +101 -0
  1383. package/crates/pi-tui/src/components/editor/mod.rs +2626 -0
  1384. package/crates/pi-tui/src/components/editor/paste.rs +406 -0
  1385. package/crates/pi-tui/src/components/editor/state.rs +240 -0
  1386. package/crates/pi-tui/src/components/image.rs +352 -0
  1387. package/crates/pi-tui/src/components/input.rs +742 -0
  1388. package/crates/pi-tui/src/components/loader.rs +364 -0
  1389. package/crates/pi-tui/src/components/markdown.rs +1154 -0
  1390. package/crates/pi-tui/src/components/mod.rs +30 -0
  1391. package/crates/pi-tui/src/components/padded.rs +212 -0
  1392. package/crates/pi-tui/src/components/select_list.rs +464 -0
  1393. package/crates/pi-tui/src/components/settings_list.rs +597 -0
  1394. package/crates/pi-tui/src/components/spacer.rs +67 -0
  1395. package/crates/pi-tui/src/components/text.rs +225 -0
  1396. package/crates/pi-tui/src/components/truncated_text.rs +137 -0
  1397. package/crates/pi-tui/src/components/util.rs +324 -0
  1398. package/crates/pi-tui/src/editor_support/autocomplete.rs +1039 -0
  1399. package/crates/pi-tui/src/editor_support/history.rs +248 -0
  1400. package/crates/pi-tui/src/editor_support/kill_ring.rs +139 -0
  1401. package/crates/pi-tui/src/editor_support/mod.rs +29 -0
  1402. package/crates/pi-tui/src/editor_support/undo.rs +73 -0
  1403. package/crates/pi-tui/src/editor_support/word_nav.rs +412 -0
  1404. package/crates/pi-tui/src/editor_support/wrap.rs +317 -0
  1405. package/crates/pi-tui/src/focus.rs +564 -0
  1406. package/crates/pi-tui/src/frame.rs +163 -0
  1407. package/crates/pi-tui/src/fuzzy.rs +221 -0
  1408. package/crates/pi-tui/src/image.rs +749 -0
  1409. package/crates/pi-tui/src/keybindings.rs +602 -0
  1410. package/crates/pi-tui/src/keys.rs +1242 -0
  1411. package/crates/pi-tui/src/layout.rs +563 -0
  1412. package/crates/pi-tui/src/lib.rs +16 -0
  1413. package/crates/pi-tui/src/link.rs +408 -0
  1414. package/crates/pi-tui/src/overlay.rs +895 -0
  1415. package/crates/pi-tui/src/terminal/backend.rs +348 -0
  1416. package/crates/pi-tui/src/terminal/caps.rs +237 -0
  1417. package/crates/pi-tui/src/terminal/guard.rs +476 -0
  1418. package/crates/pi-tui/src/terminal/input.rs +266 -0
  1419. package/crates/pi-tui/src/terminal/mod.rs +31 -0
  1420. package/crates/pi-tui/src/terminal/probe.rs +498 -0
  1421. package/crates/pi-tui/src/terminal/sink.rs +128 -0
  1422. package/crates/pi-tui/src/terminal/writer.rs +1541 -0
  1423. package/crates/pi-tui/src/text/ansi.rs +415 -0
  1424. package/crates/pi-tui/src/text/mod.rs +29 -0
  1425. package/crates/pi-tui/src/text/slice.rs +645 -0
  1426. package/crates/pi-tui/src/text/tests.rs +359 -0
  1427. package/crates/pi-tui/src/text/width.rs +311 -0
  1428. package/crates/pi-tui/src/text/wrap.rs +344 -0
  1429. package/crates/pi-tui/tests/pty_no_flicker.rs +929 -0
  1430. package/deny.toml +38 -0
  1431. package/npm-package/bin/pi.js +31 -0
  1432. package/npm-package/package.json +35 -0
  1433. package/npm-package/tests/archive.test.ts +139 -0
  1434. package/npm-package/tests/wrapper.test.ts +70 -0
  1435. package/package.json +34 -0
  1436. package/packages/extension-host/bun.lock +664 -0
  1437. package/packages/extension-host/fixtures/extensions/all-events.ts +55 -0
  1438. package/packages/extension-host/fixtures/extensions/control-compat-shadow.ts +14 -0
  1439. package/packages/extension-host/fixtures/extensions/control-compat.ts +35 -0
  1440. package/packages/extension-host/fixtures/extensions/crash.ts +36 -0
  1441. package/packages/extension-host/fixtures/extensions/hooks.ts +45 -0
  1442. package/packages/extension-host/fixtures/extensions/hostile.ts +39 -0
  1443. package/packages/extension-host/fixtures/extensions/idle.ts +9 -0
  1444. package/packages/extension-host/fixtures/extensions/provider-stream.ts +121 -0
  1445. package/packages/extension-host/fixtures/extensions/terminal-input-fast.ts +20 -0
  1446. package/packages/extension-host/fixtures/extensions/terminal-input-slow.ts +23 -0
  1447. package/packages/extension-host/fixtures/extensions/tool-progress.ts +72 -0
  1448. package/packages/extension-host/fixtures/extensions/tool.ts +71 -0
  1449. package/packages/extension-host/fixtures/extensions/virtual-imports.ts +87 -0
  1450. package/packages/extension-host/fixtures/extensions/widget-active.ts +16 -0
  1451. package/packages/extension-host/fixtures/photon-probe.ts +45 -0
  1452. package/packages/extension-host/fixtures/runtime-import.ts +54 -0
  1453. package/packages/extension-host/package.json +54 -0
  1454. package/packages/extension-host/src/host.ts +1651 -0
  1455. package/packages/extension-host/src/index.ts +21 -0
  1456. package/packages/extension-host/src/main.ts +51 -0
  1457. package/packages/extension-host/src/protocol.ts +10 -0
  1458. package/packages/extension-host/src/refs.d.ts +364 -0
  1459. package/packages/extension-host/src/sanitize.ts +503 -0
  1460. package/packages/extension-host/src/virtual-modules.ts +90 -0
  1461. package/packages/extension-host/tests/acceptance.test.ts +1498 -0
  1462. package/packages/extension-host/tests/host.test.ts +244 -0
  1463. package/packages/extension-host/tests/sanitize.test.ts +359 -0
  1464. package/packages/extension-host/tests/scaling.test.ts +661 -0
  1465. package/packages/extension-host/tests/virtual-modules.test.ts +122 -0
  1466. package/packages/extension-host/tsconfig.build.json +44 -0
  1467. package/packages/extension-host/tsconfig.check.json +29 -0
  1468. package/packages/extension-host/tsconfig.json +8 -0
  1469. package/packages/pi-tui-protocol/package.json +41 -0
  1470. package/packages/pi-tui-protocol/src/client.ts +341 -0
  1471. package/packages/pi-tui-protocol/src/codec.ts +439 -0
  1472. package/packages/pi-tui-protocol/src/index.ts +77 -0
  1473. package/packages/pi-tui-protocol/src/types.ts +358 -0
  1474. package/packages/pi-tui-protocol/tests/client.test.ts +175 -0
  1475. package/packages/pi-tui-protocol/tests/codec.test.ts +196 -0
  1476. package/packages/pi-tui-protocol/tests/fixtures/frames.jsonl +30 -0
  1477. package/packages/pi-tui-protocol/tsconfig.build.json +23 -0
  1478. package/packages/pi-tui-protocol/tsconfig.json +9 -0
  1479. package/rust-toolchain.toml +3 -0
  1480. package/rustfmt.toml +5 -0
  1481. package/scripts/bench-extension-scaling.ts +466 -0
  1482. package/scripts/build-extension-host.ts +51 -0
  1483. package/scripts/generate-builtin-models.ts +344 -0
  1484. package/scripts/generate-session-fixtures.ts +1758 -0
  1485. package/scripts/generate-tool-schemas.ts +444 -0
  1486. package/scripts/package-npm.ts +263 -0
  1487. package/scripts/package-release.ts +422 -0
  1488. package/scripts/release/archive.ts +594 -0
  1489. package/scripts/release/args.ts +187 -0
  1490. package/scripts/release/extract-host-asset.ts +224 -0
  1491. package/scripts/release/host.ts +825 -0
  1492. package/scripts/release/runner.ts +435 -0
  1493. package/scripts/release/runtime.ts +130 -0
  1494. package/scripts/release/stage.ts +437 -0
  1495. package/scripts/release/targets.ts +150 -0
  1496. package/scripts/tests/archive.test.ts +210 -0
  1497. package/scripts/tests/args.test.ts +180 -0
  1498. package/scripts/tests/cli-dry-run.test.ts +61 -0
  1499. package/scripts/tests/compat-authority.test.ts +79 -0
  1500. package/scripts/tests/compat-matrix.test.ts +389 -0
  1501. package/scripts/tests/extract-host-asset.test.ts +176 -0
  1502. package/scripts/tests/host.test.ts +443 -0
  1503. package/scripts/tests/npm-installed-smoke.test.ts +104 -0
  1504. package/scripts/tests/package-release.test.ts +516 -0
  1505. package/scripts/tests/repro-guards.test.ts +241 -0
  1506. package/scripts/tests/runner.test.ts +188 -0
  1507. package/scripts/tests/stage.test.ts +232 -0
  1508. package/scripts/tests/targets.test.ts +93 -0
  1509. package/scripts/tsconfig.json +47 -0
  1510. package/scripts/verification/compat-matrix.json +455 -0
  1511. package/scripts/verification/compat-matrix.ts +632 -0
  1512. package/scripts/verification/e2e-smoke.ts +1093 -0
  1513. package/scripts/verification/extension.ts +339 -0
  1514. package/scripts/verification/foundation.test.ts +339 -0
  1515. package/scripts/verification/npm-installed-smoke.ts +117 -0
  1516. package/scripts/verification/performance.ts +1425 -0
  1517. package/scripts/verification/pty.ts +332 -0
@@ -0,0 +1,1632 @@
1
+ import { type ChildProcess, execSync, spawn } from "child_process";
2
+ import { readFileSync } from "fs";
3
+ import { dirname, join } from "path";
4
+ import { Type } from "typebox";
5
+ import { fileURLToPath } from "url";
6
+ import { afterAll, beforeAll, describe, expect, it } from "vitest";
7
+ import { complete, getModel, stream } from "../src/compat.ts";
8
+ import type { Api, Context, ImageContent, Model, StreamOptions, Tool, ToolResultMessage } from "../src/types.ts";
9
+
10
+ type StreamOptionsWithExtras = StreamOptions & Record<string, unknown>;
11
+
12
+ import { StringEnum } from "../src/utils/typebox-helpers.ts";
13
+ import { hasAzureOpenAICredentials, resolveAzureDeploymentName } from "./azure-utils.ts";
14
+ import { hasBedrockCredentials } from "./bedrock-utils.ts";
15
+ import { hasCloudflareAiGatewayCredentials, hasCloudflareWorkersAICredentials } from "./cloudflare-utils.ts";
16
+ import { resolveApiKey } from "./oauth.ts";
17
+
18
+ const __filename = fileURLToPath(import.meta.url);
19
+ const __dirname = dirname(__filename);
20
+
21
+ // Resolve OAuth tokens at module level (async, runs before tests)
22
+ const oauthTokens = await Promise.all([
23
+ resolveApiKey("anthropic"),
24
+ resolveApiKey("github-copilot"),
25
+ resolveApiKey("openai-codex"),
26
+ ]);
27
+ const [anthropicOAuthToken, githubCopilotToken, openaiCodexToken] = oauthTokens;
28
+
29
+ // Calculator tool definition (same as examples)
30
+ // Note: Using StringEnum helper because Google's API doesn't support anyOf/const patterns
31
+ // that Type.Enum generates. Google requires { type: "string", enum: [...] } format.
32
+ const calculatorSchema = Type.Object({
33
+ a: Type.Number({ description: "First number" }),
34
+ b: Type.Number({ description: "Second number" }),
35
+ operation: StringEnum(["add", "subtract", "multiply", "divide"], {
36
+ description: "The operation to perform. One of 'add', 'subtract', 'multiply', 'divide'.",
37
+ }),
38
+ });
39
+
40
+ const calculatorTool: Tool<typeof calculatorSchema> = {
41
+ name: "math_operation",
42
+ description: "Perform basic arithmetic operations",
43
+ parameters: calculatorSchema,
44
+ };
45
+
46
+ async function basicTextGeneration<TApi extends Api>(model: Model<TApi>, options?: StreamOptionsWithExtras) {
47
+ const context: Context = {
48
+ systemPrompt: "You are a helpful assistant. Be concise.",
49
+ messages: [{ role: "user", content: "Reply with exactly: 'Hello test successful'", timestamp: Date.now() }],
50
+ };
51
+ const response = await complete(model, context, options);
52
+
53
+ expect(response.role).toBe("assistant");
54
+ expect(response.content).toBeTruthy();
55
+ expect(response.usage.input + response.usage.cacheRead).toBeGreaterThan(0);
56
+ expect(response.usage.output).toBeGreaterThan(0);
57
+ expect(response.errorMessage).toBeFalsy();
58
+ expect(response.content.map((b) => (b.type === "text" ? b.text : "")).join("")).toContain("Hello test successful");
59
+
60
+ context.messages.push(response);
61
+ context.messages.push({ role: "user", content: "Now say 'Goodbye test successful'", timestamp: Date.now() });
62
+
63
+ const secondResponse = await complete(model, context, options);
64
+
65
+ expect(secondResponse.role).toBe("assistant");
66
+ expect(secondResponse.content).toBeTruthy();
67
+ expect(secondResponse.usage.input + secondResponse.usage.cacheRead).toBeGreaterThan(0);
68
+ expect(secondResponse.usage.output).toBeGreaterThan(0);
69
+ expect(secondResponse.errorMessage).toBeFalsy();
70
+ expect(secondResponse.content.map((b) => (b.type === "text" ? b.text : "")).join("")).toContain(
71
+ "Goodbye test successful",
72
+ );
73
+ }
74
+
75
+ async function handleToolCall<TApi extends Api>(model: Model<TApi>, options?: StreamOptionsWithExtras) {
76
+ const context: Context = {
77
+ systemPrompt: "You are a helpful assistant that uses tools when asked.",
78
+ messages: [
79
+ {
80
+ role: "user",
81
+ content: "Calculate 15 + 27 using the math_operation tool.",
82
+ timestamp: Date.now(),
83
+ },
84
+ ],
85
+ tools: [calculatorTool],
86
+ };
87
+
88
+ const s = await stream(model, context, options);
89
+ let hasToolStart = false;
90
+ let hasToolDelta = false;
91
+ let hasToolEnd = false;
92
+ let accumulatedToolArgs = "";
93
+ let index = 0;
94
+ for await (const event of s) {
95
+ if (event.type === "toolcall_start") {
96
+ hasToolStart = true;
97
+ const toolCall = event.partial.content[event.contentIndex];
98
+ index = event.contentIndex;
99
+ expect(toolCall.type).toBe("toolCall");
100
+ if (toolCall.type === "toolCall") {
101
+ expect(toolCall.name).toBe("math_operation");
102
+ expect(toolCall.id).toBeTruthy();
103
+ }
104
+ }
105
+ if (event.type === "toolcall_delta") {
106
+ hasToolDelta = true;
107
+ const toolCall = event.partial.content[event.contentIndex];
108
+ expect(event.contentIndex).toBe(index);
109
+ expect(toolCall.type).toBe("toolCall");
110
+ if (toolCall.type === "toolCall") {
111
+ expect(toolCall.name).toBe("math_operation");
112
+ accumulatedToolArgs += event.delta;
113
+ // Check that we have a parsed arguments object during streaming
114
+ expect(toolCall.arguments).toBeDefined();
115
+ expect(typeof toolCall.arguments).toBe("object");
116
+ // The arguments should be partially populated as we stream
117
+ // At minimum it should be an empty object, never undefined
118
+ expect(toolCall.arguments).not.toBeNull();
119
+ }
120
+ }
121
+ if (event.type === "toolcall_end") {
122
+ hasToolEnd = true;
123
+ const toolCall = event.partial.content[event.contentIndex];
124
+ expect(event.contentIndex).toBe(index);
125
+ expect(toolCall.type).toBe("toolCall");
126
+ if (toolCall.type === "toolCall") {
127
+ expect(toolCall.name).toBe("math_operation");
128
+ JSON.parse(accumulatedToolArgs);
129
+ expect(toolCall.arguments).not.toBeUndefined();
130
+ expect((toolCall.arguments as any).a).toBe(15);
131
+ expect((toolCall.arguments as any).b).toBe(27);
132
+ expect((toolCall.arguments as any).operation).oneOf(["add", "subtract", "multiply", "divide"]);
133
+ }
134
+ }
135
+ }
136
+
137
+ expect(hasToolStart).toBe(true);
138
+ expect(hasToolDelta).toBe(true);
139
+ expect(hasToolEnd).toBe(true);
140
+
141
+ const response = await s.result();
142
+ expect(response.stopReason).toBe("toolUse");
143
+ expect(response.content.some((b) => b.type === "toolCall")).toBeTruthy();
144
+ const toolCall = response.content.find((b) => b.type === "toolCall");
145
+ if (toolCall && toolCall.type === "toolCall") {
146
+ expect(toolCall.name).toBe("math_operation");
147
+ expect(toolCall.id).toBeTruthy();
148
+ } else {
149
+ throw new Error("No tool call found in response");
150
+ }
151
+ }
152
+
153
+ async function handleStreaming<TApi extends Api>(model: Model<TApi>, options?: StreamOptionsWithExtras) {
154
+ let textStarted = false;
155
+ let textChunks = "";
156
+ let textCompleted = false;
157
+
158
+ const context: Context = {
159
+ messages: [{ role: "user", content: "Count from 1 to 3", timestamp: Date.now() }],
160
+ systemPrompt: "You are a helpful assistant.",
161
+ };
162
+
163
+ const s = stream(model, context, options);
164
+
165
+ for await (const event of s) {
166
+ if (event.type === "text_start") {
167
+ textStarted = true;
168
+ } else if (event.type === "text_delta") {
169
+ textChunks += event.delta;
170
+ } else if (event.type === "text_end") {
171
+ textCompleted = true;
172
+ }
173
+ }
174
+
175
+ const response = await s.result();
176
+
177
+ expect(textStarted).toBe(true);
178
+ expect(textChunks.length).toBeGreaterThan(0);
179
+ expect(textCompleted).toBe(true);
180
+ expect(response.content.some((b) => b.type === "text")).toBeTruthy();
181
+ }
182
+
183
+ async function handleThinking<TApi extends Api>(model: Model<TApi>, options?: StreamOptionsWithExtras) {
184
+ let thinkingStarted = false;
185
+ let thinkingChunks = "";
186
+ let thinkingCompleted = false;
187
+
188
+ const context: Context = {
189
+ messages: [
190
+ {
191
+ role: "user",
192
+ content: `Think long and hard about ${(Math.random() * 255) | 0} + 27. Think step by step. Then output the result.`,
193
+ timestamp: Date.now(),
194
+ },
195
+ ],
196
+ systemPrompt: "You are a helpful assistant.",
197
+ };
198
+
199
+ const s = stream(model, context, options);
200
+
201
+ for await (const event of s) {
202
+ if (event.type === "thinking_start") {
203
+ thinkingStarted = true;
204
+ } else if (event.type === "thinking_delta") {
205
+ thinkingChunks += event.delta;
206
+ } else if (event.type === "thinking_end") {
207
+ thinkingCompleted = true;
208
+ }
209
+ }
210
+
211
+ const response = await s.result();
212
+
213
+ expect(response.stopReason, `Error: ${response.errorMessage}`).toBe("stop");
214
+ expect(thinkingStarted).toBe(true);
215
+ expect(thinkingChunks.length).toBeGreaterThan(0);
216
+ expect(thinkingCompleted).toBe(true);
217
+ expect(response.content.some((b) => b.type === "thinking")).toBeTruthy();
218
+ }
219
+
220
+ async function handleImage<TApi extends Api>(model: Model<TApi>, options?: StreamOptionsWithExtras) {
221
+ // Check if the model supports images
222
+ if (!model.input.includes("image")) {
223
+ console.log(`Skipping image test - model ${model.id} doesn't support images`);
224
+ return;
225
+ }
226
+
227
+ // Read the test image
228
+ const imagePath = join(__dirname, "data", "red-circle.png");
229
+ const imageBuffer = readFileSync(imagePath);
230
+ const base64Image = imageBuffer.toString("base64");
231
+
232
+ const imageContent: ImageContent = {
233
+ type: "image",
234
+ data: base64Image,
235
+ mimeType: "image/png",
236
+ };
237
+
238
+ const context: Context = {
239
+ messages: [
240
+ {
241
+ role: "user",
242
+ content: [
243
+ {
244
+ type: "text",
245
+ text: "What do you see in this image? Please describe the shape (circle, rectangle, square, triangle, ...) and color (red, blue, green, ...). You MUST reply in English.",
246
+ },
247
+ imageContent,
248
+ ],
249
+ timestamp: Date.now(),
250
+ },
251
+ ],
252
+ systemPrompt: "You are a helpful assistant.",
253
+ };
254
+
255
+ const response = await complete(model, context, options);
256
+
257
+ // Check the response mentions red and circle
258
+ expect(response.content.length > 0).toBeTruthy();
259
+ const textContent = response.content.find((b) => b.type === "text");
260
+ if (textContent && textContent.type === "text") {
261
+ const lowerContent = textContent.text.toLowerCase();
262
+ expect(lowerContent).toContain("red");
263
+ expect(lowerContent).toContain("circle");
264
+ }
265
+ }
266
+
267
+ async function multiTurn<TApi extends Api>(model: Model<TApi>, options?: StreamOptionsWithExtras) {
268
+ const context: Context = {
269
+ systemPrompt: "You are a helpful assistant that can use tools to answer questions.",
270
+ messages: [
271
+ {
272
+ role: "user",
273
+ content: "Think about this briefly, then calculate 42 * 17 and 453 + 434 using the math_operation tool.",
274
+ timestamp: Date.now(),
275
+ },
276
+ ],
277
+ tools: [calculatorTool],
278
+ };
279
+
280
+ // Collect all text content from all assistant responses
281
+ let allTextContent = "";
282
+ let hasSeenThinking = false;
283
+ let hasSeenToolCalls = false;
284
+ const maxTurns = 5; // Prevent infinite loops
285
+
286
+ for (let turn = 0; turn < maxTurns; turn++) {
287
+ const response = await complete(model, context, options);
288
+
289
+ // Add the assistant response to context
290
+ context.messages.push(response);
291
+
292
+ // Process content blocks
293
+ const results: ToolResultMessage[] = [];
294
+ for (const block of response.content) {
295
+ if (block.type === "text") {
296
+ allTextContent += block.text;
297
+ } else if (block.type === "thinking") {
298
+ hasSeenThinking = true;
299
+ } else if (block.type === "toolCall") {
300
+ hasSeenToolCalls = true;
301
+
302
+ // Process the tool call
303
+ expect(block.name).toBe("math_operation");
304
+ expect(block.id).toBeTruthy();
305
+ expect(block.arguments).toBeTruthy();
306
+
307
+ const { a, b, operation } = block.arguments;
308
+ let result: number;
309
+ switch (operation) {
310
+ case "add":
311
+ result = a + b;
312
+ break;
313
+ case "multiply":
314
+ result = a * b;
315
+ break;
316
+ default:
317
+ result = 0;
318
+ }
319
+
320
+ // Add tool result to context
321
+ results.push({
322
+ role: "toolResult",
323
+ toolCallId: block.id,
324
+ toolName: block.name,
325
+ content: [{ type: "text", text: `${result}` }],
326
+ isError: false,
327
+ timestamp: Date.now(),
328
+ });
329
+ }
330
+ }
331
+ context.messages.push(...results);
332
+
333
+ // If we got a stop response with text content, we're likely done
334
+ expect(response.stopReason, `Error: ${response.errorMessage}`).not.toBe("error");
335
+ if (response.stopReason === "stop") {
336
+ break;
337
+ }
338
+ }
339
+
340
+ // Verify we got either thinking content or tool calls (or both)
341
+ expect(hasSeenThinking || hasSeenToolCalls).toBe(true);
342
+
343
+ // The accumulated text should reference both calculations
344
+ expect(allTextContent).toBeTruthy();
345
+ expect(allTextContent.includes("714")).toBe(true);
346
+ expect(allTextContent.includes("887")).toBe(true);
347
+ }
348
+
349
+ describe("Generate E2E Tests", () => {
350
+ describe.skipIf(!process.env.GEMINI_API_KEY)("Gemini Provider (gemini-2.5-flash)", () => {
351
+ const llm = getModel("google", "gemini-2.5-flash");
352
+
353
+ it("should complete basic text generation", { retry: 3 }, async () => {
354
+ await basicTextGeneration(llm);
355
+ });
356
+
357
+ it("should handle tool calling", { retry: 3 }, async () => {
358
+ await handleToolCall(llm);
359
+ });
360
+
361
+ it("should handle streaming", { retry: 3 }, async () => {
362
+ await handleStreaming(llm);
363
+ });
364
+
365
+ it("should handle thinking", { retry: 3 }, async () => {
366
+ await handleThinking(llm, { thinking: { enabled: true, budgetTokens: 1024 } });
367
+ });
368
+
369
+ it("should handle multi-turn with thinking and tools", { retry: 3 }, async () => {
370
+ await multiTurn(llm, { thinking: { enabled: true, budgetTokens: 2048 } });
371
+ });
372
+
373
+ it("should handle image input", { retry: 3 }, async () => {
374
+ await handleImage(llm);
375
+ });
376
+ });
377
+
378
+ describe("Google Vertex Provider (gemini-3-flash-preview)", () => {
379
+ const vertexProject = process.env.GOOGLE_CLOUD_PROJECT || process.env.GCLOUD_PROJECT;
380
+ const vertexLocation = process.env.GOOGLE_CLOUD_LOCATION;
381
+ const vertexApiKey = process.env.GOOGLE_CLOUD_API_KEY;
382
+ const isVertexConfigured = Boolean(vertexProject && vertexLocation);
383
+ const vertexOptions = { project: vertexProject, location: vertexLocation } as const;
384
+ const llm = getModel("google-vertex", "gemini-3-flash-preview");
385
+
386
+ it.skipIf(!isVertexConfigured)("should complete basic text generation", { retry: 3 }, async () => {
387
+ await basicTextGeneration(llm, vertexOptions);
388
+ });
389
+
390
+ it.skipIf(!vertexApiKey)("should complete basic text generation with Vertex API key", { retry: 3 }, async () => {
391
+ await basicTextGeneration(llm, { apiKey: vertexApiKey! });
392
+ });
393
+
394
+ it.skipIf(!isVertexConfigured)("should handle tool calling", { retry: 3 }, async () => {
395
+ await handleToolCall(llm, vertexOptions);
396
+ });
397
+
398
+ it.skipIf(!isVertexConfigured)("should handle thinking", { retry: 3 }, async () => {
399
+ const { ThinkingLevel } = await import("@google/genai");
400
+ await handleThinking(llm, {
401
+ ...vertexOptions,
402
+ thinking: { enabled: true, budgetTokens: 1024, level: ThinkingLevel.LOW },
403
+ });
404
+ });
405
+
406
+ it.skipIf(!isVertexConfigured)("should handle streaming", { retry: 3 }, async () => {
407
+ await handleStreaming(llm, vertexOptions);
408
+ });
409
+
410
+ it.skipIf(!isVertexConfigured)("should handle multi-turn with thinking and tools", { retry: 3 }, async () => {
411
+ const { ThinkingLevel } = await import("@google/genai");
412
+ await multiTurn(llm, {
413
+ ...vertexOptions,
414
+ thinking: { enabled: true, budgetTokens: 1024, level: ThinkingLevel.MEDIUM },
415
+ });
416
+ });
417
+
418
+ it.skipIf(!isVertexConfigured)("should handle image input", { retry: 3 }, async () => {
419
+ await handleImage(llm, vertexOptions);
420
+ });
421
+ });
422
+
423
+ describe.skipIf(!process.env.OPENAI_API_KEY)("OpenAI Completions Provider (gpt-4o-mini)", () => {
424
+ const { compat: _compat, ...baseModel } = getModel("openai", "gpt-4o-mini");
425
+ void _compat;
426
+ const llm: Model<"openai-completions"> = {
427
+ ...baseModel,
428
+ api: "openai-completions",
429
+ };
430
+
431
+ it("should complete basic text generation", { retry: 3 }, async () => {
432
+ await basicTextGeneration(llm);
433
+ });
434
+
435
+ it("should handle tool calling", { retry: 3 }, async () => {
436
+ await handleToolCall(llm);
437
+ });
438
+
439
+ it("should handle streaming", { retry: 3 }, async () => {
440
+ await handleStreaming(llm);
441
+ });
442
+
443
+ it("should handle image input", { retry: 3 }, async () => {
444
+ await handleImage(llm);
445
+ });
446
+ });
447
+
448
+ describe.skipIf(!process.env.DEEPSEEK_API_KEY)(
449
+ "DeepSeek Provider (deepseek-v4-flash via OpenAI Completions)",
450
+ () => {
451
+ const llm = getModel("deepseek", "deepseek-v4-flash");
452
+
453
+ it("should complete basic text generation", { retry: 3 }, async () => {
454
+ await basicTextGeneration(llm);
455
+ });
456
+
457
+ it("should handle tool calling", { retry: 3 }, async () => {
458
+ await handleToolCall(llm);
459
+ });
460
+
461
+ it("should handle streaming", { retry: 3 }, async () => {
462
+ await handleStreaming(llm);
463
+ });
464
+
465
+ it("should handle thinking mode", { retry: 3 }, async () => {
466
+ await handleThinking(llm, { reasoningEffort: "high" });
467
+ });
468
+
469
+ it("should handle multi-turn with thinking and tools", { retry: 3 }, async () => {
470
+ await multiTurn(llm, { reasoningEffort: "high" });
471
+ });
472
+ },
473
+ );
474
+
475
+ describe.skipIf(!process.env.OPENAI_API_KEY)("OpenAI Responses Provider (gpt-5.4)", () => {
476
+ const llm = getModel("openai", "gpt-5.4");
477
+
478
+ it("should complete basic text generation", { retry: 3 }, async () => {
479
+ await basicTextGeneration(llm);
480
+ });
481
+
482
+ it("should handle tool calling", { retry: 3 }, async () => {
483
+ await handleToolCall(llm);
484
+ });
485
+
486
+ it("should handle streaming", { retry: 3 }, async () => {
487
+ await handleStreaming(llm);
488
+ });
489
+
490
+ it("should handle thinking", { retry: 2 }, async () => {
491
+ await handleThinking(llm, { reasoningEffort: "high" });
492
+ });
493
+
494
+ it("should handle multi-turn with thinking and tools", { retry: 3 }, async () => {
495
+ await multiTurn(llm, { reasoningEffort: "high" });
496
+ });
497
+
498
+ it("should handle image input", { retry: 3 }, async () => {
499
+ await handleImage(llm);
500
+ });
501
+ });
502
+
503
+ describe.skipIf(!process.env.ANTHROPIC_API_KEY)("Anthropic Provider (claude-haiku-4-5)", () => {
504
+ const model = getModel("anthropic", "claude-haiku-4-5");
505
+
506
+ it("should complete basic text generation", { retry: 3 }, async () => {
507
+ await basicTextGeneration(model, { thinkingEnabled: true });
508
+ });
509
+
510
+ it("should handle tool calling", { retry: 3 }, async () => {
511
+ await handleToolCall(model);
512
+ });
513
+
514
+ it("should handle streaming", { retry: 3 }, async () => {
515
+ await handleStreaming(model);
516
+ });
517
+
518
+ it("should handle image input", { retry: 3 }, async () => {
519
+ await handleImage(model);
520
+ });
521
+ });
522
+
523
+ describe.skipIf(!hasAzureOpenAICredentials())("Azure OpenAI Responses Provider (gpt-4o-mini)", () => {
524
+ const llm = getModel("azure-openai-responses", "gpt-4o-mini");
525
+ const azureDeploymentName = resolveAzureDeploymentName(llm.id);
526
+ const azureOptions = azureDeploymentName ? { azureDeploymentName } : {};
527
+
528
+ it("should complete basic text generation", { retry: 3 }, async () => {
529
+ await basicTextGeneration(llm, azureOptions);
530
+ });
531
+
532
+ it("should handle tool calling", { retry: 3 }, async () => {
533
+ await handleToolCall(llm, azureOptions);
534
+ });
535
+
536
+ it("should handle streaming", { retry: 3 }, async () => {
537
+ await handleStreaming(llm, azureOptions);
538
+ });
539
+
540
+ it("should handle image input", { retry: 3 }, async () => {
541
+ await handleImage(llm, azureOptions);
542
+ });
543
+ });
544
+
545
+ describe.skipIf(!process.env.XAI_API_KEY)("xAI Provider (grok-4.3 via OpenAI Completions)", () => {
546
+ const llm = getModel("xai", "grok-4.3");
547
+
548
+ it("should complete basic text generation", { retry: 3 }, async () => {
549
+ await basicTextGeneration(llm);
550
+ });
551
+
552
+ it("should handle tool calling", { retry: 3 }, async () => {
553
+ await handleToolCall(llm);
554
+ });
555
+
556
+ it("should handle streaming", { retry: 3 }, async () => {
557
+ await handleStreaming(llm);
558
+ });
559
+
560
+ it("should handle thinking mode", { retry: 3 }, async () => {
561
+ await handleThinking(llm, { reasoningEffort: "medium" });
562
+ });
563
+
564
+ it("should handle multi-turn with thinking and tools", { retry: 3 }, async () => {
565
+ await multiTurn(llm, { reasoningEffort: "medium" });
566
+ });
567
+ });
568
+
569
+ describe.skipIf(!process.env.GROQ_API_KEY)("Groq Provider (gpt-oss-20b via OpenAI Completions)", () => {
570
+ const llm = getModel("groq", "openai/gpt-oss-20b");
571
+
572
+ it("should complete basic text generation", { retry: 3 }, async () => {
573
+ await basicTextGeneration(llm);
574
+ });
575
+
576
+ it("should handle tool calling", { retry: 3 }, async () => {
577
+ await handleToolCall(llm);
578
+ });
579
+
580
+ it("should handle streaming", { retry: 3 }, async () => {
581
+ await handleStreaming(llm);
582
+ });
583
+
584
+ it("should handle thinking mode", { retry: 3 }, async () => {
585
+ await handleThinking(llm, { reasoningEffort: "medium" });
586
+ });
587
+
588
+ it("should handle multi-turn with thinking and tools", { retry: 3 }, async () => {
589
+ await multiTurn(llm, { reasoningEffort: "medium" });
590
+ });
591
+ });
592
+
593
+ describe.skipIf(!process.env.CEREBRAS_API_KEY)("Cerebras Provider (gpt-oss-120b via OpenAI Completions)", () => {
594
+ const llm = getModel("cerebras", "gpt-oss-120b");
595
+
596
+ it("should complete basic text generation", { retry: 3 }, async () => {
597
+ await basicTextGeneration(llm);
598
+ });
599
+
600
+ it("should handle tool calling", { retry: 3 }, async () => {
601
+ await handleToolCall(llm);
602
+ });
603
+
604
+ it("should handle streaming", { retry: 3 }, async () => {
605
+ await handleStreaming(llm);
606
+ });
607
+
608
+ it("should handle thinking mode", { retry: 3 }, async () => {
609
+ await handleThinking(llm, { reasoningEffort: "medium" });
610
+ });
611
+
612
+ it("should handle multi-turn with thinking and tools", { retry: 3 }, async () => {
613
+ await multiTurn(llm, { reasoningEffort: "medium" });
614
+ });
615
+ });
616
+
617
+ describe.skipIf(!hasCloudflareWorkersAICredentials())(
618
+ "Cloudflare Workers AI Provider (Kimi K2.6 via OpenAI Completions)",
619
+ () => {
620
+ const llm = getModel("cloudflare-workers-ai", "@cf/moonshotai/kimi-k2.6");
621
+
622
+ it("should complete basic text generation", { retry: 3 }, async () => {
623
+ await basicTextGeneration(llm);
624
+ });
625
+
626
+ it("should handle tool calling", { retry: 3 }, async () => {
627
+ await handleToolCall(llm);
628
+ });
629
+
630
+ it("should handle streaming", { retry: 3 }, async () => {
631
+ await handleStreaming(llm);
632
+ });
633
+
634
+ it("should handle thinking mode", { retry: 3 }, async () => {
635
+ await handleThinking(llm, { reasoningEffort: "medium" });
636
+ });
637
+
638
+ it("should handle multi-turn with thinking and tools", { retry: 3 }, async () => {
639
+ await multiTurn(llm, { reasoningEffort: "medium" });
640
+ });
641
+ },
642
+ );
643
+
644
+ describe.skipIf(!hasCloudflareAiGatewayCredentials())(
645
+ "Cloudflare AI Gateway → Workers AI (Kimi K2.6 via /compat)",
646
+ () => {
647
+ const llm = getModel("cloudflare-ai-gateway", "workers-ai/@cf/moonshotai/kimi-k2.6");
648
+
649
+ it("should complete basic text generation", { retry: 3 }, async () => {
650
+ await basicTextGeneration(llm);
651
+ });
652
+
653
+ it("should handle tool calling", { retry: 3 }, async () => {
654
+ await handleToolCall(llm);
655
+ });
656
+
657
+ it("should handle streaming", { retry: 3 }, async () => {
658
+ await handleStreaming(llm);
659
+ });
660
+
661
+ it("should handle thinking mode", { retry: 3 }, async () => {
662
+ await handleThinking(llm, { reasoningEffort: "medium" });
663
+ });
664
+
665
+ it("should handle multi-turn with thinking and tools", { retry: 3 }, async () => {
666
+ await multiTurn(llm, { reasoningEffort: "medium" });
667
+ });
668
+ },
669
+ );
670
+
671
+ describe.skipIf(!hasCloudflareAiGatewayCredentials() || !process.env.OPENAI_API_KEY)(
672
+ "Cloudflare AI Gateway → OpenAI BYOK (gpt-5.1 via /openai responses)",
673
+ () => {
674
+ const llm = getModel("cloudflare-ai-gateway", "gpt-5.1");
675
+ const options = { headers: { Authorization: `Bearer ${process.env.OPENAI_API_KEY}` } };
676
+ const thinkingOptions = {
677
+ ...options,
678
+ thinkingEnabled: true,
679
+ reasoningEffort: "medium",
680
+ } satisfies StreamOptionsWithExtras;
681
+
682
+ it("should complete basic text generation", { retry: 3 }, async () => {
683
+ await basicTextGeneration(llm, options);
684
+ });
685
+
686
+ it("should handle tool calling", { retry: 3 }, async () => {
687
+ await handleToolCall(llm, options);
688
+ });
689
+
690
+ it("should handle streaming", { retry: 3 }, async () => {
691
+ await handleStreaming(llm, options);
692
+ });
693
+
694
+ it("should handle thinking mode", { retry: 3 }, async () => {
695
+ await handleThinking(llm, thinkingOptions);
696
+ });
697
+
698
+ it("should handle multi-turn with thinking and tools", { retry: 3 }, async () => {
699
+ await multiTurn(llm, thinkingOptions);
700
+ });
701
+ },
702
+ );
703
+
704
+ describe.skipIf(!hasCloudflareAiGatewayCredentials() || !process.env.ANTHROPIC_API_KEY)(
705
+ "Cloudflare AI Gateway → Anthropic BYOK (claude-sonnet-4-5 via /anthropic messages)",
706
+ () => {
707
+ const llm = getModel("cloudflare-ai-gateway", "claude-sonnet-4-5");
708
+ const options = { headers: { Authorization: `Bearer ${process.env.ANTHROPIC_API_KEY}` } };
709
+ const thinkingOptions = {
710
+ ...options,
711
+ thinkingEnabled: true,
712
+ reasoningEffort: "high",
713
+ } satisfies StreamOptionsWithExtras;
714
+
715
+ it("should complete basic text generation", { retry: 3 }, async () => {
716
+ await basicTextGeneration(llm, options);
717
+ });
718
+
719
+ it("should handle tool calling", { retry: 3 }, async () => {
720
+ await handleToolCall(llm, options);
721
+ });
722
+
723
+ it("should handle streaming", { retry: 3 }, async () => {
724
+ await handleStreaming(llm, options);
725
+ });
726
+
727
+ it("should handle thinking mode", { retry: 3 }, async () => {
728
+ await handleThinking(llm, thinkingOptions);
729
+ });
730
+
731
+ it("should handle multi-turn with thinking and tools", { retry: 3 }, async () => {
732
+ await multiTurn(llm, thinkingOptions);
733
+ });
734
+ },
735
+ );
736
+
737
+ describe.skipIf(!process.env.HF_TOKEN)("Hugging Face Provider (Kimi-K2.5 via OpenAI Completions)", () => {
738
+ const llm = getModel("huggingface", "moonshotai/Kimi-K2.5");
739
+
740
+ it("should complete basic text generation", { retry: 3 }, async () => {
741
+ await basicTextGeneration(llm);
742
+ });
743
+
744
+ it("should handle tool calling", { retry: 3 }, async () => {
745
+ await handleToolCall(llm);
746
+ });
747
+
748
+ it("should handle streaming", { retry: 3 }, async () => {
749
+ await handleStreaming(llm);
750
+ });
751
+
752
+ it("should handle thinking mode", { retry: 3 }, async () => {
753
+ await handleThinking(llm, { reasoningEffort: "medium" });
754
+ });
755
+
756
+ it("should handle multi-turn with thinking and tools", { retry: 3 }, async () => {
757
+ await multiTurn(llm, { reasoningEffort: "medium" });
758
+ });
759
+ });
760
+
761
+ describe.skipIf(!process.env.TOGETHER_API_KEY)("Together AI Provider (Kimi-K2.6 via OpenAI Completions)", () => {
762
+ const llm = getModel("together", "moonshotai/Kimi-K2.6");
763
+
764
+ it("should complete basic text generation", { retry: 3 }, async () => {
765
+ await basicTextGeneration(llm);
766
+ });
767
+
768
+ it("should handle tool calling", { retry: 3 }, async () => {
769
+ await handleToolCall(llm);
770
+ });
771
+
772
+ it("should handle streaming", { retry: 3 }, async () => {
773
+ await handleStreaming(llm);
774
+ });
775
+
776
+ it("should handle thinking mode", { retry: 3 }, async () => {
777
+ await handleThinking(llm, { reasoningEffort: "high" });
778
+ });
779
+
780
+ it("should handle multi-turn with thinking and tools", { retry: 3 }, async () => {
781
+ await multiTurn(llm, { reasoningEffort: "high" });
782
+ });
783
+
784
+ it("should handle image input", { retry: 3 }, async () => {
785
+ await handleImage(llm);
786
+ });
787
+ });
788
+
789
+ describe.skipIf(!process.env.NVIDIA_API_KEY)("NVIDIA NIM Provider (Nemotron 3 Super via OpenAI Completions)", () => {
790
+ const llm = getModel("nvidia", "nvidia/nemotron-3-super-120b-a12b");
791
+
792
+ it("should complete basic text generation", { retry: 3 }, async () => {
793
+ await basicTextGeneration(llm);
794
+ });
795
+
796
+ it("should handle tool calling", { retry: 3 }, async () => {
797
+ await handleToolCall(llm);
798
+ });
799
+
800
+ it("should handle streaming", { retry: 3 }, async () => {
801
+ await handleStreaming(llm);
802
+ });
803
+
804
+ it("should handle thinking mode", { retry: 3 }, async () => {
805
+ await handleThinking(llm, { reasoningEffort: "high" });
806
+ });
807
+
808
+ it("should handle multi-turn with thinking and tools", { retry: 3 }, async () => {
809
+ await multiTurn(llm, { reasoningEffort: "high" });
810
+ });
811
+ });
812
+
813
+ describe.skipIf(!process.env.OPENROUTER_API_KEY)("OpenRouter Provider (glm-4.5v via OpenAI Completions)", () => {
814
+ const llm = getModel("openrouter", "z-ai/glm-4.5v");
815
+
816
+ it("should complete basic text generation", { retry: 3 }, async () => {
817
+ await basicTextGeneration(llm);
818
+ });
819
+
820
+ it("should handle tool calling", { retry: 3 }, async () => {
821
+ await handleToolCall(llm);
822
+ });
823
+
824
+ it("should handle streaming", { retry: 3 }, async () => {
825
+ await handleStreaming(llm);
826
+ });
827
+
828
+ it("should handle thinking mode", { retry: 3 }, async () => {
829
+ await handleThinking(llm, { reasoningEffort: "medium" });
830
+ });
831
+
832
+ it("should handle multi-turn with thinking and tools", { retry: 2 }, async () => {
833
+ await multiTurn(llm, { reasoningEffort: "medium" });
834
+ });
835
+
836
+ it("should handle image input", { retry: 3 }, async () => {
837
+ await handleImage(llm);
838
+ });
839
+ });
840
+
841
+ describe.skipIf(!process.env.AI_GATEWAY_API_KEY)(
842
+ "Vercel AI Gateway Provider (google/gemini-2.5-flash via Anthropic Messages)",
843
+ () => {
844
+ const llm = getModel("vercel-ai-gateway", "google/gemini-2.5-flash");
845
+
846
+ it("should complete basic text generation", { retry: 3 }, async () => {
847
+ await basicTextGeneration(llm);
848
+ });
849
+
850
+ it("should handle tool calling", { retry: 3 }, async () => {
851
+ await handleToolCall(llm);
852
+ });
853
+
854
+ it("should handle streaming", { retry: 3 }, async () => {
855
+ await handleStreaming(llm);
856
+ });
857
+
858
+ it("should handle image input", { retry: 3 }, async () => {
859
+ await handleImage(llm);
860
+ });
861
+
862
+ it("should handle multi-turn with tools", { retry: 3 }, async () => {
863
+ await multiTurn(llm);
864
+ });
865
+ },
866
+ );
867
+
868
+ describe.skipIf(!process.env.AI_GATEWAY_API_KEY)(
869
+ "Vercel AI Gateway Provider (anthropic/claude-opus-4.5 via Anthropic Messages)",
870
+ () => {
871
+ const llm = getModel("vercel-ai-gateway", "anthropic/claude-opus-4.5");
872
+
873
+ it("should complete basic text generation", { retry: 3 }, async () => {
874
+ await basicTextGeneration(llm);
875
+ });
876
+
877
+ it("should handle tool calling", { retry: 3 }, async () => {
878
+ await handleToolCall(llm);
879
+ });
880
+
881
+ it("should handle streaming", { retry: 3 }, async () => {
882
+ await handleStreaming(llm);
883
+ });
884
+
885
+ it("should handle image input", { retry: 3 }, async () => {
886
+ await handleImage(llm);
887
+ });
888
+
889
+ it("should handle multi-turn with tools", { retry: 3 }, async () => {
890
+ await multiTurn(llm);
891
+ });
892
+ },
893
+ );
894
+
895
+ describe.skipIf(!process.env.AI_GATEWAY_API_KEY)(
896
+ "Vercel AI Gateway Provider (openai/gpt-5.1-codex-max via Anthropic Messages)",
897
+ () => {
898
+ const llm = getModel("vercel-ai-gateway", "openai/gpt-5.1-codex-max");
899
+
900
+ it("should complete basic text generation", { retry: 3 }, async () => {
901
+ await basicTextGeneration(llm);
902
+ });
903
+
904
+ it("should handle tool calling", { retry: 3 }, async () => {
905
+ await handleToolCall(llm);
906
+ });
907
+
908
+ it("should handle streaming", { retry: 3 }, async () => {
909
+ await handleStreaming(llm);
910
+ });
911
+
912
+ it("should handle image input", { retry: 3 }, async () => {
913
+ await handleImage(llm);
914
+ });
915
+
916
+ it("should handle multi-turn with tools", { retry: 3 }, async () => {
917
+ await multiTurn(llm);
918
+ });
919
+ },
920
+ );
921
+
922
+ describe.skipIf(!process.env.ZAI_API_KEY)("zAI Provider (glm-5.1 via OpenAI Completions)", () => {
923
+ const llm = getModel("zai", "glm-5.1");
924
+
925
+ it("should complete basic text generation", { retry: 3 }, async () => {
926
+ await basicTextGeneration(llm);
927
+ });
928
+
929
+ it("should handle tool calling", { retry: 3 }, async () => {
930
+ await handleToolCall(llm);
931
+ });
932
+
933
+ it("should handle streaming", { retry: 3 }, async () => {
934
+ await handleStreaming(llm);
935
+ });
936
+
937
+ it("should handle thinking mode", { retry: 3 }, async () => {
938
+ await handleThinking(llm, { reasoningEffort: "medium" });
939
+ });
940
+
941
+ it("should handle multi-turn with thinking and tools", { retry: 3 }, async () => {
942
+ await multiTurn(llm, { reasoningEffort: "medium" });
943
+ });
944
+
945
+ it("should handle image input", { retry: 3 }, async () => {
946
+ await handleImage(llm);
947
+ });
948
+ });
949
+
950
+ describe.skipIf(!process.env.MISTRAL_API_KEY)("Mistral Provider (devstral-medium-latest)", () => {
951
+ const llm = getModel("mistral", "devstral-medium-latest");
952
+
953
+ it("should complete basic text generation", { retry: 3 }, async () => {
954
+ await basicTextGeneration(llm);
955
+ });
956
+
957
+ it("should handle tool calling", { retry: 3 }, async () => {
958
+ await handleToolCall(llm);
959
+ });
960
+
961
+ it("should handle streaming", { retry: 3 }, async () => {
962
+ await handleStreaming(llm);
963
+ });
964
+
965
+ it("should handle thinking mode", { retry: 3 }, async () => {
966
+ const llm = getModel("mistral", "magistral-medium-latest");
967
+ await handleThinking(llm, { promptMode: "reasoning" });
968
+ });
969
+
970
+ it("should handle multi-turn with thinking and tools", { retry: 3 }, async () => {
971
+ const llm = getModel("mistral", "magistral-medium-latest");
972
+ await multiTurn(llm, { promptMode: "reasoning" });
973
+ });
974
+ });
975
+
976
+ describe.skipIf(!process.env.MISTRAL_API_KEY)("Mistral Provider (pixtral-12b with image support)", () => {
977
+ const llm = getModel("mistral", "pixtral-12b");
978
+
979
+ it("should complete basic text generation", { retry: 3 }, async () => {
980
+ await basicTextGeneration(llm);
981
+ });
982
+
983
+ it("should handle tool calling", { retry: 3 }, async () => {
984
+ await handleToolCall(llm);
985
+ });
986
+
987
+ it("should handle streaming", { retry: 3 }, async () => {
988
+ await handleStreaming(llm);
989
+ });
990
+
991
+ it("should handle image input", { retry: 3 }, async () => {
992
+ await handleImage(llm);
993
+ });
994
+ });
995
+
996
+ describe.skipIf(!process.env.MINIMAX_API_KEY)("MiniMax Provider (MiniMax-M2.7 via Anthropic Messages)", () => {
997
+ const llm = getModel("minimax", "MiniMax-M2.7");
998
+
999
+ it("should complete basic text generation", { retry: 3 }, async () => {
1000
+ await basicTextGeneration(llm);
1001
+ });
1002
+
1003
+ it("should handle tool calling", { retry: 3 }, async () => {
1004
+ await handleToolCall(llm);
1005
+ });
1006
+
1007
+ it("should handle streaming", { retry: 3 }, async () => {
1008
+ await handleStreaming(llm);
1009
+ });
1010
+
1011
+ it("should handle thinking mode", { retry: 3 }, async () => {
1012
+ await handleThinking(llm, { thinkingEnabled: true, thinkingBudgetTokens: 2048 });
1013
+ });
1014
+
1015
+ it("should handle multi-turn with thinking and tools", { retry: 3 }, async () => {
1016
+ await multiTurn(llm, { thinkingEnabled: true, thinkingBudgetTokens: 2048 });
1017
+ });
1018
+ });
1019
+
1020
+ describe.skipIf(!process.env.KIMI_API_KEY)(
1021
+ "Kimi For Coding Provider (kimi-k2-thinking via Anthropic Messages)",
1022
+ () => {
1023
+ const llm = getModel("kimi-coding", "kimi-k2-thinking");
1024
+
1025
+ it("should complete basic text generation", { retry: 3 }, async () => {
1026
+ await basicTextGeneration(llm);
1027
+ });
1028
+
1029
+ it("should handle tool calling", { retry: 3 }, async () => {
1030
+ await handleToolCall(llm);
1031
+ });
1032
+
1033
+ it("should handle streaming", { retry: 3 }, async () => {
1034
+ await handleStreaming(llm);
1035
+ });
1036
+
1037
+ it("should handle thinking mode", { retry: 3 }, async () => {
1038
+ await handleThinking(llm, { thinkingEnabled: true, thinkingBudgetTokens: 2048 });
1039
+ });
1040
+
1041
+ it("should handle multi-turn with thinking and tools", { retry: 3 }, async () => {
1042
+ await multiTurn(llm, { thinkingEnabled: true, thinkingBudgetTokens: 2048 });
1043
+ });
1044
+ },
1045
+ );
1046
+
1047
+ describe.skipIf(!process.env.XIAOMI_API_KEY)(
1048
+ "Xiaomi MiMo (API billing) Provider (Xiaomi MiMo-V2.5-Pro via Anthropic Messages)",
1049
+ () => {
1050
+ const llm = getModel("xiaomi", "mimo-v2.5-pro");
1051
+ const thinkingOptions = {
1052
+ thinkingEnabled: true,
1053
+ reasoningEffort: "high",
1054
+ } satisfies StreamOptionsWithExtras;
1055
+
1056
+ it("should complete basic text generation", { retry: 3 }, async () => {
1057
+ await basicTextGeneration(llm);
1058
+ });
1059
+
1060
+ it("should handle tool calling", { retry: 3 }, async () => {
1061
+ await handleToolCall(llm);
1062
+ });
1063
+
1064
+ it("should handle streaming", { retry: 3 }, async () => {
1065
+ await handleStreaming(llm);
1066
+ });
1067
+
1068
+ it("should handle thinking mode", { retry: 3 }, async () => {
1069
+ await handleThinking(llm, thinkingOptions);
1070
+ });
1071
+
1072
+ it("should handle multi-turn with thinking and tools", { retry: 3 }, async () => {
1073
+ await multiTurn(llm, thinkingOptions);
1074
+ });
1075
+ },
1076
+ );
1077
+
1078
+ describe.skipIf(!process.env.XIAOMI_TOKEN_PLAN_CN_API_KEY)(
1079
+ "Xiaomi MiMo Token Plan Provider (Xiaomi MiMo-V2.5-Pro via Anthropic Messages, CN region)",
1080
+ () => {
1081
+ const llm = getModel("xiaomi-token-plan-cn", "mimo-v2.5-pro");
1082
+ const thinkingOptions = {
1083
+ thinkingEnabled: true,
1084
+ reasoningEffort: "high",
1085
+ } satisfies StreamOptionsWithExtras;
1086
+
1087
+ it("should complete basic text generation", { retry: 3 }, async () => {
1088
+ await basicTextGeneration(llm);
1089
+ });
1090
+
1091
+ it("should handle tool calling", { retry: 3 }, async () => {
1092
+ await handleToolCall(llm);
1093
+ });
1094
+
1095
+ it("should handle streaming", { retry: 3 }, async () => {
1096
+ await handleStreaming(llm);
1097
+ });
1098
+
1099
+ it("should handle thinking mode", { retry: 3 }, async () => {
1100
+ await handleThinking(llm, thinkingOptions);
1101
+ });
1102
+
1103
+ it("should handle multi-turn with thinking and tools", { retry: 3 }, async () => {
1104
+ await multiTurn(llm, thinkingOptions);
1105
+ });
1106
+ },
1107
+ );
1108
+
1109
+ describe.skipIf(!process.env.XIAOMI_TOKEN_PLAN_AMS_API_KEY)(
1110
+ "Xiaomi MiMo Token Plan Provider (Xiaomi MiMo-V2.5-Pro via Anthropic Messages, AMS region)",
1111
+ () => {
1112
+ const llm = getModel("xiaomi-token-plan-ams", "mimo-v2.5-pro");
1113
+ const thinkingOptions = {
1114
+ thinkingEnabled: true,
1115
+ reasoningEffort: "high",
1116
+ } satisfies StreamOptionsWithExtras;
1117
+
1118
+ it("should complete basic text generation", { retry: 3 }, async () => {
1119
+ await basicTextGeneration(llm);
1120
+ });
1121
+
1122
+ it("should handle tool calling", { retry: 3 }, async () => {
1123
+ await handleToolCall(llm);
1124
+ });
1125
+
1126
+ it("should handle streaming", { retry: 3 }, async () => {
1127
+ await handleStreaming(llm);
1128
+ });
1129
+
1130
+ it("should handle thinking mode", { retry: 3 }, async () => {
1131
+ await handleThinking(llm, thinkingOptions);
1132
+ });
1133
+
1134
+ it("should handle multi-turn with thinking and tools", { retry: 3 }, async () => {
1135
+ await multiTurn(llm, thinkingOptions);
1136
+ });
1137
+ },
1138
+ );
1139
+
1140
+ describe.skipIf(!process.env.XIAOMI_TOKEN_PLAN_SGP_API_KEY)(
1141
+ "Xiaomi MiMo Token Plan Provider (Xiaomi MiMo-V2.5-Pro via Anthropic Messages, SGP region)",
1142
+ () => {
1143
+ const llm = getModel("xiaomi-token-plan-sgp", "mimo-v2.5-pro");
1144
+ const thinkingOptions = {
1145
+ thinkingEnabled: true,
1146
+ reasoningEffort: "high",
1147
+ } satisfies StreamOptionsWithExtras;
1148
+
1149
+ it("should complete basic text generation", { retry: 3 }, async () => {
1150
+ await basicTextGeneration(llm);
1151
+ });
1152
+
1153
+ it("should handle tool calling", { retry: 3 }, async () => {
1154
+ await handleToolCall(llm);
1155
+ });
1156
+
1157
+ it("should handle streaming", { retry: 3 }, async () => {
1158
+ await handleStreaming(llm);
1159
+ });
1160
+
1161
+ it("should handle thinking mode", { retry: 3 }, async () => {
1162
+ await handleThinking(llm, thinkingOptions);
1163
+ });
1164
+
1165
+ it("should handle multi-turn with thinking and tools", { retry: 3 }, async () => {
1166
+ await multiTurn(llm, thinkingOptions);
1167
+ });
1168
+ },
1169
+ );
1170
+
1171
+ describe.skipIf(!process.env.ANT_LING_API_KEY)("Ant Ling Provider (Ling 2.6 Flash via OpenAI Completions)", () => {
1172
+ const llm = getModel("ant-ling", "Ling-2.6-flash");
1173
+
1174
+ it("should complete basic text generation", { retry: 3 }, async () => {
1175
+ await basicTextGeneration(llm);
1176
+ });
1177
+
1178
+ it("should handle tool calling", { retry: 3 }, async () => {
1179
+ await handleToolCall(llm);
1180
+ });
1181
+
1182
+ it("should handle streaming", { retry: 3 }, async () => {
1183
+ await handleStreaming(llm);
1184
+ });
1185
+
1186
+ it("should handle thinking mode", { retry: 3 }, async () => {
1187
+ const ringModel = getModel("ant-ling", "Ring-2.6-1T");
1188
+ await handleThinking(ringModel, { reasoningEffort: "high" });
1189
+ });
1190
+ });
1191
+
1192
+ // =========================================================================
1193
+ // OAuth-based providers (credentials from ~/.pi/agent/oauth.json)
1194
+ // Tokens are resolved at module level (see oauthTokens above)
1195
+ // =========================================================================
1196
+
1197
+ describe("Anthropic OAuth Provider (claude-sonnet-4-6)", () => {
1198
+ const model = getModel("anthropic", "claude-sonnet-4-6");
1199
+
1200
+ it.skipIf(!anthropicOAuthToken)("should complete basic text generation", { retry: 3 }, async () => {
1201
+ await basicTextGeneration(model, { apiKey: anthropicOAuthToken });
1202
+ });
1203
+
1204
+ it.skipIf(!anthropicOAuthToken)("should handle tool calling", { retry: 3 }, async () => {
1205
+ await handleToolCall(model, { apiKey: anthropicOAuthToken });
1206
+ });
1207
+
1208
+ it.skipIf(!anthropicOAuthToken)("should handle streaming", { retry: 3 }, async () => {
1209
+ await handleStreaming(model, { apiKey: anthropicOAuthToken });
1210
+ });
1211
+
1212
+ it.skipIf(!anthropicOAuthToken)("should handle thinking", { retry: 3 }, async () => {
1213
+ await handleThinking(model, { apiKey: anthropicOAuthToken, thinkingEnabled: true });
1214
+ });
1215
+
1216
+ it.skipIf(!anthropicOAuthToken)("should handle multi-turn with thinking and tools", { retry: 3 }, async () => {
1217
+ await multiTurn(model, { apiKey: anthropicOAuthToken, thinkingEnabled: true });
1218
+ });
1219
+
1220
+ it.skipIf(!anthropicOAuthToken)("should handle image input", { retry: 3 }, async () => {
1221
+ await handleImage(model, { apiKey: anthropicOAuthToken });
1222
+ });
1223
+ });
1224
+
1225
+ describe("Anthropic OAuth Provider (claude-opus-4-6 with adaptive thinking)", () => {
1226
+ const model = getModel("anthropic", "claude-opus-4-6");
1227
+
1228
+ it.skipIf(!anthropicOAuthToken)("should complete basic text generation", { retry: 3 }, async () => {
1229
+ await basicTextGeneration(model, { apiKey: anthropicOAuthToken });
1230
+ });
1231
+
1232
+ it.skipIf(!anthropicOAuthToken)("should handle tool calling", { retry: 3 }, async () => {
1233
+ await handleToolCall(model, { apiKey: anthropicOAuthToken });
1234
+ });
1235
+
1236
+ it.skipIf(!anthropicOAuthToken)("should handle streaming", { retry: 3 }, async () => {
1237
+ await handleStreaming(model, { apiKey: anthropicOAuthToken });
1238
+ });
1239
+
1240
+ it.skipIf(!anthropicOAuthToken)("should handle adaptive thinking with effort high", { retry: 3 }, async () => {
1241
+ await handleThinking(model, { apiKey: anthropicOAuthToken, thinkingEnabled: true, effort: "high" });
1242
+ });
1243
+
1244
+ it.skipIf(!anthropicOAuthToken)("should handle adaptive thinking with effort medium", { retry: 3 }, async () => {
1245
+ await handleThinking(model, { apiKey: anthropicOAuthToken, thinkingEnabled: true, effort: "medium" });
1246
+ });
1247
+
1248
+ it.skipIf(!anthropicOAuthToken)(
1249
+ "should handle multi-turn with adaptive thinking and tools",
1250
+ { retry: 3 },
1251
+ async () => {
1252
+ await multiTurn(model, { apiKey: anthropicOAuthToken, thinkingEnabled: true, effort: "high" });
1253
+ },
1254
+ );
1255
+
1256
+ it.skipIf(!anthropicOAuthToken)("should handle image input", { retry: 3 }, async () => {
1257
+ await handleImage(model, { apiKey: anthropicOAuthToken });
1258
+ });
1259
+ });
1260
+
1261
+ describe("GitHub Copilot Provider (gpt-5.3-codex via OpenAI Completions)", () => {
1262
+ const llm = getModel("github-copilot", "gpt-5.3-codex");
1263
+
1264
+ it.skipIf(!githubCopilotToken)("should complete basic text generation", { retry: 3 }, async () => {
1265
+ await basicTextGeneration(llm, { apiKey: githubCopilotToken });
1266
+ });
1267
+
1268
+ it.skipIf(!githubCopilotToken)("should handle tool calling", { retry: 3 }, async () => {
1269
+ await handleToolCall(llm, { apiKey: githubCopilotToken });
1270
+ });
1271
+
1272
+ it.skipIf(!githubCopilotToken)("should handle streaming", { retry: 3 }, async () => {
1273
+ await handleStreaming(llm, { apiKey: githubCopilotToken });
1274
+ });
1275
+
1276
+ it.skipIf(!githubCopilotToken)("should handle thinking", { retry: 2 }, async () => {
1277
+ const thinkingModel = getModel("github-copilot", "gpt-5-mini");
1278
+ await handleThinking(thinkingModel, { apiKey: githubCopilotToken, reasoningEffort: "high" });
1279
+ });
1280
+
1281
+ it.skipIf(!githubCopilotToken)("should handle multi-turn with thinking and tools", { retry: 3 }, async () => {
1282
+ const thinkingModel = getModel("github-copilot", "gpt-5-mini");
1283
+ await multiTurn(thinkingModel, { apiKey: githubCopilotToken, reasoningEffort: "high" });
1284
+ });
1285
+
1286
+ it.skipIf(!githubCopilotToken)("should handle image input", { retry: 3 }, async () => {
1287
+ await handleImage(llm, { apiKey: githubCopilotToken });
1288
+ });
1289
+ });
1290
+
1291
+ describe("GitHub Copilot Provider (claude-sonnet-4 via Anthropic Messages)", () => {
1292
+ const llm = getModel("github-copilot", "claude-sonnet-4.6");
1293
+
1294
+ it.skipIf(!githubCopilotToken)("should complete basic text generation", { retry: 3 }, async () => {
1295
+ await basicTextGeneration(llm, { apiKey: githubCopilotToken });
1296
+ });
1297
+
1298
+ it.skipIf(!githubCopilotToken)("should handle tool calling", { retry: 3 }, async () => {
1299
+ await handleToolCall(llm, { apiKey: githubCopilotToken });
1300
+ });
1301
+
1302
+ it.skipIf(!githubCopilotToken)("should handle streaming", { retry: 3 }, async () => {
1303
+ await handleStreaming(llm, { apiKey: githubCopilotToken });
1304
+ });
1305
+
1306
+ it.skipIf(!githubCopilotToken)("should handle thinking", { retry: 2 }, async () => {
1307
+ await handleThinking(llm, { apiKey: githubCopilotToken, thinkingEnabled: true });
1308
+ });
1309
+
1310
+ it.skipIf(!githubCopilotToken)("should handle multi-turn with thinking and tools", { retry: 3 }, async () => {
1311
+ await multiTurn(llm, { apiKey: githubCopilotToken, thinkingEnabled: true });
1312
+ });
1313
+
1314
+ it.skipIf(!githubCopilotToken)("should handle image input", { retry: 3 }, async () => {
1315
+ await handleImage(llm, { apiKey: githubCopilotToken });
1316
+ });
1317
+ });
1318
+
1319
+ describe("OpenAI Codex Provider (gpt-5.4)", () => {
1320
+ const llm = getModel("openai-codex", "gpt-5.4");
1321
+
1322
+ it.skipIf(!openaiCodexToken)("should complete basic text generation", { retry: 3 }, async () => {
1323
+ await basicTextGeneration(llm, { apiKey: openaiCodexToken });
1324
+ });
1325
+
1326
+ it.skipIf(!openaiCodexToken)("should handle tool calling", { retry: 3 }, async () => {
1327
+ await handleToolCall(llm, { apiKey: openaiCodexToken });
1328
+ });
1329
+
1330
+ it.skipIf(!openaiCodexToken)("should handle streaming", { retry: 3 }, async () => {
1331
+ await handleStreaming(llm, { apiKey: openaiCodexToken });
1332
+ });
1333
+
1334
+ it.skipIf(!openaiCodexToken)("should handle thinking", { retry: 3 }, async () => {
1335
+ await handleThinking(llm, { apiKey: openaiCodexToken, reasoningEffort: "high" });
1336
+ });
1337
+
1338
+ it.skipIf(!openaiCodexToken)("should handle multi-turn with thinking and tools", { retry: 3 }, async () => {
1339
+ await multiTurn(llm, { apiKey: openaiCodexToken });
1340
+ });
1341
+
1342
+ it.skipIf(!openaiCodexToken)("should handle image input", { retry: 3 }, async () => {
1343
+ await handleImage(llm, { apiKey: openaiCodexToken });
1344
+ });
1345
+ });
1346
+
1347
+ describe("OpenAI Codex Provider (gpt-5.5)", () => {
1348
+ const llm = getModel("openai-codex", "gpt-5.5");
1349
+
1350
+ it.skipIf(!openaiCodexToken)("should complete basic text generation", { retry: 3 }, async () => {
1351
+ await basicTextGeneration(llm, { apiKey: openaiCodexToken });
1352
+ });
1353
+
1354
+ it.skipIf(!openaiCodexToken)("should handle tool calling", { retry: 3 }, async () => {
1355
+ await handleToolCall(llm, { apiKey: openaiCodexToken });
1356
+ });
1357
+
1358
+ it.skipIf(!openaiCodexToken)("should handle streaming", { retry: 3 }, async () => {
1359
+ await handleStreaming(llm, { apiKey: openaiCodexToken });
1360
+ });
1361
+
1362
+ it.skipIf(!openaiCodexToken)("should handle thinking with reasoningEffort xhigh", { retry: 3 }, async () => {
1363
+ await handleThinking(llm, { apiKey: openaiCodexToken, reasoningEffort: "xhigh" });
1364
+ });
1365
+
1366
+ it.skipIf(!openaiCodexToken)("should handle multi-turn with thinking and tools", { retry: 3 }, async () => {
1367
+ await multiTurn(llm, { apiKey: openaiCodexToken, reasoningEffort: "xhigh" });
1368
+ });
1369
+
1370
+ it.skipIf(!openaiCodexToken)("should handle image input", { retry: 3 }, async () => {
1371
+ await handleImage(llm, { apiKey: openaiCodexToken });
1372
+ });
1373
+ });
1374
+
1375
+ describe("OpenAI Codex Provider (gpt-5.5 via WebSocket)", () => {
1376
+ const llm = getModel("openai-codex", "gpt-5.5");
1377
+ const wsOptions = { apiKey: openaiCodexToken, transport: "websocket" as const };
1378
+
1379
+ it.skipIf(!openaiCodexToken)("should complete basic text generation", { retry: 3 }, async () => {
1380
+ await basicTextGeneration(llm, wsOptions);
1381
+ });
1382
+
1383
+ it.skipIf(!openaiCodexToken)("should handle tool calling", { retry: 3 }, async () => {
1384
+ await handleToolCall(llm, wsOptions);
1385
+ });
1386
+
1387
+ it.skipIf(!openaiCodexToken)("should handle streaming", { retry: 3 }, async () => {
1388
+ await handleStreaming(llm, wsOptions);
1389
+ });
1390
+
1391
+ it.skipIf(!openaiCodexToken)("should handle thinking with reasoningEffort xhigh", { retry: 3 }, async () => {
1392
+ await handleThinking(llm, { ...wsOptions, reasoningEffort: "xhigh" });
1393
+ });
1394
+
1395
+ it.skipIf(!openaiCodexToken)("should handle multi-turn with thinking and tools", { retry: 3 }, async () => {
1396
+ await multiTurn(llm, { ...wsOptions, reasoningEffort: "xhigh" });
1397
+ });
1398
+
1399
+ it.skipIf(!openaiCodexToken)("should handle image input", { retry: 3 }, async () => {
1400
+ await handleImage(llm, wsOptions);
1401
+ });
1402
+ });
1403
+
1404
+ describe.skipIf(!hasBedrockCredentials())("Amazon Bedrock Provider (claude-sonnet-4-5)", () => {
1405
+ const llm = getModel("amazon-bedrock", "global.anthropic.claude-sonnet-4-5-20250929-v1:0");
1406
+
1407
+ it("should complete basic text generation", { retry: 3 }, async () => {
1408
+ await basicTextGeneration(llm);
1409
+ });
1410
+
1411
+ it("should handle tool calling", { retry: 3 }, async () => {
1412
+ await handleToolCall(llm);
1413
+ });
1414
+
1415
+ it("should handle streaming", { retry: 3 }, async () => {
1416
+ await handleStreaming(llm);
1417
+ });
1418
+
1419
+ it("should handle thinking", { retry: 3 }, async () => {
1420
+ await handleThinking(llm, { reasoning: "medium" });
1421
+ });
1422
+
1423
+ it("should handle multi-turn with thinking and tools", { retry: 3 }, async () => {
1424
+ await multiTurn(llm, { reasoning: "high" });
1425
+ });
1426
+
1427
+ it("should handle image input", { retry: 3 }, async () => {
1428
+ await handleImage(llm);
1429
+ });
1430
+ });
1431
+
1432
+ describe.skipIf(!hasBedrockCredentials())("Amazon Bedrock Provider (claude-opus-4-6 interleaved thinking)", () => {
1433
+ const llm = getModel("amazon-bedrock", "global.anthropic.claude-opus-4-6-v1");
1434
+
1435
+ it("should use adaptive thinking without anthropic_beta", { retry: 3 }, async () => {
1436
+ let capturedPayload: unknown;
1437
+ const response = await complete(
1438
+ llm,
1439
+ {
1440
+ systemPrompt: "You are a helpful assistant that uses tools when asked.",
1441
+ messages: [
1442
+ {
1443
+ role: "user",
1444
+ content: "Think first, then calculate 15 + 27 using the math_operation tool.",
1445
+ timestamp: Date.now(),
1446
+ },
1447
+ ],
1448
+ tools: [calculatorTool],
1449
+ },
1450
+ {
1451
+ reasoning: "xhigh",
1452
+ interleavedThinking: true,
1453
+ onPayload: (payload) => {
1454
+ capturedPayload = payload;
1455
+ },
1456
+ },
1457
+ );
1458
+
1459
+ expect(response.stopReason, `Error: ${response.errorMessage}`).not.toBe("error");
1460
+ expect(capturedPayload).toBeTruthy();
1461
+
1462
+ const payload = capturedPayload as {
1463
+ additionalModelRequestFields?: {
1464
+ thinking?: { type?: string; display?: string };
1465
+ output_config?: { effort?: string };
1466
+ anthropic_beta?: string[];
1467
+ };
1468
+ };
1469
+
1470
+ expect(payload.additionalModelRequestFields?.thinking).toEqual({
1471
+ type: "adaptive",
1472
+ display: "summarized",
1473
+ });
1474
+ expect(payload.additionalModelRequestFields?.output_config).toEqual({ effort: "max" });
1475
+ expect(payload.additionalModelRequestFields?.anthropic_beta).toBeUndefined();
1476
+ });
1477
+
1478
+ it("should pass requestMetadata to the SDK payload", { retry: 3 }, async () => {
1479
+ const llmSonnet = getModel("amazon-bedrock", "global.anthropic.claude-sonnet-4-5-20250929-v1:0");
1480
+ let capturedPayload: unknown;
1481
+ const metadata = { app: "pi-test", env: "ci" };
1482
+ const response = await complete(
1483
+ llmSonnet,
1484
+ {
1485
+ messages: [
1486
+ {
1487
+ role: "user",
1488
+ content: "Say hi.",
1489
+ timestamp: Date.now(),
1490
+ },
1491
+ ],
1492
+ },
1493
+ {
1494
+ requestMetadata: metadata,
1495
+ onPayload: (payload) => {
1496
+ capturedPayload = payload;
1497
+ },
1498
+ },
1499
+ );
1500
+
1501
+ expect(response.stopReason, `Error: ${response.errorMessage}`).not.toBe("error");
1502
+ expect(capturedPayload).toBeTruthy();
1503
+ expect((capturedPayload as { requestMetadata?: unknown }).requestMetadata).toEqual(metadata);
1504
+ });
1505
+
1506
+ it("should omit requestMetadata from payload when not provided", { retry: 3 }, async () => {
1507
+ const llmSonnet = getModel("amazon-bedrock", "global.anthropic.claude-sonnet-4-5-20250929-v1:0");
1508
+ let capturedPayload: unknown;
1509
+ const response = await complete(
1510
+ llmSonnet,
1511
+ {
1512
+ messages: [
1513
+ {
1514
+ role: "user",
1515
+ content: "Say hi.",
1516
+ timestamp: Date.now(),
1517
+ },
1518
+ ],
1519
+ },
1520
+ {
1521
+ onPayload: (payload) => {
1522
+ capturedPayload = payload;
1523
+ },
1524
+ },
1525
+ );
1526
+
1527
+ expect(response.stopReason, `Error: ${response.errorMessage}`).not.toBe("error");
1528
+ expect(capturedPayload).toBeTruthy();
1529
+ expect("requestMetadata" in (capturedPayload as object)).toBe(false);
1530
+ });
1531
+ });
1532
+
1533
+ // Check if ollama is installed and local LLM tests are enabled
1534
+ let ollamaInstalled = false;
1535
+ if (!process.env.PI_NO_LOCAL_LLM) {
1536
+ try {
1537
+ execSync("which ollama", { stdio: "ignore" });
1538
+ ollamaInstalled = true;
1539
+ } catch {
1540
+ ollamaInstalled = false;
1541
+ }
1542
+ }
1543
+
1544
+ describe.skipIf(!ollamaInstalled)("Ollama Provider (gpt-oss-20b via OpenAI Completions)", () => {
1545
+ let llm: Model<"openai-completions">;
1546
+ let ollamaProcess: ChildProcess | null = null;
1547
+
1548
+ beforeAll(async () => {
1549
+ // Check if model is available, if not pull it
1550
+ try {
1551
+ execSync("ollama list | grep -q 'gpt-oss:20b'", { stdio: "ignore" });
1552
+ } catch {
1553
+ console.log("Pulling gpt-oss:20b model for Ollama tests...");
1554
+ try {
1555
+ execSync("ollama pull gpt-oss:20b", { stdio: "inherit" });
1556
+ } catch (_e) {
1557
+ console.warn("Failed to pull gpt-oss:20b model, tests will be skipped");
1558
+ return;
1559
+ }
1560
+ }
1561
+
1562
+ // Start ollama server
1563
+ ollamaProcess = spawn("ollama", ["serve"], {
1564
+ detached: false,
1565
+ stdio: "ignore",
1566
+ });
1567
+
1568
+ // Wait for server to be ready
1569
+ await new Promise<void>((resolve) => {
1570
+ const checkServer = async () => {
1571
+ try {
1572
+ const response = await fetch("http://localhost:11434/api/tags");
1573
+ if (response.ok) {
1574
+ resolve();
1575
+ } else {
1576
+ setTimeout(checkServer, 500);
1577
+ }
1578
+ } catch {
1579
+ setTimeout(checkServer, 500);
1580
+ }
1581
+ };
1582
+ setTimeout(checkServer, 1000); // Initial delay
1583
+ });
1584
+
1585
+ llm = {
1586
+ id: "gpt-oss:20b",
1587
+ api: "openai-completions",
1588
+ provider: "ollama",
1589
+ baseUrl: "http://localhost:11434/v1",
1590
+ reasoning: true,
1591
+ input: ["text"],
1592
+ contextWindow: 128000,
1593
+ maxTokens: 16000,
1594
+ cost: {
1595
+ input: 0,
1596
+ output: 0,
1597
+ cacheRead: 0,
1598
+ cacheWrite: 0,
1599
+ },
1600
+ name: "Ollama GPT-OSS 20B",
1601
+ };
1602
+ }, 30000); // 30 second timeout for setup
1603
+
1604
+ afterAll(() => {
1605
+ // Kill ollama server
1606
+ if (ollamaProcess) {
1607
+ ollamaProcess.kill("SIGTERM");
1608
+ ollamaProcess = null;
1609
+ }
1610
+ });
1611
+
1612
+ it("should complete basic text generation", { retry: 3 }, async () => {
1613
+ await basicTextGeneration(llm, { apiKey: "test" });
1614
+ });
1615
+
1616
+ it("should handle tool calling", { retry: 3 }, async () => {
1617
+ await handleToolCall(llm, { apiKey: "test" });
1618
+ });
1619
+
1620
+ it("should handle streaming", { retry: 3 }, async () => {
1621
+ await handleStreaming(llm, { apiKey: "test" });
1622
+ });
1623
+
1624
+ it("should handle thinking mode", { retry: 3 }, async () => {
1625
+ await handleThinking(llm, { apiKey: "test", reasoningEffort: "medium" });
1626
+ });
1627
+
1628
+ it("should handle multi-turn with thinking and tools", { retry: 3 }, async () => {
1629
+ await multiTurn(llm, { apiKey: "test", reasoningEffort: "medium" });
1630
+ });
1631
+ });
1632
+ });