@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
@@ -21,13 +21,13 @@ These servers ship with the product and reflect the core API surface:
21
21
 
22
22
  | Server | Category | Tools | Description |
23
23
  |--------|----------|-------|-------------|
24
- | [long-tail-admin](admin.md) | System | 71 | Unified system management — tasks, escalations, agents, workflows, users, etc. |
25
- | [long-tail-human-queue](human-queue.md) | Automation | 5 | Escalation workflow primitives (durable pause + signal) |
24
+ | [long-tail-admin](admin.md) | System | 119 | Unified system management — tasks, escalations, agents, workflows, users, etc. |
25
+ | [long-tail-human-queue](human-queue.md) | Automation | 10 | Escalation workflow primitives (durable pause + signal) |
26
26
  | [long-tail-file-storage](file-storage.md) | Data | 4 | Managed file storage (MinIO/GCS/S3) |
27
27
  | [long-tail-http-fetch](http-fetch.md) | Data | 3 | HTTP client for external requests |
28
28
  | [long-tail-schema-exchange](schema-exchange.md) | Data | 2 | Schema-validated HTTP exchange with credential resolution |
29
29
  | [long-tail-oauth](oauth.md) | System | 3 | OAuth token management and refresh |
30
- | [long-tail-knowledge](knowledge.md) | Data | 7 | Persistent JSONB knowledge store |
30
+ | [long-tail-knowledge](knowledge.md) | Data | 10 | Persistent JSONB knowledge store |
31
31
  | [long-tail-docs](docs.md) | Reference | 3 | Documentation search and retrieval |
32
32
  | [long-tail-events](events.md) | Communication | 4 | Event bus pub/sub |
33
33
  | [long-tail-vision](vision.md) | Analysis | 2 | Image analysis via LLM vision (AI key required) |
@@ -38,15 +38,18 @@ These servers ship with the product and reflect the core API surface:
38
38
 
39
39
  These servers are included as examples of how to extend Long Tail with additional MCP capabilities. They demonstrate the registration pattern for adding browser automation or other domain-specific tools:
40
40
 
41
- | Server | Category | Description |
42
- |--------|----------|-------------|
43
- | long-tail-playwright | Automation | Low-level browser automation via Playwright (requires binary) |
44
- | long-tail-playwright-cli | Automation | High-level browser automation |
45
- | long-tail-gmail | Communication | Gmail integration (OAuth) |
46
- | long-tail-image-tools | Media | Image processing via sharp |
41
+ | Server | Category | Tools | Description |
42
+ |--------|----------|-------|-------------|
43
+ | long-tail-playwright | Automation | 9 | Low-level browser automation via Playwright (requires binary) |
44
+ | long-tail-playwright-cli | Automation | 5 | High-level browser automation |
45
+ | long-tail-gmail | Communication | 5 | Gmail integration (OAuth) |
46
+ | long-tail-image-tools | Media | 12 | Image processing via sharp |
47
+ | [long-tail-ortho](ortho.md) | Automation | 4 | Drives the `ortho-pipeline` example workflow: submit orders, complete stage escalations, track status |
47
48
 
48
49
  See `examples/mcp-servers/` for the registration pattern.
49
50
 
50
51
  ## Read-Safe Classification
51
52
 
52
- Every tool is classified as either **read-safe** (query-only, no side effects) or **write** (modifies state). When `mcp.exposure.readOnly` is enabled, only read-safe tools are available to external MCP consumers.
53
+ Every tool is classified as either **read-safe** (query-only, no side effects) or **write** (modifies state). When `mcp.exposure.readOnly` is enabled, only read-safe tools are available to external MCP consumers. A caller whose key or OAuth grant is read-only sees the same read-safe subset.
54
+
55
+ Each tool also declares a role gate (`caller`, `admin`, `builder`, `roleManager`, or `superadmin`), and a tool appears only to accounts that hold it. See the MCP guide's [Access](../../mcp.md#access-which-tools-and-which-records) section.
@@ -139,3 +139,37 @@ Append a value to an array field within a knowledge entry. Creates the entry and
139
139
  | key | string | Yes | Document key |
140
140
  | path | string | Yes | JSONB path to array field |
141
141
  | value | any | Yes | Value to append to the array |
142
+
143
+ ### set_knowledge_field
144
+
145
+ Set a value at a dot-notation path within a knowledge entry, keeping sibling fields. Creates the entry when it does not exist.
146
+
147
+ | | |
148
+ |---|---|
149
+ | Read-safe | No |
150
+
151
+ **Parameters:**
152
+
153
+ | Field | Type | Required | Description |
154
+ |-------|------|----------|-------------|
155
+ | domain | string | Yes | Knowledge domain |
156
+ | key | string | Yes | Document key |
157
+ | path | string | Yes | Dot-notation path to the field |
158
+ | value | any | Yes | Value to set, any JSON type |
159
+ | tags | string[] | No | Tags to union with existing tags |
160
+
161
+ ### remove_knowledge_field
162
+
163
+ Remove a field from a knowledge entry by dot-path. The entry remains; only the targeted path is deleted.
164
+
165
+ | | |
166
+ |---|---|
167
+ | Read-safe | No |
168
+
169
+ **Parameters:**
170
+
171
+ | Field | Type | Required | Description |
172
+ |-------|------|----------|-------------|
173
+ | domain | string | Yes | Knowledge domain |
174
+ | key | string | Yes | Document key |
175
+ | path | string | Yes | Dot-notation path to remove |
@@ -21,7 +21,7 @@ Get a fresh OAuth access token for an external service. Automatically refreshes
21
21
 
22
22
  | | |
23
23
  |---|---|
24
- | Read-safe | Yes |
24
+ | Read-safe | No |
25
25
 
26
26
  **Parameters:**
27
27
 
