@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,20 +1,39 @@
|
|
|
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 { assertValidDeclarations, EFFORT_VALUES, parseExtensionPoint, } from "@capybara-hq/plugin-sdk";
|
|
11
|
+
import { Inject, Injectable, Module, Optional } from "@nestjs/common";
|
|
2
12
|
import { ApiError } from "../errors.js";
|
|
13
|
+
import { ExtensionRegistry, ExtensionRegistryModule } from "../extensions/registry.js";
|
|
14
|
+
import { CacheService } from "../infra/cache/cache.service.js";
|
|
15
|
+
import { Cacheable } from "../infra/cache/cacheable.decorator.js";
|
|
16
|
+
import { KERNEL_LOGGER, REDIS } from "../infra/tokens.js";
|
|
3
17
|
/** 供应商模型列表在 Redis 中的缓存时长(秒)。 */
|
|
4
18
|
const MODELS_TTL_SECONDS = 600;
|
|
5
19
|
/** 单个供应商 `listModels()` 的时限(毫秒):一个卡住的供应商不拖住整个列表与解析。 */
|
|
6
20
|
export const LIST_MODELS_TIMEOUT_MS = 10_000;
|
|
21
|
+
/** Optional provider: the `listModels()` time limit (ms) instead of {@link LIST_MODELS_TIMEOUT_MS} (tests). */
|
|
22
|
+
export const LIST_MODELS_TIMEOUT = Symbol("LIST_MODELS_TIMEOUT");
|
|
7
23
|
/**
|
|
8
24
|
* 列表视图(后台模型页、组织模型页)里列模型失败的供应商在这么多秒内直接标 error、不再请求(Redis,多副本共享)。
|
|
9
25
|
* 只用于列表;`resolve`(运行时)照常每次请求,失败由降级梯子重试。
|
|
10
26
|
*/
|
|
11
27
|
export const LIST_FAILURE_TTL_SECONDS = 15;
|
|
12
28
|
/**
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
29
|
+
* The model list's cache key (`@Cacheable` stores it as `cache:<key>`). It carries the provider's
|
|
30
|
+
* contract major: after a plugin moves from `@1` to `@2` it never reads the list written through
|
|
31
|
+
* the `@1` adapter (both are `@2`-shaped, the shape cannot tell them apart). It also carries the
|
|
32
|
+
* plugin version and the deployment config digest: after an upgrade (the parameter declarations may
|
|
33
|
+
* have changed) or a deployment config change (models added or removed) every replica validates
|
|
34
|
+
* the new declarations at once instead of waiting for the old entry's TTL. The digest is only a
|
|
35
|
+
* hash, never config text (no secret in the key). Old keys expire by TTL. Entries without a
|
|
36
|
+
* version / digest (test doubles) use `-`.
|
|
18
37
|
*/
|
|
19
38
|
const modelsKey = (p) => `capk:models:${p.plugin}:v${p.major}:${p.version ?? "-"}:${p.configHash ?? "-"}`;
|
|
20
39
|
/** 列表视图的失败标记({@link LIST_FAILURE_TTL_SECONDS}),与模型列表同样按版本与配置摘要区分。 */
|
|
@@ -71,31 +90,33 @@ export function adaptModelProviderV1(impl) {
|
|
|
71
90
|
},
|
|
72
91
|
};
|
|
73
92
|
}
|
|
74
|
-
/** 缓存里的条目必须是 `@2` 形状(旧版本内核写入的 `@1` 原始结果没有 `parameters`,视为未命中)。 */
|
|
75
|
-
const isCurrentShape = (models) => Array.isArray(models) &&
|
|
76
|
-
models.every((m) => typeof m === "object" && m !== null && Array.isArray(m.parameters));
|
|
77
93
|
/**
|
|
78
94
|
* 模型供应商注册表:供应商即提供 `model-provider` 能力的插件(以插件名为供应商名)。
|
|
79
95
|
* 同时支持 `model-provider@1`(经 {@link adaptModelProviderV1} 适配)与 `@2`;
|
|
80
96
|
* 同一插件两者都提供时用 `@2`。`@2` 的 `listModels()` 结果先过 `assertValidDeclarations`,
|
|
81
97
|
* 不合规的供应商不可用(不可重试)。
|
|
82
|
-
*
|
|
83
|
-
*
|
|
98
|
+
* Each provider's model list (`@2`-shaped) is cached in Redis (`@Cacheable`, key
|
|
99
|
+
* `cache:capk:models:<provider>:v<major>:<plugin version>:<config digest>`, 600 s), never in
|
|
100
|
+
* process memory: every replica shares it.
|
|
84
101
|
*/
|
|
85
|
-
|
|
102
|
+
let ProviderRegistry = class ProviderRegistry {
|
|
86
103
|
host;
|
|
104
|
+
cacheService;
|
|
87
105
|
kv;
|
|
88
106
|
log;
|
|
89
|
-
|
|
90
|
-
constructor(host, kv, log,
|
|
107
|
+
listTimeoutMs;
|
|
108
|
+
constructor(host, cacheService, kv, log,
|
|
109
|
+
/** The `listModels()` time limit. */
|
|
110
|
+
listTimeoutMs = LIST_MODELS_TIMEOUT_MS) {
|
|
91
111
|
this.host = host;
|
|
112
|
+
this.cacheService = cacheService;
|
|
92
113
|
this.kv = kv;
|
|
93
114
|
this.log = log;
|
|
94
|
-
this.
|
|
115
|
+
this.listTimeoutMs = listTimeoutMs;
|
|
95
116
|
}
|
|
96
117
|
/** `listModels()` 加时限(到时按失败处理,供应商的调用留在后台、结果丢弃)。 */
|
|
97
118
|
async listModelsWithTimeout(impl) {
|
|
98
|
-
const ms = this.
|
|
119
|
+
const ms = this.listTimeoutMs;
|
|
99
120
|
let timer;
|
|
100
121
|
const call = Promise.resolve().then(() => impl.listModels());
|
|
101
122
|
call.catch(() => { });
|
|
@@ -141,15 +162,12 @@ export class ProviderRegistry {
|
|
|
141
162
|
impl: major === 2 ? impl : adaptModelProviderV1(impl),
|
|
142
163
|
}));
|
|
143
164
|
}
|
|
144
|
-
|
|
165
|
+
models(p) {
|
|
166
|
+
return this.validatedModels(modelsKey(p), p);
|
|
167
|
+
}
|
|
168
|
+
/** The provider's validated model list, cached under `key` (see {@link modelsKey}). */
|
|
169
|
+
async validatedModels(_key, p) {
|
|
145
170
|
const { plugin: provider, major, impl } = p;
|
|
146
|
-
const key = modelsKey(p);
|
|
147
|
-
const cached = await this.kv.get(key);
|
|
148
|
-
if (cached !== null) {
|
|
149
|
-
const parsed = JSON.parse(cached);
|
|
150
|
-
if (isCurrentShape(parsed))
|
|
151
|
-
return parsed;
|
|
152
|
-
}
|
|
153
171
|
let models;
|
|
154
172
|
try {
|
|
155
173
|
models = await this.listModelsWithTimeout(impl);
|
|
@@ -168,7 +186,6 @@ export class ProviderRegistry {
|
|
|
168
186
|
throw e;
|
|
169
187
|
}
|
|
170
188
|
}
|
|
171
|
-
await this.kv.set(key, JSON.stringify(models), "EX", MODELS_TTL_SECONDS);
|
|
172
189
|
return models;
|
|
173
190
|
}
|
|
174
191
|
/** 每个已安装供应商及其模型(按插件加载顺序);列模型失败或声明不合规的供应商跳过并记 warn。 */
|
|
@@ -221,4 +238,28 @@ export class ProviderRegistry {
|
|
|
221
238
|
}
|
|
222
239
|
return { provider: p.impl, info };
|
|
223
240
|
}
|
|
224
|
-
}
|
|
241
|
+
};
|
|
242
|
+
__decorate([
|
|
243
|
+
Cacheable({ key: "#{0}", ttl: MODELS_TTL_SECONDS })
|
|
244
|
+
], ProviderRegistry.prototype, "validatedModels", null);
|
|
245
|
+
ProviderRegistry = __decorate([
|
|
246
|
+
Injectable(),
|
|
247
|
+
__param(0, Inject(ExtensionRegistry)),
|
|
248
|
+
__param(1, Inject(CacheService)),
|
|
249
|
+
__param(2, Inject(REDIS)),
|
|
250
|
+
__param(3, Inject(KERNEL_LOGGER)),
|
|
251
|
+
__param(4, Optional()),
|
|
252
|
+
__param(4, Inject(LIST_MODELS_TIMEOUT))
|
|
253
|
+
], ProviderRegistry);
|
|
254
|
+
export { ProviderRegistry };
|
|
255
|
+
/** The model provider registry (one instance; the models and agents domains read it). */
|
|
256
|
+
let ProvidersModule = class ProvidersModule {
|
|
257
|
+
};
|
|
258
|
+
ProvidersModule = __decorate([
|
|
259
|
+
Module({
|
|
260
|
+
imports: [ExtensionRegistryModule],
|
|
261
|
+
providers: [ProviderRegistry],
|
|
262
|
+
exports: [ProviderRegistry],
|
|
263
|
+
})
|
|
264
|
+
], ProvidersModule);
|
|
265
|
+
export { ProvidersModule };
|
package/dist/runtime/quota.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { Redis } from "ioredis";
|
|
2
|
-
import type { KernelConfig } from "../config/schema.js";
|
|
3
2
|
import type { SettingsService } from "../identity/settings.js";
|
|
3
|
+
import type { KernelConfigService } from "../infra/config/kernel-config.service.js";
|
|
4
|
+
import type { LeaseHandle, LockService } from "../infra/lock/lock.service.js";
|
|
4
5
|
/** 组织配额租约的默认时长(毫秒):持有方每 `leaseMs / 3` 续租一次。 */
|
|
5
6
|
export declare const ORG_QUOTA_LEASE_MS = 60000;
|
|
6
7
|
/** 运行配额的键前缀(`capk:org-runs:<orgId>`);评测运行用 {@link EVAL_QUOTA_PREFIX}。 */
|
|
@@ -11,19 +12,32 @@ export declare const EVAL_QUOTA_PREFIX = "capk:org-evals:";
|
|
|
11
12
|
* 组织级运行并发配额(spec 4.3):Redis ZSET `<keyPrefix><orgId>`(默认 `capk:org-runs:<orgId>`),
|
|
12
13
|
* 成员 runId(评测为 jobId)、分数为租约到期时间。
|
|
13
14
|
* 持有方崩溃时不 `leave`,成员在租约到期后被下一次 `tryEnter` 清理,名额不泄漏。
|
|
15
|
+
* One instance per key prefix, provided under {@link RUN_QUOTA} / {@link EVAL_QUOTA}.
|
|
14
16
|
*/
|
|
15
17
|
export declare class OrgQuota {
|
|
16
18
|
private readonly redis;
|
|
17
19
|
private readonly keyPrefix;
|
|
18
|
-
|
|
20
|
+
private readonly locks?;
|
|
21
|
+
constructor(redis: Redis, keyPrefix?: string, locks?: LockService | undefined);
|
|
19
22
|
private key;
|
|
20
23
|
tryEnter(orgId: string, runId: string, limit: number, leaseMs?: number): Promise<boolean>;
|
|
21
24
|
/** 续期;成员已过期被清理 → false。 */
|
|
22
25
|
renew(orgId: string, runId: string, leaseMs?: number): Promise<boolean>;
|
|
23
26
|
leave(orgId: string, runId: string): Promise<void>;
|
|
27
|
+
/**
|
|
28
|
+
* Takes a slot ({@link tryEnter}) and keeps it while held: renewed every `leaseMs / 3` by the
|
|
29
|
+
* lock service's watchdog; `release()` leaves. Undefined when the organization is at its limit.
|
|
30
|
+
* A slot that could not be renewed (it expired meanwhile) aborts `lost` with one WARN; the
|
|
31
|
+
* holder may go on (the slot is a fair-share limit, not mutual exclusion).
|
|
32
|
+
*/
|
|
33
|
+
enter(orgId: string, runId: string, limit: number, leaseMs?: number): Promise<LeaseHandle | undefined>;
|
|
24
34
|
}
|
|
35
|
+
/** The organization run quota (`capk:org-runs:<orgId>`). */
|
|
36
|
+
export declare const RUN_QUOTA: unique symbol;
|
|
37
|
+
/** The organization eval quota (`capk:org-evals:<orgId>`). */
|
|
38
|
+
export declare const EVAL_QUOTA: unique symbol;
|
|
25
39
|
/**
|
|
26
40
|
* 组织的运行并发上限:部署设置 `runConcurrencyOverrides[orgId]`,没有则用 `runtime.orgConcurrency`
|
|
27
41
|
* (热更新字段,每次经 `config()` 读当前值)。
|
|
28
42
|
*/
|
|
29
|
-
export declare function orgRunLimit(settings: Pick<SettingsService, "get">, config:
|
|
43
|
+
export declare function orgRunLimit(settings: Pick<SettingsService, "get">, config: Pick<KernelConfigService, "get">, orgId: string): Promise<number>;
|
package/dist/runtime/quota.js
CHANGED
|
@@ -38,13 +38,16 @@ return 0
|
|
|
38
38
|
* 组织级运行并发配额(spec 4.3):Redis ZSET `<keyPrefix><orgId>`(默认 `capk:org-runs:<orgId>`),
|
|
39
39
|
* 成员 runId(评测为 jobId)、分数为租约到期时间。
|
|
40
40
|
* 持有方崩溃时不 `leave`,成员在租约到期后被下一次 `tryEnter` 清理,名额不泄漏。
|
|
41
|
+
* One instance per key prefix, provided under {@link RUN_QUOTA} / {@link EVAL_QUOTA}.
|
|
41
42
|
*/
|
|
42
43
|
export class OrgQuota {
|
|
43
44
|
redis;
|
|
44
45
|
keyPrefix;
|
|
45
|
-
|
|
46
|
+
locks;
|
|
47
|
+
constructor(redis, keyPrefix = RUN_QUOTA_PREFIX, locks) {
|
|
46
48
|
this.redis = redis;
|
|
47
49
|
this.keyPrefix = keyPrefix;
|
|
50
|
+
this.locks = locks;
|
|
48
51
|
}
|
|
49
52
|
key(orgId) {
|
|
50
53
|
return `${this.keyPrefix}${orgId}`;
|
|
@@ -59,12 +62,34 @@ export class OrgQuota {
|
|
|
59
62
|
async leave(orgId, runId) {
|
|
60
63
|
await this.redis.zrem(this.key(orgId), runId);
|
|
61
64
|
}
|
|
65
|
+
/**
|
|
66
|
+
* Takes a slot ({@link tryEnter}) and keeps it while held: renewed every `leaseMs / 3` by the
|
|
67
|
+
* lock service's watchdog; `release()` leaves. Undefined when the organization is at its limit.
|
|
68
|
+
* A slot that could not be renewed (it expired meanwhile) aborts `lost` with one WARN; the
|
|
69
|
+
* holder may go on (the slot is a fair-share limit, not mutual exclusion).
|
|
70
|
+
*/
|
|
71
|
+
async enter(orgId, runId, limit, leaseMs = ORG_QUOTA_LEASE_MS) {
|
|
72
|
+
const locks = this.locks;
|
|
73
|
+
if (!locks)
|
|
74
|
+
throw new Error("OrgQuota.enter needs the lock service");
|
|
75
|
+
const sentAt = Date.now();
|
|
76
|
+
if (!(await this.tryEnter(orgId, runId, limit, leaseMs)))
|
|
77
|
+
return undefined;
|
|
78
|
+
return locks.keepAlive(`${this.key(orgId)}/${runId}`, leaseMs, {
|
|
79
|
+
renew: () => this.renew(orgId, runId, leaseMs),
|
|
80
|
+
release: () => this.leave(orgId, runId),
|
|
81
|
+
}, sentAt);
|
|
82
|
+
}
|
|
62
83
|
}
|
|
84
|
+
/** The organization run quota (`capk:org-runs:<orgId>`). */
|
|
85
|
+
export const RUN_QUOTA = Symbol("RUN_QUOTA");
|
|
86
|
+
/** The organization eval quota (`capk:org-evals:<orgId>`). */
|
|
87
|
+
export const EVAL_QUOTA = Symbol("EVAL_QUOTA");
|
|
63
88
|
/**
|
|
64
89
|
* 组织的运行并发上限:部署设置 `runConcurrencyOverrides[orgId]`,没有则用 `runtime.orgConcurrency`
|
|
65
90
|
* (热更新字段,每次经 `config()` 读当前值)。
|
|
66
91
|
*/
|
|
67
92
|
export async function orgRunLimit(settings, config, orgId) {
|
|
68
93
|
const { runConcurrencyOverrides } = await settings.get();
|
|
69
|
-
return runConcurrencyOverrides[orgId] ?? config().runtime.orgConcurrency;
|
|
94
|
+
return runConcurrencyOverrides[orgId] ?? config.get().runtime.orgConcurrency;
|
|
70
95
|
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Job scheduler ids of the maintenance queue's fixed-period jobs before they became `@LockedCron` /
|
|
3
|
+
* `@LockedInterval` jobs: an upgraded deployment still has them in Redis, so a starting worker
|
|
4
|
+
* role removes them (else BullMQ keeps firing a job no handler knows). Each id
|
|
5
|
+
* comes from its domain's leaf `job-ids.ts`, so this module imports no domain code.
|
|
6
|
+
*/
|
|
7
|
+
export declare const RETIRED_SCHEDULER_IDS: readonly string[];
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { MARKETPLACES_REFRESH_SCHEDULER_ID, PLUGIN_STAGING_CLEANUP_SCHEDULER_ID, } from "../catalog/job-ids.js";
|
|
2
|
+
import { GATEWAY_CHECK_SCHEDULER_ID } from "../channels/job-ids.js";
|
|
3
|
+
import { ATTACHMENT_CLEANUP_SCHEDULER_ID } from "../conversations/job-ids.js";
|
|
4
|
+
import { PLUGINS_RECONCILE_SCHEDULER_ID } from "../extensions/job-ids.js";
|
|
5
|
+
import { DIRECTORY_SCAN_SCHEDULER_ID, OFFBOARD_SWEEP_SCHEDULER_ID } from "../orgs/job-ids.js";
|
|
6
|
+
import { SANDBOX_DESTROY_SCHEDULER_ID, SANDBOX_SUSPEND_SCHEDULER_ID } from "../sandbox/job-ids.js";
|
|
7
|
+
import { STORAGE_PURGE_SCHEDULER_ID } from "../storage/job-ids.js";
|
|
8
|
+
import { DRIFT_SCHEDULER_ID, OUTPUT_CLEANUP_SCHEDULER_ID } from "../tools/job-ids.js";
|
|
9
|
+
import { USAGE_SWEEP_SCHEDULER_ID, WAIT_SWEEP_SCHEDULER_ID } from "./job-ids.js";
|
|
10
|
+
/**
|
|
11
|
+
* Job scheduler ids of the maintenance queue's fixed-period jobs before they became `@LockedCron` /
|
|
12
|
+
* `@LockedInterval` jobs: an upgraded deployment still has them in Redis, so a starting worker
|
|
13
|
+
* role removes them (else BullMQ keeps firing a job no handler knows). Each id
|
|
14
|
+
* comes from its domain's leaf `job-ids.ts`, so this module imports no domain code.
|
|
15
|
+
*/
|
|
16
|
+
export const RETIRED_SCHEDULER_IDS = [
|
|
17
|
+
STORAGE_PURGE_SCHEDULER_ID,
|
|
18
|
+
DIRECTORY_SCAN_SCHEDULER_ID,
|
|
19
|
+
OFFBOARD_SWEEP_SCHEDULER_ID,
|
|
20
|
+
PLUGINS_RECONCILE_SCHEDULER_ID,
|
|
21
|
+
MARKETPLACES_REFRESH_SCHEDULER_ID,
|
|
22
|
+
PLUGIN_STAGING_CLEANUP_SCHEDULER_ID,
|
|
23
|
+
DRIFT_SCHEDULER_ID,
|
|
24
|
+
OUTPUT_CLEANUP_SCHEDULER_ID,
|
|
25
|
+
ATTACHMENT_CLEANUP_SCHEDULER_ID,
|
|
26
|
+
WAIT_SWEEP_SCHEDULER_ID,
|
|
27
|
+
USAGE_SWEEP_SCHEDULER_ID,
|
|
28
|
+
GATEWAY_CHECK_SCHEDULER_ID,
|
|
29
|
+
SANDBOX_SUSPEND_SCHEDULER_ID,
|
|
30
|
+
SANDBOX_DESTROY_SCHEDULER_ID,
|
|
31
|
+
];
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { KernelEvents } from "../infra/events/kernel-events.js";
|
|
2
|
+
import type { KernelLogger } from "../log.js";
|
|
3
|
+
import { RunAbort } from "./abort.js";
|
|
4
|
+
import { RunQueue } from "./run-queue.js";
|
|
5
|
+
import { Waits } from "./waits.js";
|
|
6
|
+
/**
|
|
7
|
+
* Starting and stopping runs from outside the run worker: the conversations API (a message, a
|
|
8
|
+
* stop), the conversation queue and offboarding (a departed member's runs, `by: null`).
|
|
9
|
+
*/
|
|
10
|
+
export declare class RunControl {
|
|
11
|
+
private readonly queue;
|
|
12
|
+
private readonly waits;
|
|
13
|
+
private readonly abort;
|
|
14
|
+
private readonly events;
|
|
15
|
+
private readonly log;
|
|
16
|
+
constructor(queue: Pick<RunQueue, "ensureRun" | "abortIfOrphaned">, waits: Pick<Waits, "abortWaiting" | "childFinished" | "stopChildren">, abort: Pick<RunAbort, "request">, events: KernelEvents, log: Pick<KernelLogger, "error">);
|
|
17
|
+
/** 有未消费的消息且没有进行中的运行时投递一轮运行;返回 runId 或 null。 */
|
|
18
|
+
ensureRun(conversationId: string): Promise<string | null>;
|
|
19
|
+
/**
|
|
20
|
+
* 运行是孤儿(会话锁空闲、任务已不存在,没有 worker 会收到中止广播)时直接把它写成 aborted,返回 true;
|
|
21
|
+
* 否则返回 false。A stopped sub-agent then reports to its parent at once, and a stopped parent
|
|
22
|
+
* stops its children (sub-agents spec §12).
|
|
23
|
+
*/
|
|
24
|
+
abortIfOrphaned(conversationId: string, runId: string, byAccountId: string | null): Promise<boolean>;
|
|
25
|
+
/**
|
|
26
|
+
* 运行在等人处理(waiting)时直接中止:取消等待、写 `run_aborted`、删除 checkpoint,返回 true;
|
|
27
|
+
* 运行已不是 waiting(例如刚被续跑)→ false. Either way its approval / question cards may have
|
|
28
|
+
* changed: `run.wait-stopped` lets the channel outbound update them.
|
|
29
|
+
*/
|
|
30
|
+
abortWaiting(conversationId: string, runId: string, byAccountId: string | null): Promise<boolean>;
|
|
31
|
+
/** 请求中止运行(广播到所有副本)。 */
|
|
32
|
+
requestAbort(runId: string, byAccountId: string | null): Promise<void>;
|
|
33
|
+
}
|
|
@@ -0,0 +1,77 @@
|
|
|
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 } from "@nestjs/common";
|
|
11
|
+
import { KernelEvents } from "../infra/events/kernel-events.js";
|
|
12
|
+
import { KERNEL_LOGGER } from "../infra/tokens.js";
|
|
13
|
+
import { RunAbort } from "./abort.js";
|
|
14
|
+
import { RunQueue } from "./run-queue.js";
|
|
15
|
+
import { Waits } from "./waits.js";
|
|
16
|
+
/**
|
|
17
|
+
* Starting and stopping runs from outside the run worker: the conversations API (a message, a
|
|
18
|
+
* stop), the conversation queue and offboarding (a departed member's runs, `by: null`).
|
|
19
|
+
*/
|
|
20
|
+
let RunControl = class RunControl {
|
|
21
|
+
queue;
|
|
22
|
+
waits;
|
|
23
|
+
abort;
|
|
24
|
+
events;
|
|
25
|
+
log;
|
|
26
|
+
constructor(queue, waits, abort, events, log) {
|
|
27
|
+
this.queue = queue;
|
|
28
|
+
this.waits = waits;
|
|
29
|
+
this.abort = abort;
|
|
30
|
+
this.events = events;
|
|
31
|
+
this.log = log;
|
|
32
|
+
}
|
|
33
|
+
/** 有未消费的消息且没有进行中的运行时投递一轮运行;返回 runId 或 null。 */
|
|
34
|
+
ensureRun(conversationId) {
|
|
35
|
+
return this.queue.ensureRun(conversationId);
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* 运行是孤儿(会话锁空闲、任务已不存在,没有 worker 会收到中止广播)时直接把它写成 aborted,返回 true;
|
|
39
|
+
* 否则返回 false。A stopped sub-agent then reports to its parent at once, and a stopped parent
|
|
40
|
+
* stops its children (sub-agents spec §12).
|
|
41
|
+
*/
|
|
42
|
+
async abortIfOrphaned(conversationId, runId, byAccountId) {
|
|
43
|
+
const r = await this.queue.abortIfOrphaned(conversationId, runId, byAccountId);
|
|
44
|
+
if (r) {
|
|
45
|
+
await this.waits
|
|
46
|
+
.childFinished(runId)
|
|
47
|
+
.catch((err) => this.log.error("cannot report finished sub-agent run to its parent", { runId, err }));
|
|
48
|
+
await this.waits
|
|
49
|
+
.stopChildren(runId, null)
|
|
50
|
+
.catch((err) => this.log.error("cannot stop the sub-agents of a run", { runId, err }));
|
|
51
|
+
}
|
|
52
|
+
return r;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* 运行在等人处理(waiting)时直接中止:取消等待、写 `run_aborted`、删除 checkpoint,返回 true;
|
|
56
|
+
* 运行已不是 waiting(例如刚被续跑)→ false. Either way its approval / question cards may have
|
|
57
|
+
* changed: `run.wait-stopped` lets the channel outbound update them.
|
|
58
|
+
*/
|
|
59
|
+
async abortWaiting(conversationId, runId, byAccountId) {
|
|
60
|
+
const r = await this.waits.abortWaiting(conversationId, runId, byAccountId);
|
|
61
|
+
await this.events.emit("run.wait-stopped", { conversationId, runId });
|
|
62
|
+
return r;
|
|
63
|
+
}
|
|
64
|
+
/** 请求中止运行(广播到所有副本)。 */
|
|
65
|
+
requestAbort(runId, byAccountId) {
|
|
66
|
+
return this.abort.request(runId, byAccountId);
|
|
67
|
+
}
|
|
68
|
+
};
|
|
69
|
+
RunControl = __decorate([
|
|
70
|
+
Injectable(),
|
|
71
|
+
__param(0, Inject(RunQueue)),
|
|
72
|
+
__param(1, Inject(Waits)),
|
|
73
|
+
__param(2, Inject(RunAbort)),
|
|
74
|
+
__param(3, Inject(KernelEvents)),
|
|
75
|
+
__param(4, Inject(KERNEL_LOGGER))
|
|
76
|
+
], RunControl);
|
|
77
|
+
export { RunControl };
|
|
@@ -1,7 +1,6 @@
|
|
|
1
|
-
import { type
|
|
2
|
-
import
|
|
3
|
-
import
|
|
4
|
-
type KernelTrx = Transaction<KernelDatabase>;
|
|
1
|
+
import { type AppendEvent, EventLog } from "../conversations/event-log.js";
|
|
2
|
+
import { KernelDb } from "../infra/database/kernel-db.js";
|
|
3
|
+
import { TransactionHost } from "../infra/database/transaction-host.js";
|
|
5
4
|
/** 运行的终态。 */
|
|
6
5
|
export type TerminalStatus = "completed" | "failed" | "aborted";
|
|
7
6
|
export declare const TERMINAL_STATUSES: ReadonlySet<string>;
|
|
@@ -22,24 +21,34 @@ export interface FinishRunArgs {
|
|
|
22
21
|
* Runs in the transaction once the run is known not to be terminal, before the terminal event:
|
|
23
22
|
* a parent's open `agent` calls get their results here (sub-agents spec §12, review m1).
|
|
24
23
|
*/
|
|
25
|
-
beforeTerminal?: (
|
|
24
|
+
beforeTerminal?: () => Promise<void>;
|
|
26
25
|
}
|
|
27
26
|
/**
|
|
28
|
-
*
|
|
29
|
-
*
|
|
30
|
-
*
|
|
31
|
-
* `consumed_seq = GREATEST(consumed_seq, consumed, runs.trigger_seq)`:不回退,且失败 / 中止 / 完成都至少
|
|
32
|
-
* 消费到触发该运行的消息——否则结束时的 ensureRun 会对同一条消息无限重试(失败)或卡住会话。
|
|
33
|
-
* 超时(`floorToTrigger: false`)只取 `GREATEST(consumed_seq, consumed)`:没吸收的消息留给下一轮(R34)。
|
|
34
|
-
* 加锁顺序与 `RunQueue.ensureRun` 一致(先会话行、后 runs 行),不会互相死锁。
|
|
35
|
-
* 调用方在提交后对非 null 的返回值调用 `eventLog.notify`。
|
|
27
|
+
* Writes runs' terminal states (one instance; the run worker, the run queue's orphan repairs, the
|
|
28
|
+
* waits and the eval replays finish runs through it).
|
|
36
29
|
*/
|
|
37
|
-
export declare
|
|
30
|
+
export declare class RunFinish {
|
|
31
|
+
private readonly kdb;
|
|
32
|
+
private readonly eventLog;
|
|
33
|
+
readonly txHost: TransactionHost;
|
|
34
|
+
constructor(kdb: KernelDb, eventLog: EventLog, txHost: TransactionHost);
|
|
35
|
+
/**
|
|
36
|
+
* 在调用方的事务内写运行的终态:会话行锁 → 运行仍未结束才写终态事件、推进 `consumed_seq`、更新 `runs.status`。
|
|
37
|
+
* 返回终态事件的 seq;运行已是终态(例如已被其他副本标记失败)→ 返回 null,什么都不写。
|
|
38
|
+
*
|
|
39
|
+
* `consumed_seq = GREATEST(consumed_seq, consumed, runs.trigger_seq)`:不回退,且失败 / 中止 / 完成都至少
|
|
40
|
+
* 消费到触发该运行的消息——否则结束时的 ensureRun 会对同一条消息无限重试(失败)或卡住会话。
|
|
41
|
+
* 超时(`floorToTrigger: false`)只取 `GREATEST(consumed_seq, consumed)`:没吸收的消息留给下一轮(R34)。
|
|
42
|
+
* 加锁顺序与 `RunQueue.ensureRun` 一致(先会话行、后 runs 行),不会互相死锁。
|
|
43
|
+
* 调用方在提交后对非 null 的返回值调用 {@link notifyFinished}。
|
|
44
|
+
*/
|
|
45
|
+
finishIn(a: FinishRunArgs): Promise<number | null>;
|
|
46
|
+
/** 自开事务写终态并在提交后发布会话通知;返回值同 {@link finishIn}。 */
|
|
47
|
+
finish(a: FinishRunArgs): Promise<number | null>;
|
|
48
|
+
private finishOwn;
|
|
49
|
+
}
|
|
38
50
|
/**
|
|
39
51
|
* After a terminal event committed: notify the log, and for a failed or stopped run also send
|
|
40
52
|
* `changed: queue` (the queue may have paused).
|
|
41
53
|
*/
|
|
42
54
|
export declare function notifyFinished(eventLog: Pick<EventLog, "notify" | "publishChanged">, conversationId: string, toSeq: number, status: TerminalStatus): Promise<void>;
|
|
43
|
-
/** 自开事务写终态并在提交后发布会话通知;返回值同 {@link finishRunIn}。 */
|
|
44
|
-
export declare function finishRun(db: KernelDb, eventLog: EventLog, a: FinishRunArgs): Promise<number | null>;
|
|
45
|
-
export {};
|
|
@@ -1,56 +1,110 @@
|
|
|
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 } from "@nestjs/common";
|
|
1
11
|
import { sql } from "kysely";
|
|
12
|
+
import { EventLog } from "../conversations/event-log.js";
|
|
2
13
|
import { pauseQueueIn } from "../conversations/queue.js";
|
|
14
|
+
import { KernelDb } from "../infra/database/kernel-db.js";
|
|
15
|
+
import { TransactionHost } from "../infra/database/transaction-host.js";
|
|
16
|
+
import { Transactional } from "../infra/database/transactional.decorator.js";
|
|
3
17
|
export const TERMINAL_STATUSES = new Set([
|
|
4
18
|
"completed",
|
|
5
19
|
"failed",
|
|
6
20
|
"aborted",
|
|
7
21
|
]);
|
|
8
22
|
/**
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
* `consumed_seq = GREATEST(consumed_seq, consumed, runs.trigger_seq)`:不回退,且失败 / 中止 / 完成都至少
|
|
13
|
-
* 消费到触发该运行的消息——否则结束时的 ensureRun 会对同一条消息无限重试(失败)或卡住会话。
|
|
14
|
-
* 超时(`floorToTrigger: false`)只取 `GREATEST(consumed_seq, consumed)`:没吸收的消息留给下一轮(R34)。
|
|
15
|
-
* 加锁顺序与 `RunQueue.ensureRun` 一致(先会话行、后 runs 行),不会互相死锁。
|
|
16
|
-
* 调用方在提交后对非 null 的返回值调用 `eventLog.notify`。
|
|
23
|
+
* Writes runs' terminal states (one instance; the run worker, the run queue's orphan repairs, the
|
|
24
|
+
* waits and the eval replays finish runs through it).
|
|
17
25
|
*/
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
.
|
|
24
|
-
.
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
26
|
+
let RunFinish = class RunFinish {
|
|
27
|
+
kdb;
|
|
28
|
+
eventLog;
|
|
29
|
+
txHost;
|
|
30
|
+
constructor(kdb, eventLog, txHost) {
|
|
31
|
+
this.kdb = kdb;
|
|
32
|
+
this.eventLog = eventLog;
|
|
33
|
+
this.txHost = txHost;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* 在调用方的事务内写运行的终态:会话行锁 → 运行仍未结束才写终态事件、推进 `consumed_seq`、更新 `runs.status`。
|
|
37
|
+
* 返回终态事件的 seq;运行已是终态(例如已被其他副本标记失败)→ 返回 null,什么都不写。
|
|
38
|
+
*
|
|
39
|
+
* `consumed_seq = GREATEST(consumed_seq, consumed, runs.trigger_seq)`:不回退,且失败 / 中止 / 完成都至少
|
|
40
|
+
* 消费到触发该运行的消息——否则结束时的 ensureRun 会对同一条消息无限重试(失败)或卡住会话。
|
|
41
|
+
* 超时(`floorToTrigger: false`)只取 `GREATEST(consumed_seq, consumed)`:没吸收的消息留给下一轮(R34)。
|
|
42
|
+
* 加锁顺序与 `RunQueue.ensureRun` 一致(先会话行、后 runs 行),不会互相死锁。
|
|
43
|
+
* 调用方在提交后对非 null 的返回值调用 {@link notifyFinished}。
|
|
44
|
+
*/
|
|
45
|
+
async finishIn(a) {
|
|
46
|
+
const t = this.kdb.db;
|
|
47
|
+
await t
|
|
48
|
+
.selectFrom("conversations")
|
|
49
|
+
.select("id")
|
|
50
|
+
.where("id", "=", a.conversationId)
|
|
51
|
+
.forUpdate()
|
|
52
|
+
.executeTakeFirst();
|
|
53
|
+
const run = await t
|
|
54
|
+
.selectFrom("runs")
|
|
55
|
+
.select("status")
|
|
56
|
+
.where("id", "=", a.runId)
|
|
57
|
+
.forUpdate()
|
|
58
|
+
.executeTakeFirst();
|
|
59
|
+
if (!run || TERMINAL_STATUSES.has(run.status))
|
|
60
|
+
return null;
|
|
61
|
+
await a.beforeTerminal?.();
|
|
62
|
+
const [ev] = await this.eventLog.appendIn(a.conversationId, [
|
|
63
|
+
{ ...a.event, runId: a.runId, idemKey: `${a.event.type}:${a.runId}` },
|
|
64
|
+
]);
|
|
65
|
+
await t
|
|
66
|
+
.updateTable("conversations")
|
|
67
|
+
.set({
|
|
68
|
+
consumed_seq: a.floorToTrigger === false
|
|
69
|
+
? sql `GREATEST(consumed_seq, ${a.consumed ?? 0}::bigint)`
|
|
70
|
+
: sql `GREATEST(consumed_seq, ${a.consumed ?? 0}::bigint, (SELECT r.trigger_seq FROM capybara.runs r WHERE r.id = ${a.runId}))`,
|
|
71
|
+
})
|
|
72
|
+
.where("id", "=", a.conversationId)
|
|
73
|
+
.execute();
|
|
74
|
+
await t
|
|
75
|
+
.updateTable("runs")
|
|
76
|
+
.set({ status: a.status, finished_at: sql `now()` })
|
|
77
|
+
.where("id", "=", a.runId)
|
|
78
|
+
.execute();
|
|
79
|
+
// a failed or stopped run pauses the queued messages until the person resumes (spec §5.7)
|
|
80
|
+
if (a.status !== "completed")
|
|
81
|
+
await pauseQueueIn(t, a.conversationId);
|
|
82
|
+
return ev.seq;
|
|
83
|
+
}
|
|
84
|
+
/** 自开事务写终态并在提交后发布会话通知;返回值同 {@link finishIn}。 */
|
|
85
|
+
async finish(a) {
|
|
86
|
+
const toSeq = await this.finishOwn(a);
|
|
87
|
+
if (toSeq !== null)
|
|
88
|
+
await notifyFinished(this.eventLog, a.conversationId, toSeq, a.status);
|
|
89
|
+
return toSeq;
|
|
90
|
+
}
|
|
91
|
+
finishOwn(a) {
|
|
92
|
+
return this.finishIn(a);
|
|
93
|
+
}
|
|
94
|
+
};
|
|
95
|
+
__decorate([
|
|
96
|
+
Transactional({ propagation: "mandatory" })
|
|
97
|
+
], RunFinish.prototype, "finishIn", null);
|
|
98
|
+
__decorate([
|
|
99
|
+
Transactional({ propagation: "requires_new" })
|
|
100
|
+
], RunFinish.prototype, "finishOwn", null);
|
|
101
|
+
RunFinish = __decorate([
|
|
102
|
+
Injectable(),
|
|
103
|
+
__param(0, Inject(KernelDb)),
|
|
104
|
+
__param(1, Inject(EventLog)),
|
|
105
|
+
__param(2, Inject(TransactionHost))
|
|
106
|
+
], RunFinish);
|
|
107
|
+
export { RunFinish };
|
|
54
108
|
/**
|
|
55
109
|
* After a terminal event committed: notify the log, and for a failed or stopped run also send
|
|
56
110
|
* `changed: queue` (the queue may have paused).
|
|
@@ -60,10 +114,3 @@ export async function notifyFinished(eventLog, conversationId, toSeq, status) {
|
|
|
60
114
|
if (status !== "completed")
|
|
61
115
|
await eventLog.publishChanged(conversationId, "queue");
|
|
62
116
|
}
|
|
63
|
-
/** 自开事务写终态并在提交后发布会话通知;返回值同 {@link finishRunIn}。 */
|
|
64
|
-
export async function finishRun(db, eventLog, a) {
|
|
65
|
-
const toSeq = await db.transaction().execute((t) => finishRunIn(t, eventLog, a));
|
|
66
|
-
if (toSeq !== null)
|
|
67
|
-
await notifyFinished(eventLog, a.conversationId, toSeq, a.status);
|
|
68
|
-
return toSeq;
|
|
69
|
-
}
|