@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
@@ -1 +1 @@
1
- {"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/gateway/service.ts"],"names":[],"mappings":"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","sourcesContent":["import { spawn, spawnSync } from \"node:child_process\";\nimport { createHash, randomUUID } from \"node:crypto\";\nimport { existsSync, mkdirSync, readFileSync, renameSync, rmSync, writeFileSync } from \"node:fs\";\nimport { homedir, userInfo } from \"node:os\";\nimport { dirname, join, resolve } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { getAgentDir } from \"../config.ts\";\n\nexport type StartupMode = \"off\" | \"login\" | \"boot\";\nexport interface GatewayServiceSettings {\n\tstartup: StartupMode;\n}\nexport interface GatewayRuntimeStatus {\n\tversion: 1;\n\tinstance: string;\n\tpid: number;\n\tstartedAt: string;\n\tupdatedAt: string;\n\tstate: \"starting\" | \"ready\" | \"stopping\";\n\tplatforms: Record<string, string>;\n}\nconst servicePrefix = \"lunr-gateway\";\nexport const serviceDirectory = () => join(getAgentDir(), \"gateway-service\");\nexport const gatewayLogPath = () => join(serviceDirectory(), \"gateway.log\");\nconst statusPath = () => join(serviceDirectory(), \"status.json\");\nconst controlPath = () => join(serviceDirectory(), \"control.json\");\nconst settingsPath = () => join(serviceDirectory(), \"service.json\");\n\nexport function atomicJson(path: string, value: unknown): void {\n\tmkdirSync(dirname(path), { recursive: true, mode: 0o700 });\n\tconst temp = `${path}.${randomUUID()}.tmp`;\n\twriteFileSync(temp, `${JSON.stringify(value, null, 2)}\\n`, { mode: 0o600 });\n\trenameSync(temp, path);\n}\n\nfunction readJson(path: string): unknown {\n\ttry {\n\t\treturn JSON.parse(readFileSync(path, \"utf8\"));\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\nexport function loadServiceSettings(): GatewayServiceSettings {\n\tconst raw = readJson(settingsPath());\n\tif (raw && typeof raw === \"object\" && \"startup\" in raw && (raw.startup === \"login\" || raw.startup === \"boot\")) {\n\t\treturn { startup: raw.startup };\n\t}\n\treturn { startup: \"off\" };\n}\n\nexport function processExists(pid: number): boolean {\n\tif (!Number.isSafeInteger(pid) || pid <= 0) return false;\n\ttry {\n\t\tprocess.kill(pid, 0);\n\t\treturn true;\n\t} catch (error) {\n\t\treturn !(error && typeof error === \"object\" && \"code\" in error && error.code === \"ESRCH\");\n\t}\n}\n\nexport function readGatewayStatus(file = statusPath()): GatewayRuntimeStatus | undefined {\n\tconst raw = readJson(file);\n\tif (\n\t\t!raw ||\n\t\ttypeof raw !== \"object\" ||\n\t\t!(\"version\" in raw) ||\n\t\traw.version !== 1 ||\n\t\t!(\"pid\" in raw) ||\n\t\ttypeof raw.pid !== \"number\"\n\t)\n\t\treturn undefined;\n\tif (\n\t\t!(\"instance\" in raw) ||\n\t\ttypeof raw.instance !== \"string\" ||\n\t\t!(\"updatedAt\" in raw) ||\n\t\ttypeof raw.updatedAt !== \"string\"\n\t)\n\t\treturn undefined;\n\tif (!(\"state\" in raw) || ![\"starting\", \"ready\", \"stopping\"].includes(String(raw.state))) return undefined;\n\tif (\n\t\t!(\"platforms\" in raw) ||\n\t\t!raw.platforms ||\n\t\ttypeof raw.platforms !== \"object\" ||\n\t\t!(\"startedAt\" in raw) ||\n\t\ttypeof raw.startedAt !== \"string\"\n\t)\n\t\treturn undefined;\n\treturn raw as GatewayRuntimeStatus;\n}\n\nexport function gatewayIsRunning(): boolean {\n\tconst status = readGatewayStatus();\n\treturn !!status && processExists(status.pid);\n}\n\nexport function claimGateway(onStop: () => void): {\n\tupdate: (platforms: Record<string, string>, state?: GatewayRuntimeStatus[\"state\"]) => void;\n\trelease: () => void;\n} {\n\tconst dir = serviceDirectory();\n\tmkdirSync(dir, { recursive: true, mode: 0o700 });\n\tconst lock = join(dir, \"lock\");\n\ttry {\n\t\tmkdirSync(lock);\n\t} catch (error) {\n\t\tif (!error || typeof error !== \"object\" || !(\"code\" in error) || error.code !== \"EEXIST\") throw error;\n\t\tconst previous = readGatewayStatus(join(lock, \"owner.json\"));\n\t\tif (!previous || processExists(previous.pid))\n\t\t\tthrow new Error(\"Gateway already running or startup lock is unresolved. Run lunr gateway doctor.\");\n\t\t// Recovery is serialized; a late recoverer must not remove a new owner's lock.\n\t\tconst recovery = join(dir, \"recovery\");\n\t\tmkdirSync(recovery);\n\t\ttry {\n\t\t\tconst current = readGatewayStatus(join(lock, \"owner.json\"));\n\t\t\tif (!current || current.instance !== previous.instance || processExists(current.pid))\n\t\t\t\tthrow new Error(\"Gateway ownership changed. Try again.\");\n\t\t\trmSync(lock, { recursive: true });\n\t\t\tmkdirSync(lock);\n\t\t} finally {\n\t\t\trmSync(recovery, { recursive: true, force: true });\n\t\t}\n\t}\n\tconst status: GatewayRuntimeStatus = {\n\t\tversion: 1,\n\t\tinstance: randomUUID(),\n\t\tpid: process.pid,\n\t\tstartedAt: new Date().toISOString(),\n\t\tupdatedAt: new Date().toISOString(),\n\t\tstate: \"starting\",\n\t\tplatforms: {},\n\t};\n\tatomicJson(join(lock, \"owner.json\"), status);\n\tconst save = () => {\n\t\tstatus.updatedAt = new Date().toISOString();\n\t\tatomicJson(statusPath(), status);\n\t};\n\tsave();\n\tlet stopping = false;\n\tconst timer = setInterval(() => {\n\t\tsave();\n\t\tconst control = readJson(controlPath());\n\t\tif (\n\t\t\t!stopping &&\n\t\t\tcontrol &&\n\t\t\ttypeof control === \"object\" &&\n\t\t\t\"instance\" in control &&\n\t\t\tcontrol.instance === status.instance &&\n\t\t\t\"action\" in control &&\n\t\t\tcontrol.action === \"stop\"\n\t\t) {\n\t\t\tstopping = true;\n\t\t\tstatus.state = \"stopping\";\n\t\t\tonStop();\n\t\t}\n\t}, 500);\n\treturn {\n\t\tupdate(platforms, state = \"ready\") {\n\t\t\tif (stopping && state !== \"stopping\") {\n\t\t\t\tstopping = false;\n\t\t\t\tconst control = readJson(controlPath());\n\t\t\t\tif (control && typeof control === \"object\" && \"instance\" in control && control.instance === status.instance)\n\t\t\t\t\trmSync(controlPath(), { force: true });\n\t\t\t}\n\t\t\tstatus.platforms = { ...platforms };\n\t\t\tstatus.state = state;\n\t\t\tsave();\n\t\t},\n\t\trelease() {\n\t\t\tclearInterval(timer);\n\t\t\tif (readGatewayStatus()?.instance === status.instance) {\n\t\t\t\trmSync(statusPath(), { force: true });\n\t\t\t\trmSync(controlPath(), { force: true });\n\t\t\t\trmSync(lock, { recursive: true, force: true });\n\t\t\t}\n\t\t},\n\t};\n}\n\nfunction cliPath(): string {\n\tconst candidate = process.argv[1];\n\tif (candidate && existsSync(candidate)) return resolve(candidate);\n\treturn fileURLToPath(new URL(\"../cli.js\", import.meta.url));\n}\n\nconst sleep = (ms: number) => new Promise<void>((resolve) => setTimeout(resolve, ms));\n\nexport async function startGatewayService(): Promise<string> {\n\tif (gatewayIsRunning()) {\n\t\tif (readGatewayStatus()?.state === \"ready\") return \"Gateway is already running.\";\n\t\tthrow new Error(\n\t\t\t`Gateway process is running but no bot is connected. ${serviceStatusText()}\\nInspect ${gatewayLogPath()}`,\n\t\t);\n\t}\n\tmkdirSync(serviceDirectory(), { recursive: true, mode: 0o700 });\n\tconst startup = loadServiceSettings().startup;\n\tif (startup !== \"off\") {\n\t\tconst user = userInfo();\n\t\tconst spec = startupSpec(process.platform, startup, {\n\t\t\thome: homedir(),\n\t\t\tagentDir: getAgentDir(),\n\t\t\tnode: process.execPath,\n\t\t\tcli: cliPath(),\n\t\t\tusername: user.username,\n\t\t\tuid: user.uid,\n\t\t});\n\t\texecute(spec.start);\n\t\tfor (let i = 0; i < 100; i++) {\n\t\t\tif (readGatewayStatus()?.state === \"ready\" && gatewayIsRunning()) return \"Gateway started.\";\n\t\t\tawait sleep(200);\n\t\t}\n\t\tthrow new Error(\n\t\t\t`Startup service did not connect within 20 seconds. ${serviceStatusText()}\\nRun lunr gateway doctor and inspect ${gatewayLogPath()}`,\n\t\t);\n\t}\n\tconst { openSync, closeSync } = await import(\"node:fs\");\n\tconst log = openSync(gatewayLogPath(), \"a\", 0o600);\n\tconst child = spawn(process.execPath, [cliPath(), \"gateway\", \"run\"], {\n\t\tcwd: homedir(),\n\t\tdetached: true,\n\t\twindowsHide: true,\n\t\tstdio: [\"ignore\", log, log],\n\t\tenv: { ...process.env, PI_CODING_AGENT_DIR: getAgentDir() },\n\t});\n\tcloseSync(log);\n\tlet spawnError: Error | undefined;\n\tchild.on(\"error\", (error) => {\n\t\tspawnError = error;\n\t});\n\tchild.unref();\n\tfor (let i = 0; i < 100; i++) {\n\t\tif (spawnError) throw spawnError;\n\t\tconst status = readGatewayStatus();\n\t\tif (status && status.pid === child.pid && status.state === \"ready\") return \"Gateway started.\";\n\t\tif (child.exitCode !== null)\n\t\t\tthrow new Error(`Gateway exited with code ${child.exitCode}. See ${gatewayLogPath()}`);\n\t\tawait sleep(200);\n\t}\n\tthrow new Error(\n\t\t`Gateway did not connect within 20 seconds. ${serviceStatusText()}\\nCheck lunr gateway status and ${gatewayLogPath()}`,\n\t);\n}\n\nexport async function stopGatewayService(): Promise<string> {\n\tconst status = readGatewayStatus();\n\tif (!status || !processExists(status.pid)) return \"Gateway is not running.\";\n\tatomicJson(controlPath(), { instance: status.instance, action: \"stop\" });\n\tfor (let i = 0; i < 150; i++) {\n\t\tif (readGatewayStatus()?.instance !== status.instance || !processExists(status.pid)) return \"Gateway stopped.\";\n\t\tawait sleep(200);\n\t}\n\tthrow new Error(\"Gateway is still stopping after 30 seconds. Inspect the log; no unrelated process was terminated.\");\n}\n\nexport interface StartupSpec {\n\tpath: string;\n\tcontent: string;\n\tinstall: string[][];\n\tremove: string[][];\n\tverify: string[];\n\tstart: string[];\n}\nfunction xml(value: string): string {\n\treturn value.replaceAll(\"&\", \"&amp;\").replaceAll(\"<\", \"&lt;\").replaceAll(\">\", \"&gt;\").replaceAll('\"', \"&quot;\");\n}\nfunction systemdArg(value: string): string {\n\treturn `\"${value.replaceAll(\"%\", \"%%\").replaceAll(\"\\\\\", \"\\\\\\\\\").replaceAll('\"', '\\\\\"')}\"`;\n}\nfunction ps(value: string): string {\n\treturn `'${value.replaceAll(\"'\", \"''\")}'`;\n}\n\nexport function startupSpec(\n\tplatform: NodeJS.Platform,\n\tmode: Exclude<StartupMode, \"off\">,\n\toptions: { home: string; agentDir: string; node: string; cli: string; username: string; uid: number },\n): StartupSpec {\n\tconst { home, agentDir, node, cli, username, uid } = options;\n\tif ([home, agentDir, node, cli, username].some((value) => /[\\r\\n\\0]/.test(value)))\n\t\tthrow new Error(\"Startup paths and account names must not contain control characters.\");\n\tconst suffix = createHash(\"sha256\").update(resolve(agentDir)).digest(\"hex\").slice(0, 10);\n\tconst serviceName = `${servicePrefix}-${suffix}`;\n\tconst log = join(agentDir, \"gateway-service\", \"gateway.log\");\n\tif (platform === \"linux\") {\n\t\tconst path = join(home, \".config\", \"systemd\", \"user\", `${serviceName}.service`);\n\t\treturn {\n\t\t\tpath,\n\t\t\tcontent: `[Unit]\\nDescription=lunR chat gateway\\nAfter=network-online.target\\n\\n[Service]\\nType=simple\\nExecStart=${systemdArg(node)} ${systemdArg(cli)} gateway run\\nWorkingDirectory=${systemdArg(home)}\\nEnvironment=${systemdArg(`PI_CODING_AGENT_DIR=${agentDir}`)}\\nRestart=on-failure\\nRestartSec=5\\nTimeoutStopSec=30\\nStandardOutput=append:${log.replaceAll(\"%\", \"%%\")}\\nStandardError=append:${log.replaceAll(\"%\", \"%%\")}\\nUMask=0077\\n\\n[Install]\\nWantedBy=default.target\\n`,\n\t\t\tinstall: [\n\t\t\t\t...(mode === \"boot\" ? [[\"loginctl\", \"enable-linger\", username]] : []),\n\t\t\t\t[\"systemctl\", \"--user\", \"daemon-reload\"],\n\t\t\t\t[\"systemctl\", \"--user\", \"enable\", `${serviceName}.service`],\n\t\t\t],\n\t\t\tremove: [[\"systemctl\", \"--user\", \"disable\", `${serviceName}.service`]],\n\t\t\tverify: [\"systemctl\", \"--user\", \"is-enabled\", `${serviceName}.service`],\n\t\t\tstart: [\"systemctl\", \"--user\", \"start\", `${serviceName}.service`],\n\t\t};\n\t}\n\tif (platform === \"darwin\") {\n\t\tconst label = `dev.lunr.gateway.${suffix}`;\n\t\tconst path =\n\t\t\tmode === \"boot\"\n\t\t\t\t? `/Library/LaunchDaemons/${label}.plist`\n\t\t\t\t: join(home, \"Library\", \"LaunchAgents\", `${label}.plist`);\n\t\tconst domain = mode === \"boot\" ? \"system\" : `gui/${uid}`;\n\t\tconst command = (args: string[]) => (mode === \"boot\" ? [\"sudo\", \"launchctl\", ...args] : [\"launchctl\", ...args]);\n\t\treturn {\n\t\t\tpath,\n\t\t\tcontent: `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\\n<plist version=\"1.0\"><dict><key>Label</key><string>${label}</string><key>ProgramArguments</key><array>${[node, cli, \"gateway\", \"run\"].map((v) => `<string>${xml(v)}</string>`).join(\"\")}</array><key>WorkingDirectory</key><string>${xml(home)}</string>${mode === \"boot\" ? `<key>UserName</key><string>${xml(username)}</string>` : \"\"}<key>EnvironmentVariables</key><dict><key>PI_CODING_AGENT_DIR</key><string>${xml(agentDir)}</string><key>HOME</key><string>${xml(home)}</string></dict><key>RunAtLoad</key><true/><key>KeepAlive</key><dict><key>SuccessfulExit</key><false/></dict><key>StandardOutPath</key><string>${xml(log)}</string><key>StandardErrorPath</key><string>${xml(log)}</string></dict></plist>\\n`,\n\t\t\tinstall: [command([\"bootstrap\", domain, path])],\n\t\t\tremove: [command([\"bootout\", `${domain}/${label}`])],\n\t\t\tverify: command([\"print\", `${domain}/${label}`]),\n\t\t\tstart: command([\"kickstart\", `${domain}/${label}`]),\n\t\t};\n\t}\n\tif (platform === \"win32\") {\n\t\tconst path = join(agentDir, \"gateway-service\", \"startup.ps1\");\n\t\tconst content = `$env:PI_CODING_AGENT_DIR = ${ps(agentDir)}\\nSet-Location -LiteralPath ${ps(home)}\\n& ${ps(node)} ${ps(cli)} gateway run *>> ${ps(log)}\\nexit $LASTEXITCODE\\n`;\n\t\tconst action = `New-ScheduledTaskAction -Execute 'powershell.exe' -Argument ${ps(`-NoProfile -NonInteractive -WindowStyle Hidden -ExecutionPolicy Bypass -File \"${path}\"`)}`;\n\t\tconst trigger =\n\t\t\tmode === \"boot\"\n\t\t\t\t? \"New-ScheduledTaskTrigger -AtStartup\"\n\t\t\t\t: `New-ScheduledTaskTrigger -AtLogOn -User ${ps(username)}`;\n\t\tconst register = `$ErrorActionPreference='Stop'; $a=${action}; $t=${trigger}; $s=New-ScheduledTaskSettingsSet -RestartCount 3 -RestartInterval (New-TimeSpan -Minutes 1) -ExecutionTimeLimit ([TimeSpan]::Zero) -AllowStartIfOnBatteries -DontStopIfGoingOnBatteries; ${mode === \"boot\" ? `$c=Get-Credential -UserName ${ps(username)} -Message 'Windows needs your account credentials to run lunR before login'; if(!$c){throw 'Cancelled'}; Register-ScheduledTask -TaskName '${serviceName}' -Action $a -Trigger $t -Settings $s -User $c.UserName -Password $c.GetNetworkCredential().Password -Force | Out-Null` : `Register-ScheduledTask -TaskName '${serviceName}' -Action $a -Trigger $t -Settings $s -User ${ps(username)} -Force | Out-Null`}`;\n\t\tconst command = (script: string) => [\"powershell.exe\", \"-NoProfile\", \"-Command\", script];\n\t\treturn {\n\t\t\tpath,\n\t\t\tcontent,\n\t\t\tinstall: [command(register)],\n\t\t\tremove: [\n\t\t\t\tcommand(\n\t\t\t\t\t`$ErrorActionPreference='Stop'; Unregister-ScheduledTask -TaskName '${serviceName}' -Confirm:$false`,\n\t\t\t\t),\n\t\t\t],\n\t\t\tverify: command(`$ErrorActionPreference='Stop'; Get-ScheduledTask -TaskName '${serviceName}' | Out-Null`),\n\t\t\tstart: command(`$ErrorActionPreference='Stop'; Start-ScheduledTask -TaskName '${serviceName}'`),\n\t\t};\n\t}\n\tthrow new Error(`Automatic startup is not supported on ${platform}. Run lunr gateway start manually.`);\n}\n\nfunction execute(command: string[]): void {\n\tconst [file, ...args] = command;\n\tconst result = spawnSync(file, args, { stdio: \"inherit\", windowsHide: true, timeout: 120_000 });\n\tif (result.error) throw result.error;\n\tif (result.status !== 0) throw new Error(`${file} failed. Check OS permissions and run lunr gateway doctor.`);\n}\n\nexport async function configureStartup(mode: StartupMode): Promise<void> {\n\tconst previous = loadServiceSettings().startup;\n\tif (process.platform === \"linux\" && mode === \"login\") {\n\t\tconst linger = spawnSync(\"loginctl\", [\"show-user\", userInfo().username, \"--property=Linger\", \"--value\"], {\n\t\t\tencoding: \"utf8\",\n\t\t\ttimeout: 10_000,\n\t\t});\n\t\tif (linger.stdout?.trim() === \"yes\")\n\t\t\tthrow new Error(\n\t\t\t\t\"Linux user services already start at boot because lingering is enabled. Choose boot, or disable lingering yourself before choosing login. lunR will not change other user services.\",\n\t\t\t);\n\t}\n\tconst user = userInfo();\n\tconst options = {\n\t\thome: homedir(),\n\t\tagentDir: getAgentDir(),\n\t\tnode: process.execPath,\n\t\tcli: cliPath(),\n\t\tusername: user.username,\n\t\tuid: user.uid,\n\t};\n\tif (previous !== \"off\") {\n\t\tconst old = startupSpec(process.platform, previous, options);\n\t\tfor (const command of old.remove) execute(command);\n\t\tif (process.platform === \"darwin\" && previous === \"boot\") execute([\"sudo\", \"rm\", \"-f\", old.path]);\n\t\telse rmSync(old.path, { force: true });\n\t\tatomicJson(settingsPath(), { startup: \"off\" });\n\t}\n\tif (mode === \"off\") {\n\t\tatomicJson(settingsPath(), { startup: \"off\" });\n\t\treturn;\n\t}\n\tconst spec = startupSpec(process.platform, mode, options);\n\tmkdirSync(serviceDirectory(), { recursive: true, mode: 0o700 });\n\tif (process.platform === \"darwin\" && mode === \"boot\") {\n\t\tconst temporary = join(serviceDirectory(), \"install.plist\");\n\t\twriteFileSync(temporary, spec.content, { mode: 0o600 });\n\t\ttry {\n\t\t\texecute([\"sudo\", \"install\", \"-o\", \"root\", \"-g\", \"wheel\", \"-m\", \"644\", temporary, spec.path]);\n\t\t} finally {\n\t\t\trmSync(temporary, { force: true });\n\t\t}\n\t} else {\n\t\tmkdirSync(dirname(spec.path), { recursive: true, mode: 0o700 });\n\t\twriteFileSync(spec.path, spec.content, { mode: 0o600 });\n\t}\n\tfor (const command of spec.install) execute(command);\n\texecute(spec.verify);\n\tatomicJson(settingsPath(), { startup: mode });\n}\n\nfunction startupVerification(): string {\n\tconst mode = loadServiceSettings().startup;\n\tif (mode === \"off\") return \"\";\n\ttry {\n\t\tconst user = userInfo();\n\t\tconst spec = startupSpec(process.platform, mode, {\n\t\t\thome: homedir(),\n\t\t\tagentDir: getAgentDir(),\n\t\t\tnode: process.execPath,\n\t\t\tcli: cliPath(),\n\t\t\tusername: user.username,\n\t\t\tuid: user.uid,\n\t\t});\n\t\tconst [command, ...args] = spec.verify[0] === \"sudo\" ? spec.verify.slice(1) : spec.verify;\n\t\tconst result = spawnSync(command, args, { encoding: \"utf8\", windowsHide: true, timeout: 5000 });\n\t\treturn result.status === 0 ? \" (native service verified)\" : \" (native service missing or unavailable)\";\n\t} catch {\n\t\treturn \" (native service could not be checked)\";\n\t}\n}\n\nexport function serviceStatusText(): string {\n\tconst status = readGatewayStatus();\n\tconst alive = !!status && processExists(status.pid);\n\tconst fresh = !!status && Date.now() - Date.parse(status.updatedAt) < 5000;\n\treturn [\n\t\t`Gateway: ${alive ? `${status.state}${fresh ? \"\" : \" (not responding)\"}` : \"stopped\"}`,\n\t\t`Automatic startup: ${loadServiceSettings().startup}${startupVerification()}`,\n\t\t...(alive\n\t\t\t? [`PID: ${status.pid}`, ...Object.entries(status.platforms).map(([name, state]) => `${name}: ${state}`)]\n\t\t\t: []),\n\t\t`Log: ${gatewayLogPath()}`,\n\t].join(\"\\n\");\n}\n\nexport function readGatewayLog(): string {\n\ttry {\n\t\treturn readFileSync(gatewayLogPath(), \"utf8\")\n\t\t\t.split(\"\\n\")\n\t\t\t.slice(-100)\n\t\t\t.join(\"\\n\")\n\t\t\t.replace(/bot\\d+:[A-Za-z0-9_-]+/g, \"bot[redacted]\");\n\t} catch {\n\t\treturn \"No gateway log yet.\";\n\t}\n}\n"]}
1
+ {"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/gateway/service.ts"],"names":[],"mappings":"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","sourcesContent":["import { spawn, spawnSync } from \"node:child_process\";\nimport { createHash, randomUUID } from \"node:crypto\";\nimport { existsSync, mkdirSync, readFileSync, renameSync, rmSync, writeFileSync } from \"node:fs\";\nimport { homedir, userInfo } from \"node:os\";\nimport { dirname, join, resolve } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { getAgentDir } from \"../config.ts\";\n\nexport type StartupMode = \"off\" | \"login\" | \"boot\";\nexport interface GatewayServiceSettings {\n\tstartup: StartupMode;\n}\nexport interface GatewayRuntimeStatus {\n\tversion: 1;\n\tinstance: string;\n\tpid: number;\n\tstartedAt: string;\n\tupdatedAt: string;\n\tstate: \"starting\" | \"ready\" | \"stopping\";\n\tplatforms: Record<string, string>;\n}\nconst servicePrefix = \"lunr-gateway\";\nexport const serviceDirectory = () => join(getAgentDir(), \"gateway-service\");\nexport const gatewayLogPath = () => join(serviceDirectory(), \"gateway.log\");\nconst statusPath = () => join(serviceDirectory(), \"status.json\");\nconst controlPath = () => join(serviceDirectory(), \"control.json\");\nconst settingsPath = () => join(serviceDirectory(), \"service.json\");\n\nexport function atomicJson(path: string, value: unknown): void {\n\tmkdirSync(dirname(path), { recursive: true, mode: 0o700 });\n\tconst temp = `${path}.${randomUUID()}.tmp`;\n\twriteFileSync(temp, `${JSON.stringify(value, null, 2)}\\n`, { mode: 0o600 });\n\trenameSync(temp, path);\n}\n\nfunction readJson(path: string): unknown {\n\ttry {\n\t\treturn JSON.parse(readFileSync(path, \"utf8\"));\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\nexport function loadServiceSettings(): GatewayServiceSettings {\n\tconst raw = readJson(settingsPath());\n\tif (raw && typeof raw === \"object\" && \"startup\" in raw && (raw.startup === \"login\" || raw.startup === \"boot\")) {\n\t\treturn { startup: raw.startup };\n\t}\n\treturn { startup: \"off\" };\n}\n\nexport function processExists(pid: number): boolean {\n\tif (!Number.isSafeInteger(pid) || pid <= 0) return false;\n\ttry {\n\t\tprocess.kill(pid, 0);\n\t\treturn true;\n\t} catch (error) {\n\t\treturn !(error && typeof error === \"object\" && \"code\" in error && error.code === \"ESRCH\");\n\t}\n}\n\nexport function readGatewayStatus(file = statusPath()): GatewayRuntimeStatus | undefined {\n\tconst raw = readJson(file);\n\tif (\n\t\t!raw ||\n\t\ttypeof raw !== \"object\" ||\n\t\t!(\"version\" in raw) ||\n\t\traw.version !== 1 ||\n\t\t!(\"pid\" in raw) ||\n\t\ttypeof raw.pid !== \"number\"\n\t)\n\t\treturn undefined;\n\tif (\n\t\t!(\"instance\" in raw) ||\n\t\ttypeof raw.instance !== \"string\" ||\n\t\t!(\"updatedAt\" in raw) ||\n\t\ttypeof raw.updatedAt !== \"string\"\n\t)\n\t\treturn undefined;\n\tif (!(\"state\" in raw) || ![\"starting\", \"ready\", \"stopping\"].includes(String(raw.state))) return undefined;\n\tif (\n\t\t!(\"platforms\" in raw) ||\n\t\t!raw.platforms ||\n\t\ttypeof raw.platforms !== \"object\" ||\n\t\t!(\"startedAt\" in raw) ||\n\t\ttypeof raw.startedAt !== \"string\"\n\t)\n\t\treturn undefined;\n\treturn raw as GatewayRuntimeStatus;\n}\n\nexport function gatewayIsRunning(): boolean {\n\tconst status = readGatewayStatus();\n\treturn !!status && processExists(status.pid);\n}\n\nexport function claimGateway(onStop: () => void): {\n\tupdate: (platforms: Record<string, string>, state?: GatewayRuntimeStatus[\"state\"]) => void;\n\trelease: () => void;\n} {\n\tconst dir = serviceDirectory();\n\tmkdirSync(dir, { recursive: true, mode: 0o700 });\n\tconst lock = join(dir, \"lock\");\n\ttry {\n\t\tmkdirSync(lock);\n\t} catch (error) {\n\t\tif (!error || typeof error !== \"object\" || !(\"code\" in error) || error.code !== \"EEXIST\") throw error;\n\t\tconst previous = readGatewayStatus(join(lock, \"owner.json\"));\n\t\tif (!previous || processExists(previous.pid))\n\t\t\tthrow new Error(\"Gateway already running or startup lock is unresolved. Run lunr gateway doctor.\");\n\t\t// Recovery is serialized; a late recoverer must not remove a new owner's lock.\n\t\tconst recovery = join(dir, \"recovery\");\n\t\tmkdirSync(recovery);\n\t\ttry {\n\t\t\tconst current = readGatewayStatus(join(lock, \"owner.json\"));\n\t\t\tif (!current || current.instance !== previous.instance || processExists(current.pid))\n\t\t\t\tthrow new Error(\"Gateway ownership changed. Try again.\");\n\t\t\trmSync(lock, { recursive: true });\n\t\t\tmkdirSync(lock);\n\t\t} finally {\n\t\t\trmSync(recovery, { recursive: true, force: true });\n\t\t}\n\t}\n\tconst status: GatewayRuntimeStatus = {\n\t\tversion: 1,\n\t\tinstance: randomUUID(),\n\t\tpid: process.pid,\n\t\tstartedAt: new Date().toISOString(),\n\t\tupdatedAt: new Date().toISOString(),\n\t\tstate: \"starting\",\n\t\tplatforms: {},\n\t};\n\tatomicJson(join(lock, \"owner.json\"), status);\n\tconst save = () => {\n\t\tstatus.updatedAt = new Date().toISOString();\n\t\tatomicJson(statusPath(), status);\n\t};\n\tsave();\n\tlet stopping = false;\n\tconst timer = setInterval(() => {\n\t\tsave();\n\t\tconst control = readJson(controlPath());\n\t\tif (\n\t\t\t!stopping &&\n\t\t\tcontrol &&\n\t\t\ttypeof control === \"object\" &&\n\t\t\t\"instance\" in control &&\n\t\t\tcontrol.instance === status.instance &&\n\t\t\t\"action\" in control &&\n\t\t\tcontrol.action === \"stop\"\n\t\t) {\n\t\t\tstopping = true;\n\t\t\tstatus.state = \"stopping\";\n\t\t\tonStop();\n\t\t}\n\t}, 500);\n\treturn {\n\t\tupdate(platforms, state = \"ready\") {\n\t\t\tif (stopping && state !== \"stopping\") {\n\t\t\t\tstopping = false;\n\t\t\t\tconst control = readJson(controlPath());\n\t\t\t\tif (control && typeof control === \"object\" && \"instance\" in control && control.instance === status.instance)\n\t\t\t\t\trmSync(controlPath(), { force: true });\n\t\t\t}\n\t\t\tstatus.platforms = { ...platforms };\n\t\t\tstatus.state = state;\n\t\t\tsave();\n\t\t},\n\t\trelease() {\n\t\t\tclearInterval(timer);\n\t\t\tif (readGatewayStatus()?.instance === status.instance) {\n\t\t\t\trmSync(statusPath(), { force: true });\n\t\t\t\trmSync(controlPath(), { force: true });\n\t\t\t\trmSync(lock, { recursive: true, force: true });\n\t\t\t}\n\t\t},\n\t};\n}\n\nfunction cliPath(): string {\n\tconst candidate = process.argv[1];\n\tif (candidate && existsSync(candidate)) return resolve(candidate);\n\treturn fileURLToPath(new URL(\"../cli.js\", import.meta.url));\n}\n\nconst sleep = (ms: number) => new Promise<void>((resolve) => setTimeout(resolve, ms));\n\nexport async function startGatewayService(): Promise<string> {\n\tif (gatewayIsRunning()) {\n\t\tif (readGatewayStatus()?.state === \"ready\") return \"Gateway is already running.\";\n\t\tthrow new Error(\n\t\t\t`Gateway process is running but no bot is connected. ${serviceStatusText()}\\nInspect ${gatewayLogPath()}`,\n\t\t);\n\t}\n\tmkdirSync(serviceDirectory(), { recursive: true, mode: 0o700 });\n\tconst startup = loadServiceSettings().startup;\n\tif (startup !== \"off\") {\n\t\tconst user = userInfo();\n\t\tconst spec = startupSpec(process.platform, startup, {\n\t\t\thome: homedir(),\n\t\t\tagentDir: getAgentDir(),\n\t\t\tnode: process.execPath,\n\t\t\tcli: cliPath(),\n\t\t\tusername: user.username,\n\t\t\tuid: user.uid,\n\t\t});\n\t\texecute(spec.start);\n\t\tfor (let i = 0; i < 100; i++) {\n\t\t\tif (readGatewayStatus()?.state === \"ready\" && gatewayIsRunning()) return \"Gateway started.\";\n\t\t\tawait sleep(200);\n\t\t}\n\t\tthrow new Error(\n\t\t\t`Startup service did not connect within 20 seconds. ${serviceStatusText()}\\nRun lunr gateway doctor and inspect ${gatewayLogPath()}`,\n\t\t);\n\t}\n\tconst { openSync, closeSync } = await import(\"node:fs\");\n\tconst log = openSync(gatewayLogPath(), \"a\", 0o600);\n\tconst child = spawn(process.execPath, [cliPath(), \"gateway\", \"run\"], {\n\t\tcwd: homedir(),\n\t\tdetached: true,\n\t\twindowsHide: true,\n\t\tstdio: [\"ignore\", log, log],\n\t\tenv: { ...process.env, PI_CODING_AGENT_DIR: getAgentDir() },\n\t});\n\tcloseSync(log);\n\tlet spawnError: Error | undefined;\n\tchild.on(\"error\", (error) => {\n\t\tspawnError = error;\n\t});\n\tchild.unref();\n\tfor (let i = 0; i < 100; i++) {\n\t\tif (spawnError) throw spawnError;\n\t\tconst status = readGatewayStatus();\n\t\tif (status && status.pid === child.pid && status.state === \"ready\") return \"Gateway started.\";\n\t\tif (child.exitCode !== null)\n\t\t\tthrow new Error(`Gateway exited with code ${child.exitCode}. See ${gatewayLogPath()}`);\n\t\tawait sleep(200);\n\t}\n\tthrow new Error(\n\t\t`Gateway did not connect within 20 seconds. ${serviceStatusText()}\\nCheck lunr gateway status and ${gatewayLogPath()}`,\n\t);\n}\n\nexport async function stopGatewayService(): Promise<string> {\n\tconst status = readGatewayStatus();\n\tif (!status || !processExists(status.pid)) return \"Gateway is not running.\";\n\tatomicJson(controlPath(), { instance: status.instance, action: \"stop\" });\n\tfor (let i = 0; i < 150; i++) {\n\t\tif (readGatewayStatus()?.instance !== status.instance || !processExists(status.pid)) return \"Gateway stopped.\";\n\t\tawait sleep(200);\n\t}\n\tthrow new Error(\"Gateway is still stopping after 30 seconds. Inspect the log; no unrelated process was terminated.\");\n}\n\n/** Remove only this profile's gateway and startup entry, before uninstall deletes control data. */\nexport async function teardownGatewayService(): Promise<void> {\n\tconst dir = serviceDirectory();\n\tconst ownerPath = join(dir, \"lock\", \"owner.json\");\n\tconst status = readGatewayStatus();\n\tconst lockOwner = readGatewayStatus(ownerPath);\n\tif ((existsSync(statusPath()) && !status) || (existsSync(join(dir, \"lock\")) && !lockOwner))\n\t\tthrow new Error(\"Gateway ownership is unresolved. Profile retained; run lunr gateway doctor.\");\n\tif (status && lockOwner && (status.instance !== lockOwner.instance || status.pid !== lockOwner.pid))\n\t\tthrow new Error(\"Gateway status and lock ownership disagree. Profile retained.\");\n\tconst owner = status ?? lockOwner;\n\tif (owner && processExists(owner.pid) && !lockOwner)\n\t\tthrow new Error(\"Running gateway has no ownership lock. Profile retained.\");\n\n\tconst rawSettings = readJson(settingsPath());\n\tif (\n\t\texistsSync(settingsPath()) &&\n\t\t(!rawSettings ||\n\t\t\ttypeof rawSettings !== \"object\" ||\n\t\t\t!(\"startup\" in rawSettings) ||\n\t\t\t![\"off\", \"login\", \"boot\"].includes(String(rawSettings.startup)))\n\t)\n\t\tthrow new Error(\"Gateway startup settings are unresolved. Profile retained.\");\n\tconst mode = loadServiceSettings().startup;\n\tconst user = userInfo();\n\tconst options = {\n\t\thome: homedir(),\n\t\tagentDir: getAgentDir(),\n\t\tnode: process.execPath,\n\t\tcli: cliPath(),\n\t\tusername: user.username,\n\t\tuid: user.uid,\n\t};\n\tconst spec = mode === \"off\" ? undefined : startupSpec(process.platform, mode, options);\n\tconst startupFileMissing = !!spec && !existsSync(spec.path);\n\tif (!spec) {\n\t\tif (\n\t\t\t[\"linux\", \"darwin\", \"win32\"].includes(process.platform) &&\n\t\t\t([\"login\", \"boot\"] as const).some((candidate) =>\n\t\t\t\texistsSync(startupSpec(process.platform, candidate, options).path),\n\t\t\t)\n\t\t)\n\t\t\tthrow new Error(\"Gateway startup file exists without active ownership settings. Profile retained.\");\n\t} else if (startupFileMissing) {\n\t\t// Retry only verification. A missing file never authorizes removing a registration.\n\t\tconfirmStartupRemoval(spec);\n\t} else {\n\t\tif (readFileSync(spec.path, \"utf8\") !== spec.content)\n\t\t\tthrow new Error(\"Gateway startup file does not match this installation. Profile retained.\");\n\t\tif (process.platform === \"linux\") {\n\t\t\tconst unit = spec.verify.at(-1)!;\n\t\t\tconst registration = serviceQuery([\n\t\t\t\t\"systemctl\",\n\t\t\t\t\"--user\",\n\t\t\t\t\"show\",\n\t\t\t\tunit,\n\t\t\t\t\"--property=FragmentPath\",\n\t\t\t\t\"--property=DropInPaths\",\n\t\t\t]);\n\t\t\tconst properties = new Map(\n\t\t\t\tregistration.stdout\n\t\t\t\t\t.trim()\n\t\t\t\t\t.split(\"\\n\")\n\t\t\t\t\t.map((line) => {\n\t\t\t\t\t\tconst separator = line.indexOf(\"=\");\n\t\t\t\t\t\treturn [line.slice(0, separator), line.slice(separator + 1)];\n\t\t\t\t\t}),\n\t\t\t);\n\t\t\tif (\n\t\t\t\tregistration.status !== 0 ||\n\t\t\t\tproperties.get(\"FragmentPath\") !== spec.path ||\n\t\t\t\tproperties.get(\"DropInPaths\") !== \"\"\n\t\t\t)\n\t\t\t\tthrow new Error(\"Gateway systemd ownership could not be verified. Profile retained.\");\n\t\t} else if (process.platform === \"win32\") {\n\t\t\tconst name = `${servicePrefix}-${createHash(\"sha256\").update(resolve(getAgentDir())).digest(\"hex\").slice(0, 10)}`;\n\t\t\tconst actionArgs = `-NoProfile -NonInteractive -WindowStyle Hidden -ExecutionPolicy Bypass -File \"${spec.path}\"`;\n\t\t\texecute([\n\t\t\t\t\"powershell.exe\",\n\t\t\t\t\"-NoProfile\",\n\t\t\t\t\"-Command\",\n\t\t\t\t`$ErrorActionPreference='Stop'; $t=Get-ScheduledTask -TaskName ${ps(name)}; if($t.Actions.Count -ne 1 -or $t.Actions[0].Execute -ne 'powershell.exe' -or $t.Actions[0].Arguments -ne ${ps(actionArgs)}){throw 'Gateway task ownership mismatch'}`,\n\t\t\t]);\n\t\t}\n\t}\n\n\t// Request graceful shutdown before unregistering; no PID signal can hit a reused process.\n\tif (owner && processExists(owner.pid)) {\n\t\tatomicJson(controlPath(), { instance: owner.instance, action: \"stop\" });\n\t}\n\tif (spec && !startupFileMissing) {\n\t\tif (process.platform === \"linux\") {\n\t\t\tconst unit = spec.verify.at(-1)!;\n\t\t\texecute([\"systemctl\", \"--user\", \"disable\", \"--now\", unit]);\n\t\t\tconst disabled = serviceQuery(spec.verify);\n\t\t\tif (disabled.status !== 1 || disabled.stdout.trim() !== \"disabled\")\n\t\t\t\tthrow new Error(\"Gateway startup disable could not be confirmed. Profile retained.\");\n\t\t} else {\n\t\t\tfor (const command of spec.remove) {\n\t\t\t\tconst removed = serviceQuery(command);\n\t\t\t\tif (\n\t\t\t\t\tremoved.status !== 0 &&\n\t\t\t\t\t!(process.platform === \"darwin\" && /Could not find (?:specified )?service/i.test(removed.stderr))\n\t\t\t\t)\n\t\t\t\t\tthrow new Error(\"Gateway startup removal failed. Profile retained.\");\n\t\t\t}\n\t\t}\n\t\tif (process.platform === \"darwin\" && mode === \"boot\") execute([\"sudo\", \"rm\", \"-f\", spec.path]);\n\t\telse rmSync(spec.path);\n\t\tconfirmStartupRemoval(spec);\n\t}\n\tif (spec) {\n\t\tatomicJson(settingsPath(), { startup: \"off\" });\n\t}\n\tfor (let i = 0; owner && processExists(owner.pid); i++) {\n\t\tif (i >= 150) throw new Error(\"Gateway shutdown could not be confirmed after 30 seconds. Profile retained.\");\n\t\tawait sleep(200);\n\t}\n\tconst remaining = readGatewayStatus();\n\tconst remainingLock = readGatewayStatus(ownerPath);\n\tif ((remaining && processExists(remaining.pid)) || (remainingLock && processExists(remainingLock.pid)))\n\t\tthrow new Error(\"Gateway ownership changed during teardown. Profile retained.\");\n}\n\n/** Refresh and verify absence without unregistering an unverified startup entry. */\nfunction confirmStartupRemoval(spec: StartupSpec): void {\n\tif (process.platform === \"linux\") {\n\t\texecute([\"systemctl\", \"--user\", \"daemon-reload\"]);\n\t\tconst removed = serviceQuery([\n\t\t\t\"systemctl\",\n\t\t\t\"--user\",\n\t\t\t\"show\",\n\t\t\tspec.verify.at(-1)!,\n\t\t\t\"--property=LoadState\",\n\t\t\t\"--value\",\n\t\t]);\n\t\tif (removed.status !== 0 || removed.stdout.trim() !== \"not-found\")\n\t\t\tthrow new Error(\"Gateway startup removal could not be confirmed. Profile retained.\");\n\t} else if (process.platform === \"darwin\") {\n\t\tconst removed = serviceQuery(spec.verify);\n\t\tif (removed.status === 0 || !/Could not find (?:specified )?service/i.test(removed.stderr))\n\t\t\tthrow new Error(\"Gateway launchd removal could not be confirmed. Profile retained.\");\n\t} else {\n\t\tconst name = `${servicePrefix}-${createHash(\"sha256\").update(resolve(getAgentDir())).digest(\"hex\").slice(0, 10)}`;\n\t\texecute([\n\t\t\t\"powershell.exe\",\n\t\t\t\"-NoProfile\",\n\t\t\t\"-Command\",\n\t\t\t`$ErrorActionPreference='Stop'; if(Get-ScheduledTask | Where-Object {$_.TaskName -eq ${ps(name)}}){throw 'Gateway task still registered'}`,\n\t\t]);\n\t}\n}\n\nfunction serviceQuery(command: string[]) {\n\tconst [file, ...args] = command;\n\tconst result = spawnSync(file, args, { encoding: \"utf8\", windowsHide: true, timeout: 120_000 });\n\tif (result.error) throw result.error;\n\treturn result;\n}\n\nexport interface StartupSpec {\n\tpath: string;\n\tcontent: string;\n\tinstall: string[][];\n\tremove: string[][];\n\tverify: string[];\n\tstart: string[];\n}\nfunction xml(value: string): string {\n\treturn value.replaceAll(\"&\", \"&amp;\").replaceAll(\"<\", \"&lt;\").replaceAll(\">\", \"&gt;\").replaceAll('\"', \"&quot;\");\n}\nfunction systemdArg(value: string): string {\n\treturn `\"${value.replaceAll(\"%\", \"%%\").replaceAll(\"\\\\\", \"\\\\\\\\\").replaceAll('\"', '\\\\\"')}\"`;\n}\nfunction ps(value: string): string {\n\treturn `'${value.replaceAll(\"'\", \"''\")}'`;\n}\n\nexport function startupSpec(\n\tplatform: NodeJS.Platform,\n\tmode: Exclude<StartupMode, \"off\">,\n\toptions: { home: string; agentDir: string; node: string; cli: string; username: string; uid: number },\n): StartupSpec {\n\tconst { home, agentDir, node, cli, username, uid } = options;\n\tif ([home, agentDir, node, cli, username].some((value) => /[\\r\\n\\0]/.test(value)))\n\t\tthrow new Error(\"Startup paths and account names must not contain control characters.\");\n\tconst suffix = createHash(\"sha256\").update(resolve(agentDir)).digest(\"hex\").slice(0, 10);\n\tconst serviceName = `${servicePrefix}-${suffix}`;\n\tconst log = join(agentDir, \"gateway-service\", \"gateway.log\");\n\tif (platform === \"linux\") {\n\t\tconst path = join(home, \".config\", \"systemd\", \"user\", `${serviceName}.service`);\n\t\treturn {\n\t\t\tpath,\n\t\t\tcontent: `[Unit]\\nDescription=lunR chat gateway\\nAfter=network-online.target\\n\\n[Service]\\nType=simple\\nExecStart=${systemdArg(node)} ${systemdArg(cli)} gateway run\\nWorkingDirectory=${systemdArg(home)}\\nEnvironment=${systemdArg(`PI_CODING_AGENT_DIR=${agentDir}`)}\\nRestart=on-failure\\nRestartSec=5\\nTimeoutStopSec=30\\nStandardOutput=append:${log.replaceAll(\"%\", \"%%\")}\\nStandardError=append:${log.replaceAll(\"%\", \"%%\")}\\nUMask=0077\\n\\n[Install]\\nWantedBy=default.target\\n`,\n\t\t\tinstall: [\n\t\t\t\t...(mode === \"boot\" ? [[\"loginctl\", \"enable-linger\", username]] : []),\n\t\t\t\t[\"systemctl\", \"--user\", \"daemon-reload\"],\n\t\t\t\t[\"systemctl\", \"--user\", \"enable\", `${serviceName}.service`],\n\t\t\t],\n\t\t\tremove: [[\"systemctl\", \"--user\", \"disable\", `${serviceName}.service`]],\n\t\t\tverify: [\"systemctl\", \"--user\", \"is-enabled\", `${serviceName}.service`],\n\t\t\tstart: [\"systemctl\", \"--user\", \"start\", `${serviceName}.service`],\n\t\t};\n\t}\n\tif (platform === \"darwin\") {\n\t\tconst label = `dev.lunr.gateway.${suffix}`;\n\t\tconst path =\n\t\t\tmode === \"boot\"\n\t\t\t\t? `/Library/LaunchDaemons/${label}.plist`\n\t\t\t\t: join(home, \"Library\", \"LaunchAgents\", `${label}.plist`);\n\t\tconst domain = mode === \"boot\" ? \"system\" : `gui/${uid}`;\n\t\tconst command = (args: string[]) => (mode === \"boot\" ? [\"sudo\", \"launchctl\", ...args] : [\"launchctl\", ...args]);\n\t\treturn {\n\t\t\tpath,\n\t\t\tcontent: `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\\n<plist version=\"1.0\"><dict><key>Label</key><string>${label}</string><key>ProgramArguments</key><array>${[node, cli, \"gateway\", \"run\"].map((v) => `<string>${xml(v)}</string>`).join(\"\")}</array><key>WorkingDirectory</key><string>${xml(home)}</string>${mode === \"boot\" ? `<key>UserName</key><string>${xml(username)}</string>` : \"\"}<key>EnvironmentVariables</key><dict><key>PI_CODING_AGENT_DIR</key><string>${xml(agentDir)}</string><key>HOME</key><string>${xml(home)}</string></dict><key>RunAtLoad</key><true/><key>KeepAlive</key><dict><key>SuccessfulExit</key><false/></dict><key>StandardOutPath</key><string>${xml(log)}</string><key>StandardErrorPath</key><string>${xml(log)}</string></dict></plist>\\n`,\n\t\t\tinstall: [command([\"bootstrap\", domain, path])],\n\t\t\tremove: [command([\"bootout\", `${domain}/${label}`])],\n\t\t\tverify: command([\"print\", `${domain}/${label}`]),\n\t\t\tstart: command([\"kickstart\", `${domain}/${label}`]),\n\t\t};\n\t}\n\tif (platform === \"win32\") {\n\t\tconst path = join(agentDir, \"gateway-service\", \"startup.ps1\");\n\t\tconst content = `$env:PI_CODING_AGENT_DIR = ${ps(agentDir)}\\nSet-Location -LiteralPath ${ps(home)}\\n& ${ps(node)} ${ps(cli)} gateway run *>> ${ps(log)}\\nexit $LASTEXITCODE\\n`;\n\t\tconst action = `New-ScheduledTaskAction -Execute 'powershell.exe' -Argument ${ps(`-NoProfile -NonInteractive -WindowStyle Hidden -ExecutionPolicy Bypass -File \"${path}\"`)}`;\n\t\tconst trigger =\n\t\t\tmode === \"boot\"\n\t\t\t\t? \"New-ScheduledTaskTrigger -AtStartup\"\n\t\t\t\t: `New-ScheduledTaskTrigger -AtLogOn -User ${ps(username)}`;\n\t\tconst register = `$ErrorActionPreference='Stop'; $a=${action}; $t=${trigger}; $s=New-ScheduledTaskSettingsSet -RestartCount 3 -RestartInterval (New-TimeSpan -Minutes 1) -ExecutionTimeLimit ([TimeSpan]::Zero) -AllowStartIfOnBatteries -DontStopIfGoingOnBatteries; ${mode === \"boot\" ? `$c=Get-Credential -UserName ${ps(username)} -Message 'Windows needs your account credentials to run lunR before login'; if(!$c){throw 'Cancelled'}; Register-ScheduledTask -TaskName '${serviceName}' -Action $a -Trigger $t -Settings $s -User $c.UserName -Password $c.GetNetworkCredential().Password -Force | Out-Null` : `Register-ScheduledTask -TaskName '${serviceName}' -Action $a -Trigger $t -Settings $s -User ${ps(username)} -Force | Out-Null`}`;\n\t\tconst command = (script: string) => [\"powershell.exe\", \"-NoProfile\", \"-Command\", script];\n\t\treturn {\n\t\t\tpath,\n\t\t\tcontent,\n\t\t\tinstall: [command(register)],\n\t\t\tremove: [\n\t\t\t\tcommand(\n\t\t\t\t\t`$ErrorActionPreference='Stop'; Unregister-ScheduledTask -TaskName '${serviceName}' -Confirm:$false`,\n\t\t\t\t),\n\t\t\t],\n\t\t\tverify: command(`$ErrorActionPreference='Stop'; Get-ScheduledTask -TaskName '${serviceName}' | Out-Null`),\n\t\t\tstart: command(`$ErrorActionPreference='Stop'; Start-ScheduledTask -TaskName '${serviceName}'`),\n\t\t};\n\t}\n\tthrow new Error(`Automatic startup is not supported on ${platform}. Run lunr gateway start manually.`);\n}\n\nfunction execute(command: string[]): void {\n\tconst [file, ...args] = command;\n\tconst result = spawnSync(file, args, { stdio: \"inherit\", windowsHide: true, timeout: 120_000 });\n\tif (result.error) throw result.error;\n\tif (result.status !== 0) throw new Error(`${file} failed. Check OS permissions and run lunr gateway doctor.`);\n}\n\nexport async function configureStartup(mode: StartupMode): Promise<void> {\n\tconst previous = loadServiceSettings().startup;\n\tif (process.platform === \"linux\" && mode === \"login\") {\n\t\tconst linger = spawnSync(\"loginctl\", [\"show-user\", userInfo().username, \"--property=Linger\", \"--value\"], {\n\t\t\tencoding: \"utf8\",\n\t\t\ttimeout: 10_000,\n\t\t});\n\t\tif (linger.stdout?.trim() === \"yes\")\n\t\t\tthrow new Error(\n\t\t\t\t\"Linux user services already start at boot because lingering is enabled. Choose boot, or disable lingering yourself before choosing login. lunR will not change other user services.\",\n\t\t\t);\n\t}\n\tconst user = userInfo();\n\tconst options = {\n\t\thome: homedir(),\n\t\tagentDir: getAgentDir(),\n\t\tnode: process.execPath,\n\t\tcli: cliPath(),\n\t\tusername: user.username,\n\t\tuid: user.uid,\n\t};\n\tif (previous !== \"off\") {\n\t\tconst old = startupSpec(process.platform, previous, options);\n\t\tfor (const command of old.remove) execute(command);\n\t\tif (process.platform === \"darwin\" && previous === \"boot\") execute([\"sudo\", \"rm\", \"-f\", old.path]);\n\t\telse rmSync(old.path, { force: true });\n\t\tatomicJson(settingsPath(), { startup: \"off\" });\n\t}\n\tif (mode === \"off\") {\n\t\tatomicJson(settingsPath(), { startup: \"off\" });\n\t\treturn;\n\t}\n\tconst spec = startupSpec(process.platform, mode, options);\n\tmkdirSync(serviceDirectory(), { recursive: true, mode: 0o700 });\n\tif (process.platform === \"darwin\" && mode === \"boot\") {\n\t\tconst temporary = join(serviceDirectory(), \"install.plist\");\n\t\twriteFileSync(temporary, spec.content, { mode: 0o600 });\n\t\ttry {\n\t\t\texecute([\"sudo\", \"install\", \"-o\", \"root\", \"-g\", \"wheel\", \"-m\", \"644\", temporary, spec.path]);\n\t\t} finally {\n\t\t\trmSync(temporary, { force: true });\n\t\t}\n\t} else {\n\t\tmkdirSync(dirname(spec.path), { recursive: true, mode: 0o700 });\n\t\twriteFileSync(spec.path, spec.content, { mode: 0o600 });\n\t}\n\tfor (const command of spec.install) execute(command);\n\texecute(spec.verify);\n\tatomicJson(settingsPath(), { startup: mode });\n}\n\nfunction startupVerification(): string {\n\tconst mode = loadServiceSettings().startup;\n\tif (mode === \"off\") return \"\";\n\ttry {\n\t\tconst user = userInfo();\n\t\tconst spec = startupSpec(process.platform, mode, {\n\t\t\thome: homedir(),\n\t\t\tagentDir: getAgentDir(),\n\t\t\tnode: process.execPath,\n\t\t\tcli: cliPath(),\n\t\t\tusername: user.username,\n\t\t\tuid: user.uid,\n\t\t});\n\t\tconst [command, ...args] = spec.verify[0] === \"sudo\" ? spec.verify.slice(1) : spec.verify;\n\t\tconst result = spawnSync(command, args, { encoding: \"utf8\", windowsHide: true, timeout: 5000 });\n\t\treturn result.status === 0 ? \" (native service verified)\" : \" (native service missing or unavailable)\";\n\t} catch {\n\t\treturn \" (native service could not be checked)\";\n\t}\n}\n\nexport function serviceStatusText(): string {\n\tconst status = readGatewayStatus();\n\tconst alive = !!status && processExists(status.pid);\n\tconst fresh = !!status && Date.now() - Date.parse(status.updatedAt) < 5000;\n\treturn [\n\t\t`Gateway: ${alive ? `${status.state}${fresh ? \"\" : \" (not responding)\"}` : \"stopped\"}`,\n\t\t`Automatic startup: ${loadServiceSettings().startup}${startupVerification()}`,\n\t\t...(alive\n\t\t\t? [`PID: ${status.pid}`, ...Object.entries(status.platforms).map(([name, state]) => `${name}: ${state}`)]\n\t\t\t: []),\n\t\t`Log: ${gatewayLogPath()}`,\n\t].join(\"\\n\");\n}\n\nexport function readGatewayLog(): string {\n\ttry {\n\t\treturn readFileSync(gatewayLogPath(), \"utf8\")\n\t\t\t.split(\"\\n\")\n\t\t\t.slice(-100)\n\t\t\t.join(\"\\n\")\n\t\t\t.replace(/bot\\d+:[A-Za-z0-9_-]+/g, \"bot[redacted]\");\n\t} catch {\n\t\treturn \"No gateway log yet.\";\n\t}\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AA8BH,OAAO,KAAK,EAAE,eAAe,EAAuB,MAAM,4BAA4B,CAAC;AAwBvF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAarE;;;GAGG;AACH,wBAAsB,cAAc,CACnC,MAAM,GAAE,MAAM,CAAC,UAA0B,EACzC,OAAO,GAAE;IAAE,YAAY,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAO,GACtD,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CA0C7B;AA2aD,MAAM,WAAW,WAAW;IAC3B,kBAAkB,CAAC,EAAE,eAAe,EAAE,CAAC;IACvC,WAAW,CAAC,EAAE,eAAe,CAAC;CAC9B;AAED,wBAAsB,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,OAAO,CAAC,EAAE,WAAW,iBAuf/D","sourcesContent":["/**\n * Main entry point for the coding agent CLI.\n *\n * This file handles CLI argument parsing and translates them into\n * createAgentSession() options. The SDK does the heavy lifting.\n */\n\nimport { createInterface } from \"node:readline\";\nimport { type ImageContent, modelsAreEqual } from \"@ashx-j/lunr-ai\";\nimport chalk from \"chalk\";\nimport { lightBuiltinExtensions, loadAllBuiltinExtensions } from \"./builtin-extensions/index.ts\";\nimport { type Args, type Mode, parseArgs, printHelp } from \"./cli/args.ts\";\nimport { processFileArguments } from \"./cli/file-processor.ts\";\nimport { buildInitialMessage } from \"./cli/initial-message.ts\";\nimport { listModels } from \"./cli/list-models.ts\";\nimport { createProjectTrustContext } from \"./cli/project-trust.ts\";\nimport { selectSession } from \"./cli/session-picker.ts\";\nimport { shouldRunFirstTimeSetup, showFirstTimeSetup, showStartupSelector } from \"./cli/startup-ui.ts\";\nimport {\n\tAPP_NAME,\n\tappendDebugLog,\n\tENV_SESSION_DIR,\n\texpandTildePath,\n\tgetAgentDir,\n\tgetSessionsDir,\n\tVERSION,\n} from \"./config.ts\";\nimport { type CreateAgentSessionRuntimeFactory, createAgentSessionRuntime } from \"./core/agent-session-runtime.ts\";\nimport {\n\ttype AgentSessionRuntimeDiagnostic,\n\tcreateAgentSessionFromServices,\n\tcreateAgentSessionServices,\n} from \"./core/agent-session-services.ts\";\nimport { formatNoModelsAvailableMessage } from \"./core/auth-guidance.ts\";\nimport { registerCustomizeBridge } from \"./core/customize.ts\";\nimport type { InlineExtension, ProjectTrustContext } from \"./core/extensions/types.ts\";\nimport { applyHttpProxySettings, configureHttpDispatcher } from \"./core/http-dispatcher.ts\";\nimport { registerMemoryCapBridge } from \"./core/memory-cap.ts\";\nimport { resolveCliModel, resolveModelScope, type ScopedModel } from \"./core/model-resolver.ts\";\nimport type { ModelRuntime } from \"./core/model-runtime.ts\";\nimport { registerModelTierBridge } from \"./core/model-tiers.ts\";\nimport { restoreStdout, takeOverStdout } from \"./core/output-guard.ts\";\nimport { type AppMode, resolveProjectTrusted } from \"./core/project-trust.ts\";\nimport { bindRuntimeBridges } from \"./core/runtime-bridges.ts\";\nimport type { CreateAgentSessionOptions } from \"./core/sdk.ts\";\nimport {\n\tformatMissingSessionCwdPrompt,\n\tgetMissingSessionCwdIssue,\n\tMissingSessionCwdError,\n\ttype SessionCwdIssue,\n} from \"./core/session-cwd.ts\";\nimport { assertValidSessionId, SessionManager } from \"./core/session-manager.ts\";\nimport { pruneOldSessions } from \"./core/session-retention.ts\";\nimport { SettingsManager } from \"./core/settings-manager.ts\";\nimport { applyInheritedSubagentPermissions } from \"./core/subagent-permission-inherit.ts\";\nimport { printTimings, resetTimings, time } from \"./core/timings.ts\";\nimport { hasTrustRequiringProjectResources, ProjectTrustStore } from \"./core/trust-manager.ts\";\nimport { runMigrations, showDeprecationWarnings } from \"./migrations.ts\";\nimport { initTheme, stopThemeWatcher } from \"./modes/interactive/theme/theme.ts\";\nimport type { InteractiveView } from \"./startup/interactive-view.ts\";\nimport { markStartupMilestone } from \"./startup/startup-milestones.ts\";\nimport { isLocalPath, normalizePath, resolvePath } from \"./utils/paths.ts\";\n\nconst EXTENSION_LOAD_FAILURE_HINT = `Hint: Start without extensions using \"${APP_NAME} -ne\".`;\n\n/**\n * Read all content from piped stdin.\n * Returns undefined if stdin is a TTY (interactive terminal).\n */\nconst PIPED_STDIN_FIRST_CHUNK_MS = 50;\nconst PIPED_STDIN_IDLE_MS = 2000;\n\n/**\n * Read piped stdin. A non-TTY that never emits data (Windows console, leftover\n * redirected handle) must not block interactive start forever.\n */\nexport async function readPipedStdin(\n\tstream: NodeJS.ReadStream = process.stdin,\n\toptions: { firstChunkMs?: number; idleMs?: number } = {},\n): Promise<string | undefined> {\n\tif (stream.isTTY) {\n\t\treturn undefined;\n\t}\n\n\tconst firstChunkMs = options.firstChunkMs ?? PIPED_STDIN_FIRST_CHUNK_MS;\n\tconst idleMs = options.idleMs ?? PIPED_STDIN_IDLE_MS;\n\n\treturn new Promise((resolve) => {\n\t\tlet data = \"\";\n\t\tlet settled = false;\n\t\tlet sawData = false;\n\t\tlet idleTimer: ReturnType<typeof setTimeout> | undefined;\n\t\tconst firstChunkTimer = setTimeout(() => {\n\t\t\tif (!sawData) finish(undefined);\n\t\t}, firstChunkMs);\n\n\t\tconst finish = (value: string | undefined) => {\n\t\t\tif (settled) return;\n\t\t\tsettled = true;\n\t\t\tclearTimeout(firstChunkTimer);\n\t\t\tif (idleTimer) clearTimeout(idleTimer);\n\t\t\tstream.off(\"data\", onData);\n\t\t\tstream.off(\"end\", onEnd);\n\t\t\tstream.off(\"error\", onEnd);\n\t\t\tresolve(value);\n\t\t};\n\n\t\tconst onEnd = () => finish(data.trim() || undefined);\n\t\tconst onData = (chunk: string | Buffer) => {\n\t\t\tsawData = true;\n\t\t\tdata += typeof chunk === \"string\" ? chunk : chunk.toString(\"utf8\");\n\t\t\tif (idleTimer) clearTimeout(idleTimer);\n\t\t\tidleTimer = setTimeout(onEnd, idleMs);\n\t\t};\n\n\t\tstream.setEncoding(\"utf8\");\n\t\tstream.on(\"data\", onData);\n\t\tstream.on(\"end\", onEnd);\n\t\tstream.on(\"error\", onEnd);\n\t\tstream.resume();\n\t});\n}\n\nfunction collectSettingsDiagnostics(\n\tsettingsManager: SettingsManager,\n\tcontext: string,\n): AgentSessionRuntimeDiagnostic[] {\n\treturn settingsManager.drainErrors().map(({ scope, error }) => ({\n\t\ttype: \"warning\",\n\t\tmessage: `(${context}, ${scope} settings) ${error.message}`,\n\t}));\n}\n\nfunction reportDiagnostics(diagnostics: readonly AgentSessionRuntimeDiagnostic[]): void {\n\tfor (const diagnostic of diagnostics) {\n\t\tconst color = diagnostic.type === \"error\" ? chalk.red : diagnostic.type === \"warning\" ? chalk.yellow : chalk.dim;\n\t\tconst prefix = diagnostic.type === \"error\" ? \"Error: \" : diagnostic.type === \"warning\" ? \"Warning: \" : \"\";\n\t\tconsole.error(color(`${prefix}${diagnostic.message}`));\n\t}\n}\n\nfunction isTruthyEnvFlag(value: string | undefined): boolean {\n\tif (!value) return false;\n\treturn value === \"1\" || value.toLowerCase() === \"true\" || value.toLowerCase() === \"yes\";\n}\n\nfunction resolveAppMode(parsed: Args, stdinIsTTY: boolean, stdoutIsTTY: boolean): AppMode {\n\tif (parsed.mode === \"rpc\") {\n\t\treturn \"rpc\";\n\t}\n\tif (parsed.mode === \"json\") {\n\t\treturn \"json\";\n\t}\n\t// PI_STARTUP_BENCHMARK=1 times interactive first paint even when stdin/stdout\n\t// are not TTYs (repo npx, CI, redirected logs).\n\tif (isTruthyEnvFlag(process.env.PI_STARTUP_BENCHMARK) && !parsed.print) {\n\t\treturn \"interactive\";\n\t}\n\tif (parsed.print || !stdinIsTTY || !stdoutIsTTY) {\n\t\treturn \"print\";\n\t}\n\treturn \"interactive\";\n}\n\nfunction toPrintOutputMode(appMode: AppMode): Exclude<Mode, \"rpc\"> {\n\treturn appMode === \"json\" ? \"json\" : \"text\";\n}\n\nfunction isPlainRuntimeMetadataCommand(parsed: Args): boolean {\n\treturn !parsed.print && parsed.mode === undefined && (parsed.help === true || parsed.listModels !== undefined);\n}\n\nasync function prepareInitialMessage(\n\tparsed: Args,\n\tautoResizeImages: boolean,\n\tstdinContent?: string,\n): Promise<{\n\tinitialMessage?: string;\n\tinitialImages?: ImageContent[];\n}> {\n\tif (parsed.fileArgs.length === 0) {\n\t\treturn buildInitialMessage({ parsed, stdinContent });\n\t}\n\n\tconst { text, images } = await processFileArguments(parsed.fileArgs, { autoResizeImages });\n\treturn buildInitialMessage({\n\t\tparsed,\n\t\tfileText: text,\n\t\tfileImages: images,\n\t\tstdinContent,\n\t});\n}\n\n/** Result from resolving a session argument */\ntype ResolvedSession =\n\t| { type: \"path\"; path: string } // Direct file path\n\t| { type: \"local\"; path: string } // Found in current project\n\t| { type: \"global\"; path: string; cwd: string } // Found in different project\n\t| { type: \"not_found\"; arg: string }; // Not found anywhere\n\n/**\n * Resolve a session argument to a file path.\n * If it looks like a path, use as-is. Otherwise try to match as session ID prefix.\n */\nasync function findLocalSessionByExactId(\n\tsessionId: string,\n\tcwd: string,\n\tsessionDir?: string,\n): Promise<{ type: \"local\"; path: string } | undefined> {\n\tconst localSessions = await SessionManager.list(cwd, sessionDir);\n\tconst localMatch = localSessions.find((s) => s.id === sessionId);\n\treturn localMatch ? { type: \"local\", path: localMatch.path } : undefined;\n}\n\nasync function resolveSessionPath(sessionArg: string, cwd: string, sessionDir?: string): Promise<ResolvedSession> {\n\t// If it looks like a file path, resolve it before handing it to the session manager.\n\tif (sessionArg.includes(\"/\") || sessionArg.includes(\"\\\\\") || sessionArg.endsWith(\".jsonl\")) {\n\t\treturn { type: \"path\", path: resolvePath(sessionArg, cwd) };\n\t}\n\n\t// Try to match as session ID in current project first\n\tconst localSessions = await SessionManager.list(cwd, sessionDir);\n\tconst localMatch =\n\t\tlocalSessions.find((s) => s.id === sessionArg) ?? localSessions.find((s) => s.id.startsWith(sessionArg));\n\n\tif (localMatch) {\n\t\treturn { type: \"local\", path: localMatch.path };\n\t}\n\n\t// Try global search across all projects\n\tconst allSessions = await SessionManager.listAll(sessionDir);\n\tconst globalMatch =\n\t\tallSessions.find((s) => s.id === sessionArg) ?? allSessions.find((s) => s.id.startsWith(sessionArg));\n\n\tif (globalMatch) {\n\t\treturn { type: \"global\", path: globalMatch.path, cwd: globalMatch.cwd };\n\t}\n\n\t// Not found anywhere\n\treturn { type: \"not_found\", arg: sessionArg };\n}\n\n/** Prompt user for yes/no confirmation */\nasync function promptConfirm(message: string, startupView?: InteractiveView): Promise<boolean> {\n\tif (startupView) {\n\t\treturn startupView.confirm(\"Confirm\", message);\n\t}\n\treturn new Promise((resolve) => {\n\t\tconst rl = createInterface({\n\t\t\tinput: process.stdin,\n\t\t\toutput: process.stdout,\n\t\t});\n\t\trl.question(`${message} [y/N] `, (answer) => {\n\t\t\trl.close();\n\t\t\tresolve(answer.toLowerCase() === \"y\" || answer.toLowerCase() === \"yes\");\n\t\t});\n\t});\n}\n\nfunction validateForkFlags(parsed: Args): void {\n\tif (!parsed.fork) return;\n\n\tconst conflictingFlags = [\n\t\tparsed.session ? \"--session\" : undefined,\n\t\tparsed.continue ? \"--continue\" : undefined,\n\t\tparsed.resume ? \"--resume\" : undefined,\n\t\tparsed.noSession ? \"--no-session\" : undefined,\n\t].filter((flag): flag is string => flag !== undefined);\n\n\tif (conflictingFlags.length > 0) {\n\t\tconsole.error(chalk.red(`Error: --fork cannot be combined with ${conflictingFlags.join(\", \")}`));\n\t\tprocess.exit(1);\n\t}\n}\n\nfunction validateSessionIdFlags(parsed: Args): void {\n\tif (parsed.sessionId === undefined) return;\n\n\tconst conflictingFlags = [\n\t\tparsed.session ? \"--session\" : undefined,\n\t\tparsed.continue ? \"--continue\" : undefined,\n\t\tparsed.resume ? \"--resume\" : undefined,\n\t].filter((flag): flag is string => flag !== undefined);\n\n\tif (conflictingFlags.length > 0) {\n\t\tconsole.error(chalk.red(`Error: --session-id cannot be combined with ${conflictingFlags.join(\", \")}`));\n\t\tprocess.exit(1);\n\t}\n\n\ttry {\n\t\tassertValidSessionId(parsed.sessionId);\n\t} catch (error: unknown) {\n\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\tconsole.error(chalk.red(`Error: ${message}`));\n\t\tprocess.exit(1);\n\t}\n}\n\nfunction openSessionOrExit(path: string, sessionDir?: string): SessionManager {\n\ttry {\n\t\treturn SessionManager.open(path, sessionDir);\n\t} catch (error: unknown) {\n\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\tconsole.error(chalk.red(`Error: ${message}`));\n\t\tprocess.exit(1);\n\t}\n}\n\nfunction forkSessionOrExit(sourcePath: string, cwd: string, sessionDir?: string, sessionId?: string): SessionManager {\n\ttry {\n\t\treturn SessionManager.forkFrom(sourcePath, cwd, sessionDir, { id: sessionId });\n\t} catch (error: unknown) {\n\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\tconsole.error(chalk.red(`Error: ${message}`));\n\t\tprocess.exit(1);\n\t}\n}\n\nasync function createSessionManager(\n\tparsed: Args,\n\tcwd: string,\n\tsessionDir: string | undefined,\n\tsettingsManager: SettingsManager,\n\tstartupView?: InteractiveView,\n): Promise<SessionManager> {\n\tif (parsed.noSession || parsed.help || parsed.listModels !== undefined) {\n\t\treturn SessionManager.inMemory(cwd, parsed.sessionId !== undefined ? { id: parsed.sessionId } : undefined);\n\t}\n\n\tif (parsed.fork) {\n\t\tif (parsed.sessionId) {\n\t\t\tconst existingTarget = await findLocalSessionByExactId(parsed.sessionId, cwd, sessionDir);\n\t\t\tif (existingTarget) {\n\t\t\t\tconsole.error(chalk.red(`Session already exists with id '${parsed.sessionId}'`));\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\t\t}\n\n\t\tconst resolved = await resolveSessionPath(parsed.fork, cwd, sessionDir);\n\n\t\tswitch (resolved.type) {\n\t\t\tcase \"path\":\n\t\t\tcase \"local\":\n\t\t\tcase \"global\":\n\t\t\t\treturn forkSessionOrExit(resolved.path, cwd, sessionDir, parsed.sessionId);\n\n\t\t\tcase \"not_found\":\n\t\t\t\tconsole.error(chalk.red(`No session found matching '${resolved.arg}'`));\n\t\t\t\tprocess.exit(1);\n\t\t}\n\t}\n\n\tif (parsed.session) {\n\t\tconst resolved = await resolveSessionPath(parsed.session, cwd, sessionDir);\n\n\t\tswitch (resolved.type) {\n\t\t\tcase \"path\":\n\t\t\tcase \"local\":\n\t\t\t\treturn openSessionOrExit(resolved.path, sessionDir);\n\n\t\t\tcase \"global\": {\n\t\t\t\tconsole.log(chalk.yellow(`Session found in different project: ${resolved.cwd}`));\n\t\t\t\tconst shouldFork = await promptConfirm(\"Fork this session into current directory?\", startupView);\n\t\t\t\tif (!shouldFork) {\n\t\t\t\t\tconsole.log(chalk.dim(\"Aborted.\"));\n\t\t\t\t\tprocess.exit(0);\n\t\t\t\t}\n\t\t\t\treturn forkSessionOrExit(resolved.path, cwd, sessionDir);\n\t\t\t}\n\n\t\t\tcase \"not_found\":\n\t\t\t\tconsole.error(chalk.red(`No session found matching '${resolved.arg}'`));\n\t\t\t\tprocess.exit(1);\n\t\t}\n\t}\n\n\tif (parsed.resume) {\n\t\ttry {\n\t\t\tconst currentSessionsLoader = (onProgress?: Parameters<typeof SessionManager.list>[2]) =>\n\t\t\t\tSessionManager.list(cwd, sessionDir, onProgress);\n\t\t\tconst allSessionsLoader = (onProgress?: Parameters<typeof SessionManager.listAll>[1]) =>\n\t\t\t\tSessionManager.listAll(sessionDir, onProgress);\n\t\t\tconst selectedPath = startupView\n\t\t\t\t? await startupView.selectSession(currentSessionsLoader, allSessionsLoader)\n\t\t\t\t: await selectSession(currentSessionsLoader, allSessionsLoader, settingsManager);\n\t\t\tif (!selectedPath) {\n\t\t\t\tconsole.log(chalk.dim(\"No session selected\"));\n\t\t\t\tprocess.exit(0);\n\t\t\t}\n\t\t\treturn SessionManager.open(selectedPath, sessionDir);\n\t\t} finally {\n\t\t\tstopThemeWatcher();\n\t\t}\n\t}\n\n\tif (parsed.continue) {\n\t\treturn SessionManager.continueRecent(cwd, sessionDir);\n\t}\n\n\tif (parsed.sessionId) {\n\t\tconst existingSession = await findLocalSessionByExactId(parsed.sessionId, cwd, sessionDir);\n\t\tif (existingSession) {\n\t\t\treturn SessionManager.open(existingSession.path, sessionDir);\n\t\t}\n\t\tconsole.error(\n\t\t\tchalk.yellow(\n\t\t\t\t`Warning: No project session found with id '${parsed.sessionId}'; creating a new session with that id.`,\n\t\t\t),\n\t\t);\n\t}\n\n\treturn SessionManager.create(cwd, sessionDir, { id: parsed.sessionId });\n}\n\nfunction buildSessionOptions(\n\tparsed: Args,\n\tscopedModels: ScopedModel[],\n\thasExistingSession: boolean,\n\tmodelRuntime: ModelRuntime,\n\tsettingsManager: SettingsManager,\n): {\n\toptions: CreateAgentSessionOptions;\n\tcliThinkingFromModel: boolean;\n\tdiagnostics: AgentSessionRuntimeDiagnostic[];\n} {\n\tconst options: CreateAgentSessionOptions = {};\n\tconst diagnostics: AgentSessionRuntimeDiagnostic[] = [];\n\tlet cliThinkingFromModel = false;\n\n\t// Model from CLI\n\t// - supports --provider <name> --model <pattern>\n\t// - supports --model <provider>/<pattern>\n\tif (parsed.model) {\n\t\tconst resolved = resolveCliModel({\n\t\t\tcliProvider: parsed.provider,\n\t\t\tcliModel: parsed.model,\n\t\t\tcliThinking: parsed.thinking,\n\t\t\tmodelRuntime,\n\t\t});\n\t\tif (resolved.warning) {\n\t\t\tdiagnostics.push({ type: \"warning\", message: resolved.warning });\n\t\t}\n\t\tif (resolved.error) {\n\t\t\tdiagnostics.push({ type: \"error\", message: resolved.error });\n\t\t}\n\t\tif (resolved.model) {\n\t\t\toptions.model = resolved.model;\n\t\t\t// Allow \"--model <pattern>:<thinking>\" as a shorthand.\n\t\t\t// Explicit --thinking still takes precedence (applied later).\n\t\t\tif (!parsed.thinking && resolved.thinkingLevel) {\n\t\t\t\toptions.thinkingLevel = resolved.thinkingLevel;\n\t\t\t\tcliThinkingFromModel = true;\n\t\t\t}\n\t\t}\n\t}\n\n\tif (!options.model && scopedModels.length > 0 && !hasExistingSession) {\n\t\t// Check if saved default is in scoped models - use it if so, otherwise first scoped model\n\t\tconst savedProvider = settingsManager.getDefaultProvider();\n\t\tconst savedModelId = settingsManager.getDefaultModel();\n\t\tconst savedModel = savedProvider && savedModelId ? modelRuntime.getModel(savedProvider, savedModelId) : undefined;\n\t\tconst savedInScope = savedModel ? scopedModels.find((sm) => modelsAreEqual(sm.model, savedModel)) : undefined;\n\n\t\tif (savedInScope) {\n\t\t\toptions.model = savedInScope.model;\n\t\t\t// Use thinking level from scoped model config if explicitly set\n\t\t\tif (!parsed.thinking && savedInScope.thinkingLevel) {\n\t\t\t\toptions.thinkingLevel = savedInScope.thinkingLevel;\n\t\t\t}\n\t\t} else {\n\t\t\toptions.model = scopedModels[0].model;\n\t\t\t// Use thinking level from first scoped model if explicitly set\n\t\t\tif (!parsed.thinking && scopedModels[0].thinkingLevel) {\n\t\t\t\toptions.thinkingLevel = scopedModels[0].thinkingLevel;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Thinking level from CLI (takes precedence over scoped model thinking levels set above)\n\tif (parsed.thinking) {\n\t\toptions.thinkingLevel = parsed.thinking;\n\t}\n\n\t// Scoped models for Ctrl+P cycling\n\t// Keep thinking level undefined when not explicitly set in the model pattern.\n\t// Undefined means \"inherit current session thinking level\" during cycling.\n\tif (scopedModels.length > 0) {\n\t\toptions.scopedModels = scopedModels.map((sm) => ({\n\t\t\tmodel: sm.model,\n\t\t\tthinkingLevel: sm.thinkingLevel,\n\t\t}));\n\t}\n\n\t// API key from CLI - set as a non-persistent runtime override\n\t// (handled by caller before createAgentSession)\n\n\t// Tools\n\tif (parsed.noTools) {\n\t\toptions.noTools = \"all\";\n\t} else if (parsed.noBuiltinTools) {\n\t\toptions.noTools = \"builtin\";\n\t}\n\tif (parsed.tools) {\n\t\toptions.tools = [...parsed.tools];\n\t}\n\tif (parsed.excludeTools) {\n\t\toptions.excludeTools = [...parsed.excludeTools];\n\t}\n\n\treturn { options, cliThinkingFromModel, diagnostics };\n}\n\nfunction resolveCliPaths(cwd: string, paths: string[] | undefined): string[] | undefined {\n\treturn paths?.map((value) => (isLocalPath(value) ? resolvePath(value, cwd) : value));\n}\n\nfunction createStartupViewTrustContext(cwd: string, startupView: InteractiveView): ProjectTrustContext {\n\treturn {\n\t\tcwd,\n\t\tmode: \"tui\",\n\t\thasUI: true,\n\t\tui: {\n\t\t\tselect: (title, options) =>\n\t\t\t\tstartupView.select(\n\t\t\t\t\ttitle,\n\t\t\t\t\toptions.map((option) => ({ label: option, value: option })),\n\t\t\t\t),\n\t\t\tconfirm: (title, message) => startupView.confirm(title, message),\n\t\t\tinput: (title, placeholder) => startupView.input(title, placeholder),\n\t\t\tnotify: () => {},\n\t\t},\n\t};\n}\n\nasync function promptForMissingSessionCwd(\n\tissue: SessionCwdIssue,\n\tsettingsManager: SettingsManager,\n\tstartupView?: InteractiveView,\n): Promise<string | undefined> {\n\tconst options = [\n\t\t{ label: \"Continue\", value: issue.fallbackCwd },\n\t\t{ label: \"Cancel\", value: undefined },\n\t];\n\treturn startupView\n\t\t? startupView.select(formatMissingSessionCwdPrompt(issue), options)\n\t\t: showStartupSelector(settingsManager, formatMissingSessionCwdPrompt(issue), options);\n}\n\nexport interface MainOptions {\n\textensionFactories?: InlineExtension[];\n\tstartupView?: InteractiveView;\n}\n\nexport async function main(args: string[], options?: MainOptions) {\n\tresetTimings();\n\tconst offlineMode = args.includes(\"--offline\") || isTruthyEnvFlag(process.env.PI_OFFLINE);\n\tif (offlineMode) {\n\t\tprocess.env.PI_OFFLINE = \"1\";\n\t}\n\n\tconst cwd = process.cwd();\n\tconst agentDir = getAgentDir();\n\tconst bootstrapSettingsManager = SettingsManager.create(cwd, agentDir, { projectTrusted: false });\n\tapplyHttpProxySettings(bootstrapSettingsManager.getGlobalSettings().httpProxy);\n\tconfigureHttpDispatcher();\n\n\tif ([\"setup\", \"features\", \"uninstall\", \"browser\"].includes(args[0])) {\n\t\tconst { handleInstallCli } = await import(\"./cli/install-cli.ts\");\n\t\tif (await handleInstallCli(args)) return;\n\t}\n\n\tif (args[0] === \"update\") {\n\t\tconst { handleUpdateCli } = await import(\"./cli/update-cli.ts\");\n\t\tif (await handleUpdateCli(args)) return;\n\t}\n\n\tif ([\"install\", \"remove\", \"uninstall\", \"list\", \"config\"].includes(args[0])) {\n\t\tconst { handleConfigCommand, handlePackageCommand } = await import(\"./package-manager-cli.ts\");\n\t\tif (await handlePackageCommand(args, { extensionFactories: options?.extensionFactories })) {\n\t\t\tprocess.exit(process.exitCode ?? 0);\n\t\t\treturn;\n\t\t}\n\t\tif (await handleConfigCommand(args, { extensionFactories: options?.extensionFactories })) return;\n\t}\n\n\tif (args[0] === \"gateway\") {\n\t\tconst { handleGatewayCommand } = await import(\"./gateway/command.ts\");\n\t\tif (await handleGatewayCommand(args)) return;\n\t}\n\n\tconst parsed = parseArgs(args);\n\tif (parsed.diagnostics.length > 0) {\n\t\tfor (const d of parsed.diagnostics) {\n\t\t\tconst color = d.type === \"error\" ? chalk.red : chalk.yellow;\n\t\t\tconsole.error(color(`${d.type === \"error\" ? \"Error\" : \"Warning\"}: ${d.message}`));\n\t\t}\n\t\tif (parsed.diagnostics.some((d) => d.type === \"error\")) {\n\t\t\tprocess.exit(1);\n\t\t}\n\t}\n\ttime(\"parseArgs\");\n\n\tif (parsed.version) {\n\t\tconsole.log(VERSION);\n\t\tprocess.exit(0);\n\t}\n\n\tif (parsed.export) {\n\t\tlet result: string;\n\t\ttry {\n\t\t\tconst { exportFromFile } = await import(\"./core/export-html/index.ts\");\n\t\t\tconst outputPath = parsed.messages.length > 0 ? parsed.messages[0] : undefined;\n\t\t\tresult = await exportFromFile(parsed.export, outputPath);\n\t\t} catch (error: unknown) {\n\t\t\tconst message = error instanceof Error ? error.message : \"Failed to export session\";\n\t\t\tconsole.error(chalk.red(`Error: ${message}`));\n\t\t\tprocess.exit(1);\n\t\t}\n\t\tconsole.log(`Exported to: ${result}`);\n\t\tprocess.exit(0);\n\t}\n\n\tlet appMode = resolveAppMode(parsed, process.stdin.isTTY, process.stdout.isTTY);\n\tconst interactiveModeImport =\n\t\tappMode === \"interactive\" ? import(\"./modes/interactive/interactive-mode.ts\") : undefined;\n\tconst startupView = appMode === \"interactive\" ? options?.startupView : undefined;\n\tif (options?.startupView && !startupView) options.startupView.stop();\n\t// Parent-delegated children inherit read-only or auto before any tool call.\n\tapplyInheritedSubagentPermissions();\n\tconst shouldTakeOverStdout = appMode !== \"interactive\" && !isPlainRuntimeMetadataCommand(parsed);\n\tif (shouldTakeOverStdout) {\n\t\ttakeOverStdout();\n\t}\n\n\tif (parsed.mode === \"rpc\" && parsed.fileArgs.length > 0) {\n\t\tconsole.error(chalk.red(\"Error: @file arguments are not supported in RPC mode\"));\n\t\tprocess.exit(1);\n\t}\n\n\tvalidateForkFlags(parsed);\n\tvalidateSessionIdFlags(parsed);\n\n\t// Run migrations (pass cwd for project-local migrations)\n\tconst { migratedAuthProviders: migratedProviders, deprecationWarnings } = runMigrations(cwd);\n\ttime(\"runMigrations\");\n\n\tconst startupSettingsManager = SettingsManager.create(cwd, agentDir);\n\treportDiagnostics(collectSettingsDiagnostics(startupSettingsManager, \"startup session lookup\"));\n\n\t// Register the model-tier bridge before extensions load so pi-subagents can read\n\t// tier settings when building its tool description. Re-pointed to the runtime\n\t// settings manager below once services exist.\n\tregisterModelTierBridge(startupSettingsManager);\n\t// lunr: same for the simple-pi-memory character cap — extensions read it via the\n\t// bridge at load/runtime; re-pointed to the runtime settings manager below.\n\tregisterMemoryCapBridge(startupSettingsManager);\n\t// lunr: TUI customize settings (spinner, dividers, rail, prompt symbol) read by\n\t// ashxj-spinners and ashxj-tui via the bridge; re-pointed to runtime below.\n\tregisterCustomizeBridge(startupSettingsManager);\n\n\t// Experimental first-time setup: theme choice and analytics opt-in.\n\t// Runs before any runtime services are created so the chosen settings apply everywhere.\n\tif (appMode === \"interactive\" && !parsed.help && parsed.listModels === undefined && shouldRunFirstTimeSetup()) {\n\t\tstartupView?.pause();\n\t\tawait showFirstTimeSetup(startupSettingsManager);\n\t\tstartupView?.resume();\n\t\ttime(\"firstTimeSetup\");\n\t}\n\n\t// Decide the final runtime cwd before creating cwd-bound runtime services.\n\t// --session and --resume may select a session from another project, so project-local\n\t// settings, resources, provider registrations, and models must be resolved only after\n\t// the target session cwd is known. The startup-cwd settings manager is used only for\n\t// sessionDir lookup during session selection.\n\tconst envSessionDir = process.env[ENV_SESSION_DIR];\n\tconst sessionDir =\n\t\t(parsed.sessionDir ? normalizePath(parsed.sessionDir) : undefined) ??\n\t\t(envSessionDir ? expandTildePath(envSessionDir) : undefined) ??\n\t\tstartupSettingsManager.getSessionDir();\n\tlet sessionManager = await createSessionManager(parsed, cwd, sessionDir, startupSettingsManager, startupView);\n\tconst missingSessionCwdIssue = getMissingSessionCwdIssue(sessionManager, cwd);\n\tif (missingSessionCwdIssue) {\n\t\tif (appMode === \"interactive\") {\n\t\t\tconst selectedCwd = await promptForMissingSessionCwd(\n\t\t\t\tmissingSessionCwdIssue,\n\t\t\t\tstartupSettingsManager,\n\t\t\t\tstartupView,\n\t\t\t);\n\t\t\tif (!selectedCwd) {\n\t\t\t\tprocess.exit(0);\n\t\t\t}\n\t\t\tsessionManager.dispose();\n\t\t\tsessionManager = SessionManager.open(missingSessionCwdIssue.sessionFile!, sessionDir, selectedCwd);\n\t\t} else {\n\t\t\tconsole.error(chalk.red(new MissingSessionCwdError(missingSessionCwdIssue).message));\n\t\t\tprocess.exit(1);\n\t\t}\n\t}\n\tif (parsed.name !== undefined) {\n\t\tconst name = parsed.name.trim();\n\t\tif (!name) {\n\t\t\tconsole.error(chalk.red(\"Error: --name requires a non-empty value\"));\n\t\t\tprocess.exit(1);\n\t\t}\n\t\tsessionManager.appendSessionInfo(name);\n\t}\n\ttime(\"createSessionManager\");\n\n\tconst runSessionRetention = async () => {\n\t\ttry {\n\t\t\tconst retentionDays = startupSettingsManager.getSessionRetentionDays();\n\t\t\tif (retentionDays <= 0) return;\n\t\t\tconst activeSessionFile = sessionManager.getSessionFile();\n\t\t\tconst { deleted } = await pruneOldSessions(getSessionsDir(), retentionDays, {\n\t\t\t\texcludeFile: activeSessionFile,\n\t\t\t});\n\t\t\tif (sessionDir) {\n\t\t\t\tconst extra = await pruneOldSessions(sessionDir, retentionDays, { excludeFile: activeSessionFile });\n\t\t\t\tdeleted.push(...extra.deleted);\n\t\t\t}\n\t\t\tif (deleted.length > 0) {\n\t\t\t\tappendDebugLog(\n\t\t\t\t\t`session-retention: deleted ${deleted.length} file(s):\\n${deleted.map((path) => ` ${path}`).join(\"\\n\")}`,\n\t\t\t\t);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tappendDebugLog(`session-retention: prune failed: ${error instanceof Error ? error.message : String(error)}`);\n\t\t}\n\t};\n\n\tconst trustStore = new ProjectTrustStore(agentDir);\n\tconst sessionCwd = sessionManager.getCwd();\n\tconst autoTrustOnReloadCwd =\n\t\tparsed.projectTrustOverride === undefined && !hasTrustRequiringProjectResources(sessionCwd)\n\t\t\t? sessionCwd\n\t\t\t: undefined;\n\tconst trustPromptMode: AppMode = parsed.help || parsed.listModels !== undefined ? \"print\" : appMode;\n\tconst projectTrustByCwd = new Map<string, boolean>();\n\n\tconst resolvedExtensionPaths = resolveCliPaths(cwd, parsed.extensions);\n\tconst resolvedSkillPaths = resolveCliPaths(cwd, parsed.skills);\n\tconst resolvedPromptTemplatePaths = resolveCliPaths(cwd, parsed.promptTemplates);\n\tconst resolvedThemePaths = resolveCliPaths(cwd, parsed.themes);\n\tconst builtinRoster = appMode === \"interactive\" ? [...lightBuiltinExtensions] : await loadAllBuiltinExtensions();\n\tconst rememberAttachedFactories = (factories: InlineExtension[]) => {\n\t\tconst seen = new Set(\n\t\t\tbuiltinRoster.map((entry) => (typeof entry === \"function\" ? undefined : entry.name)).filter(Boolean),\n\t\t);\n\t\tfor (const factory of factories) {\n\t\t\tconst name = typeof factory === \"function\" ? undefined : factory.name;\n\t\t\tif (name && seen.has(name)) continue;\n\t\t\tif (name) seen.add(name);\n\t\t\tbuiltinRoster.push(factory);\n\t\t}\n\t};\n\tconst createRuntime: CreateAgentSessionRuntimeFactory = async ({\n\t\tcwd,\n\t\tagentDir,\n\t\tsessionManager,\n\t\tsessionStartEvent,\n\t\tprojectTrustContext,\n\t}) => {\n\t\tconst isInitialRuntime = sessionStartEvent === undefined;\n\t\tconst projectTrustDiagnostics: AgentSessionRuntimeDiagnostic[] = [];\n\t\tconst cachedProjectTrust = projectTrustByCwd.get(cwd);\n\t\tconst hasTrustRequiringResources = hasTrustRequiringProjectResources(cwd);\n\t\tconst shouldResolveProjectTrust =\n\t\t\tparsed.projectTrustOverride === undefined && cachedProjectTrust === undefined && hasTrustRequiringResources;\n\t\tconst projectTrusted = shouldResolveProjectTrust\n\t\t\t? false\n\t\t\t: (cachedProjectTrust ??\n\t\t\t\tparsed.projectTrustOverride ??\n\t\t\t\t(!hasTrustRequiringResources || trustStore.get(cwd) === true));\n\t\tconst runtimeSettingsManager = SettingsManager.create(cwd, agentDir, { projectTrusted });\n\t\tconst skipMissingPackageInstall = isInitialRuntime && appMode === \"interactive\";\n\t\tconst services = await createAgentSessionServices({\n\t\t\tcwd,\n\t\t\tagentDir,\n\t\t\tsettingsManager: runtimeSettingsManager,\n\t\t\textensionFlagValues: parsed.unknownFlags,\n\t\t\tresourceLoaderReloadOptions: shouldResolveProjectTrust\n\t\t\t\t? {\n\t\t\t\t\t\tskipMissingPackageInstall,\n\t\t\t\t\t\tresolveProjectTrust: async ({ extensionsResult }) => {\n\t\t\t\t\t\t\tconst trusted = await resolveProjectTrusted({\n\t\t\t\t\t\t\t\tcwd,\n\t\t\t\t\t\t\t\ttrustStore,\n\t\t\t\t\t\t\t\ttrustOverride: parsed.projectTrustOverride,\n\t\t\t\t\t\t\t\tdefaultProjectTrust: startupSettingsManager.getDefaultProjectTrust(),\n\t\t\t\t\t\t\t\textensionsResult,\n\t\t\t\t\t\t\t\tprojectTrustContext:\n\t\t\t\t\t\t\t\t\tprojectTrustContext ??\n\t\t\t\t\t\t\t\t\t(isInitialRuntime && startupView\n\t\t\t\t\t\t\t\t\t\t? createStartupViewTrustContext(cwd, startupView)\n\t\t\t\t\t\t\t\t\t\t: createProjectTrustContext({\n\t\t\t\t\t\t\t\t\t\t\t\tcwd,\n\t\t\t\t\t\t\t\t\t\t\t\tmode: isInitialRuntime ? trustPromptMode : appMode,\n\t\t\t\t\t\t\t\t\t\t\t\tsettingsManager: startupSettingsManager,\n\t\t\t\t\t\t\t\t\t\t\t\thasUI: isInitialRuntime && trustPromptMode === \"interactive\",\n\t\t\t\t\t\t\t\t\t\t\t})),\n\t\t\t\t\t\t\t\tonExtensionError: (message) => projectTrustDiagnostics.push({ type: \"warning\", message }),\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tprojectTrustByCwd.set(cwd, trusted);\n\t\t\t\t\t\t\treturn trusted;\n\t\t\t\t\t\t},\n\t\t\t\t\t}\n\t\t\t\t: skipMissingPackageInstall\n\t\t\t\t\t? { skipMissingPackageInstall }\n\t\t\t\t\t: undefined,\n\t\t\tresourceLoaderOptions: {\n\t\t\t\tadditionalExtensionPaths: resolvedExtensionPaths,\n\t\t\t\tadditionalSkillPaths: resolvedSkillPaths,\n\t\t\t\tadditionalPromptTemplatePaths: resolvedPromptTemplatePaths,\n\t\t\t\tadditionalThemePaths: resolvedThemePaths,\n\t\t\t\tnoExtensions: parsed.noExtensions,\n\t\t\t\tnoSkills: parsed.noSkills,\n\t\t\t\tnoPromptTemplates: parsed.noPromptTemplates,\n\t\t\t\tnoThemes: parsed.noThemes,\n\t\t\t\tnoContextFiles: parsed.noContextFiles,\n\t\t\t\tsystemPrompt: parsed.systemPrompt,\n\t\t\t\tappendSystemPrompt: parsed.appendSystemPrompt,\n\t\t\t\textensionFactories: [...builtinRoster, ...(options?.extensionFactories ?? [])],\n\t\t\t},\n\t\t});\n\t\tconst { settingsManager, modelRuntime, resourceLoader } = services;\n\t\tif (\n\t\t\tparsed.model &&\n\t\t\t!resolveCliModel({\n\t\t\t\tcliProvider: parsed.provider,\n\t\t\t\tcliModel: parsed.model,\n\t\t\t\tcliThinking: parsed.thinking,\n\t\t\t\tmodelRuntime,\n\t\t\t}).model\n\t\t) {\n\t\t\tawait modelRuntime.refreshIfStale();\n\t\t}\n\t\tconst diagnostics: AgentSessionRuntimeDiagnostic[] = [\n\t\t\t...projectTrustDiagnostics,\n\t\t\t...services.diagnostics,\n\t\t\t...collectSettingsDiagnostics(settingsManager, \"runtime creation\"),\n\t\t\t...resourceLoader.getExtensions().errors.map(({ path, error }) => ({\n\t\t\t\ttype: \"error\" as const,\n\t\t\t\tmessage: `Failed to load extension \"${path}\": ${error}`,\n\t\t\t})),\n\t\t];\n\n\t\tconst modelPatterns = parsed.models ?? settingsManager.getEnabledModels();\n\t\tconst scopedModels =\n\t\t\tmodelPatterns && modelPatterns.length > 0 ? await resolveModelScope(modelPatterns, modelRuntime) : [];\n\t\tconst {\n\t\t\toptions: sessionOptions,\n\t\t\tcliThinkingFromModel,\n\t\t\tdiagnostics: sessionOptionDiagnostics,\n\t\t} = buildSessionOptions(\n\t\t\tparsed,\n\t\t\tscopedModels,\n\t\t\tsessionManager.buildSessionContext().messages.length > 0,\n\t\t\tmodelRuntime,\n\t\t\tsettingsManager,\n\t\t);\n\t\tdiagnostics.push(...sessionOptionDiagnostics);\n\n\t\tif (parsed.apiKey) {\n\t\t\tif (!sessionOptions.model) {\n\t\t\t\tdiagnostics.push({\n\t\t\t\t\ttype: \"error\",\n\t\t\t\t\tmessage: \"--api-key requires a model to be specified via --model, --provider/--model, or --models\",\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\t// Cache-only: do not wait on GitHub / provider /v1/models before first paint.\n\t\t\t\tawait modelRuntime.setRuntimeApiKey(sessionOptions.model.provider, parsed.apiKey, {\n\t\t\t\t\tallowNetwork: false,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tconst created = await createAgentSessionFromServices({\n\t\t\tservices,\n\t\t\tsessionManager,\n\t\t\tsessionStartEvent,\n\t\t\tmodel: sessionOptions.model,\n\t\t\tthinkingLevel: sessionOptions.thinkingLevel,\n\t\t\tscopedModels: sessionOptions.scopedModels,\n\t\t\ttools: sessionOptions.tools,\n\t\t\texcludeTools: sessionOptions.excludeTools,\n\t\t\tnoTools: sessionOptions.noTools,\n\t\t\tcustomTools: sessionOptions.customTools,\n\t\t});\n\t\tconst cliThinkingOverride = parsed.thinking !== undefined || cliThinkingFromModel;\n\t\tif (created.session.model && cliThinkingOverride) {\n\t\t\tcreated.session.setThinkingLevel(created.session.thinkingLevel);\n\t\t}\n\n\t\treturn {\n\t\t\t...created,\n\t\t\tservices,\n\t\t\tdiagnostics,\n\t\t};\n\t};\n\ttime(\"createRuntime\");\n\tconst runtime = await createAgentSessionRuntime(createRuntime, {\n\t\tcwd: sessionManager.getCwd(),\n\t\tagentDir,\n\t\tsessionManager,\n\t\tonRuntimeApplied: bindRuntimeBridges,\n\t});\n\tif (startupView?.isExitRequested) {\n\t\tawait runtime.dispose();\n\t\treturn;\n\t}\n\tmarkStartupMilestone(\"runtime_hydrated\");\n\ttime(\"createAgentSessionRuntime\");\n\tif (appMode !== \"interactive\") await runSessionRetention();\n\tconst { services, session, modelFallbackMessage } = runtime;\n\tconst { settingsManager, modelRuntime, resourceLoader } = services;\n\tapplyHttpProxySettings(settingsManager.getGlobalSettings().httpProxy);\n\tconfigureHttpDispatcher(settingsManager.getHttpIdleTimeoutMs());\n\n\tif (parsed.help) {\n\t\tconst extensionFlags = resourceLoader\n\t\t\t.getExtensions()\n\t\t\t.extensions.flatMap((extension) => Array.from(extension.flags.values()));\n\t\tprintHelp(extensionFlags);\n\t\tprocess.exit(0);\n\t}\n\n\tif (parsed.listModels !== undefined) {\n\t\tconst searchPattern = typeof parsed.listModels === \"string\" ? parsed.listModels : undefined;\n\t\tawait listModels(modelRuntime, searchPattern);\n\t\tprocess.exit(0);\n\t}\n\n\t// Read piped stdin content (if any) - skip for RPC mode which uses stdin for JSON-RPC.\n\t// Startup benchmark must stay interactive even if a leftover redirected handle has bytes.\n\tlet stdinContent: string | undefined;\n\tconst startupBenchmark = isTruthyEnvFlag(process.env.PI_STARTUP_BENCHMARK);\n\tif (appMode !== \"rpc\" && !startupBenchmark) {\n\t\tstdinContent = await readPipedStdin();\n\t\tif (stdinContent !== undefined && appMode === \"interactive\") {\n\t\t\tappMode = \"print\";\n\t\t}\n\t}\n\ttime(\"readPipedStdin\");\n\n\tconst { initialMessage, initialImages } = await prepareInitialMessage(\n\t\tparsed,\n\t\tsettingsManager.getImageAutoResize(),\n\t\tstdinContent,\n\t);\n\ttime(\"prepareInitialMessage\");\n\tinitTheme(settingsManager.getTheme(), appMode === \"interactive\");\n\ttime(\"initTheme\");\n\n\tif (appMode === \"interactive\" && !startupView && deprecationWarnings.length > 0) {\n\t\tawait showDeprecationWarnings(deprecationWarnings);\n\t}\n\n\ttime(\"resolveModelScope\");\n\tif (!(appMode === \"interactive\" && startupView)) reportDiagnostics(runtime.diagnostics);\n\tif (runtime.diagnostics.some((diagnostic) => diagnostic.type === \"error\")) {\n\t\tconst extensionHint = runtime.diagnostics.some((diagnostic) =>\n\t\t\tdiagnostic.message.includes(\"Failed to load extension\"),\n\t\t)\n\t\t\t? `\\n${EXTENSION_LOAD_FAILURE_HINT}`\n\t\t\t: \"\";\n\t\tif (startupView) {\n\t\t\tprocess.exitCode = 1;\n\t\t\tawait startupView.fail(\n\t\t\t\t`${runtime.diagnostics.map((diagnostic) => diagnostic.message).join(\"\\n\")}${extensionHint}`,\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\t\tif (extensionHint) console.error(chalk.yellow(EXTENSION_LOAD_FAILURE_HINT));\n\t\tprocess.exit(1);\n\t}\n\ttime(\"createAgentSession\");\n\n\tif (appMode !== \"interactive\" && !session.model) {\n\t\tconsole.error(chalk.red(formatNoModelsAvailableMessage()));\n\t\tprocess.exit(1);\n\t}\n\n\tif (startupBenchmark && appMode !== \"interactive\") {\n\t\tconsole.error(chalk.red(\"Error: PI_STARTUP_BENCHMARK only supports interactive mode\"));\n\t\tprocess.exit(1);\n\t}\n\n\tif (appMode === \"rpc\") {\n\t\tconst { runRpcMode } = await import(\"./modes/rpc/rpc-mode.ts\");\n\t\tprintTimings();\n\t\tawait runRpcMode(runtime);\n\t} else if (appMode === \"interactive\") {\n\t\tconst [{ InteractiveMode }, { loadDeferredBuiltinExtensions }] = await Promise.all([\n\t\t\tinteractiveModeImport!,\n\t\t\timport(\"./builtin-extensions/index.ts\"),\n\t\t]);\n\t\tconst interactiveMode = new InteractiveMode(runtime, {\n\t\t\tmigratedProviders,\n\t\t\tmodelFallbackMessage,\n\t\t\tautoTrustOnReloadCwd,\n\t\t\tinitialMessage,\n\t\t\tinitialImages,\n\t\t\tinitialMessages: parsed.messages,\n\t\t\tverbose: parsed.verbose,\n\t\t\tdeprecationWarnings: startupView ? deprecationWarnings : undefined,\n\t\t\tstartupDiagnostics: startupView\n\t\t\t\t? runtime.diagnostics.filter((diagnostic) => diagnostic.type !== \"error\")\n\t\t\t\t: undefined,\n\t\t\tstartupView: startupView?.binding(),\n\t\t\tdeferredMaintenance: runSessionRetention,\n\t\t\tdeferredBuiltinFactories: parsed.noExtensions ? undefined : loadDeferredBuiltinExtensions,\n\t\t\tonDeferredBuiltinsAttached: rememberAttachedFactories,\n\t\t});\n\t\tif (startupBenchmark) {\n\t\t\tconst { prepareBenchmarkRequest } = await import(\"./startup/benchmark-request.ts\");\n\t\t\tconst request = await prepareBenchmarkRequest(session);\n\t\t\tawait interactiveMode.init();\n\t\t\ttime(\"interactiveMode.init\");\n\t\t\tawait interactiveMode.waitForStartupReady();\n\t\t\ttime(\"promptBarrier\");\n\t\t\tawait request();\n\t\t\t// Consume terminal-query replies before returning control to the shell.\n\t\t\tawait new Promise((resolve) => setTimeout(resolve, 150));\n\t\t\tinteractiveMode.stop();\n\t\t\tawait runtime.dispose();\n\t\t\tstopThemeWatcher();\n\t\t\tprintTimings();\n\t\t\tif (process.stdout.writableLength > 0) {\n\t\t\t\tawait new Promise<void>((resolve) => process.stdout.once(\"drain\", resolve));\n\t\t\t}\n\t\t\tif (process.stderr.writableLength > 0) {\n\t\t\t\tawait new Promise<void>((resolve) => process.stderr.once(\"drain\", resolve));\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tawait interactiveMode.init();\n\t\ttime(\"interactiveMode.init\");\n\t\tprintTimings();\n\t\tawait interactiveMode.run();\n\t} else {\n\t\tconst { runPrintMode } = await import(\"./modes/print-mode.ts\");\n\t\tprintTimings();\n\t\tconst exitCode = await runPrintMode(runtime, {\n\t\t\tmode: toPrintOutputMode(appMode),\n\t\t\tmessages: parsed.messages,\n\t\t\tinitialMessage,\n\t\t\tinitialImages,\n\t\t});\n\t\tstopThemeWatcher();\n\t\trestoreStdout();\n\t\tif (exitCode !== 0) {\n\t\t\tprocess.exitCode = exitCode;\n\t\t}\n\t\treturn;\n\t}\n}\n"]}
1
+ {"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAuBH,OAAO,KAAK,EAAE,eAAe,EAAuB,MAAM,4BAA4B,CAAC;AA0BvF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAarE;;;GAGG;AACH,wBAAsB,cAAc,CACnC,MAAM,GAAE,MAAM,CAAC,UAA0B,EACzC,OAAO,GAAE;IAAE,YAAY,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAO,GACtD,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CA0C7B;AA+aD,MAAM,WAAW,WAAW;IAC3B,kBAAkB,CAAC,EAAE,eAAe,EAAE,CAAC;IACvC,WAAW,CAAC,EAAE,eAAe,CAAC;CAC9B;AAED,wBAAsB,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,OAAO,CAAC,EAAE,WAAW,iBA4jB/D","sourcesContent":["/**\n * Main entry point for the coding agent CLI.\n *\n * This file handles CLI argument parsing and translates them into\n * createAgentSession() options. The SDK does the heavy lifting.\n */\n\nimport { createInterface } from \"node:readline\";\nimport { type ImageContent, modelsAreEqual } from \"@ashx-j/lunr-ai\";\nimport chalk from \"chalk\";\nimport { lightBuiltinExtensions, loadAllBuiltinExtensions } from \"./builtin-extensions/index.ts\";\nimport { type Args, type Mode, parseArgs, printHelp } from \"./cli/args.ts\";\nimport { processFileArguments } from \"./cli/file-processor.ts\";\nimport { buildInitialMessage } from \"./cli/initial-message.ts\";\nimport { listModels } from \"./cli/list-models.ts\";\nimport { createProjectTrustContext } from \"./cli/project-trust.ts\";\nimport { selectSession } from \"./cli/session-picker.ts\";\nimport { shouldRunFirstTimeSetup, showFirstTimeSetup, showStartupSelector } from \"./cli/startup-ui.ts\";\nimport { APP_NAME, appendDebugLog, ENV_SESSION_DIR, expandTildePath, getAgentDir, VERSION } from \"./config.ts\";\nimport { type CreateAgentSessionRuntimeFactory, createAgentSessionRuntime } from \"./core/agent-session-runtime.ts\";\nimport {\n\ttype AgentSessionRuntimeDiagnostic,\n\tcreateAgentSessionFromServices,\n\tcreateAgentSessionServices,\n} from \"./core/agent-session-services.ts\";\nimport { formatNoModelsAvailableMessage } from \"./core/auth-guidance.ts\";\nimport { registerCustomizeBridge } from \"./core/customize.ts\";\nimport { ExtensionRunner, emitSessionShutdownEvent } from \"./core/extensions/runner.ts\";\nimport type { InlineExtension, ProjectTrustContext } from \"./core/extensions/types.ts\";\nimport { applyHttpProxySettings, configureHttpDispatcher } from \"./core/http-dispatcher.ts\";\nimport { registerMemoryCapBridge } from \"./core/memory-cap.ts\";\nimport { ModelRegistry } from \"./core/model-registry.ts\";\nimport { resolveCliModel, resolveModelScope, type ScopedModel } from \"./core/model-resolver.ts\";\nimport type { ModelRuntime } from \"./core/model-runtime.ts\";\nimport { registerModelTierBridge } from \"./core/model-tiers.ts\";\nimport { restoreStdout, takeOverStdout } from \"./core/output-guard.ts\";\nimport { type AppMode, resolveProjectTrusted } from \"./core/project-trust.ts\";\nimport { bindRuntimeBridges } from \"./core/runtime-bridges.ts\";\nimport type { CreateAgentSessionOptions } from \"./core/sdk.ts\";\nimport {\n\tformatMissingSessionCwdPrompt,\n\tgetMissingSessionCwdIssue,\n\tMissingSessionCwdError,\n\ttype SessionCwdIssue,\n} from \"./core/session-cwd.ts\";\nimport { assertValidSessionId, SessionManager } from \"./core/session-manager.ts\";\nimport { pruneOldSessions } from \"./core/session-retention.ts\";\nimport { getSessionRetentionTargets, selectApprovedStartupSession } from \"./core/session-startup-settings.ts\";\nimport { SettingsManager } from \"./core/settings-manager.ts\";\nimport { applyInheritedSubagentPermissions } from \"./core/subagent-permission-inherit.ts\";\nimport { printTimings, resetTimings, time } from \"./core/timings.ts\";\nimport { hasTrustRequiringProjectResources, ProjectTrustStore } from \"./core/trust-manager.ts\";\nimport { runMigrations, showDeprecationWarnings } from \"./migrations.ts\";\nimport { initTheme, stopThemeWatcher } from \"./modes/interactive/theme/theme.ts\";\nimport type { InteractiveView } from \"./startup/interactive-view.ts\";\nimport { markStartupMilestone } from \"./startup/startup-milestones.ts\";\nimport { isLocalPath, normalizePath, resolvePath } from \"./utils/paths.ts\";\n\nconst EXTENSION_LOAD_FAILURE_HINT = `Hint: Start without extensions using \"${APP_NAME} -ne\".`;\n\n/**\n * Read all content from piped stdin.\n * Returns undefined if stdin is a TTY (interactive terminal).\n */\nconst PIPED_STDIN_FIRST_CHUNK_MS = 50;\nconst PIPED_STDIN_IDLE_MS = 2000;\n\n/**\n * Read piped stdin. A non-TTY that never emits data (Windows console, leftover\n * redirected handle) must not block interactive start forever.\n */\nexport async function readPipedStdin(\n\tstream: NodeJS.ReadStream = process.stdin,\n\toptions: { firstChunkMs?: number; idleMs?: number } = {},\n): Promise<string | undefined> {\n\tif (stream.isTTY) {\n\t\treturn undefined;\n\t}\n\n\tconst firstChunkMs = options.firstChunkMs ?? PIPED_STDIN_FIRST_CHUNK_MS;\n\tconst idleMs = options.idleMs ?? PIPED_STDIN_IDLE_MS;\n\n\treturn new Promise((resolve) => {\n\t\tlet data = \"\";\n\t\tlet settled = false;\n\t\tlet sawData = false;\n\t\tlet idleTimer: ReturnType<typeof setTimeout> | undefined;\n\t\tconst firstChunkTimer = setTimeout(() => {\n\t\t\tif (!sawData) finish(undefined);\n\t\t}, firstChunkMs);\n\n\t\tconst finish = (value: string | undefined) => {\n\t\t\tif (settled) return;\n\t\t\tsettled = true;\n\t\t\tclearTimeout(firstChunkTimer);\n\t\t\tif (idleTimer) clearTimeout(idleTimer);\n\t\t\tstream.off(\"data\", onData);\n\t\t\tstream.off(\"end\", onEnd);\n\t\t\tstream.off(\"error\", onEnd);\n\t\t\tresolve(value);\n\t\t};\n\n\t\tconst onEnd = () => finish(data.trim() || undefined);\n\t\tconst onData = (chunk: string | Buffer) => {\n\t\t\tsawData = true;\n\t\t\tdata += typeof chunk === \"string\" ? chunk : chunk.toString(\"utf8\");\n\t\t\tif (idleTimer) clearTimeout(idleTimer);\n\t\t\tidleTimer = setTimeout(onEnd, idleMs);\n\t\t};\n\n\t\tstream.setEncoding(\"utf8\");\n\t\tstream.on(\"data\", onData);\n\t\tstream.on(\"end\", onEnd);\n\t\tstream.on(\"error\", onEnd);\n\t\tstream.resume();\n\t});\n}\n\nfunction collectSettingsDiagnostics(\n\tsettingsManager: SettingsManager,\n\tcontext: string,\n): AgentSessionRuntimeDiagnostic[] {\n\treturn settingsManager.drainErrors().map(({ scope, error }) => ({\n\t\ttype: \"warning\",\n\t\tmessage: `(${context}, ${scope} settings) ${error.message}`,\n\t}));\n}\n\nfunction reportDiagnostics(diagnostics: readonly AgentSessionRuntimeDiagnostic[]): void {\n\tfor (const diagnostic of diagnostics) {\n\t\tconst color = diagnostic.type === \"error\" ? chalk.red : diagnostic.type === \"warning\" ? chalk.yellow : chalk.dim;\n\t\tconst prefix = diagnostic.type === \"error\" ? \"Error: \" : diagnostic.type === \"warning\" ? \"Warning: \" : \"\";\n\t\tconsole.error(color(`${prefix}${diagnostic.message}`));\n\t}\n}\n\nfunction isTruthyEnvFlag(value: string | undefined): boolean {\n\tif (!value) return false;\n\treturn value === \"1\" || value.toLowerCase() === \"true\" || value.toLowerCase() === \"yes\";\n}\n\nfunction resolveAppMode(parsed: Args, stdinIsTTY: boolean, stdoutIsTTY: boolean): AppMode {\n\tif (parsed.mode === \"rpc\") {\n\t\treturn \"rpc\";\n\t}\n\tif (parsed.mode === \"json\") {\n\t\treturn \"json\";\n\t}\n\t// PI_STARTUP_BENCHMARK=1 times interactive first paint even when stdin/stdout\n\t// are not TTYs (repo npx, CI, redirected logs).\n\tif (isTruthyEnvFlag(process.env.PI_STARTUP_BENCHMARK) && !parsed.print) {\n\t\treturn \"interactive\";\n\t}\n\tif (parsed.print || !stdinIsTTY || !stdoutIsTTY) {\n\t\treturn \"print\";\n\t}\n\treturn \"interactive\";\n}\n\nfunction toPrintOutputMode(appMode: AppMode): Exclude<Mode, \"rpc\"> {\n\treturn appMode === \"json\" ? \"json\" : \"text\";\n}\n\nfunction isPlainRuntimeMetadataCommand(parsed: Args): boolean {\n\treturn !parsed.print && parsed.mode === undefined && (parsed.help === true || parsed.listModels !== undefined);\n}\n\nasync function prepareInitialMessage(\n\tparsed: Args,\n\tautoResizeImages: boolean,\n\tstdinContent?: string,\n): Promise<{\n\tinitialMessage?: string;\n\tinitialImages?: ImageContent[];\n}> {\n\tif (parsed.fileArgs.length === 0) {\n\t\treturn buildInitialMessage({ parsed, stdinContent });\n\t}\n\n\tconst { text, images } = await processFileArguments(parsed.fileArgs, { autoResizeImages });\n\treturn buildInitialMessage({\n\t\tparsed,\n\t\tfileText: text,\n\t\tfileImages: images,\n\t\tstdinContent,\n\t});\n}\n\n/** Result from resolving a session argument */\ntype ResolvedSession =\n\t| { type: \"path\"; path: string } // Direct file path\n\t| { type: \"local\"; path: string } // Found in current project\n\t| { type: \"global\"; path: string; cwd: string } // Found in different project\n\t| { type: \"not_found\"; arg: string }; // Not found anywhere\n\n/**\n * Resolve a session argument to a file path.\n * If it looks like a path, use as-is. Otherwise try to match as session ID prefix.\n */\nasync function findLocalSessionByExactId(\n\tsessionId: string,\n\tcwd: string,\n\tsessionDir?: string,\n): Promise<{ type: \"local\"; path: string } | undefined> {\n\tconst localSessions = await SessionManager.list(cwd, sessionDir);\n\tconst localMatch = localSessions.find((s) => s.id === sessionId);\n\treturn localMatch ? { type: \"local\", path: localMatch.path } : undefined;\n}\n\nasync function resolveSessionPath(sessionArg: string, cwd: string, sessionDir?: string): Promise<ResolvedSession> {\n\t// If it looks like a file path, resolve it before handing it to the session manager.\n\tif (sessionArg.includes(\"/\") || sessionArg.includes(\"\\\\\") || sessionArg.endsWith(\".jsonl\")) {\n\t\treturn { type: \"path\", path: resolvePath(sessionArg, cwd) };\n\t}\n\n\t// Try to match as session ID in current project first\n\tconst localSessions = await SessionManager.list(cwd, sessionDir);\n\tconst localMatch =\n\t\tlocalSessions.find((s) => s.id === sessionArg) ?? localSessions.find((s) => s.id.startsWith(sessionArg));\n\n\tif (localMatch) {\n\t\treturn { type: \"local\", path: localMatch.path };\n\t}\n\n\t// Try global search across all projects\n\tconst allSessions = await SessionManager.listAll(sessionDir);\n\tconst globalMatch =\n\t\tallSessions.find((s) => s.id === sessionArg) ?? allSessions.find((s) => s.id.startsWith(sessionArg));\n\n\tif (globalMatch) {\n\t\treturn { type: \"global\", path: globalMatch.path, cwd: globalMatch.cwd };\n\t}\n\n\t// Not found anywhere\n\treturn { type: \"not_found\", arg: sessionArg };\n}\n\n/** Prompt user for yes/no confirmation */\nasync function promptConfirm(message: string, startupView?: InteractiveView): Promise<boolean> {\n\tif (startupView) {\n\t\treturn startupView.confirm(\"Confirm\", message);\n\t}\n\treturn new Promise((resolve) => {\n\t\tconst rl = createInterface({\n\t\t\tinput: process.stdin,\n\t\t\toutput: process.stdout,\n\t\t});\n\t\trl.question(`${message} [y/N] `, (answer) => {\n\t\t\trl.close();\n\t\t\tresolve(answer.toLowerCase() === \"y\" || answer.toLowerCase() === \"yes\");\n\t\t});\n\t});\n}\n\nfunction validateForkFlags(parsed: Args): void {\n\tif (!parsed.fork) return;\n\n\tconst conflictingFlags = [\n\t\tparsed.session ? \"--session\" : undefined,\n\t\tparsed.continue ? \"--continue\" : undefined,\n\t\tparsed.resume ? \"--resume\" : undefined,\n\t\tparsed.noSession ? \"--no-session\" : undefined,\n\t].filter((flag): flag is string => flag !== undefined);\n\n\tif (conflictingFlags.length > 0) {\n\t\tconsole.error(chalk.red(`Error: --fork cannot be combined with ${conflictingFlags.join(\", \")}`));\n\t\tprocess.exit(1);\n\t}\n}\n\nfunction validateSessionIdFlags(parsed: Args): void {\n\tif (parsed.sessionId === undefined) return;\n\n\tconst conflictingFlags = [\n\t\tparsed.session ? \"--session\" : undefined,\n\t\tparsed.continue ? \"--continue\" : undefined,\n\t\tparsed.resume ? \"--resume\" : undefined,\n\t].filter((flag): flag is string => flag !== undefined);\n\n\tif (conflictingFlags.length > 0) {\n\t\tconsole.error(chalk.red(`Error: --session-id cannot be combined with ${conflictingFlags.join(\", \")}`));\n\t\tprocess.exit(1);\n\t}\n\n\ttry {\n\t\tassertValidSessionId(parsed.sessionId);\n\t} catch (error: unknown) {\n\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\tconsole.error(chalk.red(`Error: ${message}`));\n\t\tprocess.exit(1);\n\t}\n}\n\nfunction openSessionOrExit(path: string, sessionDir?: string): SessionManager {\n\ttry {\n\t\treturn SessionManager.open(path, sessionDir);\n\t} catch (error: unknown) {\n\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\tconsole.error(chalk.red(`Error: ${message}`));\n\t\tprocess.exit(1);\n\t}\n}\n\nfunction forkSessionOrExit(sourcePath: string, cwd: string, sessionDir?: string, sessionId?: string): SessionManager {\n\ttry {\n\t\treturn SessionManager.forkFrom(sourcePath, cwd, sessionDir, { id: sessionId });\n\t} catch (error: unknown) {\n\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\tconsole.error(chalk.red(`Error: ${message}`));\n\t\tprocess.exit(1);\n\t}\n}\n\nasync function createSessionManager(\n\tparsed: Args,\n\tcwd: string,\n\tsessionDir: string | undefined,\n\tsettingsManager: SettingsManager,\n\tstartupView?: InteractiveView,\n\tdeferSelection?: () => SessionManager,\n): Promise<SessionManager> {\n\tif (parsed.noSession || parsed.help || parsed.listModels !== undefined) {\n\t\treturn SessionManager.inMemory(cwd, parsed.sessionId !== undefined ? { id: parsed.sessionId } : undefined);\n\t}\n\n\tif (parsed.fork) {\n\t\tif (parsed.sessionId) {\n\t\t\tconst existingTarget = await findLocalSessionByExactId(parsed.sessionId, cwd, sessionDir);\n\t\t\tif (existingTarget) {\n\t\t\t\tconsole.error(chalk.red(`Session already exists with id '${parsed.sessionId}'`));\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\t\t}\n\n\t\tconst resolved = await resolveSessionPath(parsed.fork, cwd, sessionDir);\n\n\t\tswitch (resolved.type) {\n\t\t\tcase \"path\":\n\t\t\tcase \"local\":\n\t\t\tcase \"global\":\n\t\t\t\treturn forkSessionOrExit(resolved.path, cwd, sessionDir, parsed.sessionId);\n\n\t\t\tcase \"not_found\":\n\t\t\t\tif (deferSelection) return deferSelection();\n\t\t\t\tconsole.error(chalk.red(`No session found matching '${resolved.arg}'`));\n\t\t\t\tprocess.exit(1);\n\t\t}\n\t}\n\n\tif (parsed.session) {\n\t\tconst resolved = await resolveSessionPath(parsed.session, cwd, sessionDir);\n\n\t\tswitch (resolved.type) {\n\t\t\tcase \"path\":\n\t\t\tcase \"local\":\n\t\t\t\treturn openSessionOrExit(resolved.path, sessionDir);\n\n\t\t\tcase \"global\": {\n\t\t\t\tconsole.log(chalk.yellow(`Session found in different project: ${resolved.cwd}`));\n\t\t\t\tconst shouldFork = await promptConfirm(\"Fork this session into current directory?\", startupView);\n\t\t\t\tif (!shouldFork) {\n\t\t\t\t\tconsole.log(chalk.dim(\"Aborted.\"));\n\t\t\t\t\tprocess.exit(0);\n\t\t\t\t}\n\t\t\t\treturn forkSessionOrExit(resolved.path, cwd, sessionDir);\n\t\t\t}\n\n\t\t\tcase \"not_found\":\n\t\t\t\tif (deferSelection) return deferSelection();\n\t\t\t\tconsole.error(chalk.red(`No session found matching '${resolved.arg}'`));\n\t\t\t\tprocess.exit(1);\n\t\t}\n\t}\n\n\tif (parsed.resume) {\n\t\tif (deferSelection) return deferSelection();\n\t\ttry {\n\t\t\tconst currentSessionsLoader = (onProgress?: Parameters<typeof SessionManager.list>[2]) =>\n\t\t\t\tSessionManager.list(cwd, sessionDir, onProgress);\n\t\t\tconst allSessionsLoader = (onProgress?: Parameters<typeof SessionManager.listAll>[1]) =>\n\t\t\t\tSessionManager.listAll(sessionDir, onProgress);\n\t\t\tconst selectedPath = startupView\n\t\t\t\t? await startupView.selectSession(currentSessionsLoader, allSessionsLoader)\n\t\t\t\t: await selectSession(currentSessionsLoader, allSessionsLoader, settingsManager);\n\t\t\tif (!selectedPath) {\n\t\t\t\tconsole.log(chalk.dim(\"No session selected\"));\n\t\t\t\tprocess.exit(0);\n\t\t\t}\n\t\t\treturn SessionManager.open(selectedPath, sessionDir);\n\t\t} finally {\n\t\t\tstopThemeWatcher();\n\t\t}\n\t}\n\n\tif (parsed.continue) {\n\t\treturn SessionManager.continueRecent(cwd, sessionDir);\n\t}\n\n\tif (parsed.sessionId) {\n\t\tconst existingSession = await findLocalSessionByExactId(parsed.sessionId, cwd, sessionDir);\n\t\tif (existingSession) {\n\t\t\treturn SessionManager.open(existingSession.path, sessionDir);\n\t\t}\n\t\tconsole.error(\n\t\t\tchalk.yellow(\n\t\t\t\t`Warning: No project session found with id '${parsed.sessionId}'; creating a new session with that id.`,\n\t\t\t),\n\t\t);\n\t}\n\n\treturn SessionManager.create(cwd, sessionDir, { id: parsed.sessionId });\n}\n\nfunction buildSessionOptions(\n\tparsed: Args,\n\tscopedModels: ScopedModel[],\n\thasExistingSession: boolean,\n\tmodelRuntime: ModelRuntime,\n\tsettingsManager: SettingsManager,\n): {\n\toptions: CreateAgentSessionOptions;\n\tcliThinkingFromModel: boolean;\n\tdiagnostics: AgentSessionRuntimeDiagnostic[];\n} {\n\tconst options: CreateAgentSessionOptions = {};\n\tconst diagnostics: AgentSessionRuntimeDiagnostic[] = [];\n\tlet cliThinkingFromModel = false;\n\n\t// Model from CLI\n\t// - supports --provider <name> --model <pattern>\n\t// - supports --model <provider>/<pattern>\n\tif (parsed.model) {\n\t\tconst resolved = resolveCliModel({\n\t\t\tcliProvider: parsed.provider,\n\t\t\tcliModel: parsed.model,\n\t\t\tcliThinking: parsed.thinking,\n\t\t\tmodelRuntime,\n\t\t});\n\t\tif (resolved.warning) {\n\t\t\tdiagnostics.push({ type: \"warning\", message: resolved.warning });\n\t\t}\n\t\tif (resolved.error) {\n\t\t\tdiagnostics.push({ type: \"error\", message: resolved.error });\n\t\t}\n\t\tif (resolved.model) {\n\t\t\toptions.model = resolved.model;\n\t\t\t// Allow \"--model <pattern>:<thinking>\" as a shorthand.\n\t\t\t// Explicit --thinking still takes precedence (applied later).\n\t\t\tif (!parsed.thinking && resolved.thinkingLevel) {\n\t\t\t\toptions.thinkingLevel = resolved.thinkingLevel;\n\t\t\t\tcliThinkingFromModel = true;\n\t\t\t}\n\t\t}\n\t}\n\n\tif (!options.model && scopedModels.length > 0 && !hasExistingSession) {\n\t\t// Check if saved default is in scoped models - use it if so, otherwise first scoped model\n\t\tconst savedProvider = settingsManager.getDefaultProvider();\n\t\tconst savedModelId = settingsManager.getDefaultModel();\n\t\tconst savedModel = savedProvider && savedModelId ? modelRuntime.getModel(savedProvider, savedModelId) : undefined;\n\t\tconst savedInScope = savedModel ? scopedModels.find((sm) => modelsAreEqual(sm.model, savedModel)) : undefined;\n\n\t\tif (savedInScope) {\n\t\t\toptions.model = savedInScope.model;\n\t\t\t// Use thinking level from scoped model config if explicitly set\n\t\t\tif (!parsed.thinking && savedInScope.thinkingLevel) {\n\t\t\t\toptions.thinkingLevel = savedInScope.thinkingLevel;\n\t\t\t}\n\t\t} else {\n\t\t\toptions.model = scopedModels[0].model;\n\t\t\t// Use thinking level from first scoped model if explicitly set\n\t\t\tif (!parsed.thinking && scopedModels[0].thinkingLevel) {\n\t\t\t\toptions.thinkingLevel = scopedModels[0].thinkingLevel;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Thinking level from CLI (takes precedence over scoped model thinking levels set above)\n\tif (parsed.thinking) {\n\t\toptions.thinkingLevel = parsed.thinking;\n\t}\n\n\t// Scoped models for Ctrl+P cycling\n\t// Keep thinking level undefined when not explicitly set in the model pattern.\n\t// Undefined means \"inherit current session thinking level\" during cycling.\n\tif (scopedModels.length > 0) {\n\t\toptions.scopedModels = scopedModels.map((sm) => ({\n\t\t\tmodel: sm.model,\n\t\t\tthinkingLevel: sm.thinkingLevel,\n\t\t}));\n\t}\n\n\t// API key from CLI - set as a non-persistent runtime override\n\t// (handled by caller before createAgentSession)\n\n\t// Tools\n\tif (parsed.noTools) {\n\t\toptions.noTools = \"all\";\n\t} else if (parsed.noBuiltinTools) {\n\t\toptions.noTools = \"builtin\";\n\t}\n\tif (parsed.tools) {\n\t\toptions.tools = [...parsed.tools];\n\t}\n\tif (parsed.excludeTools) {\n\t\toptions.excludeTools = [...parsed.excludeTools];\n\t}\n\n\treturn { options, cliThinkingFromModel, diagnostics };\n}\n\nfunction resolveCliPaths(cwd: string, paths: string[] | undefined): string[] | undefined {\n\treturn paths?.map((value) => (isLocalPath(value) ? resolvePath(value, cwd) : value));\n}\n\nfunction createStartupViewTrustContext(cwd: string, startupView: InteractiveView): ProjectTrustContext {\n\treturn {\n\t\tcwd,\n\t\tmode: \"tui\",\n\t\thasUI: true,\n\t\tui: {\n\t\t\tselect: (title, options) =>\n\t\t\t\tstartupView.select(\n\t\t\t\t\ttitle,\n\t\t\t\t\toptions.map((option) => ({ label: option, value: option })),\n\t\t\t\t),\n\t\t\tconfirm: (title, message) => startupView.confirm(title, message),\n\t\t\tinput: (title, placeholder) => startupView.input(title, placeholder),\n\t\t\tnotify: () => {},\n\t\t},\n\t};\n}\n\nasync function promptForMissingSessionCwd(\n\tissue: SessionCwdIssue,\n\tsettingsManager: SettingsManager,\n\tstartupView?: InteractiveView,\n): Promise<string | undefined> {\n\tconst options = [\n\t\t{ label: \"Continue\", value: issue.fallbackCwd },\n\t\t{ label: \"Cancel\", value: undefined },\n\t];\n\treturn startupView\n\t\t? startupView.select(formatMissingSessionCwdPrompt(issue), options)\n\t\t: showStartupSelector(settingsManager, formatMissingSessionCwdPrompt(issue), options);\n}\n\nexport interface MainOptions {\n\textensionFactories?: InlineExtension[];\n\tstartupView?: InteractiveView;\n}\n\nexport async function main(args: string[], options?: MainOptions) {\n\tresetTimings();\n\tconst offlineMode = args.includes(\"--offline\") || isTruthyEnvFlag(process.env.PI_OFFLINE);\n\tif (offlineMode) {\n\t\tprocess.env.PI_OFFLINE = \"1\";\n\t}\n\n\tconst cwd = process.cwd();\n\tconst agentDir = getAgentDir();\n\tconst bootstrapSettingsManager = SettingsManager.create(cwd, agentDir, { projectTrusted: false });\n\tapplyHttpProxySettings(bootstrapSettingsManager.getGlobalSettings().httpProxy);\n\tconfigureHttpDispatcher();\n\n\tif ([\"setup\", \"features\", \"uninstall\", \"browser\"].includes(args[0])) {\n\t\tconst { handleInstallCli } = await import(\"./cli/install-cli.ts\");\n\t\tif (await handleInstallCli(args)) return;\n\t}\n\n\tif (args[0] === \"update\") {\n\t\tconst { handleUpdateCli } = await import(\"./cli/update-cli.ts\");\n\t\tif (await handleUpdateCli(args)) return;\n\t}\n\n\tif ([\"install\", \"remove\", \"uninstall\", \"list\", \"config\"].includes(args[0])) {\n\t\tconst { handleConfigCommand, handlePackageCommand } = await import(\"./package-manager-cli.ts\");\n\t\tif (await handlePackageCommand(args, { extensionFactories: options?.extensionFactories })) {\n\t\t\tprocess.exit(process.exitCode ?? 0);\n\t\t\treturn;\n\t\t}\n\t\tif (await handleConfigCommand(args, { extensionFactories: options?.extensionFactories })) return;\n\t}\n\n\tif (args[0] === \"gateway\") {\n\t\tconst { handleGatewayCommand } = await import(\"./gateway/command.ts\");\n\t\tif (await handleGatewayCommand(args)) return;\n\t}\n\n\tconst parsed = parseArgs(args);\n\tif (parsed.diagnostics.length > 0) {\n\t\tfor (const d of parsed.diagnostics) {\n\t\t\tconst color = d.type === \"error\" ? chalk.red : chalk.yellow;\n\t\t\tconsole.error(color(`${d.type === \"error\" ? \"Error\" : \"Warning\"}: ${d.message}`));\n\t\t}\n\t\tif (parsed.diagnostics.some((d) => d.type === \"error\")) {\n\t\t\tprocess.exit(1);\n\t\t}\n\t}\n\ttime(\"parseArgs\");\n\n\tif (parsed.version) {\n\t\tconsole.log(VERSION);\n\t\tprocess.exit(0);\n\t}\n\n\tif (parsed.export) {\n\t\tlet result: string;\n\t\ttry {\n\t\t\tconst { exportFromFile } = await import(\"./core/export-html/index.ts\");\n\t\t\tconst outputPath = parsed.messages.length > 0 ? parsed.messages[0] : undefined;\n\t\t\tresult = await exportFromFile(parsed.export, outputPath);\n\t\t} catch (error: unknown) {\n\t\t\tconst message = error instanceof Error ? error.message : \"Failed to export session\";\n\t\t\tconsole.error(chalk.red(`Error: ${message}`));\n\t\t\tprocess.exit(1);\n\t\t}\n\t\tconsole.log(`Exported to: ${result}`);\n\t\tprocess.exit(0);\n\t}\n\n\tlet appMode = resolveAppMode(parsed, process.stdin.isTTY, process.stdout.isTTY);\n\tconst interactiveModeImport =\n\t\tappMode === \"interactive\" ? import(\"./modes/interactive/interactive-mode.ts\") : undefined;\n\tconst startupView = appMode === \"interactive\" ? options?.startupView : undefined;\n\tif (options?.startupView && !startupView) options.startupView.stop();\n\t// Parent-delegated children inherit read-only or auto before any tool call.\n\tapplyInheritedSubagentPermissions();\n\tconst shouldTakeOverStdout = appMode !== \"interactive\" && !isPlainRuntimeMetadataCommand(parsed);\n\tif (shouldTakeOverStdout) {\n\t\ttakeOverStdout();\n\t}\n\n\tif (parsed.mode === \"rpc\" && parsed.fileArgs.length > 0) {\n\t\tconsole.error(chalk.red(\"Error: @file arguments are not supported in RPC mode\"));\n\t\tprocess.exit(1);\n\t}\n\n\tvalidateForkFlags(parsed);\n\tvalidateSessionIdFlags(parsed);\n\n\t// Run migrations (pass cwd for project-local migrations)\n\tconst { migratedAuthProviders: migratedProviders, deprecationWarnings } = runMigrations(cwd);\n\ttime(\"runMigrations\");\n\n\tconst startupSettingsManager = SettingsManager.create(cwd, agentDir, { projectTrusted: false });\n\treportDiagnostics(collectSettingsDiagnostics(startupSettingsManager, \"startup session lookup\"));\n\n\t// Register the model-tier bridge before extensions load so pi-subagents can read\n\t// tier settings when building its tool description. Re-pointed to the runtime\n\t// settings manager below once services exist.\n\tregisterModelTierBridge(startupSettingsManager);\n\t// lunr: same for the simple-pi-memory character cap — extensions read it via the\n\t// bridge at load/runtime; re-pointed to the runtime settings manager below.\n\tregisterMemoryCapBridge(startupSettingsManager);\n\t// lunr: TUI customize settings (spinner, dividers, rail, prompt symbol) read by\n\t// ashxj-spinners and ashxj-tui via the bridge; re-pointed to runtime below.\n\tregisterCustomizeBridge(startupSettingsManager);\n\n\t// Experimental first-time setup: theme choice and analytics opt-in.\n\t// Runs before any runtime services are created so the chosen settings apply everywhere.\n\tif (appMode === \"interactive\" && !parsed.help && parsed.listModels === undefined && shouldRunFirstTimeSetup()) {\n\t\tstartupView?.pause();\n\t\tawait showFirstTimeSetup(startupSettingsManager);\n\t\tstartupView?.resume();\n\t\ttime(\"firstTimeSetup\");\n\t}\n\n\t// Decide the final runtime cwd before creating cwd-bound runtime services.\n\t// --session and --resume may select a session from another project, so project-local\n\t// settings, resources, provider registrations, and models must be resolved only after\n\t// the target session cwd is known. Initial lookup uses global settings or saved\n\t// approval; newly approved settings are applied after the runtime trust decision.\n\tconst trustStore = new ProjectTrustStore(agentDir);\n\tconst envSessionDir = process.env[ENV_SESSION_DIR];\n\tconst explicitSessionDir =\n\t\t(parsed.sessionDir ? normalizePath(parsed.sessionDir) : undefined) ??\n\t\t(envSessionDir ? expandTildePath(envSessionDir) : undefined);\n\t// Saved approval and explicit trust allow custom session lookup before runtime hydration.\n\tconst lookupTrusted =\n\t\tparsed.projectTrustOverride ??\n\t\ttrustStore.get(cwd) ??\n\t\tstartupSettingsManager.getDefaultProjectTrust() === \"always\";\n\tconst lookupSettings = lookupTrusted\n\t\t? SettingsManager.create(cwd, agentDir, { projectTrusted: true })\n\t\t: startupSettingsManager;\n\tlet sessionDir = explicitSessionDir ?? lookupSettings.getSessionDir();\n\tlet startupSelectionDeferred = false;\n\t// A missing ID or the picker may need storage that the pending trust decision enables.\n\tconst deferSelection =\n\t\t!lookupTrusted && !explicitSessionDir && hasTrustRequiringProjectResources(cwd)\n\t\t\t? () => {\n\t\t\t\t\tstartupSelectionDeferred = true;\n\t\t\t\t\treturn SessionManager.create(cwd, sessionDir);\n\t\t\t\t}\n\t\t\t: undefined;\n\tlet sessionManager = await createSessionManager(\n\t\tparsed,\n\t\tcwd,\n\t\tsessionDir,\n\t\tstartupSettingsManager,\n\t\tstartupView,\n\t\tdeferSelection,\n\t);\n\tconst resolveStartupSessionCwd = async (manager: SessionManager): Promise<SessionManager> => {\n\t\tconst missingSessionCwdIssue = getMissingSessionCwdIssue(manager, cwd);\n\t\tif (!missingSessionCwdIssue) return manager;\n\t\tif (appMode === \"interactive\") {\n\t\t\tconst selectedCwd = await promptForMissingSessionCwd(\n\t\t\t\tmissingSessionCwdIssue,\n\t\t\t\tstartupSettingsManager,\n\t\t\t\tstartupView,\n\t\t\t);\n\t\t\tif (!selectedCwd) {\n\t\t\t\tprocess.exit(0);\n\t\t\t}\n\t\t\tmanager.dispose();\n\t\t\treturn SessionManager.open(missingSessionCwdIssue.sessionFile!, sessionDir, selectedCwd);\n\t\t} else {\n\t\t\tconsole.error(chalk.red(new MissingSessionCwdError(missingSessionCwdIssue).message));\n\t\t\tprocess.exit(1);\n\t\t}\n\t};\n\tsessionManager = await resolveStartupSessionCwd(sessionManager);\n\ttime(\"createSessionManager\");\n\n\tconst runSessionRetention = async () => {\n\t\ttry {\n\t\t\tconst activeSessionFile = runtime.session.sessionManager.getSessionFile();\n\t\t\tconst deleted: string[] = [];\n\t\t\tfor (const { directory, days } of getSessionRetentionTargets(\n\t\t\t\tstartupSettingsManager,\n\t\t\t\truntime.services.settingsManager,\n\t\t\t\texplicitSessionDir,\n\t\t\t)) {\n\t\t\t\tconst result = await pruneOldSessions(directory, days, { excludeFile: activeSessionFile });\n\t\t\t\tdeleted.push(...result.deleted);\n\t\t\t}\n\t\t\tif (deleted.length > 0) {\n\t\t\t\tappendDebugLog(\n\t\t\t\t\t`session-retention: deleted ${deleted.length} file(s):\\n${deleted.map((path) => ` ${path}`).join(\"\\n\")}`,\n\t\t\t\t);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tappendDebugLog(`session-retention: prune failed: ${error instanceof Error ? error.message : String(error)}`);\n\t\t}\n\t};\n\n\tconst sessionCwd = sessionManager.getCwd();\n\tconst autoTrustOnReloadCwd =\n\t\tparsed.projectTrustOverride === undefined && !hasTrustRequiringProjectResources(sessionCwd)\n\t\t\t? sessionCwd\n\t\t\t: undefined;\n\tconst trustPromptMode: AppMode = parsed.help || parsed.listModels !== undefined ? \"print\" : appMode;\n\tconst projectTrustByCwd = new Map<string, boolean>();\n\n\tconst resolvedExtensionPaths = resolveCliPaths(cwd, parsed.extensions);\n\tconst resolvedSkillPaths = resolveCliPaths(cwd, parsed.skills);\n\tconst resolvedPromptTemplatePaths = resolveCliPaths(cwd, parsed.promptTemplates);\n\tconst resolvedThemePaths = resolveCliPaths(cwd, parsed.themes);\n\tconst builtinRoster = appMode === \"interactive\" ? [...lightBuiltinExtensions] : await loadAllBuiltinExtensions();\n\tconst rememberAttachedFactories = (factories: InlineExtension[]) => {\n\t\tconst seen = new Set(\n\t\t\tbuiltinRoster.map((entry) => (typeof entry === \"function\" ? undefined : entry.name)).filter(Boolean),\n\t\t);\n\t\tfor (const factory of factories) {\n\t\t\tconst name = typeof factory === \"function\" ? undefined : factory.name;\n\t\t\tif (name && seen.has(name)) continue;\n\t\t\tif (name) seen.add(name);\n\t\t\tbuiltinRoster.push(factory);\n\t\t}\n\t};\n\tlet startupDirectoryResolved = false;\n\tconst createRuntime: CreateAgentSessionRuntimeFactory = async ({\n\t\tcwd,\n\t\tagentDir,\n\t\tsessionManager,\n\t\tsessionStartEvent,\n\t\tprojectTrustContext,\n\t}) => {\n\t\tconst isInitialRuntime = sessionStartEvent === undefined;\n\t\tconst projectTrustDiagnostics: AgentSessionRuntimeDiagnostic[] = [];\n\t\tconst cachedProjectTrust = projectTrustByCwd.get(cwd);\n\t\tconst hasTrustRequiringResources = hasTrustRequiringProjectResources(cwd);\n\t\tconst shouldResolveProjectTrust =\n\t\t\tparsed.projectTrustOverride === undefined && cachedProjectTrust === undefined && hasTrustRequiringResources;\n\t\tconst projectTrusted = shouldResolveProjectTrust\n\t\t\t? false\n\t\t\t: (cachedProjectTrust ??\n\t\t\t\tparsed.projectTrustOverride ??\n\t\t\t\t(!hasTrustRequiringResources || trustStore.get(cwd) === true));\n\t\tconst runtimeSettingsManager = SettingsManager.create(cwd, agentDir, { projectTrusted });\n\t\tconst skipMissingPackageInstall = isInitialRuntime && appMode === \"interactive\";\n\t\tconst services = await createAgentSessionServices({\n\t\t\tcwd,\n\t\t\tagentDir,\n\t\t\tsettingsManager: runtimeSettingsManager,\n\t\t\textensionFlagValues: parsed.unknownFlags,\n\t\t\tresourceLoaderReloadOptions: shouldResolveProjectTrust\n\t\t\t\t? {\n\t\t\t\t\t\tskipMissingPackageInstall,\n\t\t\t\t\t\tresolveProjectTrust: async ({ extensionsResult }) => {\n\t\t\t\t\t\t\tconst trusted = await resolveProjectTrusted({\n\t\t\t\t\t\t\t\tcwd,\n\t\t\t\t\t\t\t\ttrustStore,\n\t\t\t\t\t\t\t\ttrustOverride: parsed.projectTrustOverride,\n\t\t\t\t\t\t\t\tdefaultProjectTrust: startupSettingsManager.getDefaultProjectTrust(),\n\t\t\t\t\t\t\t\textensionsResult,\n\t\t\t\t\t\t\t\tprojectTrustContext:\n\t\t\t\t\t\t\t\t\tprojectTrustContext ??\n\t\t\t\t\t\t\t\t\t(isInitialRuntime && startupView\n\t\t\t\t\t\t\t\t\t\t? createStartupViewTrustContext(cwd, startupView)\n\t\t\t\t\t\t\t\t\t\t: createProjectTrustContext({\n\t\t\t\t\t\t\t\t\t\t\t\tcwd,\n\t\t\t\t\t\t\t\t\t\t\t\tmode: isInitialRuntime ? trustPromptMode : appMode,\n\t\t\t\t\t\t\t\t\t\t\t\tsettingsManager: startupSettingsManager,\n\t\t\t\t\t\t\t\t\t\t\t\thasUI: isInitialRuntime && trustPromptMode === \"interactive\",\n\t\t\t\t\t\t\t\t\t\t\t})),\n\t\t\t\t\t\t\t\tonExtensionError: (message) => projectTrustDiagnostics.push({ type: \"warning\", message }),\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tprojectTrustByCwd.set(cwd, trusted);\n\t\t\t\t\t\t\treturn trusted;\n\t\t\t\t\t\t},\n\t\t\t\t\t}\n\t\t\t\t: skipMissingPackageInstall\n\t\t\t\t\t? { skipMissingPackageInstall }\n\t\t\t\t\t: undefined,\n\t\t\tresourceLoaderOptions: {\n\t\t\t\tadditionalExtensionPaths: resolvedExtensionPaths,\n\t\t\t\tadditionalSkillPaths: resolvedSkillPaths,\n\t\t\t\tadditionalPromptTemplatePaths: resolvedPromptTemplatePaths,\n\t\t\t\tadditionalThemePaths: resolvedThemePaths,\n\t\t\t\tnoExtensions: parsed.noExtensions,\n\t\t\t\tnoSkills: parsed.noSkills,\n\t\t\t\tnoPromptTemplates: parsed.noPromptTemplates,\n\t\t\t\tnoThemes: parsed.noThemes,\n\t\t\t\tnoContextFiles: parsed.noContextFiles,\n\t\t\t\tsystemPrompt: parsed.systemPrompt,\n\t\t\t\tappendSystemPrompt: parsed.appendSystemPrompt,\n\t\t\t\textensionFactories: [...builtinRoster, ...(options?.extensionFactories ?? [])],\n\t\t\t},\n\t\t});\n\t\tconst { settingsManager, modelRuntime, resourceLoader } = services;\n\t\tif (isInitialRuntime && !parsed.noSession && !parsed.help && parsed.listModels === undefined) {\n\t\t\tconst maySelectAgain = !startupDirectoryResolved;\n\t\t\tstartupDirectoryResolved = true;\n\t\t\tconst approvedSessionDir = explicitSessionDir ?? settingsManager.getSessionDir();\n\t\t\tif (startupSelectionDeferred || approvedSessionDir !== sessionDir) {\n\t\t\t\tconst selectCurrentProject =\n\t\t\t\t\tmaySelectAgain &&\n\t\t\t\t\t(startupSelectionDeferred || (!parsed.session && !parsed.resume && !parsed.fork)) &&\n\t\t\t\t\tcwd === sessionCwd;\n\t\t\t\tconst provisionalManager = sessionManager;\n\t\t\t\tsessionManager = await selectApprovedStartupSession(\n\t\t\t\t\tsessionManager,\n\t\t\t\t\tapprovedSessionDir,\n\t\t\t\t\tselectCurrentProject\n\t\t\t\t\t\t? () => createSessionManager(parsed, cwd, approvedSessionDir, settingsManager, startupView)\n\t\t\t\t\t\t: undefined,\n\t\t\t\t);\n\t\t\t\tsessionDir = approvedSessionDir;\n\t\t\t\tstartupSelectionDeferred = false;\n\t\t\t\tsessionManager = await resolveStartupSessionCwd(sessionManager);\n\t\t\t\tif (sessionManager.getCwd() !== cwd) {\n\t\t\t\t\t// No turn has started. Shut down bootstrap hooks before resolving the selected cwd once.\n\t\t\t\t\tconst extensions = resourceLoader.getExtensions();\n\t\t\t\t\tconst runner = new ExtensionRunner(\n\t\t\t\t\t\textensions.extensions,\n\t\t\t\t\t\textensions.runtime,\n\t\t\t\t\t\tcwd,\n\t\t\t\t\t\tprovisionalManager,\n\t\t\t\t\t\tnew ModelRegistry(modelRuntime),\n\t\t\t\t\t);\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait emitSessionShutdownEvent(runner, { type: \"session_shutdown\", reason: \"resume\" });\n\t\t\t\t\t} finally {\n\t\t\t\t\t\textensions.runtime.invalidate();\n\t\t\t\t\t}\n\t\t\t\t\treturn createRuntime({ cwd: sessionManager.getCwd(), agentDir, sessionManager, projectTrustContext });\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (isInitialRuntime && parsed.name !== undefined) {\n\t\t\tconst name = parsed.name.trim();\n\t\t\tif (!name) {\n\t\t\t\tconsole.error(chalk.red(\"Error: --name requires a non-empty value\"));\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\t\t\tsessionManager.appendSessionInfo(name);\n\t\t}\n\n\t\tif (\n\t\t\tparsed.model &&\n\t\t\t!resolveCliModel({\n\t\t\t\tcliProvider: parsed.provider,\n\t\t\t\tcliModel: parsed.model,\n\t\t\t\tcliThinking: parsed.thinking,\n\t\t\t\tmodelRuntime,\n\t\t\t}).model\n\t\t) {\n\t\t\tawait modelRuntime.refreshIfStale();\n\t\t}\n\t\tconst diagnostics: AgentSessionRuntimeDiagnostic[] = [\n\t\t\t...projectTrustDiagnostics,\n\t\t\t...services.diagnostics,\n\t\t\t...collectSettingsDiagnostics(settingsManager, \"runtime creation\"),\n\t\t\t...resourceLoader.getExtensions().errors.map(({ path, error }) => ({\n\t\t\t\ttype: \"error\" as const,\n\t\t\t\tmessage: `Failed to load extension \"${path}\": ${error}`,\n\t\t\t})),\n\t\t];\n\n\t\tconst modelPatterns = parsed.models ?? settingsManager.getEnabledModels();\n\t\tconst scopedModels =\n\t\t\tmodelPatterns && modelPatterns.length > 0 ? await resolveModelScope(modelPatterns, modelRuntime) : [];\n\t\tconst {\n\t\t\toptions: sessionOptions,\n\t\t\tcliThinkingFromModel,\n\t\t\tdiagnostics: sessionOptionDiagnostics,\n\t\t} = buildSessionOptions(\n\t\t\tparsed,\n\t\t\tscopedModels,\n\t\t\tsessionManager.buildSessionContext().messages.length > 0,\n\t\t\tmodelRuntime,\n\t\t\tsettingsManager,\n\t\t);\n\t\tdiagnostics.push(...sessionOptionDiagnostics);\n\n\t\tif (parsed.apiKey) {\n\t\t\tif (!sessionOptions.model) {\n\t\t\t\tdiagnostics.push({\n\t\t\t\t\ttype: \"error\",\n\t\t\t\t\tmessage: \"--api-key requires a model to be specified via --model, --provider/--model, or --models\",\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\t// Cache-only: do not wait on GitHub / provider /v1/models before first paint.\n\t\t\t\tawait modelRuntime.setRuntimeApiKey(sessionOptions.model.provider, parsed.apiKey, {\n\t\t\t\t\tallowNetwork: false,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tconst created = await createAgentSessionFromServices({\n\t\t\tservices,\n\t\t\tsessionManager,\n\t\t\tsessionStartEvent,\n\t\t\tmodel: sessionOptions.model,\n\t\t\tthinkingLevel: sessionOptions.thinkingLevel,\n\t\t\tscopedModels: sessionOptions.scopedModels,\n\t\t\ttools: sessionOptions.tools,\n\t\t\texcludeTools: sessionOptions.excludeTools,\n\t\t\tnoTools: sessionOptions.noTools,\n\t\t\tcustomTools: sessionOptions.customTools,\n\t\t});\n\t\tconst cliThinkingOverride = parsed.thinking !== undefined || cliThinkingFromModel;\n\t\tif (created.session.model && cliThinkingOverride) {\n\t\t\tcreated.session.setThinkingLevel(created.session.thinkingLevel);\n\t\t}\n\n\t\treturn {\n\t\t\t...created,\n\t\t\tservices,\n\t\t\tdiagnostics,\n\t\t};\n\t};\n\ttime(\"createRuntime\");\n\tconst runtime = await createAgentSessionRuntime(createRuntime, {\n\t\tcwd: sessionManager.getCwd(),\n\t\tagentDir,\n\t\tsessionManager,\n\t\tonRuntimeApplied: bindRuntimeBridges,\n\t});\n\tif (startupView?.isExitRequested) {\n\t\tawait runtime.dispose();\n\t\treturn;\n\t}\n\tsessionManager = runtime.session.sessionManager;\n\tmarkStartupMilestone(\"runtime_hydrated\");\n\ttime(\"createAgentSessionRuntime\");\n\tif (appMode !== \"interactive\") await runSessionRetention();\n\tconst { services, session, modelFallbackMessage } = runtime;\n\tconst { settingsManager, modelRuntime, resourceLoader } = services;\n\tapplyHttpProxySettings(settingsManager.getGlobalSettings().httpProxy);\n\tconfigureHttpDispatcher(settingsManager.getHttpIdleTimeoutMs());\n\n\tif (parsed.help) {\n\t\tconst extensionFlags = resourceLoader\n\t\t\t.getExtensions()\n\t\t\t.extensions.flatMap((extension) => Array.from(extension.flags.values()));\n\t\tprintHelp(extensionFlags);\n\t\tprocess.exit(0);\n\t}\n\n\tif (parsed.listModels !== undefined) {\n\t\tconst searchPattern = typeof parsed.listModels === \"string\" ? parsed.listModels : undefined;\n\t\tawait listModels(modelRuntime, searchPattern);\n\t\tprocess.exit(0);\n\t}\n\n\t// Read piped stdin content (if any) - skip for RPC mode which uses stdin for JSON-RPC.\n\t// Startup benchmark must stay interactive even if a leftover redirected handle has bytes.\n\tlet stdinContent: string | undefined;\n\tconst startupBenchmark = isTruthyEnvFlag(process.env.PI_STARTUP_BENCHMARK);\n\tif (appMode !== \"rpc\" && !startupBenchmark) {\n\t\tstdinContent = await readPipedStdin();\n\t\tif (stdinContent !== undefined && appMode === \"interactive\") {\n\t\t\tappMode = \"print\";\n\t\t}\n\t}\n\ttime(\"readPipedStdin\");\n\n\tconst { initialMessage, initialImages } = await prepareInitialMessage(\n\t\tparsed,\n\t\tsettingsManager.getImageAutoResize(),\n\t\tstdinContent,\n\t);\n\ttime(\"prepareInitialMessage\");\n\tinitTheme(settingsManager.getTheme(), appMode === \"interactive\");\n\ttime(\"initTheme\");\n\n\tif (appMode === \"interactive\" && !startupView && deprecationWarnings.length > 0) {\n\t\tawait showDeprecationWarnings(deprecationWarnings);\n\t}\n\n\ttime(\"resolveModelScope\");\n\tif (!(appMode === \"interactive\" && startupView)) reportDiagnostics(runtime.diagnostics);\n\tif (runtime.diagnostics.some((diagnostic) => diagnostic.type === \"error\")) {\n\t\tconst extensionHint = runtime.diagnostics.some((diagnostic) =>\n\t\t\tdiagnostic.message.includes(\"Failed to load extension\"),\n\t\t)\n\t\t\t? `\\n${EXTENSION_LOAD_FAILURE_HINT}`\n\t\t\t: \"\";\n\t\tif (startupView) {\n\t\t\tprocess.exitCode = 1;\n\t\t\tawait startupView.fail(\n\t\t\t\t`${runtime.diagnostics.map((diagnostic) => diagnostic.message).join(\"\\n\")}${extensionHint}`,\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\t\tif (extensionHint) console.error(chalk.yellow(EXTENSION_LOAD_FAILURE_HINT));\n\t\tprocess.exit(1);\n\t}\n\ttime(\"createAgentSession\");\n\n\tif (appMode !== \"interactive\" && !session.model) {\n\t\tconsole.error(chalk.red(formatNoModelsAvailableMessage()));\n\t\tprocess.exit(1);\n\t}\n\n\tif (startupBenchmark && appMode !== \"interactive\") {\n\t\tconsole.error(chalk.red(\"Error: PI_STARTUP_BENCHMARK only supports interactive mode\"));\n\t\tprocess.exit(1);\n\t}\n\n\tif (appMode === \"rpc\") {\n\t\tconst { runRpcMode } = await import(\"./modes/rpc/rpc-mode.ts\");\n\t\tprintTimings();\n\t\tawait runRpcMode(runtime);\n\t} else if (appMode === \"interactive\") {\n\t\tconst [{ InteractiveMode }, { loadDeferredBuiltinExtensions }] = await Promise.all([\n\t\t\tinteractiveModeImport!,\n\t\t\timport(\"./builtin-extensions/index.ts\"),\n\t\t]);\n\t\tconst interactiveMode = new InteractiveMode(runtime, {\n\t\t\tmigratedProviders,\n\t\t\tmodelFallbackMessage,\n\t\t\tautoTrustOnReloadCwd,\n\t\t\tinitialMessage,\n\t\t\tinitialImages,\n\t\t\tinitialMessages: parsed.messages,\n\t\t\tverbose: parsed.verbose,\n\t\t\tdeprecationWarnings: startupView ? deprecationWarnings : undefined,\n\t\t\tstartupDiagnostics: startupView\n\t\t\t\t? runtime.diagnostics.filter((diagnostic) => diagnostic.type !== \"error\")\n\t\t\t\t: undefined,\n\t\t\tstartupView: startupView?.binding(),\n\t\t\tdeferredMaintenance: runSessionRetention,\n\t\t\tdeferredBuiltinFactories: parsed.noExtensions ? undefined : loadDeferredBuiltinExtensions,\n\t\t\tonDeferredBuiltinsAttached: rememberAttachedFactories,\n\t\t});\n\t\tif (startupBenchmark) {\n\t\t\tconst { prepareBenchmarkRequest } = await import(\"./startup/benchmark-request.ts\");\n\t\t\tconst request = await prepareBenchmarkRequest(session);\n\t\t\tawait interactiveMode.init();\n\t\t\ttime(\"interactiveMode.init\");\n\t\t\tawait interactiveMode.waitForStartupReady();\n\t\t\ttime(\"promptBarrier\");\n\t\t\tawait request();\n\t\t\t// Consume terminal-query replies before returning control to the shell.\n\t\t\tawait new Promise((resolve) => setTimeout(resolve, 150));\n\t\t\tinteractiveMode.stop();\n\t\t\tawait runtime.dispose();\n\t\t\tstopThemeWatcher();\n\t\t\tprintTimings();\n\t\t\tif (process.stdout.writableLength > 0) {\n\t\t\t\tawait new Promise<void>((resolve) => process.stdout.once(\"drain\", resolve));\n\t\t\t}\n\t\t\tif (process.stderr.writableLength > 0) {\n\t\t\t\tawait new Promise<void>((resolve) => process.stderr.once(\"drain\", resolve));\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tawait interactiveMode.init();\n\t\ttime(\"interactiveMode.init\");\n\t\tprintTimings();\n\t\tawait interactiveMode.run();\n\t} else {\n\t\tconst { runPrintMode } = await import(\"./modes/print-mode.ts\");\n\t\tprintTimings();\n\t\tconst exitCode = await runPrintMode(runtime, {\n\t\t\tmode: toPrintOutputMode(appMode),\n\t\t\tmessages: parsed.messages,\n\t\t\tinitialMessage,\n\t\t\tinitialImages,\n\t\t});\n\t\tstopThemeWatcher();\n\t\trestoreStdout();\n\t\tif (exitCode !== 0) {\n\t\t\tprocess.exitCode = exitCode;\n\t\t}\n\t\treturn;\n\t}\n}\n"]}