@code-yeongyu/senpi 2026.9.15 → 2026.9.16-3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (339) hide show
  1. package/CHANGELOG.md +89 -0
  2. package/README.md +1 -1
  3. package/dist/cli/help-extension-flags.d.ts +22 -0
  4. package/dist/cli/help-extension-flags.d.ts.map +1 -0
  5. package/dist/cli/help-extension-flags.js +30 -0
  6. package/dist/cli/help-extension-flags.js.map +1 -0
  7. package/dist/cli/help-fast-path.d.ts +19 -0
  8. package/dist/cli/help-fast-path.d.ts.map +1 -0
  9. package/dist/cli/help-fast-path.js +64 -0
  10. package/dist/cli/help-fast-path.js.map +1 -0
  11. package/dist/cli/help-flags-cache.d.ts +23 -0
  12. package/dist/cli/help-flags-cache.d.ts.map +1 -0
  13. package/dist/cli/help-flags-cache.js +118 -0
  14. package/dist/cli/help-flags-cache.js.map +1 -0
  15. package/dist/cli/startup-loading-indicator.d.ts.map +1 -1
  16. package/dist/cli/startup-loading-indicator.js +10 -4
  17. package/dist/cli/startup-loading-indicator.js.map +1 -1
  18. package/dist/cli.js +9 -0
  19. package/dist/cli.js.map +1 -1
  20. package/dist/core/agent-session.d.ts +17 -0
  21. package/dist/core/agent-session.d.ts.map +1 -1
  22. package/dist/core/agent-session.js +62 -8
  23. package/dist/core/agent-session.js.map +1 -1
  24. package/dist/core/compaction/compaction.d.ts.map +1 -1
  25. package/dist/core/compaction/compaction.js +4 -2
  26. package/dist/core/compaction/compaction.js.map +1 -1
  27. package/dist/core/compaction/stream-watchdog.d.ts +56 -2
  28. package/dist/core/compaction/stream-watchdog.d.ts.map +1 -1
  29. package/dist/core/compaction/stream-watchdog.js +93 -15
  30. package/dist/core/compaction/stream-watchdog.js.map +1 -1
  31. package/dist/core/extensions/builtin/claude-sdk-oauth/session-binding.d.ts +6 -0
  32. package/dist/core/extensions/builtin/claude-sdk-oauth/session-binding.d.ts.map +1 -1
  33. package/dist/core/extensions/builtin/claude-sdk-oauth/session-binding.js +17 -0
  34. package/dist/core/extensions/builtin/claude-sdk-oauth/session-binding.js.map +1 -1
  35. package/dist/core/extensions/builtin/claude-sdk-oauth/session-continuity.d.ts +4 -1
  36. package/dist/core/extensions/builtin/claude-sdk-oauth/session-continuity.d.ts.map +1 -1
  37. package/dist/core/extensions/builtin/claude-sdk-oauth/session-continuity.js +31 -0
  38. package/dist/core/extensions/builtin/claude-sdk-oauth/session-continuity.js.map +1 -1
  39. package/dist/core/extensions/builtin/claude-sdk-oauth/session-reattach.d.ts +2 -0
  40. package/dist/core/extensions/builtin/claude-sdk-oauth/session-reattach.d.ts.map +1 -1
  41. package/dist/core/extensions/builtin/claude-sdk-oauth/session-reattach.js +16 -0
  42. package/dist/core/extensions/builtin/claude-sdk-oauth/session-reattach.js.map +1 -1
  43. package/dist/core/extensions/builtin/claude-sdk-oauth/session-registry-wiring.d.ts.map +1 -1
  44. package/dist/core/extensions/builtin/claude-sdk-oauth/session-registry-wiring.js +19 -8
  45. package/dist/core/extensions/builtin/claude-sdk-oauth/session-registry-wiring.js.map +1 -1
  46. package/dist/core/extensions/builtin/claude-sdk-oauth/session-stream.d.ts.map +1 -1
  47. package/dist/core/extensions/builtin/claude-sdk-oauth/session-stream.js +2 -1
  48. package/dist/core/extensions/builtin/claude-sdk-oauth/session-stream.js.map +1 -1
  49. package/dist/core/extensions/builtin/compaction/deterministic-fallback.d.ts +13 -1
  50. package/dist/core/extensions/builtin/compaction/deterministic-fallback.d.ts.map +1 -1
  51. package/dist/core/extensions/builtin/compaction/deterministic-fallback.js +66 -2
  52. package/dist/core/extensions/builtin/compaction/deterministic-fallback.js.map +1 -1
  53. package/dist/core/extensions/builtin/compaction/index.d.ts.map +1 -1
  54. package/dist/core/extensions/builtin/compaction/index.js +16 -10
  55. package/dist/core/extensions/builtin/compaction/index.js.map +1 -1
  56. package/dist/core/extensions/builtin/compaction/speculative-summary.d.ts.map +1 -1
  57. package/dist/core/extensions/builtin/compaction/speculative-summary.js +4 -2
  58. package/dist/core/extensions/builtin/compaction/speculative-summary.js.map +1 -1
  59. package/dist/core/extensions/builtin/compaction/speculative.d.ts +8 -1
  60. package/dist/core/extensions/builtin/compaction/speculative.d.ts.map +1 -1
  61. package/dist/core/extensions/builtin/compaction/speculative.js +31 -7
  62. package/dist/core/extensions/builtin/compaction/speculative.js.map +1 -1
  63. package/dist/core/extensions/builtin/compaction/transient-failure.d.ts.map +1 -1
  64. package/dist/core/extensions/builtin/compaction/transient-failure.js +6 -3
  65. package/dist/core/extensions/builtin/compaction/transient-failure.js.map +1 -1
  66. package/dist/core/extensions/builtin/config-reload/index.d.ts.map +1 -1
  67. package/dist/core/extensions/builtin/config-reload/index.js +25 -8
  68. package/dist/core/extensions/builtin/config-reload/index.js.map +1 -1
  69. package/dist/core/extensions/builtin/config-reload/watch-engine.d.ts +4 -5
  70. package/dist/core/extensions/builtin/config-reload/watch-engine.d.ts.map +1 -1
  71. package/dist/core/extensions/builtin/config-reload/watch-engine.js +14 -18
  72. package/dist/core/extensions/builtin/config-reload/watch-engine.js.map +1 -1
  73. package/dist/core/extensions/builtin/config-reload/watch-event-source.d.ts.map +1 -1
  74. package/dist/core/extensions/builtin/config-reload/watch-event-source.js +32 -9
  75. package/dist/core/extensions/builtin/config-reload/watch-event-source.js.map +1 -1
  76. package/dist/core/extensions/builtin/cursor-cli-oauth/catalog-refresh.d.ts +23 -0
  77. package/dist/core/extensions/builtin/cursor-cli-oauth/catalog-refresh.d.ts.map +1 -0
  78. package/dist/core/extensions/builtin/cursor-cli-oauth/catalog-refresh.js +48 -0
  79. package/dist/core/extensions/builtin/cursor-cli-oauth/catalog-refresh.js.map +1 -0
  80. package/dist/core/extensions/builtin/cursor-cli-oauth/environment.d.ts +13 -0
  81. package/dist/core/extensions/builtin/cursor-cli-oauth/environment.d.ts.map +1 -0
  82. package/dist/core/extensions/builtin/cursor-cli-oauth/environment.js +24 -0
  83. package/dist/core/extensions/builtin/cursor-cli-oauth/environment.js.map +1 -0
  84. package/dist/core/extensions/builtin/cursor-cli-oauth/executable.d.ts +1 -0
  85. package/dist/core/extensions/builtin/cursor-cli-oauth/executable.d.ts.map +1 -1
  86. package/dist/core/extensions/builtin/cursor-cli-oauth/executable.js +7 -1
  87. package/dist/core/extensions/builtin/cursor-cli-oauth/executable.js.map +1 -1
  88. package/dist/core/extensions/builtin/cursor-cli-oauth/index.d.ts +2 -0
  89. package/dist/core/extensions/builtin/cursor-cli-oauth/index.d.ts.map +1 -1
  90. package/dist/core/extensions/builtin/cursor-cli-oauth/index.js +11 -9
  91. package/dist/core/extensions/builtin/cursor-cli-oauth/index.js.map +1 -1
  92. package/dist/core/extensions/builtin/cursor-cli-oauth/models-probe.d.ts +18 -0
  93. package/dist/core/extensions/builtin/cursor-cli-oauth/models-probe.d.ts.map +1 -0
  94. package/dist/core/extensions/builtin/cursor-cli-oauth/models-probe.js +61 -0
  95. package/dist/core/extensions/builtin/cursor-cli-oauth/models-probe.js.map +1 -0
  96. package/dist/core/extensions/builtin/cursor-cli-oauth/models.d.ts +4 -1
  97. package/dist/core/extensions/builtin/cursor-cli-oauth/models.d.ts.map +1 -1
  98. package/dist/core/extensions/builtin/cursor-cli-oauth/models.js +1 -44
  99. package/dist/core/extensions/builtin/cursor-cli-oauth/models.js.map +1 -1
  100. package/dist/core/extensions/builtin/cursor-cli-oauth/oauth-login.d.ts +22 -0
  101. package/dist/core/extensions/builtin/cursor-cli-oauth/oauth-login.d.ts.map +1 -1
  102. package/dist/core/extensions/builtin/cursor-cli-oauth/oauth-login.js +1 -1
  103. package/dist/core/extensions/builtin/cursor-cli-oauth/oauth-login.js.map +1 -1
  104. package/dist/core/extensions/builtin/cursor-cli-oauth/transport.d.ts.map +1 -1
  105. package/dist/core/extensions/builtin/cursor-cli-oauth/transport.js +2 -13
  106. package/dist/core/extensions/builtin/cursor-cli-oauth/transport.js.map +1 -1
  107. package/dist/core/extensions/builtin/terminal/monitor-file-digest.d.ts +3 -0
  108. package/dist/core/extensions/builtin/terminal/monitor-file-digest.d.ts.map +1 -0
  109. package/dist/core/extensions/builtin/terminal/monitor-file-digest.js +25 -0
  110. package/dist/core/extensions/builtin/terminal/monitor-file-digest.js.map +1 -0
  111. package/dist/core/extensions/builtin/terminal/monitor-file-watch.d.ts +9 -0
  112. package/dist/core/extensions/builtin/terminal/monitor-file-watch.d.ts.map +1 -0
  113. package/dist/core/extensions/builtin/terminal/monitor-file-watch.js +33 -0
  114. package/dist/core/extensions/builtin/terminal/monitor-file-watch.js.map +1 -0
  115. package/dist/core/extensions/builtin/terminal/monitor-line-buffer.d.ts +6 -0
  116. package/dist/core/extensions/builtin/terminal/monitor-line-buffer.d.ts.map +1 -0
  117. package/dist/core/extensions/builtin/terminal/monitor-line-buffer.js +22 -0
  118. package/dist/core/extensions/builtin/terminal/monitor-line-buffer.js.map +1 -0
  119. package/dist/core/extensions/builtin/terminal/monitor-registry.d.ts.map +1 -1
  120. package/dist/core/extensions/builtin/terminal/monitor-registry.js +14 -35
  121. package/dist/core/extensions/builtin/terminal/monitor-registry.js.map +1 -1
  122. package/dist/core/extensions/builtin/ttsr/detectors/collapse-near-duplicates.d.ts +38 -0
  123. package/dist/core/extensions/builtin/ttsr/detectors/collapse-near-duplicates.d.ts.map +1 -0
  124. package/dist/core/extensions/builtin/ttsr/detectors/collapse-near-duplicates.js +155 -0
  125. package/dist/core/extensions/builtin/ttsr/detectors/collapse-near-duplicates.js.map +1 -0
  126. package/dist/core/extensions/builtin/ttsr/detectors/collapse.d.ts +2 -0
  127. package/dist/core/extensions/builtin/ttsr/detectors/collapse.d.ts.map +1 -1
  128. package/dist/core/extensions/builtin/ttsr/detectors/collapse.js +4 -1
  129. package/dist/core/extensions/builtin/ttsr/detectors/collapse.js.map +1 -1
  130. package/dist/core/extensions/kernel-tools-context.d.ts +13 -0
  131. package/dist/core/extensions/kernel-tools-context.d.ts.map +1 -0
  132. package/dist/core/extensions/kernel-tools-context.js +3 -0
  133. package/dist/core/extensions/kernel-tools-context.js.map +1 -0
  134. package/dist/core/extensions/runner.d.ts +19 -0
  135. package/dist/core/extensions/runner.d.ts.map +1 -1
  136. package/dist/core/extensions/runner.js +103 -1
  137. package/dist/core/extensions/runner.js.map +1 -1
  138. package/dist/core/extensions/types.d.ts +21 -0
  139. package/dist/core/extensions/types.d.ts.map +1 -1
  140. package/dist/core/extensions/types.js.map +1 -1
  141. package/dist/core/keybindings.d.ts +5 -0
  142. package/dist/core/keybindings.d.ts.map +1 -1
  143. package/dist/core/keybindings.js +1 -0
  144. package/dist/core/keybindings.js.map +1 -1
  145. package/dist/core/resource-loader.d.ts.map +1 -1
  146. package/dist/core/resource-loader.js +9 -17
  147. package/dist/core/resource-loader.js.map +1 -1
  148. package/dist/core/session-manager.d.ts +30 -1
  149. package/dist/core/session-manager.d.ts.map +1 -1
  150. package/dist/core/session-manager.js +92 -5
  151. package/dist/core/session-manager.js.map +1 -1
  152. package/dist/core/session-resident-store.d.ts +33 -7
  153. package/dist/core/session-resident-store.d.ts.map +1 -1
  154. package/dist/core/session-resident-store.js +163 -14
  155. package/dist/core/session-resident-store.js.map +1 -1
  156. package/dist/core/session-write-reservation.d.ts +6 -0
  157. package/dist/core/session-write-reservation.d.ts.map +1 -1
  158. package/dist/core/session-write-reservation.js +19 -0
  159. package/dist/core/session-write-reservation.js.map +1 -1
  160. package/dist/core/settings-manager.d.ts +23 -0
  161. package/dist/core/settings-manager.d.ts.map +1 -1
  162. package/dist/core/settings-manager.js +41 -0
  163. package/dist/core/settings-manager.js.map +1 -1
  164. package/dist/core/slash-commands.d.ts.map +1 -1
  165. package/dist/core/slash-commands.js +2 -1
  166. package/dist/core/slash-commands.js.map +1 -1
  167. package/dist/core/tools/index.d.ts +1 -1
  168. package/dist/core/tools/index.d.ts.map +1 -1
  169. package/dist/core/tools/index.js +4 -3
  170. package/dist/core/tools/index.js.map +1 -1
  171. package/dist/core/tools/read.d.ts +3 -1
  172. package/dist/core/tools/read.d.ts.map +1 -1
  173. package/dist/core/tools/read.js +16 -2
  174. package/dist/core/tools/read.js.map +1 -1
  175. package/dist/index.d.ts +1 -0
  176. package/dist/index.d.ts.map +1 -1
  177. package/dist/index.js +1 -0
  178. package/dist/index.js.map +1 -1
  179. package/dist/main.d.ts.map +1 -1
  180. package/dist/main.js +31 -3
  181. package/dist/main.js.map +1 -1
  182. package/dist/modes/interactive/components/assistant-render-descriptors.d.ts.map +1 -1
  183. package/dist/modes/interactive/components/assistant-render-descriptors.js +12 -5
  184. package/dist/modes/interactive/components/assistant-render-descriptors.js.map +1 -1
  185. package/dist/modes/interactive/components/extension-input.d.ts +2 -0
  186. package/dist/modes/interactive/components/extension-input.d.ts.map +1 -1
  187. package/dist/modes/interactive/components/extension-input.js +5 -0
  188. package/dist/modes/interactive/components/extension-input.js.map +1 -1
  189. package/dist/modes/interactive/interactive-mode.d.ts +7 -1
  190. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  191. package/dist/modes/interactive/interactive-mode.js +35 -16
  192. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  193. package/dist/modes/interactive/tips/catalog/session-tips.js +1 -1
  194. package/dist/modes/interactive/tips/catalog/session-tips.js.map +1 -1
  195. package/dist/modes/print-mode.d.ts +1 -1
  196. package/dist/modes/print-mode.d.ts.map +1 -1
  197. package/dist/modes/print-mode.js +5 -1
  198. package/dist/modes/print-mode.js.map +1 -1
  199. package/dist/modes/rpc/host-watchdog.d.ts.map +1 -1
  200. package/dist/modes/rpc/host-watchdog.js +5 -24
  201. package/dist/modes/rpc/host-watchdog.js.map +1 -1
  202. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  203. package/dist/modes/rpc/rpc-mode.js +3 -8
  204. package/dist/modes/rpc/rpc-mode.js.map +1 -1
  205. package/dist/modes/rpc/session-command-router.d.ts.map +1 -1
  206. package/dist/modes/rpc/session-command-router.js +3 -0
  207. package/dist/modes/rpc/session-command-router.js.map +1 -1
  208. package/dist/modes/rpc/session-worker-client.d.ts +3 -0
  209. package/dist/modes/rpc/session-worker-client.d.ts.map +1 -1
  210. package/dist/modes/rpc/session-worker-client.js +17 -6
  211. package/dist/modes/rpc/session-worker-client.js.map +1 -1
  212. package/dist/modes/rpc/shutdown.d.ts +3 -0
  213. package/dist/modes/rpc/shutdown.d.ts.map +1 -0
  214. package/dist/modes/rpc/shutdown.js +17 -0
  215. package/dist/modes/rpc/shutdown.js.map +1 -0
  216. package/dist/senpi +9 -0
  217. package/docs/extensions.md +5 -2
  218. package/docs/keybindings.md +1 -0
  219. package/docs/session-format.md +1 -1
  220. package/docs/sessions.md +3 -3
  221. package/docs/settings.md +12 -0
  222. package/docs/usage.md +1 -1
  223. package/node_modules/@code-yeongyu/senpi-codemode/CHANGELOG.md +62 -0
  224. package/node_modules/@code-yeongyu/senpi-codemode/README.md +24 -0
  225. package/node_modules/@code-yeongyu/senpi-codemode/package.json +4 -4
  226. package/node_modules/@code-yeongyu/senpi-codemode/src/bridge/http-server.ts +7 -1
  227. package/node_modules/@code-yeongyu/senpi-codemode/src/bridge/kernel-tools-protocol.ts +85 -0
  228. package/node_modules/@code-yeongyu/senpi-codemode/src/bridge/protocol.ts +6 -0
  229. package/node_modules/@code-yeongyu/senpi-codemode/src/bridges/agent-bridge.ts +30 -11
  230. package/node_modules/@code-yeongyu/senpi-codemode/src/extension/session-manager.ts +11 -0
  231. package/node_modules/@code-yeongyu/senpi-codemode/src/index.ts +10 -0
  232. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/jl/prelude.jl +46 -0
  233. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/jl/runner.jl +1 -1
  234. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/context-manager.ts +58 -10
  235. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/kernel-contract.ts +12 -0
  236. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/kernel-tools-context.d.ts +13 -0
  237. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/kernel-tools-context.js +7 -0
  238. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/kernel-tools-define.d.ts +10 -0
  239. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/kernel-tools-define.js +12 -0
  240. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/kernel-tools-errors.js +22 -0
  241. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/kernel-tools-errors.ts +26 -0
  242. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/kernel-tools-host.ts +134 -0
  243. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/kernel-tools-naming.js +28 -0
  244. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/kernel-tools-parse.d.ts +5 -0
  245. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/kernel-tools-parse.js +255 -0
  246. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/kernel-tools-pump.js +105 -0
  247. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/kernel-tools-registry.d.ts +27 -0
  248. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/kernel-tools-registry.js +127 -0
  249. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/kernel-tools-schema.js +69 -0
  250. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/kernel-tools-types.ts +42 -0
  251. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/prelude.ts +2 -0
  252. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/worker-core.js +26 -3
  253. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/worker-runtime.js +20 -8
  254. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/worker-slot.ts +6 -1
  255. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/worker-startup.ts +9 -7
  256. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/workpool.js +37 -0
  257. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/kernel-tools-unavailable.ts +5 -0
  258. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/py/kernel.ts +13 -0
  259. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/py/prelude.py +57 -3
  260. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/rb/prelude.rb +13 -2
  261. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/rb/workpool.rb +38 -0
  262. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/shared/subprocess-kernel.ts +13 -0
  263. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/shared/subprocess-queue.ts +9 -1
  264. package/node_modules/@code-yeongyu/senpi-codemode/src/prompt/eval-prompt-template.ts +4 -2
  265. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/cell-handler.ts +31 -3
  266. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/detached-cell-manager.ts +36 -71
  267. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/image-resize.ts +52 -0
  268. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/image.ts +37 -72
  269. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/managed-cell.ts +78 -0
  270. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/render.ts +30 -5
  271. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/run-eval-cell.ts +52 -30
  272. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/terminal-snapshot-store.ts +35 -0
  273. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/tool-result-marshal.ts +23 -0
  274. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/types.ts +2 -0
  275. package/node_modules/@earendil-works/pi-agent-core/dist/empty-assistant-recovery.d.ts.map +1 -1
  276. package/node_modules/@earendil-works/pi-agent-core/dist/empty-assistant-recovery.js +51 -12
  277. package/node_modules/@earendil-works/pi-agent-core/dist/empty-assistant-recovery.js.map +1 -1
  278. package/node_modules/@earendil-works/pi-agent-core/dist/harness/tools/read.d.ts +3 -0
  279. package/node_modules/@earendil-works/pi-agent-core/dist/harness/tools/read.d.ts.map +1 -1
  280. package/node_modules/@earendil-works/pi-agent-core/dist/harness/tools/read.js +18 -3
  281. package/node_modules/@earendil-works/pi-agent-core/dist/harness/tools/read.js.map +1 -1
  282. package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/read-folders/brace-scanner.d.ts +4 -0
  283. package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/read-folders/brace-scanner.d.ts.map +1 -0
  284. package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/read-folders/brace-scanner.js +268 -0
  285. package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/read-folders/brace-scanner.js.map +1 -0
  286. package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/read-folders/header-protection.d.ts +18 -0
  287. package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/read-folders/header-protection.d.ts.map +1 -0
  288. package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/read-folders/header-protection.js +69 -0
  289. package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/read-folders/header-protection.js.map +1 -0
  290. package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/read-folders/index.d.ts +27 -0
  291. package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/read-folders/index.d.ts.map +1 -0
  292. package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/read-folders/index.js +118 -0
  293. package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/read-folders/index.js.map +1 -0
  294. package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/read-folders/lexical-context.d.ts +21 -0
  295. package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/read-folders/lexical-context.d.ts.map +1 -0
  296. package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/read-folders/lexical-context.js +24 -0
  297. package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/read-folders/lexical-context.js.map +1 -0
  298. package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/read-folders/lexical-spans.d.ts +12 -0
  299. package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/read-folders/lexical-spans.d.ts.map +1 -0
  300. package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/read-folders/lexical-spans.js +92 -0
  301. package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/read-folders/lexical-spans.js.map +1 -0
  302. package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/read-folders/types.d.ts +47 -0
  303. package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/read-folders/types.d.ts.map +1 -0
  304. package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/read-folders/types.js +8 -0
  305. package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/read-folders/types.js.map +1 -0
  306. package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/segmented-read-view.d.ts +52 -0
  307. package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/segmented-read-view.d.ts.map +1 -0
  308. package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/segmented-read-view.js +155 -0
  309. package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/segmented-read-view.js.map +1 -0
  310. package/node_modules/@earendil-works/pi-agent-core/dist/index.d.ts +2 -0
  311. package/node_modules/@earendil-works/pi-agent-core/dist/index.d.ts.map +1 -1
  312. package/node_modules/@earendil-works/pi-agent-core/dist/index.js +2 -0
  313. package/node_modules/@earendil-works/pi-agent-core/dist/index.js.map +1 -1
  314. package/node_modules/@earendil-works/pi-agent-core/package.json +3 -3
  315. package/node_modules/@earendil-works/pi-ai/dist/index.d.ts +1 -0
  316. package/node_modules/@earendil-works/pi-ai/dist/index.d.ts.map +1 -1
  317. package/node_modules/@earendil-works/pi-ai/dist/index.js +1 -0
  318. package/node_modules/@earendil-works/pi-ai/dist/index.js.map +1 -1
  319. package/node_modules/@earendil-works/pi-ai/dist/providers/data/.manifest.json +1 -1
  320. package/node_modules/@earendil-works/pi-ai/dist/providers/data/alibaba-token-plan.json +1 -1
  321. package/node_modules/@earendil-works/pi-ai/dist/providers/data/amazon-bedrock.json +1 -1
  322. package/node_modules/@earendil-works/pi-ai/dist/providers/data/fireworks.json +1 -1
  323. package/node_modules/@earendil-works/pi-ai/dist/providers/data/openrouter.json +1 -1
  324. package/node_modules/@earendil-works/pi-ai/dist/providers/data/qwen-token-plan.json +1 -1
  325. package/node_modules/@earendil-works/pi-ai/dist/providers/data/venice.json +1 -1
  326. package/node_modules/@earendil-works/pi-ai/dist/providers/data/vercel-ai-gateway.json +1 -1
  327. package/node_modules/@earendil-works/pi-ai/dist/utils/empty-response-errors.d.ts +15 -0
  328. package/node_modules/@earendil-works/pi-ai/dist/utils/empty-response-errors.d.ts.map +1 -0
  329. package/node_modules/@earendil-works/pi-ai/dist/utils/empty-response-errors.js +15 -0
  330. package/node_modules/@earendil-works/pi-ai/dist/utils/empty-response-errors.js.map +1 -0
  331. package/node_modules/@earendil-works/pi-ai/dist/utils/retry.d.ts +23 -0
  332. package/node_modules/@earendil-works/pi-ai/dist/utils/retry.d.ts.map +1 -1
  333. package/node_modules/@earendil-works/pi-ai/dist/utils/retry.js +74 -0
  334. package/node_modules/@earendil-works/pi-ai/dist/utils/retry.js.map +1 -1
  335. package/node_modules/@earendil-works/pi-ai/package.json +2 -2
  336. package/node_modules/@earendil-works/pi-pty/package.json +1 -1
  337. package/node_modules/@earendil-works/pi-telemetry/package.json +1 -1
  338. package/node_modules/@earendil-works/pi-tui/package.json +1 -1
  339. package/package.json +7 -7
