@capybara-hq/kernel 0.1.0-rc.1 → 0.1.0-rc.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/admin/admin.controller.d.ts +17 -17
- package/dist/admin/admin.controller.js +43 -26
- package/dist/admin/admin.module.d.ts +3 -0
- package/dist/admin/admin.module.js +22 -0
- package/dist/admin/extensions.controller.d.ts +14 -14
- package/dist/admin/extensions.controller.js +30 -17
- package/dist/admin/setup-lock.d.ts +16 -0
- package/dist/admin/setup-lock.js +47 -0
- package/dist/admin/setup.controller.d.ts +8 -8
- package/dist/admin/setup.controller.js +27 -25
- package/dist/admin/setup.service.d.ts +19 -27
- package/dist/admin/setup.service.js +61 -61
- package/dist/agents/agent-lookup.d.ts +53 -0
- package/dist/agents/agent-lookup.js +179 -0
- package/dist/agents/agents.controller.d.ts +1 -1
- package/dist/agents/agents.controller.js +14 -8
- package/dist/agents/agents.module.d.ts +7 -0
- package/dist/agents/agents.module.js +41 -0
- package/dist/agents/agents.service.d.ts +39 -58
- package/dist/agents/agents.service.js +261 -329
- package/dist/agents/definition.d.ts +8 -0
- package/dist/agents/definition.js +8 -0
- package/dist/agents/models.controller.d.ts +1 -1
- package/dist/agents/models.controller.js +2 -2
- package/dist/agents/templates.controller.d.ts +1 -1
- package/dist/agents/templates.controller.js +2 -2
- package/dist/agents/templates.d.ts +6 -8
- package/dist/agents/templates.js +20 -4
- package/dist/app.d.ts +93 -0
- package/dist/app.js +150 -0
- package/dist/catalog/admin-catalog.controller.d.ts +3 -3
- package/dist/catalog/admin-catalog.controller.js +27 -13
- package/dist/catalog/catalog-content.d.ts +185 -0
- package/dist/catalog/catalog-content.js +323 -0
- package/dist/catalog/catalog-items.d.ts +186 -0
- package/dist/catalog/catalog-items.js +410 -0
- package/dist/catalog/catalog.module.d.ts +14 -0
- package/dist/catalog/catalog.module.js +71 -0
- package/dist/catalog/catalog.service.d.ts +34 -188
- package/dist/catalog/catalog.service.js +155 -489
- package/dist/catalog/cli.d.ts +3 -2
- package/dist/catalog/cli.js +13 -31
- package/dist/catalog/job-ids.d.ts +15 -0
- package/dist/catalog/job-ids.js +15 -0
- package/dist/catalog/jobs.d.ts +27 -0
- package/dist/catalog/jobs.js +70 -0
- package/dist/catalog/locks.d.ts +24 -0
- package/dist/catalog/locks.js +63 -0
- package/dist/catalog/marketplaces.controller.d.ts +4 -4
- package/dist/catalog/marketplaces.controller.js +22 -11
- package/dist/catalog/marketplaces.service.d.ts +30 -13
- package/dist/catalog/marketplaces.service.js +330 -256
- package/dist/catalog/org-catalog.controller.d.ts +4 -3
- package/dist/catalog/org-catalog.controller.js +29 -14
- package/dist/catalog/org-catalog.service.d.ts +32 -198
- package/dist/catalog/org-catalog.service.js +159 -400
- package/dist/catalog/plugin-import.d.ts +73 -34
- package/dist/catalog/plugin-import.js +356 -217
- package/dist/catalog/plugin-install.d.ts +83 -41
- package/dist/catalog/plugin-install.js +421 -269
- package/dist/catalog/plugin-upgrade.d.ts +59 -4
- package/dist/catalog/plugin-upgrade.js +407 -282
- package/dist/catalog/requests.service.d.ts +27 -15
- package/dist/catalog/requests.service.js +201 -145
- package/dist/catalog/upgrade-targets.d.ts +4 -7
- package/dist/channels/actions.d.ts +6 -4
- package/dist/channels/actions.js +1 -1
- package/dist/channels/cards.d.ts +2 -2
- package/dist/channels/channels.module.d.ts +40 -0
- package/dist/channels/channels.module.js +128 -0
- package/dist/channels/connections.controller.d.ts +1 -1
- package/dist/channels/connections.controller.js +11 -6
- package/dist/channels/connections.service.d.ts +43 -21
- package/dist/channels/connections.service.js +236 -131
- package/dist/channels/inbound.d.ts +34 -38
- package/dist/channels/inbound.js +107 -41
- package/dist/channels/job-ids.d.ts +10 -0
- package/dist/channels/job-ids.js +10 -0
- package/dist/channels/jobs.d.ts +85 -0
- package/dist/channels/jobs.js +157 -0
- package/dist/channels/outbound.d.ts +60 -82
- package/dist/channels/outbound.js +165 -194
- package/dist/channels/supervisor.d.ts +88 -46
- package/dist/channels/supervisor.js +230 -132
- package/dist/channels/threads.d.ts +29 -8
- package/dist/channels/threads.js +71 -13
- package/dist/channels/webhook.d.ts +20 -14
- package/dist/channels/webhook.js +51 -20
- package/dist/config/load.d.ts +3 -2
- package/dist/config/load.js +3 -2
- package/dist/config/nacos-source.js +11 -2
- package/dist/config/schema.d.ts +1 -0
- package/dist/config/schema.js +10 -4
- package/dist/conversations/access.d.ts +29 -0
- package/dist/conversations/access.js +86 -0
- package/dist/conversations/artifacts.d.ts +10 -10
- package/dist/conversations/artifacts.js +35 -9
- package/dist/conversations/attachments.controller.d.ts +1 -1
- package/dist/conversations/attachments.controller.js +8 -6
- package/dist/conversations/attachments.module.d.ts +7 -0
- package/dist/conversations/attachments.module.js +25 -0
- package/dist/conversations/attachments.service.d.ts +30 -22
- package/dist/conversations/attachments.service.js +119 -46
- package/dist/conversations/conversations.controller.d.ts +8 -7
- package/dist/conversations/conversations.controller.js +59 -29
- package/dist/conversations/conversations.module.d.ts +8 -0
- package/dist/conversations/conversations.module.js +69 -0
- package/dist/conversations/conversations.service.d.ts +40 -38
- package/dist/conversations/conversations.service.js +130 -140
- package/dist/conversations/event-log.d.ts +28 -18
- package/dist/conversations/event-log.js +74 -27
- package/dist/conversations/files.d.ts +10 -10
- package/dist/conversations/files.js +37 -11
- package/dist/conversations/idem-keys.d.ts +5 -0
- package/dist/conversations/idem-keys.js +5 -0
- package/dist/conversations/job-ids.d.ts +6 -0
- package/dist/conversations/job-ids.js +6 -0
- package/dist/conversations/outputs-read.d.ts +11 -11
- package/dist/conversations/outputs-read.js +31 -7
- package/dist/conversations/queue.d.ts +48 -56
- package/dist/conversations/queue.js +13 -289
- package/dist/conversations/queue.service.d.ts +60 -0
- package/dist/conversations/queue.service.js +343 -0
- package/dist/conversations/sandbox-status.d.ts +13 -10
- package/dist/conversations/sandbox-status.js +36 -8
- package/dist/conversations/titles.d.ts +71 -24
- package/dist/conversations/titles.js +159 -63
- package/dist/ctx/bus.js +9 -3
- package/dist/ctx/create-ctx.d.ts +6 -0
- package/dist/ctx/create-ctx.js +7 -9
- package/dist/ctx/lock.d.ts +7 -3
- package/dist/ctx/lock.js +9 -20
- package/dist/ctx/secrets.d.ts +10 -2
- package/dist/ctx/secrets.js +7 -3
- package/dist/db/kernel-schema.d.ts +2 -2
- package/dist/db/pool.d.ts +5 -0
- package/dist/db/pool.js +1 -0
- package/dist/errors.d.ts +1 -0
- package/dist/errors.js +1 -0
- package/dist/evals/budget.d.ts +42 -21
- package/dist/evals/budget.js +114 -62
- package/dist/evals/evals.module.d.ts +31 -0
- package/dist/evals/evals.module.js +114 -0
- package/dist/evals/jobs.d.ts +20 -0
- package/dist/evals/jobs.js +45 -0
- package/dist/evals/run-replay.d.ts +56 -8
- package/dist/evals/run-replay.js +140 -80
- package/dist/evals/runs.controller.d.ts +1 -1
- package/dist/evals/runs.controller.js +17 -8
- package/dist/evals/runs.service.d.ts +23 -45
- package/dist/evals/runs.service.js +245 -234
- package/dist/evals/sets.controller.d.ts +1 -1
- package/dist/evals/sets.controller.js +17 -8
- package/dist/evals/sets.service.d.ts +22 -6
- package/dist/evals/sets.service.js +248 -194
- package/dist/evals/snapshot.d.ts +2 -2
- package/dist/evals/step-replay.d.ts +2 -2
- package/dist/evals/step-replay.js +1 -1
- package/dist/evals/trajectory.controller.d.ts +1 -1
- package/dist/evals/trajectory.controller.js +11 -7
- package/dist/evals/trajectory.service.d.ts +5 -4
- package/dist/evals/trajectory.service.js +30 -7
- package/dist/evals/worker.d.ts +44 -27
- package/dist/evals/worker.js +220 -121
- package/dist/extensions/admin-ops.d.ts +61 -33
- package/dist/extensions/admin-ops.js +248 -154
- package/dist/extensions/admin-view.d.ts +38 -27
- package/dist/extensions/admin-view.js +126 -55
- package/dist/extensions/approvals.d.ts +12 -8
- package/dist/extensions/approvals.js +73 -46
- package/dist/extensions/blobs.d.ts +27 -10
- package/dist/extensions/blobs.js +111 -45
- package/dist/extensions/bootstrap.d.ts +58 -31
- package/dist/extensions/bootstrap.js +175 -121
- package/dist/extensions/cli.d.ts +20 -10
- package/dist/extensions/cli.js +41 -96
- package/dist/extensions/config-issues.d.ts +7 -0
- package/dist/extensions/config-issues.js +31 -0
- package/dist/extensions/deployment-config-store.d.ts +49 -0
- package/dist/extensions/deployment-config-store.js +133 -0
- package/dist/extensions/deployment-config.d.ts +58 -67
- package/dist/extensions/deployment-config.js +202 -230
- package/dist/extensions/enabled.d.ts +5 -5
- package/dist/extensions/extensions.module.d.ts +8 -0
- package/dist/extensions/extensions.module.js +77 -0
- package/dist/extensions/hooks.d.ts +3 -2
- package/dist/extensions/hooks.js +1 -1
- package/dist/extensions/host.d.ts +72 -68
- package/dist/extensions/host.js +191 -152
- package/dist/extensions/installs.d.ts +49 -16
- package/dist/extensions/installs.js +128 -32
- package/dist/extensions/job-ids.d.ts +6 -0
- package/dist/extensions/job-ids.js +6 -0
- package/dist/extensions/lifecycle-topics.d.ts +18 -0
- package/dist/extensions/lifecycle-topics.js +18 -0
- package/dist/extensions/lifecycle.d.ts +35 -47
- package/dist/extensions/lifecycle.js +103 -39
- package/dist/extensions/locks.d.ts +33 -0
- package/dist/extensions/locks.js +86 -0
- package/dist/extensions/migrate-lock.d.ts +3 -4
- package/dist/extensions/org-config.controller.d.ts +1 -1
- package/dist/extensions/org-config.controller.js +8 -5
- package/dist/extensions/org-config.d.ts +48 -46
- package/dist/extensions/org-config.js +284 -226
- package/dist/extensions/registry.d.ts +50 -2
- package/dist/extensions/registry.js +89 -4
- package/dist/extensions/sources.d.ts +12 -8
- package/dist/extensions/sources.js +34 -13
- package/dist/files/files.module.d.ts +3 -0
- package/dist/files/files.module.js +22 -0
- package/dist/files/previewers.controller.d.ts +7 -2
- package/dist/files/previewers.controller.js +17 -9
- package/dist/files/previewers.d.ts +13 -18
- package/dist/files/previewers.js +83 -36
- package/dist/http/adapter.d.ts +3 -0
- package/dist/http/adapter.js +25 -0
- package/dist/http/api.module.d.ts +3 -110
- package/dist/http/api.module.js +47 -355
- package/dist/http/app.d.ts +11 -15
- package/dist/http/app.js +17 -62
- package/dist/http/error-filter.module.d.ts +5 -0
- package/dist/http/error-filter.module.js +18 -0
- package/dist/http/error.filter.js +2 -2
- package/dist/identity/accounts.d.ts +82 -29
- package/dist/identity/accounts.js +294 -175
- package/dist/identity/api-tokens.d.ts +11 -7
- package/dist/identity/api-tokens.js +71 -44
- package/dist/identity/audit.d.ts +7 -4
- package/dist/identity/audit.js +5 -1
- package/dist/identity/auth.controller.d.ts +11 -10
- package/dist/identity/auth.controller.js +31 -25
- package/dist/identity/auth.guard.d.ts +3 -3
- package/dist/identity/auth.guard.js +6 -4
- package/dist/identity/binding.d.ts +9 -11
- package/dist/identity/binding.js +41 -13
- package/dist/identity/enterprise-admin.d.ts +18 -12
- package/dist/identity/enterprise-admin.js +67 -13
- package/dist/identity/external-identity-lock.d.ts +17 -0
- package/dist/identity/external-identity-lock.js +39 -0
- package/dist/identity/external.d.ts +19 -15
- package/dist/identity/external.js +163 -125
- package/dist/identity/identity.module.d.ts +6 -0
- package/dist/identity/identity.module.js +56 -0
- package/dist/identity/me.controller.d.ts +16 -15
- package/dist/identity/me.controller.js +37 -31
- package/dist/identity/sessions.d.ts +12 -10
- package/dist/identity/sessions.js +74 -42
- package/dist/identity/settings.d.ts +20 -14
- package/dist/identity/settings.js +85 -57
- package/dist/identity/sso.controller.d.ts +7 -7
- package/dist/identity/sso.controller.js +13 -9
- package/dist/identity/sso.d.ts +9 -12
- package/dist/identity/sso.js +54 -24
- package/dist/inbox/inbox.module.d.ts +3 -0
- package/dist/inbox/inbox.module.js +22 -0
- package/dist/inbox/inbox.service.d.ts +7 -9
- package/dist/inbox/inbox.service.js +32 -11
- package/dist/index.d.ts +16 -11
- package/dist/index.js +9 -6
- package/dist/infra/cache/cache.module.d.ts +3 -0
- package/dist/infra/cache/cache.module.js +16 -0
- package/dist/infra/cache/cache.service.d.ts +21 -0
- package/dist/infra/cache/cache.service.js +80 -0
- package/dist/infra/cache/cacheable.decorator.d.ts +32 -0
- package/dist/infra/cache/cacheable.decorator.js +83 -0
- package/dist/infra/cli/kernel-cli.module.d.ts +66 -0
- package/dist/infra/cli/kernel-cli.module.js +165 -0
- package/dist/infra/close-within.d.ts +15 -0
- package/dist/infra/close-within.js +36 -0
- package/dist/infra/config/config.module.d.ts +13 -0
- package/dist/infra/config/config.module.js +39 -0
- package/dist/infra/config/kernel-config.service.d.ts +25 -0
- package/dist/infra/config/kernel-config.service.js +126 -0
- package/dist/infra/database/after-commit.d.ts +6 -0
- package/dist/infra/database/after-commit.js +9 -0
- package/dist/infra/database/database.module.d.ts +25 -0
- package/dist/infra/database/database.module.js +90 -0
- package/dist/infra/database/kernel-db.d.ts +22 -0
- package/dist/infra/database/kernel-db.js +65 -0
- package/dist/infra/database/transaction-host.d.ts +50 -0
- package/dist/infra/database/transaction-host.js +125 -0
- package/dist/infra/database/transactional.decorator.d.ts +15 -0
- package/dist/infra/database/transactional.decorator.js +27 -0
- package/dist/infra/database/xact-lock.d.ts +17 -0
- package/dist/infra/database/xact-lock.js +43 -0
- package/dist/infra/events/kernel-events.d.ts +96 -0
- package/dist/infra/events/kernel-events.js +65 -0
- package/dist/infra/health/health.controller.d.ts +26 -0
- package/dist/infra/health/health.controller.js +104 -0
- package/dist/infra/health/health.module.d.ts +9 -0
- package/dist/infra/health/health.module.js +24 -0
- package/dist/infra/health/health.options.d.ts +10 -0
- package/dist/infra/health/health.options.js +15 -0
- package/dist/infra/health/shutdown-state.d.ts +6 -0
- package/dist/infra/health/shutdown-state.js +2 -0
- package/dist/infra/lifecycle/graceful-shutdown.module.d.ts +6 -0
- package/dist/infra/lifecycle/graceful-shutdown.module.js +23 -0
- package/dist/infra/lifecycle/graceful-shutdown.service.d.ts +70 -0
- package/dist/infra/lifecycle/graceful-shutdown.service.js +135 -0
- package/dist/infra/lifecycle/process-guards.d.ts +52 -0
- package/dist/infra/lifecycle/process-guards.js +86 -0
- package/dist/infra/lifecycle/shutdown-signals.d.ts +30 -0
- package/dist/infra/lifecycle/shutdown-signals.js +48 -0
- package/dist/infra/lock/key-template.d.ts +13 -0
- package/dist/infra/lock/key-template.js +46 -0
- package/dist/infra/lock/lock.module.d.ts +3 -0
- package/dist/infra/lock/lock.module.js +16 -0
- package/dist/infra/lock/lock.service.d.ts +120 -0
- package/dist/infra/lock/lock.service.js +343 -0
- package/dist/infra/lock/shared-lease.d.ts +44 -0
- package/dist/infra/lock/shared-lease.js +121 -0
- package/dist/infra/lock/with-lock.decorator.d.ts +28 -0
- package/dist/infra/lock/with-lock.decorator.js +49 -0
- package/dist/infra/logging/logging.module.d.ts +16 -0
- package/dist/infra/logging/logging.module.js +34 -0
- package/dist/infra/queue/configured-processor.d.ts +18 -0
- package/dist/infra/queue/configured-processor.js +23 -0
- package/dist/infra/queue/job-failure.d.ts +18 -0
- package/dist/infra/queue/job-failure.js +26 -0
- package/dist/infra/queue/queue-shutdown.d.ts +27 -0
- package/dist/infra/queue/queue-shutdown.js +81 -0
- package/dist/infra/queue/queue.module.d.ts +16 -0
- package/dist/infra/queue/queue.module.js +61 -0
- package/dist/infra/queue/redis-connection.d.ts +7 -0
- package/dist/infra/queue/redis-connection.js +18 -0
- package/dist/infra/queue/retired-schedulers.d.ts +7 -0
- package/dist/infra/queue/retired-schedulers.js +9 -0
- package/dist/infra/queue/run-job.d.ts +16 -0
- package/dist/infra/queue/run-job.js +19 -0
- package/dist/infra/redis/redis.module.d.ts +24 -0
- package/dist/infra/redis/redis.module.js +87 -0
- package/dist/infra/schedule/cron-tick.d.ts +12 -0
- package/dist/infra/schedule/cron-tick.js +25 -0
- package/dist/infra/schedule/locked-cron.decorator.d.ts +27 -0
- package/dist/infra/schedule/locked-cron.decorator.js +53 -0
- package/dist/infra/schedule/locked-interval.d.ts +69 -0
- package/dist/infra/schedule/locked-interval.js +190 -0
- package/dist/infra/schedule/locked-tick.d.ts +90 -0
- package/dist/infra/schedule/locked-tick.js +137 -0
- package/dist/infra/schedule/schedule.module.d.ts +8 -0
- package/dist/infra/schedule/schedule.module.js +27 -0
- package/dist/infra/schedule/scheduled-runs.d.ts +69 -0
- package/dist/infra/schedule/scheduled-runs.js +163 -0
- package/dist/infra/swagger/swagger.d.ts +16 -0
- package/dist/infra/swagger/swagger.js +31 -0
- package/dist/infra/throttler/credential-throttler.d.ts +35 -0
- package/dist/infra/throttler/credential-throttler.js +77 -0
- package/dist/infra/throttler/named-throttlers.d.ts +31 -0
- package/dist/infra/throttler/named-throttlers.js +119 -0
- package/dist/infra/throttler/redis-throttler-storage.d.ts +38 -0
- package/dist/infra/throttler/redis-throttler-storage.js +130 -0
- package/dist/infra/throttler/throttler.guard.d.ts +23 -0
- package/dist/infra/throttler/throttler.guard.js +68 -0
- package/dist/infra/throttler/throttler.module.d.ts +15 -0
- package/dist/infra/throttler/throttler.module.js +53 -0
- package/dist/infra/tokens.d.ts +15 -0
- package/dist/infra/tokens.js +15 -0
- package/dist/infra/validation/create-zod-dto.d.ts +23 -0
- package/dist/infra/validation/create-zod-dto.js +35 -0
- package/dist/infra/validation/parse-with-zod.d.ts +7 -0
- package/dist/infra/validation/parse-with-zod.js +12 -0
- package/dist/infra/validation/validation.module.d.ts +3 -0
- package/dist/infra/validation/validation.module.js +16 -0
- package/dist/infra/validation/zod-params.d.ts +7 -0
- package/dist/infra/validation/zod-params.js +42 -0
- package/dist/infra/validation/zod-validation.pipe.d.ts +11 -0
- package/dist/infra/validation/zod-validation.pipe.js +31 -0
- package/dist/kernel.d.ts +9 -244
- package/dist/kernel.js +8 -1305
- package/dist/kernel.module.d.ts +17 -0
- package/dist/kernel.module.js +136 -0
- package/dist/lifecycle/kernel-lifecycle.d.ts +140 -0
- package/dist/lifecycle/kernel-lifecycle.js +451 -0
- package/dist/lifecycle/tokens.d.ts +3 -0
- package/dist/lifecycle/tokens.js +3 -0
- package/dist/log-context.d.ts +2 -0
- package/dist/log-context.js +4 -0
- package/dist/models/models.module.d.ts +3 -0
- package/dist/models/models.module.js +24 -0
- package/dist/models/prices.d.ts +8 -2
- package/dist/models/prices.js +65 -37
- package/dist/models/purposes.controller.d.ts +1 -1
- package/dist/models/purposes.controller.js +5 -6
- package/dist/models/purposes.d.ts +35 -13
- package/dist/models/purposes.js +101 -51
- package/dist/orgs/directory-sync.controller.d.ts +1 -1
- package/dist/orgs/directory-sync.controller.js +2 -2
- package/dist/orgs/directory-sync.d.ts +61 -31
- package/dist/orgs/directory-sync.js +212 -125
- package/dist/orgs/invitations.controller.d.ts +8 -8
- package/dist/orgs/invitations.controller.js +27 -26
- package/dist/orgs/invitations.service.d.ts +12 -9
- package/dist/orgs/invitations.service.js +130 -92
- package/dist/orgs/job-ids.d.ts +8 -0
- package/dist/orgs/job-ids.js +8 -0
- package/dist/orgs/members.service.d.ts +19 -12
- package/dist/orgs/members.service.js +161 -117
- package/dist/orgs/offboarding.d.ts +54 -57
- package/dist/orgs/offboarding.js +161 -71
- package/dist/orgs/org-lock.d.ts +28 -19
- package/dist/orgs/org-lock.js +81 -35
- package/dist/orgs/org.guard.d.ts +1 -1
- package/dist/orgs/org.guard.js +2 -2
- package/dist/orgs/orgs.controller.d.ts +13 -13
- package/dist/orgs/orgs.controller.js +29 -17
- package/dist/orgs/orgs.module.d.ts +6 -0
- package/dist/orgs/orgs.module.js +68 -0
- package/dist/orgs/orgs.service.d.ts +30 -19
- package/dist/orgs/orgs.service.js +139 -86
- package/dist/orgs/settings.controller.d.ts +1 -1
- package/dist/orgs/settings.controller.js +8 -6
- package/dist/orgs/settings.service.d.ts +14 -8
- package/dist/orgs/settings.service.js +75 -46
- package/dist/overrides.d.ts +56 -0
- package/dist/overrides.js +30 -0
- package/dist/roles/gateway-role.d.ts +43 -0
- package/dist/roles/gateway-role.js +98 -0
- package/dist/roles/gateway.module.d.ts +8 -0
- package/dist/roles/gateway.module.js +28 -0
- package/dist/roles/worker-role.d.ts +63 -0
- package/dist/roles/worker-role.js +144 -0
- package/dist/roles/worker.module.d.ts +14 -0
- package/dist/roles/worker.module.js +90 -0
- package/dist/runtime/abort.js +19 -2
- package/dist/runtime/checkpointer.d.ts +8 -3
- package/dist/runtime/checkpointer.js +87 -55
- package/dist/runtime/conversation-lock.d.ts +20 -11
- package/dist/runtime/conversation-lock.js +62 -72
- package/dist/runtime/hook-calls.d.ts +3 -3
- package/dist/runtime/hook-calls.js +1 -6
- package/dist/runtime/job-ids.d.ts +10 -0
- package/dist/runtime/job-ids.js +10 -0
- package/dist/runtime/langgraph-loop.js +1 -1
- package/dist/runtime/loop.d.ts +7 -0
- package/dist/runtime/loop.js +14 -0
- package/dist/runtime/maintenance-queue.d.ts +10 -0
- package/dist/runtime/maintenance-queue.js +10 -0
- package/dist/runtime/maintenance.d.ts +45 -74
- package/dist/runtime/maintenance.js +139 -137
- package/dist/runtime/model-call.d.ts +7 -4
- package/dist/runtime/model-call.js +24 -57
- package/dist/runtime/providers.d.ts +17 -6
- package/dist/runtime/providers.js +66 -25
- package/dist/runtime/quota.d.ts +17 -3
- package/dist/runtime/quota.js +27 -2
- package/dist/runtime/retired-schedulers.d.ts +7 -0
- package/dist/runtime/retired-schedulers.js +31 -0
- package/dist/runtime/run-control.d.ts +33 -0
- package/dist/runtime/run-control.js +77 -0
- package/dist/runtime/run-finish.d.ts +26 -17
- package/dist/runtime/run-finish.js +98 -51
- package/dist/runtime/run-jobs.d.ts +48 -0
- package/dist/runtime/run-jobs.js +95 -0
- package/dist/runtime/run-processors.d.ts +60 -0
- package/dist/runtime/run-processors.js +185 -0
- package/dist/runtime/run-queue.d.ts +32 -57
- package/dist/runtime/run-queue.js +291 -295
- package/dist/runtime/run-steps.d.ts +39 -0
- package/dist/runtime/run-steps.js +96 -0
- package/dist/runtime/run-worker.d.ts +121 -75
- package/dist/runtime/run-worker.js +340 -226
- package/dist/runtime/runtime.module.d.ts +10 -0
- package/dist/runtime/runtime.module.js +112 -0
- package/dist/runtime/step-log.d.ts +40 -0
- package/dist/runtime/step-log.js +94 -0
- package/dist/runtime/stream.controller.d.ts +5 -8
- package/dist/runtime/stream.controller.js +14 -12
- package/dist/runtime/stream.d.ts +24 -6
- package/dist/runtime/stream.js +78 -7
- package/dist/runtime/subagents/child.d.ts +3 -44
- package/dist/runtime/subagents/child.js +0 -79
- package/dist/runtime/subagents/definition.d.ts +4 -4
- package/dist/runtime/subagents/definition.js +2 -2
- package/dist/runtime/subagents/dispatch.d.ts +87 -6
- package/dist/runtime/subagents/dispatch.js +135 -140
- package/dist/runtime/subagents/limits.d.ts +9 -4
- package/dist/runtime/subagents/limits.js +4 -2
- package/dist/runtime/subagents/org-agents.d.ts +4 -4
- package/dist/runtime/subagents/org-agents.js +1 -1
- package/dist/runtime/subagents/progress.d.ts +2 -2
- package/dist/runtime/subagents/roster.d.ts +3 -3
- package/dist/runtime/subagents/roster.js +1 -1
- package/dist/runtime/subagents/skill-fork.d.ts +6 -7
- package/dist/runtime/subagents/skill-fork.js +16 -5
- package/dist/runtime/subagents/subagents.service.d.ts +40 -0
- package/dist/runtime/subagents/subagents.service.js +101 -0
- package/dist/runtime/usage-report.d.ts +94 -52
- package/dist/runtime/usage-report.js +200 -100
- package/dist/runtime/waits.d.ts +125 -57
- package/dist/runtime/waits.js +431 -208
- package/dist/sandbox/job-ids.d.ts +10 -0
- package/dist/sandbox/job-ids.js +10 -0
- package/dist/sandbox/jobs.d.ts +41 -0
- package/dist/sandbox/jobs.js +113 -0
- package/dist/sandbox/leases.d.ts +39 -31
- package/dist/sandbox/leases.js +117 -257
- package/dist/sandbox/providers.d.ts +19 -0
- package/dist/sandbox/providers.js +38 -0
- package/dist/sandbox/sandbox.module.d.ts +8 -0
- package/dist/sandbox/sandbox.module.js +30 -0
- package/dist/sandbox/sandbox.service.d.ts +24 -29
- package/dist/sandbox/sandbox.service.js +106 -75
- package/dist/skills/catalog.d.ts +33 -20
- package/dist/skills/catalog.js +96 -53
- package/dist/skills/changes.controller.d.ts +4 -4
- package/dist/skills/changes.controller.js +15 -9
- package/dist/skills/changes.service.d.ts +28 -18
- package/dist/skills/changes.service.js +421 -364
- package/dist/skills/invocable.controller.d.ts +1 -1
- package/dist/skills/invocable.controller.js +8 -5
- package/dist/skills/invoke.d.ts +16 -15
- package/dist/skills/invoke.js +48 -17
- package/dist/skills/skills.controller.d.ts +1 -1
- package/dist/skills/skills.controller.js +11 -6
- package/dist/skills/skills.module.d.ts +6 -0
- package/dist/skills/skills.module.js +30 -0
- package/dist/skills/skills.service.d.ts +47 -30
- package/dist/skills/skills.service.js +221 -158
- package/dist/storage/job-ids.d.ts +6 -0
- package/dist/storage/job-ids.js +6 -0
- package/dist/storage/purge.d.ts +22 -7
- package/dist/storage/purge.js +55 -3
- package/dist/storage/storage.module.d.ts +6 -0
- package/dist/storage/storage.module.js +23 -0
- package/dist/storage/storage.service.d.ts +18 -4
- package/dist/storage/storage.service.js +44 -3
- package/dist/tools/approvals.controller.d.ts +1 -1
- package/dist/tools/approvals.controller.js +12 -8
- package/dist/tools/approvals.service.d.ts +27 -25
- package/dist/tools/approvals.service.js +324 -258
- package/dist/tools/breaker.d.ts +2 -2
- package/dist/tools/breaker.js +21 -3
- package/dist/tools/builtins/ask-user.d.ts +2 -2
- package/dist/tools/builtins/ask-user.js +1 -1
- package/dist/tools/builtins/builtin-tools.d.ts +21 -0
- package/dist/tools/builtins/builtin-tools.js +80 -0
- package/dist/tools/builtins/read-tool-output.d.ts +2 -2
- package/dist/tools/builtins/read-tool-output.js +1 -1
- package/dist/tools/builtins/sandbox/bash.js +2 -2
- package/dist/tools/builtins/sandbox/common.d.ts +2 -1
- package/dist/tools/builtins/sandbox/deliver.js +2 -2
- package/dist/tools/builtins/sandbox/edit.js +1 -1
- package/dist/tools/builtins/sandbox/glob.js +2 -2
- package/dist/tools/builtins/sandbox/grep.js +2 -2
- package/dist/tools/builtins/sandbox/read.js +1 -1
- package/dist/tools/builtins/sandbox/write.js +1 -1
- package/dist/tools/builtins/skill-load.d.ts +3 -3
- package/dist/tools/builtins/skill-load.js +1 -1
- package/dist/tools/canonical-json.d.ts +6 -0
- package/dist/tools/canonical-json.js +16 -0
- package/dist/tools/connector-content.controller.d.ts +1 -1
- package/dist/tools/connector-content.controller.js +11 -6
- package/dist/tools/connector-content.d.ts +12 -15
- package/dist/tools/connector-content.js +53 -18
- package/dist/tools/connectors.controller.d.ts +1 -1
- package/dist/tools/connectors.controller.js +21 -10
- package/dist/tools/connectors.service.d.ts +31 -13
- package/dist/tools/connectors.service.js +434 -344
- package/dist/tools/credentials.d.ts +17 -20
- package/dist/tools/credentials.js +55 -34
- package/dist/tools/drift.d.ts +29 -41
- package/dist/tools/drift.js +111 -79
- package/dist/tools/info.d.ts +12 -9
- package/dist/tools/info.js +33 -7
- package/dist/tools/job-ids.d.ts +13 -0
- package/dist/tools/job-ids.js +15 -0
- package/dist/tools/jobs.d.ts +24 -0
- package/dist/tools/jobs.js +69 -0
- package/dist/tools/oauth/flow-paths.d.ts +16 -0
- package/dist/tools/oauth/flow-paths.js +38 -0
- package/dist/tools/oauth/flow.d.ts +30 -30
- package/dist/tools/oauth/flow.js +109 -81
- package/dist/tools/oauth/oauth.controller.d.ts +3 -3
- package/dist/tools/oauth/oauth.controller.js +12 -9
- package/dist/tools/oauth/tokens.d.ts +11 -3
- package/dist/tools/oauth/tokens.js +15 -14
- package/dist/tools/outputs.d.ts +13 -4
- package/dist/tools/outputs.js +47 -3
- package/dist/tools/pipeline.d.ts +62 -46
- package/dist/tools/pipeline.js +145 -64
- package/dist/tools/policy.d.ts +2 -2
- package/dist/tools/questions.controller.d.ts +1 -1
- package/dist/tools/questions.controller.js +8 -5
- package/dist/tools/questions.service.d.ts +25 -24
- package/dist/tools/questions.service.js +201 -142
- package/dist/tools/registry.d.ts +30 -20
- package/dist/tools/registry.js +73 -37
- package/dist/tools/specs.d.ts +5 -4
- package/dist/tools/specs.js +3 -1
- package/dist/tools/tools.module.d.ts +10 -0
- package/dist/tools/tools.module.js +91 -0
- package/dist/ui/call-extension.d.ts +16 -0
- package/dist/ui/call-extension.js +38 -0
- package/dist/ui/embed-token.d.ts +9 -5
- package/dist/ui/embed-token.js +34 -6
- package/dist/ui/ui-stream.d.ts +22 -17
- package/dist/ui/ui-stream.js +72 -12
- package/dist/ui/ui.module.d.ts +7 -0
- package/dist/ui/ui.module.js +28 -0
- package/dist/ui/views.controller.d.ts +14 -12
- package/dist/ui/views.controller.js +32 -25
- package/dist/ui/views.d.ts +9 -57
- package/dist/ui/views.js +43 -45
- package/package.json +9 -2
- package/dist/http/health.controller.d.ts +0 -26
- package/dist/http/health.controller.js +0 -79
- package/dist/http/tokens.d.ts +0 -131
- package/dist/http/tokens.js +0 -131
- package/dist/http/zod.pipe.d.ts +0 -8
- package/dist/http/zod.pipe.js +0 -14
- package/dist/identity/rate-limit.d.ts +0 -55
- package/dist/identity/rate-limit.js +0 -121
- package/dist/sandbox/lifecycle.d.ts +0 -21
- package/dist/sandbox/lifecycle.js +0 -68
- /package/dist/http/{gateway.module.d.ts → gateway-routes.d.ts} +0 -0
- /package/dist/http/{gateway.module.js → gateway-routes.js} +0 -0
|
@@ -1,17 +1,32 @@
|
|
|
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 { isSafePackagePath, marketplaceEntryVersion, } from "@capybara-hq/plugin-sdk";
|
|
11
|
+
import { Inject, Injectable } from "@nestjs/common";
|
|
2
12
|
import { sql } from "kysely";
|
|
3
13
|
import { ApiError } from "../errors.js";
|
|
4
|
-
import {
|
|
14
|
+
import { ExtensionAdminOps } from "../extensions/admin-ops.js";
|
|
15
|
+
import { ExtensionInstalls } from "../extensions/installs.js";
|
|
5
16
|
import { audit } from "../identity/audit.js";
|
|
6
|
-
import {
|
|
17
|
+
import { EnterpriseAdminLock } from "../identity/enterprise-admin.js";
|
|
18
|
+
import { KernelConfigService } from "../infra/config/kernel-config.service.js";
|
|
19
|
+
import { KernelDb } from "../infra/database/kernel-db.js";
|
|
20
|
+
import { TransactionHost } from "../infra/database/transaction-host.js";
|
|
21
|
+
import { Transactional } from "../infra/database/transactional.decorator.js";
|
|
7
22
|
import { sameRepository } from "../packages/provenance.js";
|
|
8
|
-
import {
|
|
9
|
-
import { expandGitUrl, GitSourceError, gitErrorDetails,
|
|
10
|
-
import { marketplaceNetPolicy, marketplaceUrlProblem } from "./marketplace-fetch.js";
|
|
11
|
-
import { entryCompatible,
|
|
23
|
+
import { countInstalls, itemView, marketplaceLatest } from "./catalog-items.js";
|
|
24
|
+
import { expandGitUrl, GitSourceError, gitErrorDetails, normalGitPath, readGitTreeAndOids, resolveGitCommit, } from "./git-source.js";
|
|
25
|
+
import { fetchMarketplaceArchive, marketplaceNetPolicy, marketplaceUrlProblem, } from "./marketplace-fetch.js";
|
|
26
|
+
import { entryCompatible, entrySourceHost, HOST_VERSIONS, hostAllowed, loadMarketplaceEntry, MarketplacesService, pluginNameFrom, } from "./marketplaces.service.js";
|
|
27
|
+
import { PluginImport } from "./plugin-import.js";
|
|
12
28
|
import { cancelPendingRequests } from "./requests.service.js";
|
|
13
|
-
import {
|
|
14
|
-
import { compareVersions, newestFirst, sameRelease, withBuild } from "./versions.js";
|
|
29
|
+
import { newestFirst } from "./versions.js";
|
|
15
30
|
const UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
16
31
|
const notFound = () => new ApiError("catalog.item_not_found", "Catalog item not found");
|
|
17
32
|
/** An archive URL as recorded (origin + path): a query string or fragment may carry a token. */
|
|
@@ -58,28 +73,53 @@ function gitSource(loc, read, pinned) {
|
|
|
58
73
|
ref: `${u.origin}${u.pathname}@${commit}${path === "." ? "" : `:${path}`}`,
|
|
59
74
|
};
|
|
60
75
|
}
|
|
61
|
-
/**
|
|
62
|
-
* The object storage prefix of one import (relative to `deployment/`):
|
|
63
|
-
* `directory/<itemId>/<version>/<importId>/`. Each import gets a new `importId`, so the losing one of
|
|
64
|
-
* two concurrent imports of the same version never overwrites the committed version's files; reads
|
|
65
|
-
* always go through the `object_prefix` stored on the version row. Build metadata's `+` is written
|
|
66
|
-
* as `_` (a `+` in a key can turn into a space through URL query encoding).
|
|
67
|
-
*/
|
|
68
|
-
export const catalogObjectPrefix = (itemId, version, importId) => `directory/${itemId}/${version.replace(/\+/g, "_")}/${importId}/`;
|
|
69
76
|
/** Default / largest page size of the list. */
|
|
70
77
|
export const CATALOG_LIST_DEFAULT_LIMIT = 200;
|
|
71
78
|
export const CATALOG_LIST_MAX_LIMIT = 1000;
|
|
72
|
-
const PUT_CONCURRENCY = 8;
|
|
73
79
|
/**
|
|
74
80
|
* Enterprise catalog items (D9 / C21 / C22, `/api/v1/admin/catalog/*`, enterprise admins only). One
|
|
75
81
|
* kind: every item is a plugin (spec §4), imported through {@link PluginImport} (prepare -> confirm,
|
|
76
82
|
* one review); this service lists and shows items, changes policy, deletes, installs an item's
|
|
77
83
|
* extension on the deployment, and prepares marketplace imports. Stateless, shared by every replica.
|
|
78
84
|
*/
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
85
|
+
let CatalogService = class CatalogService {
|
|
86
|
+
kdb;
|
|
87
|
+
adminLock;
|
|
88
|
+
config;
|
|
89
|
+
installs;
|
|
90
|
+
ops;
|
|
91
|
+
pluginImport;
|
|
92
|
+
marketplaces;
|
|
93
|
+
txHost;
|
|
94
|
+
constructor(kdb,
|
|
95
|
+
/** The enterprise admin lock (identity/enterprise-admin.ts): joins the caller's transaction. */
|
|
96
|
+
adminLock, config, installs, ops,
|
|
97
|
+
/** Plugin import (a marketplace entry goes through its prepare). */
|
|
98
|
+
pluginImport,
|
|
99
|
+
/** The token of an enterprise marketplace (sent only to its URL's origin). */
|
|
100
|
+
marketplaces, txHost) {
|
|
101
|
+
this.kdb = kdb;
|
|
102
|
+
this.adminLock = adminLock;
|
|
103
|
+
this.config = config;
|
|
104
|
+
this.installs = installs;
|
|
105
|
+
this.ops = ops;
|
|
106
|
+
this.pluginImport = pluginImport;
|
|
107
|
+
this.marketplaces = marketplaces;
|
|
108
|
+
this.txHost = txHost;
|
|
109
|
+
}
|
|
110
|
+
/** The kernel-schema handle of the current context (the transaction, else the pool). */
|
|
111
|
+
get db() {
|
|
112
|
+
return this.kdb.db;
|
|
113
|
+
}
|
|
114
|
+
/** Downloads a marketplace archive source, verified against its integrity. */
|
|
115
|
+
fetchArchive(archive, signal) {
|
|
116
|
+
const config = this.config.get();
|
|
117
|
+
return fetchMarketplaceArchive(archive, {
|
|
118
|
+
maxBytes: config.packages.maxBytes,
|
|
119
|
+
timeoutMs: 120_000,
|
|
120
|
+
net: marketplaceNetPolicy(config),
|
|
121
|
+
...(signal !== undefined && { signal }),
|
|
122
|
+
});
|
|
83
123
|
}
|
|
84
124
|
/**
|
|
85
125
|
* Prepares the import of one marketplace entry (C25 / C26, spec §5.2): `version` defaults to the
|
|
@@ -100,8 +140,8 @@ export class CatalogService {
|
|
|
100
140
|
* `marketplace.not_found`; disabled, or the entry / version missing -> `marketplace.entry_not_found`.
|
|
101
141
|
*/
|
|
102
142
|
async importFromMarketplace(actor, input, opts = {}) {
|
|
103
|
-
const config = this.
|
|
104
|
-
const { entry, marketplace, claude } = await loadMarketplaceEntry(this.
|
|
143
|
+
const config = this.config.get();
|
|
144
|
+
const { entry, marketplace, claude } = await loadMarketplaceEntry(this.db, config, input.marketplaceId, input.name, input.version);
|
|
105
145
|
const version = marketplaceEntryVersion(entry);
|
|
106
146
|
if (!entryCompatible(entry)) {
|
|
107
147
|
throw new ApiError("marketplace.incompatible", `${entry.name}${version !== null ? `@${version}` : ""} needs kernel >= ${entry.minKernel}; this deployment runs kernel ${HOST_VERSIONS.kernel}`);
|
|
@@ -129,20 +169,20 @@ export class CatalogService {
|
|
|
129
169
|
let detail;
|
|
130
170
|
let provenance;
|
|
131
171
|
if ("npm" in src) {
|
|
132
|
-
got = await this.
|
|
172
|
+
got = await this.installs.fetchMarketplacePackage({ package: src.npm.package, version: src.npm.version, integrity: src.npm.integrity }, opts.signal);
|
|
133
173
|
ref = `${input.marketplaceId}:${src.npm.package}@${src.npm.version}`;
|
|
134
174
|
detail = { registry: new URL(config.packages.npmRegistry).origin };
|
|
135
|
-
const p = await this.
|
|
175
|
+
const p = await this.installs.fetchProvenance({ package: src.npm.package, version: src.npm.version, integrity: got.integrity }, opts.signal);
|
|
136
176
|
// a git marketplace declares its repository: an attestation from another one is a warning
|
|
137
177
|
const mismatch = p.checked && marketplace.form === "git" && !sameRepository(p.repository, marketplace.url);
|
|
138
178
|
provenance = { provenance: p, ...(mismatch && { warning: "repository_mismatch" }) };
|
|
139
179
|
}
|
|
140
180
|
else {
|
|
141
|
-
got = await this.
|
|
181
|
+
got = await this.fetchArchive(src.archive, opts.signal);
|
|
142
182
|
ref = `${input.marketplaceId}:${archiveRef(src.archive.url)}`;
|
|
143
183
|
detail = { url: archiveRef(src.archive.url) };
|
|
144
184
|
}
|
|
145
|
-
staged = await this.
|
|
185
|
+
staged = await this.pluginImport.prepare(actor, got.bytes, {
|
|
146
186
|
kind: "marketplace",
|
|
147
187
|
ref,
|
|
148
188
|
integrity: got.integrity,
|
|
@@ -184,7 +224,7 @@ export class CatalogService {
|
|
|
184
224
|
}
|
|
185
225
|
const token = marketplace.builtin
|
|
186
226
|
? undefined
|
|
187
|
-
: await this.
|
|
227
|
+
: await this.marketplaces.token(input.marketplaceId);
|
|
188
228
|
const read = await this.readGit(loc, {
|
|
189
229
|
...(token !== undefined && { token, tokenOrigin: new URL(marketplace.url).origin }),
|
|
190
230
|
...(opts.signal !== undefined && { signal: opts.signal }),
|
|
@@ -192,7 +232,7 @@ export class CatalogService {
|
|
|
192
232
|
// path entries follow the marketplace's ref; git entries follow theirs unless a commit is pinned
|
|
193
233
|
const pinned = "git" in src && src.git.commit !== undefined;
|
|
194
234
|
const where = gitSource("path" in src && marketplace.ref !== null ? { ...loc, ref: marketplace.ref } : loc, read, pinned);
|
|
195
|
-
staged = await this.
|
|
235
|
+
staged = await this.pluginImport.prepareGit(actor, read.files, {
|
|
196
236
|
kind: "git",
|
|
197
237
|
ref: `${input.marketplaceId}:${where.ref}`,
|
|
198
238
|
marketplaceId: input.marketplaceId,
|
|
@@ -224,7 +264,7 @@ export class CatalogService {
|
|
|
224
264
|
*/
|
|
225
265
|
async importFromGit(actor, input, opts = {}) {
|
|
226
266
|
const url = expandGitUrl(input.url);
|
|
227
|
-
const problem = marketplaceUrlProblem(url, this.
|
|
267
|
+
const problem = marketplaceUrlProblem(url, this.config.get().marketplaces.allowInsecureLoopback);
|
|
228
268
|
if (problem !== null)
|
|
229
269
|
throw new ApiError("validation_failed", `url: ${problem}`);
|
|
230
270
|
if (input.path !== undefined) {
|
|
@@ -247,7 +287,7 @@ export class CatalogService {
|
|
|
247
287
|
.filter((s) => s !== "")
|
|
248
288
|
.pop() ?? "plugin")
|
|
249
289
|
: where.detail.path.split("/").pop();
|
|
250
|
-
const r = await this.
|
|
290
|
+
const r = await this.pluginImport.prepareGit(actor, read.files, { kind: "git", ref: where.ref, detail: where.detail }, {
|
|
251
291
|
...(opts.actorTokenId !== undefined && { actorTokenId: opts.actorTokenId }),
|
|
252
292
|
fallback: {
|
|
253
293
|
name: pluginNameFrom(segment),
|
|
@@ -259,7 +299,7 @@ export class CatalogService {
|
|
|
259
299
|
}
|
|
260
300
|
/** Resolves the commit and reads the plugin's files; git failures become API errors. */
|
|
261
301
|
async readGit(loc, o) {
|
|
262
|
-
const config = this.
|
|
302
|
+
const config = this.config.get();
|
|
263
303
|
const options = {
|
|
264
304
|
net: marketplaceNetPolicy(config),
|
|
265
305
|
maxBytes: config.packages.maxBytes,
|
|
@@ -289,7 +329,7 @@ export class CatalogService {
|
|
|
289
329
|
async page(q = {}) {
|
|
290
330
|
const limit = Math.min(Math.max(1, q.limit ?? CATALOG_LIST_DEFAULT_LIMIT), CATALOG_LIST_MAX_LIMIT);
|
|
291
331
|
const offset = Math.max(0, q.offset ?? 0);
|
|
292
|
-
let query = this.
|
|
332
|
+
let query = this.db
|
|
293
333
|
.selectFrom("catalog_items")
|
|
294
334
|
.selectAll()
|
|
295
335
|
.orderBy("name")
|
|
@@ -303,7 +343,7 @@ export class CatalogService {
|
|
|
303
343
|
const items = rows.slice(0, limit);
|
|
304
344
|
if (items.length === 0)
|
|
305
345
|
return { items: [], nextOffset: null };
|
|
306
|
-
const versions = await this.
|
|
346
|
+
const versions = await this.db
|
|
307
347
|
.selectFrom("catalog_item_versions")
|
|
308
348
|
.select([
|
|
309
349
|
"item_id",
|
|
@@ -323,8 +363,8 @@ export class CatalogService {
|
|
|
323
363
|
list.push(v);
|
|
324
364
|
byItem.set(v.item_id, list);
|
|
325
365
|
}
|
|
326
|
-
const installs = await countInstalls(this.
|
|
327
|
-
const latest = await marketplaceLatest(this.
|
|
366
|
+
const installs = await countInstalls(this.db, items, byItem);
|
|
367
|
+
const latest = await marketplaceLatest(this.db, this.config.get(), items, byItem);
|
|
328
368
|
return {
|
|
329
369
|
items: items.map((i) => itemView(i, byItem.get(i.id) ?? [], installs.get(i.id) ?? 0, latest.get(i.id))),
|
|
330
370
|
nextOffset,
|
|
@@ -334,22 +374,22 @@ export class CatalogService {
|
|
|
334
374
|
async get(itemId) {
|
|
335
375
|
if (!UUID_RE.test(itemId))
|
|
336
376
|
throw notFound();
|
|
337
|
-
const item = await this.
|
|
377
|
+
const item = await this.db
|
|
338
378
|
.selectFrom("catalog_items")
|
|
339
379
|
.selectAll()
|
|
340
380
|
.where("id", "=", itemId)
|
|
341
381
|
.executeTakeFirst();
|
|
342
382
|
if (!item)
|
|
343
383
|
throw notFound();
|
|
344
|
-
const rows = await this.
|
|
384
|
+
const rows = await this.db
|
|
345
385
|
.selectFrom("catalog_item_versions")
|
|
346
386
|
.selectAll()
|
|
347
387
|
.where("item_id", "=", itemId)
|
|
348
388
|
.execute();
|
|
349
389
|
rows.sort((a, b) => newestFirst({ version: a.version, importedAt: a.imported_at }, { version: b.version, importedAt: b.imported_at }));
|
|
350
390
|
const byItem = new Map([[item.id, rows]]);
|
|
351
|
-
const installs = await countInstalls(this.
|
|
352
|
-
const latest = await marketplaceLatest(this.
|
|
391
|
+
const installs = await countInstalls(this.db, [item], byItem);
|
|
392
|
+
const latest = await marketplaceLatest(this.db, this.config.get(), [item], byItem);
|
|
353
393
|
return {
|
|
354
394
|
item: {
|
|
355
395
|
...itemView(item, rows, installs.get(item.id) ?? 0, latest.get(item.id)),
|
|
@@ -383,34 +423,36 @@ export class CatalogService {
|
|
|
383
423
|
async setPolicy(actor, itemId, policy, opts = {}) {
|
|
384
424
|
if (!UUID_RE.test(itemId))
|
|
385
425
|
throw notFound();
|
|
386
|
-
await this.
|
|
387
|
-
await lockEnterpriseAdminsAndAuthorize(trx, actor);
|
|
388
|
-
const row = await trx
|
|
389
|
-
.selectFrom("catalog_items")
|
|
390
|
-
.select(["name", "policy"])
|
|
391
|
-
.where("id", "=", itemId)
|
|
392
|
-
.where("deleted_at", "is", null)
|
|
393
|
-
.forUpdate()
|
|
394
|
-
.executeTakeFirst();
|
|
395
|
-
if (!row)
|
|
396
|
-
throw notFound();
|
|
397
|
-
if (row.policy === policy)
|
|
398
|
-
return;
|
|
399
|
-
await trx
|
|
400
|
-
.updateTable("catalog_items")
|
|
401
|
-
.set({ policy, updated_at: sql `now()` })
|
|
402
|
-
.where("id", "=", itemId)
|
|
403
|
-
.execute();
|
|
404
|
-
await audit(trx, {
|
|
405
|
-
actorAccountId: actor,
|
|
406
|
-
...(opts.actorTokenId !== undefined && { actorTokenId: opts.actorTokenId }),
|
|
407
|
-
action: "catalog.policy_changed",
|
|
408
|
-
target: itemId,
|
|
409
|
-
detail: { name: row.name, from: row.policy, to: policy },
|
|
410
|
-
});
|
|
411
|
-
});
|
|
426
|
+
await this.writePolicy(actor, itemId, policy, opts);
|
|
412
427
|
return this.view(itemId);
|
|
413
428
|
}
|
|
429
|
+
async writePolicy(actor, itemId, policy, opts) {
|
|
430
|
+
const t = this.db;
|
|
431
|
+
await this.adminLock.lockAndAuthorize(actor);
|
|
432
|
+
const row = await t
|
|
433
|
+
.selectFrom("catalog_items")
|
|
434
|
+
.select(["name", "policy"])
|
|
435
|
+
.where("id", "=", itemId)
|
|
436
|
+
.where("deleted_at", "is", null)
|
|
437
|
+
.forUpdate()
|
|
438
|
+
.executeTakeFirst();
|
|
439
|
+
if (!row)
|
|
440
|
+
throw notFound();
|
|
441
|
+
if (row.policy === policy)
|
|
442
|
+
return;
|
|
443
|
+
await t
|
|
444
|
+
.updateTable("catalog_items")
|
|
445
|
+
.set({ policy, updated_at: sql `now()` })
|
|
446
|
+
.where("id", "=", itemId)
|
|
447
|
+
.execute();
|
|
448
|
+
await audit(t, {
|
|
449
|
+
actorAccountId: actor,
|
|
450
|
+
...(opts.actorTokenId !== undefined && { actorTokenId: opts.actorTokenId }),
|
|
451
|
+
action: "catalog.policy_changed",
|
|
452
|
+
target: itemId,
|
|
453
|
+
detail: { name: row.name, from: row.policy, to: policy },
|
|
454
|
+
});
|
|
455
|
+
}
|
|
414
456
|
/**
|
|
415
457
|
* Deletes the item (soft delete, audit `catalog.removed`; requests still pending are cancelled in
|
|
416
458
|
* the same transaction): versions and stored files are kept (installed components still refer to
|
|
@@ -420,29 +462,31 @@ export class CatalogService {
|
|
|
420
462
|
async remove(actor, itemId, opts = {}) {
|
|
421
463
|
if (!UUID_RE.test(itemId))
|
|
422
464
|
throw notFound();
|
|
423
|
-
await this.
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
465
|
+
await this.writeRemove(actor, itemId, opts);
|
|
466
|
+
}
|
|
467
|
+
async writeRemove(actor, itemId, opts) {
|
|
468
|
+
const t = this.db;
|
|
469
|
+
await this.adminLock.lockAndAuthorize(actor);
|
|
470
|
+
const row = await t
|
|
471
|
+
.updateTable("catalog_items")
|
|
472
|
+
.set({
|
|
473
|
+
deleted_at: sql `now()`,
|
|
474
|
+
updated_at: sql `now()`,
|
|
475
|
+
})
|
|
476
|
+
.where("id", "=", itemId)
|
|
477
|
+
.where("deleted_at", "is", null)
|
|
478
|
+
.returning(["name"])
|
|
479
|
+
.executeTakeFirst();
|
|
480
|
+
if (!row)
|
|
481
|
+
throw notFound();
|
|
482
|
+
// Pending requests for a deleted item are pointless: cancel them in the same transaction
|
|
483
|
+
await cancelPendingRequests(t, { itemId }, actor, "item_removed", opts);
|
|
484
|
+
await audit(t, {
|
|
485
|
+
actorAccountId: actor,
|
|
486
|
+
...(opts.actorTokenId !== undefined && { actorTokenId: opts.actorTokenId }),
|
|
487
|
+
action: "catalog.removed",
|
|
488
|
+
target: itemId,
|
|
489
|
+
detail: { name: row.name },
|
|
446
490
|
});
|
|
447
491
|
}
|
|
448
492
|
/**
|
|
@@ -456,7 +500,7 @@ export class CatalogService {
|
|
|
456
500
|
async installToDeployment(actor, itemId, version, opts = {}) {
|
|
457
501
|
if (!UUID_RE.test(itemId))
|
|
458
502
|
throw notFound();
|
|
459
|
-
const item = await this.
|
|
503
|
+
const item = await this.db
|
|
460
504
|
.selectFrom("catalog_items")
|
|
461
505
|
.select(["id", "name"])
|
|
462
506
|
.where("id", "=", itemId)
|
|
@@ -464,7 +508,7 @@ export class CatalogService {
|
|
|
464
508
|
.executeTakeFirst();
|
|
465
509
|
if (!item)
|
|
466
510
|
throw notFound();
|
|
467
|
-
const v = await this.
|
|
511
|
+
const v = await this.db
|
|
468
512
|
.selectFrom("catalog_item_versions")
|
|
469
513
|
.select("extension_sha256")
|
|
470
514
|
.where("item_id", "=", itemId)
|
|
@@ -476,407 +520,29 @@ export class CatalogService {
|
|
|
476
520
|
if (v.extension_sha256 === null) {
|
|
477
521
|
throw new ApiError("catalog.no_extension", `Plugin ${item.name} ${version} has no extension; there is nothing to install on the deployment`);
|
|
478
522
|
}
|
|
479
|
-
return this.
|
|
523
|
+
return this.ops.install(item.name, v.extension_sha256, actor, opts.actorTokenId, {
|
|
480
524
|
catalogItemId: itemId,
|
|
481
525
|
});
|
|
482
526
|
}
|
|
483
527
|
async view(itemId) {
|
|
484
528
|
return (await this.get(itemId)).item;
|
|
485
529
|
}
|
|
486
|
-
}
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
}
|
|
506
|
-
for (const p of t.editableEndpoint ?? []) {
|
|
507
|
-
if (!schemaHasPath(c.endpointSchema, p.split("."))) {
|
|
508
|
-
problems.push(`${at}.editableEndpoint "${p}" is not a field of the ${t.connector} connector's endpoint`);
|
|
509
|
-
}
|
|
510
|
-
}
|
|
511
|
-
return problems;
|
|
512
|
-
}
|
|
513
|
-
/** Writes the files to `deployment/<prefix><path>` ({@link PUT_CONCURRENCY} at a time). */
|
|
514
|
-
export async function putCatalogFiles(storage, prefix, files) {
|
|
515
|
-
const store = storage.deployment();
|
|
516
|
-
const queue = [...files];
|
|
517
|
-
await Promise.all(Array.from({ length: Math.min(PUT_CONCURRENCY, queue.length) }, async () => {
|
|
518
|
-
for (let f = queue.shift(); f; f = queue.shift()) {
|
|
519
|
-
await store.put(`${prefix}${f.path}`, f.data, {
|
|
520
|
-
contentType: "application/octet-stream",
|
|
521
|
-
size: f.size,
|
|
522
|
-
});
|
|
523
|
-
}
|
|
524
|
-
}));
|
|
525
|
-
}
|
|
526
|
-
/** Compares the marketplace's permission summary with the computed keys ({@link PermissionsMismatch}). */
|
|
527
|
-
export function permissionsMismatch(declared, actual) {
|
|
528
|
-
if (declared === undefined || actual === undefined)
|
|
529
|
-
return null;
|
|
530
|
-
const want = new Set(declared);
|
|
531
|
-
const have = new Set(actual);
|
|
532
|
-
const missing = [...have].filter((k) => !want.has(k)).sort();
|
|
533
|
-
const extra = [...want].filter((k) => !have.has(k)).sort();
|
|
534
|
-
return missing.length > 0 || extra.length > 0 ? { missing, extra } : null;
|
|
535
|
-
}
|
|
536
|
-
/** Takes the transaction-level advisory lock of an item name (concurrent imports of it serialize). */
|
|
537
|
-
export async function lockCatalogName(trx, name) {
|
|
538
|
-
await sql `SELECT pg_advisory_xact_lock(hashtext(${`capybara.directory-item:${name}`}))`.execute(trx);
|
|
539
|
-
}
|
|
540
|
-
/**
|
|
541
|
-
* The live item of a name, with the source identity of its latest version
|
|
542
|
-
* ({@link sourceIdentity}; null when there is none).
|
|
543
|
-
*/
|
|
544
|
-
async function liveItem(db, name) {
|
|
545
|
-
const item = await db
|
|
546
|
-
.selectFrom("catalog_items")
|
|
547
|
-
.select(["id", "package_name", "latest_version", "marketplace_id"])
|
|
548
|
-
.where("name", "=", name)
|
|
549
|
-
.where("deleted_at", "is", null)
|
|
550
|
-
.executeTakeFirst();
|
|
551
|
-
if (!item)
|
|
552
|
-
return undefined;
|
|
553
|
-
const latest = await db
|
|
554
|
-
.selectFrom("catalog_item_versions")
|
|
555
|
-
.select("source_detail")
|
|
556
|
-
.where("item_id", "=", item.id)
|
|
557
|
-
.where("version", "=", item.latest_version)
|
|
558
|
-
.executeTakeFirst();
|
|
559
|
-
return {
|
|
560
|
-
...item,
|
|
561
|
-
source: sourceIdentity(latest?.source_detail ?? undefined, item.marketplace_id ?? undefined),
|
|
562
|
-
};
|
|
563
|
-
}
|
|
564
|
-
/**
|
|
565
|
-
* The identity of a git source, `<host>/<repo>:<path>` (host lower case, no `.git`), or null when
|
|
566
|
-
* the source is not git. An item without package.json is identified by it instead of a package name.
|
|
567
|
-
*/
|
|
568
|
-
export function gitIdentity(detail) {
|
|
569
|
-
if (detail === undefined || !("commit" in detail))
|
|
570
|
-
return null;
|
|
571
|
-
return gitLocationIdentity(detail);
|
|
572
|
-
}
|
|
573
|
-
/**
|
|
574
|
-
* What identifies the source of a plugin without package.json: `git <host>/<repo>:<path>`, or, for
|
|
575
|
-
* a marketplace archive (a skills-only tgz without plugin.json), `marketplace <id>` (the
|
|
576
|
-
* marketplace vouches for its entries; archive URLs change from version to version). null for
|
|
577
|
-
* anything else.
|
|
578
|
-
*/
|
|
579
|
-
function sourceIdentity(detail, marketplaceId) {
|
|
580
|
-
const git = gitIdentity(detail);
|
|
581
|
-
if (git !== null)
|
|
582
|
-
return `git ${git}`;
|
|
583
|
-
if (detail !== undefined && "url" in detail && marketplaceId !== undefined) {
|
|
584
|
-
return `marketplace ${marketplaceId}`;
|
|
585
|
-
}
|
|
586
|
-
return null;
|
|
587
|
-
}
|
|
588
|
-
/** The versions of an item, with what tells their content apart. */
|
|
589
|
-
async function itemVersions(db, itemId) {
|
|
590
|
-
return db
|
|
591
|
-
.selectFrom("catalog_item_versions")
|
|
592
|
-
.select(["version", "content_digest", "integrity"])
|
|
593
|
-
.where("item_id", "=", itemId)
|
|
594
|
-
.execute();
|
|
595
|
-
}
|
|
596
|
-
/** `atConfirm`: found under the lock at confirm (another import committed after the review). */
|
|
597
|
-
const versionExists = (version, sameContent, atConfirm = false) => new ApiError("catalog.version_exists", (sameContent
|
|
598
|
-
? `Version ${version} of this catalog item is already imported with the same content`
|
|
599
|
-
: `Version ${version} of this catalog item has already been imported`) +
|
|
600
|
-
(atConfirm
|
|
601
|
-
? " (by another import since this one was prepared); prepare the import again"
|
|
602
|
-
: ""));
|
|
603
|
-
/**
|
|
604
|
-
* No version of the release of `p.version` (equal but for build metadata) holds the same content
|
|
605
|
-
* (digest; for a version without one, the same integrity), else `catalog.version_exists`.
|
|
606
|
-
*/
|
|
607
|
-
function assertNewContent(existing, p, atConfirm = false) {
|
|
608
|
-
const same = existing.find((v) => sameRelease(v.version, p.version) &&
|
|
609
|
-
(v.content_digest !== null
|
|
610
|
-
? v.content_digest === p.contentDigest
|
|
611
|
-
: v.integrity !== null && v.integrity === p.integrity));
|
|
612
|
-
if (same)
|
|
613
|
-
throw versionExists(same.version, true, atConfirm);
|
|
614
|
-
}
|
|
615
|
-
/**
|
|
616
|
-
* The version a new import records (Decision 6, spec §5.3): the plugin's own version, unless that
|
|
617
|
-
* release is already imported. A version of the same release (equal but for build metadata) with
|
|
618
|
-
* the same content (digest; for versions without one, the same integrity) -> `catalog.version_exists`
|
|
619
|
-
* "already imported"; other content -> `<version>+git.<sha12>` (git) or `+sha256.<12>` (any other
|
|
620
|
-
* source, the digest's first 12 hex), never overwriting the imported version. A git commit already
|
|
621
|
-
* recorded with other content (a Claude Code plugin whose marketplace entry changed while its own
|
|
622
|
-
* commit did not, see `claudeContentDigest`) falls back to `+sha256.<12>`.
|
|
623
|
-
*/
|
|
624
|
-
export function recordedVersion(existing, p) {
|
|
625
|
-
assertNewContent(existing, p);
|
|
626
|
-
if (!existing.some((v) => v.version === p.version))
|
|
627
|
-
return p.version;
|
|
628
|
-
const d = p.detail;
|
|
629
|
-
const byDigest = withBuild(p.version, `sha256.${p.contentDigest.slice(0, 12)}`);
|
|
630
|
-
let next = d !== undefined && "commit" in d
|
|
631
|
-
? withBuild(p.version, `git.${d.commit.slice(0, 12)}`)
|
|
632
|
-
: byDigest;
|
|
633
|
-
if (existing.some((v) => v.version === next))
|
|
634
|
-
next = byDigest;
|
|
635
|
-
if (existing.some((v) => v.version === next))
|
|
636
|
-
throw versionExists(next, false);
|
|
637
|
-
return next;
|
|
638
|
-
}
|
|
639
|
-
/**
|
|
640
|
-
* Conflict precheck before writing (no lock; {@link writeCatalogVersion}'s re-check inside the
|
|
641
|
-
* transaction is final): an item with the same name from another npm package (or, without one,
|
|
642
|
-
* another git source) -> `catalog.name_conflict`; the release already imported with the same
|
|
643
|
-
* content -> `catalog.version_exists`. Returns the existing item (undefined when there is none) and
|
|
644
|
-
* the version to record ({@link recordedVersion}).
|
|
645
|
-
*/
|
|
646
|
-
export async function precheckCatalogImport(db, name, p) {
|
|
647
|
-
const existing = await liveItem(db, name);
|
|
648
|
-
if (!existing)
|
|
649
|
-
return { existing, version: p.version };
|
|
650
|
-
assertSameSource(existing, p.packageName, sourceIdentity(p.detail, p.marketplaceId));
|
|
651
|
-
return { existing, version: recordedVersion(await itemVersions(db, existing.id), p) };
|
|
652
|
-
}
|
|
653
|
-
/**
|
|
654
|
-
* Writes a catalog version in the caller's transaction (the caller has re-checked the enterprise
|
|
655
|
-
* admin): takes the name's advisory lock, checks conflicts again (the same source; no version of
|
|
656
|
-
* the release with the same content; `version` not taken meanwhile), creates the item when there is
|
|
657
|
-
* none or adds the version (latest and display fields change only for a newer version, a version
|
|
658
|
-
* equal but for build metadata being newer as the later import), and writes the version row (with
|
|
659
|
-
* its content digest) and the `catalog.imported` audit. Returns the item id.
|
|
660
|
-
*/
|
|
661
|
-
export async function writeCatalogVersion(trx, w) {
|
|
662
|
-
const { name, version, listing } = w;
|
|
663
|
-
await lockCatalogName(trx, name);
|
|
664
|
-
const live = await liveItem(trx, name);
|
|
665
|
-
let id;
|
|
666
|
-
if (live) {
|
|
667
|
-
id = live.id;
|
|
668
|
-
assertSameSource(live, w.packageName, sourceIdentity(w.source.detail, w.marketplaceId));
|
|
669
|
-
const existing = await itemVersions(trx, id);
|
|
670
|
-
// the same content under any version of the release, then the recorded version itself
|
|
671
|
-
assertNewContent(existing, {
|
|
672
|
-
version,
|
|
673
|
-
contentDigest: w.contentDigest,
|
|
674
|
-
...(w.source.integrity !== undefined && { integrity: w.source.integrity }),
|
|
675
|
-
}, true);
|
|
676
|
-
if (existing.some((v) => v.version === version))
|
|
677
|
-
throw versionExists(version, false, true);
|
|
678
|
-
const newer = compareVersions(version, live.latest_version) >= 0;
|
|
679
|
-
await trx
|
|
680
|
-
.updateTable("catalog_items")
|
|
681
|
-
.set({
|
|
682
|
-
updated_at: sql `now()`,
|
|
683
|
-
...(w.marketplaceId !== undefined && { marketplace_id: w.marketplaceId }),
|
|
684
|
-
...(newer && {
|
|
685
|
-
latest_version: version,
|
|
686
|
-
publisher: listing.publisher,
|
|
687
|
-
description: listing.description,
|
|
688
|
-
display_name: listing.displayName ? JSON.stringify(listing.displayName) : null,
|
|
689
|
-
}),
|
|
690
|
-
})
|
|
691
|
-
.where("id", "=", id)
|
|
692
|
-
.execute();
|
|
693
|
-
}
|
|
694
|
-
else {
|
|
695
|
-
id = w.newItemId;
|
|
696
|
-
await trx
|
|
697
|
-
.insertInto("catalog_items")
|
|
698
|
-
.values({
|
|
699
|
-
id,
|
|
700
|
-
name,
|
|
701
|
-
package_name: w.packageName,
|
|
702
|
-
publisher: listing.publisher,
|
|
703
|
-
description: listing.description,
|
|
704
|
-
display_name: listing.displayName ? JSON.stringify(listing.displayName) : null,
|
|
705
|
-
latest_version: version,
|
|
706
|
-
created_by: w.actor,
|
|
707
|
-
marketplace_id: w.marketplaceId ?? null,
|
|
708
|
-
})
|
|
709
|
-
.execute();
|
|
710
|
-
}
|
|
711
|
-
await trx
|
|
712
|
-
.insertInto("catalog_item_versions")
|
|
713
|
-
.values({
|
|
714
|
-
item_id: id,
|
|
715
|
-
version,
|
|
716
|
-
manifest: JSON.stringify(w.manifest),
|
|
717
|
-
source: w.source.source,
|
|
718
|
-
source_ref: w.source.ref,
|
|
719
|
-
integrity: w.source.integrity ?? null,
|
|
720
|
-
source_detail: w.source.detail !== undefined ? JSON.stringify(w.source.detail) : null,
|
|
721
|
-
content_digest: w.contentDigest,
|
|
722
|
-
object_prefix: w.objectPrefix,
|
|
723
|
-
extension_sha256: w.extensionSha256,
|
|
724
|
-
files: JSON.stringify(w.files.map(({ path, size, sha256 }) => ({ path, size, sha256 }))),
|
|
725
|
-
size: w.size,
|
|
726
|
-
imported_by: w.actor,
|
|
727
|
-
source_format: w.sourceFormat ?? "capybara",
|
|
728
|
-
translation: w.translation != null ? JSON.stringify(w.translation) : null,
|
|
729
|
-
license_text: w.licenseText ?? null,
|
|
730
|
-
license_truncated: w.licenseTruncated === true,
|
|
731
|
-
})
|
|
732
|
-
.execute();
|
|
733
|
-
await audit(trx, {
|
|
734
|
-
...(w.actor !== null && { actorAccountId: w.actor }),
|
|
735
|
-
...(w.actorTokenId !== undefined && { actorTokenId: w.actorTokenId }),
|
|
736
|
-
action: "catalog.imported",
|
|
737
|
-
target: id,
|
|
738
|
-
detail: {
|
|
739
|
-
name,
|
|
740
|
-
version,
|
|
741
|
-
source: w.source.source,
|
|
742
|
-
sourceRef: w.source.ref,
|
|
743
|
-
contentDigest: w.contentDigest,
|
|
744
|
-
...(w.extensionSha256 !== null && { sha256: w.extensionSha256 }),
|
|
745
|
-
...(w.source.integrity !== undefined && { integrity: w.source.integrity }),
|
|
746
|
-
...(w.marketplaceId !== undefined && { marketplaceId: w.marketplaceId }),
|
|
747
|
-
...w.auditDetail,
|
|
748
|
-
},
|
|
749
|
-
});
|
|
750
|
-
return id;
|
|
751
|
-
}
|
|
752
|
-
/**
|
|
753
|
-
* An extension name belongs to the npm package that first installed it (`extension_name_owners`,
|
|
754
|
-
* Ruling P3): when another package owns it, the import is refused right away with
|
|
755
|
-
* `extension.name_conflict` (the same code as at install), instead of failing only at deploy time.
|
|
756
|
-
*/
|
|
757
|
-
export async function assertPluginNameOwner(db, name, packageName) {
|
|
758
|
-
const owner = await db
|
|
759
|
-
.selectFrom("extension_name_owners")
|
|
760
|
-
.select("package_name")
|
|
761
|
-
.where("name", "=", name)
|
|
762
|
-
.executeTakeFirst();
|
|
763
|
-
if (owner && owner.package_name !== packageName) {
|
|
764
|
-
throw new ApiError("extension.name_conflict", `Extension name ${name} belongs to package ${owner.package_name}; ${packageLabel(packageName)} cannot use it`);
|
|
765
|
-
}
|
|
766
|
-
}
|
|
767
|
-
/** "package <name>", or what a plugin without package.json is called in messages. */
|
|
768
|
-
const packageLabel = (p) => p === null ? "a plugin without package.json" : `package ${p}`;
|
|
769
|
-
/**
|
|
770
|
-
* Whether a plugin may add a version to an existing item: the same npm package, or, for an item
|
|
771
|
-
* without package.json, the same source ({@link sourceIdentity}: git host, repo and path, so
|
|
772
|
-
* unrelated repos that resolve to the same name never merge; or the same marketplace for an
|
|
773
|
-
* archive); never a mix of the two.
|
|
774
|
-
*/
|
|
775
|
-
function assertSameSource(item, packageName, source) {
|
|
776
|
-
const from = (p, src) => p !== null ? `package ${p}` : (src ?? "a plugin without package.json");
|
|
777
|
-
const same = item.package_name !== null
|
|
778
|
-
? item.package_name === packageName
|
|
779
|
-
: packageName === null && item.source !== null && item.source === source;
|
|
780
|
-
if (!same) {
|
|
781
|
-
throw new ApiError("catalog.name_conflict", `A catalog item with this name comes from ${from(item.package_name, item.source)}; ${from(packageName, source)} cannot add versions to it`);
|
|
782
|
-
}
|
|
783
|
-
}
|
|
784
|
-
/**
|
|
785
|
-
* For each marketplace-imported item, its marketplace (when enabled): the highest compatible
|
|
786
|
-
* version listed, and whether a compatible entry's content changed at an imported version.
|
|
787
|
-
*/
|
|
788
|
-
async function marketplaceLatest(db, config, items, versions) {
|
|
789
|
-
const out = new Map();
|
|
790
|
-
const sourced = items.filter((i) => typeof i.marketplace_id === "string");
|
|
791
|
-
if (sourced.length === 0)
|
|
792
|
-
return out;
|
|
793
|
-
const rows = await db
|
|
794
|
-
.selectFrom("marketplace_entries as e")
|
|
795
|
-
.innerJoin("marketplaces as s", "s.id", "e.source_id")
|
|
796
|
-
.select([
|
|
797
|
-
"e.source_id",
|
|
798
|
-
"e.name",
|
|
799
|
-
"e.version",
|
|
800
|
-
"e.entry",
|
|
801
|
-
"e.head_commit",
|
|
802
|
-
"e.tree_oid",
|
|
803
|
-
"s.builtin",
|
|
804
|
-
"s.enabled",
|
|
805
|
-
"s.url",
|
|
806
|
-
"s.last_commit",
|
|
807
|
-
])
|
|
808
|
-
.where("e.source_id", "in", [...new Set(sourced.map((i) => i.marketplace_id))])
|
|
809
|
-
.where("e.name", "in", [...new Set(sourced.map((i) => i.name))])
|
|
810
|
-
.execute();
|
|
811
|
-
for (const i of sourced) {
|
|
812
|
-
const listed = rows.filter((r) => r.source_id === i.marketplace_id &&
|
|
813
|
-
r.name === i.name &&
|
|
814
|
-
sourceEffective(r, config) &&
|
|
815
|
-
entryCompatible(r.entry));
|
|
816
|
-
const [best] = listed
|
|
817
|
-
.filter((r) => r.version !== "")
|
|
818
|
-
.map((r) => r.version)
|
|
819
|
-
.sort(newestFirst);
|
|
820
|
-
const recorded = versions.get(i.id) ?? [];
|
|
821
|
-
out.set(i.id, {
|
|
822
|
-
latest: best ?? null,
|
|
823
|
-
contentChanged: listed.some((r) => entryContentChanged(r.entry, {
|
|
824
|
-
marketplaceId: r.source_id,
|
|
825
|
-
headCommit: r.head_commit,
|
|
826
|
-
treeOid: r.tree_oid,
|
|
827
|
-
url: r.url,
|
|
828
|
-
lastCommit: r.last_commit,
|
|
829
|
-
}, recorded)),
|
|
830
|
-
});
|
|
831
|
-
}
|
|
832
|
-
return out;
|
|
833
|
-
}
|
|
834
|
-
/** Org install counts per item (see {@link CatalogItemView.installs}). */
|
|
835
|
-
async function countInstalls(db, items, versions) {
|
|
836
|
-
const orgs = new Map(items.map((i) => [i.id, new Set()]));
|
|
837
|
-
const installed = await db
|
|
838
|
-
.selectFrom("plugin_installs")
|
|
839
|
-
.select(["item_id", "org_id"])
|
|
840
|
-
.where("item_id", "in", items.map((i) => i.id))
|
|
841
|
-
.where("status", "in", ["installed", "upgrading"])
|
|
842
|
-
.execute();
|
|
843
|
-
for (const r of installed)
|
|
844
|
-
orgs.get(r.item_id)?.add(r.org_id);
|
|
845
|
-
const withExtension = items.filter((i) => (versions.get(i.id) ?? []).find((v) => v.version === i.latest_version)?.extension_sha256 !=
|
|
846
|
-
null);
|
|
847
|
-
if (withExtension.length > 0) {
|
|
848
|
-
const enabled = await db
|
|
849
|
-
.selectFrom(enabledExtensionsByOrg(db).as("en"))
|
|
850
|
-
.select(["en.plugin", "en.org_id"])
|
|
851
|
-
.where("en.plugin", "in", withExtension.map((p) => p.name))
|
|
852
|
-
.execute();
|
|
853
|
-
for (const i of withExtension) {
|
|
854
|
-
for (const r of enabled)
|
|
855
|
-
if (r.plugin === i.name)
|
|
856
|
-
orgs.get(i.id)?.add(r.org_id);
|
|
857
|
-
}
|
|
858
|
-
}
|
|
859
|
-
return new Map([...orgs].map(([id, set]) => [id, set.size]));
|
|
860
|
-
}
|
|
861
|
-
export function itemView(i, versions, installs = 0, marketplace = { latest: null, contentChanged: false }) {
|
|
862
|
-
const sorted = [...versions].sort((a, b) => newestFirst({ version: a.version, importedAt: a.imported_at ?? null }, { version: b.version, importedAt: b.imported_at ?? null }));
|
|
863
|
-
const top = sorted[0]?.version ?? i.latest_version;
|
|
864
|
-
const latestMarketplaceVersion = marketplace.latest;
|
|
865
|
-
return {
|
|
866
|
-
id: i.id,
|
|
867
|
-
name: i.name,
|
|
868
|
-
publisher: i.publisher,
|
|
869
|
-
displayName: i.display_name,
|
|
870
|
-
description: i.description,
|
|
871
|
-
policy: i.policy,
|
|
872
|
-
latestVersion: i.latest_version,
|
|
873
|
-
versions: sorted.map((v) => v.version),
|
|
874
|
-
installs,
|
|
875
|
-
source: versions.find((v) => v.version === i.latest_version)?.source ?? "file",
|
|
876
|
-
marketplaceId: i.marketplace_id ?? null,
|
|
877
|
-
latestMarketplaceVersion,
|
|
878
|
-
newerInMarketplace: latestMarketplaceVersion !== null && compareVersions(latestMarketplaceVersion, top) > 0,
|
|
879
|
-
contentChanged: marketplace.contentChanged,
|
|
880
|
-
updatedAt: i.updated_at.toISOString(),
|
|
881
|
-
};
|
|
882
|
-
}
|
|
530
|
+
};
|
|
531
|
+
__decorate([
|
|
532
|
+
Transactional()
|
|
533
|
+
], CatalogService.prototype, "writePolicy", null);
|
|
534
|
+
__decorate([
|
|
535
|
+
Transactional()
|
|
536
|
+
], CatalogService.prototype, "writeRemove", null);
|
|
537
|
+
CatalogService = __decorate([
|
|
538
|
+
Injectable(),
|
|
539
|
+
__param(0, Inject(KernelDb)),
|
|
540
|
+
__param(1, Inject(EnterpriseAdminLock)),
|
|
541
|
+
__param(2, Inject(KernelConfigService)),
|
|
542
|
+
__param(3, Inject(ExtensionInstalls)),
|
|
543
|
+
__param(4, Inject(ExtensionAdminOps)),
|
|
544
|
+
__param(5, Inject(PluginImport)),
|
|
545
|
+
__param(6, Inject(MarketplacesService)),
|
|
546
|
+
__param(7, Inject(TransactionHost))
|
|
547
|
+
], CatalogService);
|
|
548
|
+
export { CatalogService };
|