@hotmeshio/long-tail 0.23.2 → 0.24.1

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 (499) hide show
  1. package/build/adapters/express.d.ts +11 -1
  2. package/build/adapters/express.js +42 -41
  3. package/build/api/auth-sso.d.ts +1 -1
  4. package/build/api/bot-accounts.d.ts +2 -0
  5. package/build/api/bot-accounts.js +4 -0
  6. package/build/api/capabilities.d.ts +7 -2
  7. package/build/api/capabilities.js +13 -2
  8. package/build/api/escalations/analytics.js +5 -0
  9. package/build/api/escalations/bulk.d.ts +2 -0
  10. package/build/api/escalations/bulk.js +9 -4
  11. package/build/api/escalations/helpers.d.ts +5 -0
  12. package/build/api/escalations/helpers.js +7 -0
  13. package/build/api/escalations/metadata.js +3 -0
  14. package/build/api/escalations/single.d.ts +3 -2
  15. package/build/api/escalations/single.js +8 -3
  16. package/build/api/mcp/tools.d.ts +12 -0
  17. package/build/api/mcp/tools.js +113 -9
  18. package/build/api/scan-codes/choice.js +31 -7
  19. package/build/api/settings.js +9 -0
  20. package/build/api/tasks.d.ts +3 -3
  21. package/build/api/tasks.js +30 -7
  22. package/build/api/workflows/input-lookups.js +1 -1
  23. package/build/api/workflows/invocable.js +2 -2
  24. package/build/api/workflows/invocation.js +1 -1
  25. package/build/api/yaml-workflows/cron.d.ts +3 -2
  26. package/build/api/yaml-workflows/cron.js +6 -1
  27. package/build/api/yaml-workflows/deploy.d.ts +15 -2
  28. package/build/api/yaml-workflows/deploy.js +69 -2
  29. package/build/lib/db/schemas/038_oauth_server.sql +46 -0
  30. package/build/lib/db/schemas/039_nats_ws_tickets.sql +12 -0
  31. package/build/lib/events/browser-view.d.ts +20 -0
  32. package/build/lib/events/browser-view.js +117 -0
  33. package/build/lib/events/nats-ws-filter.d.ts +29 -0
  34. package/build/lib/events/nats-ws-filter.js +109 -0
  35. package/build/lib/events/nats-ws-proxy.d.ts +7 -0
  36. package/build/lib/events/nats-ws-proxy.js +86 -7
  37. package/build/lib/events/nats-ws-server-filter.d.ts +16 -0
  38. package/build/lib/events/nats-ws-server-filter.js +56 -0
  39. package/build/lib/events/nats-ws-ticket.d.ts +19 -0
  40. package/build/lib/events/nats-ws-ticket.js +63 -0
  41. package/build/lib/events/socketio.d.ts +10 -1
  42. package/build/lib/events/socketio.js +10 -3
  43. package/build/lib/http/index.d.ts +27 -0
  44. package/build/lib/http/index.js +55 -0
  45. package/build/modules/auth.d.ts +15 -24
  46. package/build/modules/auth.js +43 -126
  47. package/build/modules/capabilities.d.ts +62 -0
  48. package/build/modules/capabilities.js +188 -0
  49. package/build/modules/config.d.ts +19 -0
  50. package/build/modules/config.js +27 -0
  51. package/build/modules/defaults.d.ts +10 -0
  52. package/build/modules/defaults.js +12 -1
  53. package/build/modules/maintenance.d.ts +2 -0
  54. package/build/modules/maintenance.js +7 -0
  55. package/build/modules/mcp-auth.d.ts +11 -0
  56. package/build/modules/mcp-auth.js +56 -0
  57. package/build/modules/oauth-server.d.ts +18 -0
  58. package/build/modules/oauth-server.js +40 -0
  59. package/build/routes/agents.js +47 -14
  60. package/build/routes/announcements.js +2 -2
  61. package/build/routes/auth-sso.js +2 -2
  62. package/build/routes/auth.js +2 -2
  63. package/build/routes/bot-accounts.js +26 -3
  64. package/build/routes/capabilities.js +4 -4
  65. package/build/routes/controlplane.js +2 -2
  66. package/build/routes/dba.js +2 -2
  67. package/build/routes/delegation.js +2 -2
  68. package/build/routes/diagnostics.js +2 -2
  69. package/build/routes/docs.js +2 -2
  70. package/build/routes/domain.js +2 -2
  71. package/build/routes/escalations/accumulate.d.ts +1 -1
  72. package/build/routes/escalations/acting.d.ts +1 -1
  73. package/build/routes/escalations/analytics.d.ts +1 -1
  74. package/build/routes/escalations/bulk.d.ts +1 -1
  75. package/build/routes/escalations/facets.d.ts +1 -1
  76. package/build/routes/escalations/index.js +2 -2
  77. package/build/routes/escalations/list.d.ts +1 -1
  78. package/build/routes/escalations/metadata.d.ts +1 -1
  79. package/build/routes/escalations/related.d.ts +1 -1
  80. package/build/routes/escalations/resolve.d.ts +1 -1
  81. package/build/routes/escalations/single.d.ts +1 -1
  82. package/build/routes/escalations/single.js +1 -1
  83. package/build/routes/exports.js +14 -13
  84. package/build/routes/file-browser.js +9 -8
  85. package/build/routes/files.js +2 -2
  86. package/build/routes/index.js +4 -2
  87. package/build/routes/insight.js +5 -4
  88. package/build/routes/knowledge.js +2 -2
  89. package/build/routes/maintenance.js +2 -2
  90. package/build/routes/mcp-endpoint.d.ts +3 -1
  91. package/build/routes/mcp-endpoint.js +18 -8
  92. package/build/routes/mcp.js +35 -15
  93. package/build/routes/me.js +2 -2
  94. package/build/routes/namespaces.js +4 -3
  95. package/build/routes/nats-credentials.js +27 -3
  96. package/build/routes/oauth-server/authorize.d.ts +2 -0
  97. package/build/routes/oauth-server/authorize.js +110 -0
  98. package/build/routes/oauth-server/grants.d.ts +2 -0
  99. package/build/routes/oauth-server/grants.js +35 -0
  100. package/build/routes/oauth-server/index.d.ts +8 -0
  101. package/build/routes/oauth-server/index.js +52 -0
  102. package/build/routes/oauth-server/registration.d.ts +2 -0
  103. package/build/routes/oauth-server/registration.js +38 -0
  104. package/build/routes/oauth-server/token.d.ts +2 -0
  105. package/build/routes/oauth-server/token.js +100 -0
  106. package/build/routes/oauth-well-known.d.ts +8 -0
  107. package/build/routes/oauth-well-known.js +31 -0
  108. package/build/routes/oauth.js +2 -2
  109. package/build/routes/overview.js +2 -2
  110. package/build/routes/personas.js +2 -2
  111. package/build/routes/pipelines.js +6 -5
  112. package/build/routes/roles.js +2 -2
  113. package/build/routes/scan-codes.js +2 -2
  114. package/build/routes/settings.js +2 -2
  115. package/build/routes/tasks.js +5 -5
  116. package/build/routes/topics.js +21 -9
  117. package/build/routes/users.js +25 -22
  118. package/build/routes/workflow-sets.js +13 -12
  119. package/build/routes/workflows/config.js +15 -2
  120. package/build/routes/workflows/discovery.js +2 -2
  121. package/build/routes/workflows/index.js +2 -2
  122. package/build/routes/workflows/invocation.js +11 -10
  123. package/build/routes/yaml-workflows/cron.js +20 -7
  124. package/build/routes/yaml-workflows/crud.js +13 -12
  125. package/build/routes/yaml-workflows/deployment.js +11 -10
  126. package/build/routes/yaml-workflows/index.js +2 -2
  127. package/build/routes/yaml-workflows/versions.js +2 -2
  128. package/build/services/agent/authority.d.ts +15 -0
  129. package/build/services/agent/authority.js +59 -0
  130. package/build/services/agent/trigger-registry.js +7 -2
  131. package/build/services/auth/bot-api-key.d.ts +2 -0
  132. package/build/services/auth/bot-api-key.js +10 -0
  133. package/build/services/auth/oauth-server/access-token.d.ts +36 -0
  134. package/build/services/auth/oauth-server/access-token.js +80 -0
  135. package/build/services/auth/oauth-server/authorization.d.ts +47 -0
  136. package/build/services/auth/oauth-server/authorization.js +54 -0
  137. package/build/services/auth/oauth-server/constants.d.ts +11 -0
  138. package/build/services/auth/oauth-server/constants.js +16 -0
  139. package/build/services/auth/oauth-server/index.d.ts +3 -0
  140. package/build/services/auth/oauth-server/index.js +27 -0
  141. package/build/services/auth/oauth-server/metadata.d.ts +21 -0
  142. package/build/services/auth/oauth-server/metadata.js +53 -0
  143. package/build/services/auth/oauth-server/registration.d.ts +42 -0
  144. package/build/services/auth/oauth-server/registration.js +134 -0
  145. package/build/services/auth/oauth-server/sql.d.ts +50 -0
  146. package/build/services/auth/oauth-server/sql.js +156 -0
  147. package/build/services/auth/oauth-server/store.d.ts +88 -0
  148. package/build/services/auth/oauth-server/store.js +171 -0
  149. package/build/services/auth/sql.d.ts +1 -0
  150. package/build/services/auth/sql.js +3 -1
  151. package/build/services/cron/index.js +5 -3
  152. package/build/services/escalation/queries.js +7 -2
  153. package/build/services/export/index.d.ts +10 -0
  154. package/build/services/export/index.js +27 -0
  155. package/build/services/invocation-access.d.ts +25 -4
  156. package/build/services/invocation-access.js +39 -7
  157. package/build/services/maintenance/index.js +8 -0
  158. package/build/services/mcp/client/connection-dispatch.d.ts +6 -1
  159. package/build/services/mcp/client/connection-dispatch.js +3 -2
  160. package/build/services/mcp/client/connection-lifecycle.d.ts +10 -2
  161. package/build/services/mcp/client/connection-lifecycle.js +45 -7
  162. package/build/services/mcp/client/connection-test.js +2 -6
  163. package/build/services/mcp/client/connection.d.ts +1 -1
  164. package/build/services/mcp/client/connection.js +3 -1
  165. package/build/services/mcp/client/index.d.ts +2 -2
  166. package/build/services/mcp/client/index.js +4 -1
  167. package/build/services/mcp/client/network-transport.d.ts +12 -0
  168. package/build/services/mcp/client/network-transport.js +20 -0
  169. package/build/services/mcp/client/tools.d.ts +13 -0
  170. package/build/services/mcp/client/tools.js +18 -0
  171. package/build/services/mcp/db-server/index.js +2 -1
  172. package/build/services/mcp/external-server.d.ts +9 -4
  173. package/build/services/mcp/external-server.js +34 -11
  174. package/build/services/mcp/playwright-server/index.js +2 -1
  175. package/build/services/mcp/registered-tools.d.ts +3 -0
  176. package/build/services/mcp/registered-tools.js +7 -0
  177. package/build/services/mcp/seed-service-account.d.ts +4 -1
  178. package/build/services/mcp/seed-service-account.js +11 -6
  179. package/build/services/mcp/server-lifecycle.js +2 -1
  180. package/build/services/workflow-invocation.d.ts +16 -3
  181. package/build/services/workflow-invocation.js +42 -10
  182. package/build/services/yaml-workflow/deployer.d.ts +10 -2
  183. package/build/services/yaml-workflow/deployer.js +17 -5
  184. package/build/services/yaml-workflow/invoke.js +31 -26
  185. package/build/services/yaml-workflow/workers/register.js +3 -13
  186. package/build/services/yaml-workflow/workers/step-tool.d.ts +7 -0
  187. package/build/services/yaml-workflow/workers/step-tool.js +69 -0
  188. package/build/start/config.js +7 -0
  189. package/build/start/index.js +4 -22
  190. package/build/start/server.d.ts +6 -4
  191. package/build/start/server.js +11 -35
  192. package/build/start/socket-auth.js +2 -1
  193. package/build/start/workers.js +1 -1
  194. package/build/system/mcp-servers/admin/agent-subscriptions.js +25 -1
  195. package/build/system/mcp-servers/admin/agents.js +25 -2
  196. package/build/system/mcp-servers/admin/announcements.js +3 -2
  197. package/build/system/mcp-servers/admin/bot-accounts.js +37 -5
  198. package/build/system/mcp-servers/admin/escalations.d.ts +3 -5
  199. package/build/system/mcp-servers/admin/escalations.js +74 -70
  200. package/build/system/mcp-servers/admin/exports.js +7 -1
  201. package/build/system/mcp-servers/admin/index.js +24 -25
  202. package/build/system/mcp-servers/admin/overview.d.ts +2 -2
  203. package/build/system/mcp-servers/admin/run-read.d.ts +2 -0
  204. package/build/system/mcp-servers/admin/run-read.js +5 -0
  205. package/build/system/mcp-servers/admin/scan-codes.d.ts +2 -2
  206. package/build/system/mcp-servers/admin/scan-codes.js +5 -11
  207. package/build/system/mcp-servers/admin/schemas.d.ts +26 -26
  208. package/build/system/mcp-servers/admin/tasks.js +7 -2
  209. package/build/system/mcp-servers/admin/users.js +31 -4
  210. package/build/system/mcp-servers/admin/workflow-config.js +12 -1
  211. package/build/system/mcp-servers/admin/workflows.js +27 -5
  212. package/build/system/mcp-servers/admin/yaml-workflows.js +13 -21
  213. package/build/system/mcp-servers/caller-auth.d.ts +18 -0
  214. package/build/system/mcp-servers/caller-auth.js +29 -0
  215. package/build/system/mcp-servers/claude-code.js +2 -1
  216. package/build/system/mcp-servers/db-query/index.js +2 -1
  217. package/build/system/mcp-servers/file-storage.js +2 -1
  218. package/build/system/mcp-servers/http-fetch.js +2 -1
  219. package/build/system/mcp-servers/human-queue.js +7 -3
  220. package/build/system/mcp-servers/oauth.js +31 -4
  221. package/build/system/mcp-servers/schema-exchange.js +2 -1
  222. package/build/system/mcp-servers/vision.d.ts +1 -0
  223. package/build/system/mcp-servers/vision.js +17 -7
  224. package/build/system/mcp-servers/workflow.js +13 -25
  225. package/build/system/seed/tool-manifests-admin.d.ts +2 -17985
  226. package/build/system/seed/tool-manifests-admin.js +121 -121
  227. package/build/system/seed/tool-manifests-data.d.ts +8 -374
  228. package/build/system/seed/tool-manifests-data.js +22 -4
  229. package/build/system/seed/tool-manifests-escalation.d.ts +2 -352
  230. package/build/system/seed/tool-manifests-escalation.js +11 -1
  231. package/build/system/seed/tool-manifests-events.d.ts +2 -116
  232. package/build/system/seed/tool-manifests-events.js +6 -2
  233. package/build/system/seed/tool-manifests-knowledge.d.ts +2 -221
  234. package/build/system/seed/tool-manifests-knowledge.js +41 -1
  235. package/build/system/seed/tool-manifests-workflows.d.ts +2 -71
  236. package/build/system/seed/tool-manifests-workflows.js +3 -1
  237. package/build/system/workflows/shared/principal-tools.d.ts +20 -0
  238. package/build/system/workflows/shared/principal-tools.js +64 -0
  239. package/build/system/workflows/shared/tool-executor.js +21 -11
  240. package/build/system/workflows/shared/tool-loader.js +8 -1
  241. package/build/tsconfig.tsbuildinfo +1 -1
  242. package/build/types/auth.d.ts +1 -1
  243. package/build/types/capability.d.ts +14 -0
  244. package/build/types/capability.js +2 -0
  245. package/build/types/events.d.ts +1 -1
  246. package/build/types/index.d.ts +3 -1
  247. package/build/types/maintenance.d.ts +2 -2
  248. package/build/types/mcp.d.ts +3 -1
  249. package/build/types/oauth-server.d.ts +52 -0
  250. package/build/types/oauth-server.js +2 -0
  251. package/build/types/startup.d.ts +15 -7
  252. package/build/vitest.config.js +2 -1
  253. package/build/vitest.fast.config.d.ts +2 -0
  254. package/build/vitest.fast.config.js +20 -0
  255. package/build/vitest.llm.config.d.ts +2 -0
  256. package/build/vitest.llm.config.js +16 -0
  257. package/dashboard/dist/assets/{AdminDashboard-BPWsgMfZ.js → AdminDashboard-B3mkMIOT.js} +2 -2
  258. package/dashboard/dist/assets/{AdminDashboard-BPWsgMfZ.js.map → AdminDashboard-B3mkMIOT.js.map} +1 -1
  259. package/dashboard/dist/assets/{AgentConfigPage-De9imyo5.js → AgentConfigPage-CQj2B678.js} +2 -2
  260. package/dashboard/dist/assets/{AgentConfigPage-De9imyo5.js.map → AgentConfigPage-CQj2B678.js.map} +1 -1
  261. package/dashboard/dist/assets/{AgentDetailPage-B6o96Y5G.js → AgentDetailPage-CzrD8JJI.js} +3 -3
  262. package/dashboard/dist/assets/{AgentDetailPage-B6o96Y5G.js.map → AgentDetailPage-CzrD8JJI.js.map} +1 -1
  263. package/dashboard/dist/assets/{AgentsPage-DMEmiK_W.js → AgentsPage-jg2OFwyW.js} +2 -2
  264. package/dashboard/dist/assets/{AgentsPage-DMEmiK_W.js.map → AgentsPage-jg2OFwyW.js.map} +1 -1
  265. package/dashboard/dist/assets/{AvailableEscalationsPage-DeYMngwE.js → AvailableEscalationsPage-IS28XBRe.js} +2 -2
  266. package/dashboard/dist/assets/{AvailableEscalationsPage-DeYMngwE.js.map → AvailableEscalationsPage-IS28XBRe.js.map} +1 -1
  267. package/dashboard/dist/assets/{BotPicker-DDmpgGHZ.js → BotPicker-DvEJFpwS.js} +2 -2
  268. package/dashboard/dist/assets/{BotPicker-DDmpgGHZ.js.map → BotPicker-DvEJFpwS.js.map} +1 -1
  269. package/dashboard/dist/assets/{BulkAssignModal-BqlklomG.js → BulkAssignModal-BoQCi-YC.js} +2 -2
  270. package/dashboard/dist/assets/{BulkAssignModal-BqlklomG.js.map → BulkAssignModal-BoQCi-YC.js.map} +1 -1
  271. package/dashboard/dist/assets/{CapabilitiesPage-DOtjDTbK.js → CapabilitiesPage-kwlrcb_t.js} +2 -2
  272. package/dashboard/dist/assets/{CapabilitiesPage-DOtjDTbK.js.map → CapabilitiesPage-kwlrcb_t.js.map} +1 -1
  273. package/dashboard/dist/assets/{CollapsibleSection-CLr8LP0V.js → CollapsibleSection-UMIV4KIj.js} +2 -2
  274. package/dashboard/dist/assets/{CollapsibleSection-CLr8LP0V.js.map → CollapsibleSection-UMIV4KIj.js.map} +1 -1
  275. package/dashboard/dist/assets/ConfirmDeleteModal-C5puwMg7.js +2 -0
  276. package/dashboard/dist/assets/ConfirmDeleteModal-C5puwMg7.js.map +1 -0
  277. package/dashboard/dist/assets/ConnectedAppsPage-drZa65kP.js +2 -0
  278. package/dashboard/dist/assets/ConnectedAppsPage-drZa65kP.js.map +1 -0
  279. package/dashboard/dist/assets/{CountdownTimer-DxX72PwV.js → CountdownTimer-LG03dVgR.js} +2 -2
  280. package/dashboard/dist/assets/{CountdownTimer-DxX72PwV.js.map → CountdownTimer-LG03dVgR.js.map} +1 -1
  281. package/dashboard/dist/assets/{CredentialsPage-CObc9Rs5.js → CredentialsPage-CaFQ6vLb.js} +2 -2
  282. package/dashboard/dist/assets/{CredentialsPage-CObc9Rs5.js.map → CredentialsPage-CaFQ6vLb.js.map} +1 -1
  283. package/dashboard/dist/assets/{CronLabel-Bb8GoNY5.js → CronLabel-Co5j7tzW.js} +2 -2
  284. package/dashboard/dist/assets/{CronLabel-Bb8GoNY5.js.map → CronLabel-Co5j7tzW.js.map} +1 -1
  285. package/dashboard/dist/assets/{ElapsedCell-CmGhVlYl.js → ElapsedCell-WJyE9G0T.js} +2 -2
  286. package/dashboard/dist/assets/{ElapsedCell-CmGhVlYl.js.map → ElapsedCell-WJyE9G0T.js.map} +1 -1
  287. package/dashboard/dist/assets/{EntityTimelinePanel-B4Jwy1w3.js → EntityTimelinePanel-CDFFfX9d.js} +2 -2
  288. package/dashboard/dist/assets/{EntityTimelinePanel-B4Jwy1w3.js.map → EntityTimelinePanel-CDFFfX9d.js.map} +1 -1
  289. package/dashboard/dist/assets/{EscalationListSchemaPage-CZZbZ4Aa.js → EscalationListSchemaPage-CMrUlaKI.js} +3 -3
  290. package/dashboard/dist/assets/{EscalationListSchemaPage-CZZbZ4Aa.js.map → EscalationListSchemaPage-CMrUlaKI.js.map} +1 -1
  291. package/dashboard/dist/assets/{EscalationSchemaPage-D0ko59_S.js → EscalationSchemaPage-Dx2Lyfrz.js} +2 -2
  292. package/dashboard/dist/assets/{EscalationSchemaPage-D0ko59_S.js.map → EscalationSchemaPage-Dx2Lyfrz.js.map} +1 -1
  293. package/dashboard/dist/assets/{EscalationTimeline-BcnJEKFD.js → EscalationTimeline-d3nvshOk.js} +2 -2
  294. package/dashboard/dist/assets/{EscalationTimeline-BcnJEKFD.js.map → EscalationTimeline-d3nvshOk.js.map} +1 -1
  295. package/dashboard/dist/assets/{EscalationTitleSelect-P0q5sck4.js → EscalationTitleSelect-DWQieOM9.js} +2 -2
  296. package/dashboard/dist/assets/{EscalationTitleSelect-P0q5sck4.js.map → EscalationTitleSelect-DWQieOM9.js.map} +1 -1
  297. package/dashboard/dist/assets/{EscalationsOverview-BLPmh4AF.js → EscalationsOverview-BX8Cpi0X.js} +2 -2
  298. package/dashboard/dist/assets/{EscalationsOverview-BLPmh4AF.js.map → EscalationsOverview-BX8Cpi0X.js.map} +1 -1
  299. package/dashboard/dist/assets/{EventTable-gBzi5tIS.js → EventTable-D1-ITVXS.js} +2 -2
  300. package/dashboard/dist/assets/{EventTable-gBzi5tIS.js.map → EventTable-D1-ITVXS.js.map} +1 -1
  301. package/dashboard/dist/assets/{FilterBar-BulSsWb2.js → FilterBar-ABC9ctin.js} +2 -2
  302. package/dashboard/dist/assets/{FilterBar-BulSsWb2.js.map → FilterBar-ABC9ctin.js.map} +1 -1
  303. package/dashboard/dist/assets/{FormattedValue-BMHRrvrL.js → FormattedValue-k27T4bG7.js} +2 -2
  304. package/dashboard/dist/assets/{FormattedValue-BMHRrvrL.js.map → FormattedValue-k27T4bG7.js.map} +1 -1
  305. package/dashboard/dist/assets/{GraphInvokePage--997yNRr.js → GraphInvokePage-DKUErxWc.js} +2 -2
  306. package/dashboard/dist/assets/{GraphInvokePage--997yNRr.js.map → GraphInvokePage-DKUErxWc.js.map} +1 -1
  307. package/dashboard/dist/assets/{HomePage-CwXFz--v.js → HomePage-C6u9dIpR.js} +2 -2
  308. package/dashboard/dist/assets/{HomePage-CwXFz--v.js.map → HomePage-C6u9dIpR.js.map} +1 -1
  309. package/dashboard/dist/assets/{ListToolbar-Df4qZryJ.js → ListToolbar-gA5rFzkz.js} +2 -2
  310. package/dashboard/dist/assets/{ListToolbar-Df4qZryJ.js.map → ListToolbar-gA5rFzkz.js.map} +1 -1
  311. package/dashboard/dist/assets/{McpOverview-DrogIAKJ.js → McpOverview-BOPo3J_i.js} +2 -2
  312. package/dashboard/dist/assets/{McpOverview-DrogIAKJ.js.map → McpOverview-BOPo3J_i.js.map} +1 -1
  313. package/dashboard/dist/assets/{McpQueryDetailPage-CJmvCAE6.js → McpQueryDetailPage-BRVVi0Zh.js} +2 -2
  314. package/dashboard/dist/assets/{McpQueryDetailPage-CJmvCAE6.js.map → McpQueryDetailPage-BRVVi0Zh.js.map} +1 -1
  315. package/dashboard/dist/assets/{McpQueryPage-lygo4Yq0.js → McpQueryPage-Dmbb6SAc.js} +2 -2
  316. package/dashboard/dist/assets/{McpQueryPage-lygo4Yq0.js.map → McpQueryPage-Dmbb6SAc.js.map} +1 -1
  317. package/dashboard/dist/assets/{McpRunDetailPage-hvns2sCm.js → McpRunDetailPage-bMXNO-6V.js} +2 -2
  318. package/dashboard/dist/assets/{McpRunDetailPage-hvns2sCm.js.map → McpRunDetailPage-bMXNO-6V.js.map} +1 -1
  319. package/dashboard/dist/assets/{McpRunsPage-C2_7spTX.js → McpRunsPage-Bi9AMWja.js} +2 -2
  320. package/dashboard/dist/assets/{McpRunsPage-C2_7spTX.js.map → McpRunsPage-Bi9AMWja.js.map} +1 -1
  321. package/dashboard/dist/assets/{OperationsPage-BlK8WlsY.js → OperationsPage-CvR74ZUJ.js} +3 -3
  322. package/dashboard/dist/assets/{OperationsPage-BlK8WlsY.js.map → OperationsPage-CvR74ZUJ.js.map} +1 -1
  323. package/dashboard/dist/assets/{OperatorDashboard-BeWBiMGX.js → OperatorDashboard-DctmZw10.js} +2 -2
  324. package/dashboard/dist/assets/{OperatorDashboard-BeWBiMGX.js.map → OperatorDashboard-DctmZw10.js.map} +1 -1
  325. package/dashboard/dist/assets/{PersonaDetailPage-CNHpsX_i.js → PersonaDetailPage-Ubqm2rQH.js} +2 -2
  326. package/dashboard/dist/assets/{PersonaDetailPage-CNHpsX_i.js.map → PersonaDetailPage-Ubqm2rQH.js.map} +1 -1
  327. package/dashboard/dist/assets/{PersonasPage-ChASEZRg.js → PersonasPage-BpFL2rpo.js} +2 -2
  328. package/dashboard/dist/assets/{PersonasPage-ChASEZRg.js.map → PersonasPage-BpFL2rpo.js.map} +1 -1
  329. package/dashboard/dist/assets/{PortalPage-D5Lk-PKF.js → PortalPage-Dfc_Q02R.js} +2 -2
  330. package/dashboard/dist/assets/{PortalPage-D5Lk-PKF.js.map → PortalPage-Dfc_Q02R.js.map} +1 -1
  331. package/dashboard/dist/assets/ProcessDetailPage-liJspvQh.js +2 -0
  332. package/dashboard/dist/assets/{ProcessDetailPage-DNgCIwRl.js.map → ProcessDetailPage-liJspvQh.js.map} +1 -1
  333. package/dashboard/dist/assets/{ProcessesListPage-pRjWuWlH.js → ProcessesListPage-C3OM5ZUy.js} +2 -2
  334. package/dashboard/dist/assets/{ProcessesListPage-pRjWuWlH.js.map → ProcessesListPage-C3OM5ZUy.js.map} +1 -1
  335. package/dashboard/dist/assets/ResolverForm-B1_x8Blv.js +8 -0
  336. package/dashboard/dist/assets/ResolverForm-B1_x8Blv.js.map +1 -0
  337. package/dashboard/dist/assets/{RoleDetailPage-Bh_UcfYY.js → RoleDetailPage-CrlYCh-R.js} +2 -2
  338. package/dashboard/dist/assets/{RoleDetailPage-Bh_UcfYY.js.map → RoleDetailPage-CrlYCh-R.js.map} +1 -1
  339. package/dashboard/dist/assets/{RolesPage-CK17N7zz.js → RolesPage-BaazL_pt.js} +2 -2
  340. package/dashboard/dist/assets/{RolesPage-CK17N7zz.js.map → RolesPage-BaazL_pt.js.map} +1 -1
  341. package/dashboard/dist/assets/{RunAsSelector-BEKUP0p2.js → RunAsSelector-DxuV0fa1.js} +2 -2
  342. package/dashboard/dist/assets/{RunAsSelector-BEKUP0p2.js.map → RunAsSelector-DxuV0fa1.js.map} +1 -1
  343. package/dashboard/dist/assets/{ScanCodesPage-Bd0Pflqx.js → ScanCodesPage-C0mvmYTq.js} +2 -2
  344. package/dashboard/dist/assets/{ScanCodesPage-Bd0Pflqx.js.map → ScanCodesPage-C0mvmYTq.js.map} +1 -1
  345. package/dashboard/dist/assets/{ScanSchemeDetailPage-CnuhozmJ.js → ScanSchemeDetailPage-CiJgt5dZ.js} +2 -2
  346. package/dashboard/dist/assets/{ScanSchemeDetailPage-CnuhozmJ.js.map → ScanSchemeDetailPage-CiJgt5dZ.js.map} +1 -1
  347. package/dashboard/dist/assets/{ScanStationPage-CoLc-q3h.js → ScanStationPage-DzGaXc40.js} +2 -2
  348. package/dashboard/dist/assets/{ScanStationPage-CoLc-q3h.js.map → ScanStationPage-DzGaXc40.js.map} +1 -1
  349. package/dashboard/dist/assets/{StickyPagination-COrfvkBi.js → StickyPagination-CqbjVY6T.js} +2 -2
  350. package/dashboard/dist/assets/{StickyPagination-COrfvkBi.js.map → StickyPagination-CqbjVY6T.js.map} +1 -1
  351. package/dashboard/dist/assets/{StreamMessageDetail-Cif2egLy.js → StreamMessageDetail-wX3i0aqs.js} +2 -2
  352. package/dashboard/dist/assets/{StreamMessageDetail-Cif2egLy.js.map → StreamMessageDetail-wX3i0aqs.js.map} +1 -1
  353. package/dashboard/dist/assets/{SwimlaneTimeline-BnZYTrAh.js → SwimlaneTimeline-C50PsFoV.js} +2 -2
  354. package/dashboard/dist/assets/{SwimlaneTimeline-BnZYTrAh.js.map → SwimlaneTimeline-C50PsFoV.js.map} +1 -1
  355. package/dashboard/dist/assets/{TaskDetailPage-DEz_dqyR.js → TaskDetailPage-bbNSv4Ae.js} +2 -2
  356. package/dashboard/dist/assets/{TaskDetailPage-DEz_dqyR.js.map → TaskDetailPage-bbNSv4Ae.js.map} +1 -1
  357. package/dashboard/dist/assets/{TasksListPage-oEfEGj0_.js → TasksListPage-CDWnm_d9.js} +2 -2
  358. package/dashboard/dist/assets/{TasksListPage-oEfEGj0_.js.map → TasksListPage-CDWnm_d9.js.map} +1 -1
  359. package/dashboard/dist/assets/{TimeAgo-Dz5TgZZZ.js → TimeAgo-BLjqlfoX.js} +2 -2
  360. package/dashboard/dist/assets/{TimeAgo-Dz5TgZZZ.js.map → TimeAgo-BLjqlfoX.js.map} +1 -1
  361. package/dashboard/dist/assets/{TimestampCell-BUTgE244.js → TimestampCell-CnW0ENb5.js} +2 -2
  362. package/dashboard/dist/assets/{TimestampCell-BUTgE244.js.map → TimestampCell-CnW0ENb5.js.map} +1 -1
  363. package/dashboard/dist/assets/{ToolTestPanel-BS4g6vt-.js → ToolTestPanel-DkMgCB-k.js} +2 -2
  364. package/dashboard/dist/assets/{ToolTestPanel-BS4g6vt-.js.map → ToolTestPanel-DkMgCB-k.js.map} +1 -1
  365. package/dashboard/dist/assets/{TopicDetailPage-C_I6JIVD.js → TopicDetailPage-g3pljKKX.js} +2 -2
  366. package/dashboard/dist/assets/{TopicDetailPage-C_I6JIVD.js.map → TopicDetailPage-g3pljKKX.js.map} +1 -1
  367. package/dashboard/dist/assets/{TopicsPage-Cr6-wfhJ.js → TopicsPage-CVcCYdy-.js} +2 -2
  368. package/dashboard/dist/assets/{TopicsPage-Cr6-wfhJ.js.map → TopicsPage-CVcCYdy-.js.map} +1 -1
  369. package/dashboard/dist/assets/{UserName-ZFpWMaFF.js → UserName-D6zGIK2i.js} +2 -2
  370. package/dashboard/dist/assets/{UserName-ZFpWMaFF.js.map → UserName-D6zGIK2i.js.map} +1 -1
  371. package/dashboard/dist/assets/{WorkflowExecutionPage-ByPixDZW.js → WorkflowExecutionPage-B8g81FCJ.js} +2 -2
  372. package/dashboard/dist/assets/{WorkflowExecutionPage-ByPixDZW.js.map → WorkflowExecutionPage-B8g81FCJ.js.map} +1 -1
  373. package/dashboard/dist/assets/{WorkflowsDashboard-CWsJdMdR.js → WorkflowsDashboard-nxT3bv6W.js} +2 -2
  374. package/dashboard/dist/assets/{WorkflowsDashboard-CWsJdMdR.js.map → WorkflowsDashboard-nxT3bv6W.js.map} +1 -1
  375. package/dashboard/dist/assets/{WorkflowsOverview-Dk9gyqZN.js → WorkflowsOverview-grI-KAI2.js} +2 -2
  376. package/dashboard/dist/assets/{WorkflowsOverview-Dk9gyqZN.js.map → WorkflowsOverview-grI-KAI2.js.map} +1 -1
  377. package/dashboard/dist/assets/{YamlWorkflowDetailPage-CHwcrsaT.js → YamlWorkflowDetailPage-BoZ-hfBE.js} +2 -2
  378. package/dashboard/dist/assets/{YamlWorkflowDetailPage-CHwcrsaT.js.map → YamlWorkflowDetailPage-BoZ-hfBE.js.map} +1 -1
  379. package/dashboard/dist/assets/{YamlWorkflowsPage-B5jRX2Ph.js → YamlWorkflowsPage-Bf04rwRv.js} +2 -2
  380. package/dashboard/dist/assets/{YamlWorkflowsPage-B5jRX2Ph.js.map → YamlWorkflowsPage-Bf04rwRv.js.map} +1 -1
  381. package/dashboard/dist/assets/{agents-Dd7E-27d.js → agents-Dphpdi8l.js} +2 -2
  382. package/dashboard/dist/assets/{agents-Dd7E-27d.js.map → agents-Dphpdi8l.js.map} +1 -1
  383. package/dashboard/dist/assets/{bots-CpaYjZTk.js → bots-DIFE298x.js} +2 -2
  384. package/dashboard/dist/assets/{bots-CpaYjZTk.js.map → bots-DIFE298x.js.map} +1 -1
  385. package/dashboard/dist/assets/{capabilities-CNjg_qv1.js → capabilities-D7Y7LClY.js} +2 -2
  386. package/dashboard/dist/assets/{capabilities-CNjg_qv1.js.map → capabilities-D7Y7LClY.js.map} +1 -1
  387. package/dashboard/dist/assets/{controlplane-DgmvnAtU.js → controlplane-D1TGcYsS.js} +2 -2
  388. package/dashboard/dist/assets/{controlplane-DgmvnAtU.js.map → controlplane-D1TGcYsS.js.map} +1 -1
  389. package/dashboard/dist/assets/{escalation-columns-Uj4U9g5H.js → escalation-columns-cwZE6xyo.js} +2 -2
  390. package/dashboard/dist/assets/{escalation-columns-Uj4U9g5H.js.map → escalation-columns-cwZE6xyo.js.map} +1 -1
  391. package/dashboard/dist/assets/{index-x5z73M9N.js → index-BzYcUPdD.js} +2 -2
  392. package/dashboard/dist/assets/{index-x5z73M9N.js.map → index-BzYcUPdD.js.map} +1 -1
  393. package/dashboard/dist/assets/index-CeCtqujG.js +67 -0
  394. package/dashboard/dist/assets/index-CeCtqujG.js.map +1 -0
  395. package/dashboard/dist/assets/{index-RIFT3RlO.js → index-ChV7pBjM.js} +2 -2
  396. package/dashboard/dist/assets/{index-RIFT3RlO.js.map → index-ChV7pBjM.js.map} +1 -1
  397. package/dashboard/dist/assets/{index-OfO0173w.js → index-CniRa65p.js} +2 -2
  398. package/dashboard/dist/assets/{index-OfO0173w.js.map → index-CniRa65p.js.map} +1 -1
  399. package/dashboard/dist/assets/{index-ByBy9M3L.js → index-CxdjT1Yk.js} +2 -2
  400. package/dashboard/dist/assets/{index-ByBy9M3L.js.map → index-CxdjT1Yk.js.map} +1 -1
  401. package/dashboard/dist/assets/{index-C_K7OlzT.js → index-DAvi5_2T.js} +2 -2
  402. package/dashboard/dist/assets/{index-C_K7OlzT.js.map → index-DAvi5_2T.js.map} +1 -1
  403. package/dashboard/dist/assets/{index-BrwqtXRh.js → index-DN-kX7hL.js} +2 -2
  404. package/dashboard/dist/assets/{index-BrwqtXRh.js.map → index-DN-kX7hL.js.map} +1 -1
  405. package/dashboard/dist/assets/index-Dl_8hbYI.js +2 -0
  406. package/dashboard/dist/assets/index-Dl_8hbYI.js.map +1 -0
  407. package/dashboard/dist/assets/{index-D4Dlznn9.js → index-DpKOr311.js} +2 -2
  408. package/dashboard/dist/assets/{index-D4Dlznn9.js.map → index-DpKOr311.js.map} +1 -1
  409. package/dashboard/dist/assets/{index-CnOvJz6U.js → index-Dy1wWu2e.js} +2 -2
  410. package/dashboard/dist/assets/{index-CnOvJz6U.js.map → index-Dy1wWu2e.js.map} +1 -1
  411. package/dashboard/dist/assets/{index-BT1Ms5Q5.js → index-HLu98Sqh.js} +2 -2
  412. package/dashboard/dist/assets/{index-BT1Ms5Q5.js.map → index-HLu98Sqh.js.map} +1 -1
  413. package/dashboard/dist/assets/{index-BFASQ7_X.js → index-ag2pCAPu.js} +2 -2
  414. package/dashboard/dist/assets/{index-BFASQ7_X.js.map → index-ag2pCAPu.js.map} +1 -1
  415. package/dashboard/dist/assets/{index-BsHVgWH6.js → index-gkxPN7Vx.js} +2 -2
  416. package/dashboard/dist/assets/{index-BsHVgWH6.js.map → index-gkxPN7Vx.js.map} +1 -1
  417. package/dashboard/dist/assets/index-m9A3UYst.css +1 -0
  418. package/dashboard/dist/assets/{knowledge-Cci_r6Kl.js → knowledge-DnMs-SOJ.js} +2 -2
  419. package/dashboard/dist/assets/{knowledge-Cci_r6Kl.js.map → knowledge-DnMs-SOJ.js.map} +1 -1
  420. package/dashboard/dist/assets/{mcp-NY4iL0L-.js → mcp-CwW-K3r4.js} +2 -2
  421. package/dashboard/dist/assets/{mcp-NY4iL0L-.js.map → mcp-CwW-K3r4.js.map} +1 -1
  422. package/dashboard/dist/assets/{mcp-query-CbvZo_I_.js → mcp-query-BZt5e8_Q.js} +2 -2
  423. package/dashboard/dist/assets/{mcp-query-CbvZo_I_.js.map → mcp-query-BZt5e8_Q.js.map} +1 -1
  424. package/dashboard/dist/assets/{personas-Fy-f7QQd.js → personas-UA-Xn60f.js} +2 -2
  425. package/dashboard/dist/assets/{personas-Fy-f7QQd.js.map → personas-UA-Xn60f.js.map} +1 -1
  426. package/dashboard/dist/assets/{pipelines-DKiuozxV.js → pipelines-Cu3PARum.js} +2 -2
  427. package/dashboard/dist/assets/{pipelines-DKiuozxV.js.map → pipelines-Cu3PARum.js.map} +1 -1
  428. package/dashboard/dist/assets/{tasks-CdM1Rkk9.js → tasks-BO6h8GJE.js} +2 -2
  429. package/dashboard/dist/assets/{tasks-CdM1Rkk9.js.map → tasks-BO6h8GJE.js.map} +1 -1
  430. package/dashboard/dist/assets/{topics-XNy2mf3n.js → topics-CWjCR-17.js} +2 -2
  431. package/dashboard/dist/assets/{topics-XNy2mf3n.js.map → topics-CWjCR-17.js.map} +1 -1
  432. package/dashboard/dist/assets/{useDebouncedValue-CyGcU3_S.js → useDebouncedValue-6t0jx1RB.js} +2 -2
  433. package/dashboard/dist/assets/{useDebouncedValue-CyGcU3_S.js.map → useDebouncedValue-6t0jx1RB.js.map} +1 -1
  434. package/dashboard/dist/assets/{useNamespace-C2RIh_IN.js → useNamespace-CqpoQx6D.js} +2 -2
  435. package/dashboard/dist/assets/{useNamespace-C2RIh_IN.js.map → useNamespace-CqpoQx6D.js.map} +1 -1
  436. package/dashboard/dist/assets/{useYamlActivityEvents-CDiV5fjf.js → useYamlActivityEvents-hmCQQwzB.js} +2 -2
  437. package/dashboard/dist/assets/{useYamlActivityEvents-CDiV5fjf.js.map → useYamlActivityEvents-hmCQQwzB.js.map} +1 -1
  438. package/dashboard/dist/assets/{validate-DcGWN82Y.js → validate-BIRn4a6d.js} +2 -2
  439. package/dashboard/dist/assets/{validate-DcGWN82Y.js.map → validate-BIRn4a6d.js.map} +1 -1
  440. package/dashboard/dist/assets/{yaml-workflows-CH8UrouH.js → yaml-workflows-ziUdZhKY.js} +2 -2
  441. package/dashboard/dist/assets/{yaml-workflows-CH8UrouH.js.map → yaml-workflows-ziUdZhKY.js.map} +1 -1
  442. package/dashboard/dist/index.html +2 -2
  443. package/docs/agents.md +3 -1
  444. package/docs/api/http/agents.md +15 -1
  445. package/docs/api/http/escalations.md +3 -3
  446. package/docs/api/http/exports.md +3 -1
  447. package/docs/api/http/file-browser.md +3 -1
  448. package/docs/api/http/mcp-endpoint.md +8 -5
  449. package/docs/api/http/mcp-servers.md +34 -4
  450. package/docs/api/http/namespaces.md +2 -0
  451. package/docs/api/http/pipelines.md +2 -0
  452. package/docs/api/http/roles.md +11 -8
  453. package/docs/api/http/service-accounts.md +8 -2
  454. package/docs/api/http/settings.md +29 -2
  455. package/docs/api/http/tasks.md +3 -1
  456. package/docs/api/http/topics.md +7 -1
  457. package/docs/api/http/users.md +8 -2
  458. package/docs/api/http/workflows.md +25 -10
  459. package/docs/api/http/yaml-workflows.md +21 -0
  460. package/docs/api/mcp/admin.md +409 -49
  461. package/docs/api/mcp/file-storage.md +4 -0
  462. package/docs/api/mcp/http-fetch.md +6 -2
  463. package/docs/api/mcp/human-queue.md +53 -0
  464. package/docs/api/mcp/index.md +13 -10
  465. package/docs/api/mcp/knowledge.md +34 -0
  466. package/docs/api/mcp/oauth.md +1 -1
  467. package/docs/api/mcp/ortho.md +113 -0
  468. package/docs/api/mcp/vision.md +1 -1
  469. package/docs/api/sdk/bot-accounts.md +1 -0
  470. package/docs/api/sdk/escalations.md +2 -2
  471. package/docs/api/sdk/mcp.md +2 -2
  472. package/docs/api/sdk/settings.md +1 -1
  473. package/docs/api/sdk/tasks.md +2 -2
  474. package/docs/api/sdk/workflows.md +2 -2
  475. package/docs/api/sdk/yaml-workflows.md +1 -1
  476. package/docs/architecture.md +3 -1
  477. package/docs/auth.md +3 -2
  478. package/docs/cloud.md +7 -2
  479. package/docs/dashboard.md +16 -7
  480. package/docs/data.md +1 -1
  481. package/docs/escalation-strategies.md +9 -20
  482. package/docs/events.md +6 -0
  483. package/docs/iam.md +7 -5
  484. package/docs/maintenance.md +51 -28
  485. package/docs/mcp.md +159 -210
  486. package/docs/oauth-and-delegation.md +32 -21
  487. package/docs/topics.md +2 -0
  488. package/docs/workflows.md +14 -112
  489. package/package.json +5 -3
  490. package/dashboard/dist/assets/ConfirmDeleteModal-DW4DrPur.js +0 -2
  491. package/dashboard/dist/assets/ConfirmDeleteModal-DW4DrPur.js.map +0 -1
  492. package/dashboard/dist/assets/ProcessDetailPage-DNgCIwRl.js +0 -2
  493. package/dashboard/dist/assets/ResolverForm-CKIOAGtY.js +0 -8
  494. package/dashboard/dist/assets/ResolverForm-CKIOAGtY.js.map +0 -1
  495. package/dashboard/dist/assets/index-CtlBjl8o.js +0 -2
  496. package/dashboard/dist/assets/index-CtlBjl8o.js.map +0 -1
  497. package/dashboard/dist/assets/index-LRYC__mE.js +0 -67
  498. package/dashboard/dist/assets/index-LRYC__mE.js.map +0 -1
  499. package/dashboard/dist/assets/index-MYI2_Xb3.css +0 -1
