@rudderhq/server 0.4.5 → 0.4.6-canary.0

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 (272) hide show
  1. package/dist/app.d.ts.map +1 -1
  2. package/dist/app.js +2 -0
  3. package/dist/app.js.map +1 -1
  4. package/dist/auth/better-auth.d.ts +15 -3
  5. package/dist/auth/better-auth.d.ts.map +1 -1
  6. package/dist/auth/better-auth.js.map +1 -1
  7. package/dist/bootstrap/plugin-host-runtime.d.ts +8 -8
  8. package/dist/bootstrap/register-api-routes.d.ts.map +1 -1
  9. package/dist/bootstrap/register-api-routes.js +2 -0
  10. package/dist/bootstrap/register-api-routes.js.map +1 -1
  11. package/dist/bundled-plugins/plugin-linear/dist/worker.js +26 -5
  12. package/dist/bundled-plugins/plugin-linear/dist/worker.js.map +2 -2
  13. package/dist/bundled-plugins/plugin-linear/package.json +1 -1
  14. package/dist/middleware/auth.d.ts.map +1 -1
  15. package/dist/middleware/auth.js +14 -2
  16. package/dist/middleware/auth.js.map +1 -1
  17. package/dist/onboarding-assets/ceo/SOUL.md +8 -5
  18. package/dist/routes/access-onboarding.helpers.d.ts.map +1 -1
  19. package/dist/routes/access-onboarding.helpers.js +2 -24
  20. package/dist/routes/access-onboarding.helpers.js.map +1 -1
  21. package/dist/routes/access.helpers.d.ts +1 -1
  22. package/dist/routes/browser.d.ts +30 -0
  23. package/dist/routes/browser.d.ts.map +1 -0
  24. package/dist/routes/browser.js +263 -0
  25. package/dist/routes/browser.js.map +1 -0
  26. package/dist/routes/chats.d.ts.map +1 -1
  27. package/dist/routes/chats.js +11 -0
  28. package/dist/routes/chats.js.map +1 -1
  29. package/dist/routes/instance-settings.d.ts.map +1 -1
  30. package/dist/routes/instance-settings.js +33 -1
  31. package/dist/routes/instance-settings.js.map +1 -1
  32. package/dist/routes/onboarding.d.ts.map +1 -1
  33. package/dist/routes/onboarding.js +33 -31
  34. package/dist/routes/onboarding.js.map +1 -1
  35. package/dist/routes/plugin-ui-static.d.ts.map +1 -1
  36. package/dist/routes/plugin-ui-static.js +2 -4
  37. package/dist/routes/plugin-ui-static.js.map +1 -1
  38. package/dist/routes/plugins.d.ts.map +1 -1
  39. package/dist/routes/plugins.js +2 -4
  40. package/dist/routes/plugins.js.map +1 -1
  41. package/dist/services/access.d.ts +23 -23
  42. package/dist/services/activity-log.d.ts.map +1 -1
  43. package/dist/services/activity-log.js +2 -4
  44. package/dist/services/activity-log.js.map +1 -1
  45. package/dist/services/activity.d.ts +13 -13
  46. package/dist/services/agent-run-context.d.ts +2 -1
  47. package/dist/services/agent-run-context.d.ts.map +1 -1
  48. package/dist/services/agent-run-context.js +29 -4
  49. package/dist/services/agent-run-context.js.map +1 -1
  50. package/dist/services/agents.d.ts +36 -36
  51. package/dist/services/approvals.d.ts +18 -18
  52. package/dist/services/assets.d.ts +6 -6
  53. package/dist/services/automation-chat-output.d.ts +1 -1
  54. package/dist/services/automations.d.ts +37 -37
  55. package/dist/services/automations.d.ts.map +1 -1
  56. package/dist/services/automations.js +2 -6
  57. package/dist/services/automations.js.map +1 -1
  58. package/dist/services/board-auth.d.ts +38 -38
  59. package/dist/services/browser-broker.d.ts +43 -0
  60. package/dist/services/browser-broker.d.ts.map +1 -0
  61. package/dist/services/browser-broker.js +173 -0
  62. package/dist/services/browser-broker.js.map +1 -0
  63. package/dist/services/browser-broker.test.d.ts +2 -0
  64. package/dist/services/browser-broker.test.d.ts.map +1 -0
  65. package/dist/services/browser-broker.test.js +154 -0
  66. package/dist/services/browser-broker.test.js.map +1 -0
  67. package/dist/services/browser-capability.d.ts +20 -0
  68. package/dist/services/browser-capability.d.ts.map +1 -0
  69. package/dist/services/browser-capability.js +29 -0
  70. package/dist/services/browser-capability.js.map +1 -0
  71. package/dist/services/calendar.d.ts +34 -34
  72. package/dist/services/chat-agent-runs.d.ts.map +1 -1
  73. package/dist/services/chat-agent-runs.js +2 -4
  74. package/dist/services/chat-agent-runs.js.map +1 -1
  75. package/dist/services/chat-assistant.d.ts.map +1 -1
  76. package/dist/services/chat-assistant.js +6 -4
  77. package/dist/services/chat-assistant.js.map +1 -1
  78. package/dist/services/chat-assistant.runtime-batch.d.ts +3 -0
  79. package/dist/services/chat-assistant.runtime-batch.d.ts.map +1 -0
  80. package/dist/services/chat-assistant.runtime-batch.js +16 -0
  81. package/dist/services/chat-assistant.runtime-batch.js.map +1 -0
  82. package/dist/services/chat-work-manifest.d.ts +7 -0
  83. package/dist/services/chat-work-manifest.d.ts.map +1 -0
  84. package/dist/services/chat-work-manifest.js +235 -0
  85. package/dist/services/chat-work-manifest.js.map +1 -0
  86. package/dist/services/chats.d.ts +64 -64
  87. package/dist/services/chats.d.ts.map +1 -1
  88. package/dist/services/chats.js +2 -4
  89. package/dist/services/chats.js.map +1 -1
  90. package/dist/services/costs.d.ts +2 -2
  91. package/dist/services/finance.d.ts +11 -11
  92. package/dist/services/goals.d.ts +20 -20
  93. package/dist/services/instance-settings.d.ts +3 -1
  94. package/dist/services/instance-settings.d.ts.map +1 -1
  95. package/dist/services/instance-settings.js +30 -1
  96. package/dist/services/instance-settings.js.map +1 -1
  97. package/dist/services/integrations/agent-integrations.d.ts +8 -8
  98. package/dist/services/integrations/custom-integrations.d.ts +3 -3
  99. package/dist/services/integrations/feishu/inbound-dispatcher-db.d.ts.map +1 -1
  100. package/dist/services/integrations/feishu/inbound-dispatcher-db.js +10 -11
  101. package/dist/services/integrations/feishu/inbound-dispatcher-db.js.map +1 -1
  102. package/dist/services/integrations/feishu/user-bindings.d.ts.map +1 -1
  103. package/dist/services/integrations/feishu/user-bindings.js +2 -4
  104. package/dist/services/integrations/feishu/user-bindings.js.map +1 -1
  105. package/dist/services/issue-approvals.d.ts +3 -3
  106. package/dist/services/issues.comments-attachments.d.ts +8 -8
  107. package/dist/services/issues.d.ts +19 -19
  108. package/dist/services/issues.helpers.d.ts.map +1 -1
  109. package/dist/services/issues.helpers.js +2 -6
  110. package/dist/services/issues.helpers.js.map +1 -1
  111. package/dist/services/knowledge-portability/organization-skills.d.ts +2 -1
  112. package/dist/services/knowledge-portability/organization-skills.d.ts.map +1 -1
  113. package/dist/services/knowledge-portability/organization-skills.js +16 -6
  114. package/dist/services/knowledge-portability/organization-skills.js.map +1 -1
  115. package/dist/services/messenger.d.ts +3 -3
  116. package/dist/services/messenger.d.ts.map +1 -1
  117. package/dist/services/messenger.js +3 -0
  118. package/dist/services/messenger.js.map +1 -1
  119. package/dist/services/organization-intelligence-profiles.d.ts.map +1 -1
  120. package/dist/services/organization-intelligence-profiles.js +2 -0
  121. package/dist/services/organization-intelligence-profiles.js.map +1 -1
  122. package/dist/services/orgs.d.ts +1 -1
  123. package/dist/services/orgs.d.ts.map +1 -1
  124. package/dist/services/orgs.js +2 -10
  125. package/dist/services/orgs.js.map +1 -1
  126. package/dist/services/plugin-registry.d.ts +71 -71
  127. package/dist/services/plugin-registry.d.ts.map +1 -1
  128. package/dist/services/plugin-registry.js +2 -5
  129. package/dist/services/plugin-registry.js.map +1 -1
  130. package/dist/services/postgres-errors.d.ts +6 -0
  131. package/dist/services/postgres-errors.d.ts.map +1 -0
  132. package/dist/services/postgres-errors.js +30 -0
  133. package/dist/services/postgres-errors.js.map +1 -0
  134. package/dist/services/projects.d.ts +2 -2
  135. package/dist/services/runtime-kernel/heartbeat.d.ts +29 -29
  136. package/dist/services/runtime-kernel/model-fallback.d.ts +2 -0
  137. package/dist/services/runtime-kernel/model-fallback.d.ts.map +1 -1
  138. package/dist/services/runtime-kernel/model-fallback.js +108 -9
  139. package/dist/services/runtime-kernel/model-fallback.js.map +1 -1
  140. package/dist/services/secrets.d.ts +20 -20
  141. package/dist/services/workspace-runtime.services.d.ts +3 -3
  142. package/package.json +19 -19
  143. package/resources/bundled-skills/browser/SKILL.md +49 -0
  144. package/resources/bundled-skills/browser/agents/openai.yaml +4 -0
  145. package/resources/bundled-skills/browser/references/tool-contract.md +73 -0
  146. package/resources/bundled-skills/rudder/SKILL.md +5 -2
  147. package/resources/bundled-skills/rudder/references/cli-reference.md +17 -0
  148. package/skills/browser/SKILL.md +49 -0
  149. package/skills/browser/agents/openai.yaml +4 -0
  150. package/skills/browser/references/tool-contract.md +73 -0
  151. package/skills/rudder/SKILL.md +5 -2
  152. package/skills/rudder/references/cli-reference.md +17 -0
  153. package/ui-dist/assets/abnfDiagram-VRR7QNED-CDpy6iIp.js +1 -0
  154. package/ui-dist/assets/arc-BUmFz4fr.js +1 -0
  155. package/ui-dist/assets/architectureDiagram-ZJ3FMSHR-BgxSslJV.js +36 -0
  156. package/ui-dist/assets/blockDiagram-677ZJIJ3-ooHxGjx4.js +132 -0
  157. package/ui-dist/assets/c4Diagram-LMCZKHZV-D9dY1Aru.js +10 -0
  158. package/ui-dist/assets/channel-CKAv7Dbr.js +1 -0
  159. package/ui-dist/assets/{chunk-QZHKN3VN-CoUe43bE.js → chunk-2Q5K7J3B-BdJwTN30.js} +1 -1
  160. package/ui-dist/assets/{chunk-JSJVCQXG-CGWgDKBb.js → chunk-32BRIVSS-CaFHJTJR.js} +1 -1
  161. package/ui-dist/assets/{chunk-FMBD7UC4-D_yZ_WmF.js → chunk-5VM5RSS4-BRD2jTg5.js} +1 -1
  162. package/ui-dist/assets/chunk-EX3LRPZG-CpOtmEnY.js +231 -0
  163. package/ui-dist/assets/{chunk-4BX2VUAB-Cd0jMFjT.js → chunk-JWPE2WC7-Dw2-8WMO.js} +1 -1
  164. package/ui-dist/assets/chunk-MOJQB5TN-DAS2IY_W.js +88 -0
  165. package/ui-dist/assets/chunk-RYQCIY6F-CYPq5dnm.js +1 -0
  166. package/ui-dist/assets/chunk-V7JOEXUC-DbSPNxXt.js +206 -0
  167. package/ui-dist/assets/{chunk-KX2RTZJC-PgfQ6Dqz.js → chunk-VR4S4FIN-CemgflPu.js} +1 -1
  168. package/ui-dist/assets/{chunk-55IACEB6-C-AmshGj.js → chunk-XXDRQBXY-Ba6PC9p6.js} +1 -1
  169. package/ui-dist/assets/classDiagram-OUVF2IWQ-CKpTn3Kw.js +1 -0
  170. package/ui-dist/assets/classDiagram-v2-EOCWNBFH-CKpTn3Kw.js +1 -0
  171. package/ui-dist/assets/{cose-bilkent-S5V4N54A-jsoDVyK9.js → cose-bilkent-JH36ORCC-BtBpHG_r.js} +1 -1
  172. package/ui-dist/assets/cynefin-VYW2F7L2-B0X6WooA.js +178 -0
  173. package/ui-dist/assets/cynefinDiagram-TSTJHNR4-DbgMlBM5.js +62 -0
  174. package/ui-dist/assets/cytoscape.esm-DTSO7Bv0.js +331 -0
  175. package/ui-dist/assets/dagre-VKFMJZFB-B8dBAi58.js +4 -0
  176. package/ui-dist/assets/diagram-FQU43EPY-CUBJ_ZvC.js +3 -0
  177. package/ui-dist/assets/diagram-G47NLZAW-CFRyURRw.js +24 -0
  178. package/ui-dist/assets/diagram-NH7WQ7WH-DRGQCFZY.js +24 -0
  179. package/ui-dist/assets/diagram-OA4YK3LP-Bk-5Qh1L.js +30 -0
  180. package/ui-dist/assets/diagram-WEI45ONY-CZPrvlcf.js +41 -0
  181. package/ui-dist/assets/ebnfDiagram-CCIWWBDH-B7Oa7CuJ.js +1 -0
  182. package/ui-dist/assets/erDiagram-Q63AITRT-D-SnVYAC.js +85 -0
  183. package/ui-dist/assets/flowDiagram-23GEKE2U-D0ES-POE.js +156 -0
  184. package/ui-dist/assets/ganttDiagram-NO4QXBWP-DxL6MH_c.js +292 -0
  185. package/ui-dist/assets/gitGraphDiagram-IHSO6WYX-BjdtAqn4.js +106 -0
  186. package/ui-dist/assets/graph-Bm3HhXYU.js +1 -0
  187. package/ui-dist/assets/{index-DDvz8goz.js → index-6GODZ0Tf.js} +1 -1
  188. package/ui-dist/assets/{index-CkdLQ1A4.js → index-B6-eHB_S.js} +1 -1
  189. package/ui-dist/assets/{index-1Ubio04r.js → index-BJx0M_2V.js} +1 -1
  190. package/ui-dist/assets/{index-BXbeltXq.js → index-BKaUE7op.js} +1 -1
  191. package/ui-dist/assets/{index-BSRzECfZ.js → index-BVQAE7Gp.js} +1 -1
  192. package/ui-dist/assets/{index-CMRK9PUO.js → index-Bv08zENf.js} +1 -1
  193. package/ui-dist/assets/{index-B4KMgdrI.js → index-C9IwIL1Y.js} +1 -1
  194. package/ui-dist/assets/{index-ipqs2akW.js → index-CNWYUMUW.js} +1 -1
  195. package/ui-dist/assets/{index-Be_UUduv.js → index-CsF2ME-F.js} +1 -1
  196. package/ui-dist/assets/index-DAQuh6iw.css +1 -0
  197. package/ui-dist/assets/{index-BBL80GJ3.js → index-DG1bXCni.js} +1 -1
  198. package/ui-dist/assets/{index-C2Ne_Flh.js → index-DSa3ObqN.js} +1 -1
  199. package/ui-dist/assets/{index-Cd5DOkgF.js → index-DgpIdftd.js} +1 -1
  200. package/ui-dist/assets/{index-Dxe3o4t_.js → index-IyUEMhfc.js} +1 -1
  201. package/ui-dist/assets/{index-B-4En24L.js → index-IzoWAsq4.js} +1 -1
  202. package/ui-dist/assets/{index-BL10wT_h.js → index-L6LxSwGF.js} +454 -465
  203. package/ui-dist/assets/{index-CjLYHamo.js → index-j5cZYTMF.js} +1 -1
  204. package/ui-dist/assets/{index-LKZoMmLm.js → index-yTqWLDLf.js} +1 -1
  205. package/ui-dist/assets/{index-DgfqS5r-.js → index-ylc7XFMg.js} +1 -1
  206. package/ui-dist/assets/infoDiagram-FWYZ7A6U-bWz54kfj.js +2 -0
  207. package/ui-dist/assets/{ishikawaDiagram-PHBUUO56-C08ZUJEU.js → ishikawaDiagram-FXEZZL3T-BgbS7eJf.js} +3 -3
  208. package/ui-dist/assets/journeyDiagram-5HDEW3XC-BQd7XTR7.js +139 -0
  209. package/ui-dist/assets/{kanban-definition-K7BYSVSG-BcJd4-9s.js → kanban-definition-HUTT4EX6-ClNG1w8r.js} +8 -8
  210. package/ui-dist/assets/katex-C5jXJg4s.js +257 -0
  211. package/ui-dist/assets/layout-CW-MiMXP.js +1 -0
  212. package/ui-dist/assets/{linear-CqN63wCD.js → linear-CU01CZyV.js} +1 -1
  213. package/ui-dist/assets/map-Mx3r0KIO.js +1 -0
  214. package/ui-dist/assets/mermaid.core-yS58mCMX.js +314 -0
  215. package/ui-dist/assets/mindmap-definition-LN4V7U3C-BrbWqg8j.js +96 -0
  216. package/ui-dist/assets/pegDiagram-2B236MQR-DAiVkGbJ.js +1 -0
  217. package/ui-dist/assets/pieDiagram-ENE6RG2P-Cfpgsmkb.js +39 -0
  218. package/ui-dist/assets/quadrantDiagram-ABIIQ3AL-BJCgcvPl.js +7 -0
  219. package/ui-dist/assets/railroadDiagram-RFXS5EU6-cSPWQQbj.js +1 -0
  220. package/ui-dist/assets/requirementDiagram-TGXJPOKE-B97SYYW6.js +84 -0
  221. package/ui-dist/assets/sankeyDiagram-HTMAVEWB-B-6vRKzj.js +40 -0
  222. package/ui-dist/assets/sequenceDiagram-DBY2YBRQ-DBK5BssT.js +162 -0
  223. package/ui-dist/assets/sizeCapture-X5ZJPWSS-BHH1iv2s.js +1 -0
  224. package/ui-dist/assets/stateDiagram-2N3HPSRC-Beu0lngd.js +1 -0
  225. package/ui-dist/assets/stateDiagram-v2-6OUMAXLB-BW5DHyV6.js +1 -0
  226. package/ui-dist/assets/swimlanes-5IMT3BWC-Ch-Sw6Rt.js +2 -0
  227. package/ui-dist/assets/swimlanesDiagram-G3AALYLV-lXZFrwCS.js +8 -0
  228. package/ui-dist/assets/timeline-definition-FHXFAJF6-Bd5ivmQa.js +120 -0
  229. package/ui-dist/assets/vennDiagram-L72KCM5P-VPXzIpMm.js +34 -0
  230. package/ui-dist/assets/wardleyDiagram-EHGQE667-DJvj2D5b.js +78 -0
  231. package/ui-dist/assets/xychartDiagram-FW5EYKEG-WOveSYiF.js +7 -0
  232. package/ui-dist/index.html +2 -2
  233. package/ui-dist/assets/_basePickBy-Cniq5QAz.js +0 -1
  234. package/ui-dist/assets/_baseUniq-aSj0wr7H.js +0 -1
  235. package/ui-dist/assets/arc-C4Mg91_a.js +0 -1
  236. package/ui-dist/assets/architectureDiagram-2XIMDMQ5-DfqLRajq.js +0 -36
  237. package/ui-dist/assets/blockDiagram-WCTKOSBZ-BbefXkmh.js +0 -132
  238. package/ui-dist/assets/c4Diagram-IC4MRINW-BVPjmrfV.js +0 -10
  239. package/ui-dist/assets/channel-B-bxwuub.js +0 -1
  240. package/ui-dist/assets/chunk-NQ4KR5QH-D78Rqvef.js +0 -220
  241. package/ui-dist/assets/chunk-WL4C6EOR-CaI2CXRo.js +0 -189
  242. package/ui-dist/assets/classDiagram-VBA2DB6C-oNkrSzge.js +0 -1
  243. package/ui-dist/assets/classDiagram-v2-RAHNMMFH-oNkrSzge.js +0 -1
  244. package/ui-dist/assets/clone-D1LQw6bn.js +0 -1
  245. package/ui-dist/assets/cytoscape.esm-BQaXIfA_.js +0 -331
  246. package/ui-dist/assets/dagre-KLK3FWXG-Cedmep7r.js +0 -4
  247. package/ui-dist/assets/diagram-E7M64L7V-BWIKKX1f.js +0 -24
  248. package/ui-dist/assets/diagram-IFDJBPK2-De8ij4wb.js +0 -43
  249. package/ui-dist/assets/diagram-P4PSJMXO-DfqKc5zd.js +0 -24
  250. package/ui-dist/assets/erDiagram-INFDFZHY-CacJL_tU.js +0 -70
  251. package/ui-dist/assets/flowDiagram-PKNHOUZH-CQbuZmQW.js +0 -162
  252. package/ui-dist/assets/ganttDiagram-A5KZAMGK-uMPy8GwP.js +0 -292
  253. package/ui-dist/assets/gitGraphDiagram-K3NZZRJ6-D10Ck-1y.js +0 -65
  254. package/ui-dist/assets/graph-DMAYpSbz.js +0 -1
  255. package/ui-dist/assets/index-yhZee3iu.css +0 -1
  256. package/ui-dist/assets/infoDiagram-LFFYTUFH-WdYfk1ti.js +0 -2
  257. package/ui-dist/assets/journeyDiagram-4ABVD52K-A3rlVmO2.js +0 -139
  258. package/ui-dist/assets/katex-B1X10hvy.js +0 -261
  259. package/ui-dist/assets/layout-BjkotBZ2.js +0 -1
  260. package/ui-dist/assets/mermaid.core-D3iDEDQJ.js +0 -255
  261. package/ui-dist/assets/mindmap-definition-YRQLILUH-Cm-NQlLA.js +0 -68
  262. package/ui-dist/assets/pieDiagram-SKSYHLDU-BaDPvveA.js +0 -30
  263. package/ui-dist/assets/quadrantDiagram-337W2JSQ-0dX4kokb.js +0 -7
  264. package/ui-dist/assets/requirementDiagram-Z7DCOOCP-BdbJFOUK.js +0 -73
  265. package/ui-dist/assets/sankeyDiagram-WA2Y5GQK-ZMXNjh7n.js +0 -10
  266. package/ui-dist/assets/sequenceDiagram-2WXFIKYE-DfR6JqDW.js +0 -145
  267. package/ui-dist/assets/stateDiagram-RAJIS63D-BcGX6JIu.js +0 -1
  268. package/ui-dist/assets/stateDiagram-v2-FVOUBMTO-D1SMoFW3.js +0 -1
  269. package/ui-dist/assets/timeline-definition-YZTLITO2-DrIAH8-G.js +0 -61
  270. package/ui-dist/assets/treemap-KZPCXAKY-DEopGTtM.js +0 -162
  271. package/ui-dist/assets/vennDiagram-LZ73GAT5-CM3yysPE.js +0 -34
  272. package/ui-dist/assets/xychartDiagram-JWTSCODW-C34pUeNV.js +0 -7
