@code-yeongyu/senpi 2026.9.24-3 → 2026.9.25

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 (256) hide show
  1. package/CHANGELOG.md +26 -0
  2. package/dist/bundle/chunks/{app-server-command-OTRHYRIB.js → app-server-command-RB6QUPRI.js} +1 -1
  3. package/dist/bundle/chunks/{chunk-UM43CBL4.js → chunk-JJ3NJZBD.js} +118 -111
  4. package/dist/bundle/chunks/chunk-SGYEOIOJ.js +8 -0
  5. package/dist/bundle/chunks/chunk-YS5YEX4S.js +2 -0
  6. package/dist/bundle/chunks/{cli-main-TX6I4X4F.js → cli-main-KO53KYDN.js} +1 -1
  7. package/dist/bundle/chunks/{interactive-mode-UI5Q6FGY.js → interactive-mode-ABDNLJSI.js} +1 -1
  8. package/dist/bundle/chunks/{multi-session-host-D6HMI3RQ.js → multi-session-host-JV3MNWXZ.js} +1 -1
  9. package/dist/bundle/chunks/{package-manager-cli-3UWH3ZZS.js → package-manager-cli-ZYYAVCXU.js} +1 -1
  10. package/dist/bundle/chunks/{rpc-mode-LXIZHJSJ.js → rpc-mode-Q2OUJURB.js} +1 -1
  11. package/dist/bundle/chunks/runtime-session-XBT646O5.js +2 -0
  12. package/dist/bundle/chunks/session-worker.js +184 -177
  13. package/dist/bundle/cli.js +1 -1
  14. package/dist/bundle/index.js +1 -1
  15. package/dist/bundle/rpc-entry.js +1 -1
  16. package/dist/core/agent-session.d.ts.map +1 -1
  17. package/dist/core/agent-session.js +1 -1
  18. package/dist/core/agent-session.js.map +1 -1
  19. package/dist/core/extensions/builtin/cursor-cli-oauth/stream.d.ts +7 -0
  20. package/dist/core/extensions/builtin/cursor-cli-oauth/stream.d.ts.map +1 -1
  21. package/dist/core/extensions/builtin/cursor-cli-oauth/stream.js +23 -4
  22. package/dist/core/extensions/builtin/cursor-cli-oauth/stream.js.map +1 -1
  23. package/dist/core/extensions/builtin/terminal/durable-command.d.ts +11 -16
  24. package/dist/core/extensions/builtin/terminal/durable-command.d.ts.map +1 -1
  25. package/dist/core/extensions/builtin/terminal/durable-command.js +97 -43
  26. package/dist/core/extensions/builtin/terminal/durable-command.js.map +1 -1
  27. package/dist/core/extensions/builtin/terminal/durable-file.d.ts.map +1 -1
  28. package/dist/core/extensions/builtin/terminal/durable-file.js +11 -4
  29. package/dist/core/extensions/builtin/terminal/durable-file.js.map +1 -1
  30. package/dist/core/extensions/builtin/terminal/extension-state.d.ts +26 -0
  31. package/dist/core/extensions/builtin/terminal/extension-state.d.ts.map +1 -0
  32. package/dist/core/extensions/builtin/terminal/extension-state.js +151 -0
  33. package/dist/core/extensions/builtin/terminal/extension-state.js.map +1 -0
  34. package/dist/core/extensions/builtin/terminal/extension.d.ts.map +1 -1
  35. package/dist/core/extensions/builtin/terminal/extension.js +32 -308
  36. package/dist/core/extensions/builtin/terminal/extension.js.map +1 -1
  37. package/dist/core/extensions/builtin/terminal/lease-file.d.ts +52 -0
  38. package/dist/core/extensions/builtin/terminal/lease-file.d.ts.map +1 -0
  39. package/dist/core/extensions/builtin/terminal/lease-file.js +205 -0
  40. package/dist/core/extensions/builtin/terminal/lease-file.js.map +1 -0
  41. package/dist/core/extensions/builtin/terminal/lease-keeper.d.ts +33 -0
  42. package/dist/core/extensions/builtin/terminal/lease-keeper.d.ts.map +1 -0
  43. package/dist/core/extensions/builtin/terminal/lease-keeper.js +110 -0
  44. package/dist/core/extensions/builtin/terminal/lease-keeper.js.map +1 -0
  45. package/dist/core/extensions/builtin/terminal/manager.d.ts +1 -0
  46. package/dist/core/extensions/builtin/terminal/manager.d.ts.map +1 -1
  47. package/dist/core/extensions/builtin/terminal/manager.js +6 -0
  48. package/dist/core/extensions/builtin/terminal/manager.js.map +1 -1
  49. package/dist/core/extensions/builtin/terminal/manifest-lease.d.ts +48 -4
  50. package/dist/core/extensions/builtin/terminal/manifest-lease.d.ts.map +1 -1
  51. package/dist/core/extensions/builtin/terminal/manifest-lease.js +141 -59
  52. package/dist/core/extensions/builtin/terminal/manifest-lease.js.map +1 -1
  53. package/dist/core/extensions/builtin/terminal/monitor-registry.d.ts +2 -0
  54. package/dist/core/extensions/builtin/terminal/monitor-registry.d.ts.map +1 -1
  55. package/dist/core/extensions/builtin/terminal/monitor-registry.js +15 -10
  56. package/dist/core/extensions/builtin/terminal/monitor-registry.js.map +1 -1
  57. package/dist/core/extensions/builtin/terminal/monitor-state-dir.d.ts +11 -0
  58. package/dist/core/extensions/builtin/terminal/monitor-state-dir.d.ts.map +1 -0
  59. package/dist/core/extensions/builtin/terminal/monitor-state-dir.js +28 -0
  60. package/dist/core/extensions/builtin/terminal/monitor-state-dir.js.map +1 -0
  61. package/dist/core/extensions/builtin/terminal/orphan-reaper.d.ts +41 -0
  62. package/dist/core/extensions/builtin/terminal/orphan-reaper.d.ts.map +1 -0
  63. package/dist/core/extensions/builtin/terminal/orphan-reaper.js +131 -0
  64. package/dist/core/extensions/builtin/terminal/orphan-reaper.js.map +1 -0
  65. package/dist/core/extensions/builtin/terminal/process-identity.d.ts +21 -0
  66. package/dist/core/extensions/builtin/terminal/process-identity.d.ts.map +1 -0
  67. package/dist/core/extensions/builtin/terminal/process-identity.js +34 -0
  68. package/dist/core/extensions/builtin/terminal/process-identity.js.map +1 -0
  69. package/dist/core/extensions/builtin/terminal/process-start-probe.d.ts +6 -0
  70. package/dist/core/extensions/builtin/terminal/process-start-probe.d.ts.map +1 -0
  71. package/dist/core/extensions/builtin/terminal/process-start-probe.js +60 -0
  72. package/dist/core/extensions/builtin/terminal/process-start-probe.js.map +1 -0
  73. package/dist/core/extensions/builtin/terminal/prompt.d.ts.map +1 -1
  74. package/dist/core/extensions/builtin/terminal/prompt.js +8 -4
  75. package/dist/core/extensions/builtin/terminal/prompt.js.map +1 -1
  76. package/dist/core/extensions/builtin/terminal/restore-digest.d.ts +54 -0
  77. package/dist/core/extensions/builtin/terminal/restore-digest.d.ts.map +1 -0
  78. package/dist/core/extensions/builtin/terminal/restore-digest.js +133 -0
  79. package/dist/core/extensions/builtin/terminal/restore-digest.js.map +1 -0
  80. package/dist/core/extensions/builtin/terminal/restore-session.d.ts +56 -0
  81. package/dist/core/extensions/builtin/terminal/restore-session.d.ts.map +1 -0
  82. package/dist/core/extensions/builtin/terminal/restore-session.js +238 -0
  83. package/dist/core/extensions/builtin/terminal/restore-session.js.map +1 -0
  84. package/dist/core/extensions/builtin/terminal/restore.d.ts +52 -19
  85. package/dist/core/extensions/builtin/terminal/restore.d.ts.map +1 -1
  86. package/dist/core/extensions/builtin/terminal/restore.js +63 -138
  87. package/dist/core/extensions/builtin/terminal/restore.js.map +1 -1
  88. package/dist/core/extensions/builtin/terminal/runtime-session.d.ts +5 -0
  89. package/dist/core/extensions/builtin/terminal/runtime-session.d.ts.map +1 -1
  90. package/dist/core/extensions/builtin/terminal/runtime-session.js +17 -0
  91. package/dist/core/extensions/builtin/terminal/runtime-session.js.map +1 -1
  92. package/dist/core/extensions/builtin/terminal/session-activity.d.ts +8 -0
  93. package/dist/core/extensions/builtin/terminal/session-activity.d.ts.map +1 -0
  94. package/dist/core/extensions/builtin/terminal/session-activity.js +41 -0
  95. package/dist/core/extensions/builtin/terminal/session-activity.js.map +1 -0
  96. package/dist/core/extensions/builtin/terminal/shared.d.ts +14 -0
  97. package/dist/core/extensions/builtin/terminal/shared.d.ts.map +1 -1
  98. package/dist/core/extensions/builtin/terminal/shared.js +14 -0
  99. package/dist/core/extensions/builtin/terminal/shared.js.map +1 -1
  100. package/dist/core/extensions/builtin/terminal/terminal-manifest-model.d.ts +8 -0
  101. package/dist/core/extensions/builtin/terminal/terminal-manifest-model.d.ts.map +1 -1
  102. package/dist/core/extensions/builtin/terminal/terminal-manifest-model.js.map +1 -1
  103. package/dist/core/extensions/builtin/terminal/terminal-manifest-parse.d.ts +15 -0
  104. package/dist/core/extensions/builtin/terminal/terminal-manifest-parse.d.ts.map +1 -0
  105. package/dist/core/extensions/builtin/terminal/terminal-manifest-parse.js +148 -0
  106. package/dist/core/extensions/builtin/terminal/terminal-manifest-parse.js.map +1 -0
  107. package/dist/core/extensions/builtin/terminal/terminal-manifest.d.ts +15 -2
  108. package/dist/core/extensions/builtin/terminal/terminal-manifest.d.ts.map +1 -1
  109. package/dist/core/extensions/builtin/terminal/terminal-manifest.js +62 -11
  110. package/dist/core/extensions/builtin/terminal/terminal-manifest.js.map +1 -1
  111. package/dist/core/extensions/builtin/terminal/terminal-state-gc.d.ts +17 -0
  112. package/dist/core/extensions/builtin/terminal/terminal-state-gc.d.ts.map +1 -0
  113. package/dist/core/extensions/builtin/terminal/terminal-state-gc.js +81 -0
  114. package/dist/core/extensions/builtin/terminal/terminal-state-gc.js.map +1 -0
  115. package/dist/core/extensions/builtin/terminal/tools/context.d.ts +5 -0
  116. package/dist/core/extensions/builtin/terminal/tools/context.d.ts.map +1 -1
  117. package/dist/core/extensions/builtin/terminal/tools/context.js.map +1 -1
  118. package/dist/core/extensions/builtin/terminal/tools/kill-bash.d.ts.map +1 -1
  119. package/dist/core/extensions/builtin/terminal/tools/kill-bash.js +16 -1
  120. package/dist/core/extensions/builtin/terminal/tools/kill-bash.js.map +1 -1
  121. package/dist/core/extensions/builtin/terminal/tools/monitor-manifest-binding.d.ts +27 -0
  122. package/dist/core/extensions/builtin/terminal/tools/monitor-manifest-binding.d.ts.map +1 -0
  123. package/dist/core/extensions/builtin/terminal/tools/monitor-manifest-binding.js +75 -0
  124. package/dist/core/extensions/builtin/terminal/tools/monitor-manifest-binding.js.map +1 -0
  125. package/dist/core/extensions/builtin/terminal/tools/monitor-schema.d.ts +35 -0
  126. package/dist/core/extensions/builtin/terminal/tools/monitor-schema.d.ts.map +1 -0
  127. package/dist/core/extensions/builtin/terminal/tools/monitor-schema.js +67 -0
  128. package/dist/core/extensions/builtin/terminal/tools/monitor-schema.js.map +1 -0
  129. package/dist/core/extensions/builtin/terminal/tools/monitor.d.ts +14 -35
  130. package/dist/core/extensions/builtin/terminal/tools/monitor.d.ts.map +1 -1
  131. package/dist/core/extensions/builtin/terminal/tools/monitor.js +30 -110
  132. package/dist/core/extensions/builtin/terminal/tools/monitor.js.map +1 -1
  133. package/dist/core/extensions/builtin/todotools/first-turn.d.ts +7 -6
  134. package/dist/core/extensions/builtin/todotools/first-turn.d.ts.map +1 -1
  135. package/dist/core/extensions/builtin/todotools/first-turn.js +8 -8
  136. package/dist/core/extensions/builtin/todotools/first-turn.js.map +1 -1
  137. package/dist/core/extensions/builtin/todotools/index.js +1 -1
  138. package/dist/core/extensions/builtin/todotools/index.js.map +1 -1
  139. package/dist/core/extensions/builtin/todotools/todo-format.js +1 -1
  140. package/dist/core/extensions/builtin/todotools/todo-format.js.map +1 -1
  141. package/dist/core/extensions/builtin/ttsr/detectors/repetitive-turns.d.ts.map +1 -1
  142. package/dist/core/extensions/builtin/ttsr/detectors/repetitive-turns.js +4 -0
  143. package/dist/core/extensions/builtin/ttsr/detectors/repetitive-turns.js.map +1 -1
  144. package/dist/core/extensions/builtin/ttsr/prompts.js +1 -1
  145. package/dist/core/extensions/builtin/ttsr/prompts.js.map +1 -1
  146. package/dist/core/extensions/runner.d.ts +1 -0
  147. package/dist/core/extensions/runner.d.ts.map +1 -1
  148. package/dist/core/extensions/runner.js +1 -0
  149. package/dist/core/extensions/runner.js.map +1 -1
  150. package/dist/core/extensions/types.d.ts +6 -0
  151. package/dist/core/extensions/types.d.ts.map +1 -1
  152. package/dist/core/extensions/types.js.map +1 -1
  153. package/docs/extensions.md +2 -0
  154. package/node_modules/@code-yeongyu/senpi-codemode/CHANGELOG.md +12 -0
  155. package/node_modules/@code-yeongyu/senpi-codemode/package.json +4 -4
  156. package/node_modules/@code-yeongyu/senpi-desktop-engine/README.md +31 -0
  157. package/node_modules/@code-yeongyu/senpi-desktop-engine/dist/handshake.d.ts +38 -0
  158. package/node_modules/@code-yeongyu/senpi-desktop-engine/dist/handshake.d.ts.map +1 -0
  159. package/node_modules/@code-yeongyu/senpi-desktop-engine/dist/handshake.js +117 -0
  160. package/node_modules/@code-yeongyu/senpi-desktop-engine/dist/handshake.js.map +1 -0
  161. package/node_modules/@code-yeongyu/senpi-desktop-engine/dist/index.d.ts +3 -0
  162. package/node_modules/@code-yeongyu/senpi-desktop-engine/dist/index.d.ts.map +1 -0
  163. package/node_modules/@code-yeongyu/senpi-desktop-engine/dist/index.js +3 -0
  164. package/node_modules/@code-yeongyu/senpi-desktop-engine/dist/index.js.map +1 -0
  165. package/node_modules/@code-yeongyu/senpi-desktop-engine/dist/locator.d.ts +42 -0
  166. package/node_modules/@code-yeongyu/senpi-desktop-engine/dist/locator.d.ts.map +1 -0
  167. package/node_modules/@code-yeongyu/senpi-desktop-engine/dist/locator.js +79 -0
  168. package/node_modules/@code-yeongyu/senpi-desktop-engine/dist/locator.js.map +1 -0
  169. package/node_modules/@code-yeongyu/senpi-desktop-engine/native/check-prebuild-fresh.mjs +160 -0
  170. package/node_modules/@code-yeongyu/senpi-desktop-engine/native/index.d.ts +20 -0
  171. package/node_modules/@code-yeongyu/senpi-desktop-engine/native/index.js +23 -0
  172. package/node_modules/@code-yeongyu/senpi-desktop-engine/native/prebuilds/darwin-arm64/senpi-desktop-engine +0 -0
  173. package/node_modules/@code-yeongyu/senpi-desktop-engine/package.json +53 -0
  174. package/node_modules/@code-yeongyu/senpi-desktop-prelude/README.md +20 -0
  175. package/node_modules/@code-yeongyu/senpi-desktop-prelude/dist/index.d.ts +2 -0
  176. package/node_modules/@code-yeongyu/senpi-desktop-prelude/dist/index.d.ts.map +1 -0
  177. package/node_modules/@code-yeongyu/senpi-desktop-prelude/dist/index.js +2 -0
  178. package/node_modules/@code-yeongyu/senpi-desktop-prelude/dist/index.js.map +1 -0
  179. package/node_modules/@code-yeongyu/senpi-desktop-prelude/package.json +44 -0
  180. package/node_modules/@code-yeongyu/senpi-desktop-protocol/README.md +20 -0
  181. package/node_modules/@code-yeongyu/senpi-desktop-protocol/dist/audit.d.ts +38 -0
  182. package/node_modules/@code-yeongyu/senpi-desktop-protocol/dist/audit.d.ts.map +1 -0
  183. package/node_modules/@code-yeongyu/senpi-desktop-protocol/dist/audit.js +2 -0
  184. package/node_modules/@code-yeongyu/senpi-desktop-protocol/dist/audit.js.map +1 -0
  185. package/node_modules/@code-yeongyu/senpi-desktop-protocol/dist/call.d.ts +28 -0
  186. package/node_modules/@code-yeongyu/senpi-desktop-protocol/dist/call.d.ts.map +1 -0
  187. package/node_modules/@code-yeongyu/senpi-desktop-protocol/dist/call.js +102 -0
  188. package/node_modules/@code-yeongyu/senpi-desktop-protocol/dist/call.js.map +1 -0
  189. package/node_modules/@code-yeongyu/senpi-desktop-protocol/dist/engine-schema.generated.d.ts +14 -0
  190. package/node_modules/@code-yeongyu/senpi-desktop-protocol/dist/engine-schema.generated.d.ts.map +1 -0
  191. package/node_modules/@code-yeongyu/senpi-desktop-protocol/dist/engine-schema.generated.js +71 -0
  192. package/node_modules/@code-yeongyu/senpi-desktop-protocol/dist/engine-schema.generated.js.map +1 -0
  193. package/node_modules/@code-yeongyu/senpi-desktop-protocol/dist/index.d.ts +7 -0
  194. package/node_modules/@code-yeongyu/senpi-desktop-protocol/dist/index.d.ts.map +1 -0
  195. package/node_modules/@code-yeongyu/senpi-desktop-protocol/dist/index.js +4 -0
  196. package/node_modules/@code-yeongyu/senpi-desktop-protocol/dist/index.js.map +1 -0
  197. package/node_modules/@code-yeongyu/senpi-desktop-protocol/dist/json-rpc.d.ts +66 -0
  198. package/node_modules/@code-yeongyu/senpi-desktop-protocol/dist/json-rpc.d.ts.map +1 -0
  199. package/node_modules/@code-yeongyu/senpi-desktop-protocol/dist/json-rpc.js +8 -0
  200. package/node_modules/@code-yeongyu/senpi-desktop-protocol/dist/json-rpc.js.map +1 -0
  201. package/node_modules/@code-yeongyu/senpi-desktop-protocol/dist/session.d.ts +44 -0
  202. package/node_modules/@code-yeongyu/senpi-desktop-protocol/dist/session.d.ts.map +1 -0
  203. package/node_modules/@code-yeongyu/senpi-desktop-protocol/dist/session.js +2 -0
  204. package/node_modules/@code-yeongyu/senpi-desktop-protocol/dist/session.js.map +1 -0
  205. package/node_modules/@code-yeongyu/senpi-desktop-protocol/dist/wire.d.ts +59 -0
  206. package/node_modules/@code-yeongyu/senpi-desktop-protocol/dist/wire.d.ts.map +1 -0
  207. package/node_modules/@code-yeongyu/senpi-desktop-protocol/dist/wire.js +2 -0
  208. package/node_modules/@code-yeongyu/senpi-desktop-protocol/dist/wire.js.map +1 -0
  209. package/node_modules/@code-yeongyu/senpi-desktop-protocol/package.json +45 -0
  210. package/node_modules/@code-yeongyu/senpi-desktop-service/README.md +27 -0
  211. package/node_modules/@code-yeongyu/senpi-desktop-service/dist/index.d.ts +2 -0
  212. package/node_modules/@code-yeongyu/senpi-desktop-service/dist/index.d.ts.map +1 -0
  213. package/node_modules/@code-yeongyu/senpi-desktop-service/dist/index.js +2 -0
  214. package/node_modules/@code-yeongyu/senpi-desktop-service/dist/index.js.map +1 -0
  215. package/node_modules/@code-yeongyu/senpi-desktop-service/package.json +44 -0
  216. package/node_modules/@code-yeongyu/senpi-desktop-tool/README.md +20 -0
  217. package/node_modules/@code-yeongyu/senpi-desktop-tool/dist/index.d.ts +2 -0
  218. package/node_modules/@code-yeongyu/senpi-desktop-tool/dist/index.d.ts.map +1 -0
  219. package/node_modules/@code-yeongyu/senpi-desktop-tool/dist/index.js +2 -0
  220. package/node_modules/@code-yeongyu/senpi-desktop-tool/dist/index.js.map +1 -0
  221. package/node_modules/@code-yeongyu/senpi-desktop-tool/package.json +44 -0
  222. package/node_modules/@earendil-works/pi-agent-core/package.json +3 -3
  223. package/node_modules/@earendil-works/pi-ai/dist/providers/data/.manifest.json +1 -1
  224. package/node_modules/@earendil-works/pi-ai/dist/providers/data/cerebras.json +1 -1
  225. package/node_modules/@earendil-works/pi-ai/dist/providers/data/openrouter.json +1 -1
  226. package/node_modules/@earendil-works/pi-ai/dist/providers/data/vercel-ai-gateway.json +1 -1
  227. package/node_modules/@earendil-works/pi-ai/package.json +2 -2
  228. package/node_modules/@earendil-works/pi-pty/dist/pipe-fallback.d.ts +2 -0
  229. package/node_modules/@earendil-works/pi-pty/dist/pipe-fallback.d.ts.map +1 -1
  230. package/node_modules/@earendil-works/pi-pty/dist/pipe-fallback.js +6 -0
  231. package/node_modules/@earendil-works/pi-pty/dist/pipe-fallback.js.map +1 -1
  232. package/node_modules/@earendil-works/pi-pty/dist/session-bun.d.ts +1 -0
  233. package/node_modules/@earendil-works/pi-pty/dist/session-bun.d.ts.map +1 -1
  234. package/node_modules/@earendil-works/pi-pty/dist/session-bun.js +1 -0
  235. package/node_modules/@earendil-works/pi-pty/dist/session-bun.js.map +1 -1
  236. package/node_modules/@earendil-works/pi-pty/dist/session-native.js +5 -0
  237. package/node_modules/@earendil-works/pi-pty/dist/session-native.js.map +1 -1
  238. package/node_modules/@earendil-works/pi-pty/dist/session-raw-tail.d.ts +11 -0
  239. package/node_modules/@earendil-works/pi-pty/dist/session-raw-tail.d.ts.map +1 -0
  240. package/node_modules/@earendil-works/pi-pty/dist/session-raw-tail.js +24 -0
  241. package/node_modules/@earendil-works/pi-pty/dist/session-raw-tail.js.map +1 -0
  242. package/node_modules/@earendil-works/pi-pty/dist/session-types.d.ts +2 -0
  243. package/node_modules/@earendil-works/pi-pty/dist/session-types.d.ts.map +1 -1
  244. package/node_modules/@earendil-works/pi-pty/dist/session-types.js.map +1 -1
  245. package/node_modules/@earendil-works/pi-pty/dist/session.d.ts +4 -5
  246. package/node_modules/@earendil-works/pi-pty/dist/session.d.ts.map +1 -1
  247. package/node_modules/@earendil-works/pi-pty/dist/session.js +11 -16
  248. package/node_modules/@earendil-works/pi-pty/dist/session.js.map +1 -1
  249. package/node_modules/@earendil-works/pi-pty/native/prebuilds/darwin-arm64/senpi_pty.darwin-arm64.node +0 -0
  250. package/node_modules/@earendil-works/pi-pty/package.json +1 -1
  251. package/node_modules/@earendil-works/pi-telemetry/package.json +1 -1
  252. package/node_modules/@earendil-works/pi-tui/package.json +1 -1
  253. package/package.json +22 -7
  254. package/dist/bundle/chunks/chunk-GFUZPFHN.js +0 -2
  255. package/dist/bundle/chunks/chunk-JBOV6VNK.js +0 -8
  256. package/dist/bundle/chunks/runtime-session-F3EXC44D.js +0 -2
