@capybara-hq/kernel 0.0.0-stage → 0.1.0-rc.0
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/LICENSE +202 -0
- package/NOTICE +2 -0
- package/README.md +20 -2
- package/bootstrap.json +22 -0
- package/dist/admin/admin.controller.d.ts +139 -0
- package/dist/admin/admin.controller.js +238 -0
- package/dist/admin/extensions.controller.d.ts +100 -0
- package/dist/admin/extensions.controller.js +226 -0
- package/dist/admin/setup.controller.d.ts +36 -0
- package/dist/admin/setup.controller.js +106 -0
- package/dist/admin/setup.service.d.ts +47 -0
- package/dist/admin/setup.service.js +90 -0
- package/dist/agents/agents.controller.d.ts +205 -0
- package/dist/agents/agents.controller.js +144 -0
- package/dist/agents/agents.service.d.ts +177 -0
- package/dist/agents/agents.service.js +677 -0
- package/dist/agents/definition.d.ts +198 -0
- package/dist/agents/definition.js +152 -0
- package/dist/agents/models.controller.d.ts +13 -0
- package/dist/agents/models.controller.js +31 -0
- package/dist/agents/templates.controller.d.ts +15 -0
- package/dist/agents/templates.controller.js +37 -0
- package/dist/agents/templates.d.ts +83 -0
- package/dist/agents/templates.js +173 -0
- package/dist/catalog/admin-catalog.controller.d.ts +143 -0
- package/dist/catalog/admin-catalog.controller.js +245 -0
- package/dist/catalog/catalog.service.d.ts +430 -0
- package/dist/catalog/catalog.service.js +882 -0
- package/dist/catalog/claude/agents.d.ts +27 -0
- package/dist/catalog/claude/agents.js +270 -0
- package/dist/catalog/claude/commands.d.ts +50 -0
- package/dist/catalog/claude/commands.js +179 -0
- package/dist/catalog/claude/manifest.d.ts +69 -0
- package/dist/catalog/claude/manifest.js +134 -0
- package/dist/catalog/claude/marketplace.d.ts +35 -0
- package/dist/catalog/claude/marketplace.js +194 -0
- package/dist/catalog/claude/mcp.d.ts +33 -0
- package/dist/catalog/claude/mcp.js +226 -0
- package/dist/catalog/claude/report.d.ts +86 -0
- package/dist/catalog/claude/report.js +121 -0
- package/dist/catalog/claude/translate.d.ts +56 -0
- package/dist/catalog/claude/translate.js +857 -0
- package/dist/catalog/cli.d.ts +46 -0
- package/dist/catalog/cli.js +211 -0
- package/dist/catalog/git-source.d.ts +127 -0
- package/dist/catalog/git-source.js +520 -0
- package/dist/catalog/marketplace-fetch.d.ts +99 -0
- package/dist/catalog/marketplace-fetch.js +203 -0
- package/dist/catalog/marketplaces.controller.d.ts +97 -0
- package/dist/catalog/marketplaces.controller.js +197 -0
- package/dist/catalog/marketplaces.service.d.ts +340 -0
- package/dist/catalog/marketplaces.service.js +1217 -0
- package/dist/catalog/org-catalog.controller.d.ts +128 -0
- package/dist/catalog/org-catalog.controller.js +277 -0
- package/dist/catalog/org-catalog.service.d.ts +246 -0
- package/dist/catalog/org-catalog.service.js +625 -0
- package/dist/catalog/plugin-import.d.ts +436 -0
- package/dist/catalog/plugin-import.js +1069 -0
- package/dist/catalog/plugin-install.d.ts +447 -0
- package/dist/catalog/plugin-install.js +1333 -0
- package/dist/catalog/plugin-package.d.ts +143 -0
- package/dist/catalog/plugin-package.js +382 -0
- package/dist/catalog/plugin-upgrade.d.ts +222 -0
- package/dist/catalog/plugin-upgrade.js +1219 -0
- package/dist/catalog/requests.service.d.ts +162 -0
- package/dist/catalog/requests.service.js +504 -0
- package/dist/catalog/schema-path.d.ts +7 -0
- package/dist/catalog/schema-path.js +63 -0
- package/dist/catalog/upgrade-targets.d.ts +59 -0
- package/dist/catalog/upgrade-targets.js +90 -0
- package/dist/catalog/versions.d.ts +31 -0
- package/dist/catalog/versions.js +44 -0
- package/dist/channels/actions.d.ts +37 -0
- package/dist/channels/actions.js +121 -0
- package/dist/channels/cards.d.ts +44 -0
- package/dist/channels/cards.js +156 -0
- package/dist/channels/connections.controller.d.ts +59 -0
- package/dist/channels/connections.controller.js +115 -0
- package/dist/channels/connections.service.d.ts +187 -0
- package/dist/channels/connections.service.js +534 -0
- package/dist/channels/features.d.ts +12 -0
- package/dist/channels/features.js +22 -0
- package/dist/channels/inbound.d.ts +120 -0
- package/dist/channels/inbound.js +332 -0
- package/dist/channels/outbound.d.ts +140 -0
- package/dist/channels/outbound.js +1125 -0
- package/dist/channels/phrases.d.ts +100 -0
- package/dist/channels/phrases.js +81 -0
- package/dist/channels/supervisor.d.ts +182 -0
- package/dist/channels/supervisor.js +625 -0
- package/dist/channels/threads.d.ts +29 -0
- package/dist/channels/threads.js +104 -0
- package/dist/channels/webhook-url.d.ts +16 -0
- package/dist/channels/webhook-url.js +34 -0
- package/dist/channels/webhook.controller.d.ts +19 -0
- package/dist/channels/webhook.controller.js +72 -0
- package/dist/channels/webhook.d.ts +73 -0
- package/dist/channels/webhook.js +274 -0
- package/dist/config/docs.d.ts +9 -0
- package/dist/config/docs.js +85 -0
- package/dist/config/env.d.ts +6 -0
- package/dist/config/env.js +73 -0
- package/dist/config/fields.d.ts +42 -0
- package/dist/config/fields.js +214 -0
- package/dist/config/file-source.d.ts +3 -0
- package/dist/config/file-source.js +31 -0
- package/dist/config/load.d.ts +20 -0
- package/dist/config/load.js +98 -0
- package/dist/config/nacos-source.d.ts +31 -0
- package/dist/config/nacos-source.js +229 -0
- package/dist/config/schema.d.ts +223 -0
- package/dist/config/schema.js +1151 -0
- package/dist/config/sources.d.ts +18 -0
- package/dist/config/sources.js +59 -0
- package/dist/config/types.d.ts +9 -0
- package/dist/config/types.js +7 -0
- package/dist/conversations/artifacts.d.ts +52 -0
- package/dist/conversations/artifacts.js +137 -0
- package/dist/conversations/attachments.controller.d.ts +28 -0
- package/dist/conversations/attachments.controller.js +96 -0
- package/dist/conversations/attachments.service.d.ts +180 -0
- package/dist/conversations/attachments.service.js +578 -0
- package/dist/conversations/conversations.controller.d.ts +288 -0
- package/dist/conversations/conversations.controller.js +607 -0
- package/dist/conversations/conversations.service.d.ts +321 -0
- package/dist/conversations/conversations.service.js +754 -0
- package/dist/conversations/event-log.d.ts +122 -0
- package/dist/conversations/event-log.js +259 -0
- package/dist/conversations/events.d.ts +856 -0
- package/dist/conversations/events.js +639 -0
- package/dist/conversations/files.d.ts +92 -0
- package/dist/conversations/files.js +213 -0
- package/dist/conversations/outputs-read.d.ts +34 -0
- package/dist/conversations/outputs-read.js +37 -0
- package/dist/conversations/queue.d.ts +169 -0
- package/dist/conversations/queue.js +527 -0
- package/dist/conversations/sandbox-status.d.ts +21 -0
- package/dist/conversations/sandbox-status.js +24 -0
- package/dist/conversations/selection.d.ts +46 -0
- package/dist/conversations/selection.js +75 -0
- package/dist/conversations/titles.d.ts +93 -0
- package/dist/conversations/titles.js +422 -0
- package/dist/ctx/bus.d.ts +16 -0
- package/dist/ctx/bus.js +101 -0
- package/dist/ctx/create-ctx.d.ts +109 -0
- package/dist/ctx/create-ctx.js +592 -0
- package/dist/ctx/kv.d.ts +4 -0
- package/dist/ctx/kv.js +31 -0
- package/dist/ctx/lock.d.ts +4 -0
- package/dist/ctx/lock.js +39 -0
- package/dist/ctx/namespace.d.ts +6 -0
- package/dist/ctx/namespace.js +12 -0
- package/dist/ctx/queue.d.ts +25 -0
- package/dist/ctx/queue.js +150 -0
- package/dist/ctx/secrets.d.ts +45 -0
- package/dist/ctx/secrets.js +175 -0
- package/dist/db/kernel-schema.d.ts +1122 -0
- package/dist/db/kernel-schema.js +5 -0
- package/dist/db/migrator.d.ts +28 -0
- package/dist/db/migrator.js +140 -0
- package/dist/db/pool.d.ts +21 -0
- package/dist/db/pool.js +28 -0
- package/dist/db/sql-statements.d.ts +34 -0
- package/dist/db/sql-statements.js +168 -0
- package/dist/errors.d.ts +210 -0
- package/dist/errors.js +212 -0
- package/dist/evals/budget.d.ts +61 -0
- package/dist/evals/budget.js +181 -0
- package/dist/evals/diff.d.ts +55 -0
- package/dist/evals/diff.js +133 -0
- package/dist/evals/judge.d.ts +53 -0
- package/dist/evals/judge.js +149 -0
- package/dist/evals/plan.d.ts +47 -0
- package/dist/evals/plan.js +77 -0
- package/dist/evals/reconstruct.d.ts +137 -0
- package/dist/evals/reconstruct.js +322 -0
- package/dist/evals/recorded-tools.d.ts +54 -0
- package/dist/evals/recorded-tools.js +167 -0
- package/dist/evals/run-replay.d.ts +86 -0
- package/dist/evals/run-replay.js +502 -0
- package/dist/evals/runs.controller.d.ts +100 -0
- package/dist/evals/runs.controller.js +199 -0
- package/dist/evals/runs.service.d.ts +275 -0
- package/dist/evals/runs.service.js +836 -0
- package/dist/evals/sets.controller.d.ts +61 -0
- package/dist/evals/sets.controller.js +183 -0
- package/dist/evals/sets.service.d.ts +128 -0
- package/dist/evals/sets.service.js +558 -0
- package/dist/evals/snapshot.d.ts +76 -0
- package/dist/evals/snapshot.js +207 -0
- package/dist/evals/step-replay.d.ts +113 -0
- package/dist/evals/step-replay.js +181 -0
- package/dist/evals/trajectory.controller.d.ts +41 -0
- package/dist/evals/trajectory.controller.js +88 -0
- package/dist/evals/trajectory.d.ts +144 -0
- package/dist/evals/trajectory.js +338 -0
- package/dist/evals/trajectory.service.d.ts +108 -0
- package/dist/evals/trajectory.service.js +323 -0
- package/dist/evals/worker.d.ts +101 -0
- package/dist/evals/worker.js +789 -0
- package/dist/extensions/admin-ops.d.ts +105 -0
- package/dist/extensions/admin-ops.js +353 -0
- package/dist/extensions/admin-view.d.ts +79 -0
- package/dist/extensions/admin-view.js +327 -0
- package/dist/extensions/approvals.d.ts +119 -0
- package/dist/extensions/approvals.js +205 -0
- package/dist/extensions/blobs.d.ts +45 -0
- package/dist/extensions/blobs.js +160 -0
- package/dist/extensions/bootstrap.d.ts +149 -0
- package/dist/extensions/bootstrap.js +441 -0
- package/dist/extensions/cli.d.ts +61 -0
- package/dist/extensions/cli.js +165 -0
- package/dist/extensions/config-json-schema.d.ts +9 -0
- package/dist/extensions/config-json-schema.js +73 -0
- package/dist/extensions/deployment-config.d.ts +138 -0
- package/dist/extensions/deployment-config.js +394 -0
- package/dist/extensions/enabled.d.ts +31 -0
- package/dist/extensions/enabled.js +55 -0
- package/dist/extensions/hooks.d.ts +161 -0
- package/dist/extensions/hooks.js +425 -0
- package/dist/extensions/host.d.ts +577 -0
- package/dist/extensions/host.js +2071 -0
- package/dist/extensions/inflight.d.ts +69 -0
- package/dist/extensions/inflight.js +277 -0
- package/dist/extensions/installs.d.ts +166 -0
- package/dist/extensions/installs.js +253 -0
- package/dist/extensions/instance.d.ts +167 -0
- package/dist/extensions/instance.js +329 -0
- package/dist/extensions/ledger.d.ts +30 -0
- package/dist/extensions/ledger.js +50 -0
- package/dist/extensions/lifecycle.d.ts +80 -0
- package/dist/extensions/lifecycle.js +152 -0
- package/dist/extensions/migrate-lock.d.ts +51 -0
- package/dist/extensions/migrate-lock.js +100 -0
- package/dist/extensions/org-config.controller.d.ts +24 -0
- package/dist/extensions/org-config.controller.js +59 -0
- package/dist/extensions/org-config.d.ts +169 -0
- package/dist/extensions/org-config.js +520 -0
- package/dist/extensions/package.d.ts +115 -0
- package/dist/extensions/package.js +246 -0
- package/dist/extensions/permission-set.d.ts +117 -0
- package/dist/extensions/permission-set.js +184 -0
- package/dist/extensions/permission-view.d.ts +194 -0
- package/dist/extensions/permission-view.js +284 -0
- package/dist/extensions/registry.d.ts +24 -0
- package/dist/extensions/registry.js +56 -0
- package/dist/extensions/resolve.d.ts +12 -0
- package/dist/extensions/resolve.js +71 -0
- package/dist/extensions/sources.d.ts +69 -0
- package/dist/extensions/sources.js +120 -0
- package/dist/extensions/sync.d.ts +40 -0
- package/dist/extensions/sync.js +242 -0
- package/dist/files/previewers.controller.d.ts +46 -0
- package/dist/files/previewers.controller.js +105 -0
- package/dist/files/previewers.d.ts +100 -0
- package/dist/files/previewers.js +250 -0
- package/dist/http/api.module.d.ts +114 -0
- package/dist/http/api.module.js +448 -0
- package/dist/http/app.d.ts +77 -0
- package/dist/http/app.js +170 -0
- package/dist/http/error.filter.d.ts +21 -0
- package/dist/http/error.filter.js +85 -0
- package/dist/http/gateway.module.d.ts +15 -0
- package/dist/http/gateway.module.js +13 -0
- package/dist/http/health.controller.d.ts +26 -0
- package/dist/http/health.controller.js +79 -0
- package/dist/http/nest-logger.d.ts +20 -0
- package/dist/http/nest-logger.js +28 -0
- package/dist/http/plugin-dispatch.d.ts +68 -0
- package/dist/http/plugin-dispatch.js +200 -0
- package/dist/http/tokens.d.ts +131 -0
- package/dist/http/tokens.js +131 -0
- package/dist/http/zod.pipe.d.ts +8 -0
- package/dist/http/zod.pipe.js +14 -0
- package/dist/identity/accounts.d.ts +93 -0
- package/dist/identity/accounts.js +367 -0
- package/dist/identity/api-tokens.d.ts +73 -0
- package/dist/identity/api-tokens.js +197 -0
- package/dist/identity/audit.d.ts +23 -0
- package/dist/identity/audit.js +41 -0
- package/dist/identity/auth.controller.d.ts +40 -0
- package/dist/identity/auth.controller.js +130 -0
- package/dist/identity/auth.guard.d.ts +41 -0
- package/dist/identity/auth.guard.js +162 -0
- package/dist/identity/binding.d.ts +47 -0
- package/dist/identity/binding.js +84 -0
- package/dist/identity/cookies.d.ts +16 -0
- package/dist/identity/cookies.js +32 -0
- package/dist/identity/credential-check.d.ts +17 -0
- package/dist/identity/credential-check.js +24 -0
- package/dist/identity/enterprise-admin.d.ts +14 -0
- package/dist/identity/enterprise-admin.js +27 -0
- package/dist/identity/external.d.ts +106 -0
- package/dist/identity/external.js +337 -0
- package/dist/identity/hash.d.ts +2 -0
- package/dist/identity/hash.js +3 -0
- package/dist/identity/login.d.ts +6 -0
- package/dist/identity/login.js +20 -0
- package/dist/identity/me.controller.d.ts +61 -0
- package/dist/identity/me.controller.js +159 -0
- package/dist/identity/passwords.d.ts +6 -0
- package/dist/identity/passwords.js +37 -0
- package/dist/identity/principal.d.ts +56 -0
- package/dist/identity/principal.js +38 -0
- package/dist/identity/rate-limit.d.ts +55 -0
- package/dist/identity/rate-limit.js +121 -0
- package/dist/identity/sessions.d.ts +84 -0
- package/dist/identity/sessions.js +306 -0
- package/dist/identity/settings.d.ts +121 -0
- package/dist/identity/settings.js +248 -0
- package/dist/identity/sso.controller.d.ts +59 -0
- package/dist/identity/sso.controller.js +192 -0
- package/dist/identity/sso.d.ts +83 -0
- package/dist/identity/sso.js +202 -0
- package/dist/inbox/inbox.service.d.ts +43 -0
- package/dist/inbox/inbox.service.js +57 -0
- package/dist/index.d.ts +67 -0
- package/dist/index.js +65 -0
- package/dist/kernel.d.ts +256 -0
- package/dist/kernel.js +1326 -0
- package/dist/log.d.ts +48 -0
- package/dist/log.js +229 -0
- package/dist/models/prices.d.ts +53 -0
- package/dist/models/prices.js +121 -0
- package/dist/models/purposes.controller.d.ts +19 -0
- package/dist/models/purposes.controller.js +56 -0
- package/dist/models/purposes.d.ts +140 -0
- package/dist/models/purposes.js +267 -0
- package/dist/net/proxy.d.ts +44 -0
- package/dist/net/proxy.js +162 -0
- package/dist/net/public-address.d.ts +60 -0
- package/dist/net/public-address.js +271 -0
- package/dist/net/safe-fetch.d.ts +38 -0
- package/dist/net/safe-fetch.js +140 -0
- package/dist/orgs/directory-sync.controller.d.ts +14 -0
- package/dist/orgs/directory-sync.controller.js +40 -0
- package/dist/orgs/directory-sync.d.ts +166 -0
- package/dist/orgs/directory-sync.js +558 -0
- package/dist/orgs/invitations.controller.d.ts +58 -0
- package/dist/orgs/invitations.controller.js +137 -0
- package/dist/orgs/invitations.service.d.ts +80 -0
- package/dist/orgs/invitations.service.js +217 -0
- package/dist/orgs/members.service.d.ts +63 -0
- package/dist/orgs/members.service.js +234 -0
- package/dist/orgs/offboarding.d.ts +141 -0
- package/dist/orgs/offboarding.js +398 -0
- package/dist/orgs/org-lock.d.ts +32 -0
- package/dist/orgs/org-lock.js +46 -0
- package/dist/orgs/org.guard.d.ts +35 -0
- package/dist/orgs/org.guard.js +95 -0
- package/dist/orgs/orgs.controller.d.ts +78 -0
- package/dist/orgs/orgs.controller.js +192 -0
- package/dist/orgs/orgs.service.d.ts +61 -0
- package/dist/orgs/orgs.service.js +209 -0
- package/dist/orgs/roles.d.ts +13 -0
- package/dist/orgs/roles.js +58 -0
- package/dist/orgs/settings.controller.d.ts +20 -0
- package/dist/orgs/settings.controller.js +53 -0
- package/dist/orgs/settings.service.d.ts +120 -0
- package/dist/orgs/settings.service.js +178 -0
- package/dist/packages/npm.d.ts +50 -0
- package/dist/packages/npm.js +218 -0
- package/dist/packages/provenance.d.ts +47 -0
- package/dist/packages/provenance.js +147 -0
- package/dist/packages/tgz.d.ts +76 -0
- package/dist/packages/tgz.js +225 -0
- package/dist/runtime/abort.d.ts +32 -0
- package/dist/runtime/abort.js +71 -0
- package/dist/runtime/checkpointer.d.ts +32 -0
- package/dist/runtime/checkpointer.js +243 -0
- package/dist/runtime/context/build.d.ts +254 -0
- package/dist/runtime/context/build.js +693 -0
- package/dist/runtime/context/claude-tools.d.ts +11 -0
- package/dist/runtime/context/claude-tools.js +24 -0
- package/dist/runtime/context/compaction.d.ts +26 -0
- package/dist/runtime/context/compaction.js +195 -0
- package/dist/runtime/context/pairing.d.ts +11 -0
- package/dist/runtime/context/pairing.js +82 -0
- package/dist/runtime/context/reminders.d.ts +5 -0
- package/dist/runtime/context/reminders.js +11 -0
- package/dist/runtime/context/skills.d.ts +105 -0
- package/dist/runtime/context/skills.js +283 -0
- package/dist/runtime/context/tokens.d.ts +19 -0
- package/dist/runtime/context/tokens.js +104 -0
- package/dist/runtime/conversation-lock.d.ts +40 -0
- package/dist/runtime/conversation-lock.js +97 -0
- package/dist/runtime/hook-calls.d.ts +84 -0
- package/dist/runtime/hook-calls.js +136 -0
- package/dist/runtime/langgraph-loop.d.ts +52 -0
- package/dist/runtime/langgraph-loop.js +247 -0
- package/dist/runtime/loop.d.ts +93 -0
- package/dist/runtime/loop.js +7 -0
- package/dist/runtime/maintenance.d.ts +80 -0
- package/dist/runtime/maintenance.js +147 -0
- package/dist/runtime/media-cache.d.ts +21 -0
- package/dist/runtime/media-cache.js +51 -0
- package/dist/runtime/model-call.d.ts +176 -0
- package/dist/runtime/model-call.js +1049 -0
- package/dist/runtime/providers.d.ts +86 -0
- package/dist/runtime/providers.js +224 -0
- package/dist/runtime/quota.d.ts +29 -0
- package/dist/runtime/quota.js +70 -0
- package/dist/runtime/run-finish.d.ts +45 -0
- package/dist/runtime/run-finish.js +69 -0
- package/dist/runtime/run-queue.d.ts +121 -0
- package/dist/runtime/run-queue.js +493 -0
- package/dist/runtime/run-worker.d.ts +138 -0
- package/dist/runtime/run-worker.js +805 -0
- package/dist/runtime/stream.controller.d.ts +34 -0
- package/dist/runtime/stream.controller.js +122 -0
- package/dist/runtime/stream.d.ts +63 -0
- package/dist/runtime/stream.js +262 -0
- package/dist/runtime/subagents/child.d.ts +80 -0
- package/dist/runtime/subagents/child.js +225 -0
- package/dist/runtime/subagents/definition.d.ts +103 -0
- package/dist/runtime/subagents/definition.js +392 -0
- package/dist/runtime/subagents/dispatch.d.ts +69 -0
- package/dist/runtime/subagents/dispatch.js +502 -0
- package/dist/runtime/subagents/limits.d.ts +23 -0
- package/dist/runtime/subagents/limits.js +34 -0
- package/dist/runtime/subagents/org-agents.d.ts +50 -0
- package/dist/runtime/subagents/org-agents.js +70 -0
- package/dist/runtime/subagents/preamble.d.ts +7 -0
- package/dist/runtime/subagents/preamble.js +11 -0
- package/dist/runtime/subagents/progress.d.ts +26 -0
- package/dist/runtime/subagents/progress.js +36 -0
- package/dist/runtime/subagents/roster.d.ts +55 -0
- package/dist/runtime/subagents/roster.js +111 -0
- package/dist/runtime/subagents/skill-fork.d.ts +123 -0
- package/dist/runtime/subagents/skill-fork.js +259 -0
- package/dist/runtime/usage-report.d.ts +163 -0
- package/dist/runtime/usage-report.js +550 -0
- package/dist/runtime/waits.d.ts +233 -0
- package/dist/runtime/waits.js +883 -0
- package/dist/sandbox/leases.d.ts +169 -0
- package/dist/sandbox/leases.js +515 -0
- package/dist/sandbox/lifecycle.d.ts +21 -0
- package/dist/sandbox/lifecycle.js +68 -0
- package/dist/sandbox/sandbox.service.d.ts +249 -0
- package/dist/sandbox/sandbox.service.js +908 -0
- package/dist/skills/catalog.d.ts +149 -0
- package/dist/skills/catalog.js +405 -0
- package/dist/skills/changes.controller.d.ts +56 -0
- package/dist/skills/changes.controller.js +136 -0
- package/dist/skills/changes.service.d.ts +175 -0
- package/dist/skills/changes.service.js +805 -0
- package/dist/skills/invocable.controller.d.ts +23 -0
- package/dist/skills/invocable.controller.js +50 -0
- package/dist/skills/invocation-keys.d.ts +23 -0
- package/dist/skills/invocation-keys.js +44 -0
- package/dist/skills/invoke.d.ts +135 -0
- package/dist/skills/invoke.js +286 -0
- package/dist/skills/package.d.ts +87 -0
- package/dist/skills/package.js +227 -0
- package/dist/skills/skills.controller.d.ts +40 -0
- package/dist/skills/skills.controller.js +110 -0
- package/dist/skills/skills.service.d.ts +192 -0
- package/dist/skills/skills.service.js +567 -0
- package/dist/storage/prefix.d.ts +36 -0
- package/dist/storage/prefix.js +104 -0
- package/dist/storage/purge.d.ts +27 -0
- package/dist/storage/purge.js +75 -0
- package/dist/storage/storage.service.d.ts +44 -0
- package/dist/storage/storage.service.js +145 -0
- package/dist/text.d.ts +13 -0
- package/dist/text.js +13 -0
- package/dist/tools/approvals.controller.d.ts +53 -0
- package/dist/tools/approvals.controller.js +128 -0
- package/dist/tools/approvals.service.d.ts +172 -0
- package/dist/tools/approvals.service.js +568 -0
- package/dist/tools/breaker.d.ts +28 -0
- package/dist/tools/breaker.js +72 -0
- package/dist/tools/builtins/agent.d.ts +81 -0
- package/dist/tools/builtins/agent.js +223 -0
- package/dist/tools/builtins/ask-user.d.ts +28 -0
- package/dist/tools/builtins/ask-user.js +139 -0
- package/dist/tools/builtins/read-tool-output.d.ts +18 -0
- package/dist/tools/builtins/read-tool-output.js +108 -0
- package/dist/tools/builtins/sandbox/bash.d.ts +16 -0
- package/dist/tools/builtins/sandbox/bash.js +137 -0
- package/dist/tools/builtins/sandbox/common.d.ts +114 -0
- package/dist/tools/builtins/sandbox/common.js +304 -0
- package/dist/tools/builtins/sandbox/deliver.d.ts +5 -0
- package/dist/tools/builtins/sandbox/deliver.js +180 -0
- package/dist/tools/builtins/sandbox/edit.d.ts +4 -0
- package/dist/tools/builtins/sandbox/edit.js +98 -0
- package/dist/tools/builtins/sandbox/glob-match.d.ts +25 -0
- package/dist/tools/builtins/sandbox/glob-match.js +240 -0
- package/dist/tools/builtins/sandbox/glob.d.ts +4 -0
- package/dist/tools/builtins/sandbox/glob.js +104 -0
- package/dist/tools/builtins/sandbox/grep.d.ts +9 -0
- package/dist/tools/builtins/sandbox/grep.js +133 -0
- package/dist/tools/builtins/sandbox/index.d.ts +12 -0
- package/dist/tools/builtins/sandbox/index.js +27 -0
- package/dist/tools/builtins/sandbox/names.d.ts +7 -0
- package/dist/tools/builtins/sandbox/names.js +20 -0
- package/dist/tools/builtins/sandbox/read.d.ts +8 -0
- package/dist/tools/builtins/sandbox/read.js +121 -0
- package/dist/tools/builtins/sandbox/write.d.ts +4 -0
- package/dist/tools/builtins/sandbox/write.js +88 -0
- package/dist/tools/builtins/skill-load.d.ts +53 -0
- package/dist/tools/builtins/skill-load.js +446 -0
- package/dist/tools/builtins/skill-write.d.ts +59 -0
- package/dist/tools/builtins/skill-write.js +244 -0
- package/dist/tools/builtins/tool-search.d.ts +31 -0
- package/dist/tools/builtins/tool-search.js +171 -0
- package/dist/tools/connector-content.controller.d.ts +34 -0
- package/dist/tools/connector-content.controller.js +78 -0
- package/dist/tools/connector-content.d.ts +104 -0
- package/dist/tools/connector-content.js +267 -0
- package/dist/tools/connectors.controller.d.ts +210 -0
- package/dist/tools/connectors.controller.js +234 -0
- package/dist/tools/connectors.service.d.ts +303 -0
- package/dist/tools/connectors.service.js +1102 -0
- package/dist/tools/credentials.d.ts +139 -0
- package/dist/tools/credentials.js +351 -0
- package/dist/tools/drift.d.ts +141 -0
- package/dist/tools/drift.js +539 -0
- package/dist/tools/elicitation.d.ts +81 -0
- package/dist/tools/elicitation.js +266 -0
- package/dist/tools/endpoint.d.ts +18 -0
- package/dist/tools/endpoint.js +115 -0
- package/dist/tools/info.d.ts +67 -0
- package/dist/tools/info.js +113 -0
- package/dist/tools/naming.d.ts +27 -0
- package/dist/tools/naming.js +47 -0
- package/dist/tools/oauth/discovery.d.ts +65 -0
- package/dist/tools/oauth/discovery.js +307 -0
- package/dist/tools/oauth/flow.d.ts +63 -0
- package/dist/tools/oauth/flow.js +237 -0
- package/dist/tools/oauth/oauth.controller.d.ts +31 -0
- package/dist/tools/oauth/oauth.controller.js +95 -0
- package/dist/tools/oauth/tokens.d.ts +111 -0
- package/dist/tools/oauth/tokens.js +258 -0
- package/dist/tools/outputs.d.ts +61 -0
- package/dist/tools/outputs.js +156 -0
- package/dist/tools/pipeline.d.ts +322 -0
- package/dist/tools/pipeline.js +1236 -0
- package/dist/tools/policy.d.ts +60 -0
- package/dist/tools/policy.js +236 -0
- package/dist/tools/questions.controller.d.ts +24 -0
- package/dist/tools/questions.controller.js +58 -0
- package/dist/tools/questions.service.d.ts +103 -0
- package/dist/tools/questions.service.js +295 -0
- package/dist/tools/redact.d.ts +20 -0
- package/dist/tools/redact.js +60 -0
- package/dist/tools/registry.d.ts +246 -0
- package/dist/tools/registry.js +481 -0
- package/dist/tools/resources.d.ts +16 -0
- package/dist/tools/resources.js +76 -0
- package/dist/tools/specs.d.ts +14 -0
- package/dist/tools/specs.js +31 -0
- package/dist/tools/validate.d.ts +20 -0
- package/dist/tools/validate.js +183 -0
- package/dist/tools/view.d.ts +43 -0
- package/dist/tools/view.js +225 -0
- package/dist/ui/embed-token.d.ts +31 -0
- package/dist/ui/embed-token.js +132 -0
- package/dist/ui/registry.d.ts +58 -0
- package/dist/ui/registry.js +90 -0
- package/dist/ui/ui-stream.d.ts +37 -0
- package/dist/ui/ui-stream.js +162 -0
- package/dist/ui/views.controller.d.ts +81 -0
- package/dist/ui/views.controller.js +261 -0
- package/dist/ui/views.d.ts +155 -0
- package/dist/ui/views.js +306 -0
- package/dist/version.d.ts +5 -0
- package/dist/version.js +6 -0
- package/package.json +67 -3
- package/src/migrations/0001_init.sql +8 -0
- package/src/migrations/0002_secrets.sql +8 -0
- package/src/migrations/0003_identity.sql +117 -0
- package/src/migrations/0004_plugin_org_config_nullable.sql +3 -0
- package/src/migrations/0005_agents.sql +27 -0
- package/src/migrations/0006_conversations.sql +37 -0
- package/src/migrations/0007_checkpoints.sql +26 -0
- package/src/migrations/0008_runs_trigger_seq.sql +3 -0
- package/src/migrations/0009_runs_active_unique.sql +4 -0
- package/src/migrations/0010_tools.sql +125 -0
- package/src/migrations/0011_approvals_spec.sql +10 -0
- package/src/migrations/0012_run_waits.sql +24 -0
- package/src/migrations/0013_app_tools_source.sql +4 -0
- package/src/migrations/0014_tool_specs.sql +8 -0
- package/src/migrations/0015_tool_drift.sql +20 -0
- package/src/migrations/0016_plugin_permissions.sql +11 -0
- package/src/migrations/0017_identity_sources.sql +6 -0
- package/src/migrations/0018_channels.sql +74 -0
- package/src/migrations/0019_identity_trust.sql +17 -0
- package/src/migrations/0020_channel_card_lookup.sql +10 -0
- package/src/migrations/0021_org_storage_purge.sql +9 -0
- package/src/migrations/0022_attachments.sql +29 -0
- package/src/migrations/0023_sandboxes.sql +37 -0
- package/src/migrations/0024_skills.sql +46 -0
- package/src/migrations/0025_skills_catalog_idx.sql +6 -0
- package/src/migrations/0026_skill_changes.sql +34 -0
- package/src/migrations/0027_model_prices.sql +18 -0
- package/src/migrations/0028_evals.sql +105 -0
- package/src/migrations/0029_model_purposes.sql +18 -0
- package/src/migrations/0030_plugin_installs.sql +73 -0
- package/src/migrations/0031_plugin_snapshot_source.sql +6 -0
- package/src/migrations/0032_plugin_deployment_configs.sql +10 -0
- package/src/migrations/0033_rename_apps_to_connectors.sql +25 -0
- package/src/migrations/0034_directory.sql +49 -0
- package/src/migrations/0035_catalogs.sql +40 -0
- package/src/migrations/0036_app_import_staging.sql +17 -0
- package/src/migrations/0037_directory_installs.sql +92 -0
- package/src/migrations/0038_channel_inbound_mode.sql +6 -0
- package/src/migrations/0039_channel_card_pending.sql +8 -0
- package/src/migrations/0040_usage_report_sweep.sql +10 -0
- package/src/migrations/0041_rename_plugins_to_extensions.sql +38 -0
- package/src/migrations/0042_rename_directory_to_catalog.sql +80 -0
- package/src/migrations/0043_rename_app_installs_to_plugin_installs.sql +20 -0
- package/src/migrations/0044_catalog_one_kind.sql +90 -0
- package/src/migrations/0045_plugin_dependencies.sql +9 -0
- package/src/migrations/0046_git_sources.sql +25 -0
- package/src/migrations/0047_marketplace_entry_heads.sql +7 -0
- package/src/migrations/0048_marketplace_entry_trees.sql +8 -0
- package/src/migrations/0049_plugin_upgrades.sql +37 -0
- package/src/migrations/0050_bootstrap.sql +53 -0
- package/src/migrations/0051_claude_compat.sql +26 -0
- package/src/migrations/0052_conversations_account_agent_idx.sql +5 -0
- package/src/migrations/0053_subagents.sql +73 -0
- package/src/migrations/0054_subagent_wait_expiry.sql +7 -0
- package/src/migrations/0055_subagent_parent_indexes.sql +10 -0
- package/src/migrations/0056_approval_reason.sql +3 -0
- package/src/migrations/0057_conversation_titles.sql +11 -0
- package/src/migrations/0058_conversation_selection.sql +4 -0
- package/src/migrations/0059_conversation_queue.sql +22 -0
- package/src/migrations/0060_file_previewers.sql +10 -0
- package/src/migrations/0061_queue_selection.sql +5 -0
- package/src/migrations/0062_queued_skill.sql +8 -0
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import type { KernelConfig } from "../config/schema.js";
|
|
3
|
+
import type { ExtensionAdminOps } from "../extensions/admin-ops.js";
|
|
4
|
+
import type { ExtensionAdmin } from "../extensions/admin-view.js";
|
|
5
|
+
import type { DeploymentConfigView, ExtensionDeploymentConfigService } from "../extensions/deployment-config.js";
|
|
6
|
+
import type { ExtensionInstalls, PackageReview } from "../extensions/installs.js";
|
|
7
|
+
import type { AdminExtensionView } from "../extensions/permission-view.js";
|
|
8
|
+
import { type Principal } from "../identity/principal.js";
|
|
9
|
+
declare const ApproveBody: z.ZodObject<{
|
|
10
|
+
sha256: z.ZodNullable<z.ZodString>;
|
|
11
|
+
reviewHash: z.ZodString;
|
|
12
|
+
}, z.core.$strip>;
|
|
13
|
+
declare const InstallBody: z.ZodObject<{
|
|
14
|
+
sha256: z.ZodString;
|
|
15
|
+
}, z.core.$strip>;
|
|
16
|
+
declare const ConfigBody: z.ZodObject<{
|
|
17
|
+
values: z.ZodRecord<z.ZodString, z.ZodUnknown>;
|
|
18
|
+
}, z.core.$strip>;
|
|
19
|
+
declare const NpmBody: z.ZodObject<{
|
|
20
|
+
package: z.ZodString;
|
|
21
|
+
version: z.ZodOptional<z.ZodString>;
|
|
22
|
+
}, z.core.$strip>;
|
|
23
|
+
/**
|
|
24
|
+
* Deployment-level extension management (`/api/v1/admin/extensions/*`, enterprise admins): package
|
|
25
|
+
* import (upload / npm, returns the review), the extension list and detail, web permission approval
|
|
26
|
+
* (D8), install / enable / disable / uninstall (only writes the desired state and publishes
|
|
27
|
+
* `kernel.plugins.changed`; every replica reconciles, no restart; replicas may still be converging
|
|
28
|
+
* when the call returns).
|
|
29
|
+
*/
|
|
30
|
+
export declare class AdminExtensionsController {
|
|
31
|
+
private readonly installs;
|
|
32
|
+
private readonly admin;
|
|
33
|
+
private readonly ops;
|
|
34
|
+
private readonly deploymentConfigs;
|
|
35
|
+
private readonly kernelConfig;
|
|
36
|
+
constructor(installs: ExtensionInstalls, admin: ExtensionAdmin, ops: ExtensionAdminOps, deploymentConfigs: ExtensionDeploymentConfigService, kernelConfig: () => KernelConfig);
|
|
37
|
+
/**
|
|
38
|
+
* 部署上的全部插件(内置、配置声明、安装记录)及其状态、权限与快照;`drainSeconds` 为停用 / 升级时
|
|
39
|
+
* 在途工具调用最多等待的秒数(`extensionHost.drainSeconds`,界面提示用)。
|
|
40
|
+
*/
|
|
41
|
+
list(): Promise<{
|
|
42
|
+
extensions: AdminExtensionView[];
|
|
43
|
+
drainSeconds: number;
|
|
44
|
+
}>;
|
|
45
|
+
/** A single extension; unknown -> 404 `extension.not_found`. */
|
|
46
|
+
get(name: string): Promise<AdminExtensionView>;
|
|
47
|
+
/**
|
|
48
|
+
* Deployment config (D8 / C10): each field's source (read-only from file / Nacos / env), the
|
|
49
|
+
* effective value (secrets only say whether they are set), the JSON Schema and the validation
|
|
50
|
+
* result. Unknown -> 404 `extension.not_found`.
|
|
51
|
+
*/
|
|
52
|
+
config(name: string): Promise<DeploymentConfigView>;
|
|
53
|
+
/**
|
|
54
|
+
* Saves the deployment config (`values` keyed by field dot path; `null` clears, omitted keeps).
|
|
55
|
+
* A field present in the startup config -> 409 `extension.config_readonly`; unknown or invalid
|
|
56
|
+
* -> 400 `extension.config_invalid` (values not echoed). A problem in a read-only field itself
|
|
57
|
+
* (a value from the startup config) does not block the PUT: it saves anyway, the extension stays
|
|
58
|
+
* pending configuration and the startup config has to change. Every replica re-reads after saving:
|
|
59
|
+
* hot fields are replaced in place, other fields reload the extension, and a pending extension
|
|
60
|
+
* loads (no restart).
|
|
61
|
+
*/
|
|
62
|
+
putConfig(principal: Principal, name: string, body: z.infer<typeof ConfigBody>): Promise<DeploymentConfigView>;
|
|
63
|
+
/**
|
|
64
|
+
* Web approval: writes the snapshot (source web), audits `extension.permissions_approved` and
|
|
65
|
+
* publishes `kernel.plugins.changed`. Package or
|
|
66
|
+
* permissions changed after the review -> 409 `extension.approval_stale`; nothing to approve ->
|
|
67
|
+
* 409 `extension.not_pending`.
|
|
68
|
+
*/
|
|
69
|
+
approve(principal: Principal, name: string, body: z.infer<typeof ApproveBody>): Promise<AdminExtensionView>;
|
|
70
|
+
/**
|
|
71
|
+
* New install or version change (upgrade / downgrade): the install record points at `sha256` in the
|
|
72
|
+
* package store; the desired state is unchanged (a new install is disabled).
|
|
73
|
+
* Config-declared -> 409 `extension.config_declared`; package
|
|
74
|
+
* missing -> 404 `extension.package_not_found`; extension name in the package differs -> 409
|
|
75
|
+
* `extension.name_mismatch`; an extension of the same name comes from another npm package -> 409
|
|
76
|
+
* `extension.name_conflict`; downgrade to a version with unrun migrations -> 409
|
|
77
|
+
* `extension.downgrade_unsupported`.
|
|
78
|
+
*/
|
|
79
|
+
install(principal: Principal, name: string, body: z.infer<typeof InstallBody>): Promise<AdminExtensionView>;
|
|
80
|
+
/** Enable on the deployment; not installed -> 404 `extension.not_found`; config-declared -> 409. */
|
|
81
|
+
enable(principal: Principal, name: string): Promise<AdminExtensionView>;
|
|
82
|
+
/**
|
|
83
|
+
* 部署上停用(各副本排空在途调用后卸下);未安装 → 404;配置声明 → 409;必需的引导插件 → 409
|
|
84
|
+
* `extension.required`。
|
|
85
|
+
*/
|
|
86
|
+
disable(principal: Principal, name: string): Promise<AdminExtensionView>;
|
|
87
|
+
/** Uninstall (must be disabled first, otherwise 409 `extension.not_disabled`); data is kept. */
|
|
88
|
+
uninstall(principal: Principal, name: string): Promise<void>;
|
|
89
|
+
/**
|
|
90
|
+
* Uploads an extension package (the body is the raw tgz bytes, `application/octet-stream`, limit
|
|
91
|
+
* `packages.maxBytes`). Invalid package -> 400 `extension.package_invalid` (details list each
|
|
92
|
+
* problem); over the limit -> 413; same name as a config-declared extension -> 409.
|
|
93
|
+
*/
|
|
94
|
+
uploadFile(principal: Principal, req: {
|
|
95
|
+
body?: unknown;
|
|
96
|
+
}): Promise<PackageReview>;
|
|
97
|
+
/** 从配置的 npm registry 拉取(`version` 可以是版本、dist-tag 或范围,缺省 latest)。下载失败 → 502。 */
|
|
98
|
+
fromNpm(principal: Principal, body: z.infer<typeof NpmBody>): Promise<PackageReview>;
|
|
99
|
+
}
|
|
100
|
+
export {};
|
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
8
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
9
|
+
};
|
|
10
|
+
import { Body, Controller, Delete, Get, HttpCode, Inject, Param, Post, Put, Req, } from "@nestjs/common";
|
|
11
|
+
import { z } from "zod";
|
|
12
|
+
import { ApiError } from "../errors.js";
|
|
13
|
+
import { EXTENSION_ADMIN, EXTENSION_ADMIN_OPS, EXTENSION_DEPLOYMENT_CONFIGS, EXTENSION_INSTALLS, KERNEL_CONFIG, } from "../http/tokens.js";
|
|
14
|
+
import { ZodPipe } from "../http/zod.pipe.js";
|
|
15
|
+
import { CurrentPrincipal, EnterpriseAdmin, patTokenId, requireUser, } from "../identity/principal.js";
|
|
16
|
+
const ApproveBody = z.object({
|
|
17
|
+
/** 安装记录的包(审阅时的 sha256);配置声明的插件为 null。 */
|
|
18
|
+
sha256: z
|
|
19
|
+
.string()
|
|
20
|
+
.regex(/^[0-9a-f]{64}$/)
|
|
21
|
+
.nullable(),
|
|
22
|
+
reviewHash: z.string().regex(/^[0-9a-f]{16}$/),
|
|
23
|
+
});
|
|
24
|
+
const InstallBody = z.object({
|
|
25
|
+
/** 包存储里的包(上传 / npm 导入返回的 sha256)。 */
|
|
26
|
+
sha256: z.string().regex(/^[0-9a-f]{64}$/),
|
|
27
|
+
});
|
|
28
|
+
const ConfigBody = z.object({
|
|
29
|
+
/** 字段点路径 → 新值(`null` 清除)。 */
|
|
30
|
+
values: z.record(z.string().min(1).max(256), z.unknown()),
|
|
31
|
+
});
|
|
32
|
+
const NpmBody = z.object({
|
|
33
|
+
package: z.string().min(1).max(214),
|
|
34
|
+
version: z.string().min(1).max(256).optional(),
|
|
35
|
+
});
|
|
36
|
+
/**
|
|
37
|
+
* Deployment-level extension management (`/api/v1/admin/extensions/*`, enterprise admins): package
|
|
38
|
+
* import (upload / npm, returns the review), the extension list and detail, web permission approval
|
|
39
|
+
* (D8), install / enable / disable / uninstall (only writes the desired state and publishes
|
|
40
|
+
* `kernel.plugins.changed`; every replica reconciles, no restart; replicas may still be converging
|
|
41
|
+
* when the call returns).
|
|
42
|
+
*/
|
|
43
|
+
let AdminExtensionsController = class AdminExtensionsController {
|
|
44
|
+
installs;
|
|
45
|
+
admin;
|
|
46
|
+
ops;
|
|
47
|
+
deploymentConfigs;
|
|
48
|
+
kernelConfig;
|
|
49
|
+
constructor(installs, admin, ops, deploymentConfigs,
|
|
50
|
+
// 字段名不能与路由方法同名(如 `config`):实例字段会遮住原型上的处理函数
|
|
51
|
+
kernelConfig) {
|
|
52
|
+
this.installs = installs;
|
|
53
|
+
this.admin = admin;
|
|
54
|
+
this.ops = ops;
|
|
55
|
+
this.deploymentConfigs = deploymentConfigs;
|
|
56
|
+
this.kernelConfig = kernelConfig;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* 部署上的全部插件(内置、配置声明、安装记录)及其状态、权限与快照;`drainSeconds` 为停用 / 升级时
|
|
60
|
+
* 在途工具调用最多等待的秒数(`extensionHost.drainSeconds`,界面提示用)。
|
|
61
|
+
*/
|
|
62
|
+
async list() {
|
|
63
|
+
return {
|
|
64
|
+
extensions: await this.admin.list(),
|
|
65
|
+
drainSeconds: this.kernelConfig().extensionHost.drainSeconds,
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
/** A single extension; unknown -> 404 `extension.not_found`. */
|
|
69
|
+
get(name) {
|
|
70
|
+
return this.admin.get(name);
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Deployment config (D8 / C10): each field's source (read-only from file / Nacos / env), the
|
|
74
|
+
* effective value (secrets only say whether they are set), the JSON Schema and the validation
|
|
75
|
+
* result. Unknown -> 404 `extension.not_found`.
|
|
76
|
+
*/
|
|
77
|
+
config(name) {
|
|
78
|
+
return this.deploymentConfigs.view(name);
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Saves the deployment config (`values` keyed by field dot path; `null` clears, omitted keeps).
|
|
82
|
+
* A field present in the startup config -> 409 `extension.config_readonly`; unknown or invalid
|
|
83
|
+
* -> 400 `extension.config_invalid` (values not echoed). A problem in a read-only field itself
|
|
84
|
+
* (a value from the startup config) does not block the PUT: it saves anyway, the extension stays
|
|
85
|
+
* pending configuration and the startup config has to change. Every replica re-reads after saving:
|
|
86
|
+
* hot fields are replaced in place, other fields reload the extension, and a pending extension
|
|
87
|
+
* loads (no restart).
|
|
88
|
+
*/
|
|
89
|
+
putConfig(principal, name, body) {
|
|
90
|
+
const actor = requireUser(principal);
|
|
91
|
+
return this.deploymentConfigs.put(name, body.values, actor.account.id, patTokenId(actor));
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Web approval: writes the snapshot (source web), audits `extension.permissions_approved` and
|
|
95
|
+
* publishes `kernel.plugins.changed`. Package or
|
|
96
|
+
* permissions changed after the review -> 409 `extension.approval_stale`; nothing to approve ->
|
|
97
|
+
* 409 `extension.not_pending`.
|
|
98
|
+
*/
|
|
99
|
+
async approve(principal, name, body) {
|
|
100
|
+
const actor = requireUser(principal);
|
|
101
|
+
const tokenId = patTokenId(actor);
|
|
102
|
+
return this.admin.approve(actor.account.id, name, body, tokenId !== undefined ? { actorTokenId: tokenId } : {});
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* New install or version change (upgrade / downgrade): the install record points at `sha256` in the
|
|
106
|
+
* package store; the desired state is unchanged (a new install is disabled).
|
|
107
|
+
* Config-declared -> 409 `extension.config_declared`; package
|
|
108
|
+
* missing -> 404 `extension.package_not_found`; extension name in the package differs -> 409
|
|
109
|
+
* `extension.name_mismatch`; an extension of the same name comes from another npm package -> 409
|
|
110
|
+
* `extension.name_conflict`; downgrade to a version with unrun migrations -> 409
|
|
111
|
+
* `extension.downgrade_unsupported`.
|
|
112
|
+
*/
|
|
113
|
+
install(principal, name, body) {
|
|
114
|
+
const actor = requireUser(principal);
|
|
115
|
+
return this.ops.install(name, body.sha256, actor.account.id, patTokenId(actor));
|
|
116
|
+
}
|
|
117
|
+
/** Enable on the deployment; not installed -> 404 `extension.not_found`; config-declared -> 409. */
|
|
118
|
+
enable(principal, name) {
|
|
119
|
+
const actor = requireUser(principal);
|
|
120
|
+
return this.ops.enable(name, actor.account.id, patTokenId(actor));
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* 部署上停用(各副本排空在途调用后卸下);未安装 → 404;配置声明 → 409;必需的引导插件 → 409
|
|
124
|
+
* `extension.required`。
|
|
125
|
+
*/
|
|
126
|
+
disable(principal, name) {
|
|
127
|
+
const actor = requireUser(principal);
|
|
128
|
+
return this.ops.disable(name, actor.account.id, patTokenId(actor));
|
|
129
|
+
}
|
|
130
|
+
/** Uninstall (must be disabled first, otherwise 409 `extension.not_disabled`); data is kept. */
|
|
131
|
+
async uninstall(principal, name) {
|
|
132
|
+
const actor = requireUser(principal);
|
|
133
|
+
await this.ops.uninstall(name, actor.account.id, patTokenId(actor));
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Uploads an extension package (the body is the raw tgz bytes, `application/octet-stream`, limit
|
|
137
|
+
* `packages.maxBytes`). Invalid package -> 400 `extension.package_invalid` (details list each
|
|
138
|
+
* problem); over the limit -> 413; same name as a config-declared extension -> 409.
|
|
139
|
+
*/
|
|
140
|
+
async uploadFile(principal, req) {
|
|
141
|
+
const actor = requireUser(principal);
|
|
142
|
+
const body = req.body;
|
|
143
|
+
if (!Buffer.isBuffer(body) || body.byteLength === 0) {
|
|
144
|
+
throw new ApiError("unsupported_media_type", "Send the extension package (.tgz) as the request body with content-type application/octet-stream");
|
|
145
|
+
}
|
|
146
|
+
const tokenId = patTokenId(actor);
|
|
147
|
+
return this.installs.ingestFile(actor.account.id, new Uint8Array(body.buffer, body.byteOffset, body.byteLength), tokenId !== undefined ? { actorTokenId: tokenId } : {});
|
|
148
|
+
}
|
|
149
|
+
/** 从配置的 npm registry 拉取(`version` 可以是版本、dist-tag 或范围,缺省 latest)。下载失败 → 502。 */
|
|
150
|
+
async fromNpm(principal, body) {
|
|
151
|
+
const actor = requireUser(principal);
|
|
152
|
+
const tokenId = patTokenId(actor);
|
|
153
|
+
return this.installs.ingestNpm(actor.account.id, { package: body.package, ...(body.version !== undefined && { version: body.version }) }, tokenId !== undefined ? { actorTokenId: tokenId } : {});
|
|
154
|
+
}
|
|
155
|
+
};
|
|
156
|
+
__decorate([
|
|
157
|
+
Get()
|
|
158
|
+
], AdminExtensionsController.prototype, "list", null);
|
|
159
|
+
__decorate([
|
|
160
|
+
Get(":name"),
|
|
161
|
+
__param(0, Param("name"))
|
|
162
|
+
], AdminExtensionsController.prototype, "get", null);
|
|
163
|
+
__decorate([
|
|
164
|
+
Get(":name/config"),
|
|
165
|
+
__param(0, Param("name"))
|
|
166
|
+
], AdminExtensionsController.prototype, "config", null);
|
|
167
|
+
__decorate([
|
|
168
|
+
Put(":name/config"),
|
|
169
|
+
__param(0, CurrentPrincipal()),
|
|
170
|
+
__param(1, Param("name")),
|
|
171
|
+
__param(2, Body(new ZodPipe(ConfigBody)))
|
|
172
|
+
], AdminExtensionsController.prototype, "putConfig", null);
|
|
173
|
+
__decorate([
|
|
174
|
+
Post(":name/approve"),
|
|
175
|
+
HttpCode(200),
|
|
176
|
+
__param(0, CurrentPrincipal()),
|
|
177
|
+
__param(1, Param("name")),
|
|
178
|
+
__param(2, Body(new ZodPipe(ApproveBody)))
|
|
179
|
+
], AdminExtensionsController.prototype, "approve", null);
|
|
180
|
+
__decorate([
|
|
181
|
+
Post(":name/install"),
|
|
182
|
+
HttpCode(200),
|
|
183
|
+
__param(0, CurrentPrincipal()),
|
|
184
|
+
__param(1, Param("name")),
|
|
185
|
+
__param(2, Body(new ZodPipe(InstallBody)))
|
|
186
|
+
], AdminExtensionsController.prototype, "install", null);
|
|
187
|
+
__decorate([
|
|
188
|
+
Post(":name/enable"),
|
|
189
|
+
HttpCode(200),
|
|
190
|
+
__param(0, CurrentPrincipal()),
|
|
191
|
+
__param(1, Param("name"))
|
|
192
|
+
], AdminExtensionsController.prototype, "enable", null);
|
|
193
|
+
__decorate([
|
|
194
|
+
Post(":name/disable"),
|
|
195
|
+
HttpCode(200),
|
|
196
|
+
__param(0, CurrentPrincipal()),
|
|
197
|
+
__param(1, Param("name"))
|
|
198
|
+
], AdminExtensionsController.prototype, "disable", null);
|
|
199
|
+
__decorate([
|
|
200
|
+
Delete(":name"),
|
|
201
|
+
HttpCode(204),
|
|
202
|
+
__param(0, CurrentPrincipal()),
|
|
203
|
+
__param(1, Param("name"))
|
|
204
|
+
], AdminExtensionsController.prototype, "uninstall", null);
|
|
205
|
+
__decorate([
|
|
206
|
+
Post("packages/file"),
|
|
207
|
+
HttpCode(200),
|
|
208
|
+
__param(0, CurrentPrincipal()),
|
|
209
|
+
__param(1, Req())
|
|
210
|
+
], AdminExtensionsController.prototype, "uploadFile", null);
|
|
211
|
+
__decorate([
|
|
212
|
+
Post("packages/npm"),
|
|
213
|
+
HttpCode(200),
|
|
214
|
+
__param(0, CurrentPrincipal()),
|
|
215
|
+
__param(1, Body(new ZodPipe(NpmBody)))
|
|
216
|
+
], AdminExtensionsController.prototype, "fromNpm", null);
|
|
217
|
+
AdminExtensionsController = __decorate([
|
|
218
|
+
Controller("api/v1/admin/extensions"),
|
|
219
|
+
EnterpriseAdmin(),
|
|
220
|
+
__param(0, Inject(EXTENSION_INSTALLS)),
|
|
221
|
+
__param(1, Inject(EXTENSION_ADMIN)),
|
|
222
|
+
__param(2, Inject(EXTENSION_ADMIN_OPS)),
|
|
223
|
+
__param(3, Inject(EXTENSION_DEPLOYMENT_CONFIGS)),
|
|
224
|
+
__param(4, Inject(KERNEL_CONFIG))
|
|
225
|
+
], AdminExtensionsController);
|
|
226
|
+
export { AdminExtensionsController };
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { FastifyReply, FastifyRequest } from "fastify";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
import type { KernelConfig } from "../config/schema.js";
|
|
4
|
+
import type { Account } from "../identity/accounts.js";
|
|
5
|
+
import type { LoginRateLimiter } from "../identity/rate-limit.js";
|
|
6
|
+
import type { SessionService } from "../identity/sessions.js";
|
|
7
|
+
import type { Org } from "../orgs/orgs.service.js";
|
|
8
|
+
import type { SetupService } from "./setup.service.js";
|
|
9
|
+
declare const SetupBody: z.ZodObject<{
|
|
10
|
+
login: z.ZodString;
|
|
11
|
+
password: z.ZodString;
|
|
12
|
+
displayName: z.ZodString;
|
|
13
|
+
orgName: z.ZodOptional<z.ZodString>;
|
|
14
|
+
setupToken: z.ZodOptional<z.ZodString>;
|
|
15
|
+
}, z.core.$strip>;
|
|
16
|
+
/** 初始化向导(`/api/v1/setup`,均为公开路由)。 */
|
|
17
|
+
export declare class SetupController {
|
|
18
|
+
private readonly setup;
|
|
19
|
+
private readonly sessions;
|
|
20
|
+
private readonly config;
|
|
21
|
+
private readonly limiter;
|
|
22
|
+
constructor(setup: SetupService, sessions: SessionService, config: () => KernelConfig, limiter: LoginRateLimiter);
|
|
23
|
+
status(): Promise<{
|
|
24
|
+
needsSetup: boolean;
|
|
25
|
+
}>;
|
|
26
|
+
/**
|
|
27
|
+
* 建首个企业管理员(可选同时建组织),成功后直接登录(设会话 Cookie)。
|
|
28
|
+
* 配置了 `auth.setupToken` 时 body 中的 `setupToken` 必须与之相等,否则 `setup.token_invalid`;
|
|
29
|
+
* 核对前先占用限流额度,超限 → 429 `auth.rate_limited`,核对通过后退还。
|
|
30
|
+
*/
|
|
31
|
+
complete(body: z.infer<typeof SetupBody>, req: FastifyRequest, reply: FastifyReply): Promise<{
|
|
32
|
+
account: Account;
|
|
33
|
+
org?: Org;
|
|
34
|
+
}>;
|
|
35
|
+
}
|
|
36
|
+
export {};
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
8
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
9
|
+
};
|
|
10
|
+
import { createHash, timingSafeEqual } from "node:crypto";
|
|
11
|
+
import { Body, Controller, Get, HttpCode, Inject, Post, Req, Res } from "@nestjs/common";
|
|
12
|
+
import { z } from "zod";
|
|
13
|
+
import { ApiError } from "../errors.js";
|
|
14
|
+
import { KERNEL_CONFIG, RATE_LIMITER, SESSIONS, SETUP } from "../http/tokens.js";
|
|
15
|
+
import { ZodPipe } from "../http/zod.pipe.js";
|
|
16
|
+
import { clientMeta } from "../identity/auth.controller.js";
|
|
17
|
+
import { setSessionCookies } from "../identity/cookies.js";
|
|
18
|
+
import { MAX_PASSWORD_LENGTH } from "../identity/login.js";
|
|
19
|
+
import { Public } from "../identity/principal.js";
|
|
20
|
+
const SetupBody = z.object({
|
|
21
|
+
login: z.string().min(1).max(64),
|
|
22
|
+
password: z.string().min(1).max(MAX_PASSWORD_LENGTH),
|
|
23
|
+
displayName: z.string().trim().min(1).max(100),
|
|
24
|
+
orgName: z.string().max(100).optional(),
|
|
25
|
+
setupToken: z.string().max(1024).optional(),
|
|
26
|
+
});
|
|
27
|
+
/**
|
|
28
|
+
* 初始化令牌的限流(scope `setup`):同一客户端 IP 10 次、全部署合计 100 次 / 900s
|
|
29
|
+
* (合计上限防换 IP 爆破;令牌本身应足够长,正常情况下打不满)。
|
|
30
|
+
*/
|
|
31
|
+
const SETUP_TOKEN_LIMIT_TOTAL = 100;
|
|
32
|
+
const SETUP_TOKEN_LIMIT_PER_IP = 10;
|
|
33
|
+
const sha256 = (s) => createHash("sha256").update(s, "utf8").digest();
|
|
34
|
+
/** 常数时间比较:两边先取 SHA-256,长度恒等,不因长度不同提前返回或抛错。 */
|
|
35
|
+
function tokenMatches(given, expected) {
|
|
36
|
+
return timingSafeEqual(sha256(given ?? ""), sha256(expected)) && given !== undefined;
|
|
37
|
+
}
|
|
38
|
+
/** 初始化向导(`/api/v1/setup`,均为公开路由)。 */
|
|
39
|
+
let SetupController = class SetupController {
|
|
40
|
+
setup;
|
|
41
|
+
sessions;
|
|
42
|
+
config;
|
|
43
|
+
limiter;
|
|
44
|
+
constructor(setup, sessions, config, limiter) {
|
|
45
|
+
this.setup = setup;
|
|
46
|
+
this.sessions = sessions;
|
|
47
|
+
this.config = config;
|
|
48
|
+
this.limiter = limiter;
|
|
49
|
+
}
|
|
50
|
+
async status() {
|
|
51
|
+
return this.setup.status();
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* 建首个企业管理员(可选同时建组织),成功后直接登录(设会话 Cookie)。
|
|
55
|
+
* 配置了 `auth.setupToken` 时 body 中的 `setupToken` 必须与之相等,否则 `setup.token_invalid`;
|
|
56
|
+
* 核对前先占用限流额度,超限 → 429 `auth.rate_limited`,核对通过后退还。
|
|
57
|
+
*/
|
|
58
|
+
async complete(body, req, reply) {
|
|
59
|
+
const cfg = this.config();
|
|
60
|
+
const expected = cfg.auth.setupToken;
|
|
61
|
+
if (expected !== undefined) {
|
|
62
|
+
const { ip } = clientMeta(req);
|
|
63
|
+
const rl = await this.limiter.reserveScoped("setup", "token", ip, SETUP_TOKEN_LIMIT_TOTAL, SETUP_TOKEN_LIMIT_PER_IP);
|
|
64
|
+
if (!rl.allowed) {
|
|
65
|
+
reply.header("retry-after", String(rl.retryAfterSeconds));
|
|
66
|
+
throw new ApiError("auth.rate_limited", "Too many setup attempts; try again later");
|
|
67
|
+
}
|
|
68
|
+
if (!tokenMatches(body.setupToken, expected)) {
|
|
69
|
+
throw new ApiError("setup.token_invalid", "Setup token is missing or invalid");
|
|
70
|
+
}
|
|
71
|
+
await this.limiter.succeededScoped("setup", "token", ip);
|
|
72
|
+
}
|
|
73
|
+
// 会话行与账号 / 组织在同一事务里写入;Cookie 在提交之后才设置
|
|
74
|
+
const meta = clientMeta(req);
|
|
75
|
+
const { extra: session, ...result } = await this.setup.complete({
|
|
76
|
+
login: body.login,
|
|
77
|
+
password: body.password,
|
|
78
|
+
displayName: body.displayName,
|
|
79
|
+
orgName: body.orgName,
|
|
80
|
+
}, (trx, account) => this.sessions.create(account.id, meta, trx));
|
|
81
|
+
if (!session)
|
|
82
|
+
throw new Error("setup completed without a session");
|
|
83
|
+
setSessionCookies(reply, session, cfg);
|
|
84
|
+
return result;
|
|
85
|
+
}
|
|
86
|
+
};
|
|
87
|
+
__decorate([
|
|
88
|
+
Get(),
|
|
89
|
+
Public()
|
|
90
|
+
], SetupController.prototype, "status", null);
|
|
91
|
+
__decorate([
|
|
92
|
+
Post(),
|
|
93
|
+
Public(),
|
|
94
|
+
HttpCode(201),
|
|
95
|
+
__param(0, Body(new ZodPipe(SetupBody))),
|
|
96
|
+
__param(1, Req()),
|
|
97
|
+
__param(2, Res({ passthrough: true }))
|
|
98
|
+
], SetupController.prototype, "complete", null);
|
|
99
|
+
SetupController = __decorate([
|
|
100
|
+
Controller("api/v1/setup"),
|
|
101
|
+
__param(0, Inject(SETUP)),
|
|
102
|
+
__param(1, Inject(SESSIONS)),
|
|
103
|
+
__param(2, Inject(KERNEL_CONFIG)),
|
|
104
|
+
__param(3, Inject(RATE_LIMITER))
|
|
105
|
+
], SetupController);
|
|
106
|
+
export { SetupController };
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import type { Transaction } from "kysely";
|
|
2
|
+
import type { KernelDatabase, KernelDb } from "../db/kernel-schema.js";
|
|
3
|
+
import type { Account, AccountsService } from "../identity/accounts.js";
|
|
4
|
+
import type { Org, OrgsService } from "../orgs/orgs.service.js";
|
|
5
|
+
/** 初始化向导与 CLI 建企业管理员。框架无关,由调用方注入依赖。 */
|
|
6
|
+
export declare class SetupService {
|
|
7
|
+
private readonly db;
|
|
8
|
+
private readonly accounts;
|
|
9
|
+
private readonly orgs;
|
|
10
|
+
constructor(db: KernelDb, accounts: AccountsService, orgs: OrgsService);
|
|
11
|
+
/** 不存在活跃企业管理员即需要初始化(每次实时查 PG,不缓存)。 */
|
|
12
|
+
status(): Promise<{
|
|
13
|
+
needsSetup: boolean;
|
|
14
|
+
}>;
|
|
15
|
+
/**
|
|
16
|
+
* 完成初始化:单个事务内先取咨询锁串行化并发的初始化请求,锁内再确认没有活跃企业管理员,
|
|
17
|
+
* 然后建企业管理员账号、(给了 `orgName` 时)建组织并以其为 owner。任一步失败整体回滚。
|
|
18
|
+
* 给了 `inTx` 时在同一事务的最后调用它(初始化向导用它建会话),结果放在 `extra`;它失败同样整体回滚。
|
|
19
|
+
*/
|
|
20
|
+
complete<T = undefined>(input: {
|
|
21
|
+
login: string;
|
|
22
|
+
password: string;
|
|
23
|
+
displayName: string;
|
|
24
|
+
orgName?: string | undefined;
|
|
25
|
+
}, inTx?: (trx: Transaction<KernelDatabase>, account: Account) => Promise<T>): Promise<{
|
|
26
|
+
account: Account;
|
|
27
|
+
org?: Org;
|
|
28
|
+
extra: T | undefined;
|
|
29
|
+
}>;
|
|
30
|
+
/** CLI 用:直接建企业管理员,不检查是否已初始化;登录名已存在 → `account.login_taken`。 */
|
|
31
|
+
createEnterpriseAdmin(input: EnterpriseAdminInput): Promise<Account>;
|
|
32
|
+
/**
|
|
33
|
+
* CLI `admin create --if-none`: create an enterprise admin only when no active one exists. The
|
|
34
|
+
* check and the insert run in one transaction under the same advisory lock as {@link complete},
|
|
35
|
+
* so concurrent runs (and a concurrent web setup) create exactly one. Returns undefined when an
|
|
36
|
+
* active enterprise admin already exists; a taken login still throws `account.login_taken`.
|
|
37
|
+
*/
|
|
38
|
+
createEnterpriseAdminIfNone(input: EnterpriseAdminInput): Promise<Account | undefined>;
|
|
39
|
+
private insertEnterpriseAdmin;
|
|
40
|
+
}
|
|
41
|
+
/** Input of the CLI enterprise admin creation. */
|
|
42
|
+
export interface EnterpriseAdminInput {
|
|
43
|
+
login: string;
|
|
44
|
+
password: string;
|
|
45
|
+
displayName: string;
|
|
46
|
+
email?: string | undefined;
|
|
47
|
+
}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { sql } from "kysely";
|
|
2
|
+
import { ApiError } from "../errors.js";
|
|
3
|
+
import { audit } from "../identity/audit.js";
|
|
4
|
+
const alreadyCompleted = () => new ApiError("setup.already_completed", "Deployment is already set up");
|
|
5
|
+
/** 初始化向导与 CLI 建企业管理员。框架无关,由调用方注入依赖。 */
|
|
6
|
+
export class SetupService {
|
|
7
|
+
db;
|
|
8
|
+
accounts;
|
|
9
|
+
orgs;
|
|
10
|
+
constructor(db, accounts, orgs) {
|
|
11
|
+
this.db = db;
|
|
12
|
+
this.accounts = accounts;
|
|
13
|
+
this.orgs = orgs;
|
|
14
|
+
}
|
|
15
|
+
/** 不存在活跃企业管理员即需要初始化(每次实时查 PG,不缓存)。 */
|
|
16
|
+
async status() {
|
|
17
|
+
return { needsSetup: (await this.accounts.countEnterpriseAdmins()) === 0 };
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* 完成初始化:单个事务内先取咨询锁串行化并发的初始化请求,锁内再确认没有活跃企业管理员,
|
|
21
|
+
* 然后建企业管理员账号、(给了 `orgName` 时)建组织并以其为 owner。任一步失败整体回滚。
|
|
22
|
+
* 给了 `inTx` 时在同一事务的最后调用它(初始化向导用它建会话),结果放在 `extra`;它失败同样整体回滚。
|
|
23
|
+
*/
|
|
24
|
+
async complete(input, inTx) {
|
|
25
|
+
// 先做一次廉价的预检查(已初始化的部署不白跑 scrypt),再在 BEGIN 之前算好哈希:
|
|
26
|
+
// 不在持有咨询锁的事务里跑 scrypt;锁内仍会复核
|
|
27
|
+
if ((await this.accounts.countEnterpriseAdmins()) > 0)
|
|
28
|
+
throw alreadyCompleted();
|
|
29
|
+
const passwordHash = await this.accounts.hashNewPassword(input.password);
|
|
30
|
+
return this.db.transaction().execute(async (trx) => {
|
|
31
|
+
await sql `SELECT pg_advisory_xact_lock(hashtext('capybara.setup'))`.execute(trx);
|
|
32
|
+
if ((await this.accounts.countEnterpriseAdmins(trx)) > 0)
|
|
33
|
+
throw alreadyCompleted();
|
|
34
|
+
const account = await this.accounts.createLocal({
|
|
35
|
+
login: input.login,
|
|
36
|
+
password: input.password,
|
|
37
|
+
displayName: input.displayName,
|
|
38
|
+
enterpriseAdmin: true,
|
|
39
|
+
}, trx, passwordHash);
|
|
40
|
+
const org = input.orgName !== undefined
|
|
41
|
+
? await this.orgs.create({ name: input.orgName }, account, { trx })
|
|
42
|
+
: undefined;
|
|
43
|
+
await audit(trx, {
|
|
44
|
+
actorAccountId: account.id,
|
|
45
|
+
action: "deployment.setup_completed",
|
|
46
|
+
target: account.id,
|
|
47
|
+
...(org && { orgId: org.id, detail: { orgId: org.id } }),
|
|
48
|
+
});
|
|
49
|
+
const extra = inTx ? await inTx(trx, account) : undefined;
|
|
50
|
+
return { account, ...(org && { org }), extra };
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
/** CLI 用:直接建企业管理员,不检查是否已初始化;登录名已存在 → `account.login_taken`。 */
|
|
54
|
+
async createEnterpriseAdmin(input) {
|
|
55
|
+
const passwordHash = await this.accounts.hashNewPassword(input.password);
|
|
56
|
+
return this.db
|
|
57
|
+
.transaction()
|
|
58
|
+
.execute((trx) => this.insertEnterpriseAdmin(trx, input, passwordHash));
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* CLI `admin create --if-none`: create an enterprise admin only when no active one exists. The
|
|
62
|
+
* check and the insert run in one transaction under the same advisory lock as {@link complete},
|
|
63
|
+
* so concurrent runs (and a concurrent web setup) create exactly one. Returns undefined when an
|
|
64
|
+
* active enterprise admin already exists; a taken login still throws `account.login_taken`.
|
|
65
|
+
*/
|
|
66
|
+
async createEnterpriseAdminIfNone(input) {
|
|
67
|
+
const passwordHash = await this.accounts.hashNewPassword(input.password);
|
|
68
|
+
return this.db.transaction().execute(async (trx) => {
|
|
69
|
+
await sql `SELECT pg_advisory_xact_lock(hashtext('capybara.setup'))`.execute(trx);
|
|
70
|
+
if ((await this.accounts.countEnterpriseAdmins(trx)) > 0)
|
|
71
|
+
return undefined;
|
|
72
|
+
return this.insertEnterpriseAdmin(trx, input, passwordHash);
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
async insertEnterpriseAdmin(trx, input, passwordHash) {
|
|
76
|
+
const account = await this.accounts.createLocal({
|
|
77
|
+
login: input.login,
|
|
78
|
+
password: input.password,
|
|
79
|
+
displayName: input.displayName,
|
|
80
|
+
enterpriseAdmin: true,
|
|
81
|
+
...(input.email !== undefined && { email: input.email }),
|
|
82
|
+
}, trx, passwordHash);
|
|
83
|
+
await audit(trx, {
|
|
84
|
+
action: "account.created",
|
|
85
|
+
target: account.id,
|
|
86
|
+
detail: { enterpriseAdmin: true, via: "cli" },
|
|
87
|
+
});
|
|
88
|
+
return account;
|
|
89
|
+
}
|
|
90
|
+
}
|