@fitlab-ai/agent-infra 0.9.14 → 0.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +10 -0
- package/README.zh-CN.md +10 -0
- package/bin/internal-cli.sh +45 -0
- package/dist/bin/internal-cli.js +93 -30
- package/dist/lib/agent-clients/adapters/codex-lifecycle/capability-store.js +165 -27
- package/dist/lib/agent-clients/adapters/codex-lifecycle/sandbox-controller.js +9 -4
- package/dist/lib/agent-clients/adapters/codex-lifecycle/store.js +43 -3
- package/dist/lib/defaults.json +103 -103
- package/dist/lib/fs/durable-write.js +39 -0
- package/dist/lib/fs/file-lock.js +111 -0
- package/dist/lib/host-control/audit.js +19 -0
- package/dist/lib/host-control/client.js +142 -0
- package/dist/lib/host-control/command.js +49 -0
- package/dist/lib/host-control/path.js +160 -0
- package/dist/lib/host-control/secure-fs.js +140 -0
- package/dist/lib/host-control/server.js +159 -0
- package/dist/lib/host-control/service.js +112 -0
- package/dist/lib/init.js +11 -2
- package/dist/lib/internal/cli-route-inventory.js +4 -2
- package/dist/lib/internal/codex-lifecycle.js +6 -6
- package/dist/lib/internal/demo-promotion.js +322 -0
- package/dist/lib/internal/demo-transcript.js +454 -0
- package/dist/lib/internal/host-control.js +28 -0
- package/dist/lib/internal/manual-validation.js +331 -0
- package/dist/lib/internal/platform-pr.js +18 -4
- package/dist/lib/internal/release-workflow.js +63 -84
- package/dist/lib/internal/sandbox-control.js +149 -2
- package/dist/lib/internal/task-artifact.js +16 -263
- package/dist/lib/internal/task-create.js +6 -5
- package/dist/lib/internal/task-event.js +37 -37
- package/dist/lib/internal/task-lifecycle.js +2 -2
- package/dist/lib/internal/task-operation-registry.js +101 -4
- package/dist/lib/internal/task-review.js +11 -56
- package/dist/lib/internal/task-validate.js +30 -10
- package/dist/lib/owned-path.js +33 -0
- package/dist/lib/platform/check-status.js +11 -0
- package/dist/lib/platform/comment-safety.js +4 -1
- package/dist/lib/platform/completion-backfill.js +1 -1
- package/dist/lib/platform/github-data.js +241 -0
- package/dist/lib/platform/github-provider.js +15 -20
- package/dist/lib/platform/issue-comments.js +18 -12
- package/dist/lib/platform/issues.js +2 -180
- package/dist/lib/platform/pr-change-report.js +5 -4
- package/dist/lib/platform/pr-checks.js +12 -65
- package/dist/lib/platform/pr-summary.js +117 -33
- package/dist/lib/platform/pull-requests.js +5 -108
- package/dist/lib/platform/snapshots.js +2 -0
- package/dist/lib/platform/task-identities.js +2 -9
- package/dist/lib/platform/verification-sync.js +132 -143
- package/dist/lib/pr-review/evidence-grading.js +4 -8
- package/dist/lib/release/workflow.js +1 -1
- package/dist/lib/sandbox/commands/create.js +7 -2
- package/dist/lib/sandbox/commands/rm.js +19 -1511
- package/dist/lib/sandbox/control/audit.js +203 -0
- package/dist/lib/sandbox/control/client.js +93 -54
- package/dist/lib/sandbox/control/executor.js +129 -65
- package/dist/lib/sandbox/control/finalization-response.js +27 -0
- package/dist/lib/sandbox/control/identity-sentinel.js +107 -0
- package/dist/lib/sandbox/control/lifecycle.js +36 -2
- package/dist/lib/sandbox/control/native-file-lock.js +6 -98
- package/dist/lib/sandbox/control/protocol.js +55 -4
- package/dist/lib/sandbox/control/server.js +518 -127
- package/dist/lib/sandbox/control/state.js +64 -0
- package/dist/lib/sandbox/control/task-workflow.js +74 -0
- package/dist/lib/sandbox/control/workflow-executor.js +89 -0
- package/dist/lib/sandbox/index.js +1 -2
- package/dist/lib/sandbox/recovery.js +28 -4
- package/dist/lib/sandbox/removal.js +822 -0
- package/dist/lib/sandbox/task-cleanup.js +217 -0
- package/dist/lib/sandbox/workspace-identity.js +17 -1
- package/dist/lib/sandbox/workspace-view.js +13 -14
- package/dist/lib/task/activity-intent.js +2 -1
- package/dist/lib/task/activity-log.js +30 -24
- package/dist/lib/task/artifact-command.js +79 -0
- package/dist/lib/task/artifact-lifecycle.js +30 -28
- package/dist/lib/task/artifact-name.js +36 -0
- package/dist/lib/task/artifact-operations.js +29 -289
- package/dist/lib/task/artifact-receipts.js +3 -15
- package/dist/lib/task/artifact-recovery.js +430 -0
- package/dist/lib/task/artifact-repair-intent.js +134 -29
- package/dist/lib/task/artifact-schema.js +6 -14
- package/dist/lib/task/capabilities.js +12 -19
- package/dist/lib/task/codex-orchestration.js +71 -25
- package/dist/lib/task/commit-identity.js +28 -0
- package/dist/lib/task/commit-operation.js +33 -20
- package/dist/lib/task/control-authority.js +403 -6
- package/dist/lib/task/control-recovery.js +140 -0
- package/dist/lib/task/create-service.js +1 -8
- package/dist/lib/task/create.js +62 -9
- package/dist/lib/task/decision-details.js +2 -46
- package/dist/lib/task/delegation-receipts.js +64 -3
- package/dist/lib/task/events.js +275 -22
- package/dist/lib/task/finalization-state.js +9 -0
- package/dist/lib/task/human-override.js +8 -14
- package/dist/lib/task/implementation-inputs.js +3 -3
- package/dist/lib/task/intermediate-cleanup.js +441 -0
- package/dist/lib/task/invalidation.js +18 -65
- package/dist/lib/task/ledger-intents.js +7 -22
- package/dist/lib/task/ledger.js +1 -3
- package/dist/lib/task/lifecycle-recovery.js +549 -0
- package/dist/lib/task/lifecycle.js +31 -4
- package/dist/lib/task/local-artifact-finalization.js +197 -197
- package/dist/lib/task/manual-validation-completion.js +26 -0
- package/dist/lib/task/manual-validation-evidence.js +130 -0
- package/dist/lib/task/manual-validation-receipt.js +105 -0
- package/dist/lib/task/manual-validation-shared.js +40 -0
- package/dist/lib/task/manual-validation-transaction.js +243 -0
- package/dist/lib/task/markdown.js +47 -0
- package/dist/lib/task/orchestration.js +66 -19
- package/dist/lib/task/pr-delivery-fact.js +12 -56
- package/dist/lib/task/qualification-audit.js +20 -34
- package/dist/lib/task/recovery-warning.js +19 -0
- package/dist/lib/task/review-artifacts.js +2 -18
- package/dist/lib/task/review-command.js +26 -0
- package/dist/lib/task/review-finalization.js +175 -216
- package/dist/lib/task/review-fingerprint.js +2 -2
- package/dist/lib/task/sections.js +34 -56
- package/dist/lib/task/short-id.js +15 -7
- package/dist/lib/task/task-execution-lock.js +1 -1
- package/dist/lib/task/verification-engine.js +119 -337
- package/dist/lib/task/verification.js +1 -1
- package/dist/lib/task/workflow-command.js +16 -0
- package/dist/lib/task/workflow-warning-intents.js +0 -16
- package/dist/lib/task/workflow-warnings.js +28 -2
- package/dist/lib/update.js +2 -0
- package/dist/lib/version.js +1 -11
- package/dist/lifecycle-build-manifest.json +3 -3
- package/lib/agent-clients/adapters/codex-lifecycle/capability-store.ts +223 -33
- package/lib/agent-clients/adapters/codex-lifecycle/sandbox-controller.ts +10 -4
- package/lib/agent-clients/adapters/codex-lifecycle/store.ts +55 -3
- package/lib/fs/durable-write.ts +30 -0
- package/lib/fs/file-lock.ts +113 -0
- package/lib/host-control/audit.ts +22 -0
- package/lib/host-control/client.ts +172 -0
- package/lib/host-control/command.ts +60 -0
- package/lib/host-control/path.ts +167 -0
- package/lib/host-control/secure-fs.ts +135 -0
- package/lib/host-control/server.ts +180 -0
- package/lib/host-control/service.ts +133 -0
- package/lib/init.ts +15 -2
- package/lib/internal/cli-route-inventory.ts +4 -2
- package/lib/internal/codex-lifecycle.ts +6 -6
- package/lib/internal/demo-promotion.ts +354 -0
- package/lib/internal/demo-transcript.ts +419 -0
- package/lib/internal/host-control.ts +28 -0
- package/lib/internal/manual-validation.ts +315 -0
- package/lib/internal/platform-pr.ts +15 -4
- package/lib/internal/release-workflow.ts +74 -82
- package/lib/internal/sandbox-control.ts +162 -1
- package/lib/internal/task-artifact.ts +14 -217
- package/lib/internal/task-create.ts +5 -5
- package/lib/internal/task-event.ts +20 -11
- package/lib/internal/task-lifecycle.ts +4 -3
- package/lib/internal/task-operation-registry.ts +111 -4
- package/lib/internal/task-review.ts +9 -54
- package/lib/internal/task-validate.ts +26 -10
- package/lib/owned-path.ts +26 -0
- package/lib/platform/check-status.ts +9 -0
- package/lib/platform/comment-safety.ts +5 -0
- package/lib/platform/completion-backfill.ts +1 -1
- package/lib/platform/github-data.ts +322 -0
- package/lib/platform/github-provider.ts +15 -20
- package/lib/platform/issue-comments.ts +21 -14
- package/lib/platform/issues.ts +5 -246
- package/lib/platform/pr-change-report.ts +7 -5
- package/lib/platform/pr-checks.ts +13 -77
- package/lib/platform/pr-summary.ts +123 -35
- package/lib/platform/pull-requests.ts +6 -173
- package/lib/platform/snapshots.ts +53 -0
- package/lib/platform/task-identities.ts +3 -14
- package/lib/platform/verification-sync.ts +150 -156
- package/lib/pr-review/evidence-grading.ts +4 -9
- package/lib/release/workflow.ts +3 -3
- package/lib/sandbox/commands/create.ts +7 -6
- package/lib/sandbox/commands/rm.ts +21 -1895
- package/lib/sandbox/control/audit.ts +253 -0
- package/lib/sandbox/control/client.ts +109 -66
- package/lib/sandbox/control/executor.ts +134 -74
- package/lib/sandbox/control/finalization-response.ts +29 -0
- package/lib/sandbox/control/identity-sentinel.ts +137 -0
- package/lib/sandbox/control/lifecycle.ts +45 -3
- package/lib/sandbox/control/native-file-lock.ts +6 -107
- package/lib/sandbox/control/protocol.ts +80 -6
- package/lib/sandbox/control/server.ts +567 -132
- package/lib/sandbox/control/state.ts +86 -0
- package/lib/sandbox/control/task-workflow.ts +95 -0
- package/lib/sandbox/control/workflow-executor.ts +92 -0
- package/lib/sandbox/index.ts +1 -2
- package/lib/sandbox/recovery.ts +28 -5
- package/lib/sandbox/removal.ts +1142 -0
- package/lib/sandbox/task-cleanup.ts +209 -0
- package/lib/sandbox/workspace-identity.ts +19 -3
- package/lib/sandbox/workspace-view.ts +17 -15
- package/lib/task/activity-intent.ts +2 -2
- package/lib/task/activity-log.ts +27 -19
- package/lib/task/artifact-command.ts +85 -0
- package/lib/task/artifact-lifecycle.ts +31 -26
- package/lib/task/artifact-name.ts +55 -0
- package/lib/task/artifact-operations.ts +34 -310
- package/lib/task/artifact-receipts.ts +3 -14
- package/lib/task/artifact-recovery.ts +519 -0
- package/lib/task/artifact-repair-intent.ts +162 -33
- package/lib/task/artifact-schema.ts +5 -34
- package/lib/task/capabilities.ts +13 -22
- package/lib/task/codex-orchestration.ts +85 -24
- package/lib/task/commit-identity.ts +31 -0
- package/lib/task/commit-operation.ts +37 -20
- package/lib/task/control-authority.ts +540 -10
- package/lib/task/control-recovery.ts +186 -0
- package/lib/task/create-service.ts +1 -10
- package/lib/task/create.ts +63 -8
- package/lib/task/decision-details.ts +3 -71
- package/lib/task/delegation-receipts.ts +73 -2
- package/lib/task/events.ts +309 -24
- package/lib/task/finalization-state.ts +11 -0
- package/lib/task/human-override.ts +8 -16
- package/lib/task/implementation-inputs.ts +3 -3
- package/lib/task/intermediate-cleanup.ts +493 -0
- package/lib/task/invalidation.ts +18 -62
- package/lib/task/ledger-intents.ts +7 -24
- package/lib/task/ledger.ts +1 -3
- package/lib/task/lifecycle-recovery.ts +691 -0
- package/lib/task/lifecycle.ts +30 -5
- package/lib/task/local-artifact-finalization.ts +244 -234
- package/lib/task/manual-validation-completion.ts +40 -0
- package/lib/task/manual-validation-evidence.ts +209 -0
- package/lib/task/manual-validation-receipt.ts +156 -0
- package/lib/task/manual-validation-shared.ts +50 -0
- package/lib/task/manual-validation-transaction.ts +304 -0
- package/lib/task/markdown.ts +70 -0
- package/lib/task/orchestration.ts +84 -19
- package/lib/task/pr-delivery-fact.ts +15 -62
- package/lib/task/qualification-audit.ts +22 -33
- package/lib/task/recovery-warning.ts +21 -0
- package/lib/task/review-artifacts.ts +1 -20
- package/lib/task/review-command.ts +24 -0
- package/lib/task/review-finalization.ts +183 -292
- package/lib/task/review-fingerprint.ts +2 -2
- package/lib/task/sections.ts +33 -54
- package/lib/task/short-id.ts +27 -5
- package/lib/task/task-execution-lock.ts +1 -1
- package/lib/task/verification-engine.ts +113 -383
- package/lib/task/verification-types.ts +15 -0
- package/lib/task/verification.ts +1 -1
- package/lib/task/workflow-command.ts +17 -0
- package/lib/task/workflow-warning-intents.ts +0 -13
- package/lib/task/workflow-warnings.ts +21 -2
- package/lib/update.ts +6 -0
- package/lib/version.ts +1 -15
- package/package.json +6 -6
- package/templates/.agents/hooks/lifecycle-delegation.js +6 -6
- package/templates/.agents/rules/create-issue.en.md +1 -1
- package/templates/.agents/rules/create-issue.zh-CN.md +1 -1
- package/templates/.agents/rules/issue-sync.en.md +4 -2
- package/templates/.agents/rules/issue-sync.zh-CN.md +4 -3
- package/templates/.agents/rules/local-artifact-repair.en.md +46 -39
- package/templates/.agents/rules/local-artifact-repair.zh-CN.md +43 -36
- package/templates/.agents/rules/testing-discipline.en.md +2 -0
- package/templates/.agents/rules/testing-discipline.zh-CN.md +2 -0
- package/templates/.agents/scripts/package.json +3 -0
- package/templates/.agents/skills/analyze-task/SKILL.en.md +6 -6
- package/templates/.agents/skills/analyze-task/SKILL.zh-CN.md +6 -6
- package/templates/.agents/skills/analyze-task/config/verify.en.json +1 -1
- package/templates/.agents/skills/analyze-task/config/verify.zh-CN.json +1 -1
- package/templates/.agents/skills/block-task/SKILL.en.md +2 -2
- package/templates/.agents/skills/block-task/SKILL.zh-CN.md +2 -2
- package/templates/.agents/skills/block-task/config/verify.json +1 -1
- package/templates/.agents/skills/cancel-task/SKILL.en.md +3 -3
- package/templates/.agents/skills/cancel-task/SKILL.zh-CN.md +3 -3
- package/templates/.agents/skills/cancel-task/config/verify.json +1 -1
- package/templates/.agents/skills/code-task/SKILL.en.md +7 -7
- package/templates/.agents/skills/code-task/SKILL.zh-CN.md +7 -7
- package/templates/.agents/skills/code-task/config/verify.en.json +1 -1
- package/templates/.agents/skills/code-task/config/verify.zh-CN.json +1 -1
- package/templates/.agents/skills/commit/reference/issue-metadata-sync.en.md +1 -1
- package/templates/.agents/skills/commit/reference/issue-metadata-sync.zh-CN.md +1 -1
- package/templates/.agents/skills/complete-manual-validation/SKILL.en.md +33 -21
- package/templates/.agents/skills/complete-manual-validation/SKILL.zh-CN.md +33 -21
- package/templates/.agents/skills/complete-manual-validation/config/verify.en.json +1 -1
- package/templates/.agents/skills/complete-manual-validation/config/verify.zh-CN.json +1 -1
- package/templates/.agents/skills/complete-manual-validation/reference/report-template.en.md +2 -0
- package/templates/.agents/skills/complete-manual-validation/reference/report-template.zh-CN.md +2 -0
- package/templates/.agents/skills/complete-manual-validation/reference/summary-update.en.md +16 -7
- package/templates/.agents/skills/complete-manual-validation/reference/summary-update.zh-CN.md +16 -7
- package/templates/.agents/skills/complete-task/SKILL.en.md +3 -3
- package/templates/.agents/skills/complete-task/SKILL.zh-CN.md +3 -3
- package/templates/.agents/skills/complete-task/config/verify.en.json +2 -2
- package/templates/.agents/skills/complete-task/config/verify.zh-CN.json +2 -2
- package/templates/.agents/skills/complete-task/reference/external-delivery.en.md +1 -1
- package/templates/.agents/skills/complete-task/reference/external-delivery.zh-CN.md +1 -1
- package/templates/.agents/skills/create-pr/SKILL.en.md +2 -2
- package/templates/.agents/skills/create-pr/SKILL.zh-CN.md +2 -2
- package/templates/.agents/skills/create-pr/config/verify.json +1 -1
- package/templates/.agents/skills/create-pr/reference/pr-body-template.en.md +2 -2
- package/templates/.agents/skills/create-pr/reference/pr-body-template.zh-CN.md +2 -2
- package/templates/.agents/skills/create-task/SKILL.en.md +5 -5
- package/templates/.agents/skills/create-task/SKILL.zh-CN.md +5 -5
- package/templates/.agents/skills/create-task/config/verify.json +1 -1
- package/templates/.agents/skills/import-issue/SKILL.en.md +8 -8
- package/templates/.agents/skills/import-issue/SKILL.zh-CN.md +8 -8
- package/templates/.agents/skills/import-issue/config/verify.json +2 -2
- package/templates/.agents/skills/plan-task/SKILL.en.md +4 -4
- package/templates/.agents/skills/plan-task/SKILL.zh-CN.md +4 -4
- package/templates/.agents/skills/plan-task/config/verify.en.json +1 -1
- package/templates/.agents/skills/plan-task/config/verify.zh-CN.json +1 -1
- package/templates/.agents/skills/release/SKILL.en.md +7 -3
- package/templates/.agents/skills/release/SKILL.zh-CN.md +7 -3
- package/templates/.agents/skills/restore-task/SKILL.en.md +2 -2
- package/templates/.agents/skills/restore-task/SKILL.zh-CN.md +2 -2
- package/templates/.agents/skills/restore-task/config/verify.json +1 -1
- package/templates/.agents/skills/review-analysis/SKILL.en.md +2 -2
- package/templates/.agents/skills/review-analysis/SKILL.zh-CN.md +2 -2
- package/templates/.agents/skills/review-analysis/config/verify.en.json +1 -1
- package/templates/.agents/skills/review-analysis/config/verify.zh-CN.json +1 -1
- package/templates/.agents/skills/review-analysis/reference/report-template.en.md +7 -7
- package/templates/.agents/skills/review-analysis/reference/report-template.zh-CN.md +6 -6
- package/templates/.agents/skills/review-code/SKILL.en.md +2 -2
- package/templates/.agents/skills/review-code/SKILL.zh-CN.md +2 -2
- package/templates/.agents/skills/review-code/config/verify.en.json +1 -1
- package/templates/.agents/skills/review-code/config/verify.zh-CN.json +1 -1
- package/templates/.agents/skills/review-code/reference/report-template.en.md +12 -12
- package/templates/.agents/skills/review-code/reference/report-template.zh-CN.md +12 -12
- package/templates/.agents/skills/review-plan/SKILL.en.md +2 -2
- package/templates/.agents/skills/review-plan/SKILL.zh-CN.md +2 -2
- package/templates/.agents/skills/review-plan/config/verify.en.json +1 -1
- package/templates/.agents/skills/review-plan/config/verify.zh-CN.json +1 -1
- package/templates/.agents/skills/review-plan/reference/report-template.en.md +7 -7
- package/templates/.agents/skills/review-plan/reference/report-template.zh-CN.md +7 -7
- package/templates/.agents/skills/review-pr/config/verify.en.json +1 -1
- package/templates/.agents/skills/review-pr/config/verify.zh-CN.json +1 -1
- package/templates/.agents/skills/review-pr/reference/evidence-grading.en.md +3 -3
- package/templates/.agents/skills/review-pr/reference/evidence-grading.zh-CN.md +3 -3
- package/templates/.agents/skills/run-manual-validation/SKILL.en.md +20 -3
- package/templates/.agents/skills/run-manual-validation/SKILL.zh-CN.md +20 -3
- package/templates/.agents/skills/run-manual-validation/config/verify.en.json +1 -1
- package/templates/.agents/skills/run-manual-validation/config/verify.zh-CN.json +1 -1
- package/templates/.agents/skills/run-manual-validation/reference/discovery-and-execution.en.md +4 -1
- package/templates/.agents/skills/run-manual-validation/reference/discovery-and-execution.zh-CN.md +4 -1
- package/templates/.agents/skills/run-manual-validation/reference/report-template.en.md +2 -0
- package/templates/.agents/skills/run-manual-validation/reference/report-template.zh-CN.md +2 -0
- package/templates/.agents/skills/run-task/SKILL.en.md +1 -1
- package/templates/.agents/skills/run-task/SKILL.zh-CN.md +1 -1
- package/templates/.agents/skills/test/SKILL.en.md +17 -6
- package/templates/.agents/skills/test/SKILL.zh-CN.md +17 -6
- package/templates/.agents/templates/task.en.md +1 -1
- package/templates/.agents/templates/task.zh-CN.md +1 -1
- package/templates/.claude/commands/import-issue.en.md +1 -1
- package/templates/.claude/commands/import-issue.zh-CN.md +1 -1
- package/templates/.claude/commands/restore-task.en.md +1 -1
- package/templates/.claude/commands/restore-task.zh-CN.md +1 -1
- package/templates/.claude/commands/run-manual-validation.en.md +1 -1
- package/templates/.claude/commands/run-manual-validation.zh-CN.md +1 -1
- package/dist/lib/platform/adapters.js +0 -56
- package/lib/platform/adapters.ts +0 -197
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
import { isCompletionEvidence, type CleanCompletionEvidence } from '../../task/orchestration.ts';
|
|
2
|
+
import { parseControlOutput } from '../../task/control-recovery.ts';
|
|
3
|
+
import { isRecoveryWarning } from '../../task/recovery-warning.ts';
|
|
1
4
|
import { execFileSync } from 'node:child_process';
|
|
2
5
|
import fs from 'node:fs';
|
|
3
6
|
import path from 'node:path';
|
|
@@ -12,6 +15,7 @@ import type {
|
|
|
12
15
|
SandboxControlPayload,
|
|
13
16
|
SandboxControlReservation,
|
|
14
17
|
SandboxControlResultEvidence,
|
|
18
|
+
SandboxControlRecoveryWarning,
|
|
15
19
|
SandboxControlStatus
|
|
16
20
|
} from './protocol.ts';
|
|
17
21
|
import {
|
|
@@ -101,6 +105,88 @@ export function reservationPath(manifest: SandboxControlManifest, requestId: str
|
|
|
101
105
|
return path.join(manifest.processingDir, requestId, 'reservation.json');
|
|
102
106
|
}
|
|
103
107
|
|
|
108
|
+
export type SandboxControlTerminalResult = Readonly<{
|
|
109
|
+
version: 1;
|
|
110
|
+
requestId: string;
|
|
111
|
+
generation: string;
|
|
112
|
+
taskId: string | null;
|
|
113
|
+
intentDigest: string;
|
|
114
|
+
targetState: string | null;
|
|
115
|
+
status: string;
|
|
116
|
+
changed: boolean | null;
|
|
117
|
+
completionEvidence: CleanCompletionEvidence | null;
|
|
118
|
+
warning?: SandboxControlRecoveryWarning | null;
|
|
119
|
+
}>;
|
|
120
|
+
|
|
121
|
+
export function terminalResultPath(manifest: SandboxControlManifest, requestId: string): string {
|
|
122
|
+
if (!/^[a-f0-9-]{16,64}$/u.test(requestId)) throw new Error('SANDBOX_CONTROL_TERMINAL_RESULT_INVALID');
|
|
123
|
+
return path.join(manifest.processingDir, requestId, 'terminal-result.json');
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
export function createSandboxControlTerminalResult(
|
|
127
|
+
manifest: SandboxControlManifest,
|
|
128
|
+
request: Readonly<{ id: string; family: string; operation?: string | null }>,
|
|
129
|
+
output: string
|
|
130
|
+
): SandboxControlTerminalResult {
|
|
131
|
+
const nested = parseControlOutput(output) ?? {};
|
|
132
|
+
const run = nested.run && typeof nested.run === 'object' && !Array.isArray(nested.run)
|
|
133
|
+
? nested.run as Record<string, unknown> : null;
|
|
134
|
+
const rawCompletion = nested.completionEvidence ?? run?.completionEvidence;
|
|
135
|
+
const operation = request.operation ?? (typeof nested.intent === 'string' ? nested.intent : null) ?? '';
|
|
136
|
+
const warning = isRecoveryWarning(nested.warning) ? nested.warning : null;
|
|
137
|
+
return {
|
|
138
|
+
version: 1,
|
|
139
|
+
requestId: request.id,
|
|
140
|
+
generation: manifest.generation,
|
|
141
|
+
taskId: manifest.taskId,
|
|
142
|
+
intentDigest: createHash('sha256').update(`${request.family}\0${operation}`, 'utf8').digest('hex'),
|
|
143
|
+
targetState: typeof nested.targetState === 'string' ? nested.targetState : null,
|
|
144
|
+
status: typeof nested.status === 'string' ? nested.status : 'completed',
|
|
145
|
+
changed: typeof nested.changed === 'boolean' ? nested.changed : null,
|
|
146
|
+
completionEvidence: isCompletionEvidence(rawCompletion) ? rawCompletion : null,
|
|
147
|
+
...(warning ? { warning } : {})
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
export function writeSandboxControlTerminalResult(
|
|
152
|
+
manifest: SandboxControlManifest,
|
|
153
|
+
request: Readonly<{ id: string; family: string; operation?: string | null }>,
|
|
154
|
+
output: string
|
|
155
|
+
): SandboxControlTerminalResult {
|
|
156
|
+
const result = createSandboxControlTerminalResult(manifest, request, output);
|
|
157
|
+
const filePath = terminalResultPath(manifest, request.id);
|
|
158
|
+
try {
|
|
159
|
+
atomicWriteJsonNoReplace(filePath, result);
|
|
160
|
+
} catch (error) {
|
|
161
|
+
if (!(error instanceof Error) || error.message !== 'SANDBOX_CONTROL_TERMINAL_ALREADY_EXISTS') throw error;
|
|
162
|
+
const existing = readSandboxControlTerminalResult(filePath);
|
|
163
|
+
if (JSON.stringify(existing) !== JSON.stringify(result)) throw new Error('SANDBOX_CONTROL_TERMINAL_RESULT_CONFLICT');
|
|
164
|
+
}
|
|
165
|
+
return readSandboxControlTerminalResult(filePath);
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
export function readSandboxControlTerminalResult(filePath: string): SandboxControlTerminalResult {
|
|
169
|
+
const value = readJsonFile(filePath) as Partial<SandboxControlTerminalResult> | null;
|
|
170
|
+
if (!value || value.version !== 1 || typeof value.requestId !== 'string'
|
|
171
|
+
|| typeof value.generation !== 'string' || (value.taskId !== null && typeof value.taskId !== 'string')
|
|
172
|
+
|| typeof value.intentDigest !== 'string' || !/^[a-f0-9]{64}$/u.test(value.intentDigest)
|
|
173
|
+
|| (value.targetState !== null && typeof value.targetState !== 'string')
|
|
174
|
+
|| typeof value.status !== 'string'
|
|
175
|
+
|| (value.changed !== null && typeof value.changed !== 'boolean')) {
|
|
176
|
+
throw new Error('SANDBOX_CONTROL_TERMINAL_RESULT_INVALID');
|
|
177
|
+
}
|
|
178
|
+
if (value.completionEvidence !== null && !isCompletionEvidence(value.completionEvidence)) {
|
|
179
|
+
throw new Error('SANDBOX_CONTROL_TERMINAL_RESULT_INVALID');
|
|
180
|
+
}
|
|
181
|
+
if (value.warning !== undefined && value.warning !== null && !isRecoveryWarning(value.warning)) {
|
|
182
|
+
throw new Error('SANDBOX_CONTROL_TERMINAL_RESULT_INVALID');
|
|
183
|
+
}
|
|
184
|
+
if (value.changed === undefined) {
|
|
185
|
+
throw new Error('SANDBOX_CONTROL_TERMINAL_RESULT_INVALID');
|
|
186
|
+
}
|
|
187
|
+
return value as SandboxControlTerminalResult;
|
|
188
|
+
}
|
|
189
|
+
|
|
104
190
|
export function readSandboxControlResultEvidence(filePath: string): SandboxControlResultEvidence {
|
|
105
191
|
assertRegularFile(filePath);
|
|
106
192
|
const raw = fs.readFileSync(filePath, 'utf8');
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { randomUUID } from 'node:crypto';
|
|
4
|
+
|
|
5
|
+
import { readStableFile, SecureFileError, writeAtomicFile } from '../../host-control/secure-fs.ts';
|
|
6
|
+
|
|
7
|
+
import { TASK_WORKFLOW_COMMANDS, TASK_WORKFLOW_OPERATIONS, type TaskWorkflowOperation, type WorkflowCommand } from '../../task/workflow-command.ts';
|
|
8
|
+
|
|
9
|
+
export type TaskWorkflowRequest = Readonly<{
|
|
10
|
+
version: 1;
|
|
11
|
+
id: string;
|
|
12
|
+
taskId: string;
|
|
13
|
+
generation: string;
|
|
14
|
+
operation: TaskWorkflowOperation;
|
|
15
|
+
args: readonly string[];
|
|
16
|
+
}>;
|
|
17
|
+
|
|
18
|
+
export function validateTaskWorkflowRequest(value: unknown): TaskWorkflowRequest {
|
|
19
|
+
if (!value || typeof value !== 'object' || Array.isArray(value)) throw new Error('TASK_WORKFLOW_REQUEST_INVALID');
|
|
20
|
+
const request = value as TaskWorkflowRequest;
|
|
21
|
+
if (Object.keys(request).sort().join(',') !== 'args,generation,id,operation,taskId,version'
|
|
22
|
+
|| request.version !== 1 || typeof request.id !== 'string' || !/^[a-f0-9-]{16,64}$/u.test(request.id)
|
|
23
|
+
|| typeof request.taskId !== 'string' || !/^TASK-\d{8}-\d{6}$/u.test(request.taskId)
|
|
24
|
+
|| typeof request.generation !== 'string' || !request.generation
|
|
25
|
+
|| !Object.hasOwn(TASK_WORKFLOW_COMMANDS, request.operation)
|
|
26
|
+
|| !Array.isArray(request.args) || request.args.length < 2 || request.args.length > 128
|
|
27
|
+
|| !request.args.every((arg) => typeof arg === 'string' && !/[\r\n]/u.test(arg))
|
|
28
|
+
|| request.args[0] !== request.taskId) throw new Error('TASK_WORKFLOW_REQUEST_INVALID');
|
|
29
|
+
const [, selector] = TASK_WORKFLOW_COMMANDS[request.operation];
|
|
30
|
+
if (selector !== null && request.args[1] !== selector) throw new Error('TASK_WORKFLOW_REQUEST_INVALID');
|
|
31
|
+
return request;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/** Preserve argv verbatim; the domain command owns option parsing and validation. */
|
|
35
|
+
export function createTaskWorkflowRequest(
|
|
36
|
+
command: WorkflowCommand | undefined,
|
|
37
|
+
args: readonly string[],
|
|
38
|
+
taskId: string,
|
|
39
|
+
generation: string
|
|
40
|
+
): TaskWorkflowRequest {
|
|
41
|
+
const operation = TASK_WORKFLOW_OPERATIONS.find((key) => {
|
|
42
|
+
const [name, selector] = TASK_WORKFLOW_COMMANDS[key];
|
|
43
|
+
return name === command && (selector === null || selector === args[1]);
|
|
44
|
+
});
|
|
45
|
+
if (!operation) throw new Error('TASK_WORKFLOW_OPERATION_UNSUPPORTED');
|
|
46
|
+
return validateTaskWorkflowRequest({ version: 1, id: randomUUID(), taskId, generation, operation, args: [...args] });
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
export function canonicalArtifactName(value: string): boolean {
|
|
50
|
+
return /^(?:analysis|plan|code|review-analysis|review-plan|review-code)(?:-r[1-9]\d*)?\.md$/u.test(value)
|
|
51
|
+
&& path.basename(value) === value;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
function assertTaskArtifactDirectory(directory: string): string {
|
|
55
|
+
const resolved = path.resolve(directory);
|
|
56
|
+
let stat: fs.Stats;
|
|
57
|
+
try {
|
|
58
|
+
stat = fs.lstatSync(resolved);
|
|
59
|
+
} catch {
|
|
60
|
+
throw new SecureFileError('TASK_ARTIFACT_WRITE_DENIED', 'task directory is unavailable');
|
|
61
|
+
}
|
|
62
|
+
if (!stat.isDirectory() || stat.isSymbolicLink()) {
|
|
63
|
+
throw new SecureFileError('TASK_ARTIFACT_WRITE_DENIED', 'task directory must be a real directory');
|
|
64
|
+
}
|
|
65
|
+
return resolved;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
export async function readTaskArtifact(
|
|
69
|
+
taskDir: string,
|
|
70
|
+
input: Readonly<{
|
|
71
|
+
artifact: string;
|
|
72
|
+
expectedSha256?: string;
|
|
73
|
+
}>
|
|
74
|
+
): Promise<Readonly<{ artifact: string; bytes: Buffer; sha256: string }>> {
|
|
75
|
+
if (!canonicalArtifactName(input.artifact)) throw new SecureFileError('TASK_ARTIFACT_WRITE_DENIED', 'artifact must be a canonical top-level basename');
|
|
76
|
+
const root = assertTaskArtifactDirectory(taskDir);
|
|
77
|
+
const candidate = path.join(root, input.artifact);
|
|
78
|
+
if (path.dirname(candidate) !== root) throw new SecureFileError('TASK_ARTIFACT_WRITE_DENIED', 'artifact escapes task directory');
|
|
79
|
+
const stable = await readStableFile(candidate, {
|
|
80
|
+
maxBytes: 1024 * 1024,
|
|
81
|
+
...(input.expectedSha256 ? { expectedSha256: input.expectedSha256 } : {})
|
|
82
|
+
});
|
|
83
|
+
return { artifact: input.artifact, bytes: stable.bytes, sha256: stable.sha256 };
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
export async function writeTaskArtifact(
|
|
87
|
+
taskDir: string,
|
|
88
|
+
artifact: Readonly<{ artifact: string; bytes: Buffer; expectedSha256?: string }>
|
|
89
|
+
): Promise<void> {
|
|
90
|
+
if (!canonicalArtifactName(artifact.artifact)) throw new SecureFileError('TASK_ARTIFACT_WRITE_DENIED', 'artifact must be a canonical top-level basename');
|
|
91
|
+
const root = assertTaskArtifactDirectory(taskDir);
|
|
92
|
+
const target = path.join(root, artifact.artifact);
|
|
93
|
+
if (path.dirname(target) !== root) throw new SecureFileError('TASK_ARTIFACT_WRITE_DENIED', 'artifact escapes task directory');
|
|
94
|
+
await writeAtomicFile(target, artifact.bytes, 0o600, artifact.expectedSha256);
|
|
95
|
+
}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { TASK_WORKFLOW_COMMANDS } from '../../task/workflow-command.ts';
|
|
2
|
+
|
|
3
|
+
import { parseArtifactCommand, executeArtifactCommand } from '../../task/artifact-command.ts';
|
|
4
|
+
import { parseReviewCommand } from '../../task/review-command.ts';
|
|
5
|
+
import { prepareLocalArtifact, commitLocalArtifactProvenance } from '../../task/local-artifact-finalization.ts';
|
|
6
|
+
import { prepareReviewSummaryCandidate, commitReviewSummaryProvenance } from '../../task/review-finalization.ts';
|
|
7
|
+
import { withTaskExecutionLock } from '../../task/task-execution-lock.ts';
|
|
8
|
+
import { dispatchHostControlCommand } from '../../host-control/command.ts';
|
|
9
|
+
import { assertSandboxTaskSource } from '../workspace-view.ts';
|
|
10
|
+
import { appendDiagnosticAudit } from './audit.ts';
|
|
11
|
+
import {
|
|
12
|
+
readTaskArtifact, type TaskWorkflowRequest
|
|
13
|
+
} from './task-workflow.ts';
|
|
14
|
+
import type { SandboxControlManifest } from './protocol.ts';
|
|
15
|
+
import type { SandboxControlExecutionResult } from './executor.ts';
|
|
16
|
+
import type { LifecycleRecoveryAttestationV1 } from '../../task/control-authority.ts';
|
|
17
|
+
import { applyTaskEvent } from '../../task/events.ts';
|
|
18
|
+
import { parseTaskEventRequest } from '../../internal/task-event.ts';
|
|
19
|
+
|
|
20
|
+
function executionResult(result: Record<string, unknown>): SandboxControlExecutionResult {
|
|
21
|
+
return { exitCode: result.status === 'failed' || result.status === 'refused' ? 1 : 0, stdout: `${JSON.stringify(result)}\n`, stderr: '' };
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/** The broker already authorized this host executor; domain operations own validation. */
|
|
25
|
+
export async function executeTaskWorkflow(
|
|
26
|
+
manifest: SandboxControlManifest,
|
|
27
|
+
request: TaskWorkflowRequest,
|
|
28
|
+
lifecycleRecoveryAttestation: LifecycleRecoveryAttestationV1 | null = null
|
|
29
|
+
): Promise<SandboxControlExecutionResult> {
|
|
30
|
+
let publicationStarted = false;
|
|
31
|
+
try {
|
|
32
|
+
const taskDir = assertSandboxTaskSource(manifest.repoRoot, request.taskId);
|
|
33
|
+
const [command] = TASK_WORKFLOW_COMMANDS[request.operation];
|
|
34
|
+
if (request.operation === 'event') {
|
|
35
|
+
const eventRequest = parseTaskEventRequest(request.args);
|
|
36
|
+
const boundEventRequest = lifecycleRecoveryAttestation && eventRequest.requestId === undefined
|
|
37
|
+
? { ...eventRequest, requestId: lifecycleRecoveryAttestation.lifecycleRequestId }
|
|
38
|
+
: eventRequest;
|
|
39
|
+
const result = applyTaskEvent(boundEventRequest, {
|
|
40
|
+
repoRoot: manifest.repoRoot,
|
|
41
|
+
lifecycleRecoveryAttestation,
|
|
42
|
+
deferLifecycleRecoveryConsumption: true
|
|
43
|
+
});
|
|
44
|
+
return executionResult(result);
|
|
45
|
+
}
|
|
46
|
+
if (command !== 'task-artifact' && command !== 'task-review') {
|
|
47
|
+
publicationStarted = true;
|
|
48
|
+
// Inherit this executor's process group so its existing recovery owns the worker too.
|
|
49
|
+
const result = await dispatchHostControlCommand({
|
|
50
|
+
operation: command, payload: { workingDirectory: manifest.repoRoot, args: request.args }
|
|
51
|
+
});
|
|
52
|
+
return result;
|
|
53
|
+
}
|
|
54
|
+
const input = command === 'task-artifact' ? parseArtifactCommand(request.args) : parseReviewCommand(request.args);
|
|
55
|
+
if (command === 'task-artifact' && 'operation' in input && input.operation === 'inspect') {
|
|
56
|
+
return executionResult(executeArtifactCommand(input, { repoRoot: manifest.repoRoot }));
|
|
57
|
+
}
|
|
58
|
+
if ('operation' in input && input.operation === 'init') {
|
|
59
|
+
return executionResult(executeArtifactCommand(input, { repoRoot: manifest.repoRoot, artifactDir: taskDir }));
|
|
60
|
+
}
|
|
61
|
+
return await withTaskExecutionLock(manifest.repoRoot, request.taskId, `sandbox-control.${request.operation}`, async () => {
|
|
62
|
+
const artifact = await readTaskArtifact(taskDir, { artifact: input.artifact });
|
|
63
|
+
const content = artifact.bytes.toString('utf8');
|
|
64
|
+
let result: Record<string, unknown>;
|
|
65
|
+
if ('operation' in input) {
|
|
66
|
+
const { family } = input;
|
|
67
|
+
if (family !== 'analysis' && family !== 'plan' && family !== 'code') throw new Error('ARTIFACT_IDENTITY_INVALID');
|
|
68
|
+
const local = { taskRef: request.taskId, family, artifact: input.artifact, repoRoot: manifest.repoRoot, recoveryId: input.recoveryId, lockAlreadyHeld: true } as const;
|
|
69
|
+
const prepared = prepareLocalArtifact(local, content, lifecycleRecoveryAttestation ?? undefined);
|
|
70
|
+
if (prepared.result.status === 'failed') return executionResult(commitLocalArtifactProvenance(prepared));
|
|
71
|
+
publicationStarted = true;
|
|
72
|
+
result = commitLocalArtifactProvenance(prepared);
|
|
73
|
+
} else {
|
|
74
|
+
if (input.overrideTicket) throw new Error('TASK_WORKFLOW_OVERRIDE_UNSUPPORTED');
|
|
75
|
+
const prepared = prepareReviewSummaryCandidate(input, content, { repoRoot: manifest.repoRoot, lockAlreadyHeld: true, startRecovery: true });
|
|
76
|
+
if (input.dryRun || prepared.result.status === 'planned') return executionResult(prepared.result);
|
|
77
|
+
if (prepared.result.status === 'failed') return executionResult(commitReviewSummaryProvenance(prepared, manifest.repoRoot));
|
|
78
|
+
publicationStarted = true;
|
|
79
|
+
result = commitReviewSummaryProvenance(prepared, manifest.repoRoot);
|
|
80
|
+
}
|
|
81
|
+
if (result.status !== 'failed') appendDiagnosticAudit(manifest, 'task-workflow-artifact-finalized', {
|
|
82
|
+
requestId: request.id, sandboxTaskId: request.taskId, workflowOperation: request.operation,
|
|
83
|
+
artifact: input.artifact, sha256: result.artifactSha256 as string, semanticDigest: result.semanticDigest as string
|
|
84
|
+
});
|
|
85
|
+
return executionResult({ ...result, changed: true });
|
|
86
|
+
});
|
|
87
|
+
} catch (error) {
|
|
88
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
89
|
+
const code = (error as { code?: string })?.code ?? /^([A-Z][A-Z0-9_]+)/u.exec(message)?.[1] ?? 'TASK_WORKFLOW_REQUEST_INVALID';
|
|
90
|
+
return executionResult({ status: 'failed', changed: publicationStarted ? null : false, error: { code, message } });
|
|
91
|
+
}
|
|
92
|
+
}
|
package/lib/sandbox/index.ts
CHANGED
|
@@ -20,8 +20,7 @@ Commands:
|
|
|
20
20
|
rm <branch | TASK-id> | --unbound | --purge
|
|
21
21
|
Remove one sandbox; use a full TASK-id for task-bound
|
|
22
22
|
cleanup and a branch for branch-only cleanup. --unbound
|
|
23
|
-
removes
|
|
24
|
-
active, blocked, and archive tasks are protected.
|
|
23
|
+
removes discovered task-bound and branch-only sandboxes.
|
|
25
24
|
start [--recreate] <branch | TASK-id | N>
|
|
26
25
|
Verify or recover an existing sandbox container;
|
|
27
26
|
optionally replace only the container on failure
|
package/lib/sandbox/recovery.ts
CHANGED
|
@@ -60,9 +60,10 @@ import {
|
|
|
60
60
|
type BrokerOwner
|
|
61
61
|
} from './control/lifecycle.ts';
|
|
62
62
|
import {
|
|
63
|
-
appendSandboxControlAudit,
|
|
64
63
|
readSandboxControlStatus
|
|
65
64
|
} from './control/state.ts';
|
|
65
|
+
import { validateSandboxControlIdentity } from './control/identity-sentinel.ts';
|
|
66
|
+
import { appendDiagnosticAudit as appendControlDiagnosticAudit } from './control/audit.ts';
|
|
66
67
|
import { inspectSandboxControlContainer } from './control/container-identity.ts';
|
|
67
68
|
import {
|
|
68
69
|
SANDBOX_CONTROL_FUTURE_SKEW_MS,
|
|
@@ -224,6 +225,17 @@ export async function startSandboxControlBroker(repoRoot: string, manifestPath:
|
|
|
224
225
|
const internalCli = path.resolve(directory, '..', '..', 'bin', `internal-cli${extension}`);
|
|
225
226
|
const manifest = readSandboxControlManifest(manifestPath);
|
|
226
227
|
const root = path.dirname(manifestPath);
|
|
228
|
+
const identity = validateSandboxControlIdentity({
|
|
229
|
+
publicStatusDir: manifest.publicStatusDir,
|
|
230
|
+
root,
|
|
231
|
+
mode: manifest.mode,
|
|
232
|
+
taskId: manifest.taskId,
|
|
233
|
+
generation: manifest.generation,
|
|
234
|
+
controlRootId: manifest.controlRootId
|
|
235
|
+
});
|
|
236
|
+
if (identity.state !== 'valid') {
|
|
237
|
+
throw new Error(`SANDBOX_CONTROL_IDENTITY_${identity.state.replaceAll('-', '_').toUpperCase()}`);
|
|
238
|
+
}
|
|
227
239
|
if (isSandboxControlRootQuiescing(root)) throw new Error('SANDBOX_CONTROL_QUIESCING');
|
|
228
240
|
const brokerPath = path.join(root, 'broker.json');
|
|
229
241
|
let brokerSnapshot: string | null = null;
|
|
@@ -296,8 +308,8 @@ export async function startSandboxControlBroker(repoRoot: string, manifestPath:
|
|
|
296
308
|
}
|
|
297
309
|
}
|
|
298
310
|
if (replacedBrokerRecord) {
|
|
299
|
-
|
|
300
|
-
|
|
311
|
+
appendControlDiagnosticAudit(manifest, 'broker-observed-crash');
|
|
312
|
+
appendControlDiagnosticAudit(manifest, 'broker-restart');
|
|
301
313
|
}
|
|
302
314
|
child = spawn(
|
|
303
315
|
process.execPath,
|
|
@@ -338,6 +350,17 @@ async function ensureSandboxControlBroker(params: {
|
|
|
338
350
|
});
|
|
339
351
|
if (!fs.existsSync(control.manifestPath)) return;
|
|
340
352
|
const validatedManifest = readSandboxControlManifest(control.manifestPath);
|
|
353
|
+
const identity = validateSandboxControlIdentity({
|
|
354
|
+
publicStatusDir: validatedManifest.publicStatusDir,
|
|
355
|
+
root: control.root,
|
|
356
|
+
mode: validatedManifest.mode,
|
|
357
|
+
taskId: validatedManifest.taskId,
|
|
358
|
+
generation: validatedManifest.generation,
|
|
359
|
+
controlRootId: validatedManifest.controlRootId
|
|
360
|
+
});
|
|
361
|
+
if (identity.state !== 'valid') {
|
|
362
|
+
throw new Error(`SANDBOX_CONTROL_IDENTITY_${identity.state.replaceAll('-', '_').toUpperCase()}`);
|
|
363
|
+
}
|
|
341
364
|
const containerObservation = await inspectSandboxControlContainer(validatedManifest);
|
|
342
365
|
if (containerObservation.state === 'unknown') {
|
|
343
366
|
throw new Error(`SANDBOX_CONTROL_CONTAINER_UNKNOWN: ${containerObservation.reason}`);
|
|
@@ -749,7 +772,7 @@ function expectedMounts(params: {
|
|
|
749
772
|
? {}
|
|
750
773
|
: {
|
|
751
774
|
runtimeDir: control.runtimeDir,
|
|
752
|
-
taskSources: taskSources
|
|
775
|
+
taskSources: taskSources!.accessiblePaths,
|
|
753
776
|
taskId: taskId!
|
|
754
777
|
})
|
|
755
778
|
}).map((mount) => ({
|
|
@@ -758,7 +781,7 @@ function expectedMounts(params: {
|
|
|
758
781
|
hostPaths: mount.hostPaths,
|
|
759
782
|
...(taskSources !== null && taskId !== null
|
|
760
783
|
&& mount.containerPath === `/workspace/.agents/workspace/active/${taskId}`
|
|
761
|
-
? { sourceAccessiblePaths: taskSources
|
|
784
|
+
? { sourceAccessiblePaths: taskSources!.accessiblePaths }
|
|
762
785
|
: {}),
|
|
763
786
|
expectedRW: !mount.readOnly
|
|
764
787
|
}));
|