@vercel/factory 0.0.14 → 0.0.16
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/CHANGELOG.md +356 -0
- package/README.md +96 -2
- package/dist/agent-routes.d.mts +113 -0
- package/dist/agent-routes.mjs +91 -0
- package/dist/agent-routes.mjs.map +1 -0
- package/dist/api-contracts.d.mts +1768 -0
- package/dist/api-contracts.mjs +119 -0
- package/dist/api-contracts.mjs.map +1 -0
- package/dist/api-images.d.mts +30 -0
- package/dist/api-images.mjs +28 -0
- package/dist/api-images.mjs.map +1 -0
- package/dist/api-task-graph.mjs +57 -0
- package/dist/api-task-graph.mjs.map +1 -0
- package/dist/api.d.mts +111 -216
- package/dist/api.mjs +1063 -99
- package/dist/api.mjs.map +1 -1
- package/dist/approval-access.d.mts +39 -0
- package/dist/approval-access.mjs +62 -0
- package/dist/approval-access.mjs.map +1 -0
- package/dist/approval-contracts.d.mts +698 -0
- package/dist/approval-contracts.mjs +27 -0
- package/dist/approval-contracts.mjs.map +1 -0
- package/dist/approval.d.mts +49 -0
- package/dist/approval.mjs +39 -0
- package/dist/approval.mjs.map +1 -0
- package/dist/blob/artifacts.d.mts +37 -0
- package/dist/blob/artifacts.mjs +45 -0
- package/dist/blob/artifacts.mjs.map +1 -0
- package/dist/blob/index.d.mts +84 -12
- package/dist/blob/index.mjs +179 -45
- package/dist/blob/index.mjs.map +1 -1
- package/dist/budget.d.mts +115 -0
- package/dist/budget.mjs +147 -0
- package/dist/budget.mjs.map +1 -0
- package/dist/budgets.d.mts +4 -0
- package/dist/budgets.mjs +4 -0
- package/dist/build-factory.d.mts +7 -4
- package/dist/build-factory.mjs +2 -1
- package/dist/build-factory.mjs.map +1 -1
- package/dist/change-verification/brief.d.mts +9 -0
- package/dist/change-verification/brief.mjs +13 -0
- package/dist/change-verification/brief.mjs.map +1 -0
- package/dist/change-verification/dispatch.d.mts +37 -0
- package/dist/change-verification/dispatch.mjs +83 -0
- package/dist/change-verification/dispatch.mjs.map +1 -0
- package/dist/change-verification/eve-tool.d.mts +61 -0
- package/dist/change-verification/eve-tool.mjs +89 -0
- package/dist/change-verification/eve-tool.mjs.map +1 -0
- package/dist/change-verification/result.mjs +130 -0
- package/dist/change-verification/result.mjs.map +1 -0
- package/dist/changes/eve-record-change.d.mts +56 -0
- package/dist/changes/eve-record-change.mjs +131 -0
- package/dist/changes/eve-record-change.mjs.map +1 -0
- package/dist/changes/presentation.d.mts +14 -0
- package/dist/changes.d.mts +24 -0
- package/dist/changes.mjs +29 -0
- package/dist/changes.mjs.map +1 -0
- package/dist/client-events.d.mts +25 -0
- package/dist/client-events.mjs +45 -0
- package/dist/client-events.mjs.map +1 -0
- package/dist/client-stream.d.mts +28 -0
- package/dist/client-stream.mjs +210 -0
- package/dist/client-stream.mjs.map +1 -0
- package/dist/client-transcript.d.mts +41 -0
- package/dist/client-transcript.mjs +233 -0
- package/dist/client-transcript.mjs.map +1 -0
- package/dist/client.d.mts +343 -0
- package/dist/client.mjs +366 -0
- package/dist/client.mjs.map +1 -0
- package/dist/code-review/contracts.d.mts +27 -0
- package/dist/code-review/eve-post-review.d.mts +70 -0
- package/dist/code-review/eve-post-review.mjs +195 -0
- package/dist/code-review/eve-post-review.mjs.map +1 -0
- package/dist/code-review/eve-review-comments.d.mts +75 -0
- package/dist/code-review/eve-review-comments.mjs +193 -0
- package/dist/code-review/eve-review-comments.mjs.map +1 -0
- package/dist/code-review/github-contracts.d.mts +10 -0
- package/dist/code-review/github-reporter.d.mts +46 -0
- package/dist/code-review/github-reporter.mjs +262 -0
- package/dist/code-review/github-reporter.mjs.map +1 -0
- package/dist/code-review/preparation.d.mts +34 -0
- package/dist/code-review/preparation.mjs +23 -0
- package/dist/code-review/preparation.mjs.map +1 -0
- package/dist/code-review/stall.d.mts +17 -0
- package/dist/code-review/stall.mjs +30 -0
- package/dist/code-review/stall.mjs.map +1 -0
- package/dist/code-review.d.mts +7 -0
- package/dist/code-review.mjs +5 -0
- package/dist/communication.d.mts +9 -0
- package/dist/communication.mjs +9 -0
- package/dist/connectors/github.d.mts +26 -0
- package/dist/connectors/github.mjs +55 -0
- package/dist/connectors/github.mjs.map +1 -0
- package/dist/connectors/index.d.mts +35 -3
- package/dist/connectors/index.mjs +3 -52
- package/dist/connectors/index.mjs.map +1 -1
- package/dist/connectors/outbox.d.mts +34 -0
- package/dist/connectors/outbox.mjs +50 -0
- package/dist/connectors/outbox.mjs.map +1 -0
- package/dist/connectors/slack-approval-blocks.mjs +136 -0
- package/dist/connectors/slack-approval-blocks.mjs.map +1 -0
- package/dist/connectors/slack-approvals.d.mts +29 -0
- package/dist/connectors/slack-approvals.mjs +346 -0
- package/dist/connectors/slack-approvals.mjs.map +1 -0
- package/dist/connectors/slack.d.mts +35 -52
- package/dist/connectors/slack.mjs +13 -85
- package/dist/connectors/slack.mjs.map +1 -1
- package/dist/deepsec/eve-tool.d.mts +110 -0
- package/dist/deepsec/eve-tool.mjs +166 -0
- package/dist/deepsec/eve-tool.mjs.map +1 -0
- package/dist/deepsec/finding.d.mts +84 -0
- package/dist/deepsec/finding.mjs +56 -0
- package/dist/deepsec/finding.mjs.map +1 -0
- package/dist/deepsec.d.mts +3 -0
- package/dist/delivery-metrics/metrics.d.mts +93 -0
- package/dist/delivery-metrics/metrics.mjs +200 -0
- package/dist/delivery-metrics/metrics.mjs.map +1 -0
- package/dist/delivery-metrics.d.mts +2 -0
- package/dist/delivery-metrics.mjs +2 -0
- package/dist/dispatch.d.mts +152 -0
- package/dist/dispatch.mjs +199 -0
- package/dist/dispatch.mjs.map +1 -0
- package/dist/errors.d.mts +15 -0
- package/dist/errors.mjs +38 -0
- package/dist/errors.mjs.map +1 -0
- package/dist/eve/index.d.mts +209 -1277
- package/dist/eve/index.mjs +312 -1073
- package/dist/eve/index.mjs.map +1 -1
- package/dist/eve/invoke.d.mts +144 -0
- package/dist/eve/invoke.mjs +254 -0
- package/dist/eve/invoke.mjs.map +1 -0
- package/dist/eve/session-client.d.mts +186 -0
- package/dist/eve/session-client.mjs +245 -0
- package/dist/eve/session-client.mjs.map +1 -0
- package/dist/eve/task-execution.d.mts +380 -0
- package/dist/eve/task-execution.mjs +73 -0
- package/dist/eve/task-execution.mjs.map +1 -0
- package/dist/eve/task-session.d.mts +129 -0
- package/dist/eve/task-session.mjs +245 -0
- package/dist/eve/task-session.mjs.map +1 -0
- package/dist/eve/transcript.d.mts +37 -0
- package/dist/eve/transcript.mjs +69 -0
- package/dist/eve/transcript.mjs.map +1 -0
- package/dist/execution-public.d.mts +8 -0
- package/dist/execution-public.mjs +7 -0
- package/dist/execution.d.mts +183 -0
- package/dist/execution.mjs +223 -0
- package/dist/execution.mjs.map +1 -0
- package/dist/finding-remediation/admission.d.mts +53 -0
- package/dist/finding-remediation/admission.mjs +90 -0
- package/dist/finding-remediation/admission.mjs.map +1 -0
- package/dist/finding-remediation/brief.d.mts +14 -0
- package/dist/finding-remediation/brief.mjs +25 -0
- package/dist/finding-remediation/brief.mjs.map +1 -0
- package/dist/finding-remediation/eve-tool.d.mts +29 -0
- package/dist/finding-remediation/eve-tool.mjs +34 -0
- package/dist/finding-remediation/eve-tool.mjs.map +1 -0
- package/dist/findings/fingerprint.d.mts +14 -0
- package/dist/findings/fingerprint.mjs +28 -0
- package/dist/findings/fingerprint.mjs.map +1 -0
- package/dist/findings.d.mts +7 -0
- package/dist/findings.mjs +6 -0
- package/dist/github-app.d.mts +54 -0
- package/dist/github-app.mjs +121 -0
- package/dist/github-app.mjs.map +1 -0
- package/dist/github-publication.d.mts +199 -0
- package/dist/github-publication.mjs +442 -0
- package/dist/github-publication.mjs.map +1 -0
- package/dist/github-transfer.d.mts +81 -0
- package/dist/github-transfer.mjs +273 -0
- package/dist/github-transfer.mjs.map +1 -0
- package/dist/github.d.mts +446 -2
- package/dist/github.mjs +357 -56
- package/dist/github.mjs.map +1 -1
- package/dist/image-input.d.mts +51 -0
- package/dist/image-input.mjs +63 -0
- package/dist/image-input.mjs.map +1 -0
- package/dist/inbox-activity.d.mts +53 -0
- package/dist/inbox-activity.mjs +41 -0
- package/dist/inbox-activity.mjs.map +1 -0
- package/dist/index.d.mts +16 -484
- package/dist/index.mjs +15 -522
- package/dist/intake-contracts.d.mts +55 -0
- package/dist/intake-contracts.mjs +33 -0
- package/dist/intake-contracts.mjs.map +1 -0
- package/dist/integrations/deepsec.d.mts +5 -0
- package/dist/integrations/deepsec.mjs +3 -0
- package/dist/integrations/github.d.mts +11 -0
- package/dist/integrations/github.mjs +9 -0
- package/dist/integrations/slack.d.mts +5 -0
- package/dist/integrations/slack.mjs +5 -0
- package/dist/integrations/vercel.d.mts +5 -0
- package/dist/integrations/vercel.mjs +4 -0
- package/dist/merge-resolution/contracts.d.mts +17 -0
- package/dist/merge-resolution/contracts.mjs +19 -0
- package/dist/merge-resolution/contracts.mjs.map +1 -0
- package/dist/merge-resolution/eve-tools.d.mts +47 -0
- package/dist/merge-resolution/eve-tools.mjs +122 -0
- package/dist/merge-resolution/eve-tools.mjs.map +1 -0
- package/dist/model-settings.d.mts +41 -0
- package/dist/model-settings.mjs +35 -0
- package/dist/model-settings.mjs.map +1 -0
- package/dist/multi-repository-changes/coordination.d.mts +49 -0
- package/dist/multi-repository-changes/coordination.mjs +115 -0
- package/dist/multi-repository-changes/coordination.mjs.map +1 -0
- package/dist/planning/cancellation.mjs +82 -0
- package/dist/planning/cancellation.mjs.map +1 -0
- package/dist/planning/configuration.d.mts +23 -0
- package/dist/planning/configuration.mjs +56 -0
- package/dist/planning/configuration.mjs.map +1 -0
- package/dist/planning/contracts.d.mts +136 -0
- package/dist/planning/contracts.mjs +42 -0
- package/dist/planning/contracts.mjs.map +1 -0
- package/dist/planning/dependencies.mjs +44 -0
- package/dist/planning/dependencies.mjs.map +1 -0
- package/dist/planning/effects.mjs +122 -0
- package/dist/planning/effects.mjs.map +1 -0
- package/dist/planning/reconcile.mjs +279 -0
- package/dist/planning/reconcile.mjs.map +1 -0
- package/dist/planning/runtime.d.mts +27 -0
- package/dist/planning/runtime.mjs +25 -0
- package/dist/planning/runtime.mjs.map +1 -0
- package/dist/planning/state.mjs +92 -0
- package/dist/planning/state.mjs.map +1 -0
- package/dist/planning/turns.mjs +262 -0
- package/dist/planning/turns.mjs.map +1 -0
- package/dist/planning/validation.mjs +106 -0
- package/dist/planning/validation.mjs.map +1 -0
- package/dist/postgres/index.d.mts +48 -1
- package/dist/postgres/index.mjs +45 -3
- package/dist/postgres/index.mjs.map +1 -1
- package/dist/presets/software-development/approval.d.mts +14 -0
- package/dist/presets/software-development/approval.mjs +21 -0
- package/dist/presets/software-development/approval.mjs.map +1 -0
- package/dist/presets/software-development/deepsec-brief.d.mts +8 -0
- package/dist/presets/software-development/deepsec-brief.mjs +14 -0
- package/dist/presets/software-development/deepsec-brief.mjs.map +1 -0
- package/dist/presets/software-development/dispatch.d.mts +56 -0
- package/dist/presets/software-development/dispatch.mjs +67 -0
- package/dist/presets/software-development/dispatch.mjs.map +1 -0
- package/dist/presets/software-development/eve-delegation-policy.d.mts +7 -0
- package/dist/presets/software-development/eve-delegation-policy.mjs +34 -0
- package/dist/presets/software-development/eve-delegation-policy.mjs.map +1 -0
- package/dist/presets/software-development/eve.d.mts +18 -0
- package/dist/presets/software-development/eve.mjs +19 -0
- package/dist/presets/software-development/eve.mjs.map +1 -0
- package/dist/presets/software-development/finish-task-policy.d.mts +7 -0
- package/dist/presets/software-development/finish-task-policy.mjs +9 -0
- package/dist/presets/software-development/finish-task-policy.mjs.map +1 -0
- package/dist/presets/software-development/recovery.d.mts +32 -0
- package/dist/presets/software-development/recovery.mjs +120 -0
- package/dist/presets/software-development/recovery.mjs.map +1 -0
- package/dist/presets/software-development/task-communication.d.mts +24 -0
- package/dist/presets/software-development/task-communication.mjs +157 -0
- package/dist/presets/software-development/task-communication.mjs.map +1 -0
- package/dist/presets/software-development.d.mts +10 -0
- package/dist/presets/software-development.mjs +9 -0
- package/dist/pull-requests/contracts.d.mts +72 -0
- package/dist/pull-requests/eve-fetch.d.mts +57 -0
- package/dist/pull-requests/eve-fetch.mjs +151 -0
- package/dist/pull-requests/eve-fetch.mjs.map +1 -0
- package/dist/pull-requests/github-label-manager.d.mts +27 -0
- package/dist/pull-requests/github-label-manager.mjs +40 -0
- package/dist/pull-requests/github-label-manager.mjs.map +1 -0
- package/dist/pull-requests/github-publisher.d.mts +67 -0
- package/dist/pull-requests/github-publisher.mjs +405 -0
- package/dist/pull-requests/github-publisher.mjs.map +1 -0
- package/dist/pull-requests.d.mts +6 -0
- package/dist/pull-requests.mjs +4 -0
- package/dist/receipts.d.mts +4 -0
- package/dist/receipts.mjs +3 -0
- package/dist/repositories.d.mts +18 -0
- package/dist/repositories.mjs +33 -0
- package/dist/repositories.mjs.map +1 -0
- package/dist/sandbox/command.d.mts +18 -0
- package/dist/sandbox/execution-abort.d.mts +16 -0
- package/dist/sandbox/execution-abort.mjs +49 -0
- package/dist/sandbox/execution-abort.mjs.map +1 -0
- package/dist/sandbox/execution-environment.d.mts +25 -0
- package/dist/sandbox/execution-run-ledger.d.mts +115 -0
- package/dist/sandbox/execution-run-ledger.mjs +209 -0
- package/dist/sandbox/execution-run-ledger.mjs.map +1 -0
- package/dist/sandbox/execution.d.mts +54 -0
- package/dist/sandbox/execution.mjs +228 -0
- package/dist/sandbox/execution.mjs.map +1 -0
- package/dist/sandbox/harness-runner.d.mts +79 -0
- package/dist/sandbox/harness-runner.mjs +162 -0
- package/dist/sandbox/harness-runner.mjs.map +1 -0
- package/dist/sandbox/index.d.mts +10 -0
- package/dist/sandbox/index.mjs +7 -0
- package/dist/sandbox/task-environment.d.mts +50 -0
- package/dist/sandbox/task-environment.mjs +140 -0
- package/dist/sandbox/task-environment.mjs.map +1 -0
- package/dist/sandbox/workspace.d.mts +29 -0
- package/dist/sandbox/workspace.mjs +28 -0
- package/dist/sandbox/workspace.mjs.map +1 -0
- package/dist/schema/agent-route.d.mts +40 -0
- package/dist/schema/agent-route.mjs +33 -0
- package/dist/schema/agent-route.mjs.map +1 -0
- package/dist/schema/answer.d.mts +23 -0
- package/dist/schema/answer.mjs +21 -0
- package/dist/schema/answer.mjs.map +1 -0
- package/dist/schema/budget.d.mts +38 -0
- package/dist/schema/budget.mjs +30 -0
- package/dist/schema/budget.mjs.map +1 -0
- package/dist/schema/catalog.mjs +72 -0
- package/dist/schema/catalog.mjs.map +1 -0
- package/dist/schema/change.d.mts +117 -0
- package/dist/schema/change.mjs +68 -0
- package/dist/schema/change.mjs.map +1 -0
- package/dist/schema/common.d.mts +33 -0
- package/dist/{id-BLIkCVue.mjs → schema/common.mjs} +7 -16
- package/dist/schema/common.mjs.map +1 -0
- package/dist/schema/communication.d.mts +52 -0
- package/dist/{communication-Kd9nU5RP.mjs → schema/communication.mjs} +8 -3
- package/dist/schema/communication.mjs.map +1 -0
- package/dist/schema/execution.d.mts +101 -0
- package/dist/schema/execution.mjs +86 -0
- package/dist/schema/execution.mjs.map +1 -0
- package/dist/schema/factory-config.d.mts +122 -0
- package/dist/schema/factory-config.mjs +90 -0
- package/dist/schema/factory-config.mjs.map +1 -0
- package/dist/schema/finding.d.mts +125 -0
- package/dist/schema/finding.mjs +67 -0
- package/dist/schema/finding.mjs.map +1 -0
- package/dist/schema/id.d.mts +43 -0
- package/dist/schema/id.mjs +32 -0
- package/dist/schema/id.mjs.map +1 -0
- package/dist/schema/outbox.d.mts +240 -0
- package/dist/schema/outbox.mjs +53 -0
- package/dist/schema/outbox.mjs.map +1 -0
- package/dist/schema/question-route.mjs +16 -0
- package/dist/schema/question-route.mjs.map +1 -0
- package/dist/schema/receipt.d.mts +81 -0
- package/dist/schema/receipt.mjs +94 -0
- package/dist/schema/receipt.mjs.map +1 -0
- package/dist/schema/repository.d.mts +30 -0
- package/dist/schema/repository.mjs +29 -0
- package/dist/schema/repository.mjs.map +1 -0
- package/dist/schema/session.d.mts +136 -0
- package/dist/schema/session.mjs +54 -0
- package/dist/schema/session.mjs.map +1 -0
- package/dist/schema/signal.d.mts +105 -0
- package/dist/schema/signal.mjs +81 -0
- package/dist/schema/signal.mjs.map +1 -0
- package/dist/schema/slack-pr-notifications.d.mts +12 -0
- package/dist/schema/slack-pr-notifications.mjs +11 -0
- package/dist/schema/slack-pr-notifications.mjs.map +1 -0
- package/dist/schema/stored-session.mjs +10 -0
- package/dist/schema/stored-session.mjs.map +1 -0
- package/dist/schema/stored-task.mjs +20 -0
- package/dist/schema/stored-task.mjs.map +1 -0
- package/dist/schema/task-effect.d.mts +39 -0
- package/dist/schema/task-effect.mjs +29 -0
- package/dist/schema/task-effect.mjs.map +1 -0
- package/dist/schema/task-graph.d.mts +3173 -0
- package/dist/schema/task-graph.mjs +97 -0
- package/dist/schema/task-graph.mjs.map +1 -0
- package/dist/schema/task-message.d.mts +254 -0
- package/dist/schema/task-message.mjs +189 -0
- package/dist/schema/task-message.mjs.map +1 -0
- package/dist/schema/task.d.mts +273 -0
- package/dist/schema/task.mjs +200 -0
- package/dist/schema/task.mjs.map +1 -0
- package/dist/schema/transcript.d.mts +176 -0
- package/dist/schema/transcript.mjs +87 -0
- package/dist/schema/transcript.mjs.map +1 -0
- package/dist/schema/transitions.d.mts +50 -0
- package/dist/schema/transitions.mjs +303 -0
- package/dist/schema/transitions.mjs.map +1 -0
- package/dist/schema/work.d.mts +150 -0
- package/dist/schema/work.mjs +102 -0
- package/dist/schema/work.mjs.map +1 -0
- package/dist/session-previews.d.mts +76 -0
- package/dist/session-previews.mjs +55 -0
- package/dist/session-previews.mjs.map +1 -0
- package/dist/session-review.d.mts +120 -0
- package/dist/session-review.mjs +79 -0
- package/dist/session-review.mjs.map +1 -0
- package/dist/signal-triage.d.mts +20 -0
- package/dist/signal-triage.mjs +85 -0
- package/dist/signal-triage.mjs.map +1 -0
- package/dist/signals.d.mts +20 -0
- package/dist/signals.mjs +19 -0
- package/dist/signals.mjs.map +1 -0
- package/dist/stall.d.mts +41 -0
- package/dist/stall.mjs +83 -0
- package/dist/stall.mjs.map +1 -0
- package/dist/storage.d.mts +4 -0
- package/dist/storage.mjs +4 -0
- package/dist/store/driver.d.mts +65 -0
- package/dist/store/driver.mjs +42 -0
- package/dist/store/driver.mjs.map +1 -0
- package/dist/store/engine.d.mts +683 -0
- package/dist/store/engine.mjs +2309 -0
- package/dist/store/engine.mjs.map +1 -0
- package/dist/store/memory.d.mts +24 -0
- package/dist/store/memory.mjs +69 -0
- package/dist/store/memory.mjs.map +1 -0
- package/dist/store/slack-pr-notifications.d.mts +44 -0
- package/dist/store/slack-pr-notifications.mjs +121 -0
- package/dist/store/slack-pr-notifications.mjs.map +1 -0
- package/dist/store/task-effects.d.mts +38 -0
- package/dist/store/task-effects.mjs +118 -0
- package/dist/store/task-effects.mjs.map +1 -0
- package/dist/store/task-graphs.d.mts +60 -0
- package/dist/store/task-graphs.mjs +212 -0
- package/dist/store/task-graphs.mjs.map +1 -0
- package/dist/store/task-messages.d.mts +136 -0
- package/dist/store/task-messages.mjs +475 -0
- package/dist/store/task-messages.mjs.map +1 -0
- package/dist/store/task-work.d.mts +180 -0
- package/dist/store/task-work.mjs +137 -0
- package/dist/store/task-work.mjs.map +1 -0
- package/dist/store/work-notifications.d.mts +19 -0
- package/dist/store/work-notifications.mjs +48 -0
- package/dist/store/work-notifications.mjs.map +1 -0
- package/dist/sweep.d.mts +79 -0
- package/dist/sweep.mjs +171 -0
- package/dist/sweep.mjs.map +1 -0
- package/dist/task-communication.d.mts +35 -0
- package/dist/task-communication.mjs +47 -0
- package/dist/task-communication.mjs.map +1 -0
- package/dist/task-graph-view.d.mts +267 -0
- package/dist/task-graph-view.mjs +17 -0
- package/dist/task-graph-view.mjs.map +1 -0
- package/dist/task-message-processing.d.mts +60 -0
- package/dist/task-message-processing.mjs +200 -0
- package/dist/task-message-processing.mjs.map +1 -0
- package/dist/task-protocols.d.mts +80 -0
- package/dist/task-protocols.mjs +47 -0
- package/dist/task-protocols.mjs.map +1 -0
- package/dist/tasks.d.mts +17 -0
- package/dist/tasks.mjs +17 -0
- package/dist/vercel-git.d.mts +53 -0
- package/dist/vercel-git.mjs +344 -0
- package/dist/vercel-git.mjs.map +1 -0
- package/dist/vercel-github-api.d.mts +103 -0
- package/dist/vercel-github-api.mjs +363 -0
- package/dist/vercel-github-api.mjs.map +1 -0
- package/dist/vercel.d.mts +34 -2
- package/dist/vercel.mjs +49 -3
- package/dist/vercel.mjs.map +1 -1
- package/dist/work-triage/eve-tool.d.mts +29 -0
- package/dist/work-triage/eve-tool.mjs +32 -0
- package/dist/work-triage/eve-tool.mjs.map +1 -0
- package/dist/work-triage/find-existing-work.d.mts +32 -0
- package/dist/work-triage/find-existing-work.mjs +31 -0
- package/dist/work-triage/find-existing-work.mjs.map +1 -0
- package/dist/work-triage/github.d.mts +15 -0
- package/dist/work-triage/github.mjs +14 -0
- package/dist/work-triage/github.mjs.map +1 -0
- package/dist/work-triage.d.mts +4 -0
- package/dist/work-triage.mjs +3 -0
- package/dist/workflows.d.mts +146 -0
- package/dist/workflows.mjs +139 -0
- package/dist/workflows.mjs.map +1 -0
- package/dist/workspace-diff-assembly.d.mts +33 -0
- package/dist/workspace-diff-assembly.mjs +95 -0
- package/dist/workspace-diff-assembly.mjs.map +1 -0
- package/dist/workspace-diff.d.mts +90 -0
- package/dist/workspace-diff.mjs +61 -0
- package/dist/workspace-diff.mjs.map +1 -0
- package/dist/workspace-files-git.d.mts +15 -0
- package/dist/workspace-files-git.mjs +61 -0
- package/dist/workspace-files-git.mjs.map +1 -0
- package/dist/workspace-files.d.mts +107 -0
- package/dist/workspace-files.mjs +74 -0
- package/dist/workspace-files.mjs.map +1 -0
- package/dist/workspace-snapshot.d.mts +26 -0
- package/dist/workspace-snapshot.mjs +80 -0
- package/dist/workspace-snapshot.mjs.map +1 -0
- package/docs/getting-started.md +104 -0
- package/docs/index.md +100 -0
- package/docs/recipes/cancellation.md +215 -0
- package/docs/recipes/custom-workflow.md +153 -0
- package/docs/recipes/dependent-tasks.md +207 -0
- package/docs/recipes/eve-agent.md +277 -0
- package/docs/recipes/human-input.md +204 -0
- package/docs/recipes/persistence-recovery.md +268 -0
- package/docs/recipes/retry-recovery.md +241 -0
- package/docs/recipes/task-messaging.md +215 -0
- package/docs/recipes/typed-eve-result.md +161 -0
- package/docs/runtime-integration.md +137 -0
- package/package.json +142 -46
- package/dist/approval-JX2Px9IC.mjs +0 -132
- package/dist/approval-JX2Px9IC.mjs.map +0 -1
- package/dist/budget-DzSiIA4t.mjs +0 -42
- package/dist/budget-DzSiIA4t.mjs.map +0 -1
- package/dist/change-D2U6v7Ek.mjs +0 -554
- package/dist/change-D2U6v7Ek.mjs.map +0 -1
- package/dist/communication-Kd9nU5RP.mjs.map +0 -1
- package/dist/coordination-Cq08hb1l.mjs +0 -76
- package/dist/coordination-Cq08hb1l.mjs.map +0 -1
- package/dist/dispatch-BaZS3PT8.d.mts +0 -76
- package/dist/driver-BC0Mt5KG.d.mts +0 -34
- package/dist/driver-Bbd25rNM.mjs +0 -23
- package/dist/driver-Bbd25rNM.mjs.map +0 -1
- package/dist/engine-DFHU2Pe-.d.mts +0 -781
- package/dist/engine-WaUM2cGA.mjs +0 -1068
- package/dist/engine-WaUM2cGA.mjs.map +0 -1
- package/dist/factory-config-BoRXOw43.mjs +0 -50
- package/dist/factory-config-BoRXOw43.mjs.map +0 -1
- package/dist/factory-config-D2yU3G0c.d.mts +0 -58
- package/dist/github-C5HNBN6p.d.mts +0 -279
- package/dist/id-BLIkCVue.mjs.map +0 -1
- package/dist/index-Bw6hggoH.d.mts +0 -40
- package/dist/index.mjs.map +0 -1
- package/dist/task-CcOyOJ3k.mjs +0 -154
- package/dist/task-CcOyOJ3k.mjs.map +0 -1
|
@@ -0,0 +1,273 @@
|
|
|
1
|
+
import { createHash, randomUUID } from "node:crypto";
|
|
2
|
+
//#region src/github-transfer.ts
|
|
3
|
+
/** Maximum binary size accepted for a credential-free Git bundle transfer. */
|
|
4
|
+
const maxGitBundleBytes = 314572800;
|
|
5
|
+
/** Maximum binary upload size; uploads are sequential to bound SDK buffering. */
|
|
6
|
+
const gitBundleChunkBytes = 4194304;
|
|
7
|
+
/** Quote one argument for the sandbox's POSIX shell command boundary. */
|
|
8
|
+
function quoteShellArgument(value) {
|
|
9
|
+
return "'" + value.replaceAll("'", "'\"'\"'") + "'";
|
|
10
|
+
}
|
|
11
|
+
/** Run an argument vector through the sandbox command boundary without interpolating its values. */
|
|
12
|
+
async function runSandboxCommand(sandbox, command) {
|
|
13
|
+
if (command.length === 0) throw new Error("Sandbox command must contain an executable");
|
|
14
|
+
const rendered = command.map(quoteShellArgument).join(" ");
|
|
15
|
+
const result = await sandbox.run({ command: rendered });
|
|
16
|
+
if (typeof result.exitCode === "number" && result.exitCode !== 0) throw new Error(`Sandbox command failed: ${(result.stderr ?? "").trim()}`);
|
|
17
|
+
return result.stdout;
|
|
18
|
+
}
|
|
19
|
+
/** Stream a size-bounded Git bundle into a sandbox, verify its digest, and remove it after use. */
|
|
20
|
+
async function withSandboxGitBundle(input) {
|
|
21
|
+
const directory = `/tmp/factory-${randomUUID()}`;
|
|
22
|
+
const path = `${directory}/transfer.bundle`;
|
|
23
|
+
const reader = input.bundle.stream.getReader();
|
|
24
|
+
const hash = createHash("sha256");
|
|
25
|
+
const parts = [];
|
|
26
|
+
let buffer = Buffer.allocUnsafe(gitBundleChunkBytes);
|
|
27
|
+
let buffered = 0;
|
|
28
|
+
let size = 0;
|
|
29
|
+
let headerValidated = false;
|
|
30
|
+
function validateHeader() {
|
|
31
|
+
const header = buffer.subarray(0, Math.min(buffered, 16)).toString();
|
|
32
|
+
if (!header.startsWith("# v2 git bundle\n") && !header.startsWith("# v3 git bundle\n")) throw new Error("Invalid Git bundle header");
|
|
33
|
+
headerValidated = true;
|
|
34
|
+
}
|
|
35
|
+
async function flush() {
|
|
36
|
+
if (!headerValidated) validateHeader();
|
|
37
|
+
const part = `${directory}/${parts.length}.part`;
|
|
38
|
+
const content = buffer.subarray(0, buffered);
|
|
39
|
+
hash.update(content);
|
|
40
|
+
await input.sandbox.writeBinaryFile({
|
|
41
|
+
path: part,
|
|
42
|
+
content
|
|
43
|
+
});
|
|
44
|
+
parts.push(part);
|
|
45
|
+
buffer = Buffer.allocUnsafe(gitBundleChunkBytes);
|
|
46
|
+
buffered = 0;
|
|
47
|
+
}
|
|
48
|
+
try {
|
|
49
|
+
await runSandboxCommand(input.sandbox, [
|
|
50
|
+
"mkdir",
|
|
51
|
+
"-m",
|
|
52
|
+
"700",
|
|
53
|
+
directory
|
|
54
|
+
]);
|
|
55
|
+
for (;;) {
|
|
56
|
+
const { done, value } = await reader.read();
|
|
57
|
+
if (done) break;
|
|
58
|
+
size += value.byteLength;
|
|
59
|
+
if (size > 314572800) throw new Error("Git bundle exceeds transfer limit");
|
|
60
|
+
for (let offset = 0; offset < value.byteLength;) {
|
|
61
|
+
const length = Math.min(buffer.length - buffered, value.byteLength - offset);
|
|
62
|
+
buffer.set(value.subarray(offset, offset + length), buffered);
|
|
63
|
+
buffered += length;
|
|
64
|
+
offset += length;
|
|
65
|
+
if (!headerValidated && buffered >= 16) validateHeader();
|
|
66
|
+
if (buffered === buffer.length) await flush();
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
if (buffered > 0) await flush();
|
|
70
|
+
if (!headerValidated) throw new Error("Invalid Git bundle header");
|
|
71
|
+
await runSandboxCommand(input.sandbox, [
|
|
72
|
+
"sh",
|
|
73
|
+
"-c",
|
|
74
|
+
"cat \"$@\" > \"$0\"",
|
|
75
|
+
path,
|
|
76
|
+
...parts
|
|
77
|
+
]);
|
|
78
|
+
await runSandboxCommand(input.sandbox, [
|
|
79
|
+
"sh",
|
|
80
|
+
"-c",
|
|
81
|
+
"printf \"%s %s\\n\" \"$1\" \"$2\" | sha256sum -c - >/dev/null",
|
|
82
|
+
"verify-bundle",
|
|
83
|
+
hash.digest("hex"),
|
|
84
|
+
path
|
|
85
|
+
]);
|
|
86
|
+
return await input.use(path);
|
|
87
|
+
} finally {
|
|
88
|
+
try {
|
|
89
|
+
await reader.cancel();
|
|
90
|
+
} finally {
|
|
91
|
+
reader.releaseLock();
|
|
92
|
+
await runSandboxCommand(input.sandbox, [
|
|
93
|
+
"rm",
|
|
94
|
+
"-rf",
|
|
95
|
+
directory
|
|
96
|
+
]);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
/** Initialize a missing checkout and import exact GitHub refs without credentials. */
|
|
101
|
+
async function fetchGitHubRefs(input) {
|
|
102
|
+
await input.transport.fetch({
|
|
103
|
+
repository: input.repository,
|
|
104
|
+
refs: input.refs.map((ref) => ref.remote)
|
|
105
|
+
}, async (bundle) => {
|
|
106
|
+
await withSandboxGitBundle({
|
|
107
|
+
sandbox: input.sandbox,
|
|
108
|
+
bundle,
|
|
109
|
+
async use(path) {
|
|
110
|
+
const repositoryPath = input.repositoryPath ?? "repo";
|
|
111
|
+
const checkout = await input.sandbox.run({ command: [
|
|
112
|
+
"test",
|
|
113
|
+
"-d",
|
|
114
|
+
`${repositoryPath}/.git`
|
|
115
|
+
].map(quoteShellArgument).join(" ") });
|
|
116
|
+
if (checkout.exitCode !== void 0 && checkout.exitCode !== 0) {
|
|
117
|
+
await runSandboxCommand(input.sandbox, [
|
|
118
|
+
"git",
|
|
119
|
+
"init",
|
|
120
|
+
repositoryPath
|
|
121
|
+
]);
|
|
122
|
+
for (const args of [
|
|
123
|
+
[
|
|
124
|
+
"remote",
|
|
125
|
+
"add",
|
|
126
|
+
"origin",
|
|
127
|
+
`https://github.com/${input.repository}.git`
|
|
128
|
+
],
|
|
129
|
+
[
|
|
130
|
+
"config",
|
|
131
|
+
"user.name",
|
|
132
|
+
"factory"
|
|
133
|
+
],
|
|
134
|
+
[
|
|
135
|
+
"config",
|
|
136
|
+
"user.email",
|
|
137
|
+
"factory@localhost"
|
|
138
|
+
]
|
|
139
|
+
]) await runSandboxCommand(input.sandbox, [
|
|
140
|
+
"git",
|
|
141
|
+
"-C",
|
|
142
|
+
repositoryPath,
|
|
143
|
+
...args
|
|
144
|
+
]);
|
|
145
|
+
}
|
|
146
|
+
await runSandboxCommand(input.sandbox, [
|
|
147
|
+
"git",
|
|
148
|
+
"-C",
|
|
149
|
+
repositoryPath,
|
|
150
|
+
"bundle",
|
|
151
|
+
"verify",
|
|
152
|
+
path
|
|
153
|
+
]);
|
|
154
|
+
await runSandboxCommand(input.sandbox, [
|
|
155
|
+
"git",
|
|
156
|
+
"-C",
|
|
157
|
+
repositoryPath,
|
|
158
|
+
"fetch",
|
|
159
|
+
"--no-tags",
|
|
160
|
+
path,
|
|
161
|
+
...input.refs.map((ref) => `+${ref.remote}:${ref.local}`)
|
|
162
|
+
]);
|
|
163
|
+
}
|
|
164
|
+
});
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
async function* readGitBundleParts(sandbox, directory, size) {
|
|
168
|
+
const count = Math.ceil(size / gitBundleChunkBytes);
|
|
169
|
+
for (let index = 0; index < count; index++) {
|
|
170
|
+
const suffix = String.fromCharCode(97 + Math.floor(index / 26), 97 + index % 26);
|
|
171
|
+
const stream = await sandbox.readFile({ path: `${directory}/part-${suffix}` });
|
|
172
|
+
if (stream === null) throw new Error("Git bundle part was not created");
|
|
173
|
+
const reader = stream.getReader();
|
|
174
|
+
const expectedBytes = Math.min(gitBundleChunkBytes, size - index * gitBundleChunkBytes);
|
|
175
|
+
let bytes = 0;
|
|
176
|
+
try {
|
|
177
|
+
for (;;) {
|
|
178
|
+
const { done, value } = await reader.read();
|
|
179
|
+
if (done) break;
|
|
180
|
+
bytes += value.byteLength;
|
|
181
|
+
if (bytes > expectedBytes) throw new Error("Invalid Git bundle part size");
|
|
182
|
+
yield value;
|
|
183
|
+
}
|
|
184
|
+
if (bytes !== expectedBytes) throw new Error("Invalid Git bundle part size");
|
|
185
|
+
} finally {
|
|
186
|
+
try {
|
|
187
|
+
await reader.cancel();
|
|
188
|
+
} finally {
|
|
189
|
+
reader.releaseLock();
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
/** Publish the current sandbox commit with an expected-head lease. */
|
|
195
|
+
async function pushGitHubHead(input) {
|
|
196
|
+
const repositoryPath = input.repositoryPath ?? "repo";
|
|
197
|
+
const directory = `/tmp/factory-${randomUUID()}`;
|
|
198
|
+
const path = `${directory}/transfer.bundle`;
|
|
199
|
+
try {
|
|
200
|
+
await runSandboxCommand(input.sandbox, [
|
|
201
|
+
"mkdir",
|
|
202
|
+
"-m",
|
|
203
|
+
"700",
|
|
204
|
+
directory
|
|
205
|
+
]);
|
|
206
|
+
const head = (await runSandboxCommand(input.sandbox, [
|
|
207
|
+
"git",
|
|
208
|
+
"-C",
|
|
209
|
+
repositoryPath,
|
|
210
|
+
"rev-parse",
|
|
211
|
+
"HEAD"
|
|
212
|
+
])).trim();
|
|
213
|
+
await runSandboxCommand(input.sandbox, [
|
|
214
|
+
"git",
|
|
215
|
+
"-C",
|
|
216
|
+
repositoryPath,
|
|
217
|
+
"bundle",
|
|
218
|
+
"create",
|
|
219
|
+
path,
|
|
220
|
+
"HEAD"
|
|
221
|
+
]);
|
|
222
|
+
const size = Number(await runSandboxCommand(input.sandbox, [
|
|
223
|
+
"sh",
|
|
224
|
+
"-c",
|
|
225
|
+
"wc -c < \"$1\"",
|
|
226
|
+
"bundle-size",
|
|
227
|
+
path
|
|
228
|
+
]));
|
|
229
|
+
if (!Number.isSafeInteger(size) || size < 1 || size > 314572800) throw new Error("Git bundle exceeds transfer limit");
|
|
230
|
+
await runSandboxCommand(input.sandbox, [
|
|
231
|
+
"split",
|
|
232
|
+
"-b",
|
|
233
|
+
String(gitBundleChunkBytes),
|
|
234
|
+
path,
|
|
235
|
+
`${directory}/part-`
|
|
236
|
+
]);
|
|
237
|
+
const parts = readGitBundleParts(input.sandbox, directory, size);
|
|
238
|
+
const stream = new ReadableStream({
|
|
239
|
+
async pull(controller) {
|
|
240
|
+
const { done, value } = await parts.next();
|
|
241
|
+
if (done) controller.close();
|
|
242
|
+
else controller.enqueue(value);
|
|
243
|
+
},
|
|
244
|
+
async cancel() {
|
|
245
|
+
await parts.return(void 0);
|
|
246
|
+
}
|
|
247
|
+
}, { highWaterMark: 0 });
|
|
248
|
+
try {
|
|
249
|
+
return await input.transport.push({
|
|
250
|
+
repository: input.repository,
|
|
251
|
+
bundle: { stream },
|
|
252
|
+
branch: input.branch,
|
|
253
|
+
expectedHead: input.expectedHead,
|
|
254
|
+
baseHead: input.baseHead,
|
|
255
|
+
head,
|
|
256
|
+
authorize: input.authorize
|
|
257
|
+
});
|
|
258
|
+
} finally {
|
|
259
|
+
await parts.return(void 0);
|
|
260
|
+
if (!stream.locked) await stream.cancel();
|
|
261
|
+
}
|
|
262
|
+
} finally {
|
|
263
|
+
await runSandboxCommand(input.sandbox, [
|
|
264
|
+
"rm",
|
|
265
|
+
"-rf",
|
|
266
|
+
directory
|
|
267
|
+
]);
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
//#endregion
|
|
271
|
+
export { fetchGitHubRefs, gitBundleChunkBytes, maxGitBundleBytes, pushGitHubHead, quoteShellArgument, runSandboxCommand, withSandboxGitBundle };
|
|
272
|
+
|
|
273
|
+
//# sourceMappingURL=github-transfer.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"github-transfer.mjs","names":[],"sources":["../src/github-transfer.ts"],"sourcesContent":["import { createHash, randomUUID } from \"node:crypto\";\nimport type { CommandSandbox } from \"./sandbox/command\";\nimport type { RepositorySlug } from \"./schema/repository\";\n\n/** Sandbox path used to read a transferred Git bundle. */\nexport interface ReadGitTransferFileInput {\n path: string;\n}\n\n/** Sandbox path and bytes used to stage a transferred Git bundle. */\nexport interface WriteGitTransferFileInput {\n path: string;\n content: Uint8Array;\n}\n\n/** Binary file and command access used to exchange Git objects with an agent sandbox. */\nexport interface GitTransferSandbox extends CommandSandbox {\n readFile(options: ReadGitTransferFileInput): PromiseLike<ReadableStream<Uint8Array> | null>;\n writeBinaryFile(options: WriteGitTransferFileInput): PromiseLike<void>;\n}\n\n/** Self-contained Git objects and refs transported without repository configuration or hooks. */\nexport interface GitHubRepositoryBundle {\n /** Single-use binary stream, consumed before the transport callback returns. */\n stream: ReadableStream<Uint8Array>;\n}\n\n/** Repository and exact additional refs requested from the trusted Git transport. */\nexport interface FetchGitHubBundleInput {\n repository: RepositorySlug;\n refs: readonly string[];\n}\n\n/** Exact branch update requested from the trusted Git transport. */\nexport interface PushGitHubBundleInput {\n repository: RepositorySlug;\n bundle: GitHubRepositoryBundle;\n branch: string;\n expectedHead: string;\n /** Existing commit that a create-only branch must descend from. */\n baseHead?: string;\n head: string;\n /** Rechecks application authority immediately before the provider mutation. */\n authorize(): Promise<void>;\n}\n\n/** Trusted Git transport that never enables credentials in an agent sandbox. */\nexport interface GitHubGitTransport {\n /** Consume all branch heads and additional exact refs while the read-only transport remains open. */\n fetch(\n input: FetchGitHubBundleInput,\n use: (bundle: GitHubRepositoryBundle) => Promise<void>,\n ): Promise<void>;\n /** Publish a bundle to exactly one branch and return its actual remote head. */\n push(input: PushGitHubBundleInput): Promise<string>;\n}\n\n/** Maximum binary size accepted for a credential-free Git bundle transfer. */\nexport const maxGitBundleBytes = 300 * 1024 * 1024;\n\n/** Maximum binary upload size; uploads are sequential to bound SDK buffering. */\nexport const gitBundleChunkBytes = 4 * 1024 * 1024;\n\n/** Quote one argument for the sandbox's POSIX shell command boundary. */\nexport function quoteShellArgument(value: string): string {\n return \"'\" + value.replaceAll(\"'\", \"'\\\"'\\\"'\") + \"'\";\n}\n\n/** Run an argument vector through the sandbox command boundary without interpolating its values. */\nexport async function runSandboxCommand(\n sandbox: CommandSandbox,\n command: readonly string[],\n): Promise<string> {\n if (command.length === 0) throw new Error(\"Sandbox command must contain an executable\");\n const rendered = command.map(quoteShellArgument).join(\" \");\n const result = await sandbox.run({ command: rendered });\n if (typeof result.exitCode === \"number\" && result.exitCode !== 0) {\n throw new Error(`Sandbox command failed: ${(result.stderr ?? \"\").trim()}`);\n }\n return result.stdout;\n}\n\n/** Input for temporarily copying a credential-free Git bundle into a sandbox. */\nexport interface WithSandboxGitBundleInput<T> {\n sandbox: Pick<GitTransferSandbox, \"run\" | \"writeBinaryFile\">;\n bundle: GitHubRepositoryBundle;\n use(path: string): Promise<T>;\n}\n\n/** Stream a size-bounded Git bundle into a sandbox, verify its digest, and remove it after use. */\nexport async function withSandboxGitBundle<T>(input: WithSandboxGitBundleInput<T>): Promise<T> {\n const directory = `/tmp/factory-${randomUUID()}`;\n const path = `${directory}/transfer.bundle`;\n const reader = input.bundle.stream.getReader();\n const hash = createHash(\"sha256\");\n const parts: string[] = [];\n let buffer = Buffer.allocUnsafe(gitBundleChunkBytes);\n let buffered = 0;\n let size = 0;\n let headerValidated = false;\n function validateHeader() {\n const header = buffer.subarray(0, Math.min(buffered, 16)).toString();\n if (!header.startsWith(\"# v2 git bundle\\n\") && !header.startsWith(\"# v3 git bundle\\n\")) {\n throw new Error(\"Invalid Git bundle header\");\n }\n headerValidated = true;\n }\n async function flush() {\n if (!headerValidated) validateHeader();\n const part = `${directory}/${parts.length}.part`;\n const content = buffer.subarray(0, buffered);\n hash.update(content);\n await input.sandbox.writeBinaryFile({ path: part, content });\n parts.push(part);\n // SDK callers may retain the upload buffer until their request has completed.\n buffer = Buffer.allocUnsafe(gitBundleChunkBytes);\n buffered = 0;\n }\n try {\n await runSandboxCommand(input.sandbox, [\"mkdir\", \"-m\", \"700\", directory]);\n for (;;) {\n const { done, value } = await reader.read();\n if (done) break;\n size += value.byteLength;\n if (size > maxGitBundleBytes) throw new Error(\"Git bundle exceeds transfer limit\");\n for (let offset = 0; offset < value.byteLength;) {\n const length = Math.min(buffer.length - buffered, value.byteLength - offset);\n buffer.set(value.subarray(offset, offset + length), buffered);\n buffered += length;\n offset += length;\n if (!headerValidated && buffered >= 16) validateHeader();\n if (buffered === buffer.length) await flush();\n }\n }\n if (buffered > 0) await flush();\n if (!headerValidated) throw new Error(\"Invalid Git bundle header\");\n await runSandboxCommand(input.sandbox, [\"sh\", \"-c\", 'cat \"$@\" > \"$0\"', path, ...parts]);\n await runSandboxCommand(input.sandbox, [\n \"sh\",\n \"-c\",\n 'printf \"%s %s\\\\n\" \"$1\" \"$2\" | sha256sum -c - >/dev/null',\n \"verify-bundle\",\n hash.digest(\"hex\"),\n path,\n ]);\n return await input.use(path);\n } finally {\n try {\n await reader.cancel();\n } finally {\n reader.releaseLock();\n await runSandboxCommand(input.sandbox, [\"rm\", \"-rf\", directory]);\n }\n }\n}\n\n/** One remote Git ref and its sandbox-local destination. */\nexport interface GitHubRefMapping {\n remote: string;\n local: string;\n}\n\n/** Input for importing exact GitHub refs into a credential-free sandbox checkout. */\nexport interface FetchGitHubRefsInput {\n sandbox: GitTransferSandbox;\n transport: GitHubGitTransport;\n repository: RepositorySlug;\n refs: readonly GitHubRefMapping[];\n repositoryPath?: string;\n}\n\n/** Initialize a missing checkout and import exact GitHub refs without credentials. */\nexport async function fetchGitHubRefs(input: FetchGitHubRefsInput): Promise<void> {\n await input.transport.fetch(\n {\n repository: input.repository,\n refs: input.refs.map((ref) => ref.remote),\n },\n async (bundle) => {\n await withSandboxGitBundle({\n sandbox: input.sandbox,\n bundle,\n async use(path) {\n const repositoryPath = input.repositoryPath ?? \"repo\";\n const checkout = await input.sandbox.run({\n command: [\"test\", \"-d\", `${repositoryPath}/.git`].map(quoteShellArgument).join(\" \"),\n });\n if (checkout.exitCode !== undefined && checkout.exitCode !== 0) {\n await runSandboxCommand(input.sandbox, [\"git\", \"init\", repositoryPath]);\n for (const args of [\n [\"remote\", \"add\", \"origin\", `https://github.com/${input.repository}.git`],\n [\"config\", \"user.name\", \"factory\"],\n [\"config\", \"user.email\", \"factory@localhost\"],\n ]) {\n await runSandboxCommand(input.sandbox, [\"git\", \"-C\", repositoryPath, ...args]);\n }\n }\n await runSandboxCommand(input.sandbox, [\n \"git\",\n \"-C\",\n repositoryPath,\n \"bundle\",\n \"verify\",\n path,\n ]);\n await runSandboxCommand(input.sandbox, [\n \"git\",\n \"-C\",\n repositoryPath,\n \"fetch\",\n \"--no-tags\",\n path,\n ...input.refs.map((ref) => `+${ref.remote}:${ref.local}`),\n ]);\n },\n });\n },\n );\n}\n\n/** Input for publishing the current sandbox commit to one exact GitHub branch. */\nexport interface PushGitHubHeadInput {\n sandbox: GitTransferSandbox;\n transport: GitHubGitTransport;\n repository: RepositorySlug;\n branch: string;\n expectedHead: string;\n /** Existing commit that a create-only branch must descend from. */\n baseHead?: string;\n /** Rechecks application authority immediately before the provider mutation. */\n authorize(): Promise<void>;\n repositoryPath?: string;\n}\n\nasync function* readGitBundleParts(sandbox: GitTransferSandbox, directory: string, size: number) {\n const count = Math.ceil(size / gitBundleChunkBytes);\n for (let index = 0; index < count; index++) {\n const suffix = String.fromCharCode(97 + Math.floor(index / 26), 97 + (index % 26));\n const stream = await sandbox.readFile({ path: `${directory}/part-${suffix}` });\n if (stream === null) throw new Error(\"Git bundle part was not created\");\n const reader = stream.getReader();\n const expectedBytes = Math.min(gitBundleChunkBytes, size - index * gitBundleChunkBytes);\n let bytes = 0;\n try {\n for (;;) {\n const { done, value } = await reader.read();\n if (done) break;\n bytes += value.byteLength;\n if (bytes > expectedBytes) throw new Error(\"Invalid Git bundle part size\");\n yield value;\n }\n if (bytes !== expectedBytes) throw new Error(\"Invalid Git bundle part size\");\n } finally {\n try {\n await reader.cancel();\n } finally {\n reader.releaseLock();\n }\n }\n }\n}\n\n/** Publish the current sandbox commit with an expected-head lease. */\nexport async function pushGitHubHead(input: PushGitHubHeadInput): Promise<string> {\n const repositoryPath = input.repositoryPath ?? \"repo\";\n const directory = `/tmp/factory-${randomUUID()}`;\n const path = `${directory}/transfer.bundle`;\n try {\n await runSandboxCommand(input.sandbox, [\"mkdir\", \"-m\", \"700\", directory]);\n const head = (\n await runSandboxCommand(input.sandbox, [\"git\", \"-C\", repositoryPath, \"rev-parse\", \"HEAD\"])\n ).trim();\n await runSandboxCommand(input.sandbox, [\n \"git\",\n \"-C\",\n repositoryPath,\n \"bundle\",\n \"create\",\n path,\n \"HEAD\",\n ]);\n const size = Number(\n await runSandboxCommand(input.sandbox, [\"sh\", \"-c\", 'wc -c < \"$1\"', \"bundle-size\", path]),\n );\n if (!Number.isSafeInteger(size) || size < 1 || size > maxGitBundleBytes) {\n throw new Error(\"Git bundle exceeds transfer limit\");\n }\n // Eve's Node-to-Web adapter can prefetch the entire file; bound each source file as well.\n await runSandboxCommand(input.sandbox, [\n \"split\",\n \"-b\",\n String(gitBundleChunkBytes),\n path,\n `${directory}/part-`,\n ]);\n const parts = readGitBundleParts(input.sandbox, directory, size);\n const stream = new ReadableStream<Uint8Array>(\n {\n async pull(controller) {\n const { done, value } = await parts.next();\n if (done) controller.close();\n else controller.enqueue(value);\n },\n async cancel() {\n await parts.return(undefined);\n },\n },\n { highWaterMark: 0 },\n );\n try {\n return await input.transport.push({\n repository: input.repository,\n bundle: { stream },\n branch: input.branch,\n expectedHead: input.expectedHead,\n baseHead: input.baseHead,\n head,\n authorize: input.authorize,\n });\n } finally {\n await parts.return(undefined);\n if (!stream.locked) await stream.cancel();\n }\n } finally {\n await runSandboxCommand(input.sandbox, [\"rm\", \"-rf\", directory]);\n }\n}\n"],"mappings":"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"}
|