@code-yeongyu/senpi 2026.7.25 → 2026.7.26

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 (575) hide show
  1. package/CHANGELOG.md +81 -0
  2. package/README.md +1 -1
  3. package/dist/beta/omo-local-update.d.ts +207 -0
  4. package/dist/beta/omo-local-update.d.ts.map +1 -0
  5. package/dist/beta/omo-local-update.js +708 -0
  6. package/dist/beta/omo-local-update.js.map +1 -0
  7. package/dist/cli/args.d.ts +4 -16
  8. package/dist/cli/args.d.ts.map +1 -1
  9. package/dist/cli/args.js +9 -25
  10. package/dist/cli/args.js.map +1 -1
  11. package/dist/cli/grok-neo-gate.d.ts +12 -0
  12. package/dist/cli/grok-neo-gate.d.ts.map +1 -0
  13. package/dist/cli/grok-neo-gate.js +18 -0
  14. package/dist/cli/grok-neo-gate.js.map +1 -0
  15. package/dist/cli-main.js +4 -0
  16. package/dist/cli-main.js.map +1 -1
  17. package/dist/cli.js +2 -0
  18. package/dist/cli.js.map +1 -1
  19. package/dist/core/agent-session-runtime.d.ts +2 -0
  20. package/dist/core/agent-session-runtime.d.ts.map +1 -1
  21. package/dist/core/agent-session-runtime.js +33 -8
  22. package/dist/core/agent-session-runtime.js.map +1 -1
  23. package/dist/core/agent-session.d.ts +22 -3
  24. package/dist/core/agent-session.d.ts.map +1 -1
  25. package/dist/core/agent-session.js +202 -58
  26. package/dist/core/agent-session.js.map +1 -1
  27. package/dist/core/auth-providers.d.ts +2 -2
  28. package/dist/core/auth-providers.js +2 -2
  29. package/dist/core/auth-providers.js.map +1 -1
  30. package/dist/core/extensions/builtin/bash-timeout/timeout.d.ts.map +1 -1
  31. package/dist/core/extensions/builtin/bash-timeout/timeout.js +3 -2
  32. package/dist/core/extensions/builtin/bash-timeout/timeout.js.map +1 -1
  33. package/dist/core/extensions/builtin/compaction/index.d.ts.map +1 -1
  34. package/dist/core/extensions/builtin/compaction/index.js +30 -2
  35. package/dist/core/extensions/builtin/compaction/index.js.map +1 -1
  36. package/dist/core/extensions/builtin/compaction/speculative.d.ts.map +1 -1
  37. package/dist/core/extensions/builtin/compaction/speculative.js +28 -0
  38. package/dist/core/extensions/builtin/compaction/speculative.js.map +1 -1
  39. package/dist/core/extensions/builtin/config-reload/index.d.ts.map +1 -1
  40. package/dist/core/extensions/builtin/config-reload/index.js +20 -17
  41. package/dist/core/extensions/builtin/config-reload/index.js.map +1 -1
  42. package/dist/core/extensions/builtin/config-reload/log.d.ts +4 -1
  43. package/dist/core/extensions/builtin/config-reload/log.d.ts.map +1 -1
  44. package/dist/core/extensions/builtin/config-reload/log.js +3 -0
  45. package/dist/core/extensions/builtin/config-reload/log.js.map +1 -1
  46. package/dist/core/extensions/builtin/config-reload/routine-settings.d.ts +15 -0
  47. package/dist/core/extensions/builtin/config-reload/routine-settings.d.ts.map +1 -0
  48. package/dist/core/extensions/builtin/config-reload/routine-settings.js +102 -0
  49. package/dist/core/extensions/builtin/config-reload/routine-settings.js.map +1 -0
  50. package/dist/core/extensions/builtin/goal/command-registration.js +2 -2
  51. package/dist/core/extensions/builtin/goal/command-registration.js.map +1 -1
  52. package/dist/core/extensions/builtin/goal/format.d.ts +1 -1
  53. package/dist/core/extensions/builtin/goal/format.d.ts.map +1 -1
  54. package/dist/core/extensions/builtin/goal/format.js +9 -2
  55. package/dist/core/extensions/builtin/goal/format.js.map +1 -1
  56. package/dist/core/extensions/builtin/goal/index.d.ts.map +1 -1
  57. package/dist/core/extensions/builtin/goal/index.js +38 -23
  58. package/dist/core/extensions/builtin/goal/index.js.map +1 -1
  59. package/dist/core/extensions/builtin/goal/lifecycle-helpers.d.ts +6 -0
  60. package/dist/core/extensions/builtin/goal/lifecycle-helpers.d.ts.map +1 -0
  61. package/dist/core/extensions/builtin/goal/lifecycle-helpers.js +19 -0
  62. package/dist/core/extensions/builtin/goal/lifecycle-helpers.js.map +1 -0
  63. package/dist/core/extensions/builtin/goal/persistence.d.ts +6 -0
  64. package/dist/core/extensions/builtin/goal/persistence.d.ts.map +1 -0
  65. package/dist/core/extensions/builtin/goal/persistence.js +141 -0
  66. package/dist/core/extensions/builtin/goal/persistence.js.map +1 -0
  67. package/dist/core/extensions/builtin/goal/store.d.ts +7 -3
  68. package/dist/core/extensions/builtin/goal/store.d.ts.map +1 -1
  69. package/dist/core/extensions/builtin/goal/store.js +66 -181
  70. package/dist/core/extensions/builtin/goal/store.js.map +1 -1
  71. package/dist/core/extensions/builtin/goal/tool-registration.d.ts +1 -0
  72. package/dist/core/extensions/builtin/goal/tool-registration.d.ts.map +1 -1
  73. package/dist/core/extensions/builtin/goal/tool-registration.js +26 -15
  74. package/dist/core/extensions/builtin/goal/tool-registration.js.map +1 -1
  75. package/dist/core/extensions/builtin/goal/transitions.d.ts +3 -0
  76. package/dist/core/extensions/builtin/goal/transitions.d.ts.map +1 -0
  77. package/dist/core/extensions/builtin/goal/transitions.js +45 -0
  78. package/dist/core/extensions/builtin/goal/transitions.js.map +1 -0
  79. package/dist/core/extensions/builtin/goal/types.d.ts +10 -4
  80. package/dist/core/extensions/builtin/goal/types.d.ts.map +1 -1
  81. package/dist/core/extensions/builtin/goal/types.js +2 -2
  82. package/dist/core/extensions/builtin/goal/types.js.map +1 -1
  83. package/dist/core/extensions/builtin/goal/ui.d.ts.map +1 -1
  84. package/dist/core/extensions/builtin/goal/ui.js +2 -0
  85. package/dist/core/extensions/builtin/goal/ui.js.map +1 -1
  86. package/dist/core/extensions/builtin/goal/validation.d.ts +8 -1
  87. package/dist/core/extensions/builtin/goal/validation.d.ts.map +1 -1
  88. package/dist/core/extensions/builtin/goal/validation.js +24 -12
  89. package/dist/core/extensions/builtin/goal/validation.js.map +1 -1
  90. package/dist/core/extensions/builtin/index.d.ts.map +1 -1
  91. package/dist/core/extensions/builtin/index.js +0 -2
  92. package/dist/core/extensions/builtin/index.js.map +1 -1
  93. package/dist/core/extensions/builtin/mcp/index.d.ts.map +1 -1
  94. package/dist/core/extensions/builtin/mcp/index.js +8 -5
  95. package/dist/core/extensions/builtin/mcp/index.js.map +1 -1
  96. package/dist/core/extensions/builtin/permission-system/parsers.d.ts.map +1 -1
  97. package/dist/core/extensions/builtin/permission-system/parsers.js +1 -0
  98. package/dist/core/extensions/builtin/permission-system/parsers.js.map +1 -1
  99. package/dist/core/extensions/builtin/prompt-preset/gpt-5.6.d.ts +48 -0
  100. package/dist/core/extensions/builtin/prompt-preset/gpt-5.6.d.ts.map +1 -1
  101. package/dist/core/extensions/builtin/prompt-preset/gpt-5.6.js +88 -64
  102. package/dist/core/extensions/builtin/prompt-preset/gpt-5.6.js.map +1 -1
  103. package/dist/core/extensions/builtin/terminal/extension.d.ts.map +1 -1
  104. package/dist/core/extensions/builtin/terminal/extension.js +32 -0
  105. package/dist/core/extensions/builtin/terminal/extension.js.map +1 -1
  106. package/dist/core/extensions/builtin/terminal/index.d.ts +1 -1
  107. package/dist/core/extensions/builtin/terminal/index.d.ts.map +1 -1
  108. package/dist/core/extensions/builtin/terminal/index.js +1 -1
  109. package/dist/core/extensions/builtin/terminal/index.js.map +1 -1
  110. package/dist/core/extensions/builtin/terminal/monitor-notify.d.ts +29 -0
  111. package/dist/core/extensions/builtin/terminal/monitor-notify.d.ts.map +1 -0
  112. package/dist/core/extensions/builtin/terminal/monitor-notify.js +185 -0
  113. package/dist/core/extensions/builtin/terminal/monitor-notify.js.map +1 -0
  114. package/dist/core/extensions/builtin/terminal/monitor-registry.d.ts +35 -0
  115. package/dist/core/extensions/builtin/terminal/monitor-registry.d.ts.map +1 -0
  116. package/dist/core/extensions/builtin/terminal/monitor-registry.js +98 -0
  117. package/dist/core/extensions/builtin/terminal/monitor-registry.js.map +1 -0
  118. package/dist/core/extensions/builtin/terminal/notify.d.ts +9 -0
  119. package/dist/core/extensions/builtin/terminal/notify.d.ts.map +1 -1
  120. package/dist/core/extensions/builtin/terminal/notify.js +30 -14
  121. package/dist/core/extensions/builtin/terminal/notify.js.map +1 -1
  122. package/dist/core/extensions/builtin/terminal/prompt.d.ts +1 -1
  123. package/dist/core/extensions/builtin/terminal/prompt.d.ts.map +1 -1
  124. package/dist/core/extensions/builtin/terminal/prompt.js +13 -5
  125. package/dist/core/extensions/builtin/terminal/prompt.js.map +1 -1
  126. package/dist/core/extensions/builtin/terminal/runtime-session.d.ts +3 -12
  127. package/dist/core/extensions/builtin/terminal/runtime-session.d.ts.map +1 -1
  128. package/dist/core/extensions/builtin/terminal/runtime-session.js +4 -59
  129. package/dist/core/extensions/builtin/terminal/runtime-session.js.map +1 -1
  130. package/dist/core/extensions/builtin/terminal/settings.d.ts +8 -0
  131. package/dist/core/extensions/builtin/terminal/settings.d.ts.map +1 -1
  132. package/dist/core/extensions/builtin/terminal/settings.js +16 -2
  133. package/dist/core/extensions/builtin/terminal/settings.js.map +1 -1
  134. package/dist/core/extensions/builtin/terminal/shared.d.ts +2 -2
  135. package/dist/core/extensions/builtin/terminal/shared.d.ts.map +1 -1
  136. package/dist/core/extensions/builtin/terminal/shared.js +2 -1
  137. package/dist/core/extensions/builtin/terminal/shared.js.map +1 -1
  138. package/dist/core/extensions/builtin/terminal/tools/bash-output.d.ts +10 -4
  139. package/dist/core/extensions/builtin/terminal/tools/bash-output.d.ts.map +1 -1
  140. package/dist/core/extensions/builtin/terminal/tools/bash-output.js +17 -96
  141. package/dist/core/extensions/builtin/terminal/tools/bash-output.js.map +1 -1
  142. package/dist/core/extensions/builtin/terminal/tools/context.d.ts +7 -0
  143. package/dist/core/extensions/builtin/terminal/tools/context.d.ts.map +1 -1
  144. package/dist/core/extensions/builtin/terminal/tools/context.js.map +1 -1
  145. package/dist/core/extensions/builtin/terminal/tools/monitor.d.ts +41 -0
  146. package/dist/core/extensions/builtin/terminal/tools/monitor.d.ts.map +1 -0
  147. package/dist/core/extensions/builtin/terminal/tools/monitor.js +97 -0
  148. package/dist/core/extensions/builtin/terminal/tools/monitor.js.map +1 -0
  149. package/dist/core/extensions/builtin/terminal/tools/render.d.ts +3 -0
  150. package/dist/core/extensions/builtin/terminal/tools/render.d.ts.map +1 -1
  151. package/dist/core/extensions/builtin/terminal/tools/render.js +5 -2
  152. package/dist/core/extensions/builtin/terminal/tools/render.js.map +1 -1
  153. package/dist/core/extensions/builtin/todotools/fuzzy-match.d.ts +19 -0
  154. package/dist/core/extensions/builtin/todotools/fuzzy-match.d.ts.map +1 -0
  155. package/dist/core/extensions/builtin/todotools/fuzzy-match.js +70 -0
  156. package/dist/core/extensions/builtin/todotools/fuzzy-match.js.map +1 -0
  157. package/dist/core/extensions/builtin/todotools/normalize.d.ts +8 -0
  158. package/dist/core/extensions/builtin/todotools/normalize.d.ts.map +1 -0
  159. package/dist/core/extensions/builtin/todotools/normalize.js +174 -0
  160. package/dist/core/extensions/builtin/todotools/normalize.js.map +1 -0
  161. package/dist/core/extensions/builtin/todotools/prompt.d.ts +2 -2
  162. package/dist/core/extensions/builtin/todotools/prompt.d.ts.map +1 -1
  163. package/dist/core/extensions/builtin/todotools/prompt.js +4 -2
  164. package/dist/core/extensions/builtin/todotools/prompt.js.map +1 -1
  165. package/dist/core/extensions/builtin/todotools/state.d.ts +9 -8
  166. package/dist/core/extensions/builtin/todotools/state.d.ts.map +1 -1
  167. package/dist/core/extensions/builtin/todotools/state.js +99 -48
  168. package/dist/core/extensions/builtin/todotools/state.js.map +1 -1
  169. package/dist/core/extensions/builtin/todotools/tools/todo.d.ts +1 -1
  170. package/dist/core/extensions/builtin/todotools/tools/todo.d.ts.map +1 -1
  171. package/dist/core/extensions/builtin/todotools/tools/todo.js +65 -38
  172. package/dist/core/extensions/builtin/todotools/tools/todo.js.map +1 -1
  173. package/dist/core/extensions/builtin/websearch/index.d.ts.map +1 -1
  174. package/dist/core/extensions/builtin/websearch/index.js +2 -4
  175. package/dist/core/extensions/builtin/websearch/index.js.map +1 -1
  176. package/dist/core/extensions/builtin/websearch/websearch/config.d.ts.map +1 -1
  177. package/dist/core/extensions/builtin/websearch/websearch/config.js +4 -1
  178. package/dist/core/extensions/builtin/websearch/websearch/config.js.map +1 -1
  179. package/dist/core/extensions/builtin/websearch/websearch/native.d.ts.map +1 -1
  180. package/dist/core/extensions/builtin/websearch/websearch/native.js +2 -4
  181. package/dist/core/extensions/builtin/websearch/websearch/native.js.map +1 -1
  182. package/dist/core/extensions/builtin/websearch/websearch/renderers.d.ts.map +1 -1
  183. package/dist/core/extensions/builtin/websearch/websearch/renderers.js +20 -8
  184. package/dist/core/extensions/builtin/websearch/websearch/renderers.js.map +1 -1
  185. package/dist/core/extensions/builtin/websearch/websearch/search.d.ts +6 -1
  186. package/dist/core/extensions/builtin/websearch/websearch/search.d.ts.map +1 -1
  187. package/dist/core/extensions/builtin/websearch/websearch/search.js +15 -11
  188. package/dist/core/extensions/builtin/websearch/websearch/search.js.map +1 -1
  189. package/dist/core/extensions/builtin/websearch/websearch/tool.d.ts.map +1 -1
  190. package/dist/core/extensions/builtin/websearch/websearch/tool.js +5 -10
  191. package/dist/core/extensions/builtin/websearch/websearch/tool.js.map +1 -1
  192. package/dist/core/extensions/builtin/websearch/websearch/types.d.ts +1 -0
  193. package/dist/core/extensions/builtin/websearch/websearch/types.d.ts.map +1 -1
  194. package/dist/core/extensions/builtin/websearch/websearch/types.js.map +1 -1
  195. package/dist/core/extensions/loader.d.ts.map +1 -1
  196. package/dist/core/extensions/loader.js +12 -0
  197. package/dist/core/extensions/loader.js.map +1 -1
  198. package/dist/core/extensions/runner.d.ts +5 -0
  199. package/dist/core/extensions/runner.d.ts.map +1 -1
  200. package/dist/core/extensions/runner.js +12 -1
  201. package/dist/core/extensions/runner.js.map +1 -1
  202. package/dist/core/extensions/types.d.ts +25 -1
  203. package/dist/core/extensions/types.d.ts.map +1 -1
  204. package/dist/core/extensions/types.js.map +1 -1
  205. package/dist/core/keybindings.d.ts +0 -5
  206. package/dist/core/keybindings.d.ts.map +1 -1
  207. package/dist/core/keybindings.js +0 -2
  208. package/dist/core/keybindings.js.map +1 -1
  209. package/dist/core/messages.d.ts +32 -0
  210. package/dist/core/messages.d.ts.map +1 -1
  211. package/dist/core/messages.js +91 -0
  212. package/dist/core/messages.js.map +1 -1
  213. package/dist/core/model-resolver.d.ts +10 -1
  214. package/dist/core/model-resolver.d.ts.map +1 -1
  215. package/dist/core/model-resolver.js +13 -3
  216. package/dist/core/model-resolver.js.map +1 -1
  217. package/dist/core/model-runtime.d.ts +2 -0
  218. package/dist/core/model-runtime.d.ts.map +1 -1
  219. package/dist/core/model-runtime.js +4 -3
  220. package/dist/core/model-runtime.js.map +1 -1
  221. package/dist/core/remote-catalog-provider.d.ts.map +1 -1
  222. package/dist/core/remote-catalog-provider.js +19 -1
  223. package/dist/core/remote-catalog-provider.js.map +1 -1
  224. package/dist/core/resource-loader.d.ts +9 -0
  225. package/dist/core/resource-loader.d.ts.map +1 -1
  226. package/dist/core/resource-loader.js +13 -2
  227. package/dist/core/resource-loader.js.map +1 -1
  228. package/dist/core/retry-fallback/controller.d.ts +7 -0
  229. package/dist/core/retry-fallback/controller.d.ts.map +1 -1
  230. package/dist/core/retry-fallback/controller.js +13 -0
  231. package/dist/core/retry-fallback/controller.js.map +1 -1
  232. package/dist/core/retry-fallback/cooldown.d.ts.map +1 -1
  233. package/dist/core/retry-fallback/cooldown.js +5 -0
  234. package/dist/core/retry-fallback/cooldown.js.map +1 -1
  235. package/dist/core/sdk.d.ts.map +1 -1
  236. package/dist/core/sdk.js +11 -35
  237. package/dist/core/sdk.js.map +1 -1
  238. package/dist/core/settings-manager.d.ts +12 -16
  239. package/dist/core/settings-manager.d.ts.map +1 -1
  240. package/dist/core/settings-manager.js +10 -13
  241. package/dist/core/settings-manager.js.map +1 -1
  242. package/dist/core/slash-commands.d.ts.map +1 -1
  243. package/dist/core/slash-commands.js +1 -0
  244. package/dist/core/slash-commands.js.map +1 -1
  245. package/dist/core/thinking-levels.d.ts.map +1 -1
  246. package/dist/core/thinking-levels.js +9 -2
  247. package/dist/core/thinking-levels.js.map +1 -1
  248. package/dist/core/timings.d.ts +7 -2
  249. package/dist/core/timings.d.ts.map +1 -1
  250. package/dist/core/timings.js +11 -0
  251. package/dist/core/timings.js.map +1 -1
  252. package/dist/extensions/llama/provider.d.ts.map +1 -1
  253. package/dist/extensions/llama/provider.js +6 -0
  254. package/dist/extensions/llama/provider.js.map +1 -1
  255. package/dist/inspector-policy.d.ts +22 -0
  256. package/dist/inspector-policy.d.ts.map +1 -0
  257. package/dist/inspector-policy.js +84 -0
  258. package/dist/inspector-policy.js.map +1 -0
  259. package/dist/main.d.ts +6 -0
  260. package/dist/main.d.ts.map +1 -1
  261. package/dist/main.js +20 -23
  262. package/dist/main.js.map +1 -1
  263. package/dist/modes/app-server/runtime.d.ts.map +1 -1
  264. package/dist/modes/app-server/runtime.js +1 -0
  265. package/dist/modes/app-server/runtime.js.map +1 -1
  266. package/dist/modes/app-server/threads/goal-handlers.js +4 -2
  267. package/dist/modes/app-server/threads/goal-handlers.js.map +1 -1
  268. package/dist/modes/app-server/threads/goal-wire.d.ts.map +1 -1
  269. package/dist/modes/app-server/threads/goal-wire.js +1 -0
  270. package/dist/modes/app-server/threads/goal-wire.js.map +1 -1
  271. package/dist/modes/app-server/threads/handlers.d.ts +1 -0
  272. package/dist/modes/app-server/threads/handlers.d.ts.map +1 -1
  273. package/dist/modes/app-server/threads/handlers.js +2 -0
  274. package/dist/modes/app-server/threads/handlers.js.map +1 -1
  275. package/dist/modes/app-server/threads/turn-runtime.d.ts +1 -0
  276. package/dist/modes/app-server/threads/turn-runtime.d.ts.map +1 -1
  277. package/dist/modes/app-server/threads/turn-runtime.js.map +1 -1
  278. package/dist/modes/app-server/threads/turns.d.ts.map +1 -1
  279. package/dist/modes/app-server/threads/turns.js +47 -3
  280. package/dist/modes/app-server/threads/turns.js.map +1 -1
  281. package/dist/modes/interactive/components/custom-message.d.ts +3 -1
  282. package/dist/modes/interactive/components/custom-message.d.ts.map +1 -1
  283. package/dist/modes/interactive/components/custom-message.js +9 -2
  284. package/dist/modes/interactive/components/custom-message.js.map +1 -1
  285. package/dist/modes/interactive/components/status-indicator.d.ts +1 -0
  286. package/dist/modes/interactive/components/status-indicator.d.ts.map +1 -1
  287. package/dist/modes/interactive/components/status-indicator.js +29 -4
  288. package/dist/modes/interactive/components/status-indicator.js.map +1 -1
  289. package/dist/modes/interactive/components/tool-execution.d.ts +5 -1
  290. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  291. package/dist/modes/interactive/components/tool-execution.js +43 -17
  292. package/dist/modes/interactive/components/tool-execution.js.map +1 -1
  293. package/dist/modes/interactive/grok/chrome-tokens.d.ts +22 -0
  294. package/dist/modes/interactive/grok/chrome-tokens.d.ts.map +1 -0
  295. package/dist/modes/interactive/grok/chrome-tokens.js +27 -0
  296. package/dist/modes/interactive/grok/chrome-tokens.js.map +1 -0
  297. package/dist/modes/interactive/grok/chrome.d.ts +51 -0
  298. package/dist/modes/interactive/grok/chrome.d.ts.map +1 -0
  299. package/dist/modes/interactive/grok/chrome.js +105 -0
  300. package/dist/modes/interactive/grok/chrome.js.map +1 -0
  301. package/dist/modes/interactive/grok/footer.d.ts +14 -0
  302. package/dist/modes/interactive/grok/footer.d.ts.map +1 -0
  303. package/dist/modes/interactive/grok/footer.js +27 -0
  304. package/dist/modes/interactive/grok/footer.js.map +1 -0
  305. package/dist/modes/interactive/grok/input-card.d.ts +9 -0
  306. package/dist/modes/interactive/grok/input-card.d.ts.map +1 -0
  307. package/dist/modes/interactive/grok/input-card.js +30 -0
  308. package/dist/modes/interactive/grok/input-card.js.map +1 -0
  309. package/dist/modes/interactive/grok/palette.d.ts +145 -0
  310. package/dist/modes/interactive/grok/palette.d.ts.map +1 -0
  311. package/dist/modes/interactive/grok/palette.js +92 -0
  312. package/dist/modes/interactive/grok/palette.js.map +1 -0
  313. package/dist/modes/interactive/grok/tool-row.d.ts +17 -0
  314. package/dist/modes/interactive/grok/tool-row.d.ts.map +1 -0
  315. package/dist/modes/interactive/grok/tool-row.js +26 -0
  316. package/dist/modes/interactive/grok/tool-row.js.map +1 -0
  317. package/dist/modes/interactive/grok/welcome-card.d.ts +10 -0
  318. package/dist/modes/interactive/grok/welcome-card.d.ts.map +1 -0
  319. package/dist/modes/interactive/grok/welcome-card.js +30 -0
  320. package/dist/modes/interactive/grok/welcome-card.js.map +1 -0
  321. package/dist/modes/interactive/interactive-mode.d.ts +5 -0
  322. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  323. package/dist/modes/interactive/interactive-mode.js +117 -54
  324. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  325. package/dist/modes/interactive/theme/grok-day.json +77 -0
  326. package/dist/modes/interactive/theme/grok-night.json +93 -0
  327. package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  328. package/dist/modes/interactive/theme/theme.js +4 -0
  329. package/dist/modes/interactive/theme/theme.js.map +1 -1
  330. package/dist/modes/rpc/connection-handler.d.ts +3 -3
  331. package/dist/modes/rpc/connection-handler.js +6 -6
  332. package/dist/modes/rpc/connection-handler.js.map +1 -1
  333. package/dist/modes/rpc/custom-capability.d.ts +6 -7
  334. package/dist/modes/rpc/custom-capability.d.ts.map +1 -1
  335. package/dist/modes/rpc/custom-capability.js +6 -7
  336. package/dist/modes/rpc/custom-capability.js.map +1 -1
  337. package/dist/modes/rpc/rpc-mode.d.ts +2 -2
  338. package/dist/modes/rpc/rpc-mode.js +5 -5
  339. package/dist/modes/rpc/rpc-mode.js.map +1 -1
  340. package/dist/package-manager-cli.d.ts.map +1 -1
  341. package/dist/package-manager-cli.js +11 -0
  342. package/dist/package-manager-cli.js.map +1 -1
  343. package/dist/senpi +2 -0
  344. package/docs/docs.json +4 -0
  345. package/docs/environment-variables.md +1 -0
  346. package/docs/extensions.md +2 -2
  347. package/docs/grok-neo.md +77 -0
  348. package/docs/keybindings.md +0 -1
  349. package/docs/settings.md +14 -3
  350. package/docs/terminal-tools.md +6 -3
  351. package/docs/usage.md +1 -1
  352. package/examples/extensions/message-renderer.ts +2 -2
  353. package/node_modules/@code-yeongyu/senpi-codemode/CHANGELOG.md +47 -0
  354. package/node_modules/@code-yeongyu/senpi-codemode/README.md +39 -19
  355. package/node_modules/@code-yeongyu/senpi-codemode/package.json +3 -3
  356. package/node_modules/@code-yeongyu/senpi-codemode/src/bridge/http-server.ts +6 -1
  357. package/node_modules/@code-yeongyu/senpi-codemode/src/bridges/output-bridge.ts +0 -1
  358. package/node_modules/@code-yeongyu/senpi-codemode/src/extension/eval-notifier.ts +40 -0
  359. package/node_modules/@code-yeongyu/senpi-codemode/src/index.ts +46 -66
  360. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/context-manager.ts +5 -2
  361. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/py/kernel-contract.ts +2 -0
  362. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/py/kernel.ts +19 -4
  363. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/py/prelude.py +7 -0
  364. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/shared/subprocess-kernel.ts +8 -5
  365. package/node_modules/@code-yeongyu/senpi-codemode/src/prompt/eval-prompt.ts +23 -5
  366. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/detached-cell-manager.ts +322 -0
  367. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/eval-tool.ts +253 -18
  368. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/interrupt-note.ts +58 -0
  369. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/render.ts +28 -6
  370. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/status-events.ts +20 -0
  371. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/types.ts +65 -22
  372. package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.d.ts.map +1 -1
  373. package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.js +4 -41
  374. package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.js.map +1 -1
  375. package/node_modules/@earendil-works/pi-agent-core/dist/agent.d.ts +6 -0
  376. package/node_modules/@earendil-works/pi-agent-core/dist/agent.d.ts.map +1 -1
  377. package/node_modules/@earendil-works/pi-agent-core/dist/agent.js +4 -0
  378. package/node_modules/@earendil-works/pi-agent-core/dist/agent.js.map +1 -1
  379. package/node_modules/@earendil-works/pi-agent-core/dist/assistant-terminal-state.d.ts +10 -0
  380. package/node_modules/@earendil-works/pi-agent-core/dist/assistant-terminal-state.d.ts.map +1 -0
  381. package/node_modules/@earendil-works/pi-agent-core/dist/assistant-terminal-state.js +38 -0
  382. package/node_modules/@earendil-works/pi-agent-core/dist/assistant-terminal-state.js.map +1 -0
  383. package/node_modules/@earendil-works/pi-agent-core/dist/types.d.ts +5 -0
  384. package/node_modules/@earendil-works/pi-agent-core/dist/types.d.ts.map +1 -1
  385. package/node_modules/@earendil-works/pi-agent-core/dist/types.js.map +1 -1
  386. package/node_modules/@earendil-works/pi-agent-core/package.json +2 -2
  387. package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.d.ts.map +1 -1
  388. package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.js +210 -26
  389. package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.js.map +1 -1
  390. package/node_modules/@earendil-works/pi-ai/dist/api/azure-openai-responses.d.ts.map +1 -1
  391. package/node_modules/@earendil-works/pi-ai/dist/api/azure-openai-responses.js +16 -8
  392. package/node_modules/@earendil-works/pi-ai/dist/api/azure-openai-responses.js.map +1 -1
  393. package/node_modules/@earendil-works/pi-ai/dist/api/bedrock-converse-stream.d.ts.map +1 -1
  394. package/node_modules/@earendil-works/pi-ai/dist/api/bedrock-converse-stream.js +39 -20
  395. package/node_modules/@earendil-works/pi-ai/dist/api/bedrock-converse-stream.js.map +1 -1
  396. package/node_modules/@earendil-works/pi-ai/dist/api/google-generative-ai.d.ts.map +1 -1
  397. package/node_modules/@earendil-works/pi-ai/dist/api/google-generative-ai.js +9 -2
  398. package/node_modules/@earendil-works/pi-ai/dist/api/google-generative-ai.js.map +1 -1
  399. package/node_modules/@earendil-works/pi-ai/dist/api/google-shared.d.ts.map +1 -1
  400. package/node_modules/@earendil-works/pi-ai/dist/api/google-shared.js +4 -3
  401. package/node_modules/@earendil-works/pi-ai/dist/api/google-shared.js.map +1 -1
  402. package/node_modules/@earendil-works/pi-ai/dist/api/google-vertex.d.ts.map +1 -1
  403. package/node_modules/@earendil-works/pi-ai/dist/api/google-vertex.js +12 -2
  404. package/node_modules/@earendil-works/pi-ai/dist/api/google-vertex.js.map +1 -1
  405. package/node_modules/@earendil-works/pi-ai/dist/api/openai-codex-responses.d.ts.map +1 -1
  406. package/node_modules/@earendil-works/pi-ai/dist/api/openai-codex-responses.js +19 -11
  407. package/node_modules/@earendil-works/pi-ai/dist/api/openai-codex-responses.js.map +1 -1
  408. package/node_modules/@earendil-works/pi-ai/dist/api/openai-completions.d.ts.map +1 -1
  409. package/node_modules/@earendil-works/pi-ai/dist/api/openai-completions.js +121 -23
  410. package/node_modules/@earendil-works/pi-ai/dist/api/openai-completions.js.map +1 -1
  411. package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses-shared.d.ts +1 -0
  412. package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses-shared.d.ts.map +1 -1
  413. package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses-shared.js +67 -31
  414. package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses-shared.js.map +1 -1
  415. package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses.d.ts.map +1 -1
  416. package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses.js +13 -8
  417. package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses.js.map +1 -1
  418. package/node_modules/@earendil-works/pi-ai/dist/api/simple-options.d.ts.map +1 -1
  419. package/node_modules/@earendil-works/pi-ai/dist/api/simple-options.js +1 -0
  420. package/node_modules/@earendil-works/pi-ai/dist/api/simple-options.js.map +1 -1
  421. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/radius.d.ts +3 -2
  422. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/radius.d.ts.map +1 -1
  423. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/radius.js +37 -35
  424. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/radius.js.map +1 -1
  425. package/node_modules/@earendil-works/pi-ai/dist/auth/resolve.d.ts.map +1 -1
  426. package/node_modules/@earendil-works/pi-ai/dist/auth/resolve.js +11 -1
  427. package/node_modules/@earendil-works/pi-ai/dist/auth/resolve.js.map +1 -1
  428. package/node_modules/@earendil-works/pi-ai/dist/index.d.ts +1 -0
  429. package/node_modules/@earendil-works/pi-ai/dist/index.d.ts.map +1 -1
  430. package/node_modules/@earendil-works/pi-ai/dist/index.js +1 -0
  431. package/node_modules/@earendil-works/pi-ai/dist/index.js.map +1 -1
  432. package/node_modules/@earendil-works/pi-ai/dist/models-store.d.ts +5 -0
  433. package/node_modules/@earendil-works/pi-ai/dist/models-store.d.ts.map +1 -1
  434. package/node_modules/@earendil-works/pi-ai/dist/models-store.js.map +1 -1
  435. package/node_modules/@earendil-works/pi-ai/dist/models.d.ts.map +1 -1
  436. package/node_modules/@earendil-works/pi-ai/dist/models.js +5 -1
  437. package/node_modules/@earendil-works/pi-ai/dist/models.js.map +1 -1
  438. package/node_modules/@earendil-works/pi-ai/dist/providers/data/.manifest.json +1 -1
  439. package/node_modules/@earendil-works/pi-ai/dist/providers/data/amazon-bedrock.json +1 -1
  440. package/node_modules/@earendil-works/pi-ai/dist/providers/data/anthropic.json +1 -1
  441. package/node_modules/@earendil-works/pi-ai/dist/providers/data/cloudflare-ai-gateway.json +1 -1
  442. package/node_modules/@earendil-works/pi-ai/dist/providers/data/github-copilot.json +1 -1
  443. package/node_modules/@earendil-works/pi-ai/dist/providers/data/opencode.json +1 -1
  444. package/node_modules/@earendil-works/pi-ai/dist/providers/data/openrouter.json +1 -1
  445. package/node_modules/@earendil-works/pi-ai/dist/providers/data/vercel-ai-gateway.json +1 -1
  446. package/node_modules/@earendil-works/pi-ai/dist/types.d.ts +9 -0
  447. package/node_modules/@earendil-works/pi-ai/dist/types.d.ts.map +1 -1
  448. package/node_modules/@earendil-works/pi-ai/dist/types.js.map +1 -1
  449. package/node_modules/@earendil-works/pi-ai/dist/utils/error-body.d.ts.map +1 -1
  450. package/node_modules/@earendil-works/pi-ai/dist/utils/error-body.js +8 -3
  451. package/node_modules/@earendil-works/pi-ai/dist/utils/error-body.js.map +1 -1
  452. package/node_modules/@earendil-works/pi-ai/dist/utils/retry.d.ts.map +1 -1
  453. package/node_modules/@earendil-works/pi-ai/dist/utils/retry.js +10 -0
  454. package/node_modules/@earendil-works/pi-ai/dist/utils/retry.js.map +1 -1
  455. package/node_modules/@earendil-works/pi-ai/dist/utils/server-fallback-receipt.d.ts +30 -0
  456. package/node_modules/@earendil-works/pi-ai/dist/utils/server-fallback-receipt.d.ts.map +1 -0
  457. package/node_modules/@earendil-works/pi-ai/dist/utils/server-fallback-receipt.js +70 -0
  458. package/node_modules/@earendil-works/pi-ai/dist/utils/server-fallback-receipt.js.map +1 -0
  459. package/node_modules/@earendil-works/pi-ai/dist/utils/stop-details.d.ts +1 -1
  460. package/node_modules/@earendil-works/pi-ai/dist/utils/stop-details.d.ts.map +1 -1
  461. package/node_modules/@earendil-works/pi-ai/dist/utils/stop-details.js +7 -3
  462. package/node_modules/@earendil-works/pi-ai/dist/utils/stop-details.js.map +1 -1
  463. package/node_modules/@earendil-works/pi-ai/dist/utils/tool-call-id.d.ts +9 -0
  464. package/node_modules/@earendil-works/pi-ai/dist/utils/tool-call-id.d.ts.map +1 -0
  465. package/node_modules/@earendil-works/pi-ai/dist/utils/tool-call-id.js +16 -0
  466. package/node_modules/@earendil-works/pi-ai/dist/utils/tool-call-id.js.map +1 -0
  467. package/node_modules/@earendil-works/pi-ai/package.json +1 -1
  468. package/node_modules/@earendil-works/pi-pty/package.json +1 -1
  469. package/node_modules/@earendil-works/pi-tui/dist/autocomplete.d.ts +1 -0
  470. package/node_modules/@earendil-works/pi-tui/dist/autocomplete.d.ts.map +1 -1
  471. package/node_modules/@earendil-works/pi-tui/dist/autocomplete.js +35 -3
  472. package/node_modules/@earendil-works/pi-tui/dist/autocomplete.js.map +1 -1
  473. package/node_modules/@earendil-works/pi-tui/dist/components/editor.d.ts +6 -0
  474. package/node_modules/@earendil-works/pi-tui/dist/components/editor.d.ts.map +1 -1
  475. package/node_modules/@earendil-works/pi-tui/dist/components/editor.js.map +1 -1
  476. package/node_modules/@earendil-works/pi-tui/dist/components/select-list.d.ts +32 -0
  477. package/node_modules/@earendil-works/pi-tui/dist/components/select-list.d.ts.map +1 -1
  478. package/node_modules/@earendil-works/pi-tui/dist/components/select-list.js +15 -7
  479. package/node_modules/@earendil-works/pi-tui/dist/components/select-list.js.map +1 -1
  480. package/node_modules/@earendil-works/pi-tui/dist/index.d.ts +1 -1
  481. package/node_modules/@earendil-works/pi-tui/dist/index.d.ts.map +1 -1
  482. package/node_modules/@earendil-works/pi-tui/dist/index.js.map +1 -1
  483. package/node_modules/@earendil-works/pi-tui/package.json +1 -1
  484. package/package.json +8 -8
  485. package/dist/cli/neo/build-argv.d.ts +0 -19
  486. package/dist/cli/neo/build-argv.d.ts.map +0 -1
  487. package/dist/cli/neo/build-argv.js +0 -84
  488. package/dist/cli/neo/build-argv.js.map +0 -1
  489. package/dist/cli/neo/daemon-launch.d.ts +0 -25
  490. package/dist/cli/neo/daemon-launch.d.ts.map +0 -1
  491. package/dist/cli/neo/daemon-launch.js +0 -97
  492. package/dist/cli/neo/daemon-launch.js.map +0 -1
  493. package/dist/cli/neo/gate.d.ts +0 -15
  494. package/dist/cli/neo/gate.d.ts.map +0 -1
  495. package/dist/cli/neo/gate.js +0 -21
  496. package/dist/cli/neo/gate.js.map +0 -1
  497. package/dist/cli/neo/launch.d.ts +0 -24
  498. package/dist/cli/neo/launch.d.ts.map +0 -1
  499. package/dist/cli/neo/launch.js +0 -66
  500. package/dist/cli/neo/launch.js.map +0 -1
  501. package/dist/cli/neo/platform.d.ts +0 -38
  502. package/dist/cli/neo/platform.d.ts.map +0 -1
  503. package/dist/cli/neo/platform.js +0 -54
  504. package/dist/cli/neo/platform.js.map +0 -1
  505. package/dist/cli/neo/resolve-binary.d.ts +0 -39
  506. package/dist/cli/neo/resolve-binary.d.ts.map +0 -1
  507. package/dist/cli/neo/resolve-binary.js +0 -66
  508. package/dist/cli/neo/resolve-binary.js.map +0 -1
  509. package/dist/core/extensions/builtin/session-observer/index.d.ts +0 -5
  510. package/dist/core/extensions/builtin/session-observer/index.d.ts.map +0 -1
  511. package/dist/core/extensions/builtin/session-observer/index.js +0 -36
  512. package/dist/core/extensions/builtin/session-observer/index.js.map +0 -1
  513. package/dist/core/extensions/builtin/session-observer/loader.d.ts +0 -3
  514. package/dist/core/extensions/builtin/session-observer/loader.d.ts.map +0 -1
  515. package/dist/core/extensions/builtin/session-observer/loader.js +0 -20
  516. package/dist/core/extensions/builtin/session-observer/loader.js.map +0 -1
  517. package/dist/core/extensions/builtin/session-observer/overlay-format.d.ts +0 -7
  518. package/dist/core/extensions/builtin/session-observer/overlay-format.d.ts.map +0 -1
  519. package/dist/core/extensions/builtin/session-observer/overlay-format.js +0 -30
  520. package/dist/core/extensions/builtin/session-observer/overlay-format.js.map +0 -1
  521. package/dist/core/extensions/builtin/session-observer/overlay.d.ts +0 -51
  522. package/dist/core/extensions/builtin/session-observer/overlay.d.ts.map +0 -1
  523. package/dist/core/extensions/builtin/session-observer/overlay.js +0 -229
  524. package/dist/core/extensions/builtin/session-observer/overlay.js.map +0 -1
  525. package/dist/core/extensions/builtin/session-observer/scanner.d.ts +0 -10
  526. package/dist/core/extensions/builtin/session-observer/scanner.d.ts.map +0 -1
  527. package/dist/core/extensions/builtin/session-observer/scanner.js +0 -142
  528. package/dist/core/extensions/builtin/session-observer/scanner.js.map +0 -1
  529. package/dist/core/extensions/builtin/session-observer/text.d.ts +0 -7
  530. package/dist/core/extensions/builtin/session-observer/text.d.ts.map +0 -1
  531. package/dist/core/extensions/builtin/session-observer/text.js +0 -37
  532. package/dist/core/extensions/builtin/session-observer/text.js.map +0 -1
  533. package/dist/core/extensions/builtin/session-observer/transcript-entries.d.ts +0 -7
  534. package/dist/core/extensions/builtin/session-observer/transcript-entries.d.ts.map +0 -1
  535. package/dist/core/extensions/builtin/session-observer/transcript-entries.js +0 -71
  536. package/dist/core/extensions/builtin/session-observer/transcript-entries.js.map +0 -1
  537. package/dist/core/extensions/builtin/session-observer/transcript-format.d.ts +0 -11
  538. package/dist/core/extensions/builtin/session-observer/transcript-format.d.ts.map +0 -1
  539. package/dist/core/extensions/builtin/session-observer/transcript-format.js +0 -65
  540. package/dist/core/extensions/builtin/session-observer/transcript-format.js.map +0 -1
  541. package/dist/core/extensions/builtin/session-observer/transcript.d.ts +0 -4
  542. package/dist/core/extensions/builtin/session-observer/transcript.d.ts.map +0 -1
  543. package/dist/core/extensions/builtin/session-observer/transcript.js +0 -81
  544. package/dist/core/extensions/builtin/session-observer/transcript.js.map +0 -1
  545. package/dist/core/extensions/builtin/session-observer/types.d.ts +0 -33
  546. package/dist/core/extensions/builtin/session-observer/types.d.ts.map +0 -1
  547. package/dist/core/extensions/builtin/session-observer/types.js +0 -2
  548. package/dist/core/extensions/builtin/session-observer/types.js.map +0 -1
  549. package/dist/modes/rpc/neo-daemon-child-worker.d.ts +0 -29
  550. package/dist/modes/rpc/neo-daemon-child-worker.d.ts.map +0 -1
  551. package/dist/modes/rpc/neo-daemon-child-worker.js +0 -95
  552. package/dist/modes/rpc/neo-daemon-child-worker.js.map +0 -1
  553. package/dist/modes/rpc/neo-daemon-mode.d.ts +0 -110
  554. package/dist/modes/rpc/neo-daemon-mode.d.ts.map +0 -1
  555. package/dist/modes/rpc/neo-daemon-mode.js +0 -267
  556. package/dist/modes/rpc/neo-daemon-mode.js.map +0 -1
  557. package/dist/modes/rpc/neo-daemon-protocol.d.ts +0 -50
  558. package/dist/modes/rpc/neo-daemon-protocol.d.ts.map +0 -1
  559. package/dist/modes/rpc/neo-daemon-protocol.js +0 -66
  560. package/dist/modes/rpc/neo-daemon-protocol.js.map +0 -1
  561. package/dist/modes/rpc/neo-daemon-registry.d.ts +0 -98
  562. package/dist/modes/rpc/neo-daemon-registry.d.ts.map +0 -1
  563. package/dist/modes/rpc/neo-daemon-registry.js +0 -209
  564. package/dist/modes/rpc/neo-daemon-registry.js.map +0 -1
  565. package/dist/modes/rpc/neo-runtime-options-argv.d.ts +0 -17
  566. package/dist/modes/rpc/neo-runtime-options-argv.d.ts.map +0 -1
  567. package/dist/modes/rpc/neo-runtime-options-argv.js +0 -79
  568. package/dist/modes/rpc/neo-runtime-options-argv.js.map +0 -1
  569. package/dist/modes/rpc/neo-runtime-options.d.ts +0 -84
  570. package/dist/modes/rpc/neo-runtime-options.d.ts.map +0 -1
  571. package/dist/modes/rpc/neo-runtime-options.js +0 -92
  572. package/dist/modes/rpc/neo-runtime-options.js.map +0 -1
  573. package/docs/neo.md +0 -111
  574. package/node_modules/@code-yeongyu/senpi-codemode/src/codemode/runtime.ts +0 -258
  575. package/node_modules/@code-yeongyu/senpi-codemode/src/codemode/tools.ts +0 -106
