@code-yeongyu/senpi 2026.6.3 → 2026.6.6-3

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 (1075) hide show
  1. package/CHANGELOG.md +52 -4
  2. package/README.md +21 -4
  3. package/dist/bun/cli.d.ts.map +1 -1
  4. package/dist/bun/cli.js +1 -1
  5. package/dist/bun/cli.js.map +1 -1
  6. package/dist/bun/register-bedrock.d.ts.map +1 -1
  7. package/dist/bun/restore-sandbox-env.d.ts.map +1 -1
  8. package/dist/bun/restore-sandbox-env.js.map +1 -1
  9. package/dist/cli/args.d.ts +1 -0
  10. package/dist/cli/args.d.ts.map +1 -1
  11. package/dist/cli/args.js +14 -2
  12. package/dist/cli/args.js.map +1 -1
  13. package/dist/cli/config-selector.d.ts.map +1 -1
  14. package/dist/cli/config-selector.js.map +1 -1
  15. package/dist/cli/file-processor.d.ts.map +1 -1
  16. package/dist/cli/file-processor.js.map +1 -1
  17. package/dist/cli/initial-message.d.ts +1 -1
  18. package/dist/cli/initial-message.d.ts.map +1 -1
  19. package/dist/cli/initial-message.js.map +1 -1
  20. package/dist/cli/list-models.d.ts.map +1 -1
  21. package/dist/cli/list-models.js.map +1 -1
  22. package/dist/cli/session-picker.d.ts.map +1 -1
  23. package/dist/cli/session-picker.js.map +1 -1
  24. package/dist/cli-main.d.ts +3 -0
  25. package/dist/cli-main.d.ts.map +1 -0
  26. package/dist/cli-main.js +10 -0
  27. package/dist/cli-main.js.map +1 -0
  28. package/dist/cli.d.ts.map +1 -1
  29. package/dist/cli.js +46 -13
  30. package/dist/cli.js.map +1 -1
  31. package/dist/config.d.ts.map +1 -1
  32. package/dist/config.js.map +1 -1
  33. package/dist/core/agent-session-runtime.d.ts.map +1 -1
  34. package/dist/core/agent-session-runtime.js +0 -8
  35. package/dist/core/agent-session-runtime.js.map +1 -1
  36. package/dist/core/agent-session-services.d.ts.map +1 -1
  37. package/dist/core/agent-session-services.js.map +1 -1
  38. package/dist/core/agent-session.d.ts +32 -0
  39. package/dist/core/agent-session.d.ts.map +1 -1
  40. package/dist/core/agent-session.js +51 -79
  41. package/dist/core/agent-session.js.map +1 -1
  42. package/dist/core/auth-guidance.d.ts.map +1 -1
  43. package/dist/core/auth-guidance.js.map +1 -1
  44. package/dist/core/auth-storage.d.ts +4 -0
  45. package/dist/core/auth-storage.d.ts.map +1 -1
  46. package/dist/core/auth-storage.js +8 -11
  47. package/dist/core/auth-storage.js.map +1 -1
  48. package/dist/core/bash-executor.d.ts.map +1 -1
  49. package/dist/core/bash-executor.js.map +1 -1
  50. package/dist/core/compaction/branch-summarization.d.ts.map +1 -1
  51. package/dist/core/compaction/branch-summarization.js.map +1 -1
  52. package/dist/core/compaction/compaction.d.ts.map +1 -1
  53. package/dist/core/compaction/compaction.js.map +1 -1
  54. package/dist/core/compaction/index.d.ts.map +1 -1
  55. package/dist/core/compaction/utils.d.ts.map +1 -1
  56. package/dist/core/compaction/utils.js.map +1 -1
  57. package/dist/core/defaults.d.ts.map +1 -1
  58. package/dist/core/diagnostics.d.ts.map +1 -1
  59. package/dist/core/dynamic-prompt/build.d.ts.map +1 -1
  60. package/dist/core/dynamic-prompt/build.js.map +1 -1
  61. package/dist/core/dynamic-prompt/exploration.d.ts.map +1 -1
  62. package/dist/core/dynamic-prompt/exploration.js.map +1 -1
  63. package/dist/core/dynamic-prompt/identity.d.ts.map +1 -1
  64. package/dist/core/dynamic-prompt/identity.js.map +1 -1
  65. package/dist/core/dynamic-prompt/index.d.ts.map +1 -1
  66. package/dist/core/dynamic-prompt/intent-gate.d.ts.map +1 -1
  67. package/dist/core/dynamic-prompt/intent-gate.js.map +1 -1
  68. package/dist/core/dynamic-prompt/parallel-tools.d.ts.map +1 -1
  69. package/dist/core/dynamic-prompt/parallel-tools.js.map +1 -1
  70. package/dist/core/dynamic-prompt/policies.d.ts.map +1 -1
  71. package/dist/core/dynamic-prompt/policies.js.map +1 -1
  72. package/dist/core/dynamic-prompt/style.d.ts.map +1 -1
  73. package/dist/core/dynamic-prompt/style.js.map +1 -1
  74. package/dist/core/dynamic-prompt/tool-categorization.d.ts.map +1 -1
  75. package/dist/core/dynamic-prompt/tool-categorization.js.map +1 -1
  76. package/dist/core/dynamic-prompt/tool-section.d.ts.map +1 -1
  77. package/dist/core/dynamic-prompt/tool-section.js.map +1 -1
  78. package/dist/core/dynamic-prompt/types.d.ts.map +1 -1
  79. package/dist/core/dynamic-prompt/verification.d.ts.map +1 -1
  80. package/dist/core/dynamic-prompt/verification.js.map +1 -1
  81. package/dist/core/event-bus.d.ts.map +1 -1
  82. package/dist/core/event-bus.js.map +1 -1
  83. package/dist/core/exec.d.ts.map +1 -1
  84. package/dist/core/exec.js.map +1 -1
  85. package/dist/core/export-html/ansi-to-html.d.ts.map +1 -1
  86. package/dist/core/export-html/ansi-to-html.js.map +1 -1
  87. package/dist/core/export-html/index.d.ts.map +1 -1
  88. package/dist/core/export-html/index.js.map +1 -1
  89. package/dist/core/export-html/template.js +19 -6
  90. package/dist/core/export-html/tool-renderer.d.ts.map +1 -1
  91. package/dist/core/export-html/tool-renderer.js.map +1 -1
  92. package/dist/core/extensions/builtin/anthropic-bash/index.d.ts.map +1 -1
  93. package/dist/core/extensions/builtin/anthropic-bash/index.js.map +1 -1
  94. package/dist/core/extensions/builtin/anthropic-web-search/index.d.ts.map +1 -1
  95. package/dist/core/extensions/builtin/anthropic-web-search/index.js.map +1 -1
  96. package/dist/core/extensions/builtin/bash-timeout/index.d.ts.map +1 -1
  97. package/dist/core/extensions/builtin/bash-timeout/index.js.map +1 -1
  98. package/dist/core/extensions/builtin/bash-timeout/timeout.d.ts.map +1 -1
  99. package/dist/core/extensions/builtin/bash-timeout/timeout.js.map +1 -1
  100. package/dist/core/extensions/builtin/compaction/checkpoint-state.d.ts.map +1 -1
  101. package/dist/core/extensions/builtin/compaction/checkpoint-state.js.map +1 -1
  102. package/dist/core/extensions/builtin/compaction/circuit-breaker.d.ts.map +1 -1
  103. package/dist/core/extensions/builtin/compaction/circuit-breaker.js.map +1 -1
  104. package/dist/core/extensions/builtin/compaction/context-reduction.d.ts.map +1 -1
  105. package/dist/core/extensions/builtin/compaction/context-reduction.js +1 -1
  106. package/dist/core/extensions/builtin/compaction/context-reduction.js.map +1 -1
  107. package/dist/core/extensions/builtin/compaction/degradation-monitor.d.ts.map +1 -1
  108. package/dist/core/extensions/builtin/compaction/degradation-monitor.js.map +1 -1
  109. package/dist/core/extensions/builtin/compaction/index.d.ts.map +1 -1
  110. package/dist/core/extensions/builtin/compaction/index.js.map +1 -1
  111. package/dist/core/extensions/builtin/compaction/openai-remote.d.ts.map +1 -1
  112. package/dist/core/extensions/builtin/compaction/openai-remote.js.map +1 -1
  113. package/dist/core/extensions/builtin/compaction/overflow-detection.d.ts.map +1 -1
  114. package/dist/core/extensions/builtin/compaction/overflow-detection.js.map +1 -1
  115. package/dist/core/extensions/builtin/compaction/per-turn-cap.d.ts.map +1 -1
  116. package/dist/core/extensions/builtin/compaction/per-turn-cap.js.map +1 -1
  117. package/dist/core/extensions/builtin/compaction/policy.d.ts.map +1 -1
  118. package/dist/core/extensions/builtin/compaction/policy.js.map +1 -1
  119. package/dist/core/extensions/builtin/compaction/prompts.d.ts.map +1 -1
  120. package/dist/core/extensions/builtin/compaction/prompts.js.map +1 -1
  121. package/dist/core/extensions/builtin/compaction/repair-tool-pairs.d.ts.map +1 -1
  122. package/dist/core/extensions/builtin/compaction/repair-tool-pairs.js.map +1 -1
  123. package/dist/core/extensions/builtin/compaction/restoration-tracker.d.ts.map +1 -1
  124. package/dist/core/extensions/builtin/compaction/restoration-tracker.js.map +1 -1
  125. package/dist/core/extensions/builtin/compaction/speculative.d.ts.map +1 -1
  126. package/dist/core/extensions/builtin/compaction/speculative.js.map +1 -1
  127. package/dist/core/extensions/builtin/compaction/state.d.ts.map +1 -1
  128. package/dist/core/extensions/builtin/compaction/state.js.map +1 -1
  129. package/dist/core/extensions/builtin/compaction/todo-bridge.d.ts.map +1 -1
  130. package/dist/core/extensions/builtin/compaction/todo-bridge.js.map +1 -1
  131. package/dist/core/extensions/builtin/compaction/tool-truncation.d.ts.map +1 -1
  132. package/dist/core/extensions/builtin/compaction/tool-truncation.js.map +1 -1
  133. package/dist/core/extensions/builtin/diff.d.ts.map +1 -1
  134. package/dist/core/extensions/builtin/diff.js.map +1 -1
  135. package/dist/core/extensions/builtin/files.d.ts.map +1 -1
  136. package/dist/core/extensions/builtin/files.js.map +1 -1
  137. package/dist/core/extensions/builtin/gpt-apply-patch/apply.d.ts.map +1 -1
  138. package/dist/core/extensions/builtin/gpt-apply-patch/apply.js.map +1 -1
  139. package/dist/core/extensions/builtin/gpt-apply-patch/constants.d.ts.map +1 -1
  140. package/dist/core/extensions/builtin/gpt-apply-patch/constants.js.map +1 -1
  141. package/dist/core/extensions/builtin/gpt-apply-patch/errors.d.ts.map +1 -1
  142. package/dist/core/extensions/builtin/gpt-apply-patch/errors.js +0 -2
  143. package/dist/core/extensions/builtin/gpt-apply-patch/errors.js.map +1 -1
  144. package/dist/core/extensions/builtin/gpt-apply-patch/extension.d.ts.map +1 -1
  145. package/dist/core/extensions/builtin/gpt-apply-patch/extension.js.map +1 -1
  146. package/dist/core/extensions/builtin/gpt-apply-patch/index.d.ts.map +1 -1
  147. package/dist/core/extensions/builtin/gpt-apply-patch/params.d.ts.map +1 -1
  148. package/dist/core/extensions/builtin/gpt-apply-patch/params.js.map +1 -1
  149. package/dist/core/extensions/builtin/gpt-apply-patch/parser.d.ts.map +1 -1
  150. package/dist/core/extensions/builtin/gpt-apply-patch/parser.js.map +1 -1
  151. package/dist/core/extensions/builtin/gpt-apply-patch/patch-diff.d.ts.map +1 -1
  152. package/dist/core/extensions/builtin/gpt-apply-patch/patch-diff.js.map +1 -1
  153. package/dist/core/extensions/builtin/gpt-apply-patch/patch-replace.d.ts.map +1 -1
  154. package/dist/core/extensions/builtin/gpt-apply-patch/patch-replace.js.map +1 -1
  155. package/dist/core/extensions/builtin/gpt-apply-patch/preview-format.d.ts.map +1 -1
  156. package/dist/core/extensions/builtin/gpt-apply-patch/preview-format.js.map +1 -1
  157. package/dist/core/extensions/builtin/gpt-apply-patch/preview.d.ts.map +1 -1
  158. package/dist/core/extensions/builtin/gpt-apply-patch/preview.js.map +1 -1
  159. package/dist/core/extensions/builtin/gpt-apply-patch/seek-sequence.d.ts.map +1 -1
  160. package/dist/core/extensions/builtin/gpt-apply-patch/seek-sequence.js.map +1 -1
  161. package/dist/core/extensions/builtin/gpt-apply-patch/streaming-parser.d.ts.map +1 -1
  162. package/dist/core/extensions/builtin/gpt-apply-patch/streaming-parser.js +7 -5
  163. package/dist/core/extensions/builtin/gpt-apply-patch/streaming-parser.js.map +1 -1
  164. package/dist/core/extensions/builtin/gpt-apply-patch/streaming-render.d.ts.map +1 -1
  165. package/dist/core/extensions/builtin/gpt-apply-patch/streaming-render.js.map +1 -1
  166. package/dist/core/extensions/builtin/gpt-apply-patch/text.d.ts.map +1 -1
  167. package/dist/core/extensions/builtin/gpt-apply-patch/text.js.map +1 -1
  168. package/dist/core/extensions/builtin/gpt-apply-patch/tool.d.ts.map +1 -1
  169. package/dist/core/extensions/builtin/gpt-apply-patch/tool.js.map +1 -1
  170. package/dist/core/extensions/builtin/gpt-apply-patch/types.d.ts.map +1 -1
  171. package/dist/core/extensions/builtin/gpt-apply-patch/workspace.d.ts.map +1 -1
  172. package/dist/core/extensions/builtin/gpt-apply-patch/workspace.js.map +1 -1
  173. package/dist/core/extensions/builtin/history-search/filter.d.ts.map +1 -1
  174. package/dist/core/extensions/builtin/history-search/filter.js.map +1 -1
  175. package/dist/core/extensions/builtin/history-search/index.d.ts.map +1 -1
  176. package/dist/core/extensions/builtin/history-search/index.js.map +1 -1
  177. package/dist/core/extensions/builtin/history-search/indexer.d.ts.map +1 -1
  178. package/dist/core/extensions/builtin/history-search/indexer.js.map +1 -1
  179. package/dist/core/extensions/builtin/history-search/overlay.d.ts.map +1 -1
  180. package/dist/core/extensions/builtin/history-search/overlay.js +3 -6
  181. package/dist/core/extensions/builtin/history-search/overlay.js.map +1 -1
  182. package/dist/core/extensions/builtin/history-search/types.d.ts.map +1 -1
  183. package/dist/core/extensions/builtin/index.d.ts.map +1 -1
  184. package/dist/core/extensions/builtin/kimi-web-search/index.d.ts.map +1 -1
  185. package/dist/core/extensions/builtin/kimi-web-search/index.js.map +1 -1
  186. package/dist/core/extensions/builtin/openai-web-search/index.d.ts.map +1 -1
  187. package/dist/core/extensions/builtin/openai-web-search/index.js.map +1 -1
  188. package/dist/core/extensions/builtin/permission-system/arity.d.ts.map +1 -1
  189. package/dist/core/extensions/builtin/permission-system/arity.js.map +1 -1
  190. package/dist/core/extensions/builtin/permission-system/cli.d.ts.map +1 -1
  191. package/dist/core/extensions/builtin/permission-system/cli.js.map +1 -1
  192. package/dist/core/extensions/builtin/permission-system/config.d.ts.map +1 -1
  193. package/dist/core/extensions/builtin/permission-system/config.js.map +1 -1
  194. package/dist/core/extensions/builtin/permission-system/evaluate.d.ts.map +1 -1
  195. package/dist/core/extensions/builtin/permission-system/evaluate.js.map +1 -1
  196. package/dist/core/extensions/builtin/permission-system/events.d.ts.map +1 -1
  197. package/dist/core/extensions/builtin/permission-system/events.js.map +1 -1
  198. package/dist/core/extensions/builtin/permission-system/external-dir.d.ts.map +1 -1
  199. package/dist/core/extensions/builtin/permission-system/external-dir.js.map +1 -1
  200. package/dist/core/extensions/builtin/permission-system/index.d.ts.map +1 -1
  201. package/dist/core/extensions/builtin/permission-system/index.js.map +1 -1
  202. package/dist/core/extensions/builtin/permission-system/non-interactive.d.ts.map +1 -1
  203. package/dist/core/extensions/builtin/permission-system/non-interactive.js.map +1 -1
  204. package/dist/core/extensions/builtin/permission-system/parsers.d.ts.map +1 -1
  205. package/dist/core/extensions/builtin/permission-system/parsers.js +3 -1
  206. package/dist/core/extensions/builtin/permission-system/parsers.js.map +1 -1
  207. package/dist/core/extensions/builtin/permission-system/prompt.d.ts.map +1 -1
  208. package/dist/core/extensions/builtin/permission-system/prompt.js.map +1 -1
  209. package/dist/core/extensions/builtin/permission-system/service.d.ts.map +1 -1
  210. package/dist/core/extensions/builtin/permission-system/service.js +2 -5
  211. package/dist/core/extensions/builtin/permission-system/service.js.map +1 -1
  212. package/dist/core/extensions/builtin/permission-system/settings.d.ts.map +1 -1
  213. package/dist/core/extensions/builtin/permission-system/settings.js.map +1 -1
  214. package/dist/core/extensions/builtin/permission-system/storage.d.ts.map +1 -1
  215. package/dist/core/extensions/builtin/permission-system/storage.js.map +1 -1
  216. package/dist/core/extensions/builtin/permission-system/types.d.ts.map +1 -1
  217. package/dist/core/extensions/builtin/permission-system/types.js +3 -5
  218. package/dist/core/extensions/builtin/permission-system/types.js.map +1 -1
  219. package/dist/core/extensions/builtin/permission-system/wildcard.d.ts.map +1 -1
  220. package/dist/core/extensions/builtin/permission-system/wildcard.js.map +1 -1
  221. package/dist/core/extensions/builtin/prompt-preset/claude-opus-4-5.d.ts.map +1 -1
  222. package/dist/core/extensions/builtin/prompt-preset/claude-opus-4-5.js.map +1 -1
  223. package/dist/core/extensions/builtin/prompt-preset/claude-opus-4-6.d.ts.map +1 -1
  224. package/dist/core/extensions/builtin/prompt-preset/claude-opus-4-6.js.map +1 -1
  225. package/dist/core/extensions/builtin/prompt-preset/claude-opus-4-7.d.ts.map +1 -1
  226. package/dist/core/extensions/builtin/prompt-preset/claude-opus-4-7.js.map +1 -1
  227. package/dist/core/extensions/builtin/prompt-preset/file-operations.d.ts.map +1 -1
  228. package/dist/core/extensions/builtin/prompt-preset/file-operations.js.map +1 -1
  229. package/dist/core/extensions/builtin/prompt-preset/gpt-5.2.d.ts.map +1 -1
  230. package/dist/core/extensions/builtin/prompt-preset/gpt-5.2.js.map +1 -1
  231. package/dist/core/extensions/builtin/prompt-preset/gpt-5.3-codex.d.ts.map +1 -1
  232. package/dist/core/extensions/builtin/prompt-preset/gpt-5.3-codex.js.map +1 -1
  233. package/dist/core/extensions/builtin/prompt-preset/gpt-5.4.d.ts.map +1 -1
  234. package/dist/core/extensions/builtin/prompt-preset/gpt-5.4.js.map +1 -1
  235. package/dist/core/extensions/builtin/prompt-preset/gpt-5.5.d.ts.map +1 -1
  236. package/dist/core/extensions/builtin/prompt-preset/gpt-5.5.js.map +1 -1
  237. package/dist/core/extensions/builtin/prompt-preset/gpt-5.d.ts.map +1 -1
  238. package/dist/core/extensions/builtin/prompt-preset/gpt-5.js.map +1 -1
  239. package/dist/core/extensions/builtin/prompt-preset/index.d.ts.map +1 -1
  240. package/dist/core/extensions/builtin/prompt-preset/index.js.map +1 -1
  241. package/dist/core/extensions/builtin/prompt-preset/kimi-k2-6.d.ts.map +1 -1
  242. package/dist/core/extensions/builtin/prompt-preset/kimi-k2-6.js.map +1 -1
  243. package/dist/core/extensions/builtin/prompt-preset/presets.d.ts.map +1 -1
  244. package/dist/core/extensions/builtin/prompt-preset/presets.js.map +1 -1
  245. package/dist/core/extensions/builtin/prompt-preset/settings.d.ts.map +1 -1
  246. package/dist/core/extensions/builtin/prompt-preset/settings.js.map +1 -1
  247. package/dist/core/extensions/builtin/prompt-url-widget.d.ts.map +1 -1
  248. package/dist/core/extensions/builtin/prompt-url-widget.js.map +1 -1
  249. package/dist/core/extensions/builtin/redraws.d.ts.map +1 -1
  250. package/dist/core/extensions/builtin/redraws.js.map +1 -1
  251. package/dist/core/extensions/builtin/service-tier.d.ts.map +1 -1
  252. package/dist/core/extensions/builtin/service-tier.js.map +1 -1
  253. package/dist/core/extensions/builtin/session-observer/index.d.ts.map +1 -1
  254. package/dist/core/extensions/builtin/session-observer/index.js.map +1 -1
  255. package/dist/core/extensions/builtin/session-observer/loader.d.ts.map +1 -1
  256. package/dist/core/extensions/builtin/session-observer/loader.js.map +1 -1
  257. package/dist/core/extensions/builtin/session-observer/overlay-format.d.ts.map +1 -1
  258. package/dist/core/extensions/builtin/session-observer/overlay-format.js.map +1 -1
  259. package/dist/core/extensions/builtin/session-observer/overlay.d.ts.map +1 -1
  260. package/dist/core/extensions/builtin/session-observer/overlay.js +13 -18
  261. package/dist/core/extensions/builtin/session-observer/overlay.js.map +1 -1
  262. package/dist/core/extensions/builtin/session-observer/scanner.d.ts.map +1 -1
  263. package/dist/core/extensions/builtin/session-observer/scanner.js.map +1 -1
  264. package/dist/core/extensions/builtin/session-observer/text.d.ts.map +1 -1
  265. package/dist/core/extensions/builtin/session-observer/text.js.map +1 -1
  266. package/dist/core/extensions/builtin/session-observer/transcript-entries.d.ts.map +1 -1
  267. package/dist/core/extensions/builtin/session-observer/transcript-entries.js.map +1 -1
  268. package/dist/core/extensions/builtin/session-observer/transcript-format.d.ts.map +1 -1
  269. package/dist/core/extensions/builtin/session-observer/transcript-format.js.map +1 -1
  270. package/dist/core/extensions/builtin/session-observer/transcript.d.ts.map +1 -1
  271. package/dist/core/extensions/builtin/session-observer/transcript.js.map +1 -1
  272. package/dist/core/extensions/builtin/session-observer/types.d.ts.map +1 -1
  273. package/dist/core/extensions/builtin/system-messages.d.ts.map +1 -1
  274. package/dist/core/extensions/builtin/system-messages.js.map +1 -1
  275. package/dist/core/extensions/builtin/todotools/continuation/config.d.ts +1 -1
  276. package/dist/core/extensions/builtin/todotools/continuation/config.d.ts.map +1 -1
  277. package/dist/core/extensions/builtin/todotools/continuation/config.js.map +1 -1
  278. package/dist/core/extensions/builtin/todotools/continuation/index.d.ts.map +1 -1
  279. package/dist/core/extensions/builtin/todotools/continuation/prompt.d.ts.map +1 -1
  280. package/dist/core/extensions/builtin/todotools/continuation/prompt.js.map +1 -1
  281. package/dist/core/extensions/builtin/todotools/continuation/runtime.d.ts.map +1 -1
  282. package/dist/core/extensions/builtin/todotools/continuation/runtime.js.map +1 -1
  283. package/dist/core/extensions/builtin/todotools/index.d.ts.map +1 -1
  284. package/dist/core/extensions/builtin/todotools/index.js.map +1 -1
  285. package/dist/core/extensions/builtin/todotools/prompt.d.ts.map +1 -1
  286. package/dist/core/extensions/builtin/todotools/settings.d.ts.map +1 -1
  287. package/dist/core/extensions/builtin/todotools/settings.js.map +1 -1
  288. package/dist/core/extensions/builtin/todotools/state.d.ts.map +1 -1
  289. package/dist/core/extensions/builtin/todotools/state.js.map +1 -1
  290. package/dist/core/extensions/builtin/todotools/system-messages.d.ts.map +1 -1
  291. package/dist/core/extensions/builtin/todotools/system-messages.js.map +1 -1
  292. package/dist/core/extensions/builtin/todotools/tools/todoread.d.ts.map +1 -1
  293. package/dist/core/extensions/builtin/todotools/tools/todoread.js.map +1 -1
  294. package/dist/core/extensions/builtin/todotools/tools/todowrite.d.ts.map +1 -1
  295. package/dist/core/extensions/builtin/todotools/tools/todowrite.js.map +1 -1
  296. package/dist/core/extensions/builtin/tool-pair-guard/index.d.ts.map +1 -1
  297. package/dist/core/extensions/builtin/tool-pair-guard/index.js.map +1 -1
  298. package/dist/core/extensions/builtin/tool-pair-guard/sanitize-anthropic-payload.d.ts.map +1 -1
  299. package/dist/core/extensions/builtin/tool-pair-guard/sanitize-anthropic-payload.js.map +1 -1
  300. package/dist/core/extensions/builtin/tool-pair-guard/sanitize-openai-chat-completions-payload.d.ts.map +1 -1
  301. package/dist/core/extensions/builtin/tool-pair-guard/sanitize-openai-chat-completions-payload.js.map +1 -1
  302. package/dist/core/extensions/builtin/tool-pair-guard/sanitize-openai-responses-payload.d.ts.map +1 -1
  303. package/dist/core/extensions/builtin/tool-pair-guard/sanitize-openai-responses-payload.js.map +1 -1
  304. package/dist/core/extensions/builtin/tps.d.ts.map +1 -1
  305. package/dist/core/extensions/builtin/tps.js.map +1 -1
  306. package/dist/core/extensions/index.d.ts.map +1 -1
  307. package/dist/core/extensions/loader.d.ts.map +1 -1
  308. package/dist/core/extensions/loader.js.map +1 -1
  309. package/dist/core/extensions/runner.d.ts.map +1 -1
  310. package/dist/core/extensions/runner.js +35 -43
  311. package/dist/core/extensions/runner.js.map +1 -1
  312. package/dist/core/extensions/types.d.ts +1 -1
  313. package/dist/core/extensions/types.d.ts.map +1 -1
  314. package/dist/core/extensions/types.js.map +1 -1
  315. package/dist/core/extensions/wrapper.d.ts.map +1 -1
  316. package/dist/core/extensions/wrapper.js.map +1 -1
  317. package/dist/core/footer-data-provider.d.ts.map +1 -1
  318. package/dist/core/footer-data-provider.js +17 -18
  319. package/dist/core/footer-data-provider.js.map +1 -1
  320. package/dist/core/http-dispatcher.d.ts.map +1 -1
  321. package/dist/core/http-dispatcher.js.map +1 -1
  322. package/dist/core/index.d.ts.map +1 -1
  323. package/dist/core/keybindings.d.ts +1 -1
  324. package/dist/core/keybindings.d.ts.map +1 -1
  325. package/dist/core/keybindings.js +0 -1
  326. package/dist/core/keybindings.js.map +1 -1
  327. package/dist/core/messages.d.ts.map +1 -1
  328. package/dist/core/messages.js.map +1 -1
  329. package/dist/core/model-registry.d.ts.map +1 -1
  330. package/dist/core/model-registry.js +8 -10
  331. package/dist/core/model-registry.js.map +1 -1
  332. package/dist/core/model-resolver.d.ts.map +1 -1
  333. package/dist/core/model-resolver.js +2 -0
  334. package/dist/core/model-resolver.js.map +1 -1
  335. package/dist/core/output-guard.d.ts.map +1 -1
  336. package/dist/core/output-guard.js.map +1 -1
  337. package/dist/core/package-manager.d.ts +3 -0
  338. package/dist/core/package-manager.d.ts.map +1 -1
  339. package/dist/core/package-manager.js +47 -19
  340. package/dist/core/package-manager.js.map +1 -1
  341. package/dist/core/prompt-templates.d.ts.map +1 -1
  342. package/dist/core/prompt-templates.js.map +1 -1
  343. package/dist/core/provider-attribution.d.ts.map +1 -1
  344. package/dist/core/provider-attribution.js.map +1 -1
  345. package/dist/core/provider-display-names.d.ts.map +1 -1
  346. package/dist/core/provider-display-names.js +2 -0
  347. package/dist/core/provider-display-names.js.map +1 -1
  348. package/dist/core/resolve-config-value.d.ts.map +1 -1
  349. package/dist/core/resolve-config-value.js.map +1 -1
  350. package/dist/core/resource-loader.d.ts +1 -0
  351. package/dist/core/resource-loader.d.ts.map +1 -1
  352. package/dist/core/resource-loader.js +26 -53
  353. package/dist/core/resource-loader.js.map +1 -1
  354. package/dist/core/sdk.d.ts.map +1 -1
  355. package/dist/core/sdk.js.map +1 -1
  356. package/dist/core/session-cwd.d.ts.map +1 -1
  357. package/dist/core/session-cwd.js +0 -1
  358. package/dist/core/session-cwd.js.map +1 -1
  359. package/dist/core/session-manager.d.ts.map +1 -1
  360. package/dist/core/session-manager.js +7 -11
  361. package/dist/core/session-manager.js.map +1 -1
  362. package/dist/core/session-work-barrier.d.ts.map +1 -1
  363. package/dist/core/session-work-barrier.js +5 -3
  364. package/dist/core/session-work-barrier.js.map +1 -1
  365. package/dist/core/settings-manager.d.ts +10 -2
  366. package/dist/core/settings-manager.d.ts.map +1 -1
  367. package/dist/core/settings-manager.js +77 -46
  368. package/dist/core/settings-manager.js.map +1 -1
  369. package/dist/core/skills.d.ts.map +1 -1
  370. package/dist/core/skills.js.map +1 -1
  371. package/dist/core/slash-commands.d.ts.map +1 -1
  372. package/dist/core/slash-commands.js +1 -0
  373. package/dist/core/slash-commands.js.map +1 -1
  374. package/dist/core/source-info.d.ts.map +1 -1
  375. package/dist/core/source-info.js.map +1 -1
  376. package/dist/core/system-prompt.d.ts.map +1 -1
  377. package/dist/core/system-prompt.js.map +1 -1
  378. package/dist/core/telemetry.d.ts.map +1 -1
  379. package/dist/core/telemetry.js.map +1 -1
  380. package/dist/core/thinking-levels.d.ts.map +1 -1
  381. package/dist/core/thinking-levels.js.map +1 -1
  382. package/dist/core/timings.d.ts.map +1 -1
  383. package/dist/core/timings.js.map +1 -1
  384. package/dist/core/tools/bash.d.ts.map +1 -1
  385. package/dist/core/tools/bash.js +9 -6
  386. package/dist/core/tools/bash.js.map +1 -1
  387. package/dist/core/tools/diff-render.d.ts.map +1 -1
  388. package/dist/core/tools/diff-render.js.map +1 -1
  389. package/dist/core/tools/edit-diff.d.ts.map +1 -1
  390. package/dist/core/tools/edit-diff.js.map +1 -1
  391. package/dist/core/tools/edit.d.ts.map +1 -1
  392. package/dist/core/tools/edit.js.map +1 -1
  393. package/dist/core/tools/file-mutation-queue.d.ts.map +1 -1
  394. package/dist/core/tools/file-mutation-queue.js.map +1 -1
  395. package/dist/core/tools/find.d.ts.map +1 -1
  396. package/dist/core/tools/find.js +1 -1
  397. package/dist/core/tools/find.js.map +1 -1
  398. package/dist/core/tools/grep.d.ts.map +1 -1
  399. package/dist/core/tools/grep.js +1 -1
  400. package/dist/core/tools/grep.js.map +1 -1
  401. package/dist/core/tools/index.d.ts.map +1 -1
  402. package/dist/core/tools/index.js.map +1 -1
  403. package/dist/core/tools/ls.d.ts.map +1 -1
  404. package/dist/core/tools/ls.js +1 -1
  405. package/dist/core/tools/ls.js.map +1 -1
  406. package/dist/core/tools/output-accumulator.d.ts.map +1 -1
  407. package/dist/core/tools/output-accumulator.js +12 -18
  408. package/dist/core/tools/output-accumulator.js.map +1 -1
  409. package/dist/core/tools/path-utils.d.ts.map +1 -1
  410. package/dist/core/tools/path-utils.js.map +1 -1
  411. package/dist/core/tools/read.d.ts.map +1 -1
  412. package/dist/core/tools/read.js +1 -1
  413. package/dist/core/tools/read.js.map +1 -1
  414. package/dist/core/tools/render-utils.d.ts.map +1 -1
  415. package/dist/core/tools/render-utils.js.map +1 -1
  416. package/dist/core/tools/tool-definition-wrapper.d.ts.map +1 -1
  417. package/dist/core/tools/tool-definition-wrapper.js.map +1 -1
  418. package/dist/core/tools/truncate.d.ts.map +1 -1
  419. package/dist/core/tools/truncate.js.map +1 -1
  420. package/dist/core/tools/write.d.ts.map +1 -1
  421. package/dist/core/tools/write.js +1 -2
  422. package/dist/core/tools/write.js.map +1 -1
  423. package/dist/core/trust-manager.d.ts +9 -0
  424. package/dist/core/trust-manager.d.ts.map +1 -0
  425. package/dist/core/trust-manager.js +133 -0
  426. package/dist/core/trust-manager.js.map +1 -0
  427. package/dist/index.d.ts +2 -1
  428. package/dist/index.d.ts.map +1 -1
  429. package/dist/index.js +1 -0
  430. package/dist/index.js.map +1 -1
  431. package/dist/main.d.ts.map +1 -1
  432. package/dist/main.js +54 -2
  433. package/dist/main.js.map +1 -1
  434. package/dist/migrations.d.ts.map +1 -1
  435. package/dist/migrations.js.map +1 -1
  436. package/dist/modes/index.d.ts.map +1 -1
  437. package/dist/modes/interactive/components/armin.d.ts.map +1 -1
  438. package/dist/modes/interactive/components/armin.js +6 -10
  439. package/dist/modes/interactive/components/armin.js.map +1 -1
  440. package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  441. package/dist/modes/interactive/components/assistant-message.js +2 -11
  442. package/dist/modes/interactive/components/assistant-message.js.map +1 -1
  443. package/dist/modes/interactive/components/bash-execution.d.ts.map +1 -1
  444. package/dist/modes/interactive/components/bash-execution.js +6 -11
  445. package/dist/modes/interactive/components/bash-execution.js.map +1 -1
  446. package/dist/modes/interactive/components/bordered-loader.d.ts.map +1 -1
  447. package/dist/modes/interactive/components/bordered-loader.js +0 -3
  448. package/dist/modes/interactive/components/bordered-loader.js.map +1 -1
  449. package/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -1
  450. package/dist/modes/interactive/components/branch-summary-message.js +1 -3
  451. package/dist/modes/interactive/components/branch-summary-message.js.map +1 -1
  452. package/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -1
  453. package/dist/modes/interactive/components/compaction-summary-message.js +1 -3
  454. package/dist/modes/interactive/components/compaction-summary-message.js.map +1 -1
  455. package/dist/modes/interactive/components/config-selector.d.ts.map +1 -1
  456. package/dist/modes/interactive/components/config-selector.js +5 -15
  457. package/dist/modes/interactive/components/config-selector.js.map +1 -1
  458. package/dist/modes/interactive/components/countdown-timer.d.ts.map +1 -1
  459. package/dist/modes/interactive/components/countdown-timer.js +0 -5
  460. package/dist/modes/interactive/components/countdown-timer.js.map +1 -1
  461. package/dist/modes/interactive/components/custom-editor.d.ts.map +1 -1
  462. package/dist/modes/interactive/components/custom-editor.js +1 -8
  463. package/dist/modes/interactive/components/custom-editor.js.map +1 -1
  464. package/dist/modes/interactive/components/custom-message.d.ts.map +1 -1
  465. package/dist/modes/interactive/components/custom-message.js +1 -6
  466. package/dist/modes/interactive/components/custom-message.js.map +1 -1
  467. package/dist/modes/interactive/components/daxnuts.d.ts.map +1 -1
  468. package/dist/modes/interactive/components/daxnuts.js +6 -8
  469. package/dist/modes/interactive/components/daxnuts.js.map +1 -1
  470. package/dist/modes/interactive/components/diff.d.ts.map +1 -1
  471. package/dist/modes/interactive/components/diff.js +2 -2
  472. package/dist/modes/interactive/components/diff.js.map +1 -1
  473. package/dist/modes/interactive/components/dynamic-border.d.ts.map +1 -1
  474. package/dist/modes/interactive/components/dynamic-border.js +0 -1
  475. package/dist/modes/interactive/components/dynamic-border.js.map +1 -1
  476. package/dist/modes/interactive/components/earendil-announcement.d.ts.map +1 -1
  477. package/dist/modes/interactive/components/earendil-announcement.js.map +1 -1
  478. package/dist/modes/interactive/components/extension-editor.d.ts.map +1 -1
  479. package/dist/modes/interactive/components/extension-editor.js +1 -6
  480. package/dist/modes/interactive/components/extension-editor.js.map +1 -1
  481. package/dist/modes/interactive/components/extension-input.d.ts.map +1 -1
  482. package/dist/modes/interactive/components/extension-input.js +2 -8
  483. package/dist/modes/interactive/components/extension-input.js.map +1 -1
  484. package/dist/modes/interactive/components/extension-selector.d.ts.map +1 -1
  485. package/dist/modes/interactive/components/extension-selector.js +1 -9
  486. package/dist/modes/interactive/components/extension-selector.js.map +1 -1
  487. package/dist/modes/interactive/components/favorite-models-selector.d.ts.map +1 -1
  488. package/dist/modes/interactive/components/favorite-models-selector.js +9 -15
  489. package/dist/modes/interactive/components/favorite-models-selector.js.map +1 -1
  490. package/dist/modes/interactive/components/footer.d.ts.map +1 -1
  491. package/dist/modes/interactive/components/footer.js +10 -3
  492. package/dist/modes/interactive/components/footer.js.map +1 -1
  493. package/dist/modes/interactive/components/index.d.ts +1 -0
  494. package/dist/modes/interactive/components/index.d.ts.map +1 -1
  495. package/dist/modes/interactive/components/index.js +1 -0
  496. package/dist/modes/interactive/components/index.js.map +1 -1
  497. package/dist/modes/interactive/components/keybinding-hints.d.ts.map +1 -1
  498. package/dist/modes/interactive/components/keybinding-hints.js.map +1 -1
  499. package/dist/modes/interactive/components/login-dialog.d.ts +0 -1
  500. package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
  501. package/dist/modes/interactive/components/login-dialog.js +6 -21
  502. package/dist/modes/interactive/components/login-dialog.js.map +1 -1
  503. package/dist/modes/interactive/components/model-favorites.d.ts.map +1 -1
  504. package/dist/modes/interactive/components/model-favorites.js.map +1 -1
  505. package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
  506. package/dist/modes/interactive/components/model-selector.js +9 -22
  507. package/dist/modes/interactive/components/model-selector.js.map +1 -1
  508. package/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -1
  509. package/dist/modes/interactive/components/oauth-selector.js +3 -12
  510. package/dist/modes/interactive/components/oauth-selector.js.map +1 -1
  511. package/dist/modes/interactive/components/session-selector-search.d.ts.map +1 -1
  512. package/dist/modes/interactive/components/session-selector-search.js.map +1 -1
  513. package/dist/modes/interactive/components/session-selector.d.ts.map +1 -1
  514. package/dist/modes/interactive/components/session-selector.js +33 -58
  515. package/dist/modes/interactive/components/session-selector.js.map +1 -1
  516. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  517. package/dist/modes/interactive/components/settings-selector.js +0 -4
  518. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  519. package/dist/modes/interactive/components/show-images-selector.d.ts.map +1 -1
  520. package/dist/modes/interactive/components/show-images-selector.js +0 -1
  521. package/dist/modes/interactive/components/show-images-selector.js.map +1 -1
  522. package/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -1
  523. package/dist/modes/interactive/components/skill-invocation-message.js +1 -3
  524. package/dist/modes/interactive/components/skill-invocation-message.js.map +1 -1
  525. package/dist/modes/interactive/components/theme-selector.d.ts.map +1 -1
  526. package/dist/modes/interactive/components/theme-selector.js +0 -2
  527. package/dist/modes/interactive/components/theme-selector.js.map +1 -1
  528. package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -1
  529. package/dist/modes/interactive/components/thinking-selector.js +0 -1
  530. package/dist/modes/interactive/components/thinking-selector.js.map +1 -1
  531. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  532. package/dist/modes/interactive/components/tool-execution.js +9 -28
  533. package/dist/modes/interactive/components/tool-execution.js.map +1 -1
  534. package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -1
  535. package/dist/modes/interactive/components/tree-selector.js +18 -32
  536. package/dist/modes/interactive/components/tree-selector.js.map +1 -1
  537. package/dist/modes/interactive/components/trust-selector.d.ts +20 -0
  538. package/dist/modes/interactive/components/trust-selector.d.ts.map +1 -0
  539. package/dist/modes/interactive/components/trust-selector.js +81 -0
  540. package/dist/modes/interactive/components/trust-selector.js.map +1 -0
  541. package/dist/modes/interactive/components/user-message-selector.d.ts.map +1 -1
  542. package/dist/modes/interactive/components/user-message-selector.js +3 -6
  543. package/dist/modes/interactive/components/user-message-selector.js.map +1 -1
  544. package/dist/modes/interactive/components/user-message.d.ts.map +1 -1
  545. package/dist/modes/interactive/components/user-message.js +0 -1
  546. package/dist/modes/interactive/components/user-message.js.map +1 -1
  547. package/dist/modes/interactive/components/visual-truncate.d.ts.map +1 -1
  548. package/dist/modes/interactive/components/visual-truncate.js.map +1 -1
  549. package/dist/modes/interactive/interactive-mode.d.ts +24 -0
  550. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  551. package/dist/modes/interactive/interactive-mode.js +112 -101
  552. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  553. package/dist/modes/interactive/session-info-format.d.ts.map +1 -1
  554. package/dist/modes/interactive/session-info-format.js.map +1 -1
  555. package/dist/modes/interactive/startup-tools.d.ts.map +1 -1
  556. package/dist/modes/interactive/startup-tools.js.map +1 -1
  557. package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  558. package/dist/modes/interactive/theme/theme.js +0 -6
  559. package/dist/modes/interactive/theme/theme.js.map +1 -1
  560. package/dist/modes/interactive/working-status.d.ts.map +1 -1
  561. package/dist/modes/interactive/working-status.js.map +1 -1
  562. package/dist/modes/print-mode.d.ts.map +1 -1
  563. package/dist/modes/print-mode.js.map +1 -1
  564. package/dist/modes/provider-native-rendering.d.ts.map +1 -1
  565. package/dist/modes/provider-native-rendering.js.map +1 -1
  566. package/dist/modes/rpc/jsonl.d.ts.map +1 -1
  567. package/dist/modes/rpc/jsonl.js.map +1 -1
  568. package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
  569. package/dist/modes/rpc/rpc-client.js +7 -8
  570. package/dist/modes/rpc/rpc-client.js.map +1 -1
  571. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  572. package/dist/modes/rpc/rpc-mode.js.map +1 -1
  573. package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
  574. package/dist/package-manager-cli.d.ts.map +1 -1
  575. package/dist/package-manager-cli.js +56 -9
  576. package/dist/package-manager-cli.js.map +1 -1
  577. package/dist/self-update-bootstrap.d.ts +19 -0
  578. package/dist/self-update-bootstrap.d.ts.map +1 -0
  579. package/dist/self-update-bootstrap.js +160 -0
  580. package/dist/self-update-bootstrap.js.map +1 -0
  581. package/dist/senpi +46 -13
  582. package/dist/utils/ansi.d.ts.map +1 -1
  583. package/dist/utils/ansi.js.map +1 -1
  584. package/dist/utils/changelog.d.ts.map +1 -1
  585. package/dist/utils/changelog.js.map +1 -1
  586. package/dist/utils/child-process.d.ts.map +1 -1
  587. package/dist/utils/child-process.js.map +1 -1
  588. package/dist/utils/clipboard-image.d.ts.map +1 -1
  589. package/dist/utils/clipboard-image.js.map +1 -1
  590. package/dist/utils/clipboard-native.d.ts.map +1 -1
  591. package/dist/utils/clipboard-native.js.map +1 -1
  592. package/dist/utils/clipboard.d.ts.map +1 -1
  593. package/dist/utils/clipboard.js.map +1 -1
  594. package/dist/utils/deprecation.d.ts.map +1 -1
  595. package/dist/utils/deprecation.js.map +1 -1
  596. package/dist/utils/exif-orientation.d.ts.map +1 -1
  597. package/dist/utils/exif-orientation.js.map +1 -1
  598. package/dist/utils/frontmatter.d.ts.map +1 -1
  599. package/dist/utils/frontmatter.js.map +1 -1
  600. package/dist/utils/fs-watch.d.ts.map +1 -1
  601. package/dist/utils/fs-watch.js.map +1 -1
  602. package/dist/utils/git.d.ts.map +1 -1
  603. package/dist/utils/git.js +54 -22
  604. package/dist/utils/git.js.map +1 -1
  605. package/dist/utils/html.d.ts.map +1 -1
  606. package/dist/utils/html.js.map +1 -1
  607. package/dist/utils/image-convert.d.ts.map +1 -1
  608. package/dist/utils/image-convert.js.map +1 -1
  609. package/dist/utils/image-resize-core.d.ts.map +1 -1
  610. package/dist/utils/image-resize-core.js.map +1 -1
  611. package/dist/utils/image-resize-worker.d.ts.map +1 -1
  612. package/dist/utils/image-resize-worker.js.map +1 -1
  613. package/dist/utils/image-resize.d.ts.map +1 -1
  614. package/dist/utils/image-resize.js.map +1 -1
  615. package/dist/utils/json.d.ts.map +1 -1
  616. package/dist/utils/json.js.map +1 -1
  617. package/dist/utils/mime.d.ts.map +1 -1
  618. package/dist/utils/mime.js.map +1 -1
  619. package/dist/utils/open-browser.d.ts +9 -0
  620. package/dist/utils/open-browser.d.ts.map +1 -0
  621. package/dist/utils/open-browser.js +22 -0
  622. package/dist/utils/open-browser.js.map +1 -0
  623. package/dist/utils/paths.d.ts.map +1 -1
  624. package/dist/utils/paths.js.map +1 -1
  625. package/dist/utils/photon.d.ts.map +1 -1
  626. package/dist/utils/photon.js.map +1 -1
  627. package/dist/utils/pi-user-agent.d.ts.map +1 -1
  628. package/dist/utils/pi-user-agent.js.map +1 -1
  629. package/dist/utils/shell.d.ts.map +1 -1
  630. package/dist/utils/shell.js.map +1 -1
  631. package/dist/utils/sleep.d.ts.map +1 -1
  632. package/dist/utils/sleep.js.map +1 -1
  633. package/dist/utils/syntax-highlight.d.ts.map +1 -1
  634. package/dist/utils/syntax-highlight.js.map +1 -1
  635. package/dist/utils/tools-manager.d.ts.map +1 -1
  636. package/dist/utils/tools-manager.js.map +1 -1
  637. package/dist/utils/version-check.d.ts.map +1 -1
  638. package/dist/utils/version-check.js.map +1 -1
  639. package/dist/utils/windows-self-update.d.ts.map +1 -1
  640. package/dist/utils/windows-self-update.js.map +1 -1
  641. package/docs/containerization.md +111 -0
  642. package/docs/docs.json +4 -0
  643. package/docs/extensions.md +3 -1
  644. package/docs/index.md +1 -0
  645. package/docs/packages.md +3 -1
  646. package/docs/prompt-templates.md +1 -1
  647. package/docs/providers.md +3 -0
  648. package/docs/settings.md +10 -0
  649. package/docs/skills.md +3 -3
  650. package/docs/themes.md +1 -1
  651. package/docs/usage.md +15 -3
  652. package/examples/extensions/README.md +1 -0
  653. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  654. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  655. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  656. package/examples/extensions/gondolin/index.ts +531 -0
  657. package/examples/extensions/gondolin/package-lock.json +185 -0
  658. package/examples/extensions/gondolin/package.json +19 -0
  659. package/examples/extensions/minimal-mode.ts +6 -6
  660. package/examples/extensions/sandbox/package-lock.json +2 -2
  661. package/examples/extensions/sandbox/package.json +1 -1
  662. package/examples/extensions/with-deps/package-lock.json +2 -2
  663. package/examples/extensions/with-deps/package.json +1 -1
  664. package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.d.ts.map +1 -1
  665. package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.js.map +1 -1
  666. package/node_modules/@earendil-works/pi-agent-core/dist/agent.d.ts +7 -0
  667. package/node_modules/@earendil-works/pi-agent-core/dist/agent.d.ts.map +1 -1
  668. package/node_modules/@earendil-works/pi-agent-core/dist/agent.js +2 -27
  669. package/node_modules/@earendil-works/pi-agent-core/dist/agent.js.map +1 -1
  670. package/node_modules/@earendil-works/pi-agent-core/dist/harness/agent-harness.d.ts.map +1 -1
  671. package/node_modules/@earendil-works/pi-agent-core/dist/harness/agent-harness.js +7 -20
  672. package/node_modules/@earendil-works/pi-agent-core/dist/harness/agent-harness.js.map +1 -1
  673. package/node_modules/@earendil-works/pi-agent-core/dist/harness/compaction/branch-summarization.d.ts.map +1 -1
  674. package/node_modules/@earendil-works/pi-agent-core/dist/harness/compaction/branch-summarization.js.map +1 -1
  675. package/node_modules/@earendil-works/pi-agent-core/dist/harness/compaction/compaction.d.ts.map +1 -1
  676. package/node_modules/@earendil-works/pi-agent-core/dist/harness/compaction/compaction.js.map +1 -1
  677. package/node_modules/@earendil-works/pi-agent-core/dist/harness/compaction/utils.d.ts.map +1 -1
  678. package/node_modules/@earendil-works/pi-agent-core/dist/harness/compaction/utils.js.map +1 -1
  679. package/node_modules/@earendil-works/pi-agent-core/dist/harness/env/nodejs.d.ts.map +1 -1
  680. package/node_modules/@earendil-works/pi-agent-core/dist/harness/env/nodejs.js +0 -3
  681. package/node_modules/@earendil-works/pi-agent-core/dist/harness/env/nodejs.js.map +1 -1
  682. package/node_modules/@earendil-works/pi-agent-core/dist/harness/messages.d.ts.map +1 -1
  683. package/node_modules/@earendil-works/pi-agent-core/dist/harness/messages.js.map +1 -1
  684. package/node_modules/@earendil-works/pi-agent-core/dist/harness/prompt-templates.d.ts.map +1 -1
  685. package/node_modules/@earendil-works/pi-agent-core/dist/harness/prompt-templates.js.map +1 -1
  686. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/jsonl-repo.d.ts.map +1 -1
  687. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/jsonl-repo.js +0 -3
  688. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/jsonl-repo.js.map +1 -1
  689. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/jsonl-storage.d.ts.map +1 -1
  690. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/jsonl-storage.js +0 -7
  691. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/jsonl-storage.js.map +1 -1
  692. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/memory-repo.d.ts.map +1 -1
  693. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/memory-repo.js +3 -1
  694. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/memory-repo.js.map +1 -1
  695. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/memory-storage.d.ts.map +1 -1
  696. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/memory-storage.js +0 -5
  697. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/memory-storage.js.map +1 -1
  698. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/repo-utils.d.ts.map +1 -1
  699. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/repo-utils.js.map +1 -1
  700. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/session.d.ts.map +1 -1
  701. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/session.js +0 -1
  702. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/session.js.map +1 -1
  703. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/uuid.d.ts.map +1 -1
  704. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/uuid.js.map +1 -1
  705. package/node_modules/@earendil-works/pi-agent-core/dist/harness/skills.d.ts.map +1 -1
  706. package/node_modules/@earendil-works/pi-agent-core/dist/harness/skills.js.map +1 -1
  707. package/node_modules/@earendil-works/pi-agent-core/dist/harness/system-prompt.d.ts.map +1 -1
  708. package/node_modules/@earendil-works/pi-agent-core/dist/harness/system-prompt.js.map +1 -1
  709. package/node_modules/@earendil-works/pi-agent-core/dist/harness/types.d.ts.map +1 -1
  710. package/node_modules/@earendil-works/pi-agent-core/dist/harness/types.js +0 -16
  711. package/node_modules/@earendil-works/pi-agent-core/dist/harness/types.js.map +1 -1
  712. package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/shell-output.d.ts.map +1 -1
  713. package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/shell-output.js.map +1 -1
  714. package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/truncate.d.ts.map +1 -1
  715. package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/truncate.js.map +1 -1
  716. package/node_modules/@earendil-works/pi-agent-core/dist/index.d.ts.map +1 -1
  717. package/node_modules/@earendil-works/pi-agent-core/dist/node.d.ts.map +1 -1
  718. package/node_modules/@earendil-works/pi-agent-core/dist/proxy.d.ts.map +1 -1
  719. package/node_modules/@earendil-works/pi-agent-core/dist/proxy.js.map +1 -1
  720. package/node_modules/@earendil-works/pi-agent-core/dist/types.d.ts.map +1 -1
  721. package/node_modules/@earendil-works/pi-agent-core/package.json +6 -6
  722. package/node_modules/@earendil-works/pi-ai/README.md +5 -1
  723. package/node_modules/@earendil-works/pi-ai/dist/api-registry.d.ts.map +1 -1
  724. package/node_modules/@earendil-works/pi-ai/dist/api-registry.js.map +1 -1
  725. package/node_modules/@earendil-works/pi-ai/dist/bedrock-provider.d.ts.map +1 -1
  726. package/node_modules/@earendil-works/pi-ai/dist/cli.d.ts.map +1 -1
  727. package/node_modules/@earendil-works/pi-ai/dist/cli.js.map +1 -1
  728. package/node_modules/@earendil-works/pi-ai/dist/env-api-keys.d.ts.map +1 -1
  729. package/node_modules/@earendil-works/pi-ai/dist/env-api-keys.js +2 -0
  730. package/node_modules/@earendil-works/pi-ai/dist/env-api-keys.js.map +1 -1
  731. package/node_modules/@earendil-works/pi-ai/dist/image-models.d.ts.map +1 -1
  732. package/node_modules/@earendil-works/pi-ai/dist/image-models.generated.d.ts +30 -0
  733. package/node_modules/@earendil-works/pi-ai/dist/image-models.generated.d.ts.map +1 -1
  734. package/node_modules/@earendil-works/pi-ai/dist/image-models.generated.js +30 -0
  735. package/node_modules/@earendil-works/pi-ai/dist/image-models.generated.js.map +1 -1
  736. package/node_modules/@earendil-works/pi-ai/dist/image-models.js.map +1 -1
  737. package/node_modules/@earendil-works/pi-ai/dist/images-api-registry.d.ts.map +1 -1
  738. package/node_modules/@earendil-works/pi-ai/dist/images-api-registry.js.map +1 -1
  739. package/node_modules/@earendil-works/pi-ai/dist/images.d.ts.map +1 -1
  740. package/node_modules/@earendil-works/pi-ai/dist/images.js.map +1 -1
  741. package/node_modules/@earendil-works/pi-ai/dist/index.d.ts.map +1 -1
  742. package/node_modules/@earendil-works/pi-ai/dist/models.d.ts.map +1 -1
  743. package/node_modules/@earendil-works/pi-ai/dist/models.generated.d.ts +413 -65
  744. package/node_modules/@earendil-works/pi-ai/dist/models.generated.d.ts.map +1 -1
  745. package/node_modules/@earendil-works/pi-ai/dist/models.generated.js +385 -97
  746. package/node_modules/@earendil-works/pi-ai/dist/models.generated.js.map +1 -1
  747. package/node_modules/@earendil-works/pi-ai/dist/models.js.map +1 -1
  748. package/node_modules/@earendil-works/pi-ai/dist/oauth.d.ts.map +1 -1
  749. package/node_modules/@earendil-works/pi-ai/dist/providers/amazon-bedrock.d.ts.map +1 -1
  750. package/node_modules/@earendil-works/pi-ai/dist/providers/amazon-bedrock.js.map +1 -1
  751. package/node_modules/@earendil-works/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
  752. package/node_modules/@earendil-works/pi-ai/dist/providers/anthropic.js.map +1 -1
  753. package/node_modules/@earendil-works/pi-ai/dist/providers/azure-openai-responses.d.ts.map +1 -1
  754. package/node_modules/@earendil-works/pi-ai/dist/providers/azure-openai-responses.js.map +1 -1
  755. package/node_modules/@earendil-works/pi-ai/dist/providers/cloudflare.d.ts.map +1 -1
  756. package/node_modules/@earendil-works/pi-ai/dist/providers/cloudflare.js.map +1 -1
  757. package/node_modules/@earendil-works/pi-ai/dist/providers/faux.d.ts.map +1 -1
  758. package/node_modules/@earendil-works/pi-ai/dist/providers/faux.js.map +1 -1
  759. package/node_modules/@earendil-works/pi-ai/dist/providers/github-copilot-headers.d.ts.map +1 -1
  760. package/node_modules/@earendil-works/pi-ai/dist/providers/github-copilot-headers.js.map +1 -1
  761. package/node_modules/@earendil-works/pi-ai/dist/providers/google-shared.d.ts.map +1 -1
  762. package/node_modules/@earendil-works/pi-ai/dist/providers/google-shared.js.map +1 -1
  763. package/node_modules/@earendil-works/pi-ai/dist/providers/google-vertex.d.ts.map +1 -1
  764. package/node_modules/@earendil-works/pi-ai/dist/providers/google-vertex.js.map +1 -1
  765. package/node_modules/@earendil-works/pi-ai/dist/providers/google.d.ts.map +1 -1
  766. package/node_modules/@earendil-works/pi-ai/dist/providers/google.js.map +1 -1
  767. package/node_modules/@earendil-works/pi-ai/dist/providers/images/openrouter.d.ts.map +1 -1
  768. package/node_modules/@earendil-works/pi-ai/dist/providers/images/openrouter.js.map +1 -1
  769. package/node_modules/@earendil-works/pi-ai/dist/providers/images/register-builtins.d.ts.map +1 -1
  770. package/node_modules/@earendil-works/pi-ai/dist/providers/images/register-builtins.js.map +1 -1
  771. package/node_modules/@earendil-works/pi-ai/dist/providers/mistral.d.ts.map +1 -1
  772. package/node_modules/@earendil-works/pi-ai/dist/providers/mistral.js +3 -3
  773. package/node_modules/@earendil-works/pi-ai/dist/providers/mistral.js.map +1 -1
  774. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-codex-responses.d.ts.map +1 -1
  775. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-codex-responses.js +0 -7
  776. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-codex-responses.js.map +1 -1
  777. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-completions.d.ts.map +1 -1
  778. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-completions.js +26 -9
  779. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-completions.js.map +1 -1
  780. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-prompt-cache.d.ts.map +1 -1
  781. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-prompt-cache.js.map +1 -1
  782. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-responses-shared.d.ts.map +1 -1
  783. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-responses-shared.js.map +1 -1
  784. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-responses.d.ts.map +1 -1
  785. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-responses.js.map +1 -1
  786. package/node_modules/@earendil-works/pi-ai/dist/providers/register-builtins.d.ts.map +1 -1
  787. package/node_modules/@earendil-works/pi-ai/dist/providers/register-builtins.js.map +1 -1
  788. package/node_modules/@earendil-works/pi-ai/dist/providers/simple-options.d.ts.map +1 -1
  789. package/node_modules/@earendil-works/pi-ai/dist/providers/simple-options.js.map +1 -1
  790. package/node_modules/@earendil-works/pi-ai/dist/providers/transform-messages.d.ts.map +1 -1
  791. package/node_modules/@earendil-works/pi-ai/dist/providers/transform-messages.js.map +1 -1
  792. package/node_modules/@earendil-works/pi-ai/dist/session-resources.d.ts.map +1 -1
  793. package/node_modules/@earendil-works/pi-ai/dist/session-resources.js.map +1 -1
  794. package/node_modules/@earendil-works/pi-ai/dist/stream.d.ts.map +1 -1
  795. package/node_modules/@earendil-works/pi-ai/dist/stream.js.map +1 -1
  796. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/context-transformer.d.ts.map +1 -1
  797. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/context-transformer.js.map +1 -1
  798. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/index.d.ts.map +1 -1
  799. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/index.js.map +1 -1
  800. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/gemma4.d.ts.map +1 -1
  801. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/gemma4.js +10 -8
  802. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/gemma4.js.map +1 -1
  803. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/hermes.d.ts.map +1 -1
  804. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/hermes.js.map +1 -1
  805. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/json-mix.d.ts.map +1 -1
  806. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/json-mix.js.map +1 -1
  807. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/morph-xml.d.ts.map +1 -1
  808. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/morph-xml.js.map +1 -1
  809. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/xml-tool-tag-scanner.d.ts.map +1 -1
  810. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/xml-tool-tag-scanner.js.map +1 -1
  811. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/yaml-xml.d.ts.map +1 -1
  812. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/yaml-xml.js.map +1 -1
  813. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/stream-wrapper.d.ts.map +1 -1
  814. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/stream-wrapper.js.map +1 -1
  815. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/types.d.ts.map +1 -1
  816. package/node_modules/@earendil-works/pi-ai/dist/types.d.ts +4 -4
  817. package/node_modules/@earendil-works/pi-ai/dist/types.d.ts.map +1 -1
  818. package/node_modules/@earendil-works/pi-ai/dist/types.js.map +1 -1
  819. package/node_modules/@earendil-works/pi-ai/dist/utils/abort-signals.d.ts.map +1 -1
  820. package/node_modules/@earendil-works/pi-ai/dist/utils/abort-signals.js.map +1 -1
  821. package/node_modules/@earendil-works/pi-ai/dist/utils/diagnostics.d.ts.map +1 -1
  822. package/node_modules/@earendil-works/pi-ai/dist/utils/diagnostics.js.map +1 -1
  823. package/node_modules/@earendil-works/pi-ai/dist/utils/event-stream.d.ts.map +1 -1
  824. package/node_modules/@earendil-works/pi-ai/dist/utils/event-stream.js +3 -7
  825. package/node_modules/@earendil-works/pi-ai/dist/utils/event-stream.js.map +1 -1
  826. package/node_modules/@earendil-works/pi-ai/dist/utils/hash.d.ts.map +1 -1
  827. package/node_modules/@earendil-works/pi-ai/dist/utils/hash.js.map +1 -1
  828. package/node_modules/@earendil-works/pi-ai/dist/utils/headers.d.ts.map +1 -1
  829. package/node_modules/@earendil-works/pi-ai/dist/utils/headers.js.map +1 -1
  830. package/node_modules/@earendil-works/pi-ai/dist/utils/json-parse.d.ts.map +1 -1
  831. package/node_modules/@earendil-works/pi-ai/dist/utils/json-parse.js.map +1 -1
  832. package/node_modules/@earendil-works/pi-ai/dist/utils/node-http-proxy.d.ts.map +1 -1
  833. package/node_modules/@earendil-works/pi-ai/dist/utils/node-http-proxy.js.map +1 -1
  834. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/anthropic.d.ts.map +1 -1
  835. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/anthropic.js.map +1 -1
  836. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/device-code.d.ts.map +1 -1
  837. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/device-code.js.map +1 -1
  838. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/github-copilot.d.ts.map +1 -1
  839. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/github-copilot.js +13 -1
  840. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/github-copilot.js.map +1 -1
  841. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/index.d.ts.map +1 -1
  842. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/index.js.map +1 -1
  843. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/oauth-page.d.ts.map +1 -1
  844. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/oauth-page.js.map +1 -1
  845. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/openai-codex.d.ts.map +1 -1
  846. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/openai-codex.js +4 -2
  847. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/openai-codex.js.map +1 -1
  848. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/pkce.d.ts.map +1 -1
  849. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/pkce.js.map +1 -1
  850. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/types.d.ts.map +1 -1
  851. package/node_modules/@earendil-works/pi-ai/dist/utils/overflow.d.ts.map +1 -1
  852. package/node_modules/@earendil-works/pi-ai/dist/utils/overflow.js.map +1 -1
  853. package/node_modules/@earendil-works/pi-ai/dist/utils/sanitize-unicode.d.ts.map +1 -1
  854. package/node_modules/@earendil-works/pi-ai/dist/utils/sanitize-unicode.js.map +1 -1
  855. package/node_modules/@earendil-works/pi-ai/dist/utils/tool-pair-repair.d.ts.map +1 -1
  856. package/node_modules/@earendil-works/pi-ai/dist/utils/tool-pair-repair.js.map +1 -1
  857. package/node_modules/@earendil-works/pi-ai/dist/utils/typebox-helpers.d.ts.map +1 -1
  858. package/node_modules/@earendil-works/pi-ai/dist/utils/typebox-helpers.js.map +1 -1
  859. package/node_modules/@earendil-works/pi-ai/dist/utils/validation.d.ts.map +1 -1
  860. package/node_modules/@earendil-works/pi-ai/dist/utils/validation.js.map +1 -1
  861. package/node_modules/@earendil-works/pi-ai/package.json +5 -5
  862. package/node_modules/@earendil-works/pi-tui/dist/autocomplete.d.ts +1 -1
  863. package/node_modules/@earendil-works/pi-tui/dist/autocomplete.d.ts.map +1 -1
  864. package/node_modules/@earendil-works/pi-tui/dist/autocomplete.js +0 -3
  865. package/node_modules/@earendil-works/pi-tui/dist/autocomplete.js.map +1 -1
  866. package/node_modules/@earendil-works/pi-tui/dist/components/box.d.ts.map +1 -1
  867. package/node_modules/@earendil-works/pi-tui/dist/components/box.js +1 -6
  868. package/node_modules/@earendil-works/pi-tui/dist/components/box.js.map +1 -1
  869. package/node_modules/@earendil-works/pi-tui/dist/components/cancellable-loader.d.ts.map +1 -1
  870. package/node_modules/@earendil-works/pi-tui/dist/components/cancellable-loader.js +4 -3
  871. package/node_modules/@earendil-works/pi-tui/dist/components/cancellable-loader.js.map +1 -1
  872. package/node_modules/@earendil-works/pi-tui/dist/components/editor.d.ts.map +1 -1
  873. package/node_modules/@earendil-works/pi-tui/dist/components/editor.js +43 -54
  874. package/node_modules/@earendil-works/pi-tui/dist/components/editor.js.map +1 -1
  875. package/node_modules/@earendil-works/pi-tui/dist/components/image.d.ts.map +1 -1
  876. package/node_modules/@earendil-works/pi-tui/dist/components/image.js +0 -8
  877. package/node_modules/@earendil-works/pi-tui/dist/components/image.js.map +1 -1
  878. package/node_modules/@earendil-works/pi-tui/dist/components/input.d.ts.map +1 -1
  879. package/node_modules/@earendil-works/pi-tui/dist/components/input.js +14 -14
  880. package/node_modules/@earendil-works/pi-tui/dist/components/input.js.map +1 -1
  881. package/node_modules/@earendil-works/pi-tui/dist/components/loader.d.ts.map +1 -1
  882. package/node_modules/@earendil-works/pi-tui/dist/components/loader.js +11 -13
  883. package/node_modules/@earendil-works/pi-tui/dist/components/loader.js.map +1 -1
  884. package/node_modules/@earendil-works/pi-tui/dist/components/markdown.d.ts.map +1 -1
  885. package/node_modules/@earendil-works/pi-tui/dist/components/markdown.js +0 -11
  886. package/node_modules/@earendil-works/pi-tui/dist/components/markdown.js.map +1 -1
  887. package/node_modules/@earendil-works/pi-tui/dist/components/select-list.d.ts.map +1 -1
  888. package/node_modules/@earendil-works/pi-tui/dist/components/select-list.js +4 -9
  889. package/node_modules/@earendil-works/pi-tui/dist/components/select-list.js.map +1 -1
  890. package/node_modules/@earendil-works/pi-tui/dist/components/settings-list.d.ts.map +1 -1
  891. package/node_modules/@earendil-works/pi-tui/dist/components/settings-list.js +4 -12
  892. package/node_modules/@earendil-works/pi-tui/dist/components/settings-list.js.map +1 -1
  893. package/node_modules/@earendil-works/pi-tui/dist/components/spacer.d.ts.map +1 -1
  894. package/node_modules/@earendil-works/pi-tui/dist/components/spacer.js +0 -1
  895. package/node_modules/@earendil-works/pi-tui/dist/components/spacer.js.map +1 -1
  896. package/node_modules/@earendil-works/pi-tui/dist/components/text.d.ts.map +1 -1
  897. package/node_modules/@earendil-works/pi-tui/dist/components/text.js +0 -8
  898. package/node_modules/@earendil-works/pi-tui/dist/components/text.js.map +1 -1
  899. package/node_modules/@earendil-works/pi-tui/dist/components/truncated-text.d.ts.map +1 -1
  900. package/node_modules/@earendil-works/pi-tui/dist/components/truncated-text.js +0 -3
  901. package/node_modules/@earendil-works/pi-tui/dist/components/truncated-text.js.map +1 -1
  902. package/node_modules/@earendil-works/pi-tui/dist/editor-component.d.ts.map +1 -1
  903. package/node_modules/@earendil-works/pi-tui/dist/fuzzy.d.ts.map +1 -1
  904. package/node_modules/@earendil-works/pi-tui/dist/fuzzy.js.map +1 -1
  905. package/node_modules/@earendil-works/pi-tui/dist/index.d.ts.map +1 -1
  906. package/node_modules/@earendil-works/pi-tui/dist/keybindings.d.ts.map +1 -1
  907. package/node_modules/@earendil-works/pi-tui/dist/keybindings.js +2 -4
  908. package/node_modules/@earendil-works/pi-tui/dist/keybindings.js.map +1 -1
  909. package/node_modules/@earendil-works/pi-tui/dist/keys.d.ts.map +1 -1
  910. package/node_modules/@earendil-works/pi-tui/dist/keys.js.map +1 -1
  911. package/node_modules/@earendil-works/pi-tui/dist/kill-ring.d.ts.map +1 -1
  912. package/node_modules/@earendil-works/pi-tui/dist/kill-ring.js +3 -1
  913. package/node_modules/@earendil-works/pi-tui/dist/kill-ring.js.map +1 -1
  914. package/node_modules/@earendil-works/pi-tui/dist/native-modifiers.d.ts.map +1 -1
  915. package/node_modules/@earendil-works/pi-tui/dist/native-modifiers.js.map +1 -1
  916. package/node_modules/@earendil-works/pi-tui/dist/slash-command-autocomplete.d.ts.map +1 -1
  917. package/node_modules/@earendil-works/pi-tui/dist/slash-command-autocomplete.js.map +1 -1
  918. package/node_modules/@earendil-works/pi-tui/dist/stdin-buffer.d.ts.map +1 -1
  919. package/node_modules/@earendil-works/pi-tui/dist/stdin-buffer.js +4 -6
  920. package/node_modules/@earendil-works/pi-tui/dist/stdin-buffer.js.map +1 -1
  921. package/node_modules/@earendil-works/pi-tui/dist/terminal-image.d.ts.map +1 -1
  922. package/node_modules/@earendil-works/pi-tui/dist/terminal-image.js.map +1 -1
  923. package/node_modules/@earendil-works/pi-tui/dist/terminal.d.ts.map +1 -1
  924. package/node_modules/@earendil-works/pi-tui/dist/terminal.js +24 -29
  925. package/node_modules/@earendil-works/pi-tui/dist/terminal.js.map +1 -1
  926. package/node_modules/@earendil-works/pi-tui/dist/tui.d.ts.map +1 -1
  927. package/node_modules/@earendil-works/pi-tui/dist/tui.js +25 -27
  928. package/node_modules/@earendil-works/pi-tui/dist/tui.js.map +1 -1
  929. package/node_modules/@earendil-works/pi-tui/dist/undo-stack.d.ts.map +1 -1
  930. package/node_modules/@earendil-works/pi-tui/dist/undo-stack.js +3 -1
  931. package/node_modules/@earendil-works/pi-tui/dist/undo-stack.js.map +1 -1
  932. package/node_modules/@earendil-works/pi-tui/dist/utils.d.ts.map +1 -1
  933. package/node_modules/@earendil-works/pi-tui/dist/utils.js +14 -12
  934. package/node_modules/@earendil-works/pi-tui/dist/utils.js.map +1 -1
  935. package/node_modules/@earendil-works/pi-tui/dist/word-navigation.d.ts.map +1 -1
  936. package/node_modules/@earendil-works/pi-tui/dist/word-navigation.js.map +1 -1
  937. package/node_modules/@earendil-works/pi-tui/package.json +1 -1
  938. package/node_modules/@types/node/README.md +3 -3
  939. package/node_modules/@types/node/assert/strict.d.ts +3 -55
  940. package/node_modules/@types/node/assert.d.ts +49 -177
  941. package/node_modules/@types/node/async_hooks.d.ts +151 -43
  942. package/node_modules/@types/node/buffer.buffer.d.ts +2 -8
  943. package/node_modules/@types/node/buffer.d.ts +43 -212
  944. package/node_modules/@types/node/child_process.d.ts +23 -133
  945. package/node_modules/@types/node/cluster.d.ts +238 -384
  946. package/node_modules/@types/node/compatibility/iterators.d.ts +1 -0
  947. package/node_modules/@types/node/console.d.ts +45 -404
  948. package/node_modules/@types/node/constants.d.ts +3 -10
  949. package/node_modules/@types/node/crypto.d.ts +640 -1127
  950. package/node_modules/@types/node/dgram.d.ts +14 -77
  951. package/node_modules/@types/node/diagnostics_channel.d.ts +3 -29
  952. package/node_modules/@types/node/dns/promises.d.ts +4 -10
  953. package/node_modules/@types/node/dns.d.ts +130 -177
  954. package/node_modules/@types/node/domain.d.ts +12 -32
  955. package/node_modules/@types/node/events.d.ts +872 -840
  956. package/node_modules/@types/node/fs/promises.d.ts +193 -20
  957. package/node_modules/@types/node/fs.d.ts +754 -435
  958. package/node_modules/@types/node/globals.d.ts +8 -30
  959. package/node_modules/@types/node/globals.typedarray.d.ts +63 -0
  960. package/node_modules/@types/node/http.d.ts +363 -305
  961. package/node_modules/@types/node/http2.d.ts +545 -781
  962. package/node_modules/@types/node/https.d.ts +64 -243
  963. package/node_modules/@types/node/index.d.ts +26 -6
  964. package/node_modules/@types/node/inspector/promises.d.ts +35 -0
  965. package/node_modules/@types/node/inspector.d.ts +68 -57
  966. package/node_modules/@types/node/inspector.generated.d.ts +764 -410
  967. package/node_modules/@types/node/module.d.ts +53 -189
  968. package/node_modules/@types/node/net.d.ts +101 -207
  969. package/node_modules/@types/node/os.d.ts +11 -19
  970. package/node_modules/@types/node/package.json +13 -3
  971. package/node_modules/@types/node/path/posix.d.ts +8 -0
  972. package/node_modules/@types/node/path/win32.d.ts +8 -0
  973. package/node_modules/@types/node/path.d.ts +119 -141
  974. package/node_modules/@types/node/perf_hooks.d.ts +317 -673
  975. package/node_modules/@types/node/process.d.ts +277 -157
  976. package/node_modules/@types/node/punycode.d.ts +3 -31
  977. package/node_modules/@types/node/querystring.d.ts +3 -16
  978. package/node_modules/@types/node/quic.d.ts +897 -0
  979. package/node_modules/@types/node/readline/promises.d.ts +3 -6
  980. package/node_modules/@types/node/readline.d.ts +65 -152
  981. package/node_modules/@types/node/repl.d.ts +101 -109
  982. package/node_modules/@types/node/sea.d.ts +9 -115
  983. package/node_modules/@types/node/sqlite.d.ts +415 -68
  984. package/node_modules/@types/node/stream/consumers.d.ts +91 -15
  985. package/node_modules/@types/node/stream/iter.d.ts +301 -0
  986. package/node_modules/@types/node/stream/promises.d.ts +136 -15
  987. package/node_modules/@types/node/stream/web.d.ts +179 -501
  988. package/node_modules/@types/node/stream.d.ts +577 -490
  989. package/node_modules/@types/node/string_decoder.d.ts +3 -43
  990. package/node_modules/@types/node/test/reporters.d.ts +59 -0
  991. package/node_modules/@types/node/test.d.ts +402 -286
  992. package/node_modules/@types/node/timers/promises.d.ts +3 -18
  993. package/node_modules/@types/node/timers.d.ts +3 -141
  994. package/node_modules/@types/node/tls.d.ts +115 -241
  995. package/node_modules/@types/node/trace_events.d.ts +3 -97
  996. package/node_modules/@types/node/ts5.6/buffer.buffer.d.ts +2 -8
  997. package/node_modules/@types/node/ts5.6/compatibility/float16array.d.ts +71 -0
  998. package/node_modules/@types/node/ts5.6/globals.typedarray.d.ts +2 -0
  999. package/node_modules/@types/node/ts5.6/index.d.ts +28 -6
  1000. package/node_modules/@types/node/ts5.7/compatibility/float16array.d.ts +72 -0
  1001. package/node_modules/@types/node/ts5.7/index.d.ts +119 -0
  1002. package/node_modules/@types/node/tty.d.ts +57 -40
  1003. package/node_modules/@types/node/url.d.ts +156 -584
  1004. package/node_modules/@types/node/util/types.d.ts +558 -0
  1005. package/node_modules/@types/node/util.d.ts +167 -1096
  1006. package/node_modules/@types/node/v8.d.ts +75 -15
  1007. package/node_modules/@types/node/vm.d.ts +334 -198
  1008. package/node_modules/@types/node/wasi.d.ts +24 -74
  1009. package/node_modules/@types/node/web-globals/abortcontroller.d.ts +27 -2
  1010. package/node_modules/@types/node/web-globals/blob.d.ts +23 -0
  1011. package/node_modules/@types/node/web-globals/console.d.ts +9 -0
  1012. package/node_modules/@types/node/web-globals/crypto.d.ts +39 -0
  1013. package/node_modules/@types/node/web-globals/encoding.d.ts +11 -0
  1014. package/node_modules/@types/node/web-globals/events.d.ts +9 -0
  1015. package/node_modules/@types/node/web-globals/fetch.d.ts +14 -0
  1016. package/node_modules/@types/node/web-globals/importmeta.d.ts +13 -0
  1017. package/node_modules/@types/node/web-globals/messaging.d.ts +23 -0
  1018. package/node_modules/@types/node/web-globals/navigator.d.ts +3 -0
  1019. package/node_modules/@types/node/web-globals/performance.d.ts +45 -0
  1020. package/node_modules/@types/node/web-globals/streams.d.ts +115 -0
  1021. package/node_modules/@types/node/web-globals/timers.d.ts +44 -0
  1022. package/node_modules/@types/node/web-globals/url.d.ts +24 -0
  1023. package/node_modules/@types/node/worker_threads.d.ts +280 -393
  1024. package/node_modules/@types/node/zlib/iter.d.ts +131 -0
  1025. package/node_modules/@types/node/zlib.d.ts +7 -165
  1026. package/node_modules/undici-types/agent.d.ts +13 -12
  1027. package/node_modules/undici-types/api.d.ts +26 -26
  1028. package/node_modules/undici-types/balanced-pool.d.ts +13 -12
  1029. package/node_modules/undici-types/cache-interceptor.d.ts +179 -0
  1030. package/node_modules/undici-types/client-stats.d.ts +15 -0
  1031. package/node_modules/undici-types/client.d.ts +34 -19
  1032. package/node_modules/undici-types/connector.d.ts +4 -2
  1033. package/node_modules/undici-types/cookies.d.ts +2 -0
  1034. package/node_modules/undici-types/diagnostics-channel.d.ts +18 -10
  1035. package/node_modules/undici-types/dispatcher.d.ts +127 -104
  1036. package/node_modules/undici-types/env-http-proxy-agent.d.ts +4 -3
  1037. package/node_modules/undici-types/errors.d.ts +82 -54
  1038. package/node_modules/undici-types/eventsource.d.ts +9 -4
  1039. package/node_modules/undici-types/fetch.d.ts +22 -20
  1040. package/node_modules/undici-types/formdata.d.ts +7 -7
  1041. package/node_modules/undici-types/global-dispatcher.d.ts +4 -4
  1042. package/node_modules/undici-types/global-origin.d.ts +5 -5
  1043. package/node_modules/undici-types/h2c-client.d.ts +73 -0
  1044. package/node_modules/undici-types/handlers.d.ts +8 -8
  1045. package/node_modules/undici-types/header.d.ts +157 -1
  1046. package/node_modules/undici-types/index.d.ts +67 -47
  1047. package/node_modules/undici-types/interceptors.d.ts +71 -8
  1048. package/node_modules/undici-types/mock-agent.d.ts +36 -18
  1049. package/node_modules/undici-types/mock-call-history.d.ts +111 -0
  1050. package/node_modules/undici-types/mock-client.d.ts +6 -4
  1051. package/node_modules/undici-types/mock-errors.d.ts +3 -3
  1052. package/node_modules/undici-types/mock-interceptor.d.ts +21 -20
  1053. package/node_modules/undici-types/mock-pool.d.ts +6 -4
  1054. package/node_modules/undici-types/package.json +1 -1
  1055. package/node_modules/undici-types/patch.d.ts +0 -4
  1056. package/node_modules/undici-types/pool-stats.d.ts +8 -8
  1057. package/node_modules/undici-types/pool.d.ts +15 -13
  1058. package/node_modules/undici-types/proxy-agent.d.ts +5 -4
  1059. package/node_modules/undici-types/readable.d.ts +19 -16
  1060. package/node_modules/undici-types/retry-agent.d.ts +1 -1
  1061. package/node_modules/undici-types/retry-handler.d.ts +19 -10
  1062. package/node_modules/undici-types/round-robin-pool.d.ts +41 -0
  1063. package/node_modules/undici-types/snapshot-agent.d.ts +109 -0
  1064. package/node_modules/undici-types/socks5-proxy-agent.d.ts +25 -0
  1065. package/node_modules/undici-types/util.d.ts +3 -3
  1066. package/node_modules/undici-types/utility.d.ts +7 -0
  1067. package/node_modules/undici-types/webidl.d.ts +148 -29
  1068. package/node_modules/undici-types/websocket.d.ts +48 -10
  1069. package/npm-shrinkwrap.json +21 -21
  1070. package/package.json +14 -8
  1071. package/node_modules/@types/node/compatibility/disposable.d.ts +0 -14
  1072. package/node_modules/@types/node/compatibility/index.d.ts +0 -9
  1073. package/node_modules/@types/node/compatibility/indexable.d.ts +0 -20
  1074. package/node_modules/undici-types/file.d.ts +0 -39
  1075. package/node_modules/undici-types/filereader.d.ts +0 -54
