@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
|
@@ -5,6 +5,7 @@ exports.readScanSink = readScanSink;
|
|
|
5
5
|
exports.sameScanValue = sameScanValue;
|
|
6
6
|
exports.resolveScanExpected = resolveScanExpected;
|
|
7
7
|
exports.scanSinkError = scanSinkError;
|
|
8
|
+
exports.scanTargetCount = scanTargetCount;
|
|
8
9
|
exports.applyScanToField = applyScanToField;
|
|
9
10
|
exports.pickScanSink = pickScanSink;
|
|
10
11
|
exports.wantsScanSubmit = wantsScanSubmit;
|
|
@@ -27,7 +28,9 @@ exports.scanFieldsFilled = scanFieldsFilled;
|
|
|
27
28
|
* Root `x-lt-scan-submit: true` submits once every required scan field is
|
|
28
29
|
* filled and the form validates. A string field is replaced by a scan; an
|
|
29
30
|
* array field appends, and with `multiplicity: "count"` a value expected n
|
|
30
|
-
* times takes n scans.
|
|
31
|
+
* times takes n scans. `prompt` is the empty array field's instruction (the
|
|
32
|
+
* field description when absent); the field reads `n of N` against the same
|
|
33
|
+
* expected list that admits each scan, or `maxItems`.
|
|
31
34
|
*/
|
|
32
35
|
const ctx_path_1 = require("./ctx-path");
|
|
33
36
|
exports.X_LT_SCAN = 'x-lt-scan';
|
|
@@ -50,6 +53,7 @@ function readScanSink(fieldSchema) {
|
|
|
50
53
|
...(expect?.length ? { expect } : {}),
|
|
51
54
|
expectError: typeof cfg['expect-error'] === 'string' ? cfg['expect-error'] : DEFAULT_EXPECT_ERROR,
|
|
52
55
|
multiplicity: cfg.multiplicity === 'count' ? 'count' : 'once',
|
|
56
|
+
...(typeof cfg.prompt === 'string' && cfg.prompt.trim() ? { prompt: cfg.prompt } : {}),
|
|
53
57
|
};
|
|
54
58
|
}
|
|
55
59
|
/** Manufacturer barcodes compare as GTINs, so a UPC-A matches its 14-digit form. */
|
|
@@ -102,6 +106,21 @@ function scanSinkError(value, fieldSchema, ctx) {
|
|
|
102
106
|
}
|
|
103
107
|
return undefined;
|
|
104
108
|
}
|
|
109
|
+
/**
|
|
110
|
+
* How many scans complete an array field: the scans its expected list admits
|
|
111
|
+
* (each listing under 'count', each distinct value otherwise), else
|
|
112
|
+
* `maxItems`, else null. The checklist and the admission gate share it.
|
|
113
|
+
*/
|
|
114
|
+
function scanTargetCount(fieldSchema, ctx) {
|
|
115
|
+
const sink = readScanSink(fieldSchema);
|
|
116
|
+
if (sink) {
|
|
117
|
+
const expected = resolveScanExpected(sink, ctx);
|
|
118
|
+
if (expected !== null)
|
|
119
|
+
return sink.multiplicity === 'count' ? expected.length : new Set(expected).size;
|
|
120
|
+
}
|
|
121
|
+
const max = fieldSchema?.maxItems;
|
|
122
|
+
return typeof max === 'number' ? max : null;
|
|
123
|
+
}
|
|
105
124
|
/** What a scan does to a field: the next value, or the error to show (nothing written). */
|
|
106
125
|
function applyScanToField(current, scan, fieldSchema, ctx) {
|
|
107
126
|
const sink = readScanSink(fieldSchema);
|
|
@@ -0,0 +1,27 @@
|
|
|
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 __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
exports.resolveRelatedFacets = exports.resolveTemplateValue = exports.rowTemplateContext = exports.splitPathError = exports.listSchemaRelationsError = exports.readListSchemaRelations = exports.METADATA_KEY = void 0;
|
|
18
|
+
__exportStar(require("./types"), exports);
|
|
19
|
+
var validate_1 = require("./validate");
|
|
20
|
+
Object.defineProperty(exports, "METADATA_KEY", { enumerable: true, get: function () { return validate_1.METADATA_KEY; } });
|
|
21
|
+
Object.defineProperty(exports, "readListSchemaRelations", { enumerable: true, get: function () { return validate_1.readListSchemaRelations; } });
|
|
22
|
+
Object.defineProperty(exports, "listSchemaRelationsError", { enumerable: true, get: function () { return validate_1.listSchemaRelationsError; } });
|
|
23
|
+
Object.defineProperty(exports, "splitPathError", { enumerable: true, get: function () { return validate_1.splitPathError; } });
|
|
24
|
+
var template_1 = require("./template");
|
|
25
|
+
Object.defineProperty(exports, "rowTemplateContext", { enumerable: true, get: function () { return template_1.rowTemplateContext; } });
|
|
26
|
+
Object.defineProperty(exports, "resolveTemplateValue", { enumerable: true, get: function () { return template_1.resolveTemplateValue; } });
|
|
27
|
+
Object.defineProperty(exports, "resolveRelatedFacets", { enumerable: true, get: function () { return template_1.resolveRelatedFacets; } });
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { type HelpTokenContext } from '../form-validation/x-lt-help';
|
|
2
|
+
/** The template domains of one escalation row, JSON-string columns parsed. */
|
|
3
|
+
export declare function rowTemplateContext(row: Record<string, unknown>): HelpTokenContext;
|
|
4
|
+
/**
|
|
5
|
+
* Resolve one facet value. A lone `{{token}}` keeps the value's own JSON type
|
|
6
|
+
* (a numeric facet matches a numeric facet); a mixed template interpolates to
|
|
7
|
+
* a string; a literal passes through. Undefined when a token is missing.
|
|
8
|
+
*/
|
|
9
|
+
export declare function resolveTemplateValue(value: unknown, ctx: HelpTokenContext): unknown;
|
|
10
|
+
/**
|
|
11
|
+
* Resolve a related query's match against a host row: every required facet
|
|
12
|
+
* (null when any is missing), plus each `narrow` facet the row resolves.
|
|
13
|
+
*/
|
|
14
|
+
export declare function resolveRelatedFacets(facets: Record<string, unknown>, ctx: HelpTokenContext, narrow?: Record<string, unknown>): Record<string, unknown> | null;
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.rowTemplateContext = rowTemplateContext;
|
|
4
|
+
exports.resolveTemplateValue = resolveTemplateValue;
|
|
5
|
+
exports.resolveRelatedFacets = resolveRelatedFacets;
|
|
6
|
+
const x_lt_bind_1 = require("../form-validation/x-lt-bind");
|
|
7
|
+
const x_lt_help_1 = require("../form-validation/x-lt-help");
|
|
8
|
+
const SINGLE_TOKEN = /^\{\{\s*([^{}]+?)\s*\}\}$/;
|
|
9
|
+
const ANY_TOKEN = /\{\{\s*[^{}]+?\s*\}\}/;
|
|
10
|
+
const MISSING_VALUE = '—';
|
|
11
|
+
function parseJsonObject(value) {
|
|
12
|
+
if (value && typeof value === 'object')
|
|
13
|
+
return value;
|
|
14
|
+
if (typeof value !== 'string' || !value)
|
|
15
|
+
return null;
|
|
16
|
+
try {
|
|
17
|
+
const parsed = JSON.parse(value);
|
|
18
|
+
return parsed && typeof parsed === 'object' ? parsed : null;
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
return null;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
/** The template domains of one escalation row, JSON-string columns parsed. */
|
|
25
|
+
function rowTemplateContext(row) {
|
|
26
|
+
return {
|
|
27
|
+
escalation: row,
|
|
28
|
+
metadata: row.metadata ?? {},
|
|
29
|
+
envelope: parseJsonObject(row.envelope) ?? {},
|
|
30
|
+
payload: parseJsonObject(row.escalation_payload) ?? {},
|
|
31
|
+
resolver: parseJsonObject(row.resolver_payload) ?? {},
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
function readToken(path, ctx) {
|
|
35
|
+
const dot = path.indexOf('.');
|
|
36
|
+
const domain = (dot === -1 ? path : path.slice(0, dot));
|
|
37
|
+
if (!x_lt_help_1.HELP_DOMAINS.includes(domain))
|
|
38
|
+
return undefined;
|
|
39
|
+
const root = ctx[domain];
|
|
40
|
+
if (dot === -1)
|
|
41
|
+
return root ?? undefined;
|
|
42
|
+
try {
|
|
43
|
+
return (0, x_lt_bind_1.getDeep)(root, path.slice(dot + 1));
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
return undefined;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Resolve one facet value. A lone `{{token}}` keeps the value's own JSON type
|
|
51
|
+
* (a numeric facet matches a numeric facet); a mixed template interpolates to
|
|
52
|
+
* a string; a literal passes through. Undefined when a token is missing.
|
|
53
|
+
*/
|
|
54
|
+
function resolveTemplateValue(value, ctx) {
|
|
55
|
+
if (typeof value !== 'string')
|
|
56
|
+
return value;
|
|
57
|
+
const single = value.match(SINGLE_TOKEN);
|
|
58
|
+
if (single) {
|
|
59
|
+
const raw = readToken(single[1], ctx);
|
|
60
|
+
return raw === null || raw === '' ? undefined : raw;
|
|
61
|
+
}
|
|
62
|
+
if (!ANY_TOKEN.test(value))
|
|
63
|
+
return value;
|
|
64
|
+
const text = (0, x_lt_help_1.interpolateHelp)(value, ctx);
|
|
65
|
+
return text.includes(MISSING_VALUE) ? undefined : text;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Resolve a related query's match against a host row: every required facet
|
|
69
|
+
* (null when any is missing), plus each `narrow` facet the row resolves.
|
|
70
|
+
*/
|
|
71
|
+
function resolveRelatedFacets(facets, ctx, narrow) {
|
|
72
|
+
const out = {};
|
|
73
|
+
for (const [key, value] of Object.entries(facets)) {
|
|
74
|
+
const resolved = resolveTemplateValue(value, ctx);
|
|
75
|
+
if (resolved === undefined)
|
|
76
|
+
return null;
|
|
77
|
+
out[key] = resolved;
|
|
78
|
+
}
|
|
79
|
+
for (const [key, value] of Object.entries(narrow ?? {})) {
|
|
80
|
+
const resolved = resolveTemplateValue(value, ctx);
|
|
81
|
+
if (resolved !== undefined)
|
|
82
|
+
out[key] = resolved;
|
|
83
|
+
}
|
|
84
|
+
return out;
|
|
85
|
+
}
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Related sets on a role's list schema. A set is named once under
|
|
3
|
+
* `x-lt-related`; columns (`related`) and row details (`x-lt-row-detail`)
|
|
4
|
+
* reference it by name. The server reads the declaration from the stored
|
|
5
|
+
* list schema, never from the caller.
|
|
6
|
+
*
|
|
7
|
+
* items the host row's accumulated or batch items, each read through its
|
|
8
|
+
* payload or its reciprocal row
|
|
9
|
+
* query rows in other roles that share facets with the host row; facet
|
|
10
|
+
* values are `{{domain.path}}` templates over the host row
|
|
11
|
+
*/
|
|
12
|
+
export declare const LIST_SCHEMA_KEYS: {
|
|
13
|
+
readonly RELATED: "x-lt-related";
|
|
14
|
+
readonly COLUMNS: "x-lt-columns";
|
|
15
|
+
readonly ROW_DETAIL: "x-lt-row-detail";
|
|
16
|
+
readonly GROUP_BY: "x-lt-group-by";
|
|
17
|
+
readonly LAYOUT: "x-lt-layout";
|
|
18
|
+
};
|
|
19
|
+
export declare const RELATED_SOURCES: {
|
|
20
|
+
readonly ITEMS: "items";
|
|
21
|
+
readonly QUERY: "query";
|
|
22
|
+
};
|
|
23
|
+
export type RelatedSource = (typeof RELATED_SOURCES)[keyof typeof RELATED_SOURCES];
|
|
24
|
+
export declare const RELATED_AGGREGATES: {
|
|
25
|
+
readonly COUNT: "count";
|
|
26
|
+
};
|
|
27
|
+
export type RelatedAggregate = (typeof RELATED_AGGREGATES)[keyof typeof RELATED_AGGREGATES];
|
|
28
|
+
/** How a grouped table folds a plain column across a group's rows. */
|
|
29
|
+
export declare const GROUP_FOLDS: {
|
|
30
|
+
readonly FIRST: "first";
|
|
31
|
+
readonly MIN: "min";
|
|
32
|
+
readonly MAX: "max";
|
|
33
|
+
readonly SUM: "sum";
|
|
34
|
+
readonly COUNT: "count";
|
|
35
|
+
/** The distinct values, in row order, joined: "standard, express". */
|
|
36
|
+
readonly DISTINCT: "distinct";
|
|
37
|
+
};
|
|
38
|
+
export type GroupFold = (typeof GROUP_FOLDS)[keyof typeof GROUP_FOLDS];
|
|
39
|
+
/** Split prefixes. `role` splits a query set by the related row's role. */
|
|
40
|
+
export declare const SPLIT_PATHS: {
|
|
41
|
+
readonly ROLE: "role";
|
|
42
|
+
readonly METADATA: "metadata.";
|
|
43
|
+
readonly PAYLOAD: "payload.";
|
|
44
|
+
readonly RECIPROCAL_METADATA: "reciprocal.metadata.";
|
|
45
|
+
};
|
|
46
|
+
export declare const RELATED_LIMITS: {
|
|
47
|
+
readonly MAX_SETS: 4;
|
|
48
|
+
readonly MAX_QUERY_ROLES: 12;
|
|
49
|
+
readonly MAX_ROW_DETAIL_SECTIONS: 4;
|
|
50
|
+
readonly MAX_HOSTS: 100;
|
|
51
|
+
readonly ROWS_DEFAULT: 25;
|
|
52
|
+
readonly ROWS_MAX: 100;
|
|
53
|
+
};
|
|
54
|
+
/** The table layout that renders related columns, row details, and groups. */
|
|
55
|
+
export declare const FACET_TABLE_LAYOUT = "facet-table";
|
|
56
|
+
export interface RelatedQueryDecl {
|
|
57
|
+
/** Related roles, in display order. Exclusive with `segment`. */
|
|
58
|
+
roles?: string[];
|
|
59
|
+
/** A Pace Board sequence by its first role; resolves to the ordered chain. */
|
|
60
|
+
segment?: string;
|
|
61
|
+
/** Facet containment; string values may be `{{domain.path}}` templates. */
|
|
62
|
+
facets?: Record<string, unknown>;
|
|
63
|
+
/**
|
|
64
|
+
* Facets that narrow the match when the host row carries a value, and
|
|
65
|
+
* drop away when it does not: a lane narrows its tub's look-ahead to its
|
|
66
|
+
* own service level, a tub without lanes keeps the whole destination.
|
|
67
|
+
*/
|
|
68
|
+
narrow?: Record<string, unknown>;
|
|
69
|
+
/** Default `pending`. */
|
|
70
|
+
status?: string;
|
|
71
|
+
}
|
|
72
|
+
export interface RelatedSetDecl {
|
|
73
|
+
source: RelatedSource;
|
|
74
|
+
query?: RelatedQueryDecl;
|
|
75
|
+
}
|
|
76
|
+
export interface RelatedColumnDecl {
|
|
77
|
+
label: string;
|
|
78
|
+
related: string;
|
|
79
|
+
aggregate?: RelatedAggregate;
|
|
80
|
+
splitBy?: string;
|
|
81
|
+
labels?: Record<string, string>;
|
|
82
|
+
priority?: 1 | 2 | 3;
|
|
83
|
+
/** CSS width, as on any facet-table column. */
|
|
84
|
+
width?: string;
|
|
85
|
+
}
|
|
86
|
+
export interface RowDetailColumnDecl {
|
|
87
|
+
label: string;
|
|
88
|
+
value: string;
|
|
89
|
+
format?: string;
|
|
90
|
+
priority?: 1 | 2 | 3;
|
|
91
|
+
}
|
|
92
|
+
export interface RowDetailSectionDecl {
|
|
93
|
+
related: string;
|
|
94
|
+
label?: string;
|
|
95
|
+
columns: RowDetailColumnDecl[];
|
|
96
|
+
limit?: number;
|
|
97
|
+
}
|
|
98
|
+
/** The validated, normalized related declaration of one list schema. */
|
|
99
|
+
export interface ListSchemaRelations {
|
|
100
|
+
sets: Record<string, RelatedSetDecl>;
|
|
101
|
+
columns: RelatedColumnDecl[];
|
|
102
|
+
rowDetail: RowDetailSectionDecl[];
|
|
103
|
+
/** The metadata key a facet-table groups by, when declared. */
|
|
104
|
+
groupKey: string | null;
|
|
105
|
+
}
|
|
106
|
+
/** Per-host aggregate for one (set, splitBy) pair. */
|
|
107
|
+
export interface RelatedHostAggregate {
|
|
108
|
+
count: number;
|
|
109
|
+
/** Split value to count; a null value is keyed by the empty string. */
|
|
110
|
+
splits?: Record<string, number>;
|
|
111
|
+
/** Items whose reciprocal row the viewer cannot read. */
|
|
112
|
+
hidden?: number;
|
|
113
|
+
/** A host whose facet templates resolved to nothing; the set did not run. */
|
|
114
|
+
unresolved?: boolean;
|
|
115
|
+
}
|
|
116
|
+
export interface RelatedSetResult {
|
|
117
|
+
source: RelatedSource;
|
|
118
|
+
/**
|
|
119
|
+
* The roles whose rows the set reads, which a list follows for live
|
|
120
|
+
* changes: a query set's resolved roles in order, or the roles of an item
|
|
121
|
+
* set's readable reciprocal rows when a column splits by them.
|
|
122
|
+
*/
|
|
123
|
+
roles?: string[];
|
|
124
|
+
/** Query sets: role titles, keyed by role. */
|
|
125
|
+
roleLabels?: Record<string, string>;
|
|
126
|
+
/** Query sets: declared roles outside the viewer's full read scope. */
|
|
127
|
+
restricted?: string[];
|
|
128
|
+
/** Keyed by splitBy ('' when unsplit), then host id. */
|
|
129
|
+
aggregates: Record<string, Record<string, RelatedHostAggregate>>;
|
|
130
|
+
}
|
|
131
|
+
export interface RelatedAggregatesResponse {
|
|
132
|
+
version: number | null;
|
|
133
|
+
sets: Record<string, RelatedSetResult>;
|
|
134
|
+
}
|
|
135
|
+
export interface RelatedItemEntry {
|
|
136
|
+
itemKey: string;
|
|
137
|
+
payload?: unknown;
|
|
138
|
+
at?: string;
|
|
139
|
+
actor?: string;
|
|
140
|
+
reciprocalId?: string;
|
|
141
|
+
}
|
|
142
|
+
export interface RelatedRow {
|
|
143
|
+
/** Items sets only. */
|
|
144
|
+
item?: RelatedItemEntry;
|
|
145
|
+
/** The reciprocal row (items) or the related row (query); null when unreadable. */
|
|
146
|
+
escalation: Record<string, unknown> | null;
|
|
147
|
+
}
|
|
148
|
+
export interface RelatedRowsResponse {
|
|
149
|
+
source: RelatedSource;
|
|
150
|
+
rows: RelatedRow[];
|
|
151
|
+
total: number;
|
|
152
|
+
restricted?: string[];
|
|
153
|
+
roleLabels?: Record<string, string>;
|
|
154
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Related sets on a role's list schema. A set is named once under
|
|
4
|
+
* `x-lt-related`; columns (`related`) and row details (`x-lt-row-detail`)
|
|
5
|
+
* reference it by name. The server reads the declaration from the stored
|
|
6
|
+
* list schema, never from the caller.
|
|
7
|
+
*
|
|
8
|
+
* items the host row's accumulated or batch items, each read through its
|
|
9
|
+
* payload or its reciprocal row
|
|
10
|
+
* query rows in other roles that share facets with the host row; facet
|
|
11
|
+
* values are `{{domain.path}}` templates over the host row
|
|
12
|
+
*/
|
|
13
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
|
+
exports.FACET_TABLE_LAYOUT = exports.RELATED_LIMITS = exports.SPLIT_PATHS = exports.GROUP_FOLDS = exports.RELATED_AGGREGATES = exports.RELATED_SOURCES = exports.LIST_SCHEMA_KEYS = void 0;
|
|
15
|
+
exports.LIST_SCHEMA_KEYS = {
|
|
16
|
+
RELATED: 'x-lt-related',
|
|
17
|
+
COLUMNS: 'x-lt-columns',
|
|
18
|
+
ROW_DETAIL: 'x-lt-row-detail',
|
|
19
|
+
GROUP_BY: 'x-lt-group-by',
|
|
20
|
+
LAYOUT: 'x-lt-layout',
|
|
21
|
+
};
|
|
22
|
+
exports.RELATED_SOURCES = {
|
|
23
|
+
ITEMS: 'items',
|
|
24
|
+
QUERY: 'query',
|
|
25
|
+
};
|
|
26
|
+
exports.RELATED_AGGREGATES = {
|
|
27
|
+
COUNT: 'count',
|
|
28
|
+
};
|
|
29
|
+
/** How a grouped table folds a plain column across a group's rows. */
|
|
30
|
+
exports.GROUP_FOLDS = {
|
|
31
|
+
FIRST: 'first',
|
|
32
|
+
MIN: 'min',
|
|
33
|
+
MAX: 'max',
|
|
34
|
+
SUM: 'sum',
|
|
35
|
+
COUNT: 'count',
|
|
36
|
+
/** The distinct values, in row order, joined: "standard, express". */
|
|
37
|
+
DISTINCT: 'distinct',
|
|
38
|
+
};
|
|
39
|
+
/** Split prefixes. `role` splits a query set by the related row's role. */
|
|
40
|
+
exports.SPLIT_PATHS = {
|
|
41
|
+
ROLE: 'role',
|
|
42
|
+
METADATA: 'metadata.',
|
|
43
|
+
PAYLOAD: 'payload.',
|
|
44
|
+
RECIPROCAL_METADATA: 'reciprocal.metadata.',
|
|
45
|
+
};
|
|
46
|
+
exports.RELATED_LIMITS = {
|
|
47
|
+
MAX_SETS: 4,
|
|
48
|
+
MAX_QUERY_ROLES: 12,
|
|
49
|
+
MAX_ROW_DETAIL_SECTIONS: 4,
|
|
50
|
+
MAX_HOSTS: 100,
|
|
51
|
+
ROWS_DEFAULT: 25,
|
|
52
|
+
ROWS_MAX: 100,
|
|
53
|
+
};
|
|
54
|
+
/** The table layout that renders related columns, row details, and groups. */
|
|
55
|
+
exports.FACET_TABLE_LAYOUT = 'facet-table';
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { type ListSchemaRelations } from './types';
|
|
2
|
+
/** A metadata key: interpolated as a JSON path, so strictly validated. */
|
|
3
|
+
export declare const METADATA_KEY: RegExp;
|
|
4
|
+
/** The split paths a set's source accepts. */
|
|
5
|
+
export declare function splitPathError(source: string, splitBy: string): string | null;
|
|
6
|
+
/**
|
|
7
|
+
* Validate and normalize the related declaration of a list schema. Throws on
|
|
8
|
+
* an invalid declaration; keys outside this vocabulary stay opaque.
|
|
9
|
+
*/
|
|
10
|
+
export declare function readListSchemaRelations(schema: unknown): ListSchemaRelations;
|
|
11
|
+
/** The declaration's first error, or null when valid. */
|
|
12
|
+
export declare function listSchemaRelationsError(schema: unknown): string | null;
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.METADATA_KEY = void 0;
|
|
4
|
+
exports.splitPathError = splitPathError;
|
|
5
|
+
exports.readListSchemaRelations = readListSchemaRelations;
|
|
6
|
+
exports.listSchemaRelationsError = listSchemaRelationsError;
|
|
7
|
+
const types_1 = require("./types");
|
|
8
|
+
/** A metadata key: interpolated as a JSON path, so strictly validated. */
|
|
9
|
+
exports.METADATA_KEY = /^[a-zA-Z0-9_]+$/;
|
|
10
|
+
const SET_NAME = /^[a-zA-Z][a-zA-Z0-9_-]{0,47}$/;
|
|
11
|
+
const PATH_SEGMENT = /^[a-zA-Z0-9_]+$/;
|
|
12
|
+
class ListSchemaError extends Error {
|
|
13
|
+
}
|
|
14
|
+
function fail(message) {
|
|
15
|
+
throw new ListSchemaError(message);
|
|
16
|
+
}
|
|
17
|
+
function isObj(value) {
|
|
18
|
+
return !!value && typeof value === 'object' && !Array.isArray(value);
|
|
19
|
+
}
|
|
20
|
+
function isNonEmptyString(value) {
|
|
21
|
+
return typeof value === 'string' && value.trim().length > 0;
|
|
22
|
+
}
|
|
23
|
+
/** True when a dotted path has only plain segments. */
|
|
24
|
+
function isPlainPath(path) {
|
|
25
|
+
return path.length > 0 && path.split('.').every((s) => PATH_SEGMENT.test(s));
|
|
26
|
+
}
|
|
27
|
+
/** The split paths a set's source accepts. */
|
|
28
|
+
function splitPathError(source, splitBy) {
|
|
29
|
+
if (source === types_1.RELATED_SOURCES.QUERY) {
|
|
30
|
+
if (splitBy === types_1.SPLIT_PATHS.ROLE)
|
|
31
|
+
return null;
|
|
32
|
+
if (splitBy.startsWith(types_1.SPLIT_PATHS.METADATA) && exports.METADATA_KEY.test(splitBy.slice(types_1.SPLIT_PATHS.METADATA.length)))
|
|
33
|
+
return null;
|
|
34
|
+
return `splitBy "${splitBy}" on a query set must be "role" or "metadata.<key>"`;
|
|
35
|
+
}
|
|
36
|
+
if (splitBy.startsWith(types_1.SPLIT_PATHS.PAYLOAD) && isPlainPath(splitBy.slice(types_1.SPLIT_PATHS.PAYLOAD.length)))
|
|
37
|
+
return null;
|
|
38
|
+
if (splitBy.startsWith(types_1.SPLIT_PATHS.RECIPROCAL_METADATA)
|
|
39
|
+
&& exports.METADATA_KEY.test(splitBy.slice(types_1.SPLIT_PATHS.RECIPROCAL_METADATA.length)))
|
|
40
|
+
return null;
|
|
41
|
+
return `splitBy "${splitBy}" on an items set must be "payload.<path>" or "reciprocal.metadata.<key>"`;
|
|
42
|
+
}
|
|
43
|
+
function readSet(name, raw) {
|
|
44
|
+
if (!SET_NAME.test(name))
|
|
45
|
+
fail(`x-lt-related name "${name}" must start with a letter (letters, digits, _ or -)`);
|
|
46
|
+
if (!isObj(raw))
|
|
47
|
+
fail(`x-lt-related.${name} must be an object`);
|
|
48
|
+
if (raw.source === types_1.RELATED_SOURCES.ITEMS) {
|
|
49
|
+
if (raw.query !== undefined)
|
|
50
|
+
fail(`x-lt-related.${name}: an items set takes no query`);
|
|
51
|
+
return { source: types_1.RELATED_SOURCES.ITEMS };
|
|
52
|
+
}
|
|
53
|
+
if (raw.source !== types_1.RELATED_SOURCES.QUERY)
|
|
54
|
+
fail(`x-lt-related.${name}.source must be "items" or "query"`);
|
|
55
|
+
const q = raw.query;
|
|
56
|
+
if (!isObj(q))
|
|
57
|
+
fail(`x-lt-related.${name}.query is required for a query set`);
|
|
58
|
+
const hasRoles = q.roles !== undefined;
|
|
59
|
+
const hasSegment = q.segment !== undefined;
|
|
60
|
+
if (hasRoles === hasSegment)
|
|
61
|
+
fail(`x-lt-related.${name}.query takes exactly one of roles or segment`);
|
|
62
|
+
if (hasRoles) {
|
|
63
|
+
const roles = q.roles;
|
|
64
|
+
if (!Array.isArray(roles) || roles.length === 0 || roles.length > types_1.RELATED_LIMITS.MAX_QUERY_ROLES
|
|
65
|
+
|| !roles.every(isNonEmptyString)) {
|
|
66
|
+
fail(`x-lt-related.${name}.query.roles must be 1..${types_1.RELATED_LIMITS.MAX_QUERY_ROLES} role names`);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
else if (!isNonEmptyString(q.segment)) {
|
|
70
|
+
fail(`x-lt-related.${name}.query.segment must be a role name`);
|
|
71
|
+
}
|
|
72
|
+
if (!isObj(q.facets) || Object.keys(q.facets).length === 0) {
|
|
73
|
+
fail(`x-lt-related.${name}.query.facets must name at least one facet`);
|
|
74
|
+
}
|
|
75
|
+
for (const [key, value] of Object.entries(q.facets)) {
|
|
76
|
+
if (!exports.METADATA_KEY.test(key))
|
|
77
|
+
fail(`x-lt-related.${name}.query.facets key "${key}" must be letters, digits or _`);
|
|
78
|
+
if (value === null || typeof value === 'object')
|
|
79
|
+
fail(`x-lt-related.${name}.query.facets.${key} must be a scalar or template`);
|
|
80
|
+
}
|
|
81
|
+
if (q.narrow !== undefined) {
|
|
82
|
+
if (!isObj(q.narrow) || Object.keys(q.narrow).length === 0)
|
|
83
|
+
fail(`x-lt-related.${name}.query.narrow must name at least one facet`);
|
|
84
|
+
for (const [key, value] of Object.entries(q.narrow)) {
|
|
85
|
+
if (!exports.METADATA_KEY.test(key))
|
|
86
|
+
fail(`x-lt-related.${name}.query.narrow key "${key}" must be letters, digits or _`);
|
|
87
|
+
if (key in q.facets)
|
|
88
|
+
fail(`x-lt-related.${name}.query.narrow.${key} is already a required facet`);
|
|
89
|
+
if (value === null || typeof value === 'object')
|
|
90
|
+
fail(`x-lt-related.${name}.query.narrow.${key} must be a scalar or template`);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
if (q.status !== undefined && !isNonEmptyString(q.status))
|
|
94
|
+
fail(`x-lt-related.${name}.query.status must be a status`);
|
|
95
|
+
return {
|
|
96
|
+
source: types_1.RELATED_SOURCES.QUERY,
|
|
97
|
+
query: {
|
|
98
|
+
...(hasRoles ? { roles: [...q.roles] } : { segment: q.segment }),
|
|
99
|
+
facets: { ...q.facets },
|
|
100
|
+
...(q.narrow !== undefined ? { narrow: { ...q.narrow } } : {}),
|
|
101
|
+
...(q.status !== undefined ? { status: q.status } : {}),
|
|
102
|
+
},
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
function readRelatedColumn(raw, sets, at) {
|
|
106
|
+
const name = raw.related;
|
|
107
|
+
if (!isNonEmptyString(name) || !sets[name])
|
|
108
|
+
fail(`${at}.related must name a set declared in x-lt-related`);
|
|
109
|
+
if (raw.aggregate !== undefined && raw.aggregate !== types_1.RELATED_AGGREGATES.COUNT)
|
|
110
|
+
fail(`${at}.aggregate must be "count"`);
|
|
111
|
+
if (raw.splitBy !== undefined) {
|
|
112
|
+
if (!isNonEmptyString(raw.splitBy))
|
|
113
|
+
fail(`${at}.splitBy must be a path`);
|
|
114
|
+
const err = splitPathError(sets[name].source, raw.splitBy);
|
|
115
|
+
if (err)
|
|
116
|
+
fail(`${at}: ${err}`);
|
|
117
|
+
}
|
|
118
|
+
if (raw.labels !== undefined && (!isObj(raw.labels) || !Object.values(raw.labels).every((v) => typeof v === 'string'))) {
|
|
119
|
+
fail(`${at}.labels must map values to display text`);
|
|
120
|
+
}
|
|
121
|
+
return raw;
|
|
122
|
+
}
|
|
123
|
+
function readRowDetail(raw, sets) {
|
|
124
|
+
if (raw === undefined)
|
|
125
|
+
return [];
|
|
126
|
+
if (!Array.isArray(raw) || raw.length === 0 || raw.length > types_1.RELATED_LIMITS.MAX_ROW_DETAIL_SECTIONS) {
|
|
127
|
+
fail(`x-lt-row-detail must be 1..${types_1.RELATED_LIMITS.MAX_ROW_DETAIL_SECTIONS} sections`);
|
|
128
|
+
}
|
|
129
|
+
return raw.map((section, i) => {
|
|
130
|
+
const at = `x-lt-row-detail[${i}]`;
|
|
131
|
+
if (!isObj(section))
|
|
132
|
+
fail(`${at} must be an object`);
|
|
133
|
+
if (!isNonEmptyString(section.related) || !sets[section.related])
|
|
134
|
+
fail(`${at}.related must name a set declared in x-lt-related`);
|
|
135
|
+
if (!Array.isArray(section.columns) || section.columns.length === 0)
|
|
136
|
+
fail(`${at}.columns must list at least one column`);
|
|
137
|
+
for (const [j, col] of section.columns.entries()) {
|
|
138
|
+
if (!isObj(col) || !isNonEmptyString(col.label) || typeof col.value !== 'string') {
|
|
139
|
+
fail(`${at}.columns[${j}] needs a label and a value template`);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
if (section.limit !== undefined && (!Number.isInteger(section.limit) || section.limit < 1
|
|
143
|
+
|| section.limit > types_1.RELATED_LIMITS.ROWS_MAX)) {
|
|
144
|
+
fail(`${at}.limit must be 1..${types_1.RELATED_LIMITS.ROWS_MAX}`);
|
|
145
|
+
}
|
|
146
|
+
return section;
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
function readGroupKey(schema) {
|
|
150
|
+
const raw = schema[types_1.LIST_SCHEMA_KEYS.GROUP_BY];
|
|
151
|
+
if (raw === undefined || schema[types_1.LIST_SCHEMA_KEYS.LAYOUT] !== types_1.FACET_TABLE_LAYOUT)
|
|
152
|
+
return null;
|
|
153
|
+
const key = typeof raw === 'string' && raw.startsWith(types_1.SPLIT_PATHS.METADATA) ? raw.slice(types_1.SPLIT_PATHS.METADATA.length) : '';
|
|
154
|
+
if (!exports.METADATA_KEY.test(key))
|
|
155
|
+
fail('x-lt-group-by on a facet-table must be "metadata.<key>"');
|
|
156
|
+
return key;
|
|
157
|
+
}
|
|
158
|
+
const FOLDS = new Set(Object.values(types_1.GROUP_FOLDS));
|
|
159
|
+
/**
|
|
160
|
+
* Validate and normalize the related declaration of a list schema. Throws on
|
|
161
|
+
* an invalid declaration; keys outside this vocabulary stay opaque.
|
|
162
|
+
*/
|
|
163
|
+
function readListSchemaRelations(schema) {
|
|
164
|
+
const empty = { sets: {}, columns: [], rowDetail: [], groupKey: null };
|
|
165
|
+
if (!isObj(schema))
|
|
166
|
+
return empty;
|
|
167
|
+
const rawSets = schema[types_1.LIST_SCHEMA_KEYS.RELATED];
|
|
168
|
+
const sets = {};
|
|
169
|
+
if (rawSets !== undefined) {
|
|
170
|
+
if (!isObj(rawSets))
|
|
171
|
+
fail('x-lt-related must map set names to declarations');
|
|
172
|
+
const names = Object.keys(rawSets);
|
|
173
|
+
if (names.length === 0 || names.length > types_1.RELATED_LIMITS.MAX_SETS)
|
|
174
|
+
fail(`x-lt-related must declare 1..${types_1.RELATED_LIMITS.MAX_SETS} sets`);
|
|
175
|
+
for (const name of names)
|
|
176
|
+
sets[name] = readSet(name, rawSets[name]);
|
|
177
|
+
}
|
|
178
|
+
const columns = [];
|
|
179
|
+
const rawColumns = schema[types_1.LIST_SCHEMA_KEYS.COLUMNS];
|
|
180
|
+
if (Array.isArray(rawColumns)) {
|
|
181
|
+
rawColumns.forEach((col, i) => {
|
|
182
|
+
if (!isObj(col))
|
|
183
|
+
return;
|
|
184
|
+
if (col.related !== undefined)
|
|
185
|
+
columns.push(readRelatedColumn(col, sets, `x-lt-columns[${i}]`));
|
|
186
|
+
if (col.group !== undefined && (typeof col.group !== 'string' || !FOLDS.has(col.group))) {
|
|
187
|
+
fail(`x-lt-columns[${i}].group must be one of ${[...FOLDS].join(', ')}`);
|
|
188
|
+
}
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
return { sets, columns, rowDetail: readRowDetail(schema[types_1.LIST_SCHEMA_KEYS.ROW_DETAIL], sets), groupKey: readGroupKey(schema) };
|
|
192
|
+
}
|
|
193
|
+
/** The declaration's first error, or null when valid. */
|
|
194
|
+
function listSchemaRelationsError(schema) {
|
|
195
|
+
try {
|
|
196
|
+
readListSchemaRelations(schema);
|
|
197
|
+
return null;
|
|
198
|
+
}
|
|
199
|
+
catch (err) {
|
|
200
|
+
if (err instanceof ListSchemaError)
|
|
201
|
+
return err.message;
|
|
202
|
+
throw err;
|
|
203
|
+
}
|
|
204
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pace Board sequences: each line of stations a deployment composes with
|
|
3
|
+
* `parent_role`, over the ops-visible roles. One definition for the board
|
|
4
|
+
* and for list queries that name a segment.
|
|
5
|
+
*/
|
|
6
|
+
export interface SequenceRole {
|
|
7
|
+
role: string;
|
|
8
|
+
parent_role?: string | null;
|
|
9
|
+
ops_visible?: boolean | null;
|
|
10
|
+
}
|
|
11
|
+
export interface SequenceStation<R extends SequenceRole> {
|
|
12
|
+
role: R;
|
|
13
|
+
depth: number;
|
|
14
|
+
}
|
|
15
|
+
export interface RoleSequence<R extends SequenceRole> {
|
|
16
|
+
origin: R;
|
|
17
|
+
stations: SequenceStation<R>[];
|
|
18
|
+
}
|
|
19
|
+
/** Breadth-first from each root, longest sequence first. */
|
|
20
|
+
export declare function buildRoleSequences<R extends SequenceRole>(roles: R[]): RoleSequence<R>[];
|
|
21
|
+
/** The ordered roles of the sequence that starts at `origin`, or null. */
|
|
22
|
+
export declare function segmentRoles<R extends SequenceRole>(roles: R[], origin: string): string[] | null;
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Pace Board sequences: each line of stations a deployment composes with
|
|
4
|
+
* `parent_role`, over the ops-visible roles. One definition for the board
|
|
5
|
+
* and for list queries that name a segment.
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.buildRoleSequences = buildRoleSequences;
|
|
9
|
+
exports.segmentRoles = segmentRoles;
|
|
10
|
+
/** Breadth-first from each root, longest sequence first. */
|
|
11
|
+
function buildRoleSequences(roles) {
|
|
12
|
+
const opsRoles = roles.filter((r) => r.ops_visible);
|
|
13
|
+
const roleMap = new Map(opsRoles.map((r) => [r.role, r]));
|
|
14
|
+
const visited = new Set();
|
|
15
|
+
// Roots: no parent, or a parent outside the ops set.
|
|
16
|
+
const roots = opsRoles.filter((r) => !r.parent_role || !roleMap.has(r.parent_role));
|
|
17
|
+
const sequences = roots.map((root) => {
|
|
18
|
+
const stations = [];
|
|
19
|
+
const queue = [{ role: root, depth: 0 }];
|
|
20
|
+
while (queue.length > 0) {
|
|
21
|
+
const item = queue.shift();
|
|
22
|
+
if (visited.has(item.role.role))
|
|
23
|
+
continue;
|
|
24
|
+
visited.add(item.role.role);
|
|
25
|
+
stations.push(item);
|
|
26
|
+
opsRoles
|
|
27
|
+
.filter((c) => c.parent_role === item.role.role && !visited.has(c.role))
|
|
28
|
+
.forEach((c) => queue.push({ role: c, depth: item.depth + 1 }));
|
|
29
|
+
}
|
|
30
|
+
return { origin: root, stations };
|
|
31
|
+
});
|
|
32
|
+
// Unreachable roles (cycles, dangling parents) each stand alone.
|
|
33
|
+
opsRoles
|
|
34
|
+
.filter((r) => !visited.has(r.role))
|
|
35
|
+
.forEach((r) => sequences.push({ origin: r, stations: [{ role: r, depth: 0 }] }));
|
|
36
|
+
return sequences.sort((a, b) => b.stations.length - a.stations.length || a.origin.role.localeCompare(b.origin.role));
|
|
37
|
+
}
|
|
38
|
+
/** The ordered roles of the sequence that starts at `origin`, or null. */
|
|
39
|
+
function segmentRoles(roles, origin) {
|
|
40
|
+
const sequence = buildRoleSequences(roles).find((s) => s.origin.role === origin);
|
|
41
|
+
return sequence ? sequence.stations.map((s) => s.role.role) : null;
|
|
42
|
+
}
|