@@ -10,6 +10,7 @@ const config_1 = require("../modules/config");
10
10
  const features_1 = require("../modules/features");
11
11
  const search_1 = require("../modules/search");
12
12
  const branding_1 = require("../modules/branding");
13
+ const oauth_server_1 = require("../modules/oauth-server");
13
14
  const display_1 = require("../modules/display");
14
15
  const version_1 = require("../modules/version");
15
16
  const sso_1 = require("../modules/sso");
@@ -66,6 +67,12 @@ async function getSettings(req) {
66
67
  events: {
67
68
  transport,
68
69
  natsWsUrl: natsAdapter ? resolveNatsWsUrl(natsAdapter, req) : null,
70
+ reconnect: {
71
+ initialDelayMs: config_1.config.NATS_RECONNECT_INITIAL_MS,
72
+ maxDelayMs: config_1.config.NATS_RECONNECT_MAX_MS,
73
+ noticeAfterMs: config_1.config.NATS_LIVE_NOTICE_AFTER_MS,
74
+ spreadMs: config_1.config.NATS_RECONNECT_SPREAD_MS,
75
+ },
69
76
  },
70
77
  auth: {
71
78
  sso: (0, sso_1.isSSOEnabled)(),
@@ -73,6 +80,8 @@ async function getSettings(req) {
73
80
  // Session keepalive dials for the SPA (null = no keepalive / no idle gate).
74
81
  ssoKeepaliveSeconds: (0, sso_1.getSSOConfig)()?.keepaliveSeconds ?? null,
75
82
  ssoKeepaliveIdleTimeoutSeconds: (0, sso_1.getSSOConfig)()?.keepaliveIdleTimeoutSeconds ?? null,
83
+ // The OAuth authorization server for MCP clients (Connected apps).
84
+ oauthServer: (0, oauth_server_1.getOAuthServerSettings)() !== null,
76
85
  },
77
86
  ai: {
78
87
  enabled: (0, llm_1.hasLLMApiKey)(),
@@ -47,7 +47,7 @@ export declare function listTasks(input: {
47
47
  origin_id?: string;
48
48
  limit?: number;
49
49
  offset?: number;
50
- }): Promise<LTApiResult>;
50
+ }, auth?: LTApiAuth): Promise<LTApiResult>;
51
51
  /**
52
52
  * Return aggregate process statistics.
53
53
  *
@@ -82,7 +82,7 @@ export declare function listProcesses(input: {
82
82
  */
83
83
  export declare function getProcess(input: {
84
84
  originId: string;
85
- }): Promise<LTApiResult>;
85
+ }, auth?: LTApiAuth): Promise<LTApiResult>;
86
86
  /**
87
87
  * Get a single task by ID.
88
88
  *
@@ -91,4 +91,4 @@ export declare function getProcess(input: {
91
91
  */
