@capybara-hq/kernel 0.1.0-rc.4 → 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 +39 -13
- package/dist/admin/admin.controller.js +33 -17
- 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 +51 -22
- package/dist/agents/agents.service.js +172 -70
- 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/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/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 +6 -2
- package/dist/config/schema.js +46 -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 +69 -12
- package/dist/conversations/conversations.service.js +106 -27
- 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 +5 -0
- package/dist/ctx/create-ctx.js +15 -5
- package/dist/db/kernel-schema.d.ts +362 -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 +82 -2
- package/dist/errors.js +82 -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 +16 -4
- package/dist/evals/step-replay.d.ts +2 -5
- package/dist/evals/step-replay.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 +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/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 +8 -2
- package/dist/extensions/hooks.d.ts +37 -4
- package/dist/extensions/hooks.js +82 -16
- package/dist/extensions/host.d.ts +19 -1
- package/dist/extensions/host.js +30 -7
- 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/files/previewers.d.ts +8 -1
- package/dist/files/previewers.js +35 -6
- package/dist/http/api.module.js +23 -3
- package/dist/http/app.d.ts +11 -2
- package/dist/http/app.js +31 -5
- 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 +21 -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 +11 -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/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 +20 -9
- package/dist/models/purposes.js +17 -8
- 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 +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 +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.js +2 -0
- 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 +30 -8
- package/dist/runtime/model-call.js +69 -19
- 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 +11 -5
- package/dist/runtime/run-worker.js +54 -31
- 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 +43 -29
- 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.js +17 -12
- 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 +187 -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/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
|
@@ -1,11 +1,13 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { SuperAdminLock } from "../identity/super-admin.js";
|
|
2
2
|
import { KernelConfigService } from "../infra/config/kernel-config.service.js";
|
|
3
3
|
import { KernelDb } from "../infra/database/kernel-db.js";
|
|
4
4
|
import { TransactionHost } from "../infra/database/transaction-host.js";
|
|
5
5
|
import type { KernelLogger } from "../log.js";
|
|
6
6
|
import { ExtensionApprovals } from "./approvals.js";
|
|
7
7
|
import { ExtensionBlobs } from "./blobs.js";
|
|
8
|
+
import { ExtensionDeploymentConfigService } from "./deployment-config.js";
|
|
8
9
|
import { ExtensionDisplayNames } from "./display-name.js";
|
|
10
|
+
import { EffectiveConfigs } from "./effective-config.js";
|
|
9
11
|
import { ExtensionHost } from "./host.js";
|
|
10
12
|
import { ExtensionInstalls } from "./installs.js";
|
|
11
13
|
import { ExtensionLifecycle, PLUGINS_CHANGED_TOPIC } from "./lifecycle.js";
|
|
@@ -23,13 +25,13 @@ export interface PublishBus {
|
|
|
23
25
|
publish(topic: string, payload: unknown): Promise<void>;
|
|
24
26
|
}
|
|
25
27
|
/**
|
|
26
|
-
*
|
|
28
|
+
* 部署级插件后台(超级管理员):列表 / 详情与网页批准权限(D8)。无状态,多副本共用;
|
|
27
29
|
* 状态由 PG(安装记录、快照、各副本状态行)与本副本宿主(配置声明插件的清单)推出。
|
|
28
30
|
*/
|
|
29
31
|
export declare class ExtensionAdmin {
|
|
30
32
|
private readonly kdb;
|
|
31
33
|
readonly txHost: TransactionHost;
|
|
32
|
-
/** The
|
|
34
|
+
/** The super admin lock (identity/super-admin.ts): joins the transaction. */
|
|
33
35
|
private readonly adminLock;
|
|
34
36
|
private readonly approveLock;
|
|
35
37
|
private readonly blobs;
|
|
@@ -43,17 +45,29 @@ export declare class ExtensionAdmin {
|
|
|
43
45
|
private readonly bus;
|
|
44
46
|
private readonly log;
|
|
45
47
|
private readonly displayNames;
|
|
48
|
+
/** Which required overridable fields the platform left empty (spec A §5.4a). */
|
|
49
|
+
private readonly deploymentConfig;
|
|
50
|
+
/** How many orgs still need their own config for such an extension. */
|
|
51
|
+
private readonly effectiveConfigs;
|
|
46
52
|
private readonly packageSets;
|
|
47
53
|
constructor(kdb: KernelDb, txHost: TransactionHost,
|
|
48
|
-
/** The
|
|
49
|
-
adminLock:
|
|
54
|
+
/** The super admin lock (identity/super-admin.ts): joins the transaction. */
|
|
55
|
+
adminLock: SuperAdminLock, approveLock: PluginApproveLock, blobs: ExtensionBlobs, installs: ExtensionInstalls, approvals: ExtensionApprovals,
|
|
50
56
|
/** The config-declared extensions (this replica's host; the CLI fills it from its inspection). */
|
|
51
57
|
host: ExtensionHost,
|
|
52
58
|
/** This replica's reconcile after an approval (a no-op where the lifecycle never started: the CLI). */
|
|
53
|
-
lifecycle: ExtensionLifecycle, config: KernelConfigService, bus: PublishBus, log: KernelLogger, displayNames: ExtensionDisplayNames
|
|
59
|
+
lifecycle: ExtensionLifecycle, config: KernelConfigService, bus: PublishBus, log: KernelLogger, displayNames: ExtensionDisplayNames,
|
|
60
|
+
/** Which required overridable fields the platform left empty (spec A §5.4a). */
|
|
61
|
+
deploymentConfig: ExtensionDeploymentConfigService,
|
|
62
|
+
/** How many orgs still need their own config for such an extension. */
|
|
63
|
+
effectiveConfigs: EffectiveConfigs);
|
|
54
64
|
private get db();
|
|
55
|
-
/**
|
|
56
|
-
|
|
65
|
+
/**
|
|
66
|
+
* Every extension (config-declared, then install records, each by name). With `names`, only
|
|
67
|
+
* those: no other package is read, so a caller that needs a few items (the catalog's pending
|
|
68
|
+
* check) neither pays for nor logs about the packages of unrelated extensions.
|
|
69
|
+
*/
|
|
70
|
+
list(names?: ReadonlySet<string>): Promise<AdminExtensionView[]>;
|
|
57
71
|
/**
|
|
58
72
|
* A single extension; unknown -> `extension.not_found`; package unreadable ->
|
|
59
73
|
* `extension.package_unavailable`. With `allowUnreadable` an unreadable package returns the same
|
|
@@ -66,7 +80,12 @@ export declare class ExtensionAdmin {
|
|
|
66
80
|
allowUnreadable?: boolean;
|
|
67
81
|
}): Promise<AdminExtensionView>;
|
|
68
82
|
/**
|
|
69
|
-
*
|
|
83
|
+
* The review digest of a stored package (the `reviewHash` its extension would show once
|
|
84
|
+
* installed); null when the package cannot be read.
|
|
85
|
+
*/
|
|
86
|
+
packageReviewHash(sha256: string): Promise<string | null>;
|
|
87
|
+
/**
|
|
88
|
+
* Web approval: re-checks the super admin under the lock, compares the reviewed package
|
|
70
89
|
* (`sha256`) and permission digest (`reviewHash`), writes the snapshot (source web) and the
|
|
71
90
|
* `extension.permissions_approved` audit; after the commit publishes `kernel.plugins.changed` (a
|
|
72
91
|
* failure only warns) and waits for one reconcile on this replica (other replicas converge through
|
|
@@ -76,10 +95,12 @@ export declare class ExtensionAdmin {
|
|
|
76
95
|
* recomputed now -> `extension.approval_stale`; a config-declared extension's `sha256` must be
|
|
77
96
|
* null (otherwise `validation_failed`);
|
|
78
97
|
* - the snapshot already covers the current permission set (nothing to approve, F-N) ->
|
|
79
|
-
* `extension.not_pending
|
|
98
|
+
* `extension.not_pending`, except with `confirmBootstrap` when the snapshot is the bootstrap
|
|
99
|
+
* step's (the catalog's confirm re-writes it with source web).
|
|
80
100
|
*/
|
|
81
101
|
approve(actor: string, name: string, body: ApproveBody, opts?: {
|
|
82
102
|
actorTokenId?: string;
|
|
103
|
+
confirmBootstrap?: boolean;
|
|
83
104
|
}): Promise<AdminExtensionView>;
|
|
84
105
|
private writeApproval;
|
|
85
106
|
/** 配置声明 → 安装记录(与配置声明重名的安装记录不生效,不单列)。`only` 给出时只取这一个。 */
|
|
@@ -88,5 +109,11 @@ export declare class ExtensionAdmin {
|
|
|
88
109
|
* 包的权限集合(静态清单 + 迁移 SQL,与上传时的审阅相同)、迁移审阅警告与是否有部署级配置字段;按 sha256 缓存。
|
|
89
110
|
*/
|
|
90
111
|
private packageInfo;
|
|
112
|
+
/**
|
|
113
|
+
* For each configurable, readable extension whose platform config leaves required overridable
|
|
114
|
+
* fields empty (spec A §5.4a): the number of orgs still needing their own config. Extensions
|
|
115
|
+
* without overridable fields cost no read.
|
|
116
|
+
*/
|
|
117
|
+
private orgsNeedingConfig;
|
|
91
118
|
private views;
|
|
92
119
|
}
|
|
@@ -11,7 +11,7 @@ import { SDK_VERSION } from "@capybara-hq/plugin-sdk";
|
|
|
11
11
|
import { Inject, Injectable } from "@nestjs/common";
|
|
12
12
|
import { sql } from "kysely";
|
|
13
13
|
import { ApiError } from "../errors.js";
|
|
14
|
-
import {
|
|
14
|
+
import { SuperAdminLock } from "../identity/super-admin.js";
|
|
15
15
|
import { KernelConfigService } from "../infra/config/kernel-config.service.js";
|
|
16
16
|
import { KernelDb } from "../infra/database/kernel-db.js";
|
|
17
17
|
import { TransactionHost } from "../infra/database/transaction-host.js";
|
|
@@ -19,7 +19,10 @@ import { Transactional } from "../infra/database/transactional.decorator.js";
|
|
|
19
19
|
import { KERNEL_BUS, KERNEL_LOGGER } from "../infra/tokens.js";
|
|
20
20
|
import { ExtensionApprovals, snapshotCovers, writeSnapshot, } from "./approvals.js";
|
|
21
21
|
import { ExtensionBlobs } from "./blobs.js";
|
|
22
|
+
import { ExtensionDeploymentConfigService } from "./deployment-config.js";
|
|
22
23
|
import { ExtensionDisplayNames } from "./display-name.js";
|
|
24
|
+
import { EffectiveConfigs } from "./effective-config.js";
|
|
25
|
+
import { enabledExtensionsByOrg } from "./enabled.js";
|
|
23
26
|
import { ExtensionHost } from "./host.js";
|
|
24
27
|
import { ExtensionInstalls } from "./installs.js";
|
|
25
28
|
import { ExtensionLifecycle, PLUGINS_CHANGED_TOPIC, STALE_RECONCILE_PERIODS } from "./lifecycle.js";
|
|
@@ -27,6 +30,7 @@ import { PluginApproveLock } from "./locks.js";
|
|
|
27
30
|
import { ExtensionPackageError, permissionSetOfPackage, readExtensionPackage } from "./package.js";
|
|
28
31
|
import { buildPermissionSet, diffPermissions } from "./permission-set.js";
|
|
29
32
|
import { deriveExtensionStatus, migrationWarnings, permissionGroups, permissionKeyItems, reviewHash, } from "./permission-view.js";
|
|
33
|
+
import { pluginItemsOf } from "./plugin-items.js";
|
|
30
34
|
export { PLUGINS_CHANGED_TOPIC };
|
|
31
35
|
/** 内容寻址的包 → 权限集合(包不可变,缓存安全;只作缓存,不是跨副本状态)。 */
|
|
32
36
|
const PACKAGE_SET_CACHE_MAX = 256;
|
|
@@ -48,7 +52,7 @@ function assertReadable(s) {
|
|
|
48
52
|
}
|
|
49
53
|
}
|
|
50
54
|
/**
|
|
51
|
-
*
|
|
55
|
+
* 部署级插件后台(超级管理员):列表 / 详情与网页批准权限(D8)。无状态,多副本共用;
|
|
52
56
|
* 状态由 PG(安装记录、快照、各副本状态行)与本副本宿主(配置声明插件的清单)推出。
|
|
53
57
|
*/
|
|
54
58
|
let ExtensionAdmin = class ExtensionAdmin {
|
|
@@ -65,14 +69,20 @@ let ExtensionAdmin = class ExtensionAdmin {
|
|
|
65
69
|
bus;
|
|
66
70
|
log;
|
|
67
71
|
displayNames;
|
|
72
|
+
deploymentConfig;
|
|
73
|
+
effectiveConfigs;
|
|
68
74
|
packageSets = new Map();
|
|
69
75
|
constructor(kdb, txHost,
|
|
70
|
-
/** The
|
|
76
|
+
/** The super admin lock (identity/super-admin.ts): joins the transaction. */
|
|
71
77
|
adminLock, approveLock, blobs, installs, approvals,
|
|
72
78
|
/** The config-declared extensions (this replica's host; the CLI fills it from its inspection). */
|
|
73
79
|
host,
|
|
74
80
|
/** This replica's reconcile after an approval (a no-op where the lifecycle never started: the CLI). */
|
|
75
|
-
lifecycle, config, bus, log, displayNames
|
|
81
|
+
lifecycle, config, bus, log, displayNames,
|
|
82
|
+
/** Which required overridable fields the platform left empty (spec A §5.4a). */
|
|
83
|
+
deploymentConfig,
|
|
84
|
+
/** How many orgs still need their own config for such an extension. */
|
|
85
|
+
effectiveConfigs) {
|
|
76
86
|
this.kdb = kdb;
|
|
77
87
|
this.txHost = txHost;
|
|
78
88
|
this.adminLock = adminLock;
|
|
@@ -86,13 +96,19 @@ let ExtensionAdmin = class ExtensionAdmin {
|
|
|
86
96
|
this.bus = bus;
|
|
87
97
|
this.log = log;
|
|
88
98
|
this.displayNames = displayNames;
|
|
99
|
+
this.deploymentConfig = deploymentConfig;
|
|
100
|
+
this.effectiveConfigs = effectiveConfigs;
|
|
89
101
|
}
|
|
90
102
|
get db() {
|
|
91
103
|
return this.kdb.db;
|
|
92
104
|
}
|
|
93
|
-
/**
|
|
94
|
-
|
|
95
|
-
|
|
105
|
+
/**
|
|
106
|
+
* Every extension (config-declared, then install records, each by name). With `names`, only
|
|
107
|
+
* those: no other package is read, so a caller that needs a few items (the catalog's pending
|
|
108
|
+
* check) neither pays for nor logs about the packages of unrelated extensions.
|
|
109
|
+
*/
|
|
110
|
+
async list(names) {
|
|
111
|
+
const subjects = await this.subjects(undefined, names);
|
|
96
112
|
return this.views(subjects);
|
|
97
113
|
}
|
|
98
114
|
/**
|
|
@@ -112,7 +128,20 @@ let ExtensionAdmin = class ExtensionAdmin {
|
|
|
112
128
|
return (await this.views([s]))[0];
|
|
113
129
|
}
|
|
114
130
|
/**
|
|
115
|
-
*
|
|
131
|
+
* The review digest of a stored package (the `reviewHash` its extension would show once
|
|
132
|
+
* installed); null when the package cannot be read.
|
|
133
|
+
*/
|
|
134
|
+
async packageReviewHash(sha256) {
|
|
135
|
+
try {
|
|
136
|
+
const { set, warnings } = await this.packageInfo(sha256);
|
|
137
|
+
return reviewHash(set, warnings);
|
|
138
|
+
}
|
|
139
|
+
catch {
|
|
140
|
+
return null;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Web approval: re-checks the super admin under the lock, compares the reviewed package
|
|
116
145
|
* (`sha256`) and permission digest (`reviewHash`), writes the snapshot (source web) and the
|
|
117
146
|
* `extension.permissions_approved` audit; after the commit publishes `kernel.plugins.changed` (a
|
|
118
147
|
* failure only warns) and waits for one reconcile on this replica (other replicas converge through
|
|
@@ -122,7 +151,8 @@ let ExtensionAdmin = class ExtensionAdmin {
|
|
|
122
151
|
* recomputed now -> `extension.approval_stale`; a config-declared extension's `sha256` must be
|
|
123
152
|
* null (otherwise `validation_failed`);
|
|
124
153
|
* - the snapshot already covers the current permission set (nothing to approve, F-N) ->
|
|
125
|
-
* `extension.not_pending
|
|
154
|
+
* `extension.not_pending`, except with `confirmBootstrap` when the snapshot is the bootstrap
|
|
155
|
+
* step's (the catalog's confirm re-writes it with source web).
|
|
126
156
|
*/
|
|
127
157
|
async approve(actor, name, body, opts = {}) {
|
|
128
158
|
const s = (await this.subjects(name))[0];
|
|
@@ -137,7 +167,7 @@ let ExtensionAdmin = class ExtensionAdmin {
|
|
|
137
167
|
throw stale();
|
|
138
168
|
if (body.reviewHash !== reviewHash(s.set, s.warnings))
|
|
139
169
|
throw stale();
|
|
140
|
-
await this.writeApproval(actor, name, s, opts.actorTokenId, stale);
|
|
170
|
+
await this.writeApproval(actor, name, s, opts.actorTokenId, stale, opts.confirmBootstrap === true);
|
|
141
171
|
try {
|
|
142
172
|
await this.bus.publish(PLUGINS_CHANGED_TOPIC, { plugin: name });
|
|
143
173
|
}
|
|
@@ -153,7 +183,7 @@ let ExtensionAdmin = class ExtensionAdmin {
|
|
|
153
183
|
}
|
|
154
184
|
return this.get(name);
|
|
155
185
|
}
|
|
156
|
-
async writeApproval(actor, name, s, actorTokenId, stale) {
|
|
186
|
+
async writeApproval(actor, name, s, actorTokenId, stale, confirmBootstrap) {
|
|
157
187
|
const db = this.db;
|
|
158
188
|
await this.adminLock.lockAndAuthorize(actor);
|
|
159
189
|
await this.approveLock.lock(name);
|
|
@@ -170,7 +200,7 @@ let ExtensionAdmin = class ExtensionAdmin {
|
|
|
170
200
|
}
|
|
171
201
|
const snapRow = await db
|
|
172
202
|
.selectFrom("extension_permission_snapshots")
|
|
173
|
-
.select(["version", "permissions"])
|
|
203
|
+
.select(["version", "permissions", "source"])
|
|
174
204
|
.where("plugin", "=", name)
|
|
175
205
|
.forUpdate()
|
|
176
206
|
.executeTakeFirst();
|
|
@@ -178,7 +208,9 @@ let ExtensionAdmin = class ExtensionAdmin {
|
|
|
178
208
|
version: snapRow.version,
|
|
179
209
|
permissions: snapRow.permissions,
|
|
180
210
|
};
|
|
181
|
-
|
|
211
|
+
// `confirmBootstrap` (the catalog's confirm): a snapshot the bootstrap step wrote was never
|
|
212
|
+
// confirmed by a person, so a covered one is still taken over
|
|
213
|
+
if (snapshotCovers(snap, s.set) && !(confirmBootstrap && snapRow?.source === "bootstrap")) {
|
|
182
214
|
throw new ApiError("extension.not_pending", `Extension ${name} ${s.version} has no new permissions awaiting approval`);
|
|
183
215
|
}
|
|
184
216
|
const { added, removed } = diffPermissions(snap?.permissions, s.set);
|
|
@@ -190,10 +222,9 @@ let ExtensionAdmin = class ExtensionAdmin {
|
|
|
190
222
|
});
|
|
191
223
|
}
|
|
192
224
|
/** 配置声明 → 安装记录(与配置声明重名的安装记录不生效,不单列)。`only` 给出时只取这一个。 */
|
|
193
|
-
async subjects(only) {
|
|
194
|
-
const
|
|
195
|
-
|
|
196
|
-
.filter((p) => only === undefined || p.name === only);
|
|
225
|
+
async subjects(only, names) {
|
|
226
|
+
const wanted = (name) => (only === undefined || name === only) && (names === undefined || names.has(name));
|
|
227
|
+
const declared = this.host.declaredPlugins().filter((p) => wanted(p.name));
|
|
197
228
|
const taken = new Set(this.host.declaredPlugins().map((p) => p.name));
|
|
198
229
|
const out = [...declared]
|
|
199
230
|
.sort((a, b) => a.name.localeCompare(b.name))
|
|
@@ -209,7 +240,7 @@ let ExtensionAdmin = class ExtensionAdmin {
|
|
|
209
240
|
}));
|
|
210
241
|
if (only !== undefined && out.length > 0)
|
|
211
242
|
return out;
|
|
212
|
-
const rows = (await this.installs.list()).filter((r) => !taken.has(r.name) && (
|
|
243
|
+
const rows = (await this.installs.list()).filter((r) => !taken.has(r.name) && wanted(r.name));
|
|
213
244
|
for (const r of rows) {
|
|
214
245
|
let info;
|
|
215
246
|
try {
|
|
@@ -276,6 +307,32 @@ let ExtensionAdmin = class ExtensionAdmin {
|
|
|
276
307
|
}
|
|
277
308
|
return { ...cached, configurable: cached.set.config.deployment.length > 0 };
|
|
278
309
|
}
|
|
310
|
+
/**
|
|
311
|
+
* For each configurable, readable extension whose platform config leaves required overridable
|
|
312
|
+
* fields empty (spec A §5.4a): the number of orgs still needing their own config. Extensions
|
|
313
|
+
* without overridable fields cost no read.
|
|
314
|
+
*/
|
|
315
|
+
async orgsNeedingConfig(subjects) {
|
|
316
|
+
const out = new Map();
|
|
317
|
+
for (const s of subjects) {
|
|
318
|
+
if (!s.configurable || s.broken !== undefined)
|
|
319
|
+
continue;
|
|
320
|
+
try {
|
|
321
|
+
const missing = await this.deploymentConfig.orgMustConfigure(s.name);
|
|
322
|
+
if (missing.length > 0) {
|
|
323
|
+
out.set(s.name, await this.effectiveConfigs.countNeedingConfig(s.name));
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
catch (err) {
|
|
327
|
+
// the list never fails for one extension's config; the field is then left out
|
|
328
|
+
this.log.warn("cannot tell whether orgs must configure the extension", {
|
|
329
|
+
plugin: s.name,
|
|
330
|
+
err,
|
|
331
|
+
});
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
return out;
|
|
335
|
+
}
|
|
279
336
|
async views(subjects) {
|
|
280
337
|
if (subjects.length === 0)
|
|
281
338
|
return [];
|
|
@@ -290,7 +347,28 @@ let ExtensionAdmin = class ExtensionAdmin {
|
|
|
290
347
|
.where("heartbeat_at", ">", sql `now() - make_interval(secs => ${staleSeconds})`)
|
|
291
348
|
.orderBy("replica_id")
|
|
292
349
|
.execute();
|
|
350
|
+
const items = await pluginItemsOf(this.db, names);
|
|
351
|
+
const needing = await this.orgsNeedingConfig(subjects);
|
|
352
|
+
const counts = new Map((await this.db
|
|
353
|
+
.selectFrom(enabledExtensionsByOrg(this.db).as("en"))
|
|
354
|
+
.innerJoin("orgs", "orgs.id", "en.org_id")
|
|
355
|
+
.select(["en.plugin", (eb) => eb.fn.countAll().as("n")])
|
|
356
|
+
.where("orgs.deleted_at", "is", null)
|
|
357
|
+
.where("en.plugin", "in", names)
|
|
358
|
+
.groupBy("en.plugin")
|
|
359
|
+
.execute()).map((r) => [r.plugin, Number(r.n)]));
|
|
293
360
|
return subjects.map((s) => {
|
|
361
|
+
const of = items.get(s.name);
|
|
362
|
+
const builtin = of?.some((i) => i.builtin) === true || s.install?.required === true;
|
|
363
|
+
const scopeInfo = {
|
|
364
|
+
scope: of?.[0]
|
|
365
|
+
? builtin || of.some((i) => i.scope === "all")
|
|
366
|
+
? "all"
|
|
367
|
+
: of[0].scope
|
|
368
|
+
: null,
|
|
369
|
+
enabledOrgs: counts.get(s.name) ?? 0,
|
|
370
|
+
builtin,
|
|
371
|
+
};
|
|
294
372
|
const replicas = rows.filter((r) => r.plugin === s.name);
|
|
295
373
|
const snap = snapshots.get(s.name);
|
|
296
374
|
const { added, removed } = diffPermissions(snap?.permissions, s.set);
|
|
@@ -325,6 +403,7 @@ let ExtensionAdmin = class ExtensionAdmin {
|
|
|
325
403
|
configValid,
|
|
326
404
|
removable: install?.required !== true,
|
|
327
405
|
required: install?.required === true,
|
|
406
|
+
...scopeInfo,
|
|
328
407
|
installSource: install?.source ?? null,
|
|
329
408
|
error: s.broken,
|
|
330
409
|
};
|
|
@@ -360,8 +439,10 @@ let ExtensionAdmin = class ExtensionAdmin {
|
|
|
360
439
|
snapshot: snapshotView(snap),
|
|
361
440
|
configurable: s.configurable,
|
|
362
441
|
configValid,
|
|
442
|
+
...(needing.has(s.name) && { orgsNeedingConfig: needing.get(s.name) }),
|
|
363
443
|
removable: s.source === "install" && install?.required !== true,
|
|
364
444
|
required: install?.required === true,
|
|
445
|
+
...scopeInfo,
|
|
365
446
|
installSource: install?.source ?? null,
|
|
366
447
|
};
|
|
367
448
|
});
|
|
@@ -374,7 +455,7 @@ ExtensionAdmin = __decorate([
|
|
|
374
455
|
Injectable(),
|
|
375
456
|
__param(0, Inject(KernelDb)),
|
|
376
457
|
__param(1, Inject(TransactionHost)),
|
|
377
|
-
__param(2, Inject(
|
|
458
|
+
__param(2, Inject(SuperAdminLock)),
|
|
378
459
|
__param(3, Inject(PluginApproveLock)),
|
|
379
460
|
__param(4, Inject(ExtensionBlobs)),
|
|
380
461
|
__param(5, Inject(ExtensionInstalls)),
|
|
@@ -384,7 +465,9 @@ ExtensionAdmin = __decorate([
|
|
|
384
465
|
__param(9, Inject(KernelConfigService)),
|
|
385
466
|
__param(10, Inject(KERNEL_BUS)),
|
|
386
467
|
__param(11, Inject(KERNEL_LOGGER)),
|
|
387
|
-
__param(12, Inject(ExtensionDisplayNames))
|
|
468
|
+
__param(12, Inject(ExtensionDisplayNames)),
|
|
469
|
+
__param(13, Inject(ExtensionDeploymentConfigService)),
|
|
470
|
+
__param(14, Inject(EffectiveConfigs))
|
|
388
471
|
], ExtensionAdmin);
|
|
389
472
|
export { ExtensionAdmin };
|
|
390
473
|
const replicaView = (r) => ({
|
|
@@ -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();
|