@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,88 @@
1
+ import type { LTGrantPolicy, LTGrantSnapshot, LTGrantSummary, LTOAuthClient } from '../../../types/oauth-server';
2
+ /** A refresh token reused within this many seconds is treated as a client retry. */
3
+ export declare const REFRESH_REUSE_GRACE_SECONDS = 10;
4
+ export interface RevokedGrant {
5
+ grant_id: string;
6
+ user_id: string;
7
+ }
8
+ /** A new random secret: 32 bytes, base64url. */
9
+ export declare function createSecret(): string;
10
+ /** SHA-256 of a secret. Codes and refresh tokens are stored only as hashes. */
11
+ export declare function hashSecret(secret: string): string;
12
+ /** The PKCE S256 challenge for a code verifier (RFC 7636). */
13
+ export declare function pkceChallenge(verifier: string): string;
14
+ export declare function registerClient(input: {
15
+ clientName?: string;
16
+ redirectUris: string[];
17
+ }): Promise<LTOAuthClient>;
18
+ export declare const isClientId: (value: string) => boolean;
19
+ export declare function getClient(clientId: string): Promise<LTOAuthClient | null>;
20
+ /** Record the person's consent as a grant and return a one-time code for it. */
21
+ export declare function issueAuthorizationCode(input: {
22
+ userId: string;
23
+ clientId: string;
24
+ policy: LTGrantPolicy;
25
+ scope: string;
26
+ redirectUri: string;
27
+ codeChallenge: string;
28
+ resource?: string;
29
+ ttlSeconds: number;
30
+ }): Promise<{
31
+ code: string;
32
+ grantId: string;
33
+ }>;
34
+ /**
35
+ * Exchange a code for the grant and its first refresh token. Null when the
36
+ * code is unknown, used, expired, for another client or redirect URI, fails
37
+ * PKCE, or its grant or owner is no longer active. A code presented again
38
+ * after its exchange revokes its grant.
39
+ */
40
+ export declare function exchangeAuthorizationCode(input: {
41
+ code: string;
42
+ clientId: string;
43
+ redirectUri: string;
44
+ codeVerifier: string;
45
+ refreshTtlSeconds: number;
46
+ }): Promise<{
47
+ snapshot: LTGrantSnapshot;
48
+ resource: string | null;
49
+ refreshToken: string;
50
+ } | null>;
51
+ /**
52
+ * Rotate a refresh token for the client that holds it. Null when it is
53
+ * unknown, used, expired, another client's, or its grant or owner is no
54
+ * longer active. A used token presented again outside the
55
+ * grace window revokes its grant, and `revoked` reports it.
56
+ */
57
+ export declare function rotateRefreshToken(input: {
58
+ refreshToken: string;
59
+ clientId: string;
60
+ refreshTtlSeconds: number;
61
+ }): Promise<{
62
+ snapshot: LTGrantSnapshot;
63
+ refreshToken: string;
64
+ } | {
65
+ snapshot: null;
66
+ revoked: RevokedGrant | null;
67
+ }>;
68
+ /** The live grant an access token names; null when it is revoked, its owner inactive, or it is another user's. */
69
+ export declare function getLiveGrant(grantId: string, userId: string): Promise<LTGrantSnapshot | null>;
70
+ /** Revoke the grant behind a refresh token presented by its own client (RFC 7009). */
71
+ export declare function revokeByRefreshToken(refreshToken: string, clientId: string): Promise<RevokedGrant | null>;
72
+ /** Revoke a grant; with `userId`, only when it belongs to that user. */
73
+ export declare function revokeGrant(grantId: string, userId?: string): Promise<RevokedGrant | null>;
74
+ /** The person's live grants that a client has put to use. */
75
+ export declare function listGrants(userId: string): Promise<LTGrantSummary[]>;
76
+ export interface OAuthPruneCounts {
77
+ refreshTokens: number;
78
+ codes: number;
79
+ grants: number;
80
+ clients: number;
81
+ }
82
+ /**
83
+ * Delete what the authorization server no longer needs, older than the
84
+ * window (a Postgres interval): spent and expired refresh tokens and codes,
85
+ * then grants with neither left or revoked, then clients with no live grant.
86
+ * Each step reads what the one before it left.
87
+ */
88
+ export declare function pruneOAuthServer(olderThan: string): Promise<OAuthPruneCounts>;
@@ -0,0 +1,171 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.isClientId = exports.REFRESH_REUSE_GRACE_SECONDS = void 0;
37
+ exports.createSecret = createSecret;
38
+ exports.hashSecret = hashSecret;
39
+ exports.pkceChallenge = pkceChallenge;
40
+ exports.registerClient = registerClient;
41
+ exports.getClient = getClient;
42
+ exports.issueAuthorizationCode = issueAuthorizationCode;
43
+ exports.exchangeAuthorizationCode = exchangeAuthorizationCode;
44
+ exports.rotateRefreshToken = rotateRefreshToken;
45
+ exports.getLiveGrant = getLiveGrant;
46
+ exports.revokeByRefreshToken = revokeByRefreshToken;
47
+ exports.revokeGrant = revokeGrant;
48
+ exports.listGrants = listGrants;
49
+ exports.pruneOAuthServer = pruneOAuthServer;
50
+ const crypto = __importStar(require("crypto"));
51
+ const db_1 = require("../../../lib/db");
52
+ const uuid_1 = require("../../../lib/uuid");
53
+ const sql_1 = require("./sql");
54
+ /** A refresh token reused within this many seconds is treated as a client retry. */
55
+ exports.REFRESH_REUSE_GRACE_SECONDS = 10;
56
+ /** A new random secret: 32 bytes, base64url. */
57
+ function createSecret() {
58
+ return crypto.randomBytes(32).toString('base64url');
59
+ }
60
+ /** SHA-256 of a secret. Codes and refresh tokens are stored only as hashes. */
61
+ function hashSecret(secret) {
62
+ return crypto.createHash('sha256').update(secret).digest('hex');
63
+ }
64
+ /** The PKCE S256 challenge for a code verifier (RFC 7636). */
65
+ function pkceChallenge(verifier) {
66
+ return crypto.createHash('sha256').update(verifier).digest('base64url');
67
+ }
68
+ async function registerClient(input) {
69
+ const { rows } = await (0, db_1.getPool)().query(sql_1.INSERT_CLIENT, [
70
+ `ltc_${createSecret()}`, input.clientName ?? null, input.redirectUris,
71
+ ]);
72
+ return rows[0];
73
+ }
74
+ /** A client id as registerClient issues it; anything else names no client and never reaches SQL. */
75
+ const CLIENT_ID = /^ltc_[A-Za-z0-9_-]{43}$/;
76
+ const isClientId = (value) => CLIENT_ID.test(value);
77
+ exports.isClientId = isClientId;
78
+ async function getClient(clientId) {
79
+ if (!(0, exports.isClientId)(clientId))
80
+ return null;
81
+ const { rows } = await (0, db_1.getPool)().query(sql_1.GET_CLIENT, [clientId]);
82
+ return rows[0] ?? null;
83
+ }
84
+ /** Record the person's consent as a grant and return a one-time code for it. */
85
+ async function issueAuthorizationCode(input) {
86
+ if (!(0, uuid_1.isUuid)(input.userId))
87
+ throw new Error('issueAuthorizationCode: userId must be a UUID');
88
+ const code = createSecret();
89
+ const { rows } = await (0, db_1.getPool)().query(sql_1.ISSUE_CODE, [
90
+ input.userId, input.clientId, input.policy, input.scope,
91
+ hashSecret(code), input.redirectUri, input.codeChallenge, input.resource ?? null, input.ttlSeconds,
92
+ ]);
93
+ return { code, grantId: rows[0].grant_id };
94
+ }
95
+ /**
96
+ * Exchange a code for the grant and its first refresh token. Null when the
97
+ * code is unknown, used, expired, for another client or redirect URI, fails
98
+ * PKCE, or its grant or owner is no longer active. A code presented again
99
+ * after its exchange revokes its grant.
100
+ */
101
+ async function exchangeAuthorizationCode(input) {
102
+ const pool = (0, db_1.getPool)();
103
+ const refreshToken = createSecret();
104
+ const codeHash = hashSecret(input.code);
105
+ const { rows } = await pool.query(sql_1.EXCHANGE_CODE, [
106
+ codeHash, input.clientId, input.redirectUri, pkceChallenge(input.codeVerifier),
107
+ hashSecret(refreshToken), input.refreshTtlSeconds,
108
+ ]);
109
+ if (!rows[0]) {
110
+ await pool.query(sql_1.REVOKE_ON_CODE_REUSE, [codeHash]);
111
+ return null;
112
+ }
113
+ const { resource, ...snapshot } = rows[0];
114
+ return { snapshot, resource, refreshToken };
115
+ }
116
+ /**
117
+ * Rotate a refresh token for the client that holds it. Null when it is
118
+ * unknown, used, expired, another client's, or its grant or owner is no
119
+ * longer active. A used token presented again outside the
120
+ * grace window revokes its grant, and `revoked` reports it.
121
+ */
122
+ async function rotateRefreshToken(input) {
123
+ const pool = (0, db_1.getPool)();
124
+ const next = createSecret();
125
+ const oldHash = hashSecret(input.refreshToken);
126
+ const { rows } = await pool.query(sql_1.ROTATE_REFRESH_TOKEN, [oldHash, hashSecret(next), input.refreshTtlSeconds, input.clientId]);
127
+ if (rows[0])
128
+ return { snapshot: rows[0], refreshToken: next };
129
+ const reuse = await pool.query(sql_1.REVOKE_ON_REFRESH_REUSE, [oldHash, exports.REFRESH_REUSE_GRACE_SECONDS]);
130
+ return { snapshot: null, revoked: reuse.rows[0] ?? null };
131
+ }
132
+ /** The live grant an access token names; null when it is revoked, its owner inactive, or it is another user's. */
133
+ async function getLiveGrant(grantId, userId) {
134
+ if (!(0, uuid_1.isUuid)(grantId) || !(0, uuid_1.isUuid)(userId))
135
+ return null;
136
+ const { rows } = await (0, db_1.getPool)().query(sql_1.GET_LIVE_GRANT, [grantId, userId]);
137
+ return rows[0] ?? null;
138
+ }
139
+ /** Revoke the grant behind a refresh token presented by its own client (RFC 7009). */
140
+ async function revokeByRefreshToken(refreshToken, clientId) {
141
+ const { rows } = await (0, db_1.getPool)().query(sql_1.REVOKE_BY_REFRESH_TOKEN, [hashSecret(refreshToken), clientId]);
142
+ return rows[0] ?? null;
143
+ }
144
+ /** Revoke a grant; with `userId`, only when it belongs to that user. */
145
+ async function revokeGrant(grantId, userId) {
146
+ if (!(0, uuid_1.isUuid)(grantId) || (userId !== undefined && !(0, uuid_1.isUuid)(userId)))
147
+ return null;
148
+ const { rows } = await (0, db_1.getPool)().query(sql_1.REVOKE_GRANT, [grantId, userId ?? null]);
149
+ return rows[0] ?? null;
150
+ }
151
+ /** The person's live grants that a client has put to use. */
152
+ async function listGrants(userId) {
153
+ if (!(0, uuid_1.isUuid)(userId))
154
+ return [];
155
+ const { rows } = await (0, db_1.getPool)().query(sql_1.LIST_GRANTS, [userId]);
156
+ return rows;
157
+ }
158
+ /**
159
+ * Delete what the authorization server no longer needs, older than the
160
+ * window (a Postgres interval): spent and expired refresh tokens and codes,
161
+ * then grants with neither left or revoked, then clients with no live grant.
162
+ * Each step reads what the one before it left.
163
+ */
164
+ async function pruneOAuthServer(olderThan) {
165
+ const pool = (0, db_1.getPool)();
166
+ const refreshTokens = (await pool.query(sql_1.PRUNE_REFRESH_TOKENS, [olderThan])).rowCount ?? 0;
167
+ const codes = (await pool.query(sql_1.PRUNE_CODES, [olderThan])).rowCount ?? 0;
168
+ const grants = (await pool.query(sql_1.PRUNE_GRANTS, [olderThan])).rowCount ?? 0;
169
+ const clients = (await pool.query(sql_1.PRUNE_CLIENTS, [olderThan])).rowCount ?? 0;
170
+ return { refreshTokens, codes, grants, clients };
171
+ }
@@ -3,6 +3,7 @@ export declare const GET_BOT_KEYS_BY_USER = "\n SELECT id, name, user_id, key_h
3
3
  export declare const GET_ALL_ACTIVE_BOT_KEYS = "\n SELECT id, name, user_id, key_hash, scopes\n FROM lt_bot_api_keys\n WHERE (expires_at IS NULL OR expires_at > NOW())";
