@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,234 @@
|
|
|
1
|
+
import { ApiError } from "../errors.js";
|
|
2
|
+
import { audit } from "../identity/audit.js";
|
|
3
|
+
import { lockOrg, lockOrgAndAuthorize } from "./org-lock.js";
|
|
4
|
+
/**
|
|
5
|
+
* 账号是不是某个组织的匿名访客(`org_anonymous_accounts`)。匿名访客没有登录方式,只能以 guest 身份
|
|
6
|
+
* 代表 IM 里未绑定的人:不能被授予别的角色、成为 owner、指派为 agent 负责人、加入别的组织或被移出。
|
|
7
|
+
*/
|
|
8
|
+
export async function isAnonymousGuest(db, accountId) {
|
|
9
|
+
const row = await db
|
|
10
|
+
.selectFrom("org_anonymous_accounts")
|
|
11
|
+
.select("account_id")
|
|
12
|
+
.where("account_id", "=", accountId)
|
|
13
|
+
.executeTakeFirst();
|
|
14
|
+
return row !== undefined;
|
|
15
|
+
}
|
|
16
|
+
/** 目标是匿名访客 → `409 member.anonymous_guest`。 */
|
|
17
|
+
export async function rejectAnonymousGuest(db, accountId) {
|
|
18
|
+
if (await isAnonymousGuest(db, accountId)) {
|
|
19
|
+
throw new ApiError("member.anonymous_guest", "The anonymous guest of an organization cannot be given a role, ownership or agents, invited or removed");
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* 成员服务。发起人只传账号 id,角色由服务在组织行锁内实时读取,调用方无法传入过期角色。所有写操作在事务内先 `SELECT … FROM orgs WHERE id = $1 FOR NO KEY UPDATE`,
|
|
24
|
+
* 把同一组织的成员变更串行化(多副本下两个 owner 并发互相降级也恰好剩一个 owner)。
|
|
25
|
+
* 框架无关,由调用方注入 db。
|
|
26
|
+
*/
|
|
27
|
+
export class MembersService {
|
|
28
|
+
db;
|
|
29
|
+
offboarding;
|
|
30
|
+
/** `offboarding`:移出与离开走的离职处理(内核用 `Kernel.identity.offboarding`)。 */
|
|
31
|
+
constructor(db, offboarding) {
|
|
32
|
+
this.db = db;
|
|
33
|
+
this.offboarding = offboarding;
|
|
34
|
+
}
|
|
35
|
+
async list(orgId) {
|
|
36
|
+
const rows = await this.db
|
|
37
|
+
.selectFrom("memberships")
|
|
38
|
+
.innerJoin("accounts", "accounts.id", "memberships.account_id")
|
|
39
|
+
.leftJoin("org_anonymous_accounts", (j) => j
|
|
40
|
+
.onRef("org_anonymous_accounts.org_id", "=", "memberships.org_id")
|
|
41
|
+
.onRef("org_anonymous_accounts.account_id", "=", "memberships.account_id"))
|
|
42
|
+
.select([
|
|
43
|
+
"accounts.id",
|
|
44
|
+
"accounts.display_name",
|
|
45
|
+
"accounts.email",
|
|
46
|
+
"memberships.role",
|
|
47
|
+
"memberships.created_at",
|
|
48
|
+
"org_anonymous_accounts.account_id as anonymous_id",
|
|
49
|
+
])
|
|
50
|
+
.where("memberships.org_id", "=", orgId)
|
|
51
|
+
.orderBy("memberships.created_at")
|
|
52
|
+
.orderBy("accounts.id")
|
|
53
|
+
.execute();
|
|
54
|
+
return rows.map((r) => ({
|
|
55
|
+
account: { id: r.id, displayName: r.display_name, email: r.email },
|
|
56
|
+
role: r.role,
|
|
57
|
+
joinedAt: r.created_at,
|
|
58
|
+
anonymous: r.anonymous_id !== null,
|
|
59
|
+
}));
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* 加入成员(邀请接受等,手动加入的唯一入口);已是成员 → `member.already_exists`;匿名访客 → `member.anonymous_guest`。
|
|
63
|
+
* 同一事务删除此人在该组织的通讯录排除(Ruling A20:手动重新加入后,通讯录同步恢复照常管理此人)。
|
|
64
|
+
* `actorAccountId` 仅用于审计。
|
|
65
|
+
*/
|
|
66
|
+
async add(orgId, accountId, role, actorAccountId, trx) {
|
|
67
|
+
const run = async (t) => {
|
|
68
|
+
await lockOrg(t, orgId);
|
|
69
|
+
await rejectAnonymousGuest(t, accountId);
|
|
70
|
+
if (await this.roleIn(t, orgId, accountId)) {
|
|
71
|
+
throw new ApiError("member.already_exists", "Account is already a member");
|
|
72
|
+
}
|
|
73
|
+
await t
|
|
74
|
+
.insertInto("memberships")
|
|
75
|
+
.values({ org_id: orgId, account_id: accountId, role })
|
|
76
|
+
.execute();
|
|
77
|
+
await t
|
|
78
|
+
.deleteFrom("directory_exclusions")
|
|
79
|
+
.where("org_id", "=", orgId)
|
|
80
|
+
.where("account_id", "=", accountId)
|
|
81
|
+
.execute();
|
|
82
|
+
await audit(t, {
|
|
83
|
+
actorAccountId,
|
|
84
|
+
orgId,
|
|
85
|
+
action: "org.member.added",
|
|
86
|
+
target: accountId,
|
|
87
|
+
detail: { role },
|
|
88
|
+
});
|
|
89
|
+
};
|
|
90
|
+
return trx ? run(trx) : this.db.transaction().execute(run);
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* 改角色:授予或撤销 owner、或改动一个 owner,只有 owner 能做(`org.owner_required`);
|
|
94
|
+
* admin 只能在 guest / member / admin 之间调整非 owner。操作后 owner 数为 0 → `org.last_owner`。
|
|
95
|
+
* 发起人的角色在组织行锁内实时重读(spec 3.6 R5):已不是成员或低于 admin → `forbidden`。
|
|
96
|
+
* 目标是匿名访客 → `member.anonymous_guest`。
|
|
97
|
+
*/
|
|
98
|
+
async changeRole(orgId, targetId, role, actorAccountId, actorTokenId) {
|
|
99
|
+
await this.db.transaction().execute(async (t) => {
|
|
100
|
+
const { role: actorRole } = await lockOrgAndAuthorize(t, orgId, actorAccountId, "org.members.manage");
|
|
101
|
+
const before = await this.requireMember(t, orgId, targetId);
|
|
102
|
+
await rejectAnonymousGuest(t, targetId);
|
|
103
|
+
if ((role === "owner" || before === "owner") && actorRole !== "owner") {
|
|
104
|
+
throw new ApiError("org.owner_required", "Only an owner can change owner roles");
|
|
105
|
+
}
|
|
106
|
+
if (before === role)
|
|
107
|
+
return;
|
|
108
|
+
await this.setRole(t, orgId, targetId, role);
|
|
109
|
+
await this.assertHasOwner(t, orgId);
|
|
110
|
+
await audit(t, {
|
|
111
|
+
actorAccountId,
|
|
112
|
+
...(actorTokenId !== undefined && { actorTokenId }),
|
|
113
|
+
orgId,
|
|
114
|
+
action: "org.member.role_changed",
|
|
115
|
+
target: targetId,
|
|
116
|
+
detail: { from: before, to: role },
|
|
117
|
+
});
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* 移出成员:权限规则同 changeRole(移除 owner 须发起人是 owner);移除最后一个 owner → `org.last_owner`。
|
|
122
|
+
* 走离职处理({@link Offboarding.offboard},原因 `removed`),与之同一事务;提交后写吊销标记、发布事件。
|
|
123
|
+
* 匿名访客不能移出(`member.anonymous_guest`;不再需要匿名访问时把渠道连接改回绑定策略)。
|
|
124
|
+
*/
|
|
125
|
+
async remove(orgId, targetId, actorAccountId, actorTokenId) {
|
|
126
|
+
const r = await this.db.transaction().execute(async (t) => {
|
|
127
|
+
const { role: actorRole } = await lockOrgAndAuthorize(t, orgId, actorAccountId, "org.members.manage");
|
|
128
|
+
const before = await this.requireMember(t, orgId, targetId);
|
|
129
|
+
await rejectAnonymousGuest(t, targetId);
|
|
130
|
+
if (before === "owner" && actorRole !== "owner") {
|
|
131
|
+
throw new ApiError("org.owner_required", "Only an owner can remove an owner");
|
|
132
|
+
}
|
|
133
|
+
const actor = { actorAccountId, ...(actorTokenId !== undefined && { actorTokenId }) };
|
|
134
|
+
const res = await this.offboarding.offboard(t, orgId, targetId, "removed", actor);
|
|
135
|
+
await audit(t, {
|
|
136
|
+
...actor,
|
|
137
|
+
orgId,
|
|
138
|
+
action: "org.member.removed",
|
|
139
|
+
target: targetId,
|
|
140
|
+
detail: { role: before },
|
|
141
|
+
});
|
|
142
|
+
return res;
|
|
143
|
+
});
|
|
144
|
+
await this.offboarding.afterCommit(r);
|
|
145
|
+
}
|
|
146
|
+
/** 主动离开:走离职处理(原因 `left`);最后一个 owner → `org.last_owner`。 */
|
|
147
|
+
async leave(orgId, accountId, actorTokenId) {
|
|
148
|
+
const r = await this.db.transaction().execute(async (t) => {
|
|
149
|
+
await lockOrg(t, orgId);
|
|
150
|
+
const before = await this.requireMember(t, orgId, accountId);
|
|
151
|
+
const actor = {
|
|
152
|
+
actorAccountId: accountId,
|
|
153
|
+
...(actorTokenId !== undefined && { actorTokenId }),
|
|
154
|
+
};
|
|
155
|
+
const res = await this.offboarding.offboard(t, orgId, accountId, "left", actor);
|
|
156
|
+
await audit(t, {
|
|
157
|
+
...actor,
|
|
158
|
+
orgId,
|
|
159
|
+
action: "org.member.left",
|
|
160
|
+
target: accountId,
|
|
161
|
+
detail: { role: before },
|
|
162
|
+
});
|
|
163
|
+
return res;
|
|
164
|
+
});
|
|
165
|
+
await this.offboarding.afterCommit(r);
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* 转让所有权:from 必须是 owner(`org.owner_required`);to 必须是成员(`member.not_found`)且不是匿名访客
|
|
169
|
+
* (`member.anonymous_guest`);to → owner、from → admin。
|
|
170
|
+
*/
|
|
171
|
+
async transferOwnership(orgId, fromAccountId, toAccountId, actorTokenId) {
|
|
172
|
+
if (fromAccountId === toAccountId) {
|
|
173
|
+
throw new ApiError("validation_failed", "Cannot transfer ownership to yourself");
|
|
174
|
+
}
|
|
175
|
+
await this.db.transaction().execute(async (t) => {
|
|
176
|
+
await lockOrg(t, orgId);
|
|
177
|
+
const fromRole = await this.roleIn(t, orgId, fromAccountId);
|
|
178
|
+
if (fromRole !== "owner") {
|
|
179
|
+
throw new ApiError("org.owner_required", "Only an owner can transfer ownership");
|
|
180
|
+
}
|
|
181
|
+
const toRole = await this.requireMember(t, orgId, toAccountId);
|
|
182
|
+
await rejectAnonymousGuest(t, toAccountId);
|
|
183
|
+
await this.setRole(t, orgId, toAccountId, "owner");
|
|
184
|
+
await this.setRole(t, orgId, fromAccountId, "admin");
|
|
185
|
+
await audit(t, {
|
|
186
|
+
actorAccountId: fromAccountId,
|
|
187
|
+
...(actorTokenId !== undefined && { actorTokenId }),
|
|
188
|
+
orgId,
|
|
189
|
+
action: "org.ownership_transferred",
|
|
190
|
+
target: toAccountId,
|
|
191
|
+
detail: {
|
|
192
|
+
from: fromAccountId,
|
|
193
|
+
to: toAccountId,
|
|
194
|
+
fromRole: { before: fromRole, after: "admin" },
|
|
195
|
+
toRole: { before: toRole, after: "owner" },
|
|
196
|
+
},
|
|
197
|
+
});
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
async roleIn(t, orgId, accountId) {
|
|
201
|
+
const r = await t
|
|
202
|
+
.selectFrom("memberships")
|
|
203
|
+
.select("role")
|
|
204
|
+
.where("org_id", "=", orgId)
|
|
205
|
+
.where("account_id", "=", accountId)
|
|
206
|
+
.executeTakeFirst();
|
|
207
|
+
return r?.role;
|
|
208
|
+
}
|
|
209
|
+
async requireMember(t, orgId, accountId) {
|
|
210
|
+
const role = await this.roleIn(t, orgId, accountId);
|
|
211
|
+
if (!role)
|
|
212
|
+
throw new ApiError("member.not_found", "Member not found");
|
|
213
|
+
return role;
|
|
214
|
+
}
|
|
215
|
+
async setRole(t, orgId, accountId, role) {
|
|
216
|
+
await t
|
|
217
|
+
.updateTable("memberships")
|
|
218
|
+
.set({ role, updated_at: new Date() })
|
|
219
|
+
.where("org_id", "=", orgId)
|
|
220
|
+
.where("account_id", "=", accountId)
|
|
221
|
+
.execute();
|
|
222
|
+
}
|
|
223
|
+
async assertHasOwner(t, orgId) {
|
|
224
|
+
const r = await t
|
|
225
|
+
.selectFrom("memberships")
|
|
226
|
+
.select((eb) => eb.fn.countAll().as("n"))
|
|
227
|
+
.where("org_id", "=", orgId)
|
|
228
|
+
.where("role", "=", "owner")
|
|
229
|
+
.executeTakeFirstOrThrow();
|
|
230
|
+
if (Number(r.n) === 0) {
|
|
231
|
+
throw new ApiError("org.last_owner", "An organization must keep at least one owner");
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
import type { Logger } from "@capybara-hq/plugin-sdk";
|
|
2
|
+
import type { Redis } from "ioredis";
|
|
3
|
+
import { type Transaction } from "kysely";
|
|
4
|
+
import type { EventLog } from "../conversations/event-log.js";
|
|
5
|
+
import type { KernelDatabase, KernelDb } from "../db/kernel-schema.js";
|
|
6
|
+
import type { SessionService } from "../identity/sessions.js";
|
|
7
|
+
import type { Maintenance } from "../runtime/maintenance.js";
|
|
8
|
+
import type { ApprovalsService } from "../tools/approvals.service.js";
|
|
9
|
+
import type { Credentials } from "../tools/credentials.js";
|
|
10
|
+
import type { QuestionsService } from "../tools/questions.service.js";
|
|
11
|
+
import type { OrgRole } from "./roles.js";
|
|
12
|
+
type Trx = Transaction<KernelDatabase>;
|
|
13
|
+
/** 离职原因:管理员移出、本人离开、通讯录同步判定离职。 */
|
|
14
|
+
export type OffboardReason = "removed" | "left" | "directory";
|
|
15
|
+
/** 一个进行中的运行。 */
|
|
16
|
+
export interface InFlightRun {
|
|
17
|
+
conversationId: string;
|
|
18
|
+
runId: string;
|
|
19
|
+
status: "queued" | "running" | "waiting";
|
|
20
|
+
}
|
|
21
|
+
/** 一次离职处理的结果;调用方提交事务后交给 {@link Offboarding.afterCommit}。 */
|
|
22
|
+
export interface OffboardResult {
|
|
23
|
+
role: OrgRole;
|
|
24
|
+
/** 在 PG 中被吊销的会话(提交后写 Redis 吊销标记)。 */
|
|
25
|
+
revokedSessionIds: string[];
|
|
26
|
+
/** 写了 cancelled 事件的会话 → 最大 seq(提交后发布)。 */
|
|
27
|
+
notify: Map<string, number>;
|
|
28
|
+
/** 此人在该组织进行中的运行(queued / running / waiting),提交后中止。 */
|
|
29
|
+
runs: InFlightRun[];
|
|
30
|
+
/** 负责的 agent 转交给的所有者;没有转交时为 null。 */
|
|
31
|
+
newOwnerId: string | null;
|
|
32
|
+
/** 此人在该组织的对话里还没销毁的沙箱(按对话 id),提交后交给 {@link OffboardingDeps.sandboxes} 销毁。 */
|
|
33
|
+
sandboxConversations: string[];
|
|
34
|
+
/** Conversations whose queued messages were deleted (`changed: queue` after commit). */
|
|
35
|
+
queueConversations: string[];
|
|
36
|
+
}
|
|
37
|
+
/** 运行中止:与会话中止接口(`POST .../abort`)同一套路径,`byAccountId = null` 表示系统发起。 */
|
|
38
|
+
export interface OffboardingRunControl {
|
|
39
|
+
abortWaiting(conversationId: string, runId: string, byAccountId: string | null): Promise<boolean>;
|
|
40
|
+
abortIfOrphaned(conversationId: string, runId: string, byAccountId: string | null): Promise<boolean>;
|
|
41
|
+
requestAbort(runId: string, byAccountId: string | null): Promise<void>;
|
|
42
|
+
}
|
|
43
|
+
/** 兜底扫描:维护队列任务名、job scheduler id(不含 `:`)、周期与每次条数。 */
|
|
44
|
+
export declare const OFFBOARD_SWEEP_JOB = "offboard-sweep";
|
|
45
|
+
export declare const OFFBOARD_SWEEP_SCHEDULER_ID = "offboard-sweep-every-10m";
|
|
46
|
+
export declare const OFFBOARD_SWEEP_EVERY_MS = 600000;
|
|
47
|
+
export declare const OFFBOARD_SWEEP_BATCH = 500;
|
|
48
|
+
/** 一次兜底扫描最多翻的页数(每页 {@link OFFBOARD_SWEEP_BATCH} 条),防止单次任务无限长。 */
|
|
49
|
+
export declare const OFFBOARD_SWEEP_MAX_PAGES = 20;
|
|
50
|
+
/** 已经广播中止的运行的标记保留时长(秒),长于扫描周期:期间扫描不再重复广播。 */
|
|
51
|
+
export declare const OFFBOARD_ABORT_MARK_TTL_SECONDS = 1800;
|
|
52
|
+
/** 「已请求中止」标记(Redis 键)。 */
|
|
53
|
+
export declare const offboardAbortKey: (runId: string) => string;
|
|
54
|
+
export interface OffboardingDeps {
|
|
55
|
+
credentials: Pick<Credentials, "clearAccount">;
|
|
56
|
+
approvals: Pick<ApprovalsService, "cancelPendingFor">;
|
|
57
|
+
questions: Pick<QuestionsService, "cancelPendingFor">;
|
|
58
|
+
/** 提交后写会话吊销标记(快速路径;鉴权以 PG `revoked_at` 为准)。 */
|
|
59
|
+
sessions?: Pick<SessionService, "markRevoked">;
|
|
60
|
+
/** 提交后发布 cancelled 事件。 */
|
|
61
|
+
eventLog?: Pick<EventLog, "notify"> & Partial<Pick<EventLog, "publishChanged">>;
|
|
62
|
+
/** 提交后中止此人在该组织进行中的运行(Ruling A7)。 */
|
|
63
|
+
runs?: OffboardingRunControl;
|
|
64
|
+
/** 兜底扫描用:读「发起人已不是成员」的进行中运行。 */
|
|
65
|
+
db?: KernelDb;
|
|
66
|
+
/** 给了就登记兜底扫描(每 10 分钟,worker 角色执行)。 */
|
|
67
|
+
maintenance?: Pick<Maintenance, "handle" | "schedule">;
|
|
68
|
+
log?: Pick<Logger, "warn">;
|
|
69
|
+
/** 记「已请求中止」标记(提交后的中止与兜底扫描都写;扫描跳过仍带标记的运行)。 */
|
|
70
|
+
redis?: Pick<Redis, "set" | "exists">;
|
|
71
|
+
/**
|
|
72
|
+
* 已加载、提供 `directory@1` 的插件名(Ruling A24:手动移出 / 离开时对其中在该组织启用的每一个写通讯录排除)。
|
|
73
|
+
* 不给时只按成员关系自身的 `directory:<插件>` 来源写。
|
|
74
|
+
*/
|
|
75
|
+
directoryPlugins?: () => string[];
|
|
76
|
+
/** 兜底扫描每页条数(默认 {@link OFFBOARD_SWEEP_BATCH},测试用)。 */
|
|
77
|
+
sweepBatch?: number;
|
|
78
|
+
/**
|
|
79
|
+
* 提交后销毁此人对话的沙箱(内核投递维护任务,由 worker 逐个 `SandboxService.destroyFor`)。不给时不销毁,
|
|
80
|
+
* 留给不活跃销毁扫描(`sandbox.limits.destroyAfterInactiveDays`)。
|
|
81
|
+
*/
|
|
82
|
+
sandboxes?: {
|
|
83
|
+
destroy(conversationIds: string[]): Promise<void>;
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* 成员离职(spec 3.3):管理员移出、本人离开与通讯录同步共用这一条路径,全部写入在调用方的同一个事务内,
|
|
88
|
+
* 要么都生效要么都不生效。Redis 吊销标记、事件发布与中止进行中的运行是提交后的尽力而为({@link afterCommit}),
|
|
89
|
+
* 漏掉的运行由兜底扫描({@link sweep}:发起人已不是该组织成员的进行中运行)中止。框架无关。
|
|
90
|
+
*
|
|
91
|
+
* 已接受的窄窗口:离职提交时正在进行的 OAuth token 刷新(`Credentials` 刷新锁内)可能在提交之后把此人的
|
|
92
|
+
* 个人凭据重新写回(upsert)。凭据只在此人以成员身份调用工具时使用,而其运行已被中止、成员关系已删除,
|
|
93
|
+
* 残留的凭据不会被使用;重新加入组织后会被新的连接覆盖。
|
|
94
|
+
*/
|
|
95
|
+
export declare class Offboarding {
|
|
96
|
+
private readonly deps;
|
|
97
|
+
constructor(deps: OffboardingDeps);
|
|
98
|
+
/**
|
|
99
|
+
* 在事务 `t` 内(调用方应已锁组织行——顺序:组织行 → 成员关系,并完成「最后一个 owner」等前置检查):
|
|
100
|
+
* 1. 删除成员关系(非成员 → `member.not_found`;删后组织没有 owner → `org.last_owner`),清空指向该组织的会话当前组织;
|
|
101
|
+
* 2. 吊销该账号**全部**会话与个人令牌(令牌与会话是账号级的,无法只吊销「该组织下」的,按保守处理);
|
|
102
|
+
* 3. 删除其在该组织所有连接器上的个人凭据;
|
|
103
|
+
* 4. 取消其作为处理人的 pending 审批与提问(写 cancelled 事件),记下此人在该组织进行中的运行(提交后中止);
|
|
104
|
+
* 5. 其负责的该组织 agent 转给组织所有者(最早加入的 owner)并置 `needs_reassignment = true`;
|
|
105
|
+
* 6. 归档其在该组织各渠道连接上的 IM 话题行(重新加入后在 IM 里开始新的对话,不接着旧会话),
|
|
106
|
+
* 删除其在该组织的「以后都允许」工具授权(`tool_grants`);
|
|
107
|
+
* 7. 手动移出或本人离开(不是同步判定离职)时写通讯录排除(Ruling A20 / A24):对该组织启用的每个通讯录插件,
|
|
108
|
+
* 以及成员关系自身的 `directory:<插件>` 来源,不论此人当初是不是由通讯录加入(手动重新加入后再被移出也不会被同步加回);
|
|
109
|
+
* 同步不再把此人加回,直到有人手动重新加入({@link MembersService.add} 删除排除);
|
|
110
|
+
* 8. 审计 `org.member.offboarded`;
|
|
111
|
+
* 9. 记下此人在该组织对话里还没销毁的沙箱(提交后销毁,尽力而为)。
|
|
112
|
+
*/
|
|
113
|
+
offboard(t: Trx, orgId: string, accountId: string, reason: OffboardReason, actor?: {
|
|
114
|
+
actorAccountId?: string;
|
|
115
|
+
actorTokenId?: string;
|
|
116
|
+
}): Promise<OffboardResult>;
|
|
117
|
+
/** 要写排除的通讯录插件:该组织启用的已加载通讯录插件 ∪ 成员关系自身的 `directory:<插件>` 来源,去重排序。 */
|
|
118
|
+
private exclusionPlugins;
|
|
119
|
+
/**
|
|
120
|
+
* 提交之后:写会话吊销标记、发布 cancelled 事件、中止此人在该组织进行中的运行、投递销毁其对话沙箱的任务。
|
|
121
|
+
* 每步失败只记 warn。
|
|
122
|
+
*/
|
|
123
|
+
afterCommit(r: OffboardResult): Promise<void>;
|
|
124
|
+
/**
|
|
125
|
+
* 中止一个运行,顺序同会话中止接口:waiting → 直接取消等待并写终态;孤儿 → 直接写终态;
|
|
126
|
+
* 否则经 Redis 广播中止(运行所在副本收到后结束;尚未开始的运行开始时补查中止标记)。失败只记 warn。
|
|
127
|
+
* 不像会话中止那样随后起新一轮运行:离职者的待处理消息不再处理。
|
|
128
|
+
*/
|
|
129
|
+
private stopRun;
|
|
130
|
+
/**
|
|
131
|
+
* 兜底扫描(维护队列每 10 分钟):进行中、且发起人已不是该会话所属组织成员的运行 → 中止
|
|
132
|
+
* (提交后的中止没做成时,如进程崩溃)。按 `(runs.created_at, runs.id)` 键集分页翻完(每页 500 条,
|
|
133
|
+
* 至多 20 页):经广播中止、尚未真正结束的运行仍是进行中,若只取前 500 条,超过 500 条卡住的运行会
|
|
134
|
+
* 一直占满这一页,后面的永远轮不到。已广播中止、仍带 `capk:offboard-abort:<runId>` 标记(30 分钟)的运行跳过,
|
|
135
|
+
* 不每轮重复广播;标记过期仍未结束的再处理一次。返回本次处理(未跳过)的运行数。
|
|
136
|
+
* 现任成员(含匿名访客这样的 guest 成员)发起的运行不受影响。
|
|
137
|
+
*/
|
|
138
|
+
sweep(): Promise<number>;
|
|
139
|
+
private recentlyAborted;
|
|
140
|
+
}
|
|
141
|
+
export {};
|