@ashx-j/lunr 0.2.21 → 0.2.22

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 (438) hide show
  1. package/CHANGELOG.md +1 -1
  2. package/README.md +20 -4
  3. package/dist/builtin-extensions/index.d.ts.map +1 -1
  4. package/dist/builtin-extensions/index.js +1 -0
  5. package/dist/builtin-extensions/index.js.map +1 -1
  6. package/dist/builtin-extensions/lunr-browser.d.ts +3 -0
  7. package/dist/builtin-extensions/lunr-browser.d.ts.map +1 -0
  8. package/dist/builtin-extensions/lunr-browser.js +56 -0
  9. package/dist/builtin-extensions/lunr-browser.js.map +1 -0
  10. package/dist/builtin-extensions/lunr-todos.d.ts.map +1 -1
  11. package/dist/builtin-extensions/lunr-todos.js +15 -0
  12. package/dist/builtin-extensions/lunr-todos.js.map +1 -1
  13. package/dist/builtin-extensions/pi-intercom/index.d.ts.map +1 -1
  14. package/dist/builtin-extensions/pi-intercom/index.js +3 -0
  15. package/dist/builtin-extensions/pi-intercom/index.js.map +1 -1
  16. package/dist/builtin-extensions/pi-subagents/src/extension/control-notices.d.ts +1 -1
  17. package/dist/builtin-extensions/pi-subagents/src/extension/control-notices.d.ts.map +1 -1
  18. package/dist/builtin-extensions/pi-subagents/src/extension/control-notices.js +5 -1
  19. package/dist/builtin-extensions/pi-subagents/src/extension/control-notices.js.map +1 -1
  20. package/dist/builtin-extensions/pi-subagents/src/extension/index.d.ts +2 -2
  21. package/dist/builtin-extensions/pi-subagents/src/extension/index.d.ts.map +1 -1
  22. package/dist/builtin-extensions/pi-subagents/src/extension/index.js +18 -5
  23. package/dist/builtin-extensions/pi-subagents/src/extension/index.js.map +1 -1
  24. package/dist/builtin-extensions/pi-subagents/src/extension/tool-description.d.ts +4 -3
  25. package/dist/builtin-extensions/pi-subagents/src/extension/tool-description.d.ts.map +1 -1
  26. package/dist/builtin-extensions/pi-subagents/src/extension/tool-description.js +3 -0
  27. package/dist/builtin-extensions/pi-subagents/src/extension/tool-description.js.map +1 -1
  28. package/dist/builtin-extensions/pi-subagents/src/intercom/communication.d.ts +17 -0
  29. package/dist/builtin-extensions/pi-subagents/src/intercom/communication.d.ts.map +1 -0
  30. package/dist/builtin-extensions/pi-subagents/src/intercom/communication.js +45 -0
  31. package/dist/builtin-extensions/pi-subagents/src/intercom/communication.js.map +1 -0
  32. package/dist/builtin-extensions/pi-subagents/src/intercom/intercom-bridge.d.ts.map +1 -1
  33. package/dist/builtin-extensions/pi-subagents/src/intercom/intercom-bridge.js +4 -11
  34. package/dist/builtin-extensions/pi-subagents/src/intercom/intercom-bridge.js.map +1 -1
  35. package/dist/builtin-extensions/pi-subagents/src/intercom/native-supervisor-channel.d.ts +4 -1
  36. package/dist/builtin-extensions/pi-subagents/src/intercom/native-supervisor-channel.d.ts.map +1 -1
  37. package/dist/builtin-extensions/pi-subagents/src/intercom/native-supervisor-channel.js +160 -51
  38. package/dist/builtin-extensions/pi-subagents/src/intercom/native-supervisor-channel.js.map +1 -1
  39. package/dist/builtin-extensions/pi-subagents/src/intercom/supervisor-ask.d.ts.map +1 -1
  40. package/dist/builtin-extensions/pi-subagents/src/intercom/supervisor-ask.js +5 -0
  41. package/dist/builtin-extensions/pi-subagents/src/intercom/supervisor-ask.js.map +1 -1
  42. package/dist/builtin-extensions/pi-subagents/src/intercom/supervisor-questions.d.ts +2 -0
  43. package/dist/builtin-extensions/pi-subagents/src/intercom/supervisor-questions.d.ts.map +1 -1
  44. package/dist/builtin-extensions/pi-subagents/src/intercom/supervisor-questions.js +3 -2
  45. package/dist/builtin-extensions/pi-subagents/src/intercom/supervisor-questions.js.map +1 -1
  46. package/dist/builtin-extensions/pi-subagents/src/runs/background/auto-drain.d.ts +1 -0
  47. package/dist/builtin-extensions/pi-subagents/src/runs/background/auto-drain.d.ts.map +1 -1
  48. package/dist/builtin-extensions/pi-subagents/src/runs/background/auto-drain.js +2 -1
  49. package/dist/builtin-extensions/pi-subagents/src/runs/background/auto-drain.js.map +1 -1
  50. package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-wait.d.ts +1 -0
  51. package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-wait.d.ts.map +1 -1
  52. package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-wait.js +2 -0
  53. package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-wait.js.map +1 -1
  54. package/dist/builtin-extensions/pi-subagents/src/runs/shared/pi-args.d.ts.map +1 -1
  55. package/dist/builtin-extensions/pi-subagents/src/runs/shared/pi-args.js +3 -0
  56. package/dist/builtin-extensions/pi-subagents/src/runs/shared/pi-args.js.map +1 -1
  57. package/dist/builtin-extensions/pi-subagents/src/runs/shared/subagent-control.d.ts +1 -0
  58. package/dist/builtin-extensions/pi-subagents/src/runs/shared/subagent-control.d.ts.map +1 -1
  59. package/dist/builtin-extensions/pi-subagents/src/runs/shared/subagent-control.js +3 -0
  60. package/dist/builtin-extensions/pi-subagents/src/runs/shared/subagent-control.js.map +1 -1
  61. package/dist/builtin-extensions/pi-subagents/src/runs/shared/subagent-prompt-runtime.d.ts.map +1 -1
  62. package/dist/builtin-extensions/pi-subagents/src/runs/shared/subagent-prompt-runtime.js +1 -1
  63. package/dist/builtin-extensions/pi-subagents/src/runs/shared/subagent-prompt-runtime.js.map +1 -1
  64. package/dist/builtin-extensions/pi-subagents/src/shared/types.d.ts +1 -0
  65. package/dist/builtin-extensions/pi-subagents/src/shared/types.d.ts.map +1 -1
  66. package/dist/builtin-extensions/pi-subagents/src/shared/types.js.map +1 -1
  67. package/dist/builtin-extensions/pi-subagents/src/tui/communication.d.ts +18 -0
  68. package/dist/builtin-extensions/pi-subagents/src/tui/communication.d.ts.map +1 -0
  69. package/dist/builtin-extensions/pi-subagents/src/tui/communication.js +47 -0
  70. package/dist/builtin-extensions/pi-subagents/src/tui/communication.js.map +1 -0
  71. package/dist/builtin-extensions/pi-web-access/index.d.ts.map +1 -1
  72. package/dist/builtin-extensions/pi-web-access/index.js +11 -7
  73. package/dist/builtin-extensions/pi-web-access/index.js.map +1 -1
  74. package/dist/cli/args.d.ts.map +1 -1
  75. package/dist/cli/args.js +2 -1
  76. package/dist/cli/args.js.map +1 -1
  77. package/dist/cli/install-cli.d.ts.map +1 -1
  78. package/dist/cli/install-cli.js +15 -45
  79. package/dist/cli/install-cli.js.map +1 -1
  80. package/dist/core/agent-session-runtime.d.ts +9 -0
  81. package/dist/core/agent-session-runtime.d.ts.map +1 -1
  82. package/dist/core/agent-session-runtime.js +126 -29
  83. package/dist/core/agent-session-runtime.js.map +1 -1
  84. package/dist/core/agent-session.d.ts +3 -0
  85. package/dist/core/agent-session.d.ts.map +1 -1
  86. package/dist/core/agent-session.js +20 -2
  87. package/dist/core/agent-session.js.map +1 -1
  88. package/dist/core/browser/network.d.ts +9 -0
  89. package/dist/core/browser/network.d.ts.map +1 -0
  90. package/dist/core/browser/network.js +146 -0
  91. package/dist/core/browser/network.js.map +1 -0
  92. package/dist/core/browser/runtime.d.ts +24 -0
  93. package/dist/core/browser/runtime.d.ts.map +1 -0
  94. package/dist/core/browser/runtime.js +289 -0
  95. package/dist/core/browser/runtime.js.map +1 -0
  96. package/dist/core/browser/schema.d.ts +16 -0
  97. package/dist/core/browser/schema.d.ts.map +1 -0
  98. package/dist/core/browser/schema.js +36 -0
  99. package/dist/core/browser/schema.js.map +1 -0
  100. package/dist/core/browser/settings.d.ts +8 -0
  101. package/dist/core/browser/settings.d.ts.map +1 -0
  102. package/dist/core/browser/settings.js +30 -0
  103. package/dist/core/browser/settings.js.map +1 -0
  104. package/dist/core/browser/setup.d.ts +2 -0
  105. package/dist/core/browser/setup.d.ts.map +1 -0
  106. package/dist/core/browser/setup.js +16 -0
  107. package/dist/core/browser/setup.js.map +1 -0
  108. package/dist/core/customize.d.ts.map +1 -1
  109. package/dist/core/customize.js +15 -14
  110. package/dist/core/customize.js.map +1 -1
  111. package/dist/core/export-html/index.d.ts.map +1 -1
  112. package/dist/core/export-html/index.js +1 -1
  113. package/dist/core/export-html/index.js.map +1 -1
  114. package/dist/core/extensions/runner.d.ts +1 -0
  115. package/dist/core/extensions/runner.d.ts.map +1 -1
  116. package/dist/core/extensions/runner.js +1 -1
  117. package/dist/core/extensions/runner.js.map +1 -1
  118. package/dist/core/extensions/types.d.ts +1 -1
  119. package/dist/core/extensions/types.d.ts.map +1 -1
  120. package/dist/core/extensions/types.js.map +1 -1
  121. package/dist/core/install-features.d.ts.map +1 -1
  122. package/dist/core/install-features.js +10 -8
  123. package/dist/core/install-features.js.map +1 -1
  124. package/dist/core/memory-cap.d.ts.map +1 -1
  125. package/dist/core/memory-cap.js +5 -3
  126. package/dist/core/memory-cap.js.map +1 -1
  127. package/dist/core/model-tiers.d.ts.map +1 -1
  128. package/dist/core/model-tiers.js +9 -6
  129. package/dist/core/model-tiers.js.map +1 -1
  130. package/dist/core/permissions.d.ts.map +1 -1
  131. package/dist/core/permissions.js +9 -0
  132. package/dist/core/permissions.js.map +1 -1
  133. package/dist/core/plan-mode.d.ts.map +1 -1
  134. package/dist/core/plan-mode.js +3 -0
  135. package/dist/core/plan-mode.js.map +1 -1
  136. package/dist/core/process-registry.d.ts.map +1 -1
  137. package/dist/core/process-registry.js +6 -4
  138. package/dist/core/process-registry.js.map +1 -1
  139. package/dist/core/runtime-scope.d.ts +11 -0
  140. package/dist/core/runtime-scope.d.ts.map +1 -0
  141. package/dist/core/runtime-scope.js +3 -0
  142. package/dist/core/runtime-scope.js.map +1 -0
  143. package/dist/core/sdk.d.ts.map +1 -1
  144. package/dist/core/sdk.js +13 -0
  145. package/dist/core/sdk.js.map +1 -1
  146. package/dist/core/session-handoff.d.ts +35 -0
  147. package/dist/core/session-handoff.d.ts.map +1 -0
  148. package/dist/core/session-handoff.js +214 -0
  149. package/dist/core/session-handoff.js.map +1 -0
  150. package/dist/core/session-manager.d.ts +20 -0
  151. package/dist/core/session-manager.d.ts.map +1 -1
  152. package/dist/core/session-manager.js +184 -22
  153. package/dist/core/session-manager.js.map +1 -1
  154. package/dist/core/session-ownership.d.ts +28 -0
  155. package/dist/core/session-ownership.d.ts.map +1 -0
  156. package/dist/core/session-ownership.js +138 -0
  157. package/dist/core/session-ownership.js.map +1 -0
  158. package/dist/core/session-retention.d.ts.map +1 -1
  159. package/dist/core/session-retention.js +11 -2
  160. package/dist/core/session-retention.js.map +1 -1
  161. package/dist/core/settings-manager.d.ts +7 -0
  162. package/dist/core/settings-manager.d.ts.map +1 -1
  163. package/dist/core/settings-manager.js +18 -0
  164. package/dist/core/settings-manager.js.map +1 -1
  165. package/dist/core/slash-commands.d.ts.map +1 -1
  166. package/dist/core/slash-commands.js +2 -0
  167. package/dist/core/slash-commands.js.map +1 -1
  168. package/dist/core/system-prompt.d.ts.map +1 -1
  169. package/dist/core/system-prompt.js +5 -2
  170. package/dist/core/system-prompt.js.map +1 -1
  171. package/dist/core/todo-settings.d.ts +5 -0
  172. package/dist/core/todo-settings.d.ts.map +1 -0
  173. package/dist/core/todo-settings.js +7 -0
  174. package/dist/core/todo-settings.js.map +1 -0
  175. package/dist/core/tools/bash.d.ts.map +1 -1
  176. package/dist/core/tools/bash.js +4 -4
  177. package/dist/core/tools/bash.js.map +1 -1
  178. package/dist/core/tools/edit.d.ts.map +1 -1
  179. package/dist/core/tools/edit.js +5 -3
  180. package/dist/core/tools/edit.js.map +1 -1
  181. package/dist/core/tools/find.d.ts.map +1 -1
  182. package/dist/core/tools/find.js +4 -4
  183. package/dist/core/tools/find.js.map +1 -1
  184. package/dist/core/tools/grep.d.ts.map +1 -1
  185. package/dist/core/tools/grep.js +4 -4
  186. package/dist/core/tools/grep.js.map +1 -1
  187. package/dist/core/tools/ls.d.ts.map +1 -1
  188. package/dist/core/tools/ls.js +4 -4
  189. package/dist/core/tools/ls.js.map +1 -1
  190. package/dist/core/tools/read.d.ts.map +1 -1
  191. package/dist/core/tools/read.js +4 -4
  192. package/dist/core/tools/read.js.map +1 -1
  193. package/dist/core/tools/render-utils.d.ts +11 -2
  194. package/dist/core/tools/render-utils.d.ts.map +1 -1
  195. package/dist/core/tools/render-utils.js +31 -4
  196. package/dist/core/tools/render-utils.js.map +1 -1
  197. package/dist/core/tools/write.d.ts.map +1 -1
  198. package/dist/core/tools/write.js +4 -4
  199. package/dist/core/tools/write.js.map +1 -1
  200. package/dist/core/usage-service.d.ts.map +1 -1
  201. package/dist/core/usage-service.js +5 -3
  202. package/dist/core/usage-service.js.map +1 -1
  203. package/dist/gateway/adapters/discord.d.ts +12 -1
  204. package/dist/gateway/adapters/discord.d.ts.map +1 -1
  205. package/dist/gateway/adapters/discord.js +112 -17
  206. package/dist/gateway/adapters/discord.js.map +1 -1
  207. package/dist/gateway/adapters/telegram.d.ts +4 -2
  208. package/dist/gateway/adapters/telegram.d.ts.map +1 -1
  209. package/dist/gateway/adapters/telegram.js +34 -11
  210. package/dist/gateway/adapters/telegram.js.map +1 -1
  211. package/dist/gateway/agent-bridge.d.ts +14 -3
  212. package/dist/gateway/agent-bridge.d.ts.map +1 -1
  213. package/dist/gateway/agent-bridge.js +252 -60
  214. package/dist/gateway/agent-bridge.js.map +1 -1
  215. package/dist/gateway/approval.d.ts +1 -0
  216. package/dist/gateway/approval.d.ts.map +1 -1
  217. package/dist/gateway/approval.js +60 -18
  218. package/dist/gateway/approval.js.map +1 -1
  219. package/dist/gateway/authz.d.ts +2 -0
  220. package/dist/gateway/authz.d.ts.map +1 -1
  221. package/dist/gateway/authz.js +13 -0
  222. package/dist/gateway/authz.js.map +1 -1
  223. package/dist/gateway/buttons.d.ts +3 -1
  224. package/dist/gateway/buttons.d.ts.map +1 -1
  225. package/dist/gateway/buttons.js +18 -3
  226. package/dist/gateway/buttons.js.map +1 -1
  227. package/dist/gateway/command.d.ts.map +1 -1
  228. package/dist/gateway/command.js +49 -4
  229. package/dist/gateway/command.js.map +1 -1
  230. package/dist/gateway/commands.d.ts.map +1 -1
  231. package/dist/gateway/commands.js +18 -3
  232. package/dist/gateway/commands.js.map +1 -1
  233. package/dist/gateway/config.d.ts +5 -0
  234. package/dist/gateway/config.d.ts.map +1 -1
  235. package/dist/gateway/config.js +5 -0
  236. package/dist/gateway/config.js.map +1 -1
  237. package/dist/gateway/conversations.d.ts +14 -0
  238. package/dist/gateway/conversations.d.ts.map +1 -0
  239. package/dist/gateway/conversations.js +30 -0
  240. package/dist/gateway/conversations.js.map +1 -0
  241. package/dist/gateway/download.d.ts +2 -0
  242. package/dist/gateway/download.d.ts.map +1 -0
  243. package/dist/gateway/download.js +36 -0
  244. package/dist/gateway/download.js.map +1 -0
  245. package/dist/gateway/index.d.ts.map +1 -1
  246. package/dist/gateway/index.js +85 -26
  247. package/dist/gateway/index.js.map +1 -1
  248. package/dist/gateway/mobile-commands.d.ts +24 -0
  249. package/dist/gateway/mobile-commands.d.ts.map +1 -0
  250. package/dist/gateway/mobile-commands.js +422 -0
  251. package/dist/gateway/mobile-commands.js.map +1 -0
  252. package/dist/gateway/presenter.d.ts +16 -0
  253. package/dist/gateway/presenter.d.ts.map +1 -0
  254. package/dist/gateway/presenter.js +210 -0
  255. package/dist/gateway/presenter.js.map +1 -0
  256. package/dist/gateway/router.d.ts +1 -0
  257. package/dist/gateway/router.d.ts.map +1 -1
  258. package/dist/gateway/router.js +32 -3
  259. package/dist/gateway/router.js.map +1 -1
  260. package/dist/gateway/service.d.ts +46 -0
  261. package/dist/gateway/service.d.ts.map +1 -0
  262. package/dist/gateway/service.js +395 -0
  263. package/dist/gateway/service.js.map +1 -0
  264. package/dist/gateway/setup.d.ts +4 -0
  265. package/dist/gateway/setup.d.ts.map +1 -0
  266. package/dist/gateway/setup.js +146 -0
  267. package/dist/gateway/setup.js.map +1 -0
  268. package/dist/gateway/types.d.ts +4 -2
  269. package/dist/gateway/types.d.ts.map +1 -1
  270. package/dist/gateway/types.js.map +1 -1
  271. package/dist/index.d.ts +2 -0
  272. package/dist/index.d.ts.map +1 -1
  273. package/dist/index.js +2 -0
  274. package/dist/index.js.map +1 -1
  275. package/dist/main.d.ts.map +1 -1
  276. package/dist/main.js +2 -1
  277. package/dist/main.js.map +1 -1
  278. package/dist/modes/interactive/components/assistant-message.d.ts +11 -2
  279. package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  280. package/dist/modes/interactive/components/assistant-message.js +53 -16
  281. package/dist/modes/interactive/components/assistant-message.js.map +1 -1
  282. package/dist/modes/interactive/components/copyable-text.d.ts +31 -0
  283. package/dist/modes/interactive/components/copyable-text.d.ts.map +1 -0
  284. package/dist/modes/interactive/components/copyable-text.js +165 -0
  285. package/dist/modes/interactive/components/copyable-text.js.map +1 -0
  286. package/dist/modes/interactive/components/custom-entry.d.ts +1 -0
  287. package/dist/modes/interactive/components/custom-entry.d.ts.map +1 -1
  288. package/dist/modes/interactive/components/custom-entry.js +8 -0
  289. package/dist/modes/interactive/components/custom-entry.js.map +1 -1
  290. package/dist/modes/interactive/components/custom-message.d.ts +1 -0
  291. package/dist/modes/interactive/components/custom-message.d.ts.map +1 -1
  292. package/dist/modes/interactive/components/custom-message.js +8 -0
  293. package/dist/modes/interactive/components/custom-message.js.map +1 -1
  294. package/dist/modes/interactive/components/session-selector.d.ts.map +1 -1
  295. package/dist/modes/interactive/components/session-selector.js +16 -0
  296. package/dist/modes/interactive/components/session-selector.js.map +1 -1
  297. package/dist/modes/interactive/components/settings-selector.d.ts +5 -0
  298. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  299. package/dist/modes/interactive/components/settings-selector.js +38 -0
  300. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  301. package/dist/modes/interactive/interactive-mode.d.ts +3 -0
  302. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  303. package/dist/modes/interactive/interactive-mode.js +151 -7
  304. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  305. package/dist/node-runtime/agent-session-services-NQ6GKOIK.js +49 -0
  306. package/dist/node-runtime/{builtin-extensions-JCOPAAB5.js → builtin-extensions-GVC6IFDU.js} +6 -5
  307. package/dist/node-runtime/{chunk-LTYWTR3V.js → chunk-2MI5OPMN.js} +17 -2
  308. package/dist/node-runtime/{chunk-W3CVH5RX.js → chunk-2TKODGBZ.js} +11 -6
  309. package/dist/node-runtime/chunk-4EULYYR4.js +62 -0
  310. package/dist/node-runtime/chunk-5BNJ4JUH.js +672 -0
  311. package/dist/node-runtime/{chunk-6N22HULO.js → chunk-5D7LC2ZQ.js} +7 -2
  312. package/dist/node-runtime/{chunk-KBKMCJDU.js → chunk-5ZQXRPMC.js} +19 -4
  313. package/dist/node-runtime/{chunk-6KDIOJL3.js → chunk-6427XAWG.js} +3 -3
  314. package/dist/node-runtime/{chunk-BOHIDQT4.js → chunk-6B2POMK7.js} +1 -1
  315. package/dist/node-runtime/{chunk-RNBHABBA.js → chunk-7QWNYZDI.js} +7 -0
  316. package/dist/node-runtime/chunk-AZJHNQKQ.js +205 -0
  317. package/dist/node-runtime/{chunk-A3KMVBZV.js → chunk-BBUVIEZB.js} +1 -10
  318. package/dist/node-runtime/chunk-BFNXONG3.js +521 -0
  319. package/dist/node-runtime/{chunk-IRPJXI6U.js → chunk-BX2RB477.js} +1 -1
  320. package/dist/node-runtime/chunk-CCCN2UCX.js +14 -0
  321. package/dist/node-runtime/{chunk-25I2BHAA.js → chunk-CSUZVNYE.js} +1 -1
  322. package/dist/node-runtime/{chunk-QZMODZQ2.js → chunk-E24EO34J.js} +2 -1
  323. package/dist/node-runtime/{chunk-2BUAYZ7K.js → chunk-EQ63ANHL.js} +422 -123
  324. package/dist/node-runtime/{chunk-GB2MGFLI.js → chunk-GJSAD4AB.js} +216 -201
  325. package/dist/node-runtime/{chunk-W3SILANP.js → chunk-GMHJCCEN.js} +8 -8
  326. package/dist/node-runtime/{chunk-DDWHZ633.js → chunk-GNN7H3B7.js} +1 -1
  327. package/dist/node-runtime/chunk-GS66LV4M.js +2830 -0
  328. package/dist/node-runtime/{chunk-6BEIBLQ3.js → chunk-H3XF4UVQ.js} +1 -1
  329. package/dist/node-runtime/chunk-H4K3JDRB.js +47 -0
  330. package/dist/node-runtime/{chunk-YMEAYRBE.js → chunk-HTFRRDSF.js} +2 -7
  331. package/dist/node-runtime/chunk-IMLCWLPI.js +9 -0
  332. package/dist/node-runtime/{chunk-Y5KOEMBH.js → chunk-IQIEU7SB.js} +9 -674
  333. package/dist/node-runtime/{chunk-OPEK5RRY.js → chunk-IVXYUAJE.js} +1 -1
  334. package/dist/node-runtime/{chunk-PDNXVXMD.js → chunk-IWOWXRWU.js} +58 -48
  335. package/dist/node-runtime/chunk-KKUTQQV7.js +144 -0
  336. package/dist/node-runtime/{chunk-AWVD5IEY.js → chunk-LMBNLFXQ.js} +23 -12
  337. package/dist/node-runtime/{chunk-7NBZ5P7I.js → chunk-NAY6UUQZ.js} +1 -1
  338. package/dist/node-runtime/chunk-OAR4TYZE.js +146 -0
  339. package/dist/node-runtime/{chunk-STERBGUB.js → chunk-OFKSVRV7.js} +2 -2
  340. package/dist/node-runtime/{chunk-JZQ7F36T.js → chunk-ORH324EP.js} +19 -3
  341. package/dist/node-runtime/{chunk-2SJB2AWP.js → chunk-PC2Z5TKZ.js} +3 -3
  342. package/dist/node-runtime/{chunk-SY2TFMLO.js → chunk-QDGKKKUM.js} +46 -151
  343. package/dist/node-runtime/chunk-R3K2F5GI.js +122 -0
  344. package/dist/node-runtime/chunk-RMQZU2YU.js +117 -0
  345. package/dist/node-runtime/{chunk-XI77KVKA.js → chunk-TDL7UWJ7.js} +283 -2999
  346. package/dist/node-runtime/{chunk-G6LRAP36.js → chunk-TQGPP4SC.js} +1 -1
  347. package/dist/node-runtime/chunk-UAEOTO52.js +119 -0
  348. package/dist/node-runtime/{chunk-VZR3NCM7.js → chunk-UAFLNHSH.js} +18 -14
  349. package/dist/node-runtime/{chunk-AY6CAJSL.js → chunk-UJOCPOMX.js} +6 -3
  350. package/dist/node-runtime/chunk-UP2XBVH5.js +40 -0
  351. package/dist/node-runtime/{chunk-WJVFOIB5.js → chunk-UQUCFAJ3.js} +1 -1
  352. package/dist/node-runtime/chunk-URD2SLIT.js +1019 -0
  353. package/dist/node-runtime/chunk-US544NN6.js +13 -0
  354. package/dist/node-runtime/chunk-UWPJL22I.js +341 -0
  355. package/dist/node-runtime/chunk-V2A7CEXK.js +355 -0
  356. package/dist/node-runtime/chunk-VJPTNWAP.js +708 -0
  357. package/dist/node-runtime/{chunk-WKDK4C5P.js → chunk-VSSXXL36.js} +38 -164
  358. package/dist/node-runtime/{chunk-4I23VTC4.js → chunk-VWCE2HSZ.js} +21 -124
  359. package/dist/node-runtime/{chunk-WLLDXJRT.js → chunk-WADV2VDS.js} +22 -1014
  360. package/dist/node-runtime/{chunk-GKLEQ3I4.js → chunk-XLTL257W.js} +126 -27
  361. package/dist/node-runtime/chunk-YPHAIRZT.js +10 -0
  362. package/dist/node-runtime/cli-runtime.js +2 -2
  363. package/dist/node-runtime/command-3JHHXOPX.js +45 -0
  364. package/dist/node-runtime/commands-2JVNFGMQ.js +36 -0
  365. package/dist/node-runtime/{commands-MV5KOZ64.js → commands-KAMO2T6P.js} +10 -10
  366. package/dist/node-runtime/config-RORQUQFG.js +20 -0
  367. package/dist/node-runtime/{customize-LF5VST47.js → customize-VFJV3U6A.js} +2 -1
  368. package/dist/node-runtime/{direct-tool-executor-BK7CLEBX.js → direct-tool-executor-YAVOLDFY.js} +8 -8
  369. package/dist/node-runtime/{export-html-TEXVV5RP.js → export-html-KBFVV63J.js} +4 -3
  370. package/dist/node-runtime/{extension-input-O4HSAEM4.js → extension-input-K24TVKVW.js} +4 -4
  371. package/dist/node-runtime/{extension-selector-X5FCX43D.js → extension-selector-SPNF7EDR.js} +4 -4
  372. package/dist/node-runtime/{extract-XLQSJN4V.js → extract-EQJE7FZZ.js} +2 -2
  373. package/dist/node-runtime/{gateway-BM6NLOH4.js → gateway-VFO6SFKK.js} +275 -994
  374. package/dist/node-runtime/{gemini-search-U7SUMPQA.js → gemini-search-35OCRFLN.js} +1 -1
  375. package/dist/node-runtime/{gemini-url-context-PXWCBQHK.js → gemini-url-context-UQY3PHHW.js} +2 -2
  376. package/dist/node-runtime/index.js +104 -65
  377. package/dist/node-runtime/{init-3C7Z24OI.js → init-X2LIUB2H.js} +3 -3
  378. package/dist/node-runtime/{install-cli-EXMJQESX.js → install-cli-C3CF7O7N.js} +21 -82
  379. package/dist/node-runtime/interactive-mode-LOM6AIF6.js +72 -0
  380. package/dist/node-runtime/{interactive-view-ILS6TAN5.js → interactive-view-IDSCPPK7.js} +8 -8
  381. package/dist/node-runtime/lunr-browser-YNW7FTYX.js +87 -0
  382. package/dist/node-runtime/{lunr-cron-4VHP4E4B.js → lunr-cron-BKHGNBKT.js} +19 -5
  383. package/dist/node-runtime/main.js +44 -31
  384. package/dist/node-runtime/{memory-cap-3S4XRLNP.js → memory-cap-EL3KL4JJ.js} +2 -1
  385. package/dist/node-runtime/mobile-commands-HMP25WBC.js +32 -0
  386. package/dist/node-runtime/model-runtime-PLQKAG4B.js +16 -0
  387. package/dist/node-runtime/{model-tiers-NJLHUEGK.js → model-tiers-OU3U5CZG.js} +2 -1
  388. package/dist/node-runtime/{package-manager-cli-N37546V5.js → package-manager-cli-VCK4E2RC.js} +22 -15
  389. package/dist/node-runtime/{pi-intercom-NV2LW6X7.js → pi-intercom-HBPK5HSJ.js} +4 -1
  390. package/dist/node-runtime/{pi-mcp-adapter-GUFZWW54.js → pi-mcp-adapter-E6WULBKF.js} +4 -4
  391. package/dist/node-runtime/{pi-subagents-6MUIFNDM.js → pi-subagents-FEUDLJOE.js} +201 -78
  392. package/dist/node-runtime/{pi-web-access-2CQGFLT2.js → pi-web-access-WTGMNZ32.js} +15 -15
  393. package/dist/node-runtime/process-registry-4FAKZQOL.js +31 -0
  394. package/dist/node-runtime/{proxy-modes-V6YVFH3C.js → proxy-modes-OSQCWRBI.js} +9 -9
  395. package/dist/node-runtime/rpc-entry.js +44 -31
  396. package/dist/node-runtime/{rpc-mode-W5ZTLTMZ.js → rpc-mode-P5ODXPEG.js} +2 -2
  397. package/dist/node-runtime/runtime-4VA6JKNF.js +373 -0
  398. package/dist/node-runtime/{runtime-bridges-2VQTLPOZ.js → runtime-bridges-3XUQ46XW.js} +6 -5
  399. package/dist/node-runtime/service-ISSP6VHE.js +36 -0
  400. package/dist/node-runtime/session-handoff-HC7R5E24.js +33 -0
  401. package/dist/node-runtime/{session-manager-E7AREDTV.js → session-manager-CFN4UFM2.js} +2 -1
  402. package/dist/node-runtime/{session-selector-FJ7M2AIX.js → session-selector-LHRMJOKT.js} +5 -4
  403. package/dist/node-runtime/{settings-manager-CUGAZWAB.js → settings-manager-UUZ6NUXI.js} +7 -2
  404. package/dist/node-runtime/setup-JBKOLJ6F.js +18 -0
  405. package/dist/node-runtime/setup-NRXVZBLJ.js +155 -0
  406. package/dist/node-runtime/{subagent-executor-MH4A7CCF.js → subagent-executor-MLUMBWCP.js} +22 -18
  407. package/dist/node-runtime/theme-U7IGOA7O.js +68 -0
  408. package/dist/node-runtime/trust-manager-MMISNCYO.js +17 -0
  409. package/dist/node-runtime/{update-cli-XTZMZGOL.js → update-cli-4TP25CNW.js} +7 -2
  410. package/dist/node-runtime/usage-service-LFB2SWYV.js +37 -0
  411. package/dist/node-runtime/{video-extract-OYT5WKS5.js → video-extract-OOZHR7SU.js} +2 -2
  412. package/dist/node-runtime/{youtube-extract-TQYKGFGS.js → youtube-extract-FNPAUNHU.js} +6 -6
  413. package/docs/browser.md +86 -0
  414. package/docs/extensions.md +2 -0
  415. package/docs/features.md +94 -16
  416. package/docs/interactive-startup.md +2 -1
  417. package/docs/sessions.md +10 -0
  418. package/docs/settings.md +1 -0
  419. package/docs/tui.md +2 -0
  420. package/docs/usage.md +16 -0
  421. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  422. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  423. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  424. package/examples/extensions/gondolin/package-lock.json +2 -2
  425. package/examples/extensions/gondolin/package.json +1 -1
  426. package/examples/extensions/sandbox/package-lock.json +2 -2
  427. package/examples/extensions/sandbox/package.json +1 -1
  428. package/examples/extensions/with-deps/package-lock.json +2 -2
  429. package/examples/extensions/with-deps/package.json +1 -1
  430. package/package.json +7 -4
  431. package/scripts/install-browser.mjs +20 -0
  432. package/dist/node-runtime/agent-session-services-C743TYQE.js +0 -37
  433. package/dist/node-runtime/chunk-VGYZ3APQ.js +0 -59
  434. package/dist/node-runtime/command-P4NYCJ2M.js +0 -13
  435. package/dist/node-runtime/interactive-mode-EVVBA64D.js +0 -59
  436. package/dist/node-runtime/{chunk-UWQYRSYQ.js → chunk-YJMMG7C6.js} +25 -25
  437. package/dist/node-runtime/{mcp-panel-IIGMXQGP.js → mcp-panel-KTTFXJZ4.js} +3 -3
  438. package/dist/node-runtime/{src-BPQFJR76.js → src-IVPNZ2BX.js} +9 -9
