@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
@@ -36,18 +36,19 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
36
36
  return (mod && mod.__esModule) ? mod : { "default": mod };
37
37
  };
38
38
  Object.defineProperty(exports, "__esModule", { value: true });
39
- const express_1 = require("express");
39
+ const http_1 = require("../lib/http");
40
+ const auth_1 = require("../modules/auth");
40
41
  const path_1 = __importDefault(require("path"));
41
42
  const api = __importStar(require("../api/files"));
42
43
  const storage_1 = require("../lib/storage");
43
44
  const mime_1 = require("../lib/storage/mime");
44
- const router = (0, express_1.Router)();
45
+ const router = (0, http_1.Router)();
45
46
  /**
46
47
  * GET /api/file-browser/browse
47
48
  * List files and directories at a given prefix.
48
49
  * Query: ?prefix=screenshots/&pageSize=100&continuationToken=...
49
50
  */
50
- router.get('/browse', async (req, res) => {
51
+ router.get('/browse', auth_1.requireBuilder, async (req, res) => {
51
52
  const result = await api.browseFiles({
52
53
  prefix: req.query.prefix,
53
54
  pageSize: req.query.pageSize ? parseInt(req.query.pageSize, 10) : undefined,
@@ -59,7 +60,7 @@ router.get('/browse', async (req, res) => {
59
60
  * GET /api/file-browser/metadata/*
60
61
  * Get metadata for a single file.
61
62
  */
62
- router.get('/metadata/{*filePath}', async (req, res) => {
63
+ router.get('/metadata/{*filePath}', auth_1.requireBuilder, async (req, res) => {
63
64
  const raw = req.params.filePath;
64
65
  const filePath = Array.isArray(raw) ? raw.join('/') : raw;
65
66
  if (!filePath) {
@@ -74,7 +75,7 @@ router.get('/metadata/{*filePath}', async (req, res) => {
74
75
  * Generate a time-limited signed URL for sharing.
75
76
  * Body: { path, expiresIn } — expiresIn in seconds (3600, 21600, 86400, 604800, 2592000)
76
77
  */
77
- router.post('/signed-url', async (req, res) => {
78
+ router.post('/signed-url', auth_1.requireBuilder, async (req, res) => {
78
79
  const { path: filePath, expiresIn } = req.body;
79
80
  if (!filePath || !expiresIn) {
80
81
  res.status(400).json({ error: 'path and expiresIn are required' });
@@ -90,7 +91,7 @@ router.post('/signed-url', async (req, res) => {
90
91
  * DELETE /api/file-browser/delete/*
91
92
  * Permanently delete a file.
92
93
  */
93
- router.delete('/delete/{*filePath}', async (req, res) => {
94
+ router.delete('/delete/{*filePath}', auth_1.requireBuilder, async (req, res) => {
94
95
  const raw = req.params.filePath;
95
96
  const filePath = Array.isArray(raw) ? raw.join('/') : raw;
96
97
  if (!filePath) {
@@ -104,7 +105,7 @@ router.delete('/delete/{*filePath}', async (req, res) => {
104
105
  * GET /api/file-browser/download/*
105
106
  * Download a file with Content-Disposition: attachment.
106
107
  */
107
- router.get('/download/{*filePath}', async (req, res) => {
108
+ router.get('/download/{*filePath}', auth_1.requireBuilder, async (req, res) => {
108
109
  const raw = req.params.filePath;
109
110
  const filePath = Array.isArray(raw) ? raw.join('/') : raw;
110
111
  if (!filePath) {
@@ -129,7 +130,7 @@ router.get('/download/{*filePath}', async (req, res) => {
129
130
  * Query: ?path=images/photo.png (target path including filename)
130
131
  * Body: raw file bytes (Content-Type should match the file type)
131
132
  */
132
- router.post('/upload', async (req, res) => {
133
+ router.post('/upload', auth_1.requireBuilder, async (req, res) => {
133
134
  const targetPath = req.query.path;
134
135
  if (!targetPath) {
135
136
  res.status(400).json({ error: 'path query parameter required (e.g., ?path=images/photo.png)' });
@@ -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 jsonwebtoken_1 = __importDefault(require("jsonwebtoken"));
8
8
  const storage_1 = require("../lib/storage");
9
9
  const mime_1 = require("../lib/storage/mime");
10
- const router = (0, express_1.Router)();
10
+ const router = (0, http_1.Router)();
11
11
  /**
12
12
  * GET /api/files/*
13
13
  * Serve files from managed file storage.
@@ -3,11 +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 auth_1 = require("../modules/auth");
8
8
  const auth_2 = __importDefault(require("./auth"));
9
9
  const auth_sso_1 = __importDefault(require("./auth-sso"));
10
10
  const oauth_1 = __importDefault(require("./oauth"));
11
+ const oauth_server_1 = __importDefault(require("./oauth-server"));
11
12
  const delegation_1 = __importDefault(require("./delegation"));
12
13
  const tasks_1 = __importDefault(require("./tasks"));
13
14
  const escalations_1 = __importDefault(require("./escalations"));
@@ -39,11 +40,12 @@ const nats_credentials_1 = __importDefault(require("./nats-credentials"));
39
40
  const scan_codes_1 = __importDefault(require("./scan-codes"));
40
41
  const domain_1 = __importDefault(require("./domain"));
41
42
  const announcements_1 = __importDefault(require("./announcements"));
42
- const router = (0, express_1.Router)();
43
+ const router = (0, http_1.Router)();
43
44
  // Public routes (no auth required — they handle their own auth)
44
45
  router.use('/auth', auth_2.default);
45
46
  router.use('/auth', auth_sso_1.default);
46
47
  router.use('/auth/oauth', oauth_1.default);
48
+ router.use('/oauth', oauth_server_1.default);
47
49
  router.use('/delegation', delegation_1.default);
48
50
  router.use('/files', files_1.default);
49
51
  router.use('/settings', settings_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/insight"));
38
- const router = (0, express_1.Router)();
39
+ const router = (0, http_1.Router)();
39
40
  /**
40
41
  * POST /api/insight/mcp-query
41
42
  * Run a general-purpose MCP query using all available tools.
@@ -52,7 +53,7 @@ router.post('/mcp-query', async (req, res) => {
52
53
  * The LLM reasons about tool schemas and constructs the YAML declaratively.
53
54
  * Body: { prompt: string, tags?: string[], wait?: boolean, feedback?: string, prior_yaml?: string }
54
55
  */
55
- router.post('/build-workflow', async (req, res) => {
56
+ router.post('/build-workflow', auth_1.requireBuilder, async (req, res) => {
56
57
  const { prompt, tags, wait, feedback, prior_yaml, answers, prior_questions } = req.body;
57
58
  const result = await api.buildWorkflow({ prompt, tags, wait, feedback, prior_yaml, answers, prior_questions }, req.auth ? { userId: req.auth.userId } : undefined);
58
59
  res.status(result.status).json(result.data ?? { error: result.error });
@@ -62,7 +63,7 @@ router.post('/build-workflow', async (req, res) => {
62
63
  * Refine a previously built workflow using execution feedback.
63
64
  * Body: { prompt: string, prior_yaml: string, feedback: string, tags?: string[], wait?: boolean }
64
65
  */
65
- router.post('/build-workflow/refine', async (req, res) => {
66
+ router.post('/build-workflow/refine', auth_1.requireBuilder, async (req, res) => {
66
67
  const { prompt, prior_yaml, feedback, tags, wait } = req.body;
67
68
  const result = await api.refineWorkflow({ prompt, prior_yaml, feedback, tags, wait }, req.auth ? { userId: req.auth.userId } : undefined);
68
69
  res.status(result.status).json(result.data ?? { error: result.error });
@@ -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/knowledge"));
38
38
  const auth_1 = require("../modules/auth");
39
- const router = (0, express_1.Router)();
39
+ const router = (0, http_1.Router)();
40
40
  // The knowledge store is a builder surface (superadmin or engineer) — the
41
41
  // same gate as the dashboard's Knowledge page. Members reach knowledge
42
42
  // content only through escalation lookup refs: an escalation's
@@ -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/maintenance"));
38
38
  const auth_1 = require("../modules/auth");
39
- const router = (0, express_1.Router)();
39
+ const router = (0, http_1.Router)();
40
40
  /**
41
41
  * GET /api/config/maintenance
42
42
  * Return the current maintenance configuration.
@@ -6,7 +6,9 @@
6
6
  * streamable-http transport protocol.
7
7
  *
8
8
  * Stateless mode — each POST creates a fresh server+transport pair.
9
- * Auth via Bearer token (JWT or bot API key) in the Authorization header.
9
+ * Auth via Bearer token (JWT, bot API key, or OAuth access token) in the
10
+ * Authorization header.
11
+ * The caller sees only the tools whose manifest gate they hold.
10
12
  *
11
13
  * Mount at /mcp:
12
14
  * POST /mcp → JSON-RPC messages (initialize, tools/list, tools/call)
@@ -7,7 +7,9 @@
7
7
  * streamable-http transport protocol.
8
8
  *
9
9
  * Stateless mode — each POST creates a fresh server+transport pair.
10
- * Auth via Bearer token (JWT or bot API key) in the Authorization header.
10
+ * Auth via Bearer token (JWT, bot API key, or OAuth access token) in the
11
+ * Authorization header.
12
+ * The caller sees only the tools whose manifest gate they hold.
11
13
  *
12
14
  * Mount at /mcp:
13
15
  * POST /mcp → JSON-RPC messages (initialize, tools/list, tools/call)
@@ -15,19 +17,27 @@
15
17
  * DELETE /mcp → 405 (no sessions in stateless mode)
16
18
  */
17
19
  Object.defineProperty(exports, "__esModule", { value: true });
18
- const express_1 = require("express");
20
+ const http_1 = require("../lib/http");
19
21
  const streamableHttp_js_1 = require("@modelcontextprotocol/sdk/server/streamableHttp.js");
20
- const auth_1 = require("../modules/auth");
22
+ const mcp_auth_1 = require("../modules/mcp-auth");
23
+ const capabilities_1 = require("../modules/capabilities");
21
24
  const logger_1 = require("../lib/logger");
22
25
  const external_server_1 = require("../services/mcp/external-server");
23
26
  const exposure_1 = require("../services/mcp/exposure");
24
- const router = (0, express_1.Router)();
27
+ const router = (0, http_1.Router)();
28
+ /** The tool a single `tools/call` message names; undefined for anything else. */
29
+ function requestedToolName(body) {
30
+ const message = body;
31
+ if (message?.method !== 'tools/call')
32
+ return undefined;
33
+ return typeof message.params?.name === 'string' ? message.params.name : undefined;
34
+ }
25
35
  // POST /mcp — JSON-RPC messages
26
- router.post('/', auth_1.requireAuth, async (req, res) => {
36
+ router.post('/', mcp_auth_1.requireMcpAuth, async (req, res) => {
27
37
  try {
28
38
  const exposure = (0, exposure_1.getExposureConfig)();
29
39
  const callerScopes = req.auth?.scopes;
30
- const server = await (0, external_server_1.createUnifiedMcpServer)(exposure, callerScopes);
40
+ const server = await (0, external_server_1.createUnifiedMcpServer)((0, capabilities_1.capabilityAccess)(req.auth), exposure, callerScopes, requestedToolName(req.body));
31
41
  const transport = new streamableHttp_js_1.StreamableHTTPServerTransport({
32
42
  sessionIdGenerator: undefined, // stateless
33
43
  });
@@ -53,7 +63,7 @@ router.post('/', auth_1.requireAuth, async (req, res) => {
53
63
  }
54
64
  });
55
65
  // GET /mcp — SSE stream (not supported in stateless mode)
56
- router.get('/', auth_1.requireAuth, (_req, res) => {
66
+ router.get('/', mcp_auth_1.requireMcpAuth, (_req, res) => {
57
67
  res.status(405).json({
58
68
  jsonrpc: '2.0',
59
69
  error: { code: -32000, message: 'Method not allowed. Use POST for stateless requests.' },
@@ -61,7 +71,7 @@ router.get('/', auth_1.requireAuth, (_req, res) => {
61
71
  });
62
72
  });
63
73
  // DELETE /mcp — session close (not supported in stateless mode)
64
- router.delete('/', auth_1.requireAuth, (_req, res) => {
74
+ router.delete('/', mcp_auth_1.requireMcpAuth, (_req, res) => {
65
75
  res.status(405).json({
66
76
  jsonrpc: '2.0',
67
77
  error: { code: -32000, message: 'Method not allowed. Stateless mode has no sessions.' },
@@ -33,9 +33,28 @@ 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/mcp"));
38
- const router = (0, express_1.Router)();
38
+ const capabilities_1 = require("../modules/capabilities");
39
+ const auth_1 = require("../modules/auth");
40
+ const router = (0, http_1.Router)();
41
+ /**
42
+ * A server's transport_config carries connection secrets (headers, env,
43
+ * commands). Only a builder, who may edit the server, reads it back.
44
+ */
45
+ async function redactTransport(result, auth) {
46
+ if (!result.data || (await (0, capabilities_1.mayBuild)(auth ? { userId: auth.userId } : undefined)))
47
+ return result;
48
+ const strip = (server) => {
49
+ const { transport_config: _secret, ...rest } = server;
50
+ return rest;
51
+ };
52
+ const data = result.data;
53
+ return {
54
+ ...result,
55
+ data: Array.isArray(data.servers) ? { ...data, servers: data.servers.map(strip) } : strip(data),
56
+ };
57
+ }
39
58
  // ── Server registration CRUD ──────────────────────────────────────────
40
59
  /**
41
60
  * GET /api/mcp/servers
@@ -52,13 +71,14 @@ router.get('/servers', async (req, res) => {
52
71
  limit: req.query.limit ? parseInt(req.query.limit, 10) : undefined,
53
72
  offset: req.query.offset ? parseInt(req.query.offset, 10) : undefined,
54
73
  });
55
- res.status(result.status).json(result.data ?? { error: result.error });
74
+ const shown = await redactTransport(result, req.auth);
75
+ res.status(shown.status).json(shown.data ?? { error: shown.error });
56
76
  });
57
77
  /**
58
78
  * POST /api/mcp/servers
59
79
  * Register a new MCP server.
60
80
  */
61
- router.post('/servers', async (req, res) => {
81
+ router.post('/servers', auth_1.requireBuilder, async (req, res) => {
62
82
  const { name, description, transport_type, transport_config, auto_connect, metadata, tags, compile_hints, credential_providers } = req.body;
63
83
  const result = await api.createMcpServer({
64
84
  name,
@@ -77,7 +97,7 @@ router.post('/servers', async (req, res) => {
77
97
  * POST /api/mcp/servers/test-connection
78
98
  * Test connectivity to an MCP server without persisting it.
79
99
  */
80
- router.post('/servers/test-connection', async (req, res) => {
100
+ router.post('/servers/test-connection', auth_1.requireBuilder, async (req, res) => {
81
101
  const { transport_type, transport_config } = req.body;
82
102
  const result = await api.testConnection({ transport_type, transport_config });
83
103
  res.status(result.status).json(result.data ?? { error: result.error });
@@ -88,23 +108,23 @@ router.post('/servers/test-connection', async (req, res) => {
88
108
  * Get a specific MCP server.
89
109
  */
90
110
  router.get('/servers/:id', async (req, res) => {
91
- const result = await api.getMcpServer({ id: req.params.id });
111
+ const result = await redactTransport(await api.getMcpServer({ id: req.params.id }), req.auth);
92
112
  res.status(result.status).json(result.data ?? { error: result.error });
93
113
  });
94
114
  /**
95
115
  * PUT /api/mcp/servers/:id
96
116
  * Update an MCP server registration.
97
117
  */
98
- router.put('/servers/:id', async (req, res) => {
99
- const result = await api.updateMcpServer({ id: req.params.id, ...req.body });
118
+ router.put('/servers/:id', auth_1.requireBuilder, async (req, res) => {
119
+ const result = await api.updateMcpServer({ ...req.body, id: String(req.params.id) });
100
120
  res.status(result.status).json(result.data ?? { error: result.error });
101
121
  });
102
122
  /**
103
123
  * DELETE /api/mcp/servers/:id
104
124
  * Delete an MCP server registration.
105
125
  */
106
- router.delete('/servers/:id', async (req, res) => {
107
- const result = await api.deleteMcpServer({ id: req.params.id });
126
+ router.delete('/servers/:id', auth_1.requireBuilder, async (req, res) => {
127
+ const result = await api.deleteMcpServer({ id: String(req.params.id) });
108
128
  res.status(result.status).json(result.data ?? { error: result.error });
109
129
  });
110
130
  // ── Connection management ─────────────────────────────────────────────
@@ -112,16 +132,16 @@ router.delete('/servers/:id', async (req, res) => {
112
132
  * POST /api/mcp/servers/:id/connect
113
133
  * Connect to a registered MCP server.
114
134
  */
115
- router.post('/servers/:id/connect', async (req, res) => {
116
- const result = await api.connectMcpServer({ id: req.params.id });
135
+ router.post('/servers/:id/connect', auth_1.requireBuilder, async (req, res) => {
136
+ const result = await api.connectMcpServer({ id: String(req.params.id) });
117
137
  res.status(result.status).json(result.data ?? { error: result.error });
118
138
  });
119
139
  /**
120
140
  * POST /api/mcp/servers/:id/disconnect
121
141
  * Disconnect from a specific MCP server.
122
142
  */
123
- router.post('/servers/:id/disconnect', async (req, res) => {
124
- const result = await api.disconnectMcpServer({ id: req.params.id });
143
+ router.post('/servers/:id/disconnect', auth_1.requireBuilder, async (req, res) => {
144
+ const result = await api.disconnectMcpServer({ id: String(req.params.id) });
125
145
  res.status(result.status).json(result.data ?? { error: result.error });
126
146
  });
127
147
  // ── Credential status ────────────────────────────────────────────────
@@ -153,7 +173,7 @@ router.post('/servers/:id/tools/:toolName/call', async (req, res) => {
153
173
  toolName: req.params.toolName,
154
174
  arguments: req.body.arguments,
155
175
  execute_as: req.body.execute_as,
156
- }, req.auth ? { userId: req.auth.userId } : undefined);
176
+ }, req.auth ? { userId: req.auth.userId, role: req.auth.role } : undefined);
157
177
  res.status(result.status).json(result.data ?? { error: result.error });
158
178
  });
159
179
  exports.default = router;
@@ -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/me"));
38
- const router = (0, express_1.Router)();
38
+ const router = (0, http_1.Router)();
39
39
  // ── Self-service (/api/me) — the authenticated user, no admin gates ─────────
40
40
  /**
41
41
  * GET /api/me/preferences
@@ -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/namespaces"));
38
- const router = (0, express_1.Router)();
39
+ const router = (0, http_1.Router)();
39
40
  /**
40
41
  * GET /api/namespaces
41
42
  * List all registered MCP YAML namespaces.
@@ -49,7 +50,7 @@ router.get('/', async (_req, res) => {
49
50
  * Register a new namespace.
50
51
  * Body: { name: string, description?: string, metadata?: object }
51
52
  */
52
- router.post('/', async (req, res) => {
53
+ router.post('/', auth_1.requireBuilder, async (req, res) => {
53
54
  const result = await api.registerNamespace({
54
55
  name: req.body?.name,
55
56
  description: req.body?.description,
@@ -1,10 +1,23 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- const express_1 = require("express");
3
+ const http_1 = require("../lib/http");
4
4
  const events_1 = require("../lib/events");
5
5
  const nats_1 = require("../lib/events/nats");
6
6
  const nats_ws_proxy_1 = require("../lib/events/nats-ws-proxy");
7
- const router = (0, express_1.Router)();
7
+ const nats_ws_ticket_1 = require("../lib/events/nats-ws-ticket");
8
+ const logger_1 = require("../lib/logger");
9
+ const config_1 = require("../modules/config");
10
+ let warnedServerToken = false;
11
+ /** The WebSocket URL with a ticket for this person; the proxy holds the NATS credential. */
12
+ function withTicket(wsUrl, userId) {
13
+ const ticket = (0, nats_ws_ticket_1.signNatsWsTicket)(userId);
14
+ if (!ticket)
15
+ return null;
16
+ const url = new URL(wsUrl);
17
+ url.searchParams.set(nats_ws_ticket_1.NATS_WS_TICKET_PARAM, ticket);
18
+ return url.toString();
19
+ }
20
+ const router = (0, http_1.Router)();
8
21
  /**
9
22
  * GET /api/nats-credentials
10
23
  * Returns NATS WebSocket URL and auth token.
@@ -21,9 +34,20 @@ router.get('/', async (req, res) => {
21
34
  wsUrl = (0, nats_ws_proxy_1.deriveWsUrlFromRequest)(req, natsAdapter.wsProxyBasePath);
22
35
  natsAdapter.setWsUrl(wsUrl);
23
36
  }
37
+ // Behind the proxy the browser gets a ticket, never the NATS credential, and
38
+ // the proxy lets it subscribe only.
39
+ if (natsAdapter.wsProxyTarget && wsUrl) {
40
+ return res.json({ natsWsUrl: withTicket(wsUrl, req.auth.userId), natsToken: null });
41
+ }
42
+ // A direct connection needs a credential: a subscribe-only one when the
43
+ // deployment provides it.
44
+ if (!config_1.config.NATS_DASHBOARD_TOKEN && natsAdapter.authToken && !warnedServerToken) {
45
+ warnedServerToken = true;
46
+ logger_1.loggerRegistry.warn('[lt-nats] browsers receive the NATS server token; set NATS_DASHBOARD_TOKEN to a subscribe-only credential, or use the WebSocket proxy');
47
+ }
24
48
  res.json({
25
49
  natsWsUrl: wsUrl,
26
- natsToken: natsAdapter.authToken,
50
+ natsToken: config_1.config.NATS_DASHBOARD_TOKEN || natsAdapter.authToken,
27
51
  });
28
52
  });
29
53
  exports.default = router;
@@ -0,0 +1,2 @@
1
+ declare const router: import("express-serve-static-core").Router;
2
+ export default router;
@@ -0,0 +1,110 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const http_1 = require("../../lib/http");
4
+ const auth_1 = require("../../modules/auth");
5
+ const oauth_server_1 = require("../../modules/oauth-server");
6
+ const defaults_1 = require("../../modules/defaults");
7
+ const oauth_server_2 = require("../../services/auth/oauth-server");
8
+ const authorization_1 = require("../../services/auth/oauth-server/authorization");
9
+ const user_1 = require("../../services/user");
10
+ const router = (0, http_1.Router)();
11
+ const CONSENT_PAGE_PATH = '/oauth/consent';
12
+ const BOT_PRINCIPAL_TYPE = 'bot';
13
+ /** Send a failed authorization check: here when the client is untrusted, else back to the client. */
14
+ function sendAuthorizationError(res, check, issuer, asJson) {
15
+ if (!check.redirect) {
16
+ res.status(400).json({ error: check.error, error_description: check.description });
17
+ return;
18
+ }
19
+ const redirect = (0, authorization_1.withQuery)(check.redirectUri, {
20
+ error: check.error, error_description: check.description, state: check.state, iss: issuer,
21
+ });
22
+ if (asJson)
23
+ res.json({ redirect });
24
+ else
25
+ res.redirect(302, redirect);
26
+ }
27
+ /**
28
+ * GET /api/oauth/authorize
29
+ * The authorization request (RFC 6749 §4.1.1, PKCE S256 required). Redirects
30
+ * to the dashboard consent page with the validated request.
31
+ */
32
+ router.get('/authorize', async (req, res) => {
33
+ const settings = (0, oauth_server_1.getOAuthServerSettings)();
34
+ const check = await (0, authorization_1.checkAuthorizationRequest)(req.query, settings);
35
+ if (!check.ok)
36
+ return sendAuthorizationError(res, check, settings.issuer, false);
37
+ const { client, redirectUri, codeChallenge, state, scope, resource } = check.request;
38
+ res.redirect(302, (0, authorization_1.withQuery)(`${settings.issuer}${CONSENT_PAGE_PATH}`, {
39
+ client_id: client.client_id, redirect_uri: redirectUri, code_challenge: codeChallenge,
40
+ code_challenge_method: 'S256', response_type: 'code', state, scope, resource,
41
+ }));
42
+ });
43
+ /** Consent is a person's decision: a bot key may not grant access. */
44
+ function refuseBots(req, res) {
45
+ if (req.auth?.principalType !== BOT_PRINCIPAL_TYPE)
46
+ return false;
47
+ res.status(403).json({ error: 'access_denied', error_description: 'a service account cannot grant access' });
48
+ return true;
49
+ }
50
+ /**
51
+ * POST /api/oauth/authorize
52
+ * The person approves. Body: the authorization request plus
53
+ * { preset: 'read_only' | 'just_me' }. Returns { redirect } for the consent
54
+ * page to navigate to, carrying the code. Only the dashboard's own bearer
55
+ * credential approves: a host session cookie, which any same-site script
56
+ * could send, does not.
57
+ */
58
+ router.post('/authorize', auth_1.requireCredentialAuth, async (req, res) => {
59
+ if (refuseBots(req, res))
60
+ return;
61
+ const settings = (0, oauth_server_1.getOAuthServerSettings)();
62
+ const check = await (0, authorization_1.checkAuthorizationRequest)(req.body ?? {}, settings);
63
+ if (!check.ok)
64
+ return sendAuthorizationError(res, check, settings.issuer, true);
65
+ const preset = req.body?.preset;
66
+ if (!(0, authorization_1.isGrantPreset)(preset)) {
67
+ res.status(400).json({ error: 'invalid_request', error_description: 'preset must be read_only or just_me' });
68
+ return;
69
+ }
70
+ if (!(0, authorization_1.grantablePresets)(await (0, user_1.getUserRoles)(req.auth.userId)).includes(preset)) {
71
+ res.status(403).json({ error: 'access_denied', error_description: `you may not grant ${preset}` });
72
+ return;
73
+ }
74
+ const { client, redirectUri, codeChallenge, state, resource } = check.request;
75
+ const { code } = await (0, oauth_server_2.issueAuthorizationCode)({
76
+ userId: req.auth.userId, clientId: client.client_id, policy: { preset }, scope: oauth_server_2.PRESET_SCOPE[preset],
77
+ redirectUri, codeChallenge, resource, ttlSeconds: defaults_1.OAUTH_CODE_TTL_SECONDS,
78
+ });
79
+ res.json({ redirect: (0, authorization_1.withQuery)(redirectUri, { code, state, iss: settings.issuer }) });
80
+ });
81
+ /**
82
+ * POST /api/oauth/deny
83
+ * The person declines. Body: { client_id, redirect_uri, state? }. Returns
84
+ * { redirect } carrying error=access_denied. Bearer credential only, as authorize.
85
+ */
86
+ router.post('/deny', auth_1.requireCredentialAuth, async (req, res) => {
87
+ const settings = (0, oauth_server_1.getOAuthServerSettings)();
88
+ const clientId = typeof req.body?.client_id === 'string' ? req.body.client_id : '';
89
+ const client = clientId ? await (0, oauth_server_2.getClient)(clientId) : null;
90
+ const redirectUri = req.body?.redirect_uri;
91
+ if (!client || typeof redirectUri !== 'string' || !client.redirect_uris.includes(redirectUri)) {
92
+ res.status(400).json({ error: 'invalid_request', error_description: 'unknown client or redirect_uri' });
93
+ return;
94
+ }
95
+ const state = typeof req.body?.state === 'string' ? req.body.state : undefined;
96
+ res.json({ redirect: (0, authorization_1.withQuery)(redirectUri, { error: 'access_denied', state, iss: settings.issuer }) });
97
+ });
98
+ /**
99
+ * GET /api/oauth/clients/:id
100
+ * The client the consent page is asking about.
101
+ */
102
+ router.get('/clients/:id', auth_1.requireAuth, async (req, res) => {
103
+ const client = await (0, oauth_server_2.getClient)(String(req.params.id));
104
+ if (!client) {
105
+ res.status(404).json({ error: 'not_found' });
106
+ return;
107
+ }
108
+ res.json({ client_id: client.client_id, client_name: client.client_name, redirect_uris: client.redirect_uris });
109
+ });
110
+ exports.default = router;
@@ -0,0 +1,2 @@
1
+ declare const router: import("express-serve-static-core").Router;
2
+ export default router;
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const http_1 = require("../../lib/http");
4
+ const auth_1 = require("../../modules/auth");
5
+ const roles_1 = require("../../services/user/roles");
6
+ const oauth_server_1 = require("../../services/auth/oauth-server");
7
+ const authorization_1 = require("../../services/auth/oauth-server/authorization");
8
+ const router = (0, http_1.Router)();
9
+ /**
10
+ * GET /api/oauth/presets
11
+ * The presets the signed-in person may grant at consent.
12
+ */
13
+ router.get('/presets', auth_1.requireAuth, async (req, res) => {
14
+ res.json({ presets: (0, authorization_1.grantablePresets)(await (0, roles_1.getUserRoles)(req.auth.userId)) });
15
+ });
16
+ /**
17
+ * GET /api/oauth/grants
18
+ * The signed-in person's connected apps.
19
+ */
20
+ router.get('/grants', auth_1.requireAuth, async (req, res) => {
21
+ res.json({ grants: await (0, oauth_server_1.listGrants)(req.auth.userId) });
22
+ });
23
+ /**
24
+ * DELETE /api/oauth/grants/:id
25
+ * Disconnect one of the signed-in person's apps. Its tokens stop working at once.
26
+ */
27
+ router.delete('/grants/:id', auth_1.requireAuth, async (req, res) => {
28
+ const revoked = await (0, oauth_server_1.revokeGrant)(String(req.params.id), req.auth.userId);
29
+ if (!revoked) {
30
+ res.status(404).json({ error: 'not_found' });
31
+ return;
32
+ }
33
+ res.json({ disconnected: true });
34
+ });
35
+ exports.default = router;
@@ -0,0 +1,8 @@
1
+ /**
2
+ * OAuth authorization server endpoints under /api/oauth. The public ones
3
+ * (metadata, register, token, revoke) take no Long Tail session and allow
4
+ * any origin. The consent endpoints take the person's dashboard session.
5
+ * Every endpoint answers 404 until the server is configured.
6
+ */
7
+ declare const router: import("express-serve-static-core").Router;
8
+ export default router;