@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,344 @@
|
|
|
1
|
+
import { repositorySlugSchema } from "./schema/repository.mjs";
|
|
2
|
+
import { withSandboxGitBundle } from "./github-transfer.mjs";
|
|
3
|
+
import { isSafeGitRef } from "./github-publication.mjs";
|
|
4
|
+
import { randomUUID } from "node:crypto";
|
|
5
|
+
import { Readable } from "node:stream";
|
|
6
|
+
//#region src/vercel-git.ts
|
|
7
|
+
const gitOidPattern = /^[a-f0-9]{40}$/u;
|
|
8
|
+
const absentGitOid = "0".repeat(40);
|
|
9
|
+
const managedGitTimeoutMs = 18e4;
|
|
10
|
+
async function createManagedSandbox(input) {
|
|
11
|
+
const { Sandbox } = await import("@vercel/sandbox");
|
|
12
|
+
return Sandbox.create({ ...input });
|
|
13
|
+
}
|
|
14
|
+
function publicationBase(input) {
|
|
15
|
+
if (!isSafeGitRef(input.branch) || !gitOidPattern.test(input.head) || !gitOidPattern.test(input.expectedHead) || (input.expectedHead === absentGitOid ? input.baseHead === void 0 || !gitOidPattern.test(input.baseHead) : input.baseHead !== void 0)) throw new Error("Invalid Git publication target");
|
|
16
|
+
return input.expectedHead === absentGitOid ? input.baseHead : input.expectedHead;
|
|
17
|
+
}
|
|
18
|
+
async function trustedCommand(sandbox, input) {
|
|
19
|
+
const result = await sandbox.runCommand({
|
|
20
|
+
...input,
|
|
21
|
+
timeoutMs: 12e4
|
|
22
|
+
});
|
|
23
|
+
if (result.exitCode !== 0) throw new Error(`Trusted Git operation failed (${result.exitCode})`);
|
|
24
|
+
return (await result.stdout()).trim();
|
|
25
|
+
}
|
|
26
|
+
function bundleTransferSandbox(sandbox) {
|
|
27
|
+
return {
|
|
28
|
+
async run({ command }) {
|
|
29
|
+
const result = await sandbox.runCommand({
|
|
30
|
+
cmd: "sh",
|
|
31
|
+
args: ["-c", command]
|
|
32
|
+
});
|
|
33
|
+
return {
|
|
34
|
+
exitCode: result.exitCode,
|
|
35
|
+
stdout: await result.stdout()
|
|
36
|
+
};
|
|
37
|
+
},
|
|
38
|
+
async writeBinaryFile({ path, content }) {
|
|
39
|
+
await sandbox.writeFiles([{
|
|
40
|
+
path,
|
|
41
|
+
content: Buffer.from(content.buffer, content.byteOffset, content.byteLength)
|
|
42
|
+
}]);
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
async function consumeSandboxBundle(sandbox, path, use) {
|
|
47
|
+
const size = await sandbox.runCommand({
|
|
48
|
+
cmd: "stat",
|
|
49
|
+
args: [
|
|
50
|
+
"-c",
|
|
51
|
+
"%s",
|
|
52
|
+
path
|
|
53
|
+
]
|
|
54
|
+
});
|
|
55
|
+
const byteLength = Number(await size.stdout());
|
|
56
|
+
if (size.exitCode !== 0 || !Number.isSafeInteger(byteLength) || byteLength < 1 || byteLength > 314572800) throw new Error("Git bundle exceeds transfer limit");
|
|
57
|
+
const source = await sandbox.readFile({ path });
|
|
58
|
+
if (!source) throw new Error("Git bundle was not created");
|
|
59
|
+
const readable = source instanceof Readable ? source : new Readable({ highWaterMark: 65536 }).wrap(source);
|
|
60
|
+
const iterator = readable[Symbol.asyncIterator]();
|
|
61
|
+
const stream = new ReadableStream({
|
|
62
|
+
async pull(controller) {
|
|
63
|
+
const { done, value } = await iterator.next();
|
|
64
|
+
if (done) controller.close();
|
|
65
|
+
else controller.enqueue(value);
|
|
66
|
+
},
|
|
67
|
+
async cancel() {
|
|
68
|
+
await iterator.return?.();
|
|
69
|
+
}
|
|
70
|
+
}, { highWaterMark: 0 });
|
|
71
|
+
try {
|
|
72
|
+
await use({ stream });
|
|
73
|
+
} finally {
|
|
74
|
+
readable.destroy();
|
|
75
|
+
if (!stream.locked) await stream.cancel();
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
function credentialPolicy(repository, token) {
|
|
79
|
+
return { allow: { "github.com": [{
|
|
80
|
+
match: { path: { startsWith: `/${repository}.git/` } },
|
|
81
|
+
transform: [{ headers: { authorization: `Basic ${Buffer.from(`x-access-token:${token}`).toString("base64")}` } }]
|
|
82
|
+
}] } };
|
|
83
|
+
}
|
|
84
|
+
/** Transfer Git objects through fresh trusted sandboxes; credentials never reach an agent sandbox. */
|
|
85
|
+
function createVercelGitHubGitTransport(options) {
|
|
86
|
+
async function isolated(repository, use) {
|
|
87
|
+
const slug = repositorySlugSchema.parse(repository.toLowerCase());
|
|
88
|
+
const sandbox = options.createSandbox ? await options.createSandbox() : await (await import("@vercel/sandbox")).Sandbox.create({
|
|
89
|
+
runtime: "node24",
|
|
90
|
+
timeout: 18e4,
|
|
91
|
+
networkPolicy: "deny-all"
|
|
92
|
+
});
|
|
93
|
+
async function git(...args) {
|
|
94
|
+
const result = await sandbox.runCommand({
|
|
95
|
+
cmd: "/usr/bin/env",
|
|
96
|
+
args: [
|
|
97
|
+
"-i",
|
|
98
|
+
"PATH=/usr/bin:/bin",
|
|
99
|
+
"HOME=/tmp",
|
|
100
|
+
"GIT_CONFIG_NOSYSTEM=1",
|
|
101
|
+
"GIT_CONFIG_GLOBAL=/dev/null",
|
|
102
|
+
"GIT_TERMINAL_PROMPT=0",
|
|
103
|
+
"git",
|
|
104
|
+
"-c",
|
|
105
|
+
"core.hooksPath=/dev/null",
|
|
106
|
+
"-c",
|
|
107
|
+
"credential.helper=",
|
|
108
|
+
"-c",
|
|
109
|
+
"protocol.ext.allow=never",
|
|
110
|
+
"-c",
|
|
111
|
+
"protocol.file.allow=always",
|
|
112
|
+
"-c",
|
|
113
|
+
"http.followRedirects=false",
|
|
114
|
+
...args
|
|
115
|
+
],
|
|
116
|
+
timeoutMs: 12e4
|
|
117
|
+
});
|
|
118
|
+
if (result.exitCode !== 0) throw new Error(`Trusted Git operation failed (${result.exitCode})`);
|
|
119
|
+
return (await result.stdout()).trim();
|
|
120
|
+
}
|
|
121
|
+
try {
|
|
122
|
+
await sandbox.updateNetworkPolicy("deny-all");
|
|
123
|
+
return await use(sandbox, git, slug);
|
|
124
|
+
} finally {
|
|
125
|
+
try {
|
|
126
|
+
await sandbox.updateNetworkPolicy("deny-all");
|
|
127
|
+
} finally {
|
|
128
|
+
await sandbox.stop();
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
return {
|
|
133
|
+
async fetch(input, use) {
|
|
134
|
+
if (input.refs.some((ref) => !ref.startsWith("refs/") || !isSafeGitRef(ref))) throw new Error("Invalid Git fetch ref");
|
|
135
|
+
return isolated(input.repository, async (sandbox, git, slug) => {
|
|
136
|
+
await sandbox.updateNetworkPolicy(credentialPolicy(slug, await options.token({
|
|
137
|
+
repository: slug,
|
|
138
|
+
access: "read"
|
|
139
|
+
})));
|
|
140
|
+
await git("clone", "--bare", "--no-hardlinks", `https://github.com/${slug}.git`, "/tmp/transfer.git");
|
|
141
|
+
if (input.refs.length) await git("-C", "/tmp/transfer.git", "fetch", "--no-tags", "origin", ...input.refs.map((ref) => `+${ref}:${ref}`));
|
|
142
|
+
await sandbox.updateNetworkPolicy("deny-all");
|
|
143
|
+
await git("-C", "/tmp/transfer.git", "bundle", "create", "/tmp/transfer.bundle", "--all");
|
|
144
|
+
await consumeSandboxBundle(sandbox, "/tmp/transfer.bundle", use);
|
|
145
|
+
});
|
|
146
|
+
},
|
|
147
|
+
async push(input) {
|
|
148
|
+
try {
|
|
149
|
+
const baseHead = publicationBase(input);
|
|
150
|
+
return await isolated(input.repository, async (sandbox, git, slug) => {
|
|
151
|
+
await git("init", "--bare", "/tmp/transfer.git");
|
|
152
|
+
return await withSandboxGitBundle({
|
|
153
|
+
sandbox: bundleTransferSandbox(sandbox),
|
|
154
|
+
bundle: input.bundle,
|
|
155
|
+
async use(path) {
|
|
156
|
+
await git("-C", "/tmp/transfer.git", "bundle", "verify", path);
|
|
157
|
+
await git("-C", "/tmp/transfer.git", "fetch", path, "HEAD:refs/heads/candidate");
|
|
158
|
+
if (await git("-C", "/tmp/transfer.git", "rev-parse", "refs/heads/candidate") !== input.head) throw new Error("Git bundle head does not match publication target");
|
|
159
|
+
await git("-C", "/tmp/transfer.git", "merge-base", "--is-ancestor", baseHead, "refs/heads/candidate");
|
|
160
|
+
await sandbox.updateNetworkPolicy(credentialPolicy(slug, await options.token({
|
|
161
|
+
repository: slug,
|
|
162
|
+
access: "write"
|
|
163
|
+
})));
|
|
164
|
+
await input.authorize();
|
|
165
|
+
await git("-C", "/tmp/transfer.git", "push", `--force-with-lease=refs/heads/${input.branch}:${input.expectedHead}`, `https://github.com/${slug}.git`, `${input.head}:refs/heads/${input.branch}`);
|
|
166
|
+
return input.head;
|
|
167
|
+
}
|
|
168
|
+
});
|
|
169
|
+
});
|
|
170
|
+
} finally {
|
|
171
|
+
if (!input.bundle.stream.locked) await input.bundle.stream.cancel();
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
/** Use fresh Vercel-managed trusted Sandboxes for Git reads and signed publication. */
|
|
177
|
+
function createVercelManagedGitHubGitTransport(options) {
|
|
178
|
+
const createSandbox = options.createSandbox ?? createManagedSandbox;
|
|
179
|
+
const createInput = (repository, access) => ({
|
|
180
|
+
source: {
|
|
181
|
+
type: "git",
|
|
182
|
+
url: `https://github.com/${repository}.git`
|
|
183
|
+
},
|
|
184
|
+
__source_credentials: true,
|
|
185
|
+
__commitAs: options.commitIdentity,
|
|
186
|
+
networkPolicy: { allow: access === "read" ? ["github.com"] : ["github.com", "api.github.com"] },
|
|
187
|
+
persistent: false,
|
|
188
|
+
resources: { vcpus: 6 },
|
|
189
|
+
runtime: "node24",
|
|
190
|
+
timeout: managedGitTimeoutMs
|
|
191
|
+
});
|
|
192
|
+
return {
|
|
193
|
+
async fetch(input, use) {
|
|
194
|
+
if (input.refs.some((ref) => !ref.startsWith("refs/") || !isSafeGitRef(ref))) throw new Error("Invalid Git fetch ref");
|
|
195
|
+
const repository = repositorySlugSchema.parse(input.repository.toLowerCase());
|
|
196
|
+
const sandbox = await createSandbox(createInput(repository, "read"));
|
|
197
|
+
const repositoryPath = sandbox.cwd;
|
|
198
|
+
try {
|
|
199
|
+
await trustedCommand(sandbox, {
|
|
200
|
+
cmd: "/usr/bin/git",
|
|
201
|
+
args: [
|
|
202
|
+
"clone",
|
|
203
|
+
"--bare",
|
|
204
|
+
"--no-local",
|
|
205
|
+
repositoryPath,
|
|
206
|
+
"/tmp/transfer.git"
|
|
207
|
+
]
|
|
208
|
+
});
|
|
209
|
+
if (input.refs.length > 0) await trustedCommand(sandbox, {
|
|
210
|
+
cmd: "git",
|
|
211
|
+
args: [
|
|
212
|
+
"-C",
|
|
213
|
+
"/tmp/transfer.git",
|
|
214
|
+
"fetch",
|
|
215
|
+
"--no-tags",
|
|
216
|
+
`https://github.com/${repository}.git`,
|
|
217
|
+
...input.refs.map((ref) => `+${ref}:${ref}`)
|
|
218
|
+
]
|
|
219
|
+
});
|
|
220
|
+
await trustedCommand(sandbox, {
|
|
221
|
+
cmd: "/usr/bin/git",
|
|
222
|
+
args: [
|
|
223
|
+
"-C",
|
|
224
|
+
"/tmp/transfer.git",
|
|
225
|
+
"bundle",
|
|
226
|
+
"create",
|
|
227
|
+
"/tmp/transfer.bundle",
|
|
228
|
+
"--all"
|
|
229
|
+
]
|
|
230
|
+
});
|
|
231
|
+
await consumeSandboxBundle(sandbox, "/tmp/transfer.bundle", use);
|
|
232
|
+
} finally {
|
|
233
|
+
await sandbox.stop();
|
|
234
|
+
}
|
|
235
|
+
},
|
|
236
|
+
async push(input) {
|
|
237
|
+
try {
|
|
238
|
+
const baseHead = publicationBase(input);
|
|
239
|
+
if (input.expectedHead === absentGitOid) throw new Error("Vercel-managed signed publication requires an existing remote branch");
|
|
240
|
+
const repository = repositorySlugSchema.parse(input.repository.toLowerCase());
|
|
241
|
+
const sandbox = await createSandbox(createInput(repository, "write"));
|
|
242
|
+
const repositoryPath = sandbox.cwd;
|
|
243
|
+
try {
|
|
244
|
+
const hooksPath = `/tmp/factory-hooks-${randomUUID()}`;
|
|
245
|
+
await trustedCommand(sandbox, {
|
|
246
|
+
cmd: "mkdir",
|
|
247
|
+
args: [
|
|
248
|
+
"-m",
|
|
249
|
+
"700",
|
|
250
|
+
hooksPath
|
|
251
|
+
]
|
|
252
|
+
});
|
|
253
|
+
await trustedCommand(sandbox, {
|
|
254
|
+
cmd: "/usr/bin/git",
|
|
255
|
+
args: [
|
|
256
|
+
"config",
|
|
257
|
+
"core.hooksPath",
|
|
258
|
+
hooksPath
|
|
259
|
+
],
|
|
260
|
+
cwd: repositoryPath
|
|
261
|
+
});
|
|
262
|
+
await withSandboxGitBundle({
|
|
263
|
+
sandbox: bundleTransferSandbox(sandbox),
|
|
264
|
+
bundle: input.bundle,
|
|
265
|
+
async use(path) {
|
|
266
|
+
await trustedCommand(sandbox, {
|
|
267
|
+
cmd: "/usr/bin/git",
|
|
268
|
+
args: [
|
|
269
|
+
"bundle",
|
|
270
|
+
"verify",
|
|
271
|
+
path
|
|
272
|
+
],
|
|
273
|
+
cwd: repositoryPath
|
|
274
|
+
});
|
|
275
|
+
await trustedCommand(sandbox, {
|
|
276
|
+
cmd: "/usr/bin/git",
|
|
277
|
+
args: [
|
|
278
|
+
"fetch",
|
|
279
|
+
"--no-tags",
|
|
280
|
+
path,
|
|
281
|
+
`${input.head}:refs/factory/candidate`
|
|
282
|
+
],
|
|
283
|
+
cwd: repositoryPath
|
|
284
|
+
});
|
|
285
|
+
if (await trustedCommand(sandbox, {
|
|
286
|
+
cmd: "/usr/bin/git",
|
|
287
|
+
args: ["rev-parse", "refs/factory/candidate"],
|
|
288
|
+
cwd: repositoryPath
|
|
289
|
+
}) !== input.head) throw new Error("Git bundle head does not match publication target");
|
|
290
|
+
await trustedCommand(sandbox, {
|
|
291
|
+
cmd: "/usr/bin/git",
|
|
292
|
+
args: [
|
|
293
|
+
"merge-base",
|
|
294
|
+
"--is-ancestor",
|
|
295
|
+
baseHead,
|
|
296
|
+
"refs/factory/candidate"
|
|
297
|
+
],
|
|
298
|
+
cwd: repositoryPath
|
|
299
|
+
});
|
|
300
|
+
await trustedCommand(sandbox, {
|
|
301
|
+
cmd: "/usr/bin/git",
|
|
302
|
+
args: [
|
|
303
|
+
"checkout",
|
|
304
|
+
"-B",
|
|
305
|
+
input.branch,
|
|
306
|
+
"refs/factory/candidate"
|
|
307
|
+
],
|
|
308
|
+
cwd: repositoryPath
|
|
309
|
+
});
|
|
310
|
+
await input.authorize();
|
|
311
|
+
await trustedCommand(sandbox, {
|
|
312
|
+
cmd: "/usr/bin/env",
|
|
313
|
+
args: [
|
|
314
|
+
`VERCEL_GIT_EXPECTED_REMOTE_OID=${input.expectedHead}`,
|
|
315
|
+
...input.baseHead === void 0 ? [] : [`VERCEL_GIT_BASE_OID=${input.baseHead}`],
|
|
316
|
+
"git",
|
|
317
|
+
"push",
|
|
318
|
+
"origin",
|
|
319
|
+
input.branch
|
|
320
|
+
],
|
|
321
|
+
cwd: repositoryPath
|
|
322
|
+
});
|
|
323
|
+
}
|
|
324
|
+
});
|
|
325
|
+
const signedHead = await trustedCommand(sandbox, {
|
|
326
|
+
cmd: "/usr/bin/git",
|
|
327
|
+
args: ["rev-parse", "HEAD"],
|
|
328
|
+
cwd: repositoryPath
|
|
329
|
+
});
|
|
330
|
+
if (!gitOidPattern.test(signedHead)) throw new Error("Managed signed push returned an invalid Git head");
|
|
331
|
+
return signedHead;
|
|
332
|
+
} finally {
|
|
333
|
+
await sandbox.stop();
|
|
334
|
+
}
|
|
335
|
+
} finally {
|
|
336
|
+
if (!input.bundle.stream.locked) await input.bundle.stream.cancel();
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
};
|
|
340
|
+
}
|
|
341
|
+
//#endregion
|
|
342
|
+
export { createVercelGitHubGitTransport, createVercelManagedGitHubGitTransport };
|
|
343
|
+
|
|
344
|
+
//# sourceMappingURL=vercel-git.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vercel-git.mjs","names":[],"sources":["../src/vercel-git.ts"],"sourcesContent":["import { randomUUID } from \"node:crypto\";\nimport { Readable } from \"node:stream\";\nimport type { Sandbox, NetworkPolicy } from \"@vercel/sandbox\";\nimport { repositorySlugSchema, type RepositorySlug } from \"./schema/repository\";\nimport { isSafeGitRef } from \"./github-publication\";\nimport {\n maxGitBundleBytes,\n withSandboxGitBundle,\n type GitHubGitTransport,\n type GitHubRepositoryBundle,\n} from \"./github-transfer\";\n\ntype TrustedGitSandbox = Pick<\n Sandbox,\n \"cwd\" | \"runCommand\" | \"writeFiles\" | \"readFile\" | \"updateNetworkPolicy\" | \"stop\"\n>;\n\n/** Exact creation request for a fresh Vercel-managed trusted Git publication Sandbox. */\nexport interface VercelManagedGitHubSandboxCreateInput {\n source: {\n type: \"git\";\n url: string;\n };\n __source_credentials: true;\n __commitAs: {\n name: string;\n email: string;\n };\n networkPolicy: NetworkPolicy;\n persistent: false;\n resources: { vcpus: 6 };\n runtime: \"node24\";\n timeout: number;\n}\n\nconst gitOidPattern = /^[a-f0-9]{40}$/u;\nconst absentGitOid = \"0\".repeat(40);\nconst managedGitTimeoutMs = 180_000;\n\n/** Repository and access level used to mint one trusted Git transport token. */\nexport interface VercelGitHubTokenInput {\n repository: RepositorySlug;\n access: \"read\" | \"write\";\n}\n\n/** Configures fresh trusted sandboxes and repository-scoped Git tokens. */\nexport interface VercelGitHubGitTransportOptions {\n /** Reads must mint contents:read credentials; writes are confined to the supplied repository. */\n token(input: VercelGitHubTokenInput): Promise<string>;\n /** Creates a fresh sandbox, without a snapshot, repository, or running agent. */\n createSandbox?: () => Promise<TrustedGitSandbox>;\n}\n\n/** Configures Vercel-managed Git reads and signed publication. */\nexport interface VercelManagedGitHubGitTransportOptions {\n /** Attribution metadata supplied for managed signed commits. */\n commitIdentity: { name: string; email: string };\n /** Creates one unnamed Sandbox from the exact managed credential request. */\n createSandbox?: (input: VercelManagedGitHubSandboxCreateInput) => Promise<TrustedGitSandbox>;\n}\n\nasync function createManagedSandbox(\n input: VercelManagedGitHubSandboxCreateInput,\n): Promise<TrustedGitSandbox> {\n const { Sandbox } = await import(\"@vercel/sandbox\");\n return Sandbox.create({ ...input });\n}\n\nfunction publicationBase(input: {\n branch: string;\n head: string;\n expectedHead: string;\n baseHead?: string;\n}): string {\n if (\n !isSafeGitRef(input.branch) ||\n !gitOidPattern.test(input.head) ||\n !gitOidPattern.test(input.expectedHead) ||\n (input.expectedHead === absentGitOid\n ? input.baseHead === undefined || !gitOidPattern.test(input.baseHead)\n : input.baseHead !== undefined)\n ) {\n throw new Error(\"Invalid Git publication target\");\n }\n return input.expectedHead === absentGitOid ? input.baseHead! : input.expectedHead;\n}\n\nasync function trustedCommand(\n sandbox: TrustedGitSandbox,\n input: { cmd: string; args: string[]; cwd?: string },\n): Promise<string> {\n const result = await sandbox.runCommand({ ...input, timeoutMs: 120_000 });\n if (result.exitCode !== 0) throw new Error(`Trusted Git operation failed (${result.exitCode})`);\n return (await result.stdout()).trim();\n}\n\nfunction bundleTransferSandbox(sandbox: TrustedGitSandbox) {\n return {\n async run({ command }: { command: string }) {\n const result = await sandbox.runCommand({ cmd: \"sh\", args: [\"-c\", command] });\n return { exitCode: result.exitCode, stdout: await result.stdout() };\n },\n async writeBinaryFile({ path, content }: { path: string; content: Uint8Array }) {\n await sandbox.writeFiles([\n {\n path,\n content: Buffer.from(content.buffer, content.byteOffset, content.byteLength),\n },\n ]);\n },\n };\n}\n\nasync function consumeSandboxBundle(\n sandbox: TrustedGitSandbox,\n path: string,\n use: (bundle: GitHubRepositoryBundle) => Promise<void>,\n): Promise<void> {\n const size = await sandbox.runCommand({ cmd: \"stat\", args: [\"-c\", \"%s\", path] });\n const byteLength = Number(await size.stdout());\n if (\n size.exitCode !== 0 ||\n !Number.isSafeInteger(byteLength) ||\n byteLength < 1 ||\n byteLength > maxGitBundleBytes\n ) {\n throw new Error(\"Git bundle exceeds transfer limit\");\n }\n const source = await sandbox.readFile({ path });\n if (!source) throw new Error(\"Git bundle was not created\");\n const readable =\n source instanceof Readable ? source : new Readable({ highWaterMark: 64 * 1024 }).wrap(source);\n const iterator = readable[Symbol.asyncIterator]();\n const stream = new ReadableStream<Uint8Array>(\n {\n async pull(controller) {\n const { done, value } = await iterator.next();\n if (done) controller.close();\n else controller.enqueue(value);\n },\n async cancel() {\n await iterator.return?.();\n },\n },\n { highWaterMark: 0 },\n );\n try {\n await use({ stream });\n } finally {\n readable.destroy();\n if (!stream.locked) await stream.cancel();\n }\n}\n\nfunction credentialPolicy(repository: RepositorySlug, token: string): NetworkPolicy {\n return {\n allow: {\n \"github.com\": [\n {\n match: { path: { startsWith: `/${repository}.git/` } },\n transform: [\n {\n headers: {\n authorization: `Basic ${Buffer.from(`x-access-token:${token}`).toString(\"base64\")}`,\n },\n },\n ],\n },\n ],\n },\n };\n}\n\n/** Transfer Git objects through fresh trusted sandboxes; credentials never reach an agent sandbox. */\nexport function createVercelGitHubGitTransport(\n options: VercelGitHubGitTransportOptions,\n): GitHubGitTransport {\n async function isolated<T>(\n repository: RepositorySlug,\n use: (\n sandbox: Awaited<ReturnType<NonNullable<VercelGitHubGitTransportOptions[\"createSandbox\"]>>>,\n git: (...args: string[]) => Promise<string>,\n repository: RepositorySlug,\n ) => Promise<T>,\n ): Promise<T> {\n const slug = repositorySlugSchema.parse(repository.toLowerCase());\n const sandbox = options.createSandbox\n ? await options.createSandbox()\n : await (\n await import(\"@vercel/sandbox\")\n ).Sandbox.create({ runtime: \"node24\", timeout: 180_000, networkPolicy: \"deny-all\" });\n async function git(...args: string[]): Promise<string> {\n const result = await sandbox.runCommand({\n cmd: \"/usr/bin/env\",\n args: [\n \"-i\",\n \"PATH=/usr/bin:/bin\",\n \"HOME=/tmp\",\n \"GIT_CONFIG_NOSYSTEM=1\",\n \"GIT_CONFIG_GLOBAL=/dev/null\",\n \"GIT_TERMINAL_PROMPT=0\",\n \"git\",\n \"-c\",\n \"core.hooksPath=/dev/null\",\n \"-c\",\n \"credential.helper=\",\n \"-c\",\n \"protocol.ext.allow=never\",\n \"-c\",\n \"protocol.file.allow=always\",\n \"-c\",\n \"http.followRedirects=false\",\n ...args,\n ],\n timeoutMs: 120_000,\n });\n if (result.exitCode !== 0)\n throw new Error(`Trusted Git operation failed (${result.exitCode})`);\n return (await result.stdout()).trim();\n }\n try {\n await sandbox.updateNetworkPolicy(\"deny-all\");\n return await use(sandbox, git, slug);\n } finally {\n try {\n await sandbox.updateNetworkPolicy(\"deny-all\");\n } finally {\n await sandbox.stop();\n }\n }\n }\n return {\n async fetch(input, use) {\n if (input.refs.some((ref) => !ref.startsWith(\"refs/\") || !isSafeGitRef(ref)))\n throw new Error(\"Invalid Git fetch ref\");\n return isolated(input.repository, async (sandbox, git, slug) => {\n await sandbox.updateNetworkPolicy(\n credentialPolicy(slug, await options.token({ repository: slug, access: \"read\" })),\n );\n await git(\n \"clone\",\n \"--bare\",\n \"--no-hardlinks\",\n `https://github.com/${slug}.git`,\n \"/tmp/transfer.git\",\n );\n if (input.refs.length)\n await git(\n \"-C\",\n \"/tmp/transfer.git\",\n \"fetch\",\n \"--no-tags\",\n \"origin\",\n ...input.refs.map((ref) => `+${ref}:${ref}`),\n );\n await sandbox.updateNetworkPolicy(\"deny-all\");\n await git(\"-C\", \"/tmp/transfer.git\", \"bundle\", \"create\", \"/tmp/transfer.bundle\", \"--all\");\n await consumeSandboxBundle(sandbox, \"/tmp/transfer.bundle\", use);\n });\n },\n async push(input) {\n try {\n const baseHead = publicationBase(input);\n return await isolated(input.repository, async (sandbox, git, slug) => {\n await git(\"init\", \"--bare\", \"/tmp/transfer.git\");\n return await withSandboxGitBundle({\n sandbox: bundleTransferSandbox(sandbox),\n bundle: input.bundle,\n async use(path) {\n await git(\"-C\", \"/tmp/transfer.git\", \"bundle\", \"verify\", path);\n await git(\"-C\", \"/tmp/transfer.git\", \"fetch\", path, \"HEAD:refs/heads/candidate\");\n if (\n (await git(\"-C\", \"/tmp/transfer.git\", \"rev-parse\", \"refs/heads/candidate\")) !==\n input.head\n )\n throw new Error(\"Git bundle head does not match publication target\");\n await git(\n \"-C\",\n \"/tmp/transfer.git\",\n \"merge-base\",\n \"--is-ancestor\",\n baseHead,\n \"refs/heads/candidate\",\n );\n await sandbox.updateNetworkPolicy(\n credentialPolicy(slug, await options.token({ repository: slug, access: \"write\" })),\n );\n await input.authorize();\n await git(\n \"-C\",\n \"/tmp/transfer.git\",\n \"push\",\n `--force-with-lease=refs/heads/${input.branch}:${input.expectedHead}`,\n `https://github.com/${slug}.git`,\n `${input.head}:refs/heads/${input.branch}`,\n );\n return input.head;\n },\n });\n });\n } finally {\n if (!input.bundle.stream.locked) await input.bundle.stream.cancel();\n }\n },\n };\n}\n\n/** Use fresh Vercel-managed trusted Sandboxes for Git reads and signed publication. */\nexport function createVercelManagedGitHubGitTransport(\n options: VercelManagedGitHubGitTransportOptions,\n): GitHubGitTransport {\n const createSandbox = options.createSandbox ?? createManagedSandbox;\n const createInput = (\n repository: RepositorySlug,\n access: \"read\" | \"write\",\n ): VercelManagedGitHubSandboxCreateInput => ({\n source: {\n type: \"git\",\n url: `https://github.com/${repository}.git`,\n },\n __source_credentials: true,\n __commitAs: options.commitIdentity,\n networkPolicy: { allow: access === \"read\" ? [\"github.com\"] : [\"github.com\", \"api.github.com\"] },\n persistent: false,\n resources: { vcpus: 6 },\n runtime: \"node24\",\n timeout: managedGitTimeoutMs,\n });\n return {\n async fetch(input, use) {\n if (input.refs.some((ref) => !ref.startsWith(\"refs/\") || !isSafeGitRef(ref))) {\n throw new Error(\"Invalid Git fetch ref\");\n }\n const repository = repositorySlugSchema.parse(input.repository.toLowerCase());\n const sandbox = await createSandbox(createInput(repository, \"read\"));\n const repositoryPath = sandbox.cwd;\n try {\n await trustedCommand(sandbox, {\n cmd: \"/usr/bin/git\",\n args: [\"clone\", \"--bare\", \"--no-local\", repositoryPath, \"/tmp/transfer.git\"],\n });\n if (input.refs.length > 0) {\n await trustedCommand(sandbox, {\n cmd: \"git\",\n args: [\n \"-C\",\n \"/tmp/transfer.git\",\n \"fetch\",\n \"--no-tags\",\n `https://github.com/${repository}.git`,\n ...input.refs.map((ref) => `+${ref}:${ref}`),\n ],\n });\n }\n await trustedCommand(sandbox, {\n cmd: \"/usr/bin/git\",\n args: [\"-C\", \"/tmp/transfer.git\", \"bundle\", \"create\", \"/tmp/transfer.bundle\", \"--all\"],\n });\n await consumeSandboxBundle(sandbox, \"/tmp/transfer.bundle\", use);\n } finally {\n await sandbox.stop();\n }\n },\n async push(input) {\n try {\n const baseHead = publicationBase(input);\n if (input.expectedHead === absentGitOid) {\n throw new Error(\"Vercel-managed signed publication requires an existing remote branch\");\n }\n const repository = repositorySlugSchema.parse(input.repository.toLowerCase());\n const sandbox = await createSandbox(createInput(repository, \"write\"));\n const repositoryPath = sandbox.cwd;\n try {\n const hooksPath = `/tmp/factory-hooks-${randomUUID()}`;\n await trustedCommand(sandbox, { cmd: \"mkdir\", args: [\"-m\", \"700\", hooksPath] });\n await trustedCommand(sandbox, {\n cmd: \"/usr/bin/git\",\n args: [\"config\", \"core.hooksPath\", hooksPath],\n cwd: repositoryPath,\n });\n await withSandboxGitBundle({\n sandbox: bundleTransferSandbox(sandbox),\n bundle: input.bundle,\n async use(path) {\n await trustedCommand(sandbox, {\n cmd: \"/usr/bin/git\",\n args: [\"bundle\", \"verify\", path],\n cwd: repositoryPath,\n });\n await trustedCommand(sandbox, {\n cmd: \"/usr/bin/git\",\n args: [\"fetch\", \"--no-tags\", path, `${input.head}:refs/factory/candidate`],\n cwd: repositoryPath,\n });\n if (\n (await trustedCommand(sandbox, {\n cmd: \"/usr/bin/git\",\n args: [\"rev-parse\", \"refs/factory/candidate\"],\n cwd: repositoryPath,\n })) !== input.head\n ) {\n throw new Error(\"Git bundle head does not match publication target\");\n }\n await trustedCommand(sandbox, {\n cmd: \"/usr/bin/git\",\n args: [\"merge-base\", \"--is-ancestor\", baseHead, \"refs/factory/candidate\"],\n cwd: repositoryPath,\n });\n await trustedCommand(sandbox, {\n cmd: \"/usr/bin/git\",\n args: [\"checkout\", \"-B\", input.branch, \"refs/factory/candidate\"],\n cwd: repositoryPath,\n });\n await input.authorize();\n await trustedCommand(sandbox, {\n cmd: \"/usr/bin/env\",\n args: [\n `VERCEL_GIT_EXPECTED_REMOTE_OID=${input.expectedHead}`,\n ...(input.baseHead === undefined\n ? []\n : [`VERCEL_GIT_BASE_OID=${input.baseHead}`]),\n \"git\",\n \"push\",\n \"origin\",\n input.branch,\n ],\n cwd: repositoryPath,\n });\n },\n });\n const signedHead = await trustedCommand(sandbox, {\n cmd: \"/usr/bin/git\",\n args: [\"rev-parse\", \"HEAD\"],\n cwd: repositoryPath,\n });\n if (!gitOidPattern.test(signedHead)) {\n throw new Error(\"Managed signed push returned an invalid Git head\");\n }\n return signedHead;\n } finally {\n await sandbox.stop();\n }\n } finally {\n if (!input.bundle.stream.locked) await input.bundle.stream.cancel();\n }\n },\n };\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import { RepositorySlug } from "./schema/repository.mjs";
|
|
2
|
+
import { GitHubTreeEntry } from "./github-publication.mjs";
|
|
3
|
+
import { NetworkPolicy, Sandbox } from "@vercel/sandbox";
|
|
4
|
+
//#region src/vercel-github-api.d.ts
|
|
5
|
+
type TrustedGitHubApiSandbox = Pick<Sandbox, "runCommand" | "stop">;
|
|
6
|
+
/** GitHub API actions supported by Vercel-managed Sandbox credentials. */
|
|
7
|
+
type VercelManagedGitHubApiAction = "github:issues:read" | "github:pull-request:create";
|
|
8
|
+
/** Exact creation request for one Vercel-managed GitHub API operation. */
|
|
9
|
+
interface VercelManagedGitHubApiSandboxCreateInput {
|
|
10
|
+
source?: {
|
|
11
|
+
type: "git";
|
|
12
|
+
url: string;
|
|
13
|
+
};
|
|
14
|
+
__source_credentials?: true;
|
|
15
|
+
__commitAs?: {
|
|
16
|
+
name: string;
|
|
17
|
+
email: string;
|
|
18
|
+
};
|
|
19
|
+
__credentials: {
|
|
20
|
+
github: [{
|
|
21
|
+
repositories: [RepositorySlug];
|
|
22
|
+
actions: [VercelManagedGitHubApiAction];
|
|
23
|
+
}];
|
|
24
|
+
};
|
|
25
|
+
networkPolicy: NetworkPolicy;
|
|
26
|
+
persistent: false;
|
|
27
|
+
resources: {
|
|
28
|
+
vcpus: 6;
|
|
29
|
+
};
|
|
30
|
+
runtime: "node24";
|
|
31
|
+
timeout: 60_000 | 180_000;
|
|
32
|
+
}
|
|
33
|
+
/** Configures fresh trusted Sandboxes for brokered GitHub API requests. */
|
|
34
|
+
interface VercelManagedGitHubApiOptions {
|
|
35
|
+
/** Attribution metadata supplied when managed publication creates a signed commit. */
|
|
36
|
+
commitIdentity?: {
|
|
37
|
+
name: string;
|
|
38
|
+
email: string;
|
|
39
|
+
};
|
|
40
|
+
createSandbox?: (input: VercelManagedGitHubApiSandboxCreateInput) => Promise<TrustedGitHubApiSandbox>;
|
|
41
|
+
}
|
|
42
|
+
/** Authorized request to read one exact GitHub issue. */
|
|
43
|
+
interface VercelManagedGitHubIssueInput {
|
|
44
|
+
repository: RepositorySlug;
|
|
45
|
+
issueNumber: number;
|
|
46
|
+
authorize(): Promise<void>;
|
|
47
|
+
}
|
|
48
|
+
/** Issue fields returned by a Vercel-managed GitHub API request. */
|
|
49
|
+
interface VercelManagedGitHubIssue {
|
|
50
|
+
title: string;
|
|
51
|
+
body: string | null;
|
|
52
|
+
url: string;
|
|
53
|
+
pullRequest: boolean;
|
|
54
|
+
}
|
|
55
|
+
/** Authorized request to create one draft or ready GitHub pull request. */
|
|
56
|
+
interface VercelManagedGitHubPullRequestInput {
|
|
57
|
+
repository: RepositorySlug;
|
|
58
|
+
title: string;
|
|
59
|
+
body: string;
|
|
60
|
+
head: string;
|
|
61
|
+
base: string;
|
|
62
|
+
draft: boolean;
|
|
63
|
+
authorize(): Promise<void>;
|
|
64
|
+
}
|
|
65
|
+
/** Pull-request identity returned by a Vercel-managed GitHub API request. */
|
|
66
|
+
interface VercelManagedGitHubPullRequest {
|
|
67
|
+
pullRequestNumber: number;
|
|
68
|
+
pullRequestUrl: string;
|
|
69
|
+
draft: boolean;
|
|
70
|
+
}
|
|
71
|
+
/** Git Data and pull-request inputs for one idempotent managed publication. */
|
|
72
|
+
interface VercelManagedGitHubPublicationInput {
|
|
73
|
+
repository: RepositorySlug;
|
|
74
|
+
baseCommit: string;
|
|
75
|
+
tree: readonly GitHubTreeEntry[];
|
|
76
|
+
commitMessage: string;
|
|
77
|
+
branch: string;
|
|
78
|
+
title: string;
|
|
79
|
+
body: string;
|
|
80
|
+
baseBranch: string;
|
|
81
|
+
draft: boolean;
|
|
82
|
+
authorize(): Promise<void>;
|
|
83
|
+
}
|
|
84
|
+
/** Commit and pull-request identities returned after managed publication. */
|
|
85
|
+
interface VercelManagedGitHubPublication extends VercelManagedGitHubPullRequest {
|
|
86
|
+
commitSha: string;
|
|
87
|
+
}
|
|
88
|
+
/** Repository-scoped brokered GitHub API operations supplied by Vercel Sandbox. */
|
|
89
|
+
interface VercelManagedGitHubApi {
|
|
90
|
+
readIssue(input: VercelManagedGitHubIssueInput): Promise<VercelManagedGitHubIssue>;
|
|
91
|
+
createPullRequest(input: VercelManagedGitHubPullRequestInput): Promise<VercelManagedGitHubPullRequest>;
|
|
92
|
+
publishPullRequest(input: VercelManagedGitHubPublicationInput): Promise<VercelManagedGitHubPublication>;
|
|
93
|
+
}
|
|
94
|
+
/** GitHub API failure returned through the managed credential Sandbox. */
|
|
95
|
+
declare class VercelManagedGitHubApiError extends Error {
|
|
96
|
+
readonly status: number;
|
|
97
|
+
constructor(status: number, message: string);
|
|
98
|
+
}
|
|
99
|
+
/** Create repository-scoped GitHub API operations backed by managed Sandbox credentials. */
|
|
100
|
+
declare function createVercelManagedGitHubApi(options?: VercelManagedGitHubApiOptions): VercelManagedGitHubApi;
|
|
101
|
+
//#endregion
|
|
102
|
+
export { VercelManagedGitHubApi, VercelManagedGitHubApiAction, VercelManagedGitHubApiError, VercelManagedGitHubApiOptions, VercelManagedGitHubApiSandboxCreateInput, VercelManagedGitHubIssue, VercelManagedGitHubIssueInput, VercelManagedGitHubPublication, VercelManagedGitHubPublicationInput, VercelManagedGitHubPullRequest, VercelManagedGitHubPullRequestInput, createVercelManagedGitHubApi };
|
|
103
|
+
//# sourceMappingURL=vercel-github-api.d.mts.map
|