@@ -0,0 +1,113 @@
1
+ # Ortho (example server)
2
+
3
+ Example connector for the `ortho-pipeline` example workflow (`examples/workflows/ortho-pipeline`). `system/index.ts` registers it when the `examples/` tree is available; the npm package excludes it.
4
+
5
+ | Property | Value |
6
+ |----------|-------|
7
+ | Server ID | `long-tail-ortho` |
8
+ | Category | Automation |
9
+ | AI required | No |
10
+ | Source | `examples/mcp-servers/ortho.ts` |
11
+ | Tool manifest | `examples/seed/tool-manifests-ortho.ts` |
12
+
13
+ ## Overview
14
+
15
+ AI-operable tools for driving the orthotic manufacturing pipeline. Each order passes through eight sequential stages (design → review → print → grind → glue → finish → qa → ship). The pipeline is a HotMesh durable workflow; each stage suspends at a `conditional` checkpoint until an escalation is resolved.
16
+
17
+ A Claude agent loop calls `ortho_submit` to start an order, polls `ortho_pending` to see what's waiting, drives each stage forward with `ortho_complete_stage`, and monitors progress with `ortho_status`.
18
+
19
+ ### ortho_submit
20
+
21
+ Start a new orthotic manufacturing order through the 8-stage pipeline.
22
+
23
+ | | |
24
+ |---|---|
25
+ | Read-safe | No |
26
+
27
+ **Parameters:**
28
+
29
+ | Field | Type | Required | Description |
30
+ |-------|------|----------|-------------|
31
+ | `order_id` | `string` | Yes | Unique order identifier (e.g. `"ORD-001"`) |
32
+ | `item_type` | `string` | Yes | Item type (e.g. `"insole-standard"`, `"insole-diabetic"`) |
33
+ | `stages` | `string[]` | No | Override the stage sequence. Default: `["design","review","print","grind","glue","finish","qa","ship"]` |
34
+ | `metadata` | `object` | No | Additional order metadata passed through to each stage escalation |
35
+
36
+ **Returns:** `{ workflow_id, order_id, item_type, stages, message }`
37
+
38
+ ---
39
+
40
+ ### ortho_pending
41
+
42
+ List open ortho-pipeline stage escalations waiting to be completed.
43
+
44
+ | | |
45
+ |---|---|
46
+ | Read-safe | Yes |
47
+
48
+ **Parameters:**
49
+
50
+ | Field | Type | Required | Description |
51
+ |-------|------|----------|-------------|
52
+ | `stage` | `string` | No | Filter to a specific stage (e.g. `"design"`). Omit to see all stages |
53
+ | `limit` | `integer` | No | Max results (default: 50) |
54
+
55
+ **Returns:** `{ count, escalations }` where each escalation includes `id`, `stage`, `order_id`, `item_type`, `description`, `created_at`, `workflow_id`.
56
+
57
+ ---
58
+
59
+ ### ortho_complete_stage
60
+
61
+ Complete a pending ortho pipeline stage. Claims the escalation and resolves it with notes and outcome data. Resolving automatically advances the workflow — a new escalation for the next stage appears within seconds.
62
+
63
+ | | |
64
+ |---|---|
65
+ | Read-safe | No |
66
+
67
+ **Parameters:**
68
+
69
+ | Field | Type | Required | Description |
70
+ |-------|------|----------|-------------|
71
+ | `escalation_id` | `string` | Yes | Escalation ID from `ortho_pending` |
72
+ | `notes` | `string` | Yes | Completion notes — what was done, any decisions made |
73
+ | `outcome` | `object` | No | Structured outcome data specific to this stage |
74
+
75
+ **Returns:** `{ resolved, escalation_id, status, message }`
76
+
77
+ ---
78
+
79
+ ### ortho_status
80
+
81
+ Get the current status and completed stage results for an ortho pipeline workflow.
82
+
83
+ | | |
84
+ |---|---|
85
+ | Read-safe | Yes |
86
+
87
+ **Parameters:**
88
+
89
+ | Field | Type | Required | Description |
90
+ |-------|------|----------|-------------|
91
+ | `workflow_id` | `string` | Yes | Workflow ID from `ortho_submit` |
92
+
93
+ **Returns:** `{ workflow_id, status }` where `status` is `"running"` while in progress or `"complete"` with `result` containing all stage outputs once finished.
94
+
95
+ ---
96
+
97
+ **Agent loop example:**
98
+
99
+ ```
100
+ ortho_submit({ order_id: "ORD-042", item_type: "insole-diabetic" })
101
+ → { workflow_id: "wf-abc123", stages: ["design", "review", ...] }
102
+
103
+ ortho_pending({ stage: "design" })
104
+ → [{ id: "esc-001", stage: "design", order_id: "ORD-042" }]
105
+
106
+ ortho_complete_stage({ escalation_id: "esc-001", notes: "3mm heel, D-width approved", outcome: { spec_version: "v2" } })
107
+ → { resolved: true }
108
+
109
+ ... repeat through all 8 stages ...
110
+
111
+ ortho_status({ workflow_id: "wf-abc123" })
112
+ → { status: "complete", result: { order_id: "ORD-042", results: [...] } }
113
+ ```
@@ -11,7 +11,7 @@ Image analysis and description using LLM vision. Analyzes images to extract stru
11
11
 
12
12
  ## Compile Hints
13
13
 
14
- Vision tools process one image at a time. The argument name is `image` (NOT `image_path`). It accepts a storage path, data URI, or https:// URL. Vision tools do NOT use browser sessions. Do NOT wire page_id or _handle to vision tools. analyze_image output fields: description (string), text_content (string), objects (array).
14
+ Vision tools process one image at a time. The argument name is `image` (NOT `image_path`). It accepts a storage path, data URI, or https:// URL. Reading a storage path requires builder access, as the file browser does; a data URI or https:// URL needs none. Vision tools do NOT use browser sessions. Do NOT wire page_id or _handle to vision tools. analyze_image output fields: description (string), text_content (string), objects (array).
15
15
 
16
16
  ## Tools
17
17
 