@@ -2,23 +2,24 @@ import type { Api, Model } from "@earendil-works/pi-ai";
2
2
  import type { SessionEntry } from "../../../session-manager.ts";
3
3
  import type { TodoFirstTurnPlan } from "../../../settings-shapes.ts";
4
4
  import type { ExtensionMode } from "../../types.ts";
5
- import type { TodoPhase } from "./todo-types.ts";
6
5
  export declare const FIRST_TURN_CUSTOM_TYPE = "senpi.todo-first-turn";
7
6
  export declare const FIRST_TURN_REMINDER = "<system-reminder>\nThis is the first request of the session. Before continuing, call the todo tool with op \"init\" and a phased list covering the whole request end to end: investigation, implementation, verification (diagnostics, tests, build, manual check), and the final report. Give every task a unique 5-10 word label; phase names are short noun phrases. Then continue the request in this same turn - the init is not a turn by itself.\n</system-reminder>";
8
7
  export type FirstTurnGateInput = {
9
8
  preview: boolean | undefined;
9
+ trigger: "prompt" | "extension";
10
10
  prompt: string;
11
11
  branchEntries: readonly SessionEntry[];
12
- phases: readonly TodoPhase[];
13
12
  todoActive: boolean;
14
13
  setting: TodoFirstTurnPlan;
15
14
  mode: ExtensionMode;
16
15
  };
17
16
  /**
18
- * Arms the first-turn plan opener only for a session's first real request that asks for work:
19
- * never in a preview, never once any user message is on the branch (`before_agent_start` fires
20
- * before the prompt is persisted), never over an existing list, never for a question or an
21
- * exclamation, and never in print/json runs.
17
+ * Arms the first-turn plan opener only for a session's first user-authored request that asks for
18
+ * work: never in a preview, never on a turn an extension triggered (senpi#2137), never once any
19
+ * user message is on the branch (`before_agent_start` fires before the prompt is persisted), never
20
+ * for a question or an exclamation, and never in print/json runs. Before the first user message a
21
+ * list can only come from an extension-triggered turn, so an existing list does not block the
22
+ * user's first request.
22
23
  */
23
24
  export declare function shouldArmFirstTurn(input: FirstTurnGateInput): boolean;
24
25
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"first-turn.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/todotools/first-turn.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAExD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAEjD,eAAO,MAAM,sBAAsB,0BAA0B,CAAC;AAE9D,eAAO,MAAM,mBAAmB,gdAEb,CAAC;AAOpB,MAAM,MAAM,kBAAkB,GAAG;IAChC,OAAO,EAAE,OAAO,GAAG,SAAS,CAAC;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,SAAS,YAAY,EAAE,CAAC;IACvC,MAAM,EAAE,SAAS,SAAS,EAAE,CAAC;IAC7B,UAAU,EAAE,OAAO,CAAC;IACpB,OAAO,EAAE,iBAAiB,CAAC;IAC3B,IAAI,EAAE,aAAa,CAAC;CACpB,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAOrE;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,SAAS,GAAG,OAAO,CAY9E;AAED,mGAAmG;AACnG,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,GAAG,GAAG,SAAS,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAWlH;AAgBD;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,SAAS,GAAG,OAAO,CAQ7F"}
1
+ {"version":3,"file":"first-turn.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/todotools/first-turn.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAExD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAEpD,eAAO,MAAM,sBAAsB,0BAA0B,CAAC;AAE9D,eAAO,MAAM,mBAAmB,gdAEb,CAAC;AAOpB,MAAM,MAAM,kBAAkB,GAAG;IAChC,OAAO,EAAE,OAAO,GAAG,SAAS,CAAC;IAC7B,OAAO,EAAE,QAAQ,GAAG,WAAW,CAAC;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,SAAS,YAAY,EAAE,CAAC;IACvC,UAAU,EAAE,OAAO,CAAC;IACpB,OAAO,EAAE,iBAAiB,CAAC;IAC3B,IAAI,EAAE,aAAa,CAAC;CACpB,CAAC;AAEF;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAMrE;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,SAAS,GAAG,OAAO,CAY9E;AAED,mGAAmG;AACnG,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,GAAG,GAAG,SAAS,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAWlH;AAgBD;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,SAAS,GAAG,OAAO,CAQ7F"}
@@ -7,22 +7,22 @@ This is the first request of the session. Before continuing, call the todo tool
7
7
  const NON_INTERACTIVE_MODES = new Set(["print", "json"]);
