@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,151 @@
|
|
|
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
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.isClientId = exports.REFRESH_REUSE_GRACE_SECONDS = void 0;
|
|
37
|
+
exports.createSecret = createSecret;
|
|
38
|
+
exports.hashSecret = hashSecret;
|
|
39
|
+
exports.pkceChallenge = pkceChallenge;
|
|
40
|
+
exports.registerClient = registerClient;
|
|
41
|
+
exports.getClient = getClient;
|
|
42
|
+
exports.issueAuthorizationCode = issueAuthorizationCode;
|
|
43
|
+
exports.exchangeAuthorizationCode = exchangeAuthorizationCode;
|
|
44
|
+
exports.rotateRefreshToken = rotateRefreshToken;
|
|
45
|
+
exports.getLiveGrant = getLiveGrant;
|
|
46
|
+
exports.revokeByRefreshToken = revokeByRefreshToken;
|
|
47
|
+
exports.revokeGrant = revokeGrant;
|
|
48
|
+
exports.listGrants = listGrants;
|
|
49
|
+
const crypto = __importStar(require("crypto"));
|
|
50
|
+
const db_1 = require("../../../lib/db");
|
|
51
|
+
const uuid_1 = require("../../../lib/uuid");
|
|
52
|
+
const sql_1 = require("./sql");
|
|
53
|
+
/** A refresh token reused within this many seconds is treated as a client retry. */
|
|
54
|
+
exports.REFRESH_REUSE_GRACE_SECONDS = 10;
|
|
55
|
+
/** A new random secret: 32 bytes, base64url. */
|
|
56
|
+
function createSecret() {
|
|
57
|
+
return crypto.randomBytes(32).toString('base64url');
|
|
58
|
+
}
|
|
59
|
+
/** SHA-256 of a secret. Codes and refresh tokens are stored only as hashes. */
|
|
60
|
+
function hashSecret(secret) {
|
|
61
|
+
return crypto.createHash('sha256').update(secret).digest('hex');
|
|
62
|
+
}
|
|
63
|
+
/** The PKCE S256 challenge for a code verifier (RFC 7636). */
|
|
64
|
+
function pkceChallenge(verifier) {
|
|
65
|
+
return crypto.createHash('sha256').update(verifier).digest('base64url');
|
|
66
|
+
}
|
|
67
|
+
async function registerClient(input) {
|
|
68
|
+
const { rows } = await (0, db_1.getPool)().query(sql_1.INSERT_CLIENT, [
|
|
69
|
+
`ltc_${createSecret()}`, input.clientName ?? null, input.redirectUris,
|
|
70
|
+
]);
|
|
71
|
+
return rows[0];
|
|
72
|
+
}
|
|
73
|
+
/** A client id as registerClient issues it; anything else names no client and never reaches SQL. */
|
|
74
|
+
const CLIENT_ID = /^ltc_[A-Za-z0-9_-]{43}$/;
|
|
75
|
+
const isClientId = (value) => CLIENT_ID.test(value);
|
|
76
|
+
exports.isClientId = isClientId;
|
|
77
|
+
async function getClient(clientId) {
|
|
78
|
+
if (!(0, exports.isClientId)(clientId))
|
|
79
|
+
return null;
|
|
80
|
+
const { rows } = await (0, db_1.getPool)().query(sql_1.GET_CLIENT, [clientId]);
|
|
81
|
+
return rows[0] ?? null;
|
|
82
|
+
}
|
|
83
|
+
/** Record the person's consent as a grant and return a one-time code for it. */
|
|
84
|
+
async function issueAuthorizationCode(input) {
|
|
85
|
+
if (!(0, uuid_1.isUuid)(input.userId))
|
|
86
|
+
throw new Error('issueAuthorizationCode: userId must be a UUID');
|
|
87
|
+
const code = createSecret();
|
|
88
|
+
const { rows } = await (0, db_1.getPool)().query(sql_1.ISSUE_CODE, [
|
|
89
|
+
input.userId, input.clientId, input.policy, input.scope,
|
|
90
|
+
hashSecret(code), input.redirectUri, input.codeChallenge, input.resource ?? null, input.ttlSeconds,
|
|
91
|
+
]);
|
|
92
|
+
return { code, grantId: rows[0].grant_id };
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Exchange a code for the grant and its first refresh token. Null when the
|
|
96
|
+
* code is unknown, used, expired, for another client or redirect URI, fails
|
|
97
|
+
* PKCE, or its grant or owner is no longer active.
|
|
98
|
+
*/
|
|
99
|
+
async function exchangeAuthorizationCode(input) {
|
|
100
|
+
const refreshToken = createSecret();
|
|
101
|
+
const { rows } = await (0, db_1.getPool)().query(sql_1.EXCHANGE_CODE, [
|
|
102
|
+
hashSecret(input.code), input.clientId, input.redirectUri, pkceChallenge(input.codeVerifier),
|
|
103
|
+
hashSecret(refreshToken), input.refreshTtlSeconds,
|
|
104
|
+
]);
|
|
105
|
+
if (!rows[0])
|
|
106
|
+
return null;
|
|
107
|
+
const { resource, ...snapshot } = rows[0];
|
|
108
|
+
return { snapshot, resource, refreshToken };
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Rotate a refresh token for the client that holds it. Null when it is
|
|
112
|
+
* unknown, used, expired, another client's, or its grant or owner is no
|
|
113
|
+
* longer active. A used token presented again outside the
|
|
114
|
+
* grace window revokes its grant, and `revoked` reports it.
|
|
115
|
+
*/
|
|
116
|
+
async function rotateRefreshToken(input) {
|
|
117
|
+
const pool = (0, db_1.getPool)();
|
|
118
|
+
const next = createSecret();
|
|
119
|
+
const oldHash = hashSecret(input.refreshToken);
|
|
120
|
+
const { rows } = await pool.query(sql_1.ROTATE_REFRESH_TOKEN, [oldHash, hashSecret(next), input.refreshTtlSeconds, input.clientId]);
|
|
121
|
+
if (rows[0])
|
|
122
|
+
return { snapshot: rows[0], refreshToken: next };
|
|
123
|
+
const reuse = await pool.query(sql_1.REVOKE_ON_REFRESH_REUSE, [oldHash, exports.REFRESH_REUSE_GRACE_SECONDS]);
|
|
124
|
+
return { snapshot: null, revoked: reuse.rows[0] ?? null };
|
|
125
|
+
}
|
|
126
|
+
/** The live grant an access token names; null when it is revoked, its owner inactive, or it is another user's. */
|
|
127
|
+
async function getLiveGrant(grantId, userId) {
|
|
128
|
+
if (!(0, uuid_1.isUuid)(grantId) || !(0, uuid_1.isUuid)(userId))
|
|
129
|
+
return null;
|
|
130
|
+
const { rows } = await (0, db_1.getPool)().query(sql_1.GET_LIVE_GRANT, [grantId, userId]);
|
|
131
|
+
return rows[0] ?? null;
|
|
132
|
+
}
|
|
133
|
+
/** Revoke the grant behind a refresh token presented by its own client (RFC 7009). */
|
|
134
|
+
async function revokeByRefreshToken(refreshToken, clientId) {
|
|
135
|
+
const { rows } = await (0, db_1.getPool)().query(sql_1.REVOKE_BY_REFRESH_TOKEN, [hashSecret(refreshToken), clientId]);
|
|
136
|
+
return rows[0] ?? null;
|
|
137
|
+
}
|
|
138
|
+
/** Revoke a grant; with `userId`, only when it belongs to that user. */
|
|
139
|
+
async function revokeGrant(grantId, userId) {
|
|
140
|
+
if (!(0, uuid_1.isUuid)(grantId) || (userId !== undefined && !(0, uuid_1.isUuid)(userId)))
|
|
141
|
+
return null;
|
|
142
|
+
const { rows } = await (0, db_1.getPool)().query(sql_1.REVOKE_GRANT, [grantId, userId ?? null]);
|
|
143
|
+
return rows[0] ?? null;
|
|
144
|
+
}
|
|
145
|
+
/** The person's live grants that a client has put to use. */
|
|
146
|
+
async function listGrants(userId) {
|
|
147
|
+
if (!(0, uuid_1.isUuid)(userId))
|
|
148
|
+
return [];
|
|
149
|
+
const { rows } = await (0, db_1.getPool)().query(sql_1.LIST_GRANTS, [userId]);
|
|
150
|
+
return rows;
|
|
151
|
+
}
|
|
@@ -3,6 +3,7 @@ export declare const GET_BOT_KEYS_BY_USER = "\n SELECT id, name, user_id, key_h
|
|
|
3
3
|
export declare const GET_ALL_ACTIVE_BOT_KEYS = "\n SELECT id, name, user_id, key_hash, scopes\n FROM lt_bot_api_keys\n WHERE (expires_at IS NULL OR expires_at > NOW())";
|
|
4
4
|
export declare const UPDATE_BOT_KEY_LAST_USED = "\n UPDATE lt_bot_api_keys SET last_used_at = NOW() WHERE id = $1";
|
|
5
5
|
export declare const DELETE_BOT_KEY = "\n DELETE FROM lt_bot_api_keys WHERE id = $1";
|
|
6
|
+
export declare const GET_BOT_KEY_OWNER = "\n SELECT user_id FROM lt_bot_api_keys WHERE id = $1";
|
|
6
7
|
export declare const LIST_BOT_KEYS_BY_USER = "\n SELECT id, name, user_id, scopes, expires_at, last_used_at, created_at, updated_at\n FROM lt_bot_api_keys WHERE user_id = $1 ORDER BY created_at";
|
|
7
8
|
export declare const INSERT_SERVICE_TOKEN = "\n INSERT INTO lt_service_tokens (name, token_hash, server_id, scopes, expires_at)\n VALUES ($1, $2, $3, $4, $5) RETURNING id";
|
|
8
9
|
export declare const GET_ALL_ACTIVE_SERVICE_TOKENS = "\n SELECT id, name, token_hash FROM lt_service_tokens\n WHERE (expires_at IS NULL OR expires_at > NOW())";
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
// ── Bot API key queries ─────────────────────────────────────────────────────
|
|
3
3
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
-
exports.LIST_SERVICE_TOKENS_BY_SERVER = exports.DELETE_SERVICE_TOKEN = exports.UPDATE_SERVICE_TOKEN_LAST_USED = exports.GET_ALL_ACTIVE_SERVICE_TOKENS = exports.INSERT_SERVICE_TOKEN = exports.LIST_BOT_KEYS_BY_USER = exports.DELETE_BOT_KEY = exports.UPDATE_BOT_KEY_LAST_USED = exports.GET_ALL_ACTIVE_BOT_KEYS = exports.GET_BOT_KEYS_BY_USER = exports.INSERT_BOT_KEY = void 0;
|
|
4
|
+
exports.LIST_SERVICE_TOKENS_BY_SERVER = exports.DELETE_SERVICE_TOKEN = exports.UPDATE_SERVICE_TOKEN_LAST_USED = exports.GET_ALL_ACTIVE_SERVICE_TOKENS = exports.INSERT_SERVICE_TOKEN = exports.LIST_BOT_KEYS_BY_USER = exports.GET_BOT_KEY_OWNER = exports.DELETE_BOT_KEY = exports.UPDATE_BOT_KEY_LAST_USED = exports.GET_ALL_ACTIVE_BOT_KEYS = exports.GET_BOT_KEYS_BY_USER = exports.INSERT_BOT_KEY = void 0;
|
|
5
5
|
exports.INSERT_BOT_KEY = `
|
|
6
6
|
INSERT INTO lt_bot_api_keys (name, user_id, key_hash, scopes, expires_at)
|
|
7
7
|
VALUES ($1, $2, $3, $4, $5) RETURNING id`;
|
|
@@ -18,6 +18,8 @@ exports.UPDATE_BOT_KEY_LAST_USED = `
|
|
|
18
18
|
UPDATE lt_bot_api_keys SET last_used_at = NOW() WHERE id = $1`;
|
|
19
19
|
exports.DELETE_BOT_KEY = `
|
|
20
20
|
DELETE FROM lt_bot_api_keys WHERE id = $1`;
|
|
21
|
+
exports.GET_BOT_KEY_OWNER = `
|
|
22
|
+
SELECT user_id FROM lt_bot_api_keys WHERE id = $1`;
|
|
21
23
|
exports.LIST_BOT_KEYS_BY_USER = `
|
|
22
24
|
SELECT id, name, user_id, scopes, expires_at, last_used_at, created_at, updated_at
|
|
23
25
|
FROM lt_bot_api_keys WHERE user_id = $1 ORDER BY created_at`;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { LTEscalationRecord } from '../../types';
|
|
2
|
+
import { type ScopedFacetSearch } from './queries';
|
|
3
|
+
/** One page group: the shared facet value (null for a row without it) and its rows. */
|
|
4
|
+
export interface EscalationGroup {
|
|
5
|
+
key: string | null;
|
|
6
|
+
ids: string[];
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Scoped faceted search paged by groups of a metadata facet. A page holds
|
|
10
|
+
* whole groups, so a group never splits across pages; a row without the
|
|
11
|
+
* facet is a group of one. `total` counts groups.
|
|
12
|
+
*/
|
|
13
|
+
export declare function searchEscalationsGrouped(opts: ScopedFacetSearch & {
|
|
14
|
+
groupKey: string;
|
|
15
|
+
}): Promise<{
|
|
16
|
+
escalations: LTEscalationRecord[];
|
|
17
|
+
total: number;
|
|
18
|
+
groups: EscalationGroup[];
|
|
19
|
+
}>;
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.searchEscalationsGrouped = searchEscalationsGrouped;
|
|
4
|
+
const db_1 = require("../../lib/db");
|
|
5
|
+
const client_1 = require("./client");
|
|
6
|
+
const facet_sql_1 = require("./facet-sql");
|
|
7
|
+
const map_1 = require("./map");
|
|
8
|
+
const queries_1 = require("./queries");
|
|
9
|
+
const SINGLETON_PREFIX = 'id:';
|
|
10
|
+
/**
|
|
11
|
+
* Scoped faceted search paged by groups of a metadata facet. A page holds
|
|
12
|
+
* whole groups, so a group never splits across pages; a row without the
|
|
13
|
+
* facet is a group of one. `total` counts groups.
|
|
14
|
+
*/
|
|
15
|
+
async function searchEscalationsGrouped(opts) {
|
|
16
|
+
if (!facet_sql_1.FACET_KEY.test(opts.groupKey))
|
|
17
|
+
throw new Error(`groupBy must be a metadata key, got "${opts.groupKey}"`);
|
|
18
|
+
await (0, client_1.ensureEscalationCompatView)();
|
|
19
|
+
const pool = (0, db_1.getPool)();
|
|
20
|
+
const groupExpr = `COALESCE(metadata->>'${opts.groupKey}', '${SINGLETON_PREFIX}' || id::text)`;
|
|
21
|
+
const params = [];
|
|
22
|
+
const where = (0, queries_1.buildScopedSearchWhere)(opts, params);
|
|
23
|
+
const countParams = [...params];
|
|
24
|
+
const li = params.push(opts.limit);
|
|
25
|
+
const oi = params.push(opts.offset);
|
|
26
|
+
const [page, count] = await Promise.all([
|
|
27
|
+
pool.query(`SELECT ${groupExpr} AS g, bool_or(metadata->>'${opts.groupKey}' IS NOT NULL) AS keyed
|
|
28
|
+
FROM public.lt_escalations ${where}
|
|
29
|
+
GROUP BY 1 ORDER BY ${(0, facet_sql_1.buildGroupOrder)(opts.facet.orderBy)}, 1
|
|
30
|
+
LIMIT $${li} OFFSET $${oi}`, params),
|
|
31
|
+
pool.query(`SELECT count(DISTINCT ${groupExpr})::int AS total FROM public.lt_escalations ${where}`, countParams),
|
|
32
|
+
]);
|
|
33
|
+
const keys = page.rows.map((r) => r.g);
|
|
34
|
+
const keyed = new Set(page.rows.filter((r) => r.keyed).map((r) => r.g));
|
|
35
|
+
const total = count.rows[0]?.total ?? 0;
|
|
36
|
+
if (!keys.length)
|
|
37
|
+
return { escalations: [], total, groups: [] };
|
|
38
|
+
const memberParams = [];
|
|
39
|
+
const memberWhere = (0, queries_1.buildScopedSearchWhere)(opts, memberParams);
|
|
40
|
+
const ki = memberParams.push(keys);
|
|
41
|
+
const keyClause = `${groupExpr} = ANY($${ki}::text[])`;
|
|
42
|
+
const members = await pool.query(`SELECT *, ${groupExpr} AS lt_group FROM public.lt_escalations
|
|
43
|
+
${memberWhere ? `${memberWhere} AND ${keyClause}` : `WHERE ${keyClause}`}
|
|
44
|
+
ORDER BY ${(0, facet_sql_1.buildFacetOrder)(opts.facet.orderBy)}`, memberParams);
|
|
45
|
+
const byKey = new Map(keys.map((k) => [k, []]));
|
|
46
|
+
for (const row of members.rows)
|
|
47
|
+
byKey.get(row.lt_group)?.push(row.id);
|
|
48
|
+
const groups = keys.map((k) => ({
|
|
49
|
+
key: keyed.has(k) ? k : null,
|
|
50
|
+
ids: byKey.get(k) ?? [],
|
|
51
|
+
}));
|
|
52
|
+
const escalations = (0, map_1.toEscalationRecords)(members.rows.map(({ lt_group: _g, ...rest }) => rest));
|
|
53
|
+
return { escalations, total, groups };
|
|
54
|
+
}
|
|
@@ -10,3 +10,7 @@ export { ensureEscalationCompatView } from './client';
|
|
|
10
10
|
export { ensureFacetReady, searchByFacets, searchGroups, countByFacets, claimGroups, claimByFacets, } from './facets';
|
|
11
11
|
export { aggregateByFacets, timelineByFacet, resolveEntitySystem, resetAnalyticsCaches, } from './aggregates';
|
|
12
12
|
export { AnalyticsInputError } from './aggregate-validate';
|
|
13
|
+
export { searchEscalationsGrouped } from './grouped-list';
|
|
14
|
+
export type { EscalationGroup } from './grouped-list';
|
|
15
|
+
export { aggregateRelatedItems, listRelatedItems, aggregateRelatedQuery, listRelatedQueryRows, readRelatedHosts, } from './related';
|
|
16
|
+
export type { RelatedQueryHost } from './related';
|
|
@@ -14,7 +14,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
14
14
|
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
15
|
};
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
-
exports.AnalyticsInputError = exports.resetAnalyticsCaches = exports.resolveEntitySystem = exports.timelineByFacet = exports.aggregateByFacets = exports.claimByFacets = exports.claimGroups = exports.countByFacets = exports.searchGroups = exports.searchByFacets = exports.ensureFacetReady = exports.ensureEscalationCompatView = exports.claimAssertedByMetadata = void 0;
|
|
17
|
+
exports.readRelatedHosts = exports.listRelatedQueryRows = exports.aggregateRelatedQuery = exports.listRelatedItems = exports.aggregateRelatedItems = exports.searchEscalationsGrouped = exports.AnalyticsInputError = exports.resetAnalyticsCaches = exports.resolveEntitySystem = exports.timelineByFacet = exports.aggregateByFacets = exports.claimByFacets = exports.claimGroups = exports.countByFacets = exports.searchGroups = exports.searchByFacets = exports.ensureFacetReady = exports.ensureEscalationCompatView = exports.claimAssertedByMetadata = void 0;
|
|
18
18
|
__exportStar(require("./types"), exports);
|
|
19
19
|
__exportStar(require("./crud"), exports);
|
|
20
20
|
var claim_asserted_1 = require("./claim-asserted");
|
|
@@ -40,3 +40,11 @@ Object.defineProperty(exports, "resolveEntitySystem", { enumerable: true, get: f
|
|
|
40
40
|
Object.defineProperty(exports, "resetAnalyticsCaches", { enumerable: true, get: function () { return aggregates_1.resetAnalyticsCaches; } });
|
|
41
41
|
var aggregate_validate_1 = require("./aggregate-validate");
|
|
42
42
|
Object.defineProperty(exports, "AnalyticsInputError", { enumerable: true, get: function () { return aggregate_validate_1.AnalyticsInputError; } });
|
|
43
|
+
var grouped_list_1 = require("./grouped-list");
|
|
44
|
+
Object.defineProperty(exports, "searchEscalationsGrouped", { enumerable: true, get: function () { return grouped_list_1.searchEscalationsGrouped; } });
|
|
45
|
+
var related_1 = require("./related");
|
|
46
|
+
Object.defineProperty(exports, "aggregateRelatedItems", { enumerable: true, get: function () { return related_1.aggregateRelatedItems; } });
|
|
47
|
+
Object.defineProperty(exports, "listRelatedItems", { enumerable: true, get: function () { return related_1.listRelatedItems; } });
|
|
48
|
+
Object.defineProperty(exports, "aggregateRelatedQuery", { enumerable: true, get: function () { return related_1.aggregateRelatedQuery; } });
|
|
49
|
+
Object.defineProperty(exports, "listRelatedQueryRows", { enumerable: true, get: function () { return related_1.listRelatedQueryRows; } });
|
|
50
|
+
Object.defineProperty(exports, "readRelatedHosts", { enumerable: true, get: function () { return related_1.readRelatedHosts; } });
|
|
@@ -1,18 +1,8 @@
|
|
|
1
1
|
import type { LTEscalationRecord, LTEscalationStatus } from '../../types';
|
|
2
2
|
import type { EscalationStats, StationMetric } from './types';
|
|
3
3
|
import type { FacetQuery } from '../../types';
|
|
4
|
-
/**
|
|
5
|
-
|
|
6
|
-
* predicate (global → none; else `role ∈ allRoles OR (role ∈ selfRoles AND
|
|
7
|
-
* assigned_to = me)`) with the full FacetQuery language (`buildFacetWhere`:
|
|
8
|
-
* facets `@>`, block, numeric range, exists, status, available) plus the extra
|
|
9
|
-
* top-level filters (type/subtype/priority/assigned_to) and an exact correlation-id
|
|
10
|
-
* match (id/workflow_id/origin_id), then orders
|
|
11
|
-
* by `buildFacetOrder` (columns + `metadata.<key>`). Every value is bound; the
|
|
12
|
-
* COUNT shares the WHERE so totals stay correct across pages — no client-side
|
|
13
|
-
* filtering. Reads go through the `public.lt_escalations` view.
|
|
14
|
-
*/
|
|
15
|
-
export declare function searchEscalationsFaceted(opts: {
|
|
4
|
+
/** The scoped faceted search input, shared by the row and grouped reads. */
|
|
5
|
+
export type ScopedFacetSearch = {
|
|
16
6
|
global?: boolean;
|
|
17
7
|
visibleRoles?: string[];
|
|
18
8
|
selfRoles?: string[];
|
|
@@ -25,7 +15,21 @@ export declare function searchEscalationsFaceted(opts: {
|
|
|
25
15
|
search?: string;
|
|
26
16
|
limit: number;
|
|
27
17
|
offset: number;
|
|
28
|
-
}
|
|
18
|
+
};
|
|
19
|
+
/** The WHERE clause of a scoped faceted search, pushing bound params. */
|
|
20
|
+
export declare function buildScopedSearchWhere(opts: Omit<ScopedFacetSearch, 'limit' | 'offset'>, params: unknown[]): string;
|
|
21
|
+
/**
|
|
22
|
+
* Scoped faceted search — the HUMAN operations query. Composes the read-scope
|
|
23
|
+
* predicate (global → none; else `role ∈ allRoles OR (role ∈ selfRoles AND
|
|
24
|
+
* assigned_to = me)`) with the full FacetQuery language (`buildFacetWhere`:
|
|
25
|
+
* facets `@>`, block, numeric range, exists, status, available) plus the extra
|
|
26
|
+
* top-level filters (type/subtype/priority/assigned_to) and an exact correlation-id
|
|
27
|
+
* match (id/workflow_id/origin_id), then orders
|
|
28
|
+
* by `buildFacetOrder` (columns + `metadata.<key>`). Every value is bound; the
|
|
29
|
+
* COUNT shares the WHERE so totals stay correct across pages — no client-side
|
|
30
|
+
* filtering. Reads go through the `public.lt_escalations` view.
|
|
31
|
+
*/
|
|
32
|
+
export declare function searchEscalationsFaceted(opts: ScopedFacetSearch): Promise<{
|
|
29
33
|
escalations: LTEscalationRecord[];
|
|
30
34
|
total: number;
|
|
31
35
|
}>;
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.buildScopedSearchWhere = buildScopedSearchWhere;
|
|
3
4
|
exports.searchEscalationsFaceted = searchEscalationsFaceted;
|
|
4
5
|
exports.getEscalationWithFormSchema = getEscalationWithFormSchema;
|
|
5
6
|
exports.listFacetKeys = listFacetKeys;
|
|
@@ -15,6 +16,7 @@ const db_1 = require("../../lib/db");
|
|
|
15
16
|
const client_1 = require("./client");
|
|
16
17
|
const map_1 = require("./map");
|
|
17
18
|
const facet_sql_1 = require("./facet-sql");
|
|
19
|
+
const read_scope_sql_1 = require("./read-scope-sql");
|
|
18
20
|
const types_1 = require("./types");
|
|
19
21
|
const sql_1 = require("./sql");
|
|
20
22
|
const metrics_cache_1 = require("./metrics-cache");
|
|
@@ -88,31 +90,13 @@ async function searchEscalations(params) {
|
|
|
88
90
|
total: countRows.rows[0]?.total ?? 0,
|
|
89
91
|
};
|
|
90
92
|
}
|
|
91
|
-
/**
|
|
92
|
-
|
|
93
|
-
* predicate (global → none; else `role ∈ allRoles OR (role ∈ selfRoles AND
|
|
94
|
-
* assigned_to = me)`) with the full FacetQuery language (`buildFacetWhere`:
|
|
95
|
-
* facets `@>`, block, numeric range, exists, status, available) plus the extra
|
|
96
|
-
* top-level filters (type/subtype/priority/assigned_to) and an exact correlation-id
|
|
97
|
-
* match (id/workflow_id/origin_id), then orders
|
|
98
|
-
* by `buildFacetOrder` (columns + `metadata.<key>`). Every value is bound; the
|
|
99
|
-
* COUNT shares the WHERE so totals stay correct across pages — no client-side
|
|
100
|
-
* filtering. Reads go through the `public.lt_escalations` view.
|
|
101
|
-
*/
|
|
102
|
-
async function searchEscalationsFaceted(opts) {
|
|
103
|
-
await (0, client_1.ensureEscalationCompatView)();
|
|
104
|
-
const pool = (0, db_1.getPool)();
|
|
105
|
-
const params = [];
|
|
93
|
+
/** The WHERE clause of a scoped faceted search, pushing bound params. */
|
|
94
|
+
function buildScopedSearchWhere(opts, params) {
|
|
106
95
|
const clauses = [];
|
|
107
96
|
// 1. Read-scope predicate (skip entirely for global access).
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
const mi = params.push(opts.meUserId || null);
|
|
112
|
-
clauses.push(`(($${ai}::text[] IS NULL AND $${si}::text[] IS NULL)
|
|
113
|
-
OR ($${ai}::text[] IS NOT NULL AND role = ANY($${ai}))
|
|
114
|
-
OR ($${si}::text[] IS NOT NULL AND role = ANY($${si}) AND assigned_to = $${mi}))`);
|
|
115
|
-
}
|
|
97
|
+
const scopeClause = (0, read_scope_sql_1.buildReadScopeClause)(opts, params);
|
|
98
|
+
if (scopeClause)
|
|
99
|
+
clauses.push(scopeClause);
|
|
116
100
|
// 2. Faceted predicate (role/roles/status/available/facets/block/range/exists).
|
|
117
101
|
const facetClause = (0, facet_sql_1.buildFacetWhere)(opts.facet, params);
|
|
118
102
|
if (facetClause !== 'TRUE')
|
|
@@ -135,7 +119,24 @@ async function searchEscalationsFaceted(opts) {
|
|
|
135
119
|
const u = params.push(asUuidOrNull(opts.search));
|
|
136
120
|
clauses.push(`(origin_id = $${i} OR workflow_id = $${i} OR ($${u}::uuid IS NOT NULL AND id = $${u}::uuid))`);
|
|
137
121
|
}
|
|
138
|
-
|
|
122
|
+
return clauses.length ? `WHERE ${clauses.join('\n AND ')}` : '';
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Scoped faceted search — the HUMAN operations query. Composes the read-scope
|
|
126
|
+
* predicate (global → none; else `role ∈ allRoles OR (role ∈ selfRoles AND
|
|
127
|
+
* assigned_to = me)`) with the full FacetQuery language (`buildFacetWhere`:
|
|
128
|
+
* facets `@>`, block, numeric range, exists, status, available) plus the extra
|
|
129
|
+
* top-level filters (type/subtype/priority/assigned_to) and an exact correlation-id
|
|
130
|
+
* match (id/workflow_id/origin_id), then orders
|
|
131
|
+
* by `buildFacetOrder` (columns + `metadata.<key>`). Every value is bound; the
|
|
132
|
+
* COUNT shares the WHERE so totals stay correct across pages — no client-side
|
|
133
|
+
* filtering. Reads go through the `public.lt_escalations` view.
|
|
134
|
+
*/
|
|
135
|
+
async function searchEscalationsFaceted(opts) {
|
|
136
|
+
await (0, client_1.ensureEscalationCompatView)();
|
|
137
|
+
const pool = (0, db_1.getPool)();
|
|
138
|
+
const params = [];
|
|
139
|
+
const where = buildScopedSearchWhere(opts, params);
|
|
139
140
|
const orderBy = (0, facet_sql_1.buildFacetOrder)(opts.facet.orderBy);
|
|
140
141
|
const countParams = [...params];
|
|
141
142
|
const li = params.push(opts.limit);
|
|
@@ -186,14 +187,9 @@ async function listFacetKeys(opts) {
|
|
|
186
187
|
const pool = (0, db_1.getPool)();
|
|
187
188
|
const params = [];
|
|
188
189
|
const clauses = ["jsonb_typeof(metadata) = 'object'"];
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
const mi = params.push(opts.meUserId || null);
|
|
193
|
-
clauses.push(`(($${ai}::text[] IS NULL AND $${si}::text[] IS NULL)
|
|
194
|
-
OR ($${ai}::text[] IS NOT NULL AND role = ANY($${ai}))
|
|
195
|
-
OR ($${si}::text[] IS NOT NULL AND role = ANY($${si}) AND assigned_to = $${mi}))`);
|
|
196
|
-
}
|
|
190
|
+
const scopeClause = (0, read_scope_sql_1.buildReadScopeClause)(opts, params);
|
|
191
|
+
if (scopeClause)
|
|
192
|
+
clauses.push(scopeClause);
|
|
197
193
|
const { rows } = await pool.query(`SELECT DISTINCT jsonb_object_keys(metadata) AS key
|
|
198
194
|
FROM public.lt_escalations
|
|
199
195
|
WHERE ${clauses.join('\n AND ')}
|
|
@@ -237,14 +233,9 @@ async function listFacetValues(key, opts) {
|
|
|
237
233
|
const pool = (0, db_1.getPool)();
|
|
238
234
|
const params = [key];
|
|
239
235
|
const clauses = ["jsonb_typeof(metadata) = 'object'", 'metadata ? $1'];
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
const mi = params.push(opts.meUserId || null);
|
|
244
|
-
clauses.push(`(($${ai}::text[] IS NULL AND $${si}::text[] IS NULL)
|
|
245
|
-
OR ($${ai}::text[] IS NOT NULL AND role = ANY($${ai}))
|
|
246
|
-
OR ($${si}::text[] IS NOT NULL AND role = ANY($${si}) AND assigned_to = $${mi}))`);
|
|
247
|
-
}
|
|
236
|
+
const scopeClause = (0, read_scope_sql_1.buildReadScopeClause)(opts, params);
|
|
237
|
+
if (scopeClause)
|
|
238
|
+
clauses.push(scopeClause);
|
|
248
239
|
const { rows } = await pool.query(`SELECT DISTINCT metadata->>$1 AS value
|
|
249
240
|
FROM public.lt_escalations
|
|
250
241
|
WHERE ${clauses.join('\n AND ')}
|
|
@@ -287,8 +278,13 @@ async function listDistinctTypes() {
|
|
|
287
278
|
* and an out-of-scope role yields an empty result, not someone else's rows.
|
|
288
279
|
*/
|
|
289
280
|
function narrowRoleWithinScope(role, visibleRoles) {
|
|
290
|
-
if (!
|
|
291
|
-
return { role, roles:
|
|
281
|
+
if (!visibleRoles)
|
|
282
|
+
return { role, roles: undefined, empty: false };
|
|
283
|
+
// An empty scope sees nothing; the SDK would read an empty list as no filter.
|
|
284
|
+
if (visibleRoles.length === 0)
|
|
285
|
+
return { empty: true };
|
|
286
|
+
if (!role)
|
|
287
|
+
return { roles: visibleRoles, empty: false };
|
|
292
288
|
if (!visibleRoles.includes(role))
|
|
293
289
|
return { empty: true };
|
|
294
290
|
return { role, roles: undefined, empty: false };
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/** The caller's read scope, as the scoped escalation queries consume it. */
|
|
2
|
+
export interface ReadScopeInput {
|
|
3
|
+
global?: boolean;
|
|
4
|
+
visibleRoles?: string[];
|
|
5
|
+
selfRoles?: string[];
|
|
6
|
+
meUserId?: string;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* The read-scope predicate: `role ∈ visibleRoles OR (role ∈ selfRoles AND
|
|
10
|
+
* assigned_to = me)`. Null for global access. `alias` qualifies the columns
|
|
11
|
+
* when the query joins several escalation rows.
|
|
12
|
+
*/
|
|
13
|
+
export declare function buildReadScopeClause(scope: ReadScopeInput, params: unknown[], alias?: string): string | null;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.buildReadScopeClause = buildReadScopeClause;
|
|
4
|
+
/**
|
|
5
|
+
* The read-scope predicate: `role ∈ visibleRoles OR (role ∈ selfRoles AND
|
|
6
|
+
* assigned_to = me)`. Null for global access. `alias` qualifies the columns
|
|
7
|
+
* when the query joins several escalation rows.
|
|
8
|
+
*/
|
|
9
|
+
function buildReadScopeClause(scope, params, alias) {
|
|
10
|
+
if (scope.global)
|
|
11
|
+
return null;
|
|
12
|
+
const col = (name) => (alias ? `${alias}.${name}` : name);
|
|
13
|
+
const ai = params.push(scope.visibleRoles?.length ? scope.visibleRoles : null);
|
|
14
|
+
const si = params.push(scope.selfRoles?.length ? scope.selfRoles : null);
|
|
15
|
+
const mi = params.push(scope.meUserId || null);
|
|
16
|
+
return `(($${ai}::text[] IS NULL AND $${si}::text[] IS NULL)
|
|
17
|
+
OR ($${ai}::text[] IS NOT NULL AND ${col('role')} = ANY($${ai}))
|
|
18
|
+
OR ($${si}::text[] IS NOT NULL AND ${col('role')} = ANY($${si}) AND ${col('assigned_to')} = $${mi}))`;
|
|
19
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { type RelatedHostAggregate, type RelatedRow } from '../../shared/list-schema';
|
|
2
|
+
import { type ReadScopeInput } from './read-scope-sql';
|
|
3
|
+
/** One host's resolved facet match for a query set. */
|
|
4
|
+
export interface RelatedQueryHost {
|
|
5
|
+
hostId: string;
|
|
6
|
+
match: Record<string, unknown>;
|
|
7
|
+
}
|
|
8
|
+
export interface RelatedQueryInput {
|
|
9
|
+
hosts: RelatedQueryHost[];
|
|
10
|
+
roles: string[];
|
|
11
|
+
status: string;
|
|
12
|
+
scope: ReadScopeInput;
|
|
13
|
+
}
|
|
14
|
+
type Aggregates = Record<string, RelatedHostAggregate>;
|
|
15
|
+
/**
|
|
16
|
+
* Count each host's items, optionally split by `payload.<path>` or
|
|
17
|
+
* `reciprocal.metadata.<key>`. A reciprocal split counts only reciprocal rows
|
|
18
|
+
* the caller can read; the rest are reported as `hidden`. `roles` names the
|
|
19
|
+
* roles of the readable reciprocal rows, so a list can follow their changes.
|
|
20
|
+
*/
|
|
21
|
+
export declare function aggregateRelatedItems(opts: {
|
|
22
|
+
hostIds: string[];
|
|
23
|
+
scope: ReadScopeInput;
|
|
24
|
+
splitBy?: string;
|
|
25
|
+
}): Promise<{
|
|
26
|
+
aggregates: Aggregates;
|
|
27
|
+
roles: string[];
|
|
28
|
+
}>;
|
|
29
|
+
/** One host's items in fill order, each with its reciprocal row when readable. */
|
|
30
|
+
export declare function listRelatedItems(opts: {
|
|
31
|
+
hostId: string;
|
|
32
|
+
scope: ReadScopeInput;
|
|
33
|
+
limit: number;
|
|
34
|
+
}): Promise<{
|
|
35
|
+
rows: RelatedRow[];
|
|
36
|
+
total: number;
|
|
37
|
+
}>;
|
|
38
|
+
/**
|
|
39
|
+
* Count the rows that share each host's facets, grouped by role and an
|
|
40
|
+
* optional `metadata.<key>` split. The GIN index serves each host's match.
|
|
41
|
+
*/
|
|
42
|
+
export declare function aggregateRelatedQuery(input: RelatedQueryInput & {
|
|
43
|
+
splitBy?: string;
|
|
44
|
+
}): Promise<Aggregates>;
|
|
45
|
+
/** One host's related rows, in role order then age. */
|
|
46
|
+
export declare function listRelatedQueryRows(input: RelatedQueryInput & {
|
|
47
|
+
limit: number;
|
|
48
|
+
}): Promise<{
|
|
49
|
+
rows: RelatedRow[];
|
|
50
|
+
total: number;
|
|
51
|
+
}>;
|
|
52
|
+
/** Host rows of one role, read under the caller's scope. */
|
|
53
|
+
export declare function readRelatedHosts(opts: {
|
|
54
|
+
ids: string[];
|
|
55
|
+
role: string;
|
|
56
|
+
scope: ReadScopeInput;
|
|
57
|
+
}): Promise<Record<string, unknown>[]>;
|
|
58
|
+
export {};
|