@ashx-j/lunr 0.2.26 → 0.2.27

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 (639) hide show
  1. package/CHANGELOG.md +16 -1
  2. package/LICENSE +22 -0
  3. package/dist/builtin-extensions/ashxj-thinking.d.ts +1 -1
  4. package/dist/builtin-extensions/ashxj-thinking.d.ts.map +1 -1
  5. package/dist/builtin-extensions/ashxj-thinking.js +1 -1
  6. package/dist/builtin-extensions/ashxj-thinking.js.map +1 -1
  7. package/dist/builtin-extensions/ashxj-tui.d.ts +11 -1
  8. package/dist/builtin-extensions/ashxj-tui.d.ts.map +1 -1
  9. package/dist/builtin-extensions/ashxj-tui.js +6 -10
  10. package/dist/builtin-extensions/ashxj-tui.js.map +1 -1
  11. package/dist/builtin-extensions/lunr-cron.d.ts +4 -5
  12. package/dist/builtin-extensions/lunr-cron.d.ts.map +1 -1
  13. package/dist/builtin-extensions/lunr-cron.js +94 -108
  14. package/dist/builtin-extensions/lunr-cron.js.map +1 -1
  15. package/dist/builtin-extensions/lunr-local-providers/local-servers.d.ts.map +1 -1
  16. package/dist/builtin-extensions/lunr-local-providers/local-servers.js +3 -1
  17. package/dist/builtin-extensions/lunr-local-providers/local-servers.js.map +1 -1
  18. package/dist/builtin-extensions/narumiruna-pi-goal/src/commands.d.ts.map +1 -1
  19. package/dist/builtin-extensions/narumiruna-pi-goal/src/commands.js +2 -2
  20. package/dist/builtin-extensions/narumiruna-pi-goal/src/commands.js.map +1 -1
  21. package/dist/builtin-extensions/narumiruna-pi-goal/src/goal.d.ts.map +1 -1
  22. package/dist/builtin-extensions/narumiruna-pi-goal/src/goal.js +1 -1
  23. package/dist/builtin-extensions/narumiruna-pi-goal/src/goal.js.map +1 -1
  24. package/dist/builtin-extensions/narumiruna-pi-goal/src/runtime.d.ts.map +1 -1
  25. package/dist/builtin-extensions/narumiruna-pi-goal/src/runtime.js +1 -1
  26. package/dist/builtin-extensions/narumiruna-pi-goal/src/runtime.js.map +1 -1
  27. package/dist/builtin-extensions/pi-intercom/index.d.ts.map +1 -1
  28. package/dist/builtin-extensions/pi-intercom/index.js +2 -2
  29. package/dist/builtin-extensions/pi-intercom/index.js.map +1 -1
  30. package/dist/builtin-extensions/pi-lsp-extension/bemol-extension/index.d.ts +1 -1
  31. package/dist/builtin-extensions/pi-lsp-extension/bemol-extension/index.d.ts.map +1 -1
  32. package/dist/builtin-extensions/pi-lsp-extension/bemol-extension/index.js +1 -1
  33. package/dist/builtin-extensions/pi-lsp-extension/bemol-extension/index.js.map +1 -1
  34. package/dist/builtin-extensions/pi-lsp-extension/src/index.d.ts.map +1 -1
  35. package/dist/builtin-extensions/pi-lsp-extension/src/index.js +1 -15
  36. package/dist/builtin-extensions/pi-lsp-extension/src/index.js.map +1 -1
  37. package/dist/builtin-extensions/pi-lsp-extension/src/lsp-client.d.ts +6 -0
  38. package/dist/builtin-extensions/pi-lsp-extension/src/lsp-client.d.ts.map +1 -1
  39. package/dist/builtin-extensions/pi-lsp-extension/src/lsp-client.js +187 -132
  40. package/dist/builtin-extensions/pi-lsp-extension/src/lsp-client.js.map +1 -1
  41. package/dist/builtin-extensions/pi-lsp-extension/src/lsp-manager.d.ts +8 -0
  42. package/dist/builtin-extensions/pi-lsp-extension/src/lsp-manager.d.ts.map +1 -1
  43. package/dist/builtin-extensions/pi-lsp-extension/src/lsp-manager.js +142 -112
  44. package/dist/builtin-extensions/pi-lsp-extension/src/lsp-manager.js.map +1 -1
  45. package/dist/builtin-extensions/pi-lsp-extension/src/tools/code-rewrite.d.ts +12 -1
  46. package/dist/builtin-extensions/pi-lsp-extension/src/tools/code-rewrite.d.ts.map +1 -1
  47. package/dist/builtin-extensions/pi-lsp-extension/src/tools/code-rewrite.js +14 -7
  48. package/dist/builtin-extensions/pi-lsp-extension/src/tools/code-rewrite.js.map +1 -1
  49. package/dist/builtin-extensions/pi-lsp-extension/src/tree-sitter/rewrite-engine.d.ts +11 -3
  50. package/dist/builtin-extensions/pi-lsp-extension/src/tree-sitter/rewrite-engine.d.ts.map +1 -1
  51. package/dist/builtin-extensions/pi-lsp-extension/src/tree-sitter/rewrite-engine.js +67 -41
  52. package/dist/builtin-extensions/pi-lsp-extension/src/tree-sitter/rewrite-engine.js.map +1 -1
  53. package/dist/builtin-extensions/pi-lsp-extension/src/tree-sitter/search-engine.d.ts +4 -2
  54. package/dist/builtin-extensions/pi-lsp-extension/src/tree-sitter/search-engine.d.ts.map +1 -1
  55. package/dist/builtin-extensions/pi-lsp-extension/src/tree-sitter/search-engine.js +3 -0
  56. package/dist/builtin-extensions/pi-lsp-extension/src/tree-sitter/search-engine.js.map +1 -1
  57. package/dist/builtin-extensions/pi-mcp-adapter/commands.d.ts +2 -1
  58. package/dist/builtin-extensions/pi-mcp-adapter/commands.d.ts.map +1 -1
  59. package/dist/builtin-extensions/pi-mcp-adapter/commands.js +6 -6
  60. package/dist/builtin-extensions/pi-mcp-adapter/commands.js.map +1 -1
  61. package/dist/builtin-extensions/pi-mcp-adapter/config.d.ts +1 -1
  62. package/dist/builtin-extensions/pi-mcp-adapter/config.d.ts.map +1 -1
  63. package/dist/builtin-extensions/pi-mcp-adapter/config.js +11 -5
  64. package/dist/builtin-extensions/pi-mcp-adapter/config.js.map +1 -1
  65. package/dist/builtin-extensions/pi-mcp-adapter/direct-tool-executor.d.ts.map +1 -1
  66. package/dist/builtin-extensions/pi-mcp-adapter/direct-tool-executor.js +2 -2
  67. package/dist/builtin-extensions/pi-mcp-adapter/direct-tool-executor.js.map +1 -1
  68. package/dist/builtin-extensions/pi-mcp-adapter/host-html-template.d.ts.map +1 -1
  69. package/dist/builtin-extensions/pi-mcp-adapter/host-html-template.js +1 -1
  70. package/dist/builtin-extensions/pi-mcp-adapter/host-html-template.js.map +1 -1
  71. package/dist/builtin-extensions/pi-mcp-adapter/index.d.ts.map +1 -1
  72. package/dist/builtin-extensions/pi-mcp-adapter/index.js +48 -40
  73. package/dist/builtin-extensions/pi-mcp-adapter/index.js.map +1 -1
  74. package/dist/builtin-extensions/pi-mcp-adapter/init.d.ts.map +1 -1
  75. package/dist/builtin-extensions/pi-mcp-adapter/init.js +3 -1
  76. package/dist/builtin-extensions/pi-mcp-adapter/init.js.map +1 -1
  77. package/dist/builtin-extensions/pi-mcp-adapter/mcp-auth-flow.d.ts +12 -40
  78. package/dist/builtin-extensions/pi-mcp-adapter/mcp-auth-flow.d.ts.map +1 -1
  79. package/dist/builtin-extensions/pi-mcp-adapter/mcp-auth-flow.js +166 -235
  80. package/dist/builtin-extensions/pi-mcp-adapter/mcp-auth-flow.js.map +1 -1
  81. package/dist/builtin-extensions/pi-mcp-adapter/mcp-callback-server.d.ts +5 -0
  82. package/dist/builtin-extensions/pi-mcp-adapter/mcp-callback-server.d.ts.map +1 -1
  83. package/dist/builtin-extensions/pi-mcp-adapter/mcp-callback-server.js +43 -13
  84. package/dist/builtin-extensions/pi-mcp-adapter/mcp-callback-server.js.map +1 -1
  85. package/dist/builtin-extensions/pi-mcp-adapter/mcp-oauth-provider.d.ts +14 -3
  86. package/dist/builtin-extensions/pi-mcp-adapter/mcp-oauth-provider.d.ts.map +1 -1
  87. package/dist/builtin-extensions/pi-mcp-adapter/mcp-oauth-provider.js +73 -21
  88. package/dist/builtin-extensions/pi-mcp-adapter/mcp-oauth-provider.js.map +1 -1
  89. package/dist/builtin-extensions/pi-mcp-adapter/proxy-modes.d.ts.map +1 -1
  90. package/dist/builtin-extensions/pi-mcp-adapter/proxy-modes.js +4 -4
  91. package/dist/builtin-extensions/pi-mcp-adapter/proxy-modes.js.map +1 -1
  92. package/dist/builtin-extensions/pi-mcp-adapter/server-manager.d.ts.map +1 -1
  93. package/dist/builtin-extensions/pi-mcp-adapter/server-manager.js +2 -2
  94. package/dist/builtin-extensions/pi-mcp-adapter/server-manager.js.map +1 -1
  95. package/dist/builtin-extensions/pi-mcp-adapter/state.d.ts +2 -0
  96. package/dist/builtin-extensions/pi-mcp-adapter/state.d.ts.map +1 -1
  97. package/dist/builtin-extensions/pi-mcp-adapter/state.js.map +1 -1
  98. package/dist/builtin-extensions/pi-ollama-cloud/index.d.ts +1 -1
  99. package/dist/builtin-extensions/pi-ollama-cloud/index.d.ts.map +1 -1
  100. package/dist/builtin-extensions/pi-ollama-cloud/index.js +1 -1
  101. package/dist/builtin-extensions/pi-ollama-cloud/index.js.map +1 -1
  102. package/dist/builtin-extensions/pi-ollama-cloud/models.d.ts +11 -5
  103. package/dist/builtin-extensions/pi-ollama-cloud/models.d.ts.map +1 -1
  104. package/dist/builtin-extensions/pi-ollama-cloud/models.js +12 -32
  105. package/dist/builtin-extensions/pi-ollama-cloud/models.js.map +1 -1
  106. package/dist/builtin-extensions/pi-prompt-template-model/index.d.ts.map +1 -1
  107. package/dist/builtin-extensions/pi-prompt-template-model/index.js +5 -3
  108. package/dist/builtin-extensions/pi-prompt-template-model/index.js.map +1 -1
  109. package/dist/builtin-extensions/pi-prompt-template-model/prompt-loader.d.ts +2 -1
  110. package/dist/builtin-extensions/pi-prompt-template-model/prompt-loader.d.ts.map +1 -1
  111. package/dist/builtin-extensions/pi-prompt-template-model/prompt-loader.js +21 -12
  112. package/dist/builtin-extensions/pi-prompt-template-model/prompt-loader.js.map +1 -1
  113. package/dist/builtin-extensions/pi-prompt-template-model/tool-manager.d.ts.map +1 -1
  114. package/dist/builtin-extensions/pi-prompt-template-model/tool-manager.js +7 -24
  115. package/dist/builtin-extensions/pi-prompt-template-model/tool-manager.js.map +1 -1
  116. package/dist/builtin-extensions/pi-subagents/src/extension/index.d.ts.map +1 -1
  117. package/dist/builtin-extensions/pi-subagents/src/extension/index.js +39 -77
  118. package/dist/builtin-extensions/pi-subagents/src/extension/index.js.map +1 -1
  119. package/dist/builtin-extensions/pi-subagents/src/runs/background/notify.d.ts +1 -1
  120. package/dist/builtin-extensions/pi-subagents/src/runs/background/notify.d.ts.map +1 -1
  121. package/dist/builtin-extensions/pi-subagents/src/runs/background/notify.js +15 -31
  122. package/dist/builtin-extensions/pi-subagents/src/runs/background/notify.js.map +1 -1
  123. package/dist/builtin-extensions/pi-subagents/src/runs/background/result-watcher.d.ts.map +1 -1
  124. package/dist/builtin-extensions/pi-subagents/src/runs/background/result-watcher.js +7 -2
  125. package/dist/builtin-extensions/pi-subagents/src/runs/background/result-watcher.js.map +1 -1
  126. package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-runner.d.ts.map +1 -1
  127. package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-runner.js +10 -2
  128. package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-runner.js.map +1 -1
  129. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/chain-execution.d.ts.map +1 -1
  130. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/chain-execution.js +8 -1
  131. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/chain-execution.js.map +1 -1
  132. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/execution.d.ts.map +1 -1
  133. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/execution.js +106 -24
  134. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/execution.js.map +1 -1
  135. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/subagent-executor.d.ts.map +1 -1
  136. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/subagent-executor.js +25 -5
  137. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/subagent-executor.js.map +1 -1
  138. package/dist/builtin-extensions/pi-subagents/src/runs/shared/model-fallback.d.ts +1 -1
  139. package/dist/builtin-extensions/pi-subagents/src/runs/shared/model-fallback.d.ts.map +1 -1
  140. package/dist/builtin-extensions/pi-subagents/src/runs/shared/model-fallback.js +1 -1
  141. package/dist/builtin-extensions/pi-subagents/src/runs/shared/model-fallback.js.map +1 -1
  142. package/dist/builtin-extensions/pi-subagents/src/runs/shared/parallel-utils.d.ts +7 -8
  143. package/dist/builtin-extensions/pi-subagents/src/runs/shared/parallel-utils.d.ts.map +1 -1
  144. package/dist/builtin-extensions/pi-subagents/src/runs/shared/parallel-utils.js +60 -32
  145. package/dist/builtin-extensions/pi-subagents/src/runs/shared/parallel-utils.js.map +1 -1
  146. package/dist/builtin-extensions/pi-subagents/src/shared/utils.d.ts +1 -1
  147. package/dist/builtin-extensions/pi-subagents/src/shared/utils.d.ts.map +1 -1
  148. package/dist/builtin-extensions/pi-subagents/src/shared/utils.js +15 -5
  149. package/dist/builtin-extensions/pi-subagents/src/shared/utils.js.map +1 -1
  150. package/dist/builtin-extensions/pi-subagents/src/slash/prompt-workflows.d.ts.map +1 -1
  151. package/dist/builtin-extensions/pi-subagents/src/slash/prompt-workflows.js +4 -3
  152. package/dist/builtin-extensions/pi-subagents/src/slash/prompt-workflows.js.map +1 -1
  153. package/dist/builtin-extensions/pi-subagents/src/tui/render.d.ts +1 -1
  154. package/dist/builtin-extensions/pi-subagents/src/tui/render.d.ts.map +1 -1
  155. package/dist/builtin-extensions/pi-subagents/src/tui/render.js +17 -8
  156. package/dist/builtin-extensions/pi-subagents/src/tui/render.js.map +1 -1
  157. package/dist/builtin-extensions/pi-subagents/src/watchdog/review.d.ts.map +1 -1
  158. package/dist/builtin-extensions/pi-subagents/src/watchdog/review.js +3 -3
  159. package/dist/builtin-extensions/pi-subagents/src/watchdog/review.js.map +1 -1
  160. package/dist/builtin-extensions/pi-tps.d.ts.map +1 -1
  161. package/dist/builtin-extensions/pi-tps.js +20 -17
  162. package/dist/builtin-extensions/pi-tps.js.map +1 -1
  163. package/dist/builtin-extensions/pi-web-access/activity.d.ts +1 -0
  164. package/dist/builtin-extensions/pi-web-access/activity.d.ts.map +1 -1
  165. package/dist/builtin-extensions/pi-web-access/activity.js +27 -5
  166. package/dist/builtin-extensions/pi-web-access/activity.js.map +1 -1
  167. package/dist/builtin-extensions/pi-web-access/bounded-body.d.ts +3 -0
  168. package/dist/builtin-extensions/pi-web-access/bounded-body.d.ts.map +1 -0
  169. package/dist/builtin-extensions/pi-web-access/bounded-body.js +43 -0
  170. package/dist/builtin-extensions/pi-web-access/bounded-body.js.map +1 -0
  171. package/dist/builtin-extensions/pi-web-access/content-page.d.ts +24 -0
  172. package/dist/builtin-extensions/pi-web-access/content-page.d.ts.map +1 -0
  173. package/dist/builtin-extensions/pi-web-access/content-page.js +57 -0
  174. package/dist/builtin-extensions/pi-web-access/content-page.js.map +1 -0
  175. package/dist/builtin-extensions/pi-web-access/extract.d.ts.map +1 -1
  176. package/dist/builtin-extensions/pi-web-access/extract.js +7 -2
  177. package/dist/builtin-extensions/pi-web-access/extract.js.map +1 -1
  178. package/dist/builtin-extensions/pi-web-access/github-extract.d.ts +0 -1
  179. package/dist/builtin-extensions/pi-web-access/github-extract.d.ts.map +1 -1
  180. package/dist/builtin-extensions/pi-web-access/github-extract.js +147 -36
  181. package/dist/builtin-extensions/pi-web-access/github-extract.js.map +1 -1
  182. package/dist/builtin-extensions/pi-web-access/index.d.ts.map +1 -1
  183. package/dist/builtin-extensions/pi-web-access/index.js +48 -73
  184. package/dist/builtin-extensions/pi-web-access/index.js.map +1 -1
  185. package/dist/builtin-extensions/pi-web-access/session-cleanup.d.ts +12 -4
  186. package/dist/builtin-extensions/pi-web-access/session-cleanup.d.ts.map +1 -1
  187. package/dist/builtin-extensions/pi-web-access/session-cleanup.js +35 -12
  188. package/dist/builtin-extensions/pi-web-access/session-cleanup.js.map +1 -1
  189. package/dist/builtin-extensions/pi-web-access/storage.d.ts +9 -6
  190. package/dist/builtin-extensions/pi-web-access/storage.d.ts.map +1 -1
  191. package/dist/builtin-extensions/pi-web-access/storage.js +36 -24
  192. package/dist/builtin-extensions/pi-web-access/storage.js.map +1 -1
  193. package/dist/builtin-extensions/simple-pi-memory.d.ts +1 -1
  194. package/dist/builtin-extensions/simple-pi-memory.d.ts.map +1 -1
  195. package/dist/builtin-extensions/simple-pi-memory.js +1 -1
  196. package/dist/builtin-extensions/simple-pi-memory.js.map +1 -1
  197. package/dist/cli/install-cli.d.ts.map +1 -1
  198. package/dist/cli/install-cli.js +38 -30
  199. package/dist/cli/install-cli.js.map +1 -1
  200. package/dist/core/agent-session-runtime.d.ts +13 -0
  201. package/dist/core/agent-session-runtime.d.ts.map +1 -1
  202. package/dist/core/agent-session-runtime.js +75 -11
  203. package/dist/core/agent-session-runtime.js.map +1 -1
  204. package/dist/core/agent-session-services.d.ts +1 -0
  205. package/dist/core/agent-session-services.d.ts.map +1 -1
  206. package/dist/core/agent-session-services.js +1 -0
  207. package/dist/core/agent-session-services.js.map +1 -1
  208. package/dist/core/agent-session.d.ts +40 -6
  209. package/dist/core/agent-session.d.ts.map +1 -1
  210. package/dist/core/agent-session.js +309 -76
  211. package/dist/core/agent-session.js.map +1 -1
  212. package/dist/core/browser/runtime.d.ts +2 -0
  213. package/dist/core/browser/runtime.d.ts.map +1 -1
  214. package/dist/core/browser/runtime.js +80 -45
  215. package/dist/core/browser/runtime.js.map +1 -1
  216. package/dist/core/browser/setup.d.ts.map +1 -1
  217. package/dist/core/browser/setup.js +12 -1
  218. package/dist/core/browser/setup.js.map +1 -1
  219. package/dist/core/computer-use/adapter.d.ts.map +1 -1
  220. package/dist/core/computer-use/adapter.js +7 -2
  221. package/dist/core/computer-use/adapter.js.map +1 -1
  222. package/dist/core/computer-use/image.d.ts.map +1 -1
  223. package/dist/core/computer-use/image.js +17 -5
  224. package/dist/core/computer-use/image.js.map +1 -1
  225. package/dist/core/computer-use/schemas.d.ts.map +1 -1
  226. package/dist/core/computer-use/schemas.js +23 -6
  227. package/dist/core/computer-use/schemas.js.map +1 -1
  228. package/dist/core/computer-use/workflow.d.ts.map +1 -1
  229. package/dist/core/computer-use/workflow.js +459 -119
  230. package/dist/core/computer-use/workflow.js.map +1 -1
  231. package/dist/core/cron/jobs.d.ts +26 -8
  232. package/dist/core/cron/jobs.d.ts.map +1 -1
  233. package/dist/core/cron/jobs.js +357 -232
  234. package/dist/core/cron/jobs.js.map +1 -1
  235. package/dist/core/cron/origin-context.d.ts +1 -0
  236. package/dist/core/cron/origin-context.d.ts.map +1 -1
  237. package/dist/core/cron/origin-context.js.map +1 -1
  238. package/dist/core/cron/scheduler.d.ts +22 -17
  239. package/dist/core/cron/scheduler.d.ts.map +1 -1
  240. package/dist/core/cron/scheduler.js +153 -73
  241. package/dist/core/cron/scheduler.js.map +1 -1
  242. package/dist/core/extensions/index.d.ts +1 -1
  243. package/dist/core/extensions/index.d.ts.map +1 -1
  244. package/dist/core/extensions/index.js.map +1 -1
  245. package/dist/core/extensions/runner.d.ts +1 -0
  246. package/dist/core/extensions/runner.d.ts.map +1 -1
  247. package/dist/core/extensions/runner.js +8 -0
  248. package/dist/core/extensions/runner.js.map +1 -1
  249. package/dist/core/extensions/types.d.ts +8 -0
  250. package/dist/core/extensions/types.d.ts.map +1 -1
  251. package/dist/core/extensions/types.js.map +1 -1
  252. package/dist/core/footer-data-provider.d.ts +4 -0
  253. package/dist/core/footer-data-provider.d.ts.map +1 -1
  254. package/dist/core/footer-data-provider.js +22 -1
  255. package/dist/core/footer-data-provider.js.map +1 -1
  256. package/dist/core/large-subagent-launch.d.ts +1 -1
  257. package/dist/core/large-subagent-launch.d.ts.map +1 -1
  258. package/dist/core/large-subagent-launch.js +7 -7
  259. package/dist/core/large-subagent-launch.js.map +1 -1
  260. package/dist/core/model-registry.d.ts +2 -0
  261. package/dist/core/model-registry.d.ts.map +1 -1
  262. package/dist/core/model-registry.js +5 -0
  263. package/dist/core/model-registry.js.map +1 -1
  264. package/dist/core/model-runtime.d.ts +4 -1
  265. package/dist/core/model-runtime.d.ts.map +1 -1
  266. package/dist/core/model-runtime.js +40 -4
  267. package/dist/core/model-runtime.js.map +1 -1
  268. package/dist/core/package-manager.d.ts.map +1 -1
  269. package/dist/core/package-manager.js.map +1 -1
  270. package/dist/core/permissions.d.ts +3 -3
  271. package/dist/core/permissions.d.ts.map +1 -1
  272. package/dist/core/permissions.js +11 -35
  273. package/dist/core/permissions.js.map +1 -1
  274. package/dist/core/plan-mode.d.ts +5 -13
  275. package/dist/core/plan-mode.d.ts.map +1 -1
  276. package/dist/core/plan-mode.js +126 -116
  277. package/dist/core/plan-mode.js.map +1 -1
  278. package/dist/core/project-trust.d.ts.map +1 -1
  279. package/dist/core/project-trust.js +1 -1
  280. package/dist/core/project-trust.js.map +1 -1
  281. package/dist/core/prompt-resource-bridge.d.ts +12 -0
  282. package/dist/core/prompt-resource-bridge.d.ts.map +1 -0
  283. package/dist/core/prompt-resource-bridge.js +9 -0
  284. package/dist/core/prompt-resource-bridge.js.map +1 -0
  285. package/dist/core/protected-targets.d.ts +6 -0
  286. package/dist/core/protected-targets.d.ts.map +1 -0
  287. package/dist/core/protected-targets.js +45 -0
  288. package/dist/core/protected-targets.js.map +1 -0
  289. package/dist/core/resource-loader.d.ts.map +1 -1
  290. package/dist/core/resource-loader.js +7 -0
  291. package/dist/core/resource-loader.js.map +1 -1
  292. package/dist/core/rollback.d.ts +19 -3
  293. package/dist/core/rollback.d.ts.map +1 -1
  294. package/dist/core/rollback.js +172 -56
  295. package/dist/core/rollback.js.map +1 -1
  296. package/dist/core/runtime-credentials.d.ts +3 -0
  297. package/dist/core/runtime-credentials.d.ts.map +1 -1
  298. package/dist/core/runtime-credentials.js +14 -1
  299. package/dist/core/runtime-credentials.js.map +1 -1
  300. package/dist/core/sdk.d.ts +3 -0
  301. package/dist/core/sdk.d.ts.map +1 -1
  302. package/dist/core/sdk.js +1 -0
  303. package/dist/core/sdk.js.map +1 -1
  304. package/dist/core/session-manager.d.ts +6 -0
  305. package/dist/core/session-manager.d.ts.map +1 -1
  306. package/dist/core/session-manager.js +95 -32
  307. package/dist/core/session-manager.js.map +1 -1
  308. package/dist/core/session-ownership.d.ts.map +1 -1
  309. package/dist/core/session-ownership.js +8 -3
  310. package/dist/core/session-ownership.js.map +1 -1
  311. package/dist/core/session-retention.d.ts.map +1 -1
  312. package/dist/core/session-retention.js +18 -7
  313. package/dist/core/session-retention.js.map +1 -1
  314. package/dist/core/session-startup-settings.d.ts +10 -0
  315. package/dist/core/session-startup-settings.d.ts.map +1 -0
  316. package/dist/core/session-startup-settings.js +70 -0
  317. package/dist/core/session-startup-settings.js.map +1 -0
  318. package/dist/core/subscriptions.d.ts +16 -7
  319. package/dist/core/subscriptions.d.ts.map +1 -1
  320. package/dist/core/subscriptions.js +96 -55
  321. package/dist/core/subscriptions.js.map +1 -1
  322. package/dist/core/trust-manager.d.ts +2 -1
  323. package/dist/core/trust-manager.d.ts.map +1 -1
  324. package/dist/core/trust-manager.js +6 -1
  325. package/dist/core/trust-manager.js.map +1 -1
  326. package/dist/core/update-check.d.ts.map +1 -1
  327. package/dist/core/update-check.js.map +1 -1
  328. package/dist/core/usage-adapters/kimi-coding.d.ts +2 -2
  329. package/dist/core/usage-adapters/kimi-coding.d.ts.map +1 -1
  330. package/dist/core/usage-adapters/kimi-coding.js +2 -2
  331. package/dist/core/usage-adapters/kimi-coding.js.map +1 -1
  332. package/dist/core/usage-adapters/openai-codex.d.ts +3 -2
  333. package/dist/core/usage-adapters/openai-codex.d.ts.map +1 -1
  334. package/dist/core/usage-adapters/openai-codex.js +3 -3
  335. package/dist/core/usage-adapters/openai-codex.js.map +1 -1
  336. package/dist/core/usage-adapters/xai.d.ts +2 -2
  337. package/dist/core/usage-adapters/xai.d.ts.map +1 -1
  338. package/dist/core/usage-adapters/xai.js +3 -3
  339. package/dist/core/usage-adapters/xai.js.map +1 -1
  340. package/dist/core/usage-adapters/zai.d.ts +2 -2
  341. package/dist/core/usage-adapters/zai.d.ts.map +1 -1
  342. package/dist/core/usage-adapters/zai.js +2 -2
  343. package/dist/core/usage-adapters/zai.js.map +1 -1
  344. package/dist/core/usage-service.d.ts +9 -2
  345. package/dist/core/usage-service.d.ts.map +1 -1
  346. package/dist/core/usage-service.js +95 -50
  347. package/dist/core/usage-service.js.map +1 -1
  348. package/dist/gateway/agent-bridge.d.ts +9 -1
  349. package/dist/gateway/agent-bridge.d.ts.map +1 -1
  350. package/dist/gateway/agent-bridge.js +91 -37
  351. package/dist/gateway/agent-bridge.js.map +1 -1
  352. package/dist/gateway/buttons.d.ts +8 -1
  353. package/dist/gateway/buttons.d.ts.map +1 -1
  354. package/dist/gateway/buttons.js +76 -18
  355. package/dist/gateway/buttons.js.map +1 -1
  356. package/dist/gateway/commands.d.ts +1 -0
  357. package/dist/gateway/commands.d.ts.map +1 -1
  358. package/dist/gateway/commands.js +10 -4
  359. package/dist/gateway/commands.js.map +1 -1
  360. package/dist/gateway/cron.d.ts +12 -11
  361. package/dist/gateway/cron.d.ts.map +1 -1
  362. package/dist/gateway/cron.js +65 -56
  363. package/dist/gateway/cron.js.map +1 -1
  364. package/dist/gateway/index.d.ts.map +1 -1
  365. package/dist/gateway/index.js +2 -1
  366. package/dist/gateway/index.js.map +1 -1
  367. package/dist/gateway/mobile-commands.d.ts +1 -0
  368. package/dist/gateway/mobile-commands.d.ts.map +1 -1
  369. package/dist/gateway/mobile-commands.js +56 -14
  370. package/dist/gateway/mobile-commands.js.map +1 -1
  371. package/dist/gateway/presenter.d.ts +12 -2
  372. package/dist/gateway/presenter.d.ts.map +1 -1
  373. package/dist/gateway/presenter.js +73 -38
  374. package/dist/gateway/presenter.js.map +1 -1
  375. package/dist/gateway/router.d.ts +2 -2
  376. package/dist/gateway/router.d.ts.map +1 -1
  377. package/dist/gateway/router.js +17 -2
  378. package/dist/gateway/router.js.map +1 -1
  379. package/dist/gateway/service.d.ts +2 -0
  380. package/dist/gateway/service.d.ts.map +1 -1
  381. package/dist/gateway/service.js +153 -0
  382. package/dist/gateway/service.js.map +1 -1
  383. package/dist/main.d.ts.map +1 -1
  384. package/dist/main.js +86 -33
  385. package/dist/main.js.map +1 -1
  386. package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  387. package/dist/modes/interactive/components/assistant-message.js +6 -4
  388. package/dist/modes/interactive/components/assistant-message.js.map +1 -1
  389. package/dist/modes/interactive/components/copyable-text.d.ts.map +1 -1
  390. package/dist/modes/interactive/components/copyable-text.js +3 -2
  391. package/dist/modes/interactive/components/copyable-text.js.map +1 -1
  392. package/dist/modes/interactive/components/extension-editor.d.ts.map +1 -1
  393. package/dist/modes/interactive/components/extension-editor.js +1 -1
  394. package/dist/modes/interactive/components/extension-editor.js.map +1 -1
  395. package/dist/modes/interactive/interactive-mode.d.ts +2 -2
  396. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  397. package/dist/modes/interactive/interactive-mode.js +96 -109
  398. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  399. package/dist/modes/interactive/smooth-streaming.d.ts.map +1 -1
  400. package/dist/modes/interactive/smooth-streaming.js.map +1 -1
  401. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  402. package/dist/modes/rpc/rpc-mode.js +2 -1
  403. package/dist/modes/rpc/rpc-mode.js.map +1 -1
  404. package/dist/node-runtime/{adapter-VFG7WNPX.js → adapter-247RTYLS.js} +4 -5
  405. package/dist/node-runtime/agent-session-services-KDMSPQDY.js +53 -0
  406. package/dist/node-runtime/{brave-UWDA3I22.js → brave-2AFFAXNN.js} +1 -1
  407. package/dist/node-runtime/{builtin-extensions-I2HIFEMY.js → builtin-extensions-OX6KELNX.js} +8 -7
  408. package/dist/node-runtime/{chunk-QH6YL7VK.js → chunk-252ZVPPF.js} +3 -3
  409. package/dist/node-runtime/{chunk-PCEW76PM.js → chunk-2OIPYKLZ.js} +6 -6
  410. package/dist/node-runtime/{chunk-XBWPBZBN.js → chunk-2SWW7KMW.js} +1 -1
  411. package/dist/node-runtime/{chunk-UQUCFAJ3.js → chunk-2VIW3IMF.js} +40 -7
  412. package/dist/node-runtime/{chunk-UOEDI7RP.js → chunk-4KNKQGHM.js} +2 -2
  413. package/dist/node-runtime/{chunk-FQMM2EZ2.js → chunk-64XTQNLA.js} +29 -7
  414. package/dist/node-runtime/{chunk-SPVDBUOS.js → chunk-6O3IW3IA.js} +2 -2
  415. package/dist/node-runtime/{chunk-5ZQXRPMC.js → chunk-6ZZHGUSA.js} +2 -2
  416. package/dist/node-runtime/chunk-A2WO6WIN.js +1197 -0
  417. package/dist/node-runtime/{chunk-WIF24I7G.js → chunk-APVM5NEU.js} +149 -144
  418. package/dist/node-runtime/{chunk-RCR3XAQY.js → chunk-AYHH7YSD.js} +177 -144
  419. package/dist/node-runtime/{chunk-LWYIVUGV.js → chunk-B2IBAXNX.js} +48 -31
  420. package/dist/node-runtime/{chunk-M3LZLQW2.js → chunk-BDRGN3L2.js} +1 -0
  421. package/dist/node-runtime/{chunk-GJ2RDBRL.js → chunk-BYC6RKCN.js} +4 -2
  422. package/dist/node-runtime/{chunk-UVWCDQYF.js → chunk-C3P6Q3B2.js} +455 -278
  423. package/dist/node-runtime/{chunk-SN2KSMPQ.js → chunk-DQSCFU7R.js} +13 -7
  424. package/dist/node-runtime/{chunk-4SBQAI4T.js → chunk-EBLAZVSA.js} +2058 -73
  425. package/dist/node-runtime/{chunk-2KIPT4HJ.js → chunk-EPR2F3GU.js} +68 -20
  426. package/dist/node-runtime/{chunk-CSFI6YXL.js → chunk-ES6PBSIE.js} +1 -1
  427. package/dist/node-runtime/{chunk-IF24A3FH.js → chunk-EVM653DD.js} +4 -4
  428. package/dist/node-runtime/{chunk-HTFRRDSF.js → chunk-F2SMQ6ES.js} +3 -2
  429. package/dist/node-runtime/chunk-F2V2F4ZG.js +114 -0
  430. package/dist/node-runtime/{chunk-IKU6Y7DL.js → chunk-FE3WZI7F.js} +9 -6
  431. package/dist/node-runtime/{chunk-GYIXXQAO.js → chunk-FIRA54AC.js} +2 -5
  432. package/dist/node-runtime/{chunk-6VYZ5UFP.js → chunk-FLGEEH27.js} +1 -1
  433. package/dist/node-runtime/{chunk-5EFIU3OM.js → chunk-FTKEZL27.js} +1 -1
  434. package/dist/node-runtime/{chunk-RGQAEOM5.js → chunk-FYIFPFXE.js} +23 -6
  435. package/dist/node-runtime/{chunk-HMBGROQK.js → chunk-GLDXBBL6.js} +3 -3
  436. package/dist/node-runtime/{chunk-KWA4OC2J.js → chunk-H6YBCWKG.js} +1 -1
  437. package/dist/node-runtime/{chunk-2MI5OPMN.js → chunk-HNNHHJAB.js} +68 -50
  438. package/dist/node-runtime/{chunk-I74LN5JG.js → chunk-HUD2RFJW.js} +2 -2
  439. package/dist/node-runtime/{chunk-I54LGHWM.js → chunk-I2H5QMWW.js} +3 -3
  440. package/dist/node-runtime/{chunk-XHIRAZ26.js → chunk-IAZSK7KK.js} +1 -1
  441. package/dist/node-runtime/{chunk-X3PGBLQ7.js → chunk-IHHTWSXN.js} +9 -9
  442. package/dist/node-runtime/{chunk-DAPBPCBP.js → chunk-IPP5BIV5.js} +25 -3
  443. package/dist/node-runtime/{chunk-QFWG2RVL.js → chunk-IXG6F4NT.js} +11 -0
  444. package/dist/node-runtime/{chunk-RDDAZOMU.js → chunk-JL4HYQXK.js} +1 -1
  445. package/dist/node-runtime/{chunk-CDVHZOOK.js → chunk-JQYNHAKX.js} +1 -1
  446. package/dist/node-runtime/{chunk-L24TPBS4.js → chunk-JWEVT363.js} +37 -29
  447. package/dist/node-runtime/{chunk-2HMIRK7W.js → chunk-LHV3V67B.js} +5 -5
  448. package/dist/node-runtime/{chunk-UAEOTO52.js → chunk-MNQXDFPV.js} +6 -2
  449. package/dist/node-runtime/{chunk-T4DA4XE7.js → chunk-MQPKUHRN.js} +162 -82
  450. package/dist/node-runtime/{chunk-MPKSOJBT.js → chunk-NHATCSOI.js} +4 -7
  451. package/dist/node-runtime/{chunk-RMQZU2YU.js → chunk-NNNR3QIY.js} +1 -1
  452. package/dist/node-runtime/{chunk-RWTKOC3B.js → chunk-QBTJG3UM.js} +1 -1
  453. package/dist/node-runtime/{chunk-P7XBVXGT.js → chunk-QNVMKNNN.js} +18 -14
  454. package/dist/node-runtime/{chunk-GS42T6MX.js → chunk-QW3AAHWN.js} +1 -1
  455. package/dist/node-runtime/{chunk-DVQSHCVP.js → chunk-R4WSB2MQ.js} +5 -5
  456. package/dist/node-runtime/{chunk-B4HP6ZWM.js → chunk-RHCGYWO7.js} +1 -1
  457. package/dist/node-runtime/{chunk-2CFDTH5B.js → chunk-RLGY2QIL.js} +45 -59
  458. package/dist/node-runtime/{chunk-KKUTQQV7.js → chunk-RYRGL7P4.js} +1 -1
  459. package/dist/node-runtime/{chunk-5Q4A37RB.js → chunk-TCT6PCUR.js} +32 -11
  460. package/dist/node-runtime/{chunk-D5UCKPBQ.js → chunk-UBWW2PID.js} +1 -1
  461. package/dist/node-runtime/{chunk-E75WFZ33.js → chunk-UNUZICC4.js} +3 -3
  462. package/dist/node-runtime/{chunk-RAK2QA2B.js → chunk-UYRKUKFE.js} +4 -4
  463. package/dist/node-runtime/{chunk-LWJXTA6Z.js → chunk-VSUEAI7O.js} +1377 -45
  464. package/dist/node-runtime/{chunk-NAY6UUQZ.js → chunk-WDIVLMOH.js} +1 -1
  465. package/dist/node-runtime/{chunk-E24EO34J.js → chunk-WPXUR3HE.js} +1 -1
  466. package/dist/node-runtime/{chunk-SLVOAQOY.js → chunk-WXYNALHD.js} +113 -1
  467. package/dist/node-runtime/{chunk-KJ6DWS3K.js → chunk-XEOCUEUJ.js} +121 -60
  468. package/dist/node-runtime/chunk-YD3IZAZ7.js +47 -0
  469. package/dist/node-runtime/chunk-YSB6URMT.js +41 -0
  470. package/dist/node-runtime/{chunk-LJTIVM7I.js → chunk-ZDJUR45D.js} +427 -126
  471. package/dist/node-runtime/{chunk-YWOJIGFY.js → chunk-ZEVFBFNF.js} +95 -142
  472. package/dist/node-runtime/{chunk-5B6VKFEV.js → chunk-ZIQUS5QO.js} +1 -1
  473. package/dist/node-runtime/cli-runtime.js +4 -4
  474. package/dist/node-runtime/{command-FSBU2EVZ.js → command-3HMSY6W2.js} +5 -5
  475. package/dist/node-runtime/{commands-EMBQQVVT.js → commands-D6A6H4TS.js} +11 -18
  476. package/dist/node-runtime/{commands-NAAL7KNT.js → commands-OCSSEEWJ.js} +16 -16
  477. package/dist/node-runtime/{config-QDD5PUE2.js → config-CU7M7BTK.js} +1 -1
  478. package/dist/node-runtime/{config-D4QUPAHX.js → config-DS7XLMEM.js} +2 -2
  479. package/dist/node-runtime/{direct-tool-executor-4D7UXYU4.js → direct-tool-executor-2QJXVQD2.js} +6 -11
  480. package/dist/node-runtime/{exa-LL64QZR2.js → exa-6VBZNPGE.js} +1 -1
  481. package/dist/node-runtime/{export-html-VM4J2MNR.js → export-html-BRWF5AHI.js} +4 -4
  482. package/dist/node-runtime/{extension-input-E7BJZ35H.js → extension-input-VBBMX7YV.js} +5 -5
  483. package/dist/node-runtime/{extension-selector-WU42XDTU.js → extension-selector-T5AOG5XB.js} +5 -5
  484. package/dist/node-runtime/{extract-EQJE7FZZ.js → extract-BFX2N35A.js} +3 -3
  485. package/dist/node-runtime/{gateway-DQM333YV.js → gateway-6623C2U3.js} +51 -42
  486. package/dist/node-runtime/{gemini-search-35OCRFLN.js → gemini-search-C66QHDT6.js} +2 -2
  487. package/dist/node-runtime/{gemini-url-context-UQY3PHHW.js → gemini-url-context-T7DEK73R.js} +3 -3
  488. package/dist/node-runtime/{github-extract-F64RZOEA.js → github-extract-HOGE3D6F.js} +107 -38
  489. package/dist/node-runtime/{goal-NJEE5CTU.js → goal-AIHEDUYA.js} +5 -5
  490. package/dist/node-runtime/index.js +50 -48
  491. package/dist/node-runtime/{init-P5AUV77I.js → init-JBQJIPYI.js} +3 -6
  492. package/dist/node-runtime/{install-cli-NN4YAU44.js → install-cli-INGHIVBY.js} +30 -25
  493. package/dist/node-runtime/interactive-mode-FM5DNUSW.js +74 -0
  494. package/dist/node-runtime/{interactive-view-NGFAMHPW.js → interactive-view-K33PM4OS.js} +8 -8
  495. package/dist/node-runtime/{lsp-manager-3ASUSO4T.js → lsp-manager-S554V5HR.js} +240 -155
  496. package/dist/node-runtime/{lunr-browser-IR7TL3J7.js → lunr-browser-H4FDOR3C.js} +7 -7
  497. package/dist/node-runtime/{lunr-computer-use-Y23CCDIJ.js → lunr-computer-use-VDP2QNRQ.js} +9 -9
  498. package/dist/node-runtime/{lunr-cron-USHC4LXH.js → lunr-cron-LKVA5CZZ.js} +93 -80
  499. package/dist/node-runtime/main.js +42 -41
  500. package/dist/node-runtime/{mobile-commands-O5LCHL32.js → mobile-commands-XT3NQXLD.js} +12 -12
  501. package/dist/node-runtime/{model-runtime-OO5HFLWE.js → model-runtime-MZ2JMDV4.js} +4 -4
  502. package/dist/node-runtime/{openai-search-B3MSNCQA.js → openai-search-K72LJDYN.js} +1 -1
  503. package/dist/node-runtime/{package-manager-cli-Q7BL6KZO.js → package-manager-cli-CYM262SI.js} +20 -20
  504. package/dist/node-runtime/{parallel-AI2MNSCU.js → parallel-X724NCNU.js} +1 -1
  505. package/dist/node-runtime/{perplexity-QVJW3I35.js → perplexity-RDHQHVMK.js} +2 -2
  506. package/dist/node-runtime/{pi-intercom-QM53RLTS.js → pi-intercom-NHHEPBMI.js} +2 -2
  507. package/dist/node-runtime/{pi-mcp-adapter-3PHF4KZ4.js → pi-mcp-adapter-PP3GQJQ2.js} +98 -94
  508. package/dist/node-runtime/{pi-ollama-cloud-2F3Y2QNM.js → pi-ollama-cloud-4MNWIMFN.js} +11 -24
  509. package/dist/node-runtime/{pi-prompt-template-model-QWTCGLJU.js → pi-prompt-template-model-FTGELLS5.js} +32 -36
  510. package/dist/node-runtime/{pi-subagents-7IBSSGEW.js → pi-subagents-LT3CTO4E.js} +98 -106
  511. package/dist/node-runtime/{pi-web-access-WTGMNZ32.js → pi-web-access-Z3LP246C.js} +144 -108
  512. package/dist/node-runtime/{print-mode-XQ76CYMT.js → print-mode-2XHN5SUA.js} +3 -3
  513. package/dist/node-runtime/{process-registry-4FAKZQOL.js → process-registry-Q4QWIU33.js} +3 -3
  514. package/dist/node-runtime/{proxy-modes-5FAPSZEZ.js → proxy-modes-VEGC6QG5.js} +8 -15
  515. package/dist/node-runtime/rpc-entry.js +42 -41
  516. package/dist/node-runtime/{rpc-mode-O3XV4SID.js → rpc-mode-32DHJPEJ.js} +4 -4
  517. package/dist/node-runtime/{runtime-4VA6JKNF.js → runtime-EDUUGAQD.js} +56 -46
  518. package/dist/node-runtime/{runtime-EFPPD2UW.js → runtime-UGXM4NPQ.js} +2 -2
  519. package/dist/node-runtime/{runtime-bridges-7WVCLI76.js → runtime-bridges-DNKMNJCF.js} +7 -7
  520. package/dist/node-runtime/{service-MDQIPQ26.js → service-IHLGFLBT.js} +6 -4
  521. package/dist/node-runtime/{session-handoff-GWARVEWT.js → session-handoff-LNSPDTKY.js} +4 -4
  522. package/dist/node-runtime/{session-manager-JB5J6XBN.js → session-manager-YIFIAVGC.js} +3 -3
  523. package/dist/node-runtime/{session-selector-GIM4DHQ2.js → session-selector-I73U3EIO.js} +7 -7
  524. package/dist/node-runtime/{settings-manager-DJDM5AHM.js → settings-manager-P2TKGYTR.js} +5 -5
  525. package/dist/node-runtime/{setup-JBKOLJ6F.js → setup-H7CCELIL.js} +15 -1
  526. package/dist/node-runtime/{setup-PFBWRNUI.js → setup-OLQ4GXWS.js} +17 -17
  527. package/dist/node-runtime/{src-IVPNZ2BX.js → src-6RV4PXKJ.js} +64 -36
  528. package/dist/node-runtime/{subagent-executor-LPZ4BHWE.js → subagent-executor-Q5F7DBVM.js} +119 -58
  529. package/dist/node-runtime/{tavily-WEZFVFP7.js → tavily-KZBFYQB6.js} +1 -1
  530. package/dist/node-runtime/{theme-UOO5RVFN.js → theme-YLVZKKZD.js} +2 -2
  531. package/dist/node-runtime/{trust-manager-MMISNCYO.js → trust-manager-ZCU76D23.js} +2 -2
  532. package/dist/node-runtime/{update-cli-HNMOTNGX.js → update-cli-F3XXJANQ.js} +6 -6
  533. package/dist/node-runtime/{usage-service-LFB2SWYV.js → usage-service-CPAGBED5.js} +1 -1
  534. package/dist/node-runtime/{video-extract-OOZHR7SU.js → video-extract-UPKYIBW3.js} +3 -3
  535. package/dist/node-runtime/{workflow-OHPBEFO4.js → workflow-ICDI4N3J.js} +208 -78
  536. package/dist/node-runtime/{youtube-extract-FNPAUNHU.js → youtube-extract-77NT7FWH.js} +4 -4
  537. package/dist/utils/clipboard-image.d.ts.map +1 -1
  538. package/dist/utils/clipboard-image.js.map +1 -1
  539. package/dist/utils/exif-orientation.d.ts.map +1 -1
  540. package/dist/utils/exif-orientation.js +25 -10
  541. package/dist/utils/exif-orientation.js.map +1 -1
  542. package/dist/utils/image-resize-core.d.ts.map +1 -1
  543. package/dist/utils/image-resize-core.js +2 -0
  544. package/dist/utils/image-resize-core.js.map +1 -1
  545. package/dist/utils/paths.d.ts +4 -0
  546. package/dist/utils/paths.d.ts.map +1 -1
  547. package/dist/utils/paths.js +33 -2
  548. package/dist/utils/paths.js.map +1 -1
  549. package/dist/utils/sanitize-terminal-text.d.ts +7 -0
  550. package/dist/utils/sanitize-terminal-text.d.ts.map +1 -0
  551. package/dist/utils/sanitize-terminal-text.js +67 -0
  552. package/dist/utils/sanitize-terminal-text.js.map +1 -0
  553. package/docs/browser.md +1 -1
  554. package/docs/custom-provider.md +3 -3
  555. package/docs/extensions.md +8 -4
  556. package/docs/features.md +15 -7
  557. package/docs/keybindings.md +1 -1
  558. package/docs/models.md +5 -5
  559. package/docs/packages.md +1 -1
  560. package/docs/providers.md +2 -2
  561. package/docs/rpc.md +7 -7
  562. package/docs/security.md +10 -5
  563. package/docs/sessions.md +2 -2
  564. package/docs/skills.md +1 -1
  565. package/docs/terminal-setup.md +7 -7
  566. package/docs/themes.md +1 -1
  567. package/docs/usage.md +1 -1
  568. package/examples/extensions/auto-commit-on-exit.ts +1 -1
  569. package/examples/extensions/bash-spawn-hook.ts +1 -1
  570. package/examples/extensions/built-in-tool-renderer.ts +1 -1
  571. package/examples/extensions/claude-rules.ts +1 -1
  572. package/examples/extensions/commands.ts +1 -1
  573. package/examples/extensions/custom-compaction.ts +1 -1
  574. package/examples/extensions/custom-provider-anthropic/index.ts +3 -3
  575. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  576. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  577. package/examples/extensions/custom-provider-gitlab-duo/index.ts +1 -1
  578. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  579. package/examples/extensions/doom-overlay/index.ts +1 -1
  580. package/examples/extensions/git-merge-and-resolve.ts +2 -2
  581. package/examples/extensions/gondolin/index.ts +1 -1
  582. package/examples/extensions/gondolin/package-lock.json +2 -2
  583. package/examples/extensions/gondolin/package.json +1 -1
  584. package/examples/extensions/hidden-thinking-label.ts +1 -1
  585. package/examples/extensions/inline-bash.ts +2 -2
  586. package/examples/extensions/input-transform-streaming.ts +2 -2
  587. package/examples/extensions/input-transform.ts +2 -2
  588. package/examples/extensions/interactive-shell.ts +1 -1
  589. package/examples/extensions/kimi-deferred-tools.ts +1 -1
  590. package/examples/extensions/mac-system-theme.ts +1 -1
  591. package/examples/extensions/minimal-mode.ts +1 -1
  592. package/examples/extensions/modal-editor.ts +1 -1
  593. package/examples/extensions/model-status.ts +1 -1
  594. package/examples/extensions/notify.ts +3 -3
  595. package/examples/extensions/overlay-qa-tests.ts +1 -1
  596. package/examples/extensions/overlay-test.ts +1 -1
  597. package/examples/extensions/pirate.ts +1 -1
  598. package/examples/extensions/preset.ts +3 -3
  599. package/examples/extensions/project-trust.ts +4 -4
  600. package/examples/extensions/prompt-customizer.ts +1 -1
  601. package/examples/extensions/rainbow-editor.ts +1 -1
  602. package/examples/extensions/rpc-demo.ts +1 -1
  603. package/examples/extensions/sandbox/index.ts +7 -7
  604. package/examples/extensions/sandbox/package-lock.json +2 -2
  605. package/examples/extensions/sandbox/package.json +1 -1
  606. package/examples/extensions/shutdown-command.ts +5 -5
  607. package/examples/extensions/ssh.ts +2 -2
  608. package/examples/extensions/subagent/README.md +3 -3
  609. package/examples/extensions/subagent/index.ts +2 -2
  610. package/examples/extensions/titlebar-spinner.ts +1 -1
  611. package/examples/extensions/tool-override.ts +1 -1
  612. package/examples/extensions/tools.ts +1 -1
  613. package/examples/extensions/with-deps/package-lock.json +2 -2
  614. package/examples/extensions/with-deps/package.json +1 -1
  615. package/examples/extensions/working-indicator.ts +1 -1
  616. package/examples/extensions/working-message-test.ts +1 -1
  617. package/examples/sdk/01-minimal.ts +1 -1
  618. package/examples/sdk/03-custom-prompt.ts +1 -1
  619. package/examples/sdk/04-skills.ts +1 -1
  620. package/examples/sdk/06-extensions.ts +2 -2
  621. package/examples/sdk/08-prompt-templates.ts +1 -1
  622. package/install-lock/package-lock.json +24 -24
  623. package/install-lock/package.json +2 -2
  624. package/npm-shrinkwrap.json +60 -24
  625. package/package.json +9 -9
  626. package/dist/modes/interactive/components/exit-card.d.ts +0 -22
  627. package/dist/modes/interactive/components/exit-card.d.ts.map +0 -1
  628. package/dist/modes/interactive/components/exit-card.js +0 -69
  629. package/dist/modes/interactive/components/exit-card.js.map +0 -1
  630. package/dist/node-runtime/agent-session-services-5YXS2PLF.js +0 -51
  631. package/dist/node-runtime/chunk-2IDTZAG5.js +0 -1415
  632. package/dist/node-runtime/chunk-3MISGG4S.js +0 -769
  633. package/dist/node-runtime/chunk-4HXHDDCF.js +0 -16
  634. package/dist/node-runtime/chunk-5B5QN3ZQ.js +0 -356
  635. package/dist/node-runtime/chunk-7IQGBKBJ.js +0 -2033
  636. package/dist/node-runtime/chunk-AUXVGBO4.js +0 -19
  637. package/dist/node-runtime/chunk-PTFBPO3C.js +0 -50
  638. package/dist/node-runtime/interactive-mode-YOHZVMKX.js +0 -74
  639. package/dist/node-runtime/mcp-auth-flow-QVLFVLEO.js +0 -33
