@hotmeshio/long-tail 0.1.4 → 0.1.6

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 (663) hide show
  1. package/README.md +35 -5
  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 +4 -7
  12. package/{services → build/lib}/db/schemas/001_schema.sql +3 -0
  13. package/{services → build/lib}/db/schemas/011_system_workflow_configs.sql +7 -0
  14. package/build/lib/db/schemas/015_knowledge.sql +23 -0
  15. package/build/lib/db/schemas/016_streamable_http.sql +7 -0
  16. package/build/{services → lib}/telemetry/honeycomb.d.ts +2 -2
  17. package/build/{services → lib}/telemetry/honeycomb.js +2 -2
  18. package/build/modules/defaults.d.ts +2 -0
  19. package/build/modules/defaults.js +3 -1
  20. package/build/routes/controlplane.js +1 -1
  21. package/build/routes/dba.js +4 -0
  22. package/build/routes/docs.d.ts +2 -0
  23. package/build/routes/docs.js +105 -0
  24. package/build/routes/escalations/bulk.js +120 -202
  25. package/build/routes/escalations/resolve.js +1 -1
  26. package/build/routes/escalations/single.js +1 -1
  27. package/build/routes/files.js +1 -1
  28. package/build/routes/index.js +2 -0
  29. package/build/routes/insight.js +65 -1
  30. package/build/routes/mcp.js +26 -3
  31. package/build/routes/oauth.js +1 -1
  32. package/build/routes/settings.js +4 -4
  33. package/build/routes/workflows/discovery.js +3 -3
  34. package/build/routes/workflows/invocation.js +1 -1
  35. package/build/routes/yaml-workflows/cron.d.ts +2 -0
  36. package/build/routes/yaml-workflows/cron.js +117 -0
  37. package/build/routes/yaml-workflows/crud.js +39 -1
  38. package/build/routes/yaml-workflows/deployment.js +9 -9
  39. package/build/routes/yaml-workflows/index.js +4 -1
  40. package/build/services/auth/bot-api-key.js +1 -1
  41. package/build/services/auth/index.d.ts +4 -0
  42. package/build/services/auth/index.js +17 -0
  43. package/build/services/auth/service-token.js +1 -1
  44. package/build/services/config/provider.js +1 -1
  45. package/build/services/config/read.js +1 -1
  46. package/build/services/config/write.js +1 -1
  47. package/build/services/controlplane/index.js +3 -4
  48. package/build/services/controlplane/quorum-bridge.js +2 -2
  49. package/build/services/cron/index.d.ts +17 -0
  50. package/build/services/cron/index.js +98 -6
  51. package/build/services/dba.d.ts +4 -0
  52. package/build/services/dba.js +3 -6
  53. package/build/services/escalation/bulk.js +1 -1
  54. package/build/services/escalation/crud.js +1 -1
  55. package/build/services/escalation/queries.js +1 -1
  56. package/build/services/export/client.js +2 -5
  57. package/build/services/export/index.js +14 -2
  58. package/build/services/hotmesh-utils.js +1 -1
  59. package/build/services/iam/bots.js +6 -12
  60. package/build/services/iam/context.d.ts +1 -1
  61. package/build/services/iam/context.js +5 -5
  62. package/build/services/iam/credentials.js +1 -1
  63. package/build/services/iam/ephemeral.js +8 -15
  64. package/build/services/iam/principal.js +3 -10
  65. package/build/services/iam/resolve.js +1 -1
  66. package/build/services/iam/sql.d.ts +10 -0
  67. package/build/services/iam/sql.js +42 -0
  68. package/build/services/insight/index.d.ts +12 -0
  69. package/build/services/insight/index.js +34 -6
  70. package/build/services/interceptor/activities/escalation.js +1 -1
  71. package/build/services/interceptor/activities/task.js +9 -6
  72. package/build/services/interceptor/activities/workflow.js +4 -5
  73. package/build/services/interceptor/activity-interceptor.d.ts +1 -1
  74. package/build/services/interceptor/activity-interceptor.js +5 -5
  75. package/build/services/interceptor/completion.js +1 -1
  76. package/build/services/interceptor/escalation.js +1 -1
  77. package/build/services/interceptor/index.js +4 -4
  78. package/build/services/interceptor/lifecycle.js +1 -1
  79. package/build/services/maintenance/index.js +4 -5
  80. package/build/services/mcp/adapter.js +1 -16
  81. package/build/services/mcp/client/connection.d.ts +10 -1
  82. package/build/services/mcp/client/connection.js +51 -3
  83. package/build/services/mcp/client/tools.js +1 -1
  84. package/build/services/mcp/db-server/index.js +1 -1
  85. package/build/services/mcp/db-server/schemas.d.ts +2 -2
  86. package/build/services/mcp/db-server/tools.js +17 -4
  87. package/build/services/mcp/db.d.ts +1 -1
  88. package/build/services/mcp/db.js +11 -1
  89. package/build/services/mcp/playwright-server/index.js +1 -1
  90. package/build/services/mcp/playwright-server/lifecycle.js +1 -1
  91. package/build/services/mcp/playwright-server/schemas.d.ts +2 -2
  92. package/build/services/mcp/playwright-server/tools.js +1 -1
  93. package/build/services/mcp/server.js +1 -1
  94. package/build/services/mcp/sql.d.ts +7 -1
  95. package/build/services/mcp/sql.js +36 -3
  96. package/build/services/mcp/types.d.ts +3 -1
  97. package/build/services/mcp/workflow-compiler-server.js +1 -1
  98. package/build/services/mcp/workflow-server.js +1 -1
  99. package/build/services/mcp-runs/execution-builder.js +8 -6
  100. package/build/services/mcp-runs/queries.js +2 -2
  101. package/build/services/mcp-runs/sql.d.ts +4 -1
  102. package/build/services/mcp-runs/sql.js +23 -2
  103. package/build/services/namespace/index.js +1 -1
  104. package/build/services/oauth/db.js +9 -37
  105. package/build/services/oauth/index.js +1 -1
  106. package/build/services/oauth/providers/registry.js +1 -1
  107. package/build/services/oauth/sql.d.ts +7 -0
  108. package/build/services/oauth/sql.js +32 -0
  109. package/build/services/orchestrator/index.js +3 -3
  110. package/build/services/role/index.js +1 -1
  111. package/build/services/task/crud.js +1 -1
  112. package/build/services/task/process.js +1 -1
  113. package/build/services/task/resolve.js +1 -1
  114. package/build/services/user/auth.js +1 -1
  115. package/build/services/user/crud.js +1 -1
  116. package/build/services/user/rbac.js +1 -1
  117. package/build/services/user/roles.js +1 -1
  118. package/build/services/user/sql.d.ts +2 -0
  119. package/build/services/user/sql.js +3 -1
  120. package/build/services/yaml-workflow/db-utils.js +1 -1
  121. package/build/services/yaml-workflow/db.d.ts +3 -0
  122. package/build/services/yaml-workflow/db.js +25 -1
  123. package/build/services/yaml-workflow/deployer-helpers.js +1 -1
  124. package/build/services/yaml-workflow/deployer.js +4 -4
  125. package/build/services/yaml-workflow/generator.js +1 -1
  126. package/build/services/yaml-workflow/input-analyzer-helpers.d.ts +6 -0
  127. package/build/services/yaml-workflow/input-analyzer-helpers.js +36 -7
  128. package/build/services/yaml-workflow/input-analyzer.js +16 -3
  129. package/build/services/yaml-workflow/invoke.d.ts +19 -0
  130. package/build/services/yaml-workflow/invoke.js +80 -0
  131. package/build/services/yaml-workflow/pipeline/analyze.js +1 -1
  132. package/build/services/yaml-workflow/pipeline/build/dag.js +11 -6
  133. package/build/services/yaml-workflow/pipeline/build/wiring.d.ts +1 -1
  134. package/build/services/yaml-workflow/pipeline/build/wiring.js +89 -2
  135. package/build/services/yaml-workflow/pipeline/compile/llm-call.js +1 -1
  136. package/build/services/yaml-workflow/pipeline/extract.js +5 -3
  137. package/build/services/yaml-workflow/pipeline/index.d.ts +5 -0
  138. package/build/services/yaml-workflow/pipeline/index.js +22 -0
  139. package/build/services/yaml-workflow/pipeline/prompts.d.ts +1 -1
  140. package/build/services/yaml-workflow/pipeline/prompts.js +44 -1
  141. package/build/services/yaml-workflow/pipeline/validate.js +2 -2
  142. package/build/services/yaml-workflow/sql.d.ts +3 -0
  143. package/build/services/yaml-workflow/sql.js +16 -1
  144. package/build/services/yaml-workflow/types.d.ts +13 -1
  145. package/build/services/yaml-workflow/workers/callbacks.js +10 -2
  146. package/build/services/yaml-workflow/workers/events.js +2 -2
  147. package/build/services/yaml-workflow/workers/register.js +37 -9
  148. package/build/start/adapters.js +7 -7
  149. package/build/start/index.js +4 -4
  150. package/build/start/server.js +1 -1
  151. package/build/start/workers.d.ts +1 -2
  152. package/build/start/workers.js +8 -7
  153. package/build/system/activities/claude-code.js +1 -1
  154. package/build/system/activities/file-storage.js +1 -1
  155. package/build/system/activities/knowledge.d.ts +58 -0
  156. package/build/system/activities/knowledge.js +128 -0
  157. package/build/system/activities/sql.d.ts +9 -0
  158. package/build/system/activities/sql.js +41 -0
  159. package/build/system/activities/triage/context.js +1 -1
  160. package/build/system/activities/triage/discovery.d.ts +2 -14
  161. package/build/system/activities/triage/discovery.js +5 -161
  162. package/build/system/activities/triage/llm.d.ts +1 -8
  163. package/build/system/activities/triage/llm.js +2 -28
  164. package/build/system/activities/triage/tools.d.ts +1 -17
  165. package/build/system/activities/triage/tools.js +8 -167
  166. package/build/system/index.js +11 -4
  167. package/build/system/mcp-servers/admin/escalations.d.ts +5 -0
  168. package/build/system/mcp-servers/admin/escalations.js +149 -0
  169. package/build/system/mcp-servers/admin/index.d.ts +31 -0
  170. package/build/system/mcp-servers/admin/index.js +80 -0
  171. package/build/system/mcp-servers/admin/maintenance.d.ts +5 -0
  172. package/build/system/mcp-servers/admin/maintenance.js +58 -0
  173. package/build/system/mcp-servers/admin/mcp-servers.d.ts +5 -0
  174. package/build/system/mcp-servers/admin/mcp-servers.js +146 -0
  175. package/build/system/mcp-servers/admin/schemas.d.ts +411 -0
  176. package/build/system/mcp-servers/admin/schemas.js +177 -0
  177. package/build/system/mcp-servers/admin/tasks.d.ts +5 -0
  178. package/build/system/mcp-servers/admin/tasks.js +112 -0
  179. package/build/system/mcp-servers/admin/users.d.ts +5 -0
  180. package/build/system/mcp-servers/admin/users.js +167 -0
  181. package/build/system/mcp-servers/admin/workflow-config.d.ts +9 -0
  182. package/build/system/mcp-servers/admin/workflow-config.js +118 -0
  183. package/build/system/mcp-servers/admin/workflows.d.ts +6 -0
  184. package/build/system/mcp-servers/admin/workflows.js +138 -0
  185. package/build/system/mcp-servers/admin/yaml-workflows.d.ts +8 -0
  186. package/build/system/mcp-servers/admin/yaml-workflows.js +237 -0
  187. package/build/system/mcp-servers/claude-code.js +1 -1
  188. package/build/system/mcp-servers/db-query/index.js +1 -1
  189. package/build/system/mcp-servers/db-query/schemas.d.ts +2 -2
  190. package/build/system/mcp-servers/db-query/tools.js +17 -4
  191. package/build/system/mcp-servers/docs.d.ts +5 -0
  192. package/build/system/mcp-servers/docs.js +147 -0
  193. package/build/system/mcp-servers/file-storage.js +1 -1
  194. package/build/system/mcp-servers/http-fetch.js +1 -1
  195. package/build/system/mcp-servers/human-queue.js +1 -1
  196. package/build/system/mcp-servers/knowledge.d.ts +4 -0
  197. package/build/system/mcp-servers/knowledge.js +137 -0
  198. package/build/system/mcp-servers/oauth.js +1 -1
  199. package/build/system/mcp-servers/playwright/browser-lifecycle.js +1 -1
  200. package/build/system/mcp-servers/playwright/index.js +1 -1
  201. package/build/system/mcp-servers/playwright/schemas.d.ts +21 -10
  202. package/build/system/mcp-servers/playwright/schemas.js +3 -0
  203. package/build/system/mcp-servers/playwright/tools-navigation.js +22 -9
  204. package/build/system/mcp-servers/playwright/tools-run-script.js +20 -3
  205. package/build/system/mcp-servers/playwright/vision-helper.d.ts +12 -0
  206. package/build/system/mcp-servers/playwright/vision-helper.js +81 -0
  207. package/build/system/mcp-servers/playwright-cli/helpers.js +2 -2
  208. package/build/system/mcp-servers/playwright-cli/index.js +1 -1
  209. package/build/system/mcp-servers/playwright-cli/schemas.d.ts +10 -10
  210. package/build/system/mcp-servers/playwright-cli/schemas.js +1 -1
  211. package/build/system/mcp-servers/playwright-cli/tools-auth.js +1 -1
  212. package/build/system/mcp-servers/playwright-cli/tools-capture.js +9 -3
  213. package/build/system/mcp-servers/translation.d.ts +14 -0
  214. package/build/system/mcp-servers/translation.js +130 -0
  215. package/build/system/mcp-servers/vision-prompts.d.ts +2 -0
  216. package/build/system/mcp-servers/vision-prompts.js +9 -0
  217. package/build/system/mcp-servers/{document-vision.d.ts → vision.d.ts} +3 -4
  218. package/build/system/mcp-servers/vision.js +258 -0
  219. package/build/system/mcp-servers/workflow-compiler.js +1 -1
  220. package/build/system/mcp-servers/workflow.js +1 -1
  221. package/build/system/seed/index.js +13 -2
  222. package/build/system/seed/server-definitions.d.ts +1961 -322
  223. package/build/system/seed/server-definitions.js +68 -34
  224. package/build/system/seed/tool-manifests-admin.d.ts +1645 -0
  225. package/build/system/seed/tool-manifests-admin.js +45 -0
  226. package/build/system/seed/tool-manifests-browser.d.ts +1 -1
  227. package/build/system/seed/tool-manifests-browser.js +3 -3
  228. package/build/system/seed/tool-manifests-data.d.ts +62 -21
  229. package/build/system/seed/tool-manifests-data.js +55 -17
  230. package/build/system/seed/tool-manifests-knowledge.d.ts +171 -0
  231. package/build/system/seed/tool-manifests-knowledge.js +94 -0
  232. package/build/system/seed/tool-manifests-workflows.d.ts +7 -0
  233. package/build/system/seed/tool-manifests-workflows.js +10 -3
  234. package/build/system/workflows/mcp-deterministic/index.js +1 -1
  235. package/build/system/workflows/mcp-query/activities/discovery.d.ts +2 -20
  236. package/build/system/workflows/mcp-query/activities/discovery.js +5 -163
  237. package/build/system/workflows/mcp-query/activities/llm.d.ts +1 -7
  238. package/build/system/workflows/mcp-query/activities/llm.js +2 -27
  239. package/build/system/workflows/mcp-query/activities/tool-executor.d.ts +0 -4
  240. package/build/system/workflows/mcp-query/activities/tool-executor.js +2 -106
  241. package/build/system/workflows/mcp-query/activities/tool-loader.d.ts +0 -9
  242. package/build/system/workflows/mcp-query/activities/tool-loader.js +2 -87
  243. package/build/system/workflows/mcp-query/index.js +55 -5
  244. package/build/system/workflows/mcp-query/prompts.d.ts +1 -2
  245. package/build/system/workflows/mcp-query/prompts.js +5 -32
  246. package/build/system/workflows/mcp-query/strategy-advisors.d.ts +3 -14
  247. package/build/system/workflows/mcp-query/strategy-advisors.js +4 -107
  248. package/build/system/workflows/mcp-query/types.d.ts +2 -10
  249. package/build/system/workflows/mcp-query/types.js +0 -1
  250. package/build/system/workflows/mcp-query-router/index.js +1 -1
  251. package/build/system/workflows/mcp-triage/index.d.ts +2 -2
  252. package/build/system/workflows/mcp-triage/index.js +39 -7
  253. package/build/system/workflows/mcp-triage/prompts.js +7 -14
  254. package/build/system/workflows/mcp-triage-deterministic/index.js +1 -1
  255. package/build/system/workflows/mcp-triage-router/index.js +1 -1
  256. package/build/system/workflows/mcp-workflow-builder/activities/caches.d.ts +5 -0
  257. package/build/system/workflows/mcp-workflow-builder/activities/caches.js +8 -0
  258. package/build/system/workflows/mcp-workflow-builder/activities/index.d.ts +2 -0
  259. package/build/system/workflows/mcp-workflow-builder/activities/index.js +7 -0
  260. package/build/system/workflows/mcp-workflow-builder/activities/llm.d.ts +2 -0
  261. package/build/system/workflows/mcp-workflow-builder/activities/llm.js +25 -0
  262. package/build/system/workflows/mcp-workflow-builder/activities/tool-loader.d.ts +5 -0
  263. package/build/system/workflows/mcp-workflow-builder/activities/tool-loader.js +8 -0
  264. package/build/system/workflows/mcp-workflow-builder/index.d.ts +16 -0
  265. package/build/system/workflows/mcp-workflow-builder/index.js +229 -0
  266. package/build/system/workflows/mcp-workflow-builder/prompts.d.ts +8 -0
  267. package/build/system/workflows/mcp-workflow-builder/prompts.js +247 -0
  268. package/build/system/workflows/shared/discovery.d.ts +35 -0
  269. package/build/system/workflows/shared/discovery.js +175 -0
  270. package/build/system/workflows/shared/index.d.ts +7 -0
  271. package/build/system/workflows/shared/index.js +18 -0
  272. package/build/system/workflows/shared/llm-caller.d.ts +8 -0
  273. package/build/system/workflows/shared/llm-caller.js +31 -0
  274. package/build/system/workflows/shared/prompts.d.ts +2 -0
  275. package/build/system/workflows/shared/prompts.js +32 -0
  276. package/build/system/workflows/shared/strategy-advisors.d.ts +14 -0
  277. package/build/system/workflows/shared/strategy-advisors.js +109 -0
  278. package/build/system/workflows/shared/tool-executor.d.ts +11 -0
  279. package/build/system/workflows/shared/tool-executor.js +111 -0
  280. package/build/system/workflows/shared/tool-loader.d.ts +19 -0
  281. package/build/system/workflows/shared/tool-loader.js +97 -0
  282. package/build/system/workflows/shared/types.d.ts +9 -0
  283. package/build/system/workflows/shared/types.js +2 -0
  284. package/build/system/workflows/tool-result-guard.d.ts +14 -0
  285. package/build/system/workflows/tool-result-guard.js +78 -0
  286. package/build/tsconfig.tsbuildinfo +1 -1
  287. package/build/types/mcp.d.ts +4 -3
  288. package/build/types/user.d.ts +2 -0
  289. package/build/types/yaml-workflow.d.ts +6 -2
  290. package/build/vitest.config.d.ts +1 -1
  291. package/build/vitest.integration.config.d.ts +1 -1
  292. package/build/workers/index.js +2 -8
  293. package/dashboard/dist/assets/AdminDashboard-BXkKGkb5.js +2 -0
  294. package/dashboard/dist/assets/AdminDashboard-BXkKGkb5.js.map +1 -0
  295. package/dashboard/dist/assets/AvailableEscalationsPage-DcH592mc.js +2 -0
  296. package/dashboard/dist/assets/AvailableEscalationsPage-DcH592mc.js.map +1 -0
  297. package/dashboard/dist/assets/BotPicker-A6LtzyuO.js +2 -0
  298. package/dashboard/dist/assets/{BotPicker-D6FYW1Gt.js.map → BotPicker-A6LtzyuO.js.map} +1 -1
  299. package/dashboard/dist/assets/CollapsibleSection-C7nL2_mv.js +2 -0
  300. package/dashboard/dist/assets/{CollapsibleSection-Cxk4wvjT.js.map → CollapsibleSection-C7nL2_mv.js.map} +1 -1
  301. package/dashboard/dist/assets/ConfirmDeleteModal-CWFwJrSl.js +2 -0
  302. package/dashboard/dist/assets/{ConfirmDeleteModal-FSXyKjaB.js.map → ConfirmDeleteModal-CWFwJrSl.js.map} +1 -1
  303. package/dashboard/dist/assets/CopyableId-DbZ5c3jh.js +2 -0
  304. package/dashboard/dist/assets/{CopyableId-CBdxWfp8.js.map → CopyableId-DbZ5c3jh.js.map} +1 -1
  305. package/dashboard/dist/assets/CredentialsPage-ClWkmLPu.js +2 -0
  306. package/dashboard/dist/assets/CredentialsPage-ClWkmLPu.js.map +1 -0
  307. package/dashboard/dist/assets/CustomDurationPicker-CtH2hReF.js +2 -0
  308. package/dashboard/dist/assets/{CustomDurationPicker-CAninCbl.js.map → CustomDurationPicker-CtH2hReF.js.map} +1 -1
  309. package/dashboard/dist/assets/DataTable-CM5ZcpPi.js +2 -0
  310. package/dashboard/dist/assets/DataTable-CM5ZcpPi.js.map +1 -0
  311. package/dashboard/dist/assets/ElapsedCell-CwqavyeC.js +2 -0
  312. package/dashboard/dist/assets/ElapsedCell-CwqavyeC.js.map +1 -0
  313. package/dashboard/dist/assets/EmptyState-BBn78pmm.js +2 -0
  314. package/dashboard/dist/assets/{EmptyState-2CmV-IaS.js.map → EmptyState-BBn78pmm.js.map} +1 -1
  315. package/dashboard/dist/assets/EscalationsOverview-BcJ2E3X7.js +2 -0
  316. package/dashboard/dist/assets/{EscalationsOverview-GXYFPASS.js.map → EscalationsOverview-BcJ2E3X7.js.map} +1 -1
  317. package/dashboard/dist/assets/EventTable-C1en_KZ0.js +2 -0
  318. package/dashboard/dist/assets/{EventTable-B01oJf6Y.js.map → EventTable-C1en_KZ0.js.map} +1 -1
  319. package/dashboard/dist/assets/FilterBar-CZTlrLQT.js +2 -0
  320. package/dashboard/dist/assets/{FilterBar-Ck4K4rzu.js.map → FilterBar-CZTlrLQT.js.map} +1 -1
  321. package/dashboard/dist/assets/ListToolbar-Cdbsapig.js +2 -0
  322. package/dashboard/dist/assets/ListToolbar-Cdbsapig.js.map +1 -0
  323. package/dashboard/dist/assets/McpOverview-CSpEJxKa.js +2 -0
  324. package/dashboard/dist/assets/{McpOverview-JkvRcX2e.js.map → McpOverview-CSpEJxKa.js.map} +1 -1
  325. package/dashboard/dist/assets/McpQueryDetailPage-DhqEI180.js +5 -0
  326. package/dashboard/dist/assets/McpQueryDetailPage-DhqEI180.js.map +1 -0
  327. package/dashboard/dist/assets/McpQueryPage-CIiVMlqo.js +2 -0
  328. package/dashboard/dist/assets/McpQueryPage-CIiVMlqo.js.map +1 -0
  329. package/dashboard/dist/assets/McpRunDetailPage-9xdxgG4d.js +2 -0
  330. package/dashboard/dist/assets/McpRunDetailPage-9xdxgG4d.js.map +1 -0
  331. package/dashboard/dist/assets/McpRunsPage-wWLqHsd4.js +2 -0
  332. package/dashboard/dist/assets/McpRunsPage-wWLqHsd4.js.map +1 -0
  333. package/dashboard/dist/assets/Modal-kB_P7ZOr.js +2 -0
  334. package/dashboard/dist/assets/{Modal-B4rbIVAn.js.map → Modal-kB_P7ZOr.js.map} +1 -1
  335. package/dashboard/dist/assets/OperatorDashboard-jc0vrgDI.js +2 -0
  336. package/dashboard/dist/assets/OperatorDashboard-jc0vrgDI.js.map +1 -0
  337. package/dashboard/dist/assets/PageHeader-NkOeBR05.js +2 -0
  338. package/dashboard/dist/assets/PageHeader-NkOeBR05.js.map +1 -0
  339. package/dashboard/dist/assets/PageHeaderWithStats-ywNhrmFK.js +2 -0
  340. package/dashboard/dist/assets/PageHeaderWithStats-ywNhrmFK.js.map +1 -0
  341. package/dashboard/dist/assets/PriorityBadge-B2MQbSxy.js +2 -0
  342. package/dashboard/dist/assets/{PriorityBadge-DfQY9St9.js.map → PriorityBadge-B2MQbSxy.js.map} +1 -1
  343. package/dashboard/dist/assets/ProcessDetailPage-B7z7IdqE.js +2 -0
  344. package/dashboard/dist/assets/ProcessDetailPage-B7z7IdqE.js.map +1 -0
  345. package/dashboard/dist/assets/ProcessesListPage-C-uHadO6.js +2 -0
  346. package/dashboard/dist/assets/ProcessesListPage-C-uHadO6.js.map +1 -0
  347. package/dashboard/dist/assets/RolePill-C1dgC-fK.js +2 -0
  348. package/dashboard/dist/assets/{RolePill-BTPa8L-P.js.map → RolePill-C1dgC-fK.js.map} +1 -1
  349. package/dashboard/dist/assets/RolesPage-BSxrD1vm.js +2 -0
  350. package/dashboard/dist/assets/RolesPage-BSxrD1vm.js.map +1 -0
  351. package/dashboard/dist/assets/RowActions-lYaHGI-v.js +2 -0
  352. package/dashboard/dist/assets/{RowActions-Dg-Fsm5O.js.map → RowActions-lYaHGI-v.js.map} +1 -1
  353. package/dashboard/dist/assets/RunAsSelector-CJDnyp93.js +2 -0
  354. package/dashboard/dist/assets/RunAsSelector-CJDnyp93.js.map +1 -0
  355. package/dashboard/dist/assets/StatCard-v2TiITVr.js +2 -0
  356. package/dashboard/dist/assets/{StatCard-DlgF0CJC.js.map → StatCard-v2TiITVr.js.map} +1 -1
  357. package/dashboard/dist/assets/StatusBadge-DWlxevgG.js +2 -0
  358. package/dashboard/dist/assets/StatusBadge-DWlxevgG.js.map +1 -0
  359. package/dashboard/dist/assets/StepIndicator-CRM4ft28.js +2 -0
  360. package/dashboard/dist/assets/StepIndicator-CRM4ft28.js.map +1 -0
  361. package/dashboard/dist/assets/StickyPagination-CF0EToEU.js +2 -0
  362. package/dashboard/dist/assets/{StickyPagination-F9FZsRy9.js.map → StickyPagination-CF0EToEU.js.map} +1 -1
  363. package/dashboard/dist/assets/SwimlaneTimeline-CNlj7fgg.js +2 -0
  364. package/dashboard/dist/assets/SwimlaneTimeline-CNlj7fgg.js.map +1 -0
  365. package/dashboard/dist/assets/TagInput-CH8qMGhC.js +2 -0
  366. package/dashboard/dist/assets/TagInput-CH8qMGhC.js.map +1 -0
  367. package/dashboard/dist/assets/TaskDetailPage-CdWo-6mu.js +2 -0
  368. package/dashboard/dist/assets/TaskDetailPage-CdWo-6mu.js.map +1 -0
  369. package/dashboard/dist/assets/TaskQueuePill-BPj4ogVG.js +2 -0
  370. package/dashboard/dist/assets/{TaskQueuePill-awmtb0qw.js.map → TaskQueuePill-BPj4ogVG.js.map} +1 -1
  371. package/dashboard/dist/assets/TasksListPage-CtRkMpKU.js +2 -0
  372. package/dashboard/dist/assets/{TasksListPage-C_QF23c1.js.map → TasksListPage-CtRkMpKU.js.map} +1 -1
  373. package/dashboard/dist/assets/TimeAgo-Di1a3X5P.js +2 -0
  374. package/dashboard/dist/assets/TimeAgo-Di1a3X5P.js.map +1 -0
  375. package/dashboard/dist/assets/TimestampCell-CqrXql-S.js +2 -0
  376. package/dashboard/dist/assets/TimestampCell-CqrXql-S.js.map +1 -0
  377. package/dashboard/dist/assets/UserName-BUFYCnRa.js +2 -0
  378. package/dashboard/dist/assets/{UserName-DaP4YAKr.js.map → UserName-BUFYCnRa.js.map} +1 -1
  379. package/dashboard/dist/assets/WorkflowExecutionPage-25iusMml.js +2 -0
  380. package/dashboard/dist/assets/WorkflowExecutionPage-25iusMml.js.map +1 -0
  381. package/dashboard/dist/assets/WorkflowPill-DPKOcbf4.js +2 -0
  382. package/dashboard/dist/assets/WorkflowPill-DPKOcbf4.js.map +1 -0
  383. package/dashboard/dist/assets/WorkflowsDashboard-BgxslssH.js +2 -0
  384. package/dashboard/dist/assets/WorkflowsDashboard-BgxslssH.js.map +1 -0
  385. package/dashboard/dist/assets/WorkflowsOverview-Doe5L-Re.js +2 -0
  386. package/dashboard/dist/assets/{WorkflowsOverview-D9OzzQqw.js.map → WorkflowsOverview-Doe5L-Re.js.map} +1 -1
  387. package/dashboard/dist/assets/YamlWorkflowsPage-BliAckJ6.js +2 -0
  388. package/dashboard/dist/assets/YamlWorkflowsPage-BliAckJ6.js.map +1 -0
  389. package/dashboard/dist/assets/{bots-BkKVMbUW.js → bots-Bi2_O1Ts.js} +2 -2
  390. package/dashboard/dist/assets/{bots-BkKVMbUW.js.map → bots-Bi2_O1Ts.js.map} +1 -1
  391. package/dashboard/dist/assets/constants-BHkpVaqx.js +2 -0
  392. package/dashboard/dist/assets/constants-BHkpVaqx.js.map +1 -0
  393. package/dashboard/dist/assets/escalation-Ck1KlLkT.js +2 -0
  394. package/dashboard/dist/assets/escalation-Ck1KlLkT.js.map +1 -0
  395. package/dashboard/dist/assets/escalation-columns-ohDsj2eJ.js +2 -0
  396. package/dashboard/dist/assets/{escalation-columns-D6aqStaY.js.map → escalation-columns-ohDsj2eJ.js.map} +1 -1
  397. package/dashboard/dist/assets/helpers-BoD2SgUY.js +2 -0
  398. package/dashboard/dist/assets/helpers-BoD2SgUY.js.map +1 -0
  399. package/dashboard/dist/assets/index-BEtLIsML.js +2 -0
  400. package/dashboard/dist/assets/index-BEtLIsML.js.map +1 -0
  401. package/dashboard/dist/assets/index-Bn2xHDr8.js +5 -0
  402. package/dashboard/dist/assets/index-Bn2xHDr8.js.map +1 -0
  403. package/dashboard/dist/assets/index-BpT-6WgJ.js +2 -0
  404. package/dashboard/dist/assets/{index-DTPzZr_X.js.map → index-BpT-6WgJ.js.map} +1 -1
  405. package/dashboard/dist/assets/index-CZrJ09p-.js +2 -0
  406. package/dashboard/dist/assets/index-CZrJ09p-.js.map +1 -0
  407. package/dashboard/dist/assets/index-D3NyVADW.js +2 -0
  408. package/dashboard/dist/assets/index-D3NyVADW.js.map +1 -0
  409. package/dashboard/dist/assets/index-D7zYZOnH.js +2 -0
  410. package/dashboard/dist/assets/index-D7zYZOnH.js.map +1 -0
  411. package/dashboard/dist/assets/index-DOkHXmyf.js +17 -0
  412. package/dashboard/dist/assets/index-DOkHXmyf.js.map +1 -0
  413. package/dashboard/dist/assets/index-DYyLF-Qb.js +281 -0
  414. package/dashboard/dist/assets/index-DYyLF-Qb.js.map +1 -0
  415. package/dashboard/dist/assets/index-Dk2Q51o0.js +2 -0
  416. package/dashboard/dist/assets/index-Dk2Q51o0.js.map +1 -0
  417. package/dashboard/dist/assets/index-FuohTtaM.js +6 -0
  418. package/dashboard/dist/assets/index-FuohTtaM.js.map +1 -0
  419. package/dashboard/dist/assets/index-PyCTS05D.css +1 -0
  420. package/dashboard/dist/assets/mcp-CJtYjA7A.js +2 -0
  421. package/dashboard/dist/assets/mcp-CJtYjA7A.js.map +1 -0
  422. package/dashboard/dist/assets/mcp-query-jQJQrs_7.js +2 -0
  423. package/dashboard/dist/assets/mcp-query-jQJQrs_7.js.map +1 -0
  424. package/dashboard/dist/assets/{mcp-runs-ChPbpvXK.js → mcp-runs-DUWm9Z4V.js} +2 -2
  425. package/dashboard/dist/assets/{mcp-runs-ChPbpvXK.js.map → mcp-runs-DUWm9Z4V.js.map} +1 -1
  426. package/dashboard/dist/assets/namespaces-BM5P2qmL.js +2 -0
  427. package/dashboard/dist/assets/{namespaces-BgbaC3ow.js.map → namespaces-BM5P2qmL.js.map} +1 -1
  428. package/dashboard/dist/assets/{roles-ZNrqqnQl.js → roles-lv0shpjJ.js} +2 -2
  429. package/dashboard/dist/assets/{roles-ZNrqqnQl.js.map → roles-lv0shpjJ.js.map} +1 -1
  430. package/dashboard/dist/assets/settings-Wlq92mRo.js +2 -0
  431. package/dashboard/dist/assets/{settings-eBRSE0mQ.js.map → settings-Wlq92mRo.js.map} +1 -1
  432. package/dashboard/dist/assets/tasks-BFGm4PuE.js +2 -0
  433. package/dashboard/dist/assets/{tasks-tRqClPns.js.map → tasks-BFGm4PuE.js.map} +1 -1
  434. package/dashboard/dist/assets/useEventHooks-DIE6ue4x.js +2 -0
  435. package/dashboard/dist/assets/useEventHooks-DIE6ue4x.js.map +1 -0
  436. package/dashboard/dist/assets/useExpandedRows-Cg9iq6Vy.js +2 -0
  437. package/dashboard/dist/assets/useExpandedRows-Cg9iq6Vy.js.map +1 -0
  438. package/dashboard/dist/assets/{useFilterParams-BaXUAkYK.js → useFilterParams-BUyLHcx_.js} +2 -2
  439. package/dashboard/dist/assets/{useFilterParams-BaXUAkYK.js.map → useFilterParams-BUyLHcx_.js.map} +1 -1
  440. package/dashboard/dist/assets/{useYamlActivityEvents-BO51u8tm.js → useYamlActivityEvents-DCwSO73t.js} +2 -2
  441. package/dashboard/dist/assets/useYamlActivityEvents-DCwSO73t.js.map +1 -0
  442. package/dashboard/dist/assets/{users-tMvNyOo8.js → users-tA5-K0wA.js} +2 -2
  443. package/dashboard/dist/assets/{users-tMvNyOo8.js.map → users-tA5-K0wA.js.map} +1 -1
  444. package/dashboard/dist/assets/vendor-icons-BiIug1SK.js +402 -0
  445. package/dashboard/dist/assets/vendor-icons-BiIug1SK.js.map +1 -0
  446. package/dashboard/dist/assets/vendor-query-DLp59M9_.js +35 -0
  447. package/dashboard/dist/assets/vendor-query-DLp59M9_.js.map +1 -0
  448. package/dashboard/dist/assets/vendor-react-Co3Y8ikm.js +26 -0
  449. package/dashboard/dist/assets/vendor-react-Co3Y8ikm.js.map +1 -0
  450. package/dashboard/dist/assets/{workflows-Cc4VHcrp.js → workflows-CfLc15Wr.js} +2 -2
  451. package/dashboard/dist/assets/{workflows-Cc4VHcrp.js.map → workflows-CfLc15Wr.js.map} +1 -1
  452. package/dashboard/dist/assets/yaml-workflows-D7JXNqbM.js +2 -0
  453. package/dashboard/dist/assets/yaml-workflows-D7JXNqbM.js.map +1 -0
  454. package/dashboard/dist/index.html +5 -5
  455. package/docs/api/dba.md +81 -0
  456. package/docs/api/escalations.md +575 -0
  457. package/docs/api/exports.md +170 -0
  458. package/docs/api/maintenance.md +93 -0
  459. package/docs/api/mcp-runs.md +128 -0
  460. package/docs/api/mcp-servers.md +253 -0
  461. package/docs/api/namespaces.md +48 -0
  462. package/docs/api/roles.md +390 -0
  463. package/docs/api/service-accounts.md +188 -0
  464. package/docs/api/settings.md +33 -0
  465. package/docs/api/tasks.md +167 -0
  466. package/docs/api/users.md +180 -0
  467. package/docs/api/workflows.md +616 -0
  468. package/docs/api/yaml-workflows.md +312 -0
  469. package/docs/architecture.md +221 -0
  470. package/docs/auth.md +181 -0
  471. package/docs/cloud.md +272 -0
  472. package/docs/compilation.md +136 -0
  473. package/docs/contributing.md +56 -0
  474. package/docs/dashboard.md +145 -0
  475. package/docs/data.md +478 -0
  476. package/docs/escalation-strategies.md +263 -0
  477. package/docs/events.md +251 -0
  478. package/docs/iam.md +222 -0
  479. package/docs/img/01-login.png +0 -0
  480. package/docs/img/02-dashboard-home.png +0 -0
  481. package/docs/img/03-processes-list.png +0 -0
  482. package/docs/img/04-escalations-list.png +0 -0
  483. package/docs/img/05-mcp-servers.png +0 -0
  484. package/docs/img/06-mcp-pipelines.png +0 -0
  485. package/docs/img/07-workflows-list.png +0 -0
  486. package/docs/img/compilation/01-query-submit.png +0 -0
  487. package/docs/img/compilation/02-mcp-servers.png +0 -0
  488. package/docs/img/compilation/03-query-completed.png +0 -0
  489. package/docs/img/compilation/04-wizard-original.png +0 -0
  490. package/docs/img/compilation/05-wizard-timeline.png +0 -0
  491. package/docs/img/compilation/06-wizard-profile.png +0 -0
  492. package/docs/img/compilation/07-wizard-deploy.png +0 -0
  493. package/docs/img/compilation/08-wizard-test-modal.png +0 -0
  494. package/docs/img/compilation/09-wizard-test-compare.png +0 -0
  495. package/docs/img/compilation/10-wizard-verify.png +0 -0
  496. package/docs/logging.md +110 -0
  497. package/docs/maintenance.md +221 -0
  498. package/docs/mcp.md +985 -0
  499. package/docs/oauth-and-delegation.md +469 -0
  500. package/docs/telemetry.md +144 -0
  501. package/docs/workflows.md +695 -0
  502. package/package.json +8 -9
  503. package/build/services/db/index.d.ts +0 -3
  504. package/build/services/mcp/vision-server.d.ts +0 -15
  505. package/build/services/mcp/vision-server.js +0 -214
  506. package/build/system/mcp-servers/document-vision.js +0 -228
  507. package/build/system/mcp-servers/prompts.d.ts +0 -4
  508. package/build/system/mcp-servers/prompts.js +0 -10
  509. package/dashboard/dist/assets/AdminDashboard-jfacvOC7.js +0 -2
  510. package/dashboard/dist/assets/AdminDashboard-jfacvOC7.js.map +0 -1
  511. package/dashboard/dist/assets/AvailableEscalationsPage-BglLDoT8.js +0 -2
  512. package/dashboard/dist/assets/AvailableEscalationsPage-BglLDoT8.js.map +0 -1
  513. package/dashboard/dist/assets/BotPicker-D6FYW1Gt.js +0 -2
  514. package/dashboard/dist/assets/CollapsibleSection-Cxk4wvjT.js +0 -2
  515. package/dashboard/dist/assets/ConfirmDeleteModal-FSXyKjaB.js +0 -2
  516. package/dashboard/dist/assets/CopyableId-CBdxWfp8.js +0 -2
  517. package/dashboard/dist/assets/CredentialsPage-Ikzsot0w.js +0 -2
  518. package/dashboard/dist/assets/CredentialsPage-Ikzsot0w.js.map +0 -1
  519. package/dashboard/dist/assets/CustomDurationPicker-CAninCbl.js +0 -2
  520. package/dashboard/dist/assets/DataTable-BDn1WBHS.js +0 -2
  521. package/dashboard/dist/assets/DataTable-BDn1WBHS.js.map +0 -1
  522. package/dashboard/dist/assets/EmptyState-2CmV-IaS.js +0 -2
  523. package/dashboard/dist/assets/EscalationsOverview-GXYFPASS.js +0 -2
  524. package/dashboard/dist/assets/EventTable-B01oJf6Y.js +0 -2
  525. package/dashboard/dist/assets/Field-DuFBAYhu.js +0 -2
  526. package/dashboard/dist/assets/Field-DuFBAYhu.js.map +0 -1
  527. package/dashboard/dist/assets/FilterBar-Ck4K4rzu.js +0 -2
  528. package/dashboard/dist/assets/McpOverview-JkvRcX2e.js +0 -2
  529. package/dashboard/dist/assets/McpQueryDetailPage-CUMqhQdS.js +0 -2
  530. package/dashboard/dist/assets/McpQueryDetailPage-CUMqhQdS.js.map +0 -1
  531. package/dashboard/dist/assets/McpQueryPage-DRRhw4nN.js +0 -2
  532. package/dashboard/dist/assets/McpQueryPage-DRRhw4nN.js.map +0 -1
  533. package/dashboard/dist/assets/McpRunDetailPage-CmPs5EvE.js +0 -2
  534. package/dashboard/dist/assets/McpRunDetailPage-CmPs5EvE.js.map +0 -1
  535. package/dashboard/dist/assets/McpRunsPage-Dl5Y2u6k.js +0 -2
  536. package/dashboard/dist/assets/McpRunsPage-Dl5Y2u6k.js.map +0 -1
  537. package/dashboard/dist/assets/Modal-B4rbIVAn.js +0 -2
  538. package/dashboard/dist/assets/OperatorDashboard-B56il28q.js +0 -2
  539. package/dashboard/dist/assets/OperatorDashboard-B56il28q.js.map +0 -1
  540. package/dashboard/dist/assets/PageHeader-CpWFly5S.js +0 -2
  541. package/dashboard/dist/assets/PageHeader-CpWFly5S.js.map +0 -1
  542. package/dashboard/dist/assets/PriorityBadge-DfQY9St9.js +0 -2
  543. package/dashboard/dist/assets/ProcessDetailPage-CMLq4M7D.js +0 -2
  544. package/dashboard/dist/assets/ProcessDetailPage-CMLq4M7D.js.map +0 -1
  545. package/dashboard/dist/assets/ProcessesListPage-CZ_HF06v.js +0 -2
  546. package/dashboard/dist/assets/ProcessesListPage-CZ_HF06v.js.map +0 -1
  547. package/dashboard/dist/assets/RolePill-BTPa8L-P.js +0 -2
  548. package/dashboard/dist/assets/RolesPage-9grZW7yR.js +0 -2
  549. package/dashboard/dist/assets/RolesPage-9grZW7yR.js.map +0 -1
  550. package/dashboard/dist/assets/RowActions-Dg-Fsm5O.js +0 -2
  551. package/dashboard/dist/assets/SimpleMarkdown-CBlvaWP4.js +0 -4
  552. package/dashboard/dist/assets/SimpleMarkdown-CBlvaWP4.js.map +0 -1
  553. package/dashboard/dist/assets/StatCard-DlgF0CJC.js +0 -2
  554. package/dashboard/dist/assets/StatusBadge-TlC4jiig.js +0 -2
  555. package/dashboard/dist/assets/StatusBadge-TlC4jiig.js.map +0 -1
  556. package/dashboard/dist/assets/StickyPagination-F9FZsRy9.js +0 -2
  557. package/dashboard/dist/assets/SwimlaneTimeline-7SiwATsZ.js +0 -2
  558. package/dashboard/dist/assets/SwimlaneTimeline-7SiwATsZ.js.map +0 -1
  559. package/dashboard/dist/assets/TaskDetailPage-CbPVTakt.js +0 -2
  560. package/dashboard/dist/assets/TaskDetailPage-CbPVTakt.js.map +0 -1
  561. package/dashboard/dist/assets/TaskQueuePill-awmtb0qw.js +0 -2
  562. package/dashboard/dist/assets/TasksListPage-C_QF23c1.js +0 -2
  563. package/dashboard/dist/assets/TimeAgo-UPG6DoH8.js +0 -2
  564. package/dashboard/dist/assets/TimeAgo-UPG6DoH8.js.map +0 -1
  565. package/dashboard/dist/assets/TimestampCell-DoWMKg6w.js +0 -2
  566. package/dashboard/dist/assets/TimestampCell-DoWMKg6w.js.map +0 -1
  567. package/dashboard/dist/assets/UserName-DaP4YAKr.js +0 -2
  568. package/dashboard/dist/assets/VersionHistory-Bt7WBr6m.js +0 -5
  569. package/dashboard/dist/assets/VersionHistory-Bt7WBr6m.js.map +0 -1
  570. package/dashboard/dist/assets/WorkflowExecutionPage-DjtAQ3hy.js +0 -2
  571. package/dashboard/dist/assets/WorkflowExecutionPage-DjtAQ3hy.js.map +0 -1
  572. package/dashboard/dist/assets/WorkflowPill-CCDSVaQj.js +0 -2
  573. package/dashboard/dist/assets/WorkflowPill-CCDSVaQj.js.map +0 -1
  574. package/dashboard/dist/assets/WorkflowsDashboard-D8z9uBNB.js +0 -2
  575. package/dashboard/dist/assets/WorkflowsDashboard-D8z9uBNB.js.map +0 -1
  576. package/dashboard/dist/assets/WorkflowsOverview-D9OzzQqw.js +0 -2
  577. package/dashboard/dist/assets/YamlWorkflowDetailPage-DrDvvP62.js +0 -3
  578. package/dashboard/dist/assets/YamlWorkflowDetailPage-DrDvvP62.js.map +0 -1
  579. package/dashboard/dist/assets/YamlWorkflowsPage-COqiNCQK.js +0 -2
  580. package/dashboard/dist/assets/YamlWorkflowsPage-COqiNCQK.js.map +0 -1
  581. package/dashboard/dist/assets/constants-CgaZfe5d.js +0 -2
  582. package/dashboard/dist/assets/constants-CgaZfe5d.js.map +0 -1
  583. package/dashboard/dist/assets/escalation-columns-D6aqStaY.js +0 -2
  584. package/dashboard/dist/assets/escalation-qalymbKB.js +0 -2
  585. package/dashboard/dist/assets/escalation-qalymbKB.js.map +0 -1
  586. package/dashboard/dist/assets/format-gXZXQ-HJ.js +0 -2
  587. package/dashboard/dist/assets/format-gXZXQ-HJ.js.map +0 -1
  588. package/dashboard/dist/assets/helpers-0gSleuzT.js +0 -2
  589. package/dashboard/dist/assets/helpers-0gSleuzT.js.map +0 -1
  590. package/dashboard/dist/assets/index-BWvMHed7.js +0 -6
  591. package/dashboard/dist/assets/index-BWvMHed7.js.map +0 -1
  592. package/dashboard/dist/assets/index-BaszoPO_.css +0 -1
  593. package/dashboard/dist/assets/index-Cn2jyj9A.js +0 -2
  594. package/dashboard/dist/assets/index-Cn2jyj9A.js.map +0 -1
  595. package/dashboard/dist/assets/index-D8VH6K8B.js +0 -54
  596. package/dashboard/dist/assets/index-D8VH6K8B.js.map +0 -1
  597. package/dashboard/dist/assets/index-D9SYwJsi.js +0 -3
  598. package/dashboard/dist/assets/index-D9SYwJsi.js.map +0 -1
  599. package/dashboard/dist/assets/index-DTPzZr_X.js +0 -2
  600. package/dashboard/dist/assets/index-D_6AB5BE.js +0 -2
  601. package/dashboard/dist/assets/index-D_6AB5BE.js.map +0 -1
  602. package/dashboard/dist/assets/index-S9Ks2Lj2.js +0 -2
  603. package/dashboard/dist/assets/index-S9Ks2Lj2.js.map +0 -1
  604. package/dashboard/dist/assets/index-X85K5bHC.js +0 -17
  605. package/dashboard/dist/assets/index-X85K5bHC.js.map +0 -1
  606. package/dashboard/dist/assets/index-rjmgHlSH.js +0 -2
  607. package/dashboard/dist/assets/index-rjmgHlSH.js.map +0 -1
  608. package/dashboard/dist/assets/mcp-blCW6IL7.js +0 -2
  609. package/dashboard/dist/assets/mcp-blCW6IL7.js.map +0 -1
  610. package/dashboard/dist/assets/mcp-query-DoAyPbjC.js +0 -2
  611. package/dashboard/dist/assets/mcp-query-DoAyPbjC.js.map +0 -1
  612. package/dashboard/dist/assets/namespaces-BgbaC3ow.js +0 -2
  613. package/dashboard/dist/assets/settings-eBRSE0mQ.js +0 -2
  614. package/dashboard/dist/assets/tasks-tRqClPns.js +0 -2
  615. package/dashboard/dist/assets/useNatsEvents-Xr43X1fG.js +0 -2
  616. package/dashboard/dist/assets/useNatsEvents-Xr43X1fG.js.map +0 -1
  617. package/dashboard/dist/assets/useYamlActivityEvents-BO51u8tm.js.map +0 -1
  618. package/dashboard/dist/assets/vendor-icons-ZTAKVwGc.js +0 -292
  619. package/dashboard/dist/assets/vendor-icons-ZTAKVwGc.js.map +0 -1
  620. package/dashboard/dist/assets/vendor-query-B2UbickB.js +0 -18
  621. package/dashboard/dist/assets/vendor-query-B2UbickB.js.map +0 -1
  622. package/dashboard/dist/assets/vendor-react-Cw8Gy8NJ.js +0 -22
  623. package/dashboard/dist/assets/vendor-react-Cw8Gy8NJ.js.map +0 -1
  624. package/dashboard/dist/assets/yaml-workflows-BL4V5CQy.js +0 -2
  625. package/dashboard/dist/assets/yaml-workflows-BL4V5CQy.js.map +0 -1
  626. package/services/db/README.md +0 -8
  627. /package/build/{services → lib}/db/migrate.d.ts +0 -0
  628. /package/{services → build/lib}/db/schemas/002_seed.sql +0 -0
  629. /package/{services → build/lib}/db/schemas/003_workflow_discovery.sql +0 -0
  630. /package/{services → build/lib}/db/schemas/004_query_router.sql +0 -0
  631. /package/{services → build/lib}/db/schemas/005_triage_router.sql +0 -0
  632. /package/{services → build/lib}/db/schemas/006_oauth.sql +0 -0
  633. /package/{services → build/lib}/db/schemas/007_security.sql +0 -0
  634. /package/{services → build/lib}/db/schemas/008_bot_accounts.sql +0 -0
  635. /package/{services → build/lib}/db/schemas/009_audit_trail.sql +0 -0
  636. /package/{services → build/lib}/db/schemas/010_credential_providers.sql +0 -0
  637. /package/{services → build/lib}/db/schemas/012_drop_modality.sql +0 -0
  638. /package/{services → build/lib}/db/schemas/013_execute_as.sql +0 -0
  639. /package/{services → build/lib}/db/schemas/014_ephemeral_credentials.sql +0 -0
  640. /package/build/{services → lib}/events/index.d.ts +0 -0
  641. /package/build/{services → lib}/events/index.js +0 -0
  642. /package/build/{services → lib}/events/memory.d.ts +0 -0
  643. /package/build/{services → lib}/events/memory.js +0 -0
  644. /package/build/{services → lib}/events/nats.d.ts +0 -0
  645. /package/build/{services → lib}/events/nats.js +0 -0
  646. /package/build/{services → lib}/events/publish.d.ts +0 -0
  647. /package/build/{services → lib}/events/publish.js +0 -0
  648. /package/build/{services → lib}/events/socketio.d.ts +0 -0
  649. /package/build/{services → lib}/events/socketio.js +0 -0
  650. /package/build/{services → lib}/logger/index.d.ts +0 -0
  651. /package/build/{services → lib}/logger/index.js +0 -0
  652. /package/build/{services → lib}/logger/pino.d.ts +0 -0
  653. /package/build/{services → lib}/logger/pino.js +0 -0
  654. /package/build/{services → lib}/storage/index.d.ts +0 -0
  655. /package/build/{services → lib}/storage/index.js +0 -0
  656. /package/build/{services → lib}/storage/local.d.ts +0 -0
  657. /package/build/{services → lib}/storage/local.js +0 -0
  658. /package/build/{services → lib}/storage/s3.d.ts +0 -0
  659. /package/build/{services → lib}/storage/s3.js +0 -0
  660. /package/build/{services → lib}/storage/types.d.ts +0 -0
  661. /package/build/{services → lib}/storage/types.js +0 -0
  662. /package/build/{services → lib}/telemetry/index.d.ts +0 -0
  663. /package/build/{services → lib}/telemetry/index.js +0 -0
