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