@@ -3,7 +3,7 @@
3
3
  * Intercepted before handlePackageCommand so `lunr uninstall` (no source)
4
4
  * is product uninstall and `lunr uninstall <source>` stays package-remove.
5
5
  */
6
- import { existsSync, rmSync } from "node:fs";
6
+ import { existsSync, rmdirSync, rmSync } from "node:fs";
7
7
  import { join } from "node:path";
8
8
  import { createInterface } from "node:readline";
9
9
  import { APP_NAME, getAgentDir, NPM_CLI_PACKAGE, VERSION } from "../config.js";
@@ -80,36 +80,40 @@ async function runSetup(argv) {
80
80
  return 2;
81
81
  }
82
82
  const current = loadInstallFeatures();
83
- let next = current;
84
- if (parsed.yes) {
85
- const applied = applyFeatureFlags(current, parsed);
86
- if (!applied.ok) {
87
- console.error(applied.error);
88
- return applied.exitCode;
89
- }
90
- next = applied.next;
91
- for (const id of applied.enabledIds) {
92
- const prev = current.features[id];
83
+ const applied = applyFeatureFlags(current, parsed);
84
+ if (!applied.ok) {
85
+ console.error(applied.error);
86
+ return applied.exitCode;
87
+ }
88
+ const explicitFeatures = parsed.features.length > 0 || parsed.noFeatures.length > 0 || parsed.sets.length > 0;
89
+ const { installBrowser } = await import("../core/browser/setup.js");
90
+ await installBrowser(false);
91
+ let next = applied.next;
92
+ if (!parsed.yes && !explicitFeatures) {
93
+ await (await import("../gateway/setup.js")).setupGateway();
94
+ // Gateway setup persists its own feature choices. Do not overwrite them.
95
+ next = loadInstallFeatures();
96
+ }
97
+ else {
98
+ const enabled = new Set([...applied.enabledIds, ...parsed.sets.map((set) => getFeatureSpec(set.id)?.id)]);
99
+ for (const id of enabled) {
100
+ if (!id)
101
+ continue;
93
102
  const state = next.features[id];
94
- if (state) {
95
- await FEATURE_HANDLERS[id].apply({
96
- previous: prev,
97
- next: state,
98
- secrets: applied.secrets,
99
- nonInteractive: true,
100
- });
101
- }
103
+ if (!state)
104
+ continue;
105
+ if (!parsed.yes)
106
+ await collectSecretsForFeature(id, applied.secrets);
107
+ await FEATURE_HANDLERS[id].apply({
108
+ previous: current.features[id],
109
+ next: state,
110
+ secrets: applied.secrets,
111
+ nonInteractive: parsed.yes,
112
+ });
102
113
  }
103
- for (const id of applied.disabledIds) {
114
+ for (const id of applied.disabledIds)
104
115
  await FEATURE_HANDLERS[id].disable({ purgeSecrets: false });
105
- }
106
116
  }
107
- else {
108
- await (await import("../gateway/setup.js")).setupGateway();
109
- return 0;
110
- }
111
- const { installBrowser } = await import("../core/browser/setup.js");
112
- await installBrowser(false);
113
117
  saveInstallFeatures(next);
114
118
  appendInstallLog(`setup installerVersion=${VERSION}`);
115
119
  console.log(`Writing ${getAgentDir()}/install-features.json`);
@@ -238,6 +242,7 @@ async function runProductUninstall(argv) {
238
242
  return 1;
239
243
  }
240
244
  }
245
+ await (await import("../gateway/service.js")).teardownGatewayService();
241
246
  if (existsSync(agentDir))
242
247
  rmSync(agentDir, { recursive: true, force: true });
243
248
  console.log(`purged ${agentDir}`);
@@ -246,7 +251,8 @@ async function runProductUninstall(argv) {
246
251
  console.log(`sessions, auth, and gateway config kept in ${agentDir}`);
247
252
  console.log(`Add --purge to delete that directory.`);
248
253
  }
249
- appendInstallLog(`uninstall npm purge=${purge}`);
254
+ if (!purge)
255
+ appendInstallLog("uninstall npm purge=false");
250
256
  return 0;
251
257
  }
