agor-live 0.23.1 → 0.23.2

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 (469) hide show
  1. package/dist/core/claude/index.cjs +51 -27
  2. package/dist/core/claude/index.js +51 -27
  3. package/dist/core/claude-cli/index.cjs +13 -0
  4. package/dist/core/claude-cli/index.js +13 -0
  5. package/dist/core/claude-cli/pricing.d.ts.map +1 -1
  6. package/dist/core/client/index.cjs +17 -0
  7. package/dist/core/client/index.js +16 -0
  8. package/dist/core/db/index.cjs +618 -421
  9. package/dist/core/db/index.js +550 -353
  10. package/dist/core/db/repositories/boards.d.ts +27 -0
  11. package/dist/core/db/repositories/boards.d.ts.map +1 -1
  12. package/dist/core/db/repositories/branches.d.ts +11 -1
  13. package/dist/core/db/repositories/branches.d.ts.map +1 -1
  14. package/dist/core/db/repositories/gateway-channels.d.ts +9 -0
  15. package/dist/core/db/repositories/gateway-channels.d.ts.map +1 -1
  16. package/dist/core/db/repositories/sessions.d.ts +7 -0
  17. package/dist/core/db/repositories/sessions.d.ts.map +1 -1
  18. package/dist/core/environment/render-snapshot.cjs +6 -2
  19. package/dist/core/environment/render-snapshot.d.ts +2 -0
  20. package/dist/core/environment/render-snapshot.d.ts.map +1 -1
  21. package/dist/core/environment/render-snapshot.js +6 -2
  22. package/dist/core/environment/variable-resolver.cjs +3 -1
  23. package/dist/core/environment/variable-resolver.js +3 -1
  24. package/dist/core/index.cjs +684 -486
  25. package/dist/core/index.js +684 -486
  26. package/dist/core/lib/feathers-validation.cjs +3 -0
  27. package/dist/core/lib/feathers-validation.d.ts +1 -0
  28. package/dist/core/lib/feathers-validation.d.ts.map +1 -1
  29. package/dist/core/lib/feathers-validation.js +3 -0
  30. package/dist/core/local-actions/index.cjs +123 -56
  31. package/dist/core/local-actions/index.js +121 -54
  32. package/dist/core/mcp/index.cjs +21 -3
  33. package/dist/core/mcp/index.d.ts +1 -1
  34. package/dist/core/mcp/index.d.ts.map +1 -1
  35. package/dist/core/mcp/index.js +18 -3
  36. package/dist/core/mcp/template-patterns.d.ts +15 -0
  37. package/dist/core/mcp/template-patterns.d.ts.map +1 -0
  38. package/dist/core/mcp/template-resolver.d.ts +13 -0
  39. package/dist/core/mcp/template-resolver.d.ts.map +1 -1
  40. package/dist/core/models/browser.cjs +6 -0
  41. package/dist/core/models/browser.js +6 -0
  42. package/dist/core/models/claude.d.ts.map +1 -1
  43. package/dist/core/models/index.cjs +6 -0
  44. package/dist/core/models/index.js +6 -0
  45. package/dist/core/seed/index.cjs +360 -216
  46. package/dist/core/seed/index.js +329 -185
  47. package/dist/core/templates/handlebars-helpers.cjs +3 -1
  48. package/dist/core/templates/handlebars-helpers.d.ts +5 -0
  49. package/dist/core/templates/handlebars-helpers.d.ts.map +1 -1
  50. package/dist/core/templates/handlebars-helpers.js +3 -1
  51. package/dist/core/tools/mcp/auth-secrets.cjs +3460 -3
  52. package/dist/core/tools/mcp/auth-secrets.d.ts.map +1 -1
  53. package/dist/core/tools/mcp/auth-secrets.js +3477 -3
  54. package/dist/core/tools/mcp/http-headers.cjs +17 -1
  55. package/dist/core/tools/mcp/http-headers.d.ts.map +1 -1
  56. package/dist/core/tools/mcp/http-headers.js +15 -1
  57. package/dist/core/tools/mcp/oauth-refresh.cjs +67 -43
  58. package/dist/core/tools/mcp/oauth-refresh.js +65 -41
  59. package/dist/core/types/board.d.ts +12 -0
  60. package/dist/core/types/board.d.ts.map +1 -1
  61. package/dist/core/types/gateway.d.ts +14 -0
  62. package/dist/core/types/gateway.d.ts.map +1 -1
  63. package/dist/core/types/index.cjs +17 -0
  64. package/dist/core/types/index.js +16 -0
  65. package/dist/core/unix/index.cjs +67 -0
  66. package/dist/core/unix/index.js +67 -0
  67. package/dist/daemon/auth/executor-runtime-scope.d.ts.map +1 -1
  68. package/dist/daemon/auth/executor-runtime-scope.js +19 -5
  69. package/dist/daemon/auth/executor-session-token.d.ts +15 -0
  70. package/dist/daemon/auth/executor-session-token.d.ts.map +1 -0
  71. package/dist/daemon/auth/executor-session-token.js +17 -0
  72. package/dist/daemon/auth/issue-browser-tokens-hook.d.ts +24 -0
  73. package/dist/daemon/auth/issue-browser-tokens-hook.d.ts.map +1 -0
  74. package/dist/daemon/auth/issue-browser-tokens-hook.js +95 -0
  75. package/dist/daemon/auth/service-jwt-strategy.d.ts.map +1 -1
  76. package/dist/daemon/auth/service-jwt-strategy.js +14 -2
  77. package/dist/daemon/declarations.d.ts +1 -0
  78. package/dist/daemon/declarations.d.ts.map +1 -1
  79. package/dist/daemon/index.js +1365 -418
  80. package/dist/daemon/main.js +1365 -418
  81. package/dist/daemon/mcp/server.js +294 -31
  82. package/dist/daemon/mcp/tools/analytics.js +73 -24
  83. package/dist/daemon/mcp/tools/artifacts.js +73 -24
  84. package/dist/daemon/mcp/tools/boards.js +73 -24
  85. package/dist/daemon/mcp/tools/branches.js +73 -24
  86. package/dist/daemon/mcp/tools/card-types.js +73 -24
  87. package/dist/daemon/mcp/tools/cards.js +73 -24
  88. package/dist/daemon/mcp/tools/environment.js +73 -24
  89. package/dist/daemon/mcp/tools/gateway-channels.d.ts.map +1 -1
  90. package/dist/daemon/mcp/tools/gateway-channels.js +190 -38
  91. package/dist/daemon/mcp/tools/knowledge.js +73 -24
  92. package/dist/daemon/mcp/tools/mcp-servers.js +73 -24
  93. package/dist/daemon/mcp/tools/messages.js +73 -24
  94. package/dist/daemon/mcp/tools/proxies.js +73 -24
  95. package/dist/daemon/mcp/tools/repos.js +73 -24
  96. package/dist/daemon/mcp/tools/schedules.js +73 -24
  97. package/dist/daemon/mcp/tools/search.js +73 -24
  98. package/dist/daemon/mcp/tools/sessions.js +73 -24
  99. package/dist/daemon/mcp/tools/tasks.js +73 -24
  100. package/dist/daemon/mcp/tools/users.js +76 -27
  101. package/dist/daemon/mcp/tools/widgets.d.ts.map +1 -1
  102. package/dist/daemon/mcp/tools/widgets.js +257 -99
  103. package/dist/daemon/oauth-auth-helpers.d.ts +35 -0
  104. package/dist/daemon/oauth-auth-helpers.d.ts.map +1 -0
  105. package/dist/daemon/oauth-auth-helpers.js +14 -0
  106. package/dist/daemon/register-hooks.d.ts +1 -0
  107. package/dist/daemon/register-hooks.d.ts.map +1 -1
  108. package/dist/daemon/register-hooks.js +304 -53
  109. package/dist/daemon/register-routes.d.ts.map +1 -1
  110. package/dist/daemon/register-routes.js +738 -288
  111. package/dist/daemon/register-services.d.ts.map +1 -1
  112. package/dist/daemon/register-services.js +386 -155
  113. package/dist/daemon/services/boards.d.ts +5 -0
  114. package/dist/daemon/services/boards.d.ts.map +1 -1
  115. package/dist/daemon/services/boards.js +7 -0
  116. package/dist/daemon/services/branches.d.ts.map +1 -1
  117. package/dist/daemon/services/branches.js +31 -2
  118. package/dist/daemon/services/claude-models.d.ts.map +1 -1
  119. package/dist/daemon/services/claude-models.js +4 -1
  120. package/dist/daemon/services/gateway.d.ts +15 -0
  121. package/dist/daemon/services/gateway.d.ts.map +1 -1
  122. package/dist/daemon/services/gateway.js +34 -0
  123. package/dist/daemon/services/health-monitor.d.ts.map +1 -1
  124. package/dist/daemon/services/health-monitor.js +10 -7
  125. package/dist/daemon/services/session-streams.d.ts +29 -0
  126. package/dist/daemon/services/session-streams.d.ts.map +1 -0
  127. package/dist/daemon/services/session-streams.js +84 -0
  128. package/dist/daemon/services/session-token-service.d.ts.map +1 -1
  129. package/dist/daemon/services/session-token-service.js +8 -4
  130. package/dist/daemon/setup/index.js +43 -11
  131. package/dist/daemon/setup/socketio.d.ts.map +1 -1
  132. package/dist/daemon/setup/socketio.js +43 -11
  133. package/dist/daemon/startup.d.ts.map +1 -1
  134. package/dist/daemon/startup.js +37 -16
  135. package/dist/daemon/utils/authorization.js +19 -5
  136. package/dist/daemon/utils/emit-service-event.d.ts +56 -0
  137. package/dist/daemon/utils/emit-service-event.d.ts.map +1 -0
  138. package/dist/daemon/utils/emit-service-event.js +23 -0
  139. package/dist/daemon/utils/mcp-header-secrets.d.ts +3 -5
  140. package/dist/daemon/utils/mcp-header-secrets.d.ts.map +1 -1
  141. package/dist/daemon/utils/mcp-header-secrets.js +31 -2
  142. package/dist/daemon/utils/realtime-access-cache.d.ts +9 -0
  143. package/dist/daemon/utils/realtime-access-cache.d.ts.map +1 -1
  144. package/dist/daemon/utils/realtime-access-cache.js +24 -0
  145. package/dist/daemon/utils/realtime-publish.d.ts +24 -0
  146. package/dist/daemon/utils/realtime-publish.d.ts.map +1 -1
  147. package/dist/daemon/utils/realtime-publish.js +120 -2
  148. package/dist/daemon/utils/session-queue-tenant-scope.d.ts +24 -0
  149. package/dist/daemon/utils/session-queue-tenant-scope.d.ts.map +1 -0
  150. package/dist/daemon/utils/session-queue-tenant-scope.js +133 -0
  151. package/dist/daemon/widgets/gateway-token/index.d.ts +114 -0
  152. package/dist/daemon/widgets/gateway-token/index.d.ts.map +1 -0
  153. package/dist/daemon/widgets/gateway-token/index.js +14711 -0
  154. package/dist/daemon/widgets/index.d.ts.map +1 -1
  155. package/dist/daemon/widgets/index.js +190 -16
  156. package/dist/daemon/widgets/registry.d.ts +7 -0
  157. package/dist/daemon/widgets/registry.d.ts.map +1 -1
  158. package/dist/daemon/widgets/submissions.js +12 -9
  159. package/dist/executor/commands/git.d.ts.map +1 -1
  160. package/dist/executor/commands/git.js +2 -0
  161. package/dist/executor/db/feathers-repositories.d.ts +19 -1
  162. package/dist/executor/db/feathers-repositories.d.ts.map +1 -1
  163. package/dist/executor/db/feathers-repositories.js +31 -1
  164. package/dist/executor/handlers/sdk/claude.d.ts.map +1 -1
  165. package/dist/executor/handlers/sdk/claude.js +1 -1
  166. package/dist/executor/handlers/sdk/codex.d.ts.map +1 -1
  167. package/dist/executor/handlers/sdk/codex.js +1 -1
  168. package/dist/executor/handlers/sdk/copilot.d.ts.map +1 -1
  169. package/dist/executor/handlers/sdk/copilot.js +1 -1
  170. package/dist/executor/handlers/sdk/cursor.d.ts.map +1 -1
  171. package/dist/executor/handlers/sdk/cursor.js +1 -0
  172. package/dist/executor/handlers/sdk/gemini.d.ts.map +1 -1
  173. package/dist/executor/handlers/sdk/gemini.js +1 -1
  174. package/dist/executor/handlers/sdk/opencode.d.ts.map +1 -1
  175. package/dist/executor/handlers/sdk/opencode.js +1 -1
  176. package/dist/executor/payload-types.d.ts +5 -5
  177. package/dist/executor/sdk-handlers/base/mcp-scoping.d.ts +8 -1
  178. package/dist/executor/sdk-handlers/base/mcp-scoping.d.ts.map +1 -1
  179. package/dist/executor/sdk-handlers/base/mcp-scoping.js +58 -6
  180. package/dist/executor/sdk-handlers/claude/claude-tool.d.ts +2 -2
  181. package/dist/executor/sdk-handlers/claude/claude-tool.d.ts.map +1 -1
  182. package/dist/executor/sdk-handlers/claude/claude-tool.js +2 -2
  183. package/dist/executor/sdk-handlers/claude/prompt-service.d.ts +13 -3
  184. package/dist/executor/sdk-handlers/claude/prompt-service.d.ts.map +1 -1
  185. package/dist/executor/sdk-handlers/claude/prompt-service.js +16 -3
  186. package/dist/executor/sdk-handlers/claude/query-builder.d.ts +2 -1
  187. package/dist/executor/sdk-handlers/claude/query-builder.d.ts.map +1 -1
  188. package/dist/executor/sdk-handlers/claude/query-builder.js +2 -1
  189. package/dist/executor/sdk-handlers/codex/codex-tool.d.ts +2 -2
  190. package/dist/executor/sdk-handlers/codex/codex-tool.d.ts.map +1 -1
  191. package/dist/executor/sdk-handlers/codex/codex-tool.js +2 -2
  192. package/dist/executor/sdk-handlers/codex/prompt-service.d.ts +3 -2
  193. package/dist/executor/sdk-handlers/codex/prompt-service.d.ts.map +1 -1
  194. package/dist/executor/sdk-handlers/codex/prompt-service.js +70 -6
  195. package/dist/executor/sdk-handlers/copilot/copilot-tool.d.ts +2 -2
  196. package/dist/executor/sdk-handlers/copilot/copilot-tool.d.ts.map +1 -1
  197. package/dist/executor/sdk-handlers/copilot/copilot-tool.js +2 -2
  198. package/dist/executor/sdk-handlers/copilot/prompt-service.d.ts +3 -2
  199. package/dist/executor/sdk-handlers/copilot/prompt-service.d.ts.map +1 -1
  200. package/dist/executor/sdk-handlers/copilot/prompt-service.js +4 -1
  201. package/dist/executor/sdk-handlers/gemini/gemini-tool.d.ts +2 -2
  202. package/dist/executor/sdk-handlers/gemini/gemini-tool.d.ts.map +1 -1
  203. package/dist/executor/sdk-handlers/gemini/gemini-tool.js +2 -2
  204. package/dist/executor/sdk-handlers/gemini/prompt-service.d.ts +3 -2
  205. package/dist/executor/sdk-handlers/gemini/prompt-service.d.ts.map +1 -1
  206. package/dist/executor/sdk-handlers/gemini/prompt-service.js +4 -1
  207. package/dist/executor/sdk-handlers/opencode/opencode-tool.d.ts +3 -2
  208. package/dist/executor/sdk-handlers/opencode/opencode-tool.d.ts.map +1 -1
  209. package/dist/executor/sdk-handlers/opencode/opencode-tool.js +4 -1
  210. package/dist/executor/services/feathers-client.d.ts.map +1 -1
  211. package/dist/executor/services/feathers-client.js +119 -20
  212. package/dist/ui/assets/AgorEmojiPickerInner-leeNywMc.js +1 -0
  213. package/dist/ui/assets/App-Dpl4Cc0U.js +4 -0
  214. package/dist/ui/assets/App-Dpl4Cc0U.js.gz +0 -0
  215. package/dist/ui/assets/AppNode-wN3UZlFK.js +1 -0
  216. package/dist/ui/assets/AppNode-wN3UZlFK.js.gz +0 -0
  217. package/dist/ui/assets/{ArtifactConsentModal-oMMzRn8L.js → ArtifactConsentModal-DjzXcP_L.js} +1 -1
  218. package/dist/ui/assets/ArtifactConsentModal-DjzXcP_L.js.gz +0 -0
  219. package/dist/ui/assets/ArtifactFullscreenPage-B3b_EZ0F.js +9 -0
  220. package/dist/ui/assets/ArtifactFullscreenPage-B3b_EZ0F.js.gz +0 -0
  221. package/dist/ui/assets/ArtifactNode-DISy2T-6.js +9 -0
  222. package/dist/ui/assets/ArtifactNode-DISy2T-6.js.gz +0 -0
  223. package/dist/ui/assets/AutocompleteTextarea-DUpsoEGr.js +19 -0
  224. package/dist/ui/assets/AutocompleteTextarea-DUpsoEGr.js.gz +0 -0
  225. package/dist/ui/assets/BoardObjectNodes-BakeGpIX.js +34 -0
  226. package/dist/ui/assets/BoardObjectNodes-BakeGpIX.js.gz +0 -0
  227. package/dist/ui/assets/{CodeEditor.inner-Cuj6RuLL.js → CodeEditor.inner-HmSdTLW5.js} +1 -1
  228. package/dist/ui/assets/CodeEditor.inner-HmSdTLW5.js.gz +0 -0
  229. package/dist/ui/assets/ConversationView-mWaA-B1f.js +1 -0
  230. package/dist/ui/assets/ConversationView-mWaA-B1f.js.gz +0 -0
  231. package/dist/ui/assets/{EmbeddedTerminal-Lx5I9EOJ.js → EmbeddedTerminal-NNoyPA81.js} +1 -1
  232. package/dist/ui/assets/EmbeddedTerminal-NNoyPA81.js.gz +0 -0
  233. package/dist/ui/assets/KnowledgePage-CkxVnRvz.js +24 -0
  234. package/dist/ui/assets/KnowledgePage-CkxVnRvz.js.gz +0 -0
  235. package/dist/ui/assets/{MarketingScreenshotPage-CmDPBHOl.js → MarketingScreenshotPage-B86Gs8jx.js} +2 -2
  236. package/dist/ui/assets/MarketingScreenshotPage-B86Gs8jx.js.gz +0 -0
  237. package/dist/ui/assets/MobileApp-BPs-SXvz.js +1 -0
  238. package/dist/ui/assets/MobileApp-BPs-SXvz.js.gz +0 -0
  239. package/dist/ui/assets/SessionCanvas-xVfDoEtz.js +13 -0
  240. package/dist/ui/assets/SessionCanvas-xVfDoEtz.js.gz +0 -0
  241. package/dist/ui/assets/{StreamdownDemoPage-okKKR2QH.js → StreamdownDemoPage-CvWLzVsv.js} +2 -2
  242. package/dist/ui/assets/StreamdownDemoPage-CvWLzVsv.js.gz +0 -0
  243. package/dist/ui/assets/{TerminalModal-D9jMGZXv.js → TerminalModal-ExOgsuOP.js} +2 -2
  244. package/dist/ui/assets/TerminalModal-ExOgsuOP.js.gz +0 -0
  245. package/dist/ui/assets/ThemeSwitcher-Cgyp5ruu.js +1 -0
  246. package/dist/ui/assets/ThemeSwitcher-Cgyp5ruu.js.gz +0 -0
  247. package/dist/ui/assets/{ThemedSyntaxHighlighter.inner-C1FdIHn0.js → ThemedSyntaxHighlighter.inner-rpCN9S6K.js} +1 -1
  248. package/dist/ui/assets/{antd-DT5ackd0.js → antd-BCqimh1J.js} +5 -5
  249. package/dist/ui/assets/{antd-DT5ackd0.js.gz → antd-BCqimh1J.js.gz} +0 -0
  250. package/dist/ui/assets/architecture-U656AL7Q-BxSQIjrE.js +1 -0
  251. package/dist/ui/assets/{architectureDiagram-VXUJARFQ-DwTJGGoj.js → architectureDiagram-VXUJARFQ-pDpGHSqT.js} +1 -1
  252. package/dist/ui/assets/architectureDiagram-VXUJARFQ-pDpGHSqT.js.gz +0 -0
  253. package/dist/ui/assets/{blockDiagram-VD42YOAC-Dh1_TVW2.js → blockDiagram-VD42YOAC-uP8JTJpK.js} +1 -1
  254. package/dist/ui/assets/blockDiagram-VD42YOAC-uP8JTJpK.js.gz +0 -0
  255. package/dist/ui/assets/{c4Diagram-YG6GDRKO-B1e96AcB.js → c4Diagram-YG6GDRKO-qQe72Mm7.js} +1 -1
  256. package/dist/ui/assets/c4Diagram-YG6GDRKO-qQe72Mm7.js.gz +0 -0
  257. package/dist/ui/assets/channel-CoUBs6Zn.js +1 -0
  258. package/dist/ui/assets/{chunk-4BX2VUAB-BODpCjJx.js → chunk-4BX2VUAB-sz-YE8Nt.js} +1 -1
  259. package/dist/ui/assets/chunk-4ZMWKKQ3-3oKtfWXp.js +3 -0
  260. package/dist/ui/assets/chunk-4ZMWKKQ3-3oKtfWXp.js.gz +0 -0
  261. package/dist/ui/assets/chunk-55IACEB6-BS04dgKF.js +1 -0
  262. package/dist/ui/assets/{chunk-ABZYJK2D-DCTXWSzV.js → chunk-ABZYJK2D-t3Gkphds.js} +3 -3
  263. package/dist/ui/assets/chunk-ABZYJK2D-t3Gkphds.js.gz +0 -0
  264. package/dist/ui/assets/{chunk-AGHRB4JF-CbNphBjE.js → chunk-AGHRB4JF-D_QmWxbY.js} +1 -1
  265. package/dist/ui/assets/chunk-AGHRB4JF-D_QmWxbY.js.gz +0 -0
  266. package/dist/ui/assets/{chunk-ATLVNIR6-rWg3qxof.js → chunk-ATLVNIR6-Bmg7-Ufz.js} +1 -1
  267. package/dist/ui/assets/chunk-ATLVNIR6-Bmg7-Ufz.js.gz +0 -0
  268. package/dist/ui/assets/{chunk-B4BG7PRW-CgtLCbpE.js → chunk-B4BG7PRW-dnSEE1u-.js} +1 -1
  269. package/dist/ui/assets/chunk-B4BG7PRW-dnSEE1u-.js.gz +0 -0
  270. package/dist/ui/assets/{chunk-CVBHYZKI-DTL6Zgr0.js → chunk-CVBHYZKI-BStaYnF0.js} +1 -1
  271. package/dist/ui/assets/{chunk-DI55MBZ5-Dwvx2Kva.js → chunk-DI55MBZ5-28dvx6o3.js} +1 -1
  272. package/dist/ui/assets/chunk-DI55MBZ5-28dvx6o3.js.gz +0 -0
  273. package/dist/ui/assets/chunk-EXTU4WIE-X-FURkEh.js +1 -0
  274. package/dist/ui/assets/{chunk-FMBD7UC4-BogA_9CV.js → chunk-FMBD7UC4-C_63gC9S.js} +1 -1
  275. package/dist/ui/assets/{chunk-HN2XXSSU-2blQO3Gb.js → chunk-HN2XXSSU-UFD374KI.js} +1 -1
  276. package/dist/ui/assets/chunk-HN2XXSSU-UFD374KI.js.gz +0 -0
  277. package/dist/ui/assets/{chunk-JA3XYJ7Z-Cr1rmOui.js → chunk-JA3XYJ7Z-B60hLNeR.js} +1 -1
  278. package/dist/ui/assets/chunk-JA3XYJ7Z-B60hLNeR.js.gz +0 -0
  279. package/dist/ui/assets/{chunk-JZLCHNYA-BsgZ79Fa.js → chunk-JZLCHNYA-ButC6pwN.js} +1 -1
  280. package/dist/ui/assets/chunk-JZLCHNYA-ButC6pwN.js.gz +0 -0
  281. package/dist/ui/assets/{chunk-MI3HLSF2-dwYeUy5S.js → chunk-MI3HLSF2-BivYzoSV.js} +1 -1
  282. package/dist/ui/assets/chunk-MI3HLSF2-BivYzoSV.js.gz +0 -0
  283. package/dist/ui/assets/chunk-N4CR4FBY-mVWzo5wJ.js +2 -0
  284. package/dist/ui/assets/chunk-N4CR4FBY-mVWzo5wJ.js.gz +0 -0
  285. package/dist/ui/assets/{chunk-QN33PNHL-DxdIDCAa.js → chunk-QN33PNHL-tXtHZpaG.js} +1 -1
  286. package/dist/ui/assets/{chunk-QXUST7PY-BCK2V0i-.js → chunk-QXUST7PY-DATib_Vv.js} +1 -1
  287. package/dist/ui/assets/chunk-QXUST7PY-DATib_Vv.js.gz +0 -0
  288. package/dist/ui/assets/chunk-QZHKN3VN-y6l249e5.js +1 -0
  289. package/dist/ui/assets/{chunk-S3R3BYOJ-GP3zIxrB.js → chunk-S3R3BYOJ-BEtfmflI.js} +1 -1
  290. package/dist/ui/assets/chunk-S3R3BYOJ-BEtfmflI.js.gz +0 -0
  291. package/dist/ui/assets/{chunk-TZMSLE5B-dX5RaM6g.js → chunk-TZMSLE5B-BY1ZtogK.js} +1 -1
  292. package/dist/ui/assets/chunk-TZMSLE5B-BY1ZtogK.js.gz +0 -0
  293. package/dist/ui/assets/classDiagram-2ON5EDUG-BYvq-uPY.js +1 -0
  294. package/dist/ui/assets/classDiagram-v2-WZHVMYZB-BYvq-uPY.js +1 -0
  295. package/dist/ui/assets/constants-CYzQKfD1.js +1 -0
  296. package/dist/ui/assets/{cose-bilkent-S5V4N54A-Dx0BJVDl.js → cose-bilkent-S5V4N54A-DPvYrqGG.js} +1 -1
  297. package/dist/ui/assets/cose-bilkent-S5V4N54A-DPvYrqGG.js.gz +0 -0
  298. package/dist/ui/assets/{dagre-6UL2VRFP-DiQSUxqN.js → dagre-6UL2VRFP-D800J6qb.js} +1 -1
  299. package/dist/ui/assets/dagre-6UL2VRFP-D800J6qb.js.gz +0 -0
  300. package/dist/ui/assets/{dagre-Bekd9Vdj.js → dagre-TNc4wezg.js} +1 -1
  301. package/dist/ui/assets/dagre-TNc4wezg.js.gz +0 -0
  302. package/dist/ui/assets/{diagram-PSM6KHXK-DtJnDQjc.js → diagram-PSM6KHXK-CGdP9F-X.js} +1 -1
  303. package/dist/ui/assets/diagram-PSM6KHXK-CGdP9F-X.js.gz +0 -0
  304. package/dist/ui/assets/{diagram-QEK2KX5R-CobkCRdj.js → diagram-QEK2KX5R-BD5lOCe5.js} +1 -1
  305. package/dist/ui/assets/diagram-QEK2KX5R-BD5lOCe5.js.gz +0 -0
  306. package/dist/ui/assets/{diagram-S2PKOQOG-DHEZYivc.js → diagram-S2PKOQOG-cp3l22vN.js} +1 -1
  307. package/dist/ui/assets/diagram-S2PKOQOG-cp3l22vN.js.gz +0 -0
  308. package/dist/ui/assets/editor-Cr0W5BQI.js +39 -0
  309. package/dist/ui/assets/editor-Cr0W5BQI.js.gz +0 -0
  310. package/dist/ui/assets/{emoji-B0hLmSLZ.js → emoji-Bv3m24sO.js} +1 -1
  311. package/dist/ui/assets/emoji-Bv3m24sO.js.gz +0 -0
  312. package/dist/ui/assets/{erDiagram-Q2GNP2WA-BVNeTZPQ.js → erDiagram-Q2GNP2WA-CQSXRgqr.js} +1 -1
  313. package/dist/ui/assets/erDiagram-Q2GNP2WA-CQSXRgqr.js.gz +0 -0
  314. package/dist/ui/assets/{flowDiagram-NV44I4VS-C73VFdyk.js → flowDiagram-NV44I4VS-CKcKpkph.js} +1 -1
  315. package/dist/ui/assets/flowDiagram-NV44I4VS-CKcKpkph.js.gz +0 -0
  316. package/dist/ui/assets/{ganttDiagram-LVOFAZNH-B_RosuD1.js → ganttDiagram-LVOFAZNH-DlAHzXO5.js} +1 -1
  317. package/dist/ui/assets/ganttDiagram-LVOFAZNH-DlAHzXO5.js.gz +0 -0
  318. package/dist/ui/assets/{gitGraph-F6HP7TQM-DMFIqn4h.js → gitGraph-F6HP7TQM-DeuXy4B1.js} +1 -1
  319. package/dist/ui/assets/{gitGraphDiagram-NY62KEGX-hxbgwNA1.js → gitGraphDiagram-NY62KEGX-aB-AI4Vq.js} +1 -1
  320. package/dist/ui/assets/gitGraphDiagram-NY62KEGX-aB-AI4Vq.js.gz +0 -0
  321. package/dist/ui/assets/index-B-qHc0o5.js +63 -0
  322. package/dist/ui/assets/index-B-qHc0o5.js.gz +0 -0
  323. package/dist/ui/assets/{info-NVLQJR56-DZ3K-w48.js → info-NVLQJR56-B9PG7xsc.js} +1 -1
  324. package/dist/ui/assets/{infoDiagram-ER5ION4S-CxnBJQu6.js → infoDiagram-ER5ION4S-C5Wpoqim.js} +1 -1
  325. package/dist/ui/assets/{journeyDiagram-XKPGCS4Q-CHYNj-f8.js → journeyDiagram-XKPGCS4Q-CHLziqfS.js} +1 -1
  326. package/dist/ui/assets/journeyDiagram-XKPGCS4Q-CHLziqfS.js.gz +0 -0
  327. package/dist/ui/assets/{kanban-definition-3W4ZIXB7-DQPCCsj2.js → kanban-definition-3W4ZIXB7-Dq7GzQE_.js} +1 -1
  328. package/dist/ui/assets/kanban-definition-3W4ZIXB7-Dq7GzQE_.js.gz +0 -0
  329. package/dist/ui/assets/{line-DBRjKmfa.js → line-DHKNg83I.js} +1 -1
  330. package/dist/ui/assets/{linear-DFao5Wyp.js → linear-BvUfn0I8.js} +1 -1
  331. package/dist/ui/assets/linear-BvUfn0I8.js.gz +0 -0
  332. package/dist/ui/assets/{mermaid-parser.core-DYCfacHj.js → mermaid-parser.core-C6d9tKoo.js} +2 -2
  333. package/dist/ui/assets/mermaid-parser.core-C6d9tKoo.js.gz +0 -0
  334. package/dist/ui/assets/{mermaid.core-C6xGFSdE.js → mermaid.core-CxE5KezR.js} +3 -3
  335. package/dist/ui/assets/mermaid.core-CxE5KezR.js.gz +0 -0
  336. package/dist/ui/assets/{mindmap-definition-VGOIOE7T-L3Pw-YM7.js → mindmap-definition-VGOIOE7T-DmPoQ48w.js} +1 -1
  337. package/dist/ui/assets/mindmap-definition-VGOIOE7T-DmPoQ48w.js.gz +0 -0
  338. package/dist/ui/assets/{packet-BFZMPI3H-CpL6iNoa.js → packet-BFZMPI3H-JZEkVZxU.js} +1 -1
  339. package/dist/ui/assets/{particles-CT8hcJOA.js → particles-CxMmUw86.js} +1 -1
  340. package/dist/ui/assets/particles-CxMmUw86.js.gz +0 -0
  341. package/dist/ui/assets/{pie-7BOR55EZ-hTqChbTo.js → pie-7BOR55EZ-_1II5pYQ.js} +1 -1
  342. package/dist/ui/assets/{pieDiagram-ADFJNKIX-Bf4Nou75.js → pieDiagram-ADFJNKIX-DrNkH33i.js} +1 -1
  343. package/dist/ui/assets/pieDiagram-ADFJNKIX-DrNkH33i.js.gz +0 -0
  344. package/dist/ui/assets/{quadrantDiagram-AYHSOK5B-DpjUTLB1.js → quadrantDiagram-AYHSOK5B-DOpC-HEF.js} +1 -1
  345. package/dist/ui/assets/quadrantDiagram-AYHSOK5B-DOpC-HEF.js.gz +0 -0
  346. package/dist/ui/assets/{radar-NHE76QYJ-myy7OENC.js → radar-NHE76QYJ-DDmqhzEZ.js} +1 -1
  347. package/dist/ui/assets/{reactflow-Cubtnk8i.js → reactflow-D98uPOMq.js} +1 -1
  348. package/dist/ui/assets/reactflow-D98uPOMq.js.gz +0 -0
  349. package/dist/ui/assets/{requirementDiagram-UZGBJVZJ-Bfrfh-0-.js → requirementDiagram-UZGBJVZJ-Bzx0iEPP.js} +1 -1
  350. package/dist/ui/assets/requirementDiagram-UZGBJVZJ-Bzx0iEPP.js.gz +0 -0
  351. package/dist/ui/assets/{sandpack-C58bwfIS.js → sandpack-059Z4UWP.js} +1 -1
  352. package/dist/ui/assets/sandpack-059Z4UWP.js.gz +0 -0
  353. package/dist/ui/assets/sandpackDefaults-CPMNDsw7.js +1 -0
  354. package/dist/ui/assets/sandpackDefaults-CPMNDsw7.js.gz +0 -0
  355. package/dist/ui/assets/{sankeyDiagram-TZEHDZUN-ClZAZ6va.js → sankeyDiagram-TZEHDZUN-Do9pvfDv.js} +1 -1
  356. package/dist/ui/assets/sankeyDiagram-TZEHDZUN-Do9pvfDv.js.gz +0 -0
  357. package/dist/ui/assets/{sequenceDiagram-WL72ISMW-CNgly63p.js → sequenceDiagram-WL72ISMW-CN8neUTA.js} +1 -1
  358. package/dist/ui/assets/sequenceDiagram-WL72ISMW-CN8neUTA.js.gz +0 -0
  359. package/dist/ui/assets/{src-DAeyG22O.js → src-DEbsv3pp.js} +2 -2
  360. package/dist/ui/assets/src-DEbsv3pp.js.gz +0 -0
  361. package/dist/ui/assets/{stateDiagram-FKZM4ZOC-BrEAoDpE.js → stateDiagram-FKZM4ZOC-BluWJi8n.js} +1 -1
  362. package/dist/ui/assets/stateDiagram-FKZM4ZOC-BluWJi8n.js.gz +0 -0
  363. package/dist/ui/assets/stateDiagram-v2-4FDKWEC3-DeyqBMDR.js +1 -0
  364. package/dist/ui/assets/{streamdown-BdAVfkeF.js → streamdown-BT1twtFc.js} +5 -5
  365. package/dist/ui/assets/streamdown-BT1twtFc.js.gz +0 -0
  366. package/dist/ui/assets/{syntax-BOfTnQiy.js → syntax-CBu6nLfm.js} +1 -1
  367. package/dist/ui/assets/syntax-CBu6nLfm.js.gz +0 -0
  368. package/dist/ui/assets/{timeline-definition-IT6M3QCI-CaRH3k4l.js → timeline-definition-IT6M3QCI-WdUNkiRj.js} +1 -1
  369. package/dist/ui/assets/timeline-definition-IT6M3QCI-WdUNkiRj.js.gz +0 -0
  370. package/dist/ui/assets/{treemap-KMMF4GRG-CUaLOV_B.js → treemap-KMMF4GRG-CoriU4Jl.js} +1 -1
  371. package/dist/ui/assets/{useUserLocalStorage-C8sgXgXR.js → useUserLocalStorage-GidNiOPC.js} +1 -1
  372. package/dist/ui/assets/useUserLocalStorage-GidNiOPC.js.gz +0 -0
  373. package/dist/ui/assets/{xychartDiagram-PRI3JC2R-BlhkI9T_.js → xychartDiagram-PRI3JC2R-CgBAKNt2.js} +1 -1
  374. package/dist/ui/assets/xychartDiagram-PRI3JC2R-CgBAKNt2.js.gz +0 -0
  375. package/dist/ui/index.html +9 -8
  376. package/dist/ui/index.html.gz +0 -0
  377. package/package.json +2 -2
  378. package/dist/ui/assets/AgorEmojiPickerInner-DQjr8M3_.js +0 -1
  379. package/dist/ui/assets/App-hJtcOxHv.js +0 -5
  380. package/dist/ui/assets/App-hJtcOxHv.js.gz +0 -0
  381. package/dist/ui/assets/AppNode-BhuMpn8O.js +0 -1
  382. package/dist/ui/assets/AppNode-BhuMpn8O.js.gz +0 -0
  383. package/dist/ui/assets/ArtifactConsentModal-oMMzRn8L.js.gz +0 -0
  384. package/dist/ui/assets/ArtifactFullscreenPage-B3wT8t8f.js +0 -9
  385. package/dist/ui/assets/ArtifactFullscreenPage-B3wT8t8f.js.gz +0 -0
  386. package/dist/ui/assets/ArtifactNode-BzQcrwFS.js +0 -9
  387. package/dist/ui/assets/ArtifactNode-BzQcrwFS.js.gz +0 -0
  388. package/dist/ui/assets/AutocompleteTextarea-Dau-V_30.js +0 -19
  389. package/dist/ui/assets/AutocompleteTextarea-Dau-V_30.js.gz +0 -0
  390. package/dist/ui/assets/BoardObjectNodes-DdKWv_ZT.js +0 -34
  391. package/dist/ui/assets/BoardObjectNodes-DdKWv_ZT.js.gz +0 -0
  392. package/dist/ui/assets/CodeEditor.inner-Cuj6RuLL.js.gz +0 -0
  393. package/dist/ui/assets/ConversationView-9-3ma1u-.js +0 -1
  394. package/dist/ui/assets/ConversationView-9-3ma1u-.js.gz +0 -0
  395. package/dist/ui/assets/EmbeddedTerminal-Lx5I9EOJ.js.gz +0 -0
  396. package/dist/ui/assets/KnowledgePage-Dz8YAMYC.js +0 -24
  397. package/dist/ui/assets/KnowledgePage-Dz8YAMYC.js.gz +0 -0
  398. package/dist/ui/assets/MarketingScreenshotPage-CmDPBHOl.js.gz +0 -0
  399. package/dist/ui/assets/MobileApp-BpgSG_gz.js +0 -1
  400. package/dist/ui/assets/MobileApp-BpgSG_gz.js.gz +0 -0
  401. package/dist/ui/assets/SessionCanvas-B6_mtlxK.js +0 -13
  402. package/dist/ui/assets/SessionCanvas-B6_mtlxK.js.gz +0 -0
  403. package/dist/ui/assets/StreamdownDemoPage-okKKR2QH.js.gz +0 -0
  404. package/dist/ui/assets/TerminalModal-D9jMGZXv.js.gz +0 -0
  405. package/dist/ui/assets/ThemeSwitcher-D9HgT37l.js +0 -1
  406. package/dist/ui/assets/ThemeSwitcher-D9HgT37l.js.gz +0 -0
  407. package/dist/ui/assets/architecture-U656AL7Q-DMnxkQRZ.js +0 -1
  408. package/dist/ui/assets/architectureDiagram-VXUJARFQ-DwTJGGoj.js.gz +0 -0
  409. package/dist/ui/assets/blockDiagram-VD42YOAC-Dh1_TVW2.js.gz +0 -0
  410. package/dist/ui/assets/c4Diagram-YG6GDRKO-B1e96AcB.js.gz +0 -0
  411. package/dist/ui/assets/channel-Jv4dT4S5.js +0 -1
  412. package/dist/ui/assets/chunk-55IACEB6-lJXvUquf.js +0 -1
  413. package/dist/ui/assets/chunk-ABZYJK2D-DCTXWSzV.js.gz +0 -0
  414. package/dist/ui/assets/chunk-AGHRB4JF-CbNphBjE.js.gz +0 -0
  415. package/dist/ui/assets/chunk-ATLVNIR6-rWg3qxof.js.gz +0 -0
  416. package/dist/ui/assets/chunk-B4BG7PRW-CgtLCbpE.js.gz +0 -0
  417. package/dist/ui/assets/chunk-DI55MBZ5-Dwvx2Kva.js.gz +0 -0
  418. package/dist/ui/assets/chunk-EXTU4WIE-DHyaqTsP.js +0 -1
  419. package/dist/ui/assets/chunk-HN2XXSSU-2blQO3Gb.js.gz +0 -0
  420. package/dist/ui/assets/chunk-JA3XYJ7Z-Cr1rmOui.js.gz +0 -0
  421. package/dist/ui/assets/chunk-JZLCHNYA-BsgZ79Fa.js.gz +0 -0
  422. package/dist/ui/assets/chunk-MI3HLSF2-dwYeUy5S.js.gz +0 -0
  423. package/dist/ui/assets/chunk-N4CR4FBY-DEMgSRVe.js +0 -2
  424. package/dist/ui/assets/chunk-N4CR4FBY-DEMgSRVe.js.gz +0 -0
  425. package/dist/ui/assets/chunk-QXUST7PY-BCK2V0i-.js.gz +0 -0
  426. package/dist/ui/assets/chunk-QZHKN3VN-CALjGrEE.js +0 -1
  427. package/dist/ui/assets/chunk-S3R3BYOJ-GP3zIxrB.js.gz +0 -0
  428. package/dist/ui/assets/chunk-TZMSLE5B-dX5RaM6g.js.gz +0 -0
  429. package/dist/ui/assets/classDiagram-2ON5EDUG-C3_RVP70.js +0 -1
  430. package/dist/ui/assets/classDiagram-v2-WZHVMYZB-C3_RVP70.js +0 -1
  431. package/dist/ui/assets/constants-GjIDNVyt.js +0 -1
  432. package/dist/ui/assets/cose-bilkent-S5V4N54A-Dx0BJVDl.js.gz +0 -0
  433. package/dist/ui/assets/dagre-6UL2VRFP-DiQSUxqN.js.gz +0 -0
  434. package/dist/ui/assets/dagre-Bekd9Vdj.js.gz +0 -0
  435. package/dist/ui/assets/diagram-PSM6KHXK-DtJnDQjc.js.gz +0 -0
  436. package/dist/ui/assets/diagram-QEK2KX5R-CobkCRdj.js.gz +0 -0
  437. package/dist/ui/assets/diagram-S2PKOQOG-DHEZYivc.js.gz +0 -0
  438. package/dist/ui/assets/editor-DQIG-JYZ.js +0 -43
  439. package/dist/ui/assets/editor-DQIG-JYZ.js.gz +0 -0
  440. package/dist/ui/assets/emoji-B0hLmSLZ.js.gz +0 -0
  441. package/dist/ui/assets/erDiagram-Q2GNP2WA-BVNeTZPQ.js.gz +0 -0
  442. package/dist/ui/assets/flowDiagram-NV44I4VS-C73VFdyk.js.gz +0 -0
  443. package/dist/ui/assets/ganttDiagram-LVOFAZNH-B_RosuD1.js.gz +0 -0
  444. package/dist/ui/assets/gitGraphDiagram-NY62KEGX-hxbgwNA1.js.gz +0 -0
  445. package/dist/ui/assets/index-DTz1Dif6.js +0 -64
  446. package/dist/ui/assets/index-DTz1Dif6.js.gz +0 -0
  447. package/dist/ui/assets/journeyDiagram-XKPGCS4Q-CHYNj-f8.js.gz +0 -0
  448. package/dist/ui/assets/kanban-definition-3W4ZIXB7-DQPCCsj2.js.gz +0 -0
  449. package/dist/ui/assets/linear-DFao5Wyp.js.gz +0 -0
  450. package/dist/ui/assets/mermaid-parser.core-DYCfacHj.js.gz +0 -0
  451. package/dist/ui/assets/mermaid.core-C6xGFSdE.js.gz +0 -0
  452. package/dist/ui/assets/mindmap-definition-VGOIOE7T-L3Pw-YM7.js.gz +0 -0
  453. package/dist/ui/assets/particles-CT8hcJOA.js.gz +0 -0
  454. package/dist/ui/assets/pieDiagram-ADFJNKIX-Bf4Nou75.js.gz +0 -0
  455. package/dist/ui/assets/quadrantDiagram-AYHSOK5B-DpjUTLB1.js.gz +0 -0
  456. package/dist/ui/assets/reactflow-Cubtnk8i.js.gz +0 -0
  457. package/dist/ui/assets/requirementDiagram-UZGBJVZJ-Bfrfh-0-.js.gz +0 -0
  458. package/dist/ui/assets/sandpack-C58bwfIS.js.gz +0 -0
  459. package/dist/ui/assets/sandpackDefaults-Bkga8XAE.js +0 -1
  460. package/dist/ui/assets/sankeyDiagram-TZEHDZUN-ClZAZ6va.js.gz +0 -0
  461. package/dist/ui/assets/sequenceDiagram-WL72ISMW-CNgly63p.js.gz +0 -0
  462. package/dist/ui/assets/src-DAeyG22O.js.gz +0 -0
  463. package/dist/ui/assets/stateDiagram-FKZM4ZOC-BrEAoDpE.js.gz +0 -0
  464. package/dist/ui/assets/stateDiagram-v2-4FDKWEC3-BNL52_oN.js +0 -1
  465. package/dist/ui/assets/streamdown-BdAVfkeF.js.gz +0 -0
  466. package/dist/ui/assets/syntax-BOfTnQiy.js.gz +0 -0
  467. package/dist/ui/assets/timeline-definition-IT6M3QCI-CaRH3k4l.js.gz +0 -0
  468. package/dist/ui/assets/useUserLocalStorage-C8sgXgXR.js.gz +0 -0
  469. package/dist/ui/assets/xychartDiagram-PRI3JC2R-BlhkI9T_.js.gz +0 -0
