@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
@@ -33,10 +33,11 @@ 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 workflow_invocation_1 = require("../../services/workflow-invocation");
37
38
  const api = __importStar(require("../../api/workflows"));
38
39
  const auth_1 = require("../../modules/auth");
39
- const router = (0, express_1.Router)();
40
+ const router = (0, http_1.Router)();
40
41
  // ── Workflow configuration ────────────────────────────────────────────────────
41
42
  /**
42
43
  * GET /api/workflows/config
@@ -69,6 +70,18 @@ router.get('/:type/input-lookups', async (req, res) => {
69
70
  * Requires admin or superadmin role.
70
71
  */
71
72
  router.put('/:type/config', auth_1.requireAdmin, async (req, res) => {
73
+ // Every invocation of this workflow runs as execute_as, so it may not exceed the caller.
74
+ if (req.body.execute_as) {
75
+ try {
76
+ await (0, workflow_invocation_1.assertMayActAs)(req.auth.userId, req.body.execute_as);
77
+ }
78
+ catch (err) {
79
+ if (!(err instanceof workflow_invocation_1.InvocationError))
80
+ throw err;
81
+ res.status(err.statusCode).json({ error: err.message });
82
+ return;
83
+ }
84
+ }
72
85
  const result = await api.upsertWorkflowConfig({
73
86
  type: req.params.type,
74
87
  invocable: req.body.invocable,
@@ -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/workflows"));
38
- const router = (0, express_1.Router)();
38
+ const router = (0, http_1.Router)();
39
39
  // ── Active workers ───────────────────────────────────────────────────────────
40
40
  /**
41
41
  * GET /api/workflows/workers
@@ -3,11 +3,11 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- const express_1 = require("express");
6
+ const http_1 = require("../../lib/http");
7
7
  const discovery_1 = __importDefault(require("./discovery"));
8
8
  const config_1 = __importDefault(require("./config"));
9
9
  const invocation_1 = __importDefault(require("./invocation"));
10
- const router = (0, express_1.Router)();
10
+ const router = (0, http_1.Router)();
11
11
  // Mount in original route registration order:
12
12
  // 1. Discovery: /workers, /discovered, /cron/status
13
13
  router.use(discovery_1.default);
@@ -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/workflows"));
38
- const router = (0, express_1.Router)();
39
+ const router = (0, http_1.Router)();
39
40
  // ── Workflow invocation ─────────────────────────────────────────────────────
40
41
  /**
41
42
  * POST /api/workflows/:type/invoke
@@ -69,9 +70,9 @@ router.post('/:type/invoke', async (req, res) => {
69
70
  * Get the status of a workflow. Optional `app_id` query param selects the
70
71
  * HotMesh namespace for resolution (default: durable).
71
72
  */
72
- router.get('/:workflowId/status', async (req, res) => {
73
+ router.get('/:workflowId/status', auth_1.requireBuilder, async (req, res) => {
73
74
  const result = await api.getWorkflowStatus({
74
- workflowId: req.params.workflowId,
75
+ workflowId: String(req.params.workflowId),
75
76
  appId: typeof req.query.app_id === 'string' ? req.query.app_id : undefined,
76
77
  });
77
78
  res.status(result.status).json(result.data ?? { error: result.error });
@@ -82,9 +83,9 @@ router.get('/:workflowId/status', async (req, res) => {
82
83
  * Never blocks — always returns immediately. Optional `app_id` query param
83
84
  * selects the HotMesh namespace for resolution (default: durable).
84
85
  */
85
- router.get('/:workflowId/result', async (req, res) => {
86
+ router.get('/:workflowId/result', auth_1.requireWorkflowReader, async (req, res) => {
86
87
  const result = await api.getWorkflowResult({
87
- workflowId: req.params.workflowId,
88
+ workflowId: String(req.params.workflowId),
88
89
  appId: typeof req.query.app_id === 'string' ? req.query.app_id : undefined,
89
90
  });
90
91
  res.status(result.status).json(result.data ?? { error: result.error });
@@ -93,16 +94,16 @@ router.get('/:workflowId/result', async (req, res) => {
93
94
  * POST /api/workflows/:workflowId/terminate
94
95
  * Interrupt/terminate a running workflow.
95
96
  */
96
- router.post('/:workflowId/terminate', async (req, res) => {
97
- const result = await api.terminateWorkflow({ workflowId: req.params.workflowId });
97
+ router.post('/:workflowId/terminate', auth_1.requireBuilder, async (req, res) => {
98
+ const result = await api.terminateWorkflow({ workflowId: String(req.params.workflowId) });
98
99
  res.status(result.status).json(result.data ?? { error: result.error });
99
100
  });
100
101
  /**
101
102
  * GET /api/workflows/:workflowId/export
102
103
  * Export workflow state. Convenience alias for /api/workflow-states/:workflowId.
103
104
  */
104
- router.get('/:workflowId/export', async (req, res) => {
105
- const result = await api.exportWorkflow({ workflowId: req.params.workflowId });
105
+ router.get('/:workflowId/export', auth_1.requireBuilder, async (req, res) => {
106
+ const result = await api.exportWorkflow({ workflowId: String(req.params.workflowId) });
106
107
  res.status(result.status).json(result.data ?? { error: result.error });
107
108
  });
108
109
  exports.default = router;
@@ -33,28 +33,41 @@ 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/yaml-workflows"));
38
- const router = (0, express_1.Router)();
38
+ const auth_1 = require("../../modules/auth");
39
+ const workflow_invocation_1 = require("../../services/workflow-invocation");
40
+ const router = (0, http_1.Router)();
39
41
  /**
40
42
  * PUT /api/yaml-workflows/:id/cron
41
43
  * Set or update cron schedule + envelope + execute_as.
42
44
  */
43
- router.put('/:id/cron', async (req, res) => {
45
+ router.put('/:id/cron', auth_1.requireBuilder, async (req, res) => {
46
+ if (req.body.execute_as) {
47
+ try {
48
+ await (0, workflow_invocation_1.assertMayActAs)(req.auth.userId, req.body.execute_as);
49
+ }
50
+ catch (err) {
51
+ if (!(err instanceof workflow_invocation_1.InvocationError))
52
+ throw err;
53
+ res.status(err.statusCode).json({ error: err.message });
54
+ return;
55
+ }
56
+ }
44
57
  const result = await api.setCronSchedule({
45
- id: req.params.id,
58
+ id: String(req.params.id),
46
59
  cron_schedule: req.body.cron_schedule,
47
60
  cron_envelope: req.body.cron_envelope,
48
61
  execute_as: req.body.execute_as,
49
- });
62
+ }, req.auth);
50
63
  res.status(result.status).json(result.data ?? { error: result.error });
51
64
  });
52
65
  /**
53
66
  * DELETE /api/yaml-workflows/:id/cron
54
67
  * Clear cron schedule.
55
68
  */
56
- router.delete('/:id/cron', async (req, res) => {
57
- const result = await api.clearCronSchedule({ id: req.params.id });
69
+ router.delete('/:id/cron', auth_1.requireBuilder, async (req, res) => {
70
+ const result = await api.clearCronSchedule({ id: String(req.params.id) });
58
71
  res.status(result.status).json(result.data ?? { error: result.error });
59
72
  });
60
73
  /**
@@ -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
37
  const api = __importStar(require("../../api/yaml-workflows"));
38
- const router = (0, express_1.Router)();
38
+ const auth_1 = require("../../modules/auth");
39
+ const router = (0, http_1.Router)();
39
40
  /**
40
41
  * GET /api/yaml-workflows
41
42
  * List YAML workflows with optional status filter.
@@ -58,7 +59,7 @@ router.get('/', async (req, res) => {
58
59
  * Generate a YAML workflow from a completed execution.
59
60
  * Body: { workflow_id, task_queue, workflow_name, name, description? }
60
61
  */
61
- router.post('/', async (req, res) => {
62
+ router.post('/', auth_1.requireBuilder, async (req, res) => {
62
63
  const result = await api.createYamlWorkflow(req.body);
63
64
  res.status(result.status).json(result.data ?? { error: result.error });
64
65
  });
@@ -76,7 +77,7 @@ router.get('/app-ids', async (_req, res) => {
76
77
  * Unlike POST /, this does not require a source execution — the YAML is provided directly.
77
78
  * Body: { name, description?, yaml_content, input_schema?, activity_manifest?, tags?, app_id? }
78
79
  */
79
- router.post('/direct', async (req, res) => {
80
+ router.post('/direct', auth_1.requireBuilder, async (req, res) => {
80
81
  const result = await api.createYamlWorkflowDirect(req.body);
81
82
  res.status(result.status).json(result.data ?? { error: result.error });
82
83
  });
@@ -85,7 +86,7 @@ router.post('/direct', async (req, res) => {
85
86
  * Compile a durable TypeScript workflow into a YAML DAG.
86
87
  * Body: { source, is_file_path?, workflow_name, name, description?, app_id?, subscribes?, tags? }
87
88
  */
88
- router.post('/from-durable', async (req, res) => {
89
+ router.post('/from-durable', auth_1.requireBuilder, async (req, res) => {
89
90
  const result = await api.createYamlWorkflowFromDurable(req.body);
90
91
  res.status(result.status).json(result.data ?? { error: result.error });
91
92
  });
@@ -95,15 +96,15 @@ router.post('/from-durable', async (req, res) => {
95
96
  * Get a single YAML workflow.
96
97
  */
97
98
  router.get('/:id', async (req, res) => {
98
- const result = await api.getYamlWorkflow({ id: req.params.id });
99
+ const result = await api.getYamlWorkflow({ id: String(req.params.id) });
99
100
  res.status(result.status).json(result.data ?? { error: result.error });
100
101
  });
101
102
  /**
102
103
  * PUT /api/yaml-workflows/:id
103
104
  * Update a YAML workflow's metadata.
104
105
  */
105
- router.put('/:id', async (req, res) => {
106
- const result = await api.updateYamlWorkflow({ id: req.params.id, ...req.body });
106
+ router.put('/:id', auth_1.requireBuilder, async (req, res) => {
107
+ const result = await api.updateYamlWorkflow({ ...req.body, id: String(req.params.id) });
107
108
  res.status(result.status).json(result.data ?? { error: result.error });
108
109
  });
109
110
  /**
@@ -111,9 +112,9 @@ router.put('/:id', async (req, res) => {
111
112
  * Re-generate the YAML from the original source execution.
112
113
  * Only allowed for non-archived workflows.
113
114
  */
114
- router.post('/:id/regenerate', async (req, res) => {
115
+ router.post('/:id/regenerate', auth_1.requireBuilder, async (req, res) => {
115
116
  const result = await api.regenerateYamlWorkflow({
116
- id: req.params.id,
117
+ id: String(req.params.id),
117
118
  task_queue: req.body.task_queue,
118
119
  compilation_feedback: req.body.compilation_feedback,
119
120
  });
@@ -123,8 +124,8 @@ router.post('/:id/regenerate', async (req, res) => {
123
124
  * DELETE /api/yaml-workflows/:id
124
125
  * Delete a YAML workflow (must be draft or archived).
125
126
  */
126
- router.delete('/:id', async (req, res) => {
127
- const result = await api.deleteYamlWorkflow({ id: req.params.id });
127
+ router.delete('/:id', auth_1.requireBuilder, async (req, res) => {
128
+ const result = await api.deleteYamlWorkflow({ id: String(req.params.id) });
128
129
  res.status(result.status).json(result.data ?? { error: result.error });
129
130
  });
130
131
  exports.default = router;
@@ -33,24 +33,25 @@ 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/yaml-workflows"));
38
- const router = (0, express_1.Router)();
38
+ const auth_1 = require("../../modules/auth");
39
+ const router = (0, http_1.Router)();
39
40
  /**
40
41
  * POST /api/yaml-workflows/:id/deploy
41
42
  * Deploy all YAML workflows sharing this workflow's app_id as a merged version.
42
43
  * Bumps the version and deploys all graphs together.
43
44
  */
44
- router.post('/:id/deploy', async (req, res) => {
45
- const result = await api.deployYamlWorkflow({ id: req.params.id });
45
+ router.post('/:id/deploy', auth_1.requireBuilder, async (req, res) => {
46
+ const result = await api.deployYamlWorkflow({ id: String(req.params.id) }, req.auth);
46
47
  res.status(result.status).json(result.data ?? { error: result.error });
47
48
  });
48
49
  /**
49
50
  * POST /api/yaml-workflows/:id/activate
50
51
  * Activate the deployed version for this workflow's app_id and register all workers.
51
52
  */
52
- router.post('/:id/activate', async (req, res) => {
53
- const result = await api.activateYamlWorkflow({ id: req.params.id });
53
+ router.post('/:id/activate', auth_1.requireBuilder, async (req, res) => {
54
+ const result = await api.activateYamlWorkflow({ id: String(req.params.id) }, req.auth);
54
55
  res.status(result.status).json(result.data ?? { error: result.error });
55
56
  });
56
57
  /**
@@ -72,16 +73,16 @@ router.post('/:id/invoke', async (req, res) => {
72
73
  * POST /api/yaml-workflows/:id/archive
73
74
  * Archive a YAML workflow (stops accepting new invocations).
74
75
  */
75
- router.post('/:id/archive', async (req, res) => {
76
- const result = await api.archiveYamlWorkflow({ id: req.params.id });
76
+ router.post('/:id/archive', auth_1.requireBuilder, async (req, res) => {
77
+ const result = await api.archiveYamlWorkflow({ id: String(req.params.id) });
77
78
  res.status(result.status).json(result.data ?? { error: result.error });
78
79
  });
79
80
  /**
80
81
  * POST /api/yaml-workflows/:id/restore
81
82
  * Restore an archived YAML workflow back to draft status for redeployment.
82
83
  */
83
- router.post('/:id/restore', async (req, res) => {
84
- const result = await api.restoreYamlWorkflow({ id: req.params.id });
84
+ router.post('/:id/restore', auth_1.requireBuilder, async (req, res) => {
85
+ const result = await api.restoreYamlWorkflow({ id: String(req.params.id) });
85
86
  res.status(result.status).json(result.data ?? { error: result.error });
86
87
  });
87
88
  exports.default = router;
@@ -3,12 +3,12 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- const express_1 = require("express");
6
+ const http_1 = require("../../lib/http");
7
7
  const cron_1 = __importDefault(require("./cron"));
8
8
  const crud_1 = __importDefault(require("./crud"));
9
9
  const deployment_1 = __importDefault(require("./deployment"));
10
10
  const versions_1 = __importDefault(require("./versions"));
11
- const router = (0, express_1.Router)();
11
+ const router = (0, http_1.Router)();
12
12
  // cron.ts handles: GET /cron/status, PUT /:id/cron, DELETE /:id/cron
13
13
  // Mount before crud so /cron/status doesn't match /:id
14
14
  router.use(cron_1.default);
@@ -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/yaml-workflows"));
38
- const router = (0, express_1.Router)();
38
+ const router = (0, http_1.Router)();
39
39
  /**
40
40
  * GET /api/yaml-workflows/:id/versions
41
41
  * Return version history for a YAML workflow.
@@ -0,0 +1,15 @@
1
+ import type { AgentBehaviors } from '../../types/agent';
2
+ /** Refuse an agent create or update whose schedules the caller could not run themselves. */
3
+ export declare function assertMayConfigureAgent(callerId: string, input: {
4
+ id?: string;
5
+ user_id?: string | null;
6
+ behaviors?: AgentBehaviors;
7
+ }): Promise<void>;
8
+ /** Refuse a subscription create or update the caller could not run themselves. */
9
+ export declare function assertMayConfigureSubscription(callerId: string, input: {
10
+ agentId: string;
11
+ subscriptionId?: string;
12
+ reaction_type?: string;
13
+ workflow_type?: string | null;
14
+ execute_as?: string | null;
15
+ }): Promise<void>;
@@ -0,0 +1,59 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.assertMayConfigureAgent = assertMayConfigureAgent;
4
+ exports.assertMayConfigureSubscription = assertMayConfigureSubscription;
5
+ /**
6
+ * Who may configure automation. Agents run on their own, as the identity they
7
+ * name (an execute_as, else the agent's user_id) or, with none, as lt-system.
8
+ * Whoever configures one must be able to run as that identity: the same rule
9
+ * as an execute_as override. Automation that would run as lt-system, or a
10
+ * capability subscription (a tool called with lt-system authority), is a
11
+ * superadmin's to configure. A durable subscription starts its workflow
12
+ * under that workflow's invocation rules, for the configurer here and for
13
+ * the run identity each time it fires.
14
+ */
15
+ const workflow_invocation_1 = require("../workflow-invocation");
16
+ const user_1 = require("../user");
17
+ const index_1 = require("./index");
18
+ const subscriptions_1 = require("./subscriptions");
19
+ const SYSTEM_AUTHORITY = 'runs as lt-system; only superadmin can configure it';
20
+ const DURABLE_REACTION = 'durable';
21
+ async function assertIdentity(callerId, identity, what) {
22
+ if (!identity)
23
+ throw new workflow_invocation_1.InvocationError(`${what} has no identity, so it ${SYSTEM_AUTHORITY}`, 403);
24
+ await (0, workflow_invocation_1.assertMayActAs)(callerId, identity);
25
+ }
26
+ /** Refuse an agent create or update whose schedules the caller could not run themselves. */
27
+ async function assertMayConfigureAgent(callerId, input) {
28
+ if (await (0, user_1.isSuperAdmin)(callerId))
29
+ return;
30
+ const existing = input.id ? await (0, index_1.getAgent)(input.id) : null;
31
+ const userId = input.user_id !== undefined ? input.user_id : existing?.user_id ?? null;
32
+ const behaviors = input.behaviors ?? existing?.behaviors;
33
+ if (userId)
34
+ await (0, workflow_invocation_1.assertMayActAs)(callerId, userId);
35
+ if (behaviors?.cron)
36
+ await assertIdentity(callerId, userId, 'the agent schedule');
37
+ for (const schedule of behaviors?.schedules ?? []) {
38
+ await assertIdentity(callerId, schedule.execute_as || userId, 'an agent schedule');
39
+ }
40
+ }
41
+ /** Refuse a subscription create or update the caller could not run themselves. */
42
+ async function assertMayConfigureSubscription(callerId, input) {
43
+ if (await (0, user_1.isSuperAdmin)(callerId))
44
+ return;
45
+ const existing = input.subscriptionId ? await (0, subscriptions_1.getSubscription)(input.subscriptionId) : null;
46
+ if (input.subscriptionId && (!existing || existing.agent_id !== input.agentId)) {
47
+ throw new workflow_invocation_1.InvocationError('Subscription not found', 404);
48
+ }
49
+ const reaction = input.reaction_type ?? existing?.reaction_type;
50
+ if (reaction === 'capability') {
51
+ throw new workflow_invocation_1.InvocationError(`a capability subscription calls a tool directly, so it ${SYSTEM_AUTHORITY}`, 403);
52
+ }
53
+ const workflowType = input.workflow_type !== undefined ? input.workflow_type : existing?.workflow_type;
54
+ if (reaction === DURABLE_REACTION && workflowType)
55
+ await (0, workflow_invocation_1.checkInvocationRoles)(workflowType, callerId);
56
+ const agent = await (0, index_1.getAgent)(input.agentId);
57
+ const executeAs = input.execute_as !== undefined ? input.execute_as : existing?.execute_as;
58
+ await assertIdentity(callerId, executeAs || agent?.user_id, 'the subscription');
59
+ }
@@ -245,12 +245,17 @@ class AgentTriggerRegistry {
245
245
  async executeReaction(sub, mapped, deterministicId) {
246
246
  switch (sub.reaction_type) {
247
247
  case 'durable': {
248
- const { invokeWorkflow } = await Promise.resolve().then(() => __importStar(require('../workflow-invocation')));
248
+ const { invokeWorkflow, checkInvocationRoles } = await Promise.resolve().then(() => __importStar(require('../workflow-invocation')));
249
+ // The run identity must be able to start this workflow now. Only a
250
+ // superadmin configures a subscription with no identity.
251
+ const runAs = sub.execute_as ?? sub.agent_user_id ?? undefined;
252
+ if (runAs)
253
+ await checkInvocationRoles(sub.workflow_type, runAs);
249
254
  await invokeWorkflow({
250
255
  workflowType: sub.workflow_type,
251
256
  data: mapped.data ?? mapped,
252
257
  metadata: mapped.metadata ?? { source: 'agent', certified: true },
253
- executeAs: sub.execute_as ?? sub.agent_user_id ?? undefined,
258
+ executeAs: runAs,
254
259
  options: { workflowId: deterministicId },
255
260
  auth: { userId: sub.agent_user_id || 'lt-system', role: 'admin' },
256
261
  });
@@ -29,4 +29,6 @@ export declare function revokeBotApiKey(id: string): Promise<boolean>;
29
29
  /**
30
30
  * List API keys for a bot account (without hashes).
31
31
  */
32
+ /** The bot account a key belongs to, or null when there is no such key. */
33
+ export declare function getBotApiKeyOwner(keyId: string): Promise<string | null>;
32
34
  export declare function listBotApiKeys(userId: string): Promise<BotApiKeyRecord[]>;
@@ -39,8 +39,10 @@ Object.defineProperty(exports, "__esModule", { value: true });
39
39
  exports.generateBotApiKey = generateBotApiKey;
40
40
  exports.validateBotApiKey = validateBotApiKey;
41
41
  exports.revokeBotApiKey = revokeBotApiKey;
42
+ exports.getBotApiKeyOwner = getBotApiKeyOwner;
42
43
  exports.listBotApiKeys = listBotApiKeys;
43
44
  const crypto = __importStar(require("crypto"));
45
+ const uuid_1 = require("../../lib/uuid");
44
46
  const bcryptjs_1 = __importDefault(require("bcryptjs"));
45
47
  const db_1 = require("../../lib/db");
46
48
  const sql_1 = require("./sql");
@@ -87,6 +89,14 @@ async function revokeBotApiKey(id) {
87
89
  /**
88
90
  * List API keys for a bot account (without hashes).
89
91
  */
92
+ /** The bot account a key belongs to, or null when there is no such key. */
93
+ async function getBotApiKeyOwner(keyId) {
94
+ if (!(0, uuid_1.isUuid)(keyId))
95
+ return null;
96
+ const pool = await (0, db_1.getPool)();
97
+ const { rows } = await pool.query(sql_1.GET_BOT_KEY_OWNER, [keyId]);
98
+ return rows[0]?.user_id ?? null;
99
+ }
90
100
  async function listBotApiKeys(userId) {
91
101
  const pool = await (0, db_1.getPool)();
92
102
  const { rows } = await pool.query(sql_1.LIST_BOT_KEYS_BY_USER, [userId]);
@@ -0,0 +1,36 @@
1
+ import type { AuthPayload, LTGrantPolicy, LTGrantRole, LTGrantSnapshot } from '../../../types';
2
+ /**
3
+ * Access tokens are HS256 JWTs for one resource (`aud`, the `/mcp` URL). They
4
+ * name the grant (`gid`) and the person (`sub`) and carry no `userId` claim,
5
+ * so `requireAuth` refuses them on `/api`. A verified token is honored only
6
+ * while its grant is live: `/mcp` reads the grant on each request and acts on
7
+ * its current roles, policy and scope.
8
+ */
9
+ export interface AccessTokenTarget {
10
+ issuer: string;
11
+ audience: string;
12
+ }
13
+ export interface LTAccessTokenClaims {
14
+ iss: string;
15
+ aud: string;
16
+ sub: string;
17
+ client_id: string;
18
+ gid: string;
19
+ scope: string;
20
+ policy: LTGrantPolicy;
21
+ roles: LTGrantRole[];
22
+ iat: number;
23
+ exp: number;
24
+ }
25
+ export declare function signAccessToken(snapshot: LTGrantSnapshot, target: AccessTokenTarget, ttlSeconds?: number): {
26
+ token: string;
27
+ expiresIn: number;
28
+ };
29
+ /** The claims of a valid access token for `target`; null for anything else. */
30
+ export declare function verifyAccessToken(token: string, target: AccessTokenTarget): LTAccessTokenClaims | null;
31
+ /**
32
+ * The request identity for a verified access token and its live grant, in the
33
+ * shape other credentials produce. Roles, policy and scope come from the grant
34
+ * as it stands now, not as the token recorded them.
35
+ */
36
+ export declare function accessTokenPrincipal(claims: LTAccessTokenClaims, live: LTGrantSnapshot): AuthPayload;
@@ -0,0 +1,80 @@
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
+ exports.signAccessToken = signAccessToken;
7
+ exports.verifyAccessToken = verifyAccessToken;
8
+ exports.accessTokenPrincipal = accessTokenPrincipal;
9
+ const jsonwebtoken_1 = __importDefault(require("jsonwebtoken"));
10
+ const config_1 = require("../../../modules/config");
11
+ const defaults_1 = require("../../../modules/defaults");
12
+ const constants_1 = require("./constants");
13
+ function signAccessToken(snapshot, target, ttlSeconds = defaults_1.OAUTH_ACCESS_TOKEN_TTL_SECONDS) {
14
+ if (!config_1.config.JWT_SECRET)
15
+ throw new Error('signAccessToken: JWT_SECRET is not configured');
16
+ const token = jsonwebtoken_1.default.sign({
17
+ client_id: snapshot.client_id,
18
+ gid: snapshot.grant_id,
19
+ scope: snapshot.scope,
20
+ policy: snapshot.policy,
21
+ roles: snapshot.roles,
22
+ }, config_1.config.JWT_SECRET, {
23
+ algorithm: 'HS256',
24
+ header: { alg: 'HS256', typ: constants_1.ACCESS_TOKEN_TYPE },
25
+ issuer: target.issuer,
26
+ audience: target.audience,
27
+ subject: snapshot.user_id,
28
+ expiresIn: ttlSeconds,
29
+ });
30
+ return { token, expiresIn: ttlSeconds };
31
+ }
32
+ /** The claims of a valid access token for `target`; null for anything else. */
33
+ function verifyAccessToken(token, target) {
34
+ if (!config_1.config.JWT_SECRET)
35
+ return null;
36
+ try {
37
+ const decoded = jsonwebtoken_1.default.verify(token, config_1.config.JWT_SECRET, {
38
+ algorithms: ['HS256'],
39
+ issuer: target.issuer,
40
+ audience: target.audience,
41
+ complete: true,
42
+ });
43
+ if (decoded.header.typ !== constants_1.ACCESS_TOKEN_TYPE)
44
+ return null;
45
+ const claims = decoded.payload;
46
+ if (typeof claims.exp !== 'number')
47
+ return null;
48
+ if (!claims.sub || !claims.gid || !claims.client_id || !Array.isArray(claims.roles))
49
+ return null;
50
+ return claims;
51
+ }
52
+ catch {
53
+ return null;
54
+ }
55
+ }
56
+ function highestRoleType(roles) {
57
+ if (roles.some((r) => r.type === 'superadmin'))
58
+ return 'superadmin';
59
+ if (roles.some((r) => r.type === 'admin'))
60
+ return 'admin';
61
+ return 'member';
62
+ }
63
+ /**
64
+ * The request identity for a verified access token and its live grant, in the
65
+ * shape other credentials produce. Roles, policy and scope come from the grant
66
+ * as it stands now, not as the token recorded them.
67
+ */
68
+ function accessTokenPrincipal(claims, live) {
69
+ return {
70
+ userId: claims.sub,
71
+ role: highestRoleType(live.roles),
72
+ roles: live.roles.map((r) => ({ role: r.role, type: r.type })),
73
+ scopes: [live.scope],
74
+ principalType: constants_1.OAUTH_PRINCIPAL_TYPE,
75
+ clientId: live.client_id,
76
+ grantId: live.grant_id,
77
+ policy: live.policy,
78
+ grantRoles: live.roles,
79
+ };
80
+ }
@@ -0,0 +1,47 @@
1
+ import type { OAuthServerSettings } from '../../../modules/oauth-server';
2
+ import type { LTGrantPreset, LTOAuthClient } from '../../../types/oauth-server';
3
+ /**
4
+ * Validation of an authorization request (RFC 6749 §4.1.1 with PKCE, RFC 7636,
5
+ * and resource indicators, RFC 8707). Used by the authorize redirect and again
6
+ * when the person approves, so the consent page is never trusted.
7
+ */
8
+ export interface AuthorizationRequest {
9
+ client: LTOAuthClient;
10
+ redirectUri: string;
11
+ codeChallenge: string;
12
+ state?: string;
13
+ scope?: string;
14
+ resource: string;
15
+ }
16
+ export type AuthorizationCheck = {
17
+ ok: true;
18
+ request: AuthorizationRequest;
19
+ }
20
+ /** The client or redirect URI can't be trusted: answer here, never redirect. */
21
+ | {
22
+ ok: false;
23
+ redirect: false;
24
+ error: string;
25
+ description: string;
26
+ }
27
+ /** The client and redirect URI are known: report the error to the client. */
28
+ | {
29
+ ok: false;
30
+ redirect: true;
31
+ redirectUri: string;
32
+ state?: string;
33
+ error: string;
34
+ description: string;
35
+ };
36
+ export declare function checkAuthorizationRequest(params: Record<string, unknown>, settings: OAuthServerSettings): Promise<AuthorizationCheck>;
37
+ export declare function isGrantPreset(value: unknown): value is LTGrantPreset;
38
+ /** `uri` with `params` added to its query, keeping any query it already has. */
39
+ export declare function withQuery(uri: string, params: Record<string, string | undefined>): string;
40
+ /**
41
+ * The presets the person may grant. Read-only always; Just be me only when it
42
+ * adds something: a membership that can write, or an admin tier.
43
+ */
44
+ export declare function grantablePresets(roles: Array<{
45
+ type: string;
46
+ write_scope?: string | null;
47
+ }>): LTGrantPreset[];