@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
|
@@ -1,9 +1,10 @@
|
|
|
1
|
+
import type { LocalizedName } from "@capybara-hq/plugin-sdk";
|
|
1
2
|
import type { core } from "zod";
|
|
2
3
|
import type { KernelAppOptions } from "../app.js";
|
|
3
4
|
import { type ConfigSourceKind } from "../config/sources.js";
|
|
4
5
|
import { type Keyring } from "../ctx/secrets.js";
|
|
5
6
|
import type { KernelSchemaDb } from "../db/kernel-schema.js";
|
|
6
|
-
import {
|
|
7
|
+
import { SuperAdminLock } from "../identity/super-admin.js";
|
|
7
8
|
import { KernelConfigService } from "../infra/config/kernel-config.service.js";
|
|
8
9
|
import { KernelDb } from "../infra/database/kernel-db.js";
|
|
9
10
|
import { TransactionHost } from "../infra/database/transaction-host.js";
|
|
@@ -12,12 +13,14 @@ import type { PublishBus } from "./admin-view.js";
|
|
|
12
13
|
import { type ConfigIssue } from "./config-issues.js";
|
|
13
14
|
import { type JsonSchema } from "./config-json-schema.js";
|
|
14
15
|
import { DEPLOYMENT_SECRETS_ORG, type DeploymentSchemaInfo, mergeDeploymentConfig, readStoredDeploymentConfig, schemaFields, secretPathsOf } from "./deployment-config-store.js";
|
|
16
|
+
import { ExtensionDisplayNames } from "./display-name.js";
|
|
15
17
|
import { ExtensionHost } from "./host.js";
|
|
16
18
|
import { ExtensionInstalls } from "./installs.js";
|
|
17
19
|
import { ExtensionLifecycle } from "./lifecycle.js";
|
|
18
20
|
import { PLUGIN_DEPLOYMENT_CONFIG_TOPIC } from "./lifecycle-topics.js";
|
|
19
21
|
import { PluginDeploymentConfigLock } from "./locks.js";
|
|
20
22
|
export { DEPLOYMENT_SECRETS_ORG, type DeploymentSchemaInfo, mergeDeploymentConfig, readStoredDeploymentConfig, schemaFields, secretPathsOf, };
|
|
23
|
+
type Obj = Record<string, unknown>;
|
|
21
24
|
export type { ConfigIssue };
|
|
22
25
|
export { PLUGIN_DEPLOYMENT_CONFIG_TOPIC };
|
|
23
26
|
/** 后台一个部署配置字段:来源、是否只读;非密钥字段给出生效值,密钥字段只给 `set`。 */
|
|
@@ -34,15 +37,41 @@ export interface DeploymentConfigField {
|
|
|
34
37
|
value?: unknown;
|
|
35
38
|
/** 密钥字段是否已设置(任何来源);值永不回显。 */
|
|
36
39
|
set?: boolean;
|
|
40
|
+
/**
|
|
41
|
+
* Only on a secret record some `x-ui.secrets[].path` names: the record's keys that are set, sorted
|
|
42
|
+
* (item names, not secret values; spec §4.3). Other secret fields report only `set`.
|
|
43
|
+
*/
|
|
44
|
+
keys?: string[];
|
|
45
|
+
/**
|
|
46
|
+
* What orgs may do with the field (spec A §5.1, the level of its top-level key): `readonly` (they
|
|
47
|
+
* see it) or `override` (they may bring their own value); absent = hidden from orgs.
|
|
48
|
+
*/
|
|
49
|
+
org?: "readonly" | "override";
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* One operation on a secret record drawn per item (spec §4.3), only for a path some
|
|
53
|
+
* `x-ui.secrets[].path` names: `renameFrom` moves an existing value to `key` (nothing when it has
|
|
54
|
+
* none, replacing a value already at `key`), then `value` sets it (a string) or removes it (`null`).
|
|
55
|
+
*/
|
|
56
|
+
export interface SecretEntry {
|
|
57
|
+
path: string;
|
|
58
|
+
key: string;
|
|
59
|
+
value?: string | null | undefined;
|
|
60
|
+
renameFrom?: string | undefined;
|
|
37
61
|
}
|
|
38
62
|
/** The response of `GET / PUT /api/v1/admin/extensions/:name/config`. */
|
|
39
63
|
export interface DeploymentConfigView {
|
|
40
64
|
plugin: string;
|
|
65
|
+
/** The plugin's display name (`ExtensionDisplayNames`); null when it has none. */
|
|
66
|
+
displayName: LocalizedName | null;
|
|
41
67
|
version: string;
|
|
42
68
|
/** 插件声明了部署级配置。 */
|
|
43
69
|
configurable: boolean;
|
|
44
70
|
fields: DeploymentConfigField[];
|
|
45
|
-
/**
|
|
71
|
+
/**
|
|
72
|
+
* 部署级 schema 的 JSON Schema(密钥字段带 `x-secret`,提示 `x-ui` / `x-hot`)。本副本拿不到模块(未加载的
|
|
73
|
+
* 安装记录)时取包内的 `extension.configSchemas.deployment`(`validated` 为 false);旧包没有它时为 null。
|
|
74
|
+
*/
|
|
46
75
|
schema: JsonSchema | null;
|
|
47
76
|
/** 生效配置按 schema 校验通过(`validated` 为 false 时没有校验,恒为 true,界面不要据此显示「合法」)。 */
|
|
48
77
|
valid: boolean;
|
|
@@ -53,6 +82,11 @@ export interface DeploymentConfigView {
|
|
|
53
82
|
validated: boolean;
|
|
54
83
|
/** 校验失败的原因(只有路径与说明,不含值)。 */
|
|
55
84
|
issues: ConfigIssue[];
|
|
85
|
+
/**
|
|
86
|
+
* The required `override` fields the platform left empty (spec A §5.4a): the extension still
|
|
87
|
+
* loads, and every org that follows the platform must configure them itself.
|
|
88
|
+
*/
|
|
89
|
+
orgMustConfigure: string[];
|
|
56
90
|
}
|
|
57
91
|
/**
|
|
58
92
|
* Deployment-level extension config (D8 / C10): non-secret fields are stored in
|
|
@@ -65,7 +99,7 @@ export interface DeploymentConfigView {
|
|
|
65
99
|
export declare class ExtensionDeploymentConfigService {
|
|
66
100
|
private readonly kdb;
|
|
67
101
|
readonly txHost: TransactionHost;
|
|
68
|
-
/** The
|
|
102
|
+
/** The super admin lock (identity/super-admin.ts): joins the transaction. */
|
|
69
103
|
private readonly adminLock;
|
|
70
104
|
private readonly configLock;
|
|
71
105
|
private readonly keyring;
|
|
@@ -79,11 +113,12 @@ export declare class ExtensionDeploymentConfigService {
|
|
|
79
113
|
/** Publishes {@link PLUGIN_DEPLOYMENT_CONFIG_TOPIC} after a save (a failure only warns). */
|
|
80
114
|
private readonly bus;
|
|
81
115
|
private readonly log;
|
|
116
|
+
private readonly displayNames;
|
|
82
117
|
/** Where each startup-config field comes from (see `extensionConfigSources`); those fields are read-only. */
|
|
83
118
|
private readonly sources;
|
|
84
119
|
constructor(kdb: KernelDb, txHost: TransactionHost,
|
|
85
|
-
/** The
|
|
86
|
-
adminLock:
|
|
120
|
+
/** The super admin lock (identity/super-admin.ts): joins the transaction. */
|
|
121
|
+
adminLock: SuperAdminLock, configLock: PluginDeploymentConfigLock, keyring: Keyring, config: KernelConfigService,
|
|
87
122
|
/** This replica's extension schemas (loaded, config-declared or prepared install records). */
|
|
88
123
|
host: ExtensionHost,
|
|
89
124
|
/** The effective (stored plus startup) deployment config. */
|
|
@@ -91,7 +126,7 @@ export declare class ExtensionDeploymentConfigService {
|
|
|
91
126
|
/** Applies a saved config on this replica at once (other replicas through the bus). */
|
|
92
127
|
lifecycle: ExtensionLifecycle,
|
|
93
128
|
/** Publishes {@link PLUGIN_DEPLOYMENT_CONFIG_TOPIC} after a save (a failure only warns). */
|
|
94
|
-
bus: PublishBus, log: KernelLogger, options: Pick<KernelAppOptions, "env" | "extensionConfigSources"
|
|
129
|
+
bus: PublishBus, log: KernelLogger, options: Pick<KernelAppOptions, "env" | "extensionConfigSources">, displayNames: ExtensionDisplayNames);
|
|
95
130
|
private get db();
|
|
96
131
|
/** The startup config's `extensionConfig` (file / Nacos merged with env). */
|
|
97
132
|
private fileConfig;
|
|
@@ -113,17 +148,52 @@ export declare class ExtensionDeploymentConfigService {
|
|
|
113
148
|
* invalid after merging (except a problem in a read-only startup-config field itself) ->
|
|
114
149
|
* `extension.config_invalid` (details carry only paths and messages);
|
|
115
150
|
* - a field present in the startup config (file / Nacos / env) -> 409 `extension.config_readonly`.
|
|
116
|
-
*
|
|
151
|
+
* `secretEntries` change single keys of secret records some `x-ui.secrets[].path` names
|
|
152
|
+
* ({@link SecretEntry}; spec §4.3): applied under the same locks to the decrypted record, which
|
|
153
|
+
* is re-encrypted whole, then validated with `values`; the audit lists the record's path, no keys.
|
|
154
|
+
* A path no hint names -> 400 `validation_failed`; one in the startup config -> 409
|
|
155
|
+
* `extension.config_readonly`.
|
|
156
|
+
* In a transaction, first `lockSuperAdminsAndAuthorize` (re-checks the super admin under
|
|
117
157
|
* the lock), then an advisory lock per extension; audit `extension.deployment_config_updated`
|
|
118
158
|
* (detail only `changedPaths`). After the commit publishes {@link PLUGIN_DEPLOYMENT_CONFIG_TOPIC} and
|
|
119
159
|
* applies it on this replica right away.
|
|
120
160
|
*/
|
|
121
|
-
put(plugin: string, values: Record<string, unknown>, actor: string, actorTokenId?: string): Promise<DeploymentConfigView>;
|
|
161
|
+
put(plugin: string, values: Record<string, unknown>, actor: string, actorTokenId?: string, secretEntries?: readonly SecretEntry[]): Promise<DeploymentConfigView>;
|
|
162
|
+
/**
|
|
163
|
+
* Secret entries name a secret record field some hint names (else 400 `validation_failed`, also
|
|
164
|
+
* for a path given in `values` too, an entry with neither `value` nor `renameFrom`, or a key
|
|
165
|
+
* `__proto__`). Messages carry paths and keys only, never values.
|
|
166
|
+
*/
|
|
167
|
+
private checkSecretEntries;
|
|
122
168
|
private write;
|
|
123
169
|
private info;
|
|
124
170
|
private render;
|
|
171
|
+
/**
|
|
172
|
+
* The required `override` fields the platform left empty ({@link DeploymentConfigView}
|
|
173
|
+
* `orgMustConfigure`); reads nothing when the extension has no `override` field. Unknown to the
|
|
174
|
+
* deployment -> `extension.not_found`.
|
|
175
|
+
*/
|
|
176
|
+
orgMustConfigure(plugin: string): Promise<string[]>;
|
|
177
|
+
/**
|
|
178
|
+
* The form JSON Schema of the description: the zod schema's, else the package's static one. A
|
|
179
|
+
* hint conversion that throws (a hand-made package) drops the hints: the plain schema, or none
|
|
180
|
+
* when even the conversion fails; one warning per schema. Never throws.
|
|
181
|
+
*/
|
|
182
|
+
private formSchemaOf;
|
|
183
|
+
private messagesOf;
|
|
184
|
+
/** The secret record paths some hint of the form schema names. */
|
|
185
|
+
private hintedPaths;
|
|
125
186
|
}
|
|
187
|
+
/**
|
|
188
|
+
* Applies secret entries in order to the decrypted config `next` (in place): each record is read
|
|
189
|
+
* from `next` at its path, renamed, set or removed, and put back; an empty record is removed (the
|
|
190
|
+
* field falls back to its default).
|
|
191
|
+
*/
|
|
192
|
+
export declare function applySecretEntries(next: Obj, entries: readonly SecretEntry[]): void;
|
|
126
193
|
/**
|
|
127
194
|
* 本副本拿不到模块时(未加载的安装记录)按包内审阅过的静态清单给出字段(没有 zod schema:不校验,加载时再校验)。
|
|
195
|
+
* The package's `extension.configSchemas.deployment` (written by the packer) is the form schema;
|
|
196
|
+
* its hints are checked like a loaded schema's (stripped when invalid, silently: a hand-made
|
|
197
|
+
* package). It is not compared with the module (not part of `manifest_mismatch`, spec §4.5).
|
|
128
198
|
*/
|
|
129
199
|
export declare function staticDeploymentSchema(db: KernelSchemaDb, plugin: string): Promise<DeploymentSchemaInfo | undefined>;
|
|
@@ -14,7 +14,7 @@ import { configSourceKind, extensionConfigSources, fieldSource, } from "../confi
|
|
|
14
14
|
import { createSecrets } from "../ctx/secrets.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 { KernelDb } from "../infra/database/kernel-db.js";
|
|
20
20
|
import { TransactionHost } from "../infra/database/transaction-host.js";
|
|
@@ -22,25 +22,17 @@ import { Transactional } from "../infra/database/transactional.decorator.js";
|
|
|
22
22
|
import { KERNEL_BUS, KERNEL_LOGGER, KEYRING } from "../infra/tokens.js";
|
|
23
23
|
import { KERNEL_APP_OPTIONS } from "../lifecycle/tokens.js";
|
|
24
24
|
import { toIssues } from "./config-issues.js";
|
|
25
|
-
import {
|
|
26
|
-
import { DEPLOYMENT_SECRETS_ORG, deleteDeep, mergeDeploymentConfig, readStoredDeploymentConfig, SECRETS_NAMESPACE, schemaFields, secretKey, secretPathsOf, setDeep, } from "./deployment-config-store.js";
|
|
25
|
+
import { checkConfigUi, configMessages, hintedSecretPaths, safeConfigFormSchema, } from "./config-json-schema.js";
|
|
26
|
+
import { DEPLOYMENT_SECRETS_ORG, deleteDeep, isObj, mergeDeploymentConfig, readStoredDeploymentConfig, SECRETS_NAMESPACE, schemaFields, secretKey, secretPathsOf, setDeep, } from "./deployment-config-store.js";
|
|
27
|
+
import { ExtensionDisplayNames } from "./display-name.js";
|
|
27
28
|
import { ExtensionHost } from "./host.js";
|
|
28
29
|
import { ExtensionInstalls } from "./installs.js";
|
|
29
30
|
import { ExtensionLifecycle } from "./lifecycle.js";
|
|
30
31
|
import { PLUGIN_DEPLOYMENT_CONFIG_TOPIC } from "./lifecycle-topics.js";
|
|
31
32
|
import { PluginDeploymentConfigLock } from "./locks.js";
|
|
33
|
+
import { fieldLevels, jsonSchemaFieldLevels, missingOverridable, parseLoadGate, } from "./org-levels.js";
|
|
32
34
|
export { DEPLOYMENT_SECRETS_ORG, mergeDeploymentConfig, readStoredDeploymentConfig, schemaFields, secretPathsOf, };
|
|
33
35
|
export { PLUGIN_DEPLOYMENT_CONFIG_TOPIC };
|
|
34
|
-
/** JSON Schema 转换按 schema 对象缓存(清单不可变)。 */
|
|
35
|
-
const jsonSchemaCache = new WeakMap();
|
|
36
|
-
function jsonSchemaOf(schema) {
|
|
37
|
-
let js = jsonSchemaCache.get(schema);
|
|
38
|
-
if (!js) {
|
|
39
|
-
js = configToJsonSchema(schema);
|
|
40
|
-
jsonSchemaCache.set(schema, js);
|
|
41
|
-
}
|
|
42
|
-
return structuredClone(js);
|
|
43
|
-
}
|
|
44
36
|
/** 某字段 zod 叶子上的默认值(整份配置不合法、校验没能补上默认值时,视图仍按它显示)。 */
|
|
45
37
|
function defaultOf(schema, path) {
|
|
46
38
|
const f = configFields(schema).find((x) => x.path === path);
|
|
@@ -69,10 +61,11 @@ let ExtensionDeploymentConfigService = class ExtensionDeploymentConfigService {
|
|
|
69
61
|
lifecycle;
|
|
70
62
|
bus;
|
|
71
63
|
log;
|
|
64
|
+
displayNames;
|
|
72
65
|
/** Where each startup-config field comes from (see `extensionConfigSources`); those fields are read-only. */
|
|
73
66
|
sources;
|
|
74
67
|
constructor(kdb, txHost,
|
|
75
|
-
/** The
|
|
68
|
+
/** The super admin lock (identity/super-admin.ts): joins the transaction. */
|
|
76
69
|
adminLock, configLock, keyring, config,
|
|
77
70
|
/** This replica's extension schemas (loaded, config-declared or prepared install records). */
|
|
78
71
|
host,
|
|
@@ -81,7 +74,7 @@ let ExtensionDeploymentConfigService = class ExtensionDeploymentConfigService {
|
|
|
81
74
|
/** Applies a saved config on this replica at once (other replicas through the bus). */
|
|
82
75
|
lifecycle,
|
|
83
76
|
/** Publishes {@link PLUGIN_DEPLOYMENT_CONFIG_TOPIC} after a save (a failure only warns). */
|
|
84
|
-
bus, log, options) {
|
|
77
|
+
bus, log, options, displayNames) {
|
|
85
78
|
this.kdb = kdb;
|
|
86
79
|
this.txHost = txHost;
|
|
87
80
|
this.adminLock = adminLock;
|
|
@@ -93,6 +86,7 @@ let ExtensionDeploymentConfigService = class ExtensionDeploymentConfigService {
|
|
|
93
86
|
this.lifecycle = lifecycle;
|
|
94
87
|
this.bus = bus;
|
|
95
88
|
this.log = log;
|
|
89
|
+
this.displayNames = displayNames;
|
|
96
90
|
const env = options.env ?? process.env;
|
|
97
91
|
this.sources =
|
|
98
92
|
options.extensionConfigSources ??
|
|
@@ -125,8 +119,11 @@ let ExtensionDeploymentConfigService = class ExtensionDeploymentConfigService {
|
|
|
125
119
|
/** Admin view; an extension unknown to the deployment -> `extension.not_found`. */
|
|
126
120
|
async view(plugin) {
|
|
127
121
|
const info = await this.info(plugin);
|
|
128
|
-
const stored = await
|
|
129
|
-
|
|
122
|
+
const [stored, displayName] = await Promise.all([
|
|
123
|
+
this.readStored(plugin, info),
|
|
124
|
+
this.displayNames.get(plugin),
|
|
125
|
+
]);
|
|
126
|
+
return this.render(plugin, info, stored, displayName);
|
|
130
127
|
}
|
|
131
128
|
/** `REPEATABLE READ` read-only: every stored field from one snapshot. */
|
|
132
129
|
readStored(plugin, info) {
|
|
@@ -141,12 +138,17 @@ let ExtensionDeploymentConfigService = class ExtensionDeploymentConfigService {
|
|
|
141
138
|
* invalid after merging (except a problem in a read-only startup-config field itself) ->
|
|
142
139
|
* `extension.config_invalid` (details carry only paths and messages);
|
|
143
140
|
* - a field present in the startup config (file / Nacos / env) -> 409 `extension.config_readonly`.
|
|
144
|
-
*
|
|
141
|
+
* `secretEntries` change single keys of secret records some `x-ui.secrets[].path` names
|
|
142
|
+
* ({@link SecretEntry}; spec §4.3): applied under the same locks to the decrypted record, which
|
|
143
|
+
* is re-encrypted whole, then validated with `values`; the audit lists the record's path, no keys.
|
|
144
|
+
* A path no hint names -> 400 `validation_failed`; one in the startup config -> 409
|
|
145
|
+
* `extension.config_readonly`.
|
|
146
|
+
* In a transaction, first `lockSuperAdminsAndAuthorize` (re-checks the super admin under
|
|
145
147
|
* the lock), then an advisory lock per extension; audit `extension.deployment_config_updated`
|
|
146
148
|
* (detail only `changedPaths`). After the commit publishes {@link PLUGIN_DEPLOYMENT_CONFIG_TOPIC} and
|
|
147
149
|
* applies it on this replica right away.
|
|
148
150
|
*/
|
|
149
|
-
async put(plugin, values, actor, actorTokenId) {
|
|
151
|
+
async put(plugin, values, actor, actorTokenId, secretEntries = []) {
|
|
150
152
|
const info = await this.info(plugin);
|
|
151
153
|
if (info.fields.length === 0) {
|
|
152
154
|
throw new ApiError("extension.config_invalid", `Extension ${plugin} has no deployment config`);
|
|
@@ -156,14 +158,16 @@ let ExtensionDeploymentConfigService = class ExtensionDeploymentConfigService {
|
|
|
156
158
|
if (unknown.length > 0) {
|
|
157
159
|
throw new ApiError("extension.config_invalid", `Unknown deployment config fields for extension ${plugin}`, unknown.map((path) => ({ path, message: "unknown field" })));
|
|
158
160
|
}
|
|
161
|
+
this.checkSecretEntries(plugin, info, values, secretEntries);
|
|
159
162
|
const sources = this.sources[plugin];
|
|
160
|
-
const
|
|
163
|
+
const entryPaths = [...new Set(secretEntries.map((e) => e.path))];
|
|
164
|
+
const readonly = [...Object.keys(values), ...entryPaths].filter((p) => fieldSource(sources, p) !== undefined);
|
|
161
165
|
if (readonly.length > 0) {
|
|
162
166
|
throw new ApiError("extension.config_readonly", `These deployment config fields of extension ${plugin} are set in the startup config (file, Nacos or environment) and are read-only here: ${readonly.join(", ")}`, readonly.map((path) => ({ path, source: fieldSource(sources, path) })));
|
|
163
167
|
}
|
|
164
168
|
const fileValue = this.fileConfig()[plugin];
|
|
165
169
|
const fieldPaths = info.fields.map((f) => f.path);
|
|
166
|
-
const { saved, changed } = await this.write(plugin, values, actor, actorTokenId, info, sources, fileValue);
|
|
170
|
+
const { saved, changed } = await this.write(plugin, values, secretEntries, actor, actorTokenId, info, sources, fileValue);
|
|
167
171
|
const stored = saved ?? {};
|
|
168
172
|
if (info.schema) {
|
|
169
173
|
const secrets = secretValues(info.schema, mergeDeploymentConfig(stored, fileValue, fieldPaths));
|
|
@@ -187,9 +191,38 @@ let ExtensionDeploymentConfigService = class ExtensionDeploymentConfigService {
|
|
|
187
191
|
});
|
|
188
192
|
}
|
|
189
193
|
}
|
|
190
|
-
return this.render(plugin, info, stored);
|
|
194
|
+
return this.render(plugin, info, stored, await this.displayNames.get(plugin));
|
|
191
195
|
}
|
|
192
|
-
|
|
196
|
+
/**
|
|
197
|
+
* Secret entries name a secret record field some hint names (else 400 `validation_failed`, also
|
|
198
|
+
* for a path given in `values` too, an entry with neither `value` nor `renameFrom`, or a key
|
|
199
|
+
* `__proto__`). Messages carry paths and keys only, never values.
|
|
200
|
+
*/
|
|
201
|
+
checkSecretEntries(plugin, info, values, entries) {
|
|
202
|
+
if (entries.length === 0)
|
|
203
|
+
return;
|
|
204
|
+
const hinted = this.hintedPaths(plugin, info);
|
|
205
|
+
const secret = new Set(secretPathsOf(info.fields));
|
|
206
|
+
const problems = [];
|
|
207
|
+
for (const e of entries) {
|
|
208
|
+
if (!hinted.has(e.path) || !secret.has(e.path)) {
|
|
209
|
+
problems.push({ path: e.path, message: "no config UI hint draws this secret per item" });
|
|
210
|
+
}
|
|
211
|
+
else if (Object.hasOwn(values, e.path)) {
|
|
212
|
+
problems.push({ path: e.path, message: "given both in values and in secretEntries" });
|
|
213
|
+
}
|
|
214
|
+
else if (e.value === undefined && e.renameFrom === undefined) {
|
|
215
|
+
problems.push({ path: e.path, message: `entry ${e.key} has neither value nor renameFrom` });
|
|
216
|
+
}
|
|
217
|
+
else if (e.key === "__proto__" || e.renameFrom === "__proto__") {
|
|
218
|
+
problems.push({ path: e.path, message: "__proto__ is not a valid key" });
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
if (problems.length > 0) {
|
|
222
|
+
throw new ApiError("validation_failed", `Invalid secret entries for the deployment config of extension ${plugin}`, problems);
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
async write(plugin, values, secretEntries, actor, actorTokenId, info, sources, fileValue) {
|
|
193
226
|
const fieldPaths = info.fields.map((f) => f.path);
|
|
194
227
|
let changed = [];
|
|
195
228
|
const t = this.db;
|
|
@@ -206,17 +239,20 @@ let ExtensionDeploymentConfigService = class ExtensionDeploymentConfigService {
|
|
|
206
239
|
else
|
|
207
240
|
setDeep(next, path, structuredClone(v));
|
|
208
241
|
}
|
|
242
|
+
applySecretEntries(next, secretEntries);
|
|
243
|
+
const touched = new Set([...Object.keys(values), ...secretEntries.map((e) => e.path)]);
|
|
209
244
|
if (info.schema) {
|
|
210
|
-
|
|
245
|
+
// overridable fields may stay empty on the platform (spec A §5.4a)
|
|
246
|
+
const r = parseLoadGate(info.schema, mergeDeploymentConfig(next, fileValue, fieldPaths));
|
|
211
247
|
if (!r.success) {
|
|
212
248
|
// 启动配置里只读字段自己的问题这里改不了(照样保存,插件保持待配置),其余拒绝
|
|
213
|
-
const issues = toIssues(r.error).filter((i) => i.path === "" || fieldSource(sources, i.path) === undefined);
|
|
249
|
+
const issues = toIssues(r.error, this.messagesOf(plugin, info)).filter((i) => i.path === "" || fieldSource(sources, i.path) === undefined);
|
|
214
250
|
if (issues.length > 0) {
|
|
215
251
|
throw new ApiError("extension.config_invalid", `Invalid deployment config for extension ${plugin}`, issues);
|
|
216
252
|
}
|
|
217
253
|
}
|
|
218
254
|
}
|
|
219
|
-
changed =
|
|
255
|
+
changed = [...touched]
|
|
220
256
|
.filter((p) => !isDeepStrictEqual(getPath(before, p), getPath(next, p)))
|
|
221
257
|
.sort();
|
|
222
258
|
const saved = next;
|
|
@@ -228,7 +264,7 @@ let ExtensionDeploymentConfigService = class ExtensionDeploymentConfigService {
|
|
|
228
264
|
if (!f.secret)
|
|
229
265
|
continue;
|
|
230
266
|
deleteDeep(plain, f.path);
|
|
231
|
-
if (!(f.path
|
|
267
|
+
if (!touched.has(f.path))
|
|
232
268
|
continue;
|
|
233
269
|
const v = getPath(next, f.path);
|
|
234
270
|
if (v === undefined)
|
|
@@ -261,7 +297,7 @@ let ExtensionDeploymentConfigService = class ExtensionDeploymentConfigService {
|
|
|
261
297
|
}
|
|
262
298
|
return info;
|
|
263
299
|
}
|
|
264
|
-
render(plugin, info, stored) {
|
|
300
|
+
render(plugin, info, stored, displayName) {
|
|
265
301
|
const fileValue = this.fileConfig()[plugin];
|
|
266
302
|
const sources = this.sources[plugin];
|
|
267
303
|
const raw = mergeDeploymentConfig(stored, fileValue, info.fields.map((f) => f.path));
|
|
@@ -269,14 +305,18 @@ let ExtensionDeploymentConfigService = class ExtensionDeploymentConfigService {
|
|
|
269
305
|
let valid = true;
|
|
270
306
|
let issues = [];
|
|
271
307
|
if (info.schema) {
|
|
272
|
-
|
|
308
|
+
// the load gate: overridable fields may stay empty (spec A §5.4a)
|
|
309
|
+
const r = parseLoadGate(info.schema, raw);
|
|
273
310
|
if (r.success)
|
|
274
311
|
effective = r.data;
|
|
275
312
|
else {
|
|
276
313
|
valid = false;
|
|
277
|
-
issues = toIssues(r.error);
|
|
314
|
+
issues = toIssues(r.error, this.messagesOf(plugin, info));
|
|
278
315
|
}
|
|
279
316
|
}
|
|
317
|
+
const formSchema = this.formSchemaOf(plugin, info);
|
|
318
|
+
const hinted = formSchema ? hintedSecretPaths(formSchema) : new Set();
|
|
319
|
+
const levels = levelsOf(info);
|
|
280
320
|
const fields = info.fields.map((f) => {
|
|
281
321
|
const from = fieldSource(sources, f.path);
|
|
282
322
|
let value = getPath(effective, f.path);
|
|
@@ -291,28 +331,72 @@ let ExtensionDeploymentConfigService = class ExtensionDeploymentConfigService {
|
|
|
291
331
|
value = d.value;
|
|
292
332
|
source = value === undefined ? "unset" : "default";
|
|
293
333
|
}
|
|
334
|
+
const level = levels.get(f.path.split(".")[0]);
|
|
294
335
|
const base = {
|
|
295
336
|
path: f.path,
|
|
296
337
|
secret: f.secret,
|
|
297
338
|
hot: f.hot,
|
|
298
339
|
source,
|
|
299
340
|
readonly: from !== undefined,
|
|
341
|
+
...(level !== undefined && level !== "hidden" && { org: level }),
|
|
300
342
|
};
|
|
343
|
+
// a schema default (e.g. `secret(record).default({})`) is no secret anybody set
|
|
344
|
+
const set = value !== undefined && source !== "default";
|
|
345
|
+
if (f.secret && hinted.has(f.path)) {
|
|
346
|
+
// record keys are item names, never values
|
|
347
|
+
return { ...base, set, keys: set && isObj(value) ? Object.keys(value).sort() : [] };
|
|
348
|
+
}
|
|
301
349
|
if (f.secret)
|
|
302
|
-
return { ...base, set
|
|
350
|
+
return { ...base, set };
|
|
303
351
|
return value === undefined ? base : { ...base, value: structuredClone(value) };
|
|
304
352
|
});
|
|
305
353
|
return {
|
|
306
354
|
plugin,
|
|
355
|
+
displayName,
|
|
307
356
|
version: info.version,
|
|
308
357
|
configurable: info.fields.length > 0,
|
|
309
358
|
fields,
|
|
310
|
-
schema:
|
|
359
|
+
schema: structuredClone(formSchema ?? null),
|
|
311
360
|
valid,
|
|
312
361
|
validated: info.schema !== undefined,
|
|
313
362
|
issues,
|
|
363
|
+
orgMustConfigure: orgMustConfigureOf(info, raw, levels),
|
|
314
364
|
};
|
|
315
365
|
}
|
|
366
|
+
/**
|
|
367
|
+
* The required `override` fields the platform left empty ({@link DeploymentConfigView}
|
|
368
|
+
* `orgMustConfigure`); reads nothing when the extension has no `override` field. Unknown to the
|
|
369
|
+
* deployment -> `extension.not_found`.
|
|
370
|
+
*/
|
|
371
|
+
async orgMustConfigure(plugin) {
|
|
372
|
+
const info = await this.info(plugin);
|
|
373
|
+
const levels = levelsOf(info);
|
|
374
|
+
if (![...levels.values()].includes("override"))
|
|
375
|
+
return [];
|
|
376
|
+
const stored = await this.readStored(plugin, info);
|
|
377
|
+
const raw = mergeDeploymentConfig(stored, this.fileConfig()[plugin], info.fields.map((f) => f.path));
|
|
378
|
+
return orgMustConfigureOf(info, raw, levels);
|
|
379
|
+
}
|
|
380
|
+
/**
|
|
381
|
+
* The form JSON Schema of the description: the zod schema's, else the package's static one. A
|
|
382
|
+
* hint conversion that throws (a hand-made package) drops the hints: the plain schema, or none
|
|
383
|
+
* when even the conversion fails; one warning per schema. Never throws.
|
|
384
|
+
*/
|
|
385
|
+
formSchemaOf(plugin, info) {
|
|
386
|
+
if (!info.schema)
|
|
387
|
+
return info.jsonSchema;
|
|
388
|
+
const r = safeConfigFormSchema(info.schema, "deployment", (err, schema) => this.log.warn("the deployment config form schema could not be built with its UI hints; hints dropped", { plugin, version: info.version, schema, err }));
|
|
389
|
+
return r?.schema;
|
|
390
|
+
}
|
|
391
|
+
messagesOf(plugin, info) {
|
|
392
|
+
const js = this.formSchemaOf(plugin, info);
|
|
393
|
+
return js && configMessages(js);
|
|
394
|
+
}
|
|
395
|
+
/** The secret record paths some hint of the form schema names. */
|
|
396
|
+
hintedPaths(plugin, info) {
|
|
397
|
+
const js = this.formSchemaOf(plugin, info);
|
|
398
|
+
return js ? hintedSecretPaths(js) : new Set();
|
|
399
|
+
}
|
|
316
400
|
};
|
|
317
401
|
__decorate([
|
|
318
402
|
Transactional({
|
|
@@ -328,7 +412,7 @@ ExtensionDeploymentConfigService = __decorate([
|
|
|
328
412
|
Injectable(),
|
|
329
413
|
__param(0, Inject(KernelDb)),
|
|
330
414
|
__param(1, Inject(TransactionHost)),
|
|
331
|
-
__param(2, Inject(
|
|
415
|
+
__param(2, Inject(SuperAdminLock)),
|
|
332
416
|
__param(3, Inject(PluginDeploymentConfigLock)),
|
|
333
417
|
__param(4, Inject(KEYRING)),
|
|
334
418
|
__param(5, Inject(KernelConfigService)),
|
|
@@ -337,11 +421,58 @@ ExtensionDeploymentConfigService = __decorate([
|
|
|
337
421
|
__param(8, Inject(ExtensionLifecycle)),
|
|
338
422
|
__param(9, Inject(KERNEL_BUS)),
|
|
339
423
|
__param(10, Inject(KERNEL_LOGGER)),
|
|
340
|
-
__param(11, Inject(KERNEL_APP_OPTIONS))
|
|
424
|
+
__param(11, Inject(KERNEL_APP_OPTIONS)),
|
|
425
|
+
__param(12, Inject(ExtensionDisplayNames))
|
|
341
426
|
], ExtensionDeploymentConfigService);
|
|
342
427
|
export { ExtensionDeploymentConfigService };
|
|
428
|
+
/** The org level of each top-level key: from the zod schema, else the package's form schema. */
|
|
429
|
+
function levelsOf(info) {
|
|
430
|
+
return info.schema
|
|
431
|
+
? fieldLevels(info.schema)
|
|
432
|
+
: jsonSchemaFieldLevels(info.jsonSchema);
|
|
433
|
+
}
|
|
434
|
+
/**
|
|
435
|
+
* The required `override` keys `raw` leaves empty: by the zod schema, else (a static form schema)
|
|
436
|
+
* the `required` keys marked `override` that have no value.
|
|
437
|
+
*/
|
|
438
|
+
function orgMustConfigureOf(info, raw, levels) {
|
|
439
|
+
if (info.schema)
|
|
440
|
+
return missingOverridable(info.schema, raw);
|
|
441
|
+
const required = info.jsonSchema?.required;
|
|
442
|
+
if (!Array.isArray(required))
|
|
443
|
+
return [];
|
|
444
|
+
return [...levels]
|
|
445
|
+
.filter(([k, l]) => l === "override" && required.includes(k) && getPath(raw, k) === undefined)
|
|
446
|
+
.map(([k]) => k);
|
|
447
|
+
}
|
|
448
|
+
/**
|
|
449
|
+
* Applies secret entries in order to the decrypted config `next` (in place): each record is read
|
|
450
|
+
* from `next` at its path, renamed, set or removed, and put back; an empty record is removed (the
|
|
451
|
+
* field falls back to its default).
|
|
452
|
+
*/
|
|
453
|
+
export function applySecretEntries(next, entries) {
|
|
454
|
+
for (const e of entries) {
|
|
455
|
+
const cur = getPath(next, e.path);
|
|
456
|
+
const rec = isObj(cur) ? { ...cur } : {};
|
|
457
|
+
if (e.renameFrom !== undefined && e.renameFrom !== e.key && Object.hasOwn(rec, e.renameFrom)) {
|
|
458
|
+
rec[e.key] = rec[e.renameFrom];
|
|
459
|
+
delete rec[e.renameFrom];
|
|
460
|
+
}
|
|
461
|
+
if (e.value === null)
|
|
462
|
+
delete rec[e.key];
|
|
463
|
+
else if (e.value !== undefined)
|
|
464
|
+
rec[e.key] = e.value;
|
|
465
|
+
if (Object.keys(rec).length === 0)
|
|
466
|
+
deleteDeep(next, e.path);
|
|
467
|
+
else
|
|
468
|
+
setDeep(next, e.path, rec);
|
|
469
|
+
}
|
|
470
|
+
}
|
|
343
471
|
/**
|
|
344
472
|
* 本副本拿不到模块时(未加载的安装记录)按包内审阅过的静态清单给出字段(没有 zod schema:不校验,加载时再校验)。
|
|
473
|
+
* The package's `extension.configSchemas.deployment` (written by the packer) is the form schema;
|
|
474
|
+
* its hints are checked like a loaded schema's (stripped when invalid, silently: a hand-made
|
|
475
|
+
* package). It is not compared with the module (not part of `manifest_mismatch`, spec §4.5).
|
|
345
476
|
*/
|
|
346
477
|
export async function staticDeploymentSchema(db, plugin) {
|
|
347
478
|
const row = await db
|
|
@@ -355,8 +486,15 @@ export async function staticDeploymentSchema(db, plugin) {
|
|
|
355
486
|
// new rows hold the plugin's extension section, pre-0.1.0 rows the old capybara section; both
|
|
356
487
|
// carry the static manifest
|
|
357
488
|
const section = row.section;
|
|
489
|
+
const stored = section.configSchemas?.deployment;
|
|
490
|
+
let jsonSchema;
|
|
491
|
+
if (typeof stored === "object" && stored !== null && !Array.isArray(stored)) {
|
|
492
|
+
jsonSchema = structuredClone(stored);
|
|
493
|
+
checkConfigUi(jsonSchema, "deployment");
|
|
494
|
+
}
|
|
358
495
|
return {
|
|
359
496
|
version: row.version,
|
|
497
|
+
...(jsonSchema !== undefined && { jsonSchema }),
|
|
360
498
|
fields: (section.manifest.config?.deployment ?? []).map((f) => ({
|
|
361
499
|
path: f.path,
|
|
362
500
|
secret: f.secret,
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { LocalizedName } from "@capybara-hq/plugin-sdk";
|
|
2
|
+
import { KernelDb } from "../infra/database/kernel-db.js";
|
|
3
|
+
import { ExtensionHost } from "./host.js";
|
|
4
|
+
/**
|
|
5
|
+
* Extension display names (extension config forms spec §2.2), the one resolver every extension and
|
|
6
|
+
* model API uses: a config-declared extension's plugin.json (read by this replica's host at load,
|
|
7
|
+
* the same on every replica), else the installed package's `display_name`, else the live catalog
|
|
8
|
+
* item of the same name, else null. No backfill: a package stored before 0066 gets a name with its
|
|
9
|
+
* next version. Stateless; one query per call.
|
|
10
|
+
*/
|
|
11
|
+
export declare class ExtensionDisplayNames {
|
|
12
|
+
private readonly db;
|
|
13
|
+
/** The config-declared extensions (they win over an install record of the same name, C15). */
|
|
14
|
+
private readonly host;
|
|
15
|
+
constructor(db: KernelDb,
|
|
16
|
+
/** The config-declared extensions (they win over an install record of the same name, C15). */
|
|
17
|
+
host: ExtensionHost);
|
|
18
|
+
/** One extension's display name. */
|
|
19
|
+
get(name: string): Promise<LocalizedName | null>;
|
|
20
|
+
/** The display names of `names` (each one a key, null when it has none), in one query. */
|
|
21
|
+
many(names: string[]): Promise<Map<string, LocalizedName | null>>;
|
|
22
|
+
}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
8
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
9
|
+
};
|
|
10
|
+
import { Inject, Injectable } from "@nestjs/common";
|
|
11
|
+
import { sql } from "kysely";
|
|
12
|
+
import { KernelDb } from "../infra/database/kernel-db.js";
|
|
13
|
+
import { ExtensionHost } from "./host.js";
|
|
14
|
+
/**
|
|
15
|
+
* Extension display names (extension config forms spec §2.2), the one resolver every extension and
|
|
16
|
+
* model API uses: a config-declared extension's plugin.json (read by this replica's host at load,
|
|
17
|
+
* the same on every replica), else the installed package's `display_name`, else the live catalog
|
|
18
|
+
* item of the same name, else null. No backfill: a package stored before 0066 gets a name with its
|
|
19
|
+
* next version. Stateless; one query per call.
|
|
20
|
+
*/
|
|
21
|
+
let ExtensionDisplayNames = class ExtensionDisplayNames {
|
|
22
|
+
db;
|
|
23
|
+
host;
|
|
24
|
+
constructor(db,
|
|
25
|
+
/** The config-declared extensions (they win over an install record of the same name, C15). */
|
|
26
|
+
host) {
|
|
27
|
+
this.db = db;
|
|
28
|
+
this.host = host;
|
|
29
|
+
}
|
|
30
|
+
/** One extension's display name. */
|
|
31
|
+
async get(name) {
|
|
32
|
+
return (await this.many([name])).get(name) ?? null;
|
|
33
|
+
}
|
|
34
|
+
/** The display names of `names` (each one a key, null when it has none), in one query. */
|
|
35
|
+
async many(names) {
|
|
36
|
+
const out = new Map();
|
|
37
|
+
if (names.length === 0)
|
|
38
|
+
return out;
|
|
39
|
+
const declared = new Map(this.host.declaredPlugins().map((p) => [p.name, p]));
|
|
40
|
+
const rest = [];
|
|
41
|
+
for (const n of new Set(names)) {
|
|
42
|
+
const d = declared.get(n);
|
|
43
|
+
if (d)
|
|
44
|
+
out.set(n, d.displayName);
|
|
45
|
+
else
|
|
46
|
+
rest.push(n);
|
|
47
|
+
}
|
|
48
|
+
if (rest.length === 0)
|
|
49
|
+
return out;
|
|
50
|
+
const rows = await this.db
|
|
51
|
+
.selectFrom("extension_installs")
|
|
52
|
+
.innerJoin("extension_packages", "extension_packages.sha256", "extension_installs.sha256")
|
|
53
|
+
.select([
|
|
54
|
+
"extension_installs.name as name",
|
|
55
|
+
"extension_packages.display_name as display_name",
|
|
56
|
+
sql `0`.as("rank"),
|
|
57
|
+
])
|
|
58
|
+
.where("extension_installs.name", "in", rest)
|
|
59
|
+
.unionAll((eb) => eb
|
|
60
|
+
.selectFrom("catalog_items")
|
|
61
|
+
.select(["name", "display_name", sql `1`.as("rank")])
|
|
62
|
+
.where("name", "in", rest)
|
|
63
|
+
.where("deleted_at", "is", null))
|
|
64
|
+
.execute();
|
|
65
|
+
rows.sort((a, b) => Number(a.rank) - Number(b.rank));
|
|
66
|
+
for (const n of rest) {
|
|
67
|
+
out.set(n, rows.find((r) => r.name === n && r.display_name !== null)?.display_name ?? null);
|
|
68
|
+
}
|
|
69
|
+
return out;
|
|
70
|
+
}
|
|
71
|
+
};
|
|
72
|
+
ExtensionDisplayNames = __decorate([
|
|
73
|
+
Injectable(),
|
|
74
|
+
__param(0, Inject(KernelDb)),
|
|
75
|
+
__param(1, Inject(ExtensionHost))
|
|
76
|
+
], ExtensionDisplayNames);
|
|
77
|
+
export { ExtensionDisplayNames };
|