@hotmeshio/long-tail 0.1.3 → 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.
- package/README.md +118 -173
- package/build/examples/seed.js +1 -1
- package/build/examples/workflows/basic-echo/activities.d.ts +2 -2
- package/build/examples/workflows/basic-echo/activities.js +7 -7
- package/build/examples/workflows/basic-echo/index.js +1 -1
- package/build/examples/workflows/kitchen-sink/index.js +2 -2
- package/build/index.d.ts +12 -10
- package/build/index.js +15 -12
- package/build/lib/db/index.d.ts +18 -0
- package/build/{services → lib}/db/index.js +9 -0
- package/build/{services → lib}/db/migrate.js +3 -3
- package/build/{services → lib}/telemetry/honeycomb.d.ts +2 -2
- package/build/{services → lib}/telemetry/honeycomb.js +2 -2
- package/build/modules/defaults.d.ts +2 -0
- package/build/modules/defaults.js +3 -1
- package/build/routes/controlplane.js +1 -1
- package/build/routes/dba.js +4 -0
- package/build/routes/docs.d.ts +2 -0
- package/build/routes/docs.js +87 -0
- package/build/routes/escalations/bulk.js +120 -202
- package/build/routes/escalations/resolve.js +1 -1
- package/build/routes/escalations/single.js +1 -1
- package/build/routes/files.js +1 -1
- package/build/routes/index.js +2 -0
- package/build/routes/insight.js +2 -1
- package/build/routes/mcp.js +3 -2
- package/build/routes/oauth.js +1 -1
- package/build/routes/settings.js +4 -4
- package/build/routes/workflows/discovery.js +3 -3
- package/build/routes/workflows/invocation.js +1 -1
- package/build/routes/yaml-workflows/crud.js +1 -1
- package/build/routes/yaml-workflows/deployment.js +25 -0
- package/build/services/auth/bot-api-key.js +1 -1
- package/build/services/auth/index.d.ts +4 -0
- package/build/services/auth/index.js +17 -0
- package/build/services/auth/service-token.js +1 -1
- package/build/services/config/provider.js +1 -1
- package/build/services/config/read.js +1 -1
- package/build/services/config/write.js +1 -1
- package/build/services/controlplane/index.js +3 -4
- package/build/services/controlplane/quorum-bridge.js +2 -2
- package/build/services/cron/index.js +4 -5
- package/build/services/dba.d.ts +4 -0
- package/build/services/dba.js +3 -6
- package/build/services/escalation/bulk.js +1 -1
- package/build/services/escalation/crud.js +1 -1
- package/build/services/escalation/queries.js +1 -1
- package/build/services/export/client.js +2 -5
- package/build/services/export/index.js +14 -2
- package/build/services/hotmesh-utils.js +1 -1
- package/build/services/iam/bots.js +6 -12
- package/build/services/iam/context.d.ts +1 -1
- package/build/services/iam/context.js +5 -5
- package/build/services/iam/credentials.js +1 -1
- package/build/services/iam/ephemeral.js +8 -15
- package/build/services/iam/principal.js +3 -10
- package/build/services/iam/resolve.js +1 -1
- package/build/services/iam/sql.d.ts +10 -0
- package/build/services/iam/sql.js +42 -0
- package/build/services/insight/index.d.ts +1 -0
- package/build/services/insight/index.js +4 -6
- package/build/services/interceptor/activities/escalation.js +1 -1
- package/build/services/interceptor/activities/task.js +9 -6
- package/build/services/interceptor/activities/workflow.js +4 -5
- package/build/services/interceptor/activity-interceptor.d.ts +1 -1
- package/build/services/interceptor/activity-interceptor.js +5 -5
- package/build/services/interceptor/completion.js +1 -1
- package/build/services/interceptor/escalation.js +1 -1
- package/build/services/interceptor/index.js +4 -4
- package/build/services/interceptor/lifecycle.js +1 -1
- package/build/services/maintenance/index.js +4 -5
- package/build/services/mcp/adapter.js +1 -16
- package/build/services/mcp/client/connection.d.ts +1 -1
- package/build/services/mcp/client/connection.js +2 -2
- package/build/services/mcp/client/tools.js +1 -1
- package/build/services/mcp/db-server/index.js +1 -1
- package/build/services/mcp/db-server/tools.js +17 -4
- package/build/services/mcp/db.js +1 -1
- package/build/services/mcp/playwright-server/index.js +1 -1
- package/build/services/mcp/playwright-server/lifecycle.js +1 -1
- package/build/services/mcp/playwright-server/schemas.d.ts +2 -2
- package/build/services/mcp/playwright-server/tools.js +1 -1
- package/build/services/mcp/register-tool.d.ts +11 -0
- package/build/services/mcp/register-tool.js +15 -0
- package/build/services/mcp/server.js +1 -1
- package/build/services/mcp/sql.d.ts +6 -0
- package/build/services/mcp/sql.js +34 -1
- package/build/services/mcp/workflow-compiler-server.js +1 -1
- package/build/services/mcp/workflow-server.js +1 -1
- package/build/services/mcp-runs/execution-builder.js +8 -6
- package/build/services/mcp-runs/queries.js +2 -2
- package/build/services/mcp-runs/sql.d.ts +4 -1
- package/build/services/mcp-runs/sql.js +23 -2
- package/build/services/namespace/index.js +1 -1
- package/build/services/oauth/db.js +9 -37
- package/build/services/oauth/index.js +1 -1
- package/build/services/oauth/providers/registry.js +1 -1
- package/build/services/oauth/sql.d.ts +7 -0
- package/build/services/oauth/sql.js +32 -0
- package/build/services/orchestrator/index.js +3 -3
- package/build/services/role/index.js +1 -1
- package/build/services/task/crud.js +1 -1
- package/build/services/task/process.js +1 -1
- package/build/services/task/resolve.js +1 -1
- package/build/services/user/auth.js +1 -1
- package/build/services/user/crud.js +1 -1
- package/build/services/user/rbac.js +1 -1
- package/build/services/user/roles.js +1 -1
- package/build/services/user/sql.d.ts +2 -0
- package/build/services/user/sql.js +3 -1
- package/build/services/yaml-workflow/db-utils.js +1 -1
- package/build/services/yaml-workflow/db.js +1 -1
- package/build/services/yaml-workflow/deployer-helpers.js +1 -1
- package/build/services/yaml-workflow/deployer.js +4 -4
- package/build/services/yaml-workflow/generator.js +1 -1
- package/build/services/yaml-workflow/input-analyzer-helpers.d.ts +6 -0
- package/build/services/yaml-workflow/input-analyzer-helpers.js +36 -7
- package/build/services/yaml-workflow/input-analyzer.js +16 -3
- package/build/services/yaml-workflow/pipeline/analyze.js +1 -1
- package/build/services/yaml-workflow/pipeline/build/dag.js +10 -5
- package/build/services/yaml-workflow/pipeline/compile/llm-call.js +1 -1
- package/build/services/yaml-workflow/pipeline/extract.js +5 -3
- package/build/services/yaml-workflow/pipeline/index.d.ts +5 -0
- package/build/services/yaml-workflow/pipeline/index.js +22 -0
- package/build/services/yaml-workflow/pipeline/validate.js +2 -2
- package/build/services/yaml-workflow/workers/callbacks.js +1 -1
- package/build/services/yaml-workflow/workers/events.js +2 -2
- package/build/services/yaml-workflow/workers/register.js +8 -8
- package/build/start/adapters.js +7 -7
- package/build/start/index.js +4 -4
- package/build/start/server.js +1 -1
- package/build/start/workers.d.ts +1 -2
- package/build/start/workers.js +8 -7
- package/build/system/activities/claude-code.js +1 -1
- package/build/system/activities/file-storage.js +1 -1
- package/build/system/activities/knowledge.d.ts +58 -0
- package/build/system/activities/knowledge.js +128 -0
- package/build/system/activities/sql.d.ts +9 -0
- package/build/system/activities/sql.js +41 -0
- package/build/system/activities/triage/context.js +1 -1
- package/build/system/activities/triage/discovery.d.ts +2 -14
- package/build/system/activities/triage/discovery.js +5 -161
- package/build/system/activities/triage/llm.d.ts +1 -8
- package/build/system/activities/triage/llm.js +2 -28
- package/build/system/activities/triage/tools.d.ts +1 -17
- package/build/system/activities/triage/tools.js +8 -167
- package/build/system/index.js +5 -4
- package/build/system/mcp-servers/admin/escalations.d.ts +5 -0
- package/build/system/mcp-servers/admin/escalations.js +149 -0
- package/build/system/mcp-servers/admin/index.d.ts +31 -0
- package/build/system/mcp-servers/admin/index.js +80 -0
- package/build/system/mcp-servers/admin/maintenance.d.ts +5 -0
- package/build/system/mcp-servers/admin/maintenance.js +58 -0
- package/build/system/mcp-servers/admin/mcp-servers.d.ts +5 -0
- package/build/system/mcp-servers/admin/mcp-servers.js +146 -0
- package/build/system/mcp-servers/admin/schemas.d.ts +411 -0
- package/build/system/mcp-servers/admin/schemas.js +177 -0
- package/build/system/mcp-servers/admin/tasks.d.ts +5 -0
- package/build/system/mcp-servers/admin/tasks.js +112 -0
- package/build/system/mcp-servers/admin/users.d.ts +5 -0
- package/build/system/mcp-servers/admin/users.js +167 -0
- package/build/system/mcp-servers/admin/workflow-config.d.ts +9 -0
- package/build/system/mcp-servers/admin/workflow-config.js +118 -0
- package/build/system/mcp-servers/admin/workflows.d.ts +6 -0
- package/build/system/mcp-servers/admin/workflows.js +138 -0
- package/build/system/mcp-servers/admin/yaml-workflows.d.ts +8 -0
- package/build/system/mcp-servers/admin/yaml-workflows.js +237 -0
- package/build/system/mcp-servers/claude-code.js +1 -1
- package/build/system/mcp-servers/db-query/index.js +1 -1
- package/build/system/mcp-servers/db-query/tools.js +17 -4
- package/build/system/mcp-servers/docs.d.ts +5 -0
- package/build/system/mcp-servers/docs.js +147 -0
- package/build/system/mcp-servers/file-storage.js +1 -1
- package/build/system/mcp-servers/http-fetch.js +1 -1
- package/build/system/mcp-servers/human-queue.js +1 -1
- package/build/system/mcp-servers/knowledge.d.ts +4 -0
- package/build/system/mcp-servers/knowledge.js +137 -0
- package/build/system/mcp-servers/oauth.js +1 -1
- package/build/system/mcp-servers/playwright/browser-lifecycle.js +1 -1
- package/build/system/mcp-servers/playwright/index.js +1 -1
- package/build/system/mcp-servers/playwright/schemas.d.ts +19 -8
- package/build/system/mcp-servers/playwright/schemas.js +3 -0
- package/build/system/mcp-servers/playwright/tools-navigation.js +22 -9
- package/build/system/mcp-servers/playwright/tools-run-script.js +20 -3
- package/build/system/mcp-servers/playwright/vision-helper.d.ts +12 -0
- package/build/system/mcp-servers/playwright/vision-helper.js +81 -0
- package/build/system/mcp-servers/playwright-cli/helpers.js +2 -2
- package/build/system/mcp-servers/playwright-cli/index.js +1 -1
- package/build/system/mcp-servers/playwright-cli/schemas.d.ts +28 -28
- package/build/system/mcp-servers/playwright-cli/schemas.js +1 -1
- package/build/system/mcp-servers/playwright-cli/tools-auth.js +1 -1
- package/build/system/mcp-servers/playwright-cli/tools-capture.js +4 -2
- package/build/system/mcp-servers/translation.d.ts +14 -0
- package/build/system/mcp-servers/translation.js +130 -0
- package/build/system/mcp-servers/vision-prompts.d.ts +2 -0
- package/build/system/mcp-servers/vision-prompts.js +9 -0
- package/build/system/mcp-servers/{document-vision.d.ts → vision.d.ts} +3 -4
- package/build/system/mcp-servers/vision.js +221 -0
- package/build/system/mcp-servers/workflow-compiler.js +1 -1
- package/build/system/mcp-servers/workflow.js +1 -1
- package/build/system/seed/index.js +13 -2
- package/build/system/seed/server-definitions.d.ts +1954 -322
- package/build/system/seed/server-definitions.js +65 -34
- package/build/system/seed/tool-manifests-admin.d.ts +1645 -0
- package/build/system/seed/tool-manifests-admin.js +45 -0
- package/build/system/seed/tool-manifests-browser.d.ts +1 -1
- package/build/system/seed/tool-manifests-browser.js +3 -3
- package/build/system/seed/tool-manifests-data.d.ts +62 -21
- package/build/system/seed/tool-manifests-data.js +55 -17
- package/build/system/seed/tool-manifests-knowledge.d.ts +171 -0
- package/build/system/seed/tool-manifests-knowledge.js +94 -0
- package/build/system/workflows/mcp-deterministic/index.js +1 -1
- package/build/system/workflows/mcp-query/activities/discovery.d.ts +2 -20
- package/build/system/workflows/mcp-query/activities/discovery.js +5 -163
- package/build/system/workflows/mcp-query/activities/llm.d.ts +1 -7
- package/build/system/workflows/mcp-query/activities/llm.js +2 -27
- package/build/system/workflows/mcp-query/activities/tool-executor.d.ts +0 -4
- package/build/system/workflows/mcp-query/activities/tool-executor.js +2 -106
- package/build/system/workflows/mcp-query/activities/tool-loader.d.ts +0 -9
- package/build/system/workflows/mcp-query/activities/tool-loader.js +2 -87
- package/build/system/workflows/mcp-query/index.js +55 -5
- package/build/system/workflows/mcp-query/prompts.d.ts +1 -2
- package/build/system/workflows/mcp-query/prompts.js +5 -32
- package/build/system/workflows/mcp-query/strategy-advisors.d.ts +3 -14
- package/build/system/workflows/mcp-query/strategy-advisors.js +4 -107
- package/build/system/workflows/mcp-query/types.d.ts +2 -10
- package/build/system/workflows/mcp-query/types.js +0 -1
- package/build/system/workflows/mcp-query-router/index.js +1 -1
- package/build/system/workflows/mcp-triage/index.d.ts +2 -2
- package/build/system/workflows/mcp-triage/index.js +39 -7
- package/build/system/workflows/mcp-triage/prompts.js +7 -14
- package/build/system/workflows/mcp-triage-deterministic/index.js +1 -1
- package/build/system/workflows/mcp-triage-router/index.js +1 -1
- package/build/system/workflows/shared/discovery.d.ts +35 -0
- package/build/system/workflows/shared/discovery.js +175 -0
- package/build/system/workflows/shared/index.d.ts +7 -0
- package/build/system/workflows/shared/index.js +18 -0
- package/build/system/workflows/shared/llm-caller.d.ts +8 -0
- package/build/system/workflows/shared/llm-caller.js +31 -0
- package/build/system/workflows/shared/prompts.d.ts +2 -0
- package/build/system/workflows/shared/prompts.js +32 -0
- package/build/system/workflows/shared/strategy-advisors.d.ts +14 -0
- package/build/system/workflows/shared/strategy-advisors.js +109 -0
- package/build/system/workflows/shared/tool-executor.d.ts +11 -0
- package/build/system/workflows/shared/tool-executor.js +111 -0
- package/build/system/workflows/shared/tool-loader.d.ts +19 -0
- package/build/system/workflows/shared/tool-loader.js +94 -0
- package/build/system/workflows/shared/types.d.ts +9 -0
- package/build/system/workflows/shared/types.js +2 -0
- package/build/system/workflows/tool-result-guard.d.ts +14 -0
- package/build/system/workflows/tool-result-guard.js +78 -0
- package/build/tsconfig.tsbuildinfo +1 -1
- package/build/types/user.d.ts +2 -0
- package/build/vitest.config.d.ts +1 -1
- package/build/vitest.integration.config.d.ts +1 -1
- package/build/workers/index.js +2 -8
- package/dashboard/dist/assets/AdminDashboard-CTyAMUJR.js +2 -0
- package/dashboard/dist/assets/AdminDashboard-CTyAMUJR.js.map +1 -0
- package/dashboard/dist/assets/AvailableEscalationsPage-BMXV3Q4l.js +2 -0
- package/dashboard/dist/assets/AvailableEscalationsPage-BMXV3Q4l.js.map +1 -0
- package/dashboard/dist/assets/BotPicker-C51nKFEu.js +2 -0
- package/dashboard/dist/assets/{BotPicker-D6FYW1Gt.js.map → BotPicker-C51nKFEu.js.map} +1 -1
- package/dashboard/dist/assets/CollapsibleSection-BSyfd8uL.js +2 -0
- package/dashboard/dist/assets/{CollapsibleSection-Cxk4wvjT.js.map → CollapsibleSection-BSyfd8uL.js.map} +1 -1
- package/dashboard/dist/assets/ConfirmDeleteModal-CBdhia5T.js +2 -0
- package/dashboard/dist/assets/{ConfirmDeleteModal-FSXyKjaB.js.map → ConfirmDeleteModal-CBdhia5T.js.map} +1 -1
- package/dashboard/dist/assets/CopyableId-dGlewBCS.js +2 -0
- package/dashboard/dist/assets/{CopyableId-CBdxWfp8.js.map → CopyableId-dGlewBCS.js.map} +1 -1
- package/dashboard/dist/assets/CredentialsPage-CoBNFSAu.js +2 -0
- package/dashboard/dist/assets/{CredentialsPage-Ikzsot0w.js.map → CredentialsPage-CoBNFSAu.js.map} +1 -1
- package/dashboard/dist/assets/CustomDurationPicker-BataWFj8.js +2 -0
- package/dashboard/dist/assets/{CustomDurationPicker-CAninCbl.js.map → CustomDurationPicker-BataWFj8.js.map} +1 -1
- package/dashboard/dist/assets/DataTable-B3uf5CCo.js +2 -0
- package/dashboard/dist/assets/DataTable-B3uf5CCo.js.map +1 -0
- package/dashboard/dist/assets/ElapsedCell-G5oSwTpT.js +2 -0
- package/dashboard/dist/assets/ElapsedCell-G5oSwTpT.js.map +1 -0
- package/dashboard/dist/assets/EmptyState-BChBJNGS.js +2 -0
- package/dashboard/dist/assets/{EmptyState-2CmV-IaS.js.map → EmptyState-BChBJNGS.js.map} +1 -1
- package/dashboard/dist/assets/EscalationsOverview-CxUv8xjG.js +2 -0
- package/dashboard/dist/assets/{EscalationsOverview-GXYFPASS.js.map → EscalationsOverview-CxUv8xjG.js.map} +1 -1
- package/dashboard/dist/assets/EventTable-CVt8B0BZ.js +2 -0
- package/dashboard/dist/assets/{EventTable-B01oJf6Y.js.map → EventTable-CVt8B0BZ.js.map} +1 -1
- package/dashboard/dist/assets/FilterBar-CShf0oe7.js +2 -0
- package/dashboard/dist/assets/{FilterBar-Ck4K4rzu.js.map → FilterBar-CShf0oe7.js.map} +1 -1
- package/dashboard/dist/assets/McpOverview-CbaZRnJl.js +2 -0
- package/dashboard/dist/assets/{McpOverview-JkvRcX2e.js.map → McpOverview-CbaZRnJl.js.map} +1 -1
- package/dashboard/dist/assets/McpQueryDetailPage-CGoR9XK6.js +5 -0
- package/dashboard/dist/assets/McpQueryDetailPage-CGoR9XK6.js.map +1 -0
- package/dashboard/dist/assets/McpQueryPage-BjXoYQuU.js +2 -0
- package/dashboard/dist/assets/McpQueryPage-BjXoYQuU.js.map +1 -0
- package/dashboard/dist/assets/McpRunDetailPage-DLkA5Aar.js +2 -0
- package/dashboard/dist/assets/McpRunDetailPage-DLkA5Aar.js.map +1 -0
- package/dashboard/dist/assets/McpRunsPage-DCh9n11D.js +2 -0
- package/dashboard/dist/assets/McpRunsPage-DCh9n11D.js.map +1 -0
- package/dashboard/dist/assets/Modal-CI5RBPOQ.js +2 -0
- package/dashboard/dist/assets/{Modal-B4rbIVAn.js.map → Modal-CI5RBPOQ.js.map} +1 -1
- package/dashboard/dist/assets/OperatorDashboard-Dc80suXd.js +2 -0
- package/dashboard/dist/assets/OperatorDashboard-Dc80suXd.js.map +1 -0
- package/dashboard/dist/assets/PageHeader-SMD9qtOO.js +2 -0
- package/dashboard/dist/assets/PageHeader-SMD9qtOO.js.map +1 -0
- package/dashboard/dist/assets/PageHeaderWithStats-TikLQsTp.js +2 -0
- package/dashboard/dist/assets/PageHeaderWithStats-TikLQsTp.js.map +1 -0
- package/dashboard/dist/assets/PriorityBadge-CQ0EsLTA.js +2 -0
- package/dashboard/dist/assets/{PriorityBadge-DfQY9St9.js.map → PriorityBadge-CQ0EsLTA.js.map} +1 -1
- package/dashboard/dist/assets/ProcessDetailPage-B2GKuGzk.js +2 -0
- package/dashboard/dist/assets/ProcessDetailPage-B2GKuGzk.js.map +1 -0
- package/dashboard/dist/assets/ProcessesListPage-CTjI3Wn6.js +2 -0
- package/dashboard/dist/assets/ProcessesListPage-CTjI3Wn6.js.map +1 -0
- package/dashboard/dist/assets/RefreshButton-BcQDObrv.js +2 -0
- package/dashboard/dist/assets/RefreshButton-BcQDObrv.js.map +1 -0
- package/dashboard/dist/assets/RolePill-Crj4TH5p.js +2 -0
- package/dashboard/dist/assets/{RolePill-BTPa8L-P.js.map → RolePill-Crj4TH5p.js.map} +1 -1
- package/dashboard/dist/assets/RolesPage-C_RInUwS.js +2 -0
- package/dashboard/dist/assets/RolesPage-C_RInUwS.js.map +1 -0
- package/dashboard/dist/assets/RowActions-Cp5HyK_w.js +2 -0
- package/dashboard/dist/assets/{RowActions-Dg-Fsm5O.js.map → RowActions-Cp5HyK_w.js.map} +1 -1
- package/dashboard/dist/assets/RunAsSelector-BhyWtofX.js +2 -0
- package/dashboard/dist/assets/RunAsSelector-BhyWtofX.js.map +1 -0
- package/dashboard/dist/assets/StatCard-BKZLSgNV.js +2 -0
- package/dashboard/dist/assets/{StatCard-DlgF0CJC.js.map → StatCard-BKZLSgNV.js.map} +1 -1
- package/dashboard/dist/assets/StatusBadge-BYNGGZK5.js +2 -0
- package/dashboard/dist/assets/StatusBadge-BYNGGZK5.js.map +1 -0
- package/dashboard/dist/assets/StickyPagination-CTosgiU2.js +2 -0
- package/dashboard/dist/assets/{StickyPagination-F9FZsRy9.js.map → StickyPagination-CTosgiU2.js.map} +1 -1
- package/dashboard/dist/assets/SwimlaneTimeline-ylG5Ps1s.js +2 -0
- package/dashboard/dist/assets/SwimlaneTimeline-ylG5Ps1s.js.map +1 -0
- package/dashboard/dist/assets/TaskDetailPage-C9pDGdD2.js +2 -0
- package/dashboard/dist/assets/TaskDetailPage-C9pDGdD2.js.map +1 -0
- package/dashboard/dist/assets/TaskQueuePill-BtJbZTT0.js +2 -0
- package/dashboard/dist/assets/{TaskQueuePill-awmtb0qw.js.map → TaskQueuePill-BtJbZTT0.js.map} +1 -1
- package/dashboard/dist/assets/TasksListPage-DtFLUEhg.js +2 -0
- package/dashboard/dist/assets/{TasksListPage-C_QF23c1.js.map → TasksListPage-DtFLUEhg.js.map} +1 -1
- package/dashboard/dist/assets/TimeAgo-WuM6xImZ.js +2 -0
- package/dashboard/dist/assets/TimeAgo-WuM6xImZ.js.map +1 -0
- package/dashboard/dist/assets/TimestampCell-IVL_-Upy.js +2 -0
- package/dashboard/dist/assets/TimestampCell-IVL_-Upy.js.map +1 -0
- package/dashboard/dist/assets/UserName-DU9qeg13.js +2 -0
- package/dashboard/dist/assets/{UserName-DaP4YAKr.js.map → UserName-DU9qeg13.js.map} +1 -1
- package/dashboard/dist/assets/WorkflowExecutionPage-DOocX81f.js +2 -0
- package/dashboard/dist/assets/WorkflowExecutionPage-DOocX81f.js.map +1 -0
- package/dashboard/dist/assets/WorkflowPill-Diw8iWBP.js +2 -0
- package/dashboard/dist/assets/WorkflowPill-Diw8iWBP.js.map +1 -0
- package/dashboard/dist/assets/WorkflowsDashboard-DDtUIrTy.js +2 -0
- package/dashboard/dist/assets/WorkflowsDashboard-DDtUIrTy.js.map +1 -0
- package/dashboard/dist/assets/WorkflowsOverview-CPuvA4t3.js +2 -0
- package/dashboard/dist/assets/{WorkflowsOverview-D9OzzQqw.js.map → WorkflowsOverview-CPuvA4t3.js.map} +1 -1
- package/dashboard/dist/assets/YamlWorkflowsPage-DlwwkluN.js +2 -0
- package/dashboard/dist/assets/YamlWorkflowsPage-DlwwkluN.js.map +1 -0
- package/dashboard/dist/assets/{bots-BkKVMbUW.js → bots-BPiZXf2h.js} +2 -2
- package/dashboard/dist/assets/{bots-BkKVMbUW.js.map → bots-BPiZXf2h.js.map} +1 -1
- package/dashboard/dist/assets/constants-BHkpVaqx.js +2 -0
- package/dashboard/dist/assets/constants-BHkpVaqx.js.map +1 -0
- package/dashboard/dist/assets/escalation-DTY_OKRh.js +2 -0
- package/dashboard/dist/assets/escalation-DTY_OKRh.js.map +1 -0
- package/dashboard/dist/assets/escalation-columns-C91fHSkp.js +2 -0
- package/dashboard/dist/assets/{escalation-columns-D6aqStaY.js.map → escalation-columns-C91fHSkp.js.map} +1 -1
- package/dashboard/dist/assets/helpers-DBUZ9pnG.js +2 -0
- package/dashboard/dist/assets/helpers-DBUZ9pnG.js.map +1 -0
- package/dashboard/dist/assets/index-BOeA-gfK.js +17 -0
- package/dashboard/dist/assets/{index-X85K5bHC.js.map → index-BOeA-gfK.js.map} +1 -1
- package/dashboard/dist/assets/index-BZ6K_kmL.js +3 -0
- package/dashboard/dist/assets/index-BZ6K_kmL.js.map +1 -0
- package/dashboard/dist/assets/index-Bpm0yeoi.js +2 -0
- package/dashboard/dist/assets/index-Bpm0yeoi.js.map +1 -0
- package/dashboard/dist/assets/index-BtOwLI0K.js +2 -0
- package/dashboard/dist/assets/{index-DTPzZr_X.js.map → index-BtOwLI0K.js.map} +1 -1
- package/dashboard/dist/assets/index-CBF3ZvRZ.js +6 -0
- package/dashboard/dist/assets/index-CBF3ZvRZ.js.map +1 -0
- package/dashboard/dist/assets/index-CDWOfCmi.js +2 -0
- package/dashboard/dist/assets/index-CDWOfCmi.js.map +1 -0
- package/dashboard/dist/assets/index-Ce6sL__n.js +2 -0
- package/dashboard/dist/assets/index-Ce6sL__n.js.map +1 -0
- package/dashboard/dist/assets/index-DSzSoku1.js +283 -0
- package/dashboard/dist/assets/index-DSzSoku1.js.map +1 -0
- package/dashboard/dist/assets/index-D_qEAYrg.js +2 -0
- package/dashboard/dist/assets/index-D_qEAYrg.js.map +1 -0
- package/dashboard/dist/assets/index-gCy9XX3W.css +1 -0
- package/dashboard/dist/assets/mcp-BzVpaaKF.js +2 -0
- package/dashboard/dist/assets/{mcp-blCW6IL7.js.map → mcp-BzVpaaKF.js.map} +1 -1
- package/dashboard/dist/assets/mcp-query-wTuxTTCV.js +2 -0
- package/dashboard/dist/assets/mcp-query-wTuxTTCV.js.map +1 -0
- package/dashboard/dist/assets/{mcp-runs-ChPbpvXK.js → mcp-runs-DmXYJD19.js} +2 -2
- package/dashboard/dist/assets/{mcp-runs-ChPbpvXK.js.map → mcp-runs-DmXYJD19.js.map} +1 -1
- package/dashboard/dist/assets/namespaces-DoGa7jc7.js +2 -0
- package/dashboard/dist/assets/{namespaces-BgbaC3ow.js.map → namespaces-DoGa7jc7.js.map} +1 -1
- package/dashboard/dist/assets/{roles-ZNrqqnQl.js → roles-wCdQ2Z7k.js} +2 -2
- package/dashboard/dist/assets/{roles-ZNrqqnQl.js.map → roles-wCdQ2Z7k.js.map} +1 -1
- package/dashboard/dist/assets/settings-DDe_L7JT.js +2 -0
- package/dashboard/dist/assets/{settings-eBRSE0mQ.js.map → settings-DDe_L7JT.js.map} +1 -1
- package/dashboard/dist/assets/tasks-3Hih8Bt7.js +2 -0
- package/dashboard/dist/assets/{tasks-tRqClPns.js.map → tasks-3Hih8Bt7.js.map} +1 -1
- package/dashboard/dist/assets/{useFilterParams-BaXUAkYK.js → useFilterParams-BUyLHcx_.js} +2 -2
- package/dashboard/dist/assets/{useFilterParams-BaXUAkYK.js.map → useFilterParams-BUyLHcx_.js.map} +1 -1
- package/dashboard/dist/assets/{useNatsEvents-Xr43X1fG.js → useNatsEvents-DeGKHFTX.js} +2 -2
- package/dashboard/dist/assets/{useNatsEvents-Xr43X1fG.js.map → useNatsEvents-DeGKHFTX.js.map} +1 -1
- package/dashboard/dist/assets/{useYamlActivityEvents-BO51u8tm.js → useYamlActivityEvents-B5dHec6Y.js} +2 -2
- package/dashboard/dist/assets/{useYamlActivityEvents-BO51u8tm.js.map → useYamlActivityEvents-B5dHec6Y.js.map} +1 -1
- package/dashboard/dist/assets/{users-tMvNyOo8.js → users-BTagPmGW.js} +2 -2
- package/dashboard/dist/assets/{users-tMvNyOo8.js.map → users-BTagPmGW.js.map} +1 -1
- package/dashboard/dist/assets/{vendor-icons-ZTAKVwGc.js → vendor-icons-DCLlGYO9.js} +112 -57
- package/dashboard/dist/assets/vendor-icons-DCLlGYO9.js.map +1 -0
- package/dashboard/dist/assets/vendor-query-DLp59M9_.js +35 -0
- package/dashboard/dist/assets/vendor-query-DLp59M9_.js.map +1 -0
- package/dashboard/dist/assets/vendor-react-Co3Y8ikm.js +26 -0
- package/dashboard/dist/assets/vendor-react-Co3Y8ikm.js.map +1 -0
- package/dashboard/dist/assets/{workflows-Cc4VHcrp.js → workflows-B20dR3NE.js} +2 -2
- package/dashboard/dist/assets/{workflows-Cc4VHcrp.js.map → workflows-B20dR3NE.js.map} +1 -1
- package/dashboard/dist/assets/yaml-workflows-CaLPMQha.js +2 -0
- package/dashboard/dist/assets/yaml-workflows-CaLPMQha.js.map +1 -0
- package/dashboard/dist/index.html +5 -5
- package/docs/api/dba.md +81 -0
- package/docs/api/escalations.md +575 -0
- package/docs/api/exports.md +170 -0
- package/docs/api/maintenance.md +93 -0
- package/docs/api/mcp-runs.md +128 -0
- package/docs/api/mcp-servers.md +195 -0
- package/docs/api/namespaces.md +48 -0
- package/docs/api/roles.md +390 -0
- package/docs/api/service-accounts.md +188 -0
- package/docs/api/settings.md +33 -0
- package/docs/api/tasks.md +167 -0
- package/docs/api/users.md +180 -0
- package/docs/api/workflows.md +616 -0
- package/docs/api/yaml-workflows.md +312 -0
- package/docs/architecture.md +221 -0
- package/docs/auth.md +181 -0
- package/docs/cloud.md +272 -0
- package/docs/compilation.md +136 -0
- package/docs/contributing.md +56 -0
- package/docs/dashboard.md +145 -0
- package/docs/data.md +478 -0
- package/docs/escalation-strategies.md +264 -0
- package/docs/events.md +251 -0
- package/docs/iam.md +222 -0
- package/docs/img/01-login.png +0 -0
- package/docs/img/02-dashboard-home.png +0 -0
- package/docs/img/03-processes-list.png +0 -0
- package/docs/img/04-escalations-list.png +0 -0
- package/docs/img/05-mcp-servers.png +0 -0
- package/docs/img/06-mcp-pipelines.png +0 -0
- package/docs/img/07-workflows-list.png +0 -0
- package/docs/img/compilation/01-query-submit.png +0 -0
- package/docs/img/compilation/02-mcp-servers.png +0 -0
- package/docs/img/compilation/03-query-completed.png +0 -0
- package/docs/img/compilation/04-wizard-original.png +0 -0
- package/docs/img/compilation/05-wizard-timeline.png +0 -0
- package/docs/img/compilation/06-wizard-profile.png +0 -0
- package/docs/img/compilation/07-wizard-deploy.png +0 -0
- package/docs/img/compilation/08-wizard-test-modal.png +0 -0
- package/docs/img/compilation/09-wizard-test-compare.png +0 -0
- package/docs/img/compilation/10-wizard-verify.png +0 -0
- package/docs/logging.md +110 -0
- package/docs/maintenance.md +221 -0
- package/docs/mcp.md +715 -0
- package/docs/oauth-and-delegation.md +469 -0
- package/docs/telemetry.md +144 -0
- package/docs/workflows.md +695 -0
- package/lib/db/schemas/015_knowledge.sql +23 -0
- package/package.json +8 -9
- package/build/services/db/index.d.ts +0 -3
- package/build/services/mcp/vision-server.d.ts +0 -15
- package/build/services/mcp/vision-server.js +0 -214
- package/build/system/mcp-servers/document-vision.js +0 -228
- package/build/system/mcp-servers/prompts.d.ts +0 -4
- package/build/system/mcp-servers/prompts.js +0 -10
- package/dashboard/dist/assets/AdminDashboard-jfacvOC7.js +0 -2
- package/dashboard/dist/assets/AdminDashboard-jfacvOC7.js.map +0 -1
- package/dashboard/dist/assets/AvailableEscalationsPage-BglLDoT8.js +0 -2
- package/dashboard/dist/assets/AvailableEscalationsPage-BglLDoT8.js.map +0 -1
- package/dashboard/dist/assets/BotPicker-D6FYW1Gt.js +0 -2
- package/dashboard/dist/assets/CollapsibleSection-Cxk4wvjT.js +0 -2
- package/dashboard/dist/assets/ConfirmDeleteModal-FSXyKjaB.js +0 -2
- package/dashboard/dist/assets/CopyableId-CBdxWfp8.js +0 -2
- package/dashboard/dist/assets/CredentialsPage-Ikzsot0w.js +0 -2
- package/dashboard/dist/assets/CustomDurationPicker-CAninCbl.js +0 -2
- package/dashboard/dist/assets/DataTable-BDn1WBHS.js +0 -2
- package/dashboard/dist/assets/DataTable-BDn1WBHS.js.map +0 -1
- package/dashboard/dist/assets/EmptyState-2CmV-IaS.js +0 -2
- package/dashboard/dist/assets/EscalationsOverview-GXYFPASS.js +0 -2
- package/dashboard/dist/assets/EventTable-B01oJf6Y.js +0 -2
- package/dashboard/dist/assets/Field-DuFBAYhu.js +0 -2
- package/dashboard/dist/assets/Field-DuFBAYhu.js.map +0 -1
- package/dashboard/dist/assets/FilterBar-Ck4K4rzu.js +0 -2
- package/dashboard/dist/assets/McpOverview-JkvRcX2e.js +0 -2
- package/dashboard/dist/assets/McpQueryDetailPage-CUMqhQdS.js +0 -2
- package/dashboard/dist/assets/McpQueryDetailPage-CUMqhQdS.js.map +0 -1
- package/dashboard/dist/assets/McpQueryPage-DRRhw4nN.js +0 -2
- package/dashboard/dist/assets/McpQueryPage-DRRhw4nN.js.map +0 -1
- package/dashboard/dist/assets/McpRunDetailPage-CmPs5EvE.js +0 -2
- package/dashboard/dist/assets/McpRunDetailPage-CmPs5EvE.js.map +0 -1
- package/dashboard/dist/assets/McpRunsPage-Dl5Y2u6k.js +0 -2
- package/dashboard/dist/assets/McpRunsPage-Dl5Y2u6k.js.map +0 -1
- package/dashboard/dist/assets/Modal-B4rbIVAn.js +0 -2
- package/dashboard/dist/assets/OperatorDashboard-B56il28q.js +0 -2
- package/dashboard/dist/assets/OperatorDashboard-B56il28q.js.map +0 -1
- package/dashboard/dist/assets/PageHeader-CpWFly5S.js +0 -2
- package/dashboard/dist/assets/PageHeader-CpWFly5S.js.map +0 -1
- package/dashboard/dist/assets/PriorityBadge-DfQY9St9.js +0 -2
- package/dashboard/dist/assets/ProcessDetailPage-CMLq4M7D.js +0 -2
- package/dashboard/dist/assets/ProcessDetailPage-CMLq4M7D.js.map +0 -1
- package/dashboard/dist/assets/ProcessesListPage-CZ_HF06v.js +0 -2
- package/dashboard/dist/assets/ProcessesListPage-CZ_HF06v.js.map +0 -1
- package/dashboard/dist/assets/RolePill-BTPa8L-P.js +0 -2
- package/dashboard/dist/assets/RolesPage-9grZW7yR.js +0 -2
- package/dashboard/dist/assets/RolesPage-9grZW7yR.js.map +0 -1
- package/dashboard/dist/assets/RowActions-Dg-Fsm5O.js +0 -2
- package/dashboard/dist/assets/SimpleMarkdown-CBlvaWP4.js +0 -4
- package/dashboard/dist/assets/SimpleMarkdown-CBlvaWP4.js.map +0 -1
- package/dashboard/dist/assets/StatCard-DlgF0CJC.js +0 -2
- package/dashboard/dist/assets/StatusBadge-TlC4jiig.js +0 -2
- package/dashboard/dist/assets/StatusBadge-TlC4jiig.js.map +0 -1
- package/dashboard/dist/assets/StickyPagination-F9FZsRy9.js +0 -2
- package/dashboard/dist/assets/SwimlaneTimeline-7SiwATsZ.js +0 -2
- package/dashboard/dist/assets/SwimlaneTimeline-7SiwATsZ.js.map +0 -1
- package/dashboard/dist/assets/TaskDetailPage-CbPVTakt.js +0 -2
- package/dashboard/dist/assets/TaskDetailPage-CbPVTakt.js.map +0 -1
- package/dashboard/dist/assets/TaskQueuePill-awmtb0qw.js +0 -2
- package/dashboard/dist/assets/TasksListPage-C_QF23c1.js +0 -2
- package/dashboard/dist/assets/TimeAgo-UPG6DoH8.js +0 -2
- package/dashboard/dist/assets/TimeAgo-UPG6DoH8.js.map +0 -1
- package/dashboard/dist/assets/TimestampCell-DoWMKg6w.js +0 -2
- package/dashboard/dist/assets/TimestampCell-DoWMKg6w.js.map +0 -1
- package/dashboard/dist/assets/UserName-DaP4YAKr.js +0 -2
- package/dashboard/dist/assets/VersionHistory-Bt7WBr6m.js +0 -5
- package/dashboard/dist/assets/VersionHistory-Bt7WBr6m.js.map +0 -1
- package/dashboard/dist/assets/WorkflowExecutionPage-DjtAQ3hy.js +0 -2
- package/dashboard/dist/assets/WorkflowExecutionPage-DjtAQ3hy.js.map +0 -1
- package/dashboard/dist/assets/WorkflowPill-CCDSVaQj.js +0 -2
- package/dashboard/dist/assets/WorkflowPill-CCDSVaQj.js.map +0 -1
- package/dashboard/dist/assets/WorkflowsDashboard-D8z9uBNB.js +0 -2
- package/dashboard/dist/assets/WorkflowsDashboard-D8z9uBNB.js.map +0 -1
- package/dashboard/dist/assets/WorkflowsOverview-D9OzzQqw.js +0 -2
- package/dashboard/dist/assets/YamlWorkflowDetailPage-DrDvvP62.js +0 -3
- package/dashboard/dist/assets/YamlWorkflowDetailPage-DrDvvP62.js.map +0 -1
- package/dashboard/dist/assets/YamlWorkflowsPage-COqiNCQK.js +0 -2
- package/dashboard/dist/assets/YamlWorkflowsPage-COqiNCQK.js.map +0 -1
- package/dashboard/dist/assets/constants-CgaZfe5d.js +0 -2
- package/dashboard/dist/assets/constants-CgaZfe5d.js.map +0 -1
- package/dashboard/dist/assets/escalation-columns-D6aqStaY.js +0 -2
- package/dashboard/dist/assets/escalation-qalymbKB.js +0 -2
- package/dashboard/dist/assets/escalation-qalymbKB.js.map +0 -1
- package/dashboard/dist/assets/format-gXZXQ-HJ.js +0 -2
- package/dashboard/dist/assets/format-gXZXQ-HJ.js.map +0 -1
- package/dashboard/dist/assets/helpers-0gSleuzT.js +0 -2
- package/dashboard/dist/assets/helpers-0gSleuzT.js.map +0 -1
- package/dashboard/dist/assets/index-BWvMHed7.js +0 -6
- package/dashboard/dist/assets/index-BWvMHed7.js.map +0 -1
- package/dashboard/dist/assets/index-BaszoPO_.css +0 -1
- package/dashboard/dist/assets/index-Cn2jyj9A.js +0 -2
- package/dashboard/dist/assets/index-Cn2jyj9A.js.map +0 -1
- package/dashboard/dist/assets/index-D8VH6K8B.js +0 -54
- package/dashboard/dist/assets/index-D8VH6K8B.js.map +0 -1
- package/dashboard/dist/assets/index-D9SYwJsi.js +0 -3
- package/dashboard/dist/assets/index-D9SYwJsi.js.map +0 -1
- package/dashboard/dist/assets/index-DTPzZr_X.js +0 -2
- package/dashboard/dist/assets/index-D_6AB5BE.js +0 -2
- package/dashboard/dist/assets/index-D_6AB5BE.js.map +0 -1
- package/dashboard/dist/assets/index-S9Ks2Lj2.js +0 -2
- package/dashboard/dist/assets/index-S9Ks2Lj2.js.map +0 -1
- package/dashboard/dist/assets/index-X85K5bHC.js +0 -17
- package/dashboard/dist/assets/index-rjmgHlSH.js +0 -2
- package/dashboard/dist/assets/index-rjmgHlSH.js.map +0 -1
- package/dashboard/dist/assets/mcp-blCW6IL7.js +0 -2
- package/dashboard/dist/assets/mcp-query-DoAyPbjC.js +0 -2
- package/dashboard/dist/assets/mcp-query-DoAyPbjC.js.map +0 -1
- package/dashboard/dist/assets/namespaces-BgbaC3ow.js +0 -2
- package/dashboard/dist/assets/settings-eBRSE0mQ.js +0 -2
- package/dashboard/dist/assets/tasks-tRqClPns.js +0 -2
- package/dashboard/dist/assets/vendor-icons-ZTAKVwGc.js.map +0 -1
- package/dashboard/dist/assets/vendor-query-B2UbickB.js +0 -18
- package/dashboard/dist/assets/vendor-query-B2UbickB.js.map +0 -1
- package/dashboard/dist/assets/vendor-react-Cw8Gy8NJ.js +0 -22
- package/dashboard/dist/assets/vendor-react-Cw8Gy8NJ.js.map +0 -1
- package/dashboard/dist/assets/yaml-workflows-BL4V5CQy.js +0 -2
- package/dashboard/dist/assets/yaml-workflows-BL4V5CQy.js.map +0 -1
- /package/build/{services → lib}/db/migrate.d.ts +0 -0
- /package/build/{services → lib}/events/index.d.ts +0 -0
- /package/build/{services → lib}/events/index.js +0 -0
- /package/build/{services → lib}/events/memory.d.ts +0 -0
- /package/build/{services → lib}/events/memory.js +0 -0
- /package/build/{services → lib}/events/nats.d.ts +0 -0
- /package/build/{services → lib}/events/nats.js +0 -0
- /package/build/{services → lib}/events/publish.d.ts +0 -0
- /package/build/{services → lib}/events/publish.js +0 -0
- /package/build/{services → lib}/events/socketio.d.ts +0 -0
- /package/build/{services → lib}/events/socketio.js +0 -0
- /package/build/{services → lib}/logger/index.d.ts +0 -0
- /package/build/{services → lib}/logger/index.js +0 -0
- /package/build/{services → lib}/logger/pino.d.ts +0 -0
- /package/build/{services → lib}/logger/pino.js +0 -0
- /package/build/{services → lib}/storage/index.d.ts +0 -0
- /package/build/{services → lib}/storage/index.js +0 -0
- /package/build/{services → lib}/storage/local.d.ts +0 -0
- /package/build/{services → lib}/storage/local.js +0 -0
- /package/build/{services → lib}/storage/s3.d.ts +0 -0
- /package/build/{services → lib}/storage/s3.js +0 -0
- /package/build/{services → lib}/storage/types.d.ts +0 -0
- /package/build/{services → lib}/storage/types.js +0 -0
- /package/build/{services → lib}/telemetry/index.d.ts +0 -0
- /package/build/{services → lib}/telemetry/index.js +0 -0
- /package/{services → lib}/db/README.md +0 -0
- /package/{services → lib}/db/schemas/001_schema.sql +0 -0
- /package/{services → lib}/db/schemas/002_seed.sql +0 -0
- /package/{services → lib}/db/schemas/003_workflow_discovery.sql +0 -0
- /package/{services → lib}/db/schemas/004_query_router.sql +0 -0
- /package/{services → lib}/db/schemas/005_triage_router.sql +0 -0
- /package/{services → lib}/db/schemas/006_oauth.sql +0 -0
- /package/{services → lib}/db/schemas/007_security.sql +0 -0
- /package/{services → lib}/db/schemas/008_bot_accounts.sql +0 -0
- /package/{services → lib}/db/schemas/009_audit_trail.sql +0 -0
- /package/{services → lib}/db/schemas/010_credential_providers.sql +0 -0
- /package/{services → lib}/db/schemas/011_system_workflow_configs.sql +0 -0
- /package/{services → lib}/db/schemas/012_drop_modality.sql +0 -0
- /package/{services → lib}/db/schemas/013_execute_as.sql +0 -0
- /package/{services → lib}/db/schemas/014_ephemeral_credentials.sql +0 -0
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
# Dashboard Guide
|
|
2
|
+
|
|
3
|
+
The Long Tail dashboard is a React single-page application for managing durable workflows, MCP pipelines, escalations, and system administration. It connects to the Long Tail backend over REST and receives real-time updates via NATS subscriptions.
|
|
4
|
+
|
|
5
|
+
## Sidebar Navigation
|
|
6
|
+
|
|
7
|
+
The sidebar organizes pages into three groups.
|
|
8
|
+
|
|
9
|
+
### Durable Workflows
|
|
10
|
+
|
|
11
|
+
| Page | Purpose |
|
|
12
|
+
|------|---------|
|
|
13
|
+
| **Workflow Registry** | Lists all discovered workflows. Each row shows a Certified (ShieldCheck icon, accent blue), Pipeline (Wand2 icon, purple), or Durable badge. Certify or de-certify workflows from this page. |
|
|
14
|
+
| **Invoke Workflow** | Unified launch page for all durable workflows. Start a workflow immediately or schedule it on a cron. Certified and durable workflows appear together with visual distinction. |
|
|
15
|
+
| **All Escalations** | Queue of pending, claimed, and resolved escalations. Claim an escalation to lock it, then resolve with a payload that triggers a workflow re-run. |
|
|
16
|
+
| **Durable Executions** | All workflow runs. Filter by tier: All, Certified, or Durable. Each row shows duration and links to execution details, task records, and escalation history. |
|
|
17
|
+
|
|
18
|
+
### MCP Workflows
|
|
19
|
+
|
|
20
|
+
| Page | Purpose |
|
|
21
|
+
|------|---------|
|
|
22
|
+
| **MCP Server Tools** | Browse all registered MCP servers and their exposed tools. View tool schemas, tags, and compile hints. |
|
|
23
|
+
| **MCP Pipeline Tools** | Tools available within MCP pipelines. Shows which tools the pipeline orchestrator can discover and invoke. |
|
|
24
|
+
| **Pipeline Designer** | Six-step compilation wizard. Submit a query, review the dynamic execution, compile to a deterministic pipeline, deploy, test, and verify end-to-end routing. Detailed below. |
|
|
25
|
+
| **Pipeline Executions** | Execution history for MCP pipelines. Shows both dynamic (agentic) and compiled (deterministic) runs, with duration for each. |
|
|
26
|
+
|
|
27
|
+
### Admin
|
|
28
|
+
|
|
29
|
+
| Page | Purpose |
|
|
30
|
+
|------|---------|
|
|
31
|
+
| **Accounts** | Unified management for User Accounts and Service Accounts, toggled by tab. Create, edit, and assign roles. Service accounts get API keys for programmatic access. |
|
|
32
|
+
| **Roles & Permissions** | Define roles and assign them to users. Roles control which escalations a user can see and claim. |
|
|
33
|
+
| **DB Maintenance** | Database housekeeping. Vacuum, reindex, and view table statistics. |
|
|
34
|
+
| **Task Queues** | View active task queues, connected workers, and queue depth. |
|
|
35
|
+
|
|
36
|
+
### Header
|
|
37
|
+
|
|
38
|
+
The top navigation bar contains:
|
|
39
|
+
|
|
40
|
+
- **Home logo** — links to the home page (`/`), which shows all business processes.
|
|
41
|
+
- **Quick Query** — a search/prompt field for launching MCP queries directly from the header.
|
|
42
|
+
- **Documentation** (BookOpen icon) — toggles an in-app documentation drawer.
|
|
43
|
+
- **Inbox** (Inbox icon) — links to `/escalations/queue` (My Escalations). Shows a badge count of pending escalations for the current user's roles.
|
|
44
|
+
- **NATS status indicator** — shows connection health.
|
|
45
|
+
- **User menu** (User icon) — dropdown with Credentials and Sign Out options.
|
|
46
|
+
|
|
47
|
+
## Key Pages
|
|
48
|
+
|
|
49
|
+
### Workflow Registry
|
|
50
|
+
|
|
51
|
+
Shows every workflow the system has discovered across all registered workers. Each workflow displays one of three badges:
|
|
52
|
+
|
|
53
|
+
- **Certified** (ShieldCheck icon, accent blue) -- has an `lt_config_workflows` entry. Full interceptor tracking, escalation chains, and invocation controls.
|
|
54
|
+
- **Pipeline** (Wand2 icon, purple) -- a compiled deterministic workflow deployed from a successful MCP execution.
|
|
55
|
+
- **Durable** (Workflow icon, muted) -- registered as a HotMesh worker but not certified. Checkpointed execution and retries, but no interceptor wrapping.
|
|
56
|
+
|
|
57
|
+
Click a workflow to view its config. Certify a durable workflow by creating a config entry; de-certify by removing it. The workflow itself does not change -- only the infrastructure wrapping it.
|
|
58
|
+
|
|
59
|
+
### Invoke Workflow
|
|
60
|
+
|
|
61
|
+
A single page for starting any durable workflow. Select the workflow, provide input data as JSON, and choose:
|
|
62
|
+
|
|
63
|
+
- **Start Now** -- immediate execution.
|
|
64
|
+
- **Schedule** -- provide a cron expression for recurring execution.
|
|
65
|
+
|
|
66
|
+
Certified and durable workflows both appear in the list. Certified workflows show the shield icon so operators can distinguish which runs will have full tracking and escalation support.
|
|
67
|
+
|
|
68
|
+
### Pipeline Designer
|
|
69
|
+
|
|
70
|
+
The Pipeline Designer page lists previous MCP query runs and provides a prompt to start new ones. Click into a completed run to open the six-step **Compilation Wizard**:
|
|
71
|
+
|
|
72
|
+
1. **Describe** -- View the original dynamic execution: input envelope and structured output side by side.
|
|
73
|
+
2. **Discover** -- Swimlane timeline of tool calls, grouped by MCP server, positioned on a time axis.
|
|
74
|
+
3. **Compile** -- Define the deterministic workflow: namespace, tool name, description, tags. Triggers the five-stage compilation pipeline.
|
|
75
|
+
4. **Deploy** -- Review the compiled YAML DAG, input/output schemas, and version history. Deploy and activate.
|
|
76
|
+
5. **Test** -- Run the compiled workflow and compare results side-by-side against the original dynamic execution.
|
|
77
|
+
6. **Verify** -- End-to-end routing verification. Submit the original prompt through `mcpQueryRouter` to confirm the deterministic path is discovered and used.
|
|
78
|
+
|
|
79
|
+
Steps unlock sequentially. Compiled pipelines appear in **Pipeline Executions** as deterministic runs, which are faster and cheaper than their dynamic counterparts. See the [Compilation Pipeline](compilation.md) guide for the full walkthrough.
|
|
80
|
+
|
|
81
|
+
### Durable Executions
|
|
82
|
+
|
|
83
|
+
Lists all workflow runs across the system. The tier filter at the top switches between:
|
|
84
|
+
|
|
85
|
+
- **All** -- every execution.
|
|
86
|
+
- **Certified** -- only workflows with `lt_config_workflows` entries.
|
|
87
|
+
- **Durable** -- only uncertified durable workflows.
|
|
88
|
+
|
|
89
|
+
Each row shows workflow name, status, start time, and duration (computed from start to completion). Click through to see the full task record, activity checkpoints, milestones, and any associated escalations.
|
|
90
|
+
|
|
91
|
+
### Accounts
|
|
92
|
+
|
|
93
|
+
User Accounts and Service Accounts live on the same page, separated by a tab toggle.
|
|
94
|
+
|
|
95
|
+
- **User Accounts** -- human operators. Assign roles, set display names, manage access.
|
|
96
|
+
- **Service Accounts** -- programmatic callers (bots, CI pipelines, external systems). Each service account has an API key for authentication. Assign roles to control which workflows a service account can invoke and which escalations it can interact with.
|
|
97
|
+
|
|
98
|
+
Both account types participate in the same role system. A service account with the `reviewer` role can claim and resolve escalations just like a human user.
|
|
99
|
+
|
|
100
|
+
### Escalation Detail
|
|
101
|
+
|
|
102
|
+
Click any escalation to open a full-page detail view. The page has a hero section summarizing the escalation, an action bar (Claim, Resolve, Escalate, Triage options), a resolver form when claimed, a timeline of events, and the full context data. Triage options are available when the MCP escalation strategy is configured.
|
|
103
|
+
|
|
104
|
+
### Escalations Overview
|
|
105
|
+
|
|
106
|
+
Accessible at `/escalations`, the overview page shows summary statistics across configurable time windows (1h, 24h, 7d, 30d): open, claimed, created, and resolved counts. A breakdown table groups escalations by role.
|
|
107
|
+
|
|
108
|
+
### Workflows Overview
|
|
109
|
+
|
|
110
|
+
Accessible at `/workflows`, the overview page shows workflow statistics across time windows (1h, 24h, 7d, 30d): total, running, completed, failed counts, and average duration grouped by workflow type.
|
|
111
|
+
|
|
112
|
+
### MCP Overview
|
|
113
|
+
|
|
114
|
+
Accessible at `/mcp`, the overview page shows MCP server and tool statistics alongside pipeline execution history across time windows.
|
|
115
|
+
|
|
116
|
+
### Process Detail
|
|
117
|
+
|
|
118
|
+
Click any process on the home page (`/`) to open a detail view at `/processes/detail/:originId`. This shows a swimlane timeline of all tasks and escalations sharing the same origin, giving a unified view of a multi-step workflow's progress.
|
|
119
|
+
|
|
120
|
+
### Credentials
|
|
121
|
+
|
|
122
|
+
Accessible via the user menu in the header (or at `/credentials`), this page lets users manage their OAuth provider connections and API keys. Status, credential type, and expiry are visible. Users connect or revoke providers here.
|
|
123
|
+
|
|
124
|
+
## Global Features
|
|
125
|
+
|
|
126
|
+
### Inbox
|
|
127
|
+
|
|
128
|
+
The Inbox icon in the header shows a badge count when the current user has pending escalations assigned to their roles. The count updates live via a NATS subscription — no polling or page refresh needed.
|
|
129
|
+
|
|
130
|
+
Click the icon to jump to **My Escalations** (`/escalations/queue`) — the operator dashboard showing claimed escalations with time-remaining columns, filter bar, and release actions.
|
|
131
|
+
|
|
132
|
+
### Event Feed
|
|
133
|
+
|
|
134
|
+
The bottom bar contains a collapsible live event stream. Click the radio icon to toggle it open or closed. When open, it displays a real-time feed of:
|
|
135
|
+
|
|
136
|
+
- Workflow start and completion events
|
|
137
|
+
- Task state transitions
|
|
138
|
+
- Escalation creation, claim, and resolution
|
|
139
|
+
- Activity checkpoint events
|
|
140
|
+
|
|
141
|
+
Events stream in via NATS subscription. The feed is useful during development and debugging to watch workflow execution unfold in real time.
|
|
142
|
+
|
|
143
|
+
### Page Transitions
|
|
144
|
+
|
|
145
|
+
Navigation between pages uses a smooth fade transition. This keeps the UI responsive during client-side routing and prevents visual jarring when switching contexts.
|
package/docs/data.md
ADDED
|
@@ -0,0 +1,478 @@
|
|
|
1
|
+
# Data Model
|
|
2
|
+
|
|
3
|
+
Long Tail stores all state in PostgreSQL. The tables handle workflow tracking, escalation management, user identity, configuration, MCP server registration, compiled workflows, OAuth tokens, service tokens, ephemeral credentials, and namespace isolation. A single migration file (`services/db/schemas/001_initial.sql`) creates the full schema; the migration runner (`services/db/migrate.ts`) tracks applied files in `lt_migrations` so migrations are idempotent.
|
|
4
|
+
|
|
5
|
+
## Tables
|
|
6
|
+
|
|
7
|
+
### lt_roles
|
|
8
|
+
|
|
9
|
+
Canonical role registry. Roles referenced by other tables are seeded here.
|
|
10
|
+
|
|
11
|
+
| Column | Type | Default | Description |
|
|
12
|
+
|--------|------|---------|-------------|
|
|
13
|
+
| `role` | `TEXT` | — | Primary key |
|
|
14
|
+
| `created_at` | `TIMESTAMPTZ NOT NULL` | `NOW()` | Row creation time |
|
|
15
|
+
|
|
16
|
+
**Seeds:** `reviewer`, `engineer`, `admin`, `superadmin`.
|
|
17
|
+
|
|
18
|
+
### lt_tasks
|
|
19
|
+
|
|
20
|
+
Tracks every workflow execution. Created by the LT interceptor when a workflow starts; updated when it completes or fails.
|
|
21
|
+
|
|
22
|
+
| Column | Type | Default | Description |
|
|
23
|
+
|--------|------|---------|-------------|
|
|
24
|
+
| `id` | `UUID` | `gen_random_uuid()` | Primary key |
|
|
25
|
+
| `workflow_id` | `TEXT NOT NULL` | — | HotMesh workflow ID (unique per execution) |
|
|
26
|
+
| `workflow_type` | `TEXT NOT NULL` | — | Registered workflow name (e.g., `reviewContent`) |
|
|
27
|
+
| `lt_type` | `TEXT NOT NULL` | — | Classification set by the interceptor |
|
|
28
|
+
| `task_queue` | `TEXT` | — | Task queue the workflow ran on |
|
|
29
|
+
| `modality` | `TEXT` | — | Modality from workflow config |
|
|
30
|
+
| `status` | `TEXT NOT NULL` | `'pending'` | `pending` or `completed` |
|
|
31
|
+
| `priority` | `INTEGER NOT NULL` | `2` | Numeric priority (lower = higher priority) |
|
|
32
|
+
| `signal_id` | `TEXT NOT NULL` | — | HotMesh signal ID for resume/replay |
|
|
33
|
+
| `parent_workflow_id` | `TEXT NOT NULL` | — | ID of the orchestrator that started this workflow |
|
|
34
|
+
| `origin_id` | `TEXT` | — | Correlation ID shared by sibling workflows under the same orchestrator |
|
|
35
|
+
| `parent_id` | `TEXT` | — | Direct parent workflow ID |
|
|
36
|
+
| `trace_id` | `TEXT` | — | Distributed tracing trace ID |
|
|
37
|
+
| `span_id` | `TEXT` | — | Distributed tracing span ID |
|
|
38
|
+
| `initiated_by` | `UUID` | — | FK to `lt_users(id)` — user or bot that started this task |
|
|
39
|
+
| `principal_type` | `TEXT` | `'user'` | `user` or `bot` (for audit filtering) |
|
|
40
|
+
| `started_at` | `TIMESTAMPTZ NOT NULL` | `NOW()` | When the workflow began |
|
|
41
|
+
| `completed_at` | `TIMESTAMPTZ` | — | When the workflow finished (null while pending) |
|
|
42
|
+
| `envelope` | `TEXT NOT NULL` | — | JSON-serialized input envelope |
|
|
43
|
+
| `metadata` | `JSONB` | — | Arbitrary metadata attached at workflow start |
|
|
44
|
+
| `error` | `TEXT` | — | Error message if the workflow failed |
|
|
45
|
+
| `milestones` | `JSONB NOT NULL` | `'[]'` | Array of milestone objects emitted during execution |
|
|
46
|
+
| `data` | `TEXT` | — | JSON-serialized workflow return data |
|
|
47
|
+
| `created_at` | `TIMESTAMPTZ NOT NULL` | `NOW()` | Row creation time |
|
|
48
|
+
| `updated_at` | `TIMESTAMPTZ NOT NULL` | `NOW()` | Last modification (auto-updated by trigger) |
|
|
49
|
+
|
|
50
|
+
**Indexes:**
|
|
51
|
+
|
|
52
|
+
| Index | Columns | Purpose |
|
|
53
|
+
|-------|---------|---------|
|
|
54
|
+
| `idx_lt_tasks_status_type` | `(status, workflow_type, created_at DESC)` | Filter tasks by status and type |
|
|
55
|
+
| `idx_lt_tasks_parent` | `(parent_workflow_id, created_at DESC)` | Find all tasks under an orchestrator |
|
|
56
|
+
| `idx_lt_tasks_lt_type` | `(lt_type, status, created_at DESC)` | Filter by interceptor classification |
|
|
57
|
+
| `idx_lt_tasks_completed` | `(completed_at, status)` | Maintenance queries for old completed tasks |
|
|
58
|
+
| `idx_lt_tasks_signal` | `(signal_id)` | Look up task by HotMesh signal |
|
|
59
|
+
| `idx_lt_tasks_origin` | `(origin_id, created_at DESC)` | Consumer/provider data injection — find sibling tasks sharing an origin |
|
|
60
|
+
| `idx_lt_tasks_workflow_id` | `(workflow_id)` | Resolve workflow handle by workflow ID |
|
|
61
|
+
| `idx_lt_tasks_origin_id` | `(origin_id)` | Look up tasks by origin ID |
|
|
62
|
+
| `idx_lt_tasks_trace` | `(trace_id)` | Look up tasks by trace ID |
|
|
63
|
+
|
|
64
|
+
### lt_escalations
|
|
65
|
+
|
|
66
|
+
Records human intervention requests. Created when a workflow returns `type: 'escalation'`. Updated when claimed or resolved.
|
|
67
|
+
|
|
68
|
+
| Column | Type | Default | Description |
|
|
69
|
+
|--------|------|---------|-------------|
|
|
70
|
+
| `id` | `UUID` | `gen_random_uuid()` | Primary key |
|
|
71
|
+
| `type` | `TEXT NOT NULL` | — | Escalation category (e.g., `review`, `verification`) |
|
|
72
|
+
| `subtype` | `TEXT NOT NULL` | — | Subcategory for finer routing |
|
|
73
|
+
| `modality` | `TEXT NOT NULL` | — | Modality from workflow config |
|
|
74
|
+
| `description` | `TEXT` | — | Human-readable reason for the escalation |
|
|
75
|
+
| `status` | `TEXT NOT NULL` | `'pending'` | `pending` or `resolved` |
|
|
76
|
+
| `priority` | `INTEGER NOT NULL` | `2` | Numeric priority |
|
|
77
|
+
| `task_id` | `UUID` | — | FK to `lt_tasks(id)` — the task that triggered this escalation |
|
|
78
|
+
| `origin_id` | `TEXT` | — | Correlation ID from the parent orchestrator |
|
|
79
|
+
| `parent_id` | `TEXT` | — | Direct parent workflow ID |
|
|
80
|
+
| `workflow_id` | `TEXT` | — | HotMesh workflow ID of the escalated workflow |
|
|
81
|
+
| `task_queue` | `TEXT` | — | Task queue the workflow runs on (needed for resolution re-run) |
|
|
82
|
+
| `workflow_type` | `TEXT` | — | Workflow name (needed for resolution re-run) |
|
|
83
|
+
| `role` | `TEXT NOT NULL` | — | Target role — users with this role see the escalation |
|
|
84
|
+
| `assigned_to` | `TEXT` | — | User ID of the claimer |
|
|
85
|
+
| `assigned_until` | `TIMESTAMPTZ` | — | Claim expiry — after this time the escalation returns to the queue |
|
|
86
|
+
| `resolved_at` | `TIMESTAMPTZ` | — | When the escalation was resolved |
|
|
87
|
+
| `claimed_at` | `TIMESTAMPTZ` | — | When the escalation was claimed |
|
|
88
|
+
| `envelope` | `TEXT NOT NULL` | — | JSON-serialized original workflow envelope |
|
|
89
|
+
| `metadata` | `JSONB` | — | Arbitrary metadata |
|
|
90
|
+
| `escalation_payload` | `TEXT` | — | JSON-serialized data the workflow attached to the escalation |
|
|
91
|
+
| `resolver_payload` | `TEXT` | — | JSON-serialized decision from the human reviewer |
|
|
92
|
+
| `trace_id` | `TEXT` | — | Distributed tracing trace ID |
|
|
93
|
+
| `span_id` | `TEXT` | — | Distributed tracing span ID |
|
|
94
|
+
| `created_at` | `TIMESTAMPTZ NOT NULL` | `NOW()` | Row creation time |
|
|
95
|
+
| `updated_at` | `TIMESTAMPTZ NOT NULL` | `NOW()` | Last modification |
|
|
96
|
+
|
|
97
|
+
**Claiming is implicit.** There is no separate status for "claimed". An escalation is considered claimed when `assigned_to IS NOT NULL` and `assigned_until > NOW()`. When the claim expires, the escalation is available again without any status change. The `/available` endpoint uses this logic:
|
|
98
|
+
|
|
99
|
+
```sql
|
|
100
|
+
WHERE status = 'pending'
|
|
101
|
+
AND (assigned_to IS NULL OR assigned_until <= NOW())
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
**Indexes:**
|
|
105
|
+
|
|
106
|
+
| Index | Columns | Purpose |
|
|
107
|
+
|-------|---------|---------|
|
|
108
|
+
| `idx_lt_escalations_available` | `(status, role, assigned_until, created_at DESC)` | Available escalation query |
|
|
109
|
+
| `idx_lt_escalations_available_v2` | `(role, priority, created_at DESC) WHERE status = 'pending'` | Partial index for priority-ordered available queries |
|
|
110
|
+
| `idx_lt_escalations_assigned` | `(assigned_to, assigned_until, created_at DESC)` | Find escalations claimed by a specific user |
|
|
111
|
+
| `idx_lt_escalations_expiry` | `(assigned_until, assigned_to)` | Expire stale claims |
|
|
112
|
+
| `idx_lt_escalations_role_type` | `(role, status, type, created_at DESC)` | Filter by role + type |
|
|
113
|
+
| `idx_lt_escalations_role_subtype` | `(role, status, type, subtype, created_at DESC)` | Filter by role + type + subtype |
|
|
114
|
+
| `idx_lt_escalations_status` | `(status, created_at DESC)` | General status queries |
|
|
115
|
+
| `idx_lt_escalations_task` | `(task_id)` | Join escalations to their parent task |
|
|
116
|
+
| `idx_lt_escalations_origin` | `(origin_id, created_at DESC)` | Find escalations sharing an origin |
|
|
117
|
+
| `idx_lt_escalations_workflow` | `(workflow_id)` | Look up escalation by workflow ID |
|
|
118
|
+
| `idx_lt_escalations_type` | `(type)` | Filter by escalation type |
|
|
119
|
+
| `idx_lt_escalations_pending_sort` | `(status, priority, created_at DESC)` | Sort pending escalations by priority |
|
|
120
|
+
| `idx_lt_escalations_origin_id` | `(origin_id)` | Look up escalations by origin ID |
|
|
121
|
+
| `idx_lt_escalations_trace` | `(trace_id)` | Look up escalations by trace ID |
|
|
122
|
+
| `idx_lt_escalations_created_desc` | `(created_at DESC)` | Sort by creation time descending |
|
|
123
|
+
| `idx_lt_escalations_updated_desc` | `(updated_at DESC)` | Sort by update time descending |
|
|
124
|
+
| `idx_lt_escalations_priority_desc` | `(priority DESC)` | Sort by priority descending |
|
|
125
|
+
|
|
126
|
+
### lt_users
|
|
127
|
+
|
|
128
|
+
User and bot identity records. Users are created via the API and assigned roles that determine which escalations they can claim. Bot accounts (`account_type = 'bot'`) are service identities that authenticate with API keys.
|
|
129
|
+
|
|
130
|
+
| Column | Type | Default | Description |
|
|
131
|
+
|--------|------|---------|-------------|
|
|
132
|
+
| `id` | `UUID` | `gen_random_uuid()` | Primary key |
|
|
133
|
+
| `external_id` | `TEXT UNIQUE NOT NULL` | — | Your application's user identifier |
|
|
134
|
+
| `email` | `TEXT` | — | Email address (optional) |
|
|
135
|
+
| `display_name` | `TEXT` | — | Display name (optional) |
|
|
136
|
+
| `password_hash` | `TEXT` | — | Hashed password for authentication |
|
|
137
|
+
| `account_type` | `TEXT NOT NULL` | `'user'` | `user` or `bot` |
|
|
138
|
+
| `status` | `TEXT NOT NULL` | `'active'` | `active`, `inactive`, or `suspended` |
|
|
139
|
+
| `metadata` | `JSONB` | — | Arbitrary user metadata |
|
|
140
|
+
| `created_at` | `TIMESTAMPTZ NOT NULL` | `NOW()` | Row creation time |
|
|
141
|
+
| `updated_at` | `TIMESTAMPTZ NOT NULL` | `NOW()` | Last modification |
|
|
142
|
+
|
|
143
|
+
Status is enforced by a CHECK constraint: `status IN ('active', 'inactive', 'suspended')`. Account type is enforced by: `account_type IN ('user', 'bot')`.
|
|
144
|
+
|
|
145
|
+
**Indexes:**
|
|
146
|
+
|
|
147
|
+
| Index | Columns | Purpose |
|
|
148
|
+
|-------|---------|---------|
|
|
149
|
+
| `idx_lt_users_status` | `(status)` | Filter users by status |
|
|
150
|
+
|
|
151
|
+
### lt_user_roles
|
|
152
|
+
|
|
153
|
+
Maps users to roles. Each user can hold multiple roles with different permission types.
|
|
154
|
+
|
|
155
|
+
| Column | Type | Default | Description |
|
|
156
|
+
|--------|------|---------|-------------|
|
|
157
|
+
| `user_id` | `UUID NOT NULL` | — | FK to `lt_users(id)`, CASCADE on delete |
|
|
158
|
+
| `role` | `TEXT NOT NULL` | — | Role name (e.g., `reviewer`, `senior-reviewer`) |
|
|
159
|
+
| `type` | `TEXT NOT NULL` | `'member'` | `superadmin`, `admin`, or `member` |
|
|
160
|
+
| `created_at` | `TIMESTAMPTZ NOT NULL` | `NOW()` | When the role was assigned |
|
|
161
|
+
|
|
162
|
+
Primary key: `(user_id, role)` — a user can hold each role at most once.
|
|
163
|
+
|
|
164
|
+
Type is enforced by a CHECK constraint: `type IN ('superadmin', 'admin', 'member')`.
|
|
165
|
+
|
|
166
|
+
### lt_bot_api_keys
|
|
167
|
+
|
|
168
|
+
API keys for bot accounts. Each key is bcrypt-hashed — the raw key is returned once at creation and never stored.
|
|
169
|
+
|
|
170
|
+
| Column | Type | Default | Description |
|
|
171
|
+
|--------|------|---------|-------------|
|
|
172
|
+
| `id` | `UUID` | `gen_random_uuid()` | Primary key |
|
|
173
|
+
| `name` | `TEXT NOT NULL` | — | Human-readable key name |
|
|
174
|
+
| `user_id` | `UUID NOT NULL` | — | FK to `lt_users(id)`, CASCADE on delete |
|
|
175
|
+
| `key_hash` | `TEXT NOT NULL` | — | bcrypt hash of the raw API key |
|
|
176
|
+
| `scopes` | `TEXT[] NOT NULL` | `'{}'` | Allowed scopes (e.g., `mcp:tool:call`) |
|
|
177
|
+
| `expires_at` | `TIMESTAMPTZ` | — | Optional expiry (null = no expiry) |
|
|
178
|
+
| `last_used_at` | `TIMESTAMPTZ` | — | Updated on each successful validation |
|
|
179
|
+
| `created_at` | `TIMESTAMPTZ NOT NULL` | `NOW()` | Row creation time |
|
|
180
|
+
| `updated_at` | `TIMESTAMPTZ NOT NULL` | `NOW()` | Last modification |
|
|
181
|
+
|
|
182
|
+
Unique constraint: `(user_id, name)` — each bot can have at most one key per name.
|
|
183
|
+
|
|
184
|
+
### lt_config_workflows
|
|
185
|
+
|
|
186
|
+
Workflow registration. Every workflow that uses the LT interceptor must have a row here (or be registered at runtime via the API).
|
|
187
|
+
|
|
188
|
+
| Column | Type | Default | Description |
|
|
189
|
+
|--------|------|---------|-------------|
|
|
190
|
+
| `id` | `UUID` | `gen_random_uuid()` | Primary key |
|
|
191
|
+
| `workflow_type` | `TEXT UNIQUE NOT NULL` | — | Workflow function name |
|
|
192
|
+
| `invocable` | `BOOLEAN NOT NULL` | `false` | Allow invocation via `POST /api/workflows/:type/invoke` |
|
|
193
|
+
| `task_queue` | `TEXT` | — | Default task queue name |
|
|
194
|
+
| `default_role` | `TEXT NOT NULL` | `'reviewer'` | Role assigned to escalations when the workflow doesn't specify one |
|
|
195
|
+
| `default_modality` | `TEXT NOT NULL` | `'portal'` | Default modality |
|
|
196
|
+
| `description` | `TEXT` | — | Human-readable description |
|
|
197
|
+
| `consumes` | `TEXT[] NOT NULL` | `'{}'` | Array of workflow types whose completed data this workflow receives via `envelope.lt.providers` |
|
|
198
|
+
| `tool_tags` | `TEXT[]` | `'{}'` | Tags for MCP tool discovery |
|
|
199
|
+
| `envelope_schema` | `JSONB` | — | JSON Schema for the workflow input envelope |
|
|
200
|
+
| `resolver_schema` | `JSONB` | — | JSON Schema for the escalation resolver payload |
|
|
201
|
+
| `cron_schedule` | `TEXT` | — | Cron expression for scheduled execution |
|
|
202
|
+
| `created_at` | `TIMESTAMPTZ NOT NULL` | `NOW()` | Row creation time |
|
|
203
|
+
| `updated_at` | `TIMESTAMPTZ NOT NULL` | `NOW()` | Last modification |
|
|
204
|
+
|
|
205
|
+
**Indexes:**
|
|
206
|
+
|
|
207
|
+
| Index | Columns | Purpose |
|
|
208
|
+
|-------|---------|---------|
|
|
209
|
+
| `idx_config_workflows_tool_tags` | `(tool_tags)` GIN | Tag-based workflow discovery |
|
|
210
|
+
|
|
211
|
+
### lt_config_roles
|
|
212
|
+
|
|
213
|
+
Allowed roles per workflow type. A workflow can have multiple roles; any user holding one of these roles can claim its escalations.
|
|
214
|
+
|
|
215
|
+
| Column | Type | Default | Description |
|
|
216
|
+
|--------|------|---------|-------------|
|
|
217
|
+
| `id` | `UUID` | `gen_random_uuid()` | Primary key |
|
|
218
|
+
| `workflow_type` | `TEXT NOT NULL` | — | FK to `lt_config_workflows(workflow_type)`, CASCADE on delete |
|
|
219
|
+
| `role` | `TEXT NOT NULL` | — | Role name |
|
|
220
|
+
| `created_at` | `TIMESTAMPTZ NOT NULL` | `NOW()` | Row creation time |
|
|
221
|
+
|
|
222
|
+
Unique constraint: `(workflow_type, role)`.
|
|
223
|
+
|
|
224
|
+
### lt_config_invocation_roles
|
|
225
|
+
|
|
226
|
+
Roles allowed to invoke a workflow via the API. When a workflow has `invocable: true` and this table has entries for it, only users holding one of these roles (or superadmins) can invoke.
|
|
227
|
+
|
|
228
|
+
| Column | Type | Default | Description |
|
|
229
|
+
|--------|------|---------|-------------|
|
|
230
|
+
| `id` | `UUID` | `gen_random_uuid()` | Primary key |
|
|
231
|
+
| `workflow_type` | `TEXT NOT NULL` | — | FK to `lt_config_workflows(workflow_type)`, CASCADE on delete |
|
|
232
|
+
| `role` | `TEXT NOT NULL` | — | Role name |
|
|
233
|
+
| `created_at` | `TIMESTAMPTZ NOT NULL` | `NOW()` | When the role was assigned |
|
|
234
|
+
|
|
235
|
+
Unique constraint: `(workflow_type, role)`.
|
|
236
|
+
|
|
237
|
+
### lt_mcp_servers
|
|
238
|
+
|
|
239
|
+
MCP server registration. Stores connection details, cached tool manifests, and compilation hints.
|
|
240
|
+
|
|
241
|
+
| Column | Type | Default | Description |
|
|
242
|
+
|--------|------|---------|-------------|
|
|
243
|
+
| `id` | `UUID` | `gen_random_uuid()` | Primary key |
|
|
244
|
+
| `name` | `TEXT UNIQUE NOT NULL` | — | Server name |
|
|
245
|
+
| `description` | `TEXT` | — | Human-readable description |
|
|
246
|
+
| `transport_type` | `TEXT NOT NULL` | — | `stdio` or `sse` |
|
|
247
|
+
| `transport_config` | `JSONB` | `'{}'` | Connection configuration |
|
|
248
|
+
| `auto_connect` | `BOOLEAN` | `false` | Connect automatically on startup |
|
|
249
|
+
| `tool_manifest` | `JSONB` | — | Cached tool manifest from the server |
|
|
250
|
+
| `status` | `TEXT` | `'registered'` | `registered`, `connected`, `error`, or `disconnected` |
|
|
251
|
+
| `last_connected_at` | `TIMESTAMPTZ` | — | Last successful connection time |
|
|
252
|
+
| `metadata` | `JSONB` | — | Arbitrary metadata |
|
|
253
|
+
| `tags` | `TEXT[]` | `'{}'` | Tags for server discovery |
|
|
254
|
+
| `compile_hints` | `TEXT` | — | Hints for the workflow compiler |
|
|
255
|
+
| `created_at` | `TIMESTAMPTZ NOT NULL` | `NOW()` | Row creation time |
|
|
256
|
+
| `updated_at` | `TIMESTAMPTZ NOT NULL` | `NOW()` | Last modification |
|
|
257
|
+
|
|
258
|
+
**Indexes:**
|
|
259
|
+
|
|
260
|
+
| Index | Columns | Purpose |
|
|
261
|
+
|-------|---------|---------|
|
|
262
|
+
| `idx_lt_mcp_servers_name` | `(name)` | Look up server by name |
|
|
263
|
+
| `idx_lt_mcp_servers_status` | `(status)` | Filter by connection status |
|
|
264
|
+
| `idx_lt_mcp_servers_auto_connect` | `(auto_connect) WHERE auto_connect = true` | Find servers that auto-connect |
|
|
265
|
+
| `idx_lt_mcp_servers_tags` | `(tags)` GIN | Tag-based server discovery |
|
|
266
|
+
|
|
267
|
+
### lt_config_role_escalations
|
|
268
|
+
|
|
269
|
+
Escalation routing between roles. Defines which roles can escalate to which other roles.
|
|
270
|
+
|
|
271
|
+
| Column | Type | Default | Description |
|
|
272
|
+
|--------|------|---------|-------------|
|
|
273
|
+
| `source_role` | `TEXT NOT NULL` | — | FK to `lt_roles(role)` — the originating role |
|
|
274
|
+
| `target_role` | `TEXT NOT NULL` | — | FK to `lt_roles(role)` — the destination role |
|
|
275
|
+
| `created_at` | `TIMESTAMPTZ NOT NULL` | `NOW()` | Row creation time |
|
|
276
|
+
|
|
277
|
+
Primary key: `(source_role, target_role)`.
|
|
278
|
+
|
|
279
|
+
**Indexes:**
|
|
280
|
+
|
|
281
|
+
| Index | Columns | Purpose |
|
|
282
|
+
|-------|---------|---------|
|
|
283
|
+
| `idx_config_role_escalations_source` | `(source_role)` | Find escalation targets for a role |
|
|
284
|
+
|
|
285
|
+
### lt_yaml_workflows
|
|
286
|
+
|
|
287
|
+
Compiled deterministic workflows. Stores DAG definitions, activity manifests, and deployment state.
|
|
288
|
+
|
|
289
|
+
| Column | Type | Default | Description |
|
|
290
|
+
|--------|------|---------|-------------|
|
|
291
|
+
| `id` | `UUID` | `gen_random_uuid()` | Primary key |
|
|
292
|
+
| `name` | `TEXT UNIQUE NOT NULL` | — | Workflow name |
|
|
293
|
+
| `description` | `TEXT` | — | Human-readable description |
|
|
294
|
+
| `app_id` | `TEXT NOT NULL` | — | HotMesh application ID |
|
|
295
|
+
| `app_version` | `TEXT` | `'1'` | Application version |
|
|
296
|
+
| `source_workflow_id` | `TEXT` | — | ID of the workflow this was compiled from |
|
|
297
|
+
| `source_workflow_type` | `TEXT` | — | Type of the workflow this was compiled from |
|
|
298
|
+
| `yaml_content` | `TEXT NOT NULL` | — | YAML DAG definition |
|
|
299
|
+
| `graph_topic` | `TEXT NOT NULL` | — | HotMesh graph subscription topic |
|
|
300
|
+
| `input_schema` | `JSONB` | `'{}'` | JSON Schema for workflow input |
|
|
301
|
+
| `output_schema` | `JSONB` | `'{}'` | JSON Schema for workflow output |
|
|
302
|
+
| `activity_manifest` | `JSONB` | `'[]'` | Array of activity definitions used by this workflow |
|
|
303
|
+
| `status` | `TEXT` | `'draft'` | `draft`, `deployed`, `active`, or `archived` |
|
|
304
|
+
| `deployed_at` | `TIMESTAMPTZ` | — | When the workflow was deployed |
|
|
305
|
+
| `activated_at` | `TIMESTAMPTZ` | — | When the workflow was activated |
|
|
306
|
+
| `content_version` | `INTEGER` | `1` | Current content version number |
|
|
307
|
+
| `deployed_content_version` | `INTEGER` | — | Content version that is currently deployed |
|
|
308
|
+
| `tags` | `TEXT[]` | `'{}'` | Tags for workflow discovery |
|
|
309
|
+
| `input_field_meta` | `JSONB` | `'[]'` | Metadata about input fields |
|
|
310
|
+
| `metadata` | `JSONB` | — | Arbitrary metadata |
|
|
311
|
+
| `created_at` | `TIMESTAMPTZ NOT NULL` | `NOW()` | Row creation time |
|
|
312
|
+
| `updated_at` | `TIMESTAMPTZ NOT NULL` | `NOW()` | Last modification |
|
|
313
|
+
|
|
314
|
+
**Indexes:**
|
|
315
|
+
|
|
316
|
+
| Index | Columns | Purpose |
|
|
317
|
+
|-------|---------|---------|
|
|
318
|
+
| `idx_lt_yaml_workflows_status` | `(status)` | Filter by deployment status |
|
|
319
|
+
| `idx_lt_yaml_workflows_app_id` | `(app_id)` | Look up workflows by application |
|
|
320
|
+
| `idx_lt_yaml_workflows_tags` | `(tags)` GIN | Tag-based workflow discovery |
|
|
321
|
+
|
|
322
|
+
### lt_yaml_workflow_versions
|
|
323
|
+
|
|
324
|
+
Version history for compiled workflows. Created on each edit.
|
|
325
|
+
|
|
326
|
+
| Column | Type | Default | Description |
|
|
327
|
+
|--------|------|---------|-------------|
|
|
328
|
+
| `id` | `UUID` | `gen_random_uuid()` | Primary key |
|
|
329
|
+
| `workflow_id` | `UUID NOT NULL` | — | FK to `lt_yaml_workflows(id)`, CASCADE on delete |
|
|
330
|
+
| `version` | `INTEGER NOT NULL` | — | Version number |
|
|
331
|
+
| `yaml_content` | `TEXT NOT NULL` | — | YAML DAG definition for this version |
|
|
332
|
+
| `activity_manifest` | `JSONB` | `'[]'` | Activity definitions for this version |
|
|
333
|
+
| `input_schema` | `JSONB` | `'{}'` | Input schema for this version |
|
|
334
|
+
| `output_schema` | `JSONB` | `'{}'` | Output schema for this version |
|
|
335
|
+
| `input_field_meta` | `JSONB` | `'[]'` | Input field metadata for this version |
|
|
336
|
+
| `change_summary` | `TEXT` | — | Description of what changed |
|
|
337
|
+
| `created_at` | `TIMESTAMPTZ NOT NULL` | `NOW()` | Row creation time |
|
|
338
|
+
|
|
339
|
+
Unique constraint: `(workflow_id, version)`.
|
|
340
|
+
|
|
341
|
+
**Indexes:**
|
|
342
|
+
|
|
343
|
+
| Index | Columns | Purpose |
|
|
344
|
+
|-------|---------|---------|
|
|
345
|
+
| `idx_lt_yaml_workflow_versions_wf` | `(workflow_id, version DESC)` | Look up latest version for a workflow |
|
|
346
|
+
|
|
347
|
+
### lt_oauth_tokens
|
|
348
|
+
|
|
349
|
+
Encrypted per-user, per-provider OAuth tokens. Supports multiple credentials per provider via the `label` column.
|
|
350
|
+
|
|
351
|
+
| Column | Type | Default | Description |
|
|
352
|
+
|--------|------|---------|-------------|
|
|
353
|
+
| `id` | `UUID` | `gen_random_uuid()` | Primary key |
|
|
354
|
+
| `user_id` | `UUID NOT NULL` | — | FK to `lt_users(id)`, CASCADE on delete |
|
|
355
|
+
| `provider` | `TEXT NOT NULL` | — | OAuth provider name (e.g., `google`, `github`) |
|
|
356
|
+
| `label` | `TEXT NOT NULL` | `'default'` | Label for multiple credentials per provider per user |
|
|
357
|
+
| `access_token_enc` | `TEXT NOT NULL` | — | AES-encrypted access token |
|
|
358
|
+
| `refresh_token_enc` | `TEXT` | — | AES-encrypted refresh token |
|
|
359
|
+
| `token_type` | `TEXT NOT NULL` | `'bearer'` | Token type |
|
|
360
|
+
| `scopes` | `TEXT[] NOT NULL` | `'{}'` | Granted scopes |
|
|
361
|
+
| `expires_at` | `TIMESTAMPTZ` | — | Token expiry |
|
|
362
|
+
| `provider_user_id` | `TEXT NOT NULL` | — | User ID at the provider |
|
|
363
|
+
| `provider_email` | `TEXT` | — | Email at the provider |
|
|
364
|
+
| `metadata` | `JSONB` | — | Arbitrary metadata |
|
|
365
|
+
| `created_at` | `TIMESTAMPTZ NOT NULL` | `NOW()` | Row creation time |
|
|
366
|
+
| `updated_at` | `TIMESTAMPTZ NOT NULL` | `NOW()` | Last modification |
|
|
367
|
+
|
|
368
|
+
Unique constraint: `(user_id, provider, label)`.
|
|
369
|
+
|
|
370
|
+
### lt_service_tokens
|
|
371
|
+
|
|
372
|
+
Service tokens for external MCP servers. Each token is hashed — the raw token is returned once at creation.
|
|
373
|
+
|
|
374
|
+
| Column | Type | Default | Description |
|
|
375
|
+
|--------|------|---------|-------------|
|
|
376
|
+
| `id` | `UUID` | `gen_random_uuid()` | Primary key |
|
|
377
|
+
| `name` | `TEXT UNIQUE NOT NULL` | — | Human-readable token name |
|
|
378
|
+
| `token_hash` | `TEXT NOT NULL` | — | Hashed token value |
|
|
379
|
+
| `server_id` | `UUID` | — | FK to `lt_mcp_servers(id)`, CASCADE on delete |
|
|
380
|
+
| `scopes` | `TEXT[] NOT NULL` | `'{}'` | Allowed scopes |
|
|
381
|
+
| `expires_at` | `TIMESTAMPTZ` | — | Optional expiry |
|
|
382
|
+
| `last_used_at` | `TIMESTAMPTZ` | — | Updated on each use |
|
|
383
|
+
| `created_at` | `TIMESTAMPTZ NOT NULL` | `NOW()` | Row creation time |
|
|
384
|
+
| `updated_at` | `TIMESTAMPTZ NOT NULL` | `NOW()` | Last modification |
|
|
385
|
+
|
|
386
|
+
### lt_ephemeral_credentials
|
|
387
|
+
|
|
388
|
+
Short-lived credential store for sensitive fields in waitFor signal payloads. Supports use-count limits and TTL-based expiry.
|
|
389
|
+
|
|
390
|
+
| Column | Type | Default | Description |
|
|
391
|
+
|--------|------|---------|-------------|
|
|
392
|
+
| `token` | `UUID` | `gen_random_uuid()` | Primary key |
|
|
393
|
+
| `value` | `BYTEA NOT NULL` | — | Encrypted credential value |
|
|
394
|
+
| `label` | `TEXT` | — | Human-readable label |
|
|
395
|
+
| `max_uses` | `INTEGER NOT NULL` | `0` | Maximum retrievals (0 = unlimited) |
|
|
396
|
+
| `use_count` | `INTEGER NOT NULL` | `0` | Current retrieval count |
|
|
397
|
+
| `expires_at` | `TIMESTAMPTZ` | — | TTL-based expiry |
|
|
398
|
+
| `created_at` | `TIMESTAMPTZ NOT NULL` | `NOW()` | Row creation time |
|
|
399
|
+
|
|
400
|
+
### lt_namespaces
|
|
401
|
+
|
|
402
|
+
Multi-tenant namespace registry.
|
|
403
|
+
|
|
404
|
+
| Column | Type | Default | Description |
|
|
405
|
+
|--------|------|---------|-------------|
|
|
406
|
+
| `id` | `UUID` | `gen_random_uuid()` | Primary key |
|
|
407
|
+
| `name` | `TEXT UNIQUE NOT NULL` | — | Namespace name |
|
|
408
|
+
| `description` | `TEXT` | — | Human-readable description |
|
|
409
|
+
| `schema_name` | `TEXT NOT NULL` | — | PostgreSQL schema name for this namespace |
|
|
410
|
+
| `is_default` | `BOOLEAN` | `false` | Whether this is the default namespace |
|
|
411
|
+
| `metadata` | `JSONB` | — | Arbitrary metadata |
|
|
412
|
+
| `created_at` | `TIMESTAMPTZ NOT NULL` | `NOW()` | Row creation time |
|
|
413
|
+
| `updated_at` | `TIMESTAMPTZ NOT NULL` | `NOW()` | Last modification |
|
|
414
|
+
|
|
415
|
+
**Seeds:** `longtail` namespace with `is_default = true`.
|
|
416
|
+
|
|
417
|
+
## Entity-Relationship Diagram
|
|
418
|
+
|
|
419
|
+
```
|
|
420
|
+
lt_roles
|
|
421
|
+
├──< lt_config_role_escalations (source_role → role)
|
|
422
|
+
└──< lt_config_role_escalations (target_role → role)
|
|
423
|
+
|
|
424
|
+
lt_config_workflows
|
|
425
|
+
├──< lt_config_roles (workflow_type → workflow_type, CASCADE)
|
|
426
|
+
└──< lt_config_invocation_roles (workflow_type → workflow_type, CASCADE)
|
|
427
|
+
|
|
428
|
+
lt_users
|
|
429
|
+
├──< lt_user_roles (user_id → id, CASCADE)
|
|
430
|
+
├──< lt_bot_api_keys (user_id → id, CASCADE)
|
|
431
|
+
├──< lt_oauth_tokens (user_id → id, CASCADE)
|
|
432
|
+
└──< lt_tasks.initiated_by (initiated_by → id, SET NULL)
|
|
433
|
+
|
|
434
|
+
lt_tasks
|
|
435
|
+
└──< lt_escalations (task_id → id)
|
|
436
|
+
|
|
437
|
+
lt_yaml_workflows
|
|
438
|
+
└──< lt_yaml_workflow_versions (workflow_id → id, CASCADE)
|
|
439
|
+
|
|
440
|
+
lt_mcp_servers (standalone — MCP server registry)
|
|
441
|
+
lt_namespaces (standalone — namespace registry)
|
|
442
|
+
lt_migrations (standalone — tracks applied schema files)
|
|
443
|
+
lt_oauth_tokens (user_id → lt_users.id, CASCADE)
|
|
444
|
+
lt_service_tokens (standalone — service token registry)
|
|
445
|
+
lt_ephemeral_credentials (standalone — short-lived credential store)
|
|
446
|
+
```
|
|
447
|
+
|
|
448
|
+
Arrows point from child to parent. `CASCADE` means deleting the parent deletes the children.
|
|
449
|
+
|
|
450
|
+
## Trigger
|
|
451
|
+
|
|
452
|
+
All tables with `updated_at` use a shared trigger function:
|
|
453
|
+
|
|
454
|
+
```sql
|
|
455
|
+
CREATE OR REPLACE FUNCTION lt_set_updated_at()
|
|
456
|
+
RETURNS TRIGGER AS $$
|
|
457
|
+
BEGIN
|
|
458
|
+
NEW.updated_at = NOW();
|
|
459
|
+
RETURN NEW;
|
|
460
|
+
END;
|
|
461
|
+
$$ LANGUAGE plpgsql;
|
|
462
|
+
```
|
|
463
|
+
|
|
464
|
+
This fires `BEFORE UPDATE` on `lt_tasks`, `lt_escalations`, `lt_users`, `lt_config_workflows`, `lt_mcp_servers`, `lt_yaml_workflows`, and `lt_namespaces`.
|
|
465
|
+
|
|
466
|
+
## Migrations
|
|
467
|
+
|
|
468
|
+
The migration runner (`services/db/migrate.ts`) reads `.sql` files from `services/db/schemas/`, sorted alphabetically. Each file runs at most once, tracked in `lt_migrations`:
|
|
469
|
+
|
|
470
|
+
```sql
|
|
471
|
+
CREATE TABLE IF NOT EXISTS lt_migrations (
|
|
472
|
+
id SERIAL PRIMARY KEY,
|
|
473
|
+
name TEXT NOT NULL UNIQUE,
|
|
474
|
+
applied_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
|
475
|
+
);
|
|
476
|
+
```
|
|
477
|
+
|
|
478
|
+
Migrations are safe to run from multiple containers simultaneously — the `UNIQUE` constraint on `name` prevents double-application. Both API and worker containers can call `migrate()` at startup.
|