@@ -1,6 +1,6 @@
1
1
  // src/setup/socketio.ts
2
- import { resolveTenantContext } from "@agor/core/config";
3
- import { shortId } from "@agor/core/db";
2
+ import { resolveTenantContext as resolveTenantContext2 } from "@agor/core/config";
3
+ import { shortId as shortId3 } from "@agor/core/db";
4
4
  import jwt2 from "jsonwebtoken";
5
5
 
6
6
  // src/auth/runtime-tokens.ts
@@ -8,6 +8,37 @@ import jwt from "jsonwebtoken";
8
8
  var RUNTIME_JWT_ISSUER = "agor";
9
9
  var RUNTIME_JWT_AUDIENCE = "https://agor.dev";
10
10
 
11
+ // src/utils/realtime-publish.ts
12
+ import {
13
+ resolveTenantContext,
14
+ TenantResolutionError
15
+ } from "@agor/core/config";
16
+ import { getCurrentTenantId, shortId as shortId2 } from "@agor/core/db";
17
+ import { hasMinimumRole as hasMinimumRole2, ROLES as ROLES2 } from "@agor/core/types";
18
+
19
+ // src/utils/branch-authorization.ts
20
+ import { shortId } from "@agor/core/db";
21
+ import { Forbidden, NotAuthenticated, NotFound } from "@agor/core/feathers";
22
+ import { BRANCH_PERMISSION_LEVELS, hasMinimumRole, ROLES } from "@agor/core/types";
23
+ var PERMISSION_RANK = Object.fromEntries(
24
+ BRANCH_PERMISSION_LEVELS.map((level, i) => [level, i - 1])
25
+ );
26
+
27
+ // src/utils/realtime-access-cache.ts
28
+ var DEFAULT_BRANCH_VISIBILITY_TTL_MS = 5 * 6e4;
29
+ var DEFAULT_SESSION_BRANCH_TTL_MS = 60 * 6e4;
30
+
31
+ // src/utils/realtime-publish.ts
32
+ var SESSION_STREAM_CHANNEL_PREFIX = "session-stream:";
33
+ function leaveAllSessionStreamChannels(app, connection) {
34
+ for (const name of app.channels ?? []) {
35
+ if (name.startsWith(SESSION_STREAM_CHANNEL_PREFIX)) {
36
+ app.channel(name).leave(connection);
37
+ }
38
+ }
39
+ }
40
+ var DEBUG_REALTIME_PUBLISH = process.env.AGOR_DEBUG_REALTIME_PUBLISH === "1" || process.env.DEBUG?.includes("realtime-publish");
41
+
11
42
  // src/setup/socketio.ts