@@ -237,6 +237,7 @@ const result = await lt.botAccounts.revokeKey({ keyId: 'key-id' });
237
237
  | Field | Type | Required | Description |
238
238
  |-------|------|----------|-------------|
239
239
  | `keyId` | `string` | Yes | Unique identifier of the API key to revoke |
240
+ | `botId` | `string` | No | When given, the key is revoked only if it belongs to this bot; otherwise `404` |
240
241
 
241
242
  **Returns:** `LTApiResult<{ revoked: true }>`
242
243
 
@@ -220,7 +220,7 @@ const result = await lt.escalations.getLookups({ id: 'esc_123' });
220
220
 
221
221
  ## getByWorkflowId
222
222
 
223
- List all escalations for a given workflow ID.
223
+ List the escalations for a given workflow ID. With `auth` as the second argument, only the escalations that caller may read; without it, every escalation.
224
224
 
225
225
  ```typescript
226
226
  const result = await lt.escalations.getByWorkflowId({ workflowId: 'wf_abc' });
@@ -234,7 +234,7 @@ const result = await lt.escalations.getByWorkflowId({ workflowId: 'wf_abc' });
234
234
 
235
235
  **Returns:** `LTApiResult<{ escalations }>`
236
236
 
237
- **Auth:** Not required
237
+ **Auth:** Optional (filters to the caller's readable escalations when provided)
238
238
 
239
239
  ---
240
240
 
@@ -1224,3 +1224,19 @@ interface StationMetric {
1224
1224
  `pending` reflects the live queue depth regardless of period. `claimed`, `resolved`, and both percentile objects use the lookback window. `priority_count` covers pending, unclaimed items whose age exceeds the role's threshold — age from the `priority_facet` metadata timestamp (`created_at` when unset) against `priority_threshold_minutes` (`sla_minutes` when unset); stations with neither threshold always return `0`. `throughput_pct` is `null` when `target_per_hour` is not set.
1225
1225
 
1226
1226
  **Auth:** Same RBAC as `getStats` — callers see only the stations for roles they hold.
1227
+
1228
+ ## getRelated / getRelatedRows
1229
+
1230
+ Read the related sets a role's list schema declares (`x-lt-related`) for list rows, under the caller's read scope. Mirrors `POST /api/escalations/related` and `/related/rows`.
1231
+
1232
+ ```typescript
1233
+ const page = await client.escalations.getRelated({ role: 'consolidate', ids: rows.map((r) => r.id) });
1234
+ // page.data.sets.contents.aggregates['reciprocal.metadata.serviceLevel'][rowId]
1235
+ // → { count: 3, splits: { standard: 2, express: 1 } }
1236
+
1237
+ const orders = await client.escalations.getRelatedRows({ role: 'consolidate', id: rowId, set: 'contents' });
1238
+ // orders.data.rows → [{ item: { itemKey, at, reciprocalId }, escalation }]
1239
+ ```
1240
+
1241
+ `list` and `listAvailable` take `groupBy` (a metadata key) to page by groups of rows sharing it: the response adds `groups: [{ key, ids }]` and `total` counts groups.
1242
+
@@ -243,8 +243,8 @@ const result = await lt.mcp.callTool({
243
243
  | `id` | `string` | Yes | The MCP server identifier |
244
244
  | `toolName` | `string` | Yes | Name of the tool to invoke |
245
245
  | `arguments` | `Record<string, any>` | No | Key-value arguments to pass to the tool |
246
- | `execute_as` | `string` | No | User ID to impersonate for the tool call |
246
+ | `execute_as` | `string` | No | Account id or `external_id` to run the tool as |
247
247
 
248
248
  **Returns:** `LTApiResult<{ result: any }>`
249
249
 
250
- **Auth:** Optional (userId forwarded to the MCP adapter when provided)
250
+ **Auth:** Required (`401` without it). The tool runs as the caller, or as `execute_as` when given; for `execute_as`, a superadmin may act as anyone, and a caller holding an `admin`-type grant may act as an account that holds no superadmin grant and whose every role the caller holds at the same or higher type. A built-in tool requires the capability its manifest `gate` declares, checked for the acting account; a built-in tool with no gate requires builder access (superadmin or the `engineer` role). Refusals return `403`.
@@ -20,7 +20,7 @@ const result = await lt.settings.get();
20
20
  | `escalation.claimDurations` | `number[]` | Available claim duration options (minutes) |
21
21
  | `events.transport` | `'socketio' \| 'nats' \| 'none'` | Dashboard event transport (default: `socketio`; `nats` when `EVENT_TRANSPORT=nats`) |
22
22
  | `events.natsWsUrl` | `string \| null` | NATS WebSocket URL (present when NATS adapter registered) |
23
- | `events.natsToken` | `string \| null` | NATS auth token (present when NATS adapter registered) |
23
+ | `events.reconnect` | `{ initialDelayMs, maxDelayMs, noticeAfterMs, spreadMs }` | Dashboard reconnect timing in ms (`NATS_RECONNECT_INITIAL_MS` default `1000`, `NATS_RECONNECT_MAX_MS` default `60000`, `NATS_LIVE_NOTICE_AFTER_MS` default `30000`, `NATS_RECONNECT_SPREAD_MS` default `5000`) |
24
24
  | `auth.sso` | `boolean` | Whether SSO is configured for embedded deployments |
25
25
  | `auth.ssoLogoutUrl` | `string \| null` | Host logout URL (redirected to on dashboard sign out) |
26
26
  | `ai.enabled` | `boolean` | Whether an LLM API key is configured |
@@ -122,7 +122,7 @@ const result = await lt.tasks.listProcesses({
122
122
 
123
123
  ## getProcess
124
124
 
125
- Get a single process with all its tasks and escalations.
125
+ Get a single process with all its tasks and escalations. With `auth` as the second argument, only the escalations that caller may read.
126
126
 
127
127
  ```typescript
