@hotmeshio/long-tail 0.23.1 → 0.24.0

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 (562) hide show
  1. package/build/adapters/express.d.ts +9 -1
  2. package/build/adapters/express.js +32 -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/index.d.ts +1 -0
  14. package/build/api/escalations/index.js +4 -1
  15. package/build/api/escalations/list.d.ts +5 -0
  16. package/build/api/escalations/list.js +19 -5
  17. package/build/api/escalations/metadata.js +3 -0
  18. package/build/api/escalations/related.d.ts +18 -0
  19. package/build/api/escalations/related.js +205 -0
  20. package/build/api/escalations/single.d.ts +3 -2
  21. package/build/api/escalations/single.js +8 -3
  22. package/build/api/mcp/tools.d.ts +12 -0
  23. package/build/api/mcp/tools.js +113 -9
  24. package/build/api/roles.js +4 -0
  25. package/build/api/scan-codes/choice.js +31 -7
  26. package/build/api/scan-codes/present.js +5 -1
  27. package/build/api/settings.d.ts +1 -1
  28. package/build/api/settings.js +12 -1
  29. package/build/api/tasks.d.ts +3 -3
  30. package/build/api/tasks.js +30 -7
  31. package/build/api/workflows/input-lookups.js +1 -1
  32. package/build/api/workflows/invocable.js +2 -2
  33. package/build/api/workflows/invocation.js +1 -1
  34. package/build/api/yaml-workflows/deploy.d.ts +10 -2
  35. package/build/api/yaml-workflows/deploy.js +42 -2
  36. package/build/lib/db/schemas/038_oauth_server.sql +46 -0
  37. package/build/lib/events/browser-view.d.ts +15 -0
  38. package/build/lib/events/browser-view.js +101 -0
  39. package/build/lib/events/nats-ws-filter.d.ts +29 -0
  40. package/build/lib/events/nats-ws-filter.js +94 -0
  41. package/build/lib/events/nats-ws-proxy.d.ts +2 -0
  42. package/build/lib/events/nats-ws-proxy.js +39 -5
  43. package/build/lib/events/nats-ws-server-filter.d.ts +16 -0
  44. package/build/lib/events/nats-ws-server-filter.js +56 -0
  45. package/build/lib/events/nats-ws-ticket.d.ts +10 -0
  46. package/build/lib/events/nats-ws-ticket.js +42 -0
  47. package/build/lib/events/socketio.d.ts +10 -1
  48. package/build/lib/events/socketio.js +10 -3
  49. package/build/lib/http/index.d.ts +27 -0
  50. package/build/lib/http/index.js +55 -0
  51. package/build/modules/auth.d.ts +15 -24
  52. package/build/modules/auth.js +43 -126
  53. package/build/modules/capabilities.d.ts +62 -0
  54. package/build/modules/capabilities.js +188 -0
  55. package/build/modules/config.d.ts +14 -0
  56. package/build/modules/config.js +20 -0
  57. package/build/modules/defaults.d.ts +10 -0
  58. package/build/modules/defaults.js +12 -1
  59. package/build/modules/display.d.ts +15 -0
  60. package/build/modules/display.js +27 -0
  61. package/build/modules/mcp-auth.d.ts +11 -0
  62. package/build/modules/mcp-auth.js +56 -0
  63. package/build/modules/oauth-server.d.ts +18 -0
  64. package/build/modules/oauth-server.js +40 -0
  65. package/build/routes/agents.js +46 -14
  66. package/build/routes/announcements.js +2 -2
  67. package/build/routes/auth-sso.js +2 -2
  68. package/build/routes/auth.js +2 -2
  69. package/build/routes/bot-accounts.js +26 -3
  70. package/build/routes/capabilities.js +4 -4
  71. package/build/routes/controlplane.js +2 -2
  72. package/build/routes/dba.js +2 -2
  73. package/build/routes/delegation.js +2 -2
  74. package/build/routes/diagnostics.js +2 -2
  75. package/build/routes/docs.js +2 -2
  76. package/build/routes/domain.js +2 -2
  77. package/build/routes/escalations/accumulate.d.ts +1 -1
  78. package/build/routes/escalations/acting.d.ts +1 -1
  79. package/build/routes/escalations/analytics.d.ts +1 -1
  80. package/build/routes/escalations/bulk.d.ts +1 -1
  81. package/build/routes/escalations/facets.d.ts +1 -1
  82. package/build/routes/escalations/index.js +5 -2
  83. package/build/routes/escalations/list.d.ts +1 -1
  84. package/build/routes/escalations/list.js +2 -0
  85. package/build/routes/escalations/metadata.d.ts +1 -1
  86. package/build/routes/escalations/related.d.ts +7 -0
  87. package/build/routes/escalations/related.js +60 -0
  88. package/build/routes/escalations/resolve.d.ts +1 -1
  89. package/build/routes/escalations/single.d.ts +1 -1
  90. package/build/routes/escalations/single.js +1 -1
  91. package/build/routes/exports.js +14 -13
  92. package/build/routes/file-browser.js +9 -8
  93. package/build/routes/files.js +2 -2
  94. package/build/routes/index.js +4 -2
  95. package/build/routes/insight.js +5 -4
  96. package/build/routes/knowledge.js +2 -2
  97. package/build/routes/maintenance.js +2 -2
  98. package/build/routes/mcp-endpoint.d.ts +3 -1
  99. package/build/routes/mcp-endpoint.js +18 -8
  100. package/build/routes/mcp.js +35 -15
  101. package/build/routes/me.js +2 -2
  102. package/build/routes/namespaces.js +4 -3
  103. package/build/routes/nats-credentials.js +27 -3
  104. package/build/routes/oauth-server/authorize.d.ts +2 -0
  105. package/build/routes/oauth-server/authorize.js +108 -0
  106. package/build/routes/oauth-server/grants.d.ts +2 -0
  107. package/build/routes/oauth-server/grants.js +35 -0
  108. package/build/routes/oauth-server/index.d.ts +8 -0
  109. package/build/routes/oauth-server/index.js +52 -0
  110. package/build/routes/oauth-server/registration.d.ts +2 -0
  111. package/build/routes/oauth-server/registration.js +38 -0
  112. package/build/routes/oauth-server/token.d.ts +2 -0
  113. package/build/routes/oauth-server/token.js +100 -0
  114. package/build/routes/oauth-well-known.d.ts +8 -0
  115. package/build/routes/oauth-well-known.js +31 -0
  116. package/build/routes/oauth.js +2 -2
  117. package/build/routes/overview.js +2 -2
  118. package/build/routes/personas.js +2 -2
  119. package/build/routes/pipelines.js +6 -5
  120. package/build/routes/roles.js +2 -2
  121. package/build/routes/scan-codes.js +2 -2
  122. package/build/routes/settings.js +2 -2
  123. package/build/routes/tasks.js +5 -5
  124. package/build/routes/topics.js +21 -9
  125. package/build/routes/users.js +25 -22
  126. package/build/routes/workflow-sets.js +13 -12
  127. package/build/routes/workflows/config.js +15 -2
  128. package/build/routes/workflows/discovery.js +2 -2
  129. package/build/routes/workflows/index.js +2 -2
  130. package/build/routes/workflows/invocation.js +11 -10
  131. package/build/routes/yaml-workflows/cron.js +19 -6
  132. package/build/routes/yaml-workflows/crud.js +13 -12
  133. package/build/routes/yaml-workflows/deployment.js +11 -10
  134. package/build/routes/yaml-workflows/index.js +2 -2
  135. package/build/routes/yaml-workflows/versions.js +2 -2
  136. package/build/scripts/consolidation-sim.d.ts +25 -0
  137. package/build/scripts/consolidation-sim.js +141 -0
  138. package/build/sdk/index.d.ts +12 -0
  139. package/build/sdk/index.js +2 -0
  140. package/build/services/agent/authority.d.ts +14 -0
  141. package/build/services/agent/authority.js +53 -0
  142. package/build/services/auth/bot-api-key.d.ts +2 -0
  143. package/build/services/auth/bot-api-key.js +10 -0
  144. package/build/services/auth/oauth-server/access-token.d.ts +36 -0
  145. package/build/services/auth/oauth-server/access-token.js +80 -0
  146. package/build/services/auth/oauth-server/authorization.d.ts +47 -0
  147. package/build/services/auth/oauth-server/authorization.js +54 -0
  148. package/build/services/auth/oauth-server/constants.d.ts +11 -0
  149. package/build/services/auth/oauth-server/constants.js +16 -0
  150. package/build/services/auth/oauth-server/index.d.ts +3 -0
  151. package/build/services/auth/oauth-server/index.js +26 -0
  152. package/build/services/auth/oauth-server/metadata.d.ts +21 -0
  153. package/build/services/auth/oauth-server/metadata.js +53 -0
  154. package/build/services/auth/oauth-server/registration.d.ts +42 -0
  155. package/build/services/auth/oauth-server/registration.js +134 -0
  156. package/build/services/auth/oauth-server/sql.d.ts +34 -0
  157. package/build/services/auth/oauth-server/sql.js +123 -0
  158. package/build/services/auth/oauth-server/store.d.ts +74 -0
  159. package/build/services/auth/oauth-server/store.js +151 -0
  160. package/build/services/auth/sql.d.ts +1 -0
  161. package/build/services/auth/sql.js +3 -1
  162. package/build/services/escalation/grouped-list.d.ts +19 -0
  163. package/build/services/escalation/grouped-list.js +54 -0
  164. package/build/services/escalation/index.d.ts +4 -0
  165. package/build/services/escalation/index.js +9 -1
  166. package/build/services/escalation/queries.d.ts +17 -13
  167. package/build/services/escalation/queries.js +38 -42
  168. package/build/services/escalation/read-scope-sql.d.ts +13 -0
  169. package/build/services/escalation/read-scope-sql.js +19 -0
  170. package/build/services/escalation/related.d.ts +58 -0
  171. package/build/services/escalation/related.js +196 -0
  172. package/build/services/export/index.d.ts +10 -0
  173. package/build/services/export/index.js +27 -0
  174. package/build/services/invocation-access.d.ts +25 -4
  175. package/build/services/invocation-access.js +39 -7
  176. package/build/services/mcp/client/connection-dispatch.d.ts +6 -1
  177. package/build/services/mcp/client/connection-dispatch.js +3 -2
  178. package/build/services/mcp/client/connection-lifecycle.d.ts +10 -2
  179. package/build/services/mcp/client/connection-lifecycle.js +45 -7
  180. package/build/services/mcp/client/connection-test.js +2 -6
  181. package/build/services/mcp/client/connection.d.ts +1 -1
  182. package/build/services/mcp/client/connection.js +3 -1
  183. package/build/services/mcp/client/index.d.ts +2 -2
  184. package/build/services/mcp/client/index.js +4 -1
  185. package/build/services/mcp/client/network-transport.d.ts +12 -0
  186. package/build/services/mcp/client/network-transport.js +20 -0
  187. package/build/services/mcp/client/tools.d.ts +13 -0
  188. package/build/services/mcp/client/tools.js +18 -0
  189. package/build/services/mcp/db-server/index.js +2 -1
  190. package/build/services/mcp/external-server.d.ts +9 -4
  191. package/build/services/mcp/external-server.js +34 -11
  192. package/build/services/mcp/playwright-server/index.js +2 -1
  193. package/build/services/mcp/registered-tools.d.ts +3 -0
  194. package/build/services/mcp/registered-tools.js +7 -0
  195. package/build/services/mcp/server-lifecycle.js +2 -1
  196. package/build/services/role/index.js +6 -0
  197. package/build/services/role/seed.js +4 -0
  198. package/build/services/scan-code/validate-facts.d.ts +1 -1
  199. package/build/services/scan-code/validate-facts.js +12 -1
  200. package/build/services/workflow-invocation.d.ts +16 -3
  201. package/build/services/workflow-invocation.js +42 -10
  202. package/build/services/yaml-workflow/deployer.d.ts +10 -2
  203. package/build/services/yaml-workflow/deployer.js +17 -5
  204. package/build/services/yaml-workflow/invoke.js +27 -26
  205. package/build/shared/form-validation/x-lt-scan.d.ts +8 -0
  206. package/build/shared/form-validation/x-lt-scan.js +20 -1
  207. package/build/shared/list-schema/index.d.ts +3 -0
  208. package/build/shared/list-schema/index.js +27 -0
  209. package/build/shared/list-schema/template.d.ts +14 -0
  210. package/build/shared/list-schema/template.js +85 -0
  211. package/build/shared/list-schema/types.d.ts +154 -0
  212. package/build/shared/list-schema/types.js +55 -0
  213. package/build/shared/list-schema/validate.d.ts +12 -0
  214. package/build/shared/list-schema/validate.js +204 -0
  215. package/build/shared/roles/segment.d.ts +22 -0
  216. package/build/shared/roles/segment.js +42 -0
  217. package/build/start/adapters.js +2 -0
  218. package/build/start/config.js +7 -0
  219. package/build/start/index.js +4 -22
  220. package/build/start/server.d.ts +6 -4
  221. package/build/start/server.js +11 -35
  222. package/build/start/socket-auth.js +2 -1
  223. package/build/start/workers.js +1 -1
  224. package/build/system/mcp-servers/admin/agent-subscriptions.js +24 -1
  225. package/build/system/mcp-servers/admin/agents.js +25 -2
  226. package/build/system/mcp-servers/admin/announcements.js +3 -2
  227. package/build/system/mcp-servers/admin/bot-accounts.js +37 -5
  228. package/build/system/mcp-servers/admin/escalations.d.ts +3 -5
  229. package/build/system/mcp-servers/admin/escalations.js +74 -70
  230. package/build/system/mcp-servers/admin/exports.js +7 -1
  231. package/build/system/mcp-servers/admin/index.js +24 -25
  232. package/build/system/mcp-servers/admin/overview.d.ts +2 -2
  233. package/build/system/mcp-servers/admin/run-read.d.ts +2 -0
  234. package/build/system/mcp-servers/admin/run-read.js +5 -0
  235. package/build/system/mcp-servers/admin/scan-codes.d.ts +2 -2
  236. package/build/system/mcp-servers/admin/scan-codes.js +5 -11
  237. package/build/system/mcp-servers/admin/schemas.d.ts +20 -20
  238. package/build/system/mcp-servers/admin/tasks.js +7 -2
  239. package/build/system/mcp-servers/admin/users.js +39 -4
  240. package/build/system/mcp-servers/admin/workflow-config.js +12 -1
  241. package/build/system/mcp-servers/admin/workflows.js +27 -5
  242. package/build/system/mcp-servers/admin/yaml-workflows.js +7 -1
  243. package/build/system/mcp-servers/caller-auth.d.ts +18 -0
  244. package/build/system/mcp-servers/caller-auth.js +29 -0
  245. package/build/system/mcp-servers/claude-code.js +2 -1
  246. package/build/system/mcp-servers/db-query/index.js +2 -1
  247. package/build/system/mcp-servers/file-storage.js +2 -1
  248. package/build/system/mcp-servers/http-fetch.js +2 -1
  249. package/build/system/mcp-servers/human-queue.js +7 -3
  250. package/build/system/mcp-servers/oauth.js +31 -4
  251. package/build/system/mcp-servers/schema-exchange.js +2 -1
  252. package/build/system/mcp-servers/vision.d.ts +1 -0
  253. package/build/system/mcp-servers/vision.js +17 -7
  254. package/build/system/seed/tool-manifests-admin.d.ts +2 -17985
  255. package/build/system/seed/tool-manifests-admin.js +121 -121
  256. package/build/system/seed/tool-manifests-data.d.ts +8 -374
  257. package/build/system/seed/tool-manifests-data.js +22 -4
  258. package/build/system/seed/tool-manifests-escalation.d.ts +2 -352
  259. package/build/system/seed/tool-manifests-escalation.js +11 -1
  260. package/build/system/seed/tool-manifests-events.d.ts +2 -116
  261. package/build/system/seed/tool-manifests-events.js +6 -2
  262. package/build/system/seed/tool-manifests-knowledge.d.ts +2 -221
  263. package/build/system/seed/tool-manifests-knowledge.js +41 -1
  264. package/build/system/seed/tool-manifests-workflows.d.ts +2 -71
  265. package/build/system/seed/tool-manifests-workflows.js +3 -1
  266. package/build/system/workflows/shared/principal-tools.d.ts +20 -0
  267. package/build/system/workflows/shared/principal-tools.js +64 -0
  268. package/build/system/workflows/shared/tool-executor.js +21 -11
  269. package/build/system/workflows/shared/tool-loader.js +8 -1
  270. package/build/tsconfig.tsbuildinfo +1 -1
  271. package/build/types/auth.d.ts +1 -1
  272. package/build/types/capability.d.ts +14 -0
  273. package/build/types/capability.js +2 -0
  274. package/build/types/events.d.ts +1 -1
  275. package/build/types/index.d.ts +5 -3
  276. package/build/types/index.js +2 -1
  277. package/build/types/mcp.d.ts +3 -1
  278. package/build/types/oauth-server.d.ts +52 -0
  279. package/build/types/oauth-server.js +2 -0
  280. package/build/types/scan-code/constants.d.ts +7 -0
  281. package/build/types/scan-code/constants.js +7 -1
  282. package/build/types/scan-code/response.d.ts +3 -2
  283. package/build/types/scan-code/rule.d.ts +6 -1
  284. package/build/types/startup.d.ts +23 -7
  285. package/build/vitest.config.js +2 -1
  286. package/build/vitest.fast.config.d.ts +2 -0
  287. package/build/vitest.fast.config.js +20 -0
  288. package/build/vitest.llm.config.d.ts +2 -0
  289. package/build/vitest.llm.config.js +16 -0
  290. package/dashboard/dist/assets/{AdminDashboard-DKrqLGjn.js → AdminDashboard-B3mkMIOT.js} +2 -2
  291. package/dashboard/dist/assets/{AdminDashboard-DKrqLGjn.js.map → AdminDashboard-B3mkMIOT.js.map} +1 -1
  292. package/dashboard/dist/assets/{AgentConfigPage-BoQhRW6U.js → AgentConfigPage-CQj2B678.js} +2 -2
  293. package/dashboard/dist/assets/{AgentConfigPage-BoQhRW6U.js.map → AgentConfigPage-CQj2B678.js.map} +1 -1
  294. package/dashboard/dist/assets/{AgentDetailPage-DZhzuZmO.js → AgentDetailPage-CzrD8JJI.js} +3 -3
  295. package/dashboard/dist/assets/{AgentDetailPage-DZhzuZmO.js.map → AgentDetailPage-CzrD8JJI.js.map} +1 -1
  296. package/dashboard/dist/assets/{AgentsPage-5MynmbWX.js → AgentsPage-jg2OFwyW.js} +2 -2
  297. package/dashboard/dist/assets/{AgentsPage-5MynmbWX.js.map → AgentsPage-jg2OFwyW.js.map} +1 -1
  298. package/dashboard/dist/assets/AvailableEscalationsPage-IS28XBRe.js +2 -0
  299. package/dashboard/dist/assets/AvailableEscalationsPage-IS28XBRe.js.map +1 -0
  300. package/dashboard/dist/assets/{BotPicker-C3LR6Sqy.js → BotPicker-DvEJFpwS.js} +2 -2
  301. package/dashboard/dist/assets/{BotPicker-C3LR6Sqy.js.map → BotPicker-DvEJFpwS.js.map} +1 -1
  302. package/dashboard/dist/assets/{BulkAssignModal-COjoOIIH.js → BulkAssignModal-BoQCi-YC.js} +2 -2
  303. package/dashboard/dist/assets/{BulkAssignModal-COjoOIIH.js.map → BulkAssignModal-BoQCi-YC.js.map} +1 -1
  304. package/dashboard/dist/assets/CapabilitiesPage-kwlrcb_t.js +2 -0
  305. package/dashboard/dist/assets/{CapabilitiesPage-DKxLvOfB.js.map → CapabilitiesPage-kwlrcb_t.js.map} +1 -1
  306. package/dashboard/dist/assets/{CollapsibleSection-Cz5sRx-r.js → CollapsibleSection-UMIV4KIj.js} +2 -2
  307. package/dashboard/dist/assets/{CollapsibleSection-Cz5sRx-r.js.map → CollapsibleSection-UMIV4KIj.js.map} +1 -1
  308. package/dashboard/dist/assets/ConfirmDeleteModal-C5puwMg7.js +2 -0
  309. package/dashboard/dist/assets/ConfirmDeleteModal-C5puwMg7.js.map +1 -0
  310. package/dashboard/dist/assets/ConnectedAppsPage-drZa65kP.js +2 -0
  311. package/dashboard/dist/assets/ConnectedAppsPage-drZa65kP.js.map +1 -0
  312. package/dashboard/dist/assets/CountdownTimer-LG03dVgR.js +2 -0
  313. package/dashboard/dist/assets/CountdownTimer-LG03dVgR.js.map +1 -0
  314. package/dashboard/dist/assets/{CredentialsPage-DhiHiPsG.js → CredentialsPage-CaFQ6vLb.js} +2 -2
  315. package/dashboard/dist/assets/{CredentialsPage-DhiHiPsG.js.map → CredentialsPage-CaFQ6vLb.js.map} +1 -1
  316. package/dashboard/dist/assets/{CronLabel-C9SkawB-.js → CronLabel-Co5j7tzW.js} +2 -2
  317. package/dashboard/dist/assets/{CronLabel-C9SkawB-.js.map → CronLabel-Co5j7tzW.js.map} +1 -1
  318. package/dashboard/dist/assets/DataTable-FjFhx0SE.js +2 -0
  319. package/dashboard/dist/assets/DataTable-FjFhx0SE.js.map +1 -0
  320. package/dashboard/dist/assets/{ElapsedCell-BeK1SUDK.js → ElapsedCell-WJyE9G0T.js} +2 -2
  321. package/dashboard/dist/assets/{ElapsedCell-BeK1SUDK.js.map → ElapsedCell-WJyE9G0T.js.map} +1 -1
  322. package/dashboard/dist/assets/{EntityTimelinePanel-BThdefKj.js → EntityTimelinePanel-CDFFfX9d.js} +2 -2
  323. package/dashboard/dist/assets/{EntityTimelinePanel-BThdefKj.js.map → EntityTimelinePanel-CDFFfX9d.js.map} +1 -1
  324. package/dashboard/dist/assets/{EscalationListSchemaPage-DlDIYb-p.js → EscalationListSchemaPage-CMrUlaKI.js} +3 -3
  325. package/dashboard/dist/assets/{EscalationListSchemaPage-DlDIYb-p.js.map → EscalationListSchemaPage-CMrUlaKI.js.map} +1 -1
  326. package/dashboard/dist/assets/{EscalationSchemaPage-CQt-Embr.js → EscalationSchemaPage-Dx2Lyfrz.js} +3 -3
  327. package/dashboard/dist/assets/{EscalationSchemaPage-CQt-Embr.js.map → EscalationSchemaPage-Dx2Lyfrz.js.map} +1 -1
  328. package/dashboard/dist/assets/EscalationTimeline-d3nvshOk.js +2 -0
  329. package/dashboard/dist/assets/EscalationTimeline-d3nvshOk.js.map +1 -0
  330. package/dashboard/dist/assets/{EscalationTitleSelect-Dewrv8wX.js → EscalationTitleSelect-DWQieOM9.js} +2 -2
  331. package/dashboard/dist/assets/{EscalationTitleSelect-Dewrv8wX.js.map → EscalationTitleSelect-DWQieOM9.js.map} +1 -1
  332. package/dashboard/dist/assets/{EscalationsOverview-BzH-Y-5x.js → EscalationsOverview-BX8Cpi0X.js} +2 -2
  333. package/dashboard/dist/assets/{EscalationsOverview-BzH-Y-5x.js.map → EscalationsOverview-BX8Cpi0X.js.map} +1 -1
  334. package/dashboard/dist/assets/{EventTable-C97m6IZv.js → EventTable-D1-ITVXS.js} +2 -2
  335. package/dashboard/dist/assets/{EventTable-C97m6IZv.js.map → EventTable-D1-ITVXS.js.map} +1 -1
  336. package/dashboard/dist/assets/{FilterBar-D-6xVHIw.js → FilterBar-ABC9ctin.js} +2 -2
  337. package/dashboard/dist/assets/{FilterBar-D-6xVHIw.js.map → FilterBar-ABC9ctin.js.map} +1 -1
  338. package/dashboard/dist/assets/FormattedValue-k27T4bG7.js +2 -0
  339. package/dashboard/dist/assets/FormattedValue-k27T4bG7.js.map +1 -0
  340. package/dashboard/dist/assets/{GraphInvokePage-Bwi8EF9Y.js → GraphInvokePage-DKUErxWc.js} +2 -2
  341. package/dashboard/dist/assets/{GraphInvokePage-Bwi8EF9Y.js.map → GraphInvokePage-DKUErxWc.js.map} +1 -1
  342. package/dashboard/dist/assets/{HomePage-Z_Q03C0z.js → HomePage-C6u9dIpR.js} +2 -2
  343. package/dashboard/dist/assets/{HomePage-Z_Q03C0z.js.map → HomePage-C6u9dIpR.js.map} +1 -1
  344. package/dashboard/dist/assets/{ListToolbar-_jWTw5no.js → ListToolbar-gA5rFzkz.js} +2 -2
  345. package/dashboard/dist/assets/{ListToolbar-_jWTw5no.js.map → ListToolbar-gA5rFzkz.js.map} +1 -1
  346. package/dashboard/dist/assets/{McpOverview-CjqTuP0N.js → McpOverview-BOPo3J_i.js} +2 -2
  347. package/dashboard/dist/assets/{McpOverview-CjqTuP0N.js.map → McpOverview-BOPo3J_i.js.map} +1 -1
  348. package/dashboard/dist/assets/{McpQueryDetailPage-leCsje1U.js → McpQueryDetailPage-BRVVi0Zh.js} +2 -2
  349. package/dashboard/dist/assets/{McpQueryDetailPage-leCsje1U.js.map → McpQueryDetailPage-BRVVi0Zh.js.map} +1 -1
  350. package/dashboard/dist/assets/{McpQueryPage-C-PyXYX4.js → McpQueryPage-Dmbb6SAc.js} +2 -2
  351. package/dashboard/dist/assets/{McpQueryPage-C-PyXYX4.js.map → McpQueryPage-Dmbb6SAc.js.map} +1 -1
  352. package/dashboard/dist/assets/{McpRunDetailPage-JDrr3uUQ.js → McpRunDetailPage-bMXNO-6V.js} +2 -2
  353. package/dashboard/dist/assets/{McpRunDetailPage-JDrr3uUQ.js.map → McpRunDetailPage-bMXNO-6V.js.map} +1 -1
  354. package/dashboard/dist/assets/{McpRunsPage-DERXQLgZ.js → McpRunsPage-Bi9AMWja.js} +2 -2
  355. package/dashboard/dist/assets/{McpRunsPage-DERXQLgZ.js.map → McpRunsPage-Bi9AMWja.js.map} +1 -1
  356. package/dashboard/dist/assets/{OperationsPage-B2DA7n9m.js → OperationsPage-CvR74ZUJ.js} +3 -3
  357. package/dashboard/dist/assets/OperationsPage-CvR74ZUJ.js.map +1 -0
  358. package/dashboard/dist/assets/OperatorDashboard-DctmZw10.js +2 -0
  359. package/dashboard/dist/assets/OperatorDashboard-DctmZw10.js.map +1 -0
  360. package/dashboard/dist/assets/{PersonaDetailPage-ChXwJ6u5.js → PersonaDetailPage-Ubqm2rQH.js} +2 -2
  361. package/dashboard/dist/assets/{PersonaDetailPage-ChXwJ6u5.js.map → PersonaDetailPage-Ubqm2rQH.js.map} +1 -1
  362. package/dashboard/dist/assets/{PersonasPage-BFFxncSE.js → PersonasPage-BpFL2rpo.js} +2 -2
  363. package/dashboard/dist/assets/{PersonasPage-BFFxncSE.js.map → PersonasPage-BpFL2rpo.js.map} +1 -1
  364. package/dashboard/dist/assets/PortalPage-Dfc_Q02R.js +2 -0
  365. package/dashboard/dist/assets/PortalPage-Dfc_Q02R.js.map +1 -0
  366. package/dashboard/dist/assets/ProcessDetailPage-liJspvQh.js +2 -0
  367. package/dashboard/dist/assets/{ProcessDetailPage-D7EYwW-j.js.map → ProcessDetailPage-liJspvQh.js.map} +1 -1
  368. package/dashboard/dist/assets/{ProcessesListPage-CakYRtnE.js → ProcessesListPage-C3OM5ZUy.js} +2 -2
  369. package/dashboard/dist/assets/{ProcessesListPage-CakYRtnE.js.map → ProcessesListPage-C3OM5ZUy.js.map} +1 -1
  370. package/dashboard/dist/assets/ResolverForm-B1_x8Blv.js +8 -0
  371. package/dashboard/dist/assets/ResolverForm-B1_x8Blv.js.map +1 -0
  372. package/dashboard/dist/assets/{RoleDetailPage-CKbGwezP.js → RoleDetailPage-CrlYCh-R.js} +2 -2
  373. package/dashboard/dist/assets/{RoleDetailPage-CKbGwezP.js.map → RoleDetailPage-CrlYCh-R.js.map} +1 -1
  374. package/dashboard/dist/assets/{RolesPage-Czu7Zku4.js → RolesPage-BaazL_pt.js} +2 -2
  375. package/dashboard/dist/assets/{RolesPage-Czu7Zku4.js.map → RolesPage-BaazL_pt.js.map} +1 -1
  376. package/dashboard/dist/assets/{RunAsSelector-6BLScYTX.js → RunAsSelector-DxuV0fa1.js} +2 -2
  377. package/dashboard/dist/assets/{RunAsSelector-6BLScYTX.js.map → RunAsSelector-DxuV0fa1.js.map} +1 -1
  378. package/dashboard/dist/assets/{ScanCodesPage-Cv9q8Bvt.js → ScanCodesPage-C0mvmYTq.js} +2 -2
  379. package/dashboard/dist/assets/{ScanCodesPage-Cv9q8Bvt.js.map → ScanCodesPage-C0mvmYTq.js.map} +1 -1
  380. package/dashboard/dist/assets/{ScanSchemeDetailPage-BxazXYIc.js → ScanSchemeDetailPage-CiJgt5dZ.js} +2 -2
  381. package/dashboard/dist/assets/{ScanSchemeDetailPage-BxazXYIc.js.map → ScanSchemeDetailPage-CiJgt5dZ.js.map} +1 -1
  382. package/dashboard/dist/assets/ScanStationPage-DzGaXc40.js +2 -0
  383. package/dashboard/dist/assets/ScanStationPage-DzGaXc40.js.map +1 -0
  384. package/dashboard/dist/assets/{StickyPagination-DsdtYoXR.js → StickyPagination-CqbjVY6T.js} +2 -2
  385. package/dashboard/dist/assets/{StickyPagination-DsdtYoXR.js.map → StickyPagination-CqbjVY6T.js.map} +1 -1
  386. package/dashboard/dist/assets/{StreamMessageDetail-CT3FQoT3.js → StreamMessageDetail-wX3i0aqs.js} +2 -2
  387. package/dashboard/dist/assets/{StreamMessageDetail-CT3FQoT3.js.map → StreamMessageDetail-wX3i0aqs.js.map} +1 -1
  388. package/dashboard/dist/assets/{SwimlaneTimeline-C8TjkJ10.js → SwimlaneTimeline-C50PsFoV.js} +2 -2
  389. package/dashboard/dist/assets/{SwimlaneTimeline-C8TjkJ10.js.map → SwimlaneTimeline-C50PsFoV.js.map} +1 -1
  390. package/dashboard/dist/assets/{TaskDetailPage-DGUzdBFN.js → TaskDetailPage-bbNSv4Ae.js} +2 -2
  391. package/dashboard/dist/assets/{TaskDetailPage-DGUzdBFN.js.map → TaskDetailPage-bbNSv4Ae.js.map} +1 -1
  392. package/dashboard/dist/assets/{TasksListPage-BVIP6-EZ.js → TasksListPage-CDWnm_d9.js} +2 -2
  393. package/dashboard/dist/assets/{TasksListPage-BVIP6-EZ.js.map → TasksListPage-CDWnm_d9.js.map} +1 -1
  394. package/dashboard/dist/assets/{TimeAgo-C-rd9F9g.js → TimeAgo-BLjqlfoX.js} +2 -2
  395. package/dashboard/dist/assets/{TimeAgo-C-rd9F9g.js.map → TimeAgo-BLjqlfoX.js.map} +1 -1
  396. package/dashboard/dist/assets/{TimestampCell-DPbchDOI.js → TimestampCell-CnW0ENb5.js} +2 -2
  397. package/dashboard/dist/assets/{TimestampCell-DPbchDOI.js.map → TimestampCell-CnW0ENb5.js.map} +1 -1
  398. package/dashboard/dist/assets/{ToolTestPanel-DAUC8DHK.js → ToolTestPanel-DkMgCB-k.js} +2 -2
  399. package/dashboard/dist/assets/{ToolTestPanel-DAUC8DHK.js.map → ToolTestPanel-DkMgCB-k.js.map} +1 -1
  400. package/dashboard/dist/assets/{TopicDetailPage-70mMKBzG.js → TopicDetailPage-g3pljKKX.js} +2 -2
  401. package/dashboard/dist/assets/{TopicDetailPage-70mMKBzG.js.map → TopicDetailPage-g3pljKKX.js.map} +1 -1
  402. package/dashboard/dist/assets/{TopicsPage-CE3hBthn.js → TopicsPage-CVcCYdy-.js} +2 -2
  403. package/dashboard/dist/assets/{TopicsPage-CE3hBthn.js.map → TopicsPage-CVcCYdy-.js.map} +1 -1
  404. package/dashboard/dist/assets/{UserName-BDBDA-LR.js → UserName-D6zGIK2i.js} +2 -2
  405. package/dashboard/dist/assets/{UserName-BDBDA-LR.js.map → UserName-D6zGIK2i.js.map} +1 -1
  406. package/dashboard/dist/assets/{WorkflowExecutionPage-BbkLZ1co.js → WorkflowExecutionPage-B8g81FCJ.js} +2 -2
  407. package/dashboard/dist/assets/{WorkflowExecutionPage-BbkLZ1co.js.map → WorkflowExecutionPage-B8g81FCJ.js.map} +1 -1
  408. package/dashboard/dist/assets/{WorkflowsDashboard-Bp1L7Ggz.js → WorkflowsDashboard-nxT3bv6W.js} +2 -2
  409. package/dashboard/dist/assets/{WorkflowsDashboard-Bp1L7Ggz.js.map → WorkflowsDashboard-nxT3bv6W.js.map} +1 -1
  410. package/dashboard/dist/assets/{WorkflowsOverview-IeTKHAi4.js → WorkflowsOverview-grI-KAI2.js} +2 -2
  411. package/dashboard/dist/assets/{WorkflowsOverview-IeTKHAi4.js.map → WorkflowsOverview-grI-KAI2.js.map} +1 -1
  412. package/dashboard/dist/assets/{YamlWorkflowDetailPage-DtKCXnKt.js → YamlWorkflowDetailPage-BoZ-hfBE.js} +2 -2
  413. package/dashboard/dist/assets/{YamlWorkflowDetailPage-DtKCXnKt.js.map → YamlWorkflowDetailPage-BoZ-hfBE.js.map} +1 -1
  414. package/dashboard/dist/assets/{YamlWorkflowsPage-CEcZBV_3.js → YamlWorkflowsPage-Bf04rwRv.js} +2 -2
  415. package/dashboard/dist/assets/{YamlWorkflowsPage-CEcZBV_3.js.map → YamlWorkflowsPage-Bf04rwRv.js.map} +1 -1
  416. package/dashboard/dist/assets/{agents-BT-sEk81.js → agents-Dphpdi8l.js} +2 -2
  417. package/dashboard/dist/assets/{agents-BT-sEk81.js.map → agents-Dphpdi8l.js.map} +1 -1
  418. package/dashboard/dist/assets/{bots-DRoAdLek.js → bots-DIFE298x.js} +2 -2
  419. package/dashboard/dist/assets/{bots-DRoAdLek.js.map → bots-DIFE298x.js.map} +1 -1
  420. package/dashboard/dist/assets/{capabilities-Bc-nJk6y.js → capabilities-D7Y7LClY.js} +2 -2
  421. package/dashboard/dist/assets/{capabilities-Bc-nJk6y.js.map → capabilities-D7Y7LClY.js.map} +1 -1
  422. package/dashboard/dist/assets/{controlplane-aXceSIRf.js → controlplane-D1TGcYsS.js} +2 -2
  423. package/dashboard/dist/assets/{controlplane-aXceSIRf.js.map → controlplane-D1TGcYsS.js.map} +1 -1
  424. package/dashboard/dist/assets/escalation-columns-cwZE6xyo.js +2 -0
  425. package/dashboard/dist/assets/escalation-columns-cwZE6xyo.js.map +1 -0
  426. package/dashboard/dist/assets/{index-CuBGGwXf.js → index-BzYcUPdD.js} +2 -2
  427. package/dashboard/dist/assets/{index-CuBGGwXf.js.map → index-BzYcUPdD.js.map} +1 -1
  428. package/dashboard/dist/assets/index-CeCtqujG.js +67 -0
  429. package/dashboard/dist/assets/index-CeCtqujG.js.map +1 -0
  430. package/dashboard/dist/assets/{index-h2gX31B2.js → index-ChV7pBjM.js} +2 -2
  431. package/dashboard/dist/assets/{index-h2gX31B2.js.map → index-ChV7pBjM.js.map} +1 -1
  432. package/dashboard/dist/assets/index-CniRa65p.js +3 -0
  433. package/dashboard/dist/assets/index-CniRa65p.js.map +1 -0
  434. package/dashboard/dist/assets/index-CxdjT1Yk.js +2 -0
  435. package/dashboard/dist/assets/{index-BCFEQEMC.js.map → index-CxdjT1Yk.js.map} +1 -1
  436. package/dashboard/dist/assets/{index-CZyO9hRb.js → index-DAvi5_2T.js} +2 -2
  437. package/dashboard/dist/assets/{index-CZyO9hRb.js.map → index-DAvi5_2T.js.map} +1 -1
  438. package/dashboard/dist/assets/{index-Djsoi8DI.js → index-DN-kX7hL.js} +2 -2
  439. package/dashboard/dist/assets/{index-Djsoi8DI.js.map → index-DN-kX7hL.js.map} +1 -1
  440. package/dashboard/dist/assets/index-Dl_8hbYI.js +2 -0
  441. package/dashboard/dist/assets/index-Dl_8hbYI.js.map +1 -0
  442. package/dashboard/dist/assets/{index-DBxpyIw5.js → index-DpKOr311.js} +2 -2
  443. package/dashboard/dist/assets/{index-DBxpyIw5.js.map → index-DpKOr311.js.map} +1 -1
  444. package/dashboard/dist/assets/{index-Ba-s5Yb5.js → index-Dy1wWu2e.js} +2 -2
  445. package/dashboard/dist/assets/{index-Ba-s5Yb5.js.map → index-Dy1wWu2e.js.map} +1 -1
  446. package/dashboard/dist/assets/{index-DH03y-UT.js → index-HLu98Sqh.js} +2 -2
  447. package/dashboard/dist/assets/{index-DH03y-UT.js.map → index-HLu98Sqh.js.map} +1 -1
  448. package/dashboard/dist/assets/{index-C3VTJcrp.js → index-ag2pCAPu.js} +2 -2
  449. package/dashboard/dist/assets/{index-C3VTJcrp.js.map → index-ag2pCAPu.js.map} +1 -1
  450. package/dashboard/dist/assets/index-gkxPN7Vx.js +13 -0
  451. package/dashboard/dist/assets/{index-BEPKAjna.js.map → index-gkxPN7Vx.js.map} +1 -1
  452. package/dashboard/dist/assets/index-m9A3UYst.css +1 -0
  453. package/dashboard/dist/assets/{knowledge-BhW8V-Hq.js → knowledge-DnMs-SOJ.js} +2 -2
  454. package/dashboard/dist/assets/{knowledge-BhW8V-Hq.js.map → knowledge-DnMs-SOJ.js.map} +1 -1
  455. package/dashboard/dist/assets/{mcp-BYfSMQzh.js → mcp-CwW-K3r4.js} +2 -2
  456. package/dashboard/dist/assets/{mcp-BYfSMQzh.js.map → mcp-CwW-K3r4.js.map} +1 -1
  457. package/dashboard/dist/assets/{mcp-query-DUJoOk_q.js → mcp-query-BZt5e8_Q.js} +2 -2
  458. package/dashboard/dist/assets/{mcp-query-DUJoOk_q.js.map → mcp-query-BZt5e8_Q.js.map} +1 -1
  459. package/dashboard/dist/assets/{personas-jT1O_SB4.js → personas-UA-Xn60f.js} +2 -2
  460. package/dashboard/dist/assets/{personas-jT1O_SB4.js.map → personas-UA-Xn60f.js.map} +1 -1
  461. package/dashboard/dist/assets/{pipelines-Bp-wIaz2.js → pipelines-Cu3PARum.js} +2 -2
  462. package/dashboard/dist/assets/{pipelines-Bp-wIaz2.js.map → pipelines-Cu3PARum.js.map} +1 -1
  463. package/dashboard/dist/assets/{tasks-CCrvnXbz.js → tasks-BO6h8GJE.js} +2 -2
  464. package/dashboard/dist/assets/{tasks-CCrvnXbz.js.map → tasks-BO6h8GJE.js.map} +1 -1
  465. package/dashboard/dist/assets/{topics-Blft0I1L.js → topics-CWjCR-17.js} +2 -2
  466. package/dashboard/dist/assets/{topics-Blft0I1L.js.map → topics-CWjCR-17.js.map} +1 -1
  467. package/dashboard/dist/assets/{useDebouncedValue-BYqbcism.js → useDebouncedValue-6t0jx1RB.js} +2 -2
  468. package/dashboard/dist/assets/{useDebouncedValue-BYqbcism.js.map → useDebouncedValue-6t0jx1RB.js.map} +1 -1
  469. package/dashboard/dist/assets/{useNamespace-BfxJAUgG.js → useNamespace-CqpoQx6D.js} +2 -2
  470. package/dashboard/dist/assets/{useNamespace-BfxJAUgG.js.map → useNamespace-CqpoQx6D.js.map} +1 -1
  471. package/dashboard/dist/assets/{useYamlActivityEvents-BukJuWpb.js → useYamlActivityEvents-hmCQQwzB.js} +2 -2
  472. package/dashboard/dist/assets/{useYamlActivityEvents-BukJuWpb.js.map → useYamlActivityEvents-hmCQQwzB.js.map} +1 -1
  473. package/dashboard/dist/assets/validate-BIRn4a6d.js +2 -0
  474. package/dashboard/dist/assets/validate-BIRn4a6d.js.map +1 -0
  475. package/dashboard/dist/assets/{yaml-workflows-DeRWqMGk.js → yaml-workflows-ziUdZhKY.js} +2 -2
  476. package/dashboard/dist/assets/{yaml-workflows-DeRWqMGk.js.map → yaml-workflows-ziUdZhKY.js.map} +1 -1
  477. package/dashboard/dist/index.html +2 -2
  478. package/docs/agents.md +3 -1
  479. package/docs/api/http/agents.md +15 -1
  480. package/docs/api/http/escalations.md +49 -3
  481. package/docs/api/http/exports.md +3 -1
  482. package/docs/api/http/file-browser.md +3 -1
  483. package/docs/api/http/mcp-endpoint.md +5 -2
  484. package/docs/api/http/mcp-servers.md +34 -4
  485. package/docs/api/http/namespaces.md +2 -0
  486. package/docs/api/http/pipelines.md +2 -0
  487. package/docs/api/http/roles.md +11 -8
  488. package/docs/api/http/service-accounts.md +8 -2
  489. package/docs/api/http/settings.md +29 -2
  490. package/docs/api/http/tasks.md +3 -1
  491. package/docs/api/http/topics.md +7 -1
  492. package/docs/api/http/users.md +8 -2
  493. package/docs/api/http/workflows.md +25 -10
  494. package/docs/api/http/yaml-workflows.md +21 -0
  495. package/docs/api/mcp/admin.md +409 -49
  496. package/docs/api/mcp/file-storage.md +4 -0
  497. package/docs/api/mcp/http-fetch.md +6 -2
  498. package/docs/api/mcp/human-queue.md +53 -0
  499. package/docs/api/mcp/index.md +13 -10
  500. package/docs/api/mcp/knowledge.md +34 -0
  501. package/docs/api/mcp/oauth.md +1 -1
  502. package/docs/api/mcp/ortho.md +113 -0
  503. package/docs/api/mcp/vision.md +1 -1
  504. package/docs/api/sdk/bot-accounts.md +1 -0
  505. package/docs/api/sdk/escalations.md +18 -2
  506. package/docs/api/sdk/mcp.md +2 -2
  507. package/docs/api/sdk/settings.md +1 -1
  508. package/docs/api/sdk/tasks.md +2 -2
  509. package/docs/api/sdk/workflows.md +2 -2
  510. package/docs/api/sdk/yaml-workflows.md +1 -1
  511. package/docs/architecture.md +3 -1
  512. package/docs/auth.md +3 -2
  513. package/docs/cloud.md +7 -2
  514. package/docs/code-owned-configuration.md +12 -0
  515. package/docs/dashboard.md +16 -7
  516. package/docs/data.md +1 -1
  517. package/docs/escalation-strategies.md +9 -20
  518. package/docs/events.md +6 -0
  519. package/docs/hitl/portal.md +2 -0
  520. package/docs/hitl/x-lt-list-schema.md +88 -1
  521. package/docs/hitl/x-lt-scan.md +4 -1
  522. package/docs/iam.md +7 -5
  523. package/docs/mcp.md +159 -210
  524. package/docs/oauth-and-delegation.md +32 -21
  525. package/docs/scan-codes.md +7 -1
  526. package/docs/topics.md +2 -0
  527. package/docs/workflows.md +14 -112
  528. package/package.json +6 -3
  529. package/dashboard/dist/assets/AvailableEscalationsPage-CWMyy3IL.js +0 -2
  530. package/dashboard/dist/assets/AvailableEscalationsPage-CWMyy3IL.js.map +0 -1
  531. package/dashboard/dist/assets/CapabilitiesPage-DKxLvOfB.js +0 -2
  532. package/dashboard/dist/assets/ConfirmDeleteModal-Beq1vQtY.js +0 -2
  533. package/dashboard/dist/assets/ConfirmDeleteModal-Beq1vQtY.js.map +0 -1
  534. package/dashboard/dist/assets/CountdownTimer-BUBl_4mP.js +0 -2
  535. package/dashboard/dist/assets/CountdownTimer-BUBl_4mP.js.map +0 -1
  536. package/dashboard/dist/assets/DataTable-spX1dFyb.js +0 -2
  537. package/dashboard/dist/assets/DataTable-spX1dFyb.js.map +0 -1
  538. package/dashboard/dist/assets/EscalationListView-DTIVuym4.js +0 -2
  539. package/dashboard/dist/assets/EscalationListView-DTIVuym4.js.map +0 -1
  540. package/dashboard/dist/assets/EscalationTimeline-DNKNp6pL.js +0 -2
  541. package/dashboard/dist/assets/EscalationTimeline-DNKNp6pL.js.map +0 -1
  542. package/dashboard/dist/assets/OperationsPage-B2DA7n9m.js.map +0 -1
  543. package/dashboard/dist/assets/OperatorDashboard-C8RtPv8P.js +0 -2
  544. package/dashboard/dist/assets/OperatorDashboard-C8RtPv8P.js.map +0 -1
  545. package/dashboard/dist/assets/PortalPage-Xk1zVneM.js +0 -2
  546. package/dashboard/dist/assets/PortalPage-Xk1zVneM.js.map +0 -1
  547. package/dashboard/dist/assets/ProcessDetailPage-D7EYwW-j.js +0 -2
  548. package/dashboard/dist/assets/ResolverForm-BwVOJUpJ.js +0 -8
  549. package/dashboard/dist/assets/ResolverForm-BwVOJUpJ.js.map +0 -1
  550. package/dashboard/dist/assets/ScanStationPage-Cg8LCFR7.js +0 -2
  551. package/dashboard/dist/assets/ScanStationPage-Cg8LCFR7.js.map +0 -1
  552. package/dashboard/dist/assets/escalation-columns-Bf09Q89t.js +0 -2
  553. package/dashboard/dist/assets/escalation-columns-Bf09Q89t.js.map +0 -1
  554. package/dashboard/dist/assets/index-BCFEQEMC.js +0 -2
  555. package/dashboard/dist/assets/index-BEPKAjna.js +0 -13
  556. package/dashboard/dist/assets/index-BUYokcrl.js +0 -67
  557. package/dashboard/dist/assets/index-BUYokcrl.js.map +0 -1
  558. package/dashboard/dist/assets/index-CcgmR-7-.js +0 -2
  559. package/dashboard/dist/assets/index-CcgmR-7-.js.map +0 -1
  560. package/dashboard/dist/assets/index-D1mKf_qz.js +0 -3
  561. package/dashboard/dist/assets/index-D1mKf_qz.js.map +0 -1
  562. package/dashboard/dist/assets/index-DcppjzP5.css +0 -1
