@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
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const http_1 = require("../../lib/http");
7
+ const oauth_server_1 = require("../../modules/oauth-server");
8
+ const metadata_1 = require("../../services/auth/oauth-server/metadata");
9
+ const registration_1 = __importDefault(require("./registration"));
10
+ const authorize_1 = __importDefault(require("./authorize"));
11
+ const token_1 = __importDefault(require("./token"));
12
+ const grants_1 = __importDefault(require("./grants"));
13
+ /**
14
+ * OAuth authorization server endpoints under /api/oauth. The public ones
15
+ * (metadata, register, token, revoke) take no Long Tail session and allow
16
+ * any origin. The consent endpoints take the person's dashboard session.
17
+ * Every endpoint answers 404 until the server is configured.
18
+ */
19
+ const router = (0, http_1.Router)();
20
+ router.use((_req, res, next) => {
21
+ if (!(0, oauth_server_1.getOAuthServerSettings)()) {
22
+ res.status(404).json({ error: 'not_found' });
23
+ return;
24
+ }
25
+ next();
26
+ });
27
+ /**
28
+ * GET /api/oauth/metadata
29
+ * The authorization server metadata, for clients that do not use the
30
+ * well-known document.
31
+ */
32
+ router.get('/metadata', (0, http_1.allowAnyOrigin)(['GET']), (_req, res) => {
33
+ res.json((0, metadata_1.authorizationServerMetadata)((0, oauth_server_1.getOAuthServerSettings)()));
34
+ });
35
+ router.use(registration_1.default);
36
+ router.use(authorize_1.default);
37
+ router.use(token_1.default);
38
+ router.use(grants_1.default);
39
+ /**
40
+ * Anything an endpoint did not answer itself answers in the RFC 6749 error
41
+ * shape: a body that does not parse is the client's error, anything else the
42
+ * server's. No message or stack reaches the client.
43
+ */
44
+ router.use((err, _req, res, _next) => {
45
+ if (res.headersSent)
46
+ return;
47
+ const malformed = err?.type === 'entity.parse.failed' || err?.status === 400;
48
+ res.status(malformed ? 400 : 500).json(malformed
49
+ ? { error: 'invalid_request', error_description: 'the request body is malformed' }
50
+ : { error: 'server_error', error_description: 'the request could not be completed' });
51
+ });
52
+ exports.default = router;
@@ -0,0 +1,2 @@
1
+ declare const router: import("express-serve-static-core").Router;
2
+ export default router;
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const http_1 = require("../../lib/http");
4
+ const oauth_server_1 = require("../../modules/oauth-server");
5
+ const defaults_1 = require("../../modules/defaults");
6
+ const oauth_server_2 = require("../../services/auth/oauth-server");
7
+ const registration_1 = require("../../services/auth/oauth-server/registration");
8
+ const router = (0, http_1.Router)();
9
+ const limiter = new registration_1.RegistrationLimiter(defaults_1.OAUTH_REGISTRATIONS_PER_WINDOW, defaults_1.OAUTH_REGISTRATION_WINDOW_SECONDS * 1000);
10
+ /**
11
+ * POST /api/oauth/register
12
+ * Dynamic client registration (RFC 7591) for public clients.
13
+ * Body: { redirect_uris, client_name?, grant_types?, response_types?, token_endpoint_auth_method? }
14
+ */
15
+ router.options('/register', (0, http_1.allowAnyOrigin)(['POST']));
16
+ router.post('/register', (0, http_1.allowAnyOrigin)(['POST']), async (req, res) => {
17
+ if (!limiter.allow((0, registration_1.registrationAddressKey)(req.ip ?? 'unknown'))) {
18
+ res.status(429).json({ error: 'rate_limited', error_description: 'too many client registrations; try again later' });
19
+ return;
20
+ }
21
+ const settings = (0, oauth_server_1.getOAuthServerSettings)();
22
+ const checked = (0, registration_1.validateClientMetadata)(req.body, settings.allowedRedirectUris);
23
+ if (!checked.ok) {
24
+ res.status(400).json({ error: checked.error, error_description: checked.description });
25
+ return;
26
+ }
27
+ const client = await (0, oauth_server_2.registerClient)({ clientName: checked.clientName, redirectUris: checked.redirectUris });
28
+ res.status(201).json({
29
+ client_id: client.client_id,
30
+ client_id_issued_at: Math.floor(new Date(client.created_at).getTime() / 1000),
31
+ client_name: client.client_name ?? undefined,
32
+ redirect_uris: client.redirect_uris,
33
+ grant_types: ['authorization_code', 'refresh_token'],
34
+ response_types: ['code'],
35
+ token_endpoint_auth_method: 'none',
36
+ });
37
+ });
38
+ exports.default = router;
@@ -0,0 +1,2 @@
1
+ declare const router: import("express-serve-static-core").Router;
2
+ export default router;
@@ -0,0 +1,100 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const http_1 = require("../../lib/http");
4
+ const oauth_server_1 = require("../../modules/oauth-server");
5
+ const defaults_1 = require("../../modules/defaults");
6
+ const oauth_server_2 = require("../../services/auth/oauth-server");
7
+ const registration_1 = require("../../services/auth/oauth-server/registration");
8
+ const router = (0, http_1.Router)();
9
+ /**
10
+ * A form field, taking the first value when the host parsed repeats into an
11
+ * array. A value carrying a control character is treated as absent: no
12
+ * token, id or URI contains one.
13
+ */
14
+ function field(body, name) {
15
+ const value = body?.[name];
16
+ const first = Array.isArray(value) ? value[0] : value;
17
+ return typeof first === 'string' && first !== '' && !(0, registration_1.hasControlCharacters)(first) ? first : undefined;
18
+ }
19
+ /** RFC 7636 §4.1: 43 to 128 unreserved characters. */
20
+ const CODE_VERIFIER = /^[A-Za-z0-9._~-]{43,128}$/;
21
+ function tokenError(res, error, description) {
22
+ res.status(400).json({ error, error_description: description });
23
+ }
24
+ function sendTokens(res, snapshot, refreshToken) {
25
+ const settings = (0, oauth_server_1.getOAuthServerSettings)();
26
+ const { token, expiresIn } = (0, oauth_server_2.signAccessToken)(snapshot, { issuer: settings.issuer, audience: settings.resource });
27
+ res.json({ access_token: token, token_type: 'Bearer', expires_in: expiresIn, refresh_token: refreshToken, scope: snapshot.scope });
28
+ }
29
+ const tokenEndpoint = [(0, http_1.allowAnyOrigin)(['POST']), (0, http_1.formBody)()];
30
+ /**
31
+ * POST /api/oauth/token
32
+ * grant_type=authorization_code: code, redirect_uri, client_id, code_verifier
33
+ * grant_type=refresh_token: refresh_token, client_id
34
+ * Returns { access_token, token_type, expires_in, refresh_token, scope }.
35
+ */
36
+ router.options('/token', (0, http_1.allowAnyOrigin)(['POST']));
37
+ router.post('/token', ...tokenEndpoint, async (req, res) => {
38
+ res.setHeader('Cache-Control', 'no-store');
39
+ res.setHeader('Pragma', 'no-cache');
40
+ const settings = (0, oauth_server_1.getOAuthServerSettings)();
41
+ const grantType = field(req.body, 'grant_type');
42
+ const clientId = field(req.body, 'client_id');
43
+ if (!clientId)
44
+ return tokenError(res, 'invalid_request', 'client_id is required');
45
+ if (grantType === 'authorization_code') {
46
+ const code = field(req.body, 'code');
47
+ const redirectUri = field(req.body, 'redirect_uri');
48
+ const codeVerifier = field(req.body, 'code_verifier');
49
+ if (!code || !redirectUri || !codeVerifier) {
50
+ return tokenError(res, 'invalid_request', 'code, redirect_uri and code_verifier are required');
51
+ }
52
+ if (!CODE_VERIFIER.test(codeVerifier)) {
53
+ return tokenError(res, 'invalid_request', 'code_verifier must be 43 to 128 unreserved characters');
54
+ }
55
+ const resource = field(req.body, 'resource');
56
+ if (resource !== undefined && resource !== settings.resource) {
57
+ return tokenError(res, 'invalid_target', `resource must be ${settings.resource}`);
58
+ }
59
+ const exchanged = await (0, oauth_server_2.exchangeAuthorizationCode)({
60
+ code, clientId, redirectUri, codeVerifier, refreshTtlSeconds: defaults_1.OAUTH_REFRESH_TOKEN_TTL_SECONDS,
61
+ });
62
+ if (!exchanged)
63
+ return tokenError(res, 'invalid_grant', 'the authorization code is invalid, expired or already used');
64
+ return sendTokens(res, exchanged.snapshot, exchanged.refreshToken);
65
+ }
66
+ if (grantType === 'refresh_token') {
67
+ const refreshToken = field(req.body, 'refresh_token');
68
+ if (!refreshToken)
69
+ return tokenError(res, 'invalid_request', 'refresh_token is required');
70
+ const rotated = await (0, oauth_server_2.rotateRefreshToken)({ refreshToken, clientId, refreshTtlSeconds: defaults_1.OAUTH_REFRESH_TOKEN_TTL_SECONDS });
71
+ if (rotated.snapshot === null) {
72
+ return tokenError(res, 'invalid_grant', 'the refresh token is invalid, expired or revoked');
73
+ }
74
+ return sendTokens(res, rotated.snapshot, rotated.refreshToken);
75
+ }
76
+ return tokenError(res, 'unsupported_grant_type', 'grant_type must be authorization_code or refresh_token');
77
+ });
78
+ /**
79
+ * POST /api/oauth/revoke
80
+ * Token revocation (RFC 7009): a refresh token or an access token, with the
81
+ * client_id that holds it. Revokes the whole grant. Always answers 200.
82
+ */
83
+ router.options('/revoke', (0, http_1.allowAnyOrigin)(['POST']));
84
+ router.post('/revoke', ...tokenEndpoint, async (req, res) => {
85
+ const settings = (0, oauth_server_1.getOAuthServerSettings)();
86
+ const token = field(req.body, 'token');
87
+ const clientId = field(req.body, 'client_id');
88
+ if (token && clientId) {
89
+ const claims = (0, oauth_server_2.verifyAccessToken)(token, { issuer: settings.issuer, audience: settings.resource });
90
+ if (claims) {
91
+ if (claims.client_id === clientId)
92
+ await (0, oauth_server_2.revokeGrant)(claims.gid);
93
+ }
94
+ else {
95
+ await (0, oauth_server_2.revokeByRefreshToken)(token, clientId);
96
+ }
97
+ }
98
+ res.status(200).end();
99
+ });
100
+ exports.default = router;
@@ -0,0 +1,8 @@
1
+ import { Router } from '../lib/http';
2
+ /**
3
+ * The two OAuth well-known documents, mounted at the host's root. Answers
4
+ * exactly those paths and passes every other request on, so it never shadows
5
+ * the host's routes. Paths are computed per request because the issuer is
6
+ * configured after the router is mounted.
7
+ */
8
+ export declare function createWellKnownRouter(): Router;
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createWellKnownRouter = createWellKnownRouter;
4
+ const http_1 = require("../lib/http");
5
+ const oauth_server_1 = require("../modules/oauth-server");
6
+ const metadata_1 = require("../services/auth/oauth-server/metadata");
7
+ /**
8
+ * The two OAuth well-known documents, mounted at the host's root. Answers
9
+ * exactly those paths and passes every other request on, so it never shadows
10
+ * the host's routes. Paths are computed per request because the issuer is
11
+ * configured after the router is mounted.
12
+ */
13
+ function createWellKnownRouter() {
14
+ const router = (0, http_1.Router)();
15
+ const cors = (0, http_1.allowAnyOrigin)(['GET']);
16
+ router.use((req, res, next) => {
17
+ const settings = (0, oauth_server_1.getOAuthServerSettings)();
18
+ if (!settings || (req.method !== 'GET' && req.method !== 'OPTIONS'))
19
+ return next();
20
+ const paths = (0, metadata_1.wellKnownPaths)(settings);
21
+ const document = req.path === paths.authorizationServer
22
+ ? (0, metadata_1.authorizationServerMetadata)(settings)
23
+ : req.path === paths.protectedResource
24
+ ? (0, metadata_1.protectedResourceMetadata)(settings)
25
+ : null;
26
+ if (!document)
27
+ return next();
28
+ cors(req, res, () => res.json(document));
29
+ });
30
+ return router;
31
+ }
@@ -1,12 +1,12 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.setOAuthConfig = setOAuthConfig;
4
- const express_1 = require("express");
4
+ const http_1 = require("../lib/http");
5
5
  const auth_1 = require("../modules/auth");
