@code-yeongyu/senpi 2026.9.7 → 2026.9.8

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 (323) hide show
  1. package/CHANGELOG.md +79 -0
  2. package/dist/core/agent-session.d.ts +40 -3
  3. package/dist/core/agent-session.d.ts.map +1 -1
  4. package/dist/core/agent-session.js +159 -40
  5. package/dist/core/agent-session.js.map +1 -1
  6. package/dist/core/compaction/compaction.d.ts.map +1 -1
  7. package/dist/core/compaction/compaction.js +2 -1
  8. package/dist/core/compaction/compaction.js.map +1 -1
  9. package/dist/core/dynamic-prompt/working-task.js +1 -1
  10. package/dist/core/dynamic-prompt/working-task.js.map +1 -1
  11. package/dist/core/extensions/builtin/cache-keepalive/index.d.ts.map +1 -1
  12. package/dist/core/extensions/builtin/cache-keepalive/index.js +4 -21
  13. package/dist/core/extensions/builtin/cache-keepalive/index.js.map +1 -1
  14. package/dist/core/extensions/builtin/claude-sdk-oauth/account-command.d.ts +2 -0
  15. package/dist/core/extensions/builtin/claude-sdk-oauth/account-command.d.ts.map +1 -1
  16. package/dist/core/extensions/builtin/claude-sdk-oauth/account-command.js +10 -25
  17. package/dist/core/extensions/builtin/claude-sdk-oauth/account-command.js.map +1 -1
  18. package/dist/core/extensions/builtin/claude-sdk-oauth/session-binding.d.ts.map +1 -1
  19. package/dist/core/extensions/builtin/claude-sdk-oauth/session-binding.js +36 -19
  20. package/dist/core/extensions/builtin/claude-sdk-oauth/session-binding.js.map +1 -1
  21. package/dist/core/extensions/builtin/claude-sdk-oauth/session-commit-boundary.d.ts.map +1 -1
  22. package/dist/core/extensions/builtin/claude-sdk-oauth/session-commit-boundary.js +21 -10
  23. package/dist/core/extensions/builtin/claude-sdk-oauth/session-commit-boundary.js.map +1 -1
  24. package/dist/core/extensions/builtin/claude-sdk-oauth/session-continuity.d.ts +4 -17
  25. package/dist/core/extensions/builtin/claude-sdk-oauth/session-continuity.d.ts.map +1 -1
  26. package/dist/core/extensions/builtin/claude-sdk-oauth/session-continuity.js +23 -33
  27. package/dist/core/extensions/builtin/claude-sdk-oauth/session-continuity.js.map +1 -1
  28. package/dist/core/extensions/builtin/claude-sdk-oauth/session-stream.d.ts.map +1 -1
  29. package/dist/core/extensions/builtin/claude-sdk-oauth/session-stream.js +1 -0
  30. package/dist/core/extensions/builtin/claude-sdk-oauth/session-stream.js.map +1 -1
  31. package/dist/core/extensions/builtin/claude-sdk-oauth/session-sync.d.ts.map +1 -1
  32. package/dist/core/extensions/builtin/claude-sdk-oauth/session-sync.js +5 -3
  33. package/dist/core/extensions/builtin/claude-sdk-oauth/session-sync.js.map +1 -1
  34. package/dist/core/extensions/builtin/claude-sdk-oauth/session-turn-attempt.d.ts.map +1 -1
  35. package/dist/core/extensions/builtin/claude-sdk-oauth/session-turn-attempt.js +8 -3
  36. package/dist/core/extensions/builtin/claude-sdk-oauth/session-turn-attempt.js.map +1 -1
  37. package/dist/core/extensions/builtin/claude-sdk-oauth/tools.d.ts +6 -5
  38. package/dist/core/extensions/builtin/claude-sdk-oauth/tools.d.ts.map +1 -1
  39. package/dist/core/extensions/builtin/claude-sdk-oauth/tools.js +6 -5
  40. package/dist/core/extensions/builtin/claude-sdk-oauth/tools.js.map +1 -1
  41. package/dist/core/extensions/builtin/compaction/circuit-breaker.d.ts +8 -0
  42. package/dist/core/extensions/builtin/compaction/circuit-breaker.d.ts.map +1 -1
  43. package/dist/core/extensions/builtin/compaction/circuit-breaker.js +8 -0
  44. package/dist/core/extensions/builtin/compaction/circuit-breaker.js.map +1 -1
  45. package/dist/core/extensions/builtin/compaction/deterministic-fallback.d.ts +8 -0
  46. package/dist/core/extensions/builtin/compaction/deterministic-fallback.d.ts.map +1 -1
  47. package/dist/core/extensions/builtin/compaction/deterministic-fallback.js +125 -20
  48. package/dist/core/extensions/builtin/compaction/deterministic-fallback.js.map +1 -1
  49. package/dist/core/extensions/builtin/compaction/fallback-failed-turn-normalization.d.ts +18 -0
  50. package/dist/core/extensions/builtin/compaction/fallback-failed-turn-normalization.d.ts.map +1 -0
  51. package/dist/core/extensions/builtin/compaction/fallback-failed-turn-normalization.js +20 -0
  52. package/dist/core/extensions/builtin/compaction/fallback-failed-turn-normalization.js.map +1 -0
  53. package/dist/core/extensions/builtin/compaction/index.d.ts.map +1 -1
  54. package/dist/core/extensions/builtin/compaction/index.js +54 -11
  55. package/dist/core/extensions/builtin/compaction/index.js.map +1 -1
  56. package/dist/core/extensions/builtin/compaction/lane-policy.d.ts +3 -0
  57. package/dist/core/extensions/builtin/compaction/lane-policy.d.ts.map +1 -1
  58. package/dist/core/extensions/builtin/compaction/lane-policy.js +47 -23
  59. package/dist/core/extensions/builtin/compaction/lane-policy.js.map +1 -1
  60. package/dist/core/extensions/builtin/goal/agent-end-continuation.d.ts.map +1 -1
  61. package/dist/core/extensions/builtin/goal/agent-end-continuation.js +11 -0
  62. package/dist/core/extensions/builtin/goal/agent-end-continuation.js.map +1 -1
  63. package/dist/core/extensions/builtin/goal/cache-warm-renderer.js +6 -4
  64. package/dist/core/extensions/builtin/goal/cache-warm-renderer.js.map +1 -1
  65. package/dist/core/extensions/builtin/goal/cache-warm.d.ts +25 -1
  66. package/dist/core/extensions/builtin/goal/cache-warm.d.ts.map +1 -1
  67. package/dist/core/extensions/builtin/goal/cache-warm.js +29 -10
  68. package/dist/core/extensions/builtin/goal/cache-warm.js.map +1 -1
  69. package/dist/core/extensions/builtin/goal/continuation.d.ts +3 -1
  70. package/dist/core/extensions/builtin/goal/continuation.d.ts.map +1 -1
  71. package/dist/core/extensions/builtin/goal/continuation.js +17 -2
  72. package/dist/core/extensions/builtin/goal/continuation.js.map +1 -1
  73. package/dist/core/extensions/builtin/goal/lifecycle-helpers.d.ts.map +1 -1
  74. package/dist/core/extensions/builtin/goal/lifecycle-helpers.js +1 -0
  75. package/dist/core/extensions/builtin/goal/lifecycle-helpers.js.map +1 -1
  76. package/dist/core/extensions/builtin/goal/monitor-continuation.d.ts +1 -1
  77. package/dist/core/extensions/builtin/goal/monitor-continuation.d.ts.map +1 -1
  78. package/dist/core/extensions/builtin/goal/monitor-continuation.js +8 -3
  79. package/dist/core/extensions/builtin/goal/monitor-continuation.js.map +1 -1
  80. package/dist/core/extensions/builtin/gpt-account.d.ts +5 -1
  81. package/dist/core/extensions/builtin/gpt-account.d.ts.map +1 -1
  82. package/dist/core/extensions/builtin/gpt-account.js +9 -26
  83. package/dist/core/extensions/builtin/gpt-account.js.map +1 -1
  84. package/dist/core/extensions/builtin/hooks/plugin-manifest.js +2 -2
  85. package/dist/core/extensions/builtin/hooks/plugin-manifest.js.map +1 -1
  86. package/dist/core/extensions/builtin/hooks/safety.js +2 -2
  87. package/dist/core/extensions/builtin/hooks/safety.js.map +1 -1
  88. package/dist/core/extensions/builtin/monitor-state-event.d.ts +18 -0
  89. package/dist/core/extensions/builtin/monitor-state-event.d.ts.map +1 -1
  90. package/dist/core/extensions/builtin/monitor-state-event.js +23 -0
  91. package/dist/core/extensions/builtin/monitor-state-event.js.map +1 -1
  92. package/dist/core/extensions/builtin/oauth-login-interaction.d.ts +24 -0
  93. package/dist/core/extensions/builtin/oauth-login-interaction.d.ts.map +1 -0
  94. package/dist/core/extensions/builtin/oauth-login-interaction.js +77 -0
  95. package/dist/core/extensions/builtin/oauth-login-interaction.js.map +1 -0
  96. package/dist/core/extensions/builtin/permission-system/external-dir.d.ts.map +1 -1
  97. package/dist/core/extensions/builtin/permission-system/external-dir.js +5 -51
  98. package/dist/core/extensions/builtin/permission-system/external-dir.js.map +1 -1
  99. package/dist/core/extensions/builtin/permission-system/parsers.d.ts.map +1 -1
  100. package/dist/core/extensions/builtin/permission-system/parsers.js +5 -7
  101. package/dist/core/extensions/builtin/permission-system/parsers.js.map +1 -1
  102. package/dist/core/extensions/builtin/prompt-preset/claude-fable-5-1.js +1 -1
  103. package/dist/core/extensions/builtin/prompt-preset/claude-fable-5-1.js.map +1 -1
  104. package/dist/core/extensions/builtin/prompt-preset/claude-fable-5.js +1 -1
  105. package/dist/core/extensions/builtin/prompt-preset/claude-fable-5.js.map +1 -1
  106. package/dist/core/extensions/builtin/prompt-preset/execution-tooling.d.ts +14 -7
  107. package/dist/core/extensions/builtin/prompt-preset/execution-tooling.d.ts.map +1 -1
  108. package/dist/core/extensions/builtin/prompt-preset/execution-tooling.js +34 -13
  109. package/dist/core/extensions/builtin/prompt-preset/execution-tooling.js.map +1 -1
  110. package/dist/core/extensions/builtin/prompt-preset/gpt-5.6.d.ts +6 -10
  111. package/dist/core/extensions/builtin/prompt-preset/gpt-5.6.d.ts.map +1 -1
  112. package/dist/core/extensions/builtin/prompt-preset/gpt-5.6.js +14 -9
  113. package/dist/core/extensions/builtin/prompt-preset/gpt-5.6.js.map +1 -1
  114. package/dist/core/extensions/builtin/prompt-preset/gpt-6-astra.d.ts +15 -15
  115. package/dist/core/extensions/builtin/prompt-preset/gpt-6-astra.d.ts.map +1 -1
  116. package/dist/core/extensions/builtin/prompt-preset/gpt-6-astra.js +49 -21
  117. package/dist/core/extensions/builtin/prompt-preset/gpt-6-astra.js.map +1 -1
  118. package/dist/core/extensions/builtin/prompt-preset/kimi-k3.js +1 -1
  119. package/dist/core/extensions/builtin/prompt-preset/kimi-k3.js.map +1 -1
  120. package/dist/core/extensions/builtin/service-tier.d.ts +2 -0
  121. package/dist/core/extensions/builtin/service-tier.d.ts.map +1 -1
  122. package/dist/core/extensions/builtin/service-tier.js +17 -1
  123. package/dist/core/extensions/builtin/service-tier.js.map +1 -1
  124. package/dist/core/extensions/builtin/terminal/durable-command.d.ts.map +1 -1
  125. package/dist/core/extensions/builtin/terminal/durable-command.js +3 -0
  126. package/dist/core/extensions/builtin/terminal/durable-command.js.map +1 -1
  127. package/dist/core/extensions/builtin/terminal/durable-file.d.ts.map +1 -1
  128. package/dist/core/extensions/builtin/terminal/durable-file.js +2 -0
  129. package/dist/core/extensions/builtin/terminal/durable-file.js.map +1 -1
  130. package/dist/core/extensions/builtin/terminal/extension.d.ts.map +1 -1
  131. package/dist/core/extensions/builtin/terminal/extension.js +14 -2
  132. package/dist/core/extensions/builtin/terminal/extension.js.map +1 -1
  133. package/dist/core/extensions/builtin/terminal/monitor-notify.d.ts.map +1 -1
  134. package/dist/core/extensions/builtin/terminal/monitor-notify.js +27 -5
  135. package/dist/core/extensions/builtin/terminal/monitor-notify.js.map +1 -1
  136. package/dist/core/extensions/builtin/terminal/monitor-registry.d.ts +17 -0
  137. package/dist/core/extensions/builtin/terminal/monitor-registry.d.ts.map +1 -1
  138. package/dist/core/extensions/builtin/terminal/monitor-registry.js +76 -14
  139. package/dist/core/extensions/builtin/terminal/monitor-registry.js.map +1 -1
  140. package/dist/core/extensions/builtin/terminal/notify.d.ts +2 -0
  141. package/dist/core/extensions/builtin/terminal/notify.d.ts.map +1 -1
  142. package/dist/core/extensions/builtin/terminal/notify.js +6 -1
  143. package/dist/core/extensions/builtin/terminal/notify.js.map +1 -1
  144. package/dist/core/extensions/builtin/terminal/session-bundle.d.ts +3 -1
  145. package/dist/core/extensions/builtin/terminal/session-bundle.d.ts.map +1 -1
  146. package/dist/core/extensions/builtin/terminal/session-bundle.js +13 -0
  147. package/dist/core/extensions/builtin/terminal/session-bundle.js.map +1 -1
  148. package/dist/core/extensions/builtin/terminal/shared.d.ts +13 -2
  149. package/dist/core/extensions/builtin/terminal/shared.d.ts.map +1 -1
  150. package/dist/core/extensions/builtin/terminal/shared.js +15 -2
  151. package/dist/core/extensions/builtin/terminal/shared.js.map +1 -1
  152. package/dist/core/extensions/builtin/terminal/tools/monitor.d.ts.map +1 -1
  153. package/dist/core/extensions/builtin/terminal/tools/monitor.js +8 -1
  154. package/dist/core/extensions/builtin/terminal/tools/monitor.js.map +1 -1
  155. package/dist/core/extensions/builtin/tool-search/index.d.ts.map +1 -1
  156. package/dist/core/extensions/builtin/tool-search/index.js +1 -0
  157. package/dist/core/extensions/builtin/tool-search/index.js.map +1 -1
  158. package/dist/core/extensions/builtin/tool-search/service.d.ts +4 -0
  159. package/dist/core/extensions/builtin/tool-search/service.d.ts.map +1 -1
  160. package/dist/core/extensions/builtin/tool-search/service.js +11 -0
  161. package/dist/core/extensions/builtin/tool-search/service.js.map +1 -1
  162. package/dist/core/extensions/runner.d.ts +1 -0
  163. package/dist/core/extensions/runner.d.ts.map +1 -1
  164. package/dist/core/extensions/runner.js +8 -1
  165. package/dist/core/extensions/runner.js.map +1 -1
  166. package/dist/core/extensions/types.d.ts +9 -0
  167. package/dist/core/extensions/types.d.ts.map +1 -1
  168. package/dist/core/extensions/types.js.map +1 -1
  169. package/dist/core/high-reasoning-warning.d.ts.map +1 -1
  170. package/dist/core/high-reasoning-warning.js +4 -6
  171. package/dist/core/high-reasoning-warning.js.map +1 -1
  172. package/dist/core/sdk.d.ts +1 -1
  173. package/dist/core/sdk.d.ts.map +1 -1
  174. package/dist/core/sdk.js +25 -6
  175. package/dist/core/sdk.js.map +1 -1
  176. package/dist/core/settings-manager.js +1 -1
  177. package/dist/core/settings-manager.js.map +1 -1
  178. package/dist/core/settings-shapes.js.map +1 -1
  179. package/dist/core/tools/bounded-realpath.d.ts +28 -0
  180. package/dist/core/tools/bounded-realpath.d.ts.map +1 -0
  181. package/dist/core/tools/bounded-realpath.js +53 -0
  182. package/dist/core/tools/bounded-realpath.js.map +1 -0
  183. package/dist/core/tools/file-mutation-queue.d.ts.map +1 -1
  184. package/dist/core/tools/file-mutation-queue.js +15 -13
  185. package/dist/core/tools/file-mutation-queue.js.map +1 -1
  186. package/dist/core/tools/filesystem-policy.d.ts +7 -0
  187. package/dist/core/tools/filesystem-policy.d.ts.map +1 -1
  188. package/dist/core/tools/filesystem-policy.js +25 -15
  189. package/dist/core/tools/filesystem-policy.js.map +1 -1
  190. package/dist/core/trust-manager.d.ts.map +1 -1
  191. package/dist/core/trust-manager.js +13 -2
  192. package/dist/core/trust-manager.js.map +1 -1
  193. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  194. package/dist/modes/interactive/interactive-mode.js +1 -0
  195. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  196. package/dist/modes/interactive/tips/catalog/memory-tips.d.ts.map +1 -1
  197. package/dist/modes/interactive/tips/catalog/memory-tips.js +6 -0
  198. package/dist/modes/interactive/tips/catalog/memory-tips.js.map +1 -1
  199. package/dist/modes/interactive/tips/catalog/subagent-tips.d.ts.map +1 -1
  200. package/dist/modes/interactive/tips/catalog/subagent-tips.js +6 -0
  201. package/dist/modes/interactive/tips/catalog/subagent-tips.js.map +1 -1
  202. package/dist/modes/rpc/host-lifecycle.d.ts.map +1 -1
  203. package/dist/modes/rpc/host-lifecycle.js +31 -5
  204. package/dist/modes/rpc/host-lifecycle.js.map +1 -1
  205. package/dist/modes/rpc/host-watchdog.d.ts +11 -0
  206. package/dist/modes/rpc/host-watchdog.d.ts.map +1 -1
  207. package/dist/modes/rpc/host-watchdog.js +16 -2
  208. package/dist/modes/rpc/host-watchdog.js.map +1 -1
  209. package/dist/modes/rpc/multi-session-host.d.ts.map +1 -1
  210. package/dist/modes/rpc/multi-session-host.js +54 -16
  211. package/dist/modes/rpc/multi-session-host.js.map +1 -1
  212. package/dist/modes/rpc/socket-ownership.d.ts +46 -0
  213. package/dist/modes/rpc/socket-ownership.d.ts.map +1 -0
  214. package/dist/modes/rpc/socket-ownership.js +178 -0
  215. package/dist/modes/rpc/socket-ownership.js.map +1 -0
  216. package/dist/utils/fs-watch.d.ts +17 -0
  217. package/dist/utils/fs-watch.d.ts.map +1 -1
  218. package/dist/utils/fs-watch.js +38 -10
  219. package/dist/utils/fs-watch.js.map +1 -1
  220. package/dist/utils/paths.d.ts +33 -0
  221. package/dist/utils/paths.d.ts.map +1 -1
  222. package/dist/utils/paths.js +109 -3
  223. package/dist/utils/paths.js.map +1 -1
  224. package/docs/development.md +3 -2
  225. package/docs/providers.md +5 -1
  226. package/docs/settings.md +1 -0
  227. package/node_modules/@code-yeongyu/senpi-codemode/CHANGELOG.md +31 -0
  228. package/node_modules/@code-yeongyu/senpi-codemode/README.md +14 -1
  229. package/node_modules/@code-yeongyu/senpi-codemode/package.json +4 -4
  230. package/node_modules/@code-yeongyu/senpi-codemode/src/bridge/protocol.ts +1 -0
  231. package/node_modules/@code-yeongyu/senpi-codemode/src/extension/runtime-factory.ts +3 -0
  232. package/node_modules/@code-yeongyu/senpi-codemode/src/extension/session-manager.ts +7 -0
  233. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/AGENTS.md +7 -0
  234. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/jl/kernel.ts +4 -0
  235. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/kernel-contract.ts +3 -0
  236. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/worker-core.js +29 -0
  237. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/worker-indirect-eval.js +10 -6
  238. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/worker-shell-capture.d.ts +16 -0
  239. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/worker-shell-capture.js +44 -8
  240. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/worker-startup.ts +1 -0
  241. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/py/kernel-contract.ts +3 -0
  242. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/py/transport.ts +9 -1
  243. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/rb/kernel.ts +4 -0
  244. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/session-env.ts +56 -0
  245. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/shared/subprocess-contract.ts +3 -0
  246. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/shared/subprocess-kernel.ts +9 -1
  247. package/node_modules/@code-yeongyu/senpi-codemode/src/output/output-meta.ts +26 -2
  248. package/node_modules/@code-yeongyu/senpi-codemode/src/prompt/eval-prompt.ts +17 -24
  249. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/image.ts +12 -3
  250. package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.d.ts.map +1 -1
  251. package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.js +2 -2
  252. package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.js.map +1 -1
  253. package/node_modules/@earendil-works/pi-agent-core/dist/assistant-terminal-state.d.ts +7 -0
  254. package/node_modules/@earendil-works/pi-agent-core/dist/assistant-terminal-state.d.ts.map +1 -1
  255. package/node_modules/@earendil-works/pi-agent-core/dist/assistant-terminal-state.js +19 -0
  256. package/node_modules/@earendil-works/pi-agent-core/dist/assistant-terminal-state.js.map +1 -1
  257. package/node_modules/@earendil-works/pi-agent-core/dist/empty-assistant-recovery.d.ts.map +1 -1
  258. package/node_modules/@earendil-works/pi-agent-core/dist/empty-assistant-recovery.js +24 -16
  259. package/node_modules/@earendil-works/pi-agent-core/dist/empty-assistant-recovery.js.map +1 -1
  260. package/node_modules/@earendil-works/pi-agent-core/dist/index.d.ts +1 -1
  261. package/node_modules/@earendil-works/pi-agent-core/dist/index.d.ts.map +1 -1
  262. package/node_modules/@earendil-works/pi-agent-core/dist/index.js +1 -1
  263. package/node_modules/@earendil-works/pi-agent-core/dist/index.js.map +1 -1
  264. package/node_modules/@earendil-works/pi-agent-core/package.json +3 -3
  265. package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.d.ts.map +1 -1
  266. package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.js +47 -178
  267. package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.js.map +1 -1
  268. package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-tool-references.d.ts +3 -0
  269. package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-tool-references.d.ts.map +1 -0
  270. package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-tool-references.js +260 -0
  271. package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-tool-references.js.map +1 -0
  272. package/node_modules/@earendil-works/pi-ai/dist/api/openai-codex-responses.d.ts.map +1 -1
  273. package/node_modules/@earendil-works/pi-ai/dist/api/openai-codex-responses.js +1 -0
  274. package/node_modules/@earendil-works/pi-ai/dist/api/openai-codex-responses.js.map +1 -1
  275. package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses.d.ts.map +1 -1
  276. package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses.js +1 -0
  277. package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses.js.map +1 -1
  278. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/anthropic-callback-listener.d.ts +40 -0
  279. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/anthropic-callback-listener.d.ts.map +1 -0
  280. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/anthropic-callback-listener.js +138 -0
  281. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/anthropic-callback-listener.js.map +1 -0
  282. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/anthropic.d.ts +2 -3
  283. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/anthropic.d.ts.map +1 -1
  284. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/anthropic.js +42 -139
  285. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/anthropic.js.map +1 -1
  286. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/authorization-input.d.ts +6 -0
  287. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/authorization-input.d.ts.map +1 -0
  288. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/authorization-input.js +29 -0
  289. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/authorization-input.js.map +1 -0
  290. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/error-details.d.ts +3 -0
  291. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/error-details.d.ts.map +1 -0
  292. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/error-details.js +20 -0
  293. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/error-details.js.map +1 -0
  294. package/node_modules/@earendil-works/pi-ai/dist/providers/data/.manifest.json +1 -1
  295. package/node_modules/@earendil-works/pi-ai/dist/providers/data/amazon-bedrock.json +1 -1
  296. package/node_modules/@earendil-works/pi-ai/dist/providers/data/azure-openai-responses.json +1 -1
  297. package/node_modules/@earendil-works/pi-ai/dist/providers/data/fireworks.json +1 -1
  298. package/node_modules/@earendil-works/pi-ai/dist/providers/data/github-copilot.json +1 -1
  299. package/node_modules/@earendil-works/pi-ai/dist/providers/data/openai-codex.json +1 -1
  300. package/node_modules/@earendil-works/pi-ai/dist/providers/data/openai.json +1 -1
  301. package/node_modules/@earendil-works/pi-ai/dist/providers/data/opencode.json +1 -1
  302. package/node_modules/@earendil-works/pi-ai/dist/providers/data/opengateway.json +1 -1
  303. package/node_modules/@earendil-works/pi-ai/dist/providers/data/openrouter.json +1 -1
  304. package/node_modules/@earendil-works/pi-ai/dist/providers/data/vercel-ai-gateway.json +1 -1
  305. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-stream-terminal.d.ts.map +1 -1
  306. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-stream-terminal.js +16 -1
  307. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-stream-terminal.js.map +1 -1
  308. package/node_modules/@earendil-works/pi-ai/dist/types.d.ts +7 -0
  309. package/node_modules/@earendil-works/pi-ai/dist/types.d.ts.map +1 -1
  310. package/node_modules/@earendil-works/pi-ai/dist/types.js.map +1 -1
  311. package/node_modules/@earendil-works/pi-ai/dist/utils/overflow.d.ts +1 -1
  312. package/node_modules/@earendil-works/pi-ai/dist/utils/overflow.d.ts.map +1 -1
  313. package/node_modules/@earendil-works/pi-ai/dist/utils/overflow.js +14 -3
  314. package/node_modules/@earendil-works/pi-ai/dist/utils/overflow.js.map +1 -1
  315. package/node_modules/@earendil-works/pi-ai/dist/utils/server-fallback-receipt.d.ts +2 -1
  316. package/node_modules/@earendil-works/pi-ai/dist/utils/server-fallback-receipt.d.ts.map +1 -1
  317. package/node_modules/@earendil-works/pi-ai/dist/utils/server-fallback-receipt.js +16 -0
  318. package/node_modules/@earendil-works/pi-ai/dist/utils/server-fallback-receipt.js.map +1 -1
  319. package/node_modules/@earendil-works/pi-ai/package.json +2 -2
  320. package/node_modules/@earendil-works/pi-pty/package.json +1 -1
  321. package/node_modules/@earendil-works/pi-telemetry/package.json +1 -1
  322. package/node_modules/@earendil-works/pi-tui/package.json +1 -1
  323. package/package.json +7 -7