@@ -0,0 +1,708 @@
1
+ import { createRequire as __lunrRequire } from "node:module"; const require = __lunrRequire(import.meta.url);
2
+ import {
3
+ createPairingStore
4
+ } from "./chunk-RMQZU2YU.js";
5
+ import {
6
+ atomicJson
7
+ } from "./chunk-UWPJL22I.js";
8
+ import {
9
+ noOpUIContext
10
+ } from "./chunk-5BNJ4JUH.js";
11
+ import {
12
+ NO_HANDLER_REASON,
13
+ registerApprovalHandler,
14
+ setPermissionMode
15
+ } from "./chunk-5D7LC2ZQ.js";
16
+ import {
17
+ loadGatewayConfig,
18
+ platformConfigFor,
19
+ saveGatewayConfig
20
+ } from "./chunk-R3K2F5GI.js";
21
+ import {
22
+ getAgentDir
23
+ } from "./chunk-FQMM2EZ2.js";
24
+
25
+ // packages/coding-agent/dist/gateway/authz.js
26
+ function envFlagEnabled(name) {
27
+ let raw = process.env[name];
28
+ return raw === void 0 ? !1 : ["1", "true", "yes", "on"].includes(raw.toLowerCase());
29
+ }
30
+ function globalAllowedUsers() {
31
+ let raw = process.env.LUNR_GATEWAY_ALLOWED_USERS;
32
+ return raw ? raw.split(",").map((u) => u.trim()).filter((u) => u.length > 0) : [];
33
+ }
34
+ function isGatewayOwner(source, cfg) {
35
+ return source.chatType !== "dm" || source.platform !== "telegram" && source.platform !== "discord" ? !1 : cfg.owners?.[source.platform].includes(source.userId) ?? !1;
36
+ }
37
+ function requireGatewayOwner(source, cfg = loadGatewayConfig()) {
38
+ if (!isGatewayOwner(source, cfg))
39
+ throw new Error("This command is available only to the configured owner in a private chat. Use lunr gateway setup to configure owner access.");
40
+ }
41
+ function isAuthorized(source, cfg, pairing) {
42
+ if (isGatewayOwner(source, cfg) || envFlagEnabled("LUNR_GATEWAY_ALLOW_ALL_USERS"))
43
+ return !0;
44
+ let platformCfg = platformConfigFor(cfg, source.platform);
45
+ return !!(platformCfg?.allowedChats.includes(source.chatId) || source.roleAuthorized === !0 || source.userId && pairing.isPaired(source.platform, source.userId) || source.userId && (platformCfg?.allowedUsers.includes(source.userId) || globalAllowedUsers().includes(source.userId)));
46
+ }
47
+ function addAllowedUser(platform, userId) {
48
+ let cfg = loadGatewayConfig(), platformCfg = platformConfigFor(cfg, platform);
49
+ if (!platformCfg)
50
+ throw new Error(`Unknown platform "${platform}"`);
51
+ platformCfg.allowedUsers.includes(userId) || (platformCfg.allowedUsers.push(userId), saveGatewayConfig(cfg));
52
+ }
53
+
54
+ // packages/coding-agent/dist/gateway/conversations.js
55
+ import { existsSync, readFileSync } from "node:fs";
56
+ import { join } from "node:path";
57
+ var path = () => join(getAgentDir(), "gateway-conversations.json");
58
+ function conversationBindings() {
59
+ if (!existsSync(path()))
60
+ return {};
61
+ let raw = JSON.parse(readFileSync(path(), "utf8"));
62
+ if (!raw || typeof raw != "object" || Array.isArray(raw))
63
+ throw new Error("Invalid gateway conversation store. Restore it before continuing.");
64
+ return raw;
65
+ }
66
+ function conversationBinding(key) {
67
+ return conversationBindings()[key];
68
+ }
69
+ function bindConversation(key, source, options = {}) {
70
+ let all = conversationBindings(), old = all[key];
71
+ all[key] = {
72
+ ...old,
73
+ ...options,
74
+ source,
75
+ recentProjects: options.cwd ? [.../* @__PURE__ */ new Set([options.cwd, ...old?.recentProjects ?? []])].slice(0, 12) : old?.recentProjects ?? []
76
+ }, atomicJson(path(), all);
77
+ }
78
+
79
+ // packages/coding-agent/dist/gateway/store.js
80
+ import { existsSync as existsSync2, mkdirSync, readFileSync as readFileSync2, renameSync, writeFileSync } from "node:fs";
81
+ import { dirname, join as join2 } from "node:path";
82
+ var storePathOverride;
83
+ function storePath() {
84
+ return storePathOverride ?? join2(getAgentDir(), "gateway-sessions.json");
85
+ }
86
+ function readStore() {
87
+ let path3 = storePath();
88
+ if (!existsSync2(path3))
89
+ return {};
90
+ try {
91
+ let parsed = JSON.parse(readFileSync2(path3, "utf-8"));
92
+ if (parsed == null || typeof parsed != "object" || Array.isArray(parsed))
93
+ return {};
94
+ let out = {};
95
+ for (let [key, value] of Object.entries(parsed)) {
96
+ if (value == null || typeof value != "object")
97
+ continue;
98
+ let v = value;
99
+ typeof v.sessionId != "string" || typeof v.sessionFile != "string" || (out[key] = {
100
+ sessionId: v.sessionId,
101
+ sessionFile: v.sessionFile,
102
+ createdAt: typeof v.createdAt == "string" ? v.createdAt : (/* @__PURE__ */ new Date(0)).toISOString(),
103
+ lastActiveAt: typeof v.lastActiveAt == "string" ? v.lastActiveAt : (/* @__PURE__ */ new Date(0)).toISOString()
104
+ });
105
+ }
106
+ return out;
107
+ } catch {
108
+ return {};
109
+ }
110
+ }
111
+ function writeStore(data) {
112
+ let path3 = storePath(), dir = dirname(path3);
113
+ existsSync2(dir) || mkdirSync(dir, { recursive: !0 });
114
+ let tmp = `${path3}.tmp-${process.pid}`;
115
+ writeFileSync(tmp, `${JSON.stringify(data, null, 2)}
116
+ `, "utf-8"), renameSync(tmp, path3);
117
+ }
118
+ function getSession(key) {
119
+ return readStore()[key];
120
+ }
121
+ function putSession(key, entry) {
122
+ let data = readStore(), existing = data[key], stored = {
123
+ sessionId: entry.sessionId,
124
+ sessionFile: entry.sessionFile,
125
+ createdAt: existing?.createdAt ?? (/* @__PURE__ */ new Date()).toISOString(),
126
+ lastActiveAt: (/* @__PURE__ */ new Date()).toISOString()
127
+ };
128
+ return data[key] = stored, writeStore(data), stored;
129
+ }
130
+ function touchSession(key) {
131
+ let data = readStore(), existing = data[key];
132
+ existing && (existing.lastActiveAt = (/* @__PURE__ */ new Date()).toISOString(), writeStore(data));
133
+ }
134
+ function removeSession(key) {
135
+ let data = readStore();
136
+ return key in data ? (delete data[key], writeStore(data), !0) : !1;
137
+ }
138
+ function listSessions() {
139
+ return readStore();
140
+ }
141
+
142
+ // packages/coding-agent/dist/gateway/approval.js
143
+ import { AsyncLocalStorage } from "node:async_hooks";
144
+ import { randomBytes } from "node:crypto";
145
+ var CALLBACK_PREFIX = "ap:", ID_LENGTH = 8, CODE_ALPHABET = "ABCDEFGHJKMNPQRSTUVWXYZ23456789", DEFAULT_TIMEOUT_MS = 300 * 1e3, approvalContext = new AsyncLocalStorage(), pending = /* @__PURE__ */ new Map();
146
+ function generateId() {
147
+ let id = "", bytes = randomBytes(ID_LENGTH);
148
+ for (let i = 0; i < ID_LENGTH; i++)
149
+ id += CODE_ALPHABET[bytes[i] % CODE_ALPHABET.length];
150
+ return id;
151
+ }
152
+ function makeCallbackData(id, action) {
153
+ return `${CALLBACK_PREFIX}${id}:${action}`;
154
+ }
155
+ function parseCallbackData(data) {
156
+ if (!data.startsWith(CALLBACK_PREFIX))
157
+ return null;
158
+ let rest = data.slice(CALLBACK_PREFIX.length), colon = rest.indexOf(":");
159
+ if (colon === -1)
160
+ return null;
161
+ let id = rest.slice(0, colon), action = rest.slice(colon + 1);
162
+ return action === "once" || action === "session" || action === "reject" || action === "cancel" ? { id, action } : null;
163
+ }
164
+ function runWithApprovalContext(ctx, fn) {
165
+ return approvalContext.run(ctx, fn);
166
+ }
167
+ async function createApprovalPrompt(adapter, source, req, timeoutMs = DEFAULT_TIMEOUT_MS, key) {
168
+ let id = generateId(), title = req.kind === "large-subagent-launch" ? `Approve large subagent launch?
169
+ ${req.detail}` : `Approve ${req.toolName}?
170
+ ${req.detail}`, rows = [
171
+ [
172
+ { label: "\u2713 Approve once", data: makeCallbackData(id, "once") },
173
+ { label: "\u2713 Approve session", data: makeCallbackData(id, "session") }
174
+ ],
175
+ [{ label: "\u2717 Reject", data: makeCallbackData(id, "reject") }]
176
+ ];
177
+ return new Promise((resolve, reject) => {
178
+ let messageId, timeout = setTimeout(() => {
179
+ pending.delete(id), reject(new Error("Approval request timed out")), messageId && adapter.editMessage(source.chatId, messageId, "\u23F1 Approval expired.", []).catch(() => {
180
+ });
181
+ }, timeoutMs), entry = {
182
+ key,
183
+ source,
184
+ plan: req.kind === "plan",
185
+ resolve,
186
+ reject,
187
+ timeout,
188
+ adapter,
189
+ chatId: source.chatId,
190
+ threadId: source.threadId,
191
+ userId: source.userId
192
+ };
193
+ pending.set(id, entry), (async () => {
194
+ try {
195
+ let result = await adapter.sendButtons(source.chatId, title, rows, { threadId: source.threadId });
196
+ if (!result.success || !result.messageId)
197
+ throw new Error(result.error ?? "Failed to send approval prompt");
198
+ if (messageId = result.messageId, pending.get(id) !== entry) {
199
+ await adapter.editMessage(source.chatId, messageId, "Approval cancelled or expired.", []).catch(() => {
200
+ });
201
+ return;
202
+ }
203
+ entry.messageId = messageId;
204
+ } catch (err) {
205
+ clearTimeout(timeout), pending.delete(id), reject(err);
206
+ }
207
+ })();
208
+ });
209
+ }
210
+ async function createGatewayApprovalRequest(req) {
211
+ let ctx = approvalContext.getStore();
212
+ if (!ctx)
213
+ throw new Error(NO_HANDLER_REASON);
214
+ return createApprovalPrompt(ctx.adapter, ctx.source, req, ctx.timeoutMs, ctx.key);
215
+ }
216
+ function registerGatewayApprovalHandler() {
217
+ registerApprovalHandler(createGatewayApprovalRequest);
218
+ }
219
+ async function handleApprovalCallback(event, adapter) {
220
+ let parsed = parseCallbackData(event.data);
221
+ if (!parsed)
222
+ return !1;
223
+ let entry = pending.get(parsed.id);
224
+ if (!entry)
225
+ return await adapter?.answerCallback(event.id, "Approval expired.").catch(() => {
226
+ }), !0;
227
+ if (event.userId !== entry.userId || event.chatId !== entry.chatId || event.threadId !== entry.threadId || adapter && adapter.platform !== entry.adapter.platform)
228
+ return await entry.adapter.answerCallback(event.id, "\u26D4 Not your approval.").catch(() => {
229
+ }), !0;
230
+ clearTimeout(entry.timeout), pending.delete(parsed.id);
231
+ let response = parsed.action === "reject" || parsed.action === "cancel" ? "reject" : parsed.action, binding = entry.key ? conversationBinding(entry.key) : void 0;
232
+ if (binding?.owner && (!isGatewayOwner(entry.source, loadGatewayConfig()) || binding.owner !== event.userId))
233
+ return entry.resolve("reject"), await entry.adapter.answerCallback(event.id, "Owner access was removed.").catch(() => {
234
+ }), !0;
235
+ if (binding && !isAuthorized(entry.source, loadGatewayConfig(), createPairingStore()))
236
+ return entry.resolve("reject"), !0;
237
+ if (entry.plan && response !== "reject" && entry.key) {
238
+ let sessionId = getSession(entry.key)?.sessionId;
239
+ sessionId && setPermissionMode("manual", sessionId);
240
+ }
241
+ entry.resolve(response);
242
+ let label = parsed.action === "reject" || parsed.action === "cancel" ? "Rejected." : `Approved (${parsed.action}).`;
243
+ return await entry.adapter.editMessage(entry.chatId, entry.messageId ?? "", label, []).catch(() => {
244
+ }), await entry.adapter.answerCallback(event.id).catch(() => {
245
+ }), !0;
246
+ }
247
+ function cancelGatewayApprovals(key) {
248
+ for (let [id, entry] of pending)
249
+ entry.key === key && (clearTimeout(entry.timeout), pending.delete(id), entry.resolve("reject"), entry.messageId && entry.adapter.editMessage(entry.chatId, entry.messageId, "Approval cancelled.", []).catch(() => {
250
+ }));
251
+ }
252
+
253
+ // packages/coding-agent/dist/gateway/buttons.js
254
+ import { randomBytes as randomBytes2 } from "node:crypto";
255
+ var PICKER_TTL_MS = 900 * 1e3, SWEEP_INTERVAL_MS = 60 * 1e3, DEFAULT_PER_PAGE = 8, BUTTONS_PER_ROW = 2, CODE_ALPHABET2 = "ABCDEFGHJKMNPQRSTUVWXYZ23456789", CODE_LENGTH = 8, CALLBACK_PREFIX2 = "cp:", registry = /* @__PURE__ */ new Map(), sweeper;
256
+ function generatePickerId() {
257
+ let id = "", bytes = randomBytes2(CODE_LENGTH);
258
+ for (let i = 0; i < CODE_LENGTH; i++)
259
+ id += CODE_ALPHABET2[bytes[i] % CODE_ALPHABET2.length];
260
+ return id;
261
+ }
262
+ function makeCallbackData2(id, action, payload) {
263
+ return action === "noop" ? `${CALLBACK_PREFIX2}${id}:` : action === "cancel" ? `${CALLBACK_PREFIX2}${id}:x` : action === "page" ? `${CALLBACK_PREFIX2}${id}:p${payload ?? "0"}` : `${CALLBACK_PREFIX2}${id}:${payload ?? ""}`;
264
+ }
265
+ function parseCallbackData2(data) {
266
+ if (!data.startsWith(CALLBACK_PREFIX2))
267
+ return null;
268
+ let rest = data.slice(CALLBACK_PREFIX2.length), colon = rest.indexOf(":");
269
+ if (colon === -1)
270
+ return null;
271
+ let id = rest.slice(0, colon), tail = rest.slice(colon + 1);
272
+ return tail === "" ? { id, action: "noop" } : tail === "x" ? { id, action: "cancel" } : tail.startsWith("p") ? { id, action: "page", payload: tail.slice(1) } : { id, action: "select", payload: tail };
273
+ }
274
+ function isSameChat(a, b) {
275
+ return a.platform === b.platform && a.chatId === b.chatId && a.threadId === b.threadId;
276
+ }
277
+ function sourceForAuth(picker, cb) {
278
+ return {
279
+ platform: picker.source.platform,
280
+ chatId: cb.chatId,
281
+ chatType: picker.source.chatType,
282
+ userId: cb.userId,
283
+ userName: cb.userName,
284
+ threadId: cb.threadId,
285
+ // Do NOT inherit the original invoker's role authorization.
286
+ roleAuthorized: void 0
287
+ };
288
+ }
289
+ function renderPage(picker) {
290
+ let { id, title, breadcrumbs, items, page, perPage } = picker, totalPages = Math.max(1, Math.ceil(items.length / perPage)), clampedPage = Math.max(0, Math.min(page, totalPages - 1)), start = clampedPage * perPage, pageItems = items.slice(start, start + perPage), rows = [];
291
+ for (let i = 0; i < pageItems.length; i += BUTTONS_PER_ROW) {
292
+ let row = [];
293
+ for (let j = 0; j < BUTTONS_PER_ROW && i + j < pageItems.length; j++) {
294
+ let index = start + i + j;
295
+ row.push({ label: pageItems[i + j].label, data: makeCallbackData2(id, "select", String(index)) });
296
+ }
297
+ rows.push(row);
298
+ }
299
+ if (totalPages > 1) {
300
+ let nav = [];
301
+ clampedPage > 0 && nav.push({ label: "\u25C0 Prev", data: makeCallbackData2(id, "page", String(clampedPage - 1)) }), nav.push({ label: `${clampedPage + 1}/${totalPages}`, data: makeCallbackData2(id, "noop") }), clampedPage < totalPages - 1 && nav.push({ label: "Next \u25B6", data: makeCallbackData2(id, "page", String(clampedPage + 1)) }), rows.push(nav);
302
+ }
303
+ rows.push([{ label: "\u2717 Cancel", data: makeCallbackData2(id, "cancel") }]);
304
+ let header = breadcrumbs ? `${title} \xB7 ${breadcrumbs}` : title;
305
+ return { text: items.length === 0 ? `${header}
306
+
307
+ No options available.` : `${header} (${clampedPage + 1}/${totalPages}):`, buttons: rows };
308
+ }
309
+ async function createPicker(adapter, source, spec, opts) {
310
+ let id = generatePickerId(), pending2 = {
311
+ ...spec,
312
+ id,
313
+ chatId: source.chatId,
314
+ source,
315
+ adapter,
316
+ messageId: "",
317
+ page: 0,
318
+ perPage: spec.perPage ?? DEFAULT_PER_PAGE,
319
+ createdAt: Date.now()
320
+ }, { text, buttons } = renderPage(pending2), result = await adapter.sendButtons(source.chatId, text, buttons, opts);
321
+ return result.success && result.messageId && (pending2.messageId = result.messageId, registry.set(id, pending2)), result;
322
+ }
323
+ async function answerExpired(adapter, cb) {
324
+ await adapter.answerCallback(cb.id, "Picker expired \u2014 run the command again.").catch(() => {
325
+ });
326
+ }
327
+ async function answerUnauthorized(adapter, cb) {
328
+ await adapter.answerCallback(cb.id, "\u26D4 Not authorized.").catch(() => {
329
+ });
330
+ }
331
+ async function answerNotYourPicker(adapter, cb) {
332
+ await adapter.answerCallback(cb.id, "\u26D4 Not your picker.").catch(() => {
333
+ });
334
+ }
335
+ async function handleCallback(cb, deps) {
336
+ let { adapter, cfg, pairing } = deps, parsed = parseCallbackData2(cb.data);
337
+ if (!parsed)
338
+ return;
339
+ let picker = registry.get(parsed.id);
340
+ if (!picker) {
341
+ await answerExpired(adapter, cb);
342
+ return;
343
+ }
344
+ if (picker.validate && !picker.validate()) {
345
+ registry.delete(parsed.id), picker.onCancel?.(), await answerExpired(adapter, cb);
346
+ return;
347
+ }
348
+ if (Date.now() > picker.createdAt + PICKER_TTL_MS) {
349
+ picker.onCancel?.(), registry.delete(parsed.id);
350
+ try {
351
+ await picker.adapter.editMessage(picker.chatId, picker.messageId, "\u23F1 Expired \u2014 run the command again.", []);
352
+ } catch {
353
+ }
354
+ await answerExpired(adapter, cb);
355
+ return;
356
+ }
357
+ if (!isSameChat(picker.source, sourceForAuth(picker, cb))) {
358
+ await answerExpired(adapter, cb);
359
+ return;
360
+ }
361
+ if (cb.userId !== picker.invokerId) {
362
+ await answerNotYourPicker(adapter, cb);
363
+ return;
364
+ }
365
+ if (!isAuthorized(sourceForAuth(picker, cb), cfg, pairing)) {
366
+ await answerUnauthorized(adapter, cb);
367
+ return;
368
+ }
369
+ if (parsed.action === "cancel") {
370
+ registry.delete(parsed.id), picker.onCancel?.();
371
+ try {
372
+ await picker.adapter.editMessage(picker.chatId, picker.messageId, "Cancelled.", []);
373
+ } catch {
374
+ }
375
+ await adapter.answerCallback(cb.id).catch(() => {
376
+ });
377
+ return;
378
+ }
379
+ if (parsed.action === "noop") {
380
+ await adapter.answerCallback(cb.id).catch(() => {
381
+ });
382
+ return;
383
+ }
384
+ if (parsed.action === "page") {
385
+ let page = Number.parseInt(parsed.payload ?? "0", 10), totalPages = Math.max(1, Math.ceil(picker.items.length / picker.perPage));
386
+ picker.page = Math.max(0, Math.min(page, totalPages - 1));
387
+ let { text, buttons } = renderPage(picker);
388
+ try {
389
+ await picker.adapter.editMessage(picker.chatId, picker.messageId, text, buttons);
390
+ } catch {
391
+ }
392
+ await adapter.answerCallback(cb.id).catch(() => {
393
+ });
394
+ return;
395
+ }
396
+ let index = Number.parseInt(parsed.payload ?? "", 10), item = picker.items[index];
397
+ if (!item) {
398
+ await adapter.answerCallback(cb.id, "Invalid selection.").catch(() => {
399
+ });
400
+ return;
401
+ }
402
+ if (picker.resolving) {
403
+ await adapter.answerCallback(cb.id, "Selection is still running.").catch(() => {
404
+ });
405
+ return;
406
+ }
407
+ picker.resolving = !0, await adapter.answerCallback(cb.id).catch(() => {
408
+ });
409
+ try {
410
+ let result = await picker.resolve(item);
411
+ if (!result.done) {
412
+ picker.items = result.items, picker.title = result.title, picker.breadcrumbs = result.breadcrumbs, picker.page = 0;
413
+ let { text, buttons } = renderPage(picker);
414
+ try {
415
+ await picker.adapter.editMessage(picker.chatId, picker.messageId, text, buttons);
416
+ } catch {
417
+ }
418
+ return;
419
+ }
420
+ registry.delete(parsed.id);
421
+ try {
422
+ await picker.adapter.editMessage(picker.chatId, picker.messageId, result.text, []);
423
+ } catch {
424
+ }
425
+ } catch (err) {
426
+ registry.delete(parsed.id);
427
+ let message = err instanceof Error ? err.message : String(err);
428
+ try {
429
+ await picker.adapter.editMessage(picker.chatId, picker.messageId, `\u26A0 ${message}`, []);
430
+ } catch {
431
+ }
432
+ } finally {
433
+ picker.resolving = !1;
434
+ }
435
+ }
436
+ function startButtonSweeper() {
437
+ sweeper || (sweeper = setInterval(() => {
438
+ let cutoff = Date.now() - PICKER_TTL_MS;
439
+ for (let [id, entry] of registry)
440
+ if (!(entry.createdAt > cutoff)) {
441
+ registry.delete(id), entry.onCancel?.();
442
+ try {
443
+ entry.adapter.editMessage(entry.chatId, entry.messageId, "\u23F1 Expired \u2014 run the command again.", []);
444
+ } catch {
445
+ }
446
+ }
447
+ }, SWEEP_INTERVAL_MS), sweeper.unref?.());
448
+ }
449
+ function stopButtonSweeper() {
450
+ sweeper && (clearInterval(sweeper), sweeper = void 0);
451
+ }
452
+
453
+ // packages/coding-agent/dist/gateway/presenter.js
454
+ import { randomUUID } from "node:crypto";
455
+ import { existsSync as existsSync3, readFileSync as readFileSync3 } from "node:fs";
456
+ import { join as join3 } from "node:path";
457
+
458
+ // packages/coding-agent/dist/gateway/text.js
459
+ function utf16Len(s) {
460
+ return s.length;
461
+ }
462
+ var graphemeSegmenter = new Intl.Segmenter(void 0, { granularity: "grapheme" });
463
+ function surrogateSafeCut(s, cut) {
464
+ if (cut > 0) {
465
+ let code = s.charCodeAt(cut - 1);
466
+ if (code >= 55296 && code <= 56319)
467
+ return cut - 1;
468
+ }
469
+ return cut;
470
+ }
471
+ function graphemeSafeCut(s, maxIndex) {
472
+ if (maxIndex <= 0)
473
+ return 0;
474
+ let end = 0;
475
+ for (let segment of graphemeSegmenter.segment(s)) {
476
+ let nextEnd = segment.index + segment.segment.length;
477
+ if (nextEnd > maxIndex)
478
+ break;
479
+ end = nextEnd;
480
+ }
481
+ return surrogateSafeCut(s, end);
482
+ }
483
+ function findSplitPoint(window, limit) {
484
+ let blank = window.lastIndexOf(`
485
+
486
+ `);
487
+ if (blank > 0)
488
+ return blank + 1;
489
+ let newline = window.lastIndexOf(`
490
+ `);
491
+ if (newline > 0)
492
+ return newline + 1;
493
+ let space = window.lastIndexOf(" ");
494
+ return space > 0 ? space + 1 : graphemeSafeCut(window, limit);
495
+ }
496
+ var FENCE_RE = /^\s*```/;
497
+ function openFenceAtEnd(chunk) {
498
+ let opener;
499
+ for (let line of chunk.split(`
500
+ `))
501
+ FENCE_RE.test(line) && (opener = opener === void 0 ? line.trim() : void 0);
502
+ return opener;
503
+ }
504
+ var FENCE_CLOSE = "\n```";
505
+ function splitRaw(text, limit) {
506
+ let chunks = [], rest = text;
507
+ for (; utf16Len(rest) > limit; ) {
508
+ let cut = findSplitPoint(rest.slice(0, limit), limit), chunk = rest.slice(0, cut).replace(/\s+$/, ""), opener = openFenceAtEnd(chunk);
509
+ for (; opener !== void 0 && chunk.length + FENCE_CLOSE.length > limit; )
510
+ cut = findSplitPoint(rest.slice(0, limit - FENCE_CLOSE.length), limit - FENCE_CLOSE.length), chunk = rest.slice(0, cut).replace(/\s+$/, ""), opener = openFenceAtEnd(chunk);
511
+ opener !== void 0 && chunk === opener && (cut = graphemeSafeCut(rest, Math.max(1, limit - FENCE_CLOSE.length)), chunk = rest.slice(0, cut), opener = openFenceAtEnd(chunk), opener !== void 0 && chunk === opener && (cut = graphemeSafeCut(rest, limit), chunk = rest.slice(0, cut), opener = void 0)), rest = rest.slice(cut).replace(/^\n+/, ""), opener !== void 0 && (chunk += FENCE_CLOSE, rest = `${opener}
512
+ ${rest}`), chunk.length > 0 && chunks.push(chunk);
513
+ }
514
+ return rest.length > 0 && chunks.push(rest), chunks;
515
+ }
516
+ function indicatorReserve(m) {
517
+ return 4 + 2 * String(m).length;
518
+ }
519
+ function splitMessage(text, max) {
520
+ if (max < 1)
521
+ throw new RangeError("max must be >= 1");
522
+ if (utf16Len(text) <= max)
523
+ return [text];
524
+ let chunks = splitRaw(text, max);
525
+ if (chunks.length > 1 && max - indicatorReserve(chunks.length) >= 1) {
526
+ let reserve = indicatorReserve(chunks.length), adjusted = splitRaw(text, max - reserve);
527
+ chunks = indicatorReserve(adjusted.length) === reserve ? adjusted : splitRaw(text, max - indicatorReserve(adjusted.length));
528
+ }
529
+ return chunks.length <= 1 ? chunks : chunks.map((chunk, i) => `${chunk} (${i + 1}/${chunks.length})`);
530
+ }
531
+
532
+ // packages/coding-agent/dist/gateway/presenter.js
533
+ var epochs = /* @__PURE__ */ new Map(), inputs = /* @__PURE__ */ new Map(), dialogs = /* @__PURE__ */ new Map(), adapters = /* @__PURE__ */ new Map(), timer, sending = !1, path2 = () => join3(getAgentDir(), "gateway-outbox.json"), outbox = [];
534
+ function canDeliver(key) {
535
+ let binding = conversationBinding(key);
536
+ if (!binding)
537
+ return !1;
538
+ let cfg = loadGatewayConfig();
539
+ return binding.owner && (binding.owner !== binding.source.userId || !isGatewayOwner(binding.source, cfg)) ? !1 : isAuthorized(binding.source, cfg, createPairingStore());
540
+ }
541
+ function gatewayDestination(key) {
542
+ let binding = conversationBinding(key), adapter = binding && adapters.get(binding.source.platform);
543
+ if (!binding || !adapter || !canDeliver(key))
544
+ throw new Error("This chat is no longer authorized or its platform is disconnected.");
545
+ return { adapter, source: binding.source };
546
+ }
547
+ function withGatewayPresentation(key, run) {
548
+ let { adapter, source } = gatewayDestination(key);
549
+ return runWithApprovalContext({ adapter, source, key }, run);
550
+ }
551
+ function startGatewayPresenter(connected) {
552
+ if (adapters = connected, existsSync3(path2()))
553
+ try {
554
+ outbox = JSON.parse(readFileSync3(path2(), "utf8"));
555
+ } catch {
556
+ throw new Error("Gateway outbox is invalid. Restore it before starting.");
557
+ }
558
+ timer && clearInterval(timer), timer = setInterval(() => {
559
+ flushOutbox();
560
+ }, 3e3), timer.unref(), flushOutbox();
561
+ }
562
+ function stopGatewayPresenter() {
563
+ timer && clearInterval(timer), timer = void 0;
564
+ for (let key of dialogs.keys())
565
+ invalidateGatewayDialogs(key);
566
+ adapters = /* @__PURE__ */ new Map();
567
+ }
568
+ async function sendGatewayNotice(key, text) {
569
+ let clean = text.replace(/\x1b\[[0-9;]*[a-zA-Z]/g, "").trim();
570
+ if (!clean || !canDeliver(key))
571
+ return;
572
+ let { adapter } = gatewayDestination(key);
573
+ for (let chunk of splitMessage(clean, adapter.maxMessageLength))
574
+ outbox.push({ id: randomUUID(), key, epoch: epochs.get(key) ?? 0, text: chunk });
575
+ atomicJson(path2(), outbox), await flushOutbox();
576
+ }
577
+ async function flushOutbox() {
578
+ if (!sending) {
579
+ sending = !0;
580
+ try {
581
+ for (let item of [...outbox]) {
582
+ if (!canDeliver(item.key)) {
583
+ outbox = outbox.filter((v) => v.id !== item.id), atomicJson(path2(), outbox);
584
+ continue;
585
+ }
586
+ let target;
587
+ try {
588
+ target = gatewayDestination(item.key);
589
+ } catch {
590
+ continue;
591
+ }
592
+ if ((await target.adapter.send(target.source.chatId, item.text, { threadId: target.source.threadId }).catch(() => ({ success: !1 }))).success)
593
+ outbox = outbox.filter((v) => v.id !== item.id), atomicJson(path2(), outbox);
594
+ else
595
+ break;
596
+ }
597
+ } finally {
598
+ sending = !1;
599
+ }
600
+ }
601
+ }
602
+ function invalidateGatewayDialogs(key) {
603
+ epochs.set(key, (epochs.get(key) ?? 0) + 1);
604
+ for (let cancel of dialogs.get(key) ?? [])
605
+ cancel();
606
+ dialogs.delete(key), inputs.delete(key);
607
+ }
608
+ function acceptGatewayInput(key, event) {
609
+ let input = inputs.get(key);
610
+ return !input || input.userId !== event.source.userId || !canDeliver(key) || event.text.startsWith("/") && event.text !== "/cancel" ? !1 : (input.resolve(event.text === "/cancel" ? void 0 : event.text), !0);
611
+ }
612
+ function dialog(key, opts, show) {
613
+ let epoch = epochs.get(key) ?? 0;
614
+ return new Promise((resolve, reject) => {
615
+ let settled = !1, finish = (value, error) => {
616
+ settled || (settled = !0, clearTimeout(timeout), opts?.signal?.removeEventListener("abort", cancel), inputs.delete(key), dialogs.get(key)?.delete(cancel), error !== void 0 ? reject(error) : resolve(value));
617
+ }, done = (value) => finish(value), cancel = () => done(void 0), timeout = setTimeout(cancel, opts?.timeout ?? 3e5), set = dialogs.get(key) ?? /* @__PURE__ */ new Set();
618
+ if (set.add(cancel), dialogs.set(key, set), opts?.signal?.addEventListener("abort", cancel, { once: !0 }), opts?.signal?.aborted) {
619
+ cancel();
620
+ return;
621
+ }
622
+ show(done, () => !settled && (epochs.get(key) ?? 0) === epoch && canDeliver(key)).catch((error) => {
623
+ finish(void 0, error);
624
+ });
625
+ });
626
+ }
627
+ function gatewaySelect(key, title, options, opts) {
628
+ return dialog(key, opts, async (done, valid) => {
629
+ let { adapter, source } = gatewayDestination(key), result = await createPicker(adapter, source, {
630
+ kind: "dialog",
631
+ sessionKey: key,
632
+ invokerId: source.userId,
633
+ title,
634
+ items: options.map((value) => ({ label: value, value })),
635
+ validate: valid,
636
+ onCancel: () => done(void 0),
637
+ resolve: async (item) => (done(item.value), { done: !0, text: `${title}
638
+ ${item.value}` })
639
+ }, { threadId: source.threadId });
640
+ if (!result.success)
641
+ throw new Error(result.error ?? "Could not send picker.");
642
+ });
643
+ }
644
+ function gatewayInput(key, title, placeholder, opts) {
645
+ return inputs.has(key) ? Promise.reject(new Error("Answer or cancel the existing question first.")) : dialog(key, opts, async (done) => {
646
+ let { source } = gatewayDestination(key);
647
+ inputs.set(key, { userId: source.userId, resolve: done }), await sendGatewayNotice(key, `${title}${placeholder ? `
648
+ ${placeholder}` : ""}
649
+ Reply with text, or /cancel.`);
650
+ });
651
+ }
652
+ function createGatewayUI(key) {
653
+ return {
654
+ ...noOpUIContext,
655
+ select: (title, options, opts) => gatewaySelect(key, title, options, opts),
656
+ confirm: async (title, message, opts) => await gatewaySelect(key, `${title}
657
+ ${message}`, ["Approve", "Decline"], opts) === "Approve",
658
+ input: (title, placeholder, opts) => gatewayInput(key, title, placeholder, opts),
659
+ editor: (title, prefill) => gatewayInput(key, title, prefill),
660
+ notify: (message) => {
661
+ sendGatewayNotice(key, message).catch(() => {
662
+ });
663
+ },
664
+ custom: async () => {
665
+ throw new Error("This command requires the terminal interface. Use the gateway's text commands or button pickers.");
666
+ },
667
+ pasteToEditor: (text) => {
668
+ sendGatewayNotice(key, text).catch(() => {
669
+ });
670
+ },
671
+ setEditorText: (text) => {
672
+ sendGatewayNotice(key, text).catch(() => {
673
+ });
674
+ }
675
+ };
676
+ }
677
+
678
+ export {
679
+ isGatewayOwner,
680
+ requireGatewayOwner,
681
+ isAuthorized,
682
+ addAllowedUser,
683
+ conversationBinding,
684
+ bindConversation,
685
+ getSession,
686
+ putSession,
687
+ touchSession,
688
+ removeSession,
689
+ listSessions,
690
+ runWithApprovalContext,
691
+ registerGatewayApprovalHandler,
692
+ handleApprovalCallback,
693
+ cancelGatewayApprovals,
694
+ createPicker,
695
+ handleCallback,
696
+ startButtonSweeper,
697
+ stopButtonSweeper,
698
+ splitMessage,
699
+ withGatewayPresentation,
700
+ startGatewayPresenter,
701
+ stopGatewayPresenter,
702
+ sendGatewayNotice,
703
+ invalidateGatewayDialogs,
704
+ acceptGatewayInput,
705
+ gatewaySelect,
706
+ gatewayInput,
707
+ createGatewayUI
708
+ };