@code-yeongyu/senpi 2026.7.17 → 2026.7.20

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 (641) hide show
  1. package/CHANGELOG.md +82 -0
  2. package/README.md +5 -2
  3. package/dist/cli/neo/build-argv.d.ts.map +1 -1
  4. package/dist/cli/neo/build-argv.js +2 -0
  5. package/dist/cli/neo/build-argv.js.map +1 -1
  6. package/dist/core/agent-session-services.d.ts.map +1 -1
  7. package/dist/core/agent-session-services.js +11 -4
  8. package/dist/core/agent-session-services.js.map +1 -1
  9. package/dist/core/agent-session.d.ts +5 -0
  10. package/dist/core/agent-session.d.ts.map +1 -1
  11. package/dist/core/agent-session.js +27 -5
  12. package/dist/core/agent-session.js.map +1 -1
  13. package/dist/core/compaction/compaction.d.ts.map +1 -1
  14. package/dist/core/compaction/compaction.js +20 -4
  15. package/dist/core/compaction/compaction.js.map +1 -1
  16. package/dist/core/dynamic-prompt/build.d.ts +7 -0
  17. package/dist/core/dynamic-prompt/build.d.ts.map +1 -1
  18. package/dist/core/dynamic-prompt/build.js +5 -0
  19. package/dist/core/dynamic-prompt/build.js.map +1 -1
  20. package/dist/core/dynamic-prompt/workstation.d.ts +35 -0
  21. package/dist/core/dynamic-prompt/workstation.d.ts.map +1 -0
  22. package/dist/core/dynamic-prompt/workstation.js +81 -0
  23. package/dist/core/dynamic-prompt/workstation.js.map +1 -0
  24. package/dist/core/extensions/builtin/compaction/index.d.ts.map +1 -1
  25. package/dist/core/extensions/builtin/compaction/index.js +46 -4
  26. package/dist/core/extensions/builtin/compaction/index.js.map +1 -1
  27. package/dist/core/extensions/builtin/compaction/repair-tool-pairs.d.ts +1 -0
  28. package/dist/core/extensions/builtin/compaction/repair-tool-pairs.d.ts.map +1 -1
  29. package/dist/core/extensions/builtin/compaction/repair-tool-pairs.js +20 -2
  30. package/dist/core/extensions/builtin/compaction/repair-tool-pairs.js.map +1 -1
  31. package/dist/core/extensions/builtin/compaction/speculative.d.ts +7 -1
  32. package/dist/core/extensions/builtin/compaction/speculative.d.ts.map +1 -1
  33. package/dist/core/extensions/builtin/compaction/speculative.js +29 -11
  34. package/dist/core/extensions/builtin/compaction/speculative.js.map +1 -1
  35. package/dist/core/extensions/builtin/compaction/todo-bridge.d.ts +9 -7
  36. package/dist/core/extensions/builtin/compaction/todo-bridge.d.ts.map +1 -1
  37. package/dist/core/extensions/builtin/compaction/todo-bridge.js +34 -9
  38. package/dist/core/extensions/builtin/compaction/todo-bridge.js.map +1 -1
  39. package/dist/core/extensions/builtin/gpt-apply-patch/constants.d.ts +1 -0
  40. package/dist/core/extensions/builtin/gpt-apply-patch/constants.d.ts.map +1 -1
  41. package/dist/core/extensions/builtin/gpt-apply-patch/constants.js +5 -1
  42. package/dist/core/extensions/builtin/gpt-apply-patch/constants.js.map +1 -1
  43. package/dist/core/extensions/builtin/gpt-apply-patch/extension.d.ts +2 -1
  44. package/dist/core/extensions/builtin/gpt-apply-patch/extension.d.ts.map +1 -1
  45. package/dist/core/extensions/builtin/gpt-apply-patch/extension.js +48 -29
  46. package/dist/core/extensions/builtin/gpt-apply-patch/extension.js.map +1 -1
  47. package/dist/core/extensions/builtin/gpt-apply-patch/index.d.ts +2 -2
  48. package/dist/core/extensions/builtin/gpt-apply-patch/index.d.ts.map +1 -1
  49. package/dist/core/extensions/builtin/gpt-apply-patch/index.js +2 -2
  50. package/dist/core/extensions/builtin/gpt-apply-patch/index.js.map +1 -1
  51. package/dist/core/extensions/builtin/gpt-apply-patch/tool.d.ts +1 -1
  52. package/dist/core/extensions/builtin/gpt-apply-patch/tool.d.ts.map +1 -1
  53. package/dist/core/extensions/builtin/gpt-apply-patch/tool.js +5 -3
  54. package/dist/core/extensions/builtin/gpt-apply-patch/tool.js.map +1 -1
  55. package/dist/core/extensions/builtin/gpt-apply-patch/types.d.ts +7 -6
  56. package/dist/core/extensions/builtin/gpt-apply-patch/types.d.ts.map +1 -1
  57. package/dist/core/extensions/builtin/gpt-apply-patch/types.js.map +1 -1
  58. package/dist/core/extensions/builtin/hooks/matcher.d.ts.map +1 -1
  59. package/dist/core/extensions/builtin/hooks/matcher.js +1 -0
  60. package/dist/core/extensions/builtin/hooks/matcher.js.map +1 -1
  61. package/dist/core/extensions/builtin/index.d.ts.map +1 -1
  62. package/dist/core/extensions/builtin/index.js +2 -0
  63. package/dist/core/extensions/builtin/index.js.map +1 -1
  64. package/dist/core/extensions/builtin/mcp/config-schema.d.ts +8 -1
  65. package/dist/core/extensions/builtin/mcp/config-schema.d.ts.map +1 -1
  66. package/dist/core/extensions/builtin/mcp/config-schema.js +23 -0
  67. package/dist/core/extensions/builtin/mcp/config-schema.js.map +1 -1
  68. package/dist/core/extensions/builtin/mcp/config.d.ts +13 -0
  69. package/dist/core/extensions/builtin/mcp/config.d.ts.map +1 -1
  70. package/dist/core/extensions/builtin/mcp/config.js +36 -0
  71. package/dist/core/extensions/builtin/mcp/config.js.map +1 -1
  72. package/dist/core/extensions/builtin/mcp/expose/native-search.d.ts +1 -1
  73. package/dist/core/extensions/builtin/mcp/expose/native-search.d.ts.map +1 -1
  74. package/dist/core/extensions/builtin/mcp/expose/native-search.js +1 -1
  75. package/dist/core/extensions/builtin/mcp/expose/native-search.js.map +1 -1
  76. package/dist/core/extensions/builtin/mcp/expose/policy.js +1 -1
  77. package/dist/core/extensions/builtin/mcp/expose/policy.js.map +1 -1
  78. package/dist/core/extensions/builtin/mcp/expose/status.js +1 -1
  79. package/dist/core/extensions/builtin/mcp/expose/status.js.map +1 -1
  80. package/dist/core/extensions/builtin/mcp/expose/tier-b.d.ts +3 -3
  81. package/dist/core/extensions/builtin/mcp/expose/tier-b.d.ts.map +1 -1
  82. package/dist/core/extensions/builtin/mcp/expose/tier-b.js +10 -10
  83. package/dist/core/extensions/builtin/mcp/expose/tier-b.js.map +1 -1
  84. package/dist/core/extensions/builtin/mcp/expose/tool-search.d.ts +3 -3
  85. package/dist/core/extensions/builtin/mcp/expose/tool-search.d.ts.map +1 -1
  86. package/dist/core/extensions/builtin/mcp/expose/tool-search.js +14 -14
  87. package/dist/core/extensions/builtin/mcp/expose/tool-search.js.map +1 -1
  88. package/dist/core/extensions/builtin/mcp/index.js +5 -5
  89. package/dist/core/extensions/builtin/mcp/index.js.map +1 -1
  90. package/dist/core/extensions/builtin/mcp/service-snapshot.d.ts.map +1 -1
  91. package/dist/core/extensions/builtin/mcp/service-snapshot.js +1 -0
  92. package/dist/core/extensions/builtin/mcp/service-snapshot.js.map +1 -1
  93. package/dist/core/extensions/builtin/mcp/service-types.d.ts +12 -0
  94. package/dist/core/extensions/builtin/mcp/service-types.d.ts.map +1 -1
  95. package/dist/core/extensions/builtin/mcp/service-types.js.map +1 -1
  96. package/dist/core/extensions/builtin/mcp/service.d.ts +2 -2
  97. package/dist/core/extensions/builtin/mcp/service.d.ts.map +1 -1
  98. package/dist/core/extensions/builtin/mcp/service.js +4 -3
  99. package/dist/core/extensions/builtin/mcp/service.js.map +1 -1
  100. package/dist/core/extensions/builtin/mcp/status.js +1 -0
  101. package/dist/core/extensions/builtin/mcp/status.js.map +1 -1
  102. package/dist/core/extensions/builtin/prompt-preset/claude-fable-5.d.ts.map +1 -1
  103. package/dist/core/extensions/builtin/prompt-preset/claude-fable-5.js +5 -1
  104. package/dist/core/extensions/builtin/prompt-preset/claude-fable-5.js.map +1 -1
  105. package/dist/core/extensions/builtin/prompt-preset/claude-opus-4-5.d.ts.map +1 -1
  106. package/dist/core/extensions/builtin/prompt-preset/claude-opus-4-5.js +5 -1
  107. package/dist/core/extensions/builtin/prompt-preset/claude-opus-4-5.js.map +1 -1
  108. package/dist/core/extensions/builtin/prompt-preset/claude-opus-4-6.d.ts.map +1 -1
  109. package/dist/core/extensions/builtin/prompt-preset/claude-opus-4-6.js +5 -1
  110. package/dist/core/extensions/builtin/prompt-preset/claude-opus-4-6.js.map +1 -1
  111. package/dist/core/extensions/builtin/prompt-preset/claude-opus-4-7.d.ts.map +1 -1
  112. package/dist/core/extensions/builtin/prompt-preset/claude-opus-4-7.js +5 -1
  113. package/dist/core/extensions/builtin/prompt-preset/claude-opus-4-7.js.map +1 -1
  114. package/dist/core/extensions/builtin/prompt-preset/claude-opus-4-8.d.ts.map +1 -1
  115. package/dist/core/extensions/builtin/prompt-preset/claude-opus-4-8.js +5 -1
  116. package/dist/core/extensions/builtin/prompt-preset/claude-opus-4-8.js.map +1 -1
  117. package/dist/core/extensions/builtin/prompt-preset/glm-5-2.js +2 -2
  118. package/dist/core/extensions/builtin/prompt-preset/glm-5-2.js.map +1 -1
  119. package/dist/core/extensions/builtin/prompt-preset/gpt-5.2.js +1 -1
  120. package/dist/core/extensions/builtin/prompt-preset/gpt-5.2.js.map +1 -1
  121. package/dist/core/extensions/builtin/prompt-preset/gpt-5.3-codex.js +1 -1
  122. package/dist/core/extensions/builtin/prompt-preset/gpt-5.3-codex.js.map +1 -1
  123. package/dist/core/extensions/builtin/prompt-preset/gpt-5.4.js +1 -1
  124. package/dist/core/extensions/builtin/prompt-preset/gpt-5.4.js.map +1 -1
  125. package/dist/core/extensions/builtin/prompt-preset/gpt-5.5.js +3 -3
  126. package/dist/core/extensions/builtin/prompt-preset/gpt-5.5.js.map +1 -1
  127. package/dist/core/extensions/builtin/prompt-preset/gpt-5.6.js +3 -3
  128. package/dist/core/extensions/builtin/prompt-preset/gpt-5.6.js.map +1 -1
  129. package/dist/core/extensions/builtin/prompt-preset/gpt-5.js +1 -1
  130. package/dist/core/extensions/builtin/prompt-preset/gpt-5.js.map +1 -1
  131. package/dist/core/extensions/builtin/prompt-preset/grok-4.5.d.ts +3 -0
  132. package/dist/core/extensions/builtin/prompt-preset/grok-4.5.d.ts.map +1 -0
  133. package/dist/core/extensions/builtin/prompt-preset/grok-4.5.js +80 -0
  134. package/dist/core/extensions/builtin/prompt-preset/grok-4.5.js.map +1 -0
  135. package/dist/core/extensions/builtin/prompt-preset/kimi-k2-6.js +1 -1
  136. package/dist/core/extensions/builtin/prompt-preset/kimi-k2-6.js.map +1 -1
  137. package/dist/core/extensions/builtin/prompt-preset/kimi-k2-7.js +1 -1
  138. package/dist/core/extensions/builtin/prompt-preset/kimi-k2-7.js.map +1 -1
  139. package/dist/core/extensions/builtin/prompt-preset/kimi-k3.d.ts.map +1 -1
  140. package/dist/core/extensions/builtin/prompt-preset/kimi-k3.js +5 -7
  141. package/dist/core/extensions/builtin/prompt-preset/kimi-k3.js.map +1 -1
  142. package/dist/core/extensions/builtin/prompt-preset/presets.d.ts.map +1 -1
  143. package/dist/core/extensions/builtin/prompt-preset/presets.js +14 -0
  144. package/dist/core/extensions/builtin/prompt-preset/presets.js.map +1 -1
  145. package/dist/core/extensions/builtin/prompt-preset/settings.d.ts +1 -1
  146. package/dist/core/extensions/builtin/prompt-preset/settings.d.ts.map +1 -1
  147. package/dist/core/extensions/builtin/prompt-preset/settings.js +1 -0
  148. package/dist/core/extensions/builtin/prompt-preset/settings.js.map +1 -1
  149. package/dist/core/extensions/builtin/terminal/shared.d.ts +7 -0
  150. package/dist/core/extensions/builtin/terminal/shared.d.ts.map +1 -1
  151. package/dist/core/extensions/builtin/terminal/shared.js +7 -0
  152. package/dist/core/extensions/builtin/terminal/shared.js.map +1 -1
  153. package/dist/core/extensions/builtin/terminal/tools/bash.d.ts.map +1 -1
  154. package/dist/core/extensions/builtin/terminal/tools/bash.js +68 -6
  155. package/dist/core/extensions/builtin/terminal/tools/bash.js.map +1 -1
  156. package/dist/core/extensions/builtin/todotools/commands.d.ts +18 -0
  157. package/dist/core/extensions/builtin/todotools/commands.d.ts.map +1 -0
  158. package/dist/core/extensions/builtin/todotools/commands.js +395 -0
  159. package/dist/core/extensions/builtin/todotools/commands.js.map +1 -0
  160. package/dist/core/extensions/builtin/todotools/index.d.ts +4 -1
  161. package/dist/core/extensions/builtin/todotools/index.d.ts.map +1 -1
  162. package/dist/core/extensions/builtin/todotools/index.js +17 -14
  163. package/dist/core/extensions/builtin/todotools/index.js.map +1 -1
  164. package/dist/core/extensions/builtin/todotools/markdown.d.ts +13 -0
  165. package/dist/core/extensions/builtin/todotools/markdown.d.ts.map +1 -0
  166. package/dist/core/extensions/builtin/todotools/markdown.js +82 -0
  167. package/dist/core/extensions/builtin/todotools/markdown.js.map +1 -0
  168. package/dist/core/extensions/builtin/todotools/prompt.d.ts +2 -1
  169. package/dist/core/extensions/builtin/todotools/prompt.d.ts.map +1 -1
  170. package/dist/core/extensions/builtin/todotools/prompt.js +50 -153
  171. package/dist/core/extensions/builtin/todotools/prompt.js.map +1 -1
  172. package/dist/core/extensions/builtin/todotools/state.d.ts +67 -14
  173. package/dist/core/extensions/builtin/todotools/state.d.ts.map +1 -1
  174. package/dist/core/extensions/builtin/todotools/state.js +400 -35
  175. package/dist/core/extensions/builtin/todotools/state.js.map +1 -1
  176. package/dist/core/extensions/builtin/todotools/tools/todo.d.ts +22 -0
  177. package/dist/core/extensions/builtin/todotools/tools/todo.d.ts.map +1 -0
  178. package/dist/core/extensions/builtin/todotools/tools/todo.js +229 -0
  179. package/dist/core/extensions/builtin/todotools/tools/todo.js.map +1 -0
  180. package/dist/core/extensions/builtin/video-in/index.d.ts +3 -0
  181. package/dist/core/extensions/builtin/video-in/index.d.ts.map +1 -0
  182. package/dist/core/extensions/builtin/video-in/index.js +111 -0
  183. package/dist/core/extensions/builtin/video-in/index.js.map +1 -0
  184. package/dist/core/extensions/builtin/websearch/index.d.ts.map +1 -1
  185. package/dist/core/extensions/builtin/websearch/index.js +20 -3
  186. package/dist/core/extensions/builtin/websearch/index.js.map +1 -1
  187. package/dist/core/extensions/index.d.ts +1 -0
  188. package/dist/core/extensions/index.d.ts.map +1 -1
  189. package/dist/core/extensions/index.js.map +1 -1
  190. package/dist/core/extensions/loader.d.ts +10 -1
  191. package/dist/core/extensions/loader.d.ts.map +1 -1
  192. package/dist/core/extensions/loader.js +64 -7
  193. package/dist/core/extensions/loader.js.map +1 -1
  194. package/dist/core/extensions/runner.d.ts +5 -2
  195. package/dist/core/extensions/runner.d.ts.map +1 -1
  196. package/dist/core/extensions/runner.js +49 -8
  197. package/dist/core/extensions/runner.js.map +1 -1
  198. package/dist/core/extensions/types.d.ts +49 -8
  199. package/dist/core/extensions/types.d.ts.map +1 -1
  200. package/dist/core/extensions/types.js.map +1 -1
  201. package/dist/core/model-registry.d.ts +5 -1
  202. package/dist/core/model-registry.d.ts.map +1 -1
  203. package/dist/core/model-registry.js +17 -2
  204. package/dist/core/model-registry.js.map +1 -1
  205. package/dist/core/model-runtime.d.ts +12 -1
  206. package/dist/core/model-runtime.d.ts.map +1 -1
  207. package/dist/core/model-runtime.js +51 -9
  208. package/dist/core/model-runtime.js.map +1 -1
  209. package/dist/core/prompt-templates.d.ts +1 -0
  210. package/dist/core/prompt-templates.d.ts.map +1 -1
  211. package/dist/core/prompt-templates.js +4 -4
  212. package/dist/core/prompt-templates.js.map +1 -1
  213. package/dist/core/provider-composer.d.ts +1 -1
  214. package/dist/core/provider-composer.d.ts.map +1 -1
  215. package/dist/core/provider-composer.js +8 -1
  216. package/dist/core/provider-composer.js.map +1 -1
  217. package/dist/core/remote-catalog-provider.d.ts.map +1 -1
  218. package/dist/core/remote-catalog-provider.js +16 -3
  219. package/dist/core/remote-catalog-provider.js.map +1 -1
  220. package/dist/core/resource-loader.d.ts +6 -0
  221. package/dist/core/resource-loader.d.ts.map +1 -1
  222. package/dist/core/resource-loader.js +27 -2
  223. package/dist/core/resource-loader.js.map +1 -1
  224. package/dist/core/settings-manager.d.ts +6 -0
  225. package/dist/core/settings-manager.d.ts.map +1 -1
  226. package/dist/core/settings-manager.js +20 -0
  227. package/dist/core/settings-manager.js.map +1 -1
  228. package/dist/core/tools/bash.d.ts.map +1 -1
  229. package/dist/core/tools/bash.js +20 -5
  230. package/dist/core/tools/bash.js.map +1 -1
  231. package/dist/core/tools/read.js +1 -1
  232. package/dist/core/tools/read.js.map +1 -1
  233. package/dist/extensions/index.d.ts +3 -0
  234. package/dist/extensions/index.d.ts.map +1 -0
  235. package/dist/extensions/index.js +3 -0
  236. package/dist/extensions/index.js.map +1 -0
  237. package/dist/extensions/llama/client.d.ts +61 -0
  238. package/dist/extensions/llama/client.d.ts.map +1 -0
  239. package/dist/extensions/llama/client.js +298 -0
  240. package/dist/extensions/llama/client.js.map +1 -0
  241. package/dist/extensions/llama/huggingface.d.ts +23 -0
  242. package/dist/extensions/llama/huggingface.d.ts.map +1 -0
  243. package/dist/extensions/llama/huggingface.js +139 -0
  244. package/dist/extensions/llama/huggingface.js.map +1 -0
  245. package/dist/extensions/llama/index.d.ts +3 -0
  246. package/dist/extensions/llama/index.d.ts.map +1 -0
  247. package/dist/extensions/llama/index.js +208 -0
  248. package/dist/extensions/llama/index.js.map +1 -0
  249. package/dist/extensions/llama/provider.d.ts +10 -0
  250. package/dist/extensions/llama/provider.d.ts.map +1 -0
  251. package/dist/extensions/llama/provider.js +106 -0
  252. package/dist/extensions/llama/provider.js.map +1 -0
  253. package/dist/extensions/llama/ui.d.ts +42 -0
  254. package/dist/extensions/llama/ui.d.ts.map +1 -0
  255. package/dist/extensions/llama/ui.js +400 -0
  256. package/dist/extensions/llama/ui.js.map +1 -0
  257. package/dist/index.d.ts +2 -2
  258. package/dist/index.d.ts.map +1 -1
  259. package/dist/index.js.map +1 -1
  260. package/dist/main.d.ts.map +1 -1
  261. package/dist/main.js +6 -4
  262. package/dist/main.js.map +1 -1
  263. package/dist/modes/interactive/components/assistant-message.d.ts +6 -7
  264. package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  265. package/dist/modes/interactive/components/assistant-message.js +154 -114
  266. package/dist/modes/interactive/components/assistant-message.js.map +1 -1
  267. package/dist/modes/interactive/components/footer.d.ts.map +1 -1
  268. package/dist/modes/interactive/components/footer.js +4 -2
  269. package/dist/modes/interactive/components/footer.js.map +1 -1
  270. package/dist/modes/interactive/components/settings-selector.d.ts +4 -0
  271. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  272. package/dist/modes/interactive/components/settings-selector.js +20 -0
  273. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  274. package/dist/modes/interactive/interactive-mode.d.ts +3 -0
  275. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  276. package/dist/modes/interactive/interactive-mode.js +87 -10
  277. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  278. package/dist/modes/interactive/streaming-reveal.d.ts +35 -0
  279. package/dist/modes/interactive/streaming-reveal.d.ts.map +1 -0
  280. package/dist/modes/interactive/streaming-reveal.js +268 -0
  281. package/dist/modes/interactive/streaming-reveal.js.map +1 -0
  282. package/dist/modes/interactive/tool-args-reveal.d.ts +20 -0
  283. package/dist/modes/interactive/tool-args-reveal.d.ts.map +1 -0
  284. package/dist/modes/interactive/tool-args-reveal.js +153 -0
  285. package/dist/modes/interactive/tool-args-reveal.js.map +1 -0
  286. package/dist/utils/child-process.d.ts +17 -1
  287. package/dist/utils/child-process.d.ts.map +1 -1
  288. package/dist/utils/child-process.js +41 -1
  289. package/dist/utils/child-process.js.map +1 -1
  290. package/docs/AGENTS.md +70 -0
  291. package/docs/custom-provider.md +28 -0
  292. package/docs/extensions.md +83 -5
  293. package/docs/index.md +1 -0
  294. package/docs/llama-cpp.md +99 -0
  295. package/docs/mcp.md +21 -5
  296. package/docs/neo.md +2 -1
  297. package/docs/prompt-templates.md +1 -0
  298. package/docs/providers.md +7 -0
  299. package/docs/tui.md +41 -26
  300. package/docs/usage.md +1 -0
  301. package/examples/AGENTS.md +3 -0
  302. package/examples/extensions/README.md +1 -1
  303. package/node_modules/@code-yeongyu/senpi-codemode/CHANGELOG.md +62 -0
  304. package/node_modules/@code-yeongyu/senpi-codemode/package.json +3 -3
  305. package/node_modules/@code-yeongyu/senpi-codemode/src/index.ts +59 -19
  306. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/py/prelude.py +0 -1
  307. package/node_modules/@code-yeongyu/senpi-codemode/src/prompt/eval-prompt.ts +69 -2
  308. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/eval-tool.ts +6 -0
  309. package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.d.ts.map +1 -1
  310. package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.js +19 -4
  311. package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.js.map +1 -1
  312. package/node_modules/@earendil-works/pi-agent-core/dist/proxy.d.ts +3 -1
  313. package/node_modules/@earendil-works/pi-agent-core/dist/proxy.d.ts.map +1 -1
  314. package/node_modules/@earendil-works/pi-agent-core/dist/proxy.js +4 -2
  315. package/node_modules/@earendil-works/pi-agent-core/dist/proxy.js.map +1 -1
  316. package/node_modules/@earendil-works/pi-agent-core/package.json +2 -2
  317. package/node_modules/@earendil-works/pi-ai/README.md +1 -1
  318. package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.d.ts.map +1 -1
  319. package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.js +24 -4
  320. package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.js.map +1 -1
  321. package/node_modules/@earendil-works/pi-ai/dist/api/openai-completions.d.ts +2 -1
  322. package/node_modules/@earendil-works/pi-ai/dist/api/openai-completions.d.ts.map +1 -1
  323. package/node_modules/@earendil-works/pi-ai/dist/api/openai-completions.js +25 -1
  324. package/node_modules/@earendil-works/pi-ai/dist/api/openai-completions.js.map +1 -1
  325. package/node_modules/@earendil-works/pi-ai/dist/api/transform-messages.d.ts.map +1 -1
  326. package/node_modules/@earendil-works/pi-ai/dist/api/transform-messages.js +43 -9
  327. package/node_modules/@earendil-works/pi-ai/dist/api/transform-messages.js.map +1 -1
  328. package/node_modules/@earendil-works/pi-ai/dist/compat.d.ts +1 -0
  329. package/node_modules/@earendil-works/pi-ai/dist/compat.d.ts.map +1 -1
  330. package/node_modules/@earendil-works/pi-ai/dist/compat.js +1 -0
  331. package/node_modules/@earendil-works/pi-ai/dist/compat.js.map +1 -1
  332. package/node_modules/@earendil-works/pi-ai/dist/image-models.generated.d.ts +15 -0
  333. package/node_modules/@earendil-works/pi-ai/dist/image-models.generated.d.ts.map +1 -1
  334. package/node_modules/@earendil-works/pi-ai/dist/image-models.generated.js +15 -0
  335. package/node_modules/@earendil-works/pi-ai/dist/image-models.generated.js.map +1 -1
  336. package/node_modules/@earendil-works/pi-ai/dist/models.generated.d.ts +4267 -22314
  337. package/node_modules/@earendil-works/pi-ai/dist/models.generated.d.ts.map +1 -1
  338. package/node_modules/@earendil-works/pi-ai/dist/providers/amazon-bedrock.models.d.ts +436 -1988
  339. package/node_modules/@earendil-works/pi-ai/dist/providers/amazon-bedrock.models.d.ts.map +1 -1
  340. package/node_modules/@earendil-works/pi-ai/dist/providers/amazon-bedrock.models.js +2 -1892
  341. package/node_modules/@earendil-works/pi-ai/dist/providers/amazon-bedrock.models.js.map +1 -1
  342. package/node_modules/@earendil-works/pi-ai/dist/providers/ant-ling.models.d.ts +10 -80
  343. package/node_modules/@earendil-works/pi-ai/dist/providers/ant-ling.models.d.ts.map +1 -1
  344. package/node_modules/@earendil-works/pi-ai/dist/providers/ant-ling.models.js +2 -57
  345. package/node_modules/@earendil-works/pi-ai/dist/providers/ant-ling.models.js.map +1 -1
  346. package/node_modules/@earendil-works/pi-ai/dist/providers/anthropic.models.d.ts +43 -267
  347. package/node_modules/@earendil-works/pi-ai/dist/providers/anthropic.models.d.ts.map +1 -1
  348. package/node_modules/@earendil-works/pi-ai/dist/providers/anthropic.models.js +2 -252
  349. package/node_modules/@earendil-works/pi-ai/dist/providers/anthropic.models.js.map +1 -1
  350. package/node_modules/@earendil-works/pi-ai/dist/providers/azure-openai-responses.models.d.ts +184 -883
  351. package/node_modules/@earendil-works/pi-ai/dist/providers/azure-openai-responses.models.d.ts.map +1 -1
  352. package/node_modules/@earendil-works/pi-ai/dist/providers/azure-openai-responses.models.js +2 -811
  353. package/node_modules/@earendil-works/pi-ai/dist/providers/azure-openai-responses.models.js.map +1 -1
  354. package/node_modules/@earendil-works/pi-ai/dist/providers/cerebras.models.d.ts +10 -60
  355. package/node_modules/@earendil-works/pi-ai/dist/providers/cerebras.models.d.ts.map +1 -1
  356. package/node_modules/@earendil-works/pi-ai/dist/providers/cerebras.models.js +2 -56
  357. package/node_modules/@earendil-works/pi-ai/dist/providers/cerebras.models.js.map +1 -1
  358. package/node_modules/@earendil-works/pi-ai/dist/providers/cloudflare-ai-gateway.models.d.ts +168 -884
  359. package/node_modules/@earendil-works/pi-ai/dist/providers/cloudflare-ai-gateway.models.d.ts.map +1 -1
  360. package/node_modules/@earendil-works/pi-ai/dist/providers/cloudflare-ai-gateway.models.js +2 -755
  361. package/node_modules/@earendil-works/pi-ai/dist/providers/cloudflare-ai-gateway.models.js.map +1 -1
  362. package/node_modules/@earendil-works/pi-ai/dist/providers/cloudflare-workers-ai.models.d.ts +40 -286
  363. package/node_modules/@earendil-works/pi-ai/dist/providers/cloudflare-workers-ai.models.d.ts.map +1 -1
  364. package/node_modules/@earendil-works/pi-ai/dist/providers/cloudflare-workers-ai.models.js +2 -236
  365. package/node_modules/@earendil-works/pi-ai/dist/providers/cloudflare-workers-ai.models.js.map +1 -1
  366. package/node_modules/@earendil-works/pi-ai/dist/providers/data/amazon-bedrock.json +1 -0
  367. package/node_modules/@earendil-works/pi-ai/dist/providers/data/ant-ling.json +1 -0
  368. package/node_modules/@earendil-works/pi-ai/dist/providers/data/anthropic.json +1 -0
  369. package/node_modules/@earendil-works/pi-ai/dist/providers/data/azure-openai-responses.json +1 -0
  370. package/node_modules/@earendil-works/pi-ai/dist/providers/data/cerebras.json +1 -0
  371. package/node_modules/@earendil-works/pi-ai/dist/providers/data/cloudflare-ai-gateway.json +1 -0
  372. package/node_modules/@earendil-works/pi-ai/dist/providers/data/cloudflare-workers-ai.json +1 -0
  373. package/node_modules/@earendil-works/pi-ai/dist/providers/data/deepseek.json +1 -0
  374. package/node_modules/@earendil-works/pi-ai/dist/providers/data/fireworks.json +1 -0
  375. package/node_modules/@earendil-works/pi-ai/dist/providers/data/github-copilot.json +1 -0
  376. package/node_modules/@earendil-works/pi-ai/dist/providers/data/google-vertex.json +1 -0
  377. package/node_modules/@earendil-works/pi-ai/dist/providers/data/google.json +1 -0
  378. package/node_modules/@earendil-works/pi-ai/dist/providers/data/groq.json +1 -0
  379. package/node_modules/@earendil-works/pi-ai/dist/providers/data/huggingface.json +1 -0
  380. package/node_modules/@earendil-works/pi-ai/dist/providers/data/kimi-coding.json +1 -0
  381. package/node_modules/@earendil-works/pi-ai/dist/providers/data/minimax-cn.json +1 -0
  382. package/node_modules/@earendil-works/pi-ai/dist/providers/data/minimax.json +1 -0
  383. package/node_modules/@earendil-works/pi-ai/dist/providers/data/mistral.json +1 -0
  384. package/node_modules/@earendil-works/pi-ai/dist/providers/data/moonshotai-cn.json +1 -0
  385. package/node_modules/@earendil-works/pi-ai/dist/providers/data/moonshotai.json +1 -0
  386. package/node_modules/@earendil-works/pi-ai/dist/providers/data/nvidia.json +1 -0
  387. package/node_modules/@earendil-works/pi-ai/dist/providers/data/openai-codex.json +1 -0
  388. package/node_modules/@earendil-works/pi-ai/dist/providers/data/openai.json +1 -0
  389. package/node_modules/@earendil-works/pi-ai/dist/providers/data/opencode-go.json +1 -0
  390. package/node_modules/@earendil-works/pi-ai/dist/providers/data/opencode.json +1 -0
  391. package/node_modules/@earendil-works/pi-ai/dist/providers/data/openrouter.json +1 -0
  392. package/node_modules/@earendil-works/pi-ai/dist/providers/data/together.json +1 -0
  393. package/node_modules/@earendil-works/pi-ai/dist/providers/data/vercel-ai-gateway.json +1 -0
  394. package/node_modules/@earendil-works/pi-ai/dist/providers/data/xai.json +1 -0
  395. package/node_modules/@earendil-works/pi-ai/dist/providers/data/xiaomi-token-plan-ams.json +1 -0
  396. package/node_modules/@earendil-works/pi-ai/dist/providers/data/xiaomi-token-plan-cn.json +1 -0
  397. package/node_modules/@earendil-works/pi-ai/dist/providers/data/xiaomi-token-plan-sgp.json +1 -0
  398. package/node_modules/@earendil-works/pi-ai/dist/providers/data/xiaomi.json +1 -0
  399. package/node_modules/@earendil-works/pi-ai/dist/providers/data/zai-coding-cn.json +1 -0
  400. package/node_modules/@earendil-works/pi-ai/dist/providers/data/zai.json +1 -0
  401. package/node_modules/@earendil-works/pi-ai/dist/providers/deepseek.models.d.ts +7 -58
  402. package/node_modules/@earendil-works/pi-ai/dist/providers/deepseek.models.d.ts.map +1 -1
  403. package/node_modules/@earendil-works/pi-ai/dist/providers/deepseek.models.js +2 -40
  404. package/node_modules/@earendil-works/pi-ai/dist/providers/deepseek.models.js.map +1 -1
  405. package/node_modules/@earendil-works/pi-ai/dist/providers/fireworks.models.d.ts +49 -362
  406. package/node_modules/@earendil-works/pi-ai/dist/providers/fireworks.models.d.ts.map +1 -1
  407. package/node_modules/@earendil-works/pi-ai/dist/providers/fireworks.models.js +2 -292
  408. package/node_modules/@earendil-works/pi-ai/dist/providers/fireworks.models.js.map +1 -1
  409. package/node_modules/@earendil-works/pi-ai/dist/providers/github-copilot.models.d.ts +85 -760
  410. package/node_modules/@earendil-works/pi-ai/dist/providers/github-copilot.models.d.ts.map +1 -1
  411. package/node_modules/@earendil-works/pi-ai/dist/providers/github-copilot.models.js +2 -538
  412. package/node_modules/@earendil-works/pi-ai/dist/providers/github-copilot.models.js.map +1 -1
  413. package/node_modules/@earendil-works/pi-ai/dist/providers/google-vertex.models.d.ts +31 -189
  414. package/node_modules/@earendil-works/pi-ai/dist/providers/google-vertex.models.d.ts.map +1 -1
  415. package/node_modules/@earendil-works/pi-ai/dist/providers/google-vertex.models.js +2 -179
  416. package/node_modules/@earendil-works/pi-ai/dist/providers/google-vertex.models.js.map +1 -1
  417. package/node_modules/@earendil-works/pi-ai/dist/providers/google.models.d.ts +49 -309
  418. package/node_modules/@earendil-works/pi-ai/dist/providers/google.models.d.ts.map +1 -1
  419. package/node_modules/@earendil-works/pi-ai/dist/providers/google.models.js +2 -285
  420. package/node_modules/@earendil-works/pi-ai/dist/providers/google.models.js.map +1 -1
  421. package/node_modules/@earendil-works/pi-ai/dist/providers/groq.models.d.ts +22 -118
  422. package/node_modules/@earendil-works/pi-ai/dist/providers/groq.models.d.ts.map +1 -1
  423. package/node_modules/@earendil-works/pi-ai/dist/providers/groq.models.js +2 -122
  424. package/node_modules/@earendil-works/pi-ai/dist/providers/groq.models.js.map +1 -1
  425. package/node_modules/@earendil-works/pi-ai/dist/providers/huggingface.models.d.ts +196 -979
  426. package/node_modules/@earendil-works/pi-ai/dist/providers/huggingface.models.d.ts.map +1 -1
  427. package/node_modules/@earendil-works/pi-ai/dist/providers/huggingface.models.js +2 -884
  428. package/node_modules/@earendil-works/pi-ai/dist/providers/huggingface.models.js.map +1 -1
  429. package/node_modules/@earendil-works/pi-ai/dist/providers/kimi-coding.models.d.ts +16 -121
  430. package/node_modules/@earendil-works/pi-ai/dist/providers/kimi-coding.models.d.ts.map +1 -1
  431. package/node_modules/@earendil-works/pi-ai/dist/providers/kimi-coding.models.js +2 -98
  432. package/node_modules/@earendil-works/pi-ai/dist/providers/kimi-coding.models.js.map +1 -1
  433. package/node_modules/@earendil-works/pi-ai/dist/providers/minimax-cn.models.d.ts +10 -48
  434. package/node_modules/@earendil-works/pi-ai/dist/providers/minimax-cn.models.d.ts.map +1 -1
  435. package/node_modules/@earendil-works/pi-ai/dist/providers/minimax-cn.models.js +2 -53
  436. package/node_modules/@earendil-works/pi-ai/dist/providers/minimax-cn.models.js.map +1 -1
  437. package/node_modules/@earendil-works/pi-ai/dist/providers/minimax.models.d.ts +10 -48
  438. package/node_modules/@earendil-works/pi-ai/dist/providers/minimax.models.d.ts.map +1 -1
  439. package/node_modules/@earendil-works/pi-ai/dist/providers/minimax.models.js +2 -53
  440. package/node_modules/@earendil-works/pi-ai/dist/providers/minimax.models.js.map +1 -1
  441. package/node_modules/@earendil-works/pi-ai/dist/providers/mistral.models.d.ts +91 -480
  442. package/node_modules/@earendil-works/pi-ai/dist/providers/mistral.models.d.ts.map +1 -1
  443. package/node_modules/@earendil-works/pi-ai/dist/providers/mistral.models.js +2 -512
  444. package/node_modules/@earendil-works/pi-ai/dist/providers/mistral.models.js.map +1 -1
  445. package/node_modules/@earendil-works/pi-ai/dist/providers/moonshotai-cn.models.d.ts +31 -257
  446. package/node_modules/@earendil-works/pi-ai/dist/providers/moonshotai-cn.models.d.ts.map +1 -1
  447. package/node_modules/@earendil-works/pi-ai/dist/providers/moonshotai-cn.models.js +2 -185
  448. package/node_modules/@earendil-works/pi-ai/dist/providers/moonshotai-cn.models.js.map +1 -1
  449. package/node_modules/@earendil-works/pi-ai/dist/providers/moonshotai.models.d.ts +31 -257
  450. package/node_modules/@earendil-works/pi-ai/dist/providers/moonshotai.models.d.ts.map +1 -1
  451. package/node_modules/@earendil-works/pi-ai/dist/providers/moonshotai.models.js +2 -185
  452. package/node_modules/@earendil-works/pi-ai/dist/providers/moonshotai.models.js.map +1 -1
  453. package/node_modules/@earendil-works/pi-ai/dist/providers/nvidia.models.d.ts +58 -541
  454. package/node_modules/@earendil-works/pi-ai/dist/providers/nvidia.models.d.ts.map +1 -1
  455. package/node_modules/@earendil-works/pi-ai/dist/providers/nvidia.models.js +2 -382
  456. package/node_modules/@earendil-works/pi-ai/dist/providers/nvidia.models.js.map +1 -1
  457. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-codex.models.d.ts +22 -196
  458. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-codex.models.d.ts.map +1 -1
  459. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-codex.models.js +2 -139
  460. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-codex.models.js.map +1 -1
  461. package/node_modules/@earendil-works/pi-ai/dist/providers/openai.models.d.ts +184 -954
  462. package/node_modules/@earendil-works/pi-ai/dist/providers/openai.models.d.ts.map +1 -1
  463. package/node_modules/@earendil-works/pi-ai/dist/providers/openai.models.js +2 -825
  464. package/node_modules/@earendil-works/pi-ai/dist/providers/openai.models.js.map +1 -1
  465. package/node_modules/@earendil-works/pi-ai/dist/providers/opencode-go.d.ts +1 -1
  466. package/node_modules/@earendil-works/pi-ai/dist/providers/opencode-go.d.ts.map +1 -1
  467. package/node_modules/@earendil-works/pi-ai/dist/providers/opencode-go.js +2 -0
  468. package/node_modules/@earendil-works/pi-ai/dist/providers/opencode-go.js.map +1 -1
  469. package/node_modules/@earendil-works/pi-ai/dist/providers/opencode-go.models.d.ts +46 -335
  470. package/node_modules/@earendil-works/pi-ai/dist/providers/opencode-go.models.d.ts.map +1 -1
  471. package/node_modules/@earendil-works/pi-ai/dist/providers/opencode-go.models.js +2 -273
  472. package/node_modules/@earendil-works/pi-ai/dist/providers/opencode-go.models.js.map +1 -1
  473. package/node_modules/@earendil-works/pi-ai/dist/providers/opencode.models.d.ts +163 -1185
  474. package/node_modules/@earendil-works/pi-ai/dist/providers/opencode.models.d.ts.map +1 -1
  475. package/node_modules/@earendil-works/pi-ai/dist/providers/opencode.models.js +2 -996
  476. package/node_modules/@earendil-works/pi-ai/dist/providers/opencode.models.js.map +1 -1
  477. package/node_modules/@earendil-works/pi-ai/dist/providers/openrouter.models.d.ts +1076 -5750
  478. package/node_modules/@earendil-works/pi-ai/dist/providers/openrouter.models.d.ts.map +1 -1
  479. package/node_modules/@earendil-works/pi-ai/dist/providers/openrouter.models.js +2 -4910
  480. package/node_modules/@earendil-works/pi-ai/dist/providers/openrouter.models.js.map +1 -1
  481. package/node_modules/@earendil-works/pi-ai/dist/providers/together.models.d.ts +49 -579
  482. package/node_modules/@earendil-works/pi-ai/dist/providers/together.models.d.ts.map +1 -1
  483. package/node_modules/@earendil-works/pi-ai/dist/providers/together.models.js +2 -377
  484. package/node_modules/@earendil-works/pi-ai/dist/providers/together.models.js.map +1 -1
  485. package/node_modules/@earendil-works/pi-ai/dist/providers/vercel-ai-gateway.models.d.ts +752 -3336
  486. package/node_modules/@earendil-works/pi-ai/dist/providers/vercel-ai-gateway.models.d.ts.map +1 -1
  487. package/node_modules/@earendil-works/pi-ai/dist/providers/vercel-ai-gateway.models.js +2 -3263
  488. package/node_modules/@earendil-works/pi-ai/dist/providers/vercel-ai-gateway.models.js.map +1 -1
  489. package/node_modules/@earendil-works/pi-ai/dist/providers/xai.models.d.ts +10 -65
  490. package/node_modules/@earendil-works/pi-ai/dist/providers/xai.models.d.ts.map +1 -1
  491. package/node_modules/@earendil-works/pi-ai/dist/providers/xai.models.js +2 -57
  492. package/node_modules/@earendil-works/pi-ai/dist/providers/xai.models.js.map +1 -1
  493. package/node_modules/@earendil-works/pi-ai/dist/providers/xiaomi-token-plan-ams.models.d.ts +10 -63
  494. package/node_modules/@earendil-works/pi-ai/dist/providers/xiaomi-token-plan-ams.models.d.ts.map +1 -1
  495. package/node_modules/@earendil-works/pi-ai/dist/providers/xiaomi-token-plan-ams.models.js +2 -56
  496. package/node_modules/@earendil-works/pi-ai/dist/providers/xiaomi-token-plan-ams.models.js.map +1 -1
  497. package/node_modules/@earendil-works/pi-ai/dist/providers/xiaomi-token-plan-cn.models.d.ts +10 -63
  498. package/node_modules/@earendil-works/pi-ai/dist/providers/xiaomi-token-plan-cn.models.d.ts.map +1 -1
  499. package/node_modules/@earendil-works/pi-ai/dist/providers/xiaomi-token-plan-cn.models.js +2 -56
  500. package/node_modules/@earendil-works/pi-ai/dist/providers/xiaomi-token-plan-cn.models.js.map +1 -1
  501. package/node_modules/@earendil-works/pi-ai/dist/providers/xiaomi-token-plan-sgp.models.d.ts +10 -63
  502. package/node_modules/@earendil-works/pi-ai/dist/providers/xiaomi-token-plan-sgp.models.d.ts.map +1 -1
  503. package/node_modules/@earendil-works/pi-ai/dist/providers/xiaomi-token-plan-sgp.models.js +2 -56
  504. package/node_modules/@earendil-works/pi-ai/dist/providers/xiaomi-token-plan-sgp.models.js.map +1 -1
  505. package/node_modules/@earendil-works/pi-ai/dist/providers/xiaomi.models.d.ts +19 -126
  506. package/node_modules/@earendil-works/pi-ai/dist/providers/xiaomi.models.d.ts.map +1 -1
  507. package/node_modules/@earendil-works/pi-ai/dist/providers/xiaomi.models.js +2 -110
  508. package/node_modules/@earendil-works/pi-ai/dist/providers/xiaomi.models.js.map +1 -1
  509. package/node_modules/@earendil-works/pi-ai/dist/providers/zai-coding-cn.models.d.ts +19 -144
  510. package/node_modules/@earendil-works/pi-ai/dist/providers/zai-coding-cn.models.d.ts.map +1 -1
  511. package/node_modules/@earendil-works/pi-ai/dist/providers/zai-coding-cn.models.js +2 -111
  512. package/node_modules/@earendil-works/pi-ai/dist/providers/zai-coding-cn.models.js.map +1 -1
  513. package/node_modules/@earendil-works/pi-ai/dist/providers/zai.models.d.ts +19 -144
  514. package/node_modules/@earendil-works/pi-ai/dist/providers/zai.models.d.ts.map +1 -1
  515. package/node_modules/@earendil-works/pi-ai/dist/providers/zai.models.js +2 -111
  516. package/node_modules/@earendil-works/pi-ai/dist/providers/zai.models.js.map +1 -1
  517. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/context-transformer.d.ts.map +1 -1
  518. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/context-transformer.js +12 -0
  519. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/context-transformer.js.map +1 -1
  520. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/index.d.ts +1 -1
  521. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/index.d.ts.map +1 -1
  522. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/index.js +4 -2
  523. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/index.js.map +1 -1
  524. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/coerce-parameters.d.ts +1 -0
  525. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/coerce-parameters.d.ts.map +1 -1
  526. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/coerce-parameters.js +1 -1
  527. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/coerce-parameters.js.map +1 -1
  528. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/format.d.ts +1 -0
  529. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/format.d.ts.map +1 -1
  530. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/format.js +1 -1
  531. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/format.js.map +1 -1
  532. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/invoke-protocol.d.ts +19 -0
  533. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/invoke-protocol.d.ts.map +1 -0
  534. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/invoke-protocol.js +8 -0
  535. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/invoke-protocol.js.map +1 -0
  536. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/invoke-tag-scanner.d.ts +11 -0
  537. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/invoke-tag-scanner.d.ts.map +1 -1
  538. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/invoke-tag-scanner.js +40 -1
  539. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/invoke-tag-scanner.js.map +1 -1
  540. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/parse.d.ts +2 -0
  541. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/parse.d.ts.map +1 -1
  542. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/parse.js +7 -4
  543. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/parse.js.map +1 -1
  544. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/stream.d.ts +2 -0
  545. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/stream.d.ts.map +1 -1
  546. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/stream.js +104 -15
  547. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/stream.js.map +1 -1
  548. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/antml/coerce-parameters.d.ts +15 -0
  549. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/antml/coerce-parameters.d.ts.map +1 -0
  550. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/antml/coerce-parameters.js +198 -0
  551. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/antml/coerce-parameters.js.map +1 -0
  552. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/antml/config.d.ts +3 -0
  553. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/antml/config.d.ts.map +1 -0
  554. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/antml/config.js +8 -0
  555. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/antml/config.js.map +1 -0
  556. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/antml/format.d.ts +6 -0
  557. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/antml/format.d.ts.map +1 -0
  558. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/antml/format.js +33 -0
  559. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/antml/format.js.map +1 -0
  560. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/antml/index.d.ts +6 -0
  561. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/antml/index.d.ts.map +1 -0
  562. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/antml/index.js +6 -0
  563. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/antml/index.js.map +1 -0
  564. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/antml/parse.d.ts +4 -0
  565. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/antml/parse.d.ts.map +1 -0
  566. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/antml/parse.js +6 -0
  567. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/antml/parse.js.map +1 -0
  568. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/antml/repair.d.ts +12 -0
  569. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/antml/repair.d.ts.map +1 -0
  570. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/antml/repair.js +46 -0
  571. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/antml/repair.js.map +1 -0
  572. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/antml/stream.d.ts +4 -0
  573. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/antml/stream.d.ts.map +1 -0
  574. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/antml/stream.js +6 -0
  575. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/antml/stream.js.map +1 -0
  576. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/gemma4.d.ts +8 -1
  577. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/gemma4.d.ts.map +1 -1
  578. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/gemma4.js +129 -27
  579. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/gemma4.js.map +1 -1
  580. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/json-mix.d.ts.map +1 -1
  581. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/json-mix.js +140 -6
  582. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/json-mix.js.map +1 -1
  583. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/morph-xml.d.ts.map +1 -1
  584. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/morph-xml.js +28 -6
  585. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/morph-xml.js.map +1 -1
  586. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/yaml-xml.d.ts.map +1 -1
  587. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/yaml-xml.js +51 -18
  588. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/yaml-xml.js.map +1 -1
  589. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/stream-wrapper.d.ts.map +1 -1
  590. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/stream-wrapper.js +70 -9
  591. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/stream-wrapper.js.map +1 -1
  592. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/types.d.ts +6 -2
  593. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/types.d.ts.map +1 -1
  594. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/types.js.map +1 -1
  595. package/node_modules/@earendil-works/pi-ai/dist/types.d.ts +16 -3
  596. package/node_modules/@earendil-works/pi-ai/dist/types.d.ts.map +1 -1
  597. package/node_modules/@earendil-works/pi-ai/dist/types.js +4 -1
  598. package/node_modules/@earendil-works/pi-ai/dist/types.js.map +1 -1
  599. package/node_modules/@earendil-works/pi-ai/dist/utils/retry.d.ts.map +1 -1
  600. package/node_modules/@earendil-works/pi-ai/dist/utils/retry.js +1 -0
  601. package/node_modules/@earendil-works/pi-ai/dist/utils/retry.js.map +1 -1
  602. package/node_modules/@earendil-works/pi-ai/dist/utils/tool-pair-repair.d.ts.map +1 -1
  603. package/node_modules/@earendil-works/pi-ai/dist/utils/tool-pair-repair.js +19 -2
  604. package/node_modules/@earendil-works/pi-ai/dist/utils/tool-pair-repair.js.map +1 -1
  605. package/node_modules/@earendil-works/pi-ai/dist/utils/tool-schema-compat.d.ts +19 -0
  606. package/node_modules/@earendil-works/pi-ai/dist/utils/tool-schema-compat.d.ts.map +1 -0
  607. package/node_modules/@earendil-works/pi-ai/dist/utils/tool-schema-compat.js +215 -0
  608. package/node_modules/@earendil-works/pi-ai/dist/utils/tool-schema-compat.js.map +1 -0
  609. package/node_modules/@earendil-works/pi-ai/package.json +2 -2
  610. package/node_modules/@earendil-works/pi-pty/dist/registry-session.d.ts +1 -1
  611. package/node_modules/@earendil-works/pi-pty/dist/registry-session.d.ts.map +1 -1
  612. package/node_modules/@earendil-works/pi-pty/dist/registry-session.js +25 -6
  613. package/node_modules/@earendil-works/pi-pty/dist/registry-session.js.map +1 -1
  614. package/node_modules/@earendil-works/pi-pty/dist/registry-types.d.ts +6 -0
  615. package/node_modules/@earendil-works/pi-pty/dist/registry-types.d.ts.map +1 -1
  616. package/node_modules/@earendil-works/pi-pty/dist/registry-types.js.map +1 -1
  617. package/node_modules/@earendil-works/pi-pty/dist/registry.d.ts +1 -0
  618. package/node_modules/@earendil-works/pi-pty/dist/registry.d.ts.map +1 -1
  619. package/node_modules/@earendil-works/pi-pty/dist/registry.js +9 -1
  620. package/node_modules/@earendil-works/pi-pty/dist/registry.js.map +1 -1
  621. package/node_modules/@earendil-works/pi-pty/package.json +1 -1
  622. package/node_modules/@earendil-works/pi-tui/dist/index.d.ts +1 -1
  623. package/node_modules/@earendil-works/pi-tui/dist/index.d.ts.map +1 -1
  624. package/node_modules/@earendil-works/pi-tui/dist/index.js +1 -1
  625. package/node_modules/@earendil-works/pi-tui/dist/index.js.map +1 -1
  626. package/node_modules/@earendil-works/pi-tui/dist/tui.d.ts +6 -1
  627. package/node_modules/@earendil-works/pi-tui/dist/tui.d.ts.map +1 -1
  628. package/node_modules/@earendil-works/pi-tui/dist/tui.js +14 -2
  629. package/node_modules/@earendil-works/pi-tui/dist/tui.js.map +1 -1
  630. package/node_modules/@earendil-works/pi-tui/dist/utils.js +1 -1
  631. package/node_modules/@earendil-works/pi-tui/dist/utils.js.map +1 -1
  632. package/node_modules/@earendil-works/pi-tui/package.json +1 -1
  633. package/package.json +6 -6
  634. package/dist/core/extensions/builtin/todotools/tools/todoread.d.ts +0 -4
  635. package/dist/core/extensions/builtin/todotools/tools/todoread.d.ts.map +0 -1
  636. package/dist/core/extensions/builtin/todotools/tools/todoread.js +0 -37
  637. package/dist/core/extensions/builtin/todotools/tools/todoread.js.map +0 -1
  638. package/dist/core/extensions/builtin/todotools/tools/todowrite.d.ts +0 -10
  639. package/dist/core/extensions/builtin/todotools/tools/todowrite.d.ts.map +0 -1
  640. package/dist/core/extensions/builtin/todotools/tools/todowrite.js +0 -95
  641. package/dist/core/extensions/builtin/todotools/tools/todowrite.js.map +0 -1