92
92
  export declare function getTask(input: {
93
93
  id: string;
94
- }): Promise<LTApiResult>;
94
+ }, auth?: LTApiAuth): Promise<LTApiResult>;
@@ -41,6 +41,24 @@ exports.getProcess = getProcess;
41
41
  exports.getTask = getTask;
42
42
  const taskService = __importStar(require("../services/task"));
43
43
  const escalationService = __importStar(require("../services/escalation"));
44
+ const helpers_1 = require("./escalations/helpers");
45
+ const capabilities_1 = require("../modules/capabilities");
46
+ /**
47
+ * How a caller sees task rows. A builder, and the person a run was started by
48
+ * or runs as, see the whole row; anyone else sees it without the run's input
49
+ * (`envelope`), output (`data`) and `metadata`. An in-process call (no auth)
50
+ * sees whole rows.
51
+ */
52
+ async function taskViewFor(auth) {
53
+ if (!auth?.userId || (await (0, capabilities_1.mayBuild)(auth)))
54
+ return (task) => task;
55
+ return (task) => {
56
+ if (task.initiated_by === auth.userId || task.executing_as === auth.userId)
57
+ return task;
58
+ const { envelope: _envelope, data: _data, metadata: _metadata, ...rest } = task;
59
+ return rest;
60
+ };
61
+ }
44
62
  /**
45
63
  * Create a task record.
46
64
  *
@@ -104,10 +122,10 @@ async function createTask(input, auth) {
104
122
  * @param input.offset — pagination offset (default: 0)
105
123
  * @returns `{ status: 200, data: { tasks, total } }`
106
124
  */
