n8n 2.18.3 → 2.19.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/abstract-server.d.ts +0 -1
- package/dist/abstract-server.js +11 -10
- package/dist/abstract-server.js.map +1 -1
- package/dist/active-executions.js +1 -0
- package/dist/active-executions.js.map +1 -1
- package/dist/build.tsbuildinfo +1 -1
- package/dist/collaboration/collaboration.service.d.ts +3 -1
- package/dist/collaboration/collaboration.service.js +19 -0
- package/dist/collaboration/collaboration.service.js.map +1 -1
- package/dist/commands/base-command.js +7 -1
- package/dist/commands/base-command.js.map +1 -1
- package/dist/commands/export/credentials.d.ts +5 -0
- package/dist/commands/export/credentials.js +21 -5
- package/dist/commands/export/credentials.js.map +1 -1
- package/dist/commands/export/workflow.d.ts +4 -0
- package/dist/commands/export/workflow.js +17 -5
- package/dist/commands/export/workflow.js.map +1 -1
- package/dist/controller.registry.js +3 -0
- package/dist/controller.registry.js.map +1 -1
- package/dist/controllers/e2e.controller.d.ts +35 -2
- package/dist/controllers/e2e.controller.js +129 -2
- package/dist/controllers/e2e.controller.js.map +1 -1
- package/dist/controllers/folder.controller.js +1 -1
- package/dist/controllers/folder.controller.js.map +1 -1
- package/dist/controllers/me.controller.js +3 -2
- package/dist/controllers/me.controller.js.map +1 -1
- package/dist/controllers/mfa.controller.js +1 -1
- package/dist/controllers/mfa.controller.js.map +1 -1
- package/dist/controllers/security-settings.controller.js +1 -1
- package/dist/controllers/security-settings.controller.js.map +1 -1
- package/dist/controllers/users.controller.d.ts +1 -3
- package/dist/controllers/users.controller.js +2 -16
- package/dist/controllers/users.controller.js.map +1 -1
- package/dist/credentials/credentials.service.js +4 -1
- package/dist/credentials/credentials.service.js.map +1 -1
- package/dist/credentials/external-secrets.utils.js +3 -3
- package/dist/credentials/external-secrets.utils.js.map +1 -1
- package/dist/credentials-helper.js +2 -1
- package/dist/credentials-helper.js.map +1 -1
- package/dist/deprecation/deprecation.service.js.map +1 -1
- package/dist/eventbus/event-message-classes/index.d.ts +2 -2
- package/dist/eventbus/event-message-classes/index.js +3 -0
- package/dist/eventbus/event-message-classes/index.js.map +1 -1
- package/dist/eventbus/message-event-bus-writer/message-event-bus-log-writer.d.ts +1 -0
- package/dist/eventbus/message-event-bus-writer/message-event-bus-log-writer.js +78 -38
- package/dist/eventbus/message-event-bus-writer/message-event-bus-log-writer.js.map +1 -1
- package/dist/events/maps/ai.event-map.d.ts +1 -0
- package/dist/events/maps/relay.event-map.d.ts +15 -0
- package/dist/events/relays/log-streaming.event-relay.d.ts +3 -0
- package/dist/events/relays/log-streaming.event-relay.js +35 -0
- package/dist/events/relays/log-streaming.event-relay.js.map +1 -1
- package/dist/execution-lifecycle/execution-lifecycle-hooks.js +18 -2
- package/dist/execution-lifecycle/execution-lifecycle-hooks.js.map +1 -1
- package/dist/execution-lifecycle/restore-binary-data-id.js +39 -21
- package/dist/execution-lifecycle/restore-binary-data-id.js.map +1 -1
- package/dist/executions/parse-range-query.middleware.js +6 -4
- package/dist/executions/parse-range-query.middleware.js.map +1 -1
- package/dist/expression-observability/expression-observability.constants.d.ts +8 -0
- package/dist/expression-observability/expression-observability.constants.js +14 -0
- package/dist/expression-observability/expression-observability.constants.js.map +1 -0
- package/dist/expression-observability/expression-observability.formatters.d.ts +4 -0
- package/dist/expression-observability/expression-observability.formatters.js +36 -0
- package/dist/expression-observability/expression-observability.formatters.js.map +1 -0
- package/dist/expression-observability/expression-observability.provider.d.ts +22 -0
- package/dist/expression-observability/expression-observability.provider.js +193 -0
- package/dist/expression-observability/expression-observability.provider.js.map +1 -0
- package/dist/external-hooks.js.map +1 -1
- package/dist/instance-settings-loader/instance-settings-loader.service.d.ts +5 -3
- package/dist/instance-settings-loader/instance-settings-loader.service.js +10 -6
- package/dist/instance-settings-loader/instance-settings-loader.service.js.map +1 -1
- package/dist/instance-settings-loader/loaders/log-streaming.instance-settings-loader.d.ts +12 -0
- package/dist/instance-settings-loader/loaders/log-streaming.instance-settings-loader.js +136 -0
- package/dist/instance-settings-loader/loaders/log-streaming.instance-settings-loader.js.map +1 -0
- package/dist/instance-settings-loader/loaders/sso.instance-settings-loader.d.ts +20 -0
- package/dist/instance-settings-loader/loaders/sso.instance-settings-loader.js +198 -0
- package/dist/instance-settings-loader/loaders/sso.instance-settings-loader.js.map +1 -0
- package/dist/middlewares/list-query/filter.d.ts +2 -3
- package/dist/middlewares/list-query/filter.js +3 -2
- package/dist/middlewares/list-query/filter.js.map +1 -1
- package/dist/middlewares/list-query/index.d.ts +2 -2
- package/dist/middlewares/list-query/index.js.map +1 -1
- package/dist/middlewares/list-query/pagination.js +8 -3
- package/dist/middlewares/list-query/pagination.js.map +1 -1
- package/dist/middlewares/list-query/select.js +3 -2
- package/dist/middlewares/list-query/select.js.map +1 -1
- package/dist/middlewares/list-query/sort-by.js +3 -2
- package/dist/middlewares/list-query/sort-by.js.map +1 -1
- package/dist/modules/chat-hub/chat-hub-workflow.service.js.map +1 -1
- package/dist/modules/chat-hub/chat-hub.types.d.ts +1 -1
- package/dist/modules/chat-hub/stream-capturer.js.map +1 -1
- package/dist/modules/community-packages/npm-utils.js +79 -3
- package/dist/modules/community-packages/npm-utils.js.map +1 -1
- package/dist/modules/data-table/data-table-column.repository.d.ts +2 -0
- package/dist/modules/data-table/data-table-column.repository.js +21 -5
- package/dist/modules/data-table/data-table-column.repository.js.map +1 -1
- package/dist/modules/data-table/data-table.service.d.ts +8 -2
- package/dist/modules/data-table/data-table.service.js +16 -2
- package/dist/modules/data-table/data-table.service.js.map +1 -1
- package/dist/modules/dynamic-credentials.ee/services/dynamic-credential.service.d.ts +2 -2
- package/dist/modules/dynamic-credentials.ee/services/dynamic-credential.service.js.map +1 -1
- package/dist/modules/dynamic-credentials.ee/utils.d.ts +2 -1
- package/dist/modules/dynamic-credentials.ee/utils.js.map +1 -1
- package/dist/modules/encryption-key-manager/encryption-bootstrap.service.d.ts +6 -0
- package/dist/modules/encryption-key-manager/encryption-bootstrap.service.js +28 -0
- package/dist/modules/encryption-key-manager/encryption-bootstrap.service.js.map +1 -0
- package/dist/modules/encryption-key-manager/encryption-key-manager.module.js +10 -1
- package/dist/modules/encryption-key-manager/encryption-key-manager.module.js.map +1 -1
- package/dist/modules/encryption-key-manager/encryption-key.controller.d.ts +8 -0
- package/dist/modules/encryption-key-manager/encryption-key.controller.js +62 -0
- package/dist/modules/encryption-key-manager/encryption-key.controller.js.map +1 -0
- package/dist/modules/encryption-key-manager/key-manager.service.d.ts +8 -5
- package/dist/modules/encryption-key-manager/key-manager.service.js +37 -10
- package/dist/modules/encryption-key-manager/key-manager.service.js.map +1 -1
- package/dist/modules/insights/database/entities/insights-by-period.js +8 -6
- package/dist/modules/insights/database/entities/insights-by-period.js.map +1 -1
- package/dist/modules/insights/database/entities/insights-raw.js +4 -3
- package/dist/modules/insights/database/entities/insights-raw.js.map +1 -1
- package/dist/modules/insights/database/entities/insights-shared.d.ts +6 -6
- package/dist/modules/insights/database/entities/insights-shared.js +3 -8
- package/dist/modules/insights/database/entities/insights-shared.js.map +1 -1
- package/dist/modules/instance-ai/entities/instance-ai-run-snapshot.entity.d.ts +2 -0
- package/dist/modules/instance-ai/entities/instance-ai-run-snapshot.entity.js +8 -0
- package/dist/modules/instance-ai/entities/instance-ai-run-snapshot.entity.js.map +1 -1
- package/dist/modules/instance-ai/eval/execution.service.js +4 -5
- package/dist/modules/instance-ai/eval/execution.service.js.map +1 -1
- package/dist/modules/instance-ai/eval/sub-agent-eval.service.d.ts +13 -0
- package/dist/modules/instance-ai/eval/sub-agent-eval.service.js +132 -0
- package/dist/modules/instance-ai/eval/sub-agent-eval.service.js.map +1 -0
- package/dist/modules/instance-ai/eval/sub-agent-roles.d.ts +7 -0
- package/dist/modules/instance-ai/eval/sub-agent-roles.js +21 -0
- package/dist/modules/instance-ai/eval/sub-agent-roles.js.map +1 -0
- package/dist/modules/instance-ai/eval/workflow-analysis.js +59 -51
- package/dist/modules/instance-ai/eval/workflow-analysis.js.map +1 -1
- package/dist/modules/instance-ai/filesystem/local-gateway.d.ts +7 -2
- package/dist/modules/instance-ai/filesystem/local-gateway.js +7 -0
- package/dist/modules/instance-ai/filesystem/local-gateway.js.map +1 -1
- package/dist/modules/instance-ai/instance-ai.adapter.service.d.ts +3 -2
- package/dist/modules/instance-ai/instance-ai.adapter.service.js +92 -9
- package/dist/modules/instance-ai/instance-ai.adapter.service.js.map +1 -1
- package/dist/modules/instance-ai/instance-ai.controller.d.ts +11 -2
- package/dist/modules/instance-ai/instance-ai.controller.js +66 -3
- package/dist/modules/instance-ai/instance-ai.controller.js.map +1 -1
- package/dist/modules/instance-ai/instance-ai.module.js +1 -1
- package/dist/modules/instance-ai/instance-ai.module.js.map +1 -1
- package/dist/modules/instance-ai/instance-ai.service.d.ts +14 -3
- package/dist/modules/instance-ai/instance-ai.service.js +266 -42
- package/dist/modules/instance-ai/instance-ai.service.js.map +1 -1
- package/dist/modules/instance-ai/storage/db-snapshot-storage.d.ts +12 -2
- package/dist/modules/instance-ai/storage/db-snapshot-storage.js +25 -3
- package/dist/modules/instance-ai/storage/db-snapshot-storage.js.map +1 -1
- package/dist/modules/instance-ai/web-research/cache.js.map +1 -1
- package/dist/modules/instance-registry/instance-registry.module.js +4 -1
- package/dist/modules/instance-registry/instance-registry.module.js.map +1 -1
- package/dist/modules/ldap.ee/helpers.ee.js +13 -0
- package/dist/modules/ldap.ee/helpers.ee.js.map +1 -1
- package/dist/modules/ldap.ee/ldap.service.ee.d.ts +1 -0
- package/dist/modules/ldap.ee/ldap.service.ee.js +33 -8
- package/dist/modules/ldap.ee/ldap.service.ee.js.map +1 -1
- package/dist/modules/log-streaming.ee/destinations/message-event-bus-destination-webhook.ee.js.map +1 -1
- package/dist/modules/log-streaming.ee/log-streaming.controller.d.ts +4 -1
- package/dist/modules/log-streaming.ee/log-streaming.controller.js +13 -2
- package/dist/modules/log-streaming.ee/log-streaming.controller.js.map +1 -1
- package/dist/modules/mcp/mcp-api-key.service.d.ts +4 -3
- package/dist/modules/mcp/mcp-api-key.service.js +17 -24
- package/dist/modules/mcp/mcp-api-key.service.js.map +1 -1
- package/dist/modules/mcp/mcp-oauth-consent.service.js +2 -2
- package/dist/modules/mcp/mcp-oauth-consent.service.js.map +1 -1
- package/dist/modules/mcp/mcp-server-middleware.service.d.ts +2 -2
- package/dist/modules/mcp/mcp-server-middleware.service.js +3 -3
- package/dist/modules/mcp/mcp-server-middleware.service.js.map +1 -1
- package/dist/modules/mcp/mcp.service.d.ts +3 -1
- package/dist/modules/mcp/mcp.service.js +9 -6
- package/dist/modules/mcp/mcp.service.js.map +1 -1
- package/dist/modules/mcp/mcp.settings.controller.d.ts +3 -1
- package/dist/modules/mcp/mcp.settings.controller.js +15 -2
- package/dist/modules/mcp/mcp.settings.controller.js.map +1 -1
- package/dist/modules/mcp/mcp.types.d.ts +1 -0
- package/dist/modules/mcp/tools/execute-workflow.tool.d.ts +6 -6
- package/dist/modules/mcp/tools/publish-workflow.tool.d.ts +2 -1
- package/dist/modules/mcp/tools/publish-workflow.tool.js +3 -1
- package/dist/modules/mcp/tools/publish-workflow.tool.js.map +1 -1
- package/dist/modules/mcp/tools/unpublish-workflow.tool.d.ts +2 -1
- package/dist/modules/mcp/tools/unpublish-workflow.tool.js +3 -1
- package/dist/modules/mcp/tools/unpublish-workflow.tool.js.map +1 -1
- package/dist/modules/mcp/tools/workflow-builder/create-workflow-from-code.tool.js +1 -0
- package/dist/modules/mcp/tools/workflow-builder/create-workflow-from-code.tool.js.map +1 -1
- package/dist/modules/mcp/tools/workflow-builder/delete-workflow.tool.d.ts +3 -1
- package/dist/modules/mcp/tools/workflow-builder/delete-workflow.tool.js +5 -1
- package/dist/modules/mcp/tools/workflow-builder/delete-workflow.tool.js.map +1 -1
- package/dist/modules/mcp/tools/workflow-builder/update-workflow.tool.d.ts +2 -1
- package/dist/modules/mcp/tools/workflow-builder/update-workflow.tool.js +4 -1
- package/dist/modules/mcp/tools/workflow-builder/update-workflow.tool.js.map +1 -1
- package/dist/modules/otel/execution-level-tracer.d.ts +22 -0
- package/dist/modules/otel/execution-level-tracer.js +241 -0
- package/dist/modules/otel/execution-level-tracer.js.map +1 -0
- package/dist/modules/otel/execution-level-tracer.types.d.ts +41 -0
- package/dist/modules/otel/execution-level-tracer.types.js +3 -0
- package/dist/modules/otel/execution-level-tracer.types.js.map +1 -0
- package/dist/modules/otel/otel-lifecycle-handler.d.ts +17 -0
- package/dist/modules/otel/otel-lifecycle-handler.js +157 -0
- package/dist/modules/otel/otel-lifecycle-handler.js.map +1 -0
- package/dist/modules/otel/otel.config.d.ts +1 -0
- package/dist/modules/otel/otel.config.js +5 -0
- package/dist/modules/otel/otel.config.js.map +1 -1
- package/dist/modules/otel/otel.constants.d.ts +1 -0
- package/dist/modules/otel/otel.constants.js +1 -0
- package/dist/modules/otel/otel.constants.js.map +1 -1
- package/dist/modules/otel/otel.module.d.ts +2 -1
- package/dist/modules/otel/otel.module.js +12 -1
- package/dist/modules/otel/otel.module.js.map +1 -1
- package/dist/modules/otel/tracing-context.d.ts +13 -0
- package/dist/modules/otel/tracing-context.js +55 -0
- package/dist/modules/otel/tracing-context.js.map +1 -0
- package/dist/modules/provisioning.ee/provisioning.controller.ee.d.ts +5 -5
- package/dist/modules/provisioning.ee/provisioning.controller.ee.js +8 -8
- package/dist/modules/provisioning.ee/provisioning.controller.ee.js.map +1 -1
- package/dist/modules/provisioning.ee/provisioning.service.ee.d.ts +3 -2
- package/dist/modules/provisioning.ee/provisioning.service.ee.js +30 -15
- package/dist/modules/provisioning.ee/provisioning.service.ee.js.map +1 -1
- package/dist/modules/provisioning.ee/role-mapping-rule.service.ee.d.ts +2 -0
- package/dist/modules/provisioning.ee/role-mapping-rule.service.ee.js +18 -3
- package/dist/modules/provisioning.ee/role-mapping-rule.service.ee.js.map +1 -1
- package/dist/modules/quick-connect/quick-connect.config.js.map +1 -1
- package/dist/modules/sso-oidc/oidc.controller.ee.d.ts +3 -4
- package/dist/modules/sso-oidc/oidc.controller.ee.js +6 -6
- package/dist/modules/sso-oidc/oidc.controller.ee.js.map +1 -1
- package/dist/modules/sso-saml/saml-helpers.d.ts +1 -0
- package/dist/modules/sso-saml/saml-helpers.js +15 -1
- package/dist/modules/sso-saml/saml-helpers.js.map +1 -1
- package/dist/modules/sso-saml/saml.controller.ee.d.ts +3 -1
- package/dist/modules/sso-saml/saml.controller.ee.js +45 -14
- package/dist/modules/sso-saml/saml.controller.ee.js.map +1 -1
- package/dist/modules/sso-saml/saml.service.ee.d.ts +8 -3
- package/dist/modules/sso-saml/saml.service.ee.js +43 -18
- package/dist/modules/sso-saml/saml.service.ee.js.map +1 -1
- package/dist/modules/token-exchange/services/scoped-jwt.strategy.d.ts +3 -2
- package/dist/modules/token-exchange/services/scoped-jwt.strategy.js +17 -6
- package/dist/modules/token-exchange/services/scoped-jwt.strategy.js.map +1 -1
- package/dist/modules/token-exchange/services/trusted-key.service.d.ts +0 -1
- package/dist/modules/token-exchange/services/trusted-key.service.js +8 -9
- package/dist/modules/token-exchange/services/trusted-key.service.js.map +1 -1
- package/dist/oauth/oauth.service.d.ts +1 -0
- package/dist/oauth/oauth.service.js +12 -1
- package/dist/oauth/oauth.service.js.map +1 -1
- package/dist/public-api/index.js +0 -3
- package/dist/public-api/index.js.map +1 -1
- package/dist/public-api/types.d.ts +15 -1
- package/dist/public-api/v1/handlers/credentials/credentials.service.js +10 -2
- package/dist/public-api/v1/handlers/credentials/credentials.service.js.map +1 -1
- package/dist/public-api/v1/handlers/data-tables/data-tables.columns.handler.d.ts +21 -0
- package/dist/public-api/v1/handlers/data-tables/data-tables.columns.handler.js +85 -0
- package/dist/public-api/v1/handlers/data-tables/data-tables.columns.handler.js.map +1 -0
- package/dist/public-api/v1/handlers/data-tables/data-tables.handler.js +10 -10
- package/dist/public-api/v1/handlers/data-tables/data-tables.handler.js.map +1 -1
- package/dist/public-api/v1/handlers/data-tables/data-tables.rows.handler.js +7 -18
- package/dist/public-api/v1/handlers/data-tables/data-tables.rows.handler.js.map +1 -1
- package/dist/public-api/v1/handlers/data-tables/data-tables.service.d.ts +0 -1
- package/dist/public-api/v1/handlers/data-tables/data-tables.service.js +0 -13
- package/dist/public-api/v1/handlers/data-tables/data-tables.service.js.map +1 -1
- package/dist/public-api/v1/handlers/folders/folders.handler.d.ts +29 -0
- package/dist/public-api/v1/handlers/folders/folders.handler.js +112 -0
- package/dist/public-api/v1/handlers/folders/folders.handler.js.map +1 -0
- package/dist/public-api/v1/handlers/users/users.handler.ee.js +2 -12
- package/dist/public-api/v1/handlers/users/users.handler.ee.js.map +1 -1
- package/dist/public-api/v1/openapi.yml +494 -0
- package/dist/public-api/v1/shared/handler.types.d.ts +3 -0
- package/dist/{modules/otel/handlers/interfaces.js → public-api/v1/shared/handler.types.js} +1 -1
- package/dist/public-api/v1/shared/handler.types.js.map +1 -0
- package/dist/public-api/v1/shared/middlewares/global.middleware.d.ts +3 -1
- package/dist/public-api/v1/shared/middlewares/global.middleware.js.map +1 -1
- package/dist/public-api/v1/shared/services/utils.service.d.ts +3 -0
- package/dist/public-api/v1/shared/services/utils.service.js +18 -0
- package/dist/public-api/v1/shared/services/utils.service.js.map +1 -0
- package/dist/push/index.d.ts +1 -1
- package/dist/push/index.js +11 -1
- package/dist/push/index.js.map +1 -1
- package/dist/push/push-helpers.d.ts +6 -0
- package/dist/push/push-helpers.js +20 -0
- package/dist/push/push-helpers.js.map +1 -0
- package/dist/requests.d.ts +2 -0
- package/dist/requests.js +5 -0
- package/dist/requests.js.map +1 -1
- package/dist/scaling/job-processor.js +7 -2
- package/dist/scaling/job-processor.js.map +1 -1
- package/dist/scaling/multi-main-setup.ee.js +1 -1
- package/dist/scaling/multi-main-setup.ee.js.map +1 -1
- package/dist/server.js +4 -0
- package/dist/server.js.map +1 -1
- package/dist/services/ai-gateway.service.d.ts +4 -1
- package/dist/services/ai-gateway.service.js +17 -2
- package/dist/services/ai-gateway.service.js.map +1 -1
- package/dist/services/api-key-auth.strategy.d.ts +3 -2
- package/dist/services/api-key-auth.strategy.js +24 -13
- package/dist/services/api-key-auth.strategy.js.map +1 -1
- package/dist/services/auth-strategy.registry.d.ts +3 -2
- package/dist/services/auth-strategy.registry.js +12 -0
- package/dist/services/auth-strategy.registry.js.map +1 -1
- package/dist/services/auth-strategy.types.d.ts +7 -1
- package/dist/services/dynamic-node-parameters.service.js +23 -8
- package/dist/services/dynamic-node-parameters.service.js.map +1 -1
- package/dist/services/folder.service.d.ts +3 -2
- package/dist/services/folder.service.js +4 -2
- package/dist/services/folder.service.js.map +1 -1
- package/dist/services/frontend.service.d.ts +1 -0
- package/dist/services/frontend.service.js +9 -1
- package/dist/services/frontend.service.js.map +1 -1
- package/dist/services/instance-registry-proxy.service.d.ts +11 -0
- package/dist/services/instance-registry-proxy.service.js +33 -0
- package/dist/services/instance-registry-proxy.service.js.map +1 -0
- package/dist/services/last-active-at.service.d.ts +1 -2
- package/dist/services/last-active-at.service.js.map +1 -1
- package/dist/services/rate-limit.service.js.map +1 -1
- package/dist/services/redis-client.service.js +1 -1
- package/dist/services/redis-client.service.js.map +1 -1
- package/dist/services/user.service.d.ts +4 -1
- package/dist/services/user.service.js +26 -2
- package/dist/services/user.service.js.map +1 -1
- package/dist/task-runners/task-managers/task-requester.js +1 -1
- package/dist/task-runners/task-managers/task-requester.js.map +1 -1
- package/dist/task-runners/task-runner-module.js.map +1 -1
- package/dist/utils/inverter.d.ts +1 -0
- package/dist/utils/inverter.js +11 -0
- package/dist/utils/inverter.js.map +1 -0
- package/dist/webhooks/live-webhooks.d.ts +3 -2
- package/dist/webhooks/live-webhooks.js +8 -3
- package/dist/webhooks/live-webhooks.js.map +1 -1
- package/dist/webhooks/node-type-matcher.d.ts +3 -0
- package/dist/webhooks/node-type-matcher.js +7 -0
- package/dist/webhooks/node-type-matcher.js.map +1 -0
- package/dist/webhooks/test-webhooks.d.ts +5 -3
- package/dist/webhooks/test-webhooks.js +14 -5
- package/dist/webhooks/test-webhooks.js.map +1 -1
- package/dist/webhooks/waiting-webhooks.d.ts +4 -1
- package/dist/webhooks/waiting-webhooks.js +17 -2
- package/dist/webhooks/waiting-webhooks.js.map +1 -1
- package/dist/webhooks/webhook-helpers.js +10 -0
- package/dist/webhooks/webhook-helpers.js.map +1 -1
- package/dist/webhooks/webhook-request-handler.d.ts +3 -2
- package/dist/webhooks/webhook-request-handler.js +8 -6
- package/dist/webhooks/webhook-request-handler.js.map +1 -1
- package/dist/webhooks/webhook.service.js +2 -2
- package/dist/webhooks/webhook.service.js.map +1 -1
- package/dist/webhooks/webhook.types.d.ts +3 -1
- package/dist/workflow-execute-additional-data.d.ts +6 -2
- package/dist/workflow-execute-additional-data.js +3 -1
- package/dist/workflow-execute-additional-data.js.map +1 -1
- package/dist/workflow-runner.js.map +1 -1
- package/dist/workflows/workflow-validation.service.js +3 -0
- package/dist/workflows/workflow-validation.service.js.map +1 -1
- package/dist/workflows/workflow.service.d.ts +1 -0
- package/dist/workflows/workflow.service.js +6 -1
- package/dist/workflows/workflow.service.js.map +1 -1
- package/dist/workflows/workflows.controller.d.ts +2 -2
- package/package.json +34 -33
- package/dist/instance-settings-loader/loaders/oidc.instance-settings-loader.d.ts +0 -13
- package/dist/instance-settings-loader/loaders/oidc.instance-settings-loader.js +0 -116
- package/dist/instance-settings-loader/loaders/oidc.instance-settings-loader.js.map +0 -1
- package/dist/modules/otel/handlers/interfaces.d.ts +0 -5
- package/dist/modules/otel/handlers/interfaces.js.map +0 -1
- package/dist/modules/otel/handlers/node-end.handler.d.ts +0 -8
- package/dist/modules/otel/handlers/node-end.handler.js +0 -71
- package/dist/modules/otel/handlers/node-end.handler.js.map +0 -1
- package/dist/modules/otel/handlers/node-start.handler.d.ts +0 -7
- package/dist/modules/otel/handlers/node-start.handler.js +0 -37
- package/dist/modules/otel/handlers/node-start.handler.js.map +0 -1
- package/dist/modules/otel/handlers/workflow-end.handler.d.ts +0 -8
- package/dist/modules/otel/handlers/workflow-end.handler.js +0 -73
- package/dist/modules/otel/handlers/workflow-end.handler.js.map +0 -1
- package/dist/modules/otel/handlers/workflow-start.handler.d.ts +0 -7
- package/dist/modules/otel/handlers/workflow-start.handler.js +0 -30
- package/dist/modules/otel/handlers/workflow-start.handler.js.map +0 -1
- package/dist/modules/otel/n8n-instrumentation.d.ts +0 -21
- package/dist/modules/otel/n8n-instrumentation.js +0 -103
- package/dist/modules/otel/n8n-instrumentation.js.map +0 -1
- package/dist/modules/otel/span-registry.d.ts +0 -14
- package/dist/modules/otel/span-registry.js +0 -58
- package/dist/modules/otel/span-registry.js.map +0 -1
|
@@ -47,11 +47,14 @@ const api_types_1 = require("@n8n/api-types");
|
|
|
47
47
|
const backend_common_1 = require("@n8n/backend-common");
|
|
48
48
|
const config_1 = require("@n8n/config");
|
|
49
49
|
const constants_1 = require("@n8n/constants");
|
|
50
|
+
const db_1 = require("@n8n/db");
|
|
50
51
|
const di_1 = require("@n8n/di");
|
|
51
52
|
const url_service_1 = require("../../services/url.service");
|
|
52
53
|
const instance_ai_1 = require("@n8n/instance-ai");
|
|
53
54
|
const workflow_sdk_1 = require("@n8n/workflow-sdk");
|
|
54
55
|
const nanoid_1 = require("nanoid");
|
|
56
|
+
const uuid_1 = require("uuid");
|
|
57
|
+
const constants_2 = require("../../constants");
|
|
55
58
|
const source_control_preferences_service_ee_1 = require("../../modules/source-control.ee/source-control-preferences.service.ee");
|
|
56
59
|
const ai_service_1 = require("../../services/ai.service");
|
|
57
60
|
const push_1 = require("../../push");
|
|
@@ -75,6 +78,7 @@ function createInertAbortSignal() {
|
|
|
75
78
|
return new AbortController().signal;
|
|
76
79
|
}
|
|
77
80
|
const ORCHESTRATOR_AGENT_ID = 'agent-001';
|
|
81
|
+
const INSTANCE_AI_FEEDBACK_NAMESPACE = 'c5be4c87-5b6e-49ed-afe1-9c5c1f99a5c0';
|
|
78
82
|
const MAX_CONCURRENT_BACKGROUND_TASKS_PER_THREAD = 5;
|
|
79
83
|
function getProxyFetch() {
|
|
80
84
|
const proxyUrl = process.env.HTTPS_PROXY || process.env.HTTP_PROXY;
|
|
@@ -88,7 +92,7 @@ function getProxyFetch() {
|
|
|
88
92
|
}));
|
|
89
93
|
}
|
|
90
94
|
let InstanceAiService = class InstanceAiService {
|
|
91
|
-
constructor(logger, globalConfig, adapterService, eventBus, settingsService, compositeStore, compactionService, aiService, push, threadRepo, urlService, dbSnapshotStorage, dbIterationLogStorage, sourceControlPreferencesService, telemetry) {
|
|
95
|
+
constructor(logger, globalConfig, adapterService, eventBus, settingsService, compositeStore, compactionService, aiService, push, threadRepo, urlService, dbSnapshotStorage, dbIterationLogStorage, sourceControlPreferencesService, telemetry, userRepository, aiBuilderTemporaryWorkflowRepository) {
|
|
92
96
|
this.adapterService = adapterService;
|
|
93
97
|
this.eventBus = eventBus;
|
|
94
98
|
this.settingsService = settingsService;
|
|
@@ -102,6 +106,8 @@ let InstanceAiService = class InstanceAiService {
|
|
|
102
106
|
this.dbIterationLogStorage = dbIterationLogStorage;
|
|
103
107
|
this.sourceControlPreferencesService = sourceControlPreferencesService;
|
|
104
108
|
this.telemetry = telemetry;
|
|
109
|
+
this.userRepository = userRepository;
|
|
110
|
+
this.aiBuilderTemporaryWorkflowRepository = aiBuilderTemporaryWorkflowRepository;
|
|
105
111
|
this.mcpClientManager = new instance_ai_1.McpClientManager();
|
|
106
112
|
this.runState = new instance_ai_1.RunStateRegistry();
|
|
107
113
|
this.backgroundTasks = new instance_ai_1.BackgroundTaskManager(MAX_CONCURRENT_BACKGROUND_TASKS_PER_THREAD);
|
|
@@ -218,9 +224,9 @@ let InstanceAiService = class InstanceAiService {
|
|
|
218
224
|
if (!config.enabled)
|
|
219
225
|
return undefined;
|
|
220
226
|
if (config.provider === 'daytona') {
|
|
221
|
-
return new instance_ai_1.BuilderSandboxFactory(config, new instance_ai_1.SnapshotManager(config.image, this.logger));
|
|
227
|
+
return new instance_ai_1.BuilderSandboxFactory(config, new instance_ai_1.SnapshotManager(config.image, this.logger), this.logger);
|
|
222
228
|
}
|
|
223
|
-
return new instance_ai_1.BuilderSandboxFactory(config);
|
|
229
|
+
return new instance_ai_1.BuilderSandboxFactory(config, undefined, this.logger);
|
|
224
230
|
}
|
|
225
231
|
async getOrCreateWorkspace(threadId, user) {
|
|
226
232
|
const existing = this.sandboxes.get(threadId);
|
|
@@ -262,6 +268,20 @@ let InstanceAiService = class InstanceAiService {
|
|
|
262
268
|
headers: { Authorization: `${token.tokenType} ${token.accessToken}` },
|
|
263
269
|
};
|
|
264
270
|
}
|
|
271
|
+
async resolveAgentModelConfig(user) {
|
|
272
|
+
if (this.aiService.isProxyEnabled()) {
|
|
273
|
+
const client = await this.aiService.getClient();
|
|
274
|
+
const proxyBaseUrl = client.getApiProxyBaseUrl();
|
|
275
|
+
const tokenManager = new proxy_token_manager_1.ProxyTokenManager(async () => {
|
|
276
|
+
return await client.getBuilderApiProxyToken({ id: user.id }, { userMessageId: (0, nanoid_1.nanoid)() });
|
|
277
|
+
});
|
|
278
|
+
return await this.resolveProxyModel(user, proxyBaseUrl, tokenManager);
|
|
279
|
+
}
|
|
280
|
+
const httpProxyModel = await this.resolveHttpProxyModel(user);
|
|
281
|
+
if (httpProxyModel)
|
|
282
|
+
return httpProxyModel;
|
|
283
|
+
return await this.settingsService.resolveModelConfig(user);
|
|
284
|
+
}
|
|
265
285
|
async resolveProxyModel(user, proxyBaseUrl, tokenManager) {
|
|
266
286
|
const modelName = await this.settingsService.resolveModelName(user);
|
|
267
287
|
const { createAnthropic } = await Promise.resolve().then(() => __importStar(require('@ai-sdk/anthropic')));
|
|
@@ -274,6 +294,9 @@ let InstanceAiService = class InstanceAiService {
|
|
|
274
294
|
for (const [k, v] of Object.entries(auth)) {
|
|
275
295
|
headers.set(k, v);
|
|
276
296
|
}
|
|
297
|
+
for (const [k, v] of Object.entries((0, api_types_1.buildProxyHeaders)({ feature: 'instance-ai', n8nVersion: constants_2.N8N_VERSION }))) {
|
|
298
|
+
headers.set(k, v);
|
|
299
|
+
}
|
|
277
300
|
return await globalThis.fetch(input, { ...init, headers });
|
|
278
301
|
},
|
|
279
302
|
});
|
|
@@ -305,7 +328,18 @@ let InstanceAiService = class InstanceAiService {
|
|
|
305
328
|
return;
|
|
306
329
|
if (this.creditedThreads.has(threadId))
|
|
307
330
|
return;
|
|
308
|
-
|
|
331
|
+
let thread;
|
|
332
|
+
try {
|
|
333
|
+
thread = await this.threadRepo.findOneBy({ id: threadId });
|
|
334
|
+
}
|
|
335
|
+
catch (error) {
|
|
336
|
+
this.logger.warn('Failed to check Instance AI credit status', {
|
|
337
|
+
threadId,
|
|
338
|
+
runId,
|
|
339
|
+
error: getErrorMessage(error),
|
|
340
|
+
});
|
|
341
|
+
return;
|
|
342
|
+
}
|
|
309
343
|
if (!thread)
|
|
310
344
|
return;
|
|
311
345
|
if (thread.metadata?.creditCounted) {
|
|
@@ -502,6 +536,63 @@ let InstanceAiService = class InstanceAiService {
|
|
|
502
536
|
},
|
|
503
537
|
});
|
|
504
538
|
}
|
|
539
|
+
async submitLangsmithFeedback(user, threadId, responseId, payload) {
|
|
540
|
+
const anchor = await this.dbSnapshotStorage.findLangsmithAnchor(threadId, responseId);
|
|
541
|
+
if (!anchor) {
|
|
542
|
+
this.logger.debug('No LangSmith anchor for feedback; skipping annotation', {
|
|
543
|
+
threadId,
|
|
544
|
+
responseId,
|
|
545
|
+
});
|
|
546
|
+
return;
|
|
547
|
+
}
|
|
548
|
+
let tracingProxyConfig;
|
|
549
|
+
if (this.aiService.isProxyEnabled()) {
|
|
550
|
+
try {
|
|
551
|
+
const client = await this.aiService.getClient();
|
|
552
|
+
const baseUrl = client.getApiProxyBaseUrl();
|
|
553
|
+
const manager = new proxy_token_manager_1.ProxyTokenManager(async () => await client.getBuilderApiProxyToken({ id: user.id }, { userMessageId: (0, nanoid_1.nanoid)() }));
|
|
554
|
+
tracingProxyConfig = {
|
|
555
|
+
apiUrl: baseUrl + '/langsmith',
|
|
556
|
+
getAuthHeaders: async () => await manager.getAuthHeaders(),
|
|
557
|
+
};
|
|
558
|
+
}
|
|
559
|
+
catch (error) {
|
|
560
|
+
this.logger.warn('Failed to build LangSmith proxy config for feedback', {
|
|
561
|
+
threadId,
|
|
562
|
+
responseId,
|
|
563
|
+
error: getErrorMessage(error),
|
|
564
|
+
});
|
|
565
|
+
return;
|
|
566
|
+
}
|
|
567
|
+
}
|
|
568
|
+
const key = 'user_score';
|
|
569
|
+
const feedbackId = (0, uuid_1.v5)(`${key}:${responseId}`, INSTANCE_AI_FEEDBACK_NAMESPACE);
|
|
570
|
+
try {
|
|
571
|
+
await (0, instance_ai_1.submitLangsmithUserFeedback)({
|
|
572
|
+
langsmithRunId: anchor.langsmithRunId,
|
|
573
|
+
langsmithTraceId: anchor.langsmithTraceId,
|
|
574
|
+
key,
|
|
575
|
+
score: payload.rating === 'up' ? 1 : 0,
|
|
576
|
+
value: payload.rating,
|
|
577
|
+
comment: payload.comment,
|
|
578
|
+
feedbackId,
|
|
579
|
+
sourceInfo: {
|
|
580
|
+
thread_id: threadId,
|
|
581
|
+
response_id: responseId,
|
|
582
|
+
user_id: user.id,
|
|
583
|
+
rating: payload.rating,
|
|
584
|
+
},
|
|
585
|
+
proxyConfig: tracingProxyConfig,
|
|
586
|
+
});
|
|
587
|
+
}
|
|
588
|
+
catch (error) {
|
|
589
|
+
this.logger.warn('Failed to submit LangSmith feedback', {
|
|
590
|
+
threadId,
|
|
591
|
+
responseId,
|
|
592
|
+
error: getErrorMessage(error),
|
|
593
|
+
});
|
|
594
|
+
}
|
|
595
|
+
}
|
|
505
596
|
startRun(user, threadId, message, researchMode, attachments, timeZone, pushRef) {
|
|
506
597
|
const { runId, abortController, messageGroupId } = this.runState.startRun({
|
|
507
598
|
threadId,
|
|
@@ -549,25 +640,7 @@ let InstanceAiService = class InstanceAiService {
|
|
|
549
640
|
}
|
|
550
641
|
if (suspended) {
|
|
551
642
|
suspended.abortController.abort();
|
|
552
|
-
void this.
|
|
553
|
-
status: 'cancelled',
|
|
554
|
-
reason: 'user_cancelled',
|
|
555
|
-
});
|
|
556
|
-
this.eventBus.publish(threadId, {
|
|
557
|
-
type: 'run-finish',
|
|
558
|
-
runId: suspended.runId,
|
|
559
|
-
agentId: ORCHESTRATOR_AGENT_ID,
|
|
560
|
-
payload: { status: 'cancelled', reason: 'user_cancelled' },
|
|
561
|
-
});
|
|
562
|
-
void this.saveAgentTreeSnapshot(threadId, suspended.runId, this.dbSnapshotStorage, true);
|
|
563
|
-
if (suspended.mastraRunId) {
|
|
564
|
-
void this.cleanupMastraSnapshots(suspended.mastraRunId);
|
|
565
|
-
}
|
|
566
|
-
void this.maybeFinalizeRunTraceRoot(suspended.runId, {
|
|
567
|
-
status: 'cancelled',
|
|
568
|
-
reason: 'user_cancelled',
|
|
569
|
-
metadata: { completion_source: 'orchestrator' },
|
|
570
|
-
});
|
|
643
|
+
void this.finalizeCancelledSuspendedRun(suspended);
|
|
571
644
|
}
|
|
572
645
|
}
|
|
573
646
|
sendCorrectionToTask(threadId, taskId, correction) {
|
|
@@ -632,6 +705,10 @@ let InstanceAiService = class InstanceAiService {
|
|
|
632
705
|
}
|
|
633
706
|
initGateway(userId, data) {
|
|
634
707
|
this.gatewayRegistry.initGateway(userId, data);
|
|
708
|
+
this.telemetry.track('User connected to Computer Use', {
|
|
709
|
+
user_id: userId,
|
|
710
|
+
tool_groups: data.toolCategories.filter((c) => c.enabled).map((c) => c.name),
|
|
711
|
+
});
|
|
635
712
|
}
|
|
636
713
|
resolveGatewayRequest(userId, requestId, result, error) {
|
|
637
714
|
return this.gatewayRegistry.resolveGatewayRequest(userId, requestId, result, error);
|
|
@@ -687,6 +764,7 @@ let InstanceAiService = class InstanceAiService {
|
|
|
687
764
|
this.threadPushRef.delete(threadId);
|
|
688
765
|
this.deleteTraceContextsForThread(threadId);
|
|
689
766
|
await this.destroySandbox(threadId);
|
|
767
|
+
await this.reapAiTemporaryForThreadCleanup(threadId);
|
|
690
768
|
this.eventBus.clearThread(threadId);
|
|
691
769
|
}
|
|
692
770
|
async shutdown() {
|
|
@@ -823,13 +901,23 @@ let InstanceAiService = class InstanceAiService {
|
|
|
823
901
|
return await client.getBuilderApiProxyToken({ id: user.id }, { userMessageId: (0, nanoid_1.nanoid)() });
|
|
824
902
|
});
|
|
825
903
|
tokenManager = manager;
|
|
904
|
+
const featureHeaders = (0, api_types_1.buildProxyHeaders)({
|
|
905
|
+
feature: 'instance-ai',
|
|
906
|
+
n8nVersion: constants_2.N8N_VERSION,
|
|
907
|
+
});
|
|
826
908
|
searchProxyConfig = {
|
|
827
909
|
apiUrl: proxyBaseUrl + '/brave-search',
|
|
828
|
-
getAuthHeaders: async () =>
|
|
910
|
+
getAuthHeaders: async () => ({
|
|
911
|
+
...(await manager.getAuthHeaders()),
|
|
912
|
+
...featureHeaders,
|
|
913
|
+
}),
|
|
829
914
|
};
|
|
830
915
|
tracingProxyConfig = {
|
|
831
916
|
apiUrl: proxyBaseUrl + '/langsmith',
|
|
832
|
-
getAuthHeaders: async () =>
|
|
917
|
+
getAuthHeaders: async () => ({
|
|
918
|
+
...(await manager.getAuthHeaders()),
|
|
919
|
+
...featureHeaders,
|
|
920
|
+
}),
|
|
833
921
|
};
|
|
834
922
|
}
|
|
835
923
|
const context = this.adapterService.createContext(user, {
|
|
@@ -866,8 +954,7 @@ let InstanceAiService = class InstanceAiService {
|
|
|
866
954
|
}
|
|
867
955
|
const modelId = proxyBaseUrl && tokenManager
|
|
868
956
|
? await this.resolveProxyModel(user, proxyBaseUrl, tokenManager)
|
|
869
|
-
:
|
|
870
|
-
(await this.settingsService.resolveModelConfig(user)));
|
|
957
|
+
: await this.resolveAgentModelConfig(user);
|
|
871
958
|
const memory = (0, instance_ai_1.createMemory)(this.createMemoryConfig());
|
|
872
959
|
await this.ensureThreadExists(memory, threadId, user.id);
|
|
873
960
|
const taskStorage = new instance_ai_1.MastraTaskStorage(memory);
|
|
@@ -1031,7 +1118,7 @@ let InstanceAiService = class InstanceAiService {
|
|
|
1031
1118
|
}
|
|
1032
1119
|
await this.schedulePlannedTasks(user, task.threadId);
|
|
1033
1120
|
}
|
|
1034
|
-
async startInternalFollowUpRun(user, threadId, message, researchMode, messageGroupId) {
|
|
1121
|
+
async startInternalFollowUpRun(user, threadId, message, researchMode, messageGroupId, isReplanFollowUp = false) {
|
|
1035
1122
|
if (this.runState.hasLiveRun(threadId)) {
|
|
1036
1123
|
this.logger.warn('Skipping internal follow-up: active run exists', { threadId });
|
|
1037
1124
|
return '';
|
|
@@ -1042,7 +1129,7 @@ let InstanceAiService = class InstanceAiService {
|
|
|
1042
1129
|
researchMode,
|
|
1043
1130
|
messageGroupId,
|
|
1044
1131
|
});
|
|
1045
|
-
void this.executeRun(user, threadId, runId, message, abortController, researchMode, undefined, messageGroupId);
|
|
1132
|
+
void this.executeRun(user, threadId, runId, message, abortController, researchMode, undefined, messageGroupId, undefined, isReplanFollowUp);
|
|
1046
1133
|
return runId;
|
|
1047
1134
|
}
|
|
1048
1135
|
async schedulePlannedTasks(user, threadId) {
|
|
@@ -1064,7 +1151,7 @@ let InstanceAiService = class InstanceAiService {
|
|
|
1064
1151
|
return;
|
|
1065
1152
|
if (action.type === 'replan') {
|
|
1066
1153
|
await this.syncPlannedTasksToUi(threadId, action.graph);
|
|
1067
|
-
await this.startInternalFollowUpRun(user, threadId, this.buildPlannedTaskFollowUpMessage('replan', action.graph, action.failedTask), this.runState.getThreadResearchMode(threadId), action.graph.messageGroupId);
|
|
1154
|
+
await this.startInternalFollowUpRun(user, threadId, this.buildPlannedTaskFollowUpMessage('replan', action.graph, action.failedTask), this.runState.getThreadResearchMode(threadId), action.graph.messageGroupId, true);
|
|
1068
1155
|
return;
|
|
1069
1156
|
}
|
|
1070
1157
|
if (action.type === 'synthesize') {
|
|
@@ -1079,11 +1166,12 @@ let InstanceAiService = class InstanceAiService {
|
|
|
1079
1166
|
}
|
|
1080
1167
|
await this.doSchedulePlannedTasks(user, threadId);
|
|
1081
1168
|
}
|
|
1082
|
-
async executeRun(user, threadId, runId, message, abortController, researchMode, attachments, messageGroupId, timeZone) {
|
|
1169
|
+
async executeRun(user, threadId, runId, message, abortController, researchMode, attachments, messageGroupId, timeZone, isReplanFollowUp = false) {
|
|
1083
1170
|
const signal = abortController.signal;
|
|
1084
1171
|
let mastraRunId = '';
|
|
1085
1172
|
let tracing;
|
|
1086
1173
|
let messageTraceFinalization;
|
|
1174
|
+
let aiCreatedWorkflowIds;
|
|
1087
1175
|
try {
|
|
1088
1176
|
const messageId = (0, nanoid_1.nanoid)();
|
|
1089
1177
|
this.eventBus.publish(threadId, {
|
|
@@ -1105,7 +1193,9 @@ let InstanceAiService = class InstanceAiService {
|
|
|
1105
1193
|
const mcpServers = this.parseMcpServers(this.instanceAiConfig.mcpServers);
|
|
1106
1194
|
const executionPushRef = this.threadPushRef.get(threadId);
|
|
1107
1195
|
const { context, memory, taskStorage, snapshotStorage, modelId, orchestrationContext } = await this.createExecutionEnvironment(user, threadId, runId, signal, researchMode, messageGroupId, executionPushRef);
|
|
1196
|
+
aiCreatedWorkflowIds = context.aiCreatedWorkflowIds ??= new Set();
|
|
1108
1197
|
orchestrationContext.currentUserMessage = message;
|
|
1198
|
+
orchestrationContext.isReplanFollowUp = isReplanFollowUp;
|
|
1109
1199
|
orchestrationContext.timeZone = timeZone ?? this.defaultTimeZone;
|
|
1110
1200
|
if (attachments && attachments.length > 0) {
|
|
1111
1201
|
context.currentUserAttachments = attachments;
|
|
@@ -1374,9 +1464,11 @@ let InstanceAiService = class InstanceAiService {
|
|
|
1374
1464
|
modelId,
|
|
1375
1465
|
metadata: { completion_source: 'orchestrator' },
|
|
1376
1466
|
};
|
|
1467
|
+
const archivedWorkflowIds = await this.reapAiTemporaryFromRun(threadId, user, aiCreatedWorkflowIds);
|
|
1377
1468
|
await this.finalizeRun(threadId, runId, result.status, snapshotStorage, {
|
|
1378
1469
|
userId: user.id,
|
|
1379
1470
|
modelId,
|
|
1471
|
+
archivedWorkflowIds,
|
|
1380
1472
|
});
|
|
1381
1473
|
if (result.status === 'completed') {
|
|
1382
1474
|
await this.countCreditsIfFirst(user, threadId, runId);
|
|
@@ -1400,7 +1492,8 @@ let InstanceAiService = class InstanceAiService {
|
|
|
1400
1492
|
reason: 'user_cancelled',
|
|
1401
1493
|
metadata: { completion_source: 'orchestrator' },
|
|
1402
1494
|
};
|
|
1403
|
-
this.
|
|
1495
|
+
const archivedWorkflowIds = await this.reapAiTemporaryFromRun(threadId, user, aiCreatedWorkflowIds);
|
|
1496
|
+
this.publishRunFinish(threadId, runId, 'cancelled', 'user_cancelled', archivedWorkflowIds);
|
|
1404
1497
|
return;
|
|
1405
1498
|
}
|
|
1406
1499
|
const errorMessage = getErrorMessage(error);
|
|
@@ -1418,6 +1511,7 @@ let InstanceAiService = class InstanceAiService {
|
|
|
1418
1511
|
reason: errorMessage,
|
|
1419
1512
|
metadata: { completion_source: 'orchestrator' },
|
|
1420
1513
|
};
|
|
1514
|
+
const archivedWorkflowIds = await this.reapAiTemporaryFromRun(threadId, user, aiCreatedWorkflowIds);
|
|
1421
1515
|
this.eventBus.publish(threadId, {
|
|
1422
1516
|
type: 'run-finish',
|
|
1423
1517
|
runId,
|
|
@@ -1425,6 +1519,7 @@ let InstanceAiService = class InstanceAiService {
|
|
|
1425
1519
|
payload: {
|
|
1426
1520
|
status: 'error',
|
|
1427
1521
|
reason: errorMessage,
|
|
1522
|
+
...(archivedWorkflowIds.length > 0 ? { archivedWorkflowIds } : {}),
|
|
1428
1523
|
},
|
|
1429
1524
|
});
|
|
1430
1525
|
}
|
|
@@ -1568,7 +1663,10 @@ let InstanceAiService = class InstanceAiService {
|
|
|
1568
1663
|
outputText,
|
|
1569
1664
|
metadata: { completion_source: 'orchestrator' },
|
|
1570
1665
|
};
|
|
1571
|
-
await this.
|
|
1666
|
+
const archivedWorkflowIds = await this.reapAiTemporaryFromRun(opts.threadId, opts.user, undefined);
|
|
1667
|
+
await this.finalizeRun(opts.threadId, opts.runId, result.status, opts.snapshotStorage, {
|
|
1668
|
+
archivedWorkflowIds,
|
|
1669
|
+
});
|
|
1572
1670
|
if (result.status === 'completed') {
|
|
1573
1671
|
this.telemetry.track('Builder sent message', {
|
|
1574
1672
|
thread_id: opts.threadId,
|
|
@@ -1590,7 +1688,8 @@ let InstanceAiService = class InstanceAiService {
|
|
|
1590
1688
|
reason: 'user_cancelled',
|
|
1591
1689
|
metadata: { completion_source: 'orchestrator' },
|
|
1592
1690
|
};
|
|
1593
|
-
this.
|
|
1691
|
+
const archivedWorkflowIds = await this.reapAiTemporaryFromRun(opts.threadId, opts.user, undefined);
|
|
1692
|
+
this.publishRunFinish(opts.threadId, opts.runId, 'cancelled', 'user_cancelled', archivedWorkflowIds);
|
|
1594
1693
|
return;
|
|
1595
1694
|
}
|
|
1596
1695
|
const errorMessage = getErrorMessage(error);
|
|
@@ -1608,6 +1707,7 @@ let InstanceAiService = class InstanceAiService {
|
|
|
1608
1707
|
reason: errorMessage,
|
|
1609
1708
|
metadata: { completion_source: 'orchestrator' },
|
|
1610
1709
|
};
|
|
1710
|
+
const archivedWorkflowIds = await this.reapAiTemporaryFromRun(opts.threadId, opts.user, undefined);
|
|
1611
1711
|
this.eventBus.publish(opts.threadId, {
|
|
1612
1712
|
type: 'run-finish',
|
|
1613
1713
|
runId: opts.runId,
|
|
@@ -1615,6 +1715,7 @@ let InstanceAiService = class InstanceAiService {
|
|
|
1615
1715
|
payload: {
|
|
1616
1716
|
status: 'error',
|
|
1617
1717
|
reason: errorMessage,
|
|
1718
|
+
...(archivedWorkflowIds.length > 0 ? { archivedWorkflowIds } : {}),
|
|
1618
1719
|
},
|
|
1619
1720
|
});
|
|
1620
1721
|
}
|
|
@@ -1751,19 +1852,133 @@ let InstanceAiService = class InstanceAiService {
|
|
|
1751
1852
|
num_steps: numSteps,
|
|
1752
1853
|
});
|
|
1753
1854
|
}
|
|
1754
|
-
|
|
1855
|
+
async reapAiTemporaryFromRun(threadId, user, createdWorkflowIds) {
|
|
1856
|
+
let markedWorkflows = [];
|
|
1857
|
+
try {
|
|
1858
|
+
markedWorkflows = await this.aiBuilderTemporaryWorkflowRepository.findByThread(threadId);
|
|
1859
|
+
}
|
|
1860
|
+
catch (error) {
|
|
1861
|
+
this.logger.warn('Failed to inspect AI-builder temporary workflows during run finish', {
|
|
1862
|
+
threadId,
|
|
1863
|
+
error: getErrorMessage(error),
|
|
1864
|
+
});
|
|
1865
|
+
}
|
|
1866
|
+
const workflowIds = new Set([
|
|
1867
|
+
...markedWorkflows.map(({ workflowId }) => workflowId),
|
|
1868
|
+
...(createdWorkflowIds ?? []),
|
|
1869
|
+
]);
|
|
1870
|
+
if (workflowIds.size === 0)
|
|
1871
|
+
return [];
|
|
1872
|
+
return await this.archiveAiTemporaryWorkflows(threadId, user, workflowIds);
|
|
1873
|
+
}
|
|
1874
|
+
async archiveAiTemporaryWorkflows(threadId, user, workflowIds) {
|
|
1875
|
+
const adapter = this.adapterService.createContext(user, { threadId });
|
|
1876
|
+
const archived = [];
|
|
1877
|
+
for (const workflowId of workflowIds) {
|
|
1878
|
+
try {
|
|
1879
|
+
const didArchive = await adapter.workflowService.archiveIfAiTemporary(workflowId);
|
|
1880
|
+
if (didArchive)
|
|
1881
|
+
archived.push(workflowId);
|
|
1882
|
+
}
|
|
1883
|
+
catch (error) {
|
|
1884
|
+
this.logger.warn('Failed to reap AI-builder temporary workflow', {
|
|
1885
|
+
threadId,
|
|
1886
|
+
workflowId,
|
|
1887
|
+
error: getErrorMessage(error),
|
|
1888
|
+
});
|
|
1889
|
+
}
|
|
1890
|
+
}
|
|
1891
|
+
return archived;
|
|
1892
|
+
}
|
|
1893
|
+
async finalizeCancelledSuspendedRun(suspended) {
|
|
1894
|
+
await this.finalizeRunTracing(suspended.runId, suspended.tracing, {
|
|
1895
|
+
status: 'cancelled',
|
|
1896
|
+
reason: 'user_cancelled',
|
|
1897
|
+
});
|
|
1898
|
+
const archivedWorkflowIds = await this.reapAiTemporaryFromRun(suspended.threadId, suspended.user, undefined);
|
|
1899
|
+
this.publishRunFinish(suspended.threadId, suspended.runId, 'cancelled', 'user_cancelled', archivedWorkflowIds);
|
|
1900
|
+
await this.saveAgentTreeSnapshot(suspended.threadId, suspended.runId, this.dbSnapshotStorage, true);
|
|
1901
|
+
if (suspended.mastraRunId) {
|
|
1902
|
+
void this.cleanupMastraSnapshots(suspended.mastraRunId);
|
|
1903
|
+
}
|
|
1904
|
+
await this.maybeFinalizeRunTraceRoot(suspended.runId, {
|
|
1905
|
+
status: 'cancelled',
|
|
1906
|
+
reason: 'user_cancelled',
|
|
1907
|
+
metadata: { completion_source: 'orchestrator' },
|
|
1908
|
+
});
|
|
1909
|
+
}
|
|
1910
|
+
async reapAiTemporaryForThreadCleanup(threadId) {
|
|
1911
|
+
let markedWorkflows;
|
|
1912
|
+
try {
|
|
1913
|
+
markedWorkflows = await this.aiBuilderTemporaryWorkflowRepository.findByThread(threadId);
|
|
1914
|
+
}
|
|
1915
|
+
catch (error) {
|
|
1916
|
+
this.logger.warn('Failed to inspect AI-builder temporary workflows during thread cleanup', {
|
|
1917
|
+
threadId,
|
|
1918
|
+
error: getErrorMessage(error),
|
|
1919
|
+
});
|
|
1920
|
+
return;
|
|
1921
|
+
}
|
|
1922
|
+
if (markedWorkflows.length === 0)
|
|
1923
|
+
return;
|
|
1924
|
+
let thread;
|
|
1925
|
+
try {
|
|
1926
|
+
thread = await this.threadRepo.findOneBy({ id: threadId });
|
|
1927
|
+
}
|
|
1928
|
+
catch (error) {
|
|
1929
|
+
this.logger.warn('Failed to load thread owner for AI-builder temporary workflow cleanup', {
|
|
1930
|
+
threadId,
|
|
1931
|
+
markedWorkflowCount: markedWorkflows.length,
|
|
1932
|
+
error: getErrorMessage(error),
|
|
1933
|
+
});
|
|
1934
|
+
return;
|
|
1935
|
+
}
|
|
1936
|
+
if (!thread?.resourceId) {
|
|
1937
|
+
this.logger.warn('Skipping AI-builder temporary workflow cleanup for thread without owner', {
|
|
1938
|
+
threadId,
|
|
1939
|
+
markedWorkflowCount: markedWorkflows.length,
|
|
1940
|
+
});
|
|
1941
|
+
return;
|
|
1942
|
+
}
|
|
1943
|
+
let user;
|
|
1944
|
+
try {
|
|
1945
|
+
user = await this.userRepository.findOneBy({ id: thread.resourceId });
|
|
1946
|
+
}
|
|
1947
|
+
catch (error) {
|
|
1948
|
+
this.logger.warn('Failed to load user for AI-builder temporary workflow cleanup', {
|
|
1949
|
+
threadId,
|
|
1950
|
+
userId: thread.resourceId,
|
|
1951
|
+
markedWorkflowCount: markedWorkflows.length,
|
|
1952
|
+
error: getErrorMessage(error),
|
|
1953
|
+
});
|
|
1954
|
+
return;
|
|
1955
|
+
}
|
|
1956
|
+
if (!user) {
|
|
1957
|
+
this.logger.warn('Skipping AI-builder temporary workflow cleanup for missing thread owner', {
|
|
1958
|
+
threadId,
|
|
1959
|
+
userId: thread.resourceId,
|
|
1960
|
+
markedWorkflowCount: markedWorkflows.length,
|
|
1961
|
+
});
|
|
1962
|
+
return;
|
|
1963
|
+
}
|
|
1964
|
+
await this.archiveAiTemporaryWorkflows(threadId, user, new Set(markedWorkflows.map(({ workflowId }) => workflowId)));
|
|
1965
|
+
}
|
|
1966
|
+
publishRunFinish(threadId, runId, status, reason, archivedWorkflowIds) {
|
|
1755
1967
|
const effectiveStatus = status === 'errored' ? 'error' : status;
|
|
1968
|
+
const hasArchived = archivedWorkflowIds && archivedWorkflowIds.length > 0;
|
|
1756
1969
|
this.eventBus.publish(threadId, {
|
|
1757
1970
|
type: 'run-finish',
|
|
1758
1971
|
runId,
|
|
1759
1972
|
agentId: ORCHESTRATOR_AGENT_ID,
|
|
1760
|
-
payload:
|
|
1761
|
-
|
|
1762
|
-
|
|
1973
|
+
payload: {
|
|
1974
|
+
status: effectiveStatus,
|
|
1975
|
+
...(status === 'cancelled' ? { reason: reason ?? 'user_cancelled' } : {}),
|
|
1976
|
+
...(hasArchived ? { archivedWorkflowIds } : {}),
|
|
1977
|
+
},
|
|
1763
1978
|
});
|
|
1764
1979
|
}
|
|
1765
1980
|
async finalizeRun(threadId, runId, status, snapshotStorage, options) {
|
|
1766
|
-
this.publishRunFinish(threadId, runId, status);
|
|
1981
|
+
this.publishRunFinish(threadId, runId, status, undefined, options?.archivedWorkflowIds);
|
|
1767
1982
|
if (status === 'completed') {
|
|
1768
1983
|
await this.saveAgentTreeSnapshot(threadId, runId, snapshotStorage);
|
|
1769
1984
|
if (options?.userId && options?.modelId) {
|
|
@@ -1835,11 +2050,18 @@ let InstanceAiService = class InstanceAiService {
|
|
|
1835
2050
|
events = this.eventBus.getEventsForRun(threadId, runId);
|
|
1836
2051
|
}
|
|
1837
2052
|
const agentTree = (0, instance_ai_1.buildAgentTreeFromEvents)(events);
|
|
2053
|
+
const tracing = this.traceContextsByRunId.get(runId)?.tracing;
|
|
2054
|
+
const saveOptions = {
|
|
2055
|
+
messageGroupId,
|
|
2056
|
+
runIds: groupRunIds,
|
|
2057
|
+
langsmithRunId: tracing?.rootRun.id,
|
|
2058
|
+
langsmithTraceId: tracing?.rootRun.traceId,
|
|
2059
|
+
};
|
|
1838
2060
|
if (isUpdate) {
|
|
1839
|
-
await snapshotStorage.updateLast(threadId, agentTree, runId,
|
|
2061
|
+
await snapshotStorage.updateLast(threadId, agentTree, runId, saveOptions);
|
|
1840
2062
|
}
|
|
1841
2063
|
else {
|
|
1842
|
-
await snapshotStorage.save(threadId, agentTree, runId,
|
|
2064
|
+
await snapshotStorage.save(threadId, agentTree, runId, saveOptions);
|
|
1843
2065
|
}
|
|
1844
2066
|
}
|
|
1845
2067
|
catch (error) {
|
|
@@ -1876,6 +2098,8 @@ exports.InstanceAiService = InstanceAiService = __decorate([
|
|
|
1876
2098
|
db_snapshot_storage_1.DbSnapshotStorage,
|
|
1877
2099
|
db_iteration_log_storage_1.DbIterationLogStorage,
|
|
1878
2100
|
source_control_preferences_service_ee_1.SourceControlPreferencesService,
|
|
1879
|
-
telemetry_1.Telemetry
|
|
2101
|
+
telemetry_1.Telemetry,
|
|
2102
|
+
db_1.UserRepository,
|
|
2103
|
+
db_1.AiBuilderTemporaryWorkflowRepository])
|
|
1880
2104
|
], InstanceAiService);
|
|
1881
2105
|
//# sourceMappingURL=instance-ai.service.js.map
|