@capybara-hq/kernel 0.1.0-rc.1 → 0.1.0-rc.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/admin/admin.controller.d.ts +17 -17
- package/dist/admin/admin.controller.js +43 -26
- package/dist/admin/admin.module.d.ts +3 -0
- package/dist/admin/admin.module.js +22 -0
- package/dist/admin/extensions.controller.d.ts +14 -14
- package/dist/admin/extensions.controller.js +30 -17
- package/dist/admin/setup-lock.d.ts +16 -0
- package/dist/admin/setup-lock.js +47 -0
- package/dist/admin/setup.controller.d.ts +8 -8
- package/dist/admin/setup.controller.js +27 -25
- package/dist/admin/setup.service.d.ts +19 -27
- package/dist/admin/setup.service.js +61 -61
- package/dist/agents/agent-lookup.d.ts +53 -0
- package/dist/agents/agent-lookup.js +187 -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 +280 -335
- package/dist/agents/definition.d.ts +39 -8
- package/dist/agents/definition.js +201 -17
- 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 +39 -8
- 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 +326 -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/claude/agents.js +13 -10
- 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 +31 -14
- 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 +10 -4
- package/dist/channels/cards.js +16 -8
- package/dist/channels/channels.module.d.ts +40 -0
- package/dist/channels/channels.module.js +128 -0
- package/dist/channels/connections.controller.d.ts +1 -1
- package/dist/channels/connections.controller.js +11 -6
- package/dist/channels/connections.service.d.ts +43 -21
- package/dist/channels/connections.service.js +236 -131
- package/dist/channels/inbound.d.ts +34 -38
- package/dist/channels/inbound.js +107 -41
- package/dist/channels/job-ids.d.ts +10 -0
- package/dist/channels/job-ids.js +10 -0
- package/dist/channels/jobs.d.ts +85 -0
- package/dist/channels/jobs.js +157 -0
- package/dist/channels/outbound.d.ts +60 -82
- package/dist/channels/outbound.js +165 -194
- package/dist/channels/supervisor.d.ts +88 -46
- package/dist/channels/supervisor.js +230 -132
- package/dist/channels/threads.d.ts +29 -8
- package/dist/channels/threads.js +71 -13
- package/dist/channels/webhook.d.ts +20 -14
- package/dist/channels/webhook.js +51 -20
- package/dist/config/load.d.ts +3 -2
- package/dist/config/load.js +3 -2
- package/dist/config/nacos-source.js +11 -2
- package/dist/config/schema.d.ts +1 -0
- package/dist/config/schema.js +12 -6
- package/dist/conversations/access.d.ts +29 -0
- package/dist/conversations/access.js +86 -0
- package/dist/conversations/artifacts.d.ts +11 -11
- package/dist/conversations/artifacts.js +36 -10
- 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 +39 -18
- package/dist/conversations/event-log.js +93 -27
- package/dist/conversations/events.d.ts +23 -3
- package/dist/conversations/events.js +26 -14
- package/dist/conversations/files.d.ts +10 -10
- package/dist/conversations/files.js +37 -11
- package/dist/conversations/idem-keys.d.ts +5 -0
- package/dist/conversations/idem-keys.js +5 -0
- package/dist/conversations/job-ids.d.ts +6 -0
- package/dist/conversations/job-ids.js +6 -0
- package/dist/conversations/outputs-read.d.ts +11 -11
- package/dist/conversations/outputs-read.js +31 -7
- package/dist/conversations/queue.d.ts +48 -56
- package/dist/conversations/queue.js +13 -289
- package/dist/conversations/queue.service.d.ts +60 -0
- package/dist/conversations/queue.service.js +343 -0
- package/dist/conversations/sandbox-status.d.ts +13 -10
- package/dist/conversations/sandbox-status.js +36 -8
- package/dist/conversations/titles.d.ts +71 -24
- package/dist/conversations/titles.js +159 -63
- package/dist/ctx/bus.js +9 -3
- package/dist/ctx/create-ctx.d.ts +6 -0
- package/dist/ctx/create-ctx.js +7 -9
- package/dist/ctx/lock.d.ts +7 -3
- package/dist/ctx/lock.js +9 -20
- package/dist/ctx/secrets.d.ts +10 -2
- package/dist/ctx/secrets.js +7 -3
- package/dist/db/kernel-schema.d.ts +4 -4
- package/dist/db/pool.d.ts +5 -0
- package/dist/db/pool.js +1 -0
- package/dist/errors.d.ts +1 -0
- package/dist/errors.js +1 -0
- package/dist/evals/budget.d.ts +42 -21
- package/dist/evals/budget.js +114 -62
- package/dist/evals/evals.module.d.ts +31 -0
- package/dist/evals/evals.module.js +114 -0
- package/dist/evals/jobs.d.ts +20 -0
- package/dist/evals/jobs.js +45 -0
- package/dist/evals/recorded-tools.d.ts +27 -1
- package/dist/evals/recorded-tools.js +85 -10
- package/dist/evals/run-replay.d.ts +61 -8
- package/dist/evals/run-replay.js +159 -85
- 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.d.ts +2 -2
- package/dist/evals/trajectory.service.d.ts +5 -4
- package/dist/evals/trajectory.service.js +30 -7
- package/dist/evals/worker.d.ts +44 -27
- package/dist/evals/worker.js +220 -121
- package/dist/extensions/admin-ops.d.ts +61 -33
- package/dist/extensions/admin-ops.js +248 -154
- package/dist/extensions/admin-view.d.ts +38 -27
- package/dist/extensions/admin-view.js +126 -55
- package/dist/extensions/approvals.d.ts +12 -8
- package/dist/extensions/approvals.js +73 -46
- package/dist/extensions/blobs.d.ts +27 -10
- package/dist/extensions/blobs.js +111 -45
- package/dist/extensions/bootstrap.d.ts +58 -31
- package/dist/extensions/bootstrap.js +175 -121
- package/dist/extensions/cli.d.ts +20 -10
- package/dist/extensions/cli.js +41 -96
- package/dist/extensions/config-issues.d.ts +7 -0
- package/dist/extensions/config-issues.js +31 -0
- package/dist/extensions/deployment-config-store.d.ts +49 -0
- package/dist/extensions/deployment-config-store.js +133 -0
- package/dist/extensions/deployment-config.d.ts +58 -67
- package/dist/extensions/deployment-config.js +202 -230
- package/dist/extensions/enabled.d.ts +5 -5
- package/dist/extensions/extensions.module.d.ts +8 -0
- package/dist/extensions/extensions.module.js +77 -0
- package/dist/extensions/hooks.d.ts +3 -2
- package/dist/extensions/hooks.js +1 -1
- package/dist/extensions/host.d.ts +72 -68
- package/dist/extensions/host.js +191 -152
- package/dist/extensions/installs.d.ts +49 -16
- package/dist/extensions/installs.js +128 -32
- package/dist/extensions/job-ids.d.ts +6 -0
- package/dist/extensions/job-ids.js +6 -0
- package/dist/extensions/lifecycle-topics.d.ts +18 -0
- package/dist/extensions/lifecycle-topics.js +18 -0
- package/dist/extensions/lifecycle.d.ts +35 -47
- package/dist/extensions/lifecycle.js +103 -39
- package/dist/extensions/locks.d.ts +33 -0
- package/dist/extensions/locks.js +86 -0
- package/dist/extensions/migrate-lock.d.ts +3 -4
- package/dist/extensions/org-config.controller.d.ts +1 -1
- package/dist/extensions/org-config.controller.js +8 -5
- package/dist/extensions/org-config.d.ts +48 -46
- package/dist/extensions/org-config.js +284 -226
- package/dist/extensions/registry.d.ts +50 -2
- package/dist/extensions/registry.js +89 -4
- package/dist/extensions/sources.d.ts +12 -8
- package/dist/extensions/sources.js +34 -13
- package/dist/files/files.module.d.ts +3 -0
- package/dist/files/files.module.js +22 -0
- package/dist/files/previewers.controller.d.ts +7 -2
- package/dist/files/previewers.controller.js +17 -9
- package/dist/files/previewers.d.ts +13 -18
- package/dist/files/previewers.js +83 -36
- package/dist/http/adapter.d.ts +3 -0
- package/dist/http/adapter.js +25 -0
- package/dist/http/api.module.d.ts +3 -110
- package/dist/http/api.module.js +47 -355
- package/dist/http/app.d.ts +11 -15
- package/dist/http/app.js +17 -62
- package/dist/http/error-filter.module.d.ts +5 -0
- package/dist/http/error-filter.module.js +18 -0
- package/dist/http/error.filter.js +2 -2
- package/dist/identity/accounts.d.ts +82 -29
- package/dist/identity/accounts.js +294 -175
- package/dist/identity/api-tokens.d.ts +11 -7
- package/dist/identity/api-tokens.js +71 -44
- package/dist/identity/audit.d.ts +7 -4
- package/dist/identity/audit.js +5 -1
- package/dist/identity/auth.controller.d.ts +11 -10
- package/dist/identity/auth.controller.js +31 -25
- package/dist/identity/auth.guard.d.ts +3 -3
- package/dist/identity/auth.guard.js +6 -4
- package/dist/identity/binding.d.ts +9 -11
- package/dist/identity/binding.js +41 -13
- package/dist/identity/enterprise-admin.d.ts +18 -12
- package/dist/identity/enterprise-admin.js +67 -13
- package/dist/identity/external-identity-lock.d.ts +17 -0
- package/dist/identity/external-identity-lock.js +39 -0
- package/dist/identity/external.d.ts +19 -15
- package/dist/identity/external.js +163 -125
- package/dist/identity/identity.module.d.ts +6 -0
- package/dist/identity/identity.module.js +56 -0
- package/dist/identity/me.controller.d.ts +16 -15
- package/dist/identity/me.controller.js +37 -31
- package/dist/identity/sessions.d.ts +12 -10
- package/dist/identity/sessions.js +74 -42
- package/dist/identity/settings.d.ts +20 -14
- package/dist/identity/settings.js +86 -58
- package/dist/identity/sso.controller.d.ts +7 -7
- package/dist/identity/sso.controller.js +13 -9
- package/dist/identity/sso.d.ts +9 -12
- package/dist/identity/sso.js +54 -24
- package/dist/inbox/inbox.module.d.ts +3 -0
- package/dist/inbox/inbox.module.js +22 -0
- package/dist/inbox/inbox.service.d.ts +7 -9
- package/dist/inbox/inbox.service.js +32 -11
- package/dist/index.d.ts +16 -11
- package/dist/index.js +9 -6
- package/dist/infra/cache/cache.module.d.ts +3 -0
- package/dist/infra/cache/cache.module.js +16 -0
- package/dist/infra/cache/cache.service.d.ts +21 -0
- package/dist/infra/cache/cache.service.js +80 -0
- package/dist/infra/cache/cacheable.decorator.d.ts +32 -0
- package/dist/infra/cache/cacheable.decorator.js +83 -0
- package/dist/infra/cli/kernel-cli.module.d.ts +66 -0
- package/dist/infra/cli/kernel-cli.module.js +165 -0
- package/dist/infra/close-within.d.ts +15 -0
- package/dist/infra/close-within.js +36 -0
- package/dist/infra/config/config.module.d.ts +13 -0
- package/dist/infra/config/config.module.js +39 -0
- package/dist/infra/config/kernel-config.service.d.ts +25 -0
- package/dist/infra/config/kernel-config.service.js +126 -0
- package/dist/infra/database/after-commit.d.ts +6 -0
- package/dist/infra/database/after-commit.js +9 -0
- package/dist/infra/database/database.module.d.ts +25 -0
- package/dist/infra/database/database.module.js +90 -0
- package/dist/infra/database/kernel-db.d.ts +22 -0
- package/dist/infra/database/kernel-db.js +65 -0
- package/dist/infra/database/transaction-host.d.ts +50 -0
- package/dist/infra/database/transaction-host.js +125 -0
- package/dist/infra/database/transactional.decorator.d.ts +15 -0
- package/dist/infra/database/transactional.decorator.js +27 -0
- package/dist/infra/database/xact-lock.d.ts +17 -0
- package/dist/infra/database/xact-lock.js +43 -0
- package/dist/infra/events/kernel-events.d.ts +96 -0
- package/dist/infra/events/kernel-events.js +65 -0
- package/dist/infra/health/health.controller.d.ts +26 -0
- package/dist/infra/health/health.controller.js +104 -0
- package/dist/infra/health/health.module.d.ts +9 -0
- package/dist/infra/health/health.module.js +24 -0
- package/dist/infra/health/health.options.d.ts +10 -0
- package/dist/infra/health/health.options.js +15 -0
- package/dist/infra/health/shutdown-state.d.ts +6 -0
- package/dist/infra/health/shutdown-state.js +2 -0
- package/dist/infra/lifecycle/graceful-shutdown.module.d.ts +6 -0
- package/dist/infra/lifecycle/graceful-shutdown.module.js +23 -0
- package/dist/infra/lifecycle/graceful-shutdown.service.d.ts +70 -0
- package/dist/infra/lifecycle/graceful-shutdown.service.js +135 -0
- package/dist/infra/lifecycle/process-guards.d.ts +52 -0
- package/dist/infra/lifecycle/process-guards.js +86 -0
- package/dist/infra/lifecycle/shutdown-signals.d.ts +30 -0
- package/dist/infra/lifecycle/shutdown-signals.js +48 -0
- package/dist/infra/lock/key-template.d.ts +13 -0
- package/dist/infra/lock/key-template.js +46 -0
- package/dist/infra/lock/lock.module.d.ts +3 -0
- package/dist/infra/lock/lock.module.js +16 -0
- package/dist/infra/lock/lock.service.d.ts +120 -0
- package/dist/infra/lock/lock.service.js +343 -0
- package/dist/infra/lock/shared-lease.d.ts +44 -0
- package/dist/infra/lock/shared-lease.js +121 -0
- package/dist/infra/lock/with-lock.decorator.d.ts +28 -0
- package/dist/infra/lock/with-lock.decorator.js +49 -0
- package/dist/infra/logging/logging.module.d.ts +16 -0
- package/dist/infra/logging/logging.module.js +34 -0
- package/dist/infra/queue/configured-processor.d.ts +18 -0
- package/dist/infra/queue/configured-processor.js +23 -0
- package/dist/infra/queue/job-failure.d.ts +18 -0
- package/dist/infra/queue/job-failure.js +26 -0
- package/dist/infra/queue/queue-shutdown.d.ts +27 -0
- package/dist/infra/queue/queue-shutdown.js +81 -0
- package/dist/infra/queue/queue.module.d.ts +16 -0
- package/dist/infra/queue/queue.module.js +61 -0
- package/dist/infra/queue/redis-connection.d.ts +7 -0
- package/dist/infra/queue/redis-connection.js +18 -0
- package/dist/infra/queue/retired-schedulers.d.ts +7 -0
- package/dist/infra/queue/retired-schedulers.js +9 -0
- package/dist/infra/queue/run-job.d.ts +16 -0
- package/dist/infra/queue/run-job.js +19 -0
- package/dist/infra/redis/redis.module.d.ts +24 -0
- package/dist/infra/redis/redis.module.js +87 -0
- package/dist/infra/schedule/cron-tick.d.ts +12 -0
- package/dist/infra/schedule/cron-tick.js +25 -0
- package/dist/infra/schedule/locked-cron.decorator.d.ts +27 -0
- package/dist/infra/schedule/locked-cron.decorator.js +53 -0
- package/dist/infra/schedule/locked-interval.d.ts +69 -0
- package/dist/infra/schedule/locked-interval.js +190 -0
- package/dist/infra/schedule/locked-tick.d.ts +90 -0
- package/dist/infra/schedule/locked-tick.js +137 -0
- package/dist/infra/schedule/schedule.module.d.ts +8 -0
- package/dist/infra/schedule/schedule.module.js +27 -0
- package/dist/infra/schedule/scheduled-runs.d.ts +69 -0
- package/dist/infra/schedule/scheduled-runs.js +163 -0
- package/dist/infra/swagger/swagger.d.ts +16 -0
- package/dist/infra/swagger/swagger.js +31 -0
- package/dist/infra/throttler/credential-throttler.d.ts +35 -0
- package/dist/infra/throttler/credential-throttler.js +77 -0
- package/dist/infra/throttler/named-throttlers.d.ts +31 -0
- package/dist/infra/throttler/named-throttlers.js +119 -0
- package/dist/infra/throttler/redis-throttler-storage.d.ts +38 -0
- package/dist/infra/throttler/redis-throttler-storage.js +130 -0
- package/dist/infra/throttler/throttler.guard.d.ts +23 -0
- package/dist/infra/throttler/throttler.guard.js +68 -0
- package/dist/infra/throttler/throttler.module.d.ts +15 -0
- package/dist/infra/throttler/throttler.module.js +53 -0
- package/dist/infra/tokens.d.ts +15 -0
- package/dist/infra/tokens.js +15 -0
- package/dist/infra/validation/create-zod-dto.d.ts +23 -0
- package/dist/infra/validation/create-zod-dto.js +35 -0
- package/dist/infra/validation/parse-with-zod.d.ts +7 -0
- package/dist/infra/validation/parse-with-zod.js +12 -0
- package/dist/infra/validation/validation.module.d.ts +3 -0
- package/dist/infra/validation/validation.module.js +16 -0
- package/dist/infra/validation/zod-params.d.ts +7 -0
- package/dist/infra/validation/zod-params.js +42 -0
- package/dist/infra/validation/zod-validation.pipe.d.ts +11 -0
- package/dist/infra/validation/zod-validation.pipe.js +31 -0
- package/dist/kernel.d.ts +9 -244
- package/dist/kernel.js +8 -1305
- package/dist/kernel.module.d.ts +17 -0
- package/dist/kernel.module.js +136 -0
- package/dist/lifecycle/kernel-lifecycle.d.ts +140 -0
- package/dist/lifecycle/kernel-lifecycle.js +456 -0
- package/dist/lifecycle/tokens.d.ts +3 -0
- package/dist/lifecycle/tokens.js +3 -0
- package/dist/log-context.d.ts +2 -0
- package/dist/log-context.js +4 -0
- package/dist/models/models.module.d.ts +3 -0
- package/dist/models/models.module.js +24 -0
- package/dist/models/prices.d.ts +8 -2
- package/dist/models/prices.js +65 -37
- package/dist/models/purposes.controller.d.ts +1 -1
- package/dist/models/purposes.controller.js +5 -6
- package/dist/models/purposes.d.ts +35 -13
- package/dist/models/purposes.js +101 -51
- package/dist/orgs/directory-sync.controller.d.ts +1 -1
- package/dist/orgs/directory-sync.controller.js +2 -2
- package/dist/orgs/directory-sync.d.ts +61 -31
- package/dist/orgs/directory-sync.js +212 -125
- package/dist/orgs/invitations.controller.d.ts +8 -8
- package/dist/orgs/invitations.controller.js +27 -26
- package/dist/orgs/invitations.service.d.ts +12 -9
- package/dist/orgs/invitations.service.js +130 -92
- package/dist/orgs/job-ids.d.ts +8 -0
- package/dist/orgs/job-ids.js +8 -0
- package/dist/orgs/members.service.d.ts +19 -12
- package/dist/orgs/members.service.js +161 -117
- package/dist/orgs/offboarding.d.ts +54 -57
- package/dist/orgs/offboarding.js +161 -71
- package/dist/orgs/org-lock.d.ts +28 -19
- package/dist/orgs/org-lock.js +81 -35
- package/dist/orgs/org.guard.d.ts +1 -1
- package/dist/orgs/org.guard.js +2 -2
- package/dist/orgs/orgs.controller.d.ts +13 -13
- package/dist/orgs/orgs.controller.js +29 -17
- package/dist/orgs/orgs.module.d.ts +6 -0
- package/dist/orgs/orgs.module.js +68 -0
- package/dist/orgs/orgs.service.d.ts +30 -19
- package/dist/orgs/orgs.service.js +139 -86
- package/dist/orgs/settings.controller.d.ts +1 -1
- package/dist/orgs/settings.controller.js +8 -6
- package/dist/orgs/settings.service.d.ts +16 -10
- package/dist/orgs/settings.service.js +77 -48
- 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/context/build.d.ts +6 -6
- package/dist/runtime/context/build.js +18 -8
- package/dist/runtime/context/claude-tools.d.ts +2 -1
- package/dist/runtime/context/claude-tools.js +9 -10
- package/dist/runtime/context/legacy-text.d.ts +22 -0
- package/dist/runtime/context/legacy-text.js +37 -0
- package/dist/runtime/context/skills.d.ts +29 -11
- package/dist/runtime/context/skills.js +37 -30
- 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 +8 -1
- package/dist/runtime/loop.js +14 -0
- package/dist/runtime/maintenance-queue.d.ts +10 -0
- package/dist/runtime/maintenance-queue.js +10 -0
- package/dist/runtime/maintenance.d.ts +45 -74
- package/dist/runtime/maintenance.js +139 -137
- package/dist/runtime/model-call.d.ts +7 -4
- package/dist/runtime/model-call.js +25 -58
- 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 +27 -18
- 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 +122 -76
- package/dist/runtime/run-worker.js +343 -229
- 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 +5 -10
- package/dist/runtime/subagents/definition.js +13 -14
- package/dist/runtime/subagents/dispatch.d.ts +89 -8
- package/dist/runtime/subagents/dispatch.js +137 -142
- 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 +3 -2
- package/dist/runtime/subagents/progress.d.ts +2 -2
- package/dist/runtime/subagents/roster.d.ts +4 -4
- package/dist/runtime/subagents/roster.js +2 -2
- package/dist/runtime/subagents/skill-fork.d.ts +8 -9
- package/dist/runtime/subagents/skill-fork.js +17 -6
- package/dist/runtime/subagents/subagents.service.d.ts +40 -0
- package/dist/runtime/subagents/subagents.service.js +101 -0
- package/dist/runtime/usage-report.d.ts +94 -52
- package/dist/runtime/usage-report.js +200 -100
- package/dist/runtime/waits.d.ts +127 -59
- package/dist/runtime/waits.js +433 -210
- 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 +37 -24
- package/dist/skills/catalog.js +100 -57
- package/dist/skills/changes.controller.d.ts +4 -4
- package/dist/skills/changes.controller.js +15 -9
- package/dist/skills/changes.service.d.ts +30 -20
- package/dist/skills/changes.service.js +425 -367
- package/dist/skills/invocable.controller.d.ts +1 -1
- package/dist/skills/invocable.controller.js +8 -5
- package/dist/skills/invocation-keys.d.ts +1 -1
- package/dist/skills/invocation-keys.js +1 -1
- package/dist/skills/invoke.d.ts +17 -16
- package/dist/skills/invoke.js +53 -21
- 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 +33 -25
- package/dist/tools/approvals.service.js +343 -259
- package/dist/tools/breaker.d.ts +2 -2
- package/dist/tools/breaker.js +21 -3
- package/dist/tools/builtin-names.d.ts +73 -0
- package/dist/tools/builtin-names.js +116 -0
- package/dist/tools/builtins/agent.d.ts +7 -7
- package/dist/tools/builtins/agent.js +7 -11
- package/dist/tools/builtins/ask-user.d.ts +3 -3
- package/dist/tools/builtins/ask-user.js +3 -3
- 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 +3 -3
- package/dist/tools/builtins/read-tool-output.js +3 -3
- package/dist/tools/builtins/sandbox/bash.d.ts +5 -5
- package/dist/tools/builtins/sandbox/bash.js +33 -30
- package/dist/tools/builtins/sandbox/common.d.ts +5 -4
- package/dist/tools/builtins/sandbox/common.js +2 -2
- package/dist/tools/builtins/sandbox/deliver.d.ts +1 -1
- package/dist/tools/builtins/sandbox/deliver.js +13 -13
- package/dist/tools/builtins/sandbox/edit.d.ts +1 -1
- package/dist/tools/builtins/sandbox/edit.js +42 -31
- package/dist/tools/builtins/sandbox/file-state.d.ts +34 -0
- package/dist/tools/builtins/sandbox/file-state.js +34 -0
- package/dist/tools/builtins/sandbox/glob-match.d.ts +1 -1
- package/dist/tools/builtins/sandbox/glob-match.js +1 -1
- package/dist/tools/builtins/sandbox/glob.d.ts +1 -1
- package/dist/tools/builtins/sandbox/glob.js +6 -6
- package/dist/tools/builtins/sandbox/grep.d.ts +7 -4
- package/dist/tools/builtins/sandbox/grep.js +149 -32
- package/dist/tools/builtins/sandbox/index.d.ts +1 -1
- package/dist/tools/builtins/sandbox/index.js +1 -1
- package/dist/tools/builtins/sandbox/read.d.ts +2 -2
- package/dist/tools/builtins/sandbox/read.js +22 -15
- package/dist/tools/builtins/sandbox/write.d.ts +1 -1
- package/dist/tools/builtins/sandbox/write.js +38 -34
- package/dist/tools/builtins/skill-load.d.ts +6 -6
- package/dist/tools/builtins/skill-load.js +33 -17
- package/dist/tools/builtins/skill-write.d.ts +4 -4
- package/dist/tools/builtins/skill-write.js +10 -10
- package/dist/tools/builtins/tool-search.d.ts +13 -9
- package/dist/tools/builtins/tool-search.js +25 -14
- 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 +438 -348
- package/dist/tools/credentials.d.ts +17 -20
- package/dist/tools/credentials.js +55 -34
- package/dist/tools/display-names.d.ts +9 -0
- package/dist/tools/display-names.js +24 -0
- package/dist/tools/drift.d.ts +29 -41
- package/dist/tools/drift.js +116 -84
- package/dist/tools/elicitation.js +1 -1
- package/dist/tools/info.d.ts +32 -13
- package/dist/tools/info.js +88 -39
- 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/legacy-data.d.ts +34 -0
- package/dist/tools/legacy-data.js +76 -0
- package/dist/tools/legacy-keys.d.ts +51 -0
- package/dist/tools/legacy-keys.js +115 -0
- package/dist/tools/naming.d.ts +1 -5
- package/dist/tools/naming.js +1 -7
- 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 +48 -4
- package/dist/tools/pipeline.d.ts +72 -50
- package/dist/tools/pipeline.js +239 -100
- package/dist/tools/policy.d.ts +3 -16
- package/dist/tools/policy.js +13 -19
- package/dist/tools/questions.controller.d.ts +2 -2
- package/dist/tools/questions.controller.js +9 -6
- package/dist/tools/questions.service.d.ts +26 -25
- package/dist/tools/questions.service.js +201 -142
- package/dist/tools/registry.d.ts +43 -38
- package/dist/tools/registry.js +100 -72
- package/dist/tools/resources.d.ts +1 -1
- package/dist/tools/resources.js +1 -1
- 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 +10 -3
- package/src/migrations/0063_tool_keys_claude_code.sql +220 -0
- 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/tools/builtins/sandbox/names.d.ts +0 -7
- package/dist/tools/builtins/sandbox/names.js +0 -20
- /package/dist/http/{gateway.module.d.ts → gateway-routes.d.ts} +0 -0
- /package/dist/http/{gateway.module.js → gateway-routes.js} +0 -0
|
@@ -1,20 +1,38 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
8
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
9
|
+
};
|
|
1
10
|
import { createHash } from "node:crypto";
|
|
2
11
|
import { readdir, readFile, stat } from "node:fs/promises";
|
|
3
12
|
import { join } from "node:path";
|
|
4
13
|
import { fileURLToPath } from "node:url";
|
|
5
14
|
import { parseBootstrapManifest, SDK_VERSION, } from "@capybara-hq/plugin-sdk";
|
|
15
|
+
import { Inject, Injectable, Optional } from "@nestjs/common";
|
|
6
16
|
import { sql } from "kysely";
|
|
7
|
-
import pg from "pg";
|
|
8
17
|
import semver from "semver";
|
|
9
18
|
import { catalogPackageError } from "../catalog/plugin-import.js";
|
|
10
19
|
import { PluginPackageError, readPluginPackage } from "../catalog/plugin-package.js";
|
|
11
|
-
import { pgConnectOptions } from "../db/pool.js";
|
|
12
20
|
import { ApiError } from "../errors.js";
|
|
13
21
|
import { audit } from "../identity/audit.js";
|
|
22
|
+
import { KernelConfigService } from "../infra/config/kernel-config.service.js";
|
|
23
|
+
import { KernelDb } from "../infra/database/kernel-db.js";
|
|
24
|
+
import { TransactionHost } from "../infra/database/transaction-host.js";
|
|
25
|
+
import { Transactional } from "../infra/database/transactional.decorator.js";
|
|
26
|
+
import { LockService } from "../infra/lock/lock.service.js";
|
|
27
|
+
import { KERNEL_LOGGER } from "../infra/tokens.js";
|
|
14
28
|
import { fetchNpmPackage, IntegrityMismatchError, NpmFetchError, PackageTooLargeError, } from "../packages/npm.js";
|
|
29
|
+
import { ExtensionAdminOps } from "./admin-ops.js";
|
|
15
30
|
import { writeSnapshot } from "./approvals.js";
|
|
31
|
+
import { ExtensionInstalls } from "./installs.js";
|
|
32
|
+
import { PluginApproveLock } from "./locks.js";
|
|
16
33
|
import { ExtensionPackageError, permissionSetOfPackage, readExtensionPackage } from "./package.js";
|
|
17
34
|
import { diffPermissions } from "./permission-set.js";
|
|
35
|
+
import { ExtensionRegistry } from "./registry.js";
|
|
18
36
|
/**
|
|
19
37
|
* The bootstrap step (package ecosystem spec §7, startup bootstrap spec): installs the plugins
|
|
20
38
|
* pinned by the bootstrap manifest (`packages/kernel/bootstrap.json`). It replaced the builtin
|
|
@@ -30,15 +48,14 @@ import { diffPermissions } from "./permission-set.js";
|
|
|
30
48
|
* download `bootstrap.download_failed`, a download that differs from the pin
|
|
31
49
|
* `bootstrap.integrity_mismatch` (all name the plugin), and then nothing is written. Downloading
|
|
32
50
|
* inside the lock means a fleet starting together downloads once.
|
|
33
|
-
* - The whole run holds the
|
|
34
|
-
*
|
|
35
|
-
*
|
|
36
|
-
*
|
|
51
|
+
* - The whole run holds the Redis lock `lock:bootstrap` (`LockService`, decision R5 of the Nest
|
|
52
|
+
* kernel spec: TTL {@link BOOTSTRAP_LOCK_TTL_MS}, renewed every third of it, so a run longer than the TTL keeps
|
|
53
|
+
* it and a crashed holder's lock expires within it), taken by an unbounded wait that observes
|
|
54
|
+
* the signal: when several replicas (or `capybara bootstrap` and a starting kernel) run it
|
|
55
|
+
* together only one runs it; the others wait, then find it done. A lost lock (renewal failed
|
|
56
|
+
* until expiry) aborts the run at its next step. "Done" is a `bootstrap_runs` row for the
|
|
37
57
|
* manifest's sha256 (written with the audit `bootstrap.completed` only when every entry
|
|
38
|
-
* succeeded; otherwise the next start runs it again, which is idempotent).
|
|
39
|
-
* that drops mid-run is not detected (its errors are swallowed) and the run goes on without the
|
|
40
|
-
* lock, so a second replica could run concurrently: accepted, since a concurrent import or
|
|
41
|
-
* install degrades to `catalog.version_exists` and a deploy from the package store.
|
|
58
|
+
* succeeded; otherwise the next start runs it again, which is idempotent).
|
|
42
59
|
* - Only entries new to the manifest are installed (Ruling 5): an optional entry that the last
|
|
43
60
|
* completed run already handled and that is not installed now (an enterprise admin uninstalled
|
|
44
61
|
* it) stays uninstalled -> `kept`. A required entry is always installed.
|
|
@@ -197,16 +214,54 @@ async function scanOfflineDir(dir, maxBytes, log) {
|
|
|
197
214
|
}
|
|
198
215
|
return out;
|
|
199
216
|
}
|
|
200
|
-
/** The
|
|
201
|
-
const
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
217
|
+
/** The lock around a whole run (`lock:bootstrap`). */
|
|
218
|
+
export const BOOTSTRAP_LOCK_KEY = "bootstrap";
|
|
219
|
+
/** Its lifetime without renewal; a run keeps it by renewal, a crashed holder's expires. */
|
|
220
|
+
export const BOOTSTRAP_LOCK_TTL_MS = 120_000;
|
|
221
|
+
/** Optional provider: the lock's lifetime (ms) instead of {@link BOOTSTRAP_LOCK_TTL_MS} (tests shorten it). */
|
|
222
|
+
export const BOOTSTRAP_LOCK_TTL = Symbol("BOOTSTRAP_LOCK_TTL");
|
|
223
|
+
/** The pause between attempts while another holder runs the step. */
|
|
224
|
+
const LOCK_RETRY_MS = 500;
|
|
225
|
+
let BootstrapService = class BootstrapService {
|
|
226
|
+
kdb;
|
|
227
|
+
txHost;
|
|
228
|
+
locks;
|
|
229
|
+
approveLock;
|
|
230
|
+
installs;
|
|
231
|
+
ops;
|
|
232
|
+
registry;
|
|
233
|
+
configService;
|
|
234
|
+
log;
|
|
235
|
+
lockTtlMs;
|
|
236
|
+
constructor(kdb, txHost, locks, approveLock, installs, ops,
|
|
237
|
+
/**
|
|
238
|
+
* Config-declared extension names (an entry of the same name is kept, config wins, and no
|
|
239
|
+
* install record is created): the start sequence records them before the bootstrap step, the
|
|
240
|
+
* CLI from its inspection.
|
|
241
|
+
*/
|
|
242
|
+
registry, configService, log,
|
|
243
|
+
/** The lock's lifetime without renewal. */
|
|
244
|
+
lockTtlMs = BOOTSTRAP_LOCK_TTL_MS) {
|
|
245
|
+
this.kdb = kdb;
|
|
246
|
+
this.txHost = txHost;
|
|
247
|
+
this.locks = locks;
|
|
248
|
+
this.approveLock = approveLock;
|
|
249
|
+
this.installs = installs;
|
|
250
|
+
this.ops = ops;
|
|
251
|
+
this.registry = registry;
|
|
252
|
+
this.configService = configService;
|
|
253
|
+
this.log = log;
|
|
254
|
+
this.lockTtlMs = lockTtlMs;
|
|
255
|
+
}
|
|
256
|
+
get db() {
|
|
257
|
+
return this.kdb.db;
|
|
258
|
+
}
|
|
259
|
+
config() {
|
|
260
|
+
return this.configService.get();
|
|
206
261
|
}
|
|
207
262
|
/** Whether the bootstrap step completed for the manifest with this sha256. */
|
|
208
263
|
async isDone(manifestSha256) {
|
|
209
|
-
const row = await this.
|
|
264
|
+
const row = await this.db
|
|
210
265
|
.selectFrom("bootstrap_runs")
|
|
211
266
|
.select("manifest_sha256")
|
|
212
267
|
.where("manifest_sha256", "=", manifestSha256)
|
|
@@ -223,7 +278,7 @@ export class BootstrapService {
|
|
|
223
278
|
async run(o) {
|
|
224
279
|
const manifestSha256 = bootstrapManifestSha256(o.manifest);
|
|
225
280
|
const recorded = async () => {
|
|
226
|
-
const done = await this.
|
|
281
|
+
const done = await this.db
|
|
227
282
|
.selectFrom("bootstrap_runs")
|
|
228
283
|
.select("results")
|
|
229
284
|
.where("manifest_sha256", "=", manifestSha256)
|
|
@@ -234,7 +289,7 @@ export class BootstrapService {
|
|
|
234
289
|
const before = await recorded();
|
|
235
290
|
if (before)
|
|
236
291
|
return before;
|
|
237
|
-
return this.locked(o.signal, async () => {
|
|
292
|
+
return this.locked(o.signal, async (signal) => {
|
|
238
293
|
// Another replica may have finished it while this one waited for the lock
|
|
239
294
|
const done = await recorded();
|
|
240
295
|
if (done)
|
|
@@ -242,21 +297,21 @@ export class BootstrapService {
|
|
|
242
297
|
// Every package is obtained and checked before the first write
|
|
243
298
|
const files = await resolveBootstrapPackages(o.manifest, {
|
|
244
299
|
...(o.dir !== undefined && { dir: o.dir }),
|
|
245
|
-
config: this.
|
|
246
|
-
|
|
247
|
-
log: this.
|
|
300
|
+
config: this.config(),
|
|
301
|
+
signal,
|
|
302
|
+
log: this.log,
|
|
248
303
|
});
|
|
249
304
|
const handled = await this.lastRunNames();
|
|
250
305
|
const results = [];
|
|
251
306
|
const failures = [];
|
|
252
307
|
for (const e of o.manifest.plugins) {
|
|
253
|
-
|
|
308
|
+
signal.throwIfAborted();
|
|
254
309
|
try {
|
|
255
|
-
const r = await this.entry(e, files.get(e.name), handled);
|
|
310
|
+
const r = await this.entry(e, files.get(e.name), handled, o.imports);
|
|
256
311
|
results.push(carried(r, o.carry));
|
|
257
312
|
}
|
|
258
313
|
catch (err) {
|
|
259
|
-
this.
|
|
314
|
+
this.log.error("bootstrap: a plugin could not be installed", {
|
|
260
315
|
plugin: e.name,
|
|
261
316
|
version: e.version,
|
|
262
317
|
required: e.required,
|
|
@@ -273,63 +328,53 @@ export class BootstrapService {
|
|
|
273
328
|
results.push(...(await this.clearRemoved(o.manifest)));
|
|
274
329
|
if (failures.length > 0)
|
|
275
330
|
throw new BootstrapFailedError(failures, results);
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
.values({
|
|
280
|
-
manifest_sha256: manifestSha256,
|
|
281
|
-
completed_at: sql `now()`,
|
|
282
|
-
results: JSON.stringify(results),
|
|
283
|
-
})
|
|
284
|
-
.execute();
|
|
285
|
-
await audit(trx, {
|
|
286
|
-
action: "bootstrap.completed",
|
|
287
|
-
target: manifestSha256,
|
|
288
|
-
detail: { manifestSha256, results },
|
|
289
|
-
});
|
|
290
|
-
});
|
|
291
|
-
this.d.log.info("bootstrap completed", { manifestSha256, results });
|
|
331
|
+
signal.throwIfAborted();
|
|
332
|
+
await this.recordDone(manifestSha256, results);
|
|
333
|
+
this.log.info("bootstrap completed", { manifestSha256, results });
|
|
292
334
|
return { manifestSha256, results };
|
|
293
335
|
});
|
|
294
336
|
}
|
|
337
|
+
/** The `bootstrap_runs` row and the `bootstrap.completed` audit, in one transaction. */
|
|
338
|
+
async recordDone(manifestSha256, results) {
|
|
339
|
+
await this.db
|
|
340
|
+
.insertInto("bootstrap_runs")
|
|
341
|
+
.values({
|
|
342
|
+
manifest_sha256: manifestSha256,
|
|
343
|
+
completed_at: sql `now()`,
|
|
344
|
+
results: JSON.stringify(results),
|
|
345
|
+
})
|
|
346
|
+
.execute();
|
|
347
|
+
await audit(this.db, {
|
|
348
|
+
action: "bootstrap.completed",
|
|
349
|
+
target: manifestSha256,
|
|
350
|
+
detail: { manifestSha256, results },
|
|
351
|
+
});
|
|
352
|
+
}
|
|
295
353
|
/**
|
|
296
|
-
* Runs `fn` holding
|
|
297
|
-
*
|
|
298
|
-
*
|
|
354
|
+
* Runs `fn` holding `lock:bootstrap`: waits without bound while another replica holds it
|
|
355
|
+
* (until `signal` aborts), renews it while `fn` runs and releases it afterwards. `fn` gets a
|
|
356
|
+
* signal that also aborts when the lock is lost.
|
|
299
357
|
*/
|
|
300
358
|
async locked(signal, fn) {
|
|
301
|
-
const
|
|
302
|
-
|
|
303
|
-
|
|
359
|
+
const handle = await this.locks.acquire(BOOTSTRAP_LOCK_KEY, {
|
|
360
|
+
ttlMs: this.lockTtlMs,
|
|
361
|
+
waitMs: Number.POSITIVE_INFINITY,
|
|
362
|
+
retryMs: LOCK_RETRY_MS,
|
|
363
|
+
...(signal !== undefined && { signal }),
|
|
304
364
|
});
|
|
305
|
-
|
|
365
|
+
// An unbounded wait returns a handle or throws the abort reason
|
|
366
|
+
if (!handle)
|
|
367
|
+
throw new Error("bootstrap: the lock could not be taken");
|
|
306
368
|
try {
|
|
307
|
-
await
|
|
308
|
-
for (let wait = 100;; wait = Math.min(wait * 2, 1_000)) {
|
|
309
|
-
signal?.throwIfAborted();
|
|
310
|
-
const r = await client.query("SELECT pg_try_advisory_lock(hashtext($1)) AS ok", [LOCK_KEY]);
|
|
311
|
-
if (r.rows[0]?.ok === true)
|
|
312
|
-
break;
|
|
313
|
-
await sleep(wait, signal);
|
|
314
|
-
}
|
|
315
|
-
try {
|
|
316
|
-
return await fn();
|
|
317
|
-
}
|
|
318
|
-
finally {
|
|
319
|
-
await client
|
|
320
|
-
.query("SELECT pg_advisory_unlock(hashtext($1))", [LOCK_KEY])
|
|
321
|
-
.catch((err) => this.d.log.warn("bootstrap: cannot release the advisory lock; closing its connection", {
|
|
322
|
-
err,
|
|
323
|
-
}));
|
|
324
|
-
}
|
|
369
|
+
return await fn(signal ? AbortSignal.any([signal, handle.lost]) : handle.lost);
|
|
325
370
|
}
|
|
326
371
|
finally {
|
|
327
|
-
await
|
|
372
|
+
await handle.release();
|
|
328
373
|
}
|
|
329
374
|
}
|
|
330
375
|
/** The entry names the last completed run handled (undefined before any run completed). */
|
|
331
376
|
async lastRunNames() {
|
|
332
|
-
const row = await this.
|
|
377
|
+
const row = await this.db
|
|
333
378
|
.selectFrom("bootstrap_runs")
|
|
334
379
|
.select("results")
|
|
335
380
|
.orderBy("completed_at", "desc")
|
|
@@ -341,9 +386,9 @@ export class BootstrapService {
|
|
|
341
386
|
.filter((r) => r.action !== "required_cleared")
|
|
342
387
|
.map((r) => r.name));
|
|
343
388
|
}
|
|
344
|
-
async entry(e, bytes, handled) {
|
|
389
|
+
async entry(e, bytes, handled, imports) {
|
|
345
390
|
const pkg = await readPluginPackage(bytes, {
|
|
346
|
-
maxBytes: this.
|
|
391
|
+
maxBytes: this.config().packages.maxBytes,
|
|
347
392
|
hostSdkVersion: SDK_VERSION,
|
|
348
393
|
}).catch((err) => {
|
|
349
394
|
throw err instanceof PluginPackageError ? catalogPackageError(err) : err;
|
|
@@ -357,32 +402,32 @@ export class BootstrapService {
|
|
|
357
402
|
if (!pkg.manifest.extension) {
|
|
358
403
|
if (!isNew)
|
|
359
404
|
return { name: e.name, action: "kept", version: e.version };
|
|
360
|
-
const imported = await this.importOnly(e, bytes, ref);
|
|
405
|
+
const imported = await this.importOnly(e, bytes, ref, imports);
|
|
361
406
|
return { name: e.name, action: imported ? "imported" : "kept", version: e.version };
|
|
362
407
|
}
|
|
363
|
-
if (this.
|
|
364
|
-
this.
|
|
408
|
+
if (this.registry.declared().has(e.name)) {
|
|
409
|
+
this.log.warn("bootstrap: the plugin is declared in the extensions config list; the config plugin is used", { plugin: e.name });
|
|
365
410
|
return { name: e.name, action: "kept", version: e.version };
|
|
366
411
|
}
|
|
367
|
-
const row = await this.
|
|
412
|
+
const row = await this.db
|
|
368
413
|
.selectFrom("extension_installs")
|
|
369
414
|
.select(["version", "source", "required", "desired_state", "sha256"])
|
|
370
415
|
.where("name", "=", e.name)
|
|
371
416
|
.executeTakeFirst();
|
|
372
417
|
if (!row && !isNew && !e.required) {
|
|
373
|
-
this.
|
|
418
|
+
this.log.info("bootstrap: an optional plugin that is not installed stays uninstalled", {
|
|
374
419
|
plugin: e.name,
|
|
375
420
|
});
|
|
376
421
|
return { name: e.name, action: "kept", version: e.version };
|
|
377
422
|
}
|
|
378
423
|
let result;
|
|
379
424
|
if (!row) {
|
|
380
|
-
await this.deploy(e, bytes, ref, true);
|
|
425
|
+
await this.deploy(e, bytes, ref, true, imports);
|
|
381
426
|
result = { name: e.name, action: "installed", version: e.version };
|
|
382
427
|
}
|
|
383
428
|
else if (row.source === "bootstrap" && isLower(row.version, e.version)) {
|
|
384
429
|
// The desired state the admin chose is kept; a required plugin is enabled below anyway
|
|
385
|
-
await this.deploy(e, bytes, ref, row.desired_state === "enabled");
|
|
430
|
+
await this.deploy(e, bytes, ref, row.desired_state === "enabled", imports);
|
|
386
431
|
result = { name: e.name, action: "upgraded", version: e.version };
|
|
387
432
|
}
|
|
388
433
|
else {
|
|
@@ -391,12 +436,12 @@ export class BootstrapService {
|
|
|
391
436
|
row.sha256 !== createHash("sha256").update(bytes).digest("hex")) {
|
|
392
437
|
// The pin changed bytes without a version bump (an image built from main between
|
|
393
438
|
// releases): the installed package stays, so say so instead of keeping it silently
|
|
394
|
-
this.
|
|
439
|
+
this.log.warn("bootstrap: the image's package differs from the installed one at the same version; the installed package is kept (bump the version to roll it out)", { plugin: e.name, version: e.version });
|
|
395
440
|
}
|
|
396
441
|
result = { name: e.name, action: "kept", version: row.version };
|
|
397
442
|
}
|
|
398
443
|
if (row?.required !== e.required) {
|
|
399
|
-
await this.
|
|
444
|
+
await this.db
|
|
400
445
|
.updateTable("extension_installs")
|
|
401
446
|
.set({ required: e.required })
|
|
402
447
|
.where("name", "=", e.name)
|
|
@@ -404,19 +449,19 @@ export class BootstrapService {
|
|
|
404
449
|
}
|
|
405
450
|
// A required install must run on the deployment (an org cannot use it otherwise)
|
|
406
451
|
if (e.required && row?.desired_state === "disabled") {
|
|
407
|
-
await this.
|
|
452
|
+
await this.ops.enable(e.name, null);
|
|
408
453
|
}
|
|
409
454
|
return result;
|
|
410
455
|
}
|
|
411
456
|
/** A declarative plugin: catalog only. Returns false when that version is already imported. */
|
|
412
|
-
async importOnly(e, bytes, ref) {
|
|
457
|
+
async importOnly(e, bytes, ref, imports) {
|
|
413
458
|
try {
|
|
414
|
-
const { stagingId, review } = await
|
|
459
|
+
const { stagingId, review } = await imports.prepare(null, bytes, {
|
|
415
460
|
kind: "bootstrap",
|
|
416
461
|
ref,
|
|
417
462
|
integrity: e.integrity,
|
|
418
463
|
});
|
|
419
|
-
await
|
|
464
|
+
await imports.confirm(null, stagingId, {
|
|
420
465
|
reviewHash: review.reviewHash,
|
|
421
466
|
deployExtension: false,
|
|
422
467
|
});
|
|
@@ -433,10 +478,10 @@ export class BootstrapService {
|
|
|
433
478
|
* the catalog already has this version (an earlier run stopped after importing, or the same
|
|
434
479
|
* package came from a marketplace), the extension is deployed from the package store instead.
|
|
435
480
|
*/
|
|
436
|
-
async deploy(e, bytes, ref, enable) {
|
|
481
|
+
async deploy(e, bytes, ref, enable, imports) {
|
|
437
482
|
let staged;
|
|
438
483
|
try {
|
|
439
|
-
staged = await
|
|
484
|
+
staged = await imports.prepare(null, bytes, {
|
|
440
485
|
kind: "bootstrap",
|
|
441
486
|
ref,
|
|
442
487
|
integrity: e.integrity,
|
|
@@ -449,7 +494,7 @@ export class BootstrapService {
|
|
|
449
494
|
}
|
|
450
495
|
throw err;
|
|
451
496
|
}
|
|
452
|
-
const r = await
|
|
497
|
+
const r = await imports.confirm(null, staged.stagingId, {
|
|
453
498
|
reviewHash: staged.review.reviewHash,
|
|
454
499
|
deployExtension: true,
|
|
455
500
|
enable,
|
|
@@ -460,45 +505,47 @@ export class BootstrapService {
|
|
|
460
505
|
}
|
|
461
506
|
/** The extension of a catalog version already imported: ingest, approve, install (, enable). */
|
|
462
507
|
async deployFromStore(e, bytes, ref, enable) {
|
|
463
|
-
const review = await this.
|
|
508
|
+
const review = await this.installs.ingest(null, bytes, { source: "bootstrap", ref }, { store: "pg" });
|
|
464
509
|
let set;
|
|
465
510
|
try {
|
|
466
511
|
set = permissionSetOfPackage(await readExtensionPackage(bytes, {
|
|
467
|
-
maxBytes: this.
|
|
512
|
+
maxBytes: this.config().packages.maxBytes,
|
|
468
513
|
hostSdkVersion: SDK_VERSION,
|
|
469
514
|
}));
|
|
470
515
|
}
|
|
471
516
|
catch (err) {
|
|
472
517
|
throw err instanceof ExtensionPackageError ? catalogPackageError(err) : err;
|
|
473
518
|
}
|
|
474
|
-
await this.
|
|
475
|
-
|
|
476
|
-
const snap = await trx
|
|
477
|
-
.selectFrom("extension_permission_snapshots")
|
|
478
|
-
.select("permissions")
|
|
479
|
-
.where("plugin", "=", e.name)
|
|
480
|
-
.forUpdate()
|
|
481
|
-
.executeTakeFirst();
|
|
482
|
-
const { added, removed } = diffPermissions(snap?.permissions, set);
|
|
483
|
-
await writeSnapshot(trx, e.name, e.version, set, {
|
|
484
|
-
source: "bootstrap",
|
|
485
|
-
audit: { added, removed, sha256: review.sha256 },
|
|
486
|
-
});
|
|
487
|
-
});
|
|
488
|
-
const item = await this.d.db
|
|
519
|
+
await this.approveStored(e, set, review.sha256);
|
|
520
|
+
const item = await this.db
|
|
489
521
|
.selectFrom("catalog_items")
|
|
490
522
|
.select("id")
|
|
491
523
|
.where("name", "=", e.name)
|
|
492
524
|
.where("deleted_at", "is", null)
|
|
493
525
|
.executeTakeFirst();
|
|
494
|
-
await this.
|
|
526
|
+
await this.ops.install(e.name, review.sha256, null, undefined, item ? { catalogItemId: item.id } : {});
|
|
495
527
|
if (enable)
|
|
496
|
-
await this.
|
|
528
|
+
await this.ops.enable(e.name, null);
|
|
529
|
+
}
|
|
530
|
+
/** The permission snapshot of a stored package (source `bootstrap`), under the approve lock. */
|
|
531
|
+
async approveStored(e, set, sha256) {
|
|
532
|
+
await this.approveLock.lock(e.name);
|
|
533
|
+
const snap = await this.db
|
|
534
|
+
.selectFrom("extension_permission_snapshots")
|
|
535
|
+
.select("permissions")
|
|
536
|
+
.where("plugin", "=", e.name)
|
|
537
|
+
.forUpdate()
|
|
538
|
+
.executeTakeFirst();
|
|
539
|
+
const { added, removed } = diffPermissions(snap?.permissions, set);
|
|
540
|
+
await writeSnapshot(this.db, e.name, e.version, set, {
|
|
541
|
+
source: "bootstrap",
|
|
542
|
+
audit: { added, removed, sha256 },
|
|
543
|
+
});
|
|
497
544
|
}
|
|
498
545
|
/** Install records still `required` whose entry left the manifest lose `required`. */
|
|
499
546
|
async clearRemoved(manifest) {
|
|
500
547
|
const names = manifest.plugins.map((p) => p.name);
|
|
501
|
-
let q = this.
|
|
548
|
+
let q = this.db
|
|
502
549
|
.updateTable("extension_installs")
|
|
503
550
|
.set({ required: false })
|
|
504
551
|
.where("required", "=", true);
|
|
@@ -507,7 +554,28 @@ export class BootstrapService {
|
|
|
507
554
|
const rows = await q.returning(["name", "version"]).execute();
|
|
508
555
|
return rows.map((r) => ({ name: r.name, action: "required_cleared", version: r.version }));
|
|
509
556
|
}
|
|
510
|
-
}
|
|
557
|
+
};
|
|
558
|
+
__decorate([
|
|
559
|
+
Transactional()
|
|
560
|
+
], BootstrapService.prototype, "recordDone", null);
|
|
561
|
+
__decorate([
|
|
562
|
+
Transactional()
|
|
563
|
+
], BootstrapService.prototype, "approveStored", null);
|
|
564
|
+
BootstrapService = __decorate([
|
|
565
|
+
Injectable(),
|
|
566
|
+
__param(0, Inject(KernelDb)),
|
|
567
|
+
__param(1, Inject(TransactionHost)),
|
|
568
|
+
__param(2, Inject(LockService)),
|
|
569
|
+
__param(3, Inject(PluginApproveLock)),
|
|
570
|
+
__param(4, Inject(ExtensionInstalls)),
|
|
571
|
+
__param(5, Inject(ExtensionAdminOps)),
|
|
572
|
+
__param(6, Inject(ExtensionRegistry)),
|
|
573
|
+
__param(7, Inject(KernelConfigService)),
|
|
574
|
+
__param(8, Inject(KERNEL_LOGGER)),
|
|
575
|
+
__param(9, Optional()),
|
|
576
|
+
__param(9, Inject(BOOTSTRAP_LOCK_TTL))
|
|
577
|
+
], BootstrapService);
|
|
578
|
+
export { BootstrapService };
|
|
511
579
|
/** A `kept` result whose entry an earlier pass of the same start installed / upgraded / imported. */
|
|
512
580
|
function carried(r, carry) {
|
|
513
581
|
if (r.action !== "kept")
|
|
@@ -517,19 +585,5 @@ function carried(r, carry) {
|
|
|
517
585
|
? before
|
|
518
586
|
: r;
|
|
519
587
|
}
|
|
520
|
-
/** Resolves after `ms`; rejects with the abort reason when `signal` aborts first. */
|
|
521
|
-
function sleep(ms, signal) {
|
|
522
|
-
return new Promise((resolve, reject) => {
|
|
523
|
-
const onAbort = () => {
|
|
524
|
-
clearTimeout(timer);
|
|
525
|
-
reject(signal?.reason);
|
|
526
|
-
};
|
|
527
|
-
const timer = setTimeout(() => {
|
|
528
|
-
signal?.removeEventListener("abort", onAbort);
|
|
529
|
-
resolve();
|
|
530
|
-
}, ms);
|
|
531
|
-
signal?.addEventListener("abort", onAbort, { once: true });
|
|
532
|
-
});
|
|
533
|
-
}
|
|
534
588
|
/** `installed` is below `pinned` (a version that is not semver is never upgraded). */
|
|
535
589
|
const isLower = (installed, pinned) => semver.valid(installed) !== null && semver.valid(pinned) !== null && semver.lt(installed, pinned);
|
package/dist/extensions/cli.d.ts
CHANGED
|
@@ -1,18 +1,23 @@
|
|
|
1
|
+
import type { DynamicModule, INestApplicationContext, Type } from "@nestjs/common";
|
|
1
2
|
import type { z } from "zod";
|
|
2
3
|
import type { KernelConfig } from "../config/schema.js";
|
|
3
|
-
import { type KernelDb } from "../db/kernel-schema.js";
|
|
4
4
|
import type { KernelLogger } from "../log.js";
|
|
5
5
|
import { ExtensionAdminOps } from "./admin-ops.js";
|
|
6
6
|
import { ExtensionAdmin } from "./admin-view.js";
|
|
7
7
|
import { ExtensionApprovals } from "./approvals.js";
|
|
8
|
-
import {
|
|
8
|
+
import { BootstrapService } from "./bootstrap.js";
|
|
9
|
+
import { type ConfigIssue } from "./config-issues.js";
|
|
9
10
|
import { type InspectedExtension } from "./host.js";
|
|
10
11
|
import { ExtensionInstalls } from "./installs.js";
|
|
11
12
|
import type { PermissionSet } from "./permission-set.js";
|
|
12
13
|
/** {@link openExtensionCli} 的结果:CLI 的 `capybara extensions *` 共用。 */
|
|
13
14
|
export interface ExtensionCli {
|
|
14
15
|
config: KernelConfig;
|
|
15
|
-
|
|
16
|
+
/**
|
|
17
|
+
* The command's Nest application context: the extension providers, the database
|
|
18
|
+
* and the CLI's Redis. Closed by {@link close}.
|
|
19
|
+
*/
|
|
20
|
+
app: INestApplicationContext;
|
|
16
21
|
/** 配置声明的插件(导入、按依赖排序,不 setup)。 */
|
|
17
22
|
inspected: InspectedExtension[];
|
|
18
23
|
/**
|
|
@@ -37,6 +42,8 @@ export interface ExtensionCli {
|
|
|
37
42
|
admin: ExtensionAdmin;
|
|
38
43
|
ops: ExtensionAdminOps;
|
|
39
44
|
approvals: ExtensionApprovals;
|
|
45
|
+
/** The bootstrap step (`capybara bootstrap`), under the same `lock:bootstrap` as the kernel. */
|
|
46
|
+
bootstrap: BootstrapService;
|
|
40
47
|
/** CLI 本次刚导入的包字节(降级判断等读包时优先用它:包可能存在 CLI 读不到的对象存储里)。 */
|
|
41
48
|
remember(sha256: string, bytes: Uint8Array): void;
|
|
42
49
|
/** 安装记录包的权限集合(与后台审阅相同);包在对象存储里时 CLI 读不到,抛错。 */
|
|
@@ -48,14 +55,17 @@ export interface ExtensionCli {
|
|
|
48
55
|
close(): Promise<void>;
|
|
49
56
|
}
|
|
50
57
|
/**
|
|
51
|
-
* The CLI's extension management context (C18, F-Q):
|
|
52
|
-
*
|
|
53
|
-
*
|
|
54
|
-
*
|
|
55
|
-
*
|
|
56
|
-
*
|
|
57
|
-
*
|
|
58
|
+
* The CLI's extension management context (C18, F-Q): a Nest application context with
|
|
59
|
+
* the extensions module over the database and a lazy Redis connection used only for publishing
|
|
60
|
+
* and the bootstrap lock. It loads no extension and runs no extension's `setup` (a catalog import
|
|
61
|
+
* sets up the declared object-store extension itself, see `openCatalogCli`). Packages the CLI
|
|
62
|
+
* imports are always stored in PG (`blob_store = 'pg'`); replicas read by `blob_store`. Install /
|
|
63
|
+
* enable / disable / uninstall share {@link ExtensionAdminOps} with the admin console (actor null,
|
|
64
|
+
* audits without an actor); after writing PG it publishes `kernel.plugins.changed` and running
|
|
65
|
+
* replicas reconcile; a failed publish only warns (the periodic reconcile catches up).
|
|
58
66
|
*/
|
|
59
67
|
export declare function openExtensionCli(config: KernelConfig, log: KernelLogger, opts?: {
|
|
60
68
|
resolveFrom?: string;
|
|
69
|
+
/** More domain modules for the context (the catalog CLI adds its import module). */
|
|
70
|
+
modules?: (Type | DynamicModule)[];
|
|
61
71
|
}): Promise<ExtensionCli>;
|