@code-yeongyu/senpi 2026.7.9 → 2026.7.10-2

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 (289) hide show
  1. package/CHANGELOG.md +58 -1
  2. package/README.md +2 -2
  3. package/dist/cli/args.js +3 -3
  4. package/dist/cli/args.js.map +1 -1
  5. package/dist/cli/config-selector.d.ts +4 -2
  6. package/dist/cli/config-selector.d.ts.map +1 -1
  7. package/dist/cli/config-selector.js +1 -1
  8. package/dist/cli/config-selector.js.map +1 -1
  9. package/dist/core/agent-session.d.ts +18 -3
  10. package/dist/core/agent-session.d.ts.map +1 -1
  11. package/dist/core/agent-session.js +153 -36
  12. package/dist/core/agent-session.js.map +1 -1
  13. package/dist/core/cache-stats.d.ts +49 -0
  14. package/dist/core/cache-stats.d.ts.map +1 -0
  15. package/dist/core/cache-stats.js +101 -0
  16. package/dist/core/cache-stats.js.map +1 -0
  17. package/dist/core/compaction/compaction.d.ts +1 -2
  18. package/dist/core/compaction/compaction.d.ts.map +1 -1
  19. package/dist/core/compaction/compaction.js +54 -79
  20. package/dist/core/compaction/compaction.js.map +1 -1
  21. package/dist/core/extensions/builtin/goal/continuation.js +1 -1
  22. package/dist/core/extensions/builtin/goal/continuation.js.map +1 -1
  23. package/dist/core/extensions/builtin/goal/index.d.ts.map +1 -1
  24. package/dist/core/extensions/builtin/goal/index.js +1 -0
  25. package/dist/core/extensions/builtin/goal/index.js.map +1 -1
  26. package/dist/core/extensions/builtin/import-repro.d.ts.map +1 -1
  27. package/dist/core/extensions/builtin/import-repro.js +100 -6
  28. package/dist/core/extensions/builtin/import-repro.js.map +1 -1
  29. package/dist/core/extensions/builtin/mcp/connection.d.ts +1 -0
  30. package/dist/core/extensions/builtin/mcp/connection.d.ts.map +1 -1
  31. package/dist/core/extensions/builtin/mcp/connection.js +15 -0
  32. package/dist/core/extensions/builtin/mcp/connection.js.map +1 -1
  33. package/dist/core/extensions/builtin/mcp/service.d.ts.map +1 -1
  34. package/dist/core/extensions/builtin/mcp/service.js +3 -1
  35. package/dist/core/extensions/builtin/mcp/service.js.map +1 -1
  36. package/dist/core/extensions/index.d.ts +1 -1
  37. package/dist/core/extensions/index.d.ts.map +1 -1
  38. package/dist/core/extensions/index.js.map +1 -1
  39. package/dist/core/extensions/runner.d.ts +4 -3
  40. package/dist/core/extensions/runner.d.ts.map +1 -1
  41. package/dist/core/extensions/runner.js +30 -24
  42. package/dist/core/extensions/runner.js.map +1 -1
  43. package/dist/core/extensions/types.d.ts +25 -10
  44. package/dist/core/extensions/types.d.ts.map +1 -1
  45. package/dist/core/extensions/types.js.map +1 -1
  46. package/dist/core/model-registry.d.ts +4 -6
  47. package/dist/core/model-registry.d.ts.map +1 -1
  48. package/dist/core/model-registry.js +37 -9
  49. package/dist/core/model-registry.js.map +1 -1
  50. package/dist/core/package-manager.d.ts +4 -1
  51. package/dist/core/package-manager.d.ts.map +1 -1
  52. package/dist/core/package-manager.js +68 -26
  53. package/dist/core/package-manager.js.map +1 -1
  54. package/dist/core/resource-loader.d.ts +2 -2
  55. package/dist/core/resource-loader.d.ts.map +1 -1
  56. package/dist/core/resource-loader.js +6 -7
  57. package/dist/core/resource-loader.js.map +1 -1
  58. package/dist/core/sdk.d.ts +1 -1
  59. package/dist/core/sdk.d.ts.map +1 -1
  60. package/dist/core/sdk.js +9 -2
  61. package/dist/core/sdk.js.map +1 -1
  62. package/dist/core/session-manager.d.ts.map +1 -1
  63. package/dist/core/session-manager.js +11 -2
  64. package/dist/core/session-manager.js.map +1 -1
  65. package/dist/core/settings-manager.d.ts +9 -3
  66. package/dist/core/settings-manager.d.ts.map +1 -1
  67. package/dist/core/settings-manager.js +10 -1
  68. package/dist/core/settings-manager.js.map +1 -1
  69. package/dist/core/slash-commands.d.ts +1 -0
  70. package/dist/core/slash-commands.d.ts.map +1 -1
  71. package/dist/core/slash-commands.js +3 -3
  72. package/dist/core/slash-commands.js.map +1 -1
  73. package/dist/index.d.ts +1 -1
  74. package/dist/index.d.ts.map +1 -1
  75. package/dist/index.js.map +1 -1
  76. package/dist/main.d.ts +2 -2
  77. package/dist/main.d.ts.map +1 -1
  78. package/dist/main.js +1 -0
  79. package/dist/main.js.map +1 -1
  80. package/dist/modes/interactive/components/config-selector.d.ts +34 -3
  81. package/dist/modes/interactive/components/config-selector.d.ts.map +1 -1
  82. package/dist/modes/interactive/components/config-selector.js +272 -24
  83. package/dist/modes/interactive/components/config-selector.js.map +1 -1
  84. package/dist/modes/interactive/components/footer.d.ts +4 -0
  85. package/dist/modes/interactive/components/footer.d.ts.map +1 -1
  86. package/dist/modes/interactive/components/footer.js +5 -2
  87. package/dist/modes/interactive/components/footer.js.map +1 -1
  88. package/dist/modes/interactive/components/oauth-selector.d.ts +3 -1
  89. package/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -1
  90. package/dist/modes/interactive/components/oauth-selector.js +16 -6
  91. package/dist/modes/interactive/components/oauth-selector.js.map +1 -1
  92. package/dist/modes/interactive/components/settings-selector.d.ts +2 -0
  93. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  94. package/dist/modes/interactive/components/settings-selector.js +11 -1
  95. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  96. package/dist/modes/interactive/components/thinking-selector.js +1 -1
  97. package/dist/modes/interactive/components/thinking-selector.js.map +1 -1
  98. package/dist/modes/interactive/interactive-mode.d.ts +10 -0
  99. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  100. package/dist/modes/interactive/interactive-mode.js +261 -37
  101. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  102. package/dist/modes/interactive/theme/dark.json +1 -0
  103. package/dist/modes/interactive/theme/light.json +1 -0
  104. package/dist/modes/interactive/theme/theme-schema.json +6 -2
  105. package/dist/modes/interactive/theme/theme.d.ts +3 -2
  106. package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  107. package/dist/modes/interactive/theme/theme.js +11 -4
  108. package/dist/modes/interactive/theme/theme.js.map +1 -1
  109. package/dist/modes/print-mode.js +1 -1
  110. package/dist/modes/print-mode.js.map +1 -1
  111. package/dist/modes/rpc/rpc-client.d.ts +6 -6
  112. package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
  113. package/dist/modes/rpc/rpc-client.js +3 -3
  114. package/dist/modes/rpc/rpc-client.js.map +1 -1
  115. package/dist/package-manager-cli.d.ts +2 -2
  116. package/dist/package-manager-cli.d.ts.map +1 -1
  117. package/dist/package-manager-cli.js +64 -17
  118. package/dist/package-manager-cli.js.map +1 -1
  119. package/dist/utils/clipboard-image.js +1 -1
  120. package/dist/utils/clipboard-image.js.map +1 -1
  121. package/docs/custom-provider.md +4 -3
  122. package/docs/extensions.md +34 -10
  123. package/docs/models.md +49 -8
  124. package/docs/packages.md +7 -10
  125. package/docs/rpc.md +15 -5
  126. package/docs/sdk.md +23 -1
  127. package/docs/settings.md +3 -2
  128. package/docs/themes.md +5 -3
  129. package/docs/tui.md +1 -1
  130. package/docs/usage.md +2 -2
  131. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  132. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  133. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  134. package/examples/extensions/gondolin/package-lock.json +2 -2
  135. package/examples/extensions/gondolin/package.json +1 -1
  136. package/examples/extensions/reload-runtime.ts +2 -2
  137. package/examples/extensions/sandbox/package-lock.json +2 -2
  138. package/examples/extensions/sandbox/package.json +1 -1
  139. package/examples/extensions/with-deps/package-lock.json +2 -2
  140. package/examples/extensions/with-deps/package.json +1 -1
  141. package/examples/sdk/README.md +1 -1
  142. package/node_modules/@code-yeongyu/senpi-codemode/package.json +3 -3
  143. package/node_modules/@earendil-works/pi-agent-core/README.md +1 -1
  144. package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.d.ts.map +1 -1
  145. package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.js +37 -2
  146. package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.js.map +1 -1
  147. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/jsonl-repo.d.ts.map +1 -1
  148. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/jsonl-repo.js +2 -0
  149. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/jsonl-repo.js.map +1 -1
  150. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/jsonl-storage.d.ts +1 -0
  151. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/jsonl-storage.d.ts.map +1 -1
  152. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/jsonl-storage.js +7 -0
  153. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/jsonl-storage.js.map +1 -1
  154. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/session.d.ts +18 -4
  155. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/session.d.ts.map +1 -1
  156. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/session.js +72 -37
  157. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/session.js.map +1 -1
  158. package/node_modules/@earendil-works/pi-agent-core/dist/harness/types.d.ts +2 -0
  159. package/node_modules/@earendil-works/pi-agent-core/dist/harness/types.d.ts.map +1 -1
  160. package/node_modules/@earendil-works/pi-agent-core/dist/harness/types.js.map +1 -1
  161. package/node_modules/@earendil-works/pi-agent-core/dist/index.d.ts +2 -0
  162. package/node_modules/@earendil-works/pi-agent-core/dist/index.d.ts.map +1 -1
  163. package/node_modules/@earendil-works/pi-agent-core/dist/index.js +2 -0
  164. package/node_modules/@earendil-works/pi-agent-core/dist/index.js.map +1 -1
  165. package/node_modules/@earendil-works/pi-agent-core/dist/types.d.ts +2 -3
  166. package/node_modules/@earendil-works/pi-agent-core/dist/types.d.ts.map +1 -1
  167. package/node_modules/@earendil-works/pi-agent-core/dist/types.js.map +1 -1
  168. package/node_modules/@earendil-works/pi-agent-core/package.json +2 -2
  169. package/node_modules/@earendil-works/pi-ai/README.md +4 -2
  170. package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.d.ts.map +1 -1
  171. package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.js +7 -8
  172. package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.js.map +1 -1
  173. package/node_modules/@earendil-works/pi-ai/dist/api/azure-openai-responses.d.ts +1 -1
  174. package/node_modules/@earendil-works/pi-ai/dist/api/azure-openai-responses.d.ts.map +1 -1
  175. package/node_modules/@earendil-works/pi-ai/dist/api/azure-openai-responses.js.map +1 -1
  176. package/node_modules/@earendil-works/pi-ai/dist/api/bedrock-converse-stream.js +3 -6
  177. package/node_modules/@earendil-works/pi-ai/dist/api/bedrock-converse-stream.js.map +1 -1
  178. package/node_modules/@earendil-works/pi-ai/dist/api/openai-codex-responses.d.ts +1 -1
  179. package/node_modules/@earendil-works/pi-ai/dist/api/openai-codex-responses.d.ts.map +1 -1
  180. package/node_modules/@earendil-works/pi-ai/dist/api/openai-codex-responses.js +5 -1
  181. package/node_modules/@earendil-works/pi-ai/dist/api/openai-codex-responses.js.map +1 -1
  182. package/node_modules/@earendil-works/pi-ai/dist/api/openai-completions.d.ts +1 -1
  183. package/node_modules/@earendil-works/pi-ai/dist/api/openai-completions.d.ts.map +1 -1
  184. package/node_modules/@earendil-works/pi-ai/dist/api/openai-completions.js +7 -2
  185. package/node_modules/@earendil-works/pi-ai/dist/api/openai-completions.js.map +1 -1
  186. package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses-shared.d.ts.map +1 -1
  187. package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses-shared.js +7 -5
  188. package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses-shared.js.map +1 -1
  189. package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses.d.ts +1 -1
  190. package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses.d.ts.map +1 -1
  191. package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses.js.map +1 -1
  192. package/node_modules/@earendil-works/pi-ai/dist/api/transform-messages.d.ts.map +1 -1
  193. package/node_modules/@earendil-works/pi-ai/dist/api/transform-messages.js +8 -4
  194. package/node_modules/@earendil-works/pi-ai/dist/api/transform-messages.js.map +1 -1
  195. package/node_modules/@earendil-works/pi-ai/dist/models.d.ts.map +1 -1
  196. package/node_modules/@earendil-works/pi-ai/dist/models.generated.d.ts +644 -220
  197. package/node_modules/@earendil-works/pi-ai/dist/models.generated.d.ts.map +1 -1
  198. package/node_modules/@earendil-works/pi-ai/dist/models.js +13 -4
  199. package/node_modules/@earendil-works/pi-ai/dist/models.js.map +1 -1
  200. package/node_modules/@earendil-works/pi-ai/dist/providers/amazon-bedrock.models.d.ts +62 -5
  201. package/node_modules/@earendil-works/pi-ai/dist/providers/amazon-bedrock.models.d.ts.map +1 -1
  202. package/node_modules/@earendil-works/pi-ai/dist/providers/amazon-bedrock.models.js +32 -20
  203. package/node_modules/@earendil-works/pi-ai/dist/providers/amazon-bedrock.models.js.map +1 -1
  204. package/node_modules/@earendil-works/pi-ai/dist/providers/anthropic.models.d.ts +11 -1
  205. package/node_modules/@earendil-works/pi-ai/dist/providers/anthropic.models.d.ts.map +1 -1
  206. package/node_modules/@earendil-works/pi-ai/dist/providers/anthropic.models.js +6 -4
  207. package/node_modules/@earendil-works/pi-ai/dist/providers/anthropic.models.js.map +1 -1
  208. package/node_modules/@earendil-works/pi-ai/dist/providers/azure-openai-responses.models.d.ts +66 -0
  209. package/node_modules/@earendil-works/pi-ai/dist/providers/azure-openai-responses.models.d.ts.map +1 -1
  210. package/node_modules/@earendil-works/pi-ai/dist/providers/azure-openai-responses.models.js +54 -0
  211. package/node_modules/@earendil-works/pi-ai/dist/providers/azure-openai-responses.models.js.map +1 -1
  212. package/node_modules/@earendil-works/pi-ai/dist/providers/cloudflare-ai-gateway.models.d.ts +11 -1
  213. package/node_modules/@earendil-works/pi-ai/dist/providers/cloudflare-ai-gateway.models.d.ts.map +1 -1
  214. package/node_modules/@earendil-works/pi-ai/dist/providers/cloudflare-ai-gateway.models.js +6 -4
  215. package/node_modules/@earendil-works/pi-ai/dist/providers/cloudflare-ai-gateway.models.js.map +1 -1
  216. package/node_modules/@earendil-works/pi-ai/dist/providers/deepseek.models.d.ts +2 -2
  217. package/node_modules/@earendil-works/pi-ai/dist/providers/deepseek.models.d.ts.map +1 -1
  218. package/node_modules/@earendil-works/pi-ai/dist/providers/deepseek.models.js +2 -2
  219. package/node_modules/@earendil-works/pi-ai/dist/providers/deepseek.models.js.map +1 -1
  220. package/node_modules/@earendil-works/pi-ai/dist/providers/fireworks.models.d.ts +2 -2
  221. package/node_modules/@earendil-works/pi-ai/dist/providers/fireworks.models.d.ts.map +1 -1
  222. package/node_modules/@earendil-works/pi-ai/dist/providers/fireworks.models.js +2 -2
  223. package/node_modules/@earendil-works/pi-ai/dist/providers/fireworks.models.js.map +1 -1
  224. package/node_modules/@earendil-works/pi-ai/dist/providers/github-copilot.models.d.ts +8 -2
  225. package/node_modules/@earendil-works/pi-ai/dist/providers/github-copilot.models.d.ts.map +1 -1
  226. package/node_modules/@earendil-works/pi-ai/dist/providers/github-copilot.models.js +9 -8
  227. package/node_modules/@earendil-works/pi-ai/dist/providers/github-copilot.models.js.map +1 -1
  228. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-codex.models.d.ts +101 -0
  229. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-codex.models.d.ts.map +1 -1
  230. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-codex.models.js +59 -0
  231. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-codex.models.js.map +1 -1
  232. package/node_modules/@earendil-works/pi-ai/dist/providers/openai.models.d.ts +115 -0
  233. package/node_modules/@earendil-works/pi-ai/dist/providers/openai.models.d.ts.map +1 -1
  234. package/node_modules/@earendil-works/pi-ai/dist/providers/openai.models.js +61 -0
  235. package/node_modules/@earendil-works/pi-ai/dist/providers/openai.models.js.map +1 -1
  236. package/node_modules/@earendil-works/pi-ai/dist/providers/opencode-go.models.d.ts +3 -3
  237. package/node_modules/@earendil-works/pi-ai/dist/providers/opencode-go.models.d.ts.map +1 -1
  238. package/node_modules/@earendil-works/pi-ai/dist/providers/opencode-go.models.js +3 -3
  239. package/node_modules/@earendil-works/pi-ai/dist/providers/opencode-go.models.js.map +1 -1
  240. package/node_modules/@earendil-works/pi-ai/dist/providers/opencode.models.d.ts +14 -4
  241. package/node_modules/@earendil-works/pi-ai/dist/providers/opencode.models.d.ts.map +1 -1
  242. package/node_modules/@earendil-works/pi-ai/dist/providers/opencode.models.js +9 -7
  243. package/node_modules/@earendil-works/pi-ai/dist/providers/opencode.models.js.map +1 -1
  244. package/node_modules/@earendil-works/pi-ai/dist/providers/openrouter.models.d.ts +158 -64
  245. package/node_modules/@earendil-works/pi-ai/dist/providers/openrouter.models.d.ts.map +1 -1
  246. package/node_modules/@earendil-works/pi-ai/dist/providers/openrouter.models.js +145 -83
  247. package/node_modules/@earendil-works/pi-ai/dist/providers/openrouter.models.js.map +1 -1
  248. package/node_modules/@earendil-works/pi-ai/dist/providers/vercel-ai-gateway.models.d.ts +88 -1
  249. package/node_modules/@earendil-works/pi-ai/dist/providers/vercel-ai-gateway.models.d.ts.map +1 -1
  250. package/node_modules/@earendil-works/pi-ai/dist/providers/vercel-ai-gateway.models.js +78 -5
  251. package/node_modules/@earendil-works/pi-ai/dist/providers/vercel-ai-gateway.models.js.map +1 -1
  252. package/node_modules/@earendil-works/pi-ai/dist/providers/xiaomi-token-plan-ams.models.d.ts +0 -44
  253. package/node_modules/@earendil-works/pi-ai/dist/providers/xiaomi-token-plan-ams.models.d.ts.map +1 -1
  254. package/node_modules/@earendil-works/pi-ai/dist/providers/xiaomi-token-plan-ams.models.js +9 -45
  255. package/node_modules/@earendil-works/pi-ai/dist/providers/xiaomi-token-plan-ams.models.js.map +1 -1
  256. package/node_modules/@earendil-works/pi-ai/dist/providers/xiaomi-token-plan-cn.models.d.ts +0 -44
  257. package/node_modules/@earendil-works/pi-ai/dist/providers/xiaomi-token-plan-cn.models.d.ts.map +1 -1
  258. package/node_modules/@earendil-works/pi-ai/dist/providers/xiaomi-token-plan-cn.models.js +9 -45
  259. package/node_modules/@earendil-works/pi-ai/dist/providers/xiaomi-token-plan-cn.models.js.map +1 -1
  260. package/node_modules/@earendil-works/pi-ai/dist/providers/xiaomi-token-plan-sgp.models.d.ts +0 -44
  261. package/node_modules/@earendil-works/pi-ai/dist/providers/xiaomi-token-plan-sgp.models.d.ts.map +1 -1
  262. package/node_modules/@earendil-works/pi-ai/dist/providers/xiaomi-token-plan-sgp.models.js +9 -45
  263. package/node_modules/@earendil-works/pi-ai/dist/providers/xiaomi-token-plan-sgp.models.js.map +1 -1
  264. package/node_modules/@earendil-works/pi-ai/dist/providers/zai-coding-cn.models.d.ts +1 -1
  265. package/node_modules/@earendil-works/pi-ai/dist/providers/zai-coding-cn.models.d.ts.map +1 -1
  266. package/node_modules/@earendil-works/pi-ai/dist/providers/zai-coding-cn.models.js +1 -1
  267. package/node_modules/@earendil-works/pi-ai/dist/providers/zai-coding-cn.models.js.map +1 -1
  268. package/node_modules/@earendil-works/pi-ai/dist/providers/zai.models.d.ts +1 -1
  269. package/node_modules/@earendil-works/pi-ai/dist/providers/zai.models.d.ts.map +1 -1
  270. package/node_modules/@earendil-works/pi-ai/dist/providers/zai.models.js +1 -1
  271. package/node_modules/@earendil-works/pi-ai/dist/providers/zai.models.js.map +1 -1
  272. package/node_modules/@earendil-works/pi-ai/dist/types.d.ts +15 -6
  273. package/node_modules/@earendil-works/pi-ai/dist/types.d.ts.map +1 -1
  274. package/node_modules/@earendil-works/pi-ai/dist/types.js.map +1 -1
  275. package/node_modules/@earendil-works/pi-ai/dist/utils/estimate.d.ts +3 -3
  276. package/node_modules/@earendil-works/pi-ai/dist/utils/estimate.d.ts.map +1 -1
  277. package/node_modules/@earendil-works/pi-ai/dist/utils/estimate.js +17 -9
  278. package/node_modules/@earendil-works/pi-ai/dist/utils/estimate.js.map +1 -1
  279. package/node_modules/@earendil-works/pi-ai/dist/utils/retry.d.ts.map +1 -1
  280. package/node_modules/@earendil-works/pi-ai/dist/utils/retry.js +3 -0
  281. package/node_modules/@earendil-works/pi-ai/dist/utils/retry.js.map +1 -1
  282. package/node_modules/@earendil-works/pi-ai/package.json +1 -1
  283. package/node_modules/@earendil-works/pi-pty/package.json +1 -1
  284. package/node_modules/@earendil-works/pi-tui/dist/components/editor.d.ts.map +1 -1
  285. package/node_modules/@earendil-works/pi-tui/dist/components/editor.js +22 -1
  286. package/node_modules/@earendil-works/pi-tui/dist/components/editor.js.map +1 -1
  287. package/node_modules/@earendil-works/pi-tui/package.json +1 -1
  288. package/package.json +7 -8
  289. package/npm-shrinkwrap.json +0 -3479