@@ -0,0 +1,155 @@
1
+ import { CharCode, FixedRing, isAsciiWhitespace } from "../stream-utils.js";
2
+ import { isAsciiAlphanumeric, isBoxDrawing } from "./collapse-scalars.js";
3
+ import { normalizeTurnText } from "./repetitive-turns.js";
4
+ export const NEAR_DUPLICATE_MIN_CHARS = 64;
5
+ export const NEAR_DUPLICATE_MIN_WORD_CHARS = 24;
6
+ export const NEAR_DUPLICATE_SIMILARITY = 0.5;
7
+ export const NEAR_DUPLICATE_LOOKBACK = 32;
8
+ export const NEAR_DUPLICATE_WINDOW = 12;
9
+ export const NEAR_DUPLICATE_ECHO_THRESHOLD = 8;
10
+ export const NEAR_DUPLICATE_TEXT_RETENTION_MAX = 512;
11
+ const SAMPLE_LENGTH = 80;
12
+ const WORD_PATTERN = /[\p{L}\p{N}#]+/gu;
13
+ const FENCE_PATTERN = /^(?:```|~~~)/;
14
+ export function createNearDuplicateState() {
15
+ return {
16
+ history: new FixedRing(NEAR_DUPLICATE_LOOKBACK),
17
+ window: new FixedRing(NEAR_DUPLICATE_WINDOW),
18
+ lineLength: 0,
19
+ lineWordChars: 0,
20
+ lineHasContent: false,
21
+ lineStartOffset: 0,
22
+ lineText: "",
23
+ length: 0,
24
+ wordChars: 0,
25
+ startOffset: 0,
26
+ retained: "",
27
+ fenced: false,
28
+ insideFence: false,
29
+ };
30
+ }
31
+ function tokenize(text) {
32
+ return new Set(normalizeTurnText(text).match(WORD_PATTERN) ?? []);
33
+ }
34
+ function jaccard(a, b) {
35
+ if (a.size === 0 || b.size === 0)
36
+ return 0;
37
+ let intersection = 0;
38
+ for (const token of a) {
39
+ if (b.has(token))
40
+ intersection += 1;
41
+ }
42
+ return intersection / (a.size + b.size - intersection);
43
+ }
44
+ function resetParagraph(state) {
45
+ state.length = 0;
46
+ state.wordChars = 0;
47
+ state.startOffset = 0;
48
+ state.retained = "";
49
+ state.fenced = false;
50
+ }
51
+ function countEchoes(state) {
52
+ let echoes = 0;
53
+ for (let back = state.window.size - 1; back >= 0; back--) {
54
+ if (state.window.getBack(back)?.echoed === true)
55
+ echoes += 1;
56
+ }
57
+ return echoes;
58
+ }
59
+ function oldestEcho(state) {
60
+ for (let back = state.window.size - 1; back >= 0; back--) {
61
+ const entry = state.window.getBack(back);
62
+ if (entry?.echoed === true)
63
+ return entry;
64
+ }
65
+ return undefined;
66
+ }
67
+ function completeParagraph(state) {
68
+ const eligible = !state.fenced && state.length >= NEAR_DUPLICATE_MIN_CHARS && state.wordChars >= NEAR_DUPLICATE_MIN_WORD_CHARS;
69
+ const text = state.retained;
70
+ const startOffset = state.startOffset;
71
+ resetParagraph(state);
72
+ if (!eligible)
73
+ return null;
74
+ const tokens = tokenize(text);
75
+ if (tokens.size === 0)
76
+ return null;
77
+ let best = 0;
78
+ let anchor;
79
+ for (let back = 0; back < state.history.size; back++) {
80
+ const previous = state.history.getBack(back);
81
+ if (previous === undefined)
82
+ continue;
83
+ const similarity = jaccard(tokens, previous.tokens);
84
+ if (similarity > best) {
85
+ best = similarity;
86
+ anchor = previous;
87
+ }
88
+ }
89
+ const echoed = best >= NEAR_DUPLICATE_SIMILARITY && anchor !== undefined;
90
+ state.history.push({ tokens, startOffset, sample: text.slice(0, SAMPLE_LENGTH) });
91
+ state.window.push({
92
+ echoed,
93
+ startOffset,
94
+ anchorStartOffset: echoed && anchor !== undefined ? anchor.startOffset : startOffset,
95
+ });
96
+ const echoes = countEchoes(state);
97
+ if (echoes < NEAR_DUPLICATE_ECHO_THRESHOLD)
98
+ return null;
99
+ const first = oldestEcho(state);
100
+ if (first === undefined)
101
+ return null;
102
+ return {
103
+ rule: "collapse-repetition",
104
+ reason: `${echoes} of the last ${state.window.size} paragraphs restate an earlier paragraph of the same message`,
105
+ anomalyStartOffset: first.anchorStartOffset,
106
+ garbageStartOffset: first.startOffset,
107
+ detail: {
108
+ mechanism: "near-duplicate-paragraphs",
109
+ echoes,
110
+ window: state.window.size,
111
+ similarity: Number(best.toFixed(3)),
112
+ sample: anchor?.sample ?? "",
113
+ },
114
+ };
115
+ }
116
+ function foldLine(state) {
117
+ if (state.length === 0)
118
+ state.startOffset = state.lineStartOffset;
119
+ state.length += state.lineLength + 1;
120
+ state.wordChars += state.lineWordChars;
121
+ if (state.insideFence || FENCE_PATTERN.test(state.lineText.trimStart()))
122
+ state.fenced = true;
123
+ if (state.retained.length < NEAR_DUPLICATE_TEXT_RETENTION_MAX)
124
+ state.retained += `${state.lineText}\n`;
125
+ if (FENCE_PATTERN.test(state.lineText.trimStart()))
126
+ state.insideFence = !state.insideFence;
127
+ }
128
+ function resetLine(state, startOffset) {
129
+ state.lineLength = 0;
130
+ state.lineWordChars = 0;
131
+ state.lineHasContent = false;
132
+ state.lineStartOffset = startOffset;
133
+ state.lineText = "";
134
+ }
135
+ export function updateNearDuplicates(state, entry) {
136
+ if (entry.value.charCodeAt(0) === CharCode.LineFeed) {
137
+ let result = null;
138
+ if (state.lineHasContent)
139
+ foldLine(state);
140
+ else if (state.length > 0)
141
+ result = completeParagraph(state);
142
+ resetLine(state, entry.startOffset + 1);
143
+ return result;
144
+ }
145
+ const codePoint = entry.value.codePointAt(0) ?? 0;
146
+ if (!isAsciiWhitespace(codePoint))
147
+ state.lineHasContent = true;
148
+ if (isAsciiAlphanumeric(codePoint) || (codePoint > 0x7f && !isBoxDrawing(codePoint)))
149
+ state.lineWordChars += 1;
150
+ state.lineLength += entry.width;
151
+ if (state.lineText.length < NEAR_DUPLICATE_TEXT_RETENTION_MAX)
152
+ state.lineText += entry.value;
153
+ return null;
154
+ }
155
+ //# sourceMappingURL=collapse-near-duplicates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collapse-near-duplicates.js","sourceRoot":"","sources":["../../../../../../src/core/extensions/builtin/ttsr/detectors/collapse-near-duplicates.ts"],"names":[],"mappings":"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","sourcesContent":["import { CharCode, FixedRing, isAsciiWhitespace, type ScalarEntry } from \"../stream-utils.ts\";\nimport type { DetectorMatch } from \"../types.ts\";\nimport { isAsciiAlphanumeric, isBoxDrawing } from \"./collapse-scalars.ts\";\nimport { normalizeTurnText } from \"./repetitive-turns.ts\";\n\nexport const NEAR_DUPLICATE_MIN_CHARS = 64;\nexport const NEAR_DUPLICATE_MIN_WORD_CHARS = 24;\nexport const NEAR_DUPLICATE_SIMILARITY = 0.5;\nexport const NEAR_DUPLICATE_LOOKBACK = 32;\nexport const NEAR_DUPLICATE_WINDOW = 12;\nexport const NEAR_DUPLICATE_ECHO_THRESHOLD = 8;\nexport const NEAR_DUPLICATE_TEXT_RETENTION_MAX = 512;\n\nconst SAMPLE_LENGTH = 80;\nconst WORD_PATTERN = /[\\p{L}\\p{N}#]+/gu;\nconst FENCE_PATTERN = /^(?:```|~~~)/;\n\ninterface ParagraphSignature {\n\treadonly tokens: ReadonlySet<string>;\n\treadonly startOffset: number;\n\treadonly sample: string;\n}\n\ninterface WindowEntry {\n\treadonly echoed: boolean;\n\treadonly startOffset: number;\n\treadonly anchorStartOffset: number;\n}\n\nexport interface NearDuplicateState {\n\treadonly history: FixedRing<ParagraphSignature>;\n\treadonly window: FixedRing<WindowEntry>;\n\tlineLength: number;\n\tlineWordChars: number;\n\tlineHasContent: boolean;\n\tlineStartOffset: number;\n\tlineText: string;\n\tlength: number;\n\twordChars: number;\n\tstartOffset: number;\n\tretained: string;\n\tfenced: boolean;\n\tinsideFence: boolean;\n}\n\nexport function createNearDuplicateState(): NearDuplicateState {\n\treturn {\n\t\thistory: new FixedRing<ParagraphSignature>(NEAR_DUPLICATE_LOOKBACK),\n\t\twindow: new FixedRing<WindowEntry>(NEAR_DUPLICATE_WINDOW),\n\t\tlineLength: 0,\n\t\tlineWordChars: 0,\n\t\tlineHasContent: false,\n\t\tlineStartOffset: 0,\n\t\tlineText: \"\",\n\t\tlength: 0,\n\t\twordChars: 0,\n\t\tstartOffset: 0,\n\t\tretained: \"\",\n\t\tfenced: false,\n\t\tinsideFence: false,\n\t};\n}\n\nfunction tokenize(text: string): ReadonlySet<string> {\n\treturn new Set(normalizeTurnText(text).match(WORD_PATTERN) ?? []);\n}\n\nfunction jaccard(a: ReadonlySet<string>, b: ReadonlySet<string>): number {\n\tif (a.size === 0 || b.size === 0) return 0;\n\tlet intersection = 0;\n\tfor (const token of a) {\n\t\tif (b.has(token)) intersection += 1;\n\t}\n\treturn intersection / (a.size + b.size - intersection);\n}\n\nfunction resetParagraph(state: NearDuplicateState): void {\n\tstate.length = 0;\n\tstate.wordChars = 0;\n\tstate.startOffset = 0;\n\tstate.retained = \"\";\n\tstate.fenced = false;\n}\n\nfunction countEchoes(state: NearDuplicateState): number {\n\tlet echoes = 0;\n\tfor (let back = state.window.size - 1; back >= 0; back--) {\n\t\tif (state.window.getBack(back)?.echoed === true) echoes += 1;\n\t}\n\treturn echoes;\n}\n\nfunction oldestEcho(state: NearDuplicateState): WindowEntry | undefined {\n\tfor (let back = state.window.size - 1; back >= 0; back--) {\n\t\tconst entry = state.window.getBack(back);\n\t\tif (entry?.echoed === true) return entry;\n\t}\n\treturn undefined;\n}\n\nfunction completeParagraph(state: NearDuplicateState): DetectorMatch | null {\n\tconst eligible =\n\t\t!state.fenced && state.length >= NEAR_DUPLICATE_MIN_CHARS && state.wordChars >= NEAR_DUPLICATE_MIN_WORD_CHARS;\n\tconst text = state.retained;\n\tconst startOffset = state.startOffset;\n\tresetParagraph(state);\n\tif (!eligible) return null;\n\tconst tokens = tokenize(text);\n\tif (tokens.size === 0) return null;\n\tlet best = 0;\n\tlet anchor: ParagraphSignature | undefined;\n\tfor (let back = 0; back < state.history.size; back++) {\n\t\tconst previous = state.history.getBack(back);\n\t\tif (previous === undefined) continue;\n\t\tconst similarity = jaccard(tokens, previous.tokens);\n\t\tif (similarity > best) {\n\t\t\tbest = similarity;\n\t\t\tanchor = previous;\n\t\t}\n\t}\n\tconst echoed = best >= NEAR_DUPLICATE_SIMILARITY && anchor !== undefined;\n\tstate.history.push({ tokens, startOffset, sample: text.slice(0, SAMPLE_LENGTH) });\n\tstate.window.push({\n\t\techoed,\n\t\tstartOffset,\n\t\tanchorStartOffset: echoed && anchor !== undefined ? anchor.startOffset : startOffset,\n\t});\n\tconst echoes = countEchoes(state);\n\tif (echoes < NEAR_DUPLICATE_ECHO_THRESHOLD) return null;\n\tconst first = oldestEcho(state);\n\tif (first === undefined) return null;\n\treturn {\n\t\trule: \"collapse-repetition\",\n\t\treason: `${echoes} of the last ${state.window.size} paragraphs restate an earlier paragraph of the same message`,\n\t\tanomalyStartOffset: first.anchorStartOffset,\n\t\tgarbageStartOffset: first.startOffset,\n\t\tdetail: {\n\t\t\tmechanism: \"near-duplicate-paragraphs\",\n\t\t\techoes,\n\t\t\twindow: state.window.size,\n\t\t\tsimilarity: Number(best.toFixed(3)),\n\t\t\tsample: anchor?.sample ?? \"\",\n\t\t},\n\t};\n}\n\nfunction foldLine(state: NearDuplicateState): void {\n\tif (state.length === 0) state.startOffset = state.lineStartOffset;\n\tstate.length += state.lineLength + 1;\n\tstate.wordChars += state.lineWordChars;\n\tif (state.insideFence || FENCE_PATTERN.test(state.lineText.trimStart())) state.fenced = true;\n\tif (state.retained.length < NEAR_DUPLICATE_TEXT_RETENTION_MAX) state.retained += `${state.lineText}\\n`;\n\tif (FENCE_PATTERN.test(state.lineText.trimStart())) state.insideFence = !state.insideFence;\n}\n\nfunction resetLine(state: NearDuplicateState, startOffset: number): void {\n\tstate.lineLength = 0;\n\tstate.lineWordChars = 0;\n\tstate.lineHasContent = false;\n\tstate.lineStartOffset = startOffset;\n\tstate.lineText = \"\";\n}\n\nexport function updateNearDuplicates(state: NearDuplicateState, entry: ScalarEntry): DetectorMatch | null {\n\tif (entry.value.charCodeAt(0) === CharCode.LineFeed) {\n\t\tlet result: DetectorMatch | null = null;\n\t\tif (state.lineHasContent) foldLine(state);\n\t\telse if (state.length > 0) result = completeParagraph(state);\n\t\tresetLine(state, entry.startOffset + 1);\n\t\treturn result;\n\t}\n\tconst codePoint = entry.value.codePointAt(0) ?? 0;\n\tif (!isAsciiWhitespace(codePoint)) state.lineHasContent = true;\n\tif (isAsciiAlphanumeric(codePoint) || (codePoint > 0x7f && !isBoxDrawing(codePoint))) state.lineWordChars += 1;\n\tstate.lineLength += entry.width;\n\tif (state.lineText.length < NEAR_DUPLICATE_TEXT_RETENTION_MAX) state.lineText += entry.value;\n\treturn null;\n}\n"]}
@@ -1,6 +1,7 @@
1
1
  import { FixedRing, type ScalarEntry, ScalarScanner } from "../stream-utils.ts";
2
2
  import type { DetectorMatch, StreamDetector } from "../types.ts";
3
3
  import { type LineCycleState } from "./collapse-lines.ts";
4
+ import { type NearDuplicateState } from "./collapse-near-duplicates.ts";
4
5
  import { type ParagraphRepeatState } from "./collapse-paragraphs.ts";
5
6
  import { type ShortPeriodState } from "./collapse-periods.ts";
6
7
  import { type DominantRunState, type WhitespaceFloodState } from "./collapse-scalars.ts";
@@ -13,6 +14,7 @@ export interface CollapseState {
13
14
  readonly periods: ShortPeriodState;
14
15
  readonly lines: LineCycleState;
15
16
  readonly paragraphs: ParagraphRepeatState;
17
+ readonly nearDuplicates: NearDuplicateState;
16
18
  latched: DetectorMatch | null;
17
19
  }
18
20
  export declare function createCollapseState(): CollapseState;
@@ -1 +1 @@
1
- {"version":3,"file":"collapse.d.ts","sourceRoot":"","sources":["../../../../../../src/core/extensions/builtin/ttsr/detectors/collapse.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,KAAK,WAAW,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAChF,OAAO,KAAK,EAAmB,aAAa,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAClF,OAAO,EAAwB,KAAK,cAAc,EAAoB,MAAM,qBAAqB,CAAC;AAClG,OAAO,EAEN,KAAK,oBAAoB,EAEzB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAA0B,KAAK,gBAAgB,EAAsB,MAAM,uBAAuB,CAAC;AAC1G,OAAO,EAGN,KAAK,gBAAgB,EAGrB,KAAK,oBAAoB,EACzB,MAAM,uBAAuB,CAAC;AAE/B,eAAO,MAAM,kBAAkB,MAAM,CAAC;AAEtC,MAAM,WAAW,aAAa;IAC7B,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC;IAChC,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAC,WAAW,CAAC,CAAC;IAC1C,QAAQ,CAAC,GAAG,EAAE,gBAAgB,CAAC;IAC/B,QAAQ,CAAC,UAAU,EAAE,oBAAoB,CAAC;IAC1C,QAAQ,CAAC,OAAO,EAAE,gBAAgB,CAAC;IACnC,QAAQ,CAAC,KAAK,EAAE,cAAc,CAAC;IAC/B,QAAQ,CAAC,UAAU,EAAE,oBAAoB,CAAC;IAC1C,OAAO,EAAE,aAAa,GAAG,IAAI,CAAC;CAC9B;AAED,wBAAgB,mBAAmB,IAAI,aAAa,CAWnD;AAqBD,eAAO,MAAM,gBAAgB,EAAE,cAAc,CAAC,aAAa,CAG1D,CAAC"}
1
+ {"version":3,"file":"collapse.d.ts","sourceRoot":"","sources":["../../../../../../src/core/extensions/builtin/ttsr/detectors/collapse.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,KAAK,WAAW,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAChF,OAAO,KAAK,EAAmB,aAAa,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAClF,OAAO,EAAwB,KAAK,cAAc,EAAoB,MAAM,qBAAqB,CAAC;AAClG,OAAO,EAA4B,KAAK,kBAAkB,EAAwB,MAAM,+BAA+B,CAAC;AACxH,OAAO,EAEN,KAAK,oBAAoB,EAEzB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAA0B,KAAK,gBAAgB,EAAsB,MAAM,uBAAuB,CAAC;AAC1G,OAAO,EAGN,KAAK,gBAAgB,EAGrB,KAAK,oBAAoB,EACzB,MAAM,uBAAuB,CAAC;AAE/B,eAAO,MAAM,kBAAkB,MAAM,CAAC;AAEtC,MAAM,WAAW,aAAa;IAC7B,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC;IAChC,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAC,WAAW,CAAC,CAAC;IAC1C,QAAQ,CAAC,GAAG,EAAE,gBAAgB,CAAC;IAC/B,QAAQ,CAAC,UAAU,EAAE,oBAAoB,CAAC;IAC1C,QAAQ,CAAC,OAAO,EAAE,gBAAgB,CAAC;IACnC,QAAQ,CAAC,KAAK,EAAE,cAAc,CAAC;IAC/B,QAAQ,CAAC,UAAU,EAAE,oBAAoB,CAAC;IAC1C,QAAQ,CAAC,cAAc,EAAE,kBAAkB,CAAC;IAC5C,OAAO,EAAE,aAAa,GAAG,IAAI,CAAC;CAC9B;AAED,wBAAgB,mBAAmB,IAAI,aAAa,CAYnD;AAsBD,eAAO,MAAM,gBAAgB,EAAE,cAAc,CAAC,aAAa,CAG1D,CAAC"}
@@ -1,5 +1,6 @@
1
1
  import { FixedRing, ScalarScanner } from "../stream-utils.js";
2
2
  import { createLineCycleState, updateLineCycles } from "./collapse-lines.js";
3
+ import { createNearDuplicateState, updateNearDuplicates } from "./collapse-near-duplicates.js";
3
4
  import { createParagraphRepeatState, updateParagraphRepeats, } from "./collapse-paragraphs.js";
4
5
  import { createShortPeriodState, updateShortPeriods } from "./collapse-periods.js";
5
6
  import { createDominantRunState, createWhitespaceFloodState, updateDominantRun, updateWhitespaceFlood, } from "./collapse-scalars.js";
@@ -13,6 +14,7 @@ export function createCollapseState() {
13
14
  periods: createShortPeriodState(),
14
15
  lines: createLineCycleState(),
15
16
  paragraphs: createParagraphRepeatState(),
17
+ nearDuplicates: createNearDuplicateState(),
16
18
  latched: null,
17
19
  };
18
20
  }
@@ -26,7 +28,8 @@ function checkDelta(state, delta, context) {
26
28
  updateWhitespaceFlood(state.whitespace, entry) ??
27
29
  updateShortPeriods(state.periods, entry, state.tailRing) ??
28
30
  updateLineCycles(state.lines, entry) ??
29
- (watchParagraphs ? updateParagraphRepeats(state.paragraphs, entry) : null);
31
+ (watchParagraphs ? updateParagraphRepeats(state.paragraphs, entry) : null) ??
32
+ (watchParagraphs ? updateNearDuplicates(state.nearDuplicates, entry) : null);
30
33
  if (match !== null) {
31
34
  state.latched = match;
32
35
  return match;
@@ -1 +1 @@
1
- {"version":3,"file":"collapse.js","sourceRoot":"","sources":["../../../../../../src/core/extensions/builtin/ttsr/detectors/collapse.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAoB,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAEhF,OAAO,EAAE,oBAAoB,EAAuB,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAClG,OAAO,EACN,0BAA0B,EAE1B,sBAAsB,GACtB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,sBAAsB,EAAyB,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC1G,OAAO,EACN,sBAAsB,EACtB,0BAA0B,EAE1B,iBAAiB,EACjB,qBAAqB,GAErB,MAAM,uBAAuB,CAAC;AAE/B,MAAM,CAAC,MAAM,kBAAkB,GAAG,GAAG,CAAC;AAatC,MAAM,UAAU,mBAAmB;IAClC,OAAO;QACN,OAAO,EAAE,IAAI,aAAa,EAAE;QAC5B,QAAQ,EAAE,IAAI,SAAS,CAAc,kBAAkB,CAAC;QACxD,GAAG,EAAE,sBAAsB,EAAE;QAC7B,UAAU,EAAE,0BAA0B,EAAE;QACxC,OAAO,EAAE,sBAAsB,EAAE;QACjC,KAAK,EAAE,oBAAoB,EAAE;QAC7B,UAAU,EAAE,0BAA0B,EAAE;QACxC,OAAO,EAAE,IAAI;KACb,CAAC;AACH,CAAC;AAED,SAAS,UAAU,CAAC,KAAoB,EAAE,KAAa,EAAE,OAAwB;IAChF,IAAI,KAAK,CAAC,OAAO,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC,OAAO,CAAC;IACjD,MAAM,eAAe,GAAG,OAAO,CAAC,MAAM,KAAK,MAAM,CAAC;IAClD,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAC/C,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC3B,MAAM,KAAK,GACV,iBAAiB,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC;YACnC,qBAAqB,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC;YAC9C,kBAAkB,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,QAAQ,CAAC;YACxD,gBAAgB,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC;YACpC,CAAC,eAAe,CAAC,CAAC,CAAC,sBAAsB,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAC5E,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;YACpB,KAAK,CAAC,OAAO,GAAG,KAAK,CAAC;YACtB,OAAO,KAAK,CAAC;QACd,CAAC;IACF,CAAC;IACD,OAAO,IAAI,CAAC;AACb,CAAC;AAED,MAAM,CAAC,MAAM,gBAAgB,GAAkC;IAC9D,WAAW,EAAE,mBAAmB;IAChC,UAAU;CACV,CAAC","sourcesContent":["import { FixedRing, type ScalarEntry, ScalarScanner } from \"../stream-utils.ts\";\nimport type { DetectorContext, DetectorMatch, StreamDetector } from \"../types.ts\";\nimport { createLineCycleState, type LineCycleState, updateLineCycles } from \"./collapse-lines.ts\";\nimport {\n\tcreateParagraphRepeatState,\n\ttype ParagraphRepeatState,\n\tupdateParagraphRepeats,\n} from \"./collapse-paragraphs.ts\";\nimport { createShortPeriodState, type ShortPeriodState, updateShortPeriods } from \"./collapse-periods.ts\";\nimport {\n\tcreateDominantRunState,\n\tcreateWhitespaceFloodState,\n\ttype DominantRunState,\n\tupdateDominantRun,\n\tupdateWhitespaceFlood,\n\ttype WhitespaceFloodState,\n} from \"./collapse-scalars.ts\";\n\nexport const TAIL_RING_CAPACITY = 512;\n\nexport interface CollapseState {\n\treadonly scanner: ScalarScanner;\n\treadonly tailRing: FixedRing<ScalarEntry>;\n\treadonly run: DominantRunState;\n\treadonly whitespace: WhitespaceFloodState;\n\treadonly periods: ShortPeriodState;\n\treadonly lines: LineCycleState;\n\treadonly paragraphs: ParagraphRepeatState;\n\tlatched: DetectorMatch | null;\n}\n\nexport function createCollapseState(): CollapseState {\n\treturn {\n\t\tscanner: new ScalarScanner(),\n\t\ttailRing: new FixedRing<ScalarEntry>(TAIL_RING_CAPACITY),\n\t\trun: createDominantRunState(),\n\t\twhitespace: createWhitespaceFloodState(),\n\t\tperiods: createShortPeriodState(),\n\t\tlines: createLineCycleState(),\n\t\tparagraphs: createParagraphRepeatState(),\n\t\tlatched: null,\n\t};\n}\n\nfunction checkDelta(state: CollapseState, delta: string, context: DetectorContext): DetectorMatch | null {\n\tif (state.latched !== null) return state.latched;\n\tconst watchParagraphs = context.source !== \"tool\";\n\tfor (const entry of state.scanner.push(delta)) {\n\t\tstate.tailRing.push(entry);\n\t\tconst match =\n\t\t\tupdateDominantRun(state.run, entry) ??\n\t\t\tupdateWhitespaceFlood(state.whitespace, entry) ??\n\t\t\tupdateShortPeriods(state.periods, entry, state.tailRing) ??\n\t\t\tupdateLineCycles(state.lines, entry) ??\n\t\t\t(watchParagraphs ? updateParagraphRepeats(state.paragraphs, entry) : null);\n\t\tif (match !== null) {\n\t\t\tstate.latched = match;\n\t\t\treturn match;\n\t\t}\n\t}\n\treturn null;\n}\n\nexport const collapseDetector: StreamDetector<CollapseState> = {\n\tcreateState: createCollapseState,\n\tcheckDelta,\n};\n"]}
1
+ {"version":3,"file":"collapse.js","sourceRoot":"","sources":["../../../../../../src/core/extensions/builtin/ttsr/detectors/collapse.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAoB,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAEhF,OAAO,EAAE,oBAAoB,EAAuB,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAClG,OAAO,EAAE,wBAAwB,EAA2B,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AACxH,OAAO,EACN,0BAA0B,EAE1B,sBAAsB,GACtB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,sBAAsB,EAAyB,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC1G,OAAO,EACN,sBAAsB,EACtB,0BAA0B,EAE1B,iBAAiB,EACjB,qBAAqB,GAErB,MAAM,uBAAuB,CAAC;AAE/B,MAAM,CAAC,MAAM,kBAAkB,GAAG,GAAG,CAAC;AActC,MAAM,UAAU,mBAAmB;IAClC,OAAO;QACN,OAAO,EAAE,IAAI,aAAa,EAAE;QAC5B,QAAQ,EAAE,IAAI,SAAS,CAAc,kBAAkB,CAAC;QACxD,GAAG,EAAE,sBAAsB,EAAE;QAC7B,UAAU,EAAE,0BAA0B,EAAE;QACxC,OAAO,EAAE,sBAAsB,EAAE;QACjC,KAAK,EAAE,oBAAoB,EAAE;QAC7B,UAAU,EAAE,0BAA0B,EAAE;QACxC,cAAc,EAAE,wBAAwB,EAAE;QAC1C,OAAO,EAAE,IAAI;KACb,CAAC;AACH,CAAC;AAED,SAAS,UAAU,CAAC,KAAoB,EAAE,KAAa,EAAE,OAAwB;IAChF,IAAI,KAAK,CAAC,OAAO,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC,OAAO,CAAC;IACjD,MAAM,eAAe,GAAG,OAAO,CAAC,MAAM,KAAK,MAAM,CAAC;IAClD,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAC/C,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC3B,MAAM,KAAK,GACV,iBAAiB,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC;YACnC,qBAAqB,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC;YAC9C,kBAAkB,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,QAAQ,CAAC;YACxD,gBAAgB,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC;YACpC,CAAC,eAAe,CAAC,CAAC,CAAC,sBAAsB,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YAC1E,CAAC,eAAe,CAAC,CAAC,CAAC,oBAAoB,CAAC,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAC9E,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;YACpB,KAAK,CAAC,OAAO,GAAG,KAAK,CAAC;YACtB,OAAO,KAAK,CAAC;QACd,CAAC;IACF,CAAC;IACD,OAAO,IAAI,CAAC;AACb,CAAC;AAED,MAAM,CAAC,MAAM,gBAAgB,GAAkC;IAC9D,WAAW,EAAE,mBAAmB;IAChC,UAAU;CACV,CAAC","sourcesContent":["import { FixedRing, type ScalarEntry, ScalarScanner } from \"../stream-utils.ts\";\nimport type { DetectorContext, DetectorMatch, StreamDetector } from \"../types.ts\";\nimport { createLineCycleState, type LineCycleState, updateLineCycles } from \"./collapse-lines.ts\";\nimport { createNearDuplicateState, type NearDuplicateState, updateNearDuplicates } from \"./collapse-near-duplicates.ts\";\nimport {\n\tcreateParagraphRepeatState,\n\ttype ParagraphRepeatState,\n\tupdateParagraphRepeats,\n} from \"./collapse-paragraphs.ts\";\nimport { createShortPeriodState, type ShortPeriodState, updateShortPeriods } from \"./collapse-periods.ts\";\nimport {\n\tcreateDominantRunState,\n\tcreateWhitespaceFloodState,\n\ttype DominantRunState,\n\tupdateDominantRun,\n\tupdateWhitespaceFlood,\n\ttype WhitespaceFloodState,\n} from \"./collapse-scalars.ts\";\n\nexport const TAIL_RING_CAPACITY = 512;\n\nexport interface CollapseState {\n\treadonly scanner: ScalarScanner;\n\treadonly tailRing: FixedRing<ScalarEntry>;\n\treadonly run: DominantRunState;\n\treadonly whitespace: WhitespaceFloodState;\n\treadonly periods: ShortPeriodState;\n\treadonly lines: LineCycleState;\n\treadonly paragraphs: ParagraphRepeatState;\n\treadonly nearDuplicates: NearDuplicateState;\n\tlatched: DetectorMatch | null;\n}\n\nexport function createCollapseState(): CollapseState {\n\treturn {\n\t\tscanner: new ScalarScanner(),\n\t\ttailRing: new FixedRing<ScalarEntry>(TAIL_RING_CAPACITY),\n\t\trun: createDominantRunState(),\n\t\twhitespace: createWhitespaceFloodState(),\n\t\tperiods: createShortPeriodState(),\n\t\tlines: createLineCycleState(),\n\t\tparagraphs: createParagraphRepeatState(),\n\t\tnearDuplicates: createNearDuplicateState(),\n\t\tlatched: null,\n\t};\n}\n\nfunction checkDelta(state: CollapseState, delta: string, context: DetectorContext): DetectorMatch | null {\n\tif (state.latched !== null) return state.latched;\n\tconst watchParagraphs = context.source !== \"tool\";\n\tfor (const entry of state.scanner.push(delta)) {\n\t\tstate.tailRing.push(entry);\n\t\tconst match =\n\t\t\tupdateDominantRun(state.run, entry) ??\n\t\t\tupdateWhitespaceFlood(state.whitespace, entry) ??\n\t\t\tupdateShortPeriods(state.periods, entry, state.tailRing) ??\n\t\t\tupdateLineCycles(state.lines, entry) ??\n\t\t\t(watchParagraphs ? updateParagraphRepeats(state.paragraphs, entry) : null) ??\n\t\t\t(watchParagraphs ? updateNearDuplicates(state.nearDuplicates, entry) : null);\n\t\tif (match !== null) {\n\t\t\tstate.latched = match;\n\t\t\treturn match;\n\t\t}\n\t}\n\treturn null;\n}\n\nexport const collapseDetector: StreamDetector<CollapseState> = {\n\tcreateState: createCollapseState,\n\tcheckDelta,\n};\n"]}
@@ -0,0 +1,13 @@
1
+ import { AsyncLocalStorage } from "node:async_hooks";
2
+ export type ExtensionKernelTools = {
3
+ describe(names: readonly string[]): Promise<unknown>;
4
+ invoke(request: {
5
+ name: string;
6
+ kernel_generation: number;
7
+ definition_revision: number;
8
+ args: unknown;
9
+ call_id: string;
10
+ }, signal?: AbortSignal): Promise<unknown>;
11
+ };
12
+ export declare const kernelToolsStorage: AsyncLocalStorage<ExtensionKernelTools>;
13
+ //# sourceMappingURL=kernel-tools-context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kernel-tools-context.d.ts","sourceRoot":"","sources":["../../../src/core/extensions/kernel-tools-context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAErD,MAAM,MAAM,oBAAoB,GAAG;IAClC,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACrD,MAAM,CACL,OAAO,EAAE;QACR,IAAI,EAAE,MAAM,CAAC;QACb,iBAAiB,EAAE,MAAM,CAAC;QAC1B,mBAAmB,EAAE,MAAM,CAAC;QAC5B,IAAI,EAAE,OAAO,CAAC;QACd,OAAO,EAAE,MAAM,CAAC;KAChB,EACD,MAAM,CAAC,EAAE,WAAW,GAClB,OAAO,CAAC,OAAO,CAAC,CAAC;CACpB,CAAC;AAEF,eAAO,MAAM,kBAAkB,yCAAgD,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { AsyncLocalStorage } from "node:async_hooks";
2
+ export const kernelToolsStorage = new AsyncLocalStorage();
3
+ //# sourceMappingURL=kernel-tools-context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kernel-tools-context.js","sourceRoot":"","sources":["../../../src/core/extensions/kernel-tools-context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAgBrD,MAAM,CAAC,MAAM,kBAAkB,GAAG,IAAI,iBAAiB,EAAwB,CAAC","sourcesContent":["import { AsyncLocalStorage } from \"node:async_hooks\";\n\nexport type ExtensionKernelTools = {\n\tdescribe(names: readonly string[]): Promise<unknown>;\n\tinvoke(\n\t\trequest: {\n\t\t\tname: string;\n\t\t\tkernel_generation: number;\n\t\t\tdefinition_revision: number;\n\t\t\targs: unknown;\n\t\t\tcall_id: string;\n\t\t},\n\t\tsignal?: AbortSignal,\n\t): Promise<unknown>;\n};\n\nexport const kernelToolsStorage = new AsyncLocalStorage<ExtensionKernelTools>();\n"]}
@@ -97,6 +97,9 @@ export type ShutdownHandler = () => void;
97
97
  /**
98
98
  * Helper function to emit session_shutdown event to extensions.
99
99
  * Returns true if the event was emitted, false if there were no handlers.
100
+ *
101
+ * Each handler runs under the host's shutdown budget (see
102
+ * `ExtensionRunner.emit`), so a hung extension cannot hold teardown hostage.
100
103
  */
101
104
  export declare function emitSessionShutdownEvent(extensionRunner: ExtensionRunner, event: SessionShutdownEvent): Promise<boolean>;
102
105
  export declare function emitProjectTrustEvent(extensionsResult: LoadExtensionsResult, event: ProjectTrustEvent, ctx: ProjectTrustContext): Promise<{
@@ -232,6 +235,22 @@ export declare class ExtensionRunner {
232
235
  createContext(excludeBeforeProviderRequestExtensionPath?: string): ExtensionContext;
233
236
  createCommandContext(): ExtensionCommandContext;
234
237
  private isSessionBeforeEvent;
238
+ /**
239
+ * Host budget for `session_shutdown` handlers, read from settings once per
240
+ * shutdown emission (teardown runs once per runner, so a settings edit takes
241
+ * effect without a reload). A malformed value must never break teardown, so
242
+ * an invalid setting is reported and the shipped defaults are used.
243
+ */
244
+ private resolveSessionShutdownBudget;
245
+ /**
246
+ * Runs one `session_shutdown` handler under the host budget. The handler sees
247
+ * the budget through `event.signal`, which this runner aborts at the hard cap;
248
+ * the host then stops waiting (the handler itself keeps running detached),
249
+ * reports an extension error and lets teardown continue with the next handler.
250
+ * Handler rejections are rethrown so emit()'s existing error path reports them
251
+ * exactly as before.
252
+ */
253
+ private runSessionShutdownHandler;
235
254
  emit<TEvent extends RunnerEmitEvent>(event: TEvent): Promise<RunnerEmitResult<TEvent>>;
236
255
  emitModelSelect(event: ModelSelectEvent): Promise<ModelSelectEventResult | undefined>;
237
256
  emitMessageEnd(event: MessageEndEvent): Promise<AgentMessage | undefined>;
@@ -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":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,KAAK,EAAE,GAAG,EAAE,YAAY,EAAE,KAAK,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACjG,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAC;AAIpD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAC;AAC/E,OAAO,EAAkB,KAAK,QAAQ,EAA+B,KAAK,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACrH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAE1D,OAAO,EAAsD,KAAK,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAMhH,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAC;AAKpE,OAAO,KAAK,EACX,qBAAqB,EACrB,2BAA2B,EAC3B,0BAA0B,EAC1B,0BAA0B,EAE1B,YAAY,EAGZ,aAAa,EACb,SAAS,EACT,gBAAgB,EAChB,uBAAuB,EACvB,8BAA8B,EAC9B,gBAAgB,EAChB,uBAAuB,EACvB,cAAc,EACd,cAAc,EACd,aAAa,EACb,aAAa,EACb,gBAAgB,EAChB,iBAAiB,EACjB,kBAAkB,EAClB,UAAU,EACV,gBAAgB,EAChB,WAAW,EACX,oBAAoB,EACpB,mBAAmB,EACnB,eAAe,EAEf,eAAe,EACf,gBAAgB,EAChB,sBAAsB,EACtB,mBAAmB,EACnB,iBAAiB,EACjB,uBAAuB,EACvB,cAAc,EACd,0BAA0B,EAE1B,8BAA8B,EAC9B,cAAc,EACd,sBAAsB,EACtB,eAAe,EAEf,sBAAsB,EAGtB,0BAA0B,EAC1B,uBAAuB,EACvB,yBAAyB,EACzB,yBAAyB,EACzB,uBAAuB,EACvB,oBAAoB,EACpB,aAAa,EACb,mBAAmB,EACnB,eAAe,EACf,qBAAqB,EAErB,aAAa,EACb,mBAAmB,EACnB,MAAM,YAAY,CAAC;AAgDpB,2DAA2D;AAC3D,UAAU,8BAA8B;IACvC,QAAQ,CAAC,EAAE,WAAW,CAAC,2BAA2B,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC;IACjE,YAAY,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;GAGG;AACH,KAAK,eAAe,GAAG,OAAO,CAC7B,cAAc,EACZ,aAAa,GACb,iBAAiB,GACjB,eAAe,GACf,aAAa,GACb,YAAY,GACZ,0BAA0B,GAC1B,0BAA0B,GAC1B,qBAAqB,GACrB,gBAAgB,GAChB,eAAe,GACf,sBAAsB,GACtB,UAAU,CACZ,CAAC;AAqBF,KAAK,gBAAgB,CAAC,MAAM,SAAS,eAAe,IAAI,MAAM,SAAS;IAAE,IAAI,EAAE,uBAAuB,CAAA;CAAE,GACrG,yBAAyB,GAAG,SAAS,GACrC,MAAM,SAAS;IAAE,IAAI,EAAE,qBAAqB,CAAA;CAAE,GAC7C,uBAAuB,GAAG,SAAS,GACnC,MAAM,SAAS;IAAE,IAAI,EAAE,uBAAuB,CAAA;CAAE,GAC/C,yBAAyB,GAAG,SAAS,GACrC,MAAM,SAAS;IAAE,IAAI,EAAE,wBAAwB,CAAA;CAAE,GAChD,0BAA0B,GAAG,SAAS,GACtC,MAAM,SAAS;IAAE,IAAI,EAAE,qBAAqB,CAAA;CAAE,GAC7C,uBAAuB,GAAG,SAAS,GACnC,SAAS,CAAC;AAUjB,MAAM,MAAM,sBAAsB,GAAG,CAAC,KAAK,EAAE,cAAc,KAAK,IAAI,CAAC;AAgBrE,MAAM,MAAM,qBAAqB,GAAG,YAAY,GAAG,aAAa,CAAC;AACjE,MAAM,MAAM,gCAAgC,GAAG,WAAW,GAAG,SAAS,GAAG,QAAQ,CAAC;AAElF,KAAK,mCAAmC,GAAG;IAC1C,IAAI,EAAE,kBAAkB,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,qBAAqB,CAAC;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,+BAA+B,GACxC,CAAC,mCAAmC,GAAG;IACvC,KAAK,EAAE,OAAO,CAAC;CACd,CAAC,GACF,CAAC,mCAAmC,GAAG;IACvC,KAAK,EAAE,QAAQ,CAAC;CACf,CAAC,GACF,CAAC,mCAAmC,GAAG;IACvC,KAAK,EAAE,KAAK,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,gCAAgC,CAAC;IACzC,YAAY,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC,CAAC;AAEN,MAAM,MAAM,kCAAkC,GAAG,CAAC,KAAK,EAAE,+BAA+B,KAAK,IAAI,CAAC;AAElG,MAAM,MAAM,iBAAiB,GAAG,CAAC,OAAO,CAAC,EAAE;IAC1C,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,CAAC,cAAc,EAAE,cAAc,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1D,WAAW,CAAC,EAAE,CAAC,GAAG,EAAE,sBAAsB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAC7D,KAAK,OAAO,CAAC;IAAE,SAAS,EAAE,OAAO,CAAA;CAAE,CAAC,CAAC;AAEtC,MAAM,MAAM,WAAW,GAAG,CACzB,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE;IAAE,QAAQ,CAAC,EAAE,QAAQ,GAAG,IAAI,CAAC;IAAC,WAAW,CAAC,EAAE,CAAC,GAAG,EAAE,sBAAsB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;CAAE,KAClG,OAAO,CAAC;IAAE,SAAS,EAAE,OAAO,CAAA;CAAE,CAAC,CAAC;AAErC,MAAM,MAAM,mBAAmB,GAAG,CACjC,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE;IAAE,SAAS,CAAC,EAAE,OAAO,CAAC;IAAC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAAC,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,KACzG,OAAO,CAAC;IAAE,SAAS,EAAE,OAAO,CAAA;CAAE,CAAC,CAAC;AAErC,MAAM,MAAM,2BAA2B,GAAG,CACzC,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE;IAAE,SAAS,CAAC,EAAE,OAAO,CAAC;IAAC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAAC,cAAc,CAAC,EAAE,MAAM,CAAA;CAAE,KACnF,OAAO,CAAC;IAAE,SAAS,EAAE,OAAO,CAAC;IAAC,SAAS,CAAC,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAE5E,MAAM,MAAM,oBAAoB,GAAG,CAClC,WAAW,EAAE,MAAM,EACnB,OAAO,CAAC,EAAE;IAAE,WAAW,CAAC,EAAE,CAAC,GAAG,EAAE,sBAAsB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;CAAE,KACtE,OAAO,CAAC;IAAE,SAAS,EAAE,OAAO,CAAA;CAAE,CAAC,CAAC;AAErC,MAAM,MAAM,aAAa,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;AAEhD,MAAM,MAAM,eAAe,GAAG,MAAM,IAAI,CAAC;AAUzC;;;;;;GAMG;AACH,wBAAsB,wBAAwB,CAC7C,eAAe,EAAE,eAAe,EAChC,KAAK,EAAE,oBAAoB,GACzB,OAAO,CAAC,OAAO,CAAC,CAMlB;AAED,wBAAsB,qBAAqB,CAC1C,gBAAgB,EAAE,oBAAoB,EACtC,KAAK,EAAE,iBAAiB,EACxB,GAAG,EAAE,mBAAmB,GACtB,OAAO,CAAC;IAAE,MAAM,CAAC,EAAE,uBAAuB,CAAC;IAAC,MAAM,EAAE,cAAc,EAAE,CAAA;CAAE,CAAC,CA0BzE;AA4DD,qBAAa,eAAe;IAC3B,OAAO,CAAC,UAAU,CAAc;IAChC,OAAO,CAAC,OAAO,CAAmB;IAClC,OAAO,CAAC,SAAS,CAAqB;IACtC,OAAO,CAAC,IAAI,CAA0B;IACtC,OAAO,CAAC,GAAG,CAAS;IACpB,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,QAAQ,CAAW;IAC3B,OAAO,CAAC,cAAc,CAA0C;IAChE,OAAO,CAAC,QAAQ,CAAiD;IACjE,OAAO,CAAC,cAAc,CAAkD;IACxE,OAAO,CAAC,uBAAuB,CAA8D;IAC7F,OAAO,CAAC,eAAe,CAA0C;IACjE,OAAO,CAAC,QAAQ,CAA6B;IAC7C,OAAO,CAAC,kBAAkB,CAA6B;IACvD,OAAO,CAAC,WAAW,CAAkD;IACrE,OAAO,CAAC,aAAa,CAAuC;IAC5D,OAAO,CAAC,OAAO,CAA8C;IAC7D,OAAO,CAAC,oBAAoB,CAA8B;IAC1D,OAAO,CAAC,cAAc,CAA8B;IACpD,OAAO,CAAC,iBAAiB,CAA6C;IACtE,OAAO,CAAC,iBAAiB,CAAmD;IAC5E,OAAO,CAAC,uBAAuB,CAI5B;IACH,OAAO,CAAC,+BAA+B,CAA6C;IACpF,OAAO,CAAC,sCAAsC,CAA2B;IACzE,OAAO,CAAC,iCAAiC,CAC4D;IACrG,OAAO,CAAC,mBAAmB,CAGxB;IACH,OAAO,CAAC,oBAAoB,CAGzB;IACH,OAAO,CAAC,kBAAkB,CAGvB;IACH,OAAO,CAAC,iBAAiB,CAA2E;IACpG,OAAO,CAAC,SAAS,CAAgD;IACjE,OAAO,CAAC,iBAAiB,CAAyD;IAClF,OAAO,CAAC,kBAAkB,CAA0D;IACpF,OAAO,CAAC,eAAe,CAAuD;IAC9E,OAAO,CAAC,oBAAoB,CAAyB;IACrD,OAAO,CAAC,iBAAiB,CAGtB;IACH,OAAO,CAAC,iBAAiB,CAA0B;IACnD,OAAO,CAAC,sBAAsB,CAS3B;IACH,OAAO,CAAC,wBAAwB,CAA6D;IAC7F,OAAO,CAAC,aAAa,CAAqC;IAC1D,OAAO,CAAC,iBAAiB,CAAyD;IAClF,OAAO,CAAC,WAAW,CAAmD;IACtE,OAAO,CAAC,mBAAmB,CAA2D;IACtF,OAAO,CAAC,2BAA2B,CAAmE;IACtG,OAAO,CAAC,oBAAoB,CAA4D;IACxF,OAAO,CAAC,aAAa,CAA4B;IACjD,OAAO,CAAC,oBAAoB,CAA4B;IACxD,OAAO,CAAC,eAAe,CAA6B;IACpD,OAAO,CAAC,mBAAmB,CAA4B;IACvD,OAAO,CAAC,kBAAkB,CAA4B;IACtD,OAAO,CAAC,YAAY,CAAqB;IACzC,OAAO,CAAC,yBAAyB,CAAiD;IAClF,OAAO,CAAC,oBAAoB,CAAK;IACjC,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,cAAc,CAAqD;IAE3E,YACC,UAAU,EAAE,SAAS,EAAE,EACvB,OAAO,EAAE,gBAAgB,EACzB,GAAG,EAAE,MAAM,EACX,cAAc,EAAE,cAAc,EAC9B,aAAa,EAAE,aAAa,EAC5B,QAAQ,GAAE,QAA2B,EASrC;IAED,QAAQ,CACP,OAAO,EAAE,gBAAgB,EACzB,cAAc,EAAE,uBAAuB,EACvC,eAAe,CAAC,EAAE;QACjB,gBAAgB,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,KAAK,IAAI,CAAC;QAClE,sBAAsB,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,KAAK,IAAI,CAAC;QACtD,kBAAkB,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;KAC5C,GACC,IAAI,CAqHN;IAED,kBAAkB,CAAC,OAAO,CAAC,EAAE,8BAA8B,GAAG,IAAI,CAmBjE;IAED,OAAO,CAAC,aAAa;IAUrB,YAAY,CAAC,SAAS,CAAC,EAAE,kBAAkB,EAAE,IAAI,GAAE,aAAuB,GAAG,IAAI,CAGhF;IAED,4BAA4B,CAAC,QAAQ,CAAC,EAAE,kCAAkC,GAAG,IAAI,CAEhF;IAED,OAAO,CAAC,mBAAmB;IAmB3B,OAAO,CAAC,YAAY;IA0BpB,OAAO,CAAC,iBAAiB;IAMzB,YAAY,IAAI,kBAAkB,CAEjC;IAED,KAAK,IAAI,OAAO,CAEf;IAED,iBAAiB,IAAI,MAAM,EAAE,CAE5B;IAED,sBAAsB,IAAI,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,CAAC,CAEtE;IAED;;;OAGG;IACH,qBAAqB,IAAI,cAAc,EAAE,CAWxC;IAED,6EAA6E;IAC7E,8BAA8B,IAAI,SAAS,MAAM,EAAE,CAIlD;IAED,UAAU,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,iBAAiB,KAAK,IAAI,GAAG,MAAM,IAAI,CAIlE;IAED;;;OAGG;IACH,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,GAAG,MAAM,IAAI,CAExE;IAED,4EAA4E;IAC5E,uBAAuB,IAAI,SAAS,8BAA8B,EAAE,CAenE;IAED,qEAAqE;IACrE,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,cAAc,CAAC,YAAY,CAAC,GAAG,SAAS,CAQ5E;IAED,QAAQ,IAAI,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,CAUrC;IAED,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAExD;IAED,aAAa,IAAI,GAAG,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,CAAC,CAE7C;IAED,YAAY,CAAC,mBAAmB,EAAE,iBAAiB,GAAG,GAAG,CAAC,KAAK,EAAE,iBAAiB,CAAC,CA2ClF;IAED,sBAAsB,IAAI,kBAAkB,EAAE,CAE7C;IAED,UAAU,CACT,OAAO,SAAgX,GACrX,IAAI,CAKN;IAED,IAAI,QAAQ,IAAI,OAAO,CAEtB;IAED,OAAO,CAAC,YAAY;IAMpB,OAAO,CAAC,QAAQ,EAAE,sBAAsB,GAAG,MAAM,IAAI,CAGpD;IAED,SAAS,CAAC,KAAK,EAAE,cAAc,GAAG,IAAI,CAIrC;IAED,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAQtC;IAED,OAAO,CAAC,wBAAwB;IAwBhC,OAAO,CAAC,0BAA0B;IAIlC,OAAO,CAAC,gBAAgB;IAiDxB,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS,CAQlE;IAED,uBAAuB,IAAI,mBAAmB,EAAE,CAE/C;IAED,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS,CAQ9D;IAED,OAAO,CAAC,yBAAyB;IAoCjC,gBAAgB,IAAI,aAAa,CAEhC;IAED,qBAAqB,IAAI,eAAe,EAAE,CAGzC;IAED,qBAAqB,IAAI,kBAAkB,EAAE,CAE5C;IAED,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS,CAEpD;IAEK,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAmB9D;IAED;;;OAGG;IACH,QAAQ,IAAI,IAAI,CAEf;IAED,cAAc,IAAI,MAAM,EAAE,CAGzB;IAED;;;OAGG;IACH,aAAa,CAAC,yCAAyC,CAAC,EAAE,MAAM,GAAG,gBAAgB,CA2LlF;IAED,oBAAoB,IAAI,uBAAuB,CAqC9C;IAED,OAAO,CAAC,oBAAoB;IAU5B;;;;;OAKG;IACH,OAAO,CAAC,4BAA4B;IAqBpC;;;;;;;OAOG;YACW,yBAAyB;IA+DjC,IAAI,CAAC,MAAM,SAAS,eAAe,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,CA+C3F;IAEK,eAAe,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,sBAAsB,GAAG,SAAS,CAAC,CA6C1F;IAEK,cAAc,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,YAAY,GAAG,SAAS,CAAC,CAyC9E;IAEK,cAAc,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,qBAAqB,GAAG,SAAS,CAAC,CAkEvF;IAEK,YAAY,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,mBAAmB,GAAG,SAAS,CAAC,CAqCjF;IAEK,YAAY,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,mBAAmB,GAAG,SAAS,CAAC,CAyBjF;IAEK,WAAW,CAAC,QAAQ,EAAE,YAAY,EAAE,EAAE,oBAAoB,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAiClG;IAEK,sBAAsB,CAC3B,QAAQ,EAAE,YAAY,EAAE,EACxB,oBAAoB,CAAC,EAAE,MAAM,GAC3B,OAAO,CAAC,0BAA0B,CAAC,CAOrC;IAEK,yBAAyB,CAC9B,OAAO,EAAE,OAAO,EAChB,oBAAoB,CAAC,EAAE,MAAM,EAC7B,OAAO,CAAC,EAAE;QAAE,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;QAAC,OAAO,EAAE,eAAe,CAAA;KAAE,GACvD,OAAO,CAAC,OAAO,CAAC,CAiClB;IAEK,yBAAyB,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,eAAe,CAAC,CA2BlF;IAEK,oBAAoB,CACzB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,YAAY,EAAE,GAAG,SAAS,EAClC,YAAY,EAAE,MAAM,EACpB,mBAAmB,EAAE,wBAAwB,GAC3C,OAAO,CAAC,8BAA8B,GAAG,SAAS,CAAC,CA6DrD;IAEK,qBAAqB,CAC1B,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,sBAAsB,CAAC,QAAQ,CAAC,GACtC,OAAO,CAAC;QACV,UAAU,EAAE,uBAAuB,EAAE,CAAC;QACtC,WAAW,EAAE,uBAAuB,EAAE,CAAC;QACvC,UAAU,EAAE,uBAAuB,EAAE,CAAC;QACtC,SAAS,EAAE,uBAAuB,EAAE,CAAC;KACrC,CAAC,CAgDD;IAED,oEAAoE;IAC9D,SAAS,CACd,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,YAAY,EAAE,GAAG,SAAS,EAClC,MAAM,EAAE,WAAW,EACnB,iBAAiB,CAAC,EAAE,OAAO,GAAG,UAAU,EACxC,OAAO,SAAU,GACf,OAAO,CAAC,gBAAgB,CAAC,CAkC3B;CACD"}
@@ -7,9 +7,10 @@ import { theme } from "../../modes/interactive/theme/theme.js";
7
7
  import { stripAnsi } from "../../utils/ansi.js";
8
8
  import { createEventBus, EXTENSION_RPC_EVENT_CHANNEL } from "../event-bus.js";
9
9
  import { getSessionContextEntryId, SESSION_CONTEXT_ENTRY_ID } from "../session-manager.js";
10
- import { SettingsManager } from "../settings-manager.js";
10
+ import { DEFAULT_SESSION_SHUTDOWN_HANDLER_TIMEOUT_MS, DEFAULT_SESSION_SHUTDOWN_HANDLER_WARN_MS, SettingsManager, } from "../settings-manager.js";
11
11
  import { goalFilePath } from "./builtin/goal/persistence.js";
12
12
  import { goalStoreRef } from "./builtin/goal/store-ref.js";
13
+ import { kernelToolsStorage } from "./kernel-tools-context.js";
13
14
  import { drainPendingProviderRegistrations } from "./loader.js";
14
15
  // Extension shortcuts compete with canonical keybinding ids from keybindings.json.
15
16
  // Only editor-global shortcuts are reserved here. Picker-specific bindings are not.
@@ -75,6 +76,9 @@ function sanitizedToolHookStatusMessage(message) {
75
76
  /**
76
77
  * Helper function to emit session_shutdown event to extensions.
77
78
  * Returns true if the event was emitted, false if there were no handlers.
79
+ *
80
+ * Each handler runs under the host's shutdown budget (see
81
+ * `ExtensionRunner.emit`), so a hung extension cannot hold teardown hostage.
78
82
  */
79
83
  export async function emitSessionShutdownEvent(extensionRunner, event) {
80
84
  if (extensionRunner.hasHandlers("session_shutdown")) {
@@ -837,6 +841,10 @@ export class ExtensionRunner {
837
841
  runner.assertActive();
838
842
  return runner.getSignalFn();
839
843
  },
844
+ get kernelTools() {
845
+ runner.assertActive();
846
+ return kernelToolsStorage.getStore();
847
+ },
840
848
  abort: (source) => {
841
849
  runner.assertActive();
842
850
  runner.abortFn(source);
@@ -987,14 +995,108 @@ export class ExtensionRunner {
987
995
  event.type === "session_before_compact" ||
988
996
  event.type === "session_before_tree");
989
997
  }
998
+ /**
999
+ * Host budget for `session_shutdown` handlers, read from settings once per
1000
+ * shutdown emission (teardown runs once per runner, so a settings edit takes
1001
+ * effect without a reload). A malformed value must never break teardown, so
1002
+ * an invalid setting is reported and the shipped defaults are used.
1003
+ */
1004
+ resolveSessionShutdownBudget() {
1005
+ try {
1006
+ const settings = SettingsManager.create(this.cwd, this.getAgentDirFn(), {
1007
+ projectTrusted: this.isProjectTrustedFn(),
1008
+ });
1009
+ return {
1010
+ warnMs: settings.getSessionShutdownHandlerWarnMs(),
1011
+ timeoutMs: settings.getSessionShutdownHandlerTimeoutMs(),
1012
+ };
1013
+ }
1014
+ catch (err) {
1015
+ const message = err instanceof Error ? err.message : String(err);
1016
+ console.warn(`Using the default session_shutdown handler budget (warn ${DEFAULT_SESSION_SHUTDOWN_HANDLER_WARN_MS}ms, hard cap ${DEFAULT_SESSION_SHUTDOWN_HANDLER_TIMEOUT_MS}ms): ${message}`);
1017
+ return {
1018
+ warnMs: DEFAULT_SESSION_SHUTDOWN_HANDLER_WARN_MS,
1019
+ timeoutMs: DEFAULT_SESSION_SHUTDOWN_HANDLER_TIMEOUT_MS,
1020
+ };
1021
+ }
1022
+ }
1023
+ /**
1024
+ * Runs one `session_shutdown` handler under the host budget. The handler sees
1025
+ * the budget through `event.signal`, which this runner aborts at the hard cap;
1026
+ * the host then stops waiting (the handler itself keeps running detached),
1027
+ * reports an extension error and lets teardown continue with the next handler.
1028
+ * Handler rejections are rethrown so emit()'s existing error path reports them
1029
+ * exactly as before.
1030
+ */
1031
+ async runSessionShutdownHandler(extensionPath, event, handler, budget) {
1032
+ const controller = new AbortController();
1033
+ const startedAt = Date.now();
1034
+ let outcome;
1035
+ // Settle the handler through a captured outcome so a late rejection after a
1036
+ // timeout is already handled instead of becoming an unhandled rejection.
1037
+ const settled = Promise.resolve(handler({ ...event, signal: controller.signal }, this.createContext(extensionPath))).then(() => {
1038
+ outcome = { ok: true };
1039
+ }, (error) => {
1040
+ outcome = { ok: false, error };
1041
+ });
1042
+ if (budget.warnMs > 0 || budget.timeoutMs > 0) {
1043
+ let warnTimer;
1044
+ let capTimer;
1045
+ let timedOut = false;
1046
+ try {
1047
+ timedOut = await new Promise((resolve) => {
1048
+ if (budget.warnMs > 0) {
1049
+ warnTimer = setTimeout(() => {
1050
+ const capNote = budget.timeoutMs > 0 ? ` (hard cap ${budget.timeoutMs}ms)` : "";
1051
+ console.warn(`Extension ${extensionPath} is still running its session_shutdown handler after ${Date.now() - startedAt}ms${capNote}.`);
1052
+ }, budget.warnMs);
1053
+ }
1054
+ if (budget.timeoutMs > 0) {
1055
+ capTimer = setTimeout(() => resolve(true), budget.timeoutMs);
1056
+ }
1057
+ void settled.then(() => resolve(false));
1058
+ });
1059
+ }
1060
+ finally {
1061
+ clearTimeout(warnTimer);
1062
+ clearTimeout(capTimer);
1063
+ }
1064
+ if (timedOut) {
1065
+ controller.abort(new Error(`session_shutdown handler timed out after ${budget.timeoutMs}ms`));
1066
+ this.emitError({
1067
+ extensionPath,
1068
+ event: "session_shutdown",
1069
+ error: `handler timed out after ${budget.timeoutMs}ms`,
1070
+ });
1071
+ return;
1072
+ }
1073
+ }
1074
+ else {
1075
+ await settled;
1076
+ }
1077
+ if (outcome && !outcome.ok) {
1078
+ throw outcome.error;
1079
+ }
1080
+ }
990
1081
  async emit(event) {
991
1082
  let result;
1083
+ // session_shutdown is the one host-bounded event: a hung handler must not hold
1084
+ // Ctrl+C / quit / reload / new / resume hostage. Every other event still awaits
1085
+ // its handlers without a cap (ask-user and approval dialogs legitimately block).
1086
+ // The budget is resolved lazily so runners with no shutdown handler read no settings.
1087
+ const isSessionShutdown = event.type === "session_shutdown";
1088
+ let shutdownBudget;
992
1089
  for (const ext of this.extensions) {
993
1090
  const handlers = ext.handlers.get(event.type);
994
1091
  if (!handlers || handlers.length === 0)
995
1092
  continue;
996
1093
  for (const handler of handlers) {
997
1094
  try {
1095
+ if (isSessionShutdown) {
1096
+ shutdownBudget ??= this.resolveSessionShutdownBudget();
1097
+ await this.runSessionShutdownHandler(ext.path, event, handler, shutdownBudget);
1098
+ continue;
1099
+ }
998
1100
  const handlerResult = await handler(event, this.createContext(ext.path));
999
1101
  if (this.isSessionBeforeEvent(event) && handlerResult) {
1000
1102
  result = handlerResult;