@hotmeshio/long-tail 0.23.2 → 0.24.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (499) hide show
  1. package/build/adapters/express.d.ts +11 -1
  2. package/build/adapters/express.js +42 -41
  3. package/build/api/auth-sso.d.ts +1 -1
  4. package/build/api/bot-accounts.d.ts +2 -0
  5. package/build/api/bot-accounts.js +4 -0
  6. package/build/api/capabilities.d.ts +7 -2
  7. package/build/api/capabilities.js +13 -2
  8. package/build/api/escalations/analytics.js +5 -0
  9. package/build/api/escalations/bulk.d.ts +2 -0
  10. package/build/api/escalations/bulk.js +9 -4
  11. package/build/api/escalations/helpers.d.ts +5 -0
  12. package/build/api/escalations/helpers.js +7 -0
  13. package/build/api/escalations/metadata.js +3 -0
  14. package/build/api/escalations/single.d.ts +3 -2
  15. package/build/api/escalations/single.js +8 -3
  16. package/build/api/mcp/tools.d.ts +12 -0
  17. package/build/api/mcp/tools.js +113 -9
  18. package/build/api/scan-codes/choice.js +31 -7
  19. package/build/api/settings.js +9 -0
  20. package/build/api/tasks.d.ts +3 -3
  21. package/build/api/tasks.js +30 -7
  22. package/build/api/workflows/input-lookups.js +1 -1
  23. package/build/api/workflows/invocable.js +2 -2
  24. package/build/api/workflows/invocation.js +1 -1
  25. package/build/api/yaml-workflows/cron.d.ts +3 -2
  26. package/build/api/yaml-workflows/cron.js +6 -1
  27. package/build/api/yaml-workflows/deploy.d.ts +15 -2
  28. package/build/api/yaml-workflows/deploy.js +69 -2
  29. package/build/lib/db/schemas/038_oauth_server.sql +46 -0
  30. package/build/lib/db/schemas/039_nats_ws_tickets.sql +12 -0
  31. package/build/lib/events/browser-view.d.ts +20 -0
  32. package/build/lib/events/browser-view.js +117 -0
  33. package/build/lib/events/nats-ws-filter.d.ts +29 -0
  34. package/build/lib/events/nats-ws-filter.js +109 -0
  35. package/build/lib/events/nats-ws-proxy.d.ts +7 -0
  36. package/build/lib/events/nats-ws-proxy.js +86 -7
  37. package/build/lib/events/nats-ws-server-filter.d.ts +16 -0
  38. package/build/lib/events/nats-ws-server-filter.js +56 -0
  39. package/build/lib/events/nats-ws-ticket.d.ts +19 -0
  40. package/build/lib/events/nats-ws-ticket.js +63 -0
  41. package/build/lib/events/socketio.d.ts +10 -1
  42. package/build/lib/events/socketio.js +10 -3
  43. package/build/lib/http/index.d.ts +27 -0
  44. package/build/lib/http/index.js +55 -0
  45. package/build/modules/auth.d.ts +15 -24
  46. package/build/modules/auth.js +43 -126
  47. package/build/modules/capabilities.d.ts +62 -0
  48. package/build/modules/capabilities.js +188 -0
  49. package/build/modules/config.d.ts +19 -0
  50. package/build/modules/config.js +27 -0
  51. package/build/modules/defaults.d.ts +10 -0
  52. package/build/modules/defaults.js +12 -1
  53. package/build/modules/maintenance.d.ts +2 -0
  54. package/build/modules/maintenance.js +7 -0
  55. package/build/modules/mcp-auth.d.ts +11 -0
  56. package/build/modules/mcp-auth.js +56 -0
  57. package/build/modules/oauth-server.d.ts +18 -0
  58. package/build/modules/oauth-server.js +40 -0
  59. package/build/routes/agents.js +47 -14
  60. package/build/routes/announcements.js +2 -2
  61. package/build/routes/auth-sso.js +2 -2
  62. package/build/routes/auth.js +2 -2
  63. package/build/routes/bot-accounts.js +26 -3
  64. package/build/routes/capabilities.js +4 -4
  65. package/build/routes/controlplane.js +2 -2
  66. package/build/routes/dba.js +2 -2
  67. package/build/routes/delegation.js +2 -2
  68. package/build/routes/diagnostics.js +2 -2
  69. package/build/routes/docs.js +2 -2
  70. package/build/routes/domain.js +2 -2
  71. package/build/routes/escalations/accumulate.d.ts +1 -1
  72. package/build/routes/escalations/acting.d.ts +1 -1
  73. package/build/routes/escalations/analytics.d.ts +1 -1
  74. package/build/routes/escalations/bulk.d.ts +1 -1
  75. package/build/routes/escalations/facets.d.ts +1 -1
  76. package/build/routes/escalations/index.js +2 -2
  77. package/build/routes/escalations/list.d.ts +1 -1
  78. package/build/routes/escalations/metadata.d.ts +1 -1
  79. package/build/routes/escalations/related.d.ts +1 -1
  80. package/build/routes/escalations/resolve.d.ts +1 -1
  81. package/build/routes/escalations/single.d.ts +1 -1
  82. package/build/routes/escalations/single.js +1 -1
  83. package/build/routes/exports.js +14 -13
  84. package/build/routes/file-browser.js +9 -8
  85. package/build/routes/files.js +2 -2
  86. package/build/routes/index.js +4 -2
  87. package/build/routes/insight.js +5 -4
  88. package/build/routes/knowledge.js +2 -2
  89. package/build/routes/maintenance.js +2 -2
  90. package/build/routes/mcp-endpoint.d.ts +3 -1
  91. package/build/routes/mcp-endpoint.js +18 -8
  92. package/build/routes/mcp.js +35 -15
  93. package/build/routes/me.js +2 -2
  94. package/build/routes/namespaces.js +4 -3
  95. package/build/routes/nats-credentials.js +27 -3
  96. package/build/routes/oauth-server/authorize.d.ts +2 -0
  97. package/build/routes/oauth-server/authorize.js +110 -0
  98. package/build/routes/oauth-server/grants.d.ts +2 -0
  99. package/build/routes/oauth-server/grants.js +35 -0
  100. package/build/routes/oauth-server/index.d.ts +8 -0
  101. package/build/routes/oauth-server/index.js +52 -0
  102. package/build/routes/oauth-server/registration.d.ts +2 -0
  103. package/build/routes/oauth-server/registration.js +38 -0
  104. package/build/routes/oauth-server/token.d.ts +2 -0
  105. package/build/routes/oauth-server/token.js +100 -0
  106. package/build/routes/oauth-well-known.d.ts +8 -0
  107. package/build/routes/oauth-well-known.js +31 -0
  108. package/build/routes/oauth.js +2 -2
  109. package/build/routes/overview.js +2 -2
  110. package/build/routes/personas.js +2 -2
  111. package/build/routes/pipelines.js +6 -5
  112. package/build/routes/roles.js +2 -2
  113. package/build/routes/scan-codes.js +2 -2
  114. package/build/routes/settings.js +2 -2
  115. package/build/routes/tasks.js +5 -5
  116. package/build/routes/topics.js +21 -9
  117. package/build/routes/users.js +25 -22
  118. package/build/routes/workflow-sets.js +13 -12
  119. package/build/routes/workflows/config.js +15 -2
  120. package/build/routes/workflows/discovery.js +2 -2
  121. package/build/routes/workflows/index.js +2 -2
  122. package/build/routes/workflows/invocation.js +11 -10
  123. package/build/routes/yaml-workflows/cron.js +20 -7
  124. package/build/routes/yaml-workflows/crud.js +13 -12
  125. package/build/routes/yaml-workflows/deployment.js +11 -10
  126. package/build/routes/yaml-workflows/index.js +2 -2
  127. package/build/routes/yaml-workflows/versions.js +2 -2
  128. package/build/services/agent/authority.d.ts +15 -0
  129. package/build/services/agent/authority.js +59 -0
  130. package/build/services/agent/trigger-registry.js +7 -2
  131. package/build/services/auth/bot-api-key.d.ts +2 -0
  132. package/build/services/auth/bot-api-key.js +10 -0
  133. package/build/services/auth/oauth-server/access-token.d.ts +36 -0
  134. package/build/services/auth/oauth-server/access-token.js +80 -0
  135. package/build/services/auth/oauth-server/authorization.d.ts +47 -0
  136. package/build/services/auth/oauth-server/authorization.js +54 -0
  137. package/build/services/auth/oauth-server/constants.d.ts +11 -0
  138. package/build/services/auth/oauth-server/constants.js +16 -0
  139. package/build/services/auth/oauth-server/index.d.ts +3 -0
  140. package/build/services/auth/oauth-server/index.js +27 -0
  141. package/build/services/auth/oauth-server/metadata.d.ts +21 -0
  142. package/build/services/auth/oauth-server/metadata.js +53 -0
  143. package/build/services/auth/oauth-server/registration.d.ts +42 -0
  144. package/build/services/auth/oauth-server/registration.js +134 -0
  145. package/build/services/auth/oauth-server/sql.d.ts +50 -0
  146. package/build/services/auth/oauth-server/sql.js +156 -0
  147. package/build/services/auth/oauth-server/store.d.ts +88 -0
  148. package/build/services/auth/oauth-server/store.js +171 -0
  149. package/build/services/auth/sql.d.ts +1 -0
  150. package/build/services/auth/sql.js +3 -1
  151. package/build/services/cron/index.js +5 -3
  152. package/build/services/escalation/queries.js +7 -2
  153. package/build/services/export/index.d.ts +10 -0
  154. package/build/services/export/index.js +27 -0
  155. package/build/services/invocation-access.d.ts +25 -4
  156. package/build/services/invocation-access.js +39 -7
  157. package/build/services/maintenance/index.js +8 -0
  158. package/build/services/mcp/client/connection-dispatch.d.ts +6 -1
  159. package/build/services/mcp/client/connection-dispatch.js +3 -2
  160. package/build/services/mcp/client/connection-lifecycle.d.ts +10 -2
  161. package/build/services/mcp/client/connection-lifecycle.js +45 -7
  162. package/build/services/mcp/client/connection-test.js +2 -6
  163. package/build/services/mcp/client/connection.d.ts +1 -1
  164. package/build/services/mcp/client/connection.js +3 -1
  165. package/build/services/mcp/client/index.d.ts +2 -2
  166. package/build/services/mcp/client/index.js +4 -1
  167. package/build/services/mcp/client/network-transport.d.ts +12 -0
  168. package/build/services/mcp/client/network-transport.js +20 -0
  169. package/build/services/mcp/client/tools.d.ts +13 -0
  170. package/build/services/mcp/client/tools.js +18 -0
  171. package/build/services/mcp/db-server/index.js +2 -1
  172. package/build/services/mcp/external-server.d.ts +9 -4
  173. package/build/services/mcp/external-server.js +34 -11
  174. package/build/services/mcp/playwright-server/index.js +2 -1
  175. package/build/services/mcp/registered-tools.d.ts +3 -0
  176. package/build/services/mcp/registered-tools.js +7 -0
  177. package/build/services/mcp/seed-service-account.d.ts +4 -1
  178. package/build/services/mcp/seed-service-account.js +11 -6
  179. package/build/services/mcp/server-lifecycle.js +2 -1
  180. package/build/services/workflow-invocation.d.ts +16 -3
  181. package/build/services/workflow-invocation.js +42 -10
  182. package/build/services/yaml-workflow/deployer.d.ts +10 -2
  183. package/build/services/yaml-workflow/deployer.js +17 -5
  184. package/build/services/yaml-workflow/invoke.js +31 -26
  185. package/build/services/yaml-workflow/workers/register.js +3 -13
  186. package/build/services/yaml-workflow/workers/step-tool.d.ts +7 -0
  187. package/build/services/yaml-workflow/workers/step-tool.js +69 -0
  188. package/build/start/config.js +7 -0
  189. package/build/start/index.js +4 -22
  190. package/build/start/server.d.ts +6 -4
  191. package/build/start/server.js +11 -35
  192. package/build/start/socket-auth.js +2 -1
  193. package/build/start/workers.js +1 -1
  194. package/build/system/mcp-servers/admin/agent-subscriptions.js +25 -1
  195. package/build/system/mcp-servers/admin/agents.js +25 -2
  196. package/build/system/mcp-servers/admin/announcements.js +3 -2
  197. package/build/system/mcp-servers/admin/bot-accounts.js +37 -5
  198. package/build/system/mcp-servers/admin/escalations.d.ts +3 -5
  199. package/build/system/mcp-servers/admin/escalations.js +74 -70
  200. package/build/system/mcp-servers/admin/exports.js +7 -1
  201. package/build/system/mcp-servers/admin/index.js +24 -25
  202. package/build/system/mcp-servers/admin/overview.d.ts +2 -2
  203. package/build/system/mcp-servers/admin/run-read.d.ts +2 -0
  204. package/build/system/mcp-servers/admin/run-read.js +5 -0
  205. package/build/system/mcp-servers/admin/scan-codes.d.ts +2 -2
  206. package/build/system/mcp-servers/admin/scan-codes.js +5 -11
  207. package/build/system/mcp-servers/admin/schemas.d.ts +26 -26
  208. package/build/system/mcp-servers/admin/tasks.js +7 -2
  209. package/build/system/mcp-servers/admin/users.js +31 -4
  210. package/build/system/mcp-servers/admin/workflow-config.js +12 -1
  211. package/build/system/mcp-servers/admin/workflows.js +27 -5
  212. package/build/system/mcp-servers/admin/yaml-workflows.js +13 -21
  213. package/build/system/mcp-servers/caller-auth.d.ts +18 -0
  214. package/build/system/mcp-servers/caller-auth.js +29 -0
  215. package/build/system/mcp-servers/claude-code.js +2 -1
  216. package/build/system/mcp-servers/db-query/index.js +2 -1
  217. package/build/system/mcp-servers/file-storage.js +2 -1
  218. package/build/system/mcp-servers/http-fetch.js +2 -1
  219. package/build/system/mcp-servers/human-queue.js +7 -3
  220. package/build/system/mcp-servers/oauth.js +31 -4
  221. package/build/system/mcp-servers/schema-exchange.js +2 -1
  222. package/build/system/mcp-servers/vision.d.ts +1 -0
  223. package/build/system/mcp-servers/vision.js +17 -7
  224. package/build/system/mcp-servers/workflow.js +13 -25
  225. package/build/system/seed/tool-manifests-admin.d.ts +2 -17985
  226. package/build/system/seed/tool-manifests-admin.js +121 -121
  227. package/build/system/seed/tool-manifests-data.d.ts +8 -374
  228. package/build/system/seed/tool-manifests-data.js +22 -4
  229. package/build/system/seed/tool-manifests-escalation.d.ts +2 -352
  230. package/build/system/seed/tool-manifests-escalation.js +11 -1
  231. package/build/system/seed/tool-manifests-events.d.ts +2 -116
  232. package/build/system/seed/tool-manifests-events.js +6 -2
  233. package/build/system/seed/tool-manifests-knowledge.d.ts +2 -221
  234. package/build/system/seed/tool-manifests-knowledge.js +41 -1
  235. package/build/system/seed/tool-manifests-workflows.d.ts +2 -71
  236. package/build/system/seed/tool-manifests-workflows.js +3 -1
  237. package/build/system/workflows/shared/principal-tools.d.ts +20 -0
  238. package/build/system/workflows/shared/principal-tools.js +64 -0
  239. package/build/system/workflows/shared/tool-executor.js +21 -11
  240. package/build/system/workflows/shared/tool-loader.js +8 -1
  241. package/build/tsconfig.tsbuildinfo +1 -1
  242. package/build/types/auth.d.ts +1 -1
  243. package/build/types/capability.d.ts +14 -0
  244. package/build/types/capability.js +2 -0
  245. package/build/types/events.d.ts +1 -1
  246. package/build/types/index.d.ts +3 -1
  247. package/build/types/maintenance.d.ts +2 -2
  248. package/build/types/mcp.d.ts +3 -1
  249. package/build/types/oauth-server.d.ts +52 -0
  250. package/build/types/oauth-server.js +2 -0
  251. package/build/types/startup.d.ts +15 -7
  252. package/build/vitest.config.js +2 -1
  253. package/build/vitest.fast.config.d.ts +2 -0
  254. package/build/vitest.fast.config.js +20 -0
  255. package/build/vitest.llm.config.d.ts +2 -0
  256. package/build/vitest.llm.config.js +16 -0
  257. package/dashboard/dist/assets/{AdminDashboard-BPWsgMfZ.js → AdminDashboard-B3mkMIOT.js} +2 -2
  258. package/dashboard/dist/assets/{AdminDashboard-BPWsgMfZ.js.map → AdminDashboard-B3mkMIOT.js.map} +1 -1
  259. package/dashboard/dist/assets/{AgentConfigPage-De9imyo5.js → AgentConfigPage-CQj2B678.js} +2 -2
  260. package/dashboard/dist/assets/{AgentConfigPage-De9imyo5.js.map → AgentConfigPage-CQj2B678.js.map} +1 -1
  261. package/dashboard/dist/assets/{AgentDetailPage-B6o96Y5G.js → AgentDetailPage-CzrD8JJI.js} +3 -3
  262. package/dashboard/dist/assets/{AgentDetailPage-B6o96Y5G.js.map → AgentDetailPage-CzrD8JJI.js.map} +1 -1
  263. package/dashboard/dist/assets/{AgentsPage-DMEmiK_W.js → AgentsPage-jg2OFwyW.js} +2 -2
  264. package/dashboard/dist/assets/{AgentsPage-DMEmiK_W.js.map → AgentsPage-jg2OFwyW.js.map} +1 -1
  265. package/dashboard/dist/assets/{AvailableEscalationsPage-DeYMngwE.js → AvailableEscalationsPage-IS28XBRe.js} +2 -2
  266. package/dashboard/dist/assets/{AvailableEscalationsPage-DeYMngwE.js.map → AvailableEscalationsPage-IS28XBRe.js.map} +1 -1
  267. package/dashboard/dist/assets/{BotPicker-DDmpgGHZ.js → BotPicker-DvEJFpwS.js} +2 -2
  268. package/dashboard/dist/assets/{BotPicker-DDmpgGHZ.js.map → BotPicker-DvEJFpwS.js.map} +1 -1
  269. package/dashboard/dist/assets/{BulkAssignModal-BqlklomG.js → BulkAssignModal-BoQCi-YC.js} +2 -2
  270. package/dashboard/dist/assets/{BulkAssignModal-BqlklomG.js.map → BulkAssignModal-BoQCi-YC.js.map} +1 -1
  271. package/dashboard/dist/assets/{CapabilitiesPage-DOtjDTbK.js → CapabilitiesPage-kwlrcb_t.js} +2 -2
  272. package/dashboard/dist/assets/{CapabilitiesPage-DOtjDTbK.js.map → CapabilitiesPage-kwlrcb_t.js.map} +1 -1
  273. package/dashboard/dist/assets/{CollapsibleSection-CLr8LP0V.js → CollapsibleSection-UMIV4KIj.js} +2 -2
  274. package/dashboard/dist/assets/{CollapsibleSection-CLr8LP0V.js.map → CollapsibleSection-UMIV4KIj.js.map} +1 -1
  275. package/dashboard/dist/assets/ConfirmDeleteModal-C5puwMg7.js +2 -0
  276. package/dashboard/dist/assets/ConfirmDeleteModal-C5puwMg7.js.map +1 -0
  277. package/dashboard/dist/assets/ConnectedAppsPage-drZa65kP.js +2 -0
  278. package/dashboard/dist/assets/ConnectedAppsPage-drZa65kP.js.map +1 -0
  279. package/dashboard/dist/assets/{CountdownTimer-DxX72PwV.js → CountdownTimer-LG03dVgR.js} +2 -2
  280. package/dashboard/dist/assets/{CountdownTimer-DxX72PwV.js.map → CountdownTimer-LG03dVgR.js.map} +1 -1
  281. package/dashboard/dist/assets/{CredentialsPage-CObc9Rs5.js → CredentialsPage-CaFQ6vLb.js} +2 -2
  282. package/dashboard/dist/assets/{CredentialsPage-CObc9Rs5.js.map → CredentialsPage-CaFQ6vLb.js.map} +1 -1
  283. package/dashboard/dist/assets/{CronLabel-Bb8GoNY5.js → CronLabel-Co5j7tzW.js} +2 -2
  284. package/dashboard/dist/assets/{CronLabel-Bb8GoNY5.js.map → CronLabel-Co5j7tzW.js.map} +1 -1
  285. package/dashboard/dist/assets/{ElapsedCell-CmGhVlYl.js → ElapsedCell-WJyE9G0T.js} +2 -2
  286. package/dashboard/dist/assets/{ElapsedCell-CmGhVlYl.js.map → ElapsedCell-WJyE9G0T.js.map} +1 -1
  287. package/dashboard/dist/assets/{EntityTimelinePanel-B4Jwy1w3.js → EntityTimelinePanel-CDFFfX9d.js} +2 -2
  288. package/dashboard/dist/assets/{EntityTimelinePanel-B4Jwy1w3.js.map → EntityTimelinePanel-CDFFfX9d.js.map} +1 -1
  289. package/dashboard/dist/assets/{EscalationListSchemaPage-CZZbZ4Aa.js → EscalationListSchemaPage-CMrUlaKI.js} +3 -3
  290. package/dashboard/dist/assets/{EscalationListSchemaPage-CZZbZ4Aa.js.map → EscalationListSchemaPage-CMrUlaKI.js.map} +1 -1
  291. package/dashboard/dist/assets/{EscalationSchemaPage-D0ko59_S.js → EscalationSchemaPage-Dx2Lyfrz.js} +2 -2
  292. package/dashboard/dist/assets/{EscalationSchemaPage-D0ko59_S.js.map → EscalationSchemaPage-Dx2Lyfrz.js.map} +1 -1
  293. package/dashboard/dist/assets/{EscalationTimeline-BcnJEKFD.js → EscalationTimeline-d3nvshOk.js} +2 -2
  294. package/dashboard/dist/assets/{EscalationTimeline-BcnJEKFD.js.map → EscalationTimeline-d3nvshOk.js.map} +1 -1
  295. package/dashboard/dist/assets/{EscalationTitleSelect-P0q5sck4.js → EscalationTitleSelect-DWQieOM9.js} +2 -2
  296. package/dashboard/dist/assets/{EscalationTitleSelect-P0q5sck4.js.map → EscalationTitleSelect-DWQieOM9.js.map} +1 -1
  297. package/dashboard/dist/assets/{EscalationsOverview-BLPmh4AF.js → EscalationsOverview-BX8Cpi0X.js} +2 -2
  298. package/dashboard/dist/assets/{EscalationsOverview-BLPmh4AF.js.map → EscalationsOverview-BX8Cpi0X.js.map} +1 -1
  299. package/dashboard/dist/assets/{EventTable-gBzi5tIS.js → EventTable-D1-ITVXS.js} +2 -2
  300. package/dashboard/dist/assets/{EventTable-gBzi5tIS.js.map → EventTable-D1-ITVXS.js.map} +1 -1
  301. package/dashboard/dist/assets/{FilterBar-BulSsWb2.js → FilterBar-ABC9ctin.js} +2 -2
  302. package/dashboard/dist/assets/{FilterBar-BulSsWb2.js.map → FilterBar-ABC9ctin.js.map} +1 -1
  303. package/dashboard/dist/assets/{FormattedValue-BMHRrvrL.js → FormattedValue-k27T4bG7.js} +2 -2
  304. package/dashboard/dist/assets/{FormattedValue-BMHRrvrL.js.map → FormattedValue-k27T4bG7.js.map} +1 -1
  305. package/dashboard/dist/assets/{GraphInvokePage--997yNRr.js → GraphInvokePage-DKUErxWc.js} +2 -2
  306. package/dashboard/dist/assets/{GraphInvokePage--997yNRr.js.map → GraphInvokePage-DKUErxWc.js.map} +1 -1
  307. package/dashboard/dist/assets/{HomePage-CwXFz--v.js → HomePage-C6u9dIpR.js} +2 -2
  308. package/dashboard/dist/assets/{HomePage-CwXFz--v.js.map → HomePage-C6u9dIpR.js.map} +1 -1
  309. package/dashboard/dist/assets/{ListToolbar-Df4qZryJ.js → ListToolbar-gA5rFzkz.js} +2 -2
  310. package/dashboard/dist/assets/{ListToolbar-Df4qZryJ.js.map → ListToolbar-gA5rFzkz.js.map} +1 -1
  311. package/dashboard/dist/assets/{McpOverview-DrogIAKJ.js → McpOverview-BOPo3J_i.js} +2 -2
  312. package/dashboard/dist/assets/{McpOverview-DrogIAKJ.js.map → McpOverview-BOPo3J_i.js.map} +1 -1
  313. package/dashboard/dist/assets/{McpQueryDetailPage-CJmvCAE6.js → McpQueryDetailPage-BRVVi0Zh.js} +2 -2
  314. package/dashboard/dist/assets/{McpQueryDetailPage-CJmvCAE6.js.map → McpQueryDetailPage-BRVVi0Zh.js.map} +1 -1
  315. package/dashboard/dist/assets/{McpQueryPage-lygo4Yq0.js → McpQueryPage-Dmbb6SAc.js} +2 -2
  316. package/dashboard/dist/assets/{McpQueryPage-lygo4Yq0.js.map → McpQueryPage-Dmbb6SAc.js.map} +1 -1
  317. package/dashboard/dist/assets/{McpRunDetailPage-hvns2sCm.js → McpRunDetailPage-bMXNO-6V.js} +2 -2
  318. package/dashboard/dist/assets/{McpRunDetailPage-hvns2sCm.js.map → McpRunDetailPage-bMXNO-6V.js.map} +1 -1
  319. package/dashboard/dist/assets/{McpRunsPage-C2_7spTX.js → McpRunsPage-Bi9AMWja.js} +2 -2
  320. package/dashboard/dist/assets/{McpRunsPage-C2_7spTX.js.map → McpRunsPage-Bi9AMWja.js.map} +1 -1
  321. package/dashboard/dist/assets/{OperationsPage-BlK8WlsY.js → OperationsPage-CvR74ZUJ.js} +3 -3
  322. package/dashboard/dist/assets/{OperationsPage-BlK8WlsY.js.map → OperationsPage-CvR74ZUJ.js.map} +1 -1
  323. package/dashboard/dist/assets/{OperatorDashboard-BeWBiMGX.js → OperatorDashboard-DctmZw10.js} +2 -2
  324. package/dashboard/dist/assets/{OperatorDashboard-BeWBiMGX.js.map → OperatorDashboard-DctmZw10.js.map} +1 -1
  325. package/dashboard/dist/assets/{PersonaDetailPage-CNHpsX_i.js → PersonaDetailPage-Ubqm2rQH.js} +2 -2
  326. package/dashboard/dist/assets/{PersonaDetailPage-CNHpsX_i.js.map → PersonaDetailPage-Ubqm2rQH.js.map} +1 -1
  327. package/dashboard/dist/assets/{PersonasPage-ChASEZRg.js → PersonasPage-BpFL2rpo.js} +2 -2
  328. package/dashboard/dist/assets/{PersonasPage-ChASEZRg.js.map → PersonasPage-BpFL2rpo.js.map} +1 -1
  329. package/dashboard/dist/assets/{PortalPage-D5Lk-PKF.js → PortalPage-Dfc_Q02R.js} +2 -2
  330. package/dashboard/dist/assets/{PortalPage-D5Lk-PKF.js.map → PortalPage-Dfc_Q02R.js.map} +1 -1
  331. package/dashboard/dist/assets/ProcessDetailPage-liJspvQh.js +2 -0
  332. package/dashboard/dist/assets/{ProcessDetailPage-DNgCIwRl.js.map → ProcessDetailPage-liJspvQh.js.map} +1 -1
  333. package/dashboard/dist/assets/{ProcessesListPage-pRjWuWlH.js → ProcessesListPage-C3OM5ZUy.js} +2 -2
  334. package/dashboard/dist/assets/{ProcessesListPage-pRjWuWlH.js.map → ProcessesListPage-C3OM5ZUy.js.map} +1 -1
  335. package/dashboard/dist/assets/ResolverForm-B1_x8Blv.js +8 -0
  336. package/dashboard/dist/assets/ResolverForm-B1_x8Blv.js.map +1 -0
  337. package/dashboard/dist/assets/{RoleDetailPage-Bh_UcfYY.js → RoleDetailPage-CrlYCh-R.js} +2 -2
  338. package/dashboard/dist/assets/{RoleDetailPage-Bh_UcfYY.js.map → RoleDetailPage-CrlYCh-R.js.map} +1 -1
  339. package/dashboard/dist/assets/{RolesPage-CK17N7zz.js → RolesPage-BaazL_pt.js} +2 -2
  340. package/dashboard/dist/assets/{RolesPage-CK17N7zz.js.map → RolesPage-BaazL_pt.js.map} +1 -1
  341. package/dashboard/dist/assets/{RunAsSelector-BEKUP0p2.js → RunAsSelector-DxuV0fa1.js} +2 -2
  342. package/dashboard/dist/assets/{RunAsSelector-BEKUP0p2.js.map → RunAsSelector-DxuV0fa1.js.map} +1 -1
  343. package/dashboard/dist/assets/{ScanCodesPage-Bd0Pflqx.js → ScanCodesPage-C0mvmYTq.js} +2 -2
  344. package/dashboard/dist/assets/{ScanCodesPage-Bd0Pflqx.js.map → ScanCodesPage-C0mvmYTq.js.map} +1 -1
  345. package/dashboard/dist/assets/{ScanSchemeDetailPage-CnuhozmJ.js → ScanSchemeDetailPage-CiJgt5dZ.js} +2 -2
  346. package/dashboard/dist/assets/{ScanSchemeDetailPage-CnuhozmJ.js.map → ScanSchemeDetailPage-CiJgt5dZ.js.map} +1 -1
  347. package/dashboard/dist/assets/{ScanStationPage-CoLc-q3h.js → ScanStationPage-DzGaXc40.js} +2 -2
  348. package/dashboard/dist/assets/{ScanStationPage-CoLc-q3h.js.map → ScanStationPage-DzGaXc40.js.map} +1 -1
  349. package/dashboard/dist/assets/{StickyPagination-COrfvkBi.js → StickyPagination-CqbjVY6T.js} +2 -2
  350. package/dashboard/dist/assets/{StickyPagination-COrfvkBi.js.map → StickyPagination-CqbjVY6T.js.map} +1 -1
  351. package/dashboard/dist/assets/{StreamMessageDetail-Cif2egLy.js → StreamMessageDetail-wX3i0aqs.js} +2 -2
  352. package/dashboard/dist/assets/{StreamMessageDetail-Cif2egLy.js.map → StreamMessageDetail-wX3i0aqs.js.map} +1 -1
  353. package/dashboard/dist/assets/{SwimlaneTimeline-BnZYTrAh.js → SwimlaneTimeline-C50PsFoV.js} +2 -2
  354. package/dashboard/dist/assets/{SwimlaneTimeline-BnZYTrAh.js.map → SwimlaneTimeline-C50PsFoV.js.map} +1 -1
  355. package/dashboard/dist/assets/{TaskDetailPage-DEz_dqyR.js → TaskDetailPage-bbNSv4Ae.js} +2 -2
  356. package/dashboard/dist/assets/{TaskDetailPage-DEz_dqyR.js.map → TaskDetailPage-bbNSv4Ae.js.map} +1 -1
  357. package/dashboard/dist/assets/{TasksListPage-oEfEGj0_.js → TasksListPage-CDWnm_d9.js} +2 -2
  358. package/dashboard/dist/assets/{TasksListPage-oEfEGj0_.js.map → TasksListPage-CDWnm_d9.js.map} +1 -1
  359. package/dashboard/dist/assets/{TimeAgo-Dz5TgZZZ.js → TimeAgo-BLjqlfoX.js} +2 -2
  360. package/dashboard/dist/assets/{TimeAgo-Dz5TgZZZ.js.map → TimeAgo-BLjqlfoX.js.map} +1 -1
  361. package/dashboard/dist/assets/{TimestampCell-BUTgE244.js → TimestampCell-CnW0ENb5.js} +2 -2
  362. package/dashboard/dist/assets/{TimestampCell-BUTgE244.js.map → TimestampCell-CnW0ENb5.js.map} +1 -1
  363. package/dashboard/dist/assets/{ToolTestPanel-BS4g6vt-.js → ToolTestPanel-DkMgCB-k.js} +2 -2
  364. package/dashboard/dist/assets/{ToolTestPanel-BS4g6vt-.js.map → ToolTestPanel-DkMgCB-k.js.map} +1 -1
  365. package/dashboard/dist/assets/{TopicDetailPage-C_I6JIVD.js → TopicDetailPage-g3pljKKX.js} +2 -2
  366. package/dashboard/dist/assets/{TopicDetailPage-C_I6JIVD.js.map → TopicDetailPage-g3pljKKX.js.map} +1 -1
  367. package/dashboard/dist/assets/{TopicsPage-Cr6-wfhJ.js → TopicsPage-CVcCYdy-.js} +2 -2
  368. package/dashboard/dist/assets/{TopicsPage-Cr6-wfhJ.js.map → TopicsPage-CVcCYdy-.js.map} +1 -1
  369. package/dashboard/dist/assets/{UserName-ZFpWMaFF.js → UserName-D6zGIK2i.js} +2 -2
  370. package/dashboard/dist/assets/{UserName-ZFpWMaFF.js.map → UserName-D6zGIK2i.js.map} +1 -1
  371. package/dashboard/dist/assets/{WorkflowExecutionPage-ByPixDZW.js → WorkflowExecutionPage-B8g81FCJ.js} +2 -2
  372. package/dashboard/dist/assets/{WorkflowExecutionPage-ByPixDZW.js.map → WorkflowExecutionPage-B8g81FCJ.js.map} +1 -1
  373. package/dashboard/dist/assets/{WorkflowsDashboard-CWsJdMdR.js → WorkflowsDashboard-nxT3bv6W.js} +2 -2
  374. package/dashboard/dist/assets/{WorkflowsDashboard-CWsJdMdR.js.map → WorkflowsDashboard-nxT3bv6W.js.map} +1 -1
  375. package/dashboard/dist/assets/{WorkflowsOverview-Dk9gyqZN.js → WorkflowsOverview-grI-KAI2.js} +2 -2
  376. package/dashboard/dist/assets/{WorkflowsOverview-Dk9gyqZN.js.map → WorkflowsOverview-grI-KAI2.js.map} +1 -1
  377. package/dashboard/dist/assets/{YamlWorkflowDetailPage-CHwcrsaT.js → YamlWorkflowDetailPage-BoZ-hfBE.js} +2 -2
  378. package/dashboard/dist/assets/{YamlWorkflowDetailPage-CHwcrsaT.js.map → YamlWorkflowDetailPage-BoZ-hfBE.js.map} +1 -1
  379. package/dashboard/dist/assets/{YamlWorkflowsPage-B5jRX2Ph.js → YamlWorkflowsPage-Bf04rwRv.js} +2 -2
  380. package/dashboard/dist/assets/{YamlWorkflowsPage-B5jRX2Ph.js.map → YamlWorkflowsPage-Bf04rwRv.js.map} +1 -1
  381. package/dashboard/dist/assets/{agents-Dd7E-27d.js → agents-Dphpdi8l.js} +2 -2
  382. package/dashboard/dist/assets/{agents-Dd7E-27d.js.map → agents-Dphpdi8l.js.map} +1 -1
  383. package/dashboard/dist/assets/{bots-CpaYjZTk.js → bots-DIFE298x.js} +2 -2
  384. package/dashboard/dist/assets/{bots-CpaYjZTk.js.map → bots-DIFE298x.js.map} +1 -1
  385. package/dashboard/dist/assets/{capabilities-CNjg_qv1.js → capabilities-D7Y7LClY.js} +2 -2
  386. package/dashboard/dist/assets/{capabilities-CNjg_qv1.js.map → capabilities-D7Y7LClY.js.map} +1 -1
  387. package/dashboard/dist/assets/{controlplane-DgmvnAtU.js → controlplane-D1TGcYsS.js} +2 -2
  388. package/dashboard/dist/assets/{controlplane-DgmvnAtU.js.map → controlplane-D1TGcYsS.js.map} +1 -1
  389. package/dashboard/dist/assets/{escalation-columns-Uj4U9g5H.js → escalation-columns-cwZE6xyo.js} +2 -2
  390. package/dashboard/dist/assets/{escalation-columns-Uj4U9g5H.js.map → escalation-columns-cwZE6xyo.js.map} +1 -1
  391. package/dashboard/dist/assets/{index-x5z73M9N.js → index-BzYcUPdD.js} +2 -2
  392. package/dashboard/dist/assets/{index-x5z73M9N.js.map → index-BzYcUPdD.js.map} +1 -1
  393. package/dashboard/dist/assets/index-CeCtqujG.js +67 -0
  394. package/dashboard/dist/assets/index-CeCtqujG.js.map +1 -0
  395. package/dashboard/dist/assets/{index-RIFT3RlO.js → index-ChV7pBjM.js} +2 -2
  396. package/dashboard/dist/assets/{index-RIFT3RlO.js.map → index-ChV7pBjM.js.map} +1 -1
  397. package/dashboard/dist/assets/{index-OfO0173w.js → index-CniRa65p.js} +2 -2
  398. package/dashboard/dist/assets/{index-OfO0173w.js.map → index-CniRa65p.js.map} +1 -1
  399. package/dashboard/dist/assets/{index-ByBy9M3L.js → index-CxdjT1Yk.js} +2 -2
  400. package/dashboard/dist/assets/{index-ByBy9M3L.js.map → index-CxdjT1Yk.js.map} +1 -1
  401. package/dashboard/dist/assets/{index-C_K7OlzT.js → index-DAvi5_2T.js} +2 -2
  402. package/dashboard/dist/assets/{index-C_K7OlzT.js.map → index-DAvi5_2T.js.map} +1 -1
  403. package/dashboard/dist/assets/{index-BrwqtXRh.js → index-DN-kX7hL.js} +2 -2
  404. package/dashboard/dist/assets/{index-BrwqtXRh.js.map → index-DN-kX7hL.js.map} +1 -1
  405. package/dashboard/dist/assets/index-Dl_8hbYI.js +2 -0
  406. package/dashboard/dist/assets/index-Dl_8hbYI.js.map +1 -0
  407. package/dashboard/dist/assets/{index-D4Dlznn9.js → index-DpKOr311.js} +2 -2
  408. package/dashboard/dist/assets/{index-D4Dlznn9.js.map → index-DpKOr311.js.map} +1 -1
  409. package/dashboard/dist/assets/{index-CnOvJz6U.js → index-Dy1wWu2e.js} +2 -2
  410. package/dashboard/dist/assets/{index-CnOvJz6U.js.map → index-Dy1wWu2e.js.map} +1 -1
  411. package/dashboard/dist/assets/{index-BT1Ms5Q5.js → index-HLu98Sqh.js} +2 -2
  412. package/dashboard/dist/assets/{index-BT1Ms5Q5.js.map → index-HLu98Sqh.js.map} +1 -1
  413. package/dashboard/dist/assets/{index-BFASQ7_X.js → index-ag2pCAPu.js} +2 -2
  414. package/dashboard/dist/assets/{index-BFASQ7_X.js.map → index-ag2pCAPu.js.map} +1 -1
  415. package/dashboard/dist/assets/{index-BsHVgWH6.js → index-gkxPN7Vx.js} +2 -2
  416. package/dashboard/dist/assets/{index-BsHVgWH6.js.map → index-gkxPN7Vx.js.map} +1 -1
  417. package/dashboard/dist/assets/index-m9A3UYst.css +1 -0
  418. package/dashboard/dist/assets/{knowledge-Cci_r6Kl.js → knowledge-DnMs-SOJ.js} +2 -2
  419. package/dashboard/dist/assets/{knowledge-Cci_r6Kl.js.map → knowledge-DnMs-SOJ.js.map} +1 -1
  420. package/dashboard/dist/assets/{mcp-NY4iL0L-.js → mcp-CwW-K3r4.js} +2 -2
  421. package/dashboard/dist/assets/{mcp-NY4iL0L-.js.map → mcp-CwW-K3r4.js.map} +1 -1
  422. package/dashboard/dist/assets/{mcp-query-CbvZo_I_.js → mcp-query-BZt5e8_Q.js} +2 -2
  423. package/dashboard/dist/assets/{mcp-query-CbvZo_I_.js.map → mcp-query-BZt5e8_Q.js.map} +1 -1
  424. package/dashboard/dist/assets/{personas-Fy-f7QQd.js → personas-UA-Xn60f.js} +2 -2
  425. package/dashboard/dist/assets/{personas-Fy-f7QQd.js.map → personas-UA-Xn60f.js.map} +1 -1
  426. package/dashboard/dist/assets/{pipelines-DKiuozxV.js → pipelines-Cu3PARum.js} +2 -2
  427. package/dashboard/dist/assets/{pipelines-DKiuozxV.js.map → pipelines-Cu3PARum.js.map} +1 -1
  428. package/dashboard/dist/assets/{tasks-CdM1Rkk9.js → tasks-BO6h8GJE.js} +2 -2
  429. package/dashboard/dist/assets/{tasks-CdM1Rkk9.js.map → tasks-BO6h8GJE.js.map} +1 -1
  430. package/dashboard/dist/assets/{topics-XNy2mf3n.js → topics-CWjCR-17.js} +2 -2
  431. package/dashboard/dist/assets/{topics-XNy2mf3n.js.map → topics-CWjCR-17.js.map} +1 -1
  432. package/dashboard/dist/assets/{useDebouncedValue-CyGcU3_S.js → useDebouncedValue-6t0jx1RB.js} +2 -2
  433. package/dashboard/dist/assets/{useDebouncedValue-CyGcU3_S.js.map → useDebouncedValue-6t0jx1RB.js.map} +1 -1
  434. package/dashboard/dist/assets/{useNamespace-C2RIh_IN.js → useNamespace-CqpoQx6D.js} +2 -2
  435. package/dashboard/dist/assets/{useNamespace-C2RIh_IN.js.map → useNamespace-CqpoQx6D.js.map} +1 -1
  436. package/dashboard/dist/assets/{useYamlActivityEvents-CDiV5fjf.js → useYamlActivityEvents-hmCQQwzB.js} +2 -2
  437. package/dashboard/dist/assets/{useYamlActivityEvents-CDiV5fjf.js.map → useYamlActivityEvents-hmCQQwzB.js.map} +1 -1
  438. package/dashboard/dist/assets/{validate-DcGWN82Y.js → validate-BIRn4a6d.js} +2 -2
  439. package/dashboard/dist/assets/{validate-DcGWN82Y.js.map → validate-BIRn4a6d.js.map} +1 -1
  440. package/dashboard/dist/assets/{yaml-workflows-CH8UrouH.js → yaml-workflows-ziUdZhKY.js} +2 -2
  441. package/dashboard/dist/assets/{yaml-workflows-CH8UrouH.js.map → yaml-workflows-ziUdZhKY.js.map} +1 -1
  442. package/dashboard/dist/index.html +2 -2
  443. package/docs/agents.md +3 -1
  444. package/docs/api/http/agents.md +15 -1
  445. package/docs/api/http/escalations.md +3 -3
  446. package/docs/api/http/exports.md +3 -1
  447. package/docs/api/http/file-browser.md +3 -1
  448. package/docs/api/http/mcp-endpoint.md +8 -5
  449. package/docs/api/http/mcp-servers.md +34 -4
  450. package/docs/api/http/namespaces.md +2 -0
  451. package/docs/api/http/pipelines.md +2 -0
  452. package/docs/api/http/roles.md +11 -8
  453. package/docs/api/http/service-accounts.md +8 -2
  454. package/docs/api/http/settings.md +29 -2
  455. package/docs/api/http/tasks.md +3 -1
  456. package/docs/api/http/topics.md +7 -1
  457. package/docs/api/http/users.md +8 -2
  458. package/docs/api/http/workflows.md +25 -10
  459. package/docs/api/http/yaml-workflows.md +21 -0
  460. package/docs/api/mcp/admin.md +409 -49
  461. package/docs/api/mcp/file-storage.md +4 -0
  462. package/docs/api/mcp/http-fetch.md +6 -2
  463. package/docs/api/mcp/human-queue.md +53 -0
  464. package/docs/api/mcp/index.md +13 -10
  465. package/docs/api/mcp/knowledge.md +34 -0
  466. package/docs/api/mcp/oauth.md +1 -1
  467. package/docs/api/mcp/ortho.md +113 -0
  468. package/docs/api/mcp/vision.md +1 -1
  469. package/docs/api/sdk/bot-accounts.md +1 -0
  470. package/docs/api/sdk/escalations.md +2 -2
  471. package/docs/api/sdk/mcp.md +2 -2
  472. package/docs/api/sdk/settings.md +1 -1
  473. package/docs/api/sdk/tasks.md +2 -2
  474. package/docs/api/sdk/workflows.md +2 -2
  475. package/docs/api/sdk/yaml-workflows.md +1 -1
  476. package/docs/architecture.md +3 -1
  477. package/docs/auth.md +3 -2
  478. package/docs/cloud.md +7 -2
  479. package/docs/dashboard.md +16 -7
  480. package/docs/data.md +1 -1
  481. package/docs/escalation-strategies.md +9 -20
  482. package/docs/events.md +6 -0
  483. package/docs/iam.md +7 -5
  484. package/docs/maintenance.md +51 -28
  485. package/docs/mcp.md +159 -210
  486. package/docs/oauth-and-delegation.md +32 -21
  487. package/docs/topics.md +2 -0
  488. package/docs/workflows.md +14 -112
  489. package/package.json +5 -3
  490. package/dashboard/dist/assets/ConfirmDeleteModal-DW4DrPur.js +0 -2
  491. package/dashboard/dist/assets/ConfirmDeleteModal-DW4DrPur.js.map +0 -1
  492. package/dashboard/dist/assets/ProcessDetailPage-DNgCIwRl.js +0 -2
  493. package/dashboard/dist/assets/ResolverForm-CKIOAGtY.js +0 -8
  494. package/dashboard/dist/assets/ResolverForm-CKIOAGtY.js.map +0 -1
  495. package/dashboard/dist/assets/index-CtlBjl8o.js +0 -2
  496. package/dashboard/dist/assets/index-CtlBjl8o.js.map +0 -1
  497. package/dashboard/dist/assets/index-LRYC__mE.js +0 -67
  498. package/dashboard/dist/assets/index-LRYC__mE.js.map +0 -1
  499. package/dashboard/dist/assets/index-MYI2_Xb3.css +0 -1
