@capybara-hq/kernel 0.1.0-rc.0 → 0.1.0-rc.2
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 +10 -6
- 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 +179 -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 +261 -329
- package/dist/agents/definition.d.ts +8 -0
- package/dist/agents/definition.js +8 -0
- 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 +20 -4
- 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 +323 -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/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 +30 -13
- 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 +2 -2
- 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 -193
- 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 +16 -1
- package/dist/config/schema.js +54 -7
- package/dist/conversations/access.d.ts +29 -0
- package/dist/conversations/access.js +86 -0
- package/dist/conversations/artifacts.d.ts +10 -10
- package/dist/conversations/artifacts.js +35 -9
- 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 +28 -18
- package/dist/conversations/event-log.js +74 -27
- 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 -62
- 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/queue.js +3 -2
- package/dist/ctx/secrets.d.ts +10 -2
- package/dist/ctx/secrets.js +7 -3
- package/dist/db/kernel-schema.d.ts +2 -2
- package/dist/db/pool.d.ts +5 -0
- package/dist/db/pool.js +1 -0
- package/dist/errors.d.ts +2 -0
- package/dist/errors.js +2 -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/run-replay.d.ts +56 -8
- package/dist/evals/run-replay.js +140 -80
- 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.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 -120
- 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 +96 -42
- package/dist/extensions/bootstrap.js +303 -155
- 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 +52 -47
- 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 +85 -57
- 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 +19 -12
- package/dist/index.js +13 -8
- 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 -241
- 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 +451 -0
- package/dist/lifecycle/tokens.d.ts +3 -0
- package/dist/lifecycle/tokens.js +3 -0
- package/dist/log-config.d.ts +9 -0
- package/dist/log-config.js +27 -0
- package/dist/log-context.d.ts +34 -0
- package/dist/log-context.js +44 -0
- package/dist/log-loki.d.ts +34 -0
- package/dist/log-loki.js +145 -0
- package/dist/log.d.ts +41 -10
- package/dist/log.js +91 -17
- 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/net/public-address.js +3 -2
- 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 +14 -8
- package/dist/orgs/settings.service.js +75 -46
- 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/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 +7 -0
- 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 -136
- package/dist/runtime/model-call.d.ts +7 -4
- package/dist/runtime/model-call.js +24 -57
- 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 +26 -17
- 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 +121 -75
- package/dist/runtime/run-worker.js +340 -225
- 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 +4 -4
- package/dist/runtime/subagents/definition.js +2 -2
- package/dist/runtime/subagents/dispatch.d.ts +87 -6
- package/dist/runtime/subagents/dispatch.js +135 -140
- 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 +1 -1
- package/dist/runtime/subagents/progress.d.ts +2 -2
- package/dist/runtime/subagents/roster.d.ts +3 -3
- package/dist/runtime/subagents/roster.js +1 -1
- package/dist/runtime/subagents/skill-fork.d.ts +6 -7
- package/dist/runtime/subagents/skill-fork.js +16 -5
- 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 -99
- package/dist/runtime/waits.d.ts +125 -57
- package/dist/runtime/waits.js +431 -208
- 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 +33 -20
- package/dist/skills/catalog.js +96 -53
- package/dist/skills/changes.controller.d.ts +4 -4
- package/dist/skills/changes.controller.js +15 -9
- package/dist/skills/changes.service.d.ts +28 -18
- package/dist/skills/changes.service.js +421 -364
- package/dist/skills/invocable.controller.d.ts +1 -1
- package/dist/skills/invocable.controller.js +8 -5
- package/dist/skills/invoke.d.ts +16 -15
- package/dist/skills/invoke.js +48 -17
- 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 +27 -25
- package/dist/tools/approvals.service.js +324 -258
- package/dist/tools/breaker.d.ts +2 -2
- package/dist/tools/breaker.js +21 -3
- package/dist/tools/builtins/ask-user.d.ts +2 -2
- package/dist/tools/builtins/ask-user.js +1 -1
- 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 +2 -2
- package/dist/tools/builtins/read-tool-output.js +1 -1
- package/dist/tools/builtins/sandbox/bash.js +2 -2
- package/dist/tools/builtins/sandbox/common.d.ts +7 -4
- package/dist/tools/builtins/sandbox/common.js +5 -3
- package/dist/tools/builtins/sandbox/deliver.js +2 -2
- package/dist/tools/builtins/sandbox/edit.js +1 -1
- package/dist/tools/builtins/sandbox/glob.js +2 -2
- package/dist/tools/builtins/sandbox/grep.js +2 -2
- package/dist/tools/builtins/sandbox/read.js +1 -1
- package/dist/tools/builtins/sandbox/write.js +1 -1
- package/dist/tools/builtins/skill-load.d.ts +3 -3
- package/dist/tools/builtins/skill-load.js +1 -1
- 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 +434 -344
- package/dist/tools/credentials.d.ts +17 -20
- package/dist/tools/credentials.js +55 -34
- package/dist/tools/drift.d.ts +29 -41
- package/dist/tools/drift.js +111 -79
- package/dist/tools/info.d.ts +12 -9
- package/dist/tools/info.js +33 -7
- 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/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 +47 -3
- package/dist/tools/pipeline.d.ts +62 -46
- package/dist/tools/pipeline.js +145 -64
- package/dist/tools/policy.d.ts +2 -2
- package/dist/tools/questions.controller.d.ts +1 -1
- package/dist/tools/questions.controller.js +8 -5
- package/dist/tools/questions.service.d.ts +25 -24
- package/dist/tools/questions.service.js +201 -142
- package/dist/tools/registry.d.ts +30 -20
- package/dist/tools/registry.js +73 -37
- 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 +11 -2
- 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/http/{gateway.module.d.ts → gateway-routes.d.ts} +0 -0
- /package/dist/http/{gateway.module.js → gateway-routes.js} +0 -0
|
@@ -1,92 +1,82 @@
|
|
|
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
|
+
};
|
|
1
10
|
import { randomUUID } from "node:crypto";
|
|
2
|
-
import {
|
|
3
|
-
import { Redis } from "ioredis";
|
|
11
|
+
import { Inject, Injectable } from "@nestjs/common";
|
|
4
12
|
import { sql } from "kysely";
|
|
5
|
-
import { visibleTo } from "../agents/
|
|
13
|
+
import { visibleTo } from "../agents/agent-lookup.js";
|
|
14
|
+
import { EventLog } from "../conversations/event-log.js";
|
|
6
15
|
import { dispatchQueuedIn, pauseQueueWith } from "../conversations/queue.js";
|
|
7
|
-
import {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
export const runJobId = (conversationId, maxUserSeq) => `run-${conversationId}-${maxUserSeq}`;
|
|
19
|
-
/** 未结束的运行状态(waiting:等人处理审批 / 输入请求,没有任务、不占会话锁与配额)。 */
|
|
20
|
-
export const ACTIVE_RUN_STATUSES = ["queued", "running", "waiting"];
|
|
16
|
+
import { KernelDb } from "../infra/database/kernel-db.js";
|
|
17
|
+
import { TransactionHost } from "../infra/database/transaction-host.js";
|
|
18
|
+
import { Transactional } from "../infra/database/transactional.decorator.js";
|
|
19
|
+
import { KernelEvents } from "../infra/events/kernel-events.js";
|
|
20
|
+
import { KERNEL_LOGGER } from "../infra/tokens.js";
|
|
21
|
+
import { ToolPipeline } from "../tools/pipeline.js";
|
|
22
|
+
import { KyselyCheckpointSaver } from "./checkpointer.js";
|
|
23
|
+
import { ConversationLock } from "./conversation-lock.js";
|
|
24
|
+
import { notifyFinished, RunFinish } from "./run-finish.js";
|
|
25
|
+
import { ACTIVE_RUN_STATUSES, RunJobs, runJobId, runQueueNameFor, } from "./run-jobs.js";
|
|
26
|
+
export { ACTIVE_RUN_STATUSES, RUN_QUEUE_NAME, runJobId, runQueueNameFor, SUBAGENT_RUN_QUEUE_NAME, } from "./run-jobs.js";
|
|
21
27
|
/**
|
|
22
28
|
* queued 运行的宽限期(秒):`ensureRun` / 续跑先提交 runs 行、再投递任务,两步之间任务暂时不存在;
|
|
23
29
|
* 只有进入 queued 超过这么久(`COALESCE(queued_at, created_at)`)仍没有任务的 queued 行才视为孤儿。
|
|
24
30
|
*/
|
|
25
31
|
const ORPHAN_QUEUED_GRACE_SECONDS = 30;
|
|
26
|
-
/** BullMQ 连接要求 maxRetriesPerRequest 为 null(Worker 的阻塞连接);Queue 复用同样的配置。 */
|
|
27
|
-
export function bullConnection(redisUrl, log) {
|
|
28
|
-
const c = new Redis(redisUrl, { maxRetriesPerRequest: null });
|
|
29
|
-
c.on("error", (err) => log.error("run queue redis connection error", { err }));
|
|
30
|
-
return c;
|
|
31
|
-
}
|
|
32
32
|
/**
|
|
33
33
|
* 运行队列(生产方):`ensureRun` 在会话有未消费的用户消息、且没有进行中的运行时插入 `runs` 行并投递任务。
|
|
34
34
|
* 「是否已有运行」以 PG 为准(会话行锁内检查 `runs` 中的 queued / running),并参考会话锁的持有者;
|
|
35
35
|
* 多副本并发调用对同一会话串行化,同一时刻至多一个未结束的运行。
|
|
36
36
|
*/
|
|
37
|
-
|
|
38
|
-
|
|
37
|
+
let RunQueue = class RunQueue {
|
|
38
|
+
kdb;
|
|
39
39
|
eventLog;
|
|
40
40
|
lock;
|
|
41
|
-
|
|
42
|
-
|
|
41
|
+
jobs;
|
|
42
|
+
finisher;
|
|
43
43
|
checkpoints;
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
constructor(
|
|
44
|
+
pipeline;
|
|
45
|
+
events;
|
|
46
|
+
log;
|
|
47
|
+
txHost;
|
|
48
|
+
constructor(kdb, eventLog, lock, jobs, finisher,
|
|
49
49
|
/** 运行以孤儿结束(标记失败 / 直接中止)后删除它的 checkpoint thread(thread_id = runId)。 */
|
|
50
50
|
checkpoints,
|
|
51
|
-
/**
|
|
52
|
-
|
|
53
|
-
this.
|
|
51
|
+
/** The run's open `agent` call results, in the orphan repair's transaction (sub-agents spec §12). */
|
|
52
|
+
pipeline, events, log, txHost) {
|
|
53
|
+
this.kdb = kdb;
|
|
54
54
|
this.eventLog = eventLog;
|
|
55
55
|
this.lock = lock;
|
|
56
|
-
this.
|
|
57
|
-
this.
|
|
56
|
+
this.jobs = jobs;
|
|
57
|
+
this.finisher = finisher;
|
|
58
58
|
this.checkpoints = checkpoints;
|
|
59
|
-
this.
|
|
59
|
+
this.pipeline = pipeline;
|
|
60
|
+
this.events = events;
|
|
61
|
+
this.log = log;
|
|
62
|
+
this.txHost = txHost;
|
|
63
|
+
}
|
|
64
|
+
get db() {
|
|
65
|
+
return this.kdb.db;
|
|
60
66
|
}
|
|
61
67
|
/**
|
|
62
|
-
* The `beforeTerminal` of an orphan repair: writes the run's open `agent` call results in
|
|
63
|
-
* `fire()` runs their observe hooks after the commit (review m1).
|
|
68
|
+
* The `beforeTerminal` of an orphan repair: writes the run's open `agent` call results in the
|
|
69
|
+
* repair's transaction; `fire()` runs their observe hooks after the commit (review m1).
|
|
64
70
|
*/
|
|
65
71
|
stopOpenCalls(runId) {
|
|
66
|
-
const sub = this.subagents;
|
|
67
|
-
if (!sub)
|
|
68
|
-
return { fire: () => { } };
|
|
69
72
|
let fire = () => { };
|
|
70
73
|
return {
|
|
71
|
-
beforeTerminal: async (
|
|
72
|
-
fire = (await
|
|
74
|
+
beforeTerminal: async () => {
|
|
75
|
+
fire = (await this.pipeline.stopOpenAgentCalls(runId)).fire;
|
|
73
76
|
},
|
|
74
77
|
fire: () => fire(),
|
|
75
78
|
};
|
|
76
79
|
}
|
|
77
|
-
/** The BullMQ queue `name` (default: conversation runs); both share one connection. */
|
|
78
|
-
getQueue(name = RUN_QUEUE_NAME) {
|
|
79
|
-
if (this.closed)
|
|
80
|
-
throw new Error("run queue is closed");
|
|
81
|
-
let queue = this.queues.get(name);
|
|
82
|
-
if (!queue) {
|
|
83
|
-
this.conn ??= bullConnection(this.redisUrl, this.log);
|
|
84
|
-
queue = new Queue(name, { connection: this.conn });
|
|
85
|
-
queue.on("error", (err) => this.log.error("run queue error", { err, queue: name }));
|
|
86
|
-
this.queues.set(name, queue);
|
|
87
|
-
}
|
|
88
|
-
return queue;
|
|
89
|
-
}
|
|
90
80
|
/**
|
|
91
81
|
* 有未消费的用户消息(最新 user_message 的 seq > `consumed_seq`)、会话锁无人持有、
|
|
92
82
|
* 且没有 queued / running / waiting 的运行时:插入 `runs`(queued)并投递任务,返回 runId;否则返回 null。
|
|
@@ -102,152 +92,16 @@ export class RunQueue {
|
|
|
102
92
|
async ensureRun(conversationId) {
|
|
103
93
|
if ((await this.lock.holder(conversationId)) !== null)
|
|
104
94
|
return null;
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
.select(["consumed_seq", "agent_id", "kind", "queue_paused", "account_id"])
|
|
116
|
-
.where("id", "=", conversationId)
|
|
117
|
-
.forUpdate()
|
|
118
|
-
.executeTakeFirst();
|
|
119
|
-
// 评测回放的隐藏对话:运行由评测 worker 在里面直接驱动(工具只回放记录),绝不为它起真实运行
|
|
120
|
-
if (conv?.kind !== "chat")
|
|
121
|
-
return null;
|
|
122
|
-
let last = await t
|
|
123
|
-
.selectFrom("conversation_events")
|
|
124
|
-
.select(["seq", "payload"])
|
|
125
|
-
.where("conversation_id", "=", conversationId)
|
|
126
|
-
.where("type", "=", "user_message")
|
|
127
|
-
.orderBy("seq", "desc")
|
|
128
|
-
.limit(1)
|
|
129
|
-
.executeTakeFirst();
|
|
130
|
-
if (!last || Number(last.seq) <= Number(conv.consumed_seq)) {
|
|
131
|
-
// Nothing unconsumed: the queue's head goes out when the conversation is idle (no active
|
|
132
|
-
// run, which includes runs waiting for approval or an answer) and the queue is not paused.
|
|
133
|
-
// Interjections are always unconsumed messages, so the queue never jumps ahead of them.
|
|
134
|
-
if (conv.queue_paused || (await this.activeRun(t, conversationId)))
|
|
135
|
-
return null;
|
|
136
|
-
const owner = await t
|
|
137
|
-
.selectFrom("agents")
|
|
138
|
-
.select("deleted_at")
|
|
139
|
-
.where("id", "=", conv.agent_id)
|
|
140
|
-
.executeTakeFirstOrThrow();
|
|
141
|
-
if (owner.deleted_at !== null)
|
|
142
|
-
return null;
|
|
143
|
-
const head = await t
|
|
144
|
-
.selectFrom("conversation_queue")
|
|
145
|
-
.select("id")
|
|
146
|
-
.where("conversation_id", "=", conversationId)
|
|
147
|
-
.limit(1)
|
|
148
|
-
.executeTakeFirst();
|
|
149
|
-
if (!head)
|
|
150
|
-
return null;
|
|
151
|
-
// A queued message may wait for hours: it goes out only while its author can still use
|
|
152
|
-
// the conversation (active, a member, the agent visible to them; the isAccessible rule).
|
|
153
|
-
// Otherwise the queue pauses instead of posting as someone who lost access.
|
|
154
|
-
if (!(await authorCanSend(t, conversationId, conv.account_id))) {
|
|
155
|
-
await pauseQueueWith(t, conversationId, "author_cannot_send");
|
|
156
|
-
pausedNow = true;
|
|
157
|
-
this.log.warn("queued message not sent: its author can no longer use the conversation", {
|
|
158
|
-
conversationId,
|
|
159
|
-
});
|
|
160
|
-
return null;
|
|
161
|
-
}
|
|
162
|
-
const sent = await dispatchQueuedIn(t, this.eventLog, conversationId);
|
|
163
|
-
if (!sent)
|
|
164
|
-
return null;
|
|
165
|
-
if ("paused" in sent) {
|
|
166
|
-
pausedNow = true;
|
|
167
|
-
this.log.warn("queued skill invocation not sent: the skill can no longer be invoked", {
|
|
168
|
-
conversationId,
|
|
169
|
-
});
|
|
170
|
-
return null;
|
|
171
|
-
}
|
|
172
|
-
dispatchedSeq = sent.event.seq;
|
|
173
|
-
dispatchedSwitch = sent.switched;
|
|
174
|
-
last = { seq: String(sent.event.seq), payload: sent.event.payload };
|
|
175
|
-
}
|
|
176
|
-
const active = await this.activeRun(t, conversationId);
|
|
177
|
-
if (active) {
|
|
178
|
-
if (!(await this.isOrphan(conversationId, active, conv.kind)))
|
|
179
|
-
return null;
|
|
180
|
-
this.log.warn("marking orphaned run as failed", { conversationId, runId: active.id });
|
|
181
|
-
orphanRunId = active.id;
|
|
182
|
-
const stop = this.stopOpenCalls(active.id);
|
|
183
|
-
orphanStop = stop;
|
|
184
|
-
orphanSeq = await finishRunIn(t, this.eventLog, {
|
|
185
|
-
conversationId,
|
|
186
|
-
runId: active.id,
|
|
187
|
-
status: "failed",
|
|
188
|
-
consumed: null,
|
|
189
|
-
...(stop.beforeTerminal !== undefined && { beforeTerminal: stop.beforeTerminal }),
|
|
190
|
-
event: {
|
|
191
|
-
type: "run_failed",
|
|
192
|
-
payload: {
|
|
193
|
-
error: { code: "run.orphaned", message: "The run was lost and will not continue" },
|
|
194
|
-
},
|
|
195
|
-
},
|
|
196
|
-
});
|
|
197
|
-
// 孤儿运行的触发消息已被消费:之后没有更新的消息就不起新一轮。
|
|
198
|
-
if (Number(last.seq) <= Math.max(Number(conv.consumed_seq), Number(active.trigger_seq))) {
|
|
199
|
-
return null;
|
|
200
|
-
}
|
|
201
|
-
}
|
|
202
|
-
// what is consumed now (an orphan's failure consumed up to its trigger)
|
|
203
|
-
const consumedNow = Math.max(Number(conv.consumed_seq), orphanRunId !== null && active ? Number(active.trigger_seq) : 0);
|
|
204
|
-
// phase D run boundary: the first unconsumed fork invocation is the trigger of the run that
|
|
205
|
-
// absorbs it (`forkBoundary`); later messages wait for the next run
|
|
206
|
-
const fork = await t
|
|
207
|
-
.selectFrom("conversation_events")
|
|
208
|
-
.select(["seq", "payload"])
|
|
209
|
-
.where("conversation_id", "=", conversationId)
|
|
210
|
-
.where("type", "=", "user_message")
|
|
211
|
-
.where("seq", ">", String(consumedNow))
|
|
212
|
-
.where(sql `payload -> 'skill' ->> 'mode' = 'fork'`)
|
|
213
|
-
.orderBy("seq")
|
|
214
|
-
.limit(1)
|
|
215
|
-
.executeTakeFirst();
|
|
216
|
-
const trigger = fork ?? last;
|
|
217
|
-
// BullMQ 对重复的 jobId 静默忽略(add 返回的 Job 由调用方数据构造,看不出是否真的入队):
|
|
218
|
-
// 先显式查同一触发点的任务;仍存在(例如属于刚结束、尚未从队列移除的运行)就不插入 runs 行。
|
|
219
|
-
const jobId = runJobId(conversationId, Number(trigger.seq));
|
|
220
|
-
const existing = await this.getQueue().getJob(jobId);
|
|
221
|
-
if (existing) {
|
|
222
|
-
this.log.warn("run job for this trigger already exists; not enqueuing", {
|
|
223
|
-
conversationId,
|
|
224
|
-
jobId,
|
|
225
|
-
existingRunId: existing.data?.runId,
|
|
226
|
-
});
|
|
227
|
-
return null;
|
|
228
|
-
}
|
|
229
|
-
const agent = await t
|
|
230
|
-
.selectFrom("agents")
|
|
231
|
-
.select(["current_version", "deleted_at"])
|
|
232
|
-
.where("id", "=", conv.agent_id)
|
|
233
|
-
.executeTakeFirstOrThrow();
|
|
234
|
-
// agent 已软删除:会话对任何人都不可见,不再为它起运行。
|
|
235
|
-
if (agent.deleted_at !== null)
|
|
236
|
-
return null;
|
|
237
|
-
const runId = randomUUID();
|
|
238
|
-
await t
|
|
239
|
-
.insertInto("runs")
|
|
240
|
-
.values({
|
|
241
|
-
id: runId,
|
|
242
|
-
conversation_id: conversationId,
|
|
243
|
-
status: "queued",
|
|
244
|
-
agent_version: agent.current_version,
|
|
245
|
-
trigger_account_id: trigger.payload.authorAccountId,
|
|
246
|
-
trigger_seq: Number(trigger.seq),
|
|
247
|
-
})
|
|
248
|
-
.execute();
|
|
249
|
-
return { runId, jobId };
|
|
250
|
-
});
|
|
95
|
+
const st = {
|
|
96
|
+
orphanSeq: null,
|
|
97
|
+
orphanRunId: null,
|
|
98
|
+
dispatchedSeq: null,
|
|
99
|
+
dispatchedSwitch: false,
|
|
100
|
+
pausedNow: false,
|
|
101
|
+
orphanStop: undefined,
|
|
102
|
+
};
|
|
103
|
+
const created = await this.ensureRunIn(conversationId, st);
|
|
104
|
+
const { orphanSeq, orphanRunId, dispatchedSeq, dispatchedSwitch, pausedNow, orphanStop } = st;
|
|
251
105
|
if (orphanSeq !== null) {
|
|
252
106
|
await notifyFinished(this.eventLog, conversationId, orphanSeq, "failed");
|
|
253
107
|
orphanStop?.fire();
|
|
@@ -265,18 +119,15 @@ export class RunQueue {
|
|
|
265
119
|
await this.dropCheckpoints(orphanRunId);
|
|
266
120
|
// a lost parent stops its children now, not at the next sweep (review m2)
|
|
267
121
|
if (orphanSeq !== null) {
|
|
268
|
-
await this.
|
|
269
|
-
runId: orphanRunId,
|
|
270
|
-
err,
|
|
271
|
-
}));
|
|
122
|
+
await this.events.emit("run.orphaned", { runId: orphanRunId });
|
|
272
123
|
}
|
|
273
124
|
}
|
|
274
125
|
if (!created)
|
|
275
126
|
return null;
|
|
276
127
|
const { runId, jobId } = created;
|
|
277
128
|
try {
|
|
278
|
-
const queue = this.
|
|
279
|
-
await
|
|
129
|
+
const queue = this.jobs.queue();
|
|
130
|
+
await this.jobs.add({ runId, conversationId }, jobId);
|
|
280
131
|
// 从 Redis 读回核对:检查与 add 之间出现了同 jobId 的任务时 add 被静默忽略,撤销本次插入,
|
|
281
132
|
// 不留下没有任务的 queued 行。读不到说明任务已被领取并移除(只可能是本次投递的),不撤销。
|
|
282
133
|
const stored = await queue.getJob(jobId);
|
|
@@ -297,25 +148,153 @@ export class RunQueue {
|
|
|
297
148
|
}
|
|
298
149
|
return runId;
|
|
299
150
|
}
|
|
151
|
+
/** {@link ensureRun}'s transaction: what it decided goes back through `st`. */
|
|
152
|
+
async ensureRunIn(conversationId, st) {
|
|
153
|
+
const t = this.db;
|
|
154
|
+
const conv = await t
|
|
155
|
+
.selectFrom("conversations")
|
|
156
|
+
.select(["consumed_seq", "agent_id", "kind", "queue_paused", "account_id"])
|
|
157
|
+
.where("id", "=", conversationId)
|
|
158
|
+
.forUpdate()
|
|
159
|
+
.executeTakeFirst();
|
|
160
|
+
// 评测回放的隐藏对话:运行由评测 worker 在里面直接驱动(工具只回放记录),绝不为它起真实运行
|
|
161
|
+
if (conv?.kind !== "chat")
|
|
162
|
+
return null;
|
|
163
|
+
let last = await t
|
|
164
|
+
.selectFrom("conversation_events")
|
|
165
|
+
.select(["seq", "payload"])
|
|
166
|
+
.where("conversation_id", "=", conversationId)
|
|
167
|
+
.where("type", "=", "user_message")
|
|
168
|
+
.orderBy("seq", "desc")
|
|
169
|
+
.limit(1)
|
|
170
|
+
.executeTakeFirst();
|
|
171
|
+
if (!last || Number(last.seq) <= Number(conv.consumed_seq)) {
|
|
172
|
+
// Nothing unconsumed: the queue's head goes out when the conversation is idle (no active
|
|
173
|
+
// run, which includes runs waiting for approval or an answer) and the queue is not paused.
|
|
174
|
+
// Interjections are always unconsumed messages, so the queue never jumps ahead of them.
|
|
175
|
+
if (conv.queue_paused || (await this.activeRun(t, conversationId)))
|
|
176
|
+
return null;
|
|
177
|
+
const owner = await t
|
|
178
|
+
.selectFrom("agents")
|
|
179
|
+
.select("deleted_at")
|
|
180
|
+
.where("id", "=", conv.agent_id)
|
|
181
|
+
.executeTakeFirstOrThrow();
|
|
182
|
+
if (owner.deleted_at !== null)
|
|
183
|
+
return null;
|
|
184
|
+
const head = await t
|
|
185
|
+
.selectFrom("conversation_queue")
|
|
186
|
+
.select("id")
|
|
187
|
+
.where("conversation_id", "=", conversationId)
|
|
188
|
+
.limit(1)
|
|
189
|
+
.executeTakeFirst();
|
|
190
|
+
if (!head)
|
|
191
|
+
return null;
|
|
192
|
+
// A queued message may wait for hours: it goes out only while its author can still use
|
|
193
|
+
// the conversation (active, a member, the agent visible to them; the isAccessible rule).
|
|
194
|
+
// Otherwise the queue pauses instead of posting as someone who lost access.
|
|
195
|
+
if (!(await authorCanSend(t, conversationId, conv.account_id))) {
|
|
196
|
+
await pauseQueueWith(t, conversationId, "author_cannot_send");
|
|
197
|
+
st.pausedNow = true;
|
|
198
|
+
this.log.warn("queued message not sent: its author can no longer use the conversation", {
|
|
199
|
+
conversationId,
|
|
200
|
+
});
|
|
201
|
+
return null;
|
|
202
|
+
}
|
|
203
|
+
const sent = await dispatchQueuedIn(t, this.eventLog, conversationId);
|
|
204
|
+
if (!sent)
|
|
205
|
+
return null;
|
|
206
|
+
if ("paused" in sent) {
|
|
207
|
+
st.pausedNow = true;
|
|
208
|
+
this.log.warn("queued skill invocation not sent: the skill can no longer be invoked", {
|
|
209
|
+
conversationId,
|
|
210
|
+
});
|
|
211
|
+
return null;
|
|
212
|
+
}
|
|
213
|
+
st.dispatchedSeq = sent.event.seq;
|
|
214
|
+
st.dispatchedSwitch = sent.switched;
|
|
215
|
+
last = { seq: String(sent.event.seq), payload: sent.event.payload };
|
|
216
|
+
}
|
|
217
|
+
const active = await this.activeRun(t, conversationId);
|
|
218
|
+
if (active) {
|
|
219
|
+
if (!(await this.isOrphan(conversationId, active, conv.kind)))
|
|
220
|
+
return null;
|
|
221
|
+
this.log.warn("marking orphaned run as failed", { conversationId, runId: active.id });
|
|
222
|
+
st.orphanRunId = active.id;
|
|
223
|
+
const stop = this.stopOpenCalls(active.id);
|
|
224
|
+
st.orphanStop = stop;
|
|
225
|
+
st.orphanSeq = await this.finisher.finishIn({
|
|
226
|
+
conversationId,
|
|
227
|
+
runId: active.id,
|
|
228
|
+
status: "failed",
|
|
229
|
+
consumed: null,
|
|
230
|
+
...(stop.beforeTerminal !== undefined && { beforeTerminal: stop.beforeTerminal }),
|
|
231
|
+
event: {
|
|
232
|
+
type: "run_failed",
|
|
233
|
+
payload: {
|
|
234
|
+
error: { code: "run.orphaned", message: "The run was lost and will not continue" },
|
|
235
|
+
},
|
|
236
|
+
},
|
|
237
|
+
});
|
|
238
|
+
// 孤儿运行的触发消息已被消费:之后没有更新的消息就不起新一轮。
|
|
239
|
+
if (Number(last.seq) <= Math.max(Number(conv.consumed_seq), Number(active.trigger_seq))) {
|
|
240
|
+
return null;
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
// what is consumed now (an orphan's failure consumed up to its trigger)
|
|
244
|
+
const consumedNow = Math.max(Number(conv.consumed_seq), st.orphanRunId !== null && active ? Number(active.trigger_seq) : 0);
|
|
245
|
+
// phase D run boundary: the first unconsumed fork invocation is the trigger of the run that
|
|
246
|
+
// absorbs it (`forkBoundary`); later messages wait for the next run
|
|
247
|
+
const fork = await t
|
|
248
|
+
.selectFrom("conversation_events")
|
|
249
|
+
.select(["seq", "payload"])
|
|
250
|
+
.where("conversation_id", "=", conversationId)
|
|
251
|
+
.where("type", "=", "user_message")
|
|
252
|
+
.where("seq", ">", String(consumedNow))
|
|
253
|
+
.where(sql `payload -> 'skill' ->> 'mode' = 'fork'`)
|
|
254
|
+
.orderBy("seq")
|
|
255
|
+
.limit(1)
|
|
256
|
+
.executeTakeFirst();
|
|
257
|
+
const trigger = fork ?? last;
|
|
258
|
+
// BullMQ 对重复的 jobId 静默忽略(add 返回的 Job 由调用方数据构造,看不出是否真的入队):
|
|
259
|
+
// 先显式查同一触发点的任务;仍存在(例如属于刚结束、尚未从队列移除的运行)就不插入 runs 行。
|
|
260
|
+
const jobId = runJobId(conversationId, Number(trigger.seq));
|
|
261
|
+
const existing = await this.jobs.getJob(jobId);
|
|
262
|
+
if (existing) {
|
|
263
|
+
this.log.warn("run job for this trigger already exists; not enqueuing", {
|
|
264
|
+
conversationId,
|
|
265
|
+
jobId,
|
|
266
|
+
existingRunId: existing.data?.runId,
|
|
267
|
+
});
|
|
268
|
+
return null;
|
|
269
|
+
}
|
|
270
|
+
const agent = await t
|
|
271
|
+
.selectFrom("agents")
|
|
272
|
+
.select(["current_version", "deleted_at"])
|
|
273
|
+
.where("id", "=", conv.agent_id)
|
|
274
|
+
.executeTakeFirstOrThrow();
|
|
275
|
+
// agent 已软删除:会话对任何人都不可见,不再为它起运行。
|
|
276
|
+
if (agent.deleted_at !== null)
|
|
277
|
+
return null;
|
|
278
|
+
const runId = randomUUID();
|
|
279
|
+
await t
|
|
280
|
+
.insertInto("runs")
|
|
281
|
+
.values({
|
|
282
|
+
id: runId,
|
|
283
|
+
conversation_id: conversationId,
|
|
284
|
+
status: "queued",
|
|
285
|
+
agent_version: agent.current_version,
|
|
286
|
+
trigger_account_id: trigger.payload.authorAccountId,
|
|
287
|
+
trigger_seq: Number(trigger.seq),
|
|
288
|
+
})
|
|
289
|
+
.execute();
|
|
290
|
+
return { runId, jobId };
|
|
291
|
+
}
|
|
300
292
|
/**
|
|
301
293
|
* Enqueues a run job under the caller's job id (resumes, dispatches, repairs), with the same
|
|
302
|
-
* options as {@link ensureRun}
|
|
303
|
-
* to {@link SUBAGENT_RUN_QUEUE_NAME}); pass `kind` when the caller knows it, else it is read.
|
|
294
|
+
* options as {@link ensureRun} (see {@link RunJobs.enqueue}).
|
|
304
295
|
*/
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
(await this.db
|
|
308
|
-
.selectFrom("conversations")
|
|
309
|
-
.select("kind")
|
|
310
|
-
.where("id", "=", data.conversationId)
|
|
311
|
-
.executeTakeFirst())?.kind ??
|
|
312
|
-
"chat";
|
|
313
|
-
await this.getQueue(runQueueNameFor(k)).add("run", data, {
|
|
314
|
-
jobId,
|
|
315
|
-
attempts: 1,
|
|
316
|
-
removeOnComplete: true,
|
|
317
|
-
removeOnFail: true,
|
|
318
|
-
});
|
|
296
|
+
enqueue(data, jobId, kind) {
|
|
297
|
+
return this.jobs.enqueue(data, jobId, kind);
|
|
319
298
|
}
|
|
320
299
|
/**
|
|
321
300
|
* 中止一个孤儿运行(`POST .../abort` 用):运行仍是 queued / running、会话锁无人持有、BullMQ 任务已不存在
|
|
@@ -327,31 +306,7 @@ export class RunQueue {
|
|
|
327
306
|
if ((await this.lock.holder(conversationId)) !== null)
|
|
328
307
|
return false;
|
|
329
308
|
const stop = this.stopOpenCalls(runId);
|
|
330
|
-
const toSeq = await this.
|
|
331
|
-
const conv = await t
|
|
332
|
-
.selectFrom("conversations")
|
|
333
|
-
.select("kind")
|
|
334
|
-
.where("id", "=", conversationId)
|
|
335
|
-
.forUpdate()
|
|
336
|
-
.executeTakeFirst();
|
|
337
|
-
const active = await this.activeRun(t, conversationId);
|
|
338
|
-
if (!conv || !active || active.id !== runId)
|
|
339
|
-
return null;
|
|
340
|
-
if (!(await this.isOrphan(conversationId, active, conv.kind)))
|
|
341
|
-
return null;
|
|
342
|
-
this.log.warn("aborting orphaned run directly", { conversationId, runId });
|
|
343
|
-
return finishRunIn(t, this.eventLog, {
|
|
344
|
-
conversationId,
|
|
345
|
-
runId,
|
|
346
|
-
status: "aborted",
|
|
347
|
-
consumed: null,
|
|
348
|
-
...(stop.beforeTerminal !== undefined && { beforeTerminal: stop.beforeTerminal }),
|
|
349
|
-
event: {
|
|
350
|
-
type: "run_aborted",
|
|
351
|
-
payload: { byAccountId, reason: "user", ...(detail !== undefined && { detail }) },
|
|
352
|
-
},
|
|
353
|
-
});
|
|
354
|
-
});
|
|
309
|
+
const toSeq = await this.abortOrphanIn(conversationId, runId, byAccountId, detail, stop);
|
|
355
310
|
if (toSeq === null)
|
|
356
311
|
return false;
|
|
357
312
|
await notifyFinished(this.eventLog, conversationId, toSeq, "aborted");
|
|
@@ -359,6 +314,32 @@ export class RunQueue {
|
|
|
359
314
|
await this.dropCheckpoints(runId);
|
|
360
315
|
return true;
|
|
361
316
|
}
|
|
317
|
+
async abortOrphanIn(conversationId, runId, byAccountId, detail, stop) {
|
|
318
|
+
const t = this.db;
|
|
319
|
+
const conv = await t
|
|
320
|
+
.selectFrom("conversations")
|
|
321
|
+
.select("kind")
|
|
322
|
+
.where("id", "=", conversationId)
|
|
323
|
+
.forUpdate()
|
|
324
|
+
.executeTakeFirst();
|
|
325
|
+
const active = await this.activeRun(t, conversationId);
|
|
326
|
+
if (!conv || !active || active.id !== runId)
|
|
327
|
+
return null;
|
|
328
|
+
if (!(await this.isOrphan(conversationId, active, conv.kind)))
|
|
329
|
+
return null;
|
|
330
|
+
this.log.warn("aborting orphaned run directly", { conversationId, runId });
|
|
331
|
+
return this.finisher.finishIn({
|
|
332
|
+
conversationId,
|
|
333
|
+
runId,
|
|
334
|
+
status: "aborted",
|
|
335
|
+
consumed: null,
|
|
336
|
+
beforeTerminal: stop.beforeTerminal,
|
|
337
|
+
event: {
|
|
338
|
+
type: "run_aborted",
|
|
339
|
+
payload: { byAccountId, reason: "user", ...(detail !== undefined && { detail }) },
|
|
340
|
+
},
|
|
341
|
+
});
|
|
342
|
+
}
|
|
362
343
|
/**
|
|
363
344
|
* Repairs an orphaned run of a conversation nobody else repairs on demand (a sub-agent's: no
|
|
364
345
|
* `ensureRun` ever runs for it; sub-agents spec §7.5), with the same orphan test as
|
|
@@ -374,37 +355,7 @@ export class RunQueue {
|
|
|
374
355
|
async repairOrphan(conversationId, runId) {
|
|
375
356
|
if ((await this.lock.holder(conversationId)) !== null)
|
|
376
357
|
return null;
|
|
377
|
-
const r = await this.
|
|
378
|
-
const conv = await t
|
|
379
|
-
.selectFrom("conversations")
|
|
380
|
-
.select("kind")
|
|
381
|
-
.where("id", "=", conversationId)
|
|
382
|
-
.forUpdate()
|
|
383
|
-
.executeTakeFirst();
|
|
384
|
-
const active = await this.activeRun(t, conversationId);
|
|
385
|
-
if (!conv || !active || active.id !== runId)
|
|
386
|
-
return null;
|
|
387
|
-
if (!(await this.isOrphan(conversationId, active, conv.kind)))
|
|
388
|
-
return null;
|
|
389
|
-
if (active.status === "queued") {
|
|
390
|
-
const jobId = active.job_id ?? runJobId(conversationId, Number(active.trigger_seq));
|
|
391
|
-
return { kind: "requeued", jobId, convKind: conv.kind };
|
|
392
|
-
}
|
|
393
|
-
this.log.warn("marking orphaned run as failed", { conversationId, runId });
|
|
394
|
-
const seq = await finishRunIn(t, this.eventLog, {
|
|
395
|
-
conversationId,
|
|
396
|
-
runId,
|
|
397
|
-
status: "failed",
|
|
398
|
-
consumed: null,
|
|
399
|
-
event: {
|
|
400
|
-
type: "run_failed",
|
|
401
|
-
payload: {
|
|
402
|
-
error: { code: "run.orphaned", message: "The run was lost and will not continue" },
|
|
403
|
-
},
|
|
404
|
-
},
|
|
405
|
-
});
|
|
406
|
-
return { kind: "failed", seq };
|
|
407
|
-
});
|
|
358
|
+
const r = await this.repairOrphanIn(conversationId, runId);
|
|
408
359
|
if (!r)
|
|
409
360
|
return null;
|
|
410
361
|
if (r.kind === "requeued") {
|
|
@@ -416,6 +367,38 @@ export class RunQueue {
|
|
|
416
367
|
await this.dropCheckpoints(runId);
|
|
417
368
|
return "failed";
|
|
418
369
|
}
|
|
370
|
+
async repairOrphanIn(conversationId, runId) {
|
|
371
|
+
const t = this.db;
|
|
372
|
+
const conv = await t
|
|
373
|
+
.selectFrom("conversations")
|
|
374
|
+
.select("kind")
|
|
375
|
+
.where("id", "=", conversationId)
|
|
376
|
+
.forUpdate()
|
|
377
|
+
.executeTakeFirst();
|
|
378
|
+
const active = await this.activeRun(t, conversationId);
|
|
379
|
+
if (!conv || !active || active.id !== runId)
|
|
380
|
+
return null;
|
|
381
|
+
if (!(await this.isOrphan(conversationId, active, conv.kind)))
|
|
382
|
+
return null;
|
|
383
|
+
if (active.status === "queued") {
|
|
384
|
+
const jobId = active.job_id ?? runJobId(conversationId, Number(active.trigger_seq));
|
|
385
|
+
return { kind: "requeued", jobId, convKind: conv.kind };
|
|
386
|
+
}
|
|
387
|
+
this.log.warn("marking orphaned run as failed", { conversationId, runId });
|
|
388
|
+
const seq = await this.finisher.finishIn({
|
|
389
|
+
conversationId,
|
|
390
|
+
runId,
|
|
391
|
+
status: "failed",
|
|
392
|
+
consumed: null,
|
|
393
|
+
event: {
|
|
394
|
+
type: "run_failed",
|
|
395
|
+
payload: {
|
|
396
|
+
error: { code: "run.orphaned", message: "The run was lost and will not continue" },
|
|
397
|
+
},
|
|
398
|
+
},
|
|
399
|
+
});
|
|
400
|
+
return { kind: "failed", seq };
|
|
401
|
+
}
|
|
419
402
|
/** 会话当前未结束的运行(调用方已持有会话行锁)。 */
|
|
420
403
|
activeRun(t, conversationId) {
|
|
421
404
|
return t
|
|
@@ -442,13 +425,13 @@ export class RunQueue {
|
|
|
442
425
|
if (active.status === "queued" && !active.past_grace)
|
|
443
426
|
return false;
|
|
444
427
|
const jobId = active.job_id ?? runJobId(conversationId, Number(active.trigger_seq));
|
|
445
|
-
const job = await this.
|
|
428
|
+
const job = await this.jobs.getJob(jobId, runQueueNameFor(kind));
|
|
446
429
|
return !job;
|
|
447
430
|
}
|
|
448
431
|
/** 删除已结束运行的 checkpoint thread(失败只记日志)。 */
|
|
449
432
|
async dropCheckpoints(runId) {
|
|
450
433
|
await this.checkpoints
|
|
451
|
-
|
|
434
|
+
.deleteThread(runId)
|
|
452
435
|
.catch((err) => this.log.warn("checkpoint delete failed", { runId, err }));
|
|
453
436
|
}
|
|
454
437
|
async deleteQueued(runId) {
|
|
@@ -458,17 +441,30 @@ export class RunQueue {
|
|
|
458
441
|
.where("status", "=", "queued")
|
|
459
442
|
.execute();
|
|
460
443
|
}
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
444
|
+
};
|
|
445
|
+
__decorate([
|
|
446
|
+
Transactional({ propagation: "requires_new" })
|
|
447
|
+
], RunQueue.prototype, "ensureRunIn", null);
|
|
448
|
+
__decorate([
|
|
449
|
+
Transactional({ propagation: "requires_new" })
|
|
450
|
+
], RunQueue.prototype, "abortOrphanIn", null);
|
|
451
|
+
__decorate([
|
|
452
|
+
Transactional({ propagation: "requires_new" })
|
|
453
|
+
], RunQueue.prototype, "repairOrphanIn", null);
|
|
454
|
+
RunQueue = __decorate([
|
|
455
|
+
Injectable(),
|
|
456
|
+
__param(0, Inject(KernelDb)),
|
|
457
|
+
__param(1, Inject(EventLog)),
|
|
458
|
+
__param(2, Inject(ConversationLock)),
|
|
459
|
+
__param(3, Inject(RunJobs)),
|
|
460
|
+
__param(4, Inject(RunFinish)),
|
|
461
|
+
__param(5, Inject(KyselyCheckpointSaver)),
|
|
462
|
+
__param(6, Inject(ToolPipeline)),
|
|
463
|
+
__param(7, Inject(KernelEvents)),
|
|
464
|
+
__param(8, Inject(KERNEL_LOGGER)),
|
|
465
|
+
__param(9, Inject(TransactionHost))
|
|
466
|
+
], RunQueue);
|
|
467
|
+
export { RunQueue };
|
|
472
468
|
/** The conversation's owner is active and can still see its agent (`isAccessible`'s rule). */
|
|
473
469
|
async function authorCanSend(t, conversationId, accountId) {
|
|
474
470
|
const row = await t
|