@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,228 @@
|
|
|
1
|
+
import { codingExecutionRequestSchema, executionResultSchema } from "../schema/execution.mjs";
|
|
2
|
+
import { ExecutionLaunchPendingError } from "../dispatch.mjs";
|
|
3
|
+
import { ExecutionTimeoutError, withExecutionAbort } from "./execution-abort.mjs";
|
|
4
|
+
import { createExecutionRunLedger } from "./execution-run-ledger.mjs";
|
|
5
|
+
//#region src/sandbox/execution.ts
|
|
6
|
+
const defaultSandboxTimeoutMarginMs = 3e5;
|
|
7
|
+
const bounded = (reason) => reason.slice(0, 2e3);
|
|
8
|
+
/** Create a durable execution adapter that runs configured harnesses in Task-scoped sandboxes. */
|
|
9
|
+
function createSandboxExecutionAdapter(options) {
|
|
10
|
+
const now = options.now ?? Date.now;
|
|
11
|
+
const ledger = createExecutionRunLedger({
|
|
12
|
+
state: options.state,
|
|
13
|
+
now,
|
|
14
|
+
...options.calculateCostUsd ? { calculateCostUsd: options.calculateCostUsd } : {}
|
|
15
|
+
});
|
|
16
|
+
function configuredHarness(harness) {
|
|
17
|
+
const configured = options.harnesses[harness];
|
|
18
|
+
if (!configured || !configured.model.trim()) throw new Error(`Execution harness ${harness} has no configured runner and model`);
|
|
19
|
+
return configured;
|
|
20
|
+
}
|
|
21
|
+
const keyOf = (record) => ({
|
|
22
|
+
taskId: record.request.taskId,
|
|
23
|
+
attempt: record.request.attempt
|
|
24
|
+
});
|
|
25
|
+
const sandboxTimeout = (request) => request.environment.timeoutMs + (options.sandboxTimeoutMarginMs ?? defaultSandboxTimeoutMarginMs);
|
|
26
|
+
async function extract(sandbox, record) {
|
|
27
|
+
const request = record.request;
|
|
28
|
+
const failed = (reason) => ({
|
|
29
|
+
status: "failed",
|
|
30
|
+
artifacts: [],
|
|
31
|
+
reason: bounded(reason)
|
|
32
|
+
});
|
|
33
|
+
const usage = ledger.usage(record);
|
|
34
|
+
const { maxCostUsd, maxTokens } = request.limits;
|
|
35
|
+
if (maxCostUsd !== void 0 && usage.costUsd !== void 0 && usage.costUsd > maxCostUsd) return failed(`Execution spent $${usage.costUsd}, exceeding its maxCostUsd of $${maxCostUsd}`);
|
|
36
|
+
if (maxTokens !== void 0 && (usage.inputTokens ?? 0) + (usage.outputTokens ?? 0) > maxTokens) return failed(`Execution used ${(usage.inputTokens ?? 0) + (usage.outputTokens ?? 0)} tokens, exceeding its maxTokens of ${maxTokens}`);
|
|
37
|
+
return options.extractOutcome({
|
|
38
|
+
sandbox,
|
|
39
|
+
request
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
/** Best-effort idempotent environment shutdown; ambiguity propagates for retry. */
|
|
43
|
+
async function stopEnvironment(record) {
|
|
44
|
+
const sandbox = await options.environment.find(keyOf(record));
|
|
45
|
+
if (sandbox) await options.environment.stop(sandbox.sandbox);
|
|
46
|
+
}
|
|
47
|
+
return {
|
|
48
|
+
async start({ request, launchKey, context }) {
|
|
49
|
+
const parsed = codingExecutionRequestSchema.parse(request);
|
|
50
|
+
const configured = configuredHarness(parsed.harness);
|
|
51
|
+
const keyParts = {
|
|
52
|
+
taskId: parsed.taskId,
|
|
53
|
+
attempt: parsed.attempt
|
|
54
|
+
};
|
|
55
|
+
const stored = await ledger.admit({
|
|
56
|
+
request: parsed,
|
|
57
|
+
key: launchKey,
|
|
58
|
+
model: configured.model,
|
|
59
|
+
environmentId: options.environment.name(keyParts),
|
|
60
|
+
reportSchema: context?.reportSchema
|
|
61
|
+
});
|
|
62
|
+
if (stored.record.launched || stored.record.result) return stored.record.execution;
|
|
63
|
+
try {
|
|
64
|
+
await options.environment.ensure(keyParts, {
|
|
65
|
+
timeoutMs: sandboxTimeout(parsed),
|
|
66
|
+
request: parsed
|
|
67
|
+
});
|
|
68
|
+
} catch (cause) {
|
|
69
|
+
throw new ExecutionLaunchPendingError("Execution environment provisioning is unresolved; recover with the original key", { cause });
|
|
70
|
+
}
|
|
71
|
+
return stored.record.execution;
|
|
72
|
+
},
|
|
73
|
+
async inspect(execution) {
|
|
74
|
+
const stored = await ledger.read(execution);
|
|
75
|
+
if (!stored) return { status: "expired" };
|
|
76
|
+
if (stored.record.result) return {
|
|
77
|
+
status: "finished",
|
|
78
|
+
result: stored.record.result
|
|
79
|
+
};
|
|
80
|
+
const sandbox = await options.environment.find(keyOf(stored.record));
|
|
81
|
+
if (!sandbox || sandbox.liveness === "terminal") return { status: "expired" };
|
|
82
|
+
if (sandbox.liveness !== "live") throw new Error("Execution environment is transitioning; inspect again shortly");
|
|
83
|
+
return { status: "active" };
|
|
84
|
+
},
|
|
85
|
+
async stop(execution) {
|
|
86
|
+
const stored = await ledger.read(execution);
|
|
87
|
+
if (!stored) return executionResultSchema.parse({
|
|
88
|
+
status: "cancelled",
|
|
89
|
+
execution,
|
|
90
|
+
artifacts: [],
|
|
91
|
+
usage: { computeMs: 0 },
|
|
92
|
+
reason: "No admitted execution matches this reference; its cost is unknown"
|
|
93
|
+
});
|
|
94
|
+
const { record } = stored;
|
|
95
|
+
if (record.result) {
|
|
96
|
+
await stopEnvironment(record);
|
|
97
|
+
return record.result;
|
|
98
|
+
}
|
|
99
|
+
await stopEnvironment(record);
|
|
100
|
+
return ledger.finalize(stored, {
|
|
101
|
+
status: "cancelled",
|
|
102
|
+
artifacts: [],
|
|
103
|
+
reason: record.launched ? record.turns.length > 0 ? "Execution was stopped after its completed turn was recorded" : "Execution was stopped after launch; unfinished turn cost is unknown" : "Execution was stopped before its prompt was sent"
|
|
104
|
+
});
|
|
105
|
+
},
|
|
106
|
+
async drive(execution) {
|
|
107
|
+
const admitted = await ledger.read(execution);
|
|
108
|
+
if (!admitted) throw new Error("No admitted execution matches this reference");
|
|
109
|
+
let stored = admitted;
|
|
110
|
+
if (stored.record.result) return stored.record.result;
|
|
111
|
+
const request = stored.record.request;
|
|
112
|
+
const configured = configuredHarness(request.harness);
|
|
113
|
+
if (configured.model !== stored.record.model) throw new Error("Execution model changed; restore its admitted harness configuration");
|
|
114
|
+
let sandbox;
|
|
115
|
+
if (!stored.record.launched) {
|
|
116
|
+
const observed = await options.environment.ensure(keyOf(stored.record), {
|
|
117
|
+
timeoutMs: sandboxTimeout(request),
|
|
118
|
+
request
|
|
119
|
+
});
|
|
120
|
+
if (observed.liveness !== "live") throw new Error("Execution environment is not live");
|
|
121
|
+
sandbox = observed.sandbox;
|
|
122
|
+
} else {
|
|
123
|
+
const found = await options.environment.find(keyOf(stored.record));
|
|
124
|
+
if (!found || found.liveness === "terminal") return ledger.finalize(stored, {
|
|
125
|
+
status: "failed",
|
|
126
|
+
artifacts: [],
|
|
127
|
+
reason: "Execution environment expired before a result was extracted; replacement requires a new attempt"
|
|
128
|
+
});
|
|
129
|
+
if (found.liveness !== "live") throw new Error("Execution environment is transitioning; drive again shortly");
|
|
130
|
+
sandbox = found.sandbox;
|
|
131
|
+
}
|
|
132
|
+
const remainingMs = Math.max(0, request.environment.timeoutMs - (now() - (stored.record.startedAtMs ?? now())));
|
|
133
|
+
try {
|
|
134
|
+
return await withExecutionAbort({
|
|
135
|
+
timeoutMs: remainingMs,
|
|
136
|
+
isStopped: async () => {
|
|
137
|
+
const latest = await ledger.read(execution);
|
|
138
|
+
if (!latest) throw new Error("The admitted execution disappeared");
|
|
139
|
+
return latest.record.result !== void 0;
|
|
140
|
+
},
|
|
141
|
+
run: async (abortSignal) => {
|
|
142
|
+
if (remainingMs === 0) throw new ExecutionTimeoutError();
|
|
143
|
+
let observedFlip = false;
|
|
144
|
+
if (!stored.record.launched) {
|
|
145
|
+
const session = await configured.runner.open({
|
|
146
|
+
sandbox,
|
|
147
|
+
sessionId: stored.record.harnessSessionId,
|
|
148
|
+
abortSignal
|
|
149
|
+
});
|
|
150
|
+
stored = await ledger.markLaunched(stored, await session.detach());
|
|
151
|
+
if (stored.record.result) return stored.record.result;
|
|
152
|
+
observedFlip = true;
|
|
153
|
+
}
|
|
154
|
+
let turn;
|
|
155
|
+
let promptedHere = false;
|
|
156
|
+
if (stored.record.promptedAtMs === void 0 && stored.record.turns.length === 0) {
|
|
157
|
+
const session = await configured.runner.open({
|
|
158
|
+
sandbox,
|
|
159
|
+
sessionId: stored.record.harnessSessionId,
|
|
160
|
+
resumeFrom: stored.record.resumeState,
|
|
161
|
+
abortSignal
|
|
162
|
+
});
|
|
163
|
+
const prompt = options.buildPrompt({
|
|
164
|
+
request,
|
|
165
|
+
reportSchema: stored.record.reportSchema,
|
|
166
|
+
sandbox
|
|
167
|
+
});
|
|
168
|
+
const foreignFlip = !observedFlip;
|
|
169
|
+
try {
|
|
170
|
+
const inflight = await session.beginPrompt(prompt);
|
|
171
|
+
stored = await ledger.markPrompted({
|
|
172
|
+
base: stored,
|
|
173
|
+
resumeState: inflight,
|
|
174
|
+
origin: foreignFlip ? "recovered" : "this-driver"
|
|
175
|
+
});
|
|
176
|
+
promptedHere = true;
|
|
177
|
+
} catch (error) {
|
|
178
|
+
if (!(error instanceof Error && /unfinished turn/iu.test(error.message))) throw error;
|
|
179
|
+
turn = await session.continueTurn();
|
|
180
|
+
stored = await ledger.recordTurn({
|
|
181
|
+
base: stored,
|
|
182
|
+
turn: turn.usage,
|
|
183
|
+
resumeState: await session.detach(),
|
|
184
|
+
origin: "recovered"
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
if (stored.record.result) return stored.record.result;
|
|
188
|
+
}
|
|
189
|
+
if (turn === void 0 && stored.record.turns.length === 0) {
|
|
190
|
+
const session = await configured.runner.open({
|
|
191
|
+
sandbox,
|
|
192
|
+
sessionId: stored.record.harnessSessionId,
|
|
193
|
+
resumeFrom: stored.record.resumeState,
|
|
194
|
+
abortSignal
|
|
195
|
+
});
|
|
196
|
+
turn = await session.continueTurn();
|
|
197
|
+
stored = await ledger.recordTurn({
|
|
198
|
+
base: stored,
|
|
199
|
+
turn: turn.usage,
|
|
200
|
+
resumeState: await session.detach(),
|
|
201
|
+
origin: promptedHere ? "this-driver" : "recovered"
|
|
202
|
+
});
|
|
203
|
+
if (stored.record.result) return stored.record.result;
|
|
204
|
+
}
|
|
205
|
+
const result = await extract(sandbox, stored.record);
|
|
206
|
+
abortSignal.throwIfAborted();
|
|
207
|
+
return ledger.finalize(stored, result);
|
|
208
|
+
}
|
|
209
|
+
});
|
|
210
|
+
} catch (error) {
|
|
211
|
+
const latest = await ledger.read(execution);
|
|
212
|
+
if (latest?.record.result) return latest.record.result;
|
|
213
|
+
if (!(error instanceof ExecutionTimeoutError) || !latest) throw error;
|
|
214
|
+
await stopEnvironment(latest.record);
|
|
215
|
+
return ledger.finalize(latest, {
|
|
216
|
+
status: "failed",
|
|
217
|
+
artifacts: [],
|
|
218
|
+
reason: error.message
|
|
219
|
+
});
|
|
220
|
+
}
|
|
221
|
+
},
|
|
222
|
+
pending: ledger.pending
|
|
223
|
+
};
|
|
224
|
+
}
|
|
225
|
+
//#endregion
|
|
226
|
+
export { createSandboxExecutionAdapter };
|
|
227
|
+
|
|
228
|
+
//# sourceMappingURL=execution.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"execution.mjs","names":[],"sources":["../../src/sandbox/execution.ts"],"sourcesContent":["import { ExecutionLaunchPendingError } from \"../dispatch\";\nimport {\n codingExecutionRequestSchema,\n executionResultSchema,\n type CodingExecutionRequest,\n type ExecutionLaunchKey,\n type ExecutionResult,\n} from \"../schema/execution\";\nimport { type ExecutionAdapter } from \"../execution\";\nimport type { MillisecondClock } from \"../schema/common\";\nimport type { ExecutionReference } from \"../schema/task\";\nimport type { BlobClient } from \"../blob\";\nimport { ExecutionTimeoutError, withExecutionAbort } from \"./execution-abort\";\nimport type { ExecutionEnvironment } from \"./execution-environment\";\nimport {\n createExecutionRunLedger,\n type RunRecord,\n type ExecutionOutcome,\n} from \"./execution-run-ledger\";\nimport type {\n ConfiguredHarnessRunner,\n HarnessTurn,\n HarnessTurnUsage,\n SandboxHandle,\n} from \"./harness-runner\";\n\nconst defaultSandboxTimeoutMarginMs = 300_000;\n\n/** Context used to construct the immutable prompt for an admitted sandbox execution. */\nexport interface SandboxExecutionPromptContext {\n request: CodingExecutionRequest;\n reportSchema: unknown;\n sandbox: SandboxHandle;\n}\n\n/** Context used to validate and extract artifacts after a sandbox turn completes. */\nexport interface SandboxExecutionOutcomeContext {\n request: CodingExecutionRequest;\n sandbox: SandboxHandle;\n}\n\n/** Configures durable state, harnesses, environments, prompts, evidence, and usage pricing. */\nexport interface SandboxExecutionOptions {\n state: BlobClient;\n harnesses: Partial<Record<CodingExecutionRequest[\"harness\"], ConfiguredHarnessRunner>>;\n environment: ExecutionEnvironment;\n buildPrompt(context: SandboxExecutionPromptContext): string;\n extractOutcome(context: SandboxExecutionOutcomeContext): Promise<ExecutionOutcome>;\n calculateCostUsd?(model: string, turns: readonly HarnessTurnUsage[]): number | undefined;\n sandboxTimeoutMarginMs?: number;\n now?: MillisecondClock;\n}\n\n/** Coding request, stable launch key, and optional report contract for sandbox admission. */\nexport interface StartSandboxExecutionInput {\n request: CodingExecutionRequest;\n launchKey: ExecutionLaunchKey;\n context?: SandboxExecutionStartContext;\n}\n\n/** Optional report contract associated with one sandbox execution launch. */\nexport interface SandboxExecutionStartContext {\n reportSchema: unknown;\n}\n\n/** Execution adapter with explicit serial driving and pending-run discovery for sandbox work. */\nexport interface SandboxExecutionAdapter extends ExecutionAdapter {\n start(input: StartSandboxExecutionInput): Promise<ExecutionReference>;\n /** Serialize calls per execution; ledger CAS does not fence provider effects. */\n drive(execution: ExecutionReference): Promise<ExecutionResult>;\n /** Launch keys with admitted but unfinished runs, for drivers and drills. */\n pending(): Promise<readonly ExecutionReference[]>;\n}\n\nconst bounded = (reason: string) => reason.slice(0, 2000);\n\n/** Create a durable execution adapter that runs configured harnesses in Task-scoped sandboxes. */\nexport function createSandboxExecutionAdapter(\n options: SandboxExecutionOptions,\n): SandboxExecutionAdapter {\n const now = options.now ?? Date.now;\n const ledger = createExecutionRunLedger({\n state: options.state,\n now,\n ...(options.calculateCostUsd ? { calculateCostUsd: options.calculateCostUsd } : {}),\n });\n\n function configuredHarness(harness: CodingExecutionRequest[\"harness\"]) {\n const configured = options.harnesses[harness];\n if (!configured || !configured.model.trim()) {\n throw new Error(`Execution harness ${harness} has no configured runner and model`);\n }\n return configured;\n }\n\n const keyOf = (record: RunRecord) => ({\n taskId: record.request.taskId,\n attempt: record.request.attempt,\n });\n\n const sandboxTimeout = (request: CodingExecutionRequest) =>\n request.environment.timeoutMs +\n (options.sandboxTimeoutMarginMs ?? defaultSandboxTimeoutMarginMs);\n\n async function extract(sandbox: SandboxHandle, record: RunRecord): Promise<ExecutionOutcome> {\n const request = record.request;\n const failed = (reason: string): ExecutionOutcome => ({\n status: \"failed\",\n artifacts: [],\n reason: bounded(reason),\n });\n // Post-turn checks detect overruns; they cannot enforce a hard cap.\n const usage = ledger.usage(record);\n const { maxCostUsd, maxTokens } = request.limits;\n if (maxCostUsd !== undefined && usage.costUsd !== undefined && usage.costUsd > maxCostUsd) {\n return failed(\n `Execution spent $${usage.costUsd}, exceeding its maxCostUsd of $${maxCostUsd}`,\n );\n }\n if (\n maxTokens !== undefined &&\n (usage.inputTokens ?? 0) + (usage.outputTokens ?? 0) > maxTokens\n ) {\n return failed(\n `Execution used ${(usage.inputTokens ?? 0) + (usage.outputTokens ?? 0)} tokens, exceeding its maxTokens of ${maxTokens}`,\n );\n }\n return options.extractOutcome({ sandbox, request });\n }\n\n /** Best-effort idempotent environment shutdown; ambiguity propagates for retry. */\n async function stopEnvironment(record: RunRecord): Promise<void> {\n const sandbox = await options.environment.find(keyOf(record));\n if (sandbox) await options.environment.stop(sandbox.sandbox);\n }\n\n return {\n async start({ request, launchKey, context }) {\n const parsed = codingExecutionRequestSchema.parse(request);\n const configured = configuredHarness(parsed.harness);\n const keyParts = { taskId: parsed.taskId, attempt: parsed.attempt };\n const stored = await ledger.admit({\n request: parsed,\n key: launchKey,\n model: configured.model,\n environmentId: options.environment.name(keyParts),\n reportSchema: context?.reportSchema,\n });\n if (stored.record.launched || stored.record.result) return stored.record.execution;\n try {\n await options.environment.ensure(keyParts, {\n timeoutMs: sandboxTimeout(parsed),\n request: parsed,\n });\n } catch (cause) {\n // Admission already exists; provisioning failure must recover with the same key.\n throw new ExecutionLaunchPendingError(\n \"Execution environment provisioning is unresolved; recover with the original key\",\n { cause },\n );\n }\n return stored.record.execution;\n },\n\n async inspect(execution) {\n const stored = await ledger.read(execution);\n if (!stored) return { status: \"expired\" };\n if (stored.record.result) return { status: \"finished\", result: stored.record.result };\n const sandbox = await options.environment.find(keyOf(stored.record));\n if (!sandbox || sandbox.liveness === \"terminal\") {\n return { status: \"expired\" };\n }\n if (sandbox.liveness !== \"live\")\n throw new Error(\"Execution environment is transitioning; inspect again shortly\");\n return { status: \"active\" };\n },\n\n async stop(execution) {\n const stored = await ledger.read(execution);\n if (!stored) {\n return executionResultSchema.parse({\n status: \"cancelled\",\n execution,\n artifacts: [],\n usage: { computeMs: 0 },\n reason: \"No admitted execution matches this reference; its cost is unknown\",\n });\n }\n const { record } = stored;\n if (record.result) {\n // A final result does not imply the sandbox has stopped.\n await stopEnvironment(record);\n return record.result;\n }\n await stopEnvironment(record);\n return ledger.finalize(stored, {\n status: \"cancelled\",\n artifacts: [],\n reason: record.launched\n ? record.turns.length > 0\n ? \"Execution was stopped after its completed turn was recorded\"\n : \"Execution was stopped after launch; unfinished turn cost is unknown\"\n : \"Execution was stopped before its prompt was sent\",\n });\n },\n\n async drive(execution) {\n const admitted = await ledger.read(execution);\n if (!admitted) {\n throw new Error(\"No admitted execution matches this reference\");\n }\n let stored = admitted;\n if (stored.record.result) return stored.record.result;\n const request = stored.record.request;\n const configured = configuredHarness(request.harness);\n if (configured.model !== stored.record.model) {\n throw new Error(\"Execution model changed; restore its admitted harness configuration\");\n }\n // A launched attempt must never recreate its environment.\n let sandbox: SandboxHandle;\n if (!stored.record.launched) {\n const observed = await options.environment.ensure(keyOf(stored.record), {\n timeoutMs: sandboxTimeout(request),\n request,\n });\n if (observed.liveness !== \"live\") throw new Error(\"Execution environment is not live\");\n sandbox = observed.sandbox;\n } else {\n const found = await options.environment.find(keyOf(stored.record));\n if (!found || found.liveness === \"terminal\") {\n return ledger.finalize(stored, {\n status: \"failed\",\n artifacts: [],\n reason:\n \"Execution environment expired before a result was extracted; replacement requires a new attempt\",\n });\n }\n if (found.liveness !== \"live\") {\n throw new Error(\"Execution environment is transitioning; drive again shortly\");\n }\n sandbox = found.sandbox;\n }\n const remainingMs = Math.max(\n 0,\n request.environment.timeoutMs - (now() - (stored.record.startedAtMs ?? now())),\n );\n try {\n return await withExecutionAbort({\n timeoutMs: remainingMs,\n isStopped: async () => {\n const latest = await ledger.read(execution);\n if (!latest) throw new Error(\"The admitted execution disappeared\");\n return latest.record.result !== undefined;\n },\n run: async (abortSignal) => {\n if (remainingMs === 0) throw new ExecutionTimeoutError();\n let observedFlip = false;\n if (!stored.record.launched) {\n // Confirm launch intent durably before sending any prompt.\n const session = await configured.runner.open({\n sandbox,\n sessionId: stored.record.harnessSessionId,\n abortSignal,\n });\n stored = await ledger.markLaunched(stored, await session.detach());\n if (stored.record.result) return stored.record.result;\n observedFlip = true;\n }\n let turn: HarnessTurn | undefined;\n let promptedHere = false;\n if (stored.record.promptedAtMs === undefined && stored.record.turns.length === 0) {\n const session = await configured.runner.open({\n sandbox,\n sessionId: stored.record.harnessSessionId,\n resumeFrom: stored.record.resumeState,\n abortSignal,\n });\n const prompt = options.buildPrompt({\n request,\n reportSchema: stored.record.reportSchema,\n sandbox,\n });\n // An unmarked prompt from another driver may have spent money already.\n const foreignFlip = !observedFlip;\n try {\n const inflight = await session.beginPrompt(prompt);\n stored = await ledger.markPrompted({\n base: stored,\n resumeState: inflight,\n origin: foreignFlip ? \"recovered\" : \"this-driver\",\n });\n promptedHere = true;\n } catch (error) {\n if (!(error instanceof Error && /unfinished turn/iu.test(error.message)))\n throw error;\n // Drain the existing turn; its earlier usage was not observed.\n turn = await session.continueTurn();\n stored = await ledger.recordTurn({\n base: stored,\n turn: turn.usage,\n resumeState: await session.detach(),\n origin: \"recovered\",\n });\n }\n if (stored.record.result) return stored.record.result;\n }\n if (turn === undefined && stored.record.turns.length === 0) {\n const session = await configured.runner.open({\n sandbox,\n sessionId: stored.record.harnessSessionId,\n resumeFrom: stored.record.resumeState,\n abortSignal,\n });\n turn = await session.continueTurn();\n stored = await ledger.recordTurn({\n base: stored,\n turn: turn.usage,\n resumeState: await session.detach(),\n origin: promptedHere ? \"this-driver\" : \"recovered\",\n });\n if (stored.record.result) return stored.record.result;\n }\n const result = await extract(sandbox, stored.record);\n abortSignal.throwIfAborted();\n return ledger.finalize(stored, result);\n },\n });\n } catch (error) {\n const latest = await ledger.read(execution);\n if (latest?.record.result) return latest.record.result;\n if (!(error instanceof ExecutionTimeoutError) || !latest) throw error;\n await stopEnvironment(latest.record);\n return ledger.finalize(latest, {\n status: \"failed\",\n artifacts: [],\n reason: error.message,\n });\n }\n },\n\n pending: ledger.pending,\n };\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { SandboxWorkspaceHandle } from "./workspace.mjs";
|
|
2
|
+
import { HarnessAgentAdapter } from "@ai-sdk/harness/agent";
|
|
3
|
+
//#region src/sandbox/harness-runner.d.ts
|
|
4
|
+
/** Normalized per-turn token accounting, including whether the observation is complete. */
|
|
5
|
+
interface HarnessTurnUsage {
|
|
6
|
+
inputTokens: number;
|
|
7
|
+
noCacheInputTokens: number;
|
|
8
|
+
cacheReadTokens: number;
|
|
9
|
+
cacheWriteTokens: number;
|
|
10
|
+
outputTokens: number;
|
|
11
|
+
/** False when the SDK omitted token details or suspension lost usage. */
|
|
12
|
+
complete?: boolean;
|
|
13
|
+
}
|
|
14
|
+
/** Bounded harness response text paired with its normalized usage observation. */
|
|
15
|
+
interface HarnessTurn {
|
|
16
|
+
text: string;
|
|
17
|
+
usage: HarnessTurnUsage;
|
|
18
|
+
}
|
|
19
|
+
/** One recoverable harness session opened against a supplied sandbox. */
|
|
20
|
+
interface HarnessSession {
|
|
21
|
+
hasUnfinishedTurn(): boolean;
|
|
22
|
+
/** Do not reuse this handle; persist the returned state before reopening. */
|
|
23
|
+
beginPrompt(text: string): Promise<unknown>;
|
|
24
|
+
/** Drain the current turn — still running or already finished — to completion. */
|
|
25
|
+
continueTurn(): Promise<HarnessTurn>;
|
|
26
|
+
/** Persist cross-process resume state; the session handle is done afterwards. */
|
|
27
|
+
detach(): Promise<unknown>;
|
|
28
|
+
}
|
|
29
|
+
/** Minimal sandbox command and working-directory boundary required by harness runners. */
|
|
30
|
+
interface SandboxHandle extends SandboxWorkspaceHandle {
|
|
31
|
+
runCommand(params: SandboxRunCommandInput): Promise<SandboxRunCommandResult>;
|
|
32
|
+
}
|
|
33
|
+
/** Executable, arguments, and optional execution bounds for a sandbox command. */
|
|
34
|
+
interface SandboxRunCommandInput {
|
|
35
|
+
cmd: string;
|
|
36
|
+
args?: readonly string[];
|
|
37
|
+
cwd?: string;
|
|
38
|
+
timeoutMs?: number;
|
|
39
|
+
}
|
|
40
|
+
/** Exit status and lazy output streams returned by a sandbox command. */
|
|
41
|
+
interface SandboxRunCommandResult {
|
|
42
|
+
exitCode: number | null;
|
|
43
|
+
stdout(): Promise<string>;
|
|
44
|
+
stderr(): Promise<string>;
|
|
45
|
+
}
|
|
46
|
+
/** Sandbox, session identity, and optional continuation used to open a harness session. */
|
|
47
|
+
interface OpenHarnessSessionOptions {
|
|
48
|
+
sandbox: SandboxHandle;
|
|
49
|
+
sessionId: string;
|
|
50
|
+
resumeFrom?: unknown;
|
|
51
|
+
abortSignal?: AbortSignal;
|
|
52
|
+
}
|
|
53
|
+
/** Opens recoverable, serial harness sessions against a supplied sandbox. */
|
|
54
|
+
interface HarnessRunner {
|
|
55
|
+
open(options: OpenHarnessSessionOptions): Promise<HarnessSession>;
|
|
56
|
+
}
|
|
57
|
+
/** Harness adapter, model, workspace, and continuation policy used by a harness runner. */
|
|
58
|
+
interface HarnessAgentRunnerOptions {
|
|
59
|
+
harness: HarnessAgentAdapter;
|
|
60
|
+
model: string;
|
|
61
|
+
/** Directory used by the harness SDK inside the sandbox. */
|
|
62
|
+
workDir?: string;
|
|
63
|
+
/** Pi resolves a provider-qualified ID; persisted pricing uses the gateway ID. */
|
|
64
|
+
providerModel?: string;
|
|
65
|
+
/** Pi suspends its host model loop by aborting and replaying its journal. */
|
|
66
|
+
suspensionLosesUsage?: boolean;
|
|
67
|
+
/** A changed or unavailable runtime identity makes continuation usage incomplete. */
|
|
68
|
+
continuationIdentity?(state: unknown): string | undefined;
|
|
69
|
+
}
|
|
70
|
+
/** Model and configured runner selected for one execution harness. */
|
|
71
|
+
interface ConfiguredHarnessRunner {
|
|
72
|
+
model: string;
|
|
73
|
+
runner: HarnessRunner;
|
|
74
|
+
}
|
|
75
|
+
/** Adapt an AI SDK harness agent into Factory's durable open/continue/detach session contract. */
|
|
76
|
+
declare function createHarnessAgentRunner(options: HarnessAgentRunnerOptions): HarnessRunner;
|
|
77
|
+
//#endregion
|
|
78
|
+
export { ConfiguredHarnessRunner, HarnessAgentRunnerOptions, HarnessRunner, HarnessSession, HarnessTurn, HarnessTurnUsage, OpenHarnessSessionOptions, SandboxHandle, SandboxRunCommandInput, SandboxRunCommandResult, createHarnessAgentRunner };
|
|
79
|
+
//# sourceMappingURL=harness-runner.d.mts.map
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
import { jsonValueSchema } from "../schema/work.mjs";
|
|
2
|
+
import "./workspace.mjs";
|
|
3
|
+
import { z } from "zod";
|
|
4
|
+
import { HarnessAgent } from "@ai-sdk/harness/agent";
|
|
5
|
+
import { createVercelSandbox } from "@ai-sdk/sandbox-vercel";
|
|
6
|
+
//#region src/sandbox/harness-runner.ts
|
|
7
|
+
const count = z.number().int().nonnegative();
|
|
8
|
+
const turnSchema = z.object({
|
|
9
|
+
text: z.string(),
|
|
10
|
+
usage: z.object({
|
|
11
|
+
inputTokens: count,
|
|
12
|
+
noCacheInputTokens: count,
|
|
13
|
+
cacheReadTokens: count,
|
|
14
|
+
cacheWriteTokens: count,
|
|
15
|
+
outputTokens: count,
|
|
16
|
+
complete: z.boolean()
|
|
17
|
+
})
|
|
18
|
+
});
|
|
19
|
+
const resumeSchema = z.strictObject({
|
|
20
|
+
harness: z.string(),
|
|
21
|
+
model: z.string(),
|
|
22
|
+
session: jsonValueSchema,
|
|
23
|
+
usageIncomplete: z.boolean(),
|
|
24
|
+
completedTurn: turnSchema.optional()
|
|
25
|
+
});
|
|
26
|
+
const usageSchema = z.object({
|
|
27
|
+
inputTokens: count.optional(),
|
|
28
|
+
outputTokens: count.optional(),
|
|
29
|
+
inputTokenDetails: z.object({
|
|
30
|
+
noCacheTokens: count.optional(),
|
|
31
|
+
cacheReadTokens: count.optional(),
|
|
32
|
+
cacheWriteTokens: count.optional()
|
|
33
|
+
}).optional()
|
|
34
|
+
});
|
|
35
|
+
function observedTurn(result, usageIncomplete) {
|
|
36
|
+
const usage = usageSchema.parse(result.totalUsage ?? {});
|
|
37
|
+
const details = usage.inputTokenDetails;
|
|
38
|
+
return {
|
|
39
|
+
text: result.text.slice(0, 2e3),
|
|
40
|
+
usage: {
|
|
41
|
+
inputTokens: usage.inputTokens ?? 0,
|
|
42
|
+
noCacheInputTokens: details?.noCacheTokens ?? 0,
|
|
43
|
+
cacheReadTokens: details?.cacheReadTokens ?? 0,
|
|
44
|
+
cacheWriteTokens: details?.cacheWriteTokens ?? 0,
|
|
45
|
+
outputTokens: usage.outputTokens ?? 0,
|
|
46
|
+
complete: !usageIncomplete && usage.inputTokens !== void 0 && usage.outputTokens !== void 0 && details?.noCacheTokens !== void 0 && details.cacheReadTokens !== void 0 && details.cacheWriteTokens !== void 0 && details.noCacheTokens + details.cacheReadTokens + details.cacheWriteTokens === usage.inputTokens
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
/** Adapt an AI SDK harness agent into Factory's durable open/continue/detach session contract. */
|
|
51
|
+
function createHarnessAgentRunner(options) {
|
|
52
|
+
return { async open({ sandbox, sessionId, resumeFrom, abortSignal }) {
|
|
53
|
+
abortSignal?.throwIfAborted();
|
|
54
|
+
const abortOptions = abortSignal ? { abortSignal } : {};
|
|
55
|
+
const saved = resumeFrom === void 0 ? void 0 : resumeSchema.parse(resumeFrom);
|
|
56
|
+
if (saved && (saved.harness !== options.harness.harnessId || saved.model !== options.model)) throw new Error("Harness continuation belongs to a different harness or model");
|
|
57
|
+
if (saved?.completedTurn) {
|
|
58
|
+
const turn = saved.completedTurn;
|
|
59
|
+
return {
|
|
60
|
+
hasUnfinishedTurn: () => false,
|
|
61
|
+
beginPrompt: async () => {
|
|
62
|
+
throw new Error("A completed turn cannot be prompted again");
|
|
63
|
+
},
|
|
64
|
+
continueTurn: async () => {
|
|
65
|
+
abortSignal?.throwIfAborted();
|
|
66
|
+
return turn;
|
|
67
|
+
},
|
|
68
|
+
detach: async () => saved
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
const provider = createVercelSandbox({ sandbox });
|
|
72
|
+
let finished = false;
|
|
73
|
+
const observe = (emit) => (event) => {
|
|
74
|
+
if (event.type === "finish") finished = true;
|
|
75
|
+
emit(event);
|
|
76
|
+
};
|
|
77
|
+
const harness = {
|
|
78
|
+
...options.harness,
|
|
79
|
+
async doStart(input) {
|
|
80
|
+
const runtime = await options.harness.doStart(input);
|
|
81
|
+
return {
|
|
82
|
+
...runtime,
|
|
83
|
+
doPromptTurn: (turn) => runtime.doPromptTurn({
|
|
84
|
+
...turn,
|
|
85
|
+
emit: observe(turn.emit)
|
|
86
|
+
}),
|
|
87
|
+
doContinueTurn: (turn) => runtime.doContinueTurn({
|
|
88
|
+
...turn,
|
|
89
|
+
emit: observe(turn.emit)
|
|
90
|
+
})
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
};
|
|
94
|
+
const agent = new HarnessAgent({
|
|
95
|
+
id: `factory-${options.harness.harnessId}`,
|
|
96
|
+
harness,
|
|
97
|
+
model: options.providerModel ?? options.model,
|
|
98
|
+
sandbox: provider,
|
|
99
|
+
sandboxConfig: { workDir: options.workDir ?? "workspace" }
|
|
100
|
+
});
|
|
101
|
+
const session = await agent.createSession({
|
|
102
|
+
sessionId,
|
|
103
|
+
...abortOptions,
|
|
104
|
+
...saved ? { resumeFrom: saved.session } : {}
|
|
105
|
+
});
|
|
106
|
+
let usageIncomplete = saved?.usageIncomplete ?? false;
|
|
107
|
+
let detached;
|
|
108
|
+
async function abortable(run) {
|
|
109
|
+
try {
|
|
110
|
+
return await run();
|
|
111
|
+
} finally {
|
|
112
|
+
if (abortSignal?.aborted) await session.destroy();
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
const snapshot = (state, completedTurn) => resumeSchema.parse({
|
|
116
|
+
harness: options.harness.harnessId,
|
|
117
|
+
model: options.model,
|
|
118
|
+
session: JSON.parse(JSON.stringify(state)),
|
|
119
|
+
usageIncomplete,
|
|
120
|
+
...completedTurn ? { completedTurn } : {}
|
|
121
|
+
});
|
|
122
|
+
return {
|
|
123
|
+
hasUnfinishedTurn: () => session.hasUnfinishedTurn(),
|
|
124
|
+
beginPrompt: (text) => abortable(async () => {
|
|
125
|
+
const stream = await agent.stream({
|
|
126
|
+
session,
|
|
127
|
+
prompt: text,
|
|
128
|
+
...abortOptions
|
|
129
|
+
});
|
|
130
|
+
const state = await session.detach();
|
|
131
|
+
if (state.continueFrom && !finished) {
|
|
132
|
+
usageIncomplete ||= options.suspensionLosesUsage === true;
|
|
133
|
+
return snapshot(state);
|
|
134
|
+
}
|
|
135
|
+
return snapshot(state, observedTurn({
|
|
136
|
+
text: await stream.text,
|
|
137
|
+
totalUsage: await stream.totalUsage
|
|
138
|
+
}, usageIncomplete));
|
|
139
|
+
}),
|
|
140
|
+
continueTurn: () => abortable(async () => {
|
|
141
|
+
const result = await agent.continueGenerate({
|
|
142
|
+
session,
|
|
143
|
+
...abortOptions
|
|
144
|
+
});
|
|
145
|
+
const state = await session.detach();
|
|
146
|
+
if (saved && options.continuationIdentity) {
|
|
147
|
+
const before = options.continuationIdentity(saved.session);
|
|
148
|
+
const after = options.continuationIdentity(state);
|
|
149
|
+
usageIncomplete ||= before === void 0 || after === void 0 || before !== after;
|
|
150
|
+
}
|
|
151
|
+
const turn = observedTurn(result, usageIncomplete);
|
|
152
|
+
detached = snapshot(state, turn);
|
|
153
|
+
return turn;
|
|
154
|
+
}),
|
|
155
|
+
detach: async () => detached ?? snapshot(await session.detach())
|
|
156
|
+
};
|
|
157
|
+
} };
|
|
158
|
+
}
|
|
159
|
+
//#endregion
|
|
160
|
+
export { createHarnessAgentRunner };
|
|
161
|
+
|
|
162
|
+
//# sourceMappingURL=harness-runner.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"harness-runner.mjs","names":[],"sources":["../../src/sandbox/harness-runner.ts"],"sourcesContent":["import {\n HarnessAgent,\n type HarnessAgentAdapter,\n type HarnessAgentResumeSessionState,\n} from \"@ai-sdk/harness/agent\";\nimport { createVercelSandbox } from \"@ai-sdk/sandbox-vercel\";\nimport type { HarnessV1StreamPart } from \"@ai-sdk/harness\";\nimport { jsonValueSchema } from \"../schema/work\";\nimport { z } from \"zod\";\nimport { defaultHarnessWorkDir, type SandboxWorkspaceHandle } from \"./workspace\";\n\n/** Normalized per-turn token accounting, including whether the observation is complete. */\nexport interface HarnessTurnUsage {\n inputTokens: number;\n noCacheInputTokens: number;\n cacheReadTokens: number;\n cacheWriteTokens: number;\n outputTokens: number;\n /** False when the SDK omitted token details or suspension lost usage. */\n complete?: boolean;\n}\n\n/** Bounded harness response text paired with its normalized usage observation. */\nexport interface HarnessTurn {\n text: string;\n usage: HarnessTurnUsage;\n}\n\n/** One recoverable harness session opened against a supplied sandbox. */\nexport interface HarnessSession {\n hasUnfinishedTurn(): boolean;\n /** Do not reuse this handle; persist the returned state before reopening. */\n beginPrompt(text: string): Promise<unknown>;\n /** Drain the current turn — still running or already finished — to completion. */\n continueTurn(): Promise<HarnessTurn>;\n /** Persist cross-process resume state; the session handle is done afterwards. */\n detach(): Promise<unknown>;\n}\n\n/** Minimal sandbox command and working-directory boundary required by harness runners. */\nexport interface SandboxHandle extends SandboxWorkspaceHandle {\n runCommand(params: SandboxRunCommandInput): Promise<SandboxRunCommandResult>;\n}\n\n/** Executable, arguments, and optional execution bounds for a sandbox command. */\nexport interface SandboxRunCommandInput {\n cmd: string;\n args?: readonly string[];\n cwd?: string;\n timeoutMs?: number;\n}\n\n/** Exit status and lazy output streams returned by a sandbox command. */\nexport interface SandboxRunCommandResult {\n exitCode: number | null;\n stdout(): Promise<string>;\n stderr(): Promise<string>;\n}\n\n/** Sandbox, session identity, and optional continuation used to open a harness session. */\nexport interface OpenHarnessSessionOptions {\n sandbox: SandboxHandle;\n sessionId: string;\n resumeFrom?: unknown;\n abortSignal?: AbortSignal;\n}\n\n/** Opens recoverable, serial harness sessions against a supplied sandbox. */\nexport interface HarnessRunner {\n open(options: OpenHarnessSessionOptions): Promise<HarnessSession>;\n}\n\n/** Harness adapter, model, workspace, and continuation policy used by a harness runner. */\nexport interface HarnessAgentRunnerOptions {\n harness: HarnessAgentAdapter;\n model: string;\n /** Directory used by the harness SDK inside the sandbox. */\n workDir?: string;\n /** Pi resolves a provider-qualified ID; persisted pricing uses the gateway ID. */\n providerModel?: string;\n /** Pi suspends its host model loop by aborting and replaying its journal. */\n suspensionLosesUsage?: boolean;\n /** A changed or unavailable runtime identity makes continuation usage incomplete. */\n continuationIdentity?(state: unknown): string | undefined;\n}\n\n/** Model and configured runner selected for one execution harness. */\nexport interface ConfiguredHarnessRunner {\n model: string;\n runner: HarnessRunner;\n}\n\nconst count = z.number().int().nonnegative();\nconst turnSchema = z.object({\n text: z.string(),\n usage: z.object({\n inputTokens: count,\n noCacheInputTokens: count,\n cacheReadTokens: count,\n cacheWriteTokens: count,\n outputTokens: count,\n complete: z.boolean(),\n }),\n});\nconst resumeSchema = z.strictObject({\n harness: z.string(),\n model: z.string(),\n session: jsonValueSchema,\n usageIncomplete: z.boolean(),\n completedTurn: turnSchema.optional(),\n});\nconst usageSchema = z.object({\n inputTokens: count.optional(),\n outputTokens: count.optional(),\n inputTokenDetails: z\n .object({\n noCacheTokens: count.optional(),\n cacheReadTokens: count.optional(),\n cacheWriteTokens: count.optional(),\n })\n .optional(),\n});\n\nfunction observedTurn(\n result: { text: string; totalUsage: unknown },\n usageIncomplete: boolean,\n): HarnessTurn & z.infer<typeof turnSchema> {\n const usage = usageSchema.parse(result.totalUsage ?? {});\n const details = usage.inputTokenDetails;\n return {\n text: result.text.slice(0, 2000),\n usage: {\n inputTokens: usage.inputTokens ?? 0,\n noCacheInputTokens: details?.noCacheTokens ?? 0,\n cacheReadTokens: details?.cacheReadTokens ?? 0,\n cacheWriteTokens: details?.cacheWriteTokens ?? 0,\n outputTokens: usage.outputTokens ?? 0,\n complete:\n !usageIncomplete &&\n usage.inputTokens !== undefined &&\n usage.outputTokens !== undefined &&\n details?.noCacheTokens !== undefined &&\n details.cacheReadTokens !== undefined &&\n details.cacheWriteTokens !== undefined &&\n details.noCacheTokens + details.cacheReadTokens + details.cacheWriteTokens ===\n usage.inputTokens,\n },\n };\n}\n\n/** Adapt an AI SDK harness agent into Factory's durable open/continue/detach session contract. */\nexport function createHarnessAgentRunner(options: HarnessAgentRunnerOptions): HarnessRunner {\n return {\n async open({ sandbox, sessionId, resumeFrom, abortSignal }) {\n abortSignal?.throwIfAborted();\n const abortOptions = abortSignal ? { abortSignal } : {};\n const saved = resumeFrom === undefined ? undefined : resumeSchema.parse(resumeFrom);\n if (saved && (saved.harness !== options.harness.harnessId || saved.model !== options.model)) {\n throw new Error(\"Harness continuation belongs to a different harness or model\");\n }\n if (saved?.completedTurn) {\n const turn = saved.completedTurn;\n return {\n hasUnfinishedTurn: () => false,\n beginPrompt: async () => {\n throw new Error(\"A completed turn cannot be prompted again\");\n },\n continueTurn: async () => {\n abortSignal?.throwIfAborted();\n return turn;\n },\n detach: async () => saved,\n };\n }\n // sandbox-vercel types target Sandbox 3.x; this caller-owned 2.x instance has the same operations.\n const provider = createVercelSandbox({ sandbox } as unknown as Parameters<\n typeof createVercelSandbox\n >[0]);\n let finished = false;\n const observe =\n (emit: (event: HarnessV1StreamPart) => void) => (event: HarnessV1StreamPart) => {\n if (event.type === \"finish\") finished = true;\n emit(event);\n };\n const harness: HarnessAgentAdapter = {\n ...options.harness,\n async doStart(input) {\n const runtime = await options.harness.doStart(input);\n return {\n ...runtime,\n doPromptTurn: (turn) => runtime.doPromptTurn({ ...turn, emit: observe(turn.emit) }),\n doContinueTurn: (turn) => runtime.doContinueTurn({ ...turn, emit: observe(turn.emit) }),\n };\n },\n };\n const agent = new HarnessAgent({\n id: `factory-${options.harness.harnessId}`,\n harness,\n model: options.providerModel ?? options.model,\n sandbox: provider,\n sandboxConfig: { workDir: options.workDir ?? defaultHarnessWorkDir },\n });\n const session = await agent.createSession({\n sessionId,\n ...abortOptions,\n // HarnessAgent validates the provider-specific lifecycle payload.\n ...(saved\n ? { resumeFrom: saved.session as unknown as HarnessAgentResumeSessionState }\n : {}),\n });\n let usageIncomplete = saved?.usageIncomplete ?? false;\n let detached: z.infer<typeof resumeSchema> | undefined;\n async function abortable<T>(run: () => Promise<T>): Promise<T> {\n try {\n return await run();\n } finally {\n // Pi may emit an error before its host loop stops; wait for cleanup.\n if (abortSignal?.aborted) await session.destroy();\n }\n }\n const snapshot = (\n state: HarnessAgentResumeSessionState,\n completedTurn?: z.infer<typeof turnSchema>,\n ) =>\n resumeSchema.parse({\n harness: options.harness.harnessId,\n model: options.model,\n session: JSON.parse(JSON.stringify(state)) as unknown,\n usageIncomplete,\n ...(completedTurn ? { completedTurn } : {}),\n });\n return {\n hasUnfinishedTurn: () => session.hasUnfinishedTurn(),\n beginPrompt: (text) =>\n abortable(async () => {\n // hasUnfinishedTurn can reflect local intent; stream confirms runtime acceptance.\n const stream = await agent.stream({ session, prompt: text, ...abortOptions });\n const state = await session.detach();\n if (state.continueFrom && !finished) {\n usageIncomplete ||= options.suspensionLosesUsage === true;\n return snapshot(state);\n }\n // A fast turn can finish before detach; retain its result for continuation.\n return snapshot(\n state,\n observedTurn(\n {\n text: await stream.text,\n totalUsage: await stream.totalUsage,\n },\n usageIncomplete,\n ),\n );\n }),\n continueTurn: () =>\n abortable(async () => {\n const result = await agent.continueGenerate({ session, ...abortOptions });\n const state = await session.detach();\n if (saved && options.continuationIdentity) {\n const before = options.continuationIdentity(saved.session);\n const after = options.continuationIdentity(state);\n usageIncomplete ||= before === undefined || after === undefined || before !== after;\n }\n const turn = observedTurn(result, usageIncomplete);\n detached = snapshot(state, turn);\n return turn;\n }),\n detach: async () => detached ?? snapshot(await session.detach()),\n };\n },\n };\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import { CommandSandbox, CommandSandboxRunInput, CommandSandboxRunResult } from "./command.mjs";
|
|
3
|
+
import { HarnessWorkspace, SandboxOutputPath, SandboxSession, SandboxWorkspaceHandle, defaultHarnessWorkDir, harnessWorkspace, parseSandboxOutputPath } from "./workspace.mjs";
|
|
4
|
+
import { ConfiguredHarnessRunner, HarnessAgentRunnerOptions, HarnessRunner, HarnessSession, HarnessTurn, HarnessTurnUsage, OpenHarnessSessionOptions, SandboxHandle, SandboxRunCommandInput, SandboxRunCommandResult, createHarnessAgentRunner } from "./harness-runner.mjs";
|
|
5
|
+
import { EnsureExecutionEnvironmentOptions, EnvironmentLiveness, ExecutionEnvironment, ExecutionEnvironmentObservation } from "./execution-environment.mjs";
|
|
6
|
+
import { AdmitExecutionRunInput, ExecutionOutcome, ExecutionRunLedger, ExecutionRunLedgerOptions, MarkExecutionRunPromptedInput, RecordExecutionRunTurnInput, RunRecord, RunSnapshot, createExecutionRunLedger } from "./execution-run-ledger.mjs";
|
|
7
|
+
import { SandboxExecutionAdapter, SandboxExecutionOptions, SandboxExecutionOutcomeContext, SandboxExecutionPromptContext, SandboxExecutionStartContext, StartSandboxExecutionInput, createSandboxExecutionAdapter } from "./execution.mjs";
|
|
8
|
+
import { ExecutionAbortOptions, ExecutionTimeoutError, withExecutionAbort } from "./execution-abort.mjs";
|
|
9
|
+
import { EnsureTaskSandboxOptions, FindTaskSandboxOptions, SandboxApi, TaskSandboxEnvironmentOptions, TaskSandboxScope, createTaskSandboxEnvironment, ensureTaskSandbox, findTaskSandbox, stopTaskSandbox, taskSandboxName, taskSandboxTags } from "./task-environment.mjs";
|
|
10
|
+
export { type AdmitExecutionRunInput, type CommandSandbox, type CommandSandboxRunInput, type CommandSandboxRunResult, type ConfiguredHarnessRunner, type EnsureExecutionEnvironmentOptions, type EnsureTaskSandboxOptions, type EnvironmentLiveness, type ExecutionAbortOptions, type ExecutionEnvironment, type ExecutionEnvironmentObservation, type ExecutionOutcome, type ExecutionRunLedger, type ExecutionRunLedgerOptions, ExecutionTimeoutError, type FindTaskSandboxOptions, type HarnessAgentRunnerOptions, type HarnessRunner, type HarnessSession, type HarnessTurn, type HarnessTurnUsage, type HarnessWorkspace, type MarkExecutionRunPromptedInput, type OpenHarnessSessionOptions, type RecordExecutionRunTurnInput, type RunRecord, type RunSnapshot, type SandboxApi, type SandboxExecutionAdapter, type SandboxExecutionOptions, type SandboxExecutionOutcomeContext, type SandboxExecutionPromptContext, type SandboxExecutionStartContext, type SandboxHandle, type SandboxOutputPath, type SandboxRunCommandInput, type SandboxRunCommandResult, type SandboxSession, type SandboxWorkspaceHandle, type StartSandboxExecutionInput, type TaskSandboxEnvironmentOptions, type TaskSandboxScope, createExecutionRunLedger, createHarnessAgentRunner, createSandboxExecutionAdapter, createTaskSandboxEnvironment, defaultHarnessWorkDir, ensureTaskSandbox, findTaskSandbox, harnessWorkspace, parseSandboxOutputPath, stopTaskSandbox, taskSandboxName, taskSandboxTags, withExecutionAbort };
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { ExecutionTimeoutError, withExecutionAbort } from "./execution-abort.mjs";
|
|
2
|
+
import { createExecutionRunLedger } from "./execution-run-ledger.mjs";
|
|
3
|
+
import { createSandboxExecutionAdapter } from "./execution.mjs";
|
|
4
|
+
import { defaultHarnessWorkDir, harnessWorkspace, parseSandboxOutputPath } from "./workspace.mjs";
|
|
5
|
+
import { createHarnessAgentRunner } from "./harness-runner.mjs";
|
|
6
|
+
import { createTaskSandboxEnvironment, ensureTaskSandbox, findTaskSandbox, stopTaskSandbox, taskSandboxName, taskSandboxTags } from "./task-environment.mjs";
|
|
7
|
+
export { ExecutionTimeoutError, createExecutionRunLedger, createHarnessAgentRunner, createSandboxExecutionAdapter, createTaskSandboxEnvironment, defaultHarnessWorkDir, ensureTaskSandbox, findTaskSandbox, harnessWorkspace, parseSandboxOutputPath, stopTaskSandbox, taskSandboxName, taskSandboxTags, withExecutionAbort };
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { CodingExecutionRequest, TaskAttemptRef } from "../schema/execution.mjs";
|
|
2
|
+
import { ExecutionEnvironment } from "./execution-environment.mjs";
|
|
3
|
+
import { Sandbox } from "@vercel/sandbox";
|
|
4
|
+
//#region src/sandbox/task-environment.d.ts
|
|
5
|
+
/** Isolates stores that reuse Task IDs within the project's shared sandbox namespace. */
|
|
6
|
+
interface TaskSandboxScope {
|
|
7
|
+
scope: string;
|
|
8
|
+
}
|
|
9
|
+
/** Injectable subset of the Vercel Sandbox API used for creation and exact identity discovery. */
|
|
10
|
+
type SandboxApi = Pick<typeof Sandbox, "getOrCreate" | "get" | "list">;
|
|
11
|
+
/** Derive a deterministic provider sandbox name from a scoped Task-attempt identity. */
|
|
12
|
+
declare function taskSandboxName(key: TaskAttemptRef, scope: string): string;
|
|
13
|
+
/** Build the complete tag set used to discover and re-verify a Task sandbox. */
|
|
14
|
+
declare function taskSandboxTags(key: TaskAttemptRef, scope: string): Record<string, string>;
|
|
15
|
+
/** Configures idempotent creation and workspace seeding for a Task sandbox. */
|
|
16
|
+
interface EnsureTaskSandboxOptions extends TaskSandboxScope {
|
|
17
|
+
/** Sandbox lifetime; callers add margin over the execution timeout. */
|
|
18
|
+
timeoutMs: number;
|
|
19
|
+
/** Seeds the workspace; must be idempotent because a crashed seed reruns. */
|
|
20
|
+
seed(sandbox: Sandbox): Promise<void>;
|
|
21
|
+
runtime?: string;
|
|
22
|
+
ports?: readonly number[];
|
|
23
|
+
seededMarker?: string;
|
|
24
|
+
api?: SandboxApi;
|
|
25
|
+
}
|
|
26
|
+
/** Create or recover the exact sandbox for a Task attempt and ensure seeding completed. */
|
|
27
|
+
declare function ensureTaskSandbox(key: TaskAttemptRef, options: EnsureTaskSandboxOptions): Promise<Sandbox>;
|
|
28
|
+
/** Scope and provider API used to discover an existing Task sandbox. */
|
|
29
|
+
interface FindTaskSandboxOptions extends TaskSandboxScope {
|
|
30
|
+
api?: SandboxApi;
|
|
31
|
+
}
|
|
32
|
+
/** Discover an existing Task sandbox without resuming or replacing it. */
|
|
33
|
+
declare function findTaskSandbox(key: TaskAttemptRef, options: FindTaskSandboxOptions): Promise<Sandbox | null>;
|
|
34
|
+
/** Stop a live Task sandbox idempotently while treating provider disappearance as success. */
|
|
35
|
+
declare function stopTaskSandbox(sandbox: Sandbox): Promise<void>;
|
|
36
|
+
/** Scoped creation, seeding, and provider dependencies for a Task sandbox environment. */
|
|
37
|
+
interface TaskSandboxEnvironmentOptions {
|
|
38
|
+
/** Deployment- or run-unique namespace; see {@link TaskSandboxScope}. */
|
|
39
|
+
scope: string;
|
|
40
|
+
seed(request: CodingExecutionRequest, sandbox: Sandbox): Promise<void>;
|
|
41
|
+
runtime?: EnsureTaskSandboxOptions["runtime"];
|
|
42
|
+
ports?: readonly number[];
|
|
43
|
+
seededMarker?: string;
|
|
44
|
+
api?: SandboxApi;
|
|
45
|
+
}
|
|
46
|
+
/** Adapt scoped Vercel Sandbox creation and discovery to the execution-environment contract. */
|
|
47
|
+
declare function createTaskSandboxEnvironment(options: TaskSandboxEnvironmentOptions): ExecutionEnvironment<Sandbox>;
|
|
48
|
+
//#endregion
|
|
49
|
+
export { EnsureTaskSandboxOptions, FindTaskSandboxOptions, SandboxApi, TaskSandboxEnvironmentOptions, TaskSandboxScope, createTaskSandboxEnvironment, ensureTaskSandbox, findTaskSandbox, stopTaskSandbox, taskSandboxName, taskSandboxTags };
|
|
50
|
+
//# sourceMappingURL=task-environment.d.mts.map
|