@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,8 +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 {
|
|
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";
|
|
6
25
|
/** Queue of `usage.report` deliveries (no `:` in the name). */
|
|
7
26
|
export const USAGE_REPORT_QUEUE = "cap-kernel-usage-report";
|
|
8
27
|
/** One job per `usage` event (no `:`: conversation ids are UUIDs, seq is a number). */
|
|
@@ -11,6 +30,8 @@ export const usageReportJobId = (conversationId, seq) => `usage-${conversationId
|
|
|
11
30
|
export const USAGE_REPORT_ATTEMPTS = 6;
|
|
12
31
|
/** Retry backoff: 2 s, doubling (2, 4, 8, 16, 32 s). */
|
|
13
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");
|
|
14
35
|
/** Failed jobs (given up) are kept for inspection, at most {@link KEEP_FAILED_MAX} of them. */
|
|
15
36
|
const KEEP_FAILED_S = 7 * 86_400;
|
|
16
37
|
/** Upper bound on kept failed jobs (I-2): a long outage of a billing endpoint cannot grow Redis. */
|
|
@@ -22,10 +43,10 @@ const WARN_WINDOW_MS = 60_000;
|
|
|
22
43
|
* ~1.1 usage events per second sustained for a day; dedupe needs the jobs only for the sweeper overlap.
|
|
23
44
|
*/
|
|
24
45
|
const KEEP_COMPLETED_MAX = 100_000;
|
|
25
|
-
/**
|
|
46
|
+
/** The sweeper's cron job name (no `:`; every minute, once across replicas). */
|
|
26
47
|
export const USAGE_SWEEP_JOB = "usage-report-sweep";
|
|
27
|
-
|
|
28
|
-
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";
|
|
29
50
|
/** The sweep leaves the newest events to the fast path (and to transactions still committing). */
|
|
30
51
|
export const USAGE_SWEEP_LAG_MS = 30_000;
|
|
31
52
|
/**
|
|
@@ -142,24 +163,74 @@ export function narrowPending(stored, failed) {
|
|
|
142
163
|
* as are conversation title calls (`purpose: "title"`, no run: `runId` is "").
|
|
143
164
|
* Single-step eval replays and judge requests log no usage: not reported (M7).
|
|
144
165
|
*/
|
|
145
|
-
|
|
146
|
-
|
|
166
|
+
let UsageReporter = class UsageReporter {
|
|
167
|
+
kdb;
|
|
147
168
|
queue;
|
|
148
|
-
|
|
169
|
+
host;
|
|
170
|
+
config;
|
|
171
|
+
locks;
|
|
172
|
+
log;
|
|
173
|
+
retry;
|
|
149
174
|
worker;
|
|
150
|
-
workerConn;
|
|
151
175
|
closed = false;
|
|
152
176
|
stopping = new AbortController();
|
|
153
|
-
constructor(
|
|
154
|
-
|
|
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);
|
|
155
226
|
}
|
|
156
227
|
jobOpts(conversationId, seq) {
|
|
157
228
|
return {
|
|
158
229
|
jobId: usageReportJobId(conversationId, seq),
|
|
159
|
-
attempts: this.
|
|
160
|
-
backoff: { type: "exponential", delay: this.
|
|
230
|
+
attempts: this.retry.attempts,
|
|
231
|
+
backoff: { type: "exponential", delay: this.retry.backoffMs },
|
|
161
232
|
removeOnComplete: {
|
|
162
|
-
age: this.
|
|
233
|
+
age: this.config.get().hooks.usageReportKeepHours * 3600,
|
|
163
234
|
count: KEEP_COMPLETED_MAX,
|
|
164
235
|
},
|
|
165
236
|
removeOnFail: { age: KEEP_FAILED_S, count: KEEP_FAILED_MAX },
|
|
@@ -174,15 +245,15 @@ export class UsageReporter {
|
|
|
174
245
|
return;
|
|
175
246
|
// M-2: no usage.report handler on this replica → no I/O at all. A plugin loaded only on other
|
|
176
247
|
// replicas still gets the event: the sweeper re-offers it within about a minute and a half.
|
|
177
|
-
if (!this.
|
|
248
|
+
if (!this.hooks.has("usage.report"))
|
|
178
249
|
return;
|
|
179
250
|
try {
|
|
180
|
-
if ((await this.
|
|
251
|
+
if ((await this.subscribers()).size === 0)
|
|
181
252
|
return;
|
|
182
|
-
await this.
|
|
253
|
+
await this.queue.add(JOB, { conversationId, seq }, this.jobOpts(conversationId, seq));
|
|
183
254
|
}
|
|
184
255
|
catch (err) {
|
|
185
|
-
this.
|
|
256
|
+
this.log.warn("cannot enqueue usage report", { conversationId, seq, err });
|
|
186
257
|
}
|
|
187
258
|
}
|
|
188
259
|
/**
|
|
@@ -195,20 +266,20 @@ export class UsageReporter {
|
|
|
195
266
|
// unless a test fixes "now" (m-a, m-c)
|
|
196
267
|
const to = opts.now !== undefined
|
|
197
268
|
? new Date(opts.now - USAGE_SWEEP_LAG_MS).toISOString()
|
|
198
|
-
: (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;
|
|
199
270
|
if (to === undefined)
|
|
200
271
|
return 0;
|
|
201
|
-
const row = await this.
|
|
272
|
+
const row = await this.db
|
|
202
273
|
.selectFrom("usage_report_sweep")
|
|
203
274
|
.select(sql `watermark::text`.as("watermark"))
|
|
204
275
|
.where("id", "=", 1)
|
|
205
276
|
.executeTakeFirst();
|
|
206
277
|
const watermark = row?.watermark ?? to;
|
|
207
278
|
let offered = 0;
|
|
208
|
-
if ((await this.
|
|
279
|
+
if ((await this.subscribers()).size > 0) {
|
|
209
280
|
let after;
|
|
210
281
|
for (;;) {
|
|
211
|
-
let q = this.
|
|
282
|
+
let q = this.db
|
|
212
283
|
.selectFrom("conversation_events")
|
|
213
284
|
.select(["conversation_id", "seq", sql `created_at::text`.as("at")])
|
|
214
285
|
.where("type", "=", "usage")
|
|
@@ -224,7 +295,7 @@ export class UsageReporter {
|
|
|
224
295
|
.limit(SWEEP_PAGE)
|
|
225
296
|
.execute();
|
|
226
297
|
if (page.length > 0) {
|
|
227
|
-
await this.
|
|
298
|
+
await this.queue.addBulk(page.map((r) => ({
|
|
228
299
|
name: JOB,
|
|
229
300
|
data: { conversationId: r.conversation_id, seq: Number(r.seq) },
|
|
230
301
|
opts: this.jobOpts(r.conversation_id, Number(r.seq)),
|
|
@@ -237,7 +308,7 @@ export class UsageReporter {
|
|
|
237
308
|
after = { at: last.at, conv: last.conversation_id, seq: String(last.seq) };
|
|
238
309
|
}
|
|
239
310
|
}
|
|
240
|
-
await this.
|
|
311
|
+
await this.db
|
|
241
312
|
.insertInto("usage_report_sweep")
|
|
242
313
|
.values({ id: 1, watermark: sql `${to}::timestamptz` })
|
|
243
314
|
.onConflict((oc) => oc.column("id").doUpdateSet({
|
|
@@ -247,75 +318,55 @@ export class UsageReporter {
|
|
|
247
318
|
.execute();
|
|
248
319
|
return offered;
|
|
249
320
|
}
|
|
250
|
-
/**
|
|
251
|
-
|
|
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) {
|
|
252
326
|
if (this.worker || this.closed)
|
|
253
327
|
return;
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
this.
|
|
260
|
-
connection: this.workerConn,
|
|
261
|
-
concurrency: this.d.config().hooks.usageReportConcurrency,
|
|
262
|
-
lockDuration: jobLockMs,
|
|
263
|
-
stalledInterval: stalledIntervalMs,
|
|
264
|
-
maxStalledCount: 3,
|
|
265
|
-
});
|
|
266
|
-
this.worker.on("error", (err) => this.d.log.error("usage report worker error", { err }));
|
|
267
|
-
this.worker.on("failed", (j, err) => {
|
|
268
|
-
if (!j || err instanceof DelayedError || err.name === "DelayedError")
|
|
269
|
-
return;
|
|
270
|
-
// a definite drop (N-3) was already warned about (throttled); the failed job is the trace
|
|
271
|
-
if (err instanceof UnrecoverableError || err.name === "UnrecoverableError")
|
|
272
|
-
return;
|
|
273
|
-
const final = j.attemptsMade >= (j.opts.attempts ?? 1);
|
|
274
|
-
const fields = {
|
|
275
|
-
jobId: j.id,
|
|
276
|
-
conversationId: j.data.conversationId,
|
|
277
|
-
seq: j.data.seq,
|
|
278
|
-
pending: j.data.pending,
|
|
279
|
-
attempt: j.attemptsMade,
|
|
280
|
-
error: err.message,
|
|
281
|
-
};
|
|
282
|
-
if (final)
|
|
283
|
-
this.d.log.error("usage report given up after retries", fields);
|
|
284
|
-
else
|
|
285
|
-
this.d.log.warn("usage report attempt failed; retrying", fields);
|
|
286
|
-
});
|
|
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 });
|
|
287
334
|
}
|
|
288
|
-
/**
|
|
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
|
+
*/
|
|
289
360
|
async stop() {
|
|
290
361
|
this.closed = true;
|
|
291
362
|
this.stopping.abort();
|
|
292
363
|
const w = this.worker;
|
|
293
364
|
this.worker = undefined;
|
|
294
|
-
// the worker first: its in-flight jobs still use the queue to fence and requeue
|
|
295
365
|
await w?.close().catch(() => { });
|
|
296
|
-
const q = this.queue;
|
|
297
|
-
this.queue = undefined;
|
|
298
|
-
await q?.close().catch(() => { });
|
|
299
|
-
for (const c of [this.workerConn, this.queueConn]) {
|
|
300
|
-
if (c)
|
|
301
|
-
await c.quit().catch(() => c.disconnect());
|
|
302
|
-
}
|
|
303
|
-
this.workerConn = undefined;
|
|
304
|
-
this.queueConn = undefined;
|
|
305
|
-
}
|
|
306
|
-
getQueue() {
|
|
307
|
-
if (!this.queue) {
|
|
308
|
-
if (this.closed)
|
|
309
|
-
throw new Error("usage report queue is closed");
|
|
310
|
-
this.queueConn = bullConnection(this.d.redisUrl, this.d.log);
|
|
311
|
-
this.queue = new Queue(USAGE_REPORT_QUEUE, { connection: this.queueConn });
|
|
312
|
-
this.queue.on("error", (err) => this.d.log.error("usage report queue error", { err }));
|
|
313
|
-
}
|
|
314
|
-
return this.queue;
|
|
315
366
|
}
|
|
316
367
|
/** The payload of one usage event, read from the log; null when the event no longer exists. */
|
|
317
368
|
async payloadOf(conversationId, seq) {
|
|
318
|
-
const row = await this.
|
|
369
|
+
const row = await this.db
|
|
319
370
|
.selectFrom("conversation_events as e")
|
|
320
371
|
.innerJoin("conversations as c", "c.id", "e.conversation_id")
|
|
321
372
|
.leftJoin("runs as r", "r.id", "e.run_id")
|
|
@@ -377,7 +428,7 @@ export class UsageReporter {
|
|
|
377
428
|
* dropped can stay, so a plugin another execution delivered never comes back.
|
|
378
429
|
*/
|
|
379
430
|
async writePending(j, next, dropped) {
|
|
380
|
-
const fresh = j.id === undefined ? undefined : await Job.fromId(this.
|
|
431
|
+
const fresh = j.id === undefined ? undefined : await Job.fromId(this.queue, j.id);
|
|
381
432
|
const data = fresh?.data;
|
|
382
433
|
const stored = data?.pending ?? j.data.pending;
|
|
383
434
|
const storedDropped = data?.dropped ?? j.data.dropped ?? {};
|
|
@@ -392,12 +443,13 @@ export class UsageReporter {
|
|
|
392
443
|
await j.updateData(out);
|
|
393
444
|
j.data = out;
|
|
394
445
|
}
|
|
446
|
+
/** One delivery job (the `@Processor` of {@link USAGE_REPORT_QUEUE} calls it). */
|
|
395
447
|
async process(j, token) {
|
|
396
448
|
const { conversationId, seq } = j.data;
|
|
397
449
|
const payload = await this.payloadOf(conversationId, seq);
|
|
398
450
|
if (payload === null)
|
|
399
451
|
return; // conversation deleted meanwhile: nothing to report
|
|
400
|
-
const subscribers = await this.
|
|
452
|
+
const subscribers = await this.subscribers(payload.orgId);
|
|
401
453
|
if (j.data.pending === undefined) {
|
|
402
454
|
// first attempt: the targets come from deployment state, recorded so later attempts (on any
|
|
403
455
|
// replica) deliver exactly the plugins that have not succeeded yet
|
|
@@ -410,15 +462,15 @@ export class UsageReporter {
|
|
|
410
462
|
if (targets.length === 0)
|
|
411
463
|
return;
|
|
412
464
|
const byPlugin = new Map();
|
|
413
|
-
for (const h of this.
|
|
465
|
+
for (const h of this.hooks.handlers("usage.report")) {
|
|
414
466
|
byPlugin.set(h.plugin, [...(byPlugin.get(h.plugin) ?? []), h.handler]);
|
|
415
467
|
}
|
|
416
468
|
const frozen = deepFreeze(structuredClone(payload));
|
|
417
|
-
const timeoutMs = this.
|
|
469
|
+
const timeoutMs = this.config.get().hooks.timeoutMs;
|
|
418
470
|
const results = await Promise.allSettled(targets.map(async (plugin) => {
|
|
419
471
|
const handlers = byPlugin.get(plugin);
|
|
420
472
|
if (!handlers || handlers.length === 0) {
|
|
421
|
-
throw new Undeliverable(plugin, this.
|
|
473
|
+
throw new Undeliverable(plugin, this.isActive(plugin) ? "no_handler" : "not_loaded");
|
|
422
474
|
}
|
|
423
475
|
for (const h of handlers)
|
|
424
476
|
await this.call(h, frozen, timeoutMs);
|
|
@@ -442,7 +494,7 @@ export class UsageReporter {
|
|
|
442
494
|
}
|
|
443
495
|
failed.push(plugin);
|
|
444
496
|
if (!this.stopping.signal.aborted) {
|
|
445
|
-
this.
|
|
497
|
+
this.log.warn("usage.report delivery to a plugin failed", {
|
|
446
498
|
plugin,
|
|
447
499
|
eventId: payload.eventId,
|
|
448
500
|
error: errMsg(r.reason),
|
|
@@ -453,7 +505,7 @@ export class UsageReporter {
|
|
|
453
505
|
// target is dropped only when it is definitely unservable; unknown ones fail the job as before.
|
|
454
506
|
const final = j.attemptsMade + 1 >= (j.opts.attempts ?? 1);
|
|
455
507
|
const gone = final && notHere.length > 0 && !this.stopping.signal.aborted
|
|
456
|
-
? await this.
|
|
508
|
+
? await this.unservableOrNone(notHere)
|
|
457
509
|
: new Set();
|
|
458
510
|
for (const plugin of notHere) {
|
|
459
511
|
if (gone.has(plugin))
|
|
@@ -495,15 +547,13 @@ export class UsageReporter {
|
|
|
495
547
|
}
|
|
496
548
|
throw new UnrecoverableError(`usage.report delivered to the rest;${droppedNote(traced)}`);
|
|
497
549
|
}
|
|
498
|
-
/** {@link
|
|
499
|
-
async
|
|
500
|
-
if (!this.d.unservable)
|
|
501
|
-
return new Set();
|
|
550
|
+
/** {@link unservable}; a lookup failure counts as "unknown" (keep retrying). */
|
|
551
|
+
async unservableOrNone(plugins) {
|
|
502
552
|
try {
|
|
503
|
-
return await this.
|
|
553
|
+
return await this.unservable(plugins);
|
|
504
554
|
}
|
|
505
555
|
catch (err) {
|
|
506
|
-
this.
|
|
556
|
+
this.log.warn("cannot read plugin replica status for usage.report", { err });
|
|
507
557
|
return new Set();
|
|
508
558
|
}
|
|
509
559
|
}
|
|
@@ -511,15 +561,13 @@ export class UsageReporter {
|
|
|
511
561
|
async warnOnce(plugin, kind, msg, fields) {
|
|
512
562
|
let first = true;
|
|
513
563
|
try {
|
|
514
|
-
this.
|
|
515
|
-
const key = `capk:usage-warn:${plugin}:${kind}`;
|
|
516
|
-
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);
|
|
517
565
|
}
|
|
518
566
|
catch {
|
|
519
567
|
// Redis unavailable: log anyway rather than hiding it
|
|
520
568
|
}
|
|
521
569
|
if (first)
|
|
522
|
-
this.
|
|
570
|
+
this.log.warn(msg, fields);
|
|
523
571
|
}
|
|
524
572
|
/** One handler call with its own signal (timeout or replica stop aborts it); rejects on either. */
|
|
525
573
|
async call(h, payload, timeoutMs) {
|
|
@@ -547,4 +595,57 @@ export class UsageReporter {
|
|
|
547
595
|
this.stopping.signal.removeEventListener("abort", onStop);
|
|
548
596
|
}
|
|
549
597
|
}
|
|
550
|
-
}
|
|
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 };
|