@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
|
@@ -11,21 +11,23 @@ import { isSafePackagePath, marketplaceEntryVersion, } from "@capybara-hq/plugin
|
|
|
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 { ExtensionAdmin } from "../extensions/admin-view.js";
|
|
15
15
|
import { ExtensionInstalls } from "../extensions/installs.js";
|
|
16
|
+
import { PluginInstallLock } from "../extensions/locks.js";
|
|
16
17
|
import { audit } from "../identity/audit.js";
|
|
17
|
-
import {
|
|
18
|
+
import { SuperAdminLock } from "../identity/super-admin.js";
|
|
18
19
|
import { KernelConfigService } from "../infra/config/kernel-config.service.js";
|
|
19
20
|
import { KernelDb } from "../infra/database/kernel-db.js";
|
|
20
21
|
import { TransactionHost } from "../infra/database/transaction-host.js";
|
|
21
22
|
import { Transactional } from "../infra/database/transactional.decorator.js";
|
|
22
23
|
import { sameRepository } from "../packages/provenance.js";
|
|
23
|
-
import { countInstalls, itemView, marketplaceLatest } from "./catalog-items.js";
|
|
24
|
+
import { countInstalls, itemConfirmations, itemScopeFacts, itemView, marketplaceLatest, versionUsable, } from "./catalog-items.js";
|
|
24
25
|
import { expandGitUrl, GitSourceError, gitErrorDetails, normalGitPath, readGitTreeAndOids, resolveGitCommit, } from "./git-source.js";
|
|
25
26
|
import { fetchMarketplaceArchive, marketplaceNetPolicy, marketplaceUrlProblem, } from "./marketplace-fetch.js";
|
|
26
|
-
import { entryCompatible, entrySourceHost, HOST_VERSIONS, hostAllowed, loadMarketplaceEntry, MarketplacesService, pluginNameFrom, } from "./marketplaces.service.js";
|
|
27
|
+
import { assertEntryNotDeprecated, entryCompatible, entrySourceHost, HOST_VERSIONS, hostAllowed, loadMarketplaceEntry, MarketplacesService, pluginNameFrom, } from "./marketplaces.service.js";
|
|
28
|
+
import { releaseExtensionClaim } from "./ownership.js";
|
|
27
29
|
import { PluginImport } from "./plugin-import.js";
|
|
28
|
-
import { cancelPendingRequests } from "./
|
|
30
|
+
import { cancelPendingRequests } from "./request-rules.js";
|
|
29
31
|
import { newestFirst } from "./versions.js";
|
|
30
32
|
const UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
31
33
|
const notFound = () => new ApiError("catalog.item_not_found", "Catalog item not found");
|
|
@@ -77,34 +79,41 @@ function gitSource(loc, read, pinned) {
|
|
|
77
79
|
export const CATALOG_LIST_DEFAULT_LIMIT = 200;
|
|
78
80
|
export const CATALOG_LIST_MAX_LIMIT = 1000;
|
|
79
81
|
/**
|
|
80
|
-
*
|
|
82
|
+
* Platform catalog items (D9 / C21 / C22, `/api/v1/admin/catalog/*`, super admins only). One
|
|
81
83
|
* kind: every item is a plugin (spec §4), imported through {@link PluginImport} (prepare -> confirm,
|
|
82
|
-
* one review); this service lists and shows items,
|
|
83
|
-
*
|
|
84
|
+
* one review, whose confirm installs the plugin's extension); this service lists and shows items,
|
|
85
|
+
* deletes, and prepares marketplace imports (scope and disable: `CatalogScopeService`). Stateless,
|
|
86
|
+
* shared by every replica.
|
|
84
87
|
*/
|
|
85
88
|
let CatalogService = class CatalogService {
|
|
86
89
|
kdb;
|
|
87
90
|
adminLock;
|
|
88
91
|
config;
|
|
89
92
|
installs;
|
|
90
|
-
|
|
93
|
+
admin;
|
|
91
94
|
pluginImport;
|
|
92
95
|
marketplaces;
|
|
96
|
+
installLock;
|
|
93
97
|
txHost;
|
|
94
98
|
constructor(kdb,
|
|
95
|
-
/** The
|
|
96
|
-
adminLock, config, installs,
|
|
99
|
+
/** The super admin lock (identity/super-admin.ts): joins the caller's transaction. */
|
|
100
|
+
adminLock, config, installs,
|
|
101
|
+
/** The deployment's extensions with their approvals (what is pending confirmation). */
|
|
102
|
+
admin,
|
|
97
103
|
/** Plugin import (a marketplace entry goes through its prepare). */
|
|
98
104
|
pluginImport,
|
|
99
|
-
/** The token of
|
|
100
|
-
marketplaces,
|
|
105
|
+
/** The token of a custom marketplace (sent only to its URL's origin). */
|
|
106
|
+
marketplaces,
|
|
107
|
+
/** Serializes a claim release with an install of that name still committing (F10). */
|
|
108
|
+
installLock, txHost) {
|
|
101
109
|
this.kdb = kdb;
|
|
102
110
|
this.adminLock = adminLock;
|
|
103
111
|
this.config = config;
|
|
104
112
|
this.installs = installs;
|
|
105
|
-
this.
|
|
113
|
+
this.admin = admin;
|
|
106
114
|
this.pluginImport = pluginImport;
|
|
107
115
|
this.marketplaces = marketplaces;
|
|
116
|
+
this.installLock = installLock;
|
|
108
117
|
this.txHost = txHost;
|
|
109
118
|
}
|
|
110
119
|
/** The kernel-schema handle of the current context (the transaction, else the pool). */
|
|
@@ -124,7 +133,8 @@ let CatalogService = class CatalogService {
|
|
|
124
133
|
/**
|
|
125
134
|
* Prepares the import of one marketplace entry (C25 / C26, spec §5.2): `version` defaults to the
|
|
126
135
|
* newest compatible version the marketplace lists for `name`; the entry must be compatible with
|
|
127
|
-
* the host (`marketplace.incompatible`)
|
|
136
|
+
* the host (`marketplace.incompatible`) and not deprecated (`marketplace.entry_deprecated`, 409; the
|
|
137
|
+
* confirm does not read the marketplace again); an npm source is downloaded from the configured registry
|
|
128
138
|
* and an archive source from its URL, both always verified against the marketplace's integrity
|
|
129
139
|
* (`marketplace.integrity_mismatch`, nothing written). A `path` source is read from the git
|
|
130
140
|
* marketplace's repository at its last refreshed commit (an http marketplace has none:
|
|
@@ -146,6 +156,7 @@ let CatalogService = class CatalogService {
|
|
|
146
156
|
if (!entryCompatible(entry)) {
|
|
147
157
|
throw new ApiError("marketplace.incompatible", `${entry.name}${version !== null ? `@${version}` : ""} needs kernel >= ${entry.minKernel}; this deployment runs kernel ${HOST_VERSIONS.kernel}`);
|
|
148
158
|
}
|
|
159
|
+
assertEntryNotDeprecated(entry);
|
|
149
160
|
const src = entry.source;
|
|
150
161
|
const host = entrySourceHost(entry);
|
|
151
162
|
if (host !== undefined && !hostAllowed(host, config)) {
|
|
@@ -327,6 +338,25 @@ let CatalogService = class CatalogService {
|
|
|
327
338
|
}
|
|
328
339
|
/** Same as {@link list}, plus the offset of the next page (null when there is none). */
|
|
329
340
|
async page(q = {}) {
|
|
341
|
+
// `pending`: every item waiting for a confirmation (one list, not paged: the pending set is small)
|
|
342
|
+
if (q.pending === true) {
|
|
343
|
+
const all = await this.page({
|
|
344
|
+
...(q.includeDeleted && { includeDeleted: true }),
|
|
345
|
+
limit: CATALOG_LIST_MAX_LIMIT,
|
|
346
|
+
});
|
|
347
|
+
const items = [...all.items];
|
|
348
|
+
let next = all.nextOffset;
|
|
349
|
+
while (next !== null) {
|
|
350
|
+
const more = await this.page({
|
|
351
|
+
...(q.includeDeleted && { includeDeleted: true }),
|
|
352
|
+
limit: CATALOG_LIST_MAX_LIMIT,
|
|
353
|
+
offset: next,
|
|
354
|
+
});
|
|
355
|
+
items.push(...more.items);
|
|
356
|
+
next = more.nextOffset;
|
|
357
|
+
}
|
|
358
|
+
return { items: items.filter((i) => i.pending), nextOffset: null };
|
|
359
|
+
}
|
|
330
360
|
const limit = Math.min(Math.max(1, q.limit ?? CATALOG_LIST_DEFAULT_LIMIT), CATALOG_LIST_MAX_LIMIT);
|
|
331
361
|
const offset = Math.max(0, q.offset ?? 0);
|
|
332
362
|
let query = this.db
|
|
@@ -354,19 +384,29 @@ let CatalogService = class CatalogService {
|
|
|
354
384
|
"integrity",
|
|
355
385
|
"source_detail",
|
|
356
386
|
"imported_at",
|
|
387
|
+
"manifest",
|
|
388
|
+
"source_format",
|
|
389
|
+
"applied_at",
|
|
390
|
+
"rejected_at",
|
|
357
391
|
])
|
|
358
392
|
.where("item_id", "in", items.map((i) => i.id))
|
|
359
393
|
.execute();
|
|
394
|
+
const platformOwned = new Set(items.filter((i) => i.owner_org_id === null).map((i) => i.id));
|
|
360
395
|
const byItem = new Map();
|
|
361
396
|
for (const v of versions) {
|
|
397
|
+
// a platform item offers only versions it may use (a transferred org item's rejected or
|
|
398
|
+
// never-applied uploads stay out, ruling P3-52); an org item's pending ones show in 待确认
|
|
399
|
+
if (platformOwned.has(v.item_id) && !versionUsable(v))
|
|
400
|
+
continue;
|
|
362
401
|
const list = byItem.get(v.item_id) ?? [];
|
|
363
402
|
list.push(v);
|
|
364
403
|
byItem.set(v.item_id, list);
|
|
365
404
|
}
|
|
366
405
|
const installs = await countInstalls(this.db, items, byItem);
|
|
367
406
|
const latest = await marketplaceLatest(this.db, this.config.get(), items, byItem);
|
|
407
|
+
const facts = await itemScopeFacts(this.db, items, await itemConfirmations(this.admin, items, byItem));
|
|
368
408
|
return {
|
|
369
|
-
items: items.map((i) => itemView(i, byItem.get(i.id) ?? [], installs.get(i.id) ?? 0, latest.get(i.id))),
|
|
409
|
+
items: items.map((i) => itemView(i, byItem.get(i.id) ?? [], installs.get(i.id) ?? 0, latest.get(i.id), facts.get(i.id))),
|
|
370
410
|
nextOffset,
|
|
371
411
|
};
|
|
372
412
|
}
|
|
@@ -381,20 +421,22 @@ let CatalogService = class CatalogService {
|
|
|
381
421
|
.executeTakeFirst();
|
|
382
422
|
if (!item)
|
|
383
423
|
throw notFound();
|
|
384
|
-
const rows = await this.db
|
|
424
|
+
const rows = (await this.db
|
|
385
425
|
.selectFrom("catalog_item_versions")
|
|
386
426
|
.selectAll()
|
|
387
427
|
.where("item_id", "=", itemId)
|
|
388
|
-
.execute();
|
|
428
|
+
.execute()).filter((v) => item.owner_org_id !== null || versionUsable(v));
|
|
389
429
|
rows.sort((a, b) => newestFirst({ version: a.version, importedAt: a.imported_at }, { version: b.version, importedAt: b.imported_at }));
|
|
390
430
|
const byItem = new Map([[item.id, rows]]);
|
|
391
431
|
const installs = await countInstalls(this.db, [item], byItem);
|
|
392
432
|
const latest = await marketplaceLatest(this.db, this.config.get(), [item], byItem);
|
|
433
|
+
const facts = await itemScopeFacts(this.db, [item], await itemConfirmations(this.admin, [item], byItem));
|
|
393
434
|
return {
|
|
394
435
|
item: {
|
|
395
|
-
...itemView(item, rows, installs.get(item.id) ?? 0, latest.get(item.id)),
|
|
436
|
+
...itemView(item, rows, installs.get(item.id) ?? 0, latest.get(item.id), facts.get(item.id)),
|
|
396
437
|
packageName: item.package_name,
|
|
397
438
|
deletedAt: item.deleted_at?.toISOString() ?? null,
|
|
439
|
+
platformVersion: item.platform_synced_version ?? item.latest_version,
|
|
398
440
|
},
|
|
399
441
|
versions: rows.map((v) => ({
|
|
400
442
|
version: v.version,
|
|
@@ -416,43 +458,6 @@ let CatalogService = class CatalogService {
|
|
|
416
458
|
})),
|
|
417
459
|
};
|
|
418
460
|
}
|
|
419
|
-
/**
|
|
420
|
-
* Changes the policy (audit `catalog.policy_changed`, not written when unchanged). Deleted /
|
|
421
|
-
* missing -> `catalog.item_not_found`.
|
|
422
|
-
*/
|
|
423
|
-
async setPolicy(actor, itemId, policy, opts = {}) {
|
|
424
|
-
if (!UUID_RE.test(itemId))
|
|
425
|
-
throw notFound();
|
|
426
|
-
await this.writePolicy(actor, itemId, policy, opts);
|
|
427
|
-
return this.view(itemId);
|
|
428
|
-
}
|
|
429
|
-
async writePolicy(actor, itemId, policy, opts) {
|
|
430
|
-
const t = this.db;
|
|
431
|
-
await this.adminLock.lockAndAuthorize(actor);
|
|
432
|
-
const row = await t
|
|
433
|
-
.selectFrom("catalog_items")
|
|
434
|
-
.select(["name", "policy"])
|
|
435
|
-
.where("id", "=", itemId)
|
|
436
|
-
.where("deleted_at", "is", null)
|
|
437
|
-
.forUpdate()
|
|
438
|
-
.executeTakeFirst();
|
|
439
|
-
if (!row)
|
|
440
|
-
throw notFound();
|
|
441
|
-
if (row.policy === policy)
|
|
442
|
-
return;
|
|
443
|
-
await t
|
|
444
|
-
.updateTable("catalog_items")
|
|
445
|
-
.set({ policy, updated_at: sql `now()` })
|
|
446
|
-
.where("id", "=", itemId)
|
|
447
|
-
.execute();
|
|
448
|
-
await audit(t, {
|
|
449
|
-
actorAccountId: actor,
|
|
450
|
-
...(opts.actorTokenId !== undefined && { actorTokenId: opts.actorTokenId }),
|
|
451
|
-
action: "catalog.policy_changed",
|
|
452
|
-
target: itemId,
|
|
453
|
-
detail: { name: row.name, from: row.policy, to: policy },
|
|
454
|
-
});
|
|
455
|
-
}
|
|
456
461
|
/**
|
|
457
462
|
* Deletes the item (soft delete, audit `catalog.removed`; requests still pending are cancelled in
|
|
458
463
|
* the same transaction): versions and stored files are kept (installed components still refer to
|
|
@@ -465,84 +470,77 @@ let CatalogService = class CatalogService {
|
|
|
465
470
|
await this.writeRemove(actor, itemId, opts);
|
|
466
471
|
}
|
|
467
472
|
async writeRemove(actor, itemId, opts) {
|
|
468
|
-
const t = this.db;
|
|
469
473
|
await this.adminLock.lockAndAuthorize(actor);
|
|
474
|
+
if ((await this.removeIn(actor, itemId, opts)) === null)
|
|
475
|
+
throw notFound();
|
|
476
|
+
}
|
|
477
|
+
/**
|
|
478
|
+
* The soft delete of {@link remove} in the caller's transaction, without its super admin check
|
|
479
|
+
* (pre-flight F14: the super admin's remove and an owner's delete or an org deletion,
|
|
480
|
+
* `OwnedItems.transferOrRemove`, share it): `deleted_at` set, a pending version cleared, the
|
|
481
|
+
* extension name claim of a first upload still waiting released (ruling P3-37, F10), pending
|
|
482
|
+
* requests cancelled, audit `catalog.removed` (`actor` null: the kernel). Returns the removed
|
|
483
|
+
* item's name, or null when it is gone already.
|
|
484
|
+
*/
|
|
485
|
+
async removeIn(actor, itemId, opts = {}) {
|
|
486
|
+
const t = this.db;
|
|
487
|
+
const now = sql `now()`;
|
|
470
488
|
const row = await t
|
|
471
489
|
.updateTable("catalog_items")
|
|
472
490
|
.set({
|
|
473
|
-
deleted_at:
|
|
474
|
-
updated_at:
|
|
491
|
+
deleted_at: now,
|
|
492
|
+
updated_at: now,
|
|
493
|
+
pending_version: null,
|
|
494
|
+
pending_by: null,
|
|
495
|
+
pending_at: null,
|
|
475
496
|
})
|
|
476
497
|
.where("id", "=", itemId)
|
|
477
498
|
.where("deleted_at", "is", null)
|
|
478
|
-
.returning(["name"])
|
|
499
|
+
.returning(["name", "awaiting_confirmation", "package_name", "owner_org_id"])
|
|
479
500
|
.executeTakeFirst();
|
|
480
501
|
if (!row)
|
|
481
|
-
|
|
502
|
+
return null;
|
|
503
|
+
// An org upload still waiting: free the name when nothing is installed under its claim
|
|
504
|
+
// (ruling P3-37, pre-flight F10). Under the install lock, so an install a running confirmation
|
|
505
|
+
// is committing is seen: that claim stays for its take-out or the cleanup job
|
|
506
|
+
if (row.awaiting_confirmation && row.package_name !== null) {
|
|
507
|
+
await this.installLock.lock(row.name);
|
|
508
|
+
await releaseExtensionClaim(t, row.name, row.package_name);
|
|
509
|
+
}
|
|
482
510
|
// Pending requests for a deleted item are pointless: cancel them in the same transaction
|
|
483
511
|
await cancelPendingRequests(t, { itemId }, actor, "item_removed", opts);
|
|
484
512
|
await audit(t, {
|
|
485
513
|
actorAccountId: actor,
|
|
486
514
|
...(opts.actorTokenId !== undefined && { actorTokenId: opts.actorTokenId }),
|
|
515
|
+
// an org-owned item's removal shows in its owner org's audit log too
|
|
516
|
+
...(row.owner_org_id !== null && { orgId: row.owner_org_id }),
|
|
487
517
|
action: "catalog.removed",
|
|
488
518
|
target: itemId,
|
|
489
|
-
detail: {
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
* (`ExtensionAdminOps.install`: a new install is disabled, a version change keeps the desired
|
|
495
|
-
* state; audit `extension.installed`), with the install record linked to the item (F-AA). The
|
|
496
|
-
* returned status may be `pending_approval` when the version's permissions are not approved yet.
|
|
497
|
-
* A version without an extension -> `catalog.no_extension`; item or version missing ->
|
|
498
|
-
* `catalog.item_not_found`.
|
|
499
|
-
*/
|
|
500
|
-
async installToDeployment(actor, itemId, version, opts = {}) {
|
|
501
|
-
if (!UUID_RE.test(itemId))
|
|
502
|
-
throw notFound();
|
|
503
|
-
const item = await this.db
|
|
504
|
-
.selectFrom("catalog_items")
|
|
505
|
-
.select(["id", "name"])
|
|
506
|
-
.where("id", "=", itemId)
|
|
507
|
-
.where("deleted_at", "is", null)
|
|
508
|
-
.executeTakeFirst();
|
|
509
|
-
if (!item)
|
|
510
|
-
throw notFound();
|
|
511
|
-
const v = await this.db
|
|
512
|
-
.selectFrom("catalog_item_versions")
|
|
513
|
-
.select("extension_sha256")
|
|
514
|
-
.where("item_id", "=", itemId)
|
|
515
|
-
.where("version", "=", version)
|
|
516
|
-
.executeTakeFirst();
|
|
517
|
-
if (!v) {
|
|
518
|
-
throw new ApiError("catalog.item_not_found", `Version ${version} of this item not found`);
|
|
519
|
-
}
|
|
520
|
-
if (v.extension_sha256 === null) {
|
|
521
|
-
throw new ApiError("catalog.no_extension", `Plugin ${item.name} ${version} has no extension; there is nothing to install on the deployment`);
|
|
522
|
-
}
|
|
523
|
-
return this.ops.install(item.name, v.extension_sha256, actor, opts.actorTokenId, {
|
|
524
|
-
catalogItemId: itemId,
|
|
519
|
+
detail: {
|
|
520
|
+
name: row.name,
|
|
521
|
+
...(row.owner_org_id !== null && { ownerOrgId: row.owner_org_id }),
|
|
522
|
+
...(opts.reason !== undefined && { reason: opts.reason }),
|
|
523
|
+
},
|
|
525
524
|
});
|
|
526
|
-
|
|
527
|
-
async view(itemId) {
|
|
528
|
-
return (await this.get(itemId)).item;
|
|
525
|
+
return { name: row.name };
|
|
529
526
|
}
|
|
530
527
|
};
|
|
531
|
-
__decorate([
|
|
532
|
-
Transactional()
|
|
533
|
-
], CatalogService.prototype, "writePolicy", null);
|
|
534
528
|
__decorate([
|
|
535
529
|
Transactional()
|
|
536
530
|
], CatalogService.prototype, "writeRemove", null);
|
|
531
|
+
__decorate([
|
|
532
|
+
Transactional({ propagation: "mandatory" })
|
|
533
|
+
], CatalogService.prototype, "removeIn", null);
|
|
537
534
|
CatalogService = __decorate([
|
|
538
535
|
Injectable(),
|
|
539
536
|
__param(0, Inject(KernelDb)),
|
|
540
|
-
__param(1, Inject(
|
|
537
|
+
__param(1, Inject(SuperAdminLock)),
|
|
541
538
|
__param(2, Inject(KernelConfigService)),
|
|
542
539
|
__param(3, Inject(ExtensionInstalls)),
|
|
543
|
-
__param(4, Inject(
|
|
540
|
+
__param(4, Inject(ExtensionAdmin)),
|
|
544
541
|
__param(5, Inject(PluginImport)),
|
|
545
542
|
__param(6, Inject(MarketplacesService)),
|
|
546
|
-
__param(7, Inject(
|
|
543
|
+
__param(7, Inject(PluginInstallLock)),
|
|
544
|
+
__param(8, Inject(TransactionHost))
|
|
547
545
|
], CatalogService);
|
|
548
546
|
export { CatalogService };
|
package/dist/catalog/cli.d.ts
CHANGED
|
@@ -4,11 +4,21 @@ import { type ExtensionCli } from "../extensions/cli.js";
|
|
|
4
4
|
import type { KernelLogger } from "../log.js";
|
|
5
5
|
import { CatalogService } from "./catalog.service.js";
|
|
6
6
|
import { PluginImport } from "./plugin-import.js";
|
|
7
|
+
import type { PluginScope } from "./scope.js";
|
|
7
8
|
/** {@link openCatalogCli}'s result: the extension CLI context plus the catalog services. */
|
|
8
9
|
export interface CatalogCli extends ExtensionCli {
|
|
9
10
|
catalog: CatalogService;
|
|
10
11
|
/** Plugin import (prepare / confirm). The CLI acts without an account (actor `null`). */
|
|
11
12
|
imports: PluginImport;
|
|
13
|
+
/**
|
|
14
|
+
* After an import's confirm: enqueues the item's plugin scope sync, as the admin console's
|
|
15
|
+
* confirm does, when its scope turns it on by itself (`all` or `named`). A failure only warns
|
|
16
|
+
* (the next worker start enqueues every item); returns whether it was enqueued.
|
|
17
|
+
*/
|
|
18
|
+
enqueueScopeSync(item: {
|
|
19
|
+
id: string;
|
|
20
|
+
scope: PluginScope;
|
|
21
|
+
}): Promise<boolean>;
|
|
12
22
|
}
|
|
13
23
|
/** What the CLI can do with the deployment's object store, and why not when it cannot. */
|
|
14
24
|
export type CliObjectStore = {
|
|
@@ -35,7 +45,7 @@ export declare function loadCliObjectStore(cli: Pick<ExtensionCli, "inspected" |
|
|
|
35
45
|
* The CLI's plugin catalog context (`capybara plugins *`): {@link openExtensionCli} with the
|
|
36
46
|
* catalog's {@link CatalogImportModule}, so {@link PluginImport} and {@link CatalogService} are the
|
|
37
47
|
* kernel's providers. Imports run with actor `null` (the operator of the
|
|
38
|
-
* deployment, like `capybara extensions install`: no
|
|
48
|
+
* deployment, like `capybara extensions install`: no super-admin re-check, audits without an
|
|
39
49
|
* actor, permission snapshots written with source `cli`). Files of the plugin (skills, connector
|
|
40
50
|
* templates, icons) go to the deployment's object store, set up in-process from the declared or
|
|
41
51
|
* installed object-store extension (see {@link loadCliObjectStore}; an installed package is synced
|
package/dist/catalog/cli.js
CHANGED
|
@@ -8,11 +8,15 @@ import { openExtensionCli } from "../extensions/cli.js";
|
|
|
8
8
|
import { assertSecretsReachable } from "../extensions/host.js";
|
|
9
9
|
import { importExtensionModule, matchesSection } from "../extensions/instance.js";
|
|
10
10
|
import { packageRootOf, syncPackage } from "../extensions/sync.js";
|
|
11
|
+
import { KernelDb } from "../infra/database/kernel-db.js";
|
|
12
|
+
import { addJobOnce } from "../infra/queue/add-job-once.js";
|
|
13
|
+
import { REDIS } from "../infra/tokens.js";
|
|
11
14
|
import { packagePath } from "../packages/tgz.js";
|
|
12
15
|
import { PrefixedStorage } from "../storage/storage.service.js";
|
|
13
16
|
import { CatalogImportModule } from "./catalog.module.js";
|
|
14
17
|
import { CatalogService } from "./catalog.service.js";
|
|
15
18
|
import { PluginImport } from "./plugin-import.js";
|
|
19
|
+
import { PLUGIN_SCOPE_QUEUE, scopeItemJob } from "./scope-sync.js";
|
|
16
20
|
/**
|
|
17
21
|
* Sets up the deployment's object-store extension inside the CLI process. The CLI hosts no
|
|
18
22
|
* extensions, so this runs only the provider's `setup` with a context that offers `config` and
|
|
@@ -148,7 +152,7 @@ class CliStorage extends PrefixedStorage {
|
|
|
148
152
|
* The CLI's plugin catalog context (`capybara plugins *`): {@link openExtensionCli} with the
|
|
149
153
|
* catalog's {@link CatalogImportModule}, so {@link PluginImport} and {@link CatalogService} are the
|
|
150
154
|
* kernel's providers. Imports run with actor `null` (the operator of the
|
|
151
|
-
* deployment, like `capybara extensions install`: no
|
|
155
|
+
* deployment, like `capybara extensions install`: no super-admin re-check, audits without an
|
|
152
156
|
* actor, permission snapshots written with source `cli`). Files of the plugin (skills, connector
|
|
153
157
|
* templates, icons) go to the deployment's object store, set up in-process from the declared or
|
|
154
158
|
* installed object-store extension (see {@link loadCliObjectStore}; an installed package is synced
|
|
@@ -175,10 +179,31 @@ export async function openCatalogCli(config, log, opts = {}) {
|
|
|
175
179
|
const imports = cli.app.get(PluginImport);
|
|
176
180
|
imports.useCliStorage(storage);
|
|
177
181
|
const catalog = cli.app.get(CatalogService);
|
|
182
|
+
const db = cli.app.get(KernelDb);
|
|
183
|
+
const redis = cli.app.get(REDIS);
|
|
178
184
|
return {
|
|
179
185
|
...cli,
|
|
180
186
|
catalog,
|
|
181
187
|
imports,
|
|
188
|
+
async enqueueScopeSync(item) {
|
|
189
|
+
if (item.scope === "optional")
|
|
190
|
+
return false;
|
|
191
|
+
try {
|
|
192
|
+
const row = await db.db
|
|
193
|
+
.selectFrom("catalog_items")
|
|
194
|
+
.select("scope_version")
|
|
195
|
+
.where("id", "=", item.id)
|
|
196
|
+
.executeTakeFirst();
|
|
197
|
+
if (!row)
|
|
198
|
+
return false;
|
|
199
|
+
await addJobOnce(redis, PLUGIN_SCOPE_QUEUE, scopeItemJob(item.id, row.scope_version));
|
|
200
|
+
return true;
|
|
201
|
+
}
|
|
202
|
+
catch (err) {
|
|
203
|
+
log.warn("cannot enqueue the plugin scope sync; the next worker start converges the orgs", { itemId: item.id, err });
|
|
204
|
+
return false;
|
|
205
|
+
}
|
|
206
|
+
},
|
|
182
207
|
async close() {
|
|
183
208
|
await cli.close();
|
|
184
209
|
await removeSyncDir();
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import type { KernelSchemaDb } from "../db/kernel-schema.js";
|
|
2
|
+
import { ApiError } from "../errors.js";
|
|
3
|
+
import { KernelDb } from "../infra/database/kernel-db.js";
|
|
4
|
+
import { TransactionHost } from "../infra/database/transaction-host.js";
|
|
5
|
+
import { StorageService } from "../storage/storage.service.js";
|
|
6
|
+
/** The kinds an org owns as rows of its own (connector templates have none). */
|
|
7
|
+
export type PromotableKind = "skill" | "agent_template";
|
|
8
|
+
/**
|
|
9
|
+
* An org's own skill (org scope) or agent template, as the admin component routes see it: not
|
|
10
|
+
* linked (`link` null), or linked to a platform row the same org owns (`link`: that row, already
|
|
11
|
+
* promoted). A copy linked to a platform row of another owner is never an `OrgRow`.
|
|
12
|
+
*/
|
|
13
|
+
export interface OrgRow {
|
|
14
|
+
kind: PromotableKind;
|
|
15
|
+
id: string;
|
|
16
|
+
orgId: string;
|
|
17
|
+
name: string;
|
|
18
|
+
/** The roster plugin of an agent template (null: a bare `<name>`); null for skills. */
|
|
19
|
+
plugin: string | null;
|
|
20
|
+
version: number;
|
|
21
|
+
shareable: boolean;
|
|
22
|
+
/** The platform row the org promoted it to, or null while it is an org row only. */
|
|
23
|
+
link: string | null;
|
|
24
|
+
/**
|
|
25
|
+
* Content the org created itself (ruling P3-46): a skill without plugin provenance
|
|
26
|
+
* (`catalog_item_id` null); an agent template without a plugin and a catalog item (an org
|
|
27
|
+
* template saved from an agent, ruling P4-13). Anything else is refused with 409
|
|
28
|
+
* `catalog.not_owned`.
|
|
29
|
+
*/
|
|
30
|
+
ownable: boolean;
|
|
31
|
+
}
|
|
32
|
+
/** A promotion whose files are copied ({@link ComponentPromotion.prepare}), waiting for its rows. */
|
|
33
|
+
export interface PreparedPromotion {
|
|
34
|
+
readonly kind: PromotableKind;
|
|
35
|
+
readonly orgRowId: string;
|
|
36
|
+
readonly orgId: string;
|
|
37
|
+
/** The platform id it gets (the existing one when the row is promoted already). */
|
|
38
|
+
readonly platformId: string;
|
|
39
|
+
/** The org row's version the files were copied from. */
|
|
40
|
+
readonly version: number;
|
|
41
|
+
readonly already: boolean;
|
|
42
|
+
/** Where the files were copied (a fresh prefix, ruling P3-45); null: nothing copied. */
|
|
43
|
+
readonly prefix: string | null;
|
|
44
|
+
}
|
|
45
|
+
/** The org row changed between {@link ComponentPromotion.prepare} and its transaction: prepare again. */
|
|
46
|
+
export declare class PromotionStale extends Error {
|
|
47
|
+
}
|
|
48
|
+
/** How many times a caller prepares again after {@link PromotionStale}. */
|
|
49
|
+
export declare const PROMOTION_ATTEMPTS = 3;
|
|
50
|
+
/** 409 `catalog.not_owned`: only the org's own rows can be shared (P3-6). */
|
|
51
|
+
export declare function notOwnedError(what: string): ApiError;
|
|
52
|
+
/** 409 `component.version_stale`: the org row kept changing while it was being promoted. */
|
|
53
|
+
export declare const promotionStaleError: () => ApiError;
|
|
54
|
+
/**
|
|
55
|
+
* Promotes an org's own skill or agent template to a platform row when it is first shared
|
|
56
|
+
* (ruling P3-3). Stateless, shared by every replica.
|
|
57
|
+
*/
|
|
58
|
+
export declare class ComponentPromotion {
|
|
59
|
+
private readonly kdb;
|
|
60
|
+
/** Where files are read and written (the kernel's object storage). */
|
|
61
|
+
private readonly files;
|
|
62
|
+
readonly txHost: TransactionHost;
|
|
63
|
+
constructor(kdb: KernelDb,
|
|
64
|
+
/** Where files are read and written (the kernel's object storage). */
|
|
65
|
+
files: StorageService, txHost: TransactionHost);
|
|
66
|
+
private get db();
|
|
67
|
+
/**
|
|
68
|
+
* The live org row `id` of `kind` (an org-scope skill, an agent template) of a live org, when it
|
|
69
|
+
* is the org's own (see {@link OrgRow}); undefined otherwise.
|
|
70
|
+
*/
|
|
71
|
+
orgRow(kind: PromotableKind, id: string, forUpdate?: boolean): Promise<OrgRow | undefined>;
|
|
72
|
+
/**
|
|
73
|
+
* The first phase, outside any transaction: reads the org row and (a skill) copies its current
|
|
74
|
+
* version's files to `deployment/platform/skills/<platformId>/<version>/`, checking each file
|
|
75
|
+
* against the manifest. A row promoted already needs nothing. A failed copy throws and nothing is
|
|
76
|
+
* linked (the copied files stay unreferenced). Missing or not the org's own -> 404.
|
|
77
|
+
*/
|
|
78
|
+
prepare(kind: PromotableKind, orgRowId: string): Promise<PreparedPromotion>;
|
|
79
|
+
/** Deletes a prepared promotion's files after its transaction failed (best effort, P3-45). */
|
|
80
|
+
discard(p: PreparedPromotion): Promise<void>;
|
|
81
|
+
/**
|
|
82
|
+
* The second phase, in the caller's transaction: re-reads the org row under its lock (after the
|
|
83
|
+
* org row, so an org deletion is serialized), checks the share gate on it (409
|
|
84
|
+
* `catalog.not_shareable`) and writes the platform row (`current_version` = the org row's, one
|
|
85
|
+
* version row at that number), its list `[owner]`, and the link (no pin). Idempotent: a row the
|
|
86
|
+
* org promoted already returns its platform id. A version written since {@link prepare} ->
|
|
87
|
+
* {@link PromotionStale}; a live platform row of the same name created in this org already (a
|
|
88
|
+
* shared item whose owner deleted it and then made a new one) -> 409 `plugin.skill_conflict`.
|
|
89
|
+
* Audits `component.promoted`. Returns the platform id.
|
|
90
|
+
*/
|
|
91
|
+
promote(p: PreparedPromotion, actor: string | null): Promise<string>;
|
|
92
|
+
/** Copies the skill's current version files to its platform prefix (outside any transaction). */
|
|
93
|
+
private copySkillFiles;
|
|
94
|
+
}
|
|
95
|
+
/** {@link ComponentPromotion.orgRow} through `db` (readers outside the provider). */
|
|
96
|
+
export declare function readOrgRow(db: KernelSchemaDb, kind: PromotableKind, id: string, forUpdate?: boolean): Promise<OrgRow | undefined>;
|