@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
@@ -1,4 +1,4 @@
1
- import { Router } from 'express';
1
+ import { Router } from '../lib/http';
2
2
  import type { Server as HttpServer } from 'http';
3
3
  /**
4
4
  * Express adapter for mounting the Long Tail dashboard at an arbitrary subpath
@@ -65,5 +65,13 @@ export declare class LTExpressAdapter {
65
65
  * - SPA fallback with injected `<base href>` and `window.__LT_BASE__`
66
66
  */
67
67
  getRouter(): Router;
68
+ /**
69
+ * The OAuth well-known documents. Mount at the host's root, not under the
70
+ * base path: clients look for them at the origin. It answers only its two
71
+ * paths and passes everything else on.
72
+ */
73
+ getWellKnownRouter(): Router;
74
+ /** Whether a built dashboard was found to serve. */
75
+ hasDashboard(): boolean;
68
76
  private resolveDashboardDist;
69
77
  }
@@ -1,37 +1,4 @@
1
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
2
  var __importDefault = (this && this.__importDefault) || function (mod) {
36
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
37
4
  };
@@ -39,9 +6,11 @@ Object.defineProperty(exports, "__esModule", { value: true });
39
6
  exports.LTExpressAdapter = void 0;
40
7
  const fs_1 = require("fs");
41
8
  const path_1 = __importDefault(require("path"));
42
- const express_1 = __importStar(require("express"));
9
+ const http_1 = require("../lib/http");
10
+ const CONSENT_PAGE_PATH = '/oauth/consent';
43
11
  const routes_1 = __importDefault(require("../routes"));
44
12
  const mcp_endpoint_1 = __importDefault(require("../routes/mcp-endpoint"));
13
+ const oauth_well_known_1 = require("../routes/oauth-well-known");
45
14
  const events_1 = require("../lib/events");
46
15
  const socketio_1 = require("../lib/events/socketio");
47
16
  const nats_1 = require("../lib/events/nats");
@@ -124,6 +93,7 @@ class LTExpressAdapter {
124
93
  }