@@ -1 +1 @@
1
- {"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/todotools/prompt.ts"],"names":[],"mappings":"AAAA,qDAAqD;AACrD,mCAAmC;AACnC,oCAAoC;AACpC,sCAAsC;AAEtC,MAAM,CAAC,MAAM,qBAAqB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;YAuCzB,CAAC;AAEb,MAAM,CAAC,MAAM,uBAAuB,GAAG;;;;;;EAMrC,qBAAqB;;;;;;;CAOtB,CAAC","sourcesContent":["// Adapted from oh-my-pi's todo prompt (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\nexport const TODO_TOOL_DESCRIPTION = `**Tasks referenced by verbatim content string, NEVER an auto-generated ID — no \"task-1\"/\"task-N\" exists. Pass the content text in the task field.**\n\nOn each completion the earliest still-open task (in phase order) auto-promotes to in_progress.\nCompleting tasks out of phase order can move this pointer **back** to an earlier phase — expected; completed tasks are never reverted.\n\n## Operations\n\n| op | Required fields | Effect |\n|---|---|---|\n| init | list: [{phase, items: string[]}] | Initialize full list (replaces existing) |\n| init | items: string[] | Flattened single-phase init |\n| start | task | Mark in progress |\n| done | task or phase | Mark completed |\n| drop | task or phase | Mark abandoned |\n| rm | task or phase (optional) | Remove task or phase; omit both to clear |\n| append | phase, items: string[] | Append tasks to phase; lazily creates phase |\n| view | — | Read-only: echo list |\n\n## Anatomy\n- **Task content**: 5–10 words; what, not how. Unique identifier.\n- **Phase name**: short noun phrase (e.g. Foundation, Auth, Verification). Unique identifier. NEVER prefix 1., A), Phase 1:.\n\n## Rules\n- Mark tasks done immediately after finishing. Complete phases in order.\n- NEVER make a todo call your turn's only tool call — batch it with the real work: init with the first reads/edits, each done/start with the next action. Solo todo turns waste a round trip.\n- Blocked? append a task to the active phase, or drop.\n- Keep task/phase strings stable once introduced.\n- Lost the exact task text? view echoes the list — NEVER guess from memory.\n\n## When to create a list\n- Task requires 3+ distinct steps\n- User explicitly requests one\n- User provides a set of tasks\n- New instructions arrive mid-task — capture before proceeding\n\n<critical>\nUser hands you a multi-step plan — phased todo, numbered/bulleted checklist, or \"N bugs/items/tasks\":\n- You MUST init the list with EVERY item as its own task before working.\n- Enumerate all; NEVER summarize into fewer tasks, sample \"the important ones\", drop items, or track the rest from memory.\n</critical>`;\n\nexport const TASK_MANAGEMENT_SECTION = `\n<Task_Management>\n## Todo Management (CRITICAL)\n\nUse the todo tool for multi-step work. It is one operation at a time: initialize a phased list, then start, complete, abandon, append, remove, or view tasks by their exact content. The earliest open task auto-promotes after each completion.\n\n${TODO_TOOL_DESCRIPTION}\n\n## Evidence\n- File edit: inspect the changed files and diagnostics.\n- Build command: require exit code 0.\n- Test run: require passing output, or state the pre-existing failure.\n</Task_Management>\n`;\n"]}
1
+ {"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/todotools/prompt.ts"],"names":[],"mappings":"AAAA,qDAAqD;AACrD,mCAAmC;AACnC,oCAAoC;AACpC,sCAAsC;AAEtC,MAAM,CAAC,MAAM,qBAAqB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;YAyCzB,CAAC;AAEb,MAAM,CAAC,MAAM,uBAAuB,GAAG;;;;;;EAMrC,qBAAqB;;;;;;;CAOtB,CAAC","sourcesContent":["// Adapted from oh-my-pi's todo prompt (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\nexport const TODO_TOOL_DESCRIPTION = `**Tasks referenced by verbatim content string, NEVER an auto-generated ID — no \"task-1\"/\"task-N\" exists. Pass the content text in the task field.**\n\nOn each completion the earliest still-open task (in phase order) auto-promotes to in_progress.\nCompleting tasks out of phase order can move this pointer **back** to an earlier phase — expected; completed tasks are never reverted.\n\n## Operations\n\n| op | Required fields | Effect |\n|---|---|---|\n| init | list: [{phase, items: string[]}] | Initialize full list (replaces existing) |\n| init | items: string[] | Flattened single-phase init |\n| start | task | Mark in progress |\n| done | task or phase | Mark completed |\n| drop | task or phase | Mark abandoned |\n| rm | task or phase (optional) | Remove task or phase; omit both to clear |\n| append | phase?, items: string[] | Append tasks to phase; lazily creates phase |\n| view | — | Read-only: echo list |\n\nExample: {\"op\":\"init\",\"list\":[{\"phase\":\"Setup\",\"items\":[\"Survey code\",\"Write tests\"]}]}\n\n## Anatomy\n- **Task content**: 5–10 words; what, not how. Unique identifier.\n- **Phase name**: short noun phrase (e.g. Foundation, Auth, Verification). Unique identifier. NEVER prefix 1., A), Phase 1:.\n\n## Rules\n- Mark tasks done immediately after finishing. Complete phases in order.\n- NEVER make a todo call your turn's only tool call — batch it with the real work: init with the first reads/edits, each done/start with the next action. Solo todo turns waste a round trip.\n- Blocked? append a task to the active phase, or drop.\n- Keep task/phase strings stable once introduced.\n- Lost the exact task text? view echoes the list — NEVER guess from memory. done/start/drop take the task's EXACT text — copy it verbatim from the latest todo result, never re-type from memory.\n\n## When to create a list\n- Task requires 3+ distinct steps\n- User explicitly requests one\n- User provides a set of tasks\n- New instructions arrive mid-task — capture before proceeding\n\n<critical>\nUser hands you a multi-step plan — phased todo, numbered/bulleted checklist, or \"N bugs/items/tasks\":\n- You MUST init the list with EVERY item as its own task before working.\n- Enumerate all; NEVER summarize into fewer tasks, sample \"the important ones\", drop items, or track the rest from memory.\n</critical>`;\n\nexport const TASK_MANAGEMENT_SECTION = `\n<Task_Management>\n## Todo Management (CRITICAL)\n\nUse the todo tool for multi-step work. It is one operation at a time: initialize a phased list, then start, complete, abandon, append, remove, or view tasks by their exact content. The earliest open task auto-promotes after each completion.\n\n${TODO_TOOL_DESCRIPTION}\n\n## Evidence\n- File edit: inspect the changed files and diagnostics.\n- Build command: require exit code 0.\n- Test run: require passing output, or state the pre-existing failure.\n</Task_Management>\n`;\n"]}
@@ -17,6 +17,7 @@ export type TodoToolDetails = {
17
17
  op?: TodoOperation;
18
18
  phases: TodoPhase[];
19
19
  storage: "session" | "memory";
20
+ corrections?: string[];
20
21
  completedTasks?: TodoCompletionTransition[];
21
22
  };