4
4
  export declare const UPDATE_BOT_KEY_LAST_USED = "\n UPDATE lt_bot_api_keys SET last_used_at = NOW() WHERE id = $1";
5
5
  export declare const DELETE_BOT_KEY = "\n DELETE FROM lt_bot_api_keys WHERE id = $1";
6
+ export declare const GET_BOT_KEY_OWNER = "\n SELECT user_id FROM lt_bot_api_keys WHERE id = $1";
6
7
  export declare const LIST_BOT_KEYS_BY_USER = "\n SELECT id, name, user_id, scopes, expires_at, last_used_at, created_at, updated_at\n FROM lt_bot_api_keys WHERE user_id = $1 ORDER BY created_at";
7
8
  export declare const INSERT_SERVICE_TOKEN = "\n INSERT INTO lt_service_tokens (name, token_hash, server_id, scopes, expires_at)\n VALUES ($1, $2, $3, $4, $5) RETURNING id";
8
9
  export declare const GET_ALL_ACTIVE_SERVICE_TOKENS = "\n SELECT id, name, token_hash FROM lt_service_tokens\n WHERE (expires_at IS NULL OR expires_at > NOW())";
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  // ── Bot API key queries ─────────────────────────────────────────────────────
3
3
  Object.defineProperty(exports, "__esModule", { value: true });
