@code-yeongyu/senpi 2026.9.7 → 2026.9.9-2

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 (470) hide show
  1. package/CHANGELOG.md +122 -3
  2. package/dist/core/agent-session-runtime.d.ts.map +1 -1
  3. package/dist/core/agent-session-runtime.js +2 -0
  4. package/dist/core/agent-session-runtime.js.map +1 -1
  5. package/dist/core/agent-session.d.ts +48 -4
  6. package/dist/core/agent-session.d.ts.map +1 -1
  7. package/dist/core/agent-session.js +192 -40
  8. package/dist/core/agent-session.js.map +1 -1
  9. package/dist/core/compaction/compaction-execution.d.ts.map +1 -1
  10. package/dist/core/compaction/compaction-execution.js +5 -5
  11. package/dist/core/compaction/compaction-execution.js.map +1 -1
  12. package/dist/core/compaction/compaction-settings.d.ts +2 -0
  13. package/dist/core/compaction/compaction-settings.d.ts.map +1 -1
  14. package/dist/core/compaction/compaction-settings.js.map +1 -1
  15. package/dist/core/compaction/compaction.d.ts +3 -3
  16. package/dist/core/compaction/compaction.d.ts.map +1 -1
  17. package/dist/core/compaction/compaction.js +14 -8
  18. package/dist/core/compaction/compaction.js.map +1 -1
  19. package/dist/core/compaction/stream-watchdog.d.ts +29 -0
  20. package/dist/core/compaction/stream-watchdog.d.ts.map +1 -1
  21. package/dist/core/compaction/stream-watchdog.js +35 -0
  22. package/dist/core/compaction/stream-watchdog.js.map +1 -1
  23. package/dist/core/compaction-settings-access.d.ts +6 -0
  24. package/dist/core/compaction-settings-access.d.ts.map +1 -1
  25. package/dist/core/compaction-settings-access.js.map +1 -1
  26. package/dist/core/compaction-settings-resolver.d.ts +2 -0
  27. package/dist/core/compaction-settings-resolver.d.ts.map +1 -1
  28. package/dist/core/compaction-settings-resolver.js +5 -0
  29. package/dist/core/compaction-settings-resolver.js.map +1 -1
  30. package/dist/core/dynamic-prompt/working-task.js +1 -1
  31. package/dist/core/dynamic-prompt/working-task.js.map +1 -1
  32. package/dist/core/extensions/builtin/cache-keepalive/index.d.ts.map +1 -1
  33. package/dist/core/extensions/builtin/cache-keepalive/index.js +4 -21
  34. package/dist/core/extensions/builtin/cache-keepalive/index.js.map +1 -1
  35. package/dist/core/extensions/builtin/claude-sdk-oauth/account-command.d.ts +2 -0
  36. package/dist/core/extensions/builtin/claude-sdk-oauth/account-command.d.ts.map +1 -1
  37. package/dist/core/extensions/builtin/claude-sdk-oauth/account-command.js +10 -25
  38. package/dist/core/extensions/builtin/claude-sdk-oauth/account-command.js.map +1 -1
  39. package/dist/core/extensions/builtin/claude-sdk-oauth/session-binding.d.ts.map +1 -1
  40. package/dist/core/extensions/builtin/claude-sdk-oauth/session-binding.js +36 -19
  41. package/dist/core/extensions/builtin/claude-sdk-oauth/session-binding.js.map +1 -1
  42. package/dist/core/extensions/builtin/claude-sdk-oauth/session-commit-boundary.d.ts.map +1 -1
  43. package/dist/core/extensions/builtin/claude-sdk-oauth/session-commit-boundary.js +21 -10
  44. package/dist/core/extensions/builtin/claude-sdk-oauth/session-commit-boundary.js.map +1 -1
  45. package/dist/core/extensions/builtin/claude-sdk-oauth/session-continuity.d.ts +4 -17
  46. package/dist/core/extensions/builtin/claude-sdk-oauth/session-continuity.d.ts.map +1 -1
  47. package/dist/core/extensions/builtin/claude-sdk-oauth/session-continuity.js +23 -33
  48. package/dist/core/extensions/builtin/claude-sdk-oauth/session-continuity.js.map +1 -1
  49. package/dist/core/extensions/builtin/claude-sdk-oauth/session-stream.d.ts.map +1 -1
  50. package/dist/core/extensions/builtin/claude-sdk-oauth/session-stream.js +5 -1
  51. package/dist/core/extensions/builtin/claude-sdk-oauth/session-stream.js.map +1 -1
  52. package/dist/core/extensions/builtin/claude-sdk-oauth/session-sync.d.ts.map +1 -1
  53. package/dist/core/extensions/builtin/claude-sdk-oauth/session-sync.js +5 -3
  54. package/dist/core/extensions/builtin/claude-sdk-oauth/session-sync.js.map +1 -1
  55. package/dist/core/extensions/builtin/claude-sdk-oauth/session-turn-attempt.d.ts.map +1 -1
  56. package/dist/core/extensions/builtin/claude-sdk-oauth/session-turn-attempt.js +8 -3
  57. package/dist/core/extensions/builtin/claude-sdk-oauth/session-turn-attempt.js.map +1 -1
  58. package/dist/core/extensions/builtin/claude-sdk-oauth/tools.d.ts +6 -5
  59. package/dist/core/extensions/builtin/claude-sdk-oauth/tools.d.ts.map +1 -1
  60. package/dist/core/extensions/builtin/claude-sdk-oauth/tools.js +6 -5
  61. package/dist/core/extensions/builtin/claude-sdk-oauth/tools.js.map +1 -1
  62. package/dist/core/extensions/builtin/compaction/circuit-breaker.d.ts +8 -0
  63. package/dist/core/extensions/builtin/compaction/circuit-breaker.d.ts.map +1 -1
  64. package/dist/core/extensions/builtin/compaction/circuit-breaker.js +8 -0
  65. package/dist/core/extensions/builtin/compaction/circuit-breaker.js.map +1 -1
  66. package/dist/core/extensions/builtin/compaction/deterministic-fallback.d.ts +8 -0
  67. package/dist/core/extensions/builtin/compaction/deterministic-fallback.d.ts.map +1 -1
  68. package/dist/core/extensions/builtin/compaction/deterministic-fallback.js +125 -20
  69. package/dist/core/extensions/builtin/compaction/deterministic-fallback.js.map +1 -1
  70. package/dist/core/extensions/builtin/compaction/fallback-failed-turn-normalization.d.ts +18 -0
  71. package/dist/core/extensions/builtin/compaction/fallback-failed-turn-normalization.d.ts.map +1 -0
  72. package/dist/core/extensions/builtin/compaction/fallback-failed-turn-normalization.js +20 -0
  73. package/dist/core/extensions/builtin/compaction/fallback-failed-turn-normalization.js.map +1 -0
  74. package/dist/core/extensions/builtin/compaction/index.d.ts.map +1 -1
  75. package/dist/core/extensions/builtin/compaction/index.js +54 -11
  76. package/dist/core/extensions/builtin/compaction/index.js.map +1 -1
  77. package/dist/core/extensions/builtin/compaction/lane-policy.d.ts +3 -0
  78. package/dist/core/extensions/builtin/compaction/lane-policy.d.ts.map +1 -1
  79. package/dist/core/extensions/builtin/compaction/lane-policy.js +47 -23
  80. package/dist/core/extensions/builtin/compaction/lane-policy.js.map +1 -1
  81. package/dist/core/extensions/builtin/compaction/model-usability-budget.d.ts +1 -1
  82. package/dist/core/extensions/builtin/compaction/model-usability-budget.d.ts.map +1 -1
  83. package/dist/core/extensions/builtin/compaction/model-usability-budget.js +23 -3
  84. package/dist/core/extensions/builtin/compaction/model-usability-budget.js.map +1 -1
  85. package/dist/core/extensions/builtin/compaction/resume-admission.d.ts +7 -0
  86. package/dist/core/extensions/builtin/compaction/resume-admission.d.ts.map +1 -0
  87. package/dist/core/extensions/builtin/compaction/resume-admission.js +7 -0
  88. package/dist/core/extensions/builtin/compaction/resume-admission.js.map +1 -0
  89. package/dist/core/extensions/builtin/compaction/speculative-summary.d.ts +2 -0
  90. package/dist/core/extensions/builtin/compaction/speculative-summary.d.ts.map +1 -1
  91. package/dist/core/extensions/builtin/compaction/speculative-summary.js +5 -2
  92. package/dist/core/extensions/builtin/compaction/speculative-summary.js.map +1 -1
  93. package/dist/core/extensions/builtin/compaction/speculative.d.ts.map +1 -1
  94. package/dist/core/extensions/builtin/compaction/speculative.js +9 -3
  95. package/dist/core/extensions/builtin/compaction/speculative.js.map +1 -1
  96. package/dist/core/extensions/builtin/compaction/summarization-retry.d.ts +10 -4
  97. package/dist/core/extensions/builtin/compaction/summarization-retry.d.ts.map +1 -1
  98. package/dist/core/extensions/builtin/compaction/summarization-retry.js +14 -5
  99. package/dist/core/extensions/builtin/compaction/summarization-retry.js.map +1 -1
  100. package/dist/core/extensions/builtin/goal/agent-end-continuation.d.ts.map +1 -1
  101. package/dist/core/extensions/builtin/goal/agent-end-continuation.js +11 -0
  102. package/dist/core/extensions/builtin/goal/agent-end-continuation.js.map +1 -1
  103. package/dist/core/extensions/builtin/goal/cache-warm-renderer.js +6 -4
  104. package/dist/core/extensions/builtin/goal/cache-warm-renderer.js.map +1 -1
  105. package/dist/core/extensions/builtin/goal/cache-warm.d.ts +25 -1
  106. package/dist/core/extensions/builtin/goal/cache-warm.d.ts.map +1 -1
  107. package/dist/core/extensions/builtin/goal/cache-warm.js +29 -10
  108. package/dist/core/extensions/builtin/goal/cache-warm.js.map +1 -1
  109. package/dist/core/extensions/builtin/goal/continuation.d.ts +3 -1
  110. package/dist/core/extensions/builtin/goal/continuation.d.ts.map +1 -1
  111. package/dist/core/extensions/builtin/goal/continuation.js +17 -2
  112. package/dist/core/extensions/builtin/goal/continuation.js.map +1 -1
  113. package/dist/core/extensions/builtin/goal/lifecycle-helpers.d.ts.map +1 -1
  114. package/dist/core/extensions/builtin/goal/lifecycle-helpers.js +1 -0
  115. package/dist/core/extensions/builtin/goal/lifecycle-helpers.js.map +1 -1
  116. package/dist/core/extensions/builtin/goal/monitor-continuation.d.ts +1 -1
  117. package/dist/core/extensions/builtin/goal/monitor-continuation.d.ts.map +1 -1
  118. package/dist/core/extensions/builtin/goal/monitor-continuation.js +8 -3
  119. package/dist/core/extensions/builtin/goal/monitor-continuation.js.map +1 -1
  120. package/dist/core/extensions/builtin/gpt-account.d.ts +5 -1
  121. package/dist/core/extensions/builtin/gpt-account.d.ts.map +1 -1
  122. package/dist/core/extensions/builtin/gpt-account.js +9 -26
  123. package/dist/core/extensions/builtin/gpt-account.js.map +1 -1
  124. package/dist/core/extensions/builtin/hooks/plugin-manifest.js +2 -2
  125. package/dist/core/extensions/builtin/hooks/plugin-manifest.js.map +1 -1
  126. package/dist/core/extensions/builtin/hooks/safety.js +2 -2
  127. package/dist/core/extensions/builtin/hooks/safety.js.map +1 -1
  128. package/dist/core/extensions/builtin/imagegen/params.d.ts +36 -0
  129. package/dist/core/extensions/builtin/imagegen/params.d.ts.map +1 -0
  130. package/dist/core/extensions/builtin/imagegen/params.js +55 -0
  131. package/dist/core/extensions/builtin/imagegen/params.js.map +1 -0
  132. package/dist/core/extensions/builtin/imagegen/reference-images.d.ts +11 -0
  133. package/dist/core/extensions/builtin/imagegen/reference-images.d.ts.map +1 -0
  134. package/dist/core/extensions/builtin/imagegen/reference-images.js +55 -0
  135. package/dist/core/extensions/builtin/imagegen/reference-images.js.map +1 -0
  136. package/dist/core/extensions/builtin/imagegen/skill/SKILL.md +47 -4
  137. package/dist/core/extensions/builtin/imagegen/tool.d.ts +10 -19
  138. package/dist/core/extensions/builtin/imagegen/tool.d.ts.map +1 -1
  139. package/dist/core/extensions/builtin/imagegen/tool.js +21 -45
  140. package/dist/core/extensions/builtin/imagegen/tool.js.map +1 -1
  141. package/dist/core/extensions/builtin/monitor-state-event.d.ts +18 -0
  142. package/dist/core/extensions/builtin/monitor-state-event.d.ts.map +1 -1
  143. package/dist/core/extensions/builtin/monitor-state-event.js +23 -0
  144. package/dist/core/extensions/builtin/monitor-state-event.js.map +1 -1
  145. package/dist/core/extensions/builtin/oauth-login-interaction.d.ts +24 -0
  146. package/dist/core/extensions/builtin/oauth-login-interaction.d.ts.map +1 -0
  147. package/dist/core/extensions/builtin/oauth-login-interaction.js +77 -0
  148. package/dist/core/extensions/builtin/oauth-login-interaction.js.map +1 -0
  149. package/dist/core/extensions/builtin/permission-system/external-dir.d.ts.map +1 -1
  150. package/dist/core/extensions/builtin/permission-system/external-dir.js +5 -51
  151. package/dist/core/extensions/builtin/permission-system/external-dir.js.map +1 -1
  152. package/dist/core/extensions/builtin/permission-system/parsers.d.ts.map +1 -1
  153. package/dist/core/extensions/builtin/permission-system/parsers.js +5 -7
  154. package/dist/core/extensions/builtin/permission-system/parsers.js.map +1 -1
  155. package/dist/core/extensions/builtin/prompt-preset/claude-fable-5-1.js +1 -1
  156. package/dist/core/extensions/builtin/prompt-preset/claude-fable-5-1.js.map +1 -1
  157. package/dist/core/extensions/builtin/prompt-preset/claude-fable-5.js +1 -1
  158. package/dist/core/extensions/builtin/prompt-preset/claude-fable-5.js.map +1 -1
  159. package/dist/core/extensions/builtin/prompt-preset/execution-tooling.d.ts +14 -7
  160. package/dist/core/extensions/builtin/prompt-preset/execution-tooling.d.ts.map +1 -1
  161. package/dist/core/extensions/builtin/prompt-preset/execution-tooling.js +34 -13
  162. package/dist/core/extensions/builtin/prompt-preset/execution-tooling.js.map +1 -1
  163. package/dist/core/extensions/builtin/prompt-preset/gpt-5.6.d.ts +6 -10
  164. package/dist/core/extensions/builtin/prompt-preset/gpt-5.6.d.ts.map +1 -1
  165. package/dist/core/extensions/builtin/prompt-preset/gpt-5.6.js +14 -9
  166. package/dist/core/extensions/builtin/prompt-preset/gpt-5.6.js.map +1 -1
  167. package/dist/core/extensions/builtin/prompt-preset/gpt-6-astra.d.ts +15 -15
  168. package/dist/core/extensions/builtin/prompt-preset/gpt-6-astra.d.ts.map +1 -1
  169. package/dist/core/extensions/builtin/prompt-preset/gpt-6-astra.js +49 -21
  170. package/dist/core/extensions/builtin/prompt-preset/gpt-6-astra.js.map +1 -1
  171. package/dist/core/extensions/builtin/prompt-preset/kimi-k3.js +1 -1
  172. package/dist/core/extensions/builtin/prompt-preset/kimi-k3.js.map +1 -1
  173. package/dist/core/extensions/builtin/service-tier.d.ts +2 -0
  174. package/dist/core/extensions/builtin/service-tier.d.ts.map +1 -1
  175. package/dist/core/extensions/builtin/service-tier.js +17 -1
  176. package/dist/core/extensions/builtin/service-tier.js.map +1 -1
  177. package/dist/core/extensions/builtin/terminal/durable-command.d.ts.map +1 -1
  178. package/dist/core/extensions/builtin/terminal/durable-command.js +3 -0
  179. package/dist/core/extensions/builtin/terminal/durable-command.js.map +1 -1
  180. package/dist/core/extensions/builtin/terminal/durable-file.d.ts.map +1 -1
  181. package/dist/core/extensions/builtin/terminal/durable-file.js +2 -0
  182. package/dist/core/extensions/builtin/terminal/durable-file.js.map +1 -1
  183. package/dist/core/extensions/builtin/terminal/extension.d.ts.map +1 -1
  184. package/dist/core/extensions/builtin/terminal/extension.js +14 -2
  185. package/dist/core/extensions/builtin/terminal/extension.js.map +1 -1
  186. package/dist/core/extensions/builtin/terminal/monitor-notify.d.ts.map +1 -1
  187. package/dist/core/extensions/builtin/terminal/monitor-notify.js +27 -5
  188. package/dist/core/extensions/builtin/terminal/monitor-notify.js.map +1 -1
  189. package/dist/core/extensions/builtin/terminal/monitor-registry.d.ts +17 -0
  190. package/dist/core/extensions/builtin/terminal/monitor-registry.d.ts.map +1 -1
  191. package/dist/core/extensions/builtin/terminal/monitor-registry.js +76 -14
  192. package/dist/core/extensions/builtin/terminal/monitor-registry.js.map +1 -1
  193. package/dist/core/extensions/builtin/terminal/notify.d.ts +2 -0
  194. package/dist/core/extensions/builtin/terminal/notify.d.ts.map +1 -1
  195. package/dist/core/extensions/builtin/terminal/notify.js +6 -1
  196. package/dist/core/extensions/builtin/terminal/notify.js.map +1 -1
  197. package/dist/core/extensions/builtin/terminal/session-bundle.d.ts +3 -1
  198. package/dist/core/extensions/builtin/terminal/session-bundle.d.ts.map +1 -1
  199. package/dist/core/extensions/builtin/terminal/session-bundle.js +13 -0
  200. package/dist/core/extensions/builtin/terminal/session-bundle.js.map +1 -1
  201. package/dist/core/extensions/builtin/terminal/shared.d.ts +13 -2
  202. package/dist/core/extensions/builtin/terminal/shared.d.ts.map +1 -1
  203. package/dist/core/extensions/builtin/terminal/shared.js +15 -2
  204. package/dist/core/extensions/builtin/terminal/shared.js.map +1 -1
  205. package/dist/core/extensions/builtin/terminal/tools/monitor.d.ts.map +1 -1
  206. package/dist/core/extensions/builtin/terminal/tools/monitor.js +8 -1
  207. package/dist/core/extensions/builtin/terminal/tools/monitor.js.map +1 -1
  208. package/dist/core/extensions/builtin/tool-search/index.d.ts.map +1 -1
  209. package/dist/core/extensions/builtin/tool-search/index.js +1 -0
  210. package/dist/core/extensions/builtin/tool-search/index.js.map +1 -1
  211. package/dist/core/extensions/builtin/tool-search/service.d.ts +4 -0
  212. package/dist/core/extensions/builtin/tool-search/service.d.ts.map +1 -1
  213. package/dist/core/extensions/builtin/tool-search/service.js +11 -0
  214. package/dist/core/extensions/builtin/tool-search/service.js.map +1 -1
  215. package/dist/core/extensions/loader.d.ts +2 -1
  216. package/dist/core/extensions/loader.d.ts.map +1 -1
  217. package/dist/core/extensions/loader.js +17 -8
  218. package/dist/core/extensions/loader.js.map +1 -1
  219. package/dist/core/extensions/runner.d.ts +1 -0
  220. package/dist/core/extensions/runner.d.ts.map +1 -1
  221. package/dist/core/extensions/runner.js +8 -1
  222. package/dist/core/extensions/runner.js.map +1 -1
  223. package/dist/core/extensions/types.d.ts +14 -0
  224. package/dist/core/extensions/types.d.ts.map +1 -1
  225. package/dist/core/extensions/types.js.map +1 -1
  226. package/dist/core/high-reasoning-warning.d.ts.map +1 -1
  227. package/dist/core/high-reasoning-warning.js +4 -6
  228. package/dist/core/high-reasoning-warning.js.map +1 -1
  229. package/dist/core/resource-loader.d.ts +2 -0
  230. package/dist/core/resource-loader.d.ts.map +1 -1
  231. package/dist/core/resource-loader.js +11 -7
  232. package/dist/core/resource-loader.js.map +1 -1
  233. package/dist/core/sdk.d.ts +1 -1
  234. package/dist/core/sdk.d.ts.map +1 -1
  235. package/dist/core/sdk.js +38 -7
  236. package/dist/core/sdk.js.map +1 -1
  237. package/dist/core/session-manager.d.ts.map +1 -1
  238. package/dist/core/session-manager.js +11 -1
  239. package/dist/core/session-manager.js.map +1 -1
  240. package/dist/core/session-write-reservation.d.ts +4 -0
  241. package/dist/core/session-write-reservation.d.ts.map +1 -0
  242. package/dist/core/session-write-reservation.js +12 -0
  243. package/dist/core/session-write-reservation.js.map +1 -0
  244. package/dist/core/settings-manager.js +1 -1
  245. package/dist/core/settings-manager.js.map +1 -1
  246. package/dist/core/settings-shapes.js.map +1 -1
  247. package/dist/core/tools/bounded-realpath.d.ts +28 -0
  248. package/dist/core/tools/bounded-realpath.d.ts.map +1 -0
  249. package/dist/core/tools/bounded-realpath.js +53 -0
  250. package/dist/core/tools/bounded-realpath.js.map +1 -0
  251. package/dist/core/tools/file-mutation-queue.d.ts.map +1 -1
  252. package/dist/core/tools/file-mutation-queue.js +15 -13
  253. package/dist/core/tools/file-mutation-queue.js.map +1 -1
  254. package/dist/core/tools/filesystem-policy.d.ts +7 -0
  255. package/dist/core/tools/filesystem-policy.d.ts.map +1 -1
  256. package/dist/core/tools/filesystem-policy.js +25 -15
  257. package/dist/core/tools/filesystem-policy.js.map +1 -1
  258. package/dist/core/tools/read-classifiers.d.ts +17 -0
  259. package/dist/core/tools/read-classifiers.d.ts.map +1 -0
  260. package/dist/core/tools/read-classifiers.js +26 -0
  261. package/dist/core/tools/read-classifiers.js.map +1 -0
  262. package/dist/core/tools/read.d.ts +5 -1
  263. package/dist/core/tools/read.d.ts.map +1 -1
  264. package/dist/core/tools/read.js +21 -1
  265. package/dist/core/tools/read.js.map +1 -1
  266. package/dist/core/trust-manager.d.ts.map +1 -1
  267. package/dist/core/trust-manager.js +13 -2
  268. package/dist/core/trust-manager.js.map +1 -1
  269. package/dist/index.d.ts +1 -0
  270. package/dist/index.d.ts.map +1 -1
  271. package/dist/index.js +1 -0
  272. package/dist/index.js.map +1 -1
  273. package/dist/main.d.ts +14 -0
  274. package/dist/main.d.ts.map +1 -1
  275. package/dist/main.js +166 -147
  276. package/dist/main.js.map +1 -1
  277. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  278. package/dist/modes/interactive/interactive-mode.js +4 -0
  279. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  280. package/dist/modes/interactive/tips/catalog/memory-tips.d.ts.map +1 -1
  281. package/dist/modes/interactive/tips/catalog/memory-tips.js +6 -0
  282. package/dist/modes/interactive/tips/catalog/memory-tips.js.map +1 -1
  283. package/dist/modes/interactive/tips/catalog/subagent-tips.d.ts.map +1 -1
  284. package/dist/modes/interactive/tips/catalog/subagent-tips.js +6 -0
  285. package/dist/modes/interactive/tips/catalog/subagent-tips.js.map +1 -1
  286. package/dist/modes/rpc/connection-handler.d.ts +2 -0
  287. package/dist/modes/rpc/connection-handler.d.ts.map +1 -1
  288. package/dist/modes/rpc/connection-handler.js +1 -1
  289. package/dist/modes/rpc/connection-handler.js.map +1 -1
  290. package/dist/modes/rpc/host-lifecycle.d.ts.map +1 -1
  291. package/dist/modes/rpc/host-lifecycle.js +31 -5
  292. package/dist/modes/rpc/host-lifecycle.js.map +1 -1
  293. package/dist/modes/rpc/host-watchdog.d.ts +11 -0
  294. package/dist/modes/rpc/host-watchdog.d.ts.map +1 -1
  295. package/dist/modes/rpc/host-watchdog.js +16 -2
  296. package/dist/modes/rpc/host-watchdog.js.map +1 -1
  297. package/dist/modes/rpc/multi-session-host.d.ts +2 -0
  298. package/dist/modes/rpc/multi-session-host.d.ts.map +1 -1
  299. package/dist/modes/rpc/multi-session-host.js +72 -24
  300. package/dist/modes/rpc/multi-session-host.js.map +1 -1
  301. package/dist/modes/rpc/session-binding.d.ts.map +1 -1
  302. package/dist/modes/rpc/session-binding.js +3 -0
  303. package/dist/modes/rpc/session-binding.js.map +1 -1
  304. package/dist/modes/rpc/session-command-router.d.ts +1 -1
  305. package/dist/modes/rpc/session-command-router.d.ts.map +1 -1
  306. package/dist/modes/rpc/session-command-router.js +57 -25
  307. package/dist/modes/rpc/session-command-router.js.map +1 -1
  308. package/dist/modes/rpc/session-event-writer.d.ts +23 -1
  309. package/dist/modes/rpc/session-event-writer.d.ts.map +1 -1
  310. package/dist/modes/rpc/session-event-writer.js +108 -1
  311. package/dist/modes/rpc/session-event-writer.js.map +1 -1
  312. package/dist/modes/rpc/session-registry.d.ts +4 -2
  313. package/dist/modes/rpc/session-registry.d.ts.map +1 -1
  314. package/dist/modes/rpc/session-registry.js +1 -1
  315. package/dist/modes/rpc/session-registry.js.map +1 -1
  316. package/dist/modes/rpc/session-worker-client.d.ts +47 -0
  317. package/dist/modes/rpc/session-worker-client.d.ts.map +1 -0
  318. package/dist/modes/rpc/session-worker-client.js +226 -0
  319. package/dist/modes/rpc/session-worker-client.js.map +1 -0
  320. package/dist/modes/rpc/session-worker-protocol.d.ts +103 -0
  321. package/dist/modes/rpc/session-worker-protocol.d.ts.map +1 -0
  322. package/dist/modes/rpc/session-worker-protocol.js +12 -0
  323. package/dist/modes/rpc/session-worker-protocol.js.map +1 -0
  324. package/dist/modes/rpc/session-worker-requests.d.ts +24 -0
  325. package/dist/modes/rpc/session-worker-requests.d.ts.map +1 -0
  326. package/dist/modes/rpc/session-worker-requests.js +71 -0
  327. package/dist/modes/rpc/session-worker-requests.js.map +1 -0
  328. package/dist/modes/rpc/session-worker.d.ts +2 -0
  329. package/dist/modes/rpc/session-worker.d.ts.map +1 -0
  330. package/dist/modes/rpc/session-worker.js +229 -0
  331. package/dist/modes/rpc/session-worker.js.map +1 -0
  332. package/dist/modes/rpc/socket-ownership.d.ts +46 -0
  333. package/dist/modes/rpc/socket-ownership.d.ts.map +1 -0
  334. package/dist/modes/rpc/socket-ownership.js +178 -0
  335. package/dist/modes/rpc/socket-ownership.js.map +1 -0
  336. package/dist/modes/rpc/worker-session-registry.d.ts +37 -0
  337. package/dist/modes/rpc/worker-session-registry.d.ts.map +1 -0
  338. package/dist/modes/rpc/worker-session-registry.js +207 -0
  339. package/dist/modes/rpc/worker-session-registry.js.map +1 -0
  340. package/dist/utils/fs-watch.d.ts +17 -0
  341. package/dist/utils/fs-watch.d.ts.map +1 -1
  342. package/dist/utils/fs-watch.js +38 -10
  343. package/dist/utils/fs-watch.js.map +1 -1
  344. package/dist/utils/paths.d.ts +33 -0
  345. package/dist/utils/paths.d.ts.map +1 -1
  346. package/dist/utils/paths.js +109 -3
  347. package/dist/utils/paths.js.map +1 -1
  348. package/docs/development.md +3 -2
  349. package/docs/providers.md +5 -1
  350. package/docs/rpc.md +70 -9
  351. package/docs/settings.md +2 -0
  352. package/docs/skills.md +1 -1
  353. package/node_modules/@code-yeongyu/senpi-codemode/CHANGELOG.md +55 -0
  354. package/node_modules/@code-yeongyu/senpi-codemode/README.md +14 -1
  355. package/node_modules/@code-yeongyu/senpi-codemode/package.json +4 -4
  356. package/node_modules/@code-yeongyu/senpi-codemode/src/bridge/protocol.ts +1 -0
  357. package/node_modules/@code-yeongyu/senpi-codemode/src/extension/runtime-factory.ts +3 -0
  358. package/node_modules/@code-yeongyu/senpi-codemode/src/extension/session-manager.ts +7 -0
  359. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/AGENTS.md +7 -0
  360. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/jl/kernel.ts +4 -0
  361. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/kernel-contract.ts +3 -0
  362. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/worker-core.js +29 -0
  363. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/worker-indirect-eval.js +10 -6
  364. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/worker-shell-capture.d.ts +16 -0
  365. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/worker-shell-capture.js +44 -8
  366. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/worker-startup.ts +1 -0
  367. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/py/kernel-contract.ts +3 -0
  368. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/py/transport.ts +9 -1
  369. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/rb/kernel.ts +4 -0
  370. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/session-env.ts +56 -0
  371. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/shared/subprocess-contract.ts +3 -0
  372. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/shared/subprocess-kernel.ts +9 -1
  373. package/node_modules/@code-yeongyu/senpi-codemode/src/output/output-meta.ts +26 -2
  374. package/node_modules/@code-yeongyu/senpi-codemode/src/prompt/eval-prompt.ts +17 -24
  375. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/image.ts +12 -3
  376. package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.d.ts.map +1 -1
  377. package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.js +2 -2
  378. package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.js.map +1 -1
  379. package/node_modules/@earendil-works/pi-agent-core/dist/assistant-terminal-state.d.ts +7 -0
  380. package/node_modules/@earendil-works/pi-agent-core/dist/assistant-terminal-state.d.ts.map +1 -1
  381. package/node_modules/@earendil-works/pi-agent-core/dist/assistant-terminal-state.js +19 -0
  382. package/node_modules/@earendil-works/pi-agent-core/dist/assistant-terminal-state.js.map +1 -1
  383. package/node_modules/@earendil-works/pi-agent-core/dist/empty-assistant-recovery.d.ts.map +1 -1
  384. package/node_modules/@earendil-works/pi-agent-core/dist/empty-assistant-recovery.js +24 -16
  385. package/node_modules/@earendil-works/pi-agent-core/dist/empty-assistant-recovery.js.map +1 -1
  386. package/node_modules/@earendil-works/pi-agent-core/dist/index.d.ts +1 -1
  387. package/node_modules/@earendil-works/pi-agent-core/dist/index.d.ts.map +1 -1
  388. package/node_modules/@earendil-works/pi-agent-core/dist/index.js +1 -1
  389. package/node_modules/@earendil-works/pi-agent-core/dist/index.js.map +1 -1
  390. package/node_modules/@earendil-works/pi-agent-core/package.json +3 -3
  391. package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.d.ts.map +1 -1
  392. package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.js +70 -183
  393. package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.js.map +1 -1
  394. package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-tool-references.d.ts +3 -0
  395. package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-tool-references.d.ts.map +1 -0
  396. package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-tool-references.js +260 -0
  397. package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-tool-references.js.map +1 -0
  398. package/node_modules/@earendil-works/pi-ai/dist/api/openai-codex-responses.d.ts.map +1 -1
  399. package/node_modules/@earendil-works/pi-ai/dist/api/openai-codex-responses.js +1 -0
  400. package/node_modules/@earendil-works/pi-ai/dist/api/openai-codex-responses.js.map +1 -1
  401. package/node_modules/@earendil-works/pi-ai/dist/api/openai-images-edit.d.ts +4 -0
  402. package/node_modules/@earendil-works/pi-ai/dist/api/openai-images-edit.d.ts.map +1 -0
  403. package/node_modules/@earendil-works/pi-ai/dist/api/openai-images-edit.js +11 -0
  404. package/node_modules/@earendil-works/pi-ai/dist/api/openai-images-edit.js.map +1 -0
  405. package/node_modules/@earendil-works/pi-ai/dist/api/openai-images-params.d.ts +25 -0
  406. package/node_modules/@earendil-works/pi-ai/dist/api/openai-images-params.d.ts.map +1 -0
  407. package/node_modules/@earendil-works/pi-ai/dist/api/openai-images-params.js +58 -0
  408. package/node_modules/@earendil-works/pi-ai/dist/api/openai-images-params.js.map +1 -0
  409. package/node_modules/@earendil-works/pi-ai/dist/api/openai-images.d.ts +3 -6
  410. package/node_modules/@earendil-works/pi-ai/dist/api/openai-images.d.ts.map +1 -1
  411. package/node_modules/@earendil-works/pi-ai/dist/api/openai-images.js +15 -33
  412. package/node_modules/@earendil-works/pi-ai/dist/api/openai-images.js.map +1 -1
  413. package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses.d.ts.map +1 -1
  414. package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses.js +1 -0
  415. package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses.js.map +1 -1
  416. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/anthropic-callback-listener.d.ts +40 -0
  417. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/anthropic-callback-listener.d.ts.map +1 -0
  418. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/anthropic-callback-listener.js +138 -0
  419. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/anthropic-callback-listener.js.map +1 -0
  420. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/anthropic.d.ts +2 -3
  421. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/anthropic.d.ts.map +1 -1
  422. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/anthropic.js +42 -139
  423. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/anthropic.js.map +1 -1
  424. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/authorization-input.d.ts +6 -0
  425. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/authorization-input.d.ts.map +1 -0
  426. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/authorization-input.js +29 -0
  427. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/authorization-input.js.map +1 -0
  428. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/error-details.d.ts +3 -0
  429. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/error-details.d.ts.map +1 -0
  430. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/error-details.js +20 -0
  431. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/error-details.js.map +1 -0
  432. package/node_modules/@earendil-works/pi-ai/dist/image-models.generated.d.ts +61 -1
  433. package/node_modules/@earendil-works/pi-ai/dist/image-models.generated.d.ts.map +1 -1
  434. package/node_modules/@earendil-works/pi-ai/dist/image-models.generated.js +61 -1
  435. package/node_modules/@earendil-works/pi-ai/dist/image-models.generated.js.map +1 -1
  436. package/node_modules/@earendil-works/pi-ai/dist/images.d.ts +1 -0
  437. package/node_modules/@earendil-works/pi-ai/dist/images.d.ts.map +1 -1
  438. package/node_modules/@earendil-works/pi-ai/dist/images.js +1 -0
  439. package/node_modules/@earendil-works/pi-ai/dist/images.js.map +1 -1
  440. package/node_modules/@earendil-works/pi-ai/dist/providers/data/.manifest.json +1 -1
  441. package/node_modules/@earendil-works/pi-ai/dist/providers/data/amazon-bedrock.json +1 -1
  442. package/node_modules/@earendil-works/pi-ai/dist/providers/data/azure-openai-responses.json +1 -1
  443. package/node_modules/@earendil-works/pi-ai/dist/providers/data/fireworks.json +1 -1
  444. package/node_modules/@earendil-works/pi-ai/dist/providers/data/github-copilot.json +1 -1
  445. package/node_modules/@earendil-works/pi-ai/dist/providers/data/nvidia.json +1 -1
  446. package/node_modules/@earendil-works/pi-ai/dist/providers/data/openai-codex.json +1 -1
  447. package/node_modules/@earendil-works/pi-ai/dist/providers/data/openai.json +1 -1
  448. package/node_modules/@earendil-works/pi-ai/dist/providers/data/opencode.json +1 -1
  449. package/node_modules/@earendil-works/pi-ai/dist/providers/data/opengateway.json +1 -1
  450. package/node_modules/@earendil-works/pi-ai/dist/providers/data/openrouter.json +1 -1
  451. package/node_modules/@earendil-works/pi-ai/dist/providers/data/vercel-ai-gateway.json +1 -1
  452. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-stream-terminal.d.ts.map +1 -1
  453. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-stream-terminal.js +16 -1
  454. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-stream-terminal.js.map +1 -1
  455. package/node_modules/@earendil-works/pi-ai/dist/types.d.ts +7 -0
  456. package/node_modules/@earendil-works/pi-ai/dist/types.d.ts.map +1 -1
  457. package/node_modules/@earendil-works/pi-ai/dist/types.js.map +1 -1
  458. package/node_modules/@earendil-works/pi-ai/dist/utils/overflow.d.ts +1 -1
  459. package/node_modules/@earendil-works/pi-ai/dist/utils/overflow.d.ts.map +1 -1
  460. package/node_modules/@earendil-works/pi-ai/dist/utils/overflow.js +14 -3
  461. package/node_modules/@earendil-works/pi-ai/dist/utils/overflow.js.map +1 -1
  462. package/node_modules/@earendil-works/pi-ai/dist/utils/server-fallback-receipt.d.ts +2 -1
  463. package/node_modules/@earendil-works/pi-ai/dist/utils/server-fallback-receipt.d.ts.map +1 -1
  464. package/node_modules/@earendil-works/pi-ai/dist/utils/server-fallback-receipt.js +16 -0
  465. package/node_modules/@earendil-works/pi-ai/dist/utils/server-fallback-receipt.js.map +1 -1
  466. package/node_modules/@earendil-works/pi-ai/package.json +2 -2
  467. package/node_modules/@earendil-works/pi-pty/package.json +1 -1
  468. package/node_modules/@earendil-works/pi-telemetry/package.json +1 -1
  469. package/node_modules/@earendil-works/pi-tui/package.json +1 -1
  470. package/package.json +7 -7
