@capybara-hq/kernel 0.1.0-rc.4 → 0.1.0-rc.6
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 +51 -14
- package/dist/admin/admin.controller.js +60 -19
- package/dist/admin/extensions.controller.d.ts +16 -2
- package/dist/admin/extensions.controller.js +26 -6
- 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 +16 -0
- package/dist/agents/agent-lookup.js +11 -0
- package/dist/agents/agents.controller.d.ts +76 -1
- package/dist/agents/agents.controller.js +90 -11
- package/dist/agents/agents.module.d.ts +4 -1
- package/dist/agents/agents.module.js +32 -6
- package/dist/agents/agents.service.d.ts +54 -23
- package/dist/agents/agents.service.js +180 -76
- package/dist/agents/definition.d.ts +49 -0
- package/dist/agents/definition.js +45 -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/models.controller.d.ts +34 -5
- package/dist/agents/models.controller.js +50 -6
- 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/readiness.controller.d.ts +5 -5
- package/dist/agents/readiness.controller.js +6 -6
- 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 +475 -52
- package/dist/background/background.module.js +8 -1
- package/dist/background/finish.d.ts +3 -2
- package/dist/background/launch-lock.d.ts +4 -3
- package/dist/background/launch-lock.js +4 -3
- package/dist/background/poll.job.d.ts +9 -6
- package/dist/background/poll.job.js +30 -22
- package/dist/background/session.d.ts +13 -2
- package/dist/background/session.js +13 -0
- package/dist/background/stop.d.ts +12 -6
- package/dist/background/stop.js +57 -39
- package/dist/background/store.d.ts +18 -6
- package/dist/background/store.js +12 -6
- package/dist/background/tasks.service.d.ts +15 -5
- package/dist/background/tasks.service.js +42 -17
- package/dist/background/wake-rules.d.ts +27 -18
- package/dist/background/wake-rules.js +52 -22
- package/dist/background/wake.d.ts +13 -11
- package/dist/background/wake.js +20 -14
- 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/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 +622 -82
- 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 +1147 -1136
- 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 +20 -2
- package/dist/channels/channels.module.js +2 -0
- 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/config/docs.js +3 -1
- package/dist/config/schema.d.ts +10 -2
- package/dist/config/schema.js +70 -22
- package/dist/conversations/access.d.ts +6 -4
- package/dist/conversations/access.js +27 -5
- package/dist/conversations/agent-tree.d.ts +46 -0
- package/dist/conversations/agent-tree.js +92 -0
- package/dist/conversations/conversations.controller.d.ts +43 -18
- package/dist/conversations/conversations.controller.js +79 -38
- package/dist/conversations/conversations.module.d.ts +1 -1
- package/dist/conversations/conversations.module.js +7 -7
- package/dist/conversations/conversations.service.d.ts +73 -15
- package/dist/conversations/conversations.service.js +115 -35
- package/dist/conversations/environment-status.d.ts +24 -0
- package/dist/conversations/environment-status.js +71 -0
- package/dist/conversations/event-log.d.ts +20 -5
- package/dist/conversations/event-log.js +60 -0
- package/dist/conversations/events.d.ts +84 -2
- package/dist/conversations/events.js +91 -17
- package/dist/conversations/queue.service.d.ts +1 -1
- package/dist/conversations/queue.service.js +5 -0
- package/dist/conversations/titles.d.ts +5 -3
- package/dist/conversations/titles.js +21 -8
- package/dist/conversations/tree.d.ts +17 -0
- package/dist/conversations/tree.js +42 -0
- package/dist/ctx/create-ctx.d.ts +20 -1
- package/dist/ctx/create-ctx.js +38 -7
- package/dist/db/kernel-schema.d.ts +386 -18
- 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 +85 -2
- package/dist/errors.js +85 -2
- package/dist/evals/reconstruct.d.ts +18 -9
- package/dist/evals/reconstruct.js +26 -7
- package/dist/evals/run-replay.d.ts +4 -2
- package/dist/evals/run-replay.js +20 -6
- package/dist/evals/runs.service.d.ts +2 -1
- package/dist/evals/runs.service.js +13 -12
- package/dist/evals/step-replay.d.ts +4 -6
- package/dist/evals/step-replay.js +4 -3
- 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 +65 -42
- package/dist/extensions/admin-view.d.ts +37 -10
- package/dist/extensions/admin-view.js +103 -20
- 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-hash.d.ts +10 -0
- package/dist/extensions/config-hash.js +38 -0
- package/dist/extensions/deployment-config.d.ts +28 -5
- package/dist/extensions/deployment-config.js +48 -7
- package/dist/extensions/effective-config.d.ts +127 -0
- package/dist/extensions/effective-config.js +368 -0
- package/dist/extensions/extensions.module.js +11 -11
- package/dist/extensions/hooks.d.ts +37 -4
- package/dist/extensions/hooks.js +82 -16
- package/dist/extensions/host.d.ts +24 -10
- package/dist/extensions/host.js +49 -54
- package/dist/extensions/installs.d.ts +20 -8
- package/dist/extensions/installs.js +37 -15
- package/dist/extensions/org-config.d.ts +75 -6
- package/dist/extensions/org-config.js +184 -32
- 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/permission-view.d.ts +16 -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.d.ts +12 -5
- package/dist/extensions/point-defaults.js +37 -9
- package/dist/extensions/resolve.d.ts +5 -1
- package/dist/extensions/resolve.js +15 -2
- package/dist/extensions/state.module.d.ts +9 -0
- package/dist/extensions/state.module.js +38 -0
- package/dist/files/previewers.d.ts +8 -1
- package/dist/files/previewers.js +35 -6
- package/dist/http/api.module.js +25 -3
- package/dist/http/app.d.ts +11 -2
- package/dist/http/app.js +31 -5
- package/dist/http/plugin-dispatch.d.ts +4 -1
- package/dist/http/plugin-dispatch.js +14 -2
- 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.guard.d.ts +13 -5
- package/dist/identity/auth.guard.js +26 -9
- package/dist/identity/identity.module.d.ts +1 -1
- package/dist/identity/identity.module.js +4 -4
- package/dist/identity/me.controller.js +1 -1
- package/dist/identity/principal.d.ts +3 -3
- package/dist/identity/principal.js +3 -3
- 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 +1 -1
- package/dist/index.js +1 -1
- package/dist/infra/cli/kernel-cli.module.js +9 -1
- package/dist/infra/config/kernel-config.service.js +24 -1
- 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/queue/add-job-once.d.ts +14 -0
- package/dist/infra/queue/add-job-once.js +16 -0
- 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/models/embeddings.d.ts +82 -0
- package/dist/models/embeddings.js +326 -0
- package/dist/models/enablement.controller.d.ts +40 -0
- package/dist/models/enablement.controller.js +74 -0
- package/dist/models/enablement.d.ts +99 -0
- package/dist/models/enablement.js +263 -0
- package/dist/models/models.module.d.ts +5 -1
- package/dist/models/models.module.js +16 -4
- 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 +37 -12
- package/dist/models/purposes.js +63 -17
- package/dist/orgs/directory-sync.d.ts +14 -5
- package/dist/orgs/directory-sync.js +41 -17
- package/dist/orgs/offboarding.d.ts +9 -7
- package/dist/orgs/offboarding.js +28 -17
- 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 +15 -3
- package/dist/orgs/settings.service.js +6 -2
- 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 +1405 -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 +9 -1
- package/dist/runtime/context/build.d.ts +6 -4
- package/dist/runtime/context/build.js +26 -7
- package/dist/runtime/context/claude-tools.d.ts +2 -1
- package/dist/runtime/context/claude-tools.js +5 -4
- package/dist/runtime/context/compaction.js +9 -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.d.ts +8 -1
- package/dist/runtime/hook-calls.js +40 -7
- package/dist/runtime/langgraph-loop.d.ts +3 -1
- package/dist/runtime/langgraph-loop.js +35 -17
- package/dist/runtime/loop.d.ts +32 -4
- package/dist/runtime/maintenance.d.ts +7 -4
- package/dist/runtime/maintenance.js +23 -8
- package/dist/runtime/model-call.d.ts +38 -11
- package/dist/runtime/model-call.js +97 -24
- package/dist/runtime/providers.d.ts +146 -32
- package/dist/runtime/providers.js +321 -67
- 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 +37 -3
- package/dist/runtime/run-queue.js +188 -11
- package/dist/runtime/run-worker.d.ts +12 -6
- package/dist/runtime/run-worker.js +58 -35
- package/dist/runtime/runtime.module.js +3 -0
- package/dist/runtime/step-log.d.ts +9 -4
- package/dist/runtime/step-log.js +8 -5
- 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 +46 -32
- 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-jobs.d.ts +88 -0
- package/dist/runtime/usage-report-jobs.js +158 -0
- package/dist/runtime/usage-report.d.ts +33 -38
- package/dist/runtime/usage-report.js +169 -96
- package/dist/runtime/waits.d.ts +140 -37
- package/dist/runtime/waits.js +394 -106
- 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 +4 -3
- package/dist/sandbox/sandbox.service.d.ts +229 -134
- package/dist/sandbox/sandbox.service.js +630 -409
- 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 +23 -4
- package/dist/tools/builtin-names.d.ts +21 -5
- package/dist/tools/builtin-names.js +30 -5
- 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 +6 -2
- package/dist/tools/builtins/builtin-tools.js +37 -12
- 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.js +13 -3
- package/dist/tools/builtins/sandbox/common.d.ts +43 -24
- package/dist/tools/builtins/sandbox/common.js +80 -45
- 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 +1 -1
- package/dist/tools/builtins/sandbox/index.js +1 -1
- package/dist/tools/builtins/sandbox/read.js +1 -1
- package/dist/tools/builtins/sandbox/task-output.d.ts +14 -3
- package/dist/tools/builtins/sandbox/task-output.js +30 -5
- package/dist/tools/builtins/sandbox/task-stop.js +2 -1
- 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/extract.js +5 -1
- package/dist/tools/builtins/web/fetch.js +1 -0
- package/dist/tools/builtins/web/search.js +1 -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/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 +193 -364
- package/dist/tools/policy.d.ts +1 -1
- package/dist/tools/policy.js +36 -16
- package/dist/tools/registry.d.ts +98 -5
- package/dist/tools/registry.js +87 -9
- package/dist/tools/tools.module.js +12 -2
- package/dist/ui/views.d.ts +2 -1
- package/dist/ui/views.js +17 -3
- package/package.json +3 -3
- 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/src/migrations/0089_model_kinds_usage.sql +38 -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 -32
- package/dist/extensions/org-config.controller.js +0 -70
|
@@ -14,13 +14,14 @@ import semver from "semver";
|
|
|
14
14
|
import { pluginSchemaName } from "../ctx/create-ctx.js";
|
|
15
15
|
import { ApiError } from "../errors.js";
|
|
16
16
|
import { audit } from "../identity/audit.js";
|
|
17
|
-
import {
|
|
17
|
+
import { SuperAdminLock } from "../identity/super-admin.js";
|
|
18
18
|
import { KernelConfigService } from "../infra/config/kernel-config.service.js";
|
|
19
19
|
import { afterCommit } from "../infra/database/after-commit.js";
|
|
20
20
|
import { KernelDb } from "../infra/database/kernel-db.js";
|
|
21
21
|
import { TransactionHost } from "../infra/database/transaction-host.js";
|
|
22
22
|
import { Transactional } from "../infra/database/transactional.decorator.js";
|
|
23
23
|
import { KERNEL_BUS, KERNEL_LOGGER } from "../infra/tokens.js";
|
|
24
|
+
import { OrgLock } from "../orgs/org-lock.js";
|
|
24
25
|
import { ExtensionAdmin } from "./admin-view.js";
|
|
25
26
|
import { ExtensionBlobs } from "./blobs.js";
|
|
26
27
|
import { ExtensionLifecycle, PLUGINS_CHANGED_TOPIC } from "./lifecycle.js";
|
|
@@ -28,19 +29,11 @@ import { PluginInstallLock } from "./locks.js";
|
|
|
28
29
|
import { unrunMigrations } from "./migrate-lock.js";
|
|
29
30
|
import { ExtensionPackageError, extensionPackageApiError, readExtensionPackage, } from "./package.js";
|
|
30
31
|
import { ExtensionRegistry } from "./registry.js";
|
|
31
|
-
/**
|
|
32
|
-
* Deployment-level extension install / enable / disable / uninstall (C16 / D15): writes only the PG
|
|
33
|
-
* desired state (`extension_installs`) and the audit, then publishes `kernel.plugins.changed` after
|
|
34
|
-
* the commit (a failure only warns; the periodic reconcile catches up); replicas converge through
|
|
35
|
-
* reconcile, no restart. It does not wait for replicas: the returned view may say `converging`.
|
|
36
|
-
* Stateless, shared by every replica; the CLI uses it too (`actor` is null).
|
|
37
|
-
* Every write runs in a transaction: first `lockEnterpriseAdminsAndAuthorize` (skipped by the CLI),
|
|
38
|
-
* then an advisory lock by extension name and a lock on the install record row.
|
|
39
|
-
*/
|
|
40
32
|
let ExtensionAdminOps = class ExtensionAdminOps {
|
|
41
33
|
kdb;
|
|
42
34
|
txHost;
|
|
43
35
|
adminLock;
|
|
36
|
+
orgLock;
|
|
44
37
|
installLock;
|
|
45
38
|
admin;
|
|
46
39
|
registry;
|
|
@@ -50,8 +43,10 @@ let ExtensionAdminOps = class ExtensionAdminOps {
|
|
|
50
43
|
lifecycle;
|
|
51
44
|
log;
|
|
52
45
|
constructor(kdb, txHost,
|
|
53
|
-
/** The
|
|
54
|
-
adminLock,
|
|
46
|
+
/** The super admin lock (identity/super-admin.ts): joins the transaction. */
|
|
47
|
+
adminLock,
|
|
48
|
+
/** The owner org's lock: an owner's operation re-checks its admin under it. */
|
|
49
|
+
orgLock, installLock,
|
|
55
50
|
/**
|
|
56
51
|
* The admin view after the operation, degraded when the package cannot be read
|
|
57
52
|
* (`get(name, { allowUnreadable: true })`). If it throws, the operation has already committed:
|
|
@@ -73,6 +68,7 @@ let ExtensionAdminOps = class ExtensionAdminOps {
|
|
|
73
68
|
this.kdb = kdb;
|
|
74
69
|
this.txHost = txHost;
|
|
75
70
|
this.adminLock = adminLock;
|
|
71
|
+
this.orgLock = orgLock;
|
|
76
72
|
this.installLock = installLock;
|
|
77
73
|
this.admin = admin;
|
|
78
74
|
this.registry = registry;
|
|
@@ -89,7 +85,7 @@ let ExtensionAdminOps = class ExtensionAdminOps {
|
|
|
89
85
|
* New install or version change (upgrade / downgrade): the install record points at package
|
|
90
86
|
* `sha256`; the desired state is unchanged (a new install is disabled). Audit `extension.installed`.
|
|
91
87
|
* - Config-declared -> `extension.config_declared`; a required bootstrap plugin may be
|
|
92
|
-
* installed at another version (
|
|
88
|
+
* installed at another version (a super admin upgrades it; `required` is kept);
|
|
93
89
|
* - package not in the package store -> `extension.package_not_found`; the extension name in the
|
|
94
90
|
* package is not `name` -> `extension.name_mismatch`;
|
|
95
91
|
* - an install record of the same name exists but comes from another npm package ->
|
|
@@ -105,7 +101,7 @@ let ExtensionAdminOps = class ExtensionAdminOps {
|
|
|
105
101
|
* go back to a version whose migrations are a subset of those already run).
|
|
106
102
|
* Already pointing at the same package: nothing changes (no audit; for a changed source item only,
|
|
107
103
|
* see below).
|
|
108
|
-
* `opts.catalogItemId`: the source item when installing through the
|
|
104
|
+
* `opts.catalogItemId`: the source item when installing through the platform catalog, stored
|
|
109
105
|
* in `extension_installs.catalog_item_id` (F-AA) and registered in `extension_catalog_sources`;
|
|
110
106
|
* installing outside the catalog (upload / npm / CLI) **keeps** the existing source items (T26
|
|
111
107
|
* fix: clearing them would let org enablement bypass catalog policy, C22). The detail of the
|
|
@@ -140,8 +136,7 @@ let ExtensionAdminOps = class ExtensionAdminOps {
|
|
|
140
136
|
}
|
|
141
137
|
async writeInstall(name, sha256, pkg, target, actor, actorTokenId, opts) {
|
|
142
138
|
const db = this.db;
|
|
143
|
-
|
|
144
|
-
await this.adminLock.lockAndAuthorize(actor);
|
|
139
|
+
await this.authorize(actor, opts.owner);
|
|
145
140
|
const row = await this.lockRow(name);
|
|
146
141
|
// 不经目录重装时保留原来的来源条目(不清空,C22)
|
|
147
142
|
const catalogItemId = opts.catalogItemId ?? row?.catalog_item_id ?? null;
|
|
@@ -221,13 +216,14 @@ let ExtensionAdminOps = class ExtensionAdminOps {
|
|
|
221
216
|
.execute();
|
|
222
217
|
await this.audit(actor, actorTokenId, "extension.installed", name, pkg.version, sha256, {
|
|
223
218
|
catalogItemId,
|
|
219
|
+
...ownerDetail(opts.owner),
|
|
224
220
|
});
|
|
225
221
|
afterCommit(() => this.notify(name));
|
|
226
222
|
return { changed: true, state: row?.desired_state ?? "disabled" };
|
|
227
223
|
}
|
|
228
224
|
/** Enable on the deployment (audit `extension.enabled`); no change when already enabled. Org enablement is unchanged. */
|
|
229
|
-
enable(name, actor, actorTokenId) {
|
|
230
|
-
return this.setState(name, "enabled", actor, actorTokenId);
|
|
225
|
+
enable(name, actor, actorTokenId, owner) {
|
|
226
|
+
return this.setState(name, "enabled", actor, actorTokenId, owner);
|
|
231
227
|
}
|
|
232
228
|
/**
|
|
233
229
|
* Disables on the deployment (audit `extension.disabled`); no change when already disabled. Every
|
|
@@ -235,8 +231,8 @@ let ExtensionAdminOps = class ExtensionAdminOps {
|
|
|
235
231
|
* it; the org enablement switch is unchanged and the org page shows it as unavailable. A required
|
|
236
232
|
* bootstrap plugin -> `extension.required`.
|
|
237
233
|
*/
|
|
238
|
-
disable(name, actor, actorTokenId) {
|
|
239
|
-
return this.setState(name, "disabled", actor, actorTokenId);
|
|
234
|
+
disable(name, actor, actorTokenId, owner) {
|
|
235
|
+
return this.setState(name, "disabled", actor, actorTokenId, owner);
|
|
240
236
|
}
|
|
241
237
|
/**
|
|
242
238
|
* Uninstall: a required bootstrap plugin -> `extension.required`; must be disabled first
|
|
@@ -246,14 +242,13 @@ let ExtensionAdminOps = class ExtensionAdminOps {
|
|
|
246
242
|
* permission snapshot and the package in the package store are untouched (a reinstall picks them
|
|
247
243
|
* up).
|
|
248
244
|
*/
|
|
249
|
-
async uninstall(name, actor, actorTokenId) {
|
|
245
|
+
async uninstall(name, actor, actorTokenId, owner) {
|
|
250
246
|
this.assertInstallable(name);
|
|
251
|
-
await this.writeUninstall(name, actor, actorTokenId);
|
|
247
|
+
await this.writeUninstall(name, actor, actorTokenId, owner);
|
|
252
248
|
}
|
|
253
|
-
async writeUninstall(name, actor, actorTokenId) {
|
|
249
|
+
async writeUninstall(name, actor, actorTokenId, owner) {
|
|
254
250
|
const db = this.db;
|
|
255
|
-
|
|
256
|
-
await this.adminLock.lockAndAuthorize(actor);
|
|
251
|
+
await this.authorize(actor, owner);
|
|
257
252
|
const row = await this.lockRow(name);
|
|
258
253
|
if (!row)
|
|
259
254
|
throw notFound(name);
|
|
@@ -265,22 +260,21 @@ let ExtensionAdminOps = class ExtensionAdminOps {
|
|
|
265
260
|
await db.deleteFrom("extension_installs").where("name", "=", name).execute();
|
|
266
261
|
// 来源条目随安装记录一起删:之后不经目录重新安装时不再受旧条目的策略约束(T26 裁决)
|
|
267
262
|
await db.deleteFrom("extension_catalog_sources").where("plugin", "=", name).execute();
|
|
268
|
-
await this.audit(actor, actorTokenId, "extension.uninstalled", name, row.version, row.sha256);
|
|
263
|
+
await this.audit(actor, actorTokenId, "extension.uninstalled", name, row.version, row.sha256, ownerDetail(owner));
|
|
269
264
|
afterCommit(() => this.notify(name));
|
|
270
265
|
}
|
|
271
|
-
async setState(name, state, actor, actorTokenId) {
|
|
266
|
+
async setState(name, state, actor, actorTokenId, owner) {
|
|
272
267
|
this.assertInstallable(name);
|
|
273
|
-
const result = await this.writeState(name, state, actor, actorTokenId);
|
|
268
|
+
const result = await this.writeState(name, state, actor, actorTokenId, owner);
|
|
274
269
|
return this.viewAfterCommit(name, {
|
|
275
270
|
version: result.row.version,
|
|
276
271
|
sha256: result.row.sha256,
|
|
277
272
|
state,
|
|
278
273
|
});
|
|
279
274
|
}
|
|
280
|
-
async writeState(name, state, actor, actorTokenId) {
|
|
275
|
+
async writeState(name, state, actor, actorTokenId, owner) {
|
|
281
276
|
const db = this.db;
|
|
282
|
-
|
|
283
|
-
await this.adminLock.lockAndAuthorize(actor);
|
|
277
|
+
await this.authorize(actor, owner);
|
|
284
278
|
const row = await this.lockRow(name);
|
|
285
279
|
if (!row)
|
|
286
280
|
throw notFound(name);
|
|
@@ -297,7 +291,7 @@ let ExtensionAdminOps = class ExtensionAdminOps {
|
|
|
297
291
|
})
|
|
298
292
|
.where("name", "=", name)
|
|
299
293
|
.execute();
|
|
300
|
-
await this.audit(actor, actorTokenId, state === "enabled" ? "extension.enabled" : "extension.disabled", name, row.version, row.sha256);
|
|
294
|
+
await this.audit(actor, actorTokenId, state === "enabled" ? "extension.enabled" : "extension.disabled", name, row.version, row.sha256, ownerDetail(owner));
|
|
301
295
|
afterCommit(() => this.notify(name));
|
|
302
296
|
return { row, changed: true };
|
|
303
297
|
}
|
|
@@ -316,6 +310,22 @@ let ExtensionAdminOps = class ExtensionAdminOps {
|
|
|
316
310
|
return fallbackView(name, known, err);
|
|
317
311
|
}
|
|
318
312
|
}
|
|
313
|
+
/**
|
|
314
|
+
* Re-checks the actor in the operation's transaction: a super admin, or for an owner's operation
|
|
315
|
+
* an admin of the owner org; no account (the CLI, the kernel itself) is not checked.
|
|
316
|
+
*/
|
|
317
|
+
async authorize(actor, owner) {
|
|
318
|
+
if (owner?.rollback === true)
|
|
319
|
+
return;
|
|
320
|
+
if (owner !== undefined) {
|
|
321
|
+
if (actor === null)
|
|
322
|
+
throw new Error("an owner's extension operation has an actor");
|
|
323
|
+
await this.orgLock.lockAndAuthorize(owner.orgId, actor, "catalog.upload");
|
|
324
|
+
}
|
|
325
|
+
else if (actor !== null) {
|
|
326
|
+
await this.adminLock.lockAndAuthorize(actor);
|
|
327
|
+
}
|
|
328
|
+
}
|
|
319
329
|
/** 配置声明的插件不经安装记录管理。 */
|
|
320
330
|
assertInstallable(name) {
|
|
321
331
|
const declared = this.registry.declared().get(name);
|
|
@@ -372,6 +382,9 @@ __decorate([
|
|
|
372
382
|
__decorate([
|
|
373
383
|
Transactional()
|
|
374
384
|
], ExtensionAdminOps.prototype, "writeState", null);
|
|
385
|
+
__decorate([
|
|
386
|
+
Transactional({ propagation: "mandatory" })
|
|
387
|
+
], ExtensionAdminOps.prototype, "authorize", null);
|
|
375
388
|
__decorate([
|
|
376
389
|
Transactional({ propagation: "mandatory" })
|
|
377
390
|
], ExtensionAdminOps.prototype, "lockRow", null);
|
|
@@ -379,15 +392,16 @@ ExtensionAdminOps = __decorate([
|
|
|
379
392
|
Injectable(),
|
|
380
393
|
__param(0, Inject(KernelDb)),
|
|
381
394
|
__param(1, Inject(TransactionHost)),
|
|
382
|
-
__param(2, Inject(
|
|
383
|
-
__param(3, Inject(
|
|
384
|
-
__param(4, Inject(
|
|
385
|
-
__param(5, Inject(
|
|
386
|
-
__param(6, Inject(
|
|
387
|
-
__param(7, Inject(
|
|
388
|
-
__param(8, Inject(
|
|
389
|
-
__param(9, Inject(
|
|
390
|
-
__param(10, Inject(
|
|
395
|
+
__param(2, Inject(SuperAdminLock)),
|
|
396
|
+
__param(3, Inject(OrgLock)),
|
|
397
|
+
__param(4, Inject(PluginInstallLock)),
|
|
398
|
+
__param(5, Inject(ExtensionAdmin)),
|
|
399
|
+
__param(6, Inject(ExtensionRegistry)),
|
|
400
|
+
__param(7, Inject(ExtensionBlobs)),
|
|
401
|
+
__param(8, Inject(KernelConfigService)),
|
|
402
|
+
__param(9, Inject(KERNEL_BUS)),
|
|
403
|
+
__param(10, Inject(ExtensionLifecycle)),
|
|
404
|
+
__param(11, Inject(KERNEL_LOGGER))
|
|
391
405
|
], ExtensionAdminOps);
|
|
392
406
|
export { ExtensionAdminOps };
|
|
393
407
|
/**
|
|
@@ -418,6 +432,9 @@ function fallbackView(name, known, err) {
|
|
|
418
432
|
configValid: true,
|
|
419
433
|
removable: true,
|
|
420
434
|
required: false,
|
|
435
|
+
scope: null,
|
|
436
|
+
enabledOrgs: 0,
|
|
437
|
+
builtin: false,
|
|
421
438
|
installSource: null,
|
|
422
439
|
error: `the change was saved, but its current status cannot be read: ${err instanceof Error ? err.message : String(err)}`,
|
|
423
440
|
};
|
|
@@ -443,7 +460,13 @@ async function hasRetainedData(db, name) {
|
|
|
443
460
|
.executeTakeFirst();
|
|
444
461
|
return hit !== undefined;
|
|
445
462
|
}
|
|
446
|
-
const required = (name) => new ApiError("extension.required", `Extension ${name} is required by this deployment (a bootstrap plugin): it is enabled in every organization and cannot be disabled or uninstalled;
|
|
463
|
+
const required = (name) => new ApiError("extension.required", `Extension ${name} is required by this deployment (a bootstrap plugin): it is enabled in every organization and cannot be disabled or uninstalled; a super admin can upgrade it`);
|
|
447
464
|
const notFound = (name) => new ApiError("extension.not_found", `Extension ${name} is not installed in this deployment`);
|
|
448
465
|
/** `to` 比 `from` 旧(任一方不是合法 semver 时不算降级)。 */
|
|
449
466
|
const isDowngrade = (to, from) => semver.valid(to) !== null && semver.valid(from) !== null && semver.lt(to, from);
|
|
467
|
+
/** The audit detail of an owner's operation. */
|
|
468
|
+
function ownerDetail(owner) {
|
|
469
|
+
if (owner === undefined)
|
|
470
|
+
return {};
|
|
471
|
+
return { ownerOrgId: owner.orgId, ...(owner.rollback === true && { rollback: true }) };
|
|
472
|
+
}
|
|
@@ -1,11 +1,13 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { SuperAdminLock } from "../identity/super-admin.js";
|
|
2
2
|
import { KernelConfigService } from "../infra/config/kernel-config.service.js";
|
|
3
3
|
import { KernelDb } from "../infra/database/kernel-db.js";
|
|
4
4
|
import { TransactionHost } from "../infra/database/transaction-host.js";
|
|
5
5
|
import type { KernelLogger } from "../log.js";
|
|
6
6
|
import { ExtensionApprovals } from "./approvals.js";
|
|
7
7
|
import { ExtensionBlobs } from "./blobs.js";
|
|
8
|
+
import { ExtensionDeploymentConfigService } from "./deployment-config.js";
|
|
8
9
|
import { ExtensionDisplayNames } from "./display-name.js";
|
|
10
|
+
import { EffectiveConfigs } from "./effective-config.js";
|
|
9
11
|
import { ExtensionHost } from "./host.js";
|
|
10
12
|
import { ExtensionInstalls } from "./installs.js";
|
|
11
13
|
import { ExtensionLifecycle, PLUGINS_CHANGED_TOPIC } from "./lifecycle.js";
|
|
@@ -23,13 +25,13 @@ export interface PublishBus {
|
|
|
23
25
|
publish(topic: string, payload: unknown): Promise<void>;
|
|
24
26
|
}
|
|
25
27
|
/**
|
|
26
|
-
*
|
|
28
|
+
* 部署级插件后台(超级管理员):列表 / 详情与网页批准权限(D8)。无状态,多副本共用;
|
|
27
29
|
* 状态由 PG(安装记录、快照、各副本状态行)与本副本宿主(配置声明插件的清单)推出。
|
|
28
30
|
*/
|
|
29
31
|
export declare class ExtensionAdmin {
|
|
30
32
|
private readonly kdb;
|
|
31
33
|
readonly txHost: TransactionHost;
|
|
32
|
-
/** The
|
|
34
|
+
/** The super admin lock (identity/super-admin.ts): joins the transaction. */
|
|
33
35
|
private readonly adminLock;
|
|
34
36
|
private readonly approveLock;
|
|
35
37
|
private readonly blobs;
|
|
@@ -43,17 +45,29 @@ export declare class ExtensionAdmin {
|
|
|
43
45
|
private readonly bus;
|
|
44
46
|
private readonly log;
|
|
45
47
|
private readonly displayNames;
|
|
48
|
+
/** Which required overridable fields the platform left empty (spec A §5.4a). */
|
|
49
|
+
private readonly deploymentConfig;
|
|
50
|
+
/** How many orgs still need their own config for such an extension. */
|
|
51
|
+
private readonly effectiveConfigs;
|
|
46
52
|
private readonly packageSets;
|
|
47
53
|
constructor(kdb: KernelDb, txHost: TransactionHost,
|
|
48
|
-
/** The
|
|
49
|
-
adminLock:
|
|
54
|
+
/** The super admin lock (identity/super-admin.ts): joins the transaction. */
|
|
55
|
+
adminLock: SuperAdminLock, approveLock: PluginApproveLock, blobs: ExtensionBlobs, installs: ExtensionInstalls, approvals: ExtensionApprovals,
|
|
50
56
|
/** The config-declared extensions (this replica's host; the CLI fills it from its inspection). */
|
|
51
57
|
host: ExtensionHost,
|
|
52
58
|
/** This replica's reconcile after an approval (a no-op where the lifecycle never started: the CLI). */
|
|
53
|
-
lifecycle: ExtensionLifecycle, config: KernelConfigService, bus: PublishBus, log: KernelLogger, displayNames: ExtensionDisplayNames
|
|
59
|
+
lifecycle: ExtensionLifecycle, config: KernelConfigService, bus: PublishBus, log: KernelLogger, displayNames: ExtensionDisplayNames,
|
|
60
|
+
/** Which required overridable fields the platform left empty (spec A §5.4a). */
|
|
61
|
+
deploymentConfig: ExtensionDeploymentConfigService,
|
|
62
|
+
/** How many orgs still need their own config for such an extension. */
|
|
63
|
+
effectiveConfigs: EffectiveConfigs);
|
|
54
64
|
private get db();
|
|
55
|
-
/**
|
|
56
|
-
|
|
65
|
+
/**
|
|
66
|
+
* Every extension (config-declared, then install records, each by name). With `names`, only
|
|
67
|
+
* those: no other package is read, so a caller that needs a few items (the catalog's pending
|
|
68
|
+
* check) neither pays for nor logs about the packages of unrelated extensions.
|
|
69
|
+
*/
|
|
70
|
+
list(names?: ReadonlySet<string>): Promise<AdminExtensionView[]>;
|
|
57
71
|
/**
|
|
58
72
|
* A single extension; unknown -> `extension.not_found`; package unreadable ->
|
|
59
73
|
* `extension.package_unavailable`. With `allowUnreadable` an unreadable package returns the same
|
|
@@ -66,7 +80,12 @@ export declare class ExtensionAdmin {
|
|
|
66
80
|
allowUnreadable?: boolean;
|
|
67
81
|
}): Promise<AdminExtensionView>;
|
|
68
82
|
/**
|
|
69
|
-
*
|
|
83
|
+
* The review digest of a stored package (the `reviewHash` its extension would show once
|
|
84
|
+
* installed); null when the package cannot be read.
|
|
85
|
+
*/
|
|
86
|
+
packageReviewHash(sha256: string): Promise<string | null>;
|
|
87
|
+
/**
|
|
88
|
+
* Web approval: re-checks the super admin under the lock, compares the reviewed package
|
|
70
89
|
* (`sha256`) and permission digest (`reviewHash`), writes the snapshot (source web) and the
|
|
71
90
|
* `extension.permissions_approved` audit; after the commit publishes `kernel.plugins.changed` (a
|
|
72
91
|
* failure only warns) and waits for one reconcile on this replica (other replicas converge through
|
|
@@ -76,10 +95,12 @@ export declare class ExtensionAdmin {
|
|
|
76
95
|
* recomputed now -> `extension.approval_stale`; a config-declared extension's `sha256` must be
|
|
77
96
|
* null (otherwise `validation_failed`);
|
|
78
97
|
* - the snapshot already covers the current permission set (nothing to approve, F-N) ->
|
|
79
|
-
* `extension.not_pending
|
|
98
|
+
* `extension.not_pending`, except with `confirmBootstrap` when the snapshot is the bootstrap
|
|
99
|
+
* step's (the catalog's confirm re-writes it with source web).
|
|
80
100
|
*/
|
|
81
101
|
approve(actor: string, name: string, body: ApproveBody, opts?: {
|
|
82
102
|
actorTokenId?: string;
|
|
103
|
+
confirmBootstrap?: boolean;
|
|
83
104
|
}): Promise<AdminExtensionView>;
|
|
84
105
|
private writeApproval;
|
|
85
106
|
/** 配置声明 → 安装记录(与配置声明重名的安装记录不生效,不单列)。`only` 给出时只取这一个。 */
|
|
@@ -88,5 +109,11 @@ export declare class ExtensionAdmin {
|
|
|
88
109
|
* 包的权限集合(静态清单 + 迁移 SQL,与上传时的审阅相同)、迁移审阅警告与是否有部署级配置字段;按 sha256 缓存。
|
|
89
110
|
*/
|
|
90
111
|
private packageInfo;
|
|
112
|
+
/**
|
|
113
|
+
* For each configurable, readable extension whose platform config leaves required overridable
|
|
114
|
+
* fields empty (spec A §5.4a): the number of orgs still needing their own config. Extensions
|
|
115
|
+
* without overridable fields cost no read.
|
|
116
|
+
*/
|
|
117
|
+
private orgsNeedingConfig;
|
|
91
118
|
private views;
|
|
92
119
|
}
|
|
@@ -11,7 +11,7 @@ import { SDK_VERSION } from "@capybara-hq/plugin-sdk";
|
|
|
11
11
|
import { Inject, Injectable } from "@nestjs/common";
|
|
12
12
|
import { sql } from "kysely";
|
|
13
13
|
import { ApiError } from "../errors.js";
|
|
14
|
-
import {
|
|
14
|
+
import { SuperAdminLock } from "../identity/super-admin.js";
|
|
15
15
|
import { KernelConfigService } from "../infra/config/kernel-config.service.js";
|
|
16
16
|
import { KernelDb } from "../infra/database/kernel-db.js";
|
|
17
17
|
import { TransactionHost } from "../infra/database/transaction-host.js";
|
|
@@ -19,7 +19,10 @@ import { Transactional } from "../infra/database/transactional.decorator.js";
|
|
|
19
19
|
import { KERNEL_BUS, KERNEL_LOGGER } from "../infra/tokens.js";
|
|
20
20
|
import { ExtensionApprovals, snapshotCovers, writeSnapshot, } from "./approvals.js";
|
|
21
21
|
import { ExtensionBlobs } from "./blobs.js";
|
|
22
|
+
import { ExtensionDeploymentConfigService } from "./deployment-config.js";
|
|
22
23
|
import { ExtensionDisplayNames } from "./display-name.js";
|
|
24
|
+
import { EffectiveConfigs } from "./effective-config.js";
|
|
25
|
+
import { enabledExtensionsByOrg } from "./enabled.js";
|
|
23
26
|
import { ExtensionHost } from "./host.js";
|
|
24
27
|
import { ExtensionInstalls } from "./installs.js";
|
|
25
28
|
import { ExtensionLifecycle, PLUGINS_CHANGED_TOPIC, STALE_RECONCILE_PERIODS } from "./lifecycle.js";
|
|
@@ -27,6 +30,7 @@ import { PluginApproveLock } from "./locks.js";
|
|
|
27
30
|
import { ExtensionPackageError, permissionSetOfPackage, readExtensionPackage } from "./package.js";
|
|
28
31
|
import { buildPermissionSet, diffPermissions } from "./permission-set.js";
|
|
29
32
|
import { deriveExtensionStatus, migrationWarnings, permissionGroups, permissionKeyItems, reviewHash, } from "./permission-view.js";
|
|
33
|
+
import { pluginItemsOf } from "./plugin-items.js";
|
|
30
34
|
export { PLUGINS_CHANGED_TOPIC };
|
|
31
35
|
/** 内容寻址的包 → 权限集合(包不可变,缓存安全;只作缓存,不是跨副本状态)。 */
|
|
32
36
|
const PACKAGE_SET_CACHE_MAX = 256;
|
|
@@ -48,7 +52,7 @@ function assertReadable(s) {
|
|
|
48
52
|
}
|
|
49
53
|
}
|
|
50
54
|
/**
|
|
51
|
-
*
|
|
55
|
+
* 部署级插件后台(超级管理员):列表 / 详情与网页批准权限(D8)。无状态,多副本共用;
|
|
52
56
|
* 状态由 PG(安装记录、快照、各副本状态行)与本副本宿主(配置声明插件的清单)推出。
|
|
53
57
|
*/
|
|
54
58
|
let ExtensionAdmin = class ExtensionAdmin {
|
|
@@ -65,14 +69,20 @@ let ExtensionAdmin = class ExtensionAdmin {
|
|
|
65
69
|
bus;
|
|
66
70
|
log;
|
|
67
71
|
displayNames;
|
|
72
|
+
deploymentConfig;
|
|
73
|
+
effectiveConfigs;
|
|
68
74
|
packageSets = new Map();
|
|
69
75
|
constructor(kdb, txHost,
|
|
70
|
-
/** The
|
|
76
|
+
/** The super admin lock (identity/super-admin.ts): joins the transaction. */
|
|
71
77
|
adminLock, approveLock, blobs, installs, approvals,
|
|
72
78
|
/** The config-declared extensions (this replica's host; the CLI fills it from its inspection). */
|
|
73
79
|
host,
|
|
74
80
|
/** This replica's reconcile after an approval (a no-op where the lifecycle never started: the CLI). */
|
|
75
|
-
lifecycle, config, bus, log, displayNames
|
|
81
|
+
lifecycle, config, bus, log, displayNames,
|
|
82
|
+
/** Which required overridable fields the platform left empty (spec A §5.4a). */
|
|
83
|
+
deploymentConfig,
|
|
84
|
+
/** How many orgs still need their own config for such an extension. */
|
|
85
|
+
effectiveConfigs) {
|
|
76
86
|
this.kdb = kdb;
|
|
77
87
|
this.txHost = txHost;
|
|
78
88
|
this.adminLock = adminLock;
|
|
@@ -86,13 +96,19 @@ let ExtensionAdmin = class ExtensionAdmin {
|
|
|
86
96
|
this.bus = bus;
|
|
87
97
|
this.log = log;
|
|
88
98
|
this.displayNames = displayNames;
|
|
99
|
+
this.deploymentConfig = deploymentConfig;
|
|
100
|
+
this.effectiveConfigs = effectiveConfigs;
|
|
89
101
|
}
|
|
90
102
|
get db() {
|
|
91
103
|
return this.kdb.db;
|
|
92
104
|
}
|
|
93
|
-
/**
|
|
94
|
-
|
|
95
|
-
|
|
105
|
+
/**
|
|
106
|
+
* Every extension (config-declared, then install records, each by name). With `names`, only
|
|
107
|
+
* those: no other package is read, so a caller that needs a few items (the catalog's pending
|
|
108
|
+
* check) neither pays for nor logs about the packages of unrelated extensions.
|
|
109
|
+
*/
|
|
110
|
+
async list(names) {
|
|
111
|
+
const subjects = await this.subjects(undefined, names);
|
|
96
112
|
return this.views(subjects);
|
|
97
113
|
}
|
|
98
114
|
/**
|
|
@@ -112,7 +128,20 @@ let ExtensionAdmin = class ExtensionAdmin {
|
|
|
112
128
|
return (await this.views([s]))[0];
|
|
113
129
|
}
|
|
114
130
|
/**
|
|
115
|
-
*
|
|
131
|
+
* The review digest of a stored package (the `reviewHash` its extension would show once
|
|
132
|
+
* installed); null when the package cannot be read.
|
|
133
|
+
*/
|
|
134
|
+
async packageReviewHash(sha256) {
|
|
135
|
+
try {
|
|
136
|
+
const { set, warnings } = await this.packageInfo(sha256);
|
|
137
|
+
return reviewHash(set, warnings);
|
|
138
|
+
}
|
|
139
|
+
catch {
|
|
140
|
+
return null;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Web approval: re-checks the super admin under the lock, compares the reviewed package
|
|
116
145
|
* (`sha256`) and permission digest (`reviewHash`), writes the snapshot (source web) and the
|
|
117
146
|
* `extension.permissions_approved` audit; after the commit publishes `kernel.plugins.changed` (a
|
|
118
147
|
* failure only warns) and waits for one reconcile on this replica (other replicas converge through
|
|
@@ -122,7 +151,8 @@ let ExtensionAdmin = class ExtensionAdmin {
|
|
|
122
151
|
* recomputed now -> `extension.approval_stale`; a config-declared extension's `sha256` must be
|
|
123
152
|
* null (otherwise `validation_failed`);
|
|
124
153
|
* - the snapshot already covers the current permission set (nothing to approve, F-N) ->
|
|
125
|
-
* `extension.not_pending
|
|
154
|
+
* `extension.not_pending`, except with `confirmBootstrap` when the snapshot is the bootstrap
|
|
155
|
+
* step's (the catalog's confirm re-writes it with source web).
|
|
126
156
|
*/
|
|
127
157
|
async approve(actor, name, body, opts = {}) {
|
|
128
158
|
const s = (await this.subjects(name))[0];
|
|
@@ -137,7 +167,7 @@ let ExtensionAdmin = class ExtensionAdmin {
|
|
|
137
167
|
throw stale();
|
|
138
168
|
if (body.reviewHash !== reviewHash(s.set, s.warnings))
|
|
139
169
|
throw stale();
|
|
140
|
-
await this.writeApproval(actor, name, s, opts.actorTokenId, stale);
|
|
170
|
+
await this.writeApproval(actor, name, s, opts.actorTokenId, stale, opts.confirmBootstrap === true);
|
|
141
171
|
try {
|
|
142
172
|
await this.bus.publish(PLUGINS_CHANGED_TOPIC, { plugin: name });
|
|
143
173
|
}
|
|
@@ -153,7 +183,7 @@ let ExtensionAdmin = class ExtensionAdmin {
|
|
|
153
183
|
}
|
|
154
184
|
return this.get(name);
|
|
155
185
|
}
|
|
156
|
-
async writeApproval(actor, name, s, actorTokenId, stale) {
|
|
186
|
+
async writeApproval(actor, name, s, actorTokenId, stale, confirmBootstrap) {
|
|
157
187
|
const db = this.db;
|
|
158
188
|
await this.adminLock.lockAndAuthorize(actor);
|
|
159
189
|
await this.approveLock.lock(name);
|
|
@@ -170,7 +200,7 @@ let ExtensionAdmin = class ExtensionAdmin {
|
|
|
170
200
|
}
|
|
171
201
|
const snapRow = await db
|
|
172
202
|
.selectFrom("extension_permission_snapshots")
|
|
173
|
-
.select(["version", "permissions"])
|
|
203
|
+
.select(["version", "permissions", "source"])
|
|
174
204
|
.where("plugin", "=", name)
|
|
175
205
|
.forUpdate()
|
|
176
206
|
.executeTakeFirst();
|
|
@@ -178,7 +208,9 @@ let ExtensionAdmin = class ExtensionAdmin {
|
|
|
178
208
|
version: snapRow.version,
|
|
179
209
|
permissions: snapRow.permissions,
|
|
180
210
|
};
|
|
181
|
-
|
|
211
|
+
// `confirmBootstrap` (the catalog's confirm): a snapshot the bootstrap step wrote was never
|
|
212
|
+
// confirmed by a person, so a covered one is still taken over
|
|
213
|
+
if (snapshotCovers(snap, s.set) && !(confirmBootstrap && snapRow?.source === "bootstrap")) {
|
|
182
214
|
throw new ApiError("extension.not_pending", `Extension ${name} ${s.version} has no new permissions awaiting approval`);
|
|
183
215
|
}
|
|
184
216
|
const { added, removed } = diffPermissions(snap?.permissions, s.set);
|
|
@@ -190,10 +222,9 @@ let ExtensionAdmin = class ExtensionAdmin {
|
|
|
190
222
|
});
|
|
191
223
|
}
|
|
192
224
|
/** 配置声明 → 安装记录(与配置声明重名的安装记录不生效,不单列)。`only` 给出时只取这一个。 */
|
|
193
|
-
async subjects(only) {
|
|
194
|
-
const
|
|
195
|
-
|
|
196
|
-
.filter((p) => only === undefined || p.name === only);
|
|
225
|
+
async subjects(only, names) {
|
|
226
|
+
const wanted = (name) => (only === undefined || name === only) && (names === undefined || names.has(name));
|
|
227
|
+
const declared = this.host.declaredPlugins().filter((p) => wanted(p.name));
|
|
197
228
|
const taken = new Set(this.host.declaredPlugins().map((p) => p.name));
|
|
198
229
|
const out = [...declared]
|
|
199
230
|
.sort((a, b) => a.name.localeCompare(b.name))
|
|
@@ -209,7 +240,7 @@ let ExtensionAdmin = class ExtensionAdmin {
|
|
|
209
240
|
}));
|
|
210
241
|
if (only !== undefined && out.length > 0)
|
|
211
242
|
return out;
|
|
212
|
-
const rows = (await this.installs.list()).filter((r) => !taken.has(r.name) && (
|
|
243
|
+
const rows = (await this.installs.list()).filter((r) => !taken.has(r.name) && wanted(r.name));
|
|
213
244
|
for (const r of rows) {
|
|
214
245
|
let info;
|
|
215
246
|
try {
|
|
@@ -276,6 +307,32 @@ let ExtensionAdmin = class ExtensionAdmin {
|
|
|
276
307
|
}
|
|
277
308
|
return { ...cached, configurable: cached.set.config.deployment.length > 0 };
|
|
278
309
|
}
|
|
310
|
+
/**
|
|
311
|
+
* For each configurable, readable extension whose platform config leaves required overridable
|
|
312
|
+
* fields empty (spec A §5.4a): the number of orgs still needing their own config. Extensions
|
|
313
|
+
* without overridable fields cost no read.
|
|
314
|
+
*/
|
|
315
|
+
async orgsNeedingConfig(subjects) {
|
|
316
|
+
const out = new Map();
|
|
317
|
+
for (const s of subjects) {
|
|
318
|
+
if (!s.configurable || s.broken !== undefined)
|
|
319
|
+
continue;
|
|
320
|
+
try {
|
|
321
|
+
const missing = await this.deploymentConfig.orgMustConfigure(s.name);
|
|
322
|
+
if (missing.length > 0) {
|
|
323
|
+
out.set(s.name, await this.effectiveConfigs.countNeedingConfig(s.name));
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
catch (err) {
|
|
327
|
+
// the list never fails for one extension's config; the field is then left out
|
|
328
|
+
this.log.warn("cannot tell whether orgs must configure the extension", {
|
|
329
|
+
plugin: s.name,
|
|
330
|
+
err,
|
|
331
|
+
});
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
return out;
|
|
335
|
+
}
|
|
279
336
|
async views(subjects) {
|
|
280
337
|
if (subjects.length === 0)
|
|
281
338
|
return [];
|
|
@@ -290,7 +347,28 @@ let ExtensionAdmin = class ExtensionAdmin {
|
|
|
290
347
|
.where("heartbeat_at", ">", sql `now() - make_interval(secs => ${staleSeconds})`)
|
|
291
348
|
.orderBy("replica_id")
|
|
292
349
|
.execute();
|
|
350
|
+
const items = await pluginItemsOf(this.db, names);
|
|
351
|
+
const needing = await this.orgsNeedingConfig(subjects);
|
|
352
|
+
const counts = new Map((await this.db
|
|
353
|
+
.selectFrom(enabledExtensionsByOrg(this.db).as("en"))
|
|
354
|
+
.innerJoin("orgs", "orgs.id", "en.org_id")
|
|
355
|
+
.select(["en.plugin", (eb) => eb.fn.countAll().as("n")])
|
|
356
|
+
.where("orgs.deleted_at", "is", null)
|
|
357
|
+
.where("en.plugin", "in", names)
|
|
358
|
+
.groupBy("en.plugin")
|
|
359
|
+
.execute()).map((r) => [r.plugin, Number(r.n)]));
|
|
293
360
|
return subjects.map((s) => {
|
|
361
|
+
const of = items.get(s.name);
|
|
362
|
+
const builtin = of?.some((i) => i.builtin) === true || s.install?.required === true;
|
|
363
|
+
const scopeInfo = {
|
|
364
|
+
scope: of?.[0]
|
|
365
|
+
? builtin || of.some((i) => i.scope === "all")
|
|
366
|
+
? "all"
|
|
367
|
+
: of[0].scope
|
|
368
|
+
: null,
|
|
369
|
+
enabledOrgs: counts.get(s.name) ?? 0,
|
|
370
|
+
builtin,
|
|
371
|
+
};
|
|
294
372
|
const replicas = rows.filter((r) => r.plugin === s.name);
|
|
295
373
|
const snap = snapshots.get(s.name);
|
|
296
374
|
const { added, removed } = diffPermissions(snap?.permissions, s.set);
|
|
@@ -325,6 +403,7 @@ let ExtensionAdmin = class ExtensionAdmin {
|
|
|
325
403
|
configValid,
|
|
326
404
|
removable: install?.required !== true,
|
|
327
405
|
required: install?.required === true,
|
|
406
|
+
...scopeInfo,
|
|
328
407
|
installSource: install?.source ?? null,
|
|
329
408
|
error: s.broken,
|
|
330
409
|
};
|
|
@@ -360,8 +439,10 @@ let ExtensionAdmin = class ExtensionAdmin {
|
|
|
360
439
|
snapshot: snapshotView(snap),
|
|
361
440
|
configurable: s.configurable,
|
|
362
441
|
configValid,
|
|
442
|
+
...(needing.has(s.name) && { orgsNeedingConfig: needing.get(s.name) }),
|
|
363
443
|
removable: s.source === "install" && install?.required !== true,
|
|
364
444
|
required: install?.required === true,
|
|
445
|
+
...scopeInfo,
|
|
365
446
|
installSource: install?.source ?? null,
|
|
366
447
|
};
|
|
367
448
|
});
|
|
@@ -374,7 +455,7 @@ ExtensionAdmin = __decorate([
|
|
|
374
455
|
Injectable(),
|
|
375
456
|
__param(0, Inject(KernelDb)),
|
|
376
457
|
__param(1, Inject(TransactionHost)),
|
|
377
|
-
__param(2, Inject(
|
|
458
|
+
__param(2, Inject(SuperAdminLock)),
|
|
378
459
|
__param(3, Inject(PluginApproveLock)),
|
|
379
460
|
__param(4, Inject(ExtensionBlobs)),
|
|
380
461
|
__param(5, Inject(ExtensionInstalls)),
|
|
@@ -384,7 +465,9 @@ ExtensionAdmin = __decorate([
|
|
|
384
465
|
__param(9, Inject(KernelConfigService)),
|
|
385
466
|
__param(10, Inject(KERNEL_BUS)),
|
|
386
467
|
__param(11, Inject(KERNEL_LOGGER)),
|
|
387
|
-
__param(12, Inject(ExtensionDisplayNames))
|
|
468
|
+
__param(12, Inject(ExtensionDisplayNames)),
|
|
469
|
+
__param(13, Inject(ExtensionDeploymentConfigService)),
|
|
470
|
+
__param(14, Inject(EffectiveConfigs))
|
|
388
471
|
], ExtensionAdmin);
|
|
389
472
|
export { ExtensionAdmin };
|
|
390
473
|
const replicaView = (r) => ({
|