4
- exports.LIST_SERVICE_TOKENS_BY_SERVER = exports.DELETE_SERVICE_TOKEN = exports.UPDATE_SERVICE_TOKEN_LAST_USED = exports.GET_ALL_ACTIVE_SERVICE_TOKENS = exports.INSERT_SERVICE_TOKEN = exports.LIST_BOT_KEYS_BY_USER = exports.DELETE_BOT_KEY = exports.UPDATE_BOT_KEY_LAST_USED = exports.GET_ALL_ACTIVE_BOT_KEYS = exports.GET_BOT_KEYS_BY_USER = exports.INSERT_BOT_KEY = void 0;
4
+ exports.LIST_SERVICE_TOKENS_BY_SERVER = exports.DELETE_SERVICE_TOKEN = exports.UPDATE_SERVICE_TOKEN_LAST_USED = exports.GET_ALL_ACTIVE_SERVICE_TOKENS = exports.INSERT_SERVICE_TOKEN = exports.LIST_BOT_KEYS_BY_USER = exports.GET_BOT_KEY_OWNER = exports.DELETE_BOT_KEY = exports.UPDATE_BOT_KEY_LAST_USED = exports.GET_ALL_ACTIVE_BOT_KEYS = exports.GET_BOT_KEYS_BY_USER = exports.INSERT_BOT_KEY = void 0;
5
5
  exports.INSERT_BOT_KEY = `
6
6
  INSERT INTO lt_bot_api_keys (name, user_id, key_hash, scopes, expires_at)
7
7
  VALUES ($1, $2, $3, $4, $5) RETURNING id`;
