@capybara-hq/kernel 0.1.0-rc.1 → 0.1.0-rc.11
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 +85 -5
- package/dist/admin/admin.controller.d.ts +52 -71
- package/dist/admin/admin.controller.js +117 -63
- package/dist/admin/admin.module.d.ts +3 -0
- package/dist/admin/admin.module.js +22 -0
- package/dist/admin/admin.schemas.d.ts +60 -0
- package/dist/admin/admin.schemas.js +50 -0
- package/dist/admin/extensions.controller.d.ts +47 -16
- package/dist/admin/extensions.controller.js +94 -23
- package/dist/admin/extensions.schemas.d.ts +7 -0
- package/dist/admin/extensions.schemas.js +10 -0
- package/dist/admin/limit-defaults.d.ts +20 -0
- package/dist/admin/limit-defaults.js +10 -0
- package/dist/admin/setup-lock.d.ts +16 -0
- package/dist/admin/setup-lock.js +47 -0
- package/dist/admin/setup.controller.d.ts +9 -9
- package/dist/admin/setup.controller.js +28 -26
- package/dist/admin/setup.service.d.ts +20 -28
- package/dist/admin/setup.service.js +65 -65
- package/dist/agents/agent-lookup.d.ts +72 -0
- package/dist/agents/agent-lookup.js +208 -0
- package/dist/agents/agent-profile.service.d.ts +31 -0
- package/dist/agents/agent-profile.service.js +122 -0
- package/dist/agents/agents.controller.d.ts +54 -169
- package/dist/agents/agents.controller.js +172 -37
- package/dist/agents/agents.module.d.ts +10 -0
- package/dist/agents/agents.module.js +71 -0
- package/dist/agents/agents.schemas.d.ts +389 -0
- package/dist/agents/agents.schemas.js +126 -0
- package/dist/agents/agents.service.d.ts +104 -76
- package/dist/agents/agents.service.js +509 -383
- package/dist/agents/definition.d.ts +133 -21
- package/dist/agents/definition.js +361 -41
- package/dist/agents/from-template.d.ts +106 -0
- package/dist/agents/from-template.js +680 -0
- package/dist/agents/from-template.service.d.ts +72 -0
- package/dist/agents/from-template.service.js +178 -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 +44 -6
- package/dist/agents/models.controller.js +84 -8
- package/dist/agents/org-templates.d.ts +186 -0
- package/dist/agents/org-templates.js +868 -0
- package/dist/agents/pending-connector-requests.d.ts +79 -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 +114 -0
- package/dist/agents/profile.js +55 -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 +78 -6
- package/dist/agents/templates.controller.js +154 -8
- package/dist/agents/templates.d.ts +132 -30
- package/dist/agents/templates.js +500 -46
- package/dist/agents/templates.schemas.d.ts +20 -0
- package/dist/agents/templates.schemas.js +45 -0
- package/dist/app.d.ts +93 -0
- package/dist/app.js +150 -0
- package/dist/background/background.controller.d.ts +38 -0
- package/dist/background/background.controller.js +88 -0
- package/dist/background/background.module.d.ts +10 -0
- package/dist/background/background.module.js +39 -0
- package/dist/background/background.schemas.d.ts +10 -0
- package/dist/background/background.schemas.js +16 -0
- package/dist/background/finish.d.ts +44 -0
- package/dist/background/finish.js +95 -0
- package/dist/background/launch-lock.d.ts +15 -0
- package/dist/background/launch-lock.js +40 -0
- package/dist/background/launch.d.ts +42 -0
- package/dist/background/launch.js +77 -0
- package/dist/background/poll.job.d.ts +56 -0
- package/dist/background/poll.job.js +195 -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 +80 -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 +244 -0
- package/dist/background/store.d.ts +167 -0
- package/dist/background/store.js +361 -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 +216 -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 +102 -52
- package/dist/catalog/admin-catalog.controller.js +222 -67
- package/dist/catalog/admin-catalog.schemas.d.ts +72 -0
- package/dist/catalog/admin-catalog.schemas.js +92 -0
- package/dist/catalog/catalog-content.d.ts +264 -0
- package/dist/catalog/catalog-content.js +430 -0
- package/dist/catalog/catalog-files.d.ts +41 -0
- package/dist/catalog/catalog-files.js +86 -0
- 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 +290 -0
- package/dist/catalog/catalog-items.js +677 -0
- package/dist/catalog/catalog-scope.service.d.ts +286 -0
- package/dist/catalog/catalog-scope.service.js +1196 -0
- package/dist/catalog/catalog.module.d.ts +12 -0
- package/dist/catalog/catalog.module.js +81 -0
- package/dist/catalog/catalog.service.d.ts +144 -207
- package/dist/catalog/catalog.service.js +258 -528
- package/dist/catalog/claude/agents.js +15 -10
- package/dist/catalog/claude/translate.js +3 -0
- package/dist/catalog/cli.d.ts +14 -3
- package/dist/catalog/cli.js +39 -32
- 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 +90 -0
- package/dist/catalog/component-scope.controller.js +234 -0
- package/dist/catalog/component-scope.schemas.d.ts +118 -0
- package/dist/catalog/component-scope.schemas.js +97 -0
- package/dist/catalog/component-scope.service.d.ts +366 -0
- package/dist/catalog/component-scope.service.js +1115 -0
- package/dist/catalog/component-state.d.ts +197 -0
- package/dist/catalog/component-state.js +473 -0
- package/dist/catalog/git-source.d.ts +9 -1
- package/dist/catalog/git-source.js +29 -2
- package/dist/catalog/job-ids.d.ts +45 -0
- package/dist/catalog/job-ids.js +40 -0
- package/dist/catalog/jobs.d.ts +27 -0
- package/dist/catalog/jobs.js +70 -0
- package/dist/catalog/locks.d.ts +24 -0
- package/dist/catalog/locks.js +63 -0
- package/dist/catalog/marketplace-fetch.d.ts +1 -1
- package/dist/catalog/marketplace-icons.d.ts +64 -0
- package/dist/catalog/marketplace-icons.js +131 -0
- package/dist/catalog/marketplaces.controller.d.ts +53 -44
- package/dist/catalog/marketplaces.controller.js +146 -51
- package/dist/catalog/marketplaces.schemas.d.ts +48 -0
- package/dist/catalog/marketplaces.schemas.js +53 -0
- package/dist/catalog/marketplaces.service.d.ts +136 -26
- package/dist/catalog/marketplaces.service.js +663 -281
- package/dist/catalog/org-catalog.controller.d.ts +115 -63
- package/dist/catalog/org-catalog.controller.js +207 -100
- package/dist/catalog/org-catalog.schemas.d.ts +88 -0
- package/dist/catalog/org-catalog.schemas.js +93 -0
- package/dist/catalog/org-catalog.service.d.ts +89 -216
- package/dist/catalog/org-catalog.service.js +434 -472
- 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 +113 -0
- package/dist/catalog/org-extension.controller.js +271 -0
- package/dist/catalog/org-extension.schemas.d.ts +15 -0
- package/dist/catalog/org-extension.schemas.js +22 -0
- package/dist/catalog/org-plugin-uploads.controller.d.ts +77 -0
- package/dist/catalog/org-plugin-uploads.controller.js +200 -0
- package/dist/catalog/org-plugin-uploads.d.ts +71 -0
- package/dist/catalog/org-plugin-uploads.js +122 -0
- package/dist/catalog/org-plugin-uploads.schemas.d.ts +20 -0
- package/dist/catalog/org-plugin-uploads.schemas.js +32 -0
- package/dist/catalog/owned-items.d.ts +188 -0
- package/dist/catalog/owned-items.js +808 -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 +243 -0
- package/dist/catalog/platform-components.js +872 -0
- package/dist/catalog/platform-migration.d.ts +115 -0
- package/dist/catalog/platform-migration.js +583 -0
- package/dist/catalog/plugin-import.d.ts +293 -71
- package/dist/catalog/plugin-import.js +1039 -281
- package/dist/catalog/plugin-install.d.ts +271 -66
- package/dist/catalog/plugin-install.js +1198 -344
- package/dist/catalog/plugin-package.d.ts +41 -4
- package/dist/catalog/plugin-package.js +140 -7
- package/dist/catalog/plugin-upgrade.d.ts +312 -188
- package/dist/catalog/plugin-upgrade.js +1371 -1065
- package/dist/catalog/request-rules.d.ts +65 -0
- package/dist/catalog/request-rules.js +217 -0
- package/dist/catalog/requests.service.d.ts +205 -117
- package/dist/catalog/requests.service.js +612 -369
- 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 +119 -0
- package/dist/channels/actions.d.ts +6 -4
- package/dist/channels/actions.js +11 -4
- package/dist/channels/cards.d.ts +33 -11
- package/dist/channels/cards.js +96 -24
- package/dist/channels/channels.module.d.ts +40 -0
- package/dist/channels/channels.module.js +130 -0
- package/dist/channels/channels.schemas.d.ts +37 -0
- package/dist/channels/channels.schemas.js +38 -0
- package/dist/channels/connections.controller.d.ts +44 -37
- package/dist/channels/connections.controller.js +83 -38
- package/dist/channels/connections.service.d.ts +101 -30
- package/dist/channels/connections.service.js +380 -147
- package/dist/channels/inbound.d.ts +44 -38
- package/dist/channels/inbound.js +190 -44
- package/dist/channels/job-ids.d.ts +10 -0
- package/dist/channels/job-ids.js +10 -0
- package/dist/channels/jobs.d.ts +85 -0
- package/dist/channels/jobs.js +157 -0
- package/dist/channels/outbound.d.ts +71 -80
- package/dist/channels/outbound.js +219 -202
- package/dist/channels/phrases.d.ts +33 -2
- package/dist/channels/phrases.js +29 -1
- package/dist/channels/supervisor.d.ts +88 -46
- package/dist/channels/supervisor.js +230 -132
- package/dist/channels/threads.d.ts +34 -8
- package/dist/channels/threads.js +79 -13
- package/dist/channels/webhook.d.ts +20 -14
- package/dist/channels/webhook.js +51 -20
- package/dist/config/docs.js +5 -1
- package/dist/config/load.d.ts +3 -2
- package/dist/config/load.js +3 -2
- package/dist/config/nacos-source.js +11 -2
- package/dist/config/schema.d.ts +36 -2
- package/dist/config/schema.js +226 -25
- package/dist/conversations/access.d.ts +31 -0
- package/dist/conversations/access.js +110 -0
- package/dist/conversations/agent-tree.d.ts +46 -0
- package/dist/conversations/agent-tree.js +92 -0
- package/dist/conversations/artifacts.d.ts +11 -11
- package/dist/conversations/artifacts.js +36 -10
- package/dist/conversations/attachments.controller.d.ts +1 -1
- package/dist/conversations/attachments.controller.js +8 -6
- package/dist/conversations/attachments.module.d.ts +7 -0
- package/dist/conversations/attachments.module.js +25 -0
- package/dist/conversations/attachments.service.d.ts +60 -22
- package/dist/conversations/attachments.service.js +249 -51
- package/dist/conversations/conversations.controller.d.ts +86 -50
- package/dist/conversations/conversations.controller.js +184 -103
- package/dist/conversations/conversations.module.d.ts +8 -0
- package/dist/conversations/conversations.module.js +72 -0
- package/dist/conversations/conversations.schemas.d.ts +52 -0
- package/dist/conversations/conversations.schemas.js +79 -0
- package/dist/conversations/conversations.service.d.ts +166 -49
- package/dist/conversations/conversations.service.js +383 -179
- package/dist/conversations/environment-status.d.ts +24 -0
- package/dist/conversations/environment-status.js +71 -0
- package/dist/conversations/event-log.d.ts +64 -27
- package/dist/conversations/event-log.js +167 -31
- package/dist/conversations/events.d.ts +252 -9
- package/dist/conversations/events.js +243 -32
- package/dist/conversations/files.d.ts +10 -10
- package/dist/conversations/files.js +37 -11
- package/dist/conversations/idem-keys.d.ts +5 -0
- package/dist/conversations/idem-keys.js +5 -0
- package/dist/conversations/job-ids.d.ts +6 -0
- package/dist/conversations/job-ids.js +6 -0
- package/dist/conversations/message-context.d.ts +79 -0
- package/dist/conversations/message-context.js +145 -0
- package/dist/conversations/outputs-read.d.ts +11 -11
- package/dist/conversations/outputs-read.js +31 -7
- package/dist/conversations/queue.d.ts +53 -58
- package/dist/conversations/queue.js +37 -293
- package/dist/conversations/queue.service.d.ts +60 -0
- package/dist/conversations/queue.service.js +350 -0
- package/dist/conversations/titles.d.ts +83 -27
- package/dist/conversations/titles.js +195 -71
- package/dist/conversations/tree.d.ts +17 -0
- package/dist/conversations/tree.js +42 -0
- package/dist/ctx/bus.js +9 -3
- package/dist/ctx/create-ctx.d.ts +26 -1
- package/dist/ctx/create-ctx.js +45 -16
- package/dist/ctx/lock.d.ts +7 -3
- package/dist/ctx/lock.js +9 -20
- package/dist/ctx/secrets.d.ts +10 -2
- package/dist/ctx/secrets.js +7 -3
- package/dist/db/kernel-schema.d.ts +589 -27
- package/dist/db/pool.d.ts +10 -0
- package/dist/db/pool.js +4 -0
- package/dist/devices/device-auth.controller.d.ts +42 -0
- package/dist/devices/device-auth.controller.js +116 -0
- package/dist/devices/device-auth.d.ts +119 -0
- package/dist/devices/device-auth.js +403 -0
- package/dist/devices/device-auth.module.d.ts +7 -0
- package/dist/devices/device-auth.module.js +25 -0
- package/dist/devices/device-gateway.d.ts +128 -0
- package/dist/devices/device-gateway.js +530 -0
- package/dist/devices/device-provider.d.ts +89 -0
- package/dist/devices/device-provider.js +151 -0
- package/dist/devices/device-routes.d.ts +36 -0
- package/dist/devices/device-routes.js +90 -0
- package/dist/devices/devices.module.d.ts +16 -0
- package/dist/devices/devices.module.js +44 -0
- package/dist/devices/dto.d.ts +66 -0
- package/dist/devices/dto.js +44 -0
- package/dist/devices/keys.d.ts +25 -0
- package/dist/devices/keys.js +25 -0
- package/dist/devices/machines.d.ts +118 -0
- package/dist/devices/machines.js +366 -0
- package/dist/devices/relay.d.ts +100 -0
- package/dist/devices/relay.js +373 -0
- package/dist/devices/targets.d.ts +28 -0
- package/dist/devices/targets.js +73 -0
- package/dist/environments/access.d.ts +66 -0
- package/dist/environments/access.js +113 -0
- package/dist/environments/conversation-environments.d.ts +75 -0
- package/dist/environments/conversation-environments.js +231 -0
- package/dist/environments/dto.d.ts +25 -0
- package/dist/environments/dto.js +12 -0
- package/dist/environments/environments.controller.d.ts +36 -0
- package/dist/environments/environments.controller.js +124 -0
- package/dist/environments/environments.module.d.ts +8 -0
- package/dist/environments/environments.module.js +31 -0
- package/dist/environments/environments.schemas.d.ts +3 -0
- package/dist/environments/environments.schemas.js +14 -0
- package/dist/environments/environments.service.d.ts +251 -0
- package/dist/environments/environments.service.js +791 -0
- package/dist/environments/label.d.ts +11 -0
- package/dist/environments/label.js +25 -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 +160 -2
- package/dist/errors.js +160 -2
- package/dist/evals/budget.d.ts +42 -21
- package/dist/evals/budget.js +114 -62
- package/dist/evals/evals.module.d.ts +31 -0
- package/dist/evals/evals.module.js +114 -0
- package/dist/evals/evals.schemas.d.ts +110 -0
- package/dist/evals/evals.schemas.js +107 -0
- package/dist/evals/jobs.d.ts +20 -0
- package/dist/evals/jobs.js +45 -0
- package/dist/evals/reconstruct.d.ts +18 -9
- package/dist/evals/reconstruct.js +36 -10
- package/dist/evals/recorded-tools.d.ts +37 -1
- package/dist/evals/recorded-tools.js +120 -10
- package/dist/evals/run-replay.d.ts +75 -10
- package/dist/evals/run-replay.js +218 -94
- package/dist/evals/runs.controller.d.ts +3 -58
- package/dist/evals/runs.controller.js +18 -50
- package/dist/evals/runs.service.d.ts +31 -52
- package/dist/evals/runs.service.js +281 -255
- package/dist/evals/sets.controller.d.ts +3 -29
- package/dist/evals/sets.controller.js +18 -39
- package/dist/evals/sets.service.d.ts +29 -13
- package/dist/evals/sets.service.js +262 -202
- package/dist/evals/snapshot.d.ts +5 -4
- package/dist/evals/snapshot.js +17 -4
- package/dist/evals/step-replay.d.ts +6 -8
- package/dist/evals/step-replay.js +17 -10
- package/dist/evals/trajectory.controller.d.ts +1 -1
- package/dist/evals/trajectory.controller.js +11 -7
- package/dist/evals/trajectory.d.ts +2 -2
- package/dist/evals/trajectory.js +1 -1
- package/dist/evals/trajectory.service.d.ts +13 -7
- package/dist/evals/trajectory.service.js +56 -21
- package/dist/evals/worker.d.ts +48 -31
- package/dist/evals/worker.js +229 -124
- package/dist/extensions/admin-ops.d.ts +133 -41
- package/dist/extensions/admin-ops.js +378 -172
- package/dist/extensions/admin-view.d.ts +82 -32
- package/dist/extensions/admin-view.js +284 -71
- package/dist/extensions/approvals.d.ts +24 -10
- package/dist/extensions/approvals.js +73 -46
- package/dist/extensions/blobs.d.ts +27 -10
- package/dist/extensions/blobs.js +112 -45
- package/dist/extensions/bootstrap.d.ts +99 -36
- package/dist/extensions/bootstrap.js +290 -134
- package/dist/extensions/cli.d.ts +32 -10
- package/dist/extensions/cli.js +52 -98
- package/dist/extensions/config-hash.d.ts +10 -0
- package/dist/extensions/config-hash.js +38 -0
- package/dist/extensions/config-issues.d.ts +19 -0
- package/dist/extensions/config-issues.js +48 -0
- 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 +55 -0
- package/dist/extensions/deployment-config-store.js +133 -0
- package/dist/extensions/deployment-config.d.ts +146 -70
- package/dist/extensions/deployment-config.js +439 -246
- 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/enabled.d.ts +5 -5
- package/dist/extensions/extensions.module.d.ts +8 -0
- package/dist/extensions/extensions.module.js +96 -0
- package/dist/extensions/hooks.d.ts +40 -6
- package/dist/extensions/hooks.js +83 -17
- package/dist/extensions/host.d.ts +161 -80
- package/dist/extensions/host.js +505 -213
- package/dist/extensions/installs.d.ts +73 -19
- package/dist/extensions/installs.js +174 -37
- package/dist/extensions/job-ids.d.ts +6 -0
- package/dist/extensions/job-ids.js +6 -0
- package/dist/extensions/lifecycle-topics.d.ts +18 -0
- package/dist/extensions/lifecycle-topics.js +18 -0
- package/dist/extensions/lifecycle.d.ts +35 -47
- package/dist/extensions/lifecycle.js +103 -39
- package/dist/extensions/locks.d.ts +45 -0
- package/dist/extensions/locks.js +112 -0
- package/dist/extensions/migrate-lock.d.ts +3 -4
- package/dist/extensions/org-config.d.ts +141 -49
- package/dist/extensions/org-config.js +471 -243
- 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 +59 -6
- package/dist/extensions/permission-view.js +7 -5
- package/dist/extensions/plugin-guides.d.ts +129 -0
- package/dist/extensions/plugin-guides.js +283 -0
- package/dist/extensions/plugin-icons.d.ts +54 -0
- package/dist/extensions/plugin-icons.js +125 -0
- 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 +28 -0
- package/dist/extensions/point-defaults.controller.js +69 -0
- package/dist/extensions/point-defaults.d.ts +73 -0
- package/dist/extensions/point-defaults.js +236 -0
- package/dist/extensions/point-defaults.schemas.d.ts +9 -0
- package/dist/extensions/point-defaults.schemas.js +14 -0
- package/dist/extensions/registry.d.ts +50 -2
- package/dist/extensions/registry.js +91 -4
- package/dist/extensions/resolve.d.ts +51 -1
- package/dist/extensions/resolve.js +85 -3
- package/dist/extensions/single-provider.d.ts +92 -0
- package/dist/extensions/single-provider.js +180 -0
- package/dist/extensions/sources.d.ts +19 -10
- package/dist/extensions/sources.js +34 -13
- package/dist/extensions/state.module.d.ts +9 -0
- package/dist/extensions/state.module.js +38 -0
- package/dist/extensions/unavailable.d.ts +50 -0
- package/dist/extensions/unavailable.js +115 -0
- package/dist/files/files.module.d.ts +3 -0
- package/dist/files/files.module.js +22 -0
- package/dist/files/previewers.controller.d.ts +7 -2
- package/dist/files/previewers.controller.js +19 -12
- package/dist/files/previewers.d.ts +21 -19
- package/dist/files/previewers.js +114 -38
- package/dist/files/previewers.schemas.d.ts +10 -0
- package/dist/files/previewers.schemas.js +9 -0
- package/dist/http/adapter.d.ts +3 -0
- package/dist/http/adapter.js +25 -0
- package/dist/http/api.module.d.ts +3 -110
- package/dist/http/api.module.js +93 -358
- package/dist/http/app.d.ts +22 -17
- package/dist/http/app.js +46 -65
- package/dist/http/error-filter.module.d.ts +5 -0
- package/dist/http/error-filter.module.js +18 -0
- package/dist/http/error.filter.js +2 -2
- package/dist/http/{gateway.module.d.ts → gateway-routes.d.ts} +7 -3
- package/dist/http/gateway-routes.js +16 -0
- package/dist/http/nest-logger.d.ts +6 -5
- package/dist/http/nest-logger.js +24 -10
- package/dist/http/plugin-dispatch.d.ts +4 -1
- package/dist/http/plugin-dispatch.js +14 -2
- package/dist/identity/accounts.d.ts +137 -38
- package/dist/identity/accounts.js +386 -186
- package/dist/identity/api-tokens.d.ts +11 -7
- package/dist/identity/api-tokens.js +71 -44
- package/dist/identity/audit.d.ts +9 -5
- package/dist/identity/audit.js +5 -1
- package/dist/identity/auth.controller.d.ts +11 -10
- package/dist/identity/auth.controller.js +40 -30
- package/dist/identity/auth.guard.d.ts +16 -8
- package/dist/identity/auth.guard.js +41 -13
- package/dist/identity/binding.d.ts +9 -11
- package/dist/identity/binding.js +41 -13
- package/dist/identity/cookies.d.ts +26 -5
- package/dist/identity/cookies.js +58 -6
- package/dist/identity/external-identity-lock.d.ts +17 -0
- package/dist/identity/external-identity-lock.js +39 -0
- package/dist/identity/external.d.ts +19 -15
- package/dist/identity/external.js +163 -125
- package/dist/identity/identity.module.d.ts +6 -0
- package/dist/identity/identity.module.js +59 -0
- package/dist/identity/initial-passwords.controller.d.ts +22 -0
- package/dist/identity/initial-passwords.controller.js +49 -0
- package/dist/identity/initial-passwords.d.ts +61 -0
- package/dist/identity/initial-passwords.job.d.ts +16 -0
- package/dist/identity/initial-passwords.job.js +46 -0
- package/dist/identity/initial-passwords.js +159 -0
- package/dist/identity/me.controller.d.ts +32 -15
- package/dist/identity/me.controller.js +80 -33
- package/dist/identity/me.schemas.d.ts +24 -0
- package/dist/identity/me.schemas.js +25 -0
- package/dist/identity/principal.d.ts +11 -3
- package/dist/identity/principal.js +11 -3
- package/dist/identity/sessions.d.ts +24 -10
- package/dist/identity/sessions.js +119 -42
- package/dist/identity/settings.d.ts +69 -23
- package/dist/identity/settings.js +201 -72
- package/dist/identity/sso.controller.d.ts +7 -7
- package/dist/identity/sso.controller.js +13 -9
- package/dist/identity/sso.d.ts +9 -12
- package/dist/identity/sso.js +54 -24
- package/dist/identity/super-admin.d.ts +20 -0
- package/dist/identity/super-admin.js +81 -0
- package/dist/inbox/inbox.module.d.ts +6 -0
- package/dist/inbox/inbox.module.js +26 -0
- package/dist/inbox/inbox.schemas.d.ts +8 -0
- package/dist/inbox/inbox.schemas.js +11 -0
- package/dist/inbox/inbox.service.d.ts +68 -11
- package/dist/inbox/inbox.service.js +104 -13
- 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 +22 -13
- package/dist/index.js +16 -7
- package/dist/infra/cache/cache.module.d.ts +3 -0
- package/dist/infra/cache/cache.module.js +16 -0
- package/dist/infra/cache/cache.service.d.ts +21 -0
- package/dist/infra/cache/cache.service.js +80 -0
- package/dist/infra/cache/cacheable.decorator.d.ts +32 -0
- package/dist/infra/cache/cacheable.decorator.js +83 -0
- package/dist/infra/cli/kernel-cli.module.d.ts +66 -0
- package/dist/infra/cli/kernel-cli.module.js +173 -0
- package/dist/infra/close-within.d.ts +15 -0
- package/dist/infra/close-within.js +36 -0
- package/dist/infra/config/config.module.d.ts +13 -0
- package/dist/infra/config/config.module.js +39 -0
- package/dist/infra/config/kernel-config.service.d.ts +25 -0
- package/dist/infra/config/kernel-config.service.js +157 -0
- package/dist/infra/database/after-commit.d.ts +6 -0
- package/dist/infra/database/after-commit.js +9 -0
- package/dist/infra/database/database.module.d.ts +25 -0
- package/dist/infra/database/database.module.js +91 -0
- package/dist/infra/database/kernel-db.d.ts +22 -0
- package/dist/infra/database/kernel-db.js +65 -0
- package/dist/infra/database/transaction-host.d.ts +50 -0
- package/dist/infra/database/transaction-host.js +125 -0
- package/dist/infra/database/transactional.decorator.d.ts +15 -0
- package/dist/infra/database/transactional.decorator.js +27 -0
- package/dist/infra/database/xact-lock.d.ts +17 -0
- package/dist/infra/database/xact-lock.js +43 -0
- package/dist/infra/events/kernel-events.d.ts +121 -0
- package/dist/infra/events/kernel-events.js +65 -0
- package/dist/infra/health/health.controller.d.ts +26 -0
- package/dist/infra/health/health.controller.js +104 -0
- package/dist/infra/health/health.module.d.ts +9 -0
- package/dist/infra/health/health.module.js +24 -0
- package/dist/infra/health/health.options.d.ts +10 -0
- package/dist/infra/health/health.options.js +15 -0
- package/dist/infra/health/shutdown-state.d.ts +6 -0
- package/dist/infra/health/shutdown-state.js +2 -0
- package/dist/infra/lifecycle/graceful-shutdown.module.d.ts +6 -0
- package/dist/infra/lifecycle/graceful-shutdown.module.js +23 -0
- package/dist/infra/lifecycle/graceful-shutdown.service.d.ts +70 -0
- package/dist/infra/lifecycle/graceful-shutdown.service.js +135 -0
- package/dist/infra/lifecycle/process-guards.d.ts +52 -0
- package/dist/infra/lifecycle/process-guards.js +90 -0
- package/dist/infra/lifecycle/shutdown-signals.d.ts +30 -0
- package/dist/infra/lifecycle/shutdown-signals.js +48 -0
- package/dist/infra/lock/key-template.d.ts +13 -0
- package/dist/infra/lock/key-template.js +46 -0
- package/dist/infra/lock/lock.module.d.ts +3 -0
- package/dist/infra/lock/lock.module.js +16 -0
- package/dist/infra/lock/lock.service.d.ts +120 -0
- package/dist/infra/lock/lock.service.js +343 -0
- package/dist/infra/lock/shared-lease.d.ts +44 -0
- package/dist/infra/lock/shared-lease.js +121 -0
- package/dist/infra/lock/with-lock.decorator.d.ts +28 -0
- package/dist/infra/lock/with-lock.decorator.js +49 -0
- package/dist/infra/logging/logging.module.d.ts +18 -0
- package/dist/infra/logging/logging.module.js +52 -0
- 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/configured-processor.d.ts +18 -0
- package/dist/infra/queue/configured-processor.js +23 -0
- package/dist/infra/queue/job-failure.d.ts +18 -0
- package/dist/infra/queue/job-failure.js +26 -0
- package/dist/infra/queue/queue-shutdown.d.ts +27 -0
- package/dist/infra/queue/queue-shutdown.js +81 -0
- package/dist/infra/queue/queue.module.d.ts +16 -0
- package/dist/infra/queue/queue.module.js +61 -0
- package/dist/infra/queue/redis-connection.d.ts +13 -0
- package/dist/infra/queue/redis-connection.js +25 -0
- package/dist/infra/queue/retired-schedulers.d.ts +7 -0
- package/dist/infra/queue/retired-schedulers.js +9 -0
- package/dist/infra/queue/run-job.d.ts +16 -0
- package/dist/infra/queue/run-job.js +19 -0
- package/dist/infra/redis/redis.module.d.ts +24 -0
- package/dist/infra/redis/redis.module.js +91 -0
- package/dist/infra/schedule/cron-tick.d.ts +12 -0
- package/dist/infra/schedule/cron-tick.js +25 -0
- package/dist/infra/schedule/locked-cron.decorator.d.ts +27 -0
- package/dist/infra/schedule/locked-cron.decorator.js +53 -0
- package/dist/infra/schedule/locked-interval.d.ts +69 -0
- package/dist/infra/schedule/locked-interval.js +190 -0
- package/dist/infra/schedule/locked-tick.d.ts +90 -0
- package/dist/infra/schedule/locked-tick.js +137 -0
- package/dist/infra/schedule/schedule.module.d.ts +8 -0
- package/dist/infra/schedule/schedule.module.js +27 -0
- package/dist/infra/schedule/scheduled-runs.d.ts +69 -0
- package/dist/infra/schedule/scheduled-runs.js +163 -0
- package/dist/infra/swagger/swagger.d.ts +16 -0
- package/dist/infra/swagger/swagger.js +31 -0
- package/dist/infra/throttler/credential-throttler.d.ts +35 -0
- package/dist/infra/throttler/credential-throttler.js +77 -0
- package/dist/infra/throttler/named-throttlers.d.ts +36 -0
- package/dist/infra/throttler/named-throttlers.js +157 -0
- package/dist/infra/throttler/redis-throttler-storage.d.ts +38 -0
- package/dist/infra/throttler/redis-throttler-storage.js +130 -0
- package/dist/infra/throttler/throttler.guard.d.ts +23 -0
- package/dist/infra/throttler/throttler.guard.js +68 -0
- package/dist/infra/throttler/throttler.module.d.ts +15 -0
- package/dist/infra/throttler/throttler.module.js +53 -0
- package/dist/infra/tokens.d.ts +20 -0
- package/dist/infra/tokens.js +20 -0
- package/dist/infra/validation/create-zod-dto.d.ts +23 -0
- package/dist/infra/validation/create-zod-dto.js +35 -0
- package/dist/infra/validation/parse-with-zod.d.ts +7 -0
- package/dist/infra/validation/parse-with-zod.js +12 -0
- package/dist/infra/validation/validation.module.d.ts +3 -0
- package/dist/infra/validation/validation.module.js +16 -0
- package/dist/infra/validation/zod-params.d.ts +7 -0
- package/dist/infra/validation/zod-params.js +42 -0
- package/dist/infra/validation/zod-validation.pipe.d.ts +11 -0
- package/dist/infra/validation/zod-validation.pipe.js +31 -0
- package/dist/kernel.d.ts +9 -244
- package/dist/kernel.js +8 -1305
- package/dist/kernel.module.d.ts +17 -0
- package/dist/kernel.module.js +145 -0
- package/dist/lifecycle/kernel-lifecycle.d.ts +140 -0
- package/dist/lifecycle/kernel-lifecycle.js +465 -0
- package/dist/lifecycle/tokens.d.ts +3 -0
- package/dist/lifecycle/tokens.js +3 -0
- package/dist/log-context.d.ts +2 -0
- package/dist/log-context.js +4 -0
- package/dist/log.d.ts +13 -1
- package/dist/log.js +93 -17
- package/dist/models/embeddings.d.ts +82 -0
- package/dist/models/embeddings.js +326 -0
- package/dist/models/enablement.controller.d.ts +40 -0
- package/dist/models/enablement.controller.js +74 -0
- package/dist/models/enablement.d.ts +101 -0
- package/dist/models/enablement.js +264 -0
- package/dist/models/models.module.d.ts +7 -0
- package/dist/models/models.module.js +36 -0
- package/dist/models/org-models.schemas.d.ts +8 -0
- package/dist/models/org-models.schemas.js +22 -0
- package/dist/models/prices.d.ts +13 -5
- package/dist/models/prices.js +69 -39
- package/dist/models/purposes.controller.d.ts +6 -4
- package/dist/models/purposes.controller.js +16 -11
- package/dist/models/purposes.d.ts +103 -23
- package/dist/models/purposes.js +208 -77
- package/dist/orgs/directory-sync.controller.d.ts +1 -1
- package/dist/orgs/directory-sync.controller.js +2 -2
- package/dist/orgs/directory-sync.d.ts +74 -35
- package/dist/orgs/directory-sync.js +243 -132
- package/dist/orgs/invitations.controller.d.ts +8 -8
- package/dist/orgs/invitations.controller.js +27 -26
- package/dist/orgs/invitations.service.d.ts +12 -9
- package/dist/orgs/invitations.service.js +130 -92
- package/dist/orgs/job-ids.d.ts +8 -0
- package/dist/orgs/job-ids.js +8 -0
- package/dist/orgs/members.service.d.ts +19 -12
- package/dist/orgs/members.service.js +161 -117
- package/dist/orgs/offboarding.d.ts +61 -60
- package/dist/orgs/offboarding.js +206 -95
- package/dist/orgs/org-lock.d.ts +33 -19
- package/dist/orgs/org-lock.js +94 -35
- package/dist/orgs/org.guard.d.ts +11 -1
- package/dist/orgs/org.guard.js +45 -34
- package/dist/orgs/orgs.controller.d.ts +13 -16
- package/dist/orgs/orgs.controller.js +29 -20
- package/dist/orgs/orgs.module.d.ts +6 -0
- package/dist/orgs/orgs.module.js +71 -0
- package/dist/orgs/orgs.schemas.d.ts +8 -0
- package/dist/orgs/orgs.schemas.js +16 -0
- package/dist/orgs/orgs.service.d.ts +47 -21
- package/dist/orgs/orgs.service.js +166 -91
- package/dist/orgs/roles.d.ts +1 -1
- package/dist/orgs/roles.js +5 -1
- package/dist/orgs/settings.controller.d.ts +2 -2
- package/dist/orgs/settings.controller.js +8 -6
- package/dist/orgs/settings.service.d.ts +76 -14
- package/dist/orgs/settings.service.js +140 -51
- package/dist/overrides.d.ts +63 -0
- package/dist/overrides.js +34 -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 +28 -0
- package/dist/platform/errors.js +65 -0
- package/dist/platform/exclusions.d.ts +11 -0
- package/dist/platform/exclusions.js +683 -0
- package/dist/platform/method.d.ts +6 -0
- package/dist/platform/method.js +15 -0
- package/dist/platform/operation.d.ts +169 -0
- package/dist/platform/operation.js +94 -0
- package/dist/platform/ops/accounts.ops.d.ts +32 -0
- package/dist/platform/ops/accounts.ops.js +291 -0
- package/dist/platform/ops/admin.ops.d.ts +38 -0
- package/dist/platform/ops/admin.ops.js +407 -0
- package/dist/platform/ops/agent-skills.ops.d.ts +24 -0
- package/dist/platform/ops/agent-skills.ops.js +226 -0
- package/dist/platform/ops/agent-templates.ops.d.ts +17 -0
- package/dist/platform/ops/agent-templates.ops.js +272 -0
- package/dist/platform/ops/agents.ops.d.ts +37 -0
- package/dist/platform/ops/agents.ops.js +717 -0
- package/dist/platform/ops/approvals.ops.d.ts +30 -0
- package/dist/platform/ops/approvals.ops.js +116 -0
- package/dist/platform/ops/background.ops.d.ts +14 -0
- package/dist/platform/ops/background.ops.js +134 -0
- package/dist/platform/ops/catalog-admin.ops.d.ts +74 -0
- package/dist/platform/ops/catalog-admin.ops.js +599 -0
- package/dist/platform/ops/channels.ops.d.ts +16 -0
- package/dist/platform/ops/channels.ops.js +195 -0
- package/dist/platform/ops/components.ops.d.ts +46 -0
- package/dist/platform/ops/components.ops.js +854 -0
- package/dist/platform/ops/connectors.ops.d.ts +17 -0
- package/dist/platform/ops/connectors.ops.js +188 -0
- package/dist/platform/ops/conversations.ops.d.ts +30 -0
- package/dist/platform/ops/conversations.ops.js +470 -0
- package/dist/platform/ops/environments.ops.d.ts +26 -0
- package/dist/platform/ops/environments.ops.js +311 -0
- package/dist/platform/ops/errors.d.ts +16 -0
- package/dist/platform/ops/errors.js +30 -0
- package/dist/platform/ops/evals.ops.d.ts +28 -0
- package/dist/platform/ops/evals.ops.js +783 -0
- package/dist/platform/ops/extensions-admin.ops.d.ts +25 -0
- package/dist/platform/ops/extensions-admin.ops.js +372 -0
- package/dist/platform/ops/extensions.ops.d.ts +25 -0
- package/dist/platform/ops/extensions.ops.js +347 -0
- package/dist/platform/ops/inbox.ops.d.ts +25 -0
- package/dist/platform/ops/inbox.ops.js +378 -0
- package/dist/platform/ops/marketplaces.ops.d.ts +22 -0
- package/dist/platform/ops/marketplaces.ops.js +466 -0
- package/dist/platform/ops/models.ops.d.ts +25 -0
- package/dist/platform/ops/models.ops.js +232 -0
- package/dist/platform/ops/org-plugins.ops.d.ts +29 -0
- package/dist/platform/ops/org-plugins.ops.js +329 -0
- package/dist/platform/ops/org-settings.ops.d.ts +18 -0
- package/dist/platform/ops/org-settings.ops.js +127 -0
- package/dist/platform/ops/orgs.ops.d.ts +28 -0
- package/dist/platform/ops/orgs.ops.js +296 -0
- package/dist/platform/ops/other-orgs.d.ts +20 -0
- package/dist/platform/ops/other-orgs.js +72 -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 +30 -0
- package/dist/platform/ops/platform.ops.js +231 -0
- package/dist/platform/ops/plugins.ops.d.ts +35 -0
- package/dist/platform/ops/plugins.ops.js +476 -0
- package/dist/platform/ops/previewers.ops.d.ts +14 -0
- package/dist/platform/ops/previewers.ops.js +109 -0
- package/dist/platform/ops/requests.ops.d.ts +14 -0
- package/dist/platform/ops/requests.ops.js +191 -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 +17 -0
- package/dist/platform/ops/skills.ops.js +216 -0
- package/dist/platform/ops/summary.d.ts +10 -0
- package/dist/platform/ops/summary.js +18 -0
- package/dist/platform/ops/themes.ops.d.ts +14 -0
- package/dist/platform/ops/themes.ops.js +47 -0
- package/dist/platform/ops/unavailable.d.ts +23 -0
- package/dist/platform/ops/unavailable.js +118 -0
- package/dist/platform/parity.d.ts +33 -0
- package/dist/platform/parity.js +272 -0
- package/dist/platform/platform-ops.module.d.ts +40 -0
- package/dist/platform/platform-ops.module.js +127 -0
- package/dist/platform/platform.module.d.ts +8 -0
- package/dist/platform/platform.module.js +25 -0
- package/dist/platform/registry.d.ts +30 -0
- package/dist/platform/registry.js +111 -0
- package/dist/platform/route-schemas.d.ts +18 -0
- package/dist/platform/route-schemas.js +66 -0
- package/dist/roles/gateway-role.d.ts +54 -0
- package/dist/roles/gateway-role.js +118 -0
- package/dist/roles/gateway.module.d.ts +9 -0
- package/dist/roles/gateway.module.js +31 -0
- package/dist/roles/worker-role.d.ts +65 -0
- package/dist/roles/worker-role.js +151 -0
- package/dist/roles/worker.module.d.ts +14 -0
- package/dist/roles/worker.module.js +106 -0
- package/dist/runtime/abort.js +19 -2
- package/dist/runtime/checkpointer.d.ts +8 -3
- package/dist/runtime/checkpointer.js +87 -55
- package/dist/runtime/context/build.d.ts +21 -13
- package/dist/runtime/context/build.js +106 -29
- package/dist/runtime/context/claude-tools.d.ts +4 -1
- package/dist/runtime/context/claude-tools.js +13 -12
- package/dist/runtime/context/compaction.js +24 -1
- package/dist/runtime/context/environment-paths.d.ts +40 -0
- package/dist/runtime/context/environment-paths.js +48 -0
- package/dist/runtime/context/legacy-text.d.ts +22 -0
- package/dist/runtime/context/legacy-text.js +37 -0
- package/dist/runtime/context/reminders.d.ts +2 -0
- package/dist/runtime/context/reminders.js +2 -0
- package/dist/runtime/context/run-context.d.ts +65 -0
- package/dist/runtime/context/run-context.js +215 -0
- package/dist/runtime/context/skills.d.ts +29 -11
- package/dist/runtime/context/skills.js +46 -32
- package/dist/runtime/context/tool-changes.d.ts +27 -0
- package/dist/runtime/context/tool-changes.js +60 -0
- package/dist/runtime/conversation-lock.d.ts +20 -11
- package/dist/runtime/conversation-lock.js +62 -72
- package/dist/runtime/hook-calls.d.ts +11 -4
- package/dist/runtime/hook-calls.js +41 -13
- package/dist/runtime/job-ids.d.ts +10 -0
- package/dist/runtime/job-ids.js +10 -0
- package/dist/runtime/langgraph-loop.d.ts +3 -1
- package/dist/runtime/langgraph-loop.js +37 -18
- package/dist/runtime/loop.d.ts +42 -6
- package/dist/runtime/loop.js +14 -0
- package/dist/runtime/maintenance-queue.d.ts +10 -0
- package/dist/runtime/maintenance-queue.js +10 -0
- package/dist/runtime/maintenance.d.ts +50 -74
- package/dist/runtime/maintenance.js +166 -137
- package/dist/runtime/model-call.d.ts +61 -15
- package/dist/runtime/model-call.js +128 -84
- package/dist/runtime/providers.d.ts +158 -27
- package/dist/runtime/providers.js +373 -63
- package/dist/runtime/quota.d.ts +17 -3
- package/dist/runtime/quota.js +27 -2
- package/dist/runtime/retired-schedulers.d.ts +7 -0
- package/dist/runtime/retired-schedulers.js +31 -0
- package/dist/runtime/run-context.service.d.ts +65 -0
- package/dist/runtime/run-context.service.js +236 -0
- package/dist/runtime/run-control.d.ts +43 -0
- package/dist/runtime/run-control.js +89 -0
- package/dist/runtime/run-drafts.d.ts +85 -0
- package/dist/runtime/run-drafts.js +230 -0
- package/dist/runtime/run-finish.d.ts +27 -18
- package/dist/runtime/run-finish.js +98 -51
- package/dist/runtime/run-jobs.d.ts +46 -0
- package/dist/runtime/run-jobs.js +91 -0
- package/dist/runtime/run-processors.d.ts +60 -0
- package/dist/runtime/run-processors.js +185 -0
- package/dist/runtime/run-queue.d.ts +90 -58
- package/dist/runtime/run-queue.js +566 -297
- package/dist/runtime/run-steps.d.ts +39 -0
- package/dist/runtime/run-steps.js +96 -0
- package/dist/runtime/run-worker.d.ts +134 -77
- package/dist/runtime/run-worker.js +412 -237
- package/dist/runtime/runtime.module.d.ts +10 -0
- package/dist/runtime/runtime.module.js +122 -0
- package/dist/runtime/step-log.d.ts +51 -0
- package/dist/runtime/step-log.js +111 -0
- package/dist/runtime/stream.controller.d.ts +28 -9
- package/dist/runtime/stream.controller.js +72 -13
- package/dist/runtime/stream.d.ts +27 -6
- package/dist/runtime/stream.js +102 -7
- package/dist/runtime/subagents/child.d.ts +58 -51
- package/dist/runtime/subagents/child.js +105 -86
- package/dist/runtime/subagents/definition.d.ts +32 -28
- package/dist/runtime/subagents/definition.js +89 -143
- package/dist/runtime/subagents/deliveries.d.ts +71 -0
- package/dist/runtime/subagents/deliveries.js +228 -0
- package/dist/runtime/subagents/dispatch.d.ts +197 -27
- package/dist/runtime/subagents/dispatch.js +336 -270
- package/dist/runtime/subagents/limits.d.ts +32 -8
- package/dist/runtime/subagents/limits.js +44 -8
- package/dist/runtime/subagents/messages.d.ts +95 -0
- package/dist/runtime/subagents/messages.js +328 -0
- package/dist/runtime/subagents/org-agents.d.ts +4 -4
- package/dist/runtime/subagents/org-agents.js +3 -2
- package/dist/runtime/subagents/preamble.d.ts +4 -4
- package/dist/runtime/subagents/preamble.js +9 -7
- package/dist/runtime/subagents/progress.d.ts +10 -8
- 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 +27 -10
- package/dist/runtime/subagents/roster.js +49 -13
- package/dist/runtime/subagents/skill-fork.d.ts +10 -10
- package/dist/runtime/subagents/skill-fork.js +23 -8
- 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 +43 -0
- package/dist/runtime/subagents/subagents.service.js +106 -0
- package/dist/runtime/usage-report-jobs.d.ts +88 -0
- package/dist/runtime/usage-report-jobs.js +158 -0
- package/dist/runtime/usage-report.d.ts +121 -83
- package/dist/runtime/usage-report.js +355 -181
- package/dist/runtime/waits.d.ts +258 -81
- package/dist/runtime/waits.js +800 -263
- package/dist/sandbox/job-ids.d.ts +10 -0
- package/dist/sandbox/job-ids.js +10 -0
- package/dist/sandbox/jobs.d.ts +68 -0
- package/dist/sandbox/jobs.js +150 -0
- package/dist/sandbox/leases.d.ts +73 -82
- package/dist/sandbox/leases.js +162 -346
- package/dist/sandbox/providers.d.ts +46 -0
- package/dist/sandbox/providers.js +83 -0
- package/dist/sandbox/sandbox.module.d.ts +9 -0
- package/dist/sandbox/sandbox.module.js +36 -0
- package/dist/sandbox/sandbox.service.d.ts +359 -151
- package/dist/sandbox/sandbox.service.js +950 -435
- package/dist/sandbox/unreachable.d.ts +30 -0
- package/dist/sandbox/unreachable.js +108 -0
- package/dist/skills/catalog.d.ts +40 -26
- package/dist/skills/catalog.js +120 -99
- package/dist/skills/changes.controller.d.ts +11 -4
- package/dist/skills/changes.controller.js +34 -9
- package/dist/skills/changes.service.d.ts +31 -21
- package/dist/skills/changes.service.js +426 -368
- package/dist/skills/invocable.controller.d.ts +2 -2
- package/dist/skills/invocable.controller.js +10 -7
- package/dist/skills/invocation-keys.d.ts +1 -1
- package/dist/skills/invocation-keys.js +1 -1
- package/dist/skills/invoke.d.ts +19 -18
- package/dist/skills/invoke.js +68 -24
- package/dist/skills/package.d.ts +20 -1
- package/dist/skills/package.js +28 -1
- package/dist/skills/skills.controller.d.ts +33 -7
- package/dist/skills/skills.controller.js +79 -12
- package/dist/skills/skills.module.d.ts +6 -0
- package/dist/skills/skills.module.js +39 -0
- package/dist/skills/skills.schemas.d.ts +48 -0
- package/dist/skills/skills.schemas.js +61 -0
- package/dist/skills/skills.service.d.ts +151 -44
- package/dist/skills/skills.service.js +636 -204
- package/dist/skills/usable.d.ts +81 -0
- package/dist/skills/usable.js +379 -0
- package/dist/storage/job-ids.d.ts +6 -0
- package/dist/storage/job-ids.js +6 -0
- package/dist/storage/purge.d.ts +22 -7
- package/dist/storage/purge.js +55 -3
- package/dist/storage/storage.module.d.ts +6 -0
- package/dist/storage/storage.module.js +23 -0
- package/dist/storage/storage.service.d.ts +18 -4
- package/dist/storage/storage.service.js +44 -3
- package/dist/themes/render-css.d.ts +12 -0
- package/dist/themes/render-css.js +132 -0
- package/dist/themes/theme-delivery.service.d.ts +34 -0
- package/dist/themes/theme-delivery.service.js +111 -0
- package/dist/themes/theme-state.d.ts +95 -0
- package/dist/themes/theme-state.js +203 -0
- package/dist/themes/theme-usage.d.ts +61 -0
- package/dist/themes/theme-usage.js +98 -0
- package/dist/themes/themes-public.controller.d.ts +28 -0
- package/dist/themes/themes-public.controller.js +92 -0
- package/dist/themes/themes.controller.d.ts +13 -0
- package/dist/themes/themes.controller.js +38 -0
- package/dist/themes/themes.module.d.ts +3 -0
- package/dist/themes/themes.module.js +21 -0
- package/dist/themes/themes.schemas.d.ts +3 -0
- package/dist/themes/themes.schemas.js +2 -0
- package/dist/themes/themes.service.d.ts +50 -0
- package/dist/themes/themes.service.js +99 -0
- package/dist/time-zone.d.ts +5 -0
- package/dist/time-zone.js +19 -0
- package/dist/tools/approvals.controller.d.ts +1 -1
- package/dist/tools/approvals.controller.js +14 -11
- package/dist/tools/approvals.schemas.d.ts +21 -0
- package/dist/tools/approvals.schemas.js +15 -0
- package/dist/tools/approvals.service.d.ts +53 -27
- package/dist/tools/approvals.service.js +365 -260
- package/dist/tools/breaker.d.ts +2 -2
- package/dist/tools/breaker.js +21 -3
- package/dist/tools/builtin-names.d.ts +109 -0
- package/dist/tools/builtin-names.js +173 -0
- package/dist/tools/builtins/agent.d.ts +27 -25
- package/dist/tools/builtins/agent.js +66 -63
- package/dist/tools/builtins/ask-user.d.ts +3 -3
- package/dist/tools/builtins/ask-user.js +3 -3
- package/dist/tools/builtins/builtin-tools.d.ts +41 -0
- package/dist/tools/builtins/builtin-tools.js +151 -0
- package/dist/tools/builtins/current-time.d.ts +26 -0
- package/dist/tools/builtins/current-time.js +99 -0
- package/dist/tools/builtins/handback.d.ts +28 -0
- package/dist/tools/builtins/handback.js +53 -0
- package/dist/tools/builtins/platform.d.ts +51 -0
- package/dist/tools/builtins/platform.js +451 -0
- package/dist/tools/builtins/read-tool-output.d.ts +3 -3
- package/dist/tools/builtins/read-tool-output.js +3 -3
- package/dist/tools/builtins/sandbox/bash.d.ts +5 -5
- package/dist/tools/builtins/sandbox/bash.js +293 -41
- package/dist/tools/builtins/sandbox/common.d.ts +137 -37
- package/dist/tools/builtins/sandbox/common.js +222 -62
- package/dist/tools/builtins/sandbox/deliver.d.ts +1 -1
- package/dist/tools/builtins/sandbox/deliver.js +21 -18
- package/dist/tools/builtins/sandbox/edit.d.ts +1 -1
- package/dist/tools/builtins/sandbox/edit.js +65 -51
- package/dist/tools/builtins/sandbox/file-state.d.ts +34 -0
- package/dist/tools/builtins/sandbox/file-state.js +34 -0
- package/dist/tools/builtins/sandbox/glob-match.d.ts +1 -1
- package/dist/tools/builtins/sandbox/glob-match.js +1 -1
- package/dist/tools/builtins/sandbox/glob.d.ts +1 -1
- package/dist/tools/builtins/sandbox/glob.js +19 -14
- package/dist/tools/builtins/sandbox/grep.d.ts +7 -4
- package/dist/tools/builtins/sandbox/grep.js +155 -36
- package/dist/tools/builtins/sandbox/index.d.ts +9 -5
- package/dist/tools/builtins/sandbox/index.js +13 -5
- package/dist/tools/builtins/sandbox/read.d.ts +2 -2
- package/dist/tools/builtins/sandbox/read.js +30 -20
- package/dist/tools/builtins/sandbox/task-output.d.ts +79 -0
- package/dist/tools/builtins/sandbox/task-output.js +334 -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.d.ts +1 -1
- package/dist/tools/builtins/sandbox/write.js +52 -45
- 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 +32 -21
- package/dist/tools/builtins/skill-load.js +125 -74
- package/dist/tools/builtins/skill-write.d.ts +4 -4
- package/dist/tools/builtins/skill-write.js +12 -12
- package/dist/tools/builtins/tool-search.d.ts +13 -9
- package/dist/tools/builtins/tool-search.js +25 -14
- 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/canonical-json.d.ts +6 -0
- package/dist/tools/canonical-json.js +16 -0
- package/dist/tools/connector-content.controller.d.ts +1 -1
- package/dist/tools/connector-content.controller.js +11 -6
- package/dist/tools/connector-content.d.ts +12 -15
- package/dist/tools/connector-content.js +53 -18
- package/dist/tools/connectors.controller.d.ts +16 -3
- package/dist/tools/connectors.controller.js +34 -14
- package/dist/tools/connectors.schemas.d.ts +12 -0
- package/dist/tools/connectors.schemas.js +19 -0
- package/dist/tools/connectors.service.d.ts +80 -18
- package/dist/tools/connectors.service.js +529 -358
- package/dist/tools/credentials.d.ts +20 -20
- package/dist/tools/credentials.js +55 -34
- package/dist/tools/display-names.d.ts +9 -0
- package/dist/tools/display-names.js +24 -0
- package/dist/tools/drift.d.ts +29 -41
- package/dist/tools/drift.js +116 -84
- package/dist/tools/elicitation.js +1 -1
- 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 +73 -13
- package/dist/tools/info.js +151 -39
- package/dist/tools/job-ids.d.ts +13 -0
- package/dist/tools/job-ids.js +15 -0
- package/dist/tools/jobs.d.ts +24 -0
- package/dist/tools/jobs.js +69 -0
- package/dist/tools/legacy-data.d.ts +34 -0
- package/dist/tools/legacy-data.js +76 -0
- package/dist/tools/legacy-keys.d.ts +51 -0
- package/dist/tools/legacy-keys.js +115 -0
- package/dist/tools/naming.d.ts +1 -5
- package/dist/tools/naming.js +1 -7
- package/dist/tools/oauth/flow-paths.d.ts +16 -0
- package/dist/tools/oauth/flow-paths.js +38 -0
- package/dist/tools/oauth/flow.d.ts +30 -30
- package/dist/tools/oauth/flow.js +109 -81
- package/dist/tools/oauth/oauth.controller.d.ts +3 -3
- package/dist/tools/oauth/oauth.controller.js +12 -9
- package/dist/tools/oauth/tokens.d.ts +45 -10
- package/dist/tools/oauth/tokens.js +70 -24
- package/dist/tools/org-tool-switches.d.ts +88 -0
- package/dist/tools/org-tool-switches.js +201 -0
- package/dist/tools/outputs.d.ts +13 -4
- package/dist/tools/outputs.js +48 -4
- package/dist/tools/pipeline.d.ts +108 -80
- package/dist/tools/pipeline.js +396 -409
- package/dist/tools/policy.d.ts +4 -17
- package/dist/tools/policy.js +49 -35
- package/dist/tools/questions.controller.d.ts +2 -2
- package/dist/tools/questions.controller.js +9 -6
- package/dist/tools/questions.service.d.ts +26 -25
- package/dist/tools/questions.service.js +201 -142
- package/dist/tools/registry.d.ts +215 -84
- package/dist/tools/registry.js +382 -264
- package/dist/tools/resources.d.ts +1 -1
- package/dist/tools/resources.js +1 -1
- package/dist/tools/specs.d.ts +5 -4
- package/dist/tools/specs.js +3 -1
- package/dist/tools/tools.module.d.ts +10 -0
- package/dist/tools/tools.module.js +113 -0
- package/dist/tools/validate.js +1 -1
- package/dist/ui/call-extension.d.ts +16 -0
- package/dist/ui/call-extension.js +38 -0
- package/dist/ui/embed-token.d.ts +9 -5
- package/dist/ui/embed-token.js +34 -6
- package/dist/ui/ui-stream.d.ts +22 -17
- package/dist/ui/ui-stream.js +72 -12
- package/dist/ui/ui.module.d.ts +7 -0
- package/dist/ui/ui.module.js +28 -0
- package/dist/ui/views.controller.d.ts +14 -12
- package/dist/ui/views.controller.js +32 -25
- package/dist/ui/views.d.ts +10 -57
- package/dist/ui/views.js +58 -46
- package/package.json +13 -3
- package/src/migrations/0063_tool_keys_claude_code.sql +220 -0
- 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/src/migrations/0089_model_kinds_usage.sql +38 -0
- package/src/migrations/0090_initial_passwords.sql +27 -0
- package/src/migrations/0091_account_time_zone.sql +4 -0
- package/src/migrations/0092_tools_default_on.sql +27 -0
- package/src/migrations/0093_connected_environments.sql +37 -0
- package/src/migrations/0094_environment_paths_idx.sql +7 -0
- package/src/migrations/0095_environment_files_resets.sql +5 -0
- package/src/migrations/0096_environment_demoted_default.sql +18 -0
- package/src/migrations/0097_extension_installs_enabled_at.sql +16 -0
- package/src/migrations/0098_single_provider_running_first.sql +41 -0
- package/src/migrations/0099_channel_connection_guide_ack.sql +6 -0
- package/src/migrations/0100_catalog_files.sql +13 -0
- package/src/migrations/0101_marketplace_icons.sql +32 -0
- package/src/migrations/0102_themes.sql +64 -0
- package/src/migrations/0103_ui_theme_setting.sql +7 -0
- package/dist/catalog/upgrade-targets.d.ts +0 -59
- package/dist/catalog/upgrade-targets.js +0 -90
- package/dist/conversations/sandbox-status.d.ts +0 -21
- package/dist/conversations/sandbox-status.js +0 -24
- package/dist/extensions/org-config.controller.d.ts +0 -24
- package/dist/extensions/org-config.controller.js +0 -59
- package/dist/http/gateway.module.js +0 -13
- package/dist/http/health.controller.d.ts +0 -26
- package/dist/http/health.controller.js +0 -79
- package/dist/http/tokens.d.ts +0 -131
- package/dist/http/tokens.js +0 -131
- package/dist/http/zod.pipe.d.ts +0 -8
- package/dist/http/zod.pipe.js +0 -14
- package/dist/identity/enterprise-admin.d.ts +0 -14
- package/dist/identity/enterprise-admin.js +0 -27
- package/dist/identity/rate-limit.d.ts +0 -55
- package/dist/identity/rate-limit.js +0 -121
- package/dist/sandbox/lifecycle.d.ts +0 -21
- package/dist/sandbox/lifecycle.js +0 -68
- package/dist/tools/builtins/sandbox/names.d.ts +0 -7
- package/dist/tools/builtins/sandbox/names.js +0 -20
package/dist/runtime/waits.js
CHANGED
|
@@ -1,11 +1,38 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
8
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
9
|
+
};
|
|
10
|
+
import { getQueueToken } from "@nestjs/bullmq";
|
|
11
|
+
import { Inject, Injectable } from "@nestjs/common";
|
|
1
12
|
import { DelayedError } from "bullmq";
|
|
2
13
|
import { sql } from "kysely";
|
|
3
|
-
import {
|
|
14
|
+
import { BackgroundTaskStopper } from "../background/stop.js";
|
|
15
|
+
import { EventLog } from "../conversations/event-log.js";
|
|
16
|
+
import { conversationTree } from "../conversations/tree.js";
|
|
17
|
+
import { KernelDb } from "../infra/database/kernel-db.js";
|
|
18
|
+
import { TransactionHost } from "../infra/database/transaction-host.js";
|
|
19
|
+
import { Transactional } from "../infra/database/transactional.decorator.js";
|
|
20
|
+
import { KernelEvents } from "../infra/events/kernel-events.js";
|
|
21
|
+
import { LockService } from "../infra/lock/lock.service.js";
|
|
22
|
+
import { LockedCron } from "../infra/schedule/locked-cron.decorator.js";
|
|
23
|
+
import { KERNEL_LOGGER } from "../infra/tokens.js";
|
|
24
|
+
import { ApprovalsService } from "../tools/approvals.service.js";
|
|
25
|
+
import { APPROVAL_CANCELLED_TEXT, INPUT_CANCELLED_TEXT, RUN_STOPPED_TEXT, ToolPipeline, } from "../tools/pipeline.js";
|
|
26
|
+
import { QuestionsService } from "../tools/questions.service.js";
|
|
27
|
+
import { RunAbort } from "./abort.js";
|
|
28
|
+
import { KyselyCheckpointSaver } from "./checkpointer.js";
|
|
4
29
|
import { subagentsWaitId, subagentWaitingIdemKey } from "./loop.js";
|
|
5
|
-
import { MAINTENANCE_QUEUE_NAME } from "./maintenance.js";
|
|
30
|
+
import { MAINTENANCE_QUEUE_NAME } from "./maintenance-queue.js";
|
|
6
31
|
import { assistantIdemKey } from "./model-call.js";
|
|
7
|
-
import {
|
|
8
|
-
import { ACTIVE_RUN_STATUSES } from "./run-queue.js";
|
|
32
|
+
import { notifyFinished, RunFinish, TERMINAL_STATUSES } from "./run-finish.js";
|
|
33
|
+
import { ACTIVE_RUN_STATUSES, RunQueue } from "./run-queue.js";
|
|
34
|
+
import { childResult, deliveryRowOfChildRun, finishedEvent, rootSurfaceOf, } from "./subagents/child.js";
|
|
35
|
+
import { SubagentDeliveries } from "./subagents/deliveries.js";
|
|
9
36
|
/** 等待超时任务所在的内核维护队列(见 maintenance.ts)。 */
|
|
10
37
|
export { MAINTENANCE_QUEUE_NAME };
|
|
11
38
|
/** 等待超时任务的名字与 jobId(每个审批 / 输入请求一个,重复投递被 BullMQ 忽略)。 */
|
|
@@ -18,8 +45,8 @@ export const resumeJobId = (conversationId, waitId) => `run-${conversationId}-re
|
|
|
18
45
|
* 宽限期:waiting 超过它、等待却已全部处理的运行才视为「续跑丢失」,避免与正常续跑(暂停后的复查等)竞争。
|
|
19
46
|
*/
|
|
20
47
|
export const WAIT_SWEEP_JOB = "wait-sweep";
|
|
21
|
-
|
|
22
|
-
export
|
|
48
|
+
/** The maintenance scheduler the sweep ran on before it became a `@LockedCron` (retired). */
|
|
49
|
+
export { WAIT_SWEEP_SCHEDULER_ID } from "./job-ids.js";
|
|
23
50
|
export const WAIT_SWEEP_GRACE_MS = 60_000;
|
|
24
51
|
export const WAIT_SWEEP_BATCH = 500;
|
|
25
52
|
const TERMINAL_RUN_STATUSES = ["completed", "failed", "aborted"];
|
|
@@ -34,19 +61,73 @@ const TIMEOUT_JOB_BACKOFF_MS = 5_000;
|
|
|
34
61
|
* 成功者投递 jobId 为 `run-<conversationId>-resume-<waitId>` 的运行任务。人工决定、超时任务、
|
|
35
62
|
* 暂停后的复查都可能调用它,谁先谁后都只有一次续跑。
|
|
36
63
|
*/
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
64
|
+
let Waits = class Waits {
|
|
65
|
+
kdb;
|
|
66
|
+
eventLog;
|
|
67
|
+
approvals;
|
|
68
|
+
questions;
|
|
69
|
+
runQueue;
|
|
70
|
+
pipeline;
|
|
71
|
+
finisher;
|
|
72
|
+
checkpoints;
|
|
73
|
+
abort;
|
|
74
|
+
timeouts;
|
|
75
|
+
events;
|
|
76
|
+
log;
|
|
77
|
+
background;
|
|
78
|
+
deliveries;
|
|
79
|
+
txHost;
|
|
80
|
+
/** Drops the `run.orphaned` subscription (the events may outlive this instance). */
|
|
81
|
+
unsubscribe;
|
|
82
|
+
constructor(kdb, eventLog, approvals, questions, runQueue,
|
|
83
|
+
/**
|
|
84
|
+
* Writes, in the caller's transaction, the results of a stopped run's open `Agent` calls;
|
|
85
|
+
* `fire` runs their observe hooks after the commit.
|
|
86
|
+
*/
|
|
87
|
+
pipeline, finisher,
|
|
88
|
+
/** 等待中被中止的运行删除其 checkpoint thread。 */
|
|
89
|
+
checkpoints,
|
|
90
|
+
/**
|
|
91
|
+
* The run's stop marker (`RunAbort.requested`): between suspending and becoming `waiting` the
|
|
92
|
+
* run has no subscriber, so a stop arriving then only sits in the marker; checked once after
|
|
93
|
+
* `waiting` is set. Children are stopped through `request`.
|
|
94
|
+
*/
|
|
95
|
+
abort,
|
|
96
|
+
/** The maintenance queue: wait timeout jobs (`MaintenanceProcessor` consumes them). */
|
|
97
|
+
timeouts, events, log,
|
|
98
|
+
/** Stops a finished sub-agent run's background tasks ({@link childFinished}). */
|
|
99
|
+
background,
|
|
100
|
+
/** Delivers a background child's finish to its parent ({@link childFinished}). */
|
|
101
|
+
deliveries, txHost) {
|
|
102
|
+
this.kdb = kdb;
|
|
103
|
+
this.eventLog = eventLog;
|
|
104
|
+
this.approvals = approvals;
|
|
105
|
+
this.questions = questions;
|
|
106
|
+
this.runQueue = runQueue;
|
|
107
|
+
this.pipeline = pipeline;
|
|
108
|
+
this.finisher = finisher;
|
|
109
|
+
this.checkpoints = checkpoints;
|
|
110
|
+
this.abort = abort;
|
|
111
|
+
this.timeouts = timeouts;
|
|
112
|
+
this.events = events;
|
|
113
|
+
this.log = log;
|
|
114
|
+
this.background = background;
|
|
115
|
+
this.deliveries = deliveries;
|
|
116
|
+
this.txHost = txHost;
|
|
117
|
+
// an orphaned parent run (marked failed by `ensureRun`) stops its fork child at once
|
|
118
|
+
// (background children keep running, agent map spec §5.4); the sweep's
|
|
119
|
+
// `sweepForkChildrenOfFinished` is the backstop
|
|
120
|
+
this.unsubscribe = events.on("run.orphaned", ({ runId }) => this.stopChildren(runId, null)
|
|
121
|
+
.then(() => { })
|
|
122
|
+
.catch((err) => this.log.error("cannot stop the sub-agents of an orphaned run", { runId, err })));
|
|
123
|
+
}
|
|
124
|
+
/** Unsubscribes after the stop phases: events emitted while they drain are still handled. */
|
|
125
|
+
onApplicationShutdown() {
|
|
126
|
+
this.unsubscribe();
|
|
127
|
+
}
|
|
128
|
+
/** The context's handle (the transaction of a `@Transactional` method, else the pool). */
|
|
129
|
+
get db() {
|
|
130
|
+
return this.kdb.db;
|
|
50
131
|
}
|
|
51
132
|
/**
|
|
52
133
|
* 兜底扫描(维护队列每 10 分钟一次,防延迟任务 / 续跑丢失)。每项修复都复用常规路径,与并发的超时任务、
|
|
@@ -63,12 +144,17 @@ export class Waits {
|
|
|
63
144
|
requeued: 0,
|
|
64
145
|
orphaned: 0,
|
|
65
146
|
stopped: 0,
|
|
147
|
+
delivered: 0,
|
|
148
|
+
restarted: 0,
|
|
66
149
|
};
|
|
67
150
|
out.cancelled = await this.sweepFinishedRuns();
|
|
68
151
|
out.expired = await this.sweepOverdue();
|
|
69
152
|
Object.assign(out, await this.sweepSubagentOrphans());
|
|
70
153
|
out.repaired = await this.sweepOpenAgentCalls();
|
|
71
|
-
out.stopped =
|
|
154
|
+
out.stopped =
|
|
155
|
+
(await this.sweepForkChildrenOfFinished()) + (await this.sweepTreesOfDeletedRoots());
|
|
156
|
+
out.delivered = await this.sweepUndelivered();
|
|
157
|
+
out.restarted = await this.sweepParkedMessages();
|
|
72
158
|
out.resumed = await this.sweepStuckRuns();
|
|
73
159
|
return out;
|
|
74
160
|
}
|
|
@@ -81,7 +167,7 @@ export class Waits {
|
|
|
81
167
|
* 运行(置 waiting 之后到达的中止由 `POST .../abort` 看到 waiting 直接处理,两边不会都漏掉)。
|
|
82
168
|
*/
|
|
83
169
|
async suspend(runId, conversationId, waitingFor, abort) {
|
|
84
|
-
const r = await this.
|
|
170
|
+
const r = await this.db
|
|
85
171
|
.updateTable("runs")
|
|
86
172
|
.set({
|
|
87
173
|
status: "waiting",
|
|
@@ -93,60 +179,70 @@ export class Waits {
|
|
|
93
179
|
.where("status", "=", "running")
|
|
94
180
|
.executeTakeFirst();
|
|
95
181
|
if (Number(r.numUpdatedRows) === 0) {
|
|
96
|
-
this.
|
|
182
|
+
this.log.warn("run is no longer running; not suspending", { runId });
|
|
97
183
|
return;
|
|
98
184
|
}
|
|
99
|
-
const stop = abort ?? (await this.
|
|
185
|
+
const stop = abort ?? (await this.abort.requested(runId)) ?? null;
|
|
100
186
|
if (stop && (await this.abortWaiting(conversationId, runId, stop.byAccountId, stop.detail))) {
|
|
101
187
|
return;
|
|
102
188
|
}
|
|
103
|
-
await this.
|
|
189
|
+
await this.surfaceInRoot(runId, conversationId, waitingFor);
|
|
104
190
|
await this.scheduleTimeout(waitingFor, runId);
|
|
105
191
|
if (await this.isSettled(waitingFor, runId))
|
|
106
192
|
await this.resume(runId, waitingFor.id);
|
|
107
193
|
}
|
|
108
194
|
/**
|
|
109
195
|
* A sub-agent's run waits for an approval or an input (sub-agents spec §9): appends
|
|
110
|
-
* `subagent_waiting` to the
|
|
111
|
-
*
|
|
112
|
-
*
|
|
113
|
-
*
|
|
196
|
+
* `subagent_waiting` to the **root** conversation of its tree, whatever its depth (agent map spec
|
|
197
|
+
* §7, {@link rootSurfaceOf}; idem `subagent_waiting:<childRunId>:<waitId>`), so the web and the
|
|
198
|
+
* channel outbound show the card where the person looks. The approval or question itself stays
|
|
199
|
+
* the child run's, with the run's trigger account (inherited down the chain) as the person asked.
|
|
200
|
+
* Not a run of a sub-agent, or a `subagents` wait: nothing. Display only: a failure is logged,
|
|
201
|
+
* the wait goes on.
|
|
114
202
|
*/
|
|
115
|
-
async
|
|
203
|
+
async surfaceInRoot(runId, conversationId, waitingFor) {
|
|
116
204
|
if (waitingFor.kind === "subagents")
|
|
117
205
|
return;
|
|
118
206
|
try {
|
|
119
|
-
const
|
|
120
|
-
|
|
121
|
-
.select(["parent_conversation_id", "parent_run_id", "child_conversation_id"])
|
|
122
|
-
.where("child_run_id", "=", runId)
|
|
123
|
-
.executeTakeFirst();
|
|
124
|
-
if (!d)
|
|
207
|
+
const target = await rootSurfaceOf(this.db, conversationId, runId);
|
|
208
|
+
if (!target)
|
|
125
209
|
return;
|
|
126
210
|
const row = waitingFor.kind === "approval"
|
|
127
|
-
? await this.
|
|
211
|
+
? await this.db
|
|
128
212
|
.selectFrom("approvals")
|
|
129
|
-
.select(["tool_key", "expires_at"])
|
|
213
|
+
.select(["tool_key", "expires_at", "requested_for", "approver_role"])
|
|
130
214
|
.where("id", "=", waitingFor.id)
|
|
131
215
|
.executeTakeFirst()
|
|
132
|
-
|
|
216
|
+
.then((r) => r && {
|
|
217
|
+
tool_key: r.tool_key,
|
|
218
|
+
expires_at: r.expires_at,
|
|
219
|
+
approver: {
|
|
220
|
+
requestedFor: r.requested_for,
|
|
221
|
+
approverRole: r.approver_role,
|
|
222
|
+
},
|
|
223
|
+
})
|
|
224
|
+
: await this.db
|
|
133
225
|
.selectFrom("questions")
|
|
134
226
|
.select([sql `spec->>'toolKey'`.as("tool_key"), "expires_at"])
|
|
135
227
|
.where("id", "=", waitingFor.id)
|
|
136
228
|
.executeTakeFirst();
|
|
137
229
|
if (!row)
|
|
138
230
|
return;
|
|
139
|
-
await this.
|
|
231
|
+
await this.eventLog.append(target.conversationId, [
|
|
140
232
|
{
|
|
141
233
|
type: "subagent_waiting",
|
|
142
|
-
runId:
|
|
234
|
+
runId: target.runId,
|
|
143
235
|
idemKey: subagentWaitingIdemKey(runId, waitingFor.id),
|
|
144
236
|
payload: {
|
|
145
|
-
subagentId:
|
|
237
|
+
subagentId: conversationId,
|
|
146
238
|
childRunId: runId,
|
|
239
|
+
path: target.path,
|
|
147
240
|
kind: waitingFor.kind,
|
|
148
241
|
...(waitingFor.kind === "approval"
|
|
149
|
-
? {
|
|
242
|
+
? {
|
|
243
|
+
approvalId: waitingFor.id,
|
|
244
|
+
...row.approver,
|
|
245
|
+
}
|
|
150
246
|
: { questionId: waitingFor.id }),
|
|
151
247
|
toolKey: row.tool_key,
|
|
152
248
|
expiresAt: new Date(row.expires_at).toISOString(),
|
|
@@ -155,7 +251,7 @@ export class Waits {
|
|
|
155
251
|
]);
|
|
156
252
|
}
|
|
157
253
|
catch (err) {
|
|
158
|
-
this.
|
|
254
|
+
this.log.error("cannot surface a sub-agent's wait in its root conversation", { runId, err });
|
|
159
255
|
}
|
|
160
256
|
}
|
|
161
257
|
/**
|
|
@@ -164,7 +260,7 @@ export class Waits {
|
|
|
164
260
|
* 投递失败 → 撤回为 waiting(等待时长已计入,重新从现在起计),之后超时任务到点会再次续跑,并抛出。
|
|
165
261
|
*/
|
|
166
262
|
async resume(runId, waitId) {
|
|
167
|
-
const row = await this.
|
|
263
|
+
const row = await this.db
|
|
168
264
|
.updateTable("runs")
|
|
169
265
|
.set({
|
|
170
266
|
status: "queued",
|
|
@@ -184,12 +280,13 @@ export class Waits {
|
|
|
184
280
|
.select(sql `1`.as("one"))
|
|
185
281
|
.where("questions.run_id", "=", runId)
|
|
186
282
|
.where("questions.status", "=", "pending"))))
|
|
187
|
-
// sub-
|
|
188
|
-
//
|
|
283
|
+
// a fork invocation's sub-agent (phase D; agent map spec §5.4: background `Agent`
|
|
284
|
+
// children never hold their parent run) is no longer active
|
|
189
285
|
.where(({ not, exists, selectFrom }) => not(exists(selectFrom("subagent_dispatches as sd")
|
|
190
286
|
.innerJoin("runs as cr", "cr.id", "sd.child_run_id")
|
|
191
287
|
.select(sql `1`.as("one"))
|
|
192
288
|
.where("sd.parent_run_id", "=", runId)
|
|
289
|
+
.where("sd.for_skill", "=", true)
|
|
193
290
|
.where("cr.status", "in", ACTIVE_RUN_STATUSES))))
|
|
194
291
|
.returning(["conversation_id"])
|
|
195
292
|
.executeTakeFirst();
|
|
@@ -197,11 +294,11 @@ export class Waits {
|
|
|
197
294
|
return false;
|
|
198
295
|
const jobId = resumeJobId(row.conversation_id, waitId);
|
|
199
296
|
try {
|
|
200
|
-
await this.
|
|
297
|
+
await this.runQueue.enqueue({ runId, conversationId: row.conversation_id }, jobId);
|
|
201
298
|
}
|
|
202
299
|
catch (err) {
|
|
203
|
-
this.
|
|
204
|
-
await this.
|
|
300
|
+
this.log.error("cannot enqueue resumed run; back to waiting", { runId, jobId, err });
|
|
301
|
+
await this.db
|
|
205
302
|
.updateTable("runs")
|
|
206
303
|
.set({ status: "waiting", waiting_since: sql `now()`, job_id: null, queued_at: null })
|
|
207
304
|
.where("id", "=", runId)
|
|
@@ -219,17 +316,17 @@ export class Waits {
|
|
|
219
316
|
*/
|
|
220
317
|
async expire(kind, id, at) {
|
|
221
318
|
if (kind === "subagents") {
|
|
222
|
-
// A safety net (spec §7.2, §12)
|
|
223
|
-
// stopped
|
|
319
|
+
// A safety net (spec §7.2, §12) of a fork invocation's wait: its child, still active, is
|
|
320
|
+
// stopped and reports to the parent, which then resumes. The resume tried here
|
|
224
321
|
// covers a step whose children were all done already.
|
|
225
322
|
if (!at) {
|
|
226
|
-
this.
|
|
323
|
+
this.log.warn("sub-agent wait timeout without its run; ignored", { id });
|
|
227
324
|
return {};
|
|
228
325
|
}
|
|
229
326
|
const { runId, step } = at;
|
|
230
|
-
const stopped =
|
|
327
|
+
const stopped = await this.stopChildren(runId, null, { step, detail: "wait_timeout" });
|
|
231
328
|
if (stopped > 0) {
|
|
232
|
-
this.
|
|
329
|
+
this.log.warn("sub-agent wait timed out; stopping its sub-agents", {
|
|
233
330
|
runId,
|
|
234
331
|
id,
|
|
235
332
|
stopped,
|
|
@@ -238,7 +335,7 @@ export class Waits {
|
|
|
238
335
|
const resumed = await this.resume(runId, id);
|
|
239
336
|
return { acted: stopped > 0 || resumed };
|
|
240
337
|
}
|
|
241
|
-
const r = kind === "approval" ? await this.
|
|
338
|
+
const r = kind === "approval" ? await this.approvals.expire(id) : await this.questions.expire(id);
|
|
242
339
|
if (r.outcome === "not_due" && r.record) {
|
|
243
340
|
return { notDueUntil: new Date(r.record.expiresAt).getTime() };
|
|
244
341
|
}
|
|
@@ -253,94 +350,93 @@ export class Waits {
|
|
|
253
350
|
* 运行已不是 waiting(例如刚被续跑)→ 返回 false,由调用方走常规中止。
|
|
254
351
|
*/
|
|
255
352
|
async abortWaiting(conversationId, runId, byAccountId, detail) {
|
|
256
|
-
|
|
257
|
-
const toSeq = await this.
|
|
258
|
-
|
|
259
|
-
await t
|
|
260
|
-
.selectFrom("conversations")
|
|
261
|
-
.select("id")
|
|
262
|
-
.where("id", "=", conversationId)
|
|
263
|
-
.forUpdate()
|
|
264
|
-
.executeTakeFirst();
|
|
265
|
-
const run = await t
|
|
266
|
-
.selectFrom("runs")
|
|
267
|
-
.select("status")
|
|
268
|
-
.where("id", "=", runId)
|
|
269
|
-
.where("conversation_id", "=", conversationId)
|
|
270
|
-
.forUpdate()
|
|
271
|
-
.executeTakeFirst();
|
|
272
|
-
if (run?.status !== "waiting")
|
|
273
|
-
return null;
|
|
274
|
-
await this.d.approvals.cancelPendingIn(t, runId);
|
|
275
|
-
await this.d.questions.cancelPendingIn(t, runId);
|
|
276
|
-
// 本运行全部审批 / 输入请求涉及的调用(不只刚取消的):决定已提交、续跑尚未发生时被中止的调用同样没有结果,
|
|
277
|
-
// 一并写取消说明(已有结果的按幂等键命中、不重复)。同一调用先审批后输入,后者覆盖前者。
|
|
278
|
-
const cancelled = new Map();
|
|
279
|
-
const steps = new Set();
|
|
280
|
-
const approvals = await t
|
|
281
|
-
.selectFrom("approvals")
|
|
282
|
-
.select(["id", "call_id", "tool_key"])
|
|
283
|
-
.where("run_id", "=", runId)
|
|
284
|
-
.orderBy("created_at")
|
|
285
|
-
.execute();
|
|
286
|
-
for (const a of approvals) {
|
|
287
|
-
cancelled.set(a.call_id, { toolKey: a.tool_key, text: APPROVAL_CANCELLED_TEXT });
|
|
288
|
-
const step = await this.approvalStep(t, conversationId, a.id);
|
|
289
|
-
if (step !== null)
|
|
290
|
-
steps.add(step);
|
|
291
|
-
}
|
|
292
|
-
const questions = await t
|
|
293
|
-
.selectFrom("questions")
|
|
294
|
-
.select(["call_id", "spec"])
|
|
295
|
-
.where("run_id", "=", runId)
|
|
296
|
-
.orderBy("created_at")
|
|
297
|
-
.execute();
|
|
298
|
-
for (const q of questions) {
|
|
299
|
-
const spec = q.spec;
|
|
300
|
-
cancelled.set(q.call_id, { toolKey: spec.toolKey ?? "", text: INPUT_CANCELLED_TEXT });
|
|
301
|
-
if (typeof spec.step === "number")
|
|
302
|
-
steps.add(spec.step);
|
|
303
|
-
}
|
|
304
|
-
// a parent waiting on sub-agents (spec §12): its open `agent` calls get their results
|
|
305
|
-
const agents = await this.d.subagents?.stopOpenCalls?.(t, runId);
|
|
306
|
-
for (const step of agents?.steps ?? [])
|
|
307
|
-
steps.add(step);
|
|
308
|
-
const results = await this.stoppedResults(t, conversationId, runId, [...steps], cancelled, agents?.callIds);
|
|
309
|
-
if (results.length > 0)
|
|
310
|
-
await this.d.eventLog.append(conversationId, results, t);
|
|
311
|
-
stopped = agents;
|
|
312
|
-
return finishRunIn(t, this.d.eventLog, {
|
|
313
|
-
conversationId,
|
|
314
|
-
runId,
|
|
315
|
-
status: "aborted",
|
|
316
|
-
consumed: null,
|
|
317
|
-
event: {
|
|
318
|
-
type: "run_aborted",
|
|
319
|
-
payload: { byAccountId, reason: "user", ...(detail !== undefined && { detail }) },
|
|
320
|
-
},
|
|
321
|
-
});
|
|
322
|
-
});
|
|
353
|
+
const st = {};
|
|
354
|
+
const toSeq = await this.abortWaitingIn(conversationId, runId, byAccountId, detail, st);
|
|
355
|
+
const stopped = st.stopped;
|
|
323
356
|
if (toSeq === null)
|
|
324
357
|
return false;
|
|
325
|
-
await notifyFinished(this.
|
|
326
|
-
await this.
|
|
327
|
-
|
|
328
|
-
.catch((err) => this.
|
|
358
|
+
await notifyFinished(this.eventLog, conversationId, toSeq, "aborted");
|
|
359
|
+
await this.checkpoints
|
|
360
|
+
.deleteThread(runId)
|
|
361
|
+
.catch((err) => this.log.warn("checkpoint delete failed", { runId, err }));
|
|
329
362
|
stopped?.fire();
|
|
330
363
|
// a stopped sub-agent reports to its parent now, not at the next sweep (a no-op for other runs)
|
|
331
|
-
await this.
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
// report "stopped with this run"); the wait sweep is the backstop
|
|
336
|
-
await this.d.subagents
|
|
337
|
-
?.stop(runId, null)
|
|
338
|
-
.catch((err) => this.d.log.error("cannot stop the sub-agents of a run", { runId, err }));
|
|
364
|
+
await this.childFinished(runId).catch((err) => this.log.error("cannot report stopped sub-agent run", { runId, err }));
|
|
365
|
+
// a stopped run stops its fork child (spec §12), on its behalf (no account: it reports
|
|
366
|
+
// "stopped with this run"); background children keep running; the wait sweep is the backstop
|
|
367
|
+
await this.stopChildren(runId, null).catch((err) => this.log.error("cannot stop the sub-agents of a run", { runId, err }));
|
|
339
368
|
return true;
|
|
340
369
|
}
|
|
370
|
+
/** {@link abortWaiting}'s transaction; the open `Agent` calls it wrote go back through `st`. */
|
|
371
|
+
async abortWaitingIn(conversationId, runId, byAccountId, detail, st) {
|
|
372
|
+
const t = this.db;
|
|
373
|
+
await t
|
|
374
|
+
.selectFrom("conversations")
|
|
375
|
+
.select("id")
|
|
376
|
+
.where("id", "=", conversationId)
|
|
377
|
+
.forUpdate()
|
|
378
|
+
.executeTakeFirst();
|
|
379
|
+
const run = await t
|
|
380
|
+
.selectFrom("runs")
|
|
381
|
+
.select("status")
|
|
382
|
+
.where("id", "=", runId)
|
|
383
|
+
.where("conversation_id", "=", conversationId)
|
|
384
|
+
.forUpdate()
|
|
385
|
+
.executeTakeFirst();
|
|
386
|
+
if (run?.status !== "waiting")
|
|
387
|
+
return null;
|
|
388
|
+
await this.approvals.cancelPendingIn(runId);
|
|
389
|
+
await this.questions.cancelPendingIn(runId);
|
|
390
|
+
// 本运行全部审批 / 输入请求涉及的调用(不只刚取消的):决定已提交、续跑尚未发生时被中止的调用同样没有结果,
|
|
391
|
+
// 一并写取消说明(已有结果的按幂等键命中、不重复)。同一调用先审批后输入,后者覆盖前者。
|
|
392
|
+
const cancelled = new Map();
|
|
393
|
+
const steps = new Set();
|
|
394
|
+
const approvals = await t
|
|
395
|
+
.selectFrom("approvals")
|
|
396
|
+
.select(["id", "call_id", "tool_key"])
|
|
397
|
+
.where("run_id", "=", runId)
|
|
398
|
+
.orderBy("created_at")
|
|
399
|
+
.execute();
|
|
400
|
+
for (const a of approvals) {
|
|
401
|
+
cancelled.set(a.call_id, { toolKey: a.tool_key, text: APPROVAL_CANCELLED_TEXT });
|
|
402
|
+
const step = await this.approvalStep(t, conversationId, a.id);
|
|
403
|
+
if (step !== null)
|
|
404
|
+
steps.add(step);
|
|
405
|
+
}
|
|
406
|
+
const questions = await t
|
|
407
|
+
.selectFrom("questions")
|
|
408
|
+
.select(["call_id", "spec"])
|
|
409
|
+
.where("run_id", "=", runId)
|
|
410
|
+
.orderBy("created_at")
|
|
411
|
+
.execute();
|
|
412
|
+
for (const q of questions) {
|
|
413
|
+
const spec = q.spec;
|
|
414
|
+
cancelled.set(q.call_id, { toolKey: spec.toolKey ?? "", text: INPUT_CANCELLED_TEXT });
|
|
415
|
+
if (typeof spec.step === "number")
|
|
416
|
+
steps.add(spec.step);
|
|
417
|
+
}
|
|
418
|
+
// a run waiting on its fork invocation's sub-agent: the report (`pairStoppedForks`)
|
|
419
|
+
const agents = await this.pipeline.stopOpenAgentCalls(runId);
|
|
420
|
+
for (const step of agents.steps)
|
|
421
|
+
steps.add(step);
|
|
422
|
+
const results = await this.stoppedResults(t, conversationId, runId, [...steps], cancelled, agents?.callIds);
|
|
423
|
+
if (results.length > 0)
|
|
424
|
+
await this.eventLog.appendIn(conversationId, results);
|
|
425
|
+
st.stopped = agents;
|
|
426
|
+
return this.finisher.finishIn({
|
|
427
|
+
conversationId,
|
|
428
|
+
runId,
|
|
429
|
+
status: "aborted",
|
|
430
|
+
consumed: null,
|
|
431
|
+
event: {
|
|
432
|
+
type: "run_aborted",
|
|
433
|
+
payload: { byAccountId, reason: "user", ...(detail !== undefined && { detail }) },
|
|
434
|
+
},
|
|
435
|
+
});
|
|
436
|
+
}
|
|
341
437
|
/** 扫描 3:运行已终态(如暂停途中失败)仍 pending 的审批 / 输入请求 → 取消(写决定 / 回答事件)。 */
|
|
342
438
|
async sweepFinishedRuns() {
|
|
343
|
-
const
|
|
439
|
+
const db = this.db;
|
|
344
440
|
const runs = await db
|
|
345
441
|
.selectFrom("runs")
|
|
346
442
|
.select(["id", "conversation_id"])
|
|
@@ -363,7 +459,7 @@ export class Waits {
|
|
|
363
459
|
const n = await this.cancelWaitsOfFinished(run.conversation_id, run.id);
|
|
364
460
|
if (n > 0) {
|
|
365
461
|
total += n;
|
|
366
|
-
this.
|
|
462
|
+
this.log.warn("wait sweep: cancelled waits of finished run", {
|
|
367
463
|
runId: run.id,
|
|
368
464
|
conversationId: run.conversation_id,
|
|
369
465
|
count: n,
|
|
@@ -371,7 +467,7 @@ export class Waits {
|
|
|
371
467
|
}
|
|
372
468
|
}
|
|
373
469
|
catch (err) {
|
|
374
|
-
this.
|
|
470
|
+
this.log.error("wait sweep: cannot cancel waits of finished run", { runId: run.id, err });
|
|
375
471
|
}
|
|
376
472
|
}
|
|
377
473
|
return total;
|
|
@@ -381,39 +477,41 @@ export class Waits {
|
|
|
381
477
|
* 提交后发布事件。返回取消的条数(并发的另一副本拿到锁时已无 pending → 0)。
|
|
382
478
|
*/
|
|
383
479
|
async cancelWaitsOfFinished(conversationId, runId) {
|
|
384
|
-
const r = await this.
|
|
385
|
-
await t
|
|
386
|
-
.selectFrom("conversations")
|
|
387
|
-
.select("id")
|
|
388
|
-
.where("id", "=", conversationId)
|
|
389
|
-
.forUpdate()
|
|
390
|
-
.executeTakeFirst();
|
|
391
|
-
const run = await t
|
|
392
|
-
.selectFrom("runs")
|
|
393
|
-
.select("status")
|
|
394
|
-
.where("id", "=", runId)
|
|
395
|
-
.forUpdate()
|
|
396
|
-
.executeTakeFirst();
|
|
397
|
-
if (!run || !TERMINAL_RUN_STATUSES.includes(run.status))
|
|
398
|
-
return 0;
|
|
399
|
-
const a = await this.d.approvals.cancelPendingIn(t, runId);
|
|
400
|
-
const q = await this.d.questions.cancelPendingIn(t, runId);
|
|
401
|
-
return a.length + q.length;
|
|
402
|
-
});
|
|
480
|
+
const r = await this.cancelWaitsOfFinishedIn(conversationId, runId);
|
|
403
481
|
if (r > 0) {
|
|
404
|
-
const last = await this.
|
|
482
|
+
const last = await this.db
|
|
405
483
|
.selectFrom("conversation_events")
|
|
406
484
|
.select(sql `max(seq)`.as("seq"))
|
|
407
485
|
.where("conversation_id", "=", conversationId)
|
|
408
486
|
.executeTakeFirst();
|
|
409
487
|
if (last?.seq != null)
|
|
410
|
-
await this.
|
|
488
|
+
await this.eventLog.notify(conversationId, Number(last.seq));
|
|
411
489
|
}
|
|
412
490
|
return r;
|
|
413
491
|
}
|
|
492
|
+
async cancelWaitsOfFinishedIn(conversationId, runId) {
|
|
493
|
+
const t = this.db;
|
|
494
|
+
await t
|
|
495
|
+
.selectFrom("conversations")
|
|
496
|
+
.select("id")
|
|
497
|
+
.where("id", "=", conversationId)
|
|
498
|
+
.forUpdate()
|
|
499
|
+
.executeTakeFirst();
|
|
500
|
+
const run = await t
|
|
501
|
+
.selectFrom("runs")
|
|
502
|
+
.select("status")
|
|
503
|
+
.where("id", "=", runId)
|
|
504
|
+
.forUpdate()
|
|
505
|
+
.executeTakeFirst();
|
|
506
|
+
if (!run || !TERMINAL_RUN_STATUSES.includes(run.status))
|
|
507
|
+
return 0;
|
|
508
|
+
const a = await this.approvals.cancelPendingIn(runId);
|
|
509
|
+
const q = await this.questions.cancelPendingIn(runId);
|
|
510
|
+
return a.length + q.length;
|
|
511
|
+
}
|
|
414
512
|
/** 扫描 1:`expires_at < now()` 仍 pending 的审批 / 输入请求 → 与超时任务同一路径(置 expired、写事件、续跑)。 */
|
|
415
513
|
async sweepOverdue() {
|
|
416
|
-
const
|
|
514
|
+
const db = this.db;
|
|
417
515
|
const approvals = await db
|
|
418
516
|
.selectFrom("approvals")
|
|
419
517
|
.select(["id", "run_id"])
|
|
@@ -438,12 +536,12 @@ export class Waits {
|
|
|
438
536
|
for (const w of due) {
|
|
439
537
|
try {
|
|
440
538
|
const r = w.kind === "approval"
|
|
441
|
-
? await this.
|
|
442
|
-
: await this.
|
|
539
|
+
? await this.approvals.expire(w.id)
|
|
540
|
+
: await this.questions.expire(w.id);
|
|
443
541
|
if (r.outcome !== "expired")
|
|
444
542
|
continue;
|
|
445
543
|
total++;
|
|
446
|
-
this.
|
|
544
|
+
this.log.warn("wait sweep: expired overdue wait", {
|
|
447
545
|
kind: w.kind,
|
|
448
546
|
id: w.id,
|
|
449
547
|
runId: w.runId,
|
|
@@ -452,22 +550,20 @@ export class Waits {
|
|
|
452
550
|
await this.resume(r.record.runId, w.id);
|
|
453
551
|
}
|
|
454
552
|
catch (err) {
|
|
455
|
-
this.
|
|
553
|
+
this.log.error("wait sweep: cannot expire overdue wait", { kind: w.kind, id: w.id, err });
|
|
456
554
|
}
|
|
457
555
|
}
|
|
458
556
|
return total + (await this.sweepOverdueSubagents());
|
|
459
557
|
}
|
|
460
558
|
/**
|
|
461
559
|
* Sub-agents waits past their `runs.wait_expires_at` (their timeout job was lost): expired the
|
|
462
|
-
* way the timeout job would ({@link expire}: the
|
|
463
|
-
* parent resumes once
|
|
464
|
-
*
|
|
560
|
+
* way the timeout job would ({@link expire}: the fork invocation's active child stops as
|
|
561
|
+
* `timed out`, the parent resumes once it is done). Only fork invocations wait (agent map spec
|
|
562
|
+
* §5.4); their step is the run's fork dispatch step. A run stays here until its children have
|
|
465
563
|
* stopped; a pass that neither stopped a child nor resumed the run is not counted.
|
|
466
564
|
*/
|
|
467
565
|
async sweepOverdueSubagents() {
|
|
468
|
-
|
|
469
|
-
return 0;
|
|
470
|
-
const runs = await this.d.db
|
|
566
|
+
const runs = await this.db
|
|
471
567
|
.selectFrom("runs")
|
|
472
568
|
.select(["id"])
|
|
473
569
|
.where("status", "=", "waiting")
|
|
@@ -478,10 +574,11 @@ export class Waits {
|
|
|
478
574
|
let total = 0;
|
|
479
575
|
for (const r of runs) {
|
|
480
576
|
try {
|
|
481
|
-
const last = await this.
|
|
577
|
+
const last = await this.db
|
|
482
578
|
.selectFrom("subagent_dispatches")
|
|
483
579
|
.select(sql `max(step)`.as("step"))
|
|
484
580
|
.where("parent_run_id", "=", r.id)
|
|
581
|
+
.where("for_skill", "=", true)
|
|
485
582
|
.executeTakeFirst();
|
|
486
583
|
if (last?.step == null)
|
|
487
584
|
continue;
|
|
@@ -492,11 +589,11 @@ export class Waits {
|
|
|
492
589
|
const { acted } = await this.expire("subagents", id, { runId: r.id, step });
|
|
493
590
|
if (!acted)
|
|
494
591
|
continue;
|
|
495
|
-
this.
|
|
592
|
+
this.log.warn("wait sweep: expired overdue wait", { kind: "subagents", id, runId: r.id });
|
|
496
593
|
total++;
|
|
497
594
|
}
|
|
498
595
|
catch (err) {
|
|
499
|
-
this.
|
|
596
|
+
this.log.error("wait sweep: cannot expire overdue wait", {
|
|
500
597
|
kind: "subagents",
|
|
501
598
|
runId: r.id,
|
|
502
599
|
err,
|
|
@@ -515,10 +612,7 @@ export class Waits {
|
|
|
515
612
|
*/
|
|
516
613
|
async sweepSubagentOrphans() {
|
|
517
614
|
const out = { requeued: 0, orphaned: 0 };
|
|
518
|
-
const
|
|
519
|
-
if (!sub)
|
|
520
|
-
return out;
|
|
521
|
-
const runs = await this.d.db
|
|
615
|
+
const runs = await this.db
|
|
522
616
|
.selectFrom("runs")
|
|
523
617
|
.innerJoin("conversations as c", "c.id", "runs.conversation_id")
|
|
524
618
|
.select(["runs.id", "runs.conversation_id"])
|
|
@@ -538,23 +632,23 @@ export class Waits {
|
|
|
538
632
|
.execute();
|
|
539
633
|
for (const run of runs) {
|
|
540
634
|
try {
|
|
541
|
-
const r = await this.
|
|
635
|
+
const r = await this.runQueue.repairOrphan(run.conversation_id, run.id);
|
|
542
636
|
if (r === null)
|
|
543
637
|
continue;
|
|
544
638
|
if (r === "failed") {
|
|
545
639
|
out.orphaned++;
|
|
546
|
-
await
|
|
640
|
+
await this.childFinished(run.id);
|
|
547
641
|
}
|
|
548
642
|
else
|
|
549
643
|
out.requeued++;
|
|
550
|
-
this.
|
|
644
|
+
this.log.warn("wait sweep: repaired orphaned sub-agent run", {
|
|
551
645
|
runId: run.id,
|
|
552
646
|
conversationId: run.conversation_id,
|
|
553
647
|
outcome: r,
|
|
554
648
|
});
|
|
555
649
|
}
|
|
556
650
|
catch (err) {
|
|
557
|
-
this.
|
|
651
|
+
this.log.error("wait sweep: cannot repair orphaned sub-agent run", {
|
|
558
652
|
runId: run.id,
|
|
559
653
|
err,
|
|
560
654
|
});
|
|
@@ -563,76 +657,91 @@ export class Waits {
|
|
|
563
657
|
return out;
|
|
564
658
|
}
|
|
565
659
|
/**
|
|
566
|
-
*
|
|
567
|
-
*
|
|
568
|
-
*
|
|
569
|
-
*
|
|
570
|
-
*
|
|
571
|
-
* stopped
|
|
572
|
-
*
|
|
660
|
+
* Idle sub-agent conversations (no active run, not deleted) with a message newer than what they
|
|
661
|
+
* consumed, written past the grace period and within the last day: a `SendMessage` that reached a
|
|
662
|
+
* run after its last model call is started by that run's post-job `ensureRun`
|
|
663
|
+
* (`RunQueue.childWakeIn`), which a replica dying after the terminal commit skips. Re-derived with
|
|
664
|
+
* the same `ensureRun` (its rules decide: a paused root starts nothing). A sub-agent whose last
|
|
665
|
+
* run was stopped (`aborted`) can never start from a message, so it is left out here, and the
|
|
666
|
+
* newest conversations come first (active within the last day), so parked messages that cannot
|
|
667
|
+
* start never fill the batch. Returns how many runs started.
|
|
573
668
|
*/
|
|
574
|
-
async
|
|
575
|
-
const
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
.
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
.
|
|
583
|
-
.where(
|
|
584
|
-
.
|
|
585
|
-
.
|
|
586
|
-
|
|
669
|
+
async sweepParkedMessages() {
|
|
670
|
+
const rows = await this.db
|
|
671
|
+
.selectFrom("conversations as c")
|
|
672
|
+
.select("c.id")
|
|
673
|
+
.where("c.kind", "=", "subagent")
|
|
674
|
+
.where("c.deleted_at", "is", null)
|
|
675
|
+
// every append bumps `updated_at`: a message of the last day implies it (an index-friendly
|
|
676
|
+
// bound before the event lookups)
|
|
677
|
+
.where("c.updated_at", ">", sql `now() - interval '1 day'`)
|
|
678
|
+
.where((eb) => sql `(
|
|
679
|
+
SELECT r.status FROM capybara.runs r WHERE r.conversation_id = ${eb.ref("c.id")}
|
|
680
|
+
ORDER BY r.created_at DESC, r.id DESC LIMIT 1
|
|
681
|
+
) IS DISTINCT FROM 'aborted'`)
|
|
682
|
+
.where(({ exists, selectFrom }) => exists(selectFrom("conversation_events as e")
|
|
683
|
+
.select(sql `1`.as("one"))
|
|
684
|
+
.whereRef("e.conversation_id", "=", "c.id")
|
|
685
|
+
.where("e.type", "=", "user_message")
|
|
686
|
+
.whereRef("e.seq", ">", "c.consumed_seq")
|
|
687
|
+
.where("e.created_at", "<", sql `now() - ${WAIT_SWEEP_GRACE_MS}::integer * interval '1 millisecond'`)
|
|
688
|
+
.where("e.created_at", ">", sql `now() - interval '1 day'`)))
|
|
689
|
+
.where(({ not, exists, selectFrom }) => not(exists(selectFrom("runs as r")
|
|
587
690
|
.select(sql `1`.as("one"))
|
|
588
|
-
.whereRef("
|
|
589
|
-
.where("
|
|
590
|
-
|
|
591
|
-
.
|
|
691
|
+
.whereRef("r.conversation_id", "=", "c.id")
|
|
692
|
+
.where("r.status", "in", ACTIVE_RUN_STATUSES))))
|
|
693
|
+
.orderBy("c.updated_at", "desc")
|
|
694
|
+
.orderBy("c.id")
|
|
592
695
|
.limit(WAIT_SWEEP_BATCH)
|
|
593
696
|
.execute();
|
|
594
|
-
|
|
595
|
-
|
|
697
|
+
let n = 0;
|
|
698
|
+
for (const c of rows) {
|
|
699
|
+
try {
|
|
700
|
+
if ((await this.runQueue.ensureRun(c.id)) === null)
|
|
701
|
+
continue;
|
|
702
|
+
n++;
|
|
703
|
+
this.log.warn("wait sweep: started a sub-agent's parked message", { conversationId: c.id });
|
|
704
|
+
}
|
|
705
|
+
catch (err) {
|
|
706
|
+
this.log.error("wait sweep: cannot start a sub-agent's parked message", {
|
|
707
|
+
conversationId: c.id,
|
|
708
|
+
err,
|
|
709
|
+
});
|
|
710
|
+
}
|
|
711
|
+
}
|
|
712
|
+
return n;
|
|
713
|
+
}
|
|
714
|
+
/**
|
|
715
|
+
* Finished runs (past the grace period, within the last day) triggered by a fork invocation that
|
|
716
|
+
* has no report ({@link unreportedForkRuns}): a terminal path that skipped
|
|
717
|
+
* `stopOpenAgentCalls`, such as an old replica's abort, would otherwise leave a fork lead without
|
|
718
|
+
* its report. Each is repaired under the conversation row lock with the normal
|
|
719
|
+
* `stopOpenAgentCalls` (an ended child gives its result, an active one the stopped text;
|
|
720
|
+
* idempotency keys make it safe against the regular paths); an active fork child is then stopped
|
|
721
|
+
* by {@link sweepForkChildrenOfFinished}. An `Agent` call has its result from its dispatch (agent
|
|
722
|
+
* map spec §4.1).
|
|
723
|
+
*/
|
|
724
|
+
async sweepOpenAgentCalls() {
|
|
725
|
+
const runs = await unreportedForkRuns(this.db);
|
|
596
726
|
let total = 0;
|
|
597
727
|
for (const r of runs) {
|
|
598
728
|
try {
|
|
599
|
-
|
|
600
|
-
const toSeq = await this.
|
|
601
|
-
|
|
602
|
-
await t
|
|
603
|
-
.selectFrom("conversations")
|
|
604
|
-
.select("id")
|
|
605
|
-
.where("id", "=", r.parent_conversation_id)
|
|
606
|
-
.forUpdate()
|
|
607
|
-
.executeTakeFirst();
|
|
608
|
-
const run = await t
|
|
609
|
-
.selectFrom("runs")
|
|
610
|
-
.select("status")
|
|
611
|
-
.where("id", "=", r.parent_run_id)
|
|
612
|
-
.executeTakeFirst();
|
|
613
|
-
if (run === undefined ||
|
|
614
|
-
!TERMINAL_RUN_STATUSES.includes(run.status)) {
|
|
615
|
-
return null;
|
|
616
|
-
}
|
|
617
|
-
const stopped = await stopOpenCalls(t, r.parent_run_id);
|
|
618
|
-
if (stopped.callIds.size === 0)
|
|
619
|
-
return null;
|
|
620
|
-
fire = stopped.fire;
|
|
621
|
-
return stopped.toSeq ?? null;
|
|
622
|
-
});
|
|
729
|
+
const st = {};
|
|
730
|
+
const toSeq = await this.repairOpenAgentCallsIn(r.parent_conversation_id, r.parent_run_id, st);
|
|
731
|
+
const fire = st.fire;
|
|
623
732
|
if (fire === undefined)
|
|
624
733
|
continue;
|
|
625
734
|
if (toSeq !== null)
|
|
626
|
-
await this.
|
|
735
|
+
await this.eventLog.notify(r.parent_conversation_id, toSeq);
|
|
627
736
|
fire();
|
|
628
737
|
total++;
|
|
629
|
-
this.
|
|
738
|
+
this.log.warn("wait sweep: wrote the missing fork report of a finished run", {
|
|
630
739
|
runId: r.parent_run_id,
|
|
631
740
|
conversationId: r.parent_conversation_id,
|
|
632
741
|
});
|
|
633
742
|
}
|
|
634
743
|
catch (err) {
|
|
635
|
-
this.
|
|
744
|
+
this.log.error("wait sweep: cannot write the missing fork report of a finished run", {
|
|
636
745
|
runId: r.parent_run_id,
|
|
637
746
|
err,
|
|
638
747
|
});
|
|
@@ -640,20 +749,43 @@ export class Waits {
|
|
|
640
749
|
}
|
|
641
750
|
return total;
|
|
642
751
|
}
|
|
752
|
+
/** One run's repair of {@link sweepOpenAgentCalls}; its observe hooks go back through `st`. */
|
|
753
|
+
async repairOpenAgentCallsIn(conversationId, runId, st) {
|
|
754
|
+
const t = this.db;
|
|
755
|
+
await t
|
|
756
|
+
.selectFrom("conversations")
|
|
757
|
+
.select("id")
|
|
758
|
+
.where("id", "=", conversationId)
|
|
759
|
+
.forUpdate()
|
|
760
|
+
.executeTakeFirst();
|
|
761
|
+
const run = await t
|
|
762
|
+
.selectFrom("runs")
|
|
763
|
+
.select("status")
|
|
764
|
+
.where("id", "=", runId)
|
|
765
|
+
.executeTakeFirst();
|
|
766
|
+
if (run === undefined || !TERMINAL_RUN_STATUSES.includes(run.status)) {
|
|
767
|
+
return null;
|
|
768
|
+
}
|
|
769
|
+
const stopped = await this.pipeline.stopOpenAgentCalls(runId);
|
|
770
|
+
if (stopped.callIds.size === 0)
|
|
771
|
+
return null;
|
|
772
|
+
st.fire = stopped.fire;
|
|
773
|
+
return stopped.toSeq ?? null;
|
|
774
|
+
}
|
|
643
775
|
/**
|
|
644
|
-
* Active sub-agent runs of a parent run that finished more than the
|
|
645
|
-
* §12:
|
|
776
|
+
* Active fork sub-agent runs (phase D, `for_skill`) of a parent run that finished more than the
|
|
777
|
+
* grace period ago (§12: the run's terminal state stops its fork child and reports it stopped;
|
|
778
|
+
* this is the backstop) → stopped. Background `Agent` children of a finished run are the normal
|
|
779
|
+
* case and keep running (agent map spec §5.4).
|
|
646
780
|
*/
|
|
647
|
-
async
|
|
648
|
-
const
|
|
649
|
-
if (!sub)
|
|
650
|
-
return 0;
|
|
651
|
-
const parents = await this.d.db
|
|
781
|
+
async sweepForkChildrenOfFinished() {
|
|
782
|
+
const parents = await this.db
|
|
652
783
|
.selectFrom("subagent_dispatches as sd")
|
|
653
784
|
.innerJoin("runs as cr", "cr.id", "sd.child_run_id")
|
|
654
785
|
.innerJoin("runs as pr", "pr.id", "sd.parent_run_id")
|
|
655
786
|
.select("sd.parent_run_id")
|
|
656
787
|
.distinct()
|
|
788
|
+
.where("sd.for_skill", "=", true)
|
|
657
789
|
.where("cr.status", "in", ACTIVE_RUN_STATUSES)
|
|
658
790
|
.where("pr.status", "in", TERMINAL_RUN_STATUSES)
|
|
659
791
|
.where("pr.finished_at", "<", sql `now() - ${WAIT_SWEEP_GRACE_MS}::integer * interval '1 millisecond'`)
|
|
@@ -662,17 +794,17 @@ export class Waits {
|
|
|
662
794
|
let total = 0;
|
|
663
795
|
for (const p of parents) {
|
|
664
796
|
try {
|
|
665
|
-
const n = await
|
|
797
|
+
const n = await this.stopChildren(p.parent_run_id, null);
|
|
666
798
|
if (n === 0)
|
|
667
799
|
continue;
|
|
668
800
|
total += n;
|
|
669
|
-
this.
|
|
801
|
+
this.log.warn("wait sweep: stopped the fork sub-agent of a finished run", {
|
|
670
802
|
runId: p.parent_run_id,
|
|
671
803
|
count: n,
|
|
672
804
|
});
|
|
673
805
|
}
|
|
674
806
|
catch (err) {
|
|
675
|
-
this.
|
|
807
|
+
this.log.error("wait sweep: cannot stop the fork sub-agent of a finished run", {
|
|
676
808
|
runId: p.parent_run_id,
|
|
677
809
|
err,
|
|
678
810
|
});
|
|
@@ -680,13 +812,116 @@ export class Waits {
|
|
|
680
812
|
}
|
|
681
813
|
return total;
|
|
682
814
|
}
|
|
815
|
+
/**
|
|
816
|
+
* Active sub-agent runs with a deleted ancestor (agent map spec §10: deleting the root stops the
|
|
817
|
+
* whole tree; the delete's own {@link stopTree} is the normal path, this the backstop for a crash
|
|
818
|
+
* between marking the root deleted and stopping its tree, or a dispatch that raced it) → stopped
|
|
819
|
+
* on the deleter's behalf (no account). No grace period: nothing in a deleted tree should run.
|
|
820
|
+
*/
|
|
821
|
+
async sweepTreesOfDeletedRoots() {
|
|
822
|
+
const r = await sql `
|
|
823
|
+
WITH RECURSIVE up(run_id, conversation_id, status, ancestor, n) AS (
|
|
824
|
+
SELECT r.id, r.conversation_id, r.status, c.parent_conversation_id, 1
|
|
825
|
+
FROM capybara.runs r JOIN capybara.conversations c ON c.id = r.conversation_id
|
|
826
|
+
WHERE r.status IN ('queued', 'running', 'waiting') AND c.kind = 'subagent'
|
|
827
|
+
AND c.parent_conversation_id IS NOT NULL
|
|
828
|
+
UNION ALL
|
|
829
|
+
SELECT up.run_id, up.conversation_id, up.status, c.parent_conversation_id, up.n + 1
|
|
830
|
+
FROM up JOIN capybara.conversations c ON c.id = up.ancestor
|
|
831
|
+
WHERE c.deleted_at IS NULL AND c.parent_conversation_id IS NOT NULL AND up.n < 16
|
|
832
|
+
)
|
|
833
|
+
SELECT DISTINCT up.run_id, up.conversation_id, up.status
|
|
834
|
+
FROM up JOIN capybara.conversations a ON a.id = up.ancestor
|
|
835
|
+
WHERE a.deleted_at IS NOT NULL
|
|
836
|
+
LIMIT ${WAIT_SWEEP_BATCH}`.execute(this.db);
|
|
837
|
+
let total = 0;
|
|
838
|
+
for (const run of r.rows) {
|
|
839
|
+
try {
|
|
840
|
+
// already asked to stop (a worker holds it and stops it at its next check): not again
|
|
841
|
+
if (run.status === "running" && (await this.abort.requested(run.run_id)) !== null)
|
|
842
|
+
continue;
|
|
843
|
+
await this.stopRun(run.conversation_id, run.run_id, run.status, null);
|
|
844
|
+
total++;
|
|
845
|
+
this.log.warn("wait sweep: stopped a sub-agent run of a deleted conversation's tree", {
|
|
846
|
+
runId: run.run_id,
|
|
847
|
+
});
|
|
848
|
+
}
|
|
849
|
+
catch (err) {
|
|
850
|
+
this.log.error("wait sweep: cannot stop a sub-agent run of a deleted tree", {
|
|
851
|
+
runId: run.run_id,
|
|
852
|
+
err,
|
|
853
|
+
});
|
|
854
|
+
}
|
|
855
|
+
}
|
|
856
|
+
return total;
|
|
857
|
+
}
|
|
858
|
+
/**
|
|
859
|
+
* Background sub-agent runs that finished more than the grace period ago (within the last day)
|
|
860
|
+
* whose parent has no `subagent_finished` for them (agent map spec §10: the finisher died after
|
|
861
|
+
* the child's terminal commit; the finish path writes `subagent_finished` and the delivery in one
|
|
862
|
+
* transaction) → {@link childFinished}, idempotent against a late finisher. Keyed on the child
|
|
863
|
+
* run, so a run nobody dispatched (a wake run, §5.3) is repaired too, and on
|
|
864
|
+
* `subagent_finished`, not on the delivery, so a child that finished before background
|
|
865
|
+
* dispatch (its result was the `Agent` call's, its `subagent_finished` written then) is never
|
|
866
|
+
* delivered a second time. Fork invocations' runs, a run without a terminal event in its log
|
|
867
|
+
* (nothing to deliver), a conversation never dispatched and a child whose parent conversation
|
|
868
|
+
* was deleted are skipped; only a written delivery counts.
|
|
869
|
+
*/
|
|
870
|
+
async sweepUndelivered() {
|
|
871
|
+
const runs = await this.db
|
|
872
|
+
.selectFrom("runs as cr")
|
|
873
|
+
.innerJoin("conversations as cc", "cc.id", "cr.conversation_id")
|
|
874
|
+
.innerJoin("conversations as pc", "pc.id", "cc.parent_conversation_id")
|
|
875
|
+
.select("cr.id as child_run_id")
|
|
876
|
+
.where("cc.kind", "=", "subagent")
|
|
877
|
+
.where("pc.deleted_at", "is", null)
|
|
878
|
+
.where("cr.status", "in", TERMINAL_RUN_STATUSES)
|
|
879
|
+
.where("cr.finished_at", "<", sql `now() - ${WAIT_SWEEP_GRACE_MS}::integer * interval '1 millisecond'`)
|
|
880
|
+
.where("cr.finished_at", ">", sql `now() - interval '1 day'`)
|
|
881
|
+
.where(({ exists, selectFrom }) => exists(selectFrom("subagent_dispatches as sd")
|
|
882
|
+
.select(sql `1`.as("one"))
|
|
883
|
+
.whereRef("sd.child_conversation_id", "=", "cc.id")))
|
|
884
|
+
.where(({ not, exists, selectFrom }) => not(exists(selectFrom("subagent_dispatches as fd")
|
|
885
|
+
.select(sql `1`.as("one"))
|
|
886
|
+
.whereRef("fd.child_run_id", "=", "cr.id")
|
|
887
|
+
.where("fd.for_skill", "=", true))))
|
|
888
|
+
.where(({ not, exists, selectFrom }) => not(exists(selectFrom("conversation_events as e")
|
|
889
|
+
.select(sql `1`.as("one"))
|
|
890
|
+
.whereRef("e.conversation_id", "=", "pc.id")
|
|
891
|
+
.where("e.idem_key", "=", sql `'subagent_finished:' || cr.id`))))
|
|
892
|
+
.where(({ exists, selectFrom }) => exists(selectFrom("conversation_events as t")
|
|
893
|
+
.select(sql `1`.as("one"))
|
|
894
|
+
.whereRef("t.conversation_id", "=", "cc.id")
|
|
895
|
+
.whereRef("t.run_id", "=", "cr.id")
|
|
896
|
+
.where("t.type", "in", ["run_finished", "run_failed", "run_aborted"])))
|
|
897
|
+
.limit(WAIT_SWEEP_BATCH)
|
|
898
|
+
.execute();
|
|
899
|
+
let total = 0;
|
|
900
|
+
for (const r of runs) {
|
|
901
|
+
try {
|
|
902
|
+
if (!(await this.childFinished(r.child_run_id)))
|
|
903
|
+
continue;
|
|
904
|
+
total++;
|
|
905
|
+
this.log.warn("wait sweep: delivered the finish of a sub-agent run", {
|
|
906
|
+
childRunId: r.child_run_id,
|
|
907
|
+
});
|
|
908
|
+
}
|
|
909
|
+
catch (err) {
|
|
910
|
+
this.log.error("wait sweep: cannot deliver the finish of a sub-agent run", {
|
|
911
|
+
childRunId: r.child_run_id,
|
|
912
|
+
err,
|
|
913
|
+
});
|
|
914
|
+
}
|
|
915
|
+
}
|
|
916
|
+
return total;
|
|
917
|
+
}
|
|
683
918
|
/**
|
|
684
919
|
* 扫描 2:waiting 超过宽限期、却已没有 pending 等待的运行(决定提交后进程崩溃、续跑投递失败回滚等)→
|
|
685
920
|
* {@link resume}(条件更新 `waiting → queued` + 投递)。续跑任务的 jobId 用该运行最近一次等待的 id
|
|
686
921
|
* (与人工决定 / 超时任务一致,已投递过的同一续跑被 BullMQ 去重)。
|
|
687
922
|
*/
|
|
688
923
|
async sweepStuckRuns() {
|
|
689
|
-
const runs = await this.
|
|
924
|
+
const runs = await this.db
|
|
690
925
|
.selectFrom("runs")
|
|
691
926
|
.select(["id", "conversation_id"])
|
|
692
927
|
.where("status", "=", "waiting")
|
|
@@ -699,11 +934,12 @@ export class Waits {
|
|
|
699
934
|
.select(sql `1`.as("one"))
|
|
700
935
|
.whereRef("questions.run_id", "=", "runs.id")
|
|
701
936
|
.where("questions.status", "=", "pending"))))
|
|
702
|
-
// the resume condition's third clause: a
|
|
937
|
+
// the resume condition's third clause: a run with an active fork child is not stuck
|
|
703
938
|
.where(({ not, exists, selectFrom }) => not(exists(selectFrom("subagent_dispatches as sd")
|
|
704
939
|
.innerJoin("runs as cr", "cr.id", "sd.child_run_id")
|
|
705
940
|
.select(sql `1`.as("one"))
|
|
706
941
|
.whereRef("sd.parent_run_id", "=", "runs.id")
|
|
942
|
+
.where("sd.for_skill", "=", true)
|
|
707
943
|
.where("cr.status", "in", ACTIVE_RUN_STATUSES))))
|
|
708
944
|
.limit(WAIT_SWEEP_BATCH)
|
|
709
945
|
.execute();
|
|
@@ -714,37 +950,38 @@ export class Waits {
|
|
|
714
950
|
if (!(await this.resume(run.id, waitId)))
|
|
715
951
|
continue;
|
|
716
952
|
total++;
|
|
717
|
-
this.
|
|
953
|
+
this.log.warn("wait sweep: resumed stuck waiting run", {
|
|
718
954
|
runId: run.id,
|
|
719
955
|
conversationId: run.conversation_id,
|
|
720
956
|
waitId,
|
|
721
957
|
});
|
|
722
958
|
}
|
|
723
959
|
catch (err) {
|
|
724
|
-
this.
|
|
960
|
+
this.log.error("wait sweep: cannot resume stuck waiting run", { runId: run.id, err });
|
|
725
961
|
}
|
|
726
962
|
}
|
|
727
963
|
return total;
|
|
728
964
|
}
|
|
729
965
|
/**
|
|
730
|
-
* The id of the run's latest wait (by creation time): an approval, an input request or a
|
|
731
|
-
*
|
|
966
|
+
* The id of the run's latest wait (by creation time): an approval, an input request or a fork
|
|
967
|
+
* invocation's dispatch, whose wait id is its child run id (the id the child's finisher resumes
|
|
732
968
|
* with, so a sweep resume and a late finisher resume share one job id).
|
|
733
969
|
*/
|
|
734
970
|
async lastWaitId(runId) {
|
|
735
|
-
const row = await this.
|
|
736
|
-
.selectFrom(this.
|
|
971
|
+
const row = await this.db
|
|
972
|
+
.selectFrom(this.db
|
|
737
973
|
.selectFrom("approvals")
|
|
738
974
|
.select(["id", "created_at"])
|
|
739
975
|
.where("run_id", "=", runId)
|
|
740
|
-
.unionAll(this.
|
|
976
|
+
.unionAll(this.db
|
|
741
977
|
.selectFrom("questions")
|
|
742
978
|
.select(["id", "created_at"])
|
|
743
979
|
.where("run_id", "=", runId))
|
|
744
|
-
.unionAll(this.
|
|
980
|
+
.unionAll(this.db
|
|
745
981
|
.selectFrom("subagent_dispatches")
|
|
746
982
|
.select(["child_run_id as id", "created_at"])
|
|
747
|
-
.where("parent_run_id", "=", runId)
|
|
983
|
+
.where("parent_run_id", "=", runId)
|
|
984
|
+
.where("for_skill", "=", true))
|
|
748
985
|
.as("w"))
|
|
749
986
|
.select("w.id")
|
|
750
987
|
.orderBy("w.created_at", "desc")
|
|
@@ -752,7 +989,11 @@ export class Waits {
|
|
|
752
989
|
.executeTakeFirst();
|
|
753
990
|
return row?.id ?? null;
|
|
754
991
|
}
|
|
755
|
-
|
|
992
|
+
/**
|
|
993
|
+
* A `wait-timeout` job (dispatched by `MaintenanceProcessor`): expires the wait,
|
|
994
|
+
* or delays the job again until the wait's expiry when it ran early.
|
|
995
|
+
*/
|
|
996
|
+
async processTimeout(job, token) {
|
|
756
997
|
const { kind, id, runId, step } = job.data;
|
|
757
998
|
const at = runId !== undefined && step !== undefined ? { runId, step } : undefined;
|
|
758
999
|
const r = await this.expire(kind, id, at);
|
|
@@ -767,7 +1008,7 @@ export class Waits {
|
|
|
767
1008
|
? { kind: w.kind, id: w.id, runId, step: w.step }
|
|
768
1009
|
: { kind: w.kind, id: w.id };
|
|
769
1010
|
try {
|
|
770
|
-
await this.
|
|
1011
|
+
await this.timeouts.add(WAIT_TIMEOUT_JOB, data, {
|
|
771
1012
|
jobId: waitTimeoutJobId(w.id),
|
|
772
1013
|
delay: Math.max(0, new Date(w.expiresAt).getTime() - Date.now()),
|
|
773
1014
|
attempts: TIMEOUT_JOB_ATTEMPTS,
|
|
@@ -777,31 +1018,32 @@ export class Waits {
|
|
|
777
1018
|
});
|
|
778
1019
|
}
|
|
779
1020
|
catch (err) {
|
|
780
|
-
this.
|
|
1021
|
+
this.log.error("cannot schedule wait timeout", { waitId: w.id, err });
|
|
781
1022
|
}
|
|
782
1023
|
}
|
|
783
1024
|
/**
|
|
784
1025
|
* Whether the wait is over: an approval or input request is no longer pending (decided, expired
|
|
785
|
-
* or cancelled); `subagents`:
|
|
1026
|
+
* or cancelled); `subagents`: the run's fork invocation child is no longer active.
|
|
786
1027
|
*/
|
|
787
1028
|
async isSettled(w, runId) {
|
|
788
1029
|
if (w.kind === "subagents") {
|
|
789
|
-
const active = await this.
|
|
1030
|
+
const active = await this.db
|
|
790
1031
|
.selectFrom("subagent_dispatches as sd")
|
|
791
1032
|
.innerJoin("runs as cr", "cr.id", "sd.child_run_id")
|
|
792
1033
|
.select("cr.id")
|
|
793
1034
|
.where("sd.parent_run_id", "=", runId)
|
|
1035
|
+
.where("sd.for_skill", "=", true)
|
|
794
1036
|
.where("cr.status", "in", ACTIVE_RUN_STATUSES)
|
|
795
1037
|
.executeTakeFirst();
|
|
796
1038
|
return active === undefined;
|
|
797
1039
|
}
|
|
798
1040
|
const row = w.kind === "approval"
|
|
799
|
-
? await this.
|
|
1041
|
+
? await this.db
|
|
800
1042
|
.selectFrom("approvals")
|
|
801
1043
|
.select("status")
|
|
802
1044
|
.where("id", "=", w.id)
|
|
803
1045
|
.executeTakeFirst()
|
|
804
|
-
: await this.
|
|
1046
|
+
: await this.db
|
|
805
1047
|
.selectFrom("questions")
|
|
806
1048
|
.select("status")
|
|
807
1049
|
.where("id", "=", w.id)
|
|
@@ -824,7 +1066,7 @@ export class Waits {
|
|
|
824
1066
|
* 等待中的调用给取消说明,其余(排在等待调用之后、尚未执行的)给「未执行」说明。
|
|
825
1067
|
*/
|
|
826
1068
|
async stoppedResults(t, conversationId, runId, steps, cancelled,
|
|
827
|
-
/** Calls whose result the caller writes itself (open `
|
|
1069
|
+
/** Calls whose result the caller writes itself (open `Agent` calls). */
|
|
828
1070
|
skip = new Set()) {
|
|
829
1071
|
const out = [];
|
|
830
1072
|
for (const step of steps.sort((a, b) => a - b)) {
|
|
@@ -855,7 +1097,246 @@ export class Waits {
|
|
|
855
1097
|
}
|
|
856
1098
|
return out;
|
|
857
1099
|
}
|
|
858
|
-
|
|
1100
|
+
/**
|
|
1101
|
+
* After a child run's terminal state committed (sub-agents spec §7.3, agent map spec §4.5,
|
|
1102
|
+
* §5.2): a background child's run, whether dispatched, sent a message or woken
|
|
1103
|
+
* ({@link deliveryRowOfChildRun}), is delivered to its parent
|
|
1104
|
+
* ({@link SubagentDeliveries.childFinished}: `subagent_finished` and a `finished` delivery,
|
|
1105
|
+
* idempotent by the run); a fork invocation's child (phase D, `for_skill`) appends
|
|
1106
|
+
* `subagent_finished` (idempotent; not model-visible) and tries
|
|
1107
|
+
* {@link resume}`(parentRunId, childRunId)`, which succeeds once its parent run waits on nothing
|
|
1108
|
+
* else. A run of a conversation never dispatched, or not terminal yet, is left alone. A crash in
|
|
1109
|
+
* between is repaired by the wait sweep (the orphan repair calls this again). A fork child's
|
|
1110
|
+
* running background tasks the terminal run started are then stopped (not those of a later run);
|
|
1111
|
+
* a stopped background child's are all stopped, whichever of its runs started them; a background
|
|
1112
|
+
* child that ended on its own keeps them, and their finish wakes it (agent map spec §5.3). True
|
|
1113
|
+
* when a background child's finish was written by this call.
|
|
1114
|
+
*/
|
|
1115
|
+
async childFinished(childRunId) {
|
|
1116
|
+
const row = await deliveryRowOfChildRun(this.db, childRunId);
|
|
1117
|
+
if (!row)
|
|
1118
|
+
return false;
|
|
1119
|
+
const run = await this.db
|
|
1120
|
+
.selectFrom("runs")
|
|
1121
|
+
.select("status")
|
|
1122
|
+
.where("id", "=", childRunId)
|
|
1123
|
+
.executeTakeFirst();
|
|
1124
|
+
if (!run || !TERMINAL_STATUSES.has(run.status))
|
|
1125
|
+
return false;
|
|
1126
|
+
if (row.forSkill !== true) {
|
|
1127
|
+
try {
|
|
1128
|
+
return await this.deliveries.childFinished(childRunId);
|
|
1129
|
+
}
|
|
1130
|
+
finally {
|
|
1131
|
+
// a background child that ended on its own keeps its tasks: their finish wakes it (agent
|
|
1132
|
+
// map spec §5.3); a stopped one's tasks all stop with it, also those an earlier run of it
|
|
1133
|
+
// started, so none of them wakes it. Once a later run of it exists (a `SendMessage`
|
|
1134
|
+
// started it again before this late call), only the stopped run's own tasks stop: the
|
|
1135
|
+
// others may be the new run's. Never throws.
|
|
1136
|
+
if (run.status === "aborted") {
|
|
1137
|
+
const later = await this.hasLaterRun(row.childConversationId, childRunId);
|
|
1138
|
+
await this.background.stopSubagentTasks(row.childConversationId, later ? childRunId : undefined);
|
|
1139
|
+
}
|
|
1140
|
+
}
|
|
1141
|
+
}
|
|
1142
|
+
try {
|
|
1143
|
+
const r = await childResult(this.eventLog, row);
|
|
1144
|
+
if (!r) {
|
|
1145
|
+
this.log.warn("sub-agent run is terminal without a terminal event", { childRunId });
|
|
1146
|
+
return false;
|
|
1147
|
+
}
|
|
1148
|
+
await this.eventLog.append(row.parentConversationId, [finishedEvent(row, r.finished)]);
|
|
1149
|
+
await this.resume(row.parentRunId, childRunId);
|
|
1150
|
+
return false;
|
|
1151
|
+
}
|
|
1152
|
+
finally {
|
|
1153
|
+
// a fork child, whichever way its run ended (its worker, a stop while waiting, an orphan
|
|
1154
|
+
// repair): nobody reads or stops the background tasks that run started through its model
|
|
1155
|
+
// any more (background Bash spec §4.3); a background child's are handled above. Never throws.
|
|
1156
|
+
await this.background.stopSubagentTasks(row.childConversationId, childRunId);
|
|
1157
|
+
}
|
|
1158
|
+
}
|
|
1159
|
+
/**
|
|
1160
|
+
* Whether the conversation has an active run other than `runId`, or one created after it (a
|
|
1161
|
+
* sub-agent started again after `runId` ended).
|
|
1162
|
+
*/
|
|
1163
|
+
async hasLaterRun(conversationId, runId) {
|
|
1164
|
+
const hit = await this.db
|
|
1165
|
+
.selectFrom("runs as r")
|
|
1166
|
+
.select("r.id")
|
|
1167
|
+
.where("r.conversation_id", "=", conversationId)
|
|
1168
|
+
.where("r.id", "<>", runId)
|
|
1169
|
+
.where((eb) => eb.or([
|
|
1170
|
+
eb("r.status", "in", ACTIVE_RUN_STATUSES),
|
|
1171
|
+
eb("r.created_at", ">", eb.selectFrom("runs as o").select("o.created_at").where("o.id", "=", runId)),
|
|
1172
|
+
]))
|
|
1173
|
+
.limit(1)
|
|
1174
|
+
.executeTakeFirst();
|
|
1175
|
+
return hit !== undefined;
|
|
1176
|
+
}
|
|
1177
|
+
/**
|
|
1178
|
+
* Stops the active fork invocation child of a parent run (sub-agents spec §12, phase D;
|
|
1179
|
+
* `for_skill`), or only one dispatched in `opts.step`; background `Agent` children are never
|
|
1180
|
+
* stopped with the run that dispatched them (agent map spec §5.4, §6): a `waiting` child through its own {@link abortWaiting}, a `queued` / `running` one
|
|
1181
|
+
* that no worker holds directly (`RunQueue.abortIfOrphaned`), any other through
|
|
1182
|
+
* `RunAbort.request` (the cross-replica broadcast plus the marker key, so a child that starts
|
|
1183
|
+
* later still sees it), after which a child found `waiting` is stopped through `abortWaiting`
|
|
1184
|
+
* too. A child stopped here is reported to the parent at once (by `abortWaiting` itself, or
|
|
1185
|
+
* {@link childFinished} after `abortIfOrphaned`); one stopped by its worker is reported by that
|
|
1186
|
+
* worker. Returns the number of children asked to stop.
|
|
1187
|
+
*
|
|
1188
|
+
* `byAccountId` is the person whose action stops them, or null when the kernel stops them on the
|
|
1189
|
+
* parent's behalf; a child stopped with null reports the §4.4 "parent's stop" text.
|
|
1190
|
+
*/
|
|
1191
|
+
async stopChildren(parentRunId, byAccountId, opts = {}) {
|
|
1192
|
+
let q = this.db
|
|
1193
|
+
.selectFrom("subagent_dispatches as sd")
|
|
1194
|
+
.innerJoin("runs as cr", "cr.id", "sd.child_run_id")
|
|
1195
|
+
.select(["sd.child_conversation_id", "sd.child_run_id", "cr.status"])
|
|
1196
|
+
.where("sd.parent_run_id", "=", parentRunId)
|
|
1197
|
+
.where("sd.for_skill", "=", true)
|
|
1198
|
+
.where("cr.status", "in", ACTIVE_RUN_STATUSES);
|
|
1199
|
+
if (opts.step !== undefined)
|
|
1200
|
+
q = q.where("sd.step", "=", opts.step);
|
|
1201
|
+
const children = await q.execute();
|
|
1202
|
+
for (const c of children) {
|
|
1203
|
+
await this.stopRun(c.child_conversation_id, c.child_run_id, c.status, byAccountId, opts.detail);
|
|
1204
|
+
}
|
|
1205
|
+
return children.length;
|
|
1206
|
+
}
|
|
1207
|
+
/**
|
|
1208
|
+
* Stops a sub-agent with its descendants (agent map spec §6: stopping an agent of the map stops
|
|
1209
|
+
* it and everything below it; deleting the root stops the whole tree): every active run of
|
|
1210
|
+
* `conversationId` (unless `includeSelf` is false) and of each sub-agent conversation below it,
|
|
1211
|
+
* shallowest first, each the way {@link stopChildren} stops a child (a stopped agent delivers its
|
|
1212
|
+
* finish to its own parent as `aborted`). A run a worker holds ends later; its worker's
|
|
1213
|
+
* {@link stopDescendantsOfStopped} stops what it dispatched after this read. Then the running
|
|
1214
|
+
* background tasks of every covered sub-agent conversation stop, whether it was running or idle.
|
|
1215
|
+
* Returns the number of runs asked to stop.
|
|
1216
|
+
*
|
|
1217
|
+
* Lock order: nothing is held across runs. Each run's stop is its own transaction (or none), and
|
|
1218
|
+
* one that writes the terminal state locks that run's conversation row, then its run row, the
|
|
1219
|
+
* order of `StepLog.appendCounted` (conversation row, then the root's budget run row) and of
|
|
1220
|
+
* dispatch (conversation, run, budget run). No stop here locks a budget run, let alone before a
|
|
1221
|
+
* descendant's conversation row, so the order is never inverted.
|
|
1222
|
+
*/
|
|
1223
|
+
async stopTree(conversationId, byAccountId, opts = {}) {
|
|
1224
|
+
const tree = await conversationTree(this.db, conversationId);
|
|
1225
|
+
const ids = tree.filter((c) => opts.includeSelf !== false || c.level > 0).map((c) => c.id);
|
|
1226
|
+
if (ids.length === 0)
|
|
1227
|
+
return 0;
|
|
1228
|
+
const level = new Map(tree.map((c) => [c.id, c.level]));
|
|
1229
|
+
const runs = (await this.db
|
|
1230
|
+
.selectFrom("runs")
|
|
1231
|
+
.select(["id", "conversation_id", "status"])
|
|
1232
|
+
.where("conversation_id", "in", ids)
|
|
1233
|
+
.where("status", "in", ACTIVE_RUN_STATUSES)
|
|
1234
|
+
.execute()).sort((a, b) => (level.get(a.conversation_id) ?? 0) - (level.get(b.conversation_id) ?? 0));
|
|
1235
|
+
for (const r of runs) {
|
|
1236
|
+
try {
|
|
1237
|
+
if (await this.stopRun(r.conversation_id, r.id, r.status, byAccountId)) {
|
|
1238
|
+
// its approval / question cards changed (RunControl.abortWaiting's event)
|
|
1239
|
+
await this.events.emit("run.wait-stopped", {
|
|
1240
|
+
conversationId: r.conversation_id,
|
|
1241
|
+
runId: r.id,
|
|
1242
|
+
});
|
|
1243
|
+
}
|
|
1244
|
+
}
|
|
1245
|
+
catch (err) {
|
|
1246
|
+
this.log.error("cannot stop a sub-agent run of the tree", { runId: r.id, err });
|
|
1247
|
+
}
|
|
1248
|
+
}
|
|
1249
|
+
// every running background task of the covered sub-agents stops with them, idle ones too
|
|
1250
|
+
// (their finish would wake the idle agent, whose delivery would restart the stopped branch):
|
|
1251
|
+
// all of each conversation's tasks, as a stopped child's run end does (`childFinished`), with
|
|
1252
|
+
// which this is idempotent (only running tasks are stopped; `stoppedBy: "subagent_end"`
|
|
1253
|
+
// never wakes). A root conversation is skipped (`stopSubagentTasks`); never throws.
|
|
1254
|
+
await Promise.all(ids.map((id) => this.background.stopSubagentTasks(id)));
|
|
1255
|
+
return runs.length;
|
|
1256
|
+
}
|
|
1257
|
+
/**
|
|
1258
|
+
* After a sub-agent run's terminal commit (its worker): a run a person stopped (`run_aborted`
|
|
1259
|
+
* with an account and no `detail`; only {@link stopTree} stops a sub-agent's run that way) stops
|
|
1260
|
+
* the active runs below its conversation as well, so a descendant it dispatched after the tree
|
|
1261
|
+
* stop read the tree still stops (dispatch needs its run `running`, so after its terminal commit
|
|
1262
|
+
* the set is final). Any other end leaves its children running (agent map spec §5.4). Returns
|
|
1263
|
+
* the number of runs asked to stop. A root conversation's run never stops its children here.
|
|
1264
|
+
*/
|
|
1265
|
+
async stopDescendantsOfStopped(runId) {
|
|
1266
|
+
const ev = await this.db
|
|
1267
|
+
.selectFrom("runs as r")
|
|
1268
|
+
.innerJoin("conversation_events as e", (j) => j.onRef("e.conversation_id", "=", "r.conversation_id").onRef("e.run_id", "=", "r.id"))
|
|
1269
|
+
.innerJoin("conversations as c", "c.id", "r.conversation_id")
|
|
1270
|
+
.select(["r.conversation_id", "e.payload"])
|
|
1271
|
+
.where("r.id", "=", runId)
|
|
1272
|
+
// a root's stop leaves its children running (agent map spec §6): a person-stopped root run
|
|
1273
|
+
// reaching here (a redelivered job, the failure path) stops nothing
|
|
1274
|
+
.where("c.kind", "=", "subagent")
|
|
1275
|
+
.where("r.status", "=", "aborted")
|
|
1276
|
+
.where("e.type", "=", "run_aborted")
|
|
1277
|
+
.executeTakeFirst();
|
|
1278
|
+
const p = ev?.payload;
|
|
1279
|
+
if (!ev || typeof p?.byAccountId !== "string" || p.detail !== undefined)
|
|
1280
|
+
return 0;
|
|
1281
|
+
return this.stopTree(ev.conversation_id, p.byAccountId, { includeSelf: false });
|
|
1282
|
+
}
|
|
1283
|
+
/**
|
|
1284
|
+
* Stops one active sub-agent run: a `waiting` one through its own {@link abortWaiting}, a
|
|
1285
|
+
* `queued` / `running` one that no worker holds directly (`RunQueue.abortIfOrphaned`, then
|
|
1286
|
+
* reported through {@link childFinished}), any other through `RunAbort.request` (the
|
|
1287
|
+
* cross-replica broadcast plus the marker key, so a run that starts later still sees it), after
|
|
1288
|
+
* which a run found `waiting` is stopped through `abortWaiting` too. True when it was stopped
|
|
1289
|
+
* while waiting.
|
|
1290
|
+
*/
|
|
1291
|
+
async stopRun(conv, runId, status, byAccountId, detail) {
|
|
1292
|
+
// abortWaiting reports the stopped child to the parent itself (childFinished)
|
|
1293
|
+
if (status === "waiting" && (await this.abortWaiting(conv, runId, byAccountId, detail))) {
|
|
1294
|
+
return true;
|
|
1295
|
+
}
|
|
1296
|
+
if (await this.runQueue.abortIfOrphaned(conv, runId, byAccountId, detail)) {
|
|
1297
|
+
await this.childFinished(runId);
|
|
1298
|
+
return false;
|
|
1299
|
+
}
|
|
1300
|
+
await this.abort.request(runId, byAccountId, detail);
|
|
1301
|
+
// the suspend handshake (see suspend): a run that became `waiting` after the read above may
|
|
1302
|
+
// have checked the marker before it was set, so check `waiting` again after setting it
|
|
1303
|
+
// (review M1)
|
|
1304
|
+
const now = await this.db
|
|
1305
|
+
.selectFrom("runs")
|
|
1306
|
+
.select("status")
|
|
1307
|
+
.where("id", "=", runId)
|
|
1308
|
+
.executeTakeFirst();
|
|
1309
|
+
return now?.status === "waiting" && (await this.abortWaiting(conv, runId, byAccountId, detail));
|
|
1310
|
+
}
|
|
1311
|
+
};
|
|
1312
|
+
__decorate([
|
|
1313
|
+
Transactional({ propagation: "requires_new" })
|
|
1314
|
+
], Waits.prototype, "abortWaitingIn", null);
|
|
1315
|
+
__decorate([
|
|
1316
|
+
Transactional({ propagation: "requires_new" })
|
|
1317
|
+
], Waits.prototype, "cancelWaitsOfFinishedIn", null);
|
|
1318
|
+
__decorate([
|
|
1319
|
+
Transactional({ propagation: "requires_new" })
|
|
1320
|
+
], Waits.prototype, "repairOpenAgentCallsIn", null);
|
|
1321
|
+
Waits = __decorate([
|
|
1322
|
+
Injectable(),
|
|
1323
|
+
__param(0, Inject(KernelDb)),
|
|
1324
|
+
__param(1, Inject(EventLog)),
|
|
1325
|
+
__param(2, Inject(ApprovalsService)),
|
|
1326
|
+
__param(3, Inject(QuestionsService)),
|
|
1327
|
+
__param(4, Inject(RunQueue)),
|
|
1328
|
+
__param(5, Inject(ToolPipeline)),
|
|
1329
|
+
__param(6, Inject(RunFinish)),
|
|
1330
|
+
__param(7, Inject(KyselyCheckpointSaver)),
|
|
1331
|
+
__param(8, Inject(RunAbort)),
|
|
1332
|
+
__param(9, Inject(getQueueToken(MAINTENANCE_QUEUE_NAME))),
|
|
1333
|
+
__param(10, Inject(KernelEvents)),
|
|
1334
|
+
__param(11, Inject(KERNEL_LOGGER)),
|
|
1335
|
+
__param(12, Inject(BackgroundTaskStopper)),
|
|
1336
|
+
__param(13, Inject(SubagentDeliveries)),
|
|
1337
|
+
__param(14, Inject(TransactionHost))
|
|
1338
|
+
], Waits);
|
|
1339
|
+
export { Waits };
|
|
859
1340
|
/**
|
|
860
1341
|
* Phase D: finished chat runs (past the grace period, within the last day) triggered by a fork
|
|
861
1342
|
* invocation that has no report (dispatched or not); the wait sweep writes it
|
|
@@ -881,3 +1362,59 @@ export function unreportedForkRuns(db) {
|
|
|
881
1362
|
.limit(WAIT_SWEEP_BATCH)
|
|
882
1363
|
.execute());
|
|
883
1364
|
}
|
|
1365
|
+
/**
|
|
1366
|
+
* A decided approval / answered question resumes the waiting run on this replica (domain events,
|
|
1367
|
+
* spec §3b; the wait sweep resumes a run whose resume was lost). Its IM delivery follows the same
|
|
1368
|
+
* events (`ChannelJobs`).
|
|
1369
|
+
*/
|
|
1370
|
+
let DecisionResumer = class DecisionResumer {
|
|
1371
|
+
unsubscribe;
|
|
1372
|
+
constructor(waits, events) {
|
|
1373
|
+
this.unsubscribe = [
|
|
1374
|
+
events.on("approval.decided", async (a) => {
|
|
1375
|
+
await waits.resume(a.runId, a.id);
|
|
1376
|
+
}),
|
|
1377
|
+
events.on("question.answered", async (q) => {
|
|
1378
|
+
await waits.resume(q.runId, q.id);
|
|
1379
|
+
}),
|
|
1380
|
+
];
|
|
1381
|
+
}
|
|
1382
|
+
/** Unsubscribes after the stop phases: events emitted while they drain are still handled. */
|
|
1383
|
+
onApplicationShutdown() {
|
|
1384
|
+
for (const off of this.unsubscribe)
|
|
1385
|
+
off();
|
|
1386
|
+
}
|
|
1387
|
+
};
|
|
1388
|
+
DecisionResumer = __decorate([
|
|
1389
|
+
Injectable(),
|
|
1390
|
+
__param(0, Inject(Waits)),
|
|
1391
|
+
__param(1, Inject(KernelEvents))
|
|
1392
|
+
], DecisionResumer);
|
|
1393
|
+
export { DecisionResumer };
|
|
1394
|
+
/**
|
|
1395
|
+
* The wait sweep, every 10 minutes, once across replicas: {@link Waits.sweep}. Replaces
|
|
1396
|
+
* the maintenance scheduler `wait-sweep-every-10m` (retired at worker start).
|
|
1397
|
+
*/
|
|
1398
|
+
let WaitSweepJob = class WaitSweepJob {
|
|
1399
|
+
waits;
|
|
1400
|
+
lockService;
|
|
1401
|
+
log;
|
|
1402
|
+
constructor(waits, lockService, log) {
|
|
1403
|
+
this.waits = waits;
|
|
1404
|
+
this.lockService = lockService;
|
|
1405
|
+
this.log = log;
|
|
1406
|
+
}
|
|
1407
|
+
async run() {
|
|
1408
|
+
await this.waits.sweep();
|
|
1409
|
+
}
|
|
1410
|
+
};
|
|
1411
|
+
__decorate([
|
|
1412
|
+
LockedCron("*/10 * * * *", { name: WAIT_SWEEP_JOB })
|
|
1413
|
+
], WaitSweepJob.prototype, "run", null);
|
|
1414
|
+
WaitSweepJob = __decorate([
|
|
1415
|
+
Injectable(),
|
|
1416
|
+
__param(0, Inject(Waits)),
|
|
1417
|
+
__param(1, Inject(LockService)),
|
|
1418
|
+
__param(2, Inject(KERNEL_LOGGER))
|
|
1419
|
+
], WaitSweepJob);
|
|
1420
|
+
export { WaitSweepJob };
|