@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,27 @@
|
|
|
1
|
+
import { type TranslationItem } from "./report.js";
|
|
2
|
+
/**
|
|
3
|
+
* Claude Code `agents/*.md` -> Capybara agent templates (sub-agents spec §16.4). Pure: no I/O. The
|
|
4
|
+
* source file is never rewritten: each imported agent becomes a generated template
|
|
5
|
+
* `.capybara-generated/agents/<name>.md` whose frontmatter is the translated fields (written as
|
|
6
|
+
* JSON, which is YAML) and whose body is the source body, byte for byte. Every problem is a report
|
|
7
|
+
* item; nothing here refuses the import.
|
|
8
|
+
*/
|
|
9
|
+
/** Where the generated templates live. */
|
|
10
|
+
export declare const GENERATED_AGENTS_DIR = ".capybara-generated/agents";
|
|
11
|
+
/** One translated agent. */
|
|
12
|
+
export interface TranslatedAgent {
|
|
13
|
+
name: string;
|
|
14
|
+
/** The source file. */
|
|
15
|
+
source: string;
|
|
16
|
+
/** The generated template's path. */
|
|
17
|
+
path: string;
|
|
18
|
+
data: Uint8Array;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Translates the agent files at `paths` of plugin `plugin` (in the order given; the first of a name
|
|
22
|
+
* wins). Returns the generated templates and the report items.
|
|
23
|
+
*/
|
|
24
|
+
export declare function translateClaudeAgents(files: ReadonlyMap<string, Uint8Array>, paths: readonly string[], plugin: string): {
|
|
25
|
+
agents: TranslatedAgent[];
|
|
26
|
+
items: TranslationItem[];
|
|
27
|
+
};
|
|
@@ -0,0 +1,270 @@
|
|
|
1
|
+
import { AGENT_TEMPLATE_LIMITS, AGENT_TEMPLATE_NAME_RE, isSkillName, parseAgentTemplate, } from "@capybara-hq/plugin-sdk";
|
|
2
|
+
import { parse as parseYaml } from "yaml";
|
|
3
|
+
import { cut, decodeUtf8, isObj, showName } from "./manifest.js";
|
|
4
|
+
import { item } from "./report.js";
|
|
5
|
+
/**
|
|
6
|
+
* Claude Code `agents/*.md` -> Capybara agent templates (sub-agents spec §16.4). Pure: no I/O. The
|
|
7
|
+
* source file is never rewritten: each imported agent becomes a generated template
|
|
8
|
+
* `.capybara-generated/agents/<name>.md` whose frontmatter is the translated fields (written as
|
|
9
|
+
* JSON, which is YAML) and whose body is the source body, byte for byte. Every problem is a report
|
|
10
|
+
* item; nothing here refuses the import.
|
|
11
|
+
*/
|
|
12
|
+
/** Where the generated templates live. */
|
|
13
|
+
export const GENERATED_AGENTS_DIR = ".capybara-generated/agents";
|
|
14
|
+
/** Claude Code tool names -> Capybara tool keys (spec §16.4; anything else is dropped). */
|
|
15
|
+
const TOOL_MAP = {
|
|
16
|
+
Bash: "sandbox_bash",
|
|
17
|
+
Read: "sandbox_read",
|
|
18
|
+
Write: "sandbox_write",
|
|
19
|
+
Edit: "sandbox_edit",
|
|
20
|
+
MultiEdit: "sandbox_edit",
|
|
21
|
+
Glob: "sandbox_glob",
|
|
22
|
+
Grep: "sandbox_grep",
|
|
23
|
+
Skill: "skill_load",
|
|
24
|
+
TodoWrite: "todo__write",
|
|
25
|
+
ToolSearch: "tool_search",
|
|
26
|
+
};
|
|
27
|
+
/** Claude ignores these for plugin agents: `not_applicable`. */
|
|
28
|
+
const NOT_APPLICABLE = new Set(["permissionMode", "hooks", "mcpServers"]);
|
|
29
|
+
/** Fields Capybara does not translate: `agent_field_ignored` (with any unknown field). */
|
|
30
|
+
const MAPPED = new Set([
|
|
31
|
+
"name",
|
|
32
|
+
"description",
|
|
33
|
+
"tools",
|
|
34
|
+
"disallowedTools",
|
|
35
|
+
"model",
|
|
36
|
+
"maxTurns",
|
|
37
|
+
"skills",
|
|
38
|
+
"effort",
|
|
39
|
+
]);
|
|
40
|
+
const ALIASES = {
|
|
41
|
+
haiku: "fast",
|
|
42
|
+
sonnet: "standard",
|
|
43
|
+
opus: "capable",
|
|
44
|
+
fable: "capable",
|
|
45
|
+
inherit: "inherit",
|
|
46
|
+
};
|
|
47
|
+
const FAMILIES = [
|
|
48
|
+
[/haiku/i, "fast"],
|
|
49
|
+
[/sonnet/i, "standard"],
|
|
50
|
+
[/opus|fable/i, "capable"],
|
|
51
|
+
];
|
|
52
|
+
const EFFORTS = new Set(["low", "medium", "high", "xhigh", "max"]);
|
|
53
|
+
const FRONTMATTER_MAX_CHARS = 64 * 1024;
|
|
54
|
+
/** Splits a tool list (a YAML list, or a comma separated string; commas inside `(…)` kept). */
|
|
55
|
+
function toolNames(v) {
|
|
56
|
+
if (Array.isArray(v))
|
|
57
|
+
return v.every((x) => typeof x === "string") ? v.map((x) => x.trim()) : null;
|
|
58
|
+
if (typeof v !== "string")
|
|
59
|
+
return null;
|
|
60
|
+
const out = [];
|
|
61
|
+
let depth = 0;
|
|
62
|
+
let cur = "";
|
|
63
|
+
for (const ch of v) {
|
|
64
|
+
if (ch === "(")
|
|
65
|
+
depth++;
|
|
66
|
+
else if (ch === ")")
|
|
67
|
+
depth = Math.max(0, depth - 1);
|
|
68
|
+
if (ch === "," && depth === 0) {
|
|
69
|
+
out.push(cur.trim());
|
|
70
|
+
cur = "";
|
|
71
|
+
}
|
|
72
|
+
else
|
|
73
|
+
cur += ch;
|
|
74
|
+
}
|
|
75
|
+
out.push(cur.trim());
|
|
76
|
+
return out.filter((x) => x !== "");
|
|
77
|
+
}
|
|
78
|
+
/** The frontmatter mapping and the raw body (after the closing `---` line), or a problem. */
|
|
79
|
+
function split(text) {
|
|
80
|
+
const src = text.startsWith("") ? text.slice(1) : text;
|
|
81
|
+
const m = /^---[ \t]*\r?\n/.exec(src);
|
|
82
|
+
if (!m)
|
|
83
|
+
return { problem: "no YAML frontmatter" };
|
|
84
|
+
const rest = src.slice(m[0].length);
|
|
85
|
+
const close = /^---[ \t]*(?:\r?\n|$)/m.exec(rest);
|
|
86
|
+
if (!close)
|
|
87
|
+
return { problem: "the frontmatter is not closed by a '---' line" };
|
|
88
|
+
const front = rest.slice(0, close.index);
|
|
89
|
+
if (front.length > FRONTMATTER_MAX_CHARS)
|
|
90
|
+
return { problem: "the frontmatter is too long" };
|
|
91
|
+
let data;
|
|
92
|
+
try {
|
|
93
|
+
data = parseYaml(front, { uniqueKeys: true, maxAliasCount: 50 });
|
|
94
|
+
}
|
|
95
|
+
catch (e) {
|
|
96
|
+
return { problem: `the frontmatter is not valid YAML: ${String(e).split("\n")[0]}` };
|
|
97
|
+
}
|
|
98
|
+
if (!isObj(data))
|
|
99
|
+
return { problem: "the frontmatter is not a YAML mapping" };
|
|
100
|
+
return { fm: data, body: rest.slice(close.index + close[0].length) };
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Translates the agent files at `paths` of plugin `plugin` (in the order given; the first of a name
|
|
104
|
+
* wins). Returns the generated templates and the report items.
|
|
105
|
+
*/
|
|
106
|
+
export function translateClaudeAgents(files, paths, plugin) {
|
|
107
|
+
const items = [];
|
|
108
|
+
const agents = [];
|
|
109
|
+
for (const source of paths) {
|
|
110
|
+
const base = source.split("/").pop().replace(/\.md$/, "");
|
|
111
|
+
const at = { path: source };
|
|
112
|
+
const invalid = (label, problem) => items.push(item("agent_invalid", "agent", showName(label), { ...at, detail: { problem } }));
|
|
113
|
+
const data = files.get(source);
|
|
114
|
+
const text = data === undefined ? undefined : decodeUtf8(data);
|
|
115
|
+
if (text === undefined) {
|
|
116
|
+
invalid(base, data === undefined ? "file not found" : "not valid UTF-8 text");
|
|
117
|
+
continue;
|
|
118
|
+
}
|
|
119
|
+
const parts = split(text);
|
|
120
|
+
if ("problem" in parts) {
|
|
121
|
+
invalid(base, parts.problem);
|
|
122
|
+
continue;
|
|
123
|
+
}
|
|
124
|
+
const { fm, body } = parts;
|
|
125
|
+
const name = fm.name;
|
|
126
|
+
if (typeof name !== "string" || name.trim() === "") {
|
|
127
|
+
invalid(base, "name is required");
|
|
128
|
+
continue;
|
|
129
|
+
}
|
|
130
|
+
if (!AGENT_TEMPLATE_NAME_RE.test(name)) {
|
|
131
|
+
invalid(name, "name must match ^[a-z0-9][a-z0-9-]{0,63}$ (agents are never renamed)");
|
|
132
|
+
continue;
|
|
133
|
+
}
|
|
134
|
+
if (typeof fm.description !== "string" || fm.description.trim() === "") {
|
|
135
|
+
invalid(name, "description is required");
|
|
136
|
+
continue;
|
|
137
|
+
}
|
|
138
|
+
if (agents.some((a) => a.name === name)) {
|
|
139
|
+
invalid(name, `the name ${name} is also used by another agent of this plugin`);
|
|
140
|
+
continue;
|
|
141
|
+
}
|
|
142
|
+
if (agents.length >= AGENT_TEMPLATE_LIMITS.perPlugin) {
|
|
143
|
+
invalid(name, `a plugin may have at most ${AGENT_TEMPLATE_LIMITS.perPlugin} agents`);
|
|
144
|
+
continue;
|
|
145
|
+
}
|
|
146
|
+
const add = (code, detail) => items.push(item(code, "agent", name, { ...at, detail }));
|
|
147
|
+
const out = {
|
|
148
|
+
name,
|
|
149
|
+
description: cut(fm.description, AGENT_TEMPLATE_LIMITS.descriptionChars),
|
|
150
|
+
};
|
|
151
|
+
const ignored = [];
|
|
152
|
+
const unmapped = [];
|
|
153
|
+
const narrowed = [];
|
|
154
|
+
// tools: an allowlist; a pattern such as Bash(git:*) is dropped (mapping it would widen it)
|
|
155
|
+
if (fm.tools !== undefined) {
|
|
156
|
+
const names = toolNames(fm.tools);
|
|
157
|
+
if (names === null)
|
|
158
|
+
ignored.push("tools");
|
|
159
|
+
// "*" anywhere (Claude's wildcard) inherits the parent's tools: never wider, but said
|
|
160
|
+
else if (names.includes("*"))
|
|
161
|
+
add("agent_tools_inherited", {});
|
|
162
|
+
else {
|
|
163
|
+
const keys = [];
|
|
164
|
+
for (const n of names) {
|
|
165
|
+
const k = TOOL_MAP[n];
|
|
166
|
+
if (k === undefined)
|
|
167
|
+
unmapped.push(n);
|
|
168
|
+
else if (!keys.includes(k))
|
|
169
|
+
keys.push(k);
|
|
170
|
+
}
|
|
171
|
+
out.tools = keys;
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
// disallowedTools: a pattern disallows its whole tool (narrower, never wider)
|
|
175
|
+
if (fm.disallowedTools !== undefined) {
|
|
176
|
+
const names = toolNames(fm.disallowedTools);
|
|
177
|
+
if (names === null)
|
|
178
|
+
ignored.push("disallowedTools");
|
|
179
|
+
else {
|
|
180
|
+
const keys = [];
|
|
181
|
+
for (const n of names) {
|
|
182
|
+
const k = TOOL_MAP[n.replace(/\(.*$/s, "").trim()];
|
|
183
|
+
if (k === undefined)
|
|
184
|
+
unmapped.push(n);
|
|
185
|
+
else if (!keys.includes(k))
|
|
186
|
+
keys.push(k);
|
|
187
|
+
if (k !== undefined && n.includes("("))
|
|
188
|
+
narrowed.push(n);
|
|
189
|
+
}
|
|
190
|
+
if (keys.length > 0)
|
|
191
|
+
out.disallowedTools = keys;
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
if (fm.model !== undefined) {
|
|
195
|
+
const raw = typeof fm.model === "string" ? fm.model.trim() : "";
|
|
196
|
+
const alias = ALIASES[raw];
|
|
197
|
+
if (alias !== undefined)
|
|
198
|
+
out.model = alias;
|
|
199
|
+
else {
|
|
200
|
+
const tier = FAMILIES.find(([re]) => re.test(raw))?.[1] ?? "inherit";
|
|
201
|
+
out.model = tier;
|
|
202
|
+
add("agent_model_mapped", { from: showName(raw || String(fm.model)), to: tier });
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
if (fm.maxTurns !== undefined) {
|
|
206
|
+
if (Number.isInteger(fm.maxTurns) && fm.maxTurns >= 1) {
|
|
207
|
+
out.maxSteps = fm.maxTurns;
|
|
208
|
+
}
|
|
209
|
+
else
|
|
210
|
+
ignored.push("maxTurns");
|
|
211
|
+
}
|
|
212
|
+
if (fm.effort !== undefined) {
|
|
213
|
+
if (typeof fm.effort === "string" && EFFORTS.has(fm.effort)) {
|
|
214
|
+
out.effort = fm.effort;
|
|
215
|
+
}
|
|
216
|
+
else
|
|
217
|
+
ignored.push("effort");
|
|
218
|
+
}
|
|
219
|
+
if (fm.skills !== undefined) {
|
|
220
|
+
const list = toolNames(fm.skills);
|
|
221
|
+
if (list === null)
|
|
222
|
+
ignored.push("skills");
|
|
223
|
+
else {
|
|
224
|
+
const kept = [];
|
|
225
|
+
const dropped = [];
|
|
226
|
+
for (const s of list) {
|
|
227
|
+
const own = s.startsWith(`${plugin}:`) ? s.slice(plugin.length + 1) : s;
|
|
228
|
+
if (isSkillName(own) && kept.length < AGENT_TEMPLATE_LIMITS.skills && !kept.includes(own))
|
|
229
|
+
kept.push(own);
|
|
230
|
+
else
|
|
231
|
+
dropped.push(s);
|
|
232
|
+
}
|
|
233
|
+
if (kept.length > 0)
|
|
234
|
+
out.skills = kept;
|
|
235
|
+
if (dropped.length > 0)
|
|
236
|
+
add("agent_skills_truncated", { skills: dropped.join(", ") });
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
const notApplicable = Object.keys(fm).filter((k) => NOT_APPLICABLE.has(k));
|
|
240
|
+
ignored.push(...Object.keys(fm).filter((k) => !MAPPED.has(k) && !NOT_APPLICABLE.has(k)));
|
|
241
|
+
if (unmapped.length > 0)
|
|
242
|
+
add("agent_tools_unmapped", { tools: unmapped.join(", ") });
|
|
243
|
+
if (narrowed.length > 0)
|
|
244
|
+
add("agent_tools_narrowed", { tools: narrowed.join(", ") });
|
|
245
|
+
if (notApplicable.length > 0) {
|
|
246
|
+
add("not_applicable", { keys: notApplicable.sort().join(", ") });
|
|
247
|
+
}
|
|
248
|
+
if (ignored.length > 0) {
|
|
249
|
+
add("agent_field_ignored", { keys: ignored.map(showName).sort().join(", ") });
|
|
250
|
+
}
|
|
251
|
+
// The generated template: translated frontmatter (JSON is YAML), the body unchanged
|
|
252
|
+
const generated = `---\n${JSON.stringify(out, null, 2)}\n---\n${body}`;
|
|
253
|
+
const check = parseAgentTemplate(generated);
|
|
254
|
+
if ("errors" in check) {
|
|
255
|
+
invalid(name, check.errors.join("; "));
|
|
256
|
+
continue;
|
|
257
|
+
}
|
|
258
|
+
agents.push({
|
|
259
|
+
name,
|
|
260
|
+
source,
|
|
261
|
+
path: `${GENERATED_AGENTS_DIR}/${name}.md`,
|
|
262
|
+
data: new TextEncoder().encode(generated),
|
|
263
|
+
});
|
|
264
|
+
items.push(item("agent_imported", "agent", name, {
|
|
265
|
+
...at,
|
|
266
|
+
detail: { type: `${plugin}:${name}`, model: out.model ?? "inherit" },
|
|
267
|
+
}));
|
|
268
|
+
}
|
|
269
|
+
return { agents, items };
|
|
270
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { type DroppedInvocationKey } from "../../skills/invocation-keys.js";
|
|
2
|
+
import { type TranslationComponent, type TranslationItem } from "./report.js";
|
|
3
|
+
/**
|
|
4
|
+
* Claude Code commands (`commands/*.md`, listed paths, or the `commands` object map with `source`
|
|
5
|
+
* or inline `content`) become ordinary skills (phase D spec §8.2, decided 2026-10-27: the model can
|
|
6
|
+
* invoke them too, as in Claude Code; only `disable-model-invocation: true` makes one manual-only).
|
|
7
|
+
* Each command's generated SKILL.md lives at `.capybara-generated/commands/<name>/SKILL.md`; the
|
|
8
|
+
* source file is never rewritten. Pure: no I/O.
|
|
9
|
+
*/
|
|
10
|
+
/** Where the generated SKILL.md of each command lives. */
|
|
11
|
+
export declare const GENERATED_COMMANDS_DIR = ".capybara-generated/commands";
|
|
12
|
+
/** Folded into the content digest of a plugin whose translation phase D changed (§8.3). */
|
|
13
|
+
export declare const CLAUDE_TRANSLATOR_REVISION = "claude-translation-2";
|
|
14
|
+
/**
|
|
15
|
+
* The `skill_invocation_key_ignored` item of a skill or command whose invocation keys the strict
|
|
16
|
+
* checks refuse (they are left out; batch 1 review M3, I4), or none.
|
|
17
|
+
*/
|
|
18
|
+
export declare function invocationKeyItems(component: TranslationComponent, name: string, at: {
|
|
19
|
+
path?: string;
|
|
20
|
+
}, dropped: readonly DroppedInvocationKey[]): TranslationItem[];
|
|
21
|
+
/** The result of {@link translateClaudeCommands}. */
|
|
22
|
+
export interface TranslatedCommands {
|
|
23
|
+
/** Generated files: `.capybara-generated/commands/<name>/SKILL.md`. */
|
|
24
|
+
generated: Map<string, Uint8Array>;
|
|
25
|
+
/** The generated skill directories, for the manifest's `skills` (in command order). */
|
|
26
|
+
skillPaths: string[];
|
|
27
|
+
/** The generated skills' names and directories, in the same order. */
|
|
28
|
+
skills: {
|
|
29
|
+
name: string;
|
|
30
|
+
dir: string;
|
|
31
|
+
}[];
|
|
32
|
+
/** Per command: `command_imported` or `command_invalid`, then the skill items. */
|
|
33
|
+
items: TranslationItem[];
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Translates the commands (see the file header). `skillNames` are the plugin's imported skills (a
|
|
37
|
+
* skill wins over a command of the same name, as in Claude Code); `room` is how many more skills
|
|
38
|
+
* the plugin may have. `skillItems` adds the per-skill items (manual-only, forked, shell
|
|
39
|
+
* injections, ignored restrictions) the translator reports for skills too.
|
|
40
|
+
*/
|
|
41
|
+
export declare function translateClaudeCommands(files: ReadonlyMap<string, Uint8Array>, commands: {
|
|
42
|
+
name: string;
|
|
43
|
+
path?: string;
|
|
44
|
+
content?: string;
|
|
45
|
+
}[], skillNames: ReadonlySet<string>, opts: {
|
|
46
|
+
room: number;
|
|
47
|
+
skillItems: (component: "command", name: string, at: {
|
|
48
|
+
path?: string;
|
|
49
|
+
}, fm: Readonly<Record<string, unknown>>, body: string) => TranslationItem[];
|
|
50
|
+
}): TranslatedCommands;
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
import { isSkillName, parseSkillMd, SKILL_ENTRY_FILE, SKILL_LIMITS } from "@capybara-hq/plugin-sdk";
|
|
2
|
+
import { parse as parseYaml } from "yaml";
|
|
3
|
+
import { cleanInvocationKeys, INVOCATION_KEYS, } from "../../skills/invocation-keys.js";
|
|
4
|
+
import { cut, decodeUtf8, isObj, showName } from "./manifest.js";
|
|
5
|
+
import { item } from "./report.js";
|
|
6
|
+
/**
|
|
7
|
+
* Claude Code commands (`commands/*.md`, listed paths, or the `commands` object map with `source`
|
|
8
|
+
* or inline `content`) become ordinary skills (phase D spec §8.2, decided 2026-10-27: the model can
|
|
9
|
+
* invoke them too, as in Claude Code; only `disable-model-invocation: true` makes one manual-only).
|
|
10
|
+
* Each command's generated SKILL.md lives at `.capybara-generated/commands/<name>/SKILL.md`; the
|
|
11
|
+
* source file is never rewritten. Pure: no I/O.
|
|
12
|
+
*/
|
|
13
|
+
/** Where the generated SKILL.md of each command lives. */
|
|
14
|
+
export const GENERATED_COMMANDS_DIR = ".capybara-generated/commands";
|
|
15
|
+
/** Folded into the content digest of a plugin whose translation phase D changed (§8.3). */
|
|
16
|
+
export const CLAUDE_TRANSLATOR_REVISION = "claude-translation-2";
|
|
17
|
+
/**
|
|
18
|
+
* The `skill_invocation_key_ignored` item of a skill or command whose invocation keys the strict
|
|
19
|
+
* checks refuse (they are left out; batch 1 review M3, I4), or none.
|
|
20
|
+
*/
|
|
21
|
+
export function invocationKeyItems(component, name, at, dropped) {
|
|
22
|
+
if (dropped.length === 0)
|
|
23
|
+
return [];
|
|
24
|
+
return [
|
|
25
|
+
item("skill_invocation_key_ignored", component, name, {
|
|
26
|
+
...at,
|
|
27
|
+
detail: {
|
|
28
|
+
keys: dropped.map((d) => d.key).join(", "),
|
|
29
|
+
problem: dropped.map((d) => d.problem).join("; "),
|
|
30
|
+
},
|
|
31
|
+
}),
|
|
32
|
+
];
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Claude Code's docs write `argument-hint: [pr-number] [priority] [assignee]`, which is not valid
|
|
36
|
+
* YAML. The frontmatter with every top-level `argument-hint:` value quoted as written, or null
|
|
37
|
+
* when there is none to quote.
|
|
38
|
+
*/
|
|
39
|
+
function quoteArgumentHint(front) {
|
|
40
|
+
let changed = false;
|
|
41
|
+
const lines = front.split("\n").map((l) => {
|
|
42
|
+
const m = /^argument-hint:[ \t]*(.*?)[ \t]*$/.exec(l);
|
|
43
|
+
if (m === null || m[1] === "")
|
|
44
|
+
return l;
|
|
45
|
+
changed = true;
|
|
46
|
+
return `argument-hint: ${JSON.stringify(m[1])}`;
|
|
47
|
+
});
|
|
48
|
+
return changed ? lines.join("\n") : null;
|
|
49
|
+
}
|
|
50
|
+
const readYaml = (text) => parseYaml(text, { uniqueKeys: true, maxAliasCount: 50 });
|
|
51
|
+
const FRONTMATTER_MAX_CHARS = 64 * 1024;
|
|
52
|
+
/** A command's frontmatter mapping and body, or a problem (English, for the report). */
|
|
53
|
+
function readCommand(text) {
|
|
54
|
+
const src = (text.startsWith("") ? text.slice(1) : text).replace(/\r\n?/g, "\n");
|
|
55
|
+
const lines = src.split("\n");
|
|
56
|
+
// A command needs no frontmatter: the whole file is then its body
|
|
57
|
+
if (lines[0]?.trimEnd() !== "---")
|
|
58
|
+
return { fm: {}, body: src };
|
|
59
|
+
const end = lines.findIndex((l, i) => i > 0 && l.trimEnd() === "---");
|
|
60
|
+
if (end < 0)
|
|
61
|
+
return { problem: "the frontmatter is not closed by a '---' line" };
|
|
62
|
+
const front = lines.slice(1, end).join("\n");
|
|
63
|
+
if (front.length > FRONTMATTER_MAX_CHARS)
|
|
64
|
+
return { problem: "the frontmatter is too long" };
|
|
65
|
+
let data;
|
|
66
|
+
try {
|
|
67
|
+
data = readYaml(front);
|
|
68
|
+
}
|
|
69
|
+
catch (e) {
|
|
70
|
+
// Read again with the argument hint quoted (I4); any other problem stays the first error
|
|
71
|
+
const quoted = quoteArgumentHint(front);
|
|
72
|
+
try {
|
|
73
|
+
if (quoted === null)
|
|
74
|
+
throw e;
|
|
75
|
+
data = readYaml(quoted);
|
|
76
|
+
}
|
|
77
|
+
catch {
|
|
78
|
+
return { problem: `the frontmatter is not valid YAML: ${String(e).split("\n")[0]}` };
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
if (data === null || data === undefined)
|
|
82
|
+
data = {};
|
|
83
|
+
if (!isObj(data))
|
|
84
|
+
return { problem: "the frontmatter is not a YAML mapping" };
|
|
85
|
+
return { fm: data, body: lines.slice(end + 1).join("\n") };
|
|
86
|
+
}
|
|
87
|
+
/** The first non-empty body line, flattened to one line and cut to the skill description limit. */
|
|
88
|
+
const firstLine = (body) => {
|
|
89
|
+
const line = body.split("\n").find((l) => l.trim() !== "") ?? "";
|
|
90
|
+
return cut(line.replace(/\s+/g, " "), SKILL_LIMITS.descriptionMaxChars);
|
|
91
|
+
};
|
|
92
|
+
/**
|
|
93
|
+
* Translates the commands (see the file header). `skillNames` are the plugin's imported skills (a
|
|
94
|
+
* skill wins over a command of the same name, as in Claude Code); `room` is how many more skills
|
|
95
|
+
* the plugin may have. `skillItems` adds the per-skill items (manual-only, forked, shell
|
|
96
|
+
* injections, ignored restrictions) the translator reports for skills too.
|
|
97
|
+
*/
|
|
98
|
+
export function translateClaudeCommands(files, commands, skillNames, opts) {
|
|
99
|
+
const generated = new Map();
|
|
100
|
+
const skillPaths = [];
|
|
101
|
+
const skills = [];
|
|
102
|
+
const items = [];
|
|
103
|
+
const taken = new Set();
|
|
104
|
+
for (const c of commands) {
|
|
105
|
+
const at = c.path !== undefined ? { path: c.path } : {};
|
|
106
|
+
const invalid = (problem) => items.push(item("command_invalid", "command", showName(c.name), { ...at, detail: { problem } }));
|
|
107
|
+
if (!isSkillName(c.name)) {
|
|
108
|
+
invalid("the command name must be 1-64 lowercase letters, digits and single hyphens (commands are never renamed)");
|
|
109
|
+
continue;
|
|
110
|
+
}
|
|
111
|
+
if (skillNames.has(c.name)) {
|
|
112
|
+
invalid("a skill of this plugin has this name; the skill wins, as in Claude Code");
|
|
113
|
+
continue;
|
|
114
|
+
}
|
|
115
|
+
if (taken.has(c.name)) {
|
|
116
|
+
invalid("another command of this plugin has this name");
|
|
117
|
+
continue;
|
|
118
|
+
}
|
|
119
|
+
let text;
|
|
120
|
+
if (c.content !== undefined)
|
|
121
|
+
text = c.content;
|
|
122
|
+
else if (c.path !== undefined) {
|
|
123
|
+
const data = files.get(c.path);
|
|
124
|
+
if (data === undefined) {
|
|
125
|
+
invalid("file not found");
|
|
126
|
+
continue;
|
|
127
|
+
}
|
|
128
|
+
text = decodeUtf8(data);
|
|
129
|
+
if (text === undefined) {
|
|
130
|
+
invalid("not valid UTF-8 text");
|
|
131
|
+
continue;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
else {
|
|
135
|
+
invalid("the command has neither a source file nor content");
|
|
136
|
+
continue;
|
|
137
|
+
}
|
|
138
|
+
const parts = readCommand(text);
|
|
139
|
+
if ("problem" in parts) {
|
|
140
|
+
invalid(parts.problem);
|
|
141
|
+
continue;
|
|
142
|
+
}
|
|
143
|
+
const { fm, body } = parts;
|
|
144
|
+
const description = typeof fm.description === "string" && fm.description.trim() !== ""
|
|
145
|
+
? cut(fm.description.replace(/\s+/g, " "), SKILL_LIMITS.descriptionMaxChars)
|
|
146
|
+
: firstLine(body);
|
|
147
|
+
if (description === "") {
|
|
148
|
+
invalid("no description");
|
|
149
|
+
continue;
|
|
150
|
+
}
|
|
151
|
+
if (skills.length >= opts.room) {
|
|
152
|
+
invalid("too many skills");
|
|
153
|
+
continue;
|
|
154
|
+
}
|
|
155
|
+
// Invocation keys the strict checks refuse are left out, with a warning (M3)
|
|
156
|
+
const clean = cleanInvocationKeys(fm);
|
|
157
|
+
const front = { name: c.name, description };
|
|
158
|
+
for (const k of INVOCATION_KEYS) {
|
|
159
|
+
if (clean.frontmatter[k] !== undefined)
|
|
160
|
+
front[k] = clean.frontmatter[k];
|
|
161
|
+
}
|
|
162
|
+
const md = `---\n${JSON.stringify(front, null, 2)}\n---\n${body}`;
|
|
163
|
+
const parsed = parseSkillMd(md);
|
|
164
|
+
if ("errors" in parsed) {
|
|
165
|
+
invalid(parsed.errors.join("; "));
|
|
166
|
+
continue;
|
|
167
|
+
}
|
|
168
|
+
taken.add(c.name);
|
|
169
|
+
const dir = `${GENERATED_COMMANDS_DIR}/${c.name}`;
|
|
170
|
+
generated.set(`${dir}/${SKILL_ENTRY_FILE}`, new TextEncoder().encode(md));
|
|
171
|
+
skillPaths.push(dir);
|
|
172
|
+
skills.push({ name: c.name, dir });
|
|
173
|
+
items.push(item("command_imported", "command", c.name, at));
|
|
174
|
+
items.push(...invocationKeyItems("command", c.name, at, clean.dropped));
|
|
175
|
+
// The invocation keys as the generated SKILL.md has them; the other keys as the command wrote
|
|
176
|
+
items.push(...opts.skillItems("command", c.name, at, { ...clean.frontmatter, ...parsed.frontmatter }, body));
|
|
177
|
+
}
|
|
178
|
+
return { generated, skillPaths, skills, items };
|
|
179
|
+
}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lenient reading of Claude Code's plugin files (`.claude-plugin/plugin.json`, `.mcp.json`,
|
|
3
|
+
* `hooks/hooks.json`; format: spec Appendix A, re-checked against the Claude Code plugins
|
|
4
|
+
* reference on 2026-10-26). Claude's format is open-ended and keeps gaining fields, so there is no
|
|
5
|
+
* schema: every value is type-checked where it is used, and a wrong type is a report item, never
|
|
6
|
+
* an exception (spec §8.1).
|
|
7
|
+
*/
|
|
8
|
+
/** Claude Code's plugin manifest. */
|
|
9
|
+
export declare const CLAUDE_PLUGIN_FILE = ".claude-plugin/plugin.json";
|
|
10
|
+
/**
|
|
11
|
+
* Component fields a marketplace entry may carry (stored in `ClaudeEntryOverlay.components`). The
|
|
12
|
+
* first six are the ones Claude's `strict` rule appends or rejects; the rest apply only to a plugin
|
|
13
|
+
* without its own `plugin.json` (the entry is then the manifest).
|
|
14
|
+
*/
|
|
15
|
+
export declare const CLAUDE_STRICT_COMPONENT_KEYS: readonly ["skills", "commands", "agents", "hooks", "outputStyles", "themes"];
|
|
16
|
+
export declare const CLAUDE_COMPONENT_KEYS: readonly ["skills", "commands", "agents", "hooks", "outputStyles", "themes", "mcpServers", "lspServers", "userConfig", "channels", "monitors", "workflows", "experimental", "settings"];
|
|
17
|
+
/** A Claude marketplace entry's overlay on the plugin (stored per entry, `marketplace_entries.claude`). */
|
|
18
|
+
export interface ClaudeEntryOverlay {
|
|
19
|
+
/** Default true (Claude's rule). */
|
|
20
|
+
strict: boolean;
|
|
21
|
+
/** Component fields of the entry ({@link CLAUDE_COMPONENT_KEYS}), raw JSON. */
|
|
22
|
+
components: Record<string, unknown>;
|
|
23
|
+
/** `author.name` of the entry, else of the marketplace `owner.name`. */
|
|
24
|
+
publisher?: string;
|
|
25
|
+
}
|
|
26
|
+
export declare const isObj: (v: unknown) => v is Record<string, unknown>;
|
|
27
|
+
/**
|
|
28
|
+
* The content digest of a Claude Code plugin (Decision 5, Review Focus 5): {@link contentDigest}
|
|
29
|
+
* of the files as read, never of the translated tree, so it does not depend on the translator.
|
|
30
|
+
* When the marketplace entry carries component fields, they decide what is imported (Claude's
|
|
31
|
+
* `strict` rule), so `strict` and the components (canonical JSON) are folded in: an entry-only
|
|
32
|
+
* change at the same version is other content (`+git.<sha12>` / `+sha256.<12>`), not
|
|
33
|
+
* `catalog.version_exists`. An entry without components gives the files' own digest, the same as
|
|
34
|
+
* a direct git import of the plugin. Entry display fields (description, author) are listing data
|
|
35
|
+
* and are not folded in, as for a Capybara marketplace.
|
|
36
|
+
*
|
|
37
|
+
* Phase D (spec §8.3): `translatorRevision` (the translation's, set only when the tree has a
|
|
38
|
+
* command, a manual-only or a forked skill, whose translation phase D changed) is folded in last,
|
|
39
|
+
* so re-importing such a plugin at an already imported version records `+sha256.<12>` with the
|
|
40
|
+
* new skills, while every other plugin keeps its digest.
|
|
41
|
+
*/
|
|
42
|
+
export declare function claudeContentDigest(files: ReadonlyMap<string, Uint8Array>, overlay: ClaudeEntryOverlay | undefined, translatorRevision?: string): string;
|
|
43
|
+
export declare const decodeUtf8: (data: Uint8Array) => string | undefined;
|
|
44
|
+
/** A JSON file of the tree: its value, or why it could not be read (English, for the report). */
|
|
45
|
+
export type JsonRead = {
|
|
46
|
+
value: unknown;
|
|
47
|
+
} | {
|
|
48
|
+
problem: string;
|
|
49
|
+
};
|
|
50
|
+
/** Reads a JSON file with the plugin manifest's size cap; never throws. */
|
|
51
|
+
export declare function readJsonFile(data: Uint8Array): JsonRead;
|
|
52
|
+
/** Cuts a string to `max` code points (trimmed). */
|
|
53
|
+
export declare const cut: (s: string, max: number) => string;
|
|
54
|
+
/** A short, printable rendering of an untrusted key for the report (see {@link printable}). */
|
|
55
|
+
export declare const showName: (s: string) => string;
|
|
56
|
+
/**
|
|
57
|
+
* Resolves a component path of a Claude manifest (`./x`, or `.` / `./` for the root where
|
|
58
|
+
* `allowRoot`) to a path relative to the plugin root (`""` is the root). A non-string, a path
|
|
59
|
+
* without `./` or the root where it is not allowed is a `{ problem }` (the caller reports it); a
|
|
60
|
+
* path that leaves the root, or is not a safe relative path at all, refuses the import naming it
|
|
61
|
+
* (spec §8.1: paths stay inside the root).
|
|
62
|
+
*/
|
|
63
|
+
export declare function componentPath(p: unknown, where: string, allowRoot?: boolean): {
|
|
64
|
+
rel: string;
|
|
65
|
+
} | {
|
|
66
|
+
problem: string;
|
|
67
|
+
};
|
|
68
|
+
/** A string or an array as a list (anything else is `null`). */
|
|
69
|
+
export declare const asList: (v: unknown) => unknown[] | null;
|