@astralyn/pi 0.81.1-1

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 (1065) hide show
  1. package/CHANGELOG.md +5113 -0
  2. package/README.md +677 -0
  3. package/dist/bun/cli.d.ts +3 -0
  4. package/dist/bun/cli.d.ts.map +1 -0
  5. package/dist/bun/cli.js +11 -0
  6. package/dist/bun/cli.js.map +1 -0
  7. package/dist/bun/register-bedrock.d.ts +2 -0
  8. package/dist/bun/register-bedrock.d.ts.map +1 -0
  9. package/dist/bun/register-bedrock.js +4 -0
  10. package/dist/bun/register-bedrock.js.map +1 -0
  11. package/dist/bun/restore-sandbox-env.d.ts +17 -0
  12. package/dist/bun/restore-sandbox-env.d.ts.map +1 -0
  13. package/dist/bun/restore-sandbox-env.js +36 -0
  14. package/dist/bun/restore-sandbox-env.js.map +1 -0
  15. package/dist/cli/args.d.ts +57 -0
  16. package/dist/cli/args.d.ts.map +1 -0
  17. package/dist/cli/args.js +381 -0
  18. package/dist/cli/args.js.map +1 -0
  19. package/dist/cli/config-selector.d.ts +16 -0
  20. package/dist/cli/config-selector.d.ts.map +1 -0
  21. package/dist/cli/config-selector.js +31 -0
  22. package/dist/cli/config-selector.js.map +1 -0
  23. package/dist/cli/file-processor.d.ts +15 -0
  24. package/dist/cli/file-processor.d.ts.map +1 -0
  25. package/dist/cli/file-processor.js +70 -0
  26. package/dist/cli/file-processor.js.map +1 -0
  27. package/dist/cli/initial-message.d.ts +18 -0
  28. package/dist/cli/initial-message.d.ts.map +1 -0
  29. package/dist/cli/initial-message.js +22 -0
  30. package/dist/cli/initial-message.js.map +1 -0
  31. package/dist/cli/list-models.d.ts +9 -0
  32. package/dist/cli/list-models.d.ts.map +1 -0
  33. package/dist/cli/list-models.js +98 -0
  34. package/dist/cli/list-models.js.map +1 -0
  35. package/dist/cli/project-trust.d.ts +10 -0
  36. package/dist/cli/project-trust.d.ts.map +1 -0
  37. package/dist/cli/project-trust.js +48 -0
  38. package/dist/cli/project-trust.js.map +1 -0
  39. package/dist/cli/session-picker.d.ts +10 -0
  40. package/dist/cli/session-picker.d.ts.map +1 -0
  41. package/dist/cli/session-picker.js +36 -0
  42. package/dist/cli/session-picker.js.map +1 -0
  43. package/dist/cli/startup-ui.d.ts +20 -0
  44. package/dist/cli/startup-ui.d.ts.map +1 -0
  45. package/dist/cli/startup-ui.js +184 -0
  46. package/dist/cli/startup-ui.js.map +1 -0
  47. package/dist/cli.d.ts +3 -0
  48. package/dist/cli.d.ts.map +1 -0
  49. package/dist/cli.js +18 -0
  50. package/dist/cli.js.map +1 -0
  51. package/dist/config.d.ts +96 -0
  52. package/dist/config.d.ts.map +1 -0
  53. package/dist/config.js +455 -0
  54. package/dist/config.js.map +1 -0
  55. package/dist/core/agent-session-runtime.d.ts +119 -0
  56. package/dist/core/agent-session-runtime.d.ts.map +1 -0
  57. package/dist/core/agent-session-runtime.js +306 -0
  58. package/dist/core/agent-session-runtime.js.map +1 -0
  59. package/dist/core/agent-session-services.d.ts +85 -0
  60. package/dist/core/agent-session-services.d.ts.map +1 -0
  61. package/dist/core/agent-session-services.js +133 -0
  62. package/dist/core/agent-session-services.js.map +1 -0
  63. package/dist/core/agent-session.d.ts +642 -0
  64. package/dist/core/agent-session.d.ts.map +1 -0
  65. package/dist/core/agent-session.js +2679 -0
  66. package/dist/core/agent-session.js.map +1 -0
  67. package/dist/core/auth-guidance.d.ts +5 -0
  68. package/dist/core/auth-guidance.d.ts.map +1 -0
  69. package/dist/core/auth-guidance.js +21 -0
  70. package/dist/core/auth-guidance.js.map +1 -0
  71. package/dist/core/auth-storage.d.ts +56 -0
  72. package/dist/core/auth-storage.d.ts.map +1 -0
  73. package/dist/core/auth-storage.js +229 -0
  74. package/dist/core/auth-storage.js.map +1 -0
  75. package/dist/core/bash-executor.d.ts +32 -0
  76. package/dist/core/bash-executor.d.ts.map +1 -0
  77. package/dist/core/bash-executor.js +111 -0
  78. package/dist/core/bash-executor.js.map +1 -0
  79. package/dist/core/cache-stats.d.ts +49 -0
  80. package/dist/core/cache-stats.d.ts.map +1 -0
  81. package/dist/core/cache-stats.js +101 -0
  82. package/dist/core/cache-stats.js.map +1 -0
  83. package/dist/core/compaction/branch-summarization.d.ts +98 -0
  84. package/dist/core/compaction/branch-summarization.d.ts.map +1 -0
  85. package/dist/core/compaction/branch-summarization.js +246 -0
  86. package/dist/core/compaction/branch-summarization.js.map +1 -0
  87. package/dist/core/compaction/compaction.d.ts +137 -0
  88. package/dist/core/compaction/compaction.d.ts.map +1 -0
  89. package/dist/core/compaction/compaction.js +637 -0
  90. package/dist/core/compaction/compaction.js.map +1 -0
  91. package/dist/core/compaction/index.d.ts +7 -0
  92. package/dist/core/compaction/index.d.ts.map +1 -0
  93. package/dist/core/compaction/index.js +7 -0
  94. package/dist/core/compaction/index.js.map +1 -0
  95. package/dist/core/compaction/utils.d.ts +38 -0
  96. package/dist/core/compaction/utils.d.ts.map +1 -0
  97. package/dist/core/compaction/utils.js +142 -0
  98. package/dist/core/compaction/utils.js.map +1 -0
  99. package/dist/core/defaults.d.ts +3 -0
  100. package/dist/core/defaults.d.ts.map +1 -0
  101. package/dist/core/defaults.js +2 -0
  102. package/dist/core/defaults.js.map +1 -0
  103. package/dist/core/diagnostics.d.ts +15 -0
  104. package/dist/core/diagnostics.d.ts.map +1 -0
  105. package/dist/core/diagnostics.js +2 -0
  106. package/dist/core/diagnostics.js.map +1 -0
  107. package/dist/core/event-bus.d.ts +9 -0
  108. package/dist/core/event-bus.d.ts.map +1 -0
  109. package/dist/core/event-bus.js +25 -0
  110. package/dist/core/event-bus.js.map +1 -0
  111. package/dist/core/exec.d.ts +29 -0
  112. package/dist/core/exec.d.ts.map +1 -0
  113. package/dist/core/exec.js +75 -0
  114. package/dist/core/exec.js.map +1 -0
  115. package/dist/core/experimental.d.ts +2 -0
  116. package/dist/core/experimental.d.ts.map +1 -0
  117. package/dist/core/experimental.js +4 -0
  118. package/dist/core/experimental.js.map +1 -0
  119. package/dist/core/export-html/ansi-to-html.d.ts +22 -0
  120. package/dist/core/export-html/ansi-to-html.d.ts.map +1 -0
  121. package/dist/core/export-html/ansi-to-html.js +249 -0
  122. package/dist/core/export-html/ansi-to-html.js.map +1 -0
  123. package/dist/core/export-html/index.d.ts +37 -0
  124. package/dist/core/export-html/index.d.ts.map +1 -0
  125. package/dist/core/export-html/index.js +226 -0
  126. package/dist/core/export-html/index.js.map +1 -0
  127. package/dist/core/export-html/template.css +1066 -0
  128. package/dist/core/export-html/template.html +55 -0
  129. package/dist/core/export-html/template.js +1864 -0
  130. package/dist/core/export-html/tool-renderer.d.ts +34 -0
  131. package/dist/core/export-html/tool-renderer.d.ts.map +1 -0
  132. package/dist/core/export-html/tool-renderer.js +108 -0
  133. package/dist/core/export-html/tool-renderer.js.map +1 -0
  134. package/dist/core/export-html/vendor/highlight.min.js +1213 -0
  135. package/dist/core/export-html/vendor/marked.min.js +78 -0
  136. package/dist/core/extensions/index.d.ts +12 -0
  137. package/dist/core/extensions/index.d.ts.map +1 -0
  138. package/dist/core/extensions/index.js +9 -0
  139. package/dist/core/extensions/index.js.map +1 -0
  140. package/dist/core/extensions/loader.d.ts +23 -0
  141. package/dist/core/extensions/loader.d.ts.map +1 -0
  142. package/dist/core/extensions/loader.js +558 -0
  143. package/dist/core/extensions/loader.js.map +1 -0
  144. package/dist/core/extensions/runner.d.ts +171 -0
  145. package/dist/core/extensions/runner.d.ts.map +1 -0
  146. package/dist/core/extensions/runner.js +953 -0
  147. package/dist/core/extensions/runner.js.map +1 -0
  148. package/dist/core/extensions/types.d.ts +1259 -0
  149. package/dist/core/extensions/types.d.ts.map +1 -0
  150. package/dist/core/extensions/types.js +45 -0
  151. package/dist/core/extensions/types.js.map +1 -0
  152. package/dist/core/extensions/wrapper.d.ts +20 -0
  153. package/dist/core/extensions/wrapper.d.ts.map +1 -0
  154. package/dist/core/extensions/wrapper.js +41 -0
  155. package/dist/core/extensions/wrapper.js.map +1 -0
  156. package/dist/core/footer-data-provider.d.ts +54 -0
  157. package/dist/core/footer-data-provider.d.ts.map +1 -0
  158. package/dist/core/footer-data-provider.js +338 -0
  159. package/dist/core/footer-data-provider.js.map +1 -0
  160. package/dist/core/http-dispatcher.d.ts +22 -0
  161. package/dist/core/http-dispatcher.d.ts.map +1 -0
  162. package/dist/core/http-dispatcher.js +91 -0
  163. package/dist/core/http-dispatcher.js.map +1 -0
  164. package/dist/core/index.d.ts +13 -0
  165. package/dist/core/index.d.ts.map +1 -0
  166. package/dist/core/index.js +13 -0
  167. package/dist/core/index.js.map +1 -0
  168. package/dist/core/keybindings.d.ts +363 -0
  169. package/dist/core/keybindings.d.ts.map +1 -0
  170. package/dist/core/keybindings.js +300 -0
  171. package/dist/core/keybindings.js.map +1 -0
  172. package/dist/core/messages.d.ts +77 -0
  173. package/dist/core/messages.d.ts.map +1 -0
  174. package/dist/core/messages.js +123 -0
  175. package/dist/core/messages.js.map +1 -0
  176. package/dist/core/model-config.d.ts +512 -0
  177. package/dist/core/model-config.d.ts.map +1 -0
  178. package/dist/core/model-config.js +243 -0
  179. package/dist/core/model-config.js.map +1 -0
  180. package/dist/core/model-registry.d.ts +43 -0
  181. package/dist/core/model-registry.d.ts.map +1 -0
  182. package/dist/core/model-registry.js +104 -0
  183. package/dist/core/model-registry.js.map +1 -0
  184. package/dist/core/model-resolver.d.ts +121 -0
  185. package/dist/core/model-resolver.d.ts.map +1 -0
  186. package/dist/core/model-resolver.js +534 -0
  187. package/dist/core/model-resolver.js.map +1 -0
  188. package/dist/core/model-runtime.d.ts +82 -0
  189. package/dist/core/model-runtime.d.ts.map +1 -0
  190. package/dist/core/model-runtime.js +441 -0
  191. package/dist/core/model-runtime.js.map +1 -0
  192. package/dist/core/models-store.d.ts +17 -0
  193. package/dist/core/models-store.d.ts.map +1 -0
  194. package/dist/core/models-store.js +45 -0
  195. package/dist/core/models-store.js.map +1 -0
  196. package/dist/core/output-guard.d.ts +7 -0
  197. package/dist/core/output-guard.d.ts.map +1 -0
  198. package/dist/core/output-guard.js +89 -0
  199. package/dist/core/output-guard.js.map +1 -0
  200. package/dist/core/package-manager.d.ts +210 -0
  201. package/dist/core/package-manager.d.ts.map +1 -0
  202. package/dist/core/package-manager.js +2135 -0
  203. package/dist/core/package-manager.js.map +1 -0
  204. package/dist/core/project-trust.d.ts +15 -0
  205. package/dist/core/project-trust.d.ts.map +1 -0
  206. package/dist/core/project-trust.js +59 -0
  207. package/dist/core/project-trust.js.map +1 -0
  208. package/dist/core/prompt-templates.d.ts +54 -0
  209. package/dist/core/prompt-templates.d.ts.map +1 -0
  210. package/dist/core/prompt-templates.js +236 -0
  211. package/dist/core/prompt-templates.js.map +1 -0
  212. package/dist/core/provider-attribution.d.ts +4 -0
  213. package/dist/core/provider-attribution.d.ts.map +1 -0
  214. package/dist/core/provider-attribution.js +72 -0
  215. package/dist/core/provider-attribution.js.map +1 -0
  216. package/dist/core/provider-composer.d.ts +55 -0
  217. package/dist/core/provider-composer.d.ts.map +1 -0
  218. package/dist/core/provider-composer.js +375 -0
  219. package/dist/core/provider-composer.js.map +1 -0
  220. package/dist/core/radius.d.ts +2 -0
  221. package/dist/core/radius.d.ts.map +1 -0
  222. package/dist/core/radius.js +2 -0
  223. package/dist/core/radius.js.map +1 -0
  224. package/dist/core/remote-catalog-provider.d.ts +5 -0
  225. package/dist/core/remote-catalog-provider.d.ts.map +1 -0
  226. package/dist/core/remote-catalog-provider.js +102 -0
  227. package/dist/core/remote-catalog-provider.js.map +1 -0
  228. package/dist/core/resolve-config-value.d.ts +30 -0
  229. package/dist/core/resolve-config-value.d.ts.map +1 -0
  230. package/dist/core/resolve-config-value.js +247 -0
  231. package/dist/core/resolve-config-value.js.map +1 -0
  232. package/dist/core/resource-loader.d.ts +206 -0
  233. package/dist/core/resource-loader.d.ts.map +1 -0
  234. package/dist/core/resource-loader.js +817 -0
  235. package/dist/core/resource-loader.js.map +1 -0
  236. package/dist/core/runtime-credentials.d.ts +15 -0
  237. package/dist/core/runtime-credentials.d.ts.map +1 -0
  238. package/dist/core/runtime-credentials.js +36 -0
  239. package/dist/core/runtime-credentials.js.map +1 -0
  240. package/dist/core/sdk.d.ts +106 -0
  241. package/dist/core/sdk.d.ts.map +1 -0
  242. package/dist/core/sdk.js +267 -0
  243. package/dist/core/sdk.js.map +1 -0
  244. package/dist/core/session-cwd.d.ts +19 -0
  245. package/dist/core/session-cwd.d.ts.map +1 -0
  246. package/dist/core/session-cwd.js +38 -0
  247. package/dist/core/session-cwd.js.map +1 -0
  248. package/dist/core/session-manager.d.ts +356 -0
  249. package/dist/core/session-manager.d.ts.map +1 -0
  250. package/dist/core/session-manager.js +1338 -0
  251. package/dist/core/session-manager.js.map +1 -0
  252. package/dist/core/settings-manager.d.ts +297 -0
  253. package/dist/core/settings-manager.d.ts.map +1 -0
  254. package/dist/core/settings-manager.js +902 -0
  255. package/dist/core/settings-manager.js.map +1 -0
  256. package/dist/core/skills.d.ts +60 -0
  257. package/dist/core/skills.d.ts.map +1 -0
  258. package/dist/core/skills.js +387 -0
  259. package/dist/core/skills.js.map +1 -0
  260. package/dist/core/slash-commands.d.ts +15 -0
  261. package/dist/core/slash-commands.d.ts.map +1 -0
  262. package/dist/core/slash-commands.js +26 -0
  263. package/dist/core/slash-commands.js.map +1 -0
  264. package/dist/core/source-info.d.ts +18 -0
  265. package/dist/core/source-info.d.ts.map +1 -0
  266. package/dist/core/source-info.js +19 -0
  267. package/dist/core/source-info.js.map +1 -0
  268. package/dist/core/system-prompt.d.ts +28 -0
  269. package/dist/core/system-prompt.d.ts.map +1 -0
  270. package/dist/core/system-prompt.js +110 -0
  271. package/dist/core/system-prompt.js.map +1 -0
  272. package/dist/core/telemetry.d.ts +3 -0
  273. package/dist/core/telemetry.d.ts.map +1 -0
  274. package/dist/core/telemetry.js +9 -0
  275. package/dist/core/telemetry.js.map +1 -0
  276. package/dist/core/timings.d.ts +10 -0
  277. package/dist/core/timings.d.ts.map +1 -0
  278. package/dist/core/timings.js +41 -0
  279. package/dist/core/timings.js.map +1 -0
  280. package/dist/core/tools/bash.d.ts +68 -0
  281. package/dist/core/tools/bash.d.ts.map +1 -0
  282. package/dist/core/tools/bash.js +361 -0
  283. package/dist/core/tools/bash.js.map +1 -0
  284. package/dist/core/tools/edit-diff.d.ts +106 -0
  285. package/dist/core/tools/edit-diff.d.ts.map +1 -0
  286. package/dist/core/tools/edit-diff.js +424 -0
  287. package/dist/core/tools/edit-diff.js.map +1 -0
  288. package/dist/core/tools/edit.d.ts +50 -0
  289. package/dist/core/tools/edit.d.ts.map +1 -0
  290. package/dist/core/tools/edit.js +261 -0
  291. package/dist/core/tools/edit.js.map +1 -0
  292. package/dist/core/tools/file-mutation-queue.d.ts +6 -0
  293. package/dist/core/tools/file-mutation-queue.d.ts.map +1 -0
  294. package/dist/core/tools/file-mutation-queue.js +52 -0
  295. package/dist/core/tools/file-mutation-queue.js.map +1 -0
  296. package/dist/core/tools/find.d.ts +35 -0
  297. package/dist/core/tools/find.d.ts.map +1 -0
  298. package/dist/core/tools/find.js +305 -0
  299. package/dist/core/tools/find.js.map +1 -0
  300. package/dist/core/tools/grep.d.ts +37 -0
  301. package/dist/core/tools/grep.d.ts.map +1 -0
  302. package/dist/core/tools/grep.js +304 -0
  303. package/dist/core/tools/grep.js.map +1 -0
  304. package/dist/core/tools/index.d.ts +40 -0
  305. package/dist/core/tools/index.d.ts.map +1 -0
  306. package/dist/core/tools/index.js +112 -0
  307. package/dist/core/tools/index.js.map +1 -0
  308. package/dist/core/tools/ls.d.ts +37 -0
  309. package/dist/core/tools/ls.d.ts.map +1 -0
  310. package/dist/core/tools/ls.js +167 -0
  311. package/dist/core/tools/ls.js.map +1 -0
  312. package/dist/core/tools/output-accumulator.d.ts +52 -0
  313. package/dist/core/tools/output-accumulator.d.ts.map +1 -0
  314. package/dist/core/tools/output-accumulator.js +184 -0
  315. package/dist/core/tools/output-accumulator.js.map +1 -0
  316. package/dist/core/tools/path-utils.d.ts +10 -0
  317. package/dist/core/tools/path-utils.d.ts.map +1 -0
  318. package/dist/core/tools/path-utils.js +99 -0
  319. package/dist/core/tools/path-utils.js.map +1 -0
  320. package/dist/core/tools/read.d.ts +35 -0
  321. package/dist/core/tools/read.d.ts.map +1 -0
  322. package/dist/core/tools/read.js +276 -0
  323. package/dist/core/tools/read.js.map +1 -0
  324. package/dist/core/tools/render-utils.d.ts +24 -0
  325. package/dist/core/tools/render-utils.d.ts.map +1 -0
  326. package/dist/core/tools/render-utils.js +65 -0
  327. package/dist/core/tools/render-utils.js.map +1 -0
  328. package/dist/core/tools/tool-definition-wrapper.d.ts +14 -0
  329. package/dist/core/tools/tool-definition-wrapper.d.ts.map +1 -0
  330. package/dist/core/tools/tool-definition-wrapper.js +34 -0
  331. package/dist/core/tools/tool-definition-wrapper.js.map +1 -0
  332. package/dist/core/tools/truncate.d.ts +70 -0
  333. package/dist/core/tools/truncate.d.ts.map +1 -0
  334. package/dist/core/tools/truncate.js +215 -0
  335. package/dist/core/tools/truncate.js.map +1 -0
  336. package/dist/core/tools/write.d.ts +26 -0
  337. package/dist/core/tools/write.d.ts.map +1 -0
  338. package/dist/core/tools/write.js +197 -0
  339. package/dist/core/tools/write.js.map +1 -0
  340. package/dist/core/trust-manager.d.ts +36 -0
  341. package/dist/core/trust-manager.d.ts.map +1 -0
  342. package/dist/core/trust-manager.js +202 -0
  343. package/dist/core/trust-manager.js.map +1 -0
  344. package/dist/core/usage-totals.d.ts +19 -0
  345. package/dist/core/usage-totals.d.ts.map +1 -0
  346. package/dist/core/usage-totals.js +52 -0
  347. package/dist/core/usage-totals.js.map +1 -0
  348. package/dist/extensions/deepwiki/client.d.ts +14 -0
  349. package/dist/extensions/deepwiki/client.d.ts.map +1 -0
  350. package/dist/extensions/deepwiki/client.js +196 -0
  351. package/dist/extensions/deepwiki/client.js.map +1 -0
  352. package/dist/extensions/deepwiki/constants.d.ts +13 -0
  353. package/dist/extensions/deepwiki/constants.d.ts.map +1 -0
  354. package/dist/extensions/deepwiki/constants.js +18 -0
  355. package/dist/extensions/deepwiki/constants.js.map +1 -0
  356. package/dist/extensions/deepwiki/contents.d.ts +63 -0
  357. package/dist/extensions/deepwiki/contents.d.ts.map +1 -0
  358. package/dist/extensions/deepwiki/contents.js +174 -0
  359. package/dist/extensions/deepwiki/contents.js.map +1 -0
  360. package/dist/extensions/deepwiki/execute.d.ts +25 -0
  361. package/dist/extensions/deepwiki/execute.d.ts.map +1 -0
  362. package/dist/extensions/deepwiki/execute.js +78 -0
  363. package/dist/extensions/deepwiki/execute.js.map +1 -0
  364. package/dist/extensions/deepwiki/http.d.ts +12 -0
  365. package/dist/extensions/deepwiki/http.d.ts.map +1 -0
  366. package/dist/extensions/deepwiki/http.js +74 -0
  367. package/dist/extensions/deepwiki/http.js.map +1 -0
  368. package/dist/extensions/deepwiki/index.d.ts +9 -0
  369. package/dist/extensions/deepwiki/index.d.ts.map +1 -0
  370. package/dist/extensions/deepwiki/index.js +25 -0
  371. package/dist/extensions/deepwiki/index.js.map +1 -0
  372. package/dist/extensions/deepwiki/render.d.ts +14 -0
  373. package/dist/extensions/deepwiki/render.d.ts.map +1 -0
  374. package/dist/extensions/deepwiki/render.js +166 -0
  375. package/dist/extensions/deepwiki/render.js.map +1 -0
  376. package/dist/extensions/deepwiki/schema.d.ts +13 -0
  377. package/dist/extensions/deepwiki/schema.d.ts.map +1 -0
  378. package/dist/extensions/deepwiki/schema.js +208 -0
  379. package/dist/extensions/deepwiki/schema.js.map +1 -0
  380. package/dist/extensions/index.d.ts +3 -0
  381. package/dist/extensions/index.d.ts.map +1 -0
  382. package/dist/extensions/index.js +17 -0
  383. package/dist/extensions/index.js.map +1 -0
  384. package/dist/extensions/llama/client.d.ts +61 -0
  385. package/dist/extensions/llama/client.d.ts.map +1 -0
  386. package/dist/extensions/llama/client.js +302 -0
  387. package/dist/extensions/llama/client.js.map +1 -0
  388. package/dist/extensions/llama/huggingface.d.ts +23 -0
  389. package/dist/extensions/llama/huggingface.d.ts.map +1 -0
  390. package/dist/extensions/llama/huggingface.js +141 -0
  391. package/dist/extensions/llama/huggingface.js.map +1 -0
  392. package/dist/extensions/llama/index.d.ts +3 -0
  393. package/dist/extensions/llama/index.d.ts.map +1 -0
  394. package/dist/extensions/llama/index.js +208 -0
  395. package/dist/extensions/llama/index.js.map +1 -0
  396. package/dist/extensions/llama/provider.d.ts +10 -0
  397. package/dist/extensions/llama/provider.d.ts.map +1 -0
  398. package/dist/extensions/llama/provider.js +102 -0
  399. package/dist/extensions/llama/provider.js.map +1 -0
  400. package/dist/extensions/llama/ui.d.ts +42 -0
  401. package/dist/extensions/llama/ui.d.ts.map +1 -0
  402. package/dist/extensions/llama/ui.js +416 -0
  403. package/dist/extensions/llama/ui.js.map +1 -0
  404. package/dist/extensions/question/constants.d.ts +13 -0
  405. package/dist/extensions/question/constants.d.ts.map +1 -0
  406. package/dist/extensions/question/constants.js +17 -0
  407. package/dist/extensions/question/constants.js.map +1 -0
  408. package/dist/extensions/question/dialog-primitives.d.ts +6 -0
  409. package/dist/extensions/question/dialog-primitives.d.ts.map +1 -0
  410. package/dist/extensions/question/dialog-primitives.js +20 -0
  411. package/dist/extensions/question/dialog-primitives.js.map +1 -0
  412. package/dist/extensions/question/dialog.d.ts +10 -0
  413. package/dist/extensions/question/dialog.d.ts.map +1 -0
  414. package/dist/extensions/question/dialog.js +519 -0
  415. package/dist/extensions/question/dialog.js.map +1 -0
  416. package/dist/extensions/question/index.d.ts +9 -0
  417. package/dist/extensions/question/index.d.ts.map +1 -0
  418. package/dist/extensions/question/index.js +32 -0
  419. package/dist/extensions/question/index.js.map +1 -0
  420. package/dist/extensions/question/limits.d.ts +11 -0
  421. package/dist/extensions/question/limits.d.ts.map +1 -0
  422. package/dist/extensions/question/limits.js +11 -0
  423. package/dist/extensions/question/limits.js.map +1 -0
  424. package/dist/extensions/question/render-cache.d.ts +9 -0
  425. package/dist/extensions/question/render-cache.d.ts.map +1 -0
  426. package/dist/extensions/question/render-cache.js +18 -0
  427. package/dist/extensions/question/render-cache.js.map +1 -0
  428. package/dist/extensions/question/render.d.ts +17 -0
  429. package/dist/extensions/question/render.d.ts.map +1 -0
  430. package/dist/extensions/question/render.js +47 -0
  431. package/dist/extensions/question/render.js.map +1 -0
  432. package/dist/extensions/question/results.d.ts +8 -0
  433. package/dist/extensions/question/results.d.ts.map +1 -0
  434. package/dist/extensions/question/results.js +68 -0
  435. package/dist/extensions/question/results.js.map +1 -0
  436. package/dist/extensions/question/schema.d.ts +22 -0
  437. package/dist/extensions/question/schema.d.ts.map +1 -0
  438. package/dist/extensions/question/schema.js +98 -0
  439. package/dist/extensions/question/schema.js.map +1 -0
  440. package/dist/extensions/question/state.d.ts +9 -0
  441. package/dist/extensions/question/state.d.ts.map +1 -0
  442. package/dist/extensions/question/state.js +76 -0
  443. package/dist/extensions/question/state.js.map +1 -0
  444. package/dist/extensions/question/types.d.ts +60 -0
  445. package/dist/extensions/question/types.d.ts.map +1 -0
  446. package/dist/extensions/question/types.js +2 -0
  447. package/dist/extensions/question/types.js.map +1 -0
  448. package/dist/extensions/rewind/config.d.ts +16 -0
  449. package/dist/extensions/rewind/config.d.ts.map +1 -0
  450. package/dist/extensions/rewind/config.js +69 -0
  451. package/dist/extensions/rewind/config.js.map +1 -0
  452. package/dist/extensions/rewind/engine.d.ts +97 -0
  453. package/dist/extensions/rewind/engine.d.ts.map +1 -0
  454. package/dist/extensions/rewind/engine.js +747 -0
  455. package/dist/extensions/rewind/engine.js.map +1 -0
  456. package/dist/extensions/rewind/gc.d.ts +35 -0
  457. package/dist/extensions/rewind/gc.d.ts.map +1 -0
  458. package/dist/extensions/rewind/gc.js +169 -0
  459. package/dist/extensions/rewind/gc.js.map +1 -0
  460. package/dist/extensions/rewind/index.d.ts +3 -0
  461. package/dist/extensions/rewind/index.d.ts.map +1 -0
  462. package/dist/extensions/rewind/index.js +253 -0
  463. package/dist/extensions/rewind/index.js.map +1 -0
  464. package/dist/extensions/rewind/menu.d.ts +13 -0
  465. package/dist/extensions/rewind/menu.d.ts.map +1 -0
  466. package/dist/extensions/rewind/menu.js +118 -0
  467. package/dist/extensions/rewind/menu.js.map +1 -0
  468. package/dist/extensions/rewind/paths.d.ts +4 -0
  469. package/dist/extensions/rewind/paths.d.ts.map +1 -0
  470. package/dist/extensions/rewind/paths.js +15 -0
  471. package/dist/extensions/rewind/paths.js.map +1 -0
  472. package/dist/extensions/rewind/restore.d.ts +37 -0
  473. package/dist/extensions/rewind/restore.d.ts.map +1 -0
  474. package/dist/extensions/rewind/restore.js +52 -0
  475. package/dist/extensions/rewind/restore.js.map +1 -0
  476. package/dist/extensions/rewind/snapshot.d.ts +45 -0
  477. package/dist/extensions/rewind/snapshot.d.ts.map +1 -0
  478. package/dist/extensions/rewind/snapshot.js +21 -0
  479. package/dist/extensions/rewind/snapshot.js.map +1 -0
  480. package/dist/extensions/rewind/storage.d.ts +12 -0
  481. package/dist/extensions/rewind/storage.d.ts.map +1 -0
  482. package/dist/extensions/rewind/storage.js +33 -0
  483. package/dist/extensions/rewind/storage.js.map +1 -0
  484. package/dist/extensions/rewind/text.d.ts +7 -0
  485. package/dist/extensions/rewind/text.d.ts.map +1 -0
  486. package/dist/extensions/rewind/text.js +19 -0
  487. package/dist/extensions/rewind/text.js.map +1 -0
  488. package/dist/extensions/rewind/tool-path.d.ts +3 -0
  489. package/dist/extensions/rewind/tool-path.d.ts.map +1 -0
  490. package/dist/extensions/rewind/tool-path.js +9 -0
  491. package/dist/extensions/rewind/tool-path.js.map +1 -0
  492. package/dist/extensions/router/constants.d.ts +20 -0
  493. package/dist/extensions/router/constants.d.ts.map +1 -0
  494. package/dist/extensions/router/constants.js +27 -0
  495. package/dist/extensions/router/constants.js.map +1 -0
  496. package/dist/extensions/router/dialog.d.ts +38 -0
  497. package/dist/extensions/router/dialog.d.ts.map +1 -0
  498. package/dist/extensions/router/dialog.js +407 -0
  499. package/dist/extensions/router/dialog.js.map +1 -0
  500. package/dist/extensions/router/index.d.ts +15 -0
  501. package/dist/extensions/router/index.d.ts.map +1 -0
  502. package/dist/extensions/router/index.js +61 -0
  503. package/dist/extensions/router/index.js.map +1 -0
  504. package/dist/extensions/router/presets.d.ts +48 -0
  505. package/dist/extensions/router/presets.d.ts.map +1 -0
  506. package/dist/extensions/router/presets.js +109 -0
  507. package/dist/extensions/router/presets.js.map +1 -0
  508. package/dist/extensions/router/probe.d.ts +20 -0
  509. package/dist/extensions/router/probe.d.ts.map +1 -0
  510. package/dist/extensions/router/probe.js +125 -0
  511. package/dist/extensions/router/probe.js.map +1 -0
  512. package/dist/extensions/router/register.d.ts +34 -0
  513. package/dist/extensions/router/register.d.ts.map +1 -0
  514. package/dist/extensions/router/register.js +81 -0
  515. package/dist/extensions/router/register.js.map +1 -0
  516. package/dist/extensions/router/store.d.ts +12 -0
  517. package/dist/extensions/router/store.d.ts.map +1 -0
  518. package/dist/extensions/router/store.js +164 -0
  519. package/dist/extensions/router/store.js.map +1 -0
  520. package/dist/extensions/router/stream.d.ts +16 -0
  521. package/dist/extensions/router/stream.d.ts.map +1 -0
  522. package/dist/extensions/router/stream.js +198 -0
  523. package/dist/extensions/router/stream.js.map +1 -0
  524. package/dist/extensions/router/types.d.ts +23 -0
  525. package/dist/extensions/router/types.d.ts.map +1 -0
  526. package/dist/extensions/router/types.js +2 -0
  527. package/dist/extensions/router/types.js.map +1 -0
  528. package/dist/extensions/router/ui.d.ts +9 -0
  529. package/dist/extensions/router/ui.d.ts.map +1 -0
  530. package/dist/extensions/router/ui.js +538 -0
  531. package/dist/extensions/router/ui.js.map +1 -0
  532. package/dist/extensions/statusline/index.d.ts +3 -0
  533. package/dist/extensions/statusline/index.d.ts.map +1 -0
  534. package/dist/extensions/statusline/index.js +367 -0
  535. package/dist/extensions/statusline/index.js.map +1 -0
  536. package/dist/extensions/todo/constants.d.ts +16 -0
  537. package/dist/extensions/todo/constants.d.ts.map +1 -0
  538. package/dist/extensions/todo/constants.js +20 -0
  539. package/dist/extensions/todo/constants.js.map +1 -0
  540. package/dist/extensions/todo/index.d.ts +17 -0
  541. package/dist/extensions/todo/index.d.ts.map +1 -0
  542. package/dist/extensions/todo/index.js +83 -0
  543. package/dist/extensions/todo/index.js.map +1 -0
  544. package/dist/extensions/todo/overlay.d.ts +24 -0
  545. package/dist/extensions/todo/overlay.d.ts.map +1 -0
  546. package/dist/extensions/todo/overlay.js +139 -0
  547. package/dist/extensions/todo/overlay.js.map +1 -0
  548. package/dist/extensions/todo/schema.d.ts +41 -0
  549. package/dist/extensions/todo/schema.d.ts.map +1 -0
  550. package/dist/extensions/todo/schema.js +36 -0
  551. package/dist/extensions/todo/schema.js.map +1 -0
  552. package/dist/extensions/todo/state.d.ts +57 -0
  553. package/dist/extensions/todo/state.d.ts.map +1 -0
  554. package/dist/extensions/todo/state.js +452 -0
  555. package/dist/extensions/todo/state.js.map +1 -0
  556. package/dist/extensions/todo/view.d.ts +8 -0
  557. package/dist/extensions/todo/view.d.ts.map +1 -0
  558. package/dist/extensions/todo/view.js +119 -0
  559. package/dist/extensions/todo/view.js.map +1 -0
  560. package/dist/index.d.ts +35 -0
  561. package/dist/index.d.ts.map +1 -0
  562. package/dist/index.js +47 -0
  563. package/dist/index.js.map +1 -0
  564. package/dist/main.d.ts +12 -0
  565. package/dist/main.d.ts.map +1 -0
  566. package/dist/main.js +704 -0
  567. package/dist/main.js.map +1 -0
  568. package/dist/migrations.d.ts +33 -0
  569. package/dist/migrations.d.ts.map +1 -0
  570. package/dist/migrations.js +281 -0
  571. package/dist/migrations.js.map +1 -0
  572. package/dist/modes/index.d.ts +9 -0
  573. package/dist/modes/index.d.ts.map +1 -0
  574. package/dist/modes/index.js +8 -0
  575. package/dist/modes/index.js.map +1 -0
  576. package/dist/modes/interactive/assets/clankolas.png +0 -0
  577. package/dist/modes/interactive/components/armin.d.ts +34 -0
  578. package/dist/modes/interactive/components/armin.d.ts.map +1 -0
  579. package/dist/modes/interactive/components/armin.js +333 -0
  580. package/dist/modes/interactive/components/armin.js.map +1 -0
  581. package/dist/modes/interactive/components/assistant-message.d.ts +22 -0
  582. package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -0
  583. package/dist/modes/interactive/components/assistant-message.js +141 -0
  584. package/dist/modes/interactive/components/assistant-message.js.map +1 -0
  585. package/dist/modes/interactive/components/bash-execution.d.ts +34 -0
  586. package/dist/modes/interactive/components/bash-execution.d.ts.map +1 -0
  587. package/dist/modes/interactive/components/bash-execution.js +175 -0
  588. package/dist/modes/interactive/components/bash-execution.js.map +1 -0
  589. package/dist/modes/interactive/components/bordered-loader.d.ts +16 -0
  590. package/dist/modes/interactive/components/bordered-loader.d.ts.map +1 -0
  591. package/dist/modes/interactive/components/bordered-loader.js +54 -0
  592. package/dist/modes/interactive/components/bordered-loader.js.map +1 -0
  593. package/dist/modes/interactive/components/branch-summary-message.d.ts +16 -0
  594. package/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -0
  595. package/dist/modes/interactive/components/branch-summary-message.js +44 -0
  596. package/dist/modes/interactive/components/branch-summary-message.js.map +1 -0
  597. package/dist/modes/interactive/components/compaction-summary-message.d.ts +16 -0
  598. package/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -0
  599. package/dist/modes/interactive/components/compaction-summary-message.js +45 -0
  600. package/dist/modes/interactive/components/compaction-summary-message.js.map +1 -0
  601. package/dist/modes/interactive/components/config-selector.d.ts +102 -0
  602. package/dist/modes/interactive/components/config-selector.d.ts.map +1 -0
  603. package/dist/modes/interactive/components/config-selector.js +761 -0
  604. package/dist/modes/interactive/components/config-selector.js.map +1 -0
  605. package/dist/modes/interactive/components/countdown-timer.d.ts +14 -0
  606. package/dist/modes/interactive/components/countdown-timer.d.ts.map +1 -0
  607. package/dist/modes/interactive/components/countdown-timer.js +33 -0
  608. package/dist/modes/interactive/components/countdown-timer.js.map +1 -0
  609. package/dist/modes/interactive/components/custom-editor.d.ts +21 -0
  610. package/dist/modes/interactive/components/custom-editor.d.ts.map +1 -0
  611. package/dist/modes/interactive/components/custom-editor.js +70 -0
  612. package/dist/modes/interactive/components/custom-editor.js.map +1 -0
  613. package/dist/modes/interactive/components/custom-entry.d.ts +19 -0
  614. package/dist/modes/interactive/components/custom-entry.d.ts.map +1 -0
  615. package/dist/modes/interactive/components/custom-entry.js +52 -0
  616. package/dist/modes/interactive/components/custom-entry.js.map +1 -0
  617. package/dist/modes/interactive/components/custom-message.d.ts +20 -0
  618. package/dist/modes/interactive/components/custom-message.d.ts.map +1 -0
  619. package/dist/modes/interactive/components/custom-message.js +79 -0
  620. package/dist/modes/interactive/components/custom-message.js.map +1 -0
  621. package/dist/modes/interactive/components/daxnuts.d.ts +23 -0
  622. package/dist/modes/interactive/components/daxnuts.d.ts.map +1 -0
  623. package/dist/modes/interactive/components/daxnuts.js +140 -0
  624. package/dist/modes/interactive/components/daxnuts.js.map +1 -0
  625. package/dist/modes/interactive/components/diff.d.ts +12 -0
  626. package/dist/modes/interactive/components/diff.d.ts.map +1 -0
  627. package/dist/modes/interactive/components/diff.js +133 -0
  628. package/dist/modes/interactive/components/diff.js.map +1 -0
  629. package/dist/modes/interactive/components/dynamic-border.d.ts +15 -0
  630. package/dist/modes/interactive/components/dynamic-border.d.ts.map +1 -0
  631. package/dist/modes/interactive/components/dynamic-border.js +21 -0
  632. package/dist/modes/interactive/components/dynamic-border.js.map +1 -0
  633. package/dist/modes/interactive/components/earendil-announcement.d.ts +5 -0
  634. package/dist/modes/interactive/components/earendil-announcement.d.ts.map +1 -0
  635. package/dist/modes/interactive/components/earendil-announcement.js +40 -0
  636. package/dist/modes/interactive/components/earendil-announcement.js.map +1 -0
  637. package/dist/modes/interactive/components/extension-editor.d.ts +22 -0
  638. package/dist/modes/interactive/components/extension-editor.d.ts.map +1 -0
  639. package/dist/modes/interactive/components/extension-editor.js +128 -0
  640. package/dist/modes/interactive/components/extension-editor.js.map +1 -0
  641. package/dist/modes/interactive/components/extension-input.d.ts +23 -0
  642. package/dist/modes/interactive/components/extension-input.d.ts.map +1 -0
  643. package/dist/modes/interactive/components/extension-input.js +61 -0
  644. package/dist/modes/interactive/components/extension-input.js.map +1 -0
  645. package/dist/modes/interactive/components/extension-selector.d.ts +26 -0
  646. package/dist/modes/interactive/components/extension-selector.d.ts.map +1 -0
  647. package/dist/modes/interactive/components/extension-selector.js +83 -0
  648. package/dist/modes/interactive/components/extension-selector.js.map +1 -0
  649. package/dist/modes/interactive/components/first-time-setup.d.ts +25 -0
  650. package/dist/modes/interactive/components/first-time-setup.d.ts.map +1 -0
  651. package/dist/modes/interactive/components/first-time-setup.js +103 -0
  652. package/dist/modes/interactive/components/first-time-setup.js.map +1 -0
  653. package/dist/modes/interactive/components/footer.d.ts +32 -0
  654. package/dist/modes/interactive/components/footer.d.ts.map +1 -0
  655. package/dist/modes/interactive/components/footer.js +222 -0
  656. package/dist/modes/interactive/components/footer.js.map +1 -0
  657. package/dist/modes/interactive/components/index.d.ts +34 -0
  658. package/dist/modes/interactive/components/index.d.ts.map +1 -0
  659. package/dist/modes/interactive/components/index.js +35 -0
  660. package/dist/modes/interactive/components/index.js.map +1 -0
  661. package/dist/modes/interactive/components/keybinding-hints.d.ts +13 -0
  662. package/dist/modes/interactive/components/keybinding-hints.d.ts.map +1 -0
  663. package/dist/modes/interactive/components/keybinding-hints.js +36 -0
  664. package/dist/modes/interactive/components/keybinding-hints.js.map +1 -0
  665. package/dist/modes/interactive/components/login-dialog.d.ts +52 -0
  666. package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -0
  667. package/dist/modes/interactive/components/login-dialog.js +188 -0
  668. package/dist/modes/interactive/components/login-dialog.js.map +1 -0
  669. package/dist/modes/interactive/components/model-selector.d.ts +54 -0
  670. package/dist/modes/interactive/components/model-selector.d.ts.map +1 -0
  671. package/dist/modes/interactive/components/model-selector.js +310 -0
  672. package/dist/modes/interactive/components/model-selector.js.map +1 -0
  673. package/dist/modes/interactive/components/oauth-selector.d.ts +33 -0
  674. package/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -0
  675. package/dist/modes/interactive/components/oauth-selector.js +163 -0
  676. package/dist/modes/interactive/components/oauth-selector.js.map +1 -0
  677. package/dist/modes/interactive/components/scoped-models-selector.d.ts +42 -0
  678. package/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -0
  679. package/dist/modes/interactive/components/scoped-models-selector.js +293 -0
  680. package/dist/modes/interactive/components/scoped-models-selector.js.map +1 -0
  681. package/dist/modes/interactive/components/session-selector-search.d.ts +23 -0
  682. package/dist/modes/interactive/components/session-selector-search.d.ts.map +1 -0
  683. package/dist/modes/interactive/components/session-selector-search.js +155 -0
  684. package/dist/modes/interactive/components/session-selector-search.js.map +1 -0
  685. package/dist/modes/interactive/components/session-selector.d.ts +95 -0
  686. package/dist/modes/interactive/components/session-selector.d.ts.map +1 -0
  687. package/dist/modes/interactive/components/session-selector.js +867 -0
  688. package/dist/modes/interactive/components/session-selector.js.map +1 -0
  689. package/dist/modes/interactive/components/settings-selector.d.ts +77 -0
  690. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -0
  691. package/dist/modes/interactive/components/settings-selector.js +593 -0
  692. package/dist/modes/interactive/components/settings-selector.js.map +1 -0
  693. package/dist/modes/interactive/components/show-images-selector.d.ts +10 -0
  694. package/dist/modes/interactive/components/show-images-selector.d.ts.map +1 -0
  695. package/dist/modes/interactive/components/show-images-selector.js +39 -0
  696. package/dist/modes/interactive/components/show-images-selector.js.map +1 -0
  697. package/dist/modes/interactive/components/skill-invocation-message.d.ts +17 -0
  698. package/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -0
  699. package/dist/modes/interactive/components/skill-invocation-message.js +47 -0
  700. package/dist/modes/interactive/components/skill-invocation-message.js.map +1 -0
  701. package/dist/modes/interactive/components/status-indicator.d.ts +28 -0
  702. package/dist/modes/interactive/components/status-indicator.d.ts.map +1 -0
  703. package/dist/modes/interactive/components/status-indicator.js +60 -0
  704. package/dist/modes/interactive/components/status-indicator.js.map +1 -0
  705. package/dist/modes/interactive/components/theme-selector.d.ts +11 -0
  706. package/dist/modes/interactive/components/theme-selector.d.ts.map +1 -0
  707. package/dist/modes/interactive/components/theme-selector.js +50 -0
  708. package/dist/modes/interactive/components/theme-selector.js.map +1 -0
  709. package/dist/modes/interactive/components/thinking-selector.d.ts +11 -0
  710. package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -0
  711. package/dist/modes/interactive/components/thinking-selector.js +52 -0
  712. package/dist/modes/interactive/components/thinking-selector.js.map +1 -0
  713. package/dist/modes/interactive/components/tool-execution.d.ts +62 -0
  714. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -0
  715. package/dist/modes/interactive/components/tool-execution.js +361 -0
  716. package/dist/modes/interactive/components/tool-execution.js.map +1 -0
  717. package/dist/modes/interactive/components/tree-selector.d.ts +94 -0
  718. package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -0
  719. package/dist/modes/interactive/components/tree-selector.js +1245 -0
  720. package/dist/modes/interactive/components/tree-selector.js.map +1 -0
  721. package/dist/modes/interactive/components/trust-selector.d.ts +23 -0
  722. package/dist/modes/interactive/components/trust-selector.d.ts.map +1 -0
  723. package/dist/modes/interactive/components/trust-selector.js +91 -0
  724. package/dist/modes/interactive/components/trust-selector.js.map +1 -0
  725. package/dist/modes/interactive/components/user-message-selector.d.ts +30 -0
  726. package/dist/modes/interactive/components/user-message-selector.d.ts.map +1 -0
  727. package/dist/modes/interactive/components/user-message-selector.js +114 -0
  728. package/dist/modes/interactive/components/user-message-selector.js.map +1 -0
  729. package/dist/modes/interactive/components/user-message.d.ts +14 -0
  730. package/dist/modes/interactive/components/user-message.d.ts.map +1 -0
  731. package/dist/modes/interactive/components/user-message.js +42 -0
  732. package/dist/modes/interactive/components/user-message.js.map +1 -0
  733. package/dist/modes/interactive/components/visual-truncate.d.ts +24 -0
  734. package/dist/modes/interactive/components/visual-truncate.d.ts.map +1 -0
  735. package/dist/modes/interactive/components/visual-truncate.js +33 -0
  736. package/dist/modes/interactive/components/visual-truncate.js.map +1 -0
  737. package/dist/modes/interactive/interactive-mode.d.ts +394 -0
  738. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -0
  739. package/dist/modes/interactive/interactive-mode.js +5039 -0
  740. package/dist/modes/interactive/interactive-mode.js.map +1 -0
  741. package/dist/modes/interactive/model-search.d.ts +12 -0
  742. package/dist/modes/interactive/model-search.d.ts.map +1 -0
  743. package/dist/modes/interactive/model-search.js +15 -0
  744. package/dist/modes/interactive/model-search.js.map +1 -0
  745. package/dist/modes/interactive/theme/dark.json +87 -0
  746. package/dist/modes/interactive/theme/ice-cream-dark.json +101 -0
  747. package/dist/modes/interactive/theme/ice-cream-light.json +101 -0
  748. package/dist/modes/interactive/theme/light.json +86 -0
  749. package/dist/modes/interactive/theme/theme-controller.d.ts +29 -0
  750. package/dist/modes/interactive/theme/theme-controller.d.ts.map +1 -0
  751. package/dist/modes/interactive/theme/theme-controller.js +102 -0
  752. package/dist/modes/interactive/theme/theme-controller.js.map +1 -0
  753. package/dist/modes/interactive/theme/theme-schema.json +340 -0
  754. package/dist/modes/interactive/theme/theme.d.ts +120 -0
  755. package/dist/modes/interactive/theme/theme.d.ts.map +1 -0
  756. package/dist/modes/interactive/theme/theme.js +1063 -0
  757. package/dist/modes/interactive/theme/theme.js.map +1 -0
  758. package/dist/modes/print-mode.d.ts +28 -0
  759. package/dist/modes/print-mode.d.ts.map +1 -0
  760. package/dist/modes/print-mode.js +132 -0
  761. package/dist/modes/print-mode.js.map +1 -0
  762. package/dist/modes/rpc/jsonl.d.ts +17 -0
  763. package/dist/modes/rpc/jsonl.d.ts.map +1 -0
  764. package/dist/modes/rpc/jsonl.js +49 -0
  765. package/dist/modes/rpc/jsonl.js.map +1 -0
  766. package/dist/modes/rpc/rpc-client.d.ts +246 -0
  767. package/dist/modes/rpc/rpc-client.d.ts.map +1 -0
  768. package/dist/modes/rpc/rpc-client.js +488 -0
  769. package/dist/modes/rpc/rpc-client.js.map +1 -0
  770. package/dist/modes/rpc/rpc-mode.d.ts +20 -0
  771. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -0
  772. package/dist/modes/rpc/rpc-mode.js +639 -0
  773. package/dist/modes/rpc/rpc-mode.js.map +1 -0
  774. package/dist/modes/rpc/rpc-types.d.ts +457 -0
  775. package/dist/modes/rpc/rpc-types.d.ts.map +1 -0
  776. package/dist/modes/rpc/rpc-types.js +8 -0
  777. package/dist/modes/rpc/rpc-types.js.map +1 -0
  778. package/dist/package-manager-cli.d.ts +8 -0
  779. package/dist/package-manager-cli.d.ts.map +1 -0
  780. package/dist/package-manager-cli.js +775 -0
  781. package/dist/package-manager-cli.js.map +1 -0
  782. package/dist/rpc-entry.d.ts +3 -0
  783. package/dist/rpc-entry.d.ts.map +1 -0
  784. package/dist/rpc-entry.js +10 -0
  785. package/dist/rpc-entry.js.map +1 -0
  786. package/dist/utils/ansi.d.ts +2 -0
  787. package/dist/utils/ansi.d.ts.map +1 -0
  788. package/dist/utils/ansi.js +52 -0
  789. package/dist/utils/ansi.js.map +1 -0
  790. package/dist/utils/changelog.d.ts +22 -0
  791. package/dist/utils/changelog.d.ts.map +1 -0
  792. package/dist/utils/changelog.js +165 -0
  793. package/dist/utils/changelog.js.map +1 -0
  794. package/dist/utils/child-process.d.ts +18 -0
  795. package/dist/utils/child-process.d.ts.map +1 -0
  796. package/dist/utils/child-process.js +106 -0
  797. package/dist/utils/child-process.js.map +1 -0
  798. package/dist/utils/clipboard-image.d.ts +11 -0
  799. package/dist/utils/clipboard-image.d.ts.map +1 -0
  800. package/dist/utils/clipboard-image.js +245 -0
  801. package/dist/utils/clipboard-image.js.map +1 -0
  802. package/dist/utils/clipboard-native.d.ts +11 -0
  803. package/dist/utils/clipboard-native.d.ts.map +1 -0
  804. package/dist/utils/clipboard-native.js +20 -0
  805. package/dist/utils/clipboard-native.js.map +1 -0
  806. package/dist/utils/clipboard.d.ts +4 -0
  807. package/dist/utils/clipboard.d.ts.map +1 -0
  808. package/dist/utils/clipboard.js +130 -0
  809. package/dist/utils/clipboard.js.map +1 -0
  810. package/dist/utils/deprecation.d.ts +4 -0
  811. package/dist/utils/deprecation.d.ts.map +1 -0
  812. package/dist/utils/deprecation.js +13 -0
  813. package/dist/utils/deprecation.js.map +1 -0
  814. package/dist/utils/exif-orientation.d.ts +5 -0
  815. package/dist/utils/exif-orientation.d.ts.map +1 -0
  816. package/dist/utils/exif-orientation.js +158 -0
  817. package/dist/utils/exif-orientation.js.map +1 -0
  818. package/dist/utils/frontmatter.d.ts +8 -0
  819. package/dist/utils/frontmatter.d.ts.map +1 -0
  820. package/dist/utils/frontmatter.js +26 -0
  821. package/dist/utils/frontmatter.js.map +1 -0
  822. package/dist/utils/fs-watch.d.ts +5 -0
  823. package/dist/utils/fs-watch.d.ts.map +1 -0
  824. package/dist/utils/fs-watch.js +25 -0
  825. package/dist/utils/fs-watch.js.map +1 -0
  826. package/dist/utils/git.d.ts +26 -0
  827. package/dist/utils/git.d.ts.map +1 -0
  828. package/dist/utils/git.js +195 -0
  829. package/dist/utils/git.js.map +1 -0
  830. package/dist/utils/html.d.ts +7 -0
  831. package/dist/utils/html.d.ts.map +1 -0
  832. package/dist/utils/html.js +40 -0
  833. package/dist/utils/html.js.map +1 -0
  834. package/dist/utils/image-convert.d.ts +10 -0
  835. package/dist/utils/image-convert.d.ts.map +1 -0
  836. package/dist/utils/image-convert.js +45 -0
  837. package/dist/utils/image-convert.js.map +1 -0
  838. package/dist/utils/image-process.d.ts +18 -0
  839. package/dist/utils/image-process.d.ts.map +1 -0
  840. package/dist/utils/image-process.js +83 -0
  841. package/dist/utils/image-process.js.map +1 -0
  842. package/dist/utils/image-resize-core.d.ts +30 -0
  843. package/dist/utils/image-resize-core.d.ts.map +1 -0
  844. package/dist/utils/image-resize-core.js +124 -0
  845. package/dist/utils/image-resize-core.js.map +1 -0
  846. package/dist/utils/image-resize-worker.d.ts +2 -0
  847. package/dist/utils/image-resize-worker.d.ts.map +1 -0
  848. package/dist/utils/image-resize-worker.js +31 -0
  849. package/dist/utils/image-resize-worker.js.map +1 -0
  850. package/dist/utils/image-resize.d.ts +16 -0
  851. package/dist/utils/image-resize.d.ts.map +1 -0
  852. package/dist/utils/image-resize.js +97 -0
  853. package/dist/utils/image-resize.js.map +1 -0
  854. package/dist/utils/json.d.ts +3 -0
  855. package/dist/utils/json.d.ts.map +1 -0
  856. package/dist/utils/json.js +7 -0
  857. package/dist/utils/json.js.map +1 -0
  858. package/dist/utils/mime.d.ts +3 -0
  859. package/dist/utils/mime.d.ts.map +1 -0
  860. package/dist/utils/mime.js +110 -0
  861. package/dist/utils/mime.js.map +1 -0
  862. package/dist/utils/open-browser.d.ts +9 -0
  863. package/dist/utils/open-browser.d.ts.map +1 -0
  864. package/dist/utils/open-browser.js +22 -0
  865. package/dist/utils/open-browser.js.map +1 -0
  866. package/dist/utils/paths.d.ts +31 -0
  867. package/dist/utils/paths.d.ts.map +1 -0
  868. package/dist/utils/paths.js +92 -0
  869. package/dist/utils/paths.js.map +1 -0
  870. package/dist/utils/photon.d.ts +21 -0
  871. package/dist/utils/photon.d.ts.map +1 -0
  872. package/dist/utils/photon.js +121 -0
  873. package/dist/utils/photon.js.map +1 -0
  874. package/dist/utils/pi-user-agent.d.ts +2 -0
  875. package/dist/utils/pi-user-agent.d.ts.map +1 -0
  876. package/dist/utils/pi-user-agent.js +5 -0
  877. package/dist/utils/pi-user-agent.js.map +1 -0
  878. package/dist/utils/shell.d.ts +31 -0
  879. package/dist/utils/shell.d.ts.map +1 -0
  880. package/dist/utils/shell.js +202 -0
  881. package/dist/utils/shell.js.map +1 -0
  882. package/dist/utils/sleep.d.ts +5 -0
  883. package/dist/utils/sleep.d.ts.map +1 -0
  884. package/dist/utils/sleep.js +17 -0
  885. package/dist/utils/sleep.js.map +1 -0
  886. package/dist/utils/syntax-highlight.d.ts +12 -0
  887. package/dist/utils/syntax-highlight.d.ts.map +1 -0
  888. package/dist/utils/syntax-highlight.js +118 -0
  889. package/dist/utils/syntax-highlight.js.map +1 -0
  890. package/dist/utils/tools-manager.d.ts +3 -0
  891. package/dist/utils/tools-manager.d.ts.map +1 -0
  892. package/dist/utils/tools-manager.js +328 -0
  893. package/dist/utils/tools-manager.js.map +1 -0
  894. package/dist/utils/version-check.d.ts +15 -0
  895. package/dist/utils/version-check.d.ts.map +1 -0
  896. package/dist/utils/version-check.js +54 -0
  897. package/dist/utils/version-check.js.map +1 -0
  898. package/dist/utils/windows-self-update.d.ts +3 -0
  899. package/dist/utils/windows-self-update.d.ts.map +1 -0
  900. package/dist/utils/windows-self-update.js +77 -0
  901. package/dist/utils/windows-self-update.js.map +1 -0
  902. package/docs/compaction.md +401 -0
  903. package/docs/containerization.md +111 -0
  904. package/docs/custom-provider.md +763 -0
  905. package/docs/development.md +71 -0
  906. package/docs/docs.json +156 -0
  907. package/docs/extensions.md +2953 -0
  908. package/docs/images/doom-extension.png +0 -0
  909. package/docs/images/exy.png +0 -0
  910. package/docs/images/interactive-mode.png +0 -0
  911. package/docs/images/tree-view.png +0 -0
  912. package/docs/index.md +77 -0
  913. package/docs/json.md +86 -0
  914. package/docs/keybindings.md +198 -0
  915. package/docs/llama-cpp.md +99 -0
  916. package/docs/models.md +540 -0
  917. package/docs/packages.md +228 -0
  918. package/docs/prompt-templates.md +96 -0
  919. package/docs/providers.md +301 -0
  920. package/docs/quickstart.md +165 -0
  921. package/docs/rpc.md +1559 -0
  922. package/docs/sdk.md +1186 -0
  923. package/docs/security.md +59 -0
  924. package/docs/session-format.md +436 -0
  925. package/docs/sessions.md +145 -0
  926. package/docs/settings.md +319 -0
  927. package/docs/shell-aliases.md +13 -0
  928. package/docs/skills.md +231 -0
  929. package/docs/terminal-setup.md +142 -0
  930. package/docs/termux.md +127 -0
  931. package/docs/themes.md +301 -0
  932. package/docs/tmux.md +63 -0
  933. package/docs/tui.md +942 -0
  934. package/docs/usage.md +311 -0
  935. package/docs/windows.md +17 -0
  936. package/examples/README.md +25 -0
  937. package/examples/extensions/README.md +213 -0
  938. package/examples/extensions/auto-commit-on-exit.ts +49 -0
  939. package/examples/extensions/bash-spawn-hook.ts +30 -0
  940. package/examples/extensions/bookmark.ts +50 -0
  941. package/examples/extensions/border-status-editor.ts +145 -0
  942. package/examples/extensions/built-in-tool-renderer.ts +249 -0
  943. package/examples/extensions/claude-rules.ts +86 -0
  944. package/examples/extensions/commands.ts +72 -0
  945. package/examples/extensions/confirm-destructive.ts +59 -0
  946. package/examples/extensions/custom-compaction.ts +129 -0
  947. package/examples/extensions/custom-footer.ts +64 -0
  948. package/examples/extensions/custom-header.ts +73 -0
  949. package/examples/extensions/custom-provider-anthropic/index.ts +604 -0
  950. package/examples/extensions/custom-provider-anthropic/package-lock.json +24 -0
  951. package/examples/extensions/custom-provider-anthropic/package.json +19 -0
  952. package/examples/extensions/custom-provider-gitlab-duo/index.ts +404 -0
  953. package/examples/extensions/custom-provider-gitlab-duo/package.json +16 -0
  954. package/examples/extensions/custom-provider-gitlab-duo/test.ts +82 -0
  955. package/examples/extensions/dirty-repo-guard.ts +56 -0
  956. package/examples/extensions/doom-overlay/README.md +46 -0
  957. package/examples/extensions/doom-overlay/doom/build/doom.js +21 -0
  958. package/examples/extensions/doom-overlay/doom/build/doom.wasm +0 -0
  959. package/examples/extensions/doom-overlay/doom/build.sh +152 -0
  960. package/examples/extensions/doom-overlay/doom/doomgeneric_pi.c +72 -0
  961. package/examples/extensions/doom-overlay/doom-component.ts +132 -0
  962. package/examples/extensions/doom-overlay/doom-engine.ts +173 -0
  963. package/examples/extensions/doom-overlay/doom-keys.ts +104 -0
  964. package/examples/extensions/doom-overlay/index.ts +74 -0
  965. package/examples/extensions/doom-overlay/wad-finder.ts +51 -0
  966. package/examples/extensions/dynamic-resources/SKILL.md +8 -0
  967. package/examples/extensions/dynamic-resources/dynamic.json +79 -0
  968. package/examples/extensions/dynamic-resources/dynamic.md +5 -0
  969. package/examples/extensions/dynamic-resources/index.ts +15 -0
  970. package/examples/extensions/dynamic-tools.ts +74 -0
  971. package/examples/extensions/entry-renderer.ts +41 -0
  972. package/examples/extensions/event-bus.ts +43 -0
  973. package/examples/extensions/file-trigger.ts +41 -0
  974. package/examples/extensions/git-checkpoint.ts +53 -0
  975. package/examples/extensions/git-merge-and-resolve.ts +115 -0
  976. package/examples/extensions/github-issue-autocomplete.ts +185 -0
  977. package/examples/extensions/gondolin/index.ts +531 -0
  978. package/examples/extensions/gondolin/package-lock.json +185 -0
  979. package/examples/extensions/gondolin/package.json +19 -0
  980. package/examples/extensions/handoff.ts +191 -0
  981. package/examples/extensions/hello.ts +26 -0
  982. package/examples/extensions/hidden-thinking-label.ts +53 -0
  983. package/examples/extensions/inline-bash.ts +94 -0
  984. package/examples/extensions/input-transform-streaming.ts +39 -0
  985. package/examples/extensions/input-transform.ts +43 -0
  986. package/examples/extensions/interactive-shell.ts +196 -0
  987. package/examples/extensions/kimi-deferred-tools.ts +61 -0
  988. package/examples/extensions/mac-system-theme.ts +47 -0
  989. package/examples/extensions/message-renderer.ts +59 -0
  990. package/examples/extensions/minimal-mode.ts +426 -0
  991. package/examples/extensions/modal-editor.ts +85 -0
  992. package/examples/extensions/model-status.ts +31 -0
  993. package/examples/extensions/notify.ts +55 -0
  994. package/examples/extensions/overlay-qa-tests.ts +1450 -0
  995. package/examples/extensions/overlay-test.ts +153 -0
  996. package/examples/extensions/permission-gate.ts +34 -0
  997. package/examples/extensions/pirate.ts +47 -0
  998. package/examples/extensions/plan-mode/README.md +66 -0
  999. package/examples/extensions/plan-mode/index.ts +390 -0
  1000. package/examples/extensions/plan-mode/utils.ts +168 -0
  1001. package/examples/extensions/preset.ts +436 -0
  1002. package/examples/extensions/project-trust.ts +64 -0
  1003. package/examples/extensions/prompt-customizer.ts +97 -0
  1004. package/examples/extensions/protected-paths.ts +30 -0
  1005. package/examples/extensions/provider-payload.ts +18 -0
  1006. package/examples/extensions/qna.ts +122 -0
  1007. package/examples/extensions/question.ts +286 -0
  1008. package/examples/extensions/questionnaire.ts +448 -0
  1009. package/examples/extensions/rainbow-editor.ts +88 -0
  1010. package/examples/extensions/reload-runtime.ts +37 -0
  1011. package/examples/extensions/rpc-demo.ts +118 -0
  1012. package/examples/extensions/sandbox/index.ts +321 -0
  1013. package/examples/extensions/sandbox/package-lock.json +92 -0
  1014. package/examples/extensions/sandbox/package.json +19 -0
  1015. package/examples/extensions/send-user-message.ts +97 -0
  1016. package/examples/extensions/session-name.ts +27 -0
  1017. package/examples/extensions/shutdown-command.ts +63 -0
  1018. package/examples/extensions/snake.ts +343 -0
  1019. package/examples/extensions/space-invaders.ts +560 -0
  1020. package/examples/extensions/ssh.ts +220 -0
  1021. package/examples/extensions/status-line.ts +32 -0
  1022. package/examples/extensions/structured-output.ts +65 -0
  1023. package/examples/extensions/subagent/README.md +175 -0
  1024. package/examples/extensions/subagent/agents/planner.md +37 -0
  1025. package/examples/extensions/subagent/agents/reviewer.md +35 -0
  1026. package/examples/extensions/subagent/agents/scout.md +50 -0
  1027. package/examples/extensions/subagent/agents/worker.md +24 -0
  1028. package/examples/extensions/subagent/agents.ts +126 -0
  1029. package/examples/extensions/subagent/index.ts +1009 -0
  1030. package/examples/extensions/subagent/prompts/implement-and-review.md +10 -0
  1031. package/examples/extensions/subagent/prompts/implement.md +10 -0
  1032. package/examples/extensions/subagent/prompts/scout-and-plan.md +9 -0
  1033. package/examples/extensions/summarize.ts +207 -0
  1034. package/examples/extensions/system-prompt-header.ts +17 -0
  1035. package/examples/extensions/tic-tac-toe.ts +1008 -0
  1036. package/examples/extensions/timed-confirm.ts +70 -0
  1037. package/examples/extensions/titlebar-spinner.ts +58 -0
  1038. package/examples/extensions/todo.ts +297 -0
  1039. package/examples/extensions/tool-override.ts +144 -0
  1040. package/examples/extensions/tools.ts +146 -0
  1041. package/examples/extensions/trigger-compact.ts +50 -0
  1042. package/examples/extensions/truncated-tool.ts +195 -0
  1043. package/examples/extensions/widget-placement.ts +9 -0
  1044. package/examples/extensions/with-deps/index.ts +32 -0
  1045. package/examples/extensions/with-deps/package-lock.json +31 -0
  1046. package/examples/extensions/with-deps/package.json +22 -0
  1047. package/examples/extensions/working-indicator.ts +123 -0
  1048. package/examples/extensions/working-message-test.ts +25 -0
  1049. package/examples/rpc-extension-ui.ts +632 -0
  1050. package/examples/sdk/01-minimal.ts +26 -0
  1051. package/examples/sdk/02-custom-model.ts +50 -0
  1052. package/examples/sdk/03-custom-prompt.ts +70 -0
  1053. package/examples/sdk/04-skills.ts +55 -0
  1054. package/examples/sdk/05-tools.ts +48 -0
  1055. package/examples/sdk/06-extensions.ts +94 -0
  1056. package/examples/sdk/07-context-files.ts +42 -0
  1057. package/examples/sdk/08-prompt-templates.ts +51 -0
  1058. package/examples/sdk/09-api-keys-and-oauth.ts +34 -0
  1059. package/examples/sdk/10-settings.ts +53 -0
  1060. package/examples/sdk/11-sessions.ts +52 -0
  1061. package/examples/sdk/12-full-control.ts +72 -0
  1062. package/examples/sdk/13-session-runtime.ts +67 -0
  1063. package/examples/sdk/README.md +140 -0
  1064. package/npm-shrinkwrap.json +1824 -0
  1065. package/package.json +99 -0