22
23
  export type TodoStateEntry = {
@@ -49,14 +50,14 @@ export declare function normalizeInProgressTask(phases: TodoPhase[]): void;
49
50
  /** Return the active task, preferring an in-progress item over the first pending item. */
50
51
  export declare function nextActionableTask(phases: readonly TodoPhase[]): TodoItem | undefined;
51
52
  export declare function getCompletionTransitions(previous: readonly TodoPhase[], updated: readonly TodoPhase[]): TodoCompletionTransition[];
52
- export declare function resolveTaskOrError(phases: TodoPhase[], content: string | undefined, errors: string[]): TaskHit | undefined;
53
- export declare function resolvePhaseOrError(phases: TodoPhase[], name: string | undefined, errors: string[]): TodoPhase | undefined;
54
- export declare function getTaskTargets(phases: TodoPhase[], entry: TodoOpEntry, errors: string[]): TodoItem[];
55
- export declare function initPhases(entry: TodoOpEntry, errors: string[]): TodoPhase[];
56
- export declare function appendItems(phases: TodoPhase[], entry: TodoOpEntry, errors: string[]): TodoPhase[];
57
- export declare function removeTasks(phases: TodoPhase[], entry: TodoOpEntry, errors: string[]): TodoPhase[];
58
- export declare function applyEntry(phases: TodoPhase[], entry: TodoOpEntry, errors: string[]): TodoPhase[];
59
- export declare function applyParams(phases: TodoPhase[], params: TodoOpEntry): {
53
+ export declare function resolveTaskOrError(phases: TodoPhase[], content: string | undefined, errors: string[], corrections?: string[]): TaskHit | undefined;
54
+ export declare function resolvePhaseOrError(phases: TodoPhase[], name: string | undefined, errors: string[], corrections?: string[]): TodoPhase | undefined;
55
+ export declare function getTaskTargets(phases: TodoPhase[], entry: TodoOpEntry, errors: string[], corrections?: string[]): TodoItem[];
56
+ export declare function initPhases(entry: TodoOpEntry, errors: string[], corrections?: string[]): TodoPhase[];
57
+ export declare function appendItems(phases: TodoPhase[], entry: TodoOpEntry, errors: string[], corrections?: string[]): TodoPhase[];
58
+ export declare function removeTasks(phases: TodoPhase[], entry: TodoOpEntry, errors: string[], corrections?: string[]): TodoPhase[];
59
+ export declare function applyEntry(phases: TodoPhase[], entry: TodoOpEntry, errors: string[], corrections?: string[]): TodoPhase[];
60
+ export declare function applyParams(phases: TodoPhase[], params: TodoOpEntry, corrections?: string[]): {
60
61
  phases: TodoPhase[];
61
62
  errors: string[];
62
63
  };
@@ -1 +1 @@
1
- {"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/todotools/state.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/todotools/state.ts"],"names":[],"mappings":"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"}
@@ -3,6 +3,7 @@
3
3
  // Copyright (c) 2025-2026 Can Bölük
4
4
  // https://github.com/can1357/oh-my-pi
5
5
  import { stripAnsi } from "../../../../utils/ansi.js";
6
+ import { fuzzyResolvePhase, fuzzyResolveTask } from "./fuzzy-match.js";
6
7
  export const TODO_STATE_ENTRY_TYPE = "senpi.todo-state";
7
8
  export const DEFAULT_INIT_PHASE = "Tasks";
8
9
  function isRecord(value) {
@@ -136,46 +137,86 @@ export function getCompletionTransitions(previous, updated) {
136
137
  }
137
138
  return transitions;
138
139
  }
139
- export function resolveTaskOrError(phases, content, errors) {
140
+ export function resolveTaskOrError(phases, content, errors, corrections) {
140
141
  if (!content) {
141
142
  errors.push("Missing task content");
142
143
  return undefined;
143
144
  }
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.`);
145
+ if (!corrections) {
146
+ const hit = findTaskByContent(phases, content);
147
+ if (!hit) {
148
+ if (/^task-\d+$/.test(content)) {
149
+ errors.push(`Task "${content}" not found. Tasks are referenced by content, not by IDs — pass the task's full text from the previous result.`);
150
+ }
151
+ else {
152
+ const totalTasks = phases.reduce((sum, phase) => sum + phase.tasks.length, 0);
153
+ const hint = totalTasks === 0 ? " (todo list is empty — was it replaced or not yet created?)" : "";
154
+ errors.push(`Task "${content}" not found${hint}`);
155
+ }
148
156
  }
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}`);
157
+ return hit;
158
+ }
159
+ const resolution = fuzzyResolveTask(phases, content);
160
+ if (resolution.hit) {
161
+ if (resolution.corrected) {
162
+ corrections.push(`[auto-matched] task "${content}" -> "${resolution.hit.task.content}" — pass the exact text from the previous todo result next time`);
153
163
  }
164
+ return resolution.hit;
154
165
  }
155
- return hit;
166
+ const exactMatches = phases.flatMap((phase) => phase.tasks.filter((task) => task.content === content).map((task) => ({ task, phase })));
167
+ if (exactMatches.length > 1) {
168
+ const phaseNames = [...new Set(exactMatches.map((match) => match.phase.name))].map((name) => `"${name}"`);
169
+ errors.push(`Task "${content}" is ambiguous: duplicate task text exists in phases ${phaseNames.join(", ")}. Use /todo edit to make the task text unique.`);
170
+ return undefined;
171
+ }
172
+ if (/^task-\d+$/.test(content)) {
173
+ errors.push(`Task "${content}" not found. Tasks are referenced by content, not by IDs — pass the task's full text from the previous result.`);
174
+ return undefined;
175
+ }
176
+ const totalTasks = phases.reduce((sum, phase) => sum + phase.tasks.length, 0);
177
+ const hint = totalTasks === 0 ? " (todo list is empty — was it replaced or not yet created?)" : "";
178
+ const suggestion = resolution.suggestion ? ` Did you mean "${resolution.suggestion}"?` : "";
179
+ errors.push(`Task "${content}" not found${hint}${suggestion}`);
180
+ return undefined;
156
181
  }
