@ashx-j/lunr 0.2.26 → 0.2.28

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 (697) hide show
  1. package/CHANGELOG.md +25 -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/accounting.d.ts.map +1 -1
  19. package/dist/builtin-extensions/narumiruna-pi-goal/src/accounting.js +5 -2
  20. package/dist/builtin-extensions/narumiruna-pi-goal/src/accounting.js.map +1 -1
  21. package/dist/builtin-extensions/narumiruna-pi-goal/src/commands.d.ts.map +1 -1
  22. package/dist/builtin-extensions/narumiruna-pi-goal/src/commands.js +2 -2
  23. package/dist/builtin-extensions/narumiruna-pi-goal/src/commands.js.map +1 -1
  24. package/dist/builtin-extensions/narumiruna-pi-goal/src/goal.d.ts.map +1 -1
  25. package/dist/builtin-extensions/narumiruna-pi-goal/src/goal.js +1 -1
  26. package/dist/builtin-extensions/narumiruna-pi-goal/src/goal.js.map +1 -1
  27. package/dist/builtin-extensions/narumiruna-pi-goal/src/runtime.d.ts.map +1 -1
  28. package/dist/builtin-extensions/narumiruna-pi-goal/src/runtime.js +1 -1
  29. package/dist/builtin-extensions/narumiruna-pi-goal/src/runtime.js.map +1 -1
  30. package/dist/builtin-extensions/pi-intercom/index.d.ts.map +1 -1
  31. package/dist/builtin-extensions/pi-intercom/index.js +2 -2
  32. package/dist/builtin-extensions/pi-intercom/index.js.map +1 -1
  33. package/dist/builtin-extensions/pi-lsp-extension/bemol-extension/index.d.ts +1 -1
  34. package/dist/builtin-extensions/pi-lsp-extension/bemol-extension/index.d.ts.map +1 -1
  35. package/dist/builtin-extensions/pi-lsp-extension/bemol-extension/index.js +1 -1
  36. package/dist/builtin-extensions/pi-lsp-extension/bemol-extension/index.js.map +1 -1
  37. package/dist/builtin-extensions/pi-lsp-extension/src/index.d.ts.map +1 -1
  38. package/dist/builtin-extensions/pi-lsp-extension/src/index.js +1 -15
  39. package/dist/builtin-extensions/pi-lsp-extension/src/index.js.map +1 -1
  40. package/dist/builtin-extensions/pi-lsp-extension/src/lsp-client.d.ts +6 -0
  41. package/dist/builtin-extensions/pi-lsp-extension/src/lsp-client.d.ts.map +1 -1
  42. package/dist/builtin-extensions/pi-lsp-extension/src/lsp-client.js +187 -132
  43. package/dist/builtin-extensions/pi-lsp-extension/src/lsp-client.js.map +1 -1
  44. package/dist/builtin-extensions/pi-lsp-extension/src/lsp-manager.d.ts +8 -0
  45. package/dist/builtin-extensions/pi-lsp-extension/src/lsp-manager.d.ts.map +1 -1
  46. package/dist/builtin-extensions/pi-lsp-extension/src/lsp-manager.js +142 -112
  47. package/dist/builtin-extensions/pi-lsp-extension/src/lsp-manager.js.map +1 -1
  48. package/dist/builtin-extensions/pi-lsp-extension/src/tools/code-rewrite.d.ts +12 -1
  49. package/dist/builtin-extensions/pi-lsp-extension/src/tools/code-rewrite.d.ts.map +1 -1
  50. package/dist/builtin-extensions/pi-lsp-extension/src/tools/code-rewrite.js +14 -7
  51. package/dist/builtin-extensions/pi-lsp-extension/src/tools/code-rewrite.js.map +1 -1
  52. package/dist/builtin-extensions/pi-lsp-extension/src/tree-sitter/rewrite-engine.d.ts +11 -3
  53. package/dist/builtin-extensions/pi-lsp-extension/src/tree-sitter/rewrite-engine.d.ts.map +1 -1
  54. package/dist/builtin-extensions/pi-lsp-extension/src/tree-sitter/rewrite-engine.js +67 -41
  55. package/dist/builtin-extensions/pi-lsp-extension/src/tree-sitter/rewrite-engine.js.map +1 -1
  56. package/dist/builtin-extensions/pi-lsp-extension/src/tree-sitter/search-engine.d.ts +4 -2
  57. package/dist/builtin-extensions/pi-lsp-extension/src/tree-sitter/search-engine.d.ts.map +1 -1
  58. package/dist/builtin-extensions/pi-lsp-extension/src/tree-sitter/search-engine.js +3 -0
  59. package/dist/builtin-extensions/pi-lsp-extension/src/tree-sitter/search-engine.js.map +1 -1
  60. package/dist/builtin-extensions/pi-mcp-adapter/commands.d.ts +2 -1
  61. package/dist/builtin-extensions/pi-mcp-adapter/commands.d.ts.map +1 -1
  62. package/dist/builtin-extensions/pi-mcp-adapter/commands.js +6 -6
  63. package/dist/builtin-extensions/pi-mcp-adapter/commands.js.map +1 -1
  64. package/dist/builtin-extensions/pi-mcp-adapter/config.d.ts +1 -1
  65. package/dist/builtin-extensions/pi-mcp-adapter/config.d.ts.map +1 -1
  66. package/dist/builtin-extensions/pi-mcp-adapter/config.js +11 -5
  67. package/dist/builtin-extensions/pi-mcp-adapter/config.js.map +1 -1
  68. package/dist/builtin-extensions/pi-mcp-adapter/direct-tool-executor.d.ts.map +1 -1
  69. package/dist/builtin-extensions/pi-mcp-adapter/direct-tool-executor.js +2 -2
  70. package/dist/builtin-extensions/pi-mcp-adapter/direct-tool-executor.js.map +1 -1
  71. package/dist/builtin-extensions/pi-mcp-adapter/host-html-template.d.ts.map +1 -1
  72. package/dist/builtin-extensions/pi-mcp-adapter/host-html-template.js +1 -1
  73. package/dist/builtin-extensions/pi-mcp-adapter/host-html-template.js.map +1 -1
  74. package/dist/builtin-extensions/pi-mcp-adapter/index.d.ts.map +1 -1
  75. package/dist/builtin-extensions/pi-mcp-adapter/index.js +48 -40
  76. package/dist/builtin-extensions/pi-mcp-adapter/index.js.map +1 -1
  77. package/dist/builtin-extensions/pi-mcp-adapter/init.d.ts.map +1 -1
  78. package/dist/builtin-extensions/pi-mcp-adapter/init.js +3 -1
  79. package/dist/builtin-extensions/pi-mcp-adapter/init.js.map +1 -1
  80. package/dist/builtin-extensions/pi-mcp-adapter/mcp-auth-flow.d.ts +12 -40
  81. package/dist/builtin-extensions/pi-mcp-adapter/mcp-auth-flow.d.ts.map +1 -1
  82. package/dist/builtin-extensions/pi-mcp-adapter/mcp-auth-flow.js +166 -235
  83. package/dist/builtin-extensions/pi-mcp-adapter/mcp-auth-flow.js.map +1 -1
  84. package/dist/builtin-extensions/pi-mcp-adapter/mcp-callback-server.d.ts +5 -0
  85. package/dist/builtin-extensions/pi-mcp-adapter/mcp-callback-server.d.ts.map +1 -1
  86. package/dist/builtin-extensions/pi-mcp-adapter/mcp-callback-server.js +43 -13
  87. package/dist/builtin-extensions/pi-mcp-adapter/mcp-callback-server.js.map +1 -1
  88. package/dist/builtin-extensions/pi-mcp-adapter/mcp-oauth-provider.d.ts +14 -3
  89. package/dist/builtin-extensions/pi-mcp-adapter/mcp-oauth-provider.d.ts.map +1 -1
  90. package/dist/builtin-extensions/pi-mcp-adapter/mcp-oauth-provider.js +73 -21
  91. package/dist/builtin-extensions/pi-mcp-adapter/mcp-oauth-provider.js.map +1 -1
  92. package/dist/builtin-extensions/pi-mcp-adapter/proxy-modes.d.ts.map +1 -1
  93. package/dist/builtin-extensions/pi-mcp-adapter/proxy-modes.js +4 -4
  94. package/dist/builtin-extensions/pi-mcp-adapter/proxy-modes.js.map +1 -1
  95. package/dist/builtin-extensions/pi-mcp-adapter/server-manager.d.ts.map +1 -1
  96. package/dist/builtin-extensions/pi-mcp-adapter/server-manager.js +2 -2
  97. package/dist/builtin-extensions/pi-mcp-adapter/server-manager.js.map +1 -1
  98. package/dist/builtin-extensions/pi-mcp-adapter/state.d.ts +2 -0
  99. package/dist/builtin-extensions/pi-mcp-adapter/state.d.ts.map +1 -1
  100. package/dist/builtin-extensions/pi-mcp-adapter/state.js.map +1 -1
  101. package/dist/builtin-extensions/pi-ollama-cloud/index.d.ts +1 -1
  102. package/dist/builtin-extensions/pi-ollama-cloud/index.d.ts.map +1 -1
  103. package/dist/builtin-extensions/pi-ollama-cloud/index.js +1 -1
  104. package/dist/builtin-extensions/pi-ollama-cloud/index.js.map +1 -1
  105. package/dist/builtin-extensions/pi-ollama-cloud/models.d.ts +11 -5
  106. package/dist/builtin-extensions/pi-ollama-cloud/models.d.ts.map +1 -1
  107. package/dist/builtin-extensions/pi-ollama-cloud/models.js +12 -32
  108. package/dist/builtin-extensions/pi-ollama-cloud/models.js.map +1 -1
  109. package/dist/builtin-extensions/pi-prompt-template-model/index.d.ts.map +1 -1
  110. package/dist/builtin-extensions/pi-prompt-template-model/index.js +5 -3
  111. package/dist/builtin-extensions/pi-prompt-template-model/index.js.map +1 -1
  112. package/dist/builtin-extensions/pi-prompt-template-model/prompt-loader.d.ts +2 -1
  113. package/dist/builtin-extensions/pi-prompt-template-model/prompt-loader.d.ts.map +1 -1
  114. package/dist/builtin-extensions/pi-prompt-template-model/prompt-loader.js +21 -12
  115. package/dist/builtin-extensions/pi-prompt-template-model/prompt-loader.js.map +1 -1
  116. package/dist/builtin-extensions/pi-prompt-template-model/tool-manager.d.ts.map +1 -1
  117. package/dist/builtin-extensions/pi-prompt-template-model/tool-manager.js +7 -24
  118. package/dist/builtin-extensions/pi-prompt-template-model/tool-manager.js.map +1 -1
  119. package/dist/builtin-extensions/pi-subagents/src/extension/index.d.ts.map +1 -1
  120. package/dist/builtin-extensions/pi-subagents/src/extension/index.js +39 -77
  121. package/dist/builtin-extensions/pi-subagents/src/extension/index.js.map +1 -1
  122. package/dist/builtin-extensions/pi-subagents/src/runs/background/chain-root-attachment.d.ts +4 -1
  123. package/dist/builtin-extensions/pi-subagents/src/runs/background/chain-root-attachment.d.ts.map +1 -1
  124. package/dist/builtin-extensions/pi-subagents/src/runs/background/chain-root-attachment.js +2 -0
  125. package/dist/builtin-extensions/pi-subagents/src/runs/background/chain-root-attachment.js.map +1 -1
  126. package/dist/builtin-extensions/pi-subagents/src/runs/background/notify.d.ts +6 -1
  127. package/dist/builtin-extensions/pi-subagents/src/runs/background/notify.d.ts.map +1 -1
  128. package/dist/builtin-extensions/pi-subagents/src/runs/background/notify.js +17 -31
  129. package/dist/builtin-extensions/pi-subagents/src/runs/background/notify.js.map +1 -1
  130. package/dist/builtin-extensions/pi-subagents/src/runs/background/result-watcher.d.ts.map +1 -1
  131. package/dist/builtin-extensions/pi-subagents/src/runs/background/result-watcher.js +7 -2
  132. package/dist/builtin-extensions/pi-subagents/src/runs/background/result-watcher.js.map +1 -1
  133. package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-runner.d.ts +5 -1
  134. package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-runner.d.ts.map +1 -1
  135. package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-runner.js +78 -42
  136. package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-runner.js.map +1 -1
  137. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/chain-execution.d.ts.map +1 -1
  138. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/chain-execution.js +8 -1
  139. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/chain-execution.js.map +1 -1
  140. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/execution.d.ts +0 -3
  141. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/execution.d.ts.map +1 -1
  142. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/execution.js +134 -28
  143. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/execution.js.map +1 -1
  144. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/subagent-executor.d.ts.map +1 -1
  145. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/subagent-executor.js +26 -5
  146. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/subagent-executor.js.map +1 -1
  147. package/dist/builtin-extensions/pi-subagents/src/runs/shared/model-fallback.d.ts +1 -1
  148. package/dist/builtin-extensions/pi-subagents/src/runs/shared/model-fallback.d.ts.map +1 -1
  149. package/dist/builtin-extensions/pi-subagents/src/runs/shared/model-fallback.js +1 -1
  150. package/dist/builtin-extensions/pi-subagents/src/runs/shared/model-fallback.js.map +1 -1
  151. package/dist/builtin-extensions/pi-subagents/src/runs/shared/parallel-utils.d.ts +7 -8
  152. package/dist/builtin-extensions/pi-subagents/src/runs/shared/parallel-utils.d.ts.map +1 -1
  153. package/dist/builtin-extensions/pi-subagents/src/runs/shared/parallel-utils.js +60 -32
  154. package/dist/builtin-extensions/pi-subagents/src/runs/shared/parallel-utils.js.map +1 -1
  155. package/dist/builtin-extensions/pi-subagents/src/shared/session-tokens.d.ts +7 -1
  156. package/dist/builtin-extensions/pi-subagents/src/shared/session-tokens.d.ts.map +1 -1
  157. package/dist/builtin-extensions/pi-subagents/src/shared/session-tokens.js +70 -38
  158. package/dist/builtin-extensions/pi-subagents/src/shared/session-tokens.js.map +1 -1
  159. package/dist/builtin-extensions/pi-subagents/src/shared/types.d.ts +9 -0
  160. package/dist/builtin-extensions/pi-subagents/src/shared/types.d.ts.map +1 -1
  161. package/dist/builtin-extensions/pi-subagents/src/shared/types.js.map +1 -1
  162. package/dist/builtin-extensions/pi-subagents/src/shared/utils.d.ts +1 -1
  163. package/dist/builtin-extensions/pi-subagents/src/shared/utils.d.ts.map +1 -1
  164. package/dist/builtin-extensions/pi-subagents/src/shared/utils.js +15 -5
  165. package/dist/builtin-extensions/pi-subagents/src/shared/utils.js.map +1 -1
  166. package/dist/builtin-extensions/pi-subagents/src/slash/prompt-workflows.d.ts.map +1 -1
  167. package/dist/builtin-extensions/pi-subagents/src/slash/prompt-workflows.js +4 -3
  168. package/dist/builtin-extensions/pi-subagents/src/slash/prompt-workflows.js.map +1 -1
  169. package/dist/builtin-extensions/pi-subagents/src/slash/slash-commands.d.ts.map +1 -1
  170. package/dist/builtin-extensions/pi-subagents/src/slash/slash-commands.js +13 -62
  171. package/dist/builtin-extensions/pi-subagents/src/slash/slash-commands.js.map +1 -1
  172. package/dist/builtin-extensions/pi-subagents/src/tui/render.d.ts +1 -1
  173. package/dist/builtin-extensions/pi-subagents/src/tui/render.d.ts.map +1 -1
  174. package/dist/builtin-extensions/pi-subagents/src/tui/render.js +18 -9
  175. package/dist/builtin-extensions/pi-subagents/src/tui/render.js.map +1 -1
  176. package/dist/builtin-extensions/pi-subagents/src/watchdog/review.d.ts.map +1 -1
  177. package/dist/builtin-extensions/pi-subagents/src/watchdog/review.js +3 -3
  178. package/dist/builtin-extensions/pi-subagents/src/watchdog/review.js.map +1 -1
  179. package/dist/builtin-extensions/pi-tps.d.ts.map +1 -1
  180. package/dist/builtin-extensions/pi-tps.js +28 -17
  181. package/dist/builtin-extensions/pi-tps.js.map +1 -1
  182. package/dist/builtin-extensions/pi-web-access/activity.d.ts +1 -0
  183. package/dist/builtin-extensions/pi-web-access/activity.d.ts.map +1 -1
  184. package/dist/builtin-extensions/pi-web-access/activity.js +27 -5
  185. package/dist/builtin-extensions/pi-web-access/activity.js.map +1 -1
  186. package/dist/builtin-extensions/pi-web-access/bounded-body.d.ts +3 -0
  187. package/dist/builtin-extensions/pi-web-access/bounded-body.d.ts.map +1 -0
  188. package/dist/builtin-extensions/pi-web-access/bounded-body.js +43 -0
  189. package/dist/builtin-extensions/pi-web-access/bounded-body.js.map +1 -0
  190. package/dist/builtin-extensions/pi-web-access/content-page.d.ts +24 -0
  191. package/dist/builtin-extensions/pi-web-access/content-page.d.ts.map +1 -0
  192. package/dist/builtin-extensions/pi-web-access/content-page.js +57 -0
  193. package/dist/builtin-extensions/pi-web-access/content-page.js.map +1 -0
  194. package/dist/builtin-extensions/pi-web-access/extract.d.ts.map +1 -1
  195. package/dist/builtin-extensions/pi-web-access/extract.js +7 -2
  196. package/dist/builtin-extensions/pi-web-access/extract.js.map +1 -1
  197. package/dist/builtin-extensions/pi-web-access/github-extract.d.ts +0 -1
  198. package/dist/builtin-extensions/pi-web-access/github-extract.d.ts.map +1 -1
  199. package/dist/builtin-extensions/pi-web-access/github-extract.js +147 -36
  200. package/dist/builtin-extensions/pi-web-access/github-extract.js.map +1 -1
  201. package/dist/builtin-extensions/pi-web-access/index.d.ts.map +1 -1
  202. package/dist/builtin-extensions/pi-web-access/index.js +48 -73
  203. package/dist/builtin-extensions/pi-web-access/index.js.map +1 -1
  204. package/dist/builtin-extensions/pi-web-access/session-cleanup.d.ts +12 -4
  205. package/dist/builtin-extensions/pi-web-access/session-cleanup.d.ts.map +1 -1
  206. package/dist/builtin-extensions/pi-web-access/session-cleanup.js +35 -12
  207. package/dist/builtin-extensions/pi-web-access/session-cleanup.js.map +1 -1
  208. package/dist/builtin-extensions/pi-web-access/storage.d.ts +9 -6
  209. package/dist/builtin-extensions/pi-web-access/storage.d.ts.map +1 -1
  210. package/dist/builtin-extensions/pi-web-access/storage.js +36 -24
  211. package/dist/builtin-extensions/pi-web-access/storage.js.map +1 -1
  212. package/dist/builtin-extensions/simple-pi-memory.d.ts +1 -1
  213. package/dist/builtin-extensions/simple-pi-memory.d.ts.map +1 -1
  214. package/dist/builtin-extensions/simple-pi-memory.js +1 -1
  215. package/dist/builtin-extensions/simple-pi-memory.js.map +1 -1
  216. package/dist/catalog/models.json +1 -1
  217. package/dist/catalog/providers/google-vertex.json +1 -1
  218. package/dist/catalog/providers/google.json +1 -1
  219. package/dist/catalog/publication.json +3 -3
  220. package/dist/cli/install-cli.d.ts.map +1 -1
  221. package/dist/cli/install-cli.js +38 -30
  222. package/dist/cli/install-cli.js.map +1 -1
  223. package/dist/core/agent-session-runtime.d.ts +13 -0
  224. package/dist/core/agent-session-runtime.d.ts.map +1 -1
  225. package/dist/core/agent-session-runtime.js +75 -11
  226. package/dist/core/agent-session-runtime.js.map +1 -1
  227. package/dist/core/agent-session-services.d.ts +1 -0
  228. package/dist/core/agent-session-services.d.ts.map +1 -1
  229. package/dist/core/agent-session-services.js +1 -0
  230. package/dist/core/agent-session-services.js.map +1 -1
  231. package/dist/core/agent-session.d.ts +46 -21
  232. package/dist/core/agent-session.d.ts.map +1 -1
  233. package/dist/core/agent-session.js +344 -126
  234. package/dist/core/agent-session.js.map +1 -1
  235. package/dist/core/browser/runtime.d.ts +2 -0
  236. package/dist/core/browser/runtime.d.ts.map +1 -1
  237. package/dist/core/browser/runtime.js +80 -45
  238. package/dist/core/browser/runtime.js.map +1 -1
  239. package/dist/core/browser/setup.d.ts.map +1 -1
  240. package/dist/core/browser/setup.js +12 -1
  241. package/dist/core/browser/setup.js.map +1 -1
  242. package/dist/core/cache-stats.d.ts +1 -1
  243. package/dist/core/cache-stats.d.ts.map +1 -1
  244. package/dist/core/cache-stats.js +1 -1
  245. package/dist/core/cache-stats.js.map +1 -1
  246. package/dist/core/compaction/branch-summarization.d.ts +2 -1
  247. package/dist/core/compaction/branch-summarization.d.ts.map +1 -1
  248. package/dist/core/compaction/branch-summarization.js +1 -0
  249. package/dist/core/compaction/branch-summarization.js.map +1 -1
  250. package/dist/core/compaction/compaction.d.ts +5 -11
  251. package/dist/core/compaction/compaction.d.ts.map +1 -1
  252. package/dist/core/compaction/compaction.js +38 -92
  253. package/dist/core/compaction/compaction.js.map +1 -1
  254. package/dist/core/computer-use/adapter.d.ts.map +1 -1
  255. package/dist/core/computer-use/adapter.js +7 -2
  256. package/dist/core/computer-use/adapter.js.map +1 -1
  257. package/dist/core/computer-use/image.d.ts.map +1 -1
  258. package/dist/core/computer-use/image.js +17 -5
  259. package/dist/core/computer-use/image.js.map +1 -1
  260. package/dist/core/computer-use/schemas.d.ts.map +1 -1
  261. package/dist/core/computer-use/schemas.js +23 -6
  262. package/dist/core/computer-use/schemas.js.map +1 -1
  263. package/dist/core/computer-use/workflow.d.ts.map +1 -1
  264. package/dist/core/computer-use/workflow.js +459 -119
  265. package/dist/core/computer-use/workflow.js.map +1 -1
  266. package/dist/core/context-breakdown.d.ts +2 -2
  267. package/dist/core/context-breakdown.d.ts.map +1 -1
  268. package/dist/core/context-breakdown.js +22 -20
  269. package/dist/core/context-breakdown.js.map +1 -1
  270. package/dist/core/cron/jobs.d.ts +26 -8
  271. package/dist/core/cron/jobs.d.ts.map +1 -1
  272. package/dist/core/cron/jobs.js +357 -232
  273. package/dist/core/cron/jobs.js.map +1 -1
  274. package/dist/core/cron/origin-context.d.ts +1 -0
  275. package/dist/core/cron/origin-context.d.ts.map +1 -1
  276. package/dist/core/cron/origin-context.js.map +1 -1
  277. package/dist/core/cron/scheduler.d.ts +22 -17
  278. package/dist/core/cron/scheduler.d.ts.map +1 -1
  279. package/dist/core/cron/scheduler.js +153 -73
  280. package/dist/core/cron/scheduler.js.map +1 -1
  281. package/dist/core/extensions/index.d.ts +1 -1
  282. package/dist/core/extensions/index.d.ts.map +1 -1
  283. package/dist/core/extensions/index.js.map +1 -1
  284. package/dist/core/extensions/runner.d.ts +1 -0
  285. package/dist/core/extensions/runner.d.ts.map +1 -1
  286. package/dist/core/extensions/runner.js +8 -0
  287. package/dist/core/extensions/runner.js.map +1 -1
  288. package/dist/core/extensions/types.d.ts +11 -1
  289. package/dist/core/extensions/types.d.ts.map +1 -1
  290. package/dist/core/extensions/types.js.map +1 -1
  291. package/dist/core/footer-data-provider.d.ts +4 -0
  292. package/dist/core/footer-data-provider.d.ts.map +1 -1
  293. package/dist/core/footer-data-provider.js +22 -1
  294. package/dist/core/footer-data-provider.js.map +1 -1
  295. package/dist/core/large-subagent-launch.d.ts +1 -1
  296. package/dist/core/large-subagent-launch.d.ts.map +1 -1
  297. package/dist/core/large-subagent-launch.js +7 -7
  298. package/dist/core/large-subagent-launch.js.map +1 -1
  299. package/dist/core/model-registry.d.ts +2 -0
  300. package/dist/core/model-registry.d.ts.map +1 -1
  301. package/dist/core/model-registry.js +5 -0
  302. package/dist/core/model-registry.js.map +1 -1
  303. package/dist/core/model-runtime.d.ts +4 -1
  304. package/dist/core/model-runtime.d.ts.map +1 -1
  305. package/dist/core/model-runtime.js +40 -4
  306. package/dist/core/model-runtime.js.map +1 -1
  307. package/dist/core/package-manager.d.ts.map +1 -1
  308. package/dist/core/package-manager.js.map +1 -1
  309. package/dist/core/permissions.d.ts +3 -3
  310. package/dist/core/permissions.d.ts.map +1 -1
  311. package/dist/core/permissions.js +11 -35
  312. package/dist/core/permissions.js.map +1 -1
  313. package/dist/core/plan-mode.d.ts +5 -13
  314. package/dist/core/plan-mode.d.ts.map +1 -1
  315. package/dist/core/plan-mode.js +126 -116
  316. package/dist/core/plan-mode.js.map +1 -1
  317. package/dist/core/project-trust.d.ts.map +1 -1
  318. package/dist/core/project-trust.js +1 -1
  319. package/dist/core/project-trust.js.map +1 -1
  320. package/dist/core/prompt-resource-bridge.d.ts +12 -0
  321. package/dist/core/prompt-resource-bridge.d.ts.map +1 -0
  322. package/dist/core/prompt-resource-bridge.js +9 -0
  323. package/dist/core/prompt-resource-bridge.js.map +1 -0
  324. package/dist/core/protected-targets.d.ts +6 -0
  325. package/dist/core/protected-targets.d.ts.map +1 -0
  326. package/dist/core/protected-targets.js +45 -0
  327. package/dist/core/protected-targets.js.map +1 -0
  328. package/dist/core/resource-loader.d.ts.map +1 -1
  329. package/dist/core/resource-loader.js +7 -0
  330. package/dist/core/resource-loader.js.map +1 -1
  331. package/dist/core/rollback.d.ts +19 -3
  332. package/dist/core/rollback.d.ts.map +1 -1
  333. package/dist/core/rollback.js +172 -56
  334. package/dist/core/rollback.js.map +1 -1
  335. package/dist/core/runtime-credentials.d.ts +3 -0
  336. package/dist/core/runtime-credentials.d.ts.map +1 -1
  337. package/dist/core/runtime-credentials.js +14 -1
  338. package/dist/core/runtime-credentials.js.map +1 -1
  339. package/dist/core/sdk.d.ts +3 -0
  340. package/dist/core/sdk.d.ts.map +1 -1
  341. package/dist/core/sdk.js +1 -0
  342. package/dist/core/sdk.js.map +1 -1
  343. package/dist/core/session-manager.d.ts +11 -1
  344. package/dist/core/session-manager.d.ts.map +1 -1
  345. package/dist/core/session-manager.js +111 -33
  346. package/dist/core/session-manager.js.map +1 -1
  347. package/dist/core/session-ownership.d.ts.map +1 -1
  348. package/dist/core/session-ownership.js +8 -3
  349. package/dist/core/session-ownership.js.map +1 -1
  350. package/dist/core/session-retention.d.ts.map +1 -1
  351. package/dist/core/session-retention.js +18 -7
  352. package/dist/core/session-retention.js.map +1 -1
  353. package/dist/core/session-startup-settings.d.ts +10 -0
  354. package/dist/core/session-startup-settings.d.ts.map +1 -0
  355. package/dist/core/session-startup-settings.js +70 -0
  356. package/dist/core/session-startup-settings.js.map +1 -0
  357. package/dist/core/subscriptions.d.ts +16 -7
  358. package/dist/core/subscriptions.d.ts.map +1 -1
  359. package/dist/core/subscriptions.js +96 -55
  360. package/dist/core/subscriptions.js.map +1 -1
  361. package/dist/core/trust-manager.d.ts +2 -1
  362. package/dist/core/trust-manager.d.ts.map +1 -1
  363. package/dist/core/trust-manager.js +6 -1
  364. package/dist/core/trust-manager.js.map +1 -1
  365. package/dist/core/update-check.d.ts.map +1 -1
  366. package/dist/core/update-check.js.map +1 -1
  367. package/dist/core/usage-accounting.d.ts +47 -0
  368. package/dist/core/usage-accounting.d.ts.map +1 -0
  369. package/dist/core/usage-accounting.js +205 -0
  370. package/dist/core/usage-accounting.js.map +1 -0
  371. package/dist/core/usage-adapters/kimi-coding.d.ts +2 -2
  372. package/dist/core/usage-adapters/kimi-coding.d.ts.map +1 -1
  373. package/dist/core/usage-adapters/kimi-coding.js +2 -2
  374. package/dist/core/usage-adapters/kimi-coding.js.map +1 -1
  375. package/dist/core/usage-adapters/openai-codex.d.ts +3 -2
  376. package/dist/core/usage-adapters/openai-codex.d.ts.map +1 -1
  377. package/dist/core/usage-adapters/openai-codex.js +3 -3
  378. package/dist/core/usage-adapters/openai-codex.js.map +1 -1
  379. package/dist/core/usage-adapters/xai.d.ts +2 -2
  380. package/dist/core/usage-adapters/xai.d.ts.map +1 -1
  381. package/dist/core/usage-adapters/xai.js +3 -3
  382. package/dist/core/usage-adapters/xai.js.map +1 -1
  383. package/dist/core/usage-adapters/zai.d.ts +2 -2
  384. package/dist/core/usage-adapters/zai.d.ts.map +1 -1
  385. package/dist/core/usage-adapters/zai.js +2 -2
  386. package/dist/core/usage-adapters/zai.js.map +1 -1
  387. package/dist/core/usage-history.d.ts +1 -18
  388. package/dist/core/usage-history.d.ts.map +1 -1
  389. package/dist/core/usage-history.js +46 -114
  390. package/dist/core/usage-history.js.map +1 -1
  391. package/dist/core/usage-service.d.ts +9 -2
  392. package/dist/core/usage-service.d.ts.map +1 -1
  393. package/dist/core/usage-service.js +95 -50
  394. package/dist/core/usage-service.js.map +1 -1
  395. package/dist/gateway/agent-bridge.d.ts +9 -1
  396. package/dist/gateway/agent-bridge.d.ts.map +1 -1
  397. package/dist/gateway/agent-bridge.js +91 -37
  398. package/dist/gateway/agent-bridge.js.map +1 -1
  399. package/dist/gateway/buttons.d.ts +8 -1
  400. package/dist/gateway/buttons.d.ts.map +1 -1
  401. package/dist/gateway/buttons.js +76 -18
  402. package/dist/gateway/buttons.js.map +1 -1
  403. package/dist/gateway/commands.d.ts +1 -0
  404. package/dist/gateway/commands.d.ts.map +1 -1
  405. package/dist/gateway/commands.js +10 -4
  406. package/dist/gateway/commands.js.map +1 -1
  407. package/dist/gateway/cron.d.ts +12 -11
  408. package/dist/gateway/cron.d.ts.map +1 -1
  409. package/dist/gateway/cron.js +65 -56
  410. package/dist/gateway/cron.js.map +1 -1
  411. package/dist/gateway/index.d.ts.map +1 -1
  412. package/dist/gateway/index.js +2 -1
  413. package/dist/gateway/index.js.map +1 -1
  414. package/dist/gateway/mobile-commands.d.ts +1 -0
  415. package/dist/gateway/mobile-commands.d.ts.map +1 -1
  416. package/dist/gateway/mobile-commands.js +69 -15
  417. package/dist/gateway/mobile-commands.js.map +1 -1
  418. package/dist/gateway/presenter.d.ts +12 -2
  419. package/dist/gateway/presenter.d.ts.map +1 -1
  420. package/dist/gateway/presenter.js +73 -38
  421. package/dist/gateway/presenter.js.map +1 -1
  422. package/dist/gateway/router.d.ts +2 -2
  423. package/dist/gateway/router.d.ts.map +1 -1
  424. package/dist/gateway/router.js +17 -2
  425. package/dist/gateway/router.js.map +1 -1
  426. package/dist/gateway/service.d.ts +2 -0
  427. package/dist/gateway/service.d.ts.map +1 -1
  428. package/dist/gateway/service.js +153 -0
  429. package/dist/gateway/service.js.map +1 -1
  430. package/dist/main.d.ts.map +1 -1
  431. package/dist/main.js +86 -33
  432. package/dist/main.js.map +1 -1
  433. package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  434. package/dist/modes/interactive/components/assistant-message.js +6 -4
  435. package/dist/modes/interactive/components/assistant-message.js.map +1 -1
  436. package/dist/modes/interactive/components/context-view.d.ts.map +1 -1
  437. package/dist/modes/interactive/components/context-view.js +2 -2
  438. package/dist/modes/interactive/components/context-view.js.map +1 -1
  439. package/dist/modes/interactive/components/copyable-text.d.ts.map +1 -1
  440. package/dist/modes/interactive/components/copyable-text.js +3 -2
  441. package/dist/modes/interactive/components/copyable-text.js.map +1 -1
  442. package/dist/modes/interactive/components/extension-editor.d.ts.map +1 -1
  443. package/dist/modes/interactive/components/extension-editor.js +1 -1
  444. package/dist/modes/interactive/components/extension-editor.js.map +1 -1
  445. package/dist/modes/interactive/components/footer.d.ts.map +1 -1
  446. package/dist/modes/interactive/components/footer.js +8 -12
  447. package/dist/modes/interactive/components/footer.js.map +1 -1
  448. package/dist/modes/interactive/components/usage-view.d.ts +5 -0
  449. package/dist/modes/interactive/components/usage-view.d.ts.map +1 -1
  450. package/dist/modes/interactive/components/usage-view.js +21 -6
  451. package/dist/modes/interactive/components/usage-view.js.map +1 -1
  452. package/dist/modes/interactive/interactive-mode.d.ts +3 -7
  453. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  454. package/dist/modes/interactive/interactive-mode.js +151 -131
  455. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  456. package/dist/modes/interactive/smooth-streaming.d.ts.map +1 -1
  457. package/dist/modes/interactive/smooth-streaming.js.map +1 -1
  458. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  459. package/dist/modes/rpc/rpc-mode.js +2 -1
  460. package/dist/modes/rpc/rpc-mode.js.map +1 -1
  461. package/dist/node-runtime/{adapter-VFG7WNPX.js → adapter-247RTYLS.js} +4 -5
  462. package/dist/node-runtime/agent-session-services-RTUGP3XR.js +54 -0
  463. package/dist/node-runtime/{brave-UWDA3I22.js → brave-2AFFAXNN.js} +1 -1
  464. package/dist/node-runtime/{builtin-extensions-I2HIFEMY.js → builtin-extensions-N4EUD6SB.js} +8 -7
  465. package/dist/node-runtime/{chunk-QH6YL7VK.js → chunk-252ZVPPF.js} +3 -3
  466. package/dist/node-runtime/{chunk-PCEW76PM.js → chunk-2OIPYKLZ.js} +6 -6
  467. package/dist/node-runtime/{chunk-XBWPBZBN.js → chunk-2SWW7KMW.js} +1 -1
  468. package/dist/node-runtime/{chunk-UQUCFAJ3.js → chunk-2VIW3IMF.js} +40 -7
  469. package/dist/node-runtime/{chunk-UOEDI7RP.js → chunk-4KNKQGHM.js} +2 -2
  470. package/dist/node-runtime/chunk-4QRUZ64T.js +1203 -0
  471. package/dist/node-runtime/{chunk-FQMM2EZ2.js → chunk-64XTQNLA.js} +29 -7
  472. package/dist/node-runtime/{chunk-SPVDBUOS.js → chunk-6O3IW3IA.js} +2 -2
  473. package/dist/node-runtime/{chunk-5ZQXRPMC.js → chunk-6ZZHGUSA.js} +2 -2
  474. package/dist/node-runtime/{chunk-WIF24I7G.js → chunk-APVM5NEU.js} +149 -144
  475. package/dist/node-runtime/{chunk-LWYIVUGV.js → chunk-B2IBAXNX.js} +48 -31
  476. package/dist/node-runtime/{chunk-M3LZLQW2.js → chunk-BDRGN3L2.js} +1 -0
  477. package/dist/node-runtime/{chunk-LJTIVM7I.js → chunk-BMRXLQWQ.js} +464 -160
  478. package/dist/node-runtime/{chunk-GJ2RDBRL.js → chunk-BYC6RKCN.js} +4 -2
  479. package/dist/node-runtime/{chunk-T4DA4XE7.js → chunk-DFMPRAQQ.js} +162 -82
  480. package/dist/node-runtime/{chunk-SN2KSMPQ.js → chunk-DQSCFU7R.js} +13 -7
  481. package/dist/node-runtime/{chunk-UVWCDQYF.js → chunk-E5DQGNJI.js} +455 -278
  482. package/dist/node-runtime/{chunk-4SBQAI4T.js → chunk-EBLAZVSA.js} +2058 -73
  483. package/dist/node-runtime/{chunk-CSFI6YXL.js → chunk-ES6PBSIE.js} +1 -1
  484. package/dist/node-runtime/{chunk-IF24A3FH.js → chunk-EVM653DD.js} +4 -4
  485. package/dist/node-runtime/{chunk-HTFRRDSF.js → chunk-F2SMQ6ES.js} +3 -2
  486. package/dist/node-runtime/chunk-F2V2F4ZG.js +114 -0
  487. package/dist/node-runtime/{chunk-IKU6Y7DL.js → chunk-FE3WZI7F.js} +9 -6
  488. package/dist/node-runtime/{chunk-6VYZ5UFP.js → chunk-FLGEEH27.js} +1 -1
  489. package/dist/node-runtime/{chunk-5EFIU3OM.js → chunk-FTKEZL27.js} +1 -1
  490. package/dist/node-runtime/{chunk-RGQAEOM5.js → chunk-FYIFPFXE.js} +23 -6
  491. package/dist/node-runtime/{chunk-HMBGROQK.js → chunk-GLDXBBL6.js} +3 -3
  492. package/dist/node-runtime/{chunk-KWA4OC2J.js → chunk-H6YBCWKG.js} +1 -1
  493. package/dist/node-runtime/{chunk-2MI5OPMN.js → chunk-HNNHHJAB.js} +68 -50
  494. package/dist/node-runtime/{chunk-I74LN5JG.js → chunk-HUD2RFJW.js} +2 -2
  495. package/dist/node-runtime/{chunk-XHIRAZ26.js → chunk-IAZSK7KK.js} +1 -1
  496. package/dist/node-runtime/{chunk-GYIXXQAO.js → chunk-ICKGAKWX.js} +23 -59
  497. package/dist/node-runtime/{chunk-X3PGBLQ7.js → chunk-IHHTWSXN.js} +9 -9
  498. package/dist/node-runtime/{chunk-DAPBPCBP.js → chunk-IPP5BIV5.js} +25 -3
  499. package/dist/node-runtime/{chunk-QFWG2RVL.js → chunk-IXG6F4NT.js} +11 -0
  500. package/dist/node-runtime/{chunk-L24TPBS4.js → chunk-JEK35V2M.js} +45 -31
  501. package/dist/node-runtime/{chunk-RDDAZOMU.js → chunk-JL4HYQXK.js} +1 -1
  502. package/dist/node-runtime/{chunk-2HMIRK7W.js → chunk-LHV3V67B.js} +5 -5
  503. package/dist/node-runtime/{chunk-UAEOTO52.js → chunk-MNQXDFPV.js} +6 -2
  504. package/dist/node-runtime/{chunk-MPKSOJBT.js → chunk-NHATCSOI.js} +4 -7
  505. package/dist/node-runtime/{chunk-RMQZU2YU.js → chunk-NNNR3QIY.js} +1 -1
  506. package/dist/node-runtime/{chunk-2KIPT4HJ.js → chunk-PWHTSQC4.js} +83 -21
  507. package/dist/node-runtime/{chunk-RWTKOC3B.js → chunk-QBTJG3UM.js} +1 -1
  508. package/dist/node-runtime/{chunk-RCR3XAQY.js → chunk-QT3F6UEV.js} +233 -169
  509. package/dist/node-runtime/{chunk-GS42T6MX.js → chunk-QW3AAHWN.js} +1 -1
  510. package/dist/node-runtime/{chunk-DVQSHCVP.js → chunk-R4WSB2MQ.js} +5 -5
  511. package/dist/node-runtime/{chunk-B4HP6ZWM.js → chunk-RHCGYWO7.js} +1 -1
  512. package/dist/node-runtime/{chunk-2CFDTH5B.js → chunk-RLGY2QIL.js} +45 -59
  513. package/dist/node-runtime/{chunk-CDVHZOOK.js → chunk-RY3FJ6WI.js} +29 -27
  514. package/dist/node-runtime/{chunk-KKUTQQV7.js → chunk-RYRGL7P4.js} +1 -1
  515. package/dist/node-runtime/{chunk-I54LGHWM.js → chunk-STMX7W5I.js} +3 -3
  516. package/dist/node-runtime/chunk-SWWHZ2RI.js +158 -0
  517. package/dist/node-runtime/{chunk-5Q4A37RB.js → chunk-TCT6PCUR.js} +32 -11
  518. package/dist/node-runtime/{chunk-P7XBVXGT.js → chunk-U3YVZ6UC.js} +18 -14
  519. package/dist/node-runtime/{chunk-D5UCKPBQ.js → chunk-UBWW2PID.js} +1 -1
  520. package/dist/node-runtime/{chunk-E75WFZ33.js → chunk-UNUZICC4.js} +3 -3
  521. package/dist/node-runtime/{chunk-RAK2QA2B.js → chunk-UYRKUKFE.js} +4 -4
  522. package/dist/node-runtime/{chunk-LWJXTA6Z.js → chunk-VSUEAI7O.js} +1377 -45
  523. package/dist/node-runtime/{chunk-NAY6UUQZ.js → chunk-WDIVLMOH.js} +1 -1
  524. package/dist/node-runtime/{chunk-E24EO34J.js → chunk-WPXUR3HE.js} +1 -1
  525. package/dist/node-runtime/{chunk-SLVOAQOY.js → chunk-WXYNALHD.js} +113 -1
  526. package/dist/node-runtime/{chunk-KJ6DWS3K.js → chunk-XEOCUEUJ.js} +121 -60
  527. package/dist/node-runtime/chunk-YD3IZAZ7.js +47 -0
  528. package/dist/node-runtime/chunk-YSB6URMT.js +41 -0
  529. package/dist/node-runtime/{chunk-YWOJIGFY.js → chunk-ZEVFBFNF.js} +95 -142
  530. package/dist/node-runtime/{chunk-5B6VKFEV.js → chunk-ZIQUS5QO.js} +1 -1
  531. package/dist/node-runtime/cli-runtime.js +4 -4
  532. package/dist/node-runtime/{command-FSBU2EVZ.js → command-YRT7I2BW.js} +5 -5
  533. package/dist/node-runtime/{commands-NAAL7KNT.js → commands-2ETOWWRA.js} +16 -16
  534. package/dist/node-runtime/{commands-EMBQQVVT.js → commands-D6A6H4TS.js} +11 -18
  535. package/dist/node-runtime/{config-QDD5PUE2.js → config-CU7M7BTK.js} +1 -1
  536. package/dist/node-runtime/{config-D4QUPAHX.js → config-DS7XLMEM.js} +2 -2
  537. package/dist/node-runtime/{direct-tool-executor-4D7UXYU4.js → direct-tool-executor-2QJXVQD2.js} +6 -11
  538. package/dist/node-runtime/{exa-LL64QZR2.js → exa-6VBZNPGE.js} +1 -1
  539. package/dist/node-runtime/{export-html-VM4J2MNR.js → export-html-DBQRRMAY.js} +4 -4
  540. package/dist/node-runtime/{extension-input-E7BJZ35H.js → extension-input-VBBMX7YV.js} +5 -5
  541. package/dist/node-runtime/{extension-selector-WU42XDTU.js → extension-selector-T5AOG5XB.js} +5 -5
  542. package/dist/node-runtime/{extract-EQJE7FZZ.js → extract-BFX2N35A.js} +3 -3
  543. package/dist/node-runtime/{gateway-DQM333YV.js → gateway-V6K2CDWN.js} +51 -42
  544. package/dist/node-runtime/{gemini-search-35OCRFLN.js → gemini-search-C66QHDT6.js} +2 -2
  545. package/dist/node-runtime/{gemini-url-context-UQY3PHHW.js → gemini-url-context-T7DEK73R.js} +3 -3
  546. package/dist/node-runtime/{github-extract-F64RZOEA.js → github-extract-HOGE3D6F.js} +107 -38
  547. package/dist/node-runtime/{goal-NJEE5CTU.js → goal-J7TYMOBK.js} +14 -8
  548. package/dist/node-runtime/index.js +51 -48
  549. package/dist/node-runtime/{init-P5AUV77I.js → init-JBQJIPYI.js} +3 -6
  550. package/dist/node-runtime/{install-cli-NN4YAU44.js → install-cli-INGHIVBY.js} +30 -25
  551. package/dist/node-runtime/interactive-mode-ASZ7APYP.js +75 -0
  552. package/dist/node-runtime/{interactive-view-NGFAMHPW.js → interactive-view-K33PM4OS.js} +8 -8
  553. package/dist/node-runtime/{lsp-manager-3ASUSO4T.js → lsp-manager-S554V5HR.js} +240 -155
  554. package/dist/node-runtime/{lunr-browser-IR7TL3J7.js → lunr-browser-H4FDOR3C.js} +7 -7
  555. package/dist/node-runtime/{lunr-computer-use-Y23CCDIJ.js → lunr-computer-use-VDP2QNRQ.js} +9 -9
  556. package/dist/node-runtime/{lunr-cron-USHC4LXH.js → lunr-cron-WD3YH4CR.js} +93 -80
  557. package/dist/node-runtime/main.js +43 -41
  558. package/dist/node-runtime/{mobile-commands-O5LCHL32.js → mobile-commands-ICUXFW5V.js} +12 -12
  559. package/dist/node-runtime/{model-runtime-OO5HFLWE.js → model-runtime-MZ2JMDV4.js} +4 -4
  560. package/dist/node-runtime/{openai-search-B3MSNCQA.js → openai-search-K72LJDYN.js} +1 -1
  561. package/dist/node-runtime/{package-manager-cli-Q7BL6KZO.js → package-manager-cli-CYM262SI.js} +20 -20
  562. package/dist/node-runtime/{parallel-AI2MNSCU.js → parallel-X724NCNU.js} +1 -1
  563. package/dist/node-runtime/{perplexity-QVJW3I35.js → perplexity-RDHQHVMK.js} +2 -2
  564. package/dist/node-runtime/{pi-intercom-QM53RLTS.js → pi-intercom-NHHEPBMI.js} +2 -2
  565. package/dist/node-runtime/{pi-mcp-adapter-3PHF4KZ4.js → pi-mcp-adapter-PP3GQJQ2.js} +98 -94
  566. package/dist/node-runtime/{pi-ollama-cloud-2F3Y2QNM.js → pi-ollama-cloud-4MNWIMFN.js} +11 -24
  567. package/dist/node-runtime/{pi-prompt-template-model-QWTCGLJU.js → pi-prompt-template-model-FTGELLS5.js} +32 -36
  568. package/dist/node-runtime/{pi-subagents-7IBSSGEW.js → pi-subagents-QPU3OXE4.js} +114 -167
  569. package/dist/node-runtime/{pi-web-access-WTGMNZ32.js → pi-web-access-Z3LP246C.js} +144 -108
  570. package/dist/node-runtime/{print-mode-XQ76CYMT.js → print-mode-2XHN5SUA.js} +3 -3
  571. package/dist/node-runtime/{process-registry-4FAKZQOL.js → process-registry-Q4QWIU33.js} +3 -3
  572. package/dist/node-runtime/{proxy-modes-5FAPSZEZ.js → proxy-modes-VEGC6QG5.js} +8 -15
  573. package/dist/node-runtime/rpc-entry.js +43 -41
  574. package/dist/node-runtime/{rpc-mode-O3XV4SID.js → rpc-mode-32DHJPEJ.js} +4 -4
  575. package/dist/node-runtime/{runtime-4VA6JKNF.js → runtime-EDUUGAQD.js} +56 -46
  576. package/dist/node-runtime/{runtime-EFPPD2UW.js → runtime-UGXM4NPQ.js} +2 -2
  577. package/dist/node-runtime/{runtime-bridges-7WVCLI76.js → runtime-bridges-DNKMNJCF.js} +7 -7
  578. package/dist/node-runtime/{service-MDQIPQ26.js → service-IHLGFLBT.js} +6 -4
  579. package/dist/node-runtime/{session-handoff-GWARVEWT.js → session-handoff-LYH53ESV.js} +4 -4
  580. package/dist/node-runtime/{session-manager-JB5J6XBN.js → session-manager-ZJ3N5Q74.js} +3 -3
  581. package/dist/node-runtime/{session-selector-GIM4DHQ2.js → session-selector-I73U3EIO.js} +7 -7
  582. package/dist/node-runtime/{settings-manager-DJDM5AHM.js → settings-manager-P2TKGYTR.js} +5 -5
  583. package/dist/node-runtime/{setup-JBKOLJ6F.js → setup-H7CCELIL.js} +15 -1
  584. package/dist/node-runtime/{setup-PFBWRNUI.js → setup-OLQ4GXWS.js} +17 -17
  585. package/dist/node-runtime/{src-IVPNZ2BX.js → src-6RV4PXKJ.js} +64 -36
  586. package/dist/node-runtime/{subagent-executor-LPZ4BHWE.js → subagent-executor-UI6SHG3X.js} +412 -288
  587. package/dist/node-runtime/{tavily-WEZFVFP7.js → tavily-KZBFYQB6.js} +1 -1
  588. package/dist/node-runtime/{theme-UOO5RVFN.js → theme-YLVZKKZD.js} +2 -2
  589. package/dist/node-runtime/{trust-manager-MMISNCYO.js → trust-manager-ZCU76D23.js} +2 -2
  590. package/dist/node-runtime/{update-cli-HNMOTNGX.js → update-cli-F3XXJANQ.js} +6 -6
  591. package/dist/node-runtime/{usage-service-LFB2SWYV.js → usage-service-CPAGBED5.js} +1 -1
  592. package/dist/node-runtime/{video-extract-OOZHR7SU.js → video-extract-UPKYIBW3.js} +3 -3
  593. package/dist/node-runtime/{workflow-OHPBEFO4.js → workflow-ICDI4N3J.js} +208 -78
  594. package/dist/node-runtime/{youtube-extract-FNPAUNHU.js → youtube-extract-77NT7FWH.js} +4 -4
  595. package/dist/utils/clipboard-image.d.ts.map +1 -1
  596. package/dist/utils/clipboard-image.js.map +1 -1
  597. package/dist/utils/exif-orientation.d.ts.map +1 -1
  598. package/dist/utils/exif-orientation.js +25 -10
  599. package/dist/utils/exif-orientation.js.map +1 -1
  600. package/dist/utils/image-resize-core.d.ts.map +1 -1
  601. package/dist/utils/image-resize-core.js +2 -0
  602. package/dist/utils/image-resize-core.js.map +1 -1
  603. package/dist/utils/paths.d.ts +4 -0
  604. package/dist/utils/paths.d.ts.map +1 -1
  605. package/dist/utils/paths.js +33 -2
  606. package/dist/utils/paths.js.map +1 -1
  607. package/dist/utils/sanitize-terminal-text.d.ts +7 -0
  608. package/dist/utils/sanitize-terminal-text.d.ts.map +1 -0
  609. package/dist/utils/sanitize-terminal-text.js +67 -0
  610. package/dist/utils/sanitize-terminal-text.js.map +1 -0
  611. package/docs/browser.md +1 -1
  612. package/docs/custom-provider.md +3 -3
  613. package/docs/extensions.md +8 -4
  614. package/docs/features.md +25 -7
  615. package/docs/keybindings.md +1 -1
  616. package/docs/models.md +5 -5
  617. package/docs/packages.md +1 -1
  618. package/docs/providers.md +2 -2
  619. package/docs/rpc.md +7 -7
  620. package/docs/security.md +10 -5
  621. package/docs/sessions.md +2 -2
  622. package/docs/skills.md +1 -1
  623. package/docs/terminal-setup.md +7 -7
  624. package/docs/themes.md +1 -1
  625. package/docs/usage.md +1 -1
  626. package/examples/extensions/auto-commit-on-exit.ts +1 -1
  627. package/examples/extensions/bash-spawn-hook.ts +1 -1
  628. package/examples/extensions/built-in-tool-renderer.ts +1 -1
  629. package/examples/extensions/claude-rules.ts +1 -1
  630. package/examples/extensions/commands.ts +1 -1
  631. package/examples/extensions/custom-compaction.ts +1 -1
  632. package/examples/extensions/custom-provider-anthropic/index.ts +3 -3
  633. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  634. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  635. package/examples/extensions/custom-provider-gitlab-duo/index.ts +1 -1
  636. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  637. package/examples/extensions/doom-overlay/index.ts +1 -1
  638. package/examples/extensions/git-merge-and-resolve.ts +2 -2
  639. package/examples/extensions/gondolin/index.ts +1 -1
  640. package/examples/extensions/gondolin/package-lock.json +2 -2
  641. package/examples/extensions/gondolin/package.json +1 -1
  642. package/examples/extensions/hidden-thinking-label.ts +1 -1
  643. package/examples/extensions/inline-bash.ts +2 -2
  644. package/examples/extensions/input-transform-streaming.ts +2 -2
  645. package/examples/extensions/input-transform.ts +2 -2
  646. package/examples/extensions/interactive-shell.ts +1 -1
  647. package/examples/extensions/kimi-deferred-tools.ts +1 -1
  648. package/examples/extensions/mac-system-theme.ts +1 -1
  649. package/examples/extensions/minimal-mode.ts +1 -1
  650. package/examples/extensions/modal-editor.ts +1 -1
  651. package/examples/extensions/model-status.ts +1 -1
  652. package/examples/extensions/notify.ts +3 -3
  653. package/examples/extensions/overlay-qa-tests.ts +1 -1
  654. package/examples/extensions/overlay-test.ts +1 -1
  655. package/examples/extensions/pirate.ts +1 -1
  656. package/examples/extensions/preset.ts +3 -3
  657. package/examples/extensions/project-trust.ts +4 -4
  658. package/examples/extensions/prompt-customizer.ts +1 -1
  659. package/examples/extensions/rainbow-editor.ts +1 -1
  660. package/examples/extensions/rpc-demo.ts +1 -1
  661. package/examples/extensions/sandbox/index.ts +7 -7
  662. package/examples/extensions/sandbox/package-lock.json +2 -2
  663. package/examples/extensions/sandbox/package.json +1 -1
  664. package/examples/extensions/shutdown-command.ts +5 -5
  665. package/examples/extensions/ssh.ts +2 -2
  666. package/examples/extensions/subagent/README.md +3 -3
  667. package/examples/extensions/subagent/index.ts +2 -2
  668. package/examples/extensions/titlebar-spinner.ts +1 -1
  669. package/examples/extensions/tool-override.ts +1 -1
  670. package/examples/extensions/tools.ts +1 -1
  671. package/examples/extensions/with-deps/package-lock.json +2 -2
  672. package/examples/extensions/with-deps/package.json +1 -1
  673. package/examples/extensions/working-indicator.ts +1 -1
  674. package/examples/extensions/working-message-test.ts +1 -1
  675. package/examples/sdk/01-minimal.ts +1 -1
  676. package/examples/sdk/03-custom-prompt.ts +1 -1
  677. package/examples/sdk/04-skills.ts +1 -1
  678. package/examples/sdk/06-extensions.ts +2 -2
  679. package/examples/sdk/08-prompt-templates.ts +1 -1
  680. package/install-lock/package-lock.json +24 -24
  681. package/install-lock/package.json +2 -2
  682. package/npm-shrinkwrap.json +60 -24
  683. package/package.json +9 -9
  684. package/dist/modes/interactive/components/exit-card.d.ts +0 -22
  685. package/dist/modes/interactive/components/exit-card.d.ts.map +0 -1
  686. package/dist/modes/interactive/components/exit-card.js +0 -69
  687. package/dist/modes/interactive/components/exit-card.js.map +0 -1
  688. package/dist/node-runtime/agent-session-services-5YXS2PLF.js +0 -51
  689. package/dist/node-runtime/chunk-2IDTZAG5.js +0 -1415
  690. package/dist/node-runtime/chunk-3MISGG4S.js +0 -769
  691. package/dist/node-runtime/chunk-4HXHDDCF.js +0 -16
  692. package/dist/node-runtime/chunk-5B5QN3ZQ.js +0 -356
  693. package/dist/node-runtime/chunk-7IQGBKBJ.js +0 -2033
  694. package/dist/node-runtime/chunk-AUXVGBO4.js +0 -19
  695. package/dist/node-runtime/chunk-PTFBPO3C.js +0 -50
  696. package/dist/node-runtime/interactive-mode-YOHZVMKX.js +0 -74
  697. package/dist/node-runtime/mcp-auth-flow-QVLFVLEO.js +0 -33
