@capybara-hq/kernel 0.1.0-rc.3 → 0.1.0-rc.5
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/bootstrap.json +61 -5
- package/dist/admin/admin.controller.d.ts +47 -16
- package/dist/admin/admin.controller.js +44 -19
- package/dist/admin/extensions.controller.d.ts +24 -3
- package/dist/admin/extensions.controller.js +48 -8
- package/dist/admin/setup-lock.d.ts +1 -1
- package/dist/admin/setup-lock.js +1 -1
- package/dist/admin/setup.controller.d.ts +1 -1
- package/dist/admin/setup.controller.js +1 -1
- package/dist/admin/setup.service.d.ts +4 -4
- package/dist/admin/setup.service.js +8 -8
- package/dist/agents/agent-lookup.d.ts +19 -0
- package/dist/agents/agent-lookup.js +21 -0
- package/dist/agents/agent-profile.service.d.ts +29 -0
- package/dist/agents/agent-profile.service.js +117 -0
- package/dist/agents/agents.controller.d.ts +168 -3
- package/dist/agents/agents.controller.js +201 -12
- package/dist/agents/agents.module.d.ts +4 -1
- package/dist/agents/agents.module.js +36 -6
- package/dist/agents/agents.service.d.ts +64 -27
- package/dist/agents/agents.service.js +199 -74
- package/dist/agents/definition.d.ts +53 -0
- package/dist/agents/definition.js +55 -0
- package/dist/agents/from-template.d.ts +106 -0
- package/dist/agents/from-template.js +649 -0
- package/dist/agents/from-template.service.d.ts +60 -0
- package/dist/agents/from-template.service.js +161 -0
- package/dist/agents/instruction-files.d.ts +60 -0
- package/dist/agents/instruction-files.js +111 -0
- package/dist/agents/models.controller.d.ts +9 -3
- package/dist/agents/models.controller.js +19 -4
- package/dist/agents/org-templates.d.ts +176 -0
- package/dist/agents/org-templates.js +827 -0
- package/dist/agents/pending-connector-requests.d.ts +77 -0
- package/dist/agents/pending-connector-requests.js +215 -0
- package/dist/agents/pending-connectors.controller.d.ts +39 -0
- package/dist/agents/pending-connectors.controller.js +91 -0
- package/dist/agents/pending-connectors.service.d.ts +62 -0
- package/dist/agents/pending-connectors.service.js +282 -0
- package/dist/agents/profile.d.ts +96 -0
- package/dist/agents/profile.js +51 -0
- package/dist/agents/readiness.controller.d.ts +26 -0
- package/dist/agents/readiness.controller.js +56 -0
- package/dist/agents/templates.controller.d.ts +86 -5
- package/dist/agents/templates.controller.js +171 -7
- package/dist/agents/templates.d.ts +127 -23
- package/dist/agents/templates.js +476 -53
- package/dist/background/background.controller.d.ts +38 -0
- package/dist/background/background.controller.js +87 -0
- package/dist/background/background.module.d.ts +10 -0
- package/dist/background/background.module.js +39 -0
- package/dist/background/finish.d.ts +44 -0
- package/dist/background/finish.js +94 -0
- package/dist/background/launch-lock.d.ts +15 -0
- package/dist/background/launch-lock.js +40 -0
- package/dist/background/launch.d.ts +36 -0
- package/dist/background/launch.js +70 -0
- package/dist/background/poll.job.d.ts +56 -0
- package/dist/background/poll.job.js +190 -0
- package/dist/background/render.d.ts +23 -0
- package/dist/background/render.js +48 -0
- package/dist/background/session.d.ts +48 -0
- package/dist/background/session.js +79 -0
- package/dist/background/status.d.ts +35 -0
- package/dist/background/status.js +57 -0
- package/dist/background/stop.d.ts +68 -0
- package/dist/background/stop.js +243 -0
- package/dist/background/store.d.ts +162 -0
- package/dist/background/store.js +357 -0
- package/dist/background/store.module.d.ts +6 -0
- package/dist/background/store.module.js +22 -0
- package/dist/background/tasks.service.d.ts +77 -0
- package/dist/background/tasks.service.js +211 -0
- package/dist/background/wake-rules.d.ts +66 -0
- package/dist/background/wake-rules.js +113 -0
- package/dist/background/wake.d.ts +30 -0
- package/dist/background/wake.js +63 -0
- package/dist/catalog/admin-catalog.controller.d.ts +129 -30
- package/dist/catalog/admin-catalog.controller.js +213 -42
- package/dist/catalog/catalog-content.d.ts +58 -32
- package/dist/catalog/catalog-content.js +34 -8
- package/dist/catalog/catalog-import.module.d.ts +7 -0
- package/dist/catalog/catalog-import.module.js +60 -0
- package/dist/catalog/catalog-items.d.ts +111 -7
- package/dist/catalog/catalog-items.js +279 -13
- package/dist/catalog/catalog-scope.service.d.ts +260 -0
- package/dist/catalog/catalog-scope.service.js +1116 -0
- package/dist/catalog/catalog.module.d.ts +7 -9
- package/dist/catalog/catalog.module.js +41 -31
- package/dist/catalog/catalog.service.d.ts +101 -29
- package/dist/catalog/catalog.service.js +104 -106
- package/dist/catalog/claude/agents.js +2 -0
- package/dist/catalog/cli.d.ts +11 -1
- package/dist/catalog/cli.js +26 -1
- package/dist/catalog/component-promotion.d.ts +96 -0
- package/dist/catalog/component-promotion.js +395 -0
- package/dist/catalog/component-scope.controller.d.ts +152 -0
- package/dist/catalog/component-scope.controller.js +287 -0
- package/dist/catalog/component-scope.service.d.ts +303 -0
- package/dist/catalog/component-scope.service.js +936 -0
- package/dist/catalog/component-state.d.ts +174 -0
- package/dist/catalog/component-state.js +437 -0
- package/dist/catalog/job-ids.d.ts +30 -0
- package/dist/catalog/job-ids.js +25 -0
- package/dist/catalog/marketplace-fetch.d.ts +1 -1
- package/dist/catalog/marketplaces.controller.d.ts +22 -5
- package/dist/catalog/marketplaces.controller.js +56 -7
- package/dist/catalog/marketplaces.service.d.ts +54 -14
- package/dist/catalog/marketplaces.service.js +71 -22
- package/dist/catalog/org-catalog.controller.d.ts +125 -34
- package/dist/catalog/org-catalog.controller.js +181 -65
- package/dist/catalog/org-catalog.service.d.ts +65 -33
- package/dist/catalog/org-catalog.service.js +324 -157
- package/dist/catalog/org-extension-switch.d.ts +41 -0
- package/dist/catalog/org-extension-switch.js +115 -0
- package/dist/catalog/org-extension.controller.d.ts +119 -0
- package/dist/catalog/org-extension.controller.js +266 -0
- package/dist/catalog/org-plugin-uploads.controller.d.ts +98 -0
- package/dist/catalog/org-plugin-uploads.controller.js +213 -0
- package/dist/catalog/org-plugin-uploads.d.ts +63 -0
- package/dist/catalog/org-plugin-uploads.js +116 -0
- package/dist/catalog/owned-items.d.ts +184 -0
- package/dist/catalog/owned-items.js +789 -0
- package/dist/catalog/owned-plugin-cleanup.d.ts +56 -0
- package/dist/catalog/owned-plugin-cleanup.js +194 -0
- package/dist/catalog/ownership.d.ts +172 -0
- package/dist/catalog/ownership.js +326 -0
- package/dist/catalog/platform-components.d.ts +221 -0
- package/dist/catalog/platform-components.js +761 -0
- package/dist/catalog/platform-migration.d.ts +115 -0
- package/dist/catalog/platform-migration.js +582 -0
- package/dist/catalog/plugin-import.d.ts +178 -34
- package/dist/catalog/plugin-import.js +623 -83
- package/dist/catalog/plugin-install.d.ts +185 -41
- package/dist/catalog/plugin-install.js +758 -126
- package/dist/catalog/plugin-upgrade.d.ts +260 -225
- package/dist/catalog/plugin-upgrade.js +1148 -1137
- package/dist/catalog/request-rules.d.ts +65 -0
- package/dist/catalog/request-rules.js +217 -0
- package/dist/catalog/requests.service.d.ts +193 -118
- package/dist/catalog/requests.service.js +526 -343
- package/dist/catalog/reserved-names.d.ts +8 -0
- package/dist/catalog/reserved-names.js +42 -0
- package/dist/catalog/scope-orgs.d.ts +21 -0
- package/dist/catalog/scope-orgs.js +67 -0
- package/dist/catalog/scope-state.d.ts +35 -0
- package/dist/catalog/scope-state.js +87 -0
- package/dist/catalog/scope-sync-workers.d.ts +7 -0
- package/dist/catalog/scope-sync-workers.js +29 -0
- package/dist/catalog/scope-sync.d.ts +176 -0
- package/dist/catalog/scope-sync.js +576 -0
- package/dist/catalog/scope.d.ts +42 -0
- package/dist/catalog/scope.js +42 -0
- package/dist/catalog/unshare.d.ts +22 -0
- package/dist/catalog/unshare.js +118 -0
- package/dist/channels/actions.js +1 -0
- package/dist/channels/cards.js +21 -3
- package/dist/channels/channels.module.js +2 -0
- package/dist/channels/connections.service.d.ts +16 -1
- package/dist/channels/connections.service.js +38 -4
- package/dist/channels/inbound.d.ts +9 -1
- package/dist/channels/inbound.js +67 -5
- package/dist/channels/phrases.d.ts +35 -0
- package/dist/channels/phrases.js +29 -0
- package/dist/channels/threads.d.ts +5 -0
- package/dist/channels/threads.js +8 -0
- package/dist/config/docs.js +3 -1
- package/dist/config/schema.d.ts +24 -2
- package/dist/config/schema.js +145 -19
- package/dist/conversations/access.d.ts +6 -4
- package/dist/conversations/access.js +29 -5
- package/dist/conversations/agent-tree.d.ts +46 -0
- package/dist/conversations/agent-tree.js +92 -0
- package/dist/conversations/attachments.service.d.ts +30 -0
- package/dist/conversations/attachments.service.js +130 -5
- package/dist/conversations/conversations.controller.d.ts +79 -23
- package/dist/conversations/conversations.controller.js +141 -50
- package/dist/conversations/conversations.module.d.ts +1 -1
- package/dist/conversations/conversations.module.js +10 -7
- package/dist/conversations/conversations.service.d.ts +108 -9
- package/dist/conversations/conversations.service.js +237 -30
- package/dist/conversations/environment-status.d.ts +24 -0
- package/dist/conversations/environment-status.js +71 -0
- package/dist/conversations/event-log.d.ts +21 -6
- package/dist/conversations/event-log.js +70 -1
- package/dist/conversations/events.d.ts +140 -0
- package/dist/conversations/events.js +142 -13
- package/dist/conversations/queue.d.ts +3 -1
- package/dist/conversations/queue.js +13 -2
- package/dist/conversations/queue.service.d.ts +1 -1
- package/dist/conversations/queue.service.js +8 -1
- package/dist/conversations/titles.d.ts +12 -3
- package/dist/conversations/titles.js +36 -8
- package/dist/conversations/tree.d.ts +17 -0
- package/dist/conversations/tree.js +42 -0
- package/dist/ctx/create-ctx.d.ts +5 -0
- package/dist/ctx/create-ctx.js +15 -5
- package/dist/db/kernel-schema.d.ts +420 -20
- package/dist/db/pool.d.ts +5 -0
- package/dist/db/pool.js +3 -0
- package/dist/environments/access.d.ts +41 -0
- package/dist/environments/access.js +77 -0
- package/dist/environments/conversation-environments.d.ts +61 -0
- package/dist/environments/conversation-environments.js +170 -0
- package/dist/environments/dto.d.ts +25 -0
- package/dist/environments/dto.js +12 -0
- package/dist/environments/environments.controller.d.ts +33 -0
- package/dist/environments/environments.controller.js +110 -0
- package/dist/environments/environments.module.d.ts +8 -0
- package/dist/environments/environments.module.js +27 -0
- package/dist/environments/environments.service.d.ts +153 -0
- package/dist/environments/environments.service.js +541 -0
- package/dist/environments/legacy-cleanup.job.d.ts +34 -0
- package/dist/environments/legacy-cleanup.job.js +141 -0
- package/dist/errors.d.ts +90 -2
- package/dist/errors.js +90 -2
- package/dist/evals/reconstruct.d.ts +18 -9
- package/dist/evals/reconstruct.js +26 -7
- package/dist/evals/run-replay.d.ts +7 -2
- package/dist/evals/run-replay.js +42 -7
- package/dist/evals/step-replay.d.ts +2 -5
- package/dist/evals/step-replay.js +13 -7
- package/dist/evals/trajectory.js +1 -1
- package/dist/evals/trajectory.service.d.ts +8 -3
- package/dist/evals/trajectory.service.js +26 -14
- package/dist/evals/worker.d.ts +5 -5
- package/dist/evals/worker.js +9 -3
- package/dist/extensions/admin-ops.d.ts +36 -10
- package/dist/extensions/admin-ops.js +67 -42
- package/dist/extensions/admin-view.d.ts +39 -10
- package/dist/extensions/admin-view.js +111 -20
- package/dist/extensions/blobs.js +1 -0
- package/dist/extensions/bootstrap.d.ts +17 -4
- package/dist/extensions/bootstrap.js +70 -9
- package/dist/extensions/cli.d.ts +12 -0
- package/dist/extensions/cli.js +11 -2
- package/dist/extensions/config-issues.d.ts +13 -1
- package/dist/extensions/config-issues.js +22 -5
- package/dist/extensions/config-json-schema.d.ts +43 -7
- package/dist/extensions/config-json-schema.js +124 -58
- package/dist/extensions/deployment-config-store.d.ts +6 -0
- package/dist/extensions/deployment-config.d.ts +78 -8
- package/dist/extensions/deployment-config.js +172 -34
- package/dist/extensions/display-name.d.ts +22 -0
- package/dist/extensions/display-name.js +77 -0
- package/dist/extensions/effective-config.d.ts +127 -0
- package/dist/extensions/effective-config.js +368 -0
- package/dist/extensions/extensions.module.js +14 -2
- package/dist/extensions/hooks.d.ts +37 -4
- package/dist/extensions/hooks.js +82 -16
- package/dist/extensions/host.d.ts +45 -2
- package/dist/extensions/host.js +112 -16
- package/dist/extensions/installs.d.ts +20 -8
- package/dist/extensions/installs.js +37 -15
- package/dist/extensions/org-config.d.ts +81 -6
- package/dist/extensions/org-config.js +195 -44
- package/dist/extensions/org-levels.d.ts +37 -0
- package/dist/extensions/org-levels.js +71 -0
- package/dist/extensions/org-overrides.d.ts +151 -0
- package/dist/extensions/org-overrides.js +524 -0
- package/dist/extensions/package.d.ts +14 -1
- package/dist/extensions/package.js +51 -2
- package/dist/extensions/permission-view.d.ts +19 -4
- package/dist/extensions/permission-view.js +4 -4
- package/dist/extensions/plugin-items.d.ts +21 -0
- package/dist/extensions/plugin-items.js +42 -0
- package/dist/extensions/point-defaults.controller.d.ts +34 -0
- package/dist/extensions/point-defaults.controller.js +71 -0
- package/dist/extensions/point-defaults.d.ts +71 -0
- package/dist/extensions/point-defaults.js +234 -0
- package/dist/extensions/registry.d.ts +1 -1
- package/dist/extensions/registry.js +2 -0
- package/dist/extensions/resolve.d.ts +5 -1
- package/dist/extensions/resolve.js +15 -2
- package/dist/files/previewers.d.ts +8 -1
- package/dist/files/previewers.js +35 -6
- package/dist/http/api.module.js +31 -3
- package/dist/http/app.d.ts +11 -2
- package/dist/http/app.js +31 -5
- package/dist/http/nest-logger.d.ts +6 -5
- package/dist/http/nest-logger.js +24 -10
- package/dist/identity/accounts.d.ts +29 -29
- package/dist/identity/accounts.js +47 -47
- package/dist/identity/audit.d.ts +2 -1
- package/dist/identity/auth.controller.js +9 -5
- package/dist/identity/auth.guard.d.ts +13 -5
- package/dist/identity/auth.guard.js +26 -9
- package/dist/identity/cookies.d.ts +20 -5
- package/dist/identity/cookies.js +44 -6
- package/dist/identity/identity.module.d.ts +1 -1
- package/dist/identity/identity.module.js +4 -4
- package/dist/identity/me.controller.d.ts +5 -1
- package/dist/identity/me.controller.js +12 -3
- package/dist/identity/principal.d.ts +3 -3
- package/dist/identity/principal.js +3 -3
- package/dist/identity/sessions.d.ts +12 -0
- package/dist/identity/sessions.js +45 -0
- package/dist/identity/settings.d.ts +22 -11
- package/dist/identity/settings.js +53 -18
- package/dist/identity/{enterprise-admin.d.ts → super-admin.d.ts} +5 -5
- package/dist/identity/{enterprise-admin.js → super-admin.js} +24 -24
- package/dist/inbox/inbox.module.d.ts +4 -1
- package/dist/inbox/inbox.module.js +7 -3
- package/dist/inbox/inbox.service.d.ts +62 -3
- package/dist/inbox/inbox.service.js +74 -4
- package/dist/inbox/org-notices.d.ts +63 -0
- package/dist/inbox/org-notices.js +91 -0
- package/dist/inbox/platform-inbox.controller.d.ts +23 -0
- package/dist/inbox/platform-inbox.controller.js +58 -0
- package/dist/inbox/platform-inbox.service.d.ts +151 -0
- package/dist/inbox/platform-inbox.service.js +263 -0
- package/dist/inbox/platform-notices.d.ts +19 -0
- package/dist/inbox/platform-notices.js +9 -0
- package/dist/index.d.ts +2 -2
- package/dist/index.js +1 -1
- package/dist/infra/cli/kernel-cli.module.js +9 -1
- package/dist/infra/config/kernel-config.service.js +27 -1
- package/dist/infra/database/database.module.js +1 -0
- package/dist/infra/database/xact-lock.d.ts +1 -1
- package/dist/infra/database/xact-lock.js +1 -1
- package/dist/infra/events/kernel-events.d.ts +19 -2
- package/dist/infra/lifecycle/process-guards.js +4 -0
- package/dist/infra/logging/logging.module.d.ts +4 -2
- package/dist/infra/logging/logging.module.js +24 -6
- package/dist/infra/queue/add-job-once.d.ts +14 -0
- package/dist/infra/queue/add-job-once.js +16 -0
- package/dist/infra/queue/redis-connection.d.ts +6 -0
- package/dist/infra/queue/redis-connection.js +7 -0
- package/dist/infra/redis/redis.module.js +6 -2
- package/dist/infra/tokens.d.ts +6 -1
- package/dist/infra/tokens.js +6 -1
- package/dist/kernel.module.js +6 -0
- package/dist/lifecycle/kernel-lifecycle.d.ts +1 -1
- package/dist/lifecycle/kernel-lifecycle.js +4 -4
- package/dist/log.d.ts +13 -1
- package/dist/log.js +93 -17
- package/dist/models/prices.d.ts +5 -5
- package/dist/models/prices.js +4 -4
- package/dist/models/purposes.controller.d.ts +6 -4
- package/dist/models/purposes.controller.js +13 -7
- package/dist/models/purposes.d.ts +43 -9
- package/dist/models/purposes.js +48 -18
- package/dist/orgs/directory-sync.d.ts +14 -5
- package/dist/orgs/directory-sync.js +41 -17
- package/dist/orgs/offboarding.d.ts +12 -8
- package/dist/orgs/offboarding.js +54 -33
- package/dist/orgs/org-lock.d.ts +5 -0
- package/dist/orgs/org-lock.js +13 -0
- package/dist/orgs/org.guard.d.ts +10 -0
- package/dist/orgs/org.guard.js +43 -32
- package/dist/orgs/orgs.module.js +3 -0
- package/dist/orgs/orgs.service.d.ts +20 -7
- package/dist/orgs/orgs.service.js +32 -12
- package/dist/orgs/roles.d.ts +1 -1
- package/dist/orgs/roles.js +5 -1
- package/dist/orgs/settings.controller.d.ts +1 -1
- package/dist/orgs/settings.service.d.ts +20 -3
- package/dist/orgs/settings.service.js +19 -4
- package/dist/overrides.d.ts +3 -0
- package/dist/overrides.js +2 -0
- package/dist/platform/actor.d.ts +48 -0
- package/dist/platform/actor.js +100 -0
- package/dist/platform/agent-docs.d.ts +18 -0
- package/dist/platform/agent-docs.js +59 -0
- package/dist/platform/availability.d.ts +14 -0
- package/dist/platform/availability.js +43 -0
- package/dist/platform/errors.d.ts +11 -0
- package/dist/platform/errors.js +26 -0
- package/dist/platform/exclusions.d.ts +12 -0
- package/dist/platform/exclusions.js +1387 -0
- package/dist/platform/method.d.ts +6 -0
- package/dist/platform/method.js +15 -0
- package/dist/platform/operation.d.ts +92 -0
- package/dist/platform/operation.js +35 -0
- package/dist/platform/ops/agent-templates.ops.d.ts +14 -0
- package/dist/platform/ops/agent-templates.ops.js +92 -0
- package/dist/platform/ops/agents.ops.d.ts +19 -0
- package/dist/platform/ops/agents.ops.js +294 -0
- package/dist/platform/ops/connectors.ops.d.ts +15 -0
- package/dist/platform/ops/connectors.ops.js +126 -0
- package/dist/platform/ops/errors.d.ts +11 -0
- package/dist/platform/ops/errors.js +22 -0
- package/dist/platform/ops/extensions.ops.d.ts +19 -0
- package/dist/platform/ops/extensions.ops.js +116 -0
- package/dist/platform/ops/marketplaces.ops.d.ts +16 -0
- package/dist/platform/ops/marketplaces.ops.js +157 -0
- package/dist/platform/ops/paging.d.ts +14 -0
- package/dist/platform/ops/paging.js +20 -0
- package/dist/platform/ops/platform.ops.d.ts +23 -0
- package/dist/platform/ops/platform.ops.js +158 -0
- package/dist/platform/ops/plugins.ops.d.ts +33 -0
- package/dist/platform/ops/plugins.ops.js +377 -0
- package/dist/platform/ops/requests.ops.d.ts +14 -0
- package/dist/platform/ops/requests.ops.js +153 -0
- package/dist/platform/ops/role.d.ts +4 -0
- package/dist/platform/ops/role.js +10 -0
- package/dist/platform/ops/skills.ops.d.ts +13 -0
- package/dist/platform/ops/skills.ops.js +98 -0
- package/dist/platform/ops/summary.d.ts +10 -0
- package/dist/platform/ops/summary.js +18 -0
- package/dist/platform/platform-ops.module.d.ts +7 -0
- package/dist/platform/platform-ops.module.js +55 -0
- package/dist/platform/platform.module.d.ts +8 -0
- package/dist/platform/platform.module.js +25 -0
- package/dist/platform/redact-orgs.d.ts +7 -0
- package/dist/platform/redact-orgs.js +52 -0
- package/dist/platform/registry.d.ts +30 -0
- package/dist/platform/registry.js +111 -0
- package/dist/roles/worker-role.d.ts +6 -4
- package/dist/roles/worker-role.js +14 -7
- package/dist/roles/worker.module.d.ts +1 -1
- package/dist/roles/worker.module.js +15 -1
- package/dist/runtime/context/build.d.ts +11 -7
- package/dist/runtime/context/build.js +46 -19
- package/dist/runtime/context/claude-tools.d.ts +3 -1
- package/dist/runtime/context/claude-tools.js +8 -6
- package/dist/runtime/context/compaction.js +13 -0
- package/dist/runtime/context/reminders.d.ts +2 -0
- package/dist/runtime/context/reminders.js +2 -0
- package/dist/runtime/context/skills.js +9 -2
- package/dist/runtime/context/tool-changes.d.ts +27 -0
- package/dist/runtime/context/tool-changes.js +60 -0
- package/dist/runtime/hook-calls.js +2 -0
- package/dist/runtime/langgraph-loop.d.ts +3 -1
- package/dist/runtime/langgraph-loop.js +36 -17
- package/dist/runtime/loop.d.ts +34 -5
- package/dist/runtime/maintenance.d.ts +9 -4
- package/dist/runtime/maintenance.js +35 -8
- package/dist/runtime/model-call.d.ts +46 -8
- package/dist/runtime/model-call.js +72 -21
- package/dist/runtime/providers.d.ts +6 -0
- package/dist/runtime/providers.js +8 -0
- package/dist/runtime/run-control.d.ts +11 -1
- package/dist/runtime/run-control.js +12 -0
- package/dist/runtime/run-drafts.d.ts +85 -0
- package/dist/runtime/run-drafts.js +230 -0
- package/dist/runtime/run-jobs.d.ts +3 -5
- package/dist/runtime/run-jobs.js +3 -7
- package/dist/runtime/run-queue.d.ts +59 -2
- package/dist/runtime/run-queue.js +311 -38
- package/dist/runtime/run-worker.d.ts +11 -5
- package/dist/runtime/run-worker.js +69 -33
- package/dist/runtime/runtime.module.js +11 -3
- package/dist/runtime/step-log.d.ts +15 -4
- package/dist/runtime/step-log.js +24 -7
- package/dist/runtime/stream.controller.d.ts +23 -1
- package/dist/runtime/stream.controller.js +60 -3
- package/dist/runtime/stream.d.ts +4 -1
- package/dist/runtime/stream.js +27 -3
- package/dist/runtime/subagents/child.d.ts +55 -7
- package/dist/runtime/subagents/child.js +105 -7
- package/dist/runtime/subagents/definition.d.ts +12 -3
- package/dist/runtime/subagents/definition.js +44 -28
- package/dist/runtime/subagents/deliveries.d.ts +71 -0
- package/dist/runtime/subagents/deliveries.js +228 -0
- package/dist/runtime/subagents/dispatch.d.ts +115 -26
- package/dist/runtime/subagents/dispatch.js +212 -141
- package/dist/runtime/subagents/limits.d.ts +24 -5
- package/dist/runtime/subagents/limits.js +40 -6
- package/dist/runtime/subagents/messages.d.ts +95 -0
- package/dist/runtime/subagents/messages.js +328 -0
- package/dist/runtime/subagents/preamble.d.ts +4 -4
- package/dist/runtime/subagents/preamble.js +9 -7
- package/dist/runtime/subagents/progress.d.ts +8 -6
- package/dist/runtime/subagents/progress.js +11 -6
- package/dist/runtime/subagents/render.d.ts +30 -0
- package/dist/runtime/subagents/render.js +53 -0
- package/dist/runtime/subagents/roster.d.ts +24 -7
- package/dist/runtime/subagents/roster.js +47 -11
- package/dist/runtime/subagents/skill-fork.d.ts +3 -2
- package/dist/runtime/subagents/skill-fork.js +8 -4
- package/dist/runtime/subagents/status.d.ts +14 -0
- package/dist/runtime/subagents/status.js +23 -0
- package/dist/runtime/subagents/subagents.service.d.ts +7 -4
- package/dist/runtime/subagents/subagents.service.js +11 -6
- package/dist/runtime/usage-report.d.ts +2 -1
- package/dist/runtime/usage-report.js +19 -13
- package/dist/runtime/waits.d.ts +145 -36
- package/dist/runtime/waits.js +423 -109
- package/dist/sandbox/jobs.d.ts +40 -13
- package/dist/sandbox/jobs.js +57 -20
- package/dist/sandbox/leases.d.ts +37 -54
- package/dist/sandbox/leases.js +71 -115
- package/dist/sandbox/providers.d.ts +2 -2
- package/dist/sandbox/providers.js +1 -1
- package/dist/sandbox/sandbox.module.d.ts +3 -2
- package/dist/sandbox/sandbox.module.js +10 -4
- package/dist/sandbox/sandbox.service.d.ts +282 -129
- package/dist/sandbox/sandbox.service.js +736 -381
- package/dist/skills/catalog.d.ts +3 -2
- package/dist/skills/catalog.js +21 -43
- package/dist/skills/changes.controller.d.ts +7 -0
- package/dist/skills/changes.controller.js +19 -1
- package/dist/skills/invoke.js +8 -3
- package/dist/skills/package.d.ts +20 -1
- package/dist/skills/package.js +28 -1
- package/dist/skills/skills.controller.d.ts +39 -4
- package/dist/skills/skills.controller.js +88 -10
- package/dist/skills/skills.module.js +10 -1
- package/dist/skills/skills.service.d.ts +106 -26
- package/dist/skills/skills.service.js +421 -75
- package/dist/skills/usable.d.ts +81 -0
- package/dist/skills/usable.js +379 -0
- package/dist/tools/approvals.service.d.ts +20 -2
- package/dist/tools/approvals.service.js +25 -4
- package/dist/tools/builtin-names.d.ts +41 -7
- package/dist/tools/builtin-names.js +59 -7
- package/dist/tools/builtins/agent.d.ts +23 -21
- package/dist/tools/builtins/agent.js +62 -55
- package/dist/tools/builtins/builtin-tools.d.ts +19 -1
- package/dist/tools/builtins/builtin-tools.js +59 -2
- package/dist/tools/builtins/handback.d.ts +28 -0
- package/dist/tools/builtins/handback.js +53 -0
- package/dist/tools/builtins/platform.d.ts +34 -0
- package/dist/tools/builtins/platform.js +362 -0
- package/dist/tools/builtins/sandbox/bash.d.ts +1 -1
- package/dist/tools/builtins/sandbox/bash.js +241 -4
- package/dist/tools/builtins/sandbox/common.d.ts +69 -27
- package/dist/tools/builtins/sandbox/common.js +87 -48
- package/dist/tools/builtins/sandbox/deliver.js +1 -1
- package/dist/tools/builtins/sandbox/edit.js +2 -2
- package/dist/tools/builtins/sandbox/glob.js +2 -2
- package/dist/tools/builtins/sandbox/grep.js +2 -4
- package/dist/tools/builtins/sandbox/index.d.ts +3 -1
- package/dist/tools/builtins/sandbox/index.js +7 -1
- package/dist/tools/builtins/sandbox/read.js +1 -1
- package/dist/tools/builtins/sandbox/task-output.d.ts +74 -0
- package/dist/tools/builtins/sandbox/task-output.js +329 -0
- package/dist/tools/builtins/sandbox/task-stop.d.ts +10 -0
- package/dist/tools/builtins/sandbox/task-stop.js +113 -0
- package/dist/tools/builtins/sandbox/write.js +2 -2
- package/dist/tools/builtins/send-message.d.ts +56 -0
- package/dist/tools/builtins/send-message.js +100 -0
- package/dist/tools/builtins/skill-load.d.ts +22 -14
- package/dist/tools/builtins/skill-load.js +86 -57
- package/dist/tools/builtins/skill-write.js +1 -1
- package/dist/tools/builtins/web/errors.d.ts +8 -0
- package/dist/tools/builtins/web/errors.js +53 -0
- package/dist/tools/builtins/web/extract.d.ts +62 -0
- package/dist/tools/builtins/web/extract.js +271 -0
- package/dist/tools/builtins/web/fetch.d.ts +55 -0
- package/dist/tools/builtins/web/fetch.js +175 -0
- package/dist/tools/builtins/web/index.d.ts +13 -0
- package/dist/tools/builtins/web/index.js +12 -0
- package/dist/tools/builtins/web/page-cache.d.ts +25 -0
- package/dist/tools/builtins/web/page-cache.js +77 -0
- package/dist/tools/builtins/web/search.d.ts +25 -0
- package/dist/tools/builtins/web/search.js +210 -0
- package/dist/tools/builtins/web/url.d.ts +17 -0
- package/dist/tools/builtins/web/url.js +43 -0
- package/dist/tools/connectors.controller.d.ts +10 -0
- package/dist/tools/connectors.controller.js +12 -0
- package/dist/tools/connectors.service.d.ts +46 -5
- package/dist/tools/connectors.service.js +94 -15
- package/dist/tools/extension-tools.controller.d.ts +14 -0
- package/dist/tools/extension-tools.controller.js +37 -0
- package/dist/tools/info.d.ts +42 -1
- package/dist/tools/info.js +64 -1
- package/dist/tools/oauth/flow-paths.d.ts +1 -1
- package/dist/tools/oauth/flow-paths.js +1 -1
- package/dist/tools/org-tool-switches.d.ts +74 -0
- package/dist/tools/org-tool-switches.js +184 -0
- package/dist/tools/pipeline.d.ts +46 -40
- package/dist/tools/pipeline.js +202 -364
- package/dist/tools/policy.d.ts +1 -1
- package/dist/tools/policy.js +36 -16
- package/dist/tools/registry.d.ts +120 -8
- package/dist/tools/registry.js +112 -19
- package/dist/tools/tools.module.js +24 -2
- package/dist/tools/validate.js +1 -1
- package/dist/ui/views.d.ts +2 -1
- package/dist/ui/views.js +17 -3
- package/package.json +3 -3
- package/src/migrations/0064_account_last_org.sql +7 -0
- package/src/migrations/0065_conversation_archive.sql +8 -0
- package/src/migrations/0066_extension_display_name.sql +4 -0
- package/src/migrations/0067_agent_profiles.sql +20 -0
- package/src/migrations/0068_agent_avatar_uploads.sql +7 -0
- package/src/migrations/0069_attachments_agent_idx.sql +3 -0
- package/src/migrations/0070_background_tasks.sql +37 -0
- package/src/migrations/0071_background_tasks_reserve.sql +6 -0
- package/src/migrations/0072_background_tasks_stopping.sql +5 -0
- package/src/migrations/0073_org_extension_point_defaults.sql +11 -0
- package/src/migrations/0074_subagent_tree.sql +50 -0
- package/src/migrations/0075_plugin_scope.sql +61 -0
- package/src/migrations/0076_skills_created_by_nullable.sql +6 -0
- package/src/migrations/0077_scope_requests.sql +52 -0
- package/src/migrations/0078_scope_grant_switches.sql +18 -0
- package/src/migrations/0079_scope_live_install_switches.sql +19 -0
- package/src/migrations/0080_rename_enterprise_admin.sql +18 -0
- package/src/migrations/0081_platform_components.sql +129 -0
- package/src/migrations/0082_platform_migration.sql +33 -0
- package/src/migrations/0083_plugin_scope_sync_failures.sql +15 -0
- package/src/migrations/0084_org_owned_items.sql +85 -0
- package/src/migrations/0085_agent_templates_phase4.sql +45 -0
- package/src/migrations/0086_org_layering.sql +30 -0
- package/src/migrations/0087_approval_summary.sql +6 -0
- package/src/migrations/0088_environments.sql +80 -0
- package/dist/catalog/upgrade-targets.d.ts +0 -56
- package/dist/catalog/upgrade-targets.js +0 -90
- package/dist/conversations/sandbox-status.d.ts +0 -24
- package/dist/conversations/sandbox-status.js +0 -52
- package/dist/extensions/org-config.controller.d.ts +0 -24
- package/dist/extensions/org-config.controller.js +0 -62
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import type { Logger } from "@capybara-hq/plugin-sdk";
|
|
2
|
+
import type { Queue } from "bullmq";
|
|
2
3
|
import { EventLog } from "../conversations/event-log.js";
|
|
3
4
|
import type { ConversationKind } from "../db/kernel-schema.js";
|
|
5
|
+
import { KernelConfigService } from "../infra/config/kernel-config.service.js";
|
|
4
6
|
import { KernelDb } from "../infra/database/kernel-db.js";
|
|
5
7
|
import { TransactionHost } from "../infra/database/transaction-host.js";
|
|
6
8
|
import { KernelEvents } from "../infra/events/kernel-events.js";
|
|
@@ -29,11 +31,16 @@ export declare class RunQueue {
|
|
|
29
31
|
private readonly events;
|
|
30
32
|
private readonly log;
|
|
31
33
|
readonly txHost: TransactionHost;
|
|
34
|
+
private readonly config;
|
|
35
|
+
/** The producer side of the delayed `bg-wake` job (`MaintenanceProcessor` consumes it). */
|
|
36
|
+
private readonly maintenance;
|
|
32
37
|
constructor(kdb: KernelDb, eventLog: EventLog, lock: Pick<ConversationLock, "holder">, jobs: RunJobs, finisher: Pick<RunFinish, "finishIn">,
|
|
33
38
|
/** 运行以孤儿结束(标记失败 / 直接中止)后删除它的 checkpoint thread(thread_id = runId)。 */
|
|
34
39
|
checkpoints: Pick<KyselyCheckpointSaver, "deleteThread">,
|
|
35
40
|
/** The run's open `Agent` call results, in the orphan repair's transaction (sub-agents spec §12). */
|
|
36
|
-
pipeline: Pick<ToolPipeline, "stopOpenAgentCalls">, events: KernelEvents, log: Pick<Logger, "error" | "warn">, txHost: TransactionHost
|
|
41
|
+
pipeline: Pick<ToolPipeline, "stopOpenAgentCalls">, events: KernelEvents, log: Pick<Logger, "error" | "warn">, txHost: TransactionHost, config: KernelConfigService,
|
|
42
|
+
/** The producer side of the delayed `bg-wake` job (`MaintenanceProcessor` consumes it). */
|
|
43
|
+
maintenance: Pick<Queue, "add">);
|
|
37
44
|
private get db();
|
|
38
45
|
/**
|
|
39
46
|
* The `beforeTerminal` of an orphan repair: writes the run's open `Agent` call results in the
|
|
@@ -44,6 +51,13 @@ export declare class RunQueue {
|
|
|
44
51
|
* 有未消费的用户消息(最新 user_message 的 seq > `consumed_seq`)、会话锁无人持有、
|
|
45
52
|
* 且没有 queued / running / waiting 的运行时:插入 `runs`(queued)并投递任务,返回 runId;否则返回 null。
|
|
46
53
|
*
|
|
54
|
+
* The boundary (`trigger_seq`) is that newest message; with none unconsumed, the queue's head
|
|
55
|
+
* once it is sent; with no head either, a wake-eligible finished background task or sub-agent
|
|
56
|
+
* delivery (background Bash spec §3, agent map spec §5.3, {@link wakeDecisionIn}): the run is
|
|
57
|
+
* then attributed to the event's trigger account and joins the tree's budget window, and an
|
|
58
|
+
* event inside the wake window schedules the delayed `bg-wake` job instead. A sub-agent's
|
|
59
|
+
* conversation is only woken this way ({@link childWakeIn}).
|
|
60
|
+
*
|
|
47
61
|
* 孤儿清理(R29,按需进行,没有定时器):已有的 queued / running 运行若 BullMQ 任务已不存在、
|
|
48
62
|
* 会话锁也无人持有(queued 的还要超过宽限期),说明没有任何 worker 会再执行它——写
|
|
49
63
|
* `run_failed { code: "run.orphaned" }` 把它标记为失败(consumed_seq 推进到它的触发消息),
|
|
@@ -52,9 +66,52 @@ export declare class RunQueue {
|
|
|
52
66
|
*
|
|
53
67
|
* agent 已软删除的会话不起新运行(孤儿清理照常进行)。
|
|
54
68
|
*/
|
|
55
|
-
ensureRun(conversationId: string
|
|
69
|
+
ensureRun(conversationId: string,
|
|
70
|
+
/** From the `bg-wake` job: it fired `wakeRetry - 1` times before its window ended. */
|
|
71
|
+
opts?: {
|
|
72
|
+
wakeRetry?: number;
|
|
73
|
+
}): Promise<string | null>;
|
|
56
74
|
/** {@link ensureRun}'s transaction: what it decided goes back through `st`. */
|
|
57
75
|
private ensureRunIn;
|
|
76
|
+
/**
|
|
77
|
+
* {@link ensureRunIn} for a sub-agent's conversation (agent map spec §5.3), under its row lock.
|
|
78
|
+
* Its runs from a task, or from a message to an idle sub-agent, are started by the dispatch
|
|
79
|
+
* (`Agent`, `SendMessage`), which also records the dispatch. Here it is started from a parent's
|
|
80
|
+
* message that reached its run after that run's last model call (agent map spec §10: a message
|
|
81
|
+
* racing the run's end starts a new run, never lost); and it is woken by its own background
|
|
82
|
+
* task's finish or a delivery from its own sub-agent, under the same rules as a chat
|
|
83
|
+
* conversation. Neither happens once its last run was stopped (`aborted`): a stopped sub-agent is
|
|
84
|
+
* started again only by its parent. Both read the queue and the trigger account's access on the root
|
|
85
|
+
* of its tree; a message needs no wake setting and has no wake window. The run counts against
|
|
86
|
+
* the root's budget window and runs on the sub-agent queue under `runJobId(child, boundary
|
|
87
|
+
* seq)`. An active run is left to the orphan repair after the commit (`repairRunId`), never
|
|
88
|
+
* started past.
|
|
89
|
+
*/
|
|
90
|
+
private childWakeIn;
|
|
91
|
+
/**
|
|
92
|
+
* The newest unconsumed message of an idle sub-agent (a `SendMessage` its last run did not absorb)
|
|
93
|
+
* as a run boundary, or null: none; the root's queue is paused or the root deleted (the
|
|
94
|
+
* message waits for the unpause, {@link wakeHeldTree}); or its author can no longer send to the
|
|
95
|
+
* root (it waits for a later run). The caller already refused a stopped sub-agent (last run
|
|
96
|
+
* `aborted`): a message that reached it while running and then stopped is parked, and the next
|
|
97
|
+
* run its parent starts absorbs it. Called under the sub-agent's row lock.
|
|
98
|
+
*/
|
|
99
|
+
private pendingMessageIn;
|
|
100
|
+
/**
|
|
101
|
+
* Re-derives the wakes a paused root held for its tree (agent map spec §5.3: a paused root queue
|
|
102
|
+
* holds the wakes of the whole tree): after the root's queue is unpaused, {@link ensureRun} on
|
|
103
|
+
* every sub-agent conversation below it that has an unconsumed wake event or message and no
|
|
104
|
+
* active run (the root itself is the caller's own `ensureRun`). Errors are logged; the next
|
|
105
|
+
* event, run end or page opening of that conversation re-derives its wake.
|
|
106
|
+
*/
|
|
107
|
+
wakeHeldTree(rootId: string): Promise<void>;
|
|
108
|
+
/**
|
|
109
|
+
* Schedules the delayed `bg-wake` job at the end of the conversation's wake window (after the
|
|
110
|
+
* commit): one job per conversation and window end, so finishes inside one window share it. It
|
|
111
|
+
* calls {@link ensureRun}, which wakes the conversation if a finish is still unconsumed. A failed
|
|
112
|
+
* enqueue is logged: the next message, run end or page opening re-derives the wake.
|
|
113
|
+
*/
|
|
114
|
+
private scheduleWake;
|
|
58
115
|
/**
|
|
59
116
|
* Enqueues a run job under the caller's job id (resumes, dispatches, repairs), with the same
|
|
60
117
|
* options as {@link ensureRun} (see {@link RunJobs.enqueue}).
|
|
@@ -8,11 +8,15 @@ var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
|
8
8
|
return function (target, key) { decorator(target, key, paramIndex); }
|
|
9
9
|
};
|
|
10
10
|
import { randomUUID } from "node:crypto";
|
|
11
|
+
import { getQueueToken } from "@nestjs/bullmq";
|
|
11
12
|
import { Inject, Injectable } from "@nestjs/common";
|
|
12
13
|
import { sql } from "kysely";
|
|
13
14
|
import { visibleTo } from "../agents/agent-lookup.js";
|
|
15
|
+
import { BG_WAKE_JOB, bgWakeJobId, wakeDecisionIn, } from "../background/wake-rules.js";
|
|
14
16
|
import { EventLog } from "../conversations/event-log.js";
|
|
15
17
|
import { dispatchQueuedIn, pauseQueueWith } from "../conversations/queue.js";
|
|
18
|
+
import { conversationTree } from "../conversations/tree.js";
|
|
19
|
+
import { KernelConfigService } from "../infra/config/kernel-config.service.js";
|
|
16
20
|
import { KernelDb } from "../infra/database/kernel-db.js";
|
|
17
21
|
import { TransactionHost } from "../infra/database/transaction-host.js";
|
|
18
22
|
import { Transactional } from "../infra/database/transactional.decorator.js";
|
|
@@ -21,14 +25,23 @@ import { KERNEL_LOGGER } from "../infra/tokens.js";
|
|
|
21
25
|
import { ToolPipeline } from "../tools/pipeline.js";
|
|
22
26
|
import { KyselyCheckpointSaver } from "./checkpointer.js";
|
|
23
27
|
import { ConversationLock } from "./conversation-lock.js";
|
|
28
|
+
import { MAINTENANCE_QUEUE_NAME } from "./maintenance-queue.js";
|
|
24
29
|
import { notifyFinished, RunFinish } from "./run-finish.js";
|
|
25
30
|
import { ACTIVE_RUN_STATUSES, RunJobs, runJobId, runQueueNameFor, } from "./run-jobs.js";
|
|
31
|
+
import { rootConversationOf } from "./subagents/child.js";
|
|
32
|
+
import { budgetWindowOf } from "./subagents/limits.js";
|
|
26
33
|
export { ACTIVE_RUN_STATUSES, RUN_QUEUE_NAME, runJobId, runQueueNameFor, SUBAGENT_RUN_QUEUE_NAME, } from "./run-jobs.js";
|
|
27
34
|
/**
|
|
28
35
|
* queued 运行的宽限期(秒):`ensureRun` / 续跑先提交 runs 行、再投递任务,两步之间任务暂时不存在;
|
|
29
36
|
* 只有进入 queued 超过这么久(`COALESCE(queued_at, created_at)`)仍没有任务的 queued 行才视为孤儿。
|
|
30
37
|
*/
|
|
31
38
|
const ORPHAN_QUEUED_GRACE_SECONDS = 30;
|
|
39
|
+
/**
|
|
40
|
+
* Margin added to the delayed wake job: its window is read on the database's clock, the delay runs
|
|
41
|
+
* on this process's and Redis's, so the job does not usually fire just before the window ends (one
|
|
42
|
+
* that does reschedules itself under its next retry id, `bgWakeJobId`).
|
|
43
|
+
*/
|
|
44
|
+
const WAKE_JOB_MARGIN_MS = 1000;
|
|
32
45
|
/**
|
|
33
46
|
* 运行队列(生产方):`ensureRun` 在会话有未消费的用户消息、且没有进行中的运行时插入 `runs` 行并投递任务。
|
|
34
47
|
* 「是否已有运行」以 PG 为准(会话行锁内检查 `runs` 中的 queued / running),并参考会话锁的持有者;
|
|
@@ -45,11 +58,15 @@ let RunQueue = class RunQueue {
|
|
|
45
58
|
events;
|
|
46
59
|
log;
|
|
47
60
|
txHost;
|
|
61
|
+
config;
|
|
62
|
+
maintenance;
|
|
48
63
|
constructor(kdb, eventLog, lock, jobs, finisher,
|
|
49
64
|
/** 运行以孤儿结束(标记失败 / 直接中止)后删除它的 checkpoint thread(thread_id = runId)。 */
|
|
50
65
|
checkpoints,
|
|
51
66
|
/** The run's open `Agent` call results, in the orphan repair's transaction (sub-agents spec §12). */
|
|
52
|
-
pipeline, events, log, txHost
|
|
67
|
+
pipeline, events, log, txHost, config,
|
|
68
|
+
/** The producer side of the delayed `bg-wake` job (`MaintenanceProcessor` consumes it). */
|
|
69
|
+
maintenance) {
|
|
53
70
|
this.kdb = kdb;
|
|
54
71
|
this.eventLog = eventLog;
|
|
55
72
|
this.lock = lock;
|
|
@@ -60,6 +77,8 @@ let RunQueue = class RunQueue {
|
|
|
60
77
|
this.events = events;
|
|
61
78
|
this.log = log;
|
|
62
79
|
this.txHost = txHost;
|
|
80
|
+
this.config = config;
|
|
81
|
+
this.maintenance = maintenance;
|
|
63
82
|
}
|
|
64
83
|
get db() {
|
|
65
84
|
return this.kdb.db;
|
|
@@ -81,6 +100,13 @@ let RunQueue = class RunQueue {
|
|
|
81
100
|
* 有未消费的用户消息(最新 user_message 的 seq > `consumed_seq`)、会话锁无人持有、
|
|
82
101
|
* 且没有 queued / running / waiting 的运行时:插入 `runs`(queued)并投递任务,返回 runId;否则返回 null。
|
|
83
102
|
*
|
|
103
|
+
* The boundary (`trigger_seq`) is that newest message; with none unconsumed, the queue's head
|
|
104
|
+
* once it is sent; with no head either, a wake-eligible finished background task or sub-agent
|
|
105
|
+
* delivery (background Bash spec §3, agent map spec §5.3, {@link wakeDecisionIn}): the run is
|
|
106
|
+
* then attributed to the event's trigger account and joins the tree's budget window, and an
|
|
107
|
+
* event inside the wake window schedules the delayed `bg-wake` job instead. A sub-agent's
|
|
108
|
+
* conversation is only woken this way ({@link childWakeIn}).
|
|
109
|
+
*
|
|
84
110
|
* 孤儿清理(R29,按需进行,没有定时器):已有的 queued / running 运行若 BullMQ 任务已不存在、
|
|
85
111
|
* 会话锁也无人持有(queued 的还要超过宽限期),说明没有任何 worker 会再执行它——写
|
|
86
112
|
* `run_failed { code: "run.orphaned" }` 把它标记为失败(consumed_seq 推进到它的触发消息),
|
|
@@ -89,7 +115,9 @@ let RunQueue = class RunQueue {
|
|
|
89
115
|
*
|
|
90
116
|
* agent 已软删除的会话不起新运行(孤儿清理照常进行)。
|
|
91
117
|
*/
|
|
92
|
-
async ensureRun(conversationId
|
|
118
|
+
async ensureRun(conversationId,
|
|
119
|
+
/** From the `bg-wake` job: it fired `wakeRetry - 1` times before its window ended. */
|
|
120
|
+
opts = {}) {
|
|
93
121
|
if ((await this.lock.holder(conversationId)) !== null)
|
|
94
122
|
return null;
|
|
95
123
|
const st = {
|
|
@@ -97,11 +125,23 @@ let RunQueue = class RunQueue {
|
|
|
97
125
|
orphanRunId: null,
|
|
98
126
|
dispatchedSeq: null,
|
|
99
127
|
dispatchedSwitch: false,
|
|
128
|
+
dispatchedUnarchived: false,
|
|
100
129
|
pausedNow: false,
|
|
101
130
|
orphanStop: undefined,
|
|
131
|
+
wakeLater: null,
|
|
132
|
+
repairRunId: null,
|
|
102
133
|
};
|
|
103
134
|
const created = await this.ensureRunIn(conversationId, st);
|
|
135
|
+
if (st.repairRunId !== null) {
|
|
136
|
+
// a sub-agent's run nobody runs any more: requeued when queued, failed when running (its
|
|
137
|
+
// finish then reaches the parent through the wait sweep's undelivered repair)
|
|
138
|
+
await this.repairOrphan(conversationId, st.repairRunId);
|
|
139
|
+
}
|
|
140
|
+
if (st.wakeLater !== null) {
|
|
141
|
+
await this.scheduleWake(conversationId, st.wakeLater, opts.wakeRetry ?? 0);
|
|
142
|
+
}
|
|
104
143
|
const { orphanSeq, orphanRunId, dispatchedSeq, dispatchedSwitch, pausedNow, orphanStop } = st;
|
|
144
|
+
const { dispatchedUnarchived } = st;
|
|
105
145
|
if (orphanSeq !== null) {
|
|
106
146
|
await notifyFinished(this.eventLog, conversationId, orphanSeq, "failed");
|
|
107
147
|
orphanStop?.fire();
|
|
@@ -114,6 +154,8 @@ let RunQueue = class RunQueue {
|
|
|
114
154
|
await this.eventLog.publishChanged(conversationId, "queue");
|
|
115
155
|
if (dispatchedSwitch)
|
|
116
156
|
await this.eventLog.publishChanged(conversationId, "selection");
|
|
157
|
+
if (dispatchedUnarchived)
|
|
158
|
+
await this.eventLog.publishChanged(conversationId, "archived");
|
|
117
159
|
}
|
|
118
160
|
if (orphanRunId !== null) {
|
|
119
161
|
await this.dropCheckpoints(orphanRunId);
|
|
@@ -124,10 +166,10 @@ let RunQueue = class RunQueue {
|
|
|
124
166
|
}
|
|
125
167
|
if (!created)
|
|
126
168
|
return null;
|
|
127
|
-
const { runId, jobId } = created;
|
|
169
|
+
const { runId, jobId, kind } = created;
|
|
128
170
|
try {
|
|
129
|
-
const queue = this.jobs.queue();
|
|
130
|
-
await this.jobs.
|
|
171
|
+
const queue = this.jobs.queue(runQueueNameFor(kind));
|
|
172
|
+
await this.jobs.enqueue({ runId, conversationId }, jobId, kind);
|
|
131
173
|
// 从 Redis 读回核对:检查与 add 之间出现了同 jobId 的任务时 add 被静默忽略,撤销本次插入,
|
|
132
174
|
// 不留下没有任务的 queued 行。读不到说明任务已被领取并移除(只可能是本次投递的),不撤销。
|
|
133
175
|
const stored = await queue.getJob(jobId);
|
|
@@ -153,14 +195,27 @@ let RunQueue = class RunQueue {
|
|
|
153
195
|
const t = this.db;
|
|
154
196
|
const conv = await t
|
|
155
197
|
.selectFrom("conversations")
|
|
156
|
-
.select([
|
|
198
|
+
.select([
|
|
199
|
+
"consumed_seq",
|
|
200
|
+
"org_id",
|
|
201
|
+
"agent_id",
|
|
202
|
+
"kind",
|
|
203
|
+
"queue_paused",
|
|
204
|
+
"account_id",
|
|
205
|
+
"deleted_at",
|
|
206
|
+
])
|
|
157
207
|
.where("id", "=", conversationId)
|
|
158
208
|
.forUpdate()
|
|
159
209
|
.executeTakeFirst();
|
|
160
210
|
// 评测回放的隐藏对话:运行由评测 worker 在里面直接驱动(工具只回放记录),绝不为它起真实运行
|
|
161
|
-
if (conv?.kind !== "chat")
|
|
211
|
+
if (conv?.kind !== "chat" && conv?.kind !== "subagent")
|
|
212
|
+
return null;
|
|
213
|
+
// A deleted conversation starts no run, whatever is still unconsumed or queued
|
|
214
|
+
if (conv.deleted_at !== null)
|
|
162
215
|
return null;
|
|
163
|
-
|
|
216
|
+
if (conv.kind === "subagent")
|
|
217
|
+
return this.childWakeIn(conversationId, conv, st);
|
|
218
|
+
const newest = await t
|
|
164
219
|
.selectFrom("conversation_events")
|
|
165
220
|
.select(["seq", "payload"])
|
|
166
221
|
.where("conversation_id", "=", conversationId)
|
|
@@ -168,11 +223,27 @@ let RunQueue = class RunQueue {
|
|
|
168
223
|
.orderBy("seq", "desc")
|
|
169
224
|
.limit(1)
|
|
170
225
|
.executeTakeFirst();
|
|
171
|
-
|
|
226
|
+
/** The boundary is a wake event: the run joins the tree's budget window (agent map §6). */
|
|
227
|
+
let isWake = false;
|
|
228
|
+
/** The run's boundary: its `trigger_seq` and the account it runs as. */
|
|
229
|
+
let last = newest && {
|
|
230
|
+
seq: newest.seq,
|
|
231
|
+
accountId: newest.payload.authorAccountId,
|
|
232
|
+
};
|
|
233
|
+
const idleActive = !last || Number(last.seq) <= Number(conv.consumed_seq)
|
|
234
|
+
? await this.activeRun(t, conversationId)
|
|
235
|
+
: undefined;
|
|
236
|
+
if (idleActive && Number(idleActive.trigger_seq) > Number(conv.consumed_seq)) {
|
|
237
|
+
// No unconsumed message, but a run whose boundary is not consumed yet (a wake run, whose
|
|
238
|
+
// boundary is a finished background task or a sub-agent's delivery): it goes through the
|
|
239
|
+
// orphan check below with that boundary, as a message's run does
|
|
240
|
+
last = { seq: idleActive.trigger_seq, accountId: idleActive.trigger_account_id };
|
|
241
|
+
}
|
|
242
|
+
else if (!last || Number(last.seq) <= Number(conv.consumed_seq)) {
|
|
172
243
|
// Nothing unconsumed: the queue's head goes out when the conversation is idle (no active
|
|
173
244
|
// run, which includes runs waiting for approval or an answer) and the queue is not paused.
|
|
174
245
|
// Interjections are always unconsumed messages, so the queue never jumps ahead of them.
|
|
175
|
-
if (conv.queue_paused ||
|
|
246
|
+
if (conv.queue_paused || idleActive)
|
|
176
247
|
return null;
|
|
177
248
|
const owner = await t
|
|
178
249
|
.selectFrom("agents")
|
|
@@ -187,32 +258,47 @@ let RunQueue = class RunQueue {
|
|
|
187
258
|
.where("conversation_id", "=", conversationId)
|
|
188
259
|
.limit(1)
|
|
189
260
|
.executeTakeFirst();
|
|
190
|
-
if (
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
261
|
+
if (head) {
|
|
262
|
+
// A queued message may wait for hours: it goes out only while its author can still use
|
|
263
|
+
// the conversation (active, a member, the agent visible to them; the isAccessible rule).
|
|
264
|
+
// Otherwise the queue pauses instead of posting as someone who lost access.
|
|
265
|
+
if (!(await authorCanSend(t, conversationId, conv.account_id))) {
|
|
266
|
+
await pauseQueueWith(t, conversationId, "author_cannot_send");
|
|
267
|
+
st.pausedNow = true;
|
|
268
|
+
this.log.warn("queued message not sent: its author can no longer use the conversation", {
|
|
269
|
+
conversationId,
|
|
270
|
+
});
|
|
271
|
+
return null;
|
|
272
|
+
}
|
|
273
|
+
const sent = await dispatchQueuedIn(t, this.eventLog, conversationId);
|
|
274
|
+
if (!sent)
|
|
275
|
+
return null;
|
|
276
|
+
if ("paused" in sent) {
|
|
277
|
+
st.pausedNow = true;
|
|
278
|
+
this.log.warn("queued skill invocation not sent: the skill can no longer be invoked", {
|
|
279
|
+
conversationId,
|
|
280
|
+
});
|
|
281
|
+
return null;
|
|
282
|
+
}
|
|
283
|
+
st.dispatchedSeq = sent.event.seq;
|
|
284
|
+
st.dispatchedSwitch = sent.switched;
|
|
285
|
+
st.dispatchedUnarchived = sent.unarchived;
|
|
286
|
+
last = {
|
|
287
|
+
seq: String(sent.event.seq),
|
|
288
|
+
accountId: sent.event.payload.authorAccountId,
|
|
289
|
+
};
|
|
202
290
|
}
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
291
|
+
else {
|
|
292
|
+
// Nothing queued either: a finished background task may wake the idle conversation
|
|
293
|
+
// (background Bash spec §3; a person's message or the queue always goes first)
|
|
294
|
+
const wake = await wakeDecisionIn(t, { id: conversationId, orgId: conv.org_id, rootId: conversationId }, Number(conv.consumed_seq), this.config.get().runtime.wakeOnBackgroundTask, (accountId) => authorCanSend(t, conversationId, accountId));
|
|
295
|
+
if (wake?.kind === "later")
|
|
296
|
+
st.wakeLater = wake;
|
|
297
|
+
if (wake?.kind !== "wake")
|
|
298
|
+
return null;
|
|
299
|
+
last = { seq: String(wake.seq), accountId: wake.triggerAccountId };
|
|
300
|
+
isWake = true;
|
|
212
301
|
}
|
|
213
|
-
st.dispatchedSeq = sent.event.seq;
|
|
214
|
-
st.dispatchedSwitch = sent.switched;
|
|
215
|
-
last = { seq: String(sent.event.seq), payload: sent.event.payload };
|
|
216
302
|
}
|
|
217
303
|
const active = await this.activeRun(t, conversationId);
|
|
218
304
|
if (active) {
|
|
@@ -254,7 +340,9 @@ let RunQueue = class RunQueue {
|
|
|
254
340
|
.orderBy("seq")
|
|
255
341
|
.limit(1)
|
|
256
342
|
.executeTakeFirst();
|
|
257
|
-
const trigger = fork
|
|
343
|
+
const trigger = fork
|
|
344
|
+
? { seq: fork.seq, accountId: fork.payload.authorAccountId }
|
|
345
|
+
: last;
|
|
258
346
|
// BullMQ 对重复的 jobId 静默忽略(add 返回的 Job 由调用方数据构造,看不出是否真的入队):
|
|
259
347
|
// 先显式查同一触发点的任务;仍存在(例如属于刚结束、尚未从队列移除的运行)就不插入 runs 行。
|
|
260
348
|
const jobId = runJobId(conversationId, Number(trigger.seq));
|
|
@@ -283,11 +371,193 @@ let RunQueue = class RunQueue {
|
|
|
283
371
|
conversation_id: conversationId,
|
|
284
372
|
status: "queued",
|
|
285
373
|
agent_version: agent.current_version,
|
|
286
|
-
trigger_account_id: trigger.
|
|
374
|
+
trigger_account_id: trigger.accountId,
|
|
287
375
|
trigger_seq: Number(trigger.seq),
|
|
376
|
+
// a chat conversation always has its person-triggered run before any wake (a wake event
|
|
377
|
+
// comes from a run of it or of its tree); null would only make the wake run its own window
|
|
378
|
+
budget_run_id: isWake ? await budgetWindowOf(t, conversationId) : null,
|
|
379
|
+
})
|
|
380
|
+
.execute();
|
|
381
|
+
return { runId, jobId, kind: "chat" };
|
|
382
|
+
}
|
|
383
|
+
/**
|
|
384
|
+
* {@link ensureRunIn} for a sub-agent's conversation (agent map spec §5.3), under its row lock.
|
|
385
|
+
* Its runs from a task, or from a message to an idle sub-agent, are started by the dispatch
|
|
386
|
+
* (`Agent`, `SendMessage`), which also records the dispatch. Here it is started from a parent's
|
|
387
|
+
* message that reached its run after that run's last model call (agent map spec §10: a message
|
|
388
|
+
* racing the run's end starts a new run, never lost); and it is woken by its own background
|
|
389
|
+
* task's finish or a delivery from its own sub-agent, under the same rules as a chat
|
|
390
|
+
* conversation. Neither happens once its last run was stopped (`aborted`): a stopped sub-agent is
|
|
391
|
+
* started again only by its parent. Both read the queue and the trigger account's access on the root
|
|
392
|
+
* of its tree; a message needs no wake setting and has no wake window. The run counts against
|
|
393
|
+
* the root's budget window and runs on the sub-agent queue under `runJobId(child, boundary
|
|
394
|
+
* seq)`. An active run is left to the orphan repair after the commit (`repairRunId`), never
|
|
395
|
+
* started past.
|
|
396
|
+
*/
|
|
397
|
+
async childWakeIn(conversationId, conv, st) {
|
|
398
|
+
const t = this.db;
|
|
399
|
+
const active = await this.activeRun(t, conversationId);
|
|
400
|
+
if (active) {
|
|
401
|
+
if (active.status !== "waiting")
|
|
402
|
+
st.repairRunId = active.id;
|
|
403
|
+
return null;
|
|
404
|
+
}
|
|
405
|
+
// a stopped sub-agent (its last run `aborted`: a person's or a tree stop) stays stopped: no
|
|
406
|
+
// message, task finish or delivery that reached it before or during the stop wakes it (a
|
|
407
|
+
// descendant's report that landed just before the stop would otherwise restart the stopped
|
|
408
|
+
// branch); they are parked for its next run, which only its parent starts (`Agent`,
|
|
409
|
+
// `SendMessage`)
|
|
410
|
+
const last = await t
|
|
411
|
+
.selectFrom("runs")
|
|
412
|
+
.select("status")
|
|
413
|
+
.where("conversation_id", "=", conversationId)
|
|
414
|
+
.orderBy("created_at", "desc")
|
|
415
|
+
.orderBy("id", "desc")
|
|
416
|
+
.limit(1)
|
|
417
|
+
.executeTakeFirst();
|
|
418
|
+
if (last?.status === "aborted")
|
|
419
|
+
return null;
|
|
420
|
+
const rootId = await rootConversationOf(t, conversationId);
|
|
421
|
+
const wake = (await this.pendingMessageIn(conversationId, Number(conv.consumed_seq), rootId)) ??
|
|
422
|
+
(await wakeDecisionIn(t, { id: conversationId, orgId: conv.org_id, rootId }, Number(conv.consumed_seq), this.config.get().runtime.wakeOnBackgroundTask, (accountId) => authorCanSend(t, rootId, accountId)));
|
|
423
|
+
if (wake?.kind === "later")
|
|
424
|
+
st.wakeLater = wake;
|
|
425
|
+
if (wake?.kind !== "wake")
|
|
426
|
+
return null;
|
|
427
|
+
const jobId = runJobId(conversationId, wake.seq);
|
|
428
|
+
const existing = await this.jobs.getJob(jobId, runQueueNameFor("subagent"));
|
|
429
|
+
if (existing) {
|
|
430
|
+
this.log.warn("run job for this trigger already exists; not enqueuing", {
|
|
431
|
+
conversationId,
|
|
432
|
+
jobId,
|
|
433
|
+
existingRunId: existing.data?.runId,
|
|
434
|
+
});
|
|
435
|
+
return null;
|
|
436
|
+
}
|
|
437
|
+
const agent = await t
|
|
438
|
+
.selectFrom("agents")
|
|
439
|
+
.select(["current_version", "deleted_at"])
|
|
440
|
+
.where("id", "=", conv.agent_id)
|
|
441
|
+
.executeTakeFirstOrThrow();
|
|
442
|
+
if (agent.deleted_at !== null)
|
|
443
|
+
return null;
|
|
444
|
+
// a sub-agent runs its definition frozen at dispatch: its runs keep the version recorded then
|
|
445
|
+
const previous = await t
|
|
446
|
+
.selectFrom("runs")
|
|
447
|
+
.select("agent_version")
|
|
448
|
+
.where("conversation_id", "=", conversationId)
|
|
449
|
+
.orderBy("created_at", "desc")
|
|
450
|
+
.limit(1)
|
|
451
|
+
.executeTakeFirst();
|
|
452
|
+
const runId = randomUUID();
|
|
453
|
+
await t
|
|
454
|
+
.insertInto("runs")
|
|
455
|
+
.values({
|
|
456
|
+
id: runId,
|
|
457
|
+
conversation_id: conversationId,
|
|
458
|
+
status: "queued",
|
|
459
|
+
agent_version: previous?.agent_version ?? agent.current_version,
|
|
460
|
+
trigger_account_id: wake.triggerAccountId,
|
|
461
|
+
trigger_seq: wake.seq,
|
|
462
|
+
budget_run_id: await budgetWindowOf(t, rootId),
|
|
288
463
|
})
|
|
289
464
|
.execute();
|
|
290
|
-
return { runId, jobId };
|
|
465
|
+
return { runId, jobId, kind: "subagent" };
|
|
466
|
+
}
|
|
467
|
+
/**
|
|
468
|
+
* The newest unconsumed message of an idle sub-agent (a `SendMessage` its last run did not absorb)
|
|
469
|
+
* as a run boundary, or null: none; the root's queue is paused or the root deleted (the
|
|
470
|
+
* message waits for the unpause, {@link wakeHeldTree}); or its author can no longer send to the
|
|
471
|
+
* root (it waits for a later run). The caller already refused a stopped sub-agent (last run
|
|
472
|
+
* `aborted`): a message that reached it while running and then stopped is parked, and the next
|
|
473
|
+
* run its parent starts absorbs it. Called under the sub-agent's row lock.
|
|
474
|
+
*/
|
|
475
|
+
async pendingMessageIn(conversationId, consumed, rootId) {
|
|
476
|
+
const t = this.db;
|
|
477
|
+
const message = await t
|
|
478
|
+
.selectFrom("conversation_events")
|
|
479
|
+
.select(["seq", "payload"])
|
|
480
|
+
.where("conversation_id", "=", conversationId)
|
|
481
|
+
.where("type", "=", "user_message")
|
|
482
|
+
.where("seq", ">", String(consumed))
|
|
483
|
+
.orderBy("seq", "desc")
|
|
484
|
+
.limit(1)
|
|
485
|
+
.executeTakeFirst();
|
|
486
|
+
if (!message)
|
|
487
|
+
return null;
|
|
488
|
+
const root = await t
|
|
489
|
+
.selectFrom("conversations")
|
|
490
|
+
.select(["queue_paused", "deleted_at"])
|
|
491
|
+
.where("id", "=", rootId)
|
|
492
|
+
.executeTakeFirst();
|
|
493
|
+
if (!root || root.queue_paused || root.deleted_at !== null)
|
|
494
|
+
return null;
|
|
495
|
+
const accountId = message.payload.authorAccountId;
|
|
496
|
+
if (!(await authorCanSend(t, rootId, accountId)))
|
|
497
|
+
return null;
|
|
498
|
+
return { kind: "wake", seq: Number(message.seq), triggerAccountId: accountId };
|
|
499
|
+
}
|
|
500
|
+
/**
|
|
501
|
+
* Re-derives the wakes a paused root held for its tree (agent map spec §5.3: a paused root queue
|
|
502
|
+
* holds the wakes of the whole tree): after the root's queue is unpaused, {@link ensureRun} on
|
|
503
|
+
* every sub-agent conversation below it that has an unconsumed wake event or message and no
|
|
504
|
+
* active run (the root itself is the caller's own `ensureRun`). Errors are logged; the next
|
|
505
|
+
* event, run end or page opening of that conversation re-derives its wake.
|
|
506
|
+
*/
|
|
507
|
+
async wakeHeldTree(rootId) {
|
|
508
|
+
const ids = (await conversationTree(this.db, rootId))
|
|
509
|
+
.filter((c) => c.level > 0)
|
|
510
|
+
.map((c) => c.id);
|
|
511
|
+
if (ids.length === 0)
|
|
512
|
+
return;
|
|
513
|
+
const held = await this.db
|
|
514
|
+
.selectFrom("conversations as c")
|
|
515
|
+
.select("c.id")
|
|
516
|
+
.where("c.id", "in", ids)
|
|
517
|
+
.where("c.deleted_at", "is", null)
|
|
518
|
+
.where(({ exists, selectFrom }) => exists(selectFrom("conversation_events as e")
|
|
519
|
+
.select(sql `1`.as("one"))
|
|
520
|
+
.whereRef("e.conversation_id", "=", "c.id")
|
|
521
|
+
.where("e.type", "in", [
|
|
522
|
+
"background_task_finished",
|
|
523
|
+
"subagent_delivery",
|
|
524
|
+
"user_message",
|
|
525
|
+
])
|
|
526
|
+
.whereRef("e.seq", ">", "c.consumed_seq")))
|
|
527
|
+
.where(({ not, exists, selectFrom }) => not(exists(selectFrom("runs as r")
|
|
528
|
+
.select(sql `1`.as("one"))
|
|
529
|
+
.whereRef("r.conversation_id", "=", "c.id")
|
|
530
|
+
.where("r.status", "in", ACTIVE_RUN_STATUSES))))
|
|
531
|
+
.execute();
|
|
532
|
+
for (const c of held) {
|
|
533
|
+
try {
|
|
534
|
+
await this.ensureRun(c.id);
|
|
535
|
+
}
|
|
536
|
+
catch (err) {
|
|
537
|
+
this.log.warn("cannot wake a held sub-agent", { conversationId: c.id, err });
|
|
538
|
+
}
|
|
539
|
+
}
|
|
540
|
+
}
|
|
541
|
+
/**
|
|
542
|
+
* Schedules the delayed `bg-wake` job at the end of the conversation's wake window (after the
|
|
543
|
+
* commit): one job per conversation and window end, so finishes inside one window share it. It
|
|
544
|
+
* calls {@link ensureRun}, which wakes the conversation if a finish is still unconsumed. A failed
|
|
545
|
+
* enqueue is logged: the next message, run end or page opening re-derives the wake.
|
|
546
|
+
*/
|
|
547
|
+
async scheduleWake(conversationId, w, retry) {
|
|
548
|
+
const data = { conversationId, ...(retry > 0 && { retry }) };
|
|
549
|
+
try {
|
|
550
|
+
await this.maintenance.add(BG_WAKE_JOB, data, {
|
|
551
|
+
// a job that fired early reschedules under a new id (its own is still taken)
|
|
552
|
+
jobId: bgWakeJobId(conversationId, w.windowEnd, retry),
|
|
553
|
+
delay: w.delayMs + WAKE_JOB_MARGIN_MS,
|
|
554
|
+
removeOnComplete: true,
|
|
555
|
+
removeOnFail: true,
|
|
556
|
+
});
|
|
557
|
+
}
|
|
558
|
+
catch (err) {
|
|
559
|
+
this.log.error("cannot schedule the background task wake", { conversationId, err });
|
|
560
|
+
}
|
|
291
561
|
}
|
|
292
562
|
/**
|
|
293
563
|
* Enqueues a run job under the caller's job id (resumes, dispatches, repairs), with the same
|
|
@@ -407,6 +677,7 @@ let RunQueue = class RunQueue {
|
|
|
407
677
|
"id",
|
|
408
678
|
"status",
|
|
409
679
|
"trigger_seq",
|
|
680
|
+
"trigger_account_id",
|
|
410
681
|
"job_id",
|
|
411
682
|
sql `COALESCE(queued_at, created_at) < now() - make_interval(secs => ${ORPHAN_QUEUED_GRACE_SECONDS})`.as("past_grace"),
|
|
412
683
|
])
|
|
@@ -462,7 +733,9 @@ RunQueue = __decorate([
|
|
|
462
733
|
__param(6, Inject(ToolPipeline)),
|
|
463
734
|
__param(7, Inject(KernelEvents)),
|
|
464
735
|
__param(8, Inject(KERNEL_LOGGER)),
|
|
465
|
-
__param(9, Inject(TransactionHost))
|
|
736
|
+
__param(9, Inject(TransactionHost)),
|
|
737
|
+
__param(10, Inject(KernelConfigService)),
|
|
738
|
+
__param(11, Inject(getQueueToken(MAINTENANCE_QUEUE_NAME)))
|
|
466
739
|
], RunQueue);
|
|
467
740
|
export { RunQueue };
|
|
468
741
|
/** The conversation's owner is active and can still see its agent (`isAccessible`'s rule). */
|
|
@@ -14,6 +14,7 @@ import { KyselyCheckpointSaver } from "./checkpointer.js";
|
|
|
14
14
|
import { ConversationLock } from "./conversation-lock.js";
|
|
15
15
|
import { ProviderRegistry } from "./providers.js";
|
|
16
16
|
import { type OrgQuota } from "./quota.js";
|
|
17
|
+
import { RunDrafts } from "./run-drafts.js";
|
|
17
18
|
import { RunFinish } from "./run-finish.js";
|
|
18
19
|
import type { RunJobData } from "./run-jobs.js";
|
|
19
20
|
import { RunQueue } from "./run-queue.js";
|
|
@@ -70,6 +71,8 @@ export declare class RunWorker {
|
|
|
70
71
|
private readonly pipeline;
|
|
71
72
|
private readonly finisher;
|
|
72
73
|
readonly txHost: TransactionHost;
|
|
74
|
+
/** The steps' live drafts this process writes for the runs it executes. */
|
|
75
|
+
private readonly drafts;
|
|
73
76
|
private readonly hooks?;
|
|
74
77
|
/** The two run queues' BullMQ workers (spec §7.4), once {@link start}ed on the worker role. */
|
|
75
78
|
private workers;
|
|
@@ -84,7 +87,7 @@ export declare class RunWorker {
|
|
|
84
87
|
/** 运行到达终态后删除该运行(thread_id = runId)的 checkpoint thread(只用于续跑,结束后无用)。 */
|
|
85
88
|
checkpoints: Pick<KyselyCheckpointSaver, "deleteThread">,
|
|
86
89
|
/** loop 返回 `suspended` 后把运行置为 waiting(释放会话锁与配额之后); the child lifecycle. */
|
|
87
|
-
waits: Pick<Waits, "suspend" | "childFinished" | "stopChildren">,
|
|
90
|
+
waits: Pick<Waits, "suspend" | "childFinished" | "stopChildren" | "stopDescendantsOfStopped">,
|
|
88
91
|
/** `run.started` (the channel outbound enqueues the conversation's IM delivery). */
|
|
89
92
|
events: KernelEvents,
|
|
90
93
|
/** A completed run enqueues the conversation's title job. */
|
|
@@ -98,7 +101,9 @@ export declare class RunWorker {
|
|
|
98
101
|
* (`stopOpenAgentCalls`; a no-op without dispatches); `fire` runs their observe hooks after the
|
|
99
102
|
* commit (sub-agents spec §12, review m1: a failed or stalled parent too).
|
|
100
103
|
*/
|
|
101
|
-
pipeline: Pick<ToolPipeline, "stopOpenAgentCalls">, finisher: Pick<RunFinish, "finish">, txHost: TransactionHost,
|
|
104
|
+
pipeline: Pick<ToolPipeline, "stopOpenAgentCalls">, finisher: Pick<RunFinish, "finish">, txHost: TransactionHost,
|
|
105
|
+
/** The steps' live drafts this process writes for the runs it executes. */
|
|
106
|
+
drafts: RunDrafts, hooks?: RunHooks | undefined);
|
|
102
107
|
private get db();
|
|
103
108
|
/**
|
|
104
109
|
* Starts consuming (worker role only): `workers` are the `@Processor` workers of both run queues
|
|
@@ -119,13 +124,14 @@ export declare class RunWorker {
|
|
|
119
124
|
/** A job failed (the worker's `failed` event). */
|
|
120
125
|
onFailed(job: Job<RunJobData> | undefined, err: Error): void;
|
|
121
126
|
/**
|
|
122
|
-
*
|
|
123
|
-
*
|
|
127
|
+
* The run's stream sink: deltas on the conversation's topic (any replica's subscribers get them)
|
|
128
|
+
* and the steps' live drafts in Redis ({@link streamSink}, spec 2026-11-07 §3.2).
|
|
124
129
|
*/
|
|
125
130
|
private sinkFor;
|
|
126
131
|
/**
|
|
127
132
|
* After any terminal commit of a run that is not a sub-agent's (sub-agents spec §12): stops its
|
|
128
|
-
* active
|
|
133
|
+
* active fork invocation child on its behalf (no account); background `Agent` children keep
|
|
134
|
+
* running (agent map spec §5.4). The wait sweep is the backstop.
|
|
129
135
|
*/
|
|
130
136
|
private stopChildren;
|
|
131
137
|
/**
|