package/docs/packages.md CHANGED
@@ -1,8 +1,8 @@
1
- > pi can help you create pi packages. Ask it to bundle your extensions, skills, prompt templates, themes, or hook configs.
1
+ > pi can help you create pi packages. Ask it to bundle your extensions, skills, prompt templates, or themes.
2
2
 
3
3
  # Pi Packages
4
4
 
5
- Pi packages bundle extensions, skills, prompt templates, themes, and hook configs so you can share them through npm or git. A package can declare resources in `package.json` under the `pi` key, or use conventional directories.
5
+ Pi packages bundle extensions, skills, prompt templates, and themes so you can share them through npm or git. A package can declare resources in `package.json` under the `pi` key, or use conventional directories.
6
6
 
7
7
  ## Table of Contents
8
8
 
@@ -124,8 +124,7 @@ Add a `pi` manifest to `package.json` or use conventional directories. Include t
124
124
  "extensions": ["./extensions"],
125
125
  "skills": ["./skills"],
126
126
  "prompts": ["./prompts"],
127
- "themes": ["./themes"],
128
- "hooks": ["./hooks"]
127
+ "themes": ["./themes"]
129
128
  }
130
129
  }
131
130
  ```
@@ -163,11 +162,10 @@ If no `pi` manifest is present, pi auto-discovers resources from these directori
163
162
  - `skills/` recursively finds `SKILL.md` folders and loads top-level `.md` files as skills
164
163
  - `prompts/` loads `.md` files
165
164
  - `themes/` loads `.json` files
166
- - `hooks/` loads `.json` files
167
165
 
168
166
  ## Dependencies
169
167
 
170
- Third party runtime dependencies belong in `dependencies` in `package.json`. Dependencies that do not register extensions, skills, prompt templates, themes, or hook configs also belong in `dependencies`. When pi installs a package from npm or git, it runs `npm install`, so those dependencies are installed automatically.
168
+ Third party runtime dependencies belong in `dependencies` in `package.json`. Dependencies that do not register extensions, skills, prompt templates, or themes also belong in `dependencies`. When pi installs a package from npm or git, it runs `npm install`, so those dependencies are installed automatically.
171
169
 
172
170
  Pi bundles core packages for extensions and skills. If you import any of these, list them in `peerDependencies` with a `"*"` range and do not bundle them: `@earendil-works/pi-ai`, `@earendil-works/pi-agent-core`, `@earendil-works/pi-coding-agent`, `@earendil-works/pi-tui`, `typebox`.
173
171
 
@@ -201,8 +199,7 @@ Filter what a package loads using the object form in settings:
201
199
  "extensions": ["extensions/*.ts", "!extensions/legacy.ts"],
202
200
  "skills": [],
203
201
  "prompts": ["prompts/review.md"],
204
- "themes": ["+themes/legacy.json"],
205
- "hooks": ["hooks/pretool.json"]
202
+ "themes": ["+themes/legacy.json"]
206
203
  }
207
204
  ]
208
205
  }
@@ -219,11 +216,11 @@ Filter what a package loads using the object form in settings:
219
216
 
220
217
  ## Enable and Disable Resources
221
218
 
222
- Use `pi config` to enable or disable extensions, skills, prompt templates, themes, and hook configs from installed packages and local directories. Works for both global (`~/.pi/agent`) and project (`.pi/`) scopes.
219
+ Use `pi config` to enable or disable extensions, skills, prompt templates, and themes from installed packages and local directories. `pi config` starts in global settings (`~/.pi/agent/settings.json`); press Tab to switch between global and project-local modes. Use `pi config -l` to start in project overrides (`.pi/settings.json`) with inherited global resources dimmed.
223
220
 
224
221
  ## Scope and Deduplication
225
222
 
226
- Packages can appear in both global and project settings. If the same package appears in both, the project entry wins. Identity is determined by:
223
+ Packages can appear in both global and project settings. If the same package appears in both, the project entry wins unless the project entry has `autoload: false`, in which case it is applied as a delta over the global entry. Identity is determined by:
227
224
 
228
225
  - npm: package name
229
226
  - git: repository URL without ref
package/docs/rpc.md CHANGED
@@ -286,9 +286,9 @@ Set the reasoning/thinking level for models that support it.
286
286
  {"type": "set_thinking_level", "level": "high"}
287
287
  ```
