takos-control 1.0.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/package.json +169 -0
- package/src/__tests__/db-runtime-contracts.test.ts +57 -0
- package/src/adapters/analytics-engine-binding.ts +104 -0
- package/src/adapters/dynamo-kv-store.ts +284 -0
- package/src/adapters/firestore-kv-store.ts +287 -0
- package/src/adapters/gcs-object-store.ts +506 -0
- package/src/adapters/openai-binding.ts +83 -0
- package/src/adapters/pgvector-store.ts +236 -0
- package/src/adapters/pubsub-queue.ts +127 -0
- package/src/adapters/r2-compat-types.ts +54 -0
- package/src/adapters/s3-object-store.ts +539 -0
- package/src/adapters/sqs-queue.ts +133 -0
- package/src/adapters/workflow-binding.ts +131 -0
- package/src/application/services/actions/actions-env.ts +49 -0
- package/src/application/services/actions/actions-execution.ts +156 -0
- package/src/application/services/actions/actions-triggers.ts +224 -0
- package/src/application/services/actions/index.ts +18 -0
- package/src/application/services/activitypub/remote-install.ts +170 -0
- package/src/application/services/activitypub/remote-store-client.ts +435 -0
- package/src/application/services/activitypub/store-registry.ts +341 -0
- package/src/application/services/activitypub/store-subscription.ts +240 -0
- package/src/application/services/activitypub/stores.ts +389 -0
- package/src/application/services/agent/agent-models.ts +55 -0
- package/src/application/services/agent/delegation.ts +328 -0
- package/src/application/services/agent/execute-run.ts +46 -0
- package/src/application/services/agent/index.ts +46 -0
- package/src/application/services/agent/langgraph-agent.ts +282 -0
- package/src/application/services/agent/langgraph-checkpointer.ts +556 -0
- package/src/application/services/agent/langgraph-graph.ts +357 -0
- package/src/application/services/agent/langgraph-runner.ts +326 -0
- package/src/application/services/agent/langgraph-tools.ts +157 -0
- package/src/application/services/agent/llm-manager.ts +51 -0
- package/src/application/services/agent/llm.ts +106 -0
- package/src/application/services/agent/memory-manager.ts +84 -0
- package/src/application/services/agent/message-persistence.ts +151 -0
- package/src/application/services/agent/message-utils.ts +167 -0
- package/src/application/services/agent/model-catalog.ts +71 -0
- package/src/application/services/agent/official-skills.ts +437 -0
- package/src/application/services/agent/prompt-assets.generated.ts +23 -0
- package/src/application/services/agent/prompt-budget.ts +140 -0
- package/src/application/services/agent/prompt-builder.ts +72 -0
- package/src/application/services/agent/prompts/core.md +9 -0
- package/src/application/services/agent/prompts/general-workflow.md +6 -0
- package/src/application/services/agent/prompts/modes/assistant.md +4 -0
- package/src/application/services/agent/prompts/modes/default.md +8 -0
- package/src/application/services/agent/prompts/modes/implementer.md +5 -0
- package/src/application/services/agent/prompts/modes/planner.md +4 -0
- package/src/application/services/agent/prompts/modes/researcher.md +5 -0
- package/src/application/services/agent/prompts/modes/reviewer.md +4 -0
- package/src/application/services/agent/prompts/response-guidelines.md +20 -0
- package/src/application/services/agent/prompts/runtime-tool-catalog-empty.md +3 -0
- package/src/application/services/agent/prompts/runtime-tool-catalog-header.md +3 -0
- package/src/application/services/agent/prompts/runtime-tool-catalog-selective.md +8 -0
- package/src/application/services/agent/prompts/skills/planning-structurer.en.md +1 -0
- package/src/application/services/agent/prompts/skills/planning-structurer.ja.md +1 -0
- package/src/application/services/agent/prompts/skills/repo-app-operator.en.md +1 -0
- package/src/application/services/agent/prompts/skills/repo-app-operator.ja.md +1 -0
- package/src/application/services/agent/prompts/skills/research-brief.en.md +1 -0
- package/src/application/services/agent/prompts/skills/research-brief.ja.md +1 -0
- package/src/application/services/agent/prompts/skills/slides-author.en.md +1 -0
- package/src/application/services/agent/prompts/skills/slides-author.ja.md +1 -0
- package/src/application/services/agent/prompts/skills/writing-draft.en.md +1 -0
- package/src/application/services/agent/prompts/skills/writing-draft.ja.md +1 -0
- package/src/application/services/agent/prompts/tool-runtime-rules.md +6 -0
- package/src/application/services/agent/providers/llm-providers.ts +484 -0
- package/src/application/services/agent/remote-tool-executor.ts +78 -0
- package/src/application/services/agent/run-lifecycle.ts +59 -0
- package/src/application/services/agent/runner-config.ts +77 -0
- package/src/application/services/agent/runner-events.ts +169 -0
- package/src/application/services/agent/runner-history.ts +368 -0
- package/src/application/services/agent/runner-types.ts +73 -0
- package/src/application/services/agent/runner.ts +682 -0
- package/src/application/services/agent/security/injection-detector.ts +145 -0
- package/src/application/services/agent/session-closer.ts +438 -0
- package/src/application/services/agent/simple-loop.ts +367 -0
- package/src/application/services/agent/skill-contracts.ts +21 -0
- package/src/application/services/agent/skill-loader.ts +319 -0
- package/src/application/services/agent/skill-plan.ts +67 -0
- package/src/application/services/agent/skill-resolution.ts +328 -0
- package/src/application/services/agent/skill-scoring.ts +261 -0
- package/src/application/services/agent/skill-templates.ts +51 -0
- package/src/application/services/agent/skills.ts +54 -0
- package/src/application/services/agent/thread-context.ts +472 -0
- package/src/application/services/agent/workflow-pr.ts +150 -0
- package/src/application/services/agent/workflow-review.ts +116 -0
- package/src/application/services/agent/workflow-session.ts +156 -0
- package/src/application/services/agent/workflow-types.ts +133 -0
- package/src/application/services/agent/workflow.ts +264 -0
- package/src/application/services/billing/billing-accounts.ts +165 -0
- package/src/application/services/billing/billing-plans.ts +252 -0
- package/src/application/services/billing/billing-run-usage.ts +89 -0
- package/src/application/services/billing/billing-types.ts +94 -0
- package/src/application/services/billing/billing-usage.ts +370 -0
- package/src/application/services/billing/billing.ts +64 -0
- package/src/application/services/billing/stripe.ts +331 -0
- package/src/application/services/cloudflare/api-client.ts +195 -0
- package/src/application/services/cloudflare/resources.ts +134 -0
- package/src/application/services/common-env/audit.ts +65 -0
- package/src/application/services/common-env/crypto.ts +184 -0
- package/src/application/services/common-env/db-helpers.ts +16 -0
- package/src/application/services/common-env/index.ts +4 -0
- package/src/application/services/common-env/link-state.ts +70 -0
- package/src/application/services/common-env/maintenance.ts +36 -0
- package/src/application/services/common-env/manual-link-ops.ts +385 -0
- package/src/application/services/common-env/orchestrator.ts +146 -0
- package/src/application/services/common-env/reconcile-jobs.ts +529 -0
- package/src/application/services/common-env/reconciler.ts +103 -0
- package/src/application/services/common-env/repository.ts +185 -0
- package/src/application/services/common-env/service-link-ops.ts +144 -0
- package/src/application/services/common-env/service.ts +355 -0
- package/src/application/services/common-env/space-env-ops.ts +245 -0
- package/src/application/services/common-env/takos-builtins.ts +386 -0
- package/src/application/services/deployment/artifacts.ts +105 -0
- package/src/application/services/deployment/deployment-artifacts.ts +143 -0
- package/src/application/services/deployment/execute.ts +364 -0
- package/src/application/services/deployment/group-deploy-manifest.ts +71 -0
- package/src/application/services/deployment/group-deploy-types.ts +116 -0
- package/src/application/services/deployment/group-deploy.ts +349 -0
- package/src/application/services/deployment/index.ts +7 -0
- package/src/application/services/deployment/models.ts +154 -0
- package/src/application/services/deployment/provider.ts +358 -0
- package/src/application/services/deployment/resource-provisioner.ts +175 -0
- package/src/application/services/deployment/rollback-orchestrator.ts +260 -0
- package/src/application/services/deployment/rollback.ts +110 -0
- package/src/application/services/deployment/routing.ts +311 -0
- package/src/application/services/deployment/service.ts +325 -0
- package/src/application/services/deployment/state.ts +85 -0
- package/src/application/services/deployment/store.ts +386 -0
- package/src/application/services/deployment/wrangler-config-gen.ts +182 -0
- package/src/application/services/execution/embeddings.ts +457 -0
- package/src/application/services/execution/run-creation.ts +138 -0
- package/src/application/services/execution/run-events.ts +127 -0
- package/src/application/services/execution/runtime-request-handler.ts +173 -0
- package/src/application/services/execution/sql-validation.ts +202 -0
- package/src/application/services/execution/workflow-engine-converters.ts +75 -0
- package/src/application/services/execution/workflow-engine-types.ts +77 -0
- package/src/application/services/execution/workflow-engine.ts +104 -0
- package/src/application/services/execution/workflow-job-scheduler.ts +344 -0
- package/src/application/services/execution/workflow-run-lifecycle.ts +389 -0
- package/src/application/services/execution/workflow-storage.ts +83 -0
- package/src/application/services/git-smart/client/fetch-pack.ts +167 -0
- package/src/application/services/git-smart/client/fetch-refs.ts +134 -0
- package/src/application/services/git-smart/client/index.ts +10 -0
- package/src/application/services/git-smart/core/commit-index.ts +436 -0
- package/src/application/services/git-smart/core/merge.ts +102 -0
- package/src/application/services/git-smart/core/object-store.ts +235 -0
- package/src/application/services/git-smart/core/object.ts +238 -0
- package/src/application/services/git-smart/core/readable-commit.ts +59 -0
- package/src/application/services/git-smart/core/refs.ts +364 -0
- package/src/application/services/git-smart/core/sha1.ts +40 -0
- package/src/application/services/git-smart/core/tree-ops.ts +228 -0
- package/src/application/services/git-smart/git-objects.ts +122 -0
- package/src/application/services/git-smart/index.ts +135 -0
- package/src/application/services/git-smart/operations.ts +154 -0
- package/src/application/services/git-smart/protocol/capabilities.ts +28 -0
- package/src/application/services/git-smart/protocol/packfile-reader.ts +368 -0
- package/src/application/services/git-smart/protocol/packfile-writer.ts +129 -0
- package/src/application/services/git-smart/protocol/pkt-line.ts +97 -0
- package/src/application/services/git-smart/smart-http/info-refs.ts +67 -0
- package/src/application/services/git-smart/smart-http/receive-pack.ts +485 -0
- package/src/application/services/git-smart/smart-http/upload-pack.ts +72 -0
- package/src/application/services/identity/auth-utils.ts +432 -0
- package/src/application/services/identity/locale.ts +19 -0
- package/src/application/services/identity/membership-resolver.ts +28 -0
- package/src/application/services/identity/principals.ts +76 -0
- package/src/application/services/identity/profile-activity.ts +248 -0
- package/src/application/services/identity/response-formatters.ts +88 -0
- package/src/application/services/identity/session.ts +221 -0
- package/src/application/services/identity/shortcut-groups.ts +421 -0
- package/src/application/services/identity/shortcuts.ts +216 -0
- package/src/application/services/identity/space-access.ts +128 -0
- package/src/application/services/identity/space-crud.ts +494 -0
- package/src/application/services/identity/space-members.ts +177 -0
- package/src/application/services/identity/space-models.ts +50 -0
- package/src/application/services/identity/spaces.ts +29 -0
- package/src/application/services/identity/takos-access-tokens.ts +149 -0
- package/src/application/services/identity/user-cache.ts +66 -0
- package/src/application/services/identity/user-settings.ts +146 -0
- package/src/application/services/maintenance/backup-maintenance.ts +453 -0
- package/src/application/services/maintenance/custom-domain-maintenance.ts +415 -0
- package/src/application/services/maintenance/index.ts +31 -0
- package/src/application/services/maintenance/resource-orphan-gc.ts +66 -0
- package/src/application/services/maintenance/session-maintenance.ts +50 -0
- package/src/application/services/maintenance/snapshot-maintenance.ts +147 -0
- package/src/application/services/memory/consolidation.ts +365 -0
- package/src/application/services/memory/extractor.ts +320 -0
- package/src/application/services/memory/index.ts +17 -0
- package/src/application/services/memory/llm-parser.ts +44 -0
- package/src/application/services/memory/memories.ts +392 -0
- package/src/application/services/memory-graph/activation.ts +60 -0
- package/src/application/services/memory-graph/claim-store.ts +306 -0
- package/src/application/services/memory-graph/graph-models.ts +119 -0
- package/src/application/services/memory-graph/memory-graph-runtime.ts +220 -0
- package/src/application/services/memory-graph/observer.ts +158 -0
- package/src/application/services/memory-graph/overlay.ts +101 -0
- package/src/application/services/notifications/notification-models.ts +58 -0
- package/src/application/services/notifications/service.ts +522 -0
- package/src/application/services/oauth/audit.ts +50 -0
- package/src/application/services/oauth/authorization.ts +286 -0
- package/src/application/services/oauth/client.ts +346 -0
- package/src/application/services/oauth/consent.ts +244 -0
- package/src/application/services/oauth/device.ts +295 -0
- package/src/application/services/oauth/pkce.ts +60 -0
- package/src/application/services/oauth/scopes.ts +61 -0
- package/src/application/services/oauth/token.ts +555 -0
- package/src/application/services/offload/index.ts +31 -0
- package/src/application/services/offload/messages.ts +67 -0
- package/src/application/services/offload/run-events.ts +128 -0
- package/src/application/services/offload/usage-client.ts +39 -0
- package/src/application/services/offload/usage-events.ts +100 -0
- package/src/application/services/platform/app-deployments.ts +397 -0
- package/src/application/services/platform/capabilities.ts +288 -0
- package/src/application/services/platform/custom-domains/access.ts +93 -0
- package/src/application/services/platform/custom-domains/cloudflare.ts +64 -0
- package/src/application/services/platform/custom-domains/dns.ts +55 -0
- package/src/application/services/platform/custom-domains/domain-crud.ts +230 -0
- package/src/application/services/platform/custom-domains/domain-models.ts +71 -0
- package/src/application/services/platform/custom-domains/domain-verification.ts +345 -0
- package/src/application/services/platform/custom-domains.ts +27 -0
- package/src/application/services/platform/desired-state-types.ts +111 -0
- package/src/application/services/platform/env-state-resolution.ts +249 -0
- package/src/application/services/platform/infra.ts +246 -0
- package/src/application/services/platform/mcp/crud.ts +343 -0
- package/src/application/services/platform/mcp/crypto.ts +63 -0
- package/src/application/services/platform/mcp/mcp-models.ts +119 -0
- package/src/application/services/platform/mcp/oauth.ts +375 -0
- package/src/application/services/platform/mcp/validation.ts +69 -0
- package/src/application/services/platform/mcp.ts +51 -0
- package/src/application/services/platform/resource-bindings.ts +172 -0
- package/src/application/services/platform/rollout-health.ts +48 -0
- package/src/application/services/platform/rollout.ts +358 -0
- package/src/application/services/platform/runtime-config.ts +155 -0
- package/src/application/services/platform/ui-extensions.ts +190 -0
- package/src/application/services/platform/worker-desired-state.ts +397 -0
- package/src/application/services/platform/workers.ts +426 -0
- package/src/application/services/platform/workflow-artifacts.ts +204 -0
- package/src/application/services/pull-requests/ai-review.ts +362 -0
- package/src/application/services/pull-requests/event-tasks.ts +67 -0
- package/src/application/services/pull-requests/index.ts +25 -0
- package/src/application/services/pull-requests/merge-resolution.ts +501 -0
- package/src/application/services/r2/orphaned-object-gc.ts +268 -0
- package/src/application/services/resources/access.ts +180 -0
- package/src/application/services/resources/bindings.ts +185 -0
- package/src/application/services/resources/format.ts +76 -0
- package/src/application/services/resources/index.ts +32 -0
- package/src/application/services/resources/lifecycle.ts +92 -0
- package/src/application/services/resources/store.ts +387 -0
- package/src/application/services/routing/cache.ts +176 -0
- package/src/application/services/routing/phase.ts +20 -0
- package/src/application/services/routing/resolver.ts +227 -0
- package/src/application/services/routing/routing-models.ts +46 -0
- package/src/application/services/routing/service.ts +298 -0
- package/src/application/services/routing/sharding.ts +41 -0
- package/src/application/services/run-notifier/client.ts +32 -0
- package/src/application/services/run-notifier/index.ts +20 -0
- package/src/application/services/run-notifier/run-events-contract.ts +114 -0
- package/src/application/services/run-notifier/run-failure-events.ts +62 -0
- package/src/application/services/run-notifier/run-notifier-payload.ts +28 -0
- package/src/application/services/runs/create-thread-run-store.ts +527 -0
- package/src/application/services/runs/create-thread-run-validation.ts +88 -0
- package/src/application/services/runs/run-serialization.ts +102 -0
- package/src/application/services/seed-repositories.ts +37 -0
- package/src/application/services/source/__tests__/app-manifest-template.test.ts +211 -0
- package/src/application/services/source/app-manifest-bundle.ts +427 -0
- package/src/application/services/source/app-manifest-parser.ts +375 -0
- package/src/application/services/source/app-manifest-template.ts +93 -0
- package/src/application/services/source/app-manifest-types.ts +241 -0
- package/src/application/services/source/app-manifest-validation.ts +212 -0
- package/src/application/services/source/app-manifest.ts +38 -0
- package/src/application/services/source/apps.ts +130 -0
- package/src/application/services/source/explore-catalog.ts +446 -0
- package/src/application/services/source/explore-packages.ts +612 -0
- package/src/application/services/source/explore-repos.ts +189 -0
- package/src/application/services/source/explore-types.ts +155 -0
- package/src/application/services/source/explore.ts +20 -0
- package/src/application/services/source/external-import-utils.ts +126 -0
- package/src/application/services/source/external-import.ts +430 -0
- package/src/application/services/source/fork.ts +349 -0
- package/src/application/services/source/git.ts +556 -0
- package/src/application/services/source/info-units.ts +383 -0
- package/src/application/services/source/official-packages.ts +50 -0
- package/src/application/services/source/repo-release-assets.ts +55 -0
- package/src/application/services/source/repos.ts +231 -0
- package/src/application/services/source/search.ts +247 -0
- package/src/application/services/source/skill-search.ts +315 -0
- package/src/application/services/source/skills.ts +584 -0
- package/src/application/services/source/source-exploration.ts +221 -0
- package/src/application/services/source/space-storage.ts +484 -0
- package/src/application/services/sync/git-sync-types.ts +35 -0
- package/src/application/services/sync/git-sync.ts +228 -0
- package/src/application/services/sync/index.ts +6 -0
- package/src/application/services/sync/models.ts +65 -0
- package/src/application/services/sync/runtime-session.ts +444 -0
- package/src/application/services/sync/session-files.ts +370 -0
- package/src/application/services/sync/snapshot-cleanup.ts +290 -0
- package/src/application/services/sync/snapshot-compressor.ts +79 -0
- package/src/application/services/sync/snapshot-storage.ts +136 -0
- package/src/application/services/sync/snapshot.ts +426 -0
- package/src/application/services/threads/thread-export.ts +140 -0
- package/src/application/services/threads/thread-history.ts +422 -0
- package/src/application/services/threads/thread-search.ts +299 -0
- package/src/application/services/threads/thread-service.ts +394 -0
- package/src/application/services/threads/thread-shares.ts +200 -0
- package/src/application/services/threads/thread-timeline.ts +44 -0
- package/src/application/services/wfp/assets.ts +218 -0
- package/src/application/services/wfp/bindings.ts +176 -0
- package/src/application/services/wfp/client.ts +199 -0
- package/src/application/services/wfp/d1.ts +133 -0
- package/src/application/services/wfp/index.ts +23 -0
- package/src/application/services/wfp/kv.ts +38 -0
- package/src/application/services/wfp/orchestrator.ts +339 -0
- package/src/application/services/wfp/queues.ts +77 -0
- package/src/application/services/wfp/r2.ts +131 -0
- package/src/application/services/wfp/service.ts +341 -0
- package/src/application/services/wfp/vectorize.ts +48 -0
- package/src/application/services/wfp/wfp-contracts.ts +102 -0
- package/src/application/services/wfp/worker-metadata.ts +54 -0
- package/src/application/services/wfp/workers.ts +307 -0
- package/src/application/services/workflow-runs/commands.ts +354 -0
- package/src/application/services/workflow-runs/read-model.ts +202 -0
- package/src/application/services/workflow-runs/stream.ts +54 -0
- package/src/application/tools/builtin/agent.ts +383 -0
- package/src/application/tools/builtin/artifact.ts +163 -0
- package/src/application/tools/builtin/browser/definitions.ts +167 -0
- package/src/application/tools/builtin/browser/handler-action.ts +76 -0
- package/src/application/tools/builtin/browser/handler-close.ts +31 -0
- package/src/application/tools/builtin/browser/handler-extract.ts +42 -0
- package/src/application/tools/builtin/browser/handler-goto.ts +41 -0
- package/src/application/tools/builtin/browser/handler-html.ts +38 -0
- package/src/application/tools/builtin/browser/handler-open.ts +68 -0
- package/src/application/tools/builtin/browser/handler-screenshot.ts +33 -0
- package/src/application/tools/builtin/browser/session.ts +51 -0
- package/src/application/tools/builtin/browser.ts +27 -0
- package/src/application/tools/builtin/container/availability.ts +65 -0
- package/src/application/tools/builtin/container/definitions.ts +119 -0
- package/src/application/tools/builtin/container/handler-commit.ts +182 -0
- package/src/application/tools/builtin/container/handler-create-repository.ts +54 -0
- package/src/application/tools/builtin/container/handler-start.ts +236 -0
- package/src/application/tools/builtin/container/handler-status.ts +108 -0
- package/src/application/tools/builtin/container/handler-stop.ts +64 -0
- package/src/application/tools/builtin/container/session.ts +116 -0
- package/src/application/tools/builtin/container.ts +39 -0
- package/src/application/tools/builtin/deploy.ts +65 -0
- package/src/application/tools/builtin/discovery.ts +142 -0
- package/src/application/tools/builtin/file/definitions.ts +220 -0
- package/src/application/tools/builtin/file/file-operations.ts +112 -0
- package/src/application/tools/builtin/file/handler-copy.ts +77 -0
- package/src/application/tools/builtin/file/handler-delete.ts +34 -0
- package/src/application/tools/builtin/file/handler-list.ts +26 -0
- package/src/application/tools/builtin/file/handler-mkdir.ts +25 -0
- package/src/application/tools/builtin/file/handler-read.ts +27 -0
- package/src/application/tools/builtin/file/handler-rename.ts +85 -0
- package/src/application/tools/builtin/file/handler-write-binary.ts +63 -0
- package/src/application/tools/builtin/file/handler-write.ts +41 -0
- package/src/application/tools/builtin/file/limits.ts +114 -0
- package/src/application/tools/builtin/file/session.ts +86 -0
- package/src/application/tools/builtin/file.ts +54 -0
- package/src/application/tools/builtin/index.ts +9 -0
- package/src/application/tools/builtin/info-unit.ts +403 -0
- package/src/application/tools/builtin/mcp.ts +232 -0
- package/src/application/tools/builtin/memory-graph.ts +97 -0
- package/src/application/tools/builtin/memory.ts +247 -0
- package/src/application/tools/builtin/platform/deployment-history.ts +185 -0
- package/src/application/tools/builtin/platform/deployments.ts +298 -0
- package/src/application/tools/builtin/platform/domains.ts +264 -0
- package/src/application/tools/builtin/platform/worker-settings.ts +482 -0
- package/src/application/tools/builtin/platform.ts +63 -0
- package/src/application/tools/builtin/registry.ts +133 -0
- package/src/application/tools/builtin/repo.ts +135 -0
- package/src/application/tools/builtin/runtime-tool-executor.ts +259 -0
- package/src/application/tools/builtin/space-app-deployments.ts +136 -0
- package/src/application/tools/builtin/space-common-env.ts +125 -0
- package/src/application/tools/builtin/space-files.ts +414 -0
- package/src/application/tools/builtin/space-skills.ts +482 -0
- package/src/application/tools/builtin/space-source.ts +193 -0
- package/src/application/tools/builtin/storage/d1.ts +309 -0
- package/src/application/tools/builtin/storage/kv.ts +201 -0
- package/src/application/tools/builtin/storage/r2.ts +344 -0
- package/src/application/tools/builtin/storage/resources.ts +288 -0
- package/src/application/tools/builtin/storage/validators.ts +35 -0
- package/src/application/tools/builtin/storage.ts +64 -0
- package/src/application/tools/builtin/web.ts +492 -0
- package/src/application/tools/candidate-selector.ts +131 -0
- package/src/application/tools/capabilities.ts +51 -0
- package/src/application/tools/capability-registry.ts +79 -0
- package/src/application/tools/capability-types.ts +44 -0
- package/src/application/tools/circuit-breaker.ts +149 -0
- package/src/application/tools/descriptor-builder.ts +185 -0
- package/src/application/tools/executor-setup.ts +195 -0
- package/src/application/tools/executor-utils.ts +21 -0
- package/src/application/tools/executor.ts +399 -0
- package/src/application/tools/idempotency.ts +137 -0
- package/src/application/tools/index.ts +61 -0
- package/src/application/tools/loaders/mcp-tools.ts +261 -0
- package/src/application/tools/mcp-client.ts +116 -0
- package/src/application/tools/namespace-map.ts +133 -0
- package/src/application/tools/resolver.ts +125 -0
- package/src/application/tools/tool-circuit-breaker.ts +84 -0
- package/src/application/tools/tool-definitions.ts +140 -0
- package/src/application/tools/tool-error-classifier.ts +115 -0
- package/src/application/tools/tool-permission.ts +103 -0
- package/src/application/tools/tool-policy-helpers.ts +107 -0
- package/src/application/tools/tool-policy-types.ts +98 -0
- package/src/application/tools/tool-policy.ts +579 -0
- package/src/dispatch.ts +183 -0
- package/src/index.ts +3 -0
- package/src/infra/db/client.ts +28 -0
- package/src/infra/db/index.ts +174 -0
- package/src/infra/db/schema-accounts.ts +198 -0
- package/src/infra/db/schema-agents.ts +305 -0
- package/src/infra/db/schema-auth.ts +58 -0
- package/src/infra/db/schema-billing.ts +120 -0
- package/src/infra/db/schema-oauth.ts +194 -0
- package/src/infra/db/schema-platform.ts +437 -0
- package/src/infra/db/schema-repos.ts +348 -0
- package/src/infra/db/schema-services.ts +74 -0
- package/src/infra/db/schema-workers.ts +359 -0
- package/src/infra/db/schema-workflows.ts +114 -0
- package/src/infra/db/schema.ts +172 -0
- package/src/local-platform/adapters/local.redis.test.ts +145 -0
- package/src/local-platform/bootstrap.test.ts +1374 -0
- package/src/local-platform/bootstrap.ts +1 -0
- package/src/local-platform/cloudflare-containers-shim.mjs +28 -0
- package/src/local-platform/cloudflare-workers-shim.mjs +8 -0
- package/src/local-platform/container-backend.ts +65 -0
- package/src/local-platform/d1-migrations.ts +338 -0
- package/src/local-platform/d1-prepared-statement.ts +104 -0
- package/src/local-platform/d1-shared.ts +131 -0
- package/src/local-platform/d1-sql-rewrite.ts +386 -0
- package/src/local-platform/docker-container-backend.ts +205 -0
- package/src/local-platform/execution-context.ts +24 -0
- package/src/local-platform/executor-control-rpc.ts +398 -0
- package/src/local-platform/fetch-server.ts +8 -0
- package/src/local-platform/in-memory-bindings.test.ts +49 -0
- package/src/local-platform/in-memory-bindings.ts +91 -0
- package/src/local-platform/in-memory-d1.ts +126 -0
- package/src/local-platform/in-memory-kv.ts +84 -0
- package/src/local-platform/in-memory-queue.ts +23 -0
- package/src/local-platform/in-memory-r2.ts +272 -0
- package/src/local-platform/k8s-container-backend.ts +364 -0
- package/src/local-platform/load-adapter.ts +42 -0
- package/src/local-platform/miniflare-bindings.ts +353 -0
- package/src/local-platform/miniflare-registry.ts +351 -0
- package/src/local-platform/node-fetch-server.ts +70 -0
- package/src/local-platform/node-resolve-loader.mjs +97 -0
- package/src/local-platform/oci-orchestrator-node.ts +23 -0
- package/src/local-platform/oci-orchestrator.test.ts +110 -0
- package/src/local-platform/oci-orchestrator.ts +529 -0
- package/src/local-platform/persistent-bindings.test.ts +173 -0
- package/src/local-platform/persistent-bindings.ts +6 -0
- package/src/local-platform/persistent-d1.ts +171 -0
- package/src/local-platform/persistent-durable-objects.ts +57 -0
- package/src/local-platform/persistent-kv.ts +121 -0
- package/src/local-platform/persistent-queue.ts +59 -0
- package/src/local-platform/persistent-r2.test.ts +72 -0
- package/src/local-platform/persistent-r2.ts +376 -0
- package/src/local-platform/persistent-shared.ts +27 -0
- package/src/local-platform/public-runtime-contract.test.ts +211 -0
- package/src/local-platform/queue-runtime.ts +85 -0
- package/src/local-platform/redis-bindings.ts +185 -0
- package/src/local-platform/routing-store.ts +118 -0
- package/src/local-platform/run-smoke-proxyless.ts +67 -0
- package/src/local-platform/run-smoke.ts +176 -0
- package/src/local-platform/runtime-env.ts +114 -0
- package/src/local-platform/runtime-gateway-stubs.ts +168 -0
- package/src/local-platform/runtime-host-fetch.ts +154 -0
- package/src/local-platform/runtime-http.ts +63 -0
- package/src/local-platform/runtime-types.ts +96 -0
- package/src/local-platform/runtime.ts +114 -0
- package/src/local-platform/tenant-binding-polyfills.ts +203 -0
- package/src/local-platform/tenant-binding-rpc.ts +216 -0
- package/src/local-platform/tenant-resource-limits.ts +32 -0
- package/src/local-platform/tenant-worker-runtime.ts +179 -0
- package/src/local-platform/url-registry.ts +75 -0
- package/src/local-platform/worker.test.ts +78 -0
- package/src/local-platform/worker.ts +186 -0
- package/src/node-platform/env-builder.ts +317 -0
- package/src/node-platform/index.ts +7 -0
- package/src/node-platform/resolvers/ai-resolver.ts +39 -0
- package/src/node-platform/resolvers/bucket-resolver.ts +89 -0
- package/src/node-platform/resolvers/db-resolver.ts +17 -0
- package/src/node-platform/resolvers/dispatch-resolver.ts +119 -0
- package/src/node-platform/resolvers/durable-object-resolver.ts +17 -0
- package/src/node-platform/resolvers/env-helpers.ts +47 -0
- package/src/node-platform/resolvers/kv-resolver.ts +39 -0
- package/src/node-platform/resolvers/queue-resolver.ts +99 -0
- package/src/node-platform/resolvers/routing-resolver.ts +103 -0
- package/src/platform/accessors.ts +100 -0
- package/src/platform/adapters/node.ts +236 -0
- package/src/platform/adapters/shared.ts +161 -0
- package/src/platform/adapters/workers.ts +133 -0
- package/src/platform/context.ts +26 -0
- package/src/platform/index.ts +43 -0
- package/src/platform/platform-config.ts +170 -0
- package/src/platform/providers/cloudflare/pdf-render.ts +30 -0
- package/src/platform/providers/cloudflare/resources.ts +19 -0
- package/src/platform/providers/cloudflare/wfp.ts +22 -0
- package/src/platform/providers/node/pdf-render.ts +123 -0
- package/src/runtime/container-hosts/browser-session-host.ts +359 -0
- package/src/runtime/container-hosts/browser-session-types.ts +33 -0
- package/src/runtime/container-hosts/container-runtime.ts +52 -0
- package/src/runtime/container-hosts/d1-raw.ts +22 -0
- package/src/runtime/container-hosts/executor-auth.ts +161 -0
- package/src/runtime/container-hosts/executor-control-rpc.ts +449 -0
- package/src/runtime/container-hosts/executor-dispatch.ts +84 -0
- package/src/runtime/container-hosts/executor-host.ts +447 -0
- package/src/runtime/container-hosts/executor-proxy-config.ts +38 -0
- package/src/runtime/container-hosts/executor-proxy-handlers.ts +427 -0
- package/src/runtime/container-hosts/executor-run-state.ts +389 -0
- package/src/runtime/container-hosts/executor-utils.ts +269 -0
- package/src/runtime/container-hosts/proxy-token-manager.ts +188 -0
- package/src/runtime/container-hosts/runtime-host.ts +241 -0
- package/src/runtime/durable-objects/do-header-utils.ts +160 -0
- package/src/runtime/durable-objects/git-push-lock.ts +94 -0
- package/src/runtime/durable-objects/notification-notifier.ts +257 -0
- package/src/runtime/durable-objects/rate-limiter.ts +268 -0
- package/src/runtime/durable-objects/routing.ts +339 -0
- package/src/runtime/durable-objects/run-notifier.ts +555 -0
- package/src/runtime/durable-objects/session.ts +167 -0
- package/src/runtime/executor-proxy-api.ts +211 -0
- package/src/runtime/indexer/handlers.ts +133 -0
- package/src/runtime/indexer/index.ts +103 -0
- package/src/runtime/queues/deploy-jobs.ts +89 -0
- package/src/runtime/queues/parallel-steps.ts +433 -0
- package/src/runtime/queues/workflow-dlq.ts +132 -0
- package/src/runtime/queues/workflow-events.ts +34 -0
- package/src/runtime/queues/workflow-expressions.ts +69 -0
- package/src/runtime/queues/workflow-job-handler.ts +193 -0
- package/src/runtime/queues/workflow-job-phases.ts +335 -0
- package/src/runtime/queues/workflow-jobs.ts +43 -0
- package/src/runtime/queues/workflow-runner.ts +87 -0
- package/src/runtime/queues/workflow-runtime-client.ts +180 -0
- package/src/runtime/queues/workflow-secrets.ts +78 -0
- package/src/runtime/queues/workflow-steps.ts +62 -0
- package/src/runtime/queues/workflow-types.ts +163 -0
- package/src/runtime/runner/cron-handler.ts +78 -0
- package/src/runtime/runner/index.ts +20 -0
- package/src/runtime/runner/queue-handler.ts +247 -0
- package/src/runtime/runner/runner-constants.ts +7 -0
- package/src/runtime/worker/egress.ts +375 -0
- package/src/runtime/worker/env.ts +63 -0
- package/src/runtime/worker/index.ts +11 -0
- package/src/runtime/worker/runtime-factory.ts +111 -0
- package/src/server/middleware/auth.ts +210 -0
- package/src/server/middleware/billing.ts +62 -0
- package/src/server/middleware/body-size.ts +59 -0
- package/src/server/middleware/cache.ts +192 -0
- package/src/server/middleware/content-type.ts +59 -0
- package/src/server/middleware/git-auth.ts +103 -0
- package/src/server/middleware/oauth-auth.ts +204 -0
- package/src/server/middleware/param-validation.ts +59 -0
- package/src/server/middleware/plan-gates.ts +71 -0
- package/src/server/middleware/space-access.ts +125 -0
- package/src/server/middleware/static-assets.ts +25 -0
- package/src/server/middleware/trust-tier.ts +42 -0
- package/src/server/middleware/turnstile.ts +50 -0
- package/src/server/routes/activitypub-store/activitypub-queries.ts +234 -0
- package/src/server/routes/activitypub-store/routes.ts +512 -0
- package/src/server/routes/agent-tasks-handlers.ts +211 -0
- package/src/server/routes/agent-tasks.ts +352 -0
- package/src/server/routes/api.ts +399 -0
- package/src/server/routes/app-deployments.ts +201 -0
- package/src/server/routes/apps.ts +393 -0
- package/src/server/routes/auth/cli.ts +226 -0
- package/src/server/routes/auth/external.ts +366 -0
- package/src/server/routes/auth/html.ts +398 -0
- package/src/server/routes/auth/link.ts +158 -0
- package/src/server/routes/auth/provisioning.ts +210 -0
- package/src/server/routes/auth/session.ts +277 -0
- package/src/server/routes/auth-api.ts +155 -0
- package/src/server/routes/billing/routes.ts +494 -0
- package/src/server/routes/billing/stripe.ts +128 -0
- package/src/server/routes/browser-sessions.ts +258 -0
- package/src/server/routes/common-env/handlers.ts +23 -0
- package/src/server/routes/custom-domains.ts +132 -0
- package/src/server/routes/explore/explore-filters.ts +262 -0
- package/src/server/routes/explore/index.ts +1 -0
- package/src/server/routes/explore/packages.ts +392 -0
- package/src/server/routes/explore/repos.ts +218 -0
- package/src/server/routes/explore/routes.ts +14 -0
- package/src/server/routes/explore/users.ts +139 -0
- package/src/server/routes/git.ts +218 -0
- package/src/server/routes/index/graph.ts +127 -0
- package/src/server/routes/index/handlers.ts +210 -0
- package/src/server/routes/index/index-context.ts +80 -0
- package/src/server/routes/index/index.ts +50 -0
- package/src/server/routes/index/jobs.ts +159 -0
- package/src/server/routes/mcp.ts +343 -0
- package/src/server/routes/me.ts +408 -0
- package/src/server/routes/memories.ts +366 -0
- package/src/server/routes/notifications-sse.ts +54 -0
- package/src/server/routes/notifications.ts +158 -0
- package/src/server/routes/oauth/authorize.ts +311 -0
- package/src/server/routes/oauth/device.ts +344 -0
- package/src/server/routes/oauth/introspect.ts +82 -0
- package/src/server/routes/oauth/register.ts +185 -0
- package/src/server/routes/oauth/request-utils.ts +94 -0
- package/src/server/routes/oauth/revoke.ts +69 -0
- package/src/server/routes/oauth/routes.ts +255 -0
- package/src/server/routes/oauth/token.ts +409 -0
- package/src/server/routes/oauth/userinfo.ts +101 -0
- package/src/server/routes/oauth-consent-api.ts +468 -0
- package/src/server/routes/profiles/api.ts +14 -0
- package/src/server/routes/profiles/block-follow-helpers.ts +166 -0
- package/src/server/routes/profiles/block-mute.ts +127 -0
- package/src/server/routes/profiles/dto.ts +42 -0
- package/src/server/routes/profiles/follow.ts +449 -0
- package/src/server/routes/profiles/index.ts +12 -0
- package/src/server/routes/profiles/profile-crud.ts +276 -0
- package/src/server/routes/profiles/profile-queries.ts +245 -0
- package/src/server/routes/profiles/register.ts +20 -0
- package/src/server/routes/profiles/repo.ts +382 -0
- package/src/server/routes/profiles/view.ts +213 -0
- package/src/server/routes/public-share.ts +143 -0
- package/src/server/routes/pull-requests/comments.ts +159 -0
- package/src/server/routes/pull-requests/diff.ts +309 -0
- package/src/server/routes/pull-requests/dto.ts +238 -0
- package/src/server/routes/pull-requests/git-store.ts +2 -0
- package/src/server/routes/pull-requests/index.ts +12 -0
- package/src/server/routes/pull-requests/merge-handlers.ts +266 -0
- package/src/server/routes/pull-requests/merge.ts +423 -0
- package/src/server/routes/pull-requests/read-model.ts +201 -0
- package/src/server/routes/pull-requests/reviews.ts +259 -0
- package/src/server/routes/pull-requests/routes.ts +305 -0
- package/src/server/routes/pull-requests/workflow-trigger.ts +61 -0
- package/src/server/routes/reminders.ts +173 -0
- package/src/server/routes/repos/actions/artifacts.ts +90 -0
- package/src/server/routes/repos/actions/jobs.ts +137 -0
- package/src/server/routes/repos/actions/logs.ts +74 -0
- package/src/server/routes/repos/actions/runs.ts +174 -0
- package/src/server/routes/repos/actions/secrets.ts +145 -0
- package/src/server/routes/repos/external-import.ts +158 -0
- package/src/server/routes/repos/forks.ts +196 -0
- package/src/server/routes/repos/git-advanced.ts +509 -0
- package/src/server/routes/repos/git-commits.ts +344 -0
- package/src/server/routes/repos/git-files.ts +218 -0
- package/src/server/routes/repos/git-refs.ts +203 -0
- package/src/server/routes/repos/git-shared.ts +57 -0
- package/src/server/routes/repos/git-write-operations.ts +217 -0
- package/src/server/routes/repos/git.ts +12 -0
- package/src/server/routes/repos/index.ts +30 -0
- package/src/server/routes/repos/release-assets.ts +299 -0
- package/src/server/routes/repos/release-crud.ts +419 -0
- package/src/server/routes/repos/release-shared.ts +59 -0
- package/src/server/routes/repos/releases.ts +8 -0
- package/src/server/routes/repos/repo-helpers.ts +168 -0
- package/src/server/routes/repos/routes.ts +338 -0
- package/src/server/routes/repos/shared.ts +110 -0
- package/src/server/routes/repos/stars.ts +200 -0
- package/src/server/routes/repos/sync.ts +500 -0
- package/src/server/routes/repos/workflows.ts +388 -0
- package/src/server/routes/resources/access.ts +109 -0
- package/src/server/routes/resources/bindings.ts +157 -0
- package/src/server/routes/resources/d1.ts +294 -0
- package/src/server/routes/resources/index.ts +16 -0
- package/src/server/routes/resources/r2.ts +181 -0
- package/src/server/routes/resources/routes.ts +407 -0
- package/src/server/routes/resources/tokens.ts +365 -0
- package/src/server/routes/rpc-types.ts +87 -0
- package/src/server/routes/runs/access.ts +34 -0
- package/src/server/routes/runs/create.ts +42 -0
- package/src/server/routes/runs/list.ts +120 -0
- package/src/server/routes/runs/observation.ts +161 -0
- package/src/server/routes/runs/routes.ts +274 -0
- package/src/server/routes/runs/sse.ts +62 -0
- package/src/server/routes/search.ts +220 -0
- package/src/server/routes/seed-repositories.ts +17 -0
- package/src/server/routes/sessions/auth.ts +33 -0
- package/src/server/routes/sessions/heartbeat.ts +120 -0
- package/src/server/routes/sessions/index.ts +57 -0
- package/src/server/routes/sessions/lifecycle.ts +337 -0
- package/src/server/routes/sessions/session-mappers.ts +49 -0
- package/src/server/routes/setup.ts +111 -0
- package/src/server/routes/shared/route-auth.ts +245 -0
- package/src/server/routes/shortcuts.ts +335 -0
- package/src/server/routes/skills.ts +443 -0
- package/src/server/routes/smart-http.ts +380 -0
- package/src/server/routes/spaces/common-env.ts +92 -0
- package/src/server/routes/spaces/members.ts +326 -0
- package/src/server/routes/spaces/repositories.ts +69 -0
- package/src/server/routes/spaces/routes.ts +386 -0
- package/src/server/routes/spaces/storage-downloads.ts +257 -0
- package/src/server/routes/spaces/storage-management.ts +354 -0
- package/src/server/routes/spaces/storage-operations.ts +46 -0
- package/src/server/routes/spaces/storage-uploads.ts +195 -0
- package/src/server/routes/spaces/storage.ts +10 -0
- package/src/server/routes/spaces/store-registry.ts +413 -0
- package/src/server/routes/spaces/stores.ts +139 -0
- package/src/server/routes/thread-messages.ts +141 -0
- package/src/server/routes/thread-shares.ts +113 -0
- package/src/server/routes/threads.ts +450 -0
- package/src/server/routes/well-known.ts +120 -0
- package/src/server/routes/workers/deployments.ts +339 -0
- package/src/server/routes/workers/index.ts +12 -0
- package/src/server/routes/workers/routes.ts +305 -0
- package/src/server/routes/workers/settings-bindings.ts +184 -0
- package/src/server/routes/workers/settings-common-env.ts +272 -0
- package/src/server/routes/workers/settings-config.ts +95 -0
- package/src/server/routes/workers/settings-env-vars.ts +107 -0
- package/src/server/routes/workers/settings.ts +14 -0
- package/src/server/routes/workers/slug.ts +149 -0
- package/src/server/routes/zod-validator.ts +24 -0
- package/src/shared/config/index.ts +38 -0
- package/src/shared/config/limits.ts +104 -0
- package/src/shared/config/timeouts.ts +71 -0
- package/src/shared/constants/app.ts +62 -0
- package/src/shared/constants/dns.ts +12 -0
- package/src/shared/constants/index.ts +11 -0
- package/src/shared/constants/roles.ts +45 -0
- package/src/shared/types/bindings.ts +71 -0
- package/src/shared/types/drizzle-helpers.ts +5 -0
- package/src/shared/types/env.ts +151 -0
- package/src/shared/types/index.ts +172 -0
- package/src/shared/types/models.ts +506 -0
- package/src/shared/types/oauth.ts +216 -0
- package/src/shared/types/queue-messages.ts +140 -0
- package/src/shared/types/routing.ts +54 -0
- package/src/shared/utils/content-type.ts +39 -0
- package/src/shared/utils/crypto.ts +181 -0
- package/src/shared/utils/date-utils.ts +16 -0
- package/src/shared/utils/db-guards.ts +39 -0
- package/src/shared/utils/db-transaction.ts +157 -0
- package/src/shared/utils/device-auth-rate-limit.ts +40 -0
- package/src/shared/utils/domain-validation.ts +428 -0
- package/src/shared/utils/encoding-utils.ts +77 -0
- package/src/shared/utils/error-response.ts +51 -0
- package/src/shared/utils/gzip.ts +67 -0
- package/src/shared/utils/hash.ts +36 -0
- package/src/shared/utils/http-response.ts +37 -0
- package/src/shared/utils/index.ts +65 -0
- package/src/shared/utils/lcs-diff.ts +65 -0
- package/src/shared/utils/logger.ts +220 -0
- package/src/shared/utils/naming-utils.ts +16 -0
- package/src/shared/utils/path-validation.ts +124 -0
- package/src/shared/utils/rate-limiter.ts +149 -0
- package/src/shared/utils/service-client.ts +109 -0
- package/src/shared/utils/sliding-window.ts +103 -0
- package/src/shared/utils/spa-fallback.ts +26 -0
- package/src/shared/utils/token-bucket.ts +106 -0
- package/src/shared/utils/unified-diff.ts +109 -0
- package/src/shared/utils/url-utils.ts +18 -0
- package/src/shared/utils/validate-env.ts +126 -0
- package/src/shared/utils/with-timeout.ts +32 -0
- package/src/shared/utils/zip-stream.ts +226 -0
- package/src/web.ts +505 -0
- package/src/worker-emulation/redis-durable-object.ts +246 -0
- package/src/worker-emulation/sse-notifier.ts +316 -0
|
@@ -0,0 +1,368 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Packfile reader — parse incoming packfiles from git push.
|
|
3
|
+
*
|
|
4
|
+
* Reads packfile objects, inflates, and stores as loose objects in R2.
|
|
5
|
+
* Supports undeltified objects (commit, tree, blob, tag) and delta objects.
|
|
6
|
+
*
|
|
7
|
+
* Uses fflate for synchronous zlib inflate, which reports consumed bytes
|
|
8
|
+
* and eliminates the need for binary search to find zlib frame boundaries.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import type { R2Bucket } from '../../../../shared/types/bindings.ts';
|
|
12
|
+
import { inflateSync } from 'fflate';
|
|
13
|
+
import { concatBytes } from '../core/sha1';
|
|
14
|
+
import { putRawObject, getRawObject } from '../core/object-store';
|
|
15
|
+
import { decodeObjectHeader } from '../core/object';
|
|
16
|
+
import { bytesToHex } from '../../../../shared/utils/encoding-utils';
|
|
17
|
+
|
|
18
|
+
const TEXT_ENCODER = new TextEncoder();
|
|
19
|
+
|
|
20
|
+
const TYPE_NAMES: Record<number, string> = {
|
|
21
|
+
1: 'commit',
|
|
22
|
+
2: 'tree',
|
|
23
|
+
3: 'blob',
|
|
24
|
+
4: 'tag',
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
// OBJ_OFS_DELTA = 6, OBJ_REF_DELTA = 7
|
|
28
|
+
const OBJ_OFS_DELTA = 6;
|
|
29
|
+
const OBJ_REF_DELTA = 7;
|
|
30
|
+
|
|
31
|
+
export interface PackfileReadLimits {
|
|
32
|
+
maxObjectCount?: number;
|
|
33
|
+
maxInflatedTotal?: number;
|
|
34
|
+
maxObjectInflated?: number;
|
|
35
|
+
maxDeltaResultInflated?: number;
|
|
36
|
+
maxDeltaChainDepth?: number;
|
|
37
|
+
maxPackfileBytes?: number;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
function readUint32BE(data: Uint8Array, offset: number): number {
|
|
42
|
+
return (data[offset] << 24) | (data[offset + 1] << 16) | (data[offset + 2] << 8) | data[offset + 3];
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Apply a git delta instruction stream to a base object.
|
|
48
|
+
*/
|
|
49
|
+
function applyDelta(base: Uint8Array, delta: Uint8Array, options: { maxResultSize?: number } = {}): Uint8Array {
|
|
50
|
+
let offset = 0;
|
|
51
|
+
|
|
52
|
+
// Read base size (VLE)
|
|
53
|
+
let baseSize = 0;
|
|
54
|
+
let shift = 0;
|
|
55
|
+
let byte: number;
|
|
56
|
+
do {
|
|
57
|
+
byte = delta[offset++];
|
|
58
|
+
baseSize |= (byte & 0x7F) << shift;
|
|
59
|
+
shift += 7;
|
|
60
|
+
} while (byte & 0x80);
|
|
61
|
+
|
|
62
|
+
// Read result size (VLE)
|
|
63
|
+
let resultSize = 0;
|
|
64
|
+
shift = 0;
|
|
65
|
+
do {
|
|
66
|
+
byte = delta[offset++];
|
|
67
|
+
resultSize |= (byte & 0x7F) << shift;
|
|
68
|
+
shift += 7;
|
|
69
|
+
} while (byte & 0x80);
|
|
70
|
+
|
|
71
|
+
if (options.maxResultSize !== undefined && resultSize > options.maxResultSize) {
|
|
72
|
+
throw new Error(`Delta result too large: ${resultSize}`);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
const result = new Uint8Array(resultSize);
|
|
76
|
+
let resultOffset = 0;
|
|
77
|
+
|
|
78
|
+
while (offset < delta.length) {
|
|
79
|
+
const cmd = delta[offset++];
|
|
80
|
+
|
|
81
|
+
if (cmd & 0x80) {
|
|
82
|
+
// Copy from base
|
|
83
|
+
let copyOffset = 0;
|
|
84
|
+
let copySize = 0;
|
|
85
|
+
|
|
86
|
+
if (cmd & 0x01) copyOffset = delta[offset++];
|
|
87
|
+
if (cmd & 0x02) copyOffset |= delta[offset++] << 8;
|
|
88
|
+
if (cmd & 0x04) copyOffset |= delta[offset++] << 16;
|
|
89
|
+
if (cmd & 0x08) copyOffset |= delta[offset++] << 24;
|
|
90
|
+
|
|
91
|
+
if (cmd & 0x10) copySize = delta[offset++];
|
|
92
|
+
if (cmd & 0x20) copySize |= delta[offset++] << 8;
|
|
93
|
+
if (cmd & 0x40) copySize |= delta[offset++] << 16;
|
|
94
|
+
|
|
95
|
+
if (copySize === 0) copySize = 0x10000;
|
|
96
|
+
|
|
97
|
+
result.set(base.subarray(copyOffset, copyOffset + copySize), resultOffset);
|
|
98
|
+
resultOffset += copySize;
|
|
99
|
+
} else if (cmd > 0) {
|
|
100
|
+
// Insert literal data
|
|
101
|
+
result.set(delta.subarray(offset, offset + cmd), resultOffset);
|
|
102
|
+
resultOffset += cmd;
|
|
103
|
+
offset += cmd;
|
|
104
|
+
} else {
|
|
105
|
+
throw new Error('Invalid delta instruction: 0x00');
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
return result;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* Async version of readPackfile that properly handles zlib decompression.
|
|
114
|
+
* Uses fflate's synchronous inflate which reports consumed bytes, enabling
|
|
115
|
+
* deterministic zlib frame boundary detection without binary search.
|
|
116
|
+
*/
|
|
117
|
+
export async function readPackfileAsync(
|
|
118
|
+
data: Uint8Array,
|
|
119
|
+
bucket: R2Bucket,
|
|
120
|
+
limits: PackfileReadLimits = {},
|
|
121
|
+
): Promise<string[]> {
|
|
122
|
+
let offset = 0;
|
|
123
|
+
|
|
124
|
+
if (limits.maxPackfileBytes !== undefined && data.length > limits.maxPackfileBytes) {
|
|
125
|
+
throw new Error(`Packfile size ${data.length} exceeds limit of ${limits.maxPackfileBytes}`);
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
const sig = String.fromCharCode(data[0], data[1], data[2], data[3]);
|
|
129
|
+
if (sig !== 'PACK') throw new Error('Invalid packfile signature');
|
|
130
|
+
offset += 4;
|
|
131
|
+
|
|
132
|
+
const version = readUint32BE(data, offset);
|
|
133
|
+
offset += 4;
|
|
134
|
+
|
|
135
|
+
const numObjects = readUint32BE(data, offset);
|
|
136
|
+
offset += 4;
|
|
137
|
+
|
|
138
|
+
if (limits.maxObjectCount !== undefined && numObjects > limits.maxObjectCount) {
|
|
139
|
+
throw new Error(`Pack object count ${numObjects} exceeds limit of ${limits.maxObjectCount}`);
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
const storedShas: string[] = [];
|
|
143
|
+
const unpackedObjects = new Map<string, { type: string; content: Uint8Array; deltaDepth: number }>();
|
|
144
|
+
const unpackedObjectsByOffset = new Map<number, { type: string; content: Uint8Array; deltaDepth: number }>();
|
|
145
|
+
let totalInflated = 0;
|
|
146
|
+
|
|
147
|
+
const addInflatedBytes = (size: number) => {
|
|
148
|
+
totalInflated += size;
|
|
149
|
+
if (limits.maxInflatedTotal !== undefined && totalInflated > limits.maxInflatedTotal) {
|
|
150
|
+
throw new Error(`Inflated total ${totalInflated} exceeds limit of ${limits.maxInflatedTotal}`);
|
|
151
|
+
}
|
|
152
|
+
};
|
|
153
|
+
|
|
154
|
+
for (let i = 0; i < numObjects; i++) {
|
|
155
|
+
const objectOffset = offset;
|
|
156
|
+
// Read type+size VLE header
|
|
157
|
+
let byte = data[offset++];
|
|
158
|
+
const typeNum = (byte >> 4) & 0x07;
|
|
159
|
+
let size = byte & 0x0F;
|
|
160
|
+
let shift = 4;
|
|
161
|
+
|
|
162
|
+
while (byte & 0x80) {
|
|
163
|
+
byte = data[offset++];
|
|
164
|
+
size |= (byte & 0x7F) << shift;
|
|
165
|
+
shift += 7;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
if (limits.maxObjectInflated !== undefined && size > limits.maxObjectInflated) {
|
|
169
|
+
throw new Error(`Object inflated size ${size} exceeds limit of ${limits.maxObjectInflated}`);
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
let baseSha: string | undefined;
|
|
173
|
+
let baseOffset: number | undefined;
|
|
174
|
+
|
|
175
|
+
if (typeNum === OBJ_REF_DELTA) {
|
|
176
|
+
const shaBytes = data.subarray(offset, offset + 20);
|
|
177
|
+
baseSha = bytesToHex(shaBytes);
|
|
178
|
+
offset += 20;
|
|
179
|
+
} else if (typeNum === OBJ_OFS_DELTA) {
|
|
180
|
+
byte = data[offset++];
|
|
181
|
+
let negOfs = byte & 0x7F;
|
|
182
|
+
while (byte & 0x80) {
|
|
183
|
+
byte = data[offset++];
|
|
184
|
+
negOfs = ((negOfs + 1) << 7) | (byte & 0x7F);
|
|
185
|
+
}
|
|
186
|
+
baseOffset = objectOffset - negOfs;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
// Inflate compressed data using fflate (synchronous, reports consumed bytes)
|
|
190
|
+
const inflateResult = inflateSyncWithConsumed(data, offset, size);
|
|
191
|
+
const content = inflateResult.data;
|
|
192
|
+
offset = offset + inflateResult.consumed;
|
|
193
|
+
addInflatedBytes(content.length);
|
|
194
|
+
|
|
195
|
+
if (typeNum >= 1 && typeNum <= 4) {
|
|
196
|
+
const typeName = TYPE_NAMES[typeNum];
|
|
197
|
+
const header = TEXT_ENCODER.encode(`${typeName} ${content.length}\0`);
|
|
198
|
+
const raw = concatBytes(header, content);
|
|
199
|
+
const sha = await putRawObject(bucket, raw);
|
|
200
|
+
storedShas.push(sha);
|
|
201
|
+
const parsed = { type: typeName, content, deltaDepth: 0 };
|
|
202
|
+
unpackedObjects.set(sha, parsed);
|
|
203
|
+
unpackedObjectsByOffset.set(objectOffset, parsed);
|
|
204
|
+
} else if ((typeNum === OBJ_REF_DELTA && baseSha) || typeNum === OBJ_OFS_DELTA) {
|
|
205
|
+
let baseObj = baseSha ? unpackedObjects.get(baseSha) : undefined;
|
|
206
|
+
if (!baseObj && baseOffset !== undefined) {
|
|
207
|
+
baseObj = unpackedObjectsByOffset.get(baseOffset);
|
|
208
|
+
}
|
|
209
|
+
if (!baseObj) {
|
|
210
|
+
if (baseOffset !== undefined) {
|
|
211
|
+
throw new Error(`Base object not found for OFS_DELTA at offset ${baseOffset}`);
|
|
212
|
+
}
|
|
213
|
+
if (!baseSha) {
|
|
214
|
+
throw new Error('Base object not found for REF_DELTA');
|
|
215
|
+
}
|
|
216
|
+
const rawBase = await getRawObject(bucket, baseSha);
|
|
217
|
+
if (!rawBase) throw new Error(`Base object not found for REF_DELTA: ${baseSha}`);
|
|
218
|
+
const decoded = decodeObjectHeader(rawBase);
|
|
219
|
+
const typeEnd = rawBase.indexOf(0x20);
|
|
220
|
+
const typeStr = new TextDecoder().decode(rawBase.subarray(0, typeEnd));
|
|
221
|
+
baseObj = { type: typeStr, content: rawBase.subarray(decoded.contentOffset), deltaDepth: 0 };
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
const deltaDepth = baseObj.deltaDepth + 1;
|
|
225
|
+
if (limits.maxDeltaChainDepth !== undefined && deltaDepth > limits.maxDeltaChainDepth) {
|
|
226
|
+
throw new Error(`Delta chain depth exceeds limit: ${deltaDepth}`);
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
const resolved = applyDelta(baseObj.content, content, {
|
|
230
|
+
maxResultSize: limits.maxDeltaResultInflated,
|
|
231
|
+
});
|
|
232
|
+
if (limits.maxObjectInflated !== undefined && resolved.length > limits.maxObjectInflated) {
|
|
233
|
+
throw new Error(`Resolved object inflated size exceeds limit: ${resolved.length}`);
|
|
234
|
+
}
|
|
235
|
+
addInflatedBytes(resolved.length);
|
|
236
|
+
const header = TEXT_ENCODER.encode(`${baseObj.type} ${resolved.length}\0`);
|
|
237
|
+
const raw = concatBytes(header, resolved);
|
|
238
|
+
const sha = await putRawObject(bucket, raw);
|
|
239
|
+
storedShas.push(sha);
|
|
240
|
+
const parsed = { type: baseObj.type, content: resolved, deltaDepth };
|
|
241
|
+
unpackedObjects.set(sha, parsed);
|
|
242
|
+
unpackedObjectsByOffset.set(objectOffset, parsed);
|
|
243
|
+
} else {
|
|
244
|
+
throw new Error(`Unsupported packfile object type: ${typeNum}`);
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
return storedShas;
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
/**
|
|
252
|
+
* Inflate zlib data from a packfile using fflate's synchronous inflate.
|
|
253
|
+
*
|
|
254
|
+
* Unlike the previous DecompressionStream + binary search approach,
|
|
255
|
+
* fflate reports exactly how many compressed bytes were consumed,
|
|
256
|
+
* eliminating the O(log n) decompression attempts per object.
|
|
257
|
+
*
|
|
258
|
+
* @param data - Full packfile data
|
|
259
|
+
* @param startOffset - Offset where compressed data begins
|
|
260
|
+
* @param expectedSize - Expected decompressed size from VLE header (used for pre-allocation)
|
|
261
|
+
* @returns Decompressed data and number of compressed bytes consumed
|
|
262
|
+
*/
|
|
263
|
+
function inflateSyncWithConsumed(
|
|
264
|
+
data: Uint8Array,
|
|
265
|
+
startOffset: number,
|
|
266
|
+
expectedSize: number,
|
|
267
|
+
): { data: Uint8Array; consumed: number } {
|
|
268
|
+
// Provide the expected output size for efficient pre-allocation.
|
|
269
|
+
// fflate's inflateSync with an output buffer size hint.
|
|
270
|
+
const compressed = data.subarray(startOffset);
|
|
271
|
+
|
|
272
|
+
// Use fflate's inflateSync — it processes the zlib/deflate stream
|
|
273
|
+
// and we can determine consumed bytes by checking the result.
|
|
274
|
+
// fflate inflateSync processes raw deflate data.
|
|
275
|
+
// Git packfiles use zlib (deflate with 2-byte header), so we need
|
|
276
|
+
// to handle the zlib wrapper ourselves or use a workaround.
|
|
277
|
+
//
|
|
278
|
+
// The zlib format is: 2-byte header + deflate data + 4-byte Adler-32 checksum.
|
|
279
|
+
// fflate's inflateSync handles raw deflate. We skip the 2-byte header
|
|
280
|
+
// and use a binary scan for the consumed length since fflate doesn't
|
|
281
|
+
// report it directly in its simple API.
|
|
282
|
+
//
|
|
283
|
+
// However, fflate provides a streaming API via Inflate class that
|
|
284
|
+
// DOES track consumed bytes via the .p property (position in input).
|
|
285
|
+
|
|
286
|
+
// Use fflate Inflate class for consumed-byte tracking
|
|
287
|
+
const { Inflate } = require('fflate') as typeof import('fflate');
|
|
288
|
+
const outputChunks: Uint8Array[] = [];
|
|
289
|
+
let totalOutput = 0;
|
|
290
|
+
|
|
291
|
+
const inflater = new Inflate((chunk, final) => {
|
|
292
|
+
outputChunks.push(chunk);
|
|
293
|
+
totalOutput += chunk.length;
|
|
294
|
+
});
|
|
295
|
+
|
|
296
|
+
// Feed the compressed data. The Inflate class processes zlib/deflate
|
|
297
|
+
// and we track how much input was consumed.
|
|
298
|
+
// Note: Git packfile objects use raw deflate (not zlib wrapper in some cases).
|
|
299
|
+
// We need to try both modes.
|
|
300
|
+
try {
|
|
301
|
+
inflater.push(compressed, true);
|
|
302
|
+
} catch {
|
|
303
|
+
// If raw inflate fails, the data may have a zlib header.
|
|
304
|
+
// fflate's inflateSync handles this automatically.
|
|
305
|
+
const result = inflateSync(compressed, { out: new Uint8Array(expectedSize) });
|
|
306
|
+
// For consumed bytes estimation with inflateSync, we need to find
|
|
307
|
+
// where the compressed data ends. Since inflateSync doesn't report this,
|
|
308
|
+
// use a binary search as fallback (but much faster since inflate is sync).
|
|
309
|
+
const consumed = findCompressedEnd(data, startOffset, result, expectedSize);
|
|
310
|
+
return { data: result, consumed };
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
if (totalOutput === 0) {
|
|
314
|
+
throw new Error(`Inflate produced no output at offset ${startOffset}`);
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
const result = outputChunks.length === 1
|
|
318
|
+
? outputChunks[0]
|
|
319
|
+
: concatBytes(...outputChunks);
|
|
320
|
+
|
|
321
|
+
if (result.length !== expectedSize) {
|
|
322
|
+
throw new Error(
|
|
323
|
+
`Inflate size mismatch at offset ${startOffset}: expected ${expectedSize}, got ${result.length}`,
|
|
324
|
+
);
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
// Determine consumed bytes via sync binary search (fast since inflate is sync)
|
|
328
|
+
const consumed = findCompressedEnd(data, startOffset, result, expectedSize);
|
|
329
|
+
return { data: result, consumed };
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
/**
|
|
333
|
+
* Find the exact compressed data boundary using synchronous inflate.
|
|
334
|
+
* Binary search is O(log n) in compressed size but each attempt is
|
|
335
|
+
* synchronous and fast (no async overhead from DecompressionStream).
|
|
336
|
+
*/
|
|
337
|
+
function findCompressedEnd(
|
|
338
|
+
data: Uint8Array,
|
|
339
|
+
startOffset: number,
|
|
340
|
+
expectedOutput: Uint8Array,
|
|
341
|
+
expectedSize: number,
|
|
342
|
+
): number {
|
|
343
|
+
const maxLen = data.length - startOffset;
|
|
344
|
+
let lo = 2; // minimum: some compressed data
|
|
345
|
+
let hi = maxLen;
|
|
346
|
+
let bestLen = maxLen; // fallback: consume everything remaining
|
|
347
|
+
|
|
348
|
+
while (lo <= hi) {
|
|
349
|
+
const mid = Math.floor((lo + hi) / 2);
|
|
350
|
+
const slice = data.subarray(startOffset, startOffset + mid);
|
|
351
|
+
|
|
352
|
+
try {
|
|
353
|
+
const result = inflateSync(slice, { out: new Uint8Array(expectedSize) });
|
|
354
|
+
if (result.length === expectedSize) {
|
|
355
|
+
bestLen = mid;
|
|
356
|
+
hi = mid - 1; // try smaller
|
|
357
|
+
} else {
|
|
358
|
+
lo = mid + 1; // too short
|
|
359
|
+
}
|
|
360
|
+
} catch {
|
|
361
|
+
lo = mid + 1; // incomplete data
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
return bestLen;
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
export { applyDelta };
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Packfile writer — generates a git packfile from a list of object SHAs.
|
|
3
|
+
*
|
|
4
|
+
* Format:
|
|
5
|
+
* - Header: "PACK" + version(2) + object_count(4 bytes BE)
|
|
6
|
+
* - Objects: type+size VLE header + zlib-deflated content
|
|
7
|
+
* - Trailer: SHA-1 checksum of entire pack
|
|
8
|
+
*
|
|
9
|
+
* Phase 1: No delta compression (undeltified objects only).
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
import type { R2Bucket } from '../../../../shared/types/bindings.ts';
|
|
13
|
+
import { sha1Bytes, concatBytes, hexFromBuffer } from '../core/sha1';
|
|
14
|
+
import { getObject } from '../core/object-store';
|
|
15
|
+
import type { GitObjectType } from '../git-objects';
|
|
16
|
+
|
|
17
|
+
const PACK_SIGNATURE = new Uint8Array([0x50, 0x41, 0x43, 0x4B]); // "PACK"
|
|
18
|
+
const PACK_VERSION = 2;
|
|
19
|
+
|
|
20
|
+
const TYPE_NUMBERS: Record<GitObjectType, number> = {
|
|
21
|
+
commit: 1,
|
|
22
|
+
tree: 2,
|
|
23
|
+
blob: 3,
|
|
24
|
+
tag: 4,
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
function encodeUint32BE(n: number): Uint8Array {
|
|
28
|
+
const buf = new Uint8Array(4);
|
|
29
|
+
buf[0] = (n >>> 24) & 0xFF;
|
|
30
|
+
buf[1] = (n >>> 16) & 0xFF;
|
|
31
|
+
buf[2] = (n >>> 8) & 0xFF;
|
|
32
|
+
buf[3] = n & 0xFF;
|
|
33
|
+
return buf;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Encode the type+size VLE header for an undeltified packfile object.
|
|
38
|
+
* Format: first byte = (type << 4) | (size & 0x0F), MSB continuation bit.
|
|
39
|
+
* Subsequent bytes: 7 bits of size each, MSB continuation.
|
|
40
|
+
*/
|
|
41
|
+
function encodeObjectHeader(typeNum: number, size: number): Uint8Array {
|
|
42
|
+
const bytes: number[] = [];
|
|
43
|
+
let firstByte = (typeNum << 4) | (size & 0x0F);
|
|
44
|
+
size >>= 4;
|
|
45
|
+
|
|
46
|
+
if (size > 0) {
|
|
47
|
+
firstByte |= 0x80;
|
|
48
|
+
}
|
|
49
|
+
bytes.push(firstByte);
|
|
50
|
+
|
|
51
|
+
while (size > 0) {
|
|
52
|
+
let byte = size & 0x7F;
|
|
53
|
+
size >>= 7;
|
|
54
|
+
if (size > 0) byte |= 0x80;
|
|
55
|
+
bytes.push(byte);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
return new Uint8Array(bytes);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
async function deflateData(data: Uint8Array): Promise<Uint8Array> {
|
|
62
|
+
const cs = new CompressionStream('deflate');
|
|
63
|
+
const writer = cs.writable.getWriter();
|
|
64
|
+
writer.write(data.slice().buffer as ArrayBuffer);
|
|
65
|
+
writer.close();
|
|
66
|
+
|
|
67
|
+
const chunks: Uint8Array[] = [];
|
|
68
|
+
const reader = cs.readable.getReader();
|
|
69
|
+
while (true) {
|
|
70
|
+
const { done, value } = await reader.read();
|
|
71
|
+
if (done) break;
|
|
72
|
+
chunks.push(value);
|
|
73
|
+
}
|
|
74
|
+
return concatBytes(...chunks);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Write a packfile containing the given objects.
|
|
79
|
+
* Returns the complete packfile as a Uint8Array.
|
|
80
|
+
*/
|
|
81
|
+
export async function writePackfile(
|
|
82
|
+
bucket: R2Bucket,
|
|
83
|
+
shas: string[],
|
|
84
|
+
): Promise<Uint8Array> {
|
|
85
|
+
if (shas.length === 0) {
|
|
86
|
+
// Return empty packfile
|
|
87
|
+
const header = concatBytes(
|
|
88
|
+
PACK_SIGNATURE,
|
|
89
|
+
encodeUint32BE(PACK_VERSION),
|
|
90
|
+
encodeUint32BE(0),
|
|
91
|
+
);
|
|
92
|
+
const checksum = new Uint8Array(await sha1Bytes(header));
|
|
93
|
+
return concatBytes(header, checksum);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
const parts: Uint8Array[] = [];
|
|
97
|
+
|
|
98
|
+
// Pack header
|
|
99
|
+
const header = concatBytes(
|
|
100
|
+
PACK_SIGNATURE,
|
|
101
|
+
encodeUint32BE(PACK_VERSION),
|
|
102
|
+
encodeUint32BE(shas.length),
|
|
103
|
+
);
|
|
104
|
+
parts.push(header);
|
|
105
|
+
|
|
106
|
+
// Objects
|
|
107
|
+
for (const sha of shas) {
|
|
108
|
+
const obj = await getObject(bucket, sha);
|
|
109
|
+
if (!obj) {
|
|
110
|
+
throw new Error(`Object not found: ${sha}`);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
const typeNum = TYPE_NUMBERS[obj.type];
|
|
114
|
+
if (typeNum === undefined) {
|
|
115
|
+
throw new Error(`Unknown object type: ${obj.type}`);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
const objHeader = encodeObjectHeader(typeNum, obj.content.length);
|
|
119
|
+
const compressed = await deflateData(obj.content);
|
|
120
|
+
|
|
121
|
+
parts.push(objHeader, compressed);
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
// Calculate SHA-1 checksum of everything
|
|
125
|
+
const packWithoutChecksum = concatBytes(...parts);
|
|
126
|
+
const checksum = new Uint8Array(await sha1Bytes(packWithoutChecksum));
|
|
127
|
+
|
|
128
|
+
return concatBytes(packWithoutChecksum, checksum);
|
|
129
|
+
}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Git pkt-line format encoder/decoder.
|
|
3
|
+
*
|
|
4
|
+
* pkt-line format:
|
|
5
|
+
* - 4-char hex length prefix (includes the 4 bytes themselves)
|
|
6
|
+
* - "0000" = flush packet
|
|
7
|
+
* - "0001" = delimiter packet
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import { concatBytes } from '../core/sha1';
|
|
11
|
+
|
|
12
|
+
const TEXT_ENCODER = new TextEncoder();
|
|
13
|
+
const TEXT_DECODER = new TextDecoder();
|
|
14
|
+
|
|
15
|
+
export function encodePktLine(data: string | Uint8Array): Uint8Array {
|
|
16
|
+
const payload = typeof data === 'string' ? TEXT_ENCODER.encode(data) : data;
|
|
17
|
+
const length = payload.length + 4;
|
|
18
|
+
const hex = length.toString(16).padStart(4, '0');
|
|
19
|
+
return concatBytes(TEXT_ENCODER.encode(hex), payload);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export function flushPkt(): Uint8Array {
|
|
23
|
+
return TEXT_ENCODER.encode('0000');
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export function delimPkt(): Uint8Array {
|
|
27
|
+
return TEXT_ENCODER.encode('0001');
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export interface PktLine {
|
|
31
|
+
type: 'data' | 'flush' | 'delim';
|
|
32
|
+
data?: Uint8Array;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export function parsePktLines(input: Uint8Array): PktLine[] {
|
|
36
|
+
const lines: PktLine[] = [];
|
|
37
|
+
let offset = 0;
|
|
38
|
+
|
|
39
|
+
while (offset < input.length) {
|
|
40
|
+
if (offset + 4 > input.length) break;
|
|
41
|
+
|
|
42
|
+
const hexStr = TEXT_DECODER.decode(input.subarray(offset, offset + 4));
|
|
43
|
+
const length = parseInt(hexStr, 16);
|
|
44
|
+
|
|
45
|
+
if (length === 0) {
|
|
46
|
+
lines.push({ type: 'flush' });
|
|
47
|
+
offset += 4;
|
|
48
|
+
continue;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
if (length === 1) {
|
|
52
|
+
lines.push({ type: 'delim' });
|
|
53
|
+
offset += 4;
|
|
54
|
+
continue;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
if (length < 4) {
|
|
58
|
+
// Invalid pkt-line, skip
|
|
59
|
+
offset += 4;
|
|
60
|
+
continue;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
if (offset + length > input.length) break;
|
|
64
|
+
|
|
65
|
+
const data = input.subarray(offset + 4, offset + length);
|
|
66
|
+
lines.push({ type: 'data', data });
|
|
67
|
+
offset += length;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
return lines;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
export function pktLineText(line: PktLine): string {
|
|
74
|
+
if (!line.data) return '';
|
|
75
|
+
let text = TEXT_DECODER.decode(line.data);
|
|
76
|
+
// Strip trailing newline
|
|
77
|
+
if (text.endsWith('\n')) text = text.slice(0, -1);
|
|
78
|
+
return text;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* Build a response from multiple pkt-line segments.
|
|
83
|
+
*/
|
|
84
|
+
export function buildPktLineResponse(...segments: Uint8Array[]): Uint8Array {
|
|
85
|
+
return concatBytes(...segments);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* Encode a side-band-64k frame.
|
|
90
|
+
* Channel 1 = pack data, Channel 2 = progress, Channel 3 = error
|
|
91
|
+
*/
|
|
92
|
+
export function encodeSideBandData(channel: number, data: Uint8Array): Uint8Array {
|
|
93
|
+
const payload = new Uint8Array(1 + data.length);
|
|
94
|
+
payload[0] = channel;
|
|
95
|
+
payload.set(data, 1);
|
|
96
|
+
return encodePktLine(payload);
|
|
97
|
+
}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Git Smart HTTP — info/refs endpoint.
|
|
3
|
+
*
|
|
4
|
+
* Returns the list of refs in pkt-line format for ref discovery.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import type { D1Database } from '../../../../shared/types/bindings.ts';
|
|
8
|
+
import { listAllRefs, getDefaultBranch } from '../core/refs';
|
|
9
|
+
import {
|
|
10
|
+
encodePktLine,
|
|
11
|
+
flushPkt,
|
|
12
|
+
buildPktLineResponse,
|
|
13
|
+
} from '../protocol/pkt-line';
|
|
14
|
+
import { concatBytes } from '../core/sha1';
|
|
15
|
+
import {
|
|
16
|
+
UPLOAD_PACK_CAPABILITIES,
|
|
17
|
+
RECEIVE_PACK_CAPABILITIES,
|
|
18
|
+
formatCapabilities,
|
|
19
|
+
} from '../protocol/capabilities';
|
|
20
|
+
|
|
21
|
+
const ZERO_SHA = '0000000000000000000000000000000000000000';
|
|
22
|
+
|
|
23
|
+
export async function handleInfoRefs(
|
|
24
|
+
db: D1Database,
|
|
25
|
+
repoId: string,
|
|
26
|
+
service: 'git-upload-pack' | 'git-receive-pack',
|
|
27
|
+
): Promise<Uint8Array> {
|
|
28
|
+
const refs = await listAllRefs(db, repoId);
|
|
29
|
+
const defaultBranch = await getDefaultBranch(db, repoId);
|
|
30
|
+
const parts: Uint8Array[] = [];
|
|
31
|
+
|
|
32
|
+
// Service announcement line
|
|
33
|
+
parts.push(encodePktLine(`# service=${service}\n`));
|
|
34
|
+
parts.push(flushPkt());
|
|
35
|
+
|
|
36
|
+
const caps = service === 'git-upload-pack'
|
|
37
|
+
? formatCapabilities(UPLOAD_PACK_CAPABILITIES)
|
|
38
|
+
: formatCapabilities(RECEIVE_PACK_CAPABILITIES);
|
|
39
|
+
|
|
40
|
+
if (refs.length === 0) {
|
|
41
|
+
// Empty repository — advertise capabilities with zero-id
|
|
42
|
+
const symref = defaultBranch ? ` symref=HEAD:refs/heads/${defaultBranch.name}` : '';
|
|
43
|
+
parts.push(encodePktLine(`${ZERO_SHA} capabilities^{}\0${caps}${symref}\n`));
|
|
44
|
+
parts.push(flushPkt());
|
|
45
|
+
return concatBytes(...parts);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// HEAD line (point to default branch)
|
|
49
|
+
const headRef = defaultBranch
|
|
50
|
+
? refs.find(r => r.name === `refs/heads/${defaultBranch.name}`)
|
|
51
|
+
: refs[0];
|
|
52
|
+
|
|
53
|
+
const headSha = headRef?.target || refs[0]?.target || ZERO_SHA;
|
|
54
|
+
const symref = defaultBranch ? ` symref=HEAD:refs/heads/${defaultBranch.name}` : '';
|
|
55
|
+
|
|
56
|
+
// First ref includes capabilities
|
|
57
|
+
parts.push(encodePktLine(`${headSha} HEAD\0${caps}${symref}\n`));
|
|
58
|
+
|
|
59
|
+
// Remaining refs sorted by name
|
|
60
|
+
const sortedRefs = [...refs].sort((a, b) => a.name.localeCompare(b.name));
|
|
61
|
+
for (const ref of sortedRefs) {
|
|
62
|
+
parts.push(encodePktLine(`${ref.target} ${ref.name}\n`));
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
parts.push(flushPkt());
|
|
66
|
+
return concatBytes(...parts);
|
|
67
|
+
}
|