6
6
  const logger_1 = require("../lib/logger");
7
7
  const oauth_1 = require("../services/oauth");
8
8
  const user_1 = require("../services/user");
9
- const router = (0, express_1.Router)();
9
+ const router = (0, http_1.Router)();
10
10
  // ── OAuth startup config (set by initializeOAuth) ────────────────────────────
11
11
  let _oauthConfig = {
12
12
  autoProvision: true,
@@ -33,9 +33,9 @@ var __importStar = (this && this.__importStar) || (function () {
33
33
  };
34
34
  })();
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
- const express_1 = require("express");
36
+ const http_1 = require("../lib/http");
37
37
  const api = __importStar(require("../api/overview"));
38
- const router = (0, express_1.Router)();
38
+ const router = (0, http_1.Router)();
39
39
  /**
40
40
  * GET /api/overview?period=24h
41
41
  * System overview — triage, throughput, trends, infrastructure, processes.
@@ -33,10 +33,10 @@ var __importStar = (this && this.__importStar) || (function () {
33
33
  };
34
34
  })();
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
- const express_1 = require("express");
36
+ const http_1 = require("../lib/http");
37
37
  const auth_1 = require("../modules/auth");
38
38
  const api = __importStar(require("../api/personas"));
39
- const router = (0, express_1.Router)();
39
+ const router = (0, http_1.Router)();
40
40
  // Personas are role bundles — a management surface. Reads and writes share the
41
41
  // role-management gate (admin type, superadmin, engineer), the same audience
42
42
  // that manages roles and users.
@@ -33,9 +33,10 @@ var __importStar = (this && this.__importStar) || (function () {
33
33
  };
34
34
  })();
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
- const express_1 = require("express");
36
+ const http_1 = require("../lib/http");
37
+ const auth_1 = require("../modules/auth");
37
38
  const api = __importStar(require("../api/pipelines"));
38
- const router = (0, express_1.Router)();
39
+ const router = (0, http_1.Router)();
39
40
  // ── Routes ───────────────────────────────────────────────────────────────────
40
41
  /**
41
42
  * GET /api/pipelines/entities
@@ -71,7 +72,7 @@ router.get('/', async (req, res) => {
71
72
  */