288
288
 
289
- Levels: `"off"`, `"minimal"`, `"low"`, `"medium"`, `"high"`, `"xhigh"`
289
+ Levels: `"off"`, `"minimal"`, `"low"`, `"medium"`, `"high"`, `"xhigh"`, `"max"`
290
290
 
291
- Note: `"xhigh"` is only supported by OpenAI codex-max models.
291
+ `"xhigh"` and `"max"` are exposed only when supported by the selected model. Some models, including GPT-5.6, expose both.
292
292
 
293
293
  Response:
294
294
  ```json
@@ -809,7 +809,8 @@ Events are streamed to stdout as JSON lines during agent operation. Events do NO
809
809
  | Event | Description |
810
810
  |-------|-------------|
811
811
  | `agent_start` | Agent begins processing |
812
- | `agent_end` | Agent completes (includes all generated messages) |
812
+ | `agent_end` | One low-level agent run completes (may still be followed by retry, compaction, or queued continuations) |
813
+ | `agent_settled` | Agent run is fully settled; no automatic retry, compaction retry, or queued continuation remains |
813
814
  | `turn_start` | New turn begins |
814
815
  | `turn_end` | Turn completes (includes assistant message and tool results) |
815
816
  | `message_start` | Message begins |
@@ -835,15 +836,24 @@ Emitted when the agent begins processing a prompt.
835
836
 
836
837
  ### agent_end
837
838
 
838
- Emitted when the agent completes. Contains all messages generated during this run.
839
+ Emitted when one low-level agent run completes. Contains all messages generated during this run. If `willRetry` is true, an automatic retry will follow.
839
840
 
840
841
  ```json