@@ -33,9 +33,10 @@ var __importStar = (this && this.__importStar) || (function () {
33
33
  };
34
34
  })();
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
- const express_1 = require("express");
36
+ const http_1 = require("../../lib/http");
37
37
  const api = __importStar(require("../../api/yaml-workflows"));
38
- const router = (0, express_1.Router)();
38
+ const auth_1 = require("../../modules/auth");
39
+ const router = (0, http_1.Router)();
39
40
  /**
40
41
  * GET /api/yaml-workflows
41
42
  * List YAML workflows with optional status filter.
@@ -58,7 +59,7 @@ router.get('/', async (req, res) => {
58
59
  * Generate a YAML workflow from a completed execution.
59
60
  * Body: { workflow_id, task_queue, workflow_name, name, description? }
60
61
  */
61
- router.post('/', async (req, res) => {
62
+ router.post('/', auth_1.requireBuilder, async (req, res) => {
62
63
  const result = await api.createYamlWorkflow(req.body);
63
64
  res.status(result.status).json(result.data ?? { error: result.error });
64
65
  });
@@ -76,7 +77,7 @@ router.get('/app-ids', async (_req, res) => {
76
77
  * Unlike POST /, this does not require a source execution — the YAML is provided directly.
77
78
  * Body: { name, description?, yaml_content, input_schema?, activity_manifest?, tags?, app_id? }
78
79
  */
79
- router.post('/direct', async (req, res) => {
80
+ router.post('/direct', auth_1.requireBuilder, async (req, res) => {
80
81
  const result = await api.createYamlWorkflowDirect(req.body);
81
82
  res.status(result.status).json(result.data ?? { error: result.error });
82
83
  });
@@ -85,7 +86,7 @@ router.post('/direct', async (req, res) => {
85
86
  * Compile a durable TypeScript workflow into a YAML DAG.
86
87
  * Body: { source, is_file_path?, workflow_name, name, description?, app_id?, subscribes?, tags? }
87
88
  */
88
- router.post('/from-durable', async (req, res) => {
89
+ router.post('/from-durable', auth_1.requireBuilder, async (req, res) => {
89
90
  const result = await api.createYamlWorkflowFromDurable(req.body);
90
91
  res.status(result.status).json(result.data ?? { error: result.error });
91
92
  });
@@ -95,15 +96,15 @@ router.post('/from-durable', async (req, res) => {
95
96
  * Get a single YAML workflow.
96
97
  */
97
98
  router.get('/:id', async (req, res) => {
98
- const result = await api.getYamlWorkflow({ id: req.params.id });
99
+ const result = await api.getYamlWorkflow({ id: String(req.params.id) });
99
100
  res.status(result.status).json(result.data ?? { error: result.error });
100
101
  });
101
102
  /**
102
103
  * PUT /api/yaml-workflows/:id
103
104
  * Update a YAML workflow's metadata.
104
105
  */
105
- router.put('/:id', async (req, res) => {
106
- const result = await api.updateYamlWorkflow({ id: req.params.id, ...req.body });
106
+ router.put('/:id', auth_1.requireBuilder, async (req, res) => {
107
+ const result = await api.updateYamlWorkflow({ ...req.body, id: String(req.params.id) });
107
108
  res.status(result.status).json(result.data ?? { error: result.error });
108
109
  });
109
110
  /**
@@ -111,9 +112,9 @@ router.put('/:id', async (req, res) => {
111
112
  * Re-generate the YAML from the original source execution.
112
113
  * Only allowed for non-archived workflows.
113
114
  */
114
- router.post('/:id/regenerate', async (req, res) => {
115
+ router.post('/:id/regenerate', auth_1.requireBuilder, async (req, res) => {
115
116
  const result = await api.regenerateYamlWorkflow({
116
- id: req.params.id,
117
+ id: String(req.params.id),
117
118
  task_queue: req.body.task_queue,
118
119
  compilation_feedback: req.body.compilation_feedback,
119
120
  });
@@ -123,8 +124,8 @@ router.post('/:id/regenerate', async (req, res) => {
123
124
  * DELETE /api/yaml-workflows/:id
124
125
  * Delete a YAML workflow (must be draft or archived).
125
126
  */
126
- router.delete('/:id', async (req, res) => {
127
- const result = await api.deleteYamlWorkflow({ id: req.params.id });
127
+ router.delete('/:id', auth_1.requireBuilder, async (req, res) => {
128
+ const result = await api.deleteYamlWorkflow({ id: String(req.params.id) });
128
129
  res.status(result.status).json(result.data ?? { error: result.error });
129
130
  });
130
131
  exports.default = router;
@@ -33,24 +33,25 @@ var __importStar = (this && this.__importStar) || (function () {
33
33
  };
34
34
  })();
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
- const express_1 = require("express");
36
+ const http_1 = require("../../lib/http");
37
37
  const api = __importStar(require("../../api/yaml-workflows"));
38
- const router = (0, express_1.Router)();
38
+ const auth_1 = require("../../modules/auth");
39
+ const router = (0, http_1.Router)();
39
40
  /**
40
41
  * POST /api/yaml-workflows/:id/deploy
41
42
  * Deploy all YAML workflows sharing this workflow's app_id as a merged version.
42
43
  * Bumps the version and deploys all graphs together.
43
44
  */
44
- router.post('/:id/deploy', async (req, res) => {
45
- const result = await api.deployYamlWorkflow({ id: req.params.id });
45
+ router.post('/:id/deploy', auth_1.requireBuilder, async (req, res) => {
46
+ const result = await api.deployYamlWorkflow({ id: String(req.params.id) }, req.auth);
46
47
  res.status(result.status).json(result.data ?? { error: result.error });
47
48
  });
48
49
  /**
49
50
  * POST /api/yaml-workflows/:id/activate
50
51
  * Activate the deployed version for this workflow's app_id and register all workers.
51
52
  */
52
- router.post('/:id/activate', async (req, res) => {
53
- const result = await api.activateYamlWorkflow({ id: req.params.id });
53
+ router.post('/:id/activate', auth_1.requireBuilder, async (req, res) => {
54
+ const result = await api.activateYamlWorkflow({ id: String(req.params.id) }, req.auth);
54
55
  res.status(result.status).json(result.data ?? { error: result.error });
55
56
  });
56
57
  /**
@@ -72,16 +73,16 @@ router.post('/:id/invoke', async (req, res) => {
72
73
  * POST /api/yaml-workflows/:id/archive
73
74
  * Archive a YAML workflow (stops accepting new invocations).
74
75
  */
75
- router.post('/:id/archive', async (req, res) => {
76
- const result = await api.archiveYamlWorkflow({ id: req.params.id });
76
+ router.post('/:id/archive', auth_1.requireBuilder, async (req, res) => {
77
+ const result = await api.archiveYamlWorkflow({ id: String(req.params.id) });
77
78
  res.status(result.status).json(result.data ?? { error: result.error });
78
79
  });
79
80
  /**
80
81
  * POST /api/yaml-workflows/:id/restore
81
82
  * Restore an archived YAML workflow back to draft status for redeployment.
82
83
  */
83
- router.post('/:id/restore', async (req, res) => {
84
- const result = await api.restoreYamlWorkflow({ id: req.params.id });
84
+ router.post('/:id/restore', auth_1.requireBuilder, async (req, res) => {
85
+ const result = await api.restoreYamlWorkflow({ id: String(req.params.id) });
85
86
  res.status(result.status).json(result.data ?? { error: result.error });
86
87
  });
87
88
  exports.default = router;
@@ -3,12 +3,12 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- const express_1 = require("express");
6
+ const http_1 = require("../../lib/http");
7
7
  const cron_1 = __importDefault(require("./cron"));
8
8
  const crud_1 = __importDefault(require("./crud"));
9
9
  const deployment_1 = __importDefault(require("./deployment"));
10
10
  const versions_1 = __importDefault(require("./versions"));
11
- const router = (0, express_1.Router)();
11
+ const router = (0, http_1.Router)();
12
12
  // cron.ts handles: GET /cron/status, PUT /:id/cron, DELETE /:id/cron
13
13
  // Mount before crud so /cron/status doesn't match /:id
14
14
  router.use(cron_1.default);
@@ -33,9 +33,9 @@ var __importStar = (this && this.__importStar) || (function () {
33
33
  };
34
34
  })();
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
- const express_1 = require("express");
36
+ const http_1 = require("../../lib/http");
37
37
  const api = __importStar(require("../../api/yaml-workflows"));
38
- const router = (0, express_1.Router)();
38
+ const router = (0, http_1.Router)();
39
39
  /**
40
40
  * GET /api/yaml-workflows/:id/versions
41
41
  * Return version history for a YAML workflow.
@@ -0,0 +1,25 @@
1
+ /**
2
+ * consolidation-sim: drive the consolidation example over HTTP so the
3
+ * Consolidate list shows a floor in motion.
4
+ *
5
+ * Opens a tub per destination (the first tub split into a standard and an
6
+ * express lane), starts orders with a mix of service levels, then walks
7
+ * them through the stations (prep, check) and places each in its
8
+ * destination's bin. With KEEP=1 it stops partway, leaving orders at every
9
+ * station and some bins partly filled, so the list's Holds and Coming
10
+ * columns and each row's expansion have something to show.
11
+ *
12
+ * Usage:
13
+ * npm run consolidation:sim
14
+ * DESTINATIONS=3 ORDERS=12 EXPRESS_PCT=30 KEEP=1 npm run consolidation:sim
15
+ *
16
+ * Env vars:
17
+ * BASE_URL long-tail API (default http://localhost:3000)
18
+ * DESTINATIONS destinations, one tub each (default 2)
19
+ * ORDERS orders to start (default 8)
20
+ * EXPRESS_PCT percent of orders on the express service (default 25)
21
+ * STEP_MS pause between floor moves (default 600)
22
+ * KEEP 1 = stop partway and leave the floor mid-flight (default 0)
23
+ * LT_USERNAME / LT_PASSWORD the dev login (defaults: the seeded admin)
24
+ */
25
+ export {};
@@ -0,0 +1,141 @@
1
+ "use strict";
2
+ /**
3
+ * consolidation-sim: drive the consolidation example over HTTP so the
4
+ * Consolidate list shows a floor in motion.
5
+ *
6
+ * Opens a tub per destination (the first tub split into a standard and an
7
+ * express lane), starts orders with a mix of service levels, then walks
8
+ * them through the stations (prep, check) and places each in its
9
+ * destination's bin. With KEEP=1 it stops partway, leaving orders at every
10
+ * station and some bins partly filled, so the list's Holds and Coming
11
+ * columns and each row's expansion have something to show.
12
+ *
13
+ * Usage:
14
+ * npm run consolidation:sim
15
+ * DESTINATIONS=3 ORDERS=12 EXPRESS_PCT=30 KEEP=1 npm run consolidation:sim
16
+ *
17
+ * Env vars:
18
+ * BASE_URL long-tail API (default http://localhost:3000)
19
+ * DESTINATIONS destinations, one tub each (default 2)
20
+ * ORDERS orders to start (default 8)
21
+ * EXPRESS_PCT percent of orders on the express service (default 25)
22
+ * STEP_MS pause between floor moves (default 600)
23
+ * KEEP 1 = stop partway and leave the floor mid-flight (default 0)
24
+ * LT_USERNAME / LT_PASSWORD the dev login (defaults: the seeded admin)
25
+ */
26
+ Object.defineProperty(exports, "__esModule", { value: true });
27
+ const BASE_URL = process.env.BASE_URL || 'http://localhost:3000';
28
+ const DESTINATIONS = Number(process.env.DESTINATIONS || 2);
29
+ const ORDERS = Number(process.env.ORDERS || 8);
30
+ const EXPRESS_PCT = Number(process.env.EXPRESS_PCT || 25);
31
+ const STEP_MS = Number(process.env.STEP_MS || 600);
32
+ const KEEP = process.env.KEEP === '1';
33
+ const USERNAME = process.env.LT_USERNAME || 'superadmin';
34
+ const PASSWORD = process.env.LT_PASSWORD || 'l0ngt@1l';
35
+ const ROLES = { PREP: 'order-prep', CHECK: 'order-check', STAGE: 'order-stage', BIN: 'consolidate' };
36
+ const RUN = Date.now().toString(36).slice(-4).toUpperCase();
37
+ const DESTINATION_NAMES = ['north', 'south', 'east', 'west', 'central', 'harbor'];
38
+ let token = '';
39
+ const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
40
+ async function api(method, path, body) {
41
+ const res = await fetch(`${BASE_URL}${path}`, {
42
+ method,
43
+ headers: { 'Content-Type': 'application/json', ...(token ? { Authorization: `Bearer ${token}` } : {}) },
44
+ body: body === undefined ? undefined : JSON.stringify(body),
45
+ });
46
+ const text = await res.text();
47
+ const data = text ? JSON.parse(text) : {};
48
+ if (!res.ok)
49
+ throw new Error(`${method} ${path} → ${res.status}: ${data.error ?? text}`);
50
+ return data;
51
+ }
52
+ /** The pending row for one order at one role, polled until the workflow parks it. */
53
+ async function rowFor(role, facets) {
54
+ const q = new URLSearchParams({ role, status: 'pending', limit: '1', facets: JSON.stringify(facets) });
55
+ for (let i = 0; i < 100; i++) {
56
+ const { escalations } = await api('GET', `/api/escalations?${q}`);
57
+ if (escalations[0])
58
+ return escalations[0];
59
+ await sleep(200);
60
+ }
61
+ throw new Error(`no pending ${role} row for ${JSON.stringify(facets)}`);
62
+ }
63
+ async function openBins(destinations) {
64
+ const bins = [];
65
+ for (const [i, destination] of destinations.entries()) {
66
+ const binKey = `T${i + 1}-${RUN}`;
67
+ const lanes = i === 0 ? ['standard', 'express'] : [undefined];
68
+ for (const lane of lanes) {
69
+ await api('POST', '/api/workflows/consolidationBin/invoke', { data: { binKey, destination, lane, max: 20, timeout: '8h' } });
70
+ const row = await rowFor(ROLES.BIN, { binKey, ...(lane ? { lane } : {}) });
71
+ bins.push({ id: row.id, destination, lane });
72
+ console.log(`[bin] ${binKey}${lane ? ` (${lane})` : ''} → ${destination}`);
73
+ }
74
+ }
75
+ return bins;
76
+ }
77
+ async function startOrders(destinations) {
78
+ const orders = [];
79
+ for (let i = 0; i < ORDERS; i++) {
80
+ const order = {
81
+ orderId: `O${RUN}-${String(i + 1).padStart(2, '0')}`,
82
+ destination: destinations[i % destinations.length],
83
+ serviceLevel: Math.random() * 100 < EXPRESS_PCT ? 'express' : 'standard',
84
+ };
85
+ await api('POST', '/api/workflows/consolidationOrder/invoke', { data: order });
86
+ orders.push(order);
87
+ console.log(`[order] ${order.orderId} → ${order.destination} (${order.serviceLevel})`);
88
+ }
89
+ return orders;
90
+ }
91
+ async function finish(role, order) {
92
+ const row = await rowFor(role, { orderId: order.orderId });
93
+ await api('POST', `/api/escalations/${row.id}/resolve`, { resolverPayload: { ok: true } });
94
+ console.log(`[${role}] ${order.orderId} done`);
95
+ await sleep(STEP_MS);
96
+ }
97
+ async function place(order, bins) {
98
+ const bin = bins.find((b) => b.destination === order.destination && (!b.lane || b.lane === order.serviceLevel));
99
+ const member = await rowFor(ROLES.STAGE, { orderId: order.orderId });
100
+ await api('POST', `/api/escalations/${bin.id}/accumulate`, {
101
+ itemKey: order.orderId, payload: { weight: 1 }, reciprocal: { id: member.id },
102
+ });
103
+ console.log(`[place] ${order.orderId} → ${bin.destination}${bin.lane ? ` (${bin.lane})` : ''}`);
104
+ await sleep(STEP_MS);
105
+ }
106
+ async function main() {
107
+ const auth = await api('POST', '/api/auth/login', { username: USERNAME, password: PASSWORD });
108
+ token = auth.token;
109
+ const destinations = DESTINATION_NAMES.slice(0, Math.max(1, Math.min(DESTINATIONS, DESTINATION_NAMES.length)))
110
+ .map((d) => `${d}-${RUN}`);
111
+ // 1. Open the tubs, then start the orders at the first station.
112
+ const bins = await openBins(destinations);
113
+ const orders = await startOrders(destinations);
114
+ // 2. Walk the orders. Mid-flight (KEEP=1): a quarter stays at prep, a
115
+ // quarter at check, a quarter staged, the rest placed.
116
+ const quarter = Math.ceil(orders.length / 4);
117
+ for (const [i, order] of orders.entries()) {
118
+ if (KEEP && i < quarter)
119
+ continue;
120
+ await finish(ROLES.PREP, order);
121
+ if (KEEP && i < quarter * 2)
122
+ continue;
123
+ await finish(ROLES.CHECK, order);
124
+ if (KEEP && i < quarter * 3)
125
+ continue;
126
+ await place(order, bins);
127
+ }
128
+ // 3. A mis-placed order comes back out: the bin's count drops by one.
129
+ const placed = KEEP ? orders.slice(quarter * 3) : orders;
130
+ const last = placed[placed.length - 1];
131
+ if (last) {
132
+ const bin = bins.find((b) => b.destination === last.destination && (!b.lane || b.lane === last.serviceLevel));
133
+ await api('POST', `/api/escalations/${bin.id}/remove-item`, { itemKey: last.orderId });
134
+ console.log(`[remove] ${last.orderId} out of ${bin.destination}`);
135
+ }
136
+ console.log(`\nDone (run ${RUN}). Open the Consolidate list: ${BASE_URL}/escalations/available?role=${ROLES.BIN}`);
137
+ }
138
+ main().catch((err) => {
139
+ console.error(`[consolidation-sim] ${err.message}`);
140
+ process.exit(1);
141
+ });
@@ -291,6 +291,18 @@ export declare function createClient(options?: LTClientOptions): {
291
291
  }, auth?: LTApiAuth) => Promise<LTApiResult<any>>;
292
292
  aggregateByFacets: (input: import("..").AggregateByFacetsInput, auth?: LTApiAuth) => Promise<LTApiResult<any>>;
293
293
  timelineByFacet: (input: import("..").TimelineByFacetInput, auth?: LTApiAuth) => Promise<LTApiResult<any>>;
294
+ getRelated: (input: {
295
+ role: string;
296
+ ids: string[];
297
+ version?: number;
298
+ }, auth?: LTApiAuth) => Promise<LTApiResult<any>>;
299
+ getRelatedRows: (input: {
300
+ role: string;
301
+ id: string;
302
+ set: string;
303
+ version?: number;
304
+ limit?: number;
305
+ }, auth?: LTApiAuth) => Promise<LTApiResult<any>>;
294
306
  };
295
307
  workflows: {
296
308
  invoke: (input: {
@@ -162,6 +162,8 @@ function createClient(options = {}) {
162
162
  // Analytics surface (grouped membership/dwell + per-entity timeline), read_all-gated.
163
163
  aggregateByFacets: bindAuth(escalationsApi.aggregateByFacets, auth),
164
164
  timelineByFacet: bindAuth(escalationsApi.timelineByFacet, auth),
165
+ getRelated: bindAuth(escalationsApi.getRelatedAggregates, auth),
166
+ getRelatedRows: bindAuth(escalationsApi.getRelatedRows, auth),
165
167
  },
166
168
  // ── Workflows ──────────────────────────────────────────────────────────
167
169
  workflows: {
@@ -0,0 +1,14 @@
1
+ import type { AgentBehaviors } from '../../types/agent';
2
+ /** Refuse an agent create or update whose schedules the caller could not run themselves. */
3
+ export declare function assertMayConfigureAgent(callerId: string, input: {
4
+ id?: string;
5
+ user_id?: string | null;
6
+ behaviors?: AgentBehaviors;
7
+ }): Promise<void>;
8
+ /** Refuse a subscription create or update the caller could not run themselves. */
9
+ export declare function assertMayConfigureSubscription(callerId: string, input: {
10
+ agentId: string;
11
+ subscriptionId?: string;
12
+ reaction_type?: string;
13
+ execute_as?: string | null;
14
+ }): Promise<void>;
@@ -0,0 +1,53 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.assertMayConfigureAgent = assertMayConfigureAgent;
4
+ exports.assertMayConfigureSubscription = assertMayConfigureSubscription;
5
+ /**
6
+ * Who may configure automation. Agents run on their own, as the identity they
7
+ * name (an execute_as, else the agent's user_id) or, with none, as lt-system.
8
+ * Whoever configures one must be able to run as that identity: the same rule
9
+ * as an execute_as override. Automation that would run as lt-system, or a
10
+ * capability subscription (a tool called with lt-system authority), is a
11
+ * superadmin's to configure.
12
+ */
13
+ const workflow_invocation_1 = require("../workflow-invocation");
14
+ const user_1 = require("../user");
15
+ const index_1 = require("./index");
16
+ const subscriptions_1 = require("./subscriptions");
17
+ const SYSTEM_AUTHORITY = 'runs as lt-system; only superadmin can configure it';
18
+ async function assertIdentity(callerId, identity, what) {
19
+ if (!identity)
20
+ throw new workflow_invocation_1.InvocationError(`${what} has no identity, so it ${SYSTEM_AUTHORITY}`, 403);
21
+ await (0, workflow_invocation_1.assertMayActAs)(callerId, identity);
22
+ }
23
+ /** Refuse an agent create or update whose schedules the caller could not run themselves. */
24
+ async function assertMayConfigureAgent(callerId, input) {
25
+ if (await (0, user_1.isSuperAdmin)(callerId))
26
+ return;
27
+ const existing = input.id ? await (0, index_1.getAgent)(input.id) : null;
28
+ const userId = input.user_id !== undefined ? input.user_id : existing?.user_id ?? null;
29
+ const behaviors = input.behaviors ?? existing?.behaviors;
30
+ if (userId)
31
+ await (0, workflow_invocation_1.assertMayActAs)(callerId, userId);
32
+ if (behaviors?.cron)
33
+ await assertIdentity(callerId, userId, 'the agent schedule');
34
+ for (const schedule of behaviors?.schedules ?? []) {
35
+ await assertIdentity(callerId, schedule.execute_as || userId, 'an agent schedule');
36
+ }
37
+ }
38
+ /** Refuse a subscription create or update the caller could not run themselves. */
39
+ async function assertMayConfigureSubscription(callerId, input) {
40
+ if (await (0, user_1.isSuperAdmin)(callerId))
41
+ return;
42
+ const existing = input.subscriptionId ? await (0, subscriptions_1.getSubscription)(input.subscriptionId) : null;
43
+ if (input.subscriptionId && (!existing || existing.agent_id !== input.agentId)) {
44
+ throw new workflow_invocation_1.InvocationError('Subscription not found', 404);
45
+ }
46
+ const reaction = input.reaction_type ?? existing?.reaction_type;
47
+ if (reaction === 'capability') {
48
+ throw new workflow_invocation_1.InvocationError(`a capability subscription calls a tool directly, so it ${SYSTEM_AUTHORITY}`, 403);
49
+ }
50
+ const agent = await (0, index_1.getAgent)(input.agentId);
51
+ const executeAs = input.execute_as !== undefined ? input.execute_as : existing?.execute_as;
52
+ await assertIdentity(callerId, executeAs || agent?.user_id, 'the subscription');
53
+ }
@@ -29,4 +29,6 @@ export declare function revokeBotApiKey(id: string): Promise<boolean>;
29
29
  /**
30
30
  * List API keys for a bot account (without hashes).
31
31
  */
32
+ /** The bot account a key belongs to, or null when there is no such key. */
33
+ export declare function getBotApiKeyOwner(keyId: string): Promise<string | null>;
32
34
  export declare function listBotApiKeys(userId: string): Promise<BotApiKeyRecord[]>;
@@ -39,8 +39,10 @@ Object.defineProperty(exports, "__esModule", { value: true });
39
39
  exports.generateBotApiKey = generateBotApiKey;
40
40
  exports.validateBotApiKey = validateBotApiKey;
41
41
  exports.revokeBotApiKey = revokeBotApiKey;
42
+ exports.getBotApiKeyOwner = getBotApiKeyOwner;
42
43
  exports.listBotApiKeys = listBotApiKeys;
43
44
  const crypto = __importStar(require("crypto"));
45
+ const uuid_1 = require("../../lib/uuid");
44
46
  const bcryptjs_1 = __importDefault(require("bcryptjs"));
45
47
  const db_1 = require("../../lib/db");
46
48
  const sql_1 = require("./sql");
@@ -87,6 +89,14 @@ async function revokeBotApiKey(id) {
87
89
  /**
88
90
  * List API keys for a bot account (without hashes).
89
91
  */
92
+ /** The bot account a key belongs to, or null when there is no such key. */
93
+ async function getBotApiKeyOwner(keyId) {
94
+ if (!(0, uuid_1.isUuid)(keyId))
95
+ return null;
96
+ const pool = await (0, db_1.getPool)();
97
+ const { rows } = await pool.query(sql_1.GET_BOT_KEY_OWNER, [keyId]);
98
+ return rows[0]?.user_id ?? null;
99
+ }
90
100
  async function listBotApiKeys(userId) {
91
101
  const pool = await (0, db_1.getPool)();
92
102
  const { rows } = await pool.query(sql_1.LIST_BOT_KEYS_BY_USER, [userId]);
@@ -0,0 +1,36 @@
1
+ import type { AuthPayload, LTGrantPolicy, LTGrantRole, LTGrantSnapshot } from '../../../types';
2
+ /**
3
+ * Access tokens are HS256 JWTs for one resource (`aud`, the `/mcp` URL). They
4
+ * name the grant (`gid`) and the person (`sub`) and carry no `userId` claim,
5
+ * so `requireAuth` refuses them on `/api`. A verified token is honored only
6
+ * while its grant is live: `/mcp` reads the grant on each request and acts on
7
+ * its current roles, policy and scope.
8
+ */
9
+ export interface AccessTokenTarget {
10
+ issuer: string;
11
+ audience: string;
12
+ }
13
+ export interface LTAccessTokenClaims {
14
+ iss: string;
15
+ aud: string;
16
+ sub: string;
17
+ client_id: string;
18
+ gid: string;
19
+ scope: string;
20
+ policy: LTGrantPolicy;
21
+ roles: LTGrantRole[];
22
+ iat: number;
23
+ exp: number;
24
+ }
25
+ export declare function signAccessToken(snapshot: LTGrantSnapshot, target: AccessTokenTarget, ttlSeconds?: number): {
26
+ token: string;
27
+ expiresIn: number;
28
+ };
29
+ /** The claims of a valid access token for `target`; null for anything else. */
30
+ export declare function verifyAccessToken(token: string, target: AccessTokenTarget): LTAccessTokenClaims | null;
31
+ /**
32
+ * The request identity for a verified access token and its live grant, in the
33
+ * shape other credentials produce. Roles, policy and scope come from the grant
34
+ * as it stands now, not as the token recorded them.
35
+ */
36
+ export declare function accessTokenPrincipal(claims: LTAccessTokenClaims, live: LTGrantSnapshot): AuthPayload;
@@ -0,0 +1,80 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.signAccessToken = signAccessToken;
7
+ exports.verifyAccessToken = verifyAccessToken;
8
+ exports.accessTokenPrincipal = accessTokenPrincipal;
9
+ const jsonwebtoken_1 = __importDefault(require("jsonwebtoken"));
10
+ const config_1 = require("../../../modules/config");
11
+ const defaults_1 = require("../../../modules/defaults");
12
+ const constants_1 = require("./constants");
13
+ function signAccessToken(snapshot, target, ttlSeconds = defaults_1.OAUTH_ACCESS_TOKEN_TTL_SECONDS) {
14
+ if (!config_1.config.JWT_SECRET)
15
+ throw new Error('signAccessToken: JWT_SECRET is not configured');
16
+ const token = jsonwebtoken_1.default.sign({
17
+ client_id: snapshot.client_id,
18
+ gid: snapshot.grant_id,
19
+ scope: snapshot.scope,
20
+ policy: snapshot.policy,
21
+ roles: snapshot.roles,
22
+ }, config_1.config.JWT_SECRET, {
23
+ algorithm: 'HS256',
24
+ header: { alg: 'HS256', typ: constants_1.ACCESS_TOKEN_TYPE },
25
+ issuer: target.issuer,
26
+ audience: target.audience,
27
+ subject: snapshot.user_id,
28
+ expiresIn: ttlSeconds,
29
+ });
30
+ return { token, expiresIn: ttlSeconds };
31
+ }
32
+ /** The claims of a valid access token for `target`; null for anything else. */
33
+ function verifyAccessToken(token, target) {
34
+ if (!config_1.config.JWT_SECRET)
35
+ return null;
36
+ try {
37
+ const decoded = jsonwebtoken_1.default.verify(token, config_1.config.JWT_SECRET, {
38
+ algorithms: ['HS256'],
39
+ issuer: target.issuer,
40
+ audience: target.audience,
41
+ complete: true,
42
+ });
43
+ if (decoded.header.typ !== constants_1.ACCESS_TOKEN_TYPE)
44
+ return null;
45
+ const claims = decoded.payload;
46
+ if (typeof claims.exp !== 'number')
47
+ return null;
48
+ if (!claims.sub || !claims.gid || !claims.client_id || !Array.isArray(claims.roles))
49
+ return null;
50
+ return claims;
51
+ }
52
+ catch {
53
+ return null;
54
+ }
55
+ }
56
+ function highestRoleType(roles) {
57
+ if (roles.some((r) => r.type === 'superadmin'))
58
+ return 'superadmin';
59
+ if (roles.some((r) => r.type === 'admin'))
60
+ return 'admin';
61
+ return 'member';
62
+ }
63
+ /**
64
+ * The request identity for a verified access token and its live grant, in the
65
+ * shape other credentials produce. Roles, policy and scope come from the grant
66
+ * as it stands now, not as the token recorded them.
67
+ */
68
+ function accessTokenPrincipal(claims, live) {
69
+ return {
70
+ userId: claims.sub,
71
+ role: highestRoleType(live.roles),
72
+ roles: live.roles.map((r) => ({ role: r.role, type: r.type })),
73
+ scopes: [live.scope],
74
+ principalType: constants_1.OAUTH_PRINCIPAL_TYPE,
75
+ clientId: live.client_id,
76
+ grantId: live.grant_id,
77
+ policy: live.policy,
78
+ grantRoles: live.roles,
79
+ };
80
+ }
@@ -0,0 +1,47 @@
1
+ import type { OAuthServerSettings } from '../../../modules/oauth-server';
2
+ import type { LTGrantPreset, LTOAuthClient } from '../../../types/oauth-server';
3
+ /**
4
+ * Validation of an authorization request (RFC 6749 §4.1.1 with PKCE, RFC 7636,
5
+ * and resource indicators, RFC 8707). Used by the authorize redirect and again
6
+ * when the person approves, so the consent page is never trusted.
7
+ */
8
+ export interface AuthorizationRequest {
9
+ client: LTOAuthClient;
10
+ redirectUri: string;
11
+ codeChallenge: string;
12
+ state?: string;
13
+ scope?: string;
14
+ resource: string;
15
+ }
16
+ export type AuthorizationCheck = {
17
+ ok: true;
18
+ request: AuthorizationRequest;
19
+ }
20
+ /** The client or redirect URI can't be trusted: answer here, never redirect. */
21
+ | {
22
+ ok: false;
23
+ redirect: false;
24
+ error: string;
25
+ description: string;
26
+ }
27
+ /** The client and redirect URI are known: report the error to the client. */
28
+ | {
29
+ ok: false;
30
+ redirect: true;
31
+ redirectUri: string;
32
+ state?: string;
33
+ error: string;
34
+ description: string;
35
+ };
36
+ export declare function checkAuthorizationRequest(params: Record<string, unknown>, settings: OAuthServerSettings): Promise<AuthorizationCheck>;
37
+ export declare function isGrantPreset(value: unknown): value is LTGrantPreset;
38
+ /** `uri` with `params` added to its query, keeping any query it already has. */
39
+ export declare function withQuery(uri: string, params: Record<string, string | undefined>): string;
40
+ /**
41
+ * The presets the person may grant. Read-only always; Just be me only when it
42
+ * adds something: a membership that can write, or an admin tier.
43
+ */
44
+ export declare function grantablePresets(roles: Array<{
45
+ type: string;
46
+ write_scope?: string | null;
47
+ }>): LTGrantPreset[];