@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,244 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { isSkillName, parseSkillMd, SKILL_ENTRY_FILE, SKILL_LIMITS, skillInvocation, ToolError, validateSkillPackage, } from "@capybara-hq/plugin-sdk";
|
|
3
|
+
import { parse as parseYaml, stringify as stringifyYaml } from "yaml";
|
|
4
|
+
import { storedInvocation } from "../../skills/package.js";
|
|
5
|
+
import { display } from "./sandbox/common.js";
|
|
6
|
+
/**
|
|
7
|
+
* 内置工具 `skill_write`(M5 T15,R4):agent 新建或更新它自己的技能(`scope = agent`)。
|
|
8
|
+
* - 输入 `{ name, description, files: [{ path, content }] }`,只收文本文件,整个技能 ≤ {@link SKILL_WRITE_MAX_BYTES};
|
|
9
|
+
* - the kernel generates SKILL.md ({@link buildSkillWrite}): its frontmatter is `name` / `description`
|
|
10
|
+
* plus the invocation keys (`disable-model-invocation`, `context`, ... phase D) of the frontmatter
|
|
11
|
+
* of the `SKILL.md` entry in `files`, whose other keys are dropped; its body is that entry's body
|
|
12
|
+
* (empty without the entry);
|
|
13
|
+
* - 每次调用写一个完整的新版本(上一版有、这次没给的文件不再属于新版本);
|
|
14
|
+
* - 私有 agent 直接生成新版本并立即生效;共享 agent 由触发对话的人先确认这次调用(R3 固定 ask,见 tools/policy.ts),
|
|
15
|
+
* 再生成变更申请等负责人批准,期间只有本对话试用新版本(见 skills/changes.service.ts);
|
|
16
|
+
* - 成功后立即在日志追加技能目录快照(`skills_catalog`,Ruling M17),同一运行的下一步就能 `skill_load`。
|
|
17
|
+
*/
|
|
18
|
+
/** 一个技能(含合成的 SKILL.md)的总大小上限(UTF-8 字节)。 */
|
|
19
|
+
export const SKILL_WRITE_MAX_BYTES = 1024 * 1024;
|
|
20
|
+
/** 一次最多的文件数(含 SKILL.md)。 */
|
|
21
|
+
export const SKILL_WRITE_MAX_FILES = 200;
|
|
22
|
+
const SPEC = {
|
|
23
|
+
name: "skill_write",
|
|
24
|
+
description: "Create or update one of this agent's own skills: reusable instructions plus optional text files " +
|
|
25
|
+
"(scripts, templates, reference notes) that you or later conversations can load with skill_load. " +
|
|
26
|
+
"Each call writes a complete new version. SKILL.md is generated for you: its frontmatter comes from " +
|
|
27
|
+
"`name` and `description`, and its body is the content of the `SKILL.md` entry in `files` if you " +
|
|
28
|
+
"include one (its frontmatter is dropped, except the invocation keys disable-model-invocation, " +
|
|
29
|
+
"user-invocable, context, agent, argument-hint and arguments, which are kept; with " +
|
|
30
|
+
"disable-model-invocation: true only a person can invoke the skill and you cannot load it). " +
|
|
31
|
+
"Every other entry in `files` is stored at " +
|
|
32
|
+
"/skills/<name>/<path>. Files of the previous version that you leave out are not part of the new " +
|
|
33
|
+
"version. Text files only, at most 1 MB per skill in total. Use an existing skill's name to update " +
|
|
34
|
+
"it; an organization skill with the same name is shadowed by this agent's own skill. On a private " +
|
|
35
|
+
"agent the new version takes effect immediately. On a shared agent the change is sent to the " +
|
|
36
|
+
"agent's owner for approval and is usable only in this conversation until approved.",
|
|
37
|
+
inputSchema: {
|
|
38
|
+
type: "object",
|
|
39
|
+
properties: {
|
|
40
|
+
name: {
|
|
41
|
+
type: "string",
|
|
42
|
+
minLength: 1,
|
|
43
|
+
maxLength: SKILL_LIMITS.nameMaxChars,
|
|
44
|
+
description: 'Skill name: lowercase letters, digits and single hyphens, e.g. "weekly-report". Also the folder name under /skills/.',
|
|
45
|
+
},
|
|
46
|
+
description: {
|
|
47
|
+
type: "string",
|
|
48
|
+
minLength: 1,
|
|
49
|
+
maxLength: SKILL_LIMITS.descriptionMaxChars,
|
|
50
|
+
description: "What the skill does and when to use it, in one or two sentences (shown in the skills list). No XML tags.",
|
|
51
|
+
},
|
|
52
|
+
files: {
|
|
53
|
+
type: "array",
|
|
54
|
+
maxItems: SKILL_WRITE_MAX_FILES,
|
|
55
|
+
description: 'The skill\'s files. Include {"path": "SKILL.md", "content": "<instructions in Markdown>"} for the body; other paths are relative, e.g. "scripts/build.sh".',
|
|
56
|
+
items: {
|
|
57
|
+
type: "object",
|
|
58
|
+
properties: {
|
|
59
|
+
path: { type: "string", minLength: 1, maxLength: SKILL_LIMITS.pathMaxChars },
|
|
60
|
+
content: { type: "string", description: "The full text content of the file." },
|
|
61
|
+
},
|
|
62
|
+
required: ["path", "content"],
|
|
63
|
+
additionalProperties: false,
|
|
64
|
+
},
|
|
65
|
+
},
|
|
66
|
+
},
|
|
67
|
+
required: ["name", "description", "files"],
|
|
68
|
+
additionalProperties: false,
|
|
69
|
+
},
|
|
70
|
+
};
|
|
71
|
+
/**
|
|
72
|
+
* Splits off a leading YAML frontmatter (the same rule as `parseSkillMd`: a first line `---`, then a
|
|
73
|
+
* later `---` line): the body after it and the frontmatter text (null when there is none).
|
|
74
|
+
*/
|
|
75
|
+
function splitFrontmatter(text) {
|
|
76
|
+
const src = (text.startsWith("\uFEFF") ? text.slice(1) : text).replace(/\r\n?/g, "\n");
|
|
77
|
+
const lines = src.split("\n");
|
|
78
|
+
if (lines[0]?.trimEnd() !== "---")
|
|
79
|
+
return { body: src, front: null };
|
|
80
|
+
const end = lines.findIndex((l, i) => i > 0 && l.trimEnd() === "---");
|
|
81
|
+
if (end < 0)
|
|
82
|
+
return { body: src, front: null };
|
|
83
|
+
return { body: lines.slice(end + 1).join("\n"), front: lines.slice(1, end).join("\n") };
|
|
84
|
+
}
|
|
85
|
+
/** The invocation keys (phase D) kept from the frontmatter of the `SKILL.md` entry. */
|
|
86
|
+
const INVOCATION_KEYS = [
|
|
87
|
+
"disable-model-invocation",
|
|
88
|
+
"user-invocable",
|
|
89
|
+
"context",
|
|
90
|
+
"agent",
|
|
91
|
+
"argument-hint",
|
|
92
|
+
"arguments",
|
|
93
|
+
];
|
|
94
|
+
/** The invocation keys of a frontmatter text; unparsable YAML or a non-mapping keeps none. */
|
|
95
|
+
function invocationKeysOf(front) {
|
|
96
|
+
if (front === null)
|
|
97
|
+
return {};
|
|
98
|
+
let data;
|
|
99
|
+
try {
|
|
100
|
+
data = parseYaml(front, { maxAliasCount: 50 });
|
|
101
|
+
}
|
|
102
|
+
catch {
|
|
103
|
+
return {};
|
|
104
|
+
}
|
|
105
|
+
if (data === null || typeof data !== "object" || Array.isArray(data))
|
|
106
|
+
return {};
|
|
107
|
+
const out = {};
|
|
108
|
+
for (const key of INVOCATION_KEYS) {
|
|
109
|
+
const v = data[key];
|
|
110
|
+
if (v !== undefined)
|
|
111
|
+
out[key] = v;
|
|
112
|
+
}
|
|
113
|
+
return out;
|
|
114
|
+
}
|
|
115
|
+
const enc = new TextEncoder();
|
|
116
|
+
const sha256 = (b) => createHash("sha256").update(b).digest("hex");
|
|
117
|
+
/**
|
|
118
|
+
* 由工具输入合成技能文件(纯函数):
|
|
119
|
+
* - SKILL.md = `---\n<yaml name/description>---\n\n<正文>\n`,正文为 `files` 里 `SKILL.md` 的内容去掉 frontmatter、
|
|
120
|
+
* 去掉首尾空行;合成结果再用 `parseSkillMd` 校验(名字规则、描述长度、不含 XML 标签);
|
|
121
|
+
* - 其余文件按 `validateSkillPackage` 校验路径(不能越出 `/skills/<name>/`、不能重复、大小写冲突等);
|
|
122
|
+
* - 只收文本:内容含 NUL 视为二进制,拒绝;全部文件(含 SKILL.md)的 UTF-8 字节数之和 ≤ {@link SKILL_WRITE_MAX_BYTES}。
|
|
123
|
+
* 返回合成结果或全部问题(英文,直接给模型)。
|
|
124
|
+
*/
|
|
125
|
+
export function buildSkillWrite(input) {
|
|
126
|
+
const errors = [];
|
|
127
|
+
if (!isSkillName(input.name)) {
|
|
128
|
+
errors.push(`name "${String(input.name).slice(0, 80)}" is invalid: use 1-64 lowercase letters, digits and single hyphens (no leading or trailing hyphen)`);
|
|
129
|
+
}
|
|
130
|
+
if (input.description.includes("\u0000")) {
|
|
131
|
+
errors.push("description: only text is supported (it contains NUL bytes)");
|
|
132
|
+
}
|
|
133
|
+
const entries = input.files.filter((f) => f.path === SKILL_ENTRY_FILE);
|
|
134
|
+
if (entries.length > 1)
|
|
135
|
+
errors.push(`${SKILL_ENTRY_FILE}: duplicate path`);
|
|
136
|
+
const split = splitFrontmatter(entries[0]?.content ?? "");
|
|
137
|
+
const body = split.body.replace(/^\n+|\s+$/g, "");
|
|
138
|
+
const keys = invocationKeysOf(split.front);
|
|
139
|
+
const front = stringifyYaml({ name: input.name, description: input.description.trim(), ...keys }, { lineWidth: 0 });
|
|
140
|
+
const md = `---\n${front}---\n${body === "" ? "" : `\n${body}\n`}`;
|
|
141
|
+
let invocation;
|
|
142
|
+
if (errors.length === 0) {
|
|
143
|
+
const parsed = parseSkillMd(md);
|
|
144
|
+
if ("errors" in parsed)
|
|
145
|
+
errors.push(...parsed.errors);
|
|
146
|
+
else
|
|
147
|
+
invocation = storedInvocation(skillInvocation(parsed.frontmatter));
|
|
148
|
+
}
|
|
149
|
+
const others = input.files.filter((f) => f.path !== SKILL_ENTRY_FILE);
|
|
150
|
+
const files = [];
|
|
151
|
+
const mdData = enc.encode(md);
|
|
152
|
+
files.push({
|
|
153
|
+
path: SKILL_ENTRY_FILE,
|
|
154
|
+
data: mdData,
|
|
155
|
+
size: mdData.byteLength,
|
|
156
|
+
sha256: sha256(mdData),
|
|
157
|
+
});
|
|
158
|
+
for (const f of input.files) {
|
|
159
|
+
if (!f.content.includes("\u0000"))
|
|
160
|
+
continue;
|
|
161
|
+
errors.push(`${f.path.slice(0, 200)}: only text files are supported (the content contains NUL bytes)`);
|
|
162
|
+
}
|
|
163
|
+
for (const f of others) {
|
|
164
|
+
if (f.content.includes("\u0000"))
|
|
165
|
+
continue;
|
|
166
|
+
const data = enc.encode(f.content);
|
|
167
|
+
files.push({ path: f.path, data, size: data.byteLength, sha256: sha256(data) });
|
|
168
|
+
}
|
|
169
|
+
errors.push(...validateSkillPackage(files.map((f) => ({ path: f.path, size: f.size }))));
|
|
170
|
+
const total = files.reduce((n, f) => n + f.size, 0);
|
|
171
|
+
if (total > SKILL_WRITE_MAX_BYTES) {
|
|
172
|
+
errors.push(`the skill is ${total} bytes in total, over the 1 MB (${SKILL_WRITE_MAX_BYTES} bytes) limit; shorten the files or move large data out of the skill`);
|
|
173
|
+
}
|
|
174
|
+
if (errors.length > 0)
|
|
175
|
+
return { errors };
|
|
176
|
+
const description = input.description.trim();
|
|
177
|
+
return {
|
|
178
|
+
name: input.name,
|
|
179
|
+
description,
|
|
180
|
+
files,
|
|
181
|
+
manifest: {
|
|
182
|
+
name: input.name,
|
|
183
|
+
description,
|
|
184
|
+
files: files.map(({ path, size, sha256 }) => ({ path, size, sha256 })),
|
|
185
|
+
...(invocation !== undefined && { invocation }),
|
|
186
|
+
},
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
/** 内置工具 `skill_write`(见文件头)。 */
|
|
190
|
+
export function skillWriteTool(deps) {
|
|
191
|
+
return {
|
|
192
|
+
spec: SPEC,
|
|
193
|
+
// 私有 agent 不询问;共享 agent 由 R3 固定 ask 把关(tools/policy.ts 的 R3_SHARED_AGENT_ONLY_TOOL_KEYS)
|
|
194
|
+
defaultPolicy: "allow",
|
|
195
|
+
async run(input, ctx) {
|
|
196
|
+
const built = buildSkillWrite(input);
|
|
197
|
+
if ("errors" in built) {
|
|
198
|
+
throw new ToolError(`The skill was not written. Fix these problems and call skill_write again:\n- ${built.errors.slice(0, 20).join("\n- ")}`);
|
|
199
|
+
}
|
|
200
|
+
const r = await deps.changes.write({
|
|
201
|
+
orgId: ctx.orgId,
|
|
202
|
+
agentId: ctx.agentId,
|
|
203
|
+
accountId: ctx.accountId,
|
|
204
|
+
conversationId: ctx.conversationId,
|
|
205
|
+
...(ctx.runId !== undefined && { runId: ctx.runId }),
|
|
206
|
+
}, built);
|
|
207
|
+
const name = built.name;
|
|
208
|
+
// A manual-only version (phase D) is not in the model's catalog, so skill_load cannot load it
|
|
209
|
+
const manualOnly = built.manifest.invocation?.model === false;
|
|
210
|
+
const manualText = `It is manual-only (disable-model-invocation: true): it is not in your skills catalog and ` +
|
|
211
|
+
`skill_load cannot load it; a person invokes it with /${name}.`;
|
|
212
|
+
if (r.kind === "version") {
|
|
213
|
+
const what = r.created ? "Created" : "Updated";
|
|
214
|
+
return {
|
|
215
|
+
content: [
|
|
216
|
+
{
|
|
217
|
+
type: "text",
|
|
218
|
+
text: `${what} skill "${name}" (version ${r.version}, ${built.files.length} files). ` +
|
|
219
|
+
(manualOnly
|
|
220
|
+
? `It is in effect now for every conversation with this agent. ${manualText}`
|
|
221
|
+
: "It is in effect now for every conversation with this agent; call skill_load to use it."),
|
|
222
|
+
},
|
|
223
|
+
],
|
|
224
|
+
display: display(`${r.created ? "新建" : "更新"}技能 ${name}(版本 ${r.version})`, `${what} skill ${name} (version ${r.version})`),
|
|
225
|
+
};
|
|
226
|
+
}
|
|
227
|
+
return {
|
|
228
|
+
content: [
|
|
229
|
+
{
|
|
230
|
+
type: "text",
|
|
231
|
+
text: `Saved skill "${name}" (version ${r.version}, ${built.files.length} files) as a change ` +
|
|
232
|
+
"awaiting the owner's approval, because this agent is shared. Until the owner approves it, " +
|
|
233
|
+
(manualOnly
|
|
234
|
+
? `the new version applies only in this conversation; other conversations keep the current version. ${manualText} `
|
|
235
|
+
: "the new version is usable only in this conversation (call skill_load to use it); other " +
|
|
236
|
+
"conversations keep the current version. ") +
|
|
237
|
+
"Tell the user the change needs the owner's approval.",
|
|
238
|
+
},
|
|
239
|
+
],
|
|
240
|
+
display: display(`技能 ${name} 的改动(版本 ${r.version})已提交,等待负责人批准`, `Change to skill ${name} (version ${r.version}) awaits the owner's approval`),
|
|
241
|
+
};
|
|
242
|
+
},
|
|
243
|
+
};
|
|
244
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { ToolSpec } from "@capybara-hq/plugin-sdk";
|
|
2
|
+
import { type BuiltinTool, type ResolvedTool } from "../registry.js";
|
|
3
|
+
/** 内置工具名。 */
|
|
4
|
+
export declare const TOOL_SEARCH = "tool_search";
|
|
5
|
+
export declare const TOOL_SEARCH_SPEC: ToolSpec;
|
|
6
|
+
/** 目录(system 第二个块)的开头说明(模型可见,英文)。 */
|
|
7
|
+
export declare const CATALOG_HEADER: string;
|
|
8
|
+
/** 调用目录里尚未加载的工具(模型可见,英文;spec 5.5:不自动加载)。 */
|
|
9
|
+
export declare const notLoadedText: (key: string) => string;
|
|
10
|
+
/** 始终完整加载、不进目录的工具(内置工具)。 */
|
|
11
|
+
export declare const isAlwaysLoaded: (key: string) => boolean;
|
|
12
|
+
type CatalogTool = Pick<ResolvedTool, "key" | "spec">;
|
|
13
|
+
/** 分词:切开驼峰,按非字母数字切分,转小写。 */
|
|
14
|
+
export declare function tokenize(text: string): string[];
|
|
15
|
+
/**
|
|
16
|
+
* 关键词评分(确定性):对每个不同的查询词,`idf × (key 中出现 ? 2 : 0 + 描述中出现 ? 1 : 0)`,
|
|
17
|
+
* `idf = ln(1 + N / df)`(df = 含该词的工具数)。只看是否出现、不按长度归一,描述长短不影响排名。
|
|
18
|
+
* 分数为 0 的不返回;按分数降序,同分按 key 升序。
|
|
19
|
+
*/
|
|
20
|
+
export declare function searchTools<T extends CatalogTool>(query: string, tools: readonly T[], limit: number): T[];
|
|
21
|
+
/** 目录行:`- <key>: <描述的第一行>`(超长截断)。 */
|
|
22
|
+
export declare function catalogLine(t: CatalogTool): string;
|
|
23
|
+
/** 目录全文:开头说明 + 按 key 排序的目录行。只依赖工具集合,与加载状态无关(缓存前缀稳定)。 */
|
|
24
|
+
export declare function catalogText(tools: readonly CatalogTool[]): string;
|
|
25
|
+
/**
|
|
26
|
+
* 内置工具 `tool_search`(spec 5.5):在本次运行可用、但未直接加载的工具中按关键词搜索,返回完整定义,
|
|
27
|
+
* 并在结果里带 `loadedTools`(管线写进 `tool_result.loadedTools`;已加载集合只由日志还原)。
|
|
28
|
+
* 搜索范围来自管线传入的 `ctx.tools`(本步解析出的工具);内置工具始终加载,不参与搜索。
|
|
29
|
+
*/
|
|
30
|
+
export declare function toolSearchTool(): BuiltinTool;
|
|
31
|
+
export {};
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
import { BUILTIN_TOOL_NAMES } from "../registry.js";
|
|
2
|
+
/** 内置工具名。 */
|
|
3
|
+
export const TOOL_SEARCH = "tool_search";
|
|
4
|
+
/** 默认返回的匹配数。 */
|
|
5
|
+
const DEFAULT_LIMIT = 5;
|
|
6
|
+
/** 单次最多返回的匹配数。 */
|
|
7
|
+
const MAX_LIMIT = 10;
|
|
8
|
+
/** 目录行里描述的最大字符数。 */
|
|
9
|
+
const MAX_CATALOG_DESCRIPTION = 200;
|
|
10
|
+
/** key 中的词比描述中的词权重更高(key 是工具最直接的名字)。 */
|
|
11
|
+
const KEY_WEIGHT = 2;
|
|
12
|
+
export const TOOL_SEARCH_SPEC = {
|
|
13
|
+
name: TOOL_SEARCH,
|
|
14
|
+
// Display only (the tool row; not in the fingerprint, never sent to the model).
|
|
15
|
+
keyArgs: ["query"],
|
|
16
|
+
description: "Search the tool catalog by keywords and load the matching tools. Tools listed in the " +
|
|
17
|
+
"catalog are not loaded: call this tool first with keywords from the task (for example the " +
|
|
18
|
+
"app, object or action), then call the loaded tools from your next step on. Returns the full " +
|
|
19
|
+
"definition (name, description, input schema) of the best matches. Do not use it for tools " +
|
|
20
|
+
"you already have.",
|
|
21
|
+
inputSchema: {
|
|
22
|
+
type: "object",
|
|
23
|
+
properties: {
|
|
24
|
+
query: {
|
|
25
|
+
type: "string",
|
|
26
|
+
minLength: 1,
|
|
27
|
+
maxLength: 500,
|
|
28
|
+
description: "Keywords describing the tool you need, e.g. 'create calendar event'.",
|
|
29
|
+
},
|
|
30
|
+
limit: {
|
|
31
|
+
type: "integer",
|
|
32
|
+
minimum: 1,
|
|
33
|
+
maximum: MAX_LIMIT,
|
|
34
|
+
description: `Maximum number of tools to load. Default ${DEFAULT_LIMIT}.`,
|
|
35
|
+
},
|
|
36
|
+
},
|
|
37
|
+
required: ["query"],
|
|
38
|
+
additionalProperties: false,
|
|
39
|
+
},
|
|
40
|
+
annotations: { readOnlyHint: true },
|
|
41
|
+
};
|
|
42
|
+
/** 目录(system 第二个块)的开头说明(模型可见,英文)。 */
|
|
43
|
+
export const CATALOG_HEADER = "More tools are available but not loaded. To use one, first call tool_search with keywords; " +
|
|
44
|
+
"it returns the full definitions and loads the matching tools for your next step. " +
|
|
45
|
+
"Calling a tool that is not loaded returns an error. Tool catalog:";
|
|
46
|
+
/** 调用目录里尚未加载的工具(模型可见,英文;spec 5.5:不自动加载)。 */
|
|
47
|
+
export const notLoadedText = (key) => `Tool "${key}" is not loaded. Call tool_search first with keywords for this tool, then call it in a later step.`;
|
|
48
|
+
/** 始终完整加载、不进目录的工具(内置工具)。 */
|
|
49
|
+
export const isAlwaysLoaded = (key) => BUILTIN_TOOL_NAMES.includes(key);
|
|
50
|
+
/** 分词:切开驼峰,按非字母数字切分,转小写。 */
|
|
51
|
+
export function tokenize(text) {
|
|
52
|
+
return text
|
|
53
|
+
.replace(/([\p{Ll}\p{N}])(\p{Lu})/gu, "$1 $2")
|
|
54
|
+
.toLowerCase()
|
|
55
|
+
.split(/[^\p{L}\p{N}]+/u)
|
|
56
|
+
.filter((t) => t !== "");
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* 关键词评分(确定性):对每个不同的查询词,`idf × (key 中出现 ? 2 : 0 + 描述中出现 ? 1 : 0)`,
|
|
60
|
+
* `idf = ln(1 + N / df)`(df = 含该词的工具数)。只看是否出现、不按长度归一,描述长短不影响排名。
|
|
61
|
+
* 分数为 0 的不返回;按分数降序,同分按 key 升序。
|
|
62
|
+
*/
|
|
63
|
+
export function searchTools(query, tools, limit) {
|
|
64
|
+
const terms = [...new Set(tokenize(query))];
|
|
65
|
+
if (terms.length === 0)
|
|
66
|
+
return [];
|
|
67
|
+
const docs = tools.map((t) => ({
|
|
68
|
+
tool: t,
|
|
69
|
+
key: new Set(tokenize(t.key)),
|
|
70
|
+
desc: new Set(tokenize(t.spec.description)),
|
|
71
|
+
}));
|
|
72
|
+
const n = docs.length;
|
|
73
|
+
const idf = new Map();
|
|
74
|
+
for (const term of terms) {
|
|
75
|
+
const df = docs.filter((d) => d.key.has(term) || d.desc.has(term)).length;
|
|
76
|
+
idf.set(term, df === 0 ? 0 : Math.log(1 + n / df));
|
|
77
|
+
}
|
|
78
|
+
return docs
|
|
79
|
+
.map((d) => {
|
|
80
|
+
let score = 0;
|
|
81
|
+
for (const term of terms) {
|
|
82
|
+
const w = (d.key.has(term) ? KEY_WEIGHT : 0) + (d.desc.has(term) ? 1 : 0);
|
|
83
|
+
score += w * (idf.get(term) ?? 0);
|
|
84
|
+
}
|
|
85
|
+
return { tool: d.tool, score };
|
|
86
|
+
})
|
|
87
|
+
.filter((x) => x.score > 0)
|
|
88
|
+
.sort((a, b) => b.score !== a.score
|
|
89
|
+
? b.score - a.score
|
|
90
|
+
: a.tool.key < b.tool.key
|
|
91
|
+
? -1
|
|
92
|
+
: a.tool.key > b.tool.key
|
|
93
|
+
? 1
|
|
94
|
+
: 0)
|
|
95
|
+
.slice(0, limit)
|
|
96
|
+
.map((x) => x.tool);
|
|
97
|
+
}
|
|
98
|
+
/** 目录行:`- <key>: <描述的第一行>`(超长截断)。 */
|
|
99
|
+
export function catalogLine(t) {
|
|
100
|
+
const first = t.spec.description
|
|
101
|
+
.split("\n")
|
|
102
|
+
.map((l) => l.trim())
|
|
103
|
+
.find((l) => l !== "") ?? "";
|
|
104
|
+
const desc = first.length > MAX_CATALOG_DESCRIPTION
|
|
105
|
+
? `${first.slice(0, MAX_CATALOG_DESCRIPTION - 1)}…`
|
|
106
|
+
: first;
|
|
107
|
+
return `- ${t.key}: ${desc}`;
|
|
108
|
+
}
|
|
109
|
+
/** 目录全文:开头说明 + 按 key 排序的目录行。只依赖工具集合,与加载状态无关(缓存前缀稳定)。 */
|
|
110
|
+
export function catalogText(tools) {
|
|
111
|
+
const sorted = [...tools].sort((a, b) => (a.key < b.key ? -1 : a.key > b.key ? 1 : 0));
|
|
112
|
+
return [CATALOG_HEADER, ...sorted.map(catalogLine)].join("\n");
|
|
113
|
+
}
|
|
114
|
+
/** 一个工具的完整定义文本(tool_search 的结果)。 */
|
|
115
|
+
function definitionText(t) {
|
|
116
|
+
return [
|
|
117
|
+
`Tool: ${t.key}`,
|
|
118
|
+
`Description: ${t.spec.description}`,
|
|
119
|
+
`Input schema: ${JSON.stringify(t.spec.inputSchema)}`,
|
|
120
|
+
].join("\n");
|
|
121
|
+
}
|
|
122
|
+
/** 显示摘要里的查询词上限(码点):摘要整体须 ≤ 200 码点(`validateToolDisplay`)。 */
|
|
123
|
+
const DISPLAY_QUERY_MAX = 120;
|
|
124
|
+
/** 摘要里的查询词:压成一行,超长按码点截断加省略号。 */
|
|
125
|
+
function displayQuery(query) {
|
|
126
|
+
const one = query.replace(/\s+/g, " ").trim();
|
|
127
|
+
const cps = [...one];
|
|
128
|
+
return cps.length > DISPLAY_QUERY_MAX ? `${cps.slice(0, DISPLAY_QUERY_MAX - 1).join("")}…` : one;
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* 内置工具 `tool_search`(spec 5.5):在本次运行可用、但未直接加载的工具中按关键词搜索,返回完整定义,
|
|
132
|
+
* 并在结果里带 `loadedTools`(管线写进 `tool_result.loadedTools`;已加载集合只由日志还原)。
|
|
133
|
+
* 搜索范围来自管线传入的 `ctx.tools`(本步解析出的工具);内置工具始终加载,不参与搜索。
|
|
134
|
+
*/
|
|
135
|
+
export function toolSearchTool() {
|
|
136
|
+
return {
|
|
137
|
+
spec: TOOL_SEARCH_SPEC,
|
|
138
|
+
defaultPolicy: "allow",
|
|
139
|
+
async run(input, ctx) {
|
|
140
|
+
const { query, limit = DEFAULT_LIMIT } = input;
|
|
141
|
+
const catalog = (ctx.tools ?? []).filter((t) => !isAlwaysLoaded(t.key));
|
|
142
|
+
const found = searchTools(query, catalog, limit);
|
|
143
|
+
const q = displayQuery(query);
|
|
144
|
+
if (found.length === 0) {
|
|
145
|
+
return {
|
|
146
|
+
content: [
|
|
147
|
+
{
|
|
148
|
+
type: "text",
|
|
149
|
+
text: `No tools matched "${query}". Try other keywords, or check the tool catalog in the system prompt.`,
|
|
150
|
+
},
|
|
151
|
+
],
|
|
152
|
+
loadedTools: [],
|
|
153
|
+
display: {
|
|
154
|
+
summary: { zh: `搜索工具「${q}」· 无匹配`, en: `Searched tools for "${q}" · no match` },
|
|
155
|
+
},
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
const head = `Loaded ${found.length} tool${found.length === 1 ? "" : "s"}. You can call ${found.length === 1 ? "it" : "them"} from your next step.`;
|
|
159
|
+
return {
|
|
160
|
+
content: [{ type: "text", text: [head, ...found.map(definitionText)].join("\n\n") }],
|
|
161
|
+
loadedTools: found.map((t) => t.key),
|
|
162
|
+
display: {
|
|
163
|
+
summary: {
|
|
164
|
+
zh: `搜索工具「${q}」· 加载 ${found.length} 个`,
|
|
165
|
+
en: `Searched tools for "${q}" · loaded ${found.length}`,
|
|
166
|
+
},
|
|
167
|
+
},
|
|
168
|
+
};
|
|
169
|
+
},
|
|
170
|
+
};
|
|
171
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { type Principal } from "../identity/principal.js";
|
|
3
|
+
import { type OrgContext } from "../orgs/org.guard.js";
|
|
4
|
+
import type { ConnectorContent, ConnectorPromptView, ConnectorResourceView, ConnectorUnavailable } from "./connector-content.js";
|
|
5
|
+
declare const PromptBody: z.ZodObject<{
|
|
6
|
+
arguments: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodString>>;
|
|
7
|
+
}, z.core.$strict>;
|
|
8
|
+
declare const ResourcesQuery: z.ZodObject<{
|
|
9
|
+
query: z.ZodOptional<z.ZodString>;
|
|
10
|
+
}, z.core.$strip>;
|
|
11
|
+
/**
|
|
12
|
+
* 连接器内容(`/api/v1/orgs/:orgId/connectors/...`):网页输入框的 `/` 斜杠命令(prompts)与 `@` 资源引用。
|
|
13
|
+
* 都是 `connectors.use`、仅限用户主体,以发起人自己的凭据访问连接器(个人连接器须已连接)。
|
|
14
|
+
* 静态路径 `prompts` / `resources` 优先于 ConnectorsController 的 `:connectorId`。
|
|
15
|
+
*/
|
|
16
|
+
export declare class ConnectorContentController {
|
|
17
|
+
private readonly content;
|
|
18
|
+
constructor(content: ConnectorContent);
|
|
19
|
+
/** 发起人可用的提示模板;缺凭据 / 连不上的连接器列在 `unavailable`。 */
|
|
20
|
+
prompts(principal: Principal, org: OrgContext): Promise<{
|
|
21
|
+
prompts: ConnectorPromptView[];
|
|
22
|
+
unavailable: ConnectorUnavailable[];
|
|
23
|
+
}>;
|
|
24
|
+
/** 发起人可用的资源,`query` 按名称 / URI / 描述子串过滤。 */
|
|
25
|
+
resources(principal: Principal, org: OrgContext, q: z.infer<typeof ResourcesQuery>): Promise<{
|
|
26
|
+
resources: ConnectorResourceView[];
|
|
27
|
+
unavailable: ConnectorUnavailable[];
|
|
28
|
+
}>;
|
|
29
|
+
/** 按参数渲染一个提示模板为文本(放进输入框,由用户发送)。 */
|
|
30
|
+
renderPrompt(principal: Principal, org: OrgContext, connectorId: string, name: string, body: z.infer<typeof PromptBody>): Promise<{
|
|
31
|
+
text: string;
|
|
32
|
+
}>;
|
|
33
|
+
}
|
|
34
|
+
export {};
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
8
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
9
|
+
};
|
|
10
|
+
import { Body, Controller, Get, HttpCode, Inject, Param, Post, Query } from "@nestjs/common";
|
|
11
|
+
import { z } from "zod";
|
|
12
|
+
import { CONNECTOR_CONTENT } from "../http/tokens.js";
|
|
13
|
+
import { ZodPipe } from "../http/zod.pipe.js";
|
|
14
|
+
import { CurrentPrincipal, requireUser } from "../identity/principal.js";
|
|
15
|
+
import { CurrentOrg, OrgAction } from "../orgs/org.guard.js";
|
|
16
|
+
const PromptBody = z
|
|
17
|
+
.object({
|
|
18
|
+
arguments: z
|
|
19
|
+
.record(z.string().min(1).max(200), z.string().max(10_000))
|
|
20
|
+
.refine((v) => Object.keys(v).length <= 50, { message: "Too many arguments" })
|
|
21
|
+
.default({}),
|
|
22
|
+
})
|
|
23
|
+
.strict();
|
|
24
|
+
const ResourcesQuery = z.object({ query: z.string().max(200).optional() });
|
|
25
|
+
/**
|
|
26
|
+
* 连接器内容(`/api/v1/orgs/:orgId/connectors/...`):网页输入框的 `/` 斜杠命令(prompts)与 `@` 资源引用。
|
|
27
|
+
* 都是 `connectors.use`、仅限用户主体,以发起人自己的凭据访问连接器(个人连接器须已连接)。
|
|
28
|
+
* 静态路径 `prompts` / `resources` 优先于 ConnectorsController 的 `:connectorId`。
|
|
29
|
+
*/
|
|
30
|
+
let ConnectorContentController = class ConnectorContentController {
|
|
31
|
+
content;
|
|
32
|
+
constructor(content) {
|
|
33
|
+
this.content = content;
|
|
34
|
+
}
|
|
35
|
+
/** 发起人可用的提示模板;缺凭据 / 连不上的连接器列在 `unavailable`。 */
|
|
36
|
+
async prompts(principal, org) {
|
|
37
|
+
const p = requireUser(principal);
|
|
38
|
+
return this.content.listPrompts(org.orgId, p.account.id);
|
|
39
|
+
}
|
|
40
|
+
/** 发起人可用的资源,`query` 按名称 / URI / 描述子串过滤。 */
|
|
41
|
+
async resources(principal, org, q) {
|
|
42
|
+
const p = requireUser(principal);
|
|
43
|
+
return this.content.listResources(org.orgId, p.account.id, q.query);
|
|
44
|
+
}
|
|
45
|
+
/** 按参数渲染一个提示模板为文本(放进输入框,由用户发送)。 */
|
|
46
|
+
async renderPrompt(principal, org, connectorId, name, body) {
|
|
47
|
+
const p = requireUser(principal);
|
|
48
|
+
return this.content.getPrompt(org.orgId, connectorId, name, body.arguments, p.account.id);
|
|
49
|
+
}
|
|
50
|
+
};
|
|
51
|
+
__decorate([
|
|
52
|
+
Get("prompts"),
|
|
53
|
+
OrgAction("connectors.use"),
|
|
54
|
+
__param(0, CurrentPrincipal()),
|
|
55
|
+
__param(1, CurrentOrg())
|
|
56
|
+
], ConnectorContentController.prototype, "prompts", null);
|
|
57
|
+
__decorate([
|
|
58
|
+
Get("resources"),
|
|
59
|
+
OrgAction("connectors.use"),
|
|
60
|
+
__param(0, CurrentPrincipal()),
|
|
61
|
+
__param(1, CurrentOrg()),
|
|
62
|
+
__param(2, Query(new ZodPipe(ResourcesQuery)))
|
|
63
|
+
], ConnectorContentController.prototype, "resources", null);
|
|
64
|
+
__decorate([
|
|
65
|
+
Post(":connectorId/prompts/:name"),
|
|
66
|
+
HttpCode(200),
|
|
67
|
+
OrgAction("connectors.use"),
|
|
68
|
+
__param(0, CurrentPrincipal()),
|
|
69
|
+
__param(1, CurrentOrg()),
|
|
70
|
+
__param(2, Param("connectorId")),
|
|
71
|
+
__param(3, Param("name")),
|
|
72
|
+
__param(4, Body(new ZodPipe(PromptBody)))
|
|
73
|
+
], ConnectorContentController.prototype, "renderPrompt", null);
|
|
74
|
+
ConnectorContentController = __decorate([
|
|
75
|
+
Controller("api/v1/orgs/:orgId/connectors"),
|
|
76
|
+
__param(0, Inject(CONNECTOR_CONTENT))
|
|
77
|
+
], ConnectorContentController);
|
|
78
|
+
export { ConnectorContentController };
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import type { Logger, PromptInfo } from "@capybara-hq/plugin-sdk";
|
|
2
|
+
import type { KernelConfig } from "../config/schema.js";
|
|
3
|
+
import type { KernelDb } from "../db/kernel-schema.js";
|
|
4
|
+
import type { Breaker } from "./breaker.js";
|
|
5
|
+
import { type Credentials } from "./credentials.js";
|
|
6
|
+
import type { ToolRegistry } from "./registry.js";
|
|
7
|
+
/** 每个附件的正文上限(字符)。 */
|
|
8
|
+
export declare const MAX_ATTACHMENT_CHARS = 50000;
|
|
9
|
+
/** 一条消息最多附件数。 */
|
|
10
|
+
export declare const MAX_ATTACHMENTS = 5;
|
|
11
|
+
export interface ConnectorPromptView {
|
|
12
|
+
connectorId: string;
|
|
13
|
+
connectorSlug: string;
|
|
14
|
+
connectorName: string;
|
|
15
|
+
name: string;
|
|
16
|
+
title?: string;
|
|
17
|
+
description?: string;
|
|
18
|
+
arguments: PromptInfo["arguments"];
|
|
19
|
+
}
|
|
20
|
+
export interface ConnectorResourceView {
|
|
21
|
+
connectorId: string;
|
|
22
|
+
connectorSlug: string;
|
|
23
|
+
connectorName: string;
|
|
24
|
+
uri: string;
|
|
25
|
+
name: string;
|
|
26
|
+
description?: string;
|
|
27
|
+
mimeType?: string;
|
|
28
|
+
}
|
|
29
|
+
/** 列表时某个连接器不可用:发起人没有连接个人凭据,或连接 / 列出失败(含熔断打开)。 */
|
|
30
|
+
export interface ConnectorUnavailable {
|
|
31
|
+
connectorId: string;
|
|
32
|
+
connectorName: string;
|
|
33
|
+
reason: "not_connected" | "failed";
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* 附件元数据(存在 user_message 里,界面据此显示附件而不是正文)。字段名是事件 payload 的一部分,
|
|
37
|
+
* 改名后仍为 `appId` / `appName`(C27:日志确定性)。
|
|
38
|
+
*/
|
|
39
|
+
export interface AttachmentMeta {
|
|
40
|
+
appId: string;
|
|
41
|
+
appName: string;
|
|
42
|
+
uri: string;
|
|
43
|
+
name: string;
|
|
44
|
+
}
|
|
45
|
+
export interface ConnectorContentDeps {
|
|
46
|
+
db: KernelDb;
|
|
47
|
+
registry: Pick<ToolRegistry, "findConnector">;
|
|
48
|
+
credentials: Pick<Credentials, "injection" | "onUnauthorized">;
|
|
49
|
+
breaker: Pick<Breaker, "check">;
|
|
50
|
+
config: () => KernelConfig;
|
|
51
|
+
log: Logger;
|
|
52
|
+
}
|
|
53
|
+
export declare class ConnectorContent {
|
|
54
|
+
private readonly d;
|
|
55
|
+
constructor(d: ConnectorContentDeps);
|
|
56
|
+
private activeConnectors;
|
|
57
|
+
private connectorRow;
|
|
58
|
+
/**
|
|
59
|
+
* 读取资源受管理员对该连接器 `read_resource` 工具(`source = 'resources'`)的启停约束(Ruling A23):
|
|
60
|
+
* 返回其中该工具为 enabled 的连接器 id。
|
|
61
|
+
*/
|
|
62
|
+
private resourcesEnabled;
|
|
63
|
+
/**
|
|
64
|
+
* 以 `accountId` 的凭据打开连接器会话执行 `work`,结果按本次注入的凭据打码,会话无论成败都关闭。
|
|
65
|
+
* 缺凭据 → `credential.missing`;熔断打开、连接 / 远端失败 → 502 `connector.connect_failed`(消息打码、限长)。
|
|
66
|
+
* `work` 返回 undefined 表示该连接器不支持这项能力。
|
|
67
|
+
*/
|
|
68
|
+
private withSession;
|
|
69
|
+
/** 对每个 active 连接器并行执行 `work`;缺凭据 / 失败的连接器进 `unavailable`,不支持的(undefined)跳过。 */
|
|
70
|
+
private acrossConnectors;
|
|
71
|
+
/** 发起人可用的全部提示模板(按连接器创建顺序,连接器内按远端顺序)。 */
|
|
72
|
+
listPrompts(orgId: string, accountId: string): Promise<{
|
|
73
|
+
prompts: ConnectorPromptView[];
|
|
74
|
+
unavailable: ConnectorUnavailable[];
|
|
75
|
+
}>;
|
|
76
|
+
/**
|
|
77
|
+
* 渲染一个提示模板为文本(供用户放进输入框再发送):各消息的文本按顺序以空行连接,assistant 消息加
|
|
78
|
+
* `Assistant:` 前缀;非文本内容给类型说明。连接器不支持 prompts → 404 `connector.not_found`。
|
|
79
|
+
*/
|
|
80
|
+
getPrompt(orgId: string, connectorId: string, name: string, args: Record<string, string>, accountId: string): Promise<{
|
|
81
|
+
text: string;
|
|
82
|
+
}>;
|
|
83
|
+
/** 发起人可用的资源;`query` 按名称 / URI / 描述的子串过滤(不区分大小写),最多 {@link MAX_RESOURCES} 条。 */
|
|
84
|
+
listResources(orgId: string, accountId: string, query?: string): Promise<{
|
|
85
|
+
resources: ConnectorResourceView[];
|
|
86
|
+
unavailable: ConnectorUnavailable[];
|
|
87
|
+
}>;
|
|
88
|
+
/**
|
|
89
|
+
* 解析消息附件:以发送者的凭据**并行**读取每个资源(打码、每个限 {@link MAX_ATTACHMENT_CHARS} 字符;总时限
|
|
90
|
+
* min(`tools.timeoutMs`, 30s)),按请求顺序返回要追加在用户消息后的文本块与元数据。名称取资源清单里的 name
|
|
91
|
+
* (读不到清单时用 URI)。连接器的 `read_resource` 工具被管理员停用 → 409 `connector.resources_disabled`。
|
|
92
|
+
* 任一附件失败整条消息失败(不写入)。
|
|
93
|
+
*/
|
|
94
|
+
resolveAttachments(orgId: string, accountId: string, refs: {
|
|
95
|
+
connectorId: string;
|
|
96
|
+
uri: string;
|
|
97
|
+
}[]): Promise<{
|
|
98
|
+
blocks: {
|
|
99
|
+
type: "text";
|
|
100
|
+
text: string;
|
|
101
|
+
}[];
|
|
102
|
+
attachments: AttachmentMeta[];
|
|
103
|
+
}>;
|
|
104
|
+
}
|