@ashx-j/lunr 0.2.25 → 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 (729) hide show
  1. package/CHANGELOG.md +31 -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/index.d.ts.map +1 -1
  12. package/dist/builtin-extensions/index.js +1 -0
  13. package/dist/builtin-extensions/index.js.map +1 -1
  14. package/dist/builtin-extensions/lunr-computer-use.d.ts +3 -0
  15. package/dist/builtin-extensions/lunr-computer-use.d.ts.map +1 -0
  16. package/dist/builtin-extensions/lunr-computer-use.js +179 -0
  17. package/dist/builtin-extensions/lunr-computer-use.js.map +1 -0
  18. package/dist/builtin-extensions/lunr-cron.d.ts +4 -5
  19. package/dist/builtin-extensions/lunr-cron.d.ts.map +1 -1
  20. package/dist/builtin-extensions/lunr-cron.js +94 -108
  21. package/dist/builtin-extensions/lunr-cron.js.map +1 -1
  22. package/dist/builtin-extensions/lunr-local-providers/local-servers.d.ts.map +1 -1
  23. package/dist/builtin-extensions/lunr-local-providers/local-servers.js +3 -1
  24. package/dist/builtin-extensions/lunr-local-providers/local-servers.js.map +1 -1
  25. package/dist/builtin-extensions/narumiruna-pi-goal/src/commands.d.ts.map +1 -1
  26. package/dist/builtin-extensions/narumiruna-pi-goal/src/commands.js +2 -2
  27. package/dist/builtin-extensions/narumiruna-pi-goal/src/commands.js.map +1 -1
  28. package/dist/builtin-extensions/narumiruna-pi-goal/src/goal.d.ts.map +1 -1
  29. package/dist/builtin-extensions/narumiruna-pi-goal/src/goal.js +1 -1
  30. package/dist/builtin-extensions/narumiruna-pi-goal/src/goal.js.map +1 -1
  31. package/dist/builtin-extensions/narumiruna-pi-goal/src/runtime.d.ts.map +1 -1
  32. package/dist/builtin-extensions/narumiruna-pi-goal/src/runtime.js +1 -1
  33. package/dist/builtin-extensions/narumiruna-pi-goal/src/runtime.js.map +1 -1
  34. package/dist/builtin-extensions/pi-intercom/index.d.ts.map +1 -1
  35. package/dist/builtin-extensions/pi-intercom/index.js +2 -2
  36. package/dist/builtin-extensions/pi-intercom/index.js.map +1 -1
  37. package/dist/builtin-extensions/pi-lsp-extension/bemol-extension/index.d.ts +1 -1
  38. package/dist/builtin-extensions/pi-lsp-extension/bemol-extension/index.d.ts.map +1 -1
  39. package/dist/builtin-extensions/pi-lsp-extension/bemol-extension/index.js +1 -1
  40. package/dist/builtin-extensions/pi-lsp-extension/bemol-extension/index.js.map +1 -1
  41. package/dist/builtin-extensions/pi-lsp-extension/src/index.d.ts.map +1 -1
  42. package/dist/builtin-extensions/pi-lsp-extension/src/index.js +1 -15
  43. package/dist/builtin-extensions/pi-lsp-extension/src/index.js.map +1 -1
  44. package/dist/builtin-extensions/pi-lsp-extension/src/lsp-client.d.ts +6 -0
  45. package/dist/builtin-extensions/pi-lsp-extension/src/lsp-client.d.ts.map +1 -1
  46. package/dist/builtin-extensions/pi-lsp-extension/src/lsp-client.js +187 -132
  47. package/dist/builtin-extensions/pi-lsp-extension/src/lsp-client.js.map +1 -1
  48. package/dist/builtin-extensions/pi-lsp-extension/src/lsp-manager.d.ts +8 -0
  49. package/dist/builtin-extensions/pi-lsp-extension/src/lsp-manager.d.ts.map +1 -1
  50. package/dist/builtin-extensions/pi-lsp-extension/src/lsp-manager.js +142 -112
  51. package/dist/builtin-extensions/pi-lsp-extension/src/lsp-manager.js.map +1 -1
  52. package/dist/builtin-extensions/pi-lsp-extension/src/tools/code-rewrite.d.ts +12 -1
  53. package/dist/builtin-extensions/pi-lsp-extension/src/tools/code-rewrite.d.ts.map +1 -1
  54. package/dist/builtin-extensions/pi-lsp-extension/src/tools/code-rewrite.js +14 -7
  55. package/dist/builtin-extensions/pi-lsp-extension/src/tools/code-rewrite.js.map +1 -1
  56. package/dist/builtin-extensions/pi-lsp-extension/src/tree-sitter/rewrite-engine.d.ts +11 -3
  57. package/dist/builtin-extensions/pi-lsp-extension/src/tree-sitter/rewrite-engine.d.ts.map +1 -1
  58. package/dist/builtin-extensions/pi-lsp-extension/src/tree-sitter/rewrite-engine.js +67 -41
  59. package/dist/builtin-extensions/pi-lsp-extension/src/tree-sitter/rewrite-engine.js.map +1 -1
  60. package/dist/builtin-extensions/pi-lsp-extension/src/tree-sitter/search-engine.d.ts +4 -2
  61. package/dist/builtin-extensions/pi-lsp-extension/src/tree-sitter/search-engine.d.ts.map +1 -1
  62. package/dist/builtin-extensions/pi-lsp-extension/src/tree-sitter/search-engine.js +3 -0
  63. package/dist/builtin-extensions/pi-lsp-extension/src/tree-sitter/search-engine.js.map +1 -1
  64. package/dist/builtin-extensions/pi-mcp-adapter/commands.d.ts +2 -1
  65. package/dist/builtin-extensions/pi-mcp-adapter/commands.d.ts.map +1 -1
  66. package/dist/builtin-extensions/pi-mcp-adapter/commands.js +6 -6
  67. package/dist/builtin-extensions/pi-mcp-adapter/commands.js.map +1 -1
  68. package/dist/builtin-extensions/pi-mcp-adapter/config.d.ts +1 -1
  69. package/dist/builtin-extensions/pi-mcp-adapter/config.d.ts.map +1 -1
  70. package/dist/builtin-extensions/pi-mcp-adapter/config.js +11 -5
  71. package/dist/builtin-extensions/pi-mcp-adapter/config.js.map +1 -1
  72. package/dist/builtin-extensions/pi-mcp-adapter/direct-tool-executor.d.ts.map +1 -1
  73. package/dist/builtin-extensions/pi-mcp-adapter/direct-tool-executor.js +2 -2
  74. package/dist/builtin-extensions/pi-mcp-adapter/direct-tool-executor.js.map +1 -1
  75. package/dist/builtin-extensions/pi-mcp-adapter/host-html-template.d.ts.map +1 -1
  76. package/dist/builtin-extensions/pi-mcp-adapter/host-html-template.js +1 -1
  77. package/dist/builtin-extensions/pi-mcp-adapter/host-html-template.js.map +1 -1
  78. package/dist/builtin-extensions/pi-mcp-adapter/index.d.ts.map +1 -1
  79. package/dist/builtin-extensions/pi-mcp-adapter/index.js +48 -40
  80. package/dist/builtin-extensions/pi-mcp-adapter/index.js.map +1 -1
  81. package/dist/builtin-extensions/pi-mcp-adapter/init.d.ts.map +1 -1
  82. package/dist/builtin-extensions/pi-mcp-adapter/init.js +3 -1
  83. package/dist/builtin-extensions/pi-mcp-adapter/init.js.map +1 -1
  84. package/dist/builtin-extensions/pi-mcp-adapter/mcp-auth-flow.d.ts +12 -40
  85. package/dist/builtin-extensions/pi-mcp-adapter/mcp-auth-flow.d.ts.map +1 -1
  86. package/dist/builtin-extensions/pi-mcp-adapter/mcp-auth-flow.js +166 -235
  87. package/dist/builtin-extensions/pi-mcp-adapter/mcp-auth-flow.js.map +1 -1
  88. package/dist/builtin-extensions/pi-mcp-adapter/mcp-callback-server.d.ts +5 -0
  89. package/dist/builtin-extensions/pi-mcp-adapter/mcp-callback-server.d.ts.map +1 -1
  90. package/dist/builtin-extensions/pi-mcp-adapter/mcp-callback-server.js +43 -13
  91. package/dist/builtin-extensions/pi-mcp-adapter/mcp-callback-server.js.map +1 -1
  92. package/dist/builtin-extensions/pi-mcp-adapter/mcp-oauth-provider.d.ts +14 -3
  93. package/dist/builtin-extensions/pi-mcp-adapter/mcp-oauth-provider.d.ts.map +1 -1
  94. package/dist/builtin-extensions/pi-mcp-adapter/mcp-oauth-provider.js +73 -21
  95. package/dist/builtin-extensions/pi-mcp-adapter/mcp-oauth-provider.js.map +1 -1
  96. package/dist/builtin-extensions/pi-mcp-adapter/proxy-modes.d.ts.map +1 -1
  97. package/dist/builtin-extensions/pi-mcp-adapter/proxy-modes.js +4 -4
  98. package/dist/builtin-extensions/pi-mcp-adapter/proxy-modes.js.map +1 -1
  99. package/dist/builtin-extensions/pi-mcp-adapter/server-manager.d.ts.map +1 -1
  100. package/dist/builtin-extensions/pi-mcp-adapter/server-manager.js +2 -2
  101. package/dist/builtin-extensions/pi-mcp-adapter/server-manager.js.map +1 -1
  102. package/dist/builtin-extensions/pi-mcp-adapter/state.d.ts +2 -0
  103. package/dist/builtin-extensions/pi-mcp-adapter/state.d.ts.map +1 -1
  104. package/dist/builtin-extensions/pi-mcp-adapter/state.js.map +1 -1
  105. package/dist/builtin-extensions/pi-ollama-cloud/index.d.ts +1 -1
  106. package/dist/builtin-extensions/pi-ollama-cloud/index.d.ts.map +1 -1
  107. package/dist/builtin-extensions/pi-ollama-cloud/index.js +1 -1
  108. package/dist/builtin-extensions/pi-ollama-cloud/index.js.map +1 -1
  109. package/dist/builtin-extensions/pi-ollama-cloud/models.d.ts +11 -5
  110. package/dist/builtin-extensions/pi-ollama-cloud/models.d.ts.map +1 -1
  111. package/dist/builtin-extensions/pi-ollama-cloud/models.js +12 -32
  112. package/dist/builtin-extensions/pi-ollama-cloud/models.js.map +1 -1
  113. package/dist/builtin-extensions/pi-prompt-template-model/index.d.ts.map +1 -1
  114. package/dist/builtin-extensions/pi-prompt-template-model/index.js +5 -3
  115. package/dist/builtin-extensions/pi-prompt-template-model/index.js.map +1 -1
  116. package/dist/builtin-extensions/pi-prompt-template-model/prompt-loader.d.ts +2 -1
  117. package/dist/builtin-extensions/pi-prompt-template-model/prompt-loader.d.ts.map +1 -1
  118. package/dist/builtin-extensions/pi-prompt-template-model/prompt-loader.js +21 -12
  119. package/dist/builtin-extensions/pi-prompt-template-model/prompt-loader.js.map +1 -1
  120. package/dist/builtin-extensions/pi-prompt-template-model/tool-manager.d.ts.map +1 -1
  121. package/dist/builtin-extensions/pi-prompt-template-model/tool-manager.js +7 -24
  122. package/dist/builtin-extensions/pi-prompt-template-model/tool-manager.js.map +1 -1
  123. package/dist/builtin-extensions/pi-subagents/src/extension/index.d.ts.map +1 -1
  124. package/dist/builtin-extensions/pi-subagents/src/extension/index.js +39 -77
  125. package/dist/builtin-extensions/pi-subagents/src/extension/index.js.map +1 -1
  126. package/dist/builtin-extensions/pi-subagents/src/extension/schemas.d.ts.map +1 -1
  127. package/dist/builtin-extensions/pi-subagents/src/extension/schemas.js +1 -1
  128. package/dist/builtin-extensions/pi-subagents/src/extension/schemas.js.map +1 -1
  129. package/dist/builtin-extensions/pi-subagents/src/extension/tool-description.d.ts +4 -4
  130. package/dist/builtin-extensions/pi-subagents/src/extension/tool-description.d.ts.map +1 -1
  131. package/dist/builtin-extensions/pi-subagents/src/extension/tool-description.js +8 -5
  132. package/dist/builtin-extensions/pi-subagents/src/extension/tool-description.js.map +1 -1
  133. package/dist/builtin-extensions/pi-subagents/src/runs/background/notify.d.ts +1 -1
  134. package/dist/builtin-extensions/pi-subagents/src/runs/background/notify.d.ts.map +1 -1
  135. package/dist/builtin-extensions/pi-subagents/src/runs/background/notify.js +15 -31
  136. package/dist/builtin-extensions/pi-subagents/src/runs/background/notify.js.map +1 -1
  137. package/dist/builtin-extensions/pi-subagents/src/runs/background/result-watcher.d.ts.map +1 -1
  138. package/dist/builtin-extensions/pi-subagents/src/runs/background/result-watcher.js +7 -2
  139. package/dist/builtin-extensions/pi-subagents/src/runs/background/result-watcher.js.map +1 -1
  140. package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-runner.d.ts +1 -0
  141. package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-runner.d.ts.map +1 -1
  142. package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-runner.js +21 -4
  143. package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-runner.js.map +1 -1
  144. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/chain-execution.d.ts.map +1 -1
  145. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/chain-execution.js +11 -4
  146. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/chain-execution.js.map +1 -1
  147. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/execution.d.ts.map +1 -1
  148. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/execution.js +121 -25
  149. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/execution.js.map +1 -1
  150. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/subagent-executor.d.ts.map +1 -1
  151. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/subagent-executor.js +25 -5
  152. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/subagent-executor.js.map +1 -1
  153. package/dist/builtin-extensions/pi-subagents/src/runs/shared/chain-outputs.d.ts +1 -0
  154. package/dist/builtin-extensions/pi-subagents/src/runs/shared/chain-outputs.d.ts.map +1 -1
  155. package/dist/builtin-extensions/pi-subagents/src/runs/shared/chain-outputs.js +5 -0
  156. package/dist/builtin-extensions/pi-subagents/src/runs/shared/chain-outputs.js.map +1 -1
  157. package/dist/builtin-extensions/pi-subagents/src/runs/shared/child-tools.d.ts +1 -1
  158. package/dist/builtin-extensions/pi-subagents/src/runs/shared/child-tools.d.ts.map +1 -1
  159. package/dist/builtin-extensions/pi-subagents/src/runs/shared/child-tools.js +2 -0
  160. package/dist/builtin-extensions/pi-subagents/src/runs/shared/child-tools.js.map +1 -1
  161. package/dist/builtin-extensions/pi-subagents/src/runs/shared/model-fallback.d.ts +1 -1
  162. package/dist/builtin-extensions/pi-subagents/src/runs/shared/model-fallback.d.ts.map +1 -1
  163. package/dist/builtin-extensions/pi-subagents/src/runs/shared/model-fallback.js +1 -1
  164. package/dist/builtin-extensions/pi-subagents/src/runs/shared/model-fallback.js.map +1 -1
  165. package/dist/builtin-extensions/pi-subagents/src/runs/shared/parallel-utils.d.ts +7 -8
  166. package/dist/builtin-extensions/pi-subagents/src/runs/shared/parallel-utils.d.ts.map +1 -1
  167. package/dist/builtin-extensions/pi-subagents/src/runs/shared/parallel-utils.js +60 -32
  168. package/dist/builtin-extensions/pi-subagents/src/runs/shared/parallel-utils.js.map +1 -1
  169. package/dist/builtin-extensions/pi-subagents/src/shared/utils.d.ts +1 -1
  170. package/dist/builtin-extensions/pi-subagents/src/shared/utils.d.ts.map +1 -1
  171. package/dist/builtin-extensions/pi-subagents/src/shared/utils.js +15 -5
  172. package/dist/builtin-extensions/pi-subagents/src/shared/utils.js.map +1 -1
  173. package/dist/builtin-extensions/pi-subagents/src/slash/prompt-workflows.d.ts.map +1 -1
  174. package/dist/builtin-extensions/pi-subagents/src/slash/prompt-workflows.js +4 -3
  175. package/dist/builtin-extensions/pi-subagents/src/slash/prompt-workflows.js.map +1 -1
  176. package/dist/builtin-extensions/pi-subagents/src/tui/communication.d.ts.map +1 -1
  177. package/dist/builtin-extensions/pi-subagents/src/tui/communication.js +1 -1
  178. package/dist/builtin-extensions/pi-subagents/src/tui/communication.js.map +1 -1
  179. package/dist/builtin-extensions/pi-subagents/src/tui/render.d.ts +2 -1
  180. package/dist/builtin-extensions/pi-subagents/src/tui/render.d.ts.map +1 -1
  181. package/dist/builtin-extensions/pi-subagents/src/tui/render.js +22 -11
  182. package/dist/builtin-extensions/pi-subagents/src/tui/render.js.map +1 -1
  183. package/dist/builtin-extensions/pi-subagents/src/watchdog/review.d.ts.map +1 -1
  184. package/dist/builtin-extensions/pi-subagents/src/watchdog/review.js +3 -3
  185. package/dist/builtin-extensions/pi-subagents/src/watchdog/review.js.map +1 -1
  186. package/dist/builtin-extensions/pi-tps.d.ts.map +1 -1
  187. package/dist/builtin-extensions/pi-tps.js +20 -17
  188. package/dist/builtin-extensions/pi-tps.js.map +1 -1
  189. package/dist/builtin-extensions/pi-web-access/activity.d.ts +1 -0
  190. package/dist/builtin-extensions/pi-web-access/activity.d.ts.map +1 -1
  191. package/dist/builtin-extensions/pi-web-access/activity.js +27 -5
  192. package/dist/builtin-extensions/pi-web-access/activity.js.map +1 -1
  193. package/dist/builtin-extensions/pi-web-access/bounded-body.d.ts +3 -0
  194. package/dist/builtin-extensions/pi-web-access/bounded-body.d.ts.map +1 -0
  195. package/dist/builtin-extensions/pi-web-access/bounded-body.js +43 -0
  196. package/dist/builtin-extensions/pi-web-access/bounded-body.js.map +1 -0
  197. package/dist/builtin-extensions/pi-web-access/content-page.d.ts +24 -0
  198. package/dist/builtin-extensions/pi-web-access/content-page.d.ts.map +1 -0
  199. package/dist/builtin-extensions/pi-web-access/content-page.js +57 -0
  200. package/dist/builtin-extensions/pi-web-access/content-page.js.map +1 -0
  201. package/dist/builtin-extensions/pi-web-access/extract.d.ts.map +1 -1
  202. package/dist/builtin-extensions/pi-web-access/extract.js +7 -2
  203. package/dist/builtin-extensions/pi-web-access/extract.js.map +1 -1
  204. package/dist/builtin-extensions/pi-web-access/github-extract.d.ts +0 -1
  205. package/dist/builtin-extensions/pi-web-access/github-extract.d.ts.map +1 -1
  206. package/dist/builtin-extensions/pi-web-access/github-extract.js +147 -36
  207. package/dist/builtin-extensions/pi-web-access/github-extract.js.map +1 -1
  208. package/dist/builtin-extensions/pi-web-access/index.d.ts.map +1 -1
  209. package/dist/builtin-extensions/pi-web-access/index.js +48 -73
  210. package/dist/builtin-extensions/pi-web-access/index.js.map +1 -1
  211. package/dist/builtin-extensions/pi-web-access/session-cleanup.d.ts +12 -4
  212. package/dist/builtin-extensions/pi-web-access/session-cleanup.d.ts.map +1 -1
  213. package/dist/builtin-extensions/pi-web-access/session-cleanup.js +35 -12
  214. package/dist/builtin-extensions/pi-web-access/session-cleanup.js.map +1 -1
  215. package/dist/builtin-extensions/pi-web-access/storage.d.ts +9 -6
  216. package/dist/builtin-extensions/pi-web-access/storage.d.ts.map +1 -1
  217. package/dist/builtin-extensions/pi-web-access/storage.js +36 -24
  218. package/dist/builtin-extensions/pi-web-access/storage.js.map +1 -1
  219. package/dist/builtin-extensions/simple-pi-memory.d.ts +1 -1
  220. package/dist/builtin-extensions/simple-pi-memory.d.ts.map +1 -1
  221. package/dist/builtin-extensions/simple-pi-memory.js +1 -1
  222. package/dist/builtin-extensions/simple-pi-memory.js.map +1 -1
  223. package/dist/cli/install-cli.d.ts.map +1 -1
  224. package/dist/cli/install-cli.js +38 -30
  225. package/dist/cli/install-cli.js.map +1 -1
  226. package/dist/core/agent-session-runtime.d.ts +13 -0
  227. package/dist/core/agent-session-runtime.d.ts.map +1 -1
  228. package/dist/core/agent-session-runtime.js +75 -11
  229. package/dist/core/agent-session-runtime.js.map +1 -1
  230. package/dist/core/agent-session-services.d.ts +1 -0
  231. package/dist/core/agent-session-services.d.ts.map +1 -1
  232. package/dist/core/agent-session-services.js +1 -0
  233. package/dist/core/agent-session-services.js.map +1 -1
  234. package/dist/core/agent-session.d.ts +40 -6
  235. package/dist/core/agent-session.d.ts.map +1 -1
  236. package/dist/core/agent-session.js +309 -76
  237. package/dist/core/agent-session.js.map +1 -1
  238. package/dist/core/browser/runtime.d.ts +2 -0
  239. package/dist/core/browser/runtime.d.ts.map +1 -1
  240. package/dist/core/browser/runtime.js +80 -45
  241. package/dist/core/browser/runtime.js.map +1 -1
  242. package/dist/core/browser/setup.d.ts.map +1 -1
  243. package/dist/core/browser/setup.js +12 -1
  244. package/dist/core/browser/setup.js.map +1 -1
  245. package/dist/core/computer-use/adapter.d.ts +28 -0
  246. package/dist/core/computer-use/adapter.d.ts.map +1 -0
  247. package/dist/core/computer-use/adapter.js +138 -0
  248. package/dist/core/computer-use/adapter.js.map +1 -0
  249. package/dist/core/computer-use/image.d.ts +27 -0
  250. package/dist/core/computer-use/image.d.ts.map +1 -0
  251. package/dist/core/computer-use/image.js +84 -0
  252. package/dist/core/computer-use/image.js.map +1 -0
  253. package/dist/core/computer-use/lease.d.ts +18 -0
  254. package/dist/core/computer-use/lease.d.ts.map +1 -0
  255. package/dist/core/computer-use/lease.js +129 -0
  256. package/dist/core/computer-use/lease.js.map +1 -0
  257. package/dist/core/computer-use/macos-runtime.d.ts +14 -0
  258. package/dist/core/computer-use/macos-runtime.d.ts.map +1 -0
  259. package/dist/core/computer-use/macos-runtime.js +148 -0
  260. package/dist/core/computer-use/macos-runtime.js.map +1 -0
  261. package/dist/core/computer-use/policy.d.ts +19 -0
  262. package/dist/core/computer-use/policy.d.ts.map +1 -0
  263. package/dist/core/computer-use/policy.js +67 -0
  264. package/dist/core/computer-use/policy.js.map +1 -0
  265. package/dist/core/computer-use/release.generated.d.ts +31 -0
  266. package/dist/core/computer-use/release.generated.d.ts.map +1 -0
  267. package/dist/core/computer-use/release.generated.js +36 -0
  268. package/dist/core/computer-use/release.generated.js.map +1 -0
  269. package/dist/core/computer-use/runtime.d.ts +13 -0
  270. package/dist/core/computer-use/runtime.d.ts.map +1 -0
  271. package/dist/core/computer-use/runtime.js +158 -0
  272. package/dist/core/computer-use/runtime.js.map +1 -0
  273. package/dist/core/computer-use/schemas.d.ts +100 -0
  274. package/dist/core/computer-use/schemas.d.ts.map +1 -0
  275. package/dist/core/computer-use/schemas.js +96 -0
  276. package/dist/core/computer-use/schemas.js.map +1 -0
  277. package/dist/core/computer-use/windows-desktop.d.ts +3 -0
  278. package/dist/core/computer-use/windows-desktop.d.ts.map +1 -0
  279. package/dist/core/computer-use/windows-desktop.js +48 -0
  280. package/dist/core/computer-use/windows-desktop.js.map +1 -0
  281. package/dist/core/computer-use/workflow.d.ts +38 -0
  282. package/dist/core/computer-use/workflow.d.ts.map +1 -0
  283. package/dist/core/computer-use/workflow.js +900 -0
  284. package/dist/core/computer-use/workflow.js.map +1 -0
  285. package/dist/core/cron/jobs.d.ts +26 -8
  286. package/dist/core/cron/jobs.d.ts.map +1 -1
  287. package/dist/core/cron/jobs.js +357 -232
  288. package/dist/core/cron/jobs.js.map +1 -1
  289. package/dist/core/cron/origin-context.d.ts +1 -0
  290. package/dist/core/cron/origin-context.d.ts.map +1 -1
  291. package/dist/core/cron/origin-context.js.map +1 -1
  292. package/dist/core/cron/scheduler.d.ts +22 -17
  293. package/dist/core/cron/scheduler.d.ts.map +1 -1
  294. package/dist/core/cron/scheduler.js +153 -73
  295. package/dist/core/cron/scheduler.js.map +1 -1
  296. package/dist/core/extensions/index.d.ts +1 -1
  297. package/dist/core/extensions/index.d.ts.map +1 -1
  298. package/dist/core/extensions/index.js.map +1 -1
  299. package/dist/core/extensions/loader.d.ts.map +1 -1
  300. package/dist/core/extensions/loader.js +4 -0
  301. package/dist/core/extensions/loader.js.map +1 -1
  302. package/dist/core/extensions/runner.d.ts +1 -0
  303. package/dist/core/extensions/runner.d.ts.map +1 -1
  304. package/dist/core/extensions/runner.js +8 -0
  305. package/dist/core/extensions/runner.js.map +1 -1
  306. package/dist/core/extensions/types.d.ts +8 -0
  307. package/dist/core/extensions/types.d.ts.map +1 -1
  308. package/dist/core/extensions/types.js.map +1 -1
  309. package/dist/core/footer-data-provider.d.ts +4 -0
  310. package/dist/core/footer-data-provider.d.ts.map +1 -1
  311. package/dist/core/footer-data-provider.js +22 -1
  312. package/dist/core/footer-data-provider.js.map +1 -1
  313. package/dist/core/large-subagent-launch.d.ts +1 -1
  314. package/dist/core/large-subagent-launch.d.ts.map +1 -1
  315. package/dist/core/large-subagent-launch.js +7 -7
  316. package/dist/core/large-subagent-launch.js.map +1 -1
  317. package/dist/core/model-registry.d.ts +2 -0
  318. package/dist/core/model-registry.d.ts.map +1 -1
  319. package/dist/core/model-registry.js +5 -0
  320. package/dist/core/model-registry.js.map +1 -1
  321. package/dist/core/model-runtime.d.ts +4 -1
  322. package/dist/core/model-runtime.d.ts.map +1 -1
  323. package/dist/core/model-runtime.js +40 -4
  324. package/dist/core/model-runtime.js.map +1 -1
  325. package/dist/core/package-manager.d.ts.map +1 -1
  326. package/dist/core/package-manager.js.map +1 -1
  327. package/dist/core/permissions.d.ts +4 -4
  328. package/dist/core/permissions.d.ts.map +1 -1
  329. package/dist/core/permissions.js +25 -38
  330. package/dist/core/permissions.js.map +1 -1
  331. package/dist/core/plan-mode.d.ts +5 -13
  332. package/dist/core/plan-mode.d.ts.map +1 -1
  333. package/dist/core/plan-mode.js +135 -116
  334. package/dist/core/plan-mode.js.map +1 -1
  335. package/dist/core/project-trust.d.ts.map +1 -1
  336. package/dist/core/project-trust.js +1 -1
  337. package/dist/core/project-trust.js.map +1 -1
  338. package/dist/core/prompt-resource-bridge.d.ts +12 -0
  339. package/dist/core/prompt-resource-bridge.d.ts.map +1 -0
  340. package/dist/core/prompt-resource-bridge.js +9 -0
  341. package/dist/core/prompt-resource-bridge.js.map +1 -0
  342. package/dist/core/protected-targets.d.ts +6 -0
  343. package/dist/core/protected-targets.d.ts.map +1 -0
  344. package/dist/core/protected-targets.js +45 -0
  345. package/dist/core/protected-targets.js.map +1 -0
  346. package/dist/core/resource-loader.d.ts.map +1 -1
  347. package/dist/core/resource-loader.js +7 -0
  348. package/dist/core/resource-loader.js.map +1 -1
  349. package/dist/core/rollback.d.ts +19 -3
  350. package/dist/core/rollback.d.ts.map +1 -1
  351. package/dist/core/rollback.js +172 -56
  352. package/dist/core/rollback.js.map +1 -1
  353. package/dist/core/runtime-credentials.d.ts +3 -0
  354. package/dist/core/runtime-credentials.d.ts.map +1 -1
  355. package/dist/core/runtime-credentials.js +14 -1
  356. package/dist/core/runtime-credentials.js.map +1 -1
  357. package/dist/core/sdk.d.ts +3 -0
  358. package/dist/core/sdk.d.ts.map +1 -1
  359. package/dist/core/sdk.js +1 -0
  360. package/dist/core/sdk.js.map +1 -1
  361. package/dist/core/session-manager.d.ts +6 -0
  362. package/dist/core/session-manager.d.ts.map +1 -1
  363. package/dist/core/session-manager.js +95 -32
  364. package/dist/core/session-manager.js.map +1 -1
  365. package/dist/core/session-ownership.d.ts.map +1 -1
  366. package/dist/core/session-ownership.js +8 -3
  367. package/dist/core/session-ownership.js.map +1 -1
  368. package/dist/core/session-retention.d.ts.map +1 -1
  369. package/dist/core/session-retention.js +18 -7
  370. package/dist/core/session-retention.js.map +1 -1
  371. package/dist/core/session-startup-settings.d.ts +10 -0
  372. package/dist/core/session-startup-settings.d.ts.map +1 -0
  373. package/dist/core/session-startup-settings.js +70 -0
  374. package/dist/core/session-startup-settings.js.map +1 -0
  375. package/dist/core/settings-manager.d.ts +6 -0
  376. package/dist/core/settings-manager.d.ts.map +1 -1
  377. package/dist/core/settings-manager.js +19 -0
  378. package/dist/core/settings-manager.js.map +1 -1
  379. package/dist/core/subagent-event-transport.d.ts +3 -0
  380. package/dist/core/subagent-event-transport.d.ts.map +1 -0
  381. package/dist/core/subagent-event-transport.js +61 -0
  382. package/dist/core/subagent-event-transport.js.map +1 -0
  383. package/dist/core/subscriptions.d.ts +16 -7
  384. package/dist/core/subscriptions.d.ts.map +1 -1
  385. package/dist/core/subscriptions.js +96 -55
  386. package/dist/core/subscriptions.js.map +1 -1
  387. package/dist/core/trust-manager.d.ts +2 -1
  388. package/dist/core/trust-manager.d.ts.map +1 -1
  389. package/dist/core/trust-manager.js +6 -1
  390. package/dist/core/trust-manager.js.map +1 -1
  391. package/dist/core/update-check.d.ts.map +1 -1
  392. package/dist/core/update-check.js.map +1 -1
  393. package/dist/core/usage-adapters/kimi-coding.d.ts +2 -2
  394. package/dist/core/usage-adapters/kimi-coding.d.ts.map +1 -1
  395. package/dist/core/usage-adapters/kimi-coding.js +2 -2
  396. package/dist/core/usage-adapters/kimi-coding.js.map +1 -1
  397. package/dist/core/usage-adapters/openai-codex.d.ts +3 -2
  398. package/dist/core/usage-adapters/openai-codex.d.ts.map +1 -1
  399. package/dist/core/usage-adapters/openai-codex.js +3 -3
  400. package/dist/core/usage-adapters/openai-codex.js.map +1 -1
  401. package/dist/core/usage-adapters/xai.d.ts +2 -2
  402. package/dist/core/usage-adapters/xai.d.ts.map +1 -1
  403. package/dist/core/usage-adapters/xai.js +3 -3
  404. package/dist/core/usage-adapters/xai.js.map +1 -1
  405. package/dist/core/usage-adapters/zai.d.ts +2 -2
  406. package/dist/core/usage-adapters/zai.d.ts.map +1 -1
  407. package/dist/core/usage-adapters/zai.js +2 -2
  408. package/dist/core/usage-adapters/zai.js.map +1 -1
  409. package/dist/core/usage-service.d.ts +9 -2
  410. package/dist/core/usage-service.d.ts.map +1 -1
  411. package/dist/core/usage-service.js +95 -50
  412. package/dist/core/usage-service.js.map +1 -1
  413. package/dist/gateway/adapters/discord.d.ts.map +1 -1
  414. package/dist/gateway/adapters/discord.js +2 -2
  415. package/dist/gateway/adapters/discord.js.map +1 -1
  416. package/dist/gateway/agent-bridge.d.ts +9 -1
  417. package/dist/gateway/agent-bridge.d.ts.map +1 -1
  418. package/dist/gateway/agent-bridge.js +91 -37
  419. package/dist/gateway/agent-bridge.js.map +1 -1
  420. package/dist/gateway/approval.d.ts.map +1 -1
  421. package/dist/gateway/approval.js +3 -3
  422. package/dist/gateway/approval.js.map +1 -1
  423. package/dist/gateway/authz.d.ts +4 -4
  424. package/dist/gateway/authz.d.ts.map +1 -1
  425. package/dist/gateway/authz.js +8 -12
  426. package/dist/gateway/authz.js.map +1 -1
  427. package/dist/gateway/buttons.d.ts +8 -1
  428. package/dist/gateway/buttons.d.ts.map +1 -1
  429. package/dist/gateway/buttons.js +76 -18
  430. package/dist/gateway/buttons.js.map +1 -1
  431. package/dist/gateway/commands.d.ts +1 -0
  432. package/dist/gateway/commands.d.ts.map +1 -1
  433. package/dist/gateway/commands.js +12 -10
  434. package/dist/gateway/commands.js.map +1 -1
  435. package/dist/gateway/cron.d.ts +12 -11
  436. package/dist/gateway/cron.d.ts.map +1 -1
  437. package/dist/gateway/cron.js +85 -62
  438. package/dist/gateway/cron.js.map +1 -1
  439. package/dist/gateway/index.d.ts.map +1 -1
  440. package/dist/gateway/index.js +5 -4
  441. package/dist/gateway/index.js.map +1 -1
  442. package/dist/gateway/mobile-commands.d.ts +1 -0
  443. package/dist/gateway/mobile-commands.d.ts.map +1 -1
  444. package/dist/gateway/mobile-commands.js +64 -22
  445. package/dist/gateway/mobile-commands.js.map +1 -1
  446. package/dist/gateway/presenter.d.ts +12 -2
  447. package/dist/gateway/presenter.d.ts.map +1 -1
  448. package/dist/gateway/presenter.js +74 -39
  449. package/dist/gateway/presenter.js.map +1 -1
  450. package/dist/gateway/router.d.ts +2 -2
  451. package/dist/gateway/router.d.ts.map +1 -1
  452. package/dist/gateway/router.js +22 -9
  453. package/dist/gateway/router.js.map +1 -1
  454. package/dist/gateway/service.d.ts +2 -0
  455. package/dist/gateway/service.d.ts.map +1 -1
  456. package/dist/gateway/service.js +153 -0
  457. package/dist/gateway/service.js.map +1 -1
  458. package/dist/gateway/setup.d.ts.map +1 -1
  459. package/dist/gateway/setup.js +6 -4
  460. package/dist/gateway/setup.js.map +1 -1
  461. package/dist/main.d.ts.map +1 -1
  462. package/dist/main.js +86 -33
  463. package/dist/main.js.map +1 -1
  464. package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  465. package/dist/modes/interactive/components/assistant-message.js +6 -4
  466. package/dist/modes/interactive/components/assistant-message.js.map +1 -1
  467. package/dist/modes/interactive/components/copyable-text.d.ts.map +1 -1
  468. package/dist/modes/interactive/components/copyable-text.js +3 -2
  469. package/dist/modes/interactive/components/copyable-text.js.map +1 -1
  470. package/dist/modes/interactive/components/extension-editor.d.ts.map +1 -1
  471. package/dist/modes/interactive/components/extension-editor.js +1 -1
  472. package/dist/modes/interactive/components/extension-editor.js.map +1 -1
  473. package/dist/modes/interactive/components/settings-selector.d.ts +4 -0
  474. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  475. package/dist/modes/interactive/components/settings-selector.js +20 -0
  476. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  477. package/dist/modes/interactive/interactive-mode.d.ts +2 -2
  478. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  479. package/dist/modes/interactive/interactive-mode.js +104 -109
  480. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  481. package/dist/modes/interactive/smooth-streaming.d.ts.map +1 -1
  482. package/dist/modes/interactive/smooth-streaming.js.map +1 -1
  483. package/dist/modes/print-mode.d.ts.map +1 -1
  484. package/dist/modes/print-mode.js +9 -1
  485. package/dist/modes/print-mode.js.map +1 -1
  486. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  487. package/dist/modes/rpc/rpc-mode.js +2 -1
  488. package/dist/modes/rpc/rpc-mode.js.map +1 -1
  489. package/dist/node-runtime/adapter-247RTYLS.js +16 -0
  490. package/dist/node-runtime/agent-session-services-KDMSPQDY.js +53 -0
  491. package/dist/node-runtime/{brave-UWDA3I22.js → brave-2AFFAXNN.js} +1 -1
  492. package/dist/node-runtime/{builtin-extensions-ZLAX7TUH.js → builtin-extensions-OX6KELNX.js} +9 -7
  493. package/dist/node-runtime/{chunk-QH6YL7VK.js → chunk-252ZVPPF.js} +3 -3
  494. package/dist/node-runtime/{chunk-PCEW76PM.js → chunk-2OIPYKLZ.js} +6 -6
  495. package/dist/node-runtime/{chunk-XBWPBZBN.js → chunk-2SWW7KMW.js} +1 -1
  496. package/dist/node-runtime/{chunk-UQUCFAJ3.js → chunk-2VIW3IMF.js} +40 -7
  497. package/dist/node-runtime/{chunk-UOEDI7RP.js → chunk-4KNKQGHM.js} +2 -2
  498. package/dist/node-runtime/{chunk-FQMM2EZ2.js → chunk-64XTQNLA.js} +29 -7
  499. package/dist/node-runtime/{chunk-NRKGMJYU.js → chunk-6O3IW3IA.js} +2 -2
  500. package/dist/node-runtime/{chunk-5ZQXRPMC.js → chunk-6ZZHGUSA.js} +2 -2
  501. package/dist/node-runtime/chunk-A2WO6WIN.js +1197 -0
  502. package/dist/node-runtime/{chunk-ZXSGTGJ6.js → chunk-APVM5NEU.js} +169 -148
  503. package/dist/node-runtime/{chunk-RC7DMV45.js → chunk-AYHH7YSD.js} +205 -144
  504. package/dist/node-runtime/{chunk-LWYIVUGV.js → chunk-B2IBAXNX.js} +48 -31
  505. package/dist/node-runtime/{chunk-M3LZLQW2.js → chunk-BDRGN3L2.js} +1 -0
  506. package/dist/node-runtime/{chunk-GJ2RDBRL.js → chunk-BYC6RKCN.js} +4 -2
  507. package/dist/node-runtime/{chunk-KWIYUUZK.js → chunk-C3P6Q3B2.js} +469 -283
  508. package/dist/node-runtime/{chunk-YCUZEGJG.js → chunk-DQSCFU7R.js} +17 -8
  509. package/dist/node-runtime/chunk-EBLAZVSA.js +4170 -0
  510. package/dist/node-runtime/{chunk-2KIPT4HJ.js → chunk-EPR2F3GU.js} +68 -20
  511. package/dist/node-runtime/{chunk-CSFI6YXL.js → chunk-ES6PBSIE.js} +1 -1
  512. package/dist/node-runtime/{chunk-IF24A3FH.js → chunk-EVM653DD.js} +4 -4
  513. package/dist/node-runtime/{chunk-HTFRRDSF.js → chunk-F2SMQ6ES.js} +3 -2
  514. package/dist/node-runtime/chunk-F2V2F4ZG.js +114 -0
  515. package/dist/node-runtime/chunk-FE3WZI7F.js +290 -0
  516. package/dist/node-runtime/{chunk-GYIXXQAO.js → chunk-FIRA54AC.js} +2 -5
  517. package/dist/node-runtime/{chunk-6VYZ5UFP.js → chunk-FLGEEH27.js} +1 -1
  518. package/dist/node-runtime/{chunk-5EFIU3OM.js → chunk-FTKEZL27.js} +1 -1
  519. package/dist/node-runtime/chunk-FY4A63RK.js +73 -0
  520. package/dist/node-runtime/chunk-FYIFPFXE.js +98 -0
  521. package/dist/node-runtime/{chunk-HMBGROQK.js → chunk-GLDXBBL6.js} +3 -3
  522. package/dist/node-runtime/{chunk-KWA4OC2J.js → chunk-H6YBCWKG.js} +1 -1
  523. package/dist/node-runtime/{chunk-2MI5OPMN.js → chunk-HNNHHJAB.js} +68 -50
  524. package/dist/node-runtime/{chunk-6XL67VVY.js → chunk-HUD2RFJW.js} +17 -2
  525. package/dist/node-runtime/{chunk-I54LGHWM.js → chunk-I2H5QMWW.js} +3 -3
  526. package/dist/node-runtime/chunk-IAZSK7KK.js +108 -0
  527. package/dist/node-runtime/{chunk-2HHLJWGD.js → chunk-IHHTWSXN.js} +9 -9
  528. package/dist/node-runtime/{chunk-DAPBPCBP.js → chunk-IPP5BIV5.js} +25 -3
  529. package/dist/node-runtime/{chunk-QFWG2RVL.js → chunk-IXG6F4NT.js} +11 -0
  530. package/dist/node-runtime/{chunk-RDDAZOMU.js → chunk-JL4HYQXK.js} +1 -1
  531. package/dist/node-runtime/{chunk-CDVHZOOK.js → chunk-JQYNHAKX.js} +1 -1
  532. package/dist/node-runtime/{chunk-WF7PGWRZ.js → chunk-JWEVT363.js} +37 -28
  533. package/dist/node-runtime/{chunk-2HMIRK7W.js → chunk-LHV3V67B.js} +5 -5
  534. package/dist/node-runtime/{chunk-UAEOTO52.js → chunk-MNQXDFPV.js} +6 -2
  535. package/dist/node-runtime/{chunk-IJIFHRTB.js → chunk-MQPKUHRN.js} +165 -85
  536. package/dist/node-runtime/{chunk-MPKSOJBT.js → chunk-NHATCSOI.js} +4 -7
  537. package/dist/node-runtime/{chunk-RMQZU2YU.js → chunk-NNNR3QIY.js} +1 -1
  538. package/dist/node-runtime/{chunk-RWTKOC3B.js → chunk-QBTJG3UM.js} +1 -1
  539. package/dist/node-runtime/{chunk-E4D3IGP2.js → chunk-QNVMKNNN.js} +20 -17
  540. package/dist/node-runtime/{chunk-GS42T6MX.js → chunk-QW3AAHWN.js} +1 -1
  541. package/dist/node-runtime/{chunk-7S3T6YEA.js → chunk-R4WSB2MQ.js} +5 -5
  542. package/dist/node-runtime/{chunk-B4HP6ZWM.js → chunk-RHCGYWO7.js} +1 -1
  543. package/dist/node-runtime/{chunk-3XPLBUEM.js → chunk-RLGY2QIL.js} +49 -59
  544. package/dist/node-runtime/{chunk-KKUTQQV7.js → chunk-RYRGL7P4.js} +1 -1
  545. package/dist/node-runtime/{chunk-AD6VXAO7.js → chunk-TCT6PCUR.js} +47 -115
  546. package/dist/node-runtime/chunk-U5F4IC7R.js +53 -0
  547. package/dist/node-runtime/{chunk-OCVIXVTZ.js → chunk-UBWW2PID.js} +13 -2
  548. package/dist/node-runtime/{chunk-HFVZUPFJ.js → chunk-UNUZICC4.js} +3 -3
  549. package/dist/node-runtime/{chunk-LQP3RB67.js → chunk-UYRKUKFE.js} +1 -1
  550. package/dist/node-runtime/{chunk-DSIKTUPW.js → chunk-VSUEAI7O.js} +2993 -3820
  551. package/dist/node-runtime/{chunk-NAY6UUQZ.js → chunk-WDIVLMOH.js} +1 -1
  552. package/dist/node-runtime/{chunk-E24EO34J.js → chunk-WPXUR3HE.js} +1 -1
  553. package/dist/node-runtime/{chunk-SLVOAQOY.js → chunk-WXYNALHD.js} +113 -1
  554. package/dist/node-runtime/{chunk-KJ6DWS3K.js → chunk-XEOCUEUJ.js} +121 -60
  555. package/dist/node-runtime/chunk-YD3IZAZ7.js +47 -0
  556. package/dist/node-runtime/chunk-YSB6URMT.js +41 -0
  557. package/dist/node-runtime/{chunk-VQFSUJJG.js → chunk-ZDJUR45D.js} +430 -129
  558. package/dist/node-runtime/{chunk-YDO2F2IA.js → chunk-ZEVFBFNF.js} +95 -142
  559. package/dist/node-runtime/chunk-ZIQUS5QO.js +180 -0
  560. package/dist/node-runtime/cli-runtime.js +4 -4
  561. package/dist/node-runtime/{command-6WDOYKS6.js → command-3HMSY6W2.js} +5 -5
  562. package/dist/node-runtime/{commands-NZLSOHPE.js → commands-D6A6H4TS.js} +11 -16
  563. package/dist/node-runtime/commands-OCSSEEWJ.js +37 -0
  564. package/dist/node-runtime/{config-QDD5PUE2.js → config-CU7M7BTK.js} +1 -1
  565. package/dist/node-runtime/{config-D4QUPAHX.js → config-DS7XLMEM.js} +2 -2
  566. package/dist/node-runtime/{direct-tool-executor-77GW4F5P.js → direct-tool-executor-2QJXVQD2.js} +8 -10
  567. package/dist/node-runtime/{exa-LL64QZR2.js → exa-6VBZNPGE.js} +1 -1
  568. package/dist/node-runtime/{export-html-VM4J2MNR.js → export-html-BRWF5AHI.js} +4 -4
  569. package/dist/node-runtime/{extension-input-E7BJZ35H.js → extension-input-VBBMX7YV.js} +5 -5
  570. package/dist/node-runtime/{extension-selector-WU42XDTU.js → extension-selector-T5AOG5XB.js} +5 -5
  571. package/dist/node-runtime/{extract-EQJE7FZZ.js → extract-BFX2N35A.js} +3 -3
  572. package/dist/node-runtime/{gateway-INAYBF4Q.js → gateway-6623C2U3.js} +61 -53
  573. package/dist/node-runtime/{gemini-search-35OCRFLN.js → gemini-search-C66QHDT6.js} +2 -2
  574. package/dist/node-runtime/{gemini-url-context-UQY3PHHW.js → gemini-url-context-T7DEK73R.js} +3 -3
  575. package/dist/node-runtime/{github-extract-F64RZOEA.js → github-extract-HOGE3D6F.js} +107 -38
  576. package/dist/node-runtime/{goal-NJEE5CTU.js → goal-AIHEDUYA.js} +5 -5
  577. package/dist/node-runtime/index.js +54 -48
  578. package/dist/node-runtime/{init-HS6NQXSK.js → init-JBQJIPYI.js} +3 -4
  579. package/dist/node-runtime/{install-cli-KL4UDDAD.js → install-cli-INGHIVBY.js} +30 -25
  580. package/dist/node-runtime/interactive-mode-FM5DNUSW.js +74 -0
  581. package/dist/node-runtime/{interactive-view-NGFAMHPW.js → interactive-view-K33PM4OS.js} +8 -8
  582. package/dist/node-runtime/{lsp-manager-3ASUSO4T.js → lsp-manager-S554V5HR.js} +240 -155
  583. package/dist/node-runtime/{lunr-browser-IR7TL3J7.js → lunr-browser-H4FDOR3C.js} +7 -7
  584. package/dist/node-runtime/lunr-computer-use-VDP2QNRQ.js +158 -0
  585. package/dist/node-runtime/{lunr-cron-LWIZJM2N.js → lunr-cron-LKVA5CZZ.js} +94 -79
  586. package/dist/node-runtime/main.js +42 -39
  587. package/dist/node-runtime/{mobile-commands-J7OJEKFO.js → mobile-commands-XT3NQXLD.js} +13 -12
  588. package/dist/node-runtime/{model-runtime-OO5HFLWE.js → model-runtime-MZ2JMDV4.js} +4 -4
  589. package/dist/node-runtime/{openai-search-B3MSNCQA.js → openai-search-K72LJDYN.js} +1 -1
  590. package/dist/node-runtime/{package-manager-cli-VYZM5WHN.js → package-manager-cli-CYM262SI.js} +20 -19
  591. package/dist/node-runtime/{parallel-AI2MNSCU.js → parallel-X724NCNU.js} +1 -1
  592. package/dist/node-runtime/{perplexity-QVJW3I35.js → perplexity-RDHQHVMK.js} +2 -2
  593. package/dist/node-runtime/{pi-intercom-QM53RLTS.js → pi-intercom-NHHEPBMI.js} +2 -2
  594. package/dist/node-runtime/{pi-mcp-adapter-5UKBZP44.js → pi-mcp-adapter-PP3GQJQ2.js} +98 -94
  595. package/dist/node-runtime/{pi-ollama-cloud-2F3Y2QNM.js → pi-ollama-cloud-4MNWIMFN.js} +11 -24
  596. package/dist/node-runtime/{pi-prompt-template-model-QWTCGLJU.js → pi-prompt-template-model-FTGELLS5.js} +32 -36
  597. package/dist/node-runtime/{pi-subagents-DNY7EAIG.js → pi-subagents-LT3CTO4E.js} +114 -116
  598. package/dist/node-runtime/{pi-web-access-WTGMNZ32.js → pi-web-access-Z3LP246C.js} +144 -108
  599. package/dist/node-runtime/{print-mode-XSFM26EL.js → print-mode-2XHN5SUA.js} +4 -3
  600. package/dist/node-runtime/{process-registry-4FAKZQOL.js → process-registry-Q4QWIU33.js} +3 -3
  601. package/dist/node-runtime/{proxy-modes-LGEUYD7R.js → proxy-modes-VEGC6QG5.js} +9 -13
  602. package/dist/node-runtime/rpc-entry.js +42 -39
  603. package/dist/node-runtime/{rpc-mode-O3XV4SID.js → rpc-mode-32DHJPEJ.js} +4 -4
  604. package/dist/node-runtime/{runtime-4VA6JKNF.js → runtime-EDUUGAQD.js} +56 -46
  605. package/dist/node-runtime/runtime-UGXM4NPQ.js +21 -0
  606. package/dist/node-runtime/{runtime-bridges-VRDDR73P.js → runtime-bridges-DNKMNJCF.js} +8 -7
  607. package/dist/node-runtime/{service-MDQIPQ26.js → service-IHLGFLBT.js} +6 -4
  608. package/dist/node-runtime/{session-handoff-GWARVEWT.js → session-handoff-LNSPDTKY.js} +4 -4
  609. package/dist/node-runtime/{session-manager-JB5J6XBN.js → session-manager-YIFIAVGC.js} +3 -3
  610. package/dist/node-runtime/{session-selector-GIM4DHQ2.js → session-selector-I73U3EIO.js} +7 -7
  611. package/dist/node-runtime/{settings-manager-J4SPQPDJ.js → settings-manager-P2TKGYTR.js} +6 -5
  612. package/dist/node-runtime/{setup-JBKOLJ6F.js → setup-H7CCELIL.js} +15 -1
  613. package/dist/node-runtime/{setup-CQ2NLVK5.js → setup-OLQ4GXWS.js} +22 -21
  614. package/dist/node-runtime/{src-IVPNZ2BX.js → src-6RV4PXKJ.js} +64 -36
  615. package/dist/node-runtime/{subagent-executor-KZZQGAKV.js → subagent-executor-Q5F7DBVM.js} +141 -62
  616. package/dist/node-runtime/{tavily-WEZFVFP7.js → tavily-KZBFYQB6.js} +1 -1
  617. package/dist/node-runtime/{theme-UOO5RVFN.js → theme-YLVZKKZD.js} +2 -2
  618. package/dist/node-runtime/{trust-manager-MMISNCYO.js → trust-manager-ZCU76D23.js} +2 -2
  619. package/dist/node-runtime/{update-cli-GTFJC7XK.js → update-cli-F3XXJANQ.js} +7 -6
  620. package/dist/node-runtime/{usage-service-LFB2SWYV.js → usage-service-CPAGBED5.js} +1 -1
  621. package/dist/node-runtime/{video-extract-OOZHR7SU.js → video-extract-UPKYIBW3.js} +3 -3
  622. package/dist/node-runtime/workflow-ICDI4N3J.js +767 -0
  623. package/dist/node-runtime/{youtube-extract-FNPAUNHU.js → youtube-extract-77NT7FWH.js} +4 -4
  624. package/dist/utils/clipboard-image.d.ts.map +1 -1
  625. package/dist/utils/clipboard-image.js.map +1 -1
  626. package/dist/utils/exif-orientation.d.ts.map +1 -1
  627. package/dist/utils/exif-orientation.js +25 -10
  628. package/dist/utils/exif-orientation.js.map +1 -1
  629. package/dist/utils/image-resize-core.d.ts +2 -0
  630. package/dist/utils/image-resize-core.d.ts.map +1 -1
  631. package/dist/utils/image-resize-core.js +12 -0
  632. package/dist/utils/image-resize-core.js.map +1 -1
  633. package/dist/utils/paths.d.ts +4 -0
  634. package/dist/utils/paths.d.ts.map +1 -1
  635. package/dist/utils/paths.js +33 -2
  636. package/dist/utils/paths.js.map +1 -1
  637. package/dist/utils/sanitize-terminal-text.d.ts +7 -0
  638. package/dist/utils/sanitize-terminal-text.d.ts.map +1 -0
  639. package/dist/utils/sanitize-terminal-text.js +67 -0
  640. package/dist/utils/sanitize-terminal-text.js.map +1 -0
  641. package/docs/browser.md +1 -1
  642. package/docs/computer-use.md +362 -0
  643. package/docs/custom-provider.md +3 -3
  644. package/docs/extensions.md +8 -4
  645. package/docs/features.md +22 -12
  646. package/docs/keybindings.md +1 -1
  647. package/docs/models.md +5 -5
  648. package/docs/packages.md +1 -1
  649. package/docs/providers.md +2 -2
  650. package/docs/rpc.md +7 -7
  651. package/docs/security.md +10 -5
  652. package/docs/sessions.md +2 -2
  653. package/docs/skills.md +1 -1
  654. package/docs/terminal-setup.md +7 -7
  655. package/docs/themes.md +1 -1
  656. package/docs/usage.md +1 -1
  657. package/examples/extensions/auto-commit-on-exit.ts +1 -1
  658. package/examples/extensions/bash-spawn-hook.ts +1 -1
  659. package/examples/extensions/built-in-tool-renderer.ts +1 -1
  660. package/examples/extensions/claude-rules.ts +1 -1
  661. package/examples/extensions/commands.ts +1 -1
  662. package/examples/extensions/custom-compaction.ts +1 -1
  663. package/examples/extensions/custom-provider-anthropic/index.ts +3 -3
  664. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  665. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  666. package/examples/extensions/custom-provider-gitlab-duo/index.ts +1 -1
  667. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  668. package/examples/extensions/doom-overlay/index.ts +1 -1
  669. package/examples/extensions/git-merge-and-resolve.ts +2 -2
  670. package/examples/extensions/gondolin/index.ts +1 -1
  671. package/examples/extensions/gondolin/package-lock.json +2 -2
  672. package/examples/extensions/gondolin/package.json +1 -1
  673. package/examples/extensions/hidden-thinking-label.ts +1 -1
  674. package/examples/extensions/inline-bash.ts +2 -2
  675. package/examples/extensions/input-transform-streaming.ts +2 -2
  676. package/examples/extensions/input-transform.ts +2 -2
  677. package/examples/extensions/interactive-shell.ts +1 -1
  678. package/examples/extensions/kimi-deferred-tools.ts +1 -1
  679. package/examples/extensions/mac-system-theme.ts +1 -1
  680. package/examples/extensions/minimal-mode.ts +1 -1
  681. package/examples/extensions/modal-editor.ts +1 -1
  682. package/examples/extensions/model-status.ts +1 -1
  683. package/examples/extensions/notify.ts +3 -3
  684. package/examples/extensions/overlay-qa-tests.ts +1 -1
  685. package/examples/extensions/overlay-test.ts +1 -1
  686. package/examples/extensions/pirate.ts +1 -1
  687. package/examples/extensions/preset.ts +3 -3
  688. package/examples/extensions/project-trust.ts +4 -4
  689. package/examples/extensions/prompt-customizer.ts +1 -1
  690. package/examples/extensions/rainbow-editor.ts +1 -1
  691. package/examples/extensions/rpc-demo.ts +1 -1
  692. package/examples/extensions/sandbox/index.ts +7 -7
  693. package/examples/extensions/sandbox/package-lock.json +2 -2
  694. package/examples/extensions/sandbox/package.json +1 -1
  695. package/examples/extensions/shutdown-command.ts +5 -5
  696. package/examples/extensions/ssh.ts +2 -2
  697. package/examples/extensions/subagent/README.md +3 -3
  698. package/examples/extensions/subagent/index.ts +2 -2
  699. package/examples/extensions/titlebar-spinner.ts +1 -1
  700. package/examples/extensions/tool-override.ts +1 -1
  701. package/examples/extensions/tools.ts +1 -1
  702. package/examples/extensions/with-deps/package-lock.json +2 -2
  703. package/examples/extensions/with-deps/package.json +1 -1
  704. package/examples/extensions/working-indicator.ts +1 -1
  705. package/examples/extensions/working-message-test.ts +1 -1
  706. package/examples/sdk/01-minimal.ts +1 -1
  707. package/examples/sdk/03-custom-prompt.ts +1 -1
  708. package/examples/sdk/04-skills.ts +1 -1
  709. package/examples/sdk/06-extensions.ts +2 -2
  710. package/examples/sdk/08-prompt-templates.ts +1 -1
  711. package/install-lock/package-lock.json +3841 -0
  712. package/install-lock/package.json +18 -0
  713. package/native/computer-use/LICENSE.md +21 -0
  714. package/npm-shrinkwrap.json +3858 -0
  715. package/package.json +15 -9
  716. package/dist/modes/interactive/components/exit-card.d.ts +0 -22
  717. package/dist/modes/interactive/components/exit-card.d.ts.map +0 -1
  718. package/dist/modes/interactive/components/exit-card.js +0 -69
  719. package/dist/modes/interactive/components/exit-card.js.map +0 -1
  720. package/dist/node-runtime/agent-session-services-YXXFCP5J.js +0 -49
  721. package/dist/node-runtime/chunk-4HXHDDCF.js +0 -16
  722. package/dist/node-runtime/chunk-4TLO4PO2.js +0 -3427
  723. package/dist/node-runtime/chunk-AUXVGBO4.js +0 -19
  724. package/dist/node-runtime/chunk-OVX6X377.js +0 -50
  725. package/dist/node-runtime/chunk-QTU6AKNJ.js +0 -773
  726. package/dist/node-runtime/chunk-TORR5XBV.js +0 -356
  727. package/dist/node-runtime/commands-QC6VUZJQ.js +0 -36
  728. package/dist/node-runtime/interactive-mode-Z5M7WYYZ.js +0 -72
  729. package/dist/node-runtime/mcp-auth-flow-QIXHW6QN.js +0 -32