841
842
  {
842
843
  "type": "agent_end",
843
- "messages": [...]
844
+ "messages": [...],
845
+ "willRetry": false
844
846
  }
845
847
  ```
846
848
 
849
+ ### agent_settled
850
+
851
+ Emitted after the full session-level run settles. At this point Pi will not continue automatically through retry, compaction retry, or queued follow-up messages.
852
+
853
+ ```json
854
+ {"type": "agent_settled"}
855
+ ```
856
+
847
857
  ### turn_start / turn_end
848
858
 
849
859
  A turn consists of one assistant response plus any resulting tool calls and results.
package/docs/sdk.md CHANGED
@@ -386,7 +386,7 @@ const available = await modelRegistry.getAvailable();
386
386
 
387
387
  const { session } = await createAgentSession({
388
388
  model: opus,
389
- thinkingLevel: "medium", // off, minimal, low, medium, high, xhigh
389
+ thinkingLevel: "medium", // off, minimal, low, medium, high, xhigh, max
390
390
 
391
391
  // Models for cycling (Ctrl+P in interactive mode)
392
392
  scopedModels: [
@@ -605,6 +605,27 @@ const { session } = await createAgentSession({ resourceLoader: loader });
605
605
 
606
606
  Extensions can register tools, subscribe to events, add commands, and more. See [extensions.md](extensions.md) for the full API.
607
607
 
608
+ **Named inline extensions:** By default, inline factories display as `<inline:1>`, `<inline:2>`, etc. in the startup Extensions list. To show a descriptive name instead, wrap the factory:
609
+
610
+ ```typescript
611
+ import type { InlineExtension } from "@earendil-works/pi-coding-agent";
612
+
613
+ const myProvider: InlineExtension = {
614
+ name: "my-provider",
615
+ factory: (pi) => {
616
+ pi.on("agent_start", () => {
617
+ console.log("[my-provider] Agent starting");
618
+ });
619
+ },
620
+ };
621
+
622
+ const loader = new DefaultResourceLoader({
623
+ extensionFactories: [myProvider],
624
+ });
625
+ ```
626
+
627
+ This displays as `<inline:my-provider>` instead of `<inline:1>`. Bare factory functions are still accepted for backward compatibility.
628
+
608
629
  **Event Bus:** Extensions can communicate via `pi.events`. Pass a shared `eventBus` to `DefaultResourceLoader` if you need to emit or listen from outside:
609
630
 
610
631
  ```typescript
