@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
|
@@ -35,7 +35,7 @@ import { ExtensionRegistry } from "./registry.js";
|
|
|
35
35
|
* manifest's sha256 (written with the audit `bootstrap.completed` only when every entry
|
|
36
36
|
* succeeded; otherwise the next start runs it again, which is idempotent).
|
|
37
37
|
* - Only entries new to the manifest are installed (Ruling 5): an optional entry that the last
|
|
38
|
-
* completed run already handled and that is not installed now (
|
|
38
|
+
* completed run already handled and that is not installed now (a super admin uninstalled
|
|
39
39
|
* it) stays uninstalled -> `kept`. A required entry is always installed.
|
|
40
40
|
* - Per entry, by the installed state of its extension:
|
|
41
41
|
* - not installed (and new, or required): imported into the catalog (source `bootstrap`, ref
|
|
@@ -44,8 +44,8 @@ import { ExtensionRegistry } from "./registry.js";
|
|
|
44
44
|
* and enabled -> `installed`;
|
|
45
45
|
* - installed from `bootstrap` at a lower version: upgraded the same way (core's release vouched
|
|
46
46
|
* for the version, so new permissions are pre-approved and audited), keeping the desired state
|
|
47
|
-
*
|
|
48
|
-
* - installed at a higher version, or from another source (
|
|
47
|
+
* a super admin chose (a disabled optional plugin stays disabled) -> `upgraded`;
|
|
48
|
+
* - installed at a higher version, or from another source (a super admin upgraded it), or
|
|
49
49
|
* the name is config-declared (`declared`: config wins, no install record is created):
|
|
50
50
|
* untouched, never downgraded -> `kept`;
|
|
51
51
|
* - a declarative plugin (no extension): imported into the catalog only -> `imported` (`kept`
|
|
@@ -175,6 +175,12 @@ export declare class BootstrapService {
|
|
|
175
175
|
/** The plugin import a declarative entry (or an entry's catalog version) goes through. */
|
|
176
176
|
imports: BootstrapImports;
|
|
177
177
|
}): Promise<BootstrapResult>;
|
|
178
|
+
/**
|
|
179
|
+
* A pin whose plugin name an org holds (a live org-owned catalog item): the bootstrap takes no
|
|
180
|
+
* name over (ruling P3-28), so the entry fails; this warning tells the super admin why and
|
|
181
|
+
* which org holds it (final review M4).
|
|
182
|
+
*/
|
|
183
|
+
private warnIfHeld;
|
|
178
184
|
/** The `bootstrap_runs` row and the `bootstrap.completed` audit, in one transaction. */
|
|
179
185
|
private recordDone;
|
|
180
186
|
/**
|
|
@@ -186,10 +192,17 @@ export declare class BootstrapService {
|
|
|
186
192
|
/** The entry names the last completed run handled (undefined before any run completed). */
|
|
187
193
|
private lastRunNames;
|
|
188
194
|
private entry;
|
|
195
|
+
/**
|
|
196
|
+
* The catalog item of a bootstrap entry follows `required`: a required entry is builtin, offered
|
|
197
|
+
* to every org (scope `all`) and not disabled (migration 0075 could leave a required plugin
|
|
198
|
+
* disabled); an entry that stops being required is no longer builtin and keeps scope `all` (the
|
|
199
|
+
* admin may change it from then on).
|
|
200
|
+
*/
|
|
201
|
+
private markBuiltin;
|
|
189
202
|
/** A declarative plugin: catalog only. Returns false when that version is already imported. */
|
|
190
203
|
private importOnly;
|
|
191
204
|
/**
|
|
192
|
-
* Imports, approves, installs and enables (one review
|
|
205
|
+
* Imports, approves, installs and enables (one review; its confirm deploys the extension). When
|
|
193
206
|
* the catalog already has this version (an earlier run stopped after importing, or the same
|
|
194
207
|
* package came from a marketplace), the extension is deployed from the package store instead.
|
|
195
208
|
*/
|
|
@@ -15,6 +15,7 @@ import { parseBootstrapManifest, SDK_VERSION, } from "@capybara-hq/plugin-sdk";
|
|
|
15
15
|
import { Inject, Injectable, Optional } from "@nestjs/common";
|
|
16
16
|
import { sql } from "kysely";
|
|
17
17
|
import semver from "semver";
|
|
18
|
+
import { otherNameOwner } from "../catalog/ownership.js";
|
|
18
19
|
import { catalogPackageError } from "../catalog/plugin-import.js";
|
|
19
20
|
import { PluginPackageError, readPluginPackage } from "../catalog/plugin-package.js";
|
|
20
21
|
import { ApiError } from "../errors.js";
|
|
@@ -57,7 +58,7 @@ import { ExtensionRegistry } from "./registry.js";
|
|
|
57
58
|
* manifest's sha256 (written with the audit `bootstrap.completed` only when every entry
|
|
58
59
|
* succeeded; otherwise the next start runs it again, which is idempotent).
|
|
59
60
|
* - Only entries new to the manifest are installed (Ruling 5): an optional entry that the last
|
|
60
|
-
* completed run already handled and that is not installed now (
|
|
61
|
+
* completed run already handled and that is not installed now (a super admin uninstalled
|
|
61
62
|
* it) stays uninstalled -> `kept`. A required entry is always installed.
|
|
62
63
|
* - Per entry, by the installed state of its extension:
|
|
63
64
|
* - not installed (and new, or required): imported into the catalog (source `bootstrap`, ref
|
|
@@ -66,8 +67,8 @@ import { ExtensionRegistry } from "./registry.js";
|
|
|
66
67
|
* and enabled -> `installed`;
|
|
67
68
|
* - installed from `bootstrap` at a lower version: upgraded the same way (core's release vouched
|
|
68
69
|
* for the version, so new permissions are pre-approved and audited), keeping the desired state
|
|
69
|
-
*
|
|
70
|
-
* - installed at a higher version, or from another source (
|
|
70
|
+
* a super admin chose (a disabled optional plugin stays disabled) -> `upgraded`;
|
|
71
|
+
* - installed at a higher version, or from another source (a super admin upgraded it), or
|
|
71
72
|
* the name is config-declared (`declared`: config wins, no install record is created):
|
|
72
73
|
* untouched, never downgraded -> `kept`;
|
|
73
74
|
* - a declarative plugin (no extension): imported into the catalog only -> `imported` (`kept`
|
|
@@ -306,6 +307,7 @@ let BootstrapService = class BootstrapService {
|
|
|
306
307
|
const failures = [];
|
|
307
308
|
for (const e of o.manifest.plugins) {
|
|
308
309
|
signal.throwIfAborted();
|
|
310
|
+
await this.warnIfHeld(e);
|
|
309
311
|
try {
|
|
310
312
|
const r = await this.entry(e, files.get(e.name), handled, o.imports);
|
|
311
313
|
results.push(carried(r, o.carry));
|
|
@@ -334,6 +336,23 @@ let BootstrapService = class BootstrapService {
|
|
|
334
336
|
return { manifestSha256, results };
|
|
335
337
|
});
|
|
336
338
|
}
|
|
339
|
+
/**
|
|
340
|
+
* A pin whose plugin name an org holds (a live org-owned catalog item): the bootstrap takes no
|
|
341
|
+
* name over (ruling P3-28), so the entry fails; this warning tells the super admin why and
|
|
342
|
+
* which org holds it (final review M4).
|
|
343
|
+
*/
|
|
344
|
+
async warnIfHeld(e) {
|
|
345
|
+
const holder = await otherNameOwner(this.db, e.name, null);
|
|
346
|
+
if (holder?.kind !== "org")
|
|
347
|
+
return;
|
|
348
|
+
this.log.warn("bootstrap: the plugin name is held by an organization; the entry cannot take it over until the organization renames or deletes its plugin", {
|
|
349
|
+
plugin: e.name,
|
|
350
|
+
version: e.version,
|
|
351
|
+
required: e.required,
|
|
352
|
+
ownerOrgId: holder.orgId,
|
|
353
|
+
ownerOrg: holder.name,
|
|
354
|
+
});
|
|
355
|
+
}
|
|
337
356
|
/** The `bootstrap_runs` row and the `bootstrap.completed` audit, in one transaction. */
|
|
338
357
|
async recordDone(manifestSha256, results) {
|
|
339
358
|
await this.db
|
|
@@ -400,9 +419,11 @@ let BootstrapService = class BootstrapService {
|
|
|
400
419
|
// Not new to the manifest: an optional entry left out on purpose stays out (Ruling 5)
|
|
401
420
|
const isNew = handled === undefined || !handled.has(e.name);
|
|
402
421
|
if (!pkg.manifest.extension) {
|
|
422
|
+
await this.markBuiltin(e.name, e.required);
|
|
403
423
|
if (!isNew)
|
|
404
424
|
return { name: e.name, action: "kept", version: e.version };
|
|
405
425
|
const imported = await this.importOnly(e, bytes, ref, imports);
|
|
426
|
+
await this.markBuiltin(e.name, e.required);
|
|
406
427
|
return { name: e.name, action: imported ? "imported" : "kept", version: e.version };
|
|
407
428
|
}
|
|
408
429
|
if (this.registry.declared().has(e.name)) {
|
|
@@ -451,8 +472,41 @@ let BootstrapService = class BootstrapService {
|
|
|
451
472
|
if (e.required && row?.desired_state === "disabled") {
|
|
452
473
|
await this.ops.enable(e.name, null);
|
|
453
474
|
}
|
|
475
|
+
await this.markBuiltin(e.name, e.required);
|
|
454
476
|
return result;
|
|
455
477
|
}
|
|
478
|
+
/**
|
|
479
|
+
* The catalog item of a bootstrap entry follows `required`: a required entry is builtin, offered
|
|
480
|
+
* to every org (scope `all`) and not disabled (migration 0075 could leave a required plugin
|
|
481
|
+
* disabled); an entry that stops being required is no longer builtin and keeps scope `all` (the
|
|
482
|
+
* admin may change it from then on).
|
|
483
|
+
*/
|
|
484
|
+
async markBuiltin(name, required) {
|
|
485
|
+
const touch = { updated_at: sql `now()` };
|
|
486
|
+
if (required) {
|
|
487
|
+
await this.db
|
|
488
|
+
.updateTable("catalog_items")
|
|
489
|
+
.set({
|
|
490
|
+
builtin: true,
|
|
491
|
+
scope: "all",
|
|
492
|
+
disabled: false,
|
|
493
|
+
scope_version: sql `scope_version + 1`,
|
|
494
|
+
...touch,
|
|
495
|
+
})
|
|
496
|
+
.where("name", "=", name)
|
|
497
|
+
.where("deleted_at", "is", null)
|
|
498
|
+
.where((eb) => eb.or([eb("builtin", "=", false), eb("scope", "<>", "all"), eb("disabled", "=", true)]))
|
|
499
|
+
.execute();
|
|
500
|
+
return;
|
|
501
|
+
}
|
|
502
|
+
await this.db
|
|
503
|
+
.updateTable("catalog_items")
|
|
504
|
+
.set({ builtin: false, ...touch })
|
|
505
|
+
.where("name", "=", name)
|
|
506
|
+
.where("deleted_at", "is", null)
|
|
507
|
+
.where("builtin", "=", true)
|
|
508
|
+
.execute();
|
|
509
|
+
}
|
|
456
510
|
/** A declarative plugin: catalog only. Returns false when that version is already imported. */
|
|
457
511
|
async importOnly(e, bytes, ref, imports) {
|
|
458
512
|
try {
|
|
@@ -461,10 +515,7 @@ let BootstrapService = class BootstrapService {
|
|
|
461
515
|
ref,
|
|
462
516
|
integrity: e.integrity,
|
|
463
517
|
});
|
|
464
|
-
await imports.confirm(null, stagingId, {
|
|
465
|
-
reviewHash: review.reviewHash,
|
|
466
|
-
deployExtension: false,
|
|
467
|
-
});
|
|
518
|
+
await imports.confirm(null, stagingId, { reviewHash: review.reviewHash });
|
|
468
519
|
return true;
|
|
469
520
|
}
|
|
470
521
|
catch (err) {
|
|
@@ -474,7 +525,7 @@ let BootstrapService = class BootstrapService {
|
|
|
474
525
|
}
|
|
475
526
|
}
|
|
476
527
|
/**
|
|
477
|
-
* Imports, approves, installs and enables (one review
|
|
528
|
+
* Imports, approves, installs and enables (one review; its confirm deploys the extension). When
|
|
478
529
|
* the catalog already has this version (an earlier run stopped after importing, or the same
|
|
479
530
|
* package came from a marketplace), the extension is deployed from the package store instead.
|
|
480
531
|
*/
|
|
@@ -496,7 +547,6 @@ let BootstrapService = class BootstrapService {
|
|
|
496
547
|
}
|
|
497
548
|
const r = await imports.confirm(null, staged.stagingId, {
|
|
498
549
|
reviewHash: staged.review.reviewHash,
|
|
499
|
-
deployExtension: true,
|
|
500
550
|
enable,
|
|
501
551
|
});
|
|
502
552
|
if (r.deploy?.result === "failed") {
|
|
@@ -552,6 +602,17 @@ let BootstrapService = class BootstrapService {
|
|
|
552
602
|
if (names.length > 0)
|
|
553
603
|
q = q.where("name", "not in", names);
|
|
554
604
|
const rows = await q.returning(["name", "version"]).execute();
|
|
605
|
+
for (const r of rows)
|
|
606
|
+
await this.markBuiltin(r.name, false);
|
|
607
|
+
// A declarative plugin has no install record: clear builtin by catalog name
|
|
608
|
+
let items = this.db
|
|
609
|
+
.updateTable("catalog_items")
|
|
610
|
+
.set({ builtin: false, updated_at: sql `now()` })
|
|
611
|
+
.where("builtin", "=", true)
|
|
612
|
+
.where("deleted_at", "is", null);
|
|
613
|
+
if (names.length > 0)
|
|
614
|
+
items = items.where("name", "not in", names);
|
|
615
|
+
await items.execute();
|
|
555
616
|
return rows.map((r) => ({ name: r.name, action: "required_cleared", version: r.version }));
|
|
556
617
|
}
|
|
557
618
|
};
|
package/dist/extensions/cli.d.ts
CHANGED
|
@@ -54,6 +54,18 @@ export interface ExtensionCli {
|
|
|
54
54
|
publishChanged(plugin: string): Promise<boolean>;
|
|
55
55
|
close(): Promise<void>;
|
|
56
56
|
}
|
|
57
|
+
/**
|
|
58
|
+
* The effective deployment config (the startup config `fileValue` completed by the `stored` PG
|
|
59
|
+
* fields) parsed as the host's load gate does: overridable fields may stay empty (spec A §5.4a),
|
|
60
|
+
* hidden and read-only ones must be complete.
|
|
61
|
+
*/
|
|
62
|
+
export declare function parseDeploymentConfig(schema: z.ZodTypeAny, stored: Record<string, unknown>, fileValue: unknown): {
|
|
63
|
+
ok: true;
|
|
64
|
+
value: unknown;
|
|
65
|
+
} | {
|
|
66
|
+
ok: false;
|
|
67
|
+
issues: ConfigIssue[];
|
|
68
|
+
};
|
|
57
69
|
/**
|
|
58
70
|
* The CLI's extension management context (C18, F-Q): a Nest application context with
|
|
59
71
|
* the extensions module over the database and a lazy Redis connection used only for publishing
|
package/dist/extensions/cli.js
CHANGED
|
@@ -13,7 +13,17 @@ import { ExtensionsModule } from "./extensions.module.js";
|
|
|
13
13
|
import { ExtensionHost } from "./host.js";
|
|
14
14
|
import { ExtensionInstalls } from "./installs.js";
|
|
15
15
|
import { PLUGINS_CHANGED_TOPIC } from "./lifecycle-topics.js";
|
|
16
|
+
import { parseLoadGate } from "./org-levels.js";
|
|
16
17
|
import { ExtensionPackageError, extensionPackageApiError, permissionSetOfPackage, readExtensionPackage, } from "./package.js";
|
|
18
|
+
/**
|
|
19
|
+
* The effective deployment config (the startup config `fileValue` completed by the `stored` PG
|
|
20
|
+
* fields) parsed as the host's load gate does: overridable fields may stay empty (spec A §5.4a),
|
|
21
|
+
* hidden and read-only ones must be complete.
|
|
22
|
+
*/
|
|
23
|
+
export function parseDeploymentConfig(schema, stored, fileValue) {
|
|
24
|
+
const r = parseLoadGate(schema, mergeDeploymentConfig(stored, fileValue, schemaFields(schema).map((f) => f.path)));
|
|
25
|
+
return r.success ? { ok: true, value: r.data } : { ok: false, issues: toIssues(r.error) };
|
|
26
|
+
}
|
|
17
27
|
/**
|
|
18
28
|
* The CLI's extension management context (C18, F-Q): a Nest application context with
|
|
19
29
|
* the extensions module over the database and a lazy Redis connection used only for publishing
|
|
@@ -44,8 +54,7 @@ export async function openExtensionCli(config, log, opts = {}) {
|
|
|
44
54
|
const stored = await readStoredDeploymentConfig(db.db, keyring, name, {
|
|
45
55
|
secretPaths: secretPathsOf(schemaFields(schema)),
|
|
46
56
|
});
|
|
47
|
-
|
|
48
|
-
return r.success ? { ok: true, value: r.data } : { ok: false, issues: toIssues(r.error) };
|
|
57
|
+
return parseDeploymentConfig(schema, stored, config.extensionConfig[name]);
|
|
49
58
|
};
|
|
50
59
|
const configIssues = new Map();
|
|
51
60
|
const deploymentConfigs = new Map();
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { core } from "zod";
|
|
2
|
+
/**
|
|
3
|
+
* 插件部署配置(校验后)中非密钥部分的摘要:先把 schema 里所有 secret 叶子(`configFields` 可达路径,
|
|
4
|
+
* 加载时 `assertSecretsReachable` 已保证密钥都在这些路径上)换成固定占位值,再取 sha256(键排序 JSON) 前 16 位十六进制。
|
|
5
|
+
* 给需要「配置变了就失效」的缓存键用(如模型列表)。密钥不参与摘要:不加盐的短摘要写进 Redis 键名后,
|
|
6
|
+
* 低熵密钥可被离线猜测、泄露的密钥可被确认;代价是轮换密钥不会让缓存失效(缓存内容本来就不该依赖密钥)。
|
|
7
|
+
* 没有部署配置 schema 时无从得知哪些是密钥,摘要不按配置区分。同一份配置在各副本上得到同一摘要。
|
|
8
|
+
* 函数自己按 schema 遮蔽,调用方不必(也不能忘记)先打码。
|
|
9
|
+
*/
|
|
10
|
+
export declare function deploymentConfigHash(schema: core.$ZodType | undefined, config: unknown): string;
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { configFields, getPath, setPath } from "../config/fields.js";
|
|
3
|
+
/** 键排序后的 JSON(对象键顺序不影响结果);undefined 字段与 JSON.stringify 一样省略。 */
|
|
4
|
+
const canonicalJson = (v) => {
|
|
5
|
+
if (Array.isArray(v))
|
|
6
|
+
return `[${v.map((x) => (x === undefined ? "null" : canonicalJson(x))).join(",")}]`;
|
|
7
|
+
if (v !== null && typeof v === "object") {
|
|
8
|
+
const entries = Object.entries(v)
|
|
9
|
+
.filter(([, x]) => x !== undefined)
|
|
10
|
+
.sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0));
|
|
11
|
+
return `{${entries.map(([k, x]) => `${JSON.stringify(k)}:${canonicalJson(x)}`).join(",")}}`;
|
|
12
|
+
}
|
|
13
|
+
return JSON.stringify(v) ?? "null";
|
|
14
|
+
};
|
|
15
|
+
/** 遮蔽 secret 字段后参与摘要的固定占位值。 */
|
|
16
|
+
const SECRET_PLACEHOLDER = "<secret>";
|
|
17
|
+
/**
|
|
18
|
+
* 插件部署配置(校验后)中非密钥部分的摘要:先把 schema 里所有 secret 叶子(`configFields` 可达路径,
|
|
19
|
+
* 加载时 `assertSecretsReachable` 已保证密钥都在这些路径上)换成固定占位值,再取 sha256(键排序 JSON) 前 16 位十六进制。
|
|
20
|
+
* 给需要「配置变了就失效」的缓存键用(如模型列表)。密钥不参与摘要:不加盐的短摘要写进 Redis 键名后,
|
|
21
|
+
* 低熵密钥可被离线猜测、泄露的密钥可被确认;代价是轮换密钥不会让缓存失效(缓存内容本来就不该依赖密钥)。
|
|
22
|
+
* 没有部署配置 schema 时无从得知哪些是密钥,摘要不按配置区分。同一份配置在各副本上得到同一摘要。
|
|
23
|
+
* 函数自己按 schema 遮蔽,调用方不必(也不能忘记)先打码。
|
|
24
|
+
*/
|
|
25
|
+
export function deploymentConfigHash(schema, config) {
|
|
26
|
+
let redacted = null;
|
|
27
|
+
if (schema) {
|
|
28
|
+
redacted = structuredClone(config);
|
|
29
|
+
if (redacted !== null && typeof redacted === "object") {
|
|
30
|
+
for (const f of configFields(schema)) {
|
|
31
|
+
if (f.meta?.secret && getPath(redacted, f.path) !== undefined) {
|
|
32
|
+
setPath(redacted, f.path, SECRET_PLACEHOLDER);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
return createHash("sha256").update(canonicalJson(redacted)).digest("hex").slice(0, 16);
|
|
38
|
+
}
|
|
@@ -4,7 +4,7 @@ import type { KernelAppOptions } from "../app.js";
|
|
|
4
4
|
import { type ConfigSourceKind } from "../config/sources.js";
|
|
5
5
|
import { type Keyring } from "../ctx/secrets.js";
|
|
6
6
|
import type { KernelSchemaDb } from "../db/kernel-schema.js";
|
|
7
|
-
import {
|
|
7
|
+
import { SuperAdminLock } from "../identity/super-admin.js";
|
|
8
8
|
import { KernelConfigService } from "../infra/config/kernel-config.service.js";
|
|
9
9
|
import { KernelDb } from "../infra/database/kernel-db.js";
|
|
10
10
|
import { TransactionHost } from "../infra/database/transaction-host.js";
|
|
@@ -20,6 +20,7 @@ import { ExtensionLifecycle } from "./lifecycle.js";
|
|
|
20
20
|
import { PLUGIN_DEPLOYMENT_CONFIG_TOPIC } from "./lifecycle-topics.js";
|
|
21
21
|
import { PluginDeploymentConfigLock } from "./locks.js";
|
|
22
22
|
export { DEPLOYMENT_SECRETS_ORG, type DeploymentSchemaInfo, mergeDeploymentConfig, readStoredDeploymentConfig, schemaFields, secretPathsOf, };
|
|
23
|
+
type Obj = Record<string, unknown>;
|
|
23
24
|
export type { ConfigIssue };
|
|
24
25
|
export { PLUGIN_DEPLOYMENT_CONFIG_TOPIC };
|
|
25
26
|
/** 后台一个部署配置字段:来源、是否只读;非密钥字段给出生效值,密钥字段只给 `set`。 */
|
|
@@ -41,6 +42,11 @@ export interface DeploymentConfigField {
|
|
|
41
42
|
* (item names, not secret values; spec §4.3). Other secret fields report only `set`.
|
|
42
43
|
*/
|
|
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";
|
|
44
50
|
}
|
|
45
51
|
/**
|
|
46
52
|
* One operation on a secret record drawn per item (spec §4.3), only for a path some
|
|
@@ -76,6 +82,11 @@ export interface DeploymentConfigView {
|
|
|
76
82
|
validated: boolean;
|
|
77
83
|
/** 校验失败的原因(只有路径与说明,不含值)。 */
|
|
78
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[];
|
|
79
90
|
}
|
|
80
91
|
/**
|
|
81
92
|
* Deployment-level extension config (D8 / C10): non-secret fields are stored in
|
|
@@ -88,7 +99,7 @@ export interface DeploymentConfigView {
|
|
|
88
99
|
export declare class ExtensionDeploymentConfigService {
|
|
89
100
|
private readonly kdb;
|
|
90
101
|
readonly txHost: TransactionHost;
|
|
91
|
-
/** The
|
|
102
|
+
/** The super admin lock (identity/super-admin.ts): joins the transaction. */
|
|
92
103
|
private readonly adminLock;
|
|
93
104
|
private readonly configLock;
|
|
94
105
|
private readonly keyring;
|
|
@@ -106,8 +117,8 @@ export declare class ExtensionDeploymentConfigService {
|
|
|
106
117
|
/** Where each startup-config field comes from (see `extensionConfigSources`); those fields are read-only. */
|
|
107
118
|
private readonly sources;
|
|
108
119
|
constructor(kdb: KernelDb, txHost: TransactionHost,
|
|
109
|
-
/** The
|
|
110
|
-
adminLock:
|
|
120
|
+
/** The super admin lock (identity/super-admin.ts): joins the transaction. */
|
|
121
|
+
adminLock: SuperAdminLock, configLock: PluginDeploymentConfigLock, keyring: Keyring, config: KernelConfigService,
|
|
111
122
|
/** This replica's extension schemas (loaded, config-declared or prepared install records). */
|
|
112
123
|
host: ExtensionHost,
|
|
113
124
|
/** The effective (stored plus startup) deployment config. */
|
|
@@ -142,7 +153,7 @@ export declare class ExtensionDeploymentConfigService {
|
|
|
142
153
|
* is re-encrypted whole, then validated with `values`; the audit lists the record's path, no keys.
|
|
143
154
|
* A path no hint names -> 400 `validation_failed`; one in the startup config -> 409
|
|
144
155
|
* `extension.config_readonly`.
|
|
145
|
-
* In a transaction, first `
|
|
156
|
+
* In a transaction, first `lockSuperAdminsAndAuthorize` (re-checks the super admin under
|
|
146
157
|
* the lock), then an advisory lock per extension; audit `extension.deployment_config_updated`
|
|
147
158
|
* (detail only `changedPaths`). After the commit publishes {@link PLUGIN_DEPLOYMENT_CONFIG_TOPIC} and
|
|
148
159
|
* applies it on this replica right away.
|
|
@@ -157,6 +168,12 @@ export declare class ExtensionDeploymentConfigService {
|
|
|
157
168
|
private write;
|
|
158
169
|
private info;
|
|
159
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[]>;
|
|
160
177
|
/**
|
|
161
178
|
* The form JSON Schema of the description: the zod schema's, else the package's static one. A
|
|
162
179
|
* hint conversion that throws (a hand-made package) drops the hints: the plain schema, or none
|
|
@@ -167,6 +184,12 @@ export declare class ExtensionDeploymentConfigService {
|
|
|
167
184
|
/** The secret record paths some hint of the form schema names. */
|
|
168
185
|
private hintedPaths;
|
|
169
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;
|
|
170
193
|
/**
|
|
171
194
|
* 本副本拿不到模块时(未加载的安装记录)按包内审阅过的静态清单给出字段(没有 zod schema:不校验,加载时再校验)。
|
|
172
195
|
* The package's `extension.configSchemas.deployment` (written by the packer) is the form schema;
|
|
@@ -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";
|
|
@@ -30,6 +30,7 @@ import { ExtensionInstalls } from "./installs.js";
|
|
|
30
30
|
import { ExtensionLifecycle } from "./lifecycle.js";
|
|
31
31
|
import { PLUGIN_DEPLOYMENT_CONFIG_TOPIC } from "./lifecycle-topics.js";
|
|
32
32
|
import { PluginDeploymentConfigLock } from "./locks.js";
|
|
33
|
+
import { fieldLevels, jsonSchemaFieldLevels, missingOverridable, parseLoadGate, } from "./org-levels.js";
|
|
33
34
|
export { DEPLOYMENT_SECRETS_ORG, mergeDeploymentConfig, readStoredDeploymentConfig, schemaFields, secretPathsOf, };
|
|
34
35
|
export { PLUGIN_DEPLOYMENT_CONFIG_TOPIC };
|
|
35
36
|
/** 某字段 zod 叶子上的默认值(整份配置不合法、校验没能补上默认值时,视图仍按它显示)。 */
|
|
@@ -64,7 +65,7 @@ let ExtensionDeploymentConfigService = class ExtensionDeploymentConfigService {
|
|
|
64
65
|
/** Where each startup-config field comes from (see `extensionConfigSources`); those fields are read-only. */
|
|
65
66
|
sources;
|
|
66
67
|
constructor(kdb, txHost,
|
|
67
|
-
/** The
|
|
68
|
+
/** The super admin lock (identity/super-admin.ts): joins the transaction. */
|
|
68
69
|
adminLock, configLock, keyring, config,
|
|
69
70
|
/** This replica's extension schemas (loaded, config-declared or prepared install records). */
|
|
70
71
|
host,
|
|
@@ -142,7 +143,7 @@ let ExtensionDeploymentConfigService = class ExtensionDeploymentConfigService {
|
|
|
142
143
|
* is re-encrypted whole, then validated with `values`; the audit lists the record's path, no keys.
|
|
143
144
|
* A path no hint names -> 400 `validation_failed`; one in the startup config -> 409
|
|
144
145
|
* `extension.config_readonly`.
|
|
145
|
-
* In a transaction, first `
|
|
146
|
+
* In a transaction, first `lockSuperAdminsAndAuthorize` (re-checks the super admin under
|
|
146
147
|
* the lock), then an advisory lock per extension; audit `extension.deployment_config_updated`
|
|
147
148
|
* (detail only `changedPaths`). After the commit publishes {@link PLUGIN_DEPLOYMENT_CONFIG_TOPIC} and
|
|
148
149
|
* applies it on this replica right away.
|
|
@@ -241,7 +242,8 @@ let ExtensionDeploymentConfigService = class ExtensionDeploymentConfigService {
|
|
|
241
242
|
applySecretEntries(next, secretEntries);
|
|
242
243
|
const touched = new Set([...Object.keys(values), ...secretEntries.map((e) => e.path)]);
|
|
243
244
|
if (info.schema) {
|
|
244
|
-
|
|
245
|
+
// overridable fields may stay empty on the platform (spec A §5.4a)
|
|
246
|
+
const r = parseLoadGate(info.schema, mergeDeploymentConfig(next, fileValue, fieldPaths));
|
|
245
247
|
if (!r.success) {
|
|
246
248
|
// 启动配置里只读字段自己的问题这里改不了(照样保存,插件保持待配置),其余拒绝
|
|
247
249
|
const issues = toIssues(r.error, this.messagesOf(plugin, info)).filter((i) => i.path === "" || fieldSource(sources, i.path) === undefined);
|
|
@@ -303,7 +305,8 @@ let ExtensionDeploymentConfigService = class ExtensionDeploymentConfigService {
|
|
|
303
305
|
let valid = true;
|
|
304
306
|
let issues = [];
|
|
305
307
|
if (info.schema) {
|
|
306
|
-
|
|
308
|
+
// the load gate: overridable fields may stay empty (spec A §5.4a)
|
|
309
|
+
const r = parseLoadGate(info.schema, raw);
|
|
307
310
|
if (r.success)
|
|
308
311
|
effective = r.data;
|
|
309
312
|
else {
|
|
@@ -313,6 +316,7 @@ let ExtensionDeploymentConfigService = class ExtensionDeploymentConfigService {
|
|
|
313
316
|
}
|
|
314
317
|
const formSchema = this.formSchemaOf(plugin, info);
|
|
315
318
|
const hinted = formSchema ? hintedSecretPaths(formSchema) : new Set();
|
|
319
|
+
const levels = levelsOf(info);
|
|
316
320
|
const fields = info.fields.map((f) => {
|
|
317
321
|
const from = fieldSource(sources, f.path);
|
|
318
322
|
let value = getPath(effective, f.path);
|
|
@@ -327,12 +331,14 @@ let ExtensionDeploymentConfigService = class ExtensionDeploymentConfigService {
|
|
|
327
331
|
value = d.value;
|
|
328
332
|
source = value === undefined ? "unset" : "default";
|
|
329
333
|
}
|
|
334
|
+
const level = levels.get(f.path.split(".")[0]);
|
|
330
335
|
const base = {
|
|
331
336
|
path: f.path,
|
|
332
337
|
secret: f.secret,
|
|
333
338
|
hot: f.hot,
|
|
334
339
|
source,
|
|
335
340
|
readonly: from !== undefined,
|
|
341
|
+
...(level !== undefined && level !== "hidden" && { org: level }),
|
|
336
342
|
};
|
|
337
343
|
// a schema default (e.g. `secret(record).default({})`) is no secret anybody set
|
|
338
344
|
const set = value !== undefined && source !== "default";
|
|
@@ -354,8 +360,23 @@ let ExtensionDeploymentConfigService = class ExtensionDeploymentConfigService {
|
|
|
354
360
|
valid,
|
|
355
361
|
validated: info.schema !== undefined,
|
|
356
362
|
issues,
|
|
363
|
+
orgMustConfigure: orgMustConfigureOf(info, raw, levels),
|
|
357
364
|
};
|
|
358
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
|
+
}
|
|
359
380
|
/**
|
|
360
381
|
* The form JSON Schema of the description: the zod schema's, else the package's static one. A
|
|
361
382
|
* hint conversion that throws (a hand-made package) drops the hints: the plain schema, or none
|
|
@@ -391,7 +412,7 @@ ExtensionDeploymentConfigService = __decorate([
|
|
|
391
412
|
Injectable(),
|
|
392
413
|
__param(0, Inject(KernelDb)),
|
|
393
414
|
__param(1, Inject(TransactionHost)),
|
|
394
|
-
__param(2, Inject(
|
|
415
|
+
__param(2, Inject(SuperAdminLock)),
|
|
395
416
|
__param(3, Inject(PluginDeploymentConfigLock)),
|
|
396
417
|
__param(4, Inject(KEYRING)),
|
|
397
418
|
__param(5, Inject(KernelConfigService)),
|
|
@@ -404,12 +425,32 @@ ExtensionDeploymentConfigService = __decorate([
|
|
|
404
425
|
__param(12, Inject(ExtensionDisplayNames))
|
|
405
426
|
], ExtensionDeploymentConfigService);
|
|
406
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
|
+
}
|
|
407
448
|
/**
|
|
408
449
|
* Applies secret entries in order to the decrypted config `next` (in place): each record is read
|
|
409
450
|
* from `next` at its path, renamed, set or removed, and put back; an empty record is removed (the
|
|
410
451
|
* field falls back to its default).
|
|
411
452
|
*/
|
|
412
|
-
function applySecretEntries(next, entries) {
|
|
453
|
+
export function applySecretEntries(next, entries) {
|
|
413
454
|
for (const e of entries) {
|
|
414
455
|
const cur = getPath(next, e.path);
|
|
415
456
|
const rec = isObj(cur) ? { ...cur } : {};
|