128
128
  const result = await lt.tasks.getProcess({ originId: 'origin_xyz' });
@@ -136,7 +136,7 @@ const result = await lt.tasks.getProcess({ originId: 'origin_xyz' });
136
136
 
137
137
  **Returns:** `LTApiResult<{ origin_id, tasks, escalations }>`
138
138
 
139
- **Auth:** Not required
139
+ **Auth:** Optional (filters escalations to the caller's readable ones when provided)
140
140
 
141
141
  ---
142
142
 
@@ -23,12 +23,12 @@ const result = await lt.workflows.invoke({
23
23
  | `type` | `string` | Yes | Workflow function name |
24
24
  | `data` | `Record<string, any>` | No | Envelope data payload |
25
25
  | `metadata` | `Record<string, any>` | No | Envelope metadata |
26
- | `execute_as` | `string` | No | Service account for proxy invocation |
26
+ | `execute_as` | `string` | No | Account id or `external_id` to run as. Requires admin access and the act-as rule below. |
27
27
  | `options` | `Record<string, any>` | No | Passthrough to Durable WorkflowOptions |
28
28
 
29
29
  **Returns:** `LTApiResult<{ workflowId, message }>` (status 202)
30
30
 
31
- **Auth:** Required
31
+ **Auth:** Required. When `invocation_roles` is set, the caller must hold one of them; roles are read from the caller's current grants in the database. Empty `invocation_roles` admits any authenticated caller. A superadmin grant, or the `admin` role held with `admin` type, invokes any workflow. `capabilityInvoke` requires a superadmin grant. For `execute_as`, a superadmin may act as anyone, and a caller holding an `admin`-type grant may act as an account that holds no superadmin grant and whose every role the caller holds at the same or higher type; otherwise `403`.
32
32
 
33
33
  ---
34
34
 
@@ -258,7 +258,7 @@ const result = await lt.yamlWorkflows.invoke({
258
258
 
259
259
  **Returns:** `LTApiResult<any>`
260
260
 
261
- **Auth:** Optional (userId forwarded to invoke service when provided)
261
+ **Auth:** Optional (userId forwarded to invoke service when provided). `execute_as` requires an authenticated caller and the act-as rule: a superadmin may act as anyone, and a caller holding an `admin`-type grant may act as an account that holds no superadmin grant and whose every role the caller holds at the same or higher type. The server sets the workflow's `_scope` identity context; a `_scope` key in `data` is ignored.
262
262
 
263
263
  ---
264
264
 
@@ -24,7 +24,7 @@ system/ Always ships. The built-in tool inventory.
24
24
  └── mcp-servers/ Built-in MCP servers wrapping the activities
25
25
 
26
26
  examples/ Opt-in demos. Seed with `examples: true`.
27
- ├── workflows/ review-content, verify-document, process-claim, ...
27
+ ├── workflows/ review-content, kitchen-sink, ortho-pipeline, ...
28
28
  └── types/
29
29
 
30
30
  your-app/ Your workflows. Same conventions, your directory.
@@ -150,6 +150,8 @@ const servers = await findServersByTags(['database', 'analytics'], 'any');
150
150
 
151
151
  Tags are GIN-indexed in PostgreSQL for fast lookup. Register a new MCP server tagged `analytics` and mcpQuery automatically picks up its tools. Register one tagged `vision` and mcpTriage can use it for remediation. The tool inventory grows without code changes.
152
152
 
153
+ The model sees and calls only the tools the workflow's principal may call. A tool the LLM chooses in mcpQuery or mcpTriage acts as that principal and passes the same manifest gate it carries at `/mcp`. A workflow with no principal, such as an internal job, runs its tools as `lt-system`.
154
+
153
155
  ### System Workflows
154
156
 
155
157
  | Pipeline | Workflows | Purpose |
package/docs/auth.md CHANGED
@@ -75,7 +75,7 @@ Long Tail's embedded server automatically applies auth middleware to all API rou
75
75
 
76
76
  ### requireAdmin
77
77
 
78
- `requireAdmin` is a separate middleware that runs after authentication. It checks whether the authenticated user holds superadmin status, either through a database lookup (`isSuperAdmin()`) or by verifying that the JWT `role` claim equals `'admin'`. Requests that fail this check receive a `403 Forbidden` response.
78
+ `requireAdmin` is a separate middleware that runs after authentication. It passes a request whose JWT `role` claim is `'admin'` or `'superadmin'`, or whose user is a superadmin in the database (`isSuperAdmin()`). Requests that fail this check receive a `403 Forbidden` response.
79
79
 
80
80
  ## Custom Adapter Example
81
81
 
@@ -258,7 +258,7 @@ A resolve that slides the session makes this endpoint a session-refresh surface
258
258
 
259
259
  ### requireAuth Fallback
260
260
 
261
- When SSO is configured and a request arrives without a Bearer token, `requireAuth` calls `sso.resolve(req)` as a fallback. This allows direct API calls from the host backend (which forward cookies but not Bearer tokens) to authenticate without an explicit exchange. The dashboard always uses Bearer after the initial exchange. The fallback never passes `res` — session sliding belongs exclusively to the exchange.
261
+ When SSO is configured and a request arrives without a Bearer token, `requireAuth` calls `sso.resolve(req)` as a fallback. This allows direct API calls from the host backend (which forward cookies but not Bearer tokens) to authenticate without an explicit exchange. The dashboard always uses Bearer after the initial exchange. The fallback never passes `res` — session sliding belongs exclusively to the exchange. The fallback does not apply at `/mcp`: an MCP request authenticates only with the Bearer credential it carries (an OAuth access token, a service-account key, or a signed JWT). See [Connect with OAuth](mcp.md#connect-with-oauth).
262
262
 
263
263
  ### Role Mapping
264
264
 
@@ -311,5 +311,6 @@ When a service account starts a workflow, its `userId` flows through the same en
311
311
  | Variable | Required | Description |
312
312
  |--------------|----------|--------------------------------------------------|
313
313
  | `JWT_SECRET` | Yes | Signing and verification key for the JWT adapter. |
314
+ | `LT_OAUTH_ISSUER` | No | Public base URL for the OAuth authorization server that MCP clients sign in through. Equivalent to `auth.oauthServer.issuer` in `start()`. See [Connect with OAuth](mcp.md#connect-with-oauth). |
314
315
 
315
316
  `JWT_SECRET` must be set when using `JwtAuthAdapter` or `signToken`. Omitting it will cause token verification to fail at runtime. Use a cryptographically random string of at least 32 characters in production.
package/docs/cloud.md CHANGED
@@ -39,14 +39,14 @@ The worker container registers the LT interceptor, starts workflow workers, and
39
39
  // worker.ts — Worker container entry point
40
40
  import { start } from '@hotmeshio/long-tail';
41
41
  import * as reviewContent from './workflows/review-content';
42
- import * as verifyDocument from './workflows/verify-document';
42
+ import * as kitchenSink from './workflows/kitchen-sink';
43
43
 
44
44
  await start({
45
45
  database: { connectionString: process.env.DATABASE_URL },
46
46
  server: { enabled: false },
47
47
  workers: [
48
48
  { taskQueue: 'long-tail', workflow: reviewContent.reviewContent },
49
- { taskQueue: 'long-tail-verify', workflow: verifyDocument.verifyDocument },
49
+ { taskQueue: 'long-tail-examples', workflow: kitchenSink.kitchenSink },
50
50
  ],
51
51
  telemetry: process.env.HONEYCOMB_API_KEY
52
52
  ? { honeycomb: { apiKey: process.env.HONEYCOMB_API_KEY } }
@@ -217,6 +217,11 @@ The API Deployment sits behind a Service + Ingress. The worker Deployment has no
217
217
  | `HONEYCOMB_API_KEY` | — | yes | Honeycomb telemetry (optional) |
218
218
  | `HMSH_TELEMETRY` | — | yes | Span verbosity: `info` or `debug` |
219
219
  | `NATS_URL` | — | yes | NATS server for milestone events (optional) |
220
+ | `NATS_WS_TICKET_TTL_SECONDS` | yes | — | Lifetime of the dashboard's WebSocket proxy ticket (default: 300) |
221
+ | `NATS_RECONNECT_INITIAL_MS` | yes | — | Dashboard reconnect: first backoff delay (default: 1000) |
222
+ | `NATS_RECONNECT_MAX_MS` | yes | — | Dashboard reconnect: backoff cap (default: 60000) |
223
+ | `NATS_LIVE_NOTICE_AFTER_MS` | yes | — | How long live updates stay down before the dashboard shows a notice (default: 30000) |
224
+ | `NATS_RECONNECT_SPREAD_MS` | yes | — | Window the first retry after a drop and the catch-up refetch spread across (default: 5000) |
220
225
  | `OPENAI_API_KEY` | — | yes | For workflows that call OpenAI (optional) |
221
226
 
222
227
  Environment variables serve as fallbacks. When using `start()`, prefer passing config directly — it's explicit and type-checked. The API container does not need telemetry, event, or AI keys — it never executes workflow code. The worker container does not need `JWT_SECRET` or `PORT` — it never serves HTTP.
@@ -157,3 +157,15 @@ dedicated advisory lock, separate from the migration lock. Single-statement
157
157
  applies are also individually race-safe: every upsert carries an
158
158
  `IS DISTINCT FROM` guard, so an identical declaration arriving from two
159
159
  containers writes once and no-ops once.
160
+
161
+ ## Display time zone
162
+
163
+ `display.timeZone` (an IANA name) renders every dashboard date in that zone, so a floor reads its own time on every screen: list columns, station facts, and detail pages alike. Unset, dates render in the viewer's browser zone. An unknown zone fails the boot.
164
+
165
+ ```typescript
166
+ await start({
167
+ // …
168
+ display: { timeZone: 'America/Chicago' },
169
+ });
170
+ ```
171
+
package/docs/dashboard.md CHANGED
@@ -86,7 +86,7 @@ The top navigation bar contains:
86
86
  - **scan** (Barcode icon) — opens the scan panel for manual code entry and capture settings, shown when `features.scanCodes` stands. See [Scan Codes](#scan-codes).
87
87
  - **events** — toggles the live event feed (builders and ops; doubles as the connection indicator).
88
88
  - **docs** (BookOpen icon) — toggles the in-app documentation drawer. Each page also has a contextual docs link next to its title that opens the drawer to the relevant section.
89
- - **User menu** — **Credentials** (OAuth connections and API keys), **Link variables** (per-device facet bindings that scope pins and the Pace Board — see [Faceted Routing](faceted-routing.md#link-variables)), the **theme picker** (five accent themes), and **Sign Out**.
89
+ - **User menu** — **Credentials** (OAuth connections and API keys), **Connected apps** (MCP clients connected with OAuth, when the OAuth server is enabled), **Link variables** (per-device facet bindings that scope pins and the Pace Board — see [Faceted Routing](faceted-routing.md#link-variables)), the **theme picker** (five accent themes), and **Sign Out**.
90
90
 
91
91
  ## Home — Recent Activity
92
92
 
@@ -137,7 +137,7 @@ Accessible at `/workflows/durable/invoke` to anyone the server lists an invokabl
137
137
  Every invokable workflow is presented as a tool. The list of tools takes the left quarter of the row, grouped by task queue, with the prompt **Choose a tool to begin** until one is selected. Names read as titles (`fleetTools` shows as **Fleet Tools**, queues the same way) and each row leads with the workflow's icon, or its tier glyph when none is declared. The first row is preselected, `?type=<WorkflowType>` tracks the choice, and every choice is a history entry, so the page opens on a form and the back button retraces picks. The form fills the rest of the row, its heading and Submit staying put while the body scrolls:
138
138
 
139
139
  - **Heading and description** — the icon and title, with the identifier, tier, and queue as metadata, then the config's one-line description. Keep reference material in `x-lt-help`; it appears in the side panel on demand.
140
- - **Identity summary** — who will execute: the current user, the workflow's configured `execute_as` bot ("configured default"), or, for admins and superadmins, an override chosen from the bot picker ("admin override").
140
+ - **Identity summary** — who will execute: the current user, the workflow's configured `execute_as` bot ("configured default"), or, for admins and superadmins, an override chosen from the bot picker ("admin override"). The server accepts an override only within the caller's own authority (see [IAM](iam.md#when-to-use-a-service-account)).
141
141
  - **Certification checkbox** — for a certified workflow, stamps `metadata.certified` on this one run.
142
142
  - **The form** — a workflow that declares `inputSchema` renders the x-lt-* form: sections, two columns, conditional fields and instruction blocks, selects with inline or lookup-backed labeled options, Yes/No decisions over booleans, multi-select lists, validated JSON maps, and a side panel with **Instructions** (the interpolated `x-lt-help`) and **Issues** (violations, click to focus). The `fleetTools` example exercises every shape. Every other workflow renders the envelope template form from `envelopeSchema`, with its Form and JSON views. See [Invoke forms](hitl/invoke-form.md).
143
143
  - **Submit** — posts `{ data, metadata }` to the invoke endpoint. The page stays put, reports the started id, and subscribes to that run's `system.workflow.{id}.completed` and `.failed` events, so the outcome and the workflow's returned `data` appear beside Submit without leaving the page. One click disarms the button until the person chooses **Submit again**. While live events are off, a warning beside the button offers a reconnect, since the result could not arrive otherwise. Builders also get a **View workflow** link to its execution. A `422` from the input schema gate lands in the Issues view.
@@ -176,7 +176,7 @@ Browse all registered MCP servers and their exposed tools.
176
176
  - **Register Server** button — opens a guided wizard: choose transport, configure connection, discover tools, review and save.
177
177
  - **Server detail** — click any row to view and edit. Shows all exposed tools with their input schemas, tags, compile hints, and credential providers. Tools are the building blocks that the MCP Tool Designer compiles into deterministic pipelines.
178
178
 
179
- **API:** `GET /api/mcp-servers` lists servers. `POST /api/mcp-servers` registers a new one. `GET /api/mcp-servers/:id/tools` lists tools for a server.
179
+ **API:** `GET /api/mcp/servers` lists servers. `POST /api/mcp/servers` registers a new one. `GET /api/mcp/servers/:id/tools` lists tools for a server. Registering, editing, connecting and deleting servers require builder access; reads are open to any account, and `transport_config` is returned to builders only.
180
180
 
181
181
  ### Graph Workflows
182
182
 
@@ -196,7 +196,7 @@ The Graph → Configure page. Deterministic workflows compiled from dynamic MCP
196
196
 
197
197
  **Empty state:** When no tools have been compiled yet, a Wand2 icon prompts users to visit the MCP Tool Designer to create their first deterministic tool.
198
198
 
199
- **API:** `GET /api/yaml-workflows` lists pipeline tools. `POST /api/yaml-workflows/:id/deploy` deploys. `POST /api/yaml-workflows/:id/activate` activates. `POST /api/yaml-workflows/:id/invoke` invokes.
199
+ **API:** `GET /api/yaml-workflows` lists pipeline tools. `POST /api/yaml-workflows/:id/deploy` deploys. `POST /api/yaml-workflows/:id/activate` activates. `POST /api/yaml-workflows/:id/invoke` invokes. Creating, editing, deploying, activating, archiving and scheduling require builder access; listing, reading and invoking are open to any account.
200
200
 
201
201
  ### Graph Executions
202
202
 
@@ -221,7 +221,7 @@ Accessible at `/workflows/executions`. Lists procedural workflow runs from one H
221
221
  - **Escalations** (panel) — every escalation the workflow raised as a row (status dot, type, role, age), each linking to its detail page; related child tasks list below. Empty reads "This workflow has not escalated."
222
222
  - **Actions** menu — Restart (prefills a fresh invoke from the start event), Terminate (running runs only), Compile into Pipeline (runs with tool calls), and jumps to worker / engine stream messages.
223
223
 
224
- **API:** `GET /api/workflow-states/jobs?namespace=durable` lists runs (params `entity` for type, `status`, `search`, `registered` for tier, `sort_by`, `order`, `limit`, `offset`). `GET /api/workflow-states/:workflowId/execution` returns the detail. `POST /api/workflows/:workflowId/terminate` stops a running one.
224
+ **API:** `GET /api/workflow-states/jobs?namespace=durable` lists runs (params `entity` for type, `status`, `search`, `registered` for tier, `sort_by`, `order`, `limit`, `offset`). `GET /api/workflow-states/:workflowId/execution` returns the detail. `POST /api/workflows/:workflowId/terminate` stops a running one. The list and terminate require builder access (superadmin or the `engineer` role); the detail is open to builders and to the person who started the run or the account it runs as.
225
225
 
226
226
  ### Accounts
227
227
 
@@ -326,7 +326,7 @@ A code encodes **`version:category:target`** (e.g. `10:1:SN-12345`):
326
326
 
327
327
  **Rules are ECA over escalations.** A rule is an ordered list of event-condition-action steps, first match wins: the event is the scanned code, the condition is a query against the escalation (role, status, availability, metadata facets), and the action is a canonical verb (`show-detail`, `show-list`, `claim`, `claim-show-detail`, `release`, `resolve`, `escalate`, `cancel`, `present`). Mutations ride single-statement by-metadata operations under the caller's own role scope, and stamp provenance facets (`scanScheme`, `scanCategory`, `scanActionName`, `scannedAt`) on every transition. Ordering is the design: put the expected state first and a broad fallback last, since a scan is also a state query.
328
328
 
329
- **Admin config** lives at `/admin/scan-codes` (scheme list) and `/admin/scan-codes/:version` (a scheme with its rules) — builder-gated (admin, engineer, superadmin). A scheme carries a name, its target facet, encoding, and — for identity schemes — a grant policy.
329
+ **Admin config** lives at `/admin/scan-codes` (scheme list) and `/admin/scan-codes/:version` (a scheme with its rules) — role-manager gated (admin, engineer, superadmin). A scheme carries a name, its target facet, encoding, and — for identity schemes — a grant policy.
330
330
 
331
331
  **Station surface.** `/scan/station` is a full-screen scan surface with an idle prompt, an info/choice screen (the current reality plus labeled choices when a rule presents options), and a badge prompt when identity is required. In **kiosk mode** — a login holding exactly one role whose `properties.kiosk` is set — the chrome falls away and only the role's list, escalation detail, and this scan screen are reachable. The header **scan** panel offers the same manual entry and capture settings on any page.
332
332
 
@@ -485,7 +485,7 @@ This is the primary view for understanding how a multi-step workflow progresses
485
485
 
486
486
  ### Files
487
487
 
488
- Accessible at `/files`. Browse and manage files in the connected storage backend (MinIO locally, S3/GCS in production).
488
+ Accessible at `/files` (builder-only: superadmin or the `engineer` role). Browse and manage files in the connected storage backend (MinIO locally, S3/GCS in production).
489
489
 
490
490
  - **File browser** — navigate directories with breadcrumbs; the list shows name, size, and last-modified. Paginated via a continuation token.
491
491
  - **Preview panel** — click a file to preview it in the side panel: images inline, text and code inline, JSON, and a PDF open-in-tab. Everything else downloads.
@@ -534,6 +534,14 @@ Accessible via the user menu (or at `/credentials`). Manage OAuth provider conne
534
534
 
535
535
  Credentials flow through the system via the `_scope` identity context — workflows inherit the invoking user's credentials for authenticated tool calls.
536
536
 
537
+ ### Connected apps
538
+
539
+ Accessible via the user menu (or at `/connected-apps`) when the OAuth server is enabled. Lists the MCP clients you connected with OAuth, the access each holds (Read-only or As me), when you connected it and when it last refreshed. **Disconnect** ends a client's access at once.
540
+
541
+ ### Consent
542
+
543
+ `/oauth/consent` is where an MCP client's sign-in lands. It shows the app, your account, where the browser returns and the deployment, then offers **Allow read-only**, **Allow as me** (when it grants more than read-only) and **Deny**. Signed-out visitors sign in first and return to it. See [Connect with OAuth](mcp.md#connect-with-oauth).
544
+
537
545
  ## Realtime Refresh Strategy
538
546
 
539
547
  The dashboard is push-driven: broker events (Socket.IO or NATS) invalidate React Query keys and the mounted queries refetch — never polling. Every event-driven refetch flows through one shared scheduler (`dashboard/src/lib/realtime-refresh.ts`), which bounds the rate a surface can hit the API however heavy the event stream runs:
@@ -549,6 +557,7 @@ The dashboard is push-driven: broker events (Socket.IO or NATS) invalidate React
549
557
  - **One scheduler per client**: identical query keys requested by several hooks in a window invalidate once, and a key wanted by two tiers flushes on the snappier lane.
550
558
  - **Hidden tabs cost nothing**: a background tab's flushes mark queries stale without any network (`refetchType: 'none'`); one catch-up refetch runs when the tab becomes visible.
551
559
  - **Mutations stay immediate**: a user's own action (claim, resolve, bulk ops) invalidates directly in its `onSuccess` — the tiers govern only event-driven refresh.
560
+ - **Reconnect catches up**: after a NATS drop the dashboard reconnects with a fresh ticket and jittered backoff, reopens its subscriptions and refetches the open pages. A drop that outlasts `NATS_LIVE_NOTICE_AFTER_MS` shows a "Live updates unavailable" notice in the announcement banner row. See [Events](events.md#dashboard-transport-selection).
552
561
 
553
562
  Every timing constant — the three tiers and the shared `SEARCH_DEBOUNCE_MS` input debounce — lives in `dashboard/src/lib/realtime-refresh.ts`. Tune there; nothing else in the event path carries a number.
554
563
 
package/docs/data.md CHANGED
@@ -297,7 +297,7 @@ Unique constraint: `(workflow_type, role)`.
297
297
 
298
298
  ### lt_config_invocation_roles
299
299
 
300
- Roles allowed to invoke a workflow via the API. When a workflow has `invocable: true` and this table has entries for it, only users holding one of these roles (or superadmins) can invoke.
300
+ Roles allowed to invoke a workflow via the API. When a workflow has `invocable: true` and this table has entries for it, only users holding one of these roles, superadmins, and holders of the `admin` role at admin type can invoke. With no entries, any authenticated user can invoke.
301
301
 
302
302
  | Column | Type | Default | Description |
303
303
  |--------|------|---------|-------------|
@@ -234,30 +234,19 @@ import { escalationStrategyRegistry, McpEscalationStrategy } from '@hotmeshio/lo
234
234
  escalationStrategyRegistry.register(new McpEscalationStrategy());
235
235
  ```
236
236
 
237
- When the MCP strategy is configured, ensure the triage worker is registered:
238
-
239
- ```typescript
240
- import * as mcpTriageWorkflow from '@hotmeshio/long-tail/workflows/mcp-triage';
241
-
242
- await start({
243
- database: { ... },
244
- workers: [
245
- // ... your workflows
246
- { taskQueue: 'lt-mcp-triage', workflow: mcpTriageWorkflow.mcpTriage },
247
- ],
248
- escalation: { strategy: 'mcp' },
249
- });
250
- ```
237
+ The triage workflows (`mcpTriageRouter`, `mcpTriageDeterministic`, `mcpTriage`) register as system workers on the `long-tail-system` task queue when `OPENAI_API_KEY` or `ANTHROPIC_API_KEY` is set.
251
238
 
252
239
  ## Testing
253
240
 
254
- The MCP triage test demonstrates the full flow without requiring an OpenAI API key. It uses mock activities with deterministic extraction:
241
+ The triage integration test runs the full lifecycle against the docker compose stack: it finds the seeded "wrong language" escalation, walks the reviewer, admin, and engineer chain, resolves with `needsTriage`, waits for the triage workflow, and verifies the remediated process and the engineering recommendation. It requires `ANTHROPIC_API_KEY` or `OPENAI_API_KEY` and skips without one.
255
242
 
256
243
  ```bash
257
- # Run the triage test
258
- npx vitest run tests/workflows/mcp-triage.test.ts --reporter=verbose
244
+ docker compose up -d --build
245
+ npx vitest run --config tests/integration/vitest.config.ts tests/integration/mcpTriage.test.ts
259
246
  ```
260
247
 
261
- The test covers:
262
- 1. **Full triage flow** — extraction fails, human flags `needsTriage`, triage workflow rotates pages, re-invoked workflow succeeds, signals back to parent
263
- 2. **Standard fallback** — resolver doesn't set `needsTriage`, standard re-run proceeds as normal
248
+ The same chain runs through the dashboard UI in `tests/functional/mcpTriage.test.ts`:
249
+
250
+ ```bash
251
+ npx playwright test --config tests/functional/playwright.config.ts mcpTriage
252
+ ```
package/docs/events.md CHANGED
@@ -45,6 +45,12 @@ services:
45
45
  - NATS_TOKEN=your-token
46
46
  ```
47
47
 
48
+ **Browser access.** The dashboard only subscribes. With the WebSocket proxy (`wsProxy`, so browsers reach NATS through Long Tail at `<basePath>/nats-ws`), `GET /api/nats-credentials` returns a WebSocket URL carrying a short-lived ticket for the signed-in person (`NATS_WS_TICKET_TTL_SECONDS`, default 300) and no NATS credential. The proxy admits only a ticket holder, writes the server's `NATS_TOKEN` into the connection itself, and drops anything the browser tries to publish. When browsers connect to NATS directly, set `NATS_DASHBOARD_TOKEN` to a subscribe-only NATS credential and the route hands that out instead of `NATS_TOKEN`.
49
+
50
+ **What a browser receives.** Builders (superadmin, or the `engineer` role) receive events whole. Everyone else receives the browser view: escalation events keep their routing fields (`id`, `type`, `subtype`, `status`, `priority`, `role`, `assigned_to`, `assigned_until`, `workflow_id`, `workflow_type`, `origin_id`, `task_id`, `parent_id`, `resolved_at`, `claimed_at`, and the bulk and reassignment fields), and every other event arrives without `data` and `milestones`. Records are read through the scoped API by id, so pages refresh as before; the invoke page reads its own run's result from `GET /api/workflows/:id/result`. The WebSocket proxy applies the view per connection from the ticket's person, and the Socket.IO adapter per socket from the person its authenticator returns (`{ userId }`; an authenticator that returns `true` admits the socket with the browser view). Server-side consumers, such as agent triggers and callbacks, receive events whole.
51
+
52
+ **Reconnecting.** The dashboard fetches a fresh ticket from `GET /api/nats-credentials` for every connection attempt, through the same client as every API call, so an expired session is refreshed first. After a drop the first retry lands at a random point within `NATS_RECONNECT_SPREAD_MS` (default 5000), so tabs that dropped together after a deploy return gradually; later retries back off with jitter from `NATS_RECONNECT_INITIAL_MS` (default 1000) up to `NATS_RECONNECT_MAX_MS` (default 60000), one attempt at a time. It waits while the tab is hidden, and stops only when the person is signed out; a new sign-in starts it again. On reconnect it reopens every active subscription and refetches the open pages once, spread across the same window. When live updates stay down longer than `NATS_LIVE_NOTICE_AFTER_MS` (default 30000), a "Live updates unavailable" notice appears in the announcement banner row. `GET /api/settings` carries these values as `events.reconnect` (`initialDelayMs`, `maxDelayMs`, `noticeAfterMs`, `spreadMs`).
53
+
48
54
  Both adapters still publish events regardless of `EVENT_TRANSPORT` — the setting only controls what the dashboard listens on. This means server-side event consumers (callbacks, NATS subscribers) work independently of the dashboard transport.
49
55
 
50
56
  ## The event envelope
@@ -82,6 +82,8 @@ A portal page fills the content area with one grid row per declared row, each di
82
82
 
83
83
  **Fitting a screen.** A panel on a wall screen is read, not scrolled, so a pin can ask the table to spend its width tightly: `?view=table&layout=compact` keeps the table a table however narrow the panel, tightens every cell, and holds the non-identity columns (assignee, role, priority) back until the panel is wide enough, so a narrow cell reads as a tight list of item and age and twenty rows fit where the folded layout showed four. `layout=cards` asks for the folded console-card layout on purpose. Without `layout`, the table folds on its own below the card threshold. The hint rides the URL like `view`, so it works on the full list page too, and it is the seam for a compact timeline later: a series of tight offset lines that fit the whole story in the panel.
84
84
 
85
+ A rich panel carries the role's whole list schema, so related columns, row expansion, and grouped rows (see [Related sets](x-lt-list-schema.md#related-sets)) read on a wall screen as they do on the list page.
86
+
85
87
  A portal page shows without the left nav, as kiosk does: it is a screen read from across a room, and the panels are the page. The header stays, so the user menu still switches portals. Any signed-in user may open a portal. Panels read through the same role-scoped endpoints as the list page, so RBAC is unchanged: each viewer sees exactly what their read scope returns, and a queue outside it renders empty. Link variables resolve per device at render time, exactly as pins in the nav do. One event subscription per queue named by the cells keeps every panel current, on the LIST refresh tier.
86
88
 
87
89
  ## Choosing a portal