252
258
  const prefix = resolveInstallPrefix();
@@ -261,6 +267,7 @@ async function runProductUninstall(argv) {
261
267
  return 1;
262
268
  }
263
269
  }
270
+ await (await import("../gateway/service.js")).teardownGatewayService();
264
271
  const versions = join(prefix, "versions");
265
272
  const bin = join(prefix, "bin");
266
273
  if (existsSync(versions))
@@ -273,7 +280,7 @@ async function runProductUninstall(argv) {
273
280
  rmSync(agentDir, { recursive: true, force: true });
274
281
  if (existsSync(prefix)) {
275
282
  try {
276
- rmSync(prefix, { recursive: true, force: true });
283
+ rmdirSync(prefix);
277
284
  }
278
285
  catch {
279
286
  // prefix may still hold unrelated files
@@ -285,7 +292,8 @@ async function runProductUninstall(argv) {
285
292
  console.log(`sessions, auth, and gateway config kept in ${agentDir}`);
286
293
  }
287
294
  console.log("Remove the PATH line from your shell profile if you added one.");
288
- appendInstallLog(`uninstall purge=${purge}`);
295
+ if (!purge)
296
+ appendInstallLog("uninstall purge=false");
289
297
  return 0;
290
298
  }
291
299
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"install-cli.js","sourceRoot":"","sources":["../../src/cli/install-cli.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Product install CLI: setup / features / uninstall (no source).\n * Intercepted before handlePackageCommand so `lunr uninstall` (no source)\n * is product uninstall and `lunr uninstall <source>` stays package-remove.\n */\n\nimport { existsSync, rmSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { createInterface } from \"node:readline\";\nimport { APP_NAME, getAgentDir, NPM_CLI_PACKAGE, VERSION } from \"../config.ts\";\nimport {\n\tappendInstallLog,\n\tapplyFeatureFlags,\n\tFEATURE_CATALOG,\n\tFEATURE_HANDLERS,\n\ttype FeatureId,\n\tgetFeatureSpec,\n\ttype InstallFeaturesFile,\n\tisProductUninstallArgv,\n\tloadInstallFeatures,\n\tparseFeatureFlags,\n\tsaveInstallFeatures,\n} from \"../core/install-features.ts\";\nimport { loadInstallLayout, resolveInstallPrefix } from \"../core/install-layout.ts\";\nimport { loadGatewayConfig } from \"../gateway/config.ts\";\nimport { readSecret } from \"./read-secret.ts\";\n\nfunction printSetupHelp(): void {\n\tconsole.log(`${APP_NAME} setup [--yes] [--feature <id>] [--no-feature <id>] [--set <id.option>=<value>] [--reconfigure]\n\nFirst-run / reconfigure optional features.\n\n${APP_NAME} features list\n${APP_NAME} features enable <id> [--set <id.option>=<value>]...\n${APP_NAME} features disable <id> [--purge-secrets]\n${APP_NAME} uninstall [--purge] [--yes] Remove this ${APP_NAME} install (keeps agent dir unless --purge)\n${APP_NAME} uninstall <source> [-l] Remove an extension package (alias for remove)\n`);\n}\n\nfunction printFeaturesHelp(): void {\n\tconsole.log(`${APP_NAME} features list\n${APP_NAME} features enable <id> [--set <id.option>=<value>]...\n${APP_NAME} features disable <id> [--purge-secrets]\n`);\n}\n\nasync function askYesNo(prompt: string, defaultYes: boolean): Promise<boolean> {\n\tif (!process.stdin.isTTY) return defaultYes;\n\tconst rl = createInterface({ input: process.stdin, output: process.stdout });\n\tconst suffix = defaultYes ? \"[Y/n]\" : \"[y/N]\";\n\tconst answer = await new Promise<string>((resolve) => {\n\t\trl.question(`${prompt} ${suffix} `, resolve);\n\t});\n\trl.close();\n\tconst trimmed = answer.trim().toLowerCase();\n\tif (trimmed === \"\") return defaultYes;\n\treturn trimmed === \"y\" || trimmed === \"yes\";\n}\n\nfunction fileTokenAlreadySet(optionId: string): boolean {\n\tconst cfg = loadGatewayConfig();\n\tif (optionId === \"telegram-token\") return Boolean(cfg.telegram.token);\n\tif (optionId === \"discord-token\") return Boolean(cfg.discord.token);\n\treturn false;\n}\n\nasync function collectSecretsForFeature(id: FeatureId, secrets: Record<string, string>): Promise<void> {\n\tconst spec = getFeatureSpec(id);\n\tif (!spec) return;\n\tfor (const option of spec.options) {\n\t\tif (option.type !== \"secret\") continue;\n\t\tif (fileTokenAlreadySet(option.id)) {\n\t\t\tconsole.log(` ${option.id}: token already set`);\n\t\t\tcontinue;\n\t\t}\n\t\tconst value = await readSecret(option.prompt);\n\t\tif (value) secrets[option.id] = value;\n\t}\n}\n\nasync function runSetup(argv: string[]): Promise<number> {\n\tconst parsed = parseFeatureFlags(argv);\n\tif (!parsed.ok) {\n\t\tconsole.error(parsed.error);\n\t\tprintSetupHelp();\n\t\treturn 2;\n\t}\n\tif (!parsed.yes && !process.stdin.isTTY) {\n\t\tconsole.error(\"non-interactive setup requires --yes\");\n\t\tprintSetupHelp();\n\t\treturn 2;\n\t}\n\n\tconst current = loadInstallFeatures();\n\tlet next = current;\n\n\tif (parsed.yes) {\n\t\tconst applied = applyFeatureFlags(current, parsed);\n\t\tif (!applied.ok) {\n\t\t\tconsole.error(applied.error);\n\t\t\treturn applied.exitCode;\n\t\t}\n\t\tnext = applied.next;\n\t\tfor (const id of applied.enabledIds) {\n\t\t\tconst prev = current.features[id];\n\t\t\tconst state = next.features[id];\n\t\t\tif (state) {\n\t\t\t\tawait FEATURE_HANDLERS[id].apply({\n\t\t\t\t\tprevious: prev,\n\t\t\t\t\tnext: state,\n\t\t\t\t\tsecrets: applied.secrets,\n\t\t\t\t\tnonInteractive: true,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\tfor (const id of applied.disabledIds) {\n\t\t\tawait FEATURE_HANDLERS[id].disable({ purgeSecrets: false });\n\t\t}\n\t} else {\n\t\tawait (await import(\"../gateway/setup.ts\")).setupGateway();\n\t\treturn 0;\n\t}\n\n\tconst { installBrowser } = await import(\"../core/browser/setup.ts\");\n\tawait installBrowser(false);\n\tsaveInstallFeatures(next);\n\tappendInstallLog(`setup installerVersion=${VERSION}`);\n\tconsole.log(`Writing ${getAgentDir()}/install-features.json`);\n\tconsole.log(\"\\nNext:\");\n\tconsole.log(` 1. Restart this shell (or add ${resolveInstallPrefix()}/bin to PATH)`);\n\tconsole.log(` 2. Run: ${APP_NAME}`);\n\tconsole.log(\" 3. In the TUI: /login\");\n\treturn 0;\n}\n\nasync function runFeatures(argv: string[]): Promise<number> {\n\tconst [sub, ...rest] = argv;\n\tif (!sub || sub === \"list\") {\n\t\tconst file = loadInstallFeatures();\n\t\tfor (const spec of FEATURE_CATALOG) {\n\t\t\tconst enabled = file.features[spec.id]?.enabled ?? spec.defaultEnabled;\n\t\t\tconsole.log(`${spec.id}: ${enabled ? \"enabled\" : \"disabled\"} — ${spec.summary}`);\n\t\t}\n\t\treturn 0;\n\t}\n\tif (sub === \"enable\") {\n\t\tconst id = rest[0];\n\t\tif (!id || !getFeatureSpec(id)) {\n\t\t\tconsole.error(id ? `unknown feature ${id}` : \"features enable requires an id\");\n\t\t\tprintFeaturesHelp();\n\t\t\treturn 2;\n\t\t}\n\t\tconst flagArgv = [\"--feature\", id, ...rest.slice(1)];\n\t\tconst parsed = parseFeatureFlags(flagArgv);\n\t\tif (!parsed.ok) {\n\t\t\tconsole.error(parsed.error);\n\t\t\treturn 2;\n\t\t}\n\t\tif (!parsed.yes && !process.stdin.isTTY && rest.slice(1).length === 0) {\n\t\t\t// --yes not required: enable with catalog defaults when non-interactive\n\t\t}\n\t\tconst current = loadInstallFeatures();\n\t\tconst applied = applyFeatureFlags(current, parsed);\n\t\tif (!applied.ok) {\n\t\t\tconsole.error(applied.error);\n\t\t\treturn applied.exitCode;\n\t\t}\n\t\tconst secrets: Record<string, string> = { ...applied.secrets };\n\t\tif (process.stdin.isTTY && !parsed.yes) {\n\t\t\tconst spec = getFeatureSpec(id);\n\t\t\tif (spec) {\n\t\t\t\tfor (const option of spec.options) {\n\t\t\t\t\tif (option.type !== \"boolean\") continue;\n\t\t\t\t\tif (applied.next.features[id]?.options[option.id] !== undefined) continue;\n\t\t\t\t\tconst currentBool =\n\t\t\t\t\t\ttypeof current.features[id]?.options[option.id] === \"boolean\"\n\t\t\t\t\t\t\t? (current.features[id].options[option.id] as boolean)\n\t\t\t\t\t\t\t: (option.default ?? false);\n\t\t\t\t\tconst value = await askYesNo(` ${option.prompt}`, currentBool);\n\t\t\t\t\tconst state = applied.next.features[id] ?? { enabled: true, options: {} };\n\t\t\t\t\tstate.options[option.id] = value;\n\t\t\t\t\tapplied.next.features[id] = state;\n\t\t\t\t}\n\t\t\t\tawait collectSecretsForFeature(id as FeatureId, secrets);\n\t\t\t}\n\t\t}\n\t\tconst state = applied.next.features[id];\n\t\tif (state) {\n\t\t\tawait FEATURE_HANDLERS[id as FeatureId].apply({\n\t\t\t\tprevious: current.features[id],\n\t\t\t\tnext: state,\n\t\t\t\tsecrets,\n\t\t\t\tnonInteractive: parsed.yes || !process.stdin.isTTY,\n\t\t\t});\n\t\t}\n\t\tsaveInstallFeatures(applied.next);\n\t\tappendInstallLog(`features enable ${id}`);\n\t\tconsole.log(`enabled ${id}`);\n\t\treturn 0;\n\t}\n\tif (sub === \"disable\") {\n\t\tconst id = rest[0];\n\t\tif (!id || !getFeatureSpec(id)) {\n\t\t\tconsole.error(id ? `unknown feature ${id}` : \"features disable requires an id\");\n\t\t\tprintFeaturesHelp();\n\t\t\treturn 2;\n\t\t}\n\t\tconst purgeSecrets = rest.includes(\"--purge-secrets\");\n\t\tconst current = loadInstallFeatures();\n\t\tconst prev = current.features[id];\n\t\tcurrent.features[id] = { enabled: false, options: { ...prev?.options } };\n\t\tcurrent.updatedAt = new Date().toISOString();\n\t\tawait FEATURE_HANDLERS[id as FeatureId].disable({ purgeSecrets });\n\t\tsaveInstallFeatures(current);\n\t\tappendInstallLog(`features disable ${id}`);\n\t\tconsole.log(`disabled ${id}`);\n\t\treturn 0;\n\t}\n\tif (sub === \"--help\" || sub === \"-h\") {\n\t\tprintFeaturesHelp();\n\t\treturn 0;\n\t}\n\tconsole.error(`unknown features subcommand ${sub}`);\n\tprintFeaturesHelp();\n\treturn 2;\n}\n\nfunction parseUninstallFlags(argv: string[]): { purge: boolean; yes: boolean } {\n\treturn {\n\t\tpurge: argv.includes(\"--purge\"),\n\t\tyes: argv.includes(\"--yes\") || argv.includes(\"-y\"),\n\t};\n}\n\nfunction isBinaryLayoutInstall(): boolean {\n\treturn loadInstallLayout() !== undefined;\n}\n\nasync function runProductUninstall(argv: string[]): Promise<number> {\n\tconst { purge, yes } = parseUninstallFlags(argv);\n\tconst agentDir = getAgentDir();\n\n\tif (!isBinaryLayoutInstall()) {\n\t\tconsole.log(`This looks like an npm install. Remove the CLI with:`);\n\t\tconsole.log(` npm rm -g ${NPM_CLI_PACKAGE}`);\n\t\tif (purge) {\n\t\t\tif (!yes && !process.stdin.isTTY) {\n\t\t\t\tconsole.error(\"non-interactive --purge requires --yes\");\n\t\t\t\treturn 2;\n\t\t\t}\n\t\t\tif (!yes) {\n\t\t\t\tconst ok = await askYesNo(`Also delete ${agentDir}? This cannot be undone.`, false);\n\t\t\t\tif (!ok) {\n\t\t\t\t\tconsole.log(\"aborted\");\n\t\t\t\t\treturn 1;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (existsSync(agentDir)) rmSync(agentDir, { recursive: true, force: true });\n\t\t\tconsole.log(`purged ${agentDir}`);\n\t\t} else {\n\t\t\tconsole.log(`sessions, auth, and gateway config kept in ${agentDir}`);\n\t\t\tconsole.log(`Add --purge to delete that directory.`);\n\t\t}\n\t\tappendInstallLog(`uninstall npm purge=${purge}`);\n\t\treturn 0;\n\t}\n\n\tconst prefix = resolveInstallPrefix();\n\n\tif (purge && !yes) {\n\t\tif (!process.stdin.isTTY) {\n\t\t\tconsole.error(\"non-interactive --purge requires --yes\");\n\t\t\treturn 2;\n\t\t}\n\t\tconst ok = await askYesNo(`Delete ${prefix} and ${agentDir}? This cannot be undone.`, false);\n\t\tif (!ok) {\n\t\t\tconsole.log(\"aborted\");\n\t\t\treturn 1;\n\t\t}\n\t}\n\n\tconst versions = join(prefix, \"versions\");\n\tconst bin = join(prefix, \"bin\");\n\tif (existsSync(versions)) rmSync(versions, { recursive: true, force: true });\n\tif (existsSync(bin)) rmSync(bin, { recursive: true, force: true });\n\tconsole.log(`removed ${versions} and ${bin}`);\n\n\tif (purge) {\n\t\tif (existsSync(agentDir)) rmSync(agentDir, { recursive: true, force: true });\n\t\tif (existsSync(prefix)) {\n\t\t\ttry {\n\t\t\t\trmSync(prefix, { recursive: true, force: true });\n\t\t\t} catch {\n\t\t\t\t// prefix may still hold unrelated files\n\t\t\t}\n\t\t}\n\t\tconsole.log(`purged ${agentDir}`);\n\t} else {\n\t\tconsole.log(`sessions, auth, and gateway config kept in ${agentDir}`);\n\t}\n\tconsole.log(\"Remove the PATH line from your shell profile if you added one.\");\n\tappendInstallLog(`uninstall purge=${purge}`);\n\treturn 0;\n}\n\n/**\n * Returns true when this argv was an install-cli verb that we handled.\n * `uninstall <source>` and package-manager flags are not claimed.\n */\nexport async function handleInstallCli(args: string[]): Promise<boolean> {\n\tconst [verb, ...rest] = args;\n\tif (verb === \"browser\") {\n\t\tif (rest.length !== 1 || rest[0] !== \"install\") {\n\t\t\tconsole.error(\"Usage: lunr browser install. Browser on/off is in /settings.\");\n\t\t\tprocess.exitCode = 2;\n\t\t} else {\n\t\t\tconst { installBrowser } = await import(\"../core/browser/setup.ts\");\n\t\t\tawait installBrowser();\n\t\t}\n\t\treturn true;\n\t}\n\tif (verb === \"setup\") {\n\t\tprocess.exitCode = await runSetup(rest);\n\t\treturn true;\n\t}\n\tif (verb === \"features\") {\n\t\tprocess.exitCode = await runFeatures(rest);\n\t\treturn true;\n\t}\n\tif (verb === \"uninstall\" && isProductUninstallArgv(rest)) {\n\t\tprocess.exitCode = await runProductUninstall(rest);\n\t\treturn true;\n\t}\n\treturn false;\n}\n\nexport type { InstallFeaturesFile };\n"]}
1
+ {"version":3,"file":"install-cli.js","sourceRoot":"","sources":["../../src/cli/install-cli.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Product install CLI: setup / features / uninstall (no source).\n * Intercepted before handlePackageCommand so `lunr uninstall` (no source)\n * is product uninstall and `lunr uninstall <source>` stays package-remove.\n */\n\nimport { existsSync, rmdirSync, rmSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { createInterface } from \"node:readline\";\nimport { APP_NAME, getAgentDir, NPM_CLI_PACKAGE, VERSION } from \"../config.ts\";\nimport {\n\tappendInstallLog,\n\tapplyFeatureFlags,\n\tFEATURE_CATALOG,\n\tFEATURE_HANDLERS,\n\ttype FeatureId,\n\tgetFeatureSpec,\n\ttype InstallFeaturesFile,\n\tisProductUninstallArgv,\n\tloadInstallFeatures,\n\tparseFeatureFlags,\n\tsaveInstallFeatures,\n} from \"../core/install-features.ts\";\nimport { loadInstallLayout, resolveInstallPrefix } from \"../core/install-layout.ts\";\nimport { loadGatewayConfig } from \"../gateway/config.ts\";\nimport { readSecret } from \"./read-secret.ts\";\n\nfunction printSetupHelp(): void {\n\tconsole.log(`${APP_NAME} setup [--yes] [--feature <id>] [--no-feature <id>] [--set <id.option>=<value>] [--reconfigure]\n\nFirst-run / reconfigure optional features.\n\n${APP_NAME} features list\n${APP_NAME} features enable <id> [--set <id.option>=<value>]...\n${APP_NAME} features disable <id> [--purge-secrets]\n${APP_NAME} uninstall [--purge] [--yes] Remove this ${APP_NAME} install (keeps agent dir unless --purge)\n${APP_NAME} uninstall <source> [-l] Remove an extension package (alias for remove)\n`);\n}\n\nfunction printFeaturesHelp(): void {\n\tconsole.log(`${APP_NAME} features list\n${APP_NAME} features enable <id> [--set <id.option>=<value>]...\n${APP_NAME} features disable <id> [--purge-secrets]\n`);\n}\n\nasync function askYesNo(prompt: string, defaultYes: boolean): Promise<boolean> {\n\tif (!process.stdin.isTTY) return defaultYes;\n\tconst rl = createInterface({ input: process.stdin, output: process.stdout });\n\tconst suffix = defaultYes ? \"[Y/n]\" : \"[y/N]\";\n\tconst answer = await new Promise<string>((resolve) => {\n\t\trl.question(`${prompt} ${suffix} `, resolve);\n\t});\n\trl.close();\n\tconst trimmed = answer.trim().toLowerCase();\n\tif (trimmed === \"\") return defaultYes;\n\treturn trimmed === \"y\" || trimmed === \"yes\";\n}\n\nfunction fileTokenAlreadySet(optionId: string): boolean {\n\tconst cfg = loadGatewayConfig();\n\tif (optionId === \"telegram-token\") return Boolean(cfg.telegram.token);\n\tif (optionId === \"discord-token\") return Boolean(cfg.discord.token);\n\treturn false;\n}\n\nasync function collectSecretsForFeature(id: FeatureId, secrets: Record<string, string>): Promise<void> {\n\tconst spec = getFeatureSpec(id);\n\tif (!spec) return;\n\tfor (const option of spec.options) {\n\t\tif (option.type !== \"secret\") continue;\n\t\tif (fileTokenAlreadySet(option.id)) {\n\t\t\tconsole.log(` ${option.id}: token already set`);\n\t\t\tcontinue;\n\t\t}\n\t\tconst value = await readSecret(option.prompt);\n\t\tif (value) secrets[option.id] = value;\n\t}\n}\n\nasync function runSetup(argv: string[]): Promise<number> {\n\tconst parsed = parseFeatureFlags(argv);\n\tif (!parsed.ok) {\n\t\tconsole.error(parsed.error);\n\t\tprintSetupHelp();\n\t\treturn 2;\n\t}\n\tif (!parsed.yes && !process.stdin.isTTY) {\n\t\tconsole.error(\"non-interactive setup requires --yes\");\n\t\tprintSetupHelp();\n\t\treturn 2;\n\t}\n\n\tconst current = loadInstallFeatures();\n\tconst applied = applyFeatureFlags(current, parsed);\n\tif (!applied.ok) {\n\t\tconsole.error(applied.error);\n\t\treturn applied.exitCode;\n\t}\n\tconst explicitFeatures = parsed.features.length > 0 || parsed.noFeatures.length > 0 || parsed.sets.length > 0;\n\tconst { installBrowser } = await import(\"../core/browser/setup.ts\");\n\tawait installBrowser(false);\n\tlet next = applied.next;\n\tif (!parsed.yes && !explicitFeatures) {\n\t\tawait (await import(\"../gateway/setup.ts\")).setupGateway();\n\t\t// Gateway setup persists its own feature choices. Do not overwrite them.\n\t\tnext = loadInstallFeatures();\n\t} else {\n\t\tconst enabled = new Set([...applied.enabledIds, ...parsed.sets.map((set) => getFeatureSpec(set.id)?.id)]);\n\t\tfor (const id of enabled) {\n\t\t\tif (!id) continue;\n\t\t\tconst state = next.features[id];\n\t\t\tif (!state) continue;\n\t\t\tif (!parsed.yes) await collectSecretsForFeature(id, applied.secrets);\n\t\t\tawait FEATURE_HANDLERS[id].apply({\n\t\t\t\tprevious: current.features[id],\n\t\t\t\tnext: state,\n\t\t\t\tsecrets: applied.secrets,\n\t\t\t\tnonInteractive: parsed.yes,\n\t\t\t});\n\t\t}\n\t\tfor (const id of applied.disabledIds) await FEATURE_HANDLERS[id].disable({ purgeSecrets: false });\n\t}\n\n\tsaveInstallFeatures(next);\n\tappendInstallLog(`setup installerVersion=${VERSION}`);\n\tconsole.log(`Writing ${getAgentDir()}/install-features.json`);\n\tconsole.log(\"\\nNext:\");\n\tconsole.log(` 1. Restart this shell (or add ${resolveInstallPrefix()}/bin to PATH)`);\n\tconsole.log(` 2. Run: ${APP_NAME}`);\n\tconsole.log(\" 3. In the TUI: /login\");\n\treturn 0;\n}\n\nasync function runFeatures(argv: string[]): Promise<number> {\n\tconst [sub, ...rest] = argv;\n\tif (!sub || sub === \"list\") {\n\t\tconst file = loadInstallFeatures();\n\t\tfor (const spec of FEATURE_CATALOG) {\n\t\t\tconst enabled = file.features[spec.id]?.enabled ?? spec.defaultEnabled;\n\t\t\tconsole.log(`${spec.id}: ${enabled ? \"enabled\" : \"disabled\"} — ${spec.summary}`);\n\t\t}\n\t\treturn 0;\n\t}\n\tif (sub === \"enable\") {\n\t\tconst id = rest[0];\n\t\tif (!id || !getFeatureSpec(id)) {\n\t\t\tconsole.error(id ? `unknown feature ${id}` : \"features enable requires an id\");\n\t\t\tprintFeaturesHelp();\n\t\t\treturn 2;\n\t\t}\n\t\tconst flagArgv = [\"--feature\", id, ...rest.slice(1)];\n\t\tconst parsed = parseFeatureFlags(flagArgv);\n\t\tif (!parsed.ok) {\n\t\t\tconsole.error(parsed.error);\n\t\t\treturn 2;\n\t\t}\n\t\tif (!parsed.yes && !process.stdin.isTTY && rest.slice(1).length === 0) {\n\t\t\t// --yes not required: enable with catalog defaults when non-interactive\n\t\t}\n\t\tconst current = loadInstallFeatures();\n\t\tconst applied = applyFeatureFlags(current, parsed);\n\t\tif (!applied.ok) {\n\t\t\tconsole.error(applied.error);\n\t\t\treturn applied.exitCode;\n\t\t}\n\t\tconst secrets: Record<string, string> = { ...applied.secrets };\n\t\tif (process.stdin.isTTY && !parsed.yes) {\n\t\t\tconst spec = getFeatureSpec(id);\n\t\t\tif (spec) {\n\t\t\t\tfor (const option of spec.options) {\n\t\t\t\t\tif (option.type !== \"boolean\") continue;\n\t\t\t\t\tif (applied.next.features[id]?.options[option.id] !== undefined) continue;\n\t\t\t\t\tconst currentBool =\n\t\t\t\t\t\ttypeof current.features[id]?.options[option.id] === \"boolean\"\n\t\t\t\t\t\t\t? (current.features[id].options[option.id] as boolean)\n\t\t\t\t\t\t\t: (option.default ?? false);\n\t\t\t\t\tconst value = await askYesNo(` ${option.prompt}`, currentBool);\n\t\t\t\t\tconst state = applied.next.features[id] ?? { enabled: true, options: {} };\n\t\t\t\t\tstate.options[option.id] = value;\n\t\t\t\t\tapplied.next.features[id] = state;\n\t\t\t\t}\n\t\t\t\tawait collectSecretsForFeature(id as FeatureId, secrets);\n\t\t\t}\n\t\t}\n\t\tconst state = applied.next.features[id];\n\t\tif (state) {\n\t\t\tawait FEATURE_HANDLERS[id as FeatureId].apply({\n\t\t\t\tprevious: current.features[id],\n\t\t\t\tnext: state,\n\t\t\t\tsecrets,\n\t\t\t\tnonInteractive: parsed.yes || !process.stdin.isTTY,\n\t\t\t});\n\t\t}\n\t\tsaveInstallFeatures(applied.next);\n\t\tappendInstallLog(`features enable ${id}`);\n\t\tconsole.log(`enabled ${id}`);\n\t\treturn 0;\n\t}\n\tif (sub === \"disable\") {\n\t\tconst id = rest[0];\n\t\tif (!id || !getFeatureSpec(id)) {\n\t\t\tconsole.error(id ? `unknown feature ${id}` : \"features disable requires an id\");\n\t\t\tprintFeaturesHelp();\n\t\t\treturn 2;\n\t\t}\n\t\tconst purgeSecrets = rest.includes(\"--purge-secrets\");\n\t\tconst current = loadInstallFeatures();\n\t\tconst prev = current.features[id];\n\t\tcurrent.features[id] = { enabled: false, options: { ...prev?.options } };\n\t\tcurrent.updatedAt = new Date().toISOString();\n\t\tawait FEATURE_HANDLERS[id as FeatureId].disable({ purgeSecrets });\n\t\tsaveInstallFeatures(current);\n\t\tappendInstallLog(`features disable ${id}`);\n\t\tconsole.log(`disabled ${id}`);\n\t\treturn 0;\n\t}\n\tif (sub === \"--help\" || sub === \"-h\") {\n\t\tprintFeaturesHelp();\n\t\treturn 0;\n\t}\n\tconsole.error(`unknown features subcommand ${sub}`);\n\tprintFeaturesHelp();\n\treturn 2;\n}\n\nfunction parseUninstallFlags(argv: string[]): { purge: boolean; yes: boolean } {\n\treturn {\n\t\tpurge: argv.includes(\"--purge\"),\n\t\tyes: argv.includes(\"--yes\") || argv.includes(\"-y\"),\n\t};\n}\n\nfunction isBinaryLayoutInstall(): boolean {\n\treturn loadInstallLayout() !== undefined;\n}\n\nasync function runProductUninstall(argv: string[]): Promise<number> {\n\tconst { purge, yes } = parseUninstallFlags(argv);\n\tconst agentDir = getAgentDir();\n\n\tif (!isBinaryLayoutInstall()) {\n\t\tconsole.log(`This looks like an npm install. Remove the CLI with:`);\n\t\tconsole.log(` npm rm -g ${NPM_CLI_PACKAGE}`);\n\t\tif (purge) {\n\t\t\tif (!yes && !process.stdin.isTTY) {\n\t\t\t\tconsole.error(\"non-interactive --purge requires --yes\");\n\t\t\t\treturn 2;\n\t\t\t}\n\t\t\tif (!yes) {\n\t\t\t\tconst ok = await askYesNo(`Also delete ${agentDir}? This cannot be undone.`, false);\n\t\t\t\tif (!ok) {\n\t\t\t\t\tconsole.log(\"aborted\");\n\t\t\t\t\treturn 1;\n\t\t\t\t}\n\t\t\t}\n\t\t\tawait (await import(\"../gateway/service.ts\")).teardownGatewayService();\n\t\t\tif (existsSync(agentDir)) rmSync(agentDir, { recursive: true, force: true });\n\t\t\tconsole.log(`purged ${agentDir}`);\n\t\t} else {\n\t\t\tconsole.log(`sessions, auth, and gateway config kept in ${agentDir}`);\n\t\t\tconsole.log(`Add --purge to delete that directory.`);\n\t\t}\n\t\tif (!purge) appendInstallLog(\"uninstall npm purge=false\");\n\t\treturn 0;\n\t}\n\n\tconst prefix = resolveInstallPrefix();\n\n\tif (purge && !yes) {\n\t\tif (!process.stdin.isTTY) {\n\t\t\tconsole.error(\"non-interactive --purge requires --yes\");\n\t\t\treturn 2;\n\t\t}\n\t\tconst ok = await askYesNo(`Delete ${prefix} and ${agentDir}? This cannot be undone.`, false);\n\t\tif (!ok) {\n\t\t\tconsole.log(\"aborted\");\n\t\t\treturn 1;\n\t\t}\n\t}\n\n\tawait (await import(\"../gateway/service.ts\")).teardownGatewayService();\n\tconst versions = join(prefix, \"versions\");\n\tconst bin = join(prefix, \"bin\");\n\tif (existsSync(versions)) rmSync(versions, { recursive: true, force: true });\n\tif (existsSync(bin)) rmSync(bin, { recursive: true, force: true });\n\tconsole.log(`removed ${versions} and ${bin}`);\n\n\tif (purge) {\n\t\tif (existsSync(agentDir)) rmSync(agentDir, { recursive: true, force: true });\n\t\tif (existsSync(prefix)) {\n\t\t\ttry {\n\t\t\t\trmdirSync(prefix);\n\t\t\t} catch {\n\t\t\t\t// prefix may still hold unrelated files\n\t\t\t}\n\t\t}\n\t\tconsole.log(`purged ${agentDir}`);\n\t} else {\n\t\tconsole.log(`sessions, auth, and gateway config kept in ${agentDir}`);\n\t}\n\tconsole.log(\"Remove the PATH line from your shell profile if you added one.\");\n\tif (!purge) appendInstallLog(\"uninstall purge=false\");\n\treturn 0;\n}\n\n/**\n * Returns true when this argv was an install-cli verb that we handled.\n * `uninstall <source>` and package-manager flags are not claimed.\n */\nexport async function handleInstallCli(args: string[]): Promise<boolean> {\n\tconst [verb, ...rest] = args;\n\tif (verb === \"browser\") {\n\t\tif (rest.length !== 1 || rest[0] !== \"install\") {\n\t\t\tconsole.error(\"Usage: lunr browser install. Browser on/off is in /settings.\");\n\t\t\tprocess.exitCode = 2;\n\t\t} else {\n\t\t\tconst { installBrowser } = await import(\"../core/browser/setup.ts\");\n\t\t\tawait installBrowser();\n\t\t}\n\t\treturn true;\n\t}\n\tif (verb === \"setup\") {\n\t\tprocess.exitCode = await runSetup(rest);\n\t\treturn true;\n\t}\n\tif (verb === \"features\") {\n\t\tprocess.exitCode = await runFeatures(rest);\n\t\treturn true;\n\t}\n\tif (verb === \"uninstall\" && isProductUninstallArgv(rest)) {\n\t\tprocess.exitCode = await runProductUninstall(rest);\n\t\treturn true;\n\t}\n\treturn false;\n}\n\nexport type { InstallFeaturesFile };\n"]}
@@ -54,11 +54,20 @@ export declare class AgentSessionRuntime {
54
54
  private _modelFallbackMessage?;
55
55
  private detached;
56
56
  private transferring;
57
+ private replacement?;
58
+ private teardown?;
59
+ private closing;
60
+ private withReplacement;
57
61
  get isDetached(): boolean;
62
+ /** Correlated prompt entry for scheduled hosts; never queues across a lifecycle change. */
63
+ promptWithCompletion(text: string, options?: Parameters<AgentSession["promptWithCompletion"]>[1]): Promise<{
64
+ messages: import("@ashx-j/lunr-agent").AgentMessage[];
65
+ }>;
58
66
  releaseForTransfer(options?: {
59
67
  stop?: boolean;
60
68
  signal?: AbortSignal;
61
69
  }): Promise<void>;
70
+ private releaseForTransferOwned;
62
71
  constructor(_session: AgentSession, _services: AgentSessionServices, createRuntime: CreateAgentSessionRuntimeFactory, _diagnostics?: AgentSessionRuntimeDiagnostic[], _modelFallbackMessage?: string, onRuntimeApplied?: AgentSessionRuntimeApplied);
63
72
  private createOwnedRuntime;
64
73
  get services(): AgentSessionServices;
@@ -89,6 +98,7 @@ export declare class AgentSessionRuntime {
89
98
  }): Promise<{
90
99
  cancelled: boolean;
91
100
  }>;
101
+ private switchSessionOwned;
92
102
  newSession(options?: {
93
103
  parentSession?: string;
94
104
  setup?: (sessionManager: SessionManager) => Promise<void>;
@@ -96,6 +106,7 @@ export declare class AgentSessionRuntime {
96
106
  }): Promise<{
97
107
  cancelled: boolean;
98
108
  }>;
109
+ private newSessionOwned;
99
110
  fork(entryId: string, options?: {
100
111
  position?: "before" | "at";
101
112
  withSession?: (ctx: ReplacedSessionContext) => Promise<void>;
@@ -103,6 +114,7 @@ export declare class AgentSessionRuntime {
103
114
  cancelled: boolean;
104
115
  selectedText?: string;
105
116
  }>;
117
+ private forkOwned;
106
118
  /**
107
119
  * Import a session JSONL file and switch runtime state to the imported session.
108
120
  *
@@ -113,6 +125,7 @@ export declare class AgentSessionRuntime {
113
125
  importFromJsonl(inputPath: string, cwdOverride?: string): Promise<{
114
126
  cancelled: boolean;
115
127
  }>;
128
+ private importFromJsonlOwned;
116
129
  dispose(): Promise<void>;
117
130
  }
118
131
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"agent-session-runtime.d.ts","sourceRoot":"","sources":["../../src/core/agent-session-runtime.ts"],"names":[],"mappings":"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","sourcesContent":["import { copyFileSync, existsSync, mkdirSync } from \"node:fs\";\nimport { basename, join } from \"node:path\";\nimport { resolvePath } from \"../utils/paths.ts\";\nimport type { AgentSession } from \"./agent-session.ts\";\nimport type { AgentSessionRuntimeDiagnostic, AgentSessionServices } from \"./agent-session-services.ts\";\nimport type {\n\tProjectTrustContext,\n\tReplacedSessionContext,\n\tSessionShutdownEvent,\n\tSessionStartEvent,\n} from \"./extensions/index.ts\";\nimport { emitSessionShutdownEvent } from \"./extensions/runner.ts\";\nimport * as processRegistry from \"./process-registry.ts\";\nimport type { CreateAgentSessionResult } from \"./sdk.ts\";\nimport { assertSessionCwdExists } from \"./session-cwd.ts\";\nimport { SessionTransferError } from \"./session-handoff.ts\";\nimport { SessionManager } from \"./session-manager.ts\";\nimport { canonicalSessionPath, SessionOwnership } from \"./session-ownership.ts\";\nimport { getSubagentCancellation } from \"./subagent-cancellation.ts\";\n\n/**\n * Result returned by runtime creation.\n *\n * The caller gets the created session, its cwd-bound services, and all\n * diagnostics collected during setup.\n */\nexport interface CreateAgentSessionRuntimeResult extends CreateAgentSessionResult {\n\tservices: AgentSessionServices;\n\tdiagnostics: AgentSessionRuntimeDiagnostic[];\n}\n\n/**\n * Creates a full runtime for a target cwd and session manager.\n *\n * The factory closes over process-global fixed inputs, recreates cwd-bound\n * services for the effective cwd, resolves session options against those\n * services, and finally creates the AgentSession.\n */\nexport type CreateAgentSessionRuntimeFactory = (options: {\n\tcwd: string;\n\tagentDir: string;\n\tsessionManager: SessionManager;\n\tsessionStartEvent?: SessionStartEvent;\n\tprojectTrustContext?: ProjectTrustContext;\n}) => Promise<CreateAgentSessionRuntimeResult>;\n\n/** Host callback for rebinding process-global state to the applied runtime. */\nexport type AgentSessionRuntimeApplied = (result: CreateAgentSessionRuntimeResult) => void;\n\n/**\n * Thrown when /import references a JSONL file path that does not exist.\n */\nexport class SessionImportFileNotFoundError extends Error {\n\treadonly filePath: string;\n\n\tconstructor(filePath: string) {\n\t\tsuper(`File not found: ${filePath}`);\n\t\tthis.name = \"SessionImportFileNotFoundError\";\n\t\tthis.filePath = filePath;\n\t}\n}\n\nfunction extractUserMessageText(content: string | Array<{ type: string; text?: string }>): string {\n\tif (typeof content === \"string\") {\n\t\treturn content;\n\t}\n\n\treturn content\n\t\t.filter((part): part is { type: \"text\"; text: string } => part.type === \"text\" && typeof part.text === \"string\")\n\t\t.map((part) => part.text)\n\t\t.join(\"\");\n}\n\n/**\n * Owns the current AgentSession plus its cwd-bound services.\n *\n * Session replacement methods tear down the current runtime first, then create\n * and apply the next runtime. If creation fails, the error is propagated to the\n * caller. The caller is responsible for user-facing error handling.\n */\nexport class AgentSessionRuntime {\n\tprivate rebindSession?: (session: AgentSession) => Promise<void>;\n\tprivate beforeSessionInvalidate?: (reason: SessionShutdownEvent[\"reason\"]) => void;\n\tprivate _session: AgentSession;\n\tprivate _services: AgentSessionServices;\n\tprivate readonly createRuntime: CreateAgentSessionRuntimeFactory;\n\tprivate readonly onRuntimeApplied?: AgentSessionRuntimeApplied;\n\tprivate _diagnostics: AgentSessionRuntimeDiagnostic[];\n\tprivate _modelFallbackMessage?: string;\n\tprivate detached = false;\n\tprivate transferring = false;\n\n\tget isDetached(): boolean {\n\t\treturn this.detached;\n\t}\n\n\tasync releaseForTransfer(options: { stop?: boolean; signal?: AbortSignal } = {}): Promise<void> {\n\t\toptions.signal?.throwIfAborted();\n\t\tif (this.detached) return;\n\t\tif (this.transferring) throw new SessionTransferError(\"Session transfer is already in progress.\", \"busy\");\n\t\tthis.transferring = true;\n\t\tthis.session.setTransferring(true);\n\t\tconst hasAttachedWork = () =>\n\t\t\tgetSubagentCancellation(this.session.sessionId)?.hasActiveRuns() ||\n\t\t\tgetSubagentCancellation(this.session.sessionFile ?? \"\")?.hasActiveRuns() ||\n\t\t\tprocessRegistry\n\t\t\t\t.list()\n\t\t\t\t.some(\n\t\t\t\t\t(entry) => entry.status !== \"exited\" && (!entry.sessionId || entry.sessionId === this.session.sessionId),\n\t\t\t\t);\n\t\tconst busy = () =>\n\t\t\tthis.session.isStreaming ||\n\t\t\tthis.session.isCompacting ||\n\t\t\tthis.session.isBashRunning ||\n\t\t\tthis.session.isRetrying ||\n\t\t\tthis.session.pendingMessageCount > 0;\n\t\ttry {\n\t\t\tif (hasAttachedWork())\n\t\t\t\tthrow new SessionTransferError(\n\t\t\t\t\t\"Live children or processes cannot move between runtimes. Wait for them to finish or stop them and retry.\",\n\t\t\t\t\t\"busy\",\n\t\t\t\t);\n\t\t\tif (busy() && !options.stop)\n\t\t\t\tthrow new SessionTransferError(\n\t\t\t\t\t\"Session is busy. Wait and retry, explicitly request stop, or cancel.\",\n\t\t\t\t\t\"busy\",\n\t\t\t\t);\n\t\t\tif (busy()) {\n\t\t\t\tthis.session.abortCompaction();\n\t\t\t\tthis.session.abortBranchSummary();\n\t\t\t\tthis.session.abortBash();\n\t\t\t\tthis.session.clearQueue();\n\t\t\t\tawait this.session.abort();\n\t\t\t}\n\t\t\tif (busy() || hasAttachedWork())\n\t\t\t\tthrow new SessionTransferError(\"Work has not stopped yet. Wait and retry.\", \"busy\");\n\t\t\toptions.signal?.throwIfAborted();\n\t\t\tthis.session.sessionManager.flush();\n\t\t\tawait this.teardownCurrent(\"resume\");\n\t\t} finally {\n\t\t\tthis.transferring = false;\n\t\t\tif (!this.detached) this.session.setTransferring(false);\n\t\t}\n\t}\n\n\tconstructor(\n\t\t_session: AgentSession,\n\t\t_services: AgentSessionServices,\n\t\tcreateRuntime: CreateAgentSessionRuntimeFactory,\n\t\t_diagnostics: AgentSessionRuntimeDiagnostic[] = [],\n\t\t_modelFallbackMessage?: string,\n\t\tonRuntimeApplied?: AgentSessionRuntimeApplied,\n\t) {\n\t\tthis._session = _session;\n\t\tthis._services = _services;\n\t\tthis.createRuntime = createRuntime;\n\t\tthis._diagnostics = _diagnostics;\n\t\tthis._modelFallbackMessage = _modelFallbackMessage;\n\t\tthis.onRuntimeApplied = onRuntimeApplied;\n\t}\n\n\tprivate async createOwnedRuntime(\n\t\toptions: Parameters<CreateAgentSessionRuntimeFactory>[0],\n\t): Promise<CreateAgentSessionRuntimeResult> {\n\t\ttry {\n\t\t\treturn await this.createRuntime(options);\n\t\t} catch (error) {\n\t\t\toptions.sessionManager.dispose();\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\tget services(): AgentSessionServices {\n\t\treturn this._services;\n\t}\n\n\tget session(): AgentSession {\n\t\treturn this._session;\n\t}\n\n\tget cwd(): string {\n\t\treturn this._services.cwd;\n\t}\n\n\tget diagnostics(): readonly AgentSessionRuntimeDiagnostic[] {\n\t\treturn this._diagnostics;\n\t}\n\n\tget modelFallbackMessage(): string | undefined {\n\t\treturn this._modelFallbackMessage;\n\t}\n\n\tsetRebindSession(rebindSession?: (session: AgentSession) => Promise<void>): void {\n\t\tthis.rebindSession = rebindSession;\n\t}\n\n\t/**\n\t * Set a synchronous callback that runs after `session_shutdown` handlers finish\n\t * but before the current session is invalidated.\n\t *\n\t * This is for host-owned UI teardown that must not yield to the event loop,\n\t * such as detaching extension-provided TUI components before the old extension\n\t * context becomes stale.\n\t */\n\tsetBeforeSessionInvalidate(beforeSessionInvalidate?: (reason: SessionShutdownEvent[\"reason\"]) => void): void {\n\t\tthis.beforeSessionInvalidate = beforeSessionInvalidate;\n\t}\n\n\tprivate async emitBeforeSwitch(\n\t\treason: \"new\" | \"resume\",\n\t\ttargetSessionFile?: string,\n\t): Promise<{ cancelled: boolean }> {\n\t\tconst runner = this.session.extensionRunner;\n\t\tif (!runner.hasHandlers(\"session_before_switch\")) {\n\t\t\treturn { cancelled: false };\n\t\t}\n\n\t\tconst result = await runner.emit({\n\t\t\ttype: \"session_before_switch\",\n\t\t\treason,\n\t\t\ttargetSessionFile,\n\t\t});\n\t\treturn { cancelled: result?.cancel === true };\n\t}\n\n\tprivate async emitBeforeFork(\n\t\tentryId: string,\n\t\toptions: { position: \"before\" | \"at\" },\n\t): Promise<{ cancelled: boolean }> {\n\t\tconst runner = this.session.extensionRunner;\n\t\tif (!runner.hasHandlers(\"session_before_fork\")) {\n\t\t\treturn { cancelled: false };\n\t\t}\n\n\t\tconst result = await runner.emit({\n\t\t\ttype: \"session_before_fork\",\n\t\t\tentryId,\n\t\t\t...options,\n\t\t});\n\t\treturn { cancelled: result?.cancel === true };\n\t}\n\n\tprivate async teardownCurrent(reason: SessionShutdownEvent[\"reason\"], targetSessionFile?: string): Promise<void> {\n\t\tif (this.detached) return;\n\t\tawait emitSessionShutdownEvent(this.session.extensionRunner, {\n\t\t\ttype: \"session_shutdown\",\n\t\t\treason,\n\t\t\ttargetSessionFile,\n\t\t});\n\t\tthis.beforeSessionInvalidate?.(reason);\n\t\tthis.session.dispose();\n\t\tthis.detached = true;\n\t}\n\n\tprivate async teardownForReplacement(\n\t\treason: SessionShutdownEvent[\"reason\"],\n\t\tsessionManager: SessionManager,\n\t): Promise<void> {\n\t\ttry {\n\t\t\tawait this.teardownCurrent(reason, sessionManager.getSessionFile());\n\t\t} catch (error) {\n\t\t\tsessionManager.dispose();\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\tprivate apply(result: CreateAgentSessionRuntimeResult): void {\n\t\tthis.detached = false;\n\t\tthis._session = result.session;\n\t\tthis._services = result.services;\n\t\tthis._diagnostics = result.diagnostics;\n\t\tthis._modelFallbackMessage = result.modelFallbackMessage;\n\t\tthis.onRuntimeApplied?.(result);\n\t}\n\n\tprivate async finishSessionReplacement(withSession?: (ctx: ReplacedSessionContext) => Promise<void>): Promise<void> {\n\t\tif (this.rebindSession) {\n\t\t\tawait this.rebindSession(this.session);\n\t\t}\n\t\tif (withSession) {\n\t\t\tawait withSession(this.session.createReplacedSessionContext());\n\t\t}\n\t}\n\n\tasync switchSession(\n\t\tsessionPath: string,\n\t\toptions?: {\n\t\t\tcwdOverride?: string;\n\t\t\twithSession?: (ctx: ReplacedSessionContext) => Promise<void>;\n\t\t\tprojectTrustContextFactory?: (cwd: string) => ProjectTrustContext;\n\t\t},\n\t): Promise<{ cancelled: boolean }> {\n\t\tif (\n\t\t\t!this.detached &&\n\t\t\tthis.session.sessionFile &&\n\t\t\tcanonicalSessionPath(sessionPath) === canonicalSessionPath(this.session.sessionFile)\n\t\t)\n\t\t\treturn { cancelled: false };\n\t\tconst beforeResult = this.detached ? { cancelled: false } : await this.emitBeforeSwitch(\"resume\", sessionPath);\n\t\tif (beforeResult.cancelled) {\n\t\t\treturn beforeResult;\n\t\t}\n\n\t\tconst previousSessionFile = this.session.sessionFile;\n\t\tconst sessionManager = SessionManager.open(sessionPath, undefined, options?.cwdOverride);\n\t\ttry {\n\t\t\tassertSessionCwdExists(sessionManager, this.cwd);\n\t\t} catch (error) {\n\t\t\tsessionManager.dispose();\n\t\t\tthrow error;\n\t\t}\n\t\tawait this.teardownForReplacement(\"resume\", sessionManager);\n\t\tthis.apply(\n\t\t\tawait this.createOwnedRuntime({\n\t\t\t\tcwd: sessionManager.getCwd(),\n\t\t\t\tagentDir: this.services.agentDir,\n\t\t\t\tsessionManager,\n\t\t\t\tsessionStartEvent: { type: \"session_start\", reason: \"resume\", previousSessionFile },\n\t\t\t\tprojectTrustContext: options?.projectTrustContextFactory?.(sessionManager.getCwd()),\n\t\t\t}),\n\t\t);\n\t\tawait this.finishSessionReplacement(options?.withSession);\n\t\treturn { cancelled: false };\n\t}\n\n\tasync newSession(options?: {\n\t\tparentSession?: string;\n\t\tsetup?: (sessionManager: SessionManager) => Promise<void>;\n\t\twithSession?: (ctx: ReplacedSessionContext) => Promise<void>;\n\t}): Promise<{ cancelled: boolean }> {\n\t\tconst beforeResult = await this.emitBeforeSwitch(\"new\");\n\t\tif (beforeResult.cancelled) {\n\t\t\treturn beforeResult;\n\t\t}\n\n\t\tconst previousSessionFile = this.session.sessionFile;\n\t\tconst sessionDir = this.session.sessionManager.getSessionDir();\n\t\tconst sessionManager = this.session.sessionManager.isPersisted()\n\t\t\t? SessionManager.create(this.cwd, sessionDir)\n\t\t\t: SessionManager.inMemory(this.cwd);\n\t\tif (options?.parentSession) {\n\t\t\tsessionManager.newSession({ parentSession: options.parentSession });\n\t\t}\n\n\t\tawait this.teardownForReplacement(\"new\", sessionManager);\n\t\tthis.apply(\n\t\t\tawait this.createOwnedRuntime({\n\t\t\t\tcwd: this.cwd,\n\t\t\t\tagentDir: this.services.agentDir,\n\t\t\t\tsessionManager,\n\t\t\t\tsessionStartEvent: { type: \"session_start\", reason: \"new\", previousSessionFile },\n\t\t\t}),\n\t\t);\n\t\tif (options?.setup) {\n\t\t\tawait options.setup(this.session.sessionManager);\n\t\t\tthis.session.agent.state.messages = this.session.sessionManager.buildSessionContext().messages;\n\t\t}\n\t\tawait this.finishSessionReplacement(options?.withSession);\n\t\treturn { cancelled: false };\n\t}\n\n\tasync fork(\n\t\tentryId: string,\n\t\toptions?: { position?: \"before\" | \"at\"; withSession?: (ctx: ReplacedSessionContext) => Promise<void> },\n\t): Promise<{ cancelled: boolean; selectedText?: string }> {\n\t\tconst position = options?.position ?? \"before\";\n\t\tconst beforeResult = await this.emitBeforeFork(entryId, { position });\n\t\tif (beforeResult.cancelled) {\n\t\t\treturn { cancelled: true };\n\t\t}\n\t\tlet targetLeafId: string | null;\n\t\tlet selectedText: string | undefined;\n\n\t\tconst selectedEntry = this.session.sessionManager.getEntry(entryId);\n\t\tif (!selectedEntry) {\n\t\t\tthrow new Error(\"Invalid entry ID for forking\");\n\t\t}\n\n\t\tif (position === \"at\") {\n\t\t\ttargetLeafId = selectedEntry.id;\n\t\t} else {\n\t\t\tif (selectedEntry.type !== \"message\" || selectedEntry.message.role !== \"user\") {\n\t\t\t\tthrow new Error(\"Invalid entry ID for forking\");\n\t\t\t}\n\t\t\ttargetLeafId = selectedEntry.parentId;\n\t\t\tselectedText = extractUserMessageText(selectedEntry.message.content);\n\t\t}\n\n\t\tconst previousSessionFile = this.session.sessionFile;\n\t\tif (this.session.sessionManager.isPersisted()) {\n\t\t\tconst currentSessionFile = this.session.sessionFile;\n\t\t\tif (!currentSessionFile) {\n\t\t\t\tthrow new Error(\"Persisted session is missing a session file\");\n\t\t\t}\n\t\t\tconst sessionDir = this.session.sessionManager.getSessionDir();\n\t\t\tif (!targetLeafId) {\n\t\t\t\tconst sessionManager = SessionManager.create(this.cwd, sessionDir);\n\t\t\t\tsessionManager.newSession({ parentSession: currentSessionFile });\n\t\t\t\tawait this.teardownForReplacement(\"fork\", sessionManager);\n\t\t\t\tthis.apply(\n\t\t\t\t\tawait this.createOwnedRuntime({\n\t\t\t\t\t\tcwd: this.cwd,\n\t\t\t\t\t\tagentDir: this.services.agentDir,\n\t\t\t\t\t\tsessionManager,\n\t\t\t\t\t\tsessionStartEvent: { type: \"session_start\", reason: \"fork\", previousSessionFile },\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t\tawait this.finishSessionReplacement(options?.withSession);\n\t\t\t\treturn { cancelled: false, selectedText };\n\t\t\t}\n\n\t\t\tif (!existsSync(currentSessionFile)) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t\"This session has not been saved yet. Wait for the first assistant response before cloning or forking it.\",\n\t\t\t\t);\n\t\t\t}\n\t\t\tconst sessionManager = SessionManager.forkBranch(currentSessionFile, targetLeafId, sessionDir);\n\t\t\tconst forkedSessionPath = sessionManager.getSessionFile();\n\t\t\tif (!forkedSessionPath) {\n\t\t\t\tthrow new Error(\"Failed to create forked session\");\n\t\t\t}\n\t\t\tawait this.teardownForReplacement(\"fork\", sessionManager);\n\t\t\tthis.apply(\n\t\t\t\tawait this.createOwnedRuntime({\n\t\t\t\t\tcwd: sessionManager.getCwd(),\n\t\t\t\t\tagentDir: this.services.agentDir,\n\t\t\t\t\tsessionManager,\n\t\t\t\t\tsessionStartEvent: { type: \"session_start\", reason: \"fork\", previousSessionFile },\n\t\t\t\t}),\n\t\t\t);\n\t\t\tawait this.finishSessionReplacement(options?.withSession);\n\t\t\treturn { cancelled: false, selectedText };\n\t\t}\n\n\t\tconst sessionManager = this.session.sessionManager.copyInMemory();\n\t\tif (!targetLeafId) {\n\t\t\tsessionManager.newSession({ parentSession: this.session.sessionFile });\n\t\t} else {\n\t\t\tsessionManager.createBranchedSession(targetLeafId);\n\t\t}\n\t\tawait this.teardownForReplacement(\"fork\", sessionManager);\n\t\tthis.apply(\n\t\t\tawait this.createOwnedRuntime({\n\t\t\t\tcwd: this.cwd,\n\t\t\t\tagentDir: this.services.agentDir,\n\t\t\t\tsessionManager,\n\t\t\t\tsessionStartEvent: { type: \"session_start\", reason: \"fork\", previousSessionFile },\n\t\t\t}),\n\t\t);\n\t\tawait this.finishSessionReplacement(options?.withSession);\n\t\treturn { cancelled: false, selectedText };\n\t}\n\n\t/**\n\t * Import a session JSONL file and switch runtime state to the imported session.\n\t *\n\t * @returns `{ cancelled: true }` when cancelled by `session_before_switch`, otherwise `{ cancelled: false }`.\n\t * @throws {SessionImportFileNotFoundError} When the input path does not exist.\n\t * @throws {MissingSessionCwdError} When the imported session cwd cannot be resolved and no override is provided.\n\t */\n\tasync importFromJsonl(inputPath: string, cwdOverride?: string): Promise<{ cancelled: boolean }> {\n\t\tconst resolvedPath = resolvePath(inputPath);\n\t\tif (!existsSync(resolvedPath)) {\n\t\t\tthrow new SessionImportFileNotFoundError(resolvedPath);\n\t\t}\n\n\t\tconst sessionDir = this.session.sessionManager.getSessionDir();\n\t\tif (!existsSync(sessionDir)) {\n\t\t\tmkdirSync(sessionDir, { recursive: true });\n\t\t}\n\n\t\tconst destinationPath = join(sessionDir, basename(resolvedPath));\n\t\tconst beforeResult = await this.emitBeforeSwitch(\"resume\", destinationPath);\n\t\tif (beforeResult.cancelled) {\n\t\t\treturn beforeResult;\n\t\t}\n\n\t\tconst previousSessionFile = this.session.sessionFile;\n\t\tif (canonicalSessionPath(destinationPath) !== canonicalSessionPath(resolvedPath)) {\n\t\t\tconst ownership = new SessionOwnership(destinationPath);\n\t\t\ttry {\n\t\t\t\tcopyFileSync(resolvedPath, destinationPath);\n\t\t\t} finally {\n\t\t\t\townership.release();\n\t\t\t}\n\t\t}\n\n\t\tconst sessionManager = SessionManager.open(destinationPath, sessionDir, cwdOverride);\n\t\ttry {\n\t\t\tassertSessionCwdExists(sessionManager, this.cwd);\n\t\t} catch (error) {\n\t\t\tsessionManager.dispose();\n\t\t\tthrow error;\n\t\t}\n\t\tawait this.teardownForReplacement(\"resume\", sessionManager);\n\t\tthis.apply(\n\t\t\tawait this.createOwnedRuntime({\n\t\t\t\tcwd: sessionManager.getCwd(),\n\t\t\t\tagentDir: this.services.agentDir,\n\t\t\t\tsessionManager,\n\t\t\t\tsessionStartEvent: { type: \"session_start\", reason: \"resume\", previousSessionFile },\n\t\t\t}),\n\t\t);\n\t\tawait this.finishSessionReplacement();\n\t\treturn { cancelled: false };\n\t}\n\n\tasync dispose(): Promise<void> {\n\t\tawait this.teardownCurrent(\"quit\");\n\t}\n}\n\n/**\n * Create the initial runtime from a runtime factory and initial session target.\n *\n * The same factory is stored on the returned AgentSessionRuntime and reused for\n * later /new, /resume, /fork, and import flows.\n */\nexport async function createAgentSessionRuntime(\n\tcreateRuntime: CreateAgentSessionRuntimeFactory,\n\toptions: {\n\t\tcwd: string;\n\t\tagentDir: string;\n\t\tsessionManager: SessionManager;\n\t\tsessionStartEvent?: SessionStartEvent;\n\t\tonRuntimeApplied?: AgentSessionRuntimeApplied;\n\t},\n): Promise<AgentSessionRuntime> {\n\tlet result: CreateAgentSessionRuntimeResult;\n\ttry {\n\t\tassertSessionCwdExists(options.sessionManager, options.cwd);\n\t\tresult = await createRuntime(options);\n\t} catch (error) {\n\t\toptions.sessionManager.dispose();\n\t\tthrow error;\n\t}\n\tconst runtime = new AgentSessionRuntime(\n\t\tresult.session,\n\t\tresult.services,\n\t\tcreateRuntime,\n\t\tresult.diagnostics,\n\t\tresult.modelFallbackMessage,\n\t\toptions.onRuntimeApplied,\n\t);\n\toptions.onRuntimeApplied?.(result);\n\treturn runtime;\n}\n\nexport {\n\ttype AgentSessionRuntimeDiagnostic,\n\ttype AgentSessionServices,\n\ttype CreateAgentSessionFromServicesOptions,\n\ttype CreateAgentSessionServicesOptions,\n\tcreateAgentSessionFromServices,\n\tcreateAgentSessionServices,\n} from \"./agent-session-services.ts\";\n"]}
1
+ {"version":3,"file":"agent-session-runtime.d.ts","sourceRoot":"","sources":["../../src/core/agent-session-runtime.ts"],"names":[],"mappings":"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","sourcesContent":["import { copyFileSync, existsSync, mkdirSync } from \"node:fs\";\nimport { basename, join } from \"node:path\";\nimport { resolvePath } from \"../utils/paths.ts\";\nimport type { AgentSession } from \"./agent-session.ts\";\nimport type { AgentSessionRuntimeDiagnostic, AgentSessionServices } from \"./agent-session-services.ts\";\nimport type {\n\tProjectTrustContext,\n\tReplacedSessionContext,\n\tSessionShutdownEvent,\n\tSessionStartEvent,\n} from \"./extensions/index.ts\";\nimport { emitSessionShutdownEvent } from \"./extensions/runner.ts\";\nimport * as processRegistry from \"./process-registry.ts\";\nimport type { CreateAgentSessionResult } from \"./sdk.ts\";\nimport { assertSessionCwdExists } from \"./session-cwd.ts\";\nimport { SessionTransferError } from \"./session-handoff.ts\";\nimport { SessionManager } from \"./session-manager.ts\";\nimport { canonicalSessionPath, SessionOwnership } from \"./session-ownership.ts\";\nimport { getSubagentCancellation } from \"./subagent-cancellation.ts\";\n\n/**\n * Result returned by runtime creation.\n *\n * The caller gets the created session, its cwd-bound services, and all\n * diagnostics collected during setup.\n */\nexport interface CreateAgentSessionRuntimeResult extends CreateAgentSessionResult {\n\tservices: AgentSessionServices;\n\tdiagnostics: AgentSessionRuntimeDiagnostic[];\n}\n\n/**\n * Creates a full runtime for a target cwd and session manager.\n *\n * The factory closes over process-global fixed inputs, recreates cwd-bound\n * services for the effective cwd, resolves session options against those\n * services, and finally creates the AgentSession.\n */\nexport type CreateAgentSessionRuntimeFactory = (options: {\n\tcwd: string;\n\tagentDir: string;\n\tsessionManager: SessionManager;\n\tsessionStartEvent?: SessionStartEvent;\n\tprojectTrustContext?: ProjectTrustContext;\n}) => Promise<CreateAgentSessionRuntimeResult>;\n\n/** Host callback for rebinding process-global state to the applied runtime. */\nexport type AgentSessionRuntimeApplied = (result: CreateAgentSessionRuntimeResult) => void;\n\n/**\n * Thrown when /import references a JSONL file path that does not exist.\n */\nexport class SessionImportFileNotFoundError extends Error {\n\treadonly filePath: string;\n\n\tconstructor(filePath: string) {\n\t\tsuper(`File not found: ${filePath}`);\n\t\tthis.name = \"SessionImportFileNotFoundError\";\n\t\tthis.filePath = filePath;\n\t}\n}\n\nfunction extractUserMessageText(content: string | Array<{ type: string; text?: string }>): string {\n\tif (typeof content === \"string\") {\n\t\treturn content;\n\t}\n\n\treturn content\n\t\t.filter((part): part is { type: \"text\"; text: string } => part.type === \"text\" && typeof part.text === \"string\")\n\t\t.map((part) => part.text)\n\t\t.join(\"\");\n}\n\n/**\n * Owns the current AgentSession plus its cwd-bound services.\n *\n * Session replacement methods tear down the current runtime first, then create\n * and apply the next runtime. If creation fails, the error is propagated to the\n * caller. The caller is responsible for user-facing error handling.\n */\nexport class AgentSessionRuntime {\n\tprivate rebindSession?: (session: AgentSession) => Promise<void>;\n\tprivate beforeSessionInvalidate?: (reason: SessionShutdownEvent[\"reason\"]) => void;\n\tprivate _session: AgentSession;\n\tprivate _services: AgentSessionServices;\n\tprivate readonly createRuntime: CreateAgentSessionRuntimeFactory;\n\tprivate readonly onRuntimeApplied?: AgentSessionRuntimeApplied;\n\tprivate _diagnostics: AgentSessionRuntimeDiagnostic[];\n\tprivate _modelFallbackMessage?: string;\n\tprivate detached = false;\n\tprivate transferring = false;\n\tprivate replacement?: Promise<unknown>;\n\tprivate teardown?: Promise<void>;\n\tprivate closing = false;\n\n\tprivate async withReplacement<T>(operation: () => Promise<T>): Promise<T> {\n\t\tif (this.closing || this.replacement || this.transferring)\n\t\t\tthrow new Error(\"Session lifecycle change is already in progress.\");\n\t\t// Start after reserving the lifecycle slot, before any extension hook can yield.\n\t\tconst promise = Promise.resolve().then(operation);\n\t\tthis.replacement = promise;\n\t\ttry {\n\t\t\treturn await promise;\n\t\t} finally {\n\t\t\tif (this.replacement === promise) this.replacement = undefined;\n\t\t}\n\t}\n\n\tget isDetached(): boolean {\n\t\treturn this.detached;\n\t}\n\n\t/** Correlated prompt entry for scheduled hosts; never queues across a lifecycle change. */\n\tpromptWithCompletion(text: string, options?: Parameters<AgentSession[\"promptWithCompletion\"]>[1]) {\n\t\tif (this.detached || this.closing || this.replacement || this.transferring) {\n\t\t\treturn Promise.reject(new Error(\"Session lifecycle change is in progress. Retry the scheduled prompt later.\"));\n\t\t}\n\t\treturn this.session.promptWithCompletion(text, options);\n\t}\n\n\tasync releaseForTransfer(options: { stop?: boolean; signal?: AbortSignal } = {}): Promise<void> {\n\t\tif (this.closing || this.replacement || this.transferring)\n\t\t\tthrow new SessionTransferError(\"Session transfer is already in progress.\", \"busy\");\n\t\treturn this.withReplacement(() => this.releaseForTransferOwned(options));\n\t}\n\n\tprivate async releaseForTransferOwned(options: { stop?: boolean; signal?: AbortSignal }): Promise<void> {\n\t\toptions.signal?.throwIfAborted();\n\t\tif (this.detached) return;\n\t\tif (this.closing || this.transferring)\n\t\t\tthrow new SessionTransferError(\"Session transfer is already in progress.\", \"busy\");\n\t\tthis.transferring = true;\n\t\tthis.session.setTransferring(true);\n\t\tconst hasAttachedWork = () =>\n\t\t\tgetSubagentCancellation(this.session.sessionId)?.hasActiveRuns() ||\n\t\t\tgetSubagentCancellation(this.session.sessionFile ?? \"\")?.hasActiveRuns() ||\n\t\t\tprocessRegistry\n\t\t\t\t.list()\n\t\t\t\t.some(\n\t\t\t\t\t(entry) => entry.status !== \"exited\" && (!entry.sessionId || entry.sessionId === this.session.sessionId),\n\t\t\t\t);\n\t\tconst busy = () =>\n\t\t\tthis.session.isStreaming ||\n\t\t\tthis.session.isCompacting ||\n\t\t\tthis.session.isBashRunning ||\n\t\t\tthis.session.isRetrying ||\n\t\t\tthis.session.pendingMessageCount > 0;\n\t\ttry {\n\t\t\tif (hasAttachedWork())\n\t\t\t\tthrow new SessionTransferError(\n\t\t\t\t\t\"Live children or processes cannot move between runtimes. Wait for them to finish or stop them and retry.\",\n\t\t\t\t\t\"busy\",\n\t\t\t\t);\n\t\t\tif (busy() && !options.stop)\n\t\t\t\tthrow new SessionTransferError(\n\t\t\t\t\t\"Session is busy. Wait and retry, explicitly request stop, or cancel.\",\n\t\t\t\t\t\"busy\",\n\t\t\t\t);\n\t\t\tif (busy()) {\n\t\t\t\tthis.session.abortCompaction();\n\t\t\t\tthis.session.abortBranchSummary();\n\t\t\t\tthis.session.abortBash();\n\t\t\t\tthis.session.clearQueue();\n\t\t\t\tawait this.session.abort();\n\t\t\t}\n\t\t\tif (busy() || hasAttachedWork())\n\t\t\t\tthrow new SessionTransferError(\"Work has not stopped yet. Wait and retry.\", \"busy\");\n\t\t\toptions.signal?.throwIfAborted();\n\t\t\tthis.session.sessionManager.flush();\n\t\t\tawait this.teardownCurrent(\"resume\");\n\t\t} finally {\n\t\t\tthis.transferring = false;\n\t\t\tif (!this.detached) this.session.setTransferring(false);\n\t\t}\n\t}\n\n\tconstructor(\n\t\t_session: AgentSession,\n\t\t_services: AgentSessionServices,\n\t\tcreateRuntime: CreateAgentSessionRuntimeFactory,\n\t\t_diagnostics: AgentSessionRuntimeDiagnostic[] = [],\n\t\t_modelFallbackMessage?: string,\n\t\tonRuntimeApplied?: AgentSessionRuntimeApplied,\n\t) {\n\t\tthis._session = _session;\n\t\tthis._services = _services;\n\t\tthis.createRuntime = createRuntime;\n\t\tthis._diagnostics = _diagnostics;\n\t\tthis._modelFallbackMessage = _modelFallbackMessage;\n\t\tthis.onRuntimeApplied = onRuntimeApplied;\n\t}\n\n\tprivate async createOwnedRuntime(\n\t\toptions: Parameters<CreateAgentSessionRuntimeFactory>[0],\n\t): Promise<CreateAgentSessionRuntimeResult> {\n\t\ttry {\n\t\t\treturn await this.createRuntime(options);\n\t\t} catch (error) {\n\t\t\toptions.sessionManager.dispose();\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\tget services(): AgentSessionServices {\n\t\treturn this._services;\n\t}\n\n\tget session(): AgentSession {\n\t\treturn this._session;\n\t}\n\n\tget cwd(): string {\n\t\treturn this._services.cwd;\n\t}\n\n\tget diagnostics(): readonly AgentSessionRuntimeDiagnostic[] {\n\t\treturn this._diagnostics;\n\t}\n\n\tget modelFallbackMessage(): string | undefined {\n\t\treturn this._modelFallbackMessage;\n\t}\n\n\tsetRebindSession(rebindSession?: (session: AgentSession) => Promise<void>): void {\n\t\tthis.rebindSession = rebindSession;\n\t}\n\n\t/**\n\t * Set a synchronous callback that runs after `session_shutdown` handlers finish\n\t * but before the current session is invalidated.\n\t *\n\t * This is for host-owned UI teardown that must not yield to the event loop,\n\t * such as detaching extension-provided TUI components before the old extension\n\t * context becomes stale.\n\t */\n\tsetBeforeSessionInvalidate(beforeSessionInvalidate?: (reason: SessionShutdownEvent[\"reason\"]) => void): void {\n\t\tthis.beforeSessionInvalidate = beforeSessionInvalidate;\n\t}\n\n\tprivate async emitBeforeSwitch(\n\t\treason: \"new\" | \"resume\",\n\t\ttargetSessionFile?: string,\n\t): Promise<{ cancelled: boolean }> {\n\t\tconst runner = this.session.extensionRunner;\n\t\tif (!runner.hasHandlers(\"session_before_switch\")) {\n\t\t\treturn { cancelled: false };\n\t\t}\n\n\t\tconst result = await runner.emit({\n\t\t\ttype: \"session_before_switch\",\n\t\t\treason,\n\t\t\ttargetSessionFile,\n\t\t});\n\t\treturn { cancelled: result?.cancel === true };\n\t}\n\n\tprivate async emitBeforeFork(\n\t\tentryId: string,\n\t\toptions: { position: \"before\" | \"at\" },\n\t): Promise<{ cancelled: boolean }> {\n\t\tconst runner = this.session.extensionRunner;\n\t\tif (!runner.hasHandlers(\"session_before_fork\")) {\n\t\t\treturn { cancelled: false };\n\t\t}\n\n\t\tconst result = await runner.emit({\n\t\t\ttype: \"session_before_fork\",\n\t\t\tentryId,\n\t\t\t...options,\n\t\t});\n\t\treturn { cancelled: result?.cancel === true };\n\t}\n\n\tprivate teardownCurrent(reason: SessionShutdownEvent[\"reason\"], targetSessionFile?: string): Promise<void> {\n\t\tif (this.teardown) return this.teardown;\n\t\tif (this.detached) return Promise.resolve();\n\t\tconst session = this.session;\n\t\tsession.stopAdmission();\n\t\tthis.teardown = (async () => {\n\t\t\tawait session.drain();\n\t\t\ttry {\n\t\t\t\tawait emitSessionShutdownEvent(session.extensionRunner, {\n\t\t\t\t\ttype: \"session_shutdown\",\n\t\t\t\t\treason,\n\t\t\t\t\ttargetSessionFile,\n\t\t\t\t});\n\t\t\t} finally {\n\t\t\t\ttry {\n\t\t\t\t\tthis.beforeSessionInvalidate?.(reason);\n\t\t\t\t} finally {\n\t\t\t\t\tawait session.shutdown();\n\t\t\t\t\tthis.detached = true;\n\t\t\t\t}\n\t\t\t}\n\t\t})();\n\t\treturn this.teardown;\n\t}\n\n\tprivate async teardownForReplacement(\n\t\treason: SessionShutdownEvent[\"reason\"],\n\t\tsessionManager: SessionManager,\n\t): Promise<void> {\n\t\ttry {\n\t\t\tawait this.teardownCurrent(reason, sessionManager.getSessionFile());\n\t\t} catch (error) {\n\t\t\tsessionManager.dispose();\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\tprivate apply(result: CreateAgentSessionRuntimeResult): void {\n\t\tthis.detached = false;\n\t\tthis.teardown = undefined;\n\t\tthis._session = result.session;\n\t\tif (this.closing) this._session.stopAdmission();\n\t\tthis._services = result.services;\n\t\tthis._diagnostics = result.diagnostics;\n\t\tthis._modelFallbackMessage = result.modelFallbackMessage;\n\t\tthis.onRuntimeApplied?.(result);\n\t}\n\n\tprivate async finishSessionReplacement(withSession?: (ctx: ReplacedSessionContext) => Promise<void>): Promise<void> {\n\t\tif (this.rebindSession) {\n\t\t\tawait this.rebindSession(this.session);\n\t\t}\n\t\tif (withSession) {\n\t\t\tawait withSession(this.session.createReplacedSessionContext());\n\t\t}\n\t}\n\n\tasync switchSession(\n\t\tsessionPath: string,\n\t\toptions?: {\n\t\t\tcwdOverride?: string;\n\t\t\twithSession?: (ctx: ReplacedSessionContext) => Promise<void>;\n\t\t\tprojectTrustContextFactory?: (cwd: string) => ProjectTrustContext;\n\t\t},\n\t): Promise<{ cancelled: boolean }> {\n\t\treturn this.withReplacement(() => this.switchSessionOwned(sessionPath, options));\n\t}\n\n\tprivate async switchSessionOwned(\n\t\tsessionPath: string,\n\t\toptions?: Parameters<AgentSessionRuntime[\"switchSession\"]>[1],\n\t): Promise<{ cancelled: boolean }> {\n\t\tif (\n\t\t\t!this.detached &&\n\t\t\tthis.session.sessionFile &&\n\t\t\tcanonicalSessionPath(sessionPath) === canonicalSessionPath(this.session.sessionFile)\n\t\t)\n\t\t\treturn { cancelled: false };\n\t\tconst beforeResult = this.detached ? { cancelled: false } : await this.emitBeforeSwitch(\"resume\", sessionPath);\n\t\tif (beforeResult.cancelled) {\n\t\t\treturn beforeResult;\n\t\t}\n\n\t\tconst previousSessionFile = this.session.sessionFile;\n\t\tconst sessionManager = SessionManager.open(sessionPath, undefined, options?.cwdOverride);\n\t\ttry {\n\t\t\tassertSessionCwdExists(sessionManager, this.cwd);\n\t\t} catch (error) {\n\t\t\tsessionManager.dispose();\n\t\t\tthrow error;\n\t\t}\n\t\tawait this.teardownForReplacement(\"resume\", sessionManager);\n\t\tthis.apply(\n\t\t\tawait this.createOwnedRuntime({\n\t\t\t\tcwd: sessionManager.getCwd(),\n\t\t\t\tagentDir: this.services.agentDir,\n\t\t\t\tsessionManager,\n\t\t\t\tsessionStartEvent: { type: \"session_start\", reason: \"resume\", previousSessionFile },\n\t\t\t\tprojectTrustContext: options?.projectTrustContextFactory?.(sessionManager.getCwd()),\n\t\t\t}),\n\t\t);\n\t\tawait this.finishSessionReplacement(options?.withSession);\n\t\treturn { cancelled: false };\n\t}\n\n\tasync newSession(options?: {\n\t\tparentSession?: string;\n\t\tsetup?: (sessionManager: SessionManager) => Promise<void>;\n\t\twithSession?: (ctx: ReplacedSessionContext) => Promise<void>;\n\t}): Promise<{ cancelled: boolean }> {\n\t\treturn this.withReplacement(() => this.newSessionOwned(options));\n\t}\n\n\tprivate async newSessionOwned(\n\t\toptions?: Parameters<AgentSessionRuntime[\"newSession\"]>[0],\n\t): Promise<{ cancelled: boolean }> {\n\t\tconst beforeResult = await this.emitBeforeSwitch(\"new\");\n\t\tif (beforeResult.cancelled) {\n\t\t\treturn beforeResult;\n\t\t}\n\n\t\tconst previousSessionFile = this.session.sessionFile;\n\t\tconst sessionDir = this.session.sessionManager.getSessionDir();\n\t\tconst sessionManager = this.session.sessionManager.isPersisted()\n\t\t\t? SessionManager.create(this.cwd, sessionDir)\n\t\t\t: SessionManager.inMemory(this.cwd);\n\t\tif (options?.parentSession) {\n\t\t\tsessionManager.newSession({ parentSession: options.parentSession });\n\t\t}\n\n\t\tawait this.teardownForReplacement(\"new\", sessionManager);\n\t\tthis.apply(\n\t\t\tawait this.createOwnedRuntime({\n\t\t\t\tcwd: this.cwd,\n\t\t\t\tagentDir: this.services.agentDir,\n\t\t\t\tsessionManager,\n\t\t\t\tsessionStartEvent: { type: \"session_start\", reason: \"new\", previousSessionFile },\n\t\t\t}),\n\t\t);\n\t\tif (options?.setup) {\n\t\t\tawait options.setup(this.session.sessionManager);\n\t\t\tthis.session.agent.state.messages = this.session.sessionManager.buildSessionContext().messages;\n\t\t}\n\t\tawait this.finishSessionReplacement(options?.withSession);\n\t\treturn { cancelled: false };\n\t}\n\n\tasync fork(\n\t\tentryId: string,\n\t\toptions?: {\n\t\t\tposition?: \"before\" | \"at\";\n\t\t\twithSession?: (ctx: ReplacedSessionContext) => Promise<void>;\n\t\t},\n\t): Promise<{ cancelled: boolean; selectedText?: string }> {\n\t\treturn this.withReplacement(() => this.forkOwned(entryId, options));\n\t}\n\n\tprivate async forkOwned(\n\t\tentryId: string,\n\t\toptions?: Parameters<AgentSessionRuntime[\"fork\"]>[1],\n\t): Promise<{ cancelled: boolean; selectedText?: string }> {\n\t\tconst position = options?.position ?? \"before\";\n\t\tconst beforeResult = await this.emitBeforeFork(entryId, { position });\n\t\tif (beforeResult.cancelled) {\n\t\t\treturn { cancelled: true };\n\t\t}\n\t\tlet targetLeafId: string | null;\n\t\tlet selectedText: string | undefined;\n\n\t\tconst selectedEntry = this.session.sessionManager.getEntry(entryId);\n\t\tif (!selectedEntry) {\n\t\t\tthrow new Error(\"Invalid entry ID for forking\");\n\t\t}\n\n\t\tif (position === \"at\") {\n\t\t\ttargetLeafId = selectedEntry.id;\n\t\t} else {\n\t\t\tif (selectedEntry.type !== \"message\" || selectedEntry.message.role !== \"user\") {\n\t\t\t\tthrow new Error(\"Invalid entry ID for forking\");\n\t\t\t}\n\t\t\ttargetLeafId = selectedEntry.parentId;\n\t\t\tselectedText = extractUserMessageText(selectedEntry.message.content);\n\t\t}\n\n\t\tconst previousSessionFile = this.session.sessionFile;\n\t\tif (this.session.sessionManager.isPersisted()) {\n\t\t\tconst currentSessionFile = this.session.sessionFile;\n\t\t\tif (!currentSessionFile) {\n\t\t\t\tthrow new Error(\"Persisted session is missing a session file\");\n\t\t\t}\n\t\t\tconst sessionDir = this.session.sessionManager.getSessionDir();\n\t\t\tif (!targetLeafId) {\n\t\t\t\tconst sessionManager = SessionManager.create(this.cwd, sessionDir);\n\t\t\t\tsessionManager.newSession({ parentSession: currentSessionFile });\n\t\t\t\tawait this.teardownForReplacement(\"fork\", sessionManager);\n\t\t\t\tthis.apply(\n\t\t\t\t\tawait this.createOwnedRuntime({\n\t\t\t\t\t\tcwd: this.cwd,\n\t\t\t\t\t\tagentDir: this.services.agentDir,\n\t\t\t\t\t\tsessionManager,\n\t\t\t\t\t\tsessionStartEvent: { type: \"session_start\", reason: \"fork\", previousSessionFile },\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t\tawait this.finishSessionReplacement(options?.withSession);\n\t\t\t\treturn { cancelled: false, selectedText };\n\t\t\t}\n\n\t\t\tif (!existsSync(currentSessionFile)) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t\"This session has not been saved yet. Wait for the first assistant response before cloning or forking it.\",\n\t\t\t\t);\n\t\t\t}\n\t\t\tconst sessionManager = SessionManager.forkBranch(currentSessionFile, targetLeafId, sessionDir);\n\t\t\tconst forkedSessionPath = sessionManager.getSessionFile();\n\t\t\tif (!forkedSessionPath) {\n\t\t\t\tthrow new Error(\"Failed to create forked session\");\n\t\t\t}\n\t\t\tawait this.teardownForReplacement(\"fork\", sessionManager);\n\t\t\tthis.apply(\n\t\t\t\tawait this.createOwnedRuntime({\n\t\t\t\t\tcwd: sessionManager.getCwd(),\n\t\t\t\t\tagentDir: this.services.agentDir,\n\t\t\t\t\tsessionManager,\n\t\t\t\t\tsessionStartEvent: { type: \"session_start\", reason: \"fork\", previousSessionFile },\n\t\t\t\t}),\n\t\t\t);\n\t\t\tawait this.finishSessionReplacement(options?.withSession);\n\t\t\treturn { cancelled: false, selectedText };\n\t\t}\n\n\t\tconst sessionManager = this.session.sessionManager.copyInMemory();\n\t\tif (!targetLeafId) {\n\t\t\tsessionManager.newSession({ parentSession: this.session.sessionFile });\n\t\t} else {\n\t\t\tsessionManager.createBranchedSession(targetLeafId);\n\t\t}\n\t\tawait this.teardownForReplacement(\"fork\", sessionManager);\n\t\tthis.apply(\n\t\t\tawait this.createOwnedRuntime({\n\t\t\t\tcwd: this.cwd,\n\t\t\t\tagentDir: this.services.agentDir,\n\t\t\t\tsessionManager,\n\t\t\t\tsessionStartEvent: { type: \"session_start\", reason: \"fork\", previousSessionFile },\n\t\t\t}),\n\t\t);\n\t\tawait this.finishSessionReplacement(options?.withSession);\n\t\treturn { cancelled: false, selectedText };\n\t}\n\n\t/**\n\t * Import a session JSONL file and switch runtime state to the imported session.\n\t *\n\t * @returns `{ cancelled: true }` when cancelled by `session_before_switch`, otherwise `{ cancelled: false }`.\n\t * @throws {SessionImportFileNotFoundError} When the input path does not exist.\n\t * @throws {MissingSessionCwdError} When the imported session cwd cannot be resolved and no override is provided.\n\t */\n\tasync importFromJsonl(inputPath: string, cwdOverride?: string): Promise<{ cancelled: boolean }> {\n\t\treturn this.withReplacement(() => this.importFromJsonlOwned(inputPath, cwdOverride));\n\t}\n\n\tprivate async importFromJsonlOwned(inputPath: string, cwdOverride?: string): Promise<{ cancelled: boolean }> {\n\t\tconst resolvedPath = resolvePath(inputPath);\n\t\tif (!existsSync(resolvedPath)) {\n\t\t\tthrow new SessionImportFileNotFoundError(resolvedPath);\n\t\t}\n\n\t\tconst sessionDir = this.session.sessionManager.getSessionDir();\n\t\tif (!existsSync(sessionDir)) {\n\t\t\tmkdirSync(sessionDir, { recursive: true });\n\t\t}\n\n\t\tconst destinationPath = join(sessionDir, basename(resolvedPath));\n\t\tconst beforeResult = await this.emitBeforeSwitch(\"resume\", destinationPath);\n\t\tif (beforeResult.cancelled) {\n\t\t\treturn beforeResult;\n\t\t}\n\n\t\tconst previousSessionFile = this.session.sessionFile;\n\t\tif (canonicalSessionPath(destinationPath) !== canonicalSessionPath(resolvedPath)) {\n\t\t\tconst ownership = new SessionOwnership(destinationPath);\n\t\t\ttry {\n\t\t\t\tcopyFileSync(resolvedPath, destinationPath);\n\t\t\t} finally {\n\t\t\t\townership.release();\n\t\t\t}\n\t\t}\n\n\t\tconst sessionManager = SessionManager.open(destinationPath, sessionDir, cwdOverride);\n\t\ttry {\n\t\t\tassertSessionCwdExists(sessionManager, this.cwd);\n\t\t} catch (error) {\n\t\t\tsessionManager.dispose();\n\t\t\tthrow error;\n\t\t}\n\t\tawait this.teardownForReplacement(\"resume\", sessionManager);\n\t\tthis.apply(\n\t\t\tawait this.createOwnedRuntime({\n\t\t\t\tcwd: sessionManager.getCwd(),\n\t\t\t\tagentDir: this.services.agentDir,\n\t\t\t\tsessionManager,\n\t\t\t\tsessionStartEvent: { type: \"session_start\", reason: \"resume\", previousSessionFile },\n\t\t\t}),\n\t\t);\n\t\tawait this.finishSessionReplacement();\n\t\treturn { cancelled: false };\n\t}\n\n\tasync dispose(): Promise<void> {\n\t\tthis.closing = true;\n\t\tthis.session.stopAdmission();\n\t\tif (this.replacement) await this.replacement.catch(() => {});\n\t\tawait this.teardownCurrent(\"quit\");\n\t}\n}\n\n/**\n * Create the initial runtime from a runtime factory and initial session target.\n *\n * The same factory is stored on the returned AgentSessionRuntime and reused for\n * later /new, /resume, /fork, and import flows.\n */\nexport async function createAgentSessionRuntime(\n\tcreateRuntime: CreateAgentSessionRuntimeFactory,\n\toptions: {\n\t\tcwd: string;\n\t\tagentDir: string;\n\t\tsessionManager: SessionManager;\n\t\tsessionStartEvent?: SessionStartEvent;\n\t\tonRuntimeApplied?: AgentSessionRuntimeApplied;\n\t},\n): Promise<AgentSessionRuntime> {\n\tlet result: CreateAgentSessionRuntimeResult;\n\ttry {\n\t\tassertSessionCwdExists(options.sessionManager, options.cwd);\n\t\tresult = await createRuntime(options);\n\t} catch (error) {\n\t\toptions.sessionManager.dispose();\n\t\tthrow error;\n\t}\n\tconst runtime = new AgentSessionRuntime(\n\t\tresult.session,\n\t\tresult.services,\n\t\tcreateRuntime,\n\t\tresult.diagnostics,\n\t\tresult.modelFallbackMessage,\n\t\toptions.onRuntimeApplied,\n\t);\n\toptions.onRuntimeApplied?.(result);\n\treturn runtime;\n}\n\nexport {\n\ttype AgentSessionRuntimeDiagnostic,\n\ttype AgentSessionServices,\n\ttype CreateAgentSessionFromServicesOptions,\n\ttype CreateAgentSessionServicesOptions,\n\tcreateAgentSessionFromServices,\n\tcreateAgentSessionServices,\n} from \"./agent-session-services.ts\";\n"]}
@@ -46,14 +46,43 @@ export class AgentSessionRuntime {
46
46
  _modelFallbackMessage;
47
47
  detached = false;
48
48
  transferring = false;
49
+ replacement;
50
+ teardown;
51
+ closing = false;
52
+ async withReplacement(operation) {
53
+ if (this.closing || this.replacement || this.transferring)
54
+ throw new Error("Session lifecycle change is already in progress.");
55
+ // Start after reserving the lifecycle slot, before any extension hook can yield.
56
+ const promise = Promise.resolve().then(operation);
57
+ this.replacement = promise;
58
+ try {
59
+ return await promise;
60
+ }
61
+ finally {
62
+ if (this.replacement === promise)
63
+ this.replacement = undefined;
64
+ }
65
+ }
49
66
  get isDetached() {
50
67
  return this.detached;
51
68
  }
69
+ /** Correlated prompt entry for scheduled hosts; never queues across a lifecycle change. */
70
+ promptWithCompletion(text, options) {
71
+ if (this.detached || this.closing || this.replacement || this.transferring) {
72
+ return Promise.reject(new Error("Session lifecycle change is in progress. Retry the scheduled prompt later."));
73
+ }
74
+ return this.session.promptWithCompletion(text, options);
75
+ }
52
76
  async releaseForTransfer(options = {}) {
77
+ if (this.closing || this.replacement || this.transferring)
78
+ throw new SessionTransferError("Session transfer is already in progress.", "busy");
79
+ return this.withReplacement(() => this.releaseForTransferOwned(options));
80
+ }
81
+ async releaseForTransferOwned(options) {
53
82
  options.signal?.throwIfAborted();
54
83
  if (this.detached)
55
84
  return;
56
- if (this.transferring)
85
+ if (this.closing || this.transferring)
57
86
  throw new SessionTransferError("Session transfer is already in progress.", "busy");
58
87
  this.transferring = true;
59
88
  this.session.setTransferring(true);
@@ -161,17 +190,33 @@ export class AgentSessionRuntime {
161
190
  });
162
191
  return { cancelled: result?.cancel === true };
163
192
  }
164
- async teardownCurrent(reason, targetSessionFile) {
193
+ teardownCurrent(reason, targetSessionFile) {
194
+ if (this.teardown)
195
+ return this.teardown;
165
196
  if (this.detached)
166
- return;
167
- await emitSessionShutdownEvent(this.session.extensionRunner, {
168
- type: "session_shutdown",
169
- reason,
170
- targetSessionFile,
171
- });
172
- this.beforeSessionInvalidate?.(reason);
173
- this.session.dispose();
174
- this.detached = true;
197
+ return Promise.resolve();
198
+ const session = this.session;
199
+ session.stopAdmission();
200
+ this.teardown = (async () => {
201
+ await session.drain();
202
+ try {
203
+ await emitSessionShutdownEvent(session.extensionRunner, {
204
+ type: "session_shutdown",
205
+ reason,
206
+ targetSessionFile,
207
+ });
208
+ }
209
+ finally {
210
+ try {
211
+ this.beforeSessionInvalidate?.(reason);
212
+ }
213
+ finally {
214
+ await session.shutdown();
215
+ this.detached = true;
216
+ }
217
+ }
218
+ })();
219
+ return this.teardown;
175
220
  }
176
221
  async teardownForReplacement(reason, sessionManager) {
177
222
  try {
@@ -184,7 +229,10 @@ export class AgentSessionRuntime {
184
229
  }
185
230
  apply(result) {
186
231
  this.detached = false;
232
+ this.teardown = undefined;
187
233
  this._session = result.session;
234
+ if (this.closing)
235
+ this._session.stopAdmission();
188
236
  this._services = result.services;
189
237
  this._diagnostics = result.diagnostics;
190
238
  this._modelFallbackMessage = result.modelFallbackMessage;
@@ -199,6 +247,9 @@ export class AgentSessionRuntime {
199
247
  }
200
248
  }
201
249
  async switchSession(sessionPath, options) {
250
+ return this.withReplacement(() => this.switchSessionOwned(sessionPath, options));
251
+ }
252
+ async switchSessionOwned(sessionPath, options) {
202
253
  if (!this.detached &&
203
254
  this.session.sessionFile &&
204
255
  canonicalSessionPath(sessionPath) === canonicalSessionPath(this.session.sessionFile))
@@ -228,6 +279,9 @@ export class AgentSessionRuntime {
228
279
  return { cancelled: false };
229
280
  }
230
281
  async newSession(options) {
282
+ return this.withReplacement(() => this.newSessionOwned(options));
283
+ }
284
+ async newSessionOwned(options) {
231
285
  const beforeResult = await this.emitBeforeSwitch("new");
232
286
  if (beforeResult.cancelled) {
233
287
  return beforeResult;
@@ -255,6 +309,9 @@ export class AgentSessionRuntime {
255
309
  return { cancelled: false };
256
310
  }
257
311
  async fork(entryId, options) {
312
+ return this.withReplacement(() => this.forkOwned(entryId, options));
313
+ }
314
+ async forkOwned(entryId, options) {
258
315
  const position = options?.position ?? "before";
259
316
  const beforeResult = await this.emitBeforeFork(entryId, { position });
260
317
  if (beforeResult.cancelled) {
@@ -339,6 +396,9 @@ export class AgentSessionRuntime {
339
396
  * @throws {MissingSessionCwdError} When the imported session cwd cannot be resolved and no override is provided.
340
397
  */
341
398
  async importFromJsonl(inputPath, cwdOverride) {
399
+ return this.withReplacement(() => this.importFromJsonlOwned(inputPath, cwdOverride));
400
+ }
401
+ async importFromJsonlOwned(inputPath, cwdOverride) {
342
402
  const resolvedPath = resolvePath(inputPath);
343
403
  if (!existsSync(resolvedPath)) {
344
404
  throw new SessionImportFileNotFoundError(resolvedPath);
@@ -381,6 +441,10 @@ export class AgentSessionRuntime {
381
441
  return { cancelled: false };
382
442
  }
383
443
  async dispose() {
444
+ this.closing = true;
445
+ this.session.stopAdmission();
446
+ if (this.replacement)
447
+ await this.replacement.catch(() => { });
384
448
  await this.teardownCurrent("quit");
385
449
  }
386
450
  }