@@ -0,0 +1,3 @@
1
+ import type { MessageCreateParamsStreaming } from "@anthropic-ai/sdk/resources/beta/messages/messages.js";
2
+ export declare function demoteUnavailableToolReferences(params: MessageCreateParamsStreaming): MessageCreateParamsStreaming;
3
+ //# sourceMappingURL=anthropic-tool-references.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anthropic-tool-references.d.ts","sourceRoot":"","sources":["../../src/api/anthropic-tool-references.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEX,4BAA4B,EAE5B,MAAM,uDAAuD,CAAC;AA4F/D,wBAAgB,+BAA+B,CAAC,MAAM,EAAE,4BAA4B,GAAG,4BAA4B,CAkIlH"}
@@ -0,0 +1,260 @@
1
+ import { demotedToolCallText, demotedToolResultText } from "../utils/unavailable-tool-text.js";
2
+ function isRecord(value) {
3
+ return typeof value === "object" && value !== null;
4
+ }
5
+ /**
6
+ * Anthropic validates that every tool referenced by the message history is
7
+ * available in the same request — defined in `tools` or discovered through a
8
+ * `tool_reference` block — and rejects the whole request otherwise
9
+ * ("Tool reference '<name>' not found in available tools"). Sessions outlive
10
+ * their tools: an MCP server can be absent after a resume, an extension can
11
+ * stop registering a tool, or a payload hook can strip a definition while the
12
+ * history still carries the call. Demote those references to plain text so
13
+ * the turn can proceed; the matching tool_result is demoted in lockstep so no
14
+ * orphan pairing error replaces the original one.
15
+ *
16
+ * Availability is decided by the request's `tools` array alone. A discovered
17
+ * name never stands in for a missing definition: a `tool_reference` without a
18
+ * definition is itself rejected, so it cannot keep a later `tool_use` alive.
19
+ *
20
+ * Native tool search results (`tool_search_tool_result`) replay verbatim on the
21
+ * same model, and the wire path can hand their references back under a gateway
22
+ * namespace (`mcp__<id>__<tool>`) that senpi never defined and that does not
23
+ * survive across requests. Those references are folded back to the request's
24
+ * own tool names; a reference that still does not resolve is dropped, and a
25
+ * search pair left with no references is demoted to text.
26
+ *
27
+ * The same wire path can also recase the tool it namespaces (`memory` comes
28
+ * back as `mcp__a4e6__Memory`, `lsp_symbols` as `mcp__a4e6__LspSymbols`), so
29
+ * the suffix alone no longer matches the request's tool name byte for byte.
30
+ * Names are therefore compared with case and `_`/`-` separators folded away,
31
+ * and a folded key resolves only when exactly one request tool owns it: the
32
+ * fold never guesses between two candidates.
33
+ */
34
+ const GATEWAY_TOOL_NAMESPACE = /^mcp__[^_]+__(.+)$/;
35
+ function foldToolNameKey(name) {
36
+ return name.toLowerCase().replaceAll(/[-_]/g, "");
37
+ }
38
+ function collectAvailableToolNames(tools) {
39
+ const defined = new Set();
40
+ if (Array.isArray(tools)) {
41
+ for (const tool of tools) {
42
+ if (isRecord(tool) && typeof tool.name === "string")
43
+ defined.add(tool.name);
44
+ }
45
+ }
46
+ const folded = new Map();
47
+ const ambiguous = new Set();
48
+ for (const name of defined) {
49
+ const key = foldToolNameKey(name);
50
+ if (folded.has(key))
51
+ ambiguous.add(key);
52
+ else
53
+ folded.set(key, name);
54
+ }
55
+ for (const key of ambiguous)
56
+ folded.delete(key);
57
+ return { defined, folded };
58
+ }
59
+ function resolveAvailableToolName(name, available) {
60
+ const suffix = GATEWAY_TOOL_NAMESPACE.exec(name)?.[1];
61
+ const candidates = suffix === undefined ? [name] : [name, suffix];
62
+ for (const candidate of candidates) {
63
+ if (available.defined.has(candidate))
64
+ return candidate;
65
+ }
66
+ for (const candidate of candidates) {
67
+ const folded = available.folded.get(foldToolNameKey(candidate));
68
+ if (folded !== undefined)
69
+ return folded;
70
+ }
71
+ return undefined;
72
+ }
73
+ function isNativeToolSearchResultBlock(block) {
74
+ return (isRecord(block) &&
75
+ block.type === "tool_search_tool_result" &&
76
+ typeof block.tool_use_id === "string" &&
77
+ isRecord(block.content) &&
78
+ Array.isArray(block.content.tool_references));
79
+ }
80
+ export function demoteUnavailableToolReferences(params) {
81
+ const messages = params.messages;
82
+ if (!Array.isArray(messages) || messages.length === 0)
83
+ return params;
84
+ const available = collectAvailableToolNames(params.tools);
85
+ const resolve = (name) => resolveAvailableToolName(name, available);
86
+ const demotedCallNames = new Map();
87
+ const renamedCallNames = new Map();
88
+ for (const message of messages) {
89
+ if (message.role !== "assistant" || !Array.isArray(message.content))
90
+ continue;
91
+ for (const block of message.content) {
92
+ if (!isRecord(block) || block.type !== "tool_use" || typeof block.name !== "string")
93
+ continue;
94
+ const resolved = resolve(block.name);
95
+ if (resolved === undefined)
96
+ demotedCallNames.set(block.id, block.name);
97
+ else if (resolved !== block.name)
98
+ renamedCallNames.set(block.id, resolved);
99
+ }
100
+ }
101
+ let changed = false;
102
+ const availableToolNames = [...available.defined];
103
+ const seenDemotedCallNames = new Set();
104
+ const rewrittenMessages = [];
105
+ for (const message of messages) {
106
+ if (!Array.isArray(message.content)) {
107
+ rewrittenMessages.push(message);
108
+ continue;
109
+ }
110
+ let messageChanged = false;
111
+ // A native search pair whose every reference stopped resolving is demoted
112
+ // as a unit: the result decides, and its `server_tool_use` follows.
113
+ const droppedSearchUseIds = new Set();
114
+ const droppedSearchNames = new Map();
115
+ if (message.role === "assistant") {
116
+ for (const block of message.content) {
117
+ if (!isNativeToolSearchResultBlock(block))
118
+ continue;
119
+ const names = block.content.tool_references
120
+ .filter((item) => isRecord(item) && item.type === "tool_reference")
121
+ .map((item) => (typeof item.tool_name === "string" ? item.tool_name : ""));
122
+ if (names.length > 0 && names.every((name) => resolve(name) === undefined)) {
123
+ droppedSearchUseIds.add(block.tool_use_id);
124
+ droppedSearchNames.set(block.tool_use_id, names);
125
+ }
126
+ }
127
+ }
128
+ const content = [];
129
+ for (const block of message.content) {
130
+ if (message.role === "assistant" && isRecord(block) && block.type === "tool_use") {
131
+ const demotedName = demotedCallNames.get(block.id);
132
+ if (demotedName !== undefined) {
133
+ messageChanged = true;
134
+ const firstOccurrence = !seenDemotedCallNames.has(demotedName);
135
+ seenDemotedCallNames.add(demotedName);
136
+ content.push({
137
+ type: "text",
138
+ text: demotedToolCallText(demotedName, availableToolNames, firstOccurrence),
139
+ });
140
+ continue;
141
+ }
142
+ const renamedName = renamedCallNames.get(block.id);
143
+ if (renamedName !== undefined) {
144
+ messageChanged = true;
145
+ content.push({ ...block, name: renamedName });
146
+ continue;
147
+ }
148
+ }
149
+ if (message.role === "assistant" && isRecord(block) && block.type === "server_tool_use") {
150
+ if (typeof block.id === "string" && droppedSearchUseIds.has(block.id)) {
151
+ messageChanged = true;
152
+ continue;
153
+ }
154
+ }
155
+ if (message.role === "assistant" && isNativeToolSearchResultBlock(block)) {
156
+ const omitted = droppedSearchNames.get(block.tool_use_id);
157
+ if (omitted !== undefined) {
158
+ messageChanged = true;
159
+ content.push({ type: "text", text: `Tool reference unavailable: ${[...new Set(omitted)].join(", ")}` });
160
+ continue;
161
+ }
162
+ const rewritten = rewriteToolReferenceItems(block.content.tool_references, resolve);
163
+ if (rewritten !== undefined) {
164
+ messageChanged = true;
165
+ content.push({
166
+ ...block,
167
+ content: { ...block.content, tool_references: rewritten.kept },
168
+ });
169
+ continue;
170
+ }
171
+ }
172
+ if (isRecord(block) && block.type === "tool_result") {
173
+ const demotedName = demotedCallNames.get(block.tool_use_id);
174
+ if (demotedName !== undefined) {
175
+ messageChanged = true;
176
+ content.push({ type: "text", text: demotedToolResultText(demotedName, toolResultText(block.content)) });
177
+ continue;
178
+ }
179
+ if (Array.isArray(block.content)) {
180
+ const rewritten = rewriteToolReferenceItems(block.content, resolve);
181
+ if (rewritten !== undefined) {
182
+ messageChanged = true;
183
+ const nextContent = rewritten.kept.length > 0
184
+ ? rewritten.kept
185
+ : [
186
+ {
187
+ type: "text",
188
+ text: `Tool reference unavailable: ${[...new Set(rewritten.omitted)].join(", ")}`,
189
+ },
190
+ ];
191
+ content.push({ ...block, content: nextContent });
192
+ continue;
193
+ }
194
+ }
195
+ }
196
+ content.push(block);
197
+ }
198
+ if (content.length === 0) {
199
+ changed = true;
200
+ continue;
201
+ }
202
+ if (messageChanged) {
203
+ changed = true;
204
+ rewrittenMessages.push({ ...message, content });
205
+ continue;
206
+ }
207
+ rewrittenMessages.push(message);
208
+ }
209
+ if (!changed)
210
+ return params;
211
+ return { ...params, messages: rewrittenMessages };
212
+ }
213
+ /**
214
+ * Folds every `tool_reference` item in `items` onto the request's own tool
215
+ * name and drops the ones that still do not resolve. Returns undefined when
216
+ * nothing changed so callers can keep the original block identity.
217
+ */
218
+ function rewriteToolReferenceItems(items, resolve) {
219
+ const kept = [];
220
+ const omitted = [];
221
+ let rewritten = false;
222
+ for (const item of items) {
223
+ if (!isRecord(item) || item.type !== "tool_reference" || typeof item.tool_name !== "string") {
224
+ kept.push(item);
225
+ continue;
226
+ }
227
+ const resolved = resolve(item.tool_name);
228
+ if (resolved === undefined) {
229
+ omitted.push(item.tool_name);
230
+ rewritten = true;
231
+ continue;
232
+ }
233
+ if (resolved !== item.tool_name) {
234
+ kept.push({ ...item, tool_name: resolved });
235
+ rewritten = true;
236
+ continue;
237
+ }
238
+ kept.push(item);
239
+ }
240
+ return rewritten ? { kept, omitted } : undefined;
241
+ }
242
+ function toolResultText(content) {
243
+ if (typeof content === "string")
244
+ return content;
245
+ if (Array.isArray(content)) {
246
+ const parts = [];
247
+ for (const item of content) {
248
+ if (!isRecord(item))
249
+ continue;
250
+ if (item.type === "text" && typeof item.text === "string")
251
+ parts.push(item.text);
252
+ else if (typeof item.type === "string")
253
+ parts.push(`[${item.type}]`);
254
+ }
255
+ if (parts.length > 0)
256
+ return parts.join("\n");
257
+ }
258
+ return "Tool output unavailable.";
259
+ }
260
+ //# sourceMappingURL=anthropic-tool-references.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anthropic-tool-references.js","sourceRoot":"","sources":["../../src/api/anthropic-tool-references.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n\tBetaContentBlockParam as ContentBlockParam,\n\tMessageCreateParamsStreaming,\n\tBetaMessageParam as MessageParam,\n} from \"@anthropic-ai/sdk/resources/beta/messages/messages.js\";\nimport { demotedToolCallText, demotedToolResultText } from \"../utils/unavailable-tool-text.ts\";\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null;\n}\n\n/**\n * Anthropic validates that every tool referenced by the message history is\n * available in the same request — defined in `tools` or discovered through a\n * `tool_reference` block — and rejects the whole request otherwise\n * (\"Tool reference '<name>' not found in available tools\"). Sessions outlive\n * their tools: an MCP server can be absent after a resume, an extension can\n * stop registering a tool, or a payload hook can strip a definition while the\n * history still carries the call. Demote those references to plain text so\n * the turn can proceed; the matching tool_result is demoted in lockstep so no\n * orphan pairing error replaces the original one.\n *\n * Availability is decided by the request's `tools` array alone. A discovered\n * name never stands in for a missing definition: a `tool_reference` without a\n * definition is itself rejected, so it cannot keep a later `tool_use` alive.\n *\n * Native tool search results (`tool_search_tool_result`) replay verbatim on the\n * same model, and the wire path can hand their references back under a gateway\n * namespace (`mcp__<id>__<tool>`) that senpi never defined and that does not\n * survive across requests. Those references are folded back to the request's\n * own tool names; a reference that still does not resolve is dropped, and a\n * search pair left with no references is demoted to text.\n *\n * The same wire path can also recase the tool it namespaces (`memory` comes\n * back as `mcp__a4e6__Memory`, `lsp_symbols` as `mcp__a4e6__LspSymbols`), so\n * the suffix alone no longer matches the request's tool name byte for byte.\n * Names are therefore compared with case and `_`/`-` separators folded away,\n * and a folded key resolves only when exactly one request tool owns it: the\n * fold never guesses between two candidates.\n */\nconst GATEWAY_TOOL_NAMESPACE = /^mcp__[^_]+__(.+)$/;\n\ninterface AvailableToolNames {\n\treadonly defined: ReadonlySet<string>;\n\treadonly folded: ReadonlyMap<string, string>;\n}\n\nfunction foldToolNameKey(name: string): string {\n\treturn name.toLowerCase().replaceAll(/[-_]/g, \"\");\n}\n\nfunction collectAvailableToolNames(tools: unknown): AvailableToolNames {\n\tconst defined = new Set<string>();\n\tif (Array.isArray(tools)) {\n\t\tfor (const tool of tools) {\n\t\t\tif (isRecord(tool) && typeof tool.name === \"string\") defined.add(tool.name);\n\t\t}\n\t}\n\tconst folded = new Map<string, string>();\n\tconst ambiguous = new Set<string>();\n\tfor (const name of defined) {\n\t\tconst key = foldToolNameKey(name);\n\t\tif (folded.has(key)) ambiguous.add(key);\n\t\telse folded.set(key, name);\n\t}\n\tfor (const key of ambiguous) folded.delete(key);\n\treturn { defined, folded };\n}\n\nfunction resolveAvailableToolName(name: string, available: AvailableToolNames): string | undefined {\n\tconst suffix = GATEWAY_TOOL_NAMESPACE.exec(name)?.[1];\n\tconst candidates = suffix === undefined ? [name] : [name, suffix];\n\tfor (const candidate of candidates) {\n\t\tif (available.defined.has(candidate)) return candidate;\n\t}\n\tfor (const candidate of candidates) {\n\t\tconst folded = available.folded.get(foldToolNameKey(candidate));\n\t\tif (folded !== undefined) return folded;\n\t}\n\treturn undefined;\n}\n\nfunction isNativeToolSearchResultBlock(block: unknown): block is Record<string, unknown> & {\n\ttype: \"tool_search_tool_result\";\n\ttool_use_id: string;\n\tcontent: Record<string, unknown> & { tool_references: unknown[] };\n} {\n\treturn (\n\t\tisRecord(block) &&\n\t\tblock.type === \"tool_search_tool_result\" &&\n\t\ttypeof block.tool_use_id === \"string\" &&\n\t\tisRecord(block.content) &&\n\t\tArray.isArray(block.content.tool_references)\n\t);\n}\n\nexport function demoteUnavailableToolReferences(params: MessageCreateParamsStreaming): MessageCreateParamsStreaming {\n\tconst messages = params.messages;\n\tif (!Array.isArray(messages) || messages.length === 0) return params;\n\n\tconst available = collectAvailableToolNames(params.tools);\n\tconst resolve = (name: string): string | undefined => resolveAvailableToolName(name, available);\n\n\tconst demotedCallNames = new Map<string, string>();\n\tconst renamedCallNames = new Map<string, string>();\n\tfor (const message of messages) {\n\t\tif (message.role !== \"assistant\" || !Array.isArray(message.content)) continue;\n\t\tfor (const block of message.content) {\n\t\t\tif (!isRecord(block) || block.type !== \"tool_use\" || typeof block.name !== \"string\") continue;\n\t\t\tconst resolved = resolve(block.name);\n\t\t\tif (resolved === undefined) demotedCallNames.set(block.id, block.name);\n\t\t\telse if (resolved !== block.name) renamedCallNames.set(block.id, resolved);\n\t\t}\n\t}\n\n\tlet changed = false;\n\tconst availableToolNames = [...available.defined];\n\tconst seenDemotedCallNames = new Set<string>();\n\tconst rewrittenMessages: MessageParam[] = [];\n\tfor (const message of messages) {\n\t\tif (!Array.isArray(message.content)) {\n\t\t\trewrittenMessages.push(message);\n\t\t\tcontinue;\n\t\t}\n\t\tlet messageChanged = false;\n\t\t// A native search pair whose every reference stopped resolving is demoted\n\t\t// as a unit: the result decides, and its `server_tool_use` follows.\n\t\tconst droppedSearchUseIds = new Set<string>();\n\t\tconst droppedSearchNames = new Map<string, string[]>();\n\t\tif (message.role === \"assistant\") {\n\t\t\tfor (const block of message.content) {\n\t\t\t\tif (!isNativeToolSearchResultBlock(block)) continue;\n\t\t\t\tconst names = block.content.tool_references\n\t\t\t\t\t.filter((item): item is Record<string, unknown> => isRecord(item) && item.type === \"tool_reference\")\n\t\t\t\t\t.map((item) => (typeof item.tool_name === \"string\" ? item.tool_name : \"\"));\n\t\t\t\tif (names.length > 0 && names.every((name) => resolve(name) === undefined)) {\n\t\t\t\t\tdroppedSearchUseIds.add(block.tool_use_id);\n\t\t\t\t\tdroppedSearchNames.set(block.tool_use_id, names);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tconst content: ContentBlockParam[] = [];\n\t\tfor (const block of message.content) {\n\t\t\tif (message.role === \"assistant\" && isRecord(block) && block.type === \"tool_use\") {\n\t\t\t\tconst demotedName = demotedCallNames.get(block.id);\n\t\t\t\tif (demotedName !== undefined) {\n\t\t\t\t\tmessageChanged = true;\n\t\t\t\t\tconst firstOccurrence = !seenDemotedCallNames.has(demotedName);\n\t\t\t\t\tseenDemotedCallNames.add(demotedName);\n\t\t\t\t\tcontent.push({\n\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\ttext: demotedToolCallText(demotedName, availableToolNames, firstOccurrence),\n\t\t\t\t\t});\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tconst renamedName = renamedCallNames.get(block.id);\n\t\t\t\tif (renamedName !== undefined) {\n\t\t\t\t\tmessageChanged = true;\n\t\t\t\t\tcontent.push({ ...block, name: renamedName } as ContentBlockParam);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (message.role === \"assistant\" && isRecord(block) && block.type === \"server_tool_use\") {\n\t\t\t\tif (typeof block.id === \"string\" && droppedSearchUseIds.has(block.id)) {\n\t\t\t\t\tmessageChanged = true;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (message.role === \"assistant\" && isNativeToolSearchResultBlock(block)) {\n\t\t\t\tconst omitted = droppedSearchNames.get(block.tool_use_id);\n\t\t\t\tif (omitted !== undefined) {\n\t\t\t\t\tmessageChanged = true;\n\t\t\t\t\tcontent.push({ type: \"text\", text: `Tool reference unavailable: ${[...new Set(omitted)].join(\", \")}` });\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tconst rewritten = rewriteToolReferenceItems(block.content.tool_references, resolve);\n\t\t\t\tif (rewritten !== undefined) {\n\t\t\t\t\tmessageChanged = true;\n\t\t\t\t\tcontent.push({\n\t\t\t\t\t\t...block,\n\t\t\t\t\t\tcontent: { ...block.content, tool_references: rewritten.kept },\n\t\t\t\t\t} as ContentBlockParam);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (isRecord(block) && block.type === \"tool_result\") {\n\t\t\t\tconst demotedName = demotedCallNames.get(block.tool_use_id);\n\t\t\t\tif (demotedName !== undefined) {\n\t\t\t\t\tmessageChanged = true;\n\t\t\t\t\tcontent.push({ type: \"text\", text: demotedToolResultText(demotedName, toolResultText(block.content)) });\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif (Array.isArray(block.content)) {\n\t\t\t\t\tconst rewritten = rewriteToolReferenceItems(block.content, resolve);\n\t\t\t\t\tif (rewritten !== undefined) {\n\t\t\t\t\t\tmessageChanged = true;\n\t\t\t\t\t\tconst nextContent =\n\t\t\t\t\t\t\trewritten.kept.length > 0\n\t\t\t\t\t\t\t\t? rewritten.kept\n\t\t\t\t\t\t\t\t: [\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\t\t\t\t\t\ttext: `Tool reference unavailable: ${[...new Set(rewritten.omitted)].join(\", \")}`,\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t];\n\t\t\t\t\t\tcontent.push({ ...block, content: nextContent } as ContentBlockParam);\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tcontent.push(block);\n\t\t}\n\t\tif (content.length === 0) {\n\t\t\tchanged = true;\n\t\t\tcontinue;\n\t\t}\n\t\tif (messageChanged) {\n\t\t\tchanged = true;\n\t\t\trewrittenMessages.push({ ...message, content });\n\t\t\tcontinue;\n\t\t}\n\t\trewrittenMessages.push(message);\n\t}\n\n\tif (!changed) return params;\n\treturn { ...params, messages: rewrittenMessages };\n}\n\n/**\n * Folds every `tool_reference` item in `items` onto the request's own tool\n * name and drops the ones that still do not resolve. Returns undefined when\n * nothing changed so callers can keep the original block identity.\n */\nfunction rewriteToolReferenceItems(\n\titems: readonly unknown[],\n\tresolve: (name: string) => string | undefined,\n): { kept: unknown[]; omitted: string[] } | undefined {\n\tconst kept: unknown[] = [];\n\tconst omitted: string[] = [];\n\tlet rewritten = false;\n\tfor (const item of items) {\n\t\tif (!isRecord(item) || item.type !== \"tool_reference\" || typeof item.tool_name !== \"string\") {\n\t\t\tkept.push(item);\n\t\t\tcontinue;\n\t\t}\n\t\tconst resolved = resolve(item.tool_name);\n\t\tif (resolved === undefined) {\n\t\t\tomitted.push(item.tool_name);\n\t\t\trewritten = true;\n\t\t\tcontinue;\n\t\t}\n\t\tif (resolved !== item.tool_name) {\n\t\t\tkept.push({ ...item, tool_name: resolved });\n\t\t\trewritten = true;\n\t\t\tcontinue;\n\t\t}\n\t\tkept.push(item);\n\t}\n\treturn rewritten ? { kept, omitted } : undefined;\n}\n\nfunction toolResultText(content: unknown): string {\n\tif (typeof content === \"string\") return content;\n\tif (Array.isArray(content)) {\n\t\tconst parts: string[] = [];\n\t\tfor (const item of content) {\n\t\t\tif (!isRecord(item)) continue;\n\t\t\tif (item.type === \"text\" && typeof item.text === \"string\") parts.push(item.text);\n\t\t\telse if (typeof item.type === \"string\") parts.push(`[${item.type}]`);\n\t\t}\n\t\tif (parts.length > 0) return parts.join(\"\\n\");\n\t}\n\treturn \"Tool output unavailable.\";\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"openai-codex-responses.d.ts","sourceRoot":"","sources":["../../src/api/openai-codex-responses.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAEX,6BAA6B,EAG7B,MAAM,yCAAyC,CAAC;AAmBjD,OAAO,KAAK,EAOX,mBAAmB,EACnB,cAAc,EACd,aAAa,EAEb,MAAM,aAAa,CAAC;AAgBrB,OAAO,EAKN,KAAK,8BAA8B,EAGnC,MAAM,4CAA4C,CAAC;AACpD,OAAO,EAAuB,KAAK,0BAA0B,EAAE,MAAM,uCAAuC,CAAC;AAyC7G,MAAM,WAAW,2BAA4B,SAAQ,aAAa;IACjE,eAAe,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,GAAG,KAAK,CAAC;IACnF,gBAAgB,CAAC,EAAE,0BAA0B,CAAC;IAC9C,WAAW,CAAC,EAAE,6BAA6B,CAAC,cAAc,CAAC,GAAG,MAAM,CAAC;IACrE,aAAa,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;IAC1C,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,UAAU,CAAC;CAC1C;AAmID,eAAO,MAAM,MAAM,EAAE,cAAc,CAAC,wBAAwB,EAAE,2BAA2B,CAsRxF,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,cAAc,CAAC,wBAAwB,EAAE,mBAAmB,CA0BtF,CAAC;AAoYF,YAAY,EAAE,8BAA8B,EAAE,MAAM,4CAA4C,CAAC;AAIjG,wBAAgB,iCAAiC,CAAC,SAAS,EAAE,MAAM,GAAG,8BAA8B,GAAG,SAAS,CAE/G;AAED,wBAAgB,mCAAmC,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAE5E;AAED,wBAAgB,iCAAiC,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAgB1E"}
1
+ {"version":3,"file":"openai-codex-responses.d.ts","sourceRoot":"","sources":["../../src/api/openai-codex-responses.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAEX,6BAA6B,EAG7B,MAAM,yCAAyC,CAAC;AAmBjD,OAAO,KAAK,EAOX,mBAAmB,EACnB,cAAc,EACd,aAAa,EAEb,MAAM,aAAa,CAAC;AAgBrB,OAAO,EAKN,KAAK,8BAA8B,EAGnC,MAAM,4CAA4C,CAAC;AACpD,OAAO,EAAuB,KAAK,0BAA0B,EAAE,MAAM,uCAAuC,CAAC;AAyC7G,MAAM,WAAW,2BAA4B,SAAQ,aAAa;IACjE,eAAe,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,GAAG,KAAK,CAAC;IACnF,gBAAgB,CAAC,EAAE,0BAA0B,CAAC;IAC9C,WAAW,CAAC,EAAE,6BAA6B,CAAC,cAAc,CAAC,GAAG,MAAM,CAAC;IACrE,aAAa,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;IAC1C,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,UAAU,CAAC;CAC1C;AAmID,eAAO,MAAM,MAAM,EAAE,cAAc,CAAC,wBAAwB,EAAE,2BAA2B,CAsRxF,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,cAAc,CAAC,wBAAwB,EAAE,mBAAmB,CA2BtF,CAAC;AAoYF,YAAY,EAAE,8BAA8B,EAAE,MAAM,4CAA4C,CAAC;AAIjG,wBAAgB,iCAAiC,CAAC,SAAS,EAAE,MAAM,GAAG,8BAA8B,GAAG,SAAS,CAE/G;AAED,wBAAgB,mCAAmC,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAE5E;AAED,wBAAgB,iCAAiC,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAgB1E"}
@@ -370,6 +370,7 @@ export const streamSimple = (model, context, options) => {
370
370
  const base = {
371
371
  ...buildBaseOptions(model, context, options, apiKey),
372
372
  toolChoice: options?.toolChoice,
373
+ serviceTier: options?.serviceTier,
373
374
  };
374
375
  const clampedReasoning = options?.reasoning ? clampThinkingLevel(model, options.reasoning) : undefined;
375
376
  const reasoningEffort = clampedReasoning === "off"