@hotmeshio/long-tail 0.23.2 → 0.24.1
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 +11 -1
- package/build/adapters/express.js +42 -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/metadata.js +3 -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/scan-codes/choice.js +31 -7
- package/build/api/settings.js +9 -0
- 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/cron.d.ts +3 -2
- package/build/api/yaml-workflows/cron.js +6 -1
- package/build/api/yaml-workflows/deploy.d.ts +15 -2
- package/build/api/yaml-workflows/deploy.js +69 -2
- package/build/lib/db/schemas/038_oauth_server.sql +46 -0
- package/build/lib/db/schemas/039_nats_ws_tickets.sql +12 -0
- package/build/lib/events/browser-view.d.ts +20 -0
- package/build/lib/events/browser-view.js +117 -0
- package/build/lib/events/nats-ws-filter.d.ts +29 -0
- package/build/lib/events/nats-ws-filter.js +109 -0
- package/build/lib/events/nats-ws-proxy.d.ts +7 -0
- package/build/lib/events/nats-ws-proxy.js +86 -7
- 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 +19 -0
- package/build/lib/events/nats-ws-ticket.js +63 -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 +19 -0
- package/build/modules/config.js +27 -0
- package/build/modules/defaults.d.ts +10 -0
- package/build/modules/defaults.js +12 -1
- package/build/modules/maintenance.d.ts +2 -0
- package/build/modules/maintenance.js +7 -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 +47 -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 +2 -2
- package/build/routes/escalations/list.d.ts +1 -1
- package/build/routes/escalations/metadata.d.ts +1 -1
- package/build/routes/escalations/related.d.ts +1 -1
- 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 +110 -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 +20 -7
- 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/services/agent/authority.d.ts +15 -0
- package/build/services/agent/authority.js +59 -0
- package/build/services/agent/trigger-registry.js +7 -2
- 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 +27 -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 +50 -0
- package/build/services/auth/oauth-server/sql.js +156 -0
- package/build/services/auth/oauth-server/store.d.ts +88 -0
- package/build/services/auth/oauth-server/store.js +171 -0
- package/build/services/auth/sql.d.ts +1 -0
- package/build/services/auth/sql.js +3 -1
- package/build/services/cron/index.js +5 -3
- package/build/services/escalation/queries.js +7 -2
- 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/maintenance/index.js +8 -0
- 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/seed-service-account.d.ts +4 -1
- package/build/services/mcp/seed-service-account.js +11 -6
- package/build/services/mcp/server-lifecycle.js +2 -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 +31 -26
- package/build/services/yaml-workflow/workers/register.js +3 -13
- package/build/services/yaml-workflow/workers/step-tool.d.ts +7 -0
- package/build/services/yaml-workflow/workers/step-tool.js +69 -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 +25 -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 +26 -26
- package/build/system/mcp-servers/admin/tasks.js +7 -2
- package/build/system/mcp-servers/admin/users.js +31 -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 +13 -21
- 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/mcp-servers/workflow.js +13 -25
- 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 +3 -1
- package/build/types/maintenance.d.ts +2 -2
- 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/startup.d.ts +15 -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-BPWsgMfZ.js → AdminDashboard-B3mkMIOT.js} +2 -2
- package/dashboard/dist/assets/{AdminDashboard-BPWsgMfZ.js.map → AdminDashboard-B3mkMIOT.js.map} +1 -1
- package/dashboard/dist/assets/{AgentConfigPage-De9imyo5.js → AgentConfigPage-CQj2B678.js} +2 -2
- package/dashboard/dist/assets/{AgentConfigPage-De9imyo5.js.map → AgentConfigPage-CQj2B678.js.map} +1 -1
- package/dashboard/dist/assets/{AgentDetailPage-B6o96Y5G.js → AgentDetailPage-CzrD8JJI.js} +3 -3
- package/dashboard/dist/assets/{AgentDetailPage-B6o96Y5G.js.map → AgentDetailPage-CzrD8JJI.js.map} +1 -1
- package/dashboard/dist/assets/{AgentsPage-DMEmiK_W.js → AgentsPage-jg2OFwyW.js} +2 -2
- package/dashboard/dist/assets/{AgentsPage-DMEmiK_W.js.map → AgentsPage-jg2OFwyW.js.map} +1 -1
- package/dashboard/dist/assets/{AvailableEscalationsPage-DeYMngwE.js → AvailableEscalationsPage-IS28XBRe.js} +2 -2
- package/dashboard/dist/assets/{AvailableEscalationsPage-DeYMngwE.js.map → AvailableEscalationsPage-IS28XBRe.js.map} +1 -1
- package/dashboard/dist/assets/{BotPicker-DDmpgGHZ.js → BotPicker-DvEJFpwS.js} +2 -2
- package/dashboard/dist/assets/{BotPicker-DDmpgGHZ.js.map → BotPicker-DvEJFpwS.js.map} +1 -1
- package/dashboard/dist/assets/{BulkAssignModal-BqlklomG.js → BulkAssignModal-BoQCi-YC.js} +2 -2
- package/dashboard/dist/assets/{BulkAssignModal-BqlklomG.js.map → BulkAssignModal-BoQCi-YC.js.map} +1 -1
- package/dashboard/dist/assets/{CapabilitiesPage-DOtjDTbK.js → CapabilitiesPage-kwlrcb_t.js} +2 -2
- package/dashboard/dist/assets/{CapabilitiesPage-DOtjDTbK.js.map → CapabilitiesPage-kwlrcb_t.js.map} +1 -1
- package/dashboard/dist/assets/{CollapsibleSection-CLr8LP0V.js → CollapsibleSection-UMIV4KIj.js} +2 -2
- package/dashboard/dist/assets/{CollapsibleSection-CLr8LP0V.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-DxX72PwV.js → CountdownTimer-LG03dVgR.js} +2 -2
- package/dashboard/dist/assets/{CountdownTimer-DxX72PwV.js.map → CountdownTimer-LG03dVgR.js.map} +1 -1
- package/dashboard/dist/assets/{CredentialsPage-CObc9Rs5.js → CredentialsPage-CaFQ6vLb.js} +2 -2
- package/dashboard/dist/assets/{CredentialsPage-CObc9Rs5.js.map → CredentialsPage-CaFQ6vLb.js.map} +1 -1
- package/dashboard/dist/assets/{CronLabel-Bb8GoNY5.js → CronLabel-Co5j7tzW.js} +2 -2
- package/dashboard/dist/assets/{CronLabel-Bb8GoNY5.js.map → CronLabel-Co5j7tzW.js.map} +1 -1
- package/dashboard/dist/assets/{ElapsedCell-CmGhVlYl.js → ElapsedCell-WJyE9G0T.js} +2 -2
- package/dashboard/dist/assets/{ElapsedCell-CmGhVlYl.js.map → ElapsedCell-WJyE9G0T.js.map} +1 -1
- package/dashboard/dist/assets/{EntityTimelinePanel-B4Jwy1w3.js → EntityTimelinePanel-CDFFfX9d.js} +2 -2
- package/dashboard/dist/assets/{EntityTimelinePanel-B4Jwy1w3.js.map → EntityTimelinePanel-CDFFfX9d.js.map} +1 -1
- package/dashboard/dist/assets/{EscalationListSchemaPage-CZZbZ4Aa.js → EscalationListSchemaPage-CMrUlaKI.js} +3 -3
- package/dashboard/dist/assets/{EscalationListSchemaPage-CZZbZ4Aa.js.map → EscalationListSchemaPage-CMrUlaKI.js.map} +1 -1
- package/dashboard/dist/assets/{EscalationSchemaPage-D0ko59_S.js → EscalationSchemaPage-Dx2Lyfrz.js} +2 -2
- package/dashboard/dist/assets/{EscalationSchemaPage-D0ko59_S.js.map → EscalationSchemaPage-Dx2Lyfrz.js.map} +1 -1
- package/dashboard/dist/assets/{EscalationTimeline-BcnJEKFD.js → EscalationTimeline-d3nvshOk.js} +2 -2
- package/dashboard/dist/assets/{EscalationTimeline-BcnJEKFD.js.map → EscalationTimeline-d3nvshOk.js.map} +1 -1
- package/dashboard/dist/assets/{EscalationTitleSelect-P0q5sck4.js → EscalationTitleSelect-DWQieOM9.js} +2 -2
- package/dashboard/dist/assets/{EscalationTitleSelect-P0q5sck4.js.map → EscalationTitleSelect-DWQieOM9.js.map} +1 -1
- package/dashboard/dist/assets/{EscalationsOverview-BLPmh4AF.js → EscalationsOverview-BX8Cpi0X.js} +2 -2
- package/dashboard/dist/assets/{EscalationsOverview-BLPmh4AF.js.map → EscalationsOverview-BX8Cpi0X.js.map} +1 -1
- package/dashboard/dist/assets/{EventTable-gBzi5tIS.js → EventTable-D1-ITVXS.js} +2 -2
- package/dashboard/dist/assets/{EventTable-gBzi5tIS.js.map → EventTable-D1-ITVXS.js.map} +1 -1
- package/dashboard/dist/assets/{FilterBar-BulSsWb2.js → FilterBar-ABC9ctin.js} +2 -2
- package/dashboard/dist/assets/{FilterBar-BulSsWb2.js.map → FilterBar-ABC9ctin.js.map} +1 -1
- package/dashboard/dist/assets/{FormattedValue-BMHRrvrL.js → FormattedValue-k27T4bG7.js} +2 -2
- package/dashboard/dist/assets/{FormattedValue-BMHRrvrL.js.map → FormattedValue-k27T4bG7.js.map} +1 -1
- package/dashboard/dist/assets/{GraphInvokePage--997yNRr.js → GraphInvokePage-DKUErxWc.js} +2 -2
- package/dashboard/dist/assets/{GraphInvokePage--997yNRr.js.map → GraphInvokePage-DKUErxWc.js.map} +1 -1
- package/dashboard/dist/assets/{HomePage-CwXFz--v.js → HomePage-C6u9dIpR.js} +2 -2
- package/dashboard/dist/assets/{HomePage-CwXFz--v.js.map → HomePage-C6u9dIpR.js.map} +1 -1
- package/dashboard/dist/assets/{ListToolbar-Df4qZryJ.js → ListToolbar-gA5rFzkz.js} +2 -2
- package/dashboard/dist/assets/{ListToolbar-Df4qZryJ.js.map → ListToolbar-gA5rFzkz.js.map} +1 -1
- package/dashboard/dist/assets/{McpOverview-DrogIAKJ.js → McpOverview-BOPo3J_i.js} +2 -2
- package/dashboard/dist/assets/{McpOverview-DrogIAKJ.js.map → McpOverview-BOPo3J_i.js.map} +1 -1
- package/dashboard/dist/assets/{McpQueryDetailPage-CJmvCAE6.js → McpQueryDetailPage-BRVVi0Zh.js} +2 -2
- package/dashboard/dist/assets/{McpQueryDetailPage-CJmvCAE6.js.map → McpQueryDetailPage-BRVVi0Zh.js.map} +1 -1
- package/dashboard/dist/assets/{McpQueryPage-lygo4Yq0.js → McpQueryPage-Dmbb6SAc.js} +2 -2
- package/dashboard/dist/assets/{McpQueryPage-lygo4Yq0.js.map → McpQueryPage-Dmbb6SAc.js.map} +1 -1
- package/dashboard/dist/assets/{McpRunDetailPage-hvns2sCm.js → McpRunDetailPage-bMXNO-6V.js} +2 -2
- package/dashboard/dist/assets/{McpRunDetailPage-hvns2sCm.js.map → McpRunDetailPage-bMXNO-6V.js.map} +1 -1
- package/dashboard/dist/assets/{McpRunsPage-C2_7spTX.js → McpRunsPage-Bi9AMWja.js} +2 -2
- package/dashboard/dist/assets/{McpRunsPage-C2_7spTX.js.map → McpRunsPage-Bi9AMWja.js.map} +1 -1
- package/dashboard/dist/assets/{OperationsPage-BlK8WlsY.js → OperationsPage-CvR74ZUJ.js} +3 -3
- package/dashboard/dist/assets/{OperationsPage-BlK8WlsY.js.map → OperationsPage-CvR74ZUJ.js.map} +1 -1
- package/dashboard/dist/assets/{OperatorDashboard-BeWBiMGX.js → OperatorDashboard-DctmZw10.js} +2 -2
- package/dashboard/dist/assets/{OperatorDashboard-BeWBiMGX.js.map → OperatorDashboard-DctmZw10.js.map} +1 -1
- package/dashboard/dist/assets/{PersonaDetailPage-CNHpsX_i.js → PersonaDetailPage-Ubqm2rQH.js} +2 -2
- package/dashboard/dist/assets/{PersonaDetailPage-CNHpsX_i.js.map → PersonaDetailPage-Ubqm2rQH.js.map} +1 -1
- package/dashboard/dist/assets/{PersonasPage-ChASEZRg.js → PersonasPage-BpFL2rpo.js} +2 -2
- package/dashboard/dist/assets/{PersonasPage-ChASEZRg.js.map → PersonasPage-BpFL2rpo.js.map} +1 -1
- package/dashboard/dist/assets/{PortalPage-D5Lk-PKF.js → PortalPage-Dfc_Q02R.js} +2 -2
- package/dashboard/dist/assets/{PortalPage-D5Lk-PKF.js.map → PortalPage-Dfc_Q02R.js.map} +1 -1
- package/dashboard/dist/assets/ProcessDetailPage-liJspvQh.js +2 -0
- package/dashboard/dist/assets/{ProcessDetailPage-DNgCIwRl.js.map → ProcessDetailPage-liJspvQh.js.map} +1 -1
- package/dashboard/dist/assets/{ProcessesListPage-pRjWuWlH.js → ProcessesListPage-C3OM5ZUy.js} +2 -2
- package/dashboard/dist/assets/{ProcessesListPage-pRjWuWlH.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-Bh_UcfYY.js → RoleDetailPage-CrlYCh-R.js} +2 -2
- package/dashboard/dist/assets/{RoleDetailPage-Bh_UcfYY.js.map → RoleDetailPage-CrlYCh-R.js.map} +1 -1
- package/dashboard/dist/assets/{RolesPage-CK17N7zz.js → RolesPage-BaazL_pt.js} +2 -2
- package/dashboard/dist/assets/{RolesPage-CK17N7zz.js.map → RolesPage-BaazL_pt.js.map} +1 -1
- package/dashboard/dist/assets/{RunAsSelector-BEKUP0p2.js → RunAsSelector-DxuV0fa1.js} +2 -2
- package/dashboard/dist/assets/{RunAsSelector-BEKUP0p2.js.map → RunAsSelector-DxuV0fa1.js.map} +1 -1
- package/dashboard/dist/assets/{ScanCodesPage-Bd0Pflqx.js → ScanCodesPage-C0mvmYTq.js} +2 -2
- package/dashboard/dist/assets/{ScanCodesPage-Bd0Pflqx.js.map → ScanCodesPage-C0mvmYTq.js.map} +1 -1
- package/dashboard/dist/assets/{ScanSchemeDetailPage-CnuhozmJ.js → ScanSchemeDetailPage-CiJgt5dZ.js} +2 -2
- package/dashboard/dist/assets/{ScanSchemeDetailPage-CnuhozmJ.js.map → ScanSchemeDetailPage-CiJgt5dZ.js.map} +1 -1
- package/dashboard/dist/assets/{ScanStationPage-CoLc-q3h.js → ScanStationPage-DzGaXc40.js} +2 -2
- package/dashboard/dist/assets/{ScanStationPage-CoLc-q3h.js.map → ScanStationPage-DzGaXc40.js.map} +1 -1
- package/dashboard/dist/assets/{StickyPagination-COrfvkBi.js → StickyPagination-CqbjVY6T.js} +2 -2
- package/dashboard/dist/assets/{StickyPagination-COrfvkBi.js.map → StickyPagination-CqbjVY6T.js.map} +1 -1
- package/dashboard/dist/assets/{StreamMessageDetail-Cif2egLy.js → StreamMessageDetail-wX3i0aqs.js} +2 -2
- package/dashboard/dist/assets/{StreamMessageDetail-Cif2egLy.js.map → StreamMessageDetail-wX3i0aqs.js.map} +1 -1
- package/dashboard/dist/assets/{SwimlaneTimeline-BnZYTrAh.js → SwimlaneTimeline-C50PsFoV.js} +2 -2
- package/dashboard/dist/assets/{SwimlaneTimeline-BnZYTrAh.js.map → SwimlaneTimeline-C50PsFoV.js.map} +1 -1
- package/dashboard/dist/assets/{TaskDetailPage-DEz_dqyR.js → TaskDetailPage-bbNSv4Ae.js} +2 -2
- package/dashboard/dist/assets/{TaskDetailPage-DEz_dqyR.js.map → TaskDetailPage-bbNSv4Ae.js.map} +1 -1
- package/dashboard/dist/assets/{TasksListPage-oEfEGj0_.js → TasksListPage-CDWnm_d9.js} +2 -2
- package/dashboard/dist/assets/{TasksListPage-oEfEGj0_.js.map → TasksListPage-CDWnm_d9.js.map} +1 -1
- package/dashboard/dist/assets/{TimeAgo-Dz5TgZZZ.js → TimeAgo-BLjqlfoX.js} +2 -2
- package/dashboard/dist/assets/{TimeAgo-Dz5TgZZZ.js.map → TimeAgo-BLjqlfoX.js.map} +1 -1
- package/dashboard/dist/assets/{TimestampCell-BUTgE244.js → TimestampCell-CnW0ENb5.js} +2 -2
- package/dashboard/dist/assets/{TimestampCell-BUTgE244.js.map → TimestampCell-CnW0ENb5.js.map} +1 -1
- package/dashboard/dist/assets/{ToolTestPanel-BS4g6vt-.js → ToolTestPanel-DkMgCB-k.js} +2 -2
- package/dashboard/dist/assets/{ToolTestPanel-BS4g6vt-.js.map → ToolTestPanel-DkMgCB-k.js.map} +1 -1
- package/dashboard/dist/assets/{TopicDetailPage-C_I6JIVD.js → TopicDetailPage-g3pljKKX.js} +2 -2
- package/dashboard/dist/assets/{TopicDetailPage-C_I6JIVD.js.map → TopicDetailPage-g3pljKKX.js.map} +1 -1
- package/dashboard/dist/assets/{TopicsPage-Cr6-wfhJ.js → TopicsPage-CVcCYdy-.js} +2 -2
- package/dashboard/dist/assets/{TopicsPage-Cr6-wfhJ.js.map → TopicsPage-CVcCYdy-.js.map} +1 -1
- package/dashboard/dist/assets/{UserName-ZFpWMaFF.js → UserName-D6zGIK2i.js} +2 -2
- package/dashboard/dist/assets/{UserName-ZFpWMaFF.js.map → UserName-D6zGIK2i.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowExecutionPage-ByPixDZW.js → WorkflowExecutionPage-B8g81FCJ.js} +2 -2
- package/dashboard/dist/assets/{WorkflowExecutionPage-ByPixDZW.js.map → WorkflowExecutionPage-B8g81FCJ.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowsDashboard-CWsJdMdR.js → WorkflowsDashboard-nxT3bv6W.js} +2 -2
- package/dashboard/dist/assets/{WorkflowsDashboard-CWsJdMdR.js.map → WorkflowsDashboard-nxT3bv6W.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowsOverview-Dk9gyqZN.js → WorkflowsOverview-grI-KAI2.js} +2 -2
- package/dashboard/dist/assets/{WorkflowsOverview-Dk9gyqZN.js.map → WorkflowsOverview-grI-KAI2.js.map} +1 -1
- package/dashboard/dist/assets/{YamlWorkflowDetailPage-CHwcrsaT.js → YamlWorkflowDetailPage-BoZ-hfBE.js} +2 -2
- package/dashboard/dist/assets/{YamlWorkflowDetailPage-CHwcrsaT.js.map → YamlWorkflowDetailPage-BoZ-hfBE.js.map} +1 -1
- package/dashboard/dist/assets/{YamlWorkflowsPage-B5jRX2Ph.js → YamlWorkflowsPage-Bf04rwRv.js} +2 -2
- package/dashboard/dist/assets/{YamlWorkflowsPage-B5jRX2Ph.js.map → YamlWorkflowsPage-Bf04rwRv.js.map} +1 -1
- package/dashboard/dist/assets/{agents-Dd7E-27d.js → agents-Dphpdi8l.js} +2 -2
- package/dashboard/dist/assets/{agents-Dd7E-27d.js.map → agents-Dphpdi8l.js.map} +1 -1
- package/dashboard/dist/assets/{bots-CpaYjZTk.js → bots-DIFE298x.js} +2 -2
- package/dashboard/dist/assets/{bots-CpaYjZTk.js.map → bots-DIFE298x.js.map} +1 -1
- package/dashboard/dist/assets/{capabilities-CNjg_qv1.js → capabilities-D7Y7LClY.js} +2 -2
- package/dashboard/dist/assets/{capabilities-CNjg_qv1.js.map → capabilities-D7Y7LClY.js.map} +1 -1
- package/dashboard/dist/assets/{controlplane-DgmvnAtU.js → controlplane-D1TGcYsS.js} +2 -2
- package/dashboard/dist/assets/{controlplane-DgmvnAtU.js.map → controlplane-D1TGcYsS.js.map} +1 -1
- package/dashboard/dist/assets/{escalation-columns-Uj4U9g5H.js → escalation-columns-cwZE6xyo.js} +2 -2
- package/dashboard/dist/assets/{escalation-columns-Uj4U9g5H.js.map → escalation-columns-cwZE6xyo.js.map} +1 -1
- package/dashboard/dist/assets/{index-x5z73M9N.js → index-BzYcUPdD.js} +2 -2
- package/dashboard/dist/assets/{index-x5z73M9N.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-RIFT3RlO.js → index-ChV7pBjM.js} +2 -2
- package/dashboard/dist/assets/{index-RIFT3RlO.js.map → index-ChV7pBjM.js.map} +1 -1
- package/dashboard/dist/assets/{index-OfO0173w.js → index-CniRa65p.js} +2 -2
- package/dashboard/dist/assets/{index-OfO0173w.js.map → index-CniRa65p.js.map} +1 -1
- package/dashboard/dist/assets/{index-ByBy9M3L.js → index-CxdjT1Yk.js} +2 -2
- package/dashboard/dist/assets/{index-ByBy9M3L.js.map → index-CxdjT1Yk.js.map} +1 -1
- package/dashboard/dist/assets/{index-C_K7OlzT.js → index-DAvi5_2T.js} +2 -2
- package/dashboard/dist/assets/{index-C_K7OlzT.js.map → index-DAvi5_2T.js.map} +1 -1
- package/dashboard/dist/assets/{index-BrwqtXRh.js → index-DN-kX7hL.js} +2 -2
- package/dashboard/dist/assets/{index-BrwqtXRh.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-D4Dlznn9.js → index-DpKOr311.js} +2 -2
- package/dashboard/dist/assets/{index-D4Dlznn9.js.map → index-DpKOr311.js.map} +1 -1
- package/dashboard/dist/assets/{index-CnOvJz6U.js → index-Dy1wWu2e.js} +2 -2
- package/dashboard/dist/assets/{index-CnOvJz6U.js.map → index-Dy1wWu2e.js.map} +1 -1
- package/dashboard/dist/assets/{index-BT1Ms5Q5.js → index-HLu98Sqh.js} +2 -2
- package/dashboard/dist/assets/{index-BT1Ms5Q5.js.map → index-HLu98Sqh.js.map} +1 -1
- package/dashboard/dist/assets/{index-BFASQ7_X.js → index-ag2pCAPu.js} +2 -2
- package/dashboard/dist/assets/{index-BFASQ7_X.js.map → index-ag2pCAPu.js.map} +1 -1
- package/dashboard/dist/assets/{index-BsHVgWH6.js → index-gkxPN7Vx.js} +2 -2
- package/dashboard/dist/assets/{index-BsHVgWH6.js.map → index-gkxPN7Vx.js.map} +1 -1
- package/dashboard/dist/assets/index-m9A3UYst.css +1 -0
- package/dashboard/dist/assets/{knowledge-Cci_r6Kl.js → knowledge-DnMs-SOJ.js} +2 -2
- package/dashboard/dist/assets/{knowledge-Cci_r6Kl.js.map → knowledge-DnMs-SOJ.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-NY4iL0L-.js → mcp-CwW-K3r4.js} +2 -2
- package/dashboard/dist/assets/{mcp-NY4iL0L-.js.map → mcp-CwW-K3r4.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-query-CbvZo_I_.js → mcp-query-BZt5e8_Q.js} +2 -2
- package/dashboard/dist/assets/{mcp-query-CbvZo_I_.js.map → mcp-query-BZt5e8_Q.js.map} +1 -1
- package/dashboard/dist/assets/{personas-Fy-f7QQd.js → personas-UA-Xn60f.js} +2 -2
- package/dashboard/dist/assets/{personas-Fy-f7QQd.js.map → personas-UA-Xn60f.js.map} +1 -1
- package/dashboard/dist/assets/{pipelines-DKiuozxV.js → pipelines-Cu3PARum.js} +2 -2
- package/dashboard/dist/assets/{pipelines-DKiuozxV.js.map → pipelines-Cu3PARum.js.map} +1 -1
- package/dashboard/dist/assets/{tasks-CdM1Rkk9.js → tasks-BO6h8GJE.js} +2 -2
- package/dashboard/dist/assets/{tasks-CdM1Rkk9.js.map → tasks-BO6h8GJE.js.map} +1 -1
- package/dashboard/dist/assets/{topics-XNy2mf3n.js → topics-CWjCR-17.js} +2 -2
- package/dashboard/dist/assets/{topics-XNy2mf3n.js.map → topics-CWjCR-17.js.map} +1 -1
- package/dashboard/dist/assets/{useDebouncedValue-CyGcU3_S.js → useDebouncedValue-6t0jx1RB.js} +2 -2
- package/dashboard/dist/assets/{useDebouncedValue-CyGcU3_S.js.map → useDebouncedValue-6t0jx1RB.js.map} +1 -1
- package/dashboard/dist/assets/{useNamespace-C2RIh_IN.js → useNamespace-CqpoQx6D.js} +2 -2
- package/dashboard/dist/assets/{useNamespace-C2RIh_IN.js.map → useNamespace-CqpoQx6D.js.map} +1 -1
- package/dashboard/dist/assets/{useYamlActivityEvents-CDiV5fjf.js → useYamlActivityEvents-hmCQQwzB.js} +2 -2
- package/dashboard/dist/assets/{useYamlActivityEvents-CDiV5fjf.js.map → useYamlActivityEvents-hmCQQwzB.js.map} +1 -1
- package/dashboard/dist/assets/{validate-DcGWN82Y.js → validate-BIRn4a6d.js} +2 -2
- package/dashboard/dist/assets/{validate-DcGWN82Y.js.map → validate-BIRn4a6d.js.map} +1 -1
- package/dashboard/dist/assets/{yaml-workflows-CH8UrouH.js → yaml-workflows-ziUdZhKY.js} +2 -2
- package/dashboard/dist/assets/{yaml-workflows-CH8UrouH.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 +3 -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 +8 -5
- 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 +2 -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/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/iam.md +7 -5
- package/docs/maintenance.md +51 -28
- package/docs/mcp.md +159 -210
- package/docs/oauth-and-delegation.md +32 -21
- package/docs/topics.md +2 -0
- package/docs/workflows.md +14 -112
- package/package.json +5 -3
- package/dashboard/dist/assets/ConfirmDeleteModal-DW4DrPur.js +0 -2
- package/dashboard/dist/assets/ConfirmDeleteModal-DW4DrPur.js.map +0 -1
- package/dashboard/dist/assets/ProcessDetailPage-DNgCIwRl.js +0 -2
- package/dashboard/dist/assets/ResolverForm-CKIOAGtY.js +0 -8
- package/dashboard/dist/assets/ResolverForm-CKIOAGtY.js.map +0 -1
- package/dashboard/dist/assets/index-CtlBjl8o.js +0 -2
- package/dashboard/dist/assets/index-CtlBjl8o.js.map +0 -1
- package/dashboard/dist/assets/index-LRYC__mE.js +0 -67
- package/dashboard/dist/assets/index-LRYC__mE.js.map +0 -1
- package/dashboard/dist/assets/index-MYI2_Xb3.css +0 -1
package/build/api/settings.js
CHANGED
|
@@ -10,6 +10,7 @@ const config_1 = require("../modules/config");
|
|
|
10
10
|
const features_1 = require("../modules/features");
|
|
11
11
|
const search_1 = require("../modules/search");
|
|
12
12
|
const branding_1 = require("../modules/branding");
|
|
13
|
+
const oauth_server_1 = require("../modules/oauth-server");
|
|
13
14
|
const display_1 = require("../modules/display");
|
|
14
15
|
const version_1 = require("../modules/version");
|
|
15
16
|
const sso_1 = require("../modules/sso");
|
|
@@ -66,6 +67,12 @@ async function getSettings(req) {
|
|
|
66
67
|
events: {
|
|
67
68
|
transport,
|
|
68
69
|
natsWsUrl: natsAdapter ? resolveNatsWsUrl(natsAdapter, req) : null,
|
|
70
|
+
reconnect: {
|
|
71
|
+
initialDelayMs: config_1.config.NATS_RECONNECT_INITIAL_MS,
|
|
72
|
+
maxDelayMs: config_1.config.NATS_RECONNECT_MAX_MS,
|
|
73
|
+
noticeAfterMs: config_1.config.NATS_LIVE_NOTICE_AFTER_MS,
|
|
74
|
+
spreadMs: config_1.config.NATS_RECONNECT_SPREAD_MS,
|
|
75
|
+
},
|
|
69
76
|
},
|
|
70
77
|
auth: {
|
|
71
78
|
sso: (0, sso_1.isSSOEnabled)(),
|
|
@@ -73,6 +80,8 @@ async function getSettings(req) {
|
|
|
73
80
|
// Session keepalive dials for the SPA (null = no keepalive / no idle gate).
|
|
74
81
|
ssoKeepaliveSeconds: (0, sso_1.getSSOConfig)()?.keepaliveSeconds ?? null,
|
|
75
82
|
ssoKeepaliveIdleTimeoutSeconds: (0, sso_1.getSSOConfig)()?.keepaliveIdleTimeoutSeconds ?? null,
|
|
83
|
+
// The OAuth authorization server for MCP clients (Connected apps).
|
|
84
|
+
oauthServer: (0, oauth_server_1.getOAuthServerSettings)() !== null,
|
|
76
85
|
},
|
|
77
86
|
ai: {
|
|
78
87
|
enabled: (0, llm_1.hasLLMApiKey)(),
|
package/build/api/tasks.d.ts
CHANGED
|
@@ -47,7 +47,7 @@ export declare function listTasks(input: {
|
|
|
47
47
|
origin_id?: string;
|
|
48
48
|
limit?: number;
|
|
49
49
|
offset?: number;
|
|
50
|
-
}): Promise<LTApiResult>;
|
|
50
|
+
}, auth?: LTApiAuth): Promise<LTApiResult>;
|
|
51
51
|
/**
|
|
52
52
|
* Return aggregate process statistics.
|
|
53
53
|
*
|
|
@@ -82,7 +82,7 @@ export declare function listProcesses(input: {
|
|
|
82
82
|
*/
|
|
83
83
|
export declare function getProcess(input: {
|
|
84
84
|
originId: string;
|
|
85
|
-
}): Promise<LTApiResult>;
|
|
85
|
+
}, auth?: LTApiAuth): Promise<LTApiResult>;
|
|
86
86
|
/**
|
|
87
87
|
* Get a single task by ID.
|
|
88
88
|
*
|
|
@@ -91,4 +91,4 @@ export declare function getProcess(input: {
|
|
|
91
91
|
*/
|
|
92
92
|
export declare function getTask(input: {
|
|
93
93
|
id: string;
|
|
94
|
-
}): Promise<LTApiResult>;
|
|
94
|
+
}, auth?: LTApiAuth): Promise<LTApiResult>;
|
package/build/api/tasks.js
CHANGED
|
@@ -41,6 +41,24 @@ exports.getProcess = getProcess;
|
|
|
41
41
|
exports.getTask = getTask;
|
|
42
42
|
const taskService = __importStar(require("../services/task"));
|
|
43
43
|
const escalationService = __importStar(require("../services/escalation"));
|
|
44
|
+
const helpers_1 = require("./escalations/helpers");
|
|
45
|
+
const capabilities_1 = require("../modules/capabilities");
|
|
46
|
+
/**
|
|
47
|
+
* How a caller sees task rows. A builder, and the person a run was started by
|
|
48
|
+
* or runs as, see the whole row; anyone else sees it without the run's input
|
|
49
|
+
* (`envelope`), output (`data`) and `metadata`. An in-process call (no auth)
|
|
50
|
+
* sees whole rows.
|
|
51
|
+
*/
|
|
52
|
+
async function taskViewFor(auth) {
|
|
53
|
+
if (!auth?.userId || (await (0, capabilities_1.mayBuild)(auth)))
|
|
54
|
+
return (task) => task;
|
|
55
|
+
return (task) => {
|
|
56
|
+
if (task.initiated_by === auth.userId || task.executing_as === auth.userId)
|
|
57
|
+
return task;
|
|
58
|
+
const { envelope: _envelope, data: _data, metadata: _metadata, ...rest } = task;
|
|
59
|
+
return rest;
|
|
60
|
+
};
|
|
61
|
+
}
|
|
44
62
|
/**
|
|
45
63
|
* Create a task record.
|
|
46
64
|
*
|
|
@@ -104,10 +122,10 @@ async function createTask(input, auth) {
|
|
|
104
122
|
* @param input.offset — pagination offset (default: 0)
|
|
105
123
|
* @returns `{ status: 200, data: { tasks, total } }`
|
|
106
124
|
*/
|
|
107
|
-
async function listTasks(input) {
|
|
125
|
+
async function listTasks(input, auth) {
|
|
108
126
|
try {
|
|
109
|
-
const result = await taskService.listTasks(input);
|
|
110
|
-
return { status: 200, data: result };
|
|
127
|
+
const [result, view] = await Promise.all([taskService.listTasks(input), taskViewFor(auth)]);
|
|
128
|
+
return { status: 200, data: { ...result, tasks: result.tasks.map(view) } };
|
|
111
129
|
}
|
|
112
130
|
catch (err) {
|
|
113
131
|
return { status: 500, error: err.message };
|
|
@@ -153,12 +171,17 @@ async function listProcesses(input) {
|
|
|
153
171
|
* @param input.originId — root process origin ID
|
|
154
172
|
* @returns `{ status: 200, data: { origin_id, tasks, escalations } }`
|
|
155
173
|
*/
|
|
156
|
-
async function getProcess(input) {
|
|
174
|
+
async function getProcess(input, auth) {
|
|
157
175
|
try {
|
|
158
|
-
const [
|
|
176
|
+
const [rows, all, view] = await Promise.all([
|
|
159
177
|
taskService.getProcessTasks(input.originId),
|
|
160
178
|
escalationService.getEscalationsByOriginId(input.originId),
|
|
179
|
+
taskViewFor(auth),
|
|
161
180
|
]);
|
|
181
|
+
const tasks = rows.map(view);
|
|
182
|
+
// With a caller, only the escalations that caller may read.
|
|
183
|
+
const scope = auth?.userId ? await (0, helpers_1.getEscalationReadScope)(auth.userId) : null;
|
|
184
|
+
const escalations = scope ? all.filter((e) => (0, helpers_1.scopeAdmits)(scope, auth.userId, e)) : all;
|
|
162
185
|
return {
|
|
163
186
|
status: 200,
|
|
164
187
|
data: { origin_id: input.originId, tasks, escalations },
|
|
@@ -174,13 +197,13 @@ async function getProcess(input) {
|
|
|
174
197
|
* @param input.id — task UUID
|
|
175
198
|
* @returns `{ status: 200, data: <task record> }` or 404
|
|
176
199
|
*/
|
|
177
|
-
async function getTask(input) {
|
|
200
|
+
async function getTask(input, auth) {
|
|
178
201
|
try {
|
|
179
202
|
const task = await taskService.getTask(input.id);
|
|
180
203
|
if (!task) {
|
|
181
204
|
return { status: 404, error: 'Task not found' };
|
|
182
205
|
}
|
|
183
|
-
return { status: 200, data: task };
|
|
206
|
+
return { status: 200, data: (await taskViewFor(auth))(task) };
|
|
184
207
|
}
|
|
185
208
|
catch (err) {
|
|
186
209
|
return { status: 500, error: err.message };
|
|
@@ -57,7 +57,7 @@ async function getWorkflowInputLookups(input, auth) {
|
|
|
57
57
|
return { status: 404, error: 'Workflow config not found' };
|
|
58
58
|
}
|
|
59
59
|
const user = auth.userId ? await userService.getUser(auth.userId) : null;
|
|
60
|
-
if (!(0, invocation_access_1.canInvokeWorkflow)(config, user?.roles ?? []
|
|
60
|
+
if (!(0, invocation_access_1.canInvokeWorkflow)(config, user?.roles ?? [])) {
|
|
61
61
|
return { status: 403, error: 'Not authorized to invoke this workflow' };
|
|
62
62
|
}
|
|
63
63
|
const lookups = await (0, knowledge_1.resolveLookupRefs)(config.input_lookups ?? []);
|
|
@@ -88,9 +88,9 @@ async function listInvocableWorkflows(auth) {
|
|
|
88
88
|
]);
|
|
89
89
|
const roles = user?.roles ?? [];
|
|
90
90
|
const workflows = configs
|
|
91
|
-
.filter((c) => (0, invocation_access_1.canInvokeWorkflow)(c, roles
|
|
91
|
+
.filter((c) => (0, invocation_access_1.canInvokeWorkflow)(c, roles))
|
|
92
92
|
.map((c) => ({ ...c, tier: tierOf(c) }));
|
|
93
|
-
if ((0, invocation_access_1.hasGlobalInvocationAccess)(roles
|
|
93
|
+
if ((0, invocation_access_1.hasGlobalInvocationAccess)(roles)) {
|
|
94
94
|
const registered = new Set(configs.map((c) => c.workflow_type));
|
|
95
95
|
for (const [name, { taskQueue }] of (0, registry_1.getRegisteredWorkers)()) {
|
|
96
96
|
if (registered.has(name) || registry_1.SYSTEM_WORKFLOWS.has(name))
|
|
@@ -62,7 +62,7 @@ function isResolveError(err) {
|
|
|
62
62
|
*/
|
|
63
63
|
async function invokeWorkflow(input, auth) {
|
|
64
64
|
try {
|
|
65
|
-
await (0, workflow_invocation_1.
|
|
65
|
+
await (0, workflow_invocation_1.authorizeInvocation)({ workflowType: input.type, userId: auth.userId, executeAs: input.execute_as });
|
|
66
66
|
const config = await configService.getWorkflowConfig(input.type);
|
|
67
67
|
const violation = await (0, input_validation_1.checkInvokeInput)(config, input.data, input.metadata);
|
|
68
68
|
if (violation)
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { LTApiResult } from '../../types/sdk';
|
|
1
|
+
import type { LTApiAuth, LTApiResult } from '../../types/sdk';
|
|
2
2
|
/**
|
|
3
3
|
* Set or update the cron schedule for a YAML workflow.
|
|
4
4
|
*
|
|
@@ -9,6 +9,7 @@ import type { LTApiResult } from '../../types/sdk';
|
|
|
9
9
|
* @param input.cron_schedule — cron expression (e.g. "0 * * * *")
|
|
10
10
|
* @param input.cron_envelope — optional payload passed to each scheduled invocation
|
|
11
11
|
* @param input.execute_as — optional identity override for scheduled executions
|
|
12
|
+
* @param auth - the scheduling caller; the run identity must be able to call every built-in tool the workflow uses
|
|
12
13
|
* @returns `{ status: 200, data: YamlWorkflow }` the updated workflow record with cron fields set
|
|
13
14
|
*/
|
|
14
15
|
export declare function setCronSchedule(input: {
|
|
@@ -16,7 +17,7 @@ export declare function setCronSchedule(input: {
|
|
|
16
17
|
cron_schedule: string;
|
|
17
18
|
cron_envelope?: any;
|
|
18
19
|
execute_as?: string;
|
|
19
|
-
}): Promise<LTApiResult>;
|
|
20
|
+
}, auth?: LTApiAuth): Promise<LTApiResult>;
|
|
20
21
|
/**
|
|
21
22
|
* Remove the cron schedule from a YAML workflow.
|
|
22
23
|
*
|
|
@@ -38,6 +38,7 @@ exports.clearCronSchedule = clearCronSchedule;
|
|
|
38
38
|
exports.getCronStatus = getCronStatus;
|
|
39
39
|
const yamlDb = __importStar(require("../../services/yaml-workflow/db"));
|
|
40
40
|
const cron_1 = require("../../services/cron");
|
|
41
|
+
const deploy_1 = require("./deploy");
|
|
41
42
|
const helpers_1 = require("./helpers");
|
|
42
43
|
/**
|
|
43
44
|
* Set or update the cron schedule for a YAML workflow.
|
|
@@ -49,14 +50,18 @@ const helpers_1 = require("./helpers");
|
|
|
49
50
|
* @param input.cron_schedule — cron expression (e.g. "0 * * * *")
|
|
50
51
|
* @param input.cron_envelope — optional payload passed to each scheduled invocation
|
|
51
52
|
* @param input.execute_as — optional identity override for scheduled executions
|
|
53
|
+
* @param auth - the scheduling caller; the run identity must be able to call every built-in tool the workflow uses
|
|
52
54
|
* @returns `{ status: 200, data: YamlWorkflow }` the updated workflow record with cron fields set
|
|
53
55
|
*/
|
|
54
|
-
async function setCronSchedule(input) {
|
|
56
|
+
async function setCronSchedule(input, auth) {
|
|
55
57
|
try {
|
|
56
58
|
const wf = await yamlDb.getYamlWorkflow(input.id);
|
|
57
59
|
if (!wf) {
|
|
58
60
|
return { status: 404, error: 'YAML workflow not found' };
|
|
59
61
|
}
|
|
62
|
+
const refused = await (0, deploy_1.invokeRefusal)(wf, auth, input.execute_as);
|
|
63
|
+
if (refused)
|
|
64
|
+
return refused;
|
|
60
65
|
if (!input.cron_schedule || typeof input.cron_schedule !== 'string') {
|
|
61
66
|
return { status: 400, error: 'cron_schedule is required' };
|
|
62
67
|
}
|
|
@@ -1,3 +1,16 @@
|
|
|
1
|
+
import type { LTYamlWorkflowRecord } from '../../types/yaml-workflow';
|
|
2
|
+
/**
|
|
3
|
+
* Deploying or activating a compiled workflow needs the caller to be able to
|
|
4
|
+
* call every built-in tool it uses: automation never does more than its
|
|
5
|
+
* author may. Null when allowed; without a caller (in-process), allowed.
|
|
6
|
+
*/
|
|
7
|
+
export declare function deployRefusal(wf: LTYamlWorkflowRecord, auth: LTApiAuth | undefined): Promise<LTApiResult | null>;
|
|
8
|
+
/**
|
|
9
|
+
* Invoking or scheduling a compiled workflow needs the identity it runs as
|
|
10
|
+
* (execute_as, else the caller) to be able to call every built-in tool it
|
|
11
|
+
* uses. Without a caller (in-process), allowed.
|
|
12
|
+
*/
|
|
13
|
+
export declare function invokeRefusal(wf: LTYamlWorkflowRecord, auth: LTApiAuth | undefined, executeAs?: string): Promise<LTApiResult | null>;
|
|
1
14
|
import type { LTApiResult, LTApiAuth } from '../../types/sdk';
|
|
2
15
|
/**
|
|
3
16
|
* Deploy a YAML workflow and all sibling workflows sharing its app_id namespace.
|
|
@@ -11,7 +24,7 @@ import type { LTApiResult, LTApiAuth } from '../../types/sdk';
|
|
|
11
24
|
*/
|
|
12
25
|
export declare function deployYamlWorkflow(input: {
|
|
13
26
|
id: string;
|
|
14
|
-
}): Promise<LTApiResult>;
|
|
27
|
+
}, auth?: LTApiAuth): Promise<LTApiResult>;
|
|
15
28
|
/**
|
|
16
29
|
* Activate a previously deployed YAML workflow and its app_id siblings.
|
|
17
30
|
*
|
|
@@ -24,7 +37,7 @@ export declare function deployYamlWorkflow(input: {
|
|
|
24
37
|
*/
|
|
25
38
|
export declare function activateYamlWorkflow(input: {
|
|
26
39
|
id: string;
|
|
27
|
-
}): Promise<LTApiResult>;
|
|
40
|
+
}, auth?: LTApiAuth): Promise<LTApiResult>;
|
|
28
41
|
/**
|
|
29
42
|
* Invoke an active YAML workflow, executing its DAG pipeline.
|
|
30
43
|
*
|
|
@@ -33,6 +33,8 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
33
33
|
};
|
|
34
34
|
})();
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.deployRefusal = deployRefusal;
|
|
37
|
+
exports.invokeRefusal = invokeRefusal;
|
|
36
38
|
exports.deployYamlWorkflow = deployYamlWorkflow;
|
|
37
39
|
exports.activateYamlWorkflow = activateYamlWorkflow;
|
|
38
40
|
exports.invokeYamlWorkflow = invokeYamlWorkflow;
|
|
@@ -42,6 +44,55 @@ const yamlDb = __importStar(require("../../services/yaml-workflow/db"));
|
|
|
42
44
|
const yamlDeployer = __importStar(require("../../services/yaml-workflow/deployer"));
|
|
43
45
|
const yamlWorkers = __importStar(require("../../services/yaml-workflow/workers"));
|
|
44
46
|
const invoke_1 = require("../../services/yaml-workflow/invoke");
|
|
47
|
+
const workflow_invocation_1 = require("../../services/workflow-invocation");
|
|
48
|
+
const capabilities_1 = require("../../modules/capabilities");
|
|
49
|
+
const userService = __importStar(require("../../services/user"));
|
|
50
|
+
const uuid_1 = require("../../lib/uuid");
|
|
51
|
+
const tools_1 = require("../mcp/tools");
|
|
52
|
+
/**
|
|
53
|
+
* A refusal when the person cannot call every built-in tool these workflows'
|
|
54
|
+
* steps use; null when they can. Steps run as the invoker under each tool's
|
|
55
|
+
* gate, so this answers up front what the run would refuse step by step.
|
|
56
|
+
*/
|
|
57
|
+
async function toolStepRefusal(workflows, userId) {
|
|
58
|
+
const access = (0, capabilities_1.capabilityAccess)({ userId });
|
|
59
|
+
for (const step of workflows.flatMap((w) => w.activity_manifest ?? [])) {
|
|
60
|
+
if (step.tool_source !== 'mcp' || !step.mcp_server_id || !step.mcp_tool_name)
|
|
61
|
+
continue;
|
|
62
|
+
const builtin = await (0, tools_1.builtinServerFor)(step.mcp_server_id);
|
|
63
|
+
if (builtin && !(await access((0, tools_1.builtinToolGate)(builtin, step.mcp_tool_name)))) {
|
|
64
|
+
return { status: 403, error: `Forbidden: this workflow calls ${step.mcp_tool_name}, which is not available to you` };
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
return null;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Deploying or activating a compiled workflow needs the caller to be able to
|
|
71
|
+
* call every built-in tool it uses: automation never does more than its
|
|
72
|
+
* author may. Null when allowed; without a caller (in-process), allowed.
|
|
73
|
+
*/
|
|
74
|
+
async function deployRefusal(wf, auth) {
|
|
75
|
+
if (!auth?.userId)
|
|
76
|
+
return null;
|
|
77
|
+
// A deploy publishes every workflow sharing the app id, so every one is checked.
|
|
78
|
+
const siblings = await yamlDb.listYamlWorkflowsByAppId(wf.app_id);
|
|
79
|
+
return toolStepRefusal([wf, ...siblings.filter((w) => w.id !== wf.id)], auth.userId);
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Invoking or scheduling a compiled workflow needs the identity it runs as
|
|
83
|
+
* (execute_as, else the caller) to be able to call every built-in tool it
|
|
84
|
+
* uses. Without a caller (in-process), allowed.
|
|
85
|
+
*/
|
|
86
|
+
async function invokeRefusal(wf, auth, executeAs) {
|
|
87
|
+
if (!auth?.userId)
|
|
88
|
+
return null;
|
|
89
|
+
if (!executeAs)
|
|
90
|
+
return toolStepRefusal([wf], auth.userId);
|
|
91
|
+
const runAs = (0, uuid_1.isUuid)(executeAs) ? await userService.getUser(executeAs) : await userService.getUserByExternalId(executeAs);
|
|
92
|
+
if (!runAs)
|
|
93
|
+
return { status: 404, error: `execute_as principal "${executeAs}" not found` };
|
|
94
|
+
return toolStepRefusal([wf], runAs.id);
|
|
95
|
+
}
|
|
45
96
|
const helpers_1 = require("./helpers");
|
|
46
97
|
/**
|
|
47
98
|
* Deploy a YAML workflow and all sibling workflows sharing its app_id namespace.
|
|
@@ -53,12 +104,15 @@ const helpers_1 = require("./helpers");
|
|
|
53
104
|
* @param input.id — UUID of the workflow to deploy
|
|
54
105
|
* @returns `{ status: 200, data: YamlWorkflow }` the refreshed workflow record after deployment
|
|
55
106
|
*/
|
|
56
|
-
async function deployYamlWorkflow(input) {
|
|
107
|
+
async function deployYamlWorkflow(input, auth) {
|
|
57
108
|
try {
|
|
58
109
|
const wf = await yamlDb.getYamlWorkflow(input.id);
|
|
59
110
|
if (!wf) {
|
|
60
111
|
return { status: 404, error: 'YAML workflow not found' };
|
|
61
112
|
}
|
|
113
|
+
const refused = await deployRefusal(wf, auth);
|
|
114
|
+
if (refused)
|
|
115
|
+
return refused;
|
|
62
116
|
// Compute the next app-level version for the namespace.
|
|
63
117
|
// Each deploy increments regardless of individual tool versions —
|
|
64
118
|
// adding a second tool (v1 of itself) to an app already at v1 produces app v2.
|
|
@@ -99,12 +153,15 @@ async function deployYamlWorkflow(input) {
|
|
|
99
153
|
* @param input.id — UUID of the workflow to activate
|
|
100
154
|
* @returns `{ status: 200, data: YamlWorkflow }` the refreshed workflow record after activation
|
|
101
155
|
*/
|
|
102
|
-
async function activateYamlWorkflow(input) {
|
|
156
|
+
async function activateYamlWorkflow(input, auth) {
|
|
103
157
|
try {
|
|
104
158
|
const wf = await yamlDb.getYamlWorkflow(input.id);
|
|
105
159
|
if (!wf) {
|
|
106
160
|
return { status: 404, error: 'YAML workflow not found' };
|
|
107
161
|
}
|
|
162
|
+
const refused = await deployRefusal(wf, auth);
|
|
163
|
+
if (refused)
|
|
164
|
+
return refused;
|
|
108
165
|
if (wf.status !== 'deployed' && wf.status !== 'active') {
|
|
109
166
|
return { status: 400, error: 'Workflow must be deployed before activation' };
|
|
110
167
|
}
|
|
@@ -151,6 +208,14 @@ async function invokeYamlWorkflow(input, auth) {
|
|
|
151
208
|
if (wf.status !== 'active') {
|
|
152
209
|
return { status: 400, error: 'Workflow must be active to invoke' };
|
|
153
210
|
}
|
|
211
|
+
if (input.execute_as) {
|
|
212
|
+
if (!auth?.userId)
|
|
213
|
+
return { status: 403, error: 'execute_as requires an authenticated caller' };
|
|
214
|
+
await (0, workflow_invocation_1.assertMayActAs)(auth.userId, input.execute_as);
|
|
215
|
+
}
|
|
216
|
+
const refused = await invokeRefusal(wf, auth, input.execute_as);
|
|
217
|
+
if (refused)
|
|
218
|
+
return refused;
|
|
154
219
|
const result = await (0, invoke_1.invokeYamlWorkflow)(wf, {
|
|
155
220
|
data: input.data,
|
|
156
221
|
sync: input.sync,
|
|
@@ -161,6 +226,8 @@ async function invokeYamlWorkflow(input, auth) {
|
|
|
161
226
|
return { status: 200, data: result };
|
|
162
227
|
}
|
|
163
228
|
catch (err) {
|
|
229
|
+
if (err instanceof workflow_invocation_1.InvocationError)
|
|
230
|
+
return { status: err.statusCode, error: err.message };
|
|
164
231
|
if ((0, helpers_1.isNotFoundError)(err)) {
|
|
165
232
|
return { status: 404, error: 'YAML workflow not found' };
|
|
166
233
|
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
-- Migration 038: OAuth authorization server for /mcp
|
|
2
|
+
--
|
|
3
|
+
-- MCP clients register, a person consents to a grant, and the client holds a
|
|
4
|
+
-- refresh token for that grant. Access tokens are self-contained JWTs and are
|
|
5
|
+
-- never stored. Codes and refresh tokens are stored as SHA-256 hashes.
|
|
6
|
+
|
|
7
|
+
CREATE TABLE IF NOT EXISTS lt_oauth_clients (
|
|
8
|
+
client_id TEXT PRIMARY KEY,
|
|
9
|
+
client_name TEXT,
|
|
10
|
+
redirect_uris TEXT[] NOT NULL,
|
|
11
|
+
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
|
12
|
+
);
|
|
13
|
+
|
|
14
|
+
-- A grant is one person's consent for one client. The policy is the rights
|
|
15
|
+
-- the person chose (a preset today); the scope is its coarse summary.
|
|
16
|
+
CREATE TABLE IF NOT EXISTS lt_oauth_grants (
|
|
17
|
+
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
18
|
+
user_id UUID NOT NULL REFERENCES lt_users(id) ON DELETE CASCADE,
|
|
19
|
+
client_id TEXT NOT NULL REFERENCES lt_oauth_clients(client_id) ON DELETE CASCADE,
|
|
20
|
+
policy JSONB NOT NULL,
|
|
21
|
+
scope TEXT NOT NULL,
|
|
22
|
+
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
23
|
+
revoked_at TIMESTAMPTZ
|
|
24
|
+
);
|
|
25
|
+
|
|
26
|
+
CREATE INDEX IF NOT EXISTS idx_lt_oauth_grants_user ON lt_oauth_grants (user_id);
|
|
27
|
+
|
|
28
|
+
CREATE TABLE IF NOT EXISTS lt_oauth_codes (
|
|
29
|
+
code_hash TEXT PRIMARY KEY,
|
|
30
|
+
grant_id UUID NOT NULL REFERENCES lt_oauth_grants(id) ON DELETE CASCADE,
|
|
31
|
+
redirect_uri TEXT NOT NULL,
|
|
32
|
+
code_challenge TEXT NOT NULL,
|
|
33
|
+
resource TEXT,
|
|
34
|
+
expires_at TIMESTAMPTZ NOT NULL,
|
|
35
|
+
used_at TIMESTAMPTZ
|
|
36
|
+
);
|
|
37
|
+
|
|
38
|
+
CREATE TABLE IF NOT EXISTS lt_oauth_refresh_tokens (
|
|
39
|
+
token_hash TEXT PRIMARY KEY,
|
|
40
|
+
grant_id UUID NOT NULL REFERENCES lt_oauth_grants(id) ON DELETE CASCADE,
|
|
41
|
+
expires_at TIMESTAMPTZ NOT NULL,
|
|
42
|
+
used_at TIMESTAMPTZ,
|
|
43
|
+
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
|
44
|
+
);
|
|
45
|
+
|
|
46
|
+
CREATE INDEX IF NOT EXISTS idx_lt_oauth_refresh_tokens_grant ON lt_oauth_refresh_tokens (grant_id);
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
-- Migration 039: single-use NATS WebSocket proxy tickets
|
|
2
|
+
--
|
|
3
|
+
-- A ticket admits one upgrade. The proxy records its id here when it is
|
|
4
|
+
-- spent; a second upgrade with the same ticket finds the row and is refused.
|
|
5
|
+
-- Rows are kept until the ticket expires.
|
|
6
|
+
|
|
7
|
+
CREATE TABLE IF NOT EXISTS lt_nats_ws_tickets (
|
|
8
|
+
jti TEXT PRIMARY KEY,
|
|
9
|
+
expires_at TIMESTAMPTZ NOT NULL
|
|
10
|
+
);
|
|
11
|
+
|
|
12
|
+
CREATE INDEX IF NOT EXISTS idx_lt_nats_ws_tickets_expires ON lt_nats_ws_tickets (expires_at);
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { LTEvent } from '../../types';
|
|
2
|
+
/** Escalation event fields a browser needs to route a refresh and follow a claim. */
|
|
3
|
+
export declare const BROWSER_ESCALATION_FIELDS: readonly ["id", "type", "subtype", "status", "priority", "role", "assigned_to", "assigned_until", "workflow_id", "workflow_type", "origin_id", "task_id", "parent_id", "resolved_at", "claimed_at", "bulk", "from_role", "to_role", "reassigned_from"];
|
|
4
|
+
export interface BrowserViewer {
|
|
5
|
+
builder: boolean;
|
|
6
|
+
}
|
|
7
|
+
/** The event as this viewer receives it. */
|
|
8
|
+
export declare function eventForViewer(event: LTEvent, viewer: BrowserViewer): LTEvent;
|
|
9
|
+
/**
|
|
10
|
+
* Rewrite one serialized event for a viewer who is not a builder. A payload
|
|
11
|
+
* that is not an event is withheld (null).
|
|
12
|
+
*/
|
|
13
|
+
export declare function payloadForViewer(payload: Buffer, viewer: BrowserViewer): Buffer | null;
|
|
14
|
+
/** Whether a person is a builder, looked up lazily to keep lib free of an import cycle. */
|
|
15
|
+
export declare function viewerFor(userId: string | null | undefined): Promise<BrowserViewer>;
|
|
16
|
+
/**
|
|
17
|
+
* How a connection holder sees events, or null when the account is gone or
|
|
18
|
+
* not active. Looked up lazily to keep lib free of an import cycle.
|
|
19
|
+
*/
|
|
20
|
+
export declare function holderView(userId: string): Promise<BrowserViewer | null>;
|
|
@@ -0,0 +1,117 @@
|
|
|
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.BROWSER_ESCALATION_FIELDS = void 0;
|
|
37
|
+
exports.eventForViewer = eventForViewer;
|
|
38
|
+
exports.payloadForViewer = payloadForViewer;
|
|
39
|
+
exports.viewerFor = viewerFor;
|
|
40
|
+
exports.holderView = holderView;
|
|
41
|
+
/**
|
|
42
|
+
* What a browser receives of an event. Builders receive events whole. Anyone
|
|
43
|
+
* else receives enough to route and refresh: escalation events keep their
|
|
44
|
+
* routing fields, and every other event arrives without `data` and
|
|
45
|
+
* `milestones`. Full records are read through the scoped API, by id.
|
|
46
|
+
*
|
|
47
|
+
* Server-side consumers (agent triggers, callbacks) are unaffected: this view
|
|
48
|
+
* applies only where events leave for a browser.
|
|
49
|
+
*/
|
|
50
|
+
const ESCALATION_SUBJECT = 'system.escalation.';
|
|
51
|
+
const ACTIVE_ACCOUNT = 'active';
|
|
52
|
+
/** Escalation event fields a browser needs to route a refresh and follow a claim. */
|
|
53
|
+
exports.BROWSER_ESCALATION_FIELDS = [
|
|
54
|
+
'id', 'type', 'subtype', 'status', 'priority', 'role',
|
|
55
|
+
'assigned_to', 'assigned_until', 'workflow_id', 'workflow_type',
|
|
56
|
+
'origin_id', 'task_id', 'parent_id', 'resolved_at', 'claimed_at',
|
|
57
|
+
'bulk', 'from_role', 'to_role', 'reassigned_from',
|
|
58
|
+
];
|
|
59
|
+
/** The event as this viewer receives it. */
|
|
60
|
+
function eventForViewer(event, viewer) {
|
|
61
|
+
if (viewer.builder)
|
|
62
|
+
return event;
|
|
63
|
+
const { data, milestones: _milestones, ...rest } = event;
|
|
64
|
+
if (typeof event.type === 'string' && event.type.startsWith(ESCALATION_SUBJECT) && data) {
|
|
65
|
+
const kept = {};
|
|
66
|
+
for (const key of exports.BROWSER_ESCALATION_FIELDS) {
|
|
67
|
+
if (data[key] !== undefined)
|
|
68
|
+
kept[key] = data[key];
|
|
69
|
+
}
|
|
70
|
+
return { ...rest, data: kept };
|
|
71
|
+
}
|
|
72
|
+
return rest;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Rewrite one serialized event for a viewer who is not a builder. A payload
|
|
76
|
+
* that is not an event is withheld (null).
|
|
77
|
+
*/
|
|
78
|
+
function payloadForViewer(payload, viewer) {
|
|
79
|
+
if (viewer.builder)
|
|
80
|
+
return payload;
|
|
81
|
+
let event;
|
|
82
|
+
try {
|
|
83
|
+
event = JSON.parse(payload.toString('utf8'));
|
|
84
|
+
}
|
|
85
|
+
catch {
|
|
86
|
+
return null;
|
|
87
|
+
}
|
|
88
|
+
if (!event || typeof event !== 'object' || typeof event.type !== 'string')
|
|
89
|
+
return null;
|
|
90
|
+
return Buffer.from(JSON.stringify(eventForViewer(event, viewer)), 'utf8');
|
|
91
|
+
}
|
|
92
|
+
/** Whether a person is a builder, looked up lazily to keep lib free of an import cycle. */
|
|
93
|
+
async function viewerFor(userId) {
|
|
94
|
+
if (!userId)
|
|
95
|
+
return { builder: false };
|
|
96
|
+
try {
|
|
97
|
+
const { mayBuild } = await Promise.resolve().then(() => __importStar(require('../../modules/capabilities')));
|
|
98
|
+
return { builder: await mayBuild({ userId }) };
|
|
99
|
+
}
|
|
100
|
+
catch {
|
|
101
|
+
return { builder: false };
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* How a connection holder sees events, or null when the account is gone or
|
|
106
|
+
* not active. Looked up lazily to keep lib free of an import cycle.
|
|
107
|
+
*/
|
|
108
|
+
async function holderView(userId) {
|
|
109
|
+
const [{ getUser, getUserByExternalId }, { isUuid }] = await Promise.all([
|
|
110
|
+
Promise.resolve().then(() => __importStar(require('../../services/user'))),
|
|
111
|
+
Promise.resolve().then(() => __importStar(require('../uuid'))),
|
|
112
|
+
]);
|
|
113
|
+
const user = isUuid(userId) ? await getUser(userId) : await getUserByExternalId(userId);
|
|
114
|
+
if (!user || user.status !== ACTIVE_ACCOUNT)
|
|
115
|
+
return null;
|
|
116
|
+
return viewerFor(user.id);
|
|
117
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The browser's half of a NATS connection, as the WebSocket proxy forwards
|
|
3
|
+
* it. A browser only subscribes, so the proxy authenticates the connection
|
|
4
|
+
* itself and lets the browser read, never publish:
|
|
5
|
+
*
|
|
6
|
+
* - CONNECT is rewritten to carry the server's credential (the browser is
|
|
7
|
+
* never given it), keeping the client's other options.
|
|
8
|
+
* - SUB, UNSUB, PING and PONG are forwarded, rebuilt from their parsed fields.
|
|
9
|
+
* - Any other operation, PUB and HPUB included, marks the stream malformed
|
|
10
|
+
* and the proxy closes the connection.
|
|
11
|
+
*
|
|
12
|
+
* The filter reads lines as nats-server does: fields split on spaces or tabs,
|
|
13
|
+
* and a line ends at LF with or without a preceding CR. Operations can span
|
|
14
|
+
* WebSocket frames, so the filter keeps whatever it has not yet seen whole.
|
|
15
|
+
*/
|
|
16
|
+
export declare class NatsClientFilter {
|
|
17
|
+
private readonly authToken;
|
|
18
|
+
private pending;
|
|
19
|
+
private failed;
|
|
20
|
+
constructor(authToken: string | null);
|
|
21
|
+
/** Whether the stream was malformed; the proxy closes the connection. */
|
|
22
|
+
get malformed(): boolean;
|
|
23
|
+
/** The bytes to forward upstream for one chunk from the browser. */
|
|
24
|
+
feed(chunk: Buffer): Buffer;
|
|
25
|
+
private fail;
|
|
26
|
+
/** The line to forward, or null to forward nothing. */
|
|
27
|
+
private filterLine;
|
|
28
|
+
private rewriteConnect;
|
|
29
|
+
}
|