12
43
  function socketAuthState(userId, isService, tenant) {
13
44
  return tenant ? { userId, isService, tenant } : { userId, isService };
@@ -107,7 +138,7 @@ function createSocketIOConfig(app, options) {
107
138
  if (tokenType !== void 0 && tokenType !== "access" && tokenType !== "service") {
108
139
  return next(new Error("Invalid token type"));
109
140
  }
110
- const tenant = multiTenancy ? resolveTenantContext(multiTenancy, {
141
+ const tenant = multiTenancy ? resolveTenantContext2(multiTenancy, {
111
142
  authPayload: decoded,
112
143
  headers: socket.handshake.headers
113
144
  }) : void 0;
@@ -144,7 +175,7 @@ function createSocketIOConfig(app, options) {
144
175
  fs.tenant = tenant;
145
176
  if (fs.data) fs.data.tenant = tenant;
146
177
  }
147
- console.log(`\u{1F510} WebSocket authenticated: ${socket.id} (user: ${shortId(user.user_id)})`);
178
+ console.log(`\u{1F510} WebSocket authenticated: ${socket.id} (user: ${shortId3(user.user_id)})`);
148
179
  next();
149
180
  } catch (error) {
150
181
  console.error(`\u274C WebSocket authentication failed for ${socket.id}:`, error);
@@ -155,7 +186,7 @@ function createSocketIOConfig(app, options) {
155
186
  activeConnections++;
156
187
  const user = socket.feathers?.user;
157
188
  console.log(
158
- `\u{1F50C} Socket.io connection established: ${socket.id} (user: ${user ? shortId(user.user_id) : "unknown"}, total: ${activeConnections})`
189
+ `\u{1F50C} Socket.io connection established: ${socket.id} (user: ${user ? shortId3(user.user_id) : "unknown"}, total: ${activeConnections})`
159
190
  );
160
191
  if (buildInfo) {
161
192
  socket.emit("server-info", {
@@ -166,7 +197,7 @@ function createSocketIOConfig(app, options) {
166
197
  if (user?.user_id) {
167
198
  socket.join(userRoomName(user.user_id));
168
199
  console.log(
169
- `\u{1F3E0} Socket ${socket.id} joined user room at connection: user:${shortId(user.user_id)}`
200
+ `\u{1F3E0} Socket ${socket.id} joined user room at connection: user:${shortId3(user.user_id)}`
170
201
  );
171
202
  }
172
203
  setTimeout(() => {
@@ -251,7 +282,7 @@ function createSocketIOConfig(app, options) {
251
282
  if (typeof payloadUserId !== "string" || payloadUserId !== auth.userId) {
252
283
  rejectTerminal(
253
284
  event,
254
- `payload userId (${shortId(String(payloadUserId))}\u2026) does not match authed userId (${shortId(auth.userId)}\u2026)`
285
+ `payload userId (${shortId3(String(payloadUserId))}\u2026) does not match authed userId (${shortId3(auth.userId)}\u2026)`
255
286
  );
256
287
  return null;
257
288
  }
@@ -275,7 +306,7 @@ function createSocketIOConfig(app, options) {
275
306
  if (!auth.isService && auth.userId !== target) {
276
307
  rejectTerminal(
277
308
  "join",
278
- `user ${auth.userId ? shortId(auth.userId) : "unknown"}\u2026 tried to join ${shortId(target)}\u2026's channel`
309
+ `user ${auth.userId ? shortId3(auth.userId) : "unknown"}\u2026 tried to join ${shortId3(target)}\u2026's channel`
279
310
  );
280
311
  return;
281
312
  }
@@ -293,7 +324,7 @@ function createSocketIOConfig(app, options) {
293
324
  if (!auth.isService && auth.userId !== target) {
294
325
  rejectTerminal(
295
326
  "leave",
296
- `user ${auth.userId ? shortId(auth.userId) : "unknown"}\u2026 tried to leave ${shortId(target)}\u2026's channel`
327
+ `user ${auth.userId ? shortId3(auth.userId) : "unknown"}\u2026 tried to leave ${shortId3(target)}\u2026's channel`
297
328
  );
298
329
  return;
299
330
  }
@@ -394,7 +425,7 @@ function createSocketIOConfig(app, options) {
394
425
  if (socket.feathers === context.connection) {
395
426
  socket.join(userRoomName(userId));
396
427
  console.debug(
397
- `\u{1F3E0} Socket ${socket.id} joined user room after login: user:${shortId(userId)}`
428
+ `\u{1F3E0} Socket ${socket.id} joined user room after login: user:${shortId3(userId)}`
398
429
  );
399
430
  break;
400
431
  }
@@ -422,7 +453,7 @@ function configureChannels(app, options = {}) {
422
453
  const result = authResult;
423
454
  console.debug("\u2705 Login event fired:", result.user?.user_id, result.user?.email);
424
455
  const connection = context.connection;
425
- const tenant = options.multiTenancy ? resolveTenantContext(options.multiTenancy, {
456
+ const tenant = options.multiTenancy ? resolveTenantContext2(options.multiTenancy, {
426
457
  params: {
427
458
  user: result.user,
428
459
  authentication: { payload: result.authentication?.payload }
@@ -454,6 +485,7 @@ function configureChannels(app, options = {}) {
454
485
  app.channel(tenantUserChannelName(tenant.tenant_id, userId)).leave(context.connection);
455
486
  }
456
487
  }
488
+ leaveAllSessionStreamChannels(app, context.connection);
457
489
  }
458
490
  });
459
491
  }
@@ -1 +1 @@
1
- {"version":3,"file":"startup.d.ts","sourceRoot":"","sources":["../src/startup.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAMpD,OAAO,EAKL,KAAK,wBAAwB,EAC9B,MAAM,eAAe,CAAC;AACvB,OAAO,KAAK,EAAiB,OAAO,EAAa,IAAI,EAAiB,MAAM,kBAAkB,CAAC;AAE/F,OAAO,KAAK,EAAE,WAAW,EAAE,mBAAmB,EAAoB,MAAM,mBAAmB,CAAC;AAM5F,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAiBhE,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,WAAW,CAAC;IACjB,EAAE,EAAE,wBAAwB,CAAC;IAC7B,MAAM,EAAE,UAAU,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,wEAAwE;IACxE,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC;IACvC,2EAA2E;IAE3E,WAAW,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,GAAG,CAAC;IACnC,+DAA+D;IAC/D,eAAe,EAAE,MAAM,OAAO,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IACzD,gDAAgD;IAChD,eAAe,EAAE,mBAAmB,CAAC;IACrC,gBAAgB,EAAE,gBAAgB,GAAG,IAAI,CAAC;CAC3C;AA0ED,UAAU,mBAAmB;IAC3B,WAAW,EAAE,OAAO,CAAC;IACrB,aAAa,EAAE,IAAI,EAAE,CAAC;IACtB,gBAAgB,EAAE,OAAO,EAAE,CAAC;IAC5B,2BAA2B,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACzC,WAAW,EAAE,IAAI,EAAE,CAAC;IACpB,8BAA8B,EAAE,MAAM,CAAC;CACxC;AAED,wBAAsB,qBAAqB,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAE7F;AA0SD,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,GAAG,IAAI,CASnF;AA0CD,wBAAsB,OAAO,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CA8NhE"}
1
+ {"version":3,"file":"startup.d.ts","sourceRoot":"","sources":["../src/startup.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAMpD,OAAO,EAKL,KAAK,wBAAwB,EAC9B,MAAM,eAAe,CAAC;AACvB,OAAO,KAAK,EAAiB,OAAO,EAAa,IAAI,EAAiB,MAAM,kBAAkB,CAAC;AAE/F,OAAO,KAAK,EAAE,WAAW,EAAE,mBAAmB,EAAoB,MAAM,mBAAmB,CAAC;AAM5F,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAiBhE,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,WAAW,CAAC;IACjB,EAAE,EAAE,wBAAwB,CAAC;IAC7B,MAAM,EAAE,UAAU,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,wEAAwE;IACxE,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC;IACvC,2EAA2E;IAE3E,WAAW,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,GAAG,CAAC;IACnC,+DAA+D;IAC/D,eAAe,EAAE,MAAM,OAAO,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IACzD,gDAAgD;IAChD,eAAe,EAAE,mBAAmB,CAAC;IACrC,gBAAgB,EAAE,gBAAgB,GAAG,IAAI,CAAC;CAC3C;AA0ED,UAAU,mBAAmB;IAC3B,WAAW,EAAE,OAAO,CAAC;IACrB,aAAa,EAAE,IAAI,EAAE,CAAC;IACtB,gBAAgB,EAAE,OAAO,EAAE,CAAC;IAC5B,2BAA2B,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACzC,WAAW,EAAE,IAAI,EAAE,CAAC;IACpB,8BAA8B,EAAE,MAAM,CAAC;CACxC;AAED,wBAAsB,qBAAqB,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAE7F;AAyUD,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,GAAG,IAAI,CASnF;AA0CD,wBAAsB,OAAO,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CA8NhE"}
@@ -60,7 +60,7 @@ import {
60
60
  SessionRepository as SessionRepository3,
61
61
  shortId as shortId6
62
62
  } from "@agor/core/db";
63
- import { SessionStatus as SessionStatus2, TaskStatus } from "@agor/core/types";
63
+ import { isTerminalTaskStatus, SessionStatus as SessionStatus2, TaskStatus } from "@agor/core/types";
64
64
 
65
65
  // src/services/executor-heartbeat-supervisor.ts
66
66
  import { shortId } from "@agor/core/db";
@@ -134,6 +134,7 @@ import { ENVIRONMENT } from "@agor/core/config";
134
134
  import {
135
135
  BranchRepository,
136
136
  getHiddenTenantId,
137
+ runWithoutTenantDatabaseScope,
137
138
  runWithSystemDatabaseScope,
138
139
  runWithTenantDatabaseScope,
139
140
  shortId as shortId2
@@ -223,15 +224,17 @@ var HealthMonitor = class {
223
224
  startMonitoring(branchId, params = this.branchParams.get(branchId)) {
224
225
  this.stopMonitoring(branchId);
225
226
  if (params) this.branchParams.set(branchId, params);
226
- setTimeout(() => {
227
- if (this.isShuttingDown) return;
228
- this.checkHealth(branchId);
229
- const interval = setInterval(() => {
227
+ runWithoutTenantDatabaseScope(() => {
228
+ setTimeout(() => {
230
229
  if (this.isShuttingDown) return;
231
230
  this.checkHealth(branchId);
232
- }, ENVIRONMENT.HEALTH_CHECK_INTERVAL_MS);
233
- this.intervals.set(branchId, interval);
234
- }, ENVIRONMENT.STARTUP_GRACE_PERIOD_MS);
231
+ const interval = setInterval(() => {
232
+ if (this.isShuttingDown) return;
233
+ this.checkHealth(branchId);
234
+ }, ENVIRONMENT.HEALTH_CHECK_INTERVAL_MS);
235
+ this.intervals.set(branchId, interval);
236
+ }, ENVIRONMENT.STARTUP_GRACE_PERIOD_MS);
237
+ });
235
238
  }
236
239
  /**
237
240
  * Stop monitoring a branch's health
@@ -1895,18 +1898,36 @@ async function cleanupOrphanStatusesInTenantScope(ctx) {
1895
1898
  }
1896
1899
  }
1897
1900
  }
1898
- const stuckIdleResult = await sessionsService.find({
1901
+ const bootInterruptedTaskIds = /* @__PURE__ */ new Set([
1902
+ ...orphanedTasks.map((t) => t.task_id),
1903
+ ...queuedTasks.map((t) => t.task_id)
1904
+ ]);
1905
+ const idleNotReadyResult = await sessionsService.find({
1899
1906
  query: { status: SessionStatus2.IDLE, ready_for_prompt: false, $limit: 1e3 },
1900
1907
  ...startupParams
1901
1908
  });
1902
- const stuckIdleSessions = stuckIdleResult.data;
1903
- if (stuckIdleSessions.length > 0) {
1904
- for (const session of stuckIdleSessions) {
1905
- await app.service("sessions").patch(session.session_id, { ready_for_prompt: true }, startupParams);
1906
- startupDebug(
1907
- ` \u2713 Unblocked stuck-idle session ${shortId6(session.session_id)} (ready_for_prompt was false)`
1908
- );
1909
+ const stuckIdleSessions = [];
1910
+ for (const session of idleNotReadyResult.data) {
1911
+ const latestTaskId = session.tasks?.at(-1);
1912
+ if (!latestTaskId) {
1913
+ continue;
1909
1914
  }
1915
+ let wasInterrupted = bootInterruptedTaskIds.has(latestTaskId);
1916
+ if (!wasInterrupted) {
1917
+ try {
1918
+ const latestTask = await tasksService.get(latestTaskId, startupParams);
1919
+ wasInterrupted = !isTerminalTaskStatus(latestTask.status);
1920
+ } catch {
1921
+ }
1922
+ }
1923
+ if (!wasInterrupted) {
1924
+ continue;
1925
+ }
1926
+ stuckIdleSessions.push(session);
1927
+ await app.service("sessions").patch(session.session_id, { ready_for_prompt: true }, startupParams);
1928
+ startupDebug(
1929
+ ` \u2713 Unblocked stuck-idle session ${shortId6(session.session_id)} (ready_for_prompt was false, latest task interrupted)`
1930
+ );
1910
1931
  }
1911
1932
  const cleanupParts = [
1912
1933
  `${orphanedTasks.length} orphaned task(s) stopped`,
@@ -4,19 +4,33 @@ import { hasMinimumRole, ROLES } from "@agor/core/types";
4
4
 
5
5
  // src/auth/executor-runtime-scope.ts
6
6
  import { Forbidden } from "@agor/core/feathers";
7
+
8
+ // src/auth/executor-session-token.ts
9
+ var EXECUTOR_SESSION_TOKEN_TYPE = "executor-session";
10
+ var EXECUTOR_SESSION_TOKEN_PURPOSE = "executor-task";
11
+ function isExecutorSessionTokenPayload(payload) {
12
+ if (!payload || typeof payload !== "object" || Array.isArray(payload)) return false;
13
+ const record = payload;
14
+ return record.type === EXECUTOR_SESSION_TOKEN_TYPE && record.purpose === EXECUTOR_SESSION_TOKEN_PURPOSE;
15
+ }
16
+ function getExecutorSessionTokenSessionId(payload) {
17
+ return payload.session_id ?? payload.sessionId;
18
+ }
19
+
20
+ // src/auth/executor-runtime-scope.ts
7
21
  function scopedPayload(context) {
8
22
  const params = context.params;
9
23
  const payload = params.authentication?.payload;
10
- if (payload?.type === "executor-session") {
11
- if (payload.purpose !== "executor-task") {
24
+ if (payload?.type === EXECUTOR_SESSION_TOKEN_TYPE) {
25
+ if (!isExecutorSessionTokenPayload(payload)) {
12
26
  throw new Forbidden("Executor token is not valid for this request");
13
27
  }
14
28
  return payload;
15
29
  }
16
30
  if (params.authentication?.strategy === "jwt" && params.task_id) {
17
31
  return {
18
- type: "executor-session",
19
- purpose: "executor-task",
32
+ type: EXECUTOR_SESSION_TOKEN_TYPE,
33
+ purpose: EXECUTOR_SESSION_TOKEN_PURPOSE,
20
34
  task_id: params.task_id,
21
35
  session_id: params.session_id,
22
36
  sessionId: params.sessionId,
@@ -126,7 +140,7 @@ function executorRuntimeScopeGuard() {
126
140
  const payload = scopedPayload(context);
127
141
  if (!payload) return context;
128
142
  const scope = {
129
- sessionId: payload.session_id ?? payload.sessionId,
143
+ sessionId: getExecutorSessionTokenSessionId(payload),
130
144
  taskId: payload.task_id,
131
145
  branchId: payload.branch_id
132
146
  };
@@ -0,0 +1,56 @@
1
+ import type { Application } from '@agor/core/feathers';
2
+ import type { HookContext } from '@agor/core/types';
3
+ export type ManualServiceEvent = {
4
+ /**
5
+ * Service path the event belongs to (e.g. `'branches'`). Load-bearing: the
6
+ * realtime publish handler keys tenant + branch/session RBAC scoping off
7
+ * `context.path`.
8
+ */
9
+ path: string;
10
+ /**
11
+ * Service event name. Typically one of `created` | `updated` | `patched` |
12
+ * `removed` (the method is inferred from these), but any custom event string
13
+ * is supported — pass `method` to set the inferred CRUD method for those.
14
+ */
15
+ event: string;
16
+ /** Record to broadcast (becomes both the event payload and `hook.result`). */
17
+ data: unknown;
18
+ /**
19
+ * Request params carrying tenant/connection context. Load-bearing: without a
20
+ * resolvable tenant here (or an ambient tenant DB scope), multi-tenant
21
+ * publishing suppresses the event to service-only sockets.
22
+ */
23
+ params?: HookContext['params'];
24
+ /** Optional record id (publisher uses it as a branch-id fallback and for logging). */
25
+ id?: HookContext['id'];
26
+ /** Overrides the CRUD method inferred from `event`. */
27
+ method?: string;
28
+ };
29
+ /**
30
+ * Manually emit a Feathers service event with a correctly-shaped publish
31
+ * context.
32
+ *
33
+ * Some services persist through a raw adapter path (e.g. an overridden
34
+ * `patch()` that calls `super.patch()`), which bypasses Feathers' automatic
35
+ * event dispatch — so those call sites must emit the service event by hand.
36
+ *
37
+ * The shape of the emit matters. Feathers' transport-commons publish listener
38
+ * passes the THIRD `emit` argument through UNCHANGED as the publish `hook`, and
39
+ * only synthesizes a fake `{ path, service, app, result }` when that argument
40
+ * is absent (`@feathersjs/transport-commons` `channels/index.ts`). Automatic
41
+ * events, by contrast, emit the full HookContext (`@feathersjs/feathers`
42
+ * `events.ts`). So both malformed shapes lose something the global publish
43
+ * handler (`configureRealtimePublish`) needs:
44
+ * - passing NO third arg gets a synthesized `path`, but no `context.params`
45
+ * (no tenant/connection context), and
46
+ * - passing raw params as the third arg carries `context.params`-looking data
47
+ * at the wrong nesting AND loses `path` (Feathers won't synthesize it once a
48
+ * third arg is present).
49
+ * Either way the handler can't resolve the tenant channel (multi-tenancy)
50
+ * and/or the branch/session RBAC scope, so it degrades to global-scope
51
+ * broadcast or service-only suppression.
52
+ *
53
+ * Build the hook shape once, here, so call sites can't drift on it.
54
+ */
55
+ export declare function emitServiceEvent(app: Application, event: ManualServiceEvent): void;
56
+ //# sourceMappingURL=emit-service-event.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emit-service-event.d.ts","sourceRoot":"","sources":["../../src/utils/emit-service-event.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AASpD,MAAM,MAAM,kBAAkB,GAAG;IAC/B;;;;OAIG;IACH,IAAI,EAAE,MAAM,CAAC;IACb;;;;OAIG;IACH,KAAK,EAAE,MAAM,CAAC;IACd,8EAA8E;IAC9E,IAAI,EAAE,OAAO,CAAC;IACd;;;;OAIG;IACH,MAAM,CAAC,EAAE,WAAW,CAAC,QAAQ,CAAC,CAAC;IAC/B,sFAAsF;IACtF,EAAE,CAAC,EAAE,WAAW,CAAC,IAAI,CAAC,CAAC;IACvB,uDAAuD;IACvD,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,WAAW,EAAE,KAAK,EAAE,kBAAkB,GAAG,IAAI,CAclF"}
@@ -0,0 +1,23 @@
1
+ // src/utils/emit-service-event.ts
2
+ var DEFAULT_EVENT_METHOD = {
3
+ created: "create",
4
+ updated: "update",
5
+ patched: "patch",
6
+ removed: "remove"
7
+ };
8
+ function emitServiceEvent(app, event) {
9
+ const service = app.service(event.path);
10
+ service.emit?.(event.event, event.data, {
11
+ app,
12
+ service,
13
+ path: event.path,
14
+ method: event.method ?? DEFAULT_EVENT_METHOD[event.event] ?? "patch",
15
+ event: event.event,
16
+ id: event.id,
17
+ result: event.data,
18
+ params: event.params ?? {}
19
+ });
20
+ }
21
+ export {
22
+ emitServiceEvent
23
+ };
@@ -1,12 +1,10 @@
1
1
  import type { MCPServer, Params } from '@agor/core/types';
2
+ import { type ExecutorSessionTokenPayload } from '../auth/executor-session-token.js';
2
3
  export type MCPSecretParams = Params & {
3
4
  authentication?: {
4
5
  strategy?: string;
5
- payload?: {
6
- type?: string;
7
- session_id?: string;
8
- sessionId?: string;
9
- };
6
+ accessToken?: string;
7
+ payload?: ExecutorSessionTokenPayload;
10
8
  };
11
9
  user?: {
12
10
  role?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-header-secrets.d.ts","sourceRoot":"","sources":["../../src/utils/mcp-header-secrets.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE1D,MAAM,MAAM,eAAe,GAAG,MAAM,GAAG;IACrC,cAAc,CAAC,EAAE;QACf,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,OAAO,CAAC,EAAE;YACR,IAAI,CAAC,EAAE,MAAM,CAAC;YACd,UAAU,CAAC,EAAE,MAAM,CAAC;YACpB,SAAS,CAAC,EAAE,MAAM,CAAC;SACpB,CAAC;KACH,CAAC;IACF,IAAI,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,iBAAiB,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;IACtD,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,MAAM,WAAW,wBAAwB;IACvC;;;;OAIG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,2CAA2C,CACzD,MAAM,CAAC,EAAE,eAAe,EACxB,OAAO,GAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAO,GACnC,OAAO,CAST;AAED,wBAAgB,4BAA4B,CAC1C,MAAM,CAAC,EAAE,eAAe,EACxB,OAAO,GAAE,wBAA6B,GACrC,OAAO,CAaT;AAGD,eAAO,MAAM,4BAA4B,qCAA+B,CAAC;AAEzE,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,GAAG,SAAS,CAWnE;AAGD,eAAO,MAAM,4BAA4B,+BAAyB,CAAC"}
1
+ {"version":3,"file":"mcp-header-secrets.d.ts","sourceRoot":"","sources":["../../src/utils/mcp-header-secrets.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE1D,OAAO,EACL,KAAK,2BAA2B,EAGjC,MAAM,mCAAmC,CAAC;AAE3C,MAAM,MAAM,eAAe,GAAG,MAAM,GAAG;IACrC,cAAc,CAAC,EAAE;QACf,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,OAAO,CAAC,EAAE,2BAA2B,CAAC;KACvC,CAAC;IACF,IAAI,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,iBAAiB,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;IACtD,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,MAAM,WAAW,wBAAwB;IACvC;;;;OAIG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,2CAA2C,CACzD,MAAM,CAAC,EAAE,eAAe,EACxB,OAAO,GAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAO,GACnC,OAAO,CAST;AAuBD,wBAAgB,4BAA4B,CAC1C,MAAM,CAAC,EAAE,eAAe,EACxB,OAAO,GAAE,wBAA6B,GACrC,OAAO,CAaT;AAGD,eAAO,MAAM,4BAA4B,qCAA+B,CAAC;AAEzE,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,GAAG,SAAS,CAWnE;AAGD,eAAO,MAAM,4BAA4B,+BAAyB,CAAC"}
@@ -1,11 +1,40 @@
1
1
  // src/utils/mcp-header-secrets.ts
2
2
  import { redactMCPAuthSecrets } from "@agor/core/tools/mcp/auth-secrets";
3
3
  import { redactMCPCustomHeaders } from "@agor/core/tools/mcp/http-headers";
4
+ import jwt from "jsonwebtoken";
5
+
6
+ // src/auth/executor-session-token.ts
7
+ var EXECUTOR_SESSION_TOKEN_TYPE = "executor-session";
8
+ var EXECUTOR_SESSION_TOKEN_PURPOSE = "executor-task";
9
+ function isExecutorSessionTokenPayload(payload) {
10
+ if (!payload || typeof payload !== "object" || Array.isArray(payload)) return false;
11
+ const record = payload;
12
+ return record.type === EXECUTOR_SESSION_TOKEN_TYPE && record.purpose === EXECUTOR_SESSION_TOKEN_PURPOSE;
13
+ }
14
+ function getExecutorSessionTokenSessionId(payload) {
15
+ return payload.session_id ?? payload.sessionId;
16
+ }
17
+
18
+ // src/utils/mcp-header-secrets.ts
4
19
  function shouldExposeMCPServerSecretsForSessionToken(params, options = {}) {
5
- const payload = params?.authentication?.payload;
6
- const sessionId = params?.session_id ?? payload?.session_id ?? payload?.sessionId;
20
+ const payload = params?.authentication?.payload ?? decodeExecutorSessionPayload(params);
21
+ const sessionId = params?.session_id ?? getPayloadSessionId(payload);
7
22
  return !!params?.provider && (params.authentication?.strategy === "session-token" || payload?.type === "executor-session") && !!sessionId && (!options.sessionId || sessionId === options.sessionId);
8
23
  }
24
+ function decodeExecutorSessionPayload(params) {
25
+ if (params?.authentication?.strategy !== "jwt" || !params.authentication.accessToken) {
26
+ return void 0;
27
+ }
28
+ const decoded = jwt.decode(params.authentication.accessToken);
29
+ if (!decoded || typeof decoded !== "object" || Array.isArray(decoded)) {
30
+ return void 0;
31
+ }
32
+ if (!isExecutorSessionTokenPayload(decoded)) return void 0;
33
+ return decoded;
34
+ }
35
+ function getPayloadSessionId(payload) {
36
+ return payload ? getExecutorSessionTokenSessionId(payload) : void 0;
37
+ }
9
38
  function shouldExposeMCPServerSecrets(params, options = {}) {
10
39
  if (!params?.provider) return true;
11
40
  if (params.user?._isServiceAccount || params.user?.role === "service") return true;
@@ -11,6 +11,7 @@ export type RealtimeAccessBranchRepository = {
11
11
  };
12
12
  export type RealtimeAccessSessionRepository = {
13
13
  findBranchIdBySessionId(sessionId: string): Promise<BranchID | null>;
14
+ findCreatedByBySessionId(sessionId: string): Promise<UUID | null>;
14
15
  };
15
16
  export interface RealtimeAccessCacheOptions {
16
17
  branchRepository: RealtimeAccessBranchRepository;
@@ -29,11 +30,19 @@ export declare class RealtimeAccessCache {
29
30
  private readonly options;
30
31
  private readonly branchVisibility;
31
32
  private readonly sessionBranches;
33
+ private readonly sessionOwners;
32
34
  private readonly branchVisibilityTtlMs;
33
35
  private readonly sessionBranchTtlMs;
34
36
  private readonly now;
35
37
  constructor(options: RealtimeAccessCacheOptions);
36
38
  getBranchIdForSession(sessionId: string): Promise<BranchID | null>;
39
+ /**
40
+ * Owning user id for a session, cached on the same cadence as the
41
+ * session→branch map. Used only to offer streaming events to the session
42
+ * creator's own connections as a fallback when they haven't subscribed to
43
+ * the per-session stream channel yet.
44
+ */
45
+ getSessionOwnerId(sessionId: string): Promise<UserID | null>;
37
46
  getBranchVisibility(branchId: BranchID): Promise<BranchRealtimeVisibility | null>;
38
47
  invalidateBranch(branchId: string): void;
39
48
  invalidateSession(sessionId: string): void;
@@ -1 +1 @@
1
- {"version":3,"file":"realtime-access-cache.d.ts","sourceRoot":"","sources":["../../src/utils/realtime-access-cache.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAGvE,MAAM,MAAM,wBAAwB,GAChC;IAAE,IAAI,EAAE,kBAAkB,CAAA;CAAE,GAC5B;IAAE,IAAI,EAAE,eAAe,CAAC;IAAC,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;CAAE,CAAC;AAEpD,MAAM,MAAM,8BAA8B,GAAG;IAC3C,4BAA4B,CAC1B,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,WAAW,GAAG,YAAY,CAAC,GAAG,IAAI,CAAC,CAAC;IAC5D,uBAAuB,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;CAC9D,CAAC;AAEF,MAAM,MAAM,+BAA+B,GAAG;IAC5C,uBAAuB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC;CACtE,CAAC;AAWF,MAAM,WAAW,0BAA0B;IACzC,gBAAgB,EAAE,8BAA8B,CAAC;IACjD,kBAAkB,EAAE,+BAA+B,CAAC;IACpD,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACpB;AAUD;;;;GAIG;AACH,qBAAa,mBAAmB;IAOlB,OAAO,CAAC,QAAQ,CAAC,OAAO;IANpC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAmD;IACpF,OAAO,CAAC,QAAQ,CAAC,eAAe,CAA8C;IAC9E,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAS;IAC/C,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAS;IAC5C,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAe;gBAEN,OAAO,EAAE,0BAA0B;IAQ1D,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;IAelE,mBAAmB,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,wBAAwB,GAAG,IAAI,CAAC;IA+BvF,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IASxC,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAI1C,eAAe,IAAI,IAAI;IAIvB,QAAQ,IAAI,IAAI;IAKhB,OAAO,CAAC,mBAAmB;CAK5B"}
1
+ {"version":3,"file":"realtime-access-cache.d.ts","sourceRoot":"","sources":["../../src/utils/realtime-access-cache.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAGvE,MAAM,MAAM,wBAAwB,GAChC;IAAE,IAAI,EAAE,kBAAkB,CAAA;CAAE,GAC5B;IAAE,IAAI,EAAE,eAAe,CAAC;IAAC,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;CAAE,CAAC;AAEpD,MAAM,MAAM,8BAA8B,GAAG;IAC3C,4BAA4B,CAC1B,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,WAAW,GAAG,YAAY,CAAC,GAAG,IAAI,CAAC,CAAC;IAC5D,uBAAuB,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;CAC9D,CAAC;AAEF,MAAM,MAAM,+BAA+B,GAAG;IAC5C,uBAAuB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC;IACrE,wBAAwB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;CACnE,CAAC;AAgBF,MAAM,WAAW,0BAA0B;IACzC,gBAAgB,EAAE,8BAA8B,CAAC;IACjD,kBAAkB,EAAE,+BAA+B,CAAC;IACpD,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACpB;AAUD;;;;GAIG;AACH,qBAAa,mBAAmB;IAQlB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAPpC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAmD;IACpF,OAAO,CAAC,QAAQ,CAAC,eAAe,CAA8C;IAC9E,OAAO,CAAC,QAAQ,CAAC,aAAa,CAA6C;IAC3E,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAS;IAC/C,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAS;IAC5C,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAe;gBAEN,OAAO,EAAE,0BAA0B;IAQ1D,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;IAexE;;;;;OAKG;IACG,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAkB5D,mBAAmB,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,wBAAwB,GAAG,IAAI,CAAC;IA+BvF,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IASxC,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAK1C,eAAe,IAAI,IAAI;IAIvB,QAAQ,IAAI,IAAI;IAMhB,OAAO,CAAC,mBAAmB;CAK5B"}
@@ -22,6 +22,7 @@ var RealtimeAccessCache = class {
22
22
  }
23
23
  branchVisibility = /* @__PURE__ */ new Map();
24
24
  sessionBranches = /* @__PURE__ */ new Map();
25
+ sessionOwners = /* @__PURE__ */ new Map();
25
26
  branchVisibilityTtlMs;
26
27
  sessionBranchTtlMs;
27
28
  now;
@@ -38,6 +39,27 @@ var RealtimeAccessCache = class {
38
39
  });
39
40
  return branchId;
40
41
  }
42
+ /**
43
+ * Owning user id for a session, cached on the same cadence as the
44
+ * session→branch map. Used only to offer streaming events to the session
45
+ * creator's own connections as a fallback when they haven't subscribed to
46
+ * the per-session stream channel yet.
47
+ */
48
+ async getSessionOwnerId(sessionId) {
49
+ const cached = this.sessionOwners.get(sessionId);
50
+ const now = this.now();
51
+ if (cached && cached.expiresAt > now) {
52
+ return cached.ownerId;
53
+ }
54
+ const ownerId = await this.options.sessionsRepository.findCreatedByBySessionId(
55
+ sessionId
56
+ ) ?? null;
57
+ this.sessionOwners.set(sessionId, {
58
+ ownerId,
59
+ expiresAt: now + this.sessionBranchTtlMs
60
+ });
61
+ return ownerId;
62
+ }
41
63
  async getBranchVisibility(branchId) {
42
64
  const cached = this.branchVisibility.get(branchId);
43
65
  const now = this.now();
@@ -73,6 +95,7 @@ var RealtimeAccessCache = class {
73
95
  }
74
96
  invalidateSession(sessionId) {
75
97
  this.sessionBranches.delete(sessionId);
98
+ this.sessionOwners.delete(sessionId);
76
99
  }
77
100
  clearVisibility() {
78
101
  this.branchVisibility.clear();
@@ -80,6 +103,7 @@ var RealtimeAccessCache = class {
80
103
  clearAll() {
81
104
  this.branchVisibility.clear();
82
105
  this.sessionBranches.clear();
106
+ this.sessionOwners.clear();
83
107
  }
84
108
  visibilityFromEntry(entry) {
85
109
  return entry.mode === "allAuthenticated" ? { mode: "allAuthenticated" } : { mode: "explicitUsers", userIds: entry.userIds };
@@ -2,6 +2,30 @@ import { type ResolvedMultiTenancyConfig } from '@agor/core/config';
2
2
  import type { BranchRepository, SessionRepository } from '@agor/core/db';
3
3
  import type { Application } from '@agor/core/feathers';
4
4
  import { RealtimeAccessCache } from './realtime-access-cache.js';
5
+ export declare function sessionStreamChannelName(sessionId: string): string;
6
+ /**
7
+ * Remove a connection from every session-stream room it has joined. Called on
8
+ * logout so a still-connected-but-deauthenticated socket stops receiving live
9
+ * session text — Feathers only auto-drops channel membership on socket
10
+ * disconnect, and streaming delivery would otherwise keep reaching a logged-out
11
+ * connection (which is no longer in the authenticated/tenant channels but may
12
+ * still sit in a session-stream room).
13
+ */
14
+ export declare function leaveAllSessionStreamChannels(app: Application, connection: unknown): void;
15
+ /**
16
+ * Join a connection to a session's streaming room. Centralized here (the
17
+ * tenant-aware realtime facade) so subscribe/publish share one channel name
18
+ * and the raw `app.channel` surface stays in a single audited file.
19
+ */
20
+ export declare function joinSessionStreamChannel(app: Application, sessionId: string, connection: unknown): void;
21
+ /**
22
+ * Remove a connection from a session's streaming room, but only if the room
23
+ * already exists. A `remove` for a never-joined room (any authenticated caller
24
+ * can send one) or a dispose after logout/disconnect already pruned the room
25
+ * would otherwise re-materialize an empty, never-cleaned channel — the same
26
+ * leak class as the publish path. `.leave` on an absent room is a no-op anyway.
27
+ */
28
+ export declare function leaveSessionStreamChannel(app: Application, sessionId: string, connection: unknown): void;
5
29
  type RealtimePublishOptions = {
6
30
  app: Application;
7
31
  branchRbacEnabled: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"realtime-publish.d.ts","sourceRoot":"","sources":["../../src/utils/realtime-publish.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,0BAA0B,EAGhC,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAEzE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAIvD,OAAO,EAEL,mBAAmB,EAEpB,MAAM,4BAA4B,CAAC;AAuBpC,KAAK,sBAAsB,GAAG;IAC5B,GAAG,EAAE,WAAW,CAAC;IACjB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,kBAAkB,EAAE,iBAAiB,CAAC;IACtC,WAAW,CAAC,EAAE,mBAAmB,CAAC;IAClC,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,YAAY,CAAC,EAAE,0BAA0B,CAAC;CAC3C,CAAC;AAkSF;;;;;;;;GAQG;AACH,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,sBAAsB,GAAG,IAAI,CA6E9E"}
1
+ {"version":3,"file":"realtime-publish.d.ts","sourceRoot":"","sources":["../../src/utils/realtime-publish.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,0BAA0B,EAGhC,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAEzE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAIvD,OAAO,EAEL,mBAAmB,EAEpB,MAAM,4BAA4B,CAAC;AAkBpC,wBAAgB,wBAAwB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAElE;AAED;;;;;;;GAOG;AACH,wBAAgB,6BAA6B,CAAC,GAAG,EAAE,WAAW,EAAE,UAAU,EAAE,OAAO,GAAG,IAAI,CAMzF;AAcD;;;;GAIG;AACH,wBAAgB,wBAAwB,CACtC,GAAG,EAAE,WAAW,EAChB,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,OAAO,GAClB,IAAI,CAEN;AAED;;;;;;GAMG;AACH,wBAAgB,yBAAyB,CACvC,GAAG,EAAE,WAAW,EAChB,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,OAAO,GAClB,IAAI,CAEN;AAmBD,KAAK,sBAAsB,GAAG;IAC5B,GAAG,EAAE,WAAW,CAAC;IACjB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,kBAAkB,EAAE,iBAAiB,CAAC;IACtC,WAAW,CAAC,EAAE,mBAAmB,CAAC;IAClC,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,YAAY,CAAC,EAAE,0BAA0B,CAAC;CAC3C,CAAC;AAyZF;;;;;;;;GAQG;AACH,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,sBAAsB,GAAG,IAAI,CA2F9E"}