@hotmeshio/long-tail 0.1.4 → 0.1.5

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 (613) hide show
  1. package/README.md +1 -1
  2. package/build/examples/seed.js +1 -1
  3. package/build/examples/workflows/basic-echo/activities.d.ts +2 -2
  4. package/build/examples/workflows/basic-echo/activities.js +7 -7
  5. package/build/examples/workflows/basic-echo/index.js +1 -1
  6. package/build/examples/workflows/kitchen-sink/index.js +2 -2
  7. package/build/index.d.ts +11 -10
  8. package/build/index.js +13 -12
  9. package/build/lib/db/index.d.ts +18 -0
  10. package/build/{services → lib}/db/index.js +9 -0
  11. package/build/{services → lib}/db/migrate.js +3 -3
  12. package/build/{services → lib}/telemetry/honeycomb.d.ts +2 -2
  13. package/build/{services → lib}/telemetry/honeycomb.js +2 -2
  14. package/build/modules/defaults.d.ts +2 -0
  15. package/build/modules/defaults.js +3 -1
  16. package/build/routes/controlplane.js +1 -1
  17. package/build/routes/dba.js +4 -0
  18. package/build/routes/docs.d.ts +2 -0
  19. package/build/routes/docs.js +87 -0
  20. package/build/routes/escalations/bulk.js +120 -202
  21. package/build/routes/escalations/resolve.js +1 -1
  22. package/build/routes/escalations/single.js +1 -1
  23. package/build/routes/files.js +1 -1
  24. package/build/routes/index.js +2 -0
  25. package/build/routes/insight.js +2 -1
  26. package/build/routes/mcp.js +3 -2
  27. package/build/routes/oauth.js +1 -1
  28. package/build/routes/settings.js +4 -4
  29. package/build/routes/workflows/discovery.js +3 -3
  30. package/build/routes/workflows/invocation.js +1 -1
  31. package/build/routes/yaml-workflows/crud.js +1 -1
  32. package/build/routes/yaml-workflows/deployment.js +25 -0
  33. package/build/services/auth/bot-api-key.js +1 -1
  34. package/build/services/auth/index.d.ts +4 -0
  35. package/build/services/auth/index.js +17 -0
  36. package/build/services/auth/service-token.js +1 -1
  37. package/build/services/config/provider.js +1 -1
  38. package/build/services/config/read.js +1 -1
  39. package/build/services/config/write.js +1 -1
  40. package/build/services/controlplane/index.js +3 -4
  41. package/build/services/controlplane/quorum-bridge.js +2 -2
  42. package/build/services/cron/index.js +4 -5
  43. package/build/services/dba.d.ts +4 -0
  44. package/build/services/dba.js +3 -6
  45. package/build/services/escalation/bulk.js +1 -1
  46. package/build/services/escalation/crud.js +1 -1
  47. package/build/services/escalation/queries.js +1 -1
  48. package/build/services/export/client.js +2 -5
  49. package/build/services/export/index.js +14 -2
  50. package/build/services/hotmesh-utils.js +1 -1
  51. package/build/services/iam/bots.js +6 -12
  52. package/build/services/iam/context.d.ts +1 -1
  53. package/build/services/iam/context.js +5 -5
  54. package/build/services/iam/credentials.js +1 -1
  55. package/build/services/iam/ephemeral.js +8 -15
  56. package/build/services/iam/principal.js +3 -10
  57. package/build/services/iam/resolve.js +1 -1
  58. package/build/services/iam/sql.d.ts +10 -0
  59. package/build/services/iam/sql.js +42 -0
  60. package/build/services/insight/index.d.ts +1 -0
  61. package/build/services/insight/index.js +4 -6
  62. package/build/services/interceptor/activities/escalation.js +1 -1
  63. package/build/services/interceptor/activities/task.js +9 -6
  64. package/build/services/interceptor/activities/workflow.js +4 -5
  65. package/build/services/interceptor/activity-interceptor.d.ts +1 -1
  66. package/build/services/interceptor/activity-interceptor.js +5 -5
  67. package/build/services/interceptor/completion.js +1 -1
  68. package/build/services/interceptor/escalation.js +1 -1
  69. package/build/services/interceptor/index.js +4 -4
  70. package/build/services/interceptor/lifecycle.js +1 -1
  71. package/build/services/maintenance/index.js +4 -5
  72. package/build/services/mcp/adapter.js +1 -16
  73. package/build/services/mcp/client/connection.d.ts +1 -1
  74. package/build/services/mcp/client/connection.js +2 -2
  75. package/build/services/mcp/client/tools.js +1 -1
  76. package/build/services/mcp/db-server/index.js +1 -1
  77. package/build/services/mcp/db-server/tools.js +17 -4
  78. package/build/services/mcp/db.js +1 -1
  79. package/build/services/mcp/playwright-server/index.js +1 -1
  80. package/build/services/mcp/playwright-server/lifecycle.js +1 -1
  81. package/build/services/mcp/playwright-server/schemas.d.ts +2 -2
  82. package/build/services/mcp/playwright-server/tools.js +1 -1
  83. package/build/services/mcp/server.js +1 -1
  84. package/build/services/mcp/sql.d.ts +6 -0
  85. package/build/services/mcp/sql.js +34 -1
  86. package/build/services/mcp/workflow-compiler-server.js +1 -1
  87. package/build/services/mcp/workflow-server.js +1 -1
  88. package/build/services/mcp-runs/execution-builder.js +8 -6
  89. package/build/services/mcp-runs/queries.js +2 -2
  90. package/build/services/mcp-runs/sql.d.ts +4 -1
  91. package/build/services/mcp-runs/sql.js +23 -2
  92. package/build/services/namespace/index.js +1 -1
  93. package/build/services/oauth/db.js +9 -37
  94. package/build/services/oauth/index.js +1 -1
  95. package/build/services/oauth/providers/registry.js +1 -1
  96. package/build/services/oauth/sql.d.ts +7 -0
  97. package/build/services/oauth/sql.js +32 -0
  98. package/build/services/orchestrator/index.js +3 -3
  99. package/build/services/role/index.js +1 -1
  100. package/build/services/task/crud.js +1 -1
  101. package/build/services/task/process.js +1 -1
  102. package/build/services/task/resolve.js +1 -1
  103. package/build/services/user/auth.js +1 -1
  104. package/build/services/user/crud.js +1 -1
  105. package/build/services/user/rbac.js +1 -1
  106. package/build/services/user/roles.js +1 -1
  107. package/build/services/user/sql.d.ts +2 -0
  108. package/build/services/user/sql.js +3 -1
  109. package/build/services/yaml-workflow/db-utils.js +1 -1
  110. package/build/services/yaml-workflow/db.js +1 -1
  111. package/build/services/yaml-workflow/deployer-helpers.js +1 -1
  112. package/build/services/yaml-workflow/deployer.js +4 -4
  113. package/build/services/yaml-workflow/generator.js +1 -1
  114. package/build/services/yaml-workflow/input-analyzer-helpers.d.ts +6 -0
  115. package/build/services/yaml-workflow/input-analyzer-helpers.js +36 -7
  116. package/build/services/yaml-workflow/input-analyzer.js +16 -3
  117. package/build/services/yaml-workflow/pipeline/analyze.js +1 -1
  118. package/build/services/yaml-workflow/pipeline/build/dag.js +10 -5
  119. package/build/services/yaml-workflow/pipeline/compile/llm-call.js +1 -1
  120. package/build/services/yaml-workflow/pipeline/extract.js +5 -3
  121. package/build/services/yaml-workflow/pipeline/index.d.ts +5 -0
  122. package/build/services/yaml-workflow/pipeline/index.js +22 -0
  123. package/build/services/yaml-workflow/pipeline/validate.js +2 -2
  124. package/build/services/yaml-workflow/workers/callbacks.js +1 -1
  125. package/build/services/yaml-workflow/workers/events.js +2 -2
  126. package/build/services/yaml-workflow/workers/register.js +8 -8
  127. package/build/start/adapters.js +7 -7
  128. package/build/start/index.js +4 -4
  129. package/build/start/server.js +1 -1
  130. package/build/start/workers.d.ts +1 -2
  131. package/build/start/workers.js +8 -7
  132. package/build/system/activities/claude-code.js +1 -1
  133. package/build/system/activities/file-storage.js +1 -1
  134. package/build/system/activities/knowledge.d.ts +58 -0
  135. package/build/system/activities/knowledge.js +128 -0
  136. package/build/system/activities/sql.d.ts +9 -0
  137. package/build/system/activities/sql.js +41 -0
  138. package/build/system/activities/triage/context.js +1 -1
  139. package/build/system/activities/triage/discovery.d.ts +2 -14
  140. package/build/system/activities/triage/discovery.js +5 -161
  141. package/build/system/activities/triage/llm.d.ts +1 -8
  142. package/build/system/activities/triage/llm.js +2 -28
  143. package/build/system/activities/triage/tools.d.ts +1 -17
  144. package/build/system/activities/triage/tools.js +8 -167
  145. package/build/system/index.js +5 -4
  146. package/build/system/mcp-servers/admin/escalations.d.ts +5 -0
  147. package/build/system/mcp-servers/admin/escalations.js +149 -0
  148. package/build/system/mcp-servers/admin/index.d.ts +31 -0
  149. package/build/system/mcp-servers/admin/index.js +80 -0
  150. package/build/system/mcp-servers/admin/maintenance.d.ts +5 -0
  151. package/build/system/mcp-servers/admin/maintenance.js +58 -0
  152. package/build/system/mcp-servers/admin/mcp-servers.d.ts +5 -0
  153. package/build/system/mcp-servers/admin/mcp-servers.js +146 -0
  154. package/build/system/mcp-servers/admin/schemas.d.ts +411 -0
  155. package/build/system/mcp-servers/admin/schemas.js +177 -0
  156. package/build/system/mcp-servers/admin/tasks.d.ts +5 -0
  157. package/build/system/mcp-servers/admin/tasks.js +112 -0
  158. package/build/system/mcp-servers/admin/users.d.ts +5 -0
  159. package/build/system/mcp-servers/admin/users.js +167 -0
  160. package/build/system/mcp-servers/admin/workflow-config.d.ts +9 -0
  161. package/build/system/mcp-servers/admin/workflow-config.js +118 -0
  162. package/build/system/mcp-servers/admin/workflows.d.ts +6 -0
  163. package/build/system/mcp-servers/admin/workflows.js +138 -0
  164. package/build/system/mcp-servers/admin/yaml-workflows.d.ts +8 -0
  165. package/build/system/mcp-servers/admin/yaml-workflows.js +237 -0
  166. package/build/system/mcp-servers/claude-code.js +1 -1
  167. package/build/system/mcp-servers/db-query/index.js +1 -1
  168. package/build/system/mcp-servers/db-query/tools.js +17 -4
  169. package/build/system/mcp-servers/docs.d.ts +5 -0
  170. package/build/system/mcp-servers/docs.js +147 -0
  171. package/build/system/mcp-servers/file-storage.js +1 -1
  172. package/build/system/mcp-servers/http-fetch.js +1 -1
  173. package/build/system/mcp-servers/human-queue.js +1 -1
  174. package/build/system/mcp-servers/knowledge.d.ts +4 -0
  175. package/build/system/mcp-servers/knowledge.js +137 -0
  176. package/build/system/mcp-servers/oauth.js +1 -1
  177. package/build/system/mcp-servers/playwright/browser-lifecycle.js +1 -1
  178. package/build/system/mcp-servers/playwright/index.js +1 -1
  179. package/build/system/mcp-servers/playwright/schemas.d.ts +19 -8
  180. package/build/system/mcp-servers/playwright/schemas.js +3 -0
  181. package/build/system/mcp-servers/playwright/tools-navigation.js +22 -9
  182. package/build/system/mcp-servers/playwright/tools-run-script.js +20 -3
  183. package/build/system/mcp-servers/playwright/vision-helper.d.ts +12 -0
  184. package/build/system/mcp-servers/playwright/vision-helper.js +81 -0
  185. package/build/system/mcp-servers/playwright-cli/helpers.js +2 -2
  186. package/build/system/mcp-servers/playwright-cli/index.js +1 -1
  187. package/build/system/mcp-servers/playwright-cli/schemas.d.ts +28 -28
  188. package/build/system/mcp-servers/playwright-cli/schemas.js +1 -1
  189. package/build/system/mcp-servers/playwright-cli/tools-auth.js +1 -1
  190. package/build/system/mcp-servers/playwright-cli/tools-capture.js +4 -2
  191. package/build/system/mcp-servers/translation.d.ts +14 -0
  192. package/build/system/mcp-servers/translation.js +130 -0
  193. package/build/system/mcp-servers/vision-prompts.d.ts +2 -0
  194. package/build/system/mcp-servers/vision-prompts.js +9 -0
  195. package/build/system/mcp-servers/{document-vision.d.ts → vision.d.ts} +3 -4
  196. package/build/system/mcp-servers/vision.js +221 -0
  197. package/build/system/mcp-servers/workflow-compiler.js +1 -1
  198. package/build/system/mcp-servers/workflow.js +1 -1
  199. package/build/system/seed/index.js +13 -2
  200. package/build/system/seed/server-definitions.d.ts +1954 -322
  201. package/build/system/seed/server-definitions.js +65 -34
  202. package/build/system/seed/tool-manifests-admin.d.ts +1645 -0
  203. package/build/system/seed/tool-manifests-admin.js +45 -0
  204. package/build/system/seed/tool-manifests-browser.d.ts +1 -1
  205. package/build/system/seed/tool-manifests-browser.js +3 -3
  206. package/build/system/seed/tool-manifests-data.d.ts +62 -21
  207. package/build/system/seed/tool-manifests-data.js +55 -17
  208. package/build/system/seed/tool-manifests-knowledge.d.ts +171 -0
  209. package/build/system/seed/tool-manifests-knowledge.js +94 -0
  210. package/build/system/workflows/mcp-deterministic/index.js +1 -1
  211. package/build/system/workflows/mcp-query/activities/discovery.d.ts +2 -20
  212. package/build/system/workflows/mcp-query/activities/discovery.js +5 -163
  213. package/build/system/workflows/mcp-query/activities/llm.d.ts +1 -7
  214. package/build/system/workflows/mcp-query/activities/llm.js +2 -27
  215. package/build/system/workflows/mcp-query/activities/tool-executor.d.ts +0 -4
  216. package/build/system/workflows/mcp-query/activities/tool-executor.js +2 -106
  217. package/build/system/workflows/mcp-query/activities/tool-loader.d.ts +0 -9
  218. package/build/system/workflows/mcp-query/activities/tool-loader.js +2 -87
  219. package/build/system/workflows/mcp-query/index.js +55 -5
  220. package/build/system/workflows/mcp-query/prompts.d.ts +1 -2
  221. package/build/system/workflows/mcp-query/prompts.js +5 -32
  222. package/build/system/workflows/mcp-query/strategy-advisors.d.ts +3 -14
  223. package/build/system/workflows/mcp-query/strategy-advisors.js +4 -107
  224. package/build/system/workflows/mcp-query/types.d.ts +2 -10
  225. package/build/system/workflows/mcp-query/types.js +0 -1
  226. package/build/system/workflows/mcp-query-router/index.js +1 -1
  227. package/build/system/workflows/mcp-triage/index.d.ts +2 -2
  228. package/build/system/workflows/mcp-triage/index.js +39 -7
  229. package/build/system/workflows/mcp-triage/prompts.js +7 -14
  230. package/build/system/workflows/mcp-triage-deterministic/index.js +1 -1
  231. package/build/system/workflows/mcp-triage-router/index.js +1 -1
  232. package/build/system/workflows/shared/discovery.d.ts +35 -0
  233. package/build/system/workflows/shared/discovery.js +175 -0
  234. package/build/system/workflows/shared/index.d.ts +7 -0
  235. package/build/system/workflows/shared/index.js +18 -0
  236. package/build/system/workflows/shared/llm-caller.d.ts +8 -0
  237. package/build/system/workflows/shared/llm-caller.js +31 -0
  238. package/build/system/workflows/shared/prompts.d.ts +2 -0
  239. package/build/system/workflows/shared/prompts.js +32 -0
  240. package/build/system/workflows/shared/strategy-advisors.d.ts +14 -0
  241. package/build/system/workflows/shared/strategy-advisors.js +109 -0
  242. package/build/system/workflows/shared/tool-executor.d.ts +11 -0
  243. package/build/system/workflows/shared/tool-executor.js +111 -0
  244. package/build/system/workflows/shared/tool-loader.d.ts +19 -0
  245. package/build/system/workflows/shared/tool-loader.js +94 -0
  246. package/build/system/workflows/shared/types.d.ts +9 -0
  247. package/build/system/workflows/shared/types.js +2 -0
  248. package/build/system/workflows/tool-result-guard.d.ts +14 -0
  249. package/build/system/workflows/tool-result-guard.js +78 -0
  250. package/build/tsconfig.tsbuildinfo +1 -1
  251. package/build/types/user.d.ts +2 -0
  252. package/build/vitest.config.d.ts +1 -1
  253. package/build/vitest.integration.config.d.ts +1 -1
  254. package/build/workers/index.js +2 -8
  255. package/dashboard/dist/assets/AdminDashboard-CTyAMUJR.js +2 -0
  256. package/dashboard/dist/assets/AdminDashboard-CTyAMUJR.js.map +1 -0
  257. package/dashboard/dist/assets/AvailableEscalationsPage-BMXV3Q4l.js +2 -0
  258. package/dashboard/dist/assets/AvailableEscalationsPage-BMXV3Q4l.js.map +1 -0
  259. package/dashboard/dist/assets/BotPicker-C51nKFEu.js +2 -0
  260. package/dashboard/dist/assets/{BotPicker-D6FYW1Gt.js.map → BotPicker-C51nKFEu.js.map} +1 -1
  261. package/dashboard/dist/assets/CollapsibleSection-BSyfd8uL.js +2 -0
  262. package/dashboard/dist/assets/{CollapsibleSection-Cxk4wvjT.js.map → CollapsibleSection-BSyfd8uL.js.map} +1 -1
  263. package/dashboard/dist/assets/ConfirmDeleteModal-CBdhia5T.js +2 -0
  264. package/dashboard/dist/assets/{ConfirmDeleteModal-FSXyKjaB.js.map → ConfirmDeleteModal-CBdhia5T.js.map} +1 -1
  265. package/dashboard/dist/assets/CopyableId-dGlewBCS.js +2 -0
  266. package/dashboard/dist/assets/{CopyableId-CBdxWfp8.js.map → CopyableId-dGlewBCS.js.map} +1 -1
  267. package/dashboard/dist/assets/CredentialsPage-CoBNFSAu.js +2 -0
  268. package/dashboard/dist/assets/{CredentialsPage-Ikzsot0w.js.map → CredentialsPage-CoBNFSAu.js.map} +1 -1
  269. package/dashboard/dist/assets/CustomDurationPicker-BataWFj8.js +2 -0
  270. package/dashboard/dist/assets/{CustomDurationPicker-CAninCbl.js.map → CustomDurationPicker-BataWFj8.js.map} +1 -1
  271. package/dashboard/dist/assets/DataTable-B3uf5CCo.js +2 -0
  272. package/dashboard/dist/assets/DataTable-B3uf5CCo.js.map +1 -0
  273. package/dashboard/dist/assets/ElapsedCell-G5oSwTpT.js +2 -0
  274. package/dashboard/dist/assets/ElapsedCell-G5oSwTpT.js.map +1 -0
  275. package/dashboard/dist/assets/EmptyState-BChBJNGS.js +2 -0
  276. package/dashboard/dist/assets/{EmptyState-2CmV-IaS.js.map → EmptyState-BChBJNGS.js.map} +1 -1
  277. package/dashboard/dist/assets/EscalationsOverview-CxUv8xjG.js +2 -0
  278. package/dashboard/dist/assets/{EscalationsOverview-GXYFPASS.js.map → EscalationsOverview-CxUv8xjG.js.map} +1 -1
  279. package/dashboard/dist/assets/EventTable-CVt8B0BZ.js +2 -0
  280. package/dashboard/dist/assets/{EventTable-B01oJf6Y.js.map → EventTable-CVt8B0BZ.js.map} +1 -1
  281. package/dashboard/dist/assets/FilterBar-CShf0oe7.js +2 -0
  282. package/dashboard/dist/assets/{FilterBar-Ck4K4rzu.js.map → FilterBar-CShf0oe7.js.map} +1 -1
  283. package/dashboard/dist/assets/McpOverview-CbaZRnJl.js +2 -0
  284. package/dashboard/dist/assets/{McpOverview-JkvRcX2e.js.map → McpOverview-CbaZRnJl.js.map} +1 -1
  285. package/dashboard/dist/assets/McpQueryDetailPage-CGoR9XK6.js +5 -0
  286. package/dashboard/dist/assets/McpQueryDetailPage-CGoR9XK6.js.map +1 -0
  287. package/dashboard/dist/assets/McpQueryPage-BjXoYQuU.js +2 -0
  288. package/dashboard/dist/assets/McpQueryPage-BjXoYQuU.js.map +1 -0
  289. package/dashboard/dist/assets/McpRunDetailPage-DLkA5Aar.js +2 -0
  290. package/dashboard/dist/assets/McpRunDetailPage-DLkA5Aar.js.map +1 -0
  291. package/dashboard/dist/assets/McpRunsPage-DCh9n11D.js +2 -0
  292. package/dashboard/dist/assets/McpRunsPage-DCh9n11D.js.map +1 -0
  293. package/dashboard/dist/assets/Modal-CI5RBPOQ.js +2 -0
  294. package/dashboard/dist/assets/{Modal-B4rbIVAn.js.map → Modal-CI5RBPOQ.js.map} +1 -1
  295. package/dashboard/dist/assets/OperatorDashboard-Dc80suXd.js +2 -0
  296. package/dashboard/dist/assets/OperatorDashboard-Dc80suXd.js.map +1 -0
  297. package/dashboard/dist/assets/PageHeader-SMD9qtOO.js +2 -0
  298. package/dashboard/dist/assets/PageHeader-SMD9qtOO.js.map +1 -0
  299. package/dashboard/dist/assets/PageHeaderWithStats-TikLQsTp.js +2 -0
  300. package/dashboard/dist/assets/PageHeaderWithStats-TikLQsTp.js.map +1 -0
  301. package/dashboard/dist/assets/PriorityBadge-CQ0EsLTA.js +2 -0
  302. package/dashboard/dist/assets/{PriorityBadge-DfQY9St9.js.map → PriorityBadge-CQ0EsLTA.js.map} +1 -1
  303. package/dashboard/dist/assets/ProcessDetailPage-B2GKuGzk.js +2 -0
  304. package/dashboard/dist/assets/ProcessDetailPage-B2GKuGzk.js.map +1 -0
  305. package/dashboard/dist/assets/ProcessesListPage-CTjI3Wn6.js +2 -0
  306. package/dashboard/dist/assets/ProcessesListPage-CTjI3Wn6.js.map +1 -0
  307. package/dashboard/dist/assets/RefreshButton-BcQDObrv.js +2 -0
  308. package/dashboard/dist/assets/RefreshButton-BcQDObrv.js.map +1 -0
  309. package/dashboard/dist/assets/RolePill-Crj4TH5p.js +2 -0
  310. package/dashboard/dist/assets/{RolePill-BTPa8L-P.js.map → RolePill-Crj4TH5p.js.map} +1 -1
  311. package/dashboard/dist/assets/RolesPage-C_RInUwS.js +2 -0
  312. package/dashboard/dist/assets/RolesPage-C_RInUwS.js.map +1 -0
  313. package/dashboard/dist/assets/RowActions-Cp5HyK_w.js +2 -0
  314. package/dashboard/dist/assets/{RowActions-Dg-Fsm5O.js.map → RowActions-Cp5HyK_w.js.map} +1 -1
  315. package/dashboard/dist/assets/RunAsSelector-BhyWtofX.js +2 -0
  316. package/dashboard/dist/assets/RunAsSelector-BhyWtofX.js.map +1 -0
  317. package/dashboard/dist/assets/StatCard-BKZLSgNV.js +2 -0
  318. package/dashboard/dist/assets/{StatCard-DlgF0CJC.js.map → StatCard-BKZLSgNV.js.map} +1 -1
  319. package/dashboard/dist/assets/StatusBadge-BYNGGZK5.js +2 -0
  320. package/dashboard/dist/assets/StatusBadge-BYNGGZK5.js.map +1 -0
  321. package/dashboard/dist/assets/StickyPagination-CTosgiU2.js +2 -0
  322. package/dashboard/dist/assets/{StickyPagination-F9FZsRy9.js.map → StickyPagination-CTosgiU2.js.map} +1 -1
  323. package/dashboard/dist/assets/SwimlaneTimeline-ylG5Ps1s.js +2 -0
  324. package/dashboard/dist/assets/SwimlaneTimeline-ylG5Ps1s.js.map +1 -0
  325. package/dashboard/dist/assets/TaskDetailPage-C9pDGdD2.js +2 -0
  326. package/dashboard/dist/assets/TaskDetailPage-C9pDGdD2.js.map +1 -0
  327. package/dashboard/dist/assets/TaskQueuePill-BtJbZTT0.js +2 -0
  328. package/dashboard/dist/assets/{TaskQueuePill-awmtb0qw.js.map → TaskQueuePill-BtJbZTT0.js.map} +1 -1
  329. package/dashboard/dist/assets/TasksListPage-DtFLUEhg.js +2 -0
  330. package/dashboard/dist/assets/{TasksListPage-C_QF23c1.js.map → TasksListPage-DtFLUEhg.js.map} +1 -1
  331. package/dashboard/dist/assets/TimeAgo-WuM6xImZ.js +2 -0
  332. package/dashboard/dist/assets/TimeAgo-WuM6xImZ.js.map +1 -0
  333. package/dashboard/dist/assets/TimestampCell-IVL_-Upy.js +2 -0
  334. package/dashboard/dist/assets/TimestampCell-IVL_-Upy.js.map +1 -0
  335. package/dashboard/dist/assets/UserName-DU9qeg13.js +2 -0
  336. package/dashboard/dist/assets/{UserName-DaP4YAKr.js.map → UserName-DU9qeg13.js.map} +1 -1
  337. package/dashboard/dist/assets/WorkflowExecutionPage-DOocX81f.js +2 -0
  338. package/dashboard/dist/assets/WorkflowExecutionPage-DOocX81f.js.map +1 -0
  339. package/dashboard/dist/assets/WorkflowPill-Diw8iWBP.js +2 -0
  340. package/dashboard/dist/assets/WorkflowPill-Diw8iWBP.js.map +1 -0
  341. package/dashboard/dist/assets/WorkflowsDashboard-DDtUIrTy.js +2 -0
  342. package/dashboard/dist/assets/WorkflowsDashboard-DDtUIrTy.js.map +1 -0
  343. package/dashboard/dist/assets/WorkflowsOverview-CPuvA4t3.js +2 -0
  344. package/dashboard/dist/assets/{WorkflowsOverview-D9OzzQqw.js.map → WorkflowsOverview-CPuvA4t3.js.map} +1 -1
  345. package/dashboard/dist/assets/YamlWorkflowsPage-DlwwkluN.js +2 -0
  346. package/dashboard/dist/assets/YamlWorkflowsPage-DlwwkluN.js.map +1 -0
  347. package/dashboard/dist/assets/{bots-BkKVMbUW.js → bots-BPiZXf2h.js} +2 -2
  348. package/dashboard/dist/assets/{bots-BkKVMbUW.js.map → bots-BPiZXf2h.js.map} +1 -1
  349. package/dashboard/dist/assets/constants-BHkpVaqx.js +2 -0
  350. package/dashboard/dist/assets/constants-BHkpVaqx.js.map +1 -0
  351. package/dashboard/dist/assets/escalation-DTY_OKRh.js +2 -0
  352. package/dashboard/dist/assets/escalation-DTY_OKRh.js.map +1 -0
  353. package/dashboard/dist/assets/escalation-columns-C91fHSkp.js +2 -0
  354. package/dashboard/dist/assets/{escalation-columns-D6aqStaY.js.map → escalation-columns-C91fHSkp.js.map} +1 -1
  355. package/dashboard/dist/assets/helpers-DBUZ9pnG.js +2 -0
  356. package/dashboard/dist/assets/helpers-DBUZ9pnG.js.map +1 -0
  357. package/dashboard/dist/assets/index-BOeA-gfK.js +17 -0
  358. package/dashboard/dist/assets/{index-X85K5bHC.js.map → index-BOeA-gfK.js.map} +1 -1
  359. package/dashboard/dist/assets/index-BZ6K_kmL.js +3 -0
  360. package/dashboard/dist/assets/index-BZ6K_kmL.js.map +1 -0
  361. package/dashboard/dist/assets/index-Bpm0yeoi.js +2 -0
  362. package/dashboard/dist/assets/index-Bpm0yeoi.js.map +1 -0
  363. package/dashboard/dist/assets/index-BtOwLI0K.js +2 -0
  364. package/dashboard/dist/assets/{index-DTPzZr_X.js.map → index-BtOwLI0K.js.map} +1 -1
  365. package/dashboard/dist/assets/index-CBF3ZvRZ.js +6 -0
  366. package/dashboard/dist/assets/index-CBF3ZvRZ.js.map +1 -0
  367. package/dashboard/dist/assets/index-CDWOfCmi.js +2 -0
  368. package/dashboard/dist/assets/index-CDWOfCmi.js.map +1 -0
  369. package/dashboard/dist/assets/index-Ce6sL__n.js +2 -0
  370. package/dashboard/dist/assets/index-Ce6sL__n.js.map +1 -0
  371. package/dashboard/dist/assets/index-DSzSoku1.js +283 -0
  372. package/dashboard/dist/assets/index-DSzSoku1.js.map +1 -0
  373. package/dashboard/dist/assets/index-D_qEAYrg.js +2 -0
  374. package/dashboard/dist/assets/index-D_qEAYrg.js.map +1 -0
  375. package/dashboard/dist/assets/index-gCy9XX3W.css +1 -0
  376. package/dashboard/dist/assets/mcp-BzVpaaKF.js +2 -0
  377. package/dashboard/dist/assets/{mcp-blCW6IL7.js.map → mcp-BzVpaaKF.js.map} +1 -1
  378. package/dashboard/dist/assets/mcp-query-wTuxTTCV.js +2 -0
  379. package/dashboard/dist/assets/mcp-query-wTuxTTCV.js.map +1 -0
  380. package/dashboard/dist/assets/{mcp-runs-ChPbpvXK.js → mcp-runs-DmXYJD19.js} +2 -2
  381. package/dashboard/dist/assets/{mcp-runs-ChPbpvXK.js.map → mcp-runs-DmXYJD19.js.map} +1 -1
  382. package/dashboard/dist/assets/namespaces-DoGa7jc7.js +2 -0
  383. package/dashboard/dist/assets/{namespaces-BgbaC3ow.js.map → namespaces-DoGa7jc7.js.map} +1 -1
  384. package/dashboard/dist/assets/{roles-ZNrqqnQl.js → roles-wCdQ2Z7k.js} +2 -2
  385. package/dashboard/dist/assets/{roles-ZNrqqnQl.js.map → roles-wCdQ2Z7k.js.map} +1 -1
  386. package/dashboard/dist/assets/settings-DDe_L7JT.js +2 -0
  387. package/dashboard/dist/assets/{settings-eBRSE0mQ.js.map → settings-DDe_L7JT.js.map} +1 -1
  388. package/dashboard/dist/assets/tasks-3Hih8Bt7.js +2 -0
  389. package/dashboard/dist/assets/{tasks-tRqClPns.js.map → tasks-3Hih8Bt7.js.map} +1 -1
  390. package/dashboard/dist/assets/{useFilterParams-BaXUAkYK.js → useFilterParams-BUyLHcx_.js} +2 -2
  391. package/dashboard/dist/assets/{useFilterParams-BaXUAkYK.js.map → useFilterParams-BUyLHcx_.js.map} +1 -1
  392. package/dashboard/dist/assets/{useNatsEvents-Xr43X1fG.js → useNatsEvents-DeGKHFTX.js} +2 -2
  393. package/dashboard/dist/assets/{useNatsEvents-Xr43X1fG.js.map → useNatsEvents-DeGKHFTX.js.map} +1 -1
  394. package/dashboard/dist/assets/{useYamlActivityEvents-BO51u8tm.js → useYamlActivityEvents-B5dHec6Y.js} +2 -2
  395. package/dashboard/dist/assets/{useYamlActivityEvents-BO51u8tm.js.map → useYamlActivityEvents-B5dHec6Y.js.map} +1 -1
  396. package/dashboard/dist/assets/{users-tMvNyOo8.js → users-BTagPmGW.js} +2 -2
  397. package/dashboard/dist/assets/{users-tMvNyOo8.js.map → users-BTagPmGW.js.map} +1 -1
  398. package/dashboard/dist/assets/{vendor-icons-ZTAKVwGc.js → vendor-icons-DCLlGYO9.js} +112 -57
  399. package/dashboard/dist/assets/vendor-icons-DCLlGYO9.js.map +1 -0
  400. package/dashboard/dist/assets/vendor-query-DLp59M9_.js +35 -0
  401. package/dashboard/dist/assets/vendor-query-DLp59M9_.js.map +1 -0
  402. package/dashboard/dist/assets/vendor-react-Co3Y8ikm.js +26 -0
  403. package/dashboard/dist/assets/vendor-react-Co3Y8ikm.js.map +1 -0
  404. package/dashboard/dist/assets/{workflows-Cc4VHcrp.js → workflows-B20dR3NE.js} +2 -2
  405. package/dashboard/dist/assets/{workflows-Cc4VHcrp.js.map → workflows-B20dR3NE.js.map} +1 -1
  406. package/dashboard/dist/assets/yaml-workflows-CaLPMQha.js +2 -0
  407. package/dashboard/dist/assets/yaml-workflows-CaLPMQha.js.map +1 -0
  408. package/dashboard/dist/index.html +5 -5
  409. package/docs/api/dba.md +81 -0
  410. package/docs/api/escalations.md +575 -0
  411. package/docs/api/exports.md +170 -0
  412. package/docs/api/maintenance.md +93 -0
  413. package/docs/api/mcp-runs.md +128 -0
  414. package/docs/api/mcp-servers.md +195 -0
  415. package/docs/api/namespaces.md +48 -0
  416. package/docs/api/roles.md +390 -0
  417. package/docs/api/service-accounts.md +188 -0
  418. package/docs/api/settings.md +33 -0
  419. package/docs/api/tasks.md +167 -0
  420. package/docs/api/users.md +180 -0
  421. package/docs/api/workflows.md +616 -0
  422. package/docs/api/yaml-workflows.md +312 -0
  423. package/docs/architecture.md +221 -0
  424. package/docs/auth.md +181 -0
  425. package/docs/cloud.md +272 -0
  426. package/docs/compilation.md +136 -0
  427. package/docs/contributing.md +56 -0
  428. package/docs/dashboard.md +145 -0
  429. package/docs/data.md +478 -0
  430. package/docs/escalation-strategies.md +264 -0
  431. package/docs/events.md +251 -0
  432. package/docs/iam.md +222 -0
  433. package/docs/img/01-login.png +0 -0
  434. package/docs/img/02-dashboard-home.png +0 -0
  435. package/docs/img/03-processes-list.png +0 -0
  436. package/docs/img/04-escalations-list.png +0 -0
  437. package/docs/img/05-mcp-servers.png +0 -0
  438. package/docs/img/06-mcp-pipelines.png +0 -0
  439. package/docs/img/07-workflows-list.png +0 -0
  440. package/docs/img/compilation/01-query-submit.png +0 -0
  441. package/docs/img/compilation/02-mcp-servers.png +0 -0
  442. package/docs/img/compilation/03-query-completed.png +0 -0
  443. package/docs/img/compilation/04-wizard-original.png +0 -0
  444. package/docs/img/compilation/05-wizard-timeline.png +0 -0
  445. package/docs/img/compilation/06-wizard-profile.png +0 -0
  446. package/docs/img/compilation/07-wizard-deploy.png +0 -0
  447. package/docs/img/compilation/08-wizard-test-modal.png +0 -0
  448. package/docs/img/compilation/09-wizard-test-compare.png +0 -0
  449. package/docs/img/compilation/10-wizard-verify.png +0 -0
  450. package/docs/logging.md +110 -0
  451. package/docs/maintenance.md +221 -0
  452. package/docs/mcp.md +715 -0
  453. package/docs/oauth-and-delegation.md +469 -0
  454. package/docs/telemetry.md +144 -0
  455. package/docs/workflows.md +695 -0
  456. package/lib/db/schemas/015_knowledge.sql +23 -0
  457. package/package.json +8 -9
  458. package/build/services/db/index.d.ts +0 -3
  459. package/build/services/mcp/vision-server.d.ts +0 -15
  460. package/build/services/mcp/vision-server.js +0 -214
  461. package/build/system/mcp-servers/document-vision.js +0 -228
  462. package/build/system/mcp-servers/prompts.d.ts +0 -4
  463. package/build/system/mcp-servers/prompts.js +0 -10
  464. package/dashboard/dist/assets/AdminDashboard-jfacvOC7.js +0 -2
  465. package/dashboard/dist/assets/AdminDashboard-jfacvOC7.js.map +0 -1
  466. package/dashboard/dist/assets/AvailableEscalationsPage-BglLDoT8.js +0 -2
  467. package/dashboard/dist/assets/AvailableEscalationsPage-BglLDoT8.js.map +0 -1
  468. package/dashboard/dist/assets/BotPicker-D6FYW1Gt.js +0 -2
  469. package/dashboard/dist/assets/CollapsibleSection-Cxk4wvjT.js +0 -2
  470. package/dashboard/dist/assets/ConfirmDeleteModal-FSXyKjaB.js +0 -2
  471. package/dashboard/dist/assets/CopyableId-CBdxWfp8.js +0 -2
  472. package/dashboard/dist/assets/CredentialsPage-Ikzsot0w.js +0 -2
  473. package/dashboard/dist/assets/CustomDurationPicker-CAninCbl.js +0 -2
  474. package/dashboard/dist/assets/DataTable-BDn1WBHS.js +0 -2
  475. package/dashboard/dist/assets/DataTable-BDn1WBHS.js.map +0 -1
  476. package/dashboard/dist/assets/EmptyState-2CmV-IaS.js +0 -2
  477. package/dashboard/dist/assets/EscalationsOverview-GXYFPASS.js +0 -2
  478. package/dashboard/dist/assets/EventTable-B01oJf6Y.js +0 -2
  479. package/dashboard/dist/assets/Field-DuFBAYhu.js +0 -2
  480. package/dashboard/dist/assets/Field-DuFBAYhu.js.map +0 -1
  481. package/dashboard/dist/assets/FilterBar-Ck4K4rzu.js +0 -2
  482. package/dashboard/dist/assets/McpOverview-JkvRcX2e.js +0 -2
  483. package/dashboard/dist/assets/McpQueryDetailPage-CUMqhQdS.js +0 -2
  484. package/dashboard/dist/assets/McpQueryDetailPage-CUMqhQdS.js.map +0 -1
  485. package/dashboard/dist/assets/McpQueryPage-DRRhw4nN.js +0 -2
  486. package/dashboard/dist/assets/McpQueryPage-DRRhw4nN.js.map +0 -1
  487. package/dashboard/dist/assets/McpRunDetailPage-CmPs5EvE.js +0 -2
  488. package/dashboard/dist/assets/McpRunDetailPage-CmPs5EvE.js.map +0 -1
  489. package/dashboard/dist/assets/McpRunsPage-Dl5Y2u6k.js +0 -2
  490. package/dashboard/dist/assets/McpRunsPage-Dl5Y2u6k.js.map +0 -1
  491. package/dashboard/dist/assets/Modal-B4rbIVAn.js +0 -2
  492. package/dashboard/dist/assets/OperatorDashboard-B56il28q.js +0 -2
  493. package/dashboard/dist/assets/OperatorDashboard-B56il28q.js.map +0 -1
  494. package/dashboard/dist/assets/PageHeader-CpWFly5S.js +0 -2
  495. package/dashboard/dist/assets/PageHeader-CpWFly5S.js.map +0 -1
  496. package/dashboard/dist/assets/PriorityBadge-DfQY9St9.js +0 -2
  497. package/dashboard/dist/assets/ProcessDetailPage-CMLq4M7D.js +0 -2
  498. package/dashboard/dist/assets/ProcessDetailPage-CMLq4M7D.js.map +0 -1
  499. package/dashboard/dist/assets/ProcessesListPage-CZ_HF06v.js +0 -2
  500. package/dashboard/dist/assets/ProcessesListPage-CZ_HF06v.js.map +0 -1
  501. package/dashboard/dist/assets/RolePill-BTPa8L-P.js +0 -2
  502. package/dashboard/dist/assets/RolesPage-9grZW7yR.js +0 -2
  503. package/dashboard/dist/assets/RolesPage-9grZW7yR.js.map +0 -1
  504. package/dashboard/dist/assets/RowActions-Dg-Fsm5O.js +0 -2
  505. package/dashboard/dist/assets/SimpleMarkdown-CBlvaWP4.js +0 -4
  506. package/dashboard/dist/assets/SimpleMarkdown-CBlvaWP4.js.map +0 -1
  507. package/dashboard/dist/assets/StatCard-DlgF0CJC.js +0 -2
  508. package/dashboard/dist/assets/StatusBadge-TlC4jiig.js +0 -2
  509. package/dashboard/dist/assets/StatusBadge-TlC4jiig.js.map +0 -1
  510. package/dashboard/dist/assets/StickyPagination-F9FZsRy9.js +0 -2
  511. package/dashboard/dist/assets/SwimlaneTimeline-7SiwATsZ.js +0 -2
  512. package/dashboard/dist/assets/SwimlaneTimeline-7SiwATsZ.js.map +0 -1
  513. package/dashboard/dist/assets/TaskDetailPage-CbPVTakt.js +0 -2
  514. package/dashboard/dist/assets/TaskDetailPage-CbPVTakt.js.map +0 -1
  515. package/dashboard/dist/assets/TaskQueuePill-awmtb0qw.js +0 -2
  516. package/dashboard/dist/assets/TasksListPage-C_QF23c1.js +0 -2
  517. package/dashboard/dist/assets/TimeAgo-UPG6DoH8.js +0 -2
  518. package/dashboard/dist/assets/TimeAgo-UPG6DoH8.js.map +0 -1
  519. package/dashboard/dist/assets/TimestampCell-DoWMKg6w.js +0 -2
  520. package/dashboard/dist/assets/TimestampCell-DoWMKg6w.js.map +0 -1
  521. package/dashboard/dist/assets/UserName-DaP4YAKr.js +0 -2
  522. package/dashboard/dist/assets/VersionHistory-Bt7WBr6m.js +0 -5
  523. package/dashboard/dist/assets/VersionHistory-Bt7WBr6m.js.map +0 -1
  524. package/dashboard/dist/assets/WorkflowExecutionPage-DjtAQ3hy.js +0 -2
  525. package/dashboard/dist/assets/WorkflowExecutionPage-DjtAQ3hy.js.map +0 -1
  526. package/dashboard/dist/assets/WorkflowPill-CCDSVaQj.js +0 -2
  527. package/dashboard/dist/assets/WorkflowPill-CCDSVaQj.js.map +0 -1
  528. package/dashboard/dist/assets/WorkflowsDashboard-D8z9uBNB.js +0 -2
  529. package/dashboard/dist/assets/WorkflowsDashboard-D8z9uBNB.js.map +0 -1
  530. package/dashboard/dist/assets/WorkflowsOverview-D9OzzQqw.js +0 -2
  531. package/dashboard/dist/assets/YamlWorkflowDetailPage-DrDvvP62.js +0 -3
  532. package/dashboard/dist/assets/YamlWorkflowDetailPage-DrDvvP62.js.map +0 -1
  533. package/dashboard/dist/assets/YamlWorkflowsPage-COqiNCQK.js +0 -2
  534. package/dashboard/dist/assets/YamlWorkflowsPage-COqiNCQK.js.map +0 -1
  535. package/dashboard/dist/assets/constants-CgaZfe5d.js +0 -2
  536. package/dashboard/dist/assets/constants-CgaZfe5d.js.map +0 -1
  537. package/dashboard/dist/assets/escalation-columns-D6aqStaY.js +0 -2
  538. package/dashboard/dist/assets/escalation-qalymbKB.js +0 -2
  539. package/dashboard/dist/assets/escalation-qalymbKB.js.map +0 -1
  540. package/dashboard/dist/assets/format-gXZXQ-HJ.js +0 -2
  541. package/dashboard/dist/assets/format-gXZXQ-HJ.js.map +0 -1
  542. package/dashboard/dist/assets/helpers-0gSleuzT.js +0 -2
  543. package/dashboard/dist/assets/helpers-0gSleuzT.js.map +0 -1
  544. package/dashboard/dist/assets/index-BWvMHed7.js +0 -6
  545. package/dashboard/dist/assets/index-BWvMHed7.js.map +0 -1
  546. package/dashboard/dist/assets/index-BaszoPO_.css +0 -1
  547. package/dashboard/dist/assets/index-Cn2jyj9A.js +0 -2
  548. package/dashboard/dist/assets/index-Cn2jyj9A.js.map +0 -1
  549. package/dashboard/dist/assets/index-D8VH6K8B.js +0 -54
  550. package/dashboard/dist/assets/index-D8VH6K8B.js.map +0 -1
  551. package/dashboard/dist/assets/index-D9SYwJsi.js +0 -3
  552. package/dashboard/dist/assets/index-D9SYwJsi.js.map +0 -1
  553. package/dashboard/dist/assets/index-DTPzZr_X.js +0 -2
  554. package/dashboard/dist/assets/index-D_6AB5BE.js +0 -2
  555. package/dashboard/dist/assets/index-D_6AB5BE.js.map +0 -1
  556. package/dashboard/dist/assets/index-S9Ks2Lj2.js +0 -2
  557. package/dashboard/dist/assets/index-S9Ks2Lj2.js.map +0 -1
  558. package/dashboard/dist/assets/index-X85K5bHC.js +0 -17
  559. package/dashboard/dist/assets/index-rjmgHlSH.js +0 -2
  560. package/dashboard/dist/assets/index-rjmgHlSH.js.map +0 -1
  561. package/dashboard/dist/assets/mcp-blCW6IL7.js +0 -2
  562. package/dashboard/dist/assets/mcp-query-DoAyPbjC.js +0 -2
  563. package/dashboard/dist/assets/mcp-query-DoAyPbjC.js.map +0 -1
  564. package/dashboard/dist/assets/namespaces-BgbaC3ow.js +0 -2
  565. package/dashboard/dist/assets/settings-eBRSE0mQ.js +0 -2
  566. package/dashboard/dist/assets/tasks-tRqClPns.js +0 -2
  567. package/dashboard/dist/assets/vendor-icons-ZTAKVwGc.js.map +0 -1
  568. package/dashboard/dist/assets/vendor-query-B2UbickB.js +0 -18
  569. package/dashboard/dist/assets/vendor-query-B2UbickB.js.map +0 -1
  570. package/dashboard/dist/assets/vendor-react-Cw8Gy8NJ.js +0 -22
  571. package/dashboard/dist/assets/vendor-react-Cw8Gy8NJ.js.map +0 -1
  572. package/dashboard/dist/assets/yaml-workflows-BL4V5CQy.js +0 -2
  573. package/dashboard/dist/assets/yaml-workflows-BL4V5CQy.js.map +0 -1
  574. /package/build/{services → lib}/db/migrate.d.ts +0 -0
  575. /package/build/{services → lib}/events/index.d.ts +0 -0
  576. /package/build/{services → lib}/events/index.js +0 -0
  577. /package/build/{services → lib}/events/memory.d.ts +0 -0
  578. /package/build/{services → lib}/events/memory.js +0 -0
  579. /package/build/{services → lib}/events/nats.d.ts +0 -0
  580. /package/build/{services → lib}/events/nats.js +0 -0
  581. /package/build/{services → lib}/events/publish.d.ts +0 -0
  582. /package/build/{services → lib}/events/publish.js +0 -0
  583. /package/build/{services → lib}/events/socketio.d.ts +0 -0
  584. /package/build/{services → lib}/events/socketio.js +0 -0
  585. /package/build/{services → lib}/logger/index.d.ts +0 -0
  586. /package/build/{services → lib}/logger/index.js +0 -0
  587. /package/build/{services → lib}/logger/pino.d.ts +0 -0
  588. /package/build/{services → lib}/logger/pino.js +0 -0
  589. /package/build/{services → lib}/storage/index.d.ts +0 -0
  590. /package/build/{services → lib}/storage/index.js +0 -0
  591. /package/build/{services → lib}/storage/local.d.ts +0 -0
  592. /package/build/{services → lib}/storage/local.js +0 -0
  593. /package/build/{services → lib}/storage/s3.d.ts +0 -0
  594. /package/build/{services → lib}/storage/s3.js +0 -0
  595. /package/build/{services → lib}/storage/types.d.ts +0 -0
  596. /package/build/{services → lib}/storage/types.js +0 -0
  597. /package/build/{services → lib}/telemetry/index.d.ts +0 -0
  598. /package/build/{services → lib}/telemetry/index.js +0 -0
  599. /package/{services → lib}/db/README.md +0 -0
  600. /package/{services → lib}/db/schemas/001_schema.sql +0 -0
  601. /package/{services → lib}/db/schemas/002_seed.sql +0 -0
  602. /package/{services → lib}/db/schemas/003_workflow_discovery.sql +0 -0
  603. /package/{services → lib}/db/schemas/004_query_router.sql +0 -0
  604. /package/{services → lib}/db/schemas/005_triage_router.sql +0 -0
  605. /package/{services → lib}/db/schemas/006_oauth.sql +0 -0
  606. /package/{services → lib}/db/schemas/007_security.sql +0 -0
  607. /package/{services → lib}/db/schemas/008_bot_accounts.sql +0 -0
  608. /package/{services → lib}/db/schemas/009_audit_trail.sql +0 -0
  609. /package/{services → lib}/db/schemas/010_credential_providers.sql +0 -0
  610. /package/{services → lib}/db/schemas/011_system_workflow_configs.sql +0 -0
  611. /package/{services → lib}/db/schemas/012_drop_modality.sql +0 -0
  612. /package/{services → lib}/db/schemas/013_execute_as.sql +0 -0
  613. /package/{services → lib}/db/schemas/014_ephemeral_credentials.sql +0 -0
