@capybara-hq/kernel 0.1.0-rc.1 → 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/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 -194
- package/dist/channels/supervisor.d.ts +88 -46
- package/dist/channels/supervisor.js +230 -132
- package/dist/channels/threads.d.ts +29 -8
- package/dist/channels/threads.js +71 -13
- package/dist/channels/webhook.d.ts +20 -14
- package/dist/channels/webhook.js +51 -20
- package/dist/config/load.d.ts +3 -2
- package/dist/config/load.js +3 -2
- package/dist/config/nacos-source.js +11 -2
- package/dist/config/schema.d.ts +1 -0
- package/dist/config/schema.js +10 -4
- 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 -63
- package/dist/ctx/bus.js +9 -3
- package/dist/ctx/create-ctx.d.ts +6 -0
- package/dist/ctx/create-ctx.js +7 -9
- package/dist/ctx/lock.d.ts +7 -3
- package/dist/ctx/lock.js +9 -20
- package/dist/ctx/secrets.d.ts +10 -2
- package/dist/ctx/secrets.js +7 -3
- package/dist/db/kernel-schema.d.ts +2 -2
- package/dist/db/pool.d.ts +5 -0
- package/dist/db/pool.js +1 -0
- package/dist/errors.d.ts +1 -0
- package/dist/errors.js +1 -0
- package/dist/evals/budget.d.ts +42 -21
- package/dist/evals/budget.js +114 -62
- package/dist/evals/evals.module.d.ts +31 -0
- package/dist/evals/evals.module.js +114 -0
- package/dist/evals/jobs.d.ts +20 -0
- package/dist/evals/jobs.js +45 -0
- package/dist/evals/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 -121
- package/dist/extensions/admin-ops.d.ts +61 -33
- package/dist/extensions/admin-ops.js +248 -154
- package/dist/extensions/admin-view.d.ts +38 -27
- package/dist/extensions/admin-view.js +126 -55
- package/dist/extensions/approvals.d.ts +12 -8
- package/dist/extensions/approvals.js +73 -46
- package/dist/extensions/blobs.d.ts +27 -10
- package/dist/extensions/blobs.js +111 -45
- package/dist/extensions/bootstrap.d.ts +58 -31
- package/dist/extensions/bootstrap.js +175 -121
- package/dist/extensions/cli.d.ts +20 -10
- package/dist/extensions/cli.js +41 -96
- package/dist/extensions/config-issues.d.ts +7 -0
- package/dist/extensions/config-issues.js +31 -0
- package/dist/extensions/deployment-config-store.d.ts +49 -0
- package/dist/extensions/deployment-config-store.js +133 -0
- package/dist/extensions/deployment-config.d.ts +58 -67
- package/dist/extensions/deployment-config.js +202 -230
- package/dist/extensions/enabled.d.ts +5 -5
- package/dist/extensions/extensions.module.d.ts +8 -0
- package/dist/extensions/extensions.module.js +77 -0
- package/dist/extensions/hooks.d.ts +3 -2
- package/dist/extensions/hooks.js +1 -1
- package/dist/extensions/host.d.ts +72 -68
- package/dist/extensions/host.js +191 -152
- package/dist/extensions/installs.d.ts +49 -16
- package/dist/extensions/installs.js +128 -32
- package/dist/extensions/job-ids.d.ts +6 -0
- package/dist/extensions/job-ids.js +6 -0
- package/dist/extensions/lifecycle-topics.d.ts +18 -0
- package/dist/extensions/lifecycle-topics.js +18 -0
- package/dist/extensions/lifecycle.d.ts +35 -47
- package/dist/extensions/lifecycle.js +103 -39
- package/dist/extensions/locks.d.ts +33 -0
- package/dist/extensions/locks.js +86 -0
- package/dist/extensions/migrate-lock.d.ts +3 -4
- package/dist/extensions/org-config.controller.d.ts +1 -1
- package/dist/extensions/org-config.controller.js +8 -5
- package/dist/extensions/org-config.d.ts +48 -46
- package/dist/extensions/org-config.js +284 -226
- package/dist/extensions/registry.d.ts +50 -2
- package/dist/extensions/registry.js +89 -4
- package/dist/extensions/sources.d.ts +12 -8
- package/dist/extensions/sources.js +34 -13
- package/dist/files/files.module.d.ts +3 -0
- package/dist/files/files.module.js +22 -0
- package/dist/files/previewers.controller.d.ts +7 -2
- package/dist/files/previewers.controller.js +17 -9
- package/dist/files/previewers.d.ts +13 -18
- package/dist/files/previewers.js +83 -36
- package/dist/http/adapter.d.ts +3 -0
- package/dist/http/adapter.js +25 -0
- package/dist/http/api.module.d.ts +3 -110
- package/dist/http/api.module.js +47 -355
- package/dist/http/app.d.ts +11 -15
- package/dist/http/app.js +17 -62
- package/dist/http/error-filter.module.d.ts +5 -0
- package/dist/http/error-filter.module.js +18 -0
- package/dist/http/error.filter.js +2 -2
- package/dist/identity/accounts.d.ts +82 -29
- package/dist/identity/accounts.js +294 -175
- package/dist/identity/api-tokens.d.ts +11 -7
- package/dist/identity/api-tokens.js +71 -44
- package/dist/identity/audit.d.ts +7 -4
- package/dist/identity/audit.js +5 -1
- package/dist/identity/auth.controller.d.ts +11 -10
- package/dist/identity/auth.controller.js +31 -25
- package/dist/identity/auth.guard.d.ts +3 -3
- package/dist/identity/auth.guard.js +6 -4
- package/dist/identity/binding.d.ts +9 -11
- package/dist/identity/binding.js +41 -13
- package/dist/identity/enterprise-admin.d.ts +18 -12
- package/dist/identity/enterprise-admin.js +67 -13
- package/dist/identity/external-identity-lock.d.ts +17 -0
- package/dist/identity/external-identity-lock.js +39 -0
- package/dist/identity/external.d.ts +19 -15
- package/dist/identity/external.js +163 -125
- package/dist/identity/identity.module.d.ts +6 -0
- package/dist/identity/identity.module.js +56 -0
- package/dist/identity/me.controller.d.ts +16 -15
- package/dist/identity/me.controller.js +37 -31
- package/dist/identity/sessions.d.ts +12 -10
- package/dist/identity/sessions.js +74 -42
- package/dist/identity/settings.d.ts +20 -14
- package/dist/identity/settings.js +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 +16 -11
- package/dist/index.js +9 -6
- package/dist/infra/cache/cache.module.d.ts +3 -0
- package/dist/infra/cache/cache.module.js +16 -0
- package/dist/infra/cache/cache.service.d.ts +21 -0
- package/dist/infra/cache/cache.service.js +80 -0
- package/dist/infra/cache/cacheable.decorator.d.ts +32 -0
- package/dist/infra/cache/cacheable.decorator.js +83 -0
- package/dist/infra/cli/kernel-cli.module.d.ts +66 -0
- package/dist/infra/cli/kernel-cli.module.js +165 -0
- package/dist/infra/close-within.d.ts +15 -0
- package/dist/infra/close-within.js +36 -0
- package/dist/infra/config/config.module.d.ts +13 -0
- package/dist/infra/config/config.module.js +39 -0
- package/dist/infra/config/kernel-config.service.d.ts +25 -0
- package/dist/infra/config/kernel-config.service.js +126 -0
- package/dist/infra/database/after-commit.d.ts +6 -0
- package/dist/infra/database/after-commit.js +9 -0
- package/dist/infra/database/database.module.d.ts +25 -0
- package/dist/infra/database/database.module.js +90 -0
- package/dist/infra/database/kernel-db.d.ts +22 -0
- package/dist/infra/database/kernel-db.js +65 -0
- package/dist/infra/database/transaction-host.d.ts +50 -0
- package/dist/infra/database/transaction-host.js +125 -0
- package/dist/infra/database/transactional.decorator.d.ts +15 -0
- package/dist/infra/database/transactional.decorator.js +27 -0
- package/dist/infra/database/xact-lock.d.ts +17 -0
- package/dist/infra/database/xact-lock.js +43 -0
- package/dist/infra/events/kernel-events.d.ts +96 -0
- package/dist/infra/events/kernel-events.js +65 -0
- package/dist/infra/health/health.controller.d.ts +26 -0
- package/dist/infra/health/health.controller.js +104 -0
- package/dist/infra/health/health.module.d.ts +9 -0
- package/dist/infra/health/health.module.js +24 -0
- package/dist/infra/health/health.options.d.ts +10 -0
- package/dist/infra/health/health.options.js +15 -0
- package/dist/infra/health/shutdown-state.d.ts +6 -0
- package/dist/infra/health/shutdown-state.js +2 -0
- package/dist/infra/lifecycle/graceful-shutdown.module.d.ts +6 -0
- package/dist/infra/lifecycle/graceful-shutdown.module.js +23 -0
- package/dist/infra/lifecycle/graceful-shutdown.service.d.ts +70 -0
- package/dist/infra/lifecycle/graceful-shutdown.service.js +135 -0
- package/dist/infra/lifecycle/process-guards.d.ts +52 -0
- package/dist/infra/lifecycle/process-guards.js +86 -0
- package/dist/infra/lifecycle/shutdown-signals.d.ts +30 -0
- package/dist/infra/lifecycle/shutdown-signals.js +48 -0
- package/dist/infra/lock/key-template.d.ts +13 -0
- package/dist/infra/lock/key-template.js +46 -0
- package/dist/infra/lock/lock.module.d.ts +3 -0
- package/dist/infra/lock/lock.module.js +16 -0
- package/dist/infra/lock/lock.service.d.ts +120 -0
- package/dist/infra/lock/lock.service.js +343 -0
- package/dist/infra/lock/shared-lease.d.ts +44 -0
- package/dist/infra/lock/shared-lease.js +121 -0
- package/dist/infra/lock/with-lock.decorator.d.ts +28 -0
- package/dist/infra/lock/with-lock.decorator.js +49 -0
- package/dist/infra/logging/logging.module.d.ts +16 -0
- package/dist/infra/logging/logging.module.js +34 -0
- package/dist/infra/queue/configured-processor.d.ts +18 -0
- package/dist/infra/queue/configured-processor.js +23 -0
- package/dist/infra/queue/job-failure.d.ts +18 -0
- package/dist/infra/queue/job-failure.js +26 -0
- package/dist/infra/queue/queue-shutdown.d.ts +27 -0
- package/dist/infra/queue/queue-shutdown.js +81 -0
- package/dist/infra/queue/queue.module.d.ts +16 -0
- package/dist/infra/queue/queue.module.js +61 -0
- package/dist/infra/queue/redis-connection.d.ts +7 -0
- package/dist/infra/queue/redis-connection.js +18 -0
- package/dist/infra/queue/retired-schedulers.d.ts +7 -0
- package/dist/infra/queue/retired-schedulers.js +9 -0
- package/dist/infra/queue/run-job.d.ts +16 -0
- package/dist/infra/queue/run-job.js +19 -0
- package/dist/infra/redis/redis.module.d.ts +24 -0
- package/dist/infra/redis/redis.module.js +87 -0
- package/dist/infra/schedule/cron-tick.d.ts +12 -0
- package/dist/infra/schedule/cron-tick.js +25 -0
- package/dist/infra/schedule/locked-cron.decorator.d.ts +27 -0
- package/dist/infra/schedule/locked-cron.decorator.js +53 -0
- package/dist/infra/schedule/locked-interval.d.ts +69 -0
- package/dist/infra/schedule/locked-interval.js +190 -0
- package/dist/infra/schedule/locked-tick.d.ts +90 -0
- package/dist/infra/schedule/locked-tick.js +137 -0
- package/dist/infra/schedule/schedule.module.d.ts +8 -0
- package/dist/infra/schedule/schedule.module.js +27 -0
- package/dist/infra/schedule/scheduled-runs.d.ts +69 -0
- package/dist/infra/schedule/scheduled-runs.js +163 -0
- package/dist/infra/swagger/swagger.d.ts +16 -0
- package/dist/infra/swagger/swagger.js +31 -0
- package/dist/infra/throttler/credential-throttler.d.ts +35 -0
- package/dist/infra/throttler/credential-throttler.js +77 -0
- package/dist/infra/throttler/named-throttlers.d.ts +31 -0
- package/dist/infra/throttler/named-throttlers.js +119 -0
- package/dist/infra/throttler/redis-throttler-storage.d.ts +38 -0
- package/dist/infra/throttler/redis-throttler-storage.js +130 -0
- package/dist/infra/throttler/throttler.guard.d.ts +23 -0
- package/dist/infra/throttler/throttler.guard.js +68 -0
- package/dist/infra/throttler/throttler.module.d.ts +15 -0
- package/dist/infra/throttler/throttler.module.js +53 -0
- package/dist/infra/tokens.d.ts +15 -0
- package/dist/infra/tokens.js +15 -0
- package/dist/infra/validation/create-zod-dto.d.ts +23 -0
- package/dist/infra/validation/create-zod-dto.js +35 -0
- package/dist/infra/validation/parse-with-zod.d.ts +7 -0
- package/dist/infra/validation/parse-with-zod.js +12 -0
- package/dist/infra/validation/validation.module.d.ts +3 -0
- package/dist/infra/validation/validation.module.js +16 -0
- package/dist/infra/validation/zod-params.d.ts +7 -0
- package/dist/infra/validation/zod-params.js +42 -0
- package/dist/infra/validation/zod-validation.pipe.d.ts +11 -0
- package/dist/infra/validation/zod-validation.pipe.js +31 -0
- package/dist/kernel.d.ts +9 -244
- package/dist/kernel.js +8 -1305
- package/dist/kernel.module.d.ts +17 -0
- package/dist/kernel.module.js +136 -0
- package/dist/lifecycle/kernel-lifecycle.d.ts +140 -0
- package/dist/lifecycle/kernel-lifecycle.js +451 -0
- package/dist/lifecycle/tokens.d.ts +3 -0
- package/dist/lifecycle/tokens.js +3 -0
- package/dist/log-context.d.ts +2 -0
- package/dist/log-context.js +4 -0
- package/dist/models/models.module.d.ts +3 -0
- package/dist/models/models.module.js +24 -0
- package/dist/models/prices.d.ts +8 -2
- package/dist/models/prices.js +65 -37
- package/dist/models/purposes.controller.d.ts +1 -1
- package/dist/models/purposes.controller.js +5 -6
- package/dist/models/purposes.d.ts +35 -13
- package/dist/models/purposes.js +101 -51
- package/dist/orgs/directory-sync.controller.d.ts +1 -1
- package/dist/orgs/directory-sync.controller.js +2 -2
- package/dist/orgs/directory-sync.d.ts +61 -31
- package/dist/orgs/directory-sync.js +212 -125
- package/dist/orgs/invitations.controller.d.ts +8 -8
- package/dist/orgs/invitations.controller.js +27 -26
- package/dist/orgs/invitations.service.d.ts +12 -9
- package/dist/orgs/invitations.service.js +130 -92
- package/dist/orgs/job-ids.d.ts +8 -0
- package/dist/orgs/job-ids.js +8 -0
- package/dist/orgs/members.service.d.ts +19 -12
- package/dist/orgs/members.service.js +161 -117
- package/dist/orgs/offboarding.d.ts +54 -57
- package/dist/orgs/offboarding.js +161 -71
- package/dist/orgs/org-lock.d.ts +28 -19
- package/dist/orgs/org-lock.js +81 -35
- package/dist/orgs/org.guard.d.ts +1 -1
- package/dist/orgs/org.guard.js +2 -2
- package/dist/orgs/orgs.controller.d.ts +13 -13
- package/dist/orgs/orgs.controller.js +29 -17
- package/dist/orgs/orgs.module.d.ts +6 -0
- package/dist/orgs/orgs.module.js +68 -0
- package/dist/orgs/orgs.service.d.ts +30 -19
- package/dist/orgs/orgs.service.js +139 -86
- package/dist/orgs/settings.controller.d.ts +1 -1
- package/dist/orgs/settings.controller.js +8 -6
- package/dist/orgs/settings.service.d.ts +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 -137
- 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 -226
- 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 -100
- 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 +2 -1
- 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 +9 -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,9 +1,27 @@
|
|
|
1
|
-
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
8
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
9
|
+
};
|
|
10
|
+
import { getQueueToken } from "@nestjs/bullmq";
|
|
11
|
+
import { Inject, Injectable, Module, Optional } from "@nestjs/common";
|
|
12
|
+
import { DelayedError, Job, UnrecoverableError, } from "bullmq";
|
|
2
13
|
import { sql } from "kysely";
|
|
3
14
|
import { enabledExtensionsQuery } from "../extensions/enabled.js";
|
|
15
|
+
import { ExtensionsModule } from "../extensions/extensions.module.js";
|
|
4
16
|
import { deepFreeze, errMsg } from "../extensions/hooks.js";
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
17
|
+
import { ExtensionHost } from "../extensions/host.js";
|
|
18
|
+
import { STALE_RECONCILE_PERIODS } from "../extensions/lifecycle-topics.js";
|
|
19
|
+
import { KernelConfigService } from "../infra/config/kernel-config.service.js";
|
|
20
|
+
import { KernelDb } from "../infra/database/kernel-db.js";
|
|
21
|
+
import { LockService } from "../infra/lock/lock.service.js";
|
|
22
|
+
import { QueueModule } from "../infra/queue/queue.module.js";
|
|
23
|
+
import { LockedCron } from "../infra/schedule/locked-cron.decorator.js";
|
|
24
|
+
import { KERNEL_LOGGER } from "../infra/tokens.js";
|
|
7
25
|
/** Queue of `usage.report` deliveries (no `:` in the name). */
|
|
8
26
|
export const USAGE_REPORT_QUEUE = "cap-kernel-usage-report";
|
|
9
27
|
/** One job per `usage` event (no `:`: conversation ids are UUIDs, seq is a number). */
|
|
@@ -12,6 +30,8 @@ export const usageReportJobId = (conversationId, seq) => `usage-${conversationId
|
|
|
12
30
|
export const USAGE_REPORT_ATTEMPTS = 6;
|
|
13
31
|
/** Retry backoff: 2 s, doubling (2, 4, 8, 16, 32 s). */
|
|
14
32
|
export const USAGE_REPORT_BACKOFF_MS = 2000;
|
|
33
|
+
/** Optional provider: the {@link UsageReportRetry} instead of the defaults above (tests). */
|
|
34
|
+
export const USAGE_REPORT_RETRY = Symbol("USAGE_REPORT_RETRY");
|
|
15
35
|
/** Failed jobs (given up) are kept for inspection, at most {@link KEEP_FAILED_MAX} of them. */
|
|
16
36
|
const KEEP_FAILED_S = 7 * 86_400;
|
|
17
37
|
/** Upper bound on kept failed jobs (I-2): a long outage of a billing endpoint cannot grow Redis. */
|
|
@@ -23,10 +43,10 @@ const WARN_WINDOW_MS = 60_000;
|
|
|
23
43
|
* ~1.1 usage events per second sustained for a day; dedupe needs the jobs only for the sweeper overlap.
|
|
24
44
|
*/
|
|
25
45
|
const KEEP_COMPLETED_MAX = 100_000;
|
|
26
|
-
/**
|
|
46
|
+
/** The sweeper's cron job name (no `:`; every minute, once across replicas). */
|
|
27
47
|
export const USAGE_SWEEP_JOB = "usage-report-sweep";
|
|
28
|
-
|
|
29
|
-
export
|
|
48
|
+
/** The maintenance scheduler the sweep ran on before it became a `@LockedCron` (retired). */
|
|
49
|
+
export { USAGE_SWEEP_SCHEDULER_ID } from "./job-ids.js";
|
|
30
50
|
/** The sweep leaves the newest events to the fast path (and to transactions still committing). */
|
|
31
51
|
export const USAGE_SWEEP_LAG_MS = 30_000;
|
|
32
52
|
/**
|
|
@@ -143,24 +163,74 @@ export function narrowPending(stored, failed) {
|
|
|
143
163
|
* as are conversation title calls (`purpose: "title"`, no run: `runId` is "").
|
|
144
164
|
* Single-step eval replays and judge requests log no usage: not reported (M7).
|
|
145
165
|
*/
|
|
146
|
-
|
|
147
|
-
|
|
166
|
+
let UsageReporter = class UsageReporter {
|
|
167
|
+
kdb;
|
|
148
168
|
queue;
|
|
149
|
-
|
|
169
|
+
host;
|
|
170
|
+
config;
|
|
171
|
+
locks;
|
|
172
|
+
log;
|
|
173
|
+
retry;
|
|
150
174
|
worker;
|
|
151
|
-
workerConn;
|
|
152
175
|
closed = false;
|
|
153
176
|
stopping = new AbortController();
|
|
154
|
-
constructor(
|
|
155
|
-
|
|
177
|
+
constructor(kdb, queue,
|
|
178
|
+
/**
|
|
179
|
+
* The host's hook registry: handlers of the current local plugin generations (through
|
|
180
|
+
* inflight.run), and `has("usage.report")`, the in-process check that lets `enqueue` skip all
|
|
181
|
+
* I/O without handlers; and whether a plugin's current instance is active here.
|
|
182
|
+
*/
|
|
183
|
+
host, config,
|
|
184
|
+
/** The warning throttle's markers (`capk:usage-warn:<plugin>:<kind>`, SET NX PX). */
|
|
185
|
+
locks, log, retry = {
|
|
186
|
+
attempts: USAGE_REPORT_ATTEMPTS,
|
|
187
|
+
backoffMs: USAGE_REPORT_BACKOFF_MS,
|
|
188
|
+
}) {
|
|
189
|
+
this.kdb = kdb;
|
|
190
|
+
this.queue = queue;
|
|
191
|
+
this.host = host;
|
|
192
|
+
this.config = config;
|
|
193
|
+
this.locks = locks;
|
|
194
|
+
this.log = log;
|
|
195
|
+
this.retry = retry;
|
|
196
|
+
queue.on("error", (err) => this.log.error("usage report queue error", { err }));
|
|
197
|
+
}
|
|
198
|
+
get db() {
|
|
199
|
+
return this.kdb.db;
|
|
200
|
+
}
|
|
201
|
+
get hooks() {
|
|
202
|
+
return this.host.hooks;
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Whether the plugin's current instance is active on this replica (I-2): an active instance that
|
|
206
|
+
* registered no `usage.report` handler is not a subscriber, and its target is dropped.
|
|
207
|
+
*/
|
|
208
|
+
isActive(plugin) {
|
|
209
|
+
return this.host.current(plugin) !== undefined;
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* Of these plugins, the ones no replica can serve right now (I-2): replicas report them (live
|
|
213
|
+
* `extension_replica_status` rows) and none has them loaded. Their targets are dropped at once
|
|
214
|
+
* instead of failing every attempt. See {@link queryUnservable}.
|
|
215
|
+
*/
|
|
216
|
+
unservable(plugins) {
|
|
217
|
+
return queryUnservable(this.db, plugins, STALE_RECONCILE_PERIODS * this.config.get().extensionHost.reconcileIntervalSeconds);
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* Plugins that subscribe to `usage.report`, from deployment state (approved manifests in PG),
|
|
221
|
+
* not from this replica's loaded handlers. With `orgId`: only those the organization enabled.
|
|
222
|
+
* See {@link queryUsageSubscribers}.
|
|
223
|
+
*/
|
|
224
|
+
subscribers(orgId) {
|
|
225
|
+
return queryUsageSubscribers(this.db, orgId);
|
|
156
226
|
}
|
|
157
227
|
jobOpts(conversationId, seq) {
|
|
158
228
|
return {
|
|
159
229
|
jobId: usageReportJobId(conversationId, seq),
|
|
160
|
-
attempts: this.
|
|
161
|
-
backoff: { type: "exponential", delay: this.
|
|
230
|
+
attempts: this.retry.attempts,
|
|
231
|
+
backoff: { type: "exponential", delay: this.retry.backoffMs },
|
|
162
232
|
removeOnComplete: {
|
|
163
|
-
age: this.
|
|
233
|
+
age: this.config.get().hooks.usageReportKeepHours * 3600,
|
|
164
234
|
count: KEEP_COMPLETED_MAX,
|
|
165
235
|
},
|
|
166
236
|
removeOnFail: { age: KEEP_FAILED_S, count: KEEP_FAILED_MAX },
|
|
@@ -175,15 +245,15 @@ export class UsageReporter {
|
|
|
175
245
|
return;
|
|
176
246
|
// M-2: no usage.report handler on this replica → no I/O at all. A plugin loaded only on other
|
|
177
247
|
// replicas still gets the event: the sweeper re-offers it within about a minute and a half.
|
|
178
|
-
if (!this.
|
|
248
|
+
if (!this.hooks.has("usage.report"))
|
|
179
249
|
return;
|
|
180
250
|
try {
|
|
181
|
-
if ((await this.
|
|
251
|
+
if ((await this.subscribers()).size === 0)
|
|
182
252
|
return;
|
|
183
|
-
await this.
|
|
253
|
+
await this.queue.add(JOB, { conversationId, seq }, this.jobOpts(conversationId, seq));
|
|
184
254
|
}
|
|
185
255
|
catch (err) {
|
|
186
|
-
this.
|
|
256
|
+
this.log.warn("cannot enqueue usage report", { conversationId, seq, err });
|
|
187
257
|
}
|
|
188
258
|
}
|
|
189
259
|
/**
|
|
@@ -196,20 +266,20 @@ export class UsageReporter {
|
|
|
196
266
|
// unless a test fixes "now" (m-a, m-c)
|
|
197
267
|
const to = opts.now !== undefined
|
|
198
268
|
? new Date(opts.now - USAGE_SWEEP_LAG_MS).toISOString()
|
|
199
|
-
: (await sql `SELECT (now() - make_interval(secs => ${USAGE_SWEEP_LAG_MS / 1000}))::text AS to`.execute(this.
|
|
269
|
+
: (await sql `SELECT (now() - make_interval(secs => ${USAGE_SWEEP_LAG_MS / 1000}))::text AS to`.execute(this.db)).rows[0]?.to;
|
|
200
270
|
if (to === undefined)
|
|
201
271
|
return 0;
|
|
202
|
-
const row = await this.
|
|
272
|
+
const row = await this.db
|
|
203
273
|
.selectFrom("usage_report_sweep")
|
|
204
274
|
.select(sql `watermark::text`.as("watermark"))
|
|
205
275
|
.where("id", "=", 1)
|
|
206
276
|
.executeTakeFirst();
|
|
207
277
|
const watermark = row?.watermark ?? to;
|
|
208
278
|
let offered = 0;
|
|
209
|
-
if ((await this.
|
|
279
|
+
if ((await this.subscribers()).size > 0) {
|
|
210
280
|
let after;
|
|
211
281
|
for (;;) {
|
|
212
|
-
let q = this.
|
|
282
|
+
let q = this.db
|
|
213
283
|
.selectFrom("conversation_events")
|
|
214
284
|
.select(["conversation_id", "seq", sql `created_at::text`.as("at")])
|
|
215
285
|
.where("type", "=", "usage")
|
|
@@ -225,7 +295,7 @@ export class UsageReporter {
|
|
|
225
295
|
.limit(SWEEP_PAGE)
|
|
226
296
|
.execute();
|
|
227
297
|
if (page.length > 0) {
|
|
228
|
-
await this.
|
|
298
|
+
await this.queue.addBulk(page.map((r) => ({
|
|
229
299
|
name: JOB,
|
|
230
300
|
data: { conversationId: r.conversation_id, seq: Number(r.seq) },
|
|
231
301
|
opts: this.jobOpts(r.conversation_id, Number(r.seq)),
|
|
@@ -238,7 +308,7 @@ export class UsageReporter {
|
|
|
238
308
|
after = { at: last.at, conv: last.conversation_id, seq: String(last.seq) };
|
|
239
309
|
}
|
|
240
310
|
}
|
|
241
|
-
await this.
|
|
311
|
+
await this.db
|
|
242
312
|
.insertInto("usage_report_sweep")
|
|
243
313
|
.values({ id: 1, watermark: sql `${to}::timestamptz` })
|
|
244
314
|
.onConflict((oc) => oc.column("id").doUpdateSet({
|
|
@@ -248,75 +318,55 @@ export class UsageReporter {
|
|
|
248
318
|
.execute();
|
|
249
319
|
return offered;
|
|
250
320
|
}
|
|
251
|
-
/**
|
|
252
|
-
|
|
321
|
+
/**
|
|
322
|
+
* Starts consuming (worker role only): `worker` is the `@Processor` worker of
|
|
323
|
+
* {@link USAGE_REPORT_QUEUE} (built with the run queue's job lock and stalled detection).
|
|
324
|
+
*/
|
|
325
|
+
startWorker(worker) {
|
|
253
326
|
if (this.worker || this.closed)
|
|
254
327
|
return;
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
this.
|
|
261
|
-
connection: this.workerConn,
|
|
262
|
-
concurrency: this.d.config().hooks.usageReportConcurrency,
|
|
263
|
-
lockDuration: jobLockMs,
|
|
264
|
-
stalledInterval: stalledIntervalMs,
|
|
265
|
-
maxStalledCount: 3,
|
|
266
|
-
});
|
|
267
|
-
this.worker.on("error", (err) => this.d.log.error("usage report worker error", { err }));
|
|
268
|
-
this.worker.on("failed", (j, err) => {
|
|
269
|
-
if (!j || err instanceof DelayedError || err.name === "DelayedError")
|
|
270
|
-
return;
|
|
271
|
-
// a definite drop (N-3) was already warned about (throttled); the failed job is the trace
|
|
272
|
-
if (err instanceof UnrecoverableError || err.name === "UnrecoverableError")
|
|
273
|
-
return;
|
|
274
|
-
const final = j.attemptsMade >= (j.opts.attempts ?? 1);
|
|
275
|
-
const fields = {
|
|
276
|
-
jobId: j.id,
|
|
277
|
-
conversationId: j.data.conversationId,
|
|
278
|
-
seq: j.data.seq,
|
|
279
|
-
pending: j.data.pending,
|
|
280
|
-
attempt: j.attemptsMade,
|
|
281
|
-
error: err.message,
|
|
282
|
-
};
|
|
283
|
-
if (final)
|
|
284
|
-
this.d.log.error("usage report given up after retries", fields);
|
|
285
|
-
else
|
|
286
|
-
this.d.log.warn("usage report attempt failed; retrying", fields);
|
|
287
|
-
});
|
|
328
|
+
this.worker = worker;
|
|
329
|
+
void worker.run().catch((err) => this.log.error("usage report worker error", { err }));
|
|
330
|
+
}
|
|
331
|
+
/** The worker's `error` event. */
|
|
332
|
+
onError(err) {
|
|
333
|
+
this.log.error("usage report worker error", { err });
|
|
288
334
|
}
|
|
289
|
-
/**
|
|
335
|
+
/** A job failed (the worker's `failed` event): logs retries and the final failure. */
|
|
336
|
+
onFailed(j, err) {
|
|
337
|
+
if (!j || err instanceof DelayedError || err.name === "DelayedError")
|
|
338
|
+
return;
|
|
339
|
+
// a definite drop (N-3) was already warned about (throttled); the failed job is the trace
|
|
340
|
+
if (err instanceof UnrecoverableError || err.name === "UnrecoverableError")
|
|
341
|
+
return;
|
|
342
|
+
const final = j.attemptsMade >= (j.opts.attempts ?? 1);
|
|
343
|
+
const fields = {
|
|
344
|
+
jobId: j.id,
|
|
345
|
+
conversationId: j.data.conversationId,
|
|
346
|
+
seq: j.data.seq,
|
|
347
|
+
pending: j.data.pending,
|
|
348
|
+
attempt: j.attemptsMade,
|
|
349
|
+
error: err.message,
|
|
350
|
+
};
|
|
351
|
+
if (final)
|
|
352
|
+
this.log.error("usage report given up after retries", fields);
|
|
353
|
+
else
|
|
354
|
+
this.log.warn("usage report attempt failed; retrying", fields);
|
|
355
|
+
}
|
|
356
|
+
/**
|
|
357
|
+
* Stops: no more enqueues, in-flight calls are aborted (their jobs requeued) and the worker
|
|
358
|
+
* closes. The queue itself closes with the application.
|
|
359
|
+
*/
|
|
290
360
|
async stop() {
|
|
291
361
|
this.closed = true;
|
|
292
362
|
this.stopping.abort();
|
|
293
363
|
const w = this.worker;
|
|
294
364
|
this.worker = undefined;
|
|
295
|
-
// the worker first: its in-flight jobs still use the queue to fence and requeue
|
|
296
365
|
await w?.close().catch(() => { });
|
|
297
|
-
const q = this.queue;
|
|
298
|
-
this.queue = undefined;
|
|
299
|
-
await q?.close().catch(() => { });
|
|
300
|
-
for (const c of [this.workerConn, this.queueConn]) {
|
|
301
|
-
if (c)
|
|
302
|
-
await c.quit().catch(() => c.disconnect());
|
|
303
|
-
}
|
|
304
|
-
this.workerConn = undefined;
|
|
305
|
-
this.queueConn = undefined;
|
|
306
|
-
}
|
|
307
|
-
getQueue() {
|
|
308
|
-
if (!this.queue) {
|
|
309
|
-
if (this.closed)
|
|
310
|
-
throw new Error("usage report queue is closed");
|
|
311
|
-
this.queueConn = bullConnection(this.d.redisUrl, this.d.log);
|
|
312
|
-
this.queue = new Queue(USAGE_REPORT_QUEUE, { connection: this.queueConn });
|
|
313
|
-
this.queue.on("error", (err) => this.d.log.error("usage report queue error", { err }));
|
|
314
|
-
}
|
|
315
|
-
return this.queue;
|
|
316
366
|
}
|
|
317
367
|
/** The payload of one usage event, read from the log; null when the event no longer exists. */
|
|
318
368
|
async payloadOf(conversationId, seq) {
|
|
319
|
-
const row = await this.
|
|
369
|
+
const row = await this.db
|
|
320
370
|
.selectFrom("conversation_events as e")
|
|
321
371
|
.innerJoin("conversations as c", "c.id", "e.conversation_id")
|
|
322
372
|
.leftJoin("runs as r", "r.id", "e.run_id")
|
|
@@ -378,7 +428,7 @@ export class UsageReporter {
|
|
|
378
428
|
* dropped can stay, so a plugin another execution delivered never comes back.
|
|
379
429
|
*/
|
|
380
430
|
async writePending(j, next, dropped) {
|
|
381
|
-
const fresh = j.id === undefined ? undefined : await Job.fromId(this.
|
|
431
|
+
const fresh = j.id === undefined ? undefined : await Job.fromId(this.queue, j.id);
|
|
382
432
|
const data = fresh?.data;
|
|
383
433
|
const stored = data?.pending ?? j.data.pending;
|
|
384
434
|
const storedDropped = data?.dropped ?? j.data.dropped ?? {};
|
|
@@ -393,12 +443,13 @@ export class UsageReporter {
|
|
|
393
443
|
await j.updateData(out);
|
|
394
444
|
j.data = out;
|
|
395
445
|
}
|
|
446
|
+
/** One delivery job (the `@Processor` of {@link USAGE_REPORT_QUEUE} calls it). */
|
|
396
447
|
async process(j, token) {
|
|
397
448
|
const { conversationId, seq } = j.data;
|
|
398
449
|
const payload = await this.payloadOf(conversationId, seq);
|
|
399
450
|
if (payload === null)
|
|
400
451
|
return; // conversation deleted meanwhile: nothing to report
|
|
401
|
-
const subscribers = await this.
|
|
452
|
+
const subscribers = await this.subscribers(payload.orgId);
|
|
402
453
|
if (j.data.pending === undefined) {
|
|
403
454
|
// first attempt: the targets come from deployment state, recorded so later attempts (on any
|
|
404
455
|
// replica) deliver exactly the plugins that have not succeeded yet
|
|
@@ -411,15 +462,15 @@ export class UsageReporter {
|
|
|
411
462
|
if (targets.length === 0)
|
|
412
463
|
return;
|
|
413
464
|
const byPlugin = new Map();
|
|
414
|
-
for (const h of this.
|
|
465
|
+
for (const h of this.hooks.handlers("usage.report")) {
|
|
415
466
|
byPlugin.set(h.plugin, [...(byPlugin.get(h.plugin) ?? []), h.handler]);
|
|
416
467
|
}
|
|
417
468
|
const frozen = deepFreeze(structuredClone(payload));
|
|
418
|
-
const timeoutMs = this.
|
|
469
|
+
const timeoutMs = this.config.get().hooks.timeoutMs;
|
|
419
470
|
const results = await Promise.allSettled(targets.map(async (plugin) => {
|
|
420
471
|
const handlers = byPlugin.get(plugin);
|
|
421
472
|
if (!handlers || handlers.length === 0) {
|
|
422
|
-
throw new Undeliverable(plugin, this.
|
|
473
|
+
throw new Undeliverable(plugin, this.isActive(plugin) ? "no_handler" : "not_loaded");
|
|
423
474
|
}
|
|
424
475
|
for (const h of handlers)
|
|
425
476
|
await this.call(h, frozen, timeoutMs);
|
|
@@ -443,7 +494,7 @@ export class UsageReporter {
|
|
|
443
494
|
}
|
|
444
495
|
failed.push(plugin);
|
|
445
496
|
if (!this.stopping.signal.aborted) {
|
|
446
|
-
this.
|
|
497
|
+
this.log.warn("usage.report delivery to a plugin failed", {
|
|
447
498
|
plugin,
|
|
448
499
|
eventId: payload.eventId,
|
|
449
500
|
error: errMsg(r.reason),
|
|
@@ -454,7 +505,7 @@ export class UsageReporter {
|
|
|
454
505
|
// target is dropped only when it is definitely unservable; unknown ones fail the job as before.
|
|
455
506
|
const final = j.attemptsMade + 1 >= (j.opts.attempts ?? 1);
|
|
456
507
|
const gone = final && notHere.length > 0 && !this.stopping.signal.aborted
|
|
457
|
-
? await this.
|
|
508
|
+
? await this.unservableOrNone(notHere)
|
|
458
509
|
: new Set();
|
|
459
510
|
for (const plugin of notHere) {
|
|
460
511
|
if (gone.has(plugin))
|
|
@@ -496,15 +547,13 @@ export class UsageReporter {
|
|
|
496
547
|
}
|
|
497
548
|
throw new UnrecoverableError(`usage.report delivered to the rest;${droppedNote(traced)}`);
|
|
498
549
|
}
|
|
499
|
-
/** {@link
|
|
500
|
-
async
|
|
501
|
-
if (!this.d.unservable)
|
|
502
|
-
return new Set();
|
|
550
|
+
/** {@link unservable}; a lookup failure counts as "unknown" (keep retrying). */
|
|
551
|
+
async unservableOrNone(plugins) {
|
|
503
552
|
try {
|
|
504
|
-
return await this.
|
|
553
|
+
return await this.unservable(plugins);
|
|
505
554
|
}
|
|
506
555
|
catch (err) {
|
|
507
|
-
this.
|
|
556
|
+
this.log.warn("cannot read plugin replica status for usage.report", { err });
|
|
508
557
|
return new Set();
|
|
509
558
|
}
|
|
510
559
|
}
|
|
@@ -512,15 +561,13 @@ export class UsageReporter {
|
|
|
512
561
|
async warnOnce(plugin, kind, msg, fields) {
|
|
513
562
|
let first = true;
|
|
514
563
|
try {
|
|
515
|
-
this.
|
|
516
|
-
const key = `capk:usage-warn:${plugin}:${kind}`;
|
|
517
|
-
first = (await this.queueConn?.set(key, "1", "PX", WARN_WINDOW_MS, "NX")) !== null;
|
|
564
|
+
first = await this.locks.lease(`capk:usage-warn:${plugin}:${kind}`, "1", WARN_WINDOW_MS);
|
|
518
565
|
}
|
|
519
566
|
catch {
|
|
520
567
|
// Redis unavailable: log anyway rather than hiding it
|
|
521
568
|
}
|
|
522
569
|
if (first)
|
|
523
|
-
this.
|
|
570
|
+
this.log.warn(msg, fields);
|
|
524
571
|
}
|
|
525
572
|
/** One handler call with its own signal (timeout or replica stop aborts it); rejects on either. */
|
|
526
573
|
async call(h, payload, timeoutMs) {
|
|
@@ -548,4 +595,57 @@ export class UsageReporter {
|
|
|
548
595
|
this.stopping.signal.removeEventListener("abort", onStop);
|
|
549
596
|
}
|
|
550
597
|
}
|
|
551
|
-
}
|
|
598
|
+
};
|
|
599
|
+
UsageReporter = __decorate([
|
|
600
|
+
Injectable(),
|
|
601
|
+
__param(0, Inject(KernelDb)),
|
|
602
|
+
__param(1, Inject(getQueueToken(USAGE_REPORT_QUEUE))),
|
|
603
|
+
__param(2, Inject(ExtensionHost)),
|
|
604
|
+
__param(3, Inject(KernelConfigService)),
|
|
605
|
+
__param(4, Inject(LockService)),
|
|
606
|
+
__param(5, Inject(KERNEL_LOGGER)),
|
|
607
|
+
__param(6, Optional()),
|
|
608
|
+
__param(6, Inject(USAGE_REPORT_RETRY))
|
|
609
|
+
], UsageReporter);
|
|
610
|
+
export { UsageReporter };
|
|
611
|
+
/**
|
|
612
|
+
* The usage sweeper (R13), every minute, once across replicas: {@link UsageReporter.sweep}.
|
|
613
|
+
* Replaces the maintenance scheduler `usage-report-sweep-every` (retired at worker start).
|
|
614
|
+
*/
|
|
615
|
+
let UsageSweepJob = class UsageSweepJob {
|
|
616
|
+
reporter;
|
|
617
|
+
lockService;
|
|
618
|
+
log;
|
|
619
|
+
constructor(reporter, lockService, log) {
|
|
620
|
+
this.reporter = reporter;
|
|
621
|
+
this.lockService = lockService;
|
|
622
|
+
this.log = log;
|
|
623
|
+
}
|
|
624
|
+
async run() {
|
|
625
|
+
await this.reporter.sweep();
|
|
626
|
+
}
|
|
627
|
+
};
|
|
628
|
+
__decorate([
|
|
629
|
+
LockedCron("* * * * *", { name: USAGE_SWEEP_JOB })
|
|
630
|
+
], UsageSweepJob.prototype, "run", null);
|
|
631
|
+
UsageSweepJob = __decorate([
|
|
632
|
+
Injectable(),
|
|
633
|
+
__param(0, Inject(UsageReporter)),
|
|
634
|
+
__param(1, Inject(LockService)),
|
|
635
|
+
__param(2, Inject(KERNEL_LOGGER))
|
|
636
|
+
], UsageSweepJob);
|
|
637
|
+
export { UsageSweepJob };
|
|
638
|
+
/**
|
|
639
|
+
* `usage.report` delivery: the producer on every role; the consumer and the sweep ({@link UsageSweepJob})
|
|
640
|
+
* on the worker role (`WorkerModule`).
|
|
641
|
+
*/
|
|
642
|
+
let UsageReportModule = class UsageReportModule {
|
|
643
|
+
};
|
|
644
|
+
UsageReportModule = __decorate([
|
|
645
|
+
Module({
|
|
646
|
+
imports: [ExtensionsModule, QueueModule.registerQueue(USAGE_REPORT_QUEUE)],
|
|
647
|
+
providers: [UsageReporter],
|
|
648
|
+
exports: [UsageReporter],
|
|
649
|
+
})
|
|
650
|
+
], UsageReportModule);
|
|
651
|
+
export { UsageReportModule };
|