@lobu/gateway 2.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/api/index.d.ts +2 -0
- package/dist/api/index.d.ts.map +1 -0
- package/dist/api/index.js +6 -0
- package/dist/api/index.js.map +1 -0
- package/dist/api/platform.d.ts +92 -0
- package/dist/api/platform.d.ts.map +1 -0
- package/dist/api/platform.js +236 -0
- package/dist/api/platform.js.map +1 -0
- package/dist/api/response-renderer.d.ts +44 -0
- package/dist/api/response-renderer.d.ts.map +1 -0
- package/dist/api/response-renderer.js +123 -0
- package/dist/api/response-renderer.js.map +1 -0
- package/dist/auth/agent-metadata-store.d.ts +64 -0
- package/dist/auth/agent-metadata-store.d.ts.map +1 -0
- package/dist/auth/agent-metadata-store.js +115 -0
- package/dist/auth/agent-metadata-store.js.map +1 -0
- package/dist/auth/api-auth-middleware.d.ts +19 -0
- package/dist/auth/api-auth-middleware.d.ts.map +1 -0
- package/dist/auth/api-auth-middleware.js +61 -0
- package/dist/auth/api-auth-middleware.js.map +1 -0
- package/dist/auth/api-key-provider-module.d.ts +60 -0
- package/dist/auth/api-key-provider-module.d.ts.map +1 -0
- package/dist/auth/api-key-provider-module.js +148 -0
- package/dist/auth/api-key-provider-module.js.map +1 -0
- package/dist/auth/base-provider-module.d.ts +70 -0
- package/dist/auth/base-provider-module.d.ts.map +1 -0
- package/dist/auth/base-provider-module.js +118 -0
- package/dist/auth/base-provider-module.js.map +1 -0
- package/dist/auth/chatgpt/chatgpt-oauth-module.d.ts +34 -0
- package/dist/auth/chatgpt/chatgpt-oauth-module.d.ts.map +1 -0
- package/dist/auth/chatgpt/chatgpt-oauth-module.js +136 -0
- package/dist/auth/chatgpt/chatgpt-oauth-module.js.map +1 -0
- package/dist/auth/chatgpt/device-code-client.d.ts +40 -0
- package/dist/auth/chatgpt/device-code-client.d.ts.map +1 -0
- package/dist/auth/chatgpt/device-code-client.js +165 -0
- package/dist/auth/chatgpt/device-code-client.js.map +1 -0
- package/dist/auth/chatgpt/index.d.ts +2 -0
- package/dist/auth/chatgpt/index.d.ts.map +1 -0
- package/dist/auth/chatgpt/index.js +6 -0
- package/dist/auth/chatgpt/index.js.map +1 -0
- package/dist/auth/claude/oauth-module.d.ts +29 -0
- package/dist/auth/claude/oauth-module.d.ts.map +1 -0
- package/dist/auth/claude/oauth-module.js +201 -0
- package/dist/auth/claude/oauth-module.js.map +1 -0
- package/dist/auth/cli/token-service.d.ts +35 -0
- package/dist/auth/cli/token-service.d.ts.map +1 -0
- package/dist/auth/cli/token-service.js +171 -0
- package/dist/auth/cli/token-service.js.map +1 -0
- package/dist/auth/external/client.d.ts +65 -0
- package/dist/auth/external/client.d.ts.map +1 -0
- package/dist/auth/external/client.js +348 -0
- package/dist/auth/external/client.js.map +1 -0
- package/dist/auth/external/device-code-client.d.ts +41 -0
- package/dist/auth/external/device-code-client.d.ts.map +1 -0
- package/dist/auth/external/device-code-client.js +128 -0
- package/dist/auth/external/device-code-client.js.map +1 -0
- package/dist/auth/mcp/config-service.d.ts +70 -0
- package/dist/auth/mcp/config-service.d.ts.map +1 -0
- package/dist/auth/mcp/config-service.js +269 -0
- package/dist/auth/mcp/config-service.js.map +1 -0
- package/dist/auth/mcp/proxy.d.ts +68 -0
- package/dist/auth/mcp/proxy.d.ts.map +1 -0
- package/dist/auth/mcp/proxy.js +783 -0
- package/dist/auth/mcp/proxy.js.map +1 -0
- package/dist/auth/mcp/string-substitution.d.ts +11 -0
- package/dist/auth/mcp/string-substitution.d.ts.map +1 -0
- package/dist/auth/mcp/string-substitution.js +21 -0
- package/dist/auth/mcp/string-substitution.js.map +1 -0
- package/dist/auth/mcp/tool-cache.d.ts +26 -0
- package/dist/auth/mcp/tool-cache.d.ts.map +1 -0
- package/dist/auth/mcp/tool-cache.js +58 -0
- package/dist/auth/mcp/tool-cache.js.map +1 -0
- package/dist/auth/oauth/base-client.d.ts +54 -0
- package/dist/auth/oauth/base-client.d.ts.map +1 -0
- package/dist/auth/oauth/base-client.js +191 -0
- package/dist/auth/oauth/base-client.js.map +1 -0
- package/dist/auth/oauth/client.d.ts +35 -0
- package/dist/auth/oauth/client.d.ts.map +1 -0
- package/dist/auth/oauth/client.js +96 -0
- package/dist/auth/oauth/client.js.map +1 -0
- package/dist/auth/oauth/credentials.d.ts +8 -0
- package/dist/auth/oauth/credentials.d.ts.map +1 -0
- package/dist/auth/oauth/credentials.js +3 -0
- package/dist/auth/oauth/credentials.js.map +1 -0
- package/dist/auth/oauth/providers.d.ts +44 -0
- package/dist/auth/oauth/providers.d.ts.map +1 -0
- package/dist/auth/oauth/providers.js +37 -0
- package/dist/auth/oauth/providers.js.map +1 -0
- package/dist/auth/oauth/state-store.d.ts +62 -0
- package/dist/auth/oauth/state-store.d.ts.map +1 -0
- package/dist/auth/oauth/state-store.js +84 -0
- package/dist/auth/oauth/state-store.js.map +1 -0
- package/dist/auth/oauth-templates.d.ts +15 -0
- package/dist/auth/oauth-templates.d.ts.map +1 -0
- package/dist/auth/oauth-templates.js +161 -0
- package/dist/auth/oauth-templates.js.map +1 -0
- package/dist/auth/provider-catalog.d.ts +52 -0
- package/dist/auth/provider-catalog.d.ts.map +1 -0
- package/dist/auth/provider-catalog.js +155 -0
- package/dist/auth/provider-catalog.js.map +1 -0
- package/dist/auth/provider-model-options.d.ts +3 -0
- package/dist/auth/provider-model-options.d.ts.map +1 -0
- package/dist/auth/provider-model-options.js +29 -0
- package/dist/auth/provider-model-options.js.map +1 -0
- package/dist/auth/settings/agent-settings-store.d.ts +112 -0
- package/dist/auth/settings/agent-settings-store.d.ts.map +1 -0
- package/dist/auth/settings/agent-settings-store.js +376 -0
- package/dist/auth/settings/agent-settings-store.js.map +1 -0
- package/dist/auth/settings/auth-profiles-manager.d.ts +26 -0
- package/dist/auth/settings/auth-profiles-manager.d.ts.map +1 -0
- package/dist/auth/settings/auth-profiles-manager.js +146 -0
- package/dist/auth/settings/auth-profiles-manager.js.map +1 -0
- package/dist/auth/settings/index.d.ts +4 -0
- package/dist/auth/settings/index.d.ts.map +1 -0
- package/dist/auth/settings/index.js +9 -0
- package/dist/auth/settings/index.js.map +1 -0
- package/dist/auth/settings/model-preference-store.d.ts +25 -0
- package/dist/auth/settings/model-preference-store.d.ts.map +1 -0
- package/dist/auth/settings/model-preference-store.js +50 -0
- package/dist/auth/settings/model-preference-store.js.map +1 -0
- package/dist/auth/settings/model-selection.d.ts +11 -0
- package/dist/auth/settings/model-selection.d.ts.map +1 -0
- package/dist/auth/settings/model-selection.js +83 -0
- package/dist/auth/settings/model-selection.js.map +1 -0
- package/dist/auth/settings/resolved-settings-view.d.ts +45 -0
- package/dist/auth/settings/resolved-settings-view.d.ts.map +1 -0
- package/dist/auth/settings/resolved-settings-view.js +152 -0
- package/dist/auth/settings/resolved-settings-view.js.map +1 -0
- package/dist/auth/settings/template-utils.d.ts +3 -0
- package/dist/auth/settings/template-utils.d.ts.map +1 -0
- package/dist/auth/settings/template-utils.js +43 -0
- package/dist/auth/settings/template-utils.js.map +1 -0
- package/dist/auth/settings/token-service.d.ts +86 -0
- package/dist/auth/settings/token-service.d.ts.map +1 -0
- package/dist/auth/settings/token-service.js +3 -0
- package/dist/auth/settings/token-service.js.map +1 -0
- package/dist/auth/system-env-store.d.ts +26 -0
- package/dist/auth/system-env-store.d.ts.map +1 -0
- package/dist/auth/system-env-store.js +92 -0
- package/dist/auth/system-env-store.js.map +1 -0
- package/dist/auth/user-agents-store.d.ts +31 -0
- package/dist/auth/user-agents-store.d.ts.map +1 -0
- package/dist/auth/user-agents-store.js +54 -0
- package/dist/auth/user-agents-store.js.map +1 -0
- package/dist/channels/binding-service.d.ts +69 -0
- package/dist/channels/binding-service.d.ts.map +1 -0
- package/dist/channels/binding-service.js +144 -0
- package/dist/channels/binding-service.js.map +1 -0
- package/dist/channels/index.d.ts +2 -0
- package/dist/channels/index.d.ts.map +1 -0
- package/dist/channels/index.js +6 -0
- package/dist/channels/index.js.map +1 -0
- package/dist/cli/gateway.d.ts +31 -0
- package/dist/cli/gateway.d.ts.map +1 -0
- package/dist/cli/gateway.js +1062 -0
- package/dist/cli/gateway.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +56 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/commands/built-in-commands.d.ts +10 -0
- package/dist/commands/built-in-commands.d.ts.map +1 -0
- package/dist/commands/built-in-commands.js +63 -0
- package/dist/commands/built-in-commands.js.map +1 -0
- package/dist/commands/command-dispatcher.d.ts +25 -0
- package/dist/commands/command-dispatcher.d.ts.map +1 -0
- package/dist/commands/command-dispatcher.js +50 -0
- package/dist/commands/command-dispatcher.js.map +1 -0
- package/dist/commands/command-reply-adapters.d.ts +3 -0
- package/dist/commands/command-reply-adapters.d.ts.map +1 -0
- package/dist/commands/command-reply-adapters.js +60 -0
- package/dist/commands/command-reply-adapters.js.map +1 -0
- package/dist/config/file-loader.d.ts +23 -0
- package/dist/config/file-loader.d.ts.map +1 -0
- package/dist/config/file-loader.js +495 -0
- package/dist/config/file-loader.js.map +1 -0
- package/dist/config/index.d.ts +96 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +357 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/network-allowlist.d.ts +18 -0
- package/dist/config/network-allowlist.d.ts.map +1 -0
- package/dist/config/network-allowlist.js +60 -0
- package/dist/config/network-allowlist.js.map +1 -0
- package/dist/connections/chat-instance-manager.d.ts +107 -0
- package/dist/connections/chat-instance-manager.d.ts.map +1 -0
- package/dist/connections/chat-instance-manager.js +886 -0
- package/dist/connections/chat-instance-manager.js.map +1 -0
- package/dist/connections/chat-response-bridge.d.ts +31 -0
- package/dist/connections/chat-response-bridge.d.ts.map +1 -0
- package/dist/connections/chat-response-bridge.js +465 -0
- package/dist/connections/chat-response-bridge.js.map +1 -0
- package/dist/connections/index.d.ts +4 -0
- package/dist/connections/index.d.ts.map +1 -0
- package/dist/connections/index.js +8 -0
- package/dist/connections/index.js.map +1 -0
- package/dist/connections/interaction-bridge.d.ts +7 -0
- package/dist/connections/interaction-bridge.d.ts.map +1 -0
- package/dist/connections/interaction-bridge.js +593 -0
- package/dist/connections/interaction-bridge.js.map +1 -0
- package/dist/connections/message-handler-bridge.d.ts +21 -0
- package/dist/connections/message-handler-bridge.d.ts.map +1 -0
- package/dist/connections/message-handler-bridge.js +314 -0
- package/dist/connections/message-handler-bridge.js.map +1 -0
- package/dist/connections/platform-auth-methods.d.ts +5 -0
- package/dist/connections/platform-auth-methods.d.ts.map +1 -0
- package/dist/connections/platform-auth-methods.js +13 -0
- package/dist/connections/platform-auth-methods.js.map +1 -0
- package/dist/connections/types.d.ts +52 -0
- package/dist/connections/types.d.ts.map +1 -0
- package/dist/connections/types.js +20 -0
- package/dist/connections/types.js.map +1 -0
- package/dist/gateway/connection-manager.d.ts +87 -0
- package/dist/gateway/connection-manager.d.ts.map +1 -0
- package/dist/gateway/connection-manager.js +216 -0
- package/dist/gateway/connection-manager.js.map +1 -0
- package/dist/gateway/index.d.ts +71 -0
- package/dist/gateway/index.d.ts.map +1 -0
- package/dist/gateway/index.js +509 -0
- package/dist/gateway/index.js.map +1 -0
- package/dist/gateway/job-router.d.ts +60 -0
- package/dist/gateway/job-router.d.ts.map +1 -0
- package/dist/gateway/job-router.js +148 -0
- package/dist/gateway/job-router.js.map +1 -0
- package/dist/gateway-main.d.ts +81 -0
- package/dist/gateway-main.d.ts.map +1 -0
- package/dist/gateway-main.js +143 -0
- package/dist/gateway-main.js.map +1 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +64 -0
- package/dist/index.js.map +1 -0
- package/dist/infrastructure/queue/index.d.ts +8 -0
- package/dist/infrastructure/queue/index.d.ts.map +1 -0
- package/dist/infrastructure/queue/index.js +12 -0
- package/dist/infrastructure/queue/index.js.map +1 -0
- package/dist/infrastructure/queue/queue-producer.d.ts +68 -0
- package/dist/infrastructure/queue/queue-producer.d.ts.map +1 -0
- package/dist/infrastructure/queue/queue-producer.js +72 -0
- package/dist/infrastructure/queue/queue-producer.js.map +1 -0
- package/dist/infrastructure/queue/redis-queue.d.ts +45 -0
- package/dist/infrastructure/queue/redis-queue.d.ts.map +1 -0
- package/dist/infrastructure/queue/redis-queue.js +273 -0
- package/dist/infrastructure/queue/redis-queue.js.map +1 -0
- package/dist/infrastructure/queue/types.d.ts +107 -0
- package/dist/infrastructure/queue/types.d.ts.map +1 -0
- package/dist/infrastructure/queue/types.js +7 -0
- package/dist/infrastructure/queue/types.js.map +1 -0
- package/dist/infrastructure/redis/system-message-limiter.d.ts +35 -0
- package/dist/infrastructure/redis/system-message-limiter.d.ts.map +1 -0
- package/dist/infrastructure/redis/system-message-limiter.js +61 -0
- package/dist/infrastructure/redis/system-message-limiter.js.map +1 -0
- package/dist/interactions/config-request-store.d.ts +41 -0
- package/dist/interactions/config-request-store.d.ts.map +1 -0
- package/dist/interactions/config-request-store.js +103 -0
- package/dist/interactions/config-request-store.js.map +1 -0
- package/dist/interactions.d.ts +134 -0
- package/dist/interactions.d.ts.map +1 -0
- package/dist/interactions.js +175 -0
- package/dist/interactions.js.map +1 -0
- package/dist/lobu.d.ts +78 -0
- package/dist/lobu.d.ts.map +1 -0
- package/dist/lobu.js +248 -0
- package/dist/lobu.js.map +1 -0
- package/dist/metrics/prometheus.d.ts +6 -0
- package/dist/metrics/prometheus.d.ts.map +1 -0
- package/dist/metrics/prometheus.js +78 -0
- package/dist/metrics/prometheus.js.map +1 -0
- package/dist/modules/module-system.d.ts +82 -0
- package/dist/modules/module-system.d.ts.map +1 -0
- package/dist/modules/module-system.js +53 -0
- package/dist/modules/module-system.js.map +1 -0
- package/dist/orchestration/base-deployment-manager.d.ts +173 -0
- package/dist/orchestration/base-deployment-manager.d.ts.map +1 -0
- package/dist/orchestration/base-deployment-manager.js +553 -0
- package/dist/orchestration/base-deployment-manager.js.map +1 -0
- package/dist/orchestration/deployment-utils.d.ts +25 -0
- package/dist/orchestration/deployment-utils.d.ts.map +1 -0
- package/dist/orchestration/deployment-utils.js +65 -0
- package/dist/orchestration/deployment-utils.js.map +1 -0
- package/dist/orchestration/impl/docker-deployment.d.ts +43 -0
- package/dist/orchestration/impl/docker-deployment.d.ts.map +1 -0
- package/dist/orchestration/impl/docker-deployment.js +480 -0
- package/dist/orchestration/impl/docker-deployment.js.map +1 -0
- package/dist/orchestration/impl/embedded-deployment.d.ts +16 -0
- package/dist/orchestration/impl/embedded-deployment.d.ts.map +1 -0
- package/dist/orchestration/impl/embedded-deployment.js +195 -0
- package/dist/orchestration/impl/embedded-deployment.js.map +1 -0
- package/dist/orchestration/impl/index.d.ts +8 -0
- package/dist/orchestration/impl/index.d.ts.map +1 -0
- package/dist/orchestration/impl/index.js +14 -0
- package/dist/orchestration/impl/index.js.map +1 -0
- package/dist/orchestration/impl/k8s/deployment.d.ts +204 -0
- package/dist/orchestration/impl/k8s/deployment.d.ts.map +1 -0
- package/dist/orchestration/impl/k8s/deployment.js +620 -0
- package/dist/orchestration/impl/k8s/deployment.js.map +1 -0
- package/dist/orchestration/impl/k8s/helpers.d.ts +34 -0
- package/dist/orchestration/impl/k8s/helpers.d.ts.map +1 -0
- package/dist/orchestration/impl/k8s/helpers.js +377 -0
- package/dist/orchestration/impl/k8s/helpers.js.map +1 -0
- package/dist/orchestration/impl/k8s/index.d.ts +2 -0
- package/dist/orchestration/impl/k8s/index.d.ts.map +1 -0
- package/dist/orchestration/impl/k8s/index.js +6 -0
- package/dist/orchestration/impl/k8s/index.js.map +1 -0
- package/dist/orchestration/index.d.ts +53 -0
- package/dist/orchestration/index.d.ts.map +1 -0
- package/dist/orchestration/index.js +257 -0
- package/dist/orchestration/index.js.map +1 -0
- package/dist/orchestration/message-consumer.d.ts +49 -0
- package/dist/orchestration/message-consumer.d.ts.map +1 -0
- package/dist/orchestration/message-consumer.js +406 -0
- package/dist/orchestration/message-consumer.js.map +1 -0
- package/dist/orchestration/scheduled-wakeup.d.ts +110 -0
- package/dist/orchestration/scheduled-wakeup.d.ts.map +1 -0
- package/dist/orchestration/scheduled-wakeup.js +500 -0
- package/dist/orchestration/scheduled-wakeup.js.map +1 -0
- package/dist/permissions/approval-policy.d.ts +28 -0
- package/dist/permissions/approval-policy.d.ts.map +1 -0
- package/dist/permissions/approval-policy.js +33 -0
- package/dist/permissions/approval-policy.js.map +1 -0
- package/dist/permissions/grant-store.d.ts +52 -0
- package/dist/permissions/grant-store.d.ts.map +1 -0
- package/dist/permissions/grant-store.js +192 -0
- package/dist/permissions/grant-store.js.map +1 -0
- package/dist/platform/file-handler.d.ts +51 -0
- package/dist/platform/file-handler.d.ts.map +1 -0
- package/dist/platform/file-handler.js +6 -0
- package/dist/platform/file-handler.js.map +1 -0
- package/dist/platform/link-buttons.d.ts +21 -0
- package/dist/platform/link-buttons.d.ts.map +1 -0
- package/dist/platform/link-buttons.js +43 -0
- package/dist/platform/link-buttons.js.map +1 -0
- package/dist/platform/renderer-utils.d.ts +10 -0
- package/dist/platform/renderer-utils.d.ts.map +1 -0
- package/dist/platform/renderer-utils.js +42 -0
- package/dist/platform/renderer-utils.js.map +1 -0
- package/dist/platform/response-renderer.d.ts +66 -0
- package/dist/platform/response-renderer.d.ts.map +1 -0
- package/dist/platform/response-renderer.js +8 -0
- package/dist/platform/response-renderer.js.map +1 -0
- package/dist/platform/unified-thread-consumer.d.ts +41 -0
- package/dist/platform/unified-thread-consumer.d.ts.map +1 -0
- package/dist/platform/unified-thread-consumer.js +143 -0
- package/dist/platform/unified-thread-consumer.js.map +1 -0
- package/dist/platform.d.ts +255 -0
- package/dist/platform.d.ts.map +1 -0
- package/dist/platform.js +40 -0
- package/dist/platform.js.map +1 -0
- package/dist/proxy/http-proxy.d.ts +32 -0
- package/dist/proxy/http-proxy.d.ts.map +1 -0
- package/dist/proxy/http-proxy.js +636 -0
- package/dist/proxy/http-proxy.js.map +1 -0
- package/dist/proxy/proxy-manager.d.ts +13 -0
- package/dist/proxy/proxy-manager.d.ts.map +1 -0
- package/dist/proxy/proxy-manager.js +68 -0
- package/dist/proxy/proxy-manager.js.map +1 -0
- package/dist/proxy/secret-proxy.d.ts +78 -0
- package/dist/proxy/secret-proxy.d.ts.map +1 -0
- package/dist/proxy/secret-proxy.js +309 -0
- package/dist/proxy/secret-proxy.js.map +1 -0
- package/dist/proxy/token-refresh-job.d.ts +29 -0
- package/dist/proxy/token-refresh-job.d.ts.map +1 -0
- package/dist/proxy/token-refresh-job.js +104 -0
- package/dist/proxy/token-refresh-job.js.map +1 -0
- package/dist/routes/internal/audio.d.ts +14 -0
- package/dist/routes/internal/audio.d.ts.map +1 -0
- package/dist/routes/internal/audio.js +118 -0
- package/dist/routes/internal/audio.js.map +1 -0
- package/dist/routes/internal/device-auth.d.ts +42 -0
- package/dist/routes/internal/device-auth.d.ts.map +1 -0
- package/dist/routes/internal/device-auth.js +397 -0
- package/dist/routes/internal/device-auth.js.map +1 -0
- package/dist/routes/internal/files.d.ts +9 -0
- package/dist/routes/internal/files.d.ts.map +1 -0
- package/dist/routes/internal/files.js +175 -0
- package/dist/routes/internal/files.js.map +1 -0
- package/dist/routes/internal/history.d.ts +9 -0
- package/dist/routes/internal/history.d.ts.map +1 -0
- package/dist/routes/internal/history.js +55 -0
- package/dist/routes/internal/history.js.map +1 -0
- package/dist/routes/internal/images.d.ts +10 -0
- package/dist/routes/internal/images.d.ts.map +1 -0
- package/dist/routes/internal/images.js +101 -0
- package/dist/routes/internal/images.js.map +1 -0
- package/dist/routes/internal/interactions.d.ts +9 -0
- package/dist/routes/internal/interactions.d.ts.map +1 -0
- package/dist/routes/internal/interactions.js +53 -0
- package/dist/routes/internal/interactions.js.map +1 -0
- package/dist/routes/internal/middleware.d.ts +7 -0
- package/dist/routes/internal/middleware.d.ts.map +1 -0
- package/dist/routes/internal/middleware.js +24 -0
- package/dist/routes/internal/middleware.js.map +1 -0
- package/dist/routes/internal/schedule.d.ts +14 -0
- package/dist/routes/internal/schedule.d.ts.map +1 -0
- package/dist/routes/internal/schedule.js +169 -0
- package/dist/routes/internal/schedule.js.map +1 -0
- package/dist/routes/internal/types.d.ts +22 -0
- package/dist/routes/internal/types.d.ts.map +1 -0
- package/dist/routes/internal/types.js +6 -0
- package/dist/routes/internal/types.js.map +1 -0
- package/dist/routes/openapi-auto.d.ts +8 -0
- package/dist/routes/openapi-auto.d.ts.map +1 -0
- package/dist/routes/openapi-auto.js +196 -0
- package/dist/routes/openapi-auto.js.map +1 -0
- package/dist/routes/public/agent-access.d.ts +11 -0
- package/dist/routes/public/agent-access.d.ts.map +1 -0
- package/dist/routes/public/agent-access.js +11 -0
- package/dist/routes/public/agent-access.js.map +1 -0
- package/dist/routes/public/agent-config.d.ts +42 -0
- package/dist/routes/public/agent-config.d.ts.map +1 -0
- package/dist/routes/public/agent-config.js +415 -0
- package/dist/routes/public/agent-config.js.map +1 -0
- package/dist/routes/public/agent-history.d.ts +17 -0
- package/dist/routes/public/agent-history.d.ts.map +1 -0
- package/dist/routes/public/agent-history.js +335 -0
- package/dist/routes/public/agent-history.js.map +1 -0
- package/dist/routes/public/agent-schedules.d.ts +18 -0
- package/dist/routes/public/agent-schedules.d.ts.map +1 -0
- package/dist/routes/public/agent-schedules.js +242 -0
- package/dist/routes/public/agent-schedules.js.map +1 -0
- package/dist/routes/public/agent.d.ts +23 -0
- package/dist/routes/public/agent.d.ts.map +1 -0
- package/dist/routes/public/agent.js +864 -0
- package/dist/routes/public/agent.js.map +1 -0
- package/dist/routes/public/agents.d.ts +22 -0
- package/dist/routes/public/agents.d.ts.map +1 -0
- package/dist/routes/public/agents.js +257 -0
- package/dist/routes/public/agents.js.map +1 -0
- package/dist/routes/public/channels.d.ts +23 -0
- package/dist/routes/public/channels.d.ts.map +1 -0
- package/dist/routes/public/channels.js +131 -0
- package/dist/routes/public/channels.js.map +1 -0
- package/dist/routes/public/cli-auth.d.ts +12 -0
- package/dist/routes/public/cli-auth.d.ts.map +1 -0
- package/dist/routes/public/cli-auth.js +552 -0
- package/dist/routes/public/cli-auth.js.map +1 -0
- package/dist/routes/public/connections.d.ts +20 -0
- package/dist/routes/public/connections.d.ts.map +1 -0
- package/dist/routes/public/connections.js +464 -0
- package/dist/routes/public/connections.js.map +1 -0
- package/dist/routes/public/landing.d.ts +3 -0
- package/dist/routes/public/landing.d.ts.map +1 -0
- package/dist/routes/public/landing.js +17 -0
- package/dist/routes/public/landing.js.map +1 -0
- package/dist/routes/public/oauth.d.ts +24 -0
- package/dist/routes/public/oauth.d.ts.map +1 -0
- package/dist/routes/public/oauth.js +108 -0
- package/dist/routes/public/oauth.js.map +1 -0
- package/dist/routes/public/settings-auth.d.ts +28 -0
- package/dist/routes/public/settings-auth.d.ts.map +1 -0
- package/dist/routes/public/settings-auth.js +90 -0
- package/dist/routes/public/settings-auth.js.map +1 -0
- package/dist/routes/public/slack.d.ts +4 -0
- package/dist/routes/public/slack.d.ts.map +1 -0
- package/dist/routes/public/slack.js +119 -0
- package/dist/routes/public/slack.js.map +1 -0
- package/dist/routes/shared/agent-ownership.d.ts +15 -0
- package/dist/routes/shared/agent-ownership.d.ts.map +1 -0
- package/dist/routes/shared/agent-ownership.js +61 -0
- package/dist/routes/shared/agent-ownership.js.map +1 -0
- package/dist/routes/shared/token-verifier.d.ts +21 -0
- package/dist/routes/shared/token-verifier.d.ts.map +1 -0
- package/dist/routes/shared/token-verifier.js +25 -0
- package/dist/routes/shared/token-verifier.js.map +1 -0
- package/dist/services/core-services.d.ts +133 -0
- package/dist/services/core-services.d.ts.map +1 -0
- package/dist/services/core-services.js +728 -0
- package/dist/services/core-services.js.map +1 -0
- package/dist/services/image-generation-service.d.ts +38 -0
- package/dist/services/image-generation-service.d.ts.map +1 -0
- package/dist/services/image-generation-service.js +167 -0
- package/dist/services/image-generation-service.js.map +1 -0
- package/dist/services/instruction-service.d.ts +41 -0
- package/dist/services/instruction-service.d.ts.map +1 -0
- package/dist/services/instruction-service.js +252 -0
- package/dist/services/instruction-service.js.map +1 -0
- package/dist/services/mcp-registry.d.ts +31 -0
- package/dist/services/mcp-registry.d.ts.map +1 -0
- package/dist/services/mcp-registry.js +69 -0
- package/dist/services/mcp-registry.js.map +1 -0
- package/dist/services/platform-helpers.d.ts +47 -0
- package/dist/services/platform-helpers.d.ts.map +1 -0
- package/dist/services/platform-helpers.js +200 -0
- package/dist/services/platform-helpers.js.map +1 -0
- package/dist/services/session-manager.d.ts +72 -0
- package/dist/services/session-manager.d.ts.map +1 -0
- package/dist/services/session-manager.js +199 -0
- package/dist/services/session-manager.js.map +1 -0
- package/dist/services/settings-resolver.d.ts +25 -0
- package/dist/services/settings-resolver.d.ts.map +1 -0
- package/dist/services/settings-resolver.js +55 -0
- package/dist/services/settings-resolver.js.map +1 -0
- package/dist/services/system-config-resolver.d.ts +25 -0
- package/dist/services/system-config-resolver.d.ts.map +1 -0
- package/dist/services/system-config-resolver.js +73 -0
- package/dist/services/system-config-resolver.js.map +1 -0
- package/dist/services/system-skills-service.d.ts +38 -0
- package/dist/services/system-skills-service.d.ts.map +1 -0
- package/dist/services/system-skills-service.js +186 -0
- package/dist/services/system-skills-service.js.map +1 -0
- package/dist/services/transcription-service.d.ts +91 -0
- package/dist/services/transcription-service.d.ts.map +1 -0
- package/dist/services/transcription-service.js +465 -0
- package/dist/services/transcription-service.js.map +1 -0
- package/dist/session.d.ts +75 -0
- package/dist/session.d.ts.map +1 -0
- package/dist/session.js +19 -0
- package/dist/session.js.map +1 -0
- package/dist/spaces/index.d.ts +2 -0
- package/dist/spaces/index.d.ts.map +1 -0
- package/dist/spaces/index.js +18 -0
- package/dist/spaces/index.js.map +1 -0
- package/dist/spaces/space-resolver.d.ts +10 -0
- package/dist/spaces/space-resolver.d.ts.map +1 -0
- package/dist/spaces/space-resolver.js +17 -0
- package/dist/spaces/space-resolver.js.map +1 -0
- package/dist/stores/in-memory-agent-store.d.ts +57 -0
- package/dist/stores/in-memory-agent-store.d.ts.map +1 -0
- package/dist/stores/in-memory-agent-store.js +304 -0
- package/dist/stores/in-memory-agent-store.js.map +1 -0
- package/dist/stores/redis-agent-store.d.ts +57 -0
- package/dist/stores/redis-agent-store.d.ts.map +1 -0
- package/dist/stores/redis-agent-store.js +163 -0
- package/dist/stores/redis-agent-store.js.map +1 -0
- package/dist/utils/public-url.d.ts +6 -0
- package/dist/utils/public-url.d.ts.map +1 -0
- package/dist/utils/public-url.js +33 -0
- package/dist/utils/public-url.js.map +1 -0
- package/dist/utils/rate-limiter.d.ts +32 -0
- package/dist/utils/rate-limiter.d.ts.map +1 -0
- package/dist/utils/rate-limiter.js +56 -0
- package/dist/utils/rate-limiter.js.map +1 -0
- package/package.json +63 -0
|
@@ -0,0 +1,500 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Scheduled Wake-Up Service
|
|
4
|
+
*
|
|
5
|
+
* Allows workers (Claude) to schedule future tasks that will wake them up.
|
|
6
|
+
* Uses Redis for storage and BullMQ for delayed job processing.
|
|
7
|
+
* Supports one-time delays (delayMinutes) and recurring schedules (cron expressions).
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.ScheduledWakeupService = void 0;
|
|
11
|
+
exports.setScheduledWakeupService = setScheduledWakeupService;
|
|
12
|
+
exports.getScheduledWakeupService = getScheduledWakeupService;
|
|
13
|
+
const node_crypto_1 = require("node:crypto");
|
|
14
|
+
const core_1 = require("@lobu/core");
|
|
15
|
+
const cron_parser_1 = require("cron-parser");
|
|
16
|
+
const logger = (0, core_1.createLogger)("scheduled-wakeup");
|
|
17
|
+
// ============================================================================
|
|
18
|
+
// Constants
|
|
19
|
+
// ============================================================================
|
|
20
|
+
const QUEUE_NAME = "scheduled_wakeups";
|
|
21
|
+
const REDIS_KEY_PREFIX = "schedule:wakeup:";
|
|
22
|
+
const REDIS_INDEX_PREFIX = "schedule:deployment:";
|
|
23
|
+
const REDIS_AGENT_INDEX_PREFIX = "schedule:agent:";
|
|
24
|
+
// Limits
|
|
25
|
+
const MAX_PENDING_PER_DEPLOYMENT = 10;
|
|
26
|
+
const MAX_DELAY_MINUTES = 1440; // 24 hours
|
|
27
|
+
const SCHEDULE_TTL_SECONDS = 60 * 60 * 24 * 8; // 8 days (for recurring schedules)
|
|
28
|
+
// Cron-specific limits
|
|
29
|
+
const MIN_CRON_INTERVAL_MINUTES = 5; // Minimum 5 minutes between triggers
|
|
30
|
+
const MAX_ITERATIONS = 100; // Maximum iterations for recurring
|
|
31
|
+
const DEFAULT_RECURRING_ITERATIONS = 10; // Default max iterations for recurring
|
|
32
|
+
const MAX_FIRST_TRIGGER_DAYS = 7; // First trigger must be within 7 days
|
|
33
|
+
// ============================================================================
|
|
34
|
+
// Module-level singleton reference
|
|
35
|
+
// ============================================================================
|
|
36
|
+
let scheduledWakeupServiceInstance;
|
|
37
|
+
/**
|
|
38
|
+
* Set the global ScheduledWakeupService instance
|
|
39
|
+
* Called by CoreServices after initialization
|
|
40
|
+
*/
|
|
41
|
+
function setScheduledWakeupService(service) {
|
|
42
|
+
scheduledWakeupServiceInstance = service;
|
|
43
|
+
logger.debug("ScheduledWakeupService instance set");
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Get the global ScheduledWakeupService instance (if available)
|
|
47
|
+
* Used by BaseDeploymentManager for cleanup
|
|
48
|
+
*/
|
|
49
|
+
function getScheduledWakeupService() {
|
|
50
|
+
return scheduledWakeupServiceInstance;
|
|
51
|
+
}
|
|
52
|
+
// ============================================================================
|
|
53
|
+
// Service
|
|
54
|
+
// ============================================================================
|
|
55
|
+
class ScheduledWakeupService {
|
|
56
|
+
constructor(queue) {
|
|
57
|
+
this.isInitialized = false;
|
|
58
|
+
this.queue = queue;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Initialize the service - creates queue and starts worker
|
|
62
|
+
*/
|
|
63
|
+
async start() {
|
|
64
|
+
await this.queue.createQueue(QUEUE_NAME);
|
|
65
|
+
// Register worker to process delayed jobs
|
|
66
|
+
await this.queue.work(QUEUE_NAME, async (job) => {
|
|
67
|
+
await this.processScheduledJob(job);
|
|
68
|
+
});
|
|
69
|
+
this.isInitialized = true;
|
|
70
|
+
logger.debug("Scheduled wakeup service started");
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Schedule a future wakeup (one-time or recurring)
|
|
74
|
+
*/
|
|
75
|
+
async schedule(params) {
|
|
76
|
+
if (!this.isInitialized) {
|
|
77
|
+
throw new Error("Scheduled wakeup service not initialized");
|
|
78
|
+
}
|
|
79
|
+
// Validate: must have either delayMinutes OR cron, not both
|
|
80
|
+
if (params.delayMinutes && params.cron) {
|
|
81
|
+
throw new Error("Cannot specify both delayMinutes and cron - use one or the other");
|
|
82
|
+
}
|
|
83
|
+
if (!params.delayMinutes && !params.cron) {
|
|
84
|
+
throw new Error("Must specify either delayMinutes or cron");
|
|
85
|
+
}
|
|
86
|
+
const isRecurring = !!params.cron;
|
|
87
|
+
let triggerAt;
|
|
88
|
+
let delayMs;
|
|
89
|
+
if (params.cron) {
|
|
90
|
+
// Validate and parse cron expression
|
|
91
|
+
const cronValidation = this.validateCron(params.cron);
|
|
92
|
+
if (!cronValidation.valid) {
|
|
93
|
+
throw new Error(cronValidation.error);
|
|
94
|
+
}
|
|
95
|
+
triggerAt = cronValidation.firstTrigger;
|
|
96
|
+
delayMs = triggerAt.getTime() - Date.now();
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
// Validate delay
|
|
100
|
+
if (params.delayMinutes < 1 ||
|
|
101
|
+
params.delayMinutes > MAX_DELAY_MINUTES) {
|
|
102
|
+
throw new Error(`Delay must be between 1 and ${MAX_DELAY_MINUTES} minutes`);
|
|
103
|
+
}
|
|
104
|
+
triggerAt = new Date(Date.now() + params.delayMinutes * 60 * 1000);
|
|
105
|
+
delayMs = params.delayMinutes * 60 * 1000;
|
|
106
|
+
}
|
|
107
|
+
// Validate maxIterations (unlimited skips the cap)
|
|
108
|
+
const maxIterations = params.unlimited
|
|
109
|
+
? Number.MAX_SAFE_INTEGER
|
|
110
|
+
: params.maxIterations
|
|
111
|
+
? Math.min(Math.max(1, params.maxIterations), MAX_ITERATIONS)
|
|
112
|
+
: isRecurring
|
|
113
|
+
? DEFAULT_RECURRING_ITERATIONS
|
|
114
|
+
: 1;
|
|
115
|
+
// Check pending count limit
|
|
116
|
+
const pending = await this.listPending(params.deploymentName);
|
|
117
|
+
if (pending.length >= MAX_PENDING_PER_DEPLOYMENT) {
|
|
118
|
+
throw new Error(`Maximum of ${MAX_PENDING_PER_DEPLOYMENT} pending schedules per deployment`);
|
|
119
|
+
}
|
|
120
|
+
const redis = this.queue.getRedisClient();
|
|
121
|
+
const scheduleId = (0, node_crypto_1.randomUUID)();
|
|
122
|
+
const now = new Date();
|
|
123
|
+
const schedule = {
|
|
124
|
+
id: scheduleId,
|
|
125
|
+
deploymentName: params.deploymentName,
|
|
126
|
+
conversationId: params.conversationId,
|
|
127
|
+
channelId: params.channelId,
|
|
128
|
+
userId: params.userId,
|
|
129
|
+
agentId: params.agentId,
|
|
130
|
+
teamId: params.teamId,
|
|
131
|
+
platform: params.platform,
|
|
132
|
+
task: params.task,
|
|
133
|
+
context: params.context,
|
|
134
|
+
scheduledAt: now.toISOString(),
|
|
135
|
+
triggerAt: triggerAt.toISOString(),
|
|
136
|
+
status: "pending",
|
|
137
|
+
// Recurring fields
|
|
138
|
+
cron: params.cron,
|
|
139
|
+
iteration: 1,
|
|
140
|
+
maxIterations,
|
|
141
|
+
isRecurring,
|
|
142
|
+
unlimited: params.unlimited,
|
|
143
|
+
source: params.source,
|
|
144
|
+
};
|
|
145
|
+
// Store in Redis with TTL
|
|
146
|
+
const redisKey = `${REDIS_KEY_PREFIX}${scheduleId}`;
|
|
147
|
+
await redis.setex(redisKey, SCHEDULE_TTL_SECONDS, JSON.stringify(schedule));
|
|
148
|
+
// Add to deployment index
|
|
149
|
+
const deploymentIndexKey = `${REDIS_INDEX_PREFIX}${params.deploymentName}`;
|
|
150
|
+
await redis.sadd(deploymentIndexKey, scheduleId);
|
|
151
|
+
await redis.expire(deploymentIndexKey, SCHEDULE_TTL_SECONDS);
|
|
152
|
+
// Add to agent index (for settings UI)
|
|
153
|
+
const agentIndexKey = `${REDIS_AGENT_INDEX_PREFIX}${params.agentId}`;
|
|
154
|
+
await redis.sadd(agentIndexKey, scheduleId);
|
|
155
|
+
await redis.expire(agentIndexKey, SCHEDULE_TTL_SECONDS);
|
|
156
|
+
// Create delayed job in BullMQ
|
|
157
|
+
const jobPayload = {
|
|
158
|
+
scheduleId,
|
|
159
|
+
deploymentName: params.deploymentName,
|
|
160
|
+
conversationId: params.conversationId,
|
|
161
|
+
channelId: params.channelId,
|
|
162
|
+
userId: params.userId,
|
|
163
|
+
agentId: params.agentId,
|
|
164
|
+
teamId: params.teamId,
|
|
165
|
+
platform: params.platform,
|
|
166
|
+
};
|
|
167
|
+
await this.queue.send(QUEUE_NAME, jobPayload, {
|
|
168
|
+
delayMs,
|
|
169
|
+
singletonKey: `schedule-${scheduleId}`,
|
|
170
|
+
});
|
|
171
|
+
logger.info({
|
|
172
|
+
scheduleId,
|
|
173
|
+
deploymentName: params.deploymentName,
|
|
174
|
+
triggerAt: triggerAt.toISOString(),
|
|
175
|
+
isRecurring,
|
|
176
|
+
cron: params.cron,
|
|
177
|
+
maxIterations,
|
|
178
|
+
}, "Scheduled wakeup created");
|
|
179
|
+
return schedule;
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Schedule from an external service (no worker context needed).
|
|
183
|
+
* Synthesizes deployment/conversation context from agentId.
|
|
184
|
+
*/
|
|
185
|
+
async scheduleExternal(params) {
|
|
186
|
+
return this.schedule({
|
|
187
|
+
deploymentName: `external-${params.agentId.slice(0, 8)}`,
|
|
188
|
+
conversationId: params.agentId,
|
|
189
|
+
channelId: params.agentId,
|
|
190
|
+
userId: "system",
|
|
191
|
+
agentId: params.agentId,
|
|
192
|
+
teamId: "external",
|
|
193
|
+
platform: "api",
|
|
194
|
+
task: params.task,
|
|
195
|
+
context: params.context,
|
|
196
|
+
cron: params.cron,
|
|
197
|
+
delayMinutes: params.delayMinutes,
|
|
198
|
+
maxIterations: params.maxIterations,
|
|
199
|
+
unlimited: !!params.cron, // cron schedules from external are unlimited by default
|
|
200
|
+
source: params.source,
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* Validate a cron expression and return first trigger time
|
|
205
|
+
*/
|
|
206
|
+
validateCron(cronExpr) {
|
|
207
|
+
try {
|
|
208
|
+
const interval = cron_parser_1.CronExpressionParser.parse(cronExpr);
|
|
209
|
+
// Get next two occurrences to check interval
|
|
210
|
+
const first = interval.next().toDate();
|
|
211
|
+
const second = interval.next().toDate();
|
|
212
|
+
// Check minimum interval
|
|
213
|
+
const intervalMs = second.getTime() - first.getTime();
|
|
214
|
+
const intervalMinutes = intervalMs / (60 * 1000);
|
|
215
|
+
if (intervalMinutes < MIN_CRON_INTERVAL_MINUTES) {
|
|
216
|
+
return {
|
|
217
|
+
valid: false,
|
|
218
|
+
error: `Cron interval must be at least ${MIN_CRON_INTERVAL_MINUTES} minutes (got ${intervalMinutes.toFixed(1)} minutes)`,
|
|
219
|
+
};
|
|
220
|
+
}
|
|
221
|
+
// Check first trigger is not too far in the future
|
|
222
|
+
const daysUntilFirst = (first.getTime() - Date.now()) / (24 * 60 * 60 * 1000);
|
|
223
|
+
if (daysUntilFirst > MAX_FIRST_TRIGGER_DAYS) {
|
|
224
|
+
return {
|
|
225
|
+
valid: false,
|
|
226
|
+
error: `First trigger must be within ${MAX_FIRST_TRIGGER_DAYS} days (got ${daysUntilFirst.toFixed(1)} days)`,
|
|
227
|
+
};
|
|
228
|
+
}
|
|
229
|
+
return { valid: true, firstTrigger: first };
|
|
230
|
+
}
|
|
231
|
+
catch (error) {
|
|
232
|
+
return {
|
|
233
|
+
valid: false,
|
|
234
|
+
error: `Invalid cron expression: ${error instanceof Error ? error.message : String(error)}`,
|
|
235
|
+
};
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
/**
|
|
239
|
+
* Cancel a scheduled wakeup
|
|
240
|
+
*/
|
|
241
|
+
async cancel(scheduleId, deploymentName) {
|
|
242
|
+
const redis = this.queue.getRedisClient();
|
|
243
|
+
const redisKey = `${REDIS_KEY_PREFIX}${scheduleId}`;
|
|
244
|
+
// Get current schedule
|
|
245
|
+
const data = await redis.get(redisKey);
|
|
246
|
+
if (!data) {
|
|
247
|
+
return false;
|
|
248
|
+
}
|
|
249
|
+
const schedule = JSON.parse(data);
|
|
250
|
+
// Verify ownership
|
|
251
|
+
if (schedule.deploymentName !== deploymentName) {
|
|
252
|
+
throw new Error("Schedule does not belong to this deployment");
|
|
253
|
+
}
|
|
254
|
+
// Update status to cancelled
|
|
255
|
+
schedule.status = "cancelled";
|
|
256
|
+
await redis.setex(redisKey, 60 * 60, JSON.stringify(schedule)); // Keep for 1 hour for auditing
|
|
257
|
+
// Remove from indices
|
|
258
|
+
const deploymentIndexKey = `${REDIS_INDEX_PREFIX}${deploymentName}`;
|
|
259
|
+
await redis.srem(deploymentIndexKey, scheduleId);
|
|
260
|
+
const agentIndexKey = `${REDIS_AGENT_INDEX_PREFIX}${schedule.agentId}`;
|
|
261
|
+
await redis.srem(agentIndexKey, scheduleId);
|
|
262
|
+
logger.info({ scheduleId, deploymentName }, "Scheduled wakeup cancelled");
|
|
263
|
+
return true;
|
|
264
|
+
}
|
|
265
|
+
/**
|
|
266
|
+
* List pending schedules for a deployment
|
|
267
|
+
*/
|
|
268
|
+
async listPending(deploymentName) {
|
|
269
|
+
const redis = this.queue.getRedisClient();
|
|
270
|
+
const deploymentIndexKey = `${REDIS_INDEX_PREFIX}${deploymentName}`;
|
|
271
|
+
const scheduleIds = await redis.smembers(deploymentIndexKey);
|
|
272
|
+
const schedules = [];
|
|
273
|
+
for (const scheduleId of scheduleIds) {
|
|
274
|
+
try {
|
|
275
|
+
const redisKey = `${REDIS_KEY_PREFIX}${scheduleId}`;
|
|
276
|
+
const data = await redis.get(redisKey);
|
|
277
|
+
if (data) {
|
|
278
|
+
const schedule = JSON.parse(data);
|
|
279
|
+
if (schedule.status === "pending") {
|
|
280
|
+
schedules.push(schedule);
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
catch (error) {
|
|
285
|
+
logger.warn({ scheduleId, deploymentName, error }, "Failed to fetch schedule entry, skipping");
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
// Sort by trigger time
|
|
289
|
+
schedules.sort((a, b) => new Date(a.triggerAt).getTime() - new Date(b.triggerAt).getTime());
|
|
290
|
+
return schedules;
|
|
291
|
+
}
|
|
292
|
+
/**
|
|
293
|
+
* List pending schedules for an agent (used by settings UI)
|
|
294
|
+
*/
|
|
295
|
+
async listPendingForAgent(agentId) {
|
|
296
|
+
const redis = this.queue.getRedisClient();
|
|
297
|
+
const agentIndexKey = `${REDIS_AGENT_INDEX_PREFIX}${agentId}`;
|
|
298
|
+
const scheduleIds = await redis.smembers(agentIndexKey);
|
|
299
|
+
const schedules = [];
|
|
300
|
+
for (const scheduleId of scheduleIds) {
|
|
301
|
+
try {
|
|
302
|
+
const redisKey = `${REDIS_KEY_PREFIX}${scheduleId}`;
|
|
303
|
+
const data = await redis.get(redisKey);
|
|
304
|
+
if (data) {
|
|
305
|
+
const schedule = JSON.parse(data);
|
|
306
|
+
if (schedule.status === "pending") {
|
|
307
|
+
schedules.push(schedule);
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
catch (error) {
|
|
312
|
+
logger.warn({ scheduleId, agentId, error }, "Failed to fetch schedule entry, skipping");
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
// Sort by trigger time
|
|
316
|
+
schedules.sort((a, b) => new Date(a.triggerAt).getTime() - new Date(b.triggerAt).getTime());
|
|
317
|
+
return schedules;
|
|
318
|
+
}
|
|
319
|
+
/**
|
|
320
|
+
* Cancel a schedule by ID (for settings UI - verifies agent ownership)
|
|
321
|
+
*/
|
|
322
|
+
async cancelByAgent(scheduleId, agentId) {
|
|
323
|
+
const redis = this.queue.getRedisClient();
|
|
324
|
+
const redisKey = `${REDIS_KEY_PREFIX}${scheduleId}`;
|
|
325
|
+
// Get current schedule
|
|
326
|
+
const data = await redis.get(redisKey);
|
|
327
|
+
if (!data) {
|
|
328
|
+
return false;
|
|
329
|
+
}
|
|
330
|
+
const schedule = JSON.parse(data);
|
|
331
|
+
// Verify agent ownership
|
|
332
|
+
if (schedule.agentId !== agentId) {
|
|
333
|
+
throw new Error("Schedule does not belong to this agent");
|
|
334
|
+
}
|
|
335
|
+
// Update status to cancelled
|
|
336
|
+
schedule.status = "cancelled";
|
|
337
|
+
await redis.setex(redisKey, 60 * 60, JSON.stringify(schedule));
|
|
338
|
+
// Remove from indices
|
|
339
|
+
const deploymentIndexKey = `${REDIS_INDEX_PREFIX}${schedule.deploymentName}`;
|
|
340
|
+
await redis.srem(deploymentIndexKey, scheduleId);
|
|
341
|
+
const agentIndexKey = `${REDIS_AGENT_INDEX_PREFIX}${agentId}`;
|
|
342
|
+
await redis.srem(agentIndexKey, scheduleId);
|
|
343
|
+
logger.info({ scheduleId, agentId }, "Scheduled wakeup cancelled by agent");
|
|
344
|
+
return true;
|
|
345
|
+
}
|
|
346
|
+
/**
|
|
347
|
+
* Clean up schedules when a deployment is deleted
|
|
348
|
+
*/
|
|
349
|
+
async cleanupForDeployment(deploymentName) {
|
|
350
|
+
const redis = this.queue.getRedisClient();
|
|
351
|
+
const deploymentIndexKey = `${REDIS_INDEX_PREFIX}${deploymentName}`;
|
|
352
|
+
const scheduleIds = await redis.smembers(deploymentIndexKey);
|
|
353
|
+
for (const scheduleId of scheduleIds) {
|
|
354
|
+
const redisKey = `${REDIS_KEY_PREFIX}${scheduleId}`;
|
|
355
|
+
const data = await redis.get(redisKey);
|
|
356
|
+
if (data) {
|
|
357
|
+
const schedule = JSON.parse(data);
|
|
358
|
+
// Remove from agent index
|
|
359
|
+
const agentIndexKey = `${REDIS_AGENT_INDEX_PREFIX}${schedule.agentId}`;
|
|
360
|
+
await redis.srem(agentIndexKey, scheduleId);
|
|
361
|
+
}
|
|
362
|
+
await redis.del(redisKey);
|
|
363
|
+
}
|
|
364
|
+
await redis.del(deploymentIndexKey);
|
|
365
|
+
if (scheduleIds.length > 0) {
|
|
366
|
+
logger.info({ deploymentName, count: scheduleIds.length }, "Cleaned up schedules for deployment");
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
/**
|
|
370
|
+
* Process a scheduled job when it triggers
|
|
371
|
+
*/
|
|
372
|
+
async processScheduledJob(job) {
|
|
373
|
+
const { scheduleId, deploymentName } = job.data;
|
|
374
|
+
const redis = this.queue.getRedisClient();
|
|
375
|
+
const redisKey = `${REDIS_KEY_PREFIX}${scheduleId}`;
|
|
376
|
+
// Get schedule data
|
|
377
|
+
const data = await redis.get(redisKey);
|
|
378
|
+
if (!data) {
|
|
379
|
+
logger.warn({ scheduleId }, "Schedule not found - may have expired or been deleted");
|
|
380
|
+
return;
|
|
381
|
+
}
|
|
382
|
+
const schedule = JSON.parse(data);
|
|
383
|
+
// Check if cancelled
|
|
384
|
+
if (schedule.status === "cancelled") {
|
|
385
|
+
logger.info({ scheduleId }, "Schedule was cancelled - skipping");
|
|
386
|
+
return;
|
|
387
|
+
}
|
|
388
|
+
// Build the message to inject into the thread
|
|
389
|
+
const contextStr = schedule.context
|
|
390
|
+
? `\n\nContext: ${JSON.stringify(schedule.context, null, 2)}`
|
|
391
|
+
: "";
|
|
392
|
+
// Include iteration info for recurring schedules
|
|
393
|
+
const iterationInfo = schedule.isRecurring
|
|
394
|
+
? ` (iteration ${schedule.iteration} of ${schedule.maxIterations})`
|
|
395
|
+
: "";
|
|
396
|
+
const cronInfo = schedule.cron ? `\nSchedule: ${schedule.cron}` : "";
|
|
397
|
+
const messageText = `[System] Scheduled reminder from yourself${iterationInfo}:
|
|
398
|
+
|
|
399
|
+
Task: ${schedule.task}${contextStr}
|
|
400
|
+
|
|
401
|
+
---${cronInfo}
|
|
402
|
+
Originally scheduled at: ${schedule.scheduledAt}
|
|
403
|
+
Schedule ID: ${schedule.id}`;
|
|
404
|
+
// Enqueue to the main messages queue (same as platform messages)
|
|
405
|
+
await this.queue.send("messages", {
|
|
406
|
+
userId: schedule.userId,
|
|
407
|
+
conversationId: schedule.conversationId,
|
|
408
|
+
messageId: `scheduled-${scheduleId}-${schedule.iteration}`,
|
|
409
|
+
channelId: schedule.channelId,
|
|
410
|
+
teamId: schedule.teamId,
|
|
411
|
+
agentId: schedule.agentId,
|
|
412
|
+
botId: "system",
|
|
413
|
+
platform: schedule.platform,
|
|
414
|
+
messageText,
|
|
415
|
+
platformMetadata: {
|
|
416
|
+
isScheduledWakeup: true,
|
|
417
|
+
scheduleId,
|
|
418
|
+
iteration: schedule.iteration,
|
|
419
|
+
maxIterations: schedule.maxIterations,
|
|
420
|
+
isRecurring: schedule.isRecurring,
|
|
421
|
+
},
|
|
422
|
+
agentOptions: {},
|
|
423
|
+
}, {
|
|
424
|
+
priority: 5, // Medium priority
|
|
425
|
+
});
|
|
426
|
+
logger.info({
|
|
427
|
+
scheduleId,
|
|
428
|
+
deploymentName,
|
|
429
|
+
conversationId: schedule.conversationId,
|
|
430
|
+
iteration: schedule.iteration,
|
|
431
|
+
maxIterations: schedule.maxIterations,
|
|
432
|
+
isRecurring: schedule.isRecurring,
|
|
433
|
+
}, "Scheduled wakeup triggered - message enqueued");
|
|
434
|
+
// Handle recurring: schedule next iteration or complete
|
|
435
|
+
const hasIterationsLeft = schedule.unlimited || schedule.iteration < schedule.maxIterations;
|
|
436
|
+
if (schedule.isRecurring && hasIterationsLeft && schedule.cron) {
|
|
437
|
+
try {
|
|
438
|
+
// Calculate next trigger from cron
|
|
439
|
+
const interval = cron_parser_1.CronExpressionParser.parse(schedule.cron);
|
|
440
|
+
const nextTrigger = interval.next().toDate();
|
|
441
|
+
const delayMs = nextTrigger.getTime() - Date.now();
|
|
442
|
+
const nextIteration = schedule.iteration + 1;
|
|
443
|
+
// Persist iteration increment BEFORE enqueuing the next job.
|
|
444
|
+
// This prevents duplicate processing if the process crashes
|
|
445
|
+
// between enqueue and persist.
|
|
446
|
+
schedule.iteration = nextIteration;
|
|
447
|
+
schedule.triggerAt = nextTrigger.toISOString();
|
|
448
|
+
await redis.setex(redisKey, SCHEDULE_TTL_SECONDS, JSON.stringify(schedule));
|
|
449
|
+
// Create next delayed job
|
|
450
|
+
const jobPayload = {
|
|
451
|
+
scheduleId,
|
|
452
|
+
deploymentName: schedule.deploymentName,
|
|
453
|
+
conversationId: schedule.conversationId,
|
|
454
|
+
channelId: schedule.channelId,
|
|
455
|
+
userId: schedule.userId,
|
|
456
|
+
agentId: schedule.agentId,
|
|
457
|
+
teamId: schedule.teamId,
|
|
458
|
+
platform: schedule.platform,
|
|
459
|
+
};
|
|
460
|
+
await this.queue.send(QUEUE_NAME, jobPayload, {
|
|
461
|
+
delayMs,
|
|
462
|
+
singletonKey: `schedule-${scheduleId}-${nextIteration}`,
|
|
463
|
+
});
|
|
464
|
+
logger.info({
|
|
465
|
+
scheduleId,
|
|
466
|
+
nextIteration: schedule.iteration,
|
|
467
|
+
nextTrigger: nextTrigger.toISOString(),
|
|
468
|
+
}, "Scheduled next recurring iteration");
|
|
469
|
+
}
|
|
470
|
+
catch (error) {
|
|
471
|
+
logger.error({ scheduleId, error }, "Failed to schedule next recurring iteration");
|
|
472
|
+
// Mark as triggered (completed with error) and clean up
|
|
473
|
+
schedule.status = "triggered";
|
|
474
|
+
await redis.setex(redisKey, 60 * 60, JSON.stringify(schedule));
|
|
475
|
+
const deploymentIndexKey = `${REDIS_INDEX_PREFIX}${deploymentName}`;
|
|
476
|
+
await redis.srem(deploymentIndexKey, scheduleId);
|
|
477
|
+
const agentIndexKey = `${REDIS_AGENT_INDEX_PREFIX}${schedule.agentId}`;
|
|
478
|
+
await redis.srem(agentIndexKey, scheduleId);
|
|
479
|
+
}
|
|
480
|
+
}
|
|
481
|
+
else {
|
|
482
|
+
// One-time schedule or max iterations reached - mark as triggered and clean up
|
|
483
|
+
schedule.status = "triggered";
|
|
484
|
+
await redis.setex(redisKey, 60 * 60, JSON.stringify(schedule)); // Keep for 1 hour
|
|
485
|
+
// Remove from indices
|
|
486
|
+
const deploymentIndexKey = `${REDIS_INDEX_PREFIX}${deploymentName}`;
|
|
487
|
+
await redis.srem(deploymentIndexKey, scheduleId);
|
|
488
|
+
const agentIndexKey = `${REDIS_AGENT_INDEX_PREFIX}${schedule.agentId}`;
|
|
489
|
+
await redis.srem(agentIndexKey, scheduleId);
|
|
490
|
+
if (schedule.isRecurring) {
|
|
491
|
+
logger.info({
|
|
492
|
+
scheduleId,
|
|
493
|
+
completedIterations: schedule.iteration,
|
|
494
|
+
}, "Recurring schedule completed all iterations");
|
|
495
|
+
}
|
|
496
|
+
}
|
|
497
|
+
}
|
|
498
|
+
}
|
|
499
|
+
exports.ScheduledWakeupService = ScheduledWakeupService;
|
|
500
|
+
//# sourceMappingURL=scheduled-wakeup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scheduled-wakeup.js","sourceRoot":"","sources":["../../src/orchestration/scheduled-wakeup.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP Tool Approval Policy
|
|
3
|
+
*
|
|
4
|
+
* Uses MCP protocol tool annotations to determine whether a tool call
|
|
5
|
+
* requires explicit user approval (grant) before execution.
|
|
6
|
+
*
|
|
7
|
+
* Per the MCP spec, the default assumption is destructiveHint=true,
|
|
8
|
+
* so tools without annotations require approval (conservative default).
|
|
9
|
+
*/
|
|
10
|
+
export interface McpToolAnnotations {
|
|
11
|
+
readOnlyHint?: boolean;
|
|
12
|
+
destructiveHint?: boolean;
|
|
13
|
+
idempotentHint?: boolean;
|
|
14
|
+
openWorldHint?: boolean;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Determine if a tool call requires user approval based on its annotations.
|
|
18
|
+
*
|
|
19
|
+
* Returns false (no approval needed) when:
|
|
20
|
+
* - readOnlyHint is explicitly true
|
|
21
|
+
* - destructiveHint is explicitly false
|
|
22
|
+
*
|
|
23
|
+
* Returns true (approval required) otherwise, including when:
|
|
24
|
+
* - No annotations provided (conservative default)
|
|
25
|
+
* - destructiveHint is true (default per MCP spec)
|
|
26
|
+
*/
|
|
27
|
+
export declare function requiresToolApproval(annotations?: McpToolAnnotations): boolean;
|
|
28
|
+
//# sourceMappingURL=approval-policy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"approval-policy.d.ts","sourceRoot":"","sources":["../../src/permissions/approval-policy.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,MAAM,WAAW,kBAAkB;IACjC,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,oBAAoB,CAClC,WAAW,CAAC,EAAE,kBAAkB,GAC/B,OAAO,CAKT"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* MCP Tool Approval Policy
|
|
4
|
+
*
|
|
5
|
+
* Uses MCP protocol tool annotations to determine whether a tool call
|
|
6
|
+
* requires explicit user approval (grant) before execution.
|
|
7
|
+
*
|
|
8
|
+
* Per the MCP spec, the default assumption is destructiveHint=true,
|
|
9
|
+
* so tools without annotations require approval (conservative default).
|
|
10
|
+
*/
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.requiresToolApproval = requiresToolApproval;
|
|
13
|
+
/**
|
|
14
|
+
* Determine if a tool call requires user approval based on its annotations.
|
|
15
|
+
*
|
|
16
|
+
* Returns false (no approval needed) when:
|
|
17
|
+
* - readOnlyHint is explicitly true
|
|
18
|
+
* - destructiveHint is explicitly false
|
|
19
|
+
*
|
|
20
|
+
* Returns true (approval required) otherwise, including when:
|
|
21
|
+
* - No annotations provided (conservative default)
|
|
22
|
+
* - destructiveHint is true (default per MCP spec)
|
|
23
|
+
*/
|
|
24
|
+
function requiresToolApproval(annotations) {
|
|
25
|
+
if (!annotations)
|
|
26
|
+
return true;
|
|
27
|
+
if (annotations.readOnlyHint === true)
|
|
28
|
+
return false;
|
|
29
|
+
if (annotations.destructiveHint === false)
|
|
30
|
+
return false;
|
|
31
|
+
return true;
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=approval-policy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"approval-policy.js","sourceRoot":"","sources":["../../src/permissions/approval-policy.ts"],"names":[],"mappings":";AAAA;;;;;;;;GAQG;;AAoBH,oDAOC;AAlBD;;;;;;;;;;GAUG;AACH,SAAgB,oBAAoB,CAClC,WAAgC;IAEhC,IAAI,CAAC,WAAW;QAAE,OAAO,IAAI,CAAC;IAC9B,IAAI,WAAW,CAAC,YAAY,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IACpD,IAAI,WAAW,CAAC,eAAe,KAAK,KAAK;QAAE,OAAO,KAAK,CAAC;IACxD,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
export interface Grant {
|
|
2
|
+
pattern: string;
|
|
3
|
+
expiresAt: number | null;
|
|
4
|
+
grantedAt: number;
|
|
5
|
+
denied?: boolean;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Unified grant store for URL-pattern permissions.
|
|
9
|
+
*
|
|
10
|
+
* Patterns can be:
|
|
11
|
+
* - Domain: "api.openai.com", "*.npmjs.org"
|
|
12
|
+
* - MCP tool: "/mcp/gmail/tools/send_email"
|
|
13
|
+
* - MCP wildcard: "/mcp/gmail/tools/*"
|
|
14
|
+
*
|
|
15
|
+
* Grants are stored in Redis with TTL matching expiresAt for automatic cleanup.
|
|
16
|
+
*/
|
|
17
|
+
export declare class GrantStore {
|
|
18
|
+
private readonly redis;
|
|
19
|
+
constructor(redis: any);
|
|
20
|
+
/**
|
|
21
|
+
* Grant access to a pattern for an agent.
|
|
22
|
+
* If expiresAt is null, the grant never expires (no Redis TTL).
|
|
23
|
+
* If denied is true, the grant explicitly denies access.
|
|
24
|
+
*/
|
|
25
|
+
grant(agentId: string, pattern: string, expiresAt: number | null, denied?: boolean): Promise<void>;
|
|
26
|
+
/**
|
|
27
|
+
* Parse a raw Redis value into its stored object.
|
|
28
|
+
* Returns null if the value is missing or malformed.
|
|
29
|
+
*/
|
|
30
|
+
private parseValue;
|
|
31
|
+
/**
|
|
32
|
+
* Check if an agent has a grant for a pattern.
|
|
33
|
+
* Checks exact match first, then wildcard parents.
|
|
34
|
+
* Returns false if the grant has `denied: true`.
|
|
35
|
+
*/
|
|
36
|
+
hasGrant(agentId: string, pattern: string): Promise<boolean>;
|
|
37
|
+
/**
|
|
38
|
+
* Check if a pattern is explicitly denied for an agent.
|
|
39
|
+
*/
|
|
40
|
+
isDenied(agentId: string, pattern: string): Promise<boolean>;
|
|
41
|
+
/**
|
|
42
|
+
* List all active grants for an agent.
|
|
43
|
+
* Uses Redis SCAN to find matching keys.
|
|
44
|
+
*/
|
|
45
|
+
listGrants(agentId: string): Promise<Grant[]>;
|
|
46
|
+
/**
|
|
47
|
+
* Revoke a grant for an agent.
|
|
48
|
+
*/
|
|
49
|
+
revoke(agentId: string, pattern: string): Promise<void>;
|
|
50
|
+
private buildKey;
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=grant-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"grant-store.d.ts","sourceRoot":"","sources":["../../src/permissions/grant-store.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,KAAK;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAID;;;;;;;;;GASG;AACH,qBAAa,UAAU;IACT,OAAO,CAAC,QAAQ,CAAC,KAAK;gBAAL,KAAK,EAAE,GAAG;IAEvC;;;;OAIG;IACG,KAAK,CACT,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,GAAG,IAAI,EACxB,MAAM,CAAC,EAAE,OAAO,GACf,OAAO,CAAC,IAAI,CAAC;IAyBhB;;;OAGG;IACH,OAAO,CAAC,UAAU;IAWlB;;;;OAIG;IACG,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAsDlE;;OAEG;IACG,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAelE;;;OAGG;IACG,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;IA4CnD;;OAEG;IACG,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAW7D,OAAO,CAAC,QAAQ;CAGjB"}
|