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