@code-yeongyu/senpi 2026.7.31 → 2026.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (491) hide show
  1. package/CHANGELOG.md +237 -0
  2. package/dist/core/agent-session.d.ts +49 -13
  3. package/dist/core/agent-session.d.ts.map +1 -1
  4. package/dist/core/agent-session.js +120 -37
  5. package/dist/core/agent-session.js.map +1 -1
  6. package/dist/core/dynamic-prompt/build.d.ts.map +1 -1
  7. package/dist/core/dynamic-prompt/build.js +4 -0
  8. package/dist/core/dynamic-prompt/build.js.map +1 -1
  9. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/account-command.d.ts +2 -2
  10. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/account-command.d.ts.map +1 -1
  11. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/account-command.js +25 -25
  12. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/account-command.js.map +1 -1
  13. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/account-events.d.ts.map +1 -1
  14. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/account-events.js.map +1 -1
  15. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/account-management.d.ts +1 -1
  16. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/account-management.d.ts.map +1 -1
  17. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/account-management.js +2 -2
  18. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/account-management.js.map +1 -1
  19. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/accounts.d.ts +9 -9
  20. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/accounts.d.ts.map +1 -1
  21. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/accounts.js +2 -2
  22. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/accounts.js.map +1 -1
  23. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/affinity.d.ts +1 -1
  24. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/affinity.d.ts.map +1 -1
  25. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/affinity.js +3 -3
  26. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/affinity.js.map +1 -1
  27. package/dist/core/extensions/builtin/claude-sdk-oauth/auth-attempt.d.ts +21 -0
  28. package/dist/core/extensions/builtin/claude-sdk-oauth/auth-attempt.d.ts.map +1 -0
  29. package/dist/core/extensions/builtin/claude-sdk-oauth/auth-attempt.js +30 -0
  30. package/dist/core/extensions/builtin/claude-sdk-oauth/auth-attempt.js.map +1 -0
  31. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/auth-lane.d.ts +8 -4
  32. package/dist/core/extensions/builtin/claude-sdk-oauth/auth-lane.d.ts.map +1 -0
  33. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/auth-lane.js +34 -25
  34. package/dist/core/extensions/builtin/claude-sdk-oauth/auth-lane.js.map +1 -0
  35. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/custom-tools-schema.d.ts.map +1 -1
  36. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/custom-tools-schema.js.map +1 -1
  37. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/custom-tools.d.ts.map +1 -1
  38. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/custom-tools.js.map +1 -1
  39. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/errors.d.ts +1 -1
  40. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/errors.d.ts.map +1 -1
  41. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/errors.js +1 -1
  42. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/errors.js.map +1 -1
  43. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/executable.d.ts.map +1 -1
  44. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/executable.js.map +1 -1
  45. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/failover.d.ts.map +1 -1
  46. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/failover.js +1 -1
  47. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/failover.js.map +1 -1
  48. package/dist/core/extensions/builtin/claude-sdk-oauth/guidance.d.ts +14 -0
  49. package/dist/core/extensions/builtin/claude-sdk-oauth/guidance.d.ts.map +1 -0
  50. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/guidance.js +37 -1
  51. package/dist/core/extensions/builtin/claude-sdk-oauth/guidance.js.map +1 -0
  52. package/dist/core/extensions/builtin/claude-sdk-oauth/index.d.ts +4 -0
  53. package/dist/core/extensions/builtin/claude-sdk-oauth/index.d.ts.map +1 -0
  54. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/index.js +12 -10
  55. package/dist/core/extensions/builtin/claude-sdk-oauth/index.js.map +1 -0
  56. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/oauth-login.d.ts +3 -3
  57. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/oauth-login.d.ts.map +1 -1
  58. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/oauth-login.js +2 -2
  59. package/dist/core/extensions/builtin/claude-sdk-oauth/oauth-login.js.map +1 -0
  60. package/dist/core/extensions/builtin/claude-sdk-oauth/options.d.ts +18 -0
  61. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/options.d.ts.map +1 -1
  62. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/options.js +70 -10
  63. package/dist/core/extensions/builtin/claude-sdk-oauth/options.js.map +1 -0
  64. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/prompt-bridge.d.ts.map +1 -1
  65. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/prompt-bridge.js +32 -19
  66. package/dist/core/extensions/builtin/claude-sdk-oauth/prompt-bridge.js.map +1 -0
  67. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/sdk-boundary.d.ts +1 -0
  68. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/sdk-boundary.d.ts.map +1 -1
  69. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/sdk-boundary.js.map +1 -1
  70. package/dist/core/extensions/builtin/claude-sdk-oauth/session-registry-pump.d.ts +30 -0
  71. package/dist/core/extensions/builtin/claude-sdk-oauth/session-registry-pump.d.ts.map +1 -0
  72. package/dist/core/extensions/builtin/claude-sdk-oauth/session-registry-pump.js +197 -0
  73. package/dist/core/extensions/builtin/claude-sdk-oauth/session-registry-pump.js.map +1 -0
  74. package/dist/core/extensions/builtin/claude-sdk-oauth/session-registry-state.d.ts +18 -0
  75. package/dist/core/extensions/builtin/claude-sdk-oauth/session-registry-state.d.ts.map +1 -0
  76. package/dist/core/extensions/builtin/claude-sdk-oauth/session-registry-state.js +33 -0
  77. package/dist/core/extensions/builtin/claude-sdk-oauth/session-registry-state.js.map +1 -0
  78. package/dist/core/extensions/builtin/claude-sdk-oauth/session-registry-wiring.d.ts +3 -0
  79. package/dist/core/extensions/builtin/claude-sdk-oauth/session-registry-wiring.d.ts.map +1 -0
  80. package/dist/core/extensions/builtin/claude-sdk-oauth/session-registry-wiring.js +134 -0
  81. package/dist/core/extensions/builtin/claude-sdk-oauth/session-registry-wiring.js.map +1 -0
  82. package/dist/core/extensions/builtin/claude-sdk-oauth/session-registry.d.ts +85 -0
  83. package/dist/core/extensions/builtin/claude-sdk-oauth/session-registry.d.ts.map +1 -0
  84. package/dist/core/extensions/builtin/claude-sdk-oauth/session-registry.js +270 -0
  85. package/dist/core/extensions/builtin/claude-sdk-oauth/session-registry.js.map +1 -0
  86. package/dist/core/extensions/builtin/claude-sdk-oauth/session-stream.d.ts +17 -0
  87. package/dist/core/extensions/builtin/claude-sdk-oauth/session-stream.d.ts.map +1 -0
  88. package/dist/core/extensions/builtin/claude-sdk-oauth/session-stream.js +217 -0
  89. package/dist/core/extensions/builtin/claude-sdk-oauth/session-stream.js.map +1 -0
  90. package/dist/core/extensions/builtin/claude-sdk-oauth/session-sync.d.ts +49 -0
  91. package/dist/core/extensions/builtin/claude-sdk-oauth/session-sync.d.ts.map +1 -0
  92. package/dist/core/extensions/builtin/claude-sdk-oauth/session-sync.js +204 -0
  93. package/dist/core/extensions/builtin/claude-sdk-oauth/session-sync.js.map +1 -0
  94. package/dist/core/extensions/builtin/claude-sdk-oauth/settings.d.ts +28 -0
  95. package/dist/core/extensions/builtin/claude-sdk-oauth/settings.d.ts.map +1 -0
  96. package/dist/core/extensions/builtin/claude-sdk-oauth/settings.js +107 -0
  97. package/dist/core/extensions/builtin/claude-sdk-oauth/settings.js.map +1 -0
  98. package/dist/core/extensions/builtin/claude-sdk-oauth/stream-guidance.d.ts +2 -0
  99. package/dist/core/extensions/builtin/claude-sdk-oauth/stream-guidance.d.ts.map +1 -0
  100. package/dist/core/extensions/builtin/claude-sdk-oauth/stream-guidance.js +10 -0
  101. package/dist/core/extensions/builtin/claude-sdk-oauth/stream-guidance.js.map +1 -0
  102. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/stream-protocol.d.ts.map +1 -1
  103. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/stream-protocol.js.map +1 -1
  104. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/stream.d.ts +1 -1
  105. package/dist/core/extensions/builtin/claude-sdk-oauth/stream.d.ts.map +1 -0
  106. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/stream.js +72 -53
  107. package/dist/core/extensions/builtin/claude-sdk-oauth/stream.js.map +1 -0
  108. package/dist/core/extensions/builtin/claude-sdk-oauth/system-prompt.d.ts +3 -0
  109. package/dist/core/extensions/builtin/claude-sdk-oauth/system-prompt.d.ts.map +1 -0
  110. package/dist/core/extensions/builtin/claude-sdk-oauth/system-prompt.js +25 -0
  111. package/dist/core/extensions/builtin/claude-sdk-oauth/system-prompt.js.map +1 -0
  112. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/tool-watch.d.ts +1 -1
  113. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/tool-watch.d.ts.map +1 -1
  114. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/tool-watch.js +2 -2
  115. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/tool-watch.js.map +1 -1
  116. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/tools.d.ts.map +1 -1
  117. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/tools.js.map +1 -1
  118. package/dist/core/extensions/builtin/compaction/deterministic-fallback.d.ts +18 -0
  119. package/dist/core/extensions/builtin/compaction/deterministic-fallback.d.ts.map +1 -0
  120. package/dist/core/extensions/builtin/compaction/deterministic-fallback.js +69 -0
  121. package/dist/core/extensions/builtin/compaction/deterministic-fallback.js.map +1 -0
  122. package/dist/core/extensions/builtin/compaction/index.d.ts.map +1 -1
  123. package/dist/core/extensions/builtin/compaction/index.js +28 -2
  124. package/dist/core/extensions/builtin/compaction/index.js.map +1 -1
  125. package/dist/core/extensions/builtin/compaction/speculative.d.ts +4 -1
  126. package/dist/core/extensions/builtin/compaction/speculative.d.ts.map +1 -1
  127. package/dist/core/extensions/builtin/compaction/speculative.js +22 -17
  128. package/dist/core/extensions/builtin/compaction/speculative.js.map +1 -1
  129. package/dist/core/extensions/builtin/compaction/task-intent.d.ts +2 -6
  130. package/dist/core/extensions/builtin/compaction/task-intent.d.ts.map +1 -1
  131. package/dist/core/extensions/builtin/compaction/task-intent.js +10 -9
  132. package/dist/core/extensions/builtin/compaction/task-intent.js.map +1 -1
  133. package/dist/core/extensions/builtin/goal/continuation-recovery.d.ts +6 -0
  134. package/dist/core/extensions/builtin/goal/continuation-recovery.d.ts.map +1 -0
  135. package/dist/core/extensions/builtin/goal/continuation-recovery.js +20 -0
  136. package/dist/core/extensions/builtin/goal/continuation-recovery.js.map +1 -0
  137. package/dist/core/extensions/builtin/goal/continuation.d.ts +2 -4
  138. package/dist/core/extensions/builtin/goal/continuation.d.ts.map +1 -1
  139. package/dist/core/extensions/builtin/goal/continuation.js +2 -8
  140. package/dist/core/extensions/builtin/goal/continuation.js.map +1 -1
  141. package/dist/core/extensions/builtin/goal/direct-input-lifecycle.d.ts +19 -0
  142. package/dist/core/extensions/builtin/goal/direct-input-lifecycle.d.ts.map +1 -0
  143. package/dist/core/extensions/builtin/goal/direct-input-lifecycle.js +48 -0
  144. package/dist/core/extensions/builtin/goal/direct-input-lifecycle.js.map +1 -0
  145. package/dist/core/extensions/builtin/goal/index.d.ts.map +1 -1
  146. package/dist/core/extensions/builtin/goal/index.js +17 -15
  147. package/dist/core/extensions/builtin/goal/index.js.map +1 -1
  148. package/dist/core/extensions/builtin/goal/lifecycle-helpers.d.ts.map +1 -1
  149. package/dist/core/extensions/builtin/goal/lifecycle-helpers.js +12 -10
  150. package/dist/core/extensions/builtin/goal/lifecycle-helpers.js.map +1 -1
  151. package/dist/core/extensions/builtin/goal/monitor-continuation.d.ts +5 -1
  152. package/dist/core/extensions/builtin/goal/monitor-continuation.d.ts.map +1 -1
  153. package/dist/core/extensions/builtin/goal/monitor-continuation.js +94 -52
  154. package/dist/core/extensions/builtin/goal/monitor-continuation.js.map +1 -1
  155. package/dist/core/extensions/builtin/goal/persistence.d.ts +16 -0
  156. package/dist/core/extensions/builtin/goal/persistence.d.ts.map +1 -1
  157. package/dist/core/extensions/builtin/goal/persistence.js +185 -11
  158. package/dist/core/extensions/builtin/goal/persistence.js.map +1 -1
  159. package/dist/core/extensions/builtin/goal/ui.d.ts +1 -0
  160. package/dist/core/extensions/builtin/goal/ui.d.ts.map +1 -1
  161. package/dist/core/extensions/builtin/goal/ui.js +11 -2
  162. package/dist/core/extensions/builtin/goal/ui.js.map +1 -1
  163. package/dist/core/extensions/builtin/gpt-apply-patch/extension.d.ts.map +1 -1
  164. package/dist/core/extensions/builtin/gpt-apply-patch/extension.js +15 -0
  165. package/dist/core/extensions/builtin/gpt-apply-patch/extension.js.map +1 -1
  166. package/dist/core/extensions/builtin/gpt-apply-patch/tool.d.ts.map +1 -1
  167. package/dist/core/extensions/builtin/gpt-apply-patch/tool.js +30 -3
  168. package/dist/core/extensions/builtin/gpt-apply-patch/tool.js.map +1 -1
  169. package/dist/core/extensions/builtin/index.d.ts.map +1 -1
  170. package/dist/core/extensions/builtin/index.js +5 -2
  171. package/dist/core/extensions/builtin/index.js.map +1 -1
  172. package/dist/core/extensions/builtin/loop-guard/detectors.d.ts +31 -0
  173. package/dist/core/extensions/builtin/loop-guard/detectors.d.ts.map +1 -0
  174. package/dist/core/extensions/builtin/loop-guard/detectors.js +111 -0
  175. package/dist/core/extensions/builtin/loop-guard/detectors.js.map +1 -0
  176. package/dist/core/extensions/builtin/loop-guard/index.d.ts +3 -0
  177. package/dist/core/extensions/builtin/loop-guard/index.d.ts.map +1 -0
  178. package/dist/core/extensions/builtin/loop-guard/index.js +31 -0
  179. package/dist/core/extensions/builtin/loop-guard/index.js.map +1 -0
  180. package/dist/core/extensions/builtin/loop-guard/notice.d.ts +5 -0
  181. package/dist/core/extensions/builtin/loop-guard/notice.d.ts.map +1 -0
  182. package/dist/core/extensions/builtin/loop-guard/notice.js +42 -0
  183. package/dist/core/extensions/builtin/loop-guard/notice.js.map +1 -0
  184. package/dist/core/extensions/builtin/loop-guard/policy.d.ts +30 -0
  185. package/dist/core/extensions/builtin/loop-guard/policy.d.ts.map +1 -0
  186. package/dist/core/extensions/builtin/loop-guard/policy.js +30 -0
  187. package/dist/core/extensions/builtin/loop-guard/policy.js.map +1 -0
  188. package/dist/core/extensions/builtin/loop-guard/renderer.d.ts +4 -0
  189. package/dist/core/extensions/builtin/loop-guard/renderer.d.ts.map +1 -0
  190. package/dist/core/extensions/builtin/loop-guard/renderer.js +50 -0
  191. package/dist/core/extensions/builtin/loop-guard/renderer.js.map +1 -0
  192. package/dist/core/extensions/builtin/loop-guard/similarity.d.ts +13 -0
  193. package/dist/core/extensions/builtin/loop-guard/similarity.d.ts.map +1 -0
  194. package/dist/core/extensions/builtin/loop-guard/similarity.js +51 -0
  195. package/dist/core/extensions/builtin/loop-guard/similarity.js.map +1 -0
  196. package/dist/core/extensions/builtin/loop-guard/tracker.d.ts +13 -0
  197. package/dist/core/extensions/builtin/loop-guard/tracker.d.ts.map +1 -0
  198. package/dist/core/extensions/builtin/loop-guard/tracker.js +39 -0
  199. package/dist/core/extensions/builtin/loop-guard/tracker.js.map +1 -0
  200. package/dist/core/extensions/builtin/monitor-state-event.d.ts +10 -0
  201. package/dist/core/extensions/builtin/monitor-state-event.d.ts.map +1 -1
  202. package/dist/core/extensions/builtin/monitor-state-event.js.map +1 -1
  203. package/dist/core/extensions/builtin/prompt-preset/deepseek-v4-flash-0731.d.ts +3 -0
  204. package/dist/core/extensions/builtin/prompt-preset/deepseek-v4-flash-0731.d.ts.map +1 -0
  205. package/dist/core/extensions/builtin/prompt-preset/deepseek-v4-flash-0731.js +10 -0
  206. package/dist/core/extensions/builtin/prompt-preset/deepseek-v4-flash-0731.js.map +1 -0
  207. package/dist/core/extensions/builtin/prompt-preset/deepseek-v4-flash.d.ts +3 -0
  208. package/dist/core/extensions/builtin/prompt-preset/deepseek-v4-flash.d.ts.map +1 -0
  209. package/dist/core/extensions/builtin/prompt-preset/deepseek-v4-flash.js +10 -0
  210. package/dist/core/extensions/builtin/prompt-preset/deepseek-v4-flash.js.map +1 -0
  211. package/dist/core/extensions/builtin/prompt-preset/deepseek-v4-pro.d.ts +3 -0
  212. package/dist/core/extensions/builtin/prompt-preset/deepseek-v4-pro.d.ts.map +1 -0
  213. package/dist/core/extensions/builtin/prompt-preset/deepseek-v4-pro.js +11 -0
  214. package/dist/core/extensions/builtin/prompt-preset/deepseek-v4-pro.js.map +1 -0
  215. package/dist/core/extensions/builtin/prompt-preset/deepseek-v4.d.ts +13 -0
  216. package/dist/core/extensions/builtin/prompt-preset/deepseek-v4.d.ts.map +1 -0
  217. package/dist/core/extensions/builtin/prompt-preset/deepseek-v4.js +60 -0
  218. package/dist/core/extensions/builtin/prompt-preset/deepseek-v4.js.map +1 -0
  219. package/dist/core/extensions/builtin/prompt-preset/index.d.ts.map +1 -1
  220. package/dist/core/extensions/builtin/prompt-preset/index.js +8 -4
  221. package/dist/core/extensions/builtin/prompt-preset/index.js.map +1 -1
  222. package/dist/core/extensions/builtin/prompt-preset/presets.d.ts.map +1 -1
  223. package/dist/core/extensions/builtin/prompt-preset/presets.js +42 -0
  224. package/dist/core/extensions/builtin/prompt-preset/presets.js.map +1 -1
  225. package/dist/core/extensions/builtin/prompt-preset/settings.d.ts +1 -1
  226. package/dist/core/extensions/builtin/prompt-preset/settings.d.ts.map +1 -1
  227. package/dist/core/extensions/builtin/prompt-preset/settings.js +3 -0
  228. package/dist/core/extensions/builtin/prompt-preset/settings.js.map +1 -1
  229. package/dist/core/extensions/builtin/recommended-models/index.d.ts.map +1 -1
  230. package/dist/core/extensions/builtin/recommended-models/index.js +2 -1
  231. package/dist/core/extensions/builtin/recommended-models/index.js.map +1 -1
  232. package/dist/core/extensions/builtin/rules/index.js +4 -3
  233. package/dist/core/extensions/builtin/rules/index.js.map +1 -1
  234. package/dist/core/extensions/builtin/rules/rules/constants.d.ts +11 -0
  235. package/dist/core/extensions/builtin/rules/rules/constants.d.ts.map +1 -1
  236. package/dist/core/extensions/builtin/rules/rules/constants.js +11 -0
  237. package/dist/core/extensions/builtin/rules/rules/constants.js.map +1 -1
  238. package/dist/core/extensions/builtin/rules/rules/formatter.d.ts.map +1 -1
  239. package/dist/core/extensions/builtin/rules/rules/formatter.js +15 -1
  240. package/dist/core/extensions/builtin/rules/rules/formatter.js.map +1 -1
  241. package/dist/core/extensions/builtin/service-tier.d.ts.map +1 -1
  242. package/dist/core/extensions/builtin/service-tier.js +23 -21
  243. package/dist/core/extensions/builtin/service-tier.js.map +1 -1
  244. package/dist/core/extensions/builtin/terminal/extension.d.ts.map +1 -1
  245. package/dist/core/extensions/builtin/terminal/extension.js +21 -7
  246. package/dist/core/extensions/builtin/terminal/extension.js.map +1 -1
  247. package/dist/core/extensions/builtin/terminal/monitor-notify.d.ts.map +1 -1
  248. package/dist/core/extensions/builtin/terminal/monitor-notify.js +42 -5
  249. package/dist/core/extensions/builtin/terminal/monitor-notify.js.map +1 -1
  250. package/dist/core/extensions/builtin/terminal/monitor-registry.d.ts +2 -0
  251. package/dist/core/extensions/builtin/terminal/monitor-registry.d.ts.map +1 -1
  252. package/dist/core/extensions/builtin/terminal/monitor-registry.js +2 -0
  253. package/dist/core/extensions/builtin/terminal/monitor-registry.js.map +1 -1
  254. package/dist/core/extensions/builtin/terminal/monitor-status-ticker.d.ts +37 -0
  255. package/dist/core/extensions/builtin/terminal/monitor-status-ticker.d.ts.map +1 -0
  256. package/dist/core/extensions/builtin/terminal/monitor-status-ticker.js +61 -0
  257. package/dist/core/extensions/builtin/terminal/monitor-status-ticker.js.map +1 -0
  258. package/dist/core/extensions/builtin/terminal/monitor-status.d.ts +9 -1
  259. package/dist/core/extensions/builtin/terminal/monitor-status.d.ts.map +1 -1
  260. package/dist/core/extensions/builtin/terminal/monitor-status.js +35 -2
  261. package/dist/core/extensions/builtin/terminal/monitor-status.js.map +1 -1
  262. package/dist/core/extensions/builtin/terminal/tools/monitor.js +1 -1
  263. package/dist/core/extensions/builtin/terminal/tools/monitor.js.map +1 -1
  264. package/dist/core/extensions/builtin/todotools/commands.d.ts +2 -2
  265. package/dist/core/extensions/builtin/todotools/commands.d.ts.map +1 -1
  266. package/dist/core/extensions/builtin/todotools/commands.js.map +1 -1
  267. package/dist/core/extensions/builtin/todotools/index.d.ts.map +1 -1
  268. package/dist/core/extensions/builtin/todotools/index.js +6 -3
  269. package/dist/core/extensions/builtin/todotools/index.js.map +1 -1
  270. package/dist/core/extensions/builtin/todotools/state.d.ts +1 -1
  271. package/dist/core/extensions/builtin/todotools/state.d.ts.map +1 -1
  272. package/dist/core/extensions/builtin/todotools/state.js +1 -1
  273. package/dist/core/extensions/builtin/todotools/state.js.map +1 -1
  274. package/dist/core/extensions/builtin/todotools/todo-widget-component.d.ts +19 -0
  275. package/dist/core/extensions/builtin/todotools/todo-widget-component.d.ts.map +1 -0
  276. package/dist/core/extensions/builtin/todotools/todo-widget-component.js +78 -0
  277. package/dist/core/extensions/builtin/todotools/todo-widget-component.js.map +1 -0
  278. package/dist/core/extensions/builtin/todotools/todo-widget.d.ts +13 -1
  279. package/dist/core/extensions/builtin/todotools/todo-widget.d.ts.map +1 -1
  280. package/dist/core/extensions/builtin/todotools/todo-widget.js +32 -14
  281. package/dist/core/extensions/builtin/todotools/todo-widget.js.map +1 -1
  282. package/dist/core/extensions/builtin/todotools/tools/todo.d.ts +2 -2
  283. package/dist/core/extensions/builtin/todotools/tools/todo.d.ts.map +1 -1
  284. package/dist/core/extensions/builtin/todotools/tools/todo.js +1 -1
  285. package/dist/core/extensions/builtin/todotools/tools/todo.js.map +1 -1
  286. package/dist/core/extensions/builtin/tool-pair-guard/sanitize-anthropic-payload.d.ts +1 -1
  287. package/dist/core/extensions/builtin/tool-pair-guard/sanitize-anthropic-payload.d.ts.map +1 -1
  288. package/dist/core/extensions/builtin/tool-pair-guard/sanitize-anthropic-payload.js +88 -29
  289. package/dist/core/extensions/builtin/tool-pair-guard/sanitize-anthropic-payload.js.map +1 -1
  290. package/dist/core/extensions/builtin/tps.d.ts.map +1 -1
  291. package/dist/core/extensions/builtin/tps.js +5 -2
  292. package/dist/core/extensions/builtin/tps.js.map +1 -1
  293. package/dist/core/extensions/builtin/ttsr/builtin-rules.d.ts +4 -0
  294. package/dist/core/extensions/builtin/ttsr/builtin-rules.d.ts.map +1 -0
  295. package/dist/core/extensions/builtin/ttsr/builtin-rules.js +20 -0
  296. package/dist/core/extensions/builtin/ttsr/builtin-rules.js.map +1 -0
  297. package/dist/core/extensions/builtin/ttsr/commands.js +9 -1
  298. package/dist/core/extensions/builtin/ttsr/commands.js.map +1 -1
  299. package/dist/core/extensions/builtin/ttsr/index.d.ts.map +1 -1
  300. package/dist/core/extensions/builtin/ttsr/index.js +4 -3
  301. package/dist/core/extensions/builtin/ttsr/index.js.map +1 -1
  302. package/dist/core/extensions/builtin/ttsr/manager.js +1 -1
  303. package/dist/core/extensions/builtin/ttsr/manager.js.map +1 -1
  304. package/dist/core/extensions/builtin/websearch/websearch/config.d.ts.map +1 -1
  305. package/dist/core/extensions/builtin/websearch/websearch/config.js +1 -0
  306. package/dist/core/extensions/builtin/websearch/websearch/config.js.map +1 -1
  307. package/dist/core/extensions/builtin/websearch/websearch/native.d.ts.map +1 -1
  308. package/dist/core/extensions/builtin/websearch/websearch/native.js +16 -5
  309. package/dist/core/extensions/builtin/websearch/websearch/native.js.map +1 -1
  310. package/dist/core/extensions/builtin/websearch/websearch/provider-endpoints.d.ts.map +1 -1
  311. package/dist/core/extensions/builtin/websearch/websearch/provider-endpoints.js +1 -0
  312. package/dist/core/extensions/builtin/websearch/websearch/provider-endpoints.js.map +1 -1
  313. package/dist/core/extensions/builtin/websearch/websearch/providers/anthropic.d.ts +4 -1
  314. package/dist/core/extensions/builtin/websearch/websearch/providers/anthropic.d.ts.map +1 -1
  315. package/dist/core/extensions/builtin/websearch/websearch/providers/anthropic.js +44 -37
  316. package/dist/core/extensions/builtin/websearch/websearch/providers/anthropic.js.map +1 -1
  317. package/dist/core/extensions/builtin/websearch/websearch/providers/deepseek.d.ts +3 -0
  318. package/dist/core/extensions/builtin/websearch/websearch/providers/deepseek.d.ts.map +1 -0
  319. package/dist/core/extensions/builtin/websearch/websearch/providers/deepseek.js +12 -0
  320. package/dist/core/extensions/builtin/websearch/websearch/providers/deepseek.js.map +1 -0
  321. package/dist/core/extensions/builtin/websearch/websearch/providers.d.ts.map +1 -1
  322. package/dist/core/extensions/builtin/websearch/websearch/providers.js +2 -0
  323. package/dist/core/extensions/builtin/websearch/websearch/providers.js.map +1 -1
  324. package/dist/core/extensions/builtin/websearch/websearch/renderers.d.ts.map +1 -1
  325. package/dist/core/extensions/builtin/websearch/websearch/renderers.js +3 -3
  326. package/dist/core/extensions/builtin/websearch/websearch/renderers.js.map +1 -1
  327. package/dist/core/extensions/builtin/websearch/websearch/search.d.ts.map +1 -1
  328. package/dist/core/extensions/builtin/websearch/websearch/search.js +1 -3
  329. package/dist/core/extensions/builtin/websearch/websearch/search.js.map +1 -1
  330. package/dist/core/extensions/builtin/websearch/websearch/tool.js +2 -2
  331. package/dist/core/extensions/builtin/websearch/websearch/tool.js.map +1 -1
  332. package/dist/core/extensions/builtin/websearch/websearch/types.d.ts +1 -1
  333. package/dist/core/extensions/builtin/websearch/websearch/types.d.ts.map +1 -1
  334. package/dist/core/extensions/builtin/websearch/websearch/types.js.map +1 -1
  335. package/dist/core/extensions/index.d.ts +1 -1
  336. package/dist/core/extensions/index.d.ts.map +1 -1
  337. package/dist/core/extensions/index.js.map +1 -1
  338. package/dist/core/extensions/loader.d.ts.map +1 -1
  339. package/dist/core/extensions/loader.js +5 -0
  340. package/dist/core/extensions/loader.js.map +1 -1
  341. package/dist/core/extensions/runner.d.ts +1 -1
  342. package/dist/core/extensions/runner.d.ts.map +1 -1
  343. package/dist/core/extensions/runner.js +3 -1
  344. package/dist/core/extensions/runner.js.map +1 -1
  345. package/dist/core/extensions/types.d.ts +22 -1
  346. package/dist/core/extensions/types.d.ts.map +1 -1
  347. package/dist/core/extensions/types.js.map +1 -1
  348. package/dist/core/model-resolver.js +2 -2
  349. package/dist/core/model-resolver.js.map +1 -1
  350. package/dist/core/thinking-levels.d.ts +5 -0
  351. package/dist/core/thinking-levels.d.ts.map +1 -1
  352. package/dist/core/thinking-levels.js +9 -39
  353. package/dist/core/thinking-levels.js.map +1 -1
  354. package/dist/index.d.ts +1 -1
  355. package/dist/index.d.ts.map +1 -1
  356. package/dist/index.js.map +1 -1
  357. package/dist/modes/app-server/server/account.d.ts +1 -1
  358. package/dist/modes/app-server/server/account.js +1 -1
  359. package/dist/modes/app-server/server/account.js.map +1 -1
  360. package/dist/modes/app-server/server/server-core.js +1 -1
  361. package/dist/modes/app-server/server/server-core.js.map +1 -1
  362. package/dist/modes/interactive/compaction-queue-transfer.d.ts +2 -0
  363. package/dist/modes/interactive/compaction-queue-transfer.d.ts.map +1 -1
  364. package/dist/modes/interactive/compaction-queue-transfer.js.map +1 -1
  365. package/dist/modes/interactive/components/footer.d.ts.map +1 -1
  366. package/dist/modes/interactive/components/footer.js +9 -5
  367. package/dist/modes/interactive/components/footer.js.map +1 -1
  368. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  369. package/dist/modes/interactive/interactive-mode.js +38 -12
  370. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  371. package/dist/modes/interactive/risky-main-model-warning.d.ts +1 -1
  372. package/dist/modes/interactive/risky-main-model-warning.d.ts.map +1 -1
  373. package/dist/modes/interactive/risky-main-model-warning.js +1 -1
  374. package/dist/modes/interactive/risky-main-model-warning.js.map +1 -1
  375. package/dist/modes/rpc/connection-handler.js +3 -3
  376. package/dist/modes/rpc/connection-handler.js.map +1 -1
  377. package/docs/extensions.md +10 -0
  378. package/docs/providers.md +21 -5
  379. package/docs/release-guide.md +2 -2
  380. package/docs/settings.md +1 -1
  381. package/examples/extensions/overlay-test.ts +1 -1
  382. package/node_modules/@code-yeongyu/senpi-codemode/CHANGELOG.md +33 -0
  383. package/node_modules/@code-yeongyu/senpi-codemode/README.md +6 -3
  384. package/node_modules/@code-yeongyu/senpi-codemode/package.json +3 -3
  385. package/node_modules/@code-yeongyu/senpi-codemode/src/extension/eval-status-ticker.ts +79 -0
  386. package/node_modules/@code-yeongyu/senpi-codemode/src/extension/eval-status.ts +36 -3
  387. package/node_modules/@code-yeongyu/senpi-codemode/src/index.ts +26 -12
  388. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/cell-execution.ts +146 -0
  389. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/cell-handler.ts +21 -119
  390. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/cell-runtime.ts +157 -0
  391. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/detached-cell-manager.ts +62 -208
  392. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/detached-cell-notification.ts +98 -0
  393. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/detached-cell-snapshot.ts +81 -0
  394. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/detached-cell-state.ts +24 -0
  395. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/detached-eval-result.ts +140 -0
  396. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/detached-notification-queue.ts +53 -0
  397. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/eval-request.ts +45 -0
  398. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/eval-tool-options.ts +45 -0
  399. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/eval-tool.ts +20 -342
  400. package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.d.ts.map +1 -1
  401. package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.js +1 -0
  402. package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.js.map +1 -1
  403. package/node_modules/@earendil-works/pi-agent-core/package.json +2 -2
  404. package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.d.ts.map +1 -1
  405. package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.js +10 -15
  406. package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.js.map +1 -1
  407. package/node_modules/@earendil-works/pi-ai/dist/api/azure-openai-responses.js +2 -2
  408. package/node_modules/@earendil-works/pi-ai/dist/api/azure-openai-responses.js.map +1 -1
  409. package/node_modules/@earendil-works/pi-ai/dist/api/openai-codex-responses/fallback-state.d.ts +24 -0
  410. package/node_modules/@earendil-works/pi-ai/dist/api/openai-codex-responses/fallback-state.d.ts.map +1 -0
  411. package/node_modules/@earendil-works/pi-ai/dist/api/openai-codex-responses/fallback-state.js +70 -0
  412. package/node_modules/@earendil-works/pi-ai/dist/api/openai-codex-responses/fallback-state.js.map +1 -0
  413. package/node_modules/@earendil-works/pi-ai/dist/api/openai-codex-responses.d.ts +2 -16
  414. package/node_modules/@earendil-works/pi-ai/dist/api/openai-codex-responses.d.ts.map +1 -1
  415. package/node_modules/@earendil-works/pi-ai/dist/api/openai-codex-responses.js +10 -58
  416. package/node_modules/@earendil-works/pi-ai/dist/api/openai-codex-responses.js.map +1 -1
  417. package/node_modules/@earendil-works/pi-ai/dist/api/openai-completions.js +2 -2
  418. package/node_modules/@earendil-works/pi-ai/dist/api/openai-completions.js.map +1 -1
  419. package/node_modules/@earendil-works/pi-ai/dist/api/openai-prompt-cache.d.ts +1 -0
  420. package/node_modules/@earendil-works/pi-ai/dist/api/openai-prompt-cache.d.ts.map +1 -1
  421. package/node_modules/@earendil-works/pi-ai/dist/api/openai-prompt-cache.js +7 -0
  422. package/node_modules/@earendil-works/pi-ai/dist/api/openai-prompt-cache.js.map +1 -1
  423. package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses.js +2 -2
  424. package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses.js.map +1 -1
  425. package/node_modules/@earendil-works/pi-ai/dist/model.d.ts +2 -1
  426. package/node_modules/@earendil-works/pi-ai/dist/model.d.ts.map +1 -1
  427. package/node_modules/@earendil-works/pi-ai/dist/model.js.map +1 -1
  428. package/node_modules/@earendil-works/pi-ai/dist/models.d.ts +14 -0
  429. package/node_modules/@earendil-works/pi-ai/dist/models.d.ts.map +1 -1
  430. package/node_modules/@earendil-works/pi-ai/dist/models.js +95 -19
  431. package/node_modules/@earendil-works/pi-ai/dist/models.js.map +1 -1
  432. package/node_modules/@earendil-works/pi-ai/dist/providers/data/.manifest.json +1 -1
  433. package/node_modules/@earendil-works/pi-ai/dist/providers/data/amazon-bedrock.json +1 -1
  434. package/node_modules/@earendil-works/pi-ai/dist/providers/data/azure-openai-responses.json +1 -1
  435. package/node_modules/@earendil-works/pi-ai/dist/providers/data/openai.json +1 -1
  436. package/node_modules/@earendil-works/pi-ai/dist/providers/data/opencode-go.json +1 -1
  437. package/node_modules/@earendil-works/pi-ai/dist/providers/data/opencode.json +1 -1
  438. package/node_modules/@earendil-works/pi-ai/dist/providers/data/openrouter.json +1 -1
  439. package/node_modules/@earendil-works/pi-ai/dist/providers/data/vercel-ai-gateway.json +1 -1
  440. package/node_modules/@earendil-works/pi-ai/dist/providers/data/zai-coding-cn.json +1 -1
  441. package/node_modules/@earendil-works/pi-ai/dist/providers/data/zai.json +1 -1
  442. package/node_modules/@earendil-works/pi-ai/dist/types.d.ts +5 -0
  443. package/node_modules/@earendil-works/pi-ai/dist/types.d.ts.map +1 -1
  444. package/node_modules/@earendil-works/pi-ai/dist/types.js.map +1 -1
  445. package/node_modules/@earendil-works/pi-ai/dist/utils/unavailable-tool-text.d.ts +3 -0
  446. package/node_modules/@earendil-works/pi-ai/dist/utils/unavailable-tool-text.d.ts.map +1 -0
  447. package/node_modules/@earendil-works/pi-ai/dist/utils/unavailable-tool-text.js +36 -0
  448. package/node_modules/@earendil-works/pi-ai/dist/utils/unavailable-tool-text.js.map +1 -0
  449. package/node_modules/@earendil-works/pi-ai/package.json +1 -1
  450. package/node_modules/@earendil-works/pi-pty/package.json +1 -1
  451. package/node_modules/@earendil-works/pi-tui/dist/mux.js +1 -1
  452. package/node_modules/@earendil-works/pi-tui/dist/mux.js.map +1 -1
  453. package/node_modules/@earendil-works/pi-tui/dist/tui.d.ts +1 -0
  454. package/node_modules/@earendil-works/pi-tui/dist/tui.d.ts.map +1 -1
  455. package/node_modules/@earendil-works/pi-tui/dist/tui.js +17 -3
  456. package/node_modules/@earendil-works/pi-tui/dist/tui.js.map +1 -1
  457. package/node_modules/@earendil-works/pi-tui/package.json +1 -1
  458. package/package.json +6 -6
  459. package/dist/core/extensions/builtin/claude-agent-sdk/auth-lane.d.ts.map +0 -1
  460. package/dist/core/extensions/builtin/claude-agent-sdk/auth-lane.js.map +0 -1
  461. package/dist/core/extensions/builtin/claude-agent-sdk/guidance.d.ts +0 -6
  462. package/dist/core/extensions/builtin/claude-agent-sdk/guidance.d.ts.map +0 -1
  463. package/dist/core/extensions/builtin/claude-agent-sdk/guidance.js.map +0 -1
  464. package/dist/core/extensions/builtin/claude-agent-sdk/index.d.ts +0 -4
  465. package/dist/core/extensions/builtin/claude-agent-sdk/index.d.ts.map +0 -1
  466. package/dist/core/extensions/builtin/claude-agent-sdk/index.js.map +0 -1
  467. package/dist/core/extensions/builtin/claude-agent-sdk/oauth-login.js.map +0 -1
  468. package/dist/core/extensions/builtin/claude-agent-sdk/options.d.ts +0 -16
  469. package/dist/core/extensions/builtin/claude-agent-sdk/options.js.map +0 -1
  470. package/dist/core/extensions/builtin/claude-agent-sdk/prompt-bridge.js.map +0 -1
  471. package/dist/core/extensions/builtin/claude-agent-sdk/settings.d.ts +0 -15
  472. package/dist/core/extensions/builtin/claude-agent-sdk/settings.d.ts.map +0 -1
  473. package/dist/core/extensions/builtin/claude-agent-sdk/settings.js +0 -41
  474. package/dist/core/extensions/builtin/claude-agent-sdk/settings.js.map +0 -1
  475. package/dist/core/extensions/builtin/claude-agent-sdk/stream.d.ts.map +0 -1
  476. package/dist/core/extensions/builtin/claude-agent-sdk/stream.js.map +0 -1
  477. /package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/account-events.d.ts +0 -0
  478. /package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/account-events.js +0 -0
  479. /package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/custom-tools-schema.d.ts +0 -0
  480. /package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/custom-tools-schema.js +0 -0
  481. /package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/custom-tools.d.ts +0 -0
  482. /package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/custom-tools.js +0 -0
  483. /package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/executable.d.ts +0 -0
  484. /package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/executable.js +0 -0
  485. /package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/failover.d.ts +0 -0
  486. /package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/prompt-bridge.d.ts +0 -0
  487. /package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/sdk-boundary.js +0 -0
  488. /package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/stream-protocol.d.ts +0 -0
  489. /package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/stream-protocol.js +0 -0
  490. /package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/tools.d.ts +0 -0
  491. /package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/tools.js +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"todo-widget.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/todotools/todo-widget.ts"],"names":[],"mappings":"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","sourcesContent":["// Ported and adapted from oh-my-pi's todo tool (MIT License).\n// Copyright (c) 2025 Mario Zechner\n// Copyright (c) 2025-2026 Can Bölük\n// https://github.com/can1357/oh-my-pi\n\nimport { getTodoMarker, sanitizeTodoText } from \"./todo-format.ts\";\nimport { nextActionableTask } from \"./todo-query.ts\";\nimport type { TodoItem, TodoPhase } from \"./todo-types.ts\";\n\nconst TODO_WIDGET_MAX_LINES = 10;\nconst TODO_WIDGET_HEADER_LINES = 2;\nconst TODO_WIDGET_RECENT_TASKS = 2;\n\nfunction getActivePhase(phases: readonly TodoPhase[]): TodoPhase | undefined {\n\tconst activeTask = nextActionableTask(phases);\n\tif (!activeTask) return undefined;\n\treturn phases.find((phase) => phase.tasks.includes(activeTask));\n}\n\nfunction formatOmittedTasks(count: number, direction: \"earlier\" | \"later\"): string {\n\treturn `... (${count} ${direction} task${count === 1 ? \"\" : \"s\"})`;\n}\n\nfunction formatTask(todo: TodoItem): string {\n\treturn `${getTodoMarker(todo.status)} ${sanitizeTodoText(todo.content)}`;\n}\n\nexport function getTodoWidgetLines(phases: readonly TodoPhase[]): string[] | undefined {\n\tconst activePhase = getActivePhase(phases);\n\tif (!activePhase) return undefined;\n\tconst header = [\"Todo\", sanitizeTodoText(activePhase.name)];\n\tconst taskLines = activePhase.tasks.map(formatTask);\n\tif (header.length + taskLines.length <= TODO_WIDGET_MAX_LINES) return [...header, ...taskLines];\n\n\tconst activeTask = nextActionableTask([activePhase]);\n\tif (!activeTask) return undefined;\n\tconst activeIndex = activePhase.tasks.indexOf(activeTask);\n\tconst firstVisibleTask = Math.max(0, activeIndex - TODO_WIDGET_RECENT_TASKS);\n\tconst earlierOmitted = firstVisibleTask;\n\tconst bodyBudget = TODO_WIDGET_MAX_LINES - TODO_WIDGET_HEADER_LINES;\n\tconst recentAndActive = taskLines.slice(firstVisibleTask, activeIndex + 1);\n\tconst earlierMarkerRows = earlierOmitted > 0 ? 1 : 0;\n\tconst pendingAfterActive = activePhase.tasks.slice(activeIndex + 1).filter((todo) => todo.status === \"pending\");\n\tconst upcomingBudget = bodyBudget - recentAndActive.length - earlierMarkerRows;\n\tconst visibleUpcomingCount =\n\t\tpendingAfterActive.length > upcomingBudget ? Math.max(0, upcomingBudget - 1) : pendingAfterActive.length;\n\tconst laterOmitted = pendingAfterActive.length - visibleUpcomingCount;\n\n\treturn [\n\t\t\"Todo\",\n\t\tsanitizeTodoText(activePhase.name),\n\t\t...(earlierOmitted > 0 ? [formatOmittedTasks(earlierOmitted, \"earlier\")] : []),\n\t\t...recentAndActive,\n\t\t...pendingAfterActive.slice(0, visibleUpcomingCount).map(formatTask),\n\t\t...(laterOmitted > 0 ? [formatOmittedTasks(laterOmitted, \"later\")] : []),\n\t];\n}\n"]}
