@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,520 @@
|
|
|
1
|
+
import * as fsp from "node:fs/promises";
|
|
2
|
+
import { tmpdir } from "node:os";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import { inflateSync } from "node:zlib";
|
|
5
|
+
import git, {} from "isomorphic-git";
|
|
6
|
+
import { NetDeniedError } from "../net/public-address.js";
|
|
7
|
+
import { NetBodyTooLargeError, safeFetch } from "../net/safe-fetch.js";
|
|
8
|
+
import { marketplaceNetCode, marketplaceUrlProblem, } from "./marketplace-fetch.js";
|
|
9
|
+
/**
|
|
10
|
+
* Reading plugins from git (spec §5.1, §5.2; Decision 2): isomorphic-git (pure JS, any smart-HTTP
|
|
11
|
+
* host) over the kernel's public-address network layer. The repo is hostile input:
|
|
12
|
+
* - https smart HTTP only (`GET info/refs` + `POST git-upload-pack`), each request through
|
|
13
|
+
* `net/safeFetch` (public addresses, pinned connection, no redirects); the token goes only to
|
|
14
|
+
* `tokenOrigin`;
|
|
15
|
+
* - one commit, depth 1, no tags, no submodules (never fetched); the pack is at most `maxBytes`;
|
|
16
|
+
* - before isomorphic-git indexes the pack (which inflates every object), the pack is scanned with
|
|
17
|
+
* bounded inflation: at most {@link GIT_LIMITS}`.maxObjects` objects and 4 × `maxBytes` of declared
|
|
18
|
+
* content in all, so a deflate bomb is refused before it is expanded;
|
|
19
|
+
* - files are read from the object store (`readTree` / `readBlob`), never checked out; symlinks and
|
|
20
|
+
* submodule entries under `path` are refused; at most 5000 files and 4 × `maxBytes`; LFS pointer
|
|
21
|
+
* files are ordinary files;
|
|
22
|
+
* - the object store is a temp dir removed after each operation; 120 s per operation.
|
|
23
|
+
*/
|
|
24
|
+
export const GIT_LIMITS = {
|
|
25
|
+
maxFiles: 5000,
|
|
26
|
+
/** Objects in one pack (a depth-1 commit: the commit, its trees and blobs). */
|
|
27
|
+
maxObjects: 20_000,
|
|
28
|
+
/** Unpacked bytes (pack content and files read) at most this × `maxBytes`. */
|
|
29
|
+
unpackedFactor: 4,
|
|
30
|
+
timeoutMs: 120_000,
|
|
31
|
+
};
|
|
32
|
+
/** `./a/b/` -> `a/b`; the root is `.`. */
|
|
33
|
+
export const normalGitPath = (path) => {
|
|
34
|
+
const p = (path ?? ".").replace(/^\.\//, "").replace(/\/+$/, "");
|
|
35
|
+
return p === "" ? "." : p;
|
|
36
|
+
};
|
|
37
|
+
/**
|
|
38
|
+
* The identity of a git location, `<host>/<repo>:<path>` (host lower case, the repo without a
|
|
39
|
+
* leading `/` or a trailing `.git`, `path` as {@link normalGitPath}).
|
|
40
|
+
*/
|
|
41
|
+
export function gitLocationIdentity(l) {
|
|
42
|
+
return `${l.host.toLowerCase()}/${l.repo.replace(/^\/+/, "").replace(/\.git$/, "")}:${normalGitPath(l.path)}`;
|
|
43
|
+
}
|
|
44
|
+
/** {@link gitLocationIdentity} of a repo URL and a path in it. */
|
|
45
|
+
export function gitUrlIdentity(url, path) {
|
|
46
|
+
const u = new URL(url);
|
|
47
|
+
return gitLocationIdentity({ host: u.host, repo: u.pathname, path: normalGitPath(path) });
|
|
48
|
+
}
|
|
49
|
+
/** A git read failed. English message without the token; `netCode` when the network rules refused. */
|
|
50
|
+
export class GitSourceError extends Error {
|
|
51
|
+
code;
|
|
52
|
+
netCode;
|
|
53
|
+
detail;
|
|
54
|
+
constructor(code, message, options) {
|
|
55
|
+
super(message, options);
|
|
56
|
+
this.code = code;
|
|
57
|
+
this.name = "GitSourceError";
|
|
58
|
+
this.netCode = options?.netCode;
|
|
59
|
+
this.detail = options?.detail ?? {};
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* The details of a git failure's API error: the host (the one the network rules refused, else the
|
|
64
|
+
* repo's), the repo path, the ref or commit asked for, and the refused entry. Lets the web name them
|
|
65
|
+
* in localized copy; the English message stays for logs and API users.
|
|
66
|
+
*/
|
|
67
|
+
export function gitErrorDetails(e, loc) {
|
|
68
|
+
let host = e.detail.host;
|
|
69
|
+
let repo;
|
|
70
|
+
try {
|
|
71
|
+
const u = new URL(loc.url);
|
|
72
|
+
host ??= u.hostname;
|
|
73
|
+
repo = u.pathname
|
|
74
|
+
.replace(/\/+$/, "")
|
|
75
|
+
.replace(/\.git$/, "")
|
|
76
|
+
.replace(/^\/+/, "");
|
|
77
|
+
}
|
|
78
|
+
catch {
|
|
79
|
+
// not a URL: the message says so
|
|
80
|
+
}
|
|
81
|
+
return {
|
|
82
|
+
...(host !== undefined && host !== "" && { host }),
|
|
83
|
+
...(repo !== undefined && repo !== "" && { repo }),
|
|
84
|
+
...(loc.ref !== undefined && { ref: loc.ref }),
|
|
85
|
+
...(loc.commit !== undefined && { commit: loc.commit }),
|
|
86
|
+
...(e.detail.path !== undefined && { path: e.detail.path }),
|
|
87
|
+
...(e.detail.hint !== undefined && { hint: e.detail.hint }),
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
const SHA_RE = /^[0-9a-f]{40}$/i;
|
|
91
|
+
const SHORTHAND_RE = /^([A-Za-z0-9](?:[A-Za-z0-9-]{0,38}))\/([A-Za-z0-9_.-]{1,100})$/;
|
|
92
|
+
/** `owner/repo` -> `https://github.com/owner/repo.git`; anything else is returned unchanged. */
|
|
93
|
+
export function expandGitUrl(input) {
|
|
94
|
+
const m = SHORTHAND_RE.exec(input);
|
|
95
|
+
if (m === null)
|
|
96
|
+
return input;
|
|
97
|
+
const repo = m[2].replace(/\.git$/, "");
|
|
98
|
+
if (repo === "" || repo === "." || repo === "..")
|
|
99
|
+
return input;
|
|
100
|
+
return `https://github.com/${m[1]}/${repo}.git`;
|
|
101
|
+
}
|
|
102
|
+
const failed = (message, cause) => new GitSourceError("marketplace.git_failed", message, cause === undefined ? {} : { cause });
|
|
103
|
+
const tooLarge = (message) => new GitSourceError("marketplace.git_too_large", message);
|
|
104
|
+
const unsupported = (message, path) => new GitSourceError("marketplace.git_unsupported_entry", message, { detail: { path } });
|
|
105
|
+
const errMsg = (e) => (e instanceof Error ? e.message : String(e));
|
|
106
|
+
async function collect(body) {
|
|
107
|
+
const parts = [];
|
|
108
|
+
if (body !== undefined)
|
|
109
|
+
for await (const c of body)
|
|
110
|
+
parts.push(c);
|
|
111
|
+
return Buffer.concat(parts);
|
|
112
|
+
}
|
|
113
|
+
function startOp(loc, o) {
|
|
114
|
+
const problem = marketplaceUrlProblem(loc.url, o.net.allowInsecureLoopback);
|
|
115
|
+
if (problem !== null)
|
|
116
|
+
throw failed(`invalid git URL: ${problem}`);
|
|
117
|
+
const signal = AbortSignal.any([o.signal, AbortSignal.timeout(GIT_LIMITS.timeoutMs)]);
|
|
118
|
+
const state = { overLimit: false };
|
|
119
|
+
const auth = o.token === undefined
|
|
120
|
+
? undefined
|
|
121
|
+
: `Basic ${Buffer.from(`x-access-token:${o.token}`).toString("base64")}`;
|
|
122
|
+
const http = {
|
|
123
|
+
async request(req) {
|
|
124
|
+
const target = new URL(req.url);
|
|
125
|
+
const headers = { ...req.headers };
|
|
126
|
+
delete headers.authorization;
|
|
127
|
+
delete headers.Authorization;
|
|
128
|
+
if (auth !== undefined && o.tokenOrigin === target.origin)
|
|
129
|
+
headers.authorization = auth;
|
|
130
|
+
const method = req.method ?? "GET";
|
|
131
|
+
const body = req.body === undefined ? undefined : await collect(req.body);
|
|
132
|
+
const res = await safeFetch(target.href, { method, headers, ...(body !== undefined && { body }), signal }, o.net, { maxBytes: o.maxBytes });
|
|
133
|
+
const stream = res.body;
|
|
134
|
+
async function* chunks() {
|
|
135
|
+
if (stream === null)
|
|
136
|
+
return;
|
|
137
|
+
try {
|
|
138
|
+
for await (const c of stream)
|
|
139
|
+
yield c;
|
|
140
|
+
}
|
|
141
|
+
catch (e) {
|
|
142
|
+
if (e instanceof NetBodyTooLargeError)
|
|
143
|
+
state.overLimit = true;
|
|
144
|
+
throw e;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
return {
|
|
148
|
+
url: target.href,
|
|
149
|
+
method,
|
|
150
|
+
statusCode: res.status,
|
|
151
|
+
statusMessage: res.statusText,
|
|
152
|
+
headers: Object.fromEntries(res.headers),
|
|
153
|
+
body: chunks(),
|
|
154
|
+
};
|
|
155
|
+
},
|
|
156
|
+
};
|
|
157
|
+
return { signal, http, url: loc.url.replace(/\/+$/, ""), state };
|
|
158
|
+
}
|
|
159
|
+
/** Maps anything thrown during an operation to a {@link GitSourceError} (the caller's abort stays). */
|
|
160
|
+
function mapError(e, op, o, what) {
|
|
161
|
+
if (o.signal.aborted)
|
|
162
|
+
return o.signal.reason;
|
|
163
|
+
if (e instanceof GitSourceError)
|
|
164
|
+
return e;
|
|
165
|
+
if (op.state.overLimit || e instanceof NetBodyTooLargeError) {
|
|
166
|
+
return tooLarge(`${what}: the git server sent more than ${o.maxBytes} bytes`);
|
|
167
|
+
}
|
|
168
|
+
if (op.signal.aborted) {
|
|
169
|
+
return failed(`${what}: timed out after ${GIT_LIMITS.timeoutMs / 1000} s`, e);
|
|
170
|
+
}
|
|
171
|
+
if (e instanceof NetDeniedError) {
|
|
172
|
+
const netCode = marketplaceNetCode(e);
|
|
173
|
+
// GitLab and Gitea redirect a repo URL without `.git` to the one with it
|
|
174
|
+
const suffix = netCode === "marketplace.redirect" && !/\.git$/i.test(new URL(op.url).pathname);
|
|
175
|
+
return new GitSourceError("marketplace.git_failed", `${what}: ${e.message}${suffix ? " Use the repository URL ending in .git." : ""}`, {
|
|
176
|
+
cause: e,
|
|
177
|
+
...(netCode !== undefined && { netCode }),
|
|
178
|
+
detail: { host: e.host, ...(suffix && { hint: "git_suffix" }) },
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
const cause = e?.cause;
|
|
182
|
+
if (cause instanceof NetDeniedError)
|
|
183
|
+
return mapError(cause, op, o, what);
|
|
184
|
+
const status = e?.data?.statusCode;
|
|
185
|
+
if (typeof status === "number")
|
|
186
|
+
return failed(`${what}: the git server answered ${status}`, e);
|
|
187
|
+
return failed(`${what}: ${errMsg(e)}`, e);
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* The commit to read (40 lower-case hex): `commit` when given (it wins over `ref`), otherwise the
|
|
191
|
+
* head of `ref` (a branch, a tag or a full `refs/…` name) or of the remote HEAD.
|
|
192
|
+
*/
|
|
193
|
+
export async function resolveGitCommit(loc, o) {
|
|
194
|
+
if (loc.commit !== undefined) {
|
|
195
|
+
if (!SHA_RE.test(loc.commit))
|
|
196
|
+
throw failed(`"${loc.commit}" is not a full commit sha`);
|
|
197
|
+
return loc.commit.toLowerCase();
|
|
198
|
+
}
|
|
199
|
+
const ref = loc.ref ?? "HEAD";
|
|
200
|
+
if (SHA_RE.test(ref))
|
|
201
|
+
return ref.toLowerCase();
|
|
202
|
+
const op = startOp(loc, o);
|
|
203
|
+
const what = `cannot list the refs of ${op.url}`;
|
|
204
|
+
let refs;
|
|
205
|
+
try {
|
|
206
|
+
const info = await git.getRemoteInfo2({ http: op.http, url: op.url, protocolVersion: 1 });
|
|
207
|
+
refs = info.refs ?? [];
|
|
208
|
+
}
|
|
209
|
+
catch (e) {
|
|
210
|
+
throw mapError(e, op, o, what);
|
|
211
|
+
}
|
|
212
|
+
const names = ref === "HEAD"
|
|
213
|
+
? ["HEAD"]
|
|
214
|
+
: ref.startsWith("refs/")
|
|
215
|
+
? [ref]
|
|
216
|
+
: [`refs/heads/${ref}`, `refs/tags/${ref}`];
|
|
217
|
+
for (const name of names) {
|
|
218
|
+
const r = refs.find((x) => x.ref === name);
|
|
219
|
+
if (r !== undefined) {
|
|
220
|
+
const oid = r.peeled ?? r.oid;
|
|
221
|
+
if (SHA_RE.test(oid))
|
|
222
|
+
return oid.toLowerCase();
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
throw failed(`${op.url}: ref "${ref}" not found`);
|
|
226
|
+
}
|
|
227
|
+
/** The delta's result size (the second varint of the delta header). */
|
|
228
|
+
function deltaTargetSize(delta) {
|
|
229
|
+
let pos = 0;
|
|
230
|
+
const varint = () => {
|
|
231
|
+
let n = 0;
|
|
232
|
+
let shift = 0;
|
|
233
|
+
let c;
|
|
234
|
+
do {
|
|
235
|
+
if (pos >= delta.length || shift > 49)
|
|
236
|
+
throw failed("corrupt git pack: bad delta header");
|
|
237
|
+
c = delta[pos++];
|
|
238
|
+
n += (c & 0x7f) * 2 ** shift;
|
|
239
|
+
shift += 7;
|
|
240
|
+
} while (c & 0x80);
|
|
241
|
+
return n;
|
|
242
|
+
};
|
|
243
|
+
varint();
|
|
244
|
+
return varint();
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* Walks a pack (v2/v3) with bounded inflation before anything else expands it: object count and the
|
|
248
|
+
* declared content sizes (objects, and delta results) must fit; an object that inflates beyond its
|
|
249
|
+
* declared size is refused.
|
|
250
|
+
*/
|
|
251
|
+
export function scanPack(pack, maxUnpacked) {
|
|
252
|
+
const b = Buffer.from(pack.buffer, pack.byteOffset, pack.byteLength);
|
|
253
|
+
if (b.length < 32 || b.toString("latin1", 0, 4) !== "PACK")
|
|
254
|
+
throw failed("not a git pack");
|
|
255
|
+
const count = b.readUInt32BE(8);
|
|
256
|
+
if (count > GIT_LIMITS.maxObjects) {
|
|
257
|
+
throw tooLarge(`the git pack holds ${count} objects; at most ${GIT_LIMITS.maxObjects}`);
|
|
258
|
+
}
|
|
259
|
+
const end = b.length - 20;
|
|
260
|
+
let pos = 12;
|
|
261
|
+
let total = 0;
|
|
262
|
+
const truncated = () => failed("corrupt git pack: truncated");
|
|
263
|
+
for (let i = 0; i < count; i++) {
|
|
264
|
+
if (pos >= end)
|
|
265
|
+
throw truncated();
|
|
266
|
+
let c = b[pos++];
|
|
267
|
+
const type = (c >> 4) & 7;
|
|
268
|
+
let size = c & 15;
|
|
269
|
+
let shift = 4;
|
|
270
|
+
while (c & 0x80) {
|
|
271
|
+
if (pos >= end || shift > 49)
|
|
272
|
+
throw truncated();
|
|
273
|
+
c = b[pos++];
|
|
274
|
+
size += (c & 0x7f) * 2 ** shift;
|
|
275
|
+
shift += 7;
|
|
276
|
+
}
|
|
277
|
+
if (type === 6) {
|
|
278
|
+
do {
|
|
279
|
+
if (pos >= end)
|
|
280
|
+
throw truncated();
|
|
281
|
+
c = b[pos++];
|
|
282
|
+
} while (c & 0x80);
|
|
283
|
+
}
|
|
284
|
+
else if (type === 7)
|
|
285
|
+
pos += 20;
|
|
286
|
+
else if (type < 1 || type > 4)
|
|
287
|
+
throw failed(`corrupt git pack: object type ${type}`);
|
|
288
|
+
if (size > maxUnpacked - total) {
|
|
289
|
+
throw tooLarge(`the git content is larger than ${maxUnpacked} bytes unpacked`);
|
|
290
|
+
}
|
|
291
|
+
let out;
|
|
292
|
+
try {
|
|
293
|
+
out = inflateSync(b.subarray(pos, end), {
|
|
294
|
+
info: true,
|
|
295
|
+
maxOutputLength: Math.max(size, 1),
|
|
296
|
+
});
|
|
297
|
+
}
|
|
298
|
+
catch (e) {
|
|
299
|
+
throw failed(`corrupt git pack: ${errMsg(e)}`, e);
|
|
300
|
+
}
|
|
301
|
+
if (out.buffer.length !== size)
|
|
302
|
+
throw failed("corrupt git pack: object size mismatch");
|
|
303
|
+
pos += out.engine.bytesWritten;
|
|
304
|
+
total += type >= 6 ? deltaTargetSize(out.buffer) : size;
|
|
305
|
+
if (total > maxUnpacked) {
|
|
306
|
+
throw tooLarge(`the git content is larger than ${maxUnpacked} bytes unpacked`);
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
const PACK_FILE_RE = /[/\\]objects[/\\]pack[/\\]pack-[0-9a-f]*\.pack$/;
|
|
311
|
+
/** node fs for isomorphic-git, with the pack scanned before it is written (and then indexed). */
|
|
312
|
+
function scanningFs(maxUnpacked) {
|
|
313
|
+
// isomorphic-git retries a failed write after creating the directory: scan each pack once
|
|
314
|
+
const verdicts = new WeakMap();
|
|
315
|
+
const scan = (data) => {
|
|
316
|
+
if (!verdicts.has(data)) {
|
|
317
|
+
try {
|
|
318
|
+
scanPack(data, maxUnpacked);
|
|
319
|
+
verdicts.set(data, null);
|
|
320
|
+
}
|
|
321
|
+
catch (e) {
|
|
322
|
+
verdicts.set(data, e);
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
const verdict = verdicts.get(data);
|
|
326
|
+
if (verdict !== null)
|
|
327
|
+
throw verdict;
|
|
328
|
+
};
|
|
329
|
+
return {
|
|
330
|
+
promises: {
|
|
331
|
+
...fsp,
|
|
332
|
+
writeFile: (async (path, data, opts) => {
|
|
333
|
+
if (PACK_FILE_RE.test(path) && typeof data !== "string")
|
|
334
|
+
scan(data);
|
|
335
|
+
return fsp.writeFile(path, data, opts);
|
|
336
|
+
}),
|
|
337
|
+
},
|
|
338
|
+
};
|
|
339
|
+
}
|
|
340
|
+
/** The message for a pinned commit the server would not send. */
|
|
341
|
+
const refusedCommit = (commit) => `the server refused to serve commit ${commit}; pin a branch or tag tip instead`;
|
|
342
|
+
/** isomorphic-git's error for a want the server did not answer (an unknown or unadvertised sha). */
|
|
343
|
+
function refusedWant(e) {
|
|
344
|
+
const code = e?.code;
|
|
345
|
+
if (code === "NotFoundError")
|
|
346
|
+
return true;
|
|
347
|
+
return /not our ref|unadvertised object|want .* not valid/i.test(errMsg(e));
|
|
348
|
+
}
|
|
349
|
+
/** `path` as segments ([] = the repo root); undefined when it is not a safe relative path. */
|
|
350
|
+
function pathSegments(path) {
|
|
351
|
+
if (path === undefined)
|
|
352
|
+
return [];
|
|
353
|
+
let p = path;
|
|
354
|
+
if (p.startsWith("./"))
|
|
355
|
+
p = p.slice(2);
|
|
356
|
+
p = p.replace(/\/$/, "");
|
|
357
|
+
if (p === "" || p === ".")
|
|
358
|
+
return [];
|
|
359
|
+
const segs = p.split("/");
|
|
360
|
+
return segs.every((s) => s !== "" && s !== "." && s !== ".." && !s.includes("\\") && !s.includes("\0"))
|
|
361
|
+
? segs
|
|
362
|
+
: undefined;
|
|
363
|
+
}
|
|
364
|
+
/**
|
|
365
|
+
* The files under `path` at `commit` (paths relative to `path`, `/`-separated, sorted). Throws
|
|
366
|
+
* {@link GitSourceError}: `marketplace.git_failed` (network, server, missing commit or path),
|
|
367
|
+
* `marketplace.git_too_large` (limits), `marketplace.git_unsupported_entry` (symlink, submodule).
|
|
368
|
+
*/
|
|
369
|
+
export async function readGitTree(loc, o) {
|
|
370
|
+
return (await readGitTreeAndOids(loc, o)).files;
|
|
371
|
+
}
|
|
372
|
+
/**
|
|
373
|
+
* {@link readGitTree}, plus the git tree oids of directories at the same commit: `trees` gets the
|
|
374
|
+
* files read and returns directory paths relative to the repository root (`.` is the root); each
|
|
375
|
+
* one that exists and is a directory gets its tree oid (equal oids mean equal contents, so a
|
|
376
|
+
* plugin directory that did not change keeps its oid across commits).
|
|
377
|
+
*/
|
|
378
|
+
export async function readGitTreeAndOids(loc, o) {
|
|
379
|
+
if (!SHA_RE.test(loc.commit))
|
|
380
|
+
throw failed(`"${loc.commit}" is not a full commit sha`);
|
|
381
|
+
const commit = loc.commit.toLowerCase();
|
|
382
|
+
const segs = pathSegments(loc.path);
|
|
383
|
+
if (segs === undefined)
|
|
384
|
+
throw failed(`invalid path "${loc.path}" in the repository`);
|
|
385
|
+
const op = startOp(loc, o);
|
|
386
|
+
const what = `cannot read ${op.url} at ${commit.slice(0, 12)}`;
|
|
387
|
+
const maxUnpacked = GIT_LIMITS.unpackedFactor * o.maxBytes;
|
|
388
|
+
const fs = scanningFs(maxUnpacked);
|
|
389
|
+
const cache = {};
|
|
390
|
+
const gitdir = await fsp.mkdtemp(join(o.tempRoot ?? tmpdir(), "capybara-git-"));
|
|
391
|
+
try {
|
|
392
|
+
await git.init({ fs, gitdir, bare: true });
|
|
393
|
+
// fetch needs a remote with a refspec; the commit is fetched by sha and matches no refspec
|
|
394
|
+
await git.addRemote({ fs, gitdir, remote: "origin", url: op.url });
|
|
395
|
+
let res;
|
|
396
|
+
try {
|
|
397
|
+
res = await git.fetch({
|
|
398
|
+
fs,
|
|
399
|
+
http: op.http,
|
|
400
|
+
gitdir,
|
|
401
|
+
cache,
|
|
402
|
+
url: op.url,
|
|
403
|
+
ref: commit,
|
|
404
|
+
singleBranch: true,
|
|
405
|
+
depth: 1,
|
|
406
|
+
tags: false,
|
|
407
|
+
});
|
|
408
|
+
}
|
|
409
|
+
catch (e) {
|
|
410
|
+
// A commit that is not a ref tip needs the server to allow reachable-sha wants (GitHub does;
|
|
411
|
+
// GitLab / Gitea depend on their configuration); the server then sends nothing for it
|
|
412
|
+
if (refusedWant(e))
|
|
413
|
+
throw failed(`${what}: ${refusedCommit(commit)}`, e);
|
|
414
|
+
throw e;
|
|
415
|
+
}
|
|
416
|
+
if (res.fetchHead !== commit)
|
|
417
|
+
throw failed(`${what}: ${refusedCommit(commit)}`);
|
|
418
|
+
op.signal.throwIfAborted();
|
|
419
|
+
let c;
|
|
420
|
+
try {
|
|
421
|
+
({ commit: c } = await git.readCommit({ fs, gitdir, oid: commit, cache }));
|
|
422
|
+
}
|
|
423
|
+
catch (e) {
|
|
424
|
+
// the server answered the fetch without the commit
|
|
425
|
+
if (refusedWant(e))
|
|
426
|
+
throw failed(`${what}: ${refusedCommit(commit)}`, e);
|
|
427
|
+
throw e;
|
|
428
|
+
}
|
|
429
|
+
let tree = c.tree;
|
|
430
|
+
const shown = [];
|
|
431
|
+
for (const seg of segs) {
|
|
432
|
+
shown.push(seg);
|
|
433
|
+
const { tree: entries } = await git.readTree({ fs, gitdir, oid: tree, cache });
|
|
434
|
+
const e = entries.find((x) => x.path === seg);
|
|
435
|
+
if (e === undefined)
|
|
436
|
+
throw failed(`${what}: ${shown.join("/")} not found`);
|
|
437
|
+
if (e.mode === "120000")
|
|
438
|
+
throw unsupported(`${shown.join("/")} is a symlink`, shown.join("/"));
|
|
439
|
+
if (e.type === "commit")
|
|
440
|
+
throw unsupported(`${shown.join("/")} is a submodule`, shown.join("/"));
|
|
441
|
+
if (e.type !== "tree")
|
|
442
|
+
throw failed(`${what}: ${shown.join("/")} is not a directory`);
|
|
443
|
+
tree = e.oid;
|
|
444
|
+
}
|
|
445
|
+
const files = new Map();
|
|
446
|
+
let bytes = 0;
|
|
447
|
+
// Every entry visited counts, trees included: a tree-only DAG (one subtree referenced many
|
|
448
|
+
// times at every level) is a handful of objects but exponentially many visits.
|
|
449
|
+
let visits = 0;
|
|
450
|
+
// Parsed trees by oid: a subtree referenced many times (a DAG, or identical directories) is
|
|
451
|
+
// read and parsed once; re-parsing it on every reference made a 20 000-entry walk cost
|
|
452
|
+
// hundreds of tree reads (seconds under load). The visit count above still bounds the walk.
|
|
453
|
+
const parsed = new Map();
|
|
454
|
+
const walk = async (oid, prefix) => {
|
|
455
|
+
op.signal.throwIfAborted();
|
|
456
|
+
let entries = parsed.get(oid);
|
|
457
|
+
if (entries === undefined) {
|
|
458
|
+
({ tree: entries } = await git.readTree({ fs, gitdir, oid, cache }));
|
|
459
|
+
parsed.set(oid, entries);
|
|
460
|
+
}
|
|
461
|
+
for (const e of entries) {
|
|
462
|
+
if (++visits > GIT_LIMITS.maxObjects) {
|
|
463
|
+
throw tooLarge(`the tree has more than ${GIT_LIMITS.maxObjects} entries`);
|
|
464
|
+
}
|
|
465
|
+
const name = e.path;
|
|
466
|
+
// biome-ignore lint/suspicious/noControlCharactersInRegex: control characters are refused
|
|
467
|
+
if (name === "" || name === "." || name === ".." || /[/\\\u0000-\u001f\u007f]/.test(name)) {
|
|
468
|
+
throw unsupported(`invalid entry name ${JSON.stringify(name)} in ${prefix || "."}`, prefix || ".");
|
|
469
|
+
}
|
|
470
|
+
const p = prefix === "" ? name : `${prefix}/${name}`;
|
|
471
|
+
if (o.include !== undefined && !o.include(p, e.type === "tree" ? "tree" : "blob"))
|
|
472
|
+
continue;
|
|
473
|
+
if (e.type === "commit")
|
|
474
|
+
throw unsupported(`${p} is a submodule`, p);
|
|
475
|
+
if (e.mode === "120000")
|
|
476
|
+
throw unsupported(`${p} is a symlink`, p);
|
|
477
|
+
if (e.type === "tree") {
|
|
478
|
+
await walk(e.oid, p);
|
|
479
|
+
continue;
|
|
480
|
+
}
|
|
481
|
+
if (e.type !== "blob")
|
|
482
|
+
throw unsupported(`${p} is a ${e.type}`, p);
|
|
483
|
+
if (files.size >= GIT_LIMITS.maxFiles) {
|
|
484
|
+
throw tooLarge(`more than ${GIT_LIMITS.maxFiles} files`);
|
|
485
|
+
}
|
|
486
|
+
const { blob } = await git.readBlob({ fs, gitdir, oid: e.oid, cache });
|
|
487
|
+
bytes += blob.byteLength;
|
|
488
|
+
if (bytes > maxUnpacked)
|
|
489
|
+
throw tooLarge(`the files are larger than ${maxUnpacked} bytes`);
|
|
490
|
+
files.set(p, blob);
|
|
491
|
+
op.signal.throwIfAborted();
|
|
492
|
+
}
|
|
493
|
+
};
|
|
494
|
+
await walk(tree, "");
|
|
495
|
+
const sorted = new Map([...files.entries()].sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0)));
|
|
496
|
+
const trees = new Map();
|
|
497
|
+
for (const dir of o.trees?.(sorted) ?? []) {
|
|
498
|
+
const want = pathSegments(dir === "." ? undefined : dir);
|
|
499
|
+
if (want === undefined)
|
|
500
|
+
continue;
|
|
501
|
+
let oid = c.tree;
|
|
502
|
+
for (const seg of want) {
|
|
503
|
+
const { tree: entries } = await git.readTree({ fs, gitdir, oid, cache });
|
|
504
|
+
const e = entries.find((x) => x.path === seg);
|
|
505
|
+
oid = e?.type === "tree" && e.mode !== "120000" ? e.oid : undefined;
|
|
506
|
+
if (oid === undefined)
|
|
507
|
+
break;
|
|
508
|
+
}
|
|
509
|
+
if (oid !== undefined)
|
|
510
|
+
trees.set(dir, oid);
|
|
511
|
+
}
|
|
512
|
+
return { files: sorted, trees };
|
|
513
|
+
}
|
|
514
|
+
catch (e) {
|
|
515
|
+
throw mapError(e, op, o, what);
|
|
516
|
+
}
|
|
517
|
+
finally {
|
|
518
|
+
await fsp.rm(gitdir, { recursive: true, force: true });
|
|
519
|
+
}
|
|
520
|
+
}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { type MarketplaceManifest } from "@capybara-hq/plugin-sdk";
|
|
2
|
+
import type { KernelConfig } from "../config/schema.js";
|
|
3
|
+
import { type LookupFn, NetDeniedError, type NetPolicy } from "../net/public-address.js";
|
|
4
|
+
/**
|
|
5
|
+
* Fetching a marketplace manifest `marketplace.json` (C26, spec §5.2) and a marketplace's archive
|
|
6
|
+
* sources. The URLs come from an enterprise admin or the config, but responses are always hostile
|
|
7
|
+
* input:
|
|
8
|
+
* - https only (`allowInsecureLoopback`, tests only, allows http on loopback addresses), no user
|
|
9
|
+
* info in the URL;
|
|
10
|
+
* - every request goes through `net/safeFetch`: the host must resolve to public addresses (or be
|
|
11
|
+
* exempt by `marketplaces.allowPrivateHosts` / the npm registry origin) and the connection is
|
|
12
|
+
* pinned to the checked address;
|
|
13
|
+
* - redirects are not followed (a 3xx fails): one redirect could otherwise send the request (and the
|
|
14
|
+
* token) elsewhere;
|
|
15
|
+
* - a timeout, and the body is counted while read and aborted past `maxBytes`;
|
|
16
|
+
* - the manifest is validated by the SDK's `parseMarketplaceManifest`; an invalid one is refused as
|
|
17
|
+
* a whole (the caller keeps the previous entries);
|
|
18
|
+
* - the token is sent only when the request URL has the same origin as `tokenOrigin` (the
|
|
19
|
+
* marketplace's main URL), never to a mirror on another origin.
|
|
20
|
+
*/
|
|
21
|
+
/** The API error code for a download the network rules refused. */
|
|
22
|
+
export type MarketplaceNetCode = "marketplace.private_address" | "marketplace.redirect";
|
|
23
|
+
/**
|
|
24
|
+
* The API error for a refused download, or undefined when the refusal is not one of the two
|
|
25
|
+
* marketplace codes (an invalid URL or a DNS failure is an ordinary fetch failure).
|
|
26
|
+
*/
|
|
27
|
+
export declare function marketplaceNetCode(e: NetDeniedError): MarketplaceNetCode | undefined;
|
|
28
|
+
/** The network rules for marketplace downloads from the kernel config. */
|
|
29
|
+
export declare function marketplaceNetPolicy(config: KernelConfig): NetPolicy;
|
|
30
|
+
/**
|
|
31
|
+
* The fetch failed (network, HTTP status, redirect, size, timeout). English message, no token.
|
|
32
|
+
* `code` is set when the network rules refused the request.
|
|
33
|
+
*/
|
|
34
|
+
export declare class MarketplaceFetchError extends Error {
|
|
35
|
+
readonly code: MarketplaceNetCode | undefined;
|
|
36
|
+
/** The host the network rules refused (with `code`). */
|
|
37
|
+
readonly host: string | undefined;
|
|
38
|
+
constructor(message: string, options?: {
|
|
39
|
+
cause?: unknown;
|
|
40
|
+
code?: MarketplaceNetCode;
|
|
41
|
+
host?: string;
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
/** The response is not a valid manifest (JSON or schema). */
|
|
45
|
+
export declare class MarketplaceInvalidError extends Error {
|
|
46
|
+
readonly issues: string[];
|
|
47
|
+
constructor(message: string, issues: string[]);
|
|
48
|
+
}
|
|
49
|
+
export interface MarketplaceFetchOptions {
|
|
50
|
+
/** The ETag of the last successful fetch (sent as `If-None-Match`). */
|
|
51
|
+
etag?: string | null;
|
|
52
|
+
token?: string;
|
|
53
|
+
/** The token goes only to this origin (the marketplace's main URL). */
|
|
54
|
+
tokenOrigin?: string;
|
|
55
|
+
maxBytes: number;
|
|
56
|
+
timeoutMs: number;
|
|
57
|
+
net: NetPolicy;
|
|
58
|
+
/** Tests only: replaces the DNS lookup. */
|
|
59
|
+
lookup?: LookupFn;
|
|
60
|
+
signal: AbortSignal;
|
|
61
|
+
}
|
|
62
|
+
export type MarketplaceFetchResult = {
|
|
63
|
+
status: "not_modified";
|
|
64
|
+
} | {
|
|
65
|
+
status: "ok";
|
|
66
|
+
manifest: MarketplaceManifest;
|
|
67
|
+
etag: string | null;
|
|
68
|
+
};
|
|
69
|
+
/**
|
|
70
|
+
* Whether a marketplace URL is usable: https (or http on loopback in tests), at most 2000
|
|
71
|
+
* characters, parseable, without user info. Returns the reason (English) or null.
|
|
72
|
+
*/
|
|
73
|
+
export declare function marketplaceUrlProblem(url: string, allowInsecureLoopback: boolean): string | null;
|
|
74
|
+
/**
|
|
75
|
+
* Fetches and validates one `marketplace.json`. Throws {@link MarketplaceFetchError} or
|
|
76
|
+
* {@link MarketplaceInvalidError}.
|
|
77
|
+
*/
|
|
78
|
+
export declare function fetchMarketplaceManifest(url: string, o: MarketplaceFetchOptions): Promise<MarketplaceFetchResult>;
|
|
79
|
+
/**
|
|
80
|
+
* Downloads a marketplace `archive` source (a plugin tgz at `url`) under the rules in the file
|
|
81
|
+
* header (https, no redirects, at most `maxBytes`, a timeout) and verifies it against the
|
|
82
|
+
* marketplace's `integrity` (sha512 or sha256 SRI). Failures are API errors: a size over the limit
|
|
83
|
+
* -> `extension.package_too_large`; a digest mismatch -> `marketplace.integrity_mismatch`; a host
|
|
84
|
+
* resolving to a private address -> `marketplace.private_address`; a 3xx -> `marketplace.redirect`;
|
|
85
|
+
* anything else -> `marketplace.fetch_failed`.
|
|
86
|
+
*/
|
|
87
|
+
export declare function fetchMarketplaceArchive(archive: {
|
|
88
|
+
url: string;
|
|
89
|
+
integrity: string;
|
|
90
|
+
}, o: {
|
|
91
|
+
maxBytes: number;
|
|
92
|
+
timeoutMs: number;
|
|
93
|
+
net: NetPolicy;
|
|
94
|
+
lookup?: LookupFn;
|
|
95
|
+
signal?: AbortSignal;
|
|
96
|
+
}): Promise<{
|
|
97
|
+
bytes: Uint8Array;
|
|
98
|
+
integrity: string;
|
|
99
|
+
}>;
|