@fitlab-ai/agent-infra 0.12.0 → 0.12.2
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 +0 -2
- package/README.zh-CN.md +0 -2
- package/dist/bin/internal-cli.js +2 -17
- package/dist/lib/agent-clients/adapter.js +0 -13
- package/dist/lib/agent-clients/adapters/antigravity-cli.js +0 -5
- package/dist/lib/agent-clients/adapters/claude-code-credentials.js +0 -17
- package/dist/lib/agent-clients/adapters/claude-code.js +0 -9
- package/dist/lib/agent-clients/adapters/codex.js +0 -52
- package/dist/lib/agent-clients/adapters/opencode.js +0 -5
- package/dist/lib/agent-clients/adapters/traecli.js +0 -5
- package/dist/lib/agent-clients/config.js +19 -54
- package/dist/lib/agent-clients/registry.js +1 -12
- package/dist/lib/agent-clients/schema.js +0 -18
- package/dist/lib/agent-clients/tokens.js +1 -2
- package/dist/lib/agent-clients/types.js +0 -1
- package/dist/lib/decide.js +2 -0
- package/dist/lib/git/worktree-identity.js +1 -9
- package/dist/lib/internal/agent-client.js +2 -62
- package/dist/lib/internal/cli-route-inventory.js +1 -5
- package/dist/lib/internal/manual-validation.js +29 -27
- package/dist/lib/internal/platform-comment.js +56 -7
- package/dist/lib/internal/task-create.js +1 -1
- package/dist/lib/internal/task-event.js +1 -8
- package/dist/lib/internal/task-finalization.js +0 -1
- package/dist/lib/internal/task-lifecycle.js +2 -2
- package/dist/lib/internal/task-operation-registry.js +4 -20
- package/dist/lib/internal/task-review.js +4 -4
- package/dist/lib/platform/comment-safety.js +1 -7
- package/dist/lib/platform/in-label-sync.js +1 -14
- package/dist/lib/platform/issue-comments.js +373 -282
- package/dist/lib/platform/issue-summary-content.js +112 -0
- package/dist/lib/platform/issues.js +1 -1
- package/dist/lib/platform/operation-coordinator.js +4 -2
- package/dist/lib/platform/pr-change-report.js +176 -30
- package/dist/lib/platform/pr-checks.js +2 -8
- package/dist/lib/platform/pr-summary-content.js +54 -0
- package/dist/lib/platform/pr-summary.js +318 -284
- package/dist/lib/platform/provider-validation.js +0 -20
- package/dist/lib/platform/pull-requests.js +73 -84
- package/dist/lib/platform/releases.js +1 -43
- package/dist/lib/platform/summary-content-pipeline.js +18 -0
- package/dist/lib/platform/verification-required.js +0 -2
- package/dist/lib/platform/verification-sync.js +1 -79
- package/dist/lib/process-data/normalize.js +1 -185
- package/dist/lib/process-data/privacy.js +1 -16
- package/dist/lib/process-data/sources.js +2 -279
- package/dist/lib/render.js +0 -12
- package/dist/lib/run/index.js +15 -10
- package/dist/lib/run/skills.js +0 -3
- package/dist/lib/sandbox/commands/create.js +40 -53
- package/dist/lib/sandbox/commands/list-running.js +0 -18
- package/dist/lib/sandbox/commands/start.js +7 -8
- package/dist/lib/sandbox/constants.js +0 -6
- package/dist/lib/sandbox/control/client.js +0 -1
- package/dist/lib/sandbox/control/container-identity.js +1 -16
- package/dist/lib/sandbox/control/executor.js +0 -4
- package/dist/lib/sandbox/control/identity-sentinel.js +0 -7
- package/dist/lib/sandbox/control/lifecycle.js +21 -37
- package/dist/lib/sandbox/control/native-file-lock.js +0 -3
- package/dist/lib/sandbox/control/server.js +18 -38
- package/dist/lib/sandbox/control/state.js +1 -9
- package/dist/lib/sandbox/dockerfile.js +0 -6
- package/dist/lib/sandbox/engine.js +0 -14
- package/dist/lib/sandbox/engines/docker-exact-discovery.js +1 -4
- package/dist/lib/sandbox/engines/wsl2-paths.js +0 -3
- package/dist/lib/sandbox/recovery.js +24 -26
- package/dist/lib/sandbox/removal.js +67 -518
- package/dist/lib/sandbox/task-resolver.js +0 -41
- package/dist/lib/sandbox/tools.js +1 -4
- package/dist/lib/sandbox/workspace-view.js +1 -2
- package/dist/lib/server/display.js +0 -6
- package/dist/lib/task/activity-intent.js +45 -40
- package/dist/lib/task/activity-log.js +9 -16
- package/dist/lib/task/artifact-command.js +1 -1
- package/dist/lib/task/artifact-lifecycle.js +61 -63
- package/dist/lib/task/artifact-name.js +0 -6
- package/dist/lib/task/artifact-operations.js +3 -3
- package/dist/lib/task/capabilities.js +4 -5
- package/dist/lib/task/commands/log.js +0 -6
- package/dist/lib/task/commands/status.js +17 -60
- package/dist/lib/task/commit-operation.js +28 -39
- package/dist/lib/task/completion-facts.js +56 -43
- package/dist/lib/task/control-authority.js +23 -256
- package/dist/lib/task/control-recovery.js +3 -5
- package/dist/lib/task/create.js +2 -4
- package/dist/lib/task/decision-intents.js +8 -9
- package/dist/lib/task/delivery-target.js +1 -40
- package/dist/lib/task/events.js +84 -107
- package/dist/lib/task/finalization.js +60 -15
- package/dist/lib/task/ledger-intents.js +1 -1
- package/dist/lib/task/lifecycle-execution.js +38 -33
- package/dist/lib/task/lifecycle.js +49 -41
- package/dist/lib/task/local-artifact-finalization.js +1 -4
- package/dist/lib/task/manual-validation-evidence.js +1 -37
- package/dist/lib/task/platform-operation-recovery.js +151 -108
- package/dist/lib/task/pr-delivery-fact.js +2 -5
- package/dist/lib/task/qualification-confirmation.js +5 -7
- package/dist/lib/task/resolve-ref.js +1 -25
- package/dist/lib/task/review-command.js +2 -2
- package/dist/lib/task/review-finalization.js +1 -21
- package/dist/lib/task/review-fingerprint.js +0 -4
- package/dist/lib/task/secure-fs.js +0 -56
- package/dist/lib/task/short-id.js +1 -39
- package/dist/lib/task/skill-scope.js +0 -1
- package/dist/lib/task/verification-engine.js +58 -282
- package/dist/lib/task/verification.js +6 -3
- package/dist/lib/task/write.js +11 -1
- package/lib/agent-clients/adapter.ts +0 -76
- package/lib/agent-clients/adapters/antigravity-cli.ts +0 -5
- package/lib/agent-clients/adapters/claude-code-credentials.ts +0 -19
- package/lib/agent-clients/adapters/claude-code.ts +0 -9
- package/lib/agent-clients/adapters/codex.ts +0 -56
- package/lib/agent-clients/adapters/opencode.ts +0 -5
- package/lib/agent-clients/adapters/traecli.ts +0 -5
- package/lib/agent-clients/config.ts +20 -61
- package/lib/agent-clients/registry.ts +1 -34
- package/lib/agent-clients/schema.ts +0 -18
- package/lib/agent-clients/tokens.ts +1 -2
- package/lib/agent-clients/types.ts +0 -15
- package/lib/decide.ts +1 -0
- package/lib/git/worktree-identity.ts +0 -10
- package/lib/internal/agent-client.ts +2 -70
- package/lib/internal/cli-route-inventory.ts +1 -4
- package/lib/internal/manual-validation.ts +28 -27
- package/lib/internal/platform-comment.ts +46 -4
- package/lib/internal/task-create.ts +0 -1
- package/lib/internal/task-event.ts +1 -5
- package/lib/internal/task-finalization.ts +0 -1
- package/lib/internal/task-lifecycle.ts +3 -5
- package/lib/internal/task-operation-registry.ts +3 -19
- package/lib/internal/task-review.ts +4 -4
- package/lib/platform/comment-safety.ts +0 -10
- package/lib/platform/github-provider.ts +0 -2
- package/lib/platform/in-label-sync.ts +0 -16
- package/lib/platform/issue-comments.ts +478 -301
- package/lib/platform/issue-summary-content.ts +132 -0
- package/lib/platform/issues.ts +0 -2
- package/lib/platform/operation-coordinator.ts +4 -2
- package/lib/platform/pr-change-report.ts +165 -25
- package/lib/platform/pr-checks.ts +1 -10
- package/lib/platform/pr-review.ts +1 -1
- package/lib/platform/pr-summary-content.ts +60 -0
- package/lib/platform/pr-summary.ts +364 -257
- package/lib/platform/provider-bridge.ts +0 -1
- package/lib/platform/provider-loader.ts +1 -5
- package/lib/platform/provider-validation.ts +1 -49
- package/lib/platform/pull-requests.ts +64 -99
- package/lib/platform/releases.ts +1 -40
- package/lib/platform/summary-content-pipeline.ts +23 -0
- package/lib/platform/verification-required.ts +0 -2
- package/lib/platform/verification-sync.ts +0 -94
- package/lib/process-data/normalize.ts +1 -186
- package/lib/process-data/privacy.ts +2 -19
- package/lib/process-data/sources.ts +3 -283
- package/lib/render.ts +0 -15
- package/lib/run/index.ts +13 -7
- package/lib/run/skills.ts +0 -4
- package/lib/sandbox/commands/create.ts +37 -74
- package/lib/sandbox/commands/list-running.ts +0 -19
- package/lib/sandbox/commands/start.ts +7 -10
- package/lib/sandbox/constants.ts +0 -8
- package/lib/sandbox/control/client.ts +0 -1
- package/lib/sandbox/control/container-identity.ts +1 -16
- package/lib/sandbox/control/executor.ts +1 -5
- package/lib/sandbox/control/identity-sentinel.ts +0 -8
- package/lib/sandbox/control/lifecycle.ts +18 -51
- package/lib/sandbox/control/native-file-lock.ts +0 -8
- package/lib/sandbox/control/protocol.ts +0 -2
- package/lib/sandbox/control/server.ts +13 -39
- package/lib/sandbox/control/state.ts +1 -10
- package/lib/sandbox/dockerfile.ts +0 -11
- package/lib/sandbox/engine.ts +0 -17
- package/lib/sandbox/engines/docker-exact-discovery.ts +1 -5
- package/lib/sandbox/engines/wsl2-paths.ts +0 -4
- package/lib/sandbox/recovery.ts +24 -26
- package/lib/sandbox/removal.ts +58 -687
- package/lib/sandbox/shell.ts +1 -1
- package/lib/sandbox/task-resolver.ts +0 -48
- package/lib/sandbox/tools.ts +1 -5
- package/lib/sandbox/workspace-view.ts +2 -4
- package/lib/server/display.ts +0 -14
- package/lib/server/process-control.ts +1 -1
- package/lib/task/activity-intent.ts +36 -44
- package/lib/task/activity-log.ts +9 -22
- package/lib/task/artifact-command.ts +1 -1
- package/lib/task/artifact-lifecycle.ts +58 -67
- package/lib/task/artifact-name.ts +0 -7
- package/lib/task/artifact-operations.ts +3 -3
- package/lib/task/capabilities.ts +5 -6
- package/lib/task/commands/log.ts +0 -7
- package/lib/task/commands/status.ts +14 -79
- package/lib/task/commit-operation.ts +29 -51
- package/lib/task/completion-facts.ts +45 -42
- package/lib/task/control-authority.ts +27 -317
- package/lib/task/control-recovery.ts +2 -5
- package/lib/task/create.ts +2 -5
- package/lib/task/decision-intents.ts +5 -5
- package/lib/task/delivery-target.ts +0 -40
- package/lib/task/events.ts +89 -123
- package/lib/task/finalization.ts +52 -15
- package/lib/task/ledger-intents.ts +1 -1
- package/lib/task/lifecycle-execution.ts +37 -89
- package/lib/task/lifecycle.ts +48 -44
- package/lib/task/local-artifact-finalization.ts +0 -7
- package/lib/task/manual-validation-evidence.ts +1 -47
- package/lib/task/platform-operation-recovery.ts +117 -104
- package/lib/task/pr-delivery-fact.ts +2 -11
- package/lib/task/qualification-confirmation.ts +6 -6
- package/lib/task/resolve-ref.ts +0 -23
- package/lib/task/review-command.ts +2 -2
- package/lib/task/review-finalization.ts +1 -27
- package/lib/task/review-fingerprint.ts +0 -8
- package/lib/task/secure-fs.ts +0 -42
- package/lib/task/short-id.ts +0 -43
- package/lib/task/skill-scope.ts +0 -1
- package/lib/task/verification-engine.ts +56 -287
- package/lib/task/verification.ts +5 -5
- package/lib/task/write.ts +12 -1
- package/package.json +2 -2
- package/templates/.agents/README.en.md +1 -3
- package/templates/.agents/README.zh-CN.md +0 -2
- package/templates/.agents/rules/README.en.md +0 -1
- package/templates/.agents/rules/README.zh-CN.md +0 -1
- package/templates/.agents/rules/commit-and-pr.en.md +1 -1
- package/templates/.agents/rules/commit-and-pr.zh-CN.md +1 -1
- package/templates/.agents/rules/no-mid-flow-questions.en.md +0 -10
- package/templates/.agents/rules/no-mid-flow-questions.zh-CN.md +0 -10
- package/templates/.agents/rules/pr-sync.en.md +4 -2
- package/templates/.agents/rules/pr-sync.zh-CN.md +6 -9
- package/templates/.agents/rules/task-management.en.md +3 -3
- package/templates/.agents/rules/task-management.zh-CN.md +3 -3
- package/templates/.agents/skills/analyze-task/SKILL.en.md +3 -3
- package/templates/.agents/skills/analyze-task/SKILL.zh-CN.md +3 -3
- package/templates/.agents/skills/cancel-task/SKILL.en.md +2 -2
- package/templates/.agents/skills/cancel-task/SKILL.zh-CN.md +2 -2
- package/templates/.agents/skills/code-task/SKILL.en.md +2 -2
- package/templates/.agents/skills/code-task/SKILL.zh-CN.md +4 -4
- package/templates/.agents/skills/commit/SKILL.en.md +2 -2
- package/templates/.agents/skills/commit/SKILL.zh-CN.md +2 -2
- package/templates/.agents/skills/commit/reference/commit-orchestration.en.md +6 -6
- package/templates/.agents/skills/commit/reference/commit-orchestration.zh-CN.md +6 -6
- package/templates/.agents/skills/commit/reference/pr-summary-sync.en.md +1 -1
- package/templates/.agents/skills/commit/reference/pr-summary-sync.zh-CN.md +1 -1
- package/templates/.agents/skills/complete-manual-validation/reference/summary-update.en.md +2 -2
- package/templates/.agents/skills/complete-manual-validation/reference/summary-update.zh-CN.md +2 -2
- package/templates/.agents/skills/complete-task/SKILL.en.md +10 -25
- package/templates/.agents/skills/complete-task/SKILL.zh-CN.md +11 -26
- package/templates/.agents/skills/create-pr/SKILL.en.md +1 -1
- package/templates/.agents/skills/create-pr/SKILL.zh-CN.md +1 -1
- package/templates/.agents/skills/create-pr/reference/change-report.en.md +9 -2
- package/templates/.agents/skills/create-pr/reference/change-report.zh-CN.md +9 -2
- package/templates/.agents/skills/create-pr/reference/comment-publish.en.md +2 -2
- package/templates/.agents/skills/create-pr/reference/comment-publish.zh-CN.md +2 -2
- package/templates/.agents/skills/create-task/SKILL.en.md +0 -18
- package/templates/.agents/skills/create-task/SKILL.zh-CN.md +0 -18
- package/templates/.agents/skills/plan-task/SKILL.en.md +2 -2
- package/templates/.agents/skills/plan-task/SKILL.zh-CN.md +2 -2
- package/templates/.agents/skills/review-analysis/SKILL.en.md +3 -3
- package/templates/.agents/skills/review-analysis/SKILL.zh-CN.md +3 -3
- package/templates/.agents/skills/review-code/SKILL.en.md +5 -5
- package/templates/.agents/skills/review-code/SKILL.zh-CN.md +5 -5
- package/templates/.agents/skills/review-plan/SKILL.en.md +3 -3
- package/templates/.agents/skills/review-plan/SKILL.zh-CN.md +3 -3
- package/templates/.agents/skills/review-pr/SKILL.en.md +4 -4
- package/templates/.agents/skills/review-pr/SKILL.zh-CN.md +4 -4
- package/templates/.agents/skills/run-manual-validation/SKILL.en.md +1 -1
- package/templates/.agents/skills/run-manual-validation/SKILL.zh-CN.md +1 -1
- package/templates/.agents/skills/update-agent-infra/scripts/sync-templates.js +3 -75
- package/templates/.agents/skills/watch-pr/SKILL.en.md +1 -1
- package/templates/.agents/skills/watch-pr/SKILL.zh-CN.md +1 -1
- package/templates/.agents/skills/watch-pr/reference/monitor-and-heal.en.md +3 -3
- package/templates/.agents/skills/watch-pr/reference/monitor-and-heal.zh-CN.md +3 -3
- package/templates/.agents/templates/task.en.md +1 -0
- package/templates/.agents/templates/task.zh-CN.md +1 -0
- package/templates/.claude/settings.json +0 -24
- package/templates/.codex/hooks.json +0 -50
- package/dist/lib/agent-clients/adapters/codex-lifecycle/app-server.js +0 -582
- package/dist/lib/agent-clients/adapters/codex-lifecycle/binding.js +0 -114
- package/dist/lib/agent-clients/adapters/codex-lifecycle/build-identity.js +0 -237
- package/dist/lib/agent-clients/adapters/codex-lifecycle/cli.js +0 -443
- package/dist/lib/agent-clients/adapters/codex-lifecycle/evidence.js +0 -236
- package/dist/lib/agent-clients/adapters/codex-lifecycle/recovery.js +0 -292
- package/dist/lib/agent-clients/adapters/codex-lifecycle/store.js +0 -267
- package/dist/lib/agent-clients/adapters/codex-orchestration.js +0 -466
- package/dist/lib/internal/task-orchestration.js +0 -71
- package/dist/lib/platform/verification.js +0 -6
- package/dist/lib/run/prompt.js +0 -2
- package/dist/lib/sandbox/engines/authority.js +0 -289
- package/dist/lib/task/delegation-receipts.js +0 -410
- package/dist/lib/task/orchestration.js +0 -1233
- package/dist/lib/task/verification-checks.js +0 -9
- package/dist/lib/task/workspace-snapshot.js +0 -121
- package/dist/lifecycle-build-manifest.json +0 -6
- package/lib/agent-clients/adapters/codex-lifecycle/app-server.ts +0 -688
- package/lib/agent-clients/adapters/codex-lifecycle/binding.ts +0 -147
- package/lib/agent-clients/adapters/codex-lifecycle/build-identity.ts +0 -349
- package/lib/agent-clients/adapters/codex-lifecycle/cli.ts +0 -506
- package/lib/agent-clients/adapters/codex-lifecycle/evidence.ts +0 -385
- package/lib/agent-clients/adapters/codex-lifecycle/manifest-files.json +0 -41
- package/lib/agent-clients/adapters/codex-lifecycle/recovery.ts +0 -418
- package/lib/agent-clients/adapters/codex-lifecycle/store.ts +0 -354
- package/lib/agent-clients/adapters/codex-orchestration.ts +0 -630
- package/lib/internal/task-orchestration.ts +0 -74
- package/lib/platform/verification.ts +0 -11
- package/lib/run/prompt.ts +0 -1
- package/lib/sandbox/engines/authority.ts +0 -365
- package/lib/task/delegation-receipts.ts +0 -547
- package/lib/task/orchestration.ts +0 -1651
- package/lib/task/verification-checks.ts +0 -10
- package/lib/task/workspace-snapshot.ts +0 -144
- package/templates/.agents/hooks/lifecycle-delegation.js +0 -140
- package/templates/.agents/rules/lifecycle-orchestration.en.md +0 -44
- package/templates/.agents/rules/lifecycle-orchestration.zh-CN.md +0 -44
- package/templates/.agents/skills/run-task/SKILL.en.md +0 -29
- package/templates/.agents/skills/run-task/SKILL.zh-CN.md +0 -29
- package/templates/.agents/skills/run-task/config/verify.en.json +0 -10
- package/templates/.agents/skills/run-task/config/verify.zh-CN.json +0 -10
- package/templates/.agents/skills/run-task/reference/host-validation.en.md +0 -24
- package/templates/.agents/skills/run-task/reference/host-validation.zh-CN.md +0 -24
- package/templates/.claude/agents/agent-infra-lifecycle-executor.en.md +0 -6
- package/templates/.claude/agents/agent-infra-lifecycle-executor.zh-CN.md +0 -6
- package/templates/.claude/agents/agent-infra-lifecycle-reviewer.en.md +0 -6
- package/templates/.claude/agents/agent-infra-lifecycle-reviewer.zh-CN.md +0 -6
- package/templates/.claude/commands/run-task.en.md +0 -8
- package/templates/.claude/commands/run-task.zh-CN.md +0 -8
- package/templates/.codex/agents/agent-infra-lifecycle-executor.en.toml +0 -3
- package/templates/.codex/agents/agent-infra-lifecycle-executor.zh-CN.toml +0 -3
- package/templates/.codex/agents/agent-infra-lifecycle-reviewer.en.toml +0 -3
- package/templates/.codex/agents/agent-infra-lifecycle-reviewer.zh-CN.toml +0 -3
- package/templates/.opencode/commands/run-task.en.md +0 -11
- package/templates/.opencode/commands/run-task.zh-CN.md +0 -11
|
@@ -36,7 +36,6 @@ import {
|
|
|
36
36
|
writeSandboxControlReservation,
|
|
37
37
|
writeSandboxControlResultEvidence,
|
|
38
38
|
writeSandboxControlTerminalResult,
|
|
39
|
-
appendSandboxControlAudit,
|
|
40
39
|
terminateSandboxControlExecution,
|
|
41
40
|
writeSandboxControlStatus,
|
|
42
41
|
readSandboxControlStatus
|
|
@@ -65,7 +64,6 @@ import { loadShortIdByTaskId } from '../../task/short-id.ts';
|
|
|
65
64
|
import { inspectSandboxControlContainer, type ContainerObservation } from './container-identity.ts';
|
|
66
65
|
import {
|
|
67
66
|
acquireSandboxControlBrokerStartup,
|
|
68
|
-
garbageCollectSandboxControlRoot,
|
|
69
67
|
isSandboxControlRootQuiescing,
|
|
70
68
|
readSandboxControlManifest
|
|
71
69
|
} from './lifecycle.ts';
|
|
@@ -76,7 +74,6 @@ import { validateSandboxControlIdentity } from './identity-sentinel.ts';
|
|
|
76
74
|
import {
|
|
77
75
|
mergeSandboxTaskView,
|
|
78
76
|
taskViewForManifest,
|
|
79
|
-
type SandboxTaskView
|
|
80
77
|
} from './task-view.ts';
|
|
81
78
|
import { taskCreateOutputUnavailableResult } from '../../task/create-service.ts';
|
|
82
79
|
|
|
@@ -287,7 +284,6 @@ function taskCreateDomainEvidence(
|
|
|
287
284
|
|
|
288
285
|
async function readRecoveryDomain(
|
|
289
286
|
manifest: SandboxControlManifest,
|
|
290
|
-
manifestPath: string,
|
|
291
287
|
request: SandboxControlRequest,
|
|
292
288
|
operation: ReturnType<typeof findSandboxControlRecoveryOperation>,
|
|
293
289
|
terminalResult: ReturnType<typeof readSandboxControlTerminalResult>,
|
|
@@ -301,9 +297,6 @@ async function readRecoveryDomain(
|
|
|
301
297
|
}
|
|
302
298
|
|
|
303
299
|
if (operation.family === 'task-lifecycle') {
|
|
304
|
-
if (operation.intent === 'recover-started') {
|
|
305
|
-
return { domain: null };
|
|
306
|
-
}
|
|
307
300
|
if (!taskRef || !terminalResult.targetState) return { domain: null };
|
|
308
301
|
const journal = readLifecycleJournalEvidence(manifest.repoRoot, taskRef);
|
|
309
302
|
try {
|
|
@@ -340,7 +333,6 @@ function readCommittedCriticalPhases(manifest: SandboxControlManifest, requestId
|
|
|
340
333
|
|
|
341
334
|
export async function recoveryResponse(
|
|
342
335
|
manifest: SandboxControlManifest,
|
|
343
|
-
manifestPath: string,
|
|
344
336
|
request: SandboxControlRequest,
|
|
345
337
|
evidence: ReturnType<typeof readSandboxControlResultEvidence>,
|
|
346
338
|
payload: ReturnType<typeof readSandboxControlPayload> | null,
|
|
@@ -355,7 +347,7 @@ export async function recoveryResponse(
|
|
|
355
347
|
}, payload.stdout);
|
|
356
348
|
if (JSON.stringify(payloadTerminal) !== JSON.stringify(terminalResult)) return unknown(request.id);
|
|
357
349
|
}
|
|
358
|
-
const recovery = await readRecoveryDomain(manifest,
|
|
350
|
+
const recovery = await readRecoveryDomain(manifest, request, operation, terminalResult, payload?.stdout ?? null);
|
|
359
351
|
const binding = operationRecoveryBinding(request.id, manifest.generation, manifest.taskId, request.family, operationName!);
|
|
360
352
|
const decision = classifySandboxControlRecovery({
|
|
361
353
|
operation,
|
|
@@ -373,13 +365,11 @@ export async function recoveryResponse(
|
|
|
373
365
|
}
|
|
374
366
|
|
|
375
367
|
async function terminalMatchesEvidence(
|
|
376
|
-
manifest: SandboxControlManifest,
|
|
377
368
|
request: SandboxControlRequest,
|
|
378
369
|
response: SandboxControlResponse,
|
|
379
370
|
evidence: ReturnType<typeof readSandboxControlResultEvidence>,
|
|
380
371
|
payload: ReturnType<typeof readSandboxControlPayload> | null,
|
|
381
|
-
payloadInvalid: boolean
|
|
382
|
-
terminalResult: ReturnType<typeof readSandboxControlTerminalResult> | null
|
|
372
|
+
payloadInvalid: boolean
|
|
383
373
|
): Promise<{ valid: boolean; payloadReferenced: boolean }> {
|
|
384
374
|
if (response.version !== 2 || response.id !== request.id || response.phase !== 'completed'
|
|
385
375
|
|| response.exitCode !== evidence.exitCode || response.error !== null) {
|
|
@@ -422,7 +412,7 @@ function publishExecutionResult(
|
|
|
422
412
|
brokerOwns: () => boolean
|
|
423
413
|
): boolean {
|
|
424
414
|
const normalized = sanitizeSandboxControlResult(manifest, result);
|
|
425
|
-
|
|
415
|
+
writeSandboxControlTerminalResult(manifest, {
|
|
426
416
|
id: request.id,
|
|
427
417
|
family: request.family,
|
|
428
418
|
operation: operationKey(request)
|
|
@@ -535,7 +525,7 @@ function assertCurrentSandboxControlIdentity(manifest: SandboxControlManifest, m
|
|
|
535
525
|
}
|
|
536
526
|
}
|
|
537
527
|
|
|
538
|
-
async function recoverProcessing(manifest: SandboxControlManifest,
|
|
528
|
+
async function recoverProcessing(manifest: SandboxControlManifest, brokerOwns: () => boolean): Promise<boolean> {
|
|
539
529
|
for (const entry of fs.readdirSync(manifest.processingDir, { withFileTypes: true })) {
|
|
540
530
|
if (!entry.isDirectory() || !/^[a-f0-9-]{16,64}$/.test(entry.name)) continue;
|
|
541
531
|
if (!brokerOwns()) return false;
|
|
@@ -641,13 +631,11 @@ async function recoverProcessing(manifest: SandboxControlManifest, manifestPath:
|
|
|
641
631
|
if (terminal && request && resultEvidence) {
|
|
642
632
|
if (!terminalResult && request.family !== 'task-create') continue;
|
|
643
633
|
const reconciliation = await terminalMatchesEvidence(
|
|
644
|
-
manifest,
|
|
645
634
|
request,
|
|
646
635
|
existingTerminalResponse!,
|
|
647
636
|
resultEvidence,
|
|
648
637
|
payload,
|
|
649
|
-
payloadInvalid
|
|
650
|
-
terminalResult
|
|
638
|
+
payloadInvalid
|
|
651
639
|
);
|
|
652
640
|
if (!reconciliation.valid) continue;
|
|
653
641
|
terminalReconciled = true;
|
|
@@ -669,7 +657,7 @@ async function recoverProcessing(manifest: SandboxControlManifest, manifestPath:
|
|
|
669
657
|
if (!terminal) {
|
|
670
658
|
if (!brokerOwns()) return false;
|
|
671
659
|
if (!resultEvidence || !request || payloadInvalid) continue;
|
|
672
|
-
const recovered = await recoveryResponse(manifest,
|
|
660
|
+
const recovered = await recoveryResponse(manifest, request, resultEvidence, payload, terminalResult!);
|
|
673
661
|
if (!recovered) continue;
|
|
674
662
|
writeSandboxControlResponse(manifest, recovered);
|
|
675
663
|
const preserveRecoveryEvidence = recovered.error?.code === 'SANDBOX_CONTROL_RESULT_UNKNOWN';
|
|
@@ -814,7 +802,7 @@ export async function serveSandboxControl(
|
|
|
814
802
|
pid: broker.pid,
|
|
815
803
|
brokerId: broker.brokerId
|
|
816
804
|
});
|
|
817
|
-
if (!await recoverProcessing(manifest,
|
|
805
|
+
if (!await recoverProcessing(manifest, brokerOwns)) return;
|
|
818
806
|
try {
|
|
819
807
|
const published = readSandboxControlStatus(manifest.publicStatusDir);
|
|
820
808
|
if (published.generation === manifest.generation) taskView = published.taskView;
|
|
@@ -856,29 +844,15 @@ export async function serveSandboxControl(
|
|
|
856
844
|
containerReasonCode = null;
|
|
857
845
|
containerBackoffMs = timing.parkedBindingInitialMs;
|
|
858
846
|
nextContainerHeartbeatAt = Date.now() + timing.containerHeartbeatMs;
|
|
859
|
-
} else
|
|
860
|
-
|
|
861
|
-
|
|
847
|
+
} else {
|
|
848
|
+
const missing = observation.state === 'absent';
|
|
849
|
+
containerReasonCode = missing ? 'SANDBOX_CONTROL_CONTAINER_ABSENT' : 'SANDBOX_CONTROL_CONTAINER_UNKNOWN';
|
|
850
|
+
appendDiagnosticAudit(manifest, missing ? 'container-heartbeat-absent' : 'container-heartbeat-unknown', {
|
|
851
|
+
reason: observation.state === 'unknown' ? observation.reason : 'recorded container was not found'
|
|
852
|
+
});
|
|
862
853
|
const backoff = nextSandboxControlBackoff(containerBackoffMs, timing.slowCheckMs);
|
|
863
854
|
nextContainerHeartbeatAt = Date.now() + backoff.delayMs;
|
|
864
855
|
containerBackoffMs = backoff.nextDelayMs;
|
|
865
|
-
} else {
|
|
866
|
-
try {
|
|
867
|
-
await garbageCollectSandboxControlRoot(root, {
|
|
868
|
-
timeoutMs: timing.quiesceDeadlineMs,
|
|
869
|
-
inspectContainer: (timeoutMs) => inspectContainer(manifest),
|
|
870
|
-
selfOwner: broker
|
|
871
|
-
});
|
|
872
|
-
active = null;
|
|
873
|
-
return;
|
|
874
|
-
} catch (error) {
|
|
875
|
-
if (!brokerOwns()) break;
|
|
876
|
-
containerReasonCode = 'SANDBOX_CONTROL_CONTAINER_ABSENT_GC_FAILED';
|
|
877
|
-
appendDiagnosticAudit(manifest, 'container-gc-failed', { reason: controlError(error).code });
|
|
878
|
-
const backoff = nextSandboxControlBackoff(containerBackoffMs, timing.slowCheckMs);
|
|
879
|
-
nextContainerHeartbeatAt = Date.now() + backoff.delayMs;
|
|
880
|
-
containerBackoffMs = backoff.nextDelayMs;
|
|
881
|
-
}
|
|
882
856
|
}
|
|
883
857
|
}
|
|
884
858
|
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { isCompletionEvidence, type CleanCompletionEvidence } from '../../task/orchestration.ts';
|
|
2
1
|
import { parseControlOutput } from '../../task/control-recovery.ts';
|
|
3
2
|
import { execFileSync } from 'node:child_process';
|
|
4
3
|
import fs from 'node:fs';
|
|
@@ -112,7 +111,6 @@ export type SandboxControlTerminalResult = Readonly<{
|
|
|
112
111
|
targetState: string | null;
|
|
113
112
|
status: string;
|
|
114
113
|
changed: boolean | null;
|
|
115
|
-
completionEvidence: CleanCompletionEvidence | null;
|
|
116
114
|
}>;
|
|
117
115
|
|
|
118
116
|
export function terminalResultPath(manifest: SandboxControlManifest, requestId: string): string {
|
|
@@ -126,9 +124,6 @@ export function createSandboxControlTerminalResult(
|
|
|
126
124
|
output: string
|
|
127
125
|
): SandboxControlTerminalResult {
|
|
128
126
|
const nested = parseControlOutput(output) ?? {};
|
|
129
|
-
const run = nested.run && typeof nested.run === 'object' && !Array.isArray(nested.run)
|
|
130
|
-
? nested.run as Record<string, unknown> : null;
|
|
131
|
-
const rawCompletion = nested.completionEvidence ?? run?.completionEvidence;
|
|
132
127
|
const operation = request.operation ?? (typeof nested.intent === 'string' ? nested.intent : null) ?? '';
|
|
133
128
|
return {
|
|
134
129
|
version: 1,
|
|
@@ -138,8 +133,7 @@ export function createSandboxControlTerminalResult(
|
|
|
138
133
|
intentDigest: createHash('sha256').update(`${request.family}\0${operation}`, 'utf8').digest('hex'),
|
|
139
134
|
targetState: typeof nested.targetState === 'string' ? nested.targetState : null,
|
|
140
135
|
status: typeof nested.status === 'string' ? nested.status : 'completed',
|
|
141
|
-
changed: typeof nested.changed === 'boolean' ? nested.changed : null
|
|
142
|
-
completionEvidence: isCompletionEvidence(rawCompletion) ? rawCompletion : null
|
|
136
|
+
changed: typeof nested.changed === 'boolean' ? nested.changed : null
|
|
143
137
|
};
|
|
144
138
|
}
|
|
145
139
|
|
|
@@ -170,9 +164,6 @@ export function readSandboxControlTerminalResult(filePath: string): SandboxContr
|
|
|
170
164
|
|| (value.changed !== null && typeof value.changed !== 'boolean')) {
|
|
171
165
|
throw new Error('SANDBOX_CONTROL_TERMINAL_RESULT_INVALID');
|
|
172
166
|
}
|
|
173
|
-
if (value.completionEvidence !== null && !isCompletionEvidence(value.completionEvidence)) {
|
|
174
|
-
throw new Error('SANDBOX_CONTROL_TERMINAL_RESULT_INVALID');
|
|
175
|
-
}
|
|
176
167
|
if (value.changed === undefined) {
|
|
177
168
|
throw new Error('SANDBOX_CONTROL_TERMINAL_RESULT_INVALID');
|
|
178
169
|
}
|
|
@@ -143,14 +143,3 @@ export function prepareDockerfile(
|
|
|
143
143
|
}
|
|
144
144
|
};
|
|
145
145
|
}
|
|
146
|
-
|
|
147
|
-
export function composeDockerfile(
|
|
148
|
-
config: DockerfileConfig,
|
|
149
|
-
image: DockerfileImageContribution = EMPTY_IMAGE_CONTRIBUTION
|
|
150
|
-
): string {
|
|
151
|
-
const content = dockerfileContent(config, image);
|
|
152
|
-
|
|
153
|
-
const tempPath = path.join(os.tmpdir(), `${config.project}-sandbox.Dockerfile`);
|
|
154
|
-
fs.writeFileSync(tempPath, content, 'utf8');
|
|
155
|
-
return tempPath;
|
|
156
|
-
}
|
package/lib/sandbox/engine.ts
CHANGED
|
@@ -195,23 +195,6 @@ export async function ensureDocker(
|
|
|
195
195
|
adapter.syncResources(effectiveConfig, onMessage, fns, { vmJustStarted });
|
|
196
196
|
}
|
|
197
197
|
|
|
198
|
-
export function isVmManaged(config: EngineConfig = {}, dependencies: EngineDependencies = {}): boolean {
|
|
199
|
-
try {
|
|
200
|
-
const engine = detectEngine(config, dependencies);
|
|
201
|
-
return isManagedEngine(engine);
|
|
202
|
-
} catch (error) {
|
|
203
|
-
const message = error instanceof Error ? error.message : '';
|
|
204
|
-
if (
|
|
205
|
-
message.startsWith('sandbox: platform "')
|
|
206
|
-
|| / is not supported on [^.]+\. Supported engines on [^:]+: none\./.test(message)
|
|
207
|
-
) {
|
|
208
|
-
return false;
|
|
209
|
-
}
|
|
210
|
-
|
|
211
|
-
throw error;
|
|
212
|
-
}
|
|
213
|
-
}
|
|
214
|
-
|
|
215
198
|
export function isManagedEngine(engine: string): boolean {
|
|
216
199
|
try {
|
|
217
200
|
return getAdapter(engine).managed;
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import type { SpawnSyncReturns } from 'node:child_process';
|
|
2
2
|
import { commandForEngine, runProbe } from '../shell.ts';
|
|
3
|
-
import { commandForSandboxAuthority, type SandboxAuthorityEvidenceV1 } from './authority.ts';
|
|
4
3
|
|
|
5
4
|
type ProbeResult = SpawnSyncReturns<string | Buffer>;
|
|
6
5
|
type Probe = (cmd: string, args: string[], options?: { timeout?: number }) => ProbeResult;
|
|
@@ -20,7 +19,6 @@ export type ExactContainerDiscovery =
|
|
|
20
19
|
export type ExactContainerDiscoveryOptions = Readonly<{
|
|
21
20
|
probe?: Probe;
|
|
22
21
|
timeoutMs?: number;
|
|
23
|
-
authority?: SandboxAuthorityEvidenceV1;
|
|
24
22
|
}>;
|
|
25
23
|
|
|
26
24
|
const FULL_CONTAINER_ID = /^[a-f0-9]{64}$/u;
|
|
@@ -47,9 +45,7 @@ function runDockerProbe(
|
|
|
47
45
|
args: string[],
|
|
48
46
|
options: ExactContainerDiscoveryOptions
|
|
49
47
|
): ProbeResult {
|
|
50
|
-
const command =
|
|
51
|
-
? commandForSandboxAuthority(options.authority, 'docker', args)
|
|
52
|
-
: commandForEngine(engine, 'docker', args);
|
|
48
|
+
const command = commandForEngine(engine, 'docker', args);
|
|
53
49
|
return (options.probe ?? runProbe)(
|
|
54
50
|
command.cmd,
|
|
55
51
|
command.args,
|
|
@@ -8,10 +8,6 @@ export function hostJoin(basePath: string, ...segments: string[]): string {
|
|
|
8
8
|
return basePath.startsWith('/') ? path.posix.join(basePath, ...segments) : path.join(basePath, ...segments);
|
|
9
9
|
}
|
|
10
10
|
|
|
11
|
-
export function isWindowsDrivePath(value: unknown): boolean {
|
|
12
|
-
return typeof value === 'string' && WINDOWS_DRIVE_PATH_PATTERN.test(value);
|
|
13
|
-
}
|
|
14
|
-
|
|
15
11
|
export function isUncPath(value: unknown): boolean {
|
|
16
12
|
return typeof value === 'string' && UNC_PATH_PATTERN.test(value);
|
|
17
13
|
}
|
package/lib/sandbox/recovery.ts
CHANGED
|
@@ -5,6 +5,7 @@ import { spawn } from 'node:child_process';
|
|
|
5
5
|
import { fileURLToPath } from 'node:url';
|
|
6
6
|
import { nodeEntryArgs } from './control/executor.ts';
|
|
7
7
|
import {
|
|
8
|
+
containerName,
|
|
8
9
|
containerNameCandidates,
|
|
9
10
|
sandboxBranchLabel,
|
|
10
11
|
sandboxLabel,
|
|
@@ -55,7 +56,6 @@ import {
|
|
|
55
56
|
import { getProcessIdentityState, getProcessStartTime, removePidFileIfMatches } from '../server/process-state.ts';
|
|
56
57
|
import {
|
|
57
58
|
acquireSandboxControlBrokerStartup,
|
|
58
|
-
garbageCollectSandboxControlRoot,
|
|
59
59
|
isSandboxControlRootQuiescing,
|
|
60
60
|
readSandboxControlManifest,
|
|
61
61
|
type BrokerOwner
|
|
@@ -178,7 +178,7 @@ type EnsureSandboxReadyParams = {
|
|
|
178
178
|
branch: string;
|
|
179
179
|
workspace?: SandboxWorkspaceReference;
|
|
180
180
|
reentry?: 'standard' | 'completed';
|
|
181
|
-
row: SandboxRow;
|
|
181
|
+
row: SandboxRow | null;
|
|
182
182
|
allowRecreate?: boolean;
|
|
183
183
|
forceRecreate?: boolean;
|
|
184
184
|
recreate?: (branch: string) => Promise<void>;
|
|
@@ -365,9 +365,6 @@ async function ensureSandboxControlBroker(params: {
|
|
|
365
365
|
throw new Error(`SANDBOX_CONTROL_CONTAINER_UNKNOWN: ${containerObservation.reason}`);
|
|
366
366
|
}
|
|
367
367
|
if (containerObservation.state === 'absent') {
|
|
368
|
-
await garbageCollectSandboxControlRoot(control.root, {
|
|
369
|
-
inspectContainer: (timeoutMs) => inspectSandboxControlContainer(validatedManifest, { timeoutMs })
|
|
370
|
-
});
|
|
371
368
|
throw new Error('SANDBOX_CONTROL_CONTAINER_ABSENT: recreate the sandbox container before broker recovery');
|
|
372
369
|
}
|
|
373
370
|
const brokerPath = path.join(control.root, 'broker.json');
|
|
@@ -1285,6 +1282,7 @@ export async function ensureSandboxReady(params: EnsureSandboxReadyParams): Prom
|
|
|
1285
1282
|
const deps = params.deps;
|
|
1286
1283
|
const startFn = deps?.start ?? startSandboxContainer;
|
|
1287
1284
|
const warnings: string[] = [];
|
|
1285
|
+
const container = params.row?.name ?? containerName(params.config, params.branch);
|
|
1288
1286
|
let failure: Error | null = null;
|
|
1289
1287
|
try {
|
|
1290
1288
|
if (deps?.ensureControlBroker) {
|
|
@@ -1292,11 +1290,11 @@ export async function ensureSandboxReady(params: EnsureSandboxReadyParams): Prom
|
|
|
1292
1290
|
} else {
|
|
1293
1291
|
await ensureSandboxControlBroker({
|
|
1294
1292
|
config: params.config,
|
|
1295
|
-
container:
|
|
1293
|
+
container: container,
|
|
1296
1294
|
workspace: params.workspace ?? { mode: 'branch-only' }
|
|
1297
1295
|
});
|
|
1298
1296
|
}
|
|
1299
|
-
if (params.forceRecreate || (params.reentry === 'completed' && params.allowRecreate)) {
|
|
1297
|
+
if (!params.row || params.forceRecreate || (params.reentry === 'completed' && params.allowRecreate)) {
|
|
1300
1298
|
throw new Error('Explicit container recreation requested.');
|
|
1301
1299
|
}
|
|
1302
1300
|
if (!params.row.running) {
|
|
@@ -1304,7 +1302,7 @@ export async function ensureSandboxReady(params: EnsureSandboxReadyParams): Prom
|
|
|
1304
1302
|
if (params.reentry === 'completed' && params.workspace?.mode === 'task-bound') {
|
|
1305
1303
|
const control = sandboxControlPaths({
|
|
1306
1304
|
base: params.config.controlBase, project: params.config.project,
|
|
1307
|
-
container:
|
|
1305
|
+
container: container, identity: params.workspace
|
|
1308
1306
|
});
|
|
1309
1307
|
const manifest = readSandboxControlManifest(control.manifestPath);
|
|
1310
1308
|
if (manifest.taskId !== params.workspace.taskId || manifest.branch !== params.branch) {
|
|
@@ -1314,19 +1312,19 @@ export async function ensureSandboxReady(params: EnsureSandboxReadyParams): Prom
|
|
|
1314
1312
|
startCompletedSandboxContainer({
|
|
1315
1313
|
config: params.config,
|
|
1316
1314
|
engine: params.engine,
|
|
1317
|
-
container:
|
|
1315
|
+
container: container,
|
|
1318
1316
|
taskId: params.workspace.taskId,
|
|
1319
1317
|
start: startFn
|
|
1320
1318
|
});
|
|
1321
1319
|
} else {
|
|
1322
|
-
startFn(params.engine,
|
|
1320
|
+
startFn(params.engine, container);
|
|
1323
1321
|
}
|
|
1324
1322
|
const initial = assess({
|
|
1325
1323
|
config: params.config,
|
|
1326
1324
|
engine: params.engine,
|
|
1327
1325
|
branch: params.branch,
|
|
1328
1326
|
workspace: params.workspace,
|
|
1329
|
-
container:
|
|
1327
|
+
container: container,
|
|
1330
1328
|
deps
|
|
1331
1329
|
});
|
|
1332
1330
|
if (initial.findings.some((finding) => finding.repairKind === 'hard-failure')) {
|
|
@@ -1337,13 +1335,13 @@ export async function ensureSandboxReady(params: EnsureSandboxReadyParams): Prom
|
|
|
1337
1335
|
const tools = resolveTools(params.config);
|
|
1338
1336
|
prepareTmpfsMounts({
|
|
1339
1337
|
engine: params.engine,
|
|
1340
|
-
container:
|
|
1338
|
+
container: container,
|
|
1341
1339
|
mountPaths: tools.filter((tool) => tool.tmpfs).map((tool) => tool.containerMount),
|
|
1342
1340
|
deps
|
|
1343
1341
|
});
|
|
1344
1342
|
hydrateTmpfsSeedEntries({
|
|
1345
1343
|
engine: params.engine,
|
|
1346
|
-
container:
|
|
1344
|
+
container: container,
|
|
1347
1345
|
entries: mountedSeeds(initial.snapshot),
|
|
1348
1346
|
replace: true,
|
|
1349
1347
|
deps
|
|
@@ -1353,13 +1351,13 @@ export async function ensureSandboxReady(params: EnsureSandboxReadyParams): Prom
|
|
|
1353
1351
|
engine: params.engine,
|
|
1354
1352
|
branch: params.branch,
|
|
1355
1353
|
workspace: params.workspace,
|
|
1356
|
-
container:
|
|
1354
|
+
container: container,
|
|
1357
1355
|
deps
|
|
1358
1356
|
});
|
|
1359
1357
|
if (!final.findings.some((finding) => finding.repairKind === 'hard-failure')) {
|
|
1360
1358
|
repairFindings({
|
|
1361
1359
|
engine: params.engine,
|
|
1362
|
-
container:
|
|
1360
|
+
container: container,
|
|
1363
1361
|
findings: final.findings,
|
|
1364
1362
|
deps
|
|
1365
1363
|
});
|
|
@@ -1368,7 +1366,7 @@ export async function ensureSandboxReady(params: EnsureSandboxReadyParams): Prom
|
|
|
1368
1366
|
engine: params.engine,
|
|
1369
1367
|
branch: params.branch,
|
|
1370
1368
|
workspace: params.workspace,
|
|
1371
|
-
container:
|
|
1369
|
+
container: container,
|
|
1372
1370
|
deps
|
|
1373
1371
|
});
|
|
1374
1372
|
}
|
|
@@ -1384,7 +1382,7 @@ export async function ensureSandboxReady(params: EnsureSandboxReadyParams): Prom
|
|
|
1384
1382
|
publishCompletedReentry(manifest, evidence);
|
|
1385
1383
|
await waitForCompletedReentry(manifest, evidence);
|
|
1386
1384
|
}
|
|
1387
|
-
return { container:
|
|
1385
|
+
return { container: container, path: 'recovered', warnings };
|
|
1388
1386
|
}
|
|
1389
1387
|
|
|
1390
1388
|
const initial = assess({
|
|
@@ -1392,11 +1390,11 @@ export async function ensureSandboxReady(params: EnsureSandboxReadyParams): Prom
|
|
|
1392
1390
|
engine: params.engine,
|
|
1393
1391
|
branch: params.branch,
|
|
1394
1392
|
workspace: params.workspace,
|
|
1395
|
-
container:
|
|
1393
|
+
container: container,
|
|
1396
1394
|
deps
|
|
1397
1395
|
});
|
|
1398
1396
|
if (initial.findings.length === 0) {
|
|
1399
|
-
return { container:
|
|
1397
|
+
return { container: container, path: 'healthy', warnings };
|
|
1400
1398
|
}
|
|
1401
1399
|
if (initial.findings.some((finding) => finding.repairKind === 'hard-failure')) {
|
|
1402
1400
|
throw new Error(describeFindings(initial.findings));
|
|
@@ -1408,7 +1406,7 @@ export async function ensureSandboxReady(params: EnsureSandboxReadyParams): Prom
|
|
|
1408
1406
|
if (permissionFindings.length > 0) {
|
|
1409
1407
|
repairFindings({
|
|
1410
1408
|
engine: params.engine,
|
|
1411
|
-
container:
|
|
1409
|
+
container: container,
|
|
1412
1410
|
findings: permissionFindings,
|
|
1413
1411
|
deps
|
|
1414
1412
|
});
|
|
@@ -1417,7 +1415,7 @@ export async function ensureSandboxReady(params: EnsureSandboxReadyParams): Prom
|
|
|
1417
1415
|
engine: params.engine,
|
|
1418
1416
|
branch: params.branch,
|
|
1419
1417
|
workspace: params.workspace,
|
|
1420
|
-
container:
|
|
1418
|
+
container: container,
|
|
1421
1419
|
deps
|
|
1422
1420
|
});
|
|
1423
1421
|
if (current.findings.some(
|
|
@@ -1429,7 +1427,7 @@ export async function ensureSandboxReady(params: EnsureSandboxReadyParams): Prom
|
|
|
1429
1427
|
}
|
|
1430
1428
|
repairFindings({
|
|
1431
1429
|
engine: params.engine,
|
|
1432
|
-
container:
|
|
1430
|
+
container: container,
|
|
1433
1431
|
findings: current.findings,
|
|
1434
1432
|
deps
|
|
1435
1433
|
});
|
|
@@ -1438,13 +1436,13 @@ export async function ensureSandboxReady(params: EnsureSandboxReadyParams): Prom
|
|
|
1438
1436
|
engine: params.engine,
|
|
1439
1437
|
branch: params.branch,
|
|
1440
1438
|
workspace: params.workspace,
|
|
1441
|
-
container:
|
|
1439
|
+
container: container,
|
|
1442
1440
|
deps
|
|
1443
1441
|
});
|
|
1444
1442
|
if (final.findings.length > 0) {
|
|
1445
1443
|
throw new Error(describeFindings(final.findings));
|
|
1446
1444
|
}
|
|
1447
|
-
return { container:
|
|
1445
|
+
return { container: container, path: 'recovered', warnings };
|
|
1448
1446
|
} catch (error) {
|
|
1449
1447
|
failure = error instanceof Error ? error : new Error(String(error));
|
|
1450
1448
|
}
|
|
@@ -1455,7 +1453,7 @@ export async function ensureSandboxReady(params: EnsureSandboxReadyParams): Prom
|
|
|
1455
1453
|
}
|
|
1456
1454
|
const taskId = params.workspace.taskId;
|
|
1457
1455
|
const commandChain = [
|
|
1458
|
-
`docker exec -it ${
|
|
1456
|
+
`docker exec -it ${container} bash /usr/local/bin/sandbox-tmux-entry`,
|
|
1459
1457
|
`ai sandbox rm ${taskId}`,
|
|
1460
1458
|
`ai sandbox create ${params.branch}`
|
|
1461
1459
|
];
|
|
@@ -1467,7 +1465,7 @@ export async function ensureSandboxReady(params: EnsureSandboxReadyParams): Prom
|
|
|
1467
1465
|
: 'Completed sandbox recovery failed; the existing container was not replaced.';
|
|
1468
1466
|
throw new Error([
|
|
1469
1467
|
`${code}: ${lead}`,
|
|
1470
|
-
`Task: ${taskId}; container: ${
|
|
1468
|
+
`Task: ${taskId}; container: ${container}; branch: ${params.branch}.`,
|
|
1471
1469
|
'To preserve the current container state, enter it manually with:',
|
|
1472
1470
|
` ${commandChain[0]}`,
|
|
1473
1471
|
'If you intentionally want a replacement, the following is the full interactive sandbox cleanup, not a container-only delete.',
|