@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
package/dist/evals/run-replay.js
CHANGED
|
@@ -263,13 +263,14 @@ function absorbedByStep(s) {
|
|
|
263
263
|
}
|
|
264
264
|
/**
|
|
265
265
|
* The replayed run's boundary (`trigger_seq`): a wake run's recorded one (`run_started.triggerSeq`,
|
|
266
|
-
* background Bash spec §3); otherwise the newest message after `consumed`, else the newest finish
|
|
266
|
+
* background Bash spec §3, agent map spec §5.3); otherwise the newest message after `consumed`, else the newest finish
|
|
267
267
|
* after it that could have woken the run (not reported, no `stoppedBy`), else the last
|
|
268
268
|
* message (old logs, as before).
|
|
269
269
|
*/
|
|
270
270
|
function replayTrigger(started, seeds, consumed) {
|
|
271
271
|
const recorded = started;
|
|
272
|
-
if (recorded.trigger === "background_task"
|
|
272
|
+
if ((recorded.trigger === "background_task" || recorded.trigger === "subagent") &&
|
|
273
|
+
recorded.triggerSeq !== undefined) {
|
|
273
274
|
return recorded.triggerSeq;
|
|
274
275
|
}
|
|
275
276
|
const lastMessage = seeds.findLast((e) => e.type === "user_message")?.seq;
|
|
@@ -330,6 +331,10 @@ export async function replayRun(d, s, candidate, evalRunId, signal) {
|
|
|
330
331
|
model: candidate.model,
|
|
331
332
|
modelParams: candidate.params,
|
|
332
333
|
};
|
|
334
|
+
const triggerEvent = s.events.find((e) => e.seq === trigger);
|
|
335
|
+
const forkRun = triggerEvent?.type === "user_message" &&
|
|
336
|
+
triggerEvent.payload.skill !== undefined &&
|
|
337
|
+
triggerEvent.payload.dispatch !== undefined;
|
|
333
338
|
const conversationId = randomUUID();
|
|
334
339
|
const runId = randomUUID();
|
|
335
340
|
await d.seeder.seed({
|
|
@@ -450,7 +455,8 @@ export async function replayRun(d, s, candidate, evalRunId, signal) {
|
|
|
450
455
|
return "stop";
|
|
451
456
|
},
|
|
452
457
|
});
|
|
453
|
-
// 插话:原运行开始之后到达、且被原运行某一步吸收的可吸收事件(user_message /
|
|
458
|
+
// 插话:原运行开始之后到达、且被原运行某一步吸收的可吸收事件(user_message /
|
|
459
|
+
// background_task_finished / subagent_delivery)
|
|
454
460
|
const absorbed = absorbedByStep(s);
|
|
455
461
|
const stepsInOrder = [...absorbed.keys()].sort((a, b) => a - b);
|
|
456
462
|
/** 第 k 步(含)之前原运行吸收到的最大位置;原运行没有模型调用时不设限。 */
|
|
@@ -465,7 +471,10 @@ export async function replayRun(d, s, candidate, evalRunId, signal) {
|
|
|
465
471
|
return cap;
|
|
466
472
|
};
|
|
467
473
|
const interjections = s.events
|
|
468
|
-
.filter((e) => (e.type === "user_message" ||
|
|
474
|
+
.filter((e) => (e.type === "user_message" ||
|
|
475
|
+
e.type === "background_task_finished" ||
|
|
476
|
+
e.type === "subagent_delivery") &&
|
|
477
|
+
e.seq > R)
|
|
469
478
|
.flatMap((e) => {
|
|
470
479
|
const step = stepsInOrder.find((k) => absorbed.get(k) >= e.seq);
|
|
471
480
|
return step === undefined ? [] : [{ event: e, step }];
|
|
@@ -532,6 +541,9 @@ export async function replayRun(d, s, candidate, evalRunId, signal) {
|
|
|
532
541
|
},
|
|
533
542
|
// replays never fire plugin hooks (the loop deps omit them too, P-18)
|
|
534
543
|
conversationKind: "eval",
|
|
544
|
+
// a child case offers a sub-agent's message tools, as its recorded requests did (a fork
|
|
545
|
+
// invocation's child, whose run a task with the invocation record started, has none)
|
|
546
|
+
...(subagent !== undefined && !forkRun && { subagent: true }),
|
|
535
547
|
});
|
|
536
548
|
}
|
|
537
549
|
catch (e) {
|
|
@@ -4,7 +4,7 @@ import { type Selection } from "../conversations/selection.js";
|
|
|
4
4
|
import type { KernelConfigService } from "../infra/config/kernel-config.service.js";
|
|
5
5
|
import { type MediaSourceDeps } from "../runtime/model-call.js";
|
|
6
6
|
import type { ProviderRegistry } from "../runtime/providers.js";
|
|
7
|
-
import { type DriftReason } from "./reconstruct.js";
|
|
7
|
+
import { type DriftReason, type SubagentTemplateRef } from "./reconstruct.js";
|
|
8
8
|
import type { CaseSnapshot } from "./snapshot.js";
|
|
9
9
|
/**
|
|
10
10
|
* 单步回放(D2 / C5):由用例快照还原某一步的模型请求,换成候选(agent 版本 / 模型 / 参数 / 指令)重发,
|
|
@@ -33,10 +33,7 @@ export interface ResolvedCandidate {
|
|
|
33
33
|
* A plugin template's child case: the template's current version (set by the worker), compared
|
|
34
34
|
* with the logged one for `subagent_changed` when the candidate changed.
|
|
35
35
|
*/
|
|
36
|
-
subagentTemplate?:
|
|
37
|
-
id: string;
|
|
38
|
-
version: number;
|
|
39
|
-
};
|
|
36
|
+
subagentTemplate?: SubagentTemplateRef;
|
|
40
37
|
/**
|
|
41
38
|
* A child case under another agent version: that version's own definition (with the candidate's
|
|
42
39
|
* instructions), compared with the logged sub-agent for `subagent_changed`. Never rendered.
|
|
@@ -2,7 +2,7 @@ import { sanitizeParams, } from "@capybara-hq/plugin-sdk";
|
|
|
2
2
|
import { effectiveDefinition, NO_SELECTION, sameModel, } from "../conversations/selection.js";
|
|
3
3
|
import { estimateTokens } from "../runtime/context/tokens.js";
|
|
4
4
|
import { consumeModelStream, MediaUnavailableError, } from "../runtime/model-call.js";
|
|
5
|
-
import { loadSnapshotMedia, reconstructRequest } from "./reconstruct.js";
|
|
5
|
+
import { loadSnapshotMedia, reconstructRequest, } from "./reconstruct.js";
|
|
6
6
|
/** 键排序后的 JSON(比较参数是否相同)。 */
|
|
7
7
|
const canonical = (v) => JSON.stringify(Object.keys(v)
|
|
8
8
|
.sort()
|
|
@@ -58,7 +58,7 @@ export type RunStatus = (typeof RUN_STATUSES)[number];
|
|
|
58
58
|
/**
|
|
59
59
|
* 轨迹查看器(D6、C1):只给组织管理员(admin / owner)与 agent 负责人。负责人与角色每次实时读(R5);
|
|
60
60
|
* 无权查看与不存在一律 `trajectory.not_found`,不泄露对话是否存在。每次查看详情写审计 `trajectory.viewed`。
|
|
61
|
-
*
|
|
61
|
+
* 超级管理员不因身份而能看(不是组织成员时 OrgGuard 已 404)。
|
|
62
62
|
*
|
|
63
63
|
* 列表按 `conversations.kind` 过滤,不传时只列 `chat`(评测回放的隐藏对话用 `kind: "eval"` 列出)。
|
|
64
64
|
* 评测对话(`kind = 'eval'`)只给组织管理员(Ruling S1-c):里面是管理员的候选指令,非管理员的 agent 负责人
|
|
@@ -98,8 +98,13 @@ export declare class TrajectoryService {
|
|
|
98
98
|
get(orgId: string, accountId: string, conversationId: string, actorTokenId?: string, window?: RunWindow): Promise<TrajectoryDetail>;
|
|
99
99
|
/** The parent call that first dispatched a sub-agent conversation. */
|
|
100
100
|
private firstDispatch;
|
|
101
|
-
/**
|
|
102
|
-
|
|
101
|
+
/**
|
|
102
|
+
* The agent of the root conversation of a sub-agent conversation's tree, from its parent `parentId`
|
|
103
|
+
* up (the same walk as `conversations/access.ts`: at most 16 levels, every conversation between
|
|
104
|
+
* a sub-agent conversation of the org, ending at one without a parent), or null when the chain
|
|
105
|
+
* leaves the org, passes another kind or does not end.
|
|
106
|
+
*/
|
|
107
|
+
private rootAgentId;
|
|
103
108
|
/**
|
|
104
109
|
* 窗口内已开始(`started_at` 非空,与轨迹只列有 `run_started` 的运行一致)的运行,按 (created_at, id) 倒序取
|
|
105
110
|
* `limit` 次;`before` 是上一页的 `next`(运行 id)。`next`:还有更早的运行时为本页最早一次的 id。
|
|
@@ -34,7 +34,7 @@ const notFound = () => new ApiError("trajectory.not_found", "Trajectory not foun
|
|
|
34
34
|
/**
|
|
35
35
|
* 轨迹查看器(D6、C1):只给组织管理员(admin / owner)与 agent 负责人。负责人与角色每次实时读(R5);
|
|
36
36
|
* 无权查看与不存在一律 `trajectory.not_found`,不泄露对话是否存在。每次查看详情写审计 `trajectory.viewed`。
|
|
37
|
-
*
|
|
37
|
+
* 超级管理员不因身份而能看(不是组织成员时 OrgGuard 已 404)。
|
|
38
38
|
*
|
|
39
39
|
* 列表按 `conversations.kind` 过滤,不传时只列 `chat`(评测回放的隐藏对话用 `kind: "eval"` 列出)。
|
|
40
40
|
* 评测对话(`kind = 'eval'`)只给组织管理员(Ruling S1-c):里面是管理员的候选指令,非管理员的 agent 负责人
|
|
@@ -180,11 +180,13 @@ let TrajectoryService = TrajectoryService_1 = class TrajectoryService {
|
|
|
180
180
|
.where("id", "=", conversationId)
|
|
181
181
|
.where("org_id", "=", orgId)
|
|
182
182
|
.executeTakeFirst();
|
|
183
|
-
// A sub-agent's trajectory is part of its
|
|
184
|
-
// conversation
|
|
185
|
-
//
|
|
183
|
+
// A sub-agent's trajectory is part of its tree's: authorized by the ROOT conversation's agent
|
|
184
|
+
// (the rule `parentReachable` applies to the conversation itself), never by the dispatched
|
|
185
|
+
// agent nor by the direct parent's, which below an org agent's child is that org agent (an org
|
|
186
|
+
// agent's owner must not read work drawn from someone else's conversation; batch 9 review I1,
|
|
187
|
+
// agent map final review: depth 2 and below)
|
|
186
188
|
const authAgentId = conv?.kind === "subagent"
|
|
187
|
-
? await this.
|
|
189
|
+
? await this.rootAgentId(orgId, conv.parent_conversation_id)
|
|
188
190
|
: conv?.agent_id;
|
|
189
191
|
if (!conv || authAgentId === null || authAgentId === undefined)
|
|
190
192
|
throw notFound();
|
|
@@ -276,17 +278,27 @@ let TrajectoryService = TrajectoryService_1 = class TrajectoryService {
|
|
|
276
278
|
callId: row.parent_call_id,
|
|
277
279
|
};
|
|
278
280
|
}
|
|
279
|
-
/**
|
|
280
|
-
|
|
281
|
+
/**
|
|
282
|
+
* The agent of the root conversation of a sub-agent conversation's tree, from its parent `parentId`
|
|
283
|
+
* up (the same walk as `conversations/access.ts`: at most 16 levels, every conversation between
|
|
284
|
+
* a sub-agent conversation of the org, ending at one without a parent), or null when the chain
|
|
285
|
+
* leaves the org, passes another kind or does not end.
|
|
286
|
+
*/
|
|
287
|
+
async rootAgentId(orgId, parentId) {
|
|
281
288
|
if (parentId === null)
|
|
282
289
|
return null;
|
|
283
|
-
const
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
+
const row = await sql `
|
|
291
|
+
WITH RECURSIVE up(id, parent, kind, agent_id, n) AS (
|
|
292
|
+
SELECT c.id, c.parent_conversation_id, c.kind, c.agent_id, 0
|
|
293
|
+
FROM capybara.conversations c
|
|
294
|
+
WHERE c.id = ${parentId} AND c.org_id = ${orgId}
|
|
295
|
+
UNION ALL
|
|
296
|
+
SELECT c.id, c.parent_conversation_id, c.kind, c.agent_id, up.n + 1
|
|
297
|
+
FROM capybara.conversations c JOIN up ON c.id = up.parent
|
|
298
|
+
WHERE up.kind = 'subagent' AND up.n < 16 AND c.org_id = ${orgId}
|
|
299
|
+
)
|
|
300
|
+
SELECT agent_id FROM up WHERE parent IS NULL LIMIT 1`.execute(this.db.db);
|
|
301
|
+
return row.rows[0]?.agent_id ?? null;
|
|
290
302
|
}
|
|
291
303
|
/**
|
|
292
304
|
* 窗口内已开始(`started_at` 非空,与轨迹只列有 `run_started` 的运行一致)的运行,按 (created_at, id) 倒序取
|
package/dist/evals/worker.d.ts
CHANGED
|
@@ -13,6 +13,7 @@ import { RunFinish } from "../runtime/run-finish.js";
|
|
|
13
13
|
import { AgentLoops, RunSteps } from "../runtime/run-steps.js";
|
|
14
14
|
import { EvalBudget } from "./budget.js";
|
|
15
15
|
import { type EvalJobData } from "./jobs.js";
|
|
16
|
+
import { type SubagentTemplateRef } from "./reconstruct.js";
|
|
16
17
|
import { type EvalReplayHooks, EvalReplaySeeder } from "./run-replay.js";
|
|
17
18
|
import { type CaseSnapshot } from "./snapshot.js";
|
|
18
19
|
/**
|
|
@@ -110,9 +111,8 @@ export declare class EvalWorker {
|
|
|
110
111
|
}
|
|
111
112
|
/**
|
|
112
113
|
* A plugin template's child case: the template's current version, which a new dispatch would use
|
|
113
|
-
* (a template removed since gets version 0, so it always differs)
|
|
114
|
+
* (a template removed since gets version 0, so it always differs), with the platform template
|
|
115
|
+
* whose content that is (absent: the org's own; a link or pin change under a copy's id changes
|
|
116
|
+
* it). Undefined for other cases.
|
|
114
117
|
*/
|
|
115
|
-
export declare function currentTemplate(db: KernelSchemaDb, s: CaseSnapshot): Promise<
|
|
116
|
-
id: string;
|
|
117
|
-
version: number;
|
|
118
|
-
} | undefined>;
|
|
118
|
+
export declare function currentTemplate(db: KernelSchemaDb, s: CaseSnapshot): Promise<SubagentTemplateRef | undefined>;
|
package/dist/evals/worker.js
CHANGED
|
@@ -34,7 +34,7 @@ import { replyParts, structuralDiff } from "./diff.js";
|
|
|
34
34
|
import { evalJobId } from "./jobs.js";
|
|
35
35
|
import { JUDGE_PROVIDER_UNAVAILABLE, judge } from "./judge.js";
|
|
36
36
|
import { userRequestOf } from "./plan.js";
|
|
37
|
-
import { subagentCaseChanged, subagentStartedOf } from "./reconstruct.js";
|
|
37
|
+
import { subagentCaseChanged, subagentStartedOf, } from "./reconstruct.js";
|
|
38
38
|
import { deleteEvalConversation, EvalReplaySeeder, ReplayClaimLost, replayRun, runBaseline, } from "./run-replay.js";
|
|
39
39
|
import { caseBase, versionDefinition } from "./runs.service.js";
|
|
40
40
|
import { readSnapshot, replayableCalls, toEvents } from "./snapshot.js";
|
|
@@ -878,12 +878,18 @@ EvalWorker = __decorate([
|
|
|
878
878
|
export { EvalWorker };
|
|
879
879
|
/**
|
|
880
880
|
* A plugin template's child case: the template's current version, which a new dispatch would use
|
|
881
|
-
* (a template removed since gets version 0, so it always differs)
|
|
881
|
+
* (a template removed since gets version 0, so it always differs), with the platform template
|
|
882
|
+
* whose content that is (absent: the org's own; a link or pin change under a copy's id changes
|
|
883
|
+
* it). Undefined for other cases.
|
|
882
884
|
*/
|
|
883
885
|
export async function currentTemplate(db, s) {
|
|
884
886
|
const t = subagentStartedOf(toEvents(s))?.template;
|
|
885
887
|
if (t?.source !== "plugin" || t.id === undefined)
|
|
886
888
|
return undefined;
|
|
887
889
|
const row = (await loadTemplates(db, s.orgId, [t.id])).get(t.id);
|
|
888
|
-
return {
|
|
890
|
+
return {
|
|
891
|
+
id: t.id,
|
|
892
|
+
version: row?.version ?? 0,
|
|
893
|
+
...(row?.platformTemplateId !== undefined && { platformTemplateId: row.platformTemplateId }),
|
|
894
|
+
};
|
|
889
895
|
}
|
|
@@ -1,8 +1,9 @@
|
|
|
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
|
+
import { OrgLock } from "../orgs/org-lock.js";
|
|
6
7
|
import { ExtensionAdmin, type PublishBus } from "./admin-view.js";
|
|
7
8
|
import { ExtensionBlobs } from "./blobs.js";
|
|
8
9
|
import { ExtensionLifecycle } from "./lifecycle.js";
|
|
@@ -15,14 +16,31 @@ import { ExtensionRegistry } from "./registry.js";
|
|
|
15
16
|
* the commit (a failure only warns; the periodic reconcile catches up); replicas converge through
|
|
16
17
|
* reconcile, no restart. It does not wait for replicas: the returned view may say `converging`.
|
|
17
18
|
* Stateless, shared by every replica; the CLI uses it too (`actor` is null).
|
|
18
|
-
* Every write runs in a transaction: first `
|
|
19
|
+
* Every write runs in a transaction: first `lockSuperAdminsAndAuthorize` (skipped by the CLI),
|
|
19
20
|
* then an advisory lock by extension name and a lock on the install record row.
|
|
20
21
|
*/
|
|
22
|
+
/**
|
|
23
|
+
* An operation an org admin runs as the owner of an org plugin (an owner update removing or putting
|
|
24
|
+
* back its extension, ruling P3-12'): the actor is re-checked as an admin of `orgId`
|
|
25
|
+
* (`catalog.upload`, under the org row lock) instead of as a super admin, and the audit records
|
|
26
|
+
* the actor with `ownerOrgId`.
|
|
27
|
+
*/
|
|
28
|
+
export interface ExtensionOpsOwner {
|
|
29
|
+
orgId: string;
|
|
30
|
+
/**
|
|
31
|
+
* Putting the extension back after a failed owner update: the actor was authorized when the
|
|
32
|
+
* update started, so no role is checked again (a demotion meanwhile must not leave the
|
|
33
|
+
* deployment without the extension it had); the audit keeps the actor, marked `rollback`.
|
|
34
|
+
*/
|
|
35
|
+
rollback?: true;
|
|
36
|
+
}
|
|
21
37
|
export declare class ExtensionAdminOps {
|
|
22
38
|
private readonly kdb;
|
|
23
39
|
readonly txHost: TransactionHost;
|
|
24
|
-
/** The
|
|
40
|
+
/** The super admin lock (identity/super-admin.ts): joins the transaction. */
|
|
25
41
|
private readonly adminLock;
|
|
42
|
+
/** The owner org's lock: an owner's operation re-checks its admin under it. */
|
|
43
|
+
private readonly orgLock;
|
|
26
44
|
private readonly installLock;
|
|
27
45
|
/**
|
|
28
46
|
* The admin view after the operation, degraded when the package cannot be read
|
|
@@ -45,8 +63,10 @@ export declare class ExtensionAdminOps {
|
|
|
45
63
|
private readonly lifecycle;
|
|
46
64
|
private readonly log;
|
|
47
65
|
constructor(kdb: KernelDb, txHost: TransactionHost,
|
|
48
|
-
/** The
|
|
49
|
-
adminLock:
|
|
66
|
+
/** The super admin lock (identity/super-admin.ts): joins the transaction. */
|
|
67
|
+
adminLock: SuperAdminLock,
|
|
68
|
+
/** The owner org's lock: an owner's operation re-checks its admin under it. */
|
|
69
|
+
orgLock: OrgLock, installLock: PluginInstallLock,
|
|
50
70
|
/**
|
|
51
71
|
* The admin view after the operation, degraded when the package cannot be read
|
|
52
72
|
* (`get(name, { allowUnreadable: true })`). If it throws, the operation has already committed:
|
|
@@ -70,7 +90,7 @@ export declare class ExtensionAdminOps {
|
|
|
70
90
|
* New install or version change (upgrade / downgrade): the install record points at package
|
|
71
91
|
* `sha256`; the desired state is unchanged (a new install is disabled). Audit `extension.installed`.
|
|
72
92
|
* - Config-declared -> `extension.config_declared`; a required bootstrap plugin may be
|
|
73
|
-
* installed at another version (
|
|
93
|
+
* installed at another version (a super admin upgrades it; `required` is kept);
|
|
74
94
|
* - package not in the package store -> `extension.package_not_found`; the extension name in the
|
|
75
95
|
* package is not `name` -> `extension.name_mismatch`;
|
|
76
96
|
* - an install record of the same name exists but comes from another npm package ->
|
|
@@ -86,7 +106,7 @@ export declare class ExtensionAdminOps {
|
|
|
86
106
|
* go back to a version whose migrations are a subset of those already run).
|
|
87
107
|
* Already pointing at the same package: nothing changes (no audit; for a changed source item only,
|
|
88
108
|
* see below).
|
|
89
|
-
* `opts.catalogItemId`: the source item when installing through the
|
|
109
|
+
* `opts.catalogItemId`: the source item when installing through the platform catalog, stored
|
|
90
110
|
* in `extension_installs.catalog_item_id` (F-AA) and registered in `extension_catalog_sources`;
|
|
91
111
|
* installing outside the catalog (upload / npm / CLI) **keeps** the existing source items (T26
|
|
92
112
|
* fix: clearing them would let org enablement bypass catalog policy, C22). The detail of the
|
|
@@ -96,17 +116,18 @@ export declare class ExtensionAdminOps {
|
|
|
96
116
|
*/
|
|
97
117
|
install(name: string, sha256: string, actor: string | null, actorTokenId?: string, opts?: {
|
|
98
118
|
catalogItemId?: string;
|
|
119
|
+
owner?: ExtensionOpsOwner;
|
|
99
120
|
}): Promise<AdminExtensionView>;
|
|
100
121
|
private writeInstall;
|
|
101
122
|
/** Enable on the deployment (audit `extension.enabled`); no change when already enabled. Org enablement is unchanged. */
|
|
102
|
-
enable(name: string, actor: string | null, actorTokenId?: string): Promise<AdminExtensionView>;
|
|
123
|
+
enable(name: string, actor: string | null, actorTokenId?: string, owner?: ExtensionOpsOwner): Promise<AdminExtensionView>;
|
|
103
124
|
/**
|
|
104
125
|
* Disables on the deployment (audit `extension.disabled`); no change when already disabled. Every
|
|
105
126
|
* replica unloads it (draining in-flight calls), and the extensions that `requires` it unload with
|
|
106
127
|
* it; the org enablement switch is unchanged and the org page shows it as unavailable. A required
|
|
107
128
|
* bootstrap plugin -> `extension.required`.
|
|
108
129
|
*/
|
|
109
|
-
disable(name: string, actor: string | null, actorTokenId?: string): Promise<AdminExtensionView>;
|
|
130
|
+
disable(name: string, actor: string | null, actorTokenId?: string, owner?: ExtensionOpsOwner): Promise<AdminExtensionView>;
|
|
110
131
|
/**
|
|
111
132
|
* Uninstall: a required bootstrap plugin -> `extension.required`; must be disabled first
|
|
112
133
|
* (otherwise `extension.not_disabled`); deletes the install record
|
|
@@ -115,7 +136,7 @@ export declare class ExtensionAdminOps {
|
|
|
115
136
|
* permission snapshot and the package in the package store are untouched (a reinstall picks them
|
|
116
137
|
* up).
|
|
117
138
|
*/
|
|
118
|
-
uninstall(name: string, actor: string | null, actorTokenId?: string): Promise<void>;
|
|
139
|
+
uninstall(name: string, actor: string | null, actorTokenId?: string, owner?: ExtensionOpsOwner): Promise<void>;
|
|
119
140
|
private writeUninstall;
|
|
120
141
|
private setState;
|
|
121
142
|
private writeState;
|
|
@@ -123,6 +144,11 @@ export declare class ExtensionAdminOps {
|
|
|
123
144
|
* 提交后的视图:拼视图失败(读包、查状态行出错)时操作已经生效,不能再报失败——记 error,返回降级视图。
|
|
124
145
|
*/
|
|
125
146
|
private viewAfterCommit;
|
|
147
|
+
/**
|
|
148
|
+
* Re-checks the actor in the operation's transaction: a super admin, or for an owner's operation
|
|
149
|
+
* an admin of the owner org; no account (the CLI, the kernel itself) is not checked.
|
|
150
|
+
*/
|
|
151
|
+
private authorize;
|
|
126
152
|
/** 配置声明的插件不经安装记录管理。 */
|
|
127
153
|
private assertInstallable;
|
|
128
154
|
/** 按插件名串行(`PluginInstallLock`,覆盖「还没有行」的新装),再锁住已有的安装记录行。 */
|
|
@@ -14,13 +14,14 @@ import semver from "semver";
|
|
|
14
14
|
import { pluginSchemaName } from "../ctx/create-ctx.js";
|
|
15
15
|
import { ApiError } from "../errors.js";
|
|
16
16
|
import { audit } from "../identity/audit.js";
|
|
17
|
-
import {
|
|
17
|
+
import { SuperAdminLock } from "../identity/super-admin.js";
|
|
18
18
|
import { KernelConfigService } from "../infra/config/kernel-config.service.js";
|
|
19
19
|
import { afterCommit } from "../infra/database/after-commit.js";
|
|
20
20
|
import { KernelDb } from "../infra/database/kernel-db.js";
|
|
21
21
|
import { TransactionHost } from "../infra/database/transaction-host.js";
|
|
22
22
|
import { Transactional } from "../infra/database/transactional.decorator.js";
|
|
23
23
|
import { KERNEL_BUS, KERNEL_LOGGER } from "../infra/tokens.js";
|
|
24
|
+
import { OrgLock } from "../orgs/org-lock.js";
|
|
24
25
|
import { ExtensionAdmin } from "./admin-view.js";
|
|
25
26
|
import { ExtensionBlobs } from "./blobs.js";
|
|
26
27
|
import { ExtensionLifecycle, PLUGINS_CHANGED_TOPIC } from "./lifecycle.js";
|
|
@@ -28,19 +29,11 @@ import { PluginInstallLock } from "./locks.js";
|
|
|
28
29
|
import { unrunMigrations } from "./migrate-lock.js";
|
|
29
30
|
import { ExtensionPackageError, extensionPackageApiError, readExtensionPackage, } from "./package.js";
|
|
30
31
|
import { ExtensionRegistry } from "./registry.js";
|
|
31
|
-
/**
|
|
32
|
-
* Deployment-level extension install / enable / disable / uninstall (C16 / D15): writes only the PG
|
|
33
|
-
* desired state (`extension_installs`) and the audit, then publishes `kernel.plugins.changed` after
|
|
34
|
-
* the commit (a failure only warns; the periodic reconcile catches up); replicas converge through
|
|
35
|
-
* reconcile, no restart. It does not wait for replicas: the returned view may say `converging`.
|
|
36
|
-
* Stateless, shared by every replica; the CLI uses it too (`actor` is null).
|
|
37
|
-
* Every write runs in a transaction: first `lockEnterpriseAdminsAndAuthorize` (skipped by the CLI),
|
|
38
|
-
* then an advisory lock by extension name and a lock on the install record row.
|
|
39
|
-
*/
|
|
40
32
|
let ExtensionAdminOps = class ExtensionAdminOps {
|
|
41
33
|
kdb;
|
|
42
34
|
txHost;
|
|
43
35
|
adminLock;
|
|
36
|
+
orgLock;
|
|
44
37
|
installLock;
|
|
45
38
|
admin;
|
|
46
39
|
registry;
|
|
@@ -50,8 +43,10 @@ let ExtensionAdminOps = class ExtensionAdminOps {
|
|
|
50
43
|
lifecycle;
|
|
51
44
|
log;
|
|
52
45
|
constructor(kdb, txHost,
|
|
53
|
-
/** The
|
|
54
|
-
adminLock,
|
|
46
|
+
/** The super admin lock (identity/super-admin.ts): joins the transaction. */
|
|
47
|
+
adminLock,
|
|
48
|
+
/** The owner org's lock: an owner's operation re-checks its admin under it. */
|
|
49
|
+
orgLock, installLock,
|
|
55
50
|
/**
|
|
56
51
|
* The admin view after the operation, degraded when the package cannot be read
|
|
57
52
|
* (`get(name, { allowUnreadable: true })`). If it throws, the operation has already committed:
|
|
@@ -73,6 +68,7 @@ let ExtensionAdminOps = class ExtensionAdminOps {
|
|
|
73
68
|
this.kdb = kdb;
|
|
74
69
|
this.txHost = txHost;
|
|
75
70
|
this.adminLock = adminLock;
|
|
71
|
+
this.orgLock = orgLock;
|
|
76
72
|
this.installLock = installLock;
|
|
77
73
|
this.admin = admin;
|
|
78
74
|
this.registry = registry;
|
|
@@ -89,7 +85,7 @@ let ExtensionAdminOps = class ExtensionAdminOps {
|
|
|
89
85
|
* New install or version change (upgrade / downgrade): the install record points at package
|
|
90
86
|
* `sha256`; the desired state is unchanged (a new install is disabled). Audit `extension.installed`.
|
|
91
87
|
* - Config-declared -> `extension.config_declared`; a required bootstrap plugin may be
|
|
92
|
-
* installed at another version (
|
|
88
|
+
* installed at another version (a super admin upgrades it; `required` is kept);
|
|
93
89
|
* - package not in the package store -> `extension.package_not_found`; the extension name in the
|
|
94
90
|
* package is not `name` -> `extension.name_mismatch`;
|
|
95
91
|
* - an install record of the same name exists but comes from another npm package ->
|
|
@@ -105,7 +101,7 @@ let ExtensionAdminOps = class ExtensionAdminOps {
|
|
|
105
101
|
* go back to a version whose migrations are a subset of those already run).
|
|
106
102
|
* Already pointing at the same package: nothing changes (no audit; for a changed source item only,
|
|
107
103
|
* see below).
|
|
108
|
-
* `opts.catalogItemId`: the source item when installing through the
|
|
104
|
+
* `opts.catalogItemId`: the source item when installing through the platform catalog, stored
|
|
109
105
|
* in `extension_installs.catalog_item_id` (F-AA) and registered in `extension_catalog_sources`;
|
|
110
106
|
* installing outside the catalog (upload / npm / CLI) **keeps** the existing source items (T26
|
|
111
107
|
* fix: clearing them would let org enablement bypass catalog policy, C22). The detail of the
|
|
@@ -140,8 +136,7 @@ let ExtensionAdminOps = class ExtensionAdminOps {
|
|
|
140
136
|
}
|
|
141
137
|
async writeInstall(name, sha256, pkg, target, actor, actorTokenId, opts) {
|
|
142
138
|
const db = this.db;
|
|
143
|
-
|
|
144
|
-
await this.adminLock.lockAndAuthorize(actor);
|
|
139
|
+
await this.authorize(actor, opts.owner);
|
|
145
140
|
const row = await this.lockRow(name);
|
|
146
141
|
// 不经目录重装时保留原来的来源条目(不清空,C22)
|
|
147
142
|
const catalogItemId = opts.catalogItemId ?? row?.catalog_item_id ?? null;
|
|
@@ -221,13 +216,14 @@ let ExtensionAdminOps = class ExtensionAdminOps {
|
|
|
221
216
|
.execute();
|
|
222
217
|
await this.audit(actor, actorTokenId, "extension.installed", name, pkg.version, sha256, {
|
|
223
218
|
catalogItemId,
|
|
219
|
+
...ownerDetail(opts.owner),
|
|
224
220
|
});
|
|
225
221
|
afterCommit(() => this.notify(name));
|
|
226
222
|
return { changed: true, state: row?.desired_state ?? "disabled" };
|
|
227
223
|
}
|
|
228
224
|
/** Enable on the deployment (audit `extension.enabled`); no change when already enabled. Org enablement is unchanged. */
|
|
229
|
-
enable(name, actor, actorTokenId) {
|
|
230
|
-
return this.setState(name, "enabled", actor, actorTokenId);
|
|
225
|
+
enable(name, actor, actorTokenId, owner) {
|
|
226
|
+
return this.setState(name, "enabled", actor, actorTokenId, owner);
|
|
231
227
|
}
|
|
232
228
|
/**
|
|
233
229
|
* Disables on the deployment (audit `extension.disabled`); no change when already disabled. Every
|
|
@@ -235,8 +231,8 @@ let ExtensionAdminOps = class ExtensionAdminOps {
|
|
|
235
231
|
* it; the org enablement switch is unchanged and the org page shows it as unavailable. A required
|
|
236
232
|
* bootstrap plugin -> `extension.required`.
|
|
237
233
|
*/
|
|
238
|
-
disable(name, actor, actorTokenId) {
|
|
239
|
-
return this.setState(name, "disabled", actor, actorTokenId);
|
|
234
|
+
disable(name, actor, actorTokenId, owner) {
|
|
235
|
+
return this.setState(name, "disabled", actor, actorTokenId, owner);
|
|
240
236
|
}
|
|
241
237
|
/**
|
|
242
238
|
* Uninstall: a required bootstrap plugin -> `extension.required`; must be disabled first
|
|
@@ -246,14 +242,13 @@ let ExtensionAdminOps = class ExtensionAdminOps {
|
|
|
246
242
|
* permission snapshot and the package in the package store are untouched (a reinstall picks them
|
|
247
243
|
* up).
|
|
248
244
|
*/
|
|
249
|
-
async uninstall(name, actor, actorTokenId) {
|
|
245
|
+
async uninstall(name, actor, actorTokenId, owner) {
|
|
250
246
|
this.assertInstallable(name);
|
|
251
|
-
await this.writeUninstall(name, actor, actorTokenId);
|
|
247
|
+
await this.writeUninstall(name, actor, actorTokenId, owner);
|
|
252
248
|
}
|
|
253
|
-
async writeUninstall(name, actor, actorTokenId) {
|
|
249
|
+
async writeUninstall(name, actor, actorTokenId, owner) {
|
|
254
250
|
const db = this.db;
|
|
255
|
-
|
|
256
|
-
await this.adminLock.lockAndAuthorize(actor);
|
|
251
|
+
await this.authorize(actor, owner);
|
|
257
252
|
const row = await this.lockRow(name);
|
|
258
253
|
if (!row)
|
|
259
254
|
throw notFound(name);
|
|
@@ -265,22 +260,21 @@ let ExtensionAdminOps = class ExtensionAdminOps {
|
|
|
265
260
|
await db.deleteFrom("extension_installs").where("name", "=", name).execute();
|
|
266
261
|
// 来源条目随安装记录一起删:之后不经目录重新安装时不再受旧条目的策略约束(T26 裁决)
|
|
267
262
|
await db.deleteFrom("extension_catalog_sources").where("plugin", "=", name).execute();
|
|
268
|
-
await this.audit(actor, actorTokenId, "extension.uninstalled", name, row.version, row.sha256);
|
|
263
|
+
await this.audit(actor, actorTokenId, "extension.uninstalled", name, row.version, row.sha256, ownerDetail(owner));
|
|
269
264
|
afterCommit(() => this.notify(name));
|
|
270
265
|
}
|
|
271
|
-
async setState(name, state, actor, actorTokenId) {
|
|
266
|
+
async setState(name, state, actor, actorTokenId, owner) {
|
|
272
267
|
this.assertInstallable(name);
|
|
273
|
-
const result = await this.writeState(name, state, actor, actorTokenId);
|
|
268
|
+
const result = await this.writeState(name, state, actor, actorTokenId, owner);
|
|
274
269
|
return this.viewAfterCommit(name, {
|
|
275
270
|
version: result.row.version,
|
|
276
271
|
sha256: result.row.sha256,
|
|
277
272
|
state,
|
|
278
273
|
});
|
|
279
274
|
}
|
|
280
|
-
async writeState(name, state, actor, actorTokenId) {
|
|
275
|
+
async writeState(name, state, actor, actorTokenId, owner) {
|
|
281
276
|
const db = this.db;
|
|
282
|
-
|
|
283
|
-
await this.adminLock.lockAndAuthorize(actor);
|
|
277
|
+
await this.authorize(actor, owner);
|
|
284
278
|
const row = await this.lockRow(name);
|
|
285
279
|
if (!row)
|
|
286
280
|
throw notFound(name);
|
|
@@ -297,7 +291,7 @@ let ExtensionAdminOps = class ExtensionAdminOps {
|
|
|
297
291
|
})
|
|
298
292
|
.where("name", "=", name)
|
|
299
293
|
.execute();
|
|
300
|
-
await this.audit(actor, actorTokenId, state === "enabled" ? "extension.enabled" : "extension.disabled", name, row.version, row.sha256);
|
|
294
|
+
await this.audit(actor, actorTokenId, state === "enabled" ? "extension.enabled" : "extension.disabled", name, row.version, row.sha256, ownerDetail(owner));
|
|
301
295
|
afterCommit(() => this.notify(name));
|
|
302
296
|
return { row, changed: true };
|
|
303
297
|
}
|
|
@@ -316,6 +310,22 @@ let ExtensionAdminOps = class ExtensionAdminOps {
|
|
|
316
310
|
return fallbackView(name, known, err);
|
|
317
311
|
}
|
|
318
312
|
}
|
|
313
|
+
/**
|
|
314
|
+
* Re-checks the actor in the operation's transaction: a super admin, or for an owner's operation
|
|
315
|
+
* an admin of the owner org; no account (the CLI, the kernel itself) is not checked.
|
|
316
|
+
*/
|
|
317
|
+
async authorize(actor, owner) {
|
|
318
|
+
if (owner?.rollback === true)
|
|
319
|
+
return;
|
|
320
|
+
if (owner !== undefined) {
|
|
321
|
+
if (actor === null)
|
|
322
|
+
throw new Error("an owner's extension operation has an actor");
|
|
323
|
+
await this.orgLock.lockAndAuthorize(owner.orgId, actor, "catalog.upload");
|
|
324
|
+
}
|
|
325
|
+
else if (actor !== null) {
|
|
326
|
+
await this.adminLock.lockAndAuthorize(actor);
|
|
327
|
+
}
|
|
328
|
+
}
|
|
319
329
|
/** 配置声明的插件不经安装记录管理。 */
|
|
320
330
|
assertInstallable(name) {
|
|
321
331
|
const declared = this.registry.declared().get(name);
|
|
@@ -372,6 +382,9 @@ __decorate([
|
|
|
372
382
|
__decorate([
|
|
373
383
|
Transactional()
|
|
374
384
|
], ExtensionAdminOps.prototype, "writeState", null);
|
|
385
|
+
__decorate([
|
|
386
|
+
Transactional({ propagation: "mandatory" })
|
|
387
|
+
], ExtensionAdminOps.prototype, "authorize", null);
|
|
375
388
|
__decorate([
|
|
376
389
|
Transactional({ propagation: "mandatory" })
|
|
377
390
|
], ExtensionAdminOps.prototype, "lockRow", null);
|
|
@@ -379,15 +392,16 @@ ExtensionAdminOps = __decorate([
|
|
|
379
392
|
Injectable(),
|
|
380
393
|
__param(0, Inject(KernelDb)),
|
|
381
394
|
__param(1, Inject(TransactionHost)),
|
|
382
|
-
__param(2, Inject(
|
|
383
|
-
__param(3, Inject(
|
|
384
|
-
__param(4, Inject(
|
|
385
|
-
__param(5, Inject(
|
|
386
|
-
__param(6, Inject(
|
|
387
|
-
__param(7, Inject(
|
|
388
|
-
__param(8, Inject(
|
|
389
|
-
__param(9, Inject(
|
|
390
|
-
__param(10, Inject(
|
|
395
|
+
__param(2, Inject(SuperAdminLock)),
|
|
396
|
+
__param(3, Inject(OrgLock)),
|
|
397
|
+
__param(4, Inject(PluginInstallLock)),
|
|
398
|
+
__param(5, Inject(ExtensionAdmin)),
|
|
399
|
+
__param(6, Inject(ExtensionRegistry)),
|
|
400
|
+
__param(7, Inject(ExtensionBlobs)),
|
|
401
|
+
__param(8, Inject(KernelConfigService)),
|
|
402
|
+
__param(9, Inject(KERNEL_BUS)),
|
|
403
|
+
__param(10, Inject(ExtensionLifecycle)),
|
|
404
|
+
__param(11, Inject(KERNEL_LOGGER))
|
|
391
405
|
], ExtensionAdminOps);
|
|
392
406
|
export { ExtensionAdminOps };
|
|
393
407
|
/**
|
|
@@ -418,6 +432,9 @@ function fallbackView(name, known, err) {
|
|
|
418
432
|
configValid: true,
|
|
419
433
|
removable: true,
|
|
420
434
|
required: false,
|
|
435
|
+
scope: null,
|
|
436
|
+
enabledOrgs: 0,
|
|
437
|
+
builtin: false,
|
|
421
438
|
installSource: null,
|
|
422
439
|
error: `the change was saved, but its current status cannot be read: ${err instanceof Error ? err.message : String(err)}`,
|
|
423
440
|
};
|
|
@@ -443,7 +460,13 @@ async function hasRetainedData(db, name) {
|
|
|
443
460
|
.executeTakeFirst();
|
|
444
461
|
return hit !== undefined;
|
|
445
462
|
}
|
|
446
|
-
const required = (name) => new ApiError("extension.required", `Extension ${name} is required by this deployment (a bootstrap plugin): it is enabled in every organization and cannot be disabled or uninstalled;
|
|
463
|
+
const required = (name) => new ApiError("extension.required", `Extension ${name} is required by this deployment (a bootstrap plugin): it is enabled in every organization and cannot be disabled or uninstalled; a super admin can upgrade it`);
|
|
447
464
|
const notFound = (name) => new ApiError("extension.not_found", `Extension ${name} is not installed in this deployment`);
|
|
448
465
|
/** `to` 比 `from` 旧(任一方不是合法 semver 时不算降级)。 */
|
|
449
466
|
const isDowngrade = (to, from) => semver.valid(to) !== null && semver.valid(from) !== null && semver.lt(to, from);
|
|
467
|
+
/** The audit detail of an owner's operation. */
|
|
468
|
+
function ownerDetail(owner) {
|
|
469
|
+
if (owner === undefined)
|
|
470
|
+
return {};
|
|
471
|
+
return { ownerOrgId: owner.orgId, ...(owner.rollback === true && { rollback: true }) };
|
|
472
|
+
}
|