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
@@ -0,0 +1,14 @@
1
+ // src/oauth-auth-helpers.ts
2
+ import { runWithTenantDatabaseScope } from "@agor/core/db";
3
+ async function runInOAuthTenantScope(db, tenantId, work) {
4
+ if (!tenantId) return work();
5
+ return runWithTenantDatabaseScope(db, tenantId, work);
6
+ }
7
+ function resolveForUserIdWithGate(opts) {
8
+ const canUseExplicitUser = opts.isServiceAccount === true || opts.authPayloadType === "executor-session" && opts.queryForUserId === opts.callerUserId;
9
+ return opts.queryForUserId && canUseExplicitUser ? opts.queryForUserId : opts.callerUserId;
10
+ }
11
+ export {
12
+ resolveForUserIdWithGate,
13
+ runInOAuthTenantScope
14
+ };
@@ -44,6 +44,7 @@ export declare const PROMPT_FLOW_PATCH_FIELDS: readonly string[];
44
44
  export declare function isPromptFlowPatchOnly(data: unknown): boolean;
45
45
  export declare function shouldRunSessionPostTurnHooks(session: Pick<Session, 'status' | 'ready_for_prompt'>): boolean;
46
46
  export declare function shouldDrainQueueAfterSessionPostTurnPatch(session: Pick<Session, 'status' | 'ready_for_prompt'>, params?: Params): boolean;
47
+ export declare function getTrustedSessionTenantId(session: unknown): string | undefined;
47
48
  export declare function enrichSessionFindResultWithRemoteRelationships(result: Paginated<Session> | Session[], sessionsService: Pick<SessionsServiceImpl, 'enrichRemoteRelationships'>): Promise<Paginated<Session> | Session[]>;