8
8
  const TRAILING_CLOSERS = /[\s"'`\u2018\u2019\u201C\u201D)\]}]+$/u;
9
9
  /**
10
- * Arms the first-turn plan opener only for a session's first real request that asks for work:
11
- * never in a preview, never once any user message is on the branch (`before_agent_start` fires
12
- * before the prompt is persisted), never over an existing list, never for a question or an
13
- * exclamation, and never in print/json runs.
10
+ * Arms the first-turn plan opener only for a session's first user-authored request that asks for
11
+ * work: never in a preview, never on a turn an extension triggered (senpi#2137), never once any
12
+ * user message is on the branch (`before_agent_start` fires before the prompt is persisted), never
13
+ * for a question or an exclamation, and never in print/json runs. Before the first user message a
14
+ * list can only come from an extension-triggered turn, so an existing list does not block the
15
+ * user's first request.
14
16
  */
15
17
  export function shouldArmFirstTurn(input) {
16
- if (input.preview || input.setting === "off" || !input.todoActive)
18
+ if (input.preview || input.trigger !== "prompt" || input.setting === "off" || !input.todoActive)
17
19
  return false;
18
20
  if (NON_INTERACTIVE_MODES.has(input.mode))
19
21
  return false;
20
22
  const request = input.prompt.trim().replace(TRAILING_CLOSERS, "");
21
23
  if (request === "" || /[?!\uFF1F\uFF01]$/u.test(request))
22
24
  return false;
23
- if (input.branchEntries.some((entry) => entry.type === "message" && entry.message.role === "user"))
24
- return false;
25
- return input.phases.every((phase) => phase.tasks.length === 0);
25
+ return !input.branchEntries.some((entry) => entry.type === "message" && entry.message.role === "user");
26
26
  }
27
27
  /**
28
28
  * Whether the request wire can name one tool in `tool_choice`. Anthropic reads the RESOLVED
@@ -1 +1 @@
1
- {"version":3,"file":"first-turn.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/todotools/first-turn.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Api, Model } from \"@earendil-works/pi-ai\";\nimport { getAnthropicCompat } from \"@earendil-works/pi-ai/utils/prompt-cache-ttl\";\nimport type { SessionEntry } from \"../../../session-manager.ts\";\nimport type { TodoFirstTurnPlan } from \"../../../settings-shapes.ts\";\nimport type { ExtensionMode } from \"../../types.ts\";\nimport type { TodoPhase } from \"./todo-types.ts\";\n\nexport const FIRST_TURN_CUSTOM_TYPE = \"senpi.todo-first-turn\";\n\nexport const FIRST_TURN_REMINDER = `<system-reminder>\nThis is the first request of the session. Before continuing, call the todo tool with op \"init\" and a phased list covering the whole request end to end: investigation, implementation, verification (diagnostics, tests, build, manual check), and the final report. Give every task a unique 5-10 word label; phase names are short noun phrases. Then continue the request in this same turn - the init is not a turn by itself.\n</system-reminder>`;\n\n/** One-shot, non-interactive runs; the same set `terminal/notify.ts` never wakes. */\nconst NON_INTERACTIVE_MODES: ReadonlySet<ExtensionMode> = new Set([\"print\", \"json\"]);\n\nconst TRAILING_CLOSERS = /[\\s\"'`\\u2018\\u2019\\u201C\\u201D)\\]}]+$/u;\n\nexport type FirstTurnGateInput = {\n\tpreview: boolean | undefined;\n\tprompt: string;\n\tbranchEntries: readonly SessionEntry[];\n\tphases: readonly TodoPhase[];\n\ttodoActive: boolean;\n\tsetting: TodoFirstTurnPlan;\n\tmode: ExtensionMode;\n};\n\n/**\n * Arms the first-turn plan opener only for a session's first real request that asks for work:\n * never in a preview, never once any user message is on the branch (`before_agent_start` fires\n * before the prompt is persisted), never over an existing list, never for a question or an\n * exclamation, and never in print/json runs.\n */\nexport function shouldArmFirstTurn(input: FirstTurnGateInput): boolean {\n\tif (input.preview || input.setting === \"off\" || !input.todoActive) return false;\n\tif (NON_INTERACTIVE_MODES.has(input.mode)) return false;\n\tconst request = input.prompt.trim().replace(TRAILING_CLOSERS, \"\");\n\tif (request === \"\" || /[?!\\uFF1F\\uFF01]$/u.test(request)) return false;\n\tif (input.branchEntries.some((entry) => entry.type === \"message\" && entry.message.role === \"user\")) return false;\n\treturn input.phases.every((phase) => phase.tasks.length === 0);\n}\n\n/**\n * Whether the request wire can name one tool in `tool_choice`. Anthropic reads the RESOLVED\n * compat (catalog models carry no `compat`, and the resolver applies the Fable / Mythos /\n * Opus 5.5 forced-choice default), never `model.compat` directly.\n */\nexport function supportsNamedToolChoice(model: Model<Api> | undefined): boolean {\n\tswitch (model?.api) {\n\t\tcase \"anthropic-messages\": {\n\t\t\tconst compat = getAnthropicCompat(model as Model<\"anthropic-messages\">);\n\t\t\treturn compat.supportsToolChoice !== false && compat.supportsForcedToolChoice !== false;\n\t\t}\n\t\tcase \"openai-responses\":\n\t\tcase \"openai-completions\":\n\t\t\treturn true;\n\t\tdefault:\n\t\t\treturn false;\n\t}\n}\n\n/** Wire shape of a `tool_choice` that forces `toolName`, or `undefined` for an unsupported api. */\nexport function namedToolChoicePayload(api: Api | undefined, toolName: string): Record<string, unknown> | undefined {\n\tswitch (api) {\n\t\tcase \"anthropic-messages\":\n\t\t\treturn { type: \"tool\", name: toolName };\n\t\tcase \"openai-responses\":\n\t\t\treturn { type: \"function\", name: toolName };\n\t\tcase \"openai-completions\":\n\t\t\treturn { type: \"function\", function: { name: toolName } };\n\t\tdefault:\n\t\t\treturn undefined;\n\t}\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null;\n}\n\nfunction declaresTool(tools: unknown, toolName: string): boolean {\n\treturn (\n\t\tArray.isArray(tools) &&\n\t\ttools.some(\n\t\t\t(tool) =>\n\t\t\t\tisRecord(tool) && (tool.name === toolName || (isRecord(tool.function) && tool.function.name === toolName)),\n\t\t)\n\t);\n}\n\n/**\n * The payload with a forced `todo` tool_choice, or `undefined` to leave it untouched: the\n * request must declare `todo`, carry no tool_choice of its own, and (Anthropic) not run\n * extended thinking, which rejects any forced tool use.\n */\nexport function withForcedTodoChoice(payload: unknown, model: Model<Api> | undefined): unknown {\n\tif (!supportsNamedToolChoice(model)) return undefined;\n\tconst toolChoice = namedToolChoicePayload(model?.api, \"todo\");\n\tif (!toolChoice || !isRecord(payload) || payload.tool_choice !== undefined) return undefined;\n\tif (!declaresTool(payload.tools, \"todo\")) return undefined;\n\tconst thinking = isRecord(payload.thinking) ? payload.thinking.type : undefined;\n\tif (model?.api === \"anthropic-messages\" && (thinking === \"enabled\" || thinking === \"adaptive\")) return undefined;\n\treturn { ...payload, tool_choice: toolChoice };\n}\n"]}
1
+ {"version":3,"file":"first-turn.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/todotools/first-turn.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Api, Model } from \"@earendil-works/pi-ai\";\nimport { getAnthropicCompat } from \"@earendil-works/pi-ai/utils/prompt-cache-ttl\";\nimport type { SessionEntry } from \"../../../session-manager.ts\";\nimport type { TodoFirstTurnPlan } from \"../../../settings-shapes.ts\";\nimport type { ExtensionMode } from \"../../types.ts\";\n\nexport const FIRST_TURN_CUSTOM_TYPE = \"senpi.todo-first-turn\";\n\nexport const FIRST_TURN_REMINDER = `<system-reminder>\nThis is the first request of the session. Before continuing, call the todo tool with op \"init\" and a phased list covering the whole request end to end: investigation, implementation, verification (diagnostics, tests, build, manual check), and the final report. Give every task a unique 5-10 word label; phase names are short noun phrases. Then continue the request in this same turn - the init is not a turn by itself.\n</system-reminder>`;\n\n/** One-shot, non-interactive runs; the same set `terminal/notify.ts` never wakes. */\nconst NON_INTERACTIVE_MODES: ReadonlySet<ExtensionMode> = new Set([\"print\", \"json\"]);\n\nconst TRAILING_CLOSERS = /[\\s\"'`\\u2018\\u2019\\u201C\\u201D)\\]}]+$/u;\n\nexport type FirstTurnGateInput = {\n\tpreview: boolean | undefined;\n\ttrigger: \"prompt\" | \"extension\";\n\tprompt: string;\n\tbranchEntries: readonly SessionEntry[];\n\ttodoActive: boolean;\n\tsetting: TodoFirstTurnPlan;\n\tmode: ExtensionMode;\n};\n\n/**\n * Arms the first-turn plan opener only for a session's first user-authored request that asks for\n * work: never in a preview, never on a turn an extension triggered (senpi#2137), never once any\n * user message is on the branch (`before_agent_start` fires before the prompt is persisted), never\n * for a question or an exclamation, and never in print/json runs. Before the first user message a\n * list can only come from an extension-triggered turn, so an existing list does not block the\n * user's first request.\n */\nexport function shouldArmFirstTurn(input: FirstTurnGateInput): boolean {\n\tif (input.preview || input.trigger !== \"prompt\" || input.setting === \"off\" || !input.todoActive) return false;\n\tif (NON_INTERACTIVE_MODES.has(input.mode)) return false;\n\tconst request = input.prompt.trim().replace(TRAILING_CLOSERS, \"\");\n\tif (request === \"\" || /[?!\\uFF1F\\uFF01]$/u.test(request)) return false;\n\treturn !input.branchEntries.some((entry) => entry.type === \"message\" && entry.message.role === \"user\");\n}\n\n/**\n * Whether the request wire can name one tool in `tool_choice`. Anthropic reads the RESOLVED\n * compat (catalog models carry no `compat`, and the resolver applies the Fable / Mythos /\n * Opus 5.5 forced-choice default), never `model.compat` directly.\n */\nexport function supportsNamedToolChoice(model: Model<Api> | undefined): boolean {\n\tswitch (model?.api) {\n\t\tcase \"anthropic-messages\": {\n\t\t\tconst compat = getAnthropicCompat(model as Model<\"anthropic-messages\">);\n\t\t\treturn compat.supportsToolChoice !== false && compat.supportsForcedToolChoice !== false;\n\t\t}\n\t\tcase \"openai-responses\":\n\t\tcase \"openai-completions\":\n\t\t\treturn true;\n\t\tdefault:\n\t\t\treturn false;\n\t}\n}\n\n/** Wire shape of a `tool_choice` that forces `toolName`, or `undefined` for an unsupported api. */\nexport function namedToolChoicePayload(api: Api | undefined, toolName: string): Record<string, unknown> | undefined {\n\tswitch (api) {\n\t\tcase \"anthropic-messages\":\n\t\t\treturn { type: \"tool\", name: toolName };\n\t\tcase \"openai-responses\":\n\t\t\treturn { type: \"function\", name: toolName };\n\t\tcase \"openai-completions\":\n\t\t\treturn { type: \"function\", function: { name: toolName } };\n\t\tdefault:\n\t\t\treturn undefined;\n\t}\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null;\n}\n\nfunction declaresTool(tools: unknown, toolName: string): boolean {\n\treturn (\n\t\tArray.isArray(tools) &&\n\t\ttools.some(\n\t\t\t(tool) =>\n\t\t\t\tisRecord(tool) && (tool.name === toolName || (isRecord(tool.function) && tool.function.name === toolName)),\n\t\t)\n\t);\n}\n\n/**\n * The payload with a forced `todo` tool_choice, or `undefined` to leave it untouched: the\n * request must declare `todo`, carry no tool_choice of its own, and (Anthropic) not run\n * extended thinking, which rejects any forced tool use.\n */\nexport function withForcedTodoChoice(payload: unknown, model: Model<Api> | undefined): unknown {\n\tif (!supportsNamedToolChoice(model)) return undefined;\n\tconst toolChoice = namedToolChoicePayload(model?.api, \"todo\");\n\tif (!toolChoice || !isRecord(payload) || payload.tool_choice !== undefined) return undefined;\n\tif (!declaresTool(payload.tools, \"todo\")) return undefined;\n\tconst thinking = isRecord(payload.thinking) ? payload.thinking.type : undefined;\n\tif (model?.api === \"anthropic-messages\" && (thinking === \"enabled\" || thinking === \"adaptive\")) return undefined;\n\treturn { ...payload, tool_choice: toolChoice };\n}\n"]}
@@ -78,9 +78,9 @@ export default function todotoolsExtension(pi) {
78
78
  const setting = readFirstTurnPlan(ctx);
79
79
  const armed = shouldArmFirstTurn({
80
80
  preview: event.preview,
81
+ trigger: event.trigger,
81
82
  prompt: event.prompt,
82
83
  branchEntries,
83
- phases: getLatestTodoStateFromBranchEntries(branchEntries).phases,
84
84
  todoActive: pi.getActiveTools().includes("todo"),
85
85
  setting,
86
86
  mode: ctx.mode,
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/todotools/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { createSessionLogger, type SessionLogger } from \"../../../session-log.ts\";\nimport { SettingsManager } from \"../../../settings-manager.ts\";\nimport type { ExtensionAPI, ExtensionContext } from \"../../types.ts\";\nimport { registerTodoCommand } from \"./commands.ts\";\nimport { FIRST_TURN_CUSTOM_TYPE, FIRST_TURN_REMINDER, shouldArmFirstTurn, withForcedTodoChoice } from \"./first-turn.ts\";\nimport { phasesFromCursorTodos } from \"./native-todo-mirror.ts\";\nimport { TASK_MANAGEMENT_SECTION } from \"./prompt.ts\";\nimport {\n\tclonePhases,\n\tgetLatestTodoStateFromBranchEntries,\n\ttype TodoAsk,\n\ttype TodoCompletionTransition,\n\ttype TodoPhase,\n\ttype TodoState,\n} from \"./state.ts\";\nimport { TODO_STATE_ENTRY_TYPE } from \"./todo-types.ts\";\nimport { getTodoWidgetModel } from \"./todo-widget.ts\";\nimport { TodoWidgetComponent } from \"./todo-widget-component.ts\";\nimport { registerTodoTool } from \"./tools/todo.ts\";\n\nfunction readFirstTurnPlan(ctx: ExtensionContext) {\n\treturn SettingsManager.create(ctx.cwd, ctx.agentDir, {\n\t\tprojectTrusted: ctx.isProjectTrusted(),\n\t}).getTodoFirstTurnPlan();\n}\n\nexport default function todotoolsExtension(pi: ExtensionAPI): void {\n\tlet currentState: TodoState = { phases: [], ask: undefined };\n\t// Armed by the first-turn opener; cleared once that run's first assistant message lands.\n\tlet pendingForce: { forceNamed: boolean; logged: boolean } | undefined;\n\tlet logger: SessionLogger | undefined;\n\tconst clearPendingForce = (): void => {\n\t\tpendingForce = undefined;\n\t};\n\n\tconst getCurrentPhases = (): TodoPhase[] => clonePhases(currentState.phases);\n\n\tconst setCurrentPhases = (phases: TodoPhase[]): void => {\n\t\tcurrentState = { ...currentState, phases: clonePhases(phases) };\n\t};\n\n\tconst getCurrentAsk = (): TodoAsk | undefined => currentState.ask;\n\n\tconst setCurrentAsk = (ask: TodoAsk | undefined): void => {\n\t\tcurrentState = { ...currentState, ask };\n\t};\n\n\tconst syncWidget = (ctx: ExtensionContext, completedTasks: readonly TodoCompletionTransition[] = []): void => {\n\t\tconst model = getTodoWidgetModel(currentState.phases);\n\t\tctx.ui.setWidget(\n\t\t\t\"todo-sidebar\",\n\t\t\tmodel ? (tui, theme) => new TodoWidgetComponent(tui, theme, model, completedTasks) : undefined,\n\t\t);\n\t};\n\n\tconst syncFromSession = (ctx: ExtensionContext): void => {\n\t\tcurrentState = getLatestTodoStateFromBranchEntries(ctx.sessionManager.getBranch());\n\t\tsyncWidget(ctx);\n\t};\n\n\tpi.on(\"session_start\", async (_event, ctx) => {\n\t\tclearPendingForce();\n\t\tsyncFromSession(ctx);\n\t});\n\n\tpi.on(\"session_tree\", async (_event, ctx) => {\n\t\tclearPendingForce();\n\t\tsyncFromSession(ctx);\n\t});\n\n\tpi.on(\"agent_end\", clearPendingForce);\n\tpi.on(\"session_abort\", clearPendingForce);\n\tpi.on(\"session_shutdown\", clearPendingForce);\n\n\tpi.on(\"message_end\", async (event, ctx) => {\n\t\tconst message = event.message;\n\t\tif (message?.role === \"assistant\") clearPendingForce();\n\t\tif (message?.role !== \"assistant\" || !Array.isArray(message.content)) {\n\t\t\treturn;\n\t\t}\n\t\tfor (const block of message.content) {\n\t\t\tif (block.type !== \"toolCall\" || block.name !== \"todo\" || block.arguments?.op) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst phases = phasesFromCursorTodos(block.arguments?.todos);\n\t\t\tif (phases === undefined) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tsetCurrentPhases(phases);\n\t\t\tconst ask = getCurrentAsk();\n\t\t\tpi.appendEntry(TODO_STATE_ENTRY_TYPE, { schema: \"v2\", phases, ...(ask ? { ask } : {}) });\n\t\t\tsyncWidget(ctx);\n\t\t}\n\t});\n\n\tpi.on(\n\t\t\"before_agent_start\",\n\t\tasync (event, ctx) => {\n\t\t\tconst systemPrompt = `${event.systemPrompt}\\n${TASK_MANAGEMENT_SECTION}`;\n\t\t\tif (event.preview) return { systemPrompt };\n\t\t\tconst branchEntries = ctx.sessionManager.getBranch();\n\t\t\tconst setting = readFirstTurnPlan(ctx);\n\t\t\tconst armed = shouldArmFirstTurn({\n\t\t\t\tpreview: event.preview,\n\t\t\t\tprompt: event.prompt,\n\t\t\t\tbranchEntries,\n\t\t\t\tphases: getLatestTodoStateFromBranchEntries(branchEntries).phases,\n\t\t\t\ttodoActive: pi.getActiveTools().includes(\"todo\"),\n\t\t\t\tsetting,\n\t\t\t\tmode: ctx.mode,\n\t\t\t});\n\t\t\tif (!armed) return { systemPrompt };\n\t\t\tpendingForce = { forceNamed: setting === \"force\", logged: false };\n\t\t\treturn {\n\t\t\t\tsystemPrompt,\n\t\t\t\tmessage: { customType: FIRST_TURN_CUSTOM_TYPE, content: FIRST_TURN_REMINDER, display: false },\n\t\t\t};\n\t\t},\n\t\t{ previewSafe: true },\n\t);\n\n\tpi.on(\"before_provider_request\", async (event, ctx) => {\n\t\tif (!pendingForce) return undefined;\n\t\tconst forced = pendingForce.forceNamed\n\t\t\t? withForcedTodoChoice(event.payload, event.model ?? ctx.model)\n\t\t\t: undefined;\n\t\tif (!pendingForce.logged) {\n\t\t\tpendingForce.logged = true;\n\t\t\tlogger ??= createSessionLogger(ctx.agentDir);\n\t\t\tlogger.info(\"todo_first_turn\", { mode: forced === undefined ? \"reminder-only\" : \"forced\" });\n\t\t}\n\t\treturn forced;\n\t});\n\n\tconst accessors = { getCurrentPhases, setCurrentPhases, getCurrentAsk, setCurrentAsk, syncWidget };\n\tregisterTodoTool(pi, accessors);\n\tregisterTodoCommand(pi, accessors);\n}\n\nexport { findPhaseFuzzy, findTaskFuzzy, registerTodoCommand, tokenizeTodoArgs } from \"./commands.ts\";\nexport { markdownToPhases, phasesToMarkdown, resolveTodoMarkdownPath } from \"./markdown.ts\";\nexport { TASK_MANAGEMENT_SECTION } from \"./prompt.ts\";\nexport {\n\tappendItems,\n\tapplyEntry,\n\tapplyOpsToPhases,\n\tapplyParams,\n\tclonePhases,\n\tcloneTask,\n\tDEFAULT_INIT_PHASE,\n\tdescribeAskNowNext,\n\tfindPhaseByName,\n\tfindTaskByContent,\n\tformatSummary,\n\tgetCompletionTransitions,\n\tgetLatestPhasesFromBranchEntries,\n\tgetLatestTodoStateFromBranchEntries,\n\tgetLatestTodosFromBranchEntries,\n\tgetTaskTargets,\n\tgetTodoMarker,\n\tgetTodoResultLines,\n\tgetTodoWidgetLines,\n\tinitPhases,\n\tisIncompleteTodo,\n\tisTerminalTodoStatus,\n\tisTodoItem,\n\tisTodoItemArray,\n\tisTodoPhase,\n\tisTodoPhaseArray,\n\tnextActionableTask,\n\tnormalizeInProgressTask,\n\tremoveTasks,\n\tresolvePhaseOrError,\n\tresolveTaskOrError,\n\tsanitizeTodoText,\n\tTODO_STATE_ENTRY_TYPE,\n\ttype TodoAsk,\n\ttype TodoCompletionTransition,\n\ttype TodoItem,\n\ttype TodoOpEntry,\n\ttype TodoOperation,\n\ttype TodoPhase,\n\ttype TodoState,\n\ttype TodoStateEntry,\n\ttype TodoStatus,\n\ttype TodoToolDetails,\n} from \"./state.ts\";\nexport { phaseRomanNumeral } from \"./tools/todo.ts\";\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/todotools/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAsB,MAAM,yBAAyB,CAAC;AAClF,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAE/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AACxH,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EACN,WAAW,EACX,mCAAmC,GAKnC,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAEnD,SAAS,iBAAiB,CAAC,GAAqB;IAC/C,OAAO,eAAe,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,QAAQ,EAAE;QACpD,cAAc,EAAE,GAAG,CAAC,gBAAgB,EAAE;KACtC,CAAC,CAAC,oBAAoB,EAAE,CAAC;AAC3B,CAAC;AAED,MAAM,CAAC,OAAO,UAAU,kBAAkB,CAAC,EAAgB;IAC1D,IAAI,YAAY,GAAc,EAAE,MAAM,EAAE,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC;IAC7D,yFAAyF;IACzF,IAAI,YAAkE,CAAC;IACvE,IAAI,MAAiC,CAAC;IACtC,MAAM,iBAAiB,GAAG,GAAS,EAAE;QACpC,YAAY,GAAG,SAAS,CAAC;IAC1B,CAAC,CAAC;IAEF,MAAM,gBAAgB,GAAG,GAAgB,EAAE,CAAC,WAAW,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;IAE7E,MAAM,gBAAgB,GAAG,CAAC,MAAmB,EAAQ,EAAE;QACtD,YAAY,GAAG,EAAE,GAAG,YAAY,EAAE,MAAM,EAAE,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC;IACjE,CAAC,CAAC;IAEF,MAAM,aAAa,GAAG,GAAwB,EAAE,CAAC,YAAY,CAAC,GAAG,CAAC;IAElE,MAAM,aAAa,GAAG,CAAC,GAAwB,EAAQ,EAAE;QACxD,YAAY,GAAG,EAAE,GAAG,YAAY,EAAE,GAAG,EAAE,CAAC;IACzC,CAAC,CAAC;IAEF,MAAM,UAAU,GAAG,CAAC,GAAqB,EAAE,cAAc,GAAwC,EAAE,EAAQ,EAAE;QAC5G,MAAM,KAAK,GAAG,kBAAkB,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QACtD,GAAG,CAAC,EAAE,CAAC,SAAS,CACf,cAAc,EACd,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,mBAAmB,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC,SAAS,CAC9F,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,eAAe,GAAG,CAAC,GAAqB,EAAQ,EAAE;QACvD,YAAY,GAAG,mCAAmC,CAAC,GAAG,CAAC,cAAc,CAAC,SAAS,EAAE,CAAC,CAAC;QACnF,UAAU,CAAC,GAAG,CAAC,CAAC;IACjB,CAAC,CAAC;IAEF,EAAE,CAAC,EAAE,CAAC,eAAe,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE;QAC5C,iBAAiB,EAAE,CAAC;QACpB,eAAe,CAAC,GAAG,CAAC,CAAC;IACtB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,EAAE,CAAC,cAAc,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE;QAC3C,iBAAiB,EAAE,CAAC;QACpB,eAAe,CAAC,GAAG,CAAC,CAAC;IACtB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,EAAE,CAAC,WAAW,EAAE,iBAAiB,CAAC,CAAC;IACtC,EAAE,CAAC,EAAE,CAAC,eAAe,EAAE,iBAAiB,CAAC,CAAC;IAC1C,EAAE,CAAC,EAAE,CAAC,kBAAkB,EAAE,iBAAiB,CAAC,CAAC;IAE7C,EAAE,CAAC,EAAE,CAAC,aAAa,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;QACzC,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;QAC9B,IAAI,OAAO,EAAE,IAAI,KAAK,WAAW;YAAE,iBAAiB,EAAE,CAAC;QACvD,IAAI,OAAO,EAAE,IAAI,KAAK,WAAW,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;YACtE,OAAO;QACR,CAAC;QACD,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YACrC,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,IAAI,KAAK,CAAC,SAAS,EAAE,EAAE,EAAE,CAAC;gBAC/E,SAAS;YACV,CAAC;YACD,MAAM,MAAM,GAAG,qBAAqB,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;YAC7D,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;gBAC1B,SAAS;YACV,CAAC;YACD,gBAAgB,CAAC,MAAM,CAAC,CAAC;YACzB,MAAM,GAAG,GAAG,aAAa,EAAE,CAAC;YAC5B,EAAE,CAAC,WAAW,CAAC,qBAAqB,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;YACzF,UAAU,CAAC,GAAG,CAAC,CAAC;QACjB,CAAC;IACF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,EAAE,CACJ,oBAAoB,EACpB,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;QACpB,MAAM,YAAY,GAAG,GAAG,KAAK,CAAC,YAAY,KAAK,uBAAuB,EAAE,CAAC;QACzE,IAAI,KAAK,CAAC,OAAO;YAAE,OAAO,EAAE,YAAY,EAAE,CAAC;QAC3C,MAAM,aAAa,GAAG,GAAG,CAAC,cAAc,CAAC,SAAS,EAAE,CAAC;QACrD,MAAM,OAAO,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC;QACvC,MAAM,KAAK,GAAG,kBAAkB,CAAC;YAChC,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,aAAa;YACb,UAAU,EAAE,EAAE,CAAC,cAAc,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC;YAChD,OAAO;YACP,IAAI,EAAE,GAAG,CAAC,IAAI;SACd,CAAC,CAAC;QACH,IAAI,CAAC,KAAK;YAAE,OAAO,EAAE,YAAY,EAAE,CAAC;QACpC,YAAY,GAAG,EAAE,UAAU,EAAE,OAAO,KAAK,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;QAClE,OAAO;YACN,YAAY;YACZ,OAAO,EAAE,EAAE,UAAU,EAAE,sBAAsB,EAAE,OAAO,EAAE,mBAAmB,EAAE,OAAO,EAAE,KAAK,EAAE;SAC7F,CAAC;IACH,CAAC,EACD,EAAE,WAAW,EAAE,IAAI,EAAE,CACrB,CAAC;IAEF,EAAE,CAAC,EAAE,CAAC,yBAAyB,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;QACrD,IAAI,CAAC,YAAY;YAAE,OAAO,SAAS,CAAC;QACpC,MAAM,MAAM,GAAG,YAAY,CAAC,UAAU;YACrC,CAAC,CAAC,oBAAoB,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,KAAK,IAAI,GAAG,CAAC,KAAK,CAAC;YAC/D,CAAC,CAAC,SAAS,CAAC;QACb,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC;YAC1B,YAAY,CAAC,MAAM,GAAG,IAAI,CAAC;YAC3B,MAAM,KAAK,mBAAmB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YAC7C,MAAM,CAAC,IAAI,CAAC,iBAAiB,EAAE,EAAE,IAAI,EAAE,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC7F,CAAC;QACD,OAAO,MAAM,CAAC;IACf,CAAC,CAAC,CAAC;IAEH,MAAM,SAAS,GAAG,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,aAAa,EAAE,aAAa,EAAE,UAAU,EAAE,CAAC;IACnG,gBAAgB,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;IAChC,mBAAmB,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;AACpC,CAAC;AAED,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACrG,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AAC5F,OAAO,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EACN,WAAW,EACX,UAAU,EACV,gBAAgB,EAChB,WAAW,EACX,WAAW,EACX,SAAS,EACT,kBAAkB,EAClB,kBAAkB,EAClB,eAAe,EACf,iBAAiB,EACjB,aAAa,EACb,wBAAwB,EACxB,gCAAgC,EAChC,mCAAmC,EACnC,+BAA+B,EAC/B,cAAc,EACd,aAAa,EACb,kBAAkB,EAClB,kBAAkB,EAClB,UAAU,EACV,gBAAgB,EAChB,oBAAoB,EACpB,UAAU,EACV,eAAe,EACf,WAAW,EACX,gBAAgB,EAChB,kBAAkB,EAClB,uBAAuB,EACvB,WAAW,EACX,mBAAmB,EACnB,kBAAkB,EAClB,gBAAgB,EAChB,qBAAqB,GAWrB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC","sourcesContent":["import { createSessionLogger, type SessionLogger } from \"../../../session-log.ts\";\nimport { SettingsManager } from \"../../../settings-manager.ts\";\nimport type { ExtensionAPI, ExtensionContext } from \"../../types.ts\";\nimport { registerTodoCommand } from \"./commands.ts\";\nimport { FIRST_TURN_CUSTOM_TYPE, FIRST_TURN_REMINDER, shouldArmFirstTurn, withForcedTodoChoice } from \"./first-turn.ts\";\nimport { phasesFromCursorTodos } from \"./native-todo-mirror.ts\";\nimport { TASK_MANAGEMENT_SECTION } from \"./prompt.ts\";\nimport {\n\tclonePhases,\n\tgetLatestTodoStateFromBranchEntries,\n\ttype TodoAsk,\n\ttype TodoCompletionTransition,\n\ttype TodoPhase,\n\ttype TodoState,\n} from \"./state.ts\";\nimport { TODO_STATE_ENTRY_TYPE } from \"./todo-types.ts\";\nimport { getTodoWidgetModel } from \"./todo-widget.ts\";\nimport { TodoWidgetComponent } from \"./todo-widget-component.ts\";\nimport { registerTodoTool } from \"./tools/todo.ts\";\n\nfunction readFirstTurnPlan(ctx: ExtensionContext) {\n\treturn SettingsManager.create(ctx.cwd, ctx.agentDir, {\n\t\tprojectTrusted: ctx.isProjectTrusted(),\n\t}).getTodoFirstTurnPlan();\n}\n\nexport default function todotoolsExtension(pi: ExtensionAPI): void {\n\tlet currentState: TodoState = { phases: [], ask: undefined };\n\t// Armed by the first-turn opener; cleared once that run's first assistant message lands.\n\tlet pendingForce: { forceNamed: boolean; logged: boolean } | undefined;\n\tlet logger: SessionLogger | undefined;\n\tconst clearPendingForce = (): void => {\n\t\tpendingForce = undefined;\n\t};\n\n\tconst getCurrentPhases = (): TodoPhase[] => clonePhases(currentState.phases);\n\n\tconst setCurrentPhases = (phases: TodoPhase[]): void => {\n\t\tcurrentState = { ...currentState, phases: clonePhases(phases) };\n\t};\n\n\tconst getCurrentAsk = (): TodoAsk | undefined => currentState.ask;\n\n\tconst setCurrentAsk = (ask: TodoAsk | undefined): void => {\n\t\tcurrentState = { ...currentState, ask };\n\t};\n\n\tconst syncWidget = (ctx: ExtensionContext, completedTasks: readonly TodoCompletionTransition[] = []): void => {\n\t\tconst model = getTodoWidgetModel(currentState.phases);\n\t\tctx.ui.setWidget(\n\t\t\t\"todo-sidebar\",\n\t\t\tmodel ? (tui, theme) => new TodoWidgetComponent(tui, theme, model, completedTasks) : undefined,\n\t\t);\n\t};\n\n\tconst syncFromSession = (ctx: ExtensionContext): void => {\n\t\tcurrentState = getLatestTodoStateFromBranchEntries(ctx.sessionManager.getBranch());\n\t\tsyncWidget(ctx);\n\t};\n\n\tpi.on(\"session_start\", async (_event, ctx) => {\n\t\tclearPendingForce();\n\t\tsyncFromSession(ctx);\n\t});\n\n\tpi.on(\"session_tree\", async (_event, ctx) => {\n\t\tclearPendingForce();\n\t\tsyncFromSession(ctx);\n\t});\n\n\tpi.on(\"agent_end\", clearPendingForce);\n\tpi.on(\"session_abort\", clearPendingForce);\n\tpi.on(\"session_shutdown\", clearPendingForce);\n\n\tpi.on(\"message_end\", async (event, ctx) => {\n\t\tconst message = event.message;\n\t\tif (message?.role === \"assistant\") clearPendingForce();\n\t\tif (message?.role !== \"assistant\" || !Array.isArray(message.content)) {\n\t\t\treturn;\n\t\t}\n\t\tfor (const block of message.content) {\n\t\t\tif (block.type !== \"toolCall\" || block.name !== \"todo\" || block.arguments?.op) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst phases = phasesFromCursorTodos(block.arguments?.todos);\n\t\t\tif (phases === undefined) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tsetCurrentPhases(phases);\n\t\t\tconst ask = getCurrentAsk();\n\t\t\tpi.appendEntry(TODO_STATE_ENTRY_TYPE, { schema: \"v2\", phases, ...(ask ? { ask } : {}) });\n\t\t\tsyncWidget(ctx);\n\t\t}\n\t});\n\n\tpi.on(\n\t\t\"before_agent_start\",\n\t\tasync (event, ctx) => {\n\t\t\tconst systemPrompt = `${event.systemPrompt}\\n${TASK_MANAGEMENT_SECTION}`;\n\t\t\tif (event.preview) return { systemPrompt };\n\t\t\tconst branchEntries = ctx.sessionManager.getBranch();\n\t\t\tconst setting = readFirstTurnPlan(ctx);\n\t\t\tconst armed = shouldArmFirstTurn({\n\t\t\t\tpreview: event.preview,\n\t\t\t\ttrigger: event.trigger,\n\t\t\t\tprompt: event.prompt,\n\t\t\t\tbranchEntries,\n\t\t\t\ttodoActive: pi.getActiveTools().includes(\"todo\"),\n\t\t\t\tsetting,\n\t\t\t\tmode: ctx.mode,\n\t\t\t});\n\t\t\tif (!armed) return { systemPrompt };\n\t\t\tpendingForce = { forceNamed: setting === \"force\", logged: false };\n\t\t\treturn {\n\t\t\t\tsystemPrompt,\n\t\t\t\tmessage: { customType: FIRST_TURN_CUSTOM_TYPE, content: FIRST_TURN_REMINDER, display: false },\n\t\t\t};\n\t\t},\n\t\t{ previewSafe: true },\n\t);\n\n\tpi.on(\"before_provider_request\", async (event, ctx) => {\n\t\tif (!pendingForce) return undefined;\n\t\tconst forced = pendingForce.forceNamed\n\t\t\t? withForcedTodoChoice(event.payload, event.model ?? ctx.model)\n\t\t\t: undefined;\n\t\tif (!pendingForce.logged) {\n\t\t\tpendingForce.logged = true;\n\t\t\tlogger ??= createSessionLogger(ctx.agentDir);\n\t\t\tlogger.info(\"todo_first_turn\", { mode: forced === undefined ? \"reminder-only\" : \"forced\" });\n\t\t}\n\t\treturn forced;\n\t});\n\n\tconst accessors = { getCurrentPhases, setCurrentPhases, getCurrentAsk, setCurrentAsk, syncWidget };\n\tregisterTodoTool(pi, accessors);\n\tregisterTodoCommand(pi, accessors);\n}\n\nexport { findPhaseFuzzy, findTaskFuzzy, registerTodoCommand, tokenizeTodoArgs } from \"./commands.ts\";\nexport { markdownToPhases, phasesToMarkdown, resolveTodoMarkdownPath } from \"./markdown.ts\";\nexport { TASK_MANAGEMENT_SECTION } from \"./prompt.ts\";\nexport {\n\tappendItems,\n\tapplyEntry,\n\tapplyOpsToPhases,\n\tapplyParams,\n\tclonePhases,\n\tcloneTask,\n\tDEFAULT_INIT_PHASE,\n\tdescribeAskNowNext,\n\tfindPhaseByName,\n\tfindTaskByContent,\n\tformatSummary,\n\tgetCompletionTransitions,\n\tgetLatestPhasesFromBranchEntries,\n\tgetLatestTodoStateFromBranchEntries,\n\tgetLatestTodosFromBranchEntries,\n\tgetTaskTargets,\n\tgetTodoMarker,\n\tgetTodoResultLines,\n\tgetTodoWidgetLines,\n\tinitPhases,\n\tisIncompleteTodo,\n\tisTerminalTodoStatus,\n\tisTodoItem,\n\tisTodoItemArray,\n\tisTodoPhase,\n\tisTodoPhaseArray,\n\tnextActionableTask,\n\tnormalizeInProgressTask,\n\tremoveTasks,\n\tresolvePhaseOrError,\n\tresolveTaskOrError,\n\tsanitizeTodoText,\n\tTODO_STATE_ENTRY_TYPE,\n\ttype TodoAsk,\n\ttype TodoCompletionTransition,\n\ttype TodoItem,\n\ttype TodoOpEntry,\n\ttype TodoOperation,\n\ttype TodoPhase,\n\ttype TodoState,\n\ttype TodoStateEntry,\n\ttype TodoStatus,\n\ttype TodoToolDetails,\n} from \"./state.ts\";\nexport { phaseRomanNumeral } from \"./tools/todo.ts\";\n"]}
@@ -46,7 +46,7 @@ export function handoffMomentOf(before, after, createsList) {
46
46
  export const HANDOFF_CUES = {
47
47
  "list-created": "Handoff due: the plan exists. Before your next tool call, write the Ask / For you / Now / Next block.",
48
48
  "phase-closed": "Handoff due: a phase closed. Before your next tool call, write the Ask / For you / Now / Next block.",
49
- "all-closed": "Handoff due: every task is closed - the final message is the Ask / For you / Now: none / Next: none block.",
49
+ "all-closed": "Handoff due: every task is closed. Your final message is the Ask / For you / Now: none / Next: none block; any other report an instruction asks for (a self-review, a checklist, a summary) goes inside For you.",
50
50
  };
51
51
  /** The cue line appended to a todo result, or nothing when no handoff moment was reached. */
52
52
  export function formatHandoffCue(moment) {
@@ -1 +1 @@
1
- {"version":3,"file":"todo-format.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/todotools/todo-format.ts"],"names":[],"mappings":"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","sourcesContent":["// Ported and adapted from oh-my-pi's todo tool (MIT License).\n// Copyright (c) 2025 Mario Zechner\n// Copyright (c) 2025-2026 Can Bölük\n// https://github.com/can1357/oh-my-pi\n\nimport { stripAnsi } from \"../../../../utils/ansi.ts\";\nimport { nextActionableTask } from \"./todo-query.ts\";\nimport type { TodoAsk, TodoItem, TodoPhase } from \"./todo-types.ts\";\n\nexport type AskNowNext = { ask: string; now: string; next: string };\n\n/**\n * The three handoff anchors of a todo state: the captured user request, the task in\n * progress, and the first pending task after it in phase order (it may sit in an earlier\n * phase after an out-of-order start). Task labels are verbatim.\n */\nexport function describeAskNowNext(state: { phases: readonly TodoPhase[]; ask?: TodoAsk }): AskNowNext {\n\tconst ask = state.ask?.text ?? \"(no user request captured)\";\n\tconst located = state.phases.flatMap((phase) => phase.tasks.map((task) => ({ task, phase: phase.name })));\n\tif (located.length === 0) return { ask, now: \"none - no todo list\", next: \"none\" };\n\tconst nowTask = nextActionableTask(state.phases);\n\tconst now = located.find((hit) => hit.task === nowTask);\n\tconst next = located.find((hit) => hit.task.status === \"pending\" && hit.task !== nowTask);\n\treturn {\n\t\task,\n\t\tnow: now ? `${now.task.content} (${now.phase})` : \"none - all tasks closed\",\n\t\tnext: next ? `${next.task.content} (${next.phase})` : \"none\",\n\t};\n}\n\n/** The todo transitions at which the user is owed a handoff block (the prompts' `## Handoff` moments). */\nexport type HandoffMoment = \"list-created\" | \"phase-closed\" | \"all-closed\";\n\n/**\n * Which handoff moment a successful mutation produced, if any: the list was just created, the\n * last open task of a phase closed, or the last open task of the whole list closed. The result\n * carries the cue right before the model writes its next text, where a system-prompt rule alone\n * proved unreliable on weaker models (senpi#2121 real-surface QA).\n */\nexport function handoffMomentOf(\n\tbefore: readonly TodoPhase[],\n\tafter: readonly TodoPhase[],\n\tcreatesList: boolean,\n): HandoffMoment | undefined {\n\tconst hasOpen = (tasks: readonly TodoItem[]) => tasks.some((task) => !isTerminalTodoStatus(task.status));\n\tconst afterTasks = after.flatMap((phase) => phase.tasks);\n\tif (afterTasks.length === 0) return undefined;\n\tif (createsList) return \"list-created\";\n\tif (!hasOpen(afterTasks)) return hasOpen(before.flatMap((phase) => phase.tasks)) ? \"all-closed\" : undefined;\n\tconst closedPhase = after.some(\n\t\t(phase) =>\n\t\t\tphase.tasks.length > 0 &&\n\t\t\t!hasOpen(phase.tasks) &&\n\t\t\thasOpen(before.find((prior) => prior.name === phase.name)?.tasks ?? []),\n\t);\n\treturn closedPhase ? \"phase-closed\" : undefined;\n}\n\nexport const HANDOFF_CUES: Readonly<Record<HandoffMoment, string>> = {\n\t\"list-created\":\n\t\t\"Handoff due: the plan exists. Before your next tool call, write the Ask / For you / Now / Next block.\",\n\t\"phase-closed\":\n\t\t\"Handoff due: a phase closed. Before your next tool call, write the Ask / For you / Now / Next block.\",\n\t\"all-closed\":\n\t\t\"Handoff due: every task is closed - the final message is the Ask / For you / Now: none / Next: none block.\",\n};\n\n/** The cue line appended to a todo result, or nothing when no handoff moment was reached. */\nexport function formatHandoffCue(moment: HandoffMoment | undefined): string {\n\treturn moment ? `\\n\\n${HANDOFF_CUES[moment]}` : \"\";\n}\n\n/** `Ask:` / `Now:` / `Next:` lines plus a blank separator line. */\nexport function formatAskNowNextHeader(phases: readonly TodoPhase[], ask: TodoAsk | undefined): string {\n\tconst anchors = describeAskNowNext({ phases, ask });\n\treturn `Ask: ${anchors.ask}\\nNow: ${anchors.now}\\nNext: ${anchors.next}\\n\\n`;\n}\n\nexport function formatSummary(\n\tphases: readonly TodoPhase[],\n\terrors: readonly string[],\n\treadOnly = false,\n\task?: TodoAsk,\n): string {\n\treturn `${formatAskNowNextHeader(phases, ask)}${formatListSummary(phases, errors, readOnly)}`;\n}\n\nfunction formatListSummary(phases: readonly TodoPhase[], errors: readonly string[], readOnly: boolean): string {\n\tconst tasks = phases.flatMap((phase) => phase.tasks);\n\tif (tasks.length === 0) {\n\t\tif (errors.length > 0) return `Errors: ${errors.join(\"; \")}`;\n\t\treturn readOnly ? \"Todo list is empty.\" : \"Todo list cleared.\";\n\t}\n\n\tconst remainingByPhase = phases\n\t\t.map((phase) => ({\n\t\t\tname: phase.name,\n\t\t\ttasks: phase.tasks.filter((task) => task.status === \"pending\" || task.status === \"in_progress\"),\n\t\t}))\n\t\t.filter((phase) => phase.tasks.length > 0);\n\tconst remainingTasks = remainingByPhase.flatMap((phase) =>\n\t\tphase.tasks.map((task) => ({ ...task, phase: phase.name })),\n\t);\n\n\tlet currentIdx = phases.findIndex((phase) =>\n\t\tphase.tasks.some((task) => task.status === \"pending\" || task.status === \"in_progress\"),\n\t);\n\tif (currentIdx === -1) currentIdx = phases.length - 1;\n\tconst current = phases[currentIdx];\n\tconst done = current.tasks.filter((task) => task.status === \"completed\" || task.status === \"abandoned\").length;\n\n\tconst lines: string[] = [];\n\tif (errors.length > 0) lines.push(`Errors: ${errors.join(\"; \")}`);\n\tif (remainingTasks.length === 0) {\n\t\tlines.push(\"Remaining items: none.\");\n\t} else {\n\t\tlines.push(`Remaining items (${remainingTasks.length}):`);\n\t\tfor (const task of remainingTasks) lines.push(` - ${task.content} [${task.status}] (${task.phase})`);\n\t}\n\n\tconst closedAll = tasks.filter((task) => task.status === \"completed\" || task.status === \"abandoned\").length;\n\tconst workedAhead = phases.some(\n\t\t(phase, index) =>\n\t\t\tindex > currentIdx && phase.tasks.some((task) => task.status === \"completed\" || task.status === \"abandoned\"),\n\t);\n\tlines.push(`Overall: ${closedAll}/${tasks.length} done, ${remainingTasks.length} open.`);\n\tlines.push(\n\t\t`Active phase ${currentIdx + 1}/${phases.length} \"${current.name}\" (${done}/${current.tasks.length})${\n\t\t\tworkedAhead\n\t\t\t\t? \" — earliest phase with open tasks; the in-progress pointer auto-advances to the earliest open task on each completion, so it can sit behind out-of-order work (nothing was un-completed).\"\n\t\t\t\t: \".\"\n\t\t}`,\n\t);\n\tfor (const phase of phases) {\n\t\tlines.push(` ${phase.name}:`);\n\t\tfor (const task of phase.tasks) {\n\t\t\tconst checkbox = task.status === \"completed\" ? \"[X]\" : \"[ ]\";\n\t\t\tconst tag = task.status === \"in_progress\" ? \" (in progress)\" : task.status === \"abandoned\" ? \" (dropped)\" : \"\";\n\t\t\tlines.push(` - ${checkbox} ${task.content}${tag}`);\n\t\t}\n\t}\n\treturn lines.join(\"\\n\");\n}\n\nexport function sanitizeTodoText(text: string): string {\n\treturn stripAnsi(text)\n\t\t.replace(/[\\r\\n]+/g, \" \")\n\t\t.replace(/[\\u0000-\\u001F\\u007F-\\u009F]/g, \" \")\n\t\t.replace(/\\s+/g, \" \")\n\t\t.trim();\n}\n\nexport function isTerminalTodoStatus(status: string): boolean {\n\treturn status === \"completed\" || status === \"abandoned\" || status === \"cancelled\";\n}\n\nexport function isIncompleteTodo(todo: TodoItem): boolean {\n\treturn !isTerminalTodoStatus(todo.status);\n}\n\nexport function getTodoMarker(status: string): string {\n\tif (status === \"completed\") return \"[✓]\";\n\tif (status === \"in_progress\") return \"[•]\";\n\tif (status === \"abandoned\" || status === \"cancelled\") return \"[×]\";\n\treturn \"[ ]\";\n}\n\nexport function getTodoResultLines(phases: readonly TodoPhase[]): string[] {\n\tconst tasks = phases.flatMap((phase) => phase.tasks);\n\treturn [\n\t\t`${tasks.filter(isIncompleteTodo).length} todos`,\n\t\t...phases.flatMap((phase) => [\n\t\t\t`${sanitizeTodoText(phase.name)}:`,\n\t\t\t...phase.tasks.map((todo) => `${getTodoMarker(todo.status)} ${sanitizeTodoText(todo.content)}`),\n\t\t]),\n\t];\n}\n"]}
1
+ {"version":3,"file":"todo-format.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/todotools/todo-format.ts"],"names":[],"mappings":"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","sourcesContent":["// Ported and adapted from oh-my-pi's todo tool (MIT License).\n// Copyright (c) 2025 Mario Zechner\n// Copyright (c) 2025-2026 Can Bölük\n// https://github.com/can1357/oh-my-pi\n\nimport { stripAnsi } from \"../../../../utils/ansi.ts\";\nimport { nextActionableTask } from \"./todo-query.ts\";\nimport type { TodoAsk, TodoItem, TodoPhase } from \"./todo-types.ts\";\n\nexport type AskNowNext = { ask: string; now: string; next: string };\n\n/**\n * The three handoff anchors of a todo state: the captured user request, the task in\n * progress, and the first pending task after it in phase order (it may sit in an earlier\n * phase after an out-of-order start). Task labels are verbatim.\n */\nexport function describeAskNowNext(state: { phases: readonly TodoPhase[]; ask?: TodoAsk }): AskNowNext {\n\tconst ask = state.ask?.text ?? \"(no user request captured)\";\n\tconst located = state.phases.flatMap((phase) => phase.tasks.map((task) => ({ task, phase: phase.name })));\n\tif (located.length === 0) return { ask, now: \"none - no todo list\", next: \"none\" };\n\tconst nowTask = nextActionableTask(state.phases);\n\tconst now = located.find((hit) => hit.task === nowTask);\n\tconst next = located.find((hit) => hit.task.status === \"pending\" && hit.task !== nowTask);\n\treturn {\n\t\task,\n\t\tnow: now ? `${now.task.content} (${now.phase})` : \"none - all tasks closed\",\n\t\tnext: next ? `${next.task.content} (${next.phase})` : \"none\",\n\t};\n}\n\n/** The todo transitions at which the user is owed a handoff block (the prompts' `## Handoff` moments). */\nexport type HandoffMoment = \"list-created\" | \"phase-closed\" | \"all-closed\";\n\n/**\n * Which handoff moment a successful mutation produced, if any: the list was just created, the\n * last open task of a phase closed, or the last open task of the whole list closed. The result\n * carries the cue right before the model writes its next text, where a system-prompt rule alone\n * proved unreliable on weaker models (senpi#2121 real-surface QA).\n */\nexport function handoffMomentOf(\n\tbefore: readonly TodoPhase[],\n\tafter: readonly TodoPhase[],\n\tcreatesList: boolean,\n): HandoffMoment | undefined {\n\tconst hasOpen = (tasks: readonly TodoItem[]) => tasks.some((task) => !isTerminalTodoStatus(task.status));\n\tconst afterTasks = after.flatMap((phase) => phase.tasks);\n\tif (afterTasks.length === 0) return undefined;\n\tif (createsList) return \"list-created\";\n\tif (!hasOpen(afterTasks)) return hasOpen(before.flatMap((phase) => phase.tasks)) ? \"all-closed\" : undefined;\n\tconst closedPhase = after.some(\n\t\t(phase) =>\n\t\t\tphase.tasks.length > 0 &&\n\t\t\t!hasOpen(phase.tasks) &&\n\t\t\thasOpen(before.find((prior) => prior.name === phase.name)?.tasks ?? []),\n\t);\n\treturn closedPhase ? \"phase-closed\" : undefined;\n}\n\nexport const HANDOFF_CUES: Readonly<Record<HandoffMoment, string>> = {\n\t\"list-created\":\n\t\t\"Handoff due: the plan exists. Before your next tool call, write the Ask / For you / Now / Next block.\",\n\t\"phase-closed\":\n\t\t\"Handoff due: a phase closed. Before your next tool call, write the Ask / For you / Now / Next block.\",\n\t\"all-closed\":\n\t\t\"Handoff due: every task is closed. Your final message is the Ask / For you / Now: none / Next: none block; any other report an instruction asks for (a self-review, a checklist, a summary) goes inside For you.\",\n};\n\n/** The cue line appended to a todo result, or nothing when no handoff moment was reached. */\nexport function formatHandoffCue(moment: HandoffMoment | undefined): string {\n\treturn moment ? `\\n\\n${HANDOFF_CUES[moment]}` : \"\";\n}\n\n/** `Ask:` / `Now:` / `Next:` lines plus a blank separator line. */\nexport function formatAskNowNextHeader(phases: readonly TodoPhase[], ask: TodoAsk | undefined): string {\n\tconst anchors = describeAskNowNext({ phases, ask });\n\treturn `Ask: ${anchors.ask}\\nNow: ${anchors.now}\\nNext: ${anchors.next}\\n\\n`;\n}\n\nexport function formatSummary(\n\tphases: readonly TodoPhase[],\n\terrors: readonly string[],\n\treadOnly = false,\n\task?: TodoAsk,\n): string {\n\treturn `${formatAskNowNextHeader(phases, ask)}${formatListSummary(phases, errors, readOnly)}`;\n}\n\nfunction formatListSummary(phases: readonly TodoPhase[], errors: readonly string[], readOnly: boolean): string {\n\tconst tasks = phases.flatMap((phase) => phase.tasks);\n\tif (tasks.length === 0) {\n\t\tif (errors.length > 0) return `Errors: ${errors.join(\"; \")}`;\n\t\treturn readOnly ? \"Todo list is empty.\" : \"Todo list cleared.\";\n\t}\n\n\tconst remainingByPhase = phases\n\t\t.map((phase) => ({\n\t\t\tname: phase.name,\n\t\t\ttasks: phase.tasks.filter((task) => task.status === \"pending\" || task.status === \"in_progress\"),\n\t\t}))\n\t\t.filter((phase) => phase.tasks.length > 0);\n\tconst remainingTasks = remainingByPhase.flatMap((phase) =>\n\t\tphase.tasks.map((task) => ({ ...task, phase: phase.name })),\n\t);\n\n\tlet currentIdx = phases.findIndex((phase) =>\n\t\tphase.tasks.some((task) => task.status === \"pending\" || task.status === \"in_progress\"),\n\t);\n\tif (currentIdx === -1) currentIdx = phases.length - 1;\n\tconst current = phases[currentIdx];\n\tconst done = current.tasks.filter((task) => task.status === \"completed\" || task.status === \"abandoned\").length;\n\n\tconst lines: string[] = [];\n\tif (errors.length > 0) lines.push(`Errors: ${errors.join(\"; \")}`);\n\tif (remainingTasks.length === 0) {\n\t\tlines.push(\"Remaining items: none.\");\n\t} else {\n\t\tlines.push(`Remaining items (${remainingTasks.length}):`);\n\t\tfor (const task of remainingTasks) lines.push(` - ${task.content} [${task.status}] (${task.phase})`);\n\t}\n\n\tconst closedAll = tasks.filter((task) => task.status === \"completed\" || task.status === \"abandoned\").length;\n\tconst workedAhead = phases.some(\n\t\t(phase, index) =>\n\t\t\tindex > currentIdx && phase.tasks.some((task) => task.status === \"completed\" || task.status === \"abandoned\"),\n\t);\n\tlines.push(`Overall: ${closedAll}/${tasks.length} done, ${remainingTasks.length} open.`);\n\tlines.push(\n\t\t`Active phase ${currentIdx + 1}/${phases.length} \"${current.name}\" (${done}/${current.tasks.length})${\n\t\t\tworkedAhead\n\t\t\t\t? \" — earliest phase with open tasks; the in-progress pointer auto-advances to the earliest open task on each completion, so it can sit behind out-of-order work (nothing was un-completed).\"\n\t\t\t\t: \".\"\n\t\t}`,\n\t);\n\tfor (const phase of phases) {\n\t\tlines.push(` ${phase.name}:`);\n\t\tfor (const task of phase.tasks) {\n\t\t\tconst checkbox = task.status === \"completed\" ? \"[X]\" : \"[ ]\";\n\t\t\tconst tag = task.status === \"in_progress\" ? \" (in progress)\" : task.status === \"abandoned\" ? \" (dropped)\" : \"\";\n\t\t\tlines.push(` - ${checkbox} ${task.content}${tag}`);\n\t\t}\n\t}\n\treturn lines.join(\"\\n\");\n}\n\nexport function sanitizeTodoText(text: string): string {\n\treturn stripAnsi(text)\n\t\t.replace(/[\\r\\n]+/g, \" \")\n\t\t.replace(/[\\u0000-\\u001F\\u007F-\\u009F]/g, \" \")\n\t\t.replace(/\\s+/g, \" \")\n\t\t.trim();\n}\n\nexport function isTerminalTodoStatus(status: string): boolean {\n\treturn status === \"completed\" || status === \"abandoned\" || status === \"cancelled\";\n}\n\nexport function isIncompleteTodo(todo: TodoItem): boolean {\n\treturn !isTerminalTodoStatus(todo.status);\n}\n\nexport function getTodoMarker(status: string): string {\n\tif (status === \"completed\") return \"[✓]\";\n\tif (status === \"in_progress\") return \"[•]\";\n\tif (status === \"abandoned\" || status === \"cancelled\") return \"[×]\";\n\treturn \"[ ]\";\n}\n\nexport function getTodoResultLines(phases: readonly TodoPhase[]): string[] {\n\tconst tasks = phases.flatMap((phase) => phase.tasks);\n\treturn [\n\t\t`${tasks.filter(isIncompleteTodo).length} todos`,\n\t\t...phases.flatMap((phase) => [\n\t\t\t`${sanitizeTodoText(phase.name)}:`,\n\t\t\t...phase.tasks.map((todo) => `${getTodoMarker(todo.status)} ${sanitizeTodoText(todo.content)}`),\n\t\t]),\n\t];\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"repetitive-turns.d.ts","sourceRoot":"","sources":["../../../../../../src/core/extensions/builtin/ttsr/detectors/repetitive-turns.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD,eAAO,MAAM,0BAA0B,qBAAqB,CAAC;AAE7D,eAAO,MAAM,qCAAqC,OAAO,CAAC;AAC1D,eAAO,MAAM,8BAA8B,IAAI,CAAC;AAChD,eAAO,MAAM,qCAAqC,KAAK,CAAC;AACxD,eAAO,MAAM,iCAAiC,IAAI,CAAC;AAOnD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAStD;AAWD,wBAAgB,cAAc,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAS3D;AAED,wBAAgB,6BAA6B,CAAC,mBAAmB,EAAE,MAAM,EAAE,kBAAkB,EAAE,MAAM,GAAG,OAAO,CAE9G;AAED,UAAU,SAAS;IAClB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CAC5B;AAED,MAAM,WAAW,oBAAoB;IACpC,QAAQ,CAAC,OAAO,EAAE,SAAS,EAAE,CAAC;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;CACjB;AAED,wBAAgB,0BAA0B,IAAI,oBAAoB,CAEjE;AAWD,wBAAgB,cAAc,CAAC,KAAK,EAAE,oBAAoB,EAAE,IAAI,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CAkC9F"}
1
+ {"version":3,"file":"repetitive-turns.d.ts","sourceRoot":"","sources":["../../../../../../src/core/extensions/builtin/ttsr/detectors/repetitive-turns.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD,eAAO,MAAM,0BAA0B,qBAAqB,CAAC;AAE7D,eAAO,MAAM,qCAAqC,OAAO,CAAC;AAC1D,eAAO,MAAM,8BAA8B,IAAI,CAAC;AAChD,eAAO,MAAM,qCAAqC,KAAK,CAAC;AACxD,eAAO,MAAM,iCAAiC,IAAI,CAAC;AAUnD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAUtD;AAWD,wBAAgB,cAAc,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAS3D;AAED,wBAAgB,6BAA6B,CAAC,mBAAmB,EAAE,MAAM,EAAE,kBAAkB,EAAE,MAAM,GAAG,OAAO,CAE9G;AAED,UAAU,SAAS;IAClB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CAC5B;AAED,MAAM,WAAW,oBAAoB;IACpC,QAAQ,CAAC,OAAO,EAAE,SAAS,EAAE,CAAC;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;CACjB;AAED,wBAAgB,0BAA0B,IAAI,oBAAoB,CAEjE;AAWD,wBAAgB,cAAc,CAAC,KAAK,EAAE,oBAAoB,EAAE,IAAI,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CAkC9F"}
@@ -7,8 +7,12 @@ const WORD_PATTERN = /[\p{L}\p{N}#]+/gu;
7
7
  const DIGIT_RUN_PATTERN = /\d[\d.,:/-]*/g;
8
8
  const HEX_LIKE_PATTERN = /\b[0-9a-f]{7,}\b/gi;
9
9
  const SAMPLE_LENGTH = 80;
10
+ // The handoff contract restates the user's request verbatim after `Ask:` in every block, so that clause is
11
+ // identical by design across turns; it ends where the block's own status starts (`For you:` / `You need:` / `Now:`).
12
+ const HANDOFF_ASK_CLAUSE = /\bAsk:[\s\S]*?(?=\b(?:For you|You need|Now):|$)/g;
10
13
  export function normalizeTurnText(text) {
11
14
  return text
15
+ .replace(HANDOFF_ASK_CLAUSE, " ")
12
16
  .toLowerCase()
13
17
  .replace(HEX_LIKE_PATTERN, "#")
14
18
  .replace(DIGIT_RUN_PATTERN, "#")
@@ -1 +1 @@
1
- {"version":3,"file":"repetitive-turns.js","sourceRoot":"","sources":["../../../../../../src/core/extensions/builtin/ttsr/detectors/repetitive-turns.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,0BAA0B,GAAG,kBAAkB,CAAC;AAE7D,MAAM,CAAC,MAAM,qCAAqC,GAAG,IAAI,CAAC;AAC1D,MAAM,CAAC,MAAM,8BAA8B,GAAG,CAAC,CAAC;AAChD,MAAM,CAAC,MAAM,qCAAqC,GAAG,EAAE,CAAC;AACxD,MAAM,CAAC,MAAM,iCAAiC,GAAG,CAAC,CAAC;AAEnD,MAAM,YAAY,GAAG,kBAAkB,CAAC;AACxC,MAAM,iBAAiB,GAAG,eAAe,CAAC;AAC1C,MAAM,gBAAgB,GAAG,oBAAoB,CAAC;AAC9C,MAAM,aAAa,GAAG,EAAE,CAAC;AAEzB,MAAM,UAAU,iBAAiB,CAAC,IAAY;IAC7C,OAAO,IAAI;SACT,WAAW,EAAE;SACb,OAAO,CAAC,gBAAgB,EAAE,GAAG,CAAC;SAC9B,OAAO,CAAC,iBAAiB,EAAE,GAAG,CAAC;SAC/B,KAAK,CAAC,KAAK,CAAC;SACZ,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;SACnC,IAAI,CAAC,GAAG,CAAC;SACT,IAAI,EAAE,CAAC;AACV,CAAC;AAED,SAAS,YAAY,CAAC,UAAkB;IACvC,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC;IACnD,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;IAChC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5C,KAAK,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC;IAC1D,CAAC;IACD,OAAO,KAAK,CAAC;AACd,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,CAAS,EAAE,CAAS;IAClD,MAAM,MAAM,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;IAC/B,MAAM,MAAM,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;IAC/B,IAAI,MAAM,CAAC,IAAI,KAAK,CAAC,IAAI,MAAM,CAAC,IAAI,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IACrD,IAAI,YAAY,GAAG,CAAC,CAAC;IACrB,KAAK,MAAM,IAAI,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,YAAY,IAAI,CAAC,CAAC;IACzC,CAAC;IACD,OAAO,YAAY,GAAG,CAAC,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,GAAG,YAAY,CAAC,CAAC;AAClE,CAAC;AAED,MAAM,UAAU,6BAA6B,CAAC,mBAA2B,EAAE,kBAA0B;IACpG,OAAO,cAAc,CAAC,mBAAmB,EAAE,kBAAkB,CAAC,IAAI,qCAAqC,CAAC;AACzG,CAAC;AAaD,MAAM,UAAU,0BAA0B;IACzC,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;AACnD,CAAC;AAED,SAAS,WAAW,CAAC,CAAc,EAAE,CAAc;IAClD,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IAC3C,IAAI,YAAY,GAAG,CAAC,CAAC;IACrB,KAAK,MAAM,IAAI,IAAI,CAAC,EAAE,CAAC;QACtB,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,YAAY,IAAI,CAAC,CAAC;IACpC,CAAC;IACD,OAAO,YAAY,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,GAAG,YAAY,CAAC,CAAC;AACxD,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,KAA2B,EAAE,IAAY;IACvE,MAAM,UAAU,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;IAC3C,IAAI,UAAU,CAAC,MAAM,GAAG,qCAAqC,EAAE,CAAC;QAC/D,OAAO,IAAI,CAAC;IACb,CAAC;IACD,MAAM,KAAK,GAAG,YAAY,CAAC,UAAU,CAAC,CAAC;IACvC,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACzD,MAAM,UAAU,GAAG,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC;IACnF,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,CAAC;IAC1C,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,GAAG,iCAAiC,EAAE,CAAC;QAC9D,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC;IACD,IAAI,UAAU,IAAI,qCAAqC,EAAE,CAAC;QACzD,KAAK,CAAC,MAAM,IAAI,CAAC,CAAC;IACnB,CAAC;SAAM,CAAC;QACP,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;QACjB,IAAI,KAAK,CAAC,OAAO;YAAE,KAAK,CAAC,OAAO,GAAG,KAAK,CAAC;IAC1C,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,MAAM,GAAG,8BAA8B,GAAG,CAAC,EAAE,CAAC;QACxE,OAAO,IAAI,CAAC;IACb,CAAC;IACD,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC;IACrB,OAAO;QACN,IAAI,EAAE,0BAA0B;QAChC,MAAM,EAAE,sDAAsD,KAAK,CAAC,MAAM,GAAG,CAAC,+BAA+B,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG;QACrI,kBAAkB,EAAE,CAAC;QACrB,kBAAkB,EAAE,CAAC;QACrB,MAAM,EAAE;YACP,SAAS,EAAE,YAAY;YACvB,MAAM,EAAE,KAAK,CAAC,MAAM,GAAG,CAAC;YACxB,UAAU,EAAE,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YACzC,MAAM,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,aAAa,CAAC;SAC1C;KACD,CAAC;AACH,CAAC","sourcesContent":["import type { DetectorMatch } from \"../types.ts\";\n\nexport const REPETITIVE_TURNS_RULE_NAME = \"repetitive-turns\";\n\nexport const REPETITIVE_TURNS_SIMILARITY_THRESHOLD = 0.55;\nexport const REPETITIVE_TURNS_STREAK_LENGTH = 3;\nexport const REPETITIVE_TURNS_MIN_NORMALIZED_CHARS = 40;\nexport const REPETITIVE_TURNS_HISTORY_CAPACITY = 6;\n\nconst WORD_PATTERN = /[\\p{L}\\p{N}#]+/gu;\nconst DIGIT_RUN_PATTERN = /\\d[\\d.,:/-]*/g;\nconst HEX_LIKE_PATTERN = /\\b[0-9a-f]{7,}\\b/gi;\nconst SAMPLE_LENGTH = 80;\n\nexport function normalizeTurnText(text: string): string {\n\treturn text\n\t\t.toLowerCase()\n\t\t.replace(HEX_LIKE_PATTERN, \"#\")\n\t\t.replace(DIGIT_RUN_PATTERN, \"#\")\n\t\t.split(/\\s+/)\n\t\t.filter((token) => token.length > 0)\n\t\t.join(\" \")\n\t\t.trim();\n}\n\nfunction wordTrigrams(normalized: string): Set<string> {\n\tconst words = normalized.match(WORD_PATTERN) ?? [];\n\tconst grams = new Set<string>();\n\tfor (let i = 0; i + 3 <= words.length; i++) {\n\t\tgrams.add(`${words[i]} ${words[i + 1]} ${words[i + 2]}`);\n\t}\n\treturn grams;\n}\n\nexport function trigramJaccard(a: string, b: string): number {\n\tconst gramsA = wordTrigrams(a);\n\tconst gramsB = wordTrigrams(b);\n\tif (gramsA.size === 0 || gramsB.size === 0) return 0;\n\tlet intersection = 0;\n\tfor (const gram of gramsA) {\n\t\tif (gramsB.has(gram)) intersection += 1;\n\t}\n\treturn intersection / (gramsA.size + gramsB.size - intersection);\n}\n\nexport function isNearDuplicateOfPreviousTurn(normalizedCandidate: string, normalizedPrevious: string): boolean {\n\treturn trigramJaccard(normalizedCandidate, normalizedPrevious) >= REPETITIVE_TURNS_SIMILARITY_THRESHOLD;\n}\n\ninterface TurnEntry {\n\treadonly normalized: string;\n\treadonly grams: Set<string>;\n}\n\nexport interface RepetitiveTurnsState {\n\treadonly history: TurnEntry[];\n\tstreak: number;\n\tlatched: boolean;\n}\n\nexport function createRepetitiveTurnsState(): RepetitiveTurnsState {\n\treturn { history: [], streak: 0, latched: false };\n}\n\nfunction jaccardSets(a: Set<string>, b: Set<string>): number {\n\tif (a.size === 0 || b.size === 0) return 0;\n\tlet intersection = 0;\n\tfor (const gram of a) {\n\t\tif (b.has(gram)) intersection += 1;\n\t}\n\treturn intersection / (a.size + b.size - intersection);\n}\n\nexport function recordTurnText(state: RepetitiveTurnsState, text: string): DetectorMatch | null {\n\tconst normalized = normalizeTurnText(text);\n\tif (normalized.length < REPETITIVE_TURNS_MIN_NORMALIZED_CHARS) {\n\t\treturn null;\n\t}\n\tconst grams = wordTrigrams(normalized);\n\tconst previous = state.history[state.history.length - 1];\n\tconst similarity = previous === undefined ? 0 : jaccardSets(grams, previous.grams);\n\tstate.history.push({ normalized, grams });\n\tif (state.history.length > REPETITIVE_TURNS_HISTORY_CAPACITY) {\n\t\tstate.history.shift();\n\t}\n\tif (similarity >= REPETITIVE_TURNS_SIMILARITY_THRESHOLD) {\n\t\tstate.streak += 1;\n\t} else {\n\t\tstate.streak = 0;\n\t\tif (state.latched) state.latched = false;\n\t}\n\tif (state.latched || state.streak < REPETITIVE_TURNS_STREAK_LENGTH - 1) {\n\t\treturn null;\n\t}\n\tstate.latched = true;\n\treturn {\n\t\trule: REPETITIVE_TURNS_RULE_NAME,\n\t\treason: `assistant repeated a near-identical message across ${state.streak + 1} consecutive turns (jaccard ${similarity.toFixed(2)})`,\n\t\tanomalyStartOffset: 0,\n\t\tgarbageStartOffset: 0,\n\t\tdetail: {\n\t\t\tmechanism: \"cross-turn\",\n\t\t\tstreak: state.streak + 1,\n\t\t\tsimilarity: Number(similarity.toFixed(3)),\n\t\t\tsample: normalized.slice(0, SAMPLE_LENGTH),\n\t\t},\n\t};\n}\n"]}
1
+ {"version":3,"file":"repetitive-turns.js","sourceRoot":"","sources":["../../../../../../src/core/extensions/builtin/ttsr/detectors/repetitive-turns.ts"],"names":[],"mappings":"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","sourcesContent":["import type { DetectorMatch } from \"../types.ts\";\n\nexport const REPETITIVE_TURNS_RULE_NAME = \"repetitive-turns\";\n\nexport const REPETITIVE_TURNS_SIMILARITY_THRESHOLD = 0.55;\nexport const REPETITIVE_TURNS_STREAK_LENGTH = 3;\nexport const REPETITIVE_TURNS_MIN_NORMALIZED_CHARS = 40;\nexport const REPETITIVE_TURNS_HISTORY_CAPACITY = 6;\n\nconst WORD_PATTERN = /[\\p{L}\\p{N}#]+/gu;\nconst DIGIT_RUN_PATTERN = /\\d[\\d.,:/-]*/g;\nconst HEX_LIKE_PATTERN = /\\b[0-9a-f]{7,}\\b/gi;\nconst SAMPLE_LENGTH = 80;\n// The handoff contract restates the user's request verbatim after `Ask:` in every block, so that clause is\n// identical by design across turns; it ends where the block's own status starts (`For you:` / `You need:` / `Now:`).\nconst HANDOFF_ASK_CLAUSE = /\\bAsk:[\\s\\S]*?(?=\\b(?:For you|You need|Now):|$)/g;\n\nexport function normalizeTurnText(text: string): string {\n\treturn text\n\t\t.replace(HANDOFF_ASK_CLAUSE, \" \")\n\t\t.toLowerCase()\n\t\t.replace(HEX_LIKE_PATTERN, \"#\")\n\t\t.replace(DIGIT_RUN_PATTERN, \"#\")\n\t\t.split(/\\s+/)\n\t\t.filter((token) => token.length > 0)\n\t\t.join(\" \")\n\t\t.trim();\n}\n\nfunction wordTrigrams(normalized: string): Set<string> {\n\tconst words = normalized.match(WORD_PATTERN) ?? [];\n\tconst grams = new Set<string>();\n\tfor (let i = 0; i + 3 <= words.length; i++) {\n\t\tgrams.add(`${words[i]} ${words[i + 1]} ${words[i + 2]}`);\n\t}\n\treturn grams;\n}\n\nexport function trigramJaccard(a: string, b: string): number {\n\tconst gramsA = wordTrigrams(a);\n\tconst gramsB = wordTrigrams(b);\n\tif (gramsA.size === 0 || gramsB.size === 0) return 0;\n\tlet intersection = 0;\n\tfor (const gram of gramsA) {\n\t\tif (gramsB.has(gram)) intersection += 1;\n\t}\n\treturn intersection / (gramsA.size + gramsB.size - intersection);\n}\n\nexport function isNearDuplicateOfPreviousTurn(normalizedCandidate: string, normalizedPrevious: string): boolean {\n\treturn trigramJaccard(normalizedCandidate, normalizedPrevious) >= REPETITIVE_TURNS_SIMILARITY_THRESHOLD;\n}\n\ninterface TurnEntry {\n\treadonly normalized: string;\n\treadonly grams: Set<string>;\n}\n\nexport interface RepetitiveTurnsState {\n\treadonly history: TurnEntry[];\n\tstreak: number;\n\tlatched: boolean;\n}\n\nexport function createRepetitiveTurnsState(): RepetitiveTurnsState {\n\treturn { history: [], streak: 0, latched: false };\n}\n\nfunction jaccardSets(a: Set<string>, b: Set<string>): number {\n\tif (a.size === 0 || b.size === 0) return 0;\n\tlet intersection = 0;\n\tfor (const gram of a) {\n\t\tif (b.has(gram)) intersection += 1;\n\t}\n\treturn intersection / (a.size + b.size - intersection);\n}\n\nexport function recordTurnText(state: RepetitiveTurnsState, text: string): DetectorMatch | null {\n\tconst normalized = normalizeTurnText(text);\n\tif (normalized.length < REPETITIVE_TURNS_MIN_NORMALIZED_CHARS) {\n\t\treturn null;\n\t}\n\tconst grams = wordTrigrams(normalized);\n\tconst previous = state.history[state.history.length - 1];\n\tconst similarity = previous === undefined ? 0 : jaccardSets(grams, previous.grams);\n\tstate.history.push({ normalized, grams });\n\tif (state.history.length > REPETITIVE_TURNS_HISTORY_CAPACITY) {\n\t\tstate.history.shift();\n\t}\n\tif (similarity >= REPETITIVE_TURNS_SIMILARITY_THRESHOLD) {\n\t\tstate.streak += 1;\n\t} else {\n\t\tstate.streak = 0;\n\t\tif (state.latched) state.latched = false;\n\t}\n\tif (state.latched || state.streak < REPETITIVE_TURNS_STREAK_LENGTH - 1) {\n\t\treturn null;\n\t}\n\tstate.latched = true;\n\treturn {\n\t\trule: REPETITIVE_TURNS_RULE_NAME,\n\t\treason: `assistant repeated a near-identical message across ${state.streak + 1} consecutive turns (jaccard ${similarity.toFixed(2)})`,\n\t\tanomalyStartOffset: 0,\n\t\tgarbageStartOffset: 0,\n\t\tdetail: {\n\t\t\tmechanism: \"cross-turn\",\n\t\t\tstreak: state.streak + 1,\n\t\t\tsimilarity: Number(similarity.toFixed(3)),\n\t\t\tsample: normalized.slice(0, SAMPLE_LENGTH),\n\t\t},\n\t};\n}\n"]}
@@ -20,7 +20,7 @@ export const COLLAPSE_RULE_NAME = "collapse-repetition";
20
20
  export const CONTROL_LEAK_RULE_NAME = "control-token-leak";
21
21
  export const REPETITIVE_TURNS_RULE_CONTENT = [
22
22
  "Your recent replies repeated the same near-identical status message across consecutive turns — a cross-turn repetition loop.",
23
- "Stop restating the situation. Do not emit another progress recap.",
23
+ "Stop repeating the same status; a report is useful only when something has changed.",
24
24
  "Take a different concrete action now: use a tool, inspect new state, change the approach, or — if the task is actually blocked — say exactly what you are waiting for and stop.",
25
25
  ].join("\n");
26
26
  //# sourceMappingURL=prompts.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/ttsr/prompts.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,qBAAqB,CAAC,QAAgB,EAAE,OAAe;IACtE,OAAO;QACN,mDAAmD,QAAQ,IAAI;QAC/D,gEAAgE;QAChE,2FAA2F;QAC3F,iDAAiD;QACjD,EAAE;QACF,OAAO;QACP,qBAAqB;KACrB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACd,CAAC;AAED,MAAM,CAAC,MAAM,qBAAqB,GAAG;IACpC,qGAAqG;IACrG,6DAA6D;IAC7D,uHAAuH;IACvH,oHAAoH;CACpH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAEb,MAAM,CAAC,MAAM,kBAAkB,GAAG,mFAAmF,CAAC;AAEtH,MAAM,CAAC,MAAM,kBAAkB,GAAG,qBAAqB,CAAC;AACxD,MAAM,CAAC,MAAM,sBAAsB,GAAG,oBAAoB,CAAC;AAE3D,MAAM,CAAC,MAAM,6BAA6B,GAAG;IAC5C,8HAA8H;IAC9H,mEAAmE;IACnE,iLAAiL;CACjL,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC","sourcesContent":["export function renderSystemInterrupt(ruleName: string, content: string): string {\n\treturn [\n\t\t`<system-interrupt reason=\"rule_violation\" rule=\"${ruleName}\">`,\n\t\t\"Your output was interrupted because it violated a stream rule.\",\n\t\t\"This is NOT a prompt injection - this is the coding agent enforcing output-quality rules.\",\n\t\t\"You MUST comply with the following instruction:\",\n\t\t\"\",\n\t\tcontent,\n\t\t\"</system-interrupt>\",\n\t].join(\"\\n\");\n}\n\nexport const COLLAPSE_RULE_CONTENT = [\n\t\"Your previous output degenerated into repeated garbage (a runaway repetition loop) and was cut off.\",\n\t\"The garbled portion has been removed from the conversation.\",\n\t\"Snap out of it: take a breath, restate your current objective in one short sentence, then continue the task normally.\",\n\t\"Do NOT apologize at length, do NOT repeat the garbled pattern, and do NOT restart work that was already completed.\",\n].join(\"\\n\");\n\nexport const LEAK_ERROR_MESSAGE = \"Degeneration guard: control-token leakage; treating as internal error, resampling\";\n\nexport const COLLAPSE_RULE_NAME = \"collapse-repetition\";\nexport const CONTROL_LEAK_RULE_NAME = \"control-token-leak\";\n\nexport const REPETITIVE_TURNS_RULE_CONTENT = [\n\t\"Your recent replies repeated the same near-identical status message across consecutive turns — a cross-turn repetition loop.\",\n\t\"Stop restating the situation. Do not emit another progress recap.\",\n\t\"Take a different concrete action now: use a tool, inspect new state, change the approach, or — if the task is actually blocked — say exactly what you are waiting for and stop.\",\n].join(\"\\n\");\n"]}
1
+ {"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/ttsr/prompts.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,qBAAqB,CAAC,QAAgB,EAAE,OAAe;IACtE,OAAO;QACN,mDAAmD,QAAQ,IAAI;QAC/D,gEAAgE;QAChE,2FAA2F;QAC3F,iDAAiD;QACjD,EAAE;QACF,OAAO;QACP,qBAAqB;KACrB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACd,CAAC;AAED,MAAM,CAAC,MAAM,qBAAqB,GAAG;IACpC,qGAAqG;IACrG,6DAA6D;IAC7D,uHAAuH;IACvH,oHAAoH;CACpH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAEb,MAAM,CAAC,MAAM,kBAAkB,GAAG,mFAAmF,CAAC;AAEtH,MAAM,CAAC,MAAM,kBAAkB,GAAG,qBAAqB,CAAC;AACxD,MAAM,CAAC,MAAM,sBAAsB,GAAG,oBAAoB,CAAC;AAE3D,MAAM,CAAC,MAAM,6BAA6B,GAAG;IAC5C,8HAA8H;IAC9H,qFAAqF;IACrF,iLAAiL;CACjL,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC","sourcesContent":["export function renderSystemInterrupt(ruleName: string, content: string): string {\n\treturn [\n\t\t`<system-interrupt reason=\"rule_violation\" rule=\"${ruleName}\">`,\n\t\t\"Your output was interrupted because it violated a stream rule.\",\n\t\t\"This is NOT a prompt injection - this is the coding agent enforcing output-quality rules.\",\n\t\t\"You MUST comply with the following instruction:\",\n\t\t\"\",\n\t\tcontent,\n\t\t\"</system-interrupt>\",\n\t].join(\"\\n\");\n}\n\nexport const COLLAPSE_RULE_CONTENT = [\n\t\"Your previous output degenerated into repeated garbage (a runaway repetition loop) and was cut off.\",\n\t\"The garbled portion has been removed from the conversation.\",\n\t\"Snap out of it: take a breath, restate your current objective in one short sentence, then continue the task normally.\",\n\t\"Do NOT apologize at length, do NOT repeat the garbled pattern, and do NOT restart work that was already completed.\",\n].join(\"\\n\");\n\nexport const LEAK_ERROR_MESSAGE = \"Degeneration guard: control-token leakage; treating as internal error, resampling\";\n\nexport const COLLAPSE_RULE_NAME = \"collapse-repetition\";\nexport const CONTROL_LEAK_RULE_NAME = \"control-token-leak\";\n\nexport const REPETITIVE_TURNS_RULE_CONTENT = [\n\t\"Your recent replies repeated the same near-identical status message across consecutive turns — a cross-turn repetition loop.\",\n\t\"Stop repeating the same status; a report is useful only when something has changed.\",\n\t\"Take a different concrete action now: use a tool, inspect new state, change the approach, or — if the task is actually blocked — say exactly what you are waiting for and stop.\",\n].join(\"\\n\");\n"]}
@@ -267,6 +267,7 @@ export declare class ExtensionRunner {
267
267
  emitBeforeAgentStart(prompt: string, images: ImageContent[] | undefined, systemPrompt: string, systemPromptOptions: BuildSystemPromptOptions, options?: {
268
268
  readonly preview?: boolean;
269
269
  readonly signal?: AbortSignal;
270
+ readonly trigger?: BeforeAgentStartEvent["trigger"];
270
271
  }): Promise<BeforeAgentStartCombinedResult | undefined>;
271
272
  emitResourcesDiscover(cwd: string, reason: ResourcesDiscoverEvent["reason"]): Promise<{
272
273
  skillPaths: DiscoveredResourceEntry[];
@@ -1 +1 @@
1
- {"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../../src/core/extensions/runner.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../../src/core/extensions/runner.ts"],"names":[],"mappings":"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"}
@@ -1493,6 +1493,7 @@ export class ExtensionRunner {
1493
1493
  const event = {
1494
1494
  type: "before_agent_start",
1495
1495
  prompt,
1496
+ trigger: options.trigger ?? "prompt",
1496
1497
  images,
1497
1498
  systemPrompt: currentSystemPrompt,
1498
1499
  systemPromptOptions,