@code-yeongyu/senpi 2026.8.29 → 2026.8.30-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 (311) hide show
  1. package/CHANGELOG.md +122 -0
  2. package/dist/core/agent-session.d.ts +45 -1
  3. package/dist/core/agent-session.d.ts.map +1 -1
  4. package/dist/core/agent-session.js +329 -29
  5. package/dist/core/agent-session.js.map +1 -1
  6. package/dist/core/bash-executor.d.ts.map +1 -1
  7. package/dist/core/bash-executor.js +155 -37
  8. package/dist/core/bash-executor.js.map +1 -1
  9. package/dist/core/compaction/compaction-execution.d.ts +14 -0
  10. package/dist/core/compaction/compaction-execution.d.ts.map +1 -0
  11. package/dist/core/compaction/compaction-execution.js +121 -0
  12. package/dist/core/compaction/compaction-execution.js.map +1 -0
  13. package/dist/core/compaction/compaction-settings.d.ts +17 -0
  14. package/dist/core/compaction/compaction-settings.d.ts.map +1 -0
  15. package/dist/core/compaction/compaction-settings.js +17 -0
  16. package/dist/core/compaction/compaction-settings.js.map +1 -0
  17. package/dist/core/compaction/compaction.d.ts +13 -26
  18. package/dist/core/compaction/compaction.d.ts.map +1 -1
  19. package/dist/core/compaction/compaction.js +7 -136
  20. package/dist/core/compaction/compaction.js.map +1 -1
  21. package/dist/core/compaction/ideal-compaction-settings.d.ts +9 -0
  22. package/dist/core/compaction/ideal-compaction-settings.d.ts.map +1 -0
  23. package/dist/core/compaction/ideal-compaction-settings.js +7 -0
  24. package/dist/core/compaction/ideal-compaction-settings.js.map +1 -0
  25. package/dist/core/compaction-settings-access.d.ts +19 -0
  26. package/dist/core/compaction-settings-access.d.ts.map +1 -0
  27. package/dist/core/compaction-settings-access.js +10 -0
  28. package/dist/core/compaction-settings-access.js.map +1 -0
  29. package/dist/core/compaction-settings-resolver.d.ts +22 -0
  30. package/dist/core/compaction-settings-resolver.d.ts.map +1 -0
  31. package/dist/core/compaction-settings-resolver.js +46 -0
  32. package/dist/core/compaction-settings-resolver.js.map +1 -0
  33. package/dist/core/credential-accounts.d.ts.map +1 -1
  34. package/dist/core/credential-accounts.js +23 -9
  35. package/dist/core/credential-accounts.js.map +1 -1
  36. package/dist/core/credential-pool/env-slots.d.ts.map +1 -1
  37. package/dist/core/credential-pool/env-slots.js +2 -0
  38. package/dist/core/credential-pool/env-slots.js.map +1 -1
  39. package/dist/core/extensions/builtin/compaction/context-pipeline.d.ts +17 -0
  40. package/dist/core/extensions/builtin/compaction/context-pipeline.d.ts.map +1 -0
  41. package/dist/core/extensions/builtin/compaction/context-pipeline.js +28 -0
  42. package/dist/core/extensions/builtin/compaction/context-pipeline.js.map +1 -0
  43. package/dist/core/extensions/builtin/compaction/deterministic-fallback.d.ts +8 -2
  44. package/dist/core/extensions/builtin/compaction/deterministic-fallback.d.ts.map +1 -1
  45. package/dist/core/extensions/builtin/compaction/deterministic-fallback.js +163 -48
  46. package/dist/core/extensions/builtin/compaction/deterministic-fallback.js.map +1 -1
  47. package/dist/core/extensions/builtin/compaction/emergency-prune.d.ts +17 -0
  48. package/dist/core/extensions/builtin/compaction/emergency-prune.d.ts.map +1 -0
  49. package/dist/core/extensions/builtin/compaction/emergency-prune.js +64 -0
  50. package/dist/core/extensions/builtin/compaction/emergency-prune.js.map +1 -0
  51. package/dist/core/extensions/builtin/compaction/extension-wiring.d.ts +27 -0
  52. package/dist/core/extensions/builtin/compaction/extension-wiring.d.ts.map +1 -0
  53. package/dist/core/extensions/builtin/compaction/extension-wiring.js +84 -0
  54. package/dist/core/extensions/builtin/compaction/extension-wiring.js.map +1 -0
  55. package/dist/core/extensions/builtin/compaction/idle.d.ts +1 -0
  56. package/dist/core/extensions/builtin/compaction/idle.d.ts.map +1 -1
  57. package/dist/core/extensions/builtin/compaction/idle.js +13 -2
  58. package/dist/core/extensions/builtin/compaction/idle.js.map +1 -1
  59. package/dist/core/extensions/builtin/compaction/index.d.ts +1 -1
  60. package/dist/core/extensions/builtin/compaction/index.d.ts.map +1 -1
  61. package/dist/core/extensions/builtin/compaction/index.js +121 -147
  62. package/dist/core/extensions/builtin/compaction/index.js.map +1 -1
  63. package/dist/core/extensions/builtin/compaction/log.d.ts +1 -1
  64. package/dist/core/extensions/builtin/compaction/log.d.ts.map +1 -1
  65. package/dist/core/extensions/builtin/compaction/log.js +2 -0
  66. package/dist/core/extensions/builtin/compaction/log.js.map +1 -1
  67. package/dist/core/extensions/builtin/compaction/model-selection.d.ts +14 -0
  68. package/dist/core/extensions/builtin/compaction/model-selection.d.ts.map +1 -0
  69. package/dist/core/extensions/builtin/compaction/model-selection.js +37 -0
  70. package/dist/core/extensions/builtin/compaction/model-selection.js.map +1 -0
  71. package/dist/core/extensions/builtin/compaction/openai-remote-dependencies.d.ts +9 -0
  72. package/dist/core/extensions/builtin/compaction/openai-remote-dependencies.d.ts.map +1 -0
  73. package/dist/core/extensions/builtin/compaction/openai-remote-dependencies.js +2 -0
  74. package/dist/core/extensions/builtin/compaction/openai-remote-dependencies.js.map +1 -0
  75. package/dist/core/extensions/builtin/compaction/openai-remote.d.ts +3 -6
  76. package/dist/core/extensions/builtin/compaction/openai-remote.d.ts.map +1 -1
  77. package/dist/core/extensions/builtin/compaction/openai-remote.js.map +1 -1
  78. package/dist/core/extensions/builtin/compaction/orchestration.d.ts +56 -0
  79. package/dist/core/extensions/builtin/compaction/orchestration.d.ts.map +1 -0
  80. package/dist/core/extensions/builtin/compaction/orchestration.js +136 -0
  81. package/dist/core/extensions/builtin/compaction/orchestration.js.map +1 -0
  82. package/dist/core/extensions/builtin/compaction/policy.d.ts +5 -2
  83. package/dist/core/extensions/builtin/compaction/policy.d.ts.map +1 -1
  84. package/dist/core/extensions/builtin/compaction/policy.js +43 -26
  85. package/dist/core/extensions/builtin/compaction/policy.js.map +1 -1
  86. package/dist/core/extensions/builtin/compaction/retained-message-safety.d.ts.map +1 -1
  87. package/dist/core/extensions/builtin/compaction/retained-message-safety.js +31 -8
  88. package/dist/core/extensions/builtin/compaction/retained-message-safety.js.map +1 -1
  89. package/dist/core/extensions/builtin/compaction/speculation-lead.d.ts +8 -0
  90. package/dist/core/extensions/builtin/compaction/speculation-lead.d.ts.map +1 -0
  91. package/dist/core/extensions/builtin/compaction/speculation-lead.js +17 -0
  92. package/dist/core/extensions/builtin/compaction/speculation-lead.js.map +1 -0
  93. package/dist/core/extensions/builtin/compaction/speculative-job.d.ts +22 -0
  94. package/dist/core/extensions/builtin/compaction/speculative-job.d.ts.map +1 -0
  95. package/dist/core/extensions/builtin/compaction/speculative-job.js +16 -0
  96. package/dist/core/extensions/builtin/compaction/speculative-job.js.map +1 -0
  97. package/dist/core/extensions/builtin/compaction/speculative-summary.d.ts +22 -0
  98. package/dist/core/extensions/builtin/compaction/speculative-summary.d.ts.map +1 -0
  99. package/dist/core/extensions/builtin/compaction/speculative-summary.js +131 -0
  100. package/dist/core/extensions/builtin/compaction/speculative-summary.js.map +1 -0
  101. package/dist/core/extensions/builtin/compaction/speculative.d.ts +8 -13
  102. package/dist/core/extensions/builtin/compaction/speculative.d.ts.map +1 -1
  103. package/dist/core/extensions/builtin/compaction/speculative.js +7 -196
  104. package/dist/core/extensions/builtin/compaction/speculative.js.map +1 -1
  105. package/dist/core/extensions/builtin/compaction/token-budget-reminder.d.ts +18 -0
  106. package/dist/core/extensions/builtin/compaction/token-budget-reminder.d.ts.map +1 -0
  107. package/dist/core/extensions/builtin/compaction/token-budget-reminder.js +18 -0
  108. package/dist/core/extensions/builtin/compaction/token-budget-reminder.js.map +1 -0
  109. package/dist/core/extensions/builtin/compaction/tool-admission.d.ts +36 -0
  110. package/dist/core/extensions/builtin/compaction/tool-admission.d.ts.map +1 -0
  111. package/dist/core/extensions/builtin/compaction/tool-admission.js +92 -0
  112. package/dist/core/extensions/builtin/compaction/tool-admission.js.map +1 -0
  113. package/dist/core/extensions/builtin/cursor-cli-oauth/stream.d.ts.map +1 -1
  114. package/dist/core/extensions/builtin/cursor-cli-oauth/stream.js +8 -28
  115. package/dist/core/extensions/builtin/cursor-cli-oauth/stream.js.map +1 -1
  116. package/dist/core/extensions/builtin/permission-system/external-dir.d.ts.map +1 -1
  117. package/dist/core/extensions/builtin/permission-system/external-dir.js +15 -5
  118. package/dist/core/extensions/builtin/permission-system/external-dir.js.map +1 -1
  119. package/dist/core/extensions/builtin/permission-system/parsers.d.ts.map +1 -1
  120. package/dist/core/extensions/builtin/permission-system/parsers.js +16 -1
  121. package/dist/core/extensions/builtin/permission-system/parsers.js.map +1 -1
  122. package/dist/core/extensions/builtin/terminal/manager.d.ts +5 -0
  123. package/dist/core/extensions/builtin/terminal/manager.d.ts.map +1 -1
  124. package/dist/core/extensions/builtin/terminal/manager.js +31 -3
  125. package/dist/core/extensions/builtin/terminal/manager.js.map +1 -1
  126. package/dist/core/extensions/builtin/terminal/monitor-permission.d.ts +8 -0
  127. package/dist/core/extensions/builtin/terminal/monitor-permission.d.ts.map +1 -0
  128. package/dist/core/extensions/builtin/terminal/monitor-permission.js +16 -0
  129. package/dist/core/extensions/builtin/terminal/monitor-permission.js.map +1 -0
  130. package/dist/core/extensions/builtin/terminal/monitor-registry.d.ts +13 -0
  131. package/dist/core/extensions/builtin/terminal/monitor-registry.d.ts.map +1 -1
  132. package/dist/core/extensions/builtin/terminal/monitor-registry.js +403 -3
  133. package/dist/core/extensions/builtin/terminal/monitor-registry.js.map +1 -1
  134. package/dist/core/extensions/builtin/terminal/session-bundle.d.ts.map +1 -1
  135. package/dist/core/extensions/builtin/terminal/session-bundle.js +1 -0
  136. package/dist/core/extensions/builtin/terminal/session-bundle.js.map +1 -1
  137. package/dist/core/extensions/builtin/terminal/tools/kill-bash.d.ts.map +1 -1
  138. package/dist/core/extensions/builtin/terminal/tools/kill-bash.js +5 -2
  139. package/dist/core/extensions/builtin/terminal/tools/kill-bash.js.map +1 -1
  140. package/dist/core/extensions/builtin/terminal/tools/monitor.d.ts +4 -0
  141. package/dist/core/extensions/builtin/terminal/tools/monitor.d.ts.map +1 -1
  142. package/dist/core/extensions/builtin/terminal/tools/monitor.js +40 -2
  143. package/dist/core/extensions/builtin/terminal/tools/monitor.js.map +1 -1
  144. package/dist/core/model-resolver.js +2 -2
  145. package/dist/core/model-resolver.js.map +1 -1
  146. package/dist/core/session-manager.d.ts.map +1 -1
  147. package/dist/core/session-manager.js +10 -1
  148. package/dist/core/session-manager.js.map +1 -1
  149. package/dist/core/settings-manager.d.ts +15 -85
  150. package/dist/core/settings-manager.d.ts.map +1 -1
  151. package/dist/core/settings-manager.js +15 -17
  152. package/dist/core/settings-manager.js.map +1 -1
  153. package/dist/core/settings-public-types.d.ts +11 -0
  154. package/dist/core/settings-public-types.d.ts.map +1 -0
  155. package/dist/core/settings-public-types.js +2 -0
  156. package/dist/core/settings-public-types.js.map +1 -0
  157. package/dist/core/settings-shapes.d.ts +36 -0
  158. package/dist/core/settings-shapes.d.ts.map +1 -0
  159. package/dist/core/settings-shapes.js +2 -0
  160. package/dist/core/settings-shapes.js.map +1 -0
  161. package/dist/core/shared-host-policy.d.ts +6 -0
  162. package/dist/core/shared-host-policy.d.ts.map +1 -0
  163. package/dist/core/shared-host-policy.js +7 -0
  164. package/dist/core/shared-host-policy.js.map +1 -0
  165. package/dist/core/terminal-settings.d.ts +22 -0
  166. package/dist/core/terminal-settings.d.ts.map +1 -0
  167. package/dist/core/terminal-settings.js +2 -0
  168. package/dist/core/terminal-settings.js.map +1 -0
  169. package/dist/core/tools/bash.d.ts.map +1 -1
  170. package/dist/core/tools/bash.js +97 -15
  171. package/dist/core/tools/bash.js.map +1 -1
  172. package/dist/core/tools/index.d.ts +1 -0
  173. package/dist/core/tools/index.d.ts.map +1 -1
  174. package/dist/core/tools/index.js +8 -0
  175. package/dist/core/tools/index.js.map +1 -1
  176. package/dist/core/tools/output-accumulator.d.ts +1 -1
  177. package/dist/core/tools/output-accumulator.d.ts.map +1 -1
  178. package/dist/core/tools/output-accumulator.js +76 -34
  179. package/dist/core/tools/output-accumulator.js.map +1 -1
  180. package/dist/main.d.ts.map +1 -1
  181. package/dist/main.js +17 -5
  182. package/dist/main.js.map +1 -1
  183. package/dist/modes/interactive/components/footer.d.ts +7 -0
  184. package/dist/modes/interactive/components/footer.d.ts.map +1 -1
  185. package/dist/modes/interactive/components/footer.js +34 -8
  186. package/dist/modes/interactive/components/footer.js.map +1 -1
  187. package/dist/modes/interactive/grok/chrome.d.ts +2 -0
  188. package/dist/modes/interactive/grok/chrome.d.ts.map +1 -1
  189. package/dist/modes/interactive/grok/chrome.js.map +1 -1
  190. package/dist/modes/interactive/interactive-host-runtime.d.ts +121 -1
  191. package/dist/modes/interactive/interactive-host-runtime.d.ts.map +1 -1
  192. package/dist/modes/interactive/interactive-host-runtime.js +336 -65
  193. package/dist/modes/interactive/interactive-host-runtime.js.map +1 -1
  194. package/dist/modes/interactive/interactive-mode.d.ts +7 -0
  195. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  196. package/dist/modes/interactive/interactive-mode.js +114 -2
  197. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  198. package/dist/modes/rpc/connection-handler.d.ts +8 -1
  199. package/dist/modes/rpc/connection-handler.d.ts.map +1 -1
  200. package/dist/modes/rpc/connection-handler.js +145 -49
  201. package/dist/modes/rpc/connection-handler.js.map +1 -1
  202. package/dist/modes/rpc/host-ensure.d.ts +19 -0
  203. package/dist/modes/rpc/host-ensure.d.ts.map +1 -1
  204. package/dist/modes/rpc/host-ensure.js +79 -15
  205. package/dist/modes/rpc/host-ensure.js.map +1 -1
  206. package/dist/modes/rpc/host-lifecycle.d.ts +29 -0
  207. package/dist/modes/rpc/host-lifecycle.d.ts.map +1 -1
  208. package/dist/modes/rpc/host-lifecycle.js +96 -25
  209. package/dist/modes/rpc/host-lifecycle.js.map +1 -1
  210. package/dist/modes/rpc/host-watchdog.d.ts +2 -0
  211. package/dist/modes/rpc/host-watchdog.d.ts.map +1 -1
  212. package/dist/modes/rpc/host-watchdog.js +23 -12
  213. package/dist/modes/rpc/host-watchdog.js.map +1 -1
  214. package/dist/modes/rpc/multi-session-host.js +6 -4
  215. package/dist/modes/rpc/multi-session-host.js.map +1 -1
  216. package/dist/modes/rpc/rpc-client.d.ts +10 -4
  217. package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
  218. package/dist/modes/rpc/rpc-client.js +47 -10
  219. package/dist/modes/rpc/rpc-client.js.map +1 -1
  220. package/dist/modes/rpc/rpc-input-validation.d.ts +1 -0
  221. package/dist/modes/rpc/rpc-input-validation.d.ts.map +1 -1
  222. package/dist/modes/rpc/rpc-input-validation.js +66 -0
  223. package/dist/modes/rpc/rpc-input-validation.js.map +1 -1
  224. package/dist/modes/rpc/rpc-types.d.ts +86 -1
  225. package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
  226. package/dist/modes/rpc/rpc-types.js.map +1 -1
  227. package/dist/modes/rpc/session-binding.d.ts +1 -0
  228. package/dist/modes/rpc/session-binding.d.ts.map +1 -1
  229. package/dist/modes/rpc/session-binding.js +21 -1
  230. package/dist/modes/rpc/session-binding.js.map +1 -1
  231. package/dist/modes/rpc/session-command-router.d.ts.map +1 -1
  232. package/dist/modes/rpc/session-command-router.js +1 -0
  233. package/dist/modes/rpc/session-command-router.js.map +1 -1
  234. package/dist/modes/rpc/session-event-writer.d.ts +2 -0
  235. package/dist/modes/rpc/session-event-writer.d.ts.map +1 -1
  236. package/dist/modes/rpc/session-event-writer.js +54 -7
  237. package/dist/modes/rpc/session-event-writer.js.map +1 -1
  238. package/dist/modes/rpc/session-extension-ui-requests.d.ts +1 -0
  239. package/dist/modes/rpc/session-extension-ui-requests.d.ts.map +1 -1
  240. package/dist/modes/rpc/session-extension-ui-requests.js +5 -0
  241. package/dist/modes/rpc/session-extension-ui-requests.js.map +1 -1
  242. package/dist/modes/rpc/session-registry.d.ts +10 -2
  243. package/dist/modes/rpc/session-registry.d.ts.map +1 -1
  244. package/dist/modes/rpc/session-registry.js +58 -4
  245. package/dist/modes/rpc/session-registry.js.map +1 -1
  246. package/dist/modes/rpc/socket-event-fanout.d.ts +22 -0
  247. package/dist/modes/rpc/socket-event-fanout.d.ts.map +1 -0
  248. package/dist/modes/rpc/socket-event-fanout.js +84 -0
  249. package/dist/modes/rpc/socket-event-fanout.js.map +1 -0
  250. package/docs/rpc.md +18 -2
  251. package/docs/settings.md +34 -0
  252. package/docs/windows.md +2 -0
  253. package/node_modules/@code-yeongyu/senpi-codemode/CHANGELOG.md +50 -0
  254. package/node_modules/@code-yeongyu/senpi-codemode/package.json +4 -4
  255. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/worker-indirect-eval.js +139 -90
  256. package/node_modules/@code-yeongyu/senpi-codemode/src/prompt/eval-prompt.ts +4 -4
  257. package/node_modules/@earendil-works/pi-agent-core/dist/harness/env/nodejs.d.ts.map +1 -1
  258. package/node_modules/@earendil-works/pi-agent-core/dist/harness/env/nodejs.js +40 -20
  259. package/node_modules/@earendil-works/pi-agent-core/dist/harness/env/nodejs.js.map +1 -1
  260. package/node_modules/@earendil-works/pi-agent-core/dist/harness/types.d.ts +3 -3
  261. package/node_modules/@earendil-works/pi-agent-core/dist/harness/types.d.ts.map +1 -1
  262. package/node_modules/@earendil-works/pi-agent-core/dist/harness/types.js.map +1 -1
  263. package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/shell-output.d.ts +1 -1
  264. package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/shell-output.d.ts.map +1 -1
  265. package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/shell-output.js +28 -9
  266. package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/shell-output.js.map +1 -1
  267. package/node_modules/@earendil-works/pi-agent-core/package.json +3 -3
  268. package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.d.ts.map +1 -1
  269. package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.js +67 -38
  270. package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.js.map +1 -1
  271. package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent/measure.d.ts +20 -0
  272. package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent/measure.d.ts.map +1 -0
  273. package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent/measure.js +443 -0
  274. package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent/measure.js.map +1 -0
  275. package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent.d.ts +2 -0
  276. package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent.d.ts.map +1 -1
  277. package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent.js +2 -0
  278. package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent.js.map +1 -1
  279. package/node_modules/@earendil-works/pi-ai/dist/api/openai-completions.js +1 -1
  280. package/node_modules/@earendil-works/pi-ai/dist/api/openai-completions.js.map +1 -1
  281. package/node_modules/@earendil-works/pi-ai/dist/index.d.ts +1 -0
  282. package/node_modules/@earendil-works/pi-ai/dist/index.d.ts.map +1 -1
  283. package/node_modules/@earendil-works/pi-ai/dist/index.js +1 -0
  284. package/node_modules/@earendil-works/pi-ai/dist/index.js.map +1 -1
  285. package/node_modules/@earendil-works/pi-ai/dist/providers/data/.manifest.json +1 -1
  286. package/node_modules/@earendil-works/pi-ai/dist/providers/data/cloudflare-ai-gateway.json +1 -1
  287. package/node_modules/@earendil-works/pi-ai/dist/providers/data/cloudflare-workers-ai.json +1 -1
  288. package/node_modules/@earendil-works/pi-ai/dist/providers/data/fireworks.json +1 -1
  289. package/node_modules/@earendil-works/pi-ai/dist/providers/data/opencode-go.json +1 -1
  290. package/node_modules/@earendil-works/pi-ai/dist/providers/data/opencode.json +1 -1
  291. package/node_modules/@earendil-works/pi-ai/dist/providers/data/openrouter.json +1 -1
  292. package/node_modules/@earendil-works/pi-ai/dist/providers/data/together.json +1 -1
  293. package/node_modules/@earendil-works/pi-ai/dist/providers/data/zai-coding-cn.json +1 -1
  294. package/node_modules/@earendil-works/pi-ai/dist/providers/data/zai.json +1 -1
  295. package/node_modules/@earendil-works/pi-ai/package.json +2 -2
  296. package/node_modules/@earendil-works/pi-pty/package.json +1 -1
  297. package/node_modules/@earendil-works/pi-telemetry/package.json +1 -1
  298. package/node_modules/@earendil-works/pi-tui/dist/components/editor.d.ts +7 -0
  299. package/node_modules/@earendil-works/pi-tui/dist/components/editor.d.ts.map +1 -1
  300. package/node_modules/@earendil-works/pi-tui/dist/components/editor.js +5 -0
  301. package/node_modules/@earendil-works/pi-tui/dist/components/editor.js.map +1 -1
  302. package/node_modules/@earendil-works/pi-tui/dist/mux.d.ts +1 -1
  303. package/node_modules/@earendil-works/pi-tui/dist/mux.d.ts.map +1 -1
  304. package/node_modules/@earendil-works/pi-tui/dist/mux.js +2 -2
  305. package/node_modules/@earendil-works/pi-tui/dist/mux.js.map +1 -1
  306. package/node_modules/@earendil-works/pi-tui/dist/terminal.d.ts +1 -0
  307. package/node_modules/@earendil-works/pi-tui/dist/terminal.d.ts.map +1 -1
  308. package/node_modules/@earendil-works/pi-tui/dist/terminal.js +19 -0
  309. package/node_modules/@earendil-works/pi-tui/dist/terminal.js.map +1 -1
  310. package/node_modules/@earendil-works/pi-tui/package.json +1 -1
  311. package/package.json +7 -7