@@ -1 +1 @@
1
- {"version":3,"file":"system-messages.js","sourceRoot":"","sources":["../../../../src/core/extensions/builtin/system-messages.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ImageContent, TextContent } from \"@earendil-works/pi-ai\";\nimport type { CustomMessage } from \"../../messages.ts\";\nimport type { ExtensionAPI } from \"../types.ts\";\n\nexport const SENPI_SYSTEM_PREFIX = \"[system:senpi]\";\nexport const SENPI_CONVERSATION_EVENT = \"senpi:conversation\";\n\nexport type BuiltinSystemMessageRoute = \"todotools.continuation\";\nexport type SenpiConversationAction = \"injected\" | \"failed\";\n\nexport interface SenpiConversationEvent {\n\tversion: 1;\n\tsource: \"builtin\";\n\taction: SenpiConversationAction;\n\troute: BuiltinSystemMessageRoute;\n\tsessionId?: string;\n\ttimestamp: number;\n\tconversation: {\n\t\tprefix: typeof SENPI_SYSTEM_PREFIX;\n\t\tkind: \"custom_message\" | \"user_message\";\n\t\tcustomType?: string;\n\t\tdeliverAs?: \"steer\" | \"followUp\";\n\t\ttriggerTurn?: boolean;\n\t};\n\ttext: string;\n\terrorMessage?: string;\n}\n\ntype BuiltinUserMessageOptions = {\n\tdeliverAs?: \"steer\" | \"followUp\";\n\tsessionId?: string;\n};\n\ntype BuiltinCustomMessageOptions = {\n\ttriggerTurn?: boolean;\n\tdeliverAs?: \"steer\" | \"followUp\" | \"nextTurn\";\n\tsessionId?: string;\n};\n\nfunction prefixText(text: string): string {\n\treturn text.startsWith(SENPI_SYSTEM_PREFIX) ? text : `${SENPI_SYSTEM_PREFIX}\\n${text}`;\n}\n\nfunction prefixContent(content: string | (TextContent | ImageContent)[]): string | (TextContent | ImageContent)[] {\n\tif (typeof content === \"string\") {\n\t\treturn prefixText(content);\n\t}\n\n\tconst firstTextIndex = content.findIndex((part) => part.type === \"text\");\n\tif (firstTextIndex === -1) {\n\t\treturn [{ type: \"text\", text: SENPI_SYSTEM_PREFIX }, ...content];\n\t}\n\n\treturn content.map((part, index) => {\n\t\tif (part.type !== \"text\" || index !== firstTextIndex) {\n\t\t\treturn part;\n\t\t}\n\n\t\treturn {\n\t\t\t...part,\n\t\t\ttext: prefixText(part.text),\n\t\t};\n\t});\n}\n\nfunction extractText(content: string | (TextContent | ImageContent)[]): string {\n\tif (typeof content === \"string\") {\n\t\treturn content;\n\t}\n\n\treturn content\n\t\t.filter((part): part is TextContent => part.type === \"text\")\n\t\t.map((part) => part.text)\n\t\t.join(\"\\n\");\n}\n\nfunction emitSenpiConversationEvent(pi: ExtensionAPI, event: SenpiConversationEvent): void {\n\tpi.events.emit(SENPI_CONVERSATION_EVENT, event);\n}\n\nfunction createBaseEvent(args: {\n\taction: SenpiConversationAction;\n\troute: BuiltinSystemMessageRoute;\n\tsessionId?: string;\n\tkind: \"custom_message\" | \"user_message\";\n\tcustomType?: string;\n\tdeliverAs?: \"steer\" | \"followUp\";\n\ttriggerTurn?: boolean;\n\ttext: string;\n\terrorMessage?: string;\n}): SenpiConversationEvent {\n\treturn {\n\t\tversion: 1,\n\t\tsource: \"builtin\",\n\t\taction: args.action,\n\t\troute: args.route,\n\t\tsessionId: args.sessionId,\n\t\ttimestamp: Date.now(),\n\t\tconversation: {\n\t\t\tprefix: SENPI_SYSTEM_PREFIX,\n\t\t\tkind: args.kind,\n\t\t\tcustomType: args.customType,\n\t\t\tdeliverAs: args.deliverAs,\n\t\t\ttriggerTurn: args.triggerTurn,\n\t\t},\n\t\ttext: args.text,\n\t\terrorMessage: args.errorMessage,\n\t};\n}\n\nfunction hasUserMessageOptions(\n\toptions: BuiltinUserMessageOptions | undefined,\n): options is BuiltinUserMessageOptions & { deliverAs: \"steer\" | \"followUp\" } {\n\treturn options?.deliverAs !== undefined;\n}\n\nfunction hasCustomMessageOptions(\n\toptions: BuiltinCustomMessageOptions | undefined,\n): options is BuiltinCustomMessageOptions & { triggerTurn?: boolean; deliverAs?: \"steer\" | \"followUp\" | \"nextTurn\" } {\n\treturn options?.triggerTurn === true || options?.deliverAs !== undefined;\n}\n\nexport function sendBuiltinUserMessage(\n\tpi: ExtensionAPI,\n\troute: BuiltinSystemMessageRoute,\n\tcontent: string | (TextContent | ImageContent)[],\n\toptions?: BuiltinUserMessageOptions,\n): void {\n\tconst prefixedContent = prefixContent(content);\n\n\temitSenpiConversationEvent(\n\t\tpi,\n\t\tcreateBaseEvent({\n\t\t\taction: \"injected\",\n\t\t\troute,\n\t\t\tsessionId: options?.sessionId,\n\t\t\tkind: \"user_message\",\n\t\t\ttext: extractText(prefixedContent),\n\t\t\tdeliverAs: options?.deliverAs,\n\t\t}),\n\t);\n\n\tif (hasUserMessageOptions(options)) {\n\t\tpi.sendUserMessage(prefixedContent, { deliverAs: options.deliverAs });\n\t\treturn;\n\t}\n\n\tpi.sendUserMessage(prefixedContent);\n}\n\nexport function sendBuiltinCustomMessage<TDetails>(\n\tpi: ExtensionAPI,\n\troute: BuiltinSystemMessageRoute,\n\tmessage: Pick<CustomMessage<TDetails>, \"content\" | \"customType\" | \"details\" | \"display\">,\n\toptions?: BuiltinCustomMessageOptions,\n): void {\n\tconst prefixedContent = prefixContent(message.content);\n\tconst deliverAs = options?.deliverAs === \"nextTurn\" ? undefined : options?.deliverAs;\n\n\temitSenpiConversationEvent(\n\t\tpi,\n\t\tcreateBaseEvent({\n\t\t\taction: \"injected\",\n\t\t\troute,\n\t\t\tsessionId: options?.sessionId,\n\t\t\tkind: \"custom_message\",\n\t\t\tcustomType: message.customType,\n\t\t\ttext: extractText(prefixedContent),\n\t\t\tdeliverAs,\n\t\t\ttriggerTurn: options?.triggerTurn,\n\t\t}),\n\t);\n\n\tconst prefixedMessage = {\n\t\t...message,\n\t\tcontent: prefixedContent,\n\t};\n\n\tif (hasCustomMessageOptions(options)) {\n\t\tpi.sendMessage(prefixedMessage, {\n\t\t\ttriggerTurn: options.triggerTurn,\n\t\t\tdeliverAs: options.deliverAs,\n\t\t});\n\t\treturn;\n\t}\n\n\tpi.sendMessage(prefixedMessage);\n}\n\nexport function emitBuiltinSystemMessageFailure(\n\tpi: ExtensionAPI,\n\targs: {\n\t\troute: BuiltinSystemMessageRoute;\n\t\tsessionId?: string;\n\t\tkind: \"custom_message\" | \"user_message\";\n\t\tcontent: string | (TextContent | ImageContent)[];\n\t\tcustomType?: string;\n\t\tdeliverAs?: \"steer\" | \"followUp\";\n\t\ttriggerTurn?: boolean;\n\t\terrorMessage: string;\n\t},\n): void {\n\tconst prefixedContent = prefixContent(args.content);\n\n\temitSenpiConversationEvent(\n\t\tpi,\n\t\tcreateBaseEvent({\n\t\t\taction: \"failed\",\n\t\t\troute: args.route,\n\t\t\tsessionId: args.sessionId,\n\t\t\tkind: args.kind,\n\t\t\tcustomType: args.customType,\n\t\t\ttext: extractText(prefixedContent),\n\t\t\tdeliverAs: args.deliverAs,\n\t\t\ttriggerTurn: args.triggerTurn,\n\t\t\terrorMessage: args.errorMessage,\n\t\t}),\n\t);\n}\n"]}
1
+ {"version":3,"file":"system-messages.js","sourceRoot":"","sources":["../../../../src/core/extensions/builtin/system-messages.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ImageContent, TextContent } from \"@earendil-works/pi-ai\";\nimport type { CustomMessage } from \"../../messages.ts\";\nimport type { ExtensionAPI } from \"../types.ts\";\n\nexport const SENPI_SYSTEM_PREFIX = \"[system:senpi]\";\nexport const SENPI_CONVERSATION_EVENT = \"senpi:conversation\";\n\nexport type BuiltinSystemMessageRoute = \"todotools.continuation\";\nexport type SenpiConversationAction = \"injected\" | \"failed\";\n\nexport interface SenpiConversationEvent {\n\tversion: 1;\n\tsource: \"builtin\";\n\taction: SenpiConversationAction;\n\troute: BuiltinSystemMessageRoute;\n\tsessionId?: string;\n\ttimestamp: number;\n\tconversation: {\n\t\tprefix: typeof SENPI_SYSTEM_PREFIX;\n\t\tkind: \"custom_message\" | \"user_message\";\n\t\tcustomType?: string;\n\t\tdeliverAs?: \"steer\" | \"followUp\";\n\t\ttriggerTurn?: boolean;\n\t};\n\ttext: string;\n\terrorMessage?: string;\n}\n\ntype BuiltinUserMessageOptions = {\n\tdeliverAs?: \"steer\" | \"followUp\";\n\tsessionId?: string;\n};\n\ntype BuiltinCustomMessageOptions = {\n\ttriggerTurn?: boolean;\n\tdeliverAs?: \"steer\" | \"followUp\" | \"nextTurn\";\n\tsessionId?: string;\n};\n\nfunction prefixText(text: string): string {\n\treturn text.startsWith(SENPI_SYSTEM_PREFIX) ? text : `${SENPI_SYSTEM_PREFIX}\\n${text}`;\n}\n\nfunction prefixContent(content: string | (TextContent | ImageContent)[]): string | (TextContent | ImageContent)[] {\n\tif (typeof content === \"string\") {\n\t\treturn prefixText(content);\n\t}\n\n\tconst firstTextIndex = content.findIndex((part) => part.type === \"text\");\n\tif (firstTextIndex === -1) {\n\t\treturn [{ type: \"text\", text: SENPI_SYSTEM_PREFIX }, ...content];\n\t}\n\n\treturn content.map((part, index) => {\n\t\tif (part.type !== \"text\" || index !== firstTextIndex) {\n\t\t\treturn part;\n\t\t}\n\n\t\treturn {\n\t\t\t...part,\n\t\t\ttext: prefixText(part.text),\n\t\t};\n\t});\n}\n\nfunction extractText(content: string | (TextContent | ImageContent)[]): string {\n\tif (typeof content === \"string\") {\n\t\treturn content;\n\t}\n\n\treturn content\n\t\t.filter((part): part is TextContent => part.type === \"text\")\n\t\t.map((part) => part.text)\n\t\t.join(\"\\n\");\n}\n\nfunction emitSenpiConversationEvent(pi: ExtensionAPI, event: SenpiConversationEvent): void {\n\tpi.events.emit(SENPI_CONVERSATION_EVENT, event);\n}\n\nfunction createBaseEvent(args: {\n\taction: SenpiConversationAction;\n\troute: BuiltinSystemMessageRoute;\n\tsessionId?: string;\n\tkind: \"custom_message\" | \"user_message\";\n\tcustomType?: string;\n\tdeliverAs?: \"steer\" | \"followUp\";\n\ttriggerTurn?: boolean;\n\ttext: string;\n\terrorMessage?: string;\n}): SenpiConversationEvent {\n\treturn {\n\t\tversion: 1,\n\t\tsource: \"builtin\",\n\t\taction: args.action,\n\t\troute: args.route,\n\t\tsessionId: args.sessionId,\n\t\ttimestamp: Date.now(),\n\t\tconversation: {\n\t\t\tprefix: SENPI_SYSTEM_PREFIX,\n\t\t\tkind: args.kind,\n\t\t\tcustomType: args.customType,\n\t\t\tdeliverAs: args.deliverAs,\n\t\t\ttriggerTurn: args.triggerTurn,\n\t\t},\n\t\ttext: args.text,\n\t\terrorMessage: args.errorMessage,\n\t};\n}\n\nfunction hasUserMessageOptions(\n\toptions: BuiltinUserMessageOptions | undefined,\n): options is BuiltinUserMessageOptions & { deliverAs: \"steer\" | \"followUp\" } {\n\treturn options?.deliverAs !== undefined;\n}\n\nfunction hasCustomMessageOptions(\n\toptions: BuiltinCustomMessageOptions | undefined,\n): options is BuiltinCustomMessageOptions & { triggerTurn?: boolean; deliverAs?: \"steer\" | \"followUp\" | \"nextTurn\" } {\n\treturn options?.triggerTurn === true || options?.deliverAs !== undefined;\n}\n\nexport function sendBuiltinUserMessage(\n\tpi: ExtensionAPI,\n\troute: BuiltinSystemMessageRoute,\n\tcontent: string | (TextContent | ImageContent)[],\n\toptions?: BuiltinUserMessageOptions,\n): void {\n\tconst prefixedContent = prefixContent(content);\n\n\temitSenpiConversationEvent(\n\t\tpi,\n\t\tcreateBaseEvent({\n\t\t\taction: \"injected\",\n\t\t\troute,\n\t\t\tsessionId: options?.sessionId,\n\t\t\tkind: \"user_message\",\n\t\t\ttext: extractText(prefixedContent),\n\t\t\tdeliverAs: options?.deliverAs,\n\t\t}),\n\t);\n\n\tif (hasUserMessageOptions(options)) {\n\t\tpi.sendUserMessage(prefixedContent, { deliverAs: options.deliverAs });\n\t\treturn;\n\t}\n\n\tpi.sendUserMessage(prefixedContent);\n}\n\nexport function sendBuiltinCustomMessage<TDetails>(\n\tpi: ExtensionAPI,\n\troute: BuiltinSystemMessageRoute,\n\tmessage: Pick<CustomMessage<TDetails>, \"content\" | \"customType\" | \"details\" | \"display\">,\n\toptions?: BuiltinCustomMessageOptions,\n): void {\n\tconst prefixedContent = prefixContent(message.content);\n\tconst deliverAs = options?.deliverAs === \"nextTurn\" ? undefined : options?.deliverAs;\n\n\temitSenpiConversationEvent(\n\t\tpi,\n\t\tcreateBaseEvent({\n\t\t\taction: \"injected\",\n\t\t\troute,\n\t\t\tsessionId: options?.sessionId,\n\t\t\tkind: \"custom_message\",\n\t\t\tcustomType: message.customType,\n\t\t\ttext: extractText(prefixedContent),\n\t\t\tdeliverAs,\n\t\t\ttriggerTurn: options?.triggerTurn,\n\t\t}),\n\t);\n\n\tconst prefixedMessage = {\n\t\t...message,\n\t\tcontent: prefixedContent,\n\t};\n\n\tif (hasCustomMessageOptions(options)) {\n\t\tpi.sendMessage(prefixedMessage, {\n\t\t\ttriggerTurn: options.triggerTurn,\n\t\t\tdeliverAs: options.deliverAs,\n\t\t});\n\t\treturn;\n\t}\n\n\tpi.sendMessage(prefixedMessage);\n}\n\nexport function emitBuiltinSystemMessageFailure(\n\tpi: ExtensionAPI,\n\targs: {\n\t\troute: BuiltinSystemMessageRoute;\n\t\tsessionId?: string;\n\t\tkind: \"custom_message\" | \"user_message\";\n\t\tcontent: string | (TextContent | ImageContent)[];\n\t\tcustomType?: string;\n\t\tdeliverAs?: \"steer\" | \"followUp\";\n\t\ttriggerTurn?: boolean;\n\t\terrorMessage: string;\n\t},\n): void {\n\tconst prefixedContent = prefixContent(args.content);\n\n\temitSenpiConversationEvent(\n\t\tpi,\n\t\tcreateBaseEvent({\n\t\t\taction: \"failed\",\n\t\t\troute: args.route,\n\t\t\tsessionId: args.sessionId,\n\t\t\tkind: args.kind,\n\t\t\tcustomType: args.customType,\n\t\t\ttext: extractText(prefixedContent),\n\t\t\tdeliverAs: args.deliverAs,\n\t\t\ttriggerTurn: args.triggerTurn,\n\t\t\terrorMessage: args.errorMessage,\n\t\t}),\n\t);\n}\n"]}
@@ -6,5 +6,5 @@ export interface ResolveContinuationConfigInput {
6
6
  export interface ResolvedContinuationConfig {
7
7
  enabled: boolean;
8
8
  }
9
- export declare function resolveContinuationConfig({ globalSettings, projectSettings, cliFlag }: ResolveContinuationConfigInput): ResolvedContinuationConfig;
9
+ export declare function resolveContinuationConfig({ globalSettings, projectSettings, cliFlag, }: ResolveContinuationConfigInput): ResolvedContinuationConfig;
10
10
  //# sourceMappingURL=config.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../../../../src/core/extensions/builtin/todotools/continuation/config.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,8BAA8B;IAC9C,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACzC,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC1C,OAAO,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,0BAA0B;IAC1C,OAAO,EAAE,OAAO,CAAC;CACjB;AAwBD,wBAAgB,yBAAyB,CAAC,EACzC,cAAc,EACd,eAAe,EACf,OAAO,EACP,EAAE,8BAA8B,GAAG,0BAA0B,CAkB7D","sourcesContent":["export interface ResolveContinuationConfigInput {\n\tglobalSettings?: Record<string, unknown>;\n\tprojectSettings?: Record<string, unknown>;\n\tcliFlag?: unknown;\n}\n\nexport interface ResolvedContinuationConfig {\n\tenabled: boolean;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction getConfiguredEnabled(settings: Record<string, unknown> | undefined): boolean | undefined {\n\tif (!settings) {\n\t\treturn undefined;\n\t}\n\n\tconst todotools = settings.todotools;\n\tif (!isRecord(todotools)) {\n\t\treturn undefined;\n\t}\n\n\tconst continuation = todotools.continuation;\n\tif (!isRecord(continuation)) {\n\t\treturn undefined;\n\t}\n\n\treturn typeof continuation.enabled === \"boolean\" ? continuation.enabled : undefined;\n}\n\nexport function resolveContinuationConfig({\n\tglobalSettings,\n\tprojectSettings,\n\tcliFlag,\n}: ResolveContinuationConfigInput): ResolvedContinuationConfig {\n\tlet enabled = true;\n\n\tconst globalEnabled = getConfiguredEnabled(globalSettings);\n\tif (typeof globalEnabled === \"boolean\") {\n\t\tenabled = globalEnabled;\n\t}\n\n\tconst projectEnabled = getConfiguredEnabled(projectSettings);\n\tif (typeof projectEnabled === \"boolean\") {\n\t\tenabled = projectEnabled;\n\t}\n\n\tif (cliFlag === true) {\n\t\tenabled = false;\n\t}\n\n\treturn { enabled };\n}\n"]}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../../../../src/core/extensions/builtin/todotools/continuation/config.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,8BAA8B;IAC9C,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACzC,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC1C,OAAO,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,0BAA0B;IAC1C,OAAO,EAAE,OAAO,CAAC;CACjB;AAwBD,wBAAgB,yBAAyB,CAAC,EACzC,cAAc,EACd,eAAe,EACf,OAAO,GACP,EAAE,8BAA8B,GAAG,0BAA0B,CAkB7D"}
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../../../../src/core/extensions/builtin/todotools/continuation/config.ts"],"names":[],"mappings":"AAUA,SAAS,QAAQ,CAAC,KAAc,EAAoC;IACnE,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAAA,CAC5E;AAED,SAAS,oBAAoB,CAAC,QAA6C,EAAuB;IACjG,IAAI,CAAC,QAAQ,EAAE,CAAC;QACf,OAAO,SAAS,CAAC;IAClB,CAAC;IAED,MAAM,SAAS,GAAG,QAAQ,CAAC,SAAS,CAAC;IACrC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;QAC1B,OAAO,SAAS,CAAC;IAClB,CAAC;IAED,MAAM,YAAY,GAAG,SAAS,CAAC,YAAY,CAAC;IAC5C,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;QAC7B,OAAO,SAAS,CAAC;IAClB,CAAC;IAED,OAAO,OAAO,YAAY,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;AAAA,CACpF;AAED,MAAM,UAAU,yBAAyB,CAAC,EACzC,cAAc,EACd,eAAe,EACf,OAAO,GACyB,EAA8B;IAC9D,IAAI,OAAO,GAAG,IAAI,CAAC;IAEnB,MAAM,aAAa,GAAG,oBAAoB,CAAC,cAAc,CAAC,CAAC;IAC3D,IAAI,OAAO,aAAa,KAAK,SAAS,EAAE,CAAC;QACxC,OAAO,GAAG,aAAa,CAAC;IACzB,CAAC;IAED,MAAM,cAAc,GAAG,oBAAoB,CAAC,eAAe,CAAC,CAAC;IAC7D,IAAI,OAAO,cAAc,KAAK,SAAS,EAAE,CAAC;QACzC,OAAO,GAAG,cAAc,CAAC;IAC1B,CAAC;IAED,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;QACtB,OAAO,GAAG,KAAK,CAAC;IACjB,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,CAAC;AAAA,CACnB","sourcesContent":["export interface ResolveContinuationConfigInput {\n\tglobalSettings?: Record<string, unknown>;\n\tprojectSettings?: Record<string, unknown>;\n\tcliFlag?: unknown;\n}\n\nexport interface ResolvedContinuationConfig {\n\tenabled: boolean;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction getConfiguredEnabled(settings: Record<string, unknown> | undefined): boolean | undefined {\n\tif (!settings) {\n\t\treturn undefined;\n\t}\n\n\tconst todotools = settings.todotools;\n\tif (!isRecord(todotools)) {\n\t\treturn undefined;\n\t}\n\n\tconst continuation = todotools.continuation;\n\tif (!isRecord(continuation)) {\n\t\treturn undefined;\n\t}\n\n\treturn typeof continuation.enabled === \"boolean\" ? continuation.enabled : undefined;\n}\n\nexport function resolveContinuationConfig({\n\tglobalSettings,\n\tprojectSettings,\n\tcliFlag,\n}: ResolveContinuationConfigInput): ResolvedContinuationConfig {\n\tlet enabled = true;\n\n\tconst globalEnabled = getConfiguredEnabled(globalSettings);\n\tif (typeof globalEnabled === \"boolean\") {\n\t\tenabled = globalEnabled;\n\t}\n\n\tconst projectEnabled = getConfiguredEnabled(projectSettings);\n\tif (typeof projectEnabled === \"boolean\") {\n\t\tenabled = projectEnabled;\n\t}\n\n\tif (cliFlag === true) {\n\t\tenabled = false;\n\t}\n\n\treturn { enabled };\n}\n"]}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../../../../src/core/extensions/builtin/todotools/continuation/config.ts"],"names":[],"mappings":"AAUA,SAAS,QAAQ,CAAC,KAAc;IAC/B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC7E,CAAC;AAED,SAAS,oBAAoB,CAAC,QAA6C;IAC1E,IAAI,CAAC,QAAQ,EAAE,CAAC;QACf,OAAO,SAAS,CAAC;IAClB,CAAC;IAED,MAAM,SAAS,GAAG,QAAQ,CAAC,SAAS,CAAC;IACrC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;QAC1B,OAAO,SAAS,CAAC;IAClB,CAAC;IAED,MAAM,YAAY,GAAG,SAAS,CAAC,YAAY,CAAC;IAC5C,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;QAC7B,OAAO,SAAS,CAAC;IAClB,CAAC;IAED,OAAO,OAAO,YAAY,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;AACrF,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,EACzC,cAAc,EACd,eAAe,EACf,OAAO,GACyB;IAChC,IAAI,OAAO,GAAG,IAAI,CAAC;IAEnB,MAAM,aAAa,GAAG,oBAAoB,CAAC,cAAc,CAAC,CAAC;IAC3D,IAAI,OAAO,aAAa,KAAK,SAAS,EAAE,CAAC;QACxC,OAAO,GAAG,aAAa,CAAC;IACzB,CAAC;IAED,MAAM,cAAc,GAAG,oBAAoB,CAAC,eAAe,CAAC,CAAC;IAC7D,IAAI,OAAO,cAAc,KAAK,SAAS,EAAE,CAAC;QACzC,OAAO,GAAG,cAAc,CAAC;IAC1B,CAAC;IAED,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;QACtB,OAAO,GAAG,KAAK,CAAC;IACjB,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,CAAC;AACpB,CAAC","sourcesContent":["export interface ResolveContinuationConfigInput {\n\tglobalSettings?: Record<string, unknown>;\n\tprojectSettings?: Record<string, unknown>;\n\tcliFlag?: unknown;\n}\n\nexport interface ResolvedContinuationConfig {\n\tenabled: boolean;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction getConfiguredEnabled(settings: Record<string, unknown> | undefined): boolean | undefined {\n\tif (!settings) {\n\t\treturn undefined;\n\t}\n\n\tconst todotools = settings.todotools;\n\tif (!isRecord(todotools)) {\n\t\treturn undefined;\n\t}\n\n\tconst continuation = todotools.continuation;\n\tif (!isRecord(continuation)) {\n\t\treturn undefined;\n\t}\n\n\treturn typeof continuation.enabled === \"boolean\" ? continuation.enabled : undefined;\n}\n\nexport function resolveContinuationConfig({\n\tglobalSettings,\n\tprojectSettings,\n\tcliFlag,\n}: ResolveContinuationConfigInput): ResolvedContinuationConfig {\n\tlet enabled = true;\n\n\tconst globalEnabled = getConfiguredEnabled(globalSettings);\n\tif (typeof globalEnabled === \"boolean\") {\n\t\tenabled = globalEnabled;\n\t}\n\n\tconst projectEnabled = getConfiguredEnabled(projectSettings);\n\tif (typeof projectEnabled === \"boolean\") {\n\t\tenabled = projectEnabled;\n\t}\n\n\tif (cliFlag === true) {\n\t\tenabled = false;\n\t}\n\n\treturn { enabled };\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/core/extensions/builtin/todotools/continuation/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC","sourcesContent":["export { installContinuation } from \"./runtime.ts\";\n"]}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/core/extensions/builtin/todotools/continuation/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"prompt.d.ts","sourceRoot":"","sources":["../../../../../../src/core/extensions/builtin/todotools/continuation/prompt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsC,KAAK,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEhF,eAAO,MAAM,sBAAsB,y3BAUmN,CAAC;AAEvP,wBAAgB,eAAe,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,MAAM,CAEzD;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,MAAM,CAmBjE","sourcesContent":["import { isIncompleteTodo, sanitizeTodoText, type TodoItem } from \"../state.ts\";\n\nexport const CONTINUATION_DIRECTIVE = `[SYSTEM DIRECTIVE: SENPI - TODO CONTINUATION]\n\nIncomplete tasks remain in your todo list. Continue working on the next pending task.\n\n- FIRST: Continue the first actionable remaining task now. If an in-progress task is already done, verify it and mark it completed before moving on\n- Proceed without asking for permission\n- Mark each task complete immediately when finished\n- Do not stop until all tasks are done\n- Do not reply with refusal, deferral, or a summary-only response\n- If a task is already complete, no longer needed, or blocked, verify that and update the todo list to a terminal state instead of leaving it pending\n- If you believe all work is already complete, the system is questioning your completion claim. Critically re-examine each todo item from a skeptical perspective, verify the work was actually done correctly, and update the todo list accordingly.`;\n\nexport function countIncomplete(todos: TodoItem[]): number {\n\treturn todos.filter(isIncompleteTodo).length;\n}\n\nexport function buildContinuationPrompt(todos: TodoItem[]): string {\n\tif (todos.length === 0) {\n\t\treturn \"\";\n\t}\n\n\tconst completedCount = todos.filter((todo) => todo.status === \"completed\").length;\n\tconst remainingTodos = todos.filter(isIncompleteTodo);\n\tconst activeTotal = completedCount + remainingTodos.length;\n\tconst remainingLines = remainingTodos\n\t\t.map((todo) => `- [${todo.status}] ${sanitizeTodoText(todo.content)}`)\n\t\t.join(\"\\n\");\n\n\treturn `${CONTINUATION_DIRECTIVE}\n\n[Status: ${completedCount}/${activeTotal} completed, ${remainingTodos.length} remaining]\n\nRemaining tasks:\n${remainingLines}\n`;\n}\n"]}
1
+ {"version":3,"file":"prompt.d.ts","sourceRoot":"","sources":["../../../../../../src/core/extensions/builtin/todotools/continuation/prompt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsC,KAAK,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEhF,eAAO,MAAM,sBAAsB,y3BAUmN,CAAC;AAEvP,wBAAgB,eAAe,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,MAAM,CAEzD;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,MAAM,CAmBjE"}
@@ -1 +1 @@
1
- {"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../../../../../src/core/extensions/builtin/todotools/continuation/prompt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAiB,MAAM,aAAa,CAAC;AAEhF,MAAM,CAAC,MAAM,sBAAsB,GAAG;;;;;;;;;;sPAUgN,CAAC;AAEvP,MAAM,UAAU,eAAe,CAAC,KAAiB,EAAU;IAC1D,OAAO,KAAK,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,MAAM,CAAC;AAAA,CAC7C;AAED,MAAM,UAAU,uBAAuB,CAAC,KAAiB,EAAU;IAClE,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,EAAE,CAAC;IACX,CAAC;IAED,MAAM,cAAc,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC,MAAM,CAAC;IAClF,MAAM,cAAc,GAAG,KAAK,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC;IACtD,MAAM,WAAW,GAAG,cAAc,GAAG,cAAc,CAAC,MAAM,CAAC;IAC3D,MAAM,cAAc,GAAG,cAAc;SACnC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,IAAI,CAAC,MAAM,KAAK,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;SACrE,IAAI,CAAC,IAAI,CAAC,CAAC;IAEb,OAAO,GAAG,sBAAsB;;WAEtB,cAAc,IAAI,WAAW,eAAe,cAAc,CAAC,MAAM;;;EAG1E,cAAc;CACf,CAAC;AAAA,CACD","sourcesContent":["import { isIncompleteTodo, sanitizeTodoText, type TodoItem } from \"../state.ts\";\n\nexport const CONTINUATION_DIRECTIVE = `[SYSTEM DIRECTIVE: SENPI - TODO CONTINUATION]\n\nIncomplete tasks remain in your todo list. Continue working on the next pending task.\n\n- FIRST: Continue the first actionable remaining task now. If an in-progress task is already done, verify it and mark it completed before moving on\n- Proceed without asking for permission\n- Mark each task complete immediately when finished\n- Do not stop until all tasks are done\n- Do not reply with refusal, deferral, or a summary-only response\n- If a task is already complete, no longer needed, or blocked, verify that and update the todo list to a terminal state instead of leaving it pending\n- If you believe all work is already complete, the system is questioning your completion claim. Critically re-examine each todo item from a skeptical perspective, verify the work was actually done correctly, and update the todo list accordingly.`;\n\nexport function countIncomplete(todos: TodoItem[]): number {\n\treturn todos.filter(isIncompleteTodo).length;\n}\n\nexport function buildContinuationPrompt(todos: TodoItem[]): string {\n\tif (todos.length === 0) {\n\t\treturn \"\";\n\t}\n\n\tconst completedCount = todos.filter((todo) => todo.status === \"completed\").length;\n\tconst remainingTodos = todos.filter(isIncompleteTodo);\n\tconst activeTotal = completedCount + remainingTodos.length;\n\tconst remainingLines = remainingTodos\n\t\t.map((todo) => `- [${todo.status}] ${sanitizeTodoText(todo.content)}`)\n\t\t.join(\"\\n\");\n\n\treturn `${CONTINUATION_DIRECTIVE}\n\n[Status: ${completedCount}/${activeTotal} completed, ${remainingTodos.length} remaining]\n\nRemaining tasks:\n${remainingLines}\n`;\n}\n"]}
1
+ {"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../../../../../src/core/extensions/builtin/todotools/continuation/prompt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAiB,MAAM,aAAa,CAAC;AAEhF,MAAM,CAAC,MAAM,sBAAsB,GAAG;;;;;;;;;;sPAUgN,CAAC;AAEvP,MAAM,UAAU,eAAe,CAAC,KAAiB;IAChD,OAAO,KAAK,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,MAAM,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,KAAiB;IACxD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,EAAE,CAAC;IACX,CAAC;IAED,MAAM,cAAc,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC,MAAM,CAAC;IAClF,MAAM,cAAc,GAAG,KAAK,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC;IACtD,MAAM,WAAW,GAAG,cAAc,GAAG,cAAc,CAAC,MAAM,CAAC;IAC3D,MAAM,cAAc,GAAG,cAAc;SACnC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,IAAI,CAAC,MAAM,KAAK,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;SACrE,IAAI,CAAC,IAAI,CAAC,CAAC;IAEb,OAAO,GAAG,sBAAsB;;WAEtB,cAAc,IAAI,WAAW,eAAe,cAAc,CAAC,MAAM;;;EAG1E,cAAc;CACf,CAAC;AACF,CAAC","sourcesContent":["import { isIncompleteTodo, sanitizeTodoText, type TodoItem } from \"../state.ts\";\n\nexport const CONTINUATION_DIRECTIVE = `[SYSTEM DIRECTIVE: SENPI - TODO CONTINUATION]\n\nIncomplete tasks remain in your todo list. Continue working on the next pending task.\n\n- FIRST: Continue the first actionable remaining task now. If an in-progress task is already done, verify it and mark it completed before moving on\n- Proceed without asking for permission\n- Mark each task complete immediately when finished\n- Do not stop until all tasks are done\n- Do not reply with refusal, deferral, or a summary-only response\n- If a task is already complete, no longer needed, or blocked, verify that and update the todo list to a terminal state instead of leaving it pending\n- If you believe all work is already complete, the system is questioning your completion claim. Critically re-examine each todo item from a skeptical perspective, verify the work was actually done correctly, and update the todo list accordingly.`;\n\nexport function countIncomplete(todos: TodoItem[]): number {\n\treturn todos.filter(isIncompleteTodo).length;\n}\n\nexport function buildContinuationPrompt(todos: TodoItem[]): string {\n\tif (todos.length === 0) {\n\t\treturn \"\";\n\t}\n\n\tconst completedCount = todos.filter((todo) => todo.status === \"completed\").length;\n\tconst remainingTodos = todos.filter(isIncompleteTodo);\n\tconst activeTotal = completedCount + remainingTodos.length;\n\tconst remainingLines = remainingTodos\n\t\t.map((todo) => `- [${todo.status}] ${sanitizeTodoText(todo.content)}`)\n\t\t.join(\"\\n\");\n\n\treturn `${CONTINUATION_DIRECTIVE}\n\n[Status: ${completedCount}/${activeTotal} completed, ${remainingTodos.length} remaining]\n\nRemaining tasks:\n${remainingLines}\n`;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../../../../../src/core/extensions/builtin/todotools/continuation/runtime.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAuC,MAAM,mBAAmB,CAAC;AAE3F,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAW5C,KAAK,gBAAgB,GAAG;IACvB,eAAe,EAAE,MAAM,QAAQ,EAAE,CAAC;CAClC,CAAC;AAGF,eAAO,MAAM,sBAAsB,KAAK,CAAC;AA0BzC,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAEpE;AAED,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAEzE;AAqGD,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,gBAAgB,GAAG,IAAI,CAkGlF","sourcesContent":["import type { AssistantMessage } from \"@earendil-works/pi-ai\";\nimport type { ExtensionAPI, ExtensionContext, SessionStartEvent } from \"../../../types.ts\";\nimport { readTodoSettings } from \"../settings.ts\";\nimport type { TodoItem } from \"../state.ts\";\nimport { emitTodoSystemMessageFailure, sendTodoUserMessage } from \"../system-messages.ts\";\nimport { resolveContinuationConfig } from \"./config.ts\";\nimport { buildContinuationPrompt, CONTINUATION_DIRECTIVE, countIncomplete } from \"./prompt.ts\";\n\ntype ContinuationState = {\n\treEntryFlag: boolean;\n\tchainCount: number;\n\tpendingDispatchAbortController?: AbortController;\n};\n\ntype ContinuationDeps = {\n\tgetCurrentTodos: () => TodoItem[];\n};\n\nconst CLEAN_STOP_REASONS = new Set([\"stop\", \"toolUse\", \"endTurn\", \"end_turn\"]);\nexport const CONTINUATION_CHAIN_CAP = 10;\nconst IDLE_POLL_INTERVAL_MS = 50;\nconst IDLE_WAIT_TIMEOUT_MS = 10_000;\n\nfunction isAssistantMessage(message: unknown): message is AssistantMessage {\n\tif (!message || typeof message !== \"object\") {\n\t\treturn false;\n\t}\n\n\tconst role = (message as { role?: unknown }).role;\n\treturn role === \"assistant\";\n}\n\nfunction getLastAssistantStopReason(messages: unknown[]): string | undefined {\n\tfor (let index = messages.length - 1; index >= 0; index -= 1) {\n\t\tconst message = messages[index];\n\t\tif (!isAssistantMessage(message)) {\n\t\t\tcontinue;\n\t\t}\n\n\t\treturn message.stopReason;\n\t}\n\n\treturn undefined;\n}\n\nexport function isContinuationFollowUpPrompt(prompt: string): boolean {\n\treturn prompt.includes(CONTINUATION_DIRECTIVE);\n}\n\nexport function isCleanStopReason(stopReason: string | undefined): boolean {\n\treturn typeof stopReason === \"string\" && CLEAN_STOP_REASONS.has(stopReason);\n}\n\nfunction createInitialState(): ContinuationState {\n\treturn {\n\t\treEntryFlag: false,\n\t\tchainCount: 0,\n\t};\n}\n\nfunction abortPendingDispatch(state: ContinuationState): void {\n\tstate.pendingDispatchAbortController?.abort();\n\tstate.pendingDispatchAbortController = undefined;\n}\n\nfunction getSessionState(sessionStates: Map<string, ContinuationState>, sessionId: string): ContinuationState {\n\tconst existingState = sessionStates.get(sessionId);\n\tif (existingState) {\n\t\treturn existingState;\n\t}\n\n\tconst nextState = createInitialState();\n\tsessionStates.set(sessionId, nextState);\n\treturn nextState;\n}\n\nfunction getSessionId(ctx: ExtensionContext): string {\n\treturn ctx.sessionManager.getSessionId();\n}\n\nfunction isNonInteractiveContext(ctx: ExtensionContext): boolean {\n\treturn !ctx.hasUI;\n}\n\nfunction shouldResetForSessionStart(event: SessionStartEvent): boolean {\n\tconst reason = event.reason as string;\n\treturn reason === \"reload\" || reason === \"resume\" || reason === \"compact\";\n}\n\nfunction reportContinuationError(pi: ExtensionAPI, ctx: ExtensionContext, error: unknown, prompt?: string): void {\n\tconst message = error instanceof Error ? error.message : String(error);\n\temitTodoSystemMessageFailure(pi, {\n\t\troute: \"todotools.continuation\",\n\t\tsessionId: getSessionId(ctx),\n\t\tcontent: prompt ?? \"\",\n\t\terrorMessage: message,\n\t});\n\tpi.events.emit(\"todotools:continuation_error\", {\n\t\tsessionId: getSessionId(ctx),\n\t\tmessage,\n\t});\n\tif (ctx.hasUI) {\n\t\tctx.ui.notify(`Todo continuation failed: ${message}`, \"error\");\n\t\treturn;\n\t}\n\tprocess.stderr.write(`[todotools continuation] ${message}\\n`);\n}\n\nfunction wait(ms: number): Promise<void> {\n\treturn new Promise((resolve) => {\n\t\tsetTimeout(resolve, ms);\n\t});\n}\n\nasync function dispatchContinuationWhenIdle(\n\tpi: ExtensionAPI,\n\tctx: ExtensionContext,\n\tprompt: string,\n\tsignal: AbortSignal,\n): Promise<void> {\n\tconst startedAt = Date.now();\n\n\tif (signal.aborted) {\n\t\treturn;\n\t}\n\n\twhile (Date.now() - startedAt < IDLE_WAIT_TIMEOUT_MS) {\n\t\tif (signal.aborted) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (ctx.isIdle()) {\n\t\t\tif (signal.aborted) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tsendTodoUserMessage(pi, \"todotools.continuation\", prompt, {\n\t\t\t\tsessionId: getSessionId(ctx),\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tawait wait(IDLE_POLL_INTERVAL_MS);\n\n\t\tif (signal.aborted) {\n\t\t\treturn;\n\t\t}\n\t}\n\n\tconsole.warn(\"[todotools continuation] Timed out waiting for idle state; skipping auto-dispatch.\");\n}\n\nexport function installContinuation(pi: ExtensionAPI, deps: ContinuationDeps): void {\n\tconst sessionStates = new Map<string, ContinuationState>();\n\n\tpi.registerFlag(\"disable-todo-continuation\", {\n\t\ttype: \"boolean\",\n\t\tdefault: false,\n\t\tdescription: \"Disable todo continuation — automatic follow-up when incomplete todos remain in the list\",\n\t});\n\n\tpi.on(\"before_agent_start\", async (event, ctx) => {\n\t\tconst sessionState = getSessionState(sessionStates, getSessionId(ctx));\n\t\tsessionState.reEntryFlag = false;\n\t\tif (!isContinuationFollowUpPrompt(event.prompt)) {\n\t\t\tsessionState.chainCount = 0;\n\t\t\tabortPendingDispatch(sessionState);\n\t\t}\n\t});\n\n\tpi.on(\"session_start\", async (event, ctx) => {\n\t\tif (!shouldResetForSessionStart(event)) {\n\t\t\treturn;\n\t\t}\n\t\tconst sessionId = getSessionId(ctx);\n\t\tconst existingState = sessionStates.get(sessionId);\n\t\tif (existingState) {\n\t\t\tabortPendingDispatch(existingState);\n\t\t}\n\t\tsessionStates.set(sessionId, createInitialState());\n\t});\n\n\tpi.on(\"session_shutdown\", async (_event, ctx) => {\n\t\tconst sessionId = getSessionId(ctx);\n\t\tconst existingState = sessionStates.get(sessionId);\n\t\tif (existingState) {\n\t\t\tabortPendingDispatch(existingState);\n\t\t}\n\t\tsessionStates.delete(sessionId);\n\t});\n\n\tpi.on(\"agent_end\", async (event, ctx) => {\n\t\ttry {\n\t\t\tif (isNonInteractiveContext(ctx)) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst stopReason = getLastAssistantStopReason(event.messages);\n\t\t\tif (!isCleanStopReason(stopReason)) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst settings = readTodoSettings(ctx.cwd);\n\t\t\tconst config = resolveContinuationConfig({\n\t\t\t\tglobalSettings: settings.globalSettings,\n\t\t\t\tprojectSettings: settings.projectSettings,\n\t\t\t\tcliFlag: pi.getFlag(\"disable-todo-continuation\"),\n\t\t\t});\n\t\t\tif (!config.enabled) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst todos = deps.getCurrentTodos();\n\t\t\tif (countIncomplete(todos) === 0) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst sessionId = getSessionId(ctx);\n\t\t\tconst sessionState = getSessionState(sessionStates, sessionId);\n\t\t\tif (sessionState.reEntryFlag) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (sessionState.chainCount >= CONTINUATION_CHAIN_CAP) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst prompt = buildContinuationPrompt(todos);\n\t\t\tabortPendingDispatch(sessionState);\n\t\t\tconst pendingDispatchAbortController = new AbortController();\n\t\t\tsessionState.pendingDispatchAbortController = pendingDispatchAbortController;\n\t\t\tsessionState.reEntryFlag = true;\n\t\t\tsessionState.chainCount += 1;\n\t\t\tsetTimeout(() => {\n\t\t\t\tvoid (async () => {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait dispatchContinuationWhenIdle(pi, ctx, prompt, pendingDispatchAbortController.signal);\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\treportContinuationError(pi, ctx, error, prompt);\n\t\t\t\t\t} finally {\n\t\t\t\t\t\tconst currentState = sessionStates.get(sessionId);\n\t\t\t\t\t\tif (currentState?.pendingDispatchAbortController === pendingDispatchAbortController) {\n\t\t\t\t\t\t\tcurrentState.pendingDispatchAbortController = undefined;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t})();\n\t\t\t}, 0);\n\t\t} catch (error) {\n\t\t\treportContinuationError(pi, ctx, error);\n\t\t}\n\t});\n}\n"]}
1
+ {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../../../../../src/core/extensions/builtin/todotools/continuation/runtime.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAuC,MAAM,mBAAmB,CAAC;AAE3F,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAW5C,KAAK,gBAAgB,GAAG;IACvB,eAAe,EAAE,MAAM,QAAQ,EAAE,CAAC;CAClC,CAAC;AAGF,eAAO,MAAM,sBAAsB,KAAK,CAAC;AA0BzC,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAEpE;AAED,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAEzE;AAqGD,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,gBAAgB,GAAG,IAAI,CAkGlF"}
@@ -1 +1 @@
1
- {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../../../../../src/core/extensions/builtin/todotools/continuation/runtime.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAElD,OAAO,EAAE,4BAA4B,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC1F,OAAO,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAC;AACxD,OAAO,EAAE,uBAAuB,EAAE,sBAAsB,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAY/F,MAAM,kBAAkB,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC,CAAC;AAC/E,MAAM,CAAC,MAAM,sBAAsB,GAAG,EAAE,CAAC;AACzC,MAAM,qBAAqB,GAAG,EAAE,CAAC;AACjC,MAAM,oBAAoB,GAAG,MAAM,CAAC;AAEpC,SAAS,kBAAkB,CAAC,OAAgB,EAA+B;IAC1E,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;QAC7C,OAAO,KAAK,CAAC;IACd,CAAC;IAED,MAAM,IAAI,GAAI,OAA8B,CAAC,IAAI,CAAC;IAClD,OAAO,IAAI,KAAK,WAAW,CAAC;AAAA,CAC5B;AAED,SAAS,0BAA0B,CAAC,QAAmB,EAAsB;IAC5E,KAAK,IAAI,KAAK,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QAC9D,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;QAChC,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,EAAE,CAAC;YAClC,SAAS;QACV,CAAC;QAED,OAAO,OAAO,CAAC,UAAU,CAAC;IAC3B,CAAC;IAED,OAAO,SAAS,CAAC;AAAA,CACjB;AAED,MAAM,UAAU,4BAA4B,CAAC,MAAc,EAAW;IACrE,OAAO,MAAM,CAAC,QAAQ,CAAC,sBAAsB,CAAC,CAAC;AAAA,CAC/C;AAED,MAAM,UAAU,iBAAiB,CAAC,UAA8B,EAAW;IAC1E,OAAO,OAAO,UAAU,KAAK,QAAQ,IAAI,kBAAkB,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;AAAA,CAC5E;AAED,SAAS,kBAAkB,GAAsB;IAChD,OAAO;QACN,WAAW,EAAE,KAAK;QAClB,UAAU,EAAE,CAAC;KACb,CAAC;AAAA,CACF;AAED,SAAS,oBAAoB,CAAC,KAAwB,EAAQ;IAC7D,KAAK,CAAC,8BAA8B,EAAE,KAAK,EAAE,CAAC;IAC9C,KAAK,CAAC,8BAA8B,GAAG,SAAS,CAAC;AAAA,CACjD;AAED,SAAS,eAAe,CAAC,aAA6C,EAAE,SAAiB,EAAqB;IAC7G,MAAM,aAAa,GAAG,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACnD,IAAI,aAAa,EAAE,CAAC;QACnB,OAAO,aAAa,CAAC;IACtB,CAAC;IAED,MAAM,SAAS,GAAG,kBAAkB,EAAE,CAAC;IACvC,aAAa,CAAC,GAAG,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IACxC,OAAO,SAAS,CAAC;AAAA,CACjB;AAED,SAAS,YAAY,CAAC,GAAqB,EAAU;IACpD,OAAO,GAAG,CAAC,cAAc,CAAC,YAAY,EAAE,CAAC;AAAA,CACzC;AAED,SAAS,uBAAuB,CAAC,GAAqB,EAAW;IAChE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;AAAA,CAClB;AAED,SAAS,0BAA0B,CAAC,KAAwB,EAAW;IACtE,MAAM,MAAM,GAAG,KAAK,CAAC,MAAgB,CAAC;IACtC,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,SAAS,CAAC;AAAA,CAC1E;AAED,SAAS,uBAAuB,CAAC,EAAgB,EAAE,GAAqB,EAAE,KAAc,EAAE,MAAe,EAAQ;IAChH,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACvE,4BAA4B,CAAC,EAAE,EAAE;QAChC,KAAK,EAAE,wBAAwB;QAC/B,SAAS,EAAE,YAAY,CAAC,GAAG,CAAC;QAC5B,OAAO,EAAE,MAAM,IAAI,EAAE;QACrB,YAAY,EAAE,OAAO;KACrB,CAAC,CAAC;IACH,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,8BAA8B,EAAE;QAC9C,SAAS,EAAE,YAAY,CAAC,GAAG,CAAC;QAC5B,OAAO;KACP,CAAC,CAAC;IACH,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;QACf,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,6BAA6B,OAAO,EAAE,EAAE,OAAO,CAAC,CAAC;QAC/D,OAAO;IACR,CAAC;IACD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,4BAA4B,OAAO,IAAI,CAAC,CAAC;AAAA,CAC9D;AAED,SAAS,IAAI,CAAC,EAAU,EAAiB;IACxC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC;QAC/B,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IAAA,CACxB,CAAC,CAAC;AAAA,CACH;AAED,KAAK,UAAU,4BAA4B,CAC1C,EAAgB,EAChB,GAAqB,EACrB,MAAc,EACd,MAAmB,EACH;IAChB,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAE7B,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,OAAO;IACR,CAAC;IAED,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,GAAG,oBAAoB,EAAE,CAAC;QACtD,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,OAAO;QACR,CAAC;QAED,IAAI,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC;YAClB,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;gBACpB,OAAO;YACR,CAAC;YAED,mBAAmB,CAAC,EAAE,EAAE,wBAAwB,EAAE,MAAM,EAAE;gBACzD,SAAS,EAAE,YAAY,CAAC,GAAG,CAAC;aAC5B,CAAC,CAAC;YACH,OAAO;QACR,CAAC;QAED,MAAM,IAAI,CAAC,qBAAqB,CAAC,CAAC;QAElC,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,OAAO;QACR,CAAC;IACF,CAAC;IAED,OAAO,CAAC,IAAI,CAAC,oFAAoF,CAAC,CAAC;AAAA,CACnG;AAED,MAAM,UAAU,mBAAmB,CAAC,EAAgB,EAAE,IAAsB,EAAQ;IACnF,MAAM,aAAa,GAAG,IAAI,GAAG,EAA6B,CAAC;IAE3D,EAAE,CAAC,YAAY,CAAC,2BAA2B,EAAE;QAC5C,IAAI,EAAE,SAAS;QACf,OAAO,EAAE,KAAK;QACd,WAAW,EAAE,4FAA0F;KACvG,CAAC,CAAC;IAEH,EAAE,CAAC,EAAE,CAAC,oBAAoB,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,CAAC;QACjD,MAAM,YAAY,GAAG,eAAe,CAAC,aAAa,EAAE,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC;QACvE,YAAY,CAAC,WAAW,GAAG,KAAK,CAAC;QACjC,IAAI,CAAC,4BAA4B,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;YACjD,YAAY,CAAC,UAAU,GAAG,CAAC,CAAC;YAC5B,oBAAoB,CAAC,YAAY,CAAC,CAAC;QACpC,CAAC;IAAA,CACD,CAAC,CAAC;IAEH,EAAE,CAAC,EAAE,CAAC,eAAe,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,CAAC;QAC5C,IAAI,CAAC,0BAA0B,CAAC,KAAK,CAAC,EAAE,CAAC;YACxC,OAAO;QACR,CAAC;QACD,MAAM,SAAS,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;QACpC,MAAM,aAAa,GAAG,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACnD,IAAI,aAAa,EAAE,CAAC;YACnB,oBAAoB,CAAC,aAAa,CAAC,CAAC;QACrC,CAAC;QACD,aAAa,CAAC,GAAG,CAAC,SAAS,EAAE,kBAAkB,EAAE,CAAC,CAAC;IAAA,CACnD,CAAC,CAAC;IAEH,EAAE,CAAC,EAAE,CAAC,kBAAkB,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,CAAC;QAChD,MAAM,SAAS,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;QACpC,MAAM,aAAa,GAAG,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACnD,IAAI,aAAa,EAAE,CAAC;YACnB,oBAAoB,CAAC,aAAa,CAAC,CAAC;QACrC,CAAC;QACD,aAAa,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAAA,CAChC,CAAC,CAAC;IAEH,EAAE,CAAC,EAAE,CAAC,WAAW,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,CAAC;QACxC,IAAI,CAAC;YACJ,IAAI,uBAAuB,CAAC,GAAG,CAAC,EAAE,CAAC;gBAClC,OAAO;YACR,CAAC;YAED,MAAM,UAAU,GAAG,0BAA0B,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YAC9D,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC,EAAE,CAAC;gBACpC,OAAO;YACR,CAAC;YAED,MAAM,QAAQ,GAAG,gBAAgB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAC3C,MAAM,MAAM,GAAG,yBAAyB,CAAC;gBACxC,cAAc,EAAE,QAAQ,CAAC,cAAc;gBACvC,eAAe,EAAE,QAAQ,CAAC,eAAe;gBACzC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,2BAA2B,CAAC;aAChD,CAAC,CAAC;YACH,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBACrB,OAAO;YACR,CAAC;YAED,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;YACrC,IAAI,eAAe,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;gBAClC,OAAO;YACR,CAAC;YAED,MAAM,SAAS,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;YACpC,MAAM,YAAY,GAAG,eAAe,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC;YAC/D,IAAI,YAAY,CAAC,WAAW,EAAE,CAAC;gBAC9B,OAAO;YACR,CAAC;YACD,IAAI,YAAY,CAAC,UAAU,IAAI,sBAAsB,EAAE,CAAC;gBACvD,OAAO;YACR,CAAC;YAED,MAAM,MAAM,GAAG,uBAAuB,CAAC,KAAK,CAAC,CAAC;YAC9C,oBAAoB,CAAC,YAAY,CAAC,CAAC;YACnC,MAAM,8BAA8B,GAAG,IAAI,eAAe,EAAE,CAAC;YAC7D,YAAY,CAAC,8BAA8B,GAAG,8BAA8B,CAAC;YAC7E,YAAY,CAAC,WAAW,GAAG,IAAI,CAAC;YAChC,YAAY,CAAC,UAAU,IAAI,CAAC,CAAC;YAC7B,UAAU,CAAC,GAAG,EAAE,CAAC;gBAChB,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC;oBACjB,IAAI,CAAC;wBACJ,MAAM,4BAA4B,CAAC,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,8BAA8B,CAAC,MAAM,CAAC,CAAC;oBAC5F,CAAC;oBAAC,OAAO,KAAK,EAAE,CAAC;wBAChB,uBAAuB,CAAC,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;oBACjD,CAAC;4BAAS,CAAC;wBACV,MAAM,YAAY,GAAG,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;wBAClD,IAAI,YAAY,EAAE,8BAA8B,KAAK,8BAA8B,EAAE,CAAC;4BACrF,YAAY,CAAC,8BAA8B,GAAG,SAAS,CAAC;wBACzD,CAAC;oBACF,CAAC;gBAAA,CACD,CAAC,EAAE,CAAC;YAAA,CACL,EAAE,CAAC,CAAC,CAAC;QACP,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,uBAAuB,CAAC,EAAE,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;QACzC,CAAC;IAAA,CACD,CAAC,CAAC;AAAA,CACH","sourcesContent":["import type { AssistantMessage } from \"@earendil-works/pi-ai\";\nimport type { ExtensionAPI, ExtensionContext, SessionStartEvent } from \"../../../types.ts\";\nimport { readTodoSettings } from \"../settings.ts\";\nimport type { TodoItem } from \"../state.ts\";\nimport { emitTodoSystemMessageFailure, sendTodoUserMessage } from \"../system-messages.ts\";\nimport { resolveContinuationConfig } from \"./config.ts\";\nimport { buildContinuationPrompt, CONTINUATION_DIRECTIVE, countIncomplete } from \"./prompt.ts\";\n\ntype ContinuationState = {\n\treEntryFlag: boolean;\n\tchainCount: number;\n\tpendingDispatchAbortController?: AbortController;\n};\n\ntype ContinuationDeps = {\n\tgetCurrentTodos: () => TodoItem[];\n};\n\nconst CLEAN_STOP_REASONS = new Set([\"stop\", \"toolUse\", \"endTurn\", \"end_turn\"]);\nexport const CONTINUATION_CHAIN_CAP = 10;\nconst IDLE_POLL_INTERVAL_MS = 50;\nconst IDLE_WAIT_TIMEOUT_MS = 10_000;\n\nfunction isAssistantMessage(message: unknown): message is AssistantMessage {\n\tif (!message || typeof message !== \"object\") {\n\t\treturn false;\n\t}\n\n\tconst role = (message as { role?: unknown }).role;\n\treturn role === \"assistant\";\n}\n\nfunction getLastAssistantStopReason(messages: unknown[]): string | undefined {\n\tfor (let index = messages.length - 1; index >= 0; index -= 1) {\n\t\tconst message = messages[index];\n\t\tif (!isAssistantMessage(message)) {\n\t\t\tcontinue;\n\t\t}\n\n\t\treturn message.stopReason;\n\t}\n\n\treturn undefined;\n}\n\nexport function isContinuationFollowUpPrompt(prompt: string): boolean {\n\treturn prompt.includes(CONTINUATION_DIRECTIVE);\n}\n\nexport function isCleanStopReason(stopReason: string | undefined): boolean {\n\treturn typeof stopReason === \"string\" && CLEAN_STOP_REASONS.has(stopReason);\n}\n\nfunction createInitialState(): ContinuationState {\n\treturn {\n\t\treEntryFlag: false,\n\t\tchainCount: 0,\n\t};\n}\n\nfunction abortPendingDispatch(state: ContinuationState): void {\n\tstate.pendingDispatchAbortController?.abort();\n\tstate.pendingDispatchAbortController = undefined;\n}\n\nfunction getSessionState(sessionStates: Map<string, ContinuationState>, sessionId: string): ContinuationState {\n\tconst existingState = sessionStates.get(sessionId);\n\tif (existingState) {\n\t\treturn existingState;\n\t}\n\n\tconst nextState = createInitialState();\n\tsessionStates.set(sessionId, nextState);\n\treturn nextState;\n}\n\nfunction getSessionId(ctx: ExtensionContext): string {\n\treturn ctx.sessionManager.getSessionId();\n}\n\nfunction isNonInteractiveContext(ctx: ExtensionContext): boolean {\n\treturn !ctx.hasUI;\n}\n\nfunction shouldResetForSessionStart(event: SessionStartEvent): boolean {\n\tconst reason = event.reason as string;\n\treturn reason === \"reload\" || reason === \"resume\" || reason === \"compact\";\n}\n\nfunction reportContinuationError(pi: ExtensionAPI, ctx: ExtensionContext, error: unknown, prompt?: string): void {\n\tconst message = error instanceof Error ? error.message : String(error);\n\temitTodoSystemMessageFailure(pi, {\n\t\troute: \"todotools.continuation\",\n\t\tsessionId: getSessionId(ctx),\n\t\tcontent: prompt ?? \"\",\n\t\terrorMessage: message,\n\t});\n\tpi.events.emit(\"todotools:continuation_error\", {\n\t\tsessionId: getSessionId(ctx),\n\t\tmessage,\n\t});\n\tif (ctx.hasUI) {\n\t\tctx.ui.notify(`Todo continuation failed: ${message}`, \"error\");\n\t\treturn;\n\t}\n\tprocess.stderr.write(`[todotools continuation] ${message}\\n`);\n}\n\nfunction wait(ms: number): Promise<void> {\n\treturn new Promise((resolve) => {\n\t\tsetTimeout(resolve, ms);\n\t});\n}\n\nasync function dispatchContinuationWhenIdle(\n\tpi: ExtensionAPI,\n\tctx: ExtensionContext,\n\tprompt: string,\n\tsignal: AbortSignal,\n): Promise<void> {\n\tconst startedAt = Date.now();\n\n\tif (signal.aborted) {\n\t\treturn;\n\t}\n\n\twhile (Date.now() - startedAt < IDLE_WAIT_TIMEOUT_MS) {\n\t\tif (signal.aborted) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (ctx.isIdle()) {\n\t\t\tif (signal.aborted) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tsendTodoUserMessage(pi, \"todotools.continuation\", prompt, {\n\t\t\t\tsessionId: getSessionId(ctx),\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tawait wait(IDLE_POLL_INTERVAL_MS);\n\n\t\tif (signal.aborted) {\n\t\t\treturn;\n\t\t}\n\t}\n\n\tconsole.warn(\"[todotools continuation] Timed out waiting for idle state; skipping auto-dispatch.\");\n}\n\nexport function installContinuation(pi: ExtensionAPI, deps: ContinuationDeps): void {\n\tconst sessionStates = new Map<string, ContinuationState>();\n\n\tpi.registerFlag(\"disable-todo-continuation\", {\n\t\ttype: \"boolean\",\n\t\tdefault: false,\n\t\tdescription: \"Disable todo continuation — automatic follow-up when incomplete todos remain in the list\",\n\t});\n\n\tpi.on(\"before_agent_start\", async (event, ctx) => {\n\t\tconst sessionState = getSessionState(sessionStates, getSessionId(ctx));\n\t\tsessionState.reEntryFlag = false;\n\t\tif (!isContinuationFollowUpPrompt(event.prompt)) {\n\t\t\tsessionState.chainCount = 0;\n\t\t\tabortPendingDispatch(sessionState);\n\t\t}\n\t});\n\n\tpi.on(\"session_start\", async (event, ctx) => {\n\t\tif (!shouldResetForSessionStart(event)) {\n\t\t\treturn;\n\t\t}\n\t\tconst sessionId = getSessionId(ctx);\n\t\tconst existingState = sessionStates.get(sessionId);\n\t\tif (existingState) {\n\t\t\tabortPendingDispatch(existingState);\n\t\t}\n\t\tsessionStates.set(sessionId, createInitialState());\n\t});\n\n\tpi.on(\"session_shutdown\", async (_event, ctx) => {\n\t\tconst sessionId = getSessionId(ctx);\n\t\tconst existingState = sessionStates.get(sessionId);\n\t\tif (existingState) {\n\t\t\tabortPendingDispatch(existingState);\n\t\t}\n\t\tsessionStates.delete(sessionId);\n\t});\n\n\tpi.on(\"agent_end\", async (event, ctx) => {\n\t\ttry {\n\t\t\tif (isNonInteractiveContext(ctx)) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst stopReason = getLastAssistantStopReason(event.messages);\n\t\t\tif (!isCleanStopReason(stopReason)) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst settings = readTodoSettings(ctx.cwd);\n\t\t\tconst config = resolveContinuationConfig({\n\t\t\t\tglobalSettings: settings.globalSettings,\n\t\t\t\tprojectSettings: settings.projectSettings,\n\t\t\t\tcliFlag: pi.getFlag(\"disable-todo-continuation\"),\n\t\t\t});\n\t\t\tif (!config.enabled) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst todos = deps.getCurrentTodos();\n\t\t\tif (countIncomplete(todos) === 0) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst sessionId = getSessionId(ctx);\n\t\t\tconst sessionState = getSessionState(sessionStates, sessionId);\n\t\t\tif (sessionState.reEntryFlag) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (sessionState.chainCount >= CONTINUATION_CHAIN_CAP) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst prompt = buildContinuationPrompt(todos);\n\t\t\tabortPendingDispatch(sessionState);\n\t\t\tconst pendingDispatchAbortController = new AbortController();\n\t\t\tsessionState.pendingDispatchAbortController = pendingDispatchAbortController;\n\t\t\tsessionState.reEntryFlag = true;\n\t\t\tsessionState.chainCount += 1;\n\t\t\tsetTimeout(() => {\n\t\t\t\tvoid (async () => {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait dispatchContinuationWhenIdle(pi, ctx, prompt, pendingDispatchAbortController.signal);\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\treportContinuationError(pi, ctx, error, prompt);\n\t\t\t\t\t} finally {\n\t\t\t\t\t\tconst currentState = sessionStates.get(sessionId);\n\t\t\t\t\t\tif (currentState?.pendingDispatchAbortController === pendingDispatchAbortController) {\n\t\t\t\t\t\t\tcurrentState.pendingDispatchAbortController = undefined;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t})();\n\t\t\t}, 0);\n\t\t} catch (error) {\n\t\t\treportContinuationError(pi, ctx, error);\n\t\t}\n\t});\n}\n"]}
1
+ {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../../../../../src/core/extensions/builtin/todotools/continuation/runtime.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AssistantMessage } from \"@earendil-works/pi-ai\";\nimport type { ExtensionAPI, ExtensionContext, SessionStartEvent } from \"../../../types.ts\";\nimport { readTodoSettings } from \"../settings.ts\";\nimport type { TodoItem } from \"../state.ts\";\nimport { emitTodoSystemMessageFailure, sendTodoUserMessage } from \"../system-messages.ts\";\nimport { resolveContinuationConfig } from \"./config.ts\";\nimport { buildContinuationPrompt, CONTINUATION_DIRECTIVE, countIncomplete } from \"./prompt.ts\";\n\ntype ContinuationState = {\n\treEntryFlag: boolean;\n\tchainCount: number;\n\tpendingDispatchAbortController?: AbortController;\n};\n\ntype ContinuationDeps = {\n\tgetCurrentTodos: () => TodoItem[];\n};\n\nconst CLEAN_STOP_REASONS = new Set([\"stop\", \"toolUse\", \"endTurn\", \"end_turn\"]);\nexport const CONTINUATION_CHAIN_CAP = 10;\nconst IDLE_POLL_INTERVAL_MS = 50;\nconst IDLE_WAIT_TIMEOUT_MS = 10_000;\n\nfunction isAssistantMessage(message: unknown): message is AssistantMessage {\n\tif (!message || typeof message !== \"object\") {\n\t\treturn false;\n\t}\n\n\tconst role = (message as { role?: unknown }).role;\n\treturn role === \"assistant\";\n}\n\nfunction getLastAssistantStopReason(messages: unknown[]): string | undefined {\n\tfor (let index = messages.length - 1; index >= 0; index -= 1) {\n\t\tconst message = messages[index];\n\t\tif (!isAssistantMessage(message)) {\n\t\t\tcontinue;\n\t\t}\n\n\t\treturn message.stopReason;\n\t}\n\n\treturn undefined;\n}\n\nexport function isContinuationFollowUpPrompt(prompt: string): boolean {\n\treturn prompt.includes(CONTINUATION_DIRECTIVE);\n}\n\nexport function isCleanStopReason(stopReason: string | undefined): boolean {\n\treturn typeof stopReason === \"string\" && CLEAN_STOP_REASONS.has(stopReason);\n}\n\nfunction createInitialState(): ContinuationState {\n\treturn {\n\t\treEntryFlag: false,\n\t\tchainCount: 0,\n\t};\n}\n\nfunction abortPendingDispatch(state: ContinuationState): void {\n\tstate.pendingDispatchAbortController?.abort();\n\tstate.pendingDispatchAbortController = undefined;\n}\n\nfunction getSessionState(sessionStates: Map<string, ContinuationState>, sessionId: string): ContinuationState {\n\tconst existingState = sessionStates.get(sessionId);\n\tif (existingState) {\n\t\treturn existingState;\n\t}\n\n\tconst nextState = createInitialState();\n\tsessionStates.set(sessionId, nextState);\n\treturn nextState;\n}\n\nfunction getSessionId(ctx: ExtensionContext): string {\n\treturn ctx.sessionManager.getSessionId();\n}\n\nfunction isNonInteractiveContext(ctx: ExtensionContext): boolean {\n\treturn !ctx.hasUI;\n}\n\nfunction shouldResetForSessionStart(event: SessionStartEvent): boolean {\n\tconst reason = event.reason as string;\n\treturn reason === \"reload\" || reason === \"resume\" || reason === \"compact\";\n}\n\nfunction reportContinuationError(pi: ExtensionAPI, ctx: ExtensionContext, error: unknown, prompt?: string): void {\n\tconst message = error instanceof Error ? error.message : String(error);\n\temitTodoSystemMessageFailure(pi, {\n\t\troute: \"todotools.continuation\",\n\t\tsessionId: getSessionId(ctx),\n\t\tcontent: prompt ?? \"\",\n\t\terrorMessage: message,\n\t});\n\tpi.events.emit(\"todotools:continuation_error\", {\n\t\tsessionId: getSessionId(ctx),\n\t\tmessage,\n\t});\n\tif (ctx.hasUI) {\n\t\tctx.ui.notify(`Todo continuation failed: ${message}`, \"error\");\n\t\treturn;\n\t}\n\tprocess.stderr.write(`[todotools continuation] ${message}\\n`);\n}\n\nfunction wait(ms: number): Promise<void> {\n\treturn new Promise((resolve) => {\n\t\tsetTimeout(resolve, ms);\n\t});\n}\n\nasync function dispatchContinuationWhenIdle(\n\tpi: ExtensionAPI,\n\tctx: ExtensionContext,\n\tprompt: string,\n\tsignal: AbortSignal,\n): Promise<void> {\n\tconst startedAt = Date.now();\n\n\tif (signal.aborted) {\n\t\treturn;\n\t}\n\n\twhile (Date.now() - startedAt < IDLE_WAIT_TIMEOUT_MS) {\n\t\tif (signal.aborted) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (ctx.isIdle()) {\n\t\t\tif (signal.aborted) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tsendTodoUserMessage(pi, \"todotools.continuation\", prompt, {\n\t\t\t\tsessionId: getSessionId(ctx),\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tawait wait(IDLE_POLL_INTERVAL_MS);\n\n\t\tif (signal.aborted) {\n\t\t\treturn;\n\t\t}\n\t}\n\n\tconsole.warn(\"[todotools continuation] Timed out waiting for idle state; skipping auto-dispatch.\");\n}\n\nexport function installContinuation(pi: ExtensionAPI, deps: ContinuationDeps): void {\n\tconst sessionStates = new Map<string, ContinuationState>();\n\n\tpi.registerFlag(\"disable-todo-continuation\", {\n\t\ttype: \"boolean\",\n\t\tdefault: false,\n\t\tdescription: \"Disable todo continuation — automatic follow-up when incomplete todos remain in the list\",\n\t});\n\n\tpi.on(\"before_agent_start\", async (event, ctx) => {\n\t\tconst sessionState = getSessionState(sessionStates, getSessionId(ctx));\n\t\tsessionState.reEntryFlag = false;\n\t\tif (!isContinuationFollowUpPrompt(event.prompt)) {\n\t\t\tsessionState.chainCount = 0;\n\t\t\tabortPendingDispatch(sessionState);\n\t\t}\n\t});\n\n\tpi.on(\"session_start\", async (event, ctx) => {\n\t\tif (!shouldResetForSessionStart(event)) {\n\t\t\treturn;\n\t\t}\n\t\tconst sessionId = getSessionId(ctx);\n\t\tconst existingState = sessionStates.get(sessionId);\n\t\tif (existingState) {\n\t\t\tabortPendingDispatch(existingState);\n\t\t}\n\t\tsessionStates.set(sessionId, createInitialState());\n\t});\n\n\tpi.on(\"session_shutdown\", async (_event, ctx) => {\n\t\tconst sessionId = getSessionId(ctx);\n\t\tconst existingState = sessionStates.get(sessionId);\n\t\tif (existingState) {\n\t\t\tabortPendingDispatch(existingState);\n\t\t}\n\t\tsessionStates.delete(sessionId);\n\t});\n\n\tpi.on(\"agent_end\", async (event, ctx) => {\n\t\ttry {\n\t\t\tif (isNonInteractiveContext(ctx)) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst stopReason = getLastAssistantStopReason(event.messages);\n\t\t\tif (!isCleanStopReason(stopReason)) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst settings = readTodoSettings(ctx.cwd);\n\t\t\tconst config = resolveContinuationConfig({\n\t\t\t\tglobalSettings: settings.globalSettings,\n\t\t\t\tprojectSettings: settings.projectSettings,\n\t\t\t\tcliFlag: pi.getFlag(\"disable-todo-continuation\"),\n\t\t\t});\n\t\t\tif (!config.enabled) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst todos = deps.getCurrentTodos();\n\t\t\tif (countIncomplete(todos) === 0) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst sessionId = getSessionId(ctx);\n\t\t\tconst sessionState = getSessionState(sessionStates, sessionId);\n\t\t\tif (sessionState.reEntryFlag) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (sessionState.chainCount >= CONTINUATION_CHAIN_CAP) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst prompt = buildContinuationPrompt(todos);\n\t\t\tabortPendingDispatch(sessionState);\n\t\t\tconst pendingDispatchAbortController = new AbortController();\n\t\t\tsessionState.pendingDispatchAbortController = pendingDispatchAbortController;\n\t\t\tsessionState.reEntryFlag = true;\n\t\t\tsessionState.chainCount += 1;\n\t\t\tsetTimeout(() => {\n\t\t\t\tvoid (async () => {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait dispatchContinuationWhenIdle(pi, ctx, prompt, pendingDispatchAbortController.signal);\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\treportContinuationError(pi, ctx, error, prompt);\n\t\t\t\t\t} finally {\n\t\t\t\t\t\tconst currentState = sessionStates.get(sessionId);\n\t\t\t\t\t\tif (currentState?.pendingDispatchAbortController === pendingDispatchAbortController) {\n\t\t\t\t\t\t\tcurrentState.pendingDispatchAbortController = undefined;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t})();\n\t\t\t}, 0);\n\t\t} catch (error) {\n\t\t\treportContinuationError(pi, ctx, error);\n\t\t}\n\t});\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/todotools/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAoB,MAAM,gBAAgB,CAAC;AAWrE,MAAM,CAAC,OAAO,UAAU,kBAAkB,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CAoCjE;AAED,OAAO,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EACN,+BAA+B,EAC/B,aAAa,EACb,kBAAkB,EAClB,kBAAkB,EAClB,gBAAgB,EAChB,oBAAoB,EACpB,UAAU,EACV,eAAe,EACf,gBAAgB,EAChB,qBAAqB,EACrB,KAAK,QAAQ,GACb,MAAM,YAAY,CAAC","sourcesContent":["import type { ExtensionAPI, ExtensionContext } from \"../../types.ts\";\nimport { installContinuation } from \"./continuation/index.ts\";\nimport { TASK_MANAGEMENT_SECTION } from \"./prompt.ts\";\nimport { getLatestTodosFromBranchEntries, getTodoWidgetLines, type TodoItem } from \"./state.ts\";\nimport { registerTodoReadTool } from \"./tools/todoread.ts\";\nimport { registerTodoWriteTool } from \"./tools/todowrite.ts\";\n\nfunction getLatestTodos(ctx: ExtensionContext): TodoItem[] {\n\treturn getLatestTodosFromBranchEntries(ctx.sessionManager.getBranch());\n}\n\nexport default function todotoolsExtension(pi: ExtensionAPI): void {\n\tlet currentTodos: TodoItem[] = [];\n\n\tconst getCurrentTodos = (): TodoItem[] => currentTodos;\n\n\tconst setCurrentTodos = (todos: TodoItem[]): void => {\n\t\tcurrentTodos = todos;\n\t};\n\n\tconst syncWidget = (ctx: ExtensionContext): void => {\n\t\tctx.ui.setWidget(\"todo-sidebar\", getTodoWidgetLines(currentTodos));\n\t};\n\n\tconst syncFromSession = (ctx: ExtensionContext): void => {\n\t\tcurrentTodos = getLatestTodos(ctx);\n\t\tsyncWidget(ctx);\n\t};\n\n\tinstallContinuation(pi, { getCurrentTodos });\n\n\tpi.on(\"session_start\", async (_event, ctx) => {\n\t\tsyncFromSession(ctx);\n\t});\n\n\tpi.on(\"session_tree\", async (_event, ctx) => {\n\t\tsyncFromSession(ctx);\n\t});\n\n\tpi.on(\"before_agent_start\", async (event) => {\n\t\treturn {\n\t\t\tsystemPrompt: `${event.systemPrompt}\\n${TASK_MANAGEMENT_SECTION}`,\n\t\t};\n\t});\n\n\tregisterTodoWriteTool(pi, { getCurrentTodos, setCurrentTodos, syncWidget });\n\tregisterTodoReadTool(pi, getCurrentTodos);\n}\n\nexport { TASK_MANAGEMENT_SECTION } from \"./prompt.ts\";\nexport {\n\tgetLatestTodosFromBranchEntries,\n\tgetTodoMarker,\n\tgetTodoResultLines,\n\tgetTodoWidgetLines,\n\tisIncompleteTodo,\n\tisTerminalTodoStatus,\n\tisTodoItem,\n\tisTodoItemArray,\n\tsanitizeTodoText,\n\tTODO_STATE_ENTRY_TYPE,\n\ttype TodoItem,\n} from \"./state.ts\";\n"]}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/todotools/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAoB,MAAM,gBAAgB,CAAC;AAWrE,MAAM,CAAC,OAAO,UAAU,kBAAkB,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CAoCjE;AAED,OAAO,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EACN,+BAA+B,EAC/B,aAAa,EACb,kBAAkB,EAClB,kBAAkB,EAClB,gBAAgB,EAChB,oBAAoB,EACpB,UAAU,EACV,eAAe,EACf,gBAAgB,EAChB,qBAAqB,EACrB,KAAK,QAAQ,GACb,MAAM,YAAY,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/todotools/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,+BAA+B,EAAE,kBAAkB,EAAiB,MAAM,YAAY,CAAC;AAChG,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAE7D,SAAS,cAAc,CAAC,GAAqB,EAAc;IAC1D,OAAO,+BAA+B,CAAC,GAAG,CAAC,cAAc,CAAC,SAAS,EAAE,CAAC,CAAC;AAAA,CACvE;AAED,MAAM,CAAC,OAAO,UAAU,kBAAkB,CAAC,EAAgB,EAAQ;IAClE,IAAI,YAAY,GAAe,EAAE,CAAC;IAElC,MAAM,eAAe,GAAG,GAAe,EAAE,CAAC,YAAY,CAAC;IAEvD,MAAM,eAAe,GAAG,CAAC,KAAiB,EAAQ,EAAE,CAAC;QACpD,YAAY,GAAG,KAAK,CAAC;IAAA,CACrB,CAAC;IAEF,MAAM,UAAU,GAAG,CAAC,GAAqB,EAAQ,EAAE,CAAC;QACnD,GAAG,CAAC,EAAE,CAAC,SAAS,CAAC,cAAc,EAAE,kBAAkB,CAAC,YAAY,CAAC,CAAC,CAAC;IAAA,CACnE,CAAC;IAEF,MAAM,eAAe,GAAG,CAAC,GAAqB,EAAQ,EAAE,CAAC;QACxD,YAAY,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC;QACnC,UAAU,CAAC,GAAG,CAAC,CAAC;IAAA,CAChB,CAAC;IAEF,mBAAmB,CAAC,EAAE,EAAE,EAAE,eAAe,EAAE,CAAC,CAAC;IAE7C,EAAE,CAAC,EAAE,CAAC,eAAe,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,CAAC;QAC7C,eAAe,CAAC,GAAG,CAAC,CAAC;IAAA,CACrB,CAAC,CAAC;IAEH,EAAE,CAAC,EAAE,CAAC,cAAc,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,CAAC;QAC5C,eAAe,CAAC,GAAG,CAAC,CAAC;IAAA,CACrB,CAAC,CAAC;IAEH,EAAE,CAAC,EAAE,CAAC,oBAAoB,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC;QAC5C,OAAO;YACN,YAAY,EAAE,GAAG,KAAK,CAAC,YAAY,KAAK,uBAAuB,EAAE;SACjE,CAAC;IAAA,CACF,CAAC,CAAC;IAEH,qBAAqB,CAAC,EAAE,EAAE,EAAE,eAAe,EAAE,eAAe,EAAE,UAAU,EAAE,CAAC,CAAC;IAC5E,oBAAoB,CAAC,EAAE,EAAE,eAAe,CAAC,CAAC;AAAA,CAC1C;AAED,OAAO,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EACN,+BAA+B,EAC/B,aAAa,EACb,kBAAkB,EAClB,kBAAkB,EAClB,gBAAgB,EAChB,oBAAoB,EACpB,UAAU,EACV,eAAe,EACf,gBAAgB,EAChB,qBAAqB,GAErB,MAAM,YAAY,CAAC","sourcesContent":["import type { ExtensionAPI, ExtensionContext } from \"../../types.ts\";\nimport { installContinuation } from \"./continuation/index.ts\";\nimport { TASK_MANAGEMENT_SECTION } from \"./prompt.ts\";\nimport { getLatestTodosFromBranchEntries, getTodoWidgetLines, type TodoItem } from \"./state.ts\";\nimport { registerTodoReadTool } from \"./tools/todoread.ts\";\nimport { registerTodoWriteTool } from \"./tools/todowrite.ts\";\n\nfunction getLatestTodos(ctx: ExtensionContext): TodoItem[] {\n\treturn getLatestTodosFromBranchEntries(ctx.sessionManager.getBranch());\n}\n\nexport default function todotoolsExtension(pi: ExtensionAPI): void {\n\tlet currentTodos: TodoItem[] = [];\n\n\tconst getCurrentTodos = (): TodoItem[] => currentTodos;\n\n\tconst setCurrentTodos = (todos: TodoItem[]): void => {\n\t\tcurrentTodos = todos;\n\t};\n\n\tconst syncWidget = (ctx: ExtensionContext): void => {\n\t\tctx.ui.setWidget(\"todo-sidebar\", getTodoWidgetLines(currentTodos));\n\t};\n\n\tconst syncFromSession = (ctx: ExtensionContext): void => {\n\t\tcurrentTodos = getLatestTodos(ctx);\n\t\tsyncWidget(ctx);\n\t};\n\n\tinstallContinuation(pi, { getCurrentTodos });\n\n\tpi.on(\"session_start\", async (_event, ctx) => {\n\t\tsyncFromSession(ctx);\n\t});\n\n\tpi.on(\"session_tree\", async (_event, ctx) => {\n\t\tsyncFromSession(ctx);\n\t});\n\n\tpi.on(\"before_agent_start\", async (event) => {\n\t\treturn {\n\t\t\tsystemPrompt: `${event.systemPrompt}\\n${TASK_MANAGEMENT_SECTION}`,\n\t\t};\n\t});\n\n\tregisterTodoWriteTool(pi, { getCurrentTodos, setCurrentTodos, syncWidget });\n\tregisterTodoReadTool(pi, getCurrentTodos);\n}\n\nexport { TASK_MANAGEMENT_SECTION } from \"./prompt.ts\";\nexport {\n\tgetLatestTodosFromBranchEntries,\n\tgetTodoMarker,\n\tgetTodoResultLines,\n\tgetTodoWidgetLines,\n\tisIncompleteTodo,\n\tisTerminalTodoStatus,\n\tisTodoItem,\n\tisTodoItemArray,\n\tsanitizeTodoText,\n\tTODO_STATE_ENTRY_TYPE,\n\ttype TodoItem,\n} from \"./state.ts\";\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/todotools/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,+BAA+B,EAAE,kBAAkB,EAAiB,MAAM,YAAY,CAAC;AAChG,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAE7D,SAAS,cAAc,CAAC,GAAqB;IAC5C,OAAO,+BAA+B,CAAC,GAAG,CAAC,cAAc,CAAC,SAAS,EAAE,CAAC,CAAC;AACxE,CAAC;AAED,MAAM,CAAC,OAAO,UAAU,kBAAkB,CAAC,EAAgB;IAC1D,IAAI,YAAY,GAAe,EAAE,CAAC;IAElC,MAAM,eAAe,GAAG,GAAe,EAAE,CAAC,YAAY,CAAC;IAEvD,MAAM,eAAe,GAAG,CAAC,KAAiB,EAAQ,EAAE;QACnD,YAAY,GAAG,KAAK,CAAC;IACtB,CAAC,CAAC;IAEF,MAAM,UAAU,GAAG,CAAC,GAAqB,EAAQ,EAAE;QAClD,GAAG,CAAC,EAAE,CAAC,SAAS,CAAC,cAAc,EAAE,kBAAkB,CAAC,YAAY,CAAC,CAAC,CAAC;IACpE,CAAC,CAAC;IAEF,MAAM,eAAe,GAAG,CAAC,GAAqB,EAAQ,EAAE;QACvD,YAAY,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC;QACnC,UAAU,CAAC,GAAG,CAAC,CAAC;IACjB,CAAC,CAAC;IAEF,mBAAmB,CAAC,EAAE,EAAE,EAAE,eAAe,EAAE,CAAC,CAAC;IAE7C,EAAE,CAAC,EAAE,CAAC,eAAe,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE;QAC5C,eAAe,CAAC,GAAG,CAAC,CAAC;IACtB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,EAAE,CAAC,cAAc,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE;QAC3C,eAAe,CAAC,GAAG,CAAC,CAAC;IACtB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,EAAE,CAAC,oBAAoB,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;QAC3C,OAAO;YACN,YAAY,EAAE,GAAG,KAAK,CAAC,YAAY,KAAK,uBAAuB,EAAE;SACjE,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,qBAAqB,CAAC,EAAE,EAAE,EAAE,eAAe,EAAE,eAAe,EAAE,UAAU,EAAE,CAAC,CAAC;IAC5E,oBAAoB,CAAC,EAAE,EAAE,eAAe,CAAC,CAAC;AAC3C,CAAC;AAED,OAAO,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EACN,+BAA+B,EAC/B,aAAa,EACb,kBAAkB,EAClB,kBAAkB,EAClB,gBAAgB,EAChB,oBAAoB,EACpB,UAAU,EACV,eAAe,EACf,gBAAgB,EAChB,qBAAqB,GAErB,MAAM,YAAY,CAAC","sourcesContent":["import type { ExtensionAPI, ExtensionContext } from \"../../types.ts\";\nimport { installContinuation } from \"./continuation/index.ts\";\nimport { TASK_MANAGEMENT_SECTION } from \"./prompt.ts\";\nimport { getLatestTodosFromBranchEntries, getTodoWidgetLines, type TodoItem } from \"./state.ts\";\nimport { registerTodoReadTool } from \"./tools/todoread.ts\";\nimport { registerTodoWriteTool } from \"./tools/todowrite.ts\";\n\nfunction getLatestTodos(ctx: ExtensionContext): TodoItem[] {\n\treturn getLatestTodosFromBranchEntries(ctx.sessionManager.getBranch());\n}\n\nexport default function todotoolsExtension(pi: ExtensionAPI): void {\n\tlet currentTodos: TodoItem[] = [];\n\n\tconst getCurrentTodos = (): TodoItem[] => currentTodos;\n\n\tconst setCurrentTodos = (todos: TodoItem[]): void => {\n\t\tcurrentTodos = todos;\n\t};\n\n\tconst syncWidget = (ctx: ExtensionContext): void => {\n\t\tctx.ui.setWidget(\"todo-sidebar\", getTodoWidgetLines(currentTodos));\n\t};\n\n\tconst syncFromSession = (ctx: ExtensionContext): void => {\n\t\tcurrentTodos = getLatestTodos(ctx);\n\t\tsyncWidget(ctx);\n\t};\n\n\tinstallContinuation(pi, { getCurrentTodos });\n\n\tpi.on(\"session_start\", async (_event, ctx) => {\n\t\tsyncFromSession(ctx);\n\t});\n\n\tpi.on(\"session_tree\", async (_event, ctx) => {\n\t\tsyncFromSession(ctx);\n\t});\n\n\tpi.on(\"before_agent_start\", async (event) => {\n\t\treturn {\n\t\t\tsystemPrompt: `${event.systemPrompt}\\n${TASK_MANAGEMENT_SECTION}`,\n\t\t};\n\t});\n\n\tregisterTodoWriteTool(pi, { getCurrentTodos, setCurrentTodos, syncWidget });\n\tregisterTodoReadTool(pi, getCurrentTodos);\n}\n\nexport { TASK_MANAGEMENT_SECTION } from \"./prompt.ts\";\nexport {\n\tgetLatestTodosFromBranchEntries,\n\tgetTodoMarker,\n\tgetTodoResultLines,\n\tgetTodoWidgetLines,\n\tisIncompleteTodo,\n\tisTerminalTodoStatus,\n\tisTodoItem,\n\tisTodoItemArray,\n\tsanitizeTodoText,\n\tTODO_STATE_ENTRY_TYPE,\n\ttype TodoItem,\n} from \"./state.ts\";\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"prompt.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/todotools/prompt.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,uBAAuB,yzKAkKnC,CAAC","sourcesContent":["export const TASK_MANAGEMENT_SECTION = `\n<Task_Management>\n## Todo Management (CRITICAL)\n\n**DEFAULT BEHAVIOR**: EXPLORE first, DEFINE goal, SHARE plan, then CREATE detailed todos. This is your PRIMARY coordination mechanism.\n\n<mandatory_workflow>\n### The EXPLORE-DEFINE-PLAN-TODO Workflow (NON-NEGOTIABLE)\n\n**EVEN FOR SEEMINGLY SIMPLE TASKS, FOLLOW THIS WORKFLOW.**\n\n| Phase | Action | Output |\n|-------|--------|--------|\n| 1. EXPLORE | Read relevant files, understand existing patterns | Mental model of codebase |\n| 2. DEFINE | State the FINAL GOAL explicitly | Clear success criteria |\n| 3. PLAN | Tell user your approach BEFORE creating todos | User confirmation/feedback |\n| 4. TODO | Create DETAILED atomic todos with verification steps | Structured task list |\n| 5. EXECUTE | Work through todos, marking progress obsessively | Completed work with evidence |\n\n**WHY THIS ORDER MATTERS:**\n- Skipping EXPLORE = blind implementation = bugs, rework, wrong approach\n- Skipping DEFINE = scope creep, incomplete work, misaligned results\n- Skipping PLAN = user has no input, surprises at the end\n- Skipping TODO = no tracking, forgotten steps, unverifiable completion\n</mandatory_workflow>\n\n<phase_1_explore>\n### Phase 1: EXPLORE FIRST (Even for \"simple\" tasks)\n\n**BEFORE you touch any code or create any todo:**\n\n1. **Read the relevant files** - Never assume you know what's there\n2. **Understand existing patterns** - How does this codebase do similar things?\n3. **Identify dependencies** - What else might be affected?\n4. **Check for surprises** - Is there existing code that already does this?\n\n**This applies to ALL tasks, no matter how trivial they seem.**\n\n\\`\\`\\`\n// WRONG: Jump straight to implementation\nUser: \"Add a helper function for X\"\nYou: *immediately creates todo and writes code*\n\n// CORRECT: Explore first\nUser: \"Add a helper function for X\"\nYou: *reads existing helpers, checks patterns, then proceeds*\n\\`\\`\\`\n</phase_1_explore>\n\n<phase_2_define>\n### Phase 2: DEFINE the Goal\n\nAfter exploring, explicitly state:\n\n1. **WHAT** is the final deliverable?\n2. **WHY** does the user need this? (infer from context)\n3. **SUCCESS CRITERIA** - How will we know it's done?\n\nWrite this out. If it's unclear, ASK before proceeding.\n</phase_2_define>\n\n<phase_3_plan>\n### Phase 3: SHARE Your Plan\n\n**TELL THE USER YOUR APPROACH BEFORE CREATING TODOS.**\n\n\\`\\`\\`\nBased on my exploration, here's my plan:\n\n1. [Step 1] - [why this step]\n2. [Step 2] - [why this step]\n3. [verification approach]\n\nDoes this align with what you need, or should I adjust?\n\\`\\`\\`\n\n**Wait for user confirmation on non-trivial tasks.** This catches misunderstandings BEFORE wasted work.\n</phase_3_plan>\n\n<phase_4_todo>\n### Phase 4: CREATE Detailed Todos\n\n**NOW create todos - but make them DETAILED:**\n\nEach todo MUST include:\n- **WHAT**: Specific, atomic action\n- **WHERE**: File path or location\n- **HOW**: Brief approach\n- **VERIFY**: How to confirm it's done\n\n\\`\\`\\`\n// BAD todo\n- \"Add the feature\"\n\n// GOOD todo\n- \"Add validateInput() in src/utils/validation.ts - pattern match existing validators, return ValidationResult, verify with unit test\"\n\\`\\`\\`\n</phase_4_todo>\n\n<phase_5_execute>\n### Phase 5: EXECUTE with Obsessive Tracking\n\n1. Mark \\`in_progress\\` BEFORE starting (only ONE at a time)\n2. Mark \\`completed\\` IMMEDIATELY after finishing (NEVER batch)\n3. If scope changes, UPDATE todos before proceeding\n4. If continuation fires, continue or clean up state - no refusal/deferral\n\n**OBSESSIVELY TRACK YOUR WORK USING TODO TOOLS.**\n</phase_5_execute>\n\n<todo_creation_triggers>\n### When to Create Todos (MANDATORY)\n\n**ALWAYS.** No exceptions. No \"trivial task\" exemptions.\n\nEvery task, regardless of perceived complexity, follows EXPLORE -> DEFINE -> PLAN -> TODO -> EXECUTE.\n</todo_creation_triggers>\n\n<anti_patterns>\n### Anti-Patterns (BLOCKING)\n\n- **Skipping EXPLORE** - Blind implementation leads to wrong solutions\n- **Skipping PLAN sharing** - User has no chance to course-correct\n- **Vague todos** - \"Add feature\" tells nothing; be specific\n- **Batch-completing todos** - Defeats real-time tracking\n- **No in_progress marking** - No indication of current work\n- **Refusing continuation** - Continuation exists to resume or clean up\n\n**FAILURE TO FOLLOW THE WORKFLOW = INCOMPLETE WORK.**\n</anti_patterns>\n\n<evidence_requirements>\n### Evidence Requirements (task NOT complete without these)\n\n- **File edit** -> Diagnostics clean on changed files\n- **Build command** -> Exit code 0\n- **Test run** -> Pass (or explicit note of pre-existing failures)\n\n**NO EVIDENCE = NOT COMPLETE.**\n\n| Violation | Why It Fails |\n|-----------|--------------|\n| \"It should work now\" | No evidence. Run it. |\n| \"I added the tests\" | Did they pass? Show output. |\n| \"Implementation complete\" | Did you verify against success criteria? |\n\n**CLAIM NOTHING WITHOUT PROOF. EXECUTE. VERIFY. SHOW EVIDENCE.**\n</evidence_requirements>\n\n<completion_checklist>\n### Completion Checklist\n\nA task is complete when:\n- [ ] Exploration done - understood existing patterns\n- [ ] Goal defined - success criteria clear\n- [ ] Plan shared - user had chance for input\n- [ ] All todos marked done\n- [ ] Diagnostics clean on changed files\n- [ ] Build passes (if applicable)\n- [ ] User's original request fully addressed\n</completion_checklist>\n</Task_Management>\n`;\n"]}
1
+ {"version":3,"file":"prompt.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/todotools/prompt.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,uBAAuB,yzKAkKnC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/todotools/settings.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,gBAAgB;IAChC,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACxC,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACzC;AAuDD,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,gBAAgB,CAK9D","sourcesContent":["import { existsSync, readFileSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\n\nexport interface TodoSettingsPair {\n\tglobalSettings: Record<string, unknown>;\n\tprojectSettings: Record<string, unknown>;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction readJsonObject(path: string): Record<string, unknown> {\n\tif (!existsSync(path)) {\n\t\treturn {};\n\t}\n\n\ttry {\n\t\tconst parsed = JSON.parse(readFileSync(path, \"utf-8\"));\n\t\treturn isRecord(parsed) ? parsed : {};\n\t} catch {\n\t\treturn {};\n\t}\n}\n\nfunction mergeSettings(base: Record<string, unknown>, override: Record<string, unknown>): Record<string, unknown> {\n\tconst merged: Record<string, unknown> = { ...base };\n\tfor (const [key, value] of Object.entries(override)) {\n\t\tconst current = merged[key];\n\t\tif (isRecord(current) && isRecord(value)) {\n\t\t\tmerged[key] = mergeSettings(current, value);\n\t\t\tcontinue;\n\t\t}\n\t\tmerged[key] = value;\n\t}\n\treturn merged;\n}\n\nfunction unique(paths: string[]): string[] {\n\treturn [...new Set(paths)];\n}\n\nfunction getGlobalSettingsPaths(): string[] {\n\tconst paths: string[] = [];\n\tconst piAgentDir = process.env.PI_CODING_AGENT_DIR;\n\tconst senpiAgentDir = process.env.SENPI_CODING_AGENT_DIR;\n\tif (piAgentDir) paths.push(join(piAgentDir, \"settings.json\"));\n\tif (senpiAgentDir) paths.push(join(senpiAgentDir, \"settings.json\"));\n\tpaths.push(join(homedir(), \".pi\", \"agent\", \"settings.json\"));\n\tpaths.push(join(homedir(), \".senpi\", \"agent\", \"settings.json\"));\n\treturn unique(paths);\n}\n\nfunction getProjectSettingsPaths(cwd: string): string[] {\n\treturn [join(cwd, \".pi\", \"settings.json\"), join(cwd, \".senpi\", \"settings.json\")];\n}\n\nfunction readMergedSettings(paths: string[]): Record<string, unknown> {\n\treturn paths.reduce<Record<string, unknown>>((settings, path) => mergeSettings(settings, readJsonObject(path)), {});\n}\n\nexport function readTodoSettings(cwd: string): TodoSettingsPair {\n\treturn {\n\t\tglobalSettings: readMergedSettings(getGlobalSettingsPaths()),\n\t\tprojectSettings: readMergedSettings(getProjectSettingsPaths(cwd)),\n\t};\n}\n"]}
1
+ {"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/todotools/settings.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,gBAAgB;IAChC,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACxC,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACzC;AAuDD,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,gBAAgB,CAK9D"}
@@ -1 +1 @@
1
- {"version":3,"file":"settings.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/todotools/settings.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAOjC,SAAS,QAAQ,CAAC,KAAc,EAAoC;IACnE,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAAA,CAC5E;AAED,SAAS,cAAc,CAAC,IAAY,EAA2B;IAC9D,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACvB,OAAO,EAAE,CAAC;IACX,CAAC;IAED,IAAI,CAAC;QACJ,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;QACvD,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;IACvC,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,EAAE,CAAC;IACX,CAAC;AAAA,CACD;AAED,SAAS,aAAa,CAAC,IAA6B,EAAE,QAAiC,EAA2B;IACjH,MAAM,MAAM,GAA4B,EAAE,GAAG,IAAI,EAAE,CAAC;IACpD,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QACrD,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;QAC5B,IAAI,QAAQ,CAAC,OAAO,CAAC,IAAI,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YAC1C,MAAM,CAAC,GAAG,CAAC,GAAG,aAAa,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;YAC5C,SAAS;QACV,CAAC;QACD,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IACrB,CAAC;IACD,OAAO,MAAM,CAAC;AAAA,CACd;AAED,SAAS,MAAM,CAAC,KAAe,EAAY;IAC1C,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;AAAA,CAC3B;AAED,SAAS,sBAAsB,GAAa;IAC3C,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC;IACnD,MAAM,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC;IACzD,IAAI,UAAU;QAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC,CAAC;IAC9D,IAAI,aAAa;QAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,eAAe,CAAC,CAAC,CAAC;IACpE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,eAAe,CAAC,CAAC,CAAC;IAC7D,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,eAAe,CAAC,CAAC,CAAC;IAChE,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;AAAA,CACrB;AAED,SAAS,uBAAuB,CAAC,GAAW,EAAY;IACvD,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,eAAe,CAAC,EAAE,IAAI,CAAC,GAAG,EAAE,QAAQ,EAAE,eAAe,CAAC,CAAC,CAAC;AAAA,CACjF;AAED,SAAS,kBAAkB,CAAC,KAAe,EAA2B;IACrE,OAAO,KAAK,CAAC,MAAM,CAA0B,CAAC,QAAQ,EAAE,IAAI,EAAE,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,cAAc,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAAA,CACpH;AAED,MAAM,UAAU,gBAAgB,CAAC,GAAW,EAAoB;IAC/D,OAAO;QACN,cAAc,EAAE,kBAAkB,CAAC,sBAAsB,EAAE,CAAC;QAC5D,eAAe,EAAE,kBAAkB,CAAC,uBAAuB,CAAC,GAAG,CAAC,CAAC;KACjE,CAAC;AAAA,CACF","sourcesContent":["import { existsSync, readFileSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\n\nexport interface TodoSettingsPair {\n\tglobalSettings: Record<string, unknown>;\n\tprojectSettings: Record<string, unknown>;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction readJsonObject(path: string): Record<string, unknown> {\n\tif (!existsSync(path)) {\n\t\treturn {};\n\t}\n\n\ttry {\n\t\tconst parsed = JSON.parse(readFileSync(path, \"utf-8\"));\n\t\treturn isRecord(parsed) ? parsed : {};\n\t} catch {\n\t\treturn {};\n\t}\n}\n\nfunction mergeSettings(base: Record<string, unknown>, override: Record<string, unknown>): Record<string, unknown> {\n\tconst merged: Record<string, unknown> = { ...base };\n\tfor (const [key, value] of Object.entries(override)) {\n\t\tconst current = merged[key];\n\t\tif (isRecord(current) && isRecord(value)) {\n\t\t\tmerged[key] = mergeSettings(current, value);\n\t\t\tcontinue;\n\t\t}\n\t\tmerged[key] = value;\n\t}\n\treturn merged;\n}\n\nfunction unique(paths: string[]): string[] {\n\treturn [...new Set(paths)];\n}\n\nfunction getGlobalSettingsPaths(): string[] {\n\tconst paths: string[] = [];\n\tconst piAgentDir = process.env.PI_CODING_AGENT_DIR;\n\tconst senpiAgentDir = process.env.SENPI_CODING_AGENT_DIR;\n\tif (piAgentDir) paths.push(join(piAgentDir, \"settings.json\"));\n\tif (senpiAgentDir) paths.push(join(senpiAgentDir, \"settings.json\"));\n\tpaths.push(join(homedir(), \".pi\", \"agent\", \"settings.json\"));\n\tpaths.push(join(homedir(), \".senpi\", \"agent\", \"settings.json\"));\n\treturn unique(paths);\n}\n\nfunction getProjectSettingsPaths(cwd: string): string[] {\n\treturn [join(cwd, \".pi\", \"settings.json\"), join(cwd, \".senpi\", \"settings.json\")];\n}\n\nfunction readMergedSettings(paths: string[]): Record<string, unknown> {\n\treturn paths.reduce<Record<string, unknown>>((settings, path) => mergeSettings(settings, readJsonObject(path)), {});\n}\n\nexport function readTodoSettings(cwd: string): TodoSettingsPair {\n\treturn {\n\t\tglobalSettings: readMergedSettings(getGlobalSettingsPaths()),\n\t\tprojectSettings: readMergedSettings(getProjectSettingsPaths(cwd)),\n\t};\n}\n"]}
1
+ {"version":3,"file":"settings.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/todotools/settings.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, readFileSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\n\nexport interface TodoSettingsPair {\n\tglobalSettings: Record<string, unknown>;\n\tprojectSettings: Record<string, unknown>;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction readJsonObject(path: string): Record<string, unknown> {\n\tif (!existsSync(path)) {\n\t\treturn {};\n\t}\n\n\ttry {\n\t\tconst parsed = JSON.parse(readFileSync(path, \"utf-8\"));\n\t\treturn isRecord(parsed) ? parsed : {};\n\t} catch {\n\t\treturn {};\n\t}\n}\n\nfunction mergeSettings(base: Record<string, unknown>, override: Record<string, unknown>): Record<string, unknown> {\n\tconst merged: Record<string, unknown> = { ...base };\n\tfor (const [key, value] of Object.entries(override)) {\n\t\tconst current = merged[key];\n\t\tif (isRecord(current) && isRecord(value)) {\n\t\t\tmerged[key] = mergeSettings(current, value);\n\t\t\tcontinue;\n\t\t}\n\t\tmerged[key] = value;\n\t}\n\treturn merged;\n}\n\nfunction unique(paths: string[]): string[] {\n\treturn [...new Set(paths)];\n}\n\nfunction getGlobalSettingsPaths(): string[] {\n\tconst paths: string[] = [];\n\tconst piAgentDir = process.env.PI_CODING_AGENT_DIR;\n\tconst senpiAgentDir = process.env.SENPI_CODING_AGENT_DIR;\n\tif (piAgentDir) paths.push(join(piAgentDir, \"settings.json\"));\n\tif (senpiAgentDir) paths.push(join(senpiAgentDir, \"settings.json\"));\n\tpaths.push(join(homedir(), \".pi\", \"agent\", \"settings.json\"));\n\tpaths.push(join(homedir(), \".senpi\", \"agent\", \"settings.json\"));\n\treturn unique(paths);\n}\n\nfunction getProjectSettingsPaths(cwd: string): string[] {\n\treturn [join(cwd, \".pi\", \"settings.json\"), join(cwd, \".senpi\", \"settings.json\")];\n}\n\nfunction readMergedSettings(paths: string[]): Record<string, unknown> {\n\treturn paths.reduce<Record<string, unknown>>((settings, path) => mergeSettings(settings, readJsonObject(path)), {});\n}\n\nexport function readTodoSettings(cwd: string): TodoSettingsPair {\n\treturn {\n\t\tglobalSettings: readMergedSettings(getGlobalSettingsPaths()),\n\t\tprojectSettings: readMergedSettings(getProjectSettingsPaths(cwd)),\n\t};\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/todotools/state.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,QAAQ,GAAG;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC9B,KAAK,EAAE,QAAQ,EAAE,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC5B,KAAK,EAAE,QAAQ,EAAE,CAAC;CAClB,CAAC;AAEF,KAAK,WAAW,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC;AAE5F,eAAO,MAAM,qBAAqB,qBAAqB,CAAC;AAExD,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAE5D;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAExD;AAMD,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAMrD;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAKpD;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,MAAM,EAAE,GAAG,SAAS,CAK1E;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,MAAM,EAAE,CAK9D;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,QAAQ,CAM5D;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,QAAQ,EAAE,CAEnE;AAED,wBAAgB,+BAA+B,CAAC,OAAO,EAAE,WAAW,EAAE,GAAG,QAAQ,EAAE,CA4BlF","sourcesContent":["import { stripAnsi } from \"../../../../utils/ansi.ts\";\n\nexport type TodoItem = {\n\tcontent: string;\n\tstatus: string;\n\tpriority: string;\n};\n\nexport type TodoWriteDetails = {\n\ttodos: TodoItem[];\n};\n\nexport type TodoStateEntry = {\n\ttodos: TodoItem[];\n};\n\ntype BranchEntry = { type: string; customType?: string; data?: unknown; message?: unknown };\n\nexport const TODO_STATE_ENTRY_TYPE = \"senpi.todo-state\";\n\nexport function isTerminalTodoStatus(status: string): boolean {\n\treturn status === \"completed\" || status === \"cancelled\";\n}\n\nexport function isIncompleteTodo(todo: TodoItem): boolean {\n\treturn !isTerminalTodoStatus(todo.status);\n}\n\nfunction countOpenTodos(todos: TodoItem[]): number {\n\treturn todos.filter(isIncompleteTodo).length;\n}\n\nexport function sanitizeTodoText(text: string): string {\n\treturn stripAnsi(text)\n\t\t.replace(/[\\r\\n]+/g, \" \")\n\t\t.replace(/[\\u0000-\\u001F\\u007F-\\u009F]/g, \" \")\n\t\t.replace(/\\s+/g, \" \")\n\t\t.trim();\n}\n\nexport function getTodoMarker(status: string): string {\n\tif (status === \"completed\") return \"[✓]\";\n\tif (status === \"in_progress\") return \"[•]\";\n\tif (status === \"cancelled\") return \"[×]\";\n\treturn \"[ ]\";\n}\n\nexport function getTodoWidgetLines(todos: TodoItem[]): string[] | undefined {\n\tif (todos.length === 0 || !todos.some(isIncompleteTodo)) {\n\t\treturn undefined;\n\t}\n\treturn [\"Todo\", ...todos.map((todo) => `${getTodoMarker(todo.status)} ${sanitizeTodoText(todo.content)}`)];\n}\n\nexport function getTodoResultLines(todos: TodoItem[]): string[] {\n\treturn [\n\t\t`${countOpenTodos(todos)} todos`,\n\t\t...todos.map((todo) => `${getTodoMarker(todo.status)} ${sanitizeTodoText(todo.content)}`),\n\t];\n}\n\nexport function isTodoItem(value: unknown): value is TodoItem {\n\tif (typeof value !== \"object\" || value === null) {\n\t\treturn false;\n\t}\n\tconst item = value as Record<string, unknown>;\n\treturn typeof item.content === \"string\" && typeof item.status === \"string\" && typeof item.priority === \"string\";\n}\n\nexport function isTodoItemArray(value: unknown): value is TodoItem[] {\n\treturn Array.isArray(value) && value.every(isTodoItem);\n}\n\nexport function getLatestTodosFromBranchEntries(entries: BranchEntry[]): TodoItem[] {\n\tlet todos: TodoItem[] = [];\n\n\tfor (const entry of entries) {\n\t\tif (entry.type === \"custom\" && entry.customType === TODO_STATE_ENTRY_TYPE) {\n\t\t\tconst data = entry.data as TodoStateEntry | undefined;\n\t\t\tif (isTodoItemArray(data?.todos)) {\n\t\t\t\ttodos = data.todos.map((todo) => ({ ...todo }));\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (entry.type !== \"message\" || typeof entry.message !== \"object\" || entry.message === null) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst message = entry.message as { role?: string; toolName?: string; details?: unknown };\n\t\tif (message.role !== \"toolResult\" || message.toolName !== \"todowrite\") {\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst details = message.details as TodoWriteDetails | undefined;\n\t\tif (isTodoItemArray(details?.todos)) {\n\t\t\ttodos = details.todos.map((todo) => ({ ...todo }));\n\t\t}\n\t}\n\n\treturn todos;\n}\n"]}
1
+ {"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/todotools/state.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,QAAQ,GAAG;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC9B,KAAK,EAAE,QAAQ,EAAE,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC5B,KAAK,EAAE,QAAQ,EAAE,CAAC;CAClB,CAAC;AAEF,KAAK,WAAW,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC;AAE5F,eAAO,MAAM,qBAAqB,qBAAqB,CAAC;AAExD,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAE5D;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAExD;AAMD,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAMrD;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAKpD;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,MAAM,EAAE,GAAG,SAAS,CAK1E;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,MAAM,EAAE,CAK9D;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,QAAQ,CAM5D;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,QAAQ,EAAE,CAEnE;AAED,wBAAgB,+BAA+B,CAAC,OAAO,EAAE,WAAW,EAAE,GAAG,QAAQ,EAAE,CA4BlF"}
@@ -1 +1 @@
1
- {"version":3,"file":"state.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/todotools/state.ts"],"names":[],"mappings":"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","sourcesContent":["import { stripAnsi } from \"../../../../utils/ansi.ts\";\n\nexport type TodoItem = {\n\tcontent: string;\n\tstatus: string;\n\tpriority: string;\n};\n\nexport type TodoWriteDetails = {\n\ttodos: TodoItem[];\n};\n\nexport type TodoStateEntry = {\n\ttodos: TodoItem[];\n};\n\ntype BranchEntry = { type: string; customType?: string; data?: unknown; message?: unknown };\n\nexport const TODO_STATE_ENTRY_TYPE = \"senpi.todo-state\";\n\nexport function isTerminalTodoStatus(status: string): boolean {\n\treturn status === \"completed\" || status === \"cancelled\";\n}\n\nexport function isIncompleteTodo(todo: TodoItem): boolean {\n\treturn !isTerminalTodoStatus(todo.status);\n}\n\nfunction countOpenTodos(todos: TodoItem[]): number {\n\treturn todos.filter(isIncompleteTodo).length;\n}\n\nexport function sanitizeTodoText(text: string): string {\n\treturn stripAnsi(text)\n\t\t.replace(/[\\r\\n]+/g, \" \")\n\t\t.replace(/[\\u0000-\\u001F\\u007F-\\u009F]/g, \" \")\n\t\t.replace(/\\s+/g, \" \")\n\t\t.trim();\n}\n\nexport function getTodoMarker(status: string): string {\n\tif (status === \"completed\") return \"[✓]\";\n\tif (status === \"in_progress\") return \"[•]\";\n\tif (status === \"cancelled\") return \"[×]\";\n\treturn \"[ ]\";\n}\n\nexport function getTodoWidgetLines(todos: TodoItem[]): string[] | undefined {\n\tif (todos.length === 0 || !todos.some(isIncompleteTodo)) {\n\t\treturn undefined;\n\t}\n\treturn [\"Todo\", ...todos.map((todo) => `${getTodoMarker(todo.status)} ${sanitizeTodoText(todo.content)}`)];\n}\n\nexport function getTodoResultLines(todos: TodoItem[]): string[] {\n\treturn [\n\t\t`${countOpenTodos(todos)} todos`,\n\t\t...todos.map((todo) => `${getTodoMarker(todo.status)} ${sanitizeTodoText(todo.content)}`),\n\t];\n}\n\nexport function isTodoItem(value: unknown): value is TodoItem {\n\tif (typeof value !== \"object\" || value === null) {\n\t\treturn false;\n\t}\n\tconst item = value as Record<string, unknown>;\n\treturn typeof item.content === \"string\" && typeof item.status === \"string\" && typeof item.priority === \"string\";\n}\n\nexport function isTodoItemArray(value: unknown): value is TodoItem[] {\n\treturn Array.isArray(value) && value.every(isTodoItem);\n}\n\nexport function getLatestTodosFromBranchEntries(entries: BranchEntry[]): TodoItem[] {\n\tlet todos: TodoItem[] = [];\n\n\tfor (const entry of entries) {\n\t\tif (entry.type === \"custom\" && entry.customType === TODO_STATE_ENTRY_TYPE) {\n\t\t\tconst data = entry.data as TodoStateEntry | undefined;\n\t\t\tif (isTodoItemArray(data?.todos)) {\n\t\t\t\ttodos = data.todos.map((todo) => ({ ...todo }));\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (entry.type !== \"message\" || typeof entry.message !== \"object\" || entry.message === null) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst message = entry.message as { role?: string; toolName?: string; details?: unknown };\n\t\tif (message.role !== \"toolResult\" || message.toolName !== \"todowrite\") {\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst details = message.details as TodoWriteDetails | undefined;\n\t\tif (isTodoItemArray(details?.todos)) {\n\t\t\ttodos = details.todos.map((todo) => ({ ...todo }));\n\t\t}\n\t}\n\n\treturn todos;\n}\n"]}
1
+ {"version":3,"file":"state.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/todotools/state.ts"],"names":[],"mappings":"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","sourcesContent":["import { stripAnsi } from \"../../../../utils/ansi.ts\";\n\nexport type TodoItem = {\n\tcontent: string;\n\tstatus: string;\n\tpriority: string;\n};\n\nexport type TodoWriteDetails = {\n\ttodos: TodoItem[];\n};\n\nexport type TodoStateEntry = {\n\ttodos: TodoItem[];\n};\n\ntype BranchEntry = { type: string; customType?: string; data?: unknown; message?: unknown };\n\nexport const TODO_STATE_ENTRY_TYPE = \"senpi.todo-state\";\n\nexport function isTerminalTodoStatus(status: string): boolean {\n\treturn status === \"completed\" || status === \"cancelled\";\n}\n\nexport function isIncompleteTodo(todo: TodoItem): boolean {\n\treturn !isTerminalTodoStatus(todo.status);\n}\n\nfunction countOpenTodos(todos: TodoItem[]): number {\n\treturn todos.filter(isIncompleteTodo).length;\n}\n\nexport function sanitizeTodoText(text: string): string {\n\treturn stripAnsi(text)\n\t\t.replace(/[\\r\\n]+/g, \" \")\n\t\t.replace(/[\\u0000-\\u001F\\u007F-\\u009F]/g, \" \")\n\t\t.replace(/\\s+/g, \" \")\n\t\t.trim();\n}\n\nexport function getTodoMarker(status: string): string {\n\tif (status === \"completed\") return \"[✓]\";\n\tif (status === \"in_progress\") return \"[•]\";\n\tif (status === \"cancelled\") return \"[×]\";\n\treturn \"[ ]\";\n}\n\nexport function getTodoWidgetLines(todos: TodoItem[]): string[] | undefined {\n\tif (todos.length === 0 || !todos.some(isIncompleteTodo)) {\n\t\treturn undefined;\n\t}\n\treturn [\"Todo\", ...todos.map((todo) => `${getTodoMarker(todo.status)} ${sanitizeTodoText(todo.content)}`)];\n}\n\nexport function getTodoResultLines(todos: TodoItem[]): string[] {\n\treturn [\n\t\t`${countOpenTodos(todos)} todos`,\n\t\t...todos.map((todo) => `${getTodoMarker(todo.status)} ${sanitizeTodoText(todo.content)}`),\n\t];\n}\n\nexport function isTodoItem(value: unknown): value is TodoItem {\n\tif (typeof value !== \"object\" || value === null) {\n\t\treturn false;\n\t}\n\tconst item = value as Record<string, unknown>;\n\treturn typeof item.content === \"string\" && typeof item.status === \"string\" && typeof item.priority === \"string\";\n}\n\nexport function isTodoItemArray(value: unknown): value is TodoItem[] {\n\treturn Array.isArray(value) && value.every(isTodoItem);\n}\n\nexport function getLatestTodosFromBranchEntries(entries: BranchEntry[]): TodoItem[] {\n\tlet todos: TodoItem[] = [];\n\n\tfor (const entry of entries) {\n\t\tif (entry.type === \"custom\" && entry.customType === TODO_STATE_ENTRY_TYPE) {\n\t\t\tconst data = entry.data as TodoStateEntry | undefined;\n\t\t\tif (isTodoItemArray(data?.todos)) {\n\t\t\t\ttodos = data.todos.map((todo) => ({ ...todo }));\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (entry.type !== \"message\" || typeof entry.message !== \"object\" || entry.message === null) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst message = entry.message as { role?: string; toolName?: string; details?: unknown };\n\t\tif (message.role !== \"toolResult\" || message.toolName !== \"todowrite\") {\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst details = message.details as TodoWriteDetails | undefined;\n\t\tif (isTodoItemArray(details?.todos)) {\n\t\t\ttodos = details.todos.map((todo) => ({ ...todo }));\n\t\t}\n\t}\n\n\treturn todos;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"system-messages.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/todotools/system-messages.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACvE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAEnD,eAAO,MAAM,mBAAmB,mBAAmB,CAAC;AACpD,eAAO,MAAM,wBAAwB,uBAAuB,CAAC;AAE7D,MAAM,MAAM,sBAAsB,GAAG,wBAAwB,CAAC;AAC9D,MAAM,MAAM,sBAAsB,GAAG,UAAU,GAAG,QAAQ,CAAC;AAE3D,MAAM,WAAW,qBAAqB;IACrC,OAAO,EAAE,CAAC,CAAC;IACX,MAAM,EAAE,SAAS,CAAC;IAClB,MAAM,EAAE,sBAAsB,CAAC;IAC/B,KAAK,EAAE,sBAAsB,CAAC;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE;QACb,MAAM,EAAE,OAAO,mBAAmB,CAAC;QACnC,IAAI,EAAE,cAAc,CAAC;QACrB,SAAS,CAAC,EAAE,OAAO,GAAG,UAAU,CAAC;KACjC,CAAC;IACF,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,sBAAsB;IACtC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,OAAO,GAAG,UAAU,CAAC;CACjC;AA0ED,wBAAgB,mBAAmB,CAClC,EAAE,EAAE,YAAY,EAChB,KAAK,EAAE,sBAAsB,EAC7B,OAAO,EAAE,MAAM,GAAG,CAAC,WAAW,GAAG,YAAY,CAAC,EAAE,EAChD,OAAO,CAAC,EAAE,sBAAsB,GAC9B,IAAI,CAoBN;AAED,wBAAgB,4BAA4B,CAC3C,EAAE,EAAE,YAAY,EAChB,IAAI,EAAE;IACL,KAAK,EAAE,sBAAsB,CAAC;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,GAAG,CAAC,WAAW,GAAG,YAAY,CAAC,EAAE,CAAC;IACjD,SAAS,CAAC,EAAE,OAAO,GAAG,UAAU,CAAC;IACjC,YAAY,EAAE,MAAM,CAAC;CACrB,GACC,IAAI,CAcN","sourcesContent":["import type { ImageContent, TextContent } from \"@earendil-works/pi-ai\";\nimport type { ExtensionAPI } from \"../../types.ts\";\n\nexport const SENPI_SYSTEM_PREFIX = \"[system:senpi]\";\nexport const SENPI_CONVERSATION_EVENT = \"senpi:conversation\";\n\nexport type TodoSystemMessageRoute = \"todotools.continuation\";\nexport type TodoConversationAction = \"injected\" | \"failed\";\n\nexport interface TodoConversationEvent {\n\tversion: 1;\n\tsource: \"builtin\";\n\taction: TodoConversationAction;\n\troute: TodoSystemMessageRoute;\n\tsessionId?: string;\n\ttimestamp: number;\n\tconversation: {\n\t\tprefix: typeof SENPI_SYSTEM_PREFIX;\n\t\tkind: \"user_message\";\n\t\tdeliverAs?: \"steer\" | \"followUp\";\n\t};\n\ttext: string;\n\terrorMessage?: string;\n}\n\nexport interface TodoUserMessageOptions {\n\tsessionId?: string;\n\tdeliverAs?: \"steer\" | \"followUp\";\n}\n\nfunction prefixText(text: string): string {\n\treturn text.startsWith(SENPI_SYSTEM_PREFIX) ? text : `${SENPI_SYSTEM_PREFIX}\\n${text}`;\n}\n\nfunction prefixContent(content: string | (TextContent | ImageContent)[]): string | (TextContent | ImageContent)[] {\n\tif (typeof content === \"string\") {\n\t\treturn prefixText(content);\n\t}\n\n\tconst firstTextIndex = content.findIndex((part) => part.type === \"text\");\n\tif (firstTextIndex === -1) {\n\t\treturn [{ type: \"text\", text: SENPI_SYSTEM_PREFIX }, ...content];\n\t}\n\n\treturn content.map((part, index) => {\n\t\tif (part.type !== \"text\" || index !== firstTextIndex) {\n\t\t\treturn part;\n\t\t}\n\n\t\treturn {\n\t\t\t...part,\n\t\t\ttext: prefixText(part.text),\n\t\t};\n\t});\n}\n\nfunction extractText(content: string | (TextContent | ImageContent)[]): string {\n\tif (typeof content === \"string\") {\n\t\treturn content;\n\t}\n\n\treturn content\n\t\t.filter((part): part is TextContent => part.type === \"text\")\n\t\t.map((part) => part.text)\n\t\t.join(\"\\n\");\n}\n\nfunction emitTodoConversationEvent(pi: ExtensionAPI, event: TodoConversationEvent): void {\n\tpi.events.emit(SENPI_CONVERSATION_EVENT, event);\n}\n\nfunction createBaseEvent(args: {\n\taction: TodoConversationAction;\n\troute: TodoSystemMessageRoute;\n\tsessionId?: string;\n\tdeliverAs?: \"steer\" | \"followUp\";\n\ttext: string;\n\terrorMessage?: string;\n}): TodoConversationEvent {\n\treturn {\n\t\tversion: 1,\n\t\tsource: \"builtin\",\n\t\taction: args.action,\n\t\troute: args.route,\n\t\tsessionId: args.sessionId,\n\t\ttimestamp: Date.now(),\n\t\tconversation: {\n\t\t\tprefix: SENPI_SYSTEM_PREFIX,\n\t\t\tkind: \"user_message\",\n\t\t\tdeliverAs: args.deliverAs,\n\t\t},\n\t\ttext: args.text,\n\t\terrorMessage: args.errorMessage,\n\t};\n}\n\nfunction hasUserMessageOptions(\n\toptions: TodoUserMessageOptions | undefined,\n): options is TodoUserMessageOptions & { deliverAs: \"steer\" | \"followUp\" } {\n\treturn options?.deliverAs !== undefined;\n}\n\nexport function sendTodoUserMessage(\n\tpi: ExtensionAPI,\n\troute: TodoSystemMessageRoute,\n\tcontent: string | (TextContent | ImageContent)[],\n\toptions?: TodoUserMessageOptions,\n): void {\n\tconst prefixedContent = prefixContent(content);\n\n\temitTodoConversationEvent(\n\t\tpi,\n\t\tcreateBaseEvent({\n\t\t\taction: \"injected\",\n\t\t\troute,\n\t\t\tsessionId: options?.sessionId,\n\t\t\ttext: extractText(prefixedContent),\n\t\t\tdeliverAs: options?.deliverAs,\n\t\t}),\n\t);\n\n\tif (hasUserMessageOptions(options)) {\n\t\tpi.sendUserMessage(prefixedContent, { deliverAs: options.deliverAs });\n\t\treturn;\n\t}\n\n\tpi.sendUserMessage(prefixedContent);\n}\n\nexport function emitTodoSystemMessageFailure(\n\tpi: ExtensionAPI,\n\targs: {\n\t\troute: TodoSystemMessageRoute;\n\t\tsessionId?: string;\n\t\tcontent: string | (TextContent | ImageContent)[];\n\t\tdeliverAs?: \"steer\" | \"followUp\";\n\t\terrorMessage: string;\n\t},\n): void {\n\tconst prefixedContent = prefixContent(args.content);\n\n\temitTodoConversationEvent(\n\t\tpi,\n\t\tcreateBaseEvent({\n\t\t\taction: \"failed\",\n\t\t\troute: args.route,\n\t\t\tsessionId: args.sessionId,\n\t\t\ttext: extractText(prefixedContent),\n\t\t\tdeliverAs: args.deliverAs,\n\t\t\terrorMessage: args.errorMessage,\n\t\t}),\n\t);\n}\n"]}
1
+ {"version":3,"file":"system-messages.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/todotools/system-messages.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACvE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAEnD,eAAO,MAAM,mBAAmB,mBAAmB,CAAC;AACpD,eAAO,MAAM,wBAAwB,uBAAuB,CAAC;AAE7D,MAAM,MAAM,sBAAsB,GAAG,wBAAwB,CAAC;AAC9D,MAAM,MAAM,sBAAsB,GAAG,UAAU,GAAG,QAAQ,CAAC;AAE3D,MAAM,WAAW,qBAAqB;IACrC,OAAO,EAAE,CAAC,CAAC;IACX,MAAM,EAAE,SAAS,CAAC;IAClB,MAAM,EAAE,sBAAsB,CAAC;IAC/B,KAAK,EAAE,sBAAsB,CAAC;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE;QACb,MAAM,EAAE,OAAO,mBAAmB,CAAC;QACnC,IAAI,EAAE,cAAc,CAAC;QACrB,SAAS,CAAC,EAAE,OAAO,GAAG,UAAU,CAAC;KACjC,CAAC;IACF,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,sBAAsB;IACtC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,OAAO,GAAG,UAAU,CAAC;CACjC;AA0ED,wBAAgB,mBAAmB,CAClC,EAAE,EAAE,YAAY,EAChB,KAAK,EAAE,sBAAsB,EAC7B,OAAO,EAAE,MAAM,GAAG,CAAC,WAAW,GAAG,YAAY,CAAC,EAAE,EAChD,OAAO,CAAC,EAAE,sBAAsB,GAC9B,IAAI,CAoBN;AAED,wBAAgB,4BAA4B,CAC3C,EAAE,EAAE,YAAY,EAChB,IAAI,EAAE;IACL,KAAK,EAAE,sBAAsB,CAAC;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,GAAG,CAAC,WAAW,GAAG,YAAY,CAAC,EAAE,CAAC;IACjD,SAAS,CAAC,EAAE,OAAO,GAAG,UAAU,CAAC;IACjC,YAAY,EAAE,MAAM,CAAC;CACrB,GACC,IAAI,CAcN"}
@@ -1 +1 @@
1
- {"version":3,"file":"system-messages.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/todotools/system-messages.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ImageContent, TextContent } from \"@earendil-works/pi-ai\";\nimport type { ExtensionAPI } from \"../../types.ts\";\n\nexport const SENPI_SYSTEM_PREFIX = \"[system:senpi]\";\nexport const SENPI_CONVERSATION_EVENT = \"senpi:conversation\";\n\nexport type TodoSystemMessageRoute = \"todotools.continuation\";\nexport type TodoConversationAction = \"injected\" | \"failed\";\n\nexport interface TodoConversationEvent {\n\tversion: 1;\n\tsource: \"builtin\";\n\taction: TodoConversationAction;\n\troute: TodoSystemMessageRoute;\n\tsessionId?: string;\n\ttimestamp: number;\n\tconversation: {\n\t\tprefix: typeof SENPI_SYSTEM_PREFIX;\n\t\tkind: \"user_message\";\n\t\tdeliverAs?: \"steer\" | \"followUp\";\n\t};\n\ttext: string;\n\terrorMessage?: string;\n}\n\nexport interface TodoUserMessageOptions {\n\tsessionId?: string;\n\tdeliverAs?: \"steer\" | \"followUp\";\n}\n\nfunction prefixText(text: string): string {\n\treturn text.startsWith(SENPI_SYSTEM_PREFIX) ? text : `${SENPI_SYSTEM_PREFIX}\\n${text}`;\n}\n\nfunction prefixContent(content: string | (TextContent | ImageContent)[]): string | (TextContent | ImageContent)[] {\n\tif (typeof content === \"string\") {\n\t\treturn prefixText(content);\n\t}\n\n\tconst firstTextIndex = content.findIndex((part) => part.type === \"text\");\n\tif (firstTextIndex === -1) {\n\t\treturn [{ type: \"text\", text: SENPI_SYSTEM_PREFIX }, ...content];\n\t}\n\n\treturn content.map((part, index) => {\n\t\tif (part.type !== \"text\" || index !== firstTextIndex) {\n\t\t\treturn part;\n\t\t}\n\n\t\treturn {\n\t\t\t...part,\n\t\t\ttext: prefixText(part.text),\n\t\t};\n\t});\n}\n\nfunction extractText(content: string | (TextContent | ImageContent)[]): string {\n\tif (typeof content === \"string\") {\n\t\treturn content;\n\t}\n\n\treturn content\n\t\t.filter((part): part is TextContent => part.type === \"text\")\n\t\t.map((part) => part.text)\n\t\t.join(\"\\n\");\n}\n\nfunction emitTodoConversationEvent(pi: ExtensionAPI, event: TodoConversationEvent): void {\n\tpi.events.emit(SENPI_CONVERSATION_EVENT, event);\n}\n\nfunction createBaseEvent(args: {\n\taction: TodoConversationAction;\n\troute: TodoSystemMessageRoute;\n\tsessionId?: string;\n\tdeliverAs?: \"steer\" | \"followUp\";\n\ttext: string;\n\terrorMessage?: string;\n}): TodoConversationEvent {\n\treturn {\n\t\tversion: 1,\n\t\tsource: \"builtin\",\n\t\taction: args.action,\n\t\troute: args.route,\n\t\tsessionId: args.sessionId,\n\t\ttimestamp: Date.now(),\n\t\tconversation: {\n\t\t\tprefix: SENPI_SYSTEM_PREFIX,\n\t\t\tkind: \"user_message\",\n\t\t\tdeliverAs: args.deliverAs,\n\t\t},\n\t\ttext: args.text,\n\t\terrorMessage: args.errorMessage,\n\t};\n}\n\nfunction hasUserMessageOptions(\n\toptions: TodoUserMessageOptions | undefined,\n): options is TodoUserMessageOptions & { deliverAs: \"steer\" | \"followUp\" } {\n\treturn options?.deliverAs !== undefined;\n}\n\nexport function sendTodoUserMessage(\n\tpi: ExtensionAPI,\n\troute: TodoSystemMessageRoute,\n\tcontent: string | (TextContent | ImageContent)[],\n\toptions?: TodoUserMessageOptions,\n): void {\n\tconst prefixedContent = prefixContent(content);\n\n\temitTodoConversationEvent(\n\t\tpi,\n\t\tcreateBaseEvent({\n\t\t\taction: \"injected\",\n\t\t\troute,\n\t\t\tsessionId: options?.sessionId,\n\t\t\ttext: extractText(prefixedContent),\n\t\t\tdeliverAs: options?.deliverAs,\n\t\t}),\n\t);\n\n\tif (hasUserMessageOptions(options)) {\n\t\tpi.sendUserMessage(prefixedContent, { deliverAs: options.deliverAs });\n\t\treturn;\n\t}\n\n\tpi.sendUserMessage(prefixedContent);\n}\n\nexport function emitTodoSystemMessageFailure(\n\tpi: ExtensionAPI,\n\targs: {\n\t\troute: TodoSystemMessageRoute;\n\t\tsessionId?: string;\n\t\tcontent: string | (TextContent | ImageContent)[];\n\t\tdeliverAs?: \"steer\" | \"followUp\";\n\t\terrorMessage: string;\n\t},\n): void {\n\tconst prefixedContent = prefixContent(args.content);\n\n\temitTodoConversationEvent(\n\t\tpi,\n\t\tcreateBaseEvent({\n\t\t\taction: \"failed\",\n\t\t\troute: args.route,\n\t\t\tsessionId: args.sessionId,\n\t\t\ttext: extractText(prefixedContent),\n\t\t\tdeliverAs: args.deliverAs,\n\t\t\terrorMessage: args.errorMessage,\n\t\t}),\n\t);\n}\n"]}
1
+ {"version":3,"file":"system-messages.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/todotools/system-messages.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ImageContent, TextContent } from \"@earendil-works/pi-ai\";\nimport type { ExtensionAPI } from \"../../types.ts\";\n\nexport const SENPI_SYSTEM_PREFIX = \"[system:senpi]\";\nexport const SENPI_CONVERSATION_EVENT = \"senpi:conversation\";\n\nexport type TodoSystemMessageRoute = \"todotools.continuation\";\nexport type TodoConversationAction = \"injected\" | \"failed\";\n\nexport interface TodoConversationEvent {\n\tversion: 1;\n\tsource: \"builtin\";\n\taction: TodoConversationAction;\n\troute: TodoSystemMessageRoute;\n\tsessionId?: string;\n\ttimestamp: number;\n\tconversation: {\n\t\tprefix: typeof SENPI_SYSTEM_PREFIX;\n\t\tkind: \"user_message\";\n\t\tdeliverAs?: \"steer\" | \"followUp\";\n\t};\n\ttext: string;\n\terrorMessage?: string;\n}\n\nexport interface TodoUserMessageOptions {\n\tsessionId?: string;\n\tdeliverAs?: \"steer\" | \"followUp\";\n}\n\nfunction prefixText(text: string): string {\n\treturn text.startsWith(SENPI_SYSTEM_PREFIX) ? text : `${SENPI_SYSTEM_PREFIX}\\n${text}`;\n}\n\nfunction prefixContent(content: string | (TextContent | ImageContent)[]): string | (TextContent | ImageContent)[] {\n\tif (typeof content === \"string\") {\n\t\treturn prefixText(content);\n\t}\n\n\tconst firstTextIndex = content.findIndex((part) => part.type === \"text\");\n\tif (firstTextIndex === -1) {\n\t\treturn [{ type: \"text\", text: SENPI_SYSTEM_PREFIX }, ...content];\n\t}\n\n\treturn content.map((part, index) => {\n\t\tif (part.type !== \"text\" || index !== firstTextIndex) {\n\t\t\treturn part;\n\t\t}\n\n\t\treturn {\n\t\t\t...part,\n\t\t\ttext: prefixText(part.text),\n\t\t};\n\t});\n}\n\nfunction extractText(content: string | (TextContent | ImageContent)[]): string {\n\tif (typeof content === \"string\") {\n\t\treturn content;\n\t}\n\n\treturn content\n\t\t.filter((part): part is TextContent => part.type === \"text\")\n\t\t.map((part) => part.text)\n\t\t.join(\"\\n\");\n}\n\nfunction emitTodoConversationEvent(pi: ExtensionAPI, event: TodoConversationEvent): void {\n\tpi.events.emit(SENPI_CONVERSATION_EVENT, event);\n}\n\nfunction createBaseEvent(args: {\n\taction: TodoConversationAction;\n\troute: TodoSystemMessageRoute;\n\tsessionId?: string;\n\tdeliverAs?: \"steer\" | \"followUp\";\n\ttext: string;\n\terrorMessage?: string;\n}): TodoConversationEvent {\n\treturn {\n\t\tversion: 1,\n\t\tsource: \"builtin\",\n\t\taction: args.action,\n\t\troute: args.route,\n\t\tsessionId: args.sessionId,\n\t\ttimestamp: Date.now(),\n\t\tconversation: {\n\t\t\tprefix: SENPI_SYSTEM_PREFIX,\n\t\t\tkind: \"user_message\",\n\t\t\tdeliverAs: args.deliverAs,\n\t\t},\n\t\ttext: args.text,\n\t\terrorMessage: args.errorMessage,\n\t};\n}\n\nfunction hasUserMessageOptions(\n\toptions: TodoUserMessageOptions | undefined,\n): options is TodoUserMessageOptions & { deliverAs: \"steer\" | \"followUp\" } {\n\treturn options?.deliverAs !== undefined;\n}\n\nexport function sendTodoUserMessage(\n\tpi: ExtensionAPI,\n\troute: TodoSystemMessageRoute,\n\tcontent: string | (TextContent | ImageContent)[],\n\toptions?: TodoUserMessageOptions,\n): void {\n\tconst prefixedContent = prefixContent(content);\n\n\temitTodoConversationEvent(\n\t\tpi,\n\t\tcreateBaseEvent({\n\t\t\taction: \"injected\",\n\t\t\troute,\n\t\t\tsessionId: options?.sessionId,\n\t\t\ttext: extractText(prefixedContent),\n\t\t\tdeliverAs: options?.deliverAs,\n\t\t}),\n\t);\n\n\tif (hasUserMessageOptions(options)) {\n\t\tpi.sendUserMessage(prefixedContent, { deliverAs: options.deliverAs });\n\t\treturn;\n\t}\n\n\tpi.sendUserMessage(prefixedContent);\n}\n\nexport function emitTodoSystemMessageFailure(\n\tpi: ExtensionAPI,\n\targs: {\n\t\troute: TodoSystemMessageRoute;\n\t\tsessionId?: string;\n\t\tcontent: string | (TextContent | ImageContent)[];\n\t\tdeliverAs?: \"steer\" | \"followUp\";\n\t\terrorMessage: string;\n\t},\n): void {\n\tconst prefixedContent = prefixContent(args.content);\n\n\temitTodoConversationEvent(\n\t\tpi,\n\t\tcreateBaseEvent({\n\t\t\taction: \"failed\",\n\t\t\troute: args.route,\n\t\t\tsessionId: args.sessionId,\n\t\t\ttext: extractText(prefixedContent),\n\t\t\tdeliverAs: args.deliverAs,\n\t\t\terrorMessage: args.errorMessage,\n\t\t}),\n\t);\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"todoread.d.ts","sourceRoot":"","sources":["../../../../../../src/core/extensions/builtin/todotools/tools/todoread.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAsB,KAAK,QAAQ,EAAyB,MAAM,aAAa,CAAC;AAIvF,wBAAgB,oBAAoB,CAAC,EAAE,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,QAAQ,EAAE,GAAG,IAAI,CA+B9F","sourcesContent":["import { Text } from \"@earendil-works/pi-tui\";\nimport { Type } from \"typebox\";\nimport type { ExtensionAPI } from \"../../../types.ts\";\nimport { getTodoResultLines, type TodoItem, type TodoWriteDetails } from \"../state.ts\";\n\nconst TodoReadParams = Type.Object({});\n\nexport function registerTodoReadTool(pi: ExtensionAPI, getCurrentTodos: () => TodoItem[]): void {\n\tpi.registerTool({\n\t\tname: \"todoread\",\n\t\tlabel: \"TodoRead\",\n\t\tdescription: \"Read the current structured task list for the current coding session.\",\n\t\tpromptSnippet: \"Read the current todo list for the active coding session.\",\n\t\tpromptGuidelines: [\n\t\t\t\"Use this tool when you need the current todo list before deciding how to update it.\",\n\t\t\t\"This tool returns the latest session todo list managed by todowrite.\",\n\t\t],\n\t\tparameters: TodoReadParams,\n\t\tasync execute() {\n\t\t\tconst currentTodos = getCurrentTodos();\n\t\t\treturn {\n\t\t\t\tcontent: [{ type: \"text\", text: JSON.stringify(currentTodos, null, 2) }],\n\t\t\t\tdetails: { todos: currentTodos } satisfies TodoWriteDetails,\n\t\t\t};\n\t\t},\n\t\trenderCall(_args, theme) {\n\t\t\treturn new Text(theme.fg(\"toolTitle\", theme.bold(\"todoread\")), 0, 0);\n\t\t},\n\t\trenderResult(result, _options, theme) {\n\t\t\tconst details = result.details as TodoWriteDetails | undefined;\n\t\t\tconst todos = details?.todos ?? getCurrentTodos();\n\t\t\tconst lines = getTodoResultLines(todos);\n\t\t\tconst title = lines[0] ?? \"0 todos\";\n\t\t\tconst items = lines.slice(1);\n\t\t\tconst body = items.length > 0 ? `\\n${items.join(\"\\n\")}` : \"\";\n\t\t\treturn new Text(`${theme.fg(\"muted\", title)}${body}`, 0, 0);\n\t\t},\n\t});\n}\n"]}
1
+ {"version":3,"file":"todoread.d.ts","sourceRoot":"","sources":["../../../../../../src/core/extensions/builtin/todotools/tools/todoread.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAsB,KAAK,QAAQ,EAAyB,MAAM,aAAa,CAAC;AAIvF,wBAAgB,oBAAoB,CAAC,EAAE,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,QAAQ,EAAE,GAAG,IAAI,CA+B9F"}
@@ -1 +1 @@
1
- {"version":3,"file":"todoread.js","sourceRoot":"","sources":["../../../../../../src/core/extensions/builtin/todotools/tools/todoread.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAC;AAC9C,OAAO,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAE/B,OAAO,EAAE,kBAAkB,EAAwC,MAAM,aAAa,CAAC;AAEvF,MAAM,cAAc,GAAG,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;AAEvC,MAAM,UAAU,oBAAoB,CAAC,EAAgB,EAAE,eAAiC,EAAQ;IAC/F,EAAE,CAAC,YAAY,CAAC;QACf,IAAI,EAAE,UAAU;QAChB,KAAK,EAAE,UAAU;QACjB,WAAW,EAAE,uEAAuE;QACpF,aAAa,EAAE,2DAA2D;QAC1E,gBAAgB,EAAE;YACjB,qFAAqF;YACrF,sEAAsE;SACtE;QACD,UAAU,EAAE,cAAc;QAC1B,KAAK,CAAC,OAAO,GAAG;YACf,MAAM,YAAY,GAAG,eAAe,EAAE,CAAC;YACvC,OAAO;gBACN,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;gBACxE,OAAO,EAAE,EAAE,KAAK,EAAE,YAAY,EAA6B;aAC3D,CAAC;QAAA,CACF;QACD,UAAU,CAAC,KAAK,EAAE,KAAK,EAAE;YACxB,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,WAAW,EAAE,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAAA,CACrE;QACD,YAAY,CAAC,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE;YACrC,MAAM,OAAO,GAAG,MAAM,CAAC,OAAuC,CAAC;YAC/D,MAAM,KAAK,GAAG,OAAO,EAAE,KAAK,IAAI,eAAe,EAAE,CAAC;YAClD,MAAM,KAAK,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;YACxC,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC;YACpC,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAC7B,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7D,OAAO,IAAI,IAAI,CAAC,GAAG,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,KAAK,CAAC,GAAG,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAAA,CAC5D;KACD,CAAC,CAAC;AAAA,CACH","sourcesContent":["import { Text } from \"@earendil-works/pi-tui\";\nimport { Type } from \"typebox\";\nimport type { ExtensionAPI } from \"../../../types.ts\";\nimport { getTodoResultLines, type TodoItem, type TodoWriteDetails } from \"../state.ts\";\n\nconst TodoReadParams = Type.Object({});\n\nexport function registerTodoReadTool(pi: ExtensionAPI, getCurrentTodos: () => TodoItem[]): void {\n\tpi.registerTool({\n\t\tname: \"todoread\",\n\t\tlabel: \"TodoRead\",\n\t\tdescription: \"Read the current structured task list for the current coding session.\",\n\t\tpromptSnippet: \"Read the current todo list for the active coding session.\",\n\t\tpromptGuidelines: [\n\t\t\t\"Use this tool when you need the current todo list before deciding how to update it.\",\n\t\t\t\"This tool returns the latest session todo list managed by todowrite.\",\n\t\t],\n\t\tparameters: TodoReadParams,\n\t\tasync execute() {\n\t\t\tconst currentTodos = getCurrentTodos();\n\t\t\treturn {\n\t\t\t\tcontent: [{ type: \"text\", text: JSON.stringify(currentTodos, null, 2) }],\n\t\t\t\tdetails: { todos: currentTodos } satisfies TodoWriteDetails,\n\t\t\t};\n\t\t},\n\t\trenderCall(_args, theme) {\n\t\t\treturn new Text(theme.fg(\"toolTitle\", theme.bold(\"todoread\")), 0, 0);\n\t\t},\n\t\trenderResult(result, _options, theme) {\n\t\t\tconst details = result.details as TodoWriteDetails | undefined;\n\t\t\tconst todos = details?.todos ?? getCurrentTodos();\n\t\t\tconst lines = getTodoResultLines(todos);\n\t\t\tconst title = lines[0] ?? \"0 todos\";\n\t\t\tconst items = lines.slice(1);\n\t\t\tconst body = items.length > 0 ? `\\n${items.join(\"\\n\")}` : \"\";\n\t\t\treturn new Text(`${theme.fg(\"muted\", title)}${body}`, 0, 0);\n\t\t},\n\t});\n}\n"]}
1
+ {"version":3,"file":"todoread.js","sourceRoot":"","sources":["../../../../../../src/core/extensions/builtin/todotools/tools/todoread.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAC;AAC9C,OAAO,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAE/B,OAAO,EAAE,kBAAkB,EAAwC,MAAM,aAAa,CAAC;AAEvF,MAAM,cAAc,GAAG,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;AAEvC,MAAM,UAAU,oBAAoB,CAAC,EAAgB,EAAE,eAAiC;IACvF,EAAE,CAAC,YAAY,CAAC;QACf,IAAI,EAAE,UAAU;QAChB,KAAK,EAAE,UAAU;QACjB,WAAW,EAAE,uEAAuE;QACpF,aAAa,EAAE,2DAA2D;QAC1E,gBAAgB,EAAE;YACjB,qFAAqF;YACrF,sEAAsE;SACtE;QACD,UAAU,EAAE,cAAc;QAC1B,KAAK,CAAC,OAAO;YACZ,MAAM,YAAY,GAAG,eAAe,EAAE,CAAC;YACvC,OAAO;gBACN,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;gBACxE,OAAO,EAAE,EAAE,KAAK,EAAE,YAAY,EAA6B;aAC3D,CAAC;QACH,CAAC;QACD,UAAU,CAAC,KAAK,EAAE,KAAK;YACtB,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,WAAW,EAAE,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QACtE,CAAC;QACD,YAAY,CAAC,MAAM,EAAE,QAAQ,EAAE,KAAK;YACnC,MAAM,OAAO,GAAG,MAAM,CAAC,OAAuC,CAAC;YAC/D,MAAM,KAAK,GAAG,OAAO,EAAE,KAAK,IAAI,eAAe,EAAE,CAAC;YAClD,MAAM,KAAK,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;YACxC,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC;YACpC,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAC7B,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7D,OAAO,IAAI,IAAI,CAAC,GAAG,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,KAAK,CAAC,GAAG,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAC7D,CAAC;KACD,CAAC,CAAC;AACJ,CAAC","sourcesContent":["import { Text } from \"@earendil-works/pi-tui\";\nimport { Type } from \"typebox\";\nimport type { ExtensionAPI } from \"../../../types.ts\";\nimport { getTodoResultLines, type TodoItem, type TodoWriteDetails } from \"../state.ts\";\n\nconst TodoReadParams = Type.Object({});\n\nexport function registerTodoReadTool(pi: ExtensionAPI, getCurrentTodos: () => TodoItem[]): void {\n\tpi.registerTool({\n\t\tname: \"todoread\",\n\t\tlabel: \"TodoRead\",\n\t\tdescription: \"Read the current structured task list for the current coding session.\",\n\t\tpromptSnippet: \"Read the current todo list for the active coding session.\",\n\t\tpromptGuidelines: [\n\t\t\t\"Use this tool when you need the current todo list before deciding how to update it.\",\n\t\t\t\"This tool returns the latest session todo list managed by todowrite.\",\n\t\t],\n\t\tparameters: TodoReadParams,\n\t\tasync execute() {\n\t\t\tconst currentTodos = getCurrentTodos();\n\t\t\treturn {\n\t\t\t\tcontent: [{ type: \"text\", text: JSON.stringify(currentTodos, null, 2) }],\n\t\t\t\tdetails: { todos: currentTodos } satisfies TodoWriteDetails,\n\t\t\t};\n\t\t},\n\t\trenderCall(_args, theme) {\n\t\t\treturn new Text(theme.fg(\"toolTitle\", theme.bold(\"todoread\")), 0, 0);\n\t\t},\n\t\trenderResult(result, _options, theme) {\n\t\t\tconst details = result.details as TodoWriteDetails | undefined;\n\t\t\tconst todos = details?.todos ?? getCurrentTodos();\n\t\t\tconst lines = getTodoResultLines(todos);\n\t\t\tconst title = lines[0] ?? \"0 todos\";\n\t\t\tconst items = lines.slice(1);\n\t\t\tconst body = items.length > 0 ? `\\n${items.join(\"\\n\")}` : \"\";\n\t\t\treturn new Text(`${theme.fg(\"muted\", title)}${body}`, 0, 0);\n\t\t},\n\t});\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"todowrite.d.ts","sourceRoot":"","sources":["../../../../../../src/core/extensions/builtin/todotools/tools/todowrite.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACxE,OAAO,EAGN,KAAK,QAAQ,EAGb,MAAM,aAAa,CAAC;AA2DrB,KAAK,aAAa,GAAG;IACpB,eAAe,EAAE,MAAM,QAAQ,EAAE,CAAC;IAClC,eAAe,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,KAAK,IAAI,CAAC;IAC7C,UAAU,EAAE,CAAC,GAAG,EAAE,gBAAgB,KAAK,IAAI,CAAC;CAC5C,CAAC;AAEF,wBAAgB,qBAAqB,CAAC,EAAE,EAAE,YAAY,EAAE,SAAS,EAAE,aAAa,GAAG,IAAI,CA4CtF","sourcesContent":["import { Text } from \"@earendil-works/pi-tui\";\nimport { Type } from \"typebox\";\nimport type { ExtensionAPI, ExtensionContext } from \"../../../types.ts\";\nimport {\n\tgetTodoResultLines,\n\tTODO_STATE_ENTRY_TYPE,\n\ttype TodoItem,\n\ttype TodoStateEntry,\n\ttype TodoWriteDetails,\n} from \"../state.ts\";\n\nconst DESCRIPTION = `Use this tool to create and manage a structured task list for tracking progress on multi-step work.\n\n<todo_format>\n## Todo Format (MANDATORY)\n\nEach todo title MUST encode four elements: WHERE, WHY, HOW, and EXPECTED RESULT.\n\nFormat: \"[WHERE] [HOW] to [WHY] - expect [RESULT]\"\n\nGOOD:\n- \"src/utils/validation.ts: Add validateEmail() for input sanitization - returns boolean\"\n- \"UserService.create(): Call validateEmail() before DB insert - rejects invalid emails with 400\"\n- \"validation.test.ts: Add test for missing @ sign - expect validateEmail('foo') to return false\"\n\nBAD:\n- \"Implement email validation\" (where? how? what result?)\n- \"Add dark mode\" (feature, not a todo)\n- \"Fix auth\" (what file? what changes? what's expected?)\n</todo_format>\n\n<granularity_rules>\n## Granularity Rules\n\nEach todo MUST be a single atomic action completable in 1-3 tool calls. If it needs more, split it.\n\n**Size test**: Can you complete this todo by editing one file or running one command? If not, it's too big.\n</granularity_rules>\n\n<task_management>\n## Task Management\n- One in_progress at a time. Complete it before starting the next.\n- Mark completed immediately after finishing each item.\n- ALWAYS use todos. No \"trivial task\" exemptions.\n</task_management>`;\n\nconst TodoItemSchema = Type.Object({\n\tcontent: Type.String({\n\t\tdescription:\n\t\t\t\"Todo title encoding WHERE, WHY, HOW, and EXPECTED RESULT. Format: '[WHERE] [HOW] to [WHY] - expect [RESULT]'. Must be a single atomic action completable in 1-3 tool calls.\",\n\t}),\n\tstatus: Type.String({\n\t\tdescription:\n\t\t\t\"Current status: pending (not started), in_progress (currently working - limit ONE at a time), completed (finished - mark IMMEDIATELY after done), cancelled (no longer needed)\",\n\t}),\n\tpriority: Type.String({\n\t\tdescription:\n\t\t\t\"Priority level: high (blocking or critical path), medium (important but not blocking), low (nice to have)\",\n\t}),\n});\n\nconst TodoWriteParams = Type.Object({\n\ttodos: Type.Array(TodoItemSchema, {\n\t\tdescription: \"The updated todo list\",\n\t\tminItems: 1,\n\t}),\n});\n\ntype TodoAccessors = {\n\tgetCurrentTodos: () => TodoItem[];\n\tsetCurrentTodos: (todos: TodoItem[]) => void;\n\tsyncWidget: (ctx: ExtensionContext) => void;\n};\n\nexport function registerTodoWriteTool(pi: ExtensionAPI, accessors: TodoAccessors): void {\n\tpi.registerTool({\n\t\tname: \"todowrite\",\n\t\tlabel: \"TodoWrite\",\n\t\tdescription: DESCRIPTION,\n\t\tpromptSnippet:\n\t\t\t\"MANDATORY for ALL tasks. Follow EXPLORE -> DEFINE -> PLAN -> TODO -> EXECUTE workflow. No exceptions.\",\n\t\tpromptGuidelines: [\n\t\t\t\"Create todos for EVERY task. No 'trivial task' exemptions. Follow EXPLORE -> DEFINE -> PLAN -> TODO -> EXECUTE workflow always.\",\n\t\t\t\"Each todo title MUST encode WHERE, WHY, HOW, and EXPECTED RESULT. Format: '[WHERE] [HOW] to [WHY] - expect [RESULT]'. Vague todos are useless.\",\n\t\t\t\"Each todo MUST be a single atomic action completable in 1-3 tool calls. If bigger, split it. Size test: one file edit or one command.\",\n\t\t\t\"Pass the complete updated todo list on every call instead of incremental operations.\",\n\t\t\t\"Exactly ONE todo with status in_progress at any time. Mark completed IMMEDIATELY after finishing - NEVER batch completions.\",\n\t\t\t\"OBSESSIVELY TRACK YOUR WORK. Every step gets a todo. Every completion gets marked immediately. No evidence = not complete.\",\n\t\t],\n\t\tparameters: TodoWriteParams,\n\t\tasync execute(_toolCallId, params, _signal, _onUpdate, ctx) {\n\t\t\tconst currentTodos = params.todos.map((todo) => ({ ...todo }));\n\t\t\taccessors.setCurrentTodos(currentTodos);\n\t\t\tpi.appendEntry(TODO_STATE_ENTRY_TYPE, { todos: currentTodos } satisfies TodoStateEntry);\n\t\t\taccessors.syncWidget(ctx);\n\n\t\t\treturn {\n\t\t\t\tcontent: [{ type: \"text\", text: JSON.stringify(currentTodos, null, 2) }],\n\t\t\t\tdetails: { todos: currentTodos } satisfies TodoWriteDetails,\n\t\t\t};\n\t\t},\n\t\trenderCall(args, theme) {\n\t\t\treturn new Text(\n\t\t\t\ttheme.fg(\"toolTitle\", theme.bold(\"todowrite \")) + theme.fg(\"muted\", `${args.todos.length} item(s)`),\n\t\t\t\t0,\n\t\t\t\t0,\n\t\t\t);\n\t\t},\n\t\trenderResult(result, _options, theme) {\n\t\t\tconst details = result.details as TodoWriteDetails | undefined;\n\t\t\tconst todos = details?.todos ?? accessors.getCurrentTodos();\n\t\t\tconst lines = getTodoResultLines(todos);\n\t\t\tconst title = lines[0] ?? \"0 todos\";\n\t\t\tconst items = lines.slice(1);\n\t\t\tconst body = items.length > 0 ? `\\n${items.join(\"\\n\")}` : \"\";\n\t\t\treturn new Text(`${theme.fg(\"muted\", title)}${body}`, 0, 0);\n\t\t},\n\t});\n}\n"]}
1
+ {"version":3,"file":"todowrite.d.ts","sourceRoot":"","sources":["../../../../../../src/core/extensions/builtin/todotools/tools/todowrite.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACxE,OAAO,EAGN,KAAK,QAAQ,EAGb,MAAM,aAAa,CAAC;AA2DrB,KAAK,aAAa,GAAG;IACpB,eAAe,EAAE,MAAM,QAAQ,EAAE,CAAC;IAClC,eAAe,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,KAAK,IAAI,CAAC;IAC7C,UAAU,EAAE,CAAC,GAAG,EAAE,gBAAgB,KAAK,IAAI,CAAC;CAC5C,CAAC;AAEF,wBAAgB,qBAAqB,CAAC,EAAE,EAAE,YAAY,EAAE,SAAS,EAAE,aAAa,GAAG,IAAI,CA4CtF"}
@@ -1 +1 @@
1
- {"version":3,"file":"todowrite.js","sourceRoot":"","sources":["../../../../../../src/core/extensions/builtin/todotools/tools/todowrite.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAC;AAC9C,OAAO,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAE/B,OAAO,EACN,kBAAkB,EAClB,qBAAqB,GAIrB,MAAM,aAAa,CAAC;AAErB,MAAM,WAAW,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;mBAiCD,CAAC;AAEpB,MAAM,cAAc,GAAG,IAAI,CAAC,MAAM,CAAC;IAClC,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC;QACpB,WAAW,EACV,6KAA6K;KAC9K,CAAC;IACF,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC;QACnB,WAAW,EACV,gLAAgL;KACjL,CAAC;IACF,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC;QACrB,WAAW,EACV,2GAA2G;KAC5G,CAAC;CACF,CAAC,CAAC;AAEH,MAAM,eAAe,GAAG,IAAI,CAAC,MAAM,CAAC;IACnC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE;QACjC,WAAW,EAAE,uBAAuB;QACpC,QAAQ,EAAE,CAAC;KACX,CAAC;CACF,CAAC,CAAC;AAQH,MAAM,UAAU,qBAAqB,CAAC,EAAgB,EAAE,SAAwB,EAAQ;IACvF,EAAE,CAAC,YAAY,CAAC;QACf,IAAI,EAAE,WAAW;QACjB,KAAK,EAAE,WAAW;QAClB,WAAW,EAAE,WAAW;QACxB,aAAa,EACZ,uGAAuG;QACxG,gBAAgB,EAAE;YACjB,iIAAiI;YACjI,gJAAgJ;YAChJ,uIAAuI;YACvI,sFAAsF;YACtF,6HAA6H;YAC7H,4HAA4H;SAC5H;QACD,UAAU,EAAE,eAAe;QAC3B,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,EAAE;YAC3D,MAAM,YAAY,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC;YAC/D,SAAS,CAAC,eAAe,CAAC,YAAY,CAAC,CAAC;YACxC,EAAE,CAAC,WAAW,CAAC,qBAAqB,EAAE,EAAE,KAAK,EAAE,YAAY,EAA2B,CAAC,CAAC;YACxF,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;YAE1B,OAAO;gBACN,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;gBACxE,OAAO,EAAE,EAAE,KAAK,EAAE,YAAY,EAA6B;aAC3D,CAAC;QAAA,CACF;QACD,UAAU,CAAC,IAAI,EAAE,KAAK,EAAE;YACvB,OAAO,IAAI,IAAI,CACd,KAAK,CAAC,EAAE,CAAC,WAAW,EAAE,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,GAAG,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,UAAU,CAAC,EACnG,CAAC,EACD,CAAC,CACD,CAAC;QAAA,CACF;QACD,YAAY,CAAC,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE;YACrC,MAAM,OAAO,GAAG,MAAM,CAAC,OAAuC,CAAC;YAC/D,MAAM,KAAK,GAAG,OAAO,EAAE,KAAK,IAAI,SAAS,CAAC,eAAe,EAAE,CAAC;YAC5D,MAAM,KAAK,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;YACxC,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC;YACpC,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAC7B,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7D,OAAO,IAAI,IAAI,CAAC,GAAG,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,KAAK,CAAC,GAAG,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAAA,CAC5D;KACD,CAAC,CAAC;AAAA,CACH","sourcesContent":["import { Text } from \"@earendil-works/pi-tui\";\nimport { Type } from \"typebox\";\nimport type { ExtensionAPI, ExtensionContext } from \"../../../types.ts\";\nimport {\n\tgetTodoResultLines,\n\tTODO_STATE_ENTRY_TYPE,\n\ttype TodoItem,\n\ttype TodoStateEntry,\n\ttype TodoWriteDetails,\n} from \"../state.ts\";\n\nconst DESCRIPTION = `Use this tool to create and manage a structured task list for tracking progress on multi-step work.\n\n<todo_format>\n## Todo Format (MANDATORY)\n\nEach todo title MUST encode four elements: WHERE, WHY, HOW, and EXPECTED RESULT.\n\nFormat: \"[WHERE] [HOW] to [WHY] - expect [RESULT]\"\n\nGOOD:\n- \"src/utils/validation.ts: Add validateEmail() for input sanitization - returns boolean\"\n- \"UserService.create(): Call validateEmail() before DB insert - rejects invalid emails with 400\"\n- \"validation.test.ts: Add test for missing @ sign - expect validateEmail('foo') to return false\"\n\nBAD:\n- \"Implement email validation\" (where? how? what result?)\n- \"Add dark mode\" (feature, not a todo)\n- \"Fix auth\" (what file? what changes? what's expected?)\n</todo_format>\n\n<granularity_rules>\n## Granularity Rules\n\nEach todo MUST be a single atomic action completable in 1-3 tool calls. If it needs more, split it.\n\n**Size test**: Can you complete this todo by editing one file or running one command? If not, it's too big.\n</granularity_rules>\n\n<task_management>\n## Task Management\n- One in_progress at a time. Complete it before starting the next.\n- Mark completed immediately after finishing each item.\n- ALWAYS use todos. No \"trivial task\" exemptions.\n</task_management>`;\n\nconst TodoItemSchema = Type.Object({\n\tcontent: Type.String({\n\t\tdescription:\n\t\t\t\"Todo title encoding WHERE, WHY, HOW, and EXPECTED RESULT. Format: '[WHERE] [HOW] to [WHY] - expect [RESULT]'. Must be a single atomic action completable in 1-3 tool calls.\",\n\t}),\n\tstatus: Type.String({\n\t\tdescription:\n\t\t\t\"Current status: pending (not started), in_progress (currently working - limit ONE at a time), completed (finished - mark IMMEDIATELY after done), cancelled (no longer needed)\",\n\t}),\n\tpriority: Type.String({\n\t\tdescription:\n\t\t\t\"Priority level: high (blocking or critical path), medium (important but not blocking), low (nice to have)\",\n\t}),\n});\n\nconst TodoWriteParams = Type.Object({\n\ttodos: Type.Array(TodoItemSchema, {\n\t\tdescription: \"The updated todo list\",\n\t\tminItems: 1,\n\t}),\n});\n\ntype TodoAccessors = {\n\tgetCurrentTodos: () => TodoItem[];\n\tsetCurrentTodos: (todos: TodoItem[]) => void;\n\tsyncWidget: (ctx: ExtensionContext) => void;\n};\n\nexport function registerTodoWriteTool(pi: ExtensionAPI, accessors: TodoAccessors): void {\n\tpi.registerTool({\n\t\tname: \"todowrite\",\n\t\tlabel: \"TodoWrite\",\n\t\tdescription: DESCRIPTION,\n\t\tpromptSnippet:\n\t\t\t\"MANDATORY for ALL tasks. Follow EXPLORE -> DEFINE -> PLAN -> TODO -> EXECUTE workflow. No exceptions.\",\n\t\tpromptGuidelines: [\n\t\t\t\"Create todos for EVERY task. No 'trivial task' exemptions. Follow EXPLORE -> DEFINE -> PLAN -> TODO -> EXECUTE workflow always.\",\n\t\t\t\"Each todo title MUST encode WHERE, WHY, HOW, and EXPECTED RESULT. Format: '[WHERE] [HOW] to [WHY] - expect [RESULT]'. Vague todos are useless.\",\n\t\t\t\"Each todo MUST be a single atomic action completable in 1-3 tool calls. If bigger, split it. Size test: one file edit or one command.\",\n\t\t\t\"Pass the complete updated todo list on every call instead of incremental operations.\",\n\t\t\t\"Exactly ONE todo with status in_progress at any time. Mark completed IMMEDIATELY after finishing - NEVER batch completions.\",\n\t\t\t\"OBSESSIVELY TRACK YOUR WORK. Every step gets a todo. Every completion gets marked immediately. No evidence = not complete.\",\n\t\t],\n\t\tparameters: TodoWriteParams,\n\t\tasync execute(_toolCallId, params, _signal, _onUpdate, ctx) {\n\t\t\tconst currentTodos = params.todos.map((todo) => ({ ...todo }));\n\t\t\taccessors.setCurrentTodos(currentTodos);\n\t\t\tpi.appendEntry(TODO_STATE_ENTRY_TYPE, { todos: currentTodos } satisfies TodoStateEntry);\n\t\t\taccessors.syncWidget(ctx);\n\n\t\t\treturn {\n\t\t\t\tcontent: [{ type: \"text\", text: JSON.stringify(currentTodos, null, 2) }],\n\t\t\t\tdetails: { todos: currentTodos } satisfies TodoWriteDetails,\n\t\t\t};\n\t\t},\n\t\trenderCall(args, theme) {\n\t\t\treturn new Text(\n\t\t\t\ttheme.fg(\"toolTitle\", theme.bold(\"todowrite \")) + theme.fg(\"muted\", `${args.todos.length} item(s)`),\n\t\t\t\t0,\n\t\t\t\t0,\n\t\t\t);\n\t\t},\n\t\trenderResult(result, _options, theme) {\n\t\t\tconst details = result.details as TodoWriteDetails | undefined;\n\t\t\tconst todos = details?.todos ?? accessors.getCurrentTodos();\n\t\t\tconst lines = getTodoResultLines(todos);\n\t\t\tconst title = lines[0] ?? \"0 todos\";\n\t\t\tconst items = lines.slice(1);\n\t\t\tconst body = items.length > 0 ? `\\n${items.join(\"\\n\")}` : \"\";\n\t\t\treturn new Text(`${theme.fg(\"muted\", title)}${body}`, 0, 0);\n\t\t},\n\t});\n}\n"]}
1
+ {"version":3,"file":"todowrite.js","sourceRoot":"","sources":["../../../../../../src/core/extensions/builtin/todotools/tools/todowrite.ts"],"names":[],"mappings":"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","sourcesContent":["import { Text } from \"@earendil-works/pi-tui\";\nimport { Type } from \"typebox\";\nimport type { ExtensionAPI, ExtensionContext } from \"../../../types.ts\";\nimport {\n\tgetTodoResultLines,\n\tTODO_STATE_ENTRY_TYPE,\n\ttype TodoItem,\n\ttype TodoStateEntry,\n\ttype TodoWriteDetails,\n} from \"../state.ts\";\n\nconst DESCRIPTION = `Use this tool to create and manage a structured task list for tracking progress on multi-step work.\n\n<todo_format>\n## Todo Format (MANDATORY)\n\nEach todo title MUST encode four elements: WHERE, WHY, HOW, and EXPECTED RESULT.\n\nFormat: \"[WHERE] [HOW] to [WHY] - expect [RESULT]\"\n\nGOOD:\n- \"src/utils/validation.ts: Add validateEmail() for input sanitization - returns boolean\"\n- \"UserService.create(): Call validateEmail() before DB insert - rejects invalid emails with 400\"\n- \"validation.test.ts: Add test for missing @ sign - expect validateEmail('foo') to return false\"\n\nBAD:\n- \"Implement email validation\" (where? how? what result?)\n- \"Add dark mode\" (feature, not a todo)\n- \"Fix auth\" (what file? what changes? what's expected?)\n</todo_format>\n\n<granularity_rules>\n## Granularity Rules\n\nEach todo MUST be a single atomic action completable in 1-3 tool calls. If it needs more, split it.\n\n**Size test**: Can you complete this todo by editing one file or running one command? If not, it's too big.\n</granularity_rules>\n\n<task_management>\n## Task Management\n- One in_progress at a time. Complete it before starting the next.\n- Mark completed immediately after finishing each item.\n- ALWAYS use todos. No \"trivial task\" exemptions.\n</task_management>`;\n\nconst TodoItemSchema = Type.Object({\n\tcontent: Type.String({\n\t\tdescription:\n\t\t\t\"Todo title encoding WHERE, WHY, HOW, and EXPECTED RESULT. Format: '[WHERE] [HOW] to [WHY] - expect [RESULT]'. Must be a single atomic action completable in 1-3 tool calls.\",\n\t}),\n\tstatus: Type.String({\n\t\tdescription:\n\t\t\t\"Current status: pending (not started), in_progress (currently working - limit ONE at a time), completed (finished - mark IMMEDIATELY after done), cancelled (no longer needed)\",\n\t}),\n\tpriority: Type.String({\n\t\tdescription:\n\t\t\t\"Priority level: high (blocking or critical path), medium (important but not blocking), low (nice to have)\",\n\t}),\n});\n\nconst TodoWriteParams = Type.Object({\n\ttodos: Type.Array(TodoItemSchema, {\n\t\tdescription: \"The updated todo list\",\n\t\tminItems: 1,\n\t}),\n});\n\ntype TodoAccessors = {\n\tgetCurrentTodos: () => TodoItem[];\n\tsetCurrentTodos: (todos: TodoItem[]) => void;\n\tsyncWidget: (ctx: ExtensionContext) => void;\n};\n\nexport function registerTodoWriteTool(pi: ExtensionAPI, accessors: TodoAccessors): void {\n\tpi.registerTool({\n\t\tname: \"todowrite\",\n\t\tlabel: \"TodoWrite\",\n\t\tdescription: DESCRIPTION,\n\t\tpromptSnippet:\n\t\t\t\"MANDATORY for ALL tasks. Follow EXPLORE -> DEFINE -> PLAN -> TODO -> EXECUTE workflow. No exceptions.\",\n\t\tpromptGuidelines: [\n\t\t\t\"Create todos for EVERY task. No 'trivial task' exemptions. Follow EXPLORE -> DEFINE -> PLAN -> TODO -> EXECUTE workflow always.\",\n\t\t\t\"Each todo title MUST encode WHERE, WHY, HOW, and EXPECTED RESULT. Format: '[WHERE] [HOW] to [WHY] - expect [RESULT]'. Vague todos are useless.\",\n\t\t\t\"Each todo MUST be a single atomic action completable in 1-3 tool calls. If bigger, split it. Size test: one file edit or one command.\",\n\t\t\t\"Pass the complete updated todo list on every call instead of incremental operations.\",\n\t\t\t\"Exactly ONE todo with status in_progress at any time. Mark completed IMMEDIATELY after finishing - NEVER batch completions.\",\n\t\t\t\"OBSESSIVELY TRACK YOUR WORK. Every step gets a todo. Every completion gets marked immediately. No evidence = not complete.\",\n\t\t],\n\t\tparameters: TodoWriteParams,\n\t\tasync execute(_toolCallId, params, _signal, _onUpdate, ctx) {\n\t\t\tconst currentTodos = params.todos.map((todo) => ({ ...todo }));\n\t\t\taccessors.setCurrentTodos(currentTodos);\n\t\t\tpi.appendEntry(TODO_STATE_ENTRY_TYPE, { todos: currentTodos } satisfies TodoStateEntry);\n\t\t\taccessors.syncWidget(ctx);\n\n\t\t\treturn {\n\t\t\t\tcontent: [{ type: \"text\", text: JSON.stringify(currentTodos, null, 2) }],\n\t\t\t\tdetails: { todos: currentTodos } satisfies TodoWriteDetails,\n\t\t\t};\n\t\t},\n\t\trenderCall(args, theme) {\n\t\t\treturn new Text(\n\t\t\t\ttheme.fg(\"toolTitle\", theme.bold(\"todowrite \")) + theme.fg(\"muted\", `${args.todos.length} item(s)`),\n\t\t\t\t0,\n\t\t\t\t0,\n\t\t\t);\n\t\t},\n\t\trenderResult(result, _options, theme) {\n\t\t\tconst details = result.details as TodoWriteDetails | undefined;\n\t\t\tconst todos = details?.todos ?? accessors.getCurrentTodos();\n\t\t\tconst lines = getTodoResultLines(todos);\n\t\t\tconst title = lines[0] ?? \"0 todos\";\n\t\t\tconst items = lines.slice(1);\n\t\t\tconst body = items.length > 0 ? `\\n${items.join(\"\\n\")}` : \"\";\n\t\t\treturn new Text(`${theme.fg(\"muted\", title)}${body}`, 0, 0);\n\t\t},\n\t});\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/tool-pair-guard/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAKnD,2EAA2E;AAC3E,MAAM,CAAC,OAAO,UAAU,sBAAsB,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CAQrE","sourcesContent":["import type { ExtensionAPI } from \"../../types.ts\";\nimport { sanitizeAnthropicPayload } from \"./sanitize-anthropic-payload.ts\";\nimport { sanitizeOpenAIChatCompletionsPayload } from \"./sanitize-openai-chat-completions-payload.ts\";\nimport { sanitizeOpenAIResponsesPayload } from \"./sanitize-openai-responses-payload.ts\";\n\n/** Guards provider requests by keeping tool-call/result pairs balanced. */\nexport default function toolPairGuardExtension(pi: ExtensionAPI): void {\n\tpi.on(\"before_provider_request\", (event) => {\n\t\tconst sanitizedAnthropicPayload = sanitizeAnthropicPayload(event.payload);\n\t\tconst sanitizedResponsesPayload = sanitizeOpenAIResponsesPayload(sanitizedAnthropicPayload);\n\t\tconst sanitizedPayload = sanitizeOpenAIChatCompletionsPayload(sanitizedResponsesPayload);\n\t\tif (sanitizedPayload === event.payload) return undefined;\n\t\treturn sanitizedPayload;\n\t});\n}\n"]}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/tool-pair-guard/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAKnD,2EAA2E;AAC3E,MAAM,CAAC,OAAO,UAAU,sBAAsB,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CAQrE"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/tool-pair-guard/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,wBAAwB,EAAE,MAAM,iCAAiC,CAAC;AAC3E,OAAO,EAAE,oCAAoC,EAAE,MAAM,+CAA+C,CAAC;AACrG,OAAO,EAAE,8BAA8B,EAAE,MAAM,wCAAwC,CAAC;AAExF,2EAA2E;AAC3E,MAAM,CAAC,OAAO,UAAU,sBAAsB,CAAC,EAAgB,EAAQ;IACtE,EAAE,CAAC,EAAE,CAAC,yBAAyB,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC;QAC3C,MAAM,yBAAyB,GAAG,wBAAwB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC1E,MAAM,yBAAyB,GAAG,8BAA8B,CAAC,yBAAyB,CAAC,CAAC;QAC5F,MAAM,gBAAgB,GAAG,oCAAoC,CAAC,yBAAyB,CAAC,CAAC;QACzF,IAAI,gBAAgB,KAAK,KAAK,CAAC,OAAO;YAAE,OAAO,SAAS,CAAC;QACzD,OAAO,gBAAgB,CAAC;IAAA,CACxB,CAAC,CAAC;AAAA,CACH","sourcesContent":["import type { ExtensionAPI } from \"../../types.ts\";\nimport { sanitizeAnthropicPayload } from \"./sanitize-anthropic-payload.ts\";\nimport { sanitizeOpenAIChatCompletionsPayload } from \"./sanitize-openai-chat-completions-payload.ts\";\nimport { sanitizeOpenAIResponsesPayload } from \"./sanitize-openai-responses-payload.ts\";\n\n/** Guards provider requests by keeping tool-call/result pairs balanced. */\nexport default function toolPairGuardExtension(pi: ExtensionAPI): void {\n\tpi.on(\"before_provider_request\", (event) => {\n\t\tconst sanitizedAnthropicPayload = sanitizeAnthropicPayload(event.payload);\n\t\tconst sanitizedResponsesPayload = sanitizeOpenAIResponsesPayload(sanitizedAnthropicPayload);\n\t\tconst sanitizedPayload = sanitizeOpenAIChatCompletionsPayload(sanitizedResponsesPayload);\n\t\tif (sanitizedPayload === event.payload) return undefined;\n\t\treturn sanitizedPayload;\n\t});\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/tool-pair-guard/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,wBAAwB,EAAE,MAAM,iCAAiC,CAAC;AAC3E,OAAO,EAAE,oCAAoC,EAAE,MAAM,+CAA+C,CAAC;AACrG,OAAO,EAAE,8BAA8B,EAAE,MAAM,wCAAwC,CAAC;AAExF,2EAA2E;AAC3E,MAAM,CAAC,OAAO,UAAU,sBAAsB,CAAC,EAAgB;IAC9D,EAAE,CAAC,EAAE,CAAC,yBAAyB,EAAE,CAAC,KAAK,EAAE,EAAE;QAC1C,MAAM,yBAAyB,GAAG,wBAAwB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC1E,MAAM,yBAAyB,GAAG,8BAA8B,CAAC,yBAAyB,CAAC,CAAC;QAC5F,MAAM,gBAAgB,GAAG,oCAAoC,CAAC,yBAAyB,CAAC,CAAC;QACzF,IAAI,gBAAgB,KAAK,KAAK,CAAC,OAAO;YAAE,OAAO,SAAS,CAAC;QACzD,OAAO,gBAAgB,CAAC;IACzB,CAAC,CAAC,CAAC;AACJ,CAAC","sourcesContent":["import type { ExtensionAPI } from \"../../types.ts\";\nimport { sanitizeAnthropicPayload } from \"./sanitize-anthropic-payload.ts\";\nimport { sanitizeOpenAIChatCompletionsPayload } from \"./sanitize-openai-chat-completions-payload.ts\";\nimport { sanitizeOpenAIResponsesPayload } from \"./sanitize-openai-responses-payload.ts\";\n\n/** Guards provider requests by keeping tool-call/result pairs balanced. */\nexport default function toolPairGuardExtension(pi: ExtensionAPI): void {\n\tpi.on(\"before_provider_request\", (event) => {\n\t\tconst sanitizedAnthropicPayload = sanitizeAnthropicPayload(event.payload);\n\t\tconst sanitizedResponsesPayload = sanitizeOpenAIResponsesPayload(sanitizedAnthropicPayload);\n\t\tconst sanitizedPayload = sanitizeOpenAIChatCompletionsPayload(sanitizedResponsesPayload);\n\t\tif (sanitizedPayload === event.payload) return undefined;\n\t\treturn sanitizedPayload;\n\t});\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"sanitize-anthropic-payload.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/tool-pair-guard/sanitize-anthropic-payload.ts"],"names":[],"mappings":"AAiCA,kFAAkF;AAClF,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAuDlE","sourcesContent":["import type { ContentBlockParam, MessageParam } from \"@anthropic-ai/sdk/resources/messages.js\";\n\nfunction isObject(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null;\n}\n\nfunction hasMessagesArray(value: unknown): value is { messages: unknown[] } {\n\treturn isObject(value) && Array.isArray(value.messages);\n}\n\nfunction isContentBlockParam(value: unknown): value is ContentBlockParam {\n\treturn isObject(value) && typeof value.type === \"string\";\n}\n\nfunction isToolUseBlock(block: ContentBlockParam): block is Extract<ContentBlockParam, { type: \"tool_use\" }> {\n\treturn block.type === \"tool_use\" && \"id\" in block && typeof block.id === \"string\";\n}\n\nfunction isToolResultBlock(block: ContentBlockParam): block is Extract<ContentBlockParam, { type: \"tool_result\" }> {\n\treturn block.type === \"tool_result\";\n}\n\nfunction isMessageWithArrayContent(\n\tvalue: unknown,\n\trole: MessageParam[\"role\"],\n): value is MessageParam & { content: ContentBlockParam[] } {\n\tif (!isObject(value) || value.role !== role || !Array.isArray(value.content)) return false;\n\tfor (const block of value.content) {\n\t\tif (!isContentBlockParam(block)) return false;\n\t}\n\treturn true;\n}\n\n/** Removes orphan Anthropic tool_result blocks from provider payload messages. */\nexport function sanitizeAnthropicPayload(payload: unknown): unknown {\n\tif (!hasMessagesArray(payload)) return payload;\n\n\tconst toolUseIds = new Set<string>();\n\tfor (const unknownMessage of payload.messages) {\n\t\tif (!isMessageWithArrayContent(unknownMessage, \"assistant\")) continue;\n\t\tfor (const unknownBlock of unknownMessage.content) {\n\t\t\tif (isToolUseBlock(unknownBlock) && unknownBlock.id.length > 0) toolUseIds.add(unknownBlock.id);\n\t\t}\n\t}\n\n\tlet changed = false;\n\tconst sanitizedMessages: unknown[] = [];\n\n\tfor (const unknownMessage of payload.messages) {\n\t\tif (!isMessageWithArrayContent(unknownMessage, \"user\")) {\n\t\t\tsanitizedMessages.push(unknownMessage);\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst originalContent = unknownMessage.content;\n\t\tconst nextContent: ContentBlockParam[] = [];\n\t\tlet messageChanged = false;\n\n\t\tfor (const block of originalContent) {\n\t\t\tif (!isToolResultBlock(block)) {\n\t\t\t\tnextContent.push(block);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst toolUseId = block.tool_use_id;\n\t\t\tif (typeof toolUseId !== \"string\" || toolUseId.length === 0 || !toolUseIds.has(toolUseId)) {\n\t\t\t\tmessageChanged = true;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tnextContent.push(block);\n\t\t}\n\n\t\tif (nextContent.length === 0) {\n\t\t\tchanged = true;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (messageChanged) {\n\t\t\tchanged = true;\n\t\t\tsanitizedMessages.push({ ...unknownMessage, content: nextContent });\n\t\t\tcontinue;\n\t\t}\n\n\t\tsanitizedMessages.push(unknownMessage);\n\t}\n\n\tif (!changed) return payload;\n\treturn { ...payload, messages: sanitizedMessages };\n}\n"]}
1
+ {"version":3,"file":"sanitize-anthropic-payload.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/tool-pair-guard/sanitize-anthropic-payload.ts"],"names":[],"mappings":"AAiCA,kFAAkF;AAClF,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAuDlE"}