package/docs/mcp.md ADDED
@@ -0,0 +1,715 @@
1
+ # MCP Guide
2
+
3
+ Your agents speak MCP. Long Tail makes their tool calls durable and exposes human escalation as an MCP server — the same protocol your agent uses to call any other tool. Both sides of a workflow — AI processing and human review — communicate through MCP.
4
+
5
+ ## Contents
6
+
7
+ - [The Unifying Concept](#the-unifying-concept) — [Every Activity is a Tool](#every-activity-is-a-tool) · [Humans as Tools](#humans-as-tools) · [Compiled Workflows as Tools](#compiled-workflows-as-tools) · [The Cycle](#the-cycle)
8
+ - [Human Queue Server](#human-queue-server) — escalation as MCP tools
9
+ - [Document Vision Server](#document-vision-server) — AI tools as 3 MCP tools
10
+ - [MCP-Native Workflow](#mcp-native-workflow) — both sides MCP, end to end
11
+ - [External MCP Servers](#external-mcp-servers) — any server's tools as durable activities
12
+ - [Built-in Servers](#built-in-servers) — servers that ship by default
13
+ - [Configuration](#configuration)
14
+ - [REST API](#rest-api) — server registration and management
15
+ - [Database Schema](#database-schema)
16
+ - [Testing](#testing) — InMemoryTransport and functional tests
17
+ - [Custom Adapters](#custom-adapters)
18
+
19
+ ## The Unifying Concept
20
+
21
+ Everything is a tool. Every proxy activity — the functions that workflows call — is an MCP tool. Every collection of related tools is an MCP server. When an engineer writes a workflow, they're composing tool calls. When the triage agent fixes an edge case, it's calling the same tools. When that fix gets compiled into a deterministic pipeline, it becomes a new tool on a new server.
22
+
23
+ The protocol is the same whether the caller is deterministic code, an LLM, or a human clicking a button.
24
+
25
+ ### Every Activity is a Tool
26
+
27
+ A proxy activity is a function that runs outside the deterministic sandbox — it makes an API call, queries a database, calls an LLM. HotMesh checkpoints the result. If the process crashes, it replays from cache. The activity isn't called twice.
28
+
29
+ Every one of these activities is also an MCP tool. Register an MCP server and its tools become proxy activities automatically:
30
+
31
+ ```typescript
32
+ import { Durable } from '@hotmeshio/hotmesh';
33
+ import { McpClient } from '@hotmeshio/long-tail';
34
+
35
+ const tools = await McpClient.toolActivities(serverId);
36
+ const { mcp_analyzer_classify } = Durable.workflow.proxyActivities<typeof tools>({
37
+ activities: tools,
38
+ });
39
+
40
+ export async function classifyDocument(envelope: LTEnvelope) {
41
+ const result = await mcp_analyzer_classify({ content: envelope.data.content });
42
+
43
+ if (result.confidence >= 0.85) {
44
+ return { type: 'return', data: result };
45
+ }
46
+ return { type: 'escalation', data: result, message: 'Low confidence', role: 'reviewer' };
47
+ }
48
+ ```
49
+
50
+ The engineer writes `await mcp_analyzer_classify(...)` in their workflow. That's a proxy activity call. It's also an MCP tool call. Same thing. Durable, checkpointed, exactly-once. The engineer doesn't need to think about protocols — they call functions. The system handles the rest.
51
+
52
+ ### Humans as Tools
53
+
54
+ Long Tail exposes its escalation queue as an MCP server. Any MCP-aware agent can route work to humans through the same protocol it uses to call any other tool.
55
+
56
+ ```
57
+ MCP Server: "long-tail-human-queue"
58
+
59
+ Tools:
60
+ - escalate_to_human(role, message, data) → escalation_id
61
+ - escalate_and_wait(role, message, data) → blocks until resolved, returns payload
62
+ - check_resolution(escalation_id) → resolved | pending
63
+ - get_available_work(role) → escalation[]
64
+ - claim_and_resolve(escalation_id, payload) → result
65
+ ```
66
+
67
+ An AI agent working the queue:
68
+
69
+ ```typescript
70
+ import { Client } from '@modelcontextprotocol/sdk/client';
71
+
72
+ const client = new Client({ name: 'my-agent', version: '1.0.0' });
73
+ await client.connect(transport);
74
+
75
+ const work = await client.callTool({
76
+ name: 'get_available_work',
77
+ arguments: { role: 'reviewer' },
78
+ });
79
+
80
+ await client.callTool({
81
+ name: 'claim_and_resolve',
82
+ arguments: {
83
+ escalation_id: 'esc-abc123',
84
+ resolver_id: 'my-agent',
85
+ payload: { approved: true, note: 'Verified by automated review' },
86
+ },
87
+ });
88
+ ```
89
+
90
+ Human labor and AI labor become composable. The protocol is the same whether the resolver is a person clicking a button or an agent calling a tool.
91
+
92
+ ### Compiled Workflows as Tools
93
+
94
+ Once a triage execution is compiled and deployed, it becomes a tool. The dynamic sequence of tool calls that fixed an edge case — rotate, extract, validate — is now a deterministic pipeline that any workflow or agent can invoke:
95
+
96
+ ```
97
+ MCP Server: "long-tail-mcp-workflows"
98
+
99
+ Tools:
100
+ - list_workflows() → available compiled workflows
101
+ - get_workflow(workflow_name) → schema, manifest, provenance
102
+ - invoke_workflow(workflow_name, input, async?) → result or job_id
103
+ ```
104
+
105
+ An agent encountering a familiar edge case checks for a compiled solution before falling back to dynamic triage:
106
+
107
+ ```typescript
108
+ const available = await client.callTool({
109
+ name: 'list_workflows',
110
+ arguments: { status: 'active' },
111
+ });
112
+
113
+ await client.callTool({
114
+ name: 'invoke_workflow',
115
+ arguments: {
116
+ workflow_name: 'rotate-and-extract',
117
+ input: { document: 'page1_upside_down.png', rotation: 180 },
118
+ },
119
+ });
120
+ ```
121
+
122
+ No LLM needed. No token costs. The same fix that once required an agentic reasoning loop now runs as a direct tool-to-tool pipeline — and it's callable as a single tool by any other workflow.
123
+
124
+ ### The Cycle
125
+
126
+ This is how the system evolves:
127
+
128
+ ```
129
+ 1. Engineer writes workflow, calling tools (proxy activities)
130
+ 2. Workflow escalates when confidence is low
131
+ 3. Human resolves — or flags for triage
132
+ 4. Triage agent calls the SAME tools dynamically to fix the issue
133
+ 5. Successful fix is compiled into a deterministic workflow
134
+ 6. That workflow becomes a new tool on a new server
135
+ 7. Next time, the deterministic workflow handles it — no LLM, no human
136
+ 8. The triage agent discovers it has one more tool available
137
+ ```
138
+
139
+ Over time, the YAML replaces the procedural. The MCP triage workflow stops entropy by repairing and replacing the flows that eventually all become obsolete. Dynamic processes author themselves. The long tail gets shorter every time.
140
+
141
+ The sections above describe the concept. The rest of this guide covers the concrete servers, tools, and APIs that implement it.
142
+
143
+ ## Human Queue Server
144
+
145
+ The Human Queue is a built-in MCP server that exposes Long Tail's escalation API as standard MCP tools. Any MCP-compatible client — Claude, LangGraph, CrewAI, a custom agent — can connect and work the queue.
146
+
147
+ ### Tools
148
+
149
+ #### `escalate_to_human`
150
+
151
+ Create a new escalation for human review.
152
+
153
+ | Parameter | Type | Required | Description |
154
+ |-----------|------|----------|-------------|
155
+ | `role` | string | yes | Target role (e.g., `"reviewer"`) |
156
+ | `message` | string | yes | What needs human review |
157
+ | `data` | object | no | Contextual data for the reviewer |
158
+ | `type` | string | no | Classification (default: `"mcp"`) |
159
+ | `subtype` | string | no | Subtype (default: `"tool_call"`) |
160
+ | `priority` | number | no | 1 (highest) to 4 (lowest), default: 2 |
161
+
162
+ Returns:
163
+
164
+ ```json
165
+ {
166
+ "escalation_id": "uuid",
167
+ "status": "pending",
168
+ "role": "reviewer",
169
+ "created_at": "2025-01-15T10:30:00Z"
170
+ }
171
+ ```
172
+
173
+ #### `check_resolution`
174
+
175
+ Check the status of an escalation.
176
+
177
+ | Parameter | Type | Required | Description |
178
+ |-----------|------|----------|-------------|
179
+ | `escalation_id` | string | yes | The escalation ID to check |
180
+
181
+ Returns:
182
+
183
+ ```json
184
+ {
185
+ "escalation_id": "uuid",
186
+ "status": "pending"
187
+ }
188
+ ```
189
+
190
+ When resolved:
191
+
192
+ ```json
193
+ {
194
+ "escalation_id": "uuid",
195
+ "status": "resolved",
196
+ "resolver_payload": { "approved": true, "note": "..." },
197
+ "resolved_at": "2025-01-15T11:00:00Z"
198
+ }
199
+ ```
200
+
201
+ Returns `isError: true` if the escalation doesn't exist.
202
+
203
+ #### `get_available_work`
204
+
205
+ List pending, unassigned escalations for a role.
206
+
207
+ | Parameter | Type | Required | Description |
208
+ |-----------|------|----------|-------------|
209
+ | `role` | string | yes | Role to filter by |
210
+ | `limit` | number | no | Max results (default: 10) |
211
+
212
+ Returns:
213
+
214
+ ```json
215
+ {
216
+ "count": 2,
217
+ "escalations": [
218
+ {
219
+ "escalation_id": "uuid",
220
+ "type": "mcp",
221
+ "subtype": "tool_call",
222
+ "description": "Address mismatch for MBR-2024-001",
223
+ "priority": 2,
224
+ "role": "reviewer",
225
+ "created_at": "2025-01-15T10:30:00Z"
226
+ }
227
+ ]
228
+ }
229
+ ```
230
+
231
+ #### `claim_and_resolve`
232
+
233
+ Claim an escalation and resolve it in one atomic operation.
234
+
235
+ | Parameter | Type | Required | Description |
236
+ |-----------|------|----------|-------------|
237
+ | `escalation_id` | string | yes | The escalation to resolve |
238
+ | `resolver_id` | string | yes | Who/what is resolving (e.g., `"my-agent"`) |
239
+ | `payload` | object | yes | Resolution data |
240
+
241
+ Returns:
242
+
243
+ ```json
244
+ {
245
+ "escalation_id": "uuid",
246
+ "status": "resolved",
247
+ "resolved_at": "2025-01-15T11:00:00Z"
248
+ }
249
+ ```
250
+
251
+ Returns `isError: true` if the escalation isn't available (already claimed, already resolved, or doesn't exist).
252
+
253
+ ### Connecting
254
+
255
+ **In-process (testing or co-located agents):**
256
+
257
+ ```typescript
258
+ import { Client } from '@modelcontextprotocol/sdk/client/index.js';
259
+ import { InMemoryTransport } from '@modelcontextprotocol/sdk/inMemory.js';
260
+ import { createHumanQueueServer } from '@hotmeshio/long-tail/services/mcp/server';
261
+
262
+ const server = await createHumanQueueServer();
263
+ const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair();
264
+ await server.connect(serverTransport);
265
+
266
+ const client = new Client({ name: 'my-agent', version: '1.0.0' });
267
+ await client.connect(clientTransport);
268
+
269
+ // Now use client.callTool() to interact with the queue
270
+ const work = await client.callTool({
271
+ name: 'get_available_work',
272
+ arguments: { role: 'reviewer', limit: 50 },
273
+ });
274
+ ```
275
+
276
+ **Over stdio or SSE:** Connect your MCP client to Long Tail's Streamable HTTP endpoint or spawn the server as a subprocess. The tools and responses are identical regardless of transport.
277
+
278
+ The Human Queue handles the people side. The Document Vision server handles the AI side — wrapping model capabilities as MCP tools.
279
+
280
+ ## Document Vision Server
281
+
282
+ The Document Vision server (`services/mcp/vision-server.ts`) wraps AI processing activities as MCP tools. It follows the same singleton pattern as the Human Queue server — Zod schemas at module level, `createVisionServer()` / `stopVisionServer()` lifecycle.
283
+
284
+ The included implementation wraps OpenAI Vision extraction and member database validation. The pattern applies to any AI capability you want to expose as MCP tools.
285
+
286
+ ### Tools
287
+
288
+ | Tool | Arguments | Returns |
289
+ |------|-----------|---------|
290
+ | `list_document_pages` | *(none)* | `{ pages: string[] }` |
291
+ | `extract_member_info` | `{ image_ref, page_number }` | `{ member_info: MemberInfo \| null }` |
292
+ | `validate_member` | `{ member_info: MemberInfo }` | `{ result, databaseRecord? }` |
293
+
294
+ ### Connecting
295
+
296
+ Same `InMemoryTransport` pattern as the Human Queue:
297
+
298
+ ```typescript
299
+ import { Client as McpClient } from '@modelcontextprotocol/sdk/client/index.js';
300
+ import { InMemoryTransport } from '@modelcontextprotocol/sdk/inMemory.js';
301
+ import { createVisionServer } from '@hotmeshio/long-tail/services/mcp/vision-server';
302
+
303
+ const server = await createVisionServer();
304
+ const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair();
305
+ await server.connect(serverTransport);
306
+
307
+ const client = new McpClient({ name: 'my-vision-client', version: '1.0.0' });
308
+ await client.connect(clientTransport);
309
+
310
+ // Discover tools
311
+ const { tools } = await client.listTools();
312
+
313
+ // Call a tool
314
+ const result = await client.callTool({
315
+ name: 'list_document_pages',
316
+ arguments: {},
317
+ });
318
+ ```
319
+
320
+ ### Writing Your Own MCP Server
321
+
322
+ To wrap your own AI capabilities as MCP tools, follow the same pattern:
323
+
324
+ 1. Define Zod schemas at module level (avoids TS2589 deep inference errors)
325
+ 2. Use the singleton pattern with `create` / `stop` lifecycle
326
+ 3. Register tools with `(server as any).registerTool()` (type cast required by SDK)
327
+
328
+ See `services/mcp/vision-server.ts` and `services/mcp/server.ts` for working examples.
329
+
330
+ ## MCP-Native Workflow
331
+
332
+ The `verify-document-mcp` workflow demonstrates both MCP servers working together. Every activity call — listing pages, extracting data, validating members — routes through the Vision MCP server. When the workflow escalates, the Human Queue MCP server manages the review cycle. Both sides speak the same protocol.
333
+
334
+ ### How It Works
335
+
336
+ ```
337
+ verify-document-mcp workflow
338
+ |
339
+ +-- proxyActivities --> MCP client -- InMemoryTransport --> Vision MCP Server
340
+ | +- list_document_pages
341
+ | +- extract_member_info (-> OpenAI Vision)
342
+ | +- validate_member (-> member DB)
343
+ |
344
+ +-- return { type: 'escalation' }
345
+ |
346
+ +-- interceptor --> Human Queue MCP Server
347
+ +- check_resolution
348
+ +- get_available_work
349
+ +- claim_and_resolve
350
+ ```
351
+
352
+ ### The Activity Wrapper Pattern
353
+
354
+ The key insight: MCP tool calls are wrapped as activities with the **same function signatures** as direct implementations. The workflow doesn't know (or care) that MCP is underneath — it just calls `extractMemberInfo()`. But each call routes through the MCP protocol, making every AI tool invocation protocol-native.
355
+
356
+ ```typescript
357
+ import { Client as McpClient } from '@modelcontextprotocol/sdk/client/index.js';
358
+ import { InMemoryTransport } from '@modelcontextprotocol/sdk/inMemory.js';
359
+ import { createVisionServer } from '../../services/mcp/vision-server';
360
+
361
+ let client: McpClient | null = null;
362
+
363
+ async function getClient(): Promise<McpClient> {
364
+ if (client) return client;
365
+ const server = await createVisionServer();
366
+ const [ct, st] = InMemoryTransport.createLinkedPair();
367
+ await server.connect(st);
368
+ client = new McpClient({ name: 'verify-mcp-client', version: '1.0.0' });
369
+ await client.connect(ct);
370
+ return client;
371
+ }
372
+
373
+ export async function extractMemberInfo(
374
+ imageRef: string,
375
+ pageNumber: number,
376
+ ): Promise<MemberInfo | null> {
377
+ const c = await getClient();
378
+ const result = await c.callTool({
379
+ name: 'extract_member_info',
380
+ arguments: { image_ref: imageRef, page_number: pageNumber },
381
+ });
382
+ return parseResult(result).member_info;
383
+ }
384
+ ```
385
+
386
+ Because the signatures match the original activities, the workflow uses `proxyActivities()` at module scope — the standard pattern. Each proxied call is a durable checkpoint. If the process crashes after a Vision MCP tool call completes, replay uses the cached result.
387
+
388
+ ### The Pipeline
389
+
390
+ 1. **List pages** via MCP tool `list_document_pages`
391
+ 2. **Extract** member info from each page via MCP tool `extract_member_info` (routes to OpenAI Vision)
392
+ 3. **Merge** multi-page extractions into a single record
393
+ 4. **Validate** against member database via MCP tool `validate_member`
394
+ 5. **Return or escalate** — match returns; mismatch escalates to the Human Queue
395
+
396
+ When the workflow escalates, agents can query and resolve the escalation through the Human Queue MCP server — the same protocol used for the AI tools.
397
+
398
+ ### Running the Tests
399
+
400
+ ```bash
401
+ # Vision server tool tests (no OpenAI key needed for most)
402
+ npm run test:mcp:vision
403
+
404
+ # Full integration (needs OpenAI key for extraction + workflow tests)
405
+ OPENAI_API_KEY=sk-... npm run test:mcp:vision
406
+
407
+ # With verbose output
408
+ npx vitest run tests/workflows/verify-document-mcp.test.ts --reporter=verbose
409
+ ```
410
+
411
+ The examples above use built-in servers. Long Tail can also connect to any external MCP server.
412
+
413
+ ## External MCP Servers
414
+
415
+ Long Tail can connect to any external MCP server and invoke its tools as durable activities. Register servers in the database, then wrap their tools with `proxyActivities()` — the same mechanism used for any workflow activity.
416
+
417
+ ### Register a Server
418
+
419
+ ```bash
420
+ curl -X POST http://localhost:3000/api/mcp/servers \
421
+ -H 'Content-Type: application/json' \
422
+ -d '{
423
+ "name": "doc-analyzer",
424
+ "transport_type": "stdio",
425
+ "transport_config": {
426
+ "command": "npx",
427
+ "args": ["-y", "doc-analyzer-mcp"]
428
+ },
429
+ "auto_connect": true
430
+ }'
431
+ ```
432
+
433
+ Or via SSE:
434
+
435
+ ```bash
436
+ curl -X POST http://localhost:3000/api/mcp/servers \
437
+ -H 'Content-Type: application/json' \
438
+ -d '{
439
+ "name": "my-remote-server",
440
+ "transport_type": "sse",
441
+ "transport_config": {
442
+ "url": "https://my-server.example.com/mcp"
443
+ },
444
+ "auto_connect": false
445
+ }'
446
+ ```
447
+
448
+ ### Use in a Workflow
449
+
450
+ ```typescript
451
+ import { Durable } from '@hotmeshio/hotmesh';
452
+ import { McpClient } from '@hotmeshio/long-tail';
453
+
454
+ // Get tool functions from a connected MCP server
455
+ const tools = await McpClient.toolActivities(serverId);
456
+
457
+ // Proxy them as durable activities — checkpointed, retried, audited
458
+ const { mcp_doc_analyzer_classify } = Durable.workflow.proxyActivities<typeof tools>({
459
+ activities: tools,
460
+ retryPolicy: { maximumAttempts: 3 },
461
+ });
462
+
463
+ export async function classifyDocument(envelope: LTEnvelope) {
464
+ const result = await mcp_doc_analyzer_classify({
465
+ content: envelope.data.content,
466
+ });
467
+
468
+ if (result.confidence >= 0.85) {
469
+ return { type: 'return', data: result };
470
+ }
471
+
472
+ return {
473
+ type: 'escalation',
474
+ data: result,
475
+ message: 'Low confidence classification',
476
+ role: 'reviewer',
477
+ };
478
+ }
479
+ ```
480
+
481
+ Tool names are derived from the server name and tool name: `mcp_{serverName}_{toolName}`, with non-alphanumeric characters replaced by underscores.
482
+
483
+ If the process crashes between an MCP tool call and its checkpoint, HotMesh replays from cache. The external server is not called a second time. This gives you exactly-once semantics over a protocol that doesn't natively guarantee them.
484
+
485
+ Server registration can happen at runtime via the REST API (shown above) or at startup via configuration.
486
+
487
+ ## Built-in Servers
488
+
489
+ Long Tail ships with built-in MCP servers. For descriptions, see the [architecture guide](architecture.md#built-in-mcp-servers).
490
+
491
+ | Server | Tags |
492
+ |--------|------|
493
+ | `long-tail-db-query` | database, query, analytics |
494
+ | `long-tail-human-queue` | escalation, human-queue, routing |
495
+ | `mcp-workflows-longtail` | workflows, compiled, deterministic |
496
+ | `long-tail-workflow-compiler` | compilation, yaml, codegen |
497
+ | `long-tail-translation` | translation, language, text-processing |
498
+ | `long-tail-vision` | vision, image-analysis, multimodal |
499
+ | `long-tail-playwright` | browser-automation, testing, screenshots |
500
+ | `long-tail-playwright-cli` | browser-automation, screenshots, scraping, forms |
501
+ | `long-tail-docs` | documentation, help, reference |
502
+ | `long-tail-file-storage` | storage, files, io |
503
+ | `long-tail-http-fetch` | http, api, fetch, network |
504
+ | `long-tail-oauth` | authentication, oauth, credentials |
505
+ | `long-tail-claude-code` | development, coding, ai-agent, terminal, code-generation |
506
+
507
+ ## Configuration
508
+
509
+ Pass `mcp` in the `start()` config:
510
+
511
+ ```typescript
512
+ import { start } from '@hotmeshio/long-tail';
513
+
514
+ const { client, shutdown } = await start({
515
+ database: {
516
+ host: 'localhost',
517
+ port: 5432,
518
+ user: 'postgres',
519
+ password: 'postgres',
520
+ database: 'longtail',
521
+ },
522
+
523
+ mcp: {
524
+ // Built-in Human Queue MCP server
525
+ server: {
526
+ enabled: true, // default: true
527
+ name: 'long-tail-human-queue', // reported to MCP clients
528
+ },
529
+
530
+ // External MCP server IDs to connect on startup
531
+ autoConnect: ['server-uuid-1', 'server-uuid-2'],
532
+
533
+ // Or replace the built-in adapter entirely:
534
+ // adapter: new MyCustomMcpAdapter(),
535
+ },
536
+ });
537
+ ```
538
+
539
+ When `mcp.server.enabled` is `true` (the default), the Human Queue server starts and registers its tools. When `autoConnect` lists server IDs, the adapter looks them up in `lt_mcp_servers` and connects via their configured transport.
540
+
541
+ ## REST API
542
+
543
+ All routes are mounted at `/api/mcp`.
544
+
545
+ ### Server Registration
546
+
547
+ | Method | Path | Description |
548
+ |--------|------|-------------|
549
+ | `GET` | `/api/mcp/servers` | List registered servers |
550
+ | `POST` | `/api/mcp/servers` | Register a new server |
551
+ | `GET` | `/api/mcp/servers/:id` | Get a server by ID |
552
+ | `PUT` | `/api/mcp/servers/:id` | Update a server |
553
+ | `DELETE` | `/api/mcp/servers/:id` | Delete a server |
554
+
555
+ **Query parameters** for `GET /api/mcp/servers`:
556
+
557
+ - `status` — filter by status (`registered`, `connected`, `error`, `disconnected`)
558
+ - `auto_connect` — filter by auto-connect (`true`, `false`)
559
+ - `limit`, `offset` — pagination
560
+
561
+ ### Connection Management
562
+
563
+ | Method | Path | Description |
564
+ |--------|------|-------------|
565
+ | `POST` | `/api/mcp/servers/:id/connect` | Connect to a server |
566
+ | `POST` | `/api/mcp/servers/:id/disconnect` | Disconnect from a server |
567
+
568
+ ### Tool Operations
569
+
570
+ | Method | Path | Description |
571
+ |--------|------|-------------|
572
+ | `GET` | `/api/mcp/servers/:id/tools` | List tools on a connected server |
573
+ | `POST` | `/api/mcp/servers/:id/tools/:toolName/call` | Call a tool |
574
+
575
+ **Call a tool:**
576
+
577
+ ```bash
578
+ curl -X POST http://localhost:3000/api/mcp/servers/$ID/tools/search/call \
579
+ -H 'Content-Type: application/json' \
580
+ -d '{ "arguments": { "query": "hello" } }'
581
+ ```
582
+
583
+ Server registrations are persisted in PostgreSQL so they survive restarts.
584
+
585
+ ## Database Schema
586
+
587
+ MCP server registrations are stored in `lt_mcp_servers`:
588
+
589
+ ```sql
590
+ CREATE TABLE IF NOT EXISTS lt_mcp_servers (
591
+ id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
592
+ name TEXT UNIQUE NOT NULL,
593
+ description TEXT,
594
+ transport_type TEXT NOT NULL CHECK (transport_type IN ('stdio', 'sse')),
595
+ transport_config JSONB NOT NULL DEFAULT '{}'::JSONB,
596
+ auto_connect BOOLEAN NOT NULL DEFAULT false,
597
+ tool_manifest JSONB, -- cached from last listTools()
598
+ tags TEXT[], -- categorization for tag-based tool discovery
599
+ compile_hints TEXT, -- per-server instructions for the compilation pipeline
600
+ status TEXT NOT NULL DEFAULT 'registered'
601
+ CHECK (status IN ('registered', 'connected', 'error', 'disconnected')),
602
+ last_connected_at TIMESTAMPTZ,
603
+ metadata JSONB,
604
+ created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
605
+ updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
606
+ );
607
+ ```
608
+
609
+ The `tool_manifest` column caches the result of `listTools()` on each successful connection, so tools can be enumerated without a live connection.
610
+
611
+ The `tags` column is a PostgreSQL text array with a GIN index, enabling fast tag-based tool discovery via `findServersByTags(tags, 'any'|'all')`. Workflows like `mcpQuery` discover all tools or filter by user-provided tags.
612
+
613
+ The `compile_hints` column stores per-server instructions that are injected into the compilation prompt when that server's tools appear in an execution trace. This lets each server provide tool-specific constraints (e.g., timeout requirements, retry policies, ordering rules) that guide the compiler when converting dynamic executions into deterministic workflows.
614
+
615
+ The schema is created automatically by `migrate()`. See `services/db/schemas/001_initial.sql`.
616
+
617
+ The test suite verifies the full MCP protocol against real PostgreSQL — no mocks.
618
+
619
+ ## Testing
620
+
621
+ ### InMemoryTransport Pattern
622
+
623
+ The test suite uses `InMemoryTransport.createLinkedPair()` from the MCP SDK to connect a real client to the real server through linked in-process transports, hitting real PostgreSQL. No mocks.
624
+
625
+ ```typescript
626
+ import { Client as McpClient } from '@modelcontextprotocol/sdk/client/index.js';
627
+ import { InMemoryTransport } from '@modelcontextprotocol/sdk/inMemory.js';
628
+ import { createHumanQueueServer, stopServer } from '../../services/mcp/server';
629
+
630
+ // Reset singleton, create fresh server
631
+ await stopServer();
632
+ const server = await createHumanQueueServer({ name: 'test-human-queue' });
633
+
634
+ // Linked in-memory transports
635
+ const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair();
636
+ await server.connect(serverTransport);
637
+
638
+ const client = new McpClient({ name: 'test-client', version: '1.0.0' });
639
+ await client.connect(clientTransport);
640
+
641
+ // Now use client.callTool(), client.listTools(), etc.
642
+ ```
643
+
644
+ The shared test utility at `tests/setup/mcp.ts` wraps this pattern as `createMcpTestClient()` and provides:
645
+
646
+ - `parseMcpResult(result)` — extracts and JSON-parses `result.content[0].text`
647
+ - `waitForEscalationViaMcp(client, role, timeout, interval)` — polls `get_available_work` until escalations appear
648
+
649
+ ### Running MCP Tests
650
+
651
+ ```bash
652
+ # Human Queue protocol tests (8 tests — real client, real server, real DB)
653
+ npm run test:mcp
654
+
655
+ # Vision MCP server tool tests
656
+ npm run test:mcp:vision
657
+
658
+ # Full integration with OpenAI Vision
659
+ OPENAI_API_KEY=sk-... npm run test:mcp:vision
660
+
661
+ # All tests
662
+ npm test
663
+ ```
664
+
665
+ ### What the Protocol Tests Prove
666
+
667
+ The `tests/mcp.test.ts` suite includes 8 tests:
668
+
669
+ 1. **Tool discovery** — `listTools()` returns the expected tools
670
+ 2. **Create** — `escalate_to_human` writes a real PostgreSQL record
671
+ 3. **Check** — `check_resolution` reads status from DB
672
+ 4. **List** — `get_available_work` filters by role
673
+ 5. **Resolve** — `claim_and_resolve` atomically claims and resolves
674
+ 6. **Full lifecycle** — escalate -> check -> list -> resolve -> check -> list (empty)
675
+ 7. **Error: not found** — checking a nonexistent ID returns `isError: true`
676
+ 8. **Error: already resolved** — claiming a resolved escalation returns `isError: true`
677
+
678
+ The `tests/workflows/verify-document-mcp.test.ts` suite adds:
679
+
680
+ 1. **Vision tool discovery** — `listTools()` returns 3 Vision tools
681
+ 2. **list_document_pages** — returns page refs from storage
682
+ 3. **validate_member** — match, mismatch, and not_found cases
683
+ 4. **extract_member_info** — extracts via OpenAI Vision (needs API key)
684
+ 5. **Full MCP-native workflow** — extraction -> validation -> escalation -> Human Queue MCP resolution
685
+
686
+ Every test verifies both the MCP response and the actual database state.
687
+
688
+ ## Custom Adapters
689
+
690
+ The `LTMcpAdapter` interface lets you replace the built-in adapter entirely:
691
+
692
+ ```typescript
693
+ interface LTMcpAdapter {
694
+ connect(): Promise<void>;
695
+ disconnect(): Promise<void>;
696
+ connectClient(serverId: string): Promise<void>;
697
+ disconnectClient(serverId: string): Promise<void>;
698
+ listTools(serverId: string): Promise<LTMcpToolManifest[]>;
699
+ callTool(serverId: string, toolName: string, args: Record<string, any>): Promise<any>;
700
+ toolActivities(serverId: string): Promise<Record<string, (...args: any[]) => Promise<any>>>;
701
+ }
702
+ ```
703
+
704
+ Pass your implementation in the startup config:
705
+
706
+ ```typescript
707
+ await start({
708
+ database: { /* ... */ },
709
+ mcp: {
710
+ adapter: new MyCustomMcpAdapter(),
711
+ },
712
+ });
713
+ ```
714
+
715
+ The adapter registry follows the same pattern as auth, telemetry, events, and logging — a single-adapter registry with `connect()`/`disconnect()` lifecycle hooks.