@@ -1 +1 @@
1
- {"version":3,"file":"session-ownership.js","sourceRoot":"","sources":["../../src/core/session-ownership.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomUUID } from \"node:crypto\";\nimport {\n\texistsSync,\n\tmkdirSync,\n\treadFileSync,\n\trealpathSync,\n\trenameSync,\n\trmdirSync,\n\tstatSync,\n\tunlinkSync,\n\twriteFileSync,\n} from \"node:fs\";\nimport { hostname } from \"node:os\";\nimport { basename, dirname, join, resolve } from \"node:path\";\n\nexport interface SessionOwner {\n\tversion: 1;\n\tfile: string;\n\tgeneration: string;\n\tpid: number;\n\thost: string;\n\tinstance: string;\n\tsessionId?: string;\n}\nconst instance = randomUUID();\n\nexport class SessionOwnershipError extends Error {\n\treadonly file: string;\n\tconstructor(\n\t\tfile: string,\n\t\tmessage = \"Session is owned by another runtime. Request a transfer or close its owner first.\",\n\t) {\n\t\tsuper(`${message} ${file}`);\n\t\tthis.name = \"SessionOwnershipError\";\n\t\tthis.file = file;\n\t}\n}\n\nexport function canonicalSessionPath(file: string): string {\n\tconst absolute = resolve(file);\n\tlet canonical: string;\n\tif (existsSync(absolute)) canonical = realpathSync.native(absolute);\n\telse {\n\t\tconst parent = dirname(absolute);\n\t\tcanonical = parent === absolute ? absolute : join(canonicalSessionPath(parent), basename(absolute));\n\t}\n\treturn process.platform === \"win32\" ? canonical.toLowerCase() : canonical;\n}\n\nexport function sessionOwnershipDirectory(file: string): string {\n\treturn `${canonicalSessionPath(file)}.owner`;\n}\n\nexport function readSessionOwner(file: string): SessionOwner | undefined {\n\tconst directory = sessionOwnershipDirectory(file);\n\tif (!existsSync(directory)) return undefined;\n\ttry {\n\t\tconst value = JSON.parse(readFileSync(join(directory, \"owner.json\"), \"utf8\"));\n\t\tif (\n\t\t\tvalue.version === 1 &&\n\t\t\tvalue.file === canonicalSessionPath(file) &&\n\t\t\ttypeof value.generation === \"string\" &&\n\t\t\tNumber.isSafeInteger(value.pid) &&\n\t\t\tvalue.pid > 0 &&\n\t\t\ttypeof value.host === \"string\" &&\n\t\t\ttypeof value.instance === \"string\"\n\t\t)\n\t\t\treturn value;\n\t} catch {}\n\tthrow new SessionOwnershipError(file, \"Session owner is incomplete or unknown; automatic takeover is unsafe.\");\n}\n\nexport function isSessionOwnerDead(owner: SessionOwner): boolean {\n\tif (owner.host !== hostname()) return false;\n\ttry {\n\t\tprocess.kill(owner.pid, 0);\n\t\treturn false;\n\t} catch (error) {\n\t\treturn (error as NodeJS.ErrnoException).code === \"ESRCH\";\n\t}\n}\n\nexport function writeSessionJson(file: string, value: unknown): void {\n\tconst temp = `${file}.${randomUUID()}.tmp`;\n\ttry {\n\t\twriteFileSync(temp, JSON.stringify(value), { flag: \"wx\", mode: 0o600 });\n\t\trenameSync(temp, file);\n\t} finally {\n\t\tif (existsSync(temp)) unlinkSync(temp);\n\t}\n}\n\nexport class SessionOwnership {\n\treadonly owner: SessionOwner;\n\tprivate released = false;\n\tprivate readonly directory: string;\n\tconstructor(file: string) {\n\t\tfile = canonicalSessionPath(file);\n\t\tif (existsSync(file) && statSync(file).nlink > 1)\n\t\t\tthrow new SessionOwnershipError(file, \"Hard-linked sessions cannot be owned safely. Use a separate copy.\");\n\t\tthis.directory = sessionOwnershipDirectory(file);\n\t\tthis.owner = { version: 1, file, generation: randomUUID(), pid: process.pid, host: hostname(), instance };\n\t\tmkdirSync(dirname(file), { recursive: true });\n\t\ttry {\n\t\t\tmkdirSync(this.directory);\n\t\t} catch (error) {\n\t\t\tif ((error as NodeJS.ErrnoException).code !== \"EEXIST\") throw error;\n\t\t\tconst old = readSessionOwner(file);\n\t\t\tif (!old || !isSessionOwnerDead(old)) throw new SessionOwnershipError(file);\n\t\t\t// Serialize dead-owner cleanup. Never infer death from elapsed time or a missing heartbeat.\n\t\t\tconst recovery = `${this.directory}.recovery`;\n\t\t\ttry {\n\t\t\t\twriteFileSync(recovery, JSON.stringify(this.owner), { flag: \"wx\", mode: 0o600 });\n\t\t\t} catch {\n\t\t\t\tthrow new SessionOwnershipError(\n\t\t\t\t\tfile,\n\t\t\t\t\t\"Session recovery is already in progress or requires manual inspection.\",\n\t\t\t\t);\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tconst current = readSessionOwner(file);\n\t\t\t\tif (current?.generation !== old.generation || !isSessionOwnerDead(current))\n\t\t\t\t\tthrow new SessionOwnershipError(file);\n\t\t\t\tunlinkSync(join(this.directory, \"owner.json\"));\n\t\t\t\trmdirSync(this.directory);\n\t\t\t\ttry {\n\t\t\t\t\tmkdirSync(this.directory);\n\t\t\t\t} catch {\n\t\t\t\t\tthrow new SessionOwnershipError(file);\n\t\t\t\t}\n\t\t\t} finally {\n\t\t\t\tunlinkSync(recovery);\n\t\t\t}\n\t\t}\n\t\twriteSessionJson(join(this.directory, \"owner.json\"), this.owner);\n\t}\n\tbindSession(sessionId: string): void {\n\t\tthis.assert();\n\t\tthis.owner.sessionId = sessionId;\n\t\twriteSessionJson(join(this.directory, \"owner.json\"), this.owner);\n\t}\n\n\tassert(): void {\n\t\tif (existsSync(this.owner.file) && statSync(this.owner.file).nlink > 1)\n\t\t\tthrow new SessionOwnershipError(this.owner.file, \"Session acquired a hard-link alias; writes are blocked.\");\n\t\tif (this.released || readSessionOwner(this.owner.file)?.generation !== this.owner.generation) {\n\t\t\tthrow new SessionOwnershipError(\n\t\t\t\tthis.owner.file,\n\t\t\t\t\"This runtime no longer owns the session. Reclaim or reopen it before continuing.\",\n\t\t\t);\n\t\t}\n\t}\n\trelease(): void {\n\t\tif (this.released) return;\n\t\tthis.assert();\n\t\tthis.released = true;\n\t\tconst releasedDirectory = `${this.directory}.released-${this.owner.generation}`;\n\t\trenameSync(this.directory, releasedDirectory);\n\t\tunlinkSync(join(releasedDirectory, \"owner.json\"));\n\t\trmdirSync(releasedDirectory);\n\t}\n}\n"]}
1
+ {"version":3,"file":"session-ownership.js","sourceRoot":"","sources":["../../src/core/session-ownership.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomUUID } from \"node:crypto\";\nimport {\n\texistsSync,\n\tmkdirSync,\n\treadFileSync,\n\trealpathSync,\n\trenameSync,\n\trmdirSync,\n\tstatSync,\n\tunlinkSync,\n\twriteFileSync,\n} from \"node:fs\";\nimport { hostname } from \"node:os\";\nimport { basename, dirname, join, resolve } from \"node:path\";\n\nexport interface SessionOwner {\n\tversion: 1;\n\tfile: string;\n\tgeneration: string;\n\tpid: number;\n\thost: string;\n\tinstance: string;\n\tsessionId?: string;\n}\nconst instance = randomUUID();\n\nexport class SessionOwnershipError extends Error {\n\treadonly file: string;\n\tconstructor(\n\t\tfile: string,\n\t\tmessage = \"Session is owned by another runtime. Request a transfer or close its owner first.\",\n\t) {\n\t\tsuper(`${message} ${file}`);\n\t\tthis.name = \"SessionOwnershipError\";\n\t\tthis.file = file;\n\t}\n}\n\nexport function canonicalSessionPath(file: string): string {\n\tconst absolute = resolve(file);\n\tlet canonical: string;\n\tif (existsSync(absolute)) canonical = realpathSync.native(absolute);\n\telse {\n\t\tconst parent = dirname(absolute);\n\t\tcanonical = parent === absolute ? absolute : join(canonicalSessionPath(parent), basename(absolute));\n\t}\n\treturn process.platform === \"win32\" ? canonical.toLowerCase() : canonical;\n}\n\nexport function sessionOwnershipDirectory(file: string): string {\n\treturn `${canonicalSessionPath(file)}.owner`;\n}\n\nexport function readSessionOwner(file: string): SessionOwner | undefined {\n\tconst directory = sessionOwnershipDirectory(file);\n\tif (!existsSync(directory)) return undefined;\n\ttry {\n\t\tconst value = JSON.parse(readFileSync(join(directory, \"owner.json\"), \"utf8\"));\n\t\tif (\n\t\t\tvalue.version === 1 &&\n\t\t\tvalue.file === canonicalSessionPath(file) &&\n\t\t\ttypeof value.generation === \"string\" &&\n\t\t\tNumber.isSafeInteger(value.pid) &&\n\t\t\tvalue.pid > 0 &&\n\t\t\ttypeof value.host === \"string\" &&\n\t\t\ttypeof value.instance === \"string\"\n\t\t)\n\t\t\treturn value;\n\t} catch {}\n\tthrow new SessionOwnershipError(file, \"Session owner is incomplete or unknown; automatic takeover is unsafe.\");\n}\n\nexport function isSessionOwnerDead(owner: SessionOwner): boolean {\n\tif (owner.host !== hostname()) return false;\n\ttry {\n\t\tprocess.kill(owner.pid, 0);\n\t\treturn false;\n\t} catch (error) {\n\t\treturn (error as NodeJS.ErrnoException).code === \"ESRCH\";\n\t}\n}\n\nexport function writeSessionJson(file: string, value: unknown): void {\n\tconst temp = `${file}.${randomUUID()}.tmp`;\n\ttry {\n\t\twriteFileSync(temp, JSON.stringify(value), { flag: \"wx\", mode: 0o600 });\n\t\trenameSync(temp, file);\n\t} finally {\n\t\tif (existsSync(temp)) unlinkSync(temp);\n\t}\n}\n\nexport class SessionOwnership {\n\treadonly owner: SessionOwner;\n\tprivate released = false;\n\tprivate readonly directory: string;\n\tconstructor(file: string) {\n\t\tfile = canonicalSessionPath(file);\n\t\tif (existsSync(file) && statSync(file).nlink > 1)\n\t\t\tthrow new SessionOwnershipError(file, \"Hard-linked sessions cannot be owned safely. Use a separate copy.\");\n\t\tthis.directory = sessionOwnershipDirectory(file);\n\t\tthis.owner = { version: 1, file, generation: randomUUID(), pid: process.pid, host: hostname(), instance };\n\t\tmkdirSync(dirname(file), { recursive: true });\n\t\ttry {\n\t\t\tmkdirSync(this.directory);\n\t\t} catch (error) {\n\t\t\tif ((error as NodeJS.ErrnoException).code !== \"EEXIST\") throw error;\n\t\t\tconst old = readSessionOwner(file);\n\t\t\tif (!old || !isSessionOwnerDead(old)) throw new SessionOwnershipError(file);\n\t\t\t// Serialize dead-owner cleanup. Never infer death from elapsed time or a missing heartbeat.\n\t\t\tconst recovery = `${this.directory}.recovery`;\n\t\t\ttry {\n\t\t\t\twriteFileSync(recovery, JSON.stringify(this.owner), { flag: \"wx\", mode: 0o600 });\n\t\t\t} catch {\n\t\t\t\tthrow new SessionOwnershipError(\n\t\t\t\t\tfile,\n\t\t\t\t\t\"Session recovery is already in progress or requires manual inspection.\",\n\t\t\t\t);\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tconst current = readSessionOwner(file);\n\t\t\t\tif (current?.generation !== old.generation || !isSessionOwnerDead(current))\n\t\t\t\t\tthrow new SessionOwnershipError(file);\n\t\t\t\tunlinkSync(join(this.directory, \"owner.json\"));\n\t\t\t\trmdirSync(this.directory);\n\t\t\t\ttry {\n\t\t\t\t\tmkdirSync(this.directory);\n\t\t\t\t} catch {\n\t\t\t\t\tthrow new SessionOwnershipError(file);\n\t\t\t\t}\n\t\t\t} finally {\n\t\t\t\tunlinkSync(recovery);\n\t\t\t}\n\t\t}\n\t\twriteSessionJson(join(this.directory, \"owner.json\"), this.owner);\n\t}\n\tbindSession(sessionId: string): void {\n\t\tthis.assert();\n\t\tthis.owner.sessionId = sessionId;\n\t\twriteSessionJson(join(this.directory, \"owner.json\"), this.owner);\n\t}\n\n\tassert(): void {\n\t\tif (existsSync(this.owner.file) && statSync(this.owner.file).nlink > 1)\n\t\t\tthrow new SessionOwnershipError(this.owner.file, \"Session acquired a hard-link alias; writes are blocked.\");\n\t\tif (this.released || readSessionOwner(this.owner.file)?.generation !== this.owner.generation) {\n\t\t\tthrow new SessionOwnershipError(\n\t\t\t\tthis.owner.file,\n\t\t\t\t\"This runtime no longer owns the session. Reclaim or reopen it before continuing.\",\n\t\t\t);\n\t\t}\n\t}\n\trelease(): void {\n\t\tif (this.released) return;\n\t\tthis.assert();\n\t\tconst releasedDirectory = `${this.directory}.released-${this.owner.generation}`;\n\t\trenameSync(this.directory, releasedDirectory);\n\t\tthis.released = true;\n\t\ttry {\n\t\t\tunlinkSync(join(releasedDirectory, \"owner.json\"));\n\t\t\trmdirSync(releasedDirectory);\n\t\t} catch {\n\t\t\t// Ownership is already relinquished. Cleanup must not reject the handoff.\n\t\t}\n\t}\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"session-retention.d.ts","sourceRoot":"","sources":["../../src/core/session-retention.ts"],"names":[],"mappings":"AAUA,MAAM,WAAW,uBAAuB;IACvC,+DAA+D;IAC/D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gFAAgF;IAChF,GAAG,CAAC,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,sBAAsB;IACtC,gDAAgD;IAChD,OAAO,EAAE,MAAM,EAAE,CAAC;CAClB;AA8CD;;;;GAIG;AACH,wBAAsB,gBAAgB,CACrC,YAAY,EAAE,MAAM,EACpB,aAAa,EAAE,MAAM,EACrB,OAAO,GAAE,uBAA4B,GACnC,OAAO,CAAC,sBAAsB,CAAC,CAwBjC","sourcesContent":["// lunr: session retention pruning (Phase 5 of lunr-ux plan).\n// Scans the sessions root (~/.lunr/agent/sessions/, layout: <root>/--<cwd>--/*.jsonl,\n// or a flat custom --session-dir) and deletes .jsonl session files older than the\n// configured retention window. The active session file is always excluded.\n\nimport type { Dirent } from \"node:fs\";\nimport { readdir, stat, unlink } from \"node:fs/promises\";\nimport { join, resolve } from \"node:path\";\nimport { SessionOwnership } from \"./session-ownership.ts\";\n\nexport interface PruneOldSessionsOptions {\n\t/** Absolute path of the active session file; never deleted. */\n\texcludeFile?: string;\n\t/** Reference timestamp in ms (defaults to Date.now()); injectable for tests. */\n\tnow?: number;\n}\n\nexport interface PruneOldSessionsResult {\n\t/** Paths of session files that were deleted. */\n\tdeleted: string[];\n}\n\nconst DAY_MS = 24 * 60 * 60 * 1000;\n\nfunction sameFile(a: string, b: string): boolean {\n\tconst ra = resolve(a);\n\tconst rb = resolve(b);\n\t// Windows paths are case-insensitive.\n\treturn process.platform === \"win32\" ? ra.toLowerCase() === rb.toLowerCase() : ra === rb;\n}\n\nasync function pruneDir(\n\tdir: string,\n\tcutoffMs: number,\n\texcludeFile: string | undefined,\n\tdeleted: string[],\n): Promise<void> {\n\tlet entries: Dirent[];\n\ttry {\n\t\tentries = await readdir(dir, { withFileTypes: true });\n\t} catch {\n\t\treturn; // Missing or unreadable directory: nothing to prune.\n\t}\n\tfor (const entry of entries) {\n\t\tif (!entry.isFile() || !entry.name.endsWith(\".jsonl\")) continue;\n\t\tconst filePath = join(dir, entry.name);\n\t\tif (excludeFile && sameFile(filePath, excludeFile)) continue;\n\t\ttry {\n\t\t\tconst info = await stat(filePath);\n\t\t\tif (info.mtimeMs < cutoffMs) {\n\t\t\t\tconst ownership = new SessionOwnership(filePath);\n\t\t\t\ttry {\n\t\t\t\t\tif ((await stat(filePath)).mtimeMs < cutoffMs) {\n\t\t\t\t\t\tawait unlink(filePath);\n\t\t\t\t\t\tdeleted.push(filePath);\n\t\t\t\t\t}\n\t\t\t\t} finally {\n\t\t\t\t\townership.release();\n\t\t\t\t}\n\t\t\t}\n\t\t} catch {\n\t\t\t// Per-file errors (stat/unlink races, permissions) must never break startup.\n\t\t}\n\t}\n}\n\n/**\n * Delete .jsonl session files older than `retentionDays` under `sessionsRoot`.\n * Covers both layouts: project subdirectories (<root>/--<cwd>--/*.jsonl) and flat\n * custom session dirs (<root>/*.jsonl). `retentionDays <= 0` keeps everything.\n */\nexport async function pruneOldSessions(\n\tsessionsRoot: string,\n\tretentionDays: number,\n\toptions: PruneOldSessionsOptions = {},\n): Promise<PruneOldSessionsResult> {\n\tconst deleted: string[] = [];\n\tif (!Number.isFinite(retentionDays) || retentionDays <= 0) {\n\t\treturn { deleted };\n\t}\n\tconst now = options.now ?? Date.now();\n\tconst cutoffMs = now - retentionDays * DAY_MS;\n\n\t// Flat layout (custom --session-dir).\n\tawait pruneDir(sessionsRoot, cutoffMs, options.excludeFile, deleted);\n\n\t// Project layout (<root>/<dir>/*.jsonl).\n\tlet subdirs: Dirent[];\n\ttry {\n\t\tsubdirs = await readdir(sessionsRoot, { withFileTypes: true });\n\t} catch {\n\t\treturn { deleted };\n\t}\n\tfor (const entry of subdirs) {\n\t\tif (entry.isDirectory()) {\n\t\t\tawait pruneDir(join(sessionsRoot, entry.name), cutoffMs, options.excludeFile, deleted);\n\t\t}\n\t}\n\treturn { deleted };\n}\n"]}
1
+ {"version":3,"file":"session-retention.d.ts","sourceRoot":"","sources":["../../src/core/session-retention.ts"],"names":[],"mappings":"AAUA,MAAM,WAAW,uBAAuB;IACvC,+DAA+D;IAC/D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gFAAgF;IAChF,GAAG,CAAC,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,sBAAsB;IACtC,gDAAgD;IAChD,OAAO,EAAE,MAAM,EAAE,CAAC;CAClB;AAsDD;;;;GAIG;AACH,wBAAsB,gBAAgB,CACrC,YAAY,EAAE,MAAM,EACpB,aAAa,EAAE,MAAM,EACrB,OAAO,GAAE,uBAA4B,GACnC,OAAO,CAAC,sBAAsB,CAAC,CAwBjC","sourcesContent":["// lunr: session retention pruning (Phase 5 of lunr-ux plan).\n// Scans the sessions root (~/.lunr/agent/sessions/, layout: <root>/--<cwd>--/*.jsonl,\n// or a flat custom --session-dir) and deletes .jsonl session files older than the\n// configured retention window. The active session file is always excluded.\n\nimport type { Dirent } from \"node:fs\";\nimport { readdir, realpath, stat, unlink } from \"node:fs/promises\";\nimport { basename, join, resolve } from \"node:path\";\nimport { SessionOwnership } from \"./session-ownership.ts\";\n\nexport interface PruneOldSessionsOptions {\n\t/** Absolute path of the active session file; never deleted. */\n\texcludeFile?: string;\n\t/** Reference timestamp in ms (defaults to Date.now()); injectable for tests. */\n\tnow?: number;\n}\n\nexport interface PruneOldSessionsResult {\n\t/** Paths of session files that were deleted. */\n\tdeleted: string[];\n}\n\nconst DAY_MS = 24 * 60 * 60 * 1000;\n\nasync function sameFile(a: string, b: string): Promise<boolean> {\n\tconst normalize = (path: string) => (process.platform === \"win32\" ? resolve(path).toLowerCase() : resolve(path));\n\tconst ra = normalize(a);\n\tconst rb = normalize(b);\n\t// Windows paths are case-insensitive.\n\tif (ra === rb) return true;\n\tif (basename(ra) !== basename(rb)) return false;\n\ttry {\n\t\tconst [canonicalA, canonicalB] = await Promise.all([realpath(a), realpath(b)]);\n\t\treturn normalize(canonicalA) === normalize(canonicalB);\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nasync function pruneDir(\n\tdir: string,\n\tcutoffMs: number,\n\texcludeFile: string | undefined,\n\tdeleted: string[],\n): Promise<void> {\n\tlet entries: Dirent[];\n\ttry {\n\t\tentries = await readdir(dir, { withFileTypes: true });\n\t} catch {\n\t\treturn; // Missing or unreadable directory: nothing to prune.\n\t}\n\tfor (const entry of entries) {\n\t\tif (!entry.isFile() || !entry.name.endsWith(\".jsonl\")) continue;\n\t\tconst filePath = join(dir, entry.name);\n\t\tif (excludeFile && (await sameFile(filePath, excludeFile))) continue;\n\t\ttry {\n\t\t\tconst info = await stat(filePath);\n\t\t\tif (info.mtimeMs < cutoffMs) {\n\t\t\t\tconst ownership = new SessionOwnership(filePath);\n\t\t\t\ttry {\n\t\t\t\t\tif ((await stat(filePath)).mtimeMs < cutoffMs) {\n\t\t\t\t\t\tawait unlink(filePath);\n\t\t\t\t\t\tdeleted.push(filePath);\n\t\t\t\t\t}\n\t\t\t\t} finally {\n\t\t\t\t\townership.release();\n\t\t\t\t}\n\t\t\t}\n\t\t} catch {\n\t\t\t// Per-file errors (stat/unlink races, permissions) must never break startup.\n\t\t}\n\t}\n}\n\n/**\n * Delete .jsonl session files older than `retentionDays` under `sessionsRoot`.\n * Covers both layouts: project subdirectories (<root>/--<cwd>--/*.jsonl) and flat\n * custom session dirs (<root>/*.jsonl). `retentionDays <= 0` keeps everything.\n */\nexport async function pruneOldSessions(\n\tsessionsRoot: string,\n\tretentionDays: number,\n\toptions: PruneOldSessionsOptions = {},\n): Promise<PruneOldSessionsResult> {\n\tconst deleted: string[] = [];\n\tif (!Number.isFinite(retentionDays) || retentionDays <= 0) {\n\t\treturn { deleted };\n\t}\n\tconst now = options.now ?? Date.now();\n\tconst cutoffMs = now - retentionDays * DAY_MS;\n\n\t// Flat layout (custom --session-dir).\n\tawait pruneDir(sessionsRoot, cutoffMs, options.excludeFile, deleted);\n\n\t// Project layout (<root>/<dir>/*.jsonl).\n\tlet subdirs: Dirent[];\n\ttry {\n\t\tsubdirs = await readdir(sessionsRoot, { withFileTypes: true });\n\t} catch {\n\t\treturn { deleted };\n\t}\n\tfor (const entry of subdirs) {\n\t\tif (entry.isDirectory()) {\n\t\t\tawait pruneDir(join(sessionsRoot, entry.name), cutoffMs, options.excludeFile, deleted);\n\t\t}\n\t}\n\treturn { deleted };\n}\n"]}
@@ -2,15 +2,26 @@
2
2
  // Scans the sessions root (~/.lunr/agent/sessions/, layout: <root>/--<cwd>--/*.jsonl,
3
3
  // or a flat custom --session-dir) and deletes .jsonl session files older than the
4
4
  // configured retention window. The active session file is always excluded.
5
- import { readdir, stat, unlink } from "node:fs/promises";
6
- import { join, resolve } from "node:path";
5
+ import { readdir, realpath, stat, unlink } from "node:fs/promises";
6
+ import { basename, join, resolve } from "node:path";
7
7
  import { SessionOwnership } from "./session-ownership.js";
8
8
  const DAY_MS = 24 * 60 * 60 * 1000;
9
- function sameFile(a, b) {
10
- const ra = resolve(a);
11
- const rb = resolve(b);
9
+ async function sameFile(a, b) {
10
+ const normalize = (path) => (process.platform === "win32" ? resolve(path).toLowerCase() : resolve(path));
11
+ const ra = normalize(a);
12
+ const rb = normalize(b);
12
13
  // Windows paths are case-insensitive.
13
- return process.platform === "win32" ? ra.toLowerCase() === rb.toLowerCase() : ra === rb;
14
+ if (ra === rb)
15
+ return true;
16
+ if (basename(ra) !== basename(rb))
17
+ return false;
18
+ try {
19
+ const [canonicalA, canonicalB] = await Promise.all([realpath(a), realpath(b)]);
20
+ return normalize(canonicalA) === normalize(canonicalB);
21
+ }
22
+ catch {
23
+ return false;
24
+ }
14
25
  }
15
26
  async function pruneDir(dir, cutoffMs, excludeFile, deleted) {
16
27
  let entries;
@@ -24,7 +35,7 @@ async function pruneDir(dir, cutoffMs, excludeFile, deleted) {
24
35
  if (!entry.isFile() || !entry.name.endsWith(".jsonl"))
25
36
  continue;
26
37
  const filePath = join(dir, entry.name);
27
- if (excludeFile && sameFile(filePath, excludeFile))
38
+ if (excludeFile && (await sameFile(filePath, excludeFile)))
28
39
  continue;
29
40
  try {
30
41
  const info = await stat(filePath);
@@ -1 +1 @@
1
- {"version":3,"file":"session-retention.js","sourceRoot":"","sources":["../../src/core/session-retention.ts"],"names":[],"mappings":"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","sourcesContent":["// lunr: session retention pruning (Phase 5 of lunr-ux plan).\n// Scans the sessions root (~/.lunr/agent/sessions/, layout: <root>/--<cwd>--/*.jsonl,\n// or a flat custom --session-dir) and deletes .jsonl session files older than the\n// configured retention window. The active session file is always excluded.\n\nimport type { Dirent } from \"node:fs\";\nimport { readdir, stat, unlink } from \"node:fs/promises\";\nimport { join, resolve } from \"node:path\";\nimport { SessionOwnership } from \"./session-ownership.ts\";\n\nexport interface PruneOldSessionsOptions {\n\t/** Absolute path of the active session file; never deleted. */\n\texcludeFile?: string;\n\t/** Reference timestamp in ms (defaults to Date.now()); injectable for tests. */\n\tnow?: number;\n}\n\nexport interface PruneOldSessionsResult {\n\t/** Paths of session files that were deleted. */\n\tdeleted: string[];\n}\n\nconst DAY_MS = 24 * 60 * 60 * 1000;\n\nfunction sameFile(a: string, b: string): boolean {\n\tconst ra = resolve(a);\n\tconst rb = resolve(b);\n\t// Windows paths are case-insensitive.\n\treturn process.platform === \"win32\" ? ra.toLowerCase() === rb.toLowerCase() : ra === rb;\n}\n\nasync function pruneDir(\n\tdir: string,\n\tcutoffMs: number,\n\texcludeFile: string | undefined,\n\tdeleted: string[],\n): Promise<void> {\n\tlet entries: Dirent[];\n\ttry {\n\t\tentries = await readdir(dir, { withFileTypes: true });\n\t} catch {\n\t\treturn; // Missing or unreadable directory: nothing to prune.\n\t}\n\tfor (const entry of entries) {\n\t\tif (!entry.isFile() || !entry.name.endsWith(\".jsonl\")) continue;\n\t\tconst filePath = join(dir, entry.name);\n\t\tif (excludeFile && sameFile(filePath, excludeFile)) continue;\n\t\ttry {\n\t\t\tconst info = await stat(filePath);\n\t\t\tif (info.mtimeMs < cutoffMs) {\n\t\t\t\tconst ownership = new SessionOwnership(filePath);\n\t\t\t\ttry {\n\t\t\t\t\tif ((await stat(filePath)).mtimeMs < cutoffMs) {\n\t\t\t\t\t\tawait unlink(filePath);\n\t\t\t\t\t\tdeleted.push(filePath);\n\t\t\t\t\t}\n\t\t\t\t} finally {\n\t\t\t\t\townership.release();\n\t\t\t\t}\n\t\t\t}\n\t\t} catch {\n\t\t\t// Per-file errors (stat/unlink races, permissions) must never break startup.\n\t\t}\n\t}\n}\n\n/**\n * Delete .jsonl session files older than `retentionDays` under `sessionsRoot`.\n * Covers both layouts: project subdirectories (<root>/--<cwd>--/*.jsonl) and flat\n * custom session dirs (<root>/*.jsonl). `retentionDays <= 0` keeps everything.\n */\nexport async function pruneOldSessions(\n\tsessionsRoot: string,\n\tretentionDays: number,\n\toptions: PruneOldSessionsOptions = {},\n): Promise<PruneOldSessionsResult> {\n\tconst deleted: string[] = [];\n\tif (!Number.isFinite(retentionDays) || retentionDays <= 0) {\n\t\treturn { deleted };\n\t}\n\tconst now = options.now ?? Date.now();\n\tconst cutoffMs = now - retentionDays * DAY_MS;\n\n\t// Flat layout (custom --session-dir).\n\tawait pruneDir(sessionsRoot, cutoffMs, options.excludeFile, deleted);\n\n\t// Project layout (<root>/<dir>/*.jsonl).\n\tlet subdirs: Dirent[];\n\ttry {\n\t\tsubdirs = await readdir(sessionsRoot, { withFileTypes: true });\n\t} catch {\n\t\treturn { deleted };\n\t}\n\tfor (const entry of subdirs) {\n\t\tif (entry.isDirectory()) {\n\t\t\tawait pruneDir(join(sessionsRoot, entry.name), cutoffMs, options.excludeFile, deleted);\n\t\t}\n\t}\n\treturn { deleted };\n}\n"]}
1
+ {"version":3,"file":"session-retention.js","sourceRoot":"","sources":["../../src/core/session-retention.ts"],"names":[],"mappings":"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","sourcesContent":["// lunr: session retention pruning (Phase 5 of lunr-ux plan).\n// Scans the sessions root (~/.lunr/agent/sessions/, layout: <root>/--<cwd>--/*.jsonl,\n// or a flat custom --session-dir) and deletes .jsonl session files older than the\n// configured retention window. The active session file is always excluded.\n\nimport type { Dirent } from \"node:fs\";\nimport { readdir, realpath, stat, unlink } from \"node:fs/promises\";\nimport { basename, join, resolve } from \"node:path\";\nimport { SessionOwnership } from \"./session-ownership.ts\";\n\nexport interface PruneOldSessionsOptions {\n\t/** Absolute path of the active session file; never deleted. */\n\texcludeFile?: string;\n\t/** Reference timestamp in ms (defaults to Date.now()); injectable for tests. */\n\tnow?: number;\n}\n\nexport interface PruneOldSessionsResult {\n\t/** Paths of session files that were deleted. */\n\tdeleted: string[];\n}\n\nconst DAY_MS = 24 * 60 * 60 * 1000;\n\nasync function sameFile(a: string, b: string): Promise<boolean> {\n\tconst normalize = (path: string) => (process.platform === \"win32\" ? resolve(path).toLowerCase() : resolve(path));\n\tconst ra = normalize(a);\n\tconst rb = normalize(b);\n\t// Windows paths are case-insensitive.\n\tif (ra === rb) return true;\n\tif (basename(ra) !== basename(rb)) return false;\n\ttry {\n\t\tconst [canonicalA, canonicalB] = await Promise.all([realpath(a), realpath(b)]);\n\t\treturn normalize(canonicalA) === normalize(canonicalB);\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nasync function pruneDir(\n\tdir: string,\n\tcutoffMs: number,\n\texcludeFile: string | undefined,\n\tdeleted: string[],\n): Promise<void> {\n\tlet entries: Dirent[];\n\ttry {\n\t\tentries = await readdir(dir, { withFileTypes: true });\n\t} catch {\n\t\treturn; // Missing or unreadable directory: nothing to prune.\n\t}\n\tfor (const entry of entries) {\n\t\tif (!entry.isFile() || !entry.name.endsWith(\".jsonl\")) continue;\n\t\tconst filePath = join(dir, entry.name);\n\t\tif (excludeFile && (await sameFile(filePath, excludeFile))) continue;\n\t\ttry {\n\t\t\tconst info = await stat(filePath);\n\t\t\tif (info.mtimeMs < cutoffMs) {\n\t\t\t\tconst ownership = new SessionOwnership(filePath);\n\t\t\t\ttry {\n\t\t\t\t\tif ((await stat(filePath)).mtimeMs < cutoffMs) {\n\t\t\t\t\t\tawait unlink(filePath);\n\t\t\t\t\t\tdeleted.push(filePath);\n\t\t\t\t\t}\n\t\t\t\t} finally {\n\t\t\t\t\townership.release();\n\t\t\t\t}\n\t\t\t}\n\t\t} catch {\n\t\t\t// Per-file errors (stat/unlink races, permissions) must never break startup.\n\t\t}\n\t}\n}\n\n/**\n * Delete .jsonl session files older than `retentionDays` under `sessionsRoot`.\n * Covers both layouts: project subdirectories (<root>/--<cwd>--/*.jsonl) and flat\n * custom session dirs (<root>/*.jsonl). `retentionDays <= 0` keeps everything.\n */\nexport async function pruneOldSessions(\n\tsessionsRoot: string,\n\tretentionDays: number,\n\toptions: PruneOldSessionsOptions = {},\n): Promise<PruneOldSessionsResult> {\n\tconst deleted: string[] = [];\n\tif (!Number.isFinite(retentionDays) || retentionDays <= 0) {\n\t\treturn { deleted };\n\t}\n\tconst now = options.now ?? Date.now();\n\tconst cutoffMs = now - retentionDays * DAY_MS;\n\n\t// Flat layout (custom --session-dir).\n\tawait pruneDir(sessionsRoot, cutoffMs, options.excludeFile, deleted);\n\n\t// Project layout (<root>/<dir>/*.jsonl).\n\tlet subdirs: Dirent[];\n\ttry {\n\t\tsubdirs = await readdir(sessionsRoot, { withFileTypes: true });\n\t} catch {\n\t\treturn { deleted };\n\t}\n\tfor (const entry of subdirs) {\n\t\tif (entry.isDirectory()) {\n\t\t\tawait pruneDir(join(sessionsRoot, entry.name), cutoffMs, options.excludeFile, deleted);\n\t\t}\n\t}\n\treturn { deleted };\n}\n"]}
@@ -0,0 +1,10 @@
1
+ import { SessionManager } from "./session-manager.ts";
2
+ import type { SettingsManager } from "./settings-manager.ts";
3
+ /** Global maintenance keeps its own policy; approved project policy applies only to its configured tree. */
4
+ export declare function getSessionRetentionTargets(globalSettings: SettingsManager, runtimeSettings: SettingsManager, explicitSessionDir?: string): {
5
+ directory: string;
6
+ days: number;
7
+ }[];
8
+ /** Replace the provisional manager only after a project directory is approved. */
9
+ export declare function selectApprovedStartupSession(manager: SessionManager, directory: string | undefined, select?: () => Promise<SessionManager>): Promise<SessionManager>;
10
+ //# sourceMappingURL=session-startup-settings.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-startup-settings.d.ts","sourceRoot":"","sources":["../../src/core/session-startup-settings.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAgC7D,4GAA4G;AAC5G,wBAAgB,0BAA0B,CACzC,cAAc,EAAE,eAAe,EAC/B,eAAe,EAAE,eAAe,EAChC,kBAAkB,CAAC,EAAE,MAAM,GACzB;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,EAAE,CAmBvC;AAED,kFAAkF;AAClF,wBAAsB,4BAA4B,CACjD,OAAO,EAAE,cAAc,EACvB,SAAS,EAAE,MAAM,GAAG,SAAS,EAC7B,MAAM,CAAC,EAAE,MAAM,OAAO,CAAC,cAAc,CAAC,GACpC,OAAO,CAAC,cAAc,CAAC,CASzB","sourcesContent":["import { lstatSync, realpathSync } from \"node:fs\";\nimport { basename, dirname, isAbsolute, join, relative, sep } from \"node:path\";\nimport { getSessionsDir } from \"../config.ts\";\nimport { SessionManager } from \"./session-manager.ts\";\nimport type { SettingsManager } from \"./settings-manager.ts\";\n\nfunction canonicalDirectory(directory: string, allowMissing = false): string | undefined {\n\ttry {\n\t\treturn realpathSync(directory);\n\t} catch {\n\t\tif (!allowMissing) return undefined;\n\t\ttry {\n\t\t\t// A dangling link exists and must not be treated as a missing directory.\n\t\t\tlstatSync(directory);\n\t\t\treturn undefined;\n\t\t} catch (error) {\n\t\t\tif (!(error instanceof Error) || !(\"code\" in error) || error.code !== \"ENOENT\") return undefined;\n\t\t}\n\t\ttry {\n\t\t\t// The standard sessions root may not exist when all storage is custom.\n\t\t\treturn join(realpathSync(dirname(directory)), basename(directory));\n\t\t} catch {\n\t\t\treturn undefined;\n\t\t}\n\t}\n}\n\nfunction containsDirectory(root: string, directory: string): boolean {\n\tif (process.platform === \"win32\") {\n\t\troot = root.toLowerCase();\n\t\tdirectory = directory.toLowerCase();\n\t}\n\tconst path = relative(root, directory);\n\treturn path === \"\" || (!isAbsolute(path) && path !== \"..\" && !path.startsWith(`..${sep}`));\n}\n\n/** Global maintenance keeps its own policy; approved project policy applies only to its configured tree. */\nexport function getSessionRetentionTargets(\n\tglobalSettings: SettingsManager,\n\truntimeSettings: SettingsManager,\n\texplicitSessionDir?: string,\n): { directory: string; days: number }[] {\n\tconst globalDirectory = canonicalDirectory(getSessionsDir(), true);\n\tif (!globalDirectory) return [];\n\tconst globalDays = globalSettings.getSessionRetentionDays();\n\tconst targets = [{ directory: globalDirectory, days: globalDays }];\n\tconst configuredDirectory = explicitSessionDir ?? runtimeSettings.getSessionDir();\n\tconst directory = configuredDirectory ? canonicalDirectory(configuredDirectory) : undefined;\n\tif (directory && relative(globalDirectory, directory) !== \"\") {\n\t\tconst projectDirectory = runtimeSettings.getProjectSettings().sessionDir;\n\t\tconst overlapsGlobal =\n\t\t\tcontainsDirectory(globalDirectory, directory) || containsDirectory(directory, globalDirectory);\n\t\tconst usesProjectDirectory =\n\t\t\truntimeSettings.isProjectTrusted() &&\n\t\t\tprojectDirectory !== undefined &&\n\t\t\t!overlapsGlobal &&\n\t\t\tdirectory === canonicalDirectory(projectDirectory);\n\t\ttargets.push({ directory, days: usesProjectDirectory ? runtimeSettings.getSessionRetentionDays() : globalDays });\n\t}\n\treturn targets.filter(({ days }) => days > 0);\n}\n\n/** Replace the provisional manager only after a project directory is approved. */\nexport async function selectApprovedStartupSession(\n\tmanager: SessionManager,\n\tdirectory: string | undefined,\n\tselect?: () => Promise<SessionManager>,\n): Promise<SessionManager> {\n\tconst cwd = manager.getCwd();\n\tconst sessionFile = manager.getSessionFile();\n\tconst id = manager.getSessionId();\n\tmanager.dispose();\n\tif (select) return select();\n\treturn sessionFile\n\t\t? SessionManager.open(sessionFile, directory, cwd)\n\t\t: SessionManager.create(cwd, directory, { id });\n}\n"]}
@@ -0,0 +1,70 @@
1
+ import { lstatSync, realpathSync } from "node:fs";
2
+ import { basename, dirname, isAbsolute, join, relative, sep } from "node:path";
3
+ import { getSessionsDir } from "../config.js";
4
+ import { SessionManager } from "./session-manager.js";
5
+ function canonicalDirectory(directory, allowMissing = false) {
6
+ try {
7
+ return realpathSync(directory);
8
+ }
9
+ catch {
10
+ if (!allowMissing)
11
+ return undefined;
12
+ try {
13
+ // A dangling link exists and must not be treated as a missing directory.
14
+ lstatSync(directory);
15
+ return undefined;
16
+ }
17
+ catch (error) {
18
+ if (!(error instanceof Error) || !("code" in error) || error.code !== "ENOENT")
19
+ return undefined;
20
+ }
21
+ try {
22
+ // The standard sessions root may not exist when all storage is custom.
23
+ return join(realpathSync(dirname(directory)), basename(directory));
24
+ }
25
+ catch {
26
+ return undefined;
27
+ }
28
+ }
29
+ }
30
+ function containsDirectory(root, directory) {
31
+ if (process.platform === "win32") {
32
+ root = root.toLowerCase();
33
+ directory = directory.toLowerCase();
34
+ }
35
+ const path = relative(root, directory);
36
+ return path === "" || (!isAbsolute(path) && path !== ".." && !path.startsWith(`..${sep}`));
37
+ }
38
+ /** Global maintenance keeps its own policy; approved project policy applies only to its configured tree. */
39
+ export function getSessionRetentionTargets(globalSettings, runtimeSettings, explicitSessionDir) {
40
+ const globalDirectory = canonicalDirectory(getSessionsDir(), true);
41
+ if (!globalDirectory)
42
+ return [];
43
+ const globalDays = globalSettings.getSessionRetentionDays();
44
+ const targets = [{ directory: globalDirectory, days: globalDays }];
45
+ const configuredDirectory = explicitSessionDir ?? runtimeSettings.getSessionDir();
46
+ const directory = configuredDirectory ? canonicalDirectory(configuredDirectory) : undefined;
47
+ if (directory && relative(globalDirectory, directory) !== "") {
48
+ const projectDirectory = runtimeSettings.getProjectSettings().sessionDir;
49
+ const overlapsGlobal = containsDirectory(globalDirectory, directory) || containsDirectory(directory, globalDirectory);
50
+ const usesProjectDirectory = runtimeSettings.isProjectTrusted() &&
51
+ projectDirectory !== undefined &&
52
+ !overlapsGlobal &&
53
+ directory === canonicalDirectory(projectDirectory);
54
+ targets.push({ directory, days: usesProjectDirectory ? runtimeSettings.getSessionRetentionDays() : globalDays });
55
+ }
56
+ return targets.filter(({ days }) => days > 0);
57
+ }
58
+ /** Replace the provisional manager only after a project directory is approved. */
59
+ export async function selectApprovedStartupSession(manager, directory, select) {
60
+ const cwd = manager.getCwd();
61
+ const sessionFile = manager.getSessionFile();
62
+ const id = manager.getSessionId();
63
+ manager.dispose();
64
+ if (select)
65
+ return select();
66
+ return sessionFile
67
+ ? SessionManager.open(sessionFile, directory, cwd)
68
+ : SessionManager.create(cwd, directory, { id });
69
+ }
70
+ //# sourceMappingURL=session-startup-settings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-startup-settings.js","sourceRoot":"","sources":["../../src/core/session-startup-settings.ts"],"names":[],"mappings":"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","sourcesContent":["import { lstatSync, realpathSync } from \"node:fs\";\nimport { basename, dirname, isAbsolute, join, relative, sep } from \"node:path\";\nimport { getSessionsDir } from \"../config.ts\";\nimport { SessionManager } from \"./session-manager.ts\";\nimport type { SettingsManager } from \"./settings-manager.ts\";\n\nfunction canonicalDirectory(directory: string, allowMissing = false): string | undefined {\n\ttry {\n\t\treturn realpathSync(directory);\n\t} catch {\n\t\tif (!allowMissing) return undefined;\n\t\ttry {\n\t\t\t// A dangling link exists and must not be treated as a missing directory.\n\t\t\tlstatSync(directory);\n\t\t\treturn undefined;\n\t\t} catch (error) {\n\t\t\tif (!(error instanceof Error) || !(\"code\" in error) || error.code !== \"ENOENT\") return undefined;\n\t\t}\n\t\ttry {\n\t\t\t// The standard sessions root may not exist when all storage is custom.\n\t\t\treturn join(realpathSync(dirname(directory)), basename(directory));\n\t\t} catch {\n\t\t\treturn undefined;\n\t\t}\n\t}\n}\n\nfunction containsDirectory(root: string, directory: string): boolean {\n\tif (process.platform === \"win32\") {\n\t\troot = root.toLowerCase();\n\t\tdirectory = directory.toLowerCase();\n\t}\n\tconst path = relative(root, directory);\n\treturn path === \"\" || (!isAbsolute(path) && path !== \"..\" && !path.startsWith(`..${sep}`));\n}\n\n/** Global maintenance keeps its own policy; approved project policy applies only to its configured tree. */\nexport function getSessionRetentionTargets(\n\tglobalSettings: SettingsManager,\n\truntimeSettings: SettingsManager,\n\texplicitSessionDir?: string,\n): { directory: string; days: number }[] {\n\tconst globalDirectory = canonicalDirectory(getSessionsDir(), true);\n\tif (!globalDirectory) return [];\n\tconst globalDays = globalSettings.getSessionRetentionDays();\n\tconst targets = [{ directory: globalDirectory, days: globalDays }];\n\tconst configuredDirectory = explicitSessionDir ?? runtimeSettings.getSessionDir();\n\tconst directory = configuredDirectory ? canonicalDirectory(configuredDirectory) : undefined;\n\tif (directory && relative(globalDirectory, directory) !== \"\") {\n\t\tconst projectDirectory = runtimeSettings.getProjectSettings().sessionDir;\n\t\tconst overlapsGlobal =\n\t\t\tcontainsDirectory(globalDirectory, directory) || containsDirectory(directory, globalDirectory);\n\t\tconst usesProjectDirectory =\n\t\t\truntimeSettings.isProjectTrusted() &&\n\t\t\tprojectDirectory !== undefined &&\n\t\t\t!overlapsGlobal &&\n\t\t\tdirectory === canonicalDirectory(projectDirectory);\n\t\ttargets.push({ directory, days: usesProjectDirectory ? runtimeSettings.getSessionRetentionDays() : globalDays });\n\t}\n\treturn targets.filter(({ days }) => days > 0);\n}\n\n/** Replace the provisional manager only after a project directory is approved. */\nexport async function selectApprovedStartupSession(\n\tmanager: SessionManager,\n\tdirectory: string | undefined,\n\tselect?: () => Promise<SessionManager>,\n): Promise<SessionManager> {\n\tconst cwd = manager.getCwd();\n\tconst sessionFile = manager.getSessionFile();\n\tconst id = manager.getSessionId();\n\tmanager.dispose();\n\tif (select) return select();\n\treturn sessionFile\n\t\t? SessionManager.open(sessionFile, directory, cwd)\n\t\t: SessionManager.create(cwd, directory, { id });\n}\n"]}
@@ -130,6 +130,8 @@ export interface Settings {
130
130
  modelTiers?: ModelTiersSettings;
131
131
  modelInstructions?: ModelInstructionsSettings;
132
132
  sessionRetentionDays?: number;
133
+ computerUse?: boolean;
134
+ computerForeground?: boolean;
133
135
  browserEnabled?: boolean;
134
136
  browserAllowPrivateNetwork?: boolean;
135
137
  memoryEnabled?: boolean;
@@ -302,6 +304,10 @@ export declare class SettingsManager {
302
304
  getSessionRetentionDays(): number;
303
305
  setSessionRetentionDays(days: number): void;
304
306
  getMemoryCharCap(): number;
307
+ getComputerUse(): boolean;
308
+ setComputerUse(enabled: boolean): void;
309
+ getComputerForeground(): boolean;
310
+ setComputerForeground(enabled: boolean): void;
305
311
  getBrowserEnabled(): boolean;
306
312
  setBrowserEnabled(enabled: boolean): void;
307
313
  getMemoryEnabled(): boolean;