107
- async function listTasks(input) {
125
+ async function listTasks(input, auth) {
108
126
  try {
109
- const result = await taskService.listTasks(input);
110
- return { status: 200, data: result };
127
+ const [result, view] = await Promise.all([taskService.listTasks(input), taskViewFor(auth)]);
128
+ return { status: 200, data: { ...result, tasks: result.tasks.map(view) } };
111
129
  }
112
130
  catch (err) {
113
131
  return { status: 500, error: err.message };
@@ -153,12 +171,17 @@ async function listProcesses(input) {
153
171
  * @param input.originId — root process origin ID
154
172
  * @returns `{ status: 200, data: { origin_id, tasks, escalations } }`
155
173
  */
156
- async function getProcess(input) {
174
+ async function getProcess(input, auth) {
157
175
  try {
158
- const [tasks, escalations] = await Promise.all([
176
+ const [rows, all, view] = await Promise.all([
159
177
  taskService.getProcessTasks(input.originId),
160
178
  escalationService.getEscalationsByOriginId(input.originId),
179
+ taskViewFor(auth),
161
180
  ]);
181
+ const tasks = rows.map(view);
182
+ // With a caller, only the escalations that caller may read.
183
+ const scope = auth?.userId ? await (0, helpers_1.getEscalationReadScope)(auth.userId) : null;
184
+ const escalations = scope ? all.filter((e) => (0, helpers_1.scopeAdmits)(scope, auth.userId, e)) : all;
162
185
  return {
163
186
  status: 200,
164
187
  data: { origin_id: input.originId, tasks, escalations },
@@ -174,13 +197,13 @@ async function getProcess(input) {
174
197
  * @param input.id — task UUID
175
198
  * @returns `{ status: 200, data: <task record> }` or 404
176
199
  */
177
- async function getTask(input) {
200
+ async function getTask(input, auth) {
178
201
  try {
179
202
  const task = await taskService.getTask(input.id);
180
203
  if (!task) {
181
204
  return { status: 404, error: 'Task not found' };
182
205
  }
183
- return { status: 200, data: task };
206
+ return { status: 200, data: (await taskViewFor(auth))(task) };
184
207
  }
185
208
  catch (err) {
186
209
  return { status: 500, error: err.message };
@@ -57,7 +57,7 @@ async function getWorkflowInputLookups(input, auth) {
57
57
  return { status: 404, error: 'Workflow config not found' };
58
58
  }
59
59
  const user = auth.userId ? await userService.getUser(auth.userId) : null;
60
- if (!(0, invocation_access_1.canInvokeWorkflow)(config, user?.roles ?? [], auth.role)) {
60
+ if (!(0, invocation_access_1.canInvokeWorkflow)(config, user?.roles ?? [])) {
61
61
  return { status: 403, error: 'Not authorized to invoke this workflow' };
62
62
  }
63
63
  const lookups = await (0, knowledge_1.resolveLookupRefs)(config.input_lookups ?? []);
@@ -88,9 +88,9 @@ async function listInvocableWorkflows(auth) {
88
88
  ]);
89
89
  const roles = user?.roles ?? [];
90
90
  const workflows = configs
91
- .filter((c) => (0, invocation_access_1.canInvokeWorkflow)(c, roles, auth.role))
91
+ .filter((c) => (0, invocation_access_1.canInvokeWorkflow)(c, roles))
92
92
  .map((c) => ({ ...c, tier: tierOf(c) }));
93
- if ((0, invocation_access_1.hasGlobalInvocationAccess)(roles, auth.role)) {
93
+ if ((0, invocation_access_1.hasGlobalInvocationAccess)(roles)) {
94
94
  const registered = new Set(configs.map((c) => c.workflow_type));
95
95
  for (const [name, { taskQueue }] of (0, registry_1.getRegisteredWorkers)()) {
96
96
  if (registered.has(name) || registry_1.SYSTEM_WORKFLOWS.has(name))
@@ -62,7 +62,7 @@ function isResolveError(err) {
62
62
  */
63
63
  async function invokeWorkflow(input, auth) {
64
64
  try {
65
- await (0, workflow_invocation_1.checkInvocationRoles)(input.type, auth.userId, auth.role);
65
+ await (0, workflow_invocation_1.authorizeInvocation)({ workflowType: input.type, userId: auth.userId, executeAs: input.execute_as });
66
66
  const config = await configService.getWorkflowConfig(input.type);
67
67
  const violation = await (0, input_validation_1.checkInvokeInput)(config, input.data, input.metadata);
68
68
  if (violation)
@@ -1,4 +1,4 @@
1
- import type { LTApiResult } from '../../types/sdk';
1
+ import type { LTApiAuth, LTApiResult } from '../../types/sdk';
2
2
  /**
3
3
  * Set or update the cron schedule for a YAML workflow.
4
4
  *
@@ -9,6 +9,7 @@ import type { LTApiResult } from '../../types/sdk';
9
9
  * @param input.cron_schedule — cron expression (e.g. "0 * * * *")
10
10
  * @param input.cron_envelope — optional payload passed to each scheduled invocation
11
11
  * @param input.execute_as — optional identity override for scheduled executions
12
+ * @param auth - the scheduling caller; the run identity must be able to call every built-in tool the workflow uses
12
13
  * @returns `{ status: 200, data: YamlWorkflow }` the updated workflow record with cron fields set
13
14
  */
14
15
  export declare function setCronSchedule(input: {
@@ -16,7 +17,7 @@ export declare function setCronSchedule(input: {
16
17
  cron_schedule: string;
17
18
  cron_envelope?: any;
18
19
  execute_as?: string;
19
- }): Promise<LTApiResult>;
20
+ }, auth?: LTApiAuth): Promise<LTApiResult>;
20
21
  /**
21
22
  * Remove the cron schedule from a YAML workflow.
22
23
  *
@@ -38,6 +38,7 @@ exports.clearCronSchedule = clearCronSchedule;
38
38
  exports.getCronStatus = getCronStatus;
39
39
  const yamlDb = __importStar(require("../../services/yaml-workflow/db"));
40
40
  const cron_1 = require("../../services/cron");
41
+ const deploy_1 = require("./deploy");
41
42
  const helpers_1 = require("./helpers");
42
43
  /**
43
44
  * Set or update the cron schedule for a YAML workflow.
@@ -49,14 +50,18 @@ const helpers_1 = require("./helpers");
49
50
  * @param input.cron_schedule — cron expression (e.g. "0 * * * *")
50
51
  * @param input.cron_envelope — optional payload passed to each scheduled invocation
51
52
  * @param input.execute_as — optional identity override for scheduled executions
53
+ * @param auth - the scheduling caller; the run identity must be able to call every built-in tool the workflow uses
52
54
  * @returns `{ status: 200, data: YamlWorkflow }` the updated workflow record with cron fields set
53
55
  */
54
- async function setCronSchedule(input) {
56
+ async function setCronSchedule(input, auth) {
55
57
  try {
56
58
  const wf = await yamlDb.getYamlWorkflow(input.id);
57
59
  if (!wf) {
58
60
  return { status: 404, error: 'YAML workflow not found' };
59
61
  }
62
+ const refused = await (0, deploy_1.invokeRefusal)(wf, auth, input.execute_as);
63
+ if (refused)
64
+ return refused;
60
65
  if (!input.cron_schedule || typeof input.cron_schedule !== 'string') {
61
66
  return { status: 400, error: 'cron_schedule is required' };
62
67
  }
@@ -1,3 +1,16 @@
1
+ import type { LTYamlWorkflowRecord } from '../../types/yaml-workflow';
2
+ /**
3
+ * Deploying or activating a compiled workflow needs the caller to be able to
4
+ * call every built-in tool it uses: automation never does more than its
5
+ * author may. Null when allowed; without a caller (in-process), allowed.
6
+ */
7
+ export declare function deployRefusal(wf: LTYamlWorkflowRecord, auth: LTApiAuth | undefined): Promise<LTApiResult | null>;
8
+ /**
9
+ * Invoking or scheduling a compiled workflow needs the identity it runs as
10
+ * (execute_as, else the caller) to be able to call every built-in tool it
11
+ * uses. Without a caller (in-process), allowed.
12
+ */
13
+ export declare function invokeRefusal(wf: LTYamlWorkflowRecord, auth: LTApiAuth | undefined, executeAs?: string): Promise<LTApiResult | null>;
1
14
  import type { LTApiResult, LTApiAuth } from '../../types/sdk';
2
15
  /**
3
16
  * Deploy a YAML workflow and all sibling workflows sharing its app_id namespace.
@@ -11,7 +24,7 @@ import type { LTApiResult, LTApiAuth } from '../../types/sdk';
11
24
  */
12
25
  export declare function deployYamlWorkflow(input: {
13
26
  id: string;
14
- }): Promise<LTApiResult>;
27
+ }, auth?: LTApiAuth): Promise<LTApiResult>;
15
28
  /**
16
29
  * Activate a previously deployed YAML workflow and its app_id siblings.
17
30
  *
@@ -24,7 +37,7 @@ export declare function deployYamlWorkflow(input: {
24
37
  */
25
38
  export declare function activateYamlWorkflow(input: {
26
39
  id: string;
27
- }): Promise<LTApiResult>;
40
+ }, auth?: LTApiAuth): Promise<LTApiResult>;
28
41
  /**
29
42
  * Invoke an active YAML workflow, executing its DAG pipeline.
30
43
  *
@@ -33,6 +33,8 @@ var __importStar = (this && this.__importStar) || (function () {
33
33
  };
34
34
  })();
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.deployRefusal = deployRefusal;
37
+ exports.invokeRefusal = invokeRefusal;
36
38
  exports.deployYamlWorkflow = deployYamlWorkflow;
37
39
  exports.activateYamlWorkflow = activateYamlWorkflow;
38
40
  exports.invokeYamlWorkflow = invokeYamlWorkflow;
@@ -42,6 +44,55 @@ const yamlDb = __importStar(require("../../services/yaml-workflow/db"));
42
44
  const yamlDeployer = __importStar(require("../../services/yaml-workflow/deployer"));
43
45
  const yamlWorkers = __importStar(require("../../services/yaml-workflow/workers"));
44
46
  const invoke_1 = require("../../services/yaml-workflow/invoke");
47
+ const workflow_invocation_1 = require("../../services/workflow-invocation");
48
+ const capabilities_1 = require("../../modules/capabilities");
49
+ const userService = __importStar(require("../../services/user"));
50
+ const uuid_1 = require("../../lib/uuid");
51
+ const tools_1 = require("../mcp/tools");
52
+ /**
53
+ * A refusal when the person cannot call every built-in tool these workflows'
54
+ * steps use; null when they can. Steps run as the invoker under each tool's
55
+ * gate, so this answers up front what the run would refuse step by step.
56
+ */
57
+ async function toolStepRefusal(workflows, userId) {
58
+ const access = (0, capabilities_1.capabilityAccess)({ userId });
59
+ for (const step of workflows.flatMap((w) => w.activity_manifest ?? [])) {
60
+ if (step.tool_source !== 'mcp' || !step.mcp_server_id || !step.mcp_tool_name)
61
+ continue;
62
+ const builtin = await (0, tools_1.builtinServerFor)(step.mcp_server_id);
63
+ if (builtin && !(await access((0, tools_1.builtinToolGate)(builtin, step.mcp_tool_name)))) {
64
+ return { status: 403, error: `Forbidden: this workflow calls ${step.mcp_tool_name}, which is not available to you` };
65
+ }
66
+ }
67
+ return null;
68
+ }
69
+ /**
70
+ * Deploying or activating a compiled workflow needs the caller to be able to
71
+ * call every built-in tool it uses: automation never does more than its
72
+ * author may. Null when allowed; without a caller (in-process), allowed.
73
+ */
74
+ async function deployRefusal(wf, auth) {
75
+ if (!auth?.userId)
76
+ return null;
77
+ // A deploy publishes every workflow sharing the app id, so every one is checked.
78
+ const siblings = await yamlDb.listYamlWorkflowsByAppId(wf.app_id);
79
+ return toolStepRefusal([wf, ...siblings.filter((w) => w.id !== wf.id)], auth.userId);
80
+ }
81
+ /**
82
+ * Invoking or scheduling a compiled workflow needs the identity it runs as
83
+ * (execute_as, else the caller) to be able to call every built-in tool it
84
+ * uses. Without a caller (in-process), allowed.
85
+ */
86
+ async function invokeRefusal(wf, auth, executeAs) {
87
+ if (!auth?.userId)
88
+ return null;
89
+ if (!executeAs)
90
+ return toolStepRefusal([wf], auth.userId);
91
+ const runAs = (0, uuid_1.isUuid)(executeAs) ? await userService.getUser(executeAs) : await userService.getUserByExternalId(executeAs);
92
+ if (!runAs)
93
+ return { status: 404, error: `execute_as principal "${executeAs}" not found` };
94
+ return toolStepRefusal([wf], runAs.id);
95
+ }
45
96
  const helpers_1 = require("./helpers");
46
97
  /**
47
98
  * Deploy a YAML workflow and all sibling workflows sharing its app_id namespace.
@@ -53,12 +104,15 @@ const helpers_1 = require("./helpers");
53
104
  * @param input.id — UUID of the workflow to deploy
54
105
  * @returns `{ status: 200, data: YamlWorkflow }` the refreshed workflow record after deployment
55
106
  */
56
- async function deployYamlWorkflow(input) {
107
+ async function deployYamlWorkflow(input, auth) {
57
108
  try {
58
109
  const wf = await yamlDb.getYamlWorkflow(input.id);
59
110
  if (!wf) {
60
111
  return { status: 404, error: 'YAML workflow not found' };
61
112
  }
113
+ const refused = await deployRefusal(wf, auth);
114
+ if (refused)
115
+ return refused;
62
116
  // Compute the next app-level version for the namespace.
63
117
  // Each deploy increments regardless of individual tool versions —
64
118
  // adding a second tool (v1 of itself) to an app already at v1 produces app v2.
@@ -99,12 +153,15 @@ async function deployYamlWorkflow(input) {
99
153
  * @param input.id — UUID of the workflow to activate
100
154
  * @returns `{ status: 200, data: YamlWorkflow }` the refreshed workflow record after activation
101
155
  */
102
- async function activateYamlWorkflow(input) {
156
+ async function activateYamlWorkflow(input, auth) {
103
157
  try {
104
158
  const wf = await yamlDb.getYamlWorkflow(input.id);
105
159
  if (!wf) {
106
160
  return { status: 404, error: 'YAML workflow not found' };
107
161
  }
162
+ const refused = await deployRefusal(wf, auth);
163
+ if (refused)
164
+ return refused;
108
165
  if (wf.status !== 'deployed' && wf.status !== 'active') {
109
166
  return { status: 400, error: 'Workflow must be deployed before activation' };
110
167
  }
@@ -151,6 +208,14 @@ async function invokeYamlWorkflow(input, auth) {
151
208
  if (wf.status !== 'active') {
152
209
  return { status: 400, error: 'Workflow must be active to invoke' };
153
210
  }
211
+ if (input.execute_as) {
212
+ if (!auth?.userId)
213
+ return { status: 403, error: 'execute_as requires an authenticated caller' };
214
+ await (0, workflow_invocation_1.assertMayActAs)(auth.userId, input.execute_as);
215
+ }
216
+ const refused = await invokeRefusal(wf, auth, input.execute_as);
217
+ if (refused)
218
+ return refused;
154
219
  const result = await (0, invoke_1.invokeYamlWorkflow)(wf, {
155
220
  data: input.data,
156
221
  sync: input.sync,
@@ -161,6 +226,8 @@ async function invokeYamlWorkflow(input, auth) {
161
226
  return { status: 200, data: result };
162
227
  }
163
228
  catch (err) {
229
+ if (err instanceof workflow_invocation_1.InvocationError)
230
+ return { status: err.statusCode, error: err.message };
164
231
  if ((0, helpers_1.isNotFoundError)(err)) {
165
232
  return { status: 404, error: 'YAML workflow not found' };
166
233
  }
@@ -0,0 +1,46 @@
1
+ -- Migration 038: OAuth authorization server for /mcp
2
+ --
3
+ -- MCP clients register, a person consents to a grant, and the client holds a
4
+ -- refresh token for that grant. Access tokens are self-contained JWTs and are
5
+ -- never stored. Codes and refresh tokens are stored as SHA-256 hashes.
6
+
7
+ CREATE TABLE IF NOT EXISTS lt_oauth_clients (
8
+ client_id TEXT PRIMARY KEY,
9
+ client_name TEXT,
10
+ redirect_uris TEXT[] NOT NULL,
11
+ created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
12
+ );
13
+
14
+ -- A grant is one person's consent for one client. The policy is the rights
15
+ -- the person chose (a preset today); the scope is its coarse summary.
16
+ CREATE TABLE IF NOT EXISTS lt_oauth_grants (
17
+ id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
18
+ user_id UUID NOT NULL REFERENCES lt_users(id) ON DELETE CASCADE,
19
+ client_id TEXT NOT NULL REFERENCES lt_oauth_clients(client_id) ON DELETE CASCADE,
20
+ policy JSONB NOT NULL,
21
+ scope TEXT NOT NULL,
22
+ created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
23
+ revoked_at TIMESTAMPTZ
24
+ );
25
+
26
+ CREATE INDEX IF NOT EXISTS idx_lt_oauth_grants_user ON lt_oauth_grants (user_id);
27
+
28
+ CREATE TABLE IF NOT EXISTS lt_oauth_codes (
29
+ code_hash TEXT PRIMARY KEY,
30
+ grant_id UUID NOT NULL REFERENCES lt_oauth_grants(id) ON DELETE CASCADE,
31
+ redirect_uri TEXT NOT NULL,
32
+ code_challenge TEXT NOT NULL,
33
+ resource TEXT,
34
+ expires_at TIMESTAMPTZ NOT NULL,
35
+ used_at TIMESTAMPTZ
36
+ );
37
+
38
+ CREATE TABLE IF NOT EXISTS lt_oauth_refresh_tokens (
39
+ token_hash TEXT PRIMARY KEY,
40
+ grant_id UUID NOT NULL REFERENCES lt_oauth_grants(id) ON DELETE CASCADE,
41
+ expires_at TIMESTAMPTZ NOT NULL,
42
+ used_at TIMESTAMPTZ,
43
+ created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
44
+ );
45
+
46
+ CREATE INDEX IF NOT EXISTS idx_lt_oauth_refresh_tokens_grant ON lt_oauth_refresh_tokens (grant_id);
@@ -0,0 +1,12 @@
1
+ -- Migration 039: single-use NATS WebSocket proxy tickets
2
+ --
3
+ -- A ticket admits one upgrade. The proxy records its id here when it is
4
+ -- spent; a second upgrade with the same ticket finds the row and is refused.
5
+ -- Rows are kept until the ticket expires.
6
+
7
+ CREATE TABLE IF NOT EXISTS lt_nats_ws_tickets (
8
+ jti TEXT PRIMARY KEY,
9
+ expires_at TIMESTAMPTZ NOT NULL
10
+ );
11
+
12
+ CREATE INDEX IF NOT EXISTS idx_lt_nats_ws_tickets_expires ON lt_nats_ws_tickets (expires_at);
@@ -0,0 +1,20 @@
1
+ import type { LTEvent } from '../../types';
2
+ /** Escalation event fields a browser needs to route a refresh and follow a claim. */
3
+ export declare const BROWSER_ESCALATION_FIELDS: readonly ["id", "type", "subtype", "status", "priority", "role", "assigned_to", "assigned_until", "workflow_id", "workflow_type", "origin_id", "task_id", "parent_id", "resolved_at", "claimed_at", "bulk", "from_role", "to_role", "reassigned_from"];
4
+ export interface BrowserViewer {
5
+ builder: boolean;
6
+ }
7
+ /** The event as this viewer receives it. */
8
+ export declare function eventForViewer(event: LTEvent, viewer: BrowserViewer): LTEvent;
9
+ /**
10
+ * Rewrite one serialized event for a viewer who is not a builder. A payload
11
+ * that is not an event is withheld (null).
12
+ */
13
+ export declare function payloadForViewer(payload: Buffer, viewer: BrowserViewer): Buffer | null;
14
+ /** Whether a person is a builder, looked up lazily to keep lib free of an import cycle. */
15
+ export declare function viewerFor(userId: string | null | undefined): Promise<BrowserViewer>;
16
+ /**
17
+ * How a connection holder sees events, or null when the account is gone or
18
+ * not active. Looked up lazily to keep lib free of an import cycle.
19
+ */
20
+ export declare function holderView(userId: string): Promise<BrowserViewer | null>;
@@ -0,0 +1,117 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.BROWSER_ESCALATION_FIELDS = void 0;
37
+ exports.eventForViewer = eventForViewer;
38
+ exports.payloadForViewer = payloadForViewer;
39
+ exports.viewerFor = viewerFor;
40
+ exports.holderView = holderView;
41
+ /**
42
+ * What a browser receives of an event. Builders receive events whole. Anyone
43
+ * else receives enough to route and refresh: escalation events keep their
44
+ * routing fields, and every other event arrives without `data` and
45
+ * `milestones`. Full records are read through the scoped API, by id.
46
+ *
47
+ * Server-side consumers (agent triggers, callbacks) are unaffected: this view
48
+ * applies only where events leave for a browser.
49
+ */
50
+ const ESCALATION_SUBJECT = 'system.escalation.';
51
+ const ACTIVE_ACCOUNT = 'active';
52
+ /** Escalation event fields a browser needs to route a refresh and follow a claim. */
53
+ exports.BROWSER_ESCALATION_FIELDS = [
54
+ 'id', 'type', 'subtype', 'status', 'priority', 'role',
55
+ 'assigned_to', 'assigned_until', 'workflow_id', 'workflow_type',
56
+ 'origin_id', 'task_id', 'parent_id', 'resolved_at', 'claimed_at',
57
+ 'bulk', 'from_role', 'to_role', 'reassigned_from',
58
+ ];
59
+ /** The event as this viewer receives it. */
60
+ function eventForViewer(event, viewer) {
61
+ if (viewer.builder)
62
+ return event;
63
+ const { data, milestones: _milestones, ...rest } = event;
64
+ if (typeof event.type === 'string' && event.type.startsWith(ESCALATION_SUBJECT) && data) {
65
+ const kept = {};
66
+ for (const key of exports.BROWSER_ESCALATION_FIELDS) {
67
+ if (data[key] !== undefined)
68
+ kept[key] = data[key];
69
+ }
70
+ return { ...rest, data: kept };
71
+ }
72
+ return rest;
73
+ }
74
+ /**
75
+ * Rewrite one serialized event for a viewer who is not a builder. A payload
76
+ * that is not an event is withheld (null).
77
+ */
78
+ function payloadForViewer(payload, viewer) {
79
+ if (viewer.builder)
80
+ return payload;
81
+ let event;
82
+ try {
83
+ event = JSON.parse(payload.toString('utf8'));
84
+ }
85
+ catch {
86
+ return null;
87
+ }
88
+ if (!event || typeof event !== 'object' || typeof event.type !== 'string')
89
+ return null;
90
+ return Buffer.from(JSON.stringify(eventForViewer(event, viewer)), 'utf8');
91
+ }
92
+ /** Whether a person is a builder, looked up lazily to keep lib free of an import cycle. */
93
+ async function viewerFor(userId) {
94
+ if (!userId)
95
+ return { builder: false };
96
+ try {
97
+ const { mayBuild } = await Promise.resolve().then(() => __importStar(require('../../modules/capabilities')));
98
+ return { builder: await mayBuild({ userId }) };
99
+ }
100
+ catch {
101
+ return { builder: false };
102
+ }
103
+ }
104
+ /**
105
+ * How a connection holder sees events, or null when the account is gone or
106
+ * not active. Looked up lazily to keep lib free of an import cycle.
107
+ */
108
+ async function holderView(userId) {
109
+ const [{ getUser, getUserByExternalId }, { isUuid }] = await Promise.all([
110
+ Promise.resolve().then(() => __importStar(require('../../services/user'))),
111
+ Promise.resolve().then(() => __importStar(require('../uuid'))),
112
+ ]);
113
+ const user = isUuid(userId) ? await getUser(userId) : await getUserByExternalId(userId);
114
+ if (!user || user.status !== ACTIVE_ACCOUNT)
115
+ return null;
116
+ return viewerFor(user.id);
117
+ }
@@ -0,0 +1,29 @@
1
+ /**
2
+ * The browser's half of a NATS connection, as the WebSocket proxy forwards
3
+ * it. A browser only subscribes, so the proxy authenticates the connection
4
+ * itself and lets the browser read, never publish:
5
+ *
6
+ * - CONNECT is rewritten to carry the server's credential (the browser is
7
+ * never given it), keeping the client's other options.
8
+ * - SUB, UNSUB, PING and PONG are forwarded, rebuilt from their parsed fields.
9
+ * - Any other operation, PUB and HPUB included, marks the stream malformed
10
+ * and the proxy closes the connection.
11
+ *
12
+ * The filter reads lines as nats-server does: fields split on spaces or tabs,
13
+ * and a line ends at LF with or without a preceding CR. Operations can span
14
+ * WebSocket frames, so the filter keeps whatever it has not yet seen whole.
15
+ */
16
+ export declare class NatsClientFilter {
17
+ private readonly authToken;
18
+ private pending;
19
+ private failed;
20
+ constructor(authToken: string | null);
21
+ /** Whether the stream was malformed; the proxy closes the connection. */
22
+ get malformed(): boolean;
23
+ /** The bytes to forward upstream for one chunk from the browser. */
24
+ feed(chunk: Buffer): Buffer;
25
+ private fail;
26
+ /** The line to forward, or null to forward nothing. */
27
+ private filterLine;
28
+ private rewriteConnect;
29
+ }