@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
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
8
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
9
|
+
};
|
|
10
|
+
import { Inject, Injectable, } from "@nestjs/common";
|
|
11
|
+
import { DiscoveryService, MetadataScanner } from "@nestjs/core";
|
|
12
|
+
import { KernelConfigService } from "../config/kernel-config.service.js";
|
|
13
|
+
import { KERNEL_LOGGER } from "../tokens.js";
|
|
14
|
+
import { assertLockedJobHost, LOCKED_JOB, LOCKED_JOB_BODY, runLockedTick, startMarkerTtl, } from "./locked-tick.js";
|
|
15
|
+
const LOCKED_INTERVAL = Symbol("LOCKED_INTERVAL");
|
|
16
|
+
/** Timers may fire a little early; a call this close before a tick still belongs to it. */
|
|
17
|
+
const EARLY_TOLERANCE_MS = 50;
|
|
18
|
+
/** The tick a call at `now` belongs to: the latest multiple of the period at or before it. */
|
|
19
|
+
export function intervalTick(periodMs, now) {
|
|
20
|
+
const tolerance = Math.min(EARLY_TOLERANCE_MS, Math.floor(periodMs / 2));
|
|
21
|
+
return { tick: Math.floor((now + tolerance) / periodMs) * periodMs, periodMs };
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Like `@LockedCron`, for a job whose period comes from the config (a number of milliseconds that
|
|
25
|
+
* a cron expression cannot express, such as `extensionHost.reconcileIntervalSeconds`): every
|
|
26
|
+
* replica fires at the multiples of the period (epoch-aligned, so replicas agree on the tick), and
|
|
27
|
+
* the same two layers run the job exactly once per tick across replicas. The period is read when
|
|
28
|
+
* the application starts (like the old repeatable schedulers, not hot). The method gets
|
|
29
|
+
* the same signal as a `@LockedCron` job (the stop, or the loss of the run lock). The class must inject
|
|
30
|
+
* `lockService`, `log` and `config` (`KernelConfigService`); {@link LockedIntervalScheduler}
|
|
31
|
+
* schedules every decorated method of the application's providers.
|
|
32
|
+
*/
|
|
33
|
+
export function LockedInterval(name, period, options = {}) {
|
|
34
|
+
return (_target, _key, descriptor) => {
|
|
35
|
+
const original = descriptor.value;
|
|
36
|
+
const lockKey = options.lockKey ?? `cron:${name}`;
|
|
37
|
+
const wrapped = async function () {
|
|
38
|
+
assertLockedJobHost(this, "interval");
|
|
39
|
+
const config = this.config;
|
|
40
|
+
await runLockedTick(this, {
|
|
41
|
+
kind: "interval",
|
|
42
|
+
name,
|
|
43
|
+
lockKey,
|
|
44
|
+
ttl: options.ttl ?? 30_000,
|
|
45
|
+
tick: () => {
|
|
46
|
+
if (!config) {
|
|
47
|
+
throw new Error("@LockedInterval() needs the class to inject `KernelConfigService` as `config`.");
|
|
48
|
+
}
|
|
49
|
+
return intervalTick(period(config.get()), Date.now());
|
|
50
|
+
},
|
|
51
|
+
run: (signal) => Promise.resolve(original.call(this, signal)),
|
|
52
|
+
});
|
|
53
|
+
};
|
|
54
|
+
const start = async function () {
|
|
55
|
+
assertLockedJobHost(this, "interval");
|
|
56
|
+
const config = this.config;
|
|
57
|
+
await runLockedTick(this, {
|
|
58
|
+
kind: "interval",
|
|
59
|
+
name,
|
|
60
|
+
lockKey,
|
|
61
|
+
ttl: options.ttl ?? 30_000,
|
|
62
|
+
tick: () => {
|
|
63
|
+
throw new Error("a start run has no tick");
|
|
64
|
+
},
|
|
65
|
+
start: { ttlMs: startMarkerTtl(config ? period(config.get()) : 60_000) },
|
|
66
|
+
run: (signal) => Promise.resolve(original.call(this, signal)),
|
|
67
|
+
});
|
|
68
|
+
};
|
|
69
|
+
Reflect.defineMetadata(LOCKED_JOB, true, wrapped);
|
|
70
|
+
Reflect.defineMetadata(LOCKED_JOB_BODY, { name, body: original }, wrapped);
|
|
71
|
+
Reflect.defineMetadata(LOCKED_INTERVAL, { name, period, ...(options.runOnStart === true && { start }) }, wrapped);
|
|
72
|
+
descriptor.value = wrapped;
|
|
73
|
+
return descriptor;
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Schedules the `@LockedInterval` jobs of every provider at `onApplicationBootstrap` (each timer
|
|
78
|
+
* fires at the next multiple of the job's period, then re-arms) and stops them when the
|
|
79
|
+
* application stops (`ScheduledRuns` calls {@link stopAll} and waits for the runs in progress).
|
|
80
|
+
* One instance, in `KernelScheduleModule`.
|
|
81
|
+
*/
|
|
82
|
+
let LockedIntervalScheduler = class LockedIntervalScheduler {
|
|
83
|
+
discovery;
|
|
84
|
+
scanner;
|
|
85
|
+
config;
|
|
86
|
+
log;
|
|
87
|
+
timers = new Map();
|
|
88
|
+
periods = new Map();
|
|
89
|
+
startRuns = [];
|
|
90
|
+
stopped = false;
|
|
91
|
+
constructor(discovery, scanner, config, log) {
|
|
92
|
+
this.discovery = discovery;
|
|
93
|
+
this.scanner = scanner;
|
|
94
|
+
this.config = config;
|
|
95
|
+
this.log = log;
|
|
96
|
+
}
|
|
97
|
+
onApplicationBootstrap() {
|
|
98
|
+
for (const wrapper of this.discovery.getProviders()) {
|
|
99
|
+
const instance = wrapper.instance;
|
|
100
|
+
if (!instance || typeof instance !== "object" || !wrapper.isDependencyTreeStatic())
|
|
101
|
+
continue;
|
|
102
|
+
const proto = Object.getPrototypeOf(instance);
|
|
103
|
+
if (!proto)
|
|
104
|
+
continue;
|
|
105
|
+
for (const method of this.scanner.getAllMethodNames(proto)) {
|
|
106
|
+
const fn = instance[method];
|
|
107
|
+
if (typeof fn !== "function")
|
|
108
|
+
continue;
|
|
109
|
+
const meta = Reflect.getMetadata(LOCKED_INTERVAL, fn);
|
|
110
|
+
if (!meta)
|
|
111
|
+
continue;
|
|
112
|
+
if (this.timers.has(meta.name)) {
|
|
113
|
+
throw new Error(`@LockedInterval job name ${meta.name} is used twice`);
|
|
114
|
+
}
|
|
115
|
+
const periodMs = meta.period(this.config.get());
|
|
116
|
+
if (!Number.isFinite(periodMs) || periodMs < 100) {
|
|
117
|
+
throw new Error(`@LockedInterval job ${meta.name}: period ${periodMs} ms is too short`);
|
|
118
|
+
}
|
|
119
|
+
this.periods.set(meta.name, periodMs);
|
|
120
|
+
this.arm(meta.name, periodMs, () => fn.call(instance));
|
|
121
|
+
const start = meta.start;
|
|
122
|
+
if (start) {
|
|
123
|
+
this.startRuns.push({
|
|
124
|
+
name: meta.name,
|
|
125
|
+
run: () => start.call(instance),
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
/** The scheduled job names. */
|
|
132
|
+
names() {
|
|
133
|
+
return [...this.timers.keys()];
|
|
134
|
+
}
|
|
135
|
+
/** A scheduled job's period in ms (read from the config at bootstrap), undefined when unknown. */
|
|
136
|
+
periodOf(name) {
|
|
137
|
+
return this.periods.get(name);
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Starts the start runs of the `runOnStart` jobs in the background (each once across replicas
|
|
141
|
+
* starting together) and returns their promises. The kernel's worker role calls it right after it
|
|
142
|
+
* opened the start gate (`ScheduledRuns.open()`); later calls start nothing.
|
|
143
|
+
*/
|
|
144
|
+
runStartJobs() {
|
|
145
|
+
const runs = this.stopped ? [] : this.startRuns.splice(0);
|
|
146
|
+
return runs.map(({ name, run }) => run().catch((err) => this.log.error("interval start run failed", { job: name, err })));
|
|
147
|
+
}
|
|
148
|
+
/** Stops one job's timer (a run in progress finishes). */
|
|
149
|
+
stop(name) {
|
|
150
|
+
const t = this.timers.get(name);
|
|
151
|
+
if (t?.timer)
|
|
152
|
+
clearTimeout(t.timer);
|
|
153
|
+
this.timers.delete(name);
|
|
154
|
+
}
|
|
155
|
+
/** Stops every timer and drops the start runs not started yet (idempotent). */
|
|
156
|
+
stopAll() {
|
|
157
|
+
this.stopped = true;
|
|
158
|
+
this.startRuns.splice(0);
|
|
159
|
+
for (const name of [...this.timers.keys()])
|
|
160
|
+
this.stop(name);
|
|
161
|
+
}
|
|
162
|
+
onModuleDestroy() {
|
|
163
|
+
this.stopAll();
|
|
164
|
+
}
|
|
165
|
+
arm(name, periodMs, run) {
|
|
166
|
+
const slot = { timer: undefined };
|
|
167
|
+
this.timers.set(name, slot);
|
|
168
|
+
const next = () => {
|
|
169
|
+
const now = Date.now();
|
|
170
|
+
const at = (Math.floor(now / periodMs) + 1) * periodMs;
|
|
171
|
+
slot.timer = setTimeout(() => {
|
|
172
|
+
if (this.stopped || this.timers.get(name) !== slot)
|
|
173
|
+
return;
|
|
174
|
+
next();
|
|
175
|
+
// runLockedTick never throws for a job error; this catches only a missing host property
|
|
176
|
+
run().catch((err) => this.log.error("interval job failed", { job: name, err }));
|
|
177
|
+
}, at - now);
|
|
178
|
+
slot.timer.unref();
|
|
179
|
+
};
|
|
180
|
+
next();
|
|
181
|
+
}
|
|
182
|
+
};
|
|
183
|
+
LockedIntervalScheduler = __decorate([
|
|
184
|
+
Injectable(),
|
|
185
|
+
__param(0, Inject(DiscoveryService)),
|
|
186
|
+
__param(1, Inject(MetadataScanner)),
|
|
187
|
+
__param(2, Inject(KernelConfigService)),
|
|
188
|
+
__param(3, Inject(KERNEL_LOGGER))
|
|
189
|
+
], LockedIntervalScheduler);
|
|
190
|
+
export { LockedIntervalScheduler };
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import type { KernelLogger } from "../../log.js";
|
|
2
|
+
import type { LockService } from "../lock/lock.service.js";
|
|
3
|
+
/** Marks a method wrapped by `@LockedCron` / `@LockedInterval` (read by `ScheduledRuns`). */
|
|
4
|
+
export declare const LOCKED_JOB: unique symbol;
|
|
5
|
+
/**
|
|
6
|
+
* The job's name and its undecorated body, on the wrapped method: `ScheduledRuns.runNow` runs the
|
|
7
|
+
* body once outside the schedule.
|
|
8
|
+
*/
|
|
9
|
+
export declare const LOCKED_JOB_BODY: unique symbol;
|
|
10
|
+
/** What {@link LOCKED_JOB_BODY} holds. */
|
|
11
|
+
export interface LockedJobBody {
|
|
12
|
+
name: string;
|
|
13
|
+
body: (signal?: AbortSignal) => unknown;
|
|
14
|
+
}
|
|
15
|
+
/** The property `ScheduledRuns` attaches itself under on every instance with a locked job. */
|
|
16
|
+
export declare const SCHEDULED_RUNS: unique symbol;
|
|
17
|
+
/** The properties a class with a `@LockedCron` / `@LockedInterval` job must inject. */
|
|
18
|
+
export interface LockedJobHost {
|
|
19
|
+
lockService?: LockService;
|
|
20
|
+
log?: KernelLogger;
|
|
21
|
+
/** Attached by `ScheduledRuns` at module init (absent outside a Nest application). */
|
|
22
|
+
[SCHEDULED_RUNS]?: ScheduledRunScope;
|
|
23
|
+
}
|
|
24
|
+
/** What a locked job's run sees of `ScheduledRuns`: the stop state, the signal and the tracking. */
|
|
25
|
+
export interface ScheduledRunScope {
|
|
26
|
+
/**
|
|
27
|
+
* The start gate (decision R21 of the Nest kernel spec): false until the role that runs the jobs
|
|
28
|
+
* opened it (the kernel's worker role, after the extension load) and again once the stop began;
|
|
29
|
+
* no run starts while it is shut.
|
|
30
|
+
*/
|
|
31
|
+
readonly opened: boolean;
|
|
32
|
+
/** True once the stop began: no new run starts. */
|
|
33
|
+
readonly stopped: boolean;
|
|
34
|
+
/** Aborted when the stop begins; the job method's argument aborts with it. */
|
|
35
|
+
readonly signal: AbortSignal;
|
|
36
|
+
/** Registers a run the stop waits for (bounded); returns `p`. */
|
|
37
|
+
track<T>(p: Promise<T>): Promise<T>;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Throws when the class lacks `lockService` / `log` (a programming error, so the decorated call
|
|
41
|
+
* rejects); everything after this check is logged, never thrown.
|
|
42
|
+
*/
|
|
43
|
+
export declare function assertLockedJobHost(host: LockedJobHost, kind: "cron" | "interval"): void;
|
|
44
|
+
/** The tick marker's lifetime: two periods, at least 10 s, at most a day. */
|
|
45
|
+
export declare const tickMarkerTtl: (periodMs: number) => number;
|
|
46
|
+
/**
|
|
47
|
+
* The start marker's lifetime: replicas that start within this window (one period, at most a
|
|
48
|
+
* minute) run a `runOnStart` job once; a replica restarted after it runs it again, like the first
|
|
49
|
+
* run of a newly created repeatable scheduler.
|
|
50
|
+
*/
|
|
51
|
+
export declare const startMarkerTtl: (periodMs: number) => number;
|
|
52
|
+
/**
|
|
53
|
+
* Runs one scheduled tick of a job exactly once across replicas, in two layers:
|
|
54
|
+
* 1. one winner per tick: the replica that sets the per-tick marker `cron:<name>:<tick>` (never
|
|
55
|
+
* released, so a fast job on the winner does not let a slower replica run the same tick);
|
|
56
|
+
* 2. a try-once renewed run lock (`lockKey`), so a long run never overlaps the next tick's run.
|
|
57
|
+
* The others log INFO and skip. An error in the job is logged (never thrown into the scheduler)
|
|
58
|
+
* and the lock is released afterwards. The job starts in a fresh async context (no transaction).
|
|
59
|
+
*
|
|
60
|
+
* Inside a Nest application the run is tracked by `ScheduledRuns` (the stop aborts the signal the
|
|
61
|
+
* job gets and waits for the run, bounded) and no run starts before `ScheduledRuns.open()` (the
|
|
62
|
+
* timers are armed at application bootstrap, before the kernel's start sequence) or once the
|
|
63
|
+
* stop began; failures caused
|
|
64
|
+
* by the stop (an aborted job, a lock release after Redis closed) are logged at WARN / INFO. Only
|
|
65
|
+
* the host check rejects (see {@link assertLockedJobHost}).
|
|
66
|
+
*/
|
|
67
|
+
export declare function runLockedTick(host: LockedJobHost, o: {
|
|
68
|
+
kind: "cron" | "interval";
|
|
69
|
+
name: string;
|
|
70
|
+
lockKey: string;
|
|
71
|
+
ttl: number;
|
|
72
|
+
/** The tick (epoch ms) and the period it belongs to; thrown errors are logged as marker failures. */
|
|
73
|
+
tick: () => {
|
|
74
|
+
tick: number;
|
|
75
|
+
periodMs: number;
|
|
76
|
+
};
|
|
77
|
+
/**
|
|
78
|
+
* A start run (`@LockedInterval({ runOnStart })`) instead of a tick: the first layer is the
|
|
79
|
+
* start marker `cron:<name>:start` for `ttlMs` (see {@link startMarkerTtl}).
|
|
80
|
+
*/
|
|
81
|
+
start?: {
|
|
82
|
+
ttlMs: number;
|
|
83
|
+
};
|
|
84
|
+
/**
|
|
85
|
+
* The job body; `signal` aborts when the stop begins (`ScheduledRuns`) or the run lock is lost.
|
|
86
|
+
* Only a body that reads `signal` stops on a lost lock; the others are idempotent sweeps that
|
|
87
|
+
* run to completion.
|
|
88
|
+
*/
|
|
89
|
+
run: (signal: AbortSignal) => Promise<unknown>;
|
|
90
|
+
}): Promise<void>;
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
import { withLogContext } from "../../log-context.js";
|
|
2
|
+
import { runOutsideTransaction } from "../database/transaction-host.js";
|
|
3
|
+
/** Marks a method wrapped by `@LockedCron` / `@LockedInterval` (read by `ScheduledRuns`). */
|
|
4
|
+
export const LOCKED_JOB = Symbol("LOCKED_JOB");
|
|
5
|
+
/**
|
|
6
|
+
* The job's name and its undecorated body, on the wrapped method: `ScheduledRuns.runNow` runs the
|
|
7
|
+
* body once outside the schedule.
|
|
8
|
+
*/
|
|
9
|
+
export const LOCKED_JOB_BODY = Symbol("LOCKED_JOB_BODY");
|
|
10
|
+
/** The property `ScheduledRuns` attaches itself under on every instance with a locked job. */
|
|
11
|
+
export const SCHEDULED_RUNS = Symbol("SCHEDULED_RUNS");
|
|
12
|
+
/**
|
|
13
|
+
* Throws when the class lacks `lockService` / `log` (a programming error, so the decorated call
|
|
14
|
+
* rejects); everything after this check is logged, never thrown.
|
|
15
|
+
*/
|
|
16
|
+
export function assertLockedJobHost(host, kind) {
|
|
17
|
+
if (!host.lockService || !host.log) {
|
|
18
|
+
const decorator = kind === "cron" ? "@LockedCron()" : "@LockedInterval()";
|
|
19
|
+
throw new Error(`${decorator} needs the class to inject \`LockService\` as \`lockService\` and the ` +
|
|
20
|
+
"logger as `log`.");
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
const errMsg = (e) => (e instanceof Error ? e.message : String(e));
|
|
24
|
+
/** The tick marker's lifetime: two periods, at least 10 s, at most a day. */
|
|
25
|
+
export const tickMarkerTtl = (periodMs) => Math.min(Math.max(periodMs * 2, 10_000), 24 * 3600_000);
|
|
26
|
+
/**
|
|
27
|
+
* The start marker's lifetime: replicas that start within this window (one period, at most a
|
|
28
|
+
* minute) run a `runOnStart` job once; a replica restarted after it runs it again, like the first
|
|
29
|
+
* run of a newly created repeatable scheduler.
|
|
30
|
+
*/
|
|
31
|
+
export const startMarkerTtl = (periodMs) => Math.min(periodMs, 60_000);
|
|
32
|
+
/**
|
|
33
|
+
* Runs one scheduled tick of a job exactly once across replicas, in two layers:
|
|
34
|
+
* 1. one winner per tick: the replica that sets the per-tick marker `cron:<name>:<tick>` (never
|
|
35
|
+
* released, so a fast job on the winner does not let a slower replica run the same tick);
|
|
36
|
+
* 2. a try-once renewed run lock (`lockKey`), so a long run never overlaps the next tick's run.
|
|
37
|
+
* The others log INFO and skip. An error in the job is logged (never thrown into the scheduler)
|
|
38
|
+
* and the lock is released afterwards. The job starts in a fresh async context (no transaction).
|
|
39
|
+
*
|
|
40
|
+
* Inside a Nest application the run is tracked by `ScheduledRuns` (the stop aborts the signal the
|
|
41
|
+
* job gets and waits for the run, bounded) and no run starts before `ScheduledRuns.open()` (the
|
|
42
|
+
* timers are armed at application bootstrap, before the kernel's start sequence) or once the
|
|
43
|
+
* stop began; failures caused
|
|
44
|
+
* by the stop (an aborted job, a lock release after Redis closed) are logged at WARN / INFO. Only
|
|
45
|
+
* the host check rejects (see {@link assertLockedJobHost}).
|
|
46
|
+
*/
|
|
47
|
+
export async function runLockedTick(host, o) {
|
|
48
|
+
assertLockedJobHost(host, o.kind);
|
|
49
|
+
const lockService = host.lockService;
|
|
50
|
+
const log = host.log;
|
|
51
|
+
const scope = host[SCHEDULED_RUNS];
|
|
52
|
+
if (scope?.stopped) {
|
|
53
|
+
log.info("cron skipped: the scheduler is stopping", { cron: o.name });
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
if (scope && !scope.opened) {
|
|
57
|
+
// the start gate is shut: the start sequence (migrations, bootstrap, extensions) is not done
|
|
58
|
+
log.info("cron skipped: the scheduler is not started", { cron: o.name });
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
const signal = scope?.signal;
|
|
62
|
+
/** Errors during the stop are expected (the job aborted, Redis closing): WARN, not ERROR. */
|
|
63
|
+
const logFailure = (msg, fields) => signal?.aborted ? log.warn(msg, fields) : log.error(msg, fields);
|
|
64
|
+
const run = runOutsideTransaction(() => withLogContext({ cron: o.name }, async () => {
|
|
65
|
+
let tick;
|
|
66
|
+
try {
|
|
67
|
+
if (o.start) {
|
|
68
|
+
tick = "start";
|
|
69
|
+
if (!(await lockService.lease(`cron:${o.name}:start`, "start", o.start.ttlMs))) {
|
|
70
|
+
log.info("cron skipped: start run already taken by another replica", { cron: o.name });
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
const t = o.tick();
|
|
76
|
+
tick = t.tick;
|
|
77
|
+
if (!(await lockService.lease(`cron:${o.name}:${tick}`, "tick", tickMarkerTtl(t.periodMs)))) {
|
|
78
|
+
log.info("cron skipped: tick already taken by another replica", {
|
|
79
|
+
cron: o.name,
|
|
80
|
+
tick,
|
|
81
|
+
});
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
catch (err) {
|
|
87
|
+
logFailure("cron tick marker failed", { cron: o.name, err });
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
let handle;
|
|
91
|
+
try {
|
|
92
|
+
handle = await lockService.acquire(o.lockKey, { ttlMs: o.ttl, waitMs: 0 });
|
|
93
|
+
}
|
|
94
|
+
catch (err) {
|
|
95
|
+
logFailure("cron lock failed", { cron: o.name, err });
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
if (!handle) {
|
|
99
|
+
log.info("cron skipped: the previous run still holds the lock", { cron: o.name, tick });
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
try {
|
|
103
|
+
if (signal?.aborted) {
|
|
104
|
+
log.info("cron skipped: the scheduler is stopping", { cron: o.name, tick });
|
|
105
|
+
}
|
|
106
|
+
else {
|
|
107
|
+
// the signal aborts on the stop and when the run lock is lost (another replica may take
|
|
108
|
+
// the lock and start the next run); only jobs that read it stop, the others are
|
|
109
|
+
// idempotent sweeps that run to completion
|
|
110
|
+
await o.run(signal ? AbortSignal.any([signal, handle.lost]) : handle.lost);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
catch (err) {
|
|
114
|
+
if (signal?.aborted) {
|
|
115
|
+
log.info("cron run stopped by the shutdown", { cron: o.name, error: errMsg(err) });
|
|
116
|
+
}
|
|
117
|
+
else if (handle.lost.aborted) {
|
|
118
|
+
log.warn("cron run stopped: its run lock was lost", { cron: o.name, error: errMsg(err) });
|
|
119
|
+
}
|
|
120
|
+
else {
|
|
121
|
+
log.error("cron job failed", { cron: o.name, error: errMsg(err), err });
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
finally {
|
|
125
|
+
await handle
|
|
126
|
+
.release()
|
|
127
|
+
.catch((err) => logFailure("cron lock release failed", { cron: o.name, err }));
|
|
128
|
+
}
|
|
129
|
+
}));
|
|
130
|
+
try {
|
|
131
|
+
await (scope ? scope.track(run) : run);
|
|
132
|
+
}
|
|
133
|
+
catch (err) {
|
|
134
|
+
// runOutsideTransaction / withLogContext themselves; never into the scheduler
|
|
135
|
+
logFailure("cron run failed", { cron: o.name, err });
|
|
136
|
+
}
|
|
137
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The cron scheduler (`@nestjs/schedule`), the `@LockedInterval` scheduler and the runs of both
|
|
3
|
+
* (`ScheduledRuns`: tracked, stopped within the stop budget). The one place that imports them;
|
|
4
|
+
* only worker-only modules import this module (`WorkerModule` and `MaintenanceModule`, which only
|
|
5
|
+
* `WorkerModule` imports), so only worker processes run `@LockedCron` / `@LockedInterval` jobs.
|
|
6
|
+
*/
|
|
7
|
+
export declare class KernelScheduleModule {
|
|
8
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
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
|
+
import { Module } from "@nestjs/common";
|
|
8
|
+
import { DiscoveryModule } from "@nestjs/core";
|
|
9
|
+
import { ScheduleModule } from "@nestjs/schedule";
|
|
10
|
+
import { LockedIntervalScheduler } from "./locked-interval.js";
|
|
11
|
+
import { ScheduledRuns } from "./scheduled-runs.js";
|
|
12
|
+
/**
|
|
13
|
+
* The cron scheduler (`@nestjs/schedule`), the `@LockedInterval` scheduler and the runs of both
|
|
14
|
+
* (`ScheduledRuns`: tracked, stopped within the stop budget). The one place that imports them;
|
|
15
|
+
* only worker-only modules import this module (`WorkerModule` and `MaintenanceModule`, which only
|
|
16
|
+
* `WorkerModule` imports), so only worker processes run `@LockedCron` / `@LockedInterval` jobs.
|
|
17
|
+
*/
|
|
18
|
+
let KernelScheduleModule = class KernelScheduleModule {
|
|
19
|
+
};
|
|
20
|
+
KernelScheduleModule = __decorate([
|
|
21
|
+
Module({
|
|
22
|
+
imports: [ScheduleModule.forRoot(), DiscoveryModule],
|
|
23
|
+
providers: [LockedIntervalScheduler, ScheduledRuns],
|
|
24
|
+
exports: [ScheduleModule, LockedIntervalScheduler, ScheduledRuns],
|
|
25
|
+
})
|
|
26
|
+
], KernelScheduleModule);
|
|
27
|
+
export { KernelScheduleModule };
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { type BeforeApplicationShutdown, type OnModuleInit } from "@nestjs/common";
|
|
2
|
+
import { DiscoveryService, MetadataScanner } from "@nestjs/core";
|
|
3
|
+
import { SchedulerRegistry } from "@nestjs/schedule";
|
|
4
|
+
import type { KernelLogger } from "../../log.js";
|
|
5
|
+
import { GracefulShutdown } from "../lifecycle/graceful-shutdown.service.js";
|
|
6
|
+
import { LockedIntervalScheduler } from "./locked-interval.js";
|
|
7
|
+
import { type ScheduledRunScope } from "./locked-tick.js";
|
|
8
|
+
/**
|
|
9
|
+
* The runs of the `@LockedCron` / `@LockedInterval` jobs (ticks and `runOnStart` runs), their
|
|
10
|
+
* start gate ({@link open}) and their stop. At module init it attaches itself to every provider instance with a locked job
|
|
11
|
+
* (`SCHEDULED_RUNS`), so each run is tracked and gets {@link signal}. {@link stop} (idempotent)
|
|
12
|
+
* stops the cron and interval timers, aborts the signal, refuses new runs and waits for the runs in
|
|
13
|
+
* progress within its budget, capped by what is left of the shared stop deadline
|
|
14
|
+
* (`GracefulShutdown`): the runs end (and release their locks) before Redis and the pool close.
|
|
15
|
+
* Runs over the budget are abandoned with a WARN; the job's own failures after the stop began are
|
|
16
|
+
* logged at WARN / INFO, never ERROR. The kernel's stop phases call it through the worker role
|
|
17
|
+
* (`WorkerRole.stopSchedules`, awaited in the runs phase, before the extension host closes: jobs may
|
|
18
|
+
* call extensions); `beforeApplicationShutdown` covers an application without them.
|
|
19
|
+
*/
|
|
20
|
+
export declare class ScheduledRuns implements ScheduledRunScope, OnModuleInit, BeforeApplicationShutdown {
|
|
21
|
+
private readonly discovery;
|
|
22
|
+
private readonly scanner;
|
|
23
|
+
private readonly crons;
|
|
24
|
+
private readonly intervals;
|
|
25
|
+
private readonly shutdown;
|
|
26
|
+
private readonly log;
|
|
27
|
+
private readonly abort;
|
|
28
|
+
private readonly inFlight;
|
|
29
|
+
private stopping;
|
|
30
|
+
private gateOpen;
|
|
31
|
+
/** Each locked job's body by job name, bound to its instance (for {@link runNow}). */
|
|
32
|
+
private readonly bodies;
|
|
33
|
+
constructor(discovery: DiscoveryService, scanner: MetadataScanner, crons: SchedulerRegistry, intervals: LockedIntervalScheduler, shutdown: GracefulShutdown, log: KernelLogger);
|
|
34
|
+
/**
|
|
35
|
+
* Attaches itself to every instance with a locked job in `onModuleInit`, which runs before any
|
|
36
|
+
* `onApplicationBootstrap` hook, so the start gate already guards the jobs when the cron
|
|
37
|
+
* orchestrator and the interval scheduler arm their timers there.
|
|
38
|
+
*/
|
|
39
|
+
onModuleInit(): void;
|
|
40
|
+
/**
|
|
41
|
+
* Runs the body of the locked job named `name` once, now, outside its schedule: no tick marker
|
|
42
|
+
* and no run lock, in a fresh async context (no transaction), with the stop signal. A job's name
|
|
43
|
+
* enqueued on the maintenance queue runs this way, as the maintenance handlers of the periodic
|
|
44
|
+
* jobs did before they became locked jobs. Resolves false when no job has that name; the body's
|
|
45
|
+
* error is thrown.
|
|
46
|
+
*/
|
|
47
|
+
runNow(name: string): Promise<boolean>;
|
|
48
|
+
/** The start gate is open: ticks and start runs may run. */
|
|
49
|
+
get opened(): boolean;
|
|
50
|
+
/**
|
|
51
|
+
* Opens the start gate. Until this is called every tick and start run skips at INFO: the
|
|
52
|
+
* cron and interval timers are armed at application bootstrap, which runs before the kernel's
|
|
53
|
+
* start sequence (migrations, bootstrap, extension load). The kernel's worker role opens it once
|
|
54
|
+
* its queue consumers started (then starts the `runOnStart` runs); a stop closes it again.
|
|
55
|
+
*/
|
|
56
|
+
open(): void;
|
|
57
|
+
get stopped(): boolean;
|
|
58
|
+
get signal(): AbortSignal;
|
|
59
|
+
/** The number of runs in progress. */
|
|
60
|
+
get inFlightCount(): number;
|
|
61
|
+
track<T>(p: Promise<T>): Promise<T>;
|
|
62
|
+
/**
|
|
63
|
+
* Stops the schedulers and waits for the runs in progress, at most `budgetMs` (capped by the
|
|
64
|
+
* shared stop deadline). Idempotent: later calls return the first call's promise.
|
|
65
|
+
*/
|
|
66
|
+
stop(budgetMs: number): Promise<void>;
|
|
67
|
+
beforeApplicationShutdown(): Promise<void>;
|
|
68
|
+
private runStop;
|
|
69
|
+
}
|