@capybara-hq/kernel 0.1.0-rc.1 → 0.1.0-rc.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/admin/admin.controller.d.ts +17 -17
- package/dist/admin/admin.controller.js +43 -26
- package/dist/admin/admin.module.d.ts +3 -0
- package/dist/admin/admin.module.js +22 -0
- package/dist/admin/extensions.controller.d.ts +14 -14
- package/dist/admin/extensions.controller.js +30 -17
- package/dist/admin/setup-lock.d.ts +16 -0
- package/dist/admin/setup-lock.js +47 -0
- package/dist/admin/setup.controller.d.ts +8 -8
- package/dist/admin/setup.controller.js +27 -25
- package/dist/admin/setup.service.d.ts +19 -27
- package/dist/admin/setup.service.js +61 -61
- package/dist/agents/agent-lookup.d.ts +53 -0
- package/dist/agents/agent-lookup.js +187 -0
- package/dist/agents/agents.controller.d.ts +1 -1
- package/dist/agents/agents.controller.js +14 -8
- package/dist/agents/agents.module.d.ts +7 -0
- package/dist/agents/agents.module.js +41 -0
- package/dist/agents/agents.service.d.ts +39 -58
- package/dist/agents/agents.service.js +280 -335
- package/dist/agents/definition.d.ts +39 -8
- package/dist/agents/definition.js +201 -17
- package/dist/agents/models.controller.d.ts +1 -1
- package/dist/agents/models.controller.js +2 -2
- package/dist/agents/templates.controller.d.ts +1 -1
- package/dist/agents/templates.controller.js +2 -2
- package/dist/agents/templates.d.ts +6 -8
- package/dist/agents/templates.js +39 -8
- package/dist/app.d.ts +93 -0
- package/dist/app.js +150 -0
- package/dist/catalog/admin-catalog.controller.d.ts +3 -3
- package/dist/catalog/admin-catalog.controller.js +27 -13
- package/dist/catalog/catalog-content.d.ts +185 -0
- package/dist/catalog/catalog-content.js +326 -0
- package/dist/catalog/catalog-items.d.ts +186 -0
- package/dist/catalog/catalog-items.js +410 -0
- package/dist/catalog/catalog.module.d.ts +14 -0
- package/dist/catalog/catalog.module.js +71 -0
- package/dist/catalog/catalog.service.d.ts +34 -188
- package/dist/catalog/catalog.service.js +155 -489
- package/dist/catalog/claude/agents.js +13 -10
- package/dist/catalog/cli.d.ts +3 -2
- package/dist/catalog/cli.js +13 -31
- package/dist/catalog/job-ids.d.ts +15 -0
- package/dist/catalog/job-ids.js +15 -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/marketplaces.controller.d.ts +4 -4
- package/dist/catalog/marketplaces.controller.js +22 -11
- package/dist/catalog/marketplaces.service.d.ts +31 -14
- package/dist/catalog/marketplaces.service.js +330 -256
- package/dist/catalog/org-catalog.controller.d.ts +4 -3
- package/dist/catalog/org-catalog.controller.js +29 -14
- package/dist/catalog/org-catalog.service.d.ts +32 -198
- package/dist/catalog/org-catalog.service.js +159 -400
- package/dist/catalog/plugin-import.d.ts +73 -34
- package/dist/catalog/plugin-import.js +356 -217
- package/dist/catalog/plugin-install.d.ts +83 -41
- package/dist/catalog/plugin-install.js +421 -269
- package/dist/catalog/plugin-upgrade.d.ts +59 -4
- package/dist/catalog/plugin-upgrade.js +407 -282
- package/dist/catalog/requests.service.d.ts +27 -15
- package/dist/catalog/requests.service.js +201 -145
- package/dist/catalog/upgrade-targets.d.ts +4 -7
- package/dist/channels/actions.d.ts +6 -4
- package/dist/channels/actions.js +1 -1
- package/dist/channels/cards.d.ts +10 -4
- package/dist/channels/cards.js +16 -8
- package/dist/channels/channels.module.d.ts +40 -0
- package/dist/channels/channels.module.js +128 -0
- package/dist/channels/connections.controller.d.ts +1 -1
- package/dist/channels/connections.controller.js +11 -6
- package/dist/channels/connections.service.d.ts +43 -21
- package/dist/channels/connections.service.js +236 -131
- package/dist/channels/inbound.d.ts +34 -38
- package/dist/channels/inbound.js +107 -41
- 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 +60 -82
- package/dist/channels/outbound.js +165 -194
- package/dist/channels/supervisor.d.ts +88 -46
- package/dist/channels/supervisor.js +230 -132
- package/dist/channels/threads.d.ts +29 -8
- package/dist/channels/threads.js +71 -13
- package/dist/channels/webhook.d.ts +20 -14
- package/dist/channels/webhook.js +51 -20
- 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 +1 -0
- package/dist/config/schema.js +12 -6
- package/dist/conversations/access.d.ts +29 -0
- package/dist/conversations/access.js +86 -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 +30 -22
- package/dist/conversations/attachments.service.js +119 -46
- package/dist/conversations/conversations.controller.d.ts +8 -7
- package/dist/conversations/conversations.controller.js +59 -29
- package/dist/conversations/conversations.module.d.ts +8 -0
- package/dist/conversations/conversations.module.js +69 -0
- package/dist/conversations/conversations.service.d.ts +40 -38
- package/dist/conversations/conversations.service.js +130 -140
- package/dist/conversations/event-log.d.ts +39 -18
- package/dist/conversations/event-log.js +93 -27
- package/dist/conversations/events.d.ts +23 -3
- package/dist/conversations/events.js +26 -14
- 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/outputs-read.d.ts +11 -11
- package/dist/conversations/outputs-read.js +31 -7
- package/dist/conversations/queue.d.ts +48 -56
- package/dist/conversations/queue.js +13 -289
- package/dist/conversations/queue.service.d.ts +60 -0
- package/dist/conversations/queue.service.js +343 -0
- package/dist/conversations/sandbox-status.d.ts +13 -10
- package/dist/conversations/sandbox-status.js +36 -8
- package/dist/conversations/titles.d.ts +71 -24
- package/dist/conversations/titles.js +159 -63
- package/dist/ctx/bus.js +9 -3
- package/dist/ctx/create-ctx.d.ts +6 -0
- package/dist/ctx/create-ctx.js +7 -9
- 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 +4 -4
- package/dist/db/pool.d.ts +5 -0
- package/dist/db/pool.js +1 -0
- package/dist/errors.d.ts +1 -0
- package/dist/errors.js +1 -0
- 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/jobs.d.ts +20 -0
- package/dist/evals/jobs.js +45 -0
- package/dist/evals/recorded-tools.d.ts +27 -1
- package/dist/evals/recorded-tools.js +85 -10
- package/dist/evals/run-replay.d.ts +61 -8
- package/dist/evals/run-replay.js +159 -85
- package/dist/evals/runs.controller.d.ts +1 -1
- package/dist/evals/runs.controller.js +17 -8
- package/dist/evals/runs.service.d.ts +23 -45
- package/dist/evals/runs.service.js +245 -234
- package/dist/evals/sets.controller.d.ts +1 -1
- package/dist/evals/sets.controller.js +17 -8
- package/dist/evals/sets.service.d.ts +22 -6
- package/dist/evals/sets.service.js +248 -194
- package/dist/evals/snapshot.d.ts +2 -2
- package/dist/evals/step-replay.d.ts +2 -2
- package/dist/evals/step-replay.js +1 -1
- 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.service.d.ts +5 -4
- package/dist/evals/trajectory.service.js +30 -7
- package/dist/evals/worker.d.ts +44 -27
- package/dist/evals/worker.js +220 -121
- package/dist/extensions/admin-ops.d.ts +61 -33
- package/dist/extensions/admin-ops.js +248 -154
- package/dist/extensions/admin-view.d.ts +38 -27
- package/dist/extensions/admin-view.js +126 -55
- package/dist/extensions/approvals.d.ts +12 -8
- package/dist/extensions/approvals.js +73 -46
- package/dist/extensions/blobs.d.ts +27 -10
- package/dist/extensions/blobs.js +111 -45
- package/dist/extensions/bootstrap.d.ts +58 -31
- package/dist/extensions/bootstrap.js +175 -121
- package/dist/extensions/cli.d.ts +20 -10
- package/dist/extensions/cli.js +41 -96
- package/dist/extensions/config-issues.d.ts +7 -0
- package/dist/extensions/config-issues.js +31 -0
- package/dist/extensions/deployment-config-store.d.ts +49 -0
- package/dist/extensions/deployment-config-store.js +133 -0
- package/dist/extensions/deployment-config.d.ts +58 -67
- package/dist/extensions/deployment-config.js +202 -230
- package/dist/extensions/enabled.d.ts +5 -5
- package/dist/extensions/extensions.module.d.ts +8 -0
- package/dist/extensions/extensions.module.js +77 -0
- package/dist/extensions/hooks.d.ts +3 -2
- package/dist/extensions/hooks.js +1 -1
- package/dist/extensions/host.d.ts +72 -68
- package/dist/extensions/host.js +191 -152
- package/dist/extensions/installs.d.ts +49 -16
- package/dist/extensions/installs.js +128 -32
- 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 +33 -0
- package/dist/extensions/locks.js +86 -0
- package/dist/extensions/migrate-lock.d.ts +3 -4
- package/dist/extensions/org-config.controller.d.ts +1 -1
- package/dist/extensions/org-config.controller.js +8 -5
- package/dist/extensions/org-config.d.ts +48 -46
- package/dist/extensions/org-config.js +284 -226
- package/dist/extensions/registry.d.ts +50 -2
- package/dist/extensions/registry.js +89 -4
- package/dist/extensions/sources.d.ts +12 -8
- package/dist/extensions/sources.js +34 -13
- 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 +17 -9
- package/dist/files/previewers.d.ts +13 -18
- package/dist/files/previewers.js +83 -36
- 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 +47 -355
- package/dist/http/app.d.ts +11 -15
- package/dist/http/app.js +17 -62
- 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/identity/accounts.d.ts +82 -29
- package/dist/identity/accounts.js +294 -175
- package/dist/identity/api-tokens.d.ts +11 -7
- package/dist/identity/api-tokens.js +71 -44
- package/dist/identity/audit.d.ts +7 -4
- package/dist/identity/audit.js +5 -1
- package/dist/identity/auth.controller.d.ts +11 -10
- package/dist/identity/auth.controller.js +31 -25
- package/dist/identity/auth.guard.d.ts +3 -3
- package/dist/identity/auth.guard.js +6 -4
- package/dist/identity/binding.d.ts +9 -11
- package/dist/identity/binding.js +41 -13
- package/dist/identity/enterprise-admin.d.ts +18 -12
- package/dist/identity/enterprise-admin.js +67 -13
- 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 +56 -0
- package/dist/identity/me.controller.d.ts +16 -15
- package/dist/identity/me.controller.js +37 -31
- package/dist/identity/sessions.d.ts +12 -10
- package/dist/identity/sessions.js +74 -42
- package/dist/identity/settings.d.ts +20 -14
- package/dist/identity/settings.js +86 -58
- 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/inbox/inbox.module.d.ts +3 -0
- package/dist/inbox/inbox.module.js +22 -0
- package/dist/inbox/inbox.service.d.ts +7 -9
- package/dist/inbox/inbox.service.js +32 -11
- package/dist/index.d.ts +16 -11
- package/dist/index.js +9 -6
- 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 +165 -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 +126 -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 +90 -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 +96 -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 +86 -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 +16 -0
- package/dist/infra/logging/logging.module.js +34 -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 +7 -0
- package/dist/infra/queue/redis-connection.js +18 -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 +87 -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 +31 -0
- package/dist/infra/throttler/named-throttlers.js +119 -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 +15 -0
- package/dist/infra/tokens.js +15 -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 +136 -0
- package/dist/lifecycle/kernel-lifecycle.d.ts +140 -0
- package/dist/lifecycle/kernel-lifecycle.js +456 -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/models/models.module.d.ts +3 -0
- package/dist/models/models.module.js +24 -0
- package/dist/models/prices.d.ts +8 -2
- package/dist/models/prices.js +65 -37
- package/dist/models/purposes.controller.d.ts +1 -1
- package/dist/models/purposes.controller.js +5 -6
- package/dist/models/purposes.d.ts +35 -13
- package/dist/models/purposes.js +101 -51
- 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 +61 -31
- package/dist/orgs/directory-sync.js +212 -125
- 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 +54 -57
- package/dist/orgs/offboarding.js +161 -71
- package/dist/orgs/org-lock.d.ts +28 -19
- package/dist/orgs/org-lock.js +81 -35
- package/dist/orgs/org.guard.d.ts +1 -1
- package/dist/orgs/org.guard.js +2 -2
- package/dist/orgs/orgs.controller.d.ts +13 -13
- package/dist/orgs/orgs.controller.js +29 -17
- package/dist/orgs/orgs.module.d.ts +6 -0
- package/dist/orgs/orgs.module.js +68 -0
- package/dist/orgs/orgs.service.d.ts +30 -19
- package/dist/orgs/orgs.service.js +139 -86
- package/dist/orgs/settings.controller.d.ts +1 -1
- package/dist/orgs/settings.controller.js +8 -6
- package/dist/orgs/settings.service.d.ts +16 -10
- package/dist/orgs/settings.service.js +77 -48
- package/dist/overrides.d.ts +56 -0
- package/dist/overrides.js +30 -0
- package/dist/roles/gateway-role.d.ts +43 -0
- package/dist/roles/gateway-role.js +98 -0
- package/dist/roles/gateway.module.d.ts +8 -0
- package/dist/roles/gateway.module.js +28 -0
- package/dist/roles/worker-role.d.ts +63 -0
- package/dist/roles/worker-role.js +144 -0
- package/dist/roles/worker.module.d.ts +14 -0
- package/dist/roles/worker.module.js +90 -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 +6 -6
- package/dist/runtime/context/build.js +18 -8
- package/dist/runtime/context/claude-tools.d.ts +2 -1
- package/dist/runtime/context/claude-tools.js +9 -10
- package/dist/runtime/context/legacy-text.d.ts +22 -0
- package/dist/runtime/context/legacy-text.js +37 -0
- package/dist/runtime/context/skills.d.ts +29 -11
- package/dist/runtime/context/skills.js +37 -30
- package/dist/runtime/conversation-lock.d.ts +20 -11
- package/dist/runtime/conversation-lock.js +62 -72
- package/dist/runtime/hook-calls.d.ts +3 -3
- package/dist/runtime/hook-calls.js +1 -6
- package/dist/runtime/job-ids.d.ts +10 -0
- package/dist/runtime/job-ids.js +10 -0
- package/dist/runtime/langgraph-loop.js +1 -1
- package/dist/runtime/loop.d.ts +8 -1
- 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 +45 -74
- package/dist/runtime/maintenance.js +139 -137
- package/dist/runtime/model-call.d.ts +7 -4
- package/dist/runtime/model-call.js +25 -58
- package/dist/runtime/providers.d.ts +17 -6
- package/dist/runtime/providers.js +66 -25
- 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-control.d.ts +33 -0
- package/dist/runtime/run-control.js +77 -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 +48 -0
- package/dist/runtime/run-jobs.js +95 -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 +32 -57
- package/dist/runtime/run-queue.js +291 -295
- package/dist/runtime/run-steps.d.ts +39 -0
- package/dist/runtime/run-steps.js +96 -0
- package/dist/runtime/run-worker.d.ts +122 -76
- package/dist/runtime/run-worker.js +343 -229
- package/dist/runtime/runtime.module.d.ts +10 -0
- package/dist/runtime/runtime.module.js +112 -0
- package/dist/runtime/step-log.d.ts +40 -0
- package/dist/runtime/step-log.js +94 -0
- package/dist/runtime/stream.controller.d.ts +5 -8
- package/dist/runtime/stream.controller.js +14 -12
- package/dist/runtime/stream.d.ts +24 -6
- package/dist/runtime/stream.js +78 -7
- package/dist/runtime/subagents/child.d.ts +3 -44
- package/dist/runtime/subagents/child.js +0 -79
- package/dist/runtime/subagents/definition.d.ts +5 -10
- package/dist/runtime/subagents/definition.js +13 -14
- package/dist/runtime/subagents/dispatch.d.ts +89 -8
- package/dist/runtime/subagents/dispatch.js +137 -142
- package/dist/runtime/subagents/limits.d.ts +9 -4
- package/dist/runtime/subagents/limits.js +4 -2
- package/dist/runtime/subagents/org-agents.d.ts +4 -4
- package/dist/runtime/subagents/org-agents.js +3 -2
- package/dist/runtime/subagents/progress.d.ts +2 -2
- package/dist/runtime/subagents/roster.d.ts +4 -4
- package/dist/runtime/subagents/roster.js +2 -2
- package/dist/runtime/subagents/skill-fork.d.ts +8 -9
- package/dist/runtime/subagents/skill-fork.js +17 -6
- package/dist/runtime/subagents/subagents.service.d.ts +40 -0
- package/dist/runtime/subagents/subagents.service.js +101 -0
- package/dist/runtime/usage-report.d.ts +94 -52
- package/dist/runtime/usage-report.js +200 -100
- package/dist/runtime/waits.d.ts +127 -59
- package/dist/runtime/waits.js +433 -210
- package/dist/sandbox/job-ids.d.ts +10 -0
- package/dist/sandbox/job-ids.js +10 -0
- package/dist/sandbox/jobs.d.ts +41 -0
- package/dist/sandbox/jobs.js +113 -0
- package/dist/sandbox/leases.d.ts +39 -31
- package/dist/sandbox/leases.js +117 -257
- package/dist/sandbox/providers.d.ts +19 -0
- package/dist/sandbox/providers.js +38 -0
- package/dist/sandbox/sandbox.module.d.ts +8 -0
- package/dist/sandbox/sandbox.module.js +30 -0
- package/dist/sandbox/sandbox.service.d.ts +24 -29
- package/dist/sandbox/sandbox.service.js +106 -75
- package/dist/skills/catalog.d.ts +37 -24
- package/dist/skills/catalog.js +100 -57
- package/dist/skills/changes.controller.d.ts +4 -4
- package/dist/skills/changes.controller.js +15 -9
- package/dist/skills/changes.service.d.ts +30 -20
- package/dist/skills/changes.service.js +425 -367
- package/dist/skills/invocable.controller.d.ts +1 -1
- package/dist/skills/invocable.controller.js +8 -5
- package/dist/skills/invocation-keys.d.ts +1 -1
- package/dist/skills/invocation-keys.js +1 -1
- package/dist/skills/invoke.d.ts +17 -16
- package/dist/skills/invoke.js +53 -21
- package/dist/skills/skills.controller.d.ts +1 -1
- package/dist/skills/skills.controller.js +11 -6
- package/dist/skills/skills.module.d.ts +6 -0
- package/dist/skills/skills.module.js +30 -0
- package/dist/skills/skills.service.d.ts +47 -30
- package/dist/skills/skills.service.js +221 -158
- 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/tools/approvals.controller.d.ts +1 -1
- package/dist/tools/approvals.controller.js +12 -8
- package/dist/tools/approvals.service.d.ts +33 -25
- package/dist/tools/approvals.service.js +343 -259
- package/dist/tools/breaker.d.ts +2 -2
- package/dist/tools/breaker.js +21 -3
- package/dist/tools/builtin-names.d.ts +73 -0
- package/dist/tools/builtin-names.js +116 -0
- package/dist/tools/builtins/agent.d.ts +7 -7
- package/dist/tools/builtins/agent.js +7 -11
- 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 +21 -0
- package/dist/tools/builtins/builtin-tools.js +80 -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 +33 -30
- package/dist/tools/builtins/sandbox/common.d.ts +5 -4
- package/dist/tools/builtins/sandbox/common.js +2 -2
- package/dist/tools/builtins/sandbox/deliver.d.ts +1 -1
- package/dist/tools/builtins/sandbox/deliver.js +13 -13
- package/dist/tools/builtins/sandbox/edit.d.ts +1 -1
- package/dist/tools/builtins/sandbox/edit.js +42 -31
- 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 +6 -6
- package/dist/tools/builtins/sandbox/grep.d.ts +7 -4
- package/dist/tools/builtins/sandbox/grep.js +149 -32
- package/dist/tools/builtins/sandbox/index.d.ts +1 -1
- package/dist/tools/builtins/sandbox/index.js +1 -1
- package/dist/tools/builtins/sandbox/read.d.ts +2 -2
- package/dist/tools/builtins/sandbox/read.js +22 -15
- package/dist/tools/builtins/sandbox/write.d.ts +1 -1
- package/dist/tools/builtins/sandbox/write.js +38 -34
- package/dist/tools/builtins/skill-load.d.ts +6 -6
- package/dist/tools/builtins/skill-load.js +33 -17
- package/dist/tools/builtins/skill-write.d.ts +4 -4
- package/dist/tools/builtins/skill-write.js +10 -10
- package/dist/tools/builtins/tool-search.d.ts +13 -9
- package/dist/tools/builtins/tool-search.js +25 -14
- 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 +1 -1
- package/dist/tools/connectors.controller.js +21 -10
- package/dist/tools/connectors.service.d.ts +31 -13
- package/dist/tools/connectors.service.js +438 -348
- package/dist/tools/credentials.d.ts +17 -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/info.d.ts +32 -13
- package/dist/tools/info.js +88 -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 +11 -3
- package/dist/tools/oauth/tokens.js +15 -14
- package/dist/tools/outputs.d.ts +13 -4
- package/dist/tools/outputs.js +48 -4
- package/dist/tools/pipeline.d.ts +72 -50
- package/dist/tools/pipeline.js +239 -100
- package/dist/tools/policy.d.ts +3 -16
- package/dist/tools/policy.js +13 -19
- 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 +43 -38
- package/dist/tools/registry.js +100 -72
- 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 +91 -0
- 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 +9 -57
- package/dist/ui/views.js +43 -45
- package/package.json +10 -3
- package/src/migrations/0063_tool_keys_claude_code.sql +220 -0
- 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/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/http/{gateway.module.d.ts → gateway-routes.d.ts} +0 -0
- /package/dist/http/{gateway.module.js → gateway-routes.js} +0 -0
|
@@ -1,25 +1,49 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
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 { Inject, Injectable, Optional } from "@nestjs/common";
|
|
11
|
+
import { DelayedError } from "bullmq";
|
|
3
12
|
import { sql } from "kysely";
|
|
4
|
-
import {
|
|
13
|
+
import { conversationTopic, EventLog, } from "../conversations/event-log.js";
|
|
5
14
|
import { effectiveDefinition, NO_SELECTION, readSelection, sameModel, sameSelection, } from "../conversations/selection.js";
|
|
15
|
+
import { TitleQueue } from "../conversations/titles.js";
|
|
6
16
|
import { ApiError } from "../errors.js";
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
17
|
+
import { SettingsService } from "../identity/settings.js";
|
|
18
|
+
import { waitWithin } from "../infra/close-within.js";
|
|
19
|
+
import { KernelConfigService } from "../infra/config/kernel-config.service.js";
|
|
20
|
+
import { KernelDb } from "../infra/database/kernel-db.js";
|
|
21
|
+
import { TransactionHost } from "../infra/database/transaction-host.js";
|
|
22
|
+
import { Transactional } from "../infra/database/transactional.decorator.js";
|
|
23
|
+
import { KernelEvents } from "../infra/events/kernel-events.js";
|
|
24
|
+
import { KERNEL_BUS, KERNEL_LOGGER } from "../infra/tokens.js";
|
|
25
|
+
import { pinnedFailureText, SkillsCatalogService } from "../skills/catalog.js";
|
|
26
|
+
import { normalizeStoredDefinitionIn } from "../tools/legacy-data.js";
|
|
27
|
+
import { ToolPipeline } from "../tools/pipeline.js";
|
|
28
|
+
import { RunAbort } from "./abort.js";
|
|
29
|
+
import { KyselyCheckpointSaver } from "./checkpointer.js";
|
|
30
|
+
import { ConversationLock } from "./conversation-lock.js";
|
|
9
31
|
import { RunError } from "./model-call.js";
|
|
10
|
-
import { ProviderListError } from "./providers.js";
|
|
11
|
-
import { ORG_QUOTA_LEASE_MS, orgRunLimit } from "./quota.js";
|
|
12
|
-
import {
|
|
13
|
-
import {
|
|
32
|
+
import { ProviderListError, ProviderRegistry } from "./providers.js";
|
|
33
|
+
import { ORG_QUOTA_LEASE_MS, orgRunLimit, RUN_QUOTA } from "./quota.js";
|
|
34
|
+
import { RunFinish, TERMINAL_STATUSES } from "./run-finish.js";
|
|
35
|
+
import { RunQueue } from "./run-queue.js";
|
|
36
|
+
import { AgentLoops, RunSteps } from "./run-steps.js";
|
|
14
37
|
import { dispatchOfChildRun } from "./subagents/child.js";
|
|
15
38
|
import { childRunDefinition } from "./subagents/definition.js";
|
|
16
39
|
import { forkBoundary } from "./subagents/skill-fork.js";
|
|
40
|
+
import { Waits } from "./waits.js";
|
|
17
41
|
/** 会话锁被占用时任务延后的时间。 */
|
|
18
42
|
const LOCK_BUSY_DELAY_MS = 1000;
|
|
19
43
|
/** 组织配额已满时任务延后的时间。 */
|
|
20
44
|
const QUOTA_FULL_DELAY_MS = 2000;
|
|
21
45
|
/** BullMQ stalled 检测允许的最大次数(超过则任务失败)。 */
|
|
22
|
-
const MAX_STALLED_COUNT = 3;
|
|
46
|
+
export const MAX_STALLED_COUNT = 3;
|
|
23
47
|
/** 停机时等待任务结束后处理(ensureRun 等)的最短时间。 */
|
|
24
48
|
const FOLLOW_UP_MIN_WAIT_MS = 250;
|
|
25
49
|
/** 读插话的分页大小。 */
|
|
@@ -29,88 +53,179 @@ const READ_PAGE = 500;
|
|
|
29
53
|
* 后续处理,由 close() 跟踪并限时;全部失败也不会让会话永远卡住——打开 SSE / 读事件时会再次 ensureRun。
|
|
30
54
|
*/
|
|
31
55
|
const ENSURE_RETRY_DELAYS_MS = [200, 1000, 3000];
|
|
32
|
-
|
|
56
|
+
/** Optional provider: the run worker's {@link RunHooks} (tests). */
|
|
57
|
+
export const RUN_HOOKS = Symbol("RUN_HOOKS");
|
|
33
58
|
/** 任务回到队列:延后 delayMs 再处理(不计入 attempts)。 */
|
|
34
59
|
async function requeue(job, token, delayMs) {
|
|
35
60
|
await job.moveToDelayed(Date.now() + delayMs, token);
|
|
36
61
|
throw new DelayedError();
|
|
37
62
|
}
|
|
38
63
|
/**
|
|
39
|
-
* 运行 worker(只在含 `worker`
|
|
40
|
-
*
|
|
41
|
-
*
|
|
64
|
+
* 运行 worker(只在含 `worker` 角色的进程消费):领取 `cap-kernel-runs` 与 `cap-kernel-subagent-runs` 的任务
|
|
65
|
+
* (两个 `@Processor`,见 run-processors.ts),取会话锁与组织配额,调用 AgentLoop,按结果写终态事件并推进
|
|
66
|
+
* `consumed_seq`;结束后再调用一次 `ensureRun` 处理运行期间到达但没被吸收的消息(Review Focus 2)。
|
|
42
67
|
*/
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
68
|
+
let RunWorker = class RunWorker {
|
|
69
|
+
kdb;
|
|
70
|
+
eventLog;
|
|
71
|
+
lock;
|
|
72
|
+
quota;
|
|
73
|
+
abort;
|
|
74
|
+
queue;
|
|
75
|
+
settings;
|
|
76
|
+
config;
|
|
77
|
+
log;
|
|
78
|
+
bus;
|
|
79
|
+
checkpoints;
|
|
80
|
+
waits;
|
|
81
|
+
events;
|
|
82
|
+
titles;
|
|
83
|
+
models;
|
|
84
|
+
skillsCatalog;
|
|
85
|
+
pipeline;
|
|
86
|
+
finisher;
|
|
87
|
+
txHost;
|
|
88
|
+
hooks;
|
|
89
|
+
/** The two run queues' BullMQ workers (spec §7.4), once {@link start}ed on the worker role. */
|
|
46
90
|
workers = [];
|
|
47
|
-
/** 传给 Worker 的连接:BullMQ 不关闭调用方传入的连接,close() 时自己关。 */
|
|
48
|
-
conn;
|
|
49
91
|
active = new Map();
|
|
50
92
|
/** 进行中的「任务结束后」处理(完成后的 ensureRun、失败标记):停机时等它们做完再关闭队列。 */
|
|
51
93
|
followUps = new Set();
|
|
52
94
|
closing = false;
|
|
53
95
|
/** close() 开始时触发:ensureRun 重试不再等待退避间隔。 */
|
|
54
96
|
closingSignal = new AbortController();
|
|
55
|
-
|
|
56
|
-
|
|
97
|
+
loop;
|
|
98
|
+
constructor(kdb, eventLog, lock, quota, abort, queue, settings, loops, steps, config, log, bus,
|
|
99
|
+
/** 运行到达终态后删除该运行(thread_id = runId)的 checkpoint thread(只用于续跑,结束后无用)。 */
|
|
100
|
+
checkpoints,
|
|
101
|
+
/** loop 返回 `suspended` 后把运行置为 waiting(释放会话锁与配额之后); the child lifecycle. */
|
|
102
|
+
waits,
|
|
103
|
+
/** `run.started` (the channel outbound enqueues the conversation's IM delivery). */
|
|
104
|
+
events,
|
|
105
|
+
/** A completed run enqueues the conversation's title job. */
|
|
106
|
+
titles,
|
|
107
|
+
/** Resolves a switched-to model at run start (fallback when it is gone; UI refresh B). */
|
|
108
|
+
models,
|
|
109
|
+
/** Run start's skills catalog snapshot (reads the pinned skills' bodies, phase B). */
|
|
110
|
+
skillsCatalog,
|
|
111
|
+
/**
|
|
112
|
+
* In the terminal transaction of every run: writes its open `Agent` call results
|
|
113
|
+
* (`stopOpenAgentCalls`; a no-op without dispatches); `fire` runs their observe hooks after the
|
|
114
|
+
* commit (sub-agents spec §12, review m1: a failed or stalled parent too).
|
|
115
|
+
*/
|
|
116
|
+
pipeline, finisher, txHost, hooks) {
|
|
117
|
+
this.kdb = kdb;
|
|
118
|
+
this.eventLog = eventLog;
|
|
119
|
+
this.lock = lock;
|
|
120
|
+
this.quota = quota;
|
|
121
|
+
this.abort = abort;
|
|
122
|
+
this.queue = queue;
|
|
123
|
+
this.settings = settings;
|
|
124
|
+
this.config = config;
|
|
125
|
+
this.log = log;
|
|
126
|
+
this.bus = bus;
|
|
127
|
+
this.checkpoints = checkpoints;
|
|
128
|
+
this.waits = waits;
|
|
129
|
+
this.events = events;
|
|
130
|
+
this.titles = titles;
|
|
131
|
+
this.models = models;
|
|
132
|
+
this.skillsCatalog = skillsCatalog;
|
|
133
|
+
this.pipeline = pipeline;
|
|
134
|
+
this.finisher = finisher;
|
|
135
|
+
this.txHost = txHost;
|
|
136
|
+
this.hooks = hooks;
|
|
137
|
+
this.loop = loops.create(steps.deps);
|
|
138
|
+
}
|
|
139
|
+
get db() {
|
|
140
|
+
return this.kdb.db;
|
|
57
141
|
}
|
|
58
|
-
|
|
59
|
-
|
|
142
|
+
/**
|
|
143
|
+
* Starts consuming (worker role only): `workers` are the `@Processor` workers of both run queues
|
|
144
|
+
* (built with `runtime.workerConcurrency`, `jobLockMs`, `stalledIntervalMs`; never autorun).
|
|
145
|
+
*/
|
|
146
|
+
start(workers) {
|
|
147
|
+
if (this.workers.length > 0 || this.closing)
|
|
60
148
|
return;
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
const worker = new Worker(queue, (job, token) => withJobContext(queue, job, () => this.process(job, token)), {
|
|
65
|
-
// the worker name is recorded on the job (BullMQ processedBy): which replica ran it
|
|
66
|
-
name: `${hostname()}-${process.pid}`,
|
|
67
|
-
connection: this.conn,
|
|
68
|
-
concurrency: runtime.workerConcurrency,
|
|
69
|
-
lockDuration: runtime.jobLockMs,
|
|
70
|
-
stalledInterval: runtime.stalledIntervalMs,
|
|
71
|
-
maxStalledCount: MAX_STALLED_COUNT,
|
|
72
|
-
});
|
|
73
|
-
// ensureRun after a run goes after its job completed and left the queue: when the latest
|
|
74
|
-
// unconsumed message is this run's own trigger (e.g. a run ended by its deadline without
|
|
75
|
-
// absorbing it, R34), the new job has this job's id and would be dropped as a duplicate
|
|
76
|
-
// while this one is still active. Relies on BullMQ moving the job to completed (deleted by
|
|
77
|
-
// removeOnComplete) before emitting "completed" (pinned by the R34 test).
|
|
78
|
-
worker.on("completed", (job, result) => {
|
|
79
|
-
if (result !== "ensure")
|
|
80
|
-
return;
|
|
81
|
-
const { conversationId, runId } = job.data;
|
|
82
|
-
this.track(this.ensureAfterRun(conversationId, runId));
|
|
83
|
-
});
|
|
84
|
-
worker.on("error", (err) => this.d.log.error("run worker error", { err, queue }));
|
|
85
|
-
worker.on("failed", (job, err) => {
|
|
86
|
-
this.d.log.error("run job failed", { jobId: job?.id, runId: job?.data.runId, err });
|
|
87
|
-
if (job) {
|
|
88
|
-
this.track(this.onJobFailed(job.data, err).catch((e) => this.d.log.error("cannot mark failed run job", { runId: job.data.runId, err: e })));
|
|
89
|
-
}
|
|
90
|
-
});
|
|
91
|
-
this.workers.push(worker);
|
|
149
|
+
this.workers = workers;
|
|
150
|
+
for (const w of workers) {
|
|
151
|
+
void w.run().catch((err) => this.onError(err, w.name));
|
|
92
152
|
}
|
|
93
153
|
}
|
|
94
|
-
/**
|
|
95
|
-
|
|
96
|
-
|
|
154
|
+
/** A worker's `error` event. */
|
|
155
|
+
onError(err, queue) {
|
|
156
|
+
this.log.error("run worker error", { err, queue });
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* A job completed (the worker's `completed` event). ensureRun after a run goes after its job
|
|
160
|
+
* completed and left the queue: when the latest unconsumed message is this run's own trigger
|
|
161
|
+
* (e.g. a run ended by its deadline without absorbing it, R34), the new job has this job's id
|
|
162
|
+
* and would be dropped as a duplicate while this one is still active. Relies on BullMQ moving
|
|
163
|
+
* the job to completed (deleted by removeOnComplete) before emitting "completed" (pinned by the
|
|
164
|
+
* R34 test).
|
|
165
|
+
*/
|
|
166
|
+
onCompleted(job, result) {
|
|
167
|
+
if (result !== "ensure")
|
|
97
168
|
return;
|
|
169
|
+
const { conversationId, runId } = job.data;
|
|
170
|
+
this.track(this.ensureAfterRun(conversationId, runId));
|
|
171
|
+
}
|
|
172
|
+
/** A job failed (the worker's `failed` event). */
|
|
173
|
+
onFailed(job, err) {
|
|
174
|
+
this.log.error("run job failed", { jobId: job?.id, runId: job?.data.runId, err });
|
|
175
|
+
if (job) {
|
|
176
|
+
this.track(this.onJobFailed(job.data, err).catch((e) => this.log.error("cannot mark failed run job", { runId: job.data.runId, err: e })));
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* 流式增量发布到会话频道(与 `{ kind: "events" }` 共用 `conv.<id>`),任意副本上的订阅方都能收到。
|
|
181
|
+
* 发布失败只记日志:增量只是草稿,最终内容以日志中的 assistant_message 为准。
|
|
182
|
+
*/
|
|
183
|
+
sinkFor(conversationId) {
|
|
184
|
+
// 本次运行执行中推出的文本字符数(按步,step_reset 清零):本进程正在执行的这次运行自己的计数
|
|
185
|
+
let at = { runId: "", step: -1, chars: 0 };
|
|
186
|
+
return (d) => {
|
|
187
|
+
if (at.runId !== d.runId || at.step !== d.step || d.kind === "step_reset") {
|
|
188
|
+
at = { runId: d.runId, step: d.step, chars: 0 };
|
|
189
|
+
}
|
|
190
|
+
const offset = at.chars;
|
|
191
|
+
if (d.kind === "text")
|
|
192
|
+
at.chars += d.text?.length ?? 0;
|
|
193
|
+
const msg = {
|
|
194
|
+
kind: "delta",
|
|
195
|
+
runId: d.runId,
|
|
196
|
+
step: d.step,
|
|
197
|
+
delta: d.kind,
|
|
198
|
+
...(d.text !== undefined && { text: d.text }),
|
|
199
|
+
...(d.kind === "text" && { offset }),
|
|
200
|
+
};
|
|
201
|
+
this.bus
|
|
202
|
+
.publish(conversationTopic(conversationId), msg)
|
|
203
|
+
.catch((err) => this.log.warn("stream delta publish failed", { conversationId, err }));
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* After any terminal commit of a run that is not a sub-agent's (sub-agents spec §12): stops its
|
|
208
|
+
* active children on its behalf (no account). The wait sweep is the backstop.
|
|
209
|
+
*/
|
|
210
|
+
async stopChildren(runId) {
|
|
98
211
|
try {
|
|
99
|
-
await this.
|
|
212
|
+
await this.waits.stopChildren(runId, null);
|
|
100
213
|
}
|
|
101
214
|
catch (err) {
|
|
102
|
-
this.
|
|
215
|
+
this.log.error("cannot stop the sub-agents of a finished run", { runId, err });
|
|
103
216
|
}
|
|
104
217
|
}
|
|
105
|
-
/**
|
|
218
|
+
/**
|
|
219
|
+
* After a sub-agent run's terminal state committed (sub-agents spec §7.3): reports it to the
|
|
220
|
+
* parent. Called with any run id whose conversation may be a child; runs that were not
|
|
221
|
+
* dispatched are ignored. Errors are logged (the wait sweep repairs a missed call).
|
|
222
|
+
*/
|
|
106
223
|
async childFinished(runId) {
|
|
107
|
-
if (!this.d.onChildFinished)
|
|
108
|
-
return;
|
|
109
224
|
try {
|
|
110
|
-
await this.
|
|
225
|
+
await this.waits.childFinished(runId);
|
|
111
226
|
}
|
|
112
227
|
catch (err) {
|
|
113
|
-
this.
|
|
228
|
+
this.log.error("cannot report finished sub-agent run to its parent", { runId, err });
|
|
114
229
|
}
|
|
115
230
|
}
|
|
116
231
|
/**
|
|
@@ -120,14 +235,14 @@ export class RunWorker {
|
|
|
120
235
|
async ensureAfterRun(conversationId, runId) {
|
|
121
236
|
for (let attempt = 0;; attempt++) {
|
|
122
237
|
try {
|
|
123
|
-
await this.
|
|
124
|
-
await this.
|
|
238
|
+
await this.hooks?.beforeEnsureRun?.(conversationId, attempt);
|
|
239
|
+
await this.queue.ensureRun(conversationId);
|
|
125
240
|
return;
|
|
126
241
|
}
|
|
127
242
|
catch (err) {
|
|
128
243
|
const delay = ENSURE_RETRY_DELAYS_MS[attempt];
|
|
129
244
|
if (delay === undefined) {
|
|
130
|
-
this.
|
|
245
|
+
this.log.error("ensureRun after run failed; giving up", {
|
|
131
246
|
conversationId,
|
|
132
247
|
runId,
|
|
133
248
|
attempts: attempt + 1,
|
|
@@ -135,7 +250,7 @@ export class RunWorker {
|
|
|
135
250
|
});
|
|
136
251
|
return;
|
|
137
252
|
}
|
|
138
|
-
this.
|
|
253
|
+
this.log.warn("ensureRun after run failed; retrying", {
|
|
139
254
|
conversationId,
|
|
140
255
|
runId,
|
|
141
256
|
attempt,
|
|
@@ -174,15 +289,15 @@ export class RunWorker {
|
|
|
174
289
|
async onJobFailed(data, err) {
|
|
175
290
|
const { runId, conversationId } = data;
|
|
176
291
|
const stalled = /stalled/i.test(err.message);
|
|
177
|
-
await this.
|
|
292
|
+
await this.lock.releaseFor(conversationId, runId);
|
|
178
293
|
// 运行已进入 waiting(暂停后任务才失败):它有自己的续跑路径(人工决定 / 超时任务),不标记失败。
|
|
179
|
-
const cur = await this.
|
|
294
|
+
const cur = await this.db
|
|
180
295
|
.selectFrom("runs")
|
|
181
296
|
.select("status")
|
|
182
297
|
.where("id", "=", runId)
|
|
183
298
|
.executeTakeFirst();
|
|
184
299
|
if (cur?.status === "waiting") {
|
|
185
|
-
this.
|
|
300
|
+
this.log.warn("run job failed after the run was suspended; leaving it waiting", { runId });
|
|
186
301
|
return;
|
|
187
302
|
}
|
|
188
303
|
await this.finish(conversationId, runId, "failed", null, {
|
|
@@ -215,25 +330,18 @@ export class RunWorker {
|
|
|
215
330
|
this.workers = [];
|
|
216
331
|
this.closing = true;
|
|
217
332
|
this.closingSignal.abort();
|
|
218
|
-
await Promise.all(workers.map((w) => w.pause(true).catch((err) => this.
|
|
333
|
+
await Promise.all(workers.map((w) => w.pause(true).catch((err) => this.log.warn("run worker pause failed", { err }))));
|
|
219
334
|
for (const a of this.active.values())
|
|
220
335
|
a.shutdown.abort();
|
|
221
336
|
const all = Promise.all([...this.active.values()].map((a) => a.done));
|
|
222
|
-
|
|
223
|
-
const finished = await Promise.race([
|
|
224
|
-
all.then(() => true),
|
|
225
|
-
new Promise((resolve) => {
|
|
226
|
-
timer = setTimeout(() => resolve(false), Math.max(0, budgetMs));
|
|
227
|
-
timer.unref();
|
|
228
|
-
}),
|
|
229
|
-
]);
|
|
230
|
-
clearTimeout(timer);
|
|
337
|
+
const finished = await waitWithin(all, budgetMs);
|
|
231
338
|
if (!finished) {
|
|
232
339
|
for (const [runId, a] of this.active) {
|
|
233
340
|
a.abandoned = true;
|
|
234
341
|
a.lease.abandon();
|
|
342
|
+
a.quota?.abandon();
|
|
235
343
|
a.stopTimers();
|
|
236
|
-
this.
|
|
344
|
+
this.log.warn("run did not reach a step boundary before shutdown; leaving it to another worker", {
|
|
237
345
|
runId,
|
|
238
346
|
});
|
|
239
347
|
}
|
|
@@ -242,26 +350,15 @@ export class RunWorker {
|
|
|
242
350
|
// 关闭期间完成 / 失败的任务登记的后续处理(ensureRun 等)要在调用方关闭运行队列之前做完,
|
|
243
351
|
// 否则投递半途被打断,待处理的消息无人处理。以剩余预算为限(至少留一点时间)。
|
|
244
352
|
if (this.followUps.size > 0) {
|
|
245
|
-
|
|
246
|
-
await Promise.race([
|
|
247
|
-
Promise.allSettled([...this.followUps]),
|
|
248
|
-
new Promise((resolve) => {
|
|
249
|
-
t = setTimeout(resolve, Math.max(FOLLOW_UP_MIN_WAIT_MS, deadline - Date.now()));
|
|
250
|
-
t.unref();
|
|
251
|
-
}),
|
|
252
|
-
]);
|
|
253
|
-
clearTimeout(t);
|
|
353
|
+
await waitWithin(Promise.allSettled([...this.followUps]), Math.max(FOLLOW_UP_MIN_WAIT_MS, deadline - Date.now()));
|
|
254
354
|
}
|
|
255
|
-
const conn = this.conn;
|
|
256
|
-
this.conn = undefined;
|
|
257
|
-
if (conn)
|
|
258
|
-
await conn.quit().catch(() => conn.disconnect());
|
|
259
355
|
}
|
|
356
|
+
/** One run job (the `@Processor`s of both run queues call it). */
|
|
260
357
|
async process(job, token) {
|
|
261
358
|
const { runId, conversationId } = job.data;
|
|
262
359
|
if (this.closing)
|
|
263
360
|
return requeue(job, token, 0);
|
|
264
|
-
const run = await this.
|
|
361
|
+
const run = await this.db
|
|
265
362
|
.selectFrom("runs")
|
|
266
363
|
.select([
|
|
267
364
|
"id",
|
|
@@ -286,7 +383,7 @@ export class RunWorker {
|
|
|
286
383
|
// 运行在等人处理(例如暂停后本任务被 stalled 机制重新投递):不执行,续跑由处理 / 超时发起的新任务负责。
|
|
287
384
|
if (run.status === "waiting")
|
|
288
385
|
return;
|
|
289
|
-
const conv = await this.
|
|
386
|
+
const conv = await this.db
|
|
290
387
|
.selectFrom("conversations")
|
|
291
388
|
.select(["org_id", "agent_id", "kind"])
|
|
292
389
|
.where("id", "=", conversationId)
|
|
@@ -294,14 +391,14 @@ export class RunWorker {
|
|
|
294
391
|
if (!conv)
|
|
295
392
|
return;
|
|
296
393
|
// 会话锁 TTL 与任务锁一致:持有者崩溃后,任务被判定 stalled 时会话锁也差不多同时过期。
|
|
297
|
-
const lease = await this.
|
|
394
|
+
const lease = await this.lock.acquire(conversationId, runId, this.hooks?.lockTtlMs ?? this.config.get().runtime.jobLockMs);
|
|
298
395
|
if (!lease)
|
|
299
396
|
return requeue(job, token, LOCK_BUSY_DELAY_MS);
|
|
300
397
|
// A sub-agent stopped while still queued (its parent's stop or wait timeout) ends here, before
|
|
301
398
|
// taking an org run slot: under a full quota it would otherwise wait for a slot only to be
|
|
302
399
|
// aborted, and its parent would stay waiting meanwhile (final review m7)
|
|
303
400
|
if (conv.kind === "subagent" && run.status === "queued") {
|
|
304
|
-
const stop = await this.
|
|
401
|
+
const stop = await this.abort.requested(runId);
|
|
305
402
|
if (stop !== null) {
|
|
306
403
|
try {
|
|
307
404
|
await this.finish(conversationId, runId, "aborted", null, {
|
|
@@ -316,7 +413,7 @@ export class RunWorker {
|
|
|
316
413
|
finally {
|
|
317
414
|
await lease
|
|
318
415
|
.release()
|
|
319
|
-
.catch((err) => this.
|
|
416
|
+
.catch((err) => this.log.warn("conversation lock release failed", { runId, err }));
|
|
320
417
|
}
|
|
321
418
|
await this.dropCheckpoints(runId);
|
|
322
419
|
await this.childFinished(runId);
|
|
@@ -346,30 +443,28 @@ export class RunWorker {
|
|
|
346
443
|
let entered = false;
|
|
347
444
|
let delayMs = null;
|
|
348
445
|
try {
|
|
349
|
-
const limit = await orgRunLimit(this.
|
|
350
|
-
|
|
446
|
+
const limit = await orgRunLimit(this.settings, this.config, conv.org_id);
|
|
447
|
+
const slot = await this.quota.enter(conv.org_id, runId, limit, ORG_QUOTA_LEASE_MS);
|
|
448
|
+
if (slot !== undefined)
|
|
449
|
+
state.quota = slot;
|
|
450
|
+
entered = slot !== undefined;
|
|
351
451
|
if (!entered) {
|
|
352
452
|
delayMs = QUOTA_FULL_DELAY_MS;
|
|
353
453
|
}
|
|
354
454
|
else {
|
|
355
455
|
// 运行开始执行(含续跑、stalled 后接手):通知旁路(渠道出站投递据此把输出投到 IM),失败不影响运行
|
|
356
|
-
|
|
357
|
-
this.d.onRunStart?.(conversationId);
|
|
358
|
-
}
|
|
359
|
-
catch (err) {
|
|
360
|
-
this.d.log.warn("onRunStart hook failed", { conversationId, err });
|
|
361
|
-
}
|
|
456
|
+
void this.events.emit("run.started", { conversationId, runId });
|
|
362
457
|
const r = await this.execute(run, { id: conversationId, ...conv }, state).catch(async (err) => {
|
|
363
458
|
if (state.abandoned)
|
|
364
459
|
return "abandoned";
|
|
365
460
|
if (state.leaseLost)
|
|
366
461
|
return "interrupted";
|
|
367
462
|
// 编排自身出错(如写事件失败):尽力把运行标记为失败,避免会话卡在 running。
|
|
368
|
-
this.
|
|
463
|
+
this.log.error("run orchestration failed", { conversationId, runId, err });
|
|
369
464
|
await this.finish(conversationId, runId, "failed", null, {
|
|
370
465
|
type: "run_failed",
|
|
371
466
|
payload: { error: { code: "run.internal", message: "The run failed unexpectedly" } },
|
|
372
|
-
}).catch((e) => this.
|
|
467
|
+
}).catch((e) => this.log.error("cannot mark run as failed", { runId, err: e }));
|
|
373
468
|
return "broken";
|
|
374
469
|
});
|
|
375
470
|
if (r === "interrupted")
|
|
@@ -379,16 +474,14 @@ export class RunWorker {
|
|
|
379
474
|
finally {
|
|
380
475
|
state.stopTimers();
|
|
381
476
|
if (!state.abandoned) {
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
.catch((err) => this.d.log.warn("org quota leave failed", { runId, err }));
|
|
386
|
-
}
|
|
477
|
+
// releasing the slot stops its renewal and leaves (a failure is logged by the lock service)
|
|
478
|
+
if (entered)
|
|
479
|
+
await state.quota?.release();
|
|
387
480
|
// 锁已丢失时不释放(已不属于本运行;RELEASE 虽比对 runId,这里也不再触碰)。
|
|
388
481
|
if (!state.leaseLost) {
|
|
389
482
|
await lease
|
|
390
483
|
.release()
|
|
391
|
-
.catch((err) => this.
|
|
484
|
+
.catch((err) => this.log.warn("conversation lock release failed", { runId, err }));
|
|
392
485
|
}
|
|
393
486
|
}
|
|
394
487
|
this.active.delete(runId);
|
|
@@ -401,7 +494,7 @@ export class RunWorker {
|
|
|
401
494
|
// 暂停:会话锁与配额已释放,checkpoint 保留;置 waiting 并投递超时任务。任务就此完成,不 ensureRun
|
|
402
495
|
// (等待期间的新消息在续跑后作为插话吸收)。
|
|
403
496
|
if (state.suspended) {
|
|
404
|
-
await this.
|
|
497
|
+
await this.waits.suspend(runId, conversationId, state.suspended.waitingFor, state.suspended.abort);
|
|
405
498
|
return;
|
|
406
499
|
}
|
|
407
500
|
// 运行已到达终态(broken 时已尽力标记失败):checkpoint 只用于续跑,删除。
|
|
@@ -415,7 +508,7 @@ export class RunWorker {
|
|
|
415
508
|
async execute(run, conv, state) {
|
|
416
509
|
const runId = run.id;
|
|
417
510
|
const conversationId = conv.id;
|
|
418
|
-
const runtime = this.
|
|
511
|
+
const runtime = this.config.get().runtime;
|
|
419
512
|
let agent;
|
|
420
513
|
// a chat run's saved agent version, under the conversation's model switch (UI refresh B); a
|
|
421
514
|
// sub-agent has none: it never takes a selection
|
|
@@ -425,18 +518,18 @@ export class RunWorker {
|
|
|
425
518
|
if (conv.kind === "subagent") {
|
|
426
519
|
// a sub-agent runs its effective definition frozen at dispatch, never agent_versions
|
|
427
520
|
// (spec §6.3), and works for the parent call that dispatched this run
|
|
428
|
-
const started = await this.
|
|
521
|
+
const started = await this.eventLog.findByIdem(conversationId, "subagent_started");
|
|
429
522
|
if (started?.type !== "subagent_started") {
|
|
430
523
|
throw new Error(`sub-agent conversation ${conversationId} has no subagent_started`);
|
|
431
524
|
}
|
|
432
525
|
// a follow-up runs with its task message's narrowing (final review I1): the frozen tools
|
|
433
526
|
// and org skills the current version still allows, recorded at its dispatch
|
|
434
|
-
const trigger = (await this.
|
|
435
|
-
agent = childRunDefinition(
|
|
527
|
+
const trigger = (await this.eventLog.readAfter(conversationId, Number(run.trigger_seq) - 1, 1))[0];
|
|
528
|
+
agent = childRunDefinition(await normalizeStoredDefinitionIn(this.db, conv.org_id, started.payload.definition), trigger?.type === "user_message" && trigger.seq === Number(run.trigger_seq)
|
|
436
529
|
? trigger.payload.dispatch?.narrowed
|
|
437
530
|
: undefined);
|
|
438
531
|
maxSteps = Math.min(started.payload.maxSteps, runtime.maxSteps);
|
|
439
|
-
const row = await dispatchOfChildRun(this.
|
|
532
|
+
const row = await dispatchOfChildRun(this.db, runId);
|
|
440
533
|
const otherAgent = started.payload.template.source === "agent";
|
|
441
534
|
parent = row
|
|
442
535
|
? {
|
|
@@ -453,13 +546,13 @@ export class RunWorker {
|
|
|
453
546
|
};
|
|
454
547
|
}
|
|
455
548
|
else {
|
|
456
|
-
const version = await this.
|
|
549
|
+
const version = await this.db
|
|
457
550
|
.selectFrom("agent_versions")
|
|
458
551
|
.select("definition")
|
|
459
552
|
.where("agent_id", "=", conv.agent_id)
|
|
460
553
|
.where("version", "=", run.agent_version)
|
|
461
554
|
.executeTakeFirstOrThrow();
|
|
462
|
-
saved =
|
|
555
|
+
saved = await normalizeStoredDefinitionIn(this.db, conv.org_id, version.definition);
|
|
463
556
|
agent = saved;
|
|
464
557
|
}
|
|
465
558
|
let startedAt = run.started_at;
|
|
@@ -467,66 +560,40 @@ export class RunWorker {
|
|
|
467
560
|
// run's `run_started`, read under the conversation lock when the run starts, so a replay
|
|
468
561
|
// (`selectionAt`) sees exactly what the run used.
|
|
469
562
|
// A sub-agent (no `saved`) runs its frozen definition as is.
|
|
470
|
-
const existingStart = await this.
|
|
563
|
+
const existingStart = await this.eventLog.findByIdem(conversationId, `run_started:${runId}`);
|
|
471
564
|
if (existingStart && saved !== undefined) {
|
|
472
|
-
agent = effectiveDefinition(saved, await readSelection(this.
|
|
565
|
+
agent = effectiveDefinition(saved, await readSelection(this.db, conversationId, existingStart.seq));
|
|
473
566
|
}
|
|
474
567
|
if (run.status === "queued" || startedAt === null) {
|
|
475
568
|
if (!existingStart) {
|
|
476
569
|
if (saved !== undefined)
|
|
477
570
|
await this.fallBackIfUnavailable(conversationId, runId, saved);
|
|
478
|
-
const
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
.select("id")
|
|
482
|
-
.where("id", "=", conversationId)
|
|
483
|
-
.forUpdate()
|
|
484
|
-
.execute();
|
|
485
|
-
if (saved !== undefined) {
|
|
486
|
-
agent = effectiveDefinition(saved, await readSelection(t, conversationId));
|
|
487
|
-
}
|
|
488
|
-
const [ev] = await this.d.eventLog.append(conversationId, [
|
|
489
|
-
{
|
|
490
|
-
type: "run_started",
|
|
491
|
-
runId,
|
|
492
|
-
idemKey: `run_started:${runId}`,
|
|
493
|
-
payload: {
|
|
494
|
-
agentVersion: run.agent_version,
|
|
495
|
-
model: agent.model,
|
|
496
|
-
triggerAccountId: run.trigger_account_id,
|
|
497
|
-
},
|
|
498
|
-
},
|
|
499
|
-
], t);
|
|
500
|
-
return ev?.seq;
|
|
501
|
-
});
|
|
571
|
+
const started = await this.appendRunStarted(conversationId, run, agent, saved);
|
|
572
|
+
agent = started.agent;
|
|
573
|
+
const toSeq = started.toSeq;
|
|
502
574
|
if (toSeq !== undefined)
|
|
503
|
-
await this.
|
|
575
|
+
await this.eventLog.notify(conversationId, toSeq);
|
|
504
576
|
}
|
|
505
577
|
// 技能目录快照(Ruling M17):在置为 running 之前写,崩溃重试时仍走这里(幂等键去重)
|
|
506
578
|
try {
|
|
507
|
-
await
|
|
508
|
-
db: this.d.db,
|
|
509
|
-
eventLog: this.d.eventLog,
|
|
510
|
-
log: this.d.log,
|
|
511
|
-
...(this.d.storage !== undefined && { storage: this.d.storage }),
|
|
512
|
-
}, {
|
|
579
|
+
await this.skillsCatalog.record({
|
|
513
580
|
orgId: conv.org_id,
|
|
514
581
|
agentId: conv.agent_id,
|
|
515
582
|
conversationId,
|
|
516
583
|
runId,
|
|
517
584
|
agent,
|
|
518
|
-
});
|
|
585
|
+
}, { log: this.log });
|
|
519
586
|
}
|
|
520
587
|
catch (e) {
|
|
521
588
|
// Pinned skill bodies could not be read (Decision 9), or the pinned skills kept changing
|
|
522
589
|
// while they were read (`conflict`): fail before any model request. A transient failure
|
|
523
590
|
// or a conflict is fixed by sending again; a permanent one names the skill for the owner
|
|
524
|
-
// (`
|
|
591
|
+
// (`SkillsCatalogService.record` already logged it at error). Other errors take the generic path.
|
|
525
592
|
if (!(e instanceof ApiError) ||
|
|
526
593
|
(e.code !== "storage.unavailable" && e.code !== "conflict")) {
|
|
527
594
|
throw e;
|
|
528
595
|
}
|
|
529
|
-
this.
|
|
596
|
+
this.log.warn("skills catalog not recorded at run start", {
|
|
530
597
|
conversationId,
|
|
531
598
|
runId,
|
|
532
599
|
code: e.code,
|
|
@@ -539,7 +606,7 @@ export class RunWorker {
|
|
|
539
606
|
});
|
|
540
607
|
return "finished";
|
|
541
608
|
}
|
|
542
|
-
const updated = await this.
|
|
609
|
+
const updated = await this.db
|
|
543
610
|
.updateTable("runs")
|
|
544
611
|
.set({ status: "running", started_at: sql `COALESCE(started_at, now())` })
|
|
545
612
|
.where("id", "=", runId)
|
|
@@ -557,29 +624,18 @@ export class RunWorker {
|
|
|
557
624
|
deadlineHit = true;
|
|
558
625
|
ac.abort();
|
|
559
626
|
}, Math.max(0, deadline - Date.now()));
|
|
560
|
-
const quotaTimer = setInterval(() => {
|
|
561
|
-
this.d.quota
|
|
562
|
-
.renew(conv.org_id, runId, ORG_QUOTA_LEASE_MS)
|
|
563
|
-
.then((ok) => {
|
|
564
|
-
if (!ok)
|
|
565
|
-
this.d.log.warn("org quota lease lost", { runId, orgId: conv.org_id });
|
|
566
|
-
})
|
|
567
|
-
.catch((err) => this.d.log.warn("org quota renew failed", { runId, err }));
|
|
568
|
-
}, ORG_QUOTA_LEASE_MS / 3);
|
|
569
|
-
quotaTimer.unref();
|
|
570
627
|
state.stopTimers = () => {
|
|
571
628
|
clearTimeout(deadlineTimer);
|
|
572
|
-
clearInterval(quotaTimer);
|
|
573
629
|
};
|
|
574
630
|
let unwatch;
|
|
575
631
|
try {
|
|
576
|
-
unwatch = await this.
|
|
632
|
+
unwatch = await this.abort.watch(runId, (by, detail) => {
|
|
577
633
|
abortedBy = by;
|
|
578
634
|
abortDetail = detail;
|
|
579
635
|
ac.abort();
|
|
580
636
|
});
|
|
581
637
|
// 取得会话锁之后再读 consumed_seq(锁内不会有别的运行推进它)。
|
|
582
|
-
const { consumed_seq } = await this.
|
|
638
|
+
const { consumed_seq } = await this.db
|
|
583
639
|
.selectFrom("conversations")
|
|
584
640
|
.select("consumed_seq")
|
|
585
641
|
.where("id", "=", conversationId)
|
|
@@ -592,7 +648,7 @@ export class RunWorker {
|
|
|
592
648
|
const out = [];
|
|
593
649
|
let after = Math.max(afterSeq, startConsumed);
|
|
594
650
|
for (;;) {
|
|
595
|
-
const page = await this.
|
|
651
|
+
const page = await this.eventLog.readAfter(conversationId, after, READ_PAGE);
|
|
596
652
|
for (const e of page)
|
|
597
653
|
if (e.type === "user_message")
|
|
598
654
|
out.push(e);
|
|
@@ -610,7 +666,7 @@ export class RunWorker {
|
|
|
610
666
|
};
|
|
611
667
|
let outcome;
|
|
612
668
|
try {
|
|
613
|
-
outcome = await this.
|
|
669
|
+
outcome = await this.loop.run({
|
|
614
670
|
orgId: conv.org_id,
|
|
615
671
|
conversationId,
|
|
616
672
|
runId,
|
|
@@ -620,7 +676,7 @@ export class RunWorker {
|
|
|
620
676
|
agentVersion: run.agent_version,
|
|
621
677
|
signal: ac.signal,
|
|
622
678
|
shutdown: state.shutdown.signal,
|
|
623
|
-
sink: this.
|
|
679
|
+
sink: this.sinkFor(conversationId),
|
|
624
680
|
pendingUserMessages,
|
|
625
681
|
limits: { maxSteps, deadline },
|
|
626
682
|
// a sub-agent's conversation fires hooks like a chat, with `parent` set (spec §11)
|
|
@@ -635,7 +691,7 @@ export class RunWorker {
|
|
|
635
691
|
return "interrupted";
|
|
636
692
|
const err = e instanceof RunError ? e : new RunError("run.internal", "The run failed unexpectedly");
|
|
637
693
|
if (!(e instanceof RunError)) {
|
|
638
|
-
this.
|
|
694
|
+
this.log.error("agent loop threw", { conversationId, runId, err: e });
|
|
639
695
|
}
|
|
640
696
|
// 失败也推进 consumed_seq 到已吸收的位置:否则结束时的 ensureRun 会对同一条消息无限重试;
|
|
641
697
|
// 用户看到 run_failed 后可以重发。
|
|
@@ -702,16 +758,12 @@ export class RunWorker {
|
|
|
702
758
|
}
|
|
703
759
|
finally {
|
|
704
760
|
state.stopTimers();
|
|
705
|
-
await unwatch?.().catch((err) => this.
|
|
761
|
+
await unwatch?.().catch((err) => this.log.warn("abort unwatch failed", { runId, err }));
|
|
706
762
|
}
|
|
707
763
|
}
|
|
708
764
|
completed(conversationId) {
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
}
|
|
712
|
-
catch (err) {
|
|
713
|
-
this.d.log.warn("onRunCompleted hook failed", { conversationId, err });
|
|
714
|
-
}
|
|
765
|
+
// a completed run enqueues the conversation's title job (never throws)
|
|
766
|
+
void this.titles.maybeEnqueue(conversationId);
|
|
715
767
|
}
|
|
716
768
|
/**
|
|
717
769
|
* When the conversation was switched to a model that no longer resolves (provider disabled,
|
|
@@ -721,13 +773,11 @@ export class RunWorker {
|
|
|
721
773
|
* handles it).
|
|
722
774
|
*/
|
|
723
775
|
async fallBackIfUnavailable(conversationId, runId, agent) {
|
|
724
|
-
|
|
725
|
-
return;
|
|
726
|
-
const sel = await readSelection(this.d.db, conversationId);
|
|
776
|
+
const sel = await readSelection(this.db, conversationId);
|
|
727
777
|
if (sel.model === null || sameModel(sel.model, agent.model))
|
|
728
778
|
return;
|
|
729
779
|
try {
|
|
730
|
-
await this.
|
|
780
|
+
await this.models.resolve(sel.model);
|
|
731
781
|
return;
|
|
732
782
|
}
|
|
733
783
|
catch (e) {
|
|
@@ -736,71 +786,135 @@ export class RunWorker {
|
|
|
736
786
|
if (!(e instanceof ApiError && e.code === "agent.model_unavailable"))
|
|
737
787
|
throw e;
|
|
738
788
|
}
|
|
739
|
-
this.
|
|
789
|
+
this.log.warn("switched-to model unavailable; falling back to the agent's model", {
|
|
740
790
|
conversationId,
|
|
741
791
|
runId,
|
|
742
792
|
model: sel.model,
|
|
743
793
|
});
|
|
744
|
-
const ev = await this.
|
|
745
|
-
// re-check under the row lock: a person who switched again since the read above wins
|
|
746
|
-
await t
|
|
747
|
-
.selectFrom("conversations")
|
|
748
|
-
.select("id")
|
|
749
|
-
.where("id", "=", conversationId)
|
|
750
|
-
.forUpdate()
|
|
751
|
-
.executeTakeFirst();
|
|
752
|
-
if (!sameSelection(await readSelection(t, conversationId), sel))
|
|
753
|
-
return null;
|
|
754
|
-
const [written] = await this.d.eventLog.append(conversationId, [
|
|
755
|
-
{
|
|
756
|
-
type: "model_switched",
|
|
757
|
-
runId,
|
|
758
|
-
idemKey: `model_fallback:${runId}`,
|
|
759
|
-
payload: { model: null, effort: null, byAccountId: null, reason: "unavailable" },
|
|
760
|
-
},
|
|
761
|
-
], t);
|
|
762
|
-
await t
|
|
763
|
-
.updateTable("conversations")
|
|
764
|
-
.set({ selection: JSON.stringify(NO_SELECTION) })
|
|
765
|
-
.where("id", "=", conversationId)
|
|
766
|
-
.execute();
|
|
767
|
-
return written ?? null;
|
|
768
|
-
});
|
|
794
|
+
const ev = await this.fallBackIn(conversationId, runId, sel);
|
|
769
795
|
if (ev === null)
|
|
770
796
|
return;
|
|
771
|
-
await this.
|
|
772
|
-
await this.
|
|
797
|
+
await this.eventLog.notify(conversationId, ev.seq);
|
|
798
|
+
await this.eventLog.publishChanged(conversationId, "selection");
|
|
799
|
+
}
|
|
800
|
+
/**
|
|
801
|
+
* `run_started` under the conversation row lock, with the model / effort switch in effect then
|
|
802
|
+
* (a chat run's `saved` version under the conversation's selection): what the run uses.
|
|
803
|
+
*/
|
|
804
|
+
async appendRunStarted(conversationId, run,
|
|
805
|
+
/** The definition so far (a sub-agent's frozen one is final). */
|
|
806
|
+
current, saved) {
|
|
807
|
+
const t = this.db;
|
|
808
|
+
await t
|
|
809
|
+
.selectFrom("conversations")
|
|
810
|
+
.select("id")
|
|
811
|
+
.where("id", "=", conversationId)
|
|
812
|
+
.forUpdate()
|
|
813
|
+
.execute();
|
|
814
|
+
const agent = saved !== undefined
|
|
815
|
+
? effectiveDefinition(saved, await readSelection(t, conversationId))
|
|
816
|
+
: current;
|
|
817
|
+
const [ev] = await this.eventLog.appendIn(conversationId, [
|
|
818
|
+
{
|
|
819
|
+
type: "run_started",
|
|
820
|
+
runId: run.id,
|
|
821
|
+
idemKey: `run_started:${run.id}`,
|
|
822
|
+
payload: {
|
|
823
|
+
agentVersion: run.agent_version,
|
|
824
|
+
model: agent.model,
|
|
825
|
+
triggerAccountId: run.trigger_account_id,
|
|
826
|
+
},
|
|
827
|
+
},
|
|
828
|
+
]);
|
|
829
|
+
return { toSeq: ev?.seq, agent };
|
|
830
|
+
}
|
|
831
|
+
/** {@link fallBackIfUnavailable}'s write: null when the person switched again meanwhile. */
|
|
832
|
+
async fallBackIn(conversationId, runId, sel) {
|
|
833
|
+
const t = this.db;
|
|
834
|
+
// re-check under the row lock: a person who switched again since the read above wins
|
|
835
|
+
await t
|
|
836
|
+
.selectFrom("conversations")
|
|
837
|
+
.select("id")
|
|
838
|
+
.where("id", "=", conversationId)
|
|
839
|
+
.forUpdate()
|
|
840
|
+
.executeTakeFirst();
|
|
841
|
+
if (!sameSelection(await readSelection(t, conversationId), sel))
|
|
842
|
+
return null;
|
|
843
|
+
const [written] = await this.eventLog.appendIn(conversationId, [
|
|
844
|
+
{
|
|
845
|
+
type: "model_switched",
|
|
846
|
+
runId,
|
|
847
|
+
idemKey: `model_fallback:${runId}`,
|
|
848
|
+
payload: { model: null, effort: null, byAccountId: null, reason: "unavailable" },
|
|
849
|
+
},
|
|
850
|
+
]);
|
|
851
|
+
await t
|
|
852
|
+
.updateTable("conversations")
|
|
853
|
+
.set({ selection: JSON.stringify(NO_SELECTION) })
|
|
854
|
+
.where("id", "=", conversationId)
|
|
855
|
+
.execute();
|
|
856
|
+
return written ?? null;
|
|
773
857
|
}
|
|
774
858
|
/** 删除已结束运行的 checkpoint thread(失败只记日志)。 */
|
|
775
859
|
async dropCheckpoints(runId) {
|
|
776
|
-
await this.
|
|
777
|
-
|
|
778
|
-
.catch((err) => this.
|
|
860
|
+
await this.checkpoints
|
|
861
|
+
.deleteThread(runId)
|
|
862
|
+
.catch((err) => this.log.warn("checkpoint delete failed", { runId, err }));
|
|
779
863
|
}
|
|
780
864
|
/**
|
|
781
865
|
* 写终态(见 `finishRun`:运行仍未结束才写,同一事务内推进 `consumed_seq` 并更新 `runs.status`),
|
|
782
866
|
* 提交后发布会话通知,然后调用测试钩子。返回终态事件 seq;运行已是终态 → null。
|
|
783
867
|
*/
|
|
784
868
|
async finish(conversationId, runId, status, consumed, event, hook = true, floorToTrigger = true) {
|
|
785
|
-
const stopOpen = this.d.stopOpenCalls;
|
|
786
869
|
let fire = () => { };
|
|
787
|
-
const toSeq = await
|
|
870
|
+
const toSeq = await this.finisher.finish({
|
|
788
871
|
conversationId,
|
|
789
872
|
runId,
|
|
790
873
|
status,
|
|
791
874
|
consumed,
|
|
792
875
|
event,
|
|
793
876
|
floorToTrigger,
|
|
794
|
-
|
|
795
|
-
|
|
796
|
-
|
|
797
|
-
},
|
|
798
|
-
}),
|
|
877
|
+
beforeTerminal: async () => {
|
|
878
|
+
fire = (await this.pipeline.stopOpenAgentCalls(runId)).fire;
|
|
879
|
+
},
|
|
799
880
|
});
|
|
800
881
|
if (toSeq !== null)
|
|
801
882
|
fire();
|
|
802
883
|
if (hook)
|
|
803
|
-
await this.
|
|
884
|
+
await this.hooks?.beforeRelease?.(runId, conversationId);
|
|
804
885
|
return toSeq;
|
|
805
886
|
}
|
|
806
|
-
}
|
|
887
|
+
};
|
|
888
|
+
__decorate([
|
|
889
|
+
Transactional({ propagation: "requires_new" })
|
|
890
|
+
], RunWorker.prototype, "appendRunStarted", null);
|
|
891
|
+
__decorate([
|
|
892
|
+
Transactional({ propagation: "requires_new" })
|
|
893
|
+
], RunWorker.prototype, "fallBackIn", null);
|
|
894
|
+
RunWorker = __decorate([
|
|
895
|
+
Injectable(),
|
|
896
|
+
__param(0, Inject(KernelDb)),
|
|
897
|
+
__param(1, Inject(EventLog)),
|
|
898
|
+
__param(2, Inject(ConversationLock)),
|
|
899
|
+
__param(3, Inject(RUN_QUOTA)),
|
|
900
|
+
__param(4, Inject(RunAbort)),
|
|
901
|
+
__param(5, Inject(RunQueue)),
|
|
902
|
+
__param(6, Inject(SettingsService)),
|
|
903
|
+
__param(7, Inject(AgentLoops)),
|
|
904
|
+
__param(8, Inject(RunSteps)),
|
|
905
|
+
__param(9, Inject(KernelConfigService)),
|
|
906
|
+
__param(10, Inject(KERNEL_LOGGER)),
|
|
907
|
+
__param(11, Inject(KERNEL_BUS)),
|
|
908
|
+
__param(12, Inject(KyselyCheckpointSaver)),
|
|
909
|
+
__param(13, Inject(Waits)),
|
|
910
|
+
__param(14, Inject(KernelEvents)),
|
|
911
|
+
__param(15, Inject(TitleQueue)),
|
|
912
|
+
__param(16, Inject(ProviderRegistry)),
|
|
913
|
+
__param(17, Inject(SkillsCatalogService)),
|
|
914
|
+
__param(18, Inject(ToolPipeline)),
|
|
915
|
+
__param(19, Inject(RunFinish)),
|
|
916
|
+
__param(20, Inject(TransactionHost)),
|
|
917
|
+
__param(21, Optional()),
|
|
918
|
+
__param(21, Inject(RUN_HOOKS))
|
|
919
|
+
], RunWorker);
|
|
920
|
+
export { RunWorker };
|