48
49
  /**
49
50
  * Interface for dependencies needed by hook registration.
@@ -1 +1 @@
1
- {"version":3,"file":"register-hooks.d.ts","sourceRoot":"","sources":["../src/register-hooks.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EACL,KAAK,UAAU,EAWhB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAGL,KAAK,gBAAgB,EAErB,KAAK,iBAAiB,EAEtB,KAAK,wBAAwB,EAE7B,KAAK,eAAe,EACrB,MAAM,eAAe,CAAC;AAOvB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAcvD,OAAO,KAAK,EAMV,WAAW,EAEX,SAAS,EACT,MAAM,EACN,OAAO,EAGR,MAAM,kBAAkB,CAAC;AAQ1B,OAAO,KAAK,EACV,iBAAiB,EACjB,mBAAmB,EACnB,mBAAmB,EACpB,MAAM,mBAAmB,CAAC;AAkG3B,wBAAgB,oCAAoC,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAE5E;AAwFD;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,eAAO,MAAM,wBAAwB,EAAE,SAAS,MAAM,EAQrD,CAAC;AAEF,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAK5D;AAED,wBAAgB,6BAA6B,CAC3C,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,QAAQ,GAAG,kBAAkB,CAAC,GACpD,OAAO,CAET;AAED,wBAAgB,yCAAyC,CACvD,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,QAAQ,GAAG,kBAAkB,CAAC,EACrD,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAMT;AAED,wBAAsB,8CAA8C,CAClE,MAAM,EAAE,SAAS,CAAC,OAAO,CAAC,GAAG,OAAO,EAAE,EACtC,eAAe,EAAE,IAAI,CAAC,mBAAmB,EAAE,2BAA2B,CAAC,GACtE,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,OAAO,EAAE,CAAC,CAazC;AAeD;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,EAAE,EAAE,wBAAwB,CAAC;IAC7B,GAAG,EAAE,WAAW,GAAG;QAAE,EAAE,CAAC,EAAE,OAAO,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;IACvD,MAAM,EAAE,UAAU,CAAC;IACnB,UAAU,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC;IACvC,SAAS,EAAE,MAAM,CAAC;IAClB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,WAAW,EAAE,CAAC,OAAO,EAAE,WAAW,KAAK,OAAO,CAAC,WAAW,CAAC,CAAC;IAC5D,cAAc,EAAE;QAAE,eAAe,EAAE,OAAO,CAAA;KAAE,CAAC;IAG7C,eAAe,EAAE,mBAAmB,CAAC;IACrC,eAAe,EAAE,mBAAmB,CAAC;IACrC,aAAa,EAAE,iBAAiB,GAAG,SAAS,CAAC;IAC7C,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,eAAe,EAAE,eAAe,CAAC;IACjC,kBAAkB,EAAE,iBAAiB,CAAC;CACvC;AAED;;GAEG;AACH,eAAO,MAAM,0BAA0B,UAwCtC,CAAC;AAEF,wBAAgB,aAAa,CAAC,GAAG,EAAE,oBAAoB,GAAG,IAAI,CAmuF7D"}
1
+ {"version":3,"file":"register-hooks.d.ts","sourceRoot":"","sources":["../src/register-hooks.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EACL,KAAK,UAAU,EAWhB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAGL,KAAK,gBAAgB,EAErB,KAAK,iBAAiB,EAEtB,KAAK,wBAAwB,EAE7B,KAAK,eAAe,EACrB,MAAM,eAAe,CAAC;AAOvB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAcvD,OAAO,KAAK,EAOV,WAAW,EAEX,SAAS,EACT,MAAM,EACN,OAAO,EAGR,MAAM,kBAAkB,CAAC;AAQ1B,OAAO,KAAK,EACV,iBAAiB,EACjB,mBAAmB,EACnB,mBAAmB,EACpB,MAAM,mBAAmB,CAAC;AAoG3B,wBAAgB,oCAAoC,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAE5E;AAwFD;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,eAAO,MAAM,wBAAwB,EAAE,SAAS,MAAM,EAQrD,CAAC;AAEF,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAK5D;AAED,wBAAgB,6BAA6B,CAC3C,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,QAAQ,GAAG,kBAAkB,CAAC,GACpD,OAAO,CAET;AAED,wBAAgB,yCAAyC,CACvD,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,QAAQ,GAAG,kBAAkB,CAAC,EACrD,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAMT;AAED,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAG9E;AAED,wBAAsB,8CAA8C,CAClE,MAAM,EAAE,SAAS,CAAC,OAAO,CAAC,GAAG,OAAO,EAAE,EACtC,eAAe,EAAE,IAAI,CAAC,mBAAmB,EAAE,2BAA2B,CAAC,GACtE,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,OAAO,EAAE,CAAC,CAazC;AAeD;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,EAAE,EAAE,wBAAwB,CAAC;IAC7B,GAAG,EAAE,WAAW,GAAG;QAAE,EAAE,CAAC,EAAE,OAAO,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;IACvD,MAAM,EAAE,UAAU,CAAC;IACnB,UAAU,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC;IACvC,SAAS,EAAE,MAAM,CAAC;IAClB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,WAAW,EAAE,CAAC,OAAO,EAAE,WAAW,KAAK,OAAO,CAAC,WAAW,CAAC,CAAC;IAC5D,cAAc,EAAE;QAAE,eAAe,EAAE,OAAO,CAAA;KAAE,CAAC;IAG7C,eAAe,EAAE,mBAAmB,CAAC;IACrC,eAAe,EAAE,mBAAmB,CAAC;IACrC,aAAa,EAAE,iBAAiB,GAAG,SAAS,CAAC;IAC7C,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,eAAe,EAAE,eAAe,CAAC;IACjC,kBAAkB,EAAE,iBAAiB,CAAC;CACvC;AAED;;GAEG;AACH,eAAO,MAAM,0BAA0B,UAiDtC,CAAC;AAEF,wBAAgB,aAAa,CAAC,GAAG,EAAE,oBAAoB,GAAG,IAAI,CA6xF7D"}
@@ -672,7 +672,7 @@ import {
672
672
  MCP_TOKEN_AUDIENCE,
673
673
  MCP_TOKEN_ISSUER
674
674
  } from "@agor/core/types";
675
- import jwt3 from "jsonwebtoken";
675
+ import jwt4 from "jsonwebtoken";
676
676
  import { MCP_TOKEN_AUDIENCE as MCP_TOKEN_AUDIENCE2, MCP_TOKEN_ISSUER as MCP_TOKEN_ISSUER2 } from "@agor/core/types";
677
677
  function mcpTokenDebug(...args) {
678
678
  if (DEBUG_MCP_TOKENS) {
@@ -744,7 +744,7 @@ async function generateSessionToken2(app, sessionId, userId) {
744
744
  exp: expSec,
745
745
  jti
746
746
  };
747
- const token = jwt3.sign(payload, jwtSecret, { algorithm: "HS256" });
747
+ const token = jwt4.sign(payload, jwtSecret, { algorithm: "HS256" });
748
748
  s.tokenCache.set(cacheKey, { token, expiresAtMs });
749
749
  mcpTokenDebug(
750
750
  `\u{1F3AB} MCP token issued: session=${shortId3(sessionId)} jti=${jti.substring(0, 8)} exp=+${Math.floor(s.expirationMs / 1e3)}s`
@@ -760,15 +760,15 @@ async function validateSessionToken(app, token) {
760
760
  }
761
761
  let payload;
762
762
  try {
763
- payload = jwt3.verify(token, jwtSecret, {
763
+ payload = jwt4.verify(token, jwtSecret, {
764
764
  audience: MCP_TOKEN_AUDIENCE,
765
765
  issuer: MCP_TOKEN_ISSUER,
766
766
  algorithms: ["HS256"]
767
767
  });
768
768
  } catch (err) {
769
- if (err instanceof jwt3.TokenExpiredError) {
769
+ if (err instanceof jwt4.TokenExpiredError) {
770
770
  console.warn("[mcp-tokens] token rejected: expired");
771
- } else if (err instanceof jwt3.JsonWebTokenError) {
771
+ } else if (err instanceof jwt4.JsonWebTokenError) {
772
772
  console.warn(`[mcp-tokens] token rejected: ${err.message}`);
773
773
  } else {
774
774
  console.error("[mcp-tokens] token verify error:", err);
@@ -1237,12 +1237,12 @@ import {
1237
1237
  permissionModeForCli,
1238
1238
  slugForCwd
1239
1239
  } from "@agor/core/claude-cli";
1240
- import { resolveMultiTenancyConfig as resolveMultiTenancyConfig2 } from "@agor/core/config";
1240
+ import { resolveMultiTenancyConfig as resolveMultiTenancyConfig3 } from "@agor/core/config";
1241
1241
  import {
1242
1242
  generateId as generateId4,
1243
1243
  getCurrentTenantId as getCurrentTenantId3,
1244
1244
  runWithoutTenantDatabaseScope as runWithoutTenantDatabaseScope2,
1245
- runWithTenantDatabaseScope as runWithTenantDatabaseScope2,
1245
+ runWithTenantDatabaseScope as runWithTenantDatabaseScope4,
1246
1246
  SessionRepository as SessionRepository3,
1247
1247
  shortId as shortId4,
1248
1248
  TaskRepository
@@ -1262,7 +1262,7 @@ function getDb(app) {
1262
1262
  }
1263
1263
  function getCliFallbackTenantId(app) {
1264
1264
  const config = app.get("config");
1265
- return resolveMultiTenancyConfig2(config ?? {}).static_tenant_id;
1265
+ return resolveMultiTenancyConfig3(config ?? {}).static_tenant_id;
1266
1266
  }
1267
1267
  function captureCliWatcherTenantId(app) {
1268
1268
  return getCurrentTenantId3() ?? getCliFallbackTenantId(app);
@@ -1274,7 +1274,7 @@ async function runCliCallbackDatabaseScope(app, sessionId, work) {
1274
1274
  const db = getDb(app);
1275
1275
  if (!db) return work();
1276
1276
  const tenantId = cliWatcherTenantBySession.get(sessionId) ?? captureCliWatcherTenantId(app);
1277
- return runWithTenantDatabaseScope2(db, tenantId, work);
1277
+ return runWithTenantDatabaseScope4(db, tenantId, work);
1278
1278
  }
1279
1279
  async function persistActiveTurnSnapshot(app, sessionId, turn) {
1280
1280
  const db = getDb(app);
@@ -2120,7 +2120,7 @@ import {
2120
2120
  isUnixImpersonationEnabled,
2121
2121
  loadConfig,
2122
2122
  resolveExecutionSecurityMode,
2123
- resolveMultiTenancyConfig as resolveMultiTenancyConfig3,
2123
+ resolveMultiTenancyConfig as resolveMultiTenancyConfig4,
2124
2124
  resolveMultiTenancyDatabaseDialect,
2125
2125
  resolveTenantContext as resolveTenantContext3,
2126
2126
  TenantResolutionError as TenantResolutionError3,
@@ -2162,19 +2162,33 @@ import {
2162
2162
 
2163
2163
  // src/auth/executor-runtime-scope.ts
2164
2164
  import { Forbidden } from "@agor/core/feathers";
2165
+
2166
+ // src/auth/executor-session-token.ts
2167
+ var EXECUTOR_SESSION_TOKEN_TYPE = "executor-session";
2168
+ var EXECUTOR_SESSION_TOKEN_PURPOSE = "executor-task";
2169
+ function isExecutorSessionTokenPayload(payload) {
2170
+ if (!payload || typeof payload !== "object" || Array.isArray(payload)) return false;
2171
+ const record = payload;
2172
+ return record.type === EXECUTOR_SESSION_TOKEN_TYPE && record.purpose === EXECUTOR_SESSION_TOKEN_PURPOSE;
2173
+ }
2174
+ function getExecutorSessionTokenSessionId(payload) {
2175
+ return payload.session_id ?? payload.sessionId;
2176
+ }
2177
+
2178
+ // src/auth/executor-runtime-scope.ts
2165
2179
  function scopedPayload(context) {
2166
2180
  const params = context.params;
2167
2181
  const payload = params.authentication?.payload;
2168
- if (payload?.type === "executor-session") {
2169
- if (payload.purpose !== "executor-task") {
2182
+ if (payload?.type === EXECUTOR_SESSION_TOKEN_TYPE) {
2183
+ if (!isExecutorSessionTokenPayload(payload)) {
2170
2184
  throw new Forbidden("Executor token is not valid for this request");
2171
2185
  }
2172
2186
  return payload;
2173
2187
  }
2174
2188
  if (params.authentication?.strategy === "jwt" && params.task_id) {
2175
2189
  return {
2176
- type: "executor-session",
2177
- purpose: "executor-task",
2190
+ type: EXECUTOR_SESSION_TOKEN_TYPE,
2191
+ purpose: EXECUTOR_SESSION_TOKEN_PURPOSE,
2178
2192
  task_id: params.task_id,
2179
2193
  session_id: params.session_id,
2180
2194
  sessionId: params.sessionId,
@@ -2284,7 +2298,7 @@ function executorRuntimeScopeGuard() {
2284
2298
  const payload = scopedPayload(context);
2285
2299
  if (!payload) return context;
2286
2300
  const scope = {
2287
- sessionId: payload.session_id ?? payload.sessionId,
2301
+ sessionId: getExecutorSessionTokenSessionId(payload),
2288
2302
  taskId: payload.task_id,
2289
2303
  branchId: payload.branch_id
2290
2304
  };
@@ -2534,6 +2548,13 @@ var gatewayRouteHook = async (context) => {
2534
2548
  return context;
2535
2549
  };
2536
2550
 
2551
+ // src/oauth-auth-helpers.ts
2552
+ import { runWithTenantDatabaseScope } from "@agor/core/db";
2553
+ function resolveForUserIdWithGate(opts) {
2554
+ const canUseExplicitUser = opts.isServiceAccount === true || opts.authPayloadType === "executor-session" && opts.queryForUserId === opts.callerUserId;
2555
+ return opts.queryForUserId && canUseExplicitUser ? opts.queryForUserId : opts.callerUserId;
2556
+ }
2557
+
2537
2558
  // src/services/groups.ts
2538
2559
  import { BoardRepository, GroupRepository } from "@agor/core/db";
2539
2560
  import { BadRequest, Forbidden as Forbidden3, NotAuthenticated as NotAuthenticated2 } from "@agor/core/feathers";
@@ -3528,11 +3549,26 @@ function injectCreatedBy() {
3528
3549
  // src/utils/mcp-header-secrets.ts
3529
3550
  import { redactMCPAuthSecrets } from "@agor/core/tools/mcp/auth-secrets";
3530
3551
  import { redactMCPCustomHeaders } from "@agor/core/tools/mcp/http-headers";
3552
+ import jwt2 from "jsonwebtoken";
3531
3553
  function shouldExposeMCPServerSecretsForSessionToken(params, options = {}) {
3532
- const payload = params?.authentication?.payload;
3533
- const sessionId = params?.session_id ?? payload?.session_id ?? payload?.sessionId;
3554
+ const payload = params?.authentication?.payload ?? decodeExecutorSessionPayload(params);
3555
+ const sessionId = params?.session_id ?? getPayloadSessionId(payload);
3534
3556
  return !!params?.provider && (params.authentication?.strategy === "session-token" || payload?.type === "executor-session") && !!sessionId && (!options.sessionId || sessionId === options.sessionId);
3535
3557
  }
3558
+ function decodeExecutorSessionPayload(params) {
3559
+ if (params?.authentication?.strategy !== "jwt" || !params.authentication.accessToken) {
3560
+ return void 0;
3561
+ }
3562
+ const decoded = jwt2.decode(params.authentication.accessToken);
3563
+ if (!decoded || typeof decoded !== "object" || Array.isArray(decoded)) {
3564
+ return void 0;
3565
+ }
3566
+ if (!isExecutorSessionTokenPayload(decoded)) return void 0;
3567
+ return decoded;
3568
+ }
3569
+ function getPayloadSessionId(payload) {
3570
+ return payload ? getExecutorSessionTokenSessionId(payload) : void 0;
3571
+ }
3536
3572
  function shouldExposeMCPServerSecrets(params, options = {}) {
3537
3573
  if (!params?.provider) return true;
3538
3574
  if (params.user?._isServiceAccount || params.user?.role === "service") return true;
@@ -3618,6 +3654,7 @@ var RealtimeAccessCache = class {
3618
3654
  }
3619
3655
  branchVisibility = /* @__PURE__ */ new Map();
