@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
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import type { LTGrantPolicy, LTGrantSnapshot, LTGrantSummary, LTOAuthClient } from '../../../types/oauth-server';
|
|
2
|
+
/** A refresh token reused within this many seconds is treated as a client retry. */
|
|
3
|
+
export declare const REFRESH_REUSE_GRACE_SECONDS = 10;
|
|
4
|
+
export interface RevokedGrant {
|
|
5
|
+
grant_id: string;
|
|
6
|
+
user_id: string;
|
|
7
|
+
}
|
|
8
|
+
/** A new random secret: 32 bytes, base64url. */
|
|
9
|
+
export declare function createSecret(): string;
|
|
10
|
+
/** SHA-256 of a secret. Codes and refresh tokens are stored only as hashes. */
|
|
11
|
+
export declare function hashSecret(secret: string): string;
|
|
12
|
+
/** The PKCE S256 challenge for a code verifier (RFC 7636). */
|
|
13
|
+
export declare function pkceChallenge(verifier: string): string;
|
|
14
|
+
export declare function registerClient(input: {
|
|
15
|
+
clientName?: string;
|
|
16
|
+
redirectUris: string[];
|
|
17
|
+
}): Promise<LTOAuthClient>;
|
|
18
|
+
export declare const isClientId: (value: string) => boolean;
|
|
19
|
+
export declare function getClient(clientId: string): Promise<LTOAuthClient | null>;
|
|
20
|
+
/** Record the person's consent as a grant and return a one-time code for it. */
|
|
21
|
+
export declare function issueAuthorizationCode(input: {
|
|
22
|
+
userId: string;
|
|
23
|
+
clientId: string;
|
|
24
|
+
policy: LTGrantPolicy;
|
|
25
|
+
scope: string;
|
|
26
|
+
redirectUri: string;
|
|
27
|
+
codeChallenge: string;
|
|
28
|
+
resource?: string;
|
|
29
|
+
ttlSeconds: number;
|
|
30
|
+
}): Promise<{
|
|
31
|
+
code: string;
|
|
32
|
+
grantId: string;
|
|
33
|
+
}>;
|
|
34
|
+
/**
|
|
35
|
+
* Exchange a code for the grant and its first refresh token. Null when the
|
|
36
|
+
* code is unknown, used, expired, for another client or redirect URI, fails
|
|
37
|
+
* PKCE, or its grant or owner is no longer active. A code presented again
|
|
38
|
+
* after its exchange revokes its grant.
|
|
39
|
+
*/
|
|
40
|
+
export declare function exchangeAuthorizationCode(input: {
|
|
41
|
+
code: string;
|
|
42
|
+
clientId: string;
|
|
43
|
+
redirectUri: string;
|
|
44
|
+
codeVerifier: string;
|
|
45
|
+
refreshTtlSeconds: number;
|
|
46
|
+
}): Promise<{
|
|
47
|
+
snapshot: LTGrantSnapshot;
|
|
48
|
+
resource: string | null;
|
|
49
|
+
refreshToken: string;
|
|
50
|
+
} | null>;
|
|
51
|
+
/**
|
|
52
|
+
* Rotate a refresh token for the client that holds it. Null when it is
|
|
53
|
+
* unknown, used, expired, another client's, or its grant or owner is no
|
|
54
|
+
* longer active. A used token presented again outside the
|
|
55
|
+
* grace window revokes its grant, and `revoked` reports it.
|
|
56
|
+
*/
|
|
57
|
+
export declare function rotateRefreshToken(input: {
|
|
58
|
+
refreshToken: string;
|
|
59
|
+
clientId: string;
|
|
60
|
+
refreshTtlSeconds: number;
|
|
61
|
+
}): Promise<{
|
|
62
|
+
snapshot: LTGrantSnapshot;
|
|
63
|
+
refreshToken: string;
|
|
64
|
+
} | {
|
|
65
|
+
snapshot: null;
|
|
66
|
+
revoked: RevokedGrant | null;
|
|
67
|
+
}>;
|
|
68
|
+
/** The live grant an access token names; null when it is revoked, its owner inactive, or it is another user's. */
|
|
69
|
+
export declare function getLiveGrant(grantId: string, userId: string): Promise<LTGrantSnapshot | null>;
|
|
70
|
+
/** Revoke the grant behind a refresh token presented by its own client (RFC 7009). */
|
|
71
|
+
export declare function revokeByRefreshToken(refreshToken: string, clientId: string): Promise<RevokedGrant | null>;
|
|
72
|
+
/** Revoke a grant; with `userId`, only when it belongs to that user. */
|
|
73
|
+
export declare function revokeGrant(grantId: string, userId?: string): Promise<RevokedGrant | null>;
|
|
74
|
+
/** The person's live grants that a client has put to use. */
|
|
75
|
+
export declare function listGrants(userId: string): Promise<LTGrantSummary[]>;
|
|
76
|
+
export interface OAuthPruneCounts {
|
|
77
|
+
refreshTokens: number;
|
|
78
|
+
codes: number;
|
|
79
|
+
grants: number;
|
|
80
|
+
clients: number;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Delete what the authorization server no longer needs, older than the
|
|
84
|
+
* window (a Postgres interval): spent and expired refresh tokens and codes,
|
|
85
|
+
* then grants with neither left or revoked, then clients with no live grant.
|
|
86
|
+
* Each step reads what the one before it left.
|
|
87
|
+
*/
|
|
88
|
+
export declare function pruneOAuthServer(olderThan: string): Promise<OAuthPruneCounts>;
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.isClientId = exports.REFRESH_REUSE_GRACE_SECONDS = void 0;
|
|
37
|
+
exports.createSecret = createSecret;
|
|
38
|
+
exports.hashSecret = hashSecret;
|
|
39
|
+
exports.pkceChallenge = pkceChallenge;
|
|
40
|
+
exports.registerClient = registerClient;
|
|
41
|
+
exports.getClient = getClient;
|
|
42
|
+
exports.issueAuthorizationCode = issueAuthorizationCode;
|
|
43
|
+
exports.exchangeAuthorizationCode = exchangeAuthorizationCode;
|
|
44
|
+
exports.rotateRefreshToken = rotateRefreshToken;
|
|
45
|
+
exports.getLiveGrant = getLiveGrant;
|
|
46
|
+
exports.revokeByRefreshToken = revokeByRefreshToken;
|
|
47
|
+
exports.revokeGrant = revokeGrant;
|
|
48
|
+
exports.listGrants = listGrants;
|
|
49
|
+
exports.pruneOAuthServer = pruneOAuthServer;
|
|
50
|
+
const crypto = __importStar(require("crypto"));
|
|
51
|
+
const db_1 = require("../../../lib/db");
|
|
52
|
+
const uuid_1 = require("../../../lib/uuid");
|
|
53
|
+
const sql_1 = require("./sql");
|
|
54
|
+
/** A refresh token reused within this many seconds is treated as a client retry. */
|
|
55
|
+
exports.REFRESH_REUSE_GRACE_SECONDS = 10;
|
|
56
|
+
/** A new random secret: 32 bytes, base64url. */
|
|
57
|
+
function createSecret() {
|
|
58
|
+
return crypto.randomBytes(32).toString('base64url');
|
|
59
|
+
}
|
|
60
|
+
/** SHA-256 of a secret. Codes and refresh tokens are stored only as hashes. */
|
|
61
|
+
function hashSecret(secret) {
|
|
62
|
+
return crypto.createHash('sha256').update(secret).digest('hex');
|
|
63
|
+
}
|
|
64
|
+
/** The PKCE S256 challenge for a code verifier (RFC 7636). */
|
|
65
|
+
function pkceChallenge(verifier) {
|
|
66
|
+
return crypto.createHash('sha256').update(verifier).digest('base64url');
|
|
67
|
+
}
|
|
68
|
+
async function registerClient(input) {
|
|
69
|
+
const { rows } = await (0, db_1.getPool)().query(sql_1.INSERT_CLIENT, [
|
|
70
|
+
`ltc_${createSecret()}`, input.clientName ?? null, input.redirectUris,
|
|
71
|
+
]);
|
|
72
|
+
return rows[0];
|
|
73
|
+
}
|
|
74
|
+
/** A client id as registerClient issues it; anything else names no client and never reaches SQL. */
|
|
75
|
+
const CLIENT_ID = /^ltc_[A-Za-z0-9_-]{43}$/;
|
|
76
|
+
const isClientId = (value) => CLIENT_ID.test(value);
|
|
77
|
+
exports.isClientId = isClientId;
|
|
78
|
+
async function getClient(clientId) {
|
|
79
|
+
if (!(0, exports.isClientId)(clientId))
|
|
80
|
+
return null;
|
|
81
|
+
const { rows } = await (0, db_1.getPool)().query(sql_1.GET_CLIENT, [clientId]);
|
|
82
|
+
return rows[0] ?? null;
|
|
83
|
+
}
|
|
84
|
+
/** Record the person's consent as a grant and return a one-time code for it. */
|
|
85
|
+
async function issueAuthorizationCode(input) {
|
|
86
|
+
if (!(0, uuid_1.isUuid)(input.userId))
|
|
87
|
+
throw new Error('issueAuthorizationCode: userId must be a UUID');
|
|
88
|
+
const code = createSecret();
|
|
89
|
+
const { rows } = await (0, db_1.getPool)().query(sql_1.ISSUE_CODE, [
|
|
90
|
+
input.userId, input.clientId, input.policy, input.scope,
|
|
91
|
+
hashSecret(code), input.redirectUri, input.codeChallenge, input.resource ?? null, input.ttlSeconds,
|
|
92
|
+
]);
|
|
93
|
+
return { code, grantId: rows[0].grant_id };
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Exchange a code for the grant and its first refresh token. Null when the
|
|
97
|
+
* code is unknown, used, expired, for another client or redirect URI, fails
|
|
98
|
+
* PKCE, or its grant or owner is no longer active. A code presented again
|
|
99
|
+
* after its exchange revokes its grant.
|
|
100
|
+
*/
|
|
101
|
+
async function exchangeAuthorizationCode(input) {
|
|
102
|
+
const pool = (0, db_1.getPool)();
|
|
103
|
+
const refreshToken = createSecret();
|
|
104
|
+
const codeHash = hashSecret(input.code);
|
|
105
|
+
const { rows } = await pool.query(sql_1.EXCHANGE_CODE, [
|
|
106
|
+
codeHash, input.clientId, input.redirectUri, pkceChallenge(input.codeVerifier),
|
|
107
|
+
hashSecret(refreshToken), input.refreshTtlSeconds,
|
|
108
|
+
]);
|
|
109
|
+
if (!rows[0]) {
|
|
110
|
+
await pool.query(sql_1.REVOKE_ON_CODE_REUSE, [codeHash]);
|
|
111
|
+
return null;
|
|
112
|
+
}
|
|
113
|
+
const { resource, ...snapshot } = rows[0];
|
|
114
|
+
return { snapshot, resource, refreshToken };
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Rotate a refresh token for the client that holds it. Null when it is
|
|
118
|
+
* unknown, used, expired, another client's, or its grant or owner is no
|
|
119
|
+
* longer active. A used token presented again outside the
|
|
120
|
+
* grace window revokes its grant, and `revoked` reports it.
|
|
121
|
+
*/
|
|
122
|
+
async function rotateRefreshToken(input) {
|
|
123
|
+
const pool = (0, db_1.getPool)();
|
|
124
|
+
const next = createSecret();
|
|
125
|
+
const oldHash = hashSecret(input.refreshToken);
|
|
126
|
+
const { rows } = await pool.query(sql_1.ROTATE_REFRESH_TOKEN, [oldHash, hashSecret(next), input.refreshTtlSeconds, input.clientId]);
|
|
127
|
+
if (rows[0])
|
|
128
|
+
return { snapshot: rows[0], refreshToken: next };
|
|
129
|
+
const reuse = await pool.query(sql_1.REVOKE_ON_REFRESH_REUSE, [oldHash, exports.REFRESH_REUSE_GRACE_SECONDS]);
|
|
130
|
+
return { snapshot: null, revoked: reuse.rows[0] ?? null };
|
|
131
|
+
}
|
|
132
|
+
/** The live grant an access token names; null when it is revoked, its owner inactive, or it is another user's. */
|
|
133
|
+
async function getLiveGrant(grantId, userId) {
|
|
134
|
+
if (!(0, uuid_1.isUuid)(grantId) || !(0, uuid_1.isUuid)(userId))
|
|
135
|
+
return null;
|
|
136
|
+
const { rows } = await (0, db_1.getPool)().query(sql_1.GET_LIVE_GRANT, [grantId, userId]);
|
|
137
|
+
return rows[0] ?? null;
|
|
138
|
+
}
|
|
139
|
+
/** Revoke the grant behind a refresh token presented by its own client (RFC 7009). */
|
|
140
|
+
async function revokeByRefreshToken(refreshToken, clientId) {
|
|
141
|
+
const { rows } = await (0, db_1.getPool)().query(sql_1.REVOKE_BY_REFRESH_TOKEN, [hashSecret(refreshToken), clientId]);
|
|
142
|
+
return rows[0] ?? null;
|
|
143
|
+
}
|
|
144
|
+
/** Revoke a grant; with `userId`, only when it belongs to that user. */
|
|
145
|
+
async function revokeGrant(grantId, userId) {
|
|
146
|
+
if (!(0, uuid_1.isUuid)(grantId) || (userId !== undefined && !(0, uuid_1.isUuid)(userId)))
|
|
147
|
+
return null;
|
|
148
|
+
const { rows } = await (0, db_1.getPool)().query(sql_1.REVOKE_GRANT, [grantId, userId ?? null]);
|
|
149
|
+
return rows[0] ?? null;
|
|
150
|
+
}
|
|
151
|
+
/** The person's live grants that a client has put to use. */
|
|
152
|
+
async function listGrants(userId) {
|
|
153
|
+
if (!(0, uuid_1.isUuid)(userId))
|
|
154
|
+
return [];
|
|
155
|
+
const { rows } = await (0, db_1.getPool)().query(sql_1.LIST_GRANTS, [userId]);
|
|
156
|
+
return rows;
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Delete what the authorization server no longer needs, older than the
|
|
160
|
+
* window (a Postgres interval): spent and expired refresh tokens and codes,
|
|
161
|
+
* then grants with neither left or revoked, then clients with no live grant.
|
|
162
|
+
* Each step reads what the one before it left.
|
|
163
|
+
*/
|
|
164
|
+
async function pruneOAuthServer(olderThan) {
|
|
165
|
+
const pool = (0, db_1.getPool)();
|
|
166
|
+
const refreshTokens = (await pool.query(sql_1.PRUNE_REFRESH_TOKENS, [olderThan])).rowCount ?? 0;
|
|
167
|
+
const codes = (await pool.query(sql_1.PRUNE_CODES, [olderThan])).rowCount ?? 0;
|
|
168
|
+
const grants = (await pool.query(sql_1.PRUNE_GRANTS, [olderThan])).rowCount ?? 0;
|
|
169
|
+
const clients = (await pool.query(sql_1.PRUNE_CLIENTS, [olderThan])).rowCount ?? 0;
|
|
170
|
+
return { refreshTokens, codes, grants, clients };
|
|
171
|
+
}
|
|
@@ -3,6 +3,7 @@ export declare const GET_BOT_KEYS_BY_USER = "\n SELECT id, name, user_id, key_h
|
|
|
3
3
|
export declare const GET_ALL_ACTIVE_BOT_KEYS = "\n SELECT id, name, user_id, key_hash, scopes\n FROM lt_bot_api_keys\n WHERE (expires_at IS NULL OR expires_at > NOW())";
|
|
4
4
|
export declare const UPDATE_BOT_KEY_LAST_USED = "\n UPDATE lt_bot_api_keys SET last_used_at = NOW() WHERE id = $1";
|
|
5
5
|
export declare const DELETE_BOT_KEY = "\n DELETE FROM lt_bot_api_keys WHERE id = $1";
|
|
6
|
+
export declare const GET_BOT_KEY_OWNER = "\n SELECT user_id FROM lt_bot_api_keys WHERE id = $1";
|
|
6
7
|
export declare const LIST_BOT_KEYS_BY_USER = "\n SELECT id, name, user_id, scopes, expires_at, last_used_at, created_at, updated_at\n FROM lt_bot_api_keys WHERE user_id = $1 ORDER BY created_at";
|
|
7
8
|
export declare const INSERT_SERVICE_TOKEN = "\n INSERT INTO lt_service_tokens (name, token_hash, server_id, scopes, expires_at)\n VALUES ($1, $2, $3, $4, $5) RETURNING id";
|
|
8
9
|
export declare const GET_ALL_ACTIVE_SERVICE_TOKENS = "\n SELECT id, name, token_hash FROM lt_service_tokens\n WHERE (expires_at IS NULL OR expires_at > NOW())";
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
// ── Bot API key queries ─────────────────────────────────────────────────────
|
|
3
3
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
-
exports.LIST_SERVICE_TOKENS_BY_SERVER = exports.DELETE_SERVICE_TOKEN = exports.UPDATE_SERVICE_TOKEN_LAST_USED = exports.GET_ALL_ACTIVE_SERVICE_TOKENS = exports.INSERT_SERVICE_TOKEN = exports.LIST_BOT_KEYS_BY_USER = exports.DELETE_BOT_KEY = exports.UPDATE_BOT_KEY_LAST_USED = exports.GET_ALL_ACTIVE_BOT_KEYS = exports.GET_BOT_KEYS_BY_USER = exports.INSERT_BOT_KEY = void 0;
|
|
4
|
+
exports.LIST_SERVICE_TOKENS_BY_SERVER = exports.DELETE_SERVICE_TOKEN = exports.UPDATE_SERVICE_TOKEN_LAST_USED = exports.GET_ALL_ACTIVE_SERVICE_TOKENS = exports.INSERT_SERVICE_TOKEN = exports.LIST_BOT_KEYS_BY_USER = exports.GET_BOT_KEY_OWNER = exports.DELETE_BOT_KEY = exports.UPDATE_BOT_KEY_LAST_USED = exports.GET_ALL_ACTIVE_BOT_KEYS = exports.GET_BOT_KEYS_BY_USER = exports.INSERT_BOT_KEY = void 0;
|
|
5
5
|
exports.INSERT_BOT_KEY = `
|
|
6
6
|
INSERT INTO lt_bot_api_keys (name, user_id, key_hash, scopes, expires_at)
|
|
7
7
|
VALUES ($1, $2, $3, $4, $5) RETURNING id`;
|
|
@@ -18,6 +18,8 @@ exports.UPDATE_BOT_KEY_LAST_USED = `
|
|
|
18
18
|
UPDATE lt_bot_api_keys SET last_used_at = NOW() WHERE id = $1`;
|
|
19
19
|
exports.DELETE_BOT_KEY = `
|
|
20
20
|
DELETE FROM lt_bot_api_keys WHERE id = $1`;
|
|
21
|
+
exports.GET_BOT_KEY_OWNER = `
|
|
22
|
+
SELECT user_id FROM lt_bot_api_keys WHERE id = $1`;
|
|
21
23
|
exports.LIST_BOT_KEYS_BY_USER = `
|
|
22
24
|
SELECT id, name, user_id, scopes, expires_at, last_used_at, created_at, updated_at
|
|
23
25
|
FROM lt_bot_api_keys WHERE user_id = $1 ORDER BY created_at`;
|
|
@@ -65,6 +65,7 @@ function validateCronSchedule(expr) {
|
|
|
65
65
|
const CRON_TOPIC_PREFIX = 'lt.cron';
|
|
66
66
|
const CRON_ID_PREFIX = 'lt-cron';
|
|
67
67
|
const YAML_CRON_TOPIC_PREFIX = 'lt.cron.yaml';
|
|
68
|
+
const CRON_SOURCE = 'cron';
|
|
68
69
|
const YAML_CRON_ID_PREFIX = 'lt-cron-yaml';
|
|
69
70
|
/**
|
|
70
71
|
* Singleton registry for workflow cron schedules.
|
|
@@ -241,9 +242,10 @@ class LTCronRegistry {
|
|
|
241
242
|
try {
|
|
242
243
|
cronCallCount++;
|
|
243
244
|
logger_1.loggerRegistry.info(`[lt-cron] tick #${cronCallCount} at ${new Date().toISOString()} — pub(${appId}/${graphTopic})`);
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
245
|
+
// Through the invoke service, so the run carries only the scope the
|
|
246
|
+
// server resolves for execute_as, never one written in the envelope.
|
|
247
|
+
const { invokeYamlWorkflow } = await Promise.resolve().then(() => __importStar(require('../yaml-workflow/invoke')));
|
|
248
|
+
await invokeYamlWorkflow(wf, { data: cronEnvelope, execute_as: wf.execute_as ?? undefined, source: CRON_SOURCE });
|
|
247
249
|
logger_1.loggerRegistry.info(`[lt-cron] tick #${cronCallCount} published successfully`);
|
|
248
250
|
}
|
|
249
251
|
catch (err) {
|
|
@@ -278,8 +278,13 @@ async function listDistinctTypes() {
|
|
|
278
278
|
* and an out-of-scope role yields an empty result, not someone else's rows.
|
|
279
279
|
*/
|
|
280
280
|
function narrowRoleWithinScope(role, visibleRoles) {
|
|
281
|
-
if (!
|
|
282
|
-
return { role, roles:
|
|
281
|
+
if (!visibleRoles)
|
|
282
|
+
return { role, roles: undefined, empty: false };
|
|
283
|
+
// An empty scope sees nothing; the SDK would read an empty list as no filter.
|
|
284
|
+
if (visibleRoles.length === 0)
|
|
285
|
+
return { empty: true };
|
|
286
|
+
if (!role)
|
|
287
|
+
return { roles: visibleRoles, empty: false };
|
|
283
288
|
if (!visibleRoles.includes(role))
|
|
284
289
|
return { empty: true };
|
|
285
290
|
return { role, roles: undefined, empty: false };
|
|
@@ -48,6 +48,16 @@ export interface WorkflowEnvelopes {
|
|
|
48
48
|
* so, making this the natural polling body.
|
|
49
49
|
*/
|
|
50
50
|
export declare function getWorkflowEnvelopes(workflowId: string, taskQueue: string, workflowName: string): Promise<WorkflowEnvelopes>;
|
|
51
|
+
/**
|
|
52
|
+
* The identity a run was started with: its start envelope's `lt` block
|
|
53
|
+
* (`userId` is who it runs as; `initiatedBy` is the person who started it
|
|
54
|
+
* under `execute_as`). Read from the run's own input, so it holds for every
|
|
55
|
+
* registered or durable run. Null when the run cannot be found.
|
|
56
|
+
*/
|
|
57
|
+
export declare function getWorkflowStartIdentity(workflowId: string): Promise<{
|
|
58
|
+
userId?: string;
|
|
59
|
+
initiatedBy?: string;
|
|
60
|
+
} | null>;
|
|
51
61
|
/**
|
|
52
62
|
* Return the current job state of a workflow.
|
|
53
63
|
* If the workflow is complete this is also the output.
|
|
@@ -4,11 +4,13 @@ exports.exportWorkflow = exportWorkflow;
|
|
|
4
4
|
exports.getWorkflowStatus = getWorkflowStatus;
|
|
5
5
|
exports.exportWorkflowExecution = exportWorkflowExecution;
|
|
6
6
|
exports.getWorkflowEnvelopes = getWorkflowEnvelopes;
|
|
7
|
+
exports.getWorkflowStartIdentity = getWorkflowStartIdentity;
|
|
7
8
|
exports.getWorkflowState = getWorkflowState;
|
|
8
9
|
exports.listJobs = listJobs;
|
|
9
10
|
const db_1 = require("../../lib/db");
|
|
10
11
|
const hotmesh_utils_1 = require("../hotmesh-utils");
|
|
11
12
|
const client_1 = require("./client");
|
|
13
|
+
const resolve_1 = require("../task/resolve");
|
|
12
14
|
const post_process_1 = require("./post-process");
|
|
13
15
|
const workflow_state_1 = require("../workflow-state");
|
|
14
16
|
/** Error thrown when a workflow job is not found (expired or never existed). */
|
|
@@ -123,6 +125,31 @@ async function getWorkflowEnvelopes(workflowId, taskQueue, workflowName) {
|
|
|
123
125
|
const output = await handle.output().catch(() => null);
|
|
124
126
|
return { workflow_id: workflowId, status: reading.state, input, output: output ?? null };
|
|
125
127
|
}
|
|
128
|
+
/**
|
|
129
|
+
* The identity a run was started with: its start envelope's `lt` block
|
|
130
|
+
* (`userId` is who it runs as; `initiatedBy` is the person who started it
|
|
131
|
+
* under `execute_as`). Read from the run's own input, so it holds for every
|
|
132
|
+
* registered or durable run. Null when the run cannot be found.
|
|
133
|
+
*/
|
|
134
|
+
async function getWorkflowStartIdentity(workflowId) {
|
|
135
|
+
let resolved;
|
|
136
|
+
try {
|
|
137
|
+
resolved = await (0, resolve_1.resolveWorkflowHandle)(workflowId);
|
|
138
|
+
}
|
|
139
|
+
catch {
|
|
140
|
+
return null;
|
|
141
|
+
}
|
|
142
|
+
const handle = await (0, client_1.getHandle)(resolved.taskQueue, resolved.workflowName, workflowId);
|
|
143
|
+
const args = await handle.input().catch(() => undefined);
|
|
144
|
+
const envelope = Array.isArray(args) && args.length >= 1 ? args[0] : null;
|
|
145
|
+
const lt = (envelope && typeof envelope === 'object' ? envelope.lt : null) ?? null;
|
|
146
|
+
if (!lt)
|
|
147
|
+
return {};
|
|
148
|
+
return {
|
|
149
|
+
...(typeof lt.userId === 'string' ? { userId: lt.userId } : {}),
|
|
150
|
+
...(typeof lt.initiatedBy === 'string' ? { initiatedBy: lt.initiatedBy } : {}),
|
|
151
|
+
};
|
|
152
|
+
}
|
|
126
153
|
/**
|
|
127
154
|
* Return the current job state of a workflow.
|
|
128
155
|
* If the workflow is complete this is also the output.
|
|
@@ -8,11 +8,32 @@ export declare const INVOCATION_ROLE_TYPES: {
|
|
|
8
8
|
readonly ADMIN: "admin";
|
|
9
9
|
};
|
|
10
10
|
export declare const ADMIN_ROLE = "admin";
|
|
11
|
-
/**
|
|
12
|
-
export declare
|
|
11
|
+
/** The workflow that calls a named MCP tool with lt-system authority. */
|
|
12
|
+
export declare const CAPABILITY_INVOKE_WORKFLOW = "capabilityInvoke";
|
|
13
|
+
/**
|
|
14
|
+
* Workflows whose activities act with lt-system authority. Started from
|
|
15
|
+
* outside the process, they would lend that authority to the caller, so only
|
|
16
|
+
* a superadmin may start one. Internal starts (agent triggers) are unaffected.
|
|
17
|
+
*/
|
|
18
|
+
export declare const SYSTEM_AUTHORITY_WORKFLOWS: ReadonlySet<string>;
|
|
19
|
+
/**
|
|
20
|
+
* Whether a caller may run a workflow as another principal. A superadmin may
|
|
21
|
+
* act as anyone. Otherwise the caller needs an admin-type grant, the target
|
|
22
|
+
* holds no superadmin grant, and every grant the target holds the caller
|
|
23
|
+
* holds at the same or a higher type: an override never exceeds the caller.
|
|
24
|
+
*/
|
|
25
|
+
export declare function mayActAs(caller: readonly InvocationRoleGrant[], target: readonly InvocationRoleGrant[]): boolean;
|
|
26
|
+
/**
|
|
27
|
+
* Superadmin anywhere, or the named admin role held as admin type, invokes
|
|
28
|
+
* every workflow. Decided from grants only, never a token's role claim.
|
|
29
|
+
*/
|
|
30
|
+
export declare function hasGlobalInvocationAccess(roles: readonly InvocationRoleGrant[]): boolean;
|
|
13
31
|
/**
|
|
14
32
|
* The one invocation predicate, shared by the invoke gate and the per-caller
|
|
15
33
|
* list so the two can never disagree. An empty invocation_roles list opens
|
|
16
|
-
* the workflow to every authenticated caller.
|
|
34
|
+
* the workflow to every authenticated caller. A system-authority workflow
|
|
35
|
+
* needs a superadmin grant, whatever its stored roles say.
|
|
17
36
|
*/
|
|
18
|
-
export declare function canInvokeWorkflow(config: Pick<LTWorkflowConfig, 'invocable' | 'invocation_roles'
|
|
37
|
+
export declare function canInvokeWorkflow(config: Pick<LTWorkflowConfig, 'invocable' | 'invocation_roles'> & {
|
|
38
|
+
workflow_type?: string;
|
|
39
|
+
}, roles: readonly InvocationRoleGrant[]): boolean;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.ADMIN_ROLE = exports.INVOCATION_ROLE_TYPES = void 0;
|
|
3
|
+
exports.SYSTEM_AUTHORITY_WORKFLOWS = exports.CAPABILITY_INVOKE_WORKFLOW = exports.ADMIN_ROLE = exports.INVOCATION_ROLE_TYPES = void 0;
|
|
4
|
+
exports.mayActAs = mayActAs;
|
|
4
5
|
exports.hasGlobalInvocationAccess = hasGlobalInvocationAccess;
|
|
5
6
|
exports.canInvokeWorkflow = canInvokeWorkflow;
|
|
6
7
|
exports.INVOCATION_ROLE_TYPES = {
|
|
@@ -8,24 +9,55 @@ exports.INVOCATION_ROLE_TYPES = {
|
|
|
8
9
|
ADMIN: 'admin',
|
|
9
10
|
};
|
|
10
11
|
exports.ADMIN_ROLE = 'admin';
|
|
11
|
-
/**
|
|
12
|
-
|
|
13
|
-
|
|
12
|
+
/** The workflow that calls a named MCP tool with lt-system authority. */
|
|
13
|
+
exports.CAPABILITY_INVOKE_WORKFLOW = 'capabilityInvoke';
|
|
14
|
+
/**
|
|
15
|
+
* Workflows whose activities act with lt-system authority. Started from
|
|
16
|
+
* outside the process, they would lend that authority to the caller, so only
|
|
17
|
+
* a superadmin may start one. Internal starts (agent triggers) are unaffected.
|
|
18
|
+
*/
|
|
19
|
+
exports.SYSTEM_AUTHORITY_WORKFLOWS = new Set([exports.CAPABILITY_INVOKE_WORKFLOW]);
|
|
20
|
+
const ROLE_TYPE_RANK = { member: 1, admin: 2, superadmin: 3 };
|
|
21
|
+
function holdsSuperadmin(roles) {
|
|
22
|
+
return roles.some((r) => r.type === exports.INVOCATION_ROLE_TYPES.SUPERADMIN);
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Whether a caller may run a workflow as another principal. A superadmin may
|
|
26
|
+
* act as anyone. Otherwise the caller needs an admin-type grant, the target
|
|
27
|
+
* holds no superadmin grant, and every grant the target holds the caller
|
|
28
|
+
* holds at the same or a higher type: an override never exceeds the caller.
|
|
29
|
+
*/
|
|
30
|
+
function mayActAs(caller, target) {
|
|
31
|
+
if (holdsSuperadmin(caller))
|
|
14
32
|
return true;
|
|
33
|
+
if (!caller.some((r) => r.type === exports.INVOCATION_ROLE_TYPES.ADMIN))
|
|
34
|
+
return false;
|
|
35
|
+
if (holdsSuperadmin(target))
|
|
36
|
+
return false;
|
|
37
|
+
return target.every((t) => caller.some((c) => c.role === t.role && (ROLE_TYPE_RANK[c.type] ?? 0) >= (ROLE_TYPE_RANK[t.type] ?? 0)));
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Superadmin anywhere, or the named admin role held as admin type, invokes
|
|
41
|
+
* every workflow. Decided from grants only, never a token's role claim.
|
|
42
|
+
*/
|
|
43
|
+
function hasGlobalInvocationAccess(roles) {
|
|
15
44
|
return roles.some((r) => r.type === exports.INVOCATION_ROLE_TYPES.SUPERADMIN)
|
|
16
45
|
|| roles.some((r) => r.role === exports.ADMIN_ROLE && r.type === exports.INVOCATION_ROLE_TYPES.ADMIN);
|
|
17
46
|
}
|
|
18
47
|
/**
|
|
19
48
|
* The one invocation predicate, shared by the invoke gate and the per-caller
|
|
20
49
|
* list so the two can never disagree. An empty invocation_roles list opens
|
|
21
|
-
* the workflow to every authenticated caller.
|
|
50
|
+
* the workflow to every authenticated caller. A system-authority workflow
|
|
51
|
+
* needs a superadmin grant, whatever its stored roles say.
|
|
22
52
|
*/
|
|
23
|
-
function canInvokeWorkflow(config, roles
|
|
53
|
+
function canInvokeWorkflow(config, roles) {
|
|
24
54
|
if (!config.invocable)
|
|
25
55
|
return false;
|
|
56
|
+
if (config.workflow_type && exports.SYSTEM_AUTHORITY_WORKFLOWS.has(config.workflow_type))
|
|
57
|
+
return holdsSuperadmin(roles);
|
|
26
58
|
if (config.invocation_roles.length === 0)
|
|
27
59
|
return true;
|
|
28
|
-
if (hasGlobalInvocationAccess(roles
|
|
60
|
+
if (hasGlobalInvocationAccess(roles))
|
|
29
61
|
return true;
|
|
30
62
|
const held = new Set(roles.map((r) => r.role));
|
|
31
63
|
return config.invocation_roles.some((r) => held.has(r));
|
|
@@ -106,6 +106,14 @@ async function executeRule(appId, rule) {
|
|
|
106
106
|
}
|
|
107
107
|
break;
|
|
108
108
|
}
|
|
109
|
+
// Drop the authorization server's dead rows: spent or expired tokens and
|
|
110
|
+
// codes, grants with neither left or long revoked, clients with no live grant.
|
|
111
|
+
case rule.target === 'oauth' && rule.action === 'delete': {
|
|
112
|
+
const { pruneOAuthServer } = await Promise.resolve().then(() => __importStar(require('../auth/oauth-server')));
|
|
113
|
+
const counts = await pruneOAuthServer(rule.olderThan);
|
|
114
|
+
logger_1.loggerRegistry.info(`[lt-maintenance] oauth pruned: ${JSON.stringify(counts)} (olderThan: ${rule.olderThan})`);
|
|
115
|
+
break;
|
|
116
|
+
}
|
|
109
117
|
default:
|
|
110
118
|
logger_1.loggerRegistry.warn(`[lt-maintenance] unknown rule, skipping: ${JSON.stringify(rule)}`);
|
|
111
119
|
}
|
|
@@ -8,7 +8,12 @@ import type { LTMcpToolManifest } from '../../../types';
|
|
|
8
8
|
* are called via server._registeredTools[toolName].handler(args). This
|
|
9
9
|
* eliminates the InMemoryTransport bottleneck under concurrent load.
|
|
10
10
|
*/
|
|
11
|
-
export declare function dispatchBuiltinTool(serverId: string, toolName: string, args: Record<string, any
|
|
11
|
+
export declare function dispatchBuiltinTool(serverId: string, toolName: string, args: Record<string, any>, extra?: {
|
|
12
|
+
authInfo?: {
|
|
13
|
+
userId: string;
|
|
14
|
+
role?: string;
|
|
15
|
+
};
|
|
16
|
+
}): Promise<{
|
|
12
17
|
dispatched: true;
|
|
13
18
|
result: any;
|
|
14
19
|
} | null>;
|
|
@@ -13,7 +13,7 @@ const connection_lifecycle_1 = require("./connection-lifecycle");
|
|
|
13
13
|
* are called via server._registeredTools[toolName].handler(args). This
|
|
14
14
|
* eliminates the InMemoryTransport bottleneck under concurrent load.
|
|
15
15
|
*/
|
|
16
|
-
async function dispatchBuiltinTool(serverId, toolName, args) {
|
|
16
|
+
async function dispatchBuiltinTool(serverId, toolName, args, extra) {
|
|
17
17
|
const builtinFactories = (0, connection_lifecycle_1.getBuiltinFactories)();
|
|
18
18
|
const builtinServers = (0, connection_lifecycle_1.getBuiltinServers)();
|
|
19
19
|
// Normalize and match against builtin factories
|
|
@@ -43,7 +43,8 @@ async function dispatchBuiltinTool(serverId, toolName, args) {
|
|
|
43
43
|
// Call the handler directly — no transport, no JSON-RPC.
|
|
44
44
|
// Tool handlers return MCP-shaped responses: { content: [{ type: 'text', text: '...' }] }
|
|
45
45
|
// Parse the text content the same way callServerTool does.
|
|
46
|
-
|
|
46
|
+
// With `extra`, the handler sees an external caller and acts as them.
|
|
47
|
+
const mcpResponse = extra ? await tool.handler(args, extra) : await tool.handler(args);
|
|
47
48
|
let parsed = mcpResponse;
|
|
48
49
|
if (mcpResponse && Array.isArray(mcpResponse.content)) {
|
|
49
50
|
const textContent = mcpResponse.content.find((c) => c.type === 'text');
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Client } from '@modelcontextprotocol/sdk/client/index.js';
|
|
2
|
-
import type { LTMcpServerRecord } from '../../../types';
|
|
2
|
+
import type { LTMcpServerRecord, LTToolManifestEntry } from '../../../types';
|
|
3
3
|
/** Read-only access to the clients map for sibling modules. */
|
|
4
4
|
export declare function getClients(): Map<string, Client>;
|
|
5
5
|
/** Read-only access to the builtin factories map for sibling modules. */
|
|
@@ -10,7 +10,9 @@ export declare function getBuiltinServers(): Map<string, any>;
|
|
|
10
10
|
* Register a built-in server factory so it can be auto-connected
|
|
11
11
|
* when callServerTool is invoked with its name.
|
|
12
12
|
*/
|
|
13
|
-
export declare function registerBuiltinServer(name: string, factory: () => Promise<any
|
|
13
|
+
export declare function registerBuiltinServer(name: string, factory: () => Promise<any>, toolManifest?: LTToolManifestEntry[]): void;
|
|
14
|
+
/** The tool manifest a built-in server was registered with, if any. */
|
|
15
|
+
export declare function getBuiltinToolManifest(name: string): LTToolManifestEntry[] | undefined;
|
|
14
16
|
/**
|
|
15
17
|
* Connect to a registered MCP server.
|
|
16
18
|
* Creates the appropriate transport based on transport_type,
|
|
@@ -29,6 +31,12 @@ export declare function disconnectFromServer(serverId: string): Promise<void>;
|
|
|
29
31
|
* Alias lookups (e.g. 'translation' matching 'long-tail-translation') reuse
|
|
30
32
|
* the same client instance to avoid double-connecting the singleton server.
|
|
31
33
|
*/
|
|
34
|
+
/**
|
|
35
|
+
* The built-in server a server id or name resolves to, by the same rules
|
|
36
|
+
* resolveClient follows: an exact or fuzzy factory name, else a registered
|
|
37
|
+
* server whose name matches a factory. Null for an external server.
|
|
38
|
+
*/
|
|
39
|
+
export declare function resolveBuiltinServerName(serverId: string): Promise<string | null>;
|
|
32
40
|
export declare function resolveClient(serverId: string): Promise<Client | null>;
|
|
33
41
|
/**
|
|
34
42
|
* Connect to all auto-connect servers.
|