72
73
  router.get('/:jobId/execution', async (req, res) => {
73
74
  const result = await api.getJobExecution({
74
- jobId: req.params.jobId,
75
+ jobId: String(req.params.jobId),
75
76
  app_id: req.query.app_id,
76
77
  });
77
78
  res.status(result.status).json(result.data ?? { error: result.error });
@@ -81,9 +82,9 @@ router.get('/:jobId/execution', async (req, res) => {
81
82
  * Interrupt a running pipeline job via HotMesh.interrupt().
82
83
  * Body: { topic, app_id }
83
84
  */
84
- router.post('/:jobId/interrupt', async (req, res) => {
85
+ router.post('/:jobId/interrupt', auth_1.requireBuilder, async (req, res) => {
85
86
  const result = await api.interruptJob({
86
- jobId: req.params.jobId,
87
+ jobId: String(req.params.jobId),
87
88
  topic: req.body.topic,
88
89
  app_id: req.body.app_id,
89
90
  });
@@ -33,10 +33,10 @@ var __importStar = (this && this.__importStar) || (function () {
33
33
  };
34
34
  })();
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
- const express_1 = require("express");
36
+ const http_1 = require("../lib/http");
37
37
  const auth_1 = require("../modules/auth");
38
38
  const api = __importStar(require("../api/roles"));
39
- const router = (0, express_1.Router)();
39
+ const router = (0, http_1.Router)();
40
40
  /**
41
41
  * GET /api/roles
42
42
  * List all distinct roles known to the system.
@@ -33,10 +33,10 @@ var __importStar = (this && this.__importStar) || (function () {
33
33
  };
34
34
  })();
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
- const express_1 = require("express");
36
+ const http_1 = require("../lib/http");
37
37
  const api = __importStar(require("../api/scan-codes"));
38
38
  const auth_1 = require("../modules/auth");
39
- const router = (0, express_1.Router)();
39
+ const router = (0, http_1.Router)();
40
40
  // ── Execute ───────────────────────────────────────────────────────────────
41
41
  /**
42
42
  * POST /api/scan-codes/execute
@@ -34,10 +34,10 @@ var __importStar = (this && this.__importStar) || (function () {
34
34
  })();
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
36
  const crypto_1 = require("crypto");
37
- const express_1 = require("express");
37
+ const http_1 = require("../lib/http");
38
38
  const api = __importStar(require("../api/settings"));
39
39
  const branding_1 = require("../modules/branding");
40
- const router = (0, express_1.Router)();
40
+ const router = (0, http_1.Router)();
41
41
  /**
42
42
  * GET /api/settings
43
43
  * Returns frontend-relevant configuration (no secrets).
@@ -33,9 +33,9 @@ var __importStar = (this && this.__importStar) || (function () {
33
33
  };
34
34
  })();
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
- const express_1 = require("express");
36
+ const http_1 = require("../lib/http");
37
37
  const api = __importStar(require("../api/tasks"));
38
- const router = (0, express_1.Router)();
38
+ const router = (0, http_1.Router)();
39
39
  /**
40
40
  * POST /api/tasks
41
41
  * Create a new task record.
@@ -74,7 +74,7 @@ router.get('/', async (req, res) => {
74
74
  origin_id: req.query.origin_id,
75
75
  limit: req.query.limit ? parseInt(req.query.limit, 10) : undefined,
76
76
  offset: req.query.offset ? parseInt(req.query.offset, 10) : undefined,
77
- });
77
+ }, req.auth);
78
78
  res.status(result.status).json(result.data ?? { error: result.error });
79
79
  });
80
80
  /**
@@ -106,7 +106,7 @@ router.get('/processes', async (req, res) => {
106
106
  * Get all tasks and escalations for a process (origin_id).
107
107
  */
108
108
  router.get('/processes/:originId', async (req, res) => {
109
- const result = await api.getProcess({ originId: req.params.originId });
109
+ const result = await api.getProcess({ originId: req.params.originId }, req.auth);
110
110
  res.status(result.status).json(result.data ?? { error: result.error });
111
111
  });
112
112
  /**
@@ -114,7 +114,7 @@ router.get('/processes/:originId', async (req, res) => {
114
114
  * Get a single task by ID.
115
115
  */
116
116
  router.get('/:id', async (req, res) => {
117
- const result = await api.getTask({ id: req.params.id });
117
+ const result = await api.getTask({ id: req.params.id }, req.auth);
118
118
  res.status(result.status).json(result.data ?? { error: result.error });
119
119
  });
120
120
  exports.default = router;
@@ -33,9 +33,16 @@ var __importStar = (this && this.__importStar) || (function () {
33
33
  };
34
34
  })();
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
- const express_1 = require("express");
36
+ const http_1 = require("../lib/http");
37
37
  const api = __importStar(require("../api/topics"));
38
- const router = (0, express_1.Router)();
38
+ const auth_1 = require("../modules/auth");
39
+ const user_1 = require("../services/user");
40
+ /**
41
+ * Subjects the platform itself publishes and acts on (agent triggers, system
42
+ * lifecycle). Only a superadmin may publish one over REST.
43
+ */
44
+ const RESERVED_SUBJECT_PREFIXES = ['system.', 'agent.'];
45
+ const router = (0, http_1.Router)();
39
46
  /**
40
47
  * GET /api/topics
41
48
  * List topics with optional filters.
@@ -54,7 +61,7 @@ router.get('/', async (req, res) => {
54
61
  * POST /api/topics
55
62
  * Register a new topic in the catalog.
56
63
  */
57
- router.post('/', async (req, res) => {
64
+ router.post('/', auth_1.requireBuilder, async (req, res) => {
58
65
  const { topic, category } = req.body;
59
66
  if (!topic || !category) {
60
67
  res.status(400).json({ error: 'topic and category are required' });
@@ -75,26 +82,31 @@ router.get('/by-name/:topic', async (req, res) => {
75
82
  * PUT /api/topics/by-name/:topic
76
83
  * Update a topic in the catalog.
77
84
  */
78
- router.put('/by-name/:topic', async (req, res) => {
79
- const result = await api.updateTopic({ topic: decodeURIComponent(req.params.topic), ...req.body });
85
+ router.put('/by-name/:topic', auth_1.requireBuilder, async (req, res) => {
86
+ const result = await api.updateTopic({ ...req.body, topic: decodeURIComponent(String(req.params.topic)) });
80
87
  res.status(result.status).json(result.data ?? { error: result.error });
81
88
  });
82
89
  /**
83
90
  * DELETE /api/topics/by-name/:topic
84
91
  * Delete a topic from the catalog (system topics are protected).
85
92
  */
86
- router.delete('/by-name/:topic', async (req, res) => {
87
- const result = await api.deleteTopic({ topic: decodeURIComponent(req.params.topic) });
93
+ router.delete('/by-name/:topic', auth_1.requireBuilder, async (req, res) => {
94
+ const result = await api.deleteTopic({ topic: decodeURIComponent(String(req.params.topic)) });
88
95
  res.status(result.status).json(result.data ?? { error: result.error });
89
96
  });
90
97
  /**
91
98
  * POST /api/topics/by-name/:topic/publish
92
99
  * Publish a test event to the event bus with the given topic and payload.
93
100
  */
94
- router.post('/by-name/:topic/publish', async (req, res) => {
101
+ router.post('/by-name/:topic/publish', auth_1.requireBuilder, async (req, res) => {
95
102
  // The request body IS the event envelope (Partial<LTEvent> + optional subject).
103
+ const subject = String(req.body?.subject || decodeURIComponent(String(req.params.topic)));
104
+ if (RESERVED_SUBJECT_PREFIXES.some((prefix) => subject.startsWith(prefix)) && !(await (0, user_1.isSuperAdmin)(req.auth.userId))) {
105
+ res.status(403).json({ error: 'Forbidden: only superadmin can publish a system subject' });
106
+ return;
107
+ }
96
108
  const result = await api.publishTopic({
97
- topic: decodeURIComponent(req.params.topic),
109
+ topic: decodeURIComponent(String(req.params.topic)),
98
110
  event: (req.body ?? {}),
99
111
  });
100
112
  res.status(result.status).json(result.data ?? { error: result.error });
@@ -33,11 +33,19 @@ var __importStar = (this && this.__importStar) || (function () {
33
33
  };
34
34
  })();
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
- const express_1 = require("express");
36
+ const http_1 = require("../lib/http");
37
37
  const auth_1 = require("../modules/auth");
38
+ const capabilities_1 = require("../modules/capabilities");
38
39
  const api = __importStar(require("../api/users"));
39
40
  const personasApi = __importStar(require("../api/personas"));
40
- const router = (0, express_1.Router)();
41
+ const router = (0, http_1.Router)();
42
+ /** Answer a refused decision with 403; true when the request may go on. */
43
+ function allowed(decision, res) {
44
+ if (decision.allowed)
45
+ return true;
46
+ res.status(403).json({ error: decision.error });
47
+ return false;
48
+ }
41
49
  // ── User CRUD ─────────────────────────────────────────────────────────────────
42
50
  /**
43
51
  * GET /api/users
@@ -88,6 +96,8 @@ router.get('/:id', async (req, res) => {
88
96
  * Body: { external_id, email?, display_name?, roles?: [{ role, type }], metadata? }
89
97
  */
90
98
  router.post('/', auth_1.requireBuilder, async (req, res) => {
99
+ if (!allowed(await (0, capabilities_1.mayGrantRoles)(req.auth.userId, (req.body || {}).roles), res))
100
+ return;
91
101
  const result = await api.createUser(req.body || {});
92
102
  res.status(result.status).json(result.data ?? { error: result.error });
93
103
  });
@@ -97,6 +107,8 @@ router.post('/', auth_1.requireBuilder, async (req, res) => {
97
107
  * Body: { email?, display_name?, status?, metadata? }
98
108
  */
99
109
  router.put('/:id', auth_1.requireBuilder, async (req, res) => {
110
+ if (!allowed(await (0, capabilities_1.mayManageAccount)(req.auth.userId, String(req.params.id)), res))
111
+ return;
100
112
  const result = await api.updateUser({ id: req.params.id, ...(req.body || {}) });
101
113
  res.status(result.status).json(result.data ?? { error: result.error });
102
114
  });
@@ -107,6 +119,8 @@ router.put('/:id', auth_1.requireBuilder, async (req, res) => {
107
119
  * Body: { set?: { key: value }, remove?: [key], rename?: { old: new } }
108
120
  */
109
121
  router.patch('/:id/properties', auth_1.requireBuilder, async (req, res) => {
122
+ if (!allowed(await (0, capabilities_1.mayManageAccount)(req.auth.userId, String(req.params.id)), res))
123
+ return;
110
124
  const { set, remove, rename } = req.body || {};
111
125
  const result = await api.patchUserProperties({
112
126
  id: req.params.id,
@@ -121,6 +135,8 @@ router.patch('/:id/properties', auth_1.requireBuilder, async (req, res) => {
121
135
  * Delete a user. Builder only.
122
136
  */
123
137
  router.delete('/:id', auth_1.requireBuilder, async (req, res) => {
138
+ if (!allowed(await (0, capabilities_1.mayManageAccount)(req.auth.userId, String(req.params.id)), res))
139
+ return;
124
140
  const result = await api.deleteUser({ id: req.params.id });
125
141
  res.status(result.status).json(result.data ?? { error: result.error });
126
142
  });
@@ -148,26 +164,10 @@ router.get('/:id/roles', async (req, res) => {
148
164
  */
149
165
  router.post('/:id/roles', auth_1.requireAdmin, async (req, res) => {
150
166
  const { role, type, read_scope, write_scope } = req.body || {};
151
- const userId = req.auth.userId;
152
- // Superadmin bypasses all scoping
153
- const { isSuperAdmin } = await Promise.resolve().then(() => __importStar(require('../services/user/rbac')));
154
- if (!(await isSuperAdmin(userId))) {
155
- // Non-superadmin can never assign superadmin type
156
- if (type === 'superadmin') {
157
- res.status(403).json({ error: 'Only superadmin can assign superadmin role type' });
158
- return;
159
- }
160
- // Check if caller has the engineer role (builder) — can assign any non-superadmin role
161
- const { hasRole: checkRole } = await Promise.resolve().then(() => __importStar(require('../services/user/roles')));
162
- const isEngineer = await checkRole(userId, 'engineer');
163
- if (!isEngineer) {
164
- // Non-builder admin: can only assign roles they themselves hold
165
- const callerHasRole = await checkRole(userId, role);
166
- if (!callerHasRole) {
167
- res.status(403).json({ error: `You can only assign roles you hold. You do not have the '${role}' role.` });
168
- return;
169
- }
170
- }
167
+ const decision = await (0, capabilities_1.mayGrantRole)(req.auth.userId, { role, type });
168
+ if (!decision.allowed) {
169
+ res.status(403).json({ error: decision.error });
170
+ return;
171
171
  }
172
172
  const result = await api.addUserRole({ id: req.params.id, role, type, read_scope, write_scope });
173
173
  res.status(result.status).json(result.data ?? { error: result.error });
@@ -177,6 +177,9 @@ router.post('/:id/roles', auth_1.requireAdmin, async (req, res) => {
177
177
  * Remove a role from a user.
178
178
  */
179
179
  router.delete('/:id/roles/:role', auth_1.requireAdmin, async (req, res) => {
180
+ const decision = await (0, capabilities_1.mayRevokeRole)(req.auth.userId, String(req.params.id), String(req.params.role));
181
+ if (!allowed(decision, res))
182
+ return;
180
183
  const result = await api.removeUserRole({ id: req.params.id, role: req.params.role });
181
184
  res.status(result.status).json(result.data ?? { error: result.error });
182
185
  });
@@ -33,14 +33,15 @@ var __importStar = (this && this.__importStar) || (function () {
33
33
  };
34
34
  })();
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
- const express_1 = require("express");
36
+ const http_1 = require("../lib/http");
37
+ const auth_1 = require("../modules/auth");
37
38
  const api = __importStar(require("../api/workflow-sets"));
38
- const router = (0, express_1.Router)();
39
+ const router = (0, http_1.Router)();
39
40
  /**
40
41
  * POST /api/workflow-sets
41
42
  * Create a workflow set from a specification and start the planner workflow.
42
43
  */
43
- router.post('/', async (req, res) => {
44
+ router.post('/', auth_1.requireBuilder, async (req, res) => {
44
45
  const { name, description, specification } = req.body;
45
46
  const result = await api.createWorkflowSet({ name, description, specification }, req.auth ? { userId: req.auth.userId } : undefined);
46
47
  res.status(result.status).json(result.data ?? { error: result.error });
@@ -63,17 +64,17 @@ router.get('/', async (req, res) => {
63
64
  * Get a single workflow set with its plan and workflow statuses.
64
65
  */
65
66
  router.get('/:id', async (req, res) => {
66
- const result = await api.getWorkflowSet({ id: req.params.id });
67
+ const result = await api.getWorkflowSet({ id: String(req.params.id) });
67
68
  res.status(result.status).json(result.data ?? { error: result.error });
68
69
  });
69
70
  /**
70
71
  * PUT /api/workflow-sets/:id/plan
71
72
  * Update the plan (engineer adjustments before building).
72
73
  */
73
- router.put('/:id/plan', async (req, res) => {
74
+ router.put('/:id/plan', auth_1.requireBuilder, async (req, res) => {
74
75
  const { plan, namespaces } = req.body;
75
76
  const result = await api.updateWorkflowSetPlanApi({
76
- id: req.params.id,
77
+ id: String(req.params.id),
77
78
  plan,
78
79
  namespaces,
79
80
  });
@@ -83,25 +84,25 @@ router.put('/:id/plan', async (req, res) => {
83
84
  * POST /api/workflow-sets/:id/add
84
85
  * Add additional workflows to an existing set from a new specification.
85
86
  */
86
- router.post('/:id/add', async (req, res) => {
87
+ router.post('/:id/add', auth_1.requireBuilder, async (req, res) => {
87
88
  const { specification } = req.body;
88
- const result = await api.addToWorkflowSet({ id: req.params.id, specification }, req.auth ? { userId: req.auth.userId } : undefined);
89
+ const result = await api.addToWorkflowSet({ id: String(req.params.id), specification }, req.auth ? { userId: req.auth.userId } : undefined);
89
90
  res.status(result.status).json(result.data ?? { error: result.error });
90
91
  });
91
92
  /**
92
93
  * POST /api/workflow-sets/:id/build
93
94
  * Trigger the build phase (resume the planner workflow).
94
95
  */
95
- router.post('/:id/build', async (req, res) => {
96
- const result = await api.buildWorkflowSet({ id: req.params.id });
96
+ router.post('/:id/build', auth_1.requireBuilder, async (req, res) => {
97
+ const result = await api.buildWorkflowSet({ id: String(req.params.id) });
97
98
  res.status(result.status).json(result.data ?? { error: result.error });
98
99
  });
99
100
  /**
100
101
  * POST /api/workflow-sets/:id/deploy
101
102
  * Deploy all namespaces in the set.
102
103
  */
103
- router.post('/:id/deploy', async (req, res) => {
104
- const result = await api.deployWorkflowSet({ id: req.params.id });
104
+ router.post('/:id/deploy', auth_1.requireBuilder, async (req, res) => {
105
+ const result = await api.deployWorkflowSet({ id: String(req.params.id) });
105
106
  res.status(result.status).json(result.data ?? { error: result.error });
106
107
  });
107
108
  exports.default = router;