3620
3656
  sessionBranches = /* @__PURE__ */ new Map();
3657
+ sessionOwners = /* @__PURE__ */ new Map();
3621
3658
  branchVisibilityTtlMs;
3622
3659
  sessionBranchTtlMs;
3623
3660
  now;
@@ -3634,6 +3671,27 @@ var RealtimeAccessCache = class {
3634
3671
  });
3635
3672
  return branchId;
3636
3673
  }
3674
+ /**
3675
+ * Owning user id for a session, cached on the same cadence as the
3676
+ * session→branch map. Used only to offer streaming events to the session
3677
+ * creator's own connections as a fallback when they haven't subscribed to
3678
+ * the per-session stream channel yet.
3679
+ */
3680
+ async getSessionOwnerId(sessionId) {
3681
+ const cached = this.sessionOwners.get(sessionId);
3682
+ const now = this.now();
3683
+ if (cached && cached.expiresAt > now) {
3684
+ return cached.ownerId;
3685
+ }
3686
+ const ownerId = await this.options.sessionsRepository.findCreatedByBySessionId(
3687
+ sessionId
3688
+ ) ?? null;
3689
+ this.sessionOwners.set(sessionId, {
3690
+ ownerId,
3691
+ expiresAt: now + this.sessionBranchTtlMs
3692
+ });
3693
+ return ownerId;
3694
+ }
3637
3695
  async getBranchVisibility(branchId) {
3638
3696
  const cached = this.branchVisibility.get(branchId);
3639
3697
  const now = this.now();
@@ -3669,6 +3727,7 @@ var RealtimeAccessCache = class {
3669
3727
  }
3670
3728
  invalidateSession(sessionId) {
3671
3729
  this.sessionBranches.delete(sessionId);
3730
+ this.sessionOwners.delete(sessionId);
3672
3731
  }
3673
3732
  clearVisibility() {
3674
3733
  this.branchVisibility.clear();
@@ -3676,6 +3735,7 @@ var RealtimeAccessCache = class {
3676
3735
  clearAll() {
3677
3736
  this.branchVisibility.clear();
3678
3737
  this.sessionBranches.clear();
3738
+ this.sessionOwners.clear();
3679
3739
  }
3680
3740
  visibilityFromEntry(entry) {
3681
3741
  return entry.mode === "allAuthenticated" ? { mode: "allAuthenticated" } : { mode: "explicitUsers", userIds: entry.userIds };
@@ -3692,6 +3752,13 @@ import { hasMinimumRole as hasMinimumRole7, ROLES as ROLES8 } from "@agor/core/t
3692
3752
  function tenantChannelName(tenantId) {
3693
3753
  return `tenant:${tenantId}`;
3694
3754
  }
3755
+ var SESSION_STREAM_CHANNEL_PREFIX = "session-stream:";
3756
+ function sessionStreamChannelName(sessionId) {
3757
+ return `${SESSION_STREAM_CHANNEL_PREFIX}${sessionId}`;
3758
+ }
3759
+ function existingChannel(app, name) {
3760
+ return (app.channels ?? []).includes(name) ? app.channel(name) : null;
3761
+ }
3695
3762
  var DEBUG_REALTIME_PUBLISH = process.env.AGOR_DEBUG_REALTIME_PUBLISH === "1" || process.env.DEBUG?.includes("realtime-publish");
3696
3763
  function realtimePublishDebug(...args) {
3697
3764
  if (DEBUG_REALTIME_PUBLISH) {
@@ -3707,8 +3774,27 @@ var SESSION_ID_SCOPED_PATHS = /* @__PURE__ */ new Set([
3707
3774
  "session-env-selections"
3708
3775
  ]);
3709
3776
  var OPTIONAL_BRANCH_OR_SESSION_SCOPED_PATHS = /* @__PURE__ */ new Set(["board-objects", "board-comments"]);
3777
+ var MESSAGE_STREAMING_EVENTS = /* @__PURE__ */ new Set([
3778
+ "streaming:start",
3779
+ "streaming:chunk",
3780
+ "streaming:end",
3781
+ "streaming:error",
3782
+ "thinking:start",
3783
+ "thinking:chunk",
3784
+ "thinking:end"
3785
+ ]);
3786
+ var TASK_STREAMING_EVENTS = /* @__PURE__ */ new Set(["thinking:chunk", "tool:start", "tool:complete"]);
3710
3787
  function isStreamingEvent(context) {
3711
- return context.path === "messages/streaming" || context.path === "messages" && context.event?.startsWith("streaming:") === true;
3788
+ if (context.path === "messages/streaming") return true;
3789
+ const event = context.event;
3790
+ if (!event) return false;
3791
+ if (context.path === "messages") {
3792
+ return event.startsWith("streaming:") || MESSAGE_STREAMING_EVENTS.has(event);
3793
+ }
3794
+ if (context.path === "tasks") {
3795
+ return TASK_STREAMING_EVENTS.has(event);
3796
+ }
3797
+ return false;
3712
3798
  }
3713
3799
  function asRecord2(value) {
3714
3800
  return value && typeof value === "object" && !Array.isArray(value) ? value : null;
@@ -3844,6 +3930,47 @@ async function resolvePublishScope(data, context, accessCache) {
3844
3930
  function filterToServiceConnections(authenticated) {
3845
3931
  return authenticated.filter((connection) => isServiceConnection(connection));
3846
3932
  }
3933
+ async function resolveStreamingDelivery(app, data, tenantScoped, accessCache, branchRbacEnabled, allowSuperadmin) {
3934
+ const serviceConnections = filterToServiceConnections(tenantScoped);
3935
+ const sessionId = extractSessionId(data);
3936
+ if (!sessionId) return serviceConnections;
3937
+ const tenantConnections = new Set(
3938
+ tenantScoped.connections
3939
+ );
3940
+ const existingRoom = existingChannel(app, sessionStreamChannelName(sessionId));
3941
+ const room = existingRoom ? existingRoom.filter((connection) => tenantConnections.has(connection)) : null;
3942
+ let ownerId = null;
3943
+ try {
3944
+ ownerId = await accessCache.getSessionOwnerId(sessionId);
3945
+ } catch {
3946
+ }
3947
+ const ownerChannel = () => tenantScoped.filter(
3948
+ (connection) => userFromConnection(connection)?.user_id === ownerId
3949
+ );
3950
+ if (!branchRbacEnabled) {
3951
+ const channels2 = [serviceConnections];
3952
+ if (room) channels2.push(room);
3953
+ if (ownerId) channels2.push(ownerChannel());
3954
+ return channels2;
3955
+ }
3956
+ const branchId = await accessCache.getBranchIdForSession(sessionId);
3957
+ const visibility = branchId ? await accessCache.getBranchVisibility(branchId) : null;
3958
+ if (!visibility) return serviceConnections;
3959
+ if (visibility.mode === "allAuthenticated") {
3960
+ const channels2 = [serviceConnections];
3961
+ if (room) channels2.push(room);
3962
+ if (ownerId) channels2.push(ownerChannel());
3963
+ return channels2;
3964
+ }
3965
+ const channels = [serviceConnections];
3966
+ if (room) {
3967
+ channels.push(filterToUserIdsOrSuperadmins(room, visibility.userIds, allowSuperadmin));
3968
+ }
3969
+ if (ownerId && visibility.userIds.has(ownerId)) {
3970
+ channels.push(ownerChannel());
3971
+ }
3972
+ return channels;
3973
+ }
3847
3974
  function filterToUserIdsOrAdmins(authenticated, userIds, allowSuperadmin) {
3848
3975
  return authenticated.filter((connection) => {
3849
3976
  if (isServiceConnection(connection) || isAdminConnection(connection, allowSuperadmin)) {
@@ -3917,6 +4044,16 @@ function configureRealtimePublish(options) {
3917
4044
  throw error;
3918
4045
  }
3919
4046
  }
4047
+ if (isStreamingEvent(context)) {
4048
+ return resolveStreamingDelivery(
4049
+ app,
4050
+ data,
4051
+ tenantScoped,
4052
+ accessCache,
4053
+ branchRbacEnabled,
4054
+ allowSuperadmin
4055
+ );
4056
+ }
3920
4057
  if (!branchRbacEnabled) return tenantScoped;
3921
4058
  const scope = await resolvePublishScope(data, context, accessCache);
3922
4059
  if (scope.kind === "global") return tenantScoped;
@@ -4049,19 +4186,9 @@ function recomputeNextRunAt() {
4049
4186
  };
4050
4187
  }
4051
4188
 
4052
- // src/utils/session-task-state.ts
4053
- import {
4054
- isTerminalTaskStatus,
4055
- SessionStatus as SessionStatus2,
4056
- sessionCanStartTask,
4057
- TaskStatus
4058
- } from "@agor/core/types";
4059
- function isTerminalQueueProcessingSuppressed(params) {
4060
- return params?.suppressTerminalQueueProcessing === true;
4061
- }
4062
-
4063
- // src/register-hooks.ts
4064
- init_spawn_executor();
4189
+ // src/utils/session-queue-tenant-scope.ts
4190
+ import { resolveMultiTenancyConfig as resolveMultiTenancyConfig2 } from "@agor/core/config";
4191
+ import { runWithTenantDatabaseScope as runWithTenantDatabaseScope3 } from "@agor/core/db";
4065
4192
 
4066
4193
  // src/utils/tenant-db-scope.ts
4067
4194
  init_runtime_tokens();
@@ -4074,10 +4201,10 @@ import {
4074
4201
  enqueueTenantDatabasePostCommitCallback,
4075
4202
  getCurrentTenantId as getCurrentTenantId2,
4076
4203
  runWithoutTenantDatabaseScope,
4077
- runWithTenantDatabaseScope
4204
+ runWithTenantDatabaseScope as runWithTenantDatabaseScope2
4078
4205
  } from "@agor/core/db";
4079
4206
  import { NotAuthenticated as NotAuthenticated7 } from "@agor/core/feathers";
4080
- import jwt2 from "jsonwebtoken";
4207
+ import jwt3 from "jsonwebtoken";
4081
4208
  function readHeaderValue(headers, name) {
4082
4209
  if (!headers) return null;
4083
4210
  const wanted = name.toLowerCase();
@@ -4106,7 +4233,7 @@ function deferWithTenantDatabaseScope(db, params, work, onError) {
4106
4233
  const schedule = () => {
4107
4234
  runWithoutTenantDatabaseScope(() => {
4108
4235
  setImmediate(() => {
4109
- void runWithTenantDatabaseScope(db, tenantId, work).catch((error) => {
4236
+ void runWithTenantDatabaseScope2(db, tenantId, work).catch((error) => {
4110
4237
  if (onError) {
4111
4238
  onError(error);
4112
4239
  return;
@@ -4128,7 +4255,7 @@ function createTenantDatabaseScopeAroundHook(options) {
4128
4255
  const match = authorization?.match(/^Bearer\s+(.+)$/i);
4129
4256
  if (!match || !options.jwtSecret) return void 0;
4130
4257
  try {
4131
- return jwt2.verify(match[1], options.jwtSecret, {
4258
+ return jwt3.verify(match[1], options.jwtSecret, {
4132
4259
  issuer: RUNTIME_JWT_ISSUER,
4133
4260
  audience: RUNTIME_JWT_AUDIENCE
4134
4261
  });
@@ -4163,11 +4290,74 @@ function createTenantDatabaseScopeAroundHook(options) {
4163
4290
  }
4164
4291
  throw error;
4165
4292
  }
4166
- await runWithTenantDatabaseScope(options.db, context.params.tenant?.tenant_id, next);
4293
+ await runWithTenantDatabaseScope2(options.db, context.params.tenant?.tenant_id, next);
4167
4294
  };
4168
4295
  }
4169
4296
 
4297
+ // src/utils/session-queue-tenant-scope.ts
4298
+ function staticTenantId(config) {
4299
+ const multiTenancy = resolveMultiTenancyConfig2(config);
4300
+ return multiTenancy.mode === "static" ? multiTenancy.static_tenant_id : void 0;
4301
+ }
4302
+ function trustedTenantIdHint(options) {
4303
+ const hint = options.tenantIdHint?.trim();
4304
+ return hint || void 0;
4305
+ }
4306
+ function queueTenantParams(params, tenantId, source = "explicit") {
4307
+ const currentTenant = params?.tenant;
4308
+ return {
4309
+ ...params ?? {},
4310
+ tenant: {
4311
+ ...currentTenant,
4312
+ tenant_id: tenantId,
4313
+ source: currentTenant?.source ?? source
4314
+ }
4315
+ };
4316
+ }
4317
+ function deferWithSessionQueueTenantScope(options, work, onError) {
4318
+ const handleError = (error) => {
4319
+ if (onError) {
4320
+ onError(error);
4321
+ return;
4322
+ }
4323
+ console.error(`\u274C [Queue] ${options.label} failed:`, error);
4324
+ };
4325
+ const capturedTenantId = resolveTenantIdForDeferredScope(options.params);
4326
+ if (capturedTenantId) {
4327
+ const scopedParams2 = queueTenantParams(options.params, capturedTenantId, "explicit");
4328
+ deferWithTenantDatabaseScope(options.db, scopedParams2, () => work(scopedParams2), handleError);
4329
+ return;
4330
+ }
4331
+ const tenantIdHint = trustedTenantIdHint(options);
4332
+ if (tenantIdHint) {
4333
+ const scopedParams2 = queueTenantParams(options.params, tenantIdHint, "explicit");
4334
+ deferWithTenantDatabaseScope(options.db, scopedParams2, () => work(scopedParams2), handleError);
4335
+ return;
4336
+ }
4337
+ const configuredStaticTenantId = staticTenantId(options.config);
4338
+ if (!configuredStaticTenantId) {
4339
+ handleError(
4340
+ new Error(`${options.label} skipped for session ${options.sessionId}: missing tenant context`)
4341
+ );
4342
+ return;
4343
+ }
4344
+ const scopedParams = queueTenantParams(options.params, configuredStaticTenantId, "static");
4345
+ deferWithTenantDatabaseScope(options.db, scopedParams, () => work(scopedParams), handleError);
4346
+ }
4347
+
4348
+ // src/utils/session-task-state.ts
4349
+ import {
4350
+ isTerminalTaskStatus,
4351
+ SessionStatus as SessionStatus2,
4352
+ sessionCanStartTask,
4353
+ TaskStatus
4354
+ } from "@agor/core/types";
4355
+ function isTerminalQueueProcessingSuppressed(params) {
4356
+ return params?.suppressTerminalQueueProcessing === true;
4357
+ }
4358
+
4170
4359
  // src/register-hooks.ts
4360
+ init_spawn_executor();
4171
4361
  var DEBUG_MCP_TOKENS2 = process.env.AGOR_DEBUG_MCP_TOKENS === "1" || process.env.DEBUG?.includes("mcp-tokens");
4172
4362
  function mcpTokenDebug2(...args) {
4173
4363
  if (DEBUG_MCP_TOKENS2) {
@@ -4279,6 +4469,10 @@ function shouldRunSessionPostTurnHooks(session) {
4279
4469
  function shouldDrainQueueAfterSessionPostTurnPatch(session, params) {
4280
4470
  return shouldRunSessionPostTurnHooks(session) && session.ready_for_prompt === true && !isTerminalQueueProcessingSuppressed(params);
4281
4471
  }
4472
+ function getTrustedSessionTenantId(session) {
4473
+ const tenantId = session?.tenant_id;
4474
+ return typeof tenantId === "string" && tenantId.length > 0 ? tenantId : void 0;
4475
+ }
4282
4476
  async function enrichSessionFindResultWithRemoteRelationships(result, sessionsService) {
4283
4477
  if (isRemoteRelationshipsEnrichedResult(result)) return result;
4284
4478
  if (Array.isArray(result)) {
@@ -4293,6 +4487,7 @@ async function enrichSessionFindResultWithRemoteRelationships(result, sessionsSe
4293
4487
  }
4294
4488
  var TENANT_OWNED_SERVICE_PATHS = [
4295
4489
  "sessions",
4490
+ "sessions/:id/mcp-servers",
4296
4491
  "session-relationships",
4297
4492
  "tasks",
4298
4493
  "messages",
@@ -4309,6 +4504,14 @@ var TENANT_OWNED_SERVICE_PATHS = [
4309
4504
  "boards/:id/group-grants",
4310
4505
  "app-variables",
4311
4506
  "mcp-servers",
4507
+ "mcp-servers/discover",
4508
+ "mcp-servers/oauth-auth-headers",
4509
+ "mcp-servers/oauth-complete",
4510
+ "mcp-servers/oauth-disconnect",
4511
+ "mcp-servers/oauth-refresh",
4512
+ "mcp-servers/oauth-start",
4513
+ "mcp-servers/oauth-status",
4514
+ "mcp-servers/test-oauth",
4312
4515
  "card-types",
4313
4516
  "cards",
4314
4517
  "artifacts",
@@ -4355,7 +4558,7 @@ function registerHooks(ctx) {
4355
4558
  return void 0;
4356
4559
  }
4357
4560
  };
4358
- const multiTenancy = resolveMultiTenancyConfig3(config);
4561
+ const multiTenancy = resolveMultiTenancyConfig4(config);
4359
4562
  const tenantColumnsEnabled = resolveMultiTenancyDatabaseDialect(config) === "postgresql";
4360
4563
  const executionMode = resolveExecutionSecurityMode(config);
4361
4564
  const tenantOwnedServicePaths = TENANT_OWNED_SERVICE_PATHS;
@@ -4513,16 +4716,36 @@ function registerHooks(ctx) {
4513
4716
  );
4514
4717
  return context;
4515
4718
  };
4516
- const syncUnixAccessForAllBranches = async (context, logPrefix) => {
4719
+ const membershipGroupIdFromContext = (context) => {
4720
+ const resultGroupId = context.result?.group_id;
4721
+ if (typeof resultGroupId === "string" && resultGroupId.length > 0) {
4722
+ return resultGroupId;
4723
+ }
4724
+ const dataGroupId = context.data?.group_id;
4725
+ if (typeof dataGroupId === "string" && dataGroupId.length > 0) return dataGroupId;
4726
+ const queryGroupId = context.params.query?.group_id;
4727
+ if (typeof queryGroupId === "string" && queryGroupId.length > 0) return queryGroupId;
4728
+ const routeGroupId = context.params.route?.groupId;
4729
+ if (typeof routeGroupId === "string" && routeGroupId.length > 0) return routeGroupId;
4730
+ return void 0;
4731
+ };
4732
+ const syncUnixAccessForGroupGrantedBranches = async (context, logPrefix) => {
4517
4733
  if (!executionMode.unixFsIsolationEnabled) return context;
4518
- const branches = await branchRepository.findAll({ includeArchived: false });
4519
- for (const branch of branches) {
4520
- syncBranchUnixAccess(
4521
- branch.branch_id,
4522
- logPrefix,
4523
- context.params
4734
+ const groupId = membershipGroupIdFromContext(context);
4735
+ if (!groupId) {
4736
+ console.warn(
4737
+ `[Unix Integration] Could not resolve group_id for ${context.path}.${context.method}; skipping group membership permission sync`
4524
4738
  );
4525
- await invalidateRealtimeBranchAccess(branch.branch_id);
4739
+ return context;
4740
+ }
4741
+ const branchIds = await branchRepository.findExplicitFsAccessBranchIdsForGroup(groupId);
4742
+ if (branchIds.length === 0) return context;
4743
+ console.log(
4744
+ `[Unix Integration] Queueing group membership permission sync for ${branchIds.length} branch(es) granted to group ${shortId5(groupId)}`
4745
+ );
4746
+ for (const branchId of branchIds) {
4747
+ syncBranchUnixAccess(branchId, logPrefix, context.params);
4748
+ await invalidateRealtimeBranchAccess(branchId);
4526
4749
  }
4527
4750
  return context;
4528
4751
  };
@@ -5066,7 +5289,13 @@ function registerHooks(ctx) {
5066
5289
  });
5067
5290
  const injectPerUserOAuthTokens = async (context) => {
5068
5291
  const queryForUserId = context.params?.query?.forUserId;
5069
- const userId = context.params?.user?.user_id || queryForUserId;
5292
+ const authPayloadType = context.params?.authentication?.payload?.type;
5293
+ const userId = resolveForUserIdWithGate({
5294
+ queryForUserId,
5295
+ isServiceAccount: context.params?.user?._isServiceAccount,
5296
+ authPayloadType,
5297
+ callerUserId: context.params?.user?.user_id
5298
+ });
5070
5299
  if (!userId) {
5071
5300
  return context;
5072
5301
  }
@@ -5423,11 +5652,11 @@ function registerHooks(ctx) {
5423
5652
  after: {
5424
5653
  create: [
5425
5654
  clearRealtimeBranchVisibility,
5426
- (context) => syncUnixAccessForAllBranches(context, "[Executor/group-memberships.create]")
5655
+ (context) => syncUnixAccessForGroupGrantedBranches(context, "[Executor/group-memberships.create]")
5427
5656
  ],
5428
5657
  remove: [
5429
5658
  clearRealtimeBranchVisibility,
5430
- (context) => syncUnixAccessForAllBranches(context, "[Executor/group-memberships.remove]")
5659
+ (context) => syncUnixAccessForGroupGrantedBranches(context, "[Executor/group-memberships.remove]")
5431
5660
  ]
5432
5661
  }
5433
5662
  });
@@ -6073,19 +6302,29 @@ function registerHooks(ctx) {
6073
6302
  }
6074
6303
  });
6075
6304
  if (shouldDrainQueueAfterSessionPostTurnPatch(session, context.params)) {
6076
- deferWithTenantDatabaseScope(db, context.params, async () => {
6077
- try {
6305
+ const sessionTenantId = getTrustedSessionTenantId(session);
6306
+ deferWithSessionQueueTenantScope(
6307
+ {
6308
+ db,
6309
+ config,
6310
+ sessionId: session.session_id,
6311
+ params: context.params,
6312
+ tenantIdHint: sessionTenantId,
6313
+ label: "SessionsService.after.patch queue drain"
6314
+ },
6315
+ async (queueParams) => {
6078
6316
  console.log(
6079
6317
  `\u{1F504} [SessionsService.after.patch] Session ${shortId5(session.session_id)} became promptable (${session.status}), checking for queued tasks...`
6080
6318
  );
6081
- await sessionsService.triggerQueueProcessing(session.session_id, context.params);
6082
- } catch (error) {
6319
+ await sessionsService.triggerQueueProcessing(session.session_id, queueParams);
6320
+ },
6321
+ (error) => {
6083
6322
  console.error(
6084
6323
  `\u274C [SessionsService.after.patch] Failed to process queue for session ${shortId5(session.session_id)}:`,
6085
6324
  error
6086
6325
  );
6087
6326
  }
6088
- });
6327
+ );
6089
6328
  } else {
6090
6329
  console.log(
6091
6330
  `\u23ED\uFE0F [SessionsService.after.patch] Queue drain suppressed for session ${shortId5(session.session_id)} (suppressTerminalQueueProcessing or not ready)`
@@ -6294,6 +6533,17 @@ function registerHooks(ctx) {
6294
6533
  context.dispatch = result;
6295
6534
  return context;
6296
6535
  }
6536
+ if (_action === "mergeObjectFields" && objects) {
6537
+ if (!context.id) throw new Error("Board ID required");
6538
+ const result = await boardsService.mergeBoardObjectFields(
6539
+ context.id,
6540
+ objects
6541
+ );
6542
+ context.result = result;
6543
+ app.service("boards").emit("patched", result);
6544
+ context.dispatch = result;
6545
+ return context;
6546
+ }
6297
6547
  if (_action === "deleteZone" && objectId) {
6298
6548
  if (!context.id) throw new Error("Board ID required");
6299
6549
  const result = await boardsService.deleteZone(
@@ -6505,6 +6755,7 @@ export {
6505
6755
  PROMPT_FLOW_PATCH_FIELDS,
6506
6756
  TENANT_OWNED_SERVICE_PATHS,
6507
6757
  enrichSessionFindResultWithRemoteRelationships,
6758
+ getTrustedSessionTenantId,
6508
6759
  isPromptFlowPatchOnly,
6509
6760
  registerHooks,
6510
6761
  shouldDrainQueueAfterSessionPostTurnPatch,
@@ -1 +1 @@
1
- {"version":3,"file":"register-routes.d.ts","sourceRoot":"","sources":["../src/register-routes.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACL,KAAK,UAAU,EAIhB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,gBAAgB,EAOhB,iBAAiB,EAGjB,KAAK,wBAAwB,EAC7B,eAAe,EAChB,MAAM,eAAe,CAAC;AAEvB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAML,aAAa,EAGd,MAAM,qBAAqB,CAAC;AAE7B,OAAO,KAAK,EAEV,oBAAoB,EACpB,WAAW,EAIX,MAAM,EAIN,WAAW,EASZ,MAAM,kBAAkB,CAAC;AAwB1B,OAAO,KAAK,EACV,iBAAiB,EAEjB,mBAAmB,EAEnB,mBAAmB,EAEpB,MAAM,mBAAmB,CAAC;AAQ3B,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAgEhE,qBAAa,iBAAkB,SAAQ,aAAa;IAC5C,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;IAK3C,SAAS,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM;CAOhD;AA0BD;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,EAAE,EAAE,wBAAwB,CAAC;IAC7B,GAAG,EAAE,WAAW,GAAG;QAAE,EAAE,CAAC,EAAE,OAAO,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;IACvD,MAAM,EAAE,UAAU,CAAC;IACnB,UAAU,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC;IACvC,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,WAAW,CAAC;IACxC,SAAS,EAAE,MAAM,CAAC;IAClB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,WAAW,EAAE,CAAC,OAAO,EAAE,WAAW,KAAK,OAAO,CAAC,WAAW,CAAC,CAAC;IAC5D,qBAAqB,EAAE,CAAC,OAAO,EAAE,WAAW,KAAK,OAAO,CAAC,WAAW,CAAC,CAAC;IACtE,cAAc,EAAE;QAAE,eAAe,EAAE,OAAO,CAAA;KAAE,CAAC;IAC7C,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB;;;;OAIG;IACH,iBAAiB,EAAE,OAAO,uBAAuB,EAAE,SAAS,CAAC;IAC7D,cAAc,EAAE,oBAAoB,CAAC;IACrC;;;OAGG;IACH,gBAAgB,EAAE,OAAO,mBAAmB,EAAE,gBAAgB,CAAC;IAG/D,eAAe,EAAE,mBAAmB,CAAC;IACrC,eAAe,EAAE,mBAAmB,CAAC;IACrC,aAAa,EAAE,iBAAiB,GAAG,SAAS,CAAC;IAC7C,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,eAAe,EAAE,eAAe,CAAC;IACjC,kBAAkB,EAAE,iBAAiB,CAAC;IACtC,wBAAwB,EAAE,UAAU,CAClC,cAAc,mCAAmC,EAAE,8BAA8B,CAClF,CAAC;IACF,2BAA2B,EAAE,UAAU,CACrC,cAAc,sCAAsC,EAAE,iCAAiC,CACxF,CAAC;IACF,gBAAgB,EAAE,gBAAgB,GAAG,IAAI,CAAC;CAC3C;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,GAAG,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC,CAgjH9E"}
1
+ {"version":3,"file":"register-routes.d.ts","sourceRoot":"","sources":["../src/register-routes.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACL,KAAK,UAAU,EAIhB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,gBAAgB,EAOhB,iBAAiB,EAGjB,KAAK,wBAAwB,EAC7B,eAAe,EAChB,MAAM,eAAe,CAAC;AAEvB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAML,aAAa,EAGd,MAAM,qBAAqB,CAAC;AAE7B,OAAO,KAAK,EAEV,oBAAoB,EACpB,WAAW,EAIX,MAAM,EAIN,WAAW,EASZ,MAAM,kBAAkB,CAAC;AAsB1B,OAAO,KAAK,EACV,iBAAiB,EAEjB,mBAAmB,EAEnB,mBAAmB,EAEpB,MAAM,mBAAmB,CAAC;AAS3B,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAoEhE,qBAAa,iBAAkB,SAAQ,aAAa;IAC5C,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;IAK3C,SAAS,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM;CAOhD;AA0BD;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,EAAE,EAAE,wBAAwB,CAAC;IAC7B,GAAG,EAAE,WAAW,GAAG;QAAE,EAAE,CAAC,EAAE,OAAO,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;IACvD,MAAM,EAAE,UAAU,CAAC;IACnB,UAAU,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC;IACvC,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,WAAW,CAAC;IACxC,SAAS,EAAE,MAAM,CAAC;IAClB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,WAAW,EAAE,CAAC,OAAO,EAAE,WAAW,KAAK,OAAO,CAAC,WAAW,CAAC,CAAC;IAC5D,qBAAqB,EAAE,CAAC,OAAO,EAAE,WAAW,KAAK,OAAO,CAAC,WAAW,CAAC,CAAC;IACtE,cAAc,EAAE;QAAE,eAAe,EAAE,OAAO,CAAA;KAAE,CAAC;IAC7C,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB;;;;OAIG;IACH,iBAAiB,EAAE,OAAO,uBAAuB,EAAE,SAAS,CAAC;IAC7D,cAAc,EAAE,oBAAoB,CAAC;IACrC;;;OAGG;IACH,gBAAgB,EAAE,OAAO,mBAAmB,EAAE,gBAAgB,CAAC;IAG/D,eAAe,EAAE,mBAAmB,CAAC;IACrC,eAAe,EAAE,mBAAmB,CAAC;IACrC,aAAa,EAAE,iBAAiB,GAAG,SAAS,CAAC;IAC7C,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,eAAe,EAAE,eAAe,CAAC;IACjC,kBAAkB,EAAE,iBAAiB,CAAC;IACtC,wBAAwB,EAAE,UAAU,CAClC,cAAc,mCAAmC,EAAE,8BAA8B,CAClF,CAAC;IACF,2BAA2B,EAAE,UAAU,CACrC,cAAc,sCAAsC,EAAE,iCAAiC,CACxF,CAAC;IACF,gBAAgB,EAAE,gBAAgB,GAAG,IAAI,CAAC;CAC3C;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,GAAG,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC,CA6kH9E"}