157
- export function resolvePhaseOrError(phases, name, errors) {
182
+ export function resolvePhaseOrError(phases, name, errors, corrections) {
158
183
  if (!name) {
159
184
  errors.push("Missing phase name");
160
185
  return undefined;
161
186
  }
162
- const phase = findPhaseByName(phases, name);
163
- if (!phase)
164
- errors.push(`Phase "${name}" not found`);
165
- return phase;
187
+ if (!corrections) {
188
+ const phase = findPhaseByName(phases, name);
189
+ if (!phase)
190
+ errors.push(`Phase "${name}" not found`);
191
+ return phase;
192
+ }
193
+ const resolution = fuzzyResolvePhase(phases, name);
194
+ if (resolution.hit) {
195
+ if (resolution.corrected) {
196
+ corrections.push(`[auto-matched] phase "${name}" -> "${resolution.hit.name}" — pass the exact text from the previous todo result next time`);
197
+ }
198
+ return resolution.hit;
199
+ }
200
+ if (phases.filter((phase) => phase.name === name).length > 1) {
201
+ errors.push(`Phase "${name}" is ambiguous: duplicate phase names exist. Use /todo edit to make the phase name unique.`);
202
+ return undefined;
203
+ }
204
+ const suggestion = resolution.suggestion ? ` Did you mean "${resolution.suggestion}"?` : "";
205
+ errors.push(`Phase "${name}" not found${suggestion}`);
206
+ return undefined;
166
207
  }
167
- export function getTaskTargets(phases, entry, errors) {
208
+ export function getTaskTargets(phases, entry, errors, corrections) {
168
209
  if (entry.task) {
169
- const hit = resolveTaskOrError(phases, entry.task, errors);
210
+ const hit = resolveTaskOrError(phases, entry.task, errors, corrections);
170
211
  return hit ? [hit.task] : [];
171
212
  }
172
213
  if (entry.phase) {
173
- const phase = resolvePhaseOrError(phases, entry.phase, errors);
214
+ const phase = resolvePhaseOrError(phases, entry.phase, errors, corrections);
174
215
  return phase ? [...phase.tasks] : [];
175
216
  }
176
217
  return phases.flatMap((phase) => phase.tasks);
177
218
  }
178
- export function initPhases(entry, errors) {
219
+ export function initPhases(entry, errors, corrections) {
179
220
  const list = entry.list ??
180
221
  (entry.items && entry.items.length > 0
181
222
  ? [{ phase: entry.phase ?? DEFAULT_INIT_PHASE, items: entry.items }]
@@ -184,30 +225,33 @@ export function initPhases(entry, errors) {
184
225
  errors.push("Missing list for init operation");
185
226
  return [];
186
227
  }
187
- const seenPhases = new Set();
228
+ const phases = [];
229
+ const phasesByName = new Map();
188
230
  const seenTasks = new Set();
189
231
  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
232
  if (listEntry.items.length === 0)
194
233
  errors.push(`Phase "${listEntry.phase}" has no tasks in init list`);
234
+ let phase = phasesByName.get(listEntry.phase);
235
+ if (phase) {
236
+ corrections?.push(`[auto-corrected] merged duplicate phase "${listEntry.phase}" in init list`);
237
+ }
238
+ else {
239
+ phase = { name: listEntry.phase, tasks: [] };
240
+ phasesByName.set(listEntry.phase, phase);
241
+ phases.push(phase);
242
+ }
195
243
  for (const content of listEntry.items) {
196
- if (seenTasks.has(content))
197
- errors.push(`Duplicate task "${content}" in init list`);
244
+ if (seenTasks.has(content)) {
245
+ corrections?.push(`[auto-corrected] kept first duplicate task "${content}" in init list`);
246
+ continue;
247
+ }
198
248
  seenTasks.add(content);
249
+ phase.tasks.push({ content, status: "pending" });
199
250
  }
200
251
  }
201
- return list.map((listEntry) => ({
202
- name: listEntry.phase,
203
- tasks: listEntry.items.map((content) => ({ content, status: "pending" })),
204
- }));
252
+ return phases;
205
253
  }
206
- export function appendItems(phases, entry, errors) {
207
- if (!entry.phase) {
208
- errors.push("Missing phase name for append operation");
209
- return phases;
210
- }
254
+ export function appendItems(phases, entry, errors, corrections) {
211
255
  if (!entry.items || entry.items.length === 0) {
212
256
  errors.push("Missing items for append operation");
213
257
  return phases;
@@ -223,25 +267,32 @@ export function appendItems(phases, entry, errors) {
223
267
  }
224
268
  if (hasDuplicate)
225
269
  return phases;
226
- let phase = findPhaseByName(phases, entry.phase);
270
+ let phaseName = entry.phase;
271
+ if (!phaseName) {
272
+ const activeTask = nextActionableTask(phases);
273
+ const activePhase = activeTask ? phases.find((phase) => phase.tasks.includes(activeTask)) : undefined;
274
+ phaseName = activePhase?.name ?? phases[phases.length - 1]?.name ?? DEFAULT_INIT_PHASE;
275
+ corrections?.push(`[auto-corrected] append had no phase; used "${phaseName}"`);
276
+ }
277
+ let phase = findPhaseByName(phases, phaseName);
227
278
  if (!phase) {
228
- phase = { name: entry.phase, tasks: [] };
279
+ phase = { name: phaseName, tasks: [] };
229
280
  phases.push(phase);
230
281
  }
231
282
  for (const content of entry.items)
232
283
  phase.tasks.push({ content, status: "pending" });
233
284
  return phases;
234
285
  }
235
- export function removeTasks(phases, entry, errors) {
286
+ export function removeTasks(phases, entry, errors, corrections) {
236
287
  if (entry.task) {
237
- const hit = resolveTaskOrError(phases, entry.task, errors);
288
+ const hit = resolveTaskOrError(phases, entry.task, errors, corrections);
238
289
  if (!hit)
239
290
  return phases;
240
291
  hit.phase.tasks = hit.phase.tasks.filter((candidate) => candidate !== hit.task);
241
292
  return phases;
242
293
  }
243
294
  if (entry.phase) {
244
- const phase = resolvePhaseOrError(phases, entry.phase, errors);
295
+ const phase = resolvePhaseOrError(phases, entry.phase, errors, corrections);
245
296
  if (!phase)
246
297
  return phases;
247
298
  phase.tasks = [];
@@ -251,12 +302,12 @@ export function removeTasks(phases, entry, errors) {
251
302
  phase.tasks = [];
252
303
  return phases;
253
304
  }
254
- export function applyEntry(phases, entry, errors) {
305
+ export function applyEntry(phases, entry, errors, corrections) {
255
306
  switch (entry.op) {
256
307
  case "init":
257
- return initPhases(entry, errors);
308
+ return initPhases(entry, errors, corrections);
258
309
  case "start": {
259
- const hit = resolveTaskOrError(phases, entry.task, errors);
310
+ const hit = resolveTaskOrError(phases, entry.task, errors, corrections);
260
311
  if (!hit)
261
312
  return phases;
262
313
  for (const phase of phases) {
@@ -269,27 +320,27 @@ export function applyEntry(phases, entry, errors) {
269
320
  return phases;
270
321
  }
271
322
  case "done":
272
- for (const task of getTaskTargets(phases, entry, errors))
323
+ for (const task of getTaskTargets(phases, entry, errors, corrections))
273
324
  task.status = "completed";
274
325
  return phases;
275
326
  case "drop":
276
- for (const task of getTaskTargets(phases, entry, errors))
327
+ for (const task of getTaskTargets(phases, entry, errors, corrections))
277
328
  task.status = "abandoned";
278
329
  return phases;
279
330
  case "rm":
280
- return removeTasks(phases, entry, errors);
331
+ return removeTasks(phases, entry, errors, corrections);
281
332
  case "append":
282
- return appendItems(phases, entry, errors);
333
+ return appendItems(phases, entry, errors, corrections);
283
334
  case "view":
284
335
  return phases;
285
336
  }
286
337
  }
287
- export function applyParams(phases, params) {
338
+ export function applyParams(phases, params, corrections) {
288
339
  if (params.op === "view")
289
340
  return { phases, errors: [] };
290
341
  const original = clonePhases(phases);
291
342
  const errors = [];
292
- const next = applyEntry(phases, params, errors);
343
+ const next = applyEntry(phases, params, errors, corrections);
293
344
  if (errors.length > 0)
294
345
  return { phases: original, errors };
295
346
  normalizeInProgressTask(next);
@@ -1 +1 @@
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"]}
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\";\nimport { fuzzyResolvePhase, fuzzyResolveTask } from \"./fuzzy-match.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\tcorrections?: string[];\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\tcorrections?: string[],\n): TaskHit | undefined {\n\tif (!content) {\n\t\terrors.push(\"Missing task content\");\n\t\treturn undefined;\n\t}\n\tif (!corrections) {\n\t\tconst hit = findTaskByContent(phases, content);\n\t\tif (!hit) {\n\t\t\tif (/^task-\\d+$/.test(content)) {\n\t\t\t\terrors.push(\n\t\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\t);\n\t\t\t} else {\n\t\t\t\tconst totalTasks = phases.reduce((sum, phase) => sum + phase.tasks.length, 0);\n\t\t\t\tconst hint = totalTasks === 0 ? \" (todo list is empty — was it replaced or not yet created?)\" : \"\";\n\t\t\t\terrors.push(`Task \"${content}\" not found${hint}`);\n\t\t\t}\n\t\t}\n\t\treturn hit;\n\t}\n\n\tconst resolution = fuzzyResolveTask(phases, content);\n\tif (resolution.hit) {\n\t\tif (resolution.corrected) {\n\t\t\tcorrections.push(\n\t\t\t\t`[auto-matched] task \"${content}\" -> \"${resolution.hit.task.content}\" — pass the exact text from the previous todo result next time`,\n\t\t\t);\n\t\t}\n\t\treturn resolution.hit;\n\t}\n\n\tconst exactMatches = phases.flatMap((phase) =>\n\t\tphase.tasks.filter((task) => task.content === content).map((task) => ({ task, phase })),\n\t);\n\tif (exactMatches.length > 1) {\n\t\tconst phaseNames = [...new Set(exactMatches.map((match) => match.phase.name))].map((name) => `\"${name}\"`);\n\t\terrors.push(\n\t\t\t`Task \"${content}\" is ambiguous: duplicate task text exists in phases ${phaseNames.join(\", \")}. Use /todo edit to make the task text unique.`,\n\t\t);\n\t\treturn undefined;\n\t}\n\tif (/^task-\\d+$/.test(content)) {\n\t\terrors.push(\n\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);\n\t\treturn undefined;\n\t}\n\tconst totalTasks = phases.reduce((sum, phase) => sum + phase.tasks.length, 0);\n\tconst hint = totalTasks === 0 ? \" (todo list is empty — was it replaced or not yet created?)\" : \"\";\n\tconst suggestion = resolution.suggestion ? ` Did you mean \"${resolution.suggestion}\"?` : \"\";\n\terrors.push(`Task \"${content}\" not found${hint}${suggestion}`);\n\treturn undefined;\n}\n\nexport function resolvePhaseOrError(\n\tphases: TodoPhase[],\n\tname: string | undefined,\n\terrors: string[],\n\tcorrections?: string[],\n): TodoPhase | undefined {\n\tif (!name) {\n\t\terrors.push(\"Missing phase name\");\n\t\treturn undefined;\n\t}\n\tif (!corrections) {\n\t\tconst phase = findPhaseByName(phases, name);\n\t\tif (!phase) errors.push(`Phase \"${name}\" not found`);\n\t\treturn phase;\n\t}\n\n\tconst resolution = fuzzyResolvePhase(phases, name);\n\tif (resolution.hit) {\n\t\tif (resolution.corrected) {\n\t\t\tcorrections.push(\n\t\t\t\t`[auto-matched] phase \"${name}\" -> \"${resolution.hit.name}\" — pass the exact text from the previous todo result next time`,\n\t\t\t);\n\t\t}\n\t\treturn resolution.hit;\n\t}\n\tif (phases.filter((phase) => phase.name === name).length > 1) {\n\t\terrors.push(\n\t\t\t`Phase \"${name}\" is ambiguous: duplicate phase names exist. Use /todo edit to make the phase name unique.`,\n\t\t);\n\t\treturn undefined;\n\t}\n\tconst suggestion = resolution.suggestion ? ` Did you mean \"${resolution.suggestion}\"?` : \"\";\n\terrors.push(`Phase \"${name}\" not found${suggestion}`);\n\treturn undefined;\n}\n\nexport function getTaskTargets(\n\tphases: TodoPhase[],\n\tentry: TodoOpEntry,\n\terrors: string[],\n\tcorrections?: string[],\n): TodoItem[] {\n\tif (entry.task) {\n\t\tconst hit = resolveTaskOrError(phases, entry.task, errors, corrections);\n\t\treturn hit ? [hit.task] : [];\n\t}\n\tif (entry.phase) {\n\t\tconst phase = resolvePhaseOrError(phases, entry.phase, errors, corrections);\n\t\treturn phase ? [...phase.tasks] : [];\n\t}\n\treturn phases.flatMap((phase) => phase.tasks);\n}\n\nexport function initPhases(entry: TodoOpEntry, errors: string[], corrections?: 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 phases: TodoPhase[] = [];\n\tconst phasesByName = new Map<string, TodoPhase>();\n\tconst seenTasks = new Set<string>();\n\tfor (const listEntry of list) {\n\t\tif (listEntry.items.length === 0) errors.push(`Phase \"${listEntry.phase}\" has no tasks in init list`);\n\t\tlet phase = phasesByName.get(listEntry.phase);\n\t\tif (phase) {\n\t\t\tcorrections?.push(`[auto-corrected] merged duplicate phase \"${listEntry.phase}\" in init list`);\n\t\t} else {\n\t\t\tphase = { name: listEntry.phase, tasks: [] };\n\t\t\tphasesByName.set(listEntry.phase, phase);\n\t\t\tphases.push(phase);\n\t\t}\n\t\tfor (const content of listEntry.items) {\n\t\t\tif (seenTasks.has(content)) {\n\t\t\t\tcorrections?.push(`[auto-corrected] kept first duplicate task \"${content}\" in init list`);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tseenTasks.add(content);\n\t\t\tphase.tasks.push({ content, status: \"pending\" });\n\t\t}\n\t}\n\n\treturn phases;\n}\n\nexport function appendItems(\n\tphases: TodoPhase[],\n\tentry: TodoOpEntry,\n\terrors: string[],\n\tcorrections?: string[],\n): TodoPhase[] {\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 phaseName = entry.phase;\n\tif (!phaseName) {\n\t\tconst activeTask = nextActionableTask(phases);\n\t\tconst activePhase = activeTask ? phases.find((phase) => phase.tasks.includes(activeTask)) : undefined;\n\t\tphaseName = activePhase?.name ?? phases[phases.length - 1]?.name ?? DEFAULT_INIT_PHASE;\n\t\tcorrections?.push(`[auto-corrected] append had no phase; used \"${phaseName}\"`);\n\t}\n\n\tlet phase = findPhaseByName(phases, phaseName);\n\tif (!phase) {\n\t\tphase = { name: phaseName, 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(\n\tphases: TodoPhase[],\n\tentry: TodoOpEntry,\n\terrors: string[],\n\tcorrections?: string[],\n): TodoPhase[] {\n\tif (entry.task) {\n\t\tconst hit = resolveTaskOrError(phases, entry.task, errors, corrections);\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, corrections);\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(\n\tphases: TodoPhase[],\n\tentry: TodoOpEntry,\n\terrors: string[],\n\tcorrections?: string[],\n): TodoPhase[] {\n\tswitch (entry.op) {\n\t\tcase \"init\":\n\t\t\treturn initPhases(entry, errors, corrections);\n\t\tcase \"start\": {\n\t\t\tconst hit = resolveTaskOrError(phases, entry.task, errors, corrections);\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, corrections)) task.status = \"completed\";\n\t\t\treturn phases;\n\t\tcase \"drop\":\n\t\t\tfor (const task of getTaskTargets(phases, entry, errors, corrections)) task.status = \"abandoned\";\n\t\t\treturn phases;\n\t\tcase \"rm\":\n\t\t\treturn removeTasks(phases, entry, errors, corrections);\n\t\tcase \"append\":\n\t\t\treturn appendItems(phases, entry, errors, corrections);\n\t\tcase \"view\":\n\t\t\treturn phases;\n\t}\n}\n\nexport function applyParams(\n\tphases: TodoPhase[],\n\tparams: TodoOpEntry,\n\tcorrections?: string[],\n): { 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, corrections);\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"]}
@@ -2,7 +2,7 @@ import { Type } from "typebox";
2
2
  import type { ExtensionAPI, ExtensionContext } from "../../../types.ts";
3
3
  import { type TodoPhase } from "../state.ts";
4
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">]>;
5
+ op: Type.TOptional<Type.TUnion<[Type.TLiteral<"init">, Type.TLiteral<"start">, Type.TLiteral<"done">, Type.TLiteral<"rm">, Type.TLiteral<"drop">, Type.TLiteral<"append">, Type.TLiteral<"view">]>>;
6
6
  list: Type.TOptional<Type.TArray<Type.TObject<{
7
7
  phase: Type.TString;
8
8
  items: Type.TArray<Type.TString>;
@@ -1 +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;AAG5C,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;AAqHD,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,YAAY,EAAE,SAAS,EAAE,aAAa,GAAG,IAAI,CAkEjF"}
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;AAG5C,OAAO,KAAK,EAEX,YAAY,EACZ,gBAAgB,EAIhB,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EAYN,KAAK,SAAS,EAGd,MAAM,aAAa,CAAC;AAuBrB,eAAO,MAAM,kBAAkB;;;;;;;;;EAU7B,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;AA4CF,wBAAgB,iBAAiB,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,CA0B/D;AAyID,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,YAAY,EAAE,SAAS,EAAE,aAAa,GAAG,IAAI,CAyEjF"}