@capybara-hq/kernel 0.1.0-rc.3 → 0.1.0-rc.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bootstrap.json +61 -5
- package/dist/admin/admin.controller.d.ts +47 -16
- package/dist/admin/admin.controller.js +44 -19
- package/dist/admin/extensions.controller.d.ts +24 -3
- package/dist/admin/extensions.controller.js +48 -8
- package/dist/admin/setup-lock.d.ts +1 -1
- package/dist/admin/setup-lock.js +1 -1
- package/dist/admin/setup.controller.d.ts +1 -1
- package/dist/admin/setup.controller.js +1 -1
- package/dist/admin/setup.service.d.ts +4 -4
- package/dist/admin/setup.service.js +8 -8
- package/dist/agents/agent-lookup.d.ts +19 -0
- package/dist/agents/agent-lookup.js +21 -0
- package/dist/agents/agent-profile.service.d.ts +29 -0
- package/dist/agents/agent-profile.service.js +117 -0
- package/dist/agents/agents.controller.d.ts +168 -3
- package/dist/agents/agents.controller.js +201 -12
- package/dist/agents/agents.module.d.ts +4 -1
- package/dist/agents/agents.module.js +36 -6
- package/dist/agents/agents.service.d.ts +64 -27
- package/dist/agents/agents.service.js +199 -74
- package/dist/agents/definition.d.ts +53 -0
- package/dist/agents/definition.js +55 -0
- package/dist/agents/from-template.d.ts +106 -0
- package/dist/agents/from-template.js +649 -0
- package/dist/agents/from-template.service.d.ts +60 -0
- package/dist/agents/from-template.service.js +161 -0
- package/dist/agents/instruction-files.d.ts +60 -0
- package/dist/agents/instruction-files.js +111 -0
- package/dist/agents/models.controller.d.ts +9 -3
- package/dist/agents/models.controller.js +19 -4
- package/dist/agents/org-templates.d.ts +176 -0
- package/dist/agents/org-templates.js +827 -0
- package/dist/agents/pending-connector-requests.d.ts +77 -0
- package/dist/agents/pending-connector-requests.js +215 -0
- package/dist/agents/pending-connectors.controller.d.ts +39 -0
- package/dist/agents/pending-connectors.controller.js +91 -0
- package/dist/agents/pending-connectors.service.d.ts +62 -0
- package/dist/agents/pending-connectors.service.js +282 -0
- package/dist/agents/profile.d.ts +96 -0
- package/dist/agents/profile.js +51 -0
- package/dist/agents/readiness.controller.d.ts +26 -0
- package/dist/agents/readiness.controller.js +56 -0
- package/dist/agents/templates.controller.d.ts +86 -5
- package/dist/agents/templates.controller.js +171 -7
- package/dist/agents/templates.d.ts +127 -23
- package/dist/agents/templates.js +476 -53
- package/dist/background/background.controller.d.ts +38 -0
- package/dist/background/background.controller.js +87 -0
- package/dist/background/background.module.d.ts +10 -0
- package/dist/background/background.module.js +39 -0
- package/dist/background/finish.d.ts +44 -0
- package/dist/background/finish.js +94 -0
- package/dist/background/launch-lock.d.ts +15 -0
- package/dist/background/launch-lock.js +40 -0
- package/dist/background/launch.d.ts +36 -0
- package/dist/background/launch.js +70 -0
- package/dist/background/poll.job.d.ts +56 -0
- package/dist/background/poll.job.js +190 -0
- package/dist/background/render.d.ts +23 -0
- package/dist/background/render.js +48 -0
- package/dist/background/session.d.ts +48 -0
- package/dist/background/session.js +79 -0
- package/dist/background/status.d.ts +35 -0
- package/dist/background/status.js +57 -0
- package/dist/background/stop.d.ts +68 -0
- package/dist/background/stop.js +243 -0
- package/dist/background/store.d.ts +162 -0
- package/dist/background/store.js +357 -0
- package/dist/background/store.module.d.ts +6 -0
- package/dist/background/store.module.js +22 -0
- package/dist/background/tasks.service.d.ts +77 -0
- package/dist/background/tasks.service.js +211 -0
- package/dist/background/wake-rules.d.ts +66 -0
- package/dist/background/wake-rules.js +113 -0
- package/dist/background/wake.d.ts +30 -0
- package/dist/background/wake.js +63 -0
- package/dist/catalog/admin-catalog.controller.d.ts +129 -30
- package/dist/catalog/admin-catalog.controller.js +213 -42
- package/dist/catalog/catalog-content.d.ts +58 -32
- package/dist/catalog/catalog-content.js +34 -8
- package/dist/catalog/catalog-import.module.d.ts +7 -0
- package/dist/catalog/catalog-import.module.js +60 -0
- package/dist/catalog/catalog-items.d.ts +111 -7
- package/dist/catalog/catalog-items.js +279 -13
- package/dist/catalog/catalog-scope.service.d.ts +260 -0
- package/dist/catalog/catalog-scope.service.js +1116 -0
- package/dist/catalog/catalog.module.d.ts +7 -9
- package/dist/catalog/catalog.module.js +41 -31
- package/dist/catalog/catalog.service.d.ts +101 -29
- package/dist/catalog/catalog.service.js +104 -106
- package/dist/catalog/claude/agents.js +2 -0
- package/dist/catalog/cli.d.ts +11 -1
- package/dist/catalog/cli.js +26 -1
- package/dist/catalog/component-promotion.d.ts +96 -0
- package/dist/catalog/component-promotion.js +395 -0
- package/dist/catalog/component-scope.controller.d.ts +152 -0
- package/dist/catalog/component-scope.controller.js +287 -0
- package/dist/catalog/component-scope.service.d.ts +303 -0
- package/dist/catalog/component-scope.service.js +936 -0
- package/dist/catalog/component-state.d.ts +174 -0
- package/dist/catalog/component-state.js +437 -0
- package/dist/catalog/job-ids.d.ts +30 -0
- package/dist/catalog/job-ids.js +25 -0
- package/dist/catalog/marketplace-fetch.d.ts +1 -1
- package/dist/catalog/marketplaces.controller.d.ts +22 -5
- package/dist/catalog/marketplaces.controller.js +56 -7
- package/dist/catalog/marketplaces.service.d.ts +54 -14
- package/dist/catalog/marketplaces.service.js +71 -22
- package/dist/catalog/org-catalog.controller.d.ts +125 -34
- package/dist/catalog/org-catalog.controller.js +181 -65
- package/dist/catalog/org-catalog.service.d.ts +65 -33
- package/dist/catalog/org-catalog.service.js +324 -157
- package/dist/catalog/org-extension-switch.d.ts +41 -0
- package/dist/catalog/org-extension-switch.js +115 -0
- package/dist/catalog/org-extension.controller.d.ts +119 -0
- package/dist/catalog/org-extension.controller.js +266 -0
- package/dist/catalog/org-plugin-uploads.controller.d.ts +98 -0
- package/dist/catalog/org-plugin-uploads.controller.js +213 -0
- package/dist/catalog/org-plugin-uploads.d.ts +63 -0
- package/dist/catalog/org-plugin-uploads.js +116 -0
- package/dist/catalog/owned-items.d.ts +184 -0
- package/dist/catalog/owned-items.js +789 -0
- package/dist/catalog/owned-plugin-cleanup.d.ts +56 -0
- package/dist/catalog/owned-plugin-cleanup.js +194 -0
- package/dist/catalog/ownership.d.ts +172 -0
- package/dist/catalog/ownership.js +326 -0
- package/dist/catalog/platform-components.d.ts +221 -0
- package/dist/catalog/platform-components.js +761 -0
- package/dist/catalog/platform-migration.d.ts +115 -0
- package/dist/catalog/platform-migration.js +582 -0
- package/dist/catalog/plugin-import.d.ts +178 -34
- package/dist/catalog/plugin-import.js +623 -83
- package/dist/catalog/plugin-install.d.ts +185 -41
- package/dist/catalog/plugin-install.js +758 -126
- package/dist/catalog/plugin-upgrade.d.ts +260 -225
- package/dist/catalog/plugin-upgrade.js +1148 -1137
- package/dist/catalog/request-rules.d.ts +65 -0
- package/dist/catalog/request-rules.js +217 -0
- package/dist/catalog/requests.service.d.ts +193 -118
- package/dist/catalog/requests.service.js +526 -343
- package/dist/catalog/reserved-names.d.ts +8 -0
- package/dist/catalog/reserved-names.js +42 -0
- package/dist/catalog/scope-orgs.d.ts +21 -0
- package/dist/catalog/scope-orgs.js +67 -0
- package/dist/catalog/scope-state.d.ts +35 -0
- package/dist/catalog/scope-state.js +87 -0
- package/dist/catalog/scope-sync-workers.d.ts +7 -0
- package/dist/catalog/scope-sync-workers.js +29 -0
- package/dist/catalog/scope-sync.d.ts +176 -0
- package/dist/catalog/scope-sync.js +576 -0
- package/dist/catalog/scope.d.ts +42 -0
- package/dist/catalog/scope.js +42 -0
- package/dist/catalog/unshare.d.ts +22 -0
- package/dist/catalog/unshare.js +118 -0
- package/dist/channels/actions.js +1 -0
- package/dist/channels/cards.js +21 -3
- package/dist/channels/channels.module.js +2 -0
- package/dist/channels/connections.service.d.ts +16 -1
- package/dist/channels/connections.service.js +38 -4
- package/dist/channels/inbound.d.ts +9 -1
- package/dist/channels/inbound.js +67 -5
- package/dist/channels/phrases.d.ts +35 -0
- package/dist/channels/phrases.js +29 -0
- package/dist/channels/threads.d.ts +5 -0
- package/dist/channels/threads.js +8 -0
- package/dist/config/docs.js +3 -1
- package/dist/config/schema.d.ts +24 -2
- package/dist/config/schema.js +145 -19
- package/dist/conversations/access.d.ts +6 -4
- package/dist/conversations/access.js +29 -5
- package/dist/conversations/agent-tree.d.ts +46 -0
- package/dist/conversations/agent-tree.js +92 -0
- package/dist/conversations/attachments.service.d.ts +30 -0
- package/dist/conversations/attachments.service.js +130 -5
- package/dist/conversations/conversations.controller.d.ts +79 -23
- package/dist/conversations/conversations.controller.js +141 -50
- package/dist/conversations/conversations.module.d.ts +1 -1
- package/dist/conversations/conversations.module.js +10 -7
- package/dist/conversations/conversations.service.d.ts +108 -9
- package/dist/conversations/conversations.service.js +237 -30
- package/dist/conversations/environment-status.d.ts +24 -0
- package/dist/conversations/environment-status.js +71 -0
- package/dist/conversations/event-log.d.ts +21 -6
- package/dist/conversations/event-log.js +70 -1
- package/dist/conversations/events.d.ts +140 -0
- package/dist/conversations/events.js +142 -13
- package/dist/conversations/queue.d.ts +3 -1
- package/dist/conversations/queue.js +13 -2
- package/dist/conversations/queue.service.d.ts +1 -1
- package/dist/conversations/queue.service.js +8 -1
- package/dist/conversations/titles.d.ts +12 -3
- package/dist/conversations/titles.js +36 -8
- package/dist/conversations/tree.d.ts +17 -0
- package/dist/conversations/tree.js +42 -0
- package/dist/ctx/create-ctx.d.ts +5 -0
- package/dist/ctx/create-ctx.js +15 -5
- package/dist/db/kernel-schema.d.ts +420 -20
- package/dist/db/pool.d.ts +5 -0
- package/dist/db/pool.js +3 -0
- package/dist/environments/access.d.ts +41 -0
- package/dist/environments/access.js +77 -0
- package/dist/environments/conversation-environments.d.ts +61 -0
- package/dist/environments/conversation-environments.js +170 -0
- package/dist/environments/dto.d.ts +25 -0
- package/dist/environments/dto.js +12 -0
- package/dist/environments/environments.controller.d.ts +33 -0
- package/dist/environments/environments.controller.js +110 -0
- package/dist/environments/environments.module.d.ts +8 -0
- package/dist/environments/environments.module.js +27 -0
- package/dist/environments/environments.service.d.ts +153 -0
- package/dist/environments/environments.service.js +541 -0
- package/dist/environments/legacy-cleanup.job.d.ts +34 -0
- package/dist/environments/legacy-cleanup.job.js +141 -0
- package/dist/errors.d.ts +90 -2
- package/dist/errors.js +90 -2
- package/dist/evals/reconstruct.d.ts +18 -9
- package/dist/evals/reconstruct.js +26 -7
- package/dist/evals/run-replay.d.ts +7 -2
- package/dist/evals/run-replay.js +42 -7
- package/dist/evals/step-replay.d.ts +2 -5
- package/dist/evals/step-replay.js +13 -7
- package/dist/evals/trajectory.js +1 -1
- package/dist/evals/trajectory.service.d.ts +8 -3
- package/dist/evals/trajectory.service.js +26 -14
- package/dist/evals/worker.d.ts +5 -5
- package/dist/evals/worker.js +9 -3
- package/dist/extensions/admin-ops.d.ts +36 -10
- package/dist/extensions/admin-ops.js +67 -42
- package/dist/extensions/admin-view.d.ts +39 -10
- package/dist/extensions/admin-view.js +111 -20
- package/dist/extensions/blobs.js +1 -0
- package/dist/extensions/bootstrap.d.ts +17 -4
- package/dist/extensions/bootstrap.js +70 -9
- package/dist/extensions/cli.d.ts +12 -0
- package/dist/extensions/cli.js +11 -2
- package/dist/extensions/config-issues.d.ts +13 -1
- package/dist/extensions/config-issues.js +22 -5
- package/dist/extensions/config-json-schema.d.ts +43 -7
- package/dist/extensions/config-json-schema.js +124 -58
- package/dist/extensions/deployment-config-store.d.ts +6 -0
- package/dist/extensions/deployment-config.d.ts +78 -8
- package/dist/extensions/deployment-config.js +172 -34
- package/dist/extensions/display-name.d.ts +22 -0
- package/dist/extensions/display-name.js +77 -0
- package/dist/extensions/effective-config.d.ts +127 -0
- package/dist/extensions/effective-config.js +368 -0
- package/dist/extensions/extensions.module.js +14 -2
- package/dist/extensions/hooks.d.ts +37 -4
- package/dist/extensions/hooks.js +82 -16
- package/dist/extensions/host.d.ts +45 -2
- package/dist/extensions/host.js +112 -16
- package/dist/extensions/installs.d.ts +20 -8
- package/dist/extensions/installs.js +37 -15
- package/dist/extensions/org-config.d.ts +81 -6
- package/dist/extensions/org-config.js +195 -44
- package/dist/extensions/org-levels.d.ts +37 -0
- package/dist/extensions/org-levels.js +71 -0
- package/dist/extensions/org-overrides.d.ts +151 -0
- package/dist/extensions/org-overrides.js +524 -0
- package/dist/extensions/package.d.ts +14 -1
- package/dist/extensions/package.js +51 -2
- package/dist/extensions/permission-view.d.ts +19 -4
- package/dist/extensions/permission-view.js +4 -4
- package/dist/extensions/plugin-items.d.ts +21 -0
- package/dist/extensions/plugin-items.js +42 -0
- package/dist/extensions/point-defaults.controller.d.ts +34 -0
- package/dist/extensions/point-defaults.controller.js +71 -0
- package/dist/extensions/point-defaults.d.ts +71 -0
- package/dist/extensions/point-defaults.js +234 -0
- package/dist/extensions/registry.d.ts +1 -1
- package/dist/extensions/registry.js +2 -0
- package/dist/extensions/resolve.d.ts +5 -1
- package/dist/extensions/resolve.js +15 -2
- package/dist/files/previewers.d.ts +8 -1
- package/dist/files/previewers.js +35 -6
- package/dist/http/api.module.js +31 -3
- package/dist/http/app.d.ts +11 -2
- package/dist/http/app.js +31 -5
- package/dist/http/nest-logger.d.ts +6 -5
- package/dist/http/nest-logger.js +24 -10
- package/dist/identity/accounts.d.ts +29 -29
- package/dist/identity/accounts.js +47 -47
- package/dist/identity/audit.d.ts +2 -1
- package/dist/identity/auth.controller.js +9 -5
- package/dist/identity/auth.guard.d.ts +13 -5
- package/dist/identity/auth.guard.js +26 -9
- package/dist/identity/cookies.d.ts +20 -5
- package/dist/identity/cookies.js +44 -6
- package/dist/identity/identity.module.d.ts +1 -1
- package/dist/identity/identity.module.js +4 -4
- package/dist/identity/me.controller.d.ts +5 -1
- package/dist/identity/me.controller.js +12 -3
- package/dist/identity/principal.d.ts +3 -3
- package/dist/identity/principal.js +3 -3
- package/dist/identity/sessions.d.ts +12 -0
- package/dist/identity/sessions.js +45 -0
- package/dist/identity/settings.d.ts +22 -11
- package/dist/identity/settings.js +53 -18
- package/dist/identity/{enterprise-admin.d.ts → super-admin.d.ts} +5 -5
- package/dist/identity/{enterprise-admin.js → super-admin.js} +24 -24
- package/dist/inbox/inbox.module.d.ts +4 -1
- package/dist/inbox/inbox.module.js +7 -3
- package/dist/inbox/inbox.service.d.ts +62 -3
- package/dist/inbox/inbox.service.js +74 -4
- package/dist/inbox/org-notices.d.ts +63 -0
- package/dist/inbox/org-notices.js +91 -0
- package/dist/inbox/platform-inbox.controller.d.ts +23 -0
- package/dist/inbox/platform-inbox.controller.js +58 -0
- package/dist/inbox/platform-inbox.service.d.ts +151 -0
- package/dist/inbox/platform-inbox.service.js +263 -0
- package/dist/inbox/platform-notices.d.ts +19 -0
- package/dist/inbox/platform-notices.js +9 -0
- package/dist/index.d.ts +2 -2
- package/dist/index.js +1 -1
- package/dist/infra/cli/kernel-cli.module.js +9 -1
- package/dist/infra/config/kernel-config.service.js +27 -1
- package/dist/infra/database/database.module.js +1 -0
- package/dist/infra/database/xact-lock.d.ts +1 -1
- package/dist/infra/database/xact-lock.js +1 -1
- package/dist/infra/events/kernel-events.d.ts +19 -2
- package/dist/infra/lifecycle/process-guards.js +4 -0
- package/dist/infra/logging/logging.module.d.ts +4 -2
- package/dist/infra/logging/logging.module.js +24 -6
- package/dist/infra/queue/add-job-once.d.ts +14 -0
- package/dist/infra/queue/add-job-once.js +16 -0
- package/dist/infra/queue/redis-connection.d.ts +6 -0
- package/dist/infra/queue/redis-connection.js +7 -0
- package/dist/infra/redis/redis.module.js +6 -2
- package/dist/infra/tokens.d.ts +6 -1
- package/dist/infra/tokens.js +6 -1
- package/dist/kernel.module.js +6 -0
- package/dist/lifecycle/kernel-lifecycle.d.ts +1 -1
- package/dist/lifecycle/kernel-lifecycle.js +4 -4
- package/dist/log.d.ts +13 -1
- package/dist/log.js +93 -17
- package/dist/models/prices.d.ts +5 -5
- package/dist/models/prices.js +4 -4
- package/dist/models/purposes.controller.d.ts +6 -4
- package/dist/models/purposes.controller.js +13 -7
- package/dist/models/purposes.d.ts +43 -9
- package/dist/models/purposes.js +48 -18
- package/dist/orgs/directory-sync.d.ts +14 -5
- package/dist/orgs/directory-sync.js +41 -17
- package/dist/orgs/offboarding.d.ts +12 -8
- package/dist/orgs/offboarding.js +54 -33
- package/dist/orgs/org-lock.d.ts +5 -0
- package/dist/orgs/org-lock.js +13 -0
- package/dist/orgs/org.guard.d.ts +10 -0
- package/dist/orgs/org.guard.js +43 -32
- package/dist/orgs/orgs.module.js +3 -0
- package/dist/orgs/orgs.service.d.ts +20 -7
- package/dist/orgs/orgs.service.js +32 -12
- package/dist/orgs/roles.d.ts +1 -1
- package/dist/orgs/roles.js +5 -1
- package/dist/orgs/settings.controller.d.ts +1 -1
- package/dist/orgs/settings.service.d.ts +20 -3
- package/dist/orgs/settings.service.js +19 -4
- package/dist/overrides.d.ts +3 -0
- package/dist/overrides.js +2 -0
- package/dist/platform/actor.d.ts +48 -0
- package/dist/platform/actor.js +100 -0
- package/dist/platform/agent-docs.d.ts +18 -0
- package/dist/platform/agent-docs.js +59 -0
- package/dist/platform/availability.d.ts +14 -0
- package/dist/platform/availability.js +43 -0
- package/dist/platform/errors.d.ts +11 -0
- package/dist/platform/errors.js +26 -0
- package/dist/platform/exclusions.d.ts +12 -0
- package/dist/platform/exclusions.js +1387 -0
- package/dist/platform/method.d.ts +6 -0
- package/dist/platform/method.js +15 -0
- package/dist/platform/operation.d.ts +92 -0
- package/dist/platform/operation.js +35 -0
- package/dist/platform/ops/agent-templates.ops.d.ts +14 -0
- package/dist/platform/ops/agent-templates.ops.js +92 -0
- package/dist/platform/ops/agents.ops.d.ts +19 -0
- package/dist/platform/ops/agents.ops.js +294 -0
- package/dist/platform/ops/connectors.ops.d.ts +15 -0
- package/dist/platform/ops/connectors.ops.js +126 -0
- package/dist/platform/ops/errors.d.ts +11 -0
- package/dist/platform/ops/errors.js +22 -0
- package/dist/platform/ops/extensions.ops.d.ts +19 -0
- package/dist/platform/ops/extensions.ops.js +116 -0
- package/dist/platform/ops/marketplaces.ops.d.ts +16 -0
- package/dist/platform/ops/marketplaces.ops.js +157 -0
- package/dist/platform/ops/paging.d.ts +14 -0
- package/dist/platform/ops/paging.js +20 -0
- package/dist/platform/ops/platform.ops.d.ts +23 -0
- package/dist/platform/ops/platform.ops.js +158 -0
- package/dist/platform/ops/plugins.ops.d.ts +33 -0
- package/dist/platform/ops/plugins.ops.js +377 -0
- package/dist/platform/ops/requests.ops.d.ts +14 -0
- package/dist/platform/ops/requests.ops.js +153 -0
- package/dist/platform/ops/role.d.ts +4 -0
- package/dist/platform/ops/role.js +10 -0
- package/dist/platform/ops/skills.ops.d.ts +13 -0
- package/dist/platform/ops/skills.ops.js +98 -0
- package/dist/platform/ops/summary.d.ts +10 -0
- package/dist/platform/ops/summary.js +18 -0
- package/dist/platform/platform-ops.module.d.ts +7 -0
- package/dist/platform/platform-ops.module.js +55 -0
- package/dist/platform/platform.module.d.ts +8 -0
- package/dist/platform/platform.module.js +25 -0
- package/dist/platform/redact-orgs.d.ts +7 -0
- package/dist/platform/redact-orgs.js +52 -0
- package/dist/platform/registry.d.ts +30 -0
- package/dist/platform/registry.js +111 -0
- package/dist/roles/worker-role.d.ts +6 -4
- package/dist/roles/worker-role.js +14 -7
- package/dist/roles/worker.module.d.ts +1 -1
- package/dist/roles/worker.module.js +15 -1
- package/dist/runtime/context/build.d.ts +11 -7
- package/dist/runtime/context/build.js +46 -19
- package/dist/runtime/context/claude-tools.d.ts +3 -1
- package/dist/runtime/context/claude-tools.js +8 -6
- package/dist/runtime/context/compaction.js +13 -0
- package/dist/runtime/context/reminders.d.ts +2 -0
- package/dist/runtime/context/reminders.js +2 -0
- package/dist/runtime/context/skills.js +9 -2
- package/dist/runtime/context/tool-changes.d.ts +27 -0
- package/dist/runtime/context/tool-changes.js +60 -0
- package/dist/runtime/hook-calls.js +2 -0
- package/dist/runtime/langgraph-loop.d.ts +3 -1
- package/dist/runtime/langgraph-loop.js +36 -17
- package/dist/runtime/loop.d.ts +34 -5
- package/dist/runtime/maintenance.d.ts +9 -4
- package/dist/runtime/maintenance.js +35 -8
- package/dist/runtime/model-call.d.ts +46 -8
- package/dist/runtime/model-call.js +72 -21
- package/dist/runtime/providers.d.ts +6 -0
- package/dist/runtime/providers.js +8 -0
- package/dist/runtime/run-control.d.ts +11 -1
- package/dist/runtime/run-control.js +12 -0
- package/dist/runtime/run-drafts.d.ts +85 -0
- package/dist/runtime/run-drafts.js +230 -0
- package/dist/runtime/run-jobs.d.ts +3 -5
- package/dist/runtime/run-jobs.js +3 -7
- package/dist/runtime/run-queue.d.ts +59 -2
- package/dist/runtime/run-queue.js +311 -38
- package/dist/runtime/run-worker.d.ts +11 -5
- package/dist/runtime/run-worker.js +69 -33
- package/dist/runtime/runtime.module.js +11 -3
- package/dist/runtime/step-log.d.ts +15 -4
- package/dist/runtime/step-log.js +24 -7
- package/dist/runtime/stream.controller.d.ts +23 -1
- package/dist/runtime/stream.controller.js +60 -3
- package/dist/runtime/stream.d.ts +4 -1
- package/dist/runtime/stream.js +27 -3
- package/dist/runtime/subagents/child.d.ts +55 -7
- package/dist/runtime/subagents/child.js +105 -7
- package/dist/runtime/subagents/definition.d.ts +12 -3
- package/dist/runtime/subagents/definition.js +44 -28
- package/dist/runtime/subagents/deliveries.d.ts +71 -0
- package/dist/runtime/subagents/deliveries.js +228 -0
- package/dist/runtime/subagents/dispatch.d.ts +115 -26
- package/dist/runtime/subagents/dispatch.js +212 -141
- package/dist/runtime/subagents/limits.d.ts +24 -5
- package/dist/runtime/subagents/limits.js +40 -6
- package/dist/runtime/subagents/messages.d.ts +95 -0
- package/dist/runtime/subagents/messages.js +328 -0
- package/dist/runtime/subagents/preamble.d.ts +4 -4
- package/dist/runtime/subagents/preamble.js +9 -7
- package/dist/runtime/subagents/progress.d.ts +8 -6
- package/dist/runtime/subagents/progress.js +11 -6
- package/dist/runtime/subagents/render.d.ts +30 -0
- package/dist/runtime/subagents/render.js +53 -0
- package/dist/runtime/subagents/roster.d.ts +24 -7
- package/dist/runtime/subagents/roster.js +47 -11
- package/dist/runtime/subagents/skill-fork.d.ts +3 -2
- package/dist/runtime/subagents/skill-fork.js +8 -4
- package/dist/runtime/subagents/status.d.ts +14 -0
- package/dist/runtime/subagents/status.js +23 -0
- package/dist/runtime/subagents/subagents.service.d.ts +7 -4
- package/dist/runtime/subagents/subagents.service.js +11 -6
- package/dist/runtime/usage-report.d.ts +2 -1
- package/dist/runtime/usage-report.js +19 -13
- package/dist/runtime/waits.d.ts +145 -36
- package/dist/runtime/waits.js +423 -109
- package/dist/sandbox/jobs.d.ts +40 -13
- package/dist/sandbox/jobs.js +57 -20
- package/dist/sandbox/leases.d.ts +37 -54
- package/dist/sandbox/leases.js +71 -115
- package/dist/sandbox/providers.d.ts +2 -2
- package/dist/sandbox/providers.js +1 -1
- package/dist/sandbox/sandbox.module.d.ts +3 -2
- package/dist/sandbox/sandbox.module.js +10 -4
- package/dist/sandbox/sandbox.service.d.ts +282 -129
- package/dist/sandbox/sandbox.service.js +736 -381
- package/dist/skills/catalog.d.ts +3 -2
- package/dist/skills/catalog.js +21 -43
- package/dist/skills/changes.controller.d.ts +7 -0
- package/dist/skills/changes.controller.js +19 -1
- package/dist/skills/invoke.js +8 -3
- package/dist/skills/package.d.ts +20 -1
- package/dist/skills/package.js +28 -1
- package/dist/skills/skills.controller.d.ts +39 -4
- package/dist/skills/skills.controller.js +88 -10
- package/dist/skills/skills.module.js +10 -1
- package/dist/skills/skills.service.d.ts +106 -26
- package/dist/skills/skills.service.js +421 -75
- package/dist/skills/usable.d.ts +81 -0
- package/dist/skills/usable.js +379 -0
- package/dist/tools/approvals.service.d.ts +20 -2
- package/dist/tools/approvals.service.js +25 -4
- package/dist/tools/builtin-names.d.ts +41 -7
- package/dist/tools/builtin-names.js +59 -7
- package/dist/tools/builtins/agent.d.ts +23 -21
- package/dist/tools/builtins/agent.js +62 -55
- package/dist/tools/builtins/builtin-tools.d.ts +19 -1
- package/dist/tools/builtins/builtin-tools.js +59 -2
- package/dist/tools/builtins/handback.d.ts +28 -0
- package/dist/tools/builtins/handback.js +53 -0
- package/dist/tools/builtins/platform.d.ts +34 -0
- package/dist/tools/builtins/platform.js +362 -0
- package/dist/tools/builtins/sandbox/bash.d.ts +1 -1
- package/dist/tools/builtins/sandbox/bash.js +241 -4
- package/dist/tools/builtins/sandbox/common.d.ts +69 -27
- package/dist/tools/builtins/sandbox/common.js +87 -48
- package/dist/tools/builtins/sandbox/deliver.js +1 -1
- package/dist/tools/builtins/sandbox/edit.js +2 -2
- package/dist/tools/builtins/sandbox/glob.js +2 -2
- package/dist/tools/builtins/sandbox/grep.js +2 -4
- package/dist/tools/builtins/sandbox/index.d.ts +3 -1
- package/dist/tools/builtins/sandbox/index.js +7 -1
- package/dist/tools/builtins/sandbox/read.js +1 -1
- package/dist/tools/builtins/sandbox/task-output.d.ts +74 -0
- package/dist/tools/builtins/sandbox/task-output.js +329 -0
- package/dist/tools/builtins/sandbox/task-stop.d.ts +10 -0
- package/dist/tools/builtins/sandbox/task-stop.js +113 -0
- package/dist/tools/builtins/sandbox/write.js +2 -2
- package/dist/tools/builtins/send-message.d.ts +56 -0
- package/dist/tools/builtins/send-message.js +100 -0
- package/dist/tools/builtins/skill-load.d.ts +22 -14
- package/dist/tools/builtins/skill-load.js +86 -57
- package/dist/tools/builtins/skill-write.js +1 -1
- package/dist/tools/builtins/web/errors.d.ts +8 -0
- package/dist/tools/builtins/web/errors.js +53 -0
- package/dist/tools/builtins/web/extract.d.ts +62 -0
- package/dist/tools/builtins/web/extract.js +271 -0
- package/dist/tools/builtins/web/fetch.d.ts +55 -0
- package/dist/tools/builtins/web/fetch.js +175 -0
- package/dist/tools/builtins/web/index.d.ts +13 -0
- package/dist/tools/builtins/web/index.js +12 -0
- package/dist/tools/builtins/web/page-cache.d.ts +25 -0
- package/dist/tools/builtins/web/page-cache.js +77 -0
- package/dist/tools/builtins/web/search.d.ts +25 -0
- package/dist/tools/builtins/web/search.js +210 -0
- package/dist/tools/builtins/web/url.d.ts +17 -0
- package/dist/tools/builtins/web/url.js +43 -0
- package/dist/tools/connectors.controller.d.ts +10 -0
- package/dist/tools/connectors.controller.js +12 -0
- package/dist/tools/connectors.service.d.ts +46 -5
- package/dist/tools/connectors.service.js +94 -15
- package/dist/tools/extension-tools.controller.d.ts +14 -0
- package/dist/tools/extension-tools.controller.js +37 -0
- package/dist/tools/info.d.ts +42 -1
- package/dist/tools/info.js +64 -1
- package/dist/tools/oauth/flow-paths.d.ts +1 -1
- package/dist/tools/oauth/flow-paths.js +1 -1
- package/dist/tools/org-tool-switches.d.ts +74 -0
- package/dist/tools/org-tool-switches.js +184 -0
- package/dist/tools/pipeline.d.ts +46 -40
- package/dist/tools/pipeline.js +202 -364
- package/dist/tools/policy.d.ts +1 -1
- package/dist/tools/policy.js +36 -16
- package/dist/tools/registry.d.ts +120 -8
- package/dist/tools/registry.js +112 -19
- package/dist/tools/tools.module.js +24 -2
- package/dist/tools/validate.js +1 -1
- package/dist/ui/views.d.ts +2 -1
- package/dist/ui/views.js +17 -3
- package/package.json +3 -3
- package/src/migrations/0064_account_last_org.sql +7 -0
- package/src/migrations/0065_conversation_archive.sql +8 -0
- package/src/migrations/0066_extension_display_name.sql +4 -0
- package/src/migrations/0067_agent_profiles.sql +20 -0
- package/src/migrations/0068_agent_avatar_uploads.sql +7 -0
- package/src/migrations/0069_attachments_agent_idx.sql +3 -0
- package/src/migrations/0070_background_tasks.sql +37 -0
- package/src/migrations/0071_background_tasks_reserve.sql +6 -0
- package/src/migrations/0072_background_tasks_stopping.sql +5 -0
- package/src/migrations/0073_org_extension_point_defaults.sql +11 -0
- package/src/migrations/0074_subagent_tree.sql +50 -0
- package/src/migrations/0075_plugin_scope.sql +61 -0
- package/src/migrations/0076_skills_created_by_nullable.sql +6 -0
- package/src/migrations/0077_scope_requests.sql +52 -0
- package/src/migrations/0078_scope_grant_switches.sql +18 -0
- package/src/migrations/0079_scope_live_install_switches.sql +19 -0
- package/src/migrations/0080_rename_enterprise_admin.sql +18 -0
- package/src/migrations/0081_platform_components.sql +129 -0
- package/src/migrations/0082_platform_migration.sql +33 -0
- package/src/migrations/0083_plugin_scope_sync_failures.sql +15 -0
- package/src/migrations/0084_org_owned_items.sql +85 -0
- package/src/migrations/0085_agent_templates_phase4.sql +45 -0
- package/src/migrations/0086_org_layering.sql +30 -0
- package/src/migrations/0087_approval_summary.sql +6 -0
- package/src/migrations/0088_environments.sql +80 -0
- package/dist/catalog/upgrade-targets.d.ts +0 -56
- package/dist/catalog/upgrade-targets.js +0 -90
- package/dist/conversations/sandbox-status.d.ts +0 -24
- package/dist/conversations/sandbox-status.js +0 -52
- package/dist/extensions/org-config.controller.d.ts +0 -24
- package/dist/extensions/org-config.controller.js +0 -62
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
import { Module } from "@nestjs/common";
|
|
8
|
+
import { ExtensionsModule } from "../extensions/extensions.module.js";
|
|
9
|
+
import { SuperAdminLockModule } from "../identity/super-admin.js";
|
|
10
|
+
import { QueueModule } from "../infra/queue/queue.module.js";
|
|
11
|
+
import { OrgLockModule } from "../orgs/org-lock.js";
|
|
12
|
+
import { MAINTENANCE_QUEUE_NAME } from "../runtime/maintenance-queue.js";
|
|
13
|
+
import { StorageModule } from "../storage/storage.module.js";
|
|
14
|
+
import { CatalogService } from "./catalog.service.js";
|
|
15
|
+
import { ComponentPromotion } from "./component-promotion.js";
|
|
16
|
+
import { CatalogItemLock, CatalogSourceLock } from "./locks.js";
|
|
17
|
+
import { MarketplacesService } from "./marketplaces.service.js";
|
|
18
|
+
import { PlatformComponents } from "./platform-components.js";
|
|
19
|
+
import { PluginImport } from "./plugin-import.js";
|
|
20
|
+
// Its own file so that `SkillsModule` can import it (an owner's new version of a promoted skill is
|
|
21
|
+
// written to its platform row, ruling P3-4) without a module file cycle through `CatalogModule`.
|
|
22
|
+
/**
|
|
23
|
+
* The platform side of the catalog: marketplaces, the one import review (prepare -> confirm), the
|
|
24
|
+
* items and their platform components. The CLI's `capybara plugins *` and `capybara bootstrap` run on this
|
|
25
|
+
* part alone.
|
|
26
|
+
*/
|
|
27
|
+
let CatalogImportModule = class CatalogImportModule {
|
|
28
|
+
};
|
|
29
|
+
CatalogImportModule = __decorate([
|
|
30
|
+
Module({
|
|
31
|
+
imports: [
|
|
32
|
+
ExtensionsModule,
|
|
33
|
+
SuperAdminLockModule,
|
|
34
|
+
// an org upload re-checks the owner org's admin (`PluginImport`, ruling P3-7)
|
|
35
|
+
OrgLockModule,
|
|
36
|
+
StorageModule,
|
|
37
|
+
// a failed post-import platform sync enqueues the migration job (`PluginImport.syncPlatform`)
|
|
38
|
+
QueueModule.registerQueue(MAINTENANCE_QUEUE_NAME),
|
|
39
|
+
],
|
|
40
|
+
providers: [
|
|
41
|
+
CatalogSourceLock,
|
|
42
|
+
CatalogItemLock,
|
|
43
|
+
MarketplacesService,
|
|
44
|
+
PluginImport,
|
|
45
|
+
PlatformComponents,
|
|
46
|
+
// promote on share (ruling P3-3): the admin component routes and the owner's 可共享
|
|
47
|
+
ComponentPromotion,
|
|
48
|
+
CatalogService,
|
|
49
|
+
],
|
|
50
|
+
exports: [
|
|
51
|
+
MarketplacesService,
|
|
52
|
+
PluginImport,
|
|
53
|
+
PlatformComponents,
|
|
54
|
+
ComponentPromotion,
|
|
55
|
+
CatalogService,
|
|
56
|
+
CatalogItemLock,
|
|
57
|
+
],
|
|
58
|
+
})
|
|
59
|
+
], CatalogImportModule);
|
|
60
|
+
export { CatalogImportModule };
|
|
@@ -1,10 +1,13 @@
|
|
|
1
1
|
import type { Connector, ConnectorTemplateSpec, LocalizedName, PluginManifest } from "@capybara-hq/plugin-sdk";
|
|
2
2
|
import type { KernelConfig } from "../config/schema.js";
|
|
3
3
|
import type { KernelSchemaDb, SourceFormat } from "../db/kernel-schema.js";
|
|
4
|
+
import type { ExtensionAdmin } from "../extensions/admin-view.js";
|
|
4
5
|
import type { StorageService } from "../storage/storage.service.js";
|
|
5
|
-
import type { CatalogItemView, CatalogPolicy, CatalogVersionSource, PermissionsMismatch, SourceDetail } from "./catalog.service.js";
|
|
6
|
+
import type { CatalogItemView, CatalogPolicy, CatalogVersionSource, ComponentCounts, PermissionsMismatch, SourceDetail } from "./catalog.service.js";
|
|
6
7
|
import type { TranslationReport } from "./claude/report.js";
|
|
7
8
|
import { type ImportedAs } from "./marketplaces.service.js";
|
|
9
|
+
import { type Owner } from "./ownership.js";
|
|
10
|
+
import type { PluginScope } from "./scope.js";
|
|
8
11
|
/**
|
|
9
12
|
* The object storage prefix of one import (relative to `deployment/`):
|
|
10
13
|
* `directory/<itemId>/<version>/<importId>/`. Each import gets a new `importId`, so the losing one of
|
|
@@ -36,6 +39,12 @@ export interface CatalogListing {
|
|
|
36
39
|
}
|
|
37
40
|
/** Input of {@link writeCatalogVersion}. */
|
|
38
41
|
export interface CatalogVersionWrite {
|
|
42
|
+
/**
|
|
43
|
+
* A new version of an org-owned item: `latest_version` (and the listing) stays where it is; it
|
|
44
|
+
* moves only when the version is applied or confirmed (ruling P3-34). The version row is
|
|
45
|
+
* written not applied (`applied_at` null, ruling P3-52) until {@link markVersionApplied}.
|
|
46
|
+
*/
|
|
47
|
+
keepLatest?: boolean;
|
|
39
48
|
/** null: the CLI (no account). */
|
|
40
49
|
actor: string | null;
|
|
41
50
|
actorTokenId?: string;
|
|
@@ -86,6 +95,16 @@ export interface CatalogVersionWrite {
|
|
|
86
95
|
* the source is not git. An item without package.json is identified by it instead of a package name.
|
|
87
96
|
*/
|
|
88
97
|
export declare function gitIdentity(detail: SourceDetail | undefined): string | null;
|
|
98
|
+
/**
|
|
99
|
+
* An org's own version imported but not applied (pre-flight F4, ruling P3-12): the live item named
|
|
100
|
+
* `name` owned by `ownerOrgId` (same package) has a version of the release of `p.version` with the
|
|
101
|
+
* same content digest and no extension, other than the platform's version. Uploading it again
|
|
102
|
+
* retries its update instead of `catalog.version_exists`. undefined otherwise.
|
|
103
|
+
*/
|
|
104
|
+
export declare function unappliedOwnVersion(db: KernelSchemaDb, name: string, ownerOrgId: string, p: Pick<ImportIdentity, "packageName" | "version" | "contentDigest">): Promise<{
|
|
105
|
+
itemId: string;
|
|
106
|
+
version: string;
|
|
107
|
+
} | undefined>;
|
|
89
108
|
/** What is being imported, as far as the version conflict rules need it. */
|
|
90
109
|
export interface ImportIdentity {
|
|
91
110
|
packageName: string | null;
|
|
@@ -126,17 +145,34 @@ export declare function precheckCatalogImport(db: KernelSchemaDb, name: string,
|
|
|
126
145
|
}>;
|
|
127
146
|
/**
|
|
128
147
|
* Writes a catalog version in the caller's transaction (`db` is its handle; the caller has
|
|
129
|
-
* re-checked the
|
|
148
|
+
* re-checked the super admin and holds the name's {@link CatalogItemLock}): checks conflicts again (the same source; no version of
|
|
130
149
|
* the release with the same content; `version` not taken meanwhile), creates the item when there is
|
|
131
150
|
* none or adds the version (latest and display fields change only for a newer version, a version
|
|
132
151
|
* equal but for build metadata being newer as the later import), and writes the version row (with
|
|
133
152
|
* its content digest) and the `catalog.imported` audit. Returns the item id.
|
|
134
153
|
*/
|
|
135
|
-
export declare function writeCatalogVersion(db: KernelSchemaDb, w: CatalogVersionWrite): Promise<
|
|
154
|
+
export declare function writeCatalogVersion(db: KernelSchemaDb, w: CatalogVersionWrite): Promise<{
|
|
155
|
+
id: string;
|
|
156
|
+
created: boolean;
|
|
157
|
+
}>;
|
|
158
|
+
/**
|
|
159
|
+
* Records that `version` of the item was applied or confirmed (ruling P3-52), in the caller's
|
|
160
|
+
* transaction: from then on it may serve other orgs and the generic update. Idempotent.
|
|
161
|
+
*/
|
|
162
|
+
export declare function markVersionApplied(db: KernelSchemaDb, itemId: string, version: string): Promise<void>;
|
|
163
|
+
/**
|
|
164
|
+
* Whether a version may serve other orgs, dependency resolution and the generic update (ruling
|
|
165
|
+
* P3-52): applied or confirmed, and never rejected, whoever owns the item now.
|
|
166
|
+
*/
|
|
167
|
+
export declare function versionUsable(v: {
|
|
168
|
+
applied_at: Date | null;
|
|
169
|
+
rejected_at: Date | null;
|
|
170
|
+
}): boolean;
|
|
136
171
|
/**
|
|
137
172
|
* An extension name belongs to the npm package that first installed it (`extension_name_owners`,
|
|
138
173
|
* Ruling P3): when another package owns it, the import is refused right away with
|
|
139
|
-
* `extension.name_conflict` (the same code as at install
|
|
174
|
+
* `extension.name_conflict` (the same code as at install, details `[{ owner }]`: the owner of the
|
|
175
|
+
* package holding it), instead of failing only at deploy time.
|
|
140
176
|
*/
|
|
141
177
|
export declare function assertPluginNameOwner(db: KernelSchemaDb, name: string, packageName: string | null): Promise<void>;
|
|
142
178
|
/** A catalog version as {@link marketplaceLatest} compares it with its marketplace entries. */
|
|
@@ -151,8 +187,10 @@ export interface MarketplaceStatus {
|
|
|
151
187
|
contentChanged: boolean;
|
|
152
188
|
}
|
|
153
189
|
/**
|
|
154
|
-
* For each marketplace-imported item, its marketplace (when enabled): the
|
|
155
|
-
*
|
|
190
|
+
* For each marketplace-imported item, its marketplace (when enabled): the version to update to
|
|
191
|
+
* (the highest compatible, importable, non-deprecated stable version listed, a prerelease only
|
|
192
|
+
* when no such stable version exists, as the market rows fold them), and whether a compatible,
|
|
193
|
+
* non-deprecated entry's content changed at an imported version.
|
|
156
194
|
*/
|
|
157
195
|
export declare function marketplaceLatest(db: KernelSchemaDb, config: KernelConfig, items: {
|
|
158
196
|
id: string;
|
|
@@ -168,6 +206,60 @@ export declare function countInstalls(db: KernelSchemaDb, items: {
|
|
|
168
206
|
version: string;
|
|
169
207
|
extension_sha256: string | null;
|
|
170
208
|
}[]>): Promise<Map<string, number>>;
|
|
209
|
+
/**
|
|
210
|
+
* Every id is a live org (`validation_failed` naming the unknown ones otherwise): the orgs of a
|
|
211
|
+
* `named` scope.
|
|
212
|
+
*/
|
|
213
|
+
export declare function assertOrgsExist(db: KernelSchemaDb, orgs: readonly string[]): Promise<void>;
|
|
214
|
+
/** The scope facts of an item's admin view (see {@link CatalogItemView}). */
|
|
215
|
+
export interface ItemScopeFacts {
|
|
216
|
+
scopeOrgs: string[];
|
|
217
|
+
enabledOrgs: number;
|
|
218
|
+
/** Orgs whose admin switched an `all` item off (0 for other scopes and builtin items). */
|
|
219
|
+
offCount: number;
|
|
220
|
+
pending: boolean;
|
|
221
|
+
/** The digest `confirm` takes (null unless pending and readable). */
|
|
222
|
+
permissionsHash: string | null;
|
|
223
|
+
/** The platform, or the org that owns the item (ruling P3-1). */
|
|
224
|
+
owner: Owner;
|
|
225
|
+
}
|
|
226
|
+
/** The facts of a view that shows none of the scope facts, only the item's owner. */
|
|
227
|
+
export declare function ownerOnlyFacts(owner: Owner): ItemScopeFacts;
|
|
228
|
+
/** What an item with an extension needs confirming (see {@link itemConfirmations}). */
|
|
229
|
+
export type ItemConfirmations = ReadonlyMap<string, {
|
|
230
|
+
pending: boolean;
|
|
231
|
+
permissionsHash: string | null;
|
|
232
|
+
}>;
|
|
233
|
+
/**
|
|
234
|
+
* Per item id: is its extension waiting for a person's confirmation (pending) and the permission
|
|
235
|
+
* digest to confirm. Pending when the extension is not installed on the deployment, when the
|
|
236
|
+
* installed version's permission set is not covered by the stored snapshot, or (a builtin item)
|
|
237
|
+
* when the snapshot is the bootstrap step's, never confirmed by a person. Items whose latest
|
|
238
|
+
* version has no extension are never pending.
|
|
239
|
+
*/
|
|
240
|
+
export declare function itemConfirmations(admin: ExtensionAdmin, items: {
|
|
241
|
+
id: string;
|
|
242
|
+
name: string;
|
|
243
|
+
builtin: boolean;
|
|
244
|
+
latest_version: string;
|
|
245
|
+
owner_org_id: string | null;
|
|
246
|
+
pending_version: string | null;
|
|
247
|
+
}[], versions: ReadonlyMap<string, {
|
|
248
|
+
version: string;
|
|
249
|
+
extension_sha256: string | null;
|
|
250
|
+
}[]>): Promise<ItemConfirmations>;
|
|
251
|
+
/**
|
|
252
|
+
* Per item: the orgs of its `named` list, the orgs it is on in (a live plugin install; every org for
|
|
253
|
+
* a builtin item) and whether it is pending (`confirmations`, see {@link itemConfirmations}).
|
|
254
|
+
*/
|
|
255
|
+
export declare function itemScopeFacts(db: KernelSchemaDb, items: {
|
|
256
|
+
id: string;
|
|
257
|
+
name: string;
|
|
258
|
+
scope: PluginScope;
|
|
259
|
+
builtin: boolean;
|
|
260
|
+
latest_version: string;
|
|
261
|
+
owner_org_id: string | null;
|
|
262
|
+
}[], confirmations: ItemConfirmations): Promise<Map<string, ItemScopeFacts>>;
|
|
171
263
|
export declare function itemView(i: {
|
|
172
264
|
id: string;
|
|
173
265
|
name: string;
|
|
@@ -175,12 +267,24 @@ export declare function itemView(i: {
|
|
|
175
267
|
display_name: LocalizedName | null;
|
|
176
268
|
description: string;
|
|
177
269
|
policy: CatalogPolicy;
|
|
270
|
+
scope: PluginScope;
|
|
271
|
+
builtin: boolean;
|
|
272
|
+
disabled: boolean;
|
|
273
|
+
shown_to_others: boolean;
|
|
178
274
|
latest_version: string;
|
|
179
275
|
marketplace_id?: string | null;
|
|
180
276
|
updated_at: Date;
|
|
277
|
+
shareable: boolean;
|
|
278
|
+
awaiting_confirmation: boolean;
|
|
279
|
+
pending_version: string | null;
|
|
181
280
|
}, versions: {
|
|
182
281
|
version: string;
|
|
183
282
|
source: string;
|
|
184
283
|
imported_at?: Date;
|
|
185
|
-
|
|
284
|
+
/** The version's plugin.json (counted for `componentCounts`; absent: nothing counted). */
|
|
285
|
+
manifest?: unknown;
|
|
286
|
+
source_format?: SourceFormat;
|
|
287
|
+
}[], installs?: number, marketplace?: MarketplaceStatus, facts?: ItemScopeFacts): CatalogItemView;
|
|
288
|
+
/** The components a version's plugin.json brings, by kind (none without a manifest). */
|
|
289
|
+
export declare function componentCountsOf(m: PluginManifest | undefined): ComponentCounts;
|
|
186
290
|
export {};
|
|
@@ -1,10 +1,14 @@
|
|
|
1
|
+
import { pluginDescription } from "@capybara-hq/plugin-sdk";
|
|
1
2
|
import { sql } from "kysely";
|
|
3
|
+
import semver from "semver";
|
|
2
4
|
import { ApiError } from "../errors.js";
|
|
3
5
|
import { enabledExtensionsByOrg } from "../extensions/enabled.js";
|
|
6
|
+
import { blockingKeys } from "../extensions/permission-set.js";
|
|
4
7
|
import { audit } from "../identity/audit.js";
|
|
5
8
|
import { endpointCredentialIssues } from "../tools/endpoint.js";
|
|
6
9
|
import { gitLocationIdentity } from "./git-source.js";
|
|
7
|
-
import { entryCompatible, entryContentChanged, sourceEffective, } from "./marketplaces.service.js";
|
|
10
|
+
import { entryCompatible, entryContentChanged, entryDeprecated, sourceEffective, unimportable, } from "./marketplaces.service.js";
|
|
11
|
+
import { ownerOf, ownersOf, PLATFORM_OWNER, packageOwner, pendingDigest, } from "./ownership.js";
|
|
8
12
|
import { schemaHasPath } from "./schema-path.js";
|
|
9
13
|
import { compareVersions, newestFirst, sameRelease, withBuild } from "./versions.js";
|
|
10
14
|
/**
|
|
@@ -121,6 +125,33 @@ async function itemVersions(db, itemId) {
|
|
|
121
125
|
.where("item_id", "=", itemId)
|
|
122
126
|
.execute();
|
|
123
127
|
}
|
|
128
|
+
/**
|
|
129
|
+
* An org's own version imported but not applied (pre-flight F4, ruling P3-12): the live item named
|
|
130
|
+
* `name` owned by `ownerOrgId` (same package) has a version of the release of `p.version` with the
|
|
131
|
+
* same content digest and no extension, other than the platform's version. Uploading it again
|
|
132
|
+
* retries its update instead of `catalog.version_exists`. undefined otherwise.
|
|
133
|
+
*/
|
|
134
|
+
export async function unappliedOwnVersion(db, name, ownerOrgId, p) {
|
|
135
|
+
const item = await db
|
|
136
|
+
.selectFrom("catalog_items")
|
|
137
|
+
.select(["id", "package_name", "platform_synced_version"])
|
|
138
|
+
.where("name", "=", name)
|
|
139
|
+
.where("deleted_at", "is", null)
|
|
140
|
+
.where("owner_org_id", "=", ownerOrgId)
|
|
141
|
+
.executeTakeFirst();
|
|
142
|
+
if (!item || item.package_name !== p.packageName)
|
|
143
|
+
return undefined;
|
|
144
|
+
const rows = await db
|
|
145
|
+
.selectFrom("catalog_item_versions")
|
|
146
|
+
.select(["version", "content_digest", "extension_sha256"])
|
|
147
|
+
.where("item_id", "=", item.id)
|
|
148
|
+
.where("content_digest", "=", p.contentDigest)
|
|
149
|
+
.execute();
|
|
150
|
+
const same = rows.find((v) => sameRelease(v.version, p.version) &&
|
|
151
|
+
v.extension_sha256 === null &&
|
|
152
|
+
v.version !== item.platform_synced_version);
|
|
153
|
+
return same && { itemId: item.id, version: same.version };
|
|
154
|
+
}
|
|
124
155
|
/** `atConfirm`: found under the lock at confirm (another import committed after the review). */
|
|
125
156
|
const versionExists = (version, sameContent, atConfirm = false) => new ApiError("catalog.version_exists", (sameContent
|
|
126
157
|
? `Version ${version} of this catalog item is already imported with the same content`
|
|
@@ -180,7 +211,7 @@ export async function precheckCatalogImport(db, name, p) {
|
|
|
180
211
|
}
|
|
181
212
|
/**
|
|
182
213
|
* Writes a catalog version in the caller's transaction (`db` is its handle; the caller has
|
|
183
|
-
* re-checked the
|
|
214
|
+
* re-checked the super admin and holds the name's {@link CatalogItemLock}): checks conflicts again (the same source; no version of
|
|
184
215
|
* the release with the same content; `version` not taken meanwhile), creates the item when there is
|
|
185
216
|
* none or adds the version (latest and display fields change only for a newer version, a version
|
|
186
217
|
* equal but for build metadata being newer as the later import), and writes the version row (with
|
|
@@ -191,6 +222,7 @@ export async function writeCatalogVersion(db, w) {
|
|
|
191
222
|
const { name, version, listing } = w;
|
|
192
223
|
const live = await liveItem(t, name);
|
|
193
224
|
let id;
|
|
225
|
+
const created = live === undefined;
|
|
194
226
|
if (live) {
|
|
195
227
|
id = live.id;
|
|
196
228
|
assertSameSource(live, w.packageName, sourceIdentity(w.source.detail, w.marketplaceId));
|
|
@@ -203,7 +235,7 @@ export async function writeCatalogVersion(db, w) {
|
|
|
203
235
|
}, true);
|
|
204
236
|
if (existing.some((v) => v.version === version))
|
|
205
237
|
throw versionExists(version, false, true);
|
|
206
|
-
const newer = compareVersions(version, live.latest_version) >= 0;
|
|
238
|
+
const newer = w.keepLatest !== true && compareVersions(version, live.latest_version) >= 0;
|
|
207
239
|
await t
|
|
208
240
|
.updateTable("catalog_items")
|
|
209
241
|
.set({
|
|
@@ -256,6 +288,8 @@ export async function writeCatalogVersion(db, w) {
|
|
|
256
288
|
translation: w.translation != null ? JSON.stringify(w.translation) : null,
|
|
257
289
|
license_text: w.licenseText ?? null,
|
|
258
290
|
license_truncated: w.licenseTruncated === true,
|
|
291
|
+
// an org's version is usable only once applied or confirmed (ruling P3-52)
|
|
292
|
+
...(w.keepLatest === true && { applied_at: null }),
|
|
259
293
|
})
|
|
260
294
|
.execute();
|
|
261
295
|
await audit(t, {
|
|
@@ -275,12 +309,33 @@ export async function writeCatalogVersion(db, w) {
|
|
|
275
309
|
...w.auditDetail,
|
|
276
310
|
},
|
|
277
311
|
});
|
|
278
|
-
return id;
|
|
312
|
+
return { id, created };
|
|
313
|
+
}
|
|
314
|
+
/**
|
|
315
|
+
* Records that `version` of the item was applied or confirmed (ruling P3-52), in the caller's
|
|
316
|
+
* transaction: from then on it may serve other orgs and the generic update. Idempotent.
|
|
317
|
+
*/
|
|
318
|
+
export async function markVersionApplied(db, itemId, version) {
|
|
319
|
+
await db
|
|
320
|
+
.updateTable("catalog_item_versions")
|
|
321
|
+
.set({ applied_at: sql `now()` })
|
|
322
|
+
.where("item_id", "=", itemId)
|
|
323
|
+
.where("version", "=", version)
|
|
324
|
+
.where("applied_at", "is", null)
|
|
325
|
+
.execute();
|
|
326
|
+
}
|
|
327
|
+
/**
|
|
328
|
+
* Whether a version may serve other orgs, dependency resolution and the generic update (ruling
|
|
329
|
+
* P3-52): applied or confirmed, and never rejected, whoever owns the item now.
|
|
330
|
+
*/
|
|
331
|
+
export function versionUsable(v) {
|
|
332
|
+
return v.applied_at !== null && v.rejected_at === null;
|
|
279
333
|
}
|
|
280
334
|
/**
|
|
281
335
|
* An extension name belongs to the npm package that first installed it (`extension_name_owners`,
|
|
282
336
|
* Ruling P3): when another package owns it, the import is refused right away with
|
|
283
|
-
* `extension.name_conflict` (the same code as at install
|
|
337
|
+
* `extension.name_conflict` (the same code as at install, details `[{ owner }]`: the owner of the
|
|
338
|
+
* package holding it), instead of failing only at deploy time.
|
|
284
339
|
*/
|
|
285
340
|
export async function assertPluginNameOwner(db, name, packageName) {
|
|
286
341
|
const owner = await db
|
|
@@ -289,7 +344,9 @@ export async function assertPluginNameOwner(db, name, packageName) {
|
|
|
289
344
|
.where("name", "=", name)
|
|
290
345
|
.executeTakeFirst();
|
|
291
346
|
if (owner && owner.package_name !== packageName) {
|
|
292
|
-
throw new ApiError("extension.name_conflict", `Extension name ${name} belongs to package ${owner.package_name}; ${packageLabel(packageName)} cannot use it
|
|
347
|
+
throw new ApiError("extension.name_conflict", `Extension name ${name} belongs to package ${owner.package_name}; ${packageLabel(packageName)} cannot use it`,
|
|
348
|
+
// who holds it (package -> item -> owner, ruling P3-14)
|
|
349
|
+
[{ owner: await packageOwner(db, owner.package_name, name) }]);
|
|
293
350
|
}
|
|
294
351
|
}
|
|
295
352
|
/** "package <name>", or what a plugin without package.json is called in messages. */
|
|
@@ -310,8 +367,10 @@ function assertSameSource(item, packageName, source) {
|
|
|
310
367
|
}
|
|
311
368
|
}
|
|
312
369
|
/**
|
|
313
|
-
* For each marketplace-imported item, its marketplace (when enabled): the
|
|
314
|
-
*
|
|
370
|
+
* For each marketplace-imported item, its marketplace (when enabled): the version to update to
|
|
371
|
+
* (the highest compatible, importable, non-deprecated stable version listed, a prerelease only
|
|
372
|
+
* when no such stable version exists, as the market rows fold them), and whether a compatible,
|
|
373
|
+
* non-deprecated entry's content changed at an imported version.
|
|
315
374
|
*/
|
|
316
375
|
export async function marketplaceLatest(db, config, items, versions) {
|
|
317
376
|
const out = new Map();
|
|
@@ -331,6 +390,7 @@ export async function marketplaceLatest(db, config, items, versions) {
|
|
|
331
390
|
"s.builtin",
|
|
332
391
|
"s.enabled",
|
|
333
392
|
"s.url",
|
|
393
|
+
"s.form",
|
|
334
394
|
"s.last_commit",
|
|
335
395
|
])
|
|
336
396
|
.where("e.source_id", "in", [...new Set(sourced.map((i) => i.marketplace_id))])
|
|
@@ -340,11 +400,17 @@ export async function marketplaceLatest(db, config, items, versions) {
|
|
|
340
400
|
const listed = rows.filter((r) => r.source_id === i.marketplace_id &&
|
|
341
401
|
r.name === i.name &&
|
|
342
402
|
sourceEffective(r, config) &&
|
|
343
|
-
entryCompatible(r.entry)
|
|
344
|
-
|
|
345
|
-
|
|
403
|
+
entryCompatible(r.entry) &&
|
|
404
|
+
// a deprecated version is never the one to update to, nor content to import again
|
|
405
|
+
!entryDeprecated(r.entry));
|
|
406
|
+
// As the market rows fold them: the newest importable stable version, a prerelease only when
|
|
407
|
+
// no stable one can be imported
|
|
408
|
+
const importable = listed
|
|
409
|
+
.filter((r) => r.version !== "" &&
|
|
410
|
+
unimportable(r.entry, r.form, config) === undefined)
|
|
346
411
|
.map((r) => r.version)
|
|
347
412
|
.sort(newestFirst);
|
|
413
|
+
const best = importable.find((v) => semver.prerelease(v) === null) ?? importable[0];
|
|
348
414
|
const recorded = versions.get(i.id) ?? [];
|
|
349
415
|
out.set(i.id, {
|
|
350
416
|
latest: best ?? null,
|
|
@@ -386,25 +452,225 @@ export async function countInstalls(db, items, versions) {
|
|
|
386
452
|
}
|
|
387
453
|
return new Map([...orgs].map(([id, set]) => [id, set.size]));
|
|
388
454
|
}
|
|
389
|
-
|
|
455
|
+
/**
|
|
456
|
+
* Every id is a live org (`validation_failed` naming the unknown ones otherwise): the orgs of a
|
|
457
|
+
* `named` scope.
|
|
458
|
+
*/
|
|
459
|
+
export async function assertOrgsExist(db, orgs) {
|
|
460
|
+
if (orgs.length === 0)
|
|
461
|
+
return;
|
|
462
|
+
const found = await db
|
|
463
|
+
.selectFrom("orgs")
|
|
464
|
+
.select("id")
|
|
465
|
+
.where("id", "in", [...orgs])
|
|
466
|
+
.where("deleted_at", "is", null)
|
|
467
|
+
.execute();
|
|
468
|
+
const known = new Set(found.map((o) => o.id));
|
|
469
|
+
const unknown = orgs.filter((o) => !known.has(o));
|
|
470
|
+
if (unknown.length > 0) {
|
|
471
|
+
throw new ApiError("validation_failed", `orgs: unknown organizations ${unknown.join(", ")}`, [
|
|
472
|
+
{ path: "orgs", message: `unknown organizations: ${unknown.join(", ")}` },
|
|
473
|
+
]);
|
|
474
|
+
}
|
|
475
|
+
}
|
|
476
|
+
/** The facts of a view that shows none of the scope facts, only the item's owner. */
|
|
477
|
+
export function ownerOnlyFacts(owner) {
|
|
478
|
+
return {
|
|
479
|
+
scopeOrgs: [],
|
|
480
|
+
enabledOrgs: 0,
|
|
481
|
+
offCount: 0,
|
|
482
|
+
pending: false,
|
|
483
|
+
permissionsHash: null,
|
|
484
|
+
owner,
|
|
485
|
+
};
|
|
486
|
+
}
|
|
487
|
+
const NO_FACTS = ownerOnlyFacts(PLATFORM_OWNER);
|
|
488
|
+
/**
|
|
489
|
+
* Per item id: is its extension waiting for a person's confirmation (pending) and the permission
|
|
490
|
+
* digest to confirm. Pending when the extension is not installed on the deployment, when the
|
|
491
|
+
* installed version's permission set is not covered by the stored snapshot, or (a builtin item)
|
|
492
|
+
* when the snapshot is the bootstrap step's, never confirmed by a person. Items whose latest
|
|
493
|
+
* version has no extension are never pending.
|
|
494
|
+
*/
|
|
495
|
+
export async function itemConfirmations(admin, items, versions) {
|
|
496
|
+
const out = new Map();
|
|
497
|
+
// An org-owned item waits only while an upload of it does (rulings P3-9, P3-10): the digest of
|
|
498
|
+
// that version's package (P3-11); nothing else of an org's item is the super admin's to confirm
|
|
499
|
+
for (const i of items) {
|
|
500
|
+
if (i.owner_org_id === null)
|
|
501
|
+
continue;
|
|
502
|
+
const sha = i.pending_version === null
|
|
503
|
+
? null
|
|
504
|
+
: ((versions.get(i.id) ?? []).find((v) => v.version === i.pending_version)
|
|
505
|
+
?.extension_sha256 ?? null);
|
|
506
|
+
if (sha === null) {
|
|
507
|
+
out.set(i.id, { pending: false, permissionsHash: null });
|
|
508
|
+
continue;
|
|
509
|
+
}
|
|
510
|
+
const hash = await admin.packageReviewHash(sha);
|
|
511
|
+
out.set(i.id, {
|
|
512
|
+
pending: true,
|
|
513
|
+
permissionsHash: hash === null ? null : pendingDigest(sha, hash),
|
|
514
|
+
});
|
|
515
|
+
}
|
|
516
|
+
const withExtension = items.flatMap((i) => {
|
|
517
|
+
if (i.owner_org_id !== null)
|
|
518
|
+
return [];
|
|
519
|
+
const sha = (versions.get(i.id) ?? []).find((v) => v.version === i.latest_version)?.extension_sha256 ??
|
|
520
|
+
null;
|
|
521
|
+
return sha === null ? [] : [{ item: i, sha }];
|
|
522
|
+
});
|
|
523
|
+
if (withExtension.length === 0)
|
|
524
|
+
return out;
|
|
525
|
+
// only these items' extensions: reading every installed package would also log each one that
|
|
526
|
+
// cannot be read right now (the bootstrap step confirms before the object store is loaded)
|
|
527
|
+
const names = new Set(withExtension.map((w) => w.item.name));
|
|
528
|
+
const installed = new Map((await admin.list(names)).map((v) => [v.name, v]));
|
|
529
|
+
for (const { item, sha } of withExtension) {
|
|
530
|
+
const v = installed.get(item.name);
|
|
531
|
+
if (!v) {
|
|
532
|
+
out.set(item.id, { pending: true, permissionsHash: await admin.packageReviewHash(sha) });
|
|
533
|
+
continue;
|
|
534
|
+
}
|
|
535
|
+
const pending = v.snapshot === null ||
|
|
536
|
+
blockingKeys(v.added).length > 0 ||
|
|
537
|
+
(item.builtin && v.snapshot.source === "bootstrap");
|
|
538
|
+
out.set(item.id, {
|
|
539
|
+
pending,
|
|
540
|
+
permissionsHash: pending && v.error === undefined ? v.reviewHash : null,
|
|
541
|
+
});
|
|
542
|
+
}
|
|
543
|
+
return out;
|
|
544
|
+
}
|
|
545
|
+
const LIVE_INSTALL = ["installing", "installed", "upgrading"];
|
|
546
|
+
/**
|
|
547
|
+
* Per item: the orgs of its `named` list, the orgs it is on in (a live plugin install; every org for
|
|
548
|
+
* a builtin item) and whether it is pending (`confirmations`, see {@link itemConfirmations}).
|
|
549
|
+
*/
|
|
550
|
+
export async function itemScopeFacts(db, items, confirmations) {
|
|
551
|
+
const owners = await ownersOf(db, items.flatMap((i) => (i.owner_org_id === null ? [] : [i.owner_org_id])));
|
|
552
|
+
const out = new Map(items.map((i) => [
|
|
553
|
+
i.id,
|
|
554
|
+
{
|
|
555
|
+
scopeOrgs: [],
|
|
556
|
+
enabledOrgs: 0,
|
|
557
|
+
offCount: 0,
|
|
558
|
+
pending: confirmations.get(i.id)?.pending ?? false,
|
|
559
|
+
permissionsHash: confirmations.get(i.id)?.permissionsHash ?? null,
|
|
560
|
+
owner: ownerOf(i.owner_org_id, owners),
|
|
561
|
+
},
|
|
562
|
+
]));
|
|
563
|
+
if (items.length === 0)
|
|
564
|
+
return out;
|
|
565
|
+
const ids = items.map((i) => i.id);
|
|
566
|
+
// one after the other: `db` may be a transaction's single connection
|
|
567
|
+
const listed = await db
|
|
568
|
+
.selectFrom("catalog_item_scope_orgs")
|
|
569
|
+
.select(["item_id", "org_id"])
|
|
570
|
+
.where("item_id", "in", ids)
|
|
571
|
+
.orderBy("org_id")
|
|
572
|
+
.execute();
|
|
573
|
+
for (const r of listed)
|
|
574
|
+
out.get(r.item_id)?.scopeOrgs.push(r.org_id);
|
|
575
|
+
const live = await db
|
|
576
|
+
.selectFrom("plugin_installs as a")
|
|
577
|
+
.innerJoin("orgs as o", "o.id", "a.org_id")
|
|
578
|
+
.select(["a.item_id", (eb) => eb.fn.count("a.org_id").distinct().as("n")])
|
|
579
|
+
.where("a.item_id", "in", ids)
|
|
580
|
+
.where("a.status", "in", [...LIVE_INSTALL])
|
|
581
|
+
.where("o.deleted_at", "is", null)
|
|
582
|
+
.groupBy("a.item_id")
|
|
583
|
+
.execute();
|
|
584
|
+
for (const r of live) {
|
|
585
|
+
const f = out.get(r.item_id);
|
|
586
|
+
if (f)
|
|
587
|
+
f.enabledOrgs = Number(r.n);
|
|
588
|
+
}
|
|
589
|
+
// the orgs that switched an `all` item off (layering spec §4): one grouped count for the page
|
|
590
|
+
const everywhere = items.filter((i) => i.scope === "all" && !i.builtin).map((i) => i.id);
|
|
591
|
+
if (everywhere.length > 0) {
|
|
592
|
+
const off = await db
|
|
593
|
+
.selectFrom("catalog_item_org_switches as s")
|
|
594
|
+
.innerJoin("orgs as o", "o.id", "s.org_id")
|
|
595
|
+
.select(["s.item_id", (eb) => eb.fn.countAll().as("n")])
|
|
596
|
+
.where("s.item_id", "in", everywhere)
|
|
597
|
+
.where("s.enabled", "=", false)
|
|
598
|
+
.where("o.deleted_at", "is", null)
|
|
599
|
+
.groupBy("s.item_id")
|
|
600
|
+
.execute();
|
|
601
|
+
for (const r of off) {
|
|
602
|
+
const f = out.get(r.item_id);
|
|
603
|
+
if (f)
|
|
604
|
+
f.offCount = Number(r.n);
|
|
605
|
+
}
|
|
606
|
+
}
|
|
607
|
+
if (items.some((i) => i.builtin)) {
|
|
608
|
+
const orgs = await db
|
|
609
|
+
.selectFrom("orgs")
|
|
610
|
+
.select((eb) => eb.fn.countAll().as("n"))
|
|
611
|
+
.where("deleted_at", "is", null)
|
|
612
|
+
.executeTakeFirstOrThrow();
|
|
613
|
+
for (const i of items) {
|
|
614
|
+
const f = out.get(i.id);
|
|
615
|
+
if (i.builtin && f)
|
|
616
|
+
f.enabledOrgs = Number(orgs.n);
|
|
617
|
+
}
|
|
618
|
+
}
|
|
619
|
+
return out;
|
|
620
|
+
}
|
|
621
|
+
/** The `zh` text of a stored manifest's description; null without one (or an unreadable manifest). */
|
|
622
|
+
function descriptionZhOf(manifest) {
|
|
623
|
+
const d = manifest?.description;
|
|
624
|
+
if (typeof d !== "object" || d === null)
|
|
625
|
+
return null;
|
|
626
|
+
const zh = pluginDescription(d).zh;
|
|
627
|
+
return typeof zh === "string" ? zh : null;
|
|
628
|
+
}
|
|
629
|
+
export function itemView(i, versions, installs = 0, marketplace = { latest: null, contentChanged: false }, facts = NO_FACTS) {
|
|
390
630
|
const sorted = [...versions].sort((a, b) => newestFirst({ version: a.version, importedAt: a.imported_at ?? null }, { version: b.version, importedAt: b.imported_at ?? null }));
|
|
391
631
|
const top = sorted[0]?.version ?? i.latest_version;
|
|
392
632
|
const latestMarketplaceVersion = marketplace.latest;
|
|
633
|
+
const current = versions.find((v) => v.version === i.latest_version);
|
|
393
634
|
return {
|
|
394
635
|
id: i.id,
|
|
395
636
|
name: i.name,
|
|
396
637
|
publisher: i.publisher,
|
|
397
638
|
displayName: i.display_name,
|
|
398
639
|
description: i.description,
|
|
640
|
+
descriptionZh: descriptionZhOf(current?.manifest),
|
|
399
641
|
policy: i.policy,
|
|
642
|
+
scope: i.builtin ? "all" : i.scope,
|
|
643
|
+
scopeOrgs: [...facts.scopeOrgs],
|
|
644
|
+
builtin: i.builtin,
|
|
645
|
+
disabled: i.disabled,
|
|
646
|
+
shownToOthers: i.shown_to_others,
|
|
647
|
+
owner: facts.owner,
|
|
648
|
+
shareable: i.shareable,
|
|
649
|
+
awaitingConfirmation: i.awaiting_confirmation,
|
|
650
|
+
pendingVersion: i.pending_version,
|
|
651
|
+
enabledOrgs: facts.enabledOrgs,
|
|
652
|
+
offCount: facts.offCount,
|
|
653
|
+
pending: facts.pending,
|
|
654
|
+
permissionsHash: facts.permissionsHash,
|
|
400
655
|
latestVersion: i.latest_version,
|
|
401
656
|
versions: sorted.map((v) => v.version),
|
|
402
657
|
installs,
|
|
403
|
-
source:
|
|
658
|
+
source: current?.source ?? "file",
|
|
404
659
|
marketplaceId: i.marketplace_id ?? null,
|
|
405
660
|
latestMarketplaceVersion,
|
|
406
661
|
newerInMarketplace: latestMarketplaceVersion !== null && compareVersions(latestMarketplaceVersion, top) > 0,
|
|
407
662
|
contentChanged: marketplace.contentChanged,
|
|
663
|
+
componentCounts: componentCountsOf(current?.manifest),
|
|
664
|
+
sourceFormat: current?.source_format ?? "capybara",
|
|
408
665
|
updatedAt: i.updated_at.toISOString(),
|
|
409
666
|
};
|
|
410
667
|
}
|
|
668
|
+
/** The components a version's plugin.json brings, by kind (none without a manifest). */
|
|
669
|
+
export function componentCountsOf(m) {
|
|
670
|
+
return {
|
|
671
|
+
extension: m?.extension === undefined ? 0 : 1,
|
|
672
|
+
skills: m?.skills?.length ?? 0,
|
|
673
|
+
connectorTemplates: m?.connectorTemplates?.length ?? 0,
|
|
674
|
+
agentTemplates: m?.agents?.length ?? 0,
|
|
675
|
+
};
|
|
676
|
+
}
|