@@ -1 +1 @@
1
- {"version":3,"file":"parsers.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/permission-system/parsers.ts"],"names":[],"mappings":"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","sourcesContent":["import { extractPatchedPaths } from \"../gpt-apply-patch/index.ts\";\nimport { BashArity } from \"../permission-system/arity.ts\";\nimport { extractExternalPaths, isExternalPath } from \"../permission-system/external-dir.ts\";\nimport type { Request } from \"../permission-system/types.ts\";\n\n/** Simplified permission request without ID/session metadata */\nexport type PermissionRequest = Pick<Request, \"permission\" | \"patterns\" | \"always\">;\n\n/** Parser function that extracts permission requests from tool input */\nexport type ToolPermissionParser = (\n\ttoolName: string,\n\tinput: Record<string, unknown>,\n\tcwd: string,\n) => PermissionRequest[];\n\nfunction fallbackPermissionRequest(permission: string): PermissionRequest {\n\treturn {\n\t\tpermission,\n\t\tpatterns: [\"*\"],\n\t\talways: [\"*\"],\n\t};\n}\n\nfunction getString(input: Record<string, unknown>, ...keys: string[]): string | undefined {\n\tfor (const key of keys) {\n\t\tconst value = input[key];\n\t\tif (typeof value === \"string\") {\n\t\t\treturn value;\n\t\t}\n\t}\n\treturn undefined;\n}\n\ntype AlwaysScope = \"file\" | \"directory\";\n\nfunction toParentDirectoryPattern(inputPath: string, scope: AlwaysScope): string {\n\tif (inputPath === \"~\" || inputPath === \"$HOME\") {\n\t\treturn `${inputPath}/*`;\n\t}\n\n\tif (scope === \"directory\") {\n\t\treturn inputPath.endsWith(\"/\") || inputPath.endsWith(\"\\\\\") ? `${inputPath}*` : `${inputPath}/*`;\n\t}\n\n\tif (inputPath.endsWith(\"/\") || inputPath.endsWith(\"\\\\\")) {\n\t\treturn `${inputPath}*`;\n\t}\n\n\tconst parentPattern = inputPath.replace(/[\\\\/][^\\\\/]+$/, \"/*\");\n\tif (parentPattern === \"/*\") {\n\t\treturn inputPath;\n\t}\n\treturn parentPattern;\n}\n\nfunction parseFilePath(input: Record<string, unknown>): string | undefined {\n\treturn getString(input, \"path\", \"file_path\");\n}\n\nfunction withExternalDirectoryRequests(\n\trequests: PermissionRequest[],\n\tpaths: string[],\n\tcwd: string,\n\tscope: AlwaysScope,\n): PermissionRequest[] {\n\tconst externalPaths = paths.filter((inputPath) => isExternalPath(inputPath, cwd));\n\tif (externalPaths.length === 0) {\n\t\treturn requests;\n\t}\n\n\treturn [\n\t\t...requests,\n\t\t{\n\t\t\tpermission: \"external_directory\",\n\t\t\tpatterns: externalPaths,\n\t\t\talways: externalPaths.map((externalPath) => toParentDirectoryPattern(externalPath, scope)),\n\t\t},\n\t];\n}\n\n/** Registry for tool-specific permission parsers */\nexport class ParserRegistry {\n\tprivate readonly parsers = new Map<string, ToolPermissionParser>();\n\n\t/** Register a parser for a specific tool */\n\tregister(toolName: string, parser: ToolPermissionParser): void {\n\t\tthis.parsers.set(toolName, parser);\n\t}\n\n\t/** Parse tool input into permission requests */\n\tparse(toolName: string, input: Record<string, unknown>, cwd: string): PermissionRequest[] {\n\t\tconst parser = this.parsers.get(toolName);\n\t\tif (!parser) {\n\t\t\treturn [fallbackPermissionRequest(toolName)];\n\t\t}\n\t\treturn parser(toolName, input, cwd);\n\t}\n}\n\n/** Create registry with built-in parsers for standard tools */\nexport function createBuiltinParserRegistry(): ParserRegistry {\n\tconst registry = new ParserRegistry();\n\n\t// bash_input writes arbitrary stdin to a live shell session = arbitrary command execution,\n\t// so it MUST be gated in the SAME `bash` permission class (via the `input` field), else\n\t// read-only/ask presets would be bypassable through a persistent session. The steering/read\n\t// tools (bash_output/kill_bash/bash_resize) fall back to their own tool-named permissions.\n\tconst parseBashLikePermission =\n\t\t(commandKey: string): ToolPermissionParser =>\n\t\t(_toolName, input, cwd) => {\n\t\t\tconst command = getString(input, commandKey);\n\t\t\tif (!command) {\n\t\t\t\treturn [fallbackPermissionRequest(\"bash\")];\n\t\t\t}\n\n\t\t\tconst tokens = command.split(/\\s+/).filter(Boolean);\n\t\t\tconst prefix = BashArity.prefix(tokens).join(\" \");\n\t\t\tconst always = prefix ? [prefix, `${prefix} *`] : [\"*\"];\n\t\t\tconst requests: PermissionRequest[] = [\n\t\t\t\t{\n\t\t\t\t\tpermission: \"bash\",\n\t\t\t\t\tpatterns: [prefix || command],\n\t\t\t\t\talways,\n\t\t\t\t},\n\t\t\t];\n\n\t\t\tconst externalPaths = extractExternalPaths(command, cwd);\n\t\t\tif (externalPaths.length > 0) {\n\t\t\t\trequests.push({\n\t\t\t\t\tpermission: \"external_directory\",\n\t\t\t\t\tpatterns: externalPaths,\n\t\t\t\t\talways: externalPaths.map((externalPath) => toParentDirectoryPattern(externalPath, \"file\")),\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn requests;\n\t\t};\n\n\tregistry.register(\"bash\", parseBashLikePermission(\"command\"));\n\tregistry.register(\"bash_input\", parseBashLikePermission(\"input\"));\n\tregistry.register(\"monitor\", parseBashLikePermission(\"command\"));\n\n\tconst editParser: ToolPermissionParser = () => {\n\t\treturn [fallbackPermissionRequest(\"edit\")];\n\t};\n\n\tconst parseEditPermission: ToolPermissionParser = (_toolName, input, cwd) => {\n\t\tconst filePath = parseFilePath(input);\n\t\tif (filePath) {\n\t\t\treturn withExternalDirectoryRequests(\n\t\t\t\t[\n\t\t\t\t\t{\n\t\t\t\t\t\tpermission: \"edit\",\n\t\t\t\t\t\tpatterns: [filePath],\n\t\t\t\t\t\talways: [filePath],\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\t[filePath],\n\t\t\t\tcwd,\n\t\t\t\t\"file\",\n\t\t\t);\n\t\t}\n\n\t\tconst patchText = getString(input, \"input\", \"patchText\");\n\t\tif (!patchText) {\n\t\t\treturn editParser(\"edit\", input, \"\");\n\t\t}\n\n\t\tconst patchedPaths = extractPatchedPaths(patchText);\n\t\tif (patchedPaths.length === 0) {\n\t\t\treturn editParser(\"edit\", input, \"\");\n\t\t}\n\n\t\tconst editRequests = patchedPaths.map((patchedPath) => ({\n\t\t\tpermission: \"edit\",\n\t\t\tpatterns: [patchedPath],\n\t\t\talways: [patchedPath],\n\t\t}));\n\n\t\treturn withExternalDirectoryRequests(editRequests, patchedPaths, cwd, \"file\");\n\t};\n\n\tregistry.register(\"edit\", parseEditPermission);\n\tregistry.register(\"write\", parseEditPermission);\n\tregistry.register(\"apply_patch\", parseEditPermission);\n\tregistry.register(\"multiedit\", parseEditPermission);\n\n\tregistry.register(\"read\", (_toolName, input, cwd) => {\n\t\tconst filePath = parseFilePath(input);\n\t\tif (!filePath) {\n\t\t\treturn [fallbackPermissionRequest(\"read\")];\n\t\t}\n\n\t\treturn withExternalDirectoryRequests(\n\t\t\t[\n\t\t\t\t{\n\t\t\t\t\tpermission: \"read\",\n\t\t\t\t\tpatterns: [filePath],\n\t\t\t\t\talways: [filePath],\n\t\t\t\t},\n\t\t\t],\n\t\t\t[filePath],\n\t\t\tcwd,\n\t\t\t\"file\",\n\t\t);\n\t});\n\n\tregistry.register(\"grep\", (_toolName, input, cwd) => {\n\t\tconst searchPath = getString(input, \"path\");\n\t\tconst pattern = getString(input, \"pattern\");\n\t\tconst permissionPattern = searchPath ?? pattern;\n\t\tif (!permissionPattern) {\n\t\t\treturn [fallbackPermissionRequest(\"grep\")];\n\t\t}\n\n\t\tconst grepRequests: PermissionRequest[] = [\n\t\t\t{\n\t\t\t\tpermission: \"grep\",\n\t\t\t\tpatterns: [permissionPattern],\n\t\t\t\talways: [\"*\"],\n\t\t\t},\n\t\t];\n\t\treturn searchPath ? withExternalDirectoryRequests(grepRequests, [searchPath], cwd, \"directory\") : grepRequests;\n\t});\n\n\tconst listParser: ToolPermissionParser = (_toolName, input, cwd) => {\n\t\tconst searchPath = getString(input, \"path\") ?? \".\";\n\t\treturn withExternalDirectoryRequests(\n\t\t\t[\n\t\t\t\t{\n\t\t\t\t\tpermission: \"list\",\n\t\t\t\t\tpatterns: [searchPath],\n\t\t\t\t\talways: [searchPath],\n\t\t\t\t},\n\t\t\t],\n\t\t\t[searchPath],\n\t\t\tcwd,\n\t\t\t\"directory\",\n\t\t);\n\t};\n\n\tregistry.register(\"find\", listParser);\n\tregistry.register(\"ls\", listParser);\n\n\treturn registry;\n}\n"]}
1
+ {"version":3,"file":"parsers.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/permission-system/parsers.ts"],"names":[],"mappings":"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","sourcesContent":["import { realpathSync } from \"node:fs\";\nimport { dirname, resolve } from \"node:path\";\nimport { extractPatchedPaths } from \"../gpt-apply-patch/index.ts\";\nimport { BashArity } from \"../permission-system/arity.ts\";\nimport { extractExternalPaths, isExternalPath } from \"../permission-system/external-dir.ts\";\nimport type { Request } from \"../permission-system/types.ts\";\nimport { setApprovedMonitorParent } from \"../terminal/monitor-permission.ts\";\n\n/** Simplified permission request without ID/session metadata */\nexport type PermissionRequest = Pick<Request, \"permission\" | \"patterns\" | \"always\">;\n\n/** Parser function that extracts permission requests from tool input */\nexport type ToolPermissionParser = (\n\ttoolName: string,\n\tinput: Record<string, unknown>,\n\tcwd: string,\n) => PermissionRequest[];\n\nfunction fallbackPermissionRequest(permission: string): PermissionRequest {\n\treturn {\n\t\tpermission,\n\t\tpatterns: [\"*\"],\n\t\talways: [\"*\"],\n\t};\n}\n\nfunction getString(input: Record<string, unknown>, ...keys: string[]): string | undefined {\n\tfor (const key of keys) {\n\t\tconst value = input[key];\n\t\tif (typeof value === \"string\") {\n\t\t\treturn value;\n\t\t}\n\t}\n\treturn undefined;\n}\n\ntype AlwaysScope = \"file\" | \"directory\";\n\nfunction toParentDirectoryPattern(inputPath: string, scope: AlwaysScope): string {\n\tif (inputPath === \"~\" || inputPath === \"$HOME\") {\n\t\treturn `${inputPath}/*`;\n\t}\n\n\tif (scope === \"directory\") {\n\t\treturn inputPath.endsWith(\"/\") || inputPath.endsWith(\"\\\\\") ? `${inputPath}*` : `${inputPath}/*`;\n\t}\n\n\tif (inputPath.endsWith(\"/\") || inputPath.endsWith(\"\\\\\")) {\n\t\treturn `${inputPath}*`;\n\t}\n\n\tconst parentPattern = inputPath.replace(/[\\\\/][^\\\\/]+$/, \"/*\");\n\tif (parentPattern === \"/*\") {\n\t\treturn inputPath;\n\t}\n\treturn parentPattern;\n}\n\nfunction parseFilePath(input: Record<string, unknown>): string | undefined {\n\treturn getString(input, \"path\", \"file_path\");\n}\n\nfunction withExternalDirectoryRequests(\n\trequests: PermissionRequest[],\n\tpaths: string[],\n\tcwd: string,\n\tscope: AlwaysScope,\n): PermissionRequest[] {\n\tconst externalPaths = paths.filter((inputPath) => isExternalPath(inputPath, cwd));\n\tif (externalPaths.length === 0) {\n\t\treturn requests;\n\t}\n\n\treturn [\n\t\t...requests,\n\t\t{\n\t\t\tpermission: \"external_directory\",\n\t\t\tpatterns: externalPaths,\n\t\t\talways: externalPaths.map((externalPath) => toParentDirectoryPattern(externalPath, scope)),\n\t\t},\n\t];\n}\n\n/** Registry for tool-specific permission parsers */\nexport class ParserRegistry {\n\tprivate readonly parsers = new Map<string, ToolPermissionParser>();\n\n\t/** Register a parser for a specific tool */\n\tregister(toolName: string, parser: ToolPermissionParser): void {\n\t\tthis.parsers.set(toolName, parser);\n\t}\n\n\t/** Parse tool input into permission requests */\n\tparse(toolName: string, input: Record<string, unknown>, cwd: string): PermissionRequest[] {\n\t\tconst parser = this.parsers.get(toolName);\n\t\tif (!parser) {\n\t\t\treturn [fallbackPermissionRequest(toolName)];\n\t\t}\n\t\treturn parser(toolName, input, cwd);\n\t}\n}\n\n/** Create registry with built-in parsers for standard tools */\nexport function createBuiltinParserRegistry(): ParserRegistry {\n\tconst registry = new ParserRegistry();\n\n\t// bash_input writes arbitrary stdin to a live shell session = arbitrary command execution,\n\t// so it MUST be gated in the SAME `bash` permission class (via the `input` field), else\n\t// read-only/ask presets would be bypassable through a persistent session. The steering/read\n\t// tools (bash_output/kill_bash/bash_resize) fall back to their own tool-named permissions.\n\tconst parseBashLikePermission =\n\t\t(commandKey: string): ToolPermissionParser =>\n\t\t(_toolName, input, cwd) => {\n\t\t\tconst command = getString(input, commandKey);\n\t\t\tif (!command) {\n\t\t\t\treturn [fallbackPermissionRequest(\"bash\")];\n\t\t\t}\n\n\t\t\tconst tokens = command.split(/\\s+/).filter(Boolean);\n\t\t\tconst prefix = BashArity.prefix(tokens).join(\" \");\n\t\t\tconst always = prefix ? [prefix, `${prefix} *`] : [\"*\"];\n\t\t\tconst requests: PermissionRequest[] = [\n\t\t\t\t{\n\t\t\t\t\tpermission: \"bash\",\n\t\t\t\t\tpatterns: [prefix || command],\n\t\t\t\t\talways,\n\t\t\t\t},\n\t\t\t];\n\n\t\t\tconst externalPaths = extractExternalPaths(command, cwd);\n\t\t\tif (externalPaths.length > 0) {\n\t\t\t\trequests.push({\n\t\t\t\t\tpermission: \"external_directory\",\n\t\t\t\t\tpatterns: externalPaths,\n\t\t\t\t\talways: externalPaths.map((externalPath) => toParentDirectoryPattern(externalPath, \"file\")),\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn requests;\n\t\t};\n\n\tregistry.register(\"bash\", parseBashLikePermission(\"command\"));\n\tregistry.register(\"bash_input\", parseBashLikePermission(\"input\"));\n\tregistry.register(\"monitor\", (toolName, input, cwd) => {\n\t\tconst path = getString(input, \"path\");\n\t\tif (path) {\n\t\t\ttry {\n\t\t\t\tsetApprovedMonitorParent(input, realpathSync(dirname(resolve(cwd, path))));\n\t\t\t} catch {\n\t\t\t\t// Registration performs the authoritative access and canonical-parent check.\n\t\t\t}\n\t\t\treturn withExternalDirectoryRequests(\n\t\t\t\t[{ permission: \"read\", patterns: [path], always: [path] }],\n\t\t\t\t[path],\n\t\t\t\tcwd,\n\t\t\t\t\"file\",\n\t\t\t);\n\t\t}\n\t\treturn parseBashLikePermission(\"command\")(toolName, input, cwd);\n\t});\n\n\tconst editParser: ToolPermissionParser = () => {\n\t\treturn [fallbackPermissionRequest(\"edit\")];\n\t};\n\n\tconst parseEditPermission: ToolPermissionParser = (_toolName, input, cwd) => {\n\t\tconst filePath = parseFilePath(input);\n\t\tif (filePath) {\n\t\t\treturn withExternalDirectoryRequests(\n\t\t\t\t[\n\t\t\t\t\t{\n\t\t\t\t\t\tpermission: \"edit\",\n\t\t\t\t\t\tpatterns: [filePath],\n\t\t\t\t\t\talways: [filePath],\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\t[filePath],\n\t\t\t\tcwd,\n\t\t\t\t\"file\",\n\t\t\t);\n\t\t}\n\n\t\tconst patchText = getString(input, \"input\", \"patchText\");\n\t\tif (!patchText) {\n\t\t\treturn editParser(\"edit\", input, \"\");\n\t\t}\n\n\t\tconst patchedPaths = extractPatchedPaths(patchText);\n\t\tif (patchedPaths.length === 0) {\n\t\t\treturn editParser(\"edit\", input, \"\");\n\t\t}\n\n\t\tconst editRequests = patchedPaths.map((patchedPath) => ({\n\t\t\tpermission: \"edit\",\n\t\t\tpatterns: [patchedPath],\n\t\t\talways: [patchedPath],\n\t\t}));\n\n\t\treturn withExternalDirectoryRequests(editRequests, patchedPaths, cwd, \"file\");\n\t};\n\n\tregistry.register(\"edit\", parseEditPermission);\n\tregistry.register(\"write\", parseEditPermission);\n\tregistry.register(\"apply_patch\", parseEditPermission);\n\tregistry.register(\"multiedit\", parseEditPermission);\n\n\tregistry.register(\"read\", (_toolName, input, cwd) => {\n\t\tconst filePath = parseFilePath(input);\n\t\tif (!filePath) {\n\t\t\treturn [fallbackPermissionRequest(\"read\")];\n\t\t}\n\n\t\treturn withExternalDirectoryRequests(\n\t\t\t[\n\t\t\t\t{\n\t\t\t\t\tpermission: \"read\",\n\t\t\t\t\tpatterns: [filePath],\n\t\t\t\t\talways: [filePath],\n\t\t\t\t},\n\t\t\t],\n\t\t\t[filePath],\n\t\t\tcwd,\n\t\t\t\"file\",\n\t\t);\n\t});\n\n\tregistry.register(\"grep\", (_toolName, input, cwd) => {\n\t\tconst searchPath = getString(input, \"path\");\n\t\tconst pattern = getString(input, \"pattern\");\n\t\tconst permissionPattern = searchPath ?? pattern;\n\t\tif (!permissionPattern) {\n\t\t\treturn [fallbackPermissionRequest(\"grep\")];\n\t\t}\n\n\t\tconst grepRequests: PermissionRequest[] = [\n\t\t\t{\n\t\t\t\tpermission: \"grep\",\n\t\t\t\tpatterns: [permissionPattern],\n\t\t\t\talways: [\"*\"],\n\t\t\t},\n\t\t];\n\t\treturn searchPath ? withExternalDirectoryRequests(grepRequests, [searchPath], cwd, \"directory\") : grepRequests;\n\t});\n\n\tconst listParser: ToolPermissionParser = (_toolName, input, cwd) => {\n\t\tconst searchPath = getString(input, \"path\") ?? \".\";\n\t\treturn withExternalDirectoryRequests(\n\t\t\t[\n\t\t\t\t{\n\t\t\t\t\tpermission: \"list\",\n\t\t\t\t\tpatterns: [searchPath],\n\t\t\t\t\talways: [searchPath],\n\t\t\t\t},\n\t\t\t],\n\t\t\t[searchPath],\n\t\t\tcwd,\n\t\t\t\"directory\",\n\t\t);\n\t};\n\n\tregistry.register(\"find\", listParser);\n\tregistry.register(\"ls\", listParser);\n\n\treturn registry;\n}\n"]}
@@ -19,8 +19,13 @@ export declare class TerminalManager {
19
19
  private readonly registry;
20
20
  private readonly runtimes;
21
21
  private readonly scrollback?;
22
+ private readonly maxSessions;
23
+ private readonly exited;
24
+ private reservations;
22
25
  constructor(options?: TerminalManagerOptions);
23
26
  get size(): number;
27
+ get activeSize(): number;
28
+ reserve(): (() => void) | null;
24
29
  /** Spawn a new terminal session and register it under an allocated `bash_N` id. */
25
30
  create(command: string, options: TerminalSessionOptions): Promise<CreatedTerminalSession>;
26
31
  /** Look up a live-or-exited session, refreshing its LRU timestamp. */
@@ -1 +1 @@
1
- {"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/terminal/manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAEN,4BAA4B,EAE5B,KAAK,sBAAsB,EAC3B,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAA+B,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAG3F,OAAO,EAAE,4BAA4B,EAAE,MAAM,wBAAwB,CAAC;AAEtE,MAAM,WAAW,sBAAsB;IACtC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,sBAAsB;IACtC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,OAAO,EAAE,sBAAsB,CAAC;CACzC;AAED;;;;;GAKG;AACH,qBAAa,eAAe;IAC3B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAmC;IAC5D,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA6C;IACtE,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAS;gBAEzB,OAAO,GAAE,sBAA2B;IAOhD,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,mFAAmF;IAC7E,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,sBAAsB,GAAG,OAAO,CAAC,sBAAsB,CAAC;IAgB/F,sEAAsE;IACtE,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,sBAAsB,GAAG,IAAI;IAM9C,IAAI,IAAI;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,sBAAsB,CAAA;KAAE,EAAE;IASzD,2FAA2F;IACrF,IAAI,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAMxC,gEAAgE;IAC1D,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAM/B,wFAAwF;IACxF,OAAO,CAAC,iBAAiB;CAQzB;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,4BAA4B,CAErF"}
1
+ {"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/terminal/manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAEN,4BAA4B,EAE5B,KAAK,sBAAsB,EAC3B,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAA+B,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAG3F,OAAO,EAAE,4BAA4B,EAAE,MAAM,wBAAwB,CAAC;AAEtE,MAAM,WAAW,sBAAsB;IACtC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,sBAAsB;IACtC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,OAAO,EAAE,sBAAsB,CAAC;CACzC;AAED;;;;;GAKG;AACH,qBAAa,eAAe;IAC3B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAmC;IAC5D,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA6C;IACtE,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAqB;IAC5C,OAAO,CAAC,YAAY,CAAK;gBAEb,OAAO,GAAE,sBAA2B;IAMhD,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,IAAI,UAAU,IAAI,MAAM,CAGvB;IAED,OAAO,IAAI,CAAC,MAAM,IAAI,CAAC,GAAG,IAAI;IAY9B,mFAAmF;IAC7E,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,sBAAsB,GAAG,OAAO,CAAC,sBAAsB,CAAC;IAuB/F,sEAAsE;IACtE,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,sBAAsB,GAAG,IAAI;IAM9C,IAAI,IAAI;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,sBAAsB,CAAA;KAAE,EAAE;IASzD,2FAA2F;IACrF,IAAI,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAMxC,gEAAgE;IAC1D,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAO/B,wFAAwF;IACxF,OAAO,CAAC,iBAAiB;CASzB;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,4BAA4B,CAErF"}
@@ -11,16 +11,37 @@ export { SessionRegistryCapacityError } from "@earendil-works/pi-pty";
11
11
  export class TerminalManager {
12
12
  constructor(options = {}) {
13
13
  this.runtimes = new Map();
14
- this.registry = new SessionRegistry({
15
- maxSessions: options.maxSessions ?? DEFAULT_MAX_SESSIONS,
16
- });
14
+ this.exited = new Set();
15
+ this.reservations = 0;
16
+ this.maxSessions = options.maxSessions ?? DEFAULT_MAX_SESSIONS;
17
+ this.registry = new SessionRegistry({ maxSessions: this.maxSessions });
17
18
  this.scrollback = options.scrollback;
18
19
  }
19
20
  get size() {
20
21
  return this.runtimes.size;
21
22
  }
23
+ get activeSize() {
24
+ this.reconcileRuntimes();
25
+ return this.runtimes.size - this.exited.size + this.reservations;
26
+ }
27
+ reserve() {
28
+ this.reconcileRuntimes();
29
+ if (this.runtimes.size - this.exited.size + this.reservations >= this.maxSessions)
30
+ return null;
31
+ this.reservations += 1;
32
+ let released = false;
33
+ return () => {
34
+ if (released)
35
+ return;
36
+ released = true;
37
+ this.reservations -= 1;
38
+ };
39
+ }
22
40
  /** Spawn a new terminal session and register it under an allocated `bash_N` id. */
23
41
  async create(command, options) {
42
+ const release = this.reserve();
43
+ if (!release)
44
+ throw new SessionRegistryCapacityError(this.maxSessions);
24
45
  const runtimeOptions = { ...options, scrollback: this.scrollback };
25
46
  const runtime = new TerminalRuntimeSession(command, runtimeOptions);
26
47
  let entry;
@@ -28,11 +49,16 @@ export class TerminalManager {
28
49
  entry = await this.registry.create({ command, session: runtime.session });
29
50
  }
30
51
  catch (error) {
52
+ release();
31
53
  runtime.dispose();
32
54
  runtime.session.kill();
33
55
  throw error;
34
56
  }
35
57
  this.runtimes.set(entry.id, runtime);
58
+ runtime.session.onExit(() => {
59
+ this.exited.add(entry.id);
60
+ });
61
+ release();
36
62
  this.reconcileRuntimes();
37
63
  return { id: entry.id, runtime };
38
64
  }
@@ -64,6 +90,7 @@ export class TerminalManager {
64
90
  for (const runtime of this.runtimes.values())
65
91
  runtime.dispose();
66
92
  this.runtimes.clear();
93
+ this.exited.clear();
67
94
  }
68
95
  /** Dispose runtime wrappers whose registry entry was pruned (capacity/LRU eviction). */
69
96
  reconcileRuntimes() {
@@ -73,6 +100,7 @@ export class TerminalManager {
73
100
  continue;
74
101
  runtime.dispose();
75
102
  this.runtimes.delete(id);
103
+ this.exited.delete(id);
76
104
  }
77
105
  }
78
106
  }
@@ -1 +1 @@
1
- {"version":3,"file":"manager.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/terminal/manager.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n\tSessionRegistry,\n\tSessionRegistryCapacityError,\n\ttype TerminalSession,\n\ttype TerminalSessionOptions,\n} from \"@earendil-works/pi-pty\";\nimport { type TerminalRuntimeOptions, TerminalRuntimeSession } from \"./runtime-session.ts\";\nimport { DEFAULT_MAX_SESSIONS } from \"./shared.ts\";\n\nexport { SessionRegistryCapacityError } from \"@earendil-works/pi-pty\";\n\nexport interface TerminalManagerOptions {\n\treadonly maxSessions?: number;\n\treadonly scrollback?: number;\n}\n\nexport interface CreatedTerminalSession {\n\treadonly id: string;\n\treadonly runtime: TerminalRuntimeSession;\n}\n\n/**\n * Owns the live terminal sessions for one agent session. Delegates id allocation,\n * capacity caps, LRU-exited pruning, and tree-kill teardown to the pi-pty\n * {@link SessionRegistry}, while keeping the richer {@link TerminalRuntimeSession}\n * wrappers (screen model + output buffer) in lock-step.\n */\nexport class TerminalManager {\n\tprivate readonly registry: SessionRegistry<TerminalSession>;\n\tprivate readonly runtimes = new Map<string, TerminalRuntimeSession>();\n\tprivate readonly scrollback?: number;\n\n\tconstructor(options: TerminalManagerOptions = {}) {\n\t\tthis.registry = new SessionRegistry<TerminalSession>({\n\t\t\tmaxSessions: options.maxSessions ?? DEFAULT_MAX_SESSIONS,\n\t\t});\n\t\tthis.scrollback = options.scrollback;\n\t}\n\n\tget size(): number {\n\t\treturn this.runtimes.size;\n\t}\n\n\t/** Spawn a new terminal session and register it under an allocated `bash_N` id. */\n\tasync create(command: string, options: TerminalSessionOptions): Promise<CreatedTerminalSession> {\n\t\tconst runtimeOptions: TerminalRuntimeOptions = { ...options, scrollback: this.scrollback };\n\t\tconst runtime = new TerminalRuntimeSession(command, runtimeOptions);\n\t\tlet entry: { id: string };\n\t\ttry {\n\t\t\tentry = await this.registry.create({ command, session: runtime.session });\n\t\t} catch (error) {\n\t\t\truntime.dispose();\n\t\t\truntime.session.kill();\n\t\t\tthrow error;\n\t\t}\n\t\tthis.runtimes.set(entry.id, runtime);\n\t\tthis.reconcileRuntimes();\n\t\treturn { id: entry.id, runtime };\n\t}\n\n\t/** Look up a live-or-exited session, refreshing its LRU timestamp. */\n\tget(id: string): TerminalRuntimeSession | null {\n\t\tconst entry = this.registry.get(id);\n\t\tif (!entry) return null;\n\t\treturn this.runtimes.get(id) ?? null;\n\t}\n\n\tlist(): { id: string; runtime: TerminalRuntimeSession }[] {\n\t\tconst result: { id: string; runtime: TerminalRuntimeSession }[] = [];\n\t\tfor (const entry of this.registry.list()) {\n\t\t\tconst runtime = this.runtimes.get(entry.id);\n\t\t\tif (runtime) result.push({ id: entry.id, runtime });\n\t\t}\n\t\treturn result;\n\t}\n\n\t/** Tree-kill one session; the exited entry is kept for a final output read until swept. */\n\tasync stop(id: string): Promise<boolean> {\n\t\tconst stopped = await this.registry.stop(id);\n\t\tthis.reconcileRuntimes();\n\t\treturn stopped;\n\t}\n\n\t/** Tree-kill every session and dispose all runtime wrappers. */\n\tasync teardown(): Promise<void> {\n\t\tawait this.registry.teardown();\n\t\tfor (const runtime of this.runtimes.values()) runtime.dispose();\n\t\tthis.runtimes.clear();\n\t}\n\n\t/** Dispose runtime wrappers whose registry entry was pruned (capacity/LRU eviction). */\n\tprivate reconcileRuntimes(): void {\n\t\tconst liveIds = new Set(this.registry.list().map((entry) => entry.id));\n\t\tfor (const [id, runtime] of this.runtimes) {\n\t\t\tif (liveIds.has(id)) continue;\n\t\t\truntime.dispose();\n\t\t\tthis.runtimes.delete(id);\n\t\t}\n\t}\n}\n\nexport function isCapacityError(error: unknown): error is SessionRegistryCapacityError {\n\treturn error instanceof SessionRegistryCapacityError;\n}\n"]}
1
+ {"version":3,"file":"manager.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/terminal/manager.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n\tSessionRegistry,\n\tSessionRegistryCapacityError,\n\ttype TerminalSession,\n\ttype TerminalSessionOptions,\n} from \"@earendil-works/pi-pty\";\nimport { type TerminalRuntimeOptions, TerminalRuntimeSession } from \"./runtime-session.ts\";\nimport { DEFAULT_MAX_SESSIONS } from \"./shared.ts\";\n\nexport { SessionRegistryCapacityError } from \"@earendil-works/pi-pty\";\n\nexport interface TerminalManagerOptions {\n\treadonly maxSessions?: number;\n\treadonly scrollback?: number;\n}\n\nexport interface CreatedTerminalSession {\n\treadonly id: string;\n\treadonly runtime: TerminalRuntimeSession;\n}\n\n/**\n * Owns the live terminal sessions for one agent session. Delegates id allocation,\n * capacity caps, LRU-exited pruning, and tree-kill teardown to the pi-pty\n * {@link SessionRegistry}, while keeping the richer {@link TerminalRuntimeSession}\n * wrappers (screen model + output buffer) in lock-step.\n */\nexport class TerminalManager {\n\tprivate readonly registry: SessionRegistry<TerminalSession>;\n\tprivate readonly runtimes = new Map<string, TerminalRuntimeSession>();\n\tprivate readonly scrollback?: number;\n\tprivate readonly maxSessions: number;\n\tprivate readonly exited = new Set<string>();\n\tprivate reservations = 0;\n\n\tconstructor(options: TerminalManagerOptions = {}) {\n\t\tthis.maxSessions = options.maxSessions ?? DEFAULT_MAX_SESSIONS;\n\t\tthis.registry = new SessionRegistry<TerminalSession>({ maxSessions: this.maxSessions });\n\t\tthis.scrollback = options.scrollback;\n\t}\n\n\tget size(): number {\n\t\treturn this.runtimes.size;\n\t}\n\n\tget activeSize(): number {\n\t\tthis.reconcileRuntimes();\n\t\treturn this.runtimes.size - this.exited.size + this.reservations;\n\t}\n\n\treserve(): (() => void) | null {\n\t\tthis.reconcileRuntimes();\n\t\tif (this.runtimes.size - this.exited.size + this.reservations >= this.maxSessions) return null;\n\t\tthis.reservations += 1;\n\t\tlet released = false;\n\t\treturn () => {\n\t\t\tif (released) return;\n\t\t\treleased = true;\n\t\t\tthis.reservations -= 1;\n\t\t};\n\t}\n\n\t/** Spawn a new terminal session and register it under an allocated `bash_N` id. */\n\tasync create(command: string, options: TerminalSessionOptions): Promise<CreatedTerminalSession> {\n\t\tconst release = this.reserve();\n\t\tif (!release) throw new SessionRegistryCapacityError(this.maxSessions);\n\t\tconst runtimeOptions: TerminalRuntimeOptions = { ...options, scrollback: this.scrollback };\n\t\tconst runtime = new TerminalRuntimeSession(command, runtimeOptions);\n\t\tlet entry: { id: string };\n\t\ttry {\n\t\t\tentry = await this.registry.create({ command, session: runtime.session });\n\t\t} catch (error) {\n\t\t\trelease();\n\t\t\truntime.dispose();\n\t\t\truntime.session.kill();\n\t\t\tthrow error;\n\t\t}\n\t\tthis.runtimes.set(entry.id, runtime);\n\t\truntime.session.onExit(() => {\n\t\t\tthis.exited.add(entry.id);\n\t\t});\n\t\trelease();\n\t\tthis.reconcileRuntimes();\n\t\treturn { id: entry.id, runtime };\n\t}\n\n\t/** Look up a live-or-exited session, refreshing its LRU timestamp. */\n\tget(id: string): TerminalRuntimeSession | null {\n\t\tconst entry = this.registry.get(id);\n\t\tif (!entry) return null;\n\t\treturn this.runtimes.get(id) ?? null;\n\t}\n\n\tlist(): { id: string; runtime: TerminalRuntimeSession }[] {\n\t\tconst result: { id: string; runtime: TerminalRuntimeSession }[] = [];\n\t\tfor (const entry of this.registry.list()) {\n\t\t\tconst runtime = this.runtimes.get(entry.id);\n\t\t\tif (runtime) result.push({ id: entry.id, runtime });\n\t\t}\n\t\treturn result;\n\t}\n\n\t/** Tree-kill one session; the exited entry is kept for a final output read until swept. */\n\tasync stop(id: string): Promise<boolean> {\n\t\tconst stopped = await this.registry.stop(id);\n\t\tthis.reconcileRuntimes();\n\t\treturn stopped;\n\t}\n\n\t/** Tree-kill every session and dispose all runtime wrappers. */\n\tasync teardown(): Promise<void> {\n\t\tawait this.registry.teardown();\n\t\tfor (const runtime of this.runtimes.values()) runtime.dispose();\n\t\tthis.runtimes.clear();\n\t\tthis.exited.clear();\n\t}\n\n\t/** Dispose runtime wrappers whose registry entry was pruned (capacity/LRU eviction). */\n\tprivate reconcileRuntimes(): void {\n\t\tconst liveIds = new Set(this.registry.list().map((entry) => entry.id));\n\t\tfor (const [id, runtime] of this.runtimes) {\n\t\t\tif (liveIds.has(id)) continue;\n\t\t\truntime.dispose();\n\t\t\tthis.runtimes.delete(id);\n\t\t\tthis.exited.delete(id);\n\t\t}\n\t}\n}\n\nexport function isCapacityError(error: unknown): error is SessionRegistryCapacityError {\n\treturn error instanceof SessionRegistryCapacityError;\n}\n"]}
@@ -0,0 +1,8 @@
1
+ export declare const APPROVED_MONITOR_PARENT: unique symbol;
2
+ export type MonitorPermissionInput = Record<string, unknown> & {
3
+ [APPROVED_MONITOR_PARENT]?: string;
4
+ };
5
+ export declare function setApprovedMonitorParent(input: Record<string, unknown>, parent: string): void;
6
+ export declare function getApprovedMonitorParent(input: Record<string, unknown>): string | undefined;
7
+ export declare function monitorParent(path: string): string;
8
+ //# sourceMappingURL=monitor-permission.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"monitor-permission.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/terminal/monitor-permission.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,uBAAuB,eAAoC,CAAC;AAEzE,MAAM,MAAM,sBAAsB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG;IAC9D,CAAC,uBAAuB,CAAC,CAAC,EAAE,MAAM,CAAC;CACnC,CAAC;AAEF,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAM7F;AAED,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,GAAG,SAAS,CAE3F;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAElD"}
@@ -0,0 +1,16 @@
1
+ import { dirname } from "node:path";
2
+ export const APPROVED_MONITOR_PARENT = Symbol("approved-monitor-parent");
3
+ export function setApprovedMonitorParent(input, parent) {
4
+ Object.defineProperty(input, APPROVED_MONITOR_PARENT, {
5
+ configurable: true,
6
+ value: parent,
7
+ writable: false,
8
+ });
9
+ }
10
+ export function getApprovedMonitorParent(input) {
11
+ return input[APPROVED_MONITOR_PARENT];
12
+ }
13
+ export function monitorParent(path) {
14
+ return dirname(path);
15
+ }
16
+ //# sourceMappingURL=monitor-permission.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"monitor-permission.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/terminal/monitor-permission.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,MAAM,CAAC,MAAM,uBAAuB,GAAG,MAAM,CAAC,yBAAyB,CAAC,CAAC;AAMzE,MAAM,UAAU,wBAAwB,CAAC,KAA8B,EAAE,MAAc;IACtF,MAAM,CAAC,cAAc,CAAC,KAAK,EAAE,uBAAuB,EAAE;QACrD,YAAY,EAAE,IAAI;QAClB,KAAK,EAAE,MAAM;QACb,QAAQ,EAAE,KAAK;KACf,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,KAA8B;IACtE,OAAQ,KAAgC,CAAC,uBAAuB,CAAC,CAAC;AACnE,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,IAAY;IACzC,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC;AACtB,CAAC","sourcesContent":["import { dirname } from \"node:path\";\n\nexport const APPROVED_MONITOR_PARENT = Symbol(\"approved-monitor-parent\");\n\nexport type MonitorPermissionInput = Record<string, unknown> & {\n\t[APPROVED_MONITOR_PARENT]?: string;\n};\n\nexport function setApprovedMonitorParent(input: Record<string, unknown>, parent: string): void {\n\tObject.defineProperty(input, APPROVED_MONITOR_PARENT, {\n\t\tconfigurable: true,\n\t\tvalue: parent,\n\t\twritable: false,\n\t});\n}\n\nexport function getApprovedMonitorParent(input: Record<string, unknown>): string | undefined {\n\treturn (input as MonitorPermissionInput)[APPROVED_MONITOR_PARENT];\n}\n\nexport function monitorParent(path: string): string {\n\treturn dirname(path);\n}\n"]}
@@ -23,6 +23,16 @@ export interface MonitorSnapshotEntry {
23
23
  export interface MonitorRegistryOptions {
24
24
  /** Observes every registry transition (register/pause/rearm/settle/dispose) with the live snapshot. */
25
25
  readonly onChange?: (snapshot: readonly MonitorSnapshotEntry[]) => void;
26
+ /** Reserves one shared terminal capacity slot for a native watch. */
27
+ readonly reserve?: () => (() => void) | null;
28
+ }
29
+ export interface RegisterFileMonitorOptions {
30
+ readonly description: string;
31
+ readonly path: string;
32
+ readonly event: "create" | "modify";
33
+ readonly timeoutMs: number;
34
+ readonly cwd: string;
35
+ readonly approvedParent?: string;
26
36
  }
27
37
  export interface RegisterMonitorOptions {
28
38
  readonly id: string;
@@ -39,6 +49,9 @@ export declare class MonitorRegistry {
39
49
  #private;
40
50
  constructor(emit: (event: MonitorEvent) => void, options?: MonitorRegistryOptions);
41
51
  snapshot(): readonly MonitorSnapshotEntry[];
52
+ registerFile(options: RegisterFileMonitorOptions): Promise<string>;
53
+ stopFile(id: string): Promise<boolean>;
54
+ stopAllFiles(): Promise<number>;
42
55
  register(options: RegisterMonitorOptions): void;
43
56
  pauseAll(): string[];
44
57
  rearm(id: string): MonitorRearmResult;
@@ -1 +1 @@
1
- {"version":3,"file":"monitor-registry.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/terminal/monitor-registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAGnE,MAAM,WAAW,gBAAgB;IAChC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,mBAAmB;IACnC,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,MAAM,YAAY,GAAG,gBAAgB,GAAG,mBAAmB,CAAC;AAElE,MAAM,MAAM,kBAAkB,GAAG,SAAS,GAAG,YAAY,GAAG,WAAW,CAAC;AAExE,MAAM,WAAW,oBAAoB;IACpC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,2FAA2F;IAC3F,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,sBAAsB;IACtC,uGAAuG;IACvG,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,EAAE,SAAS,oBAAoB,EAAE,KAAK,IAAI,CAAC;CACxE;AAED,MAAM,WAAW,sBAAsB;IACtC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,OAAO,EAAE,sBAAsB,CAAC;IACzC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CACzB;AAeD;;;;GAIG;AACH,qBAAa,eAAe;;gBAKf,IAAI,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,EAAE,OAAO,CAAC,EAAE,sBAAsB;IAKjF,QAAQ,IAAI,SAAS,oBAAoB,EAAE;IAS3C,QAAQ,CAAC,OAAO,EAAE,sBAAsB,GAAG,IAAI;IAwB/C,QAAQ,IAAI,MAAM,EAAE;IAWpB,KAAK,CAAC,EAAE,EAAE,MAAM,GAAG,kBAAkB;IASrC,OAAO,IAAI,IAAI;CAgDf"}
1
+ {"version":3,"file":"monitor-registry.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/terminal/monitor-registry.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAGnE,MAAM,WAAW,gBAAgB;IAChC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,mBAAmB;IACnC,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,MAAM,YAAY,GAAG,gBAAgB,GAAG,mBAAmB,CAAC;AAElE,MAAM,MAAM,kBAAkB,GAAG,SAAS,GAAG,YAAY,GAAG,WAAW,CAAC;AAExE,MAAM,WAAW,oBAAoB;IACpC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,2FAA2F;IAC3F,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,sBAAsB;IACtC,uGAAuG;IACvG,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,EAAE,SAAS,oBAAoB,EAAE,KAAK,IAAI,CAAC;IACxE,qEAAqE;IACrE,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,IAAI,CAAC,GAAG,IAAI,CAAC;CAC7C;AAED,MAAM,WAAW,0BAA0B;IAC1C,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,QAAQ,GAAG,QAAQ,CAAC;IACpC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;CACjC;AAED,MAAM,WAAW,sBAAsB;IACtC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,OAAO,EAAE,sBAAsB,CAAC;IACzC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CACzB;AAiDD;;;;GAIG;AACH,qBAAa,eAAe;;gBAYf,IAAI,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,EAAE,OAAO,CAAC,EAAE,sBAAsB;IAMjF,QAAQ,IAAI,SAAS,oBAAoB,EAAE;IASrC,YAAY,CAAC,OAAO,EAAE,0BAA0B,GAAG,OAAO,CAAC,MAAM,CAAC;IA+KlE,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAOtC,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC;IA2HrC,QAAQ,CAAC,OAAO,EAAE,sBAAsB,GAAG,IAAI;IAwB/C,QAAQ,IAAI,MAAM,EAAE;IAWpB,KAAK,CAAC,EAAE,EAAE,MAAM,GAAG,kBAAkB;IAUrC,OAAO,IAAI,IAAI;CAyHf"}