@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.
- package/README.md +35 -5
- 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 +11 -10
- package/build/index.js +13 -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 +4 -7
- package/{services → build/lib}/db/schemas/001_schema.sql +3 -0
- package/{services → build/lib}/db/schemas/011_system_workflow_configs.sql +7 -0
- package/build/lib/db/schemas/015_knowledge.sql +23 -0
- package/build/lib/db/schemas/016_streamable_http.sql +7 -0
- 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 +105 -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 +65 -1
- package/build/routes/mcp.js +26 -3
- 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/cron.d.ts +2 -0
- package/build/routes/yaml-workflows/cron.js +117 -0
- package/build/routes/yaml-workflows/crud.js +39 -1
- package/build/routes/yaml-workflows/deployment.js +9 -9
- package/build/routes/yaml-workflows/index.js +4 -1
- 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.d.ts +17 -0
- package/build/services/cron/index.js +98 -6
- 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 +12 -0
- package/build/services/insight/index.js +34 -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 +10 -1
- package/build/services/mcp/client/connection.js +51 -3
- 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/schemas.d.ts +2 -2
- package/build/services/mcp/db-server/tools.js +17 -4
- package/build/services/mcp/db.d.ts +1 -1
- package/build/services/mcp/db.js +11 -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/server.js +1 -1
- package/build/services/mcp/sql.d.ts +7 -1
- package/build/services/mcp/sql.js +36 -3
- package/build/services/mcp/types.d.ts +3 -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.d.ts +3 -0
- package/build/services/yaml-workflow/db.js +25 -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/invoke.d.ts +19 -0
- package/build/services/yaml-workflow/invoke.js +80 -0
- package/build/services/yaml-workflow/pipeline/analyze.js +1 -1
- package/build/services/yaml-workflow/pipeline/build/dag.js +11 -6
- package/build/services/yaml-workflow/pipeline/build/wiring.d.ts +1 -1
- package/build/services/yaml-workflow/pipeline/build/wiring.js +89 -2
- 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/prompts.d.ts +1 -1
- package/build/services/yaml-workflow/pipeline/prompts.js +44 -1
- package/build/services/yaml-workflow/pipeline/validate.js +2 -2
- package/build/services/yaml-workflow/sql.d.ts +3 -0
- package/build/services/yaml-workflow/sql.js +16 -1
- package/build/services/yaml-workflow/types.d.ts +13 -1
- package/build/services/yaml-workflow/workers/callbacks.js +10 -2
- package/build/services/yaml-workflow/workers/events.js +2 -2
- package/build/services/yaml-workflow/workers/register.js +37 -9
- 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 +11 -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/schemas.d.ts +2 -2
- 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 +21 -10
- 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 +10 -10
- 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 +9 -3
- 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 +258 -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 +1961 -322
- package/build/system/seed/server-definitions.js +68 -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/seed/tool-manifests-workflows.d.ts +7 -0
- package/build/system/seed/tool-manifests-workflows.js +10 -3
- 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/mcp-workflow-builder/activities/caches.d.ts +5 -0
- package/build/system/workflows/mcp-workflow-builder/activities/caches.js +8 -0
- package/build/system/workflows/mcp-workflow-builder/activities/index.d.ts +2 -0
- package/build/system/workflows/mcp-workflow-builder/activities/index.js +7 -0
- package/build/system/workflows/mcp-workflow-builder/activities/llm.d.ts +2 -0
- package/build/system/workflows/mcp-workflow-builder/activities/llm.js +25 -0
- package/build/system/workflows/mcp-workflow-builder/activities/tool-loader.d.ts +5 -0
- package/build/system/workflows/mcp-workflow-builder/activities/tool-loader.js +8 -0
- package/build/system/workflows/mcp-workflow-builder/index.d.ts +16 -0
- package/build/system/workflows/mcp-workflow-builder/index.js +229 -0
- package/build/system/workflows/mcp-workflow-builder/prompts.d.ts +8 -0
- package/build/system/workflows/mcp-workflow-builder/prompts.js +247 -0
- 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 +97 -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/mcp.d.ts +4 -3
- package/build/types/user.d.ts +2 -0
- package/build/types/yaml-workflow.d.ts +6 -2
- 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-BXkKGkb5.js +2 -0
- package/dashboard/dist/assets/AdminDashboard-BXkKGkb5.js.map +1 -0
- package/dashboard/dist/assets/AvailableEscalationsPage-DcH592mc.js +2 -0
- package/dashboard/dist/assets/AvailableEscalationsPage-DcH592mc.js.map +1 -0
- package/dashboard/dist/assets/BotPicker-A6LtzyuO.js +2 -0
- package/dashboard/dist/assets/{BotPicker-D6FYW1Gt.js.map → BotPicker-A6LtzyuO.js.map} +1 -1
- package/dashboard/dist/assets/CollapsibleSection-C7nL2_mv.js +2 -0
- package/dashboard/dist/assets/{CollapsibleSection-Cxk4wvjT.js.map → CollapsibleSection-C7nL2_mv.js.map} +1 -1
- package/dashboard/dist/assets/ConfirmDeleteModal-CWFwJrSl.js +2 -0
- package/dashboard/dist/assets/{ConfirmDeleteModal-FSXyKjaB.js.map → ConfirmDeleteModal-CWFwJrSl.js.map} +1 -1
- package/dashboard/dist/assets/CopyableId-DbZ5c3jh.js +2 -0
- package/dashboard/dist/assets/{CopyableId-CBdxWfp8.js.map → CopyableId-DbZ5c3jh.js.map} +1 -1
- package/dashboard/dist/assets/CredentialsPage-ClWkmLPu.js +2 -0
- package/dashboard/dist/assets/CredentialsPage-ClWkmLPu.js.map +1 -0
- package/dashboard/dist/assets/CustomDurationPicker-CtH2hReF.js +2 -0
- package/dashboard/dist/assets/{CustomDurationPicker-CAninCbl.js.map → CustomDurationPicker-CtH2hReF.js.map} +1 -1
- package/dashboard/dist/assets/DataTable-CM5ZcpPi.js +2 -0
- package/dashboard/dist/assets/DataTable-CM5ZcpPi.js.map +1 -0
- package/dashboard/dist/assets/ElapsedCell-CwqavyeC.js +2 -0
- package/dashboard/dist/assets/ElapsedCell-CwqavyeC.js.map +1 -0
- package/dashboard/dist/assets/EmptyState-BBn78pmm.js +2 -0
- package/dashboard/dist/assets/{EmptyState-2CmV-IaS.js.map → EmptyState-BBn78pmm.js.map} +1 -1
- package/dashboard/dist/assets/EscalationsOverview-BcJ2E3X7.js +2 -0
- package/dashboard/dist/assets/{EscalationsOverview-GXYFPASS.js.map → EscalationsOverview-BcJ2E3X7.js.map} +1 -1
- package/dashboard/dist/assets/EventTable-C1en_KZ0.js +2 -0
- package/dashboard/dist/assets/{EventTable-B01oJf6Y.js.map → EventTable-C1en_KZ0.js.map} +1 -1
- package/dashboard/dist/assets/FilterBar-CZTlrLQT.js +2 -0
- package/dashboard/dist/assets/{FilterBar-Ck4K4rzu.js.map → FilterBar-CZTlrLQT.js.map} +1 -1
- package/dashboard/dist/assets/ListToolbar-Cdbsapig.js +2 -0
- package/dashboard/dist/assets/ListToolbar-Cdbsapig.js.map +1 -0
- package/dashboard/dist/assets/McpOverview-CSpEJxKa.js +2 -0
- package/dashboard/dist/assets/{McpOverview-JkvRcX2e.js.map → McpOverview-CSpEJxKa.js.map} +1 -1
- package/dashboard/dist/assets/McpQueryDetailPage-DhqEI180.js +5 -0
- package/dashboard/dist/assets/McpQueryDetailPage-DhqEI180.js.map +1 -0
- package/dashboard/dist/assets/McpQueryPage-CIiVMlqo.js +2 -0
- package/dashboard/dist/assets/McpQueryPage-CIiVMlqo.js.map +1 -0
- package/dashboard/dist/assets/McpRunDetailPage-9xdxgG4d.js +2 -0
- package/dashboard/dist/assets/McpRunDetailPage-9xdxgG4d.js.map +1 -0
- package/dashboard/dist/assets/McpRunsPage-wWLqHsd4.js +2 -0
- package/dashboard/dist/assets/McpRunsPage-wWLqHsd4.js.map +1 -0
- package/dashboard/dist/assets/Modal-kB_P7ZOr.js +2 -0
- package/dashboard/dist/assets/{Modal-B4rbIVAn.js.map → Modal-kB_P7ZOr.js.map} +1 -1
- package/dashboard/dist/assets/OperatorDashboard-jc0vrgDI.js +2 -0
- package/dashboard/dist/assets/OperatorDashboard-jc0vrgDI.js.map +1 -0
- package/dashboard/dist/assets/PageHeader-NkOeBR05.js +2 -0
- package/dashboard/dist/assets/PageHeader-NkOeBR05.js.map +1 -0
- package/dashboard/dist/assets/PageHeaderWithStats-ywNhrmFK.js +2 -0
- package/dashboard/dist/assets/PageHeaderWithStats-ywNhrmFK.js.map +1 -0
- package/dashboard/dist/assets/PriorityBadge-B2MQbSxy.js +2 -0
- package/dashboard/dist/assets/{PriorityBadge-DfQY9St9.js.map → PriorityBadge-B2MQbSxy.js.map} +1 -1
- package/dashboard/dist/assets/ProcessDetailPage-B7z7IdqE.js +2 -0
- package/dashboard/dist/assets/ProcessDetailPage-B7z7IdqE.js.map +1 -0
- package/dashboard/dist/assets/ProcessesListPage-C-uHadO6.js +2 -0
- package/dashboard/dist/assets/ProcessesListPage-C-uHadO6.js.map +1 -0
- package/dashboard/dist/assets/RolePill-C1dgC-fK.js +2 -0
- package/dashboard/dist/assets/{RolePill-BTPa8L-P.js.map → RolePill-C1dgC-fK.js.map} +1 -1
- package/dashboard/dist/assets/RolesPage-BSxrD1vm.js +2 -0
- package/dashboard/dist/assets/RolesPage-BSxrD1vm.js.map +1 -0
- package/dashboard/dist/assets/RowActions-lYaHGI-v.js +2 -0
- package/dashboard/dist/assets/{RowActions-Dg-Fsm5O.js.map → RowActions-lYaHGI-v.js.map} +1 -1
- package/dashboard/dist/assets/RunAsSelector-CJDnyp93.js +2 -0
- package/dashboard/dist/assets/RunAsSelector-CJDnyp93.js.map +1 -0
- package/dashboard/dist/assets/StatCard-v2TiITVr.js +2 -0
- package/dashboard/dist/assets/{StatCard-DlgF0CJC.js.map → StatCard-v2TiITVr.js.map} +1 -1
- package/dashboard/dist/assets/StatusBadge-DWlxevgG.js +2 -0
- package/dashboard/dist/assets/StatusBadge-DWlxevgG.js.map +1 -0
- package/dashboard/dist/assets/StepIndicator-CRM4ft28.js +2 -0
- package/dashboard/dist/assets/StepIndicator-CRM4ft28.js.map +1 -0
- package/dashboard/dist/assets/StickyPagination-CF0EToEU.js +2 -0
- package/dashboard/dist/assets/{StickyPagination-F9FZsRy9.js.map → StickyPagination-CF0EToEU.js.map} +1 -1
- package/dashboard/dist/assets/SwimlaneTimeline-CNlj7fgg.js +2 -0
- package/dashboard/dist/assets/SwimlaneTimeline-CNlj7fgg.js.map +1 -0
- package/dashboard/dist/assets/TagInput-CH8qMGhC.js +2 -0
- package/dashboard/dist/assets/TagInput-CH8qMGhC.js.map +1 -0
- package/dashboard/dist/assets/TaskDetailPage-CdWo-6mu.js +2 -0
- package/dashboard/dist/assets/TaskDetailPage-CdWo-6mu.js.map +1 -0
- package/dashboard/dist/assets/TaskQueuePill-BPj4ogVG.js +2 -0
- package/dashboard/dist/assets/{TaskQueuePill-awmtb0qw.js.map → TaskQueuePill-BPj4ogVG.js.map} +1 -1
- package/dashboard/dist/assets/TasksListPage-CtRkMpKU.js +2 -0
- package/dashboard/dist/assets/{TasksListPage-C_QF23c1.js.map → TasksListPage-CtRkMpKU.js.map} +1 -1
- package/dashboard/dist/assets/TimeAgo-Di1a3X5P.js +2 -0
- package/dashboard/dist/assets/TimeAgo-Di1a3X5P.js.map +1 -0
- package/dashboard/dist/assets/TimestampCell-CqrXql-S.js +2 -0
- package/dashboard/dist/assets/TimestampCell-CqrXql-S.js.map +1 -0
- package/dashboard/dist/assets/UserName-BUFYCnRa.js +2 -0
- package/dashboard/dist/assets/{UserName-DaP4YAKr.js.map → UserName-BUFYCnRa.js.map} +1 -1
- package/dashboard/dist/assets/WorkflowExecutionPage-25iusMml.js +2 -0
- package/dashboard/dist/assets/WorkflowExecutionPage-25iusMml.js.map +1 -0
- package/dashboard/dist/assets/WorkflowPill-DPKOcbf4.js +2 -0
- package/dashboard/dist/assets/WorkflowPill-DPKOcbf4.js.map +1 -0
- package/dashboard/dist/assets/WorkflowsDashboard-BgxslssH.js +2 -0
- package/dashboard/dist/assets/WorkflowsDashboard-BgxslssH.js.map +1 -0
- package/dashboard/dist/assets/WorkflowsOverview-Doe5L-Re.js +2 -0
- package/dashboard/dist/assets/{WorkflowsOverview-D9OzzQqw.js.map → WorkflowsOverview-Doe5L-Re.js.map} +1 -1
- package/dashboard/dist/assets/YamlWorkflowsPage-BliAckJ6.js +2 -0
- package/dashboard/dist/assets/YamlWorkflowsPage-BliAckJ6.js.map +1 -0
- package/dashboard/dist/assets/{bots-BkKVMbUW.js → bots-Bi2_O1Ts.js} +2 -2
- package/dashboard/dist/assets/{bots-BkKVMbUW.js.map → bots-Bi2_O1Ts.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-Ck1KlLkT.js +2 -0
- package/dashboard/dist/assets/escalation-Ck1KlLkT.js.map +1 -0
- package/dashboard/dist/assets/escalation-columns-ohDsj2eJ.js +2 -0
- package/dashboard/dist/assets/{escalation-columns-D6aqStaY.js.map → escalation-columns-ohDsj2eJ.js.map} +1 -1
- package/dashboard/dist/assets/helpers-BoD2SgUY.js +2 -0
- package/dashboard/dist/assets/helpers-BoD2SgUY.js.map +1 -0
- package/dashboard/dist/assets/index-BEtLIsML.js +2 -0
- package/dashboard/dist/assets/index-BEtLIsML.js.map +1 -0
- package/dashboard/dist/assets/index-Bn2xHDr8.js +5 -0
- package/dashboard/dist/assets/index-Bn2xHDr8.js.map +1 -0
- package/dashboard/dist/assets/index-BpT-6WgJ.js +2 -0
- package/dashboard/dist/assets/{index-DTPzZr_X.js.map → index-BpT-6WgJ.js.map} +1 -1
- package/dashboard/dist/assets/index-CZrJ09p-.js +2 -0
- package/dashboard/dist/assets/index-CZrJ09p-.js.map +1 -0
- package/dashboard/dist/assets/index-D3NyVADW.js +2 -0
- package/dashboard/dist/assets/index-D3NyVADW.js.map +1 -0
- package/dashboard/dist/assets/index-D7zYZOnH.js +2 -0
- package/dashboard/dist/assets/index-D7zYZOnH.js.map +1 -0
- package/dashboard/dist/assets/index-DOkHXmyf.js +17 -0
- package/dashboard/dist/assets/index-DOkHXmyf.js.map +1 -0
- package/dashboard/dist/assets/index-DYyLF-Qb.js +281 -0
- package/dashboard/dist/assets/index-DYyLF-Qb.js.map +1 -0
- package/dashboard/dist/assets/index-Dk2Q51o0.js +2 -0
- package/dashboard/dist/assets/index-Dk2Q51o0.js.map +1 -0
- package/dashboard/dist/assets/index-FuohTtaM.js +6 -0
- package/dashboard/dist/assets/index-FuohTtaM.js.map +1 -0
- package/dashboard/dist/assets/index-PyCTS05D.css +1 -0
- package/dashboard/dist/assets/mcp-CJtYjA7A.js +2 -0
- package/dashboard/dist/assets/mcp-CJtYjA7A.js.map +1 -0
- package/dashboard/dist/assets/mcp-query-jQJQrs_7.js +2 -0
- package/dashboard/dist/assets/mcp-query-jQJQrs_7.js.map +1 -0
- package/dashboard/dist/assets/{mcp-runs-ChPbpvXK.js → mcp-runs-DUWm9Z4V.js} +2 -2
- package/dashboard/dist/assets/{mcp-runs-ChPbpvXK.js.map → mcp-runs-DUWm9Z4V.js.map} +1 -1
- package/dashboard/dist/assets/namespaces-BM5P2qmL.js +2 -0
- package/dashboard/dist/assets/{namespaces-BgbaC3ow.js.map → namespaces-BM5P2qmL.js.map} +1 -1
- package/dashboard/dist/assets/{roles-ZNrqqnQl.js → roles-lv0shpjJ.js} +2 -2
- package/dashboard/dist/assets/{roles-ZNrqqnQl.js.map → roles-lv0shpjJ.js.map} +1 -1
- package/dashboard/dist/assets/settings-Wlq92mRo.js +2 -0
- package/dashboard/dist/assets/{settings-eBRSE0mQ.js.map → settings-Wlq92mRo.js.map} +1 -1
- package/dashboard/dist/assets/tasks-BFGm4PuE.js +2 -0
- package/dashboard/dist/assets/{tasks-tRqClPns.js.map → tasks-BFGm4PuE.js.map} +1 -1
- package/dashboard/dist/assets/useEventHooks-DIE6ue4x.js +2 -0
- package/dashboard/dist/assets/useEventHooks-DIE6ue4x.js.map +1 -0
- package/dashboard/dist/assets/useExpandedRows-Cg9iq6Vy.js +2 -0
- package/dashboard/dist/assets/useExpandedRows-Cg9iq6Vy.js.map +1 -0
- 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/{useYamlActivityEvents-BO51u8tm.js → useYamlActivityEvents-DCwSO73t.js} +2 -2
- package/dashboard/dist/assets/useYamlActivityEvents-DCwSO73t.js.map +1 -0
- package/dashboard/dist/assets/{users-tMvNyOo8.js → users-tA5-K0wA.js} +2 -2
- package/dashboard/dist/assets/{users-tMvNyOo8.js.map → users-tA5-K0wA.js.map} +1 -1
- package/dashboard/dist/assets/vendor-icons-BiIug1SK.js +402 -0
- package/dashboard/dist/assets/vendor-icons-BiIug1SK.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-CfLc15Wr.js} +2 -2
- package/dashboard/dist/assets/{workflows-Cc4VHcrp.js.map → workflows-CfLc15Wr.js.map} +1 -1
- package/dashboard/dist/assets/yaml-workflows-D7JXNqbM.js +2 -0
- package/dashboard/dist/assets/yaml-workflows-D7JXNqbM.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 +253 -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 +263 -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 +985 -0
- package/docs/oauth-and-delegation.md +469 -0
- package/docs/telemetry.md +144 -0
- package/docs/workflows.md +695 -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/CredentialsPage-Ikzsot0w.js.map +0 -1
- 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-X85K5bHC.js.map +0 -1
- 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-blCW6IL7.js.map +0 -1
- 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/useNatsEvents-Xr43X1fG.js +0 -2
- package/dashboard/dist/assets/useNatsEvents-Xr43X1fG.js.map +0 -1
- package/dashboard/dist/assets/useYamlActivityEvents-BO51u8tm.js.map +0 -1
- package/dashboard/dist/assets/vendor-icons-ZTAKVwGc.js +0 -292
- 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/services/db/README.md +0 -8
- /package/build/{services → lib}/db/migrate.d.ts +0 -0
- /package/{services → build/lib}/db/schemas/002_seed.sql +0 -0
- /package/{services → build/lib}/db/schemas/003_workflow_discovery.sql +0 -0
- /package/{services → build/lib}/db/schemas/004_query_router.sql +0 -0
- /package/{services → build/lib}/db/schemas/005_triage_router.sql +0 -0
- /package/{services → build/lib}/db/schemas/006_oauth.sql +0 -0
- /package/{services → build/lib}/db/schemas/007_security.sql +0 -0
- /package/{services → build/lib}/db/schemas/008_bot_accounts.sql +0 -0
- /package/{services → build/lib}/db/schemas/009_audit_trail.sql +0 -0
- /package/{services → build/lib}/db/schemas/010_credential_providers.sql +0 -0
- /package/{services → build/lib}/db/schemas/012_drop_modality.sql +0 -0
- /package/{services → build/lib}/db/schemas/013_execute_as.sql +0 -0
- /package/{services → build/lib}/db/schemas/014_ephemeral_credentials.sql +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/docs/auth.md
ADDED
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
# Authentication
|
|
2
|
+
|
|
3
|
+
Every API request in Long Tail passes through an authentication adapter before reaching route handlers. The adapter inspects the incoming request, verifies the caller's identity, and returns a structured `AuthPayload`. If verification fails, the adapter returns `null` and the middleware responds with `401 Unauthorized`.
|
|
4
|
+
|
|
5
|
+
This design decouples identity verification from the rest of the application. The built-in adapter handles JWTs. Teams that rely on OAuth providers, API keys, or session cookies can swap in a custom adapter without modifying any route logic.
|
|
6
|
+
|
|
7
|
+
## Interface
|
|
8
|
+
|
|
9
|
+
Two types define the contract between Long Tail and any authentication strategy:
|
|
10
|
+
|
|
11
|
+
```typescript
|
|
12
|
+
interface LTAuthAdapter {
|
|
13
|
+
authenticate(req: any): Promise<AuthPayload | null>;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
interface AuthPayload {
|
|
17
|
+
userId: string;
|
|
18
|
+
email?: string;
|
|
19
|
+
role?: string;
|
|
20
|
+
[key: string]: any;
|
|
21
|
+
}
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
`LTAuthAdapter` requires a single method. It receives the raw request object and returns either a valid `AuthPayload` or `null`. The index signature on `AuthPayload` allows adapters to attach arbitrary claims (tenant ID, permissions bitmask, etc.) without altering the interface.
|
|
25
|
+
|
|
26
|
+
## Configuration via start()
|
|
27
|
+
|
|
28
|
+
The simplest way to configure auth is through the `start()` config:
|
|
29
|
+
|
|
30
|
+
```typescript
|
|
31
|
+
import { start } from '@hotmeshio/long-tail';
|
|
32
|
+
|
|
33
|
+
// Use the built-in JWT adapter with an explicit secret
|
|
34
|
+
await start({
|
|
35
|
+
database: { connectionString: process.env.DATABASE_URL },
|
|
36
|
+
auth: { secret: process.env.JWT_SECRET },
|
|
37
|
+
workers: [ ... ],
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
// Or plug in a custom adapter
|
|
41
|
+
await start({
|
|
42
|
+
database: { connectionString: process.env.DATABASE_URL },
|
|
43
|
+
auth: { adapter: new GoogleOAuthAdapter() },
|
|
44
|
+
workers: [ ... ],
|
|
45
|
+
});
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
When `auth.secret` is provided, Long Tail uses the built-in `JwtAuthAdapter` with that secret. When `auth.adapter` is provided, the custom adapter replaces the JWT adapter entirely. If neither is set, the built-in JWT adapter reads from the `JWT_SECRET` environment variable.
|
|
49
|
+
|
|
50
|
+
## Built-in JWT Adapter
|
|
51
|
+
|
|
52
|
+
`JwtAuthAdapter` is the default adapter. It extracts a Bearer token from the `Authorization` header and verifies it against the `JWT_SECRET` environment variable.
|
|
53
|
+
|
|
54
|
+
A companion utility, `signToken`, generates tokens for use in tests or login endpoints:
|
|
55
|
+
|
|
56
|
+
```typescript
|
|
57
|
+
import { signToken } from '@hotmeshio/long-tail';
|
|
58
|
+
|
|
59
|
+
const token = signToken({ userId: '42', email: 'ops@example.com' }, '8h');
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
The first argument is the payload. The second, optional argument is the expiration duration (defaults vary by configuration). The function uses `JWT_SECRET` internally.
|
|
63
|
+
|
|
64
|
+
## Middleware
|
|
65
|
+
|
|
66
|
+
Long Tail's embedded server automatically applies auth middleware to all API routes. The following middleware functions are also exported for advanced use cases.
|
|
67
|
+
|
|
68
|
+
### createAuthMiddleware
|
|
69
|
+
|
|
70
|
+
`createAuthMiddleware` accepts any `LTAuthAdapter` and returns Express-compatible middleware. On each request, it calls the adapter's `authenticate` method and attaches the result to `req.auth`. If the adapter returns `null`, the middleware halts the request with a `401` response.
|
|
71
|
+
|
|
72
|
+
### requireAuth
|
|
73
|
+
|
|
74
|
+
`requireAuth` is the default auth middleware used by Long Tail's embedded server. It delegates to whatever adapter was configured via `start()`, or falls back to the built-in `JwtAuthAdapter`.
|
|
75
|
+
|
|
76
|
+
### requireAdmin
|
|
77
|
+
|
|
78
|
+
`requireAdmin` is a separate middleware that runs after authentication. It checks whether the authenticated user holds superadmin status, either through a database lookup (`isSuperAdmin()`) or by verifying that the JWT `role` claim equals `'admin'`. Requests that fail this check receive a `403 Forbidden` response.
|
|
79
|
+
|
|
80
|
+
## Custom Adapter Example
|
|
81
|
+
|
|
82
|
+
The following adapter authenticates requests using Google OAuth ID tokens. It verifies the token with Google's servers, extracts the user's subject identifier and email, and returns them as an `AuthPayload`.
|
|
83
|
+
|
|
84
|
+
```typescript
|
|
85
|
+
import type { LTAuthAdapter, AuthPayload } from '@hotmeshio/long-tail';
|
|
86
|
+
import { OAuth2Client } from 'google-auth-library';
|
|
87
|
+
|
|
88
|
+
const google = new OAuth2Client(process.env.GOOGLE_CLIENT_ID);
|
|
89
|
+
|
|
90
|
+
class GoogleOAuthAdapter implements LTAuthAdapter {
|
|
91
|
+
async authenticate(req): Promise<AuthPayload | null> {
|
|
92
|
+
const header = req.headers.authorization;
|
|
93
|
+
if (!header?.startsWith('Bearer ')) return null;
|
|
94
|
+
try {
|
|
95
|
+
const ticket = await google.verifyIdToken({
|
|
96
|
+
idToken: header.slice(7),
|
|
97
|
+
audience: process.env.GOOGLE_CLIENT_ID,
|
|
98
|
+
});
|
|
99
|
+
const { sub, email } = ticket.getPayload()!;
|
|
100
|
+
return { userId: sub, email, role: 'member' };
|
|
101
|
+
} catch {
|
|
102
|
+
return null;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
// Pass to start()
|
|
108
|
+
await start({
|
|
109
|
+
database: { connectionString: process.env.DATABASE_URL },
|
|
110
|
+
auth: { adapter: new GoogleOAuthAdapter() },
|
|
111
|
+
workers: [ ... ],
|
|
112
|
+
});
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
The same pattern applies to any identity provider: extract credentials from the request, verify them against the provider, and return an `AuthPayload` or `null`.
|
|
116
|
+
|
|
117
|
+
## Development Shortcut
|
|
118
|
+
|
|
119
|
+
During local development, a no-op adapter that returns a hardcoded payload removes the need for a running identity provider:
|
|
120
|
+
|
|
121
|
+
```typescript
|
|
122
|
+
import type { LTAuthAdapter, AuthPayload } from '@hotmeshio/long-tail';
|
|
123
|
+
|
|
124
|
+
class DevAdapter implements LTAuthAdapter {
|
|
125
|
+
async authenticate(): Promise<AuthPayload> {
|
|
126
|
+
return { userId: 'dev-user', email: 'dev@localhost', role: 'admin' };
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
await start({
|
|
131
|
+
database: { connectionString: process.env.DATABASE_URL },
|
|
132
|
+
auth: { adapter: new DevAdapter() },
|
|
133
|
+
workers: [ ... ],
|
|
134
|
+
});
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
This adapter grants admin access to every request. Restrict its use to local environments.
|
|
138
|
+
|
|
139
|
+
## Service Account Authentication
|
|
140
|
+
|
|
141
|
+
Service accounts are named identities that authenticate with API keys instead of passwords or OAuth. They share the same RBAC system as human users — same roles, same delegation tokens, same credential storage.
|
|
142
|
+
|
|
143
|
+
### How It Works
|
|
144
|
+
|
|
145
|
+
Service account API keys are prefixed with `lt_bot_` and validated via bcrypt comparison, following the same pattern as service tokens. The built-in `JwtAuthAdapter` detects the prefix automatically:
|
|
146
|
+
|
|
147
|
+
```
|
|
148
|
+
Authorization: Bearer lt_bot_a1b2c3d4e5f6...
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
When a service account API key is validated, the adapter returns an `AuthPayload` with the account's `userId` (from the `lt_users` table). From that point forward, the request is indistinguishable from a human user's — the same middleware, RBAC checks, and identity propagation apply.
|
|
152
|
+
|
|
153
|
+
### Creating a Service Account
|
|
154
|
+
|
|
155
|
+
Service accounts are managed via the `/api/bot-accounts` endpoints (admin-only). See the [Service Accounts API](api/service-accounts.md) for full documentation.
|
|
156
|
+
|
|
157
|
+
```bash
|
|
158
|
+
# Create a service account
|
|
159
|
+
curl -X POST http://localhost:3000/api/bot-accounts \
|
|
160
|
+
-H "Authorization: Bearer $ADMIN_TOKEN" \
|
|
161
|
+
-H 'Content-Type: application/json' \
|
|
162
|
+
-d '{"name": "ci-bot", "description": "Runs scheduled workflows"}'
|
|
163
|
+
|
|
164
|
+
# Generate an API key (shown once)
|
|
165
|
+
curl -X POST http://localhost:3000/api/bot-accounts/$BOT_ID/api-keys \
|
|
166
|
+
-H "Authorization: Bearer $ADMIN_TOKEN" \
|
|
167
|
+
-H 'Content-Type: application/json' \
|
|
168
|
+
-d '{"name": "production", "scopes": ["mcp:tool:call"]}'
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
### Identity in Workflows
|
|
172
|
+
|
|
173
|
+
When a service account starts a workflow, its `userId` flows through the same envelope and `ToolContext` path as a human user. Activities that call `getToolContext()` receive a `ToolPrincipal` with `type: 'bot'`, and the task record's `initiated_by` column stores the account's user ID for audit.
|
|
174
|
+
|
|
175
|
+
## Environment Variables
|
|
176
|
+
|
|
177
|
+
| Variable | Required | Description |
|
|
178
|
+
|--------------|----------|--------------------------------------------------|
|
|
179
|
+
| `JWT_SECRET` | Yes | Signing and verification key for the JWT adapter. |
|
|
180
|
+
|
|
181
|
+
`JWT_SECRET` must be set when using `JwtAuthAdapter` or `signToken`. Omitting it will cause token verification to fail at runtime. Use a cryptographically random string of at least 32 characters in production.
|
package/docs/cloud.md
ADDED
|
@@ -0,0 +1,272 @@
|
|
|
1
|
+
# Cloud Deployment
|
|
2
|
+
|
|
3
|
+
Long Tail embeds its own server. Your application calls `start()` with a config object — that's the entire entry point. In production you typically run two container types that share the same PostgreSQL database: one serves HTTP requests, the other executes workflows. This separation lets each tier scale independently.
|
|
4
|
+
|
|
5
|
+
## Why Separate
|
|
6
|
+
|
|
7
|
+
| Concern | API container | Worker container |
|
|
8
|
+
|---------|--------------|-----------------|
|
|
9
|
+
| Purpose | Serve REST endpoints, authenticate requests, start workflows, query tasks and escalations | Execute workflow code, run activities, manage interceptors |
|
|
10
|
+
| Scaling trigger | Request volume | Workflow queue depth |
|
|
11
|
+
| Resource profile | I/O-bound (Postgres reads, HTTP) | Potentially CPU-bound (AI calls, document processing) |
|
|
12
|
+
| Network exposure | Public (behind load balancer) | Private (no inbound traffic) |
|
|
13
|
+
| Deploy cadence | Change routes or auth without touching workers | Update workflow logic without restarting the API |
|
|
14
|
+
|
|
15
|
+
Both containers install the same packages (`@hotmeshio/long-tail`, `@hotmeshio/hotmesh`) and share the same PostgreSQL connection string. They differ only in what they configure at boot.
|
|
16
|
+
|
|
17
|
+
## API Container
|
|
18
|
+
|
|
19
|
+
The API container runs the embedded server and serves REST endpoints. It does not start workers — no workflow execution happens here.
|
|
20
|
+
|
|
21
|
+
```typescript
|
|
22
|
+
// api.ts — API container entry point
|
|
23
|
+
import { start } from '@hotmeshio/long-tail';
|
|
24
|
+
|
|
25
|
+
await start({
|
|
26
|
+
database: { connectionString: process.env.DATABASE_URL },
|
|
27
|
+
server: { port: Number(process.env.PORT) || 3000 },
|
|
28
|
+
auth: { secret: process.env.JWT_SECRET },
|
|
29
|
+
});
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
That's it. Migrations run, the server starts, routes are mounted, auth is configured. The API container needs network ingress (load balancer, domain). It reads and writes Postgres but never processes workflow task queues.
|
|
33
|
+
|
|
34
|
+
## Worker Container
|
|
35
|
+
|
|
36
|
+
The worker container registers the LT interceptor, starts workflow workers, and optionally connects telemetry, event, and maintenance adapters. It runs no HTTP server.
|
|
37
|
+
|
|
38
|
+
```typescript
|
|
39
|
+
// worker.ts — Worker container entry point
|
|
40
|
+
import { start } from '@hotmeshio/long-tail';
|
|
41
|
+
import * as reviewContent from './workflows/review-content';
|
|
42
|
+
import * as verifyDocument from './workflows/verify-document';
|
|
43
|
+
|
|
44
|
+
await start({
|
|
45
|
+
database: { connectionString: process.env.DATABASE_URL },
|
|
46
|
+
server: { enabled: false },
|
|
47
|
+
workers: [
|
|
48
|
+
{ taskQueue: 'long-tail', workflow: reviewContent.reviewContent },
|
|
49
|
+
{ taskQueue: 'long-tail-verify', workflow: verifyDocument.verifyDocument },
|
|
50
|
+
],
|
|
51
|
+
telemetry: process.env.HONEYCOMB_API_KEY
|
|
52
|
+
? { honeycomb: { apiKey: process.env.HONEYCOMB_API_KEY } }
|
|
53
|
+
: undefined,
|
|
54
|
+
events: process.env.NATS_URL
|
|
55
|
+
? { nats: { url: process.env.NATS_URL } }
|
|
56
|
+
: undefined,
|
|
57
|
+
logging: { pino: { level: 'info' } },
|
|
58
|
+
});
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
The worker container needs no inbound network access. It connects outbound to PostgreSQL (and optionally NATS, Honeycomb, etc.) and polls task queues via the HotMesh engine.
|
|
62
|
+
|
|
63
|
+
## Architecture Diagram
|
|
64
|
+
|
|
65
|
+
```
|
|
66
|
+
┌──────────────────────────────────┐
|
|
67
|
+
│ Load Balancer │
|
|
68
|
+
└───────────────┬──────────────────┘
|
|
69
|
+
│
|
|
70
|
+
┌───────────────▼───────────────────┐
|
|
71
|
+
│ API Containers (N) │
|
|
72
|
+
│ │
|
|
73
|
+
│ start({ server, database }) │
|
|
74
|
+
│ Embedded Express + Auth + Routes │
|
|
75
|
+
│ No workers, no interceptors │
|
|
76
|
+
└───────────────┬───────────────────┘
|
|
77
|
+
│
|
|
78
|
+
┌───────────────▼──────────────────┐
|
|
79
|
+
│ PostgreSQL │
|
|
80
|
+
│ │
|
|
81
|
+
│ Workflow state (HotMesh) │
|
|
82
|
+
│ lt_tasks, lt_escalations │
|
|
83
|
+
│ lt_users, lt_config_* │
|
|
84
|
+
└───────────────▲──────────────────┘
|
|
85
|
+
│
|
|
86
|
+
┌───────────────┴──────────────────┐
|
|
87
|
+
│ Worker Containers (M) │
|
|
88
|
+
│ │
|
|
89
|
+
│ start({ workers, telemetry }) │
|
|
90
|
+
│ Workflow execution + activities │
|
|
91
|
+
│ Telemetry, events, maintenance │
|
|
92
|
+
│ No HTTP, no public ingress │
|
|
93
|
+
└──────────────────────────────────┘
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
API containers and worker containers scale independently. N and M need not be equal.
|
|
97
|
+
|
|
98
|
+
## AWS ECS
|
|
99
|
+
|
|
100
|
+
Two ECS services in one cluster, both in the same VPC with access to the same RDS PostgreSQL instance.
|
|
101
|
+
|
|
102
|
+
### API service
|
|
103
|
+
|
|
104
|
+
- Fargate or EC2 launch type
|
|
105
|
+
- Attached to an Application Load Balancer (ALB) target group
|
|
106
|
+
- Health check: `GET /health`
|
|
107
|
+
- Auto-scaling policy: target tracking on `RequestCountPerTarget`
|
|
108
|
+
- Security group: allow inbound 443 from ALB, outbound 5432 to RDS
|
|
109
|
+
|
|
110
|
+
### Worker service
|
|
111
|
+
|
|
112
|
+
- Fargate or EC2 launch type
|
|
113
|
+
- **No target group** — no inbound traffic
|
|
114
|
+
- Auto-scaling policy: step scaling on a custom CloudWatch metric for queue depth, or target tracking on CPU utilization
|
|
115
|
+
- Security group: outbound 5432 to RDS, outbound 443 to Honeycomb/NATS as needed, no inbound rules
|
|
116
|
+
|
|
117
|
+
### Task definitions
|
|
118
|
+
|
|
119
|
+
Both task definitions use the same Docker image. The difference is the `command` override:
|
|
120
|
+
|
|
121
|
+
```json
|
|
122
|
+
// API task definition
|
|
123
|
+
{
|
|
124
|
+
"containerDefinitions": [{
|
|
125
|
+
"command": ["node", "dist/api.js"],
|
|
126
|
+
"portMappings": [{ "containerPort": 3000 }]
|
|
127
|
+
}]
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
// Worker task definition
|
|
131
|
+
{
|
|
132
|
+
"containerDefinitions": [{
|
|
133
|
+
"command": ["node", "dist/worker.js"]
|
|
134
|
+
}]
|
|
135
|
+
}
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
### RDS
|
|
139
|
+
|
|
140
|
+
- PostgreSQL 15+ (gen_random_uuid requires pgcrypto or Postgres 13+)
|
|
141
|
+
- Multi-AZ for production
|
|
142
|
+
- Both services connect via the same `DATABASE_URL` endpoint
|
|
143
|
+
|
|
144
|
+
## GCP Cloud Run
|
|
145
|
+
|
|
146
|
+
### API service
|
|
147
|
+
|
|
148
|
+
```bash
|
|
149
|
+
gcloud run deploy long-tail-api \
|
|
150
|
+
--image gcr.io/PROJECT/long-tail:latest \
|
|
151
|
+
--command node,dist/api.js \
|
|
152
|
+
--port 3000 \
|
|
153
|
+
--allow-unauthenticated \
|
|
154
|
+
--add-cloudsql-instances PROJECT:REGION:INSTANCE \
|
|
155
|
+
--set-env-vars DATABASE_URL=...,JWT_SECRET=...
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
### Worker service
|
|
159
|
+
|
|
160
|
+
```bash
|
|
161
|
+
gcloud run deploy long-tail-workers \
|
|
162
|
+
--image gcr.io/PROJECT/long-tail:latest \
|
|
163
|
+
--command node,dist/worker.js \
|
|
164
|
+
--no-allow-unauthenticated \
|
|
165
|
+
--min-instances 1 \
|
|
166
|
+
--add-cloudsql-instances PROJECT:REGION:INSTANCE \
|
|
167
|
+
--set-env-vars DATABASE_URL=...,HONEYCOMB_API_KEY=...
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
Workers need `--min-instances 1` (or higher) because they must stay warm to poll task queues. Cloud Run scales to zero by default, which would stop all workflow processing.
|
|
171
|
+
|
|
172
|
+
### GKE alternative
|
|
173
|
+
|
|
174
|
+
For more control over scaling, use two Kubernetes Deployments in the same cluster:
|
|
175
|
+
|
|
176
|
+
```yaml
|
|
177
|
+
# api-deployment.yaml
|
|
178
|
+
apiVersion: apps/v1
|
|
179
|
+
kind: Deployment
|
|
180
|
+
metadata:
|
|
181
|
+
name: long-tail-api
|
|
182
|
+
spec:
|
|
183
|
+
replicas: 2
|
|
184
|
+
template:
|
|
185
|
+
spec:
|
|
186
|
+
containers:
|
|
187
|
+
- name: api
|
|
188
|
+
image: gcr.io/PROJECT/long-tail:latest
|
|
189
|
+
command: ["node", "dist/api.js"]
|
|
190
|
+
ports:
|
|
191
|
+
- containerPort: 3000
|
|
192
|
+
---
|
|
193
|
+
# worker-deployment.yaml
|
|
194
|
+
apiVersion: apps/v1
|
|
195
|
+
kind: Deployment
|
|
196
|
+
metadata:
|
|
197
|
+
name: long-tail-workers
|
|
198
|
+
spec:
|
|
199
|
+
replicas: 3
|
|
200
|
+
template:
|
|
201
|
+
spec:
|
|
202
|
+
containers:
|
|
203
|
+
- name: worker
|
|
204
|
+
image: gcr.io/PROJECT/long-tail:latest
|
|
205
|
+
command: ["node", "dist/worker.js"]
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
The API Deployment sits behind a Service + Ingress. The worker Deployment has no Service — it only makes outbound connections.
|
|
209
|
+
|
|
210
|
+
## Environment Variables
|
|
211
|
+
|
|
212
|
+
| Variable | API | Worker | Description |
|
|
213
|
+
|----------|:---:|:------:|-------------|
|
|
214
|
+
| `DATABASE_URL` | yes | yes | PostgreSQL connection string |
|
|
215
|
+
| `PORT` | yes | — | HTTP listen port (default: 3000) |
|
|
216
|
+
| `JWT_SECRET` | yes | — | Secret for verifying and signing JWTs |
|
|
217
|
+
| `HONEYCOMB_API_KEY` | — | yes | Honeycomb telemetry (optional) |
|
|
218
|
+
| `HMSH_TELEMETRY` | — | yes | Span verbosity: `info` or `debug` |
|
|
219
|
+
| `NATS_URL` | — | yes | NATS server for milestone events (optional) |
|
|
220
|
+
| `OPENAI_API_KEY` | — | yes | For workflows that call OpenAI (optional) |
|
|
221
|
+
|
|
222
|
+
Environment variables serve as fallbacks. When using `start()`, prefer passing config directly — it's explicit and type-checked. The API container does not need telemetry, event, or AI keys — it never executes workflow code. The worker container does not need `JWT_SECRET` or `PORT` — it never serves HTTP.
|
|
223
|
+
|
|
224
|
+
## Docker
|
|
225
|
+
|
|
226
|
+
A single Dockerfile with different `CMD` targets:
|
|
227
|
+
|
|
228
|
+
```dockerfile
|
|
229
|
+
FROM node:20-slim AS build
|
|
230
|
+
WORKDIR /app
|
|
231
|
+
COPY package*.json ./
|
|
232
|
+
RUN npm ci
|
|
233
|
+
COPY . .
|
|
234
|
+
RUN npm run build
|
|
235
|
+
|
|
236
|
+
FROM node:20-slim
|
|
237
|
+
WORKDIR /app
|
|
238
|
+
COPY --from=build /app/dist ./dist
|
|
239
|
+
COPY --from=build /app/node_modules ./node_modules
|
|
240
|
+
COPY --from=build /app/package.json ./
|
|
241
|
+
|
|
242
|
+
# Override CMD at deploy time:
|
|
243
|
+
# API: ["node", "dist/api.js"]
|
|
244
|
+
# Worker: ["node", "dist/worker.js"]
|
|
245
|
+
CMD ["node", "dist/api.js"]
|
|
246
|
+
```
|
|
247
|
+
|
|
248
|
+
For local development, docker-compose runs both roles in a single container:
|
|
249
|
+
|
|
250
|
+
```yaml
|
|
251
|
+
services:
|
|
252
|
+
postgres:
|
|
253
|
+
image: postgres:16
|
|
254
|
+
environment:
|
|
255
|
+
POSTGRES_DB: longtail
|
|
256
|
+
POSTGRES_PASSWORD: password
|
|
257
|
+
ports:
|
|
258
|
+
- "${LT_PG_PORT:-5432}:5432"
|
|
259
|
+
|
|
260
|
+
app:
|
|
261
|
+
build: .
|
|
262
|
+
command: node dist/index.js # combined API + workers
|
|
263
|
+
environment:
|
|
264
|
+
DATABASE_URL: postgres://postgres:password@postgres:5432/longtail
|
|
265
|
+
JWT_SECRET: dev-secret
|
|
266
|
+
ports:
|
|
267
|
+
- "${LT_PORT:-3000}:3000"
|
|
268
|
+
depends_on:
|
|
269
|
+
- postgres
|
|
270
|
+
```
|
|
271
|
+
|
|
272
|
+
The combined `index.js` entry point (used in development and the demo) calls `start()` with both server and workers enabled. In production, split them into `api.js` and `worker.js` with different `start()` configs.
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
# The Compilation Pipeline
|
|
2
|
+
|
|
3
|
+
Every AI-driven execution carries cost. An LLM reasons through each step, selects tools, interprets results, and decides what to do next. It works, but it is slow, non-deterministic, and consumes tokens on every run.
|
|
4
|
+
|
|
5
|
+
Long Tail records what the LLM did, extracts the pattern, and compiles it into a deterministic workflow. The next time the same problem appears, it runs without an LLM — no reasoning, no token cost, same result.
|
|
6
|
+
|
|
7
|
+
This guide follows a single query through the full lifecycle: dynamic execution, compilation, deterministic replay, and automatic routing. All steps take place in the dashboard's **Pipeline Designer** page (sidebar: **MCP Workflows → Pipeline Designer**).
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## The Dynamic Execution
|
|
12
|
+
|
|
13
|
+
Open **Pipeline Designer** from the sidebar. The page lists previous MCP query runs and provides a prompt field to start a new one. Describe what you need in natural language — for example, "Log into the dashboard, discover all navigation pages, and screenshot each one." Optionally constrain which MCP tool tags to search.
|
|
14
|
+
|
|
15
|
+
When the query is submitted, the `mcpQuery` workflow starts. It discovers available tools by tag (GIN-indexed full-text search), then enters an agentic loop: the LLM selects a tool, calls it, reads the result, and decides the next step. Every tool call is checkpointed by the workflow engine. If the process crashes mid-execution, it resumes from the last checkpoint — no work is lost, no step runs twice.
|
|
16
|
+
|
|
17
|
+
The run appears in the **Pipeline Designer** list once it completes. Click into it to open the **Compilation Wizard**.
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## The Compilation Wizard
|
|
22
|
+
|
|
23
|
+
The wizard has six steps, shown as numbered circles in a sticky bar at the top of the page. Each step represents one stage of converting the dynamic execution into a deployable deterministic workflow:
|
|
24
|
+
|
|
25
|
+
1. **Describe**
|
|
26
|
+
2. **Discover**
|
|
27
|
+
3. **Compile**
|
|
28
|
+
4. **Deploy**
|
|
29
|
+
5. **Test**
|
|
30
|
+
6. **Verify**
|
|
31
|
+
|
|
32
|
+
Steps unlock sequentially — you must complete each before advancing.
|
|
33
|
+
|
|
34
|
+
### 1. Describe
|
|
35
|
+
|
|
36
|
+
**Subtitle:** *Dynamic LLM-orchestrated execution — the discovery run*
|
|
37
|
+
|
|
38
|
+
The first panel displays what the LLM produced: the input envelope on the left and the structured output on the right. Duration is shown. This is the reference point — whatever the compiled workflow produces will be compared against it.
|
|
39
|
+
|
|
40
|
+
### 2. Discover
|
|
41
|
+
|
|
42
|
+
**Subtitle:** *Activity swimlane showing tool calls and their durations*
|
|
43
|
+
|
|
44
|
+
A swimlane visualization of the execution. Each row is an MCP server, each block is a tool call, positioned on a time axis. The pattern is visible at a glance: the LLM logged in, extracted navigation links, then looped through each page to capture a screenshot.
|
|
45
|
+
|
|
46
|
+
### 3. Compile
|
|
47
|
+
|
|
48
|
+
**Subtitle:** *Define the deterministic workflow tool from this execution*
|
|
49
|
+
|
|
50
|
+
The workflow needs an identity. This panel presents a form with:
|
|
51
|
+
|
|
52
|
+
- **Namespace** — a required alphanumeric identifier for the workflow's application scope.
|
|
53
|
+
- **Tool Name** — the workflow's MCP tool name for discovery. This is how other agents and workflows will find and invoke it.
|
|
54
|
+
- **Description** — auto-generated from the execution trace. Editable.
|
|
55
|
+
- **Tags** — suggested from the execution trace. Add or remove tags to control discoverability.
|
|
56
|
+
|
|
57
|
+
An optional **Refine compilation** toggle reveals a feedback textarea where you can provide additional instructions to the compiler.
|
|
58
|
+
|
|
59
|
+
Clicking **Compile Pipeline** triggers the five-stage compilation pipeline:
|
|
60
|
+
|
|
61
|
+
1. **Extract** — parse the execution trace into an ordered step sequence
|
|
62
|
+
2. **Analyze** — detect iteration patterns (the screenshot loop), classify inputs as dynamic (user-provided) or fixed (implementation detail)
|
|
63
|
+
3. **Compile** — an LLM produces a blueprint with data-flow edges and session threading, guided by per-server **compile hints** stored in the database (e.g., which output fields to use as transform sources, how to thread browser session handles)
|
|
64
|
+
4. **Build** — generate a deterministic YAML DAG with activity wiring
|
|
65
|
+
5. **Validate** — check for missing wiring, lost session handles, broken iteration boundaries
|
|
66
|
+
|
|
67
|
+
Once compilation succeeds, the panel switches to a read-only view showing the workflow name, status badge, namespace, topic, description, activity pipeline chain, and tags.
|
|
68
|
+
|
|
69
|
+
### 4. Deploy
|
|
70
|
+
|
|
71
|
+
**Subtitle:** *Review configuration, input/output schemas, and YAML definition*
|
|
72
|
+
|
|
73
|
+
The deploy panel displays the compiled YAML definition, input schema, and output schema. The YAML encodes the DAG: each step names an MCP tool, declares its inputs (either from the user's request or from a prior step's output), and specifies data-flow edges.
|
|
74
|
+
|
|
75
|
+
Two toggle buttons are available:
|
|
76
|
+
|
|
77
|
+
- **Recompile with Feedback** — provide notes to the compiler and regenerate the YAML.
|
|
78
|
+
- **Manual Edit** — directly edit the YAML, schemas, or activity manifest.
|
|
79
|
+
|
|
80
|
+
A version history panel on the right tracks all edits. The step label changes from "Deploy" to "Redeploy" when the workflow is already active.
|
|
81
|
+
|
|
82
|
+
Clicking **Deploy & Activate** registers the workflow as a live MCP tool — tagged for discovery, versioned, invocable by any agent, workflow, or API call.
|
|
83
|
+
|
|
84
|
+
### 5. Test
|
|
85
|
+
|
|
86
|
+
**Header:** *Compare Runs*
|
|
87
|
+
|
|
88
|
+
The test panel runs the compiled workflow and compares it against the original dynamic execution. Two columns show:
|
|
89
|
+
|
|
90
|
+
- **Left — Original MCP Query**: the dynamic LLM-orchestrated run with its input, output, and duration.
|
|
91
|
+
- **Right — Compiled Pipeline Run**: the deterministic run with its input, output, and duration. A dropdown allows selecting from multiple test runs.
|
|
92
|
+
|
|
93
|
+
Click **Run Test** to invoke the compiled workflow with the original input. An invocation modal appears with the pre-populated input schema.
|
|
94
|
+
|
|
95
|
+
The difference is structural:
|
|
96
|
+
|
|
97
|
+
| | Dynamic (LLM) | Deterministic |
|
|
98
|
+
|---|---|---|
|
|
99
|
+
| **Tool calls** | N (LLM selects each) | 1 pipeline (pre-wired DAG) |
|
|
100
|
+
| **LLM usage** | Every step | Route + input extraction only |
|
|
101
|
+
| **Determinism** | Varies per run | Identical every time |
|
|
102
|
+
|
|
103
|
+
The deterministic path is faster because the LLM is used only at the edges — routing the request and extracting structured inputs from the prompt. The DAG itself executes tool calls directly with pre-wired data flow. No per-step reasoning, no tool selection, no interpretation.
|
|
104
|
+
|
|
105
|
+
### 6. Verify
|
|
106
|
+
|
|
107
|
+
**Header:** *End-to-End Verification*
|
|
108
|
+
|
|
109
|
+
The final panel confirms end-to-end routing. The original prompt is pre-filled in an editable textarea on the left. Click **Submit** to send it through the `mcpQueryRouter` — the same entry point any future request would use. A **Reset to original** button restores the prompt if you modify it.
|
|
110
|
+
|
|
111
|
+
The right column shows the result: a status badge, confidence percentage (when the deterministic path is used), and the full output in a JSON viewer. A **RouterProgressTracker** displays real-time routing progress during execution.
|
|
112
|
+
|
|
113
|
+
The router performs full-text search and tag matching to find candidate workflows, then uses an LLM judge to confirm scope. When confidence exceeds the threshold, the request goes straight to the compiled workflow.
|
|
114
|
+
|
|
115
|
+
```
|
|
116
|
+
User prompt → Router → Discovery (FTS + tags) → LLM Judge
|
|
117
|
+
│ │
|
|
118
|
+
│ confidence ≥ 0.7 │ no match
|
|
119
|
+
▼ ▼
|
|
120
|
+
Deterministic Dynamic
|
|
121
|
+
(compiled DAG, no LLM) (agentic loop)
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
---
|
|
125
|
+
|
|
126
|
+
## How It Accumulates
|
|
127
|
+
|
|
128
|
+
The first time a problem appears, the dynamic path runs. An LLM reasons through it — slow and expensive, but it works.
|
|
129
|
+
|
|
130
|
+
The wizard compiles the solution into a deterministic pipeline. A human reviews the DAG, adjusts if needed, and deploys.
|
|
131
|
+
|
|
132
|
+
Every subsequent occurrence is routed automatically. A single LLM call extracts structured inputs from the prompt, then the DAG executes without further reasoning.
|
|
133
|
+
|
|
134
|
+
Each compiled workflow is itself a discoverable MCP tool. Other workflows and agents can invoke it. Solutions compose. The inventory of deterministic pathways grows with every problem the system solves, and the fraction of requests that require LLM reasoning shrinks.
|
|
135
|
+
|
|
136
|
+
The dynamic path remains for genuinely new problems. But the long tail gets shorter.
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
# Contributing
|
|
2
|
+
|
|
3
|
+
## Running the Demo
|
|
4
|
+
|
|
5
|
+
The repository includes a working server with example workflows (`reviewContent`, `kitchenSink`, `basicEcho`, and more), Postgres, NATS, and a React dashboard.
|
|
6
|
+
|
|
7
|
+
### Prerequisites
|
|
8
|
+
|
|
9
|
+
- [Docker](https://docs.docker.com/get-docker/)
|
|
10
|
+
|
|
11
|
+
### Run
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
git clone https://github.com/hotmeshio/long-tail.git
|
|
15
|
+
cd long-tail
|
|
16
|
+
docker compose up
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
Postgres, NATS, the API server, and the dashboard start together. The dashboard is built during the Docker image build and served as static assets. Migrations run automatically.
|
|
20
|
+
|
|
21
|
+
Default ports are `3000` (API), `5432` (Postgres), `4222`/`8222` (NATS). Override any of them:
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
LT_PORT=3001 LT_PG_PORT=5433 LT_NATS_PORT=4223 docker compose up
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
## Testing
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
# Start Postgres and NATS
|
|
31
|
+
docker compose up -d postgres nats
|
|
32
|
+
|
|
33
|
+
# Run all tests
|
|
34
|
+
npm test
|
|
35
|
+
|
|
36
|
+
# Run workflow tests
|
|
37
|
+
npm run test:workflows
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
## Development Setup
|
|
41
|
+
|
|
42
|
+
1. Fork the repository and clone your fork
|
|
43
|
+
2. Install dependencies: `npm install`
|
|
44
|
+
3. Start infrastructure: `docker compose up -d postgres nats`
|
|
45
|
+
4. Run tests to verify your setup: `npm test`
|
|
46
|
+
|
|
47
|
+
## Pull Requests
|
|
48
|
+
|
|
49
|
+
- Create a feature branch from `main`
|
|
50
|
+
- Keep changes focused — one concern per PR
|
|
51
|
+
- Add or update tests for any new behavior
|
|
52
|
+
- Run `npm test` before submitting
|
|
53
|
+
|
|
54
|
+
## Issues
|
|
55
|
+
|
|
56
|
+
Report bugs and request features at [github.com/hotmeshio/long-tail/issues](https://github.com/hotmeshio/long-tail/issues).
|