@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/http/app.js
CHANGED
|
@@ -3,9 +3,11 @@ import fastifyCookie from "@fastify/cookie";
|
|
|
3
3
|
import { ApiError, errorBody } from "../errors.js";
|
|
4
4
|
import { AccountsService } from "../identity/accounts.js";
|
|
5
5
|
import { ApiTokenService } from "../identity/api-tokens.js";
|
|
6
|
-
import {
|
|
6
|
+
import { authenticateOrgUploader, authorizeSuperAdmin, } from "../identity/auth.guard.js";
|
|
7
7
|
import { SessionService } from "../identity/sessions.js";
|
|
8
|
+
import { KernelDb } from "../infra/database/kernel-db.js";
|
|
8
9
|
import { withLogContext } from "../log-context.js";
|
|
10
|
+
import { authorizeOrgAction } from "../orgs/org.guard.js";
|
|
9
11
|
import { redactPath } from "./error.filter.js";
|
|
10
12
|
import { registerGatewayRoutes } from "./gateway-routes.js";
|
|
11
13
|
import { createPluginRouter, registerPluginDispatch, staticRouteTable, } from "./plugin-dispatch.js";
|
|
@@ -13,14 +15,24 @@ import { createPluginRouter, registerPluginDispatch, staticRouteTable, } from ".
|
|
|
13
15
|
export const EXTENSION_PACKAGE_UPLOAD_ROUTE = "/api/v1/admin/extensions/packages/file";
|
|
14
16
|
/** The plugin package upload route of the catalog import (Fastify route template). */
|
|
15
17
|
export const CATALOG_UPLOAD_ROUTE = "/api/v1/admin/catalog/import/file";
|
|
18
|
+
/** The platform skill version upload route (a skill package zip as the raw body). */
|
|
19
|
+
export const COMPONENT_SKILL_UPLOAD_ROUTE = "/api/v1/admin/components/skill/:id/versions";
|
|
16
20
|
/**
|
|
17
21
|
* The upload routes that take raw bytes (`application/octet-stream`, limit `packages.maxBytes`,
|
|
18
|
-
* the
|
|
22
|
+
* the super admin is authenticated before the body is read).
|
|
19
23
|
*/
|
|
20
24
|
export const PACKAGE_UPLOAD_ROUTES = new Set([
|
|
21
25
|
EXTENSION_PACKAGE_UPLOAD_ROUTE,
|
|
22
26
|
CATALOG_UPLOAD_ROUTE,
|
|
27
|
+
COMPONENT_SKILL_UPLOAD_ROUTE,
|
|
23
28
|
]);
|
|
29
|
+
/** An org admin's plugin package upload (spec §14, ruling P3-7; a tgz as the raw body). */
|
|
30
|
+
export const ORG_PLUGIN_UPLOAD_ROUTE = "/api/v1/orgs/:orgId/catalog/uploads/file";
|
|
31
|
+
/**
|
|
32
|
+
* The org routes that take raw package bytes (limit `packages.maxBytes`): before the body is read
|
|
33
|
+
* the caller is authenticated as a person with the org role of `catalog.upload` (ruling P3-29).
|
|
34
|
+
*/
|
|
35
|
+
export const ORG_PACKAGE_UPLOAD_ROUTES = new Set([ORG_PLUGIN_UPLOAD_ROUTE]);
|
|
24
36
|
/** Paths without an access log line (probes). */
|
|
25
37
|
const QUIET_PATHS = new Set(["/healthz", "/readyz"]);
|
|
26
38
|
/**
|
|
@@ -92,11 +104,12 @@ export async function createHttpApp(opts, app) {
|
|
|
92
104
|
if (LARGE_BODY_ROUTES.has(r.url) && [r.method].flat().includes("POST")) {
|
|
93
105
|
r.bodyLimit = LARGE_BODY_LIMIT;
|
|
94
106
|
}
|
|
95
|
-
|
|
107
|
+
const upload = PACKAGE_UPLOAD_ROUTES.has(r.url) || ORG_PACKAGE_UPLOAD_ROUTES.has(r.url);
|
|
108
|
+
if (upload && opts.packageMaxBytes !== undefined) {
|
|
96
109
|
r.bodyLimit = opts.packageMaxBytes + 1;
|
|
97
110
|
}
|
|
98
111
|
});
|
|
99
|
-
//
|
|
112
|
+
// 读请求体之前:包上传(插件包、平台目录包)先认证(未认证 / 非超级管理员的大请求体不读进内存);其余内核路由不收
|
|
100
113
|
// application/octet-stream(415)。插件路由 /plugins/* 在自己的作用域里收任何类型,不受影响
|
|
101
114
|
let authServices;
|
|
102
115
|
const services = () => {
|
|
@@ -119,7 +132,20 @@ export async function createHttpApp(opts, app) {
|
|
|
119
132
|
return;
|
|
120
133
|
if (req.method === "POST" && PACKAGE_UPLOAD_ROUTES.has(req.routeOptions.url ?? "")) {
|
|
121
134
|
try {
|
|
122
|
-
await
|
|
135
|
+
await authorizeSuperAdmin(req, services());
|
|
136
|
+
}
|
|
137
|
+
catch (e) {
|
|
138
|
+
return sendError(reply, e, req.method, req.url);
|
|
139
|
+
}
|
|
140
|
+
return;
|
|
141
|
+
}
|
|
142
|
+
if (req.method === "POST" && ORG_PACKAGE_UPLOAD_ROUTES.has(req.routeOptions.url ?? "")) {
|
|
143
|
+
try {
|
|
144
|
+
// the org admin role before the body (ruling P3-29): no one else makes the kernel buffer
|
|
145
|
+
// a package-sized body
|
|
146
|
+
const principal = await authenticateOrgUploader(req, services());
|
|
147
|
+
const orgId = req.params.orgId ?? "";
|
|
148
|
+
await authorizeOrgAction(app.get(KernelDb, { strict: false }).db, principal, orgId, "catalog.upload");
|
|
123
149
|
}
|
|
124
150
|
catch (e) {
|
|
125
151
|
return sendError(reply, e, req.method, req.url);
|
|
@@ -3,31 +3,31 @@ import { SetupLock } from "../admin/setup-lock.js";
|
|
|
3
3
|
import type { AccountsTable } from "../db/kernel-schema.js";
|
|
4
4
|
import { KernelDb } from "../infra/database/kernel-db.js";
|
|
5
5
|
import { TransactionHost } from "../infra/database/transaction-host.js";
|
|
6
|
-
import {
|
|
6
|
+
import { SuperAdminLock } from "./super-admin.js";
|
|
7
7
|
export interface Account {
|
|
8
8
|
id: string;
|
|
9
9
|
displayName: string;
|
|
10
10
|
email: string | null;
|
|
11
11
|
status: "active" | "disabled";
|
|
12
|
-
|
|
12
|
+
isSuperAdmin: boolean;
|
|
13
13
|
createdAt: Date;
|
|
14
14
|
}
|
|
15
|
-
/**
|
|
15
|
+
/** 超级管理员可改的账号字段。 */
|
|
16
16
|
export type AccountPatch = {
|
|
17
17
|
displayName?: string;
|
|
18
18
|
status?: "active" | "disabled";
|
|
19
|
-
|
|
19
|
+
isSuperAdmin?: boolean;
|
|
20
20
|
};
|
|
21
21
|
/** 构造 `Account` 所需的 accounts 列(供跨表查询 select 使用)。 */
|
|
22
|
-
export declare const ACCOUNT_COLUMNS: readonly ["accounts.id", "accounts.display_name", "accounts.email", "accounts.status", "accounts.
|
|
23
|
-
type AccountRow = Pick<Selectable<AccountsTable>, "id" | "display_name" | "email" | "status" | "
|
|
22
|
+
export declare const ACCOUNT_COLUMNS: readonly ["accounts.id", "accounts.display_name", "accounts.email", "accounts.status", "accounts.is_super_admin", "accounts.created_at"];
|
|
23
|
+
type AccountRow = Pick<Selectable<AccountsTable>, "id" | "display_name" | "email" | "status" | "is_super_admin" | "created_at">;
|
|
24
24
|
export declare function toAccount(r: AccountRow): Account;
|
|
25
25
|
export interface LocalAccountInput {
|
|
26
26
|
login: string;
|
|
27
27
|
password: string;
|
|
28
28
|
displayName: string;
|
|
29
29
|
email?: string;
|
|
30
|
-
|
|
30
|
+
superAdmin?: boolean;
|
|
31
31
|
}
|
|
32
32
|
/**
|
|
33
33
|
* Accounts: local account creation, authentication and administration. Every write is
|
|
@@ -39,7 +39,7 @@ export declare class AccountsService {
|
|
|
39
39
|
readonly txHost: TransactionHost;
|
|
40
40
|
private readonly adminLock;
|
|
41
41
|
private readonly setupLock;
|
|
42
|
-
constructor(db: KernelDb, txHost: TransactionHost, adminLock:
|
|
42
|
+
constructor(db: KernelDb, txHost: TransactionHost, adminLock: SuperAdminLock, setupLock: SetupLock);
|
|
43
43
|
/** Checks the password length and hashes it (scrypt, slow): for callers that hash before their transaction opens. */
|
|
44
44
|
hashNewPassword(password: string): Promise<string>;
|
|
45
45
|
/**
|
|
@@ -49,28 +49,28 @@ export declare class AccountsService {
|
|
|
49
49
|
*/
|
|
50
50
|
createLocal(input: LocalAccountInput, passwordHash?: string): Promise<Account>;
|
|
51
51
|
/**
|
|
52
|
-
*
|
|
53
|
-
*
|
|
52
|
+
* A super admin creates a local account (optionally a super admin): under the
|
|
53
|
+
* super admin lock, re-checks that the actor is still an active super admin (else
|
|
54
54
|
* `forbidden`), creates the account and audits `account.created`. The hash is computed before
|
|
55
55
|
* the lock.
|
|
56
56
|
*/
|
|
57
57
|
createByAdmin(input: LocalAccountInput, actorAccountId: string, actorTokenId?: string): Promise<Account>;
|
|
58
58
|
private createByAdminIn;
|
|
59
59
|
/**
|
|
60
|
-
* CLI: creates
|
|
60
|
+
* CLI: creates a super admin without checking whether the deployment is set up; a taken
|
|
61
61
|
* login → `account.login_taken`.
|
|
62
62
|
*/
|
|
63
|
-
|
|
63
|
+
createSuperAdmin(input: SuperAdminInput): Promise<Account>;
|
|
64
64
|
/**
|
|
65
|
-
* CLI `admin create --if-none`: creates
|
|
65
|
+
* CLI `admin create --if-none`: creates a super admin only when no active one exists. The
|
|
66
66
|
* check and the insert run in one transaction under {@link SetupLock}, the lock the web setup
|
|
67
67
|
* takes, so concurrent runs (and a concurrent web setup) create exactly one. Returns undefined
|
|
68
|
-
* when an active
|
|
68
|
+
* when an active super admin already exists; a taken login still throws
|
|
69
69
|
* `account.login_taken`.
|
|
70
70
|
*/
|
|
71
|
-
|
|
72
|
-
private
|
|
73
|
-
private
|
|
71
|
+
createSuperAdminIfNone(input: SuperAdminInput): Promise<Account | undefined>;
|
|
72
|
+
private createSuperAdminIfNoneIn;
|
|
73
|
+
private insertSuperAdmin;
|
|
74
74
|
authenticateLocal(login: string, password: string): Promise<Account | null>;
|
|
75
75
|
/** 按账号 id 校验本地密码(改密码时核对旧密码);没有本地密码、超长或不符 → false。 */
|
|
76
76
|
verifyPassword(accountId: string, password: string): Promise<boolean>;
|
|
@@ -92,7 +92,7 @@ export declare class AccountsService {
|
|
|
92
92
|
private changePasswordIn;
|
|
93
93
|
update(id: string, patch: AccountPatch, actorAccountId: string, actorTokenId?: string): Promise<Account>;
|
|
94
94
|
/**
|
|
95
|
-
*
|
|
95
|
+
* A super admin changes an account. Disabling (`status: "disabled"`) revokes the
|
|
96
96
|
* account's sessions (`sessions.revoked_at`) and personal tokens in **the same PG transaction**,
|
|
97
97
|
* all or nothing; returns the revoked session ids, whose Redis markers the caller writes after
|
|
98
98
|
* the commit (the fast path; a failure is only a warning: auth reads PG).
|
|
@@ -102,35 +102,35 @@ export declare class AccountsService {
|
|
|
102
102
|
revokedSessionIds: string[];
|
|
103
103
|
}>;
|
|
104
104
|
/**
|
|
105
|
-
* The CLI's `capybara admin grant|revoke <login>` (no actor account): changes the
|
|
106
|
-
* admin flag by local login under the
|
|
107
|
-
* {@link updateAccount} "last active
|
|
105
|
+
* The CLI's `capybara admin grant|revoke <login>` (no actor account): changes the super
|
|
106
|
+
* admin flag by local login under the super admin lock; revoking keeps the
|
|
107
|
+
* {@link updateAccount} "last active super admin" check (`account.last_super_admin`),
|
|
108
108
|
* decided under the lock, so it cannot race a web revoke into none. Audit `account.updated`
|
|
109
109
|
* without an actor, `detail.via = "cli"`. Already in the target state → no change and no audit
|
|
110
110
|
* (`changed: false`). Unknown login → `account.not_found`.
|
|
111
111
|
*/
|
|
112
|
-
|
|
112
|
+
setSuperAdminByLogin(login: string, isSuperAdmin: boolean): Promise<{
|
|
113
113
|
account: Account;
|
|
114
114
|
changed: boolean;
|
|
115
115
|
}>;
|
|
116
|
-
private
|
|
116
|
+
private setSuperAdminIn;
|
|
117
117
|
/** 全部账号数(含停用的;后台概览)。 */
|
|
118
118
|
count(): Promise<number>;
|
|
119
|
-
/** Active (status = active)
|
|
120
|
-
|
|
119
|
+
/** Active (status = active) super admins, in the context's transaction when there is one. */
|
|
120
|
+
countSuperAdmins(): Promise<number>;
|
|
121
121
|
/** Inserts the account, its local identity and password; a taken login → `account.login_taken`. */
|
|
122
122
|
private insertLocal;
|
|
123
123
|
/** Writes (or replaces) the local password hash; a missing account → `account.not_found`. */
|
|
124
124
|
private writePassword;
|
|
125
125
|
/**
|
|
126
|
-
* Changes the account under the
|
|
127
|
-
* re-checks "the last active
|
|
126
|
+
* Changes the account under the super admin lock the caller holds: updates the row,
|
|
127
|
+
* re-checks "the last active super admin", audits `account.updated`; disabling revokes the
|
|
128
128
|
* account's sessions and personal tokens.
|
|
129
129
|
*/
|
|
130
130
|
private applyUpdate;
|
|
131
131
|
}
|
|
132
|
-
/** Input of the CLI
|
|
133
|
-
export interface
|
|
132
|
+
/** Input of the CLI super admin creation. */
|
|
133
|
+
export interface SuperAdminInput {
|
|
134
134
|
login: string;
|
|
135
135
|
password: string;
|
|
136
136
|
displayName: string;
|
|
@@ -16,16 +16,16 @@ import { KernelDb } from "../infra/database/kernel-db.js";
|
|
|
16
16
|
import { TransactionHost } from "../infra/database/transaction-host.js";
|
|
17
17
|
import { Transactional } from "../infra/database/transactional.decorator.js";
|
|
18
18
|
import { audit } from "./audit.js";
|
|
19
|
-
import { EnterpriseAdminLock, EnterpriseAdminLockModule } from "./enterprise-admin.js";
|
|
20
19
|
import { MAX_PASSWORD_LENGTH, normalizeLogin, validatePassword } from "./login.js";
|
|
21
20
|
import { DUMMY_PASSWORD_HASH, hashPassword, verifyPassword } from "./passwords.js";
|
|
21
|
+
import { SuperAdminLock, SuperAdminLockModule } from "./super-admin.js";
|
|
22
22
|
/** 构造 `Account` 所需的 accounts 列(供跨表查询 select 使用)。 */
|
|
23
23
|
export const ACCOUNT_COLUMNS = [
|
|
24
24
|
"accounts.id",
|
|
25
25
|
"accounts.display_name",
|
|
26
26
|
"accounts.email",
|
|
27
27
|
"accounts.status",
|
|
28
|
-
"accounts.
|
|
28
|
+
"accounts.is_super_admin",
|
|
29
29
|
"accounts.created_at",
|
|
30
30
|
];
|
|
31
31
|
export function toAccount(r) {
|
|
@@ -34,7 +34,7 @@ export function toAccount(r) {
|
|
|
34
34
|
displayName: r.display_name,
|
|
35
35
|
email: r.email,
|
|
36
36
|
status: r.status,
|
|
37
|
-
|
|
37
|
+
isSuperAdmin: r.is_super_admin,
|
|
38
38
|
createdAt: r.created_at,
|
|
39
39
|
};
|
|
40
40
|
}
|
|
@@ -82,8 +82,8 @@ let AccountsService = class AccountsService {
|
|
|
82
82
|
return this.insertLocal(await prepareLocal(input, passwordHash));
|
|
83
83
|
}
|
|
84
84
|
/**
|
|
85
|
-
*
|
|
86
|
-
*
|
|
85
|
+
* A super admin creates a local account (optionally a super admin): under the
|
|
86
|
+
* super admin lock, re-checks that the actor is still an active super admin (else
|
|
87
87
|
* `forbidden`), creates the account and audits `account.created`. The hash is computed before
|
|
88
88
|
* the lock.
|
|
89
89
|
*/
|
|
@@ -98,45 +98,45 @@ let AccountsService = class AccountsService {
|
|
|
98
98
|
...(actorTokenId !== undefined && { actorTokenId }),
|
|
99
99
|
action: "account.created",
|
|
100
100
|
target: a.id,
|
|
101
|
-
detail: {
|
|
101
|
+
detail: { superAdmin: a.isSuperAdmin },
|
|
102
102
|
});
|
|
103
103
|
return a;
|
|
104
104
|
}
|
|
105
105
|
/**
|
|
106
|
-
* CLI: creates
|
|
106
|
+
* CLI: creates a super admin without checking whether the deployment is set up; a taken
|
|
107
107
|
* login → `account.login_taken`.
|
|
108
108
|
*/
|
|
109
|
-
async
|
|
110
|
-
return this.
|
|
109
|
+
async createSuperAdmin(input) {
|
|
110
|
+
return this.insertSuperAdmin(input, await this.hashNewPassword(input.password));
|
|
111
111
|
}
|
|
112
112
|
/**
|
|
113
|
-
* CLI `admin create --if-none`: creates
|
|
113
|
+
* CLI `admin create --if-none`: creates a super admin only when no active one exists. The
|
|
114
114
|
* check and the insert run in one transaction under {@link SetupLock}, the lock the web setup
|
|
115
115
|
* takes, so concurrent runs (and a concurrent web setup) create exactly one. Returns undefined
|
|
116
|
-
* when an active
|
|
116
|
+
* when an active super admin already exists; a taken login still throws
|
|
117
117
|
* `account.login_taken`.
|
|
118
118
|
*/
|
|
119
|
-
async
|
|
120
|
-
return this.
|
|
119
|
+
async createSuperAdminIfNone(input) {
|
|
120
|
+
return this.createSuperAdminIfNoneIn(input, await this.hashNewPassword(input.password));
|
|
121
121
|
}
|
|
122
|
-
async
|
|
122
|
+
async createSuperAdminIfNoneIn(input, passwordHash) {
|
|
123
123
|
await this.setupLock.lock();
|
|
124
|
-
if ((await this.
|
|
124
|
+
if ((await this.countSuperAdmins()) > 0)
|
|
125
125
|
return undefined;
|
|
126
|
-
return this.
|
|
126
|
+
return this.insertSuperAdmin(input, passwordHash);
|
|
127
127
|
}
|
|
128
|
-
async
|
|
128
|
+
async insertSuperAdmin(input, passwordHash) {
|
|
129
129
|
const account = await this.createLocal({
|
|
130
130
|
login: input.login,
|
|
131
131
|
password: input.password,
|
|
132
132
|
displayName: input.displayName,
|
|
133
|
-
|
|
133
|
+
superAdmin: true,
|
|
134
134
|
...(input.email !== undefined && { email: input.email }),
|
|
135
135
|
}, passwordHash);
|
|
136
136
|
await audit(this.db.db, {
|
|
137
137
|
action: "account.created",
|
|
138
138
|
target: account.id,
|
|
139
|
-
detail: {
|
|
139
|
+
detail: { superAdmin: true, via: "cli" },
|
|
140
140
|
});
|
|
141
141
|
return account;
|
|
142
142
|
}
|
|
@@ -163,7 +163,7 @@ let AccountsService = class AccountsService {
|
|
|
163
163
|
"accounts.email",
|
|
164
164
|
"accounts.email_verified",
|
|
165
165
|
"accounts.status",
|
|
166
|
-
"accounts.
|
|
166
|
+
"accounts.is_super_admin",
|
|
167
167
|
"accounts.created_at",
|
|
168
168
|
"accounts.updated_at",
|
|
169
169
|
"local_passwords.password_hash",
|
|
@@ -245,13 +245,13 @@ let AccountsService = class AccountsService {
|
|
|
245
245
|
return (await this.updateAccount(id, patch, actorAccountId, actorTokenId)).account;
|
|
246
246
|
}
|
|
247
247
|
/**
|
|
248
|
-
*
|
|
248
|
+
* A super admin changes an account. Disabling (`status: "disabled"`) revokes the
|
|
249
249
|
* account's sessions (`sessions.revoked_at`) and personal tokens in **the same PG transaction**,
|
|
250
250
|
* all or nothing; returns the revoked session ids, whose Redis markers the caller writes after
|
|
251
251
|
* the commit (the fast path; a failure is only a warning: auth reads PG).
|
|
252
252
|
*/
|
|
253
253
|
async updateAccount(id, patch, actorAccountId, actorTokenId) {
|
|
254
|
-
// Every
|
|
254
|
+
// Every super admin write is serialized by one lock and re-checks the actor under it: two
|
|
255
255
|
// admins revoking each other concurrently cannot leave none, and a just-revoked admin's
|
|
256
256
|
// request in flight fails
|
|
257
257
|
await this.adminLock.lockAndAuthorize(actorAccountId);
|
|
@@ -269,14 +269,14 @@ let AccountsService = class AccountsService {
|
|
|
269
269
|
});
|
|
270
270
|
}
|
|
271
271
|
/**
|
|
272
|
-
* The CLI's `capybara admin grant|revoke <login>` (no actor account): changes the
|
|
273
|
-
* admin flag by local login under the
|
|
274
|
-
* {@link updateAccount} "last active
|
|
272
|
+
* The CLI's `capybara admin grant|revoke <login>` (no actor account): changes the super
|
|
273
|
+
* admin flag by local login under the super admin lock; revoking keeps the
|
|
274
|
+
* {@link updateAccount} "last active super admin" check (`account.last_super_admin`),
|
|
275
275
|
* decided under the lock, so it cannot race a web revoke into none. Audit `account.updated`
|
|
276
276
|
* without an actor, `detail.via = "cli"`. Already in the target state → no change and no audit
|
|
277
277
|
* (`changed: false`). Unknown login → `account.not_found`.
|
|
278
278
|
*/
|
|
279
|
-
async
|
|
279
|
+
async setSuperAdminByLogin(login, isSuperAdmin) {
|
|
280
280
|
let external;
|
|
281
281
|
try {
|
|
282
282
|
external = normalizeLogin(login);
|
|
@@ -284,9 +284,9 @@ let AccountsService = class AccountsService {
|
|
|
284
284
|
catch {
|
|
285
285
|
throw new ApiError("account.not_found", "Account not found");
|
|
286
286
|
}
|
|
287
|
-
return this.
|
|
287
|
+
return this.setSuperAdminIn(external, isSuperAdmin);
|
|
288
288
|
}
|
|
289
|
-
async
|
|
289
|
+
async setSuperAdminIn(external, isSuperAdmin) {
|
|
290
290
|
await this.adminLock.lock();
|
|
291
291
|
const before = await this.db
|
|
292
292
|
.selectFrom("identities")
|
|
@@ -297,10 +297,10 @@ let AccountsService = class AccountsService {
|
|
|
297
297
|
.executeTakeFirst();
|
|
298
298
|
if (!before)
|
|
299
299
|
throw new ApiError("account.not_found", "Account not found");
|
|
300
|
-
if (before.
|
|
300
|
+
if (before.is_super_admin === isSuperAdmin) {
|
|
301
301
|
return { account: toAccount(before), changed: false };
|
|
302
302
|
}
|
|
303
|
-
const patch = {
|
|
303
|
+
const patch = { isSuperAdmin };
|
|
304
304
|
const { account } = await this.applyUpdate(before, patch, {
|
|
305
305
|
detail: { ...patch, via: "cli" },
|
|
306
306
|
});
|
|
@@ -314,12 +314,12 @@ let AccountsService = class AccountsService {
|
|
|
314
314
|
.executeTakeFirstOrThrow();
|
|
315
315
|
return Number(r.n);
|
|
316
316
|
}
|
|
317
|
-
/** Active (status = active)
|
|
318
|
-
async
|
|
317
|
+
/** Active (status = active) super admins, in the context's transaction when there is one. */
|
|
318
|
+
async countSuperAdmins() {
|
|
319
319
|
const r = await this.db
|
|
320
320
|
.selectFrom("accounts")
|
|
321
321
|
.select((eb) => eb.fn.countAll().as("n"))
|
|
322
|
-
.where("
|
|
322
|
+
.where("is_super_admin", "=", true)
|
|
323
323
|
.where("status", "=", "active")
|
|
324
324
|
.executeTakeFirstOrThrow();
|
|
325
325
|
return Number(r.n);
|
|
@@ -334,7 +334,7 @@ let AccountsService = class AccountsService {
|
|
|
334
334
|
id,
|
|
335
335
|
display_name: input.displayName,
|
|
336
336
|
email: input.email ?? null,
|
|
337
|
-
|
|
337
|
+
is_super_admin: input.superAdmin ?? false,
|
|
338
338
|
})
|
|
339
339
|
.returningAll()
|
|
340
340
|
.executeTakeFirstOrThrow();
|
|
@@ -380,8 +380,8 @@ let AccountsService = class AccountsService {
|
|
|
380
380
|
.execute();
|
|
381
381
|
}
|
|
382
382
|
/**
|
|
383
|
-
* Changes the account under the
|
|
384
|
-
* re-checks "the last active
|
|
383
|
+
* Changes the account under the super admin lock the caller holds: updates the row,
|
|
384
|
+
* re-checks "the last active super admin", audits `account.updated`; disabling revokes the
|
|
385
385
|
* account's sessions and personal tokens.
|
|
386
386
|
*/
|
|
387
387
|
async applyUpdate(before, patch, auditAs) {
|
|
@@ -391,18 +391,18 @@ let AccountsService = class AccountsService {
|
|
|
391
391
|
values.display_name = patch.displayName;
|
|
392
392
|
if (patch.status !== undefined)
|
|
393
393
|
values.status = patch.status;
|
|
394
|
-
if (patch.
|
|
395
|
-
values.
|
|
394
|
+
if (patch.isSuperAdmin !== undefined)
|
|
395
|
+
values.is_super_admin = patch.isSuperAdmin;
|
|
396
396
|
const row = await this.db
|
|
397
397
|
.updateTable("accounts")
|
|
398
398
|
.set(values)
|
|
399
399
|
.where("id", "=", id)
|
|
400
400
|
.returningAll()
|
|
401
401
|
.executeTakeFirstOrThrow();
|
|
402
|
-
const wasActiveAdmin = before.
|
|
403
|
-
const isActiveAdmin = row.
|
|
404
|
-
if (wasActiveAdmin && !isActiveAdmin && (await this.
|
|
405
|
-
throw new ApiError("account.
|
|
402
|
+
const wasActiveAdmin = before.is_super_admin && before.status === "active";
|
|
403
|
+
const isActiveAdmin = row.is_super_admin && row.status === "active";
|
|
404
|
+
if (wasActiveAdmin && !isActiveAdmin && (await this.countSuperAdmins()) === 0) {
|
|
405
|
+
throw new ApiError("account.last_super_admin", "Cannot remove the last active super admin");
|
|
406
406
|
}
|
|
407
407
|
await audit(this.db.db, {
|
|
408
408
|
...(auditAs.actorAccountId !== undefined && { actorAccountId: auditAs.actorAccountId }),
|
|
@@ -439,10 +439,10 @@ __decorate([
|
|
|
439
439
|
], AccountsService.prototype, "createByAdminIn", null);
|
|
440
440
|
__decorate([
|
|
441
441
|
Transactional()
|
|
442
|
-
], AccountsService.prototype, "
|
|
442
|
+
], AccountsService.prototype, "createSuperAdminIfNoneIn", null);
|
|
443
443
|
__decorate([
|
|
444
444
|
Transactional()
|
|
445
|
-
], AccountsService.prototype, "
|
|
445
|
+
], AccountsService.prototype, "insertSuperAdmin", null);
|
|
446
446
|
__decorate([
|
|
447
447
|
Transactional()
|
|
448
448
|
], AccountsService.prototype, "changePasswordIn", null);
|
|
@@ -451,7 +451,7 @@ __decorate([
|
|
|
451
451
|
], AccountsService.prototype, "updateAccount", null);
|
|
452
452
|
__decorate([
|
|
453
453
|
Transactional()
|
|
454
|
-
], AccountsService.prototype, "
|
|
454
|
+
], AccountsService.prototype, "setSuperAdminIn", null);
|
|
455
455
|
__decorate([
|
|
456
456
|
Transactional()
|
|
457
457
|
], AccountsService.prototype, "insertLocal", null);
|
|
@@ -465,7 +465,7 @@ AccountsService = __decorate([
|
|
|
465
465
|
Injectable(),
|
|
466
466
|
__param(0, Inject(KernelDb)),
|
|
467
467
|
__param(1, Inject(TransactionHost)),
|
|
468
|
-
__param(2, Inject(
|
|
468
|
+
__param(2, Inject(SuperAdminLock)),
|
|
469
469
|
__param(3, Inject(SetupLock))
|
|
470
470
|
], AccountsService);
|
|
471
471
|
export { AccountsService };
|
|
@@ -478,7 +478,7 @@ let AccountsModule = class AccountsModule {
|
|
|
478
478
|
};
|
|
479
479
|
AccountsModule = __decorate([
|
|
480
480
|
Module({
|
|
481
|
-
imports: [SetupLockModule,
|
|
481
|
+
imports: [SetupLockModule, SuperAdminLockModule],
|
|
482
482
|
providers: [AccountsService],
|
|
483
483
|
exports: [AccountsService],
|
|
484
484
|
})
|
package/dist/identity/audit.d.ts
CHANGED
|
@@ -5,7 +5,8 @@ import type { KernelSchemaDb } from "../db/kernel-schema.js";
|
|
|
5
5
|
* so the event commits or rolls back with the write it records.
|
|
6
6
|
*/
|
|
7
7
|
export declare function audit(db: KernelSchemaDb, e: {
|
|
8
|
-
|
|
8
|
+
/** The acting account; absent or null for the kernel itself (a job such as the scope sync). */
|
|
9
|
+
actorAccountId?: string | null;
|
|
9
10
|
actorTokenId?: string;
|
|
10
11
|
orgId?: string;
|
|
11
12
|
action: string;
|
|
@@ -3,21 +3,29 @@ import { Reflector } from "@nestjs/core";
|
|
|
3
3
|
import type { FastifyRequest } from "fastify";
|
|
4
4
|
import { AccountsService } from "./accounts.js";
|
|
5
5
|
import { ApiTokenService } from "./api-tokens.js";
|
|
6
|
+
import { type Principal } from "./principal.js";
|
|
6
7
|
import { SessionService } from "./sessions.js";
|
|
7
8
|
/** CSRF 头:Cookie 认证的非安全请求(及所有公开路由的非安全请求)必须带 `X-Capybara-Csrf: 1`。 */
|
|
8
9
|
export declare const CSRF_HEADER = "x-capybara-csrf";
|
|
9
|
-
/** 解析凭据要用的服务({@link AuthGuard} 与 {@link
|
|
10
|
+
/** 解析凭据要用的服务({@link AuthGuard} 与 {@link authorizeSuperAdmin} 共用)。 */
|
|
10
11
|
export interface AuthServices {
|
|
11
12
|
accounts: AccountsService;
|
|
12
13
|
sessions: SessionService;
|
|
13
14
|
tokens: ApiTokenService;
|
|
14
15
|
}
|
|
15
16
|
/**
|
|
16
|
-
* 在读请求体之前(Fastify `onRequest`)按 `@
|
|
17
|
-
* 等,Cookie 认证的非安全请求要求 CSRF
|
|
17
|
+
* 在读请求体之前(Fastify `onRequest`)按 `@SuperAdmin` 路由的规则认证:无凭据 / 凭据无效 → `auth.required`
|
|
18
|
+
* 等,Cookie 认证的非安全请求要求 CSRF 头,服务令牌与非超级管理员 → `forbidden`。插件包上传用它:
|
|
18
19
|
* 未认证的大请求体不被读入内存。之后 {@link AuthGuard} 照常再判一次。
|
|
19
20
|
*/
|
|
20
|
-
export declare function
|
|
21
|
+
export declare function authorizeSuperAdmin(req: FastifyRequest, s: AuthServices): Promise<void>;
|
|
22
|
+
/**
|
|
23
|
+
* Before the body is read (Fastify `onRequest`), for an org's package upload (an `@OrgAction`
|
|
24
|
+
* route of a human-only action): authenticated like {@link authorizeSuperAdmin}, a person (service
|
|
25
|
+
* tokens -> `forbidden`), CSRF for cookies. Returns the principal for the org role check that also
|
|
26
|
+
* runs before the body (ruling P3-29); `OrgGuard` and the service's lock re-check it afterwards.
|
|
27
|
+
*/
|
|
28
|
+
export declare function authenticateOrgUploader(req: FastifyRequest, s: AuthServices): Promise<Principal>;
|
|
21
29
|
/**
|
|
22
30
|
* 全局守卫(`APP_GUARD`),默认拒绝:
|
|
23
31
|
* 1. `Authorization: Bearer cap_pat_…|cap_svc_…` → API 令牌;个人令牌再实时读账号状态。不做 CSRF 检查。
|
|
@@ -27,7 +35,7 @@ export declare function authorizeEnterpriseAdmin(req: FastifyRequest, s: AuthSer
|
|
|
27
35
|
* (便于登出 / 刷新);PG / Redis 故障等其他异常照常抛出。
|
|
28
36
|
* 4. 路由约束:service principal 只能访问 `@AllowService` 路由(否则 `forbidden`);
|
|
29
37
|
* `@SessionOnly` 要求 Web 会话:个人令牌 → `auth.session_required`,服务令牌(即使路由经 `@OrgAction`
|
|
30
|
-
* 隐含 `@AllowService`)→ `forbidden`;`@
|
|
38
|
+
* 隐含 `@AllowService`)→ `forbidden`;`@SuperAdmin` 要求超级管理员(`forbidden`)。
|
|
31
39
|
* 5. `@Public` 路由的非安全方法无论是否带 Cookie 都要求 CSRF 头。
|
|
32
40
|
* 账号状态每个请求都从 PG 实时读取,不在进程内缓存。插件路由 `/plugins/*` 不经过 Nest,不受此守卫约束。
|
|
33
41
|
*/
|
|
@@ -13,7 +13,7 @@ import { ApiError } from "../errors.js";
|
|
|
13
13
|
import { AccountsService } from "./accounts.js";
|
|
14
14
|
import { ApiTokenService } from "./api-tokens.js";
|
|
15
15
|
import { ACCESS_COOKIE } from "./cookies.js";
|
|
16
|
-
import { ALLOW_SERVICE_KEY,
|
|
16
|
+
import { ALLOW_SERVICE_KEY, PUBLIC_KEY, SESSION_ONLY_KEY, SUPER_ADMIN_KEY, } from "./principal.js";
|
|
17
17
|
import { SessionService } from "./sessions.js";
|
|
18
18
|
/** CSRF 头:Cookie 认证的非安全请求(及所有公开路由的非安全请求)必须带 `X-Capybara-Csrf: 1`。 */
|
|
19
19
|
export const CSRF_HEADER = "x-capybara-csrf";
|
|
@@ -62,11 +62,11 @@ async function resolvePrincipal(req, s) {
|
|
|
62
62
|
return undefined;
|
|
63
63
|
}
|
|
64
64
|
/**
|
|
65
|
-
* 在读请求体之前(Fastify `onRequest`)按 `@
|
|
66
|
-
* 等,Cookie 认证的非安全请求要求 CSRF
|
|
65
|
+
* 在读请求体之前(Fastify `onRequest`)按 `@SuperAdmin` 路由的规则认证:无凭据 / 凭据无效 → `auth.required`
|
|
66
|
+
* 等,Cookie 认证的非安全请求要求 CSRF 头,服务令牌与非超级管理员 → `forbidden`。插件包上传用它:
|
|
67
67
|
* 未认证的大请求体不被读入内存。之后 {@link AuthGuard} 照常再判一次。
|
|
68
68
|
*/
|
|
69
|
-
export async function
|
|
69
|
+
export async function authorizeSuperAdmin(req, s) {
|
|
70
70
|
const resolved = await resolvePrincipal(req, s);
|
|
71
71
|
if (!resolved)
|
|
72
72
|
throw new ApiError("auth.required", "Authentication required");
|
|
@@ -76,8 +76,25 @@ export async function authorizeEnterpriseAdmin(req, s) {
|
|
|
76
76
|
if (p.kind === "service") {
|
|
77
77
|
throw new ApiError("forbidden", "Service tokens cannot access this endpoint");
|
|
78
78
|
}
|
|
79
|
-
if (!p.account.
|
|
80
|
-
throw new ApiError("forbidden", "
|
|
79
|
+
if (!p.account.isSuperAdmin)
|
|
80
|
+
throw new ApiError("forbidden", "Super admin required");
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Before the body is read (Fastify `onRequest`), for an org's package upload (an `@OrgAction`
|
|
84
|
+
* route of a human-only action): authenticated like {@link authorizeSuperAdmin}, a person (service
|
|
85
|
+
* tokens -> `forbidden`), CSRF for cookies. Returns the principal for the org role check that also
|
|
86
|
+
* runs before the body (ruling P3-29); `OrgGuard` and the service's lock re-check it afterwards.
|
|
87
|
+
*/
|
|
88
|
+
export async function authenticateOrgUploader(req, s) {
|
|
89
|
+
const resolved = await resolvePrincipal(req, s);
|
|
90
|
+
if (!resolved)
|
|
91
|
+
throw new ApiError("auth.required", "Authentication required");
|
|
92
|
+
if (resolved.cookie && !SAFE_METHODS.has(req.method.toUpperCase()))
|
|
93
|
+
requireCsrf(req);
|
|
94
|
+
if (resolved.principal.kind === "service") {
|
|
95
|
+
throw new ApiError("forbidden", "Service tokens cannot access this endpoint");
|
|
96
|
+
}
|
|
97
|
+
return resolved.principal;
|
|
81
98
|
}
|
|
82
99
|
/**
|
|
83
100
|
* 全局守卫(`APP_GUARD`),默认拒绝:
|
|
@@ -88,7 +105,7 @@ export async function authorizeEnterpriseAdmin(req, s) {
|
|
|
88
105
|
* (便于登出 / 刷新);PG / Redis 故障等其他异常照常抛出。
|
|
89
106
|
* 4. 路由约束:service principal 只能访问 `@AllowService` 路由(否则 `forbidden`);
|
|
90
107
|
* `@SessionOnly` 要求 Web 会话:个人令牌 → `auth.session_required`,服务令牌(即使路由经 `@OrgAction`
|
|
91
|
-
* 隐含 `@AllowService`)→ `forbidden`;`@
|
|
108
|
+
* 隐含 `@AllowService`)→ `forbidden`;`@SuperAdmin` 要求超级管理员(`forbidden`)。
|
|
92
109
|
* 5. `@Public` 路由的非安全方法无论是否带 Cookie 都要求 CSRF 头。
|
|
93
110
|
* 账号状态每个请求都从 PG 实时读取,不在进程内缓存。插件路由 `/plugins/*` 不经过 Nest,不受此守卫约束。
|
|
94
111
|
*/
|
|
@@ -142,8 +159,8 @@ let AuthGuard = class AuthGuard {
|
|
|
142
159
|
if (flag(SESSION_ONLY_KEY) && !(p.kind === "user" && p.via === "session")) {
|
|
143
160
|
throw new ApiError("auth.session_required", "This endpoint requires a web session");
|
|
144
161
|
}
|
|
145
|
-
if (flag(
|
|
146
|
-
throw new ApiError("forbidden", "
|
|
162
|
+
if (flag(SUPER_ADMIN_KEY) && !(p.kind === "user" && p.account.isSuperAdmin)) {
|
|
163
|
+
throw new ApiError("forbidden", "Super admin required");
|
|
147
164
|
}
|
|
148
165
|
return true;
|
|
149
166
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Identity: accounts, sessions, API tokens, deployment settings and the
|
|
2
|
+
* Identity: accounts, sessions, API tokens, deployment settings and the super admin lock,
|
|
3
3
|
* external identities with IM binding and third-party sign-in.
|
|
4
4
|
*/
|
|
5
5
|
export declare class IdentityModule {
|