@@ -1 +1 @@
1
- {"version":3,"file":"monitor-registry.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/terminal/monitor-registry.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"monitor-registry.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/terminal/monitor-registry.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,9 @@
1
1
  import { createHash, randomBytes } from "node:crypto";
2
2
  import { watch } from "node:fs";
3
- import { access, lstat, open, realpath, stat } from "node:fs/promises";
3
+ import { access, lstat, open, stat } from "node:fs/promises";
4
4
  import { basename, dirname, join, resolve } from "node:path";
5
+ import { canonicalWatchPath, probeDirectoryOpenable } from "../../../../utils/fs-watch.js";
6
+ import { realpathWithoutOpen } from "../../../../utils/paths.js";
5
7
  import { DEFAULT_DURABLE_MONITOR_FIRE_BUDGET, FIRE_BUDGET_AUTO_MUTE_SUMMARY, FIRE_BUDGET_WINDOW_MS } from "./shared.js";
6
8
  import { describeExit } from "./tools/spawn.js";
7
9
  const MONITOR_ID_ALPHABET = "0123456789ABCDEFGHJKMNPQRSTVWXYZ";
@@ -29,6 +31,8 @@ export class MonitorRegistry {
29
31
  #records = new Map();
30
32
  #emit;
31
33
  #onChange;
34
+ #onEnded;
35
+ #onFire;
32
36
  #reserve;
33
37
  #files = new Map();
34
38
  #nextFileId = 1;
@@ -39,6 +43,8 @@ export class MonitorRegistry {
39
43
  constructor(emit, options) {
40
44
  this.#emit = emit;
41
45
  this.#onChange = options?.onChange;
46
+ this.#onEnded = options?.onEnded;
47
+ this.#onFire = options?.onFire;
42
48
  this.#reserve = options?.reserve;
43
49
  }
44
50
  snapshot() {
@@ -48,6 +54,12 @@ export class MonitorRegistry {
48
54
  description: record.description,
49
55
  paused: record.paused,
50
56
  startedAtMs: record.startedAtMs,
57
+ command: record.command,
58
+ filter: record.filter?.source ?? null,
59
+ persistent: record.persistent,
60
+ deadlineMs: record.deadlineMs,
61
+ fireCount: record.fireCount,
62
+ lastFiredAtMs: record.lastFiredAtMs,
51
63
  expiresAt: record.expiresAt,
52
64
  fireWindow: "fireWindow" in record ? record.fireWindow : undefined,
53
65
  }));
@@ -74,7 +86,9 @@ export class MonitorRegistry {
74
86
  let approvedParent;
75
87
  try {
76
88
  await this.#registrationAwait(pending, access(parent));
77
- approvedParent = await this.#registrationAwait(pending, realpath(parent));
89
+ // Identity is derived without open(2), with the same walker the permission parser used, so the
90
+ // two sides agree byte-for-byte and neither can block on a wedged mount.
91
+ approvedParent = realpathWithoutOpen(parent);
78
92
  const approvedParentAtPermission = options.approvedParent;
79
93
  if (approvedParentAtPermission !== undefined && approvedParent !== approvedParentAtPermission) {
80
94
  throw new Error(`Cannot watch file: parent directory changed during permission approval: ${parent}`);
@@ -104,7 +118,7 @@ export class MonitorRegistry {
104
118
  initial = await this.#registrationAwait(pending, initialHandle.stat());
105
119
  if (!initial.isFile())
106
120
  throw new Error(`Cannot watch file: target is not a regular file: ${path}`);
107
- const resolvedTarget = await this.#registrationAwait(pending, realpath(path));
121
+ const resolvedTarget = realpathWithoutOpen(path);
108
122
  if (resolvedTarget !== join(approvedParent, basename(path)))
109
123
  throw new Error(`Cannot watch file: target identity changed: ${path}`);
110
124
  const rebound = await this.#registrationAwait(pending, lstat(path));
@@ -131,11 +145,14 @@ export class MonitorRegistry {
131
145
  const id = `watch_${this.#nextFileId++}`;
132
146
  let watcher;
133
147
  try {
134
- const activationParent = await this.#registrationAwait(pending, realpath(parent));
148
+ const activationParent = realpathWithoutOpen(parent);
135
149
  if (activationParent !== approvedParent) {
136
150
  throw new Error(`Cannot watch file: parent directory changed during registration: ${parent}`);
137
151
  }
138
- watcher = watch(activationParent, (_kind, name) => {
152
+ // watch() opens the directory synchronously on this thread; prove the open completes on the
153
+ // async pool first so a wedged mount fails at the registration deadline instead of freezing.
154
+ await this.#registrationAwait(pending, probeDirectoryOpenable(activationParent));
155
+ watcher = watch(canonicalWatchPath(activationParent), (_kind, name) => {
139
156
  if (!name || basename(String(name)) === basename(path))
140
157
  void this.#checkFile(id);
141
158
  });
@@ -205,6 +222,14 @@ export class MonitorRegistry {
205
222
  sessionId: id,
206
223
  description: options.description,
207
224
  startedAtMs: Date.now(),
225
+ command: null,
226
+ filter: null,
227
+ persistent: options.persistent ?? options.expiresAt !== undefined,
228
+ deadlineMs: (options.persistent ?? options.expiresAt !== undefined)
229
+ ? null
230
+ : (options.deadlineMs ?? Date.now() + options.timeoutMs),
231
+ fireCount: 0,
232
+ lastFiredAtMs: null,
208
233
  expiresAt: options.expiresAt,
209
234
  path,
210
235
  canonicalPath,
@@ -252,7 +277,7 @@ export class MonitorRegistry {
252
277
  const record = this.#files.get(id);
253
278
  if (!record || record.settled)
254
279
  return false;
255
- this.#emit({ type: "line", id: record.id, description: record.description, line });
280
+ this.#emitForRecord(record, { type: "line", id: record.id, description: record.description, line });
256
281
  return true;
257
282
  }
258
283
  async stopFile(id) {
@@ -281,7 +306,15 @@ export class MonitorRegistry {
281
306
  record.release();
282
307
  this.#files.delete(record.id);
283
308
  this.#notifyChange();
284
- this.#emit({ type: "summary", id: record.id, description: record.description, summary });
309
+ this.#emitForRecord(record, { type: "summary", id: record.id, description: record.description, summary });
310
+ const reason = summary === "watcher timed_out"
311
+ ? "timeout"
312
+ : summary === "watcher killed"
313
+ ? "killed"
314
+ : summary === "watcher disposed"
315
+ ? "disposed"
316
+ : "exit";
317
+ this.#emitEnded(record, reason, null);
285
318
  }
286
319
  async #checkFile(id) {
287
320
  const record = this.#files.get(id);
@@ -320,7 +353,7 @@ export class MonitorRegistry {
320
353
  let current = null;
321
354
  let handle;
322
355
  try {
323
- const currentParent = await realpath(dirname(record.path));
356
+ const currentParent = realpathWithoutOpen(dirname(record.path));
324
357
  if (currentParent !== record.canonicalParent) {
325
358
  this.#settleFile(record, `watcher error: monitored parent changed: ${dirname(record.path)}`);
326
359
  return;
@@ -328,7 +361,7 @@ export class MonitorRegistry {
328
361
  const target = await lstat(record.canonicalPath);
329
362
  if (target.isSymbolicLink())
330
363
  throw new Error(`Cannot watch file: target identity changed: ${record.path}`);
331
- const resolvedTarget = await realpath(record.canonicalPath);
364
+ const resolvedTarget = realpathWithoutOpen(record.canonicalPath);
332
365
  if (resolvedTarget !== record.canonicalPath)
333
366
  throw new Error(`Cannot watch file: target identity changed: ${record.path}`);
334
367
  handle = await open(record.canonicalPath, "r");
@@ -385,7 +418,7 @@ export class MonitorRegistry {
385
418
  record.pendingChange = false;
386
419
  if (record.settled)
387
420
  return;
388
- this.#emit({
421
+ this.#emitForRecord(record, {
389
422
  type: "line",
390
423
  id: record.id,
391
424
  description: record.description,
@@ -401,6 +434,11 @@ export class MonitorRegistry {
401
434
  sessionId: options.id,
402
435
  description: options.description,
403
436
  startedAtMs: Date.now(),
437
+ command: options.command ?? null,
438
+ persistent: options.persistent ?? durable,
439
+ deadlineMs: (options.persistent ?? durable) ? null : (options.deadlineMs ?? null),
440
+ fireCount: 0,
441
+ lastFiredAtMs: null,
404
442
  expiresAt: options.expiresAt,
405
443
  runtime: options.runtime,
406
444
  filter: options.filter,
@@ -486,7 +524,7 @@ export class MonitorRegistry {
486
524
  dispose() {
487
525
  this.#disposed = true;
488
526
  this.#lifecycle += 1;
489
- for (const record of this.#records.values())
527
+ for (const record of [...this.#records.values()])
490
528
  this.#disposeRecord(record);
491
529
  for (const record of this.#files.values())
492
530
  this.#settleFile(record, "watcher disposed");
@@ -571,7 +609,7 @@ export class MonitorRegistry {
571
609
  record.mutedDropped += 1;
572
610
  continue;
573
611
  }
574
- this.#emit({ type: "line", id: record.id, description: record.description, line });
612
+ this.#emitForRecord(record, { type: "line", id: record.id, description: record.description, line });
575
613
  if (record.fireWindow !== undefined) {
576
614
  const now = Date.now();
577
615
  if (now - record.fireWindow.startMs >= FIRE_BUDGET_WINDOW_MS)
@@ -579,7 +617,7 @@ export class MonitorRegistry {
579
617
  record.fireWindow.count += 1;
580
618
  if (record.fireWindow.count >= DEFAULT_DURABLE_MONITOR_FIRE_BUDGET) {
581
619
  record.paused = true;
582
- this.#emit({
620
+ this.#emitForRecord(record, {
583
621
  type: "summary",
584
622
  id: record.id,
585
623
  description: record.description,
@@ -602,17 +640,41 @@ export class MonitorRegistry {
602
640
  const status = describeExit(record.runtime) ?? "exited";
603
641
  const code = record.runtime.exitResult?.exitCode;
604
642
  const codeText = code === null || code === undefined ? "" : ` (exit code ${code})`;
605
- this.#emit({
643
+ this.#emitForRecord(record, {
606
644
  type: "summary",
607
645
  id: record.id,
608
646
  description: record.description,
609
647
  summary: `watcher ${status}${codeText}`,
610
648
  });
649
+ const exit = record.runtime.exitResult;
650
+ this.#emitEnded(record, exit?.timedOut ? "timeout" : exit?.cancelled ? "killed" : "exit", code ?? null);
611
651
  }
612
652
  #disposeRecord(record) {
653
+ if (record.settled)
654
+ return;
613
655
  record.settled = true;
614
656
  record.unsubscribeOutput?.();
615
657
  record.unsubscribeExit?.();
658
+ this.#records.delete(record.id);
659
+ this.#emitEnded(record, "disposed", null);
660
+ }
661
+ #emitForRecord(record, event) {
662
+ record.fireCount += 1;
663
+ record.lastFiredAtMs = Date.now();
664
+ this.#emit(event);
665
+ if (!record.settled)
666
+ this.#onFire?.(this.snapshot());
667
+ }
668
+ #emitEnded(record, reason, exitCode) {
669
+ this.#onEnded?.({
670
+ id: record.id,
671
+ description: record.description,
672
+ startedAtMs: record.startedAtMs,
673
+ endedAtMs: Date.now(),
674
+ reason,
675
+ exitCode,
676
+ fireCount: record.fireCount,
677
+ });
616
678
  }
617
679
  }
618
680
  //# sourceMappingURL=monitor-registry.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"monitor-registry.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/terminal/monitor-registry.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash, randomBytes } from \"node:crypto\";\nimport { type FSWatcher, watch } from \"node:fs\";\nimport { access, type FileHandle, lstat, open, realpath, stat } from \"node:fs/promises\";\nimport { basename, dirname, join, resolve } from \"node:path\";\nimport type { TerminalRuntimeSession } from \"./runtime-session.ts\";\nimport { DEFAULT_DURABLE_MONITOR_FIRE_BUDGET, FIRE_BUDGET_AUTO_MUTE_SUMMARY, FIRE_BUDGET_WINDOW_MS } from \"./shared.ts\";\nimport type { MonitorDurabilityClass } from \"./terminal-manifest.ts\";\nimport { describeExit } from \"./tools/spawn.ts\";\n\nexport interface MonitorLineEvent {\n\treadonly type: \"line\";\n\treadonly id: string;\n\treadonly description: string;\n\treadonly line: string;\n}\n\nexport interface MonitorSummaryEvent {\n\treadonly type: \"summary\";\n\treadonly id: string;\n\treadonly description: string;\n\treadonly summary: string;\n}\n\nexport type MonitorEvent = MonitorLineEvent | MonitorSummaryEvent;\n\nexport type MonitorRearmResult = \"rearmed\" | \"not_paused\" | \"not_found\";\n\nexport interface MonitorResumeResult {\n\treadonly id: string;\n\treadonly mutedDropped: number;\n}\n\nconst MONITOR_ID_ALPHABET = \"0123456789ABCDEFGHJKMNPQRSTVWXYZ\";\n\n/** Allocate a stable monitor identity: \"mon_\" + 16 Crockford base-32 chars (80 random bits). */\nexport function allocateMonitorId(): string {\n\tlet id = \"mon_\";\n\tlet buffer = 0;\n\tlet bits = 0;\n\tfor (const byte of randomBytes(10)) {\n\t\tbuffer = (buffer << 8) | byte;\n\t\tbits += 8;\n\t\twhile (bits >= 5) {\n\t\t\tbits -= 5;\n\t\t\tid += MONITOR_ID_ALPHABET[(buffer >> bits) & 31];\n\t\t}\n\t}\n\treturn id;\n}\n\nexport type MonitorFireWindow = { startMs: number; count: number };\nexport interface MonitorSnapshotEntry {\n\treadonly id: string;\n\t/** Stable \"mon_\" identity carried alongside the runtime id; always set on live snapshots. */\n\treadonly monitorId?: string;\n\treadonly description: string;\n\treadonly paused: boolean;\n\t/** Epoch milliseconds when the watch registered; feeds the footer's live elapsed label. */\n\treadonly startedAtMs: number;\n\t/** Durability deadline of a restart-surviving watch; undefined for every ephemeral one. */\n\treadonly expiresAt?: number;\n\treadonly fireWindow?: MonitorFireWindow;\n}\n\nexport interface MonitorRegistryOptions {\n\t/** Observes every registry transition (register/pause/rearm/settle/dispose) with the live snapshot. */\n\treadonly onChange?: (snapshot: readonly MonitorSnapshotEntry[]) => void;\n\t/** Reserves one shared terminal capacity slot for a native watch. */\n\treadonly reserve?: () => (() => void) | null;\n}\n\nexport interface RegisterFileMonitorOptions {\n\treadonly description: string;\n\treadonly path: string;\n\t/** Caller-supplied stable identity so a restore can re-bind the same \"mon_\" id. */\n\treadonly monitorId?: string;\n\treadonly event: \"create\" | \"modify\";\n\treadonly timeoutMs: number;\n\treadonly cwd: string;\n\treadonly approvedParent?: string;\n\t/** Durability deadline of a `checkpointed-file` watch; omitted for a one-shot ephemeral one. */\n\treadonly expiresAt?: number;\n}\n\nexport interface RegisterMonitorOptions {\n\treadonly id: string;\n\t/** Caller-supplied stable identity so a restore can re-bind the same \"mon_\" id. */\n\treadonly monitorId?: string;\n\treadonly description: string;\n\treadonly runtime: TerminalRuntimeSession;\n\treadonly filter?: RegExp;\n\t/** Durability class from the manifest spec; non-ephemeral records carry the fire budget. */\n\treadonly durabilityClass?: MonitorDurabilityClass;\n\t/** Persisted fire window re-bound by a restore, so a restart cannot reset the budget. */\n\treadonly fireWindow?: MonitorFireWindow;\n\t/** Durability deadline of a durable watch; omitted for an ephemeral one. */\n\treadonly expiresAt?: number;\n}\n\ninterface PendingFileRegistration {\n\trelease: (() => void) | undefined;\n\treadonly abort: AbortController;\n\treadonly deadline: ReturnType<typeof setTimeout>;\n\tsettled: boolean;\n}\n\ninterface FileMonitorRecord {\n\treadonly id: string;\n\treadonly monitorId: string;\n\treadonly sessionId: string;\n\treadonly description: string;\n\treadonly startedAtMs: number;\n\treadonly expiresAt: number | undefined;\n\treadonly path: string;\n\treadonly canonicalPath: string;\n\treadonly canonicalParent: string;\n\treadonly event: \"create\" | \"modify\";\n\treadonly watcher: FSWatcher;\n\treadonly release: () => void;\n\treadonly poll: ReturnType<typeof setInterval>;\n\tpaused: boolean;\n\tsettled: boolean;\n\tpresent: boolean;\n\tmtimeMs: number;\n\tsize: number;\n\tdigest: string;\n\tdevice: number;\n\tinode: number;\n\tpendingChange: boolean;\n\tdirty: boolean;\n\tdirtyPasses: number;\n\tdirtyWindowStartedAt: number;\n\tchecking: Promise<void> | undefined;\n\treadonly deadline: ReturnType<typeof setTimeout>;\n}\n\ninterface MonitorRecord {\n\treadonly id: string;\n\treadonly monitorId: string;\n\treadonly sessionId: string;\n\treadonly description: string;\n\treadonly startedAtMs: number;\n\treadonly expiresAt: number | undefined;\n\treadonly runtime: TerminalRuntimeSession;\n\treadonly filter: RegExp | undefined;\n\tlineBuffer: string;\n\tmutedDropped: number;\n\tpaused: boolean;\n\tsettled: boolean;\n\tfireWindow: MonitorFireWindow | undefined;\n\tunsubscribeOutput: (() => void) | undefined;\n\tunsubscribeExit: (() => void) | undefined;\n}\n\n/**\n * Tracks active monitor sessions alongside the terminal manager's existing bash-id registry.\n * Output is deliberately retained only by TerminalRuntimeSession's bounded history; this\n * registry holds at most one unfinished line for each live monitor.\n */\nexport class MonitorRegistry {\n\treadonly #records = new Map<string, MonitorRecord>();\n\treadonly #emit: (event: MonitorEvent) => void;\n\treadonly #onChange: ((snapshot: readonly MonitorSnapshotEntry[]) => void) | undefined;\n\treadonly #reserve: (() => (() => void) | null) | undefined;\n\treadonly #files = new Map<string, FileMonitorRecord>();\n\t#nextFileId = 1;\n\t#disposed = false;\n\t#pendingRegistrations = 0;\n\treadonly #pending = new Set<PendingFileRegistration>();\n\t#lifecycle = 0;\n\n\tconstructor(emit: (event: MonitorEvent) => void, options?: MonitorRegistryOptions) {\n\t\tthis.#emit = emit;\n\t\tthis.#onChange = options?.onChange;\n\t\tthis.#reserve = options?.reserve;\n\t}\n\n\tsnapshot(): readonly MonitorSnapshotEntry[] {\n\t\treturn [...this.#records.values(), ...this.#files.values()].map((record) => ({\n\t\t\tid: record.id,\n\t\t\tmonitorId: record.monitorId,\n\t\t\tdescription: record.description,\n\t\t\tpaused: record.paused,\n\t\t\tstartedAtMs: record.startedAtMs,\n\t\t\texpiresAt: record.expiresAt,\n\t\t\tfireWindow: \"fireWindow\" in record ? record.fireWindow : undefined,\n\t\t}));\n\t}\n\n\tasync registerFile(options: RegisterFileMonitorOptions): Promise<{ id: string; monitorId: string }> {\n\t\tif (this.#disposed) throw new Error(\"Cannot create file monitor: monitor registry is disposed.\");\n\t\tthis.#pendingRegistrations += 1;\n\t\tconst lifecycle = this.#lifecycle;\n\t\tconst release = this.#reserve?.();\n\t\tif (this.#reserve && !release) {\n\t\t\tthis.#pendingRegistrations -= 1;\n\t\t\tthrow new Error(\"Cannot create file monitor: terminal capacity is already in use.\");\n\t\t}\n\t\tconst pending: PendingFileRegistration = {\n\t\t\trelease: release ?? undefined,\n\t\t\tabort: new AbortController(),\n\t\t\tdeadline: setTimeout(() => pending.abort.abort(), options.timeoutMs),\n\t\t\tsettled: false,\n\t\t};\n\t\tthis.#pending.add(pending);\n\t\tconst path = resolve(options.cwd, options.path);\n\t\tconst parent = dirname(path);\n\t\tlet approvedParent: string;\n\t\ttry {\n\t\t\tawait this.#registrationAwait(pending, access(parent));\n\t\t\tapprovedParent = await this.#registrationAwait(pending, realpath(parent));\n\t\t\tconst approvedParentAtPermission = options.approvedParent;\n\t\t\tif (approvedParentAtPermission !== undefined && approvedParent !== approvedParentAtPermission) {\n\t\t\t\tthrow new Error(`Cannot watch file: parent directory changed during permission approval: ${parent}`);\n\t\t\t}\n\t\t\tif (this.#disposed) throw new Error(\"Cannot create file monitor: monitor registry is disposed.\");\n\t\t} catch (error) {\n\t\t\tthis.#finishPending(pending);\n\t\t\tthis.#pendingRegistrations -= 1;\n\t\t\tif (error instanceof Error && error.message.includes(\"disposed\")) throw error;\n\t\t\tif ((error as NodeJS.ErrnoException)?.code !== \"ENOENT\") {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Cannot access parent directory ${parent}: ${error instanceof Error ? error.message : String(error)}`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tthrow new Error(`Cannot watch file: parent directory does not exist: ${parent}`);\n\t\t}\n\t\tlet initial: Awaited<ReturnType<typeof stat>> | null = null;\n\t\tlet initialHandle: FileHandle | undefined;\n\t\ttry {\n\t\t\tconst target = await this.#registrationAwait(pending, lstat(path));\n\t\t\tif (target.isSymbolicLink()) throw new Error(`Cannot watch file: target is a symbolic link: ${path}`);\n\t\t\tinitialHandle = await this.#registrationAwait(pending, open(path, \"r\"), async (handle) => {\n\t\t\t\tawait handle.close();\n\t\t\t});\n\t\t\tinitial = await this.#registrationAwait(pending, initialHandle.stat());\n\t\t\tif (!initial.isFile()) throw new Error(`Cannot watch file: target is not a regular file: ${path}`);\n\t\t\tconst resolvedTarget = await this.#registrationAwait(pending, realpath(path));\n\t\t\tif (resolvedTarget !== join(approvedParent, basename(path)))\n\t\t\t\tthrow new Error(`Cannot watch file: target identity changed: ${path}`);\n\t\t\tconst rebound = await this.#registrationAwait(pending, lstat(path));\n\t\t\tif (rebound.isSymbolicLink()) throw new Error(`Cannot watch file: target identity changed: ${path}`);\n\t\t\tconst reboundStat = await this.#registrationAwait(pending, stat(path));\n\t\t\tif (!reboundStat.isFile() || reboundStat.dev !== initial.dev || reboundStat.ino !== initial.ino)\n\t\t\t\tthrow new Error(`Cannot watch file: target identity changed: ${path}`);\n\t\t} catch (error) {\n\t\t\tawait initialHandle?.close();\n\t\t\tinitialHandle = undefined;\n\t\t\tif ((error as NodeJS.ErrnoException)?.code !== \"ENOENT\") {\n\t\t\t\tthis.#finishPending(pending);\n\t\t\t\tthis.#pendingRegistrations -= 1;\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t}\n\t\tif (this.#disposed || lifecycle !== this.#lifecycle || this.#pendingRegistrations < 1) {\n\t\t\tthis.#finishPending(pending);\n\t\t\tthis.#pendingRegistrations -= 1;\n\t\t\tthrow new Error(\"Cannot create file monitor: monitor registry is disposed.\");\n\t\t}\n\t\tconst id = `watch_${this.#nextFileId++}`;\n\t\tlet watcher: FSWatcher;\n\t\ttry {\n\t\t\tconst activationParent = await this.#registrationAwait(pending, realpath(parent));\n\t\t\tif (activationParent !== approvedParent) {\n\t\t\t\tthrow new Error(`Cannot watch file: parent directory changed during registration: ${parent}`);\n\t\t\t}\n\t\t\twatcher = watch(activationParent, (_kind, name) => {\n\t\t\t\tif (!name || basename(String(name)) === basename(path)) void this.#checkFile(id);\n\t\t\t});\n\t\t} catch (error) {\n\t\t\tthis.#finishPending(pending);\n\t\t\tthis.#pendingRegistrations -= 1;\n\t\t\tthrow new Error(`Cannot watch file ${path}: ${error instanceof Error ? error.message : String(error)}`);\n\t\t}\n\t\tlet registrationError: string | undefined;\n\t\twatcher.on(\"error\", (error) => {\n\t\t\tregistrationError = `watcher error: ${error instanceof Error ? error.message : String(error)}`;\n\t\t\tconst record = this.#files.get(id);\n\t\t\tif (record) this.#settleFile(record, registrationError);\n\t\t});\n\t\tlet registrationCleaned = false;\n\t\tconst finishRegistration = () => {\n\t\t\tif (registrationCleaned) return;\n\t\t\tregistrationCleaned = true;\n\t\t\tthis.#pendingRegistrations -= 1;\n\t\t};\n\t\tconst cleanupRegistration = () => {\n\t\t\tif (registrationCleaned) return;\n\t\t\twatcher.close();\n\t\t\tfinishRegistration();\n\t\t\tthis.#finishPending(pending);\n\t\t};\n\t\tif (this.#disposed || lifecycle !== this.#lifecycle) {\n\t\t\tcleanupRegistration();\n\t\t\tthrow new Error(\"Cannot create file monitor: monitor registry is disposed.\");\n\t\t}\n\t\tconst canonicalPath = join(approvedParent, basename(path));\n\t\tlet digest: string;\n\t\ttry {\n\t\t\tdigest =\n\t\t\t\tinitial && initialHandle\n\t\t\t\t\t? await this.#registrationAwait(pending, this.#digestHandle(initialHandle, pending.abort.signal))\n\t\t\t\t\t: \"\";\n\t\t} catch (error) {\n\t\t\tcleanupRegistration();\n\t\t\tawait initialHandle?.close();\n\t\t\tinitialHandle = undefined;\n\t\t\tif (registrationError) {\n\t\t\t\tthis.#emit({ type: \"summary\", id, description: options.description, summary: registrationError });\n\t\t\t\tthrow new Error(registrationError);\n\t\t\t}\n\t\t\tthrow error;\n\t\t}\n\t\tawait initialHandle?.close();\n\t\tinitialHandle = undefined;\n\t\tif (registrationError) {\n\t\t\tcleanupRegistration();\n\t\t\tthis.#emit({ type: \"summary\", id, description: options.description, summary: registrationError });\n\t\t\tthrow new Error(registrationError);\n\t\t}\n\t\tif (this.#disposed || lifecycle !== this.#lifecycle) {\n\t\t\tcleanupRegistration();\n\t\t\tthrow new Error(\"Cannot create file monitor: monitor registry is disposed.\");\n\t\t}\n\t\tconst record: FileMonitorRecord = {\n\t\t\tid,\n\t\t\tmonitorId: options.monitorId ?? allocateMonitorId(),\n\t\t\tsessionId: id,\n\t\t\tdescription: options.description,\n\t\t\tstartedAtMs: Date.now(),\n\t\t\texpiresAt: options.expiresAt,\n\t\t\tpath,\n\t\t\tcanonicalPath,\n\t\t\tcanonicalParent: approvedParent,\n\t\t\tevent: options.event,\n\t\t\twatcher,\n\t\t\trelease: release ?? (() => {}),\n\t\t\tpoll: setInterval(() => void this.#checkFile(id), 250),\n\t\t\tpaused: false,\n\t\t\tsettled: false,\n\t\t\tpresent: initial !== null,\n\t\t\tmtimeMs: initial?.mtimeMs ?? 0,\n\t\t\tsize: initial?.size ?? 0,\n\t\t\tdigest,\n\t\t\tdevice: initial?.dev ?? 0,\n\t\t\tinode: initial?.ino ?? 0,\n\t\t\tpendingChange: false,\n\t\t\tdirty: false,\n\t\t\tdirtyPasses: 0,\n\t\t\tdirtyWindowStartedAt: 0,\n\t\t\tchecking: undefined,\n\t\t\tdeadline: setTimeout(() => {\n\t\t\t\tconst current = this.#files.get(id);\n\t\t\t\tif (current) this.#settleFile(current, \"watcher timed_out\");\n\t\t\t}, options.timeoutMs),\n\t\t};\n\t\tthis.#files.set(id, record);\n\t\tfinishRegistration();\n\t\tthis.#finishPending(pending, true);\n\t\tif (registrationError || this.#disposed || lifecycle !== this.#lifecycle) {\n\t\t\tthis.#settleFile(record, registrationError ?? \"watcher killed\");\n\t\t\tthrow new Error(registrationError ?? \"Cannot create file monitor: monitor registry is disposed.\");\n\t\t}\n\t\tthis.#notifyChange();\n\t\treturn { id, monitorId: record.monitorId };\n\t}\n\n\t/** Live identity tuple of one file watch; undefined when the id is not a live file watch. */\n\tfileCheckpoint(id: string) {\n\t\tconst r = this.#files.get(id);\n\t\treturn (\n\t\t\tr && { dev: r.device, ino: r.inode, size: r.size, mtimeMs: r.mtimeMs, digest: r.digest, present: r.present }\n\t\t);\n\t}\n\n\t/** Emit one restored-watch line through the SAME sink a live watch uses (coalescing, wake budget). */\n\temitFileLine(id: string, line: string): boolean {\n\t\tconst record = this.#files.get(id);\n\t\tif (!record || record.settled) return false;\n\t\tthis.#emit({ type: \"line\", id: record.id, description: record.description, line });\n\t\treturn true;\n\t}\n\n\tasync stopFile(id: string): Promise<boolean> {\n\t\tconst record = this.#files.get(id);\n\t\tif (!record) return false;\n\t\tthis.#settleFile(record, \"watcher killed\");\n\t\treturn true;\n\t}\n\n\tasync stopAllFiles(): Promise<number> {\n\t\tthis.#lifecycle += 1;\n\t\tconst records = [...this.#files.values()];\n\t\tfor (const record of records) this.#settleFile(record, \"watcher killed\");\n\t\tfor (const pending of [...this.#pending]) this.#finishPending(pending);\n\t\treturn records.length;\n\t}\n\n\t#settleFile(record: FileMonitorRecord, summary: string): void {\n\t\tif (record.settled) return;\n\t\trecord.settled = true;\n\t\tclearInterval(record.poll);\n\t\tclearTimeout(record.deadline);\n\t\trecord.watcher.close();\n\t\trecord.release();\n\t\tthis.#files.delete(record.id);\n\t\tthis.#notifyChange();\n\t\tthis.#emit({ type: \"summary\", id: record.id, description: record.description, summary });\n\t}\n\n\tasync #checkFile(id: string): Promise<void> {\n\t\tconst record = this.#files.get(id);\n\t\tif (!record || record.settled) return;\n\t\tif (record.checking) {\n\t\t\trecord.dirty = true;\n\t\t\treturn;\n\t\t}\n\t\trecord.checking = this.#checkFileImpl(record)\n\t\t\t.catch((error) => {\n\t\t\t\tif (!record.settled)\n\t\t\t\t\tthis.#settleFile(record, `watcher error: ${error instanceof Error ? error.message : String(error)}`);\n\t\t\t})\n\t\t\t.finally(() => {\n\t\t\t\trecord.checking = undefined;\n\t\t\t\tconst now = Date.now();\n\t\t\t\tif (now - record.dirtyWindowStartedAt >= 1_000) {\n\t\t\t\t\trecord.dirtyWindowStartedAt = now;\n\t\t\t\t\trecord.dirtyPasses = 0;\n\t\t\t\t}\n\t\t\t\tif (record.dirty && !record.settled && record.dirtyPasses < 1) {\n\t\t\t\t\trecord.dirty = false;\n\t\t\t\t\trecord.dirtyPasses += 1;\n\t\t\t\t\tvoid this.#checkFile(id);\n\t\t\t\t} else {\n\t\t\t\t\trecord.dirty = false;\n\t\t\t\t}\n\t\t\t});\n\t\treturn record.checking;\n\t}\n\n\tasync #checkFileImpl(record: FileMonitorRecord): Promise<void> {\n\t\tif (record.settled) return;\n\t\tlet current: Awaited<ReturnType<typeof stat>> | null = null;\n\t\tlet handle: FileHandle | undefined;\n\t\ttry {\n\t\t\tconst currentParent = await realpath(dirname(record.path));\n\t\t\tif (currentParent !== record.canonicalParent) {\n\t\t\t\tthis.#settleFile(record, `watcher error: monitored parent changed: ${dirname(record.path)}`);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst target = await lstat(record.canonicalPath);\n\t\t\tif (target.isSymbolicLink()) throw new Error(`Cannot watch file: target identity changed: ${record.path}`);\n\t\t\tconst resolvedTarget = await realpath(record.canonicalPath);\n\t\t\tif (resolvedTarget !== record.canonicalPath)\n\t\t\t\tthrow new Error(`Cannot watch file: target identity changed: ${record.path}`);\n\t\t\thandle = await open(record.canonicalPath, \"r\");\n\t\t\tconst opened = await handle.stat();\n\t\t\tif (!opened.isFile()) throw new Error(`Cannot watch file: target is not a regular file: ${record.path}`);\n\t\t\tif ((opened.dev !== record.device || opened.ino !== record.inode) && opened.nlink > 1)\n\t\t\t\tthrow new Error(`Cannot watch file: target identity changed: ${record.path}`);\n\t\t\tcurrent = opened;\n\t\t\tconst rebound = await lstat(record.canonicalPath);\n\t\t\tif (rebound.isSymbolicLink()) throw new Error(`Cannot watch file: target identity changed: ${record.path}`);\n\t\t\tconst reboundPath = await stat(record.canonicalPath);\n\t\t\tif (!reboundPath.isFile() || reboundPath.dev !== opened.dev || reboundPath.ino !== opened.ino)\n\t\t\t\tthrow new Error(`Cannot watch file: target identity changed: ${record.path}`);\n\t\t} catch (error) {\n\t\t\tawait handle?.close();\n\t\t\tif ((error as NodeJS.ErrnoException)?.code !== \"ENOENT\") {\n\t\t\t\tthis.#settleFile(record, `watcher error: ${error instanceof Error ? error.message : String(error)}`);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\tconst present = current !== null;\n\t\tlet digest = \"\";\n\t\ttry {\n\t\t\tdigest = present && handle ? await this.#digestHandle(handle) : \"\";\n\t\t\tif (present && handle) {\n\t\t\t\tconst afterDigest = await stat(record.canonicalPath);\n\t\t\t\tconst opened = await handle.stat();\n\t\t\t\tif (afterDigest.dev !== opened.dev || afterDigest.ino !== opened.ino)\n\t\t\t\t\tthrow new Error(`Cannot watch file: target identity changed: ${record.path}`);\n\t\t\t}\n\t\t} finally {\n\t\t\tawait handle?.close();\n\t\t}\n\t\tconst changed =\n\t\t\trecord.event === \"create\"\n\t\t\t\t? !record.present && present\n\t\t\t\t: record.present &&\n\t\t\t\t\tpresent &&\n\t\t\t\t\t(current!.mtimeMs !== record.mtimeMs || current!.size !== record.size || digest !== record.digest);\n\t\trecord.pendingChange ||= changed;\n\t\tif (!record.present && current) {\n\t\t\trecord.device = current.dev;\n\t\t\trecord.inode = current.ino;\n\t\t}\n\t\trecord.present = present;\n\t\trecord.mtimeMs = current?.mtimeMs ?? 0;\n\t\trecord.size = current?.size ?? 0;\n\t\trecord.digest = digest;\n\t\tif (!record.pendingChange || record.paused || record.settled) return;\n\t\trecord.pendingChange = false;\n\t\tif (record.settled) return;\n\t\tthis.#emit({\n\t\t\ttype: \"line\",\n\t\t\tid: record.id,\n\t\t\tdescription: record.description,\n\t\t\tline: `${record.event} ${record.path}`,\n\t\t});\n\t\tthis.#settleFile(record, \"watcher completed\");\n\t}\n\n\tregister(options: RegisterMonitorOptions): string {\n\t\tconst durable = options.durabilityClass !== undefined && options.durabilityClass !== \"ephemeral\";\n\t\tconst record: MonitorRecord = {\n\t\t\tid: options.id,\n\t\t\tmonitorId: options.monitorId ?? allocateMonitorId(),\n\t\t\tsessionId: options.id,\n\t\t\tdescription: options.description,\n\t\t\tstartedAtMs: Date.now(),\n\t\t\texpiresAt: options.expiresAt,\n\t\t\truntime: options.runtime,\n\t\t\tfilter: options.filter,\n\t\t\tlineBuffer: \"\",\n\t\t\tmutedDropped: 0,\n\t\t\tpaused: false,\n\t\t\tsettled: false,\n\t\t\tfireWindow: durable ? { ...(options.fireWindow ?? { startMs: Date.now(), count: 0 }) } : undefined,\n\t\t\tunsubscribeOutput: undefined,\n\t\t\tunsubscribeExit: undefined,\n\t\t};\n\t\tthis.#records.set(record.id, record);\n\t\tthis.#notifyChange();\n\n\t\t// Runtime output is already bounded. Read what was produced before monitor registration,\n\t\t// then subscribe synchronously so a fast watcher cannot lose its first line.\n\t\tthis.#consume(record, record.runtime.fullOutput());\n\t\trecord.unsubscribeOutput = record.runtime.onOutput((chunk) => this.#consume(record, chunk));\n\t\trecord.unsubscribeExit = record.runtime.session.onExit(() => this.#settle(record));\n\t\tif (record.runtime.exited) this.#settle(record);\n\t\treturn record.monitorId;\n\t}\n\n\tpause(ids: readonly string[]): string[] {\n\t\tconst paused: string[] = [];\n\t\tfor (const id of ids) {\n\t\t\tconst record = this.#records.get(id) ?? this.#files.get(id);\n\t\t\tif (!record || record.paused) continue;\n\t\t\trecord.paused = true;\n\t\t\tpaused.push(record.id);\n\t\t}\n\t\tif (paused.length > 0) this.#notifyChange();\n\t\treturn paused;\n\t}\n\n\tpauseAll(): string[] {\n\t\treturn this.pause([...this.#records.keys(), ...this.#files.keys()]);\n\t}\n\n\tresume(ids?: readonly string[]): MonitorResumeResult[] {\n\t\tconst candidates = ids ?? [...this.#records.keys(), ...this.#files.keys()];\n\t\tconst resumed: MonitorResumeResult[] = [];\n\t\tfor (const id of candidates) {\n\t\t\tconst record = this.#records.get(id) ?? this.#files.get(id);\n\t\t\tif (!record?.paused) continue;\n\t\t\trecord.paused = false;\n\t\t\tconst mutedDropped = \"mutedDropped\" in record ? record.mutedDropped : 0;\n\t\t\tif (\"mutedDropped\" in record) record.mutedDropped = 0;\n\t\t\t// A rearm (or any resume) restarts the rolling fire budget while keeping its window start.\n\t\t\tif (\"fireWindow\" in record && record.fireWindow !== undefined) record.fireWindow.count = 0;\n\t\t\tresumed.push({ id: record.id, mutedDropped });\n\t\t\tif (\"pendingChange\" in record && record.pendingChange) void this.#checkFile(record.id);\n\t\t}\n\t\tif (resumed.length > 0) this.#notifyChange();\n\t\treturn resumed;\n\t}\n\n\tmutedDropped(id: string): number {\n\t\treturn this.#records.get(id)?.mutedDropped ?? 0;\n\t}\n\n\trearm(id: string): MonitorRearmResult {\n\t\tconst record = this.#records.get(id) ?? this.#files.get(id);\n\t\tif (!record) return \"not_found\";\n\t\tif (!record.paused) return \"not_paused\";\n\t\tthis.resume([id]);\n\t\treturn \"rearmed\";\n\t}\n\n\t/** Re-bind a persisted fire window onto the record for a durable monitor id (a restore re-arms the budget). */\n\tadoptFireWindow(monitorId: string, fireWindow: MonitorFireWindow): boolean {\n\t\tfor (const record of this.#records.values()) {\n\t\t\tif (record.monitorId !== monitorId) continue;\n\t\t\trecord.fireWindow = { ...fireWindow };\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\n\tdispose(): void {\n\t\tthis.#disposed = true;\n\t\tthis.#lifecycle += 1;\n\t\tfor (const record of this.#records.values()) this.#disposeRecord(record);\n\t\tfor (const record of this.#files.values()) this.#settleFile(record, \"watcher disposed\");\n\t\tfor (const pending of this.#pending) this.#finishPending(pending);\n\t\tthis.#records.clear();\n\t\tthis.#notifyChange();\n\t}\n\n\t#finishPending(pending: PendingFileRegistration, transfer = false): void {\n\t\tif (pending.settled) return;\n\t\tpending.settled = true;\n\t\tclearTimeout(pending.deadline);\n\t\tthis.#pending.delete(pending);\n\t\tif (transfer) pending.release = undefined;\n\t\telse {\n\t\t\tpending.abort.abort();\n\t\t\tpending.release?.();\n\t\t}\n\t}\n\n\tasync #registrationAwait<T>(\n\t\tpending: PendingFileRegistration,\n\t\toperation: Promise<T>,\n\t\tlateCleanup?: (value: T) => Promise<void>,\n\t): Promise<T> {\n\t\tif (pending.abort.signal.aborted) {\n\t\t\tvoid operation.then(\n\t\t\t\t(value) => lateCleanup?.(value),\n\t\t\t\t() => undefined,\n\t\t\t);\n\t\t\tthrow new Error(\"Cannot create file monitor: registration timed out or was disposed.\");\n\t\t}\n\t\tlet aborted = false;\n\t\tconst abort = new Promise<never>((_, reject) =>\n\t\t\tpending.abort.signal.addEventListener(\n\t\t\t\t\"abort\",\n\t\t\t\t() => {\n\t\t\t\t\taborted = true;\n\t\t\t\t\treject(new Error(\"Cannot create file monitor: registration timed out or was disposed.\"));\n\t\t\t\t},\n\t\t\t\t{ once: true },\n\t\t\t),\n\t\t);\n\t\tconst guarded = operation.then(\n\t\t\t(value) => {\n\t\t\t\tif (aborted) void lateCleanup?.(value);\n\t\t\t\treturn value;\n\t\t\t},\n\t\t\t(error) => {\n\t\t\t\tif (aborted) return undefined as T;\n\t\t\t\tthrow error;\n\t\t\t},\n\t\t);\n\t\treturn Promise.race([guarded, abort]);\n\t}\n\n\tasync #digestHandle(handle: FileHandle, signal?: AbortSignal): Promise<string> {\n\t\tconst SAMPLE_SIZE = 64 * 1024;\n\t\tif (signal?.aborted) throw new Error(\"file monitor registration cancelled\");\n\t\tconst metadata = await handle.stat();\n\t\tconst hash = createHash(\"sha256\");\n\t\tconst first = Buffer.alloc(Math.min(SAMPLE_SIZE, metadata.size));\n\t\tif (first.length > 0) {\n\t\t\tawait handle.read(first, 0, first.length, 0);\n\t\t\thash.update(first);\n\t\t}\n\t\tif (metadata.size > SAMPLE_SIZE) {\n\t\t\tconst middle = Buffer.alloc(SAMPLE_SIZE);\n\t\t\tawait handle.read(middle, 0, middle.length, Math.floor((metadata.size - middle.length) / 2));\n\t\t\thash.update(middle);\n\t\t\tconst last = Buffer.alloc(SAMPLE_SIZE);\n\t\t\tawait handle.read(last, 0, last.length, metadata.size - last.length);\n\t\t\thash.update(last);\n\t\t}\n\t\treturn `${metadata.size}:${hash.digest(\"hex\")}`;\n\t}\n\n\t#notifyChange(): void {\n\t\tthis.#onChange?.(this.snapshot());\n\t}\n\n\t#consume(record: MonitorRecord, chunk: string): void {\n\t\tif (record.settled || chunk.length === 0) return;\n\t\tlet remaining = record.lineBuffer + chunk;\n\t\tfor (;;) {\n\t\t\tconst newline = remaining.indexOf(\"\\n\");\n\t\t\tif (newline < 0) break;\n\t\t\tconst rawLine = remaining.slice(0, newline);\n\t\t\tremaining = remaining.slice(newline + 1);\n\t\t\tconst line = rawLine.endsWith(\"\\r\") ? rawLine.slice(0, -1) : rawLine;\n\t\t\tconst matchesFilter = !record.filter || record.filter.test(line);\n\t\t\tif (!matchesFilter) continue;\n\t\t\tif (record.paused) {\n\t\t\t\trecord.mutedDropped += 1;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tthis.#emit({ type: \"line\", id: record.id, description: record.description, line });\n\t\t\tif (record.fireWindow !== undefined) {\n\t\t\t\tconst now = Date.now();\n\t\t\t\tif (now - record.fireWindow.startMs >= FIRE_BUDGET_WINDOW_MS)\n\t\t\t\t\trecord.fireWindow = { startMs: now, count: 0 };\n\t\t\t\trecord.fireWindow.count += 1;\n\t\t\t\tif (record.fireWindow.count >= DEFAULT_DURABLE_MONITOR_FIRE_BUDGET) {\n\t\t\t\t\trecord.paused = true;\n\t\t\t\t\tthis.#emit({\n\t\t\t\t\t\ttype: \"summary\",\n\t\t\t\t\t\tid: record.id,\n\t\t\t\t\t\tdescription: record.description,\n\t\t\t\t\t\tsummary: FIRE_BUDGET_AUTO_MUTE_SUMMARY,\n\t\t\t\t\t});\n\t\t\t\t\tthis.#notifyChange();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\trecord.lineBuffer = remaining;\n\t}\n\n\t#settle(record: MonitorRecord): void {\n\t\tif (record.settled) return;\n\t\trecord.settled = true;\n\t\trecord.unsubscribeOutput?.();\n\t\trecord.unsubscribeExit?.();\n\t\tthis.#records.delete(record.id);\n\t\tthis.#notifyChange();\n\t\tconst status = describeExit(record.runtime) ?? \"exited\";\n\t\tconst code = record.runtime.exitResult?.exitCode;\n\t\tconst codeText = code === null || code === undefined ? \"\" : ` (exit code ${code})`;\n\t\tthis.#emit({\n\t\t\ttype: \"summary\",\n\t\t\tid: record.id,\n\t\t\tdescription: record.description,\n\t\t\tsummary: `watcher ${status}${codeText}`,\n\t\t});\n\t}\n\n\t#disposeRecord(record: MonitorRecord): void {\n\t\trecord.settled = true;\n\t\trecord.unsubscribeOutput?.();\n\t\trecord.unsubscribeExit?.();\n\t}\n}\n"]}
1
+ {"version":3,"file":"monitor-registry.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/terminal/monitor-registry.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash, randomBytes } from \"node:crypto\";\nimport { type FSWatcher, watch } from \"node:fs\";\nimport { access, type FileHandle, lstat, open, stat } from \"node:fs/promises\";\nimport { basename, dirname, join, resolve } from \"node:path\";\nimport { canonicalWatchPath, probeDirectoryOpenable } from \"../../../../utils/fs-watch.ts\";\nimport { realpathWithoutOpen } from \"../../../../utils/paths.ts\";\nimport type {\n\tTerminalMonitorEndedEvent as MonitorEndedEvent,\n\tTerminalMonitorEndedReason as MonitorEndedReason,\n} from \"../monitor-state-event.ts\";\nimport type { TerminalRuntimeSession } from \"./runtime-session.ts\";\nimport { DEFAULT_DURABLE_MONITOR_FIRE_BUDGET, FIRE_BUDGET_AUTO_MUTE_SUMMARY, FIRE_BUDGET_WINDOW_MS } from \"./shared.ts\";\nimport type { MonitorDurabilityClass } from \"./terminal-manifest.ts\";\nimport { describeExit } from \"./tools/spawn.ts\";\n\nexport interface MonitorLineEvent {\n\treadonly type: \"line\";\n\treadonly id: string;\n\treadonly description: string;\n\treadonly line: string;\n}\n\nexport interface MonitorSummaryEvent {\n\treadonly type: \"summary\";\n\treadonly id: string;\n\treadonly description: string;\n\treadonly summary: string;\n}\n\nexport type MonitorEvent = MonitorLineEvent | MonitorSummaryEvent;\n\nexport type MonitorRearmResult = \"rearmed\" | \"not_paused\" | \"not_found\";\n\nexport interface MonitorResumeResult {\n\treadonly id: string;\n\treadonly mutedDropped: number;\n}\n\nconst MONITOR_ID_ALPHABET = \"0123456789ABCDEFGHJKMNPQRSTVWXYZ\";\n\n/** Allocate a stable monitor identity: \"mon_\" + 16 Crockford base-32 chars (80 random bits). */\nexport function allocateMonitorId(): string {\n\tlet id = \"mon_\";\n\tlet buffer = 0;\n\tlet bits = 0;\n\tfor (const byte of randomBytes(10)) {\n\t\tbuffer = (buffer << 8) | byte;\n\t\tbits += 8;\n\t\twhile (bits >= 5) {\n\t\t\tbits -= 5;\n\t\t\tid += MONITOR_ID_ALPHABET[(buffer >> bits) & 31];\n\t\t}\n\t}\n\treturn id;\n}\n\nexport type MonitorFireWindow = { startMs: number; count: number };\nexport interface MonitorSnapshotEntry {\n\treadonly id: string;\n\t/** Stable \"mon_\" identity carried alongside the runtime id; always set on live snapshots. */\n\treadonly monitorId?: string;\n\treadonly description: string;\n\treadonly paused: boolean;\n\t/** Epoch milliseconds when the watch registered; feeds the footer's live elapsed label. */\n\treadonly startedAtMs: number;\n\treadonly command?: string | null;\n\treadonly filter?: string | null;\n\treadonly persistent?: boolean;\n\treadonly deadlineMs?: number | null;\n\treadonly fireCount?: number;\n\treadonly lastFiredAtMs?: number | null;\n\t/** Durability deadline of a restart-surviving watch; undefined for every ephemeral one. */\n\treadonly expiresAt?: number;\n\treadonly fireWindow?: MonitorFireWindow;\n}\n\nexport type { MonitorEndedEvent, MonitorEndedReason };\n\nexport interface MonitorRegistryOptions {\n\t/** Observes every registry transition (register/pause/rearm/settle/dispose) with the live snapshot. */\n\treadonly onChange?: (snapshot: readonly MonitorSnapshotEntry[]) => void;\n\t/** Fire-stat refreshes are separate from lifecycle transitions (which persist the manifest). */\n\treadonly onFire?: (snapshot: readonly MonitorSnapshotEntry[]) => void;\n\t/** Observes each monitor exactly once when it leaves the registry. */\n\treadonly onEnded?: (event: MonitorEndedEvent) => void;\n\t/** Reserves one shared terminal capacity slot for a native watch. */\n\treadonly reserve?: () => (() => void) | null;\n}\n\nexport interface RegisterFileMonitorOptions {\n\treadonly description: string;\n\treadonly path: string;\n\treadonly persistent?: boolean;\n\treadonly deadlineMs?: number | null;\n\t/** Caller-supplied stable identity so a restore can re-bind the same \"mon_\" id. */\n\treadonly monitorId?: string;\n\treadonly event: \"create\" | \"modify\";\n\treadonly timeoutMs: number;\n\treadonly cwd: string;\n\treadonly approvedParent?: string;\n\t/** Durability deadline of a `checkpointed-file` watch; omitted for a one-shot ephemeral one. */\n\treadonly expiresAt?: number;\n}\n\nexport interface RegisterMonitorOptions {\n\treadonly id: string;\n\treadonly command?: string | null;\n\treadonly persistent?: boolean;\n\treadonly deadlineMs?: number | null;\n\t/** Caller-supplied stable identity so a restore can re-bind the same \"mon_\" id. */\n\treadonly monitorId?: string;\n\treadonly description: string;\n\treadonly runtime: TerminalRuntimeSession;\n\treadonly filter?: RegExp;\n\t/** Durability class from the manifest spec; non-ephemeral records carry the fire budget. */\n\treadonly durabilityClass?: MonitorDurabilityClass;\n\t/** Persisted fire window re-bound by a restore, so a restart cannot reset the budget. */\n\treadonly fireWindow?: MonitorFireWindow;\n\t/** Durability deadline of a durable watch; omitted for an ephemeral one. */\n\treadonly expiresAt?: number;\n}\n\ninterface PendingFileRegistration {\n\trelease: (() => void) | undefined;\n\treadonly abort: AbortController;\n\treadonly deadline: ReturnType<typeof setTimeout>;\n\tsettled: boolean;\n}\n\ninterface FileMonitorRecord {\n\treadonly id: string;\n\treadonly monitorId: string;\n\treadonly sessionId: string;\n\treadonly description: string;\n\treadonly startedAtMs: number;\n\treadonly command: null;\n\treadonly filter: null;\n\treadonly persistent: boolean;\n\treadonly deadlineMs: number | null;\n\tfireCount: number;\n\tlastFiredAtMs: number | null;\n\treadonly expiresAt: number | undefined;\n\treadonly path: string;\n\treadonly canonicalPath: string;\n\treadonly canonicalParent: string;\n\treadonly event: \"create\" | \"modify\";\n\treadonly watcher: FSWatcher;\n\treadonly release: () => void;\n\treadonly poll: ReturnType<typeof setInterval>;\n\tpaused: boolean;\n\tsettled: boolean;\n\tpresent: boolean;\n\tmtimeMs: number;\n\tsize: number;\n\tdigest: string;\n\tdevice: number;\n\tinode: number;\n\tpendingChange: boolean;\n\tdirty: boolean;\n\tdirtyPasses: number;\n\tdirtyWindowStartedAt: number;\n\tchecking: Promise<void> | undefined;\n\treadonly deadline: ReturnType<typeof setTimeout>;\n}\n\ninterface MonitorRecord {\n\treadonly id: string;\n\treadonly monitorId: string;\n\treadonly sessionId: string;\n\treadonly description: string;\n\treadonly startedAtMs: number;\n\treadonly command: string | null;\n\treadonly persistent: boolean;\n\treadonly deadlineMs: number | null;\n\tfireCount: number;\n\tlastFiredAtMs: number | null;\n\treadonly expiresAt: number | undefined;\n\treadonly runtime: TerminalRuntimeSession;\n\treadonly filter: RegExp | undefined;\n\tlineBuffer: string;\n\tmutedDropped: number;\n\tpaused: boolean;\n\tsettled: boolean;\n\tfireWindow: MonitorFireWindow | undefined;\n\tunsubscribeOutput: (() => void) | undefined;\n\tunsubscribeExit: (() => void) | undefined;\n}\n\n/**\n * Tracks active monitor sessions alongside the terminal manager's existing bash-id registry.\n * Output is deliberately retained only by TerminalRuntimeSession's bounded history; this\n * registry holds at most one unfinished line for each live monitor.\n */\nexport class MonitorRegistry {\n\treadonly #records = new Map<string, MonitorRecord>();\n\treadonly #emit: (event: MonitorEvent) => void;\n\treadonly #onChange: ((snapshot: readonly MonitorSnapshotEntry[]) => void) | undefined;\n\treadonly #onEnded: ((event: MonitorEndedEvent) => void) | undefined;\n\treadonly #onFire: ((snapshot: readonly MonitorSnapshotEntry[]) => void) | undefined;\n\treadonly #reserve: (() => (() => void) | null) | undefined;\n\treadonly #files = new Map<string, FileMonitorRecord>();\n\t#nextFileId = 1;\n\t#disposed = false;\n\t#pendingRegistrations = 0;\n\treadonly #pending = new Set<PendingFileRegistration>();\n\t#lifecycle = 0;\n\n\tconstructor(emit: (event: MonitorEvent) => void, options?: MonitorRegistryOptions) {\n\t\tthis.#emit = emit;\n\t\tthis.#onChange = options?.onChange;\n\t\tthis.#onEnded = options?.onEnded;\n\t\tthis.#onFire = options?.onFire;\n\t\tthis.#reserve = options?.reserve;\n\t}\n\n\tsnapshot(): readonly MonitorSnapshotEntry[] {\n\t\treturn [...this.#records.values(), ...this.#files.values()].map((record) => ({\n\t\t\tid: record.id,\n\t\t\tmonitorId: record.monitorId,\n\t\t\tdescription: record.description,\n\t\t\tpaused: record.paused,\n\t\t\tstartedAtMs: record.startedAtMs,\n\t\t\tcommand: record.command,\n\t\t\tfilter: record.filter?.source ?? null,\n\t\t\tpersistent: record.persistent,\n\t\t\tdeadlineMs: record.deadlineMs,\n\t\t\tfireCount: record.fireCount,\n\t\t\tlastFiredAtMs: record.lastFiredAtMs,\n\t\t\texpiresAt: record.expiresAt,\n\t\t\tfireWindow: \"fireWindow\" in record ? record.fireWindow : undefined,\n\t\t}));\n\t}\n\n\tasync registerFile(options: RegisterFileMonitorOptions): Promise<{ id: string; monitorId: string }> {\n\t\tif (this.#disposed) throw new Error(\"Cannot create file monitor: monitor registry is disposed.\");\n\t\tthis.#pendingRegistrations += 1;\n\t\tconst lifecycle = this.#lifecycle;\n\t\tconst release = this.#reserve?.();\n\t\tif (this.#reserve && !release) {\n\t\t\tthis.#pendingRegistrations -= 1;\n\t\t\tthrow new Error(\"Cannot create file monitor: terminal capacity is already in use.\");\n\t\t}\n\t\tconst pending: PendingFileRegistration = {\n\t\t\trelease: release ?? undefined,\n\t\t\tabort: new AbortController(),\n\t\t\tdeadline: setTimeout(() => pending.abort.abort(), options.timeoutMs),\n\t\t\tsettled: false,\n\t\t};\n\t\tthis.#pending.add(pending);\n\t\tconst path = resolve(options.cwd, options.path);\n\t\tconst parent = dirname(path);\n\t\tlet approvedParent: string;\n\t\ttry {\n\t\t\tawait this.#registrationAwait(pending, access(parent));\n\t\t\t// Identity is derived without open(2), with the same walker the permission parser used, so the\n\t\t\t// two sides agree byte-for-byte and neither can block on a wedged mount.\n\t\t\tapprovedParent = realpathWithoutOpen(parent);\n\t\t\tconst approvedParentAtPermission = options.approvedParent;\n\t\t\tif (approvedParentAtPermission !== undefined && approvedParent !== approvedParentAtPermission) {\n\t\t\t\tthrow new Error(`Cannot watch file: parent directory changed during permission approval: ${parent}`);\n\t\t\t}\n\t\t\tif (this.#disposed) throw new Error(\"Cannot create file monitor: monitor registry is disposed.\");\n\t\t} catch (error) {\n\t\t\tthis.#finishPending(pending);\n\t\t\tthis.#pendingRegistrations -= 1;\n\t\t\tif (error instanceof Error && error.message.includes(\"disposed\")) throw error;\n\t\t\tif ((error as NodeJS.ErrnoException)?.code !== \"ENOENT\") {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Cannot access parent directory ${parent}: ${error instanceof Error ? error.message : String(error)}`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tthrow new Error(`Cannot watch file: parent directory does not exist: ${parent}`);\n\t\t}\n\t\tlet initial: Awaited<ReturnType<typeof stat>> | null = null;\n\t\tlet initialHandle: FileHandle | undefined;\n\t\ttry {\n\t\t\tconst target = await this.#registrationAwait(pending, lstat(path));\n\t\t\tif (target.isSymbolicLink()) throw new Error(`Cannot watch file: target is a symbolic link: ${path}`);\n\t\t\tinitialHandle = await this.#registrationAwait(pending, open(path, \"r\"), async (handle) => {\n\t\t\t\tawait handle.close();\n\t\t\t});\n\t\t\tinitial = await this.#registrationAwait(pending, initialHandle.stat());\n\t\t\tif (!initial.isFile()) throw new Error(`Cannot watch file: target is not a regular file: ${path}`);\n\t\t\tconst resolvedTarget = realpathWithoutOpen(path);\n\t\t\tif (resolvedTarget !== join(approvedParent, basename(path)))\n\t\t\t\tthrow new Error(`Cannot watch file: target identity changed: ${path}`);\n\t\t\tconst rebound = await this.#registrationAwait(pending, lstat(path));\n\t\t\tif (rebound.isSymbolicLink()) throw new Error(`Cannot watch file: target identity changed: ${path}`);\n\t\t\tconst reboundStat = await this.#registrationAwait(pending, stat(path));\n\t\t\tif (!reboundStat.isFile() || reboundStat.dev !== initial.dev || reboundStat.ino !== initial.ino)\n\t\t\t\tthrow new Error(`Cannot watch file: target identity changed: ${path}`);\n\t\t} catch (error) {\n\t\t\tawait initialHandle?.close();\n\t\t\tinitialHandle = undefined;\n\t\t\tif ((error as NodeJS.ErrnoException)?.code !== \"ENOENT\") {\n\t\t\t\tthis.#finishPending(pending);\n\t\t\t\tthis.#pendingRegistrations -= 1;\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t}\n\t\tif (this.#disposed || lifecycle !== this.#lifecycle || this.#pendingRegistrations < 1) {\n\t\t\tthis.#finishPending(pending);\n\t\t\tthis.#pendingRegistrations -= 1;\n\t\t\tthrow new Error(\"Cannot create file monitor: monitor registry is disposed.\");\n\t\t}\n\t\tconst id = `watch_${this.#nextFileId++}`;\n\t\tlet watcher: FSWatcher;\n\t\ttry {\n\t\t\tconst activationParent = realpathWithoutOpen(parent);\n\t\t\tif (activationParent !== approvedParent) {\n\t\t\t\tthrow new Error(`Cannot watch file: parent directory changed during registration: ${parent}`);\n\t\t\t}\n\t\t\t// watch() opens the directory synchronously on this thread; prove the open completes on the\n\t\t\t// async pool first so a wedged mount fails at the registration deadline instead of freezing.\n\t\t\tawait this.#registrationAwait(pending, probeDirectoryOpenable(activationParent));\n\t\t\twatcher = watch(canonicalWatchPath(activationParent), (_kind, name) => {\n\t\t\t\tif (!name || basename(String(name)) === basename(path)) void this.#checkFile(id);\n\t\t\t});\n\t\t} catch (error) {\n\t\t\tthis.#finishPending(pending);\n\t\t\tthis.#pendingRegistrations -= 1;\n\t\t\tthrow new Error(`Cannot watch file ${path}: ${error instanceof Error ? error.message : String(error)}`);\n\t\t}\n\t\tlet registrationError: string | undefined;\n\t\twatcher.on(\"error\", (error) => {\n\t\t\tregistrationError = `watcher error: ${error instanceof Error ? error.message : String(error)}`;\n\t\t\tconst record = this.#files.get(id);\n\t\t\tif (record) this.#settleFile(record, registrationError);\n\t\t});\n\t\tlet registrationCleaned = false;\n\t\tconst finishRegistration = () => {\n\t\t\tif (registrationCleaned) return;\n\t\t\tregistrationCleaned = true;\n\t\t\tthis.#pendingRegistrations -= 1;\n\t\t};\n\t\tconst cleanupRegistration = () => {\n\t\t\tif (registrationCleaned) return;\n\t\t\twatcher.close();\n\t\t\tfinishRegistration();\n\t\t\tthis.#finishPending(pending);\n\t\t};\n\t\tif (this.#disposed || lifecycle !== this.#lifecycle) {\n\t\t\tcleanupRegistration();\n\t\t\tthrow new Error(\"Cannot create file monitor: monitor registry is disposed.\");\n\t\t}\n\t\tconst canonicalPath = join(approvedParent, basename(path));\n\t\tlet digest: string;\n\t\ttry {\n\t\t\tdigest =\n\t\t\t\tinitial && initialHandle\n\t\t\t\t\t? await this.#registrationAwait(pending, this.#digestHandle(initialHandle, pending.abort.signal))\n\t\t\t\t\t: \"\";\n\t\t} catch (error) {\n\t\t\tcleanupRegistration();\n\t\t\tawait initialHandle?.close();\n\t\t\tinitialHandle = undefined;\n\t\t\tif (registrationError) {\n\t\t\t\tthis.#emit({ type: \"summary\", id, description: options.description, summary: registrationError });\n\t\t\t\tthrow new Error(registrationError);\n\t\t\t}\n\t\t\tthrow error;\n\t\t}\n\t\tawait initialHandle?.close();\n\t\tinitialHandle = undefined;\n\t\tif (registrationError) {\n\t\t\tcleanupRegistration();\n\t\t\tthis.#emit({ type: \"summary\", id, description: options.description, summary: registrationError });\n\t\t\tthrow new Error(registrationError);\n\t\t}\n\t\tif (this.#disposed || lifecycle !== this.#lifecycle) {\n\t\t\tcleanupRegistration();\n\t\t\tthrow new Error(\"Cannot create file monitor: monitor registry is disposed.\");\n\t\t}\n\t\tconst record: FileMonitorRecord = {\n\t\t\tid,\n\t\t\tmonitorId: options.monitorId ?? allocateMonitorId(),\n\t\t\tsessionId: id,\n\t\t\tdescription: options.description,\n\t\t\tstartedAtMs: Date.now(),\n\t\t\tcommand: null,\n\t\t\tfilter: null,\n\t\t\tpersistent: options.persistent ?? options.expiresAt !== undefined,\n\t\t\tdeadlineMs:\n\t\t\t\t(options.persistent ?? options.expiresAt !== undefined)\n\t\t\t\t\t? null\n\t\t\t\t\t: (options.deadlineMs ?? Date.now() + options.timeoutMs),\n\t\t\tfireCount: 0,\n\t\t\tlastFiredAtMs: null,\n\t\t\texpiresAt: options.expiresAt,\n\t\t\tpath,\n\t\t\tcanonicalPath,\n\t\t\tcanonicalParent: approvedParent,\n\t\t\tevent: options.event,\n\t\t\twatcher,\n\t\t\trelease: release ?? (() => {}),\n\t\t\tpoll: setInterval(() => void this.#checkFile(id), 250),\n\t\t\tpaused: false,\n\t\t\tsettled: false,\n\t\t\tpresent: initial !== null,\n\t\t\tmtimeMs: initial?.mtimeMs ?? 0,\n\t\t\tsize: initial?.size ?? 0,\n\t\t\tdigest,\n\t\t\tdevice: initial?.dev ?? 0,\n\t\t\tinode: initial?.ino ?? 0,\n\t\t\tpendingChange: false,\n\t\t\tdirty: false,\n\t\t\tdirtyPasses: 0,\n\t\t\tdirtyWindowStartedAt: 0,\n\t\t\tchecking: undefined,\n\t\t\tdeadline: setTimeout(() => {\n\t\t\t\tconst current = this.#files.get(id);\n\t\t\t\tif (current) this.#settleFile(current, \"watcher timed_out\");\n\t\t\t}, options.timeoutMs),\n\t\t};\n\t\tthis.#files.set(id, record);\n\t\tfinishRegistration();\n\t\tthis.#finishPending(pending, true);\n\t\tif (registrationError || this.#disposed || lifecycle !== this.#lifecycle) {\n\t\t\tthis.#settleFile(record, registrationError ?? \"watcher killed\");\n\t\t\tthrow new Error(registrationError ?? \"Cannot create file monitor: monitor registry is disposed.\");\n\t\t}\n\t\tthis.#notifyChange();\n\t\treturn { id, monitorId: record.monitorId };\n\t}\n\n\t/** Live identity tuple of one file watch; undefined when the id is not a live file watch. */\n\tfileCheckpoint(id: string) {\n\t\tconst r = this.#files.get(id);\n\t\treturn (\n\t\t\tr && { dev: r.device, ino: r.inode, size: r.size, mtimeMs: r.mtimeMs, digest: r.digest, present: r.present }\n\t\t);\n\t}\n\n\t/** Emit one restored-watch line through the SAME sink a live watch uses (coalescing, wake budget). */\n\temitFileLine(id: string, line: string): boolean {\n\t\tconst record = this.#files.get(id);\n\t\tif (!record || record.settled) return false;\n\t\tthis.#emitForRecord(record, { type: \"line\", id: record.id, description: record.description, line });\n\t\treturn true;\n\t}\n\n\tasync stopFile(id: string): Promise<boolean> {\n\t\tconst record = this.#files.get(id);\n\t\tif (!record) return false;\n\t\tthis.#settleFile(record, \"watcher killed\");\n\t\treturn true;\n\t}\n\n\tasync stopAllFiles(): Promise<number> {\n\t\tthis.#lifecycle += 1;\n\t\tconst records = [...this.#files.values()];\n\t\tfor (const record of records) this.#settleFile(record, \"watcher killed\");\n\t\tfor (const pending of [...this.#pending]) this.#finishPending(pending);\n\t\treturn records.length;\n\t}\n\n\t#settleFile(record: FileMonitorRecord, summary: string): void {\n\t\tif (record.settled) return;\n\t\trecord.settled = true;\n\t\tclearInterval(record.poll);\n\t\tclearTimeout(record.deadline);\n\t\trecord.watcher.close();\n\t\trecord.release();\n\t\tthis.#files.delete(record.id);\n\t\tthis.#notifyChange();\n\t\tthis.#emitForRecord(record, { type: \"summary\", id: record.id, description: record.description, summary });\n\t\tconst reason =\n\t\t\tsummary === \"watcher timed_out\"\n\t\t\t\t? \"timeout\"\n\t\t\t\t: summary === \"watcher killed\"\n\t\t\t\t\t? \"killed\"\n\t\t\t\t\t: summary === \"watcher disposed\"\n\t\t\t\t\t\t? \"disposed\"\n\t\t\t\t\t\t: \"exit\";\n\t\tthis.#emitEnded(record, reason, null);\n\t}\n\n\tasync #checkFile(id: string): Promise<void> {\n\t\tconst record = this.#files.get(id);\n\t\tif (!record || record.settled) return;\n\t\tif (record.checking) {\n\t\t\trecord.dirty = true;\n\t\t\treturn;\n\t\t}\n\t\trecord.checking = this.#checkFileImpl(record)\n\t\t\t.catch((error) => {\n\t\t\t\tif (!record.settled)\n\t\t\t\t\tthis.#settleFile(record, `watcher error: ${error instanceof Error ? error.message : String(error)}`);\n\t\t\t})\n\t\t\t.finally(() => {\n\t\t\t\trecord.checking = undefined;\n\t\t\t\tconst now = Date.now();\n\t\t\t\tif (now - record.dirtyWindowStartedAt >= 1_000) {\n\t\t\t\t\trecord.dirtyWindowStartedAt = now;\n\t\t\t\t\trecord.dirtyPasses = 0;\n\t\t\t\t}\n\t\t\t\tif (record.dirty && !record.settled && record.dirtyPasses < 1) {\n\t\t\t\t\trecord.dirty = false;\n\t\t\t\t\trecord.dirtyPasses += 1;\n\t\t\t\t\tvoid this.#checkFile(id);\n\t\t\t\t} else {\n\t\t\t\t\trecord.dirty = false;\n\t\t\t\t}\n\t\t\t});\n\t\treturn record.checking;\n\t}\n\n\tasync #checkFileImpl(record: FileMonitorRecord): Promise<void> {\n\t\tif (record.settled) return;\n\t\tlet current: Awaited<ReturnType<typeof stat>> | null = null;\n\t\tlet handle: FileHandle | undefined;\n\t\ttry {\n\t\t\tconst currentParent = realpathWithoutOpen(dirname(record.path));\n\t\t\tif (currentParent !== record.canonicalParent) {\n\t\t\t\tthis.#settleFile(record, `watcher error: monitored parent changed: ${dirname(record.path)}`);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst target = await lstat(record.canonicalPath);\n\t\t\tif (target.isSymbolicLink()) throw new Error(`Cannot watch file: target identity changed: ${record.path}`);\n\t\t\tconst resolvedTarget = realpathWithoutOpen(record.canonicalPath);\n\t\t\tif (resolvedTarget !== record.canonicalPath)\n\t\t\t\tthrow new Error(`Cannot watch file: target identity changed: ${record.path}`);\n\t\t\thandle = await open(record.canonicalPath, \"r\");\n\t\t\tconst opened = await handle.stat();\n\t\t\tif (!opened.isFile()) throw new Error(`Cannot watch file: target is not a regular file: ${record.path}`);\n\t\t\tif ((opened.dev !== record.device || opened.ino !== record.inode) && opened.nlink > 1)\n\t\t\t\tthrow new Error(`Cannot watch file: target identity changed: ${record.path}`);\n\t\t\tcurrent = opened;\n\t\t\tconst rebound = await lstat(record.canonicalPath);\n\t\t\tif (rebound.isSymbolicLink()) throw new Error(`Cannot watch file: target identity changed: ${record.path}`);\n\t\t\tconst reboundPath = await stat(record.canonicalPath);\n\t\t\tif (!reboundPath.isFile() || reboundPath.dev !== opened.dev || reboundPath.ino !== opened.ino)\n\t\t\t\tthrow new Error(`Cannot watch file: target identity changed: ${record.path}`);\n\t\t} catch (error) {\n\t\t\tawait handle?.close();\n\t\t\tif ((error as NodeJS.ErrnoException)?.code !== \"ENOENT\") {\n\t\t\t\tthis.#settleFile(record, `watcher error: ${error instanceof Error ? error.message : String(error)}`);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\tconst present = current !== null;\n\t\tlet digest = \"\";\n\t\ttry {\n\t\t\tdigest = present && handle ? await this.#digestHandle(handle) : \"\";\n\t\t\tif (present && handle) {\n\t\t\t\tconst afterDigest = await stat(record.canonicalPath);\n\t\t\t\tconst opened = await handle.stat();\n\t\t\t\tif (afterDigest.dev !== opened.dev || afterDigest.ino !== opened.ino)\n\t\t\t\t\tthrow new Error(`Cannot watch file: target identity changed: ${record.path}`);\n\t\t\t}\n\t\t} finally {\n\t\t\tawait handle?.close();\n\t\t}\n\t\tconst changed =\n\t\t\trecord.event === \"create\"\n\t\t\t\t? !record.present && present\n\t\t\t\t: record.present &&\n\t\t\t\t\tpresent &&\n\t\t\t\t\t(current!.mtimeMs !== record.mtimeMs || current!.size !== record.size || digest !== record.digest);\n\t\trecord.pendingChange ||= changed;\n\t\tif (!record.present && current) {\n\t\t\trecord.device = current.dev;\n\t\t\trecord.inode = current.ino;\n\t\t}\n\t\trecord.present = present;\n\t\trecord.mtimeMs = current?.mtimeMs ?? 0;\n\t\trecord.size = current?.size ?? 0;\n\t\trecord.digest = digest;\n\t\tif (!record.pendingChange || record.paused || record.settled) return;\n\t\trecord.pendingChange = false;\n\t\tif (record.settled) return;\n\t\tthis.#emitForRecord(record, {\n\t\t\ttype: \"line\",\n\t\t\tid: record.id,\n\t\t\tdescription: record.description,\n\t\t\tline: `${record.event} ${record.path}`,\n\t\t});\n\t\tthis.#settleFile(record, \"watcher completed\");\n\t}\n\n\tregister(options: RegisterMonitorOptions): string {\n\t\tconst durable = options.durabilityClass !== undefined && options.durabilityClass !== \"ephemeral\";\n\t\tconst record: MonitorRecord = {\n\t\t\tid: options.id,\n\t\t\tmonitorId: options.monitorId ?? allocateMonitorId(),\n\t\t\tsessionId: options.id,\n\t\t\tdescription: options.description,\n\t\t\tstartedAtMs: Date.now(),\n\t\t\tcommand: options.command ?? null,\n\t\t\tpersistent: options.persistent ?? durable,\n\t\t\tdeadlineMs: (options.persistent ?? durable) ? null : (options.deadlineMs ?? null),\n\t\t\tfireCount: 0,\n\t\t\tlastFiredAtMs: null,\n\t\t\texpiresAt: options.expiresAt,\n\t\t\truntime: options.runtime,\n\t\t\tfilter: options.filter,\n\t\t\tlineBuffer: \"\",\n\t\t\tmutedDropped: 0,\n\t\t\tpaused: false,\n\t\t\tsettled: false,\n\t\t\tfireWindow: durable ? { ...(options.fireWindow ?? { startMs: Date.now(), count: 0 }) } : undefined,\n\t\t\tunsubscribeOutput: undefined,\n\t\t\tunsubscribeExit: undefined,\n\t\t};\n\t\tthis.#records.set(record.id, record);\n\t\tthis.#notifyChange();\n\n\t\t// Runtime output is already bounded. Read what was produced before monitor registration,\n\t\t// then subscribe synchronously so a fast watcher cannot lose its first line.\n\t\tthis.#consume(record, record.runtime.fullOutput());\n\t\trecord.unsubscribeOutput = record.runtime.onOutput((chunk) => this.#consume(record, chunk));\n\t\trecord.unsubscribeExit = record.runtime.session.onExit(() => this.#settle(record));\n\t\tif (record.runtime.exited) this.#settle(record);\n\t\treturn record.monitorId;\n\t}\n\n\tpause(ids: readonly string[]): string[] {\n\t\tconst paused: string[] = [];\n\t\tfor (const id of ids) {\n\t\t\tconst record = this.#records.get(id) ?? this.#files.get(id);\n\t\t\tif (!record || record.paused) continue;\n\t\t\trecord.paused = true;\n\t\t\tpaused.push(record.id);\n\t\t}\n\t\tif (paused.length > 0) this.#notifyChange();\n\t\treturn paused;\n\t}\n\n\tpauseAll(): string[] {\n\t\treturn this.pause([...this.#records.keys(), ...this.#files.keys()]);\n\t}\n\n\tresume(ids?: readonly string[]): MonitorResumeResult[] {\n\t\tconst candidates = ids ?? [...this.#records.keys(), ...this.#files.keys()];\n\t\tconst resumed: MonitorResumeResult[] = [];\n\t\tfor (const id of candidates) {\n\t\t\tconst record = this.#records.get(id) ?? this.#files.get(id);\n\t\t\tif (!record?.paused) continue;\n\t\t\trecord.paused = false;\n\t\t\tconst mutedDropped = \"mutedDropped\" in record ? record.mutedDropped : 0;\n\t\t\tif (\"mutedDropped\" in record) record.mutedDropped = 0;\n\t\t\t// A rearm (or any resume) restarts the rolling fire budget while keeping its window start.\n\t\t\tif (\"fireWindow\" in record && record.fireWindow !== undefined) record.fireWindow.count = 0;\n\t\t\tresumed.push({ id: record.id, mutedDropped });\n\t\t\tif (\"pendingChange\" in record && record.pendingChange) void this.#checkFile(record.id);\n\t\t}\n\t\tif (resumed.length > 0) this.#notifyChange();\n\t\treturn resumed;\n\t}\n\n\tmutedDropped(id: string): number {\n\t\treturn this.#records.get(id)?.mutedDropped ?? 0;\n\t}\n\n\trearm(id: string): MonitorRearmResult {\n\t\tconst record = this.#records.get(id) ?? this.#files.get(id);\n\t\tif (!record) return \"not_found\";\n\t\tif (!record.paused) return \"not_paused\";\n\t\tthis.resume([id]);\n\t\treturn \"rearmed\";\n\t}\n\n\t/** Re-bind a persisted fire window onto the record for a durable monitor id (a restore re-arms the budget). */\n\tadoptFireWindow(monitorId: string, fireWindow: MonitorFireWindow): boolean {\n\t\tfor (const record of this.#records.values()) {\n\t\t\tif (record.monitorId !== monitorId) continue;\n\t\t\trecord.fireWindow = { ...fireWindow };\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\n\tdispose(): void {\n\t\tthis.#disposed = true;\n\t\tthis.#lifecycle += 1;\n\t\tfor (const record of [...this.#records.values()]) this.#disposeRecord(record);\n\t\tfor (const record of this.#files.values()) this.#settleFile(record, \"watcher disposed\");\n\t\tfor (const pending of this.#pending) this.#finishPending(pending);\n\t\tthis.#records.clear();\n\t\tthis.#notifyChange();\n\t}\n\n\t#finishPending(pending: PendingFileRegistration, transfer = false): void {\n\t\tif (pending.settled) return;\n\t\tpending.settled = true;\n\t\tclearTimeout(pending.deadline);\n\t\tthis.#pending.delete(pending);\n\t\tif (transfer) pending.release = undefined;\n\t\telse {\n\t\t\tpending.abort.abort();\n\t\t\tpending.release?.();\n\t\t}\n\t}\n\n\tasync #registrationAwait<T>(\n\t\tpending: PendingFileRegistration,\n\t\toperation: Promise<T>,\n\t\tlateCleanup?: (value: T) => Promise<void>,\n\t): Promise<T> {\n\t\tif (pending.abort.signal.aborted) {\n\t\t\tvoid operation.then(\n\t\t\t\t(value) => lateCleanup?.(value),\n\t\t\t\t() => undefined,\n\t\t\t);\n\t\t\tthrow new Error(\"Cannot create file monitor: registration timed out or was disposed.\");\n\t\t}\n\t\tlet aborted = false;\n\t\tconst abort = new Promise<never>((_, reject) =>\n\t\t\tpending.abort.signal.addEventListener(\n\t\t\t\t\"abort\",\n\t\t\t\t() => {\n\t\t\t\t\taborted = true;\n\t\t\t\t\treject(new Error(\"Cannot create file monitor: registration timed out or was disposed.\"));\n\t\t\t\t},\n\t\t\t\t{ once: true },\n\t\t\t),\n\t\t);\n\t\tconst guarded = operation.then(\n\t\t\t(value) => {\n\t\t\t\tif (aborted) void lateCleanup?.(value);\n\t\t\t\treturn value;\n\t\t\t},\n\t\t\t(error) => {\n\t\t\t\tif (aborted) return undefined as T;\n\t\t\t\tthrow error;\n\t\t\t},\n\t\t);\n\t\treturn Promise.race([guarded, abort]);\n\t}\n\n\tasync #digestHandle(handle: FileHandle, signal?: AbortSignal): Promise<string> {\n\t\tconst SAMPLE_SIZE = 64 * 1024;\n\t\tif (signal?.aborted) throw new Error(\"file monitor registration cancelled\");\n\t\tconst metadata = await handle.stat();\n\t\tconst hash = createHash(\"sha256\");\n\t\tconst first = Buffer.alloc(Math.min(SAMPLE_SIZE, metadata.size));\n\t\tif (first.length > 0) {\n\t\t\tawait handle.read(first, 0, first.length, 0);\n\t\t\thash.update(first);\n\t\t}\n\t\tif (metadata.size > SAMPLE_SIZE) {\n\t\t\tconst middle = Buffer.alloc(SAMPLE_SIZE);\n\t\t\tawait handle.read(middle, 0, middle.length, Math.floor((metadata.size - middle.length) / 2));\n\t\t\thash.update(middle);\n\t\t\tconst last = Buffer.alloc(SAMPLE_SIZE);\n\t\t\tawait handle.read(last, 0, last.length, metadata.size - last.length);\n\t\t\thash.update(last);\n\t\t}\n\t\treturn `${metadata.size}:${hash.digest(\"hex\")}`;\n\t}\n\n\t#notifyChange(): void {\n\t\tthis.#onChange?.(this.snapshot());\n\t}\n\n\t#consume(record: MonitorRecord, chunk: string): void {\n\t\tif (record.settled || chunk.length === 0) return;\n\t\tlet remaining = record.lineBuffer + chunk;\n\t\tfor (;;) {\n\t\t\tconst newline = remaining.indexOf(\"\\n\");\n\t\t\tif (newline < 0) break;\n\t\t\tconst rawLine = remaining.slice(0, newline);\n\t\t\tremaining = remaining.slice(newline + 1);\n\t\t\tconst line = rawLine.endsWith(\"\\r\") ? rawLine.slice(0, -1) : rawLine;\n\t\t\tconst matchesFilter = !record.filter || record.filter.test(line);\n\t\t\tif (!matchesFilter) continue;\n\t\t\tif (record.paused) {\n\t\t\t\trecord.mutedDropped += 1;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tthis.#emitForRecord(record, { type: \"line\", id: record.id, description: record.description, line });\n\t\t\tif (record.fireWindow !== undefined) {\n\t\t\t\tconst now = Date.now();\n\t\t\t\tif (now - record.fireWindow.startMs >= FIRE_BUDGET_WINDOW_MS)\n\t\t\t\t\trecord.fireWindow = { startMs: now, count: 0 };\n\t\t\t\trecord.fireWindow.count += 1;\n\t\t\t\tif (record.fireWindow.count >= DEFAULT_DURABLE_MONITOR_FIRE_BUDGET) {\n\t\t\t\t\trecord.paused = true;\n\t\t\t\t\tthis.#emitForRecord(record, {\n\t\t\t\t\t\ttype: \"summary\",\n\t\t\t\t\t\tid: record.id,\n\t\t\t\t\t\tdescription: record.description,\n\t\t\t\t\t\tsummary: FIRE_BUDGET_AUTO_MUTE_SUMMARY,\n\t\t\t\t\t});\n\t\t\t\t\tthis.#notifyChange();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\trecord.lineBuffer = remaining;\n\t}\n\n\t#settle(record: MonitorRecord): void {\n\t\tif (record.settled) return;\n\t\trecord.settled = true;\n\t\trecord.unsubscribeOutput?.();\n\t\trecord.unsubscribeExit?.();\n\t\tthis.#records.delete(record.id);\n\t\tthis.#notifyChange();\n\t\tconst status = describeExit(record.runtime) ?? \"exited\";\n\t\tconst code = record.runtime.exitResult?.exitCode;\n\t\tconst codeText = code === null || code === undefined ? \"\" : ` (exit code ${code})`;\n\t\tthis.#emitForRecord(record, {\n\t\t\ttype: \"summary\",\n\t\t\tid: record.id,\n\t\t\tdescription: record.description,\n\t\t\tsummary: `watcher ${status}${codeText}`,\n\t\t});\n\t\tconst exit = record.runtime.exitResult;\n\t\tthis.#emitEnded(record, exit?.timedOut ? \"timeout\" : exit?.cancelled ? \"killed\" : \"exit\", code ?? null);\n\t}\n\n\t#disposeRecord(record: MonitorRecord): void {\n\t\tif (record.settled) return;\n\t\trecord.settled = true;\n\t\trecord.unsubscribeOutput?.();\n\t\trecord.unsubscribeExit?.();\n\t\tthis.#records.delete(record.id);\n\t\tthis.#emitEnded(record, \"disposed\", null);\n\t}\n\n\t#emitForRecord(record: MonitorRecord | FileMonitorRecord, event: MonitorEvent): void {\n\t\trecord.fireCount += 1;\n\t\trecord.lastFiredAtMs = Date.now();\n\t\tthis.#emit(event);\n\t\tif (!record.settled) this.#onFire?.(this.snapshot());\n\t}\n\n\t#emitEnded(record: MonitorRecord | FileMonitorRecord, reason: MonitorEndedReason, exitCode: number | null): void {\n\t\tthis.#onEnded?.({\n\t\t\tid: record.id,\n\t\t\tdescription: record.description,\n\t\t\tstartedAtMs: record.startedAtMs,\n\t\t\tendedAtMs: Date.now(),\n\t\t\treason,\n\t\t\texitCode,\n\t\t\tfireCount: record.fireCount,\n\t\t});\n\t}\n}\n"]}
@@ -10,6 +10,7 @@ export interface TerminalNotifierDeps {
10
10
  customType: string;
11
11
  content: string;
12
12
  display: boolean;
13
+ details?: unknown;
13
14
  }, options: {
14
15
  triggerTurn: boolean;
15
16
  deliverAs: "steer" | "followUp";
@@ -22,6 +23,7 @@ export declare const NOTICE_TAIL_MAX_CHARS = 2000;
22
23
  export interface TerminalNotificationDelivery {
23
24
  readonly send: (content: string, options?: {
24
25
  readonly forceWake?: boolean;
26
+ readonly details?: unknown;
25
27
  }) => void;
26
28
  }
27
29
  /** Shared terminal-notification guard and notify-mode mapping. */
@@ -1 +1 @@
1
- {"version":3,"file":"notify.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/terminal/notify.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAEvD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AACnE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAGhD,uEAAuE;AACvE,eAAO,MAAM,qBAAqB,aAA6B,CAAC;AAChE,eAAO,MAAM,iCAAiC,gCAAgC,CAAC;AAE/E,MAAM,WAAW,oBAAoB;IACpC,mFAAmF;IACnF,QAAQ,CAAC,WAAW,EAAE,CACrB,OAAO,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE,EAClE,OAAO,EAAE;QAAE,WAAW,EAAE,OAAO,CAAC;QAAC,SAAS,EAAE,OAAO,GAAG,UAAU,CAAA;KAAE,KAC9D,IAAI,CAAC;IACV,QAAQ,CAAC,UAAU,EAAE,MAAM,gBAAgB,GAAG,SAAS,CAAC;IACxD,QAAQ,CAAC,OAAO,EAAE,MAAM,UAAU,CAAC;CACnC;AAED,iFAAiF;AACjF,eAAO,MAAM,qBAAqB,OAAO,CAAC;AAE1C,MAAM,WAAW,4BAA4B;IAC5C,QAAQ,CAAC,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE,KAAK,IAAI,CAAC;CACrF;AAED,kEAAkE;AAClE,wBAAgB,+BAA+B,CAC9C,IAAI,EAAE,oBAAoB,EAC1B,UAAU,SAAoC,GAC5C,4BAA4B,GAAG,SAAS,CAe1C;AAmBD;;;;;;GAMG;AACH,qBAAa,gBAAgB;IAC5B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAqB;IAC9C,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAuB;gBAEhC,IAAI,EAAE,oBAAoB;IAItC,gBAAgB,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,sBAAsB,GAAG,IAAI;CAQnE"}
1
+ {"version":3,"file":"notify.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/terminal/notify.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAEvD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AACnE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAGhD,uEAAuE;AACvE,eAAO,MAAM,qBAAqB,aAA6B,CAAC;AAChE,eAAO,MAAM,iCAAiC,gCAAgC,CAAC;AAE/E,MAAM,WAAW,oBAAoB;IACpC,mFAAmF;IACnF,QAAQ,CAAC,WAAW,EAAE,CACrB,OAAO,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE,EACrF,OAAO,EAAE;QAAE,WAAW,EAAE,OAAO,CAAC;QAAC,SAAS,EAAE,OAAO,GAAG,UAAU,CAAA;KAAE,KAC9D,IAAI,CAAC;IACV,QAAQ,CAAC,UAAU,EAAE,MAAM,gBAAgB,GAAG,SAAS,CAAC;IACxD,QAAQ,CAAC,OAAO,EAAE,MAAM,UAAU,CAAC;CACnC;AAED,iFAAiF;AACjF,eAAO,MAAM,qBAAqB,OAAO,CAAC;AAE1C,MAAM,WAAW,4BAA4B;IAC5C,QAAQ,CAAC,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC;QAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE,KAAK,IAAI,CAAC;CACjH;AAED,kEAAkE;AAClE,wBAAgB,+BAA+B,CAC9C,IAAI,EAAE,oBAAoB,EAC1B,UAAU,SAAoC,GAC5C,4BAA4B,GAAG,SAAS,CAoB1C;AAmBD;;;;;;GAMG;AACH,qBAAa,gBAAgB;IAC5B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAqB;IAC9C,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAuB;gBAEhC,IAAI,EAAE,oBAAoB;IAItC,gBAAgB,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,sBAAsB,GAAG,IAAI;CAQnE"}
@@ -14,7 +14,12 @@ export function getTerminalNotificationDelivery(deps, customType = TERMINAL_NOTI
14
14
  if (!ctx || NON_INTERACTIVE_MODES.has(ctx.mode) || !ctx.model)
15
15
  return undefined;
16
16
  return {
17
- send: (content, options) => deps.sendMessage({ customType, content, display: false }, {
17
+ send: (content, options) => deps.sendMessage({
18
+ customType,
19
+ content,
20
+ display: false,
21
+ ...(options?.details === undefined ? {} : { details: options.details }),
22
+ }, {
18
23
  triggerTurn: true,
19
24
  deliverAs: mode === "wake" || options?.forceWake === true ? "steer" : "followUp",
20
25
  }),
@@ -1 +1 @@
1
- {"version":3,"file":"notify.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/terminal/notify.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ExtensionContext } from \"../../types.ts\";\nimport { sanitizeTerminalOutput } from \"./output-format.ts\";\nimport type { TerminalRuntimeSession } from \"./runtime-session.ts\";\nimport type { NotifyMode } from \"./settings.ts\";\nimport { describeExit } from \"./tools/spawn.ts\";\n\n/** Modes that never wake the agent: one-shot, non-interactive runs. */\nexport const NON_INTERACTIVE_MODES = new Set([\"print\", \"json\"]);\nexport const TERMINAL_NOTIFICATION_CUSTOM_TYPE = \"senpi-terminal:notification\";\n\nexport interface TerminalNotifierDeps {\n\t/** Deliver a model-visible notification without rendering synthetic user input. */\n\treadonly sendMessage: (\n\t\tmessage: { customType: string; content: string; display: boolean },\n\t\toptions: { triggerTurn: boolean; deliverAs: \"steer\" | \"followUp\" },\n\t) => void;\n\treadonly getContext: () => ExtensionContext | undefined;\n\treadonly getMode: () => NotifyMode;\n}\n\n/** Max chars of sanitized final output embedded in a completion notification. */\nexport const NOTICE_TAIL_MAX_CHARS = 2000;\n\nexport interface TerminalNotificationDelivery {\n\treadonly send: (content: string, options?: { readonly forceWake?: boolean }) => void;\n}\n\n/** Shared terminal-notification guard and notify-mode mapping. */\nexport function getTerminalNotificationDelivery(\n\tdeps: TerminalNotifierDeps,\n\tcustomType = TERMINAL_NOTIFICATION_CUSTOM_TYPE,\n): TerminalNotificationDelivery | undefined {\n\tconst mode = deps.getMode();\n\tif (mode === \"off\") return undefined;\n\tconst ctx = deps.getContext();\n\tif (!ctx || NON_INTERACTIVE_MODES.has(ctx.mode) || !ctx.model) return undefined;\n\treturn {\n\t\tsend: (content, options) =>\n\t\t\tdeps.sendMessage(\n\t\t\t\t{ customType, content, display: false },\n\t\t\t\t{\n\t\t\t\t\ttriggerTurn: true,\n\t\t\t\t\tdeliverAs: mode === \"wake\" || options?.forceWake === true ? \"steer\" : \"followUp\",\n\t\t\t\t},\n\t\t\t),\n\t};\n}\n\nfunction buildNotice(id: string, runtime: TerminalRuntimeSession): string {\n\tconst status = describeExit(runtime) ?? \"exited\";\n\tconst code = runtime.exitResult?.exitCode;\n\tconst codeText = code === null || code === undefined ? \"\" : ` (exit code ${code})`;\n\tconst tail = sanitizeTerminalOutput(runtime.fullOutput()).trimEnd();\n\tlet tailSection = \"\";\n\tif (tail.length > 0) {\n\t\tconst truncated = tail.length > NOTICE_TAIL_MAX_CHARS;\n\t\tconst shown = truncated ? tail.slice(tail.length - NOTICE_TAIL_MAX_CHARS) : tail;\n\t\tconst note = truncated\n\t\t\t? `\\n[Final output truncated to the last ${NOTICE_TAIL_MAX_CHARS} chars; the full history is still peekable.]`\n\t\t\t: \"\";\n\t\ttailSection = `\\nFinal output:\\n${shown}${note}`;\n\t}\n\treturn `<system-reminder>Background terminal session ${id} finished: ${status}${codeText}.${tailSection}</system-reminder>`;\n}\n\n/**\n * Notifies an interactive agent once when a background session completes.\n *\n * Guards (todo 23): never wakes in one-shot `-p`/`--print`/`--mode json` runs; never wakes\n * without an active model (would spin an auth-less turn); `notify:\"off\"` suppresses entirely;\n * each session id fires at most once. `wake` steers immediately; `next-turn` queues a follow-up.\n */\nexport class TerminalNotifier {\n\tprivate readonly notified = new Set<string>();\n\tprivate readonly deps: TerminalNotifierDeps;\n\n\tconstructor(deps: TerminalNotifierDeps) {\n\t\tthis.deps = deps;\n\t}\n\n\tnotifyCompletion(id: string, runtime: TerminalRuntimeSession): void {\n\t\tif (this.notified.has(id)) return;\n\t\tconst delivery = getTerminalNotificationDelivery(this.deps);\n\t\tif (!delivery) return;\n\n\t\tthis.notified.add(id);\n\t\tdelivery.send(buildNotice(id, runtime));\n\t}\n}\n"]}
1
+ {"version":3,"file":"notify.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/terminal/notify.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ExtensionContext } from \"../../types.ts\";\nimport { sanitizeTerminalOutput } from \"./output-format.ts\";\nimport type { TerminalRuntimeSession } from \"./runtime-session.ts\";\nimport type { NotifyMode } from \"./settings.ts\";\nimport { describeExit } from \"./tools/spawn.ts\";\n\n/** Modes that never wake the agent: one-shot, non-interactive runs. */\nexport const NON_INTERACTIVE_MODES = new Set([\"print\", \"json\"]);\nexport const TERMINAL_NOTIFICATION_CUSTOM_TYPE = \"senpi-terminal:notification\";\n\nexport interface TerminalNotifierDeps {\n\t/** Deliver a model-visible notification without rendering synthetic user input. */\n\treadonly sendMessage: (\n\t\tmessage: { customType: string; content: string; display: boolean; details?: unknown },\n\t\toptions: { triggerTurn: boolean; deliverAs: \"steer\" | \"followUp\" },\n\t) => void;\n\treadonly getContext: () => ExtensionContext | undefined;\n\treadonly getMode: () => NotifyMode;\n}\n\n/** Max chars of sanitized final output embedded in a completion notification. */\nexport const NOTICE_TAIL_MAX_CHARS = 2000;\n\nexport interface TerminalNotificationDelivery {\n\treadonly send: (content: string, options?: { readonly forceWake?: boolean; readonly details?: unknown }) => void;\n}\n\n/** Shared terminal-notification guard and notify-mode mapping. */\nexport function getTerminalNotificationDelivery(\n\tdeps: TerminalNotifierDeps,\n\tcustomType = TERMINAL_NOTIFICATION_CUSTOM_TYPE,\n): TerminalNotificationDelivery | undefined {\n\tconst mode = deps.getMode();\n\tif (mode === \"off\") return undefined;\n\tconst ctx = deps.getContext();\n\tif (!ctx || NON_INTERACTIVE_MODES.has(ctx.mode) || !ctx.model) return undefined;\n\treturn {\n\t\tsend: (content, options) =>\n\t\t\tdeps.sendMessage(\n\t\t\t\t{\n\t\t\t\t\tcustomType,\n\t\t\t\t\tcontent,\n\t\t\t\t\tdisplay: false,\n\t\t\t\t\t...(options?.details === undefined ? {} : { details: options.details }),\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\ttriggerTurn: true,\n\t\t\t\t\tdeliverAs: mode === \"wake\" || options?.forceWake === true ? \"steer\" : \"followUp\",\n\t\t\t\t},\n\t\t\t),\n\t};\n}\n\nfunction buildNotice(id: string, runtime: TerminalRuntimeSession): string {\n\tconst status = describeExit(runtime) ?? \"exited\";\n\tconst code = runtime.exitResult?.exitCode;\n\tconst codeText = code === null || code === undefined ? \"\" : ` (exit code ${code})`;\n\tconst tail = sanitizeTerminalOutput(runtime.fullOutput()).trimEnd();\n\tlet tailSection = \"\";\n\tif (tail.length > 0) {\n\t\tconst truncated = tail.length > NOTICE_TAIL_MAX_CHARS;\n\t\tconst shown = truncated ? tail.slice(tail.length - NOTICE_TAIL_MAX_CHARS) : tail;\n\t\tconst note = truncated\n\t\t\t? `\\n[Final output truncated to the last ${NOTICE_TAIL_MAX_CHARS} chars; the full history is still peekable.]`\n\t\t\t: \"\";\n\t\ttailSection = `\\nFinal output:\\n${shown}${note}`;\n\t}\n\treturn `<system-reminder>Background terminal session ${id} finished: ${status}${codeText}.${tailSection}</system-reminder>`;\n}\n\n/**\n * Notifies an interactive agent once when a background session completes.\n *\n * Guards (todo 23): never wakes in one-shot `-p`/`--print`/`--mode json` runs; never wakes\n * without an active model (would spin an auth-less turn); `notify:\"off\"` suppresses entirely;\n * each session id fires at most once. `wake` steers immediately; `next-turn` queues a follow-up.\n */\nexport class TerminalNotifier {\n\tprivate readonly notified = new Set<string>();\n\tprivate readonly deps: TerminalNotifierDeps;\n\n\tconstructor(deps: TerminalNotifierDeps) {\n\t\tthis.deps = deps;\n\t}\n\n\tnotifyCompletion(id: string, runtime: TerminalRuntimeSession): void {\n\t\tif (this.notified.has(id)) return;\n\t\tconst delivery = getTerminalNotificationDelivery(this.deps);\n\t\tif (!delivery) return;\n\n\t\tthis.notified.add(id);\n\t\tdelivery.send(buildNotice(id, runtime));\n\t}\n}\n"]}
@@ -1,10 +1,12 @@
1
1
  import type { WakeSourceStateItem } from "../monitor-state-event.ts";
2
2
  import { TerminalManager, type TerminalManagerOptions } from "./manager.ts";
3
+ import type { MonitorEndedEvent } from "./monitor-registry.ts";
3
4
  import { type MonitorEvent, MonitorRegistry, type MonitorSnapshotEntry } from "./monitor-registry.ts";
4
5
  import type { TerminalRuntimeSession } from "./runtime-session.ts";
5
6
  export interface TerminalEventSinks {
6
7
  readonly onMonitorEvent: (event: MonitorEvent) => void;
7
- readonly onMonitorState: (snapshot: readonly MonitorSnapshotEntry[]) => void;
8
+ readonly onMonitorState: (snapshot: readonly MonitorSnapshotEntry[], transition?: boolean) => void;
9
+ readonly onMonitorEnded: (event: MonitorEndedEvent) => void;
8
10
  readonly onBackgroundState: (snapshot: readonly WakeSourceStateItem[]) => void;
9
11
  readonly onBackgroundExit: (id: string, runtime: TerminalRuntimeSession) => void;
10
12
  }
@@ -1 +1 @@
1
- {"version":3,"file":"session-bundle.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/terminal/session-bundle.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AACrE,OAAO,EAAE,eAAe,EAAE,KAAK,sBAAsB,EAAE,MAAM,cAAc,CAAC;AAC5E,OAAO,EAAE,KAAK,YAAY,EAAE,eAAe,EAAE,KAAK,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AACtG,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAEnE,MAAM,WAAW,kBAAkB;IAClC,QAAQ,CAAC,cAAc,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,CAAC;IACvD,QAAQ,CAAC,cAAc,EAAE,CAAC,QAAQ,EAAE,SAAS,oBAAoB,EAAE,KAAK,IAAI,CAAC;IAC7E,QAAQ,CAAC,iBAAiB,EAAE,CAAC,QAAQ,EAAE,SAAS,mBAAmB,EAAE,KAAK,IAAI,CAAC;IAC/E,QAAQ,CAAC,gBAAgB,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,sBAAsB,KAAK,IAAI,CAAC;CACjF;AAKD;;;;;;GAMG;AACH,qBAAa,qBAAqB;;IACjC,QAAQ,CAAC,OAAO,EAAE,eAAe,CAAC;IAClC,QAAQ,CAAC,QAAQ,EAAE,eAAe,CAAC;gBAOvB,OAAO,EAAE,sBAAsB;IAQ3C,gGAAgG;IAChG,IAAI,CAAC,KAAK,EAAE,kBAAkB,GAAG,IAAI;IAarC,IAAI,IAAI,IAAI;IAIZ,kBAAkB,IAAI,SAAS,mBAAmB,EAAE;IAIpD,qBAAqB,CAAC,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,WAAW,SAAa,GAAG,IAAI;IAMtF,oBAAoB,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,sBAAsB,GAAG,IAAI;IAWjE,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;CAuB/B;AAID,kGAAkG;AAClG,wBAAsB,UAAU,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC,CAIjG;AAED,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,qBAAqB,GAAG,SAAS,CAIvF;AAED,wBAAsB,oBAAoB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAI5E"}
1
+ {"version":3,"file":"session-bundle.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/terminal/session-bundle.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AACrE,OAAO,EAAE,eAAe,EAAE,KAAK,sBAAsB,EAAE,MAAM,cAAc,CAAC;AAC5E,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EAAE,KAAK,YAAY,EAAE,eAAe,EAAE,KAAK,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AACtG,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAEnE,MAAM,WAAW,kBAAkB;IAClC,QAAQ,CAAC,cAAc,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,CAAC;IACvD,QAAQ,CAAC,cAAc,EAAE,CAAC,QAAQ,EAAE,SAAS,oBAAoB,EAAE,EAAE,UAAU,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;IACnG,QAAQ,CAAC,cAAc,EAAE,CAAC,KAAK,EAAE,iBAAiB,KAAK,IAAI,CAAC;IAC5D,QAAQ,CAAC,iBAAiB,EAAE,CAAC,QAAQ,EAAE,SAAS,mBAAmB,EAAE,KAAK,IAAI,CAAC;IAC/E,QAAQ,CAAC,gBAAgB,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,sBAAsB,KAAK,IAAI,CAAC;CACjF;AAKD;;;;;;GAMG;AACH,qBAAa,qBAAqB;;IACjC,QAAQ,CAAC,OAAO,EAAE,eAAe,CAAC;IAClC,QAAQ,CAAC,QAAQ,EAAE,eAAe,CAAC;gBAQvB,OAAO,EAAE,sBAAsB;IAa3C,gGAAgG;IAChG,IAAI,CAAC,KAAK,EAAE,kBAAkB,GAAG,IAAI;IAgBrC,IAAI,IAAI,IAAI;IAIZ,kBAAkB,IAAI,SAAS,mBAAmB,EAAE;IAIpD,qBAAqB,CAAC,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,WAAW,SAAa,GAAG,IAAI;IAMtF,oBAAoB,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,sBAAsB,GAAG,IAAI;IAWjE,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;CAwB/B;AAID,kGAAkG;AAClG,wBAAsB,UAAU,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC,CAIjG;AAED,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,qBAAqB,GAAG,SAAS,CAIvF;AAED,wBAAsB,oBAAoB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAI5E"}