@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,86 @@
|
|
|
1
|
+
import { type ExtensionPointRef, type Logger, type ModelInfo, type ModelProvider, type ModelProviderV1 } from "@capybara-hq/plugin-sdk";
|
|
2
|
+
import type { Redis } from "ioredis";
|
|
3
|
+
import type { ModelRef } from "../agents/definition.js";
|
|
4
|
+
import { ApiError } from "../errors.js";
|
|
5
|
+
/** 单个供应商 `listModels()` 的时限(毫秒):一个卡住的供应商不拖住整个列表与解析。 */
|
|
6
|
+
export declare const LIST_MODELS_TIMEOUT_MS = 10000;
|
|
7
|
+
/**
|
|
8
|
+
* 列表视图(后台模型页、组织模型页)里列模型失败的供应商在这么多秒内直接标 error、不再请求(Redis,多副本共享)。
|
|
9
|
+
* 只用于列表;`resolve`(运行时)照常每次请求,失败由降级梯子重试。
|
|
10
|
+
*/
|
|
11
|
+
export declare const LIST_FAILURE_TTL_SECONDS = 15;
|
|
12
|
+
/** The host view the registry needs: a subset of `ExtensionHost.list` (version and digest optional, for test doubles). */
|
|
13
|
+
export interface ProviderHost {
|
|
14
|
+
list(extensionPointName: string): {
|
|
15
|
+
plugin: string;
|
|
16
|
+
capability: ExtensionPointRef;
|
|
17
|
+
impl: unknown;
|
|
18
|
+
version?: string;
|
|
19
|
+
configHash?: string;
|
|
20
|
+
}[];
|
|
21
|
+
}
|
|
22
|
+
/** 一个供应商在后台的视图:供应商名即插件名;`status: "error"` 时 `models` 为空、`error` 为内核的说明。 */
|
|
23
|
+
export interface ProviderStatus {
|
|
24
|
+
provider: string;
|
|
25
|
+
plugin: string;
|
|
26
|
+
status: "ok" | "error";
|
|
27
|
+
error?: string;
|
|
28
|
+
models: ModelInfo[];
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* 供应商的 `listModels()` 失败(上游不可用等)。仍是 `agent.model_unavailable`,HTTP 调用方照常
|
|
32
|
+
* 得到该错误码;运行时(`runModelStep`)据此类型把它当作可重试的失败交给降级梯子,
|
|
33
|
+
* 与「供应商未安装 / 模型不存在 / 参数声明不合规」(不可重试)区分开。
|
|
34
|
+
*/
|
|
35
|
+
export declare class ProviderListError extends ApiError {
|
|
36
|
+
readonly provider: string;
|
|
37
|
+
constructor(provider: string, cause: unknown);
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* 把 `model-provider@1` 实现包成 `@2`:
|
|
41
|
+
* - `listModels`:`parameters` 由 `capabilities.effort` 推导(为真时只有 effort 旋钮,否则为空);
|
|
42
|
+
* - `stream`:`params.effort` 映射为 `req.effort`,其余参数丢弃(`@1` 没有对应字段);
|
|
43
|
+
* 没有 `params.effort` 时保留请求自带的 `effort`。
|
|
44
|
+
*/
|
|
45
|
+
export declare function adaptModelProviderV1(impl: ModelProviderV1): ModelProvider;
|
|
46
|
+
/**
|
|
47
|
+
* 模型供应商注册表:供应商即提供 `model-provider` 能力的插件(以插件名为供应商名)。
|
|
48
|
+
* 同时支持 `model-provider@1`(经 {@link adaptModelProviderV1} 适配)与 `@2`;
|
|
49
|
+
* 同一插件两者都提供时用 `@2`。`@2` 的 `listModels()` 结果先过 `assertValidDeclarations`,
|
|
50
|
+
* 不合规的供应商不可用(不可重试)。
|
|
51
|
+
* 每个供应商的模型列表(`@2` 形状)缓存在 Redis `capk:models:<provider>:v<主版本>:<插件版本>:<部署配置摘要>`(EX 600),不放进程内存,
|
|
52
|
+
* 多副本共享同一份缓存。
|
|
53
|
+
*/
|
|
54
|
+
export declare class ProviderRegistry {
|
|
55
|
+
private readonly host;
|
|
56
|
+
private readonly kv;
|
|
57
|
+
private readonly log?;
|
|
58
|
+
private readonly opts;
|
|
59
|
+
constructor(host: ProviderHost, kv: Redis, log?: Pick<Logger, "warn"> | undefined, opts?: {
|
|
60
|
+
listTimeoutMs?: number;
|
|
61
|
+
});
|
|
62
|
+
/** `listModels()` 加时限(到时按失败处理,供应商的调用留在后台、结果丢弃)。 */
|
|
63
|
+
private listModelsWithTimeout;
|
|
64
|
+
/** 每个插件取一个实现(`@2` 优先),按插件首次出现的顺序;不支持的主版本记 warn 后忽略。 */
|
|
65
|
+
private providers;
|
|
66
|
+
private models;
|
|
67
|
+
/** 每个已安装供应商及其模型(按插件加载顺序);列模型失败或声明不合规的供应商跳过并记 warn。 */
|
|
68
|
+
list(): Promise<{
|
|
69
|
+
provider: string;
|
|
70
|
+
models: ModelInfo[];
|
|
71
|
+
}[]>;
|
|
72
|
+
/**
|
|
73
|
+
* 每个已安装供应商及其状态(按插件加载顺序,后台用):列模型失败(含超过 {@link LIST_MODELS_TIMEOUT_MS})或声明
|
|
74
|
+
* 不合规的标 `error`、`models` 为空,不影响其他供应商;列模型失败的在 {@link LIST_FAILURE_TTL_SECONDS} 秒内不再请求。`error` 只是内核自己的英文说明(不透出上游错误原文,原文记 warn 日志)。
|
|
75
|
+
*/
|
|
76
|
+
listWithStatus(): Promise<ProviderStatus[]>;
|
|
77
|
+
/**
|
|
78
|
+
* 解析模型引用,返回 `@2` 形状的供应商实现(`@1` 已适配)与模型信息。
|
|
79
|
+
* 供应商未安装、模型不存在或参数声明不合规 → `agent.model_unavailable`;
|
|
80
|
+
* 供应商 `listModels()` 失败 → `ProviderListError`(同一错误码,运行时视为可重试)。
|
|
81
|
+
*/
|
|
82
|
+
resolve(ref: ModelRef): Promise<{
|
|
83
|
+
provider: ModelProvider;
|
|
84
|
+
info: ModelInfo;
|
|
85
|
+
}>;
|
|
86
|
+
}
|
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
import { assertValidDeclarations, EFFORT_VALUES, parseExtensionPoint, } from "@capybara-hq/plugin-sdk";
|
|
2
|
+
import { ApiError } from "../errors.js";
|
|
3
|
+
/** 供应商模型列表在 Redis 中的缓存时长(秒)。 */
|
|
4
|
+
const MODELS_TTL_SECONDS = 600;
|
|
5
|
+
/** 单个供应商 `listModels()` 的时限(毫秒):一个卡住的供应商不拖住整个列表与解析。 */
|
|
6
|
+
export const LIST_MODELS_TIMEOUT_MS = 10_000;
|
|
7
|
+
/**
|
|
8
|
+
* 列表视图(后台模型页、组织模型页)里列模型失败的供应商在这么多秒内直接标 error、不再请求(Redis,多副本共享)。
|
|
9
|
+
* 只用于列表;`resolve`(运行时)照常每次请求,失败由降级梯子重试。
|
|
10
|
+
*/
|
|
11
|
+
export const LIST_FAILURE_TTL_SECONDS = 15;
|
|
12
|
+
/**
|
|
13
|
+
* 键带供应商的契约主版本:插件从 `@1` 升级到 `@2` 后不会读到 `@1`(经适配)时写入的列表
|
|
14
|
+
* (两者都是 `@2` 形状,按形状分辨不出来)。
|
|
15
|
+
* 键还带插件版本与部署配置摘要:插件升级(参数声明可能变了)或改部署配置(如增删模型)后,
|
|
16
|
+
* 各副本立即按新声明校验,不必等旧缓存 TTL 到期。摘要只是哈希,不含配置明文(secret 不进键)。
|
|
17
|
+
* 旧键按 TTL 自然过期。没有版本 / 摘要的条目(测试替身)用 `-` 占位。
|
|
18
|
+
*/
|
|
19
|
+
const modelsKey = (p) => `capk:models:${p.plugin}:v${p.major}:${p.version ?? "-"}:${p.configHash ?? "-"}`;
|
|
20
|
+
/** 列表视图的失败标记({@link LIST_FAILURE_TTL_SECONDS}),与模型列表同样按版本与配置摘要区分。 */
|
|
21
|
+
const listFailedKey = (p) => `capk:models-failed:${p.plugin}:v${p.major}:${p.version ?? "-"}:${p.configHash ?? "-"}`;
|
|
22
|
+
const CAPABILITY = "model-provider";
|
|
23
|
+
/**
|
|
24
|
+
* 供应商的 `listModels()` 失败(上游不可用等)。仍是 `agent.model_unavailable`,HTTP 调用方照常
|
|
25
|
+
* 得到该错误码;运行时(`runModelStep`)据此类型把它当作可重试的失败交给降级梯子,
|
|
26
|
+
* 与「供应商未安装 / 模型不存在 / 参数声明不合规」(不可重试)区分开。
|
|
27
|
+
*/
|
|
28
|
+
export class ProviderListError extends ApiError {
|
|
29
|
+
provider;
|
|
30
|
+
constructor(provider, cause) {
|
|
31
|
+
super("agent.model_unavailable", `Model provider ${provider} failed to list its models`);
|
|
32
|
+
this.provider = provider;
|
|
33
|
+
this.name = "ProviderListError";
|
|
34
|
+
this.cause = cause;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* `@1` 适配层为 `capabilities.effort` 为真的模型补的 effort 旋钮:五档,不给默认值
|
|
39
|
+
* (各家 API 的默认值不同;给了默认值会让未设置 effort 的 agent 每次都静默发送它)。
|
|
40
|
+
*/
|
|
41
|
+
const V1_EFFORT_KNOB = {
|
|
42
|
+
key: "effort",
|
|
43
|
+
standard: "effort",
|
|
44
|
+
schema: { type: "string", enum: [...EFFORT_VALUES] },
|
|
45
|
+
label: { zh: "思考深度", en: "Effort" },
|
|
46
|
+
};
|
|
47
|
+
/**
|
|
48
|
+
* 把 `model-provider@1` 实现包成 `@2`:
|
|
49
|
+
* - `listModels`:`parameters` 由 `capabilities.effort` 推导(为真时只有 effort 旋钮,否则为空);
|
|
50
|
+
* - `stream`:`params.effort` 映射为 `req.effort`,其余参数丢弃(`@1` 没有对应字段);
|
|
51
|
+
* 没有 `params.effort` 时保留请求自带的 `effort`。
|
|
52
|
+
*/
|
|
53
|
+
export function adaptModelProviderV1(impl) {
|
|
54
|
+
return {
|
|
55
|
+
async listModels() {
|
|
56
|
+
const models = await impl.listModels();
|
|
57
|
+
return models.map((m) => ({
|
|
58
|
+
...m,
|
|
59
|
+
parameters: m.capabilities.effort ? [structuredClone(V1_EFFORT_KNOB)] : [],
|
|
60
|
+
}));
|
|
61
|
+
},
|
|
62
|
+
stream(req, opts) {
|
|
63
|
+
// `@1` 没有 toolChoice:不传(旧插件按自己的默认处理)
|
|
64
|
+
const { params, toolChoice: _toolChoice, ...rest } = req;
|
|
65
|
+
const out = rest;
|
|
66
|
+
const effort = params?.effort;
|
|
67
|
+
if (typeof effort === "string" && EFFORT_VALUES.includes(effort)) {
|
|
68
|
+
out.effort = effort;
|
|
69
|
+
}
|
|
70
|
+
return impl.stream(out, opts);
|
|
71
|
+
},
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
/** 缓存里的条目必须是 `@2` 形状(旧版本内核写入的 `@1` 原始结果没有 `parameters`,视为未命中)。 */
|
|
75
|
+
const isCurrentShape = (models) => Array.isArray(models) &&
|
|
76
|
+
models.every((m) => typeof m === "object" && m !== null && Array.isArray(m.parameters));
|
|
77
|
+
/**
|
|
78
|
+
* 模型供应商注册表:供应商即提供 `model-provider` 能力的插件(以插件名为供应商名)。
|
|
79
|
+
* 同时支持 `model-provider@1`(经 {@link adaptModelProviderV1} 适配)与 `@2`;
|
|
80
|
+
* 同一插件两者都提供时用 `@2`。`@2` 的 `listModels()` 结果先过 `assertValidDeclarations`,
|
|
81
|
+
* 不合规的供应商不可用(不可重试)。
|
|
82
|
+
* 每个供应商的模型列表(`@2` 形状)缓存在 Redis `capk:models:<provider>:v<主版本>:<插件版本>:<部署配置摘要>`(EX 600),不放进程内存,
|
|
83
|
+
* 多副本共享同一份缓存。
|
|
84
|
+
*/
|
|
85
|
+
export class ProviderRegistry {
|
|
86
|
+
host;
|
|
87
|
+
kv;
|
|
88
|
+
log;
|
|
89
|
+
opts;
|
|
90
|
+
constructor(host, kv, log, opts = {}) {
|
|
91
|
+
this.host = host;
|
|
92
|
+
this.kv = kv;
|
|
93
|
+
this.log = log;
|
|
94
|
+
this.opts = opts;
|
|
95
|
+
}
|
|
96
|
+
/** `listModels()` 加时限(到时按失败处理,供应商的调用留在后台、结果丢弃)。 */
|
|
97
|
+
async listModelsWithTimeout(impl) {
|
|
98
|
+
const ms = this.opts.listTimeoutMs ?? LIST_MODELS_TIMEOUT_MS;
|
|
99
|
+
let timer;
|
|
100
|
+
const call = Promise.resolve().then(() => impl.listModels());
|
|
101
|
+
call.catch(() => { });
|
|
102
|
+
try {
|
|
103
|
+
return await Promise.race([
|
|
104
|
+
call,
|
|
105
|
+
new Promise((_, reject) => {
|
|
106
|
+
timer = setTimeout(() => reject(new Error(`listModels timed out after ${ms}ms`)), ms);
|
|
107
|
+
}),
|
|
108
|
+
]);
|
|
109
|
+
}
|
|
110
|
+
finally {
|
|
111
|
+
clearTimeout(timer);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
/** 每个插件取一个实现(`@2` 优先),按插件首次出现的顺序;不支持的主版本记 warn 后忽略。 */
|
|
115
|
+
providers() {
|
|
116
|
+
const chosen = new Map();
|
|
117
|
+
for (const p of this.host.list(CAPABILITY)) {
|
|
118
|
+
const { major } = parseExtensionPoint(p.capability);
|
|
119
|
+
if (major !== 1 && major !== 2) {
|
|
120
|
+
this.log?.warn("unsupported model-provider major version; ignored", {
|
|
121
|
+
provider: p.plugin,
|
|
122
|
+
capability: p.capability,
|
|
123
|
+
});
|
|
124
|
+
continue;
|
|
125
|
+
}
|
|
126
|
+
const prev = chosen.get(p.plugin);
|
|
127
|
+
if (!prev || major > prev.major) {
|
|
128
|
+
chosen.set(p.plugin, {
|
|
129
|
+
major,
|
|
130
|
+
impl: p.impl,
|
|
131
|
+
version: p.version,
|
|
132
|
+
configHash: p.configHash,
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
return [...chosen].map(([plugin, { major, impl, version, configHash }]) => ({
|
|
137
|
+
plugin,
|
|
138
|
+
major,
|
|
139
|
+
version,
|
|
140
|
+
configHash,
|
|
141
|
+
impl: major === 2 ? impl : adaptModelProviderV1(impl),
|
|
142
|
+
}));
|
|
143
|
+
}
|
|
144
|
+
async models(p) {
|
|
145
|
+
const { plugin: provider, major, impl } = p;
|
|
146
|
+
const key = modelsKey(p);
|
|
147
|
+
const cached = await this.kv.get(key);
|
|
148
|
+
if (cached !== null) {
|
|
149
|
+
const parsed = JSON.parse(cached);
|
|
150
|
+
if (isCurrentShape(parsed))
|
|
151
|
+
return parsed;
|
|
152
|
+
}
|
|
153
|
+
let models;
|
|
154
|
+
try {
|
|
155
|
+
models = await this.listModelsWithTimeout(impl);
|
|
156
|
+
}
|
|
157
|
+
catch (err) {
|
|
158
|
+
throw new ProviderListError(provider, err);
|
|
159
|
+
}
|
|
160
|
+
if (major === 2) {
|
|
161
|
+
try {
|
|
162
|
+
for (const m of models)
|
|
163
|
+
assertValidDeclarations(provider, m.parameters);
|
|
164
|
+
}
|
|
165
|
+
catch (err) {
|
|
166
|
+
const e = new ApiError("agent.model_unavailable", `Model provider ${provider} declared invalid model parameters`);
|
|
167
|
+
e.cause = err;
|
|
168
|
+
throw e;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
await this.kv.set(key, JSON.stringify(models), "EX", MODELS_TTL_SECONDS);
|
|
172
|
+
return models;
|
|
173
|
+
}
|
|
174
|
+
/** 每个已安装供应商及其模型(按插件加载顺序);列模型失败或声明不合规的供应商跳过并记 warn。 */
|
|
175
|
+
async list() {
|
|
176
|
+
return (await this.listWithStatus()).flatMap((p) => p.status === "ok" ? [{ provider: p.provider, models: p.models }] : []);
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* 每个已安装供应商及其状态(按插件加载顺序,后台用):列模型失败(含超过 {@link LIST_MODELS_TIMEOUT_MS})或声明
|
|
180
|
+
* 不合规的标 `error`、`models` 为空,不影响其他供应商;列模型失败的在 {@link LIST_FAILURE_TTL_SECONDS} 秒内不再请求。`error` 只是内核自己的英文说明(不透出上游错误原文,原文记 warn 日志)。
|
|
181
|
+
*/
|
|
182
|
+
async listWithStatus() {
|
|
183
|
+
const providers = this.providers();
|
|
184
|
+
const settled = await Promise.allSettled(providers.map(async (p) => {
|
|
185
|
+
// 刚失败过的供应商:短时间内直接标 error,不再等它(每个供应商另有时限)
|
|
186
|
+
if ((await this.kv.get(listFailedKey(p))) !== null) {
|
|
187
|
+
throw new ProviderListError(p.plugin, new Error("listModels failed recently"));
|
|
188
|
+
}
|
|
189
|
+
try {
|
|
190
|
+
return await this.models(p);
|
|
191
|
+
}
|
|
192
|
+
catch (err) {
|
|
193
|
+
if (err instanceof ProviderListError) {
|
|
194
|
+
await this.kv.set(listFailedKey(p), "1", "EX", LIST_FAILURE_TTL_SECONDS);
|
|
195
|
+
}
|
|
196
|
+
throw err;
|
|
197
|
+
}
|
|
198
|
+
}));
|
|
199
|
+
return settled.map((r, i) => {
|
|
200
|
+
const provider = providers[i].plugin;
|
|
201
|
+
if (r.status === "fulfilled") {
|
|
202
|
+
return { provider, plugin: provider, status: "ok", models: r.value };
|
|
203
|
+
}
|
|
204
|
+
this.log?.warn("model provider listModels failed; skipped", { provider, err: r.reason });
|
|
205
|
+
const error = r.reason instanceof ApiError
|
|
206
|
+
? r.reason.message
|
|
207
|
+
: `Model provider ${provider} failed to list its models`;
|
|
208
|
+
return { provider, plugin: provider, status: "error", error, models: [] };
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* 解析模型引用,返回 `@2` 形状的供应商实现(`@1` 已适配)与模型信息。
|
|
213
|
+
* 供应商未安装、模型不存在或参数声明不合规 → `agent.model_unavailable`;
|
|
214
|
+
* 供应商 `listModels()` 失败 → `ProviderListError`(同一错误码,运行时视为可重试)。
|
|
215
|
+
*/
|
|
216
|
+
async resolve(ref) {
|
|
217
|
+
const p = this.providers().find((x) => x.plugin === ref.provider);
|
|
218
|
+
const info = p && (await this.models(p)).find((m) => m.id === ref.model);
|
|
219
|
+
if (!p || !info) {
|
|
220
|
+
throw new ApiError("agent.model_unavailable", `Model ${ref.provider}/${ref.model} is not available`);
|
|
221
|
+
}
|
|
222
|
+
return { provider: p.impl, info };
|
|
223
|
+
}
|
|
224
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { Redis } from "ioredis";
|
|
2
|
+
import type { KernelConfig } from "../config/schema.js";
|
|
3
|
+
import type { SettingsService } from "../identity/settings.js";
|
|
4
|
+
/** 组织配额租约的默认时长(毫秒):持有方每 `leaseMs / 3` 续租一次。 */
|
|
5
|
+
export declare const ORG_QUOTA_LEASE_MS = 60000;
|
|
6
|
+
/** 运行配额的键前缀(`capk:org-runs:<orgId>`);评测运行用 {@link EVAL_QUOTA_PREFIX}。 */
|
|
7
|
+
export declare const RUN_QUOTA_PREFIX = "capk:org-runs:";
|
|
8
|
+
/** 评测运行的组织并发配额(C7):`capk:org-evals:<orgId>`,成员为评测任务的 jobId。 */
|
|
9
|
+
export declare const EVAL_QUOTA_PREFIX = "capk:org-evals:";
|
|
10
|
+
/**
|
|
11
|
+
* 组织级运行并发配额(spec 4.3):Redis ZSET `<keyPrefix><orgId>`(默认 `capk:org-runs:<orgId>`),
|
|
12
|
+
* 成员 runId(评测为 jobId)、分数为租约到期时间。
|
|
13
|
+
* 持有方崩溃时不 `leave`,成员在租约到期后被下一次 `tryEnter` 清理,名额不泄漏。
|
|
14
|
+
*/
|
|
15
|
+
export declare class OrgQuota {
|
|
16
|
+
private readonly redis;
|
|
17
|
+
private readonly keyPrefix;
|
|
18
|
+
constructor(redis: Redis, keyPrefix?: string);
|
|
19
|
+
private key;
|
|
20
|
+
tryEnter(orgId: string, runId: string, limit: number, leaseMs?: number): Promise<boolean>;
|
|
21
|
+
/** 续期;成员已过期被清理 → false。 */
|
|
22
|
+
renew(orgId: string, runId: string, leaseMs?: number): Promise<boolean>;
|
|
23
|
+
leave(orgId: string, runId: string): Promise<void>;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* 组织的运行并发上限:部署设置 `runConcurrencyOverrides[orgId]`,没有则用 `runtime.orgConcurrency`
|
|
27
|
+
* (热更新字段,每次经 `config()` 读当前值)。
|
|
28
|
+
*/
|
|
29
|
+
export declare function orgRunLimit(settings: Pick<SettingsService, "get">, config: () => KernelConfig, orgId: string): Promise<number>;
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/** 组织配额租约的默认时长(毫秒):持有方每 `leaseMs / 3` 续租一次。 */
|
|
2
|
+
export const ORG_QUOTA_LEASE_MS = 60_000;
|
|
3
|
+
/** 运行配额的键前缀(`capk:org-runs:<orgId>`);评测运行用 {@link EVAL_QUOTA_PREFIX}。 */
|
|
4
|
+
export const RUN_QUOTA_PREFIX = "capk:org-runs:";
|
|
5
|
+
/** 评测运行的组织并发配额(C7):`capk:org-evals:<orgId>`,成员为评测任务的 jobId。 */
|
|
6
|
+
export const EVAL_QUOTA_PREFIX = "capk:org-evals:";
|
|
7
|
+
/** 毫秒级当前时间取 Redis 服务器时钟,各副本一致。 */
|
|
8
|
+
const NOW = `
|
|
9
|
+
local t = redis.call('TIME')
|
|
10
|
+
local now = tonumber(t[1]) * 1000 + math.floor(tonumber(t[2]) / 1000)
|
|
11
|
+
`;
|
|
12
|
+
/**
|
|
13
|
+
* 先清理过期成员;已在集合中(同一 runId 再次进入)→ 续期;否则计数小于上限才加入。
|
|
14
|
+
* 成员为 runId,分数为租约到期时间(毫秒)。整个键 PEXPIRE leaseMs*2。
|
|
15
|
+
*/
|
|
16
|
+
const TRY_ENTER = `${NOW}
|
|
17
|
+
local lease = tonumber(ARGV[3])
|
|
18
|
+
redis.call('ZREMRANGEBYSCORE', KEYS[1], '-inf', now)
|
|
19
|
+
if redis.call('ZSCORE', KEYS[1], ARGV[1]) or redis.call('ZCARD', KEYS[1]) < tonumber(ARGV[2]) then
|
|
20
|
+
redis.call('ZADD', KEYS[1], now + lease, ARGV[1])
|
|
21
|
+
redis.call('PEXPIRE', KEYS[1], lease * 2)
|
|
22
|
+
return 1
|
|
23
|
+
end
|
|
24
|
+
return 0
|
|
25
|
+
`;
|
|
26
|
+
/** 成员仍在(未过期)才续期。 */
|
|
27
|
+
const RENEW = `${NOW}
|
|
28
|
+
local lease = tonumber(ARGV[2])
|
|
29
|
+
redis.call('ZREMRANGEBYSCORE', KEYS[1], '-inf', now)
|
|
30
|
+
if redis.call('ZSCORE', KEYS[1], ARGV[1]) then
|
|
31
|
+
redis.call('ZADD', KEYS[1], now + lease, ARGV[1])
|
|
32
|
+
redis.call('PEXPIRE', KEYS[1], lease * 2)
|
|
33
|
+
return 1
|
|
34
|
+
end
|
|
35
|
+
return 0
|
|
36
|
+
`;
|
|
37
|
+
/**
|
|
38
|
+
* 组织级运行并发配额(spec 4.3):Redis ZSET `<keyPrefix><orgId>`(默认 `capk:org-runs:<orgId>`),
|
|
39
|
+
* 成员 runId(评测为 jobId)、分数为租约到期时间。
|
|
40
|
+
* 持有方崩溃时不 `leave`,成员在租约到期后被下一次 `tryEnter` 清理,名额不泄漏。
|
|
41
|
+
*/
|
|
42
|
+
export class OrgQuota {
|
|
43
|
+
redis;
|
|
44
|
+
keyPrefix;
|
|
45
|
+
constructor(redis, keyPrefix = RUN_QUOTA_PREFIX) {
|
|
46
|
+
this.redis = redis;
|
|
47
|
+
this.keyPrefix = keyPrefix;
|
|
48
|
+
}
|
|
49
|
+
key(orgId) {
|
|
50
|
+
return `${this.keyPrefix}${orgId}`;
|
|
51
|
+
}
|
|
52
|
+
async tryEnter(orgId, runId, limit, leaseMs = ORG_QUOTA_LEASE_MS) {
|
|
53
|
+
return (Number(await this.redis.eval(TRY_ENTER, 1, this.key(orgId), runId, limit, leaseMs)) === 1);
|
|
54
|
+
}
|
|
55
|
+
/** 续期;成员已过期被清理 → false。 */
|
|
56
|
+
async renew(orgId, runId, leaseMs = ORG_QUOTA_LEASE_MS) {
|
|
57
|
+
return Number(await this.redis.eval(RENEW, 1, this.key(orgId), runId, leaseMs)) === 1;
|
|
58
|
+
}
|
|
59
|
+
async leave(orgId, runId) {
|
|
60
|
+
await this.redis.zrem(this.key(orgId), runId);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* 组织的运行并发上限:部署设置 `runConcurrencyOverrides[orgId]`,没有则用 `runtime.orgConcurrency`
|
|
65
|
+
* (热更新字段,每次经 `config()` 读当前值)。
|
|
66
|
+
*/
|
|
67
|
+
export async function orgRunLimit(settings, config, orgId) {
|
|
68
|
+
const { runConcurrencyOverrides } = await settings.get();
|
|
69
|
+
return runConcurrencyOverrides[orgId] ?? config().runtime.orgConcurrency;
|
|
70
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { type Transaction } from "kysely";
|
|
2
|
+
import type { AppendEvent, EventLog } from "../conversations/event-log.js";
|
|
3
|
+
import type { KernelDatabase, KernelDb } from "../db/kernel-schema.js";
|
|
4
|
+
type KernelTrx = Transaction<KernelDatabase>;
|
|
5
|
+
/** 运行的终态。 */
|
|
6
|
+
export type TerminalStatus = "completed" | "failed" | "aborted";
|
|
7
|
+
export declare const TERMINAL_STATUSES: ReadonlySet<string>;
|
|
8
|
+
export interface FinishRunArgs {
|
|
9
|
+
conversationId: string;
|
|
10
|
+
runId: string;
|
|
11
|
+
status: TerminalStatus;
|
|
12
|
+
/** loop 吸收到的位置;null 表示未知(仍至少推进到触发消息)。 */
|
|
13
|
+
consumed: number | null;
|
|
14
|
+
/** 终态事件(run_finished / run_failed / run_aborted),幂等键为 `<type>:<runId>`。 */
|
|
15
|
+
event: Pick<AppendEvent, "type" | "payload">;
|
|
16
|
+
/**
|
|
17
|
+
* consumed_seq 是否至少推进到 `runs.trigger_seq`,默认 true(失败、中止、完成)。
|
|
18
|
+
* 超时(max_duration)传 false:loop 没吸收的消息没有被回复,必须留给下一轮(R34)。
|
|
19
|
+
*/
|
|
20
|
+
floorToTrigger?: boolean;
|
|
21
|
+
/**
|
|
22
|
+
* Runs in the transaction once the run is known not to be terminal, before the terminal event:
|
|
23
|
+
* a parent's open `agent` calls get their results here (sub-agents spec §12, review m1).
|
|
24
|
+
*/
|
|
25
|
+
beforeTerminal?: (t: KernelTrx) => Promise<void>;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* 在事务 `t` 内写运行的终态:会话行锁 → 运行仍未结束才写终态事件、推进 `consumed_seq`、更新 `runs.status`。
|
|
29
|
+
* 返回终态事件的 seq;运行已是终态(例如已被其他副本标记失败)→ 返回 null,什么都不写。
|
|
30
|
+
*
|
|
31
|
+
* `consumed_seq = GREATEST(consumed_seq, consumed, runs.trigger_seq)`:不回退,且失败 / 中止 / 完成都至少
|
|
32
|
+
* 消费到触发该运行的消息——否则结束时的 ensureRun 会对同一条消息无限重试(失败)或卡住会话。
|
|
33
|
+
* 超时(`floorToTrigger: false`)只取 `GREATEST(consumed_seq, consumed)`:没吸收的消息留给下一轮(R34)。
|
|
34
|
+
* 加锁顺序与 `RunQueue.ensureRun` 一致(先会话行、后 runs 行),不会互相死锁。
|
|
35
|
+
* 调用方在提交后对非 null 的返回值调用 `eventLog.notify`。
|
|
36
|
+
*/
|
|
37
|
+
export declare function finishRunIn(t: KernelTrx, eventLog: EventLog, a: FinishRunArgs): Promise<number | null>;
|
|
38
|
+
/**
|
|
39
|
+
* After a terminal event committed: notify the log, and for a failed or stopped run also send
|
|
40
|
+
* `changed: queue` (the queue may have paused).
|
|
41
|
+
*/
|
|
42
|
+
export declare function notifyFinished(eventLog: Pick<EventLog, "notify" | "publishChanged">, conversationId: string, toSeq: number, status: TerminalStatus): Promise<void>;
|
|
43
|
+
/** 自开事务写终态并在提交后发布会话通知;返回值同 {@link finishRunIn}。 */
|
|
44
|
+
export declare function finishRun(db: KernelDb, eventLog: EventLog, a: FinishRunArgs): Promise<number | null>;
|
|
45
|
+
export {};
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { sql } from "kysely";
|
|
2
|
+
import { pauseQueueIn } from "../conversations/queue.js";
|
|
3
|
+
export const TERMINAL_STATUSES = new Set([
|
|
4
|
+
"completed",
|
|
5
|
+
"failed",
|
|
6
|
+
"aborted",
|
|
7
|
+
]);
|
|
8
|
+
/**
|
|
9
|
+
* 在事务 `t` 内写运行的终态:会话行锁 → 运行仍未结束才写终态事件、推进 `consumed_seq`、更新 `runs.status`。
|
|
10
|
+
* 返回终态事件的 seq;运行已是终态(例如已被其他副本标记失败)→ 返回 null,什么都不写。
|
|
11
|
+
*
|
|
12
|
+
* `consumed_seq = GREATEST(consumed_seq, consumed, runs.trigger_seq)`:不回退,且失败 / 中止 / 完成都至少
|
|
13
|
+
* 消费到触发该运行的消息——否则结束时的 ensureRun 会对同一条消息无限重试(失败)或卡住会话。
|
|
14
|
+
* 超时(`floorToTrigger: false`)只取 `GREATEST(consumed_seq, consumed)`:没吸收的消息留给下一轮(R34)。
|
|
15
|
+
* 加锁顺序与 `RunQueue.ensureRun` 一致(先会话行、后 runs 行),不会互相死锁。
|
|
16
|
+
* 调用方在提交后对非 null 的返回值调用 `eventLog.notify`。
|
|
17
|
+
*/
|
|
18
|
+
export async function finishRunIn(t, eventLog, a) {
|
|
19
|
+
await t
|
|
20
|
+
.selectFrom("conversations")
|
|
21
|
+
.select("id")
|
|
22
|
+
.where("id", "=", a.conversationId)
|
|
23
|
+
.forUpdate()
|
|
24
|
+
.executeTakeFirst();
|
|
25
|
+
const run = await t
|
|
26
|
+
.selectFrom("runs")
|
|
27
|
+
.select("status")
|
|
28
|
+
.where("id", "=", a.runId)
|
|
29
|
+
.forUpdate()
|
|
30
|
+
.executeTakeFirst();
|
|
31
|
+
if (!run || TERMINAL_STATUSES.has(run.status))
|
|
32
|
+
return null;
|
|
33
|
+
await a.beforeTerminal?.(t);
|
|
34
|
+
const [ev] = await eventLog.append(a.conversationId, [{ ...a.event, runId: a.runId, idemKey: `${a.event.type}:${a.runId}` }], t);
|
|
35
|
+
await t
|
|
36
|
+
.updateTable("conversations")
|
|
37
|
+
.set({
|
|
38
|
+
consumed_seq: a.floorToTrigger === false
|
|
39
|
+
? sql `GREATEST(consumed_seq, ${a.consumed ?? 0}::bigint)`
|
|
40
|
+
: sql `GREATEST(consumed_seq, ${a.consumed ?? 0}::bigint, (SELECT r.trigger_seq FROM capybara.runs r WHERE r.id = ${a.runId}))`,
|
|
41
|
+
})
|
|
42
|
+
.where("id", "=", a.conversationId)
|
|
43
|
+
.execute();
|
|
44
|
+
await t
|
|
45
|
+
.updateTable("runs")
|
|
46
|
+
.set({ status: a.status, finished_at: sql `now()` })
|
|
47
|
+
.where("id", "=", a.runId)
|
|
48
|
+
.execute();
|
|
49
|
+
// a failed or stopped run pauses the queued messages until the person resumes (spec §5.7)
|
|
50
|
+
if (a.status !== "completed")
|
|
51
|
+
await pauseQueueIn(t, a.conversationId);
|
|
52
|
+
return ev.seq;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* After a terminal event committed: notify the log, and for a failed or stopped run also send
|
|
56
|
+
* `changed: queue` (the queue may have paused).
|
|
57
|
+
*/
|
|
58
|
+
export async function notifyFinished(eventLog, conversationId, toSeq, status) {
|
|
59
|
+
await eventLog.notify(conversationId, toSeq);
|
|
60
|
+
if (status !== "completed")
|
|
61
|
+
await eventLog.publishChanged(conversationId, "queue");
|
|
62
|
+
}
|
|
63
|
+
/** 自开事务写终态并在提交后发布会话通知;返回值同 {@link finishRunIn}。 */
|
|
64
|
+
export async function finishRun(db, eventLog, a) {
|
|
65
|
+
const toSeq = await db.transaction().execute((t) => finishRunIn(t, eventLog, a));
|
|
66
|
+
if (toSeq !== null)
|
|
67
|
+
await notifyFinished(eventLog, a.conversationId, toSeq, a.status);
|
|
68
|
+
return toSeq;
|
|
69
|
+
}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import type { Logger } from "@capybara-hq/plugin-sdk";
|
|
2
|
+
import { Redis } from "ioredis";
|
|
3
|
+
import { type Transaction } from "kysely";
|
|
4
|
+
import type { EventLog } from "../conversations/event-log.js";
|
|
5
|
+
import type { ConversationKind, KernelDatabase, KernelDb } from "../db/kernel-schema.js";
|
|
6
|
+
import type { RunAbortDetail } from "./abort.js";
|
|
7
|
+
import type { KyselyCheckpointSaver } from "./checkpointer.js";
|
|
8
|
+
import type { ConversationLock } from "./conversation-lock.js";
|
|
9
|
+
/** 内核运行队列的 BullMQ 队列名(不含 `:`;与插件队列 `cap.<插件>.<名>` 不会重名)。 */
|
|
10
|
+
export declare const RUN_QUEUE_NAME = "cap-kernel-runs";
|
|
11
|
+
/**
|
|
12
|
+
* Queue of sub-agent (child) runs (sub-agents spec §7.4): a replica still on a version without
|
|
13
|
+
* sub-agents never takes a child job, and child load shows apart from conversations.
|
|
14
|
+
*/
|
|
15
|
+
export declare const SUBAGENT_RUN_QUEUE_NAME = "cap-kernel-subagent-runs";
|
|
16
|
+
/** The run queue of a conversation kind: sub-agent conversations have their own. */
|
|
17
|
+
export declare const runQueueNameFor: (kind: ConversationKind) => string;
|
|
18
|
+
/** 运行任务的数据。 */
|
|
19
|
+
export interface RunJobData {
|
|
20
|
+
runId: string;
|
|
21
|
+
conversationId: string;
|
|
22
|
+
}
|
|
23
|
+
/** 同一触发点(会话 + 最新用户消息 seq)只投递一次。 */
|
|
24
|
+
export declare const runJobId: (conversationId: string, maxUserSeq: number) => string;
|
|
25
|
+
/** 未结束的运行状态(waiting:等人处理审批 / 输入请求,没有任务、不占会话锁与配额)。 */
|
|
26
|
+
export declare const ACTIVE_RUN_STATUSES: readonly ["queued", "running", "waiting"];
|
|
27
|
+
type KernelTrx = Transaction<KernelDatabase>;
|
|
28
|
+
/** What an orphan repair does for a parent's sub-agents (wired by the kernel). */
|
|
29
|
+
export interface OrphanSubagents {
|
|
30
|
+
/** `ToolPipeline.stopOpenAgentCalls`: the run's open `agent` call results, in `t`. */
|
|
31
|
+
stopOpenCalls(t: KernelTrx, runId: string): Promise<{
|
|
32
|
+
fire: () => void;
|
|
33
|
+
}>;
|
|
34
|
+
/** `stopChildren(runId, null)`: after the commit, its active children stop. */
|
|
35
|
+
stopChildren(runId: string): Promise<unknown>;
|
|
36
|
+
}
|
|
37
|
+
/** BullMQ 连接要求 maxRetriesPerRequest 为 null(Worker 的阻塞连接);Queue 复用同样的配置。 */
|
|
38
|
+
export declare function bullConnection(redisUrl: string, log: Pick<Logger, "error">): Redis;
|
|
39
|
+
/**
|
|
40
|
+
* 运行队列(生产方):`ensureRun` 在会话有未消费的用户消息、且没有进行中的运行时插入 `runs` 行并投递任务。
|
|
41
|
+
* 「是否已有运行」以 PG 为准(会话行锁内检查 `runs` 中的 queued / running),并参考会话锁的持有者;
|
|
42
|
+
* 多副本并发调用对同一会话串行化,同一时刻至多一个未结束的运行。
|
|
43
|
+
*/
|
|
44
|
+
export declare class RunQueue {
|
|
45
|
+
private readonly db;
|
|
46
|
+
private readonly eventLog;
|
|
47
|
+
private readonly lock;
|
|
48
|
+
private readonly redisUrl;
|
|
49
|
+
private readonly log;
|
|
50
|
+
/** 运行以孤儿结束(标记失败 / 直接中止)后删除它的 checkpoint thread(thread_id = runId)。 */
|
|
51
|
+
private readonly checkpoints?;
|
|
52
|
+
/** Sub-agent cleanup when an orphan repair ends a parent run (sub-agents spec §12). */
|
|
53
|
+
private readonly subagents?;
|
|
54
|
+
private readonly queues;
|
|
55
|
+
private conn;
|
|
56
|
+
private closed;
|
|
57
|
+
constructor(db: KernelDb, eventLog: EventLog, lock: Pick<ConversationLock, "holder">, redisUrl: string, log: Pick<Logger, "error" | "warn">,
|
|
58
|
+
/** 运行以孤儿结束(标记失败 / 直接中止)后删除它的 checkpoint thread(thread_id = runId)。 */
|
|
59
|
+
checkpoints?: Pick<KyselyCheckpointSaver, "deleteThread"> | undefined,
|
|
60
|
+
/** Sub-agent cleanup when an orphan repair ends a parent run (sub-agents spec §12). */
|
|
61
|
+
subagents?: OrphanSubagents | undefined);
|
|
62
|
+
/**
|
|
63
|
+
* The `beforeTerminal` of an orphan repair: writes the run's open `agent` call results in `t`;
|
|
64
|
+
* `fire()` runs their observe hooks after the commit (review m1).
|
|
65
|
+
*/
|
|
66
|
+
private stopOpenCalls;
|
|
67
|
+
/** The BullMQ queue `name` (default: conversation runs); both share one connection. */
|
|
68
|
+
private getQueue;
|
|
69
|
+
/**
|
|
70
|
+
* 有未消费的用户消息(最新 user_message 的 seq > `consumed_seq`)、会话锁无人持有、
|
|
71
|
+
* 且没有 queued / running / waiting 的运行时:插入 `runs`(queued)并投递任务,返回 runId;否则返回 null。
|
|
72
|
+
*
|
|
73
|
+
* 孤儿清理(R29,按需进行,没有定时器):已有的 queued / running 运行若 BullMQ 任务已不存在、
|
|
74
|
+
* 会话锁也无人持有(queued 的还要超过宽限期),说明没有任何 worker 会再执行它——写
|
|
75
|
+
* `run_failed { code: "run.orphaned" }` 把它标记为失败(consumed_seq 推进到它的触发消息),
|
|
76
|
+
* 再按常规判断是否起新一轮,并删除它的 checkpoint thread。会话因此不会永远卡在「有运行」。
|
|
77
|
+
* 除了写入消息后,打开 SSE、读事件、运行结束后也会调用它(幂等),孤儿因此在有人查看时就被清理。
|
|
78
|
+
*
|
|
79
|
+
* agent 已软删除的会话不起新运行(孤儿清理照常进行)。
|
|
80
|
+
*/
|
|
81
|
+
ensureRun(conversationId: string): Promise<string | null>;
|
|
82
|
+
/**
|
|
83
|
+
* Enqueues a run job under the caller's job id (resumes, dispatches, repairs), with the same
|
|
84
|
+
* options as {@link ensureRun}. The queue follows the conversation's kind (a sub-agent's runs go
|
|
85
|
+
* to {@link SUBAGENT_RUN_QUEUE_NAME}); pass `kind` when the caller knows it, else it is read.
|
|
86
|
+
*/
|
|
87
|
+
enqueue(data: RunJobData, jobId: string, kind?: ConversationKind): Promise<void>;
|
|
88
|
+
/**
|
|
89
|
+
* 中止一个孤儿运行(`POST .../abort` 用):运行仍是 queued / running、会话锁无人持有、BullMQ 任务已不存在
|
|
90
|
+
* (queued 的还要超过宽限期,判定同 {@link ensureRun} 的孤儿清理)时,没有任何 worker 会收到中止广播——
|
|
91
|
+
* 直接写 `run_aborted`、status 置为 aborted、consumed_seq 至少推进到触发消息,返回 true。
|
|
92
|
+
* 不是孤儿(有人在执行或即将执行)或运行已结束 → 返回 false,由调用方走广播中止。
|
|
93
|
+
*/
|
|
94
|
+
abortIfOrphaned(conversationId: string, runId: string, byAccountId: string | null, detail?: RunAbortDetail): Promise<boolean>;
|
|
95
|
+
/**
|
|
96
|
+
* Repairs an orphaned run of a conversation nobody else repairs on demand (a sub-agent's: no
|
|
97
|
+
* `ensureRun` ever runs for it; sub-agents spec §7.5), with the same orphan test as
|
|
98
|
+
* {@link ensureRun}: the conversation lock is free, the run is still `queued` / `running`, its
|
|
99
|
+
* job is gone, and a `queued` one is past the grace period.
|
|
100
|
+
* - `queued` (the dispatch or resume committed, its enqueue was lost) → enqueued again under its
|
|
101
|
+
* own job id (`runs.job_id`, else the trigger's), so concurrent repairs on several replicas
|
|
102
|
+
* still leave one job: `"requeued"`;
|
|
103
|
+
* - `running` (its worker died without a terminal state and BullMQ dropped the job) → marked
|
|
104
|
+
* failed `run.orphaned`; the caller reports it to the parent: `"failed"`.
|
|
105
|
+
* Not an orphan, or already finished → null.
|
|
106
|
+
*/
|
|
107
|
+
repairOrphan(conversationId: string, runId: string): Promise<"requeued" | "failed" | null>;
|
|
108
|
+
/** 会话当前未结束的运行(调用方已持有会话行锁)。 */
|
|
109
|
+
private activeRun;
|
|
110
|
+
/**
|
|
111
|
+
* 未结束的运行是否已是孤儿(调用方已确认会话锁无人持有):waiting → 否(等人处理,本来就没有任务,
|
|
112
|
+
* 由人工决定或超时任务续跑);queued 且仍在宽限期内 → 否(任务可能还没投递);BullMQ 任务(续跑任务按
|
|
113
|
+
* `runs.job_id`)仍存在 → 否;否则是。
|
|
114
|
+
*/
|
|
115
|
+
private isOrphan;
|
|
116
|
+
/** 删除已结束运行的 checkpoint thread(失败只记日志)。 */
|
|
117
|
+
private dropCheckpoints;
|
|
118
|
+
private deleteQueued;
|
|
119
|
+
close(): Promise<void>;
|
|
120
|
+
}
|
|
121
|
+
export {};
|