@@ -0,0 +1,54 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.checkAuthorizationRequest = checkAuthorizationRequest;
4
+ exports.isGrantPreset = isGrantPreset;
5
+ exports.withQuery = withQuery;
6
+ exports.grantablePresets = grantablePresets;
7
+ const registration_1 = require("./registration");
8
+ const store_1 = require("./store");
9
+ const constants_1 = require("./constants");
10
+ const CODE_CHALLENGE = /^[A-Za-z0-9_-]{43,128}$/;
11
+ const PRESETS = new Set(Object.keys(constants_1.PRESET_SCOPE));
12
+ const text = (value) => (typeof value === 'string' && value !== '' && !(0, registration_1.hasControlCharacters)(value) ? value : undefined);
13
+ async function checkAuthorizationRequest(params, settings) {
14
+ const clientId = text(params.client_id);
15
+ const redirectUri = text(params.redirect_uri);
16
+ const client = clientId ? await (0, store_1.getClient)(clientId) : null;
17
+ if (!client)
18
+ return { ok: false, redirect: false, error: 'invalid_client', description: 'unknown client_id' };
19
+ if (!redirectUri || !client.redirect_uris.includes(redirectUri)) {
20
+ return { ok: false, redirect: false, error: 'invalid_request', description: 'redirect_uri is not registered for this client' };
21
+ }
22
+ const state = text(params.state);
23
+ const fail = (error, description) => ({ ok: false, redirect: true, redirectUri, state, error, description });
24
+ if (params.response_type !== 'code')
25
+ return fail('unsupported_response_type', 'response_type must be code');
26
+ const codeChallenge = text(params.code_challenge);
27
+ if (!codeChallenge || !CODE_CHALLENGE.test(codeChallenge))
28
+ return fail('invalid_request', 'a PKCE code_challenge is required');
29
+ if (params.code_challenge_method !== 'S256')
30
+ return fail('invalid_request', 'code_challenge_method must be S256');
31
+ const resource = text(params.resource) ?? settings.resource;
32
+ if (resource !== settings.resource)
33
+ return fail('invalid_target', `resource must be ${settings.resource}`);
34
+ return { ok: true, request: { client, redirectUri, codeChallenge, state, scope: text(params.scope), resource } };
35
+ }
36
+ function isGrantPreset(value) {
37
+ return typeof value === 'string' && PRESETS.has(value);
38
+ }
39
+ /** `uri` with `params` added to its query, keeping any query it already has. */
40
+ function withQuery(uri, params) {
41
+ const url = new URL(uri);
42
+ for (const [key, value] of Object.entries(params))
43
+ if (value !== undefined)
44
+ url.searchParams.set(key, value);
45
+ return url.toString();
46
+ }
47
+ /**
48
+ * The presets the person may grant. Read-only always; Just be me only when it
49
+ * adds something: a membership that can write, or an admin tier.
50
+ */
51
+ function grantablePresets(roles) {
52
+ const canWrite = roles.some((r) => r.type === 'admin' || r.type === 'superadmin' || (r.write_scope ?? 'all') !== 'none');
53
+ return canWrite ? ['read_only', 'just_me'] : ['read_only'];
54
+ }
@@ -0,0 +1,11 @@
1
+ import type { LTGrantPreset } from '../../../types/oauth-server';
2
+ export declare const MCP_SCOPES: {
3
+ readonly READ: "mcp:read";
4
+ readonly FULL: "mcp:full";
5
+ };
6
+ /** The coarse scope a grant preset is reported as. */
7
+ export declare const PRESET_SCOPE: Record<LTGrantPreset, string>;
8
+ /** JOSE `typ` for access tokens (RFC 9068). */
9
+ export declare const ACCESS_TOKEN_TYPE = "at+jwt";
10
+ /** `principalType` of a request authenticated by an OAuth access token. */
11
+ export declare const OAUTH_PRINCIPAL_TYPE = "oauth";
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.OAUTH_PRINCIPAL_TYPE = exports.ACCESS_TOKEN_TYPE = exports.PRESET_SCOPE = exports.MCP_SCOPES = void 0;
4
+ exports.MCP_SCOPES = {
5
+ READ: 'mcp:read',
6
+ FULL: 'mcp:full',
7
+ };
8
+ /** The coarse scope a grant preset is reported as. */
9
+ exports.PRESET_SCOPE = {
10
+ read_only: exports.MCP_SCOPES.READ,
11
+ just_me: exports.MCP_SCOPES.FULL,
12
+ };
13
+ /** JOSE `typ` for access tokens (RFC 9068). */
14
+ exports.ACCESS_TOKEN_TYPE = 'at+jwt';
15
+ /** `principalType` of a request authenticated by an OAuth access token. */
16
+ exports.OAUTH_PRINCIPAL_TYPE = 'oauth';
@@ -0,0 +1,3 @@
1
+ export { REFRESH_REUSE_GRACE_SECONDS, createSecret, hashSecret, pkceChallenge, registerClient, getClient, issueAuthorizationCode, exchangeAuthorizationCode, rotateRefreshToken, getLiveGrant, revokeByRefreshToken, revokeGrant, listGrants, pruneOAuthServer, type RevokedGrant, type OAuthPruneCounts, } from './store';
2
+ export { signAccessToken, verifyAccessToken, accessTokenPrincipal, type AccessTokenTarget, type LTAccessTokenClaims, } from './access-token';
3
+ export { MCP_SCOPES, PRESET_SCOPE, ACCESS_TOKEN_TYPE, OAUTH_PRINCIPAL_TYPE } from './constants';
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.OAUTH_PRINCIPAL_TYPE = exports.ACCESS_TOKEN_TYPE = exports.PRESET_SCOPE = exports.MCP_SCOPES = exports.accessTokenPrincipal = exports.verifyAccessToken = exports.signAccessToken = exports.pruneOAuthServer = exports.listGrants = exports.revokeGrant = exports.revokeByRefreshToken = exports.getLiveGrant = exports.rotateRefreshToken = exports.exchangeAuthorizationCode = exports.issueAuthorizationCode = exports.getClient = exports.registerClient = exports.pkceChallenge = exports.hashSecret = exports.createSecret = exports.REFRESH_REUSE_GRACE_SECONDS = void 0;
4
+ var store_1 = require("./store");
5
+ Object.defineProperty(exports, "REFRESH_REUSE_GRACE_SECONDS", { enumerable: true, get: function () { return store_1.REFRESH_REUSE_GRACE_SECONDS; } });
6
+ Object.defineProperty(exports, "createSecret", { enumerable: true, get: function () { return store_1.createSecret; } });
7
+ Object.defineProperty(exports, "hashSecret", { enumerable: true, get: function () { return store_1.hashSecret; } });
8
+ Object.defineProperty(exports, "pkceChallenge", { enumerable: true, get: function () { return store_1.pkceChallenge; } });
9
+ Object.defineProperty(exports, "registerClient", { enumerable: true, get: function () { return store_1.registerClient; } });
10
+ Object.defineProperty(exports, "getClient", { enumerable: true, get: function () { return store_1.getClient; } });
11
+ Object.defineProperty(exports, "issueAuthorizationCode", { enumerable: true, get: function () { return store_1.issueAuthorizationCode; } });
12
+ Object.defineProperty(exports, "exchangeAuthorizationCode", { enumerable: true, get: function () { return store_1.exchangeAuthorizationCode; } });
13
+ Object.defineProperty(exports, "rotateRefreshToken", { enumerable: true, get: function () { return store_1.rotateRefreshToken; } });
14
+ Object.defineProperty(exports, "getLiveGrant", { enumerable: true, get: function () { return store_1.getLiveGrant; } });
15
+ Object.defineProperty(exports, "revokeByRefreshToken", { enumerable: true, get: function () { return store_1.revokeByRefreshToken; } });
16
+ Object.defineProperty(exports, "revokeGrant", { enumerable: true, get: function () { return store_1.revokeGrant; } });
17
+ Object.defineProperty(exports, "listGrants", { enumerable: true, get: function () { return store_1.listGrants; } });
18
+ Object.defineProperty(exports, "pruneOAuthServer", { enumerable: true, get: function () { return store_1.pruneOAuthServer; } });
19
+ var access_token_1 = require("./access-token");
20
+ Object.defineProperty(exports, "signAccessToken", { enumerable: true, get: function () { return access_token_1.signAccessToken; } });
21
+ Object.defineProperty(exports, "verifyAccessToken", { enumerable: true, get: function () { return access_token_1.verifyAccessToken; } });
22
+ Object.defineProperty(exports, "accessTokenPrincipal", { enumerable: true, get: function () { return access_token_1.accessTokenPrincipal; } });
23
+ var constants_1 = require("./constants");
24
+ Object.defineProperty(exports, "MCP_SCOPES", { enumerable: true, get: function () { return constants_1.MCP_SCOPES; } });
25
+ Object.defineProperty(exports, "PRESET_SCOPE", { enumerable: true, get: function () { return constants_1.PRESET_SCOPE; } });
26
+ Object.defineProperty(exports, "ACCESS_TOKEN_TYPE", { enumerable: true, get: function () { return constants_1.ACCESS_TOKEN_TYPE; } });
27
+ Object.defineProperty(exports, "OAUTH_PRINCIPAL_TYPE", { enumerable: true, get: function () { return constants_1.OAUTH_PRINCIPAL_TYPE; } });
@@ -0,0 +1,21 @@
1
+ import type { OAuthServerSettings } from '../../../modules/oauth-server';
2
+ /** Endpoint paths under the issuer. */
3
+ export declare const OAUTH_ENDPOINT_PATHS: {
4
+ readonly AUTHORIZE: "/api/oauth/authorize";
5
+ readonly TOKEN: "/api/oauth/token";
6
+ readonly REGISTER: "/api/oauth/register";
7
+ readonly REVOKE: "/api/oauth/revoke";
8
+ };
9
+ /** RFC 8414 authorization server metadata. */
10
+ export declare function authorizationServerMetadata(settings: OAuthServerSettings): Record<string, unknown>;
11
+ /** RFC 9728 protected resource metadata for `/mcp`. */
12
+ export declare function protectedResourceMetadata(settings: OAuthServerSettings): Record<string, unknown>;
13
+ /**
14
+ * Root-relative paths of the two well-known documents. The issuer's and the
15
+ * resource's paths are appended after the well-known segment (RFC 8414 §3,
16
+ * RFC 9728 §3).
17
+ */
18
+ export declare function wellKnownPaths(settings: OAuthServerSettings): {
19
+ authorizationServer: string;
20
+ protectedResource: string;
21
+ };
@@ -0,0 +1,53 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.OAUTH_ENDPOINT_PATHS = void 0;
4
+ exports.authorizationServerMetadata = authorizationServerMetadata;
5
+ exports.protectedResourceMetadata = protectedResourceMetadata;
6
+ exports.wellKnownPaths = wellKnownPaths;
7
+ const constants_1 = require("./constants");
8
+ /** Endpoint paths under the issuer. */
9
+ exports.OAUTH_ENDPOINT_PATHS = {
10
+ AUTHORIZE: '/api/oauth/authorize',
11
+ TOKEN: '/api/oauth/token',
12
+ REGISTER: '/api/oauth/register',
13
+ REVOKE: '/api/oauth/revoke',
14
+ };
15
+ const SCOPES_SUPPORTED = [constants_1.MCP_SCOPES.READ, constants_1.MCP_SCOPES.FULL];
16
+ /** RFC 8414 authorization server metadata. */
17
+ function authorizationServerMetadata(settings) {
18
+ const at = (path) => `${settings.issuer}${path}`;
19
+ return {
20
+ issuer: settings.issuer,
21
+ authorization_endpoint: at(exports.OAUTH_ENDPOINT_PATHS.AUTHORIZE),
22
+ token_endpoint: at(exports.OAUTH_ENDPOINT_PATHS.TOKEN),
23
+ registration_endpoint: at(exports.OAUTH_ENDPOINT_PATHS.REGISTER),
24
+ revocation_endpoint: at(exports.OAUTH_ENDPOINT_PATHS.REVOKE),
25
+ response_types_supported: ['code'],
26
+ grant_types_supported: ['authorization_code', 'refresh_token'],
27
+ code_challenge_methods_supported: ['S256'],
28
+ token_endpoint_auth_methods_supported: ['none'],
29
+ revocation_endpoint_auth_methods_supported: ['none'],
30
+ scopes_supported: SCOPES_SUPPORTED,
31
+ };
32
+ }
33
+ /** RFC 9728 protected resource metadata for `/mcp`. */
34
+ function protectedResourceMetadata(settings) {
35
+ return {
36
+ resource: settings.resource,
37
+ authorization_servers: [settings.issuer],
38
+ bearer_methods_supported: ['header'],
39
+ scopes_supported: SCOPES_SUPPORTED,
40
+ };
41
+ }
42
+ /**
43
+ * Root-relative paths of the two well-known documents. The issuer's and the
44
+ * resource's paths are appended after the well-known segment (RFC 8414 §3,
45
+ * RFC 9728 §3).
46
+ */
47
+ function wellKnownPaths(settings) {
48
+ const issuerPath = new URL(settings.issuer).pathname.replace(/\/+$/, '');
49
+ return {
50
+ authorizationServer: `/.well-known/oauth-authorization-server${issuerPath}`,
51
+ protectedResource: new URL(settings.resourceMetadataUrl).pathname,
52
+ };
53
+ }
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Dynamic client registration (RFC 7591) for public MCP clients: validation
3
+ * of the requested client metadata, and a per-address registration limit.
4
+ */
5
+ /** Whether a value carries a control character. */
6
+ export declare function hasControlCharacters(value: string): boolean;
7
+ /** A client name as the consent page may show it: no controls, no direction overrides, trimmed. */
8
+ export declare function displayableClientName(name: string): string;
9
+ /**
10
+ * The address a registration counts against: IPv4 as is, IPv6 by its /64,
11
+ * which one host or network usually holds in full.
12
+ */
13
+ export declare function registrationAddressKey(address: string): string;
14
+ export declare const REGISTRATION_ERRORS: {
15
+ readonly INVALID_REDIRECT_URI: "invalid_redirect_uri";
16
+ readonly INVALID_CLIENT_METADATA: "invalid_client_metadata";
17
+ };
18
+ export type RegistrationResult = {
19
+ ok: true;
20
+ clientName?: string;
21
+ redirectUris: string[];
22
+ } | {
23
+ ok: false;
24
+ error: string;
25
+ description: string;
26
+ };
27
+ /**
28
+ * Loopback http or https on any port, or an https URI equal, in canonical
29
+ * form, to one the deployment allows. Matching whole URIs, not hosts, keeps a
30
+ * code from landing on any other path, query or port of an allowed host.
31
+ */
32
+ export declare function isAllowedRedirectUri(uri: string, allowedUris: string[]): boolean;
33
+ export declare function validateClientMetadata(body: unknown, allowedUris: string[]): RegistrationResult;
34
+ /** A fixed-window count of registrations per address, in memory, per process. */
35
+ export declare class RegistrationLimiter {
36
+ private readonly limit;
37
+ private readonly windowMs;
38
+ private windows;
39
+ constructor(limit: number, windowMs: number);
40
+ /** Count one registration from `address`; false when over the limit. */
41
+ allow(address: string, now?: number): boolean;
42
+ }
@@ -0,0 +1,134 @@
1
+ "use strict";
2
+ /**
3
+ * Dynamic client registration (RFC 7591) for public MCP clients: validation
4
+ * of the requested client metadata, and a per-address registration limit.
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.RegistrationLimiter = exports.REGISTRATION_ERRORS = void 0;
8
+ exports.hasControlCharacters = hasControlCharacters;
9
+ exports.displayableClientName = displayableClientName;
10
+ exports.registrationAddressKey = registrationAddressKey;
11
+ exports.isAllowedRedirectUri = isAllowedRedirectUri;
12
+ exports.validateClientMetadata = validateClientMetadata;
13
+ const LOOPBACK_HOSTS = new Set(['127.0.0.1', 'localhost', '[::1]']);
14
+ /** C0 controls, DEL and C1 controls: never part of a token, an id or a URI. */
15
+ const CONTROL_CHARACTERS = /[\u0000-\u001f\u007f-\u009f]/;
16
+ /** Characters that reorder or hide text: a self-chosen client name must not use them to spoof another. */
17
+ const DISPLAY_SPOOFING = /[\u0000-\u001f\u007f-\u009f\u061c\u200b-\u200f\u202a-\u202e\u2060-\u2069\ufeff]/g;
18
+ /** Whether a value carries a control character. */
19
+ function hasControlCharacters(value) {
20
+ return CONTROL_CHARACTERS.test(value);
21
+ }
22
+ /** A client name as the consent page may show it: no controls, no direction overrides, trimmed. */
23
+ function displayableClientName(name) {
24
+ return name.replace(DISPLAY_SPOOFING, '').trim();
25
+ }
26
+ /** An IPv6 address as its eight groups, or null when it is not one. */
27
+ function ipv6Groups(ip) {
28
+ const halves = ip.split('::');
29
+ if (halves.length > 2)
30
+ return null;
31
+ const head = halves[0] ? halves[0].split(':') : [];
32
+ if (halves.length === 1)
33
+ return head.length === 8 ? head : null;
34
+ const tail = halves[1] ? halves[1].split(':') : [];
35
+ const missing = 8 - head.length - tail.length;
36
+ return missing < 0 ? null : [...head, ...Array(missing).fill('0'), ...tail];
37
+ }
38
+ /**
39
+ * The address a registration counts against: IPv4 as is, IPv6 by its /64,
40
+ * which one host or network usually holds in full.
41
+ */
42
+ function registrationAddressKey(address) {
43
+ const ip = address.split('%')[0];
44
+ if (ip.startsWith('::ffff:') && ip.includes('.'))
45
+ return ip.slice(7);
46
+ if (!ip.includes(':'))
47
+ return ip;
48
+ const groups = ipv6Groups(ip);
49
+ if (!groups)
50
+ return ip;
51
+ return `${groups.slice(0, 4).map((g) => (g.replace(/^0+(?=.)/, '') || '0').toLowerCase()).join(':')}::/64`;
52
+ }
53
+ const MAX_REDIRECT_URIS = 10;
54
+ const MAX_URI_LENGTH = 2048;
55
+ const MAX_NAME_LENGTH = 200;
56
+ const GRANT_TYPES = new Set(['authorization_code', 'refresh_token']);
57
+ const RESPONSE_TYPES = new Set(['code']);
58
+ exports.REGISTRATION_ERRORS = {
59
+ INVALID_REDIRECT_URI: 'invalid_redirect_uri',
60
+ INVALID_CLIENT_METADATA: 'invalid_client_metadata',
61
+ };
62
+ function invalid(error, description) {
63
+ return { ok: false, error, description };
64
+ }
65
+ /**
66
+ * Loopback http or https on any port, or an https URI equal, in canonical
67
+ * form, to one the deployment allows. Matching whole URIs, not hosts, keeps a
68
+ * code from landing on any other path, query or port of an allowed host.
69
+ */
70
+ function isAllowedRedirectUri(uri, allowedUris) {
71
+ if (uri.length > MAX_URI_LENGTH || hasControlCharacters(uri) || uri.trim() !== uri)
72
+ return false;
73
+ let url;
74
+ try {
75
+ url = new URL(uri);
76
+ }
77
+ catch {
78
+ return false;
79
+ }
80
+ if (url.hash || url.username || url.password)
81
+ return false;
82
+ if (url.protocol === 'http:')
83
+ return LOOPBACK_HOSTS.has(url.hostname);
84
+ if (url.protocol !== 'https:')
85
+ return false;
86
+ if (LOOPBACK_HOSTS.has(url.hostname))
87
+ return true;
88
+ return allowedUris.includes(url.href);
89
+ }
90
+ const isStringArray = (value) => Array.isArray(value) && value.every((v) => typeof v === 'string');
91
+ function validateClientMetadata(body, allowedUris) {
92
+ const input = (body ?? {});
93
+ const { redirect_uris, client_name, token_endpoint_auth_method, grant_types, response_types } = input;
94
+ if (!isStringArray(redirect_uris) || redirect_uris.length === 0 || redirect_uris.length > MAX_REDIRECT_URIS) {
95
+ return invalid(exports.REGISTRATION_ERRORS.INVALID_REDIRECT_URI, `redirect_uris must list 1 to ${MAX_REDIRECT_URIS} URIs`);
96
+ }
97
+ const refused = redirect_uris.find((uri) => !isAllowedRedirectUri(uri, allowedUris));
98
+ if (refused !== undefined) {
99
+ return invalid(exports.REGISTRATION_ERRORS.INVALID_REDIRECT_URI, `redirect URI not allowed: ${refused.slice(0, 200)}`);
100
+ }
101
+ if (client_name !== undefined && (typeof client_name !== 'string' || client_name.length > MAX_NAME_LENGTH)) {
102
+ return invalid(exports.REGISTRATION_ERRORS.INVALID_CLIENT_METADATA, `client_name must be a string of at most ${MAX_NAME_LENGTH} characters`);
103
+ }
104
+ const shownName = typeof client_name === 'string' ? displayableClientName(client_name) : undefined;
105
+ if (token_endpoint_auth_method !== undefined && token_endpoint_auth_method !== 'none') {
106
+ return invalid(exports.REGISTRATION_ERRORS.INVALID_CLIENT_METADATA, 'only public clients are supported: token_endpoint_auth_method must be none');
107
+ }
108
+ if (grant_types !== undefined && !(isStringArray(grant_types) && grant_types.every((g) => GRANT_TYPES.has(g)))) {
109
+ return invalid(exports.REGISTRATION_ERRORS.INVALID_CLIENT_METADATA, 'grant_types may include only authorization_code and refresh_token');
110
+ }
111
+ if (response_types !== undefined && !(isStringArray(response_types) && response_types.every((r) => RESPONSE_TYPES.has(r)))) {
112
+ return invalid(exports.REGISTRATION_ERRORS.INVALID_CLIENT_METADATA, 'response_types may include only code');
113
+ }
114
+ return { ok: true, clientName: shownName || undefined, redirectUris: redirect_uris };
115
+ }
116
+ /** A fixed-window count of registrations per address, in memory, per process. */
117
+ class RegistrationLimiter {
118
+ constructor(limit, windowMs) {
119
+ this.limit = limit;
120
+ this.windowMs = windowMs;
121
+ this.windows = new Map();
122
+ }
123
+ /** Count one registration from `address`; false when over the limit. */
124
+ allow(address, now = Date.now()) {
125
+ for (const [key, w] of this.windows)
126
+ if (now - w.start >= this.windowMs)
127
+ this.windows.delete(key);
128
+ const window = this.windows.get(address) ?? { start: now, count: 0 };
129
+ window.count += 1;
130
+ this.windows.set(address, window);
131
+ return window.count <= this.limit;
132
+ }
133
+ }
134
+ exports.RegistrationLimiter = RegistrationLimiter;
@@ -0,0 +1,50 @@
1
+ export declare const INSERT_CLIENT = "\n INSERT INTO lt_oauth_clients (client_id, client_name, redirect_uris)\n VALUES ($1, $2, $3)\n RETURNING client_id, client_name, redirect_uris, created_at";
2
+ export declare const GET_CLIENT = "\n SELECT client_id, client_name, redirect_uris, created_at\n FROM lt_oauth_clients WHERE client_id = $1";
3
+ /** Create the grant and its authorization code together. */
4
+ export declare const ISSUE_CODE = "\n WITH g AS (\n INSERT INTO lt_oauth_grants (user_id, client_id, policy, scope)\n VALUES ($1, $2, $3, $4)\n RETURNING id\n )\n INSERT INTO lt_oauth_codes (code_hash, grant_id, redirect_uri, code_challenge, resource, expires_at)\n SELECT $5, g.id, $6, $7, $8, NOW() + make_interval(secs => $9) FROM g\n RETURNING grant_id";
5
+ /**
6
+ * Consume a code and issue the first refresh token. The code must be unused,
7
+ * unexpired, for this client and redirect URI, and match the PKCE challenge;
8
+ * the grant must be live and its owner active.
9
+ */
10
+ export declare const EXCHANGE_CODE = "\n WITH c AS (\n UPDATE lt_oauth_codes c SET used_at = NOW()\n FROM lt_oauth_grants g\n WHERE c.code_hash = $1 AND c.used_at IS NULL AND c.expires_at > NOW()\n AND c.redirect_uri = $3 AND c.code_challenge = $4\n AND g.id = c.grant_id AND g.client_id = $2 AND g.revoked_at IS NULL\n RETURNING c.grant_id, c.resource\n ),\n g AS (\n SELECT g.* FROM lt_oauth_grants g\n JOIN c ON c.grant_id = g.id\n JOIN lt_users u ON u.id = g.user_id AND u.status = 'active'\n ),\n rt AS (\n INSERT INTO lt_oauth_refresh_tokens (token_hash, grant_id, expires_at)\n SELECT $5, g.id, NOW() + make_interval(secs => $6) FROM g\n RETURNING grant_id\n )\n SELECT g.id AS grant_id, g.user_id, g.client_id, g.policy, g.scope, c.resource, \n COALESCE((\n SELECT json_agg(json_build_object(\n 'role', r.role, 'type', r.type, 'read_scope', r.read_scope, 'write_scope', r.write_scope\n ) ORDER BY r.role)\n FROM lt_user_roles r WHERE r.user_id = g.user_id\n ), '[]'::json) AS roles\n FROM g JOIN rt ON rt.grant_id = g.id JOIN c ON c.grant_id = g.id";
11
+ /**
12
+ * The grant an access token names, as it stands now: only while the grant is
13
+ * unrevoked and its owner active, with the owner's current memberships. One
14
+ * primary-key lookup per /mcp request, so a revocation, a deactivation or a
15
+ * role change takes effect on the next request in every process.
16
+ */
17
+ export declare const GET_LIVE_GRANT = "\n SELECT g.id AS grant_id, g.user_id, g.client_id, g.policy, g.scope, \n COALESCE((\n SELECT json_agg(json_build_object(\n 'role', r.role, 'type', r.type, 'read_scope', r.read_scope, 'write_scope', r.write_scope\n ) ORDER BY r.role)\n FROM lt_user_roles r WHERE r.user_id = g.user_id\n ), '[]'::json) AS roles\n FROM lt_oauth_grants g\n JOIN lt_users u ON u.id = g.user_id AND u.status = 'active'\n WHERE g.id = $1 AND g.user_id = $2 AND g.revoked_at IS NULL";
18
+ /**
19
+ * Rotate a refresh token: mark the old one used and issue its successor, only
20
+ * for the client that holds it and while the grant is live and its owner
21
+ * active. Returns current roles.
22
+ */
23
+ export declare const ROTATE_REFRESH_TOKEN = "\n WITH old AS (\n UPDATE lt_oauth_refresh_tokens t SET used_at = NOW()\n FROM lt_oauth_grants og\n WHERE t.token_hash = $1 AND t.used_at IS NULL AND t.expires_at > NOW()\n AND og.id = t.grant_id AND og.client_id = $4\n RETURNING t.grant_id\n ),\n g AS (\n SELECT g.* FROM lt_oauth_grants g\n JOIN old ON old.grant_id = g.id\n JOIN lt_users u ON u.id = g.user_id AND u.status = 'active'\n WHERE g.revoked_at IS NULL\n ),\n rt AS (\n INSERT INTO lt_oauth_refresh_tokens (token_hash, grant_id, expires_at)\n SELECT $2, g.id, NOW() + make_interval(secs => $3) FROM g\n RETURNING grant_id\n )\n SELECT g.id AS grant_id, g.user_id, g.client_id, g.policy, g.scope, \n COALESCE((\n SELECT json_agg(json_build_object(\n 'role', r.role, 'type', r.type, 'read_scope', r.read_scope, 'write_scope', r.write_scope\n ) ORDER BY r.role)\n FROM lt_user_roles r WHERE r.user_id = g.user_id\n ), '[]'::json) AS roles\n FROM g JOIN rt ON rt.grant_id = g.id";
24
+ /**
25
+ * Revoke the grant of a refresh token presented again after it was used,
26
+ * outside the retry grace window: the token has leaked.
27
+ */
28
+ export declare const REVOKE_ON_REFRESH_REUSE = "\n UPDATE lt_oauth_grants g SET revoked_at = NOW()\n FROM lt_oauth_refresh_tokens t\n WHERE t.token_hash = $1 AND t.used_at IS NOT NULL\n AND t.used_at < NOW() - make_interval(secs => $2)\n AND g.id = t.grant_id AND g.revoked_at IS NULL\n RETURNING g.id AS grant_id, g.user_id";
29
+ /**
30
+ * Revoke the grant of an authorization code presented again after it was
31
+ * exchanged: the code has leaked (RFC 6749 §4.1.2).
32
+ */
33
+ export declare const REVOKE_ON_CODE_REUSE = "\n UPDATE lt_oauth_grants g SET revoked_at = NOW()\n FROM lt_oauth_codes c\n WHERE c.code_hash = $1 AND c.used_at IS NOT NULL\n AND g.id = c.grant_id AND g.revoked_at IS NULL\n RETURNING g.id AS grant_id, g.user_id";
34
+ /** Revoke the grant a refresh token belongs to, for the client presenting it. */
35
+ export declare const REVOKE_BY_REFRESH_TOKEN = "\n UPDATE lt_oauth_grants g SET revoked_at = NOW()\n FROM lt_oauth_refresh_tokens t\n WHERE t.token_hash = $1 AND g.id = t.grant_id AND g.client_id = $2 AND g.revoked_at IS NULL\n RETURNING g.id AS grant_id, g.user_id";
36
+ /** Revoke a grant by id, optionally only when it belongs to the given user. */
37
+ export declare const REVOKE_GRANT = "\n UPDATE lt_oauth_grants SET revoked_at = NOW()\n WHERE id = $1 AND ($2::uuid IS NULL OR user_id = $2) AND revoked_at IS NULL\n RETURNING id AS grant_id, user_id";
38
+ /** A person's live grants that a client has put to use, newest first. */
39
+ export declare const LIST_GRANTS = "\n SELECT g.id AS grant_id, g.client_id, c.client_name, g.policy, g.scope, g.created_at,\n (SELECT MAX(t.created_at) FROM lt_oauth_refresh_tokens t WHERE t.grant_id = g.id) AS last_used_at\n FROM lt_oauth_grants g\n JOIN lt_oauth_clients c ON c.client_id = g.client_id\n WHERE g.user_id = $1 AND g.revoked_at IS NULL\n AND EXISTS (SELECT 1 FROM lt_oauth_refresh_tokens t WHERE t.grant_id = g.id)\n ORDER BY g.created_at DESC";
40
+ /** Refresh tokens past expiry, or rotated out, longer ago than the window. */
41
+ export declare const PRUNE_REFRESH_TOKENS = "\n DELETE FROM lt_oauth_refresh_tokens\n WHERE expires_at < NOW() - $1::interval OR used_at < NOW() - $1::interval";
42
+ /** Authorization codes past expiry longer ago than the window, exchanged or not. */
43
+ export declare const PRUNE_CODES = "\n DELETE FROM lt_oauth_codes WHERE expires_at < NOW() - $1::interval";
44
+ /**
45
+ * Grants revoked longer ago than the window, and grants older than the window
46
+ * left with no refresh token and no code: never exchanged, or long unused.
47
+ */
48
+ export declare const PRUNE_GRANTS = "\n DELETE FROM lt_oauth_grants g\n WHERE g.revoked_at < NOW() - $1::interval\n OR (g.created_at < NOW() - $1::interval\n AND NOT EXISTS (SELECT 1 FROM lt_oauth_refresh_tokens t WHERE t.grant_id = g.id)\n AND NOT EXISTS (SELECT 1 FROM lt_oauth_codes c WHERE c.grant_id = g.id))";
49
+ /** Clients registered longer ago than the window with no live grant. */
50
+ export declare const PRUNE_CLIENTS = "\n DELETE FROM lt_oauth_clients c\n WHERE c.created_at < NOW() - $1::interval\n AND NOT EXISTS (SELECT 1 FROM lt_oauth_grants g WHERE g.client_id = c.client_id AND g.revoked_at IS NULL)";
@@ -0,0 +1,156 @@
1
+ "use strict";
2
+ // ── OAuth authorization server queries ─────────────────────────────────────
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.PRUNE_CLIENTS = exports.PRUNE_GRANTS = exports.PRUNE_CODES = exports.PRUNE_REFRESH_TOKENS = exports.LIST_GRANTS = exports.REVOKE_GRANT = exports.REVOKE_BY_REFRESH_TOKEN = exports.REVOKE_ON_CODE_REUSE = exports.REVOKE_ON_REFRESH_REUSE = exports.ROTATE_REFRESH_TOKEN = exports.GET_LIVE_GRANT = exports.EXCHANGE_CODE = exports.ISSUE_CODE = exports.GET_CLIENT = exports.INSERT_CLIENT = void 0;
5
+ /** The grant owner's current memberships, as a JSON array. Expects alias `g`. */
6
+ const GRANT_ROLES = `
7
+ COALESCE((
8
+ SELECT json_agg(json_build_object(
9
+ 'role', r.role, 'type', r.type, 'read_scope', r.read_scope, 'write_scope', r.write_scope
10
+ ) ORDER BY r.role)
11
+ FROM lt_user_roles r WHERE r.user_id = g.user_id
12
+ ), '[]'::json)`;
13
+ exports.INSERT_CLIENT = `
14
+ INSERT INTO lt_oauth_clients (client_id, client_name, redirect_uris)
15
+ VALUES ($1, $2, $3)
16
+ RETURNING client_id, client_name, redirect_uris, created_at`;
17
+ exports.GET_CLIENT = `
18
+ SELECT client_id, client_name, redirect_uris, created_at
19
+ FROM lt_oauth_clients WHERE client_id = $1`;
20
+ /** Create the grant and its authorization code together. */
21
+ exports.ISSUE_CODE = `
22
+ WITH g AS (
23
+ INSERT INTO lt_oauth_grants (user_id, client_id, policy, scope)
24
+ VALUES ($1, $2, $3, $4)
25
+ RETURNING id
26
+ )
27
+ INSERT INTO lt_oauth_codes (code_hash, grant_id, redirect_uri, code_challenge, resource, expires_at)
28
+ SELECT $5, g.id, $6, $7, $8, NOW() + make_interval(secs => $9) FROM g
29
+ RETURNING grant_id`;
30
+ /**
31
+ * Consume a code and issue the first refresh token. The code must be unused,
32
+ * unexpired, for this client and redirect URI, and match the PKCE challenge;
33
+ * the grant must be live and its owner active.
34
+ */
35
+ exports.EXCHANGE_CODE = `
36
+ WITH c AS (
37
+ UPDATE lt_oauth_codes c SET used_at = NOW()
38
+ FROM lt_oauth_grants g
39
+ WHERE c.code_hash = $1 AND c.used_at IS NULL AND c.expires_at > NOW()
40
+ AND c.redirect_uri = $3 AND c.code_challenge = $4
41
+ AND g.id = c.grant_id AND g.client_id = $2 AND g.revoked_at IS NULL
42
+ RETURNING c.grant_id, c.resource
43
+ ),
44
+ g AS (
45
+ SELECT g.* FROM lt_oauth_grants g
46
+ JOIN c ON c.grant_id = g.id
47
+ JOIN lt_users u ON u.id = g.user_id AND u.status = 'active'
48
+ ),
49
+ rt AS (
50
+ INSERT INTO lt_oauth_refresh_tokens (token_hash, grant_id, expires_at)
51
+ SELECT $5, g.id, NOW() + make_interval(secs => $6) FROM g
52
+ RETURNING grant_id
53
+ )
54
+ SELECT g.id AS grant_id, g.user_id, g.client_id, g.policy, g.scope, c.resource, ${GRANT_ROLES} AS roles
55
+ FROM g JOIN rt ON rt.grant_id = g.id JOIN c ON c.grant_id = g.id`;
56
+ /**
57
+ * The grant an access token names, as it stands now: only while the grant is
58
+ * unrevoked and its owner active, with the owner's current memberships. One
59
+ * primary-key lookup per /mcp request, so a revocation, a deactivation or a
60
+ * role change takes effect on the next request in every process.
61
+ */
62
+ exports.GET_LIVE_GRANT = `
63
+ SELECT g.id AS grant_id, g.user_id, g.client_id, g.policy, g.scope, ${GRANT_ROLES} AS roles
64
+ FROM lt_oauth_grants g
65
+ JOIN lt_users u ON u.id = g.user_id AND u.status = 'active'
66
+ WHERE g.id = $1 AND g.user_id = $2 AND g.revoked_at IS NULL`;
67
+ /**
68
+ * Rotate a refresh token: mark the old one used and issue its successor, only
69
+ * for the client that holds it and while the grant is live and its owner
70
+ * active. Returns current roles.
71
+ */
72
+ exports.ROTATE_REFRESH_TOKEN = `
73
+ WITH old AS (
74
+ UPDATE lt_oauth_refresh_tokens t SET used_at = NOW()
75
+ FROM lt_oauth_grants og
76
+ WHERE t.token_hash = $1 AND t.used_at IS NULL AND t.expires_at > NOW()
77
+ AND og.id = t.grant_id AND og.client_id = $4
78
+ RETURNING t.grant_id
79
+ ),
80
+ g AS (
81
+ SELECT g.* FROM lt_oauth_grants g
82
+ JOIN old ON old.grant_id = g.id
83
+ JOIN lt_users u ON u.id = g.user_id AND u.status = 'active'
84
+ WHERE g.revoked_at IS NULL
85
+ ),
86
+ rt AS (
87
+ INSERT INTO lt_oauth_refresh_tokens (token_hash, grant_id, expires_at)
88
+ SELECT $2, g.id, NOW() + make_interval(secs => $3) FROM g
89
+ RETURNING grant_id
90
+ )
91
+ SELECT g.id AS grant_id, g.user_id, g.client_id, g.policy, g.scope, ${GRANT_ROLES} AS roles
92
+ FROM g JOIN rt ON rt.grant_id = g.id`;
93
+ /**
94
+ * Revoke the grant of a refresh token presented again after it was used,
95
+ * outside the retry grace window: the token has leaked.
96
+ */
97
+ exports.REVOKE_ON_REFRESH_REUSE = `
98
+ UPDATE lt_oauth_grants g SET revoked_at = NOW()
99
+ FROM lt_oauth_refresh_tokens t
100
+ WHERE t.token_hash = $1 AND t.used_at IS NOT NULL
101
+ AND t.used_at < NOW() - make_interval(secs => $2)
102
+ AND g.id = t.grant_id AND g.revoked_at IS NULL
103
+ RETURNING g.id AS grant_id, g.user_id`;
104
+ /**
105
+ * Revoke the grant of an authorization code presented again after it was
106
+ * exchanged: the code has leaked (RFC 6749 §4.1.2).
107
+ */
108
+ exports.REVOKE_ON_CODE_REUSE = `
109
+ UPDATE lt_oauth_grants g SET revoked_at = NOW()
110
+ FROM lt_oauth_codes c
111
+ WHERE c.code_hash = $1 AND c.used_at IS NOT NULL
112
+ AND g.id = c.grant_id AND g.revoked_at IS NULL
113
+ RETURNING g.id AS grant_id, g.user_id`;
114
+ /** Revoke the grant a refresh token belongs to, for the client presenting it. */
115
+ exports.REVOKE_BY_REFRESH_TOKEN = `
116
+ UPDATE lt_oauth_grants g SET revoked_at = NOW()
117
+ FROM lt_oauth_refresh_tokens t
118
+ WHERE t.token_hash = $1 AND g.id = t.grant_id AND g.client_id = $2 AND g.revoked_at IS NULL
119
+ RETURNING g.id AS grant_id, g.user_id`;
120
+ /** Revoke a grant by id, optionally only when it belongs to the given user. */
121
+ exports.REVOKE_GRANT = `
122
+ UPDATE lt_oauth_grants SET revoked_at = NOW()
123
+ WHERE id = $1 AND ($2::uuid IS NULL OR user_id = $2) AND revoked_at IS NULL
124
+ RETURNING id AS grant_id, user_id`;
125
+ /** A person's live grants that a client has put to use, newest first. */
126
+ exports.LIST_GRANTS = `
127
+ SELECT g.id AS grant_id, g.client_id, c.client_name, g.policy, g.scope, g.created_at,
128
+ (SELECT MAX(t.created_at) FROM lt_oauth_refresh_tokens t WHERE t.grant_id = g.id) AS last_used_at
129
+ FROM lt_oauth_grants g
130
+ JOIN lt_oauth_clients c ON c.client_id = g.client_id
131
+ WHERE g.user_id = $1 AND g.revoked_at IS NULL
132
+ AND EXISTS (SELECT 1 FROM lt_oauth_refresh_tokens t WHERE t.grant_id = g.id)
133
+ ORDER BY g.created_at DESC`;
134
+ // ── Maintenance: each statement takes the retention window as $1 (an interval) ──
135
+ /** Refresh tokens past expiry, or rotated out, longer ago than the window. */
136
+ exports.PRUNE_REFRESH_TOKENS = `
137
+ DELETE FROM lt_oauth_refresh_tokens
138
+ WHERE expires_at < NOW() - $1::interval OR used_at < NOW() - $1::interval`;
139
+ /** Authorization codes past expiry longer ago than the window, exchanged or not. */
140
+ exports.PRUNE_CODES = `
141
+ DELETE FROM lt_oauth_codes WHERE expires_at < NOW() - $1::interval`;
142
+ /**
143
+ * Grants revoked longer ago than the window, and grants older than the window
144
+ * left with no refresh token and no code: never exchanged, or long unused.
145
+ */
146
+ exports.PRUNE_GRANTS = `
147
+ DELETE FROM lt_oauth_grants g
148
+ WHERE g.revoked_at < NOW() - $1::interval
149
+ OR (g.created_at < NOW() - $1::interval
150
+ AND NOT EXISTS (SELECT 1 FROM lt_oauth_refresh_tokens t WHERE t.grant_id = g.id)
151
+ AND NOT EXISTS (SELECT 1 FROM lt_oauth_codes c WHERE c.grant_id = g.id))`;
152
+ /** Clients registered longer ago than the window with no live grant. */
153
+ exports.PRUNE_CLIENTS = `
154
+ DELETE FROM lt_oauth_clients c
155
+ WHERE c.created_at < NOW() - $1::interval
156
+ AND NOT EXISTS (SELECT 1 FROM lt_oauth_grants g WHERE g.client_id = c.client_id AND g.revoked_at IS NULL)`;