@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,143 @@
|
|
|
1
|
+
import { type AgentTemplate, type ConnectorTemplateFile, type PluginManifest } from "@capybara-hq/plugin-sdk";
|
|
2
|
+
import { LEGACY_FORMAT_MESSAGE, type PackageTgzLimits, packagePath } from "../packages/tgz.js";
|
|
3
|
+
export { LEGACY_FORMAT_MESSAGE, packagePath };
|
|
4
|
+
/**
|
|
5
|
+
* Reads a plugin tgz (spec §4.1): `package/.capybara-plugin/plugin.json` plus the skills, connector
|
|
6
|
+
* templates and extension it describes. The tgz is untrusted input and is unpacked by the extension
|
|
7
|
+
* package tgz rules (`packages/tgz.ts` {@link unpackPackageTgz}: size, decompression cap, entry
|
|
8
|
+
* count, regular files only, safe paths under `package/`). No code from the package runs here; the extension's module graph is
|
|
9
|
+
* checked by `readExtensionPackage`. The checks after unpacking live in {@link readPluginFiles},
|
|
10
|
+
* shared with the git reader (`git-source.ts`), which reads the tree from a commit instead.
|
|
11
|
+
*
|
|
12
|
+
* A tgz in the pre-0.1.0 format (a `capybara` section in package.json, or `app.yaml`, and no
|
|
13
|
+
* plugin.json) is rejected first, with {@link LEGACY_FORMAT_MESSAGE}: there is no reader for the
|
|
14
|
+
* old formats.
|
|
15
|
+
*/
|
|
16
|
+
/** Codes of {@link PluginPackageError}. */
|
|
17
|
+
export type PluginPackageErrorCode = "catalog.invalid_manifest" | "catalog.legacy_format";
|
|
18
|
+
/** The plugin package is invalid; `issues` lists the problems (English, shown to the admin). */
|
|
19
|
+
export declare class PluginPackageError extends Error {
|
|
20
|
+
readonly code: PluginPackageErrorCode;
|
|
21
|
+
readonly issues: string[];
|
|
22
|
+
constructor(code: PluginPackageErrorCode, issues: string[]);
|
|
23
|
+
}
|
|
24
|
+
/** A skill of the plugin. `dir` is relative to the package root; `files` are relative to `dir`. */
|
|
25
|
+
export interface PluginPackageSkill {
|
|
26
|
+
name: string;
|
|
27
|
+
dir: string;
|
|
28
|
+
files: string[];
|
|
29
|
+
}
|
|
30
|
+
/** A connector template of the plugin; `id` is the file's base name. */
|
|
31
|
+
export interface PluginPackageConnectorTemplate {
|
|
32
|
+
id: string;
|
|
33
|
+
/** Relative to the package root (no leading `./`). */
|
|
34
|
+
path: string;
|
|
35
|
+
file: ConnectorTemplateFile;
|
|
36
|
+
}
|
|
37
|
+
/** An agent template of the plugin (sub-agents spec §16.1). */
|
|
38
|
+
export interface PluginPackageAgentTemplate {
|
|
39
|
+
/** The template name (frontmatter `name`); the roster type is `<plugin>:<name>`. */
|
|
40
|
+
name: string;
|
|
41
|
+
/** Relative to the package root (no leading `./`). */
|
|
42
|
+
path: string;
|
|
43
|
+
template: AgentTemplate;
|
|
44
|
+
}
|
|
45
|
+
/** A validated plugin file tree. Paths are relative to the plugin root (no `package/`). */
|
|
46
|
+
export interface PluginContents {
|
|
47
|
+
/** `{}` when a git plugin has no package.json. */
|
|
48
|
+
packageJson: Record<string, unknown>;
|
|
49
|
+
manifest: PluginManifest;
|
|
50
|
+
files: Map<string, Uint8Array>;
|
|
51
|
+
skills: PluginPackageSkill[];
|
|
52
|
+
connectorTemplates: PluginPackageConnectorTemplate[];
|
|
53
|
+
/** Agent templates (listed in plugin.json `agents`, else scanned from `agents/*.md`). */
|
|
54
|
+
agentTemplates: PluginPackageAgentTemplate[];
|
|
55
|
+
/** {@link contentDigest} of `files` (the same for a tgz and a git tree of the same files). */
|
|
56
|
+
contentDigest: string;
|
|
57
|
+
}
|
|
58
|
+
/** A read and validated plugin tgz. */
|
|
59
|
+
export interface PluginPackage extends PluginContents {
|
|
60
|
+
/** Hex sha256 of the whole tgz. */
|
|
61
|
+
sha256: string;
|
|
62
|
+
/** tgz bytes. */
|
|
63
|
+
size: number;
|
|
64
|
+
}
|
|
65
|
+
/** Options of {@link readPluginPackage}; `hostZodVersion` defaults to the kernel's zod. */
|
|
66
|
+
export interface ReadPluginPackageOptions extends PackageTgzLimits {
|
|
67
|
+
hostSdkVersion: string;
|
|
68
|
+
hostZodVersion?: string;
|
|
69
|
+
/**
|
|
70
|
+
* A marketplace archive: a tgz without `plugin.json` whose root has `skills/` is a skills-only
|
|
71
|
+
* plugin with this name and publisher (package.json optional, like git), versioned by `version`
|
|
72
|
+
* (the entry's) or else {@link archiveFallbackVersion} (spec §5.3).
|
|
73
|
+
*/
|
|
74
|
+
fallback?: {
|
|
75
|
+
name: string;
|
|
76
|
+
version?: string;
|
|
77
|
+
publisher: string;
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* The content digest of a plugin's files (Decision 5): sha256 (hex) over the file list sorted by
|
|
82
|
+
* path (code unit order), each entry `path + "\0" + sha256(content) + "\n"`. Paths are relative to
|
|
83
|
+
* the plugin root, so a tgz and a git tree of the same files have the same digest. Paths are hashed
|
|
84
|
+
* byte for byte as they were read: no Unicode normalization (an NFC and an NFD spelling of the same
|
|
85
|
+
* name are different files, as they are to git and tar). Both readers refuse control characters in
|
|
86
|
+
* paths, so `\0` and `\n` cannot occur inside a path and the list is unambiguous; a path with one
|
|
87
|
+
* is refused here too.
|
|
88
|
+
*/
|
|
89
|
+
export declare function contentDigest(files: ReadonlyMap<string, Uint8Array>): string;
|
|
90
|
+
/**
|
|
91
|
+
* The version of an archive plugin that has none (spec §5.3): `0.0.0-sha256.h<12>` from the content
|
|
92
|
+
* digest. The `h` keeps the prerelease identifier alphanumeric (twelve hex digits with a leading
|
|
93
|
+
* zero are not valid semver).
|
|
94
|
+
*/
|
|
95
|
+
export declare const archiveFallbackVersion: (digest: string) => string;
|
|
96
|
+
/** Largest icon (plugin or connector template) in bytes. */
|
|
97
|
+
export declare const PLUGIN_ICON_MAX_BYTES: number;
|
|
98
|
+
/**
|
|
99
|
+
* Whether an icon really is an svg / png (only the file header and UTF-8 text are looked at, nothing
|
|
100
|
+
* is rendered) within {@link PLUGIN_ICON_MAX_BYTES}; undefined when it is.
|
|
101
|
+
*/
|
|
102
|
+
export declare function iconProblem(path: string, data: Uint8Array): string | undefined;
|
|
103
|
+
/**
|
|
104
|
+
* Reads and validates a plugin tgz (see the file header). Invalid -> {@link PluginPackageError}:
|
|
105
|
+
* `catalog.legacy_format` for the pre-0.1.0 format, otherwise `catalog.invalid_manifest` listing
|
|
106
|
+
* every problem it can find, each naming the path it is about (unpacking and manifest parse
|
|
107
|
+
* problems stop at the first stage that fails).
|
|
108
|
+
*/
|
|
109
|
+
export declare function readPluginPackage(bytes: Uint8Array, opts: ReadPluginPackageOptions): Promise<PluginPackage>;
|
|
110
|
+
/** Options of {@link readPluginFiles}. */
|
|
111
|
+
export interface ReadPluginFilesOptions {
|
|
112
|
+
hostSdkVersion: string;
|
|
113
|
+
/** Defaults to the kernel's zod. */
|
|
114
|
+
hostZodVersion?: string;
|
|
115
|
+
/**
|
|
116
|
+
* tgz: true (`package.json` must be there and match the manifest). Git: false (spec §4.1: it is
|
|
117
|
+
* needed only for npm); when it is absent nothing of it is checked.
|
|
118
|
+
*/
|
|
119
|
+
requirePackageJson: boolean;
|
|
120
|
+
/**
|
|
121
|
+
* Without `plugin.json` and `requirePackageJson: false`, a tree with `skills/` is a skills-only
|
|
122
|
+
* plugin with this name and version (Decision 3: the marketplace entry name, or the last segment
|
|
123
|
+
* of the repo URL; the version per spec §5.3). Ignored when `plugin.json` exists.
|
|
124
|
+
*/
|
|
125
|
+
fallbackName?: string;
|
|
126
|
+
fallbackVersion?: string;
|
|
127
|
+
/**
|
|
128
|
+
* The publisher of that skills-only plugin: the marketplace manifest's `owner.name`, else the
|
|
129
|
+
* repo owner (`<host>/<owner>`).
|
|
130
|
+
*/
|
|
131
|
+
fallbackPublisher?: string;
|
|
132
|
+
/**
|
|
133
|
+
* false: skip the SKILL.md invocation key checks (a translated Claude Code plugin, whose source
|
|
134
|
+
* SKILL.md files are kept as written; the translator reported the keys it ignores). Default true.
|
|
135
|
+
*/
|
|
136
|
+
invocationKeys?: boolean;
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Validates a plugin's file tree (paths relative to the plugin root, `/`-separated, already safe):
|
|
140
|
+
* the tgz reader after unpacking and the git reader share every check here. Throws
|
|
141
|
+
* {@link PluginPackageError} like {@link readPluginPackage}.
|
|
142
|
+
*/
|
|
143
|
+
export declare function readPluginFiles(files: Map<string, Uint8Array>, opts: ReadPluginFilesOptions): PluginContents;
|
|
@@ -0,0 +1,382 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { AGENT_TEMPLATE_LIMITS, CATALOG_ITEM_NAME_RE, CONNECTOR_TEMPLATE_LIMITS, hostSdkProblem, PLUGIN_MANIFEST_FILE, PLUGIN_MANIFEST_LIMITS, parseAgentTemplate, parseConnectorTemplateFile, parsePluginManifest, parseSkillMd, SKILL_ENTRY_FILE, validatePluginPackageJsonFor, } from "@capybara-hq/plugin-sdk";
|
|
3
|
+
import { HOST_ZOD_VERSION, LEGACY_FORMAT_MESSAGE, PackageTgzError, packagePath, parsePackageJsonFile, unpackPackageTgz, } from "../packages/tgz.js";
|
|
4
|
+
export { LEGACY_FORMAT_MESSAGE, packagePath };
|
|
5
|
+
/** The plugin package is invalid; `issues` lists the problems (English, shown to the admin). */
|
|
6
|
+
export class PluginPackageError extends Error {
|
|
7
|
+
code;
|
|
8
|
+
issues;
|
|
9
|
+
constructor(code, issues) {
|
|
10
|
+
super(code === "catalog.legacy_format"
|
|
11
|
+
? (issues[0] ?? LEGACY_FORMAT_MESSAGE)
|
|
12
|
+
: `Invalid plugin package: ${issues[0] ?? "unknown problem"}`);
|
|
13
|
+
this.name = "PluginPackageError";
|
|
14
|
+
this.code = code;
|
|
15
|
+
this.issues = issues;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* The content digest of a plugin's files (Decision 5): sha256 (hex) over the file list sorted by
|
|
20
|
+
* path (code unit order), each entry `path + "\0" + sha256(content) + "\n"`. Paths are relative to
|
|
21
|
+
* the plugin root, so a tgz and a git tree of the same files have the same digest. Paths are hashed
|
|
22
|
+
* byte for byte as they were read: no Unicode normalization (an NFC and an NFD spelling of the same
|
|
23
|
+
* name are different files, as they are to git and tar). Both readers refuse control characters in
|
|
24
|
+
* paths, so `\0` and `\n` cannot occur inside a path and the list is unambiguous; a path with one
|
|
25
|
+
* is refused here too.
|
|
26
|
+
*/
|
|
27
|
+
export function contentDigest(files) {
|
|
28
|
+
const h = createHash("sha256");
|
|
29
|
+
for (const path of [...files.keys()].sort()) {
|
|
30
|
+
// biome-ignore lint/suspicious/noControlCharactersInRegex: control characters are refused
|
|
31
|
+
if (/[\u0000-\u001f\u007f]/.test(path)) {
|
|
32
|
+
throw new Error(`unsafe path ${JSON.stringify(path)} in a content digest`);
|
|
33
|
+
}
|
|
34
|
+
const data = files.get(path);
|
|
35
|
+
h.update(`${path}\0${createHash("sha256").update(data).digest("hex")}\n`);
|
|
36
|
+
}
|
|
37
|
+
return h.digest("hex");
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* The version of an archive plugin that has none (spec §5.3): `0.0.0-sha256.h<12>` from the content
|
|
41
|
+
* digest. The `h` keeps the prerelease identifier alphanumeric (twelve hex digits with a leading
|
|
42
|
+
* zero are not valid semver).
|
|
43
|
+
*/
|
|
44
|
+
export const archiveFallbackVersion = (digest) => `0.0.0-sha256.h${digest.slice(0, 12)}`;
|
|
45
|
+
const isObj = (v) => typeof v === "object" && v !== null && !Array.isArray(v);
|
|
46
|
+
const decode = (data) => {
|
|
47
|
+
try {
|
|
48
|
+
return new TextDecoder("utf-8", { fatal: true }).decode(data);
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
return undefined;
|
|
52
|
+
}
|
|
53
|
+
};
|
|
54
|
+
/** Largest icon (plugin or connector template) in bytes. */
|
|
55
|
+
export const PLUGIN_ICON_MAX_BYTES = CONNECTOR_TEMPLATE_LIMITS.iconBytes;
|
|
56
|
+
/**
|
|
57
|
+
* Whether an icon really is an svg / png (only the file header and UTF-8 text are looked at, nothing
|
|
58
|
+
* is rendered) within {@link PLUGIN_ICON_MAX_BYTES}; undefined when it is.
|
|
59
|
+
*/
|
|
60
|
+
export function iconProblem(path, data) {
|
|
61
|
+
if (data.byteLength > PLUGIN_ICON_MAX_BYTES) {
|
|
62
|
+
return `${path} is larger than ${PLUGIN_ICON_MAX_BYTES} bytes`;
|
|
63
|
+
}
|
|
64
|
+
if (/\.png$/i.test(path)) {
|
|
65
|
+
const sig = [0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a];
|
|
66
|
+
return sig.every((b, i) => data[i] === b) ? undefined : `${path} is not a PNG image`;
|
|
67
|
+
}
|
|
68
|
+
const text = decode(data);
|
|
69
|
+
if (text === undefined)
|
|
70
|
+
return `${path} is not a UTF-8 SVG document`;
|
|
71
|
+
return /<svg[\s>/]/i.test(text) ? undefined : `${path} is not an SVG document`;
|
|
72
|
+
}
|
|
73
|
+
/** package.json parsed, or undefined when it is not valid (only used to name a legacy package). */
|
|
74
|
+
const parsedOrUndefined = (data) => {
|
|
75
|
+
try {
|
|
76
|
+
return parsePackageJsonFile({ data });
|
|
77
|
+
}
|
|
78
|
+
catch (e) {
|
|
79
|
+
if (e instanceof PackageTgzError)
|
|
80
|
+
return undefined;
|
|
81
|
+
throw e;
|
|
82
|
+
}
|
|
83
|
+
};
|
|
84
|
+
const invalid = (issues) => {
|
|
85
|
+
throw new PluginPackageError("catalog.invalid_manifest", issues);
|
|
86
|
+
};
|
|
87
|
+
/** Runs a step that reports problems as {@link PackageTgzError} (unpacking, package.json). */
|
|
88
|
+
async function step(f) {
|
|
89
|
+
try {
|
|
90
|
+
return await f();
|
|
91
|
+
}
|
|
92
|
+
catch (e) {
|
|
93
|
+
if (e instanceof PackageTgzError)
|
|
94
|
+
return invalid(e.issues);
|
|
95
|
+
throw e;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
/** {@link step} for synchronous steps. */
|
|
99
|
+
function stepSync(f) {
|
|
100
|
+
try {
|
|
101
|
+
return f();
|
|
102
|
+
}
|
|
103
|
+
catch (e) {
|
|
104
|
+
if (e instanceof PackageTgzError)
|
|
105
|
+
return invalid(e.issues);
|
|
106
|
+
throw e;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Without package.json only the host SDK check of `validatePluginPackageJsonFor` applies (the
|
|
111
|
+
* peerDependencies rules are about package.json itself).
|
|
112
|
+
*/
|
|
113
|
+
function hostSdkIssues(manifest, hostSdkVersion) {
|
|
114
|
+
const sdk = manifest.extension?.manifest.sdk;
|
|
115
|
+
const problem = sdk === undefined ? undefined : hostSdkProblem(sdk, hostSdkVersion);
|
|
116
|
+
return problem === undefined ? [] : [problem];
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Reads and validates a plugin tgz (see the file header). Invalid -> {@link PluginPackageError}:
|
|
120
|
+
* `catalog.legacy_format` for the pre-0.1.0 format, otherwise `catalog.invalid_manifest` listing
|
|
121
|
+
* every problem it can find, each naming the path it is about (unpacking and manifest parse
|
|
122
|
+
* problems stop at the first stage that fails).
|
|
123
|
+
*/
|
|
124
|
+
export async function readPluginPackage(bytes, opts) {
|
|
125
|
+
const unpacked = await step(() => unpackPackageTgz(bytes, opts));
|
|
126
|
+
const files = new Map(unpacked.map((f) => [f.path, f.data]));
|
|
127
|
+
const fb = opts.fallback !== undefined && !files.has(PLUGIN_MANIFEST_FILE) ? opts.fallback : null;
|
|
128
|
+
const contents = readPluginFiles(files, {
|
|
129
|
+
hostSdkVersion: opts.hostSdkVersion,
|
|
130
|
+
...(opts.hostZodVersion !== undefined && { hostZodVersion: opts.hostZodVersion }),
|
|
131
|
+
requirePackageJson: fb === null,
|
|
132
|
+
...(fb !== null && {
|
|
133
|
+
fallbackName: fb.name,
|
|
134
|
+
fallbackVersion: fb.version ?? archiveFallbackVersion(contentDigest(files)),
|
|
135
|
+
fallbackPublisher: fb.publisher,
|
|
136
|
+
}),
|
|
137
|
+
});
|
|
138
|
+
return {
|
|
139
|
+
sha256: createHash("sha256").update(bytes).digest("hex"),
|
|
140
|
+
size: bytes.byteLength,
|
|
141
|
+
...contents,
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
/** Synthesized `plugin.json` of a skills-only tree without one (Decision 3). */
|
|
145
|
+
function fallbackManifest(files, opts) {
|
|
146
|
+
if (opts.requirePackageJson || opts.fallbackName === undefined)
|
|
147
|
+
return undefined;
|
|
148
|
+
if (opts.fallbackVersion === undefined)
|
|
149
|
+
return undefined;
|
|
150
|
+
if (![...files.keys()].some((p) => p.startsWith("skills/")))
|
|
151
|
+
return undefined;
|
|
152
|
+
const parsed = parsePluginManifest({
|
|
153
|
+
schemaVersion: 1,
|
|
154
|
+
name: opts.fallbackName,
|
|
155
|
+
version: opts.fallbackVersion,
|
|
156
|
+
publisher: opts.fallbackPublisher ?? opts.fallbackName,
|
|
157
|
+
description: `Skills of ${opts.fallbackName} (no ${PLUGIN_MANIFEST_FILE})`,
|
|
158
|
+
});
|
|
159
|
+
if ("errors" in parsed) {
|
|
160
|
+
return invalid(parsed.errors.map((e) => `${PLUGIN_MANIFEST_FILE} (derived): ${e}`));
|
|
161
|
+
}
|
|
162
|
+
return parsed;
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Validates a plugin's file tree (paths relative to the plugin root, `/`-separated, already safe):
|
|
166
|
+
* the tgz reader after unpacking and the git reader share every check here. Throws
|
|
167
|
+
* {@link PluginPackageError} like {@link readPluginPackage}.
|
|
168
|
+
*/
|
|
169
|
+
export function readPluginFiles(files, opts) {
|
|
170
|
+
const pj = files.get("package.json");
|
|
171
|
+
const manifestBytes = files.get(PLUGIN_MANIFEST_FILE);
|
|
172
|
+
if (manifestBytes === undefined) {
|
|
173
|
+
// The old formats are recognised only to say so; nothing in them is read. app.yaml is checked
|
|
174
|
+
// before package.json is parsed, so an old bundle with a broken package.json is still legacy.
|
|
175
|
+
const pkg = pj && parsedOrUndefined(pj);
|
|
176
|
+
if (files.has("app.yaml") || (isObj(pkg) && pkg.capybara !== undefined)) {
|
|
177
|
+
const who = isObj(pkg) && typeof pkg.name === "string" ? `Package ${pkg.name}` : "The package";
|
|
178
|
+
throw new PluginPackageError("catalog.legacy_format", [`${who} ${LEGACY_FORMAT_MESSAGE}`]);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
const fallback = manifestBytes === undefined ? fallbackManifest(files, opts) : undefined;
|
|
182
|
+
if (manifestBytes === undefined && fallback === undefined) {
|
|
183
|
+
if (pj)
|
|
184
|
+
stepSync(() => parsePackageJsonFile({ data: pj }));
|
|
185
|
+
return invalid([`${PLUGIN_MANIFEST_FILE} not found in the package (the plugin manifest)`]);
|
|
186
|
+
}
|
|
187
|
+
const packageJson = pj === undefined && !opts.requirePackageJson
|
|
188
|
+
? undefined
|
|
189
|
+
: stepSync(() => parsePackageJsonFile(pj && { data: pj }));
|
|
190
|
+
let manifest;
|
|
191
|
+
if (manifestBytes === undefined)
|
|
192
|
+
manifest = fallback;
|
|
193
|
+
else {
|
|
194
|
+
const text = decode(manifestBytes);
|
|
195
|
+
if (text === undefined)
|
|
196
|
+
return invalid([`${PLUGIN_MANIFEST_FILE} is not valid UTF-8 text`]);
|
|
197
|
+
const parsed = parsePluginManifest(text);
|
|
198
|
+
if ("errors" in parsed) {
|
|
199
|
+
return invalid(parsed.errors.map((e) => `${PLUGIN_MANIFEST_FILE}: ${e}`));
|
|
200
|
+
}
|
|
201
|
+
manifest = parsed;
|
|
202
|
+
}
|
|
203
|
+
const issues = packageJson !== undefined
|
|
204
|
+
? validatePluginPackageJsonFor(packageJson, manifest, opts.hostSdkVersion, {
|
|
205
|
+
hostZodVersion: opts.hostZodVersion ?? HOST_ZOD_VERSION,
|
|
206
|
+
})
|
|
207
|
+
: hostSdkIssues(manifest, opts.hostSdkVersion);
|
|
208
|
+
const under = (dir) => [...files.keys()].filter((p) => p.startsWith(`${dir}/`));
|
|
209
|
+
// Skills: listed, or scanned from skills/*/SKILL.md.
|
|
210
|
+
const skillDirs = [];
|
|
211
|
+
if (manifest.skills !== undefined) {
|
|
212
|
+
manifest.skills.forEach((s, i) => {
|
|
213
|
+
const dir = packagePath(s.path);
|
|
214
|
+
if (!files.has(`${dir}/${SKILL_ENTRY_FILE}`)) {
|
|
215
|
+
issues.push(`skills.${i}: ${s.path}/${SKILL_ENTRY_FILE} not found in the package`);
|
|
216
|
+
}
|
|
217
|
+
else
|
|
218
|
+
skillDirs.push(dir);
|
|
219
|
+
});
|
|
220
|
+
}
|
|
221
|
+
else {
|
|
222
|
+
const re = new RegExp(`^(skills/[^/]+)/${SKILL_ENTRY_FILE}$`);
|
|
223
|
+
for (const p of [...files.keys()].sort()) {
|
|
224
|
+
const m = re.exec(p);
|
|
225
|
+
if (m)
|
|
226
|
+
skillDirs.push(m[1]);
|
|
227
|
+
}
|
|
228
|
+
if (skillDirs.length > PLUGIN_MANIFEST_LIMITS.skills) {
|
|
229
|
+
issues.push(`skills/ holds ${skillDirs.length} skills; a plugin may have at most ${PLUGIN_MANIFEST_LIMITS.skills}`);
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
const skills = [];
|
|
233
|
+
const skillNames = new Map();
|
|
234
|
+
for (const dir of skillDirs) {
|
|
235
|
+
const path = `${dir}/${SKILL_ENTRY_FILE}`;
|
|
236
|
+
const md = decode(files.get(path));
|
|
237
|
+
if (md === undefined) {
|
|
238
|
+
issues.push(`${path}: not valid UTF-8 text`);
|
|
239
|
+
continue;
|
|
240
|
+
}
|
|
241
|
+
const r = parseSkillMd(md, { invocationKeys: opts.invocationKeys !== false });
|
|
242
|
+
if ("errors" in r) {
|
|
243
|
+
issues.push(...r.errors.map((e) => `${path}: ${e}`));
|
|
244
|
+
continue;
|
|
245
|
+
}
|
|
246
|
+
const other = skillNames.get(r.name);
|
|
247
|
+
if (other !== undefined) {
|
|
248
|
+
issues.push(`${path}: skill name "${r.name}" is also used by ${other}/${SKILL_ENTRY_FILE}`);
|
|
249
|
+
continue;
|
|
250
|
+
}
|
|
251
|
+
skillNames.set(r.name, dir);
|
|
252
|
+
skills.push({
|
|
253
|
+
name: r.name,
|
|
254
|
+
dir,
|
|
255
|
+
files: under(dir)
|
|
256
|
+
.map((p) => p.slice(dir.length + 1))
|
|
257
|
+
.sort(),
|
|
258
|
+
});
|
|
259
|
+
}
|
|
260
|
+
// Connector templates: listed, or scanned from connectors/*.json.
|
|
261
|
+
const templatePaths = [];
|
|
262
|
+
if (manifest.connectorTemplates !== undefined) {
|
|
263
|
+
manifest.connectorTemplates.forEach((t, i) => {
|
|
264
|
+
const path = packagePath(t.path);
|
|
265
|
+
if (!files.has(path)) {
|
|
266
|
+
issues.push(`connectorTemplates.${i}: ${t.path} not found in the package`);
|
|
267
|
+
}
|
|
268
|
+
else
|
|
269
|
+
templatePaths.push(path);
|
|
270
|
+
});
|
|
271
|
+
}
|
|
272
|
+
else {
|
|
273
|
+
for (const p of [...files.keys()].sort()) {
|
|
274
|
+
if (/^connectors\/[^/]+\.json$/.test(p))
|
|
275
|
+
templatePaths.push(p);
|
|
276
|
+
}
|
|
277
|
+
if (templatePaths.length > PLUGIN_MANIFEST_LIMITS.connectorTemplates) {
|
|
278
|
+
issues.push(`connectors/ holds ${templatePaths.length} connector templates; a plugin may have at most ${PLUGIN_MANIFEST_LIMITS.connectorTemplates}`);
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
const connectorTemplates = [];
|
|
282
|
+
for (const path of templatePaths) {
|
|
283
|
+
const id = path.split("/").pop().replace(/\.json$/, "");
|
|
284
|
+
if (!CATALOG_ITEM_NAME_RE.test(id)) {
|
|
285
|
+
issues.push(`${path}: the template id "${id}" must match ^[a-z0-9][a-z0-9-]{0,63}$`);
|
|
286
|
+
continue;
|
|
287
|
+
}
|
|
288
|
+
const json = decode(files.get(path));
|
|
289
|
+
if (json === undefined) {
|
|
290
|
+
issues.push(`${path}: not valid JSON`);
|
|
291
|
+
continue;
|
|
292
|
+
}
|
|
293
|
+
// Pass the text so the file gets the same size limit and BOM handling as plugin.json.
|
|
294
|
+
const r = parseConnectorTemplateFile(json);
|
|
295
|
+
if ("errors" in r) {
|
|
296
|
+
issues.push(...r.errors.map((e) => `${path}: ${e}`));
|
|
297
|
+
continue;
|
|
298
|
+
}
|
|
299
|
+
if (r.icon !== undefined) {
|
|
300
|
+
const icon = files.get(packagePath(r.icon));
|
|
301
|
+
const problem = icon === undefined ? `${r.icon} not found in the package` : iconProblem(r.icon, icon);
|
|
302
|
+
if (problem !== undefined)
|
|
303
|
+
issues.push(`${path}: icon ${problem}`);
|
|
304
|
+
}
|
|
305
|
+
connectorTemplates.push({ id, path, file: r });
|
|
306
|
+
}
|
|
307
|
+
// Agent templates: listed, or scanned from agents/*.md.
|
|
308
|
+
const agentPaths = [];
|
|
309
|
+
if (manifest.agents !== undefined) {
|
|
310
|
+
manifest.agents.forEach((a, i) => {
|
|
311
|
+
const path = packagePath(a.path);
|
|
312
|
+
if (!files.has(path))
|
|
313
|
+
issues.push(`agents.${i}: ${a.path} not found in the package`);
|
|
314
|
+
else
|
|
315
|
+
agentPaths.push(path);
|
|
316
|
+
});
|
|
317
|
+
}
|
|
318
|
+
else {
|
|
319
|
+
for (const p of [...files.keys()].sort()) {
|
|
320
|
+
if (/^agents\/[^/]+\.md$/.test(p))
|
|
321
|
+
agentPaths.push(p);
|
|
322
|
+
}
|
|
323
|
+
if (agentPaths.length > AGENT_TEMPLATE_LIMITS.perPlugin) {
|
|
324
|
+
issues.push(`agents/ holds ${agentPaths.length} agent templates; a plugin may have at most ${AGENT_TEMPLATE_LIMITS.perPlugin}`);
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
const agentTemplates = [];
|
|
328
|
+
const agentNames = new Map();
|
|
329
|
+
for (const path of agentPaths) {
|
|
330
|
+
const md = decode(files.get(path));
|
|
331
|
+
if (md === undefined) {
|
|
332
|
+
issues.push(`${path}: not valid UTF-8 text`);
|
|
333
|
+
continue;
|
|
334
|
+
}
|
|
335
|
+
const r = parseAgentTemplate(md);
|
|
336
|
+
if ("errors" in r) {
|
|
337
|
+
issues.push(...r.errors.map((e) => `${path}: ${e}`));
|
|
338
|
+
continue;
|
|
339
|
+
}
|
|
340
|
+
const other = agentNames.get(r.template.name);
|
|
341
|
+
if (other !== undefined) {
|
|
342
|
+
issues.push(`${path}: agent template name "${r.template.name}" is also used by ${other}`);
|
|
343
|
+
continue;
|
|
344
|
+
}
|
|
345
|
+
agentNames.set(r.template.name, path);
|
|
346
|
+
agentTemplates.push({ name: r.template.name, path, template: r.template });
|
|
347
|
+
}
|
|
348
|
+
if (manifest.icon !== undefined) {
|
|
349
|
+
const icon = files.get(packagePath(manifest.icon));
|
|
350
|
+
const problem = icon === undefined
|
|
351
|
+
? `${manifest.icon} not found in the package`
|
|
352
|
+
: iconProblem(manifest.icon, icon);
|
|
353
|
+
if (problem !== undefined)
|
|
354
|
+
issues.push(`icon: ${problem}`);
|
|
355
|
+
}
|
|
356
|
+
const ext = manifest.extension;
|
|
357
|
+
if (ext !== undefined) {
|
|
358
|
+
if (!files.has(packagePath(ext.entry))) {
|
|
359
|
+
issues.push(`extension.entry: ${ext.entry} not found in the package (the plugin has an extension but no build output; build it before packing or committing it)`);
|
|
360
|
+
}
|
|
361
|
+
for (const k of ["migrations", "ui"]) {
|
|
362
|
+
const dir = ext[k];
|
|
363
|
+
if (dir !== undefined && under(packagePath(dir)).length === 0) {
|
|
364
|
+
issues.push(`extension.${k}: directory ${dir} is missing or empty`);
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
else if (skillDirs.length === 0 && templatePaths.length === 0 && agentPaths.length === 0) {
|
|
369
|
+
issues.push("a plugin must contain an extension, a skill, a connector template or an agent template");
|
|
370
|
+
}
|
|
371
|
+
if (issues.length > 0)
|
|
372
|
+
invalid(issues);
|
|
373
|
+
return {
|
|
374
|
+
packageJson: (packageJson ?? {}),
|
|
375
|
+
manifest,
|
|
376
|
+
files,
|
|
377
|
+
skills,
|
|
378
|
+
connectorTemplates,
|
|
379
|
+
agentTemplates,
|
|
380
|
+
contentDigest: contentDigest(files),
|
|
381
|
+
};
|
|
382
|
+
}
|