@@ -20,13 +20,13 @@ export declare function boardAuthService(db: Db): {
20
20
  }>;
21
21
  findBoardApiKeyByToken: (token: string) => Promise<{
22
22
  id: string;
23
- createdAt: Date;
24
- revokedAt: Date | null;
23
+ userId: string;
25
24
  name: string;
26
- lastUsedAt: Date | null;
27
25
  keyHash: string;
26
+ lastUsedAt: Date | null;
27
+ revokedAt: Date | null;
28
28
  expiresAt: Date | null;
29
- userId: string;
29
+ createdAt: Date;
30
30
  } | null>;
31
31
  touchBoardApiKey: (id: string) => Promise<void>;
32
32
  revokeBoardApiKey: (id: string) => Promise<{
@@ -67,20 +67,20 @@ export declare function boardAuthService(db: Db): {
67
67
  }>;
68
68
  getCliAuthChallengeBySecret: (id: string, token: string) => Promise<{
69
69
  id: string;
70
- createdAt: Date;
71
- updatedAt: Date;
72
- cancelledAt: Date | null;
70
+ secretHash: string;
73
71
  command: string;
74
72
  clientName: string | null;
75
73
  requestedAccess: string;
76
74
  requestedCompanyId: string | null;
77
- expiresAt: Date;
78
- secretHash: string;
79
75
  pendingKeyHash: string;
80
76
  pendingKeyName: string;
81
77
  approvedByUserId: string | null;
82
78
  boardApiKeyId: string | null;
83
79
  approvedAt: Date | null;
80
+ cancelledAt: Date | null;
81
+ expiresAt: Date;
82
+ createdAt: Date;
83
+ updatedAt: Date;
84
84
  } | null>;
85
85
  describeCliAuthChallenge: (id: string, token: string) => Promise<{
86
86
  id: string;
@@ -103,39 +103,39 @@ export declare function boardAuthService(db: Db): {
103
103
  status: "expired";
104
104
  challenge: {
105
105
  id: string;
106
- createdAt: Date;
107
- updatedAt: Date;
108
- cancelledAt: Date | null;
106
+ secretHash: string;
109
107
  command: string;
110
108
  clientName: string | null;
111
109
  requestedAccess: string;
112
110
  requestedCompanyId: string | null;
113
- expiresAt: Date;
114
- secretHash: string;
115
111
  pendingKeyHash: string;
116
112
  pendingKeyName: string;
117
113
  approvedByUserId: string | null;
118
114
  boardApiKeyId: string | null;
119
115
  approvedAt: Date | null;
116
+ cancelledAt: Date | null;
117
+ expiresAt: Date;
118
+ createdAt: Date;
119
+ updatedAt: Date;
120
120
  };
121
121
  } | {
122
122
  status: "cancelled";
123
123
  challenge: {
124
124
  id: string;
125
- createdAt: Date;
126
- updatedAt: Date;
127
- cancelledAt: Date | null;
125
+ secretHash: string;
128
126
  command: string;
129
127
  clientName: string | null;
130
128
  requestedAccess: string;
131
129
  requestedCompanyId: string | null;
132
- expiresAt: Date;
133
- secretHash: string;
134
130
  pendingKeyHash: string;
135
131
  pendingKeyName: string;
136
132
  approvedByUserId: string | null;
137
133
  boardApiKeyId: string | null;
138
134
  approvedAt: Date | null;
135
+ cancelledAt: Date | null;
136
+ expiresAt: Date;
137
+ createdAt: Date;
138
+ updatedAt: Date;
139
139
  };
140
140
  } | {
141
141
  status: "approved";
@@ -161,69 +161,69 @@ export declare function boardAuthService(db: Db): {
161
161
  status: "approved";
162
162
  challenge: {
163
163
  id: string;
164
- createdAt: Date;
165
- updatedAt: Date;
166
- cancelledAt: Date | null;
164
+ secretHash: string;
167
165
  command: string;
168
166
  clientName: string | null;
169
167
  requestedAccess: string;
170
168
  requestedCompanyId: string | null;
171
- expiresAt: Date;
172
- secretHash: string;
173
169
  pendingKeyHash: string;
174
170
  pendingKeyName: string;
175
171
  approvedByUserId: string | null;
176
172
  boardApiKeyId: string | null;
177
173
  approvedAt: Date | null;
174
+ cancelledAt: Date | null;
175
+ expiresAt: Date;
176
+ createdAt: Date;
177
+ updatedAt: Date;
178
178
  };
179
179
  } | {
180
180
  status: "expired";
181
181
  challenge: {
182
182
  id: string;
183
- createdAt: Date;
184
- updatedAt: Date;
185
- cancelledAt: Date | null;
183
+ secretHash: string;
186
184
  command: string;
187
185
  clientName: string | null;
188
186
  requestedAccess: string;
189
187
  requestedCompanyId: string | null;
190
- expiresAt: Date;
191
- secretHash: string;
192
188
  pendingKeyHash: string;
193
189
  pendingKeyName: string;
194
190
  approvedByUserId: string | null;
195
191
  boardApiKeyId: string | null;
196
192
  approvedAt: Date | null;
193
+ cancelledAt: Date | null;
194
+ expiresAt: Date;
195
+ createdAt: Date;
196
+ updatedAt: Date;
197
197
  };
198
198
  } | {
199
199
  status: "cancelled";
200
200
  challenge: {
201
201
  id: string;
202
- createdAt: Date;
203
- updatedAt: Date;
204
- cancelledAt: Date | null;
202
+ secretHash: string;
205
203
  command: string;
206
204
  clientName: string | null;
207
205
  requestedAccess: string;
208
206
  requestedCompanyId: string | null;
209
- expiresAt: Date;
210
- secretHash: string;
211
207
  pendingKeyHash: string;
212
208
  pendingKeyName: string;
213
209
  approvedByUserId: string | null;
214
210
  boardApiKeyId: string | null;
215
211
  approvedAt: Date | null;
212
+ cancelledAt: Date | null;
213
+ expiresAt: Date;
214
+ createdAt: Date;
215
+ updatedAt: Date;
216
216
  };
217
217
  }>;
218
218
  assertCurrentBoardKey: (keyId: string | undefined, userId: string | undefined) => Promise<{
219
219
  id: string;
220
- createdAt: Date;
221
- revokedAt: Date | null;
220
+ userId: string;
222
221
  name: string;
223
- lastUsedAt: Date | null;
224
222
  keyHash: string;
223
+ lastUsedAt: Date | null;
224
+ revokedAt: Date | null;
225
225
  expiresAt: Date | null;
226
- userId: string;
226
+ createdAt: Date;
227
227
  }>;
228
228
  resolveBoardActivityCompanyIds: (input: {
229
229
  userId: string;
@@ -0,0 +1,43 @@
1
+ export declare const BROWSER_ACTIONS: readonly ["tabs", "open", "navigate", "read", "click", "type", "screenshot", "close"];
2
+ export type BrowserAction = typeof BROWSER_ACTIONS[number];
3
+ export type BrowserRuntimeIdentity = {
4
+ orgId: string;
5
+ agentId: string;
6
+ runId: string;
7
+ };
8
+ export type BrowserBrokerCommand = {
9
+ identity: BrowserRuntimeIdentity;
10
+ action: BrowserAction;
11
+ args: Record<string, unknown>;
12
+ };
13
+ type BrowserBrokerRegistration = {
14
+ endpoint: string;
15
+ token: string;
16
+ };
17
+ export declare class BrowserBrokerError extends Error {
18
+ readonly code: string;
19
+ constructor(code: string, message: string);
20
+ toJSON(): {
21
+ code: string;
22
+ message: string;
23
+ };
24
+ }
25
+ export type BrowserBrokerRegistry = ReturnType<typeof createBrowserBrokerRegistry>;
26
+ export declare function createBrowserBrokerRegistry(options?: {
27
+ fetchImpl?: typeof fetch;
28
+ requestTimeoutMs?: number;
29
+ maxResponseBytes?: number;
30
+ }): {
31
+ register(input: BrowserBrokerRegistration): void;
32
+ unregister(token: string): boolean;
33
+ isAvailable(): boolean;
34
+ forward(command: BrowserBrokerCommand): Promise<unknown>;
35
+ };
36
+ export declare const browserBrokerRegistry: {
37
+ register(input: BrowserBrokerRegistration): void;
38
+ unregister(token: string): boolean;
39
+ isAvailable(): boolean;
40
+ forward(command: BrowserBrokerCommand): Promise<unknown>;
41
+ };
42
+ export {};
43
+ //# sourceMappingURL=browser-broker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser-broker.d.ts","sourceRoot":"","sources":["../../src/services/browser-broker.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,eAAe,uFASlB,CAAC;AAEX,MAAM,MAAM,aAAa,GAAG,OAAO,eAAe,CAAC,MAAM,CAAC,CAAC;AAE3D,MAAM,MAAM,sBAAsB,GAAG;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,QAAQ,EAAE,sBAAsB,CAAC;IACjC,MAAM,EAAE,aAAa,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC/B,CAAC;AAEF,KAAK,yBAAyB,GAAG;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAWF,qBAAa,kBAAmB,SAAQ,KAAK;IAC3C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;gBAEV,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;IAKzC,MAAM;;;;CAGP;AA2ED,MAAM,MAAM,qBAAqB,GAAG,UAAU,CAAC,OAAO,2BAA2B,CAAC,CAAC;AAEnF,wBAAgB,2BAA2B,CAAC,OAAO,GAAE;IACnD,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IACzB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,gBAAgB,CAAC,EAAE,MAAM,CAAC;CACtB;oBAOc,yBAAyB,GAAG,IAAI;sBAO9B,MAAM,GAAG,OAAO;mBAMnB,OAAO;qBAIC,oBAAoB,GAAG,OAAO,CAAC,OAAO,CAAC;EAwDjE;AAED,eAAO,MAAM,qBAAqB;oBA3Ed,yBAAyB,GAAG,IAAI;sBAO9B,MAAM,GAAG,OAAO;mBAMnB,OAAO;qBAIC,oBAAoB,GAAG,OAAO,CAAC,OAAO,CAAC;CA0DA,CAAC"}
@@ -0,0 +1,173 @@
1
+ export const BROWSER_ACTIONS = [
2
+ "tabs",
3
+ "open",
4
+ "navigate",
5
+ "read",
6
+ "click",
7
+ "type",
8
+ "screenshot",
9
+ "close",
10
+ ];
11
+ // A 10 MB PNG expands to about 13.34 MB as Base64 before the JSON envelope.
12
+ const DEFAULT_BROWSER_BROKER_MAX_RESPONSE_BYTES = 16 * 1024 * 1024;
13
+ export class BrowserBrokerError extends Error {
14
+ code;
15
+ constructor(code, message) {
16
+ super(message);
17
+ this.code = code;
18
+ }
19
+ toJSON() {
20
+ return { code: this.code, message: this.message };
21
+ }
22
+ }
23
+ function normalizeLoopbackBrokerEndpoint(rawEndpoint) {
24
+ let endpoint;
25
+ try {
26
+ endpoint = new URL(rawEndpoint);
27
+ }
28
+ catch {
29
+ throw new BrowserBrokerError("browser_broker_invalid_registration", "Browser Broker endpoint must be a valid loopback HTTP URL.");
30
+ }
31
+ const hostname = endpoint.hostname.toLowerCase().replace(/^\[|\]$/g, "");
32
+ if (endpoint.protocol !== "http:" || (hostname !== "127.0.0.1" && hostname !== "::1")) {
33
+ throw new BrowserBrokerError("browser_broker_invalid_registration", "Browser Broker endpoint must use loopback HTTP.");
34
+ }
35
+ if (!endpoint.port) {
36
+ throw new BrowserBrokerError("browser_broker_invalid_registration", "Browser Broker endpoint must use an explicit loopback port.");
37
+ }
38
+ if (endpoint.username || endpoint.password || endpoint.search || endpoint.hash) {
39
+ throw new BrowserBrokerError("browser_broker_invalid_registration", "Browser Broker endpoint cannot contain credentials, query parameters, or a fragment.");
40
+ }
41
+ return endpoint.toString();
42
+ }
43
+ function normalizeBrokerCredential(rawToken) {
44
+ const token = rawToken.trim();
45
+ if (token.length < 32 || token.length > 512 || /\s/.test(token)) {
46
+ throw new BrowserBrokerError("browser_broker_invalid_registration", "Browser Broker credential is invalid.");
47
+ }
48
+ return token;
49
+ }
50
+ function isRecord(value) {
51
+ return typeof value === "object" && value !== null && !Array.isArray(value);
52
+ }
53
+ function sanitizedBrokerFailure(payload, fallbackCode, fallbackMessage) {
54
+ const error = isRecord(payload.error) ? payload.error : {};
55
+ const code = typeof error.code === "string" && /^browser_[a-z0-9_]+$/.test(error.code)
56
+ ? error.code
57
+ : fallbackCode;
58
+ const message = typeof error.message === "string" && error.message.trim()
59
+ ? error.message.trim().slice(0, 300)
60
+ : fallbackMessage;
61
+ return new BrowserBrokerError(code, message);
62
+ }
63
+ async function readBoundedResponseBody(response, maxBytes) {
64
+ const declaredLength = Number.parseInt(response.headers.get("content-length") ?? "", 10);
65
+ if (Number.isFinite(declaredLength) && declaredLength > maxBytes) {
66
+ throw new BrowserBrokerError("browser_broker_protocol_error", "Rudder Browser Desktop Broker response exceeded the size limit.");
67
+ }
68
+ if (!response.body)
69
+ return "";
70
+ const reader = response.body.getReader();
71
+ const decoder = new TextDecoder();
72
+ const parts = [];
73
+ let byteLength = 0;
74
+ try {
75
+ while (true) {
76
+ const { done, value } = await reader.read();
77
+ if (done)
78
+ break;
79
+ byteLength += value.byteLength;
80
+ if (byteLength > maxBytes) {
81
+ await reader.cancel().catch(() => undefined);
82
+ throw new BrowserBrokerError("browser_broker_protocol_error", "Rudder Browser Desktop Broker response exceeded the size limit.");
83
+ }
84
+ parts.push(decoder.decode(value, { stream: true }));
85
+ }
86
+ parts.push(decoder.decode());
87
+ return parts.join("");
88
+ }
89
+ finally {
90
+ reader.releaseLock();
91
+ }
92
+ }
93
+ export function createBrowserBrokerRegistry(options = {}) {
94
+ const fetchImpl = options.fetchImpl ?? globalThis.fetch;
95
+ const requestTimeoutMs = options.requestTimeoutMs ?? 15_000;
96
+ const maxResponseBytes = options.maxResponseBytes ?? DEFAULT_BROWSER_BROKER_MAX_RESPONSE_BYTES;
97
+ let registration = null;
98
+ return {
99
+ register(input) {
100
+ registration = {
101
+ endpoint: normalizeLoopbackBrokerEndpoint(input.endpoint),
102
+ token: normalizeBrokerCredential(input.token),
103
+ };
104
+ },
105
+ unregister(token) {
106
+ if (!registration || registration.token !== token)
107
+ return false;
108
+ registration = null;
109
+ return true;
110
+ },
111
+ isAvailable() {
112
+ return registration !== null;
113
+ },
114
+ async forward(command) {
115
+ const current = registration;
116
+ if (!current) {
117
+ throw new BrowserBrokerError("browser_unavailable", "Rudder Browser is unavailable because Desktop is not connected.");
118
+ }
119
+ const controller = new AbortController();
120
+ let timeout = null;
121
+ const deadline = new Promise((_resolve, reject) => {
122
+ timeout = setTimeout(() => {
123
+ controller.abort();
124
+ reject(new BrowserBrokerError("browser_unavailable", "Rudder Browser Desktop Broker timed out."));
125
+ }, requestTimeoutMs);
126
+ });
127
+ const request = async () => {
128
+ let response;
129
+ try {
130
+ response = await fetchImpl(current.endpoint, {
131
+ method: "POST",
132
+ redirect: "error",
133
+ headers: {
134
+ accept: "application/json",
135
+ authorization: `Bearer ${current.token}`,
136
+ "content-type": "application/json",
137
+ },
138
+ body: JSON.stringify(command),
139
+ signal: controller.signal,
140
+ });
141
+ }
142
+ catch {
143
+ throw new BrowserBrokerError("browser_unavailable", "Rudder Browser Desktop Broker could not be reached.");
144
+ }
145
+ let payload;
146
+ try {
147
+ payload = JSON.parse(await readBoundedResponseBody(response, maxResponseBytes));
148
+ }
149
+ catch (error) {
150
+ if (error instanceof BrowserBrokerError)
151
+ throw error;
152
+ if (controller.signal.aborted) {
153
+ throw new BrowserBrokerError("browser_unavailable", "Rudder Browser Desktop Broker timed out.");
154
+ }
155
+ throw new BrowserBrokerError("browser_broker_protocol_error", "Rudder Browser Desktop Broker returned an invalid response.");
156
+ }
157
+ if (!response.ok || payload.ok !== true) {
158
+ throw sanitizedBrokerFailure(payload, "browser_broker_error", "Rudder Browser action failed.");
159
+ }
160
+ return payload.result ?? {};
161
+ };
162
+ try {
163
+ return await Promise.race([request(), deadline]);
164
+ }
165
+ finally {
166
+ if (timeout)
167
+ clearTimeout(timeout);
168
+ }
169
+ },
170
+ };
171
+ }
172
+ export const browserBrokerRegistry = createBrowserBrokerRegistry();
173
+ //# sourceMappingURL=browser-broker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser-broker.js","sourceRoot":"","sources":["../../src/services/browser-broker.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,MAAM;IACN,MAAM;IACN,UAAU;IACV,MAAM;IACN,OAAO;IACP,MAAM;IACN,YAAY;IACZ,OAAO;CACC,CAAC;AA2BX,4EAA4E;AAC5E,MAAM,yCAAyC,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;AAEnE,MAAM,OAAO,kBAAmB,SAAQ,KAAK;IAClC,IAAI,CAAS;IAEtB,YAAY,IAAY,EAAE,OAAe;QACvC,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;IAED,MAAM;QACJ,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC;IACpD,CAAC;CACF;AAED,SAAS,+BAA+B,CAAC,WAAmB;IAC1D,IAAI,QAAa,CAAC;IAClB,IAAI,CAAC;QACH,QAAQ,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,CAAC;IAClC,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,kBAAkB,CAAC,qCAAqC,EAAE,4DAA4D,CAAC,CAAC;IACpI,CAAC;IAED,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;IACzE,IAAI,QAAQ,CAAC,QAAQ,KAAK,OAAO,IAAI,CAAC,QAAQ,KAAK,WAAW,IAAI,QAAQ,KAAK,KAAK,CAAC,EAAE,CAAC;QACtF,MAAM,IAAI,kBAAkB,CAAC,qCAAqC,EAAE,iDAAiD,CAAC,CAAC;IACzH,CAAC;IACD,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;QACnB,MAAM,IAAI,kBAAkB,CAAC,qCAAqC,EAAE,6DAA6D,CAAC,CAAC;IACrI,CAAC;IACD,IAAI,QAAQ,CAAC,QAAQ,IAAI,QAAQ,CAAC,QAAQ,IAAI,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC;QAC/E,MAAM,IAAI,kBAAkB,CAAC,qCAAqC,EAAE,sFAAsF,CAAC,CAAC;IAC9J,CAAC;IACD,OAAO,QAAQ,CAAC,QAAQ,EAAE,CAAC;AAC7B,CAAC;AAED,SAAS,yBAAyB,CAAC,QAAgB;IACjD,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC;IAC9B,IAAI,KAAK,CAAC,MAAM,GAAG,EAAE,IAAI,KAAK,CAAC,MAAM,GAAG,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAChE,MAAM,IAAI,kBAAkB,CAAC,qCAAqC,EAAE,uCAAuC,CAAC,CAAC;IAC/G,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC;AAED,SAAS,sBAAsB,CAAC,OAA8B,EAAE,YAAoB,EAAE,eAAuB;IAC3G,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;IAC3D,MAAM,IAAI,GAAG,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,sBAAsB,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;QACpF,CAAC,CAAC,KAAK,CAAC,IAAI;QACZ,CAAC,CAAC,YAAY,CAAC;IACjB,MAAM,OAAO,GAAG,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE;QACvE,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;QACpC,CAAC,CAAC,eAAe,CAAC;IACpB,OAAO,IAAI,kBAAkB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AAC/C,CAAC;AAED,KAAK,UAAU,uBAAuB,CAAC,QAAkB,EAAE,QAAgB;IACzE,MAAM,cAAc,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;IACzF,IAAI,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,cAAc,GAAG,QAAQ,EAAE,CAAC;QACjE,MAAM,IAAI,kBAAkB,CAAC,+BAA+B,EAAE,iEAAiE,CAAC,CAAC;IACnI,CAAC;IAED,IAAI,CAAC,QAAQ,CAAC,IAAI;QAAE,OAAO,EAAE,CAAC;IAC9B,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;IACzC,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;IAClC,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,IAAI,CAAC;QACH,OAAO,IAAI,EAAE,CAAC;YACZ,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;YAC5C,IAAI,IAAI;gBAAE,MAAM;YAChB,UAAU,IAAI,KAAK,CAAC,UAAU,CAAC;YAC/B,IAAI,UAAU,GAAG,QAAQ,EAAE,CAAC;gBAC1B,MAAM,MAAM,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;gBAC7C,MAAM,IAAI,kBAAkB,CAAC,+BAA+B,EAAE,iEAAiE,CAAC,CAAC;YACnI,CAAC;YACD,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QACtD,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;QAC7B,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACxB,CAAC;YAAS,CAAC;QACT,MAAM,CAAC,WAAW,EAAE,CAAC;IACvB,CAAC;AACH,CAAC;AAID,MAAM,UAAU,2BAA2B,CAAC,UAIxC,EAAE;IACJ,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,UAAU,CAAC,KAAK,CAAC;IACxD,MAAM,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,IAAI,MAAM,CAAC;IAC5D,MAAM,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,IAAI,yCAAyC,CAAC;IAC/F,IAAI,YAAY,GAAqC,IAAI,CAAC;IAE1D,OAAO;QACL,QAAQ,CAAC,KAAgC;YACvC,YAAY,GAAG;gBACb,QAAQ,EAAE,+BAA+B,CAAC,KAAK,CAAC,QAAQ,CAAC;gBACzD,KAAK,EAAE,yBAAyB,CAAC,KAAK,CAAC,KAAK,CAAC;aAC9C,CAAC;QACJ,CAAC;QAED,UAAU,CAAC,KAAa;YACtB,IAAI,CAAC,YAAY,IAAI,YAAY,CAAC,KAAK,KAAK,KAAK;gBAAE,OAAO,KAAK,CAAC;YAChE,YAAY,GAAG,IAAI,CAAC;YACpB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,WAAW;YACT,OAAO,YAAY,KAAK,IAAI,CAAC;QAC/B,CAAC;QAED,KAAK,CAAC,OAAO,CAAC,OAA6B;YACzC,MAAM,OAAO,GAAG,YAAY,CAAC;YAC7B,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,MAAM,IAAI,kBAAkB,CAAC,qBAAqB,EAAE,iEAAiE,CAAC,CAAC;YACzH,CAAC;YAED,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;YACzC,IAAI,OAAO,GAA0B,IAAI,CAAC;YAC1C,MAAM,QAAQ,GAAG,IAAI,OAAO,CAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE;gBACvD,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE;oBACxB,UAAU,CAAC,KAAK,EAAE,CAAC;oBACnB,MAAM,CAAC,IAAI,kBAAkB,CAAC,qBAAqB,EAAE,0CAA0C,CAAC,CAAC,CAAC;gBACpG,CAAC,EAAE,gBAAgB,CAAC,CAAC;YACvB,CAAC,CAAC,CAAC;YACH,MAAM,OAAO,GAAG,KAAK,IAAI,EAAE;gBACzB,IAAI,QAAkB,CAAC;gBACvB,IAAI,CAAC;oBACH,QAAQ,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC,QAAQ,EAAE;wBAC3C,MAAM,EAAE,MAAM;wBACd,QAAQ,EAAE,OAAO;wBACjB,OAAO,EAAE;4BACP,MAAM,EAAE,kBAAkB;4BAC1B,aAAa,EAAE,UAAU,OAAO,CAAC,KAAK,EAAE;4BACxC,cAAc,EAAE,kBAAkB;yBACnC;wBACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;wBAC7B,MAAM,EAAE,UAAU,CAAC,MAAM;qBAC1B,CAAC,CAAC;gBACL,CAAC;gBAAC,MAAM,CAAC;oBACP,MAAM,IAAI,kBAAkB,CAAC,qBAAqB,EAAE,qDAAqD,CAAC,CAAC;gBAC7G,CAAC;gBAED,IAAI,OAA8B,CAAC;gBACnC,IAAI,CAAC;oBACH,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,uBAAuB,CAAC,QAAQ,EAAE,gBAAgB,CAAC,CAA0B,CAAC;gBAC3G,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,IAAI,KAAK,YAAY,kBAAkB;wBAAE,MAAM,KAAK,CAAC;oBACrD,IAAI,UAAU,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;wBAC9B,MAAM,IAAI,kBAAkB,CAAC,qBAAqB,EAAE,0CAA0C,CAAC,CAAC;oBAClG,CAAC;oBACD,MAAM,IAAI,kBAAkB,CAAC,+BAA+B,EAAE,6DAA6D,CAAC,CAAC;gBAC/H,CAAC;gBAED,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI,OAAO,CAAC,EAAE,KAAK,IAAI,EAAE,CAAC;oBACxC,MAAM,sBAAsB,CAAC,OAAO,EAAE,sBAAsB,EAAE,+BAA+B,CAAC,CAAC;gBACjG,CAAC;gBACD,OAAO,OAAO,CAAC,MAAM,IAAI,EAAE,CAAC;YAC9B,CAAC,CAAC;YAEF,IAAI,CAAC;gBACH,OAAO,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,QAAQ,CAAC,CAAC,CAAC;YACnD,CAAC;oBAAS,CAAC;gBACT,IAAI,OAAO;oBAAE,YAAY,CAAC,OAAO,CAAC,CAAC;YACrC,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,qBAAqB,GAAG,2BAA2B,EAAE,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=browser-broker.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser-broker.test.d.ts","sourceRoot":"","sources":["../../src/services/browser-broker.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,154 @@
1
+ import { describe, expect, it, vi } from "vitest";
2
+ import { createBrowserBrokerRegistry, } from "./browser-broker.js";
3
+ describe("Browser Broker registry", () => {
4
+ it("accepts only credentialed loopback HTTP endpoints", () => {
5
+ const registry = createBrowserBrokerRegistry();
6
+ expect(() => registry.register({
7
+ endpoint: "https://127.0.0.1:4141/browser",
8
+ token: "a".repeat(48),
9
+ })).toThrow("loopback HTTP");
10
+ expect(() => registry.register({
11
+ endpoint: "http://example.com:4141/browser",
12
+ token: "a".repeat(48),
13
+ })).toThrow("loopback HTTP");
14
+ expect(() => registry.register({
15
+ endpoint: "http://127.0.0.1:4141/browser?token=leak",
16
+ token: "a".repeat(48),
17
+ })).toThrow("query");
18
+ expect(() => registry.register({
19
+ endpoint: "http://127.0.0.1:4141/browser",
20
+ token: "short",
21
+ })).toThrow("credential");
22
+ registry.register({
23
+ endpoint: "http://127.0.0.1:4141/browser",
24
+ token: "a".repeat(48),
25
+ });
26
+ expect(registry.isAvailable()).toBe(true);
27
+ });
28
+ it("forwards runtime-owned identity with an in-memory bearer credential", async () => {
29
+ const fetchImpl = vi.fn(async (_url, init) => new Response(JSON.stringify({
30
+ ok: true,
31
+ result: { tabId: "tab-1", url: "https://example.com/" },
32
+ }), {
33
+ status: 200,
34
+ headers: { "content-type": "application/json" },
35
+ }));
36
+ const registry = createBrowserBrokerRegistry({ fetchImpl });
37
+ const token = "b".repeat(48);
38
+ registry.register({ endpoint: "http://[::1]:4242/browser", token });
39
+ await expect(registry.forward({
40
+ identity: { orgId: "org-1", agentId: "agent-1", runId: "run-1" },
41
+ action: "open",
42
+ args: { url: "https://example.com" },
43
+ })).resolves.toEqual({ tabId: "tab-1", url: "https://example.com/" });
44
+ expect(fetchImpl).toHaveBeenCalledTimes(1);
45
+ const [url, init] = fetchImpl.mock.calls[0];
46
+ expect(String(url)).toBe("http://[::1]:4242/browser");
47
+ expect(init?.method).toBe("POST");
48
+ expect(init?.redirect).toBe("error");
49
+ expect(new Headers(init?.headers).get("authorization")).toBe(`Bearer ${token}`);
50
+ expect(JSON.parse(String(init?.body))).toEqual({
51
+ identity: { orgId: "org-1", agentId: "agent-1", runId: "run-1" },
52
+ action: "open",
53
+ args: { url: "https://example.com" },
54
+ });
55
+ });
56
+ it("returns stable unavailable and broker error codes without leaking response bodies", async () => {
57
+ const registry = createBrowserBrokerRegistry({
58
+ fetchImpl: vi.fn(async () => new Response(JSON.stringify({
59
+ ok: false,
60
+ error: {
61
+ code: "browser_tab_forbidden",
62
+ message: "This tab belongs to another run.",
63
+ secret: "must-not-escape",
64
+ },
65
+ }), { status: 403, headers: { "content-type": "application/json" } })),
66
+ });
67
+ await expect(registry.forward({
68
+ identity: { orgId: "org-1", agentId: "agent-1", runId: "run-1" },
69
+ action: "tabs",
70
+ args: {},
71
+ })).rejects.toMatchObject({ code: "browser_unavailable" });
72
+ registry.register({ endpoint: "http://127.0.0.1:4141/browser", token: "c".repeat(48) });
73
+ await expect(registry.forward({
74
+ identity: { orgId: "org-1", agentId: "agent-1", runId: "run-1" },
75
+ action: "navigate",
76
+ args: { tabId: "tab-other", url: "https://example.com" },
77
+ })).rejects.toEqual(expect.objectContaining({
78
+ code: "browser_tab_forbidden",
79
+ message: "This tab belongs to another run.",
80
+ }));
81
+ try {
82
+ await registry.forward({
83
+ identity: { orgId: "org-1", agentId: "agent-1", runId: "run-1" },
84
+ action: "tabs",
85
+ args: {},
86
+ });
87
+ }
88
+ catch (error) {
89
+ expect(JSON.stringify(error)).not.toContain("must-not-escape");
90
+ }
91
+ });
92
+ it("keeps the request deadline active while reading a slow response body", async () => {
93
+ const registry = createBrowserBrokerRegistry({
94
+ requestTimeoutMs: 20,
95
+ fetchImpl: vi.fn(async () => new Response(new ReadableStream({
96
+ start(controller) {
97
+ controller.enqueue(new TextEncoder().encode('{"ok":true,"result":'));
98
+ },
99
+ }), { status: 200, headers: { "content-type": "application/json" } })),
100
+ });
101
+ registry.register({ endpoint: "http://127.0.0.1:4141/browser", token: "f".repeat(48) });
102
+ await expect(registry.forward({
103
+ identity: { orgId: "org-1", agentId: "agent-1", runId: "run-1" },
104
+ action: "tabs",
105
+ args: {},
106
+ })).rejects.toMatchObject({ code: "browser_unavailable" });
107
+ });
108
+ it("rejects oversized Broker responses before parsing or returning page data", async () => {
109
+ const registry = createBrowserBrokerRegistry({
110
+ maxResponseBytes: 64,
111
+ fetchImpl: vi.fn(async () => new Response(JSON.stringify({
112
+ ok: true,
113
+ result: { text: "secret".repeat(100) },
114
+ }), { status: 200, headers: { "content-type": "application/json" } })),
115
+ });
116
+ registry.register({ endpoint: "http://127.0.0.1:4141/browser", token: "g".repeat(48) });
117
+ await expect(registry.forward({
118
+ identity: { orgId: "org-1", agentId: "agent-1", runId: "run-1" },
119
+ action: "read",
120
+ args: { tabId: "tab-1" },
121
+ })).rejects.toMatchObject({ code: "browser_broker_protocol_error" });
122
+ });
123
+ it("accepts the Base64 envelope for a screenshot at the Desktop PNG limit", async () => {
124
+ const encodedScreenshot = "A".repeat(Math.ceil(10_000_000 / 3) * 4);
125
+ const registry = createBrowserBrokerRegistry({
126
+ fetchImpl: vi.fn(async () => new Response(JSON.stringify({
127
+ ok: true,
128
+ result: { tabId: "tab-1", mimeType: "image/png", base64: encodedScreenshot },
129
+ }), { status: 200, headers: { "content-type": "application/json" } })),
130
+ });
131
+ registry.register({ endpoint: "http://127.0.0.1:4141/browser", token: "h".repeat(48) });
132
+ const result = await registry.forward({
133
+ identity: { orgId: "org-1", agentId: "agent-1", runId: "run-1" },
134
+ action: "screenshot",
135
+ args: { tabId: "tab-1" },
136
+ });
137
+ expect(result).toMatchObject({ tabId: "tab-1", mimeType: "image/png" });
138
+ expect(result.base64).toHaveLength(encodedScreenshot.length);
139
+ expect(result.base64.at(0)).toBe("A");
140
+ expect(result.base64.at(-1)).toBe("A");
141
+ });
142
+ it("does not let a stale Desktop credential unregister a replacement Broker", () => {
143
+ const registry = createBrowserBrokerRegistry();
144
+ const first = "d".repeat(48);
145
+ const replacement = "e".repeat(48);
146
+ registry.register({ endpoint: "http://127.0.0.1:4141/browser", token: first });
147
+ registry.register({ endpoint: "http://127.0.0.1:4242/browser", token: replacement });
148
+ expect(registry.unregister(first)).toBe(false);
149
+ expect(registry.isAvailable()).toBe(true);
150
+ expect(registry.unregister(replacement)).toBe(true);
151
+ expect(registry.isAvailable()).toBe(false);
152
+ });
153
+ });
154
+ //# sourceMappingURL=browser-broker.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser-broker.test.js","sourceRoot":"","sources":["../../src/services/browser-broker.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAClD,OAAO,EAEL,2BAA2B,GAC5B,MAAM,qBAAqB,CAAC;AAE7B,QAAQ,CAAC,yBAAyB,EAAE,GAAG,EAAE;IACvC,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;QAC3D,MAAM,QAAQ,GAAG,2BAA2B,EAAE,CAAC;QAE/C,MAAM,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC;YAC7B,QAAQ,EAAE,gCAAgC;YAC1C,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;SACtB,CAAC,CAAC,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;QAC7B,MAAM,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC;YAC7B,QAAQ,EAAE,iCAAiC;YAC3C,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;SACtB,CAAC,CAAC,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;QAC7B,MAAM,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC;YAC7B,QAAQ,EAAE,0CAA0C;YACpD,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;SACtB,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACrB,MAAM,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC;YAC7B,QAAQ,EAAE,+BAA+B;YACzC,KAAK,EAAE,OAAO;SACf,CAAC,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;QAE1B,QAAQ,CAAC,QAAQ,CAAC;YAChB,QAAQ,EAAE,+BAA+B;YACzC,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;SACtB,CAAC,CAAC;QACH,MAAM,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qEAAqE,EAAE,KAAK,IAAI,EAAE;QACnF,MAAM,SAAS,GAAG,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,IAA4B,EAAE,IAAkB,EAAE,EAAE,CAAC,IAAI,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC;YAC9G,EAAE,EAAE,IAAI;YACR,MAAM,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,sBAAsB,EAAE;SACxD,CAAC,EAAE;YACF,MAAM,EAAE,GAAG;YACX,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;SAChD,CAAC,CAAC,CAAC;QACJ,MAAM,QAAQ,GAAG,2BAA2B,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC;QAC5D,MAAM,KAAK,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAC7B,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,EAAE,2BAA2B,EAAE,KAAK,EAAE,CAAC,CAAC;QAEpE,MAAM,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC;YAC5B,QAAQ,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE;YAChE,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,EAAE,GAAG,EAAE,qBAAqB,EAAE;SACrC,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,sBAAsB,EAAE,CAAC,CAAC;QAEtE,MAAM,CAAC,SAAS,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QAC3C,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC;QAC7C,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;QACtD,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAClC,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACrC,MAAM,CAAC,IAAI,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,KAAK,EAAE,CAAC,CAAC;QAChF,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;YAC7C,QAAQ,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE;YAChE,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,EAAE,GAAG,EAAE,qBAAqB,EAAE;SACrC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mFAAmF,EAAE,KAAK,IAAI,EAAE;QACjG,MAAM,QAAQ,GAAG,2BAA2B,CAAC;YAC3C,SAAS,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,IAAI,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC;gBACvD,EAAE,EAAE,KAAK;gBACT,KAAK,EAAE;oBACL,IAAI,EAAE,uBAAuB;oBAC7B,OAAO,EAAE,kCAAkC;oBAC3C,MAAM,EAAE,iBAAiB;iBAC1B;aACF,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,EAAE,CAAC,CAAC;SACvE,CAAC,CAAC;QAEH,MAAM,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC;YAC5B,QAAQ,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE;YAChE,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,EAAE;SACT,CAAC,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,IAAI,EAAE,qBAAqB,EAAwC,CAAC,CAAC;QAEjG,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,EAAE,+BAA+B,EAAE,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QACxF,MAAM,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC;YAC5B,QAAQ,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE;YAChE,MAAM,EAAE,UAAU;YAClB,IAAI,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,GAAG,EAAE,qBAAqB,EAAE;SACzD,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,gBAAgB,CAAC;YAC1C,IAAI,EAAE,uBAAuB;YAC7B,OAAO,EAAE,kCAAkC;SAC5C,CAAC,CAAC,CAAC;QAEJ,IAAI,CAAC;YACH,MAAM,QAAQ,CAAC,OAAO,CAAC;gBACrB,QAAQ,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE;gBAChE,MAAM,EAAE,MAAM;gBACd,IAAI,EAAE,EAAE;aACT,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;QACjE,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sEAAsE,EAAE,KAAK,IAAI,EAAE;QACpF,MAAM,QAAQ,GAAG,2BAA2B,CAAC;YAC3C,gBAAgB,EAAE,EAAE;YACpB,SAAS,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,IAAI,QAAQ,CAAC,IAAI,cAAc,CAAa;gBACvE,KAAK,CAAC,UAAU;oBACd,UAAU,CAAC,OAAO,CAAC,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,sBAAsB,CAAC,CAAC,CAAC;gBACvE,CAAC;aACF,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,EAAE,CAAC,CAAC;SACvE,CAAC,CAAC;QACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,EAAE,+BAA+B,EAAE,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QAExF,MAAM,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC;YAC5B,QAAQ,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE;YAChE,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,EAAE;SACT,CAAC,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,IAAI,EAAE,qBAAqB,EAAwC,CAAC,CAAC;IACnG,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0EAA0E,EAAE,KAAK,IAAI,EAAE;QACxF,MAAM,QAAQ,GAAG,2BAA2B,CAAC;YAC3C,gBAAgB,EAAE,EAAE;YACpB,SAAS,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,IAAI,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC;gBACvD,EAAE,EAAE,IAAI;gBACR,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE;aACvC,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,EAAE,CAAC,CAAC;SACvE,CAAC,CAAC;QACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,EAAE,+BAA+B,EAAE,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QAExF,MAAM,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC;YAC5B,QAAQ,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE;YAChE,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE;SACzB,CAAC,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,IAAI,EAAE,+BAA+B,EAAwC,CAAC,CAAC;IAC7G,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uEAAuE,EAAE,KAAK,IAAI,EAAE;QACrF,MAAM,iBAAiB,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACpE,MAAM,QAAQ,GAAG,2BAA2B,CAAC;YAC3C,SAAS,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,IAAI,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC;gBACvD,EAAE,EAAE,IAAI;gBACR,MAAM,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,EAAE,iBAAiB,EAAE;aAC7E,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,EAAE,CAAC,CAAC;SACvE,CAAC,CAAC;QACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,EAAE,+BAA+B,EAAE,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QAExF,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC;YACpC,QAAQ,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE;YAChE,MAAM,EAAE,YAAY;YACpB,IAAI,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE;SACzB,CAAwD,CAAC;QAC1D,MAAM,CAAC,MAAM,CAAC,CAAC,aAAa,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC,CAAC;QACxE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;QAC7D,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACtC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yEAAyE,EAAE,GAAG,EAAE;QACjF,MAAM,QAAQ,GAAG,2BAA2B,EAAE,CAAC;QAC/C,MAAM,KAAK,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAC7B,MAAM,WAAW,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACnC,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,EAAE,+BAA+B,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;QAC/E,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,EAAE,+BAA+B,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC;QAErF,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC/C,MAAM,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1C,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpD,MAAM,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,20 @@
1
+ import type { Db } from "@rudderhq/db";
2
+ import type { DeploymentMode } from "@rudderhq/shared";
3
+ export declare const BROWSER_BUNDLED_SKILL_SELECTION_KEY = "bundled:rudder/browser";
4
+ export declare const SUPPORTED_BROWSER_RUNTIME_TYPES: readonly ["claude_local", "codex_local", "opencode_local", "pi_local"];
5
+ export type BrowserCapabilityServiceOptions = {
6
+ deploymentMode?: DeploymentMode;
7
+ };
8
+ export declare function configureBrowserCapabilityDeployment(db: Db, deploymentMode: DeploymentMode): void;
9
+ export declare function resolveBrowserCapabilityDeployment(db: Db, override?: DeploymentMode): DeploymentMode;
10
+ export declare function isSupportedBrowserRuntimeType(agentRuntimeType: string | null | undefined): boolean;
11
+ export declare function isBrowserSkillSelectionKey(value: unknown): value is "bundled:rudder/browser" | "rudder/browser";
12
+ export declare function resolveBrowserCapability(input: {
13
+ deploymentMode: DeploymentMode;
14
+ browserEnabled: boolean;
15
+ agentRuntimeType?: string | null;
16
+ }): {
17
+ instanceEligible: boolean;
18
+ runEligible: boolean;
19
+ };
20
+ //# sourceMappingURL=browser-capability.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser-capability.d.ts","sourceRoot":"","sources":["../../src/services/browser-capability.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAEvD,eAAO,MAAM,mCAAmC,2BAA2B,CAAC;AAE5E,eAAO,MAAM,+BAA+B,wEAKlC,CAAC;AAKX,MAAM,MAAM,+BAA+B,GAAG;IAC5C,cAAc,CAAC,EAAE,cAAc,CAAC;CACjC,CAAC;AAEF,wBAAgB,oCAAoC,CAAC,EAAE,EAAE,EAAE,EAAE,cAAc,EAAE,cAAc,QAE1F;AAED,wBAAgB,kCAAkC,CAChD,EAAE,EAAE,EAAE,EACN,QAAQ,CAAC,EAAE,cAAc,GACxB,cAAc,CAEhB;AAED,wBAAgB,6BAA6B,CAAC,gBAAgB,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,WAExF;AAED,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,OAAO,wDAExD;AAED,wBAAgB,wBAAwB,CAAC,KAAK,EAAE;IAC9C,cAAc,EAAE,cAAc,CAAC;IAC/B,cAAc,EAAE,OAAO,CAAC;IACxB,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAClC;;;EAMA"}
@@ -0,0 +1,29 @@
1
+ export const BROWSER_BUNDLED_SKILL_SELECTION_KEY = "bundled:rudder/browser";
2
+ export const SUPPORTED_BROWSER_RUNTIME_TYPES = [
3
+ "claude_local",
4
+ "codex_local",
5
+ "opencode_local",
6
+ "pi_local",
7
+ ];
8
+ const supportedBrowserRuntimeTypes = new Set(SUPPORTED_BROWSER_RUNTIME_TYPES);
9
+ const deploymentModesByDb = new WeakMap();
10
+ export function configureBrowserCapabilityDeployment(db, deploymentMode) {
11
+ deploymentModesByDb.set(db, deploymentMode);
12
+ }
13
+ export function resolveBrowserCapabilityDeployment(db, override) {
14
+ return override ?? deploymentModesByDb.get(db) ?? "authenticated";
15
+ }
16
+ export function isSupportedBrowserRuntimeType(agentRuntimeType) {
17
+ return Boolean(agentRuntimeType && supportedBrowserRuntimeTypes.has(agentRuntimeType));
18
+ }
19
+ export function isBrowserSkillSelectionKey(value) {
20
+ return value === BROWSER_BUNDLED_SKILL_SELECTION_KEY || value === "rudder/browser";
21
+ }
22
+ export function resolveBrowserCapability(input) {
23
+ const instanceEligible = input.deploymentMode === "local_trusted" && input.browserEnabled;
24
+ return {
25
+ instanceEligible,
26
+ runEligible: instanceEligible && isSupportedBrowserRuntimeType(input.agentRuntimeType),
27
+ };
28
+ }
29
+ //# sourceMappingURL=browser-capability.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser-capability.js","sourceRoot":"","sources":["../../src/services/browser-capability.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,MAAM,mCAAmC,GAAG,wBAAwB,CAAC;AAE5E,MAAM,CAAC,MAAM,+BAA+B,GAAG;IAC7C,cAAc;IACd,aAAa;IACb,gBAAgB;IAChB,UAAU;CACF,CAAC;AAEX,MAAM,4BAA4B,GAAG,IAAI,GAAG,CAAS,+BAA+B,CAAC,CAAC;AACtF,MAAM,mBAAmB,GAAG,IAAI,OAAO,EAA0B,CAAC;AAMlE,MAAM,UAAU,oCAAoC,CAAC,EAAM,EAAE,cAA8B;IACzF,mBAAmB,CAAC,GAAG,CAAC,EAAY,EAAE,cAAc,CAAC,CAAC;AACxD,CAAC;AAED,MAAM,UAAU,kCAAkC,CAChD,EAAM,EACN,QAAyB;IAEzB,OAAO,QAAQ,IAAI,mBAAmB,CAAC,GAAG,CAAC,EAAY,CAAC,IAAI,eAAe,CAAC;AAC9E,CAAC;AAED,MAAM,UAAU,6BAA6B,CAAC,gBAA2C;IACvF,OAAO,OAAO,CAAC,gBAAgB,IAAI,4BAA4B,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC;AACzF,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,KAAc;IACvD,OAAO,KAAK,KAAK,mCAAmC,IAAI,KAAK,KAAK,gBAAgB,CAAC;AACrF,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,KAIxC;IACC,MAAM,gBAAgB,GAAG,KAAK,CAAC,cAAc,KAAK,eAAe,IAAI,KAAK,CAAC,cAAc,CAAC;IAC1F,OAAO;QACL,gBAAgB;QAChB,WAAW,EAAE,gBAAgB,IAAI,6BAA6B,CAAC,KAAK,CAAC,gBAAgB,CAAC;KACvF,CAAC;AACJ,CAAC"}