125
94
  (0, nats_ws_proxy_1.attachNatsWsProxy)(server, natsAdapter.wsProxyTarget, {
126
95
  basePath: this.basePath,
96
+ authToken: natsAdapter.authToken,
127
97
  onWsUrlDerived: (url) => {
128
98
  if (!natsAdapter.wsUrl) {
129
99
  natsAdapter.setWsUrl(url);
@@ -141,8 +111,8 @@ class LTExpressAdapter {
141
111
  * - SPA fallback with injected `<base href>` and `window.__LT_BASE__`
142
112
  */
143
113
  getRouter() {
144
- const router = (0, express_1.Router)();
145
- router.use(express_1.default.json());
114
+ const router = (0, http_1.Router)();
115
+ router.use((0, http_1.jsonBody)());
146
116
  // Health check
147
117
  router.get('/health', (_req, res) => {
148
118
  res.json({ status: 'ok', timestamp: new Date().toISOString() });
@@ -154,16 +124,25 @@ class LTExpressAdapter {
154
124
  // Dashboard static assets
155
125
  const dashboardDist = this.resolveDashboardDist();
156
126
  if (dashboardDist) {
157
- router.use(express_1.default.static(dashboardDist, { index: false }));
158
- // SPA fallback — inject base path into index.html
159
- const indexHtml = (0, fs_1.readFileSync)(path_1.default.join(dashboardDist, 'index.html'), 'utf-8');
127
+ router.use((0, http_1.serveStatic)(dashboardDist, { index: false }));
128
+ // SPA fallback — inject base path into index.html. Outside production
129
+ // the file is re-read per request so dashboard rebuilds show without a restart.
130
+ const indexPath = path_1.default.join(dashboardDist, 'index.html');
131
+ const cachedIndex = process.env.NODE_ENV === 'production' ? (0, fs_1.readFileSync)(indexPath, 'utf-8') : null;
160
132
  const basePath = this.basePath;
161
133
  // Serve __LT_BASE__ as external script (CSP-safe, no inline scripts)
162
134
  router.get('/config.js', (_req, res) => {
163
135
  res.type('application/javascript').send(`window.__LT_BASE__="${basePath}";`);
164
136
  });
165
- router.get('/{*splat}', (_req, res) => {
166
- const html = indexHtml.replace('<head>', '<head>' +
137
+ router.get('/{*splat}', (req, res) => {
138
+ // The consent page grants access to a person's account: never inside
139
+ // a frame. Browsers enforce every CSP header, so appending a second
140
+ // policy keeps the host's and still refuses framing.
141
+ if (req.path.startsWith(CONSENT_PAGE_PATH)) {
142
+ res.setHeader('X-Frame-Options', 'DENY');
143
+ res.append('Content-Security-Policy', "frame-ancestors 'none'");
144
+ }
145
+ const html = (cachedIndex ?? (0, fs_1.readFileSync)(indexPath, 'utf-8')).replace('<head>', '<head>' +
167
146
  `<base href="${basePath}/">` +
168
147
  `<script src="./config.js"></script>`);
169
148
  res.type('html').send(html);
@@ -171,6 +150,18 @@ class LTExpressAdapter {
171
150
  }
172
151
  return router;
173
152
  }
153
+ /**
154
+ * The OAuth well-known documents. Mount at the host's root, not under the
155
+ * base path: clients look for them at the origin. It answers only its two
156
+ * paths and passes everything else on.
157
+ */
158
+ getWellKnownRouter() {
159
+ return (0, oauth_well_known_1.createWellKnownRouter)();
160
+ }
161
+ /** Whether a built dashboard was found to serve. */
162
+ hasDashboard() {
163
+ return this.resolveDashboardDist() !== null;
164
+ }
174
165
  resolveDashboardDist() {
175
166
  // Check multiple paths relative to the compiled output location:
176
167
  // - Dev (ts-node from repo root): adapters/ -> dashboard/dist
@@ -1,4 +1,4 @@
1
- import type { Request, Response } from 'express';
1
+ import type { Request, Response } from '../lib/http';
2
2
  import type { LTApiResult } from '../types/sdk';
3
3
  /**
4
4
  * Exchange host authentication for a Long Tail JWT.
@@ -138,4 +138,6 @@ export declare function createBotKey(input: {
138
138
  */
139
139
  export declare function revokeBotKey(input: {
140
140
  keyId: string;
141
+ /** When given, the key is revoked only if it belongs to this bot. */
142
+ botId?: string;
141
143
  }): Promise<LTApiResult>;
@@ -44,6 +44,7 @@ exports.removeBotRole = removeBotRole;
44
44
  exports.listBotKeys = listBotKeys;
45
45
  exports.createBotKey = createBotKey;
46
46
  exports.revokeBotKey = revokeBotKey;
47
+ const bot_api_key_1 = require("../services/auth/bot-api-key");
47
48
  const iam = __importStar(require("../services/iam"));
48
49
  const user_1 = require("../services/user");
49
50
  /**
@@ -292,6 +293,9 @@ async function createBotKey(input) {
292
293
  */
293
294
  async function revokeBotKey(input) {
294
295
  try {
296
+ if (input.botId !== undefined && (await (0, bot_api_key_1.getBotApiKeyOwner)(input.keyId)) !== input.botId) {
297
+ return { status: 404, error: 'API key not found' };
298
+ }
295
299
  const revoked = await iam.revokeBotKey(input.keyId);
296
300
  if (!revoked) {
297
301
  return { status: 404, error: 'API key not found' };
@@ -1,2 +1,7 @@
1
- import type { LTApiResult } from '../types/sdk';
2
- export declare function listCapabilities(): Promise<LTApiResult>;
1
+ import type { LTApiAuth, LTApiResult } from '../types/sdk';
2
+ /**
3
+ * Every tool the caller may run, by category. A built-in server's tool is
4
+ * listed only when its manifest gate admits the caller, the same rule the
5
+ * tool-call route applies; an external server's tools are listed as before.
6
+ */
7
+ export declare function listCapabilities(auth?: LTApiAuth): Promise<LTApiResult>;
@@ -2,6 +2,8 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.listCapabilities = listCapabilities;
4
4
  const db_1 = require("../lib/db");
5
+ const capabilities_1 = require("../modules/capabilities");
6
+ const tools_1 = require("./mcp/tools");
5
7
  const LIST_SERVERS_WITH_TOOLS = `
6
8
  SELECT id, name, description, tags, tool_manifest, compile_hints, category
7
9
  FROM lt_mcp_servers
@@ -40,18 +42,27 @@ function resolveCategory(server) {
40
42
  }
41
43
  return 'Other';
42
44
  }
43
- async function listCapabilities() {
45
+ /**
46
+ * Every tool the caller may run, by category. A built-in server's tool is
47
+ * listed only when its manifest gate admits the caller, the same rule the
48
+ * tool-call route applies; an external server's tools are listed as before.
49
+ */
50
+ async function listCapabilities(auth) {
44
51
  try {
45
52
  const pool = (0, db_1.getPool)();
46
53
  const { rows } = await pool.query(LIST_SERVERS_WITH_TOOLS);
47
54
  const categoryMap = new Map();
55
+ const access = (0, capabilities_1.capabilityAccess)(auth?.userId ? { userId: auth.userId } : undefined);
48
56
  for (const server of rows) {
49
57
  const category = resolveCategory(server);
50
58
  const tools = (server.tool_manifest || []);
51
59
  if (!categoryMap.has(category)) {
52
60
  categoryMap.set(category, []);
53
61
  }
62
+ const builtin = await (0, tools_1.builtinServerFor)(server.name);
54
63
  for (const tool of tools) {
64
+ if (builtin && !(await access((0, tools_1.builtinToolGate)(builtin, tool.name))))
65
+ continue;
55
66
  categoryMap.get(category).push({
56
67
  name: tool.name,
57
68
  description: tool.description || '',
@@ -62,7 +73,7 @@ async function listCapabilities() {
62
73
  }
63
74
  }
64
75
  const categories = CATEGORY_ORDER
65
- .filter((name) => categoryMap.has(name))
76
+ .filter((name) => (categoryMap.get(name)?.length ?? 0) > 0)
66
77
  .map((name) => ({
67
78
  name,
68
79
  tools: categoryMap.get(name).sort((a, b) => a.name.localeCompare(b.name)),
@@ -73,6 +73,11 @@ async function effectiveRoles(query) {
73
73
  // query will actually touch. Resolution throws AnalyticsInputError (→ 400)
74
74
  // for unknown keys, before any scope decision.
75
75
  if (query?.entity) {
76
+ // The gate covers the entity's roles only, so a role filter beside it is
77
+ // refused here, before the gate, rather than reaching the query unchecked.
78
+ if (query.role !== undefined || query.roles !== undefined) {
79
+ throw new escalation_1.AnalyticsInputError('query.entity and query.role/roles are two scoping mechanisms: use one');
80
+ }
76
81
  return (await escalationService.resolveEntitySystem(query.entity)).map((s) => s.role);
77
82
  }
78
83
  if (query?.role)
@@ -43,6 +43,8 @@ export declare function bulkClaim(input: {
43
43
  *
44
44
  * Non-superadmin callers must verify the target user holds each
45
45
  * escalation's role (the query form requires exactly the declared role).
46
+ * The query form also requires the caller to manage that role's queue
47
+ * (write_scope all); read-only and self-scope members may not assign.
46
48
  * Publishes claim events for assigned items.
47
49
  *
48
50
  * @param input.ids — array of escalation UUIDs (ids form)
@@ -128,6 +128,8 @@ async function bulkClaim(input, auth) {
128
128
  *
129
129
  * Non-superadmin callers must verify the target user holds each
130
130
  * escalation's role (the query form requires exactly the declared role).
131
+ * The query form also requires the caller to manage that role's queue
132
+ * (write_scope all); read-only and self-scope members may not assign.
131
133
  * Publishes claim events for assigned items.
132
134
  *
133
135
  * @param input.ids — array of escalation UUIDs (ids form)
@@ -163,14 +165,17 @@ async function bulkAssign(input, auth) {
163
165
  if (!query.role || typeof query.role !== 'string') {
164
166
  return { status: 400, error: 'query.role is required' };
165
167
  }
166
- // RBAC, query form: the caller must hold the queried role (or global),
167
- // and the target user must hold it — one role check instead of per-id.
168
+ // RBAC, query form: the caller must manage the queried role's queue
169
+ // (write_scope all, or global), and the target user must hold the role.
168
170
  const hasGlobal = await (0, helpers_1.hasGlobalEscalationAccess)(auth.userId);
169
171
  if (!hasGlobal) {
170
- const callerHasRole = await userService.hasRole(auth.userId, query.role);
171
- if (!callerHasRole) {
172
+ const callerScope = await userService.getRoleScope(auth.userId, query.role);
173
+ if (!callerScope) {
172
174
  return { status: 404, error: 'One or more escalations not found' };
173
175
  }
176
+ if (callerScope.write !== 'all') {
177
+ return { status: 403, error: `You do not have permission to manage the "${query.role}" queue` };
178
+ }
174
179
  const targetHasRole = await userService.hasRole(targetUserId, query.role);
175
180
  if (!targetHasRole) {
176
181
  return { status: 400, error: `Target user does not hold the "${query.role}" role` };
@@ -15,6 +15,11 @@ export interface EscalationReadScope {
15
15
  selfRoles: string[];
16
16
  }
17
17
  export declare function getEscalationReadScope(userId: string): Promise<EscalationReadScope>;
18
+ /** Whether a read scope admits one escalation: the same rule as assertReadAccess, with no lookup. */
19
+ export declare function scopeAdmits(scope: EscalationReadScope, userId: string, escalation: {
20
+ role: string;
21
+ assigned_to?: string | null;
22
+ }): boolean;
18
23
  export declare function validateIds(ids: unknown): ids is string[];
19
24
  /**
20
25
  * Write-scope partition for metadata-driven resolve. Splits the user's roles by
@@ -35,6 +35,7 @@ var __importStar = (this && this.__importStar) || (function () {
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
36
  exports.hasGlobalEscalationAccess = void 0;
37
37
  exports.getEscalationReadScope = getEscalationReadScope;
38
+ exports.scopeAdmits = scopeAdmits;
38
39
  exports.validateIds = validateIds;
39
40
  exports.getEscalationWriteScope = getEscalationWriteScope;
40
41
  exports.assertReadAccess = assertReadAccess;
@@ -70,6 +71,12 @@ async function getEscalationReadScope(userId) {
70
71
  }
71
72
  return { global: false, allRoles, selfRoles };
72
73
  }
74
+ /** Whether a read scope admits one escalation: the same rule as assertReadAccess, with no lookup. */
75
+ function scopeAdmits(scope, userId, escalation) {
76
+ if (scope.global || scope.allRoles.includes(escalation.role))
77
+ return true;
78
+ return scope.selfRoles.includes(escalation.role) && escalation.assigned_to === userId;
79
+ }
73
80
  function validateIds(ids) {
74
81
  return Array.isArray(ids) && ids.length > 0;
75
82
  }
@@ -11,3 +11,4 @@ export { findByMetadata, claimByMetadata, resolveByMetadata } from './metadata';
11
11
  export { cancelSingleEscalation, bulkCancel } from './cancel';
12
12
  export { searchByFacets, claimGroups, claimByFacets } from './facets';
13
13
  export { aggregateByFacets, timelineByFacet } from './analytics';
14
+ export { getRelatedAggregates, getRelatedRows } from './related';
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.timelineByFacet = exports.aggregateByFacets = exports.claimByFacets = exports.claimGroups = exports.searchByFacets = exports.bulkCancel = exports.cancelSingleEscalation = exports.resolveByMetadata = exports.claimByMetadata = exports.findByMetadata = exports.itemsView = exports.getEscalationItemsBySignalKey = exports.getEscalationItems = exports.removeItemByMetadata = exports.removeItemBySignalKey = exports.removeItem = exports.accumulateItemByMetadata = exports.accumulateItemBySignalKey = exports.accumulateItem = exports.resolveBatchItemByMetadata = exports.resolveBatchItemBySignalKey = exports.resolveBatchItem = exports.resolveAllOrNone = exports.resolveByIds = exports.resolveBySignalKey = exports.resolveEscalation = exports.bulkTriage = exports.bulkEscalate = exports.bulkUnassign = exports.bulkAssign = exports.bulkClaim = exports.updatePriority = exports.releaseExpiredClaims = exports.releaseEscalation = exports.claimEscalation = exports.getEscalationLookups = exports.escalateToRole = exports.getEscalationsByWorkflowId = exports.getEscalation = exports.getStationMetrics = exports.getEscalationStats = exports.listFacetValues = exports.listFacetKeys = exports.listDistinctTypes = exports.listAvailableEscalations = exports.listEscalations = exports.createEscalation = void 0;
3
+ exports.getRelatedRows = exports.getRelatedAggregates = exports.timelineByFacet = exports.aggregateByFacets = exports.claimByFacets = exports.claimGroups = exports.searchByFacets = exports.bulkCancel = exports.cancelSingleEscalation = exports.resolveByMetadata = exports.claimByMetadata = exports.findByMetadata = exports.itemsView = exports.getEscalationItemsBySignalKey = exports.getEscalationItems = exports.removeItemByMetadata = exports.removeItemBySignalKey = exports.removeItem = exports.accumulateItemByMetadata = exports.accumulateItemBySignalKey = exports.accumulateItem = exports.resolveBatchItemByMetadata = exports.resolveBatchItemBySignalKey = exports.resolveBatchItem = exports.resolveAllOrNone = exports.resolveByIds = exports.resolveBySignalKey = exports.resolveEscalation = exports.bulkTriage = exports.bulkEscalate = exports.bulkUnassign = exports.bulkAssign = exports.bulkClaim = exports.updatePriority = exports.releaseExpiredClaims = exports.releaseEscalation = exports.claimEscalation = exports.getEscalationLookups = exports.escalateToRole = exports.getEscalationsByWorkflowId = exports.getEscalation = exports.getStationMetrics = exports.getEscalationStats = exports.listFacetValues = exports.listFacetKeys = exports.listDistinctTypes = exports.listAvailableEscalations = exports.listEscalations = exports.createEscalation = void 0;
4
4
  var create_1 = require("./create");
5
5
  Object.defineProperty(exports, "createEscalation", { enumerable: true, get: function () { return create_1.createEscalation; } });
6
6
  var list_1 = require("./list");
@@ -61,3 +61,6 @@ Object.defineProperty(exports, "claimByFacets", { enumerable: true, get: functio
61
61
  var analytics_1 = require("./analytics");
62
62
  Object.defineProperty(exports, "aggregateByFacets", { enumerable: true, get: function () { return analytics_1.aggregateByFacets; } });
63
63
  Object.defineProperty(exports, "timelineByFacet", { enumerable: true, get: function () { return analytics_1.timelineByFacet; } });
64
+ var related_1 = require("./related");
65
+ Object.defineProperty(exports, "getRelatedAggregates", { enumerable: true, get: function () { return related_1.getRelatedAggregates; } });
66
+ Object.defineProperty(exports, "getRelatedRows", { enumerable: true, get: function () { return related_1.getRelatedRows; } });
@@ -19,6 +19,11 @@ export interface FacetInput {
19
19
  * carries the full record.
20
20
  */
21
21
  include?: string;
22
+ /**
23
+ * Page by groups of this metadata key: a page holds whole groups and
24
+ * `total` counts groups. The response adds `groups: [{ key, ids }]`.
25
+ */
26
+ groupBy?: string;
22
27
  }
23
28
  /**
24
29
  * List escalations with optional filters.
@@ -43,6 +43,7 @@ exports.getStationMetrics = getStationMetrics;
43
43
  const escalationService = __importStar(require("../../services/escalation"));
44
44
  const features_1 = require("../../modules/features");
45
45
  const helpers_1 = require("./helpers");
46
+ const facet_sql_1 = require("../../services/escalation/facet-sql");
46
47
  /** Strip the heavyweight JSON columns from list rows unless asked back. */
47
48
  function projectListRows(rows, include) {
48
49
  if (include === 'envelope')
@@ -53,6 +54,12 @@ function projectListRows(rows, include) {
53
54
  function projectListResult(result, include) {
54
55
  return { ...result, escalations: projectListRows(result.escalations, include) };
55
56
  }
57
+ /** Run a scoped faceted search, paged by groups when the caller asked. */
58
+ async function runFacetedSearch(search, groupBy) {
59
+ return groupBy
60
+ ? escalationService.searchEscalationsGrouped({ ...search, groupKey: groupBy })
61
+ : escalationService.searchEscalationsFaceted(search);
62
+ }
56
63
  /** True when the caller asked for anything the plain list path can't express. */
57
64
  function hasFacetQuery(i) {
58
65
  return !!(i.facets ||
@@ -62,7 +69,8 @@ function hasFacetQuery(i) {
62
69
  i.orderBy?.length ||
63
70
  i.roles?.length ||
64
71
  i.available != null ||
65
- i.jeopardy === true);
72
+ i.jeopardy === true ||
73
+ !!i.groupBy);
66
74
  }
67
75
  /**
68
76
  * List escalations with optional filters.
@@ -86,6 +94,9 @@ function hasFacetQuery(i) {
86
94
  async function listEscalations(input, auth) {
87
95
  try {
88
96
  const scope = await (0, helpers_1.getEscalationReadScope)(auth.userId);
97
+ if (input.groupBy != null && !facet_sql_1.FACET_KEY.test(input.groupBy)) {
98
+ return { status: 400, error: 'groupBy must be a metadata key (letters, numbers, underscores)' };
99
+ }
89
100
  if (!scope.global && scope.allRoles.length === 0 && scope.selfRoles.length === 0) {
90
101
  return { status: 200, data: { escalations: [], total: 0 } };
91
102
  }
@@ -93,7 +104,7 @@ async function listEscalations(input, auth) {
93
104
  // language (facets/block/range/exists/metadata-sort) IN SQL — the caller's
94
105
  // role(s) can only NARROW within their scope, never widen past it.
95
106
  if (hasFacetQuery(input)) {
96
- const result = await escalationService.searchEscalationsFaceted({
107
+ const result = await runFacetedSearch({
97
108
  global: scope.global,
98
109
  visibleRoles: scope.global ? undefined : scope.allRoles,
99
110
  selfRoles: scope.global ? undefined : scope.selfRoles,
@@ -117,7 +128,7 @@ async function listEscalations(input, auth) {
117
128
  search: input.search,
118
129
  limit: input.limit ?? 50,
119
130
  offset: input.offset ?? 0,
120
- });
131
+ }, input.groupBy);
121
132
  return { status: 200, data: projectListResult(result, input.include) };
122
133
  }
123
134
  const result = await escalationService.listEscalations({
@@ -164,12 +175,15 @@ async function listEscalations(input, auth) {
164
175
  async function listAvailableEscalations(input, auth) {
165
176
  try {
166
177
  const scope = await (0, helpers_1.getEscalationReadScope)(auth.userId);
178
+ if (input.groupBy != null && !facet_sql_1.FACET_KEY.test(input.groupBy)) {
179
+ return { status: 400, error: 'groupBy must be a metadata key (letters, numbers, underscores)' };
180
+ }
167
181
  if (!scope.global && scope.allRoles.length === 0 && scope.selfRoles.length === 0) {
168
182
  return { status: 200, data: { escalations: [], total: 0 } };
169
183
  }
170
184
  // Faceted path — same as listEscalations but pinned to the available pool.
171
185
  if (hasFacetQuery(input)) {
172
- const result = await escalationService.searchEscalationsFaceted({
186
+ const result = await runFacetedSearch({
173
187
  global: scope.global,
174
188
  visibleRoles: scope.global ? undefined : scope.allRoles,
175
189
  selfRoles: scope.global ? undefined : scope.selfRoles,
@@ -192,7 +206,7 @@ async function listAvailableEscalations(input, auth) {
192
206
  search: input.search,
193
207
  limit: input.limit ?? 50,
194
208
  offset: input.offset ?? 0,
195
- });
209
+ }, input.groupBy);
196
210
  return { status: 200, data: projectListResult(result, input.include) };
197
211
  }
198
212
  const result = await escalationService.listAvailableEscalations({
@@ -73,6 +73,9 @@ async function findByMetadata(input, auth) {
73
73
  // WHERE and COUNT. Global access → no filter. Never filter a fetched page
74
74
  // controller-side — that shrinks the page and reports a wrong total.
75
75
  const scope = await (0, helpers_1.getEscalationReadScope)(auth.userId);
76
+ if (!scope.global && scope.allRoles.length === 0 && scope.selfRoles.length === 0) {
77
+ return { status: 200, data: { escalations: [], total: 0 } };
78
+ }
76
79
  const result = await escalationService.findByMetadata(input.key, input.value, input.status, input.limit, input.offset, scope.global
77
80
  ? undefined
78
81
  : { allRoles: scope.allRoles, selfRoles: scope.selfRoles, meUserId: auth.userId });
@@ -0,0 +1,18 @@
1
+ import type { LTApiAuth, LTApiResult } from '../../types/sdk';
2
+ /**
3
+ * Aggregate every related set the role's list schema declares, for one page
4
+ * of host rows. One statement per (set, split) pair, whatever the page size.
5
+ */
6
+ export declare function getRelatedAggregates(input: {
7
+ role: string;
8
+ ids: string[];
9
+ version?: number;
10
+ }, auth: LTApiAuth): Promise<LTApiResult>;
11
+ /** One host's rows in one related set, for a row detail section. */
12
+ export declare function getRelatedRows(input: {
13
+ role: string;
14
+ id: string;
15
+ set: string;
16
+ version?: number;
17
+ limit?: number;
18
+ }, auth: LTApiAuth): Promise<LTApiResult>;