package/docs/mcp.md ADDED
@@ -0,0 +1,985 @@
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
+ - [Everything is a Tool](#everything-is-a-tool)
8
+ - [Humans as Tools](#humans-as-tools)
9
+ - [Compiled Workflows as Tools](#compiled-workflows-as-tools)
10
+ - [The Cycle](#the-cycle)
11
+ - [Human Queue Server](#human-queue-server) — escalation as MCP tools
12
+ - [Document Vision Server](#document-vision-server) — AI tools as 3 MCP tools
13
+ - [MCP-Native Workflow](#mcp-native-workflow) — both sides MCP, end to end
14
+ - [Server Registration Lifecycle](#server-registration-lifecycle) — two paths, startup sequence, when things connect
15
+ - [External MCP Servers](#external-mcp-servers) — Path B: dashboard/API registration
16
+ - [Built-in Servers](#built-in-servers) — servers that ship by default
17
+ - [Configuration](#configuration)
18
+ - [REST API](#rest-api) — server registration and management
19
+ - [Database Schema](#database-schema)
20
+ - [Testing](#testing) — InMemoryTransport and functional tests
21
+ - [Custom Adapters](#custom-adapters)
22
+
23
+ ## Everything is a Tool
24
+
25
+ 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.
26
+
27
+ The protocol is the same whether the caller is deterministic code, an LLM, or a human clicking a button.
28
+
29
+ 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.
30
+
31
+ Every one of these activities is also an MCP tool. Register an MCP server and its tools become proxy activities automatically:
32
+
33
+ ```typescript
34
+ import { Durable } from '@hotmeshio/hotmesh';
35
+ import { McpClient } from '@hotmeshio/long-tail';
36
+
37
+ const tools = await McpClient.toolActivities(serverId);
38
+ const { mcp_analyzer_classify } = Durable.workflow.proxyActivities<typeof tools>({
39
+ activities: tools,
40
+ });
41
+
42
+ export async function classifyDocument(envelope: LTEnvelope) {
43
+ const result = await mcp_analyzer_classify({ content: envelope.data.content });
44
+
45
+ if (result.confidence >= 0.85) {
46
+ return { type: 'return', data: result };
47
+ }
48
+ return { type: 'escalation', data: result, message: 'Low confidence', role: 'reviewer' };
49
+ }
50
+ ```
51
+
52
+ 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.
53
+
54
+ ### Humans as Tools
55
+
56
+ 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.
57
+
58
+ ```
59
+ MCP Server: "long-tail-human-queue"
60
+
61
+ Tools:
62
+ - escalate_to_human(role, message, data) → escalation_id
63
+ - escalate_and_wait(role, message, data) → blocks until resolved, returns payload
64
+ - check_resolution(escalation_id) → resolved | pending
65
+ - get_available_work(role) → escalation[]
66
+ - claim_and_resolve(escalation_id, payload) → result
67
+ ```
68
+
69
+ An AI agent working the queue:
70
+
71
+ ```typescript
72
+ import { Client } from '@modelcontextprotocol/sdk/client';
73
+
74
+ const client = new Client({ name: 'my-agent', version: '1.0.0' });
75
+ await client.connect(transport);
76
+
77
+ const work = await client.callTool({
78
+ name: 'get_available_work',
79
+ arguments: { role: 'reviewer' },
80
+ });
81
+
82
+ await client.callTool({
83
+ name: 'claim_and_resolve',
84
+ arguments: {
85
+ escalation_id: 'esc-abc123',
86
+ resolver_id: 'my-agent',
87
+ payload: { approved: true, note: 'Verified by automated review' },
88
+ },
89
+ });
90
+ ```
91
+
92
+ 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.
93
+
94
+ ### Compiled Workflows as Tools
95
+
96
+ 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:
97
+
98
+ ```
99
+ MCP Server: "long-tail-mcp-workflows"
100
+
101
+ Tools:
102
+ - list_workflows() → available compiled workflows
103
+ - get_workflow(workflow_name) → schema, manifest, provenance
104
+ - invoke_workflow(workflow_name, input, async?) → result or job_id
105
+ ```
106
+
107
+ An agent encountering a familiar edge case checks for a compiled solution before falling back to dynamic triage:
108
+
109
+ ```typescript
110
+ const available = await client.callTool({
111
+ name: 'list_workflows',
112
+ arguments: { status: 'active' },
113
+ });
114
+
115
+ await client.callTool({
116
+ name: 'invoke_workflow',
117
+ arguments: {
118
+ workflow_name: 'rotate-and-extract',
119
+ input: { document: 'page1_upside_down.png', rotation: 180 },
120
+ },
121
+ });
122
+ ```
123
+
124
+ 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.
125
+
126
+ ### The Cycle
127
+
128
+ This is how the system evolves:
129
+
130
+ ```
131
+ 1. Engineer writes workflow, calling tools (proxy activities)
132
+ 2. Workflow escalates when confidence is low
133
+ 3. Human resolves — or flags for triage
134
+ 4. Triage agent calls the SAME tools dynamically to fix the issue
135
+ 5. Successful fix is compiled into a deterministic workflow
136
+ 6. That workflow becomes a new tool on a new server
137
+ 7. Next time, the deterministic workflow handles it — no LLM, no human
138
+ 8. The triage agent discovers it has one more tool available
139
+ ```
140
+
141
+ 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.
142
+
143
+ The sections above describe the concept. The rest of this guide covers the concrete servers, tools, and APIs that implement it.
144
+
145
+ ## Human Queue Server
146
+
147
+ 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.
148
+
149
+ ### Tools
150
+
151
+ #### `escalate_to_human`
152
+
153
+ Create a new escalation for human review.
154
+
155
+ | Parameter | Type | Required | Description |
156
+ |-----------|------|----------|-------------|
157
+ | `role` | string | yes | Target role (e.g., `"reviewer"`) |
158
+ | `message` | string | yes | What needs human review |
159
+ | `data` | object | no | Contextual data for the reviewer |
160
+ | `type` | string | no | Classification (default: `"mcp"`) |
161
+ | `subtype` | string | no | Subtype (default: `"tool_call"`) |
162
+ | `priority` | number | no | 1 (highest) to 4 (lowest), default: 2 |
163
+
164
+ Returns:
165
+
166
+ ```json
167
+ {
168
+ "escalation_id": "uuid",
169
+ "status": "pending",
170
+ "role": "reviewer",
171
+ "created_at": "2025-01-15T10:30:00Z"
172
+ }
173
+ ```
174
+
175
+ #### `check_resolution`
176
+
177
+ Check the status of an escalation.
178
+
179
+ | Parameter | Type | Required | Description |
180
+ |-----------|------|----------|-------------|
181
+ | `escalation_id` | string | yes | The escalation ID to check |
182
+
183
+ Returns:
184
+
185
+ ```json
186
+ {
187
+ "escalation_id": "uuid",
188
+ "status": "pending"
189
+ }
190
+ ```
191
+
192
+ When resolved:
193
+
194
+ ```json
195
+ {
196
+ "escalation_id": "uuid",
197
+ "status": "resolved",
198
+ "resolver_payload": { "approved": true, "note": "..." },
199
+ "resolved_at": "2025-01-15T11:00:00Z"
200
+ }
201
+ ```
202
+
203
+ Returns `isError: true` if the escalation doesn't exist.
204
+
205
+ #### `get_available_work`
206
+
207
+ List pending, unassigned escalations for a role.
208
+
209
+ | Parameter | Type | Required | Description |
210
+ |-----------|------|----------|-------------|
211
+ | `role` | string | yes | Role to filter by |
212
+ | `limit` | number | no | Max results (default: 10) |
213
+
214
+ Returns:
215
+
216
+ ```json
217
+ {
218
+ "count": 2,
219
+ "escalations": [
220
+ {
221
+ "escalation_id": "uuid",
222
+ "type": "mcp",
223
+ "subtype": "tool_call",
224
+ "description": "Address mismatch for MBR-2024-001",
225
+ "priority": 2,
226
+ "role": "reviewer",
227
+ "created_at": "2025-01-15T10:30:00Z"
228
+ }
229
+ ]
230
+ }
231
+ ```
232
+
233
+ #### `claim_and_resolve`
234
+
235
+ Claim an escalation and resolve it in one atomic operation.
236
+
237
+ | Parameter | Type | Required | Description |
238
+ |-----------|------|----------|-------------|
239
+ | `escalation_id` | string | yes | The escalation to resolve |
240
+ | `resolver_id` | string | yes | Who/what is resolving (e.g., `"my-agent"`) |
241
+ | `payload` | object | yes | Resolution data |
242
+
243
+ Returns:
244
+
245
+ ```json
246
+ {
247
+ "escalation_id": "uuid",
248
+ "status": "resolved",
249
+ "resolved_at": "2025-01-15T11:00:00Z"
250
+ }
251
+ ```
252
+
253
+ Returns `isError: true` if the escalation isn't available (already claimed, already resolved, or doesn't exist).
254
+
255
+ ### Connecting
256
+
257
+ **In-process (testing or co-located agents):**
258
+
259
+ ```typescript
260
+ import { Client } from '@modelcontextprotocol/sdk/client/index.js';
261
+ import { InMemoryTransport } from '@modelcontextprotocol/sdk/inMemory.js';
262
+ import { createHumanQueueServer } from '@hotmeshio/long-tail/services/mcp/server';
263
+
264
+ const server = await createHumanQueueServer();
265
+ const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair();
266
+ await server.connect(serverTransport);
267
+
268
+ const client = new Client({ name: 'my-agent', version: '1.0.0' });
269
+ await client.connect(clientTransport);
270
+
271
+ // Now use client.callTool() to interact with the queue
272
+ const work = await client.callTool({
273
+ name: 'get_available_work',
274
+ arguments: { role: 'reviewer', limit: 50 },
275
+ });
276
+ ```
277
+
278
+ **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.
279
+
280
+ The Human Queue handles the people side. The Document Vision server handles the AI side — wrapping model capabilities as MCP tools.
281
+
282
+ ## Document Vision Server
283
+
284
+ 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.
285
+
286
+ 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.
287
+
288
+ ### Tools
289
+
290
+ | Tool | Arguments | Returns |
291
+ |------|-----------|---------|
292
+ | `list_document_pages` | *(none)* | `{ pages: string[] }` |
293
+ | `extract_member_info` | `{ image_ref, page_number }` | `{ member_info: MemberInfo \| null }` |
294
+ | `validate_member` | `{ member_info: MemberInfo }` | `{ result, databaseRecord? }` |
295
+
296
+ ### Connecting
297
+
298
+ Same `InMemoryTransport` pattern as the Human Queue:
299
+
300
+ ```typescript
301
+ import { Client as McpClient } from '@modelcontextprotocol/sdk/client/index.js';
302
+ import { InMemoryTransport } from '@modelcontextprotocol/sdk/inMemory.js';
303
+ import { createVisionServer } from '@hotmeshio/long-tail/services/mcp/vision-server';
304
+
305
+ const server = await createVisionServer();
306
+ const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair();
307
+ await server.connect(serverTransport);
308
+
309
+ const client = new McpClient({ name: 'my-vision-client', version: '1.0.0' });
310
+ await client.connect(clientTransport);
311
+
312
+ // Discover tools
313
+ const { tools } = await client.listTools();
314
+
315
+ // Call a tool
316
+ const result = await client.callTool({
317
+ name: 'list_document_pages',
318
+ arguments: {},
319
+ });
320
+ ```
321
+
322
+ ### Writing Your Own MCP Server
323
+
324
+ To wrap your own AI capabilities as MCP tools, follow the same pattern:
325
+
326
+ 1. Define Zod schemas at module level (avoids TS2589 deep inference errors)
327
+ 2. Use the singleton pattern with `create` / `stop` lifecycle
328
+ 3. Register tools with `(server as any).registerTool()` (type cast required by SDK)
329
+
330
+ See `services/mcp/vision-server.ts` and `services/mcp/server.ts` for working examples.
331
+
332
+ ## MCP-Native Workflow
333
+
334
+ 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.
335
+
336
+ ### How It Works
337
+
338
+ ```
339
+ verify-document-mcp workflow
340
+ |
341
+ +-- proxyActivities --> MCP client -- InMemoryTransport --> Vision MCP Server
342
+ | +- list_document_pages
343
+ | +- extract_member_info (-> OpenAI Vision)
344
+ | +- validate_member (-> member DB)
345
+ |
346
+ +-- return { type: 'escalation' }
347
+ |
348
+ +-- interceptor --> Human Queue MCP Server
349
+ +- check_resolution
350
+ +- get_available_work
351
+ +- claim_and_resolve
352
+ ```
353
+
354
+ ### The Activity Wrapper Pattern
355
+
356
+ 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.
357
+
358
+ ```typescript
359
+ import { Client as McpClient } from '@modelcontextprotocol/sdk/client/index.js';
360
+ import { InMemoryTransport } from '@modelcontextprotocol/sdk/inMemory.js';
361
+ import { createVisionServer } from '../../services/mcp/vision-server';
362
+
363
+ let client: McpClient | null = null;
364
+
365
+ async function getClient(): Promise<McpClient> {
366
+ if (client) return client;
367
+ const server = await createVisionServer();
368
+ const [ct, st] = InMemoryTransport.createLinkedPair();
369
+ await server.connect(st);
370
+ client = new McpClient({ name: 'verify-mcp-client', version: '1.0.0' });
371
+ await client.connect(ct);
372
+ return client;
373
+ }
374
+
375
+ export async function extractMemberInfo(
376
+ imageRef: string,
377
+ pageNumber: number,
378
+ ): Promise<MemberInfo | null> {
379
+ const c = await getClient();
380
+ const result = await c.callTool({
381
+ name: 'extract_member_info',
382
+ arguments: { image_ref: imageRef, page_number: pageNumber },
383
+ });
384
+ return parseResult(result).member_info;
385
+ }
386
+ ```
387
+
388
+ 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.
389
+
390
+ ### The Pipeline
391
+
392
+ 1. **List pages** via MCP tool `list_document_pages`
393
+ 2. **Extract** member info from each page via MCP tool `extract_member_info` (routes to OpenAI Vision)
394
+ 3. **Merge** multi-page extractions into a single record
395
+ 4. **Validate** against member database via MCP tool `validate_member`
396
+ 5. **Return or escalate** — match returns; mismatch escalates to the Human Queue
397
+
398
+ 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.
399
+
400
+ ### Running the Tests
401
+
402
+ ```bash
403
+ # Vision server tool tests (no OpenAI key needed for most)
404
+ npm run test:mcp:vision
405
+
406
+ # Full integration (needs OpenAI key for extraction + workflow tests)
407
+ OPENAI_API_KEY=sk-... npm run test:mcp:vision
408
+
409
+ # With verbose output
410
+ npx vitest run tests/workflows/verify-document-mcp.test.ts --reporter=verbose
411
+ ```
412
+
413
+ The examples above use built-in servers. Long Tail can also connect to any external MCP server.
414
+
415
+ ## Server Registration Lifecycle
416
+
417
+ When you add an MCP server to Long Tail, two things must happen: the server must be **registered** (so the system knows it exists) and **connected** (so tools are callable). There are two paths depending on where your server runs.
418
+
419
+ ### Path A: In-Process (serverFactories)
420
+
421
+ Your MCP server runs inside the Long Tail process. You pass a factory function at startup. The server connects lazily on first tool call via `InMemoryTransport` — no network, no subprocess.
422
+
423
+ ```typescript
424
+ import { start } from '@hotmeshio/long-tail';
425
+
426
+ const lt = await start({
427
+ database: { connectionString: process.env.DATABASE_URL },
428
+ mcp: {
429
+ serverFactories: {
430
+ 'my-classifier': () => import('./mcp-servers/classifier').then(m => m.createServer()),
431
+ },
432
+ },
433
+ });
434
+ ```
435
+
436
+ Your factory is registered alongside the built-in factories. On first tool call, `resolveClient()` invokes the factory, creates an `InMemoryTransport` pair, connects, and caches the client. Subsequent calls reuse the cached connection.
437
+
438
+ To make this server visible in the dashboard and discoverable by tag-based workflows, seed a DB row for it (same pattern as the built-in servers) or register it via the API after startup.
439
+
440
+ This is the path all built-in servers use. It's the right choice when:
441
+ - Your server needs access to in-process state (DB pool, caches, other services)
442
+ - You want zero-latency tool calls (no IPC or network overhead)
443
+ - The server ships as part of your application code
444
+
445
+ ### Path B: External (Dashboard or API)
446
+
447
+ Your MCP server runs as a separate process (stdio) or remote service (SSE/Streamable HTTP). You register it via the dashboard wizard or REST API. The system stores the registration in `lt_mcp_servers` and connects via the configured transport.
448
+
449
+ This is the path for:
450
+ - npm MCP server packages (e.g., `@modelcontextprotocol/server-filesystem`)
451
+ - Remote servers running on other machines
452
+ - Servers you want operators to add without redeploying
453
+
454
+ ### Startup Sequence
455
+
456
+ Here's what happens when Long Tail boots, and where each path fits:
457
+
458
+ ```
459
+ 1. migrate() — DB tables created (lt_mcp_servers exists)
460
+ 2. Start HotMesh workers — Workflow engines ready
461
+ 3. mcpRegistry.connect() — Human queue server starts
462
+ └─ connectAutoServers() — External servers with auto_connect=true connect now
463
+ 4. registerBuiltinServer() — All factories stored (system + your serverFactories)
464
+ 5. seedSystemMcpServers() — Built-in servers upserted to lt_mcp_servers
465
+ 6. HTTP server starts — Dashboard and API available
466
+ 7. First tool call — Factory lazily connected via resolveClient()
467
+ ```
468
+
469
+ **Path A factories** are registered at step 4 and connected lazily at step 7. They don't need a DB row to function — `resolveClient()` finds them by name in the factory Map. But adding a DB row (step 5 or via API after step 6) makes them visible in the dashboard and discoverable by tag-based workflows.
470
+
471
+ **Path B servers** are stored in the DB (via API at step 6 or pre-seeded). If `auto_connect` is true, they connect at step 3. Otherwise, they connect on demand via `POST /api/mcp/servers/:id/connect` or lazily on first tool call.
472
+
473
+ ### Choosing a Path
474
+
475
+ | Consideration | Path A (in-process) | Path B (external) |
476
+ |---------------|--------------------|--------------------|
477
+ | Server location | Same process | Separate process or remote |
478
+ | Connection | InMemoryTransport (zero latency) | stdio / SSE / Streamable HTTP |
479
+ | Registration | `serverFactories` in startup config | Dashboard wizard or REST API |
480
+ | Deployment | Ships with your app code | Independent lifecycle |
481
+ | Access to app state | Yes (DB pool, caches, services) | No (isolated process) |
482
+ | Visibility in dashboard | Needs a DB row (seed or API) | Automatic (stored in DB) |
483
+
484
+ Both paths produce the same outcome: tools callable as durable activities via `proxyActivities()`.
485
+
486
+ ## External MCP Servers
487
+
488
+ This section covers [Path B](#path-b-external-dashboard-or-api) — registering servers via the dashboard or API. For in-process servers, see [Path A](#path-a-in-process-serverfactories) above.
489
+
490
+ Every registration uses the same data model. The dashboard wizard and the REST API are interchangeable views of that data.
491
+
492
+ ### The Registration Data Model
493
+
494
+ A server registration is a record with these fields. The dashboard wizard collects them across four steps; the API accepts them as a single JSON payload. Same data, two interfaces.
495
+
496
+ | Field | API field | Wizard step | Description |
497
+ |-------|-----------|-------------|-------------|
498
+ | Name | `name` | Transport | Unique identifier for the server |
499
+ | Description | `description` | Transport | What this server does |
500
+ | Transport type | `transport_type` | Transport | `stdio`, `sse`, or `streamable-http` |
501
+ | Transport config | `transport_config` | Transport | Connection details — command/args/env for stdio, url for network |
502
+ | Auto-connect | `auto_connect` | Transport | Start the connection when Long Tail boots |
503
+ | Tags | `tags` | Discovery | Categorize for tool discovery (e.g., `["database", "analytics"]`) |
504
+ | Compile hints | `compile_hints` | Discovery | Guidance for the workflow compiler |
505
+ | Credential providers | `credential_providers` | Discovery | IAM providers required by tools (e.g., `["github", "openai"]`) |
506
+
507
+ The wizard's **Test** step calls `POST /api/mcp/servers/test-connection` with the transport fields, and the **Review** step shows the full payload before saving.
508
+
509
+ #### Dashboard → API mapping
510
+
511
+ Each wizard step maps directly to API fields:
512
+
513
+ **Step 1 — Transport.** The mode cards select `transport_type` and determine which `transport_config` fields appear:
514
+
515
+ | Mode | `transport_type` | `transport_config` |
516
+ |------|------------------|--------------------|
517
+ | Local Process | `stdio` | `{ "command": "...", "args": [...], "env": {...} }` |
518
+ | Network Service (SSE) | `sse` | `{ "url": "..." }` |
519
+ | Network Service (Streamable HTTP) | `streamable-http` | `{ "url": "..." }` |
520
+ | In-Process | *(managed by the system)* | *(read-only for built-in servers)* |
521
+
522
+ **Step 2 — Discovery.** Maps directly to `tags`, `compile_hints`, and `credential_providers`.
523
+
524
+ **Step 3 — Test.** Calls the test-connection endpoint. No data is persisted.
525
+
526
+ **Step 4 — Review.** Shows the assembled payload. Save calls `POST /api/mcp/servers` (create) or `PUT /api/mcp/servers/:id` (edit).
527
+
528
+ #### When to use each field
529
+
530
+ | Field | When to use |
531
+ |-------|-------------|
532
+ | **Tags** | Always. Good tags make tools discoverable. Workflows like `mcpQuery` filter servers by tags. Use lowercase, hyphenated (e.g., `database`, `image-analysis`). |
533
+ | **Compile hints** | When the workflow compiler needs to know about tool ordering, timeouts, retry behavior, or output formats. |
534
+ | **Credential providers** | When tools call external APIs that need user-specific credentials. Users are prompted to connect via the Credentials page before tool execution. |
535
+ | **Auto-connect** | For servers you always want available. Skip for infrequently used servers. |
536
+
537
+ ### How to Register: Three Scenarios
538
+
539
+ The registration data model is the same in all three scenarios. Only the transport config differs.
540
+
541
+ #### Scenario 1: npm MCP Server Package
542
+
543
+ Many MCP servers are published to npm (`@modelcontextprotocol/server-filesystem`, `@modelcontextprotocol/server-github`, `mcp-server-sqlite`). No wrapper code needed — install the package and register.
544
+
545
+ There are two binding strategies:
546
+
547
+ **Early-bound (production)** — install as a dependency, ship in the Docker image:
548
+
549
+ ```bash
550
+ npm install @modelcontextprotocol/server-filesystem
551
+ ```
552
+
553
+ ```json
554
+ {
555
+ "transport_type": "stdio",
556
+ "transport_config": {
557
+ "command": "node",
558
+ "args": ["node_modules/@modelcontextprotocol/server-filesystem/dist/index.js", "/data"]
559
+ }
560
+ }
561
+ ```
562
+
563
+ The package is in `package.json`, locked by `package-lock.json`, built into the image. Deterministic, auditable, no network call at runtime.
564
+
565
+ **Late-bound (exploration)** — pull on demand via `npx`:
566
+
567
+ ```json
568
+ {
569
+ "transport_type": "stdio",
570
+ "transport_config": {
571
+ "command": "npx",
572
+ "args": ["-y", "@modelcontextprotocol/server-filesystem", "/data"]
573
+ }
574
+ }
575
+ ```
576
+
577
+ The package isn't in your repo, lockfile, or Docker image. It's resolved at runtime — downloaded on first spawn, cached for subsequent connections. Useful for trying out a server without committing to a dependency, or environments where operators add servers without redeploying.
578
+
579
+ Long Tail serves as the registry that decides which servers to connect, when to spawn them, and how they wire into workflows. The binding strategy is a transport detail.
580
+
581
+ **Dashboard:** Select **Local Process**, enter the command and args, walk through Discovery/Test/Review.
582
+
583
+ **API:**
584
+
585
+ ```bash
586
+ curl -X POST http://localhost:3000/api/mcp/servers \
587
+ -H 'Content-Type: application/json' \
588
+ -d '{
589
+ "name": "filesystem",
590
+ "transport_type": "stdio",
591
+ "transport_config": {
592
+ "command": "npx",
593
+ "args": ["-y", "@modelcontextprotocol/server-filesystem", "/data"]
594
+ },
595
+ "auto_connect": true,
596
+ "tags": ["files", "storage"]
597
+ }'
598
+ ```
599
+
600
+ #### Scenario 2: Remote Server
601
+
602
+ Point Long Tail at a URL. The server runs elsewhere.
603
+
604
+ ```json
605
+ {
606
+ "transport_type": "sse",
607
+ "transport_config": {
608
+ "url": "https://my-server.example.com/mcp"
609
+ }
610
+ }
611
+ ```
612
+
613
+ For Streamable HTTP, use `"transport_type": "streamable-http"`. Same `transport_config`.
614
+
615
+ **Dashboard:** Select **Network Service**, enter the URL, choose SSE or Streamable HTTP, walk through Discovery/Test/Review.
616
+
617
+ **API:**
618
+
619
+ ```bash
620
+ curl -X POST http://localhost:3000/api/mcp/servers \
621
+ -H 'Content-Type: application/json' \
622
+ -d '{
623
+ "name": "my-remote-server",
624
+ "transport_type": "sse",
625
+ "transport_config": { "url": "https://my-server.example.com/mcp" },
626
+ "tags": ["api", "external"]
627
+ }'
628
+ ```
629
+
630
+ #### Scenario 3: Build Your Own
631
+
632
+ Write a custom MCP server, then register it the same way as Scenarios 1 or 2.
633
+
634
+ **Create the server** using the MCP SDK:
635
+
636
+ ```typescript
637
+ // my-server.ts
638
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
639
+ import { z } from 'zod';
640
+
641
+ const server = new McpServer({ name: 'my-tools', version: '1.0.0' });
642
+
643
+ server.tool('classify_document',
644
+ { content: z.string() },
645
+ async ({ content }) => {
646
+ const result = await yourClassificationLogic(content);
647
+ return { content: [{ type: 'text', text: JSON.stringify(result) }] };
648
+ },
649
+ );
650
+
651
+ export default server;
652
+ ```
653
+
654
+ **Make it runnable** via stdio (simplest):
655
+
656
+ ```typescript
657
+ // bin/serve.ts
658
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
659
+ import server from './my-server';
660
+
661
+ const transport = new StdioServerTransport();
662
+ await server.connect(transport);
663
+ ```
664
+
665
+ **Register it.** The transport config points at your command — same as any stdio server:
666
+
667
+ ```json
668
+ {
669
+ "transport_type": "stdio",
670
+ "transport_config": { "command": "node", "args": ["dist/bin/serve.js"] }
671
+ }
672
+ ```
673
+
674
+ For in-process servers that run inside the Long Tail process, see the [Writing Your Own MCP Server](#writing-your-own-mcp-server) section above and the architecture guide's [Registering Your Own](architecture.md#registering-your-own) section.
675
+
676
+ ### Test Connection
677
+
678
+ Test connectivity without saving a registration. The dashboard wizard's Test step and the API endpoint do the same thing — send transport fields, get back a tool list or error.
679
+
680
+ **Dashboard:** Click "Test Connection" on the Test step.
681
+
682
+ **API:**
683
+
684
+ ```bash
685
+ curl -X POST http://localhost:3000/api/mcp/servers/test-connection \
686
+ -H 'Content-Type: application/json' \
687
+ -d '{
688
+ "transport_type": "stdio",
689
+ "transport_config": {
690
+ "command": "npx",
691
+ "args": ["-y", "@modelcontextprotocol/server-filesystem", "/tmp"]
692
+ }
693
+ }'
694
+ ```
695
+
696
+ Returns `{ "success": true, "tools": [...] }` on success, or `{ "success": false, "error": "..." }` on failure.
697
+
698
+ ### Edit a Registration
699
+
700
+ **Dashboard:** Click any server row in **MCP > Servers** to open the detail page. All fields are editable. Built-in servers show read-only transport config but allow editing tags, hints, and credential providers.
701
+
702
+ **API:** `PUT /api/mcp/servers/:id` with any fields to update:
703
+
704
+ ```bash
705
+ curl -X PUT http://localhost:3000/api/mcp/servers/$ID \
706
+ -H 'Content-Type: application/json' \
707
+ -d '{
708
+ "tags": ["database", "analytics"],
709
+ "compile_hints": "Returns paginated results. Always pass limit.",
710
+ "credential_providers": ["postgres"]
711
+ }'
712
+ ```
713
+
714
+ ### Use in a Workflow
715
+
716
+ Once registered, a server's tools are available as durable activities:
717
+
718
+ ```typescript
719
+ import { Durable } from '@hotmeshio/hotmesh';
720
+ import { McpClient } from '@hotmeshio/long-tail';
721
+
722
+ // Get tool functions from a connected MCP server
723
+ const tools = await McpClient.toolActivities(serverId);
724
+
725
+ // Proxy them as durable activities — checkpointed, retried, audited
726
+ const { mcp_doc_analyzer_classify } = Durable.workflow.proxyActivities<typeof tools>({
727
+ activities: tools,
728
+ retryPolicy: { maximumAttempts: 3 },
729
+ });
730
+
731
+ export async function classifyDocument(envelope: LTEnvelope) {
732
+ const result = await mcp_doc_analyzer_classify({
733
+ content: envelope.data.content,
734
+ });
735
+
736
+ if (result.confidence >= 0.85) {
737
+ return { type: 'return', data: result };
738
+ }
739
+
740
+ return {
741
+ type: 'escalation',
742
+ data: result,
743
+ message: 'Low confidence classification',
744
+ role: 'reviewer',
745
+ };
746
+ }
747
+ ```
748
+
749
+ Tool names are derived from the server name and tool name: `mcp_{serverName}_{toolName}`, with non-alphanumeric characters replaced by underscores.
750
+
751
+ 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.
752
+
753
+ ## Built-in Servers
754
+
755
+ Long Tail ships with built-in MCP servers. For descriptions, see the [architecture guide](architecture.md#built-in-mcp-servers).
756
+
757
+ | Server | Tags |
758
+ |--------|------|
759
+ | `long-tail-db-query` | database, query, analytics |
760
+ | `long-tail-human-queue` | escalation, human-queue, routing |
761
+ | `mcp-workflows-longtail` | workflows, compiled, deterministic |
762
+ | `long-tail-workflow-compiler` | compilation, yaml, codegen |
763
+ | `long-tail-translation` | translation, language, text-processing |
764
+ | `long-tail-vision` | vision, image-analysis, multimodal |
765
+ | `long-tail-playwright` | browser-automation, testing, screenshots |
766
+ | `long-tail-playwright-cli` | browser-automation, screenshots, scraping, forms |
767
+ | `long-tail-docs` | documentation, help, reference |
768
+ | `long-tail-file-storage` | storage, files, io |
769
+ | `long-tail-http-fetch` | http, api, fetch, network |
770
+ | `long-tail-oauth` | authentication, oauth, credentials |
771
+ | `long-tail-claude-code` | development, coding, ai-agent, terminal, code-generation |
772
+
773
+ ## Configuration
774
+
775
+ Pass `mcp` in the `start()` config:
776
+
777
+ ```typescript
778
+ import { start } from '@hotmeshio/long-tail';
779
+
780
+ const { client, shutdown } = await start({
781
+ database: {
782
+ host: 'localhost',
783
+ port: 5432,
784
+ user: 'postgres',
785
+ password: 'postgres',
786
+ database: 'longtail',
787
+ },
788
+
789
+ mcp: {
790
+ // Built-in Human Queue MCP server
791
+ server: {
792
+ enabled: true, // default: true
793
+ name: 'long-tail-human-queue', // reported to MCP clients
794
+ },
795
+
796
+ // External MCP server IDs to connect on startup
797
+ autoConnect: ['server-uuid-1', 'server-uuid-2'],
798
+
799
+ // Or replace the built-in adapter entirely:
800
+ // adapter: new MyCustomMcpAdapter(),
801
+ },
802
+ });
803
+ ```
804
+
805
+ 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.
806
+
807
+ ## REST API
808
+
809
+ All routes are mounted at `/api/mcp`.
810
+
811
+ ### Server Registration
812
+
813
+ | Method | Path | Description |
814
+ |--------|------|-------------|
815
+ | `GET` | `/api/mcp/servers` | List registered servers |
816
+ | `POST` | `/api/mcp/servers` | Register a new server |
817
+ | `GET` | `/api/mcp/servers/:id` | Get a server by ID |
818
+ | `PUT` | `/api/mcp/servers/:id` | Update a server |
819
+ | `DELETE` | `/api/mcp/servers/:id` | Delete a server |
820
+
821
+ **Query parameters** for `GET /api/mcp/servers`:
822
+
823
+ - `status` — filter by status (`registered`, `connected`, `error`, `disconnected`)
824
+ - `auto_connect` — filter by auto-connect (`true`, `false`)
825
+ - `limit`, `offset` — pagination
826
+
827
+ ### Connection Management
828
+
829
+ | Method | Path | Description |
830
+ |--------|------|-------------|
831
+ | `POST` | `/api/mcp/servers/test-connection` | Test connectivity without saving |
832
+ | `POST` | `/api/mcp/servers/:id/connect` | Connect to a server |
833
+ | `POST` | `/api/mcp/servers/:id/disconnect` | Disconnect from a server |
834
+
835
+ ### Tool Operations
836
+
837
+ | Method | Path | Description |
838
+ |--------|------|-------------|
839
+ | `GET` | `/api/mcp/servers/:id/tools` | List tools on a connected server |
840
+ | `POST` | `/api/mcp/servers/:id/tools/:toolName/call` | Call a tool |
841
+
842
+ **Call a tool:**
843
+
844
+ ```bash
845
+ curl -X POST http://localhost:3000/api/mcp/servers/$ID/tools/search/call \
846
+ -H 'Content-Type: application/json' \
847
+ -d '{ "arguments": { "query": "hello" } }'
848
+ ```
849
+
850
+ Server registrations are persisted in PostgreSQL so they survive restarts.
851
+
852
+ ## Database Schema
853
+
854
+ MCP server registrations are stored in `lt_mcp_servers`:
855
+
856
+ ```sql
857
+ CREATE TABLE IF NOT EXISTS lt_mcp_servers (
858
+ id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
859
+ name TEXT UNIQUE NOT NULL,
860
+ description TEXT,
861
+ transport_type TEXT NOT NULL CHECK (transport_type IN ('stdio', 'sse', 'streamable-http')),
862
+ transport_config JSONB NOT NULL DEFAULT '{}'::JSONB,
863
+ auto_connect BOOLEAN NOT NULL DEFAULT false,
864
+ tool_manifest JSONB, -- cached from last listTools()
865
+ tags TEXT[], -- categorization for tag-based tool discovery
866
+ compile_hints TEXT, -- per-server instructions for the compilation pipeline
867
+ credential_providers TEXT[] DEFAULT '{}', -- IAM providers required by tools
868
+ status TEXT NOT NULL DEFAULT 'registered'
869
+ CHECK (status IN ('registered', 'connected', 'error', 'disconnected')),
870
+ last_connected_at TIMESTAMPTZ,
871
+ metadata JSONB,
872
+ created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
873
+ updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
874
+ );
875
+ ```
876
+
877
+ The `tool_manifest` column caches the result of `listTools()` on each successful connection, so tools can be enumerated without a live connection.
878
+
879
+ 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.
880
+
881
+ 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.
882
+
883
+ The `credential_providers` column lists IAM credential providers required by the server's tools. When a user invokes a tool, the system checks whether they have registered credentials for each listed provider. Missing credentials trigger a `MissingCredentialError` with the provider name, prompting the user to connect via the Credentials page.
884
+
885
+ The schema is created automatically by `migrate()`. See `services/db/schemas/001_initial.sql`.
886
+
887
+ The test suite verifies the full MCP protocol against real PostgreSQL — no mocks.
888
+
889
+ ## Testing
890
+
891
+ ### InMemoryTransport Pattern
892
+
893
+ 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.
894
+
895
+ ```typescript
896
+ import { Client as McpClient } from '@modelcontextprotocol/sdk/client/index.js';
897
+ import { InMemoryTransport } from '@modelcontextprotocol/sdk/inMemory.js';
898
+ import { createHumanQueueServer, stopServer } from '../../services/mcp/server';
899
+
900
+ // Reset singleton, create fresh server
901
+ await stopServer();
902
+ const server = await createHumanQueueServer({ name: 'test-human-queue' });
903
+
904
+ // Linked in-memory transports
905
+ const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair();
906
+ await server.connect(serverTransport);
907
+
908
+ const client = new McpClient({ name: 'test-client', version: '1.0.0' });
909
+ await client.connect(clientTransport);
910
+
911
+ // Now use client.callTool(), client.listTools(), etc.
912
+ ```
913
+
914
+ The shared test utility at `tests/setup/mcp.ts` wraps this pattern as `createMcpTestClient()` and provides:
915
+
916
+ - `parseMcpResult(result)` — extracts and JSON-parses `result.content[0].text`
917
+ - `waitForEscalationViaMcp(client, role, timeout, interval)` — polls `get_available_work` until escalations appear
918
+
919
+ ### Running MCP Tests
920
+
921
+ ```bash
922
+ # Human Queue protocol tests (8 tests — real client, real server, real DB)
923
+ npm run test:mcp
924
+
925
+ # Vision MCP server tool tests
926
+ npm run test:mcp:vision
927
+
928
+ # Full integration with OpenAI Vision
929
+ OPENAI_API_KEY=sk-... npm run test:mcp:vision
930
+
931
+ # All tests
932
+ npm test
933
+ ```
934
+
935
+ ### What the Protocol Tests Prove
936
+
937
+ The `tests/mcp.test.ts` suite includes 8 tests:
938
+
939
+ 1. **Tool discovery** — `listTools()` returns the expected tools
940
+ 2. **Create** — `escalate_to_human` writes a real PostgreSQL record
941
+ 3. **Check** — `check_resolution` reads status from DB
942
+ 4. **List** — `get_available_work` filters by role
943
+ 5. **Resolve** — `claim_and_resolve` atomically claims and resolves
944
+ 6. **Full lifecycle** — escalate -> check -> list -> resolve -> check -> list (empty)
945
+ 7. **Error: not found** — checking a nonexistent ID returns `isError: true`
946
+ 8. **Error: already resolved** — claiming a resolved escalation returns `isError: true`
947
+
948
+ The `tests/workflows/verify-document-mcp.test.ts` suite adds:
949
+
950
+ 1. **Vision tool discovery** — `listTools()` returns 3 Vision tools
951
+ 2. **list_document_pages** — returns page refs from storage
952
+ 3. **validate_member** — match, mismatch, and not_found cases
953
+ 4. **extract_member_info** — extracts via OpenAI Vision (needs API key)
954
+ 5. **Full MCP-native workflow** — extraction -> validation -> escalation -> Human Queue MCP resolution
955
+
956
+ Every test verifies both the MCP response and the actual database state.
957
+
958
+ ## Custom Adapters
959
+
960
+ The `LTMcpAdapter` interface lets you replace the built-in adapter entirely:
961
+
962
+ ```typescript
963
+ interface LTMcpAdapter {
964
+ connect(): Promise<void>;
965
+ disconnect(): Promise<void>;
966
+ connectClient(serverId: string): Promise<void>;
967
+ disconnectClient(serverId: string): Promise<void>;
968
+ listTools(serverId: string): Promise<LTMcpToolManifest[]>;
969
+ callTool(serverId: string, toolName: string, args: Record<string, any>): Promise<any>;
970
+ toolActivities(serverId: string): Promise<Record<string, (...args: any[]) => Promise<any>>>;
971
+ }
972
+ ```
973
+
974
+ Pass your implementation in the startup config:
975
+
976
+ ```typescript
977
+ await start({
978
+ database: { /* ... */ },
979
+ mcp: {
980
+ adapter: new MyCustomMcpAdapter(),
981
+ },
982
+ });
983
+ ```
984
+
985
+ The adapter registry follows the same pattern as auth, telemetry, events, and logging — a single-adapter registry with `connect()`/`disconnect()` lifecycle hooks.