@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
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* The server's half of a browser's NATS connection, as the WebSocket proxy
|
|
4
|
+
* forwards it. Message payloads (MSG and HMSG) pass through `rewrite`, which
|
|
5
|
+
* returns the payload to deliver or null to withhold the message; protocol
|
|
6
|
+
* lines (INFO, PING, PONG, +OK, -ERR) pass unchanged.
|
|
7
|
+
*
|
|
8
|
+
* Operations can span WebSocket frames, so the filter keeps whatever it has
|
|
9
|
+
* not yet seen whole.
|
|
10
|
+
*/
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.NatsServerFilter = void 0;
|
|
13
|
+
const CRLF = Buffer.from('\r\n');
|
|
14
|
+
class NatsServerFilter {
|
|
15
|
+
constructor(rewrite) {
|
|
16
|
+
this.rewrite = rewrite;
|
|
17
|
+
this.pending = Buffer.alloc(0);
|
|
18
|
+
}
|
|
19
|
+
/** The bytes to forward to the browser for one chunk from the server. */
|
|
20
|
+
feed(chunk) {
|
|
21
|
+
this.pending = this.pending.length ? Buffer.concat([this.pending, chunk]) : chunk;
|
|
22
|
+
const out = [];
|
|
23
|
+
for (;;) {
|
|
24
|
+
const end = this.pending.indexOf(CRLF);
|
|
25
|
+
if (end === -1)
|
|
26
|
+
break;
|
|
27
|
+
const line = this.pending.subarray(0, end).toString('utf8');
|
|
28
|
+
const space = line.indexOf(' ');
|
|
29
|
+
const op = (space === -1 ? line : line.slice(0, space)).toUpperCase();
|
|
30
|
+
if (op !== 'MSG' && op !== 'HMSG') {
|
|
31
|
+
out.push(this.pending.subarray(0, end + CRLF.length));
|
|
32
|
+
this.pending = this.pending.subarray(end + CRLF.length);
|
|
33
|
+
continue;
|
|
34
|
+
}
|
|
35
|
+
// MSG <subject> <sid> [reply] <size>
|
|
36
|
+
// HMSG <subject> <sid> [reply] <header size> <total size>
|
|
37
|
+
const args = line.slice(space + 1).trim().split(/\s+/);
|
|
38
|
+
const total = Number(args[args.length - 1]);
|
|
39
|
+
const headerSize = op === 'HMSG' ? Number(args[args.length - 2]) : 0;
|
|
40
|
+
const start = end + CRLF.length;
|
|
41
|
+
const need = start + total + CRLF.length;
|
|
42
|
+
if (this.pending.length < need)
|
|
43
|
+
break;
|
|
44
|
+
const headers = this.pending.subarray(start, start + headerSize);
|
|
45
|
+
const body = this.rewrite(this.pending.subarray(start + headerSize, start + total));
|
|
46
|
+
this.pending = this.pending.subarray(need);
|
|
47
|
+
if (body === null)
|
|
48
|
+
continue;
|
|
49
|
+
const prefix = args.slice(0, op === 'HMSG' ? -2 : -1).join(' ');
|
|
50
|
+
const sizes = op === 'HMSG' ? `${headerSize} ${headerSize + body.length}` : `${body.length}`;
|
|
51
|
+
out.push(Buffer.from(`${op} ${prefix} ${sizes}\r\n`, 'utf8'), headers, body, CRLF);
|
|
52
|
+
}
|
|
53
|
+
return Buffer.concat(out);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
exports.NatsServerFilter = NatsServerFilter;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A browser's pass to the NATS WebSocket proxy, in place of the NATS server
|
|
3
|
+
* credential. It names the person in `sub` and carries no `userId`, so it
|
|
4
|
+
* authenticates nothing but the proxy upgrade.
|
|
5
|
+
*/
|
|
6
|
+
export declare const NATS_WS_TICKET_TYPE = "nats-ws+jwt";
|
|
7
|
+
export declare const NATS_WS_TICKET_PARAM = "ticket";
|
|
8
|
+
export declare function signNatsWsTicket(userId: string): string | null;
|
|
9
|
+
/** The person a valid ticket names; null for anything else. */
|
|
10
|
+
export declare function verifyNatsWsTicket(ticket: string | null | undefined): string | null;
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.NATS_WS_TICKET_PARAM = exports.NATS_WS_TICKET_TYPE = void 0;
|
|
7
|
+
exports.signNatsWsTicket = signNatsWsTicket;
|
|
8
|
+
exports.verifyNatsWsTicket = verifyNatsWsTicket;
|
|
9
|
+
const jsonwebtoken_1 = __importDefault(require("jsonwebtoken"));
|
|
10
|
+
const config_1 = require("../../modules/config");
|
|
11
|
+
/**
|
|
12
|
+
* A browser's pass to the NATS WebSocket proxy, in place of the NATS server
|
|
13
|
+
* credential. It names the person in `sub` and carries no `userId`, so it
|
|
14
|
+
* authenticates nothing but the proxy upgrade.
|
|
15
|
+
*/
|
|
16
|
+
exports.NATS_WS_TICKET_TYPE = 'nats-ws+jwt';
|
|
17
|
+
exports.NATS_WS_TICKET_PARAM = 'ticket';
|
|
18
|
+
function signNatsWsTicket(userId) {
|
|
19
|
+
if (!config_1.config.JWT_SECRET)
|
|
20
|
+
return null;
|
|
21
|
+
return jsonwebtoken_1.default.sign({}, config_1.config.JWT_SECRET, {
|
|
22
|
+
algorithm: 'HS256',
|
|
23
|
+
header: { alg: 'HS256', typ: exports.NATS_WS_TICKET_TYPE },
|
|
24
|
+
subject: userId,
|
|
25
|
+
expiresIn: config_1.config.NATS_WS_TICKET_TTL_SECONDS,
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
/** The person a valid ticket names; null for anything else. */
|
|
29
|
+
function verifyNatsWsTicket(ticket) {
|
|
30
|
+
if (!ticket || !config_1.config.JWT_SECRET)
|
|
31
|
+
return null;
|
|
32
|
+
try {
|
|
33
|
+
const decoded = jsonwebtoken_1.default.verify(ticket, config_1.config.JWT_SECRET, { algorithms: ['HS256'], complete: true });
|
|
34
|
+
if (decoded.header.typ !== exports.NATS_WS_TICKET_TYPE)
|
|
35
|
+
return null;
|
|
36
|
+
const payload = decoded.payload;
|
|
37
|
+
return typeof payload.sub === 'string' && typeof payload.exp === 'number' ? payload.sub : null;
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
return null;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
@@ -4,7 +4,16 @@ import type { LTEvent, LTEventAdapter } from '../../types';
|
|
|
4
4
|
* Callback to verify a Socket.IO handshake token.
|
|
5
5
|
* Return `true` to allow the connection, `false` to reject.
|
|
6
6
|
*/
|
|
7
|
-
|
|
7
|
+
/**
|
|
8
|
+
* Verifies a socket's token. Returning the person (`{ userId }`) lets delivery
|
|
9
|
+
* follow their capabilities; `true` admits the socket with the browser view
|
|
10
|
+
* (lib/events/browser-view.ts).
|
|
11
|
+
*/
|
|
12
|
+
export type SocketIOAuthenticator = (token: string) => boolean | {
|
|
13
|
+
userId: string;
|
|
14
|
+
} | Promise<boolean | {
|
|
15
|
+
userId: string;
|
|
16
|
+
}>;
|
|
8
17
|
/**
|
|
9
18
|
* Socket.IO event adapter for browser clients.
|
|
10
19
|
*
|
|
@@ -4,6 +4,7 @@ exports.SocketIOEventAdapter = void 0;
|
|
|
4
4
|
const socket_io_1 = require("socket.io");
|
|
5
5
|
const logger_1 = require("../logger");
|
|
6
6
|
const matching_1 = require("./matching");
|
|
7
|
+
const browser_view_1 = require("./browser-view");
|
|
7
8
|
/**
|
|
8
9
|
* Socket.IO event adapter for browser clients.
|
|
9
10
|
*
|
|
@@ -73,6 +74,8 @@ class SocketIOEventAdapter {
|
|
|
73
74
|
if (!valid) {
|
|
74
75
|
return next(new Error('Authentication failed'));
|
|
75
76
|
}
|
|
77
|
+
if (typeof valid === 'object')
|
|
78
|
+
socket.data.ltUserId = valid.userId;
|
|
76
79
|
next();
|
|
77
80
|
}
|
|
78
81
|
catch {
|
|
@@ -86,6 +89,9 @@ class SocketIOEventAdapter {
|
|
|
86
89
|
// switches the socket from broadcast to scoped delivery.
|
|
87
90
|
const patterns = new Set();
|
|
88
91
|
socket.data.ltPatterns = patterns;
|
|
92
|
+
// Until the lookup answers, the socket receives the browser view.
|
|
93
|
+
socket.data.ltViewer = { builder: false };
|
|
94
|
+
(0, browser_view_1.viewerFor)(socket.data.ltUserId).then((viewer) => { socket.data.ltViewer = viewer; });
|
|
89
95
|
socket.on('lt.subscribe', (pattern) => {
|
|
90
96
|
if (typeof pattern === 'string' && pattern.length > 0 && pattern.length <= 256) {
|
|
91
97
|
patterns.add(pattern);
|
|
@@ -107,14 +113,15 @@ class SocketIOEventAdapter {
|
|
|
107
113
|
const channel = `lt.events.${event.type}`;
|
|
108
114
|
for (const socket of this.io.of('/').sockets.values()) {
|
|
109
115
|
const patterns = socket.data.ltPatterns;
|
|
116
|
+
const delivered = (0, browser_view_1.eventForViewer)(event, socket.data.ltViewer ?? { builder: false });
|
|
110
117
|
if (!patterns || patterns.size === 0) {
|
|
111
|
-
// Legacy scope: a socket with no registered patterns gets
|
|
112
|
-
socket.emit(channel,
|
|
118
|
+
// Legacy scope: a socket with no registered patterns gets every subject.
|
|
119
|
+
socket.emit(channel, delivered);
|
|
113
120
|
continue;
|
|
114
121
|
}
|
|
115
122
|
for (const pattern of patterns) {
|
|
116
123
|
if ((0, matching_1.subjectMatchesPattern)(channel, pattern)) {
|
|
117
|
-
socket.emit(channel,
|
|
124
|
+
socket.emit(channel, delivered);
|
|
118
125
|
break;
|
|
119
126
|
}
|
|
120
127
|
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import express from 'express';
|
|
2
|
+
/**
|
|
3
|
+
* The single module that imports the HTTP framework.
|
|
4
|
+
*
|
|
5
|
+
* Routes, middleware, adapters and the standalone server take routers,
|
|
6
|
+
* handler types and body/static middleware from here. Long Tail runs both
|
|
7
|
+
* as its own server and as a guest on a host's Express instance (NestJS,
|
|
8
|
+
* Express), so the framework dependency has exactly one owner.
|
|
9
|
+
*/
|
|
10
|
+
export { Router } from 'express';
|
|
11
|
+
export type { Application, ErrorRequestHandler, NextFunction, Request, RequestHandler, Response, } from 'express';
|
|
12
|
+
type JsonBodyOptions = Parameters<typeof express.json>[0];
|
|
13
|
+
type StaticFilesOptions = Parameters<typeof express.static>[1];
|
|
14
|
+
/** A new application. Only the standalone server owns one; embedded mode uses the host's. */
|
|
15
|
+
export declare function createApp(): express.Application;
|
|
16
|
+
/** JSON body parsing. A body the host already parsed is left as is. */
|
|
17
|
+
export declare function jsonBody(options?: JsonBodyOptions): express.RequestHandler;
|
|
18
|
+
/** Static file serving from `root`. */
|
|
19
|
+
export declare function serveStatic(root: string, options?: StaticFilesOptions): express.RequestHandler;
|
|
20
|
+
/**
|
|
21
|
+
* Non-credentialed CORS for public endpoints: any origin may call them, and
|
|
22
|
+
* preflight requests are answered here.
|
|
23
|
+
*/
|
|
24
|
+
export declare function allowAnyOrigin(methods?: string[]): express.RequestHandler;
|
|
25
|
+
type FormBodyOptions = Parameters<typeof express.urlencoded>[0];
|
|
26
|
+
/** URL-encoded form body parsing. A body the host already parsed is left as is. */
|
|
27
|
+
export declare function formBody(options?: FormBodyOptions): express.RequestHandler;
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.Router = void 0;
|
|
7
|
+
exports.createApp = createApp;
|
|
8
|
+
exports.jsonBody = jsonBody;
|
|
9
|
+
exports.serveStatic = serveStatic;
|
|
10
|
+
exports.allowAnyOrigin = allowAnyOrigin;
|
|
11
|
+
exports.formBody = formBody;
|
|
12
|
+
const express_1 = __importDefault(require("express"));
|
|
13
|
+
/**
|
|
14
|
+
* The single module that imports the HTTP framework.
|
|
15
|
+
*
|
|
16
|
+
* Routes, middleware, adapters and the standalone server take routers,
|
|
17
|
+
* handler types and body/static middleware from here. Long Tail runs both
|
|
18
|
+
* as its own server and as a guest on a host's Express instance (NestJS,
|
|
19
|
+
* Express), so the framework dependency has exactly one owner.
|
|
20
|
+
*/
|
|
21
|
+
var express_2 = require("express");
|
|
22
|
+
Object.defineProperty(exports, "Router", { enumerable: true, get: function () { return express_2.Router; } });
|
|
23
|
+
/** A new application. Only the standalone server owns one; embedded mode uses the host's. */
|
|
24
|
+
function createApp() {
|
|
25
|
+
return (0, express_1.default)();
|
|
26
|
+
}
|
|
27
|
+
/** JSON body parsing. A body the host already parsed is left as is. */
|
|
28
|
+
function jsonBody(options) {
|
|
29
|
+
return express_1.default.json(options);
|
|
30
|
+
}
|
|
31
|
+
/** Static file serving from `root`. */
|
|
32
|
+
function serveStatic(root, options) {
|
|
33
|
+
return express_1.default.static(root, options);
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Non-credentialed CORS for public endpoints: any origin may call them, and
|
|
37
|
+
* preflight requests are answered here.
|
|
38
|
+
*/
|
|
39
|
+
function allowAnyOrigin(methods = ['GET', 'POST']) {
|
|
40
|
+
const allowMethods = [...methods, 'OPTIONS'].join(', ');
|
|
41
|
+
return (req, res, next) => {
|
|
42
|
+
res.setHeader('Access-Control-Allow-Origin', '*');
|
|
43
|
+
res.setHeader('Access-Control-Allow-Methods', allowMethods);
|
|
44
|
+
res.setHeader('Access-Control-Allow-Headers', 'Authorization, Content-Type, MCP-Protocol-Version');
|
|
45
|
+
if (req.method === 'OPTIONS') {
|
|
46
|
+
res.status(204).end();
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
next();
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
/** URL-encoded form body parsing. A body the host already parsed is left as is. */
|
|
53
|
+
function formBody(options = { extended: false }) {
|
|
54
|
+
return express_1.default.urlencoded(options);
|
|
55
|
+
}
|
package/build/modules/auth.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Request, RequestHandler } from '
|
|
1
|
+
import { Request, RequestHandler } from '../lib/http';
|
|
2
2
|
import type { AuthPayload, LTAuthAdapter } from '../types';
|
|
3
3
|
export type { AuthPayload, LTAuthAdapter };
|
|
4
4
|
declare global {
|
|
@@ -40,34 +40,25 @@ export declare class JwtAuthAdapter implements LTAuthAdapter {
|
|
|
40
40
|
*/
|
|
41
41
|
export declare function createAuthMiddleware(adapter: LTAuthAdapter): RequestHandler;
|
|
42
42
|
export declare const requireAuth: RequestHandler;
|
|
43
|
+
/**
|
|
44
|
+
* `requireAuth` without the SSO fallback: only a credential the request
|
|
45
|
+
* carries itself (the configured adapter, else a Bearer JWT or bot key).
|
|
46
|
+
* For endpoints a cross-site page must not reach through the host's cookie.
|
|
47
|
+
*/
|
|
48
|
+
export declare const requireCredentialAuth: RequestHandler;
|
|
43
49
|
/**
|
|
44
50
|
* Replace the auth adapter used by `requireAuth`.
|
|
45
51
|
* Call before starting the server.
|
|
46
52
|
*/
|
|
47
53
|
export declare function setAuthAdapter(adapter: LTAuthAdapter): void;
|
|
48
|
-
/**
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
* Middleware that requires builder access. Must be placed AFTER requireAuth.
|
|
57
|
-
*
|
|
58
|
-
* Builders are superadmin or users with the 'engineer' role.
|
|
59
|
-
* This is the backend equivalent of the dashboard's `isBuilder` check.
|
|
60
|
-
*/
|
|
61
|
-
export declare const requireBuilder: RequestHandler;
|
|
62
|
-
/**
|
|
63
|
-
* Middleware that requires role-management access. Must be placed AFTER requireAuth.
|
|
64
|
-
*
|
|
65
|
-
* Grants access to superadmins, admin-type users, and engineers — the backend
|
|
66
|
-
* equivalent of the dashboard's `isBuilder || isOps`. Ops (admin type) manage
|
|
67
|
-
* users and roles; builders (superadmin, engineer) are a superset. This is the
|
|
68
|
-
* gate for reading and writing role definitions.
|
|
69
|
-
*/
|
|
70
|
-
export declare const requireRoleManager: RequestHandler;
|
|
54
|
+
/** Admin access: admin or superadmin claim, or a superadmin in the database. */
|
|
55
|
+
export declare const requireAdmin: RequestHandler<import("express-serve-static-core").ParamsDictionary, any, any, import("qs").ParsedQs, Record<string, any>>;
|
|
56
|
+
/** Builder access: superadmin or the 'engineer' role. Backend twin of the dashboard's `isBuilder`. */
|
|
57
|
+
export declare const requireBuilder: RequestHandler<import("express-serve-static-core").ParamsDictionary, any, any, import("qs").ParsedQs, Record<string, any>>;
|
|
58
|
+
/** Role-management access: admin access or the 'engineer' role. Backend twin of `isBuilder || isOps`. */
|
|
59
|
+
export declare const requireRoleManager: RequestHandler<import("express-serve-static-core").ParamsDictionary, any, any, import("qs").ParsedQs, Record<string, any>>;
|
|
60
|
+
/** Reads of one workflow run (`:workflowId`): builder access, or the person who started it or it runs as. */
|
|
61
|
+
export declare const requireWorkflowReader: RequestHandler;
|
|
71
62
|
/**
|
|
72
63
|
* Generate a JWT token. Utility for tests and token provisioning.
|
|
73
64
|
*/
|
package/build/modules/auth.js
CHANGED
|
@@ -1,42 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
-
var ownKeys = function(o) {
|
|
20
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
-
var ar = [];
|
|
22
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
-
return ar;
|
|
24
|
-
};
|
|
25
|
-
return ownKeys(o);
|
|
26
|
-
};
|
|
27
|
-
return function (mod) {
|
|
28
|
-
if (mod && mod.__esModule) return mod;
|
|
29
|
-
var result = {};
|
|
30
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
-
__setModuleDefault(result, mod);
|
|
32
|
-
return result;
|
|
33
|
-
};
|
|
34
|
-
})();
|
|
35
2
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
4
|
};
|
|
38
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
-
exports.requireRoleManager = exports.requireBuilder = exports.requireAdmin = exports.requireAuth = exports.JwtAuthAdapter = void 0;
|
|
6
|
+
exports.requireWorkflowReader = exports.requireRoleManager = exports.requireBuilder = exports.requireAdmin = exports.requireCredentialAuth = exports.requireAuth = exports.JwtAuthAdapter = void 0;
|
|
40
7
|
exports.createAuthMiddleware = createAuthMiddleware;
|
|
41
8
|
exports.setAuthAdapter = setAuthAdapter;
|
|
42
9
|
exports.signToken = signToken;
|
|
@@ -44,7 +11,7 @@ const jsonwebtoken_1 = __importDefault(require("jsonwebtoken"));
|
|
|
44
11
|
const config_1 = require("./config");
|
|
45
12
|
const sso_1 = require("./sso");
|
|
46
13
|
const logger_1 = require("../lib/logger");
|
|
47
|
-
const
|
|
14
|
+
const capabilities_1 = require("./capabilities");
|
|
48
15
|
const sso_provision_1 = require("../services/user/sso-provision");
|
|
49
16
|
const bot_api_key_1 = require("../services/auth/bot-api-key");
|
|
50
17
|
const principal_1 = require("../services/iam/principal");
|
|
@@ -192,6 +159,16 @@ const requireAuth = async (req, res, next) => {
|
|
|
192
159
|
mw(req, res, next);
|
|
193
160
|
};
|
|
194
161
|
exports.requireAuth = requireAuth;
|
|
162
|
+
/**
|
|
163
|
+
* `requireAuth` without the SSO fallback: only a credential the request
|
|
164
|
+
* carries itself (the configured adapter, else a Bearer JWT or bot key).
|
|
165
|
+
* For endpoints a cross-site page must not reach through the host's cookie.
|
|
166
|
+
*/
|
|
167
|
+
const requireCredentialAuth = (req, res, next) => {
|
|
168
|
+
const mw = _authMiddleware || createAuthMiddleware(new JwtAuthAdapter());
|
|
169
|
+
return mw(req, res, next);
|
|
170
|
+
};
|
|
171
|
+
exports.requireCredentialAuth = requireCredentialAuth;
|
|
195
172
|
/**
|
|
196
173
|
* Replace the auth adapter used by `requireAuth`.
|
|
197
174
|
* Call before starting the server.
|
|
@@ -199,107 +176,47 @@ exports.requireAuth = requireAuth;
|
|
|
199
176
|
function setAuthAdapter(adapter) {
|
|
200
177
|
_authMiddleware = createAuthMiddleware(adapter);
|
|
201
178
|
}
|
|
202
|
-
/**
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
if (req.auth.role === 'admin' || req.auth.role === 'superadmin') {
|
|
216
|
-
next();
|
|
217
|
-
return;
|
|
218
|
-
}
|
|
219
|
-
// Slow path: check database for superadmin role type
|
|
220
|
-
if (await (0, user_1.isSuperAdmin)(req.auth.userId)) {
|
|
221
|
-
next();
|
|
222
|
-
return;
|
|
179
|
+
/** Express gate over a capability predicate. Must be placed AFTER requireAuth. */
|
|
180
|
+
function requireCapability(check, denial) {
|
|
181
|
+
return async (req, res, next) => {
|
|
182
|
+
try {
|
|
183
|
+
if (!req.auth?.userId) {
|
|
184
|
+
res.status(403).json({ error: 'Forbidden' });
|
|
185
|
+
return;
|
|
186
|
+
}
|
|
187
|
+
if (await check(req.auth)) {
|
|
188
|
+
next();
|
|
189
|
+
return;
|
|
190
|
+
}
|
|
191
|
+
res.status(403).json({ error: denial });
|
|
223
192
|
}
|
|
224
|
-
|
|
225
|
-
}
|
|
226
|
-
catch {
|
|
227
|
-
res.status(403).json({ error: 'Forbidden' });
|
|
228
|
-
}
|
|
229
|
-
};
|
|
230
|
-
exports.requireAdmin = requireAdmin;
|
|
231
|
-
/**
|
|
232
|
-
* Middleware that requires builder access. Must be placed AFTER requireAuth.
|
|
233
|
-
*
|
|
234
|
-
* Builders are superadmin or users with the 'engineer' role.
|
|
235
|
-
* This is the backend equivalent of the dashboard's `isBuilder` check.
|
|
236
|
-
*/
|
|
237
|
-
const requireBuilder = async (req, res, next) => {
|
|
238
|
-
try {
|
|
239
|
-
if (!req.auth?.userId) {
|
|
193
|
+
catch {
|
|
240
194
|
res.status(403).json({ error: 'Forbidden' });
|
|
241
|
-
return;
|
|
242
195
|
}
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
// Check database for engineer role (builder)
|
|
254
|
-
const { hasRole } = await Promise.resolve().then(() => __importStar(require('../services/user/roles')));
|
|
255
|
-
if (await hasRole(req.auth.userId, 'engineer')) {
|
|
256
|
-
next();
|
|
257
|
-
return;
|
|
258
|
-
}
|
|
259
|
-
res.status(403).json({ error: 'Forbidden: builder access required' });
|
|
260
|
-
}
|
|
261
|
-
catch {
|
|
262
|
-
res.status(403).json({ error: 'Forbidden' });
|
|
263
|
-
}
|
|
264
|
-
};
|
|
265
|
-
exports.requireBuilder = requireBuilder;
|
|
266
|
-
/**
|
|
267
|
-
* Middleware that requires role-management access. Must be placed AFTER requireAuth.
|
|
268
|
-
*
|
|
269
|
-
* Grants access to superadmins, admin-type users, and engineers — the backend
|
|
270
|
-
* equivalent of the dashboard's `isBuilder || isOps`. Ops (admin type) manage
|
|
271
|
-
* users and roles; builders (superadmin, engineer) are a superset. This is the
|
|
272
|
-
* gate for reading and writing role definitions.
|
|
273
|
-
*/
|
|
274
|
-
const requireRoleManager = async (req, res, next) => {
|
|
196
|
+
};
|
|
197
|
+
}
|
|
198
|
+
/** Admin access: admin or superadmin claim, or a superadmin in the database. */
|
|
199
|
+
exports.requireAdmin = requireCapability(capabilities_1.mayAdminister, 'Forbidden: admin access required');
|
|
200
|
+
/** Builder access: superadmin or the 'engineer' role. Backend twin of the dashboard's `isBuilder`. */
|
|
201
|
+
exports.requireBuilder = requireCapability(capabilities_1.mayBuild, 'Forbidden: builder access required');
|
|
202
|
+
/** Role-management access: admin access or the 'engineer' role. Backend twin of `isBuilder || isOps`. */
|
|
203
|
+
exports.requireRoleManager = requireCapability(capabilities_1.mayManageRoles, 'Forbidden: role-management access required');
|
|
204
|
+
/** Reads of one workflow run (`:workflowId`): builder access, or the person who started it or it runs as. */
|
|
205
|
+
const requireWorkflowReader = async (req, res, next) => {
|
|
275
206
|
try {
|
|
276
|
-
if (
|
|
277
|
-
res.status(403).json({ error: 'Forbidden' });
|
|
278
|
-
return;
|
|
279
|
-
}
|
|
280
|
-
// Fast path: trust the JWT role claim for admin/superadmin
|
|
281
|
-
if (req.auth.role === 'admin' || req.auth.role === 'superadmin') {
|
|
282
|
-
next();
|
|
283
|
-
return;
|
|
284
|
-
}
|
|
285
|
-
// Slow path: check database for superadmin role type
|
|
286
|
-
if (await (0, user_1.isSuperAdmin)(req.auth.userId)) {
|
|
287
|
-
next();
|
|
288
|
-
return;
|
|
289
|
-
}
|
|
290
|
-
// Check database for engineer role (builder)
|
|
291
|
-
const { hasRole } = await Promise.resolve().then(() => __importStar(require('../services/user/roles')));
|
|
292
|
-
if (await hasRole(req.auth.userId, 'engineer')) {
|
|
207
|
+
if (req.auth?.userId && await (0, capabilities_1.mayReadWorkflowRun)(req.auth, String(req.params.workflowId))) {
|
|
293
208
|
next();
|
|
294
209
|
return;
|
|
295
210
|
}
|
|
296
|
-
res.status(403).json({ error: 'Forbidden:
|
|
211
|
+
res.status(403).json({ error: 'Forbidden: workflow read access required' });
|
|
297
212
|
}
|
|
298
|
-
catch {
|
|
299
|
-
|
|
213
|
+
catch (err) {
|
|
214
|
+
// A failed lookup is not an access decision: report it, and serve nothing.
|
|
215
|
+
logger_1.loggerRegistry.error(`[long-tail] workflow read check failed: ${err?.message}`);
|
|
216
|
+
res.status(500).json({ error: 'Workflow read check failed' });
|
|
300
217
|
}
|
|
301
218
|
};
|
|
302
|
-
exports.
|
|
219
|
+
exports.requireWorkflowReader = requireWorkflowReader;
|
|
303
220
|
/**
|
|
304
221
|
* Generate a JWT token. Utility for tests and token provisioning.
|
|
305
222
|
*/
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import type { AuthPayload, CapabilityAccess, CapabilitySet, LTGrantRole } from '../types';
|
|
2
|
+
/**
|
|
3
|
+
* Capability predicates shared by every entry point that faces people.
|
|
4
|
+
*
|
|
5
|
+
* Each predicate trusts the principal's `role` claim first and only then
|
|
6
|
+
* consults the database. Lookup errors propagate so callers can deny.
|
|
7
|
+
*/
|
|
8
|
+
export type CapabilityPrincipal = Pick<AuthPayload, 'userId' | 'role'> & {
|
|
9
|
+
/** Present for OAuth callers: the memberships the access token carries. */
|
|
10
|
+
grantRoles?: LTGrantRole[];
|
|
11
|
+
};
|
|
12
|
+
export interface RoleGrant {
|
|
13
|
+
role: string;
|
|
14
|
+
type?: string;
|
|
15
|
+
}
|
|
16
|
+
export type GrantDecision = {
|
|
17
|
+
allowed: true;
|
|
18
|
+
} | {
|
|
19
|
+
allowed: false;
|
|
20
|
+
error: string;
|
|
21
|
+
};
|
|
22
|
+
/** Admin or superadmin claim, or a superadmin in the database. */
|
|
23
|
+
export declare function mayAdminister(principal: CapabilityPrincipal | undefined): Promise<boolean>;
|
|
24
|
+
/** Superadmin (claim or database), or holder of the engineer role. */
|
|
25
|
+
export declare function mayBuild(principal: CapabilityPrincipal | undefined): Promise<boolean>;
|
|
26
|
+
/**
|
|
27
|
+
* Builder access, or the person a workflow run was started by or runs as,
|
|
28
|
+
* read from the run's own start envelope.
|
|
29
|
+
*/
|
|
30
|
+
export declare function mayReadWorkflowRun(principal: CapabilityPrincipal | undefined, workflowId: string): Promise<boolean>;
|
|
31
|
+
/** Anyone who may administer, plus holders of the engineer role. */
|
|
32
|
+
export declare function mayManageRoles(principal: CapabilityPrincipal | undefined): Promise<boolean>;
|
|
33
|
+
/**
|
|
34
|
+
* Whether `granterId` may assign `grant` to a user.
|
|
35
|
+
*
|
|
36
|
+
* - superadmin: any role and type
|
|
37
|
+
* - engineer: any role, never the superadmin type
|
|
38
|
+
* - anyone else: only roles they hold, never the superadmin type
|
|
39
|
+
*/
|
|
40
|
+
export declare function mayGrantRole(granterId: string, grant: RoleGrant): Promise<GrantDecision>;
|
|
41
|
+
/** Whether `granterId` may assign every grant in a new account's role list. */
|
|
42
|
+
export declare function mayGrantRoles(granterId: string, grants: RoleGrant[] | undefined): Promise<GrantDecision>;
|
|
43
|
+
/**
|
|
44
|
+
* Whether `callerId` may change, remove, or mint keys for an account. An
|
|
45
|
+
* account holding superadmin is a superadmin's to manage; any other account
|
|
46
|
+
* is left to the route's own gate.
|
|
47
|
+
*/
|
|
48
|
+
export declare function mayManageAccount(callerId: string, targetId: string): Promise<GrantDecision>;
|
|
49
|
+
/** Removing a role follows the grant rule for the role as the account holds it. */
|
|
50
|
+
export declare function mayRevokeRole(callerId: string, targetId: string, role: string): Promise<GrantDecision>;
|
|
51
|
+
/**
|
|
52
|
+
* Every capability the principal holds, with the same outcomes as the
|
|
53
|
+
* predicates above. A superadmin claim costs no lookup; anyone else costs
|
|
54
|
+
* at most one superadmin lookup and one engineer-role lookup.
|
|
55
|
+
*/
|
|
56
|
+
export declare function resolveCapabilities(principal: CapabilityPrincipal | undefined): Promise<CapabilitySet>;
|
|
57
|
+
/**
|
|
58
|
+
* Capability checks for one request. `caller` needs only an authenticated
|
|
59
|
+
* principal; any other gate resolves the principal's capabilities once, on
|
|
60
|
+
* first need, so a request that checks only `caller` gates makes no lookup.
|
|
61
|
+
*/
|
|
62
|
+
export declare function capabilityAccess(principal: CapabilityPrincipal | undefined): CapabilityAccess;
|