@@ -18,6 +18,8 @@ exports.UPDATE_BOT_KEY_LAST_USED = `
18
18
  UPDATE lt_bot_api_keys SET last_used_at = NOW() WHERE id = $1`;
19
19
  exports.DELETE_BOT_KEY = `
20
20
  DELETE FROM lt_bot_api_keys WHERE id = $1`;
21
+ exports.GET_BOT_KEY_OWNER = `
22
+ SELECT user_id FROM lt_bot_api_keys WHERE id = $1`;
21
23
  exports.LIST_BOT_KEYS_BY_USER = `
22
24
  SELECT id, name, user_id, scopes, expires_at, last_used_at, created_at, updated_at
23
25
  FROM lt_bot_api_keys WHERE user_id = $1 ORDER BY created_at`;
@@ -65,6 +65,7 @@ function validateCronSchedule(expr) {
65
65
  const CRON_TOPIC_PREFIX = 'lt.cron';
66
66
  const CRON_ID_PREFIX = 'lt-cron';
67
67
  const YAML_CRON_TOPIC_PREFIX = 'lt.cron.yaml';
68
+ const CRON_SOURCE = 'cron';
68
69
  const YAML_CRON_ID_PREFIX = 'lt-cron-yaml';
69
70
  /**
70
71
  * Singleton registry for workflow cron schedules.
@@ -241,9 +242,10 @@ class LTCronRegistry {
241
242
  try {
242
243
  cronCallCount++;
243
244
  logger_1.loggerRegistry.info(`[lt-cron] tick #${cronCallCount} at ${new Date().toISOString()} — pub(${appId}/${graphTopic})`);
244
- const { getEngine } = await Promise.resolve().then(() => __importStar(require('../yaml-workflow/deployer')));
245
- const engine = await getEngine(appId);
246
- await engine.pub(graphTopic, cronEnvelope, undefined, { entity: graphTopic });
245
+ // Through the invoke service, so the run carries only the scope the
246
+ // server resolves for execute_as, never one written in the envelope.
247
+ const { invokeYamlWorkflow } = await Promise.resolve().then(() => __importStar(require('../yaml-workflow/invoke')));
248
+ await invokeYamlWorkflow(wf, { data: cronEnvelope, execute_as: wf.execute_as ?? undefined, source: CRON_SOURCE });
247
249
  logger_1.loggerRegistry.info(`[lt-cron] tick #${cronCallCount} published successfully`);
248
250
  }
249
251
  catch (err) {
@@ -278,8 +278,13 @@ async function listDistinctTypes() {
278
278
  * and an out-of-scope role yields an empty result, not someone else's rows.
279
279
  */
280
280
  function narrowRoleWithinScope(role, visibleRoles) {
281
- if (!role || !visibleRoles)
282
- return { role, roles: visibleRoles, empty: false };
281
+ if (!visibleRoles)
282
+ return { role, roles: undefined, empty: false };
283
+ // An empty scope sees nothing; the SDK would read an empty list as no filter.
284
+ if (visibleRoles.length === 0)
285
+ return { empty: true };
286
+ if (!role)
287
+ return { roles: visibleRoles, empty: false };
283
288
  if (!visibleRoles.includes(role))
284
289
  return { empty: true };
285
290
  return { role, roles: undefined, empty: false };
@@ -48,6 +48,16 @@ export interface WorkflowEnvelopes {
48
48
  * so, making this the natural polling body.
49
49
  */
50
50
  export declare function getWorkflowEnvelopes(workflowId: string, taskQueue: string, workflowName: string): Promise<WorkflowEnvelopes>;
51
+ /**
52
+ * The identity a run was started with: its start envelope's `lt` block
53
+ * (`userId` is who it runs as; `initiatedBy` is the person who started it
54
+ * under `execute_as`). Read from the run's own input, so it holds for every
55
+ * registered or durable run. Null when the run cannot be found.
56
+ */
57
+ export declare function getWorkflowStartIdentity(workflowId: string): Promise<{
58
+ userId?: string;
59
+ initiatedBy?: string;
60
+ } | null>;
51
61
  /**
52
62
  * Return the current job state of a workflow.
53
63
  * If the workflow is complete this is also the output.
@@ -4,11 +4,13 @@ exports.exportWorkflow = exportWorkflow;
4
4
  exports.getWorkflowStatus = getWorkflowStatus;
5
5
  exports.exportWorkflowExecution = exportWorkflowExecution;
6
6
  exports.getWorkflowEnvelopes = getWorkflowEnvelopes;
7
+ exports.getWorkflowStartIdentity = getWorkflowStartIdentity;
7
8
  exports.getWorkflowState = getWorkflowState;
8
9
  exports.listJobs = listJobs;
9
10
  const db_1 = require("../../lib/db");
10
11
  const hotmesh_utils_1 = require("../hotmesh-utils");
11
12
  const client_1 = require("./client");
13
+ const resolve_1 = require("../task/resolve");
12
14
  const post_process_1 = require("./post-process");
13
15
  const workflow_state_1 = require("../workflow-state");
14
16
  /** Error thrown when a workflow job is not found (expired or never existed). */
@@ -123,6 +125,31 @@ async function getWorkflowEnvelopes(workflowId, taskQueue, workflowName) {
123
125
  const output = await handle.output().catch(() => null);
124
126
  return { workflow_id: workflowId, status: reading.state, input, output: output ?? null };
125
127
  }
128
+ /**
129
+ * The identity a run was started with: its start envelope's `lt` block
130
+ * (`userId` is who it runs as; `initiatedBy` is the person who started it
131
+ * under `execute_as`). Read from the run's own input, so it holds for every
132
+ * registered or durable run. Null when the run cannot be found.
133
+ */
134
+ async function getWorkflowStartIdentity(workflowId) {
135
+ let resolved;
136
+ try {
137
+ resolved = await (0, resolve_1.resolveWorkflowHandle)(workflowId);
138
+ }
139
+ catch {
140
+ return null;
141
+ }
142
+ const handle = await (0, client_1.getHandle)(resolved.taskQueue, resolved.workflowName, workflowId);
143
+ const args = await handle.input().catch(() => undefined);
144
+ const envelope = Array.isArray(args) && args.length >= 1 ? args[0] : null;
145
+ const lt = (envelope && typeof envelope === 'object' ? envelope.lt : null) ?? null;
146
+ if (!lt)
147
+ return {};
148
+ return {
149
+ ...(typeof lt.userId === 'string' ? { userId: lt.userId } : {}),
150
+ ...(typeof lt.initiatedBy === 'string' ? { initiatedBy: lt.initiatedBy } : {}),
151
+ };
152
+ }
126
153
  /**
127
154
  * Return the current job state of a workflow.
128
155
  * If the workflow is complete this is also the output.
@@ -8,11 +8,32 @@ export declare const INVOCATION_ROLE_TYPES: {
8
8
  readonly ADMIN: "admin";
9
9
  };
10
10
  export declare const ADMIN_ROLE = "admin";
11
- /** Superadmin anywhere, or the named admin role held as admin type, invokes every workflow. */
12
- export declare function hasGlobalInvocationAccess(roles: readonly InvocationRoleGrant[], authRole?: string): boolean;
11
+ /** The workflow that calls a named MCP tool with lt-system authority. */
12
+ export declare const CAPABILITY_INVOKE_WORKFLOW = "capabilityInvoke";
13
+ /**
14
+ * Workflows whose activities act with lt-system authority. Started from
15
+ * outside the process, they would lend that authority to the caller, so only
16
+ * a superadmin may start one. Internal starts (agent triggers) are unaffected.
17
+ */
18
+ export declare const SYSTEM_AUTHORITY_WORKFLOWS: ReadonlySet<string>;
19
+ /**
20
+ * Whether a caller may run a workflow as another principal. A superadmin may
21
+ * act as anyone. Otherwise the caller needs an admin-type grant, the target
22
+ * holds no superadmin grant, and every grant the target holds the caller
23
+ * holds at the same or a higher type: an override never exceeds the caller.
24
+ */
25
+ export declare function mayActAs(caller: readonly InvocationRoleGrant[], target: readonly InvocationRoleGrant[]): boolean;
26
+ /**
27
+ * Superadmin anywhere, or the named admin role held as admin type, invokes
28
+ * every workflow. Decided from grants only, never a token's role claim.
29
+ */
30
+ export declare function hasGlobalInvocationAccess(roles: readonly InvocationRoleGrant[]): boolean;
13
31
  /**
14
32
  * The one invocation predicate, shared by the invoke gate and the per-caller
15
33
  * list so the two can never disagree. An empty invocation_roles list opens
16
- * the workflow to every authenticated caller.
34
+ * the workflow to every authenticated caller. A system-authority workflow
35
+ * needs a superadmin grant, whatever its stored roles say.
17
36
  */
18
- export declare function canInvokeWorkflow(config: Pick<LTWorkflowConfig, 'invocable' | 'invocation_roles'>, roles: readonly InvocationRoleGrant[], authRole?: string): boolean;
37
+ export declare function canInvokeWorkflow(config: Pick<LTWorkflowConfig, 'invocable' | 'invocation_roles'> & {
38
+ workflow_type?: string;
39
+ }, roles: readonly InvocationRoleGrant[]): boolean;
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.ADMIN_ROLE = exports.INVOCATION_ROLE_TYPES = void 0;
3
+ exports.SYSTEM_AUTHORITY_WORKFLOWS = exports.CAPABILITY_INVOKE_WORKFLOW = exports.ADMIN_ROLE = exports.INVOCATION_ROLE_TYPES = void 0;
4
+ exports.mayActAs = mayActAs;
4
5
  exports.hasGlobalInvocationAccess = hasGlobalInvocationAccess;
5
6
  exports.canInvokeWorkflow = canInvokeWorkflow;
6
7
  exports.INVOCATION_ROLE_TYPES = {
@@ -8,24 +9,55 @@ exports.INVOCATION_ROLE_TYPES = {
8
9
  ADMIN: 'admin',
9
10
  };
10
11
  exports.ADMIN_ROLE = 'admin';
11
- /** Superadmin anywhere, or the named admin role held as admin type, invokes every workflow. */
12
- function hasGlobalInvocationAccess(roles, authRole) {
13
- if (authRole === exports.INVOCATION_ROLE_TYPES.SUPERADMIN)
12
+ /** The workflow that calls a named MCP tool with lt-system authority. */
13
+ exports.CAPABILITY_INVOKE_WORKFLOW = 'capabilityInvoke';
14
+ /**
15
+ * Workflows whose activities act with lt-system authority. Started from
16
+ * outside the process, they would lend that authority to the caller, so only
17
+ * a superadmin may start one. Internal starts (agent triggers) are unaffected.
18
+ */
19
+ exports.SYSTEM_AUTHORITY_WORKFLOWS = new Set([exports.CAPABILITY_INVOKE_WORKFLOW]);
20
+ const ROLE_TYPE_RANK = { member: 1, admin: 2, superadmin: 3 };
21
+ function holdsSuperadmin(roles) {
22
+ return roles.some((r) => r.type === exports.INVOCATION_ROLE_TYPES.SUPERADMIN);
23
+ }
24
+ /**
25
+ * Whether a caller may run a workflow as another principal. A superadmin may
26
+ * act as anyone. Otherwise the caller needs an admin-type grant, the target
27
+ * holds no superadmin grant, and every grant the target holds the caller
28
+ * holds at the same or a higher type: an override never exceeds the caller.
29
+ */
30
+ function mayActAs(caller, target) {
31
+ if (holdsSuperadmin(caller))
14
32
  return true;
33
+ if (!caller.some((r) => r.type === exports.INVOCATION_ROLE_TYPES.ADMIN))
34
+ return false;
35
+ if (holdsSuperadmin(target))
36
+ return false;
37
+ return target.every((t) => caller.some((c) => c.role === t.role && (ROLE_TYPE_RANK[c.type] ?? 0) >= (ROLE_TYPE_RANK[t.type] ?? 0)));
38
+ }
39
+ /**
40
+ * Superadmin anywhere, or the named admin role held as admin type, invokes
41
+ * every workflow. Decided from grants only, never a token's role claim.
42
+ */
43
+ function hasGlobalInvocationAccess(roles) {
15
44
  return roles.some((r) => r.type === exports.INVOCATION_ROLE_TYPES.SUPERADMIN)
16
45
  || roles.some((r) => r.role === exports.ADMIN_ROLE && r.type === exports.INVOCATION_ROLE_TYPES.ADMIN);
17
46
  }
18
47
  /**
19
48
  * The one invocation predicate, shared by the invoke gate and the per-caller
20
49
  * list so the two can never disagree. An empty invocation_roles list opens
21
- * the workflow to every authenticated caller.
50
+ * the workflow to every authenticated caller. A system-authority workflow
51
+ * needs a superadmin grant, whatever its stored roles say.
22
52
  */
23
- function canInvokeWorkflow(config, roles, authRole) {
53
+ function canInvokeWorkflow(config, roles) {
24
54
  if (!config.invocable)
25
55
  return false;
56
+ if (config.workflow_type && exports.SYSTEM_AUTHORITY_WORKFLOWS.has(config.workflow_type))
57
+ return holdsSuperadmin(roles);
26
58
  if (config.invocation_roles.length === 0)
27
59
  return true;
28
- if (hasGlobalInvocationAccess(roles, authRole))
60
+ if (hasGlobalInvocationAccess(roles))
29
61
  return true;
30
62
  const held = new Set(roles.map((r) => r.role));
31
63
  return config.invocation_roles.some((r) => held.has(r));
@@ -106,6 +106,14 @@ async function executeRule(appId, rule) {
106
106
  }
107
107
  break;
108
108
  }
109
+ // Drop the authorization server's dead rows: spent or expired tokens and
110
+ // codes, grants with neither left or long revoked, clients with no live grant.
111
+ case rule.target === 'oauth' && rule.action === 'delete': {
112
+ const { pruneOAuthServer } = await Promise.resolve().then(() => __importStar(require('../auth/oauth-server')));
113
+ const counts = await pruneOAuthServer(rule.olderThan);
114
+ logger_1.loggerRegistry.info(`[lt-maintenance] oauth pruned: ${JSON.stringify(counts)} (olderThan: ${rule.olderThan})`);
115
+ break;
116
+ }
109
117
  default:
110
118
  logger_1.loggerRegistry.warn(`[lt-maintenance] unknown rule, skipping: ${JSON.stringify(rule)}`);
111
119
  }
@@ -8,7 +8,12 @@ import type { LTMcpToolManifest } from '../../../types';
8
8
  * are called via server._registeredTools[toolName].handler(args). This
9
9
  * eliminates the InMemoryTransport bottleneck under concurrent load.
10
10
  */
11
- export declare function dispatchBuiltinTool(serverId: string, toolName: string, args: Record<string, any>): Promise<{
11
+ export declare function dispatchBuiltinTool(serverId: string, toolName: string, args: Record<string, any>, extra?: {
12
+ authInfo?: {
13
+ userId: string;
14
+ role?: string;
15
+ };
16
+ }): Promise<{
12
17
  dispatched: true;
13
18
  result: any;
14
19
  } | null>;
@@ -13,7 +13,7 @@ const connection_lifecycle_1 = require("./connection-lifecycle");
13
13
  * are called via server._registeredTools[toolName].handler(args). This
14
14
  * eliminates the InMemoryTransport bottleneck under concurrent load.
15
15
  */
16
- async function dispatchBuiltinTool(serverId, toolName, args) {
16
+ async function dispatchBuiltinTool(serverId, toolName, args, extra) {
17
17
  const builtinFactories = (0, connection_lifecycle_1.getBuiltinFactories)();
18
18
  const builtinServers = (0, connection_lifecycle_1.getBuiltinServers)();
19
19
  // Normalize and match against builtin factories
@@ -43,7 +43,8 @@ async function dispatchBuiltinTool(serverId, toolName, args) {
43
43
  // Call the handler directly — no transport, no JSON-RPC.
44
44
  // Tool handlers return MCP-shaped responses: { content: [{ type: 'text', text: '...' }] }
45
45
  // Parse the text content the same way callServerTool does.
46
- const mcpResponse = await tool.handler(args);
46
+ // With `extra`, the handler sees an external caller and acts as them.
47
+ const mcpResponse = extra ? await tool.handler(args, extra) : await tool.handler(args);
47
48
  let parsed = mcpResponse;
48
49
  if (mcpResponse && Array.isArray(mcpResponse.content)) {
49
50
  const textContent = mcpResponse.content.find((c) => c.type === 'text');
@@ -1,5 +1,5 @@
1
1
  import { Client } from '@modelcontextprotocol/sdk/client/index.js';
2
- import type { LTMcpServerRecord } from '../../../types';
2
+ import type { LTMcpServerRecord, LTToolManifestEntry } from '../../../types';
3
3
  /** Read-only access to the clients map for sibling modules. */
4
4
  export declare function getClients(): Map<string, Client>;
5
5
  /** Read-only access to the builtin factories map for sibling modules. */
@@ -10,7 +10,9 @@ export declare function getBuiltinServers(): Map<string, any>;
10
10
  * Register a built-in server factory so it can be auto-connected
11
11
  * when callServerTool is invoked with its name.
12
12
  */
13
- export declare function registerBuiltinServer(name: string, factory: () => Promise<any>): void;
13
+ export declare function registerBuiltinServer(name: string, factory: () => Promise<any>, toolManifest?: LTToolManifestEntry[]): void;
14
+ /** The tool manifest a built-in server was registered with, if any. */
15
+ export declare function getBuiltinToolManifest(name: string): LTToolManifestEntry[] | undefined;
14
16
  /**
15
17
  * Connect to a registered MCP server.
16
18
  * Creates the appropriate transport based on transport_type,
@@ -29,6 +31,12 @@ export declare function disconnectFromServer(serverId: string): Promise<void>;
29
31
  * Alias lookups (e.g. 'translation' matching 'long-tail-translation') reuse
30
32
  * the same client instance to avoid double-connecting the singleton server.
31
33
  */
34
+ /**
35
+ * The built-in server a server id or name resolves to, by the same rules
36
+ * resolveClient follows: an exact or fuzzy factory name, else a registered
37
+ * server whose name matches a factory. Null for an external server.
38
+ */
39
+ export declare function resolveBuiltinServerName(serverId: string): Promise<string | null>;
32
40
  export declare function resolveClient(serverId: string): Promise<Client | null>;
33
41
  /**
34
42
  * Connect to all auto-connect servers.