1
+ {"version":3,"file":"todo-widget.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/todotools/todo-widget.ts"],"names":[],"mappings":"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","sourcesContent":["// Ported and adapted from oh-my-pi's todo tool (MIT License).\n// Copyright (c) 2025 Mario Zechner\n// Copyright (c) 2025-2026 Can Bölük\n// https://github.com/can1357/oh-my-pi\n\nimport { getTodoMarker, sanitizeTodoText } from \"./todo-format.ts\";\nimport { nextActionableTask } from \"./todo-query.ts\";\nimport type { TodoItem, TodoPhase } from \"./todo-types.ts\";\n\nconst TODO_WIDGET_MAX_LINES = 10;\nconst TODO_WIDGET_HEADER_LINES = 2;\nconst TODO_WIDGET_RECENT_TASKS = 2;\n\nexport type TodoWidgetRow =\n\t| {\n\t\t\treadonly kind: \"label\";\n\t\t\treadonly text: string;\n\t }\n\t| {\n\t\t\treadonly kind: \"task\";\n\t\t\treadonly task: TodoItem;\n\t };\n\nexport type TodoWidgetModel = {\n\treadonly phaseName: string;\n\treadonly rows: readonly TodoWidgetRow[];\n};\n\nfunction getActivePhase(phases: readonly TodoPhase[]): TodoPhase | undefined {\n\tconst activeTask = nextActionableTask(phases);\n\tif (!activeTask) return undefined;\n\treturn phases.find((phase) => phase.tasks.includes(activeTask));\n}\n\nfunction formatOmittedTasks(count: number, direction: \"earlier\" | \"later\"): string {\n\treturn `... (${count} ${direction} task${count === 1 ? \"\" : \"s\"})`;\n}\n\nfunction formatTask(todo: TodoItem): string {\n\treturn `${getTodoMarker(todo.status)} ${sanitizeTodoText(todo.content)}`;\n}\n\nfunction label(text: string): TodoWidgetRow {\n\treturn { kind: \"label\", text };\n}\n\nfunction taskRow(task: TodoItem): TodoWidgetRow {\n\treturn { kind: \"task\", task };\n}\n\nexport function getTodoWidgetModel(phases: readonly TodoPhase[]): TodoWidgetModel | undefined {\n\tconst activePhase = getActivePhase(phases);\n\tif (!activePhase) return undefined;\n\tconst header = [label(\"Todo\"), label(sanitizeTodoText(activePhase.name))];\n\tconst taskRows = activePhase.tasks.map(taskRow);\n\tif (header.length + taskRows.length <= TODO_WIDGET_MAX_LINES) {\n\t\treturn {\n\t\t\tphaseName: activePhase.name,\n\t\t\trows: [...header, ...taskRows],\n\t\t};\n\t}\n\n\tconst activeTask = nextActionableTask([activePhase]);\n\tif (!activeTask) return undefined;\n\tconst activeIndex = activePhase.tasks.indexOf(activeTask);\n\tconst firstVisibleTask = Math.max(0, activeIndex - TODO_WIDGET_RECENT_TASKS);\n\tconst earlierOmitted = firstVisibleTask;\n\tconst bodyBudget = TODO_WIDGET_MAX_LINES - TODO_WIDGET_HEADER_LINES;\n\tconst recentAndActive = activePhase.tasks.slice(firstVisibleTask, activeIndex + 1).map(taskRow);\n\tconst earlierMarkerRows = earlierOmitted > 0 ? 1 : 0;\n\tconst pendingAfterActive = activePhase.tasks.slice(activeIndex + 1).filter((todo) => todo.status === \"pending\");\n\tconst upcomingBudget = bodyBudget - recentAndActive.length - earlierMarkerRows;\n\tconst visibleUpcomingCount =\n\t\tpendingAfterActive.length > upcomingBudget ? Math.max(0, upcomingBudget - 1) : pendingAfterActive.length;\n\tconst laterOmitted = pendingAfterActive.length - visibleUpcomingCount;\n\n\treturn {\n\t\tphaseName: activePhase.name,\n\t\trows: [\n\t\t\t...header,\n\t\t\t...(earlierOmitted > 0 ? [label(formatOmittedTasks(earlierOmitted, \"earlier\"))] : []),\n\t\t\t...recentAndActive,\n\t\t\t...pendingAfterActive.slice(0, visibleUpcomingCount).map(taskRow),\n\t\t\t...(laterOmitted > 0 ? [label(formatOmittedTasks(laterOmitted, \"later\"))] : []),\n\t\t],\n\t};\n}\n\nexport function getTodoWidgetLines(phases: readonly TodoPhase[]): string[] | undefined {\n\tconst model = getTodoWidgetModel(phases);\n\tif (!model) return undefined;\n\treturn model.rows.map((row) => (row.kind === \"label\" ? row.text : formatTask(row.task)));\n}\n"]}
@@ -1,6 +1,6 @@
1
1
  import { Type } from "typebox";
