@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,136 @@
|
|
|
1
|
+
import { audit } from "../identity/audit.js";
|
|
2
|
+
/**
|
|
3
|
+
* The scope for hook payloads, or null when hooks must not fire: no registry (eval replays omit it),
|
|
4
|
+
* a conversation that is neither `chat` nor `subagent`, or missing identity fields. A sub-agent's
|
|
5
|
+
* scope carries `parent` (where it was dispatched from).
|
|
6
|
+
*/
|
|
7
|
+
export function hookScope(hooks, s) {
|
|
8
|
+
if (!hooks || (s.conversationKind !== "chat" && s.conversationKind !== "subagent"))
|
|
9
|
+
return null;
|
|
10
|
+
if (s.accountId === undefined || s.agentId === undefined)
|
|
11
|
+
return null;
|
|
12
|
+
return {
|
|
13
|
+
orgId: s.orgId,
|
|
14
|
+
accountId: s.accountId,
|
|
15
|
+
agentId: s.agentId,
|
|
16
|
+
agentVersion: s.agentVersion,
|
|
17
|
+
conversationId: s.conversationId,
|
|
18
|
+
runId: s.runId,
|
|
19
|
+
...(s.parent !== undefined && {
|
|
20
|
+
parent: {
|
|
21
|
+
conversationId: s.parent.conversationId,
|
|
22
|
+
runId: s.parent.runId,
|
|
23
|
+
callId: s.parent.callId,
|
|
24
|
+
},
|
|
25
|
+
}),
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Fires observe-only hooks (`model.response`, `tool.postExecute`) without waiting. `signal` must be
|
|
30
|
+
* run-scoped (not a per-call controller aborted when the call ends), or the hooks would be cut off.
|
|
31
|
+
*/
|
|
32
|
+
export function fireObserve(hooks, mount, payload, signal, log) {
|
|
33
|
+
if (!hooks.has(mount))
|
|
34
|
+
return;
|
|
35
|
+
hooks.run(mount, payload, signal).catch((err) => {
|
|
36
|
+
// run() only rejects when the caller aborted: nothing to do
|
|
37
|
+
if (!signal.aborted)
|
|
38
|
+
log.warn("observe hooks failed to dispatch", { mount, err });
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
/** Decoded size of standard padded base64, in bytes. */
|
|
42
|
+
const base64Bytes = (data) => {
|
|
43
|
+
const pad = data.endsWith("==") ? 2 : data.endsWith("=") ? 1 : 0;
|
|
44
|
+
return Math.max(0, Math.floor(data.length / 4) * 3 - pad);
|
|
45
|
+
};
|
|
46
|
+
/**
|
|
47
|
+
* The `model.request` payload's request (F10, I-3): the request sent to the provider with every image
|
|
48
|
+
* and document block replaced by a {@link HookMediaPlaceholder} (`kind`, `mediaType`, decoded `size`),
|
|
49
|
+
* so hook payloads carry neither media bytes nor attachment ids. Media never sits outside user
|
|
50
|
+
* messages, but every message is projected anyway. Building the copy also keeps the per-call clone
|
|
51
|
+
* and freeze of the payload small. A `ref` source should never reach here (the kernel resolves refs
|
|
52
|
+
* before sending); it becomes a placeholder of size 0 and logs a warning.
|
|
53
|
+
*/
|
|
54
|
+
export function hookRequestOf(request, log) {
|
|
55
|
+
let refs = 0;
|
|
56
|
+
const project = (b) => {
|
|
57
|
+
if (b.type !== "image" && b.type !== "document")
|
|
58
|
+
return b;
|
|
59
|
+
if (b.source.kind === "ref")
|
|
60
|
+
refs++;
|
|
61
|
+
return {
|
|
62
|
+
type: "media_omitted",
|
|
63
|
+
kind: b.type,
|
|
64
|
+
mediaType: b.mediaType,
|
|
65
|
+
size: b.source.kind === "base64" ? base64Bytes(b.source.data) : 0,
|
|
66
|
+
};
|
|
67
|
+
};
|
|
68
|
+
const messages = request.messages.map((m) => m.role === "system" ? m : { role: m.role, content: m.content.map(project) });
|
|
69
|
+
if (refs > 0) {
|
|
70
|
+
log?.warn("attachment refs reached a model.request hook payload", {
|
|
71
|
+
model: request.model,
|
|
72
|
+
refs,
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
return { ...request, messages };
|
|
76
|
+
}
|
|
77
|
+
/** The `hook_denied` event of a denial (not model-visible: request building skips it). */
|
|
78
|
+
export function hookDeniedEvent(at, mount, denial, where) {
|
|
79
|
+
return {
|
|
80
|
+
type: "hook_denied",
|
|
81
|
+
runId: at.runId,
|
|
82
|
+
idemKey: at.idemKey,
|
|
83
|
+
payload: {
|
|
84
|
+
mount,
|
|
85
|
+
plugin: denial.plugin,
|
|
86
|
+
reason: denial.reason,
|
|
87
|
+
cause: denial.cause,
|
|
88
|
+
step: where.step,
|
|
89
|
+
...(where.attempt !== undefined && { attempt: where.attempt }),
|
|
90
|
+
...(where.callId !== undefined && { callId: where.callId }),
|
|
91
|
+
},
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* The `hook.denied` audit entry of a denial. For an R10 denial (`preflight`) it says that no plugin ran
|
|
96
|
+
* and that the named plugin is only the first policy plugin on the mount.
|
|
97
|
+
*/
|
|
98
|
+
export function hookDeniedAudit(at, payload, denial) {
|
|
99
|
+
return {
|
|
100
|
+
...(at.accountId !== undefined && { actorAccountId: at.accountId }),
|
|
101
|
+
orgId: at.orgId,
|
|
102
|
+
action: "hook.denied",
|
|
103
|
+
target: at.conversationId,
|
|
104
|
+
detail: {
|
|
105
|
+
...payload,
|
|
106
|
+
conversationId: at.conversationId,
|
|
107
|
+
runId: at.runId,
|
|
108
|
+
...(at.agentId !== undefined && { agentId: at.agentId }),
|
|
109
|
+
// the raw hook error: audit only, never in the conversation event (Ruling R12)
|
|
110
|
+
...(denial.detail !== undefined && { error: denial.detail }),
|
|
111
|
+
...(denial.preflight
|
|
112
|
+
? { preflight: true, firstPolicyPlugin: denial.plugin, causedByPlugin: false }
|
|
113
|
+
: {}),
|
|
114
|
+
// M-1: the named plugin is enabled but not loaded on the replica that handled the call
|
|
115
|
+
...(denial.notLoaded ? { notLoaded: true } : {}),
|
|
116
|
+
},
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Writes a model request's `hook_denied` event and its audit entry in one transaction (the tool path
|
|
121
|
+
* writes them with the `tool_result` instead). Idempotent by idem key: a resumed run that finds the
|
|
122
|
+
* denial rethrows it before running the hooks again, so no second audit entry is written.
|
|
123
|
+
*/
|
|
124
|
+
export async function recordHookDenial(d, at, mount, denial, where) {
|
|
125
|
+
if (await d.eventLog.findByIdem(at.conversationId, at.idemKey))
|
|
126
|
+
return;
|
|
127
|
+
const event = hookDeniedEvent(at, mount, denial, where);
|
|
128
|
+
const written = await d.db.transaction().execute(async (t) => {
|
|
129
|
+
const out = await d.eventLog.append(at.conversationId, [event], t);
|
|
130
|
+
await audit(t, hookDeniedAudit(at, event.payload, denial));
|
|
131
|
+
return out;
|
|
132
|
+
});
|
|
133
|
+
if (written.length > 0) {
|
|
134
|
+
await d.eventLog.notify(at.conversationId, Math.max(...written.map((e) => e.seq)));
|
|
135
|
+
}
|
|
136
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import type { ToolPipeline } from "../tools/pipeline.js";
|
|
2
|
+
import type { KyselyCheckpointSaver } from "./checkpointer.js";
|
|
3
|
+
import type { AgentLoop, LoopContext, LoopOutcome } from "./loop.js";
|
|
4
|
+
import { type ModelStepDeps, type ModelStepResult } from "./model-call.js";
|
|
5
|
+
import type { SubagentStep } from "./subagents/progress.js";
|
|
6
|
+
import { type SkillForks } from "./subagents/skill-fork.js";
|
|
7
|
+
/** loop 的依赖:单步模型调用依赖 + 工具执行管线(tools 节点)。 */
|
|
8
|
+
export interface LoopDeps extends ModelStepDeps {
|
|
9
|
+
toolPipeline: Pick<ToolPipeline, "runStep">;
|
|
10
|
+
/**
|
|
11
|
+
* After a sub-agent's tools node finished a step: publishes its progress on the parent's topic
|
|
12
|
+
* (sub-agents spec §14.2, `publishSubagentProgress`). Never throws. Replays omit it.
|
|
13
|
+
*/
|
|
14
|
+
subagentProgress?(s: SubagentStep): Promise<void>;
|
|
15
|
+
/**
|
|
16
|
+
* Phase D forked skills: in the run's first `prepare`, a fork invocation the run absorbed is
|
|
17
|
+
* dispatched (live) or its recorded report appended (full-run replay), before any model call.
|
|
18
|
+
* Without it a fork invocation is answered like any message.
|
|
19
|
+
*/
|
|
20
|
+
skillForks?: SkillForks;
|
|
21
|
+
}
|
|
22
|
+
/** 测试钩子。 */
|
|
23
|
+
export interface LangGraphLoopHooks {
|
|
24
|
+
/**
|
|
25
|
+
* `model` / `wrapUp` 节点里 `runModelStep` / `runFinalWrapUp` 返回之后、节点返回之前调用:
|
|
26
|
+
* 抛错即模拟「回复已写入日志、checkpoint 尚未保存」时进程崩溃。
|
|
27
|
+
*/
|
|
28
|
+
afterModelStep?(runId: string, step: number, result: ModelStepResult): Promise<void>;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* 默认 AgentLoop:LangGraph 状态图,checkpoint 存在内核的 `KyselyCheckpointSaver`(thread_id = runId),
|
|
32
|
+
* worker 崩溃后由其他副本从最近的 checkpoint 续跑(spec 4.4、Review Focus 1)。
|
|
33
|
+
*
|
|
34
|
+
* 图:`prepare → model →(tool_use)tools → prepare …`;prepare 发现步数超过上限 → `wrapUp` → 结束;
|
|
35
|
+
* prepare finding the deadline passed, or (a sub-agent's run) its parent's token budget used up → end;
|
|
36
|
+
* 模型中止或正常结束 → 结束。`durability: "sync"`:每个节点的 checkpoint 在下一个节点开始前落库。
|
|
37
|
+
*
|
|
38
|
+
* 幂等:`runModelStep` / `runFinalWrapUp` 按 (runId, step) 幂等,续跑重新执行 model 节点时若回复已在日志里,
|
|
39
|
+
* 直接复用(不再调用模型);tools 节点按 (runId, callId) 幂等:已有结果的调用跳过,「有开始无结果」的
|
|
40
|
+
* 调用记为结果未知、不再执行(spec 4.3)。
|
|
41
|
+
*
|
|
42
|
+
* 等人处理(Task 9):tools 节点遇到需要审批 / 用户输入的调用时抛 {@link LoopSuspended},run 返回 `suspended`;
|
|
43
|
+
* worker 把运行置为 waiting、释放会话锁与配额,处理后新任务从同一 checkpoint 续跑 tools 节点。
|
|
44
|
+
*/
|
|
45
|
+
export declare class LangGraphLoop implements AgentLoop {
|
|
46
|
+
private readonly saver;
|
|
47
|
+
private readonly stepDeps;
|
|
48
|
+
private readonly hooks;
|
|
49
|
+
constructor(saver: KyselyCheckpointSaver, stepDeps: LoopDeps, hooks?: LangGraphLoopHooks);
|
|
50
|
+
run(ctx: LoopContext): Promise<LoopOutcome>;
|
|
51
|
+
private build;
|
|
52
|
+
}
|
|
@@ -0,0 +1,247 @@
|
|
|
1
|
+
import { Annotation, END, START, StateGraph } from "@langchain/langgraph";
|
|
2
|
+
import { MediaCache } from "./media-cache.js";
|
|
3
|
+
import { runFinalWrapUp, runModelStep, } from "./model-call.js";
|
|
4
|
+
import { subagentBudgetUsedUp } from "./subagents/limits.js";
|
|
5
|
+
import { isForkInvocation } from "./subagents/skill-fork.js";
|
|
6
|
+
/**
|
|
7
|
+
* 图状态:只记录进度,消息每步从事件日志重建(runModelStep 自己读日志),checkpoint 很小。
|
|
8
|
+
* - `step`:当前(最近一次进入的)步骤编号,prepare 节点 +1;
|
|
9
|
+
* - `consumedUpToSeq`:已吸收的最大 user_message seq;
|
|
10
|
+
* - `lastStopReason`:最近一步模型调用的停止原因;
|
|
11
|
+
* - `outcome`:图的结束方式(在决定结束的节点里写入,续跑已结束的图时直接读出,不依赖当前时间)。
|
|
12
|
+
*
|
|
13
|
+
* 所有 channel 都是默认的 LastValue(不用实验性的 DeltaChannel,也没有子图):
|
|
14
|
+
* 每个 checkpoint 自带完整状态,`pruneToLatest` 之后仍能独立还原(R19)。
|
|
15
|
+
*/
|
|
16
|
+
const LoopState = Annotation.Root({
|
|
17
|
+
step: Annotation(),
|
|
18
|
+
consumedUpToSeq: Annotation(),
|
|
19
|
+
lastStopReason: Annotation(),
|
|
20
|
+
outcome: Annotation(),
|
|
21
|
+
});
|
|
22
|
+
const INITIAL = { step: 0, consumedUpToSeq: 0, lastStopReason: null, outcome: null };
|
|
23
|
+
/**
|
|
24
|
+
* prepare 节点在停机信号下抛出:本次 invoke 以它结束,checkpoint 停在 prepare 之前
|
|
25
|
+
* (LangGraph 把出错的任务记为该 checkpoint 上的 pending error,`invoke(null)` 续跑时重新执行它)。
|
|
26
|
+
*
|
|
27
|
+
* 选它而不是 `interrupt()` / `GraphInterrupt`:`interrupt()` 是「等待人类输入」语义,续跑需要
|
|
28
|
+
* `Command({ resume })`,且节点会从头重放;停机只是「换个进程从同一位置继续」,用普通异常即可,
|
|
29
|
+
* 续跑时 prepare 正常重新执行,语义更直接。
|
|
30
|
+
*/
|
|
31
|
+
class LoopInterrupted extends Error {
|
|
32
|
+
constructor() {
|
|
33
|
+
super("agent loop interrupted at a step boundary");
|
|
34
|
+
this.name = "LoopInterrupted";
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* tools 节点在某个调用需要等人处理(审批 / 输入请求)时抛出:与 {@link LoopInterrupted} 相同的机制——
|
|
39
|
+
* 本次 invoke 以它结束,checkpoint 停在 tools 之前,处理后 `invoke(null)` 重新执行 tools 节点
|
|
40
|
+
* (按 (runId, callId) 幂等:已有结果的调用跳过,读到审批 / 输入结果的调用继续)。
|
|
41
|
+
*
|
|
42
|
+
* 不用 `interrupt()`:续跑由另一个副本的新任务发起,读到的结果都在 PG(审批 / 输入请求表)里,
|
|
43
|
+
* 不需要经 `Command({ resume })` 传值;用普通异常与停机共用一条已验证的续跑路径。
|
|
44
|
+
*/
|
|
45
|
+
class LoopSuspended extends Error {
|
|
46
|
+
waitingFor;
|
|
47
|
+
constructor(waitingFor) {
|
|
48
|
+
super("agent loop suspended waiting for a human");
|
|
49
|
+
this.waitingFor = waitingFor;
|
|
50
|
+
this.name = "LoopSuspended";
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* 默认 AgentLoop:LangGraph 状态图,checkpoint 存在内核的 `KyselyCheckpointSaver`(thread_id = runId),
|
|
55
|
+
* worker 崩溃后由其他副本从最近的 checkpoint 续跑(spec 4.4、Review Focus 1)。
|
|
56
|
+
*
|
|
57
|
+
* 图:`prepare → model →(tool_use)tools → prepare …`;prepare 发现步数超过上限 → `wrapUp` → 结束;
|
|
58
|
+
* prepare finding the deadline passed, or (a sub-agent's run) its parent's token budget used up → end;
|
|
59
|
+
* 模型中止或正常结束 → 结束。`durability: "sync"`:每个节点的 checkpoint 在下一个节点开始前落库。
|
|
60
|
+
*
|
|
61
|
+
* 幂等:`runModelStep` / `runFinalWrapUp` 按 (runId, step) 幂等,续跑重新执行 model 节点时若回复已在日志里,
|
|
62
|
+
* 直接复用(不再调用模型);tools 节点按 (runId, callId) 幂等:已有结果的调用跳过,「有开始无结果」的
|
|
63
|
+
* 调用记为结果未知、不再执行(spec 4.3)。
|
|
64
|
+
*
|
|
65
|
+
* 等人处理(Task 9):tools 节点遇到需要审批 / 用户输入的调用时抛 {@link LoopSuspended},run 返回 `suspended`;
|
|
66
|
+
* worker 把运行置为 waiting、释放会话锁与配额,处理后新任务从同一 checkpoint 续跑 tools 节点。
|
|
67
|
+
*/
|
|
68
|
+
export class LangGraphLoop {
|
|
69
|
+
saver;
|
|
70
|
+
stepDeps;
|
|
71
|
+
hooks;
|
|
72
|
+
constructor(saver, stepDeps, hooks = {}) {
|
|
73
|
+
this.saver = saver;
|
|
74
|
+
this.stepDeps = stepDeps;
|
|
75
|
+
this.hooks = hooks;
|
|
76
|
+
}
|
|
77
|
+
async run(ctx) {
|
|
78
|
+
const graph = this.build(ctx);
|
|
79
|
+
const config = {
|
|
80
|
+
configurable: { thread_id: ctx.runId },
|
|
81
|
+
// 每步最多 3 个超步(prepare、model、tools),再加 wrapUp 与余量。
|
|
82
|
+
recursionLimit: ctx.limits.maxSteps * 3 + 10,
|
|
83
|
+
durability: "sync",
|
|
84
|
+
};
|
|
85
|
+
const existing = await this.saver.getTuple({ configurable: { thread_id: ctx.runId } });
|
|
86
|
+
let final;
|
|
87
|
+
try {
|
|
88
|
+
if (existing) {
|
|
89
|
+
const snapshot = await graph.getState(config);
|
|
90
|
+
// 续跑 model / wrapUp 节点:此前进程可能已流出半截内容,先让订阅方丢弃。
|
|
91
|
+
if (snapshot.next.includes("model") || snapshot.next.includes("wrapUp")) {
|
|
92
|
+
ctx.sink({ kind: "step_reset", runId: ctx.runId, step: snapshot.values.step });
|
|
93
|
+
}
|
|
94
|
+
final = (await graph.invoke(null, config));
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
final = (await graph.invoke(INITIAL, config));
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
catch (e) {
|
|
101
|
+
if (e instanceof LoopInterrupted)
|
|
102
|
+
return { kind: "interrupted" };
|
|
103
|
+
if (e instanceof LoopSuspended)
|
|
104
|
+
return { kind: "suspended", waitingFor: e.waitingFor };
|
|
105
|
+
throw e;
|
|
106
|
+
}
|
|
107
|
+
const outcome = final.outcome ?? "completed";
|
|
108
|
+
return outcome === "aborted"
|
|
109
|
+
? { kind: "aborted" }
|
|
110
|
+
: { kind: outcome, consumedUpToSeq: final.consumedUpToSeq };
|
|
111
|
+
}
|
|
112
|
+
build(ctx) {
|
|
113
|
+
const timedOut = () => Date.now() >= ctx.limits.deadline;
|
|
114
|
+
// 本次运行的附件字节缓存:各步共用,运行结束即丢弃(只是优化,见 MediaCache)
|
|
115
|
+
const mediaCache = new MediaCache(this.stepDeps.config().attachments.requestMediaBytes);
|
|
116
|
+
const input = (step, absorbedUpToSeq) => ({
|
|
117
|
+
orgId: ctx.orgId,
|
|
118
|
+
conversationId: ctx.conversationId,
|
|
119
|
+
runId: ctx.runId,
|
|
120
|
+
step,
|
|
121
|
+
agent: ctx.agent,
|
|
122
|
+
agentVersion: ctx.agentVersion,
|
|
123
|
+
signal: ctx.signal,
|
|
124
|
+
sink: ctx.sink,
|
|
125
|
+
absorbedUpToSeq,
|
|
126
|
+
maxSteps: ctx.limits.maxSteps,
|
|
127
|
+
mediaCache,
|
|
128
|
+
agentId: ctx.agentId,
|
|
129
|
+
accountId: ctx.triggerAccountId,
|
|
130
|
+
...(ctx.conversationKind !== undefined && { conversationKind: ctx.conversationKind }),
|
|
131
|
+
...(ctx.parent !== undefined && { parentRunId: ctx.parent.runId, parent: ctx.parent }),
|
|
132
|
+
});
|
|
133
|
+
const deps = this.stepDeps;
|
|
134
|
+
const hooks = this.hooks;
|
|
135
|
+
const prepare = async (s) => {
|
|
136
|
+
if (ctx.shutdown.aborted)
|
|
137
|
+
throw new LoopInterrupted();
|
|
138
|
+
// 先查截止时间、再吸收(R33):超时结束的运行不得消费它没有回复的消息,
|
|
139
|
+
// 否则 consumed_seq 越过它们、也不会再起新一轮。
|
|
140
|
+
if (timedOut())
|
|
141
|
+
return { outcome: "max_duration" };
|
|
142
|
+
// a sub-agent stops before its next request once its parent run's children used their token
|
|
143
|
+
// budget (spec §8.3; fresh read, in-flight requests of siblings may overshoot by one each)
|
|
144
|
+
if (ctx.parent !== undefined &&
|
|
145
|
+
(await subagentBudgetUsedUp(deps.db, deps.config, ctx.orgId, ctx.parent.runId))) {
|
|
146
|
+
return { outcome: "budget" };
|
|
147
|
+
}
|
|
148
|
+
let consumed = s.consumedUpToSeq;
|
|
149
|
+
// the run's first prepare (also when it runs again after a suspend on its fork's sub-agent)
|
|
150
|
+
const firstStep = s.step === 0;
|
|
151
|
+
const absorbed = await ctx.pendingUserMessages(consumed);
|
|
152
|
+
for (const m of absorbed)
|
|
153
|
+
consumed = Math.max(consumed, m.seq);
|
|
154
|
+
// phase D: a run's own fork invocation is absorbed at step 1 (the run boundary,
|
|
155
|
+
// `forkBoundary`, makes it the last message there); its sub-agent runs, and its report is
|
|
156
|
+
// logged, before any model call. Found anywhere among the absorbed messages (the replay
|
|
157
|
+
// feeds them by the original absorption, without the boundary). A sub-agent's task message
|
|
158
|
+
// carries the record too, but a child never dispatches.
|
|
159
|
+
const fork = firstStep && ctx.parent === undefined ? absorbed.find(isForkInvocation) : undefined;
|
|
160
|
+
if (fork !== undefined && deps.skillForks) {
|
|
161
|
+
const r = await deps.skillForks.advance({ ctx, fork });
|
|
162
|
+
if (r.kind === "suspend")
|
|
163
|
+
throw new LoopSuspended(r.waitingFor);
|
|
164
|
+
if (r.kind === "aborted") {
|
|
165
|
+
return { consumedUpToSeq: consumed, lastStopReason: "aborted", outcome: "aborted" };
|
|
166
|
+
}
|
|
167
|
+
if (r.kind === "end")
|
|
168
|
+
return { consumedUpToSeq: consumed, outcome: "completed" };
|
|
169
|
+
}
|
|
170
|
+
return { step: s.step + 1, consumedUpToSeq: consumed, outcome: null };
|
|
171
|
+
};
|
|
172
|
+
const model = async (s) => {
|
|
173
|
+
const r = await runModelStep(deps, input(s.step, s.consumedUpToSeq));
|
|
174
|
+
await hooks.afterModelStep?.(ctx.runId, s.step, r);
|
|
175
|
+
if (r.budget)
|
|
176
|
+
return { outcome: "budget" };
|
|
177
|
+
if (r.aborted) {
|
|
178
|
+
return { lastStopReason: "aborted", outcome: timedOut() ? "max_duration" : "aborted" };
|
|
179
|
+
}
|
|
180
|
+
return {
|
|
181
|
+
lastStopReason: r.stopReason,
|
|
182
|
+
outcome: r.stopReason === "tool_use" ? null : "completed",
|
|
183
|
+
};
|
|
184
|
+
};
|
|
185
|
+
// 本步的全部工具调用都写下结果后才回到 prepare(不在「已记录调用、未记录结果」之间构建请求)。
|
|
186
|
+
// 某个调用需要等人处理时抛 LoopSuspended(该调用之后的调用留到续跑时处理)。
|
|
187
|
+
const tools = async (s) => {
|
|
188
|
+
const r = await deps.toolPipeline.runStep({
|
|
189
|
+
orgId: ctx.orgId,
|
|
190
|
+
conversationId: ctx.conversationId,
|
|
191
|
+
runId: ctx.runId,
|
|
192
|
+
step: s.step,
|
|
193
|
+
agentId: ctx.agentId,
|
|
194
|
+
agentVersion: ctx.agentVersion,
|
|
195
|
+
agent: ctx.agent,
|
|
196
|
+
accountId: ctx.triggerAccountId,
|
|
197
|
+
signal: ctx.signal,
|
|
198
|
+
deadline: ctx.limits.deadline,
|
|
199
|
+
...(ctx.conversationKind !== undefined && { conversationKind: ctx.conversationKind }),
|
|
200
|
+
...(ctx.parent !== undefined && { parent: ctx.parent }),
|
|
201
|
+
});
|
|
202
|
+
if (r.kind === "suspended")
|
|
203
|
+
throw new LoopSuspended(r.waitingFor);
|
|
204
|
+
if (ctx.parent !== undefined) {
|
|
205
|
+
// fire and forget: an ephemeral message never delays the child's next step (a slow count
|
|
206
|
+
// or a reconnecting Redis); each message carries absolute counts, so order does not
|
|
207
|
+
// matter (batch 11 m2)
|
|
208
|
+
void deps
|
|
209
|
+
.subagentProgress?.({
|
|
210
|
+
parentConversationId: ctx.parent.conversationId,
|
|
211
|
+
conversationId: ctx.conversationId,
|
|
212
|
+
runId: ctx.runId,
|
|
213
|
+
step: s.step,
|
|
214
|
+
})
|
|
215
|
+
?.catch(() => { });
|
|
216
|
+
}
|
|
217
|
+
return {};
|
|
218
|
+
};
|
|
219
|
+
const wrapUp = async (s) => {
|
|
220
|
+
const r = await runFinalWrapUp(deps, input(s.step, s.consumedUpToSeq));
|
|
221
|
+
await hooks.afterModelStep?.(ctx.runId, s.step, r);
|
|
222
|
+
return {
|
|
223
|
+
lastStopReason: r.aborted ? "aborted" : r.stopReason,
|
|
224
|
+
outcome: r.budget ? "budget" : r.aborted && !timedOut() ? "aborted" : "max_steps",
|
|
225
|
+
};
|
|
226
|
+
};
|
|
227
|
+
return new StateGraph(LoopState)
|
|
228
|
+
.addNode("prepare", prepare)
|
|
229
|
+
.addNode("model", model)
|
|
230
|
+
.addNode("tools", tools)
|
|
231
|
+
.addNode("wrapUp", wrapUp)
|
|
232
|
+
.addEdge(START, "prepare")
|
|
233
|
+
.addConditionalEdges("prepare", (s) => {
|
|
234
|
+
// (aborted / completed: a fork invocation's run ended in its first prepare, phase D)
|
|
235
|
+
if (s.outcome !== null)
|
|
236
|
+
return END;
|
|
237
|
+
return s.step > ctx.limits.maxSteps ? "wrapUp" : "model";
|
|
238
|
+
}, ["model", "wrapUp", END])
|
|
239
|
+
.addConditionalEdges("model", (s) => (s.outcome === null ? "tools" : END), [
|
|
240
|
+
"tools",
|
|
241
|
+
END,
|
|
242
|
+
])
|
|
243
|
+
.addEdge("tools", "prepare")
|
|
244
|
+
.addEdge("wrapUp", END)
|
|
245
|
+
.compile({ checkpointer: this.saver });
|
|
246
|
+
}
|
|
247
|
+
}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import type { AgentDefinition } from "../agents/definition.js";
|
|
2
|
+
import type { ConversationEvent } from "../conversations/events.js";
|
|
3
|
+
import type { StreamSink } from "./model-call.js";
|
|
4
|
+
/** 一次运行交给 loop 的上下文(spec 4.4)。 */
|
|
5
|
+
export interface LoopContext {
|
|
6
|
+
/** 会话所属组织。 */
|
|
7
|
+
orgId: string;
|
|
8
|
+
conversationId: string;
|
|
9
|
+
runId: string;
|
|
10
|
+
/** 会话的 agent(工具调用上下文、策略判定用)。 */
|
|
11
|
+
agentId: string;
|
|
12
|
+
/** 发起本次运行的人(对话发起人):工具调用用其个人凭据,审计记为 actor。 */
|
|
13
|
+
triggerAccountId: string;
|
|
14
|
+
agent: AgentDefinition;
|
|
15
|
+
agentVersion: number;
|
|
16
|
+
/** 用户中止或到达 deadline 时触发:进行中的模型调用立即停下。 */
|
|
17
|
+
signal: AbortSignal;
|
|
18
|
+
/**
|
|
19
|
+
* 停机信号(与用户中止不同):loop 在下一个步骤边界返回 `interrupted`,不打断进行中的步骤。
|
|
20
|
+
*/
|
|
21
|
+
shutdown: AbortSignal;
|
|
22
|
+
sink: StreamSink;
|
|
23
|
+
/**
|
|
24
|
+
* 下一个步骤间隙要吸收的插话:返回 seq > afterSeq 的 user_message(且只含本轮开始时尚未被消费的,
|
|
25
|
+
* 即 seq 也大于会话的 `consumed_seq`),按 seq 升序。loop 记录吸收到的最大 seq 作为 `consumedUpToSeq`。
|
|
26
|
+
*/
|
|
27
|
+
pendingUserMessages(afterSeq: number): Promise<ConversationEvent[]>;
|
|
28
|
+
limits: {
|
|
29
|
+
maxSteps: number;
|
|
30
|
+
deadline: number;
|
|
31
|
+
};
|
|
32
|
+
/**
|
|
33
|
+
* Kind of the conversation: plugin hooks fire for `chat` and `subagent` (F10, P-18, sub-agents
|
|
34
|
+
* spec §11). Eval replays pass `eval`; when absent, hooks do not fire.
|
|
35
|
+
*/
|
|
36
|
+
conversationKind?: "chat" | "eval" | "subagent";
|
|
37
|
+
/**
|
|
38
|
+
* Set for a sub-agent's run (phase C): the dispatch this run serves. Its tools use the parent
|
|
39
|
+
* conversation's sandbox (spec §10.1), and it never dispatches sub-agents itself (depth 1).
|
|
40
|
+
*/
|
|
41
|
+
parent?: SubagentParent;
|
|
42
|
+
}
|
|
43
|
+
/** Where a sub-agent's run was dispatched from (its `subagent_dispatches` row). */
|
|
44
|
+
export interface SubagentParent {
|
|
45
|
+
conversationId: string;
|
|
46
|
+
runId: string;
|
|
47
|
+
callId: string;
|
|
48
|
+
/**
|
|
49
|
+
* The child runs another org agent than its parent conversation's (§5.5, `template.source`
|
|
50
|
+
* `agent`): only then the parent agent's current policies are read on top of its own.
|
|
51
|
+
*/
|
|
52
|
+
otherAgent?: boolean;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* 运行在等什么人处理:审批(`approvals` 行)或输入请求(`questions` 行,统一承载 `ask_user`、
|
|
56
|
+
* 插件工具的 `input_required` 与 MCP elicitation)。`expiresAt` 为 ISO 时间。
|
|
57
|
+
* `subagents` (phase C, spec §7.2): sub-agents dispatched in a step are still running; the id is
|
|
58
|
+
* `sa-<runId>-<step>` (no `:`, it is part of BullMQ job ids).
|
|
59
|
+
*/
|
|
60
|
+
export interface WaitingFor {
|
|
61
|
+
kind: "approval" | "input" | "subagents";
|
|
62
|
+
id: string;
|
|
63
|
+
expiresAt: string;
|
|
64
|
+
/** `subagents` only: the step whose sub-agents the run waits for (its timeout stops them). */
|
|
65
|
+
step?: number;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Idempotency key of a parent's `subagent_waiting` event: one per child run and wait (an approval
|
|
69
|
+
* or question id, or `connect-<callId>` for a connect card).
|
|
70
|
+
*/
|
|
71
|
+
export declare const subagentWaitingIdemKey: (childRunId: string, waitId: string) => string;
|
|
72
|
+
/** The id of a run's `subagents` wait in `step` (part of BullMQ job ids, so no `:`). */
|
|
73
|
+
export declare const subagentsWaitId: (runId: string, step: number) => string;
|
|
74
|
+
export type LoopOutcome =
|
|
75
|
+
/** `budget`: a sub-agent run stopped at its parent run's token cap (phase C). */
|
|
76
|
+
{
|
|
77
|
+
kind: "completed" | "max_steps" | "max_duration" | "budget";
|
|
78
|
+
consumedUpToSeq: number;
|
|
79
|
+
} | {
|
|
80
|
+
kind: "aborted";
|
|
81
|
+
}
|
|
82
|
+
/** 停机:已在步骤边界保存好进度,任务需要回到队列。 */
|
|
83
|
+
| {
|
|
84
|
+
kind: "interrupted";
|
|
85
|
+
}
|
|
86
|
+
/** 等待人处理:checkpoint 停在 tools 节点之前,处理后从这里续跑。 */
|
|
87
|
+
| {
|
|
88
|
+
kind: "suspended";
|
|
89
|
+
waitingFor: WaitingFor;
|
|
90
|
+
};
|
|
91
|
+
export interface AgentLoop {
|
|
92
|
+
run(ctx: LoopContext): Promise<LoopOutcome>;
|
|
93
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Idempotency key of a parent's `subagent_waiting` event: one per child run and wait (an approval
|
|
3
|
+
* or question id, or `connect-<callId>` for a connect card).
|
|
4
|
+
*/
|
|
5
|
+
export const subagentWaitingIdemKey = (childRunId, waitId) => `subagent_waiting:${childRunId}:${waitId}`;
|
|
6
|
+
/** The id of a run's `subagents` wait in `step` (part of BullMQ job ids, so no `:`). */
|
|
7
|
+
export const subagentsWaitId = (runId, step) => `sa-${runId}-${step}`;
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import type { Logger } from "@capybara-hq/plugin-sdk";
|
|
2
|
+
import { type Job, type JobsOptions } from "bullmq";
|
|
3
|
+
import type { KernelDb } from "../db/kernel-schema.js";
|
|
4
|
+
/**
|
|
5
|
+
* 内核维护队列(不含 `:`):等待超时任务(`wait-timeout`,见 waits.ts)与周期性维护(输出存档清理、
|
|
6
|
+
* 工具漂移检测(见 tools/drift.ts)、等待兜底扫描(`wait-sweep`,见 waits.ts)、沙箱的空闲休眠与不活跃销毁
|
|
7
|
+
* (见 sandbox/lifecycle.ts)等)。整个队列只有一个 Worker(只在 `worker` 角色上启动),
|
|
8
|
+
* 按任务名分派给登记的处理函数。
|
|
9
|
+
* 与运行队列分开:运行 worker 的处理函数、stalled / 失败处理都按「一个任务 = 一次运行」设计;
|
|
10
|
+
* 维护任务短、无会话锁与配额。
|
|
11
|
+
*/
|
|
12
|
+
export declare const MAINTENANCE_QUEUE_NAME = "cap-kernel-maintenance";
|
|
13
|
+
/** 输出存档清理:任务名、job scheduler id(不含 `:`)、周期与每批删除行数。 */
|
|
14
|
+
export declare const OUTPUT_CLEANUP_JOB = "output-cleanup";
|
|
15
|
+
export declare const OUTPUT_CLEANUP_SCHEDULER_ID = "output-cleanup-hourly";
|
|
16
|
+
export declare const OUTPUT_CLEANUP_EVERY_MS = 3600000;
|
|
17
|
+
export declare const OUTPUT_CLEANUP_BATCH = 1000;
|
|
18
|
+
/**
|
|
19
|
+
* Periodic marketplace refresh (C26): job name and job scheduler id (no `:`), every
|
|
20
|
+
* `marketplaces.refreshIntervalMinutes`. One scheduler for all replicas; the handler refreshes each
|
|
21
|
+
* enabled marketplace in turn (see catalog/marketplaces.service.ts). The values keep their old
|
|
22
|
+
* names: the scheduler id is stored in Redis, and renaming it would leave the old scheduler behind.
|
|
23
|
+
*/
|
|
24
|
+
export declare const MARKETPLACES_REFRESH_JOB = "catalogs-refresh";
|
|
25
|
+
export declare const MARKETPLACES_REFRESH_SCHEDULER_ID = "catalogs-refresh-every";
|
|
26
|
+
/**
|
|
27
|
+
* Cleanup of plugin (app bundle) import staging (T25, F-AE): job name and job scheduler id (no
|
|
28
|
+
* `:`), hourly; deletes expired (24-hour) staging rows and their object storage prefixes (see
|
|
29
|
+
* catalog/plugin-import.ts `PluginImport.cleanupExpired`). The values keep their old names: the
|
|
30
|
+
* scheduler id is stored in Redis, so renaming it would leave the old scheduler behind.
|
|
31
|
+
*/
|
|
32
|
+
export declare const PLUGIN_STAGING_CLEANUP_JOB = "app-staging-cleanup";
|
|
33
|
+
export declare const PLUGIN_STAGING_CLEANUP_SCHEDULER_ID = "app-staging-cleanup-hourly";
|
|
34
|
+
export declare const PLUGIN_STAGING_CLEANUP_EVERY_MS = 3600000;
|
|
35
|
+
/** 维护任务的处理函数(`token` 供 `moveToDelayed` 等使用)。 */
|
|
36
|
+
export type MaintenanceHandler = (job: Job, token: string | undefined) => Promise<void>;
|
|
37
|
+
/** 由其他模块登记的周期任务(如漂移检测):scheduler id 与任务名不含 `:`,周期在登记时读取。 */
|
|
38
|
+
export interface MaintenanceSchedule {
|
|
39
|
+
id: string;
|
|
40
|
+
name: string;
|
|
41
|
+
everyMs: () => number;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* 删除已过期(`expires_at < now()`)的输出存档,每批 `batch` 行,直到删完;返回删除的总行数。
|
|
45
|
+
* 每批一条独立语句(不开长事务);多个 worker 同时清理时 `SKIP LOCKED` 互不等待。
|
|
46
|
+
*/
|
|
47
|
+
export declare function deleteExpiredOutputs(db: KernelDb, batch?: number): Promise<number>;
|
|
48
|
+
export interface MaintenanceDeps {
|
|
49
|
+
db: KernelDb;
|
|
50
|
+
redisUrl: string;
|
|
51
|
+
log: Pick<Logger, "error" | "warn" | "info">;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* 维护队列的生产方与(worker 角色上的)唯一 Worker。状态都在 Redis / PG,没有进程内定时器:
|
|
55
|
+
* 周期任务用 BullMQ job scheduler(`upsertJobScheduler` 幂等,多副本重复调用只有一个 scheduler)。
|
|
56
|
+
*/
|
|
57
|
+
export declare class Maintenance {
|
|
58
|
+
private readonly d;
|
|
59
|
+
private queue;
|
|
60
|
+
private queueConn;
|
|
61
|
+
private worker;
|
|
62
|
+
private workerConn;
|
|
63
|
+
private closed;
|
|
64
|
+
private readonly handlers;
|
|
65
|
+
private readonly schedules;
|
|
66
|
+
constructor(d: MaintenanceDeps);
|
|
67
|
+
/** 登记某个任务名的处理函数(构造期调用;Worker 启动前后都可)。 */
|
|
68
|
+
handle(name: string, fn: MaintenanceHandler): void;
|
|
69
|
+
/** 登记一个周期任务(构造期调用;`ensureSchedules` 时一并 upsert)。 */
|
|
70
|
+
schedule(s: MaintenanceSchedule): void;
|
|
71
|
+
/** 投递一个维护任务。 */
|
|
72
|
+
add(name: string, data: unknown, opts: JobsOptions): Promise<void>;
|
|
73
|
+
/** 登记周期任务的 job scheduler(幂等;worker 角色启动时调用)。 */
|
|
74
|
+
ensureSchedules(): Promise<void>;
|
|
75
|
+
/** 启动维护队列的 Worker(只在含 `worker` 角色的进程)。 */
|
|
76
|
+
startWorker(): void;
|
|
77
|
+
close(): Promise<void>;
|
|
78
|
+
private getQueue;
|
|
79
|
+
private process;
|
|
80
|
+
}
|