@@ -1177,6 +1198,7 @@ createGrepTool, createFindTool, createLsTool
1177
1198
  type CreateAgentSessionOptions
1178
1199
  type CreateAgentSessionResult
1179
1200
  type ExtensionFactory
1201
+ type InlineExtension
1180
1202
  type ExtensionAPI
1181
1203
  type ToolDefinition
1182
1204
  type Skill
package/docs/settings.md CHANGED
@@ -83,9 +83,10 @@ Permission rules are a confirmation policy, not a sandbox. Senpi, extensions, pa
83
83
  |---------|------|---------|-------------|
84
84
  | `defaultProvider` | string | - | Default provider (e.g., `"anthropic"`, `"openai"`) |
85
85
  | `defaultModel` | string | - | Default model ID |
86
- | `defaultThinkingLevel` | string | - | `"off"`, `"minimal"`, `"low"`, `"medium"`, `"high"`, `"xhigh"` |
86
+ | `defaultThinkingLevel` | string | - | `"off"`, `"minimal"`, `"low"`, `"medium"`, `"high"`, `"xhigh"`, `"max"` |
87
87
  | `promptPreset` | string | `"auto"` | Force a system prompt preset: `"auto"`, `"kimi-k2-6"`, `"kimi-k2-7"`, `"glm-5.2"`, `"claude-fable-5"`, `"claude-opus-4-5"`, `"claude-opus-4-6"`, `"claude-opus-4-7"`, `"claude-opus-4-8"`, `"gpt-5"`, `"gpt-5.2"`, `"gpt-5.3-codex"`, `"gpt-5.4"`, or `"gpt-5.5"` |
88
88
  | `hideThinkingBlock` | boolean | `false` | Hide thinking blocks in output |
89
+ | `showCacheMissNotices` | boolean | `false` | Show transcript notices for significant prompt-cache misses |
89
90
  | `thinkingBudgets` | object | - | Custom token budgets per thinking level |