@@ -1,29 +1,82 @@
1
+ import type { SessionEntry } from "../../../session-manager.ts";
2
+ export type TodoStatus = "pending" | "in_progress" | "completed" | "abandoned";
3
+ export type TodoOperation = "init" | "start" | "done" | "rm" | "drop" | "append" | "view";
1
4
  export type TodoItem = {
2
5
  content: string;
3
- status: string;
4
- priority: string;
6
+ status: TodoStatus;
5
7
  };
6
- export type TodoWriteDetails = {
7
- todos: TodoItem[];
8
+ export type TodoPhase = {
9
+ name: string;
10
+ tasks: TodoItem[];
8
11
  };
9
- export type TodoStateEntry = {
10
- todos: TodoItem[];
12
+ export type TodoCompletionTransition = {
13
+ phase: string;
14
+ content: string;
15
+ };
16
+ export type TodoToolDetails = {
17
+ op?: TodoOperation;
18
+ phases: TodoPhase[];
19
+ storage: "session" | "memory";
20
+ completedTasks?: TodoCompletionTransition[];
11
21
  };
12
- type BranchEntry = {
13
- type: string;
14
- customType?: string;
15
- data?: unknown;
16
- message?: unknown;
22
+ export type TodoStateEntry = {
23
+ schema: "v2";
24
+ phases: TodoPhase[];
17
25
  };
18
26
  export declare const TODO_STATE_ENTRY_TYPE = "senpi.todo-state";
27
+ export declare const DEFAULT_INIT_PHASE = "Tasks";
28
+ type TodoPhaseInput = {
29
+ phase: string;
30
+ items: string[];
31
+ };
32
+ export type TodoOpEntry = {
33
+ op: TodoOperation;
34
+ list?: TodoPhaseInput[];
35
+ task?: string;
36
+ phase?: string;
37
+ items?: string[];
38
+ };
39
+ type TaskHit = {
40
+ task: TodoItem;
41
+ phase: TodoPhase;
42
+ };
43
+ type BranchEntry = SessionEntry;
44
+ export declare function findTaskByContent(phases: TodoPhase[], content: string): TaskHit | undefined;
45
+ export declare function findPhaseByName(phases: TodoPhase[], name: string): TodoPhase | undefined;
46
+ export declare function cloneTask(task: TodoItem): TodoItem;
47
+ export declare function clonePhases(phases: readonly TodoPhase[]): TodoPhase[];
48
+ export declare function normalizeInProgressTask(phases: TodoPhase[]): void;
49
+ /** Return the active task, preferring an in-progress item over the first pending item. */
50
+ export declare function nextActionableTask(phases: readonly TodoPhase[]): TodoItem | undefined;
51
+ export declare function getCompletionTransitions(previous: readonly TodoPhase[], updated: readonly TodoPhase[]): TodoCompletionTransition[];
52
+ export declare function resolveTaskOrError(phases: TodoPhase[], content: string | undefined, errors: string[]): TaskHit | undefined;
53
+ export declare function resolvePhaseOrError(phases: TodoPhase[], name: string | undefined, errors: string[]): TodoPhase | undefined;
54
+ export declare function getTaskTargets(phases: TodoPhase[], entry: TodoOpEntry, errors: string[]): TodoItem[];
55
+ export declare function initPhases(entry: TodoOpEntry, errors: string[]): TodoPhase[];
56
+ export declare function appendItems(phases: TodoPhase[], entry: TodoOpEntry, errors: string[]): TodoPhase[];
57
+ export declare function removeTasks(phases: TodoPhase[], entry: TodoOpEntry, errors: string[]): TodoPhase[];
58
+ export declare function applyEntry(phases: TodoPhase[], entry: TodoOpEntry, errors: string[]): TodoPhase[];
59
+ export declare function applyParams(phases: TodoPhase[], params: TodoOpEntry): {
60
+ phases: TodoPhase[];
61
+ errors: string[];
62
+ };
63
+ export declare function applyOpsToPhases(currentPhases: readonly TodoPhase[], ops: readonly TodoOpEntry[]): {
64
+ phases: TodoPhase[];
65
+ errors: string[];
66
+ };
67
+ export declare function formatSummary(phases: readonly TodoPhase[], errors: readonly string[], readOnly?: boolean): string;
68
+ export declare function sanitizeTodoText(text: string): string;
19
69
  export declare function isTerminalTodoStatus(status: string): boolean;
20
70
  export declare function isIncompleteTodo(todo: TodoItem): boolean;
21
- export declare function sanitizeTodoText(text: string): string;
22
71
  export declare function getTodoMarker(status: string): string;
23
- export declare function getTodoWidgetLines(todos: TodoItem[]): string[] | undefined;
24
- export declare function getTodoResultLines(todos: TodoItem[]): string[];
72
+ export declare function getTodoWidgetLines(phases: readonly TodoPhase[]): string[] | undefined;
73
+ export declare function getTodoResultLines(phases: readonly TodoPhase[]): string[];
25
74
  export declare function isTodoItem(value: unknown): value is TodoItem;
26
75
  export declare function isTodoItemArray(value: unknown): value is TodoItem[];
76
+ export declare function isTodoPhase(value: unknown): value is TodoPhase;
77
+ export declare function isTodoPhaseArray(value: unknown): value is TodoPhase[];
78
+ export declare function getLatestPhasesFromBranchEntries(entries: BranchEntry[]): TodoPhase[];
79
+ /** Compatibility reader for callers that still expect the old flat array. */
27
80
  export declare function getLatestTodosFromBranchEntries(entries: BranchEntry[]): TodoItem[];
28
81
  export {};
29
82
  //# sourceMappingURL=state.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/todotools/state.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,QAAQ,GAAG;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC9B,KAAK,EAAE,QAAQ,EAAE,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC5B,KAAK,EAAE,QAAQ,EAAE,CAAC;CAClB,CAAC;AAEF,KAAK,WAAW,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC;AAE5F,eAAO,MAAM,qBAAqB,qBAAqB,CAAC;AAExD,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAE5D;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAExD;AAMD,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAMrD;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAKpD;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,MAAM,EAAE,GAAG,SAAS,CAK1E;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,MAAM,EAAE,CAK9D;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,QAAQ,CAM5D;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,QAAQ,EAAE,CAEnE;AAED,wBAAgB,+BAA+B,CAAC,OAAO,EAAE,WAAW,EAAE,GAAG,QAAQ,EAAE,CA4BlF"}
1
+ {"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/todotools/state.ts"],"names":[],"mappings":"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"}
@@ -1,13 +1,355 @@
1
+ // Ported and adapted from oh-my-pi's todo tool (MIT License).
2
+ // Copyright (c) 2025 Mario Zechner
3
+ // Copyright (c) 2025-2026 Can Bölük
4
+ // https://github.com/can1357/oh-my-pi
1
5
  import { stripAnsi } from "../../../../utils/ansi.js";
2
6
  export const TODO_STATE_ENTRY_TYPE = "senpi.todo-state";
3
- export function isTerminalTodoStatus(status) {
4
- return status === "completed" || status === "cancelled";
7
+ export const DEFAULT_INIT_PHASE = "Tasks";
8
+ function isRecord(value) {
9
+ return typeof value === "object" && value !== null;
5
10
  }
6
- export function isIncompleteTodo(todo) {
7
- return !isTerminalTodoStatus(todo.status);
11
+ function isTodoStatus(value) {
12
+ return value === "pending" || value === "in_progress" || value === "completed" || value === "abandoned";
13
+ }
14
+ function parseTodoStatus(value) {
15
+ if (value === "cancelled")
16
+ return "abandoned";
17
+ return isTodoStatus(value) ? value : undefined;
18
+ }
19
+ function parseTodoItem(value, options) {
20
+ if (!isRecord(value) || typeof value.content !== "string")
21
+ return undefined;
22
+ const status = parseTodoStatus(value.status) ?? (options?.lenient ? "pending" : undefined);
23
+ return status ? { content: value.content, status } : undefined;
24
+ }
25
+ function parseTodoPhase(value) {
26
+ if (!isRecord(value) || typeof value.name !== "string" || !Array.isArray(value.tasks))
27
+ return undefined;
28
+ const tasks = [];
29
+ for (const task of value.tasks) {
30
+ const parsed = parseTodoItem(task);
31
+ if (!parsed)
32
+ return undefined;
33
+ tasks.push(parsed);
34
+ }
35
+ return { name: value.name, tasks };
36
+ }
37
+ function parsePhases(value) {
38
+ if (!Array.isArray(value))
39
+ return undefined;
40
+ const phases = [];
41
+ for (const phase of value) {
42
+ const parsed = parseTodoPhase(phase);
43
+ if (!parsed)
44
+ return undefined;
45
+ phases.push(parsed);
46
+ }
47
+ return phases;
8
48
  }
9
- function countOpenTodos(todos) {
10
- return todos.filter(isIncompleteTodo).length;
49
+ function parseLegacyTodos(value) {
50
+ if (!Array.isArray(value))
51
+ return undefined;
52
+ const tasks = [];
53
+ for (const todo of value) {
54
+ // Legacy todowrite persisted arbitrary status strings (e.g. "blocked").
55
+ // Preserve those entries instead of dropping the whole list: unknown
56
+ // statuses become "pending" so the task survives migration as open work.
57
+ const parsed = parseTodoItem(todo, { lenient: true });
58
+ if (!parsed)
59
+ return undefined;
60
+ tasks.push(parsed);
61
+ }
62
+ return [{ name: DEFAULT_INIT_PHASE, tasks }];
63
+ }
64
+ function readTodoPayload(value) {
65
+ if (!isRecord(value))
66
+ return undefined;
67
+ if (value.schema === "v2")
68
+ return parsePhases(value.phases);
69
+ if (Array.isArray(value.phases))
70
+ return parsePhases(value.phases);
71
+ if (Array.isArray(value.todos))
72
+ return parseLegacyTodos(value.todos);
73
+ return undefined;
74
+ }
75
+ export function findTaskByContent(phases, content) {
76
+ for (const phase of phases) {
77
+ const task = phase.tasks.find((candidate) => candidate.content === content);
78
+ if (task)
79
+ return { task, phase };
80
+ }
81
+ return undefined;
82
+ }
83
+ export function findPhaseByName(phases, name) {
84
+ return phases.find((phase) => phase.name === name);
85
+ }
86
+ export function cloneTask(task) {
87
+ return { content: task.content, status: task.status };
88
+ }
89
+ export function clonePhases(phases) {
90
+ return phases.map((phase) => ({ name: phase.name, tasks: phase.tasks.map(cloneTask) }));
91
+ }
92
+ export function normalizeInProgressTask(phases) {
93
+ const orderedTasks = phases.flatMap((phase) => phase.tasks);
94
+ if (orderedTasks.length === 0)
95
+ return;
96
+ const inProgressTasks = orderedTasks.filter((task) => task.status === "in_progress");
97
+ if (inProgressTasks.length > 1) {
98
+ for (const task of inProgressTasks.slice(1))
99
+ task.status = "pending";
100
+ }
101
+ if (inProgressTasks.length > 0)
102
+ return;
103
+ const firstPendingTask = orderedTasks.find((task) => task.status === "pending");
104
+ if (firstPendingTask)
105
+ firstPendingTask.status = "in_progress";
106
+ }
107
+ /** Return the active task, preferring an in-progress item over the first pending item. */
108
+ export function nextActionableTask(phases) {
109
+ let firstPending;
110
+ for (const phase of phases) {
111
+ for (const task of phase.tasks) {
112
+ if (task.status === "in_progress")
113
+ return task;
114
+ if (!firstPending && task.status === "pending")
115
+ firstPending = task;
116
+ }
117
+ }
118
+ return firstPending;
119
+ }
120
+ export function getCompletionTransitions(previous, updated) {
121
+ const previousStatuses = new Map();
122
+ for (const phase of previous) {
123
+ for (const task of phase.tasks)
124
+ previousStatuses.set(`${phase.name}\u0000${task.content}`, task.status);
125
+ }
126
+ const transitions = [];
127
+ for (const phase of updated) {
128
+ for (const task of phase.tasks) {
129
+ if (task.status !== "completed")
130
+ continue;
131
+ const previousStatus = previousStatuses.get(`${phase.name}\u0000${task.content}`);
132
+ if (previousStatus && previousStatus !== "completed") {
133
+ transitions.push({ phase: phase.name, content: task.content });
134
+ }
135
+ }
136
+ }
137
+ return transitions;
138
+ }
139
+ export function resolveTaskOrError(phases, content, errors) {
140
+ if (!content) {
141
+ errors.push("Missing task content");
142
+ return undefined;
143
+ }
144
+ const hit = findTaskByContent(phases, content);
145
+ if (!hit) {
146
+ if (/^task-\d+$/.test(content)) {
147
+ errors.push(`Task "${content}" not found. Tasks are referenced by content, not by IDs — pass the task's full text from the previous result.`);
148
+ }
149
+ else {
150
+ const totalTasks = phases.reduce((sum, phase) => sum + phase.tasks.length, 0);
151
+ const hint = totalTasks === 0 ? " (todo list is empty — was it replaced or not yet created?)" : "";
152
+ errors.push(`Task "${content}" not found${hint}`);
153
+ }
154
+ }
155
+ return hit;
156
+ }
157
+ export function resolvePhaseOrError(phases, name, errors) {
158
+ if (!name) {
159
+ errors.push("Missing phase name");
160
+ return undefined;
161
+ }
162
+ const phase = findPhaseByName(phases, name);
163
+ if (!phase)
164
+ errors.push(`Phase "${name}" not found`);
165
+ return phase;
166
+ }
167
+ export function getTaskTargets(phases, entry, errors) {
168
+ if (entry.task) {
169
+ const hit = resolveTaskOrError(phases, entry.task, errors);
170
+ return hit ? [hit.task] : [];
171
+ }
172
+ if (entry.phase) {
173
+ const phase = resolvePhaseOrError(phases, entry.phase, errors);
174
+ return phase ? [...phase.tasks] : [];
175
+ }
176
+ return phases.flatMap((phase) => phase.tasks);
177
+ }
178
+ export function initPhases(entry, errors) {
179
+ const list = entry.list ??
180
+ (entry.items && entry.items.length > 0
181
+ ? [{ phase: entry.phase ?? DEFAULT_INIT_PHASE, items: entry.items }]
182
+ : undefined);
183
+ if (!list) {
184
+ errors.push("Missing list for init operation");
185
+ return [];
186
+ }
187
+ const seenPhases = new Set();
188
+ const seenTasks = new Set();
189
+ for (const listEntry of list) {
190
+ if (seenPhases.has(listEntry.phase))
191
+ errors.push(`Duplicate phase "${listEntry.phase}" in init list`);
192
+ seenPhases.add(listEntry.phase);
193
+ if (listEntry.items.length === 0)
194
+ errors.push(`Phase "${listEntry.phase}" has no tasks in init list`);
195
+ for (const content of listEntry.items) {
196
+ if (seenTasks.has(content))
197
+ errors.push(`Duplicate task "${content}" in init list`);
198
+ seenTasks.add(content);
199
+ }
200
+ }
201
+ return list.map((listEntry) => ({
202
+ name: listEntry.phase,
203
+ tasks: listEntry.items.map((content) => ({ content, status: "pending" })),
204
+ }));
205
+ }
206
+ export function appendItems(phases, entry, errors) {
207
+ if (!entry.phase) {
208
+ errors.push("Missing phase name for append operation");
209
+ return phases;
210
+ }
211
+ if (!entry.items || entry.items.length === 0) {
212
+ errors.push("Missing items for append operation");
213
+ return phases;
214
+ }
215
+ const seen = new Set();
216
+ let hasDuplicate = false;
217
+ for (const content of entry.items) {
218
+ if (seen.has(content) || findTaskByContent(phases, content)) {
219
+ errors.push(`Task "${content}" already exists`);
220
+ hasDuplicate = true;
221
+ }
222
+ seen.add(content);
223
+ }
224
+ if (hasDuplicate)
225
+ return phases;
226
+ let phase = findPhaseByName(phases, entry.phase);
227
+ if (!phase) {
228
+ phase = { name: entry.phase, tasks: [] };
229
+ phases.push(phase);
230
+ }
231
+ for (const content of entry.items)
232
+ phase.tasks.push({ content, status: "pending" });
233
+ return phases;
234
+ }
235
+ export function removeTasks(phases, entry, errors) {
236
+ if (entry.task) {
237
+ const hit = resolveTaskOrError(phases, entry.task, errors);
238
+ if (!hit)
239
+ return phases;
240
+ hit.phase.tasks = hit.phase.tasks.filter((candidate) => candidate !== hit.task);
241
+ return phases;
242
+ }
243
+ if (entry.phase) {
244
+ const phase = resolvePhaseOrError(phases, entry.phase, errors);
245
+ if (!phase)
246
+ return phases;
247
+ phase.tasks = [];
248
+ return phases;
249
+ }
250
+ for (const phase of phases)
251
+ phase.tasks = [];
252
+ return phases;
253
+ }
254
+ export function applyEntry(phases, entry, errors) {
255
+ switch (entry.op) {
256
+ case "init":
257
+ return initPhases(entry, errors);
258
+ case "start": {
259
+ const hit = resolveTaskOrError(phases, entry.task, errors);
260
+ if (!hit)
261
+ return phases;
262
+ for (const phase of phases) {
263
+ for (const candidate of phase.tasks) {
264
+ if (candidate.status === "in_progress" && candidate !== hit.task)
265
+ candidate.status = "pending";
266
+ }
267
+ }
268
+ hit.task.status = "in_progress";
269
+ return phases;
270
+ }
271
+ case "done":
272
+ for (const task of getTaskTargets(phases, entry, errors))
273
+ task.status = "completed";
274
+ return phases;
275
+ case "drop":
276
+ for (const task of getTaskTargets(phases, entry, errors))
277
+ task.status = "abandoned";
278
+ return phases;
279
+ case "rm":
280
+ return removeTasks(phases, entry, errors);
281
+ case "append":
282
+ return appendItems(phases, entry, errors);
283
+ case "view":
284
+ return phases;
285
+ }
286
+ }
287
+ export function applyParams(phases, params) {
288
+ if (params.op === "view")
289
+ return { phases, errors: [] };
290
+ const original = clonePhases(phases);
291
+ const errors = [];
292
+ const next = applyEntry(phases, params, errors);
293
+ if (errors.length > 0)
294
+ return { phases: original, errors };
295
+ normalizeInProgressTask(next);
296
+ return { phases: next, errors };
297
+ }
298
+ export function applyOpsToPhases(currentPhases, ops) {
299
+ const errors = [];
300
+ let next = clonePhases(currentPhases);
301
+ for (const op of ops)
302
+ next = applyEntry(next, op, errors);
303
+ if (errors.length > 0)
304
+ return { phases: clonePhases(currentPhases), errors };
305
+ normalizeInProgressTask(next);
306
+ return { phases: next, errors };
307
+ }
308
+ export function formatSummary(phases, errors, readOnly = false) {
309
+ const tasks = phases.flatMap((phase) => phase.tasks);
310
+ if (tasks.length === 0) {
311
+ if (errors.length > 0)
312
+ return `Errors: ${errors.join("; ")}`;
313
+ return readOnly ? "Todo list is empty." : "Todo list cleared.";
314
+ }
315
+ const remainingByPhase = phases
316
+ .map((phase) => ({
317
+ name: phase.name,
318
+ tasks: phase.tasks.filter((task) => task.status === "pending" || task.status === "in_progress"),
319
+ }))
320
+ .filter((phase) => phase.tasks.length > 0);
321
+ const remainingTasks = remainingByPhase.flatMap((phase) => phase.tasks.map((task) => ({ ...task, phase: phase.name })));
322
+ let currentIdx = phases.findIndex((phase) => phase.tasks.some((task) => task.status === "pending" || task.status === "in_progress"));
323
+ if (currentIdx === -1)
324
+ currentIdx = phases.length - 1;
325
+ const current = phases[currentIdx];
326
+ const done = current.tasks.filter((task) => task.status === "completed" || task.status === "abandoned").length;
327
+ const lines = [];
328
+ if (errors.length > 0)
329
+ lines.push(`Errors: ${errors.join("; ")}`);
330
+ if (remainingTasks.length === 0) {
331
+ lines.push("Remaining items: none.");
332
+ }
333
+ else {
334
+ lines.push(`Remaining items (${remainingTasks.length}):`);
335
+ for (const task of remainingTasks)
336
+ lines.push(` - ${task.content} [${task.status}] (${task.phase})`);
337
+ }
338
+ const closedAll = tasks.filter((task) => task.status === "completed" || task.status === "abandoned").length;
339
+ const workedAhead = phases.some((phase, index) => index > currentIdx && phase.tasks.some((task) => task.status === "completed" || task.status === "abandoned"));
340
+ lines.push(`Overall: ${closedAll}/${tasks.length} done, ${remainingTasks.length} open.`);
341
+ lines.push(`Active phase ${currentIdx + 1}/${phases.length} "${current.name}" (${done}/${current.tasks.length})${workedAhead
342
+ ? " — earliest phase with open tasks; the in-progress pointer auto-advances to the earliest open task on each completion, so it can sit behind out-of-order work (nothing was un-completed)."
343
+ : "."}`);
344
+ for (const phase of phases) {
345
+ lines.push(` ${phase.name}:`);
346
+ for (const task of phase.tasks) {
347
+ const checkbox = task.status === "completed" ? "[X]" : "[ ]";
348
+ const tag = task.status === "in_progress" ? " (in progress)" : task.status === "abandoned" ? " (dropped)" : "";
349
+ lines.push(` - ${checkbox} ${task.content}${tag}`);
350
+ }
351
+ }
352
+ return lines.join("\n");
11
353
  }
12
354
  export function sanitizeTodoText(text) {
13
355
  return stripAnsi(text)
@@ -16,59 +358,82 @@ export function sanitizeTodoText(text) {
16
358
  .replace(/\s+/g, " ")
17
359
  .trim();
18
360
  }
361
+ export function isTerminalTodoStatus(status) {
362
+ return status === "completed" || status === "abandoned" || status === "cancelled";
363
+ }
364
+ export function isIncompleteTodo(todo) {
365
+ return !isTerminalTodoStatus(todo.status);
366
+ }
19
367
  export function getTodoMarker(status) {
20
368
  if (status === "completed")
21
369
  return "[✓]";
22
370
  if (status === "in_progress")
23
371
  return "[•]";
24
- if (status === "cancelled")
372
+ if (status === "abandoned" || status === "cancelled")
25
373
  return "[×]";
26
374
  return "[ ]";
27
375
  }
28
- export function getTodoWidgetLines(todos) {
29
- if (todos.length === 0 || !todos.some(isIncompleteTodo)) {
376
+ function getActivePhase(phases) {
377
+ const activeTask = nextActionableTask(phases);
378
+ if (!activeTask)
30
379
  return undefined;
31
- }
32
- return ["Todo", ...todos.map((todo) => `${getTodoMarker(todo.status)} ${sanitizeTodoText(todo.content)}`)];
380
+ return phases.find((phase) => phase.tasks.includes(activeTask));
381
+ }
382
+ export function getTodoWidgetLines(phases) {
383
+ const activePhase = getActivePhase(phases);
384
+ if (!activePhase)
385
+ return undefined;
386
+ return [
387
+ "Todo",
388
+ sanitizeTodoText(activePhase.name),
389
+ ...activePhase.tasks.map((todo) => `${getTodoMarker(todo.status)} ${sanitizeTodoText(todo.content)}`),
390
+ ];
33
391
  }
34
- export function getTodoResultLines(todos) {
392
+ export function getTodoResultLines(phases) {
393
+ const tasks = phases.flatMap((phase) => phase.tasks);
35
394
  return [
36
- `${countOpenTodos(todos)} todos`,
37
- ...todos.map((todo) => `${getTodoMarker(todo.status)} ${sanitizeTodoText(todo.content)}`),
395
+ `${tasks.filter(isIncompleteTodo).length} todos`,
396
+ ...phases.flatMap((phase) => [
397
+ `${sanitizeTodoText(phase.name)}:`,
398
+ ...phase.tasks.map((todo) => `${getTodoMarker(todo.status)} ${sanitizeTodoText(todo.content)}`),
399
+ ]),
38
400
  ];
39
401
  }
40
402
  export function isTodoItem(value) {
41
- if (typeof value !== "object" || value === null) {
42
- return false;
43
- }
44
- const item = value;
45
- return typeof item.content === "string" && typeof item.status === "string" && typeof item.priority === "string";
403
+ return parseTodoItem(value) !== undefined;
46
404
  }
47
405
  export function isTodoItemArray(value) {
48
406
  return Array.isArray(value) && value.every(isTodoItem);
49
407
  }
50
- export function getLatestTodosFromBranchEntries(entries) {
51
- let todos = [];
408
+ export function isTodoPhase(value) {
409
+ return parseTodoPhase(value) !== undefined;
410
+ }
411
+ export function isTodoPhaseArray(value) {
412
+ return Array.isArray(value) && value.every(isTodoPhase);
413
+ }
414
+ export function getLatestPhasesFromBranchEntries(entries) {
415
+ let phases = [];
52
416
  for (const entry of entries) {
53
417
  if (entry.type === "custom" && entry.customType === TODO_STATE_ENTRY_TYPE) {
54
- const data = entry.data;
55
- if (isTodoItemArray(data?.todos)) {
56
- todos = data.todos.map((todo) => ({ ...todo }));
57
- }
418
+ const parsed = readTodoPayload(entry.data);
419
+ if (parsed)
420
+ phases = clonePhases(parsed);
58
421
  continue;
59
422
  }
60
- if (entry.type !== "message" || typeof entry.message !== "object" || entry.message === null) {
423
+ if (entry.type !== "message" || !isRecord(entry.message))
61
424
  continue;
62
- }
63
- const message = entry.message;
64
- if (message.role !== "toolResult" || message.toolName !== "todowrite") {
425
+ if (entry.message.role !== "toolResult")
65
426
  continue;
66
- }
67
- const details = message.details;
68
- if (isTodoItemArray(details?.todos)) {
69
- todos = details.todos.map((todo) => ({ ...todo }));
70
- }
427
+ if (entry.message.toolName !== "todo" && entry.message.toolName !== "todowrite")
428
+ continue;
429
+ const parsed = readTodoPayload(entry.message.details);
430
+ if (parsed)
431
+ phases = clonePhases(parsed);
71
432
  }
72
- return todos;
433
+ return phases;
434
+ }
435
+ /** Compatibility reader for callers that still expect the old flat array. */
436
+ export function getLatestTodosFromBranchEntries(entries) {
437
+ return getLatestPhasesFromBranchEntries(entries).flatMap((phase) => phase.tasks.map(cloneTask));
73
438
  }
74
439
  //# sourceMappingURL=state.js.map