@@ -13,19 +13,17 @@
13
13
  * - deliverResult: replaces the `@lunr/cron-delivery` bridge on globalThis
14
14
  * with a platform deliverer. Targets come from job.deliver
15
15
  * (comma-separated): "local" (no-op — the output file is already written),
16
- * "origin" (the chat that created the job, homeChannel fallback), a bare
16
+ * "origin" (the identified, currently authorized requester chat), a bare
17
17
  * platform name (that platform's homeChannel), or
18
18
  * "<platform>:<chatId>[:<threadId>]" (explicit). Content is wrapped as
19
19
  * "Cron: <name>" and split to the adapter's maxMessageLength.
20
20
  *
21
- * The bridge is re-installed after every cron session creation because loading
22
- * the builtin extensions (lunr-cron) re-registers its local-notify bridge per
23
- * session; delivery re-reads the bridge on every call, matching lunr-cron.
21
+ * The compatibility delivery bridge exposes the platform deliverer. The scheduler
22
+ * retains its own callback so another session cannot redirect its output.
24
23
  *
25
- * Fallback models (2026-08-02): settings.json `cronFallbackModels`
26
- * ("provider/modelId" entries) are tried IN ORDER when a fire fails — timeout
27
- * or any error. Each attempt gets a fresh headless session and
28
- * jobTimeoutMs/candidates of the budget; a successful fallback run prefixes
24
+ * Fallback models: settings.json `cronFallbackModels`
25
+ * ("provider/modelId" entries) are tried in order only when session setup fails before prompt dispatch.
26
+ * An admitted failure may have external effects and is never replayed automatically; a successful fallback run prefixes
29
27
  * "[fell back to provider/modelId]" to the output. TUI fires are unaffected
30
28
  * (they use the live session's model).
31
29
  */
@@ -34,10 +32,10 @@ import { setCronDeliverValidator } from "../core/cron/jobs.js";
34
32
  import { startScheduler } from "../core/cron/scheduler.js";
35
33
  import { createPermissionContext, deletePermissionContext } from "../core/permissions.js";
36
34
  import { shutdownBridgeSession } from "./agent-bridge.js";
37
- import { platformConfigFor } from "./config.js";
35
+ import { isAuthorized } from "./authz.js";
36
+ import { loadGatewayConfig, platformConfigFor } from "./config.js";
38
37
  import { splitMessage } from "./text.js";
39
38
  const DELIVERY_BRIDGE_SYMBOL = Symbol.for("@lunr/cron-delivery");
40
- const KNOWN_PLATFORMS = ["telegram", "discord"];
41
39
  /** Default factory: fresh in-memory headless session, mirroring agent-bridge's wiring. */
42
40
  async function defaultCronSessionFactory(job, modelOverride) {
43
41
  const [{ loadAllBuiltinExtensions }, { getAgentDir }, { registerCustomizeBridge }, { registerMemoryCapBridge }, { registerModelTierBridge }, { createAgentSessionFromServices, createAgentSessionServices }, { SessionManager }, { SettingsManager }, { bindRuntimeBridges },] = await Promise.all([
@@ -104,8 +102,7 @@ async function defaultCronSessionFactory(job, modelOverride) {
104
102
  }
105
103
  }
106
104
  /** Final assistant text, print-mode style; throws on error/aborted stop. */
107
- function extractFinalText(session) {
108
- const messages = session.state.messages;
105
+ function extractFinalText(messages) {
109
106
  const last = messages[messages.length - 1];
110
107
  if (last?.role !== "assistant")
111
108
  return "";
@@ -125,18 +122,10 @@ const EXPLICIT_TARGET_RE = /^([a-z0-9_-]+):([^:]+)(?::([^:]+))?$/i;
125
122
  function resolveTarget(target, job, cfg) {
126
123
  if (target === "origin") {
127
124
  const origin = job.origin;
128
- if (origin?.platform && origin.chatId) {
125
+ if (origin?.platform && origin.chatId && origin.userId) {
129
126
  return { platform: origin.platform, chatId: origin.chatId, threadId: origin.threadId };
130
127
  }
131
- // Missing/incomplete origin → fall back to a homeChannel: the origin's
132
- // platform when known, otherwise the first platform that has one.
133
- const platforms = origin?.platform ? [origin.platform] : KNOWN_PLATFORMS;
134
- for (const platform of platforms) {
135
- const home = platformConfigFor(cfg, platform)?.homeChannel;
136
- if (home)
137
- return { platform, chatId: home };
138
- }
139
- return `deliver target "origin": job has no origin and no homeChannel is configured`;
128
+ return 'deliver target "origin": job has no origin requester identity; use /cron rebind from an approved gateway chat';
140
129
  }
141
130
  const explicit = EXPLICIT_TARGET_RE.exec(target);
142
131
  const platform = explicit ? explicit[1].toLowerCase() : target.toLowerCase();
@@ -152,6 +141,18 @@ function resolveTarget(target, job, cfg) {
152
141
  return `no homeChannel configured for ${platform}`;
153
142
  return { platform, chatId: home };
154
143
  }
144
+ /** Rebuild the source from durable identity, never from persisted adapter role grants. */
145
+ function isAuthorizedOrigin(cfg, origin) {
146
+ if (!origin?.userId)
147
+ return false;
148
+ return isAuthorized({
149
+ platform: origin.platform,
150
+ chatId: origin.chatId,
151
+ userId: origin.userId,
152
+ chatType: origin.chatType === "group" ? "group" : origin.chatType === "channel" ? "channel" : "dm",
153
+ threadId: origin.threadId,
154
+ }, cfg);
155
+ }
155
156
  /** True when a resolved chat may receive cron output for this job. */
156
157
  export function isAllowedDeliverChat(cfg, platform, chatId, origin) {
157
158
  const platformCfg = platformConfigFor(cfg, platform);
@@ -161,7 +162,7 @@ export function isAllowedDeliverChat(cfg, platform, chatId, origin) {
161
162
  return true;
162
163
  if (platformCfg.allowedChats?.includes(chatId))
163
164
  return true;
164
- return origin?.platform === platform && origin.chatId === chatId;
165
+ return origin?.platform === platform && origin.chatId === chatId && isAuthorizedOrigin(cfg, origin);
165
166
  }
166
167
  export function createDeliverValidator(cfg) {
167
168
  return (deliver, origin) => {
@@ -199,7 +200,8 @@ export function wrapCronContent(job, content) {
199
200
  * The platform deliverer installed at the `@lunr/cron-delivery` bridge.
200
201
  * Every target is attempted; the first error is returned (null on success).
201
202
  */
202
- export function createPlatformDeliverer(adapters, cfg) {
203
+ export function createPlatformDeliverer(adapters, config) {
204
+ const getConfig = typeof config === "function" ? config : () => config;
203
205
  return async (job, content) => {
204
206
  const targets = job.deliver
205
207
  .split(",")
@@ -209,6 +211,7 @@ export function createPlatformDeliverer(adapters, cfg) {
209
211
  for (const target of targets) {
210
212
  if (target === "local")
211
213
  continue; // output file already written by the scheduler
214
+ const cfg = getConfig();
212
215
  const resolved = resolveTarget(target, job, cfg);
213
216
  if (typeof resolved === "string") {
214
217
  firstError ??= resolved;
@@ -226,6 +229,19 @@ export function createPlatformDeliverer(adapters, cfg) {
226
229
  const wrapped = wrapCronContent(job, content);
227
230
  for (const chunk of splitMessage(wrapped, adapter.maxMessageLength)) {
228
231
  try {
232
+ const live = getConfig();
233
+ const current = resolveTarget(target, job, live);
234
+ if (typeof current === "string")
235
+ throw new Error(current);
236
+ if (current.platform !== resolved.platform ||
237
+ current.chatId !== resolved.chatId ||
238
+ current.threadId !== resolved.threadId)
239
+ throw new Error("cron delivery destination changed");
240
+ if (target === "origin" && !isAuthorizedOrigin(live, job.origin)) {
241
+ throw new Error("cron origin requester access revoked; use /cron rebind");
242
+ }
243
+ if (!isAllowedDeliverChat(live, resolved.platform, resolved.chatId, job.origin))
244
+ throw new Error(`deliver target "${target}" is not an allowed chat for ${resolved.platform}`);
229
245
  const result = await adapter.send(resolved.chatId, chunk, {
230
246
  threadId: resolved.threadId,
231
247
  });
@@ -243,17 +259,6 @@ export function createPlatformDeliverer(adapters, cfg) {
243
259
  return firstError;
244
260
  };
245
261
  }
246
- /** Race one prompt attempt against its share of the job budget. */
247
- function withAttemptTimeout(promise, ms) {
248
- return Promise.race([
249
- promise,
250
- new Promise((_, reject) => {
251
- const timer = setTimeout(() => reject(new Error(`attempt timed out after ${ms}ms`)), ms);
252
- // If the attempt settles first this promise is discarded; the timer must not keep the process alive.
253
- timer.unref?.();
254
- }),
255
- ]);
256
- }
257
262
  /**
258
263
  * Read settings.json `cronFallbackModels` ("provider/modelId" entries).
259
264
  * Fresh read per fire so edits apply without a daemon restart; invalid
@@ -284,47 +289,54 @@ async function readCronFallbackModels() {
284
289
  }
285
290
  /**
286
291
  * Start the cron scheduler inside the gateway daemon. Starts even with zero
287
- * stored jobs — jobs can be created later from chats. stop() halts the loop.
292
+ * stored jobs — jobs can be created later from chats. stop() cancels admitted work, awaits session cleanup and releases the lease last.
288
293
  */
289
294
  export function startGatewayCron(options) {
290
- const { adapters, cfg } = options;
295
+ const { adapters } = options;
296
+ const getConfig = options.getConfig ?? loadGatewayConfig;
291
297
  const sessionFactory = options.sessionFactory ?? defaultCronSessionFactory;
292
- const platformDeliverer = createPlatformDeliverer(adapters, cfg);
293
- // Explicit so runJob can split it into per-attempt budgets that sum to (at
294
- // most) the scheduler's outer race (core/cron/scheduler.ts runSchedulerTick).
295
- const jobTimeoutMs = 5 * 60 * 1000;
298
+ const platformDeliverer = createPlatformDeliverer(adapters, getConfig);
299
+ // One budget covers setup, owned prompt cancellation and session settlement.
300
+ const jobTimeoutMs = options.jobTimeoutMs ?? 5 * 60 * 1000;
296
301
  // Reject deliver targets that are not local, origin, a configured home channel,
297
302
  // or an explicit chat in the platform allowlist / the job's origin.
298
- setCronDeliverValidator(createDeliverValidator(cfg));
299
- // Replace the local-notify bridge lunr-cron registered with the platform deliverer.
303
+ setCronDeliverValidator((deliver, origin) => createDeliverValidator(getConfig())(deliver, origin));
304
+ // Retain the compatibility delivery bridge for integrations.
300
305
  globalThis[DELIVERY_BRIDGE_SYMBOL] = platformDeliverer;
301
- const runJob = async (prompt, job) => {
306
+ const runJob = async (prompt, job, signal) => {
302
307
  const fallbacks = options.fallbackModels ?? (await readCronFallbackModels());
303
308
  const candidates = [undefined, ...fallbacks];
304
- const attemptTimeoutMs = Math.floor(jobTimeoutMs / candidates.length);
305
309
  const errors = [];
306
310
  beginCronFire();
307
311
  try {
308
312
  for (const candidate of candidates) {
313
+ signal.throwIfAborted();
309
314
  const label = candidate ? `${candidate.provider}/${candidate.modelId}` : "default model";
310
315
  let session;
316
+ let dispatched = false;
311
317
  try {
312
318
  session = await sessionFactory(job, candidate);
313
- // Loading the builtin extensions re-registered lunr-cron's local-notify
314
- // bridge; restore the platform deliverer before any delivery re-reads it.
315
- globalThis[DELIVERY_BRIDGE_SYMBOL] = platformDeliverer;
316
- await withAttemptTimeout(session.prompt(prompt, { source: "extension" }), attemptTimeoutMs);
317
- const text = extractFinalText(session);
319
+ signal.throwIfAborted();
320
+ if (!session.promptWithCompletion)
321
+ throw new Error("cron session lacks owned prompt admission");
322
+ dispatched = true;
323
+ const result = await session.promptWithCompletion(prompt, { source: "extension", signal });
324
+ const text = extractFinalText(result.messages);
318
325
  // The marker lands in the output file (the audit trail); [SILENT] as
319
326
  // the last line still suppresses delivery (scheduler isSilent check).
320
327
  return candidate ? `[fell back to ${label}]\n${text}` : text;
321
328
  }
322
329
  catch (err) {
323
330
  errors.push(`${label}: ${err instanceof Error ? err.message : String(err)}`);
331
+ if (dispatched || signal.aborted)
332
+ throw new Error(errors.join(" | "));
324
333
  }
325
334
  finally {
326
- if (session)
335
+ if (session) {
336
+ // The factory owns this fresh session, including extension-queued follow-ups.
337
+ await session.drain?.();
327
338
  await shutdownBridgeSession(session, "quit");
339
+ }
328
340
  }
329
341
  }
330
342
  throw new Error(errors.join(" | ") || "no model candidates");
@@ -334,11 +346,8 @@ export function startGatewayCron(options) {
334
346
  }
335
347
  };
336
348
  const deliverResult = async (job, content) => {
337
- // Re-read the bridge on every delivery (same pattern as lunr-cron).
338
- const bridge = globalThis[DELIVERY_BRIDGE_SYMBOL];
339
- if (!bridge)
340
- throw new Error("no cron delivery bridge registered");
341
- const err = await bridge(job, content);
349
+ // Keep delivery bound to this operator even if another session changes a bridge.
350
+ const err = await platformDeliverer(job, content);
342
351
  if (err)
343
352
  throw new Error(err);
344
353
  };
@@ -1 +1 @@
1
- {"version":3,"file":"cron.js","sourceRoot":"","sources":["../../src/gateway/cron.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * lunR: gateway cron runner + delivery (Phase 4 of the cron/gateway roadmap).\n *\n * startGatewayCron() runs the core/cron scheduler inside the `lunr gateway`\n * daemon:\n *\n * - runJob: each fire gets a FRESH headless agent session (createAgentSession\n * with SessionManager.inMemory — cron runs never write session files and\n * never touch the per-chat gateway sessions; the files under\n * <agentDir>/cron/output/ are the audit trail). The shared fire-guard\n * (core/cron/fire-guard) brackets the turn so the `cron` tool refuses to\n * run inside it (jobs cannot schedule jobs).\n * - deliverResult: replaces the `@lunr/cron-delivery` bridge on globalThis\n * with a platform deliverer. Targets come from job.deliver\n * (comma-separated): \"local\" (no-op — the output file is already written),\n * \"origin\" (the chat that created the job, homeChannel fallback), a bare\n * platform name (that platform's homeChannel), or\n * \"<platform>:<chatId>[:<threadId>]\" (explicit). Content is wrapped as\n * \"Cron: <name>\" and split to the adapter's maxMessageLength.\n *\n * The bridge is re-installed after every cron session creation because loading\n * the builtin extensions (lunr-cron) re-registers its local-notify bridge per\n * session; delivery re-reads the bridge on every call, matching lunr-cron.\n *\n * Fallback models (2026-08-02): settings.json `cronFallbackModels`\n * (\"provider/modelId\" entries) are tried IN ORDER when a fire fails — timeout\n * or any error. Each attempt gets a fresh headless session and\n * jobTimeoutMs/candidates of the budget; a successful fallback run prefixes\n * \"[fell back to provider/modelId]\" to the output. TUI fires are unaffected\n * (they use the live session's model).\n */\n\nimport type { Model } from \"@ashx-j/lunr-ai\";\nimport { beginCronFire, endCronFire } from \"../core/cron/fire-guard.ts\";\nimport type { CronJob, CronJobOrigin } from \"../core/cron/jobs.ts\";\nimport { setCronDeliverValidator } from \"../core/cron/jobs.ts\";\nimport { startScheduler } from \"../core/cron/scheduler.ts\";\nimport { createPermissionContext, deletePermissionContext } from \"../core/permissions.ts\";\nimport { type BridgeSession, shutdownBridgeSession } from \"./agent-bridge.ts\";\nimport { type GatewayConfig, platformConfigFor } from \"./config.ts\";\nimport { splitMessage } from \"./text.ts\";\nimport type { PlatformAdapter } from \"./types.ts\";\n\nconst DELIVERY_BRIDGE_SYMBOL = Symbol.for(\"@lunr/cron-delivery\");\n\ntype DeliveryBridge = (job: CronJob, content: string) => Promise<string | null>;\n\n/** Test seam / default: one fresh headless session per cron fire. */\nexport interface CronModelRef {\n\tprovider: string;\n\tmodelId: string;\n}\n\nexport type CronSessionFactory = (job: CronJob, modelOverride?: CronModelRef) => Promise<BridgeSession>;\n\nexport interface GatewayCronOptions {\n\tadapters: Map<string, PlatformAdapter>;\n\tcfg: GatewayConfig;\n\t/** Tick interval; default 60s. */\n\tintervalMs?: number;\n\t/** Session factory for cron fires; defaults to a real headless agent session. */\n\tsessionFactory?: CronSessionFactory;\n\t/** Test seam: fallback models. When omitted, read fresh from settings.json `cronFallbackModels` on every fire. */\n\tfallbackModels?: CronModelRef[];\n}\n\nconst KNOWN_PLATFORMS = [\"telegram\", \"discord\"] as const;\n\n/** Default factory: fresh in-memory headless session, mirroring agent-bridge's wiring. */\nasync function defaultCronSessionFactory(job: CronJob, modelOverride?: CronModelRef): Promise<BridgeSession> {\n\tconst [\n\t\t{ loadAllBuiltinExtensions },\n\t\t{ getAgentDir },\n\t\t{ registerCustomizeBridge },\n\t\t{ registerMemoryCapBridge },\n\t\t{ registerModelTierBridge },\n\t\t{ createAgentSessionFromServices, createAgentSessionServices },\n\t\t{ SessionManager },\n\t\t{ SettingsManager },\n\t\t{ bindRuntimeBridges },\n\t] = await Promise.all([\n\t\timport(\"../builtin-extensions/index.ts\"),\n\t\timport(\"../config.ts\"),\n\t\timport(\"../core/customize.ts\"),\n\t\timport(\"../core/memory-cap.ts\"),\n\t\timport(\"../core/model-tiers.ts\"),\n\t\timport(\"../core/agent-session-services.ts\"),\n\t\timport(\"../core/session-manager.ts\"),\n\t\timport(\"../core/settings-manager.ts\"),\n\t\timport(\"../core/runtime-bridges.ts\"),\n\t]);\n\tconst cwd = job.workdir ?? process.cwd();\n\tconst agentDir = getAgentDir();\n\tconst settingsManager = SettingsManager.create(cwd, agentDir, { projectTrusted: false });\n\tregisterModelTierBridge(settingsManager);\n\tregisterMemoryCapBridge(settingsManager);\n\tregisterCustomizeBridge(settingsManager);\n\n\t// In-memory on purpose: cron runs must not persist session files or pollute\n\t// the per-chat gateway sessions — <agentDir>/cron/output/ is the audit trail.\n\tconst sessionManager = SessionManager.inMemory(cwd);\n\n\t// Services-first (mirrors main.ts): extension-registered providers (e.g.\n\t// ollama-cloud) must land in the shared ModelRuntime BEFORE session\n\t// creation — otherwise findInitialModel can't resolve the user's default\n\t// model and silently falls back to an arbitrary catalog provider.\n\tconst services = await createAgentSessionServices({\n\t\tcwd,\n\t\tagentDir,\n\t\tsettingsManager,\n\t\tresourceLoaderOptions: { extensionFactories: await loadAllBuiltinExtensions() },\n\t});\n\t// Fallback-model attempts pin the session model explicitly; an unresolvable\n\t// or unauthenticated override fails the attempt so the next fallback runs.\n\tlet model: Model<any> | undefined;\n\tif (modelOverride) {\n\t\tconst resolved = services.modelRuntime.getModel(modelOverride.provider, modelOverride.modelId);\n\t\tif (!resolved) throw new Error(`model not found: ${modelOverride.provider}/${modelOverride.modelId}`);\n\t\tif (!services.modelRuntime.hasConfiguredAuth(resolved.provider)) {\n\t\t\tthrow new Error(`no configured auth for provider: ${modelOverride.provider}`);\n\t\t}\n\t\tmodel = resolved;\n\t}\n\tconst { session } = await createAgentSessionFromServices({ services, sessionManager, model });\n\tconst permissionId = sessionManager.getSessionId();\n\tcreatePermissionContext(permissionId, settingsManager.getDefaultPermissionMode(), false);\n\tconst dispose = session.dispose.bind(session);\n\tsession.dispose = () => {\n\t\tdeletePermissionContext(permissionId);\n\t\tdispose();\n\t};\n\ttry {\n\t\tbindRuntimeBridges({ session, services });\n\t\tawait session.bindExtensions({\n\t\t\tmode: \"print\",\n\t\t\tonError: (err) => console.error(`[gateway cron] extension error (${err.extensionPath}): ${err.error}`),\n\t\t});\n\t\treturn session;\n\t} catch (error) {\n\t\tawait shutdownBridgeSession(session, \"quit\");\n\t\tthrow error;\n\t}\n}\n\n/** Final assistant text, print-mode style; throws on error/aborted stop. */\nfunction extractFinalText(session: BridgeSession): string {\n\tconst messages = session.state.messages;\n\tconst last = messages[messages.length - 1];\n\tif (last?.role !== \"assistant\") return \"\";\n\tconst assistant = last as {\n\t\tstopReason?: string;\n\t\terrorMessage?: string;\n\t\tcontent?: Array<{ type: string; text?: string }>;\n\t};\n\tif (assistant.stopReason === \"error\" || assistant.stopReason === \"aborted\") {\n\t\tthrow new Error(assistant.errorMessage || `Request ${assistant.stopReason}`);\n\t}\n\tlet text = \"\";\n\tfor (const content of assistant.content ?? []) {\n\t\tif (content.type === \"text\") text += content.text ?? \"\";\n\t}\n\treturn text;\n}\n\ninterface ResolvedTarget {\n\tplatform: string;\n\tchatId: string;\n\tthreadId?: string;\n}\n\nconst EXPLICIT_TARGET_RE = /^([a-z0-9_-]+):([^:]+)(?::([^:]+))?$/i;\n\n/** Resolve one deliver target to a concrete destination. Returns an error string on failure. */\nfunction resolveTarget(target: string, job: CronJob, cfg: GatewayConfig): ResolvedTarget | string {\n\tif (target === \"origin\") {\n\t\tconst origin = job.origin;\n\t\tif (origin?.platform && origin.chatId) {\n\t\t\treturn { platform: origin.platform, chatId: origin.chatId, threadId: origin.threadId };\n\t\t}\n\t\t// Missing/incomplete origin → fall back to a homeChannel: the origin's\n\t\t// platform when known, otherwise the first platform that has one.\n\t\tconst platforms = origin?.platform ? [origin.platform] : KNOWN_PLATFORMS;\n\t\tfor (const platform of platforms) {\n\t\t\tconst home = platformConfigFor(cfg, platform)?.homeChannel;\n\t\t\tif (home) return { platform, chatId: home };\n\t\t}\n\t\treturn `deliver target \"origin\": job has no origin and no homeChannel is configured`;\n\t}\n\n\tconst explicit = EXPLICIT_TARGET_RE.exec(target);\n\tconst platform = explicit ? explicit[1].toLowerCase() : target.toLowerCase();\n\tif (platformConfigFor(cfg, platform) === undefined) {\n\t\treturn `unknown platform \"${explicit ? explicit[1] : target}\"`;\n\t}\n\tif (explicit) {\n\t\treturn { platform, chatId: explicit[2], threadId: explicit[3] };\n\t}\n\t// Bare platform name → its homeChannel.\n\tconst home = platformConfigFor(cfg, platform)?.homeChannel;\n\tif (!home) return `no homeChannel configured for ${platform}`;\n\treturn { platform, chatId: home };\n}\n\n/** True when a resolved chat may receive cron output for this job. */\nexport function isAllowedDeliverChat(\n\tcfg: GatewayConfig,\n\tplatform: string,\n\tchatId: string,\n\torigin?: CronJobOrigin | null,\n): boolean {\n\tconst platformCfg = platformConfigFor(cfg, platform);\n\tif (!platformCfg) return false;\n\tif (platformCfg.homeChannel && platformCfg.homeChannel === chatId) return true;\n\tif (platformCfg.allowedChats?.includes(chatId)) return true;\n\treturn origin?.platform === platform && origin.chatId === chatId;\n}\n\nexport function createDeliverValidator(\n\tcfg: GatewayConfig,\n): (deliver: string, origin?: CronJobOrigin | null) => string | undefined {\n\treturn (deliver, origin) => {\n\t\tconst targets = deliver\n\t\t\t.split(\",\")\n\t\t\t.map((t) => t.trim())\n\t\t\t.filter(Boolean);\n\t\tfor (const target of targets) {\n\t\t\tif (target === \"local\") continue;\n\t\t\tif (target === \"origin\") continue; // delivery time resolves/fails with a sensible error\n\t\t\tconst explicit = EXPLICIT_TARGET_RE.exec(target);\n\t\t\tconst platform = explicit ? explicit[1].toLowerCase() : target.toLowerCase();\n\t\t\tconst platformCfg = platformConfigFor(cfg, platform);\n\t\t\tif (!platformCfg) return `unknown platform \"${explicit ? explicit[1] : target}\"`;\n\t\t\tif (explicit) {\n\t\t\t\tif (!isAllowedDeliverChat(cfg, platform, explicit[2], origin)) {\n\t\t\t\t\treturn `deliver target \"${target}\" is not an allowed chat for ${platform}`;\n\t\t\t\t}\n\t\t\t} else if (!platformCfg.homeChannel) {\n\t\t\t\treturn `no homeChannel configured for ${platform}`;\n\t\t\t}\n\t\t}\n\t\treturn undefined;\n\t};\n}\n\n/** Wrap the run output with a compact cron header. */\nexport function wrapCronContent(job: CronJob, content: string): string {\n\treturn `Cron: ${job.name}\\n———\\n${content}`;\n}\n\n/**\n * The platform deliverer installed at the `@lunr/cron-delivery` bridge.\n * Every target is attempted; the first error is returned (null on success).\n */\nexport function createPlatformDeliverer(adapters: Map<string, PlatformAdapter>, cfg: GatewayConfig): DeliveryBridge {\n\treturn async (job, content) => {\n\t\tconst targets = job.deliver\n\t\t\t.split(\",\")\n\t\t\t.map((t) => t.trim())\n\t\t\t.filter(Boolean);\n\t\tlet firstError: string | null = null;\n\t\tfor (const target of targets) {\n\t\t\tif (target === \"local\") continue; // output file already written by the scheduler\n\t\t\tconst resolved = resolveTarget(target, job, cfg);\n\t\t\tif (typeof resolved === \"string\") {\n\t\t\t\tfirstError ??= resolved;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (!isAllowedDeliverChat(cfg, resolved.platform, resolved.chatId, job.origin)) {\n\t\t\t\tfirstError ??= `deliver target \"${target}\" is not an allowed chat for ${resolved.platform}`;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst adapter = adapters.get(resolved.platform);\n\t\t\tif (!adapter) {\n\t\t\t\tfirstError ??= `no adapter connected for ${resolved.platform}`;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst wrapped = wrapCronContent(job, content);\n\t\t\tfor (const chunk of splitMessage(wrapped, adapter.maxMessageLength)) {\n\t\t\t\ttry {\n\t\t\t\t\tconst result = await adapter.send(resolved.chatId, chunk, {\n\t\t\t\t\t\tthreadId: resolved.threadId,\n\t\t\t\t\t});\n\t\t\t\t\tif (!result.success) {\n\t\t\t\t\t\tfirstError ??= `${resolved.platform} send failed: ${result.error ?? \"unknown error\"}`;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t} catch (err) {\n\t\t\t\t\tfirstError ??= `${resolved.platform} send failed: ${err instanceof Error ? err.message : String(err)}`;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn firstError;\n\t};\n}\n\n/** Race one prompt attempt against its share of the job budget. */\nfunction withAttemptTimeout<T>(promise: Promise<T>, ms: number): Promise<T> {\n\treturn Promise.race([\n\t\tpromise,\n\t\tnew Promise<never>((_, reject) => {\n\t\t\tconst timer = setTimeout(() => reject(new Error(`attempt timed out after ${ms}ms`)), ms);\n\t\t\t// If the attempt settles first this promise is discarded; the timer must not keep the process alive.\n\t\t\ttimer.unref?.();\n\t\t}),\n\t]);\n}\n\n/**\n * Read settings.json `cronFallbackModels` (\"provider/modelId\" entries).\n * Fresh read per fire so edits apply without a daemon restart; invalid\n * entries are skipped with a log line. Never throws.\n */\nasync function readCronFallbackModels(): Promise<CronModelRef[]> {\n\ttry {\n\t\tconst [{ getAgentDir }, { SettingsManager }] = await Promise.all([\n\t\t\timport(\"../config.ts\"),\n\t\t\timport(\"../core/settings-manager.ts\"),\n\t\t]);\n\t\tconst settingsManager = SettingsManager.create(process.cwd(), getAgentDir(), { projectTrusted: false });\n\t\tconst out: CronModelRef[] = [];\n\t\tfor (const entry of settingsManager.getCronFallbackModels()) {\n\t\t\tconst idx = entry.indexOf(\"/\");\n\t\t\tif (idx <= 0 || idx === entry.length - 1) {\n\t\t\t\tconsole.error(\n\t\t\t\t\t`[gateway cron] ignoring invalid cronFallbackModels entry \"${entry}\" (want \"provider/modelId\")`,\n\t\t\t\t);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tout.push({ provider: entry.slice(0, idx), modelId: entry.slice(idx + 1) });\n\t\t}\n\t\treturn out;\n\t} catch (err) {\n\t\tconsole.error(\n\t\t\t`[gateway cron] failed to read cronFallbackModels: ${err instanceof Error ? err.message : String(err)}`,\n\t\t);\n\t\treturn [];\n\t}\n}\n\n/**\n * Start the cron scheduler inside the gateway daemon. Starts even with zero\n * stored jobs — jobs can be created later from chats. stop() halts the loop.\n */\nexport function startGatewayCron(options: GatewayCronOptions): { stop(): void; intervalMs: number } {\n\tconst { adapters, cfg } = options;\n\tconst sessionFactory = options.sessionFactory ?? defaultCronSessionFactory;\n\tconst platformDeliverer = createPlatformDeliverer(adapters, cfg);\n\n\t// Explicit so runJob can split it into per-attempt budgets that sum to (at\n\t// most) the scheduler's outer race (core/cron/scheduler.ts runSchedulerTick).\n\tconst jobTimeoutMs = 5 * 60 * 1000;\n\n\t// Reject deliver targets that are not local, origin, a configured home channel,\n\t// or an explicit chat in the platform allowlist / the job's origin.\n\tsetCronDeliverValidator(createDeliverValidator(cfg));\n\n\t// Replace the local-notify bridge lunr-cron registered with the platform deliverer.\n\t(globalThis as Record<symbol, unknown>)[DELIVERY_BRIDGE_SYMBOL] = platformDeliverer;\n\n\tconst runJob = async (prompt: string, job: CronJob): Promise<string> => {\n\t\tconst fallbacks = options.fallbackModels ?? (await readCronFallbackModels());\n\t\tconst candidates: Array<CronModelRef | undefined> = [undefined, ...fallbacks];\n\t\tconst attemptTimeoutMs = Math.floor(jobTimeoutMs / candidates.length);\n\t\tconst errors: string[] = [];\n\t\tbeginCronFire();\n\t\ttry {\n\t\t\tfor (const candidate of candidates) {\n\t\t\t\tconst label = candidate ? `${candidate.provider}/${candidate.modelId}` : \"default model\";\n\t\t\t\tlet session: BridgeSession | undefined;\n\t\t\t\ttry {\n\t\t\t\t\tsession = await sessionFactory(job, candidate);\n\t\t\t\t\t// Loading the builtin extensions re-registered lunr-cron's local-notify\n\t\t\t\t\t// bridge; restore the platform deliverer before any delivery re-reads it.\n\t\t\t\t\t(globalThis as Record<symbol, unknown>)[DELIVERY_BRIDGE_SYMBOL] = platformDeliverer;\n\t\t\t\t\tawait withAttemptTimeout(session.prompt(prompt, { source: \"extension\" }), attemptTimeoutMs);\n\t\t\t\t\tconst text = extractFinalText(session);\n\t\t\t\t\t// The marker lands in the output file (the audit trail); [SILENT] as\n\t\t\t\t\t// the last line still suppresses delivery (scheduler isSilent check).\n\t\t\t\t\treturn candidate ? `[fell back to ${label}]\\n${text}` : text;\n\t\t\t\t} catch (err) {\n\t\t\t\t\terrors.push(`${label}: ${err instanceof Error ? err.message : String(err)}`);\n\t\t\t\t} finally {\n\t\t\t\t\tif (session) await shutdownBridgeSession(session, \"quit\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tthrow new Error(errors.join(\" | \") || \"no model candidates\");\n\t\t} finally {\n\t\t\tendCronFire();\n\t\t}\n\t};\n\n\tconst deliverResult = async (job: CronJob, content: string): Promise<void> => {\n\t\t// Re-read the bridge on every delivery (same pattern as lunr-cron).\n\t\tconst bridge = (globalThis as Record<symbol, unknown>)[DELIVERY_BRIDGE_SYMBOL] as DeliveryBridge | undefined;\n\t\tif (!bridge) throw new Error(\"no cron delivery bridge registered\");\n\t\tconst err = await bridge(job, content);\n\t\tif (err) throw new Error(err);\n\t};\n\n\tconst scheduler = startScheduler({ runJob, deliverResult, intervalMs: options.intervalMs, jobTimeoutMs });\n\treturn { stop: () => scheduler.stop(), intervalMs: options.intervalMs ?? 60_000 };\n}\n"]}
1
+ {"version":3,"file":"cron.js","sourceRoot":"","sources":["../../src/gateway/cron.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * lunR: gateway cron runner + delivery (Phase 4 of the cron/gateway roadmap).\n *\n * startGatewayCron() runs the core/cron scheduler inside the `lunr gateway`\n * daemon:\n *\n * - runJob: each fire gets a FRESH headless agent session (createAgentSession\n * with SessionManager.inMemory — cron runs never write session files and\n * never touch the per-chat gateway sessions; the files under\n * <agentDir>/cron/output/ are the audit trail). The shared fire-guard\n * (core/cron/fire-guard) brackets the turn so the `cron` tool refuses to\n * run inside it (jobs cannot schedule jobs).\n * - deliverResult: replaces the `@lunr/cron-delivery` bridge on globalThis\n * with a platform deliverer. Targets come from job.deliver\n * (comma-separated): \"local\" (no-op — the output file is already written),\n * \"origin\" (the identified, currently authorized requester chat), a bare\n * platform name (that platform's homeChannel), or\n * \"<platform>:<chatId>[:<threadId>]\" (explicit). Content is wrapped as\n * \"Cron: <name>\" and split to the adapter's maxMessageLength.\n *\n * The compatibility delivery bridge exposes the platform deliverer. The scheduler\n * retains its own callback so another session cannot redirect its output.\n *\n * Fallback models: settings.json `cronFallbackModels`\n * (\"provider/modelId\" entries) are tried in order only when session setup fails before prompt dispatch.\n * An admitted failure may have external effects and is never replayed automatically; a successful fallback run prefixes\n * \"[fell back to provider/modelId]\" to the output. TUI fires are unaffected\n * (they use the live session's model).\n */\n\nimport type { AgentMessage } from \"@ashx-j/lunr-agent\";\nimport type { Api, Model } from \"@ashx-j/lunr-ai\";\nimport { beginCronFire, endCronFire } from \"../core/cron/fire-guard.ts\";\nimport type { CronJob, CronJobOrigin } from \"../core/cron/jobs.ts\";\nimport { setCronDeliverValidator } from \"../core/cron/jobs.ts\";\nimport { startScheduler } from \"../core/cron/scheduler.ts\";\nimport { createPermissionContext, deletePermissionContext } from \"../core/permissions.ts\";\nimport { type BridgeSession, shutdownBridgeSession } from \"./agent-bridge.ts\";\nimport { isAuthorized } from \"./authz.ts\";\nimport { type GatewayConfig, loadGatewayConfig, platformConfigFor } from \"./config.ts\";\nimport { splitMessage } from \"./text.ts\";\nimport type { PlatformAdapter } from \"./types.ts\";\n\nconst DELIVERY_BRIDGE_SYMBOL = Symbol.for(\"@lunr/cron-delivery\");\n\ntype DeliveryBridge = (job: CronJob, content: string) => Promise<string | null>;\n\n/** Test seam / default: one fresh headless session per cron fire. */\nexport interface CronModelRef {\n\tprovider: string;\n\tmodelId: string;\n}\n\nexport type CronSessionFactory = (job: CronJob, modelOverride?: CronModelRef) => Promise<BridgeSession>;\n\nexport interface GatewayCronOptions {\n\tadapters: Map<string, PlatformAdapter>;\n\tcfg: GatewayConfig;\n\t/** Tick interval; default 60s. */\n\tintervalMs?: number;\n\t/** Session factory for cron fires; defaults to a real headless agent session. */\n\tsessionFactory?: CronSessionFactory;\n\t/** Test seam: fallback models. When omitted, read fresh from settings.json `cronFallbackModels` on every fire. */\n\tfallbackModels?: CronModelRef[];\n\t/** Config seam; production always reloads current grants. */\n\tgetConfig?: () => GatewayConfig;\n\tjobTimeoutMs?: number;\n}\n\n/** Default factory: fresh in-memory headless session, mirroring agent-bridge's wiring. */\nasync function defaultCronSessionFactory(job: CronJob, modelOverride?: CronModelRef): Promise<BridgeSession> {\n\tconst [\n\t\t{ loadAllBuiltinExtensions },\n\t\t{ getAgentDir },\n\t\t{ registerCustomizeBridge },\n\t\t{ registerMemoryCapBridge },\n\t\t{ registerModelTierBridge },\n\t\t{ createAgentSessionFromServices, createAgentSessionServices },\n\t\t{ SessionManager },\n\t\t{ SettingsManager },\n\t\t{ bindRuntimeBridges },\n\t] = await Promise.all([\n\t\timport(\"../builtin-extensions/index.ts\"),\n\t\timport(\"../config.ts\"),\n\t\timport(\"../core/customize.ts\"),\n\t\timport(\"../core/memory-cap.ts\"),\n\t\timport(\"../core/model-tiers.ts\"),\n\t\timport(\"../core/agent-session-services.ts\"),\n\t\timport(\"../core/session-manager.ts\"),\n\t\timport(\"../core/settings-manager.ts\"),\n\t\timport(\"../core/runtime-bridges.ts\"),\n\t]);\n\tconst cwd = job.workdir ?? process.cwd();\n\tconst agentDir = getAgentDir();\n\tconst settingsManager = SettingsManager.create(cwd, agentDir, { projectTrusted: false });\n\tregisterModelTierBridge(settingsManager);\n\tregisterMemoryCapBridge(settingsManager);\n\tregisterCustomizeBridge(settingsManager);\n\n\t// In-memory on purpose: cron runs must not persist session files or pollute\n\t// the per-chat gateway sessions — <agentDir>/cron/output/ is the audit trail.\n\tconst sessionManager = SessionManager.inMemory(cwd);\n\n\t// Services-first (mirrors main.ts): extension-registered providers (e.g.\n\t// ollama-cloud) must land in the shared ModelRuntime BEFORE session\n\t// creation — otherwise findInitialModel can't resolve the user's default\n\t// model and silently falls back to an arbitrary catalog provider.\n\tconst services = await createAgentSessionServices({\n\t\tcwd,\n\t\tagentDir,\n\t\tsettingsManager,\n\t\tresourceLoaderOptions: { extensionFactories: await loadAllBuiltinExtensions() },\n\t});\n\t// Fallback-model attempts pin the session model explicitly; an unresolvable\n\t// or unauthenticated override fails the attempt so the next fallback runs.\n\tlet model: Model<Api> | undefined;\n\tif (modelOverride) {\n\t\tconst resolved = services.modelRuntime.getModel(modelOverride.provider, modelOverride.modelId);\n\t\tif (!resolved) throw new Error(`model not found: ${modelOverride.provider}/${modelOverride.modelId}`);\n\t\tif (!services.modelRuntime.hasConfiguredAuth(resolved.provider)) {\n\t\t\tthrow new Error(`no configured auth for provider: ${modelOverride.provider}`);\n\t\t}\n\t\tmodel = resolved;\n\t}\n\tconst { session } = await createAgentSessionFromServices({ services, sessionManager, model });\n\tconst permissionId = sessionManager.getSessionId();\n\tcreatePermissionContext(permissionId, settingsManager.getDefaultPermissionMode(), false);\n\tconst dispose = session.dispose.bind(session);\n\tsession.dispose = () => {\n\t\tdeletePermissionContext(permissionId);\n\t\tdispose();\n\t};\n\ttry {\n\t\tbindRuntimeBridges({ session, services });\n\t\tawait session.bindExtensions({\n\t\t\tmode: \"print\",\n\t\t\tonError: (err) => console.error(`[gateway cron] extension error (${err.extensionPath}): ${err.error}`),\n\t\t});\n\t\treturn session;\n\t} catch (error) {\n\t\tawait shutdownBridgeSession(session, \"quit\");\n\t\tthrow error;\n\t}\n}\n\n/** Final assistant text, print-mode style; throws on error/aborted stop. */\nfunction extractFinalText(messages: AgentMessage[]): string {\n\tconst last = messages[messages.length - 1];\n\tif (last?.role !== \"assistant\") return \"\";\n\tconst assistant = last as {\n\t\tstopReason?: string;\n\t\terrorMessage?: string;\n\t\tcontent?: Array<{ type: string; text?: string }>;\n\t};\n\tif (assistant.stopReason === \"error\" || assistant.stopReason === \"aborted\") {\n\t\tthrow new Error(assistant.errorMessage || `Request ${assistant.stopReason}`);\n\t}\n\tlet text = \"\";\n\tfor (const content of assistant.content ?? []) {\n\t\tif (content.type === \"text\") text += content.text ?? \"\";\n\t}\n\treturn text;\n}\n\ninterface ResolvedTarget {\n\tplatform: string;\n\tchatId: string;\n\tthreadId?: string;\n}\n\nconst EXPLICIT_TARGET_RE = /^([a-z0-9_-]+):([^:]+)(?::([^:]+))?$/i;\n\n/** Resolve one deliver target to a concrete destination. Returns an error string on failure. */\nfunction resolveTarget(target: string, job: CronJob, cfg: GatewayConfig): ResolvedTarget | string {\n\tif (target === \"origin\") {\n\t\tconst origin = job.origin;\n\t\tif (origin?.platform && origin.chatId && origin.userId) {\n\t\t\treturn { platform: origin.platform, chatId: origin.chatId, threadId: origin.threadId };\n\t\t}\n\t\treturn 'deliver target \"origin\": job has no origin requester identity; use /cron rebind from an approved gateway chat';\n\t}\n\n\tconst explicit = EXPLICIT_TARGET_RE.exec(target);\n\tconst platform = explicit ? explicit[1].toLowerCase() : target.toLowerCase();\n\tif (platformConfigFor(cfg, platform) === undefined) {\n\t\treturn `unknown platform \"${explicit ? explicit[1] : target}\"`;\n\t}\n\tif (explicit) {\n\t\treturn { platform, chatId: explicit[2], threadId: explicit[3] };\n\t}\n\t// Bare platform name → its homeChannel.\n\tconst home = platformConfigFor(cfg, platform)?.homeChannel;\n\tif (!home) return `no homeChannel configured for ${platform}`;\n\treturn { platform, chatId: home };\n}\n\n/** Rebuild the source from durable identity, never from persisted adapter role grants. */\nfunction isAuthorizedOrigin(cfg: GatewayConfig, origin?: CronJobOrigin | null): boolean {\n\tif (!origin?.userId) return false;\n\treturn isAuthorized(\n\t\t{\n\t\t\tplatform: origin.platform,\n\t\t\tchatId: origin.chatId,\n\t\t\tuserId: origin.userId,\n\t\t\tchatType: origin.chatType === \"group\" ? \"group\" : origin.chatType === \"channel\" ? \"channel\" : \"dm\",\n\t\t\tthreadId: origin.threadId,\n\t\t},\n\t\tcfg,\n\t);\n}\n\n/** True when a resolved chat may receive cron output for this job. */\nexport function isAllowedDeliverChat(\n\tcfg: GatewayConfig,\n\tplatform: string,\n\tchatId: string,\n\torigin?: CronJobOrigin | null,\n): boolean {\n\tconst platformCfg = platformConfigFor(cfg, platform);\n\tif (!platformCfg) return false;\n\tif (platformCfg.homeChannel && platformCfg.homeChannel === chatId) return true;\n\tif (platformCfg.allowedChats?.includes(chatId)) return true;\n\treturn origin?.platform === platform && origin.chatId === chatId && isAuthorizedOrigin(cfg, origin);\n}\n\nexport function createDeliverValidator(\n\tcfg: GatewayConfig,\n): (deliver: string, origin?: CronJobOrigin | null) => string | undefined {\n\treturn (deliver, origin) => {\n\t\tconst targets = deliver\n\t\t\t.split(\",\")\n\t\t\t.map((t) => t.trim())\n\t\t\t.filter(Boolean);\n\t\tfor (const target of targets) {\n\t\t\tif (target === \"local\") continue;\n\t\t\tif (target === \"origin\") continue; // delivery time resolves/fails with a sensible error\n\t\t\tconst explicit = EXPLICIT_TARGET_RE.exec(target);\n\t\t\tconst platform = explicit ? explicit[1].toLowerCase() : target.toLowerCase();\n\t\t\tconst platformCfg = platformConfigFor(cfg, platform);\n\t\t\tif (!platformCfg) return `unknown platform \"${explicit ? explicit[1] : target}\"`;\n\t\t\tif (explicit) {\n\t\t\t\tif (!isAllowedDeliverChat(cfg, platform, explicit[2], origin)) {\n\t\t\t\t\treturn `deliver target \"${target}\" is not an allowed chat for ${platform}`;\n\t\t\t\t}\n\t\t\t} else if (!platformCfg.homeChannel) {\n\t\t\t\treturn `no homeChannel configured for ${platform}`;\n\t\t\t}\n\t\t}\n\t\treturn undefined;\n\t};\n}\n\n/** Wrap the run output with a compact cron header. */\nexport function wrapCronContent(job: CronJob, content: string): string {\n\treturn `Cron: ${job.name}\\n———\\n${content}`;\n}\n\n/**\n * The platform deliverer installed at the `@lunr/cron-delivery` bridge.\n * Every target is attempted; the first error is returned (null on success).\n */\nexport function createPlatformDeliverer(\n\tadapters: Map<string, PlatformAdapter>,\n\tconfig: GatewayConfig | (() => GatewayConfig),\n): DeliveryBridge {\n\tconst getConfig = typeof config === \"function\" ? config : () => config;\n\treturn async (job, content) => {\n\t\tconst targets = job.deliver\n\t\t\t.split(\",\")\n\t\t\t.map((t) => t.trim())\n\t\t\t.filter(Boolean);\n\t\tlet firstError: string | null = null;\n\t\tfor (const target of targets) {\n\t\t\tif (target === \"local\") continue; // output file already written by the scheduler\n\t\t\tconst cfg = getConfig();\n\t\t\tconst resolved = resolveTarget(target, job, cfg);\n\t\t\tif (typeof resolved === \"string\") {\n\t\t\t\tfirstError ??= resolved;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (!isAllowedDeliverChat(cfg, resolved.platform, resolved.chatId, job.origin)) {\n\t\t\t\tfirstError ??= `deliver target \"${target}\" is not an allowed chat for ${resolved.platform}`;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst adapter = adapters.get(resolved.platform);\n\t\t\tif (!adapter) {\n\t\t\t\tfirstError ??= `no adapter connected for ${resolved.platform}`;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst wrapped = wrapCronContent(job, content);\n\t\t\tfor (const chunk of splitMessage(wrapped, adapter.maxMessageLength)) {\n\t\t\t\ttry {\n\t\t\t\t\tconst live = getConfig();\n\t\t\t\t\tconst current = resolveTarget(target, job, live);\n\t\t\t\t\tif (typeof current === \"string\") throw new Error(current);\n\t\t\t\t\tif (\n\t\t\t\t\t\tcurrent.platform !== resolved.platform ||\n\t\t\t\t\t\tcurrent.chatId !== resolved.chatId ||\n\t\t\t\t\t\tcurrent.threadId !== resolved.threadId\n\t\t\t\t\t)\n\t\t\t\t\t\tthrow new Error(\"cron delivery destination changed\");\n\t\t\t\t\tif (target === \"origin\" && !isAuthorizedOrigin(live, job.origin)) {\n\t\t\t\t\t\tthrow new Error(\"cron origin requester access revoked; use /cron rebind\");\n\t\t\t\t\t}\n\t\t\t\t\tif (!isAllowedDeliverChat(live, resolved.platform, resolved.chatId, job.origin))\n\t\t\t\t\t\tthrow new Error(`deliver target \"${target}\" is not an allowed chat for ${resolved.platform}`);\n\t\t\t\t\tconst result = await adapter.send(resolved.chatId, chunk, {\n\t\t\t\t\t\tthreadId: resolved.threadId,\n\t\t\t\t\t});\n\t\t\t\t\tif (!result.success) {\n\t\t\t\t\t\tfirstError ??= `${resolved.platform} send failed: ${result.error ?? \"unknown error\"}`;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t} catch (err) {\n\t\t\t\t\tfirstError ??= `${resolved.platform} send failed: ${err instanceof Error ? err.message : String(err)}`;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn firstError;\n\t};\n}\n\n/**\n * Read settings.json `cronFallbackModels` (\"provider/modelId\" entries).\n * Fresh read per fire so edits apply without a daemon restart; invalid\n * entries are skipped with a log line. Never throws.\n */\nasync function readCronFallbackModels(): Promise<CronModelRef[]> {\n\ttry {\n\t\tconst [{ getAgentDir }, { SettingsManager }] = await Promise.all([\n\t\t\timport(\"../config.ts\"),\n\t\t\timport(\"../core/settings-manager.ts\"),\n\t\t]);\n\t\tconst settingsManager = SettingsManager.create(process.cwd(), getAgentDir(), { projectTrusted: false });\n\t\tconst out: CronModelRef[] = [];\n\t\tfor (const entry of settingsManager.getCronFallbackModels()) {\n\t\t\tconst idx = entry.indexOf(\"/\");\n\t\t\tif (idx <= 0 || idx === entry.length - 1) {\n\t\t\t\tconsole.error(\n\t\t\t\t\t`[gateway cron] ignoring invalid cronFallbackModels entry \"${entry}\" (want \"provider/modelId\")`,\n\t\t\t\t);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tout.push({ provider: entry.slice(0, idx), modelId: entry.slice(idx + 1) });\n\t\t}\n\t\treturn out;\n\t} catch (err) {\n\t\tconsole.error(\n\t\t\t`[gateway cron] failed to read cronFallbackModels: ${err instanceof Error ? err.message : String(err)}`,\n\t\t);\n\t\treturn [];\n\t}\n}\n\n/**\n * Start the cron scheduler inside the gateway daemon. Starts even with zero\n * stored jobs — jobs can be created later from chats. stop() cancels admitted work, awaits session cleanup and releases the lease last.\n */\nexport function startGatewayCron(options: GatewayCronOptions): { stop(): Promise<void>; intervalMs: number } {\n\tconst { adapters } = options;\n\tconst getConfig = options.getConfig ?? loadGatewayConfig;\n\tconst sessionFactory = options.sessionFactory ?? defaultCronSessionFactory;\n\tconst platformDeliverer = createPlatformDeliverer(adapters, getConfig);\n\n\t// One budget covers setup, owned prompt cancellation and session settlement.\n\tconst jobTimeoutMs = options.jobTimeoutMs ?? 5 * 60 * 1000;\n\n\t// Reject deliver targets that are not local, origin, a configured home channel,\n\t// or an explicit chat in the platform allowlist / the job's origin.\n\tsetCronDeliverValidator((deliver, origin) => createDeliverValidator(getConfig())(deliver, origin));\n\n\t// Retain the compatibility delivery bridge for integrations.\n\t(globalThis as Record<symbol, unknown>)[DELIVERY_BRIDGE_SYMBOL] = platformDeliverer;\n\n\tconst runJob = async (prompt: string, job: CronJob, signal: AbortSignal): Promise<string> => {\n\t\tconst fallbacks = options.fallbackModels ?? (await readCronFallbackModels());\n\t\tconst candidates: Array<CronModelRef | undefined> = [undefined, ...fallbacks];\n\t\tconst errors: string[] = [];\n\t\tbeginCronFire();\n\t\ttry {\n\t\t\tfor (const candidate of candidates) {\n\t\t\t\tsignal.throwIfAborted();\n\t\t\t\tconst label = candidate ? `${candidate.provider}/${candidate.modelId}` : \"default model\";\n\t\t\t\tlet session: BridgeSession | undefined;\n\t\t\t\tlet dispatched = false;\n\t\t\t\ttry {\n\t\t\t\t\tsession = await sessionFactory(job, candidate);\n\t\t\t\t\tsignal.throwIfAborted();\n\t\t\t\t\tif (!session.promptWithCompletion) throw new Error(\"cron session lacks owned prompt admission\");\n\t\t\t\t\tdispatched = true;\n\t\t\t\t\tconst result = await session.promptWithCompletion(prompt, { source: \"extension\", signal });\n\t\t\t\t\tconst text = extractFinalText(result.messages);\n\t\t\t\t\t// The marker lands in the output file (the audit trail); [SILENT] as\n\t\t\t\t\t// the last line still suppresses delivery (scheduler isSilent check).\n\t\t\t\t\treturn candidate ? `[fell back to ${label}]\\n${text}` : text;\n\t\t\t\t} catch (err) {\n\t\t\t\t\terrors.push(`${label}: ${err instanceof Error ? err.message : String(err)}`);\n\t\t\t\t\tif (dispatched || signal.aborted) throw new Error(errors.join(\" | \"));\n\t\t\t\t} finally {\n\t\t\t\t\tif (session) {\n\t\t\t\t\t\t// The factory owns this fresh session, including extension-queued follow-ups.\n\t\t\t\t\t\tawait session.drain?.();\n\t\t\t\t\t\tawait shutdownBridgeSession(session, \"quit\");\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tthrow new Error(errors.join(\" | \") || \"no model candidates\");\n\t\t} finally {\n\t\t\tendCronFire();\n\t\t}\n\t};\n\n\tconst deliverResult = async (job: CronJob, content: string): Promise<void> => {\n\t\t// Keep delivery bound to this operator even if another session changes a bridge.\n\t\tconst err = await platformDeliverer(job, content);\n\t\tif (err) throw new Error(err);\n\t};\n\n\tconst scheduler = startScheduler({ runJob, deliverResult, intervalMs: options.intervalMs, jobTimeoutMs });\n\treturn { stop: () => scheduler.stop(), intervalMs: options.intervalMs ?? 60_000 };\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/gateway/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAUH,OAAO,EAGN,KAAK,cAAc,EAInB,MAAM,aAAa,CAAC;AAQrB,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD;;;;;;;;;;GAUG;AACH,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,cAAc,KAAK,eAAe,CAGtF,CAAC;AAuOF,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAchE","sourcesContent":["/**\n * lunR: gateway daemon entry (Phase 2a skeleton; Phase 2b registered the\n * Telegram adapter, Phase 3 the Discord adapter — both via ADAPTER_FACTORIES).\n *\n * `lunr gateway` runs the daemon: load gateway.json, instantiate every\n * enabled platform that has a registered adapter factory AND a resolvable\n * token, connect, route messages, and stay alive until SIGINT/SIGTERM.\n * With no runnable adapters it prints per-platform setup instructions and\n * exits 1.\n *\n * Sub-commands:\n * lunr gateway pair approve <platform> <code> approve a pairing code\n * lunr gateway pair list show pending + paired\n * lunr gateway status config/token/session summary\n */\n\nimport { isFeatureEnabled } from \"../core/install-features.ts\";\nimport { DiscordAdapter } from \"./adapters/discord.ts\";\nimport { TelegramAdapter } from \"./adapters/telegram.ts\";\nimport { AgentBridge } from \"./agent-bridge.ts\";\nimport { handleApprovalCallback } from \"./approval.ts\";\nimport { addAllowedUser } from \"./authz.ts\";\nimport { handleCallback, startButtonSweeper, stopButtonSweeper } from \"./buttons.ts\";\nimport { botCommandSpecs } from \"./commands.ts\";\nimport {\n\ttype DiscordConfig,\n\tloadGatewayConfig,\n\ttype PlatformConfig,\n\tplatformConfigFor,\n\tresolvePlatformToken,\n\tsaveGatewayConfig,\n} from \"./config.ts\";\nimport { startGatewayCron } from \"./cron.ts\";\nimport { createPairingStore } from \"./pairing.ts\";\nimport { startGatewayPresenter, stopGatewayPresenter } from \"./presenter.ts\";\nimport { createRouter } from \"./router.ts\";\nimport { claimGateway } from \"./service.ts\";\nimport { buildSessionKey } from \"./session-keys.ts\";\nimport { listSessions } from \"./store.ts\";\nimport type { PlatformAdapter } from \"./types.ts\";\n\n/**\n * Adapter registry — the seam adapters plug into:\n *\n * ADAPTER_FACTORIES.<platform> = (cfg) => new SomeAdapter(cfg);\n *\n * A factory receives the sanitized platform config with the token already\n * resolved into cfg.token (env beats file — see resolvePlatformToken and\n * runDaemon below). The registry type is the PlatformConfig base; adapters\n * with extra fields (Discord) narrow with a cast — the daemon always passes\n * the full sanitized per-platform object.\n */\nexport const ADAPTER_FACTORIES: Record<string, (cfg: PlatformConfig) => PlatformAdapter> = {\n\ttelegram: (cfg) => new TelegramAdapter(cfg),\n\tdiscord: (cfg) => new DiscordAdapter(cfg as DiscordConfig),\n};\n\nconst KNOWN_PLATFORMS = [\"telegram\", \"discord\"] as const;\n\nconst SETUP_INSTRUCTIONS: Record<string, string[]> = {\n\ttelegram: [\"Telegram: run lunr gateway setup locally to configure the bot token and approved user ID.\"],\n\tdiscord: [\"Discord: run lunr gateway setup locally to configure the bot token and approved user ID.\"],\n};\n\nfunction printSetupInstructions(enabledButUnrunnable: string[]): void {\n\tconsole.log(\"lunR gateway: no runnable platforms configured.\");\n\tfor (const platform of enabledButUnrunnable) {\n\t\tconsole.log(` (platform \"${platform}\" is enabled but has no registered adapter or resolvable token)`);\n\t}\n\tfor (const platform of KNOWN_PLATFORMS) {\n\t\tfor (const line of SETUP_INSTRUCTIONS[platform]) {\n\t\t\tconsole.log(line);\n\t\t}\n\t}\n}\n\nasync function runPairApprove(platform: string, code: string | undefined, owner = false): Promise<number> {\n\tif (!code) {\n\t\tconsole.error(\"Usage: lunr gateway pair approve <platform> <code> [--owner]\");\n\t\treturn 1;\n\t}\n\tconst pairing = createPairingStore();\n\tconst userId = pairing.approve(platform, code);\n\tif (userId === null) {\n\t\tconsole.error(`Pairing failed: no valid pending code \"${code}\" for ${platform} (wrong, expired, or locked out).`);\n\t\treturn 1;\n\t}\n\ttry {\n\t\tif (owner) {\n\t\t\tconst cfg = loadGatewayConfig();\n\t\t\tif (platform !== \"telegram\" && platform !== \"discord\") throw new Error(\"Unknown platform.\");\n\t\t\tcfg.owners ??= { telegram: [], discord: [] };\n\t\t\tcfg.owners[platform] = [...new Set([...cfg.owners[platform], userId])];\n\t\t\tcfg[platform].allowedUsers = [...new Set([...cfg[platform].allowedUsers, userId])];\n\t\t\tsaveGatewayConfig(cfg);\n\t\t} else addAllowedUser(platform, userId);\n\t} catch (err) {\n\t\tconsole.error(`Paired ${platform} user ${userId}, but could not persist allowedUsers: ${err}`);\n\t\treturn 1;\n\t}\n\tconsole.log(`Approved ${platform} user ${userId}. Gateway access includes local projects and saved sessions.`);\n\treturn 0;\n}\n\nfunction runPairList(): number {\n\tconst pairing = createPairingStore();\n\tconst pending = pairing.listPending();\n\tconst approved = pairing.listApproved();\n\tconsole.log(\"Pending pairing codes:\");\n\tif (pending.length === 0) {\n\t\tconsole.log(\" (none)\");\n\t} else {\n\t\tfor (const p of pending) {\n\t\t\tconsole.log(` ${p.platform} ${p.code} user=${p.userId} expires ${new Date(p.expiresAt).toISOString()}`);\n\t\t}\n\t}\n\tconsole.log(\"Paired users:\");\n\tif (approved.length === 0) {\n\t\tconsole.log(\" (none)\");\n\t} else {\n\t\tfor (const u of approved) {\n\t\t\tconsole.log(` ${u.platform} ${u.userId} approved ${new Date(u.approvedAt).toISOString()}`);\n\t\t}\n\t}\n\treturn 0;\n}\n\nfunction runStatus(): number {\n\tconst cfg = loadGatewayConfig();\n\tconsole.log(\n\t\t`chat-platforms: ${isFeatureEnabled(\"chat-platforms\") ? \"enabled\" : \"disabled\"} (install-features.json)`,\n\t);\n\tconsole.log(\"lunR gateway status:\");\n\tfor (const platform of KNOWN_PLATFORMS) {\n\t\tconst platformCfg = platformConfigFor(cfg, platform);\n\t\tif (!platformCfg) continue;\n\t\tconst token = resolvePlatformToken(platform, platformCfg);\n\t\tconst adapter = ADAPTER_FACTORIES[platform] === undefined ? \"no adapter\" : \"adapter registered\";\n\t\tconsole.log(\n\t\t\t` ${platform}: ${platformCfg.enabled ? \"enabled\" : \"disabled\"} · token ${token ? \"resolved\" : \"missing\"} · ${adapter}`,\n\t\t);\n\t}\n\tconst sessions = listSessions();\n\tconsole.log(` sessions: ${Object.keys(sessions).length} stored`);\n\treturn 0;\n}\n\nasync function runDaemon(): Promise<number> {\n\tif (!isFeatureEnabled(\"chat-platforms\")) {\n\t\tconsole.error(\"lunR gateway: chat platforms are not enabled.\");\n\t\tconsole.error(\"Enable with: lunr features enable chat-platforms\");\n\t\treturn 1;\n\t}\n\tconst cfg = loadGatewayConfig();\n\tconst adapters = new Map<string, PlatformAdapter>();\n\tconst skipped: string[] = [];\n\n\tfor (const platform of KNOWN_PLATFORMS) {\n\t\tconst platformCfg = platformConfigFor(cfg, platform);\n\t\tif (!platformCfg?.enabled) continue;\n\t\tconst factory: ((cfg: PlatformConfig) => PlatformAdapter) | undefined = ADAPTER_FACTORIES[platform];\n\t\tif (factory === undefined) {\n\t\t\tskipped.push(platform);\n\t\t\tcontinue;\n\t\t}\n\t\tconst token = resolvePlatformToken(platform, platformCfg);\n\t\tif (!token) {\n\t\t\tskipped.push(platform);\n\t\t\tcontinue;\n\t\t}\n\t\tadapters.set(platform, factory({ ...platformCfg, token }));\n\t}\n\n\tif (adapters.size === 0) {\n\t\tprintSetupInstructions(skipped);\n\t\treturn 1;\n\t}\n\n\tconst pairing = createPairingStore();\n\tconst bridge = new AgentBridge();\n\tfor (const adapter of adapters.values())\n\t\tadapter.setCommandSuggestions?.(async (source, command) => {\n\t\t\tconst session = bridge.peekSession(buildSessionKey(source, loadGatewayConfig()));\n\t\t\tif (!session) return [];\n\t\t\tif (command === \"thinking\") return session.getAvailableThinkingLevels();\n\t\t\tif (command === \"model\")\n\t\t\t\treturn (await session.modelRuntime.getAvailable()).map((model) => `${model.provider}/${model.id}`);\n\t\t\treturn [];\n\t\t});\n\tconst router = createRouter({ adapters, cfg, pairing, bridge, reloadConfig: true, remoteControls: true });\n\n\tlet finish!: () => void;\n\tconst stopped = new Promise<void>((resolve) => {\n\t\tfinish = resolve;\n\t});\n\tlet stopping = false;\n\tlet cron: ReturnType<typeof startGatewayCron> | undefined;\n\tconst platformStatus: Record<string, string> = {};\n\tconst retries = new Set<ReturnType<typeof setTimeout>>();\n\tconst shutdown = () => {\n\t\tif (stopping) return;\n\t\tstopping = true;\n\t\towner.update(platformStatus, \"stopping\");\n\t\tcron?.stop();\n\t\tfor (const timer of retries) clearTimeout(timer);\n\t\tstopButtonSweeper();\n\t\tvoid (async () => {\n\t\t\tawait bridge.shutdown();\n\t\t\tawait Promise.all([...adapters.values()].map((adapter) => adapter.disconnect().catch(() => {})));\n\t\t\tstopGatewayPresenter();\n\t\t\towner.release();\n\t\t\tprocess.removeListener(\"SIGINT\", shutdown);\n\t\t\tprocess.removeListener(\"SIGTERM\", shutdown);\n\t\t\tfinish();\n\t\t})().catch((error) => {\n\t\t\tconsole.error(\"Gateway shutdown failed:\", error instanceof Error ? error.message : String(error));\n\t\t\tstopping = false;\n\t\t\towner.update(platformStatus, Object.values(platformStatus).includes(\"connected\") ? \"ready\" : \"starting\");\n\t\t\tstartButtonSweeper();\n\t\t\tcron = startGatewayCron({ adapters, cfg });\n\t\t\tfor (const [platform, adapter] of adapters)\n\t\t\t\tif (platformStatus[platform] !== \"connected\") void connect(platform, adapter);\n\t\t});\n\t};\n\tconst owner = claimGateway(shutdown);\n\tprocess.on(\"SIGINT\", shutdown);\n\tprocess.on(\"SIGTERM\", shutdown);\n\tstartGatewayPresenter(adapters);\n\tstartButtonSweeper();\n\tconst connect = async (platform: string, adapter: PlatformAdapter): Promise<void> => {\n\t\tif (stopping) return;\n\t\ttry {\n\t\t\tplatformStatus[platform] = \"connecting\";\n\t\t\towner.update(platformStatus, Object.values(platformStatus).includes(\"connected\") ? \"ready\" : \"starting\");\n\t\t\tconst ok = await adapter.connect();\n\t\t\tif (!ok) {\n\t\t\t\tthrow new Error(\"Connection failed\");\n\t\t\t}\n\t\t\tadapter.onMessage((event) => {\n\t\t\t\tvoid router.handleEvent(event);\n\t\t\t});\n\t\t\tadapter.onCallback(async (event) => {\n\t\t\t\tconst consumed = await handleApprovalCallback(event, adapter);\n\t\t\t\tif (!consumed) {\n\t\t\t\t\tvoid handleCallback(event, { adapters, cfg: loadGatewayConfig(), pairing, bridge, adapter });\n\t\t\t\t}\n\t\t\t});\n\t\t\ttry {\n\t\t\t\tawait adapter.registerCommands?.(botCommandSpecs());\n\t\t\t} catch (err) {\n\t\t\t\tconsole.error(\n\t\t\t\t\t`[gateway] ${platform}: command menu registration failed: ${err instanceof Error ? err.message : String(err)}`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (stopping) {\n\t\t\t\tawait adapter.disconnect();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tplatformStatus[platform] = \"connected\";\n\t\t\tconsole.log(`lunR gateway: ${platform} connected`);\n\t\t} catch {\n\t\t\tplatformStatus[platform] = \"disconnected, retrying (check gateway logs)\";\n\t\t\tawait adapter.disconnect().catch(() => {});\n\t\t\tif (!stopping) {\n\t\t\t\tconst retry = setTimeout(() => {\n\t\t\t\t\tretries.delete(retry);\n\t\t\t\t\tvoid connect(platform, adapter);\n\t\t\t\t}, 5000);\n\t\t\t\tretries.add(retry);\n\t\t\t}\n\t\t}\n\t\tif (!stopping)\n\t\t\towner.update(platformStatus, Object.values(platformStatus).includes(\"connected\") ? \"ready\" : \"starting\");\n\t};\n\tfor (const [platform, adapter] of adapters) void connect(platform, adapter);\n\n\t// Phase 4: cron jobs fire inside the daemon and deliver back to chats.\n\t// Starts even with zero stored jobs — jobs can be created later from chats.\n\tcron = startGatewayCron({ adapters, cfg });\n\tconsole.log(`lunR gateway: cron scheduler started (${cron.intervalMs / 1000}s interval)`);\n\n\towner.update(platformStatus, \"starting\");\n\tawait stopped;\n\treturn 0;\n}\n\nexport async function runGateway(args: string[]): Promise<number> {\n\tconst [sub, ...rest] = args;\n\tif (sub === \"pair\") {\n\t\tconst [action, platform, code, flag] = rest;\n\t\tif (action === \"approve\" && platform && (flag === undefined || flag === \"--owner\"))\n\t\t\treturn runPairApprove(platform, code, flag === \"--owner\");\n\t\tif (action === \"list\") return runPairList();\n\t\tconsole.error(\"Usage: lunr gateway pair approve <platform> <code> [--owner] | lunr gateway pair list\");\n\t\treturn 1;\n\t}\n\tif (sub === \"status\") return runStatus();\n\tif (sub === undefined) return runDaemon();\n\tconsole.error(`Unknown gateway sub-command \"${sub}\". Expected: pair approve | pair list | status`);\n\treturn 1;\n}\n"]}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/gateway/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAUH,OAAO,EAGN,KAAK,cAAc,EAInB,MAAM,aAAa,CAAC;AAQrB,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD;;;;;;;;;;GAUG;AACH,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,cAAc,KAAK,eAAe,CAGtF,CAAC;AAwOF,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAchE","sourcesContent":["/**\n * lunR: gateway daemon entry (Phase 2a skeleton; Phase 2b registered the\n * Telegram adapter, Phase 3 the Discord adapter — both via ADAPTER_FACTORIES).\n *\n * `lunr gateway` runs the daemon: load gateway.json, instantiate every\n * enabled platform that has a registered adapter factory AND a resolvable\n * token, connect, route messages, and stay alive until SIGINT/SIGTERM.\n * With no runnable adapters it prints per-platform setup instructions and\n * exits 1.\n *\n * Sub-commands:\n * lunr gateway pair approve <platform> <code> approve a pairing code\n * lunr gateway pair list show pending + paired\n * lunr gateway status config/token/session summary\n */\n\nimport { isFeatureEnabled } from \"../core/install-features.ts\";\nimport { DiscordAdapter } from \"./adapters/discord.ts\";\nimport { TelegramAdapter } from \"./adapters/telegram.ts\";\nimport { AgentBridge } from \"./agent-bridge.ts\";\nimport { handleApprovalCallback } from \"./approval.ts\";\nimport { addAllowedUser } from \"./authz.ts\";\nimport { handleCallback, startButtonSweeper, stopButtonSweeper } from \"./buttons.ts\";\nimport { botCommandSpecs } from \"./commands.ts\";\nimport {\n\ttype DiscordConfig,\n\tloadGatewayConfig,\n\ttype PlatformConfig,\n\tplatformConfigFor,\n\tresolvePlatformToken,\n\tsaveGatewayConfig,\n} from \"./config.ts\";\nimport { startGatewayCron } from \"./cron.ts\";\nimport { createPairingStore } from \"./pairing.ts\";\nimport { startGatewayPresenter, stopGatewayPresenter } from \"./presenter.ts\";\nimport { createRouter } from \"./router.ts\";\nimport { claimGateway } from \"./service.ts\";\nimport { buildSessionKey } from \"./session-keys.ts\";\nimport { listSessions } from \"./store.ts\";\nimport type { PlatformAdapter } from \"./types.ts\";\n\n/**\n * Adapter registry — the seam adapters plug into:\n *\n * ADAPTER_FACTORIES.<platform> = (cfg) => new SomeAdapter(cfg);\n *\n * A factory receives the sanitized platform config with the token already\n * resolved into cfg.token (env beats file — see resolvePlatformToken and\n * runDaemon below). The registry type is the PlatformConfig base; adapters\n * with extra fields (Discord) narrow with a cast — the daemon always passes\n * the full sanitized per-platform object.\n */\nexport const ADAPTER_FACTORIES: Record<string, (cfg: PlatformConfig) => PlatformAdapter> = {\n\ttelegram: (cfg) => new TelegramAdapter(cfg),\n\tdiscord: (cfg) => new DiscordAdapter(cfg as DiscordConfig),\n};\n\nconst KNOWN_PLATFORMS = [\"telegram\", \"discord\"] as const;\n\nconst SETUP_INSTRUCTIONS: Record<string, string[]> = {\n\ttelegram: [\"Telegram: run lunr gateway setup locally to configure the bot token and approved user ID.\"],\n\tdiscord: [\"Discord: run lunr gateway setup locally to configure the bot token and approved user ID.\"],\n};\n\nfunction printSetupInstructions(enabledButUnrunnable: string[]): void {\n\tconsole.log(\"lunR gateway: no runnable platforms configured.\");\n\tfor (const platform of enabledButUnrunnable) {\n\t\tconsole.log(` (platform \"${platform}\" is enabled but has no registered adapter or resolvable token)`);\n\t}\n\tfor (const platform of KNOWN_PLATFORMS) {\n\t\tfor (const line of SETUP_INSTRUCTIONS[platform]) {\n\t\t\tconsole.log(line);\n\t\t}\n\t}\n}\n\nasync function runPairApprove(platform: string, code: string | undefined, owner = false): Promise<number> {\n\tif (!code) {\n\t\tconsole.error(\"Usage: lunr gateway pair approve <platform> <code> [--owner]\");\n\t\treturn 1;\n\t}\n\tconst pairing = createPairingStore();\n\tconst userId = pairing.approve(platform, code);\n\tif (userId === null) {\n\t\tconsole.error(`Pairing failed: no valid pending code \"${code}\" for ${platform} (wrong, expired, or locked out).`);\n\t\treturn 1;\n\t}\n\ttry {\n\t\tif (owner) {\n\t\t\tconst cfg = loadGatewayConfig();\n\t\t\tif (platform !== \"telegram\" && platform !== \"discord\") throw new Error(\"Unknown platform.\");\n\t\t\tcfg.owners ??= { telegram: [], discord: [] };\n\t\t\tcfg.owners[platform] = [...new Set([...cfg.owners[platform], userId])];\n\t\t\tcfg[platform].allowedUsers = [...new Set([...cfg[platform].allowedUsers, userId])];\n\t\t\tsaveGatewayConfig(cfg);\n\t\t} else addAllowedUser(platform, userId);\n\t} catch (err) {\n\t\tconsole.error(`Paired ${platform} user ${userId}, but could not persist allowedUsers: ${err}`);\n\t\treturn 1;\n\t}\n\tconsole.log(`Approved ${platform} user ${userId}. Gateway access includes local projects and saved sessions.`);\n\treturn 0;\n}\n\nfunction runPairList(): number {\n\tconst pairing = createPairingStore();\n\tconst pending = pairing.listPending();\n\tconst approved = pairing.listApproved();\n\tconsole.log(\"Pending pairing codes:\");\n\tif (pending.length === 0) {\n\t\tconsole.log(\" (none)\");\n\t} else {\n\t\tfor (const p of pending) {\n\t\t\tconsole.log(` ${p.platform} ${p.code} user=${p.userId} expires ${new Date(p.expiresAt).toISOString()}`);\n\t\t}\n\t}\n\tconsole.log(\"Paired users:\");\n\tif (approved.length === 0) {\n\t\tconsole.log(\" (none)\");\n\t} else {\n\t\tfor (const u of approved) {\n\t\t\tconsole.log(` ${u.platform} ${u.userId} approved ${new Date(u.approvedAt).toISOString()}`);\n\t\t}\n\t}\n\treturn 0;\n}\n\nfunction runStatus(): number {\n\tconst cfg = loadGatewayConfig();\n\tconsole.log(\n\t\t`chat-platforms: ${isFeatureEnabled(\"chat-platforms\") ? \"enabled\" : \"disabled\"} (install-features.json)`,\n\t);\n\tconsole.log(\"lunR gateway status:\");\n\tfor (const platform of KNOWN_PLATFORMS) {\n\t\tconst platformCfg = platformConfigFor(cfg, platform);\n\t\tif (!platformCfg) continue;\n\t\tconst token = resolvePlatformToken(platform, platformCfg);\n\t\tconst adapter = ADAPTER_FACTORIES[platform] === undefined ? \"no adapter\" : \"adapter registered\";\n\t\tconsole.log(\n\t\t\t` ${platform}: ${platformCfg.enabled ? \"enabled\" : \"disabled\"} · token ${token ? \"resolved\" : \"missing\"} · ${adapter}`,\n\t\t);\n\t}\n\tconst sessions = listSessions();\n\tconsole.log(` sessions: ${Object.keys(sessions).length} stored`);\n\treturn 0;\n}\n\nasync function runDaemon(): Promise<number> {\n\tif (!isFeatureEnabled(\"chat-platforms\")) {\n\t\tconsole.error(\"lunR gateway: chat platforms are not enabled.\");\n\t\tconsole.error(\"Enable with: lunr features enable chat-platforms\");\n\t\treturn 1;\n\t}\n\tconst cfg = loadGatewayConfig();\n\tconst adapters = new Map<string, PlatformAdapter>();\n\tconst skipped: string[] = [];\n\n\tfor (const platform of KNOWN_PLATFORMS) {\n\t\tconst platformCfg = platformConfigFor(cfg, platform);\n\t\tif (!platformCfg?.enabled) continue;\n\t\tconst factory: ((cfg: PlatformConfig) => PlatformAdapter) | undefined = ADAPTER_FACTORIES[platform];\n\t\tif (factory === undefined) {\n\t\t\tskipped.push(platform);\n\t\t\tcontinue;\n\t\t}\n\t\tconst token = resolvePlatformToken(platform, platformCfg);\n\t\tif (!token) {\n\t\t\tskipped.push(platform);\n\t\t\tcontinue;\n\t\t}\n\t\tadapters.set(platform, factory({ ...platformCfg, token }));\n\t}\n\n\tif (adapters.size === 0) {\n\t\tprintSetupInstructions(skipped);\n\t\treturn 1;\n\t}\n\n\tconst pairing = createPairingStore();\n\tconst bridge = new AgentBridge();\n\tfor (const adapter of adapters.values())\n\t\tadapter.setCommandSuggestions?.(async (source, command) => {\n\t\t\tconst session = bridge.peekSession(buildSessionKey(source, loadGatewayConfig()));\n\t\t\tif (!session) return [];\n\t\t\tif (command === \"thinking\") return session.getAvailableThinkingLevels();\n\t\t\tif (command === \"model\")\n\t\t\t\treturn (await session.modelRuntime.getAvailable()).map((model) => `${model.provider}/${model.id}`);\n\t\t\treturn [];\n\t\t});\n\tconst router = createRouter({ adapters, cfg, pairing, bridge, reloadConfig: true, remoteControls: true });\n\n\tlet finish!: () => void;\n\tconst stopped = new Promise<void>((resolve) => {\n\t\tfinish = resolve;\n\t});\n\tlet stopping = false;\n\tlet cron: ReturnType<typeof startGatewayCron> | undefined;\n\tconst platformStatus: Record<string, string> = {};\n\tconst retries = new Set<ReturnType<typeof setTimeout>>();\n\tconst shutdown = () => {\n\t\tif (stopping) return;\n\t\tstopping = true;\n\t\towner.update(platformStatus, \"stopping\");\n\t\tconst cronStopped = cron?.stop();\n\t\tfor (const timer of retries) clearTimeout(timer);\n\t\tstopButtonSweeper();\n\t\tvoid (async () => {\n\t\t\tawait cronStopped;\n\t\t\tawait bridge.shutdown();\n\t\t\tawait Promise.all([...adapters.values()].map((adapter) => adapter.disconnect().catch(() => {})));\n\t\t\tstopGatewayPresenter();\n\t\t\towner.release();\n\t\t\tprocess.removeListener(\"SIGINT\", shutdown);\n\t\t\tprocess.removeListener(\"SIGTERM\", shutdown);\n\t\t\tfinish();\n\t\t})().catch((error) => {\n\t\t\tconsole.error(\"Gateway shutdown failed:\", error instanceof Error ? error.message : String(error));\n\t\t\tstopping = false;\n\t\t\towner.update(platformStatus, Object.values(platformStatus).includes(\"connected\") ? \"ready\" : \"starting\");\n\t\t\tstartButtonSweeper();\n\t\t\tcron = startGatewayCron({ adapters, cfg });\n\t\t\tfor (const [platform, adapter] of adapters)\n\t\t\t\tif (platformStatus[platform] !== \"connected\") void connect(platform, adapter);\n\t\t});\n\t};\n\tconst owner = claimGateway(shutdown);\n\tprocess.on(\"SIGINT\", shutdown);\n\tprocess.on(\"SIGTERM\", shutdown);\n\tstartGatewayPresenter(adapters);\n\tstartButtonSweeper();\n\tconst connect = async (platform: string, adapter: PlatformAdapter): Promise<void> => {\n\t\tif (stopping) return;\n\t\ttry {\n\t\t\tplatformStatus[platform] = \"connecting\";\n\t\t\towner.update(platformStatus, Object.values(platformStatus).includes(\"connected\") ? \"ready\" : \"starting\");\n\t\t\tconst ok = await adapter.connect();\n\t\t\tif (!ok) {\n\t\t\t\tthrow new Error(\"Connection failed\");\n\t\t\t}\n\t\t\tadapter.onMessage((event) => {\n\t\t\t\tvoid router.handleEvent(event);\n\t\t\t});\n\t\t\tadapter.onCallback(async (event) => {\n\t\t\t\tconst consumed = await handleApprovalCallback(event, adapter);\n\t\t\t\tif (!consumed) {\n\t\t\t\t\tvoid handleCallback(event, { adapters, cfg: loadGatewayConfig(), pairing, bridge, adapter });\n\t\t\t\t}\n\t\t\t});\n\t\t\ttry {\n\t\t\t\tawait adapter.registerCommands?.(botCommandSpecs());\n\t\t\t} catch (err) {\n\t\t\t\tconsole.error(\n\t\t\t\t\t`[gateway] ${platform}: command menu registration failed: ${err instanceof Error ? err.message : String(err)}`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (stopping) {\n\t\t\t\tawait adapter.disconnect();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tplatformStatus[platform] = \"connected\";\n\t\t\tconsole.log(`lunR gateway: ${platform} connected`);\n\t\t} catch {\n\t\t\tplatformStatus[platform] = \"disconnected, retrying (check gateway logs)\";\n\t\t\tawait adapter.disconnect().catch(() => {});\n\t\t\tif (!stopping) {\n\t\t\t\tconst retry = setTimeout(() => {\n\t\t\t\t\tretries.delete(retry);\n\t\t\t\t\tvoid connect(platform, adapter);\n\t\t\t\t}, 5000);\n\t\t\t\tretries.add(retry);\n\t\t\t}\n\t\t}\n\t\tif (!stopping)\n\t\t\towner.update(platformStatus, Object.values(platformStatus).includes(\"connected\") ? \"ready\" : \"starting\");\n\t};\n\tfor (const [platform, adapter] of adapters) void connect(platform, adapter);\n\n\t// Phase 4: cron jobs fire inside the daemon and deliver back to chats.\n\t// Starts even with zero stored jobs — jobs can be created later from chats.\n\tcron = startGatewayCron({ adapters, cfg });\n\tconsole.log(`lunR gateway: cron scheduler started (${cron.intervalMs / 1000}s interval)`);\n\n\towner.update(platformStatus, \"starting\");\n\tawait stopped;\n\treturn 0;\n}\n\nexport async function runGateway(args: string[]): Promise<number> {\n\tconst [sub, ...rest] = args;\n\tif (sub === \"pair\") {\n\t\tconst [action, platform, code, flag] = rest;\n\t\tif (action === \"approve\" && platform && (flag === undefined || flag === \"--owner\"))\n\t\t\treturn runPairApprove(platform, code, flag === \"--owner\");\n\t\tif (action === \"list\") return runPairList();\n\t\tconsole.error(\"Usage: lunr gateway pair approve <platform> <code> [--owner] | lunr gateway pair list\");\n\t\treturn 1;\n\t}\n\tif (sub === \"status\") return runStatus();\n\tif (sub === undefined) return runDaemon();\n\tconsole.error(`Unknown gateway sub-command \"${sub}\". Expected: pair approve | pair list | status`);\n\treturn 1;\n}\n"]}
@@ -187,11 +187,12 @@ async function runDaemon() {
187
187
  return;
188
188
  stopping = true;
189
189
  owner.update(platformStatus, "stopping");
190
- cron?.stop();
190
+ const cronStopped = cron?.stop();
191
191
  for (const timer of retries)
192
192
  clearTimeout(timer);
193
193
  stopButtonSweeper();
194
194
  void (async () => {
195
+ await cronStopped;
195
196
  await bridge.shutdown();
196
197
  await Promise.all([...adapters.values()].map((adapter) => adapter.disconnect().catch(() => { })));
197
198
  stopGatewayPresenter();
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/gateway/index.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * lunR: gateway daemon entry (Phase 2a skeleton; Phase 2b registered the\n * Telegram adapter, Phase 3 the Discord adapter — both via ADAPTER_FACTORIES).\n *\n * `lunr gateway` runs the daemon: load gateway.json, instantiate every\n * enabled platform that has a registered adapter factory AND a resolvable\n * token, connect, route messages, and stay alive until SIGINT/SIGTERM.\n * With no runnable adapters it prints per-platform setup instructions and\n * exits 1.\n *\n * Sub-commands:\n * lunr gateway pair approve <platform> <code> approve a pairing code\n * lunr gateway pair list show pending + paired\n * lunr gateway status config/token/session summary\n */\n\nimport { isFeatureEnabled } from \"../core/install-features.ts\";\nimport { DiscordAdapter } from \"./adapters/discord.ts\";\nimport { TelegramAdapter } from \"./adapters/telegram.ts\";\nimport { AgentBridge } from \"./agent-bridge.ts\";\nimport { handleApprovalCallback } from \"./approval.ts\";\nimport { addAllowedUser } from \"./authz.ts\";\nimport { handleCallback, startButtonSweeper, stopButtonSweeper } from \"./buttons.ts\";\nimport { botCommandSpecs } from \"./commands.ts\";\nimport {\n\ttype DiscordConfig,\n\tloadGatewayConfig,\n\ttype PlatformConfig,\n\tplatformConfigFor,\n\tresolvePlatformToken,\n\tsaveGatewayConfig,\n} from \"./config.ts\";\nimport { startGatewayCron } from \"./cron.ts\";\nimport { createPairingStore } from \"./pairing.ts\";\nimport { startGatewayPresenter, stopGatewayPresenter } from \"./presenter.ts\";\nimport { createRouter } from \"./router.ts\";\nimport { claimGateway } from \"./service.ts\";\nimport { buildSessionKey } from \"./session-keys.ts\";\nimport { listSessions } from \"./store.ts\";\nimport type { PlatformAdapter } from \"./types.ts\";\n\n/**\n * Adapter registry — the seam adapters plug into:\n *\n * ADAPTER_FACTORIES.<platform> = (cfg) => new SomeAdapter(cfg);\n *\n * A factory receives the sanitized platform config with the token already\n * resolved into cfg.token (env beats file — see resolvePlatformToken and\n * runDaemon below). The registry type is the PlatformConfig base; adapters\n * with extra fields (Discord) narrow with a cast — the daemon always passes\n * the full sanitized per-platform object.\n */\nexport const ADAPTER_FACTORIES: Record<string, (cfg: PlatformConfig) => PlatformAdapter> = {\n\ttelegram: (cfg) => new TelegramAdapter(cfg),\n\tdiscord: (cfg) => new DiscordAdapter(cfg as DiscordConfig),\n};\n\nconst KNOWN_PLATFORMS = [\"telegram\", \"discord\"] as const;\n\nconst SETUP_INSTRUCTIONS: Record<string, string[]> = {\n\ttelegram: [\"Telegram: run lunr gateway setup locally to configure the bot token and approved user ID.\"],\n\tdiscord: [\"Discord: run lunr gateway setup locally to configure the bot token and approved user ID.\"],\n};\n\nfunction printSetupInstructions(enabledButUnrunnable: string[]): void {\n\tconsole.log(\"lunR gateway: no runnable platforms configured.\");\n\tfor (const platform of enabledButUnrunnable) {\n\t\tconsole.log(` (platform \"${platform}\" is enabled but has no registered adapter or resolvable token)`);\n\t}\n\tfor (const platform of KNOWN_PLATFORMS) {\n\t\tfor (const line of SETUP_INSTRUCTIONS[platform]) {\n\t\t\tconsole.log(line);\n\t\t}\n\t}\n}\n\nasync function runPairApprove(platform: string, code: string | undefined, owner = false): Promise<number> {\n\tif (!code) {\n\t\tconsole.error(\"Usage: lunr gateway pair approve <platform> <code> [--owner]\");\n\t\treturn 1;\n\t}\n\tconst pairing = createPairingStore();\n\tconst userId = pairing.approve(platform, code);\n\tif (userId === null) {\n\t\tconsole.error(`Pairing failed: no valid pending code \"${code}\" for ${platform} (wrong, expired, or locked out).`);\n\t\treturn 1;\n\t}\n\ttry {\n\t\tif (owner) {\n\t\t\tconst cfg = loadGatewayConfig();\n\t\t\tif (platform !== \"telegram\" && platform !== \"discord\") throw new Error(\"Unknown platform.\");\n\t\t\tcfg.owners ??= { telegram: [], discord: [] };\n\t\t\tcfg.owners[platform] = [...new Set([...cfg.owners[platform], userId])];\n\t\t\tcfg[platform].allowedUsers = [...new Set([...cfg[platform].allowedUsers, userId])];\n\t\t\tsaveGatewayConfig(cfg);\n\t\t} else addAllowedUser(platform, userId);\n\t} catch (err) {\n\t\tconsole.error(`Paired ${platform} user ${userId}, but could not persist allowedUsers: ${err}`);\n\t\treturn 1;\n\t}\n\tconsole.log(`Approved ${platform} user ${userId}. Gateway access includes local projects and saved sessions.`);\n\treturn 0;\n}\n\nfunction runPairList(): number {\n\tconst pairing = createPairingStore();\n\tconst pending = pairing.listPending();\n\tconst approved = pairing.listApproved();\n\tconsole.log(\"Pending pairing codes:\");\n\tif (pending.length === 0) {\n\t\tconsole.log(\" (none)\");\n\t} else {\n\t\tfor (const p of pending) {\n\t\t\tconsole.log(` ${p.platform} ${p.code} user=${p.userId} expires ${new Date(p.expiresAt).toISOString()}`);\n\t\t}\n\t}\n\tconsole.log(\"Paired users:\");\n\tif (approved.length === 0) {\n\t\tconsole.log(\" (none)\");\n\t} else {\n\t\tfor (const u of approved) {\n\t\t\tconsole.log(` ${u.platform} ${u.userId} approved ${new Date(u.approvedAt).toISOString()}`);\n\t\t}\n\t}\n\treturn 0;\n}\n\nfunction runStatus(): number {\n\tconst cfg = loadGatewayConfig();\n\tconsole.log(\n\t\t`chat-platforms: ${isFeatureEnabled(\"chat-platforms\") ? \"enabled\" : \"disabled\"} (install-features.json)`,\n\t);\n\tconsole.log(\"lunR gateway status:\");\n\tfor (const platform of KNOWN_PLATFORMS) {\n\t\tconst platformCfg = platformConfigFor(cfg, platform);\n\t\tif (!platformCfg) continue;\n\t\tconst token = resolvePlatformToken(platform, platformCfg);\n\t\tconst adapter = ADAPTER_FACTORIES[platform] === undefined ? \"no adapter\" : \"adapter registered\";\n\t\tconsole.log(\n\t\t\t` ${platform}: ${platformCfg.enabled ? \"enabled\" : \"disabled\"} · token ${token ? \"resolved\" : \"missing\"} · ${adapter}`,\n\t\t);\n\t}\n\tconst sessions = listSessions();\n\tconsole.log(` sessions: ${Object.keys(sessions).length} stored`);\n\treturn 0;\n}\n\nasync function runDaemon(): Promise<number> {\n\tif (!isFeatureEnabled(\"chat-platforms\")) {\n\t\tconsole.error(\"lunR gateway: chat platforms are not enabled.\");\n\t\tconsole.error(\"Enable with: lunr features enable chat-platforms\");\n\t\treturn 1;\n\t}\n\tconst cfg = loadGatewayConfig();\n\tconst adapters = new Map<string, PlatformAdapter>();\n\tconst skipped: string[] = [];\n\n\tfor (const platform of KNOWN_PLATFORMS) {\n\t\tconst platformCfg = platformConfigFor(cfg, platform);\n\t\tif (!platformCfg?.enabled) continue;\n\t\tconst factory: ((cfg: PlatformConfig) => PlatformAdapter) | undefined = ADAPTER_FACTORIES[platform];\n\t\tif (factory === undefined) {\n\t\t\tskipped.push(platform);\n\t\t\tcontinue;\n\t\t}\n\t\tconst token = resolvePlatformToken(platform, platformCfg);\n\t\tif (!token) {\n\t\t\tskipped.push(platform);\n\t\t\tcontinue;\n\t\t}\n\t\tadapters.set(platform, factory({ ...platformCfg, token }));\n\t}\n\n\tif (adapters.size === 0) {\n\t\tprintSetupInstructions(skipped);\n\t\treturn 1;\n\t}\n\n\tconst pairing = createPairingStore();\n\tconst bridge = new AgentBridge();\n\tfor (const adapter of adapters.values())\n\t\tadapter.setCommandSuggestions?.(async (source, command) => {\n\t\t\tconst session = bridge.peekSession(buildSessionKey(source, loadGatewayConfig()));\n\t\t\tif (!session) return [];\n\t\t\tif (command === \"thinking\") return session.getAvailableThinkingLevels();\n\t\t\tif (command === \"model\")\n\t\t\t\treturn (await session.modelRuntime.getAvailable()).map((model) => `${model.provider}/${model.id}`);\n\t\t\treturn [];\n\t\t});\n\tconst router = createRouter({ adapters, cfg, pairing, bridge, reloadConfig: true, remoteControls: true });\n\n\tlet finish!: () => void;\n\tconst stopped = new Promise<void>((resolve) => {\n\t\tfinish = resolve;\n\t});\n\tlet stopping = false;\n\tlet cron: ReturnType<typeof startGatewayCron> | undefined;\n\tconst platformStatus: Record<string, string> = {};\n\tconst retries = new Set<ReturnType<typeof setTimeout>>();\n\tconst shutdown = () => {\n\t\tif (stopping) return;\n\t\tstopping = true;\n\t\towner.update(platformStatus, \"stopping\");\n\t\tcron?.stop();\n\t\tfor (const timer of retries) clearTimeout(timer);\n\t\tstopButtonSweeper();\n\t\tvoid (async () => {\n\t\t\tawait bridge.shutdown();\n\t\t\tawait Promise.all([...adapters.values()].map((adapter) => adapter.disconnect().catch(() => {})));\n\t\t\tstopGatewayPresenter();\n\t\t\towner.release();\n\t\t\tprocess.removeListener(\"SIGINT\", shutdown);\n\t\t\tprocess.removeListener(\"SIGTERM\", shutdown);\n\t\t\tfinish();\n\t\t})().catch((error) => {\n\t\t\tconsole.error(\"Gateway shutdown failed:\", error instanceof Error ? error.message : String(error));\n\t\t\tstopping = false;\n\t\t\towner.update(platformStatus, Object.values(platformStatus).includes(\"connected\") ? \"ready\" : \"starting\");\n\t\t\tstartButtonSweeper();\n\t\t\tcron = startGatewayCron({ adapters, cfg });\n\t\t\tfor (const [platform, adapter] of adapters)\n\t\t\t\tif (platformStatus[platform] !== \"connected\") void connect(platform, adapter);\n\t\t});\n\t};\n\tconst owner = claimGateway(shutdown);\n\tprocess.on(\"SIGINT\", shutdown);\n\tprocess.on(\"SIGTERM\", shutdown);\n\tstartGatewayPresenter(adapters);\n\tstartButtonSweeper();\n\tconst connect = async (platform: string, adapter: PlatformAdapter): Promise<void> => {\n\t\tif (stopping) return;\n\t\ttry {\n\t\t\tplatformStatus[platform] = \"connecting\";\n\t\t\towner.update(platformStatus, Object.values(platformStatus).includes(\"connected\") ? \"ready\" : \"starting\");\n\t\t\tconst ok = await adapter.connect();\n\t\t\tif (!ok) {\n\t\t\t\tthrow new Error(\"Connection failed\");\n\t\t\t}\n\t\t\tadapter.onMessage((event) => {\n\t\t\t\tvoid router.handleEvent(event);\n\t\t\t});\n\t\t\tadapter.onCallback(async (event) => {\n\t\t\t\tconst consumed = await handleApprovalCallback(event, adapter);\n\t\t\t\tif (!consumed) {\n\t\t\t\t\tvoid handleCallback(event, { adapters, cfg: loadGatewayConfig(), pairing, bridge, adapter });\n\t\t\t\t}\n\t\t\t});\n\t\t\ttry {\n\t\t\t\tawait adapter.registerCommands?.(botCommandSpecs());\n\t\t\t} catch (err) {\n\t\t\t\tconsole.error(\n\t\t\t\t\t`[gateway] ${platform}: command menu registration failed: ${err instanceof Error ? err.message : String(err)}`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (stopping) {\n\t\t\t\tawait adapter.disconnect();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tplatformStatus[platform] = \"connected\";\n\t\t\tconsole.log(`lunR gateway: ${platform} connected`);\n\t\t} catch {\n\t\t\tplatformStatus[platform] = \"disconnected, retrying (check gateway logs)\";\n\t\t\tawait adapter.disconnect().catch(() => {});\n\t\t\tif (!stopping) {\n\t\t\t\tconst retry = setTimeout(() => {\n\t\t\t\t\tretries.delete(retry);\n\t\t\t\t\tvoid connect(platform, adapter);\n\t\t\t\t}, 5000);\n\t\t\t\tretries.add(retry);\n\t\t\t}\n\t\t}\n\t\tif (!stopping)\n\t\t\towner.update(platformStatus, Object.values(platformStatus).includes(\"connected\") ? \"ready\" : \"starting\");\n\t};\n\tfor (const [platform, adapter] of adapters) void connect(platform, adapter);\n\n\t// Phase 4: cron jobs fire inside the daemon and deliver back to chats.\n\t// Starts even with zero stored jobs — jobs can be created later from chats.\n\tcron = startGatewayCron({ adapters, cfg });\n\tconsole.log(`lunR gateway: cron scheduler started (${cron.intervalMs / 1000}s interval)`);\n\n\towner.update(platformStatus, \"starting\");\n\tawait stopped;\n\treturn 0;\n}\n\nexport async function runGateway(args: string[]): Promise<number> {\n\tconst [sub, ...rest] = args;\n\tif (sub === \"pair\") {\n\t\tconst [action, platform, code, flag] = rest;\n\t\tif (action === \"approve\" && platform && (flag === undefined || flag === \"--owner\"))\n\t\t\treturn runPairApprove(platform, code, flag === \"--owner\");\n\t\tif (action === \"list\") return runPairList();\n\t\tconsole.error(\"Usage: lunr gateway pair approve <platform> <code> [--owner] | lunr gateway pair list\");\n\t\treturn 1;\n\t}\n\tif (sub === \"status\") return runStatus();\n\tif (sub === undefined) return runDaemon();\n\tconsole.error(`Unknown gateway sub-command \"${sub}\". Expected: pair approve | pair list | status`);\n\treturn 1;\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/gateway/index.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * lunR: gateway daemon entry (Phase 2a skeleton; Phase 2b registered the\n * Telegram adapter, Phase 3 the Discord adapter — both via ADAPTER_FACTORIES).\n *\n * `lunr gateway` runs the daemon: load gateway.json, instantiate every\n * enabled platform that has a registered adapter factory AND a resolvable\n * token, connect, route messages, and stay alive until SIGINT/SIGTERM.\n * With no runnable adapters it prints per-platform setup instructions and\n * exits 1.\n *\n * Sub-commands:\n * lunr gateway pair approve <platform> <code> approve a pairing code\n * lunr gateway pair list show pending + paired\n * lunr gateway status config/token/session summary\n */\n\nimport { isFeatureEnabled } from \"../core/install-features.ts\";\nimport { DiscordAdapter } from \"./adapters/discord.ts\";\nimport { TelegramAdapter } from \"./adapters/telegram.ts\";\nimport { AgentBridge } from \"./agent-bridge.ts\";\nimport { handleApprovalCallback } from \"./approval.ts\";\nimport { addAllowedUser } from \"./authz.ts\";\nimport { handleCallback, startButtonSweeper, stopButtonSweeper } from \"./buttons.ts\";\nimport { botCommandSpecs } from \"./commands.ts\";\nimport {\n\ttype DiscordConfig,\n\tloadGatewayConfig,\n\ttype PlatformConfig,\n\tplatformConfigFor,\n\tresolvePlatformToken,\n\tsaveGatewayConfig,\n} from \"./config.ts\";\nimport { startGatewayCron } from \"./cron.ts\";\nimport { createPairingStore } from \"./pairing.ts\";\nimport { startGatewayPresenter, stopGatewayPresenter } from \"./presenter.ts\";\nimport { createRouter } from \"./router.ts\";\nimport { claimGateway } from \"./service.ts\";\nimport { buildSessionKey } from \"./session-keys.ts\";\nimport { listSessions } from \"./store.ts\";\nimport type { PlatformAdapter } from \"./types.ts\";\n\n/**\n * Adapter registry — the seam adapters plug into:\n *\n * ADAPTER_FACTORIES.<platform> = (cfg) => new SomeAdapter(cfg);\n *\n * A factory receives the sanitized platform config with the token already\n * resolved into cfg.token (env beats file — see resolvePlatformToken and\n * runDaemon below). The registry type is the PlatformConfig base; adapters\n * with extra fields (Discord) narrow with a cast — the daemon always passes\n * the full sanitized per-platform object.\n */\nexport const ADAPTER_FACTORIES: Record<string, (cfg: PlatformConfig) => PlatformAdapter> = {\n\ttelegram: (cfg) => new TelegramAdapter(cfg),\n\tdiscord: (cfg) => new DiscordAdapter(cfg as DiscordConfig),\n};\n\nconst KNOWN_PLATFORMS = [\"telegram\", \"discord\"] as const;\n\nconst SETUP_INSTRUCTIONS: Record<string, string[]> = {\n\ttelegram: [\"Telegram: run lunr gateway setup locally to configure the bot token and approved user ID.\"],\n\tdiscord: [\"Discord: run lunr gateway setup locally to configure the bot token and approved user ID.\"],\n};\n\nfunction printSetupInstructions(enabledButUnrunnable: string[]): void {\n\tconsole.log(\"lunR gateway: no runnable platforms configured.\");\n\tfor (const platform of enabledButUnrunnable) {\n\t\tconsole.log(` (platform \"${platform}\" is enabled but has no registered adapter or resolvable token)`);\n\t}\n\tfor (const platform of KNOWN_PLATFORMS) {\n\t\tfor (const line of SETUP_INSTRUCTIONS[platform]) {\n\t\t\tconsole.log(line);\n\t\t}\n\t}\n}\n\nasync function runPairApprove(platform: string, code: string | undefined, owner = false): Promise<number> {\n\tif (!code) {\n\t\tconsole.error(\"Usage: lunr gateway pair approve <platform> <code> [--owner]\");\n\t\treturn 1;\n\t}\n\tconst pairing = createPairingStore();\n\tconst userId = pairing.approve(platform, code);\n\tif (userId === null) {\n\t\tconsole.error(`Pairing failed: no valid pending code \"${code}\" for ${platform} (wrong, expired, or locked out).`);\n\t\treturn 1;\n\t}\n\ttry {\n\t\tif (owner) {\n\t\t\tconst cfg = loadGatewayConfig();\n\t\t\tif (platform !== \"telegram\" && platform !== \"discord\") throw new Error(\"Unknown platform.\");\n\t\t\tcfg.owners ??= { telegram: [], discord: [] };\n\t\t\tcfg.owners[platform] = [...new Set([...cfg.owners[platform], userId])];\n\t\t\tcfg[platform].allowedUsers = [...new Set([...cfg[platform].allowedUsers, userId])];\n\t\t\tsaveGatewayConfig(cfg);\n\t\t} else addAllowedUser(platform, userId);\n\t} catch (err) {\n\t\tconsole.error(`Paired ${platform} user ${userId}, but could not persist allowedUsers: ${err}`);\n\t\treturn 1;\n\t}\n\tconsole.log(`Approved ${platform} user ${userId}. Gateway access includes local projects and saved sessions.`);\n\treturn 0;\n}\n\nfunction runPairList(): number {\n\tconst pairing = createPairingStore();\n\tconst pending = pairing.listPending();\n\tconst approved = pairing.listApproved();\n\tconsole.log(\"Pending pairing codes:\");\n\tif (pending.length === 0) {\n\t\tconsole.log(\" (none)\");\n\t} else {\n\t\tfor (const p of pending) {\n\t\t\tconsole.log(` ${p.platform} ${p.code} user=${p.userId} expires ${new Date(p.expiresAt).toISOString()}`);\n\t\t}\n\t}\n\tconsole.log(\"Paired users:\");\n\tif (approved.length === 0) {\n\t\tconsole.log(\" (none)\");\n\t} else {\n\t\tfor (const u of approved) {\n\t\t\tconsole.log(` ${u.platform} ${u.userId} approved ${new Date(u.approvedAt).toISOString()}`);\n\t\t}\n\t}\n\treturn 0;\n}\n\nfunction runStatus(): number {\n\tconst cfg = loadGatewayConfig();\n\tconsole.log(\n\t\t`chat-platforms: ${isFeatureEnabled(\"chat-platforms\") ? \"enabled\" : \"disabled\"} (install-features.json)`,\n\t);\n\tconsole.log(\"lunR gateway status:\");\n\tfor (const platform of KNOWN_PLATFORMS) {\n\t\tconst platformCfg = platformConfigFor(cfg, platform);\n\t\tif (!platformCfg) continue;\n\t\tconst token = resolvePlatformToken(platform, platformCfg);\n\t\tconst adapter = ADAPTER_FACTORIES[platform] === undefined ? \"no adapter\" : \"adapter registered\";\n\t\tconsole.log(\n\t\t\t` ${platform}: ${platformCfg.enabled ? \"enabled\" : \"disabled\"} · token ${token ? \"resolved\" : \"missing\"} · ${adapter}`,\n\t\t);\n\t}\n\tconst sessions = listSessions();\n\tconsole.log(` sessions: ${Object.keys(sessions).length} stored`);\n\treturn 0;\n}\n\nasync function runDaemon(): Promise<number> {\n\tif (!isFeatureEnabled(\"chat-platforms\")) {\n\t\tconsole.error(\"lunR gateway: chat platforms are not enabled.\");\n\t\tconsole.error(\"Enable with: lunr features enable chat-platforms\");\n\t\treturn 1;\n\t}\n\tconst cfg = loadGatewayConfig();\n\tconst adapters = new Map<string, PlatformAdapter>();\n\tconst skipped: string[] = [];\n\n\tfor (const platform of KNOWN_PLATFORMS) {\n\t\tconst platformCfg = platformConfigFor(cfg, platform);\n\t\tif (!platformCfg?.enabled) continue;\n\t\tconst factory: ((cfg: PlatformConfig) => PlatformAdapter) | undefined = ADAPTER_FACTORIES[platform];\n\t\tif (factory === undefined) {\n\t\t\tskipped.push(platform);\n\t\t\tcontinue;\n\t\t}\n\t\tconst token = resolvePlatformToken(platform, platformCfg);\n\t\tif (!token) {\n\t\t\tskipped.push(platform);\n\t\t\tcontinue;\n\t\t}\n\t\tadapters.set(platform, factory({ ...platformCfg, token }));\n\t}\n\n\tif (adapters.size === 0) {\n\t\tprintSetupInstructions(skipped);\n\t\treturn 1;\n\t}\n\n\tconst pairing = createPairingStore();\n\tconst bridge = new AgentBridge();\n\tfor (const adapter of adapters.values())\n\t\tadapter.setCommandSuggestions?.(async (source, command) => {\n\t\t\tconst session = bridge.peekSession(buildSessionKey(source, loadGatewayConfig()));\n\t\t\tif (!session) return [];\n\t\t\tif (command === \"thinking\") return session.getAvailableThinkingLevels();\n\t\t\tif (command === \"model\")\n\t\t\t\treturn (await session.modelRuntime.getAvailable()).map((model) => `${model.provider}/${model.id}`);\n\t\t\treturn [];\n\t\t});\n\tconst router = createRouter({ adapters, cfg, pairing, bridge, reloadConfig: true, remoteControls: true });\n\n\tlet finish!: () => void;\n\tconst stopped = new Promise<void>((resolve) => {\n\t\tfinish = resolve;\n\t});\n\tlet stopping = false;\n\tlet cron: ReturnType<typeof startGatewayCron> | undefined;\n\tconst platformStatus: Record<string, string> = {};\n\tconst retries = new Set<ReturnType<typeof setTimeout>>();\n\tconst shutdown = () => {\n\t\tif (stopping) return;\n\t\tstopping = true;\n\t\towner.update(platformStatus, \"stopping\");\n\t\tconst cronStopped = cron?.stop();\n\t\tfor (const timer of retries) clearTimeout(timer);\n\t\tstopButtonSweeper();\n\t\tvoid (async () => {\n\t\t\tawait cronStopped;\n\t\t\tawait bridge.shutdown();\n\t\t\tawait Promise.all([...adapters.values()].map((adapter) => adapter.disconnect().catch(() => {})));\n\t\t\tstopGatewayPresenter();\n\t\t\towner.release();\n\t\t\tprocess.removeListener(\"SIGINT\", shutdown);\n\t\t\tprocess.removeListener(\"SIGTERM\", shutdown);\n\t\t\tfinish();\n\t\t})().catch((error) => {\n\t\t\tconsole.error(\"Gateway shutdown failed:\", error instanceof Error ? error.message : String(error));\n\t\t\tstopping = false;\n\t\t\towner.update(platformStatus, Object.values(platformStatus).includes(\"connected\") ? \"ready\" : \"starting\");\n\t\t\tstartButtonSweeper();\n\t\t\tcron = startGatewayCron({ adapters, cfg });\n\t\t\tfor (const [platform, adapter] of adapters)\n\t\t\t\tif (platformStatus[platform] !== \"connected\") void connect(platform, adapter);\n\t\t});\n\t};\n\tconst owner = claimGateway(shutdown);\n\tprocess.on(\"SIGINT\", shutdown);\n\tprocess.on(\"SIGTERM\", shutdown);\n\tstartGatewayPresenter(adapters);\n\tstartButtonSweeper();\n\tconst connect = async (platform: string, adapter: PlatformAdapter): Promise<void> => {\n\t\tif (stopping) return;\n\t\ttry {\n\t\t\tplatformStatus[platform] = \"connecting\";\n\t\t\towner.update(platformStatus, Object.values(platformStatus).includes(\"connected\") ? \"ready\" : \"starting\");\n\t\t\tconst ok = await adapter.connect();\n\t\t\tif (!ok) {\n\t\t\t\tthrow new Error(\"Connection failed\");\n\t\t\t}\n\t\t\tadapter.onMessage((event) => {\n\t\t\t\tvoid router.handleEvent(event);\n\t\t\t});\n\t\t\tadapter.onCallback(async (event) => {\n\t\t\t\tconst consumed = await handleApprovalCallback(event, adapter);\n\t\t\t\tif (!consumed) {\n\t\t\t\t\tvoid handleCallback(event, { adapters, cfg: loadGatewayConfig(), pairing, bridge, adapter });\n\t\t\t\t}\n\t\t\t});\n\t\t\ttry {\n\t\t\t\tawait adapter.registerCommands?.(botCommandSpecs());\n\t\t\t} catch (err) {\n\t\t\t\tconsole.error(\n\t\t\t\t\t`[gateway] ${platform}: command menu registration failed: ${err instanceof Error ? err.message : String(err)}`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (stopping) {\n\t\t\t\tawait adapter.disconnect();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tplatformStatus[platform] = \"connected\";\n\t\t\tconsole.log(`lunR gateway: ${platform} connected`);\n\t\t} catch {\n\t\t\tplatformStatus[platform] = \"disconnected, retrying (check gateway logs)\";\n\t\t\tawait adapter.disconnect().catch(() => {});\n\t\t\tif (!stopping) {\n\t\t\t\tconst retry = setTimeout(() => {\n\t\t\t\t\tretries.delete(retry);\n\t\t\t\t\tvoid connect(platform, adapter);\n\t\t\t\t}, 5000);\n\t\t\t\tretries.add(retry);\n\t\t\t}\n\t\t}\n\t\tif (!stopping)\n\t\t\towner.update(platformStatus, Object.values(platformStatus).includes(\"connected\") ? \"ready\" : \"starting\");\n\t};\n\tfor (const [platform, adapter] of adapters) void connect(platform, adapter);\n\n\t// Phase 4: cron jobs fire inside the daemon and deliver back to chats.\n\t// Starts even with zero stored jobs — jobs can be created later from chats.\n\tcron = startGatewayCron({ adapters, cfg });\n\tconsole.log(`lunR gateway: cron scheduler started (${cron.intervalMs / 1000}s interval)`);\n\n\towner.update(platformStatus, \"starting\");\n\tawait stopped;\n\treturn 0;\n}\n\nexport async function runGateway(args: string[]): Promise<number> {\n\tconst [sub, ...rest] = args;\n\tif (sub === \"pair\") {\n\t\tconst [action, platform, code, flag] = rest;\n\t\tif (action === \"approve\" && platform && (flag === undefined || flag === \"--owner\"))\n\t\t\treturn runPairApprove(platform, code, flag === \"--owner\");\n\t\tif (action === \"list\") return runPairList();\n\t\tconsole.error(\"Usage: lunr gateway pair approve <platform> <code> [--owner] | lunr gateway pair list\");\n\t\treturn 1;\n\t}\n\tif (sub === \"status\") return runStatus();\n\tif (sub === undefined) return runDaemon();\n\tconsole.error(`Unknown gateway sub-command \"${sub}\". Expected: pair approve | pair list | status`);\n\treturn 1;\n}\n"]}
@@ -12,6 +12,7 @@ export declare const FORWARDED_COMMANDS: {
12
12
  export declare function resolveWithinRoots(path: string, roots: string[]): string;
13
13
  export declare function createProjectFolder(parent: string, name: string, roots: string[]): string;
14
14
  interface MobileContext {
15
+ pickerGeneration?: number;
15
16
  key: string;
16
17
  event: MessageEvent;
17
18
  adapter: PlatformAdapter;