90
91
 
91
92
  #### promptPreset
@@ -268,7 +269,7 @@ When unset, senpi leaves provider payloads unchanged. This setting currently app
268
269
 
269
270
  | Setting | Type | Default | Description |
270
271
  |---------|------|---------|-------------|
271
- | `shellPath` | string | - | Custom shell path (e.g., for Cygwin on Windows) |
272
+ | `shellPath` | string | - | Custom shell path (e.g., for Cygwin on Windows); supports a leading `~` for the home directory |
272
273
  | `shellCommandPrefix` | string | - | Prefix for every bash command (e.g., `"shopt -s expand_aliases"`) |
273
274
  | `npmCommand` | string[] | - | Command argv used for npm package lookup/install operations (e.g., `["mise", "exec", "node@20", "--", "npm"]`) |
274
275
 
package/docs/themes.md CHANGED
@@ -109,6 +109,7 @@ vim ~/.senpi/agent/themes/my-theme.json
109
109
  "thinkingMedium": "#00ffff",
110
110
  "thinkingHigh": "#ff00ff",
111
111
  "thinkingXhigh": "#ff0000",
112
+ "thinkingMax": "#ff0088",
112
113
  "bashMode": "#ffaa00"
113
114
  }
114
115
  }
@@ -139,13 +140,13 @@ vim ~/.senpi/agent/themes/my-theme.json
139
140
 
140
141
  - `name` is required, must be unique, and must not contain `/`.
141
142
  - `vars` is optional. Define reusable colors here, then reference them in `colors`.
142
- - `colors` must define all 51 required tokens.
143
+ - `colors` must define all 51 required tokens. `thinkingMax` is optional and falls back to `thinkingXhigh`.
143
144
 
144
145
  The `$schema` field enables editor auto-completion and validation.
145
146
 
146
147
  ## Color Tokens
147
148
 
148
- Every theme must define all 51 color tokens. There are no optional colors.
149
+ Every theme must define all 51 required color tokens. `thinkingMax` is optional for compatibility with existing themes; when omitted, it uses `thinkingXhigh`.
149
150
 
150
151
  ### Core UI (11 colors)
151
152
 
@@ -216,7 +217,7 @@ Every theme must define all 51 color tokens. There are no optional colors.
216
217
  | `syntaxOperator` | Operators |
217
218
  | `syntaxPunctuation` | Punctuation |
218
219
 
219
- ### Thinking Level Borders (6 colors)
220
+ ### Thinking Level Borders (6 required, 1 optional)
220
221
 
221
222
  Editor border colors indicating thinking level (visual hierarchy from subtle to prominent):
222
223
 
