@rudderhq/server 0.7.2-canary.0 → 0.7.3
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/agent-runtimes/codex-models.d.ts +11 -0
- package/dist/agent-runtimes/codex-models.d.ts.map +1 -1
- package/dist/agent-runtimes/codex-models.js +155 -2
- package/dist/agent-runtimes/codex-models.js.map +1 -1
- package/dist/agent-runtimes/cursor-models.d.ts.map +1 -1
- package/dist/agent-runtimes/cursor-models.js +31 -9
- package/dist/agent-runtimes/cursor-models.js.map +1 -1
- package/dist/agent-runtimes/index.d.ts +1 -1
- package/dist/agent-runtimes/index.d.ts.map +1 -1
- package/dist/agent-runtimes/index.js +1 -1
- package/dist/agent-runtimes/index.js.map +1 -1
- package/dist/agent-runtimes/registry.d.ts +11 -4
- package/dist/agent-runtimes/registry.d.ts.map +1 -1
- package/dist/agent-runtimes/registry.js +52 -3
- package/dist/agent-runtimes/registry.js.map +1 -1
- package/dist/app.d.ts.map +1 -1
- package/dist/app.js +1 -5
- package/dist/app.js.map +1 -1
- package/dist/bootstrap/create-http-app.d.ts +1 -2
- package/dist/bootstrap/create-http-app.d.ts.map +1 -1
- package/dist/bootstrap/create-http-app.js +13 -12
- package/dist/bootstrap/create-http-app.js.map +1 -1
- package/dist/bootstrap/register-api-routes.d.ts +1 -2
- package/dist/bootstrap/register-api-routes.d.ts.map +1 -1
- package/dist/bootstrap/register-api-routes.js +20 -4
- package/dist/bootstrap/register-api-routes.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +86 -30
- package/dist/index.js.map +1 -1
- package/dist/middleware/logger.js +2 -2
- package/dist/middleware/logger.js.map +1 -1
- package/dist/middleware/logger.test.js +26 -10
- package/dist/middleware/logger.test.js.map +1 -1
- package/dist/redaction.d.ts +1 -0
- package/dist/redaction.d.ts.map +1 -1
- package/dist/redaction.js +13 -0
- package/dist/redaction.js.map +1 -1
- package/dist/routes/access.helpers.d.ts +1 -1
- package/dist/routes/agent-issue-creation.d.ts +25 -0
- package/dist/routes/agent-issue-creation.d.ts.map +1 -0
- package/dist/routes/agent-issue-creation.js +201 -0
- package/dist/routes/agent-issue-creation.js.map +1 -0
- package/dist/routes/agents.d.ts.map +1 -1
- package/dist/routes/agents.js +20 -6
- package/dist/routes/agents.js.map +1 -1
- package/dist/routes/agents.management-routes.d.ts.map +1 -1
- package/dist/routes/agents.management-routes.js +13 -10
- package/dist/routes/agents.management-routes.js.map +1 -1
- package/dist/routes/app-builder.d.ts +3 -1
- package/dist/routes/app-builder.d.ts.map +1 -1
- package/dist/routes/app-builder.js +31 -11
- package/dist/routes/app-builder.js.map +1 -1
- package/dist/routes/approvals.d.ts.map +1 -1
- package/dist/routes/approvals.js +77 -1
- package/dist/routes/approvals.js.map +1 -1
- package/dist/routes/chats.d.ts.map +1 -1
- package/dist/routes/chats.js +1 -0
- package/dist/routes/chats.js.map +1 -1
- package/dist/routes/chats.stream-routes.d.ts.map +1 -1
- package/dist/routes/chats.stream-routes.js +4 -0
- package/dist/routes/chats.stream-routes.js.map +1 -1
- package/dist/routes/computer.d.ts +30 -0
- package/dist/routes/computer.d.ts.map +1 -0
- package/dist/routes/computer.js +231 -0
- package/dist/routes/computer.js.map +1 -0
- package/dist/routes/goals.d.ts.map +1 -1
- package/dist/routes/goals.js +349 -23
- package/dist/routes/goals.js.map +1 -1
- package/dist/routes/health.d.ts.map +1 -1
- package/dist/routes/health.js +3 -0
- package/dist/routes/health.js.map +1 -1
- package/dist/routes/instance-settings.d.ts.map +1 -1
- package/dist/routes/instance-settings.js +3 -0
- package/dist/routes/instance-settings.js.map +1 -1
- package/dist/routes/issues.comments-attachments.d.ts.map +1 -1
- package/dist/routes/issues.comments-attachments.js +90 -8
- package/dist/routes/issues.comments-attachments.js.map +1 -1
- package/dist/routes/issues.d.ts.map +1 -1
- package/dist/routes/issues.js +12 -1
- package/dist/routes/issues.js.map +1 -1
- package/dist/routes/issues.mutations.d.ts.map +1 -1
- package/dist/routes/issues.mutations.js +85 -33
- package/dist/routes/issues.mutations.js.map +1 -1
- package/dist/routes/managed-mcp-connections.d.ts.map +1 -1
- package/dist/routes/managed-mcp-connections.js +46 -7
- package/dist/routes/managed-mcp-connections.js.map +1 -1
- package/dist/routes/managed-mcp-runtime.d.ts.map +1 -1
- package/dist/routes/managed-mcp-runtime.js +109 -7
- package/dist/routes/managed-mcp-runtime.js.map +1 -1
- package/dist/routes/product-analytics-collector-report.d.ts +29 -0
- package/dist/routes/product-analytics-collector-report.d.ts.map +1 -1
- package/dist/routes/product-analytics-collector-report.js +57 -1
- package/dist/routes/product-analytics-collector-report.js.map +1 -1
- package/dist/routes/product-analytics-collector-report.test.d.ts +2 -0
- package/dist/routes/product-analytics-collector-report.test.d.ts.map +1 -0
- package/dist/routes/product-analytics-collector-report.test.js +50 -0
- package/dist/routes/product-analytics-collector-report.test.js.map +1 -0
- package/dist/routes/rudder-plugins.d.ts +4 -0
- package/dist/routes/rudder-plugins.d.ts.map +1 -0
- package/dist/routes/rudder-plugins.js +213 -0
- package/dist/routes/rudder-plugins.js.map +1 -0
- package/dist/services/activity-log.d.ts +0 -3
- package/dist/services/activity-log.d.ts.map +1 -1
- package/dist/services/activity-log.js +0 -33
- package/dist/services/activity-log.js.map +1 -1
- package/dist/services/activity.d.ts +3 -3
- package/dist/services/agent-issue-creation.d.ts +344 -0
- package/dist/services/agent-issue-creation.d.ts.map +1 -0
- package/dist/services/agent-issue-creation.js +675 -0
- package/dist/services/agent-issue-creation.js.map +1 -0
- package/dist/services/agent-run-context.d.ts.map +1 -1
- package/dist/services/agent-run-context.js +13 -2
- package/dist/services/agent-run-context.js.map +1 -1
- package/dist/services/app-builder.d.ts.map +1 -1
- package/dist/services/app-builder.js +24 -3
- package/dist/services/app-builder.js.map +1 -1
- package/dist/services/automation-chat-output.d.ts +1 -1
- package/dist/services/automation-chat-output.d.ts.map +1 -1
- package/dist/services/automation-chat-output.js +24 -14
- package/dist/services/automation-chat-output.js.map +1 -1
- package/dist/services/chat-annotation-copy-lineage.d.ts +1 -1
- package/dist/services/chat-assistant.d.ts.map +1 -1
- package/dist/services/chat-assistant.helpers.d.ts +4 -4
- package/dist/services/chat-assistant.helpers.d.ts.map +1 -1
- package/dist/services/chat-assistant.helpers.js.map +1 -1
- package/dist/services/chat-assistant.js +45 -13
- package/dist/services/chat-assistant.js.map +1 -1
- package/dist/services/chat-assistant.runtime-overrides.d.ts +2 -1
- package/dist/services/chat-assistant.runtime-overrides.d.ts.map +1 -1
- package/dist/services/chat-assistant.runtime-overrides.js +47 -18
- package/dist/services/chat-assistant.runtime-overrides.js.map +1 -1
- package/dist/services/chat-assistant.runtime-overrides.test.d.ts +2 -0
- package/dist/services/chat-assistant.runtime-overrides.test.d.ts.map +1 -0
- package/dist/services/chat-assistant.runtime-overrides.test.js +37 -0
- package/dist/services/chat-assistant.runtime-overrides.test.js.map +1 -0
- package/dist/services/chat-generation-protocol.d.ts.map +1 -1
- package/dist/services/chat-generation-protocol.js +1 -12
- package/dist/services/chat-generation-protocol.js.map +1 -1
- package/dist/services/chat-generation-protocol.test.js +16 -25
- package/dist/services/chat-generation-protocol.test.js.map +1 -1
- package/dist/services/chat-generation-provenance.d.ts.map +1 -1
- package/dist/services/chat-generation-provenance.js +4 -2
- package/dist/services/chat-generation-provenance.js.map +1 -1
- package/dist/services/chat-queued-message-materialization.d.ts.map +1 -1
- package/dist/services/chat-queued-message-materialization.js +12 -2
- package/dist/services/chat-queued-message-materialization.js.map +1 -1
- package/dist/services/chat-transcript-persistence.d.ts +49 -0
- package/dist/services/chat-transcript-persistence.d.ts.map +1 -0
- package/dist/services/chat-transcript-persistence.js +238 -0
- package/dist/services/chat-transcript-persistence.js.map +1 -0
- package/dist/services/chat-transcript-persistence.test.d.ts +2 -0
- package/dist/services/chat-transcript-persistence.test.d.ts.map +1 -0
- package/dist/services/chat-transcript-persistence.test.js +23 -0
- package/dist/services/chat-transcript-persistence.test.js.map +1 -0
- package/dist/services/chat-work-manifest.d.ts.map +1 -1
- package/dist/services/chat-work-manifest.js +36 -10
- package/dist/services/chat-work-manifest.js.map +1 -1
- package/dist/services/chats.annotation-persistence.d.ts.map +1 -1
- package/dist/services/chats.annotation-persistence.js +25 -6
- package/dist/services/chats.annotation-persistence.js.map +1 -1
- package/dist/services/chats.create.d.ts.map +1 -1
- package/dist/services/chats.create.js +49 -4
- package/dist/services/chats.create.js.map +1 -1
- package/dist/services/chats.d.ts +10 -10
- package/dist/services/chats.d.ts.map +1 -1
- package/dist/services/chats.inline-visual-persistence.d.ts +2 -1
- package/dist/services/chats.inline-visual-persistence.d.ts.map +1 -1
- package/dist/services/chats.inline-visual-persistence.js +19 -2
- package/dist/services/chats.inline-visual-persistence.js.map +1 -1
- package/dist/services/chats.js +177 -95
- package/dist/services/chats.js.map +1 -1
- package/dist/services/computer-broker.d.ts +35 -0
- package/dist/services/computer-broker.d.ts.map +1 -0
- package/dist/services/computer-broker.js +211 -0
- package/dist/services/computer-broker.js.map +1 -0
- package/dist/services/computer-broker.test.d.ts +2 -0
- package/dist/services/computer-broker.test.d.ts.map +1 -0
- package/dist/services/computer-broker.test.js +70 -0
- package/dist/services/computer-broker.test.js.map +1 -0
- package/dist/services/computer-capability.d.ts +13 -0
- package/dist/services/computer-capability.d.ts.map +1 -0
- package/dist/services/computer-capability.js +11 -0
- package/dist/services/computer-capability.js.map +1 -0
- package/dist/services/computer-capability.test.d.ts +2 -0
- package/dist/services/computer-capability.test.d.ts.map +1 -0
- package/dist/services/computer-capability.test.js +27 -0
- package/dist/services/computer-capability.test.js.map +1 -0
- package/dist/services/finance.d.ts +2 -2
- package/dist/services/goals.d.ts +2041 -126
- package/dist/services/goals.d.ts.map +1 -1
- package/dist/services/goals.js +1533 -176
- package/dist/services/goals.js.map +1 -1
- package/dist/services/index.d.ts +2 -0
- package/dist/services/index.d.ts.map +1 -1
- package/dist/services/index.js +2 -0
- package/dist/services/index.js.map +1 -1
- package/dist/services/instance-settings.d.ts.map +1 -1
- package/dist/services/instance-settings.js +17 -2
- package/dist/services/instance-settings.js.map +1 -1
- package/dist/services/integrations/agent-integrations.d.ts +1 -1
- package/dist/services/issues.d.ts +86 -1
- package/dist/services/issues.d.ts.map +1 -1
- package/dist/services/issues.helpers.d.ts +4 -0
- package/dist/services/issues.helpers.d.ts.map +1 -1
- package/dist/services/issues.helpers.js +28 -6
- package/dist/services/issues.helpers.js.map +1 -1
- package/dist/services/issues.js +208 -109
- package/dist/services/issues.js.map +1 -1
- package/dist/services/knowledge-portability/organization-portability.files.d.ts +1 -1
- package/dist/services/knowledge-portability/organization-skills.catalog.d.ts +7 -1
- package/dist/services/knowledge-portability/organization-skills.catalog.d.ts.map +1 -1
- package/dist/services/knowledge-portability/organization-skills.catalog.js +10 -0
- package/dist/services/knowledge-portability/organization-skills.catalog.js.map +1 -1
- package/dist/services/knowledge-portability/organization-skills.d.ts +1 -0
- package/dist/services/knowledge-portability/organization-skills.d.ts.map +1 -1
- package/dist/services/knowledge-portability/organization-skills.js +36 -3
- package/dist/services/knowledge-portability/organization-skills.js.map +1 -1
- package/dist/services/mcp/managed-bindings.d.ts +3 -1
- package/dist/services/mcp/managed-bindings.d.ts.map +1 -1
- package/dist/services/mcp/managed-bindings.js +31 -7
- package/dist/services/mcp/managed-bindings.js.map +1 -1
- package/dist/services/mcp/managed-client.d.ts +15 -0
- package/dist/services/mcp/managed-client.d.ts.map +1 -1
- package/dist/services/mcp/managed-client.js +23 -1
- package/dist/services/mcp/managed-client.js.map +1 -1
- package/dist/services/mcp/managed-client.test.js +73 -9
- package/dist/services/mcp/managed-client.test.js.map +1 -1
- package/dist/services/mcp/managed-connections.d.ts +19 -1
- package/dist/services/mcp/managed-connections.d.ts.map +1 -1
- package/dist/services/mcp/managed-connections.js +211 -37
- package/dist/services/mcp/managed-connections.js.map +1 -1
- package/dist/services/mcp/managed-runtime.js +1 -1
- package/dist/services/mcp/managed-runtime.js.map +1 -1
- package/dist/services/mcp/oauth.d.ts.map +1 -1
- package/dist/services/mcp/oauth.js +3 -0
- package/dist/services/mcp/oauth.js.map +1 -1
- package/dist/services/mcp/provider-registry.d.ts +24 -1
- package/dist/services/mcp/provider-registry.d.ts.map +1 -1
- package/dist/services/mcp/provider-registry.js +26 -0
- package/dist/services/mcp/provider-registry.js.map +1 -1
- package/dist/services/mcp/provider-registry.test.js +26 -0
- package/dist/services/mcp/provider-registry.test.js.map +1 -1
- package/dist/services/messenger-saved-views.d.ts.map +1 -1
- package/dist/services/messenger-saved-views.js +1 -0
- package/dist/services/messenger-saved-views.js.map +1 -1
- package/dist/services/messenger.d.ts +2 -2
- package/dist/services/messenger.d.ts.map +1 -1
- package/dist/services/messenger.js +142 -51
- package/dist/services/messenger.js.map +1 -1
- package/dist/services/product-analytics.d.ts +21 -5
- package/dist/services/product-analytics.d.ts.map +1 -1
- package/dist/services/product-analytics.js +47 -0
- package/dist/services/product-analytics.js.map +1 -1
- package/dist/services/product-analytics.test.js +63 -1
- package/dist/services/product-analytics.test.js.map +1 -1
- package/dist/services/rudder-plugins.d.ts +107 -0
- package/dist/services/rudder-plugins.d.ts.map +1 -0
- package/dist/services/rudder-plugins.js +1746 -0
- package/dist/services/rudder-plugins.js.map +1 -0
- package/dist/services/rudder-plugins.test.d.ts +2 -0
- package/dist/services/rudder-plugins.test.d.ts.map +1 -0
- package/dist/services/rudder-plugins.test.js +191 -0
- package/dist/services/rudder-plugins.test.js.map +1 -0
- package/dist/services/run-events.d.ts +1 -1
- package/dist/services/runtime-kernel/heartbeat.core.d.ts +1 -0
- package/dist/services/runtime-kernel/heartbeat.core.d.ts.map +1 -1
- package/dist/services/runtime-kernel/heartbeat.core.js +1 -1
- package/dist/services/runtime-kernel/heartbeat.core.js.map +1 -1
- package/dist/services/runtime-kernel/heartbeat.d.ts +57 -0
- package/dist/services/runtime-kernel/heartbeat.d.ts.map +1 -1
- package/dist/services/runtime-kernel/heartbeat.execute.d.ts.map +1 -1
- package/dist/services/runtime-kernel/heartbeat.execute.js +51 -3
- package/dist/services/runtime-kernel/heartbeat.execute.js.map +1 -1
- package/dist/services/runtime-kernel/heartbeat.js +400 -102
- package/dist/services/runtime-kernel/heartbeat.js.map +1 -1
- package/dist/services/runtime-kernel/heartbeat.recovery.d.ts.map +1 -1
- package/dist/services/runtime-kernel/heartbeat.recovery.js +23 -2
- package/dist/services/runtime-kernel/heartbeat.recovery.js.map +1 -1
- package/dist/services/runtime-kernel/heartbeat.terminal.d.ts +17 -2
- package/dist/services/runtime-kernel/heartbeat.terminal.d.ts.map +1 -1
- package/dist/services/runtime-kernel/heartbeat.terminal.js +33 -1
- package/dist/services/runtime-kernel/heartbeat.terminal.js.map +1 -1
- package/dist/services/runtime-kernel/heartbeat.wakeup.d.ts.map +1 -1
- package/dist/services/runtime-kernel/heartbeat.wakeup.js +35 -3
- package/dist/services/runtime-kernel/heartbeat.wakeup.js.map +1 -1
- package/dist/services/side-chats.d.ts.map +1 -1
- package/dist/services/side-chats.js +12 -0
- package/dist/services/side-chats.js.map +1 -1
- package/dist/services/workspace-runtime.services.d.ts +1 -1
- package/package.json +19 -17
- package/resources/bundled-skills/app-builder/SKILL.md +39 -9
- package/resources/bundled-skills/app-builder/assets/scaffold/app/globals.css +109 -16
- package/resources/bundled-skills/app-builder/assets/scaffold/components/contacts-workspace.tsx +176 -152
- package/resources/bundled-skills/app-builder/assets/scaffold/components/ui/alert.tsx +12 -0
- package/resources/bundled-skills/app-builder/assets/scaffold/components/ui/badge.tsx +27 -0
- package/resources/bundled-skills/app-builder/assets/scaffold/components/ui/button.tsx +9 -7
- package/resources/bundled-skills/app-builder/assets/scaffold/components/ui/card.tsx +15 -3
- package/resources/bundled-skills/app-builder/assets/scaffold/components/ui/empty.tsx +18 -0
- package/resources/bundled-skills/app-builder/assets/scaffold/components/ui/field.tsx +23 -0
- package/resources/bundled-skills/app-builder/assets/scaffold/components/ui/input.tsx +1 -1
- package/resources/bundled-skills/app-builder/assets/scaffold/components/ui/label.tsx +1 -1
- package/resources/bundled-skills/app-builder/assets/scaffold/components/ui/separator.tsx +6 -0
- package/resources/bundled-skills/app-builder/assets/scaffold/components/ui/skeleton.tsx +6 -0
- package/resources/bundled-skills/app-builder/assets/scaffold/components/ui/table.tsx +30 -0
- package/resources/bundled-skills/app-builder/assets/scaffold/components.json +20 -0
- package/resources/bundled-skills/app-builder/assets/scaffold/next-env.d.ts +1 -1
- package/resources/bundled-skills/app-builder/assets/scaffold/next.config.ts +19 -0
- package/resources/bundled-skills/app-builder/assets/scaffold/package.json +2 -1
- package/resources/bundled-skills/app-builder/assets/scaffold/rudder.app.json +1 -1
- package/resources/bundled-skills/app-builder/assets/scaffold/rudder.ui.json +13 -0
- package/resources/bundled-skills/app-builder/assets/scaffold/scripts/validate-rudder-ui.mjs +50 -0
- package/resources/bundled-skills/app-builder/assets/scaffold/tests/e2e/app.spec.ts +35 -1
- package/resources/bundled-skills/app-builder/evals/evals.json +2 -1
- package/resources/bundled-skills/app-builder/references/design-guidelines.md +19 -2
- package/resources/bundled-skills/app-builder/references/rudder-ui-preset.md +73 -0
- package/resources/bundled-skills/app-builder/references/scaffold-contract.md +12 -0
- package/resources/bundled-skills/app-builder/references/verification.md +6 -0
- package/resources/bundled-skills/app-builder/scripts/report-build-status.mjs +83 -0
- package/resources/bundled-skills/browser/SKILL.md +11 -4
- package/resources/bundled-skills/browser/agents/openai.yaml +2 -2
- package/resources/bundled-skills/browser/evals/trigger-evals.json +22 -0
- package/resources/bundled-skills/rudder-docs/SKILL.md +2 -2
- package/resources/bundled-skills/rudder-docs/evals/retrieval-authority-evals.json +40 -0
- package/resources/bundled-skills/rudder-docs/evals/trigger-evals.json +2 -2
- package/resources/bundled-skills/rudder-docs/references/api-reference.md +0 -2
- package/resources/bundled-skills/rudder-docs/references/plugin-authoring.md +38 -114
- package/resources/bundled-skills/rudder-docs/references/source-map.md +2 -0
- package/skills/app-builder/SKILL.md +39 -9
- package/skills/app-builder/assets/scaffold/app/globals.css +109 -16
- package/skills/app-builder/assets/scaffold/components/contacts-workspace.tsx +176 -152
- package/skills/app-builder/assets/scaffold/components/ui/alert.tsx +12 -0
- package/skills/app-builder/assets/scaffold/components/ui/badge.tsx +27 -0
- package/skills/app-builder/assets/scaffold/components/ui/button.tsx +9 -7
- package/skills/app-builder/assets/scaffold/components/ui/card.tsx +15 -3
- package/skills/app-builder/assets/scaffold/components/ui/empty.tsx +18 -0
- package/skills/app-builder/assets/scaffold/components/ui/field.tsx +23 -0
- package/skills/app-builder/assets/scaffold/components/ui/input.tsx +1 -1
- package/skills/app-builder/assets/scaffold/components/ui/label.tsx +1 -1
- package/skills/app-builder/assets/scaffold/components/ui/separator.tsx +6 -0
- package/skills/app-builder/assets/scaffold/components/ui/skeleton.tsx +6 -0
- package/skills/app-builder/assets/scaffold/components/ui/table.tsx +30 -0
- package/skills/app-builder/assets/scaffold/components.json +20 -0
- package/skills/app-builder/assets/scaffold/next-env.d.ts +1 -1
- package/skills/app-builder/assets/scaffold/next.config.ts +19 -0
- package/skills/app-builder/assets/scaffold/package.json +2 -1
- package/skills/app-builder/assets/scaffold/rudder.app.json +1 -1
- package/skills/app-builder/assets/scaffold/rudder.ui.json +13 -0
- package/skills/app-builder/assets/scaffold/scripts/validate-rudder-ui.mjs +50 -0
- package/skills/app-builder/assets/scaffold/tests/e2e/app.spec.ts +35 -1
- package/skills/app-builder/evals/evals.json +2 -1
- package/skills/app-builder/references/design-guidelines.md +19 -2
- package/skills/app-builder/references/rudder-ui-preset.md +73 -0
- package/skills/app-builder/references/scaffold-contract.md +12 -0
- package/skills/app-builder/references/verification.md +6 -0
- package/skills/app-builder/scripts/report-build-status.mjs +83 -0
- package/skills/browser/SKILL.md +11 -4
- package/skills/browser/agents/openai.yaml +2 -2
- package/skills/browser/evals/trigger-evals.json +22 -0
- package/skills/rudder-docs/SKILL.md +2 -2
- package/skills/rudder-docs/evals/retrieval-authority-evals.json +40 -0
- package/skills/rudder-docs/evals/trigger-evals.json +2 -2
- package/skills/rudder-docs/references/api-reference.md +0 -2
- package/skills/rudder-docs/references/plugin-authoring.md +38 -114
- package/skills/rudder-docs/references/source-map.md +2 -0
- package/ui-dist/assets/{LibraryLiveSurface-CcsYG18H.js → LibraryLiveSurface-CoGcDfo0.js} +1 -1
- package/ui-dist/assets/{abnfDiagram-VRR7QNED-C34K70lu.js → abnfDiagram-VRR7QNED-BnPHHNfu.js} +1 -1
- package/ui-dist/assets/{arc-BYztEqom.js → arc-CAvqQQR_.js} +1 -1
- package/ui-dist/assets/{architectureDiagram-ZJ3FMSHR-BQKKX-d7.js → architectureDiagram-ZJ3FMSHR-DDa31YAK.js} +1 -1
- package/ui-dist/assets/{blockDiagram-677ZJIJ3-DPfaIbqb.js → blockDiagram-677ZJIJ3-DDXLU9Ej.js} +1 -1
- package/ui-dist/assets/{c4Diagram-LMCZKHZV-BnwCM567.js → c4Diagram-LMCZKHZV-zEm0rHCp.js} +1 -1
- package/ui-dist/assets/channel-M_3GhwHQ.js +1 -0
- package/ui-dist/assets/{chunk-2Q5K7J3B-CFviCRuZ.js → chunk-2Q5K7J3B-y1Rw45sz.js} +1 -1
- package/ui-dist/assets/{chunk-32BRIVSS-FoIxWB1d.js → chunk-32BRIVSS-Cq8cQBba.js} +1 -1
- package/ui-dist/assets/{chunk-5VM5RSS4-EbAfuwwN.js → chunk-5VM5RSS4-CjQA6jGI.js} +1 -1
- package/ui-dist/assets/{chunk-EX3LRPZG-CsStqjdd.js → chunk-EX3LRPZG-VVYt7jh3.js} +1 -1
- package/ui-dist/assets/{chunk-JWPE2WC7-Dw5KEviU.js → chunk-JWPE2WC7-BJC3ISop.js} +1 -1
- package/ui-dist/assets/{chunk-MOJQB5TN-BlHlEWfj.js → chunk-MOJQB5TN-ClZgTqQk.js} +1 -1
- package/ui-dist/assets/{chunk-RYQCIY6F-BWw7BE01.js → chunk-RYQCIY6F-DRei3pn2.js} +1 -1
- package/ui-dist/assets/{chunk-V7JOEXUC-CxRvHZbj.js → chunk-V7JOEXUC-BGWrQfpZ.js} +1 -1
- package/ui-dist/assets/{chunk-VR4S4FIN-DZa_KwY9.js → chunk-VR4S4FIN-BBYT57Lt.js} +1 -1
- package/ui-dist/assets/{chunk-XXDRQBXY-Cnimf5j2.js → chunk-XXDRQBXY-D7P4SoZB.js} +1 -1
- package/ui-dist/assets/classDiagram-OUVF2IWQ-G44FJFnB.js +1 -0
- package/ui-dist/assets/classDiagram-v2-EOCWNBFH-G44FJFnB.js +1 -0
- package/ui-dist/assets/{cose-bilkent-JH36ORCC-COCPT6B8.js → cose-bilkent-JH36ORCC-mJXY7GQo.js} +1 -1
- package/ui-dist/assets/{cynefin-VYW2F7L2-C5CybQ7c.js → cynefin-VYW2F7L2-C-I_lPmH.js} +1 -1
- package/ui-dist/assets/{cynefinDiagram-TSTJHNR4-BDrPLGpv.js → cynefinDiagram-TSTJHNR4-Bm1S_w7H.js} +1 -1
- package/ui-dist/assets/{dagre-VKFMJZFB-DXxPiE9D.js → dagre-VKFMJZFB-BuPIm1AB.js} +1 -1
- package/ui-dist/assets/{diagram-FQU43EPY-CdC2pj_S.js → diagram-FQU43EPY-DTBCuV0W.js} +1 -1
- package/ui-dist/assets/{diagram-G47NLZAW-sEOwPe0_.js → diagram-G47NLZAW-B4CK8uR2.js} +1 -1
- package/ui-dist/assets/{diagram-NH7WQ7WH-CwoTfWmv.js → diagram-NH7WQ7WH-BkbS0GkL.js} +1 -1
- package/ui-dist/assets/{diagram-OA4YK3LP-Cksc-JQa.js → diagram-OA4YK3LP-C_mkRe0c.js} +1 -1
- package/ui-dist/assets/{diagram-WEI45ONY-1lHRkCse.js → diagram-WEI45ONY-CHUb3TIJ.js} +1 -1
- package/ui-dist/assets/{ebnfDiagram-CCIWWBDH-BJ6dNjJ2.js → ebnfDiagram-CCIWWBDH-D_lN4ZOY.js} +1 -1
- package/ui-dist/assets/{erDiagram-Q63AITRT-DVTmCmE1.js → erDiagram-Q63AITRT-CRnDqcsy.js} +1 -1
- package/ui-dist/assets/{flowDiagram-23GEKE2U-B2A6w103.js → flowDiagram-23GEKE2U-ChELY-8y.js} +1 -1
- package/ui-dist/assets/{ganttDiagram-NO4QXBWP-BoqdQOBD.js → ganttDiagram-NO4QXBWP-QIML25-M.js} +1 -1
- package/ui-dist/assets/{gitGraphDiagram-IHSO6WYX-BPWVpzXj.js → gitGraphDiagram-IHSO6WYX-TB_AKH8l.js} +1 -1
- package/ui-dist/assets/{graph-W8QGT1XQ.js → graph-HKPvyYQ1.js} +1 -1
- package/ui-dist/assets/{index-DTqh4VW9.js → index-Ar0zIwom.js} +1 -1
- package/ui-dist/assets/{index-UkFXcg--.js → index-BeNxgoKd.js} +1 -1
- package/ui-dist/assets/{index-CRe48ije.js → index-CB-UdrKN.js} +1 -1
- package/ui-dist/assets/{index-C8VKPswh.js → index-CfpFS1Tl.js} +573 -588
- package/ui-dist/assets/{index-BYt_CWxk.js → index-CjIeIR2m.js} +1 -1
- package/ui-dist/assets/{index-DFhr5xg9.js → index-DCgbySwf.js} +1 -1
- package/ui-dist/assets/{index-BT3SfQnV.js → index-DDMaBNLI.js} +1 -1
- package/ui-dist/assets/{index-96_7QHQ5.js → index-DSZmO4bA.js} +1 -1
- package/ui-dist/assets/{index-D5okPECv.js → index-DfzFi2fx.js} +1 -1
- package/ui-dist/assets/{index-CG59QbM3.js → index-DmEf_U5I.js} +1 -1
- package/ui-dist/assets/{index-CaNgMg06.js → index-OfGDMJiA.js} +1 -1
- package/ui-dist/assets/{index-CrOrmmHY.js → index-ZzX8P4M5.js} +1 -1
- package/ui-dist/assets/{index-9ogi82-q.js → index-fDtlbG8Y.js} +1 -1
- package/ui-dist/assets/{index-Cjq0R1QI.js → index-gdvFtffQ.js} +1 -1
- package/ui-dist/assets/index-noipz8bE.css +1 -0
- package/ui-dist/assets/{index-CjRwrGKt.js → index-rnOTiIXd.js} +1 -1
- package/ui-dist/assets/{infoDiagram-FWYZ7A6U-CGKM1qd0.js → infoDiagram-FWYZ7A6U-DUR3sDTd.js} +1 -1
- package/ui-dist/assets/{ishikawaDiagram-FXEZZL3T-BMINXmgJ.js → ishikawaDiagram-FXEZZL3T-CcnYT0s0.js} +1 -1
- package/ui-dist/assets/{journeyDiagram-5HDEW3XC-lLpvO5ye.js → journeyDiagram-5HDEW3XC-CqfbG8T1.js} +1 -1
- package/ui-dist/assets/{kanban-definition-HUTT4EX6-B1o_jb4m.js → kanban-definition-HUTT4EX6-CYwQM9eR.js} +1 -1
- package/ui-dist/assets/{layout-CfhTVz4J.js → layout-B2IlJgLE.js} +1 -1
- package/ui-dist/assets/{linear-Cyfw5mer.js → linear-CcEPcfbO.js} +1 -1
- package/ui-dist/assets/{map-BJC9PnTS.js → map-Bmhfvlpu.js} +1 -1
- package/ui-dist/assets/{mermaid.core-FscMPm7s.js → mermaid.core-T9Q0CuQx.js} +4 -4
- package/ui-dist/assets/{mindmap-definition-LN4V7U3C-DRgxKOO8.js → mindmap-definition-LN4V7U3C-CRjQlwN4.js} +1 -1
- package/ui-dist/assets/{pegDiagram-2B236MQR-Dvz4qHu-.js → pegDiagram-2B236MQR-DenccdY8.js} +1 -1
- package/ui-dist/assets/{pieDiagram-ENE6RG2P-Dk2JI7ZR.js → pieDiagram-ENE6RG2P-CPiTrJcY.js} +1 -1
- package/ui-dist/assets/{quadrantDiagram-ABIIQ3AL-rDcmmQtb.js → quadrantDiagram-ABIIQ3AL-fKbvGl_-.js} +1 -1
- package/ui-dist/assets/{railroadDiagram-RFXS5EU6-DuGw7Ver.js → railroadDiagram-RFXS5EU6-D6uOjEmA.js} +1 -1
- package/ui-dist/assets/{requirementDiagram-TGXJPOKE-B9FO6PRO.js → requirementDiagram-TGXJPOKE-CQIQ387O.js} +1 -1
- package/ui-dist/assets/{sankeyDiagram-HTMAVEWB-Dvy9IKWr.js → sankeyDiagram-HTMAVEWB-CKrnONJL.js} +1 -1
- package/ui-dist/assets/{sequenceDiagram-DBY2YBRQ-BMNm3icE.js → sequenceDiagram-DBY2YBRQ-C3vaOiZO.js} +1 -1
- package/ui-dist/assets/{sizeCapture-X5ZJPWSS-D9g2vtWC.js → sizeCapture-X5ZJPWSS-F39EvxY0.js} +1 -1
- package/ui-dist/assets/{stateDiagram-2N3HPSRC-kQ3-sJWr.js → stateDiagram-2N3HPSRC-Bq2sVFQq.js} +1 -1
- package/ui-dist/assets/stateDiagram-v2-6OUMAXLB-B94IPtHC.js +1 -0
- package/ui-dist/assets/{swimlanes-5IMT3BWC-Cx_ksQRH.js → swimlanes-5IMT3BWC-CSrygB7m.js} +2 -2
- package/ui-dist/assets/swimlanesDiagram-G3AALYLV-9WQr2_E9.js +8 -0
- package/ui-dist/assets/{timeline-definition-FHXFAJF6-CyArjIWu.js → timeline-definition-FHXFAJF6-DSMMlntv.js} +1 -1
- package/ui-dist/assets/{vennDiagram-L72KCM5P-Bjdg_skC.js → vennDiagram-L72KCM5P-D5XH96zV.js} +1 -1
- package/ui-dist/assets/{wardleyDiagram-EHGQE667-BLV-S7cE.js → wardleyDiagram-EHGQE667-BXX2RFsU.js} +1 -1
- package/ui-dist/assets/{xychartDiagram-FW5EYKEG-BTtly2sn.js → xychartDiagram-FW5EYKEG-awBW2lwG.js} +1 -1
- package/ui-dist/index.html +2 -2
- package/dist/bootstrap/plugin-host-runtime.d.ts +0 -116
- package/dist/bootstrap/plugin-host-runtime.d.ts.map +0 -1
- package/dist/bootstrap/plugin-host-runtime.js +0 -179
- package/dist/bootstrap/plugin-host-runtime.js.map +0 -1
- package/dist/bundled-plugins/plugin-linear/README.md +0 -22
- package/dist/bundled-plugins/plugin-linear/dist/manifest.js +0 -183
- package/dist/bundled-plugins/plugin-linear/dist/manifest.js.map +0 -7
- package/dist/bundled-plugins/plugin-linear/dist/ui/index.js +0 -1285
- package/dist/bundled-plugins/plugin-linear/dist/ui/index.js.map +0 -7
- package/dist/bundled-plugins/plugin-linear/dist/worker.js +0 -10430
- package/dist/bundled-plugins/plugin-linear/dist/worker.js.map +0 -7
- package/dist/bundled-plugins/plugin-linear/package.json +0 -42
- package/dist/routes/plugin-ui-static.d.ts +0 -70
- package/dist/routes/plugin-ui-static.d.ts.map +0 -1
- package/dist/routes/plugin-ui-static.js +0 -375
- package/dist/routes/plugin-ui-static.js.map +0 -1
- package/dist/routes/plugins.d.ts +0 -120
- package/dist/routes/plugins.d.ts.map +0 -1
- package/dist/routes/plugins.js +0 -1125
- package/dist/routes/plugins.js.map +0 -1
- package/dist/routes/plugins.operations-routes.d.ts +0 -28
- package/dist/routes/plugins.operations-routes.d.ts.map +0 -1
- package/dist/routes/plugins.operations-routes.js +0 -720
- package/dist/routes/plugins.operations-routes.js.map +0 -1
- package/dist/services/issue-goal-fallback.d.ts +0 -15
- package/dist/services/issue-goal-fallback.d.ts.map +0 -1
- package/dist/services/issue-goal-fallback.js +0 -27
- package/dist/services/issue-goal-fallback.js.map +0 -1
- package/dist/services/plugin-capability-validator.d.ts +0 -108
- package/dist/services/plugin-capability-validator.d.ts.map +0 -1
- package/dist/services/plugin-capability-validator.js +0 -268
- package/dist/services/plugin-capability-validator.js.map +0 -1
- package/dist/services/plugin-config-validator.d.ts +0 -26
- package/dist/services/plugin-config-validator.d.ts.map +0 -1
- package/dist/services/plugin-config-validator.js +0 -41
- package/dist/services/plugin-config-validator.js.map +0 -1
- package/dist/services/plugin-dev-watcher.d.ts +0 -47
- package/dist/services/plugin-dev-watcher.d.ts.map +0 -1
- package/dist/services/plugin-dev-watcher.js +0 -275
- package/dist/services/plugin-dev-watcher.js.map +0 -1
- package/dist/services/plugin-event-bus.d.ts +0 -149
- package/dist/services/plugin-event-bus.d.ts.map +0 -1
- package/dist/services/plugin-event-bus.js +0 -258
- package/dist/services/plugin-event-bus.js.map +0 -1
- package/dist/services/plugin-host-service-cleanup.d.ts +0 -14
- package/dist/services/plugin-host-service-cleanup.d.ts.map +0 -1
- package/dist/services/plugin-host-service-cleanup.js +0 -37
- package/dist/services/plugin-host-service-cleanup.js.map +0 -1
- package/dist/services/plugin-host-services.d.ts +0 -13
- package/dist/services/plugin-host-services.d.ts.map +0 -1
- package/dist/services/plugin-host-services.js +0 -935
- package/dist/services/plugin-host-services.js.map +0 -1
- package/dist/services/plugin-job-coordinator.d.ts +0 -81
- package/dist/services/plugin-job-coordinator.d.ts.map +0 -1
- package/dist/services/plugin-job-coordinator.js +0 -172
- package/dist/services/plugin-job-coordinator.js.map +0 -1
- package/dist/services/plugin-job-scheduler.d.ts +0 -163
- package/dist/services/plugin-job-scheduler.d.ts.map +0 -1
- package/dist/services/plugin-job-scheduler.js +0 -452
- package/dist/services/plugin-job-scheduler.js.map +0 -1
- package/dist/services/plugin-job-store.d.ts +0 -208
- package/dist/services/plugin-job-store.d.ts.map +0 -1
- package/dist/services/plugin-job-store.js +0 -350
- package/dist/services/plugin-job-store.js.map +0 -1
- package/dist/services/plugin-lifecycle.d.ts +0 -240
- package/dist/services/plugin-lifecycle.d.ts.map +0 -1
- package/dist/services/plugin-lifecycle.js +0 -439
- package/dist/services/plugin-lifecycle.js.map +0 -1
- package/dist/services/plugin-loader.core.d.ts +0 -40
- package/dist/services/plugin-loader.core.d.ts.map +0 -1
- package/dist/services/plugin-loader.core.js +0 -879
- package/dist/services/plugin-loader.core.js.map +0 -1
- package/dist/services/plugin-loader.d.ts +0 -30
- package/dist/services/plugin-loader.d.ts.map +0 -1
- package/dist/services/plugin-loader.helpers.d.ts +0 -495
- package/dist/services/plugin-loader.helpers.d.ts.map +0 -1
- package/dist/services/plugin-loader.helpers.js +0 -238
- package/dist/services/plugin-loader.helpers.js.map +0 -1
- package/dist/services/plugin-loader.js +0 -30
- package/dist/services/plugin-loader.js.map +0 -1
- package/dist/services/plugin-loader.worker-paths.d.ts +0 -37
- package/dist/services/plugin-loader.worker-paths.d.ts.map +0 -1
- package/dist/services/plugin-loader.worker-paths.js +0 -62
- package/dist/services/plugin-loader.worker-paths.js.map +0 -1
- package/dist/services/plugin-log-retention.d.ts +0 -20
- package/dist/services/plugin-log-retention.d.ts.map +0 -1
- package/dist/services/plugin-log-retention.js +0 -63
- package/dist/services/plugin-log-retention.js.map +0 -1
- package/dist/services/plugin-manifest-validator.d.ts +0 -90
- package/dist/services/plugin-manifest-validator.d.ts.map +0 -1
- package/dist/services/plugin-manifest-validator.js +0 -72
- package/dist/services/plugin-manifest-validator.js.map +0 -1
- package/dist/services/plugin-registry.d.ts +0 -2542
- package/dist/services/plugin-registry.d.ts.map +0 -1
- package/dist/services/plugin-registry.js +0 -536
- package/dist/services/plugin-registry.js.map +0 -1
- package/dist/services/plugin-runtime-sandbox.d.ts +0 -40
- package/dist/services/plugin-runtime-sandbox.d.ts.map +0 -1
- package/dist/services/plugin-runtime-sandbox.js +0 -154
- package/dist/services/plugin-runtime-sandbox.js.map +0 -1
- package/dist/services/plugin-secrets-handler.d.ts +0 -81
- package/dist/services/plugin-secrets-handler.d.ts.map +0 -1
- package/dist/services/plugin-secrets-handler.js +0 -275
- package/dist/services/plugin-secrets-handler.js.map +0 -1
- package/dist/services/plugin-state-store.d.ts +0 -92
- package/dist/services/plugin-state-store.d.ts.map +0 -1
- package/dist/services/plugin-state-store.js +0 -190
- package/dist/services/plugin-state-store.js.map +0 -1
- package/dist/services/plugin-stream-bus.d.ts +0 -29
- package/dist/services/plugin-stream-bus.d.ts.map +0 -1
- package/dist/services/plugin-stream-bus.js +0 -48
- package/dist/services/plugin-stream-bus.js.map +0 -1
- package/dist/services/plugin-tool-dispatcher.d.ts +0 -180
- package/dist/services/plugin-tool-dispatcher.d.ts.map +0 -1
- package/dist/services/plugin-tool-dispatcher.js +0 -224
- package/dist/services/plugin-tool-dispatcher.js.map +0 -1
- package/dist/services/plugin-tool-registry.d.ts +0 -192
- package/dist/services/plugin-tool-registry.d.ts.map +0 -1
- package/dist/services/plugin-tool-registry.js +0 -224
- package/dist/services/plugin-tool-registry.js.map +0 -1
- package/dist/services/plugin-worker-manager.d.ts +0 -260
- package/dist/services/plugin-worker-manager.d.ts.map +0 -1
- package/dist/services/plugin-worker-manager.js +0 -836
- package/dist/services/plugin-worker-manager.js.map +0 -1
- package/ui-dist/assets/channel-Bmzlyjow.js +0 -1
- package/ui-dist/assets/classDiagram-OUVF2IWQ-VR7MKiEz.js +0 -1
- package/ui-dist/assets/classDiagram-v2-EOCWNBFH-VR7MKiEz.js +0 -1
- package/ui-dist/assets/index-CxPYXL3t.css +0 -1
- package/ui-dist/assets/stateDiagram-v2-6OUMAXLB-BYK8scZh.js +0 -1
- package/ui-dist/assets/swimlanesDiagram-G3AALYLV-irU0aSS8.js +0 -8
|
@@ -8,7 +8,9 @@ import { killChildProcessTree, parseObject } from "../../agent-runtimes/utils.js
|
|
|
8
8
|
import { notFound } from "../../errors.js";
|
|
9
9
|
import { redactCurrentUserText, redactCurrentUserValue } from "../../log-redaction.js";
|
|
10
10
|
import { logger } from "../../middleware/logger.js";
|
|
11
|
+
import { agentIssueCreationService, getAgentIssueCreationRequestIdFromRunContext, } from "../agent-issue-creation.js";
|
|
11
12
|
import { agentRunContextService } from "../agent-run-context.js";
|
|
13
|
+
import { approvalService } from "../approvals.js";
|
|
12
14
|
import { publishAutomationRunOutputToChat } from "../automation-chat-output.js";
|
|
13
15
|
import { budgetService } from "../budgets.js";
|
|
14
16
|
import { costService } from "../costs.js";
|
|
@@ -31,7 +33,7 @@ import { createHeartbeatExecuteHandlers } from "./heartbeat.execute.js";
|
|
|
31
33
|
import { createHeartbeatMiscHandlers } from "./heartbeat.misc.js";
|
|
32
34
|
import { createHeartbeatRecoveryHandlers } from "./heartbeat.recovery.js";
|
|
33
35
|
import { createHeartbeatReleaseHandlers } from "./heartbeat.release.js";
|
|
34
|
-
import { checkpointHeartbeatRunTerminalEffect, claimExpiredHeartbeatRunExecution, claimHeartbeatRunTerminalEffects, completeHeartbeatRunTerminalEffects, failHeartbeatRunTerminalEffect, markHeartbeatRunProcessExited, reconcileHeartbeatRunEvidence, reconcileHeartbeatRunTerminalEffectsIntent, releaseHeartbeatRunTerminalEffectsClaim, renewHeartbeatRunExecutionLease, renewHeartbeatRunTerminalEffectsClaim, RUN_EXECUTION_LEASE_MS, setWakeupStatusMonotonic, terminalEffectNames, transitionHeartbeatRunToTerminal, } from "./heartbeat.terminal.js";
|
|
36
|
+
import { checkpointHeartbeatRunTerminalEffect, claimExpiredHeartbeatRunExecution, claimHeartbeatRunTerminalEffects, completeHeartbeatRunTerminalEffects, failHeartbeatRunTerminalEffect, markHeartbeatRunProcessExited, reconcileHeartbeatRunEvidence, reconcileHeartbeatRunTerminalEffectsIntent, releaseHeartbeatRunTerminalEffectsClaim, renewHeartbeatRunExecutionLease, renewHeartbeatRunTerminalEffectsClaim, RUN_EXECUTION_LEASE_MS, RUN_EXECUTION_LEASE_RENEW_INTERVAL_MS, setWakeupStatusMonotonic, terminalEffectNames, transitionHeartbeatRunToTerminal, } from "./heartbeat.terminal.js";
|
|
35
37
|
import { createHeartbeatWakeupHandlers } from "./heartbeat.wakeup.js";
|
|
36
38
|
const DEFAULT_HEARTBEAT_RUN_TIMEOUT_MS = 12 * 60 * 60 * 1000;
|
|
37
39
|
const DEFAULT_HEARTBEAT_RUN_INACTIVITY_TIMEOUT_MS = 30 * 60 * 1000;
|
|
@@ -41,6 +43,49 @@ const TERMINAL_EFFECT_CLAIM_RENEW_INTERVAL_MS = 60_000;
|
|
|
41
43
|
// server process.
|
|
42
44
|
const activeRunExecutions = new Set();
|
|
43
45
|
const runAbortControllers = new Map();
|
|
46
|
+
const localExecutionLeaseStates = new Map();
|
|
47
|
+
const LOCAL_EXECUTION_SLEEP_GAP_MS = RUN_EXECUTION_LEASE_RENEW_INTERVAL_MS * 2;
|
|
48
|
+
const heartbeatRecoveryTails = new WeakMap();
|
|
49
|
+
function getLocalExecutionLeaseState(runId, nowMs) {
|
|
50
|
+
const existing = localExecutionLeaseStates.get(runId);
|
|
51
|
+
if (existing)
|
|
52
|
+
return existing;
|
|
53
|
+
const state = {
|
|
54
|
+
executionOwnerToken: null,
|
|
55
|
+
lastRenewedAtMs: nowMs,
|
|
56
|
+
sleepRecoveryUsed: false,
|
|
57
|
+
sleepRecoveryPending: false,
|
|
58
|
+
sleepRecoveryGraceUntilMs: null,
|
|
59
|
+
};
|
|
60
|
+
localExecutionLeaseStates.set(runId, state);
|
|
61
|
+
return state;
|
|
62
|
+
}
|
|
63
|
+
function localExecutionOwnerMatches(runId, ownerToken) {
|
|
64
|
+
const state = localExecutionLeaseStates.get(runId);
|
|
65
|
+
return !state || state.executionOwnerToken === null || state.executionOwnerToken === ownerToken;
|
|
66
|
+
}
|
|
67
|
+
function observeLocalExecutionLease(runId, now) {
|
|
68
|
+
const nowMs = now.getTime();
|
|
69
|
+
const existing = localExecutionLeaseStates.get(runId);
|
|
70
|
+
const state = getLocalExecutionLeaseState(runId, nowMs);
|
|
71
|
+
const sleepRecoveryDetected = Boolean(existing
|
|
72
|
+
&& nowMs > existing.lastRenewedAtMs
|
|
73
|
+
&& nowMs - existing.lastRenewedAtMs > LOCAL_EXECUTION_SLEEP_GAP_MS
|
|
74
|
+
&& !state.sleepRecoveryUsed);
|
|
75
|
+
if (sleepRecoveryDetected) {
|
|
76
|
+
state.sleepRecoveryUsed = true;
|
|
77
|
+
state.sleepRecoveryPending = true;
|
|
78
|
+
}
|
|
79
|
+
state.lastRenewedAtMs = nowMs;
|
|
80
|
+
return sleepRecoveryDetected;
|
|
81
|
+
}
|
|
82
|
+
function pruneLocalExecutionLeaseStates() {
|
|
83
|
+
for (const runId of localExecutionLeaseStates.keys()) {
|
|
84
|
+
if (!activeRunExecutions.has(runId) && !runningProcesses.has(runId)) {
|
|
85
|
+
localExecutionLeaseStates.delete(runId);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
44
89
|
function formatDurationMs(ms) {
|
|
45
90
|
const totalSeconds = Math.max(0, Math.round(ms / 1000));
|
|
46
91
|
const hours = Math.floor(totalSeconds / 3600);
|
|
@@ -59,7 +104,9 @@ export function heartbeatService(db, testHooks) {
|
|
|
59
104
|
});
|
|
60
105
|
const runLogStore = getRunLogStore();
|
|
61
106
|
const runContextSvc = agentRunContextService(db);
|
|
107
|
+
const approvalsSvc = approvalService(db);
|
|
62
108
|
const issuesSvc = issueService(db);
|
|
109
|
+
const agentIssueCreationSvc = agentIssueCreationService(db);
|
|
63
110
|
const executionWorkspacesSvc = runWorkspaceService(db);
|
|
64
111
|
const workspaceOperationsSvc = workspaceOperationService(db);
|
|
65
112
|
const budgetHooks = {
|
|
@@ -448,6 +495,44 @@ export function heartbeatService(db, testHooks) {
|
|
|
448
495
|
return updated;
|
|
449
496
|
}
|
|
450
497
|
async function transitionRunToTerminal(runId, status, patch, opts) {
|
|
498
|
+
const runBeforeTerminal = await getRun(runId);
|
|
499
|
+
const agentIssueCreationSettlement = runBeforeTerminal
|
|
500
|
+
? await (async () => {
|
|
501
|
+
const contextRequestId = getAgentIssueCreationRequestIdFromRunContext(runBeforeTerminal.contextSnapshot);
|
|
502
|
+
if (contextRequestId) {
|
|
503
|
+
return {
|
|
504
|
+
orgId: runBeforeTerminal.orgId,
|
|
505
|
+
agentId: runBeforeTerminal.agentId,
|
|
506
|
+
runId: runBeforeTerminal.id,
|
|
507
|
+
requestId: contextRequestId,
|
|
508
|
+
};
|
|
509
|
+
}
|
|
510
|
+
return await agentIssueCreationSvc
|
|
511
|
+
.getSettlementIntentForRun(runBeforeTerminal.orgId, runBeforeTerminal.agentId, runBeforeTerminal.id)
|
|
512
|
+
.catch((error) => {
|
|
513
|
+
logger.warn({ err: error, runId }, "failed to resolve Agent Issue creation settlement terminal effect");
|
|
514
|
+
return null;
|
|
515
|
+
});
|
|
516
|
+
})()
|
|
517
|
+
: null;
|
|
518
|
+
const agentIssueCreationNotification = runBeforeTerminal
|
|
519
|
+
? await agentIssueCreationSvc
|
|
520
|
+
.getNotificationIntentForRun(runBeforeTerminal.orgId, runBeforeTerminal.agentId, runId)
|
|
521
|
+
.catch((error) => {
|
|
522
|
+
logger.warn({ err: error, runId }, "failed to resolve Agent Issue creation notification terminal effect");
|
|
523
|
+
return null;
|
|
524
|
+
})
|
|
525
|
+
: null;
|
|
526
|
+
const terminalEffectsIntent = {
|
|
527
|
+
version: 1,
|
|
528
|
+
...(opts?.terminalEffectsIntent ?? {}),
|
|
529
|
+
...(agentIssueCreationSettlement
|
|
530
|
+
? { agentIssueCreationSettlement }
|
|
531
|
+
: {}),
|
|
532
|
+
...(agentIssueCreationNotification
|
|
533
|
+
? { agentIssueCreationNotification }
|
|
534
|
+
: {}),
|
|
535
|
+
};
|
|
451
536
|
const updated = await transitionHeartbeatRunToTerminal(db, {
|
|
452
537
|
runId,
|
|
453
538
|
status,
|
|
@@ -455,12 +540,43 @@ export function heartbeatService(db, testHooks) {
|
|
|
455
540
|
expectedStatuses: opts?.expectedStatuses,
|
|
456
541
|
activityWatermark: opts?.activityWatermark,
|
|
457
542
|
terminalEffectsPending: opts?.terminalEffectsPending,
|
|
458
|
-
terminalEffectsIntent
|
|
543
|
+
terminalEffectsIntent,
|
|
459
544
|
processExitedAt: opts?.processExitedAt,
|
|
460
545
|
expectedExecutionOwnerToken: opts?.expectedExecutionOwnerToken,
|
|
461
546
|
});
|
|
462
|
-
if (updated)
|
|
547
|
+
if (updated) {
|
|
463
548
|
publishRunStatus(updated);
|
|
549
|
+
const context = parseObject(updated.contextSnapshot);
|
|
550
|
+
const requestId = agentIssueCreationSettlement?.requestId
|
|
551
|
+
?? getAgentIssueCreationRequestIdFromRunContext(context);
|
|
552
|
+
if (requestId) {
|
|
553
|
+
const settledRequest = await agentIssueCreationSvc.settleForRun({
|
|
554
|
+
orgId: updated.orgId,
|
|
555
|
+
agentId: updated.agentId,
|
|
556
|
+
runId: updated.id,
|
|
557
|
+
requestId,
|
|
558
|
+
runStatus: updated.status,
|
|
559
|
+
error: updated.error,
|
|
560
|
+
}).catch((error) => {
|
|
561
|
+
logger.warn({ err: error, orgId: updated.orgId, agentId: updated.agentId, runId: updated.id, requestId }, "failed to settle Agent Issue creation request after run termination");
|
|
562
|
+
return null;
|
|
563
|
+
});
|
|
564
|
+
if (settledRequest?.status === "succeeded" && settledRequest.createdIssueId) {
|
|
565
|
+
await reconcileTerminalEffectsIntent(updated.id, {
|
|
566
|
+
version: 1,
|
|
567
|
+
agentIssueCreationNotification: {
|
|
568
|
+
orgId: updated.orgId,
|
|
569
|
+
agentId: updated.agentId,
|
|
570
|
+
runId: updated.id,
|
|
571
|
+
requestId: settledRequest.id,
|
|
572
|
+
issueId: settledRequest.createdIssueId,
|
|
573
|
+
},
|
|
574
|
+
}).catch((error) => {
|
|
575
|
+
logger.warn({ err: error, orgId: updated.orgId, agentId: updated.agentId, runId: updated.id, requestId }, "failed to record Agent Issue creation notification terminal effect");
|
|
576
|
+
});
|
|
577
|
+
}
|
|
578
|
+
}
|
|
579
|
+
}
|
|
464
580
|
return updated;
|
|
465
581
|
}
|
|
466
582
|
async function reconcileRunEvidence(runId, patch) {
|
|
@@ -590,8 +706,105 @@ export function heartbeatService(db, testHooks) {
|
|
|
590
706
|
async function acknowledgeRunProcessExit(runId) {
|
|
591
707
|
return markHeartbeatRunProcessExited(db, runId);
|
|
592
708
|
}
|
|
593
|
-
|
|
594
|
-
|
|
709
|
+
function abortRunExecution(runId) {
|
|
710
|
+
const controller = runAbortControllers.get(runId);
|
|
711
|
+
if (controller) {
|
|
712
|
+
controller.abort();
|
|
713
|
+
return;
|
|
714
|
+
}
|
|
715
|
+
const tracked = runningProcesses.get(runId);
|
|
716
|
+
if (tracked)
|
|
717
|
+
killChildProcessTree(tracked.child, false);
|
|
718
|
+
}
|
|
719
|
+
async function renewRunExecutionLease(runId, ownerToken, now = new Date(), opts) {
|
|
720
|
+
await testHooks?.beforeRunExecutionLeaseRenewal?.({ runId, ownerToken });
|
|
721
|
+
const knownState = localExecutionLeaseStates.get(runId);
|
|
722
|
+
if (knownState && knownState.executionOwnerToken !== null && knownState.executionOwnerToken !== ownerToken) {
|
|
723
|
+
knownState.sleepRecoveryPending = false;
|
|
724
|
+
return null;
|
|
725
|
+
}
|
|
726
|
+
const sleepRecoveryDetected = opts?.observeSleep !== false
|
|
727
|
+
? observeLocalExecutionLease(runId, now)
|
|
728
|
+
: false;
|
|
729
|
+
const state = localExecutionLeaseStates.get(runId);
|
|
730
|
+
if (state && state.executionOwnerToken === null) {
|
|
731
|
+
state.executionOwnerToken = ownerToken;
|
|
732
|
+
}
|
|
733
|
+
if (state && state.executionOwnerToken !== ownerToken) {
|
|
734
|
+
state.sleepRecoveryPending = false;
|
|
735
|
+
return null;
|
|
736
|
+
}
|
|
737
|
+
const renewed = await renewHeartbeatRunExecutionLease(db, runId, ownerToken, now, {
|
|
738
|
+
touchActivity: opts?.touchActivity || sleepRecoveryDetected,
|
|
739
|
+
});
|
|
740
|
+
if (!renewed) {
|
|
741
|
+
if (state)
|
|
742
|
+
state.sleepRecoveryPending = false;
|
|
743
|
+
}
|
|
744
|
+
return renewed;
|
|
745
|
+
}
|
|
746
|
+
async function preserveLiveExecutionAfterSleep(run, now) {
|
|
747
|
+
if (!activeRunExecutions.has(run.id) && !runningProcesses.has(run.id))
|
|
748
|
+
return false;
|
|
749
|
+
if (!localExecutionOwnerMatches(run.id, run.executionOwnerToken)) {
|
|
750
|
+
abortRunExecution(run.id);
|
|
751
|
+
return true;
|
|
752
|
+
}
|
|
753
|
+
if (!run.executionOwnerToken || !run.executionLeaseExpiresAt)
|
|
754
|
+
return false;
|
|
755
|
+
observeLocalExecutionLease(run.id, now);
|
|
756
|
+
const state = localExecutionLeaseStates.get(run.id);
|
|
757
|
+
if (state && state.executionOwnerToken === null) {
|
|
758
|
+
state.executionOwnerToken = run.executionOwnerToken;
|
|
759
|
+
}
|
|
760
|
+
const nowMs = now.getTime();
|
|
761
|
+
if (state
|
|
762
|
+
&& state.sleepRecoveryGraceUntilMs !== null
|
|
763
|
+
&& nowMs < state.sleepRecoveryGraceUntilMs) {
|
|
764
|
+
return true;
|
|
765
|
+
}
|
|
766
|
+
const wakeGracePending = state?.sleepRecoveryPending === true;
|
|
767
|
+
if (wakeGracePending) {
|
|
768
|
+
state.sleepRecoveryPending = false;
|
|
769
|
+
}
|
|
770
|
+
else if (new Date(run.executionLeaseExpiresAt).getTime() > now.getTime()) {
|
|
771
|
+
return false;
|
|
772
|
+
}
|
|
773
|
+
else if (state?.sleepRecoveryUsed) {
|
|
774
|
+
return false;
|
|
775
|
+
}
|
|
776
|
+
else if (state) {
|
|
777
|
+
state.sleepRecoveryUsed = true;
|
|
778
|
+
}
|
|
779
|
+
const renewed = await renewRunExecutionLease(run.id, run.executionOwnerToken, now, {
|
|
780
|
+
observeSleep: false,
|
|
781
|
+
touchActivity: true,
|
|
782
|
+
});
|
|
783
|
+
if (!renewed) {
|
|
784
|
+
abortRunExecution(run.id);
|
|
785
|
+
}
|
|
786
|
+
else if (state) {
|
|
787
|
+
state.sleepRecoveryGraceUntilMs = nowMs + RUN_EXECUTION_LEASE_RENEW_INTERVAL_MS;
|
|
788
|
+
}
|
|
789
|
+
return true;
|
|
790
|
+
}
|
|
791
|
+
async function withHeartbeatRecoveryLock(task) {
|
|
792
|
+
const dbKey = db;
|
|
793
|
+
const previous = heartbeatRecoveryTails.get(dbKey) ?? Promise.resolve();
|
|
794
|
+
let release;
|
|
795
|
+
const current = new Promise((resolve) => {
|
|
796
|
+
release = resolve;
|
|
797
|
+
});
|
|
798
|
+
heartbeatRecoveryTails.set(dbKey, current);
|
|
799
|
+
await previous;
|
|
800
|
+
try {
|
|
801
|
+
return await task();
|
|
802
|
+
}
|
|
803
|
+
finally {
|
|
804
|
+
release();
|
|
805
|
+
if (heartbeatRecoveryTails.get(dbKey) === current)
|
|
806
|
+
heartbeatRecoveryTails.delete(dbKey);
|
|
807
|
+
}
|
|
595
808
|
}
|
|
596
809
|
async function countRunningRunsForAgent(agentId, excludeRunId) {
|
|
597
810
|
const pendingExecutionIds = [...activeRunExecutions].filter((runId) => runId !== excludeRunId);
|
|
@@ -836,126 +1049,152 @@ export function heartbeatService(db, testHooks) {
|
|
|
836
1049
|
});
|
|
837
1050
|
}
|
|
838
1051
|
}
|
|
839
|
-
async function
|
|
1052
|
+
async function reapOrphanedRunsLocked(opts) {
|
|
1053
|
+
pruneLocalExecutionLeaseStates();
|
|
840
1054
|
const staleThresholdMs = opts?.staleThresholdMs ?? 0;
|
|
841
1055
|
const now = opts?.now ?? new Date();
|
|
842
1056
|
const recoveryCutoff = opts?.recoveryCutoff ?? now;
|
|
843
|
-
// Find all runs stuck in "running" state (queued runs are legitimately waiting; resumeQueuedRuns handles them)
|
|
844
|
-
const activeRuns = await db
|
|
845
|
-
.select({
|
|
846
|
-
run: heartbeatRuns,
|
|
847
|
-
agentRuntimeType: agents.agentRuntimeType,
|
|
848
|
-
})
|
|
849
|
-
.from(heartbeatRuns)
|
|
850
|
-
.innerJoin(agents, eq(heartbeatRuns.agentId, agents.id))
|
|
851
|
-
.where(or(eq(heartbeatRuns.status, "running"), eq(heartbeatRuns.terminalEffectsPending, true)));
|
|
852
1057
|
const reaped = [];
|
|
853
|
-
|
|
854
|
-
|
|
855
|
-
|
|
856
|
-
|
|
857
|
-
|
|
1058
|
+
try {
|
|
1059
|
+
// Find all runs stuck in "running" state (queued runs are legitimately waiting; resumeQueuedRuns handles them)
|
|
1060
|
+
const activeRuns = await db
|
|
1061
|
+
.select({
|
|
1062
|
+
run: heartbeatRuns,
|
|
1063
|
+
agentRuntimeType: agents.agentRuntimeType,
|
|
1064
|
+
})
|
|
1065
|
+
.from(heartbeatRuns)
|
|
1066
|
+
.innerJoin(agents, eq(heartbeatRuns.agentId, agents.id))
|
|
1067
|
+
.where(or(eq(heartbeatRuns.status, "running"), eq(heartbeatRuns.terminalEffectsPending, true)));
|
|
1068
|
+
for (const { run, agentRuntimeType } of activeRuns) {
|
|
1069
|
+
if (run.terminalEffectsPending) {
|
|
1070
|
+
if (!run.processExitedAt) {
|
|
1071
|
+
const exited = await terminateRunProcessAndWait(run, agentRuntimeType);
|
|
1072
|
+
if (!exited || activeRunExecutions.has(run.id))
|
|
1073
|
+
continue;
|
|
1074
|
+
await acknowledgeRunProcessExit(run.id);
|
|
1075
|
+
}
|
|
1076
|
+
const completed = await completeTerminalControlEffects(run);
|
|
1077
|
+
if (!completed)
|
|
1078
|
+
continue;
|
|
1079
|
+
reaped.push(run.id);
|
|
1080
|
+
continue;
|
|
1081
|
+
}
|
|
1082
|
+
// Apply staleness threshold to avoid false positives
|
|
1083
|
+
if (staleThresholdMs > 0) {
|
|
1084
|
+
const refTime = run.updatedAt ? new Date(run.updatedAt).getTime() : 0;
|
|
1085
|
+
if (now.getTime() - refTime < staleThresholdMs)
|
|
858
1086
|
continue;
|
|
859
|
-
await acknowledgeRunProcessExit(run.id);
|
|
860
1087
|
}
|
|
861
|
-
|
|
862
|
-
|
|
1088
|
+
// The lease timer pauses while the host sleeps, but the child process
|
|
1089
|
+
// and this server's execution registry can remain alive. Preserve that
|
|
1090
|
+
// local execution instead of turning it into a process-loss retry.
|
|
1091
|
+
if (activeRunExecutions.has(run.id) || runningProcesses.has(run.id)) {
|
|
1092
|
+
if (!localExecutionOwnerMatches(run.id, run.executionOwnerToken)) {
|
|
1093
|
+
abortRunExecution(run.id);
|
|
1094
|
+
continue;
|
|
1095
|
+
}
|
|
1096
|
+
if (run.executionOwnerToken) {
|
|
1097
|
+
const renewed = await renewRunExecutionLease(run.id, run.executionOwnerToken, now);
|
|
1098
|
+
if (!renewed)
|
|
1099
|
+
abortRunExecution(run.id);
|
|
1100
|
+
}
|
|
863
1101
|
continue;
|
|
864
|
-
|
|
865
|
-
|
|
866
|
-
|
|
867
|
-
// Apply staleness threshold to avoid false positives
|
|
868
|
-
if (staleThresholdMs > 0) {
|
|
869
|
-
const refTime = run.updatedAt ? new Date(run.updatedAt).getTime() : 0;
|
|
870
|
-
if (now.getTime() - refTime < staleThresholdMs)
|
|
1102
|
+
}
|
|
1103
|
+
const recoveryClaim = await claimExpiredHeartbeatRunExecution(db, run.id, { now, recoveryCutoff });
|
|
1104
|
+
if (!recoveryClaim)
|
|
871
1105
|
continue;
|
|
872
|
-
|
|
873
|
-
|
|
874
|
-
|
|
875
|
-
|
|
876
|
-
|
|
877
|
-
|
|
878
|
-
|
|
879
|
-
|
|
880
|
-
|
|
881
|
-
|
|
882
|
-
|
|
883
|
-
|
|
884
|
-
: `Lost in-memory process handle, but child pid ${claimedRun.processPid} is still alive`;
|
|
885
|
-
const detachedRun = await setRunStatus(claimedRun.id, "running", {
|
|
886
|
-
error: detachedMessage,
|
|
887
|
-
errorCode: DETACHED_PROCESS_ERROR_CODE,
|
|
888
|
-
});
|
|
889
|
-
if (detachedRun) {
|
|
890
|
-
await appendRunEvent(detachedRun, {
|
|
891
|
-
eventType: "lifecycle",
|
|
892
|
-
stream: "system",
|
|
893
|
-
level: "warn",
|
|
894
|
-
message: detachedMessage,
|
|
895
|
-
payload: {
|
|
896
|
-
processPid: claimedRun.processPid,
|
|
897
|
-
},
|
|
1106
|
+
const claimedRun = recoveryClaim.run;
|
|
1107
|
+
const tracksLocalChild = isTrackedLocalChildProcessAdapter(agentRuntimeType);
|
|
1108
|
+
let detachedTerminationMessage = null;
|
|
1109
|
+
if (!claimedRun.processExitedAt && tracksLocalChild && claimedRun.processPid && isProcessAlive(claimedRun.processPid)) {
|
|
1110
|
+
const termination = await terminateOrphanedProcess(claimedRun.processPid);
|
|
1111
|
+
if (termination.stillAlive) {
|
|
1112
|
+
const detachedMessage = termination.error
|
|
1113
|
+
? `Lost in-memory process handle, child pid ${claimedRun.processPid} is still alive, and Rudder could not terminate it: ${termination.error}`
|
|
1114
|
+
: `Lost in-memory process handle, but child pid ${claimedRun.processPid} is still alive`;
|
|
1115
|
+
const detachedRun = await setRunStatus(claimedRun.id, "running", {
|
|
1116
|
+
error: detachedMessage,
|
|
1117
|
+
errorCode: DETACHED_PROCESS_ERROR_CODE,
|
|
898
1118
|
});
|
|
1119
|
+
if (detachedRun) {
|
|
1120
|
+
await appendRunEvent(detachedRun, {
|
|
1121
|
+
eventType: "lifecycle",
|
|
1122
|
+
stream: "system",
|
|
1123
|
+
level: "warn",
|
|
1124
|
+
message: detachedMessage,
|
|
1125
|
+
payload: {
|
|
1126
|
+
processPid: claimedRun.processPid,
|
|
1127
|
+
},
|
|
1128
|
+
});
|
|
1129
|
+
}
|
|
1130
|
+
continue;
|
|
899
1131
|
}
|
|
1132
|
+
detachedTerminationMessage = termination.terminationSignal
|
|
1133
|
+
? `Terminated detached child pid ${claimedRun.processPid} with ${termination.terminationSignal} after Rudder lost its process handle`
|
|
1134
|
+
: `Detached child pid ${claimedRun.processPid} exited before Rudder could terminate it`;
|
|
1135
|
+
}
|
|
1136
|
+
const shouldRetry = tracksLocalChild && !!claimedRun.processPid && (claimedRun.processLossRetryCount ?? 0) < 1;
|
|
1137
|
+
const baseMessage = claimedRun.processPid
|
|
1138
|
+
? `Process lost -- child pid ${claimedRun.processPid} is no longer running`
|
|
1139
|
+
: "Process lost -- server may have restarted";
|
|
1140
|
+
let finalizedRun = await transitionRunToTerminal(claimedRun.id, "failed", {
|
|
1141
|
+
error: shouldRetry ? `${baseMessage}; retrying once` : baseMessage,
|
|
1142
|
+
errorCode: "process_lost",
|
|
1143
|
+
finishedAt: now,
|
|
1144
|
+
}, {
|
|
1145
|
+
processExitedAt: now,
|
|
1146
|
+
terminalEffectsIntent: shouldRetry ? { version: 1, processLossRetry: true } : { version: 1 },
|
|
1147
|
+
expectedExecutionOwnerToken: recoveryClaim.ownerToken,
|
|
1148
|
+
});
|
|
1149
|
+
if (!finalizedRun)
|
|
900
1150
|
continue;
|
|
1151
|
+
await setWakeupStatus(claimedRun.wakeupRequestId, "failed", {
|
|
1152
|
+
finishedAt: now,
|
|
1153
|
+
error: shouldRetry ? `${baseMessage}; retrying once` : baseMessage,
|
|
1154
|
+
});
|
|
1155
|
+
if (detachedTerminationMessage) {
|
|
1156
|
+
await appendRunEvent(finalizedRun, {
|
|
1157
|
+
eventType: "lifecycle",
|
|
1158
|
+
stream: "system",
|
|
1159
|
+
level: "warn",
|
|
1160
|
+
message: detachedTerminationMessage,
|
|
1161
|
+
payload: {
|
|
1162
|
+
...(claimedRun.processPid ? { processPid: claimedRun.processPid } : {}),
|
|
1163
|
+
},
|
|
1164
|
+
});
|
|
901
1165
|
}
|
|
902
|
-
detachedTerminationMessage = termination.terminationSignal
|
|
903
|
-
? `Terminated detached child pid ${claimedRun.processPid} with ${termination.terminationSignal} after Rudder lost its process handle`
|
|
904
|
-
: `Detached child pid ${claimedRun.processPid} exited before Rudder could terminate it`;
|
|
905
|
-
}
|
|
906
|
-
const shouldRetry = tracksLocalChild && !!claimedRun.processPid && (claimedRun.processLossRetryCount ?? 0) < 1;
|
|
907
|
-
const baseMessage = claimedRun.processPid
|
|
908
|
-
? `Process lost -- child pid ${claimedRun.processPid} is no longer running`
|
|
909
|
-
: "Process lost -- server may have restarted";
|
|
910
|
-
let finalizedRun = await transitionRunToTerminal(claimedRun.id, "failed", {
|
|
911
|
-
error: shouldRetry ? `${baseMessage}; retrying once` : baseMessage,
|
|
912
|
-
errorCode: "process_lost",
|
|
913
|
-
finishedAt: now,
|
|
914
|
-
}, {
|
|
915
|
-
processExitedAt: now,
|
|
916
|
-
terminalEffectsIntent: shouldRetry ? { version: 1, processLossRetry: true } : { version: 1 },
|
|
917
|
-
expectedExecutionOwnerToken: recoveryClaim.ownerToken,
|
|
918
|
-
});
|
|
919
|
-
if (!finalizedRun)
|
|
920
|
-
continue;
|
|
921
|
-
await setWakeupStatus(claimedRun.wakeupRequestId, "failed", {
|
|
922
|
-
finishedAt: now,
|
|
923
|
-
error: shouldRetry ? `${baseMessage}; retrying once` : baseMessage,
|
|
924
|
-
});
|
|
925
|
-
if (detachedTerminationMessage) {
|
|
926
1166
|
await appendRunEvent(finalizedRun, {
|
|
927
1167
|
eventType: "lifecycle",
|
|
928
1168
|
stream: "system",
|
|
929
|
-
level: "
|
|
930
|
-
message:
|
|
1169
|
+
level: "error",
|
|
1170
|
+
message: shouldRetry
|
|
1171
|
+
? `${baseMessage}; retry will be queued after terminal effects complete`
|
|
1172
|
+
: baseMessage,
|
|
931
1173
|
payload: {
|
|
932
1174
|
...(claimedRun.processPid ? { processPid: claimedRun.processPid } : {}),
|
|
933
1175
|
},
|
|
934
1176
|
});
|
|
1177
|
+
const completed = await completeTerminalControlEffects(finalizedRun);
|
|
1178
|
+
runningProcesses.delete(claimedRun.id);
|
|
1179
|
+
if (!completed)
|
|
1180
|
+
continue;
|
|
1181
|
+
reaped.push(claimedRun.id);
|
|
935
1182
|
}
|
|
936
|
-
|
|
937
|
-
|
|
938
|
-
|
|
939
|
-
|
|
940
|
-
|
|
941
|
-
|
|
942
|
-
: baseMessage,
|
|
943
|
-
payload: {
|
|
944
|
-
...(claimedRun.processPid ? { processPid: claimedRun.processPid } : {}),
|
|
945
|
-
},
|
|
1183
|
+
}
|
|
1184
|
+
finally {
|
|
1185
|
+
// Terminal effects are the fast path. Keep a request-scoped sweep as a
|
|
1186
|
+
// second durable path for runs whose effect was lost or dead-lettered.
|
|
1187
|
+
await agentIssueCreationSvc.reconcileTerminalSettlements().catch((error) => {
|
|
1188
|
+
logger.warn({ err: error }, "failed to reconcile terminal Agent Issue creation requests");
|
|
946
1189
|
});
|
|
947
|
-
const completed = await completeTerminalControlEffects(finalizedRun);
|
|
948
|
-
runningProcesses.delete(claimedRun.id);
|
|
949
|
-
if (!completed)
|
|
950
|
-
continue;
|
|
951
|
-
reaped.push(claimedRun.id);
|
|
952
1190
|
}
|
|
953
1191
|
if (reaped.length > 0) {
|
|
954
1192
|
logger.warn({ reapedCount: reaped.length, runIds: reaped }, "reaped orphaned heartbeat runs");
|
|
955
1193
|
}
|
|
956
1194
|
return { reaped: reaped.length, runIds: reaped };
|
|
957
1195
|
}
|
|
958
|
-
async function
|
|
1196
|
+
async function reapInactiveRunsLocked(opts) {
|
|
1197
|
+
pruneLocalExecutionLeaseStates();
|
|
959
1198
|
const maxInactivityMs = opts?.maxInactivityMs ?? DEFAULT_HEARTBEAT_RUN_INACTIVITY_TIMEOUT_MS;
|
|
960
1199
|
if (!Number.isFinite(maxInactivityMs) || maxInactivityMs <= 0) {
|
|
961
1200
|
return { timedOut: 0, runIds: [] };
|
|
@@ -977,6 +1216,8 @@ export function heartbeatService(db, testHooks) {
|
|
|
977
1216
|
for (const { run, agentRuntimeType, lastEventAt, eventCount } of activeRuns) {
|
|
978
1217
|
if (opts?.recoveryCutoff && new Date(run.createdAt).getTime() >= opts.recoveryCutoff.getTime())
|
|
979
1218
|
continue;
|
|
1219
|
+
if (await preserveLiveExecutionAfterSleep(run, now))
|
|
1220
|
+
continue;
|
|
980
1221
|
const activityTimes = [
|
|
981
1222
|
run.updatedAt,
|
|
982
1223
|
lastEventAt,
|
|
@@ -1041,7 +1282,8 @@ export function heartbeatService(db, testHooks) {
|
|
|
1041
1282
|
}
|
|
1042
1283
|
return { timedOut: timedOut.length, runIds: timedOut };
|
|
1043
1284
|
}
|
|
1044
|
-
async function
|
|
1285
|
+
async function reapTimedOutRunsLocked(opts) {
|
|
1286
|
+
pruneLocalExecutionLeaseStates();
|
|
1045
1287
|
const maxRuntimeMs = opts?.maxRuntimeMs ?? DEFAULT_HEARTBEAT_RUN_TIMEOUT_MS;
|
|
1046
1288
|
if (!Number.isFinite(maxRuntimeMs) || maxRuntimeMs <= 0) {
|
|
1047
1289
|
return { timedOut: 0, runIds: [] };
|
|
@@ -1059,6 +1301,8 @@ export function heartbeatService(db, testHooks) {
|
|
|
1059
1301
|
for (const { run, agentRuntimeType } of activeRuns) {
|
|
1060
1302
|
if (opts?.recoveryCutoff && new Date(run.createdAt).getTime() >= opts.recoveryCutoff.getTime())
|
|
1061
1303
|
continue;
|
|
1304
|
+
if (await preserveLiveExecutionAfterSleep(run, now))
|
|
1305
|
+
continue;
|
|
1062
1306
|
const startedAt = run.startedAt ? new Date(run.startedAt).getTime() : null;
|
|
1063
1307
|
if (!startedAt || !Number.isFinite(startedAt))
|
|
1064
1308
|
continue;
|
|
@@ -1110,6 +1354,15 @@ export function heartbeatService(db, testHooks) {
|
|
|
1110
1354
|
}
|
|
1111
1355
|
return { timedOut: timedOut.length, runIds: timedOut };
|
|
1112
1356
|
}
|
|
1357
|
+
async function reapOrphanedRuns(opts) {
|
|
1358
|
+
return withHeartbeatRecoveryLock(() => reapOrphanedRunsLocked(opts));
|
|
1359
|
+
}
|
|
1360
|
+
async function reapInactiveRuns(opts) {
|
|
1361
|
+
return withHeartbeatRecoveryLock(() => reapInactiveRunsLocked(opts));
|
|
1362
|
+
}
|
|
1363
|
+
async function reapTimedOutRuns(opts) {
|
|
1364
|
+
return withHeartbeatRecoveryLock(() => reapTimedOutRunsLocked(opts));
|
|
1365
|
+
}
|
|
1113
1366
|
async function resumeQueuedRuns() {
|
|
1114
1367
|
const queuedRuns = await db
|
|
1115
1368
|
.select({ agentId: heartbeatRuns.agentId })
|
|
@@ -1300,6 +1553,45 @@ export function heartbeatService(db, testHooks) {
|
|
|
1300
1553
|
lastError: taskSessionIntent.lastError ?? null,
|
|
1301
1554
|
}));
|
|
1302
1555
|
}
|
|
1556
|
+
const agentIssueCreationSettlement = intent.agentIssueCreationSettlement;
|
|
1557
|
+
if (agentIssueCreationSettlement) {
|
|
1558
|
+
await runClaimedEffect("agent_issue_creation_settlement", async () => {
|
|
1559
|
+
const settledRequest = await agentIssueCreationSvc.settleForRun({
|
|
1560
|
+
orgId: agentIssueCreationSettlement.orgId,
|
|
1561
|
+
agentId: agentIssueCreationSettlement.agentId,
|
|
1562
|
+
runId: agentIssueCreationSettlement.runId,
|
|
1563
|
+
requestId: agentIssueCreationSettlement.requestId,
|
|
1564
|
+
runStatus: current.status,
|
|
1565
|
+
error: current.error,
|
|
1566
|
+
});
|
|
1567
|
+
const request = settledRequest
|
|
1568
|
+
?? await agentIssueCreationSvc.getById(agentIssueCreationSettlement.orgId, agentIssueCreationSettlement.requestId);
|
|
1569
|
+
if (request?.status === "succeeded" && request.createdIssueId) {
|
|
1570
|
+
const notificationIntent = {
|
|
1571
|
+
orgId: agentIssueCreationSettlement.orgId,
|
|
1572
|
+
agentId: agentIssueCreationSettlement.agentId,
|
|
1573
|
+
runId: agentIssueCreationSettlement.runId,
|
|
1574
|
+
requestId: request.id,
|
|
1575
|
+
issueId: request.createdIssueId,
|
|
1576
|
+
};
|
|
1577
|
+
intent.agentIssueCreationNotification ??= notificationIntent;
|
|
1578
|
+
await reconcileTerminalEffectsIntent(current.id, {
|
|
1579
|
+
version: 1,
|
|
1580
|
+
agentIssueCreationNotification: notificationIntent,
|
|
1581
|
+
});
|
|
1582
|
+
}
|
|
1583
|
+
else if (request
|
|
1584
|
+
&& !request.createdIssueId
|
|
1585
|
+
&& ["queued", "running", "deferred"].includes(request.status)) {
|
|
1586
|
+
throw new Error("Agent Issue creation request remained active after terminal settlement");
|
|
1587
|
+
}
|
|
1588
|
+
return settledRequest;
|
|
1589
|
+
});
|
|
1590
|
+
}
|
|
1591
|
+
const agentIssueCreationNotification = intent.agentIssueCreationNotification;
|
|
1592
|
+
if (agentIssueCreationNotification) {
|
|
1593
|
+
await runClaimedEffect("agent_issue_creation_notification", () => agentIssueCreationSvc.publishNotificationForRequest(agentIssueCreationNotification));
|
|
1594
|
+
}
|
|
1303
1595
|
if (intent.processLossRetry) {
|
|
1304
1596
|
await runClaimedEffect("process_loss_retry", () => {
|
|
1305
1597
|
if (!agent)
|
|
@@ -1407,8 +1699,8 @@ export function heartbeatService(db, testHooks) {
|
|
|
1407
1699
|
});
|
|
1408
1700
|
}
|
|
1409
1701
|
const baseContext = {
|
|
1410
|
-
db, instanceSettings, getCurrentUserRedactionOptions, runLogStore, runContextSvc, issuesSvc, executionWorkspacesSvc, workspaceOperationsSvc, activeRunExecutions, runAbortControllers, budgetHooks, budgets,
|
|
1411
|
-
getAgent, getRun, getRuntimeState, getTaskSession, getLatestRunForSession, getOldestRunForSession, resolveNormalizedUsageForSession, evaluateSessionCompaction, resolveSessionBeforeForWakeup, resolveExplicitResumeSessionOverride, upsertTaskSession, clearTaskSessions, ensureRuntimeState, setRunStatus, transitionRunToTerminal, reconcileRunEvidence, reconcileTerminalEffectsIntent, setWakeupStatus, updateWakeupRequestRecord, insertWakeupRequestRecord, appendRunEvent, persistRunProcessMetadata, clearDetachedRunWarning, terminateRunProcessAndWait, acknowledgeRunProcessExit, renewRunExecutionLease, countRunningRunsForAgent, claimQueuedRun, finalizeAgentStatus, completeTerminalControlEffects, reapOrphanedRuns, reapInactiveRuns, reapTimedOutRuns, resumeQueuedRuns, updateRuntimeState, startNextQueuedRunForAgent,
|
|
1702
|
+
db, approvalsSvc, instanceSettings, getCurrentUserRedactionOptions, runLogStore, runContextSvc, issuesSvc, executionWorkspacesSvc, workspaceOperationsSvc, activeRunExecutions, runAbortControllers, budgetHooks, budgets,
|
|
1703
|
+
getAgent, getRun, getRuntimeState, getTaskSession, getLatestRunForSession, getOldestRunForSession, resolveNormalizedUsageForSession, evaluateSessionCompaction, resolveSessionBeforeForWakeup, resolveExplicitResumeSessionOverride, upsertTaskSession, clearTaskSessions, ensureRuntimeState, setRunStatus, transitionRunToTerminal, reconcileRunEvidence, reconcileTerminalEffectsIntent, setWakeupStatus, updateWakeupRequestRecord, insertWakeupRequestRecord, appendRunEvent, persistRunProcessMetadata, clearDetachedRunWarning, terminateRunProcessAndWait, acknowledgeRunProcessExit, abortRunExecution, renewRunExecutionLease, countRunningRunsForAgent, claimQueuedRun, finalizeAgentStatus, completeTerminalControlEffects, reapOrphanedRuns, reapInactiveRuns, reapTimedOutRuns, resumeQueuedRuns, updateRuntimeState, startNextQueuedRunForAgent,
|
|
1412
1704
|
};
|
|
1413
1705
|
const recoveryHandlers = createHeartbeatRecoveryHandlers({ ...baseContext, startNextQueuedRunForAgent });
|
|
1414
1706
|
const wakeupHandlers = createHeartbeatWakeupHandlers({
|
|
@@ -1423,7 +1715,12 @@ export function heartbeatService(db, testHooks) {
|
|
|
1423
1715
|
...wakeupHandlers,
|
|
1424
1716
|
afterIssuePromotionCommitted: testHooks?.afterIssuePromotionCommitted,
|
|
1425
1717
|
});
|
|
1426
|
-
const executeHandlers = createHeartbeatExecuteHandlers({
|
|
1718
|
+
const executeHandlers = createHeartbeatExecuteHandlers({
|
|
1719
|
+
...baseContext,
|
|
1720
|
+
...recoveryHandlers,
|
|
1721
|
+
...releaseHandlers,
|
|
1722
|
+
...wakeupHandlers,
|
|
1723
|
+
});
|
|
1427
1724
|
const miscHandlers = createHeartbeatMiscHandlers({ ...baseContext, ...recoveryHandlers, ...releaseHandlers, ...wakeupHandlers, ...executeHandlers });
|
|
1428
1725
|
const { enqueueRecoveryRun, enqueueProcessLossRetry, evaluatePassiveIssueClosureForLockedIssue, parseHeartbeatPolicy } = recoveryHandlers;
|
|
1429
1726
|
const { enqueueWakeup } = wakeupHandlers;
|
|
@@ -1649,6 +1946,7 @@ export function heartbeatService(db, testHooks) {
|
|
|
1649
1946
|
reapOrphanedRuns,
|
|
1650
1947
|
reapInactiveRuns,
|
|
1651
1948
|
reapTimedOutRuns,
|
|
1949
|
+
startNextQueuedRunForAgent,
|
|
1652
1950
|
resumeQueuedRuns,
|
|
1653
1951
|
tickTimers: async (now = new Date()) => {
|
|
1654
1952
|
const allAgents = await db.select().from(agents);
|