2
2
  import type { ExtensionAPI, ExtensionContext } from "../../../types.ts";
3
- import { type TodoPhase } from "../state.ts";
3
+ import { type TodoCompletionTransition, type TodoPhase } from "../state.ts";
4
4
  export declare const TODO_PARAMS_SCHEMA: Type.TObject<{
5
5
  op: Type.TOptional<Type.TUnion<[Type.TLiteral<"init">, Type.TLiteral<"start">, Type.TLiteral<"done">, Type.TLiteral<"rm">, Type.TLiteral<"drop">, Type.TLiteral<"append">, Type.TLiteral<"view">]>>;
6
6
  list: Type.TOptional<Type.TArray<Type.TObject<{
@@ -14,7 +14,7 @@ export declare const TODO_PARAMS_SCHEMA: Type.TObject<{
14
14
  type TodoAccessors = {
15
15
  getCurrentPhases: () => TodoPhase[];
16
16
  setCurrentPhases: (phases: TodoPhase[]) => void;
17
- syncWidget: (ctx: ExtensionContext) => void;
17
+ syncWidget: (ctx: ExtensionContext, completedTasks?: readonly TodoCompletionTransition[]) => void;
18
18
  };
19
19
  export declare function phaseRomanNumeral(oneBasedIndex: number): string;
20
20
  export declare function registerTodoTool(pi: ExtensionAPI, accessors: TodoAccessors): void;
@@ -1 +1 @@
1
- {"version":3,"file":"todo.d.ts","sourceRoot":"","sources":["../../../../../../src/core/extensions/builtin/todotools/tools/todo.ts"],"names":[],"mappings":"AAMA,OAAO,EAAe,IAAI,EAAE,MAAM,SAAS,CAAC;AAG5C,OAAO,KAAK,EAEX,YAAY,EACZ,gBAAgB,EAIhB,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EAYN,KAAK,SAAS,EAGd,MAAM,aAAa,CAAC;AAuBrB,eAAO,MAAM,kBAAkB;;;;;;;;;EAU7B,CAAC;AAIH,KAAK,aAAa,GAAG;IACpB,gBAAgB,EAAE,MAAM,SAAS,EAAE,CAAC;IACpC,gBAAgB,EAAE,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,IAAI,CAAC;IAChD,UAAU,EAAE,CAAC,GAAG,EAAE,gBAAgB,KAAK,IAAI,CAAC;CAC5C,CAAC;AA4CF,wBAAgB,iBAAiB,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,CA0B/D;AAyID,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,YAAY,EAAE,SAAS,EAAE,aAAa,GAAG,IAAI,CAyEjF"}
1
+ {"version":3,"file":"todo.d.ts","sourceRoot":"","sources":["../../../../../../src/core/extensions/builtin/todotools/tools/todo.ts"],"names":[],"mappings":"AAMA,OAAO,EAAe,IAAI,EAAE,MAAM,SAAS,CAAC;AAG5C,OAAO,KAAK,EAEX,YAAY,EACZ,gBAAgB,EAIhB,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EAUN,KAAK,wBAAwB,EAE7B,KAAK,SAAS,EAGd,MAAM,aAAa,CAAC;AAuBrB,eAAO,MAAM,kBAAkB;;;;;;;;;EAU7B,CAAC;AAIH,KAAK,aAAa,GAAG;IACpB,gBAAgB,EAAE,MAAM,SAAS,EAAE,CAAC;IACpC,gBAAgB,EAAE,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,IAAI,CAAC;IAChD,UAAU,EAAE,CAAC,GAAG,EAAE,gBAAgB,EAAE,cAAc,CAAC,EAAE,SAAS,wBAAwB,EAAE,KAAK,IAAI,CAAC;CAClG,CAAC;AA4CF,wBAAgB,iBAAiB,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,CA0B/D;AAyID,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,YAAY,EAAE,SAAS,EAAE,aAAa,GAAG,IAAI,CAyEjF"}
@@ -239,7 +239,7 @@ export function registerTodoTool(pi, accessors) {
239
239
  phases: clonePhases(applied.phases),
240
240
  });
241
241
  accessors.setCurrentPhases(clonePhases(applied.phases));
242
- accessors.syncWidget(ctx);
242
+ accessors.syncWidget(ctx, completedTasks);
243
243
  }
244
244
  const details = {
245
245
  op: entry.op,
@@ -1 +1 @@
1
- {"version":3,"file":"todo.js","sourceRoot":"","sources":["../../../../../../src/core/extensions/builtin/todotools/tools/todo.ts"],"names":[],"mappings":"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","sourcesContent":["// Ported and adapted from oh-my-pi's todo tool (MIT License).\n// Copyright (c) 2025 Mario Zechner\n// Copyright (c) 2025-2026 Can Bölük\n// https://github.com/can1357/oh-my-pi\n\nimport { Text } from \"@earendil-works/pi-tui\";\nimport { type Static, Type } from \"typebox\";\nimport { partialStrikethrough, strikeRevealCount } from \"../../../../../modes/interactive/components/todo-strike.ts\";\nimport type { Theme } from \"../../../../../modes/interactive/theme/theme.ts\";\nimport type {\n\tAgentToolResult,\n\tExtensionAPI,\n\tExtensionContext,\n\tToolDefinition,\n\tToolRenderContext,\n\tToolRenderResultOptions,\n} from \"../../../types.ts\";\nimport { normalizeTodoParams } from \"../normalize.ts\";\nimport { TODO_TOOL_DESCRIPTION } from \"../prompt.ts\";\nimport {\n\tapplyParams,\n\tclonePhases,\n\tfindTaskByContent,\n\tformatSummary,\n\tgetCompletionTransitions,\n\tgetTodoMarker,\n\tnextActionableTask,\n\tsanitizeTodoText,\n\tTODO_STATE_ENTRY_TYPE,\n\ttype TodoCompletionTransition,\n\ttype TodoOperation,\n\ttype TodoPhase,\n\ttype TodoStateEntry,\n\ttype TodoToolDetails,\n} from \"../state.ts\";\n\nconst TodoOperationSchema = Type.Union(\n\t[\n\t\tType.Literal(\"init\"),\n\t\tType.Literal(\"start\"),\n\t\tType.Literal(\"done\"),\n\t\tType.Literal(\"rm\"),\n\t\tType.Literal(\"drop\"),\n\t\tType.Literal(\"append\"),\n\t\tType.Literal(\"view\"),\n\t],\n\t{ description: \"Operation to perform. Required — always pass it explicitly.\" },\n);\n\nconst TodoPhaseInputSchema = Type.Object({\n\tphase: Type.String({ description: \"Phase name\" }),\n\titems: Type.Array(Type.String({ description: \"Task content\" }), {\n\t\tdescription: \"Tasks for this phase\",\n\t\tminItems: 1,\n\t}),\n});\n\nexport const TODO_PARAMS_SCHEMA = Type.Object({\n\top: Type.Optional(TodoOperationSchema),\n\tlist: Type.Optional(Type.Array(TodoPhaseInputSchema, { description: \"Phased task list for init\" })),\n\ttask: Type.Optional(Type.String({ description: \"Exact task text copied from the previous todo result\" })),\n\tphase: Type.Optional(Type.String({ description: \"Exact phase name copied from the previous todo result\" })),\n\t// Keep this unconstrained at the schema boundary. init and append return\n\t// operation-specific errors, while unrelated operations may ignore it.\n\titems: Type.Optional(\n\t\tType.Array(Type.String({ description: \"Task content\" }), { description: \"Task texts to append\" }),\n\t),\n});\n\ntype TodoParams = Static<typeof TODO_PARAMS_SCHEMA>;\n\ntype TodoAccessors = {\n\tgetCurrentPhases: () => TodoPhase[];\n\tsetCurrentPhases: (phases: TodoPhase[]) => void;\n\tsyncWidget: (ctx: ExtensionContext) => void;\n};\n\nfunction countInitItems(params: TodoParams): { phases: number; tasks: number } {\n\tif (params.list) {\n\t\treturn {\n\t\t\tphases: params.list.length,\n\t\t\ttasks: params.list.reduce((total, phase) => total + phase.items.length, 0),\n\t\t};\n\t}\n\tif (params.items) return { phases: params.items.length > 0 ? 1 : 0, tasks: params.items.length };\n\treturn { phases: 0, tasks: 0 };\n}\n\nfunction countLabel(count: number, singular: string): string {\n\treturn `${count} ${singular}${count === 1 ? \"\" : \"s\"}`;\n}\n\nfunction renderCallLabel(params: TodoParams): string {\n\tswitch (params.op) {\n\t\tcase \"init\": {\n\t\t\tconst counts = countInitItems(params);\n\t\t\treturn `todo init (${countLabel(counts.phases, \"phase\")}, ${countLabel(counts.tasks, \"task\")})`;\n\t\t}\n\t\tcase \"append\":\n\t\t\treturn `todo append: ${sanitizeTodoText(params.phase ?? \"\") || \"(missing phase)\"} (${countLabel(\n\t\t\t\tparams.items?.length ?? 0,\n\t\t\t\t\"item\",\n\t\t\t)})`;\n\t\tcase \"start\":\n\t\tcase \"done\":\n\t\tcase \"drop\":\n\t\t\treturn `todo ${params.op}: ${sanitizeTodoText(params.task ?? params.phase ?? \"\") || \"(missing target)\"}`;\n\t\tcase \"rm\":\n\t\t\treturn `todo rm: ${sanitizeTodoText(params.task ?? params.phase ?? \"all\") || \"all\"}`;\n\t\tcase \"view\":\n\t\t\treturn \"todo view\";\n\t\t// Normalization can rescue a call that omitted `op`; label it generically until\n\t\t// execute resolves the effective operation. Listing `undefined` explicitly (instead\n\t\t// of `default`) keeps this switch exhaustive, so a new TodoOperation fails typecheck.\n\t\tcase undefined:\n\t\t\treturn \"todo\";\n\t}\n}\n\nexport function phaseRomanNumeral(oneBasedIndex: number): string {\n\tif (oneBasedIndex <= 0) return \"\";\n\tconst pairs: ReadonlyArray<readonly [number, string]> = [\n\t\t[1000, \"M\"],\n\t\t[900, \"CM\"],\n\t\t[500, \"D\"],\n\t\t[400, \"CD\"],\n\t\t[100, \"C\"],\n\t\t[90, \"XC\"],\n\t\t[50, \"L\"],\n\t\t[40, \"XL\"],\n\t\t[10, \"X\"],\n\t\t[9, \"IX\"],\n\t\t[5, \"V\"],\n\t\t[4, \"IV\"],\n\t\t[1, \"I\"],\n\t];\n\tlet remaining = oneBasedIndex;\n\tlet output = \"\";\n\tfor (const [value, symbol] of pairs) {\n\t\twhile (remaining >= value) {\n\t\t\toutput += symbol;\n\t\t\tremaining -= value;\n\t\t}\n\t}\n\treturn output;\n}\n\nfunction formatPhaseHeader(name: string, index: number, theme: Theme): string {\n\treturn theme.fg(\"accent\", theme.bold(`${phaseRomanNumeral(index)}. ${sanitizeTodoText(name)}`));\n}\n\nfunction formatPhaseSummary(phase: TodoPhase, index: number, theme: Theme): string {\n\tconst closed = phase.tasks.filter((task) => task.status === \"completed\" || task.status === \"abandoned\").length;\n\treturn theme.fg(\n\t\t\"dim\",\n\t\t`${phaseRomanNumeral(index)}. ${sanitizeTodoText(phase.name)} — ${closed}/${phase.tasks.length} done`,\n\t);\n}\n\nfunction formatTaskLine(\n\ttask: TodoPhase[\"tasks\"][number],\n\ttheme: Theme,\n\tcompletionKeys: ReadonlySet<string>,\n\tframe: number | undefined,\n): string {\n\tconst content = sanitizeTodoText(task.content);\n\tconst line = `${getTodoMarker(task.status)} ${content}`;\n\tswitch (task.status) {\n\t\tcase \"completed\": {\n\t\t\tconst reveal = completionKeys.has(task.content) ? strikeRevealCount(line, frame) : undefined;\n\t\t\treturn reveal === undefined\n\t\t\t\t? theme.fg(\"dim\", theme.strikethrough(line))\n\t\t\t\t: theme.fg(\n\t\t\t\t\t\t\"dim\",\n\t\t\t\t\t\tpartialStrikethrough(line, reveal, (text) => theme.strikethrough(text)),\n\t\t\t\t\t);\n\t\t}\n\t\tcase \"in_progress\":\n\t\t\treturn theme.fg(\"accent\", theme.bold(line));\n\t\tcase \"abandoned\":\n\t\t\treturn theme.fg(\"dim\", line);\n\t\tcase \"pending\":\n\t\t\treturn line;\n\t}\n}\n\nfunction computeTouchedPhases(\n\targs: TodoParams,\n\toperation: TodoOperation | undefined,\n\tphases: readonly TodoPhase[],\n\tcompletedTasks: readonly TodoCompletionTransition[],\n): Set<string> | null {\n\tconst touched = new Set<string>();\n\tconst activeTask = nextActionableTask(phases);\n\tif (activeTask) {\n\t\tconst activePhase = phases.find((phase) => phase.tasks.includes(activeTask));\n\t\tif (activePhase) touched.add(activePhase.name);\n\t}\n\tfor (const transition of completedTasks) touched.add(transition.phase);\n\t// Exhaustive over TodoOperation | undefined so adding an operation is a typecheck\n\t// failure here rather than a silent fall-through into target-scoped highlighting.\n\tswitch (operation) {\n\t\tcase \"init\":\n\t\t\tfor (const phase of phases) touched.add(phase.name);\n\t\t\tbreak;\n\t\tcase \"start\":\n\t\tcase \"done\":\n\t\tcase \"drop\":\n\t\tcase \"rm\":\n\t\tcase \"append\":\n\t\tcase \"view\":\n\t\tcase undefined: {\n\t\t\tif (args.phase) {\n\t\t\t\tconst phase = phases.find((candidate) => candidate.name === args.phase);\n\t\t\t\tif (phase) touched.add(phase.name);\n\t\t\t}\n\t\t\tif (args.task) {\n\t\t\t\tconst hit = findTaskByContent([...phases], args.task);\n\t\t\t\tif (hit) touched.add(hit.phase.name);\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tdefault: {\n\t\t\tconst _exhaustive: never = operation;\n\t\t\treturn touched.size > 0 ? touched : null;\n\t\t}\n\t}\n\treturn touched.size > 0 ? touched : null;\n}\n\nconst EMPTY_SET: ReadonlySet<string> = new Set();\n\nfunction renderTodoPhases(\n\tphases: readonly TodoPhase[],\n\tcompletedTasks: readonly TodoCompletionTransition[],\n\toptions: ToolRenderResultOptions,\n\targs: TodoParams,\n\toperation: TodoOperation | undefined,\n\ttheme: Theme,\n\tframe: number | undefined,\n): string {\n\tconst visiblePhases = phases.filter((phase) => phase.tasks.length > 0);\n\tif (visiblePhases.length === 0) return \"\";\n\n\tconst touched =\n\t\toptions.expanded || visiblePhases.length === 1\n\t\t\t? null\n\t\t\t: computeTouchedPhases(args, operation, visiblePhases, completedTasks);\n\tconst completionKeysByPhase = new Map<string, Set<string>>();\n\tfor (const transition of completedTasks) {\n\t\tlet completionKeys = completionKeysByPhase.get(transition.phase);\n\t\tif (!completionKeys) {\n\t\t\tcompletionKeys = new Set();\n\t\t\tcompletionKeysByPhase.set(transition.phase, completionKeys);\n\t\t}\n\t\tcompletionKeys.add(transition.content);\n\t}\n\tconst lines: string[] = [];\n\tfor (let index = 0; index < visiblePhases.length; index += 1) {\n\t\tconst phase = visiblePhases[index];\n\t\tconst oneBasedIndex = index + 1;\n\t\tif (touched && !touched.has(phase.name)) {\n\t\t\tlines.push(formatPhaseSummary(phase, oneBasedIndex, theme));\n\t\t\tcontinue;\n\t\t}\n\t\tlines.push(formatPhaseHeader(phase.name, oneBasedIndex, theme));\n\t\tconst completionKeys = completionKeysByPhase.get(phase.name) ?? EMPTY_SET;\n\t\tfor (const task of phase.tasks) lines.push(` ${formatTaskLine(task, theme, completionKeys, frame)}`);\n\t}\n\treturn lines.join(\"\\n\");\n}\n\nfunction getTextContent(result: AgentToolResult<TodoToolDetails>): string {\n\treturn result.content\n\t\t.filter(\n\t\t\t(content): content is { type: \"text\"; text: string } =>\n\t\t\t\tcontent.type === \"text\" && typeof content.text === \"string\",\n\t\t)\n\t\t.map((content) => content.text)\n\t\t.join(\"\\n\");\n}\n\nexport function registerTodoTool(pi: ExtensionAPI, accessors: TodoAccessors): void {\n\tconst tool: ToolDefinition<typeof TODO_PARAMS_SCHEMA, TodoToolDetails, unknown> = {\n\t\tname: \"todo\",\n\t\tlabel: \"Todo\",\n\t\tdescription: TODO_TOOL_DESCRIPTION,\n\t\tpromptSnippet: \"Track phased tasks with one op-based todo tool; reference tasks by their exact content.\",\n\t\tpromptGuidelines: [\n\t\t\t\"Use one todo operation at a time; batch it with the real work rather than making a solo todo turn.\",\n\t\t\t\"Reference tasks and phases by their exact content/name; use view when the text is uncertain.\",\n\t\t\t\"Mark work done immediately and use drop for tasks that are no longer needed.\",\n\t\t],\n\t\tparameters: TODO_PARAMS_SCHEMA,\n\t\texecutionMode: \"sequential\",\n\t\tasync execute(_toolCallId, params, _signal, _onUpdate, ctx): Promise<AgentToolResult<TodoToolDetails>> {\n\t\t\tconst previousPhases = clonePhases(accessors.getCurrentPhases());\n\t\t\tconst normalized = normalizeTodoParams(params as Record<string, unknown>, previousPhases);\n\t\t\tif (normalized.error || !normalized.entry) {\n\t\t\t\tconst error =\n\t\t\t\t\tnormalized.error ?? 'Missing \"op\". Example: {\"op\":\"init\",\"list\":[{\"phase\":\"Setup\",\"items\":[\"...\"]}]}';\n\t\t\t\tthrow new Error(`${error}\\n\\n${formatSummary(previousPhases, [], true)}`);\n\t\t\t}\n\t\t\tconst entry = normalized.entry;\n\t\t\tconst corrections = normalized.corrections;\n\t\t\tconst readOnly = entry.op === \"view\";\n\t\t\tconst applied = readOnly\n\t\t\t\t? { phases: previousPhases, errors: [] as string[] }\n\t\t\t\t: applyParams(clonePhases(previousPhases), entry, corrections);\n\t\t\tif (applied.errors.length > 0) throw new Error(formatSummary(previousPhases, applied.errors, readOnly));\n\t\t\tconst completedTasks = readOnly ? [] : getCompletionTransitions(previousPhases, applied.phases);\n\t\t\tif (!readOnly) {\n\t\t\t\tpi.appendEntry(TODO_STATE_ENTRY_TYPE, {\n\t\t\t\t\tschema: \"v2\",\n\t\t\t\t\tphases: clonePhases(applied.phases),\n\t\t\t\t} satisfies TodoStateEntry);\n\t\t\t\taccessors.setCurrentPhases(clonePhases(applied.phases));\n\t\t\t\taccessors.syncWidget(ctx);\n\t\t\t}\n\n\t\t\tconst details: TodoToolDetails = {\n\t\t\t\top: entry.op,\n\t\t\t\tphases: clonePhases(applied.phases),\n\t\t\t\tstorage: ctx.sessionManager.getSessionFile() ? \"session\" : \"memory\",\n\t\t\t};\n\t\t\tif (corrections.length > 0) details.corrections = corrections;\n\t\t\tif (completedTasks.length > 0) details.completedTasks = completedTasks;\n\t\t\tconst summary = formatSummary(applied.phases, [], readOnly);\n\t\t\tconst text = corrections.length > 0 ? `${corrections.join(\"\\n\")}\\n\\n${summary}` : summary;\n\n\t\t\treturn { content: [{ type: \"text\", text }], details };\n\t\t},\n\t\trenderCall(args, theme) {\n\t\t\treturn new Text(theme.fg(\"toolTitle\", theme.bold(renderCallLabel(args))), 0, 0);\n\t\t},\n\t\trenderResult(result, options, theme, context: ToolRenderContext<unknown, TodoParams>) {\n\t\t\tif (context.isError) {\n\t\t\t\treturn new Text(theme.fg(\"toolOutput\", getTextContent(result)), 0, 0);\n\t\t\t}\n\t\t\tconst phases = result.details?.phases ?? [];\n\t\t\tconst rendered = renderTodoPhases(\n\t\t\t\tphases,\n\t\t\t\tresult.details?.completedTasks ?? [],\n\t\t\t\toptions,\n\t\t\t\tcontext.args,\n\t\t\t\tresult.details?.op,\n\t\t\t\ttheme,\n\t\t\t\tcontext.spinnerFrame,\n\t\t\t);\n\t\t\tconst text = rendered || getTextContent(result) || \"Todo list is empty.\";\n\t\t\treturn new Text(text, 0, 0);\n\t\t},\n\t};\n\n\tpi.registerTool(tool);\n}\n"]}
1
+ {"version":3,"file":"todo.js","sourceRoot":"","sources":["../../../../../../src/core/extensions/builtin/todotools/tools/todo.ts"],"names":[],"mappings":"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","sourcesContent":["// Ported and adapted from oh-my-pi's todo tool (MIT License).\n// Copyright (c) 2025 Mario Zechner\n// Copyright (c) 2025-2026 Can Bölük\n// https://github.com/can1357/oh-my-pi\n\nimport { Text } from \"@earendil-works/pi-tui\";\nimport { type Static, Type } from \"typebox\";\nimport { partialStrikethrough, strikeRevealCount } from \"../../../../../modes/interactive/components/todo-strike.ts\";\nimport type { Theme } from \"../../../../../modes/interactive/theme/theme.ts\";\nimport type {\n\tAgentToolResult,\n\tExtensionAPI,\n\tExtensionContext,\n\tToolDefinition,\n\tToolRenderContext,\n\tToolRenderResultOptions,\n} from \"../../../types.ts\";\nimport { normalizeTodoParams } from \"../normalize.ts\";\nimport { TODO_TOOL_DESCRIPTION } from \"../prompt.ts\";\nimport {\n\tapplyParams,\n\tclonePhases,\n\tfindTaskByContent,\n\tformatSummary,\n\tgetCompletionTransitions,\n\tgetTodoMarker,\n\tnextActionableTask,\n\tsanitizeTodoText,\n\tTODO_STATE_ENTRY_TYPE,\n\ttype TodoCompletionTransition,\n\ttype TodoOperation,\n\ttype TodoPhase,\n\ttype TodoStateEntry,\n\ttype TodoToolDetails,\n} from \"../state.ts\";\n\nconst TodoOperationSchema = Type.Union(\n\t[\n\t\tType.Literal(\"init\"),\n\t\tType.Literal(\"start\"),\n\t\tType.Literal(\"done\"),\n\t\tType.Literal(\"rm\"),\n\t\tType.Literal(\"drop\"),\n\t\tType.Literal(\"append\"),\n\t\tType.Literal(\"view\"),\n\t],\n\t{ description: \"Operation to perform. Required — always pass it explicitly.\" },\n);\n\nconst TodoPhaseInputSchema = Type.Object({\n\tphase: Type.String({ description: \"Phase name\" }),\n\titems: Type.Array(Type.String({ description: \"Task content\" }), {\n\t\tdescription: \"Tasks for this phase\",\n\t\tminItems: 1,\n\t}),\n});\n\nexport const TODO_PARAMS_SCHEMA = Type.Object({\n\top: Type.Optional(TodoOperationSchema),\n\tlist: Type.Optional(Type.Array(TodoPhaseInputSchema, { description: \"Phased task list for init\" })),\n\ttask: Type.Optional(Type.String({ description: \"Exact task text copied from the previous todo result\" })),\n\tphase: Type.Optional(Type.String({ description: \"Exact phase name copied from the previous todo result\" })),\n\t// Keep this unconstrained at the schema boundary. init and append return\n\t// operation-specific errors, while unrelated operations may ignore it.\n\titems: Type.Optional(\n\t\tType.Array(Type.String({ description: \"Task content\" }), { description: \"Task texts to append\" }),\n\t),\n});\n\ntype TodoParams = Static<typeof TODO_PARAMS_SCHEMA>;\n\ntype TodoAccessors = {\n\tgetCurrentPhases: () => TodoPhase[];\n\tsetCurrentPhases: (phases: TodoPhase[]) => void;\n\tsyncWidget: (ctx: ExtensionContext, completedTasks?: readonly TodoCompletionTransition[]) => void;\n};\n\nfunction countInitItems(params: TodoParams): { phases: number; tasks: number } {\n\tif (params.list) {\n\t\treturn {\n\t\t\tphases: params.list.length,\n\t\t\ttasks: params.list.reduce((total, phase) => total + phase.items.length, 0),\n\t\t};\n\t}\n\tif (params.items) return { phases: params.items.length > 0 ? 1 : 0, tasks: params.items.length };\n\treturn { phases: 0, tasks: 0 };\n}\n\nfunction countLabel(count: number, singular: string): string {\n\treturn `${count} ${singular}${count === 1 ? \"\" : \"s\"}`;\n}\n\nfunction renderCallLabel(params: TodoParams): string {\n\tswitch (params.op) {\n\t\tcase \"init\": {\n\t\t\tconst counts = countInitItems(params);\n\t\t\treturn `todo init (${countLabel(counts.phases, \"phase\")}, ${countLabel(counts.tasks, \"task\")})`;\n\t\t}\n\t\tcase \"append\":\n\t\t\treturn `todo append: ${sanitizeTodoText(params.phase ?? \"\") || \"(missing phase)\"} (${countLabel(\n\t\t\t\tparams.items?.length ?? 0,\n\t\t\t\t\"item\",\n\t\t\t)})`;\n\t\tcase \"start\":\n\t\tcase \"done\":\n\t\tcase \"drop\":\n\t\t\treturn `todo ${params.op}: ${sanitizeTodoText(params.task ?? params.phase ?? \"\") || \"(missing target)\"}`;\n\t\tcase \"rm\":\n\t\t\treturn `todo rm: ${sanitizeTodoText(params.task ?? params.phase ?? \"all\") || \"all\"}`;\n\t\tcase \"view\":\n\t\t\treturn \"todo view\";\n\t\t// Normalization can rescue a call that omitted `op`; label it generically until\n\t\t// execute resolves the effective operation. Listing `undefined` explicitly (instead\n\t\t// of `default`) keeps this switch exhaustive, so a new TodoOperation fails typecheck.\n\t\tcase undefined:\n\t\t\treturn \"todo\";\n\t}\n}\n\nexport function phaseRomanNumeral(oneBasedIndex: number): string {\n\tif (oneBasedIndex <= 0) return \"\";\n\tconst pairs: ReadonlyArray<readonly [number, string]> = [\n\t\t[1000, \"M\"],\n\t\t[900, \"CM\"],\n\t\t[500, \"D\"],\n\t\t[400, \"CD\"],\n\t\t[100, \"C\"],\n\t\t[90, \"XC\"],\n\t\t[50, \"L\"],\n\t\t[40, \"XL\"],\n\t\t[10, \"X\"],\n\t\t[9, \"IX\"],\n\t\t[5, \"V\"],\n\t\t[4, \"IV\"],\n\t\t[1, \"I\"],\n\t];\n\tlet remaining = oneBasedIndex;\n\tlet output = \"\";\n\tfor (const [value, symbol] of pairs) {\n\t\twhile (remaining >= value) {\n\t\t\toutput += symbol;\n\t\t\tremaining -= value;\n\t\t}\n\t}\n\treturn output;\n}\n\nfunction formatPhaseHeader(name: string, index: number, theme: Theme): string {\n\treturn theme.fg(\"accent\", theme.bold(`${phaseRomanNumeral(index)}. ${sanitizeTodoText(name)}`));\n}\n\nfunction formatPhaseSummary(phase: TodoPhase, index: number, theme: Theme): string {\n\tconst closed = phase.tasks.filter((task) => task.status === \"completed\" || task.status === \"abandoned\").length;\n\treturn theme.fg(\n\t\t\"dim\",\n\t\t`${phaseRomanNumeral(index)}. ${sanitizeTodoText(phase.name)} — ${closed}/${phase.tasks.length} done`,\n\t);\n}\n\nfunction formatTaskLine(\n\ttask: TodoPhase[\"tasks\"][number],\n\ttheme: Theme,\n\tcompletionKeys: ReadonlySet<string>,\n\tframe: number | undefined,\n): string {\n\tconst content = sanitizeTodoText(task.content);\n\tconst line = `${getTodoMarker(task.status)} ${content}`;\n\tswitch (task.status) {\n\t\tcase \"completed\": {\n\t\t\tconst reveal = completionKeys.has(task.content) ? strikeRevealCount(line, frame) : undefined;\n\t\t\treturn reveal === undefined\n\t\t\t\t? theme.fg(\"dim\", theme.strikethrough(line))\n\t\t\t\t: theme.fg(\n\t\t\t\t\t\t\"dim\",\n\t\t\t\t\t\tpartialStrikethrough(line, reveal, (text) => theme.strikethrough(text)),\n\t\t\t\t\t);\n\t\t}\n\t\tcase \"in_progress\":\n\t\t\treturn theme.fg(\"accent\", theme.bold(line));\n\t\tcase \"abandoned\":\n\t\t\treturn theme.fg(\"dim\", line);\n\t\tcase \"pending\":\n\t\t\treturn line;\n\t}\n}\n\nfunction computeTouchedPhases(\n\targs: TodoParams,\n\toperation: TodoOperation | undefined,\n\tphases: readonly TodoPhase[],\n\tcompletedTasks: readonly TodoCompletionTransition[],\n): Set<string> | null {\n\tconst touched = new Set<string>();\n\tconst activeTask = nextActionableTask(phases);\n\tif (activeTask) {\n\t\tconst activePhase = phases.find((phase) => phase.tasks.includes(activeTask));\n\t\tif (activePhase) touched.add(activePhase.name);\n\t}\n\tfor (const transition of completedTasks) touched.add(transition.phase);\n\t// Exhaustive over TodoOperation | undefined so adding an operation is a typecheck\n\t// failure here rather than a silent fall-through into target-scoped highlighting.\n\tswitch (operation) {\n\t\tcase \"init\":\n\t\t\tfor (const phase of phases) touched.add(phase.name);\n\t\t\tbreak;\n\t\tcase \"start\":\n\t\tcase \"done\":\n\t\tcase \"drop\":\n\t\tcase \"rm\":\n\t\tcase \"append\":\n\t\tcase \"view\":\n\t\tcase undefined: {\n\t\t\tif (args.phase) {\n\t\t\t\tconst phase = phases.find((candidate) => candidate.name === args.phase);\n\t\t\t\tif (phase) touched.add(phase.name);\n\t\t\t}\n\t\t\tif (args.task) {\n\t\t\t\tconst hit = findTaskByContent([...phases], args.task);\n\t\t\t\tif (hit) touched.add(hit.phase.name);\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tdefault: {\n\t\t\tconst _exhaustive: never = operation;\n\t\t\treturn touched.size > 0 ? touched : null;\n\t\t}\n\t}\n\treturn touched.size > 0 ? touched : null;\n}\n\nconst EMPTY_SET: ReadonlySet<string> = new Set();\n\nfunction renderTodoPhases(\n\tphases: readonly TodoPhase[],\n\tcompletedTasks: readonly TodoCompletionTransition[],\n\toptions: ToolRenderResultOptions,\n\targs: TodoParams,\n\toperation: TodoOperation | undefined,\n\ttheme: Theme,\n\tframe: number | undefined,\n): string {\n\tconst visiblePhases = phases.filter((phase) => phase.tasks.length > 0);\n\tif (visiblePhases.length === 0) return \"\";\n\n\tconst touched =\n\t\toptions.expanded || visiblePhases.length === 1\n\t\t\t? null\n\t\t\t: computeTouchedPhases(args, operation, visiblePhases, completedTasks);\n\tconst completionKeysByPhase = new Map<string, Set<string>>();\n\tfor (const transition of completedTasks) {\n\t\tlet completionKeys = completionKeysByPhase.get(transition.phase);\n\t\tif (!completionKeys) {\n\t\t\tcompletionKeys = new Set();\n\t\t\tcompletionKeysByPhase.set(transition.phase, completionKeys);\n\t\t}\n\t\tcompletionKeys.add(transition.content);\n\t}\n\tconst lines: string[] = [];\n\tfor (let index = 0; index < visiblePhases.length; index += 1) {\n\t\tconst phase = visiblePhases[index];\n\t\tconst oneBasedIndex = index + 1;\n\t\tif (touched && !touched.has(phase.name)) {\n\t\t\tlines.push(formatPhaseSummary(phase, oneBasedIndex, theme));\n\t\t\tcontinue;\n\t\t}\n\t\tlines.push(formatPhaseHeader(phase.name, oneBasedIndex, theme));\n\t\tconst completionKeys = completionKeysByPhase.get(phase.name) ?? EMPTY_SET;\n\t\tfor (const task of phase.tasks) lines.push(` ${formatTaskLine(task, theme, completionKeys, frame)}`);\n\t}\n\treturn lines.join(\"\\n\");\n}\n\nfunction getTextContent(result: AgentToolResult<TodoToolDetails>): string {\n\treturn result.content\n\t\t.filter(\n\t\t\t(content): content is { type: \"text\"; text: string } =>\n\t\t\t\tcontent.type === \"text\" && typeof content.text === \"string\",\n\t\t)\n\t\t.map((content) => content.text)\n\t\t.join(\"\\n\");\n}\n\nexport function registerTodoTool(pi: ExtensionAPI, accessors: TodoAccessors): void {\n\tconst tool: ToolDefinition<typeof TODO_PARAMS_SCHEMA, TodoToolDetails, unknown> = {\n\t\tname: \"todo\",\n\t\tlabel: \"Todo\",\n\t\tdescription: TODO_TOOL_DESCRIPTION,\n\t\tpromptSnippet: \"Track phased tasks with one op-based todo tool; reference tasks by their exact content.\",\n\t\tpromptGuidelines: [\n\t\t\t\"Use one todo operation at a time; batch it with the real work rather than making a solo todo turn.\",\n\t\t\t\"Reference tasks and phases by their exact content/name; use view when the text is uncertain.\",\n\t\t\t\"Mark work done immediately and use drop for tasks that are no longer needed.\",\n\t\t],\n\t\tparameters: TODO_PARAMS_SCHEMA,\n\t\texecutionMode: \"sequential\",\n\t\tasync execute(_toolCallId, params, _signal, _onUpdate, ctx): Promise<AgentToolResult<TodoToolDetails>> {\n\t\t\tconst previousPhases = clonePhases(accessors.getCurrentPhases());\n\t\t\tconst normalized = normalizeTodoParams(params as Record<string, unknown>, previousPhases);\n\t\t\tif (normalized.error || !normalized.entry) {\n\t\t\t\tconst error =\n\t\t\t\t\tnormalized.error ?? 'Missing \"op\". Example: {\"op\":\"init\",\"list\":[{\"phase\":\"Setup\",\"items\":[\"...\"]}]}';\n\t\t\t\tthrow new Error(`${error}\\n\\n${formatSummary(previousPhases, [], true)}`);\n\t\t\t}\n\t\t\tconst entry = normalized.entry;\n\t\t\tconst corrections = normalized.corrections;\n\t\t\tconst readOnly = entry.op === \"view\";\n\t\t\tconst applied = readOnly\n\t\t\t\t? { phases: previousPhases, errors: [] as string[] }\n\t\t\t\t: applyParams(clonePhases(previousPhases), entry, corrections);\n\t\t\tif (applied.errors.length > 0) throw new Error(formatSummary(previousPhases, applied.errors, readOnly));\n\t\t\tconst completedTasks = readOnly ? [] : getCompletionTransitions(previousPhases, applied.phases);\n\t\t\tif (!readOnly) {\n\t\t\t\tpi.appendEntry(TODO_STATE_ENTRY_TYPE, {\n\t\t\t\t\tschema: \"v2\",\n\t\t\t\t\tphases: clonePhases(applied.phases),\n\t\t\t\t} satisfies TodoStateEntry);\n\t\t\t\taccessors.setCurrentPhases(clonePhases(applied.phases));\n\t\t\t\taccessors.syncWidget(ctx, completedTasks);\n\t\t\t}\n\n\t\t\tconst details: TodoToolDetails = {\n\t\t\t\top: entry.op,\n\t\t\t\tphases: clonePhases(applied.phases),\n\t\t\t\tstorage: ctx.sessionManager.getSessionFile() ? \"session\" : \"memory\",\n\t\t\t};\n\t\t\tif (corrections.length > 0) details.corrections = corrections;\n\t\t\tif (completedTasks.length > 0) details.completedTasks = completedTasks;\n\t\t\tconst summary = formatSummary(applied.phases, [], readOnly);\n\t\t\tconst text = corrections.length > 0 ? `${corrections.join(\"\\n\")}\\n\\n${summary}` : summary;\n\n\t\t\treturn { content: [{ type: \"text\", text }], details };\n\t\t},\n\t\trenderCall(args, theme) {\n\t\t\treturn new Text(theme.fg(\"toolTitle\", theme.bold(renderCallLabel(args))), 0, 0);\n\t\t},\n\t\trenderResult(result, options, theme, context: ToolRenderContext<unknown, TodoParams>) {\n\t\t\tif (context.isError) {\n\t\t\t\treturn new Text(theme.fg(\"toolOutput\", getTextContent(result)), 0, 0);\n\t\t\t}\n\t\t\tconst phases = result.details?.phases ?? [];\n\t\t\tconst rendered = renderTodoPhases(\n\t\t\t\tphases,\n\t\t\t\tresult.details?.completedTasks ?? [],\n\t\t\t\toptions,\n\t\t\t\tcontext.args,\n\t\t\t\tresult.details?.op,\n\t\t\t\ttheme,\n\t\t\t\tcontext.spinnerFrame,\n\t\t\t);\n\t\t\tconst text = rendered || getTextContent(result) || \"Todo list is empty.\";\n\t\t\treturn new Text(text, 0, 0);\n\t\t},\n\t};\n\n\tpi.registerTool(tool);\n}\n"]}
@@ -1,3 +1,3 @@
1
- /** Removes orphan Anthropic tool_result blocks from provider payload messages. */
1
+ /** Repairs Anthropic client tool_use/tool_result adjacency at the final provider boundary. */
2
2
  export declare function sanitizeAnthropicPayload(payload: unknown): unknown;
3
3
  //# sourceMappingURL=sanitize-anthropic-payload.d.ts.map
@@ -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"}
1
+ {"version":3,"file":"sanitize-anthropic-payload.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/tool-pair-guard/sanitize-anthropic-payload.ts"],"names":[],"mappings":"AAsGA,8FAA8F;AAC9F,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAoDlE"}
@@ -13,6 +13,7 @@ function isToolUseBlock(block) {
13
13
  function isToolResultBlock(block) {
14
14
  return block.type === "tool_result";
15
15
  }
16
+ const SYNTHETIC_OUTPUT = "Tool output unavailable (interrupted before result)";
16
17
  function isMessageWithArrayContent(value, role) {
17
18
  if (!isObject(value) || value.role !== role || !Array.isArray(value.content))
18
19
  return false;
@@ -22,48 +23,106 @@ function isMessageWithArrayContent(value, role) {
22
23
  }
23
24
  return true;
24
25
  }
25
- /** Removes orphan Anthropic tool_result blocks from provider payload messages. */
26
- export function sanitizeAnthropicPayload(payload) {
27
- if (!hasMessagesArray(payload))
28
- return payload;
29
- const toolUseIds = new Set();
30
- for (const unknownMessage of payload.messages) {
31
- if (!isMessageWithArrayContent(unknownMessage, "assistant"))
26
+ function isUserMessageWithStringContent(value) {
27
+ return isObject(value) && value.role === "user" && typeof value.content === "string";
28
+ }
29
+ function getToolUseIds(message) {
30
+ const ids = [];
31
+ const seen = new Set();
32
+ for (const block of message.content) {
33
+ if (!isToolUseBlock(block) || block.id.length === 0 || seen.has(block.id))
34
+ continue;
35
+ seen.add(block.id);
36
+ ids.push(block.id);
37
+ }
38
+ return ids;
39
+ }
40
+ function syntheticToolResult(toolUseId) {
41
+ return {
42
+ type: "tool_result",
43
+ tool_use_id: toolUseId,
44
+ content: SYNTHETIC_OUTPUT,
45
+ is_error: true,
46
+ };
47
+ }
48
+ function sameBlocks(left, right) {
49
+ return left.length === right.length && left.every((block, index) => block === right[index]);
50
+ }
51
+ function repairFollowingUserMessage(message, expectedIds) {
52
+ const expected = new Set(expectedIds);
53
+ const found = new Set();
54
+ const results = [];
55
+ const ordinary = [];
56
+ for (const block of message.content) {
57
+ if (!isToolResultBlock(block)) {
58
+ ordinary.push(block);
32
59
  continue;
33
- for (const unknownBlock of unknownMessage.content) {
34
- if (isToolUseBlock(unknownBlock) && unknownBlock.id.length > 0)
35
- toolUseIds.add(unknownBlock.id);
36
60
  }
61
+ const id = block.tool_use_id;
62
+ if (typeof id !== "string" || !expected.has(id) || found.has(id))
63
+ continue;
64
+ found.add(id);
65
+ results.push(block);
66
+ }
67
+ for (const id of expectedIds) {
68
+ if (!found.has(id))
69
+ results.push(syntheticToolResult(id));
37
70
  }
71
+ const content = [...results, ...ordinary];
72
+ if (sameBlocks(content, message.content))
73
+ return { message, changed: false };
74
+ return { message: { ...message, content }, changed: true };
75
+ }
76
+ function removeOrphanResults(message) {
77
+ const content = message.content.filter((block) => !isToolResultBlock(block));
78
+ if (content.length === message.content.length)
79
+ return { message, changed: false };
80
+ if (content.length === 0)
81
+ return { changed: true };
82
+ return { message: { ...message, content }, changed: true };
83
+ }
84
+ /** Repairs Anthropic client tool_use/tool_result adjacency at the final provider boundary. */
85
+ export function sanitizeAnthropicPayload(payload) {
86
+ if (!hasMessagesArray(payload))
87
+ return payload;
38
88
  let changed = false;
39
89
  const sanitizedMessages = [];
40
- for (const unknownMessage of payload.messages) {
41
- if (!isMessageWithArrayContent(unknownMessage, "user")) {
90
+ for (let index = 0; index < payload.messages.length; index++) {
91
+ const unknownMessage = payload.messages[index];
92
+ if (isMessageWithArrayContent(unknownMessage, "assistant")) {
42
93
  sanitizedMessages.push(unknownMessage);
43
- continue;
44
- }
45
- const originalContent = unknownMessage.content;
46
- const nextContent = [];
47
- let messageChanged = false;
48
- for (const block of originalContent) {
49
- if (!isToolResultBlock(block)) {
50
- nextContent.push(block);
94
+ const expectedIds = getToolUseIds(unknownMessage);
95
+ if (expectedIds.length === 0)
96
+ continue;
97
+ const nextMessage = payload.messages[index + 1];
98
+ if (isMessageWithArrayContent(nextMessage, "user")) {
99
+ const repaired = repairFollowingUserMessage(nextMessage, expectedIds);
100
+ sanitizedMessages.push(repaired.message);
101
+ changed ||= repaired.changed;
102
+ index++;
51
103
  continue;
52
104
  }
53
- const toolUseId = block.tool_use_id;
54
- if (typeof toolUseId !== "string" || toolUseId.length === 0 || !toolUseIds.has(toolUseId)) {
55
- messageChanged = true;
105
+ if (isUserMessageWithStringContent(nextMessage)) {
106
+ sanitizedMessages.push({
107
+ ...nextMessage,
108
+ content: [...expectedIds.map(syntheticToolResult), { type: "text", text: nextMessage.content }],
109
+ });
110
+ changed = true;
111
+ index++;
56
112
  continue;
57
113
  }
58
- nextContent.push(block);
59
- }
60
- if (nextContent.length === 0) {
114
+ sanitizedMessages.push({
115
+ role: "user",
116
+ content: expectedIds.map(syntheticToolResult),
117
+ });
61
118
  changed = true;
62
119
  continue;
63
120
  }
64
- if (messageChanged) {
65
- changed = true;
66
- sanitizedMessages.push({ ...unknownMessage, content: nextContent });
121
+ if (isMessageWithArrayContent(unknownMessage, "user")) {
122
+ const repaired = removeOrphanResults(unknownMessage);
123
+ if (repaired.message)
124
+ sanitizedMessages.push(repaired.message);
125
+ changed ||= repaired.changed;
67
126
  continue;
68
127
  }
69
128
  sanitizedMessages.push(unknownMessage);
@@ -1 +1 @@
1
- {"version":3,"file":"sanitize-anthropic-payload.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/tool-pair-guard/sanitize-anthropic-payload.ts"],"names":[],"mappings":"AAEA,SAAS,QAAQ,CAAC,KAAc;IAC/B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,CAAC;AACpD,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAc;IACvC,OAAO,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;AACzD,CAAC;AAED,SAAS,mBAAmB,CAAC,KAAc;IAC1C,OAAO,QAAQ,CAAC,KAAK,CAAC,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC;AAC1D,CAAC;AAED,SAAS,cAAc,CAAC,KAAwB;IAC/C,OAAO,KAAK,CAAC,IAAI,KAAK,UAAU,IAAI,IAAI,IAAI,KAAK,IAAI,OAAO,KAAK,CAAC,EAAE,KAAK,QAAQ,CAAC;AACnF,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAwB;IAClD,OAAO,KAAK,CAAC,IAAI,KAAK,aAAa,CAAC;AACrC,CAAC;AAED,SAAS,yBAAyB,CACjC,KAAc,EACd,IAA0B;IAE1B,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC;QAAE,OAAO,KAAK,CAAC;IAC3F,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;QACnC,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC;IAC/C,CAAC;IACD,OAAO,IAAI,CAAC;AACb,CAAC;AAED,kFAAkF;AAClF,MAAM,UAAU,wBAAwB,CAAC,OAAgB;IACxD,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC;QAAE,OAAO,OAAO,CAAC;IAE/C,MAAM,UAAU,GAAG,IAAI,GAAG,EAAU,CAAC;IACrC,KAAK,MAAM,cAAc,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;QAC/C,IAAI,CAAC,yBAAyB,CAAC,cAAc,EAAE,WAAW,CAAC;YAAE,SAAS;QACtE,KAAK,MAAM,YAAY,IAAI,cAAc,CAAC,OAAO,EAAE,CAAC;YACnD,IAAI,cAAc,CAAC,YAAY,CAAC,IAAI,YAAY,CAAC,EAAE,CAAC,MAAM,GAAG,CAAC;gBAAE,UAAU,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;QACjG,CAAC;IACF,CAAC;IAED,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,MAAM,iBAAiB,GAAc,EAAE,CAAC;IAExC,KAAK,MAAM,cAAc,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;QAC/C,IAAI,CAAC,yBAAyB,CAAC,cAAc,EAAE,MAAM,CAAC,EAAE,CAAC;YACxD,iBAAiB,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YACvC,SAAS;QACV,CAAC;QAED,MAAM,eAAe,GAAG,cAAc,CAAC,OAAO,CAAC;QAC/C,MAAM,WAAW,GAAwB,EAAE,CAAC;QAC5C,IAAI,cAAc,GAAG,KAAK,CAAC;QAE3B,KAAK,MAAM,KAAK,IAAI,eAAe,EAAE,CAAC;YACrC,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC/B,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBACxB,SAAS;YACV,CAAC;YAED,MAAM,SAAS,GAAG,KAAK,CAAC,WAAW,CAAC;YACpC,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC3F,cAAc,GAAG,IAAI,CAAC;gBACtB,SAAS;YACV,CAAC;YAED,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACzB,CAAC;QAED,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC9B,OAAO,GAAG,IAAI,CAAC;YACf,SAAS;QACV,CAAC;QAED,IAAI,cAAc,EAAE,CAAC;YACpB,OAAO,GAAG,IAAI,CAAC;YACf,iBAAiB,CAAC,IAAI,CAAC,EAAE,GAAG,cAAc,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,CAAC;YACpE,SAAS;QACV,CAAC;QAED,iBAAiB,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IACxC,CAAC;IAED,IAAI,CAAC,OAAO;QAAE,OAAO,OAAO,CAAC;IAC7B,OAAO,EAAE,GAAG,OAAO,EAAE,QAAQ,EAAE,iBAAiB,EAAE,CAAC;AACpD,CAAC","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.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/tool-pair-guard/sanitize-anthropic-payload.ts"],"names":[],"mappings":"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","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\nconst SYNTHETIC_OUTPUT = \"Tool output unavailable (interrupted before result)\";\n\nfunction isMessageWithArrayContent<Role extends MessageParam[\"role\"]>(\n\tvalue: unknown,\n\trole: Role,\n): value is MessageParam & { role: Role; 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\nfunction isUserMessageWithStringContent(value: unknown): value is MessageParam & { role: \"user\"; content: string } {\n\treturn isObject(value) && value.role === \"user\" && typeof value.content === \"string\";\n}\n\nfunction getToolUseIds(message: MessageParam & { content: ContentBlockParam[] }): string[] {\n\tconst ids: string[] = [];\n\tconst seen = new Set<string>();\n\tfor (const block of message.content) {\n\t\tif (!isToolUseBlock(block) || block.id.length === 0 || seen.has(block.id)) continue;\n\t\tseen.add(block.id);\n\t\tids.push(block.id);\n\t}\n\treturn ids;\n}\n\nfunction syntheticToolResult(toolUseId: string): Extract<ContentBlockParam, { type: \"tool_result\" }> {\n\treturn {\n\t\ttype: \"tool_result\",\n\t\ttool_use_id: toolUseId,\n\t\tcontent: SYNTHETIC_OUTPUT,\n\t\tis_error: true,\n\t};\n}\n\nfunction sameBlocks(left: ContentBlockParam[], right: ContentBlockParam[]): boolean {\n\treturn left.length === right.length && left.every((block, index) => block === right[index]);\n}\n\nfunction repairFollowingUserMessage(\n\tmessage: MessageParam & { role: \"user\"; content: ContentBlockParam[] },\n\texpectedIds: string[],\n): { message: MessageParam; changed: boolean } {\n\tconst expected = new Set(expectedIds);\n\tconst found = new Set<string>();\n\tconst results: ContentBlockParam[] = [];\n\tconst ordinary: ContentBlockParam[] = [];\n\n\tfor (const block of message.content) {\n\t\tif (!isToolResultBlock(block)) {\n\t\t\tordinary.push(block);\n\t\t\tcontinue;\n\t\t}\n\t\tconst id = block.tool_use_id;\n\t\tif (typeof id !== \"string\" || !expected.has(id) || found.has(id)) continue;\n\t\tfound.add(id);\n\t\tresults.push(block);\n\t}\n\n\tfor (const id of expectedIds) {\n\t\tif (!found.has(id)) results.push(syntheticToolResult(id));\n\t}\n\n\tconst content = [...results, ...ordinary];\n\tif (sameBlocks(content, message.content)) return { message, changed: false };\n\treturn { message: { ...message, content }, changed: true };\n}\n\nfunction removeOrphanResults(message: MessageParam & { role: \"user\"; content: ContentBlockParam[] }): {\n\tmessage?: MessageParam;\n\tchanged: boolean;\n} {\n\tconst content = message.content.filter((block) => !isToolResultBlock(block));\n\tif (content.length === message.content.length) return { message, changed: false };\n\tif (content.length === 0) return { changed: true };\n\treturn { message: { ...message, content }, changed: true };\n}\n\n/** Repairs Anthropic client tool_use/tool_result adjacency at the final provider boundary. */\nexport function sanitizeAnthropicPayload(payload: unknown): unknown {\n\tif (!hasMessagesArray(payload)) return payload;\n\n\tlet changed = false;\n\tconst sanitizedMessages: unknown[] = [];\n\n\tfor (let index = 0; index < payload.messages.length; index++) {\n\t\tconst unknownMessage = payload.messages[index];\n\t\tif (isMessageWithArrayContent(unknownMessage, \"assistant\")) {\n\t\t\tsanitizedMessages.push(unknownMessage);\n\t\t\tconst expectedIds = getToolUseIds(unknownMessage);\n\t\t\tif (expectedIds.length === 0) continue;\n\n\t\t\tconst nextMessage = payload.messages[index + 1];\n\t\t\tif (isMessageWithArrayContent(nextMessage, \"user\")) {\n\t\t\t\tconst repaired = repairFollowingUserMessage(nextMessage, expectedIds);\n\t\t\t\tsanitizedMessages.push(repaired.message);\n\t\t\t\tchanged ||= repaired.changed;\n\t\t\t\tindex++;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (isUserMessageWithStringContent(nextMessage)) {\n\t\t\t\tsanitizedMessages.push({\n\t\t\t\t\t...nextMessage,\n\t\t\t\t\tcontent: [...expectedIds.map(syntheticToolResult), { type: \"text\", text: nextMessage.content }],\n\t\t\t\t});\n\t\t\t\tchanged = true;\n\t\t\t\tindex++;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tsanitizedMessages.push({\n\t\t\t\trole: \"user\",\n\t\t\t\tcontent: expectedIds.map(syntheticToolResult),\n\t\t\t});\n\t\t\tchanged = true;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (isMessageWithArrayContent(unknownMessage, \"user\")) {\n\t\t\tconst repaired = removeOrphanResults(unknownMessage);\n\t\t\tif (repaired.message) sanitizedMessages.push(repaired.message);\n\t\t\tchanged ||= repaired.changed;\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 +1 @@
1
- {"version":3,"file":"tps.d.ts","sourceRoot":"","sources":["../../../../src/core/extensions/builtin/tps.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAmBhD,MAAM,CAAC,OAAO,WAAW,EAAE,EAAE,YAAY,QAgExC"}
1
+ {"version":3,"file":"tps.d.ts","sourceRoot":"","sources":["../../../../src/core/extensions/builtin/tps.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAmBhD,MAAM,CAAC,OAAO,WAAW,EAAE,EAAE,YAAY,QAmExC"}
@@ -10,7 +10,10 @@ export default function (pi) {
10
10
  const finishActiveAssistantTiming = () => {
11
11
  if (activeAssistantStartMs === null)
12
12
  return;
13
- const elapsedMs = Date.now() - activeAssistantStartMs;
13
+ // Use the monotonic clock so a wall-clock jump backward (NTP skew or
14
+ // manual time change) between message_start and message_end cannot
15
+ // produce a non-positive interval that suppresses a valid TPS notice.
16
+ const elapsedMs = performance.now() - activeAssistantStartMs;
14
17
  if (elapsedMs > 0) {
15
18
  assistantElapsedMs += elapsedMs;
16
19
  }
@@ -24,7 +27,7 @@ export default function (pi) {
24
27
  if (!isAssistantMessage(event.message))
25
28
  return;
26
29
  finishActiveAssistantTiming();
27
- activeAssistantStartMs = Date.now();
30
+ activeAssistantStartMs = performance.now();
28
31
  });
29
32
  pi.on("message_end", (event) => {
30
33
  if (!isAssistantMessage(event.message))
@@ -1 +1 @@
1
- {"version":3,"file":"tps.js","sourceRoot":"","sources":["../../../../src/core/extensions/builtin/tps.ts"],"names":[],"mappings":"AAaA,SAAS,kBAAkB,CAAC,OAAgB;IAC3C,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC1D,MAAM,IAAI,GAAI,OAA8B,CAAC,IAAI,CAAC;IAClD,OAAO,IAAI,KAAK,WAAW,CAAC;AAC7B,CAAC;AAED,MAAM,CAAC,OAAO,WAAW,EAAgB;IACxC,IAAI,sBAAsB,GAAkB,IAAI,CAAC;IACjD,IAAI,kBAAkB,GAAG,CAAC,CAAC;IAE3B,MAAM,2BAA2B,GAAG,GAAG,EAAE;QACxC,IAAI,sBAAsB,KAAK,IAAI;YAAE,OAAO;QAE5C,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,sBAAsB,CAAC;QACtD,IAAI,SAAS,GAAG,CAAC,EAAE,CAAC;YACnB,kBAAkB,IAAI,SAAS,CAAC;QACjC,CAAC;QACD,sBAAsB,GAAG,IAAI,CAAC;IAC/B,CAAC,CAAC;IAEF,EAAE,CAAC,EAAE,CAAC,aAAa,EAAE,GAAG,EAAE;QACzB,sBAAsB,GAAG,IAAI,CAAC;QAC9B,kBAAkB,GAAG,CAAC,CAAC;IACxB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,EAAE,CAAC,eAAe,EAAE,CAAC,KAAK,EAAE,EAAE;QAChC,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,OAAO,CAAC;YAAE,OAAO;QAE/C,2BAA2B,EAAE,CAAC;QAC9B,sBAAsB,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,EAAE,CAAC,aAAa,EAAE,CAAC,KAAK,EAAE,EAAE;QAC9B,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,OAAO,CAAC;YAAE,OAAO;QAE/C,2BAA2B,EAAE,CAAC;IAC/B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;QACjC,2BAA2B,EAAE,CAAC;QAE9B,MAAM,SAAS,GAAG,kBAAkB,CAAC;QACrC,sBAAsB,GAAG,IAAI,CAAC;QAC9B,kBAAkB,GAAG,CAAC,CAAC;QAEvB,IAAI,CAAC,GAAG,CAAC,KAAK;YAAE,OAAO;QACvB,IAAI,SAAS,IAAI,CAAC;YAAE,OAAO;QAE3B,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,IAAI,MAAM,GAAG,CAAC,CAAC;QACf,IAAI,SAAS,GAAG,CAAC,CAAC;QAClB,IAAI,UAAU,GAAG,CAAC,CAAC;QACnB,IAAI,WAAW,GAAG,CAAC,CAAC;QAEpB,KAAK,MAAM,OAAO,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;YACtC,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC;gBAAE,SAAS;YAC3C,KAAK,IAAI,OAAO,CAAC,KAAK,EAAE,KAAK,IAAI,CAAC,CAAC;YACnC,MAAM,IAAI,OAAO,CAAC,KAAK,EAAE,MAAM,IAAI,CAAC,CAAC;YACrC,SAAS,IAAI,OAAO,CAAC,KAAK,EAAE,SAAS,IAAI,CAAC,CAAC;YAC3C,UAAU,IAAI,OAAO,CAAC,KAAK,EAAE,UAAU,IAAI,CAAC,CAAC;YAC7C,WAAW,IAAI,OAAO,CAAC,KAAK,EAAE,WAAW,IAAI,CAAC,CAAC;QAChD,CAAC;QAED,IAAI,MAAM,IAAI,CAAC;YAAE,OAAO;QAExB,MAAM,cAAc,GAAG,SAAS,GAAG,IAAI,CAAC;QACxC,MAAM,eAAe,GAAG,MAAM,GAAG,cAAc,CAAC;QAChD,MAAM,OAAO,GAAG,OAAO,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,MAAM,CAAC,cAAc,EAAE,QAAQ,KAAK,CAAC,cAAc,EAAE,eAAe,SAAS,CAAC,cAAc,EAAE,IAAI,UAAU,CAAC,cAAc,EAAE,WAAW,WAAW,CAAC,cAAc,EAAE,KAAK,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;QACtQ,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAChC,CAAC,CAAC,CAAC;AACJ,CAAC","sourcesContent":["import type { ExtensionAPI } from \"../types.ts\";\n\ntype AssistantMessageLike = {\n\trole: \"assistant\";\n\tusage?: {\n\t\tinput?: number;\n\t\toutput?: number;\n\t\tcacheRead?: number;\n\t\tcacheWrite?: number;\n\t\ttotalTokens?: number;\n\t};\n};\n\nfunction isAssistantMessage(message: unknown): message is AssistantMessageLike {\n\tif (!message || typeof message !== \"object\") return false;\n\tconst role = (message as { role?: unknown }).role;\n\treturn role === \"assistant\";\n}\n\nexport default function (pi: ExtensionAPI) {\n\tlet activeAssistantStartMs: number | null = null;\n\tlet assistantElapsedMs = 0;\n\n\tconst finishActiveAssistantTiming = () => {\n\t\tif (activeAssistantStartMs === null) return;\n\n\t\tconst elapsedMs = Date.now() - activeAssistantStartMs;\n\t\tif (elapsedMs > 0) {\n\t\t\tassistantElapsedMs += elapsedMs;\n\t\t}\n\t\tactiveAssistantStartMs = null;\n\t};\n\n\tpi.on(\"agent_start\", () => {\n\t\tactiveAssistantStartMs = null;\n\t\tassistantElapsedMs = 0;\n\t});\n\n\tpi.on(\"message_start\", (event) => {\n\t\tif (!isAssistantMessage(event.message)) return;\n\n\t\tfinishActiveAssistantTiming();\n\t\tactiveAssistantStartMs = Date.now();\n\t});\n\n\tpi.on(\"message_end\", (event) => {\n\t\tif (!isAssistantMessage(event.message)) return;\n\n\t\tfinishActiveAssistantTiming();\n\t});\n\n\tpi.on(\"agent_end\", (event, ctx) => {\n\t\tfinishActiveAssistantTiming();\n\n\t\tconst elapsedMs = assistantElapsedMs;\n\t\tactiveAssistantStartMs = null;\n\t\tassistantElapsedMs = 0;\n\n\t\tif (!ctx.hasUI) return;\n\t\tif (elapsedMs <= 0) return;\n\n\t\tlet input = 0;\n\t\tlet output = 0;\n\t\tlet cacheRead = 0;\n\t\tlet cacheWrite = 0;\n\t\tlet totalTokens = 0;\n\n\t\tfor (const message of event.messages) {\n\t\t\tif (!isAssistantMessage(message)) continue;\n\t\t\tinput += message.usage?.input ?? 0;\n\t\t\toutput += message.usage?.output ?? 0;\n\t\t\tcacheRead += message.usage?.cacheRead ?? 0;\n\t\t\tcacheWrite += message.usage?.cacheWrite ?? 0;\n\t\t\ttotalTokens += message.usage?.totalTokens ?? 0;\n\t\t}\n\n\t\tif (output <= 0) return;\n\n\t\tconst elapsedSeconds = elapsedMs / 1000;\n\t\tconst tokensPerSecond = output / elapsedSeconds;\n\t\tconst message = `TPS ${tokensPerSecond.toFixed(1)} tok/s. out ${output.toLocaleString()}, in ${input.toLocaleString()}, cache r/w ${cacheRead.toLocaleString()}/${cacheWrite.toLocaleString()}, total ${totalTokens.toLocaleString()}, ${elapsedSeconds.toFixed(1)}s`;\n\t\tctx.ui.notify(message, \"info\");\n\t});\n}\n"]}
1
+ {"version":3,"file":"tps.js","sourceRoot":"","sources":["../../../../src/core/extensions/builtin/tps.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ExtensionAPI } from \"../types.ts\";\n\ntype AssistantMessageLike = {\n\trole: \"assistant\";\n\tusage?: {\n\t\tinput?: number;\n\t\toutput?: number;\n\t\tcacheRead?: number;\n\t\tcacheWrite?: number;\n\t\ttotalTokens?: number;\n\t};\n};\n\nfunction isAssistantMessage(message: unknown): message is AssistantMessageLike {\n\tif (!message || typeof message !== \"object\") return false;\n\tconst role = (message as { role?: unknown }).role;\n\treturn role === \"assistant\";\n}\n\nexport default function (pi: ExtensionAPI) {\n\tlet activeAssistantStartMs: number | null = null;\n\tlet assistantElapsedMs = 0;\n\n\tconst finishActiveAssistantTiming = () => {\n\t\tif (activeAssistantStartMs === null) return;\n\n\t\t// Use the monotonic clock so a wall-clock jump backward (NTP skew or\n\t\t// manual time change) between message_start and message_end cannot\n\t\t// produce a non-positive interval that suppresses a valid TPS notice.\n\t\tconst elapsedMs = performance.now() - activeAssistantStartMs;\n\t\tif (elapsedMs > 0) {\n\t\t\tassistantElapsedMs += elapsedMs;\n\t\t}\n\t\tactiveAssistantStartMs = null;\n\t};\n\n\tpi.on(\"agent_start\", () => {\n\t\tactiveAssistantStartMs = null;\n\t\tassistantElapsedMs = 0;\n\t});\n\n\tpi.on(\"message_start\", (event) => {\n\t\tif (!isAssistantMessage(event.message)) return;\n\n\t\tfinishActiveAssistantTiming();\n\t\tactiveAssistantStartMs = performance.now();\n\t});\n\n\tpi.on(\"message_end\", (event) => {\n\t\tif (!isAssistantMessage(event.message)) return;\n\n\t\tfinishActiveAssistantTiming();\n\t});\n\n\tpi.on(\"agent_end\", (event, ctx) => {\n\t\tfinishActiveAssistantTiming();\n\n\t\tconst elapsedMs = assistantElapsedMs;\n\t\tactiveAssistantStartMs = null;\n\t\tassistantElapsedMs = 0;\n\n\t\tif (!ctx.hasUI) return;\n\t\tif (elapsedMs <= 0) return;\n\n\t\tlet input = 0;\n\t\tlet output = 0;\n\t\tlet cacheRead = 0;\n\t\tlet cacheWrite = 0;\n\t\tlet totalTokens = 0;\n\n\t\tfor (const message of event.messages) {\n\t\t\tif (!isAssistantMessage(message)) continue;\n\t\t\tinput += message.usage?.input ?? 0;\n\t\t\toutput += message.usage?.output ?? 0;\n\t\t\tcacheRead += message.usage?.cacheRead ?? 0;\n\t\t\tcacheWrite += message.usage?.cacheWrite ?? 0;\n\t\t\ttotalTokens += message.usage?.totalTokens ?? 0;\n\t\t}\n\n\t\tif (output <= 0) return;\n\n\t\tconst elapsedSeconds = elapsedMs / 1000;\n\t\tconst tokensPerSecond = output / elapsedSeconds;\n\t\tconst message = `TPS ${tokensPerSecond.toFixed(1)} tok/s. out ${output.toLocaleString()}, in ${input.toLocaleString()}, cache r/w ${cacheRead.toLocaleString()}/${cacheWrite.toLocaleString()}, total ${totalTokens.toLocaleString()}, ${elapsedSeconds.toFixed(1)}s`;\n\t\tctx.ui.notify(message, \"info\");\n\t});\n}\n"]}
@@ -0,0 +1,4 @@
1
+ import type { TtsrRule } from "./types.ts";
2
+ export declare const FABRICATED_UNAVAILABLE_TOOL_CALL_RULE_NAME = "fabricated-unavailable-tool-call";
3
+ export declare const BUILTIN_TTSR_RULES: readonly TtsrRule[];
4
+ //# sourceMappingURL=builtin-rules.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"builtin-rules.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/ttsr/builtin-rules.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3C,eAAO,MAAM,0CAA0C,qCAAqC,CAAC;AAE7F,eAAO,MAAM,kBAAkB,EAAE,SAAS,QAAQ,EAiBjD,CAAC"}
@@ -0,0 +1,20 @@
1
+ export const FABRICATED_UNAVAILABLE_TOOL_CALL_RULE_NAME = "fabricated-unavailable-tool-call";
2
+ export const BUILTIN_TTSR_RULES = [
3
+ {
4
+ name: FABRICATED_UNAVAILABLE_TOOL_CALL_RULE_NAME,
5
+ content: [
6
+ "Your previous output imitated an unavailable historical tool call as inert text instead of taking action.",
7
+ "Redo the interrupted step now. Call your real tools that are actually available to you, such as edit or write for file changes.",
8
+ "Do not print or imitate unavailable-tool transcript envelopes.",
9
+ ].join("\n"),
10
+ description: "Interrupt fabricated unavailable-tool calls emitted as assistant text.",
11
+ condition: [
12
+ "(?i)<\\s*unavailable-tool-call\\b",
13
+ "(?i)\\[called\\s+tool\\s+[\"'][^\"'\\r\\n]+[\"']\\s+\\(no\\s+longer\\s+available\\s+in\\s+this\\s+session\\)",
14
+ ],
15
+ scope: { allowText: true, allowThinking: false, toolScopes: [] },
16
+ interruptMode: "always",
17
+ source: "builtin",
18
+ },
19
+ ];
20
+ //# sourceMappingURL=builtin-rules.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"builtin-rules.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/ttsr/builtin-rules.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,0CAA0C,GAAG,kCAAkC,CAAC;AAE7F,MAAM,CAAC,MAAM,kBAAkB,GAAwB;IACtD;QACC,IAAI,EAAE,0CAA0C;QAChD,OAAO,EAAE;YACR,2GAA2G;YAC3G,iIAAiI;YACjI,gEAAgE;SAChE,CAAC,IAAI,CAAC,IAAI,CAAC;QACZ,WAAW,EAAE,wEAAwE;QACrF,SAAS,EAAE;YACV,mCAAmC;YACnC,8GAA8G;SAC9G;QACD,KAAK,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE,EAAE;QAChE,aAAa,EAAE,QAAQ;QACvB,MAAM,EAAE,SAAS;KACjB;CACD,CAAC","sourcesContent":["import type { TtsrRule } from \"./types.ts\";\n\nexport const FABRICATED_UNAVAILABLE_TOOL_CALL_RULE_NAME = \"fabricated-unavailable-tool-call\";\n\nexport const BUILTIN_TTSR_RULES: readonly TtsrRule[] = [\n\t{\n\t\tname: FABRICATED_UNAVAILABLE_TOOL_CALL_RULE_NAME,\n\t\tcontent: [\n\t\t\t\"Your previous output imitated an unavailable historical tool call as inert text instead of taking action.\",\n\t\t\t\"Redo the interrupted step now. Call your real tools that are actually available to you, such as edit or write for file changes.\",\n\t\t\t\"Do not print or imitate unavailable-tool transcript envelopes.\",\n\t\t].join(\"\\n\"),\n\t\tdescription: \"Interrupt fabricated unavailable-tool calls emitted as assistant text.\",\n\t\tcondition: [\n\t\t\t\"(?i)<\\\\s*unavailable-tool-call\\\\b\",\n\t\t\t\"(?i)\\\\[called\\\\s+tool\\\\s+[\\\"'][^\\\"'\\\\r\\\\n]+[\\\"']\\\\s+\\\\(no\\\\s+longer\\\\s+available\\\\s+in\\\\s+this\\\\s+session\\\\)\",\n\t\t],\n\t\tscope: { allowText: true, allowThinking: false, toolScopes: [] },\n\t\tinterruptMode: \"always\",\n\t\tsource: \"builtin\",\n\t},\n];\n"]}
@@ -23,6 +23,8 @@ export function registerTtsrCommands(pi, getState) {
23
23
  });
24
24
  }
25
25
  function formatTtsrStatus(state) {
26
+ const builtinRules = state.rules.filter((rule) => rule.source === "builtin");
27
+ const userRules = state.rules.filter((rule) => rule.source !== "builtin");
26
28
  return [
27
29
  "TTSR stream rules",
28
30
  "",
@@ -30,10 +32,13 @@ function formatTtsrStatus(state) {
30
32
  state.disabled ? "disabled (ttsr-disabled flag set)" : "enabled",
31
33
  "",
32
34
  "BUILTIN RULES",
35
+ "DETECTORS",
33
36
  ...BUILTIN_RULES.map(formatBuiltinRule),
37
+ "STREAM RULES",
38
+ ...(builtinRules.length === 0 ? ["(none)"] : builtinRules.map(formatBuiltinStreamRule)),
34
39
  "",
35
40
  "USER RULES",
36
- ...formatUserRules(state.rules),
41
+ ...formatUserRules(userRules),
37
42
  "",
38
43
  "INJECTED",
39
44
  state.injectedRuleNames.length === 0 ? "(none)" : state.injectedRuleNames.join(", "),
@@ -46,6 +51,9 @@ function formatBuiltinRule(rule) {
46
51
  `(mode: ${rule.remediation.retryMode}, scope: ${rule.remediation.corruptionScope})`,
47
52
  ].join(" ");
48
53
  }
54
+ function formatBuiltinStreamRule(rule) {
55
+ return `${rule.name} [stream rule, scope: ${formatScope(rule.scope)}]`;
56
+ }
49
57
  function formatUserRules(rules) {
50
58
  if (rules.length === 0)
51
59
  return ["(none)"];
@@ -1 +1 @@
1
- {"version":3,"file":"commands.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/ttsr/commands.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ExtensionAPI } from \"../../types.ts\";\nimport { COLLAPSE_RULE_NAME, CONTROL_LEAK_RULE_NAME } from \"./prompts.ts\";\nimport {\n\tCOLLAPSE_REMEDIATION,\n\tCONTROL_LEAK_REMEDIATION,\n\ttype RuleRemediation,\n\ttype TtsrRule,\n\ttype TtsrScope,\n} from \"./types.ts\";\n\nexport interface TtsrPublicState {\n\treadonly rules: readonly TtsrRule[];\n\treadonly injectedRuleNames: readonly string[];\n\treadonly disabled: boolean;\n}\n\ninterface BuiltinRuleStatus {\n\treadonly name: string;\n\treadonly detector: string;\n\treadonly remediation: RuleRemediation;\n\treadonly summary: string;\n}\n\nconst BUILTIN_RULES: readonly BuiltinRuleStatus[] = [\n\t{\n\t\tname: COLLAPSE_RULE_NAME,\n\t\tdetector: \"collapse\",\n\t\tremediation: COLLAPSE_REMEDIATION,\n\t\tsummary: \"abort the stream, truncate the garbage from history, inject a corrective nudge, then continue\",\n\t},\n\t{\n\t\tname: CONTROL_LEAK_RULE_NAME,\n\t\tdetector: \"control-leak\",\n\t\tremediation: CONTROL_LEAK_REMEDIATION,\n\t\tsummary: \"abort the stream, replace the generation with an error shell, then resample via bounded provider retry\",\n\t},\n];\n\nexport function registerTtsrCommands(pi: ExtensionAPI, getState: () => TtsrPublicState): void {\n\tpi.registerCommand(\"ttsr\", {\n\t\tdescription: \"Show TTSR stream-rule status: builtin detectors, user rules, injected rules.\",\n\t\thandler: async (_args, ctx) => {\n\t\t\tctx.ui.notify(formatTtsrStatus(getState()), \"info\");\n\t\t},\n\t});\n}\n\nfunction formatTtsrStatus(state: TtsrPublicState): string {\n\treturn [\n\t\t\"TTSR stream rules\",\n\t\t\"\",\n\t\t\"STATUS\",\n\t\tstate.disabled ? \"disabled (ttsr-disabled flag set)\" : \"enabled\",\n\t\t\"\",\n\t\t\"BUILTIN RULES\",\n\t\t...BUILTIN_RULES.map(formatBuiltinRule),\n\t\t\"\",\n\t\t\"USER RULES\",\n\t\t...formatUserRules(state.rules),\n\t\t\"\",\n\t\t\"INJECTED\",\n\t\tstate.injectedRuleNames.length === 0 ? \"(none)\" : state.injectedRuleNames.join(\", \"),\n\t].join(\"\\n\");\n}\n\nfunction formatBuiltinRule(rule: BuiltinRuleStatus): string {\n\treturn [\n\t\t`${rule.name} [detector: ${rule.detector}]`,\n\t\t`remediation: ${rule.summary}`,\n\t\t`(mode: ${rule.remediation.retryMode}, scope: ${rule.remediation.corruptionScope})`,\n\t].join(\" \");\n}\n\nfunction formatUserRules(rules: readonly TtsrRule[]): string[] {\n\tif (rules.length === 0) return [\"(none)\"];\n\treturn rules.map((rule) => `${rule.name} [${rule.source}, scope: ${formatScope(rule.scope)}]`);\n}\n\nfunction formatScope(scope: TtsrScope): string {\n\tconst parts: string[] = [];\n\tif (scope.allowText) parts.push(\"text\");\n\tif (scope.allowThinking) parts.push(\"thinking\");\n\tfor (const toolScope of scope.toolScopes) {\n\t\tparts.push(\n\t\t\ttoolScope.pathGlob === undefined\n\t\t\t\t? `tool:${toolScope.toolName}`\n\t\t\t\t: `tool:${toolScope.toolName}(${toolScope.pathGlob})`,\n\t\t);\n\t}\n\treturn parts.length === 0 ? \"none\" : parts.join(\"+\");\n}\n"]}
1
+ {"version":3,"file":"commands.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/ttsr/commands.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AAC1E,OAAO,EACN,oBAAoB,EACpB,wBAAwB,GAIxB,MAAM,YAAY,CAAC;AAepB,MAAM,aAAa,GAAiC;IACnD;QACC,IAAI,EAAE,kBAAkB;QACxB,QAAQ,EAAE,UAAU;QACpB,WAAW,EAAE,oBAAoB;QACjC,OAAO,EAAE,+FAA+F;KACxG;IACD;QACC,IAAI,EAAE,sBAAsB;QAC5B,QAAQ,EAAE,cAAc;QACxB,WAAW,EAAE,wBAAwB;QACrC,OAAO,EAAE,wGAAwG;KACjH;CACD,CAAC;AAEF,MAAM,UAAU,oBAAoB,CAAC,EAAgB,EAAE,QAA+B;IACrF,EAAE,CAAC,eAAe,CAAC,MAAM,EAAE;QAC1B,WAAW,EAAE,8EAA8E;QAC3F,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;YAC7B,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;QACrD,CAAC;KACD,CAAC,CAAC;AACJ,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAsB;IAC/C,MAAM,YAAY,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC;IAC7E,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC;IAC1E,OAAO;QACN,mBAAmB;QACnB,EAAE;QACF,QAAQ;QACR,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,mCAAmC,CAAC,CAAC,CAAC,SAAS;QAChE,EAAE;QACF,eAAe;QACf,WAAW;QACX,GAAG,aAAa,CAAC,GAAG,CAAC,iBAAiB,CAAC;QACvC,cAAc;QACd,GAAG,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;QACvF,EAAE;QACF,YAAY;QACZ,GAAG,eAAe,CAAC,SAAS,CAAC;QAC7B,EAAE;QACF,UAAU;QACV,KAAK,CAAC,iBAAiB,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC;KACpF,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACd,CAAC;AAED,SAAS,iBAAiB,CAAC,IAAuB;IACjD,OAAO;QACN,GAAG,IAAI,CAAC,IAAI,eAAe,IAAI,CAAC,QAAQ,GAAG;QAC3C,gBAAgB,IAAI,CAAC,OAAO,EAAE;QAC9B,UAAU,IAAI,CAAC,WAAW,CAAC,SAAS,YAAY,IAAI,CAAC,WAAW,CAAC,eAAe,GAAG;KACnF,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACb,CAAC;AAED,SAAS,uBAAuB,CAAC,IAAc;IAC9C,OAAO,GAAG,IAAI,CAAC,IAAI,yBAAyB,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC;AACxE,CAAC;AAED,SAAS,eAAe,CAAC,KAA0B;IAClD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC1C,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,MAAM,YAAY,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;AAChG,CAAC;AAED,SAAS,WAAW,CAAC,KAAgB;IACpC,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,KAAK,CAAC,SAAS;QAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACxC,IAAI,KAAK,CAAC,aAAa;QAAE,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAChD,KAAK,MAAM,SAAS,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;QAC1C,KAAK,CAAC,IAAI,CACT,SAAS,CAAC,QAAQ,KAAK,SAAS;YAC/B,CAAC,CAAC,QAAQ,SAAS,CAAC,QAAQ,EAAE;YAC9B,CAAC,CAAC,QAAQ,SAAS,CAAC,QAAQ,IAAI,SAAS,CAAC,QAAQ,GAAG,CACtD,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACtD,CAAC","sourcesContent":["import type { ExtensionAPI } from \"../../types.ts\";\nimport { COLLAPSE_RULE_NAME, CONTROL_LEAK_RULE_NAME } from \"./prompts.ts\";\nimport {\n\tCOLLAPSE_REMEDIATION,\n\tCONTROL_LEAK_REMEDIATION,\n\ttype RuleRemediation,\n\ttype TtsrRule,\n\ttype TtsrScope,\n} from \"./types.ts\";\n\nexport interface TtsrPublicState {\n\treadonly rules: readonly TtsrRule[];\n\treadonly injectedRuleNames: readonly string[];\n\treadonly disabled: boolean;\n}\n\ninterface BuiltinRuleStatus {\n\treadonly name: string;\n\treadonly detector: string;\n\treadonly remediation: RuleRemediation;\n\treadonly summary: string;\n}\n\nconst BUILTIN_RULES: readonly BuiltinRuleStatus[] = [\n\t{\n\t\tname: COLLAPSE_RULE_NAME,\n\t\tdetector: \"collapse\",\n\t\tremediation: COLLAPSE_REMEDIATION,\n\t\tsummary: \"abort the stream, truncate the garbage from history, inject a corrective nudge, then continue\",\n\t},\n\t{\n\t\tname: CONTROL_LEAK_RULE_NAME,\n\t\tdetector: \"control-leak\",\n\t\tremediation: CONTROL_LEAK_REMEDIATION,\n\t\tsummary: \"abort the stream, replace the generation with an error shell, then resample via bounded provider retry\",\n\t},\n];\n\nexport function registerTtsrCommands(pi: ExtensionAPI, getState: () => TtsrPublicState): void {\n\tpi.registerCommand(\"ttsr\", {\n\t\tdescription: \"Show TTSR stream-rule status: builtin detectors, user rules, injected rules.\",\n\t\thandler: async (_args, ctx) => {\n\t\t\tctx.ui.notify(formatTtsrStatus(getState()), \"info\");\n\t\t},\n\t});\n}\n\nfunction formatTtsrStatus(state: TtsrPublicState): string {\n\tconst builtinRules = state.rules.filter((rule) => rule.source === \"builtin\");\n\tconst userRules = state.rules.filter((rule) => rule.source !== \"builtin\");\n\treturn [\n\t\t\"TTSR stream rules\",\n\t\t\"\",\n\t\t\"STATUS\",\n\t\tstate.disabled ? \"disabled (ttsr-disabled flag set)\" : \"enabled\",\n\t\t\"\",\n\t\t\"BUILTIN RULES\",\n\t\t\"DETECTORS\",\n\t\t...BUILTIN_RULES.map(formatBuiltinRule),\n\t\t\"STREAM RULES\",\n\t\t...(builtinRules.length === 0 ? [\"(none)\"] : builtinRules.map(formatBuiltinStreamRule)),\n\t\t\"\",\n\t\t\"USER RULES\",\n\t\t...formatUserRules(userRules),\n\t\t\"\",\n\t\t\"INJECTED\",\n\t\tstate.injectedRuleNames.length === 0 ? \"(none)\" : state.injectedRuleNames.join(\", \"),\n\t].join(\"\\n\");\n}\n\nfunction formatBuiltinRule(rule: BuiltinRuleStatus): string {\n\treturn [\n\t\t`${rule.name} [detector: ${rule.detector}]`,\n\t\t`remediation: ${rule.summary}`,\n\t\t`(mode: ${rule.remediation.retryMode}, scope: ${rule.remediation.corruptionScope})`,\n\t].join(\" \");\n}\n\nfunction formatBuiltinStreamRule(rule: TtsrRule): string {\n\treturn `${rule.name} [stream rule, scope: ${formatScope(rule.scope)}]`;\n}\n\nfunction formatUserRules(rules: readonly TtsrRule[]): string[] {\n\tif (rules.length === 0) return [\"(none)\"];\n\treturn rules.map((rule) => `${rule.name} [${rule.source}, scope: ${formatScope(rule.scope)}]`);\n}\n\nfunction formatScope(scope: TtsrScope): string {\n\tconst parts: string[] = [];\n\tif (scope.allowText) parts.push(\"text\");\n\tif (scope.allowThinking) parts.push(\"thinking\");\n\tfor (const toolScope of scope.toolScopes) {\n\t\tparts.push(\n\t\t\ttoolScope.pathGlob === undefined\n\t\t\t\t? `tool:${toolScope.toolName}`\n\t\t\t\t: `tool:${toolScope.toolName}(${toolScope.pathGlob})`,\n\t\t);\n\t}\n\treturn parts.length === 0 ? \"none\" : parts.join(\"+\");\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/ttsr/index.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAwC,MAAM,gBAAgB,CAAC;AAmDzF,MAAM,CAAC,OAAO,UAAU,aAAa,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CA4L5D"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/ttsr/index.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAwC,MAAM,gBAAgB,CAAC;AAoDzF,MAAM,CAAC,OAAO,UAAU,aAAa,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CA6L5D"}
@@ -1,4 +1,5 @@
1
1
  import { getKeybindings } from "@earendil-works/pi-tui";
2
+ import { BUILTIN_TTSR_RULES } from "./builtin-rules.js";
2
3
  import { registerTtsrCommands } from "./commands.js";
3
4
  import { claimAbort, createGenerationState, markUserCancelled } from "./coordinator.js";
4
5
  import { discoverTtsrRulesSync } from "./discovery.js";
@@ -88,6 +89,9 @@ export default function ttsrExtension(pi) {
88
89
  return Array.isArray(rules) ? rules.filter((rule) => typeof rule === "string") : [];
89
90
  });
90
91
  manager.restoreInjected(injectedNames);
92
+ for (const rule of BUILTIN_TTSR_RULES) {
93
+ manager.addRule(rule);
94
+ }
91
95
  const discovered = discoverTtsrRulesSync(ctx.cwd);
92
96
  for (const rule of discovered.rules) {
93
97
  manager.addRule(rule);
@@ -143,12 +147,9 @@ export default function ttsrExtension(pi) {
143
147
  const source = deltaEvent.type === "text_delta" ? "text" : "thinking";
144
148
  const streamKey = `${source}:${String(deltaEvent.contentIndex)}`;
145
149
  const outcome = watcher.handleDelta(source, streamKey, deltaEvent.delta, generation);
146
- if (outcome.resolution !== null)
147
- console.log("TTSRDBG claim pre:", genState.abortClaimed, genState.userCancelled);
148
150
  if (outcome.resolution !== null && claimAbort(genState, outcome.resolution)) {
149
151
  pendingRemediation = { resolution: outcome.resolution, streamKind: source };
150
152
  notify(ctx, outcome.resolution.owner);
151
- console.log("TTSRDBG abort call");
152
153
  ctx.abort();
153
154
  return;
154
155
  }