@@ -228,6 +229,7 @@ Editor border colors indicating thinking level (visual hierarchy from subtle to
228
229
  | `thinkingMedium` | Medium thinking |
229
230
  | `thinkingHigh` | High thinking |
230
231
  | `thinkingXhigh` | Extra high thinking |
232
+ | `thinkingMax` | Maximum thinking; optional, falls back to `thinkingXhigh` |
231
233
 
232
234
  ### Bash Mode (1 color)
233
235
 
package/docs/tui.md CHANGED
@@ -424,7 +424,7 @@ renderResult(result, options, theme, context) {
424
424
  | Diffs | `toolDiffAdded`, `toolDiffRemoved`, `toolDiffContext` |
425
425
  | Markdown | `mdHeading`, `mdLink`, `mdLinkUrl`, `mdCode`, `mdCodeBlock`, `mdCodeBlockBorder`, `mdQuote`, `mdQuoteBorder`, `mdHr`, `mdListBullet` |
426
426
  | Syntax | `syntaxComment`, `syntaxKeyword`, `syntaxFunction`, `syntaxVariable`, `syntaxString`, `syntaxNumber`, `syntaxType`, `syntaxOperator`, `syntaxPunctuation` |
427
- | Thinking | `thinkingOff`, `thinkingMinimal`, `thinkingLow`, `thinkingMedium`, `thinkingHigh`, `thinkingXhigh` |
427
+ | Thinking | `thinkingOff`, `thinkingMinimal`, `thinkingLow`, `thinkingMedium`, `thinkingHigh`, `thinkingXhigh`, `thinkingMax` |
428
428
  | Modes | `bashMode` |
429
429
 
430
430
  **Background colors** (`theme.bg(color, text)`):
package/docs/usage.md CHANGED
@@ -52,7 +52,7 @@ Type `/` in the editor to open command completion. Extensions can register custo
52
52
  | `/export [file]` | Export session to HTML or JSONL |
53
53
  | `/import <file>` | Import and resume a session from a JSONL file |
54
54
  | `/share` | Upload as private GitHub gist with shareable HTML link |
55
- | `/reload` | Reload keybindings, extensions, skills, prompts, and context files |
55
+ | `/reload` | Reload keybindings, extensions, skills, prompts, themes, and context files |
56
56
  | `/hotkeys` | Show all keyboard shortcuts |
57
57
  | `/changelog` | Display version history |
58
58
  | `/quit` | Quit pi |
@@ -183,7 +183,7 @@ cat README.md | pi -p "Summarize this text"
183
183
  | `--provider <name>` | Provider, such as `anthropic`, `openai`, or `google` |
184
184
  | `--model <pattern>` | Model pattern or ID; supports `provider/id` and optional `:<thinking>` |
185
185
  | `--api-key <key>` | API key, overriding environment variables |
186
- | `--thinking <level>` | `off`, `minimal`, `low`, `medium`, `high`, `xhigh` |
186
+ | `--thinking <level>` | `off`, `minimal`, `low`, `medium`, `high`, `xhigh`, `max` |
187
187
  | `--models <patterns>` | Comma-separated patterns for Ctrl+P cycling |
188
188
  | `--list-models [search]` | List available models |
189
189
 
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "pi-extension-custom-provider",
3
- "version": "0.80.3",
3
+ "version": "0.80.6",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "pi-extension-custom-provider",
9
- "version": "0.80.3",
9
+ "version": "0.80.6",
10
10
  "dependencies": {
11
11
  "@anthropic-ai/sdk": "^0.52.0"
12
12
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "pi-extension-custom-provider-anthropic",
3
3
  "private": true,
4
- "version": "0.80.3",
4
+ "version": "0.80.6",
5
5
  "type": "module",
6
6
  "scripts": {
7
7
  "clean": "echo 'nothing to clean'",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "pi-extension-custom-provider-gitlab-duo",
3
3
  "private": true,
4
- "version": "0.80.3",
4
+ "version": "0.80.6",
5
5
  "type": "module",
6
6
  "scripts": {
7
7
  "clean": "echo 'nothing to clean'",
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "pi-extension-gondolin",
3
- "version": "0.80.3",
3
+ "version": "0.80.6",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "pi-extension-gondolin",
9
- "version": "0.80.3",
9
+ "version": "0.80.6",
10
10
  "dependencies": {
11
11
  "@earendil-works/gondolin": "0.12.0"
12
12
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "pi-extension-gondolin",
3
3
  "private": true,
4
- "version": "0.80.3",
4
+ "version": "0.80.6",
5
5
  "type": "module",
6
6
  "scripts": {
7
7
  "clean": "echo 'nothing to clean'",
@@ -12,7 +12,7 @@ export default function (pi: ExtensionAPI) {
12
12
  // Command entrypoint for reload.
13
13
  // Treat reload as terminal for this handler.
14
14
  pi.registerCommand("reload-runtime", {
15
- description: "Reload extensions, skills, prompts, and themes",
15
+ description: "Reload extensions, skills, prompts, themes, and context files",
16
16
  handler: async (_args, ctx) => {
17
17
  await ctx.reload();
18
18
  return;
@@ -24,7 +24,7 @@ export default function (pi: ExtensionAPI) {
24
24
  pi.registerTool({
25
25
  name: "reload_runtime",
26
26
  label: "Reload Runtime",
27
- description: "Reload extensions, skills, prompts, and themes",
27
+ description: "Reload extensions, skills, prompts, themes, and context files",
28
28
  parameters: Type.Object({}),
29
29
  async execute() {
30
30
  pi.sendUserMessage("/reload-runtime", { deliverAs: "followUp" });
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "pi-extension-sandbox",
3
- "version": "1.10.3",
3
+ "version": "1.10.6",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "pi-extension-sandbox",
9
- "version": "1.10.3",
9
+ "version": "1.10.6",
10
10
  "dependencies": {
11
11
  "@anthropic-ai/sandbox-runtime": "^0.0.26"
12
12
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "pi-extension-sandbox",
3
3
  "private": true,
4
- "version": "1.10.3",
4
+ "version": "1.10.6",
5
5
  "type": "module",
6
6
  "scripts": {
7
7
  "clean": "echo 'nothing to clean'",
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "pi-extension-with-deps",
3
- "version": "0.80.3",
3
+ "version": "0.80.6",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "pi-extension-with-deps",
9
- "version": "0.80.3",
9
+ "version": "0.80.6",
10
10
  "dependencies": {
11
11
  "ms": "^2.1.3"
12
12
  },
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "pi-extension-with-deps",
3
3
  "private": true,
4
- "version": "0.80.3",
4
+ "version": "0.80.6",
5
5
  "type": "module",
6
6
  "scripts": {
7
7
  "clean": "echo 'nothing to clean'",
@@ -116,7 +116,7 @@ await session.prompt("Hello");
116
116
  | `thinkingLevel` | From settings/"off" | off, low, medium, high |
117
117
  | `tools` | `["read", "bash", "edit", "write"]` built-ins | Allowlist tool names across built-in, extension, and custom tools |
118
118
  | `customTools` | `[]` | Additional tool definitions |
119
- | `resourceLoader` | DefaultResourceLoader | Resource loader for extensions, skills, prompts, themes |
119
+ | `resourceLoader` | DefaultResourceLoader | Resource loader for extensions, skills, prompts, themes, and context files |
120
120
  | `sessionManager` | `SessionManager.create(cwd)` | Persistence |
121
121
  | `settingsManager` | `SettingsManager.create(cwd, agentDir)` | Settings overrides |
122
122
 
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@code-yeongyu/senpi-codemode",
3
- "version": "2026.7.9",
3
+ "version": "2026.7.10-2",
4
4
  "description": "Source-only senpi extension package for codemode evaluation tools",
5
5
  "type": "module",
6
6
  "main": "./src/index.ts",
@@ -29,14 +29,14 @@
29
29
  "access": "public"
30
30
  },
31
31
  "dependencies": {
32
- "@earendil-works/pi-ai": "^2026.7.9",
32
+ "@earendil-works/pi-ai": "^2026.7.10-2",
33
33
  "typebox": "1.1.38"
34
34
  },
35
35
  "peerDependencies": {
36
36
  "@code-yeongyu/senpi": "*"
37
37
  },
38
38
  "devDependencies": {
39
- "@code-yeongyu/senpi": "2026.7.9"
39
+ "@code-yeongyu/senpi": "2026.7.10-2"
40
40
  },
41
41
  "keywords": [
42
42
  "senpi",
@@ -164,7 +164,7 @@ const agent = new Agent({
164
164
  initialState: {
165
165
  systemPrompt: string,
166
166
  model: Model<any>,
167
- thinkingLevel: "off" | "minimal" | "low" | "medium" | "high" | "xhigh" | "max", // "max" is Anthropic-only adaptive thinking effort
167
+ thinkingLevel: "off" | "minimal" | "low" | "medium" | "high" | "xhigh" | "max",
168
168
  tools: AgentTool<any>[],
169
169
  messages: AgentMessage[],
170
170
  },
@@ -1 +1 @@
1
- {"version":3,"file":"agent-loop.d.ts","sourceRoot":"","sources":["../src/agent-loop.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAIN,WAAW,EAGX,MAAM,uBAAuB,CAAC;AAE/B,OAAO,KAAK,EACX,YAAY,EACZ,UAAU,EACV,eAAe,EACf,YAAY,EACZ,SAAS,EACT,aAAa,EAEb,QAAQ,EACR,MAAM,YAAY,CAAC;AAEpB,MAAM,MAAM,cAAc,GAAG,CAAC,KAAK,EAAE,UAAU,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;AAEzE;;;GAGG;AACH,wBAAgB,SAAS,CACxB,OAAO,EAAE,YAAY,EAAE,EACvB,OAAO,EAAE,YAAY,EACrB,MAAM,EAAE,eAAe,EACvB,MAAM,CAAC,EAAE,WAAW,EACpB,QAAQ,CAAC,EAAE,QAAQ,GACjB,WAAW,CAAC,UAAU,EAAE,YAAY,EAAE,CAAC,CAiBzC;AAED;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAChC,OAAO,EAAE,YAAY,EACrB,MAAM,EAAE,eAAe,EACvB,MAAM,CAAC,EAAE,WAAW,EACpB,QAAQ,CAAC,EAAE,QAAQ,GACjB,WAAW,CAAC,UAAU,EAAE,YAAY,EAAE,CAAC,CAwBzC;AAED,wBAAsB,YAAY,CACjC,OAAO,EAAE,YAAY,EAAE,EACvB,OAAO,EAAE,YAAY,EACrB,MAAM,EAAE,eAAe,EACvB,IAAI,EAAE,cAAc,EACpB,MAAM,CAAC,EAAE,WAAW,EACpB,QAAQ,CAAC,EAAE,QAAQ,GACjB,OAAO,CAAC,YAAY,EAAE,CAAC,CAgBzB;AAED,wBAAsB,oBAAoB,CACzC,OAAO,EAAE,YAAY,EACrB,MAAM,EAAE,eAAe,EACvB,IAAI,EAAE,cAAc,EACpB,MAAM,CAAC,EAAE,WAAW,EACpB,QAAQ,CAAC,EAAE,QAAQ,GACjB,OAAO,CAAC,YAAY,EAAE,CAAC,CAiBzB;AAonBD,MAAM,WAAW,qBAAqB;IACrC,QAAQ,EAAE,aAAa,CAAC;IACxB,IAAI,EAAE,SAAS,CAAC;IAChB,IAAI,EAAE,OAAO,CAAC;CACd;AAED,wBAAgB,6BAA6B,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,aAAa,GAAG,aAAa,CAYrG;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,aAAa,GAAG,qBAAqB,CAOpG"}
1
+ {"version":3,"file":"agent-loop.d.ts","sourceRoot":"","sources":["../src/agent-loop.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAIN,WAAW,EAGX,MAAM,uBAAuB,CAAC;AAE/B,OAAO,KAAK,EACX,YAAY,EACZ,UAAU,EACV,eAAe,EACf,YAAY,EACZ,SAAS,EACT,aAAa,EAEb,QAAQ,EACR,MAAM,YAAY,CAAC;AAEpB,MAAM,MAAM,cAAc,GAAG,CAAC,KAAK,EAAE,UAAU,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;AAEzE;;;GAGG;AACH,wBAAgB,SAAS,CACxB,OAAO,EAAE,YAAY,EAAE,EACvB,OAAO,EAAE,YAAY,EACrB,MAAM,EAAE,eAAe,EACvB,MAAM,CAAC,EAAE,WAAW,EACpB,QAAQ,CAAC,EAAE,QAAQ,GACjB,WAAW,CAAC,UAAU,EAAE,YAAY,EAAE,CAAC,CAiBzC;AAED;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAChC,OAAO,EAAE,YAAY,EACrB,MAAM,EAAE,eAAe,EACvB,MAAM,CAAC,EAAE,WAAW,EACpB,QAAQ,CAAC,EAAE,QAAQ,GACjB,WAAW,CAAC,UAAU,EAAE,YAAY,EAAE,CAAC,CAwBzC;AAED,wBAAsB,YAAY,CACjC,OAAO,EAAE,YAAY,EAAE,EACvB,OAAO,EAAE,YAAY,EACrB,MAAM,EAAE,eAAe,EACvB,IAAI,EAAE,cAAc,EACpB,MAAM,CAAC,EAAE,WAAW,EACpB,QAAQ,CAAC,EAAE,QAAQ,GACjB,OAAO,CAAC,YAAY,EAAE,CAAC,CAgBzB;AAED,wBAAsB,oBAAoB,CACzC,OAAO,EAAE,YAAY,EACrB,MAAM,EAAE,eAAe,EACvB,IAAI,EAAE,cAAc,EACpB,MAAM,CAAC,EAAE,WAAW,EACpB,QAAQ,CAAC,EAAE,QAAQ,GACjB,OAAO,CAAC,YAAY,EAAE,CAAC,CAiBzB;AA4pBD,MAAM,WAAW,qBAAqB;IACrC,QAAQ,EAAE,aAAa,CAAC;IACxB,IAAI,EAAE,SAAS,CAAC;IAChB,IAAI,EAAE,OAAO,CAAC;CACd;AAED,wBAAgB,6BAA6B,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,aAAa,GAAG,aAAa,CAYrG;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,aAAa,GAAG,qBAAqB,CAOpG"}
@@ -129,7 +129,12 @@ async function runLoop(initialContext, newMessages, initialConfig, signal, emit,
129
129
  const toolResults = [];
130
130
  hasMoreToolCalls = false;
131
131
  if (toolCalls.length > 0) {
132
- const executedToolBatch = await executeToolCalls(currentContext, message, config, signal, emit);
132
+ // A "length" stop means the output was cut off by the token limit, so
133
+ // every tool call in the message may carry truncated arguments. Fail
134
+ // them all instead of executing potentially borked calls.
135
+ const executedToolBatch = message.stopReason === "length"
136
+ ? await failToolCallsFromTruncatedMessage(toolCalls, emit)
137
+ : await executeToolCalls(currentContext, message, config, signal, emit);
133
138
  toolResults.push(...executedToolBatch.messages);
134
139
  hasMoreToolCalls = !executedToolBatch.terminate;
135
140
  for (const result of toolResults) {
@@ -374,6 +379,34 @@ async function readNextAssistantEvent(iterator, idleTimeoutMs, abortPromise, onI
374
379
  }, (error) => settle(() => reject(error)));
375
380
  });
376
381
  }
382
+ /**
383
+ * Fail all tool calls from an assistant message that was truncated by the
384
+ * output token limit. Streamed tool-call arguments are finalized with a
385
+ * best-effort JSON salvage parser, so a truncated message can yield tool calls
386
+ * whose arguments parse and validate but are silently incomplete. None of them
387
+ * are safe to execute; report each as an error so the model can re-issue them.
388
+ */
389
+ async function failToolCallsFromTruncatedMessage(toolCalls, emit) {
390
+ const messages = [];
391
+ for (const toolCall of toolCalls) {
392
+ await emit({
393
+ type: "tool_execution_start",
394
+ toolCallId: toolCall.id,
395
+ toolName: toolCall.name,
396
+ args: toolCall.arguments,
397
+ });
398
+ const finalized = {
399
+ toolCall,
400
+ result: createErrorToolResult(`Tool call "${toolCall.name}" was not executed: the response hit the output token limit, so its arguments may be truncated. Re-issue the tool call with complete arguments.`),
401
+ isError: true,
402
+ };
403
+ await emitToolExecutionEnd(finalized, emit);
404
+ const toolResultMessage = createToolResultMessage(finalized);
405
+ await emitToolResultMessage(toolResultMessage, emit);
406
+ messages.push(toolResultMessage);
407
+ }
408
+ return { messages, terminate: false };
409
+ }
377
410
  /**
378
411
  * Execute tool calls from an assistant message.
379
412
  */
@@ -683,7 +716,9 @@ function createToolResultMessage(finalized) {
683
716
  role: "toolResult",
684
717
  toolCallId: finalized.toolCall.id,
685
718
  toolName: finalized.toolCall.name,
686
- content: finalized.result.content,
719
+ // Untyped tools (JS extensions) can return results without content; normalize
720
+ // so the null never enters session history or provider payloads.
721
+ content: finalized.result.content ?? [],
687
722
  details: finalized.result.details,
688
723
  isError: finalized.isError,
689
724
  timestamp: Date.now(),