@@ -0,0 +1,83 @@
1
+ import { TODO_PROMPT_GUIDELINES, TODO_PROMPT_SNIPPET, TODO_TOOL_DESCRIPTION, TODO_TOOL_LABEL, TODO_TOOL_NAME, TODOS_COMMAND_NAME, } from "./constants.js";
2
+ import { TodoOverlay } from "./overlay.js";
3
+ import { TodoParamsSchema } from "./schema.js";
4
+ import { applyTodoMutation, buildTodoDetails, commitTodoState, disposeTodoSession, formatTodoContent, getTodoState, replaceTodoState, replayTodosFromBranch, setActiveTodoSession, } from "./state.js";
5
+ import { formatCommandList } from "./view.js";
6
+ function safeReplay(ctx) {
7
+ setActiveTodoSession(ctx.sessionManager.getSessionId());
8
+ try {
9
+ replaceTodoState(replayTodosFromBranch(ctx));
10
+ }
11
+ catch (error) {
12
+ if (!/stale after session replacement/.test(String(error)))
13
+ throw error;
14
+ }
15
+ }
16
+ export default function todo(pi) {
17
+ let overlay;
18
+ pi.registerTool({
19
+ name: TODO_TOOL_NAME,
20
+ label: TODO_TOOL_LABEL,
21
+ description: TODO_TOOL_DESCRIPTION,
22
+ promptSnippet: TODO_PROMPT_SNIPPET,
23
+ promptGuidelines: TODO_PROMPT_GUIDELINES,
24
+ parameters: TodoParamsSchema,
25
+ executionMode: "sequential",
26
+ async execute(_toolCallId, params, _signal, _onUpdate, ctx) {
27
+ // Re-point the active bucket: resume//tree can switch sessions between
28
+ // lifecycle events and this call.
29
+ setActiveTodoSession(ctx.sessionManager.getSessionId());
30
+ const result = applyTodoMutation(getTodoState(), params);
31
+ if (result.operation.kind === "error") {
32
+ throw new Error(result.operation.message);
33
+ }
34
+ commitTodoState(result.state);
35
+ const text = formatTodoContent(result.operation, result.state);
36
+ return {
37
+ content: [{ type: "text", text }],
38
+ details: buildTodoDetails(params, result.state, result.operation),
39
+ };
40
+ },
41
+ });
42
+ pi.registerCommand(TODOS_COMMAND_NAME, {
43
+ description: "Show todos for the current conversation branch",
44
+ handler: async (_args, ctx) => {
45
+ if (!ctx.hasUI) {
46
+ ctx.ui.notify("/todos requires an interactive UI.", "warning");
47
+ return;
48
+ }
49
+ setActiveTodoSession(ctx.sessionManager.getSessionId());
50
+ ctx.ui.notify(formatCommandList(getTodoState()), "info");
51
+ },
52
+ });
53
+ pi.on("session_start", async (_event, ctx) => {
54
+ safeReplay(ctx);
55
+ if (ctx.hasUI) {
56
+ overlay ??= new TodoOverlay();
57
+ overlay.setUI(ctx.ui);
58
+ overlay.resetVisibility();
59
+ overlay.update();
60
+ }
61
+ });
62
+ pi.on("session_compact", async (_event, ctx) => {
63
+ safeReplay(ctx);
64
+ overlay?.resetVisibility();
65
+ overlay?.update();
66
+ });
67
+ pi.on("session_tree", async (_event, ctx) => {
68
+ safeReplay(ctx);
69
+ overlay?.resetVisibility();
70
+ overlay?.update();
71
+ });
72
+ pi.on("session_shutdown", async (_event, ctx) => {
73
+ disposeTodoSession(ctx.sessionManager.getSessionId());
74
+ overlay?.dispose();
75
+ overlay = undefined;
76
+ });
77
+ pi.on("tool_execution_end", async (event) => {
78
+ if (event.toolName !== TODO_TOOL_NAME || event.isError)
79
+ return;
80
+ overlay?.update();
81
+ });
82
+ }
83
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/extensions/todo/index.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * todo — Pi-native task tracking for multi-step work.\n *\n * The state is intentionally conversation-backed: every tool result carries a\n * full snapshot in `details`, and lifecycle handlers replay the current branch.\n * This keeps /reload, compaction, and session-tree navigation aligned with the\n * conversation without adding a separate disk database. (Compaction-safe by\n * design: sessionManager.getBranch() returns the FULL branch history including\n * pre-compaction toolResult entries — only buildSessionContext summarizes.)\n *\n * State is keyed per session id (see state.ts): resume and /tree switches can\n * change the session within one process, and execute + lifecycle handlers\n * re-point the active bucket before touching state.\n */\nimport type { AgentToolResult, ExtensionAPI, ToolExecutionMode } from \"../../core/extensions/types.ts\";\nimport {\n\tTODO_PROMPT_GUIDELINES,\n\tTODO_PROMPT_SNIPPET,\n\tTODO_TOOL_DESCRIPTION,\n\tTODO_TOOL_LABEL,\n\tTODO_TOOL_NAME,\n\tTODOS_COMMAND_NAME,\n} from \"./constants.ts\";\nimport { TodoOverlay } from \"./overlay.ts\";\nimport { type TodoDetails, TodoParamsSchema } from \"./schema.ts\";\nimport {\n\tapplyTodoMutation,\n\tbuildTodoDetails,\n\tcommitTodoState,\n\tdisposeTodoSession,\n\tformatTodoContent,\n\tgetTodoState,\n\treplaceTodoState,\n\treplayTodosFromBranch,\n\tsetActiveTodoSession,\n} from \"./state.ts\";\nimport { formatCommandList } from \"./view.ts\";\n\ninterface TodoSessionCtx {\n\tsessionManager: { getBranch(): Iterable<unknown>; getSessionId(): string };\n}\n\nfunction safeReplay(ctx: TodoSessionCtx): void {\n\tsetActiveTodoSession(ctx.sessionManager.getSessionId());\n\ttry {\n\t\treplaceTodoState(replayTodosFromBranch(ctx));\n\t} catch (error) {\n\t\tif (!/stale after session replacement/.test(String(error))) throw error;\n\t}\n}\n\nexport default function todo(pi: ExtensionAPI): void {\n\tlet overlay: TodoOverlay | undefined;\n\n\tpi.registerTool({\n\t\tname: TODO_TOOL_NAME,\n\t\tlabel: TODO_TOOL_LABEL,\n\t\tdescription: TODO_TOOL_DESCRIPTION,\n\t\tpromptSnippet: TODO_PROMPT_SNIPPET,\n\t\tpromptGuidelines: TODO_PROMPT_GUIDELINES,\n\t\tparameters: TodoParamsSchema,\n\t\texecutionMode: \"sequential\" as ToolExecutionMode,\n\n\t\tasync execute(_toolCallId, params, _signal, _onUpdate, ctx): Promise<AgentToolResult<TodoDetails>> {\n\t\t\t// Re-point the active bucket: resume//tree can switch sessions between\n\t\t\t// lifecycle events and this call.\n\t\t\tsetActiveTodoSession(ctx.sessionManager.getSessionId());\n\t\t\tconst result = applyTodoMutation(getTodoState(), params);\n\t\t\tif (result.operation.kind === \"error\") {\n\t\t\t\tthrow new Error(result.operation.message);\n\t\t\t}\n\t\t\tcommitTodoState(result.state);\n\t\t\tconst text = formatTodoContent(result.operation, result.state);\n\t\t\treturn {\n\t\t\t\tcontent: [{ type: \"text\", text }],\n\t\t\t\tdetails: buildTodoDetails(params, result.state, result.operation),\n\t\t\t};\n\t\t},\n\t});\n\n\tpi.registerCommand(TODOS_COMMAND_NAME, {\n\t\tdescription: \"Show todos for the current conversation branch\",\n\t\thandler: async (_args, ctx) => {\n\t\t\tif (!ctx.hasUI) {\n\t\t\t\tctx.ui.notify(\"/todos requires an interactive UI.\", \"warning\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tsetActiveTodoSession(ctx.sessionManager.getSessionId());\n\t\t\tctx.ui.notify(formatCommandList(getTodoState()), \"info\");\n\t\t},\n\t});\n\n\tpi.on(\"session_start\", async (_event, ctx) => {\n\t\tsafeReplay(ctx);\n\t\tif (ctx.hasUI) {\n\t\t\toverlay ??= new TodoOverlay();\n\t\t\toverlay.setUI(ctx.ui);\n\t\t\toverlay.resetVisibility();\n\t\t\toverlay.update();\n\t\t}\n\t});\n\n\tpi.on(\"session_compact\", async (_event, ctx) => {\n\t\tsafeReplay(ctx);\n\t\toverlay?.resetVisibility();\n\t\toverlay?.update();\n\t});\n\n\tpi.on(\"session_tree\", async (_event, ctx) => {\n\t\tsafeReplay(ctx);\n\t\toverlay?.resetVisibility();\n\t\toverlay?.update();\n\t});\n\n\tpi.on(\"session_shutdown\", async (_event, ctx) => {\n\t\tdisposeTodoSession(ctx.sessionManager.getSessionId());\n\t\toverlay?.dispose();\n\t\toverlay = undefined;\n\t});\n\n\tpi.on(\"tool_execution_end\", async (event) => {\n\t\tif (event.toolName !== TODO_TOOL_NAME || event.isError) return;\n\t\toverlay?.update();\n\t});\n}\n"]}
@@ -0,0 +1,24 @@
1
+ import type { ExtensionUIContext } from "../../core/extensions/types.ts";
2
+ export declare class TodoOverlay {
3
+ private ui;
4
+ private tui;
5
+ private registered;
6
+ private knownStatuses;
7
+ private completedAt;
8
+ private hiddenCompleted;
9
+ private completionHideTimer;
10
+ /** Pure render cache: same width + visibility state → skip rebuild. */
11
+ private cachedWidth;
12
+ private cachedLines;
13
+ setUI(ui: ExtensionUIContext): void;
14
+ resetVisibility(): void;
15
+ update(): void;
16
+ /** Track new completions for a short confirmation window; hide historical ones. */
17
+ private syncVisibilityFromState;
18
+ private scheduleCompletionHide;
19
+ private clearCompletionHideTimer;
20
+ private invalidateRenderCache;
21
+ private render;
22
+ dispose(): void;
23
+ }
24
+ //# sourceMappingURL=overlay.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"overlay.d.ts","sourceRoot":"","sources":["../../../src/extensions/todo/overlay.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AAUzE,qBAAa,WAAW;IACvB,OAAO,CAAC,EAAE,CAAiC;IAC3C,OAAO,CAAC,GAAG,CAAkB;IAC7B,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,aAAa,CAAiC;IACtD,OAAO,CAAC,WAAW,CAA6B;IAChD,OAAO,CAAC,eAAe,CAAqB;IAC5C,OAAO,CAAC,mBAAmB,CAA4C;IACvE,yEAAuE;IACvE,OAAO,CAAC,WAAW,CAAqB;IACxC,OAAO,CAAC,WAAW,CAAuB;IAE1C,KAAK,CAAC,EAAE,EAAE,kBAAkB,GAAG,IAAI,CAIlC;IAED,eAAe,IAAI,IAAI,CAMtB;IAED,MAAM,IAAI,IAAI,CAkCb;IAED,mFAAmF;IACnF,OAAO,CAAC,uBAAuB;IAyC/B,OAAO,CAAC,sBAAsB;IAiB9B,OAAO,CAAC,wBAAwB;IAMhC,OAAO,CAAC,qBAAqB;IAK7B,OAAO,CAAC,MAAM;IAUd,OAAO,IAAI,IAAI,CAMd;CACD","sourcesContent":["import type { TUI } from \"@earendil-works/pi-tui\";\nimport type { ExtensionUIContext } from \"../../core/extensions/types.ts\";\nimport type { Theme } from \"../../modes/interactive/theme/theme.ts\";\n\nimport type { TodoState, TodoStatus } from \"./schema.ts\";\nimport { getTodoState } from \"./state.ts\";\nimport { hasVisibleOverlayItems, renderOverlayLines } from \"./view.ts\";\n\nconst WIDGET_KEY = \"todos\";\nconst RECENT_COMPLETION_MS = 30_000;\n\nexport class TodoOverlay {\n\tprivate ui: ExtensionUIContext | undefined;\n\tprivate tui: TUI | undefined;\n\tprivate registered = false;\n\tprivate knownStatuses = new Map<number, TodoStatus>();\n\tprivate completedAt = new Map<number, number>();\n\tprivate hiddenCompleted = new Set<number>();\n\tprivate completionHideTimer: ReturnType<typeof setTimeout> | undefined;\n\t/** Pure render cache: same width + visibility state → skip rebuild. */\n\tprivate cachedWidth: number | undefined;\n\tprivate cachedLines: string[] | undefined;\n\n\tsetUI(ui: ExtensionUIContext): void {\n\t\tif (this.ui === ui) return;\n\t\tthis.dispose();\n\t\tthis.ui = ui;\n\t}\n\n\tresetVisibility(): void {\n\t\tthis.clearCompletionHideTimer();\n\t\tthis.knownStatuses.clear();\n\t\tthis.completedAt.clear();\n\t\tthis.hiddenCompleted.clear();\n\t\tthis.invalidateRenderCache();\n\t}\n\n\tupdate(): void {\n\t\tif (!this.ui) return;\n\t\tconst state = getTodoState();\n\t\tthis.syncVisibilityFromState(state);\n\t\tthis.invalidateRenderCache();\n\n\t\t// Register/unregister based on state, never as a render side effect.\n\t\tif (!hasVisibleOverlayItems(state, this.hiddenCompleted)) {\n\t\t\tif (this.registered) this.ui.setWidget(WIDGET_KEY, undefined);\n\t\t\tthis.registered = false;\n\t\t\tthis.tui = undefined;\n\t\t\treturn;\n\t\t}\n\n\t\tif (!this.registered) {\n\t\t\tthis.ui.setWidget(\n\t\t\t\tWIDGET_KEY,\n\t\t\t\t(tui, theme) => {\n\t\t\t\t\tthis.tui = tui;\n\t\t\t\t\treturn {\n\t\t\t\t\t\trender: (width: number) => this.render(theme, width),\n\t\t\t\t\t\tinvalidate: () => {\n\t\t\t\t\t\t\tthis.registered = false;\n\t\t\t\t\t\t\tthis.tui = undefined;\n\t\t\t\t\t\t\tthis.invalidateRenderCache();\n\t\t\t\t\t\t},\n\t\t\t\t\t};\n\t\t\t\t},\n\t\t\t\t{ placement: \"aboveEditor\" },\n\t\t\t);\n\t\t\tthis.registered = true;\n\t\t\treturn;\n\t\t}\n\t\tthis.tui?.requestRender();\n\t}\n\n\t/** Track new completions for a short confirmation window; hide historical ones. */\n\tprivate syncVisibilityFromState(state: TodoState): void {\n\t\tconst now = Date.now();\n\t\tconst nextStatuses = new Map<number, TodoStatus>();\n\n\t\tfor (const item of state.items) {\n\t\t\tnextStatuses.set(item.id, item.status);\n\t\t\tconst previousStatus = this.knownStatuses.get(item.id);\n\t\t\tif (item.status !== \"completed\") {\n\t\t\t\tthis.completedAt.delete(item.id);\n\t\t\t\tthis.hiddenCompleted.delete(item.id);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (previousStatus === undefined) {\n\t\t\t\t// A replayed/reloaded completion is old from this overlay's point of\n\t\t\t\t// view. Keep the live surface focused on current work.\n\t\t\t\tthis.hiddenCompleted.add(item.id);\n\t\t\t\tthis.completedAt.delete(item.id);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (previousStatus !== \"completed\") {\n\t\t\t\tthis.completedAt.set(item.id, now);\n\t\t\t\tthis.hiddenCompleted.delete(item.id);\n\t\t\t}\n\t\t}\n\n\t\tfor (const id of this.knownStatuses.keys()) {\n\t\t\tif (nextStatuses.has(id)) continue;\n\t\t\tthis.completedAt.delete(id);\n\t\t\tthis.hiddenCompleted.delete(id);\n\t\t}\n\t\tthis.knownStatuses = nextStatuses;\n\n\t\tfor (const [id, completedAt] of this.completedAt) {\n\t\t\tif (now - completedAt < RECENT_COMPLETION_MS) continue;\n\t\t\tthis.completedAt.delete(id);\n\t\t\tthis.hiddenCompleted.add(id);\n\t\t}\n\t\tthis.scheduleCompletionHide();\n\t}\n\n\tprivate scheduleCompletionHide(): void {\n\t\tthis.clearCompletionHideTimer();\n\t\tlet earliestExpiry = Infinity;\n\t\tfor (const completedAt of this.completedAt.values()) {\n\t\t\tearliestExpiry = Math.min(earliestExpiry, completedAt + RECENT_COMPLETION_MS);\n\t\t}\n\t\tif (!Number.isFinite(earliestExpiry)) return;\n\n\t\tthis.completionHideTimer = setTimeout(\n\t\t\t() => {\n\t\t\t\tthis.completionHideTimer = undefined;\n\t\t\t\tthis.update();\n\t\t\t},\n\t\t\tMath.max(10, earliestExpiry - Date.now()),\n\t\t);\n\t}\n\n\tprivate clearCompletionHideTimer(): void {\n\t\tif (this.completionHideTimer === undefined) return;\n\t\tclearTimeout(this.completionHideTimer);\n\t\tthis.completionHideTimer = undefined;\n\t}\n\n\tprivate invalidateRenderCache(): void {\n\t\tthis.cachedWidth = undefined;\n\t\tthis.cachedLines = undefined;\n\t}\n\n\tprivate render(theme: Theme, width: number): string[] {\n\t\tconst normalizedWidth = Math.max(1, width);\n\t\tif (this.cachedLines !== undefined && this.cachedWidth === normalizedWidth) return this.cachedLines;\n\n\t\tconst lines = renderOverlayLines(getTodoState(), theme, normalizedWidth, this.hiddenCompleted);\n\t\tthis.cachedWidth = normalizedWidth;\n\t\tthis.cachedLines = lines;\n\t\treturn lines;\n\t}\n\n\tdispose(): void {\n\t\tthis.ui?.setWidget(WIDGET_KEY, undefined);\n\t\tthis.tui = undefined;\n\t\tthis.registered = false;\n\t\tthis.ui = undefined;\n\t\tthis.resetVisibility();\n\t}\n}\n"]}
@@ -0,0 +1,139 @@
1
+ import { getTodoState } from "./state.js";
2
+ import { hasVisibleOverlayItems, renderOverlayLines } from "./view.js";
3
+ const WIDGET_KEY = "todos";
4
+ const RECENT_COMPLETION_MS = 30_000;
5
+ export class TodoOverlay {
6
+ ui;
7
+ tui;
8
+ registered = false;
9
+ knownStatuses = new Map();
10
+ completedAt = new Map();
11
+ hiddenCompleted = new Set();
12
+ completionHideTimer;
13
+ /** Pure render cache: same width + visibility state → skip rebuild. */
14
+ cachedWidth;
15
+ cachedLines;
16
+ setUI(ui) {
17
+ if (this.ui === ui)
18
+ return;
19
+ this.dispose();
20
+ this.ui = ui;
21
+ }
22
+ resetVisibility() {
23
+ this.clearCompletionHideTimer();
24
+ this.knownStatuses.clear();
25
+ this.completedAt.clear();
26
+ this.hiddenCompleted.clear();
27
+ this.invalidateRenderCache();
28
+ }
29
+ update() {
30
+ if (!this.ui)
31
+ return;
32
+ const state = getTodoState();
33
+ this.syncVisibilityFromState(state);
34
+ this.invalidateRenderCache();
35
+ // Register/unregister based on state, never as a render side effect.
36
+ if (!hasVisibleOverlayItems(state, this.hiddenCompleted)) {
37
+ if (this.registered)
38
+ this.ui.setWidget(WIDGET_KEY, undefined);
39
+ this.registered = false;
40
+ this.tui = undefined;
41
+ return;
42
+ }
43
+ if (!this.registered) {
44
+ this.ui.setWidget(WIDGET_KEY, (tui, theme) => {
45
+ this.tui = tui;
46
+ return {
47
+ render: (width) => this.render(theme, width),
48
+ invalidate: () => {
49
+ this.registered = false;
50
+ this.tui = undefined;
51
+ this.invalidateRenderCache();
52
+ },
53
+ };
54
+ }, { placement: "aboveEditor" });
55
+ this.registered = true;
56
+ return;
57
+ }
58
+ this.tui?.requestRender();
59
+ }
60
+ /** Track new completions for a short confirmation window; hide historical ones. */
61
+ syncVisibilityFromState(state) {
62
+ const now = Date.now();
63
+ const nextStatuses = new Map();
64
+ for (const item of state.items) {
65
+ nextStatuses.set(item.id, item.status);
66
+ const previousStatus = this.knownStatuses.get(item.id);
67
+ if (item.status !== "completed") {
68
+ this.completedAt.delete(item.id);
69
+ this.hiddenCompleted.delete(item.id);
70
+ continue;
71
+ }
72
+ if (previousStatus === undefined) {
73
+ // A replayed/reloaded completion is old from this overlay's point of
74
+ // view. Keep the live surface focused on current work.
75
+ this.hiddenCompleted.add(item.id);
76
+ this.completedAt.delete(item.id);
77
+ continue;
78
+ }
79
+ if (previousStatus !== "completed") {
80
+ this.completedAt.set(item.id, now);
81
+ this.hiddenCompleted.delete(item.id);
82
+ }
83
+ }
84
+ for (const id of this.knownStatuses.keys()) {
85
+ if (nextStatuses.has(id))
86
+ continue;
87
+ this.completedAt.delete(id);
88
+ this.hiddenCompleted.delete(id);
89
+ }
90
+ this.knownStatuses = nextStatuses;
91
+ for (const [id, completedAt] of this.completedAt) {
92
+ if (now - completedAt < RECENT_COMPLETION_MS)
93
+ continue;
94
+ this.completedAt.delete(id);
95
+ this.hiddenCompleted.add(id);
96
+ }
97
+ this.scheduleCompletionHide();
98
+ }
99
+ scheduleCompletionHide() {
100
+ this.clearCompletionHideTimer();
101
+ let earliestExpiry = Infinity;
102
+ for (const completedAt of this.completedAt.values()) {
103
+ earliestExpiry = Math.min(earliestExpiry, completedAt + RECENT_COMPLETION_MS);
104
+ }
105
+ if (!Number.isFinite(earliestExpiry))
106
+ return;
107
+ this.completionHideTimer = setTimeout(() => {
108
+ this.completionHideTimer = undefined;
109
+ this.update();
110
+ }, Math.max(10, earliestExpiry - Date.now()));
111
+ }
112
+ clearCompletionHideTimer() {
113
+ if (this.completionHideTimer === undefined)
114
+ return;
115
+ clearTimeout(this.completionHideTimer);
116
+ this.completionHideTimer = undefined;
117
+ }
118
+ invalidateRenderCache() {
119
+ this.cachedWidth = undefined;
120
+ this.cachedLines = undefined;
121
+ }
122
+ render(theme, width) {
123
+ const normalizedWidth = Math.max(1, width);
124
+ if (this.cachedLines !== undefined && this.cachedWidth === normalizedWidth)
125
+ return this.cachedLines;
126
+ const lines = renderOverlayLines(getTodoState(), theme, normalizedWidth, this.hiddenCompleted);
127
+ this.cachedWidth = normalizedWidth;
128
+ this.cachedLines = lines;
129
+ return lines;
130
+ }
131
+ dispose() {
132
+ this.ui?.setWidget(WIDGET_KEY, undefined);
133
+ this.tui = undefined;
134
+ this.registered = false;
135
+ this.ui = undefined;
136
+ this.resetVisibility();
137
+ }
138
+ }
139
+ //# sourceMappingURL=overlay.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"overlay.js","sourceRoot":"","sources":["../../../src/extensions/todo/overlay.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAEvE,MAAM,UAAU,GAAG,OAAO,CAAC;AAC3B,MAAM,oBAAoB,GAAG,MAAM,CAAC;AAEpC,MAAM,OAAO,WAAW;IACf,EAAE,CAAiC;IACnC,GAAG,CAAkB;IACrB,UAAU,GAAG,KAAK,CAAC;IACnB,aAAa,GAAG,IAAI,GAAG,EAAsB,CAAC;IAC9C,WAAW,GAAG,IAAI,GAAG,EAAkB,CAAC;IACxC,eAAe,GAAG,IAAI,GAAG,EAAU,CAAC;IACpC,mBAAmB,CAA4C;IACvE,yEAAuE;IAC/D,WAAW,CAAqB;IAChC,WAAW,CAAuB;IAE1C,KAAK,CAAC,EAAsB,EAAQ;QACnC,IAAI,IAAI,CAAC,EAAE,KAAK,EAAE;YAAE,OAAO;QAC3B,IAAI,CAAC,OAAO,EAAE,CAAC;QACf,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;IAAA,CACb;IAED,eAAe,GAAS;QACvB,IAAI,CAAC,wBAAwB,EAAE,CAAC;QAChC,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;QAC3B,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC;QAC7B,IAAI,CAAC,qBAAqB,EAAE,CAAC;IAAA,CAC7B;IAED,MAAM,GAAS;QACd,IAAI,CAAC,IAAI,CAAC,EAAE;YAAE,OAAO;QACrB,MAAM,KAAK,GAAG,YAAY,EAAE,CAAC;QAC7B,IAAI,CAAC,uBAAuB,CAAC,KAAK,CAAC,CAAC;QACpC,IAAI,CAAC,qBAAqB,EAAE,CAAC;QAE7B,qEAAqE;QACrE,IAAI,CAAC,sBAAsB,CAAC,KAAK,EAAE,IAAI,CAAC,eAAe,CAAC,EAAE,CAAC;YAC1D,IAAI,IAAI,CAAC,UAAU;gBAAE,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;YAC9D,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;YACxB,IAAI,CAAC,GAAG,GAAG,SAAS,CAAC;YACrB,OAAO;QACR,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YACtB,IAAI,CAAC,EAAE,CAAC,SAAS,CAChB,UAAU,EACV,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC;gBACf,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;gBACf,OAAO;oBACN,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC;oBACpD,UAAU,EAAE,GAAG,EAAE,CAAC;wBACjB,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;wBACxB,IAAI,CAAC,GAAG,GAAG,SAAS,CAAC;wBACrB,IAAI,CAAC,qBAAqB,EAAE,CAAC;oBAAA,CAC7B;iBACD,CAAC;YAAA,CACF,EACD,EAAE,SAAS,EAAE,aAAa,EAAE,CAC5B,CAAC;YACF,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;YACvB,OAAO;QACR,CAAC;QACD,IAAI,CAAC,GAAG,EAAE,aAAa,EAAE,CAAC;IAAA,CAC1B;IAED,mFAAmF;IAC3E,uBAAuB,CAAC,KAAgB,EAAQ;QACvD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,YAAY,GAAG,IAAI,GAAG,EAAsB,CAAC;QAEnD,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;YAChC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;YACvC,MAAM,cAAc,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACvD,IAAI,IAAI,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;gBACjC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBACjC,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBACrC,SAAS;YACV,CAAC;YAED,IAAI,cAAc,KAAK,SAAS,EAAE,CAAC;gBAClC,qEAAqE;gBACrE,uDAAuD;gBACvD,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBAClC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBACjC,SAAS;YACV,CAAC;YACD,IAAI,cAAc,KAAK,WAAW,EAAE,CAAC;gBACpC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;gBACnC,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACtC,CAAC;QACF,CAAC;QAED,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,EAAE,CAAC;YAC5C,IAAI,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC;gBAAE,SAAS;YACnC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YAC5B,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACjC,CAAC;QACD,IAAI,CAAC,aAAa,GAAG,YAAY,CAAC;QAElC,KAAK,MAAM,CAAC,EAAE,EAAE,WAAW,CAAC,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YAClD,IAAI,GAAG,GAAG,WAAW,GAAG,oBAAoB;gBAAE,SAAS;YACvD,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YAC5B,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC9B,CAAC;QACD,IAAI,CAAC,sBAAsB,EAAE,CAAC;IAAA,CAC9B;IAEO,sBAAsB,GAAS;QACtC,IAAI,CAAC,wBAAwB,EAAE,CAAC;QAChC,IAAI,cAAc,GAAG,QAAQ,CAAC;QAC9B,KAAK,MAAM,WAAW,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,EAAE,CAAC;YACrD,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,cAAc,EAAE,WAAW,GAAG,oBAAoB,CAAC,CAAC;QAC/E,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAC;YAAE,OAAO;QAE7C,IAAI,CAAC,mBAAmB,GAAG,UAAU,CACpC,GAAG,EAAE,CAAC;YACL,IAAI,CAAC,mBAAmB,GAAG,SAAS,CAAC;YACrC,IAAI,CAAC,MAAM,EAAE,CAAC;QAAA,CACd,EACD,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,cAAc,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,CACzC,CAAC;IAAA,CACF;IAEO,wBAAwB,GAAS;QACxC,IAAI,IAAI,CAAC,mBAAmB,KAAK,SAAS;YAAE,OAAO;QACnD,YAAY,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;QACvC,IAAI,CAAC,mBAAmB,GAAG,SAAS,CAAC;IAAA,CACrC;IAEO,qBAAqB,GAAS;QACrC,IAAI,CAAC,WAAW,GAAG,SAAS,CAAC;QAC7B,IAAI,CAAC,WAAW,GAAG,SAAS,CAAC;IAAA,CAC7B;IAEO,MAAM,CAAC,KAAY,EAAE,KAAa,EAAY;QACrD,MAAM,eAAe,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;QAC3C,IAAI,IAAI,CAAC,WAAW,KAAK,SAAS,IAAI,IAAI,CAAC,WAAW,KAAK,eAAe;YAAE,OAAO,IAAI,CAAC,WAAW,CAAC;QAEpG,MAAM,KAAK,GAAG,kBAAkB,CAAC,YAAY,EAAE,EAAE,KAAK,EAAE,eAAe,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;QAC/F,IAAI,CAAC,WAAW,GAAG,eAAe,CAAC;QACnC,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;QACzB,OAAO,KAAK,CAAC;IAAA,CACb;IAED,OAAO,GAAS;QACf,IAAI,CAAC,EAAE,EAAE,SAAS,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;QAC1C,IAAI,CAAC,GAAG,GAAG,SAAS,CAAC;QACrB,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;QACxB,IAAI,CAAC,EAAE,GAAG,SAAS,CAAC;QACpB,IAAI,CAAC,eAAe,EAAE,CAAC;IAAA,CACvB;CACD","sourcesContent":["import type { TUI } from \"@earendil-works/pi-tui\";\nimport type { ExtensionUIContext } from \"../../core/extensions/types.ts\";\nimport type { Theme } from \"../../modes/interactive/theme/theme.ts\";\n\nimport type { TodoState, TodoStatus } from \"./schema.ts\";\nimport { getTodoState } from \"./state.ts\";\nimport { hasVisibleOverlayItems, renderOverlayLines } from \"./view.ts\";\n\nconst WIDGET_KEY = \"todos\";\nconst RECENT_COMPLETION_MS = 30_000;\n\nexport class TodoOverlay {\n\tprivate ui: ExtensionUIContext | undefined;\n\tprivate tui: TUI | undefined;\n\tprivate registered = false;\n\tprivate knownStatuses = new Map<number, TodoStatus>();\n\tprivate completedAt = new Map<number, number>();\n\tprivate hiddenCompleted = new Set<number>();\n\tprivate completionHideTimer: ReturnType<typeof setTimeout> | undefined;\n\t/** Pure render cache: same width + visibility state → skip rebuild. */\n\tprivate cachedWidth: number | undefined;\n\tprivate cachedLines: string[] | undefined;\n\n\tsetUI(ui: ExtensionUIContext): void {\n\t\tif (this.ui === ui) return;\n\t\tthis.dispose();\n\t\tthis.ui = ui;\n\t}\n\n\tresetVisibility(): void {\n\t\tthis.clearCompletionHideTimer();\n\t\tthis.knownStatuses.clear();\n\t\tthis.completedAt.clear();\n\t\tthis.hiddenCompleted.clear();\n\t\tthis.invalidateRenderCache();\n\t}\n\n\tupdate(): void {\n\t\tif (!this.ui) return;\n\t\tconst state = getTodoState();\n\t\tthis.syncVisibilityFromState(state);\n\t\tthis.invalidateRenderCache();\n\n\t\t// Register/unregister based on state, never as a render side effect.\n\t\tif (!hasVisibleOverlayItems(state, this.hiddenCompleted)) {\n\t\t\tif (this.registered) this.ui.setWidget(WIDGET_KEY, undefined);\n\t\t\tthis.registered = false;\n\t\t\tthis.tui = undefined;\n\t\t\treturn;\n\t\t}\n\n\t\tif (!this.registered) {\n\t\t\tthis.ui.setWidget(\n\t\t\t\tWIDGET_KEY,\n\t\t\t\t(tui, theme) => {\n\t\t\t\t\tthis.tui = tui;\n\t\t\t\t\treturn {\n\t\t\t\t\t\trender: (width: number) => this.render(theme, width),\n\t\t\t\t\t\tinvalidate: () => {\n\t\t\t\t\t\t\tthis.registered = false;\n\t\t\t\t\t\t\tthis.tui = undefined;\n\t\t\t\t\t\t\tthis.invalidateRenderCache();\n\t\t\t\t\t\t},\n\t\t\t\t\t};\n\t\t\t\t},\n\t\t\t\t{ placement: \"aboveEditor\" },\n\t\t\t);\n\t\t\tthis.registered = true;\n\t\t\treturn;\n\t\t}\n\t\tthis.tui?.requestRender();\n\t}\n\n\t/** Track new completions for a short confirmation window; hide historical ones. */\n\tprivate syncVisibilityFromState(state: TodoState): void {\n\t\tconst now = Date.now();\n\t\tconst nextStatuses = new Map<number, TodoStatus>();\n\n\t\tfor (const item of state.items) {\n\t\t\tnextStatuses.set(item.id, item.status);\n\t\t\tconst previousStatus = this.knownStatuses.get(item.id);\n\t\t\tif (item.status !== \"completed\") {\n\t\t\t\tthis.completedAt.delete(item.id);\n\t\t\t\tthis.hiddenCompleted.delete(item.id);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (previousStatus === undefined) {\n\t\t\t\t// A replayed/reloaded completion is old from this overlay's point of\n\t\t\t\t// view. Keep the live surface focused on current work.\n\t\t\t\tthis.hiddenCompleted.add(item.id);\n\t\t\t\tthis.completedAt.delete(item.id);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (previousStatus !== \"completed\") {\n\t\t\t\tthis.completedAt.set(item.id, now);\n\t\t\t\tthis.hiddenCompleted.delete(item.id);\n\t\t\t}\n\t\t}\n\n\t\tfor (const id of this.knownStatuses.keys()) {\n\t\t\tif (nextStatuses.has(id)) continue;\n\t\t\tthis.completedAt.delete(id);\n\t\t\tthis.hiddenCompleted.delete(id);\n\t\t}\n\t\tthis.knownStatuses = nextStatuses;\n\n\t\tfor (const [id, completedAt] of this.completedAt) {\n\t\t\tif (now - completedAt < RECENT_COMPLETION_MS) continue;\n\t\t\tthis.completedAt.delete(id);\n\t\t\tthis.hiddenCompleted.add(id);\n\t\t}\n\t\tthis.scheduleCompletionHide();\n\t}\n\n\tprivate scheduleCompletionHide(): void {\n\t\tthis.clearCompletionHideTimer();\n\t\tlet earliestExpiry = Infinity;\n\t\tfor (const completedAt of this.completedAt.values()) {\n\t\t\tearliestExpiry = Math.min(earliestExpiry, completedAt + RECENT_COMPLETION_MS);\n\t\t}\n\t\tif (!Number.isFinite(earliestExpiry)) return;\n\n\t\tthis.completionHideTimer = setTimeout(\n\t\t\t() => {\n\t\t\t\tthis.completionHideTimer = undefined;\n\t\t\t\tthis.update();\n\t\t\t},\n\t\t\tMath.max(10, earliestExpiry - Date.now()),\n\t\t);\n\t}\n\n\tprivate clearCompletionHideTimer(): void {\n\t\tif (this.completionHideTimer === undefined) return;\n\t\tclearTimeout(this.completionHideTimer);\n\t\tthis.completionHideTimer = undefined;\n\t}\n\n\tprivate invalidateRenderCache(): void {\n\t\tthis.cachedWidth = undefined;\n\t\tthis.cachedLines = undefined;\n\t}\n\n\tprivate render(theme: Theme, width: number): string[] {\n\t\tconst normalizedWidth = Math.max(1, width);\n\t\tif (this.cachedLines !== undefined && this.cachedWidth === normalizedWidth) return this.cachedLines;\n\n\t\tconst lines = renderOverlayLines(getTodoState(), theme, normalizedWidth, this.hiddenCompleted);\n\t\tthis.cachedWidth = normalizedWidth;\n\t\tthis.cachedLines = lines;\n\t\treturn lines;\n\t}\n\n\tdispose(): void {\n\t\tthis.ui?.setWidget(WIDGET_KEY, undefined);\n\t\tthis.tui = undefined;\n\t\tthis.registered = false;\n\t\tthis.ui = undefined;\n\t\tthis.resetVisibility();\n\t}\n}\n"]}
@@ -0,0 +1,41 @@
1
+ import { type Static, Type } from "typebox";
2
+ export type TodoStatus = "pending" | "in_progress" | "completed" | "deleted";
3
+ export type TodoAction = "create" | "update" | "list" | "get" | "delete" | "clear";
4
+ export interface TodoItem {
5
+ id: number;
6
+ subject: string;
7
+ description?: string;
8
+ activeForm?: string;
9
+ status: TodoStatus;
10
+ blockedBy?: number[];
11
+ owner?: string;
12
+ metadata?: Record<string, unknown>;
13
+ }
14
+ export interface TodoState {
15
+ items: TodoItem[];
16
+ nextId: number;
17
+ }
18
+ export interface TodoDetails {
19
+ action: TodoAction;
20
+ params: Record<string, unknown>;
21
+ items: TodoItem[];
22
+ nextId: number;
23
+ error?: string;
24
+ }
25
+ export declare const TodoParamsSchema: Type.TObject<{
26
+ action: Type.TUnsafe<"clear" | "create" | "delete" | "get" | "list" | "update">;
27
+ subject: Type.TOptional<Type.TString>;
28
+ description: Type.TOptional<Type.TString>;
29
+ activeForm: Type.TOptional<Type.TString>;
30
+ status: Type.TOptional<Type.TUnsafe<"completed" | "deleted" | "in_progress" | "pending">>;
31
+ blockedBy: Type.TOptional<Type.TArray<Type.TNumber>>;
32
+ addBlockedBy: Type.TOptional<Type.TArray<Type.TNumber>>;
33
+ removeBlockedBy: Type.TOptional<Type.TArray<Type.TNumber>>;
34
+ owner: Type.TOptional<Type.TString>;
35
+ metadata: Type.TOptional<Type.TRecord<"^.*$", Type.TUnknown>>;
36
+ id: Type.TOptional<Type.TNumber>;
37
+ includeDeleted: Type.TOptional<Type.TBoolean>;
38
+ }>;
39
+ export type TodoParams = Static<typeof TodoParamsSchema>;
40
+ export declare const EMPTY_TODO_STATE: TodoState;
41
+ //# sourceMappingURL=schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../src/extensions/todo/schema.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,MAAM,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAE5C,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,aAAa,GAAG,WAAW,GAAG,SAAS,CAAC;AAC7E,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,QAAQ,GAAG,MAAM,GAAG,KAAK,GAAG,QAAQ,GAAG,OAAO,CAAC;AAEnF,MAAM,WAAW,QAAQ;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,UAAU,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;AAED,MAAM,WAAW,SAAS;IACzB,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,WAAW;IAC3B,MAAM,EAAE,UAAU,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CACf;AAYD,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;EAyC3B,CAAC;AAEH,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAEzD,eAAO,MAAM,gBAAgB,EAAE,SAAoC,CAAC","sourcesContent":["import { StringEnum } from \"@earendil-works/pi-ai\";\nimport { type Static, Type } from \"typebox\";\n\nexport type TodoStatus = \"pending\" | \"in_progress\" | \"completed\" | \"deleted\";\nexport type TodoAction = \"create\" | \"update\" | \"list\" | \"get\" | \"delete\" | \"clear\";\n\nexport interface TodoItem {\n\tid: number;\n\tsubject: string;\n\tdescription?: string;\n\tactiveForm?: string;\n\tstatus: TodoStatus;\n\tblockedBy?: number[];\n\towner?: string;\n\tmetadata?: Record<string, unknown>;\n}\n\nexport interface TodoState {\n\titems: TodoItem[];\n\tnextId: number;\n}\n\nexport interface TodoDetails {\n\taction: TodoAction;\n\tparams: Record<string, unknown>;\n\titems: TodoItem[];\n\tnextId: number;\n\terror?: string;\n}\n\nconst StatusSchema = StringEnum([\"pending\", \"in_progress\", \"completed\", \"deleted\"] as const, {\n\tdescription:\n\t\t\"Task status: pending for future work, in_progress for the single active task, completed for verified done work, and deleted for an immutable obsolete-task tombstone. Set deleted through update or use the delete action. With action list, status also acts as a filter: only tasks with this status are listed.\",\n});\n\nconst ActionSchema = StringEnum([\"create\", \"update\", \"list\", \"get\", \"delete\", \"clear\"] as const, {\n\tdescription:\n\t\t\"Todo operation: create a pending task, update status/details/dependencies, list current tasks (optionally filtered by status), get one task, delete an obsolete task and release dependents, or clear the list without reusing ids.\",\n});\n\nexport const TodoParamsSchema = Type.Object({\n\taction: ActionSchema,\n\tsubject: Type.Optional(\n\t\tType.String({\n\t\t\tdescription:\n\t\t\t\t\"Short imperative task subject, required for create; use a reviewable unit of work, not a micro-step.\",\n\t\t}),\n\t),\n\tdescription: Type.Optional(\n\t\tType.String({ description: \"Longer task notes, acceptance criteria, or verification detail.\" }),\n\t),\n\tactiveForm: Type.Optional(\n\t\tType.String({\n\t\t\tdescription: \"Present-continuous label shown while in_progress, such as 'reading code' or 'updating prompts'.\",\n\t\t}),\n\t),\n\tstatus: Type.Optional(StatusSchema),\n\tblockedBy: Type.Optional(\n\t\tType.Array(Type.Number(), {\n\t\t\tdescription: \"Initial dependency ids for create; use only for real ordering constraints.\",\n\t\t}),\n\t),\n\taddBlockedBy: Type.Optional(\n\t\tType.Array(Type.Number(), {\n\t\t\tdescription: \"Dependency ids to add on update; dependencies must exist and cannot create cycles.\",\n\t\t}),\n\t),\n\tremoveBlockedBy: Type.Optional(Type.Array(Type.Number(), { description: \"Dependency ids to remove on update.\" })),\n\towner: Type.Optional(Type.String({ description: \"Optional owner or agent label for multi-agent coordination.\" })),\n\tmetadata: Type.Optional(\n\t\tType.Record(Type.String(), Type.Unknown(), {\n\t\t\tdescription: \"Optional structured metadata for integrations; null values delete keys on update.\",\n\t\t}),\n\t),\n\tid: Type.Optional(Type.Number({ description: \"Task id, required for update, get, and delete.\" })),\n\tincludeDeleted: Type.Optional(\n\t\tType.Boolean({\n\t\t\tdescription:\n\t\t\t\t\"Include deleted tombstones in unfiltered list output; an explicit status=deleted query includes them automatically.\",\n\t\t}),\n\t),\n});\n\nexport type TodoParams = Static<typeof TodoParamsSchema>;\n\nexport const EMPTY_TODO_STATE: TodoState = { items: [], nextId: 1 };\n"]}
@@ -0,0 +1,36 @@
1
+ import { StringEnum } from "@earendil-works/pi-ai";
2
+ import { Type } from "typebox";
3
+ const StatusSchema = StringEnum(["pending", "in_progress", "completed", "deleted"], {
4
+ description: "Task status: pending for future work, in_progress for the single active task, completed for verified done work, and deleted for an immutable obsolete-task tombstone. Set deleted through update or use the delete action. With action list, status also acts as a filter: only tasks with this status are listed.",
5
+ });
6
+ const ActionSchema = StringEnum(["create", "update", "list", "get", "delete", "clear"], {
7
+ description: "Todo operation: create a pending task, update status/details/dependencies, list current tasks (optionally filtered by status), get one task, delete an obsolete task and release dependents, or clear the list without reusing ids.",
8
+ });
9
+ export const TodoParamsSchema = Type.Object({
10
+ action: ActionSchema,
11
+ subject: Type.Optional(Type.String({
12
+ description: "Short imperative task subject, required for create; use a reviewable unit of work, not a micro-step.",
13
+ })),
14
+ description: Type.Optional(Type.String({ description: "Longer task notes, acceptance criteria, or verification detail." })),
15
+ activeForm: Type.Optional(Type.String({
16
+ description: "Present-continuous label shown while in_progress, such as 'reading code' or 'updating prompts'.",
17
+ })),
18
+ status: Type.Optional(StatusSchema),
19
+ blockedBy: Type.Optional(Type.Array(Type.Number(), {
20
+ description: "Initial dependency ids for create; use only for real ordering constraints.",
21
+ })),
22
+ addBlockedBy: Type.Optional(Type.Array(Type.Number(), {
23
+ description: "Dependency ids to add on update; dependencies must exist and cannot create cycles.",
24
+ })),
25
+ removeBlockedBy: Type.Optional(Type.Array(Type.Number(), { description: "Dependency ids to remove on update." })),
26
+ owner: Type.Optional(Type.String({ description: "Optional owner or agent label for multi-agent coordination." })),
27
+ metadata: Type.Optional(Type.Record(Type.String(), Type.Unknown(), {
28
+ description: "Optional structured metadata for integrations; null values delete keys on update.",
29
+ })),
30
+ id: Type.Optional(Type.Number({ description: "Task id, required for update, get, and delete." })),
31
+ includeDeleted: Type.Optional(Type.Boolean({
32
+ description: "Include deleted tombstones in unfiltered list output; an explicit status=deleted query includes them automatically.",
33
+ })),
34
+ });
35
+ export const EMPTY_TODO_STATE = { items: [], nextId: 1 };
36
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../src/extensions/todo/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAe,IAAI,EAAE,MAAM,SAAS,CAAC;AA6B5C,MAAM,YAAY,GAAG,UAAU,CAAC,CAAC,SAAS,EAAE,aAAa,EAAE,WAAW,EAAE,SAAS,CAAU,EAAE;IAC5F,WAAW,EACV,oTAAoT;CACrT,CAAC,CAAC;AAEH,MAAM,YAAY,GAAG,UAAU,CAAC,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,CAAU,EAAE;IAChG,WAAW,EACV,qOAAqO;CACtO,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,gBAAgB,GAAG,IAAI,CAAC,MAAM,CAAC;IAC3C,MAAM,EAAE,YAAY;IACpB,OAAO,EAAE,IAAI,CAAC,QAAQ,CACrB,IAAI,CAAC,MAAM,CAAC;QACX,WAAW,EACV,sGAAsG;KACvG,CAAC,CACF;IACD,WAAW,EAAE,IAAI,CAAC,QAAQ,CACzB,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,iEAAiE,EAAE,CAAC,CAC/F;IACD,UAAU,EAAE,IAAI,CAAC,QAAQ,CACxB,IAAI,CAAC,MAAM,CAAC;QACX,WAAW,EAAE,iGAAiG;KAC9G,CAAC,CACF;IACD,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC;IACnC,SAAS,EAAE,IAAI,CAAC,QAAQ,CACvB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE;QACzB,WAAW,EAAE,4EAA4E;KACzF,CAAC,CACF;IACD,YAAY,EAAE,IAAI,CAAC,QAAQ,CAC1B,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE;QACzB,WAAW,EAAE,oFAAoF;KACjG,CAAC,CACF;IACD,eAAe,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,EAAE,WAAW,EAAE,qCAAqC,EAAE,CAAC,CAAC;IACjH,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,6DAA6D,EAAE,CAAC,CAAC;IACjH,QAAQ,EAAE,IAAI,CAAC,QAAQ,CACtB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE;QAC1C,WAAW,EAAE,mFAAmF;KAChG,CAAC,CACF;IACD,EAAE,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,gDAAgD,EAAE,CAAC,CAAC;IACjG,cAAc,EAAE,IAAI,CAAC,QAAQ,CAC5B,IAAI,CAAC,OAAO,CAAC;QACZ,WAAW,EACV,qHAAqH;KACtH,CAAC,CACF;CACD,CAAC,CAAC;AAIH,MAAM,CAAC,MAAM,gBAAgB,GAAc,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC","sourcesContent":["import { StringEnum } from \"@earendil-works/pi-ai\";\nimport { type Static, Type } from \"typebox\";\n\nexport type TodoStatus = \"pending\" | \"in_progress\" | \"completed\" | \"deleted\";\nexport type TodoAction = \"create\" | \"update\" | \"list\" | \"get\" | \"delete\" | \"clear\";\n\nexport interface TodoItem {\n\tid: number;\n\tsubject: string;\n\tdescription?: string;\n\tactiveForm?: string;\n\tstatus: TodoStatus;\n\tblockedBy?: number[];\n\towner?: string;\n\tmetadata?: Record<string, unknown>;\n}\n\nexport interface TodoState {\n\titems: TodoItem[];\n\tnextId: number;\n}\n\nexport interface TodoDetails {\n\taction: TodoAction;\n\tparams: Record<string, unknown>;\n\titems: TodoItem[];\n\tnextId: number;\n\terror?: string;\n}\n\nconst StatusSchema = StringEnum([\"pending\", \"in_progress\", \"completed\", \"deleted\"] as const, {\n\tdescription:\n\t\t\"Task status: pending for future work, in_progress for the single active task, completed for verified done work, and deleted for an immutable obsolete-task tombstone. Set deleted through update or use the delete action. With action list, status also acts as a filter: only tasks with this status are listed.\",\n});\n\nconst ActionSchema = StringEnum([\"create\", \"update\", \"list\", \"get\", \"delete\", \"clear\"] as const, {\n\tdescription:\n\t\t\"Todo operation: create a pending task, update status/details/dependencies, list current tasks (optionally filtered by status), get one task, delete an obsolete task and release dependents, or clear the list without reusing ids.\",\n});\n\nexport const TodoParamsSchema = Type.Object({\n\taction: ActionSchema,\n\tsubject: Type.Optional(\n\t\tType.String({\n\t\t\tdescription:\n\t\t\t\t\"Short imperative task subject, required for create; use a reviewable unit of work, not a micro-step.\",\n\t\t}),\n\t),\n\tdescription: Type.Optional(\n\t\tType.String({ description: \"Longer task notes, acceptance criteria, or verification detail.\" }),\n\t),\n\tactiveForm: Type.Optional(\n\t\tType.String({\n\t\t\tdescription: \"Present-continuous label shown while in_progress, such as 'reading code' or 'updating prompts'.\",\n\t\t}),\n\t),\n\tstatus: Type.Optional(StatusSchema),\n\tblockedBy: Type.Optional(\n\t\tType.Array(Type.Number(), {\n\t\t\tdescription: \"Initial dependency ids for create; use only for real ordering constraints.\",\n\t\t}),\n\t),\n\taddBlockedBy: Type.Optional(\n\t\tType.Array(Type.Number(), {\n\t\t\tdescription: \"Dependency ids to add on update; dependencies must exist and cannot create cycles.\",\n\t\t}),\n\t),\n\tremoveBlockedBy: Type.Optional(Type.Array(Type.Number(), { description: \"Dependency ids to remove on update.\" })),\n\towner: Type.Optional(Type.String({ description: \"Optional owner or agent label for multi-agent coordination.\" })),\n\tmetadata: Type.Optional(\n\t\tType.Record(Type.String(), Type.Unknown(), {\n\t\t\tdescription: \"Optional structured metadata for integrations; null values delete keys on update.\",\n\t\t}),\n\t),\n\tid: Type.Optional(Type.Number({ description: \"Task id, required for update, get, and delete.\" })),\n\tincludeDeleted: Type.Optional(\n\t\tType.Boolean({\n\t\t\tdescription:\n\t\t\t\t\"Include deleted tombstones in unfiltered list output; an explicit status=deleted query includes them automatically.\",\n\t\t}),\n\t),\n});\n\nexport type TodoParams = Static<typeof TodoParamsSchema>;\n\nexport const EMPTY_TODO_STATE: TodoState = { items: [], nextId: 1 };\n"]}
@@ -0,0 +1,57 @@
1
+ import { type TodoDetails, type TodoItem, type TodoParams, type TodoState, type TodoStatus } from "./schema.ts";
2
+ type Operation = {
3
+ kind: "create";
4
+ id: number;
5
+ } | {
6
+ kind: "update";
7
+ id: number;
8
+ from: TodoStatus;
9
+ to: TodoStatus;
10
+ /** Other tasks auto-demoted from in_progress → pending to keep exactly one active. */
11
+ demotedIds?: number[];
12
+ /** Soft note when the list is fully closed without a verification-style task. */
13
+ verificationNudge?: boolean;
14
+ } | {
15
+ kind: "delete";
16
+ id: number;
17
+ subject: string;
18
+ } | {
19
+ kind: "list";
20
+ status?: TodoStatus;
21
+ includeDeleted: boolean;
22
+ } | {
23
+ kind: "get";
24
+ item: TodoItem;
25
+ } | {
26
+ kind: "clear";
27
+ count: number;
28
+ } | {
29
+ kind: "error";
30
+ message: string;
31
+ };
32
+ export interface MutationResult {
33
+ state: TodoState;
34
+ operation: Operation;
35
+ }
36
+ /** Point the module at a session's state bucket. Call wherever ctx is in hand. */
37
+ export declare function setActiveTodoSession(sid: string): void;
38
+ export declare function getTodoState(): TodoState;
39
+ export declare function replaceTodoState(next: TodoState): void;
40
+ export declare function commitTodoState(next: TodoState): void;
41
+ /** Drop in-memory state for a session (call from session_shutdown). */
42
+ export declare function disposeTodoSession(sid: string): void;
43
+ export declare function cloneState(source: TodoState): TodoState;
44
+ /** IDs of dependencies that still prevent a task from starting or completing. */
45
+ export declare function unresolvedDependencyIds(state: TodoState, item: TodoItem): number[];
46
+ /** True when every blockedBy dependency is completed (for transition and overlay checks). */
47
+ export declare function dependenciesSatisfied(state: TodoState, item: TodoItem): boolean;
48
+ export declare function applyTodoMutation(input: TodoState, params: TodoParams): MutationResult;
49
+ export declare function replayTodosFromBranch(ctx: {
50
+ sessionManager: {
51
+ getBranch(): Iterable<unknown>;
52
+ };
53
+ }): TodoState;
54
+ export declare function buildTodoDetails(params: TodoParams, next: TodoState, operation: Operation): TodoDetails;
55
+ export declare function formatTodoContent(operation: Operation, state: TodoState): string;
56
+ export {};
57
+ //# sourceMappingURL=state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../../src/extensions/todo/state.ts"],"names":[],"mappings":"AACA,OAAO,EAEN,KAAK,WAAW,EAChB,KAAK,QAAQ,EACb,KAAK,UAAU,EACf,KAAK,SAAS,EACd,KAAK,UAAU,EACf,MAAM,aAAa,CAAC;AAErB,KAAK,SAAS,GACX;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,GAC9B;IACA,IAAI,EAAE,QAAQ,CAAC;IACf,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,UAAU,CAAC;IACjB,EAAE,EAAE,UAAU,CAAC;IACf,wFAAsF;IACtF,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,iFAAiF;IACjF,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC3B,GACD;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAC/C;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,UAAU,CAAC;IAAC,cAAc,EAAE,OAAO,CAAA;CAAE,GAC9D;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,IAAI,EAAE,QAAQ,CAAA;CAAE,GAC/B;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAChC;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAKtC,MAAM,WAAW,cAAc;IAC9B,KAAK,EAAE,SAAS,CAAC;IACjB,SAAS,EAAE,SAAS,CAAC;CACrB;AAWD,kFAAkF;AAClF,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAEtD;AAED,wBAAgB,YAAY,IAAI,SAAS,CAExC;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,SAAS,GAAG,IAAI,CAEtD;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,SAAS,GAAG,IAAI,CAErD;AAED,uEAAuE;AACvE,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAIpD;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,SAAS,GAAG,SAAS,CAYvD;AA+DD,iFAAiF;AACjF,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,GAAG,MAAM,EAAE,CAElF;AAED,6FAA6F;AAC7F,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,GAAG,OAAO,CAE/E;AAyBD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,GAAG,cAAc,CA4KtF;AAQD,wBAAgB,qBAAqB,CAAC,GAAG,EAAE;IAAE,cAAc,EAAE;QAAE,SAAS,IAAI,QAAQ,CAAC,OAAO,CAAC,CAAA;KAAE,CAAA;CAAE,GAAG,SAAS,CAiB5G;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,GAAG,WAAW,CAQvG;AAKD,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,GAAG,MAAM,CAgChF","sourcesContent":["import { LIST_DISPLAY_MAX_ITEMS, TODO_TOOL_NAME } from \"./constants.ts\";\nimport {\n\tEMPTY_TODO_STATE,\n\ttype TodoDetails,\n\ttype TodoItem,\n\ttype TodoParams,\n\ttype TodoState,\n\ttype TodoStatus,\n} from \"./schema.ts\";\n\ntype Operation =\n\t| { kind: \"create\"; id: number }\n\t| {\n\t\t\tkind: \"update\";\n\t\t\tid: number;\n\t\t\tfrom: TodoStatus;\n\t\t\tto: TodoStatus;\n\t\t\t/** Other tasks auto-demoted from in_progress → pending to keep exactly one active. */\n\t\t\tdemotedIds?: number[];\n\t\t\t/** Soft note when the list is fully closed without a verification-style task. */\n\t\t\tverificationNudge?: boolean;\n\t }\n\t| { kind: \"delete\"; id: number; subject: string }\n\t| { kind: \"list\"; status?: TodoStatus; includeDeleted: boolean }\n\t| { kind: \"get\"; item: TodoItem }\n\t| { kind: \"clear\"; count: number }\n\t| { kind: \"error\"; message: string };\n\n/** Subjects/descriptions that count as a verification step (CC-style soft nudge). */\nconst VERIFICATION_PATTERN = /verif|test|check|review/i;\n\nexport interface MutationResult {\n\tstate: TodoState;\n\toperation: Operation;\n}\n\n// ---- per-session state ------------------------------------------------------\n// Keyed by session id like rewind's engine state: one Pi process can host more\n// than one session over its lifetime (resume, /tree branch switches), and a\n// module-level singleton would leak one session's list into another. Tool\n// renderers get no ctx, so the active session is a module-level pointer kept\n// current by execute and the lifecycle handlers (which do have ctx).\nconst states = new Map<string, TodoState>();\nlet activeSid = \"\";\n\n/** Point the module at a session's state bucket. Call wherever ctx is in hand. */\nexport function setActiveTodoSession(sid: string): void {\n\tactiveSid = sid;\n}\n\nexport function getTodoState(): TodoState {\n\treturn states.get(activeSid) ?? cloneState(EMPTY_TODO_STATE);\n}\n\nexport function replaceTodoState(next: TodoState): void {\n\tstates.set(activeSid, cloneState(next));\n}\n\nexport function commitTodoState(next: TodoState): void {\n\treplaceTodoState(next);\n}\n\n/** Drop in-memory state for a session (call from session_shutdown). */\nexport function disposeTodoSession(sid: string): void {\n\tif (!sid) return;\n\tstates.delete(sid);\n\tif (activeSid === sid) activeSid = \"\";\n}\n\nexport function cloneState(source: TodoState): TodoState {\n\treturn {\n\t\titems: source.items.map((item) => {\n\t\t\tconst clone: TodoItem = { ...item };\n\t\t\tif (item.blockedBy) clone.blockedBy = [...item.blockedBy];\n\t\t\telse delete clone.blockedBy;\n\t\t\tif (item.metadata) clone.metadata = { ...item.metadata };\n\t\t\telse delete clone.metadata;\n\t\t\treturn clone;\n\t\t}),\n\t\tnextId: source.nextId,\n\t};\n}\n\nfunction omitBlockedBy(item: TodoItem): TodoItem {\n\tconst next = { ...item };\n\tdelete next.blockedBy;\n\treturn next;\n}\n\n/** Keep a tombstone while detaching its id from every dependent task. */\nfunction markDeleted(state: TodoState, id: number): TodoState {\n\tconst items = state.items.map((item) => {\n\t\tif (item.id === id) return { ...item, status: \"deleted\" as const };\n\t\tif (!item.blockedBy?.includes(id)) return item;\n\t\tconst blockedBy = item.blockedBy.filter((dependencyId) => dependencyId !== id);\n\t\treturn blockedBy.length ? { ...item, blockedBy } : omitBlockedBy(item);\n\t});\n\treturn { items, nextId: state.nextId };\n}\n\nfunction error(state: TodoState, message: string): MutationResult {\n\treturn { state, operation: { kind: \"error\", message } };\n}\n\nfunction isTransitionAllowed(from: TodoStatus, to: TodoStatus): boolean {\n\t// `deleted` is the only terminal status; `completed` can be reopened to\n\t// in_progress or pending so a premature completion recovers without losing\n\t// the task id and its blockedBy edges.\n\tif (from === to) return true;\n\tif (from === \"deleted\") return false;\n\tif (to === \"deleted\") return true;\n\tif (to === \"completed\") return from === \"pending\" || from === \"in_progress\";\n\tif (to === \"pending\") return from === \"in_progress\" || from === \"completed\";\n\tif (to === \"in_progress\") return from === \"pending\" || from === \"completed\";\n\treturn false;\n}\n\nfunction findItem(state: TodoState, id: number): TodoItem | undefined {\n\treturn state.items.find((item) => item.id === id);\n}\n\nfunction validateDependencies(state: TodoState, deps: number[] | undefined, currentId?: number): string | undefined {\n\tif (!deps?.length) return undefined;\n\tfor (const dep of deps) {\n\t\tif (dep === currentId) return `cannot block #${currentId} on itself`;\n\t\tconst item = findItem(state, dep);\n\t\tif (!item) return `blockedBy: #${dep} not found`;\n\t\tif (item.status === \"deleted\") return `blockedBy: #${dep} is deleted`;\n\t}\n\treturn undefined;\n}\n\n/** All listed dependencies must be completed before starting or closing a task. */\nfunction validateDependenciesReady(state: TodoState, deps: number[] | undefined): string | undefined {\n\tif (!deps?.length) return undefined;\n\tfor (const dep of deps) {\n\t\tconst item = findItem(state, dep);\n\t\tif (!item || item.status !== \"completed\") {\n\t\t\treturn `blockedBy: complete #${dep} before starting or finishing this task`;\n\t\t}\n\t}\n\treturn undefined;\n}\n\n/** IDs of dependencies that still prevent a task from starting or completing. */\nexport function unresolvedDependencyIds(state: TodoState, item: TodoItem): number[] {\n\treturn (item.blockedBy ?? []).filter((id) => findItem(state, id)?.status !== \"completed\");\n}\n\n/** True when every blockedBy dependency is completed (for transition and overlay checks). */\nexport function dependenciesSatisfied(state: TodoState, item: TodoItem): boolean {\n\treturn unresolvedDependencyIds(state, item).length === 0;\n}\n\nfunction createsCycle(items: TodoItem[], id: number, nextDeps: number[]): boolean {\n\tconst depsById = new Map<number, number[]>();\n\tfor (const item of items) depsById.set(item.id, item.blockedBy ?? []);\n\tdepsById.set(id, nextDeps);\n\n\tconst seen = new Set<number>();\n\tconst stack = new Set<number>();\n\n\tfunction visit(node: number): boolean {\n\t\tif (stack.has(node)) return true;\n\t\tif (seen.has(node)) return false;\n\t\tseen.add(node);\n\t\tstack.add(node);\n\t\tfor (const dep of depsById.get(node) ?? []) {\n\t\t\tif (visit(dep)) return true;\n\t\t}\n\t\tstack.delete(node);\n\t\treturn false;\n\t}\n\n\treturn visit(id);\n}\n\nexport function applyTodoMutation(input: TodoState, params: TodoParams): MutationResult {\n\tconst state = cloneState(input);\n\n\tswitch (params.action) {\n\t\tcase \"create\": {\n\t\t\tconst subject = params.subject?.trim();\n\t\t\tif (!subject) return error(state, \"subject required for create\");\n\t\t\tif (params.status !== undefined && params.status !== \"pending\") {\n\t\t\t\treturn error(state, \"create always starts pending; use update to start or complete a task\");\n\t\t\t}\n\t\t\tconst dependencyError = validateDependencies(state, params.blockedBy);\n\t\t\tif (dependencyError) return error(state, dependencyError);\n\n\t\t\tconst item: TodoItem = {\n\t\t\t\tid: state.nextId,\n\t\t\t\tsubject,\n\t\t\t\tstatus: \"pending\",\n\t\t\t};\n\t\t\tif (params.description) item.description = params.description;\n\t\t\tif (params.activeForm) item.activeForm = params.activeForm;\n\t\t\tif (params.blockedBy?.length) item.blockedBy = Array.from(new Set<number>(params.blockedBy));\n\t\t\tif (params.owner) item.owner = params.owner;\n\t\t\tif (params.metadata) item.metadata = { ...params.metadata };\n\n\t\t\treturn {\n\t\t\t\tstate: { items: [...state.items, item], nextId: state.nextId + 1 },\n\t\t\t\toperation: { kind: \"create\", id: item.id },\n\t\t\t};\n\t\t}\n\n\t\tcase \"update\": {\n\t\t\tif (params.id === undefined) return error(state, \"id required for update\");\n\t\t\tconst index = state.items.findIndex((item) => item.id === params.id);\n\t\t\tif (index === -1) return error(state, `#${params.id} not found`);\n\t\t\tconst current = state.items[index];\n\t\t\tif (current.status === \"deleted\") return error(state, `#${params.id} is deleted and cannot be updated`);\n\t\t\tif (params.subject !== undefined && !params.subject.trim()) return error(state, \"subject cannot be empty\");\n\n\t\t\tconst hasChange =\n\t\t\t\tparams.subject !== undefined ||\n\t\t\t\tparams.description !== undefined ||\n\t\t\t\tparams.activeForm !== undefined ||\n\t\t\t\tparams.status !== undefined ||\n\t\t\t\tparams.owner !== undefined ||\n\t\t\t\tparams.metadata !== undefined ||\n\t\t\t\t(params.addBlockedBy?.length ?? 0) > 0 ||\n\t\t\t\t(params.removeBlockedBy?.length ?? 0) > 0;\n\t\t\tif (!hasChange) return error(state, \"update requires at least one field\");\n\n\t\t\t// `status: deleted` is the update form of delete; keep its dependency\n\t\t\t// cleanup identical to the dedicated delete action.\n\t\t\tif (params.status === \"deleted\") {\n\t\t\t\treturn {\n\t\t\t\t\tstate: markDeleted(state, current.id),\n\t\t\t\t\toperation: { kind: \"update\", id: current.id, from: current.status, to: \"deleted\" },\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tconst nextStatus = params.status ?? current.status;\n\t\t\tif (!isTransitionAllowed(current.status, nextStatus)) {\n\t\t\t\treturn error(state, `illegal transition ${current.status} -> ${nextStatus}`);\n\t\t\t}\n\n\t\t\tlet nextDeps = current.blockedBy ? [...current.blockedBy] : [];\n\t\t\tif (params.removeBlockedBy?.length) {\n\t\t\t\tconst remove = new Set(params.removeBlockedBy);\n\t\t\t\tnextDeps = nextDeps.filter((id) => !remove.has(id));\n\t\t\t}\n\t\t\tif (params.addBlockedBy?.length) {\n\t\t\t\tconst dependencyError = validateDependencies(state, params.addBlockedBy, current.id);\n\t\t\t\tif (dependencyError) return error(state, dependencyError);\n\t\t\t\tfor (const dep of params.addBlockedBy) {\n\t\t\t\t\tif (!nextDeps.includes(dep)) nextDeps.push(dep);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (createsCycle(state.items, current.id, nextDeps)) {\n\t\t\t\treturn error(state, \"blockedBy would create a cycle\");\n\t\t\t}\n\n\t\t\tif ((nextStatus === \"in_progress\" || nextStatus === \"completed\") && current.status !== nextStatus) {\n\t\t\t\tconst readyError = validateDependenciesReady(state, nextDeps);\n\t\t\t\tif (readyError) return error(state, readyError);\n\t\t\t}\n\n\t\t\tconst updated: TodoItem = { ...current, status: nextStatus };\n\t\t\tif (params.subject !== undefined) updated.subject = params.subject.trim();\n\t\t\tif (params.description !== undefined) updated.description = params.description;\n\t\t\tif (params.activeForm !== undefined) updated.activeForm = params.activeForm;\n\t\t\tif (params.owner !== undefined) updated.owner = params.owner;\n\t\t\tif (nextDeps.length) updated.blockedBy = nextDeps;\n\t\t\telse delete updated.blockedBy;\n\n\t\t\tif (params.metadata !== undefined) {\n\t\t\t\tconst merged = { ...(current.metadata ?? {}) };\n\t\t\t\tfor (const [key, value] of Object.entries(params.metadata)) {\n\t\t\t\t\tif (value === null) delete merged[key];\n\t\t\t\t\telse merged[key] = value;\n\t\t\t\t}\n\t\t\t\tif (Object.keys(merged).length) updated.metadata = merged;\n\t\t\t\telse delete updated.metadata;\n\t\t\t}\n\n\t\t\tconst items = [...state.items];\n\t\t\titems[index] = updated;\n\n\t\t\t// Exactly one in_progress: demote any other active tasks to pending.\n\t\t\tconst demotedIds: number[] = [];\n\t\t\tif (nextStatus === \"in_progress\") {\n\t\t\t\tfor (let i = 0; i < items.length; i++) {\n\t\t\t\t\tconst item = items[i];\n\t\t\t\t\tif (item.id === updated.id) continue;\n\t\t\t\t\tif (item.status !== \"in_progress\") continue;\n\t\t\t\t\titems[i] = { ...item, status: \"pending\" };\n\t\t\t\t\tdemotedIds.push(item.id);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst nextState: TodoState = { items, nextId: state.nextId };\n\t\t\tconst newlyCompleted = current.status !== \"completed\" && nextStatus === \"completed\";\n\t\t\treturn {\n\t\t\t\tstate: nextState,\n\t\t\t\toperation: {\n\t\t\t\t\tkind: \"update\",\n\t\t\t\t\tid: updated.id,\n\t\t\t\t\tfrom: current.status,\n\t\t\t\t\tto: updated.status,\n\t\t\t\t\t...(demotedIds.length ? { demotedIds } : {}),\n\t\t\t\t\t...(newlyCompleted && needsVerificationNudge(nextState) ? { verificationNudge: true } : {}),\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\n\t\tcase \"list\":\n\t\t\treturn {\n\t\t\t\tstate,\n\t\t\t\toperation: {\n\t\t\t\t\tkind: \"list\",\n\t\t\t\t\tstatus: params.status,\n\t\t\t\t\tincludeDeleted: params.includeDeleted === true,\n\t\t\t\t},\n\t\t\t};\n\n\t\tcase \"get\": {\n\t\t\tif (params.id === undefined) return error(state, \"id required for get\");\n\t\t\tconst item = findItem(state, params.id);\n\t\t\tif (!item) return error(state, `#${params.id} not found`);\n\t\t\treturn { state, operation: { kind: \"get\", item } };\n\t\t}\n\n\t\tcase \"delete\": {\n\t\t\tif (params.id === undefined) return error(state, \"id required for delete\");\n\t\t\tconst index = state.items.findIndex((item) => item.id === params.id);\n\t\t\tif (index === -1) return error(state, `#${params.id} not found`);\n\t\t\tconst current = state.items[index];\n\t\t\tif (current.status === \"deleted\") return error(state, `#${params.id} is already deleted`);\n\n\t\t\treturn {\n\t\t\t\tstate: markDeleted(state, current.id),\n\t\t\t\toperation: { kind: \"delete\", id: current.id, subject: current.subject },\n\t\t\t};\n\t\t}\n\n\t\tcase \"clear\":\n\t\t\treturn {\n\t\t\t\t// IDs remain monotonic across a clear so stale references cannot point\n\t\t\t\t// at an unrelated task created later on the same conversation branch.\n\t\t\t\tstate: { items: [], nextId: state.nextId },\n\t\t\t\toperation: { kind: \"clear\", count: state.items.length },\n\t\t\t};\n\t}\n\n\treturn error(state, `unknown action: ${(params as { action?: unknown }).action}`);\n}\n\nfunction isTodoDetails(value: unknown): value is TodoDetails {\n\tif (!value || typeof value !== \"object\") return false;\n\tconst record = value as Record<string, unknown>;\n\treturn Array.isArray(record.items) && typeof record.nextId === \"number\";\n}\n\nexport function replayTodosFromBranch(ctx: { sessionManager: { getBranch(): Iterable<unknown> } }): TodoState {\n\t// Latest todo toolResult wins; scan tail → head so long branches stop early.\n\tconst branch = Array.from(ctx.sessionManager.getBranch());\n\tfor (let i = branch.length - 1; i >= 0; i--) {\n\t\tconst item = branch[i] as {\n\t\t\ttype?: string;\n\t\t\tmessage?: { role?: string; toolName?: string; details?: unknown };\n\t\t};\n\t\tif (item.type !== \"message\") continue;\n\t\tif (item.message?.role !== \"toolResult\" || item.message.toolName !== TODO_TOOL_NAME) continue;\n\t\tif (!isTodoDetails(item.message.details)) continue;\n\t\treturn cloneState({\n\t\t\titems: item.message.details.items,\n\t\t\tnextId: item.message.details.nextId,\n\t\t});\n\t}\n\treturn cloneState(EMPTY_TODO_STATE);\n}\n\nexport function buildTodoDetails(params: TodoParams, next: TodoState, operation: Operation): TodoDetails {\n\treturn {\n\t\taction: params.action,\n\t\tparams: params as Record<string, unknown>,\n\t\titems: cloneState(next).items,\n\t\tnextId: next.nextId,\n\t\t...(operation.kind === \"error\" ? { error: operation.message } : {}),\n\t};\n}\n\nconst VERIFICATION_NUDGE_NOTE =\n\t\"NOTE: You closed out 3+ tasks with no verification/test/review step. Before the final summary, run checks or add a verification task and complete it — do not self-declare done with known failures.\";\n\nexport function formatTodoContent(operation: Operation, state: TodoState): string {\n\tswitch (operation.kind) {\n\t\tcase \"create\": {\n\t\t\tconst item = findItem(state, operation.id);\n\t\t\treturn item ? `Created #${item.id}: ${item.subject} (pending)` : `Created #${operation.id}`;\n\t\t}\n\t\tcase \"update\": {\n\t\t\tconst transition = operation.from === operation.to ? \"\" : ` (${operation.from} -> ${operation.to})`;\n\t\t\tlet text = `Updated #${operation.id}${transition}`;\n\t\t\tif (operation.demotedIds?.length) {\n\t\t\t\ttext += `; ${operation.demotedIds.map((id) => `#${id}`).join(\",\")} demoted to pending`;\n\t\t\t}\n\t\t\tif (operation.verificationNudge) text += `\\n\\n${VERIFICATION_NUDGE_NOTE}`;\n\t\t\treturn text;\n\t\t}\n\t\tcase \"delete\":\n\t\t\treturn `Deleted #${operation.id}: ${operation.subject}`;\n\t\tcase \"clear\":\n\t\t\treturn `Cleared ${operation.count} tasks`;\n\t\tcase \"list\": {\n\t\t\tlet view = state.items;\n\t\t\t// An explicit deleted-status query is sufficient intent to include tombstones.\n\t\t\tif (!operation.includeDeleted && operation.status !== \"deleted\")\n\t\t\t\tview = view.filter((item) => item.status !== \"deleted\");\n\t\t\tif (operation.status) view = view.filter((item) => item.status === operation.status);\n\t\t\treturn formatBoundedList(view, operation.status, operation.includeDeleted);\n\t\t}\n\t\tcase \"get\":\n\t\t\treturn formatDetailItem(operation.item, state);\n\t\tcase \"error\":\n\t\t\treturn `Error: ${operation.message}`;\n\t}\n}\n\n/**\n * Soft nudge when the whole list is done (no active work), there are 3+ completed\n * tasks, and none look like a verification/test/review step — mirrors CC TodoWrite.\n */\nfunction needsVerificationNudge(state: TodoState): boolean {\n\tconst active = state.items.filter((item) => item.status !== \"deleted\");\n\tif (active.length < 3) return false;\n\tif (active.some((item) => item.status === \"pending\" || item.status === \"in_progress\")) return false;\n\tconst completed = active.filter((item) => item.status === \"completed\");\n\tif (completed.length < 3) return false;\n\treturn !completed.some(\n\t\t(item) =>\n\t\t\tVERIFICATION_PATTERN.test(item.subject) ||\n\t\t\t(item.description !== undefined && VERIFICATION_PATTERN.test(item.description)),\n\t);\n}\n\nfunction formatBoundedList(view: TodoItem[], statusFilter: TodoStatus | undefined, includeDeleted: boolean): string {\n\tif (!view.length) return \"No tasks\";\n\tconst shown = view.slice(0, LIST_DISPLAY_MAX_ITEMS);\n\tconst lines = shown.map(formatListItem);\n\tconst omitted = view.length - shown.length;\n\tif (omitted > 0) {\n\t\tconst filterHint = statusFilter ? `status=${statusFilter}` : includeDeleted ? \"includeDeleted=true\" : \"list\";\n\t\tlines.push(\n\t\t\t`… and ${omitted} more (${shown.length} of ${view.length} shown). Narrow with ${filterHint} or use get with id=.`,\n\t\t);\n\t}\n\treturn lines.join(\"\\n\");\n}\n\nfunction formatListItem(item: TodoItem): string {\n\tconst deps = item.blockedBy?.length ? ` blockedBy=${item.blockedBy.map((id) => `#${id}`).join(\",\")}` : \"\";\n\tconst active = item.status === \"in_progress\" && item.activeForm ? ` (${item.activeForm})` : \"\";\n\treturn `[${item.status}] #${item.id} ${item.subject}${active}${deps}`;\n}\n\nfunction formatDetailItem(item: TodoItem, state: TodoState): string {\n\tconst lines = [`#${item.id} [${item.status}] ${item.subject}`];\n\tif (item.description) lines.push(`description: ${item.description}`);\n\tif (item.activeForm) lines.push(`activeForm: ${item.activeForm}`);\n\tif (item.blockedBy?.length) lines.push(`blockedBy: ${item.blockedBy.map((id) => `#${id}`).join(\", \")}`);\n\tconst blocks = state.items\n\t\t.filter((candidate) => candidate.blockedBy?.includes(item.id))\n\t\t.map((candidate) => candidate.id);\n\tif (blocks.length) lines.push(`blocks: ${blocks.map((id) => `#${id}`).join(\", \")}`);\n\tif (item.owner) lines.push(`owner: ${item.owner}`);\n\treturn lines.join(\"\\n\");\n}\n"]}