@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.
Files changed (331) hide show
  1. package/README.md +0 -2
  2. package/README.zh-CN.md +0 -2
  3. package/dist/bin/internal-cli.js +2 -17
  4. package/dist/lib/agent-clients/adapter.js +0 -13
  5. package/dist/lib/agent-clients/adapters/antigravity-cli.js +0 -5
  6. package/dist/lib/agent-clients/adapters/claude-code-credentials.js +0 -17
  7. package/dist/lib/agent-clients/adapters/claude-code.js +0 -9
  8. package/dist/lib/agent-clients/adapters/codex.js +0 -52
  9. package/dist/lib/agent-clients/adapters/opencode.js +0 -5
  10. package/dist/lib/agent-clients/adapters/traecli.js +0 -5
  11. package/dist/lib/agent-clients/config.js +19 -54
  12. package/dist/lib/agent-clients/registry.js +1 -12
  13. package/dist/lib/agent-clients/schema.js +0 -18
  14. package/dist/lib/agent-clients/tokens.js +1 -2
  15. package/dist/lib/agent-clients/types.js +0 -1
  16. package/dist/lib/decide.js +2 -0
  17. package/dist/lib/git/worktree-identity.js +1 -9
  18. package/dist/lib/internal/agent-client.js +2 -62
  19. package/dist/lib/internal/cli-route-inventory.js +1 -5
  20. package/dist/lib/internal/manual-validation.js +29 -27
  21. package/dist/lib/internal/platform-comment.js +56 -7
  22. package/dist/lib/internal/task-create.js +1 -1
  23. package/dist/lib/internal/task-event.js +1 -8
  24. package/dist/lib/internal/task-finalization.js +0 -1
  25. package/dist/lib/internal/task-lifecycle.js +2 -2
  26. package/dist/lib/internal/task-operation-registry.js +4 -20
  27. package/dist/lib/internal/task-review.js +4 -4
  28. package/dist/lib/platform/comment-safety.js +1 -7
  29. package/dist/lib/platform/in-label-sync.js +1 -14
  30. package/dist/lib/platform/issue-comments.js +373 -282
  31. package/dist/lib/platform/issue-summary-content.js +112 -0
  32. package/dist/lib/platform/issues.js +1 -1
  33. package/dist/lib/platform/operation-coordinator.js +4 -2
  34. package/dist/lib/platform/pr-change-report.js +176 -30
  35. package/dist/lib/platform/pr-checks.js +2 -8
  36. package/dist/lib/platform/pr-summary-content.js +54 -0
  37. package/dist/lib/platform/pr-summary.js +318 -284
  38. package/dist/lib/platform/provider-validation.js +0 -20
  39. package/dist/lib/platform/pull-requests.js +73 -84
  40. package/dist/lib/platform/releases.js +1 -43
  41. package/dist/lib/platform/summary-content-pipeline.js +18 -0
  42. package/dist/lib/platform/verification-required.js +0 -2
  43. package/dist/lib/platform/verification-sync.js +1 -79
  44. package/dist/lib/process-data/normalize.js +1 -185
  45. package/dist/lib/process-data/privacy.js +1 -16
  46. package/dist/lib/process-data/sources.js +2 -279
  47. package/dist/lib/render.js +0 -12
  48. package/dist/lib/run/index.js +15 -10
  49. package/dist/lib/run/skills.js +0 -3
  50. package/dist/lib/sandbox/commands/create.js +40 -53
  51. package/dist/lib/sandbox/commands/list-running.js +0 -18
  52. package/dist/lib/sandbox/commands/start.js +7 -8
  53. package/dist/lib/sandbox/constants.js +0 -6
  54. package/dist/lib/sandbox/control/client.js +0 -1
  55. package/dist/lib/sandbox/control/container-identity.js +1 -16
  56. package/dist/lib/sandbox/control/executor.js +0 -4
  57. package/dist/lib/sandbox/control/identity-sentinel.js +0 -7
  58. package/dist/lib/sandbox/control/lifecycle.js +21 -37
  59. package/dist/lib/sandbox/control/native-file-lock.js +0 -3
  60. package/dist/lib/sandbox/control/server.js +18 -38
  61. package/dist/lib/sandbox/control/state.js +1 -9
  62. package/dist/lib/sandbox/dockerfile.js +0 -6
  63. package/dist/lib/sandbox/engine.js +0 -14
  64. package/dist/lib/sandbox/engines/docker-exact-discovery.js +1 -4
  65. package/dist/lib/sandbox/engines/wsl2-paths.js +0 -3
  66. package/dist/lib/sandbox/recovery.js +24 -26
  67. package/dist/lib/sandbox/removal.js +67 -518
  68. package/dist/lib/sandbox/task-resolver.js +0 -41
  69. package/dist/lib/sandbox/tools.js +1 -4
  70. package/dist/lib/sandbox/workspace-view.js +1 -2
  71. package/dist/lib/server/display.js +0 -6
  72. package/dist/lib/task/activity-intent.js +45 -40
  73. package/dist/lib/task/activity-log.js +9 -16
  74. package/dist/lib/task/artifact-command.js +1 -1
  75. package/dist/lib/task/artifact-lifecycle.js +61 -63
  76. package/dist/lib/task/artifact-name.js +0 -6
  77. package/dist/lib/task/artifact-operations.js +3 -3
  78. package/dist/lib/task/capabilities.js +4 -5
  79. package/dist/lib/task/commands/log.js +0 -6
  80. package/dist/lib/task/commands/status.js +17 -60
  81. package/dist/lib/task/commit-operation.js +28 -39
  82. package/dist/lib/task/completion-facts.js +56 -43
  83. package/dist/lib/task/control-authority.js +23 -256
  84. package/dist/lib/task/control-recovery.js +3 -5
  85. package/dist/lib/task/create.js +2 -4
  86. package/dist/lib/task/decision-intents.js +8 -9
  87. package/dist/lib/task/delivery-target.js +1 -40
  88. package/dist/lib/task/events.js +84 -107
  89. package/dist/lib/task/finalization.js +60 -15
  90. package/dist/lib/task/ledger-intents.js +1 -1
  91. package/dist/lib/task/lifecycle-execution.js +38 -33
  92. package/dist/lib/task/lifecycle.js +49 -41
  93. package/dist/lib/task/local-artifact-finalization.js +1 -4
  94. package/dist/lib/task/manual-validation-evidence.js +1 -37
  95. package/dist/lib/task/platform-operation-recovery.js +151 -108
  96. package/dist/lib/task/pr-delivery-fact.js +2 -5
  97. package/dist/lib/task/qualification-confirmation.js +5 -7
  98. package/dist/lib/task/resolve-ref.js +1 -25
  99. package/dist/lib/task/review-command.js +2 -2
  100. package/dist/lib/task/review-finalization.js +1 -21
  101. package/dist/lib/task/review-fingerprint.js +0 -4
  102. package/dist/lib/task/secure-fs.js +0 -56
  103. package/dist/lib/task/short-id.js +1 -39
  104. package/dist/lib/task/skill-scope.js +0 -1
  105. package/dist/lib/task/verification-engine.js +58 -282
  106. package/dist/lib/task/verification.js +6 -3
  107. package/dist/lib/task/write.js +11 -1
  108. package/lib/agent-clients/adapter.ts +0 -76
  109. package/lib/agent-clients/adapters/antigravity-cli.ts +0 -5
  110. package/lib/agent-clients/adapters/claude-code-credentials.ts +0 -19
  111. package/lib/agent-clients/adapters/claude-code.ts +0 -9
  112. package/lib/agent-clients/adapters/codex.ts +0 -56
  113. package/lib/agent-clients/adapters/opencode.ts +0 -5
  114. package/lib/agent-clients/adapters/traecli.ts +0 -5
  115. package/lib/agent-clients/config.ts +20 -61
  116. package/lib/agent-clients/registry.ts +1 -34
  117. package/lib/agent-clients/schema.ts +0 -18
  118. package/lib/agent-clients/tokens.ts +1 -2
  119. package/lib/agent-clients/types.ts +0 -15
  120. package/lib/decide.ts +1 -0
  121. package/lib/git/worktree-identity.ts +0 -10
  122. package/lib/internal/agent-client.ts +2 -70
  123. package/lib/internal/cli-route-inventory.ts +1 -4
  124. package/lib/internal/manual-validation.ts +28 -27
  125. package/lib/internal/platform-comment.ts +46 -4
  126. package/lib/internal/task-create.ts +0 -1
  127. package/lib/internal/task-event.ts +1 -5
  128. package/lib/internal/task-finalization.ts +0 -1
  129. package/lib/internal/task-lifecycle.ts +3 -5
  130. package/lib/internal/task-operation-registry.ts +3 -19
  131. package/lib/internal/task-review.ts +4 -4
  132. package/lib/platform/comment-safety.ts +0 -10
  133. package/lib/platform/github-provider.ts +0 -2
  134. package/lib/platform/in-label-sync.ts +0 -16
  135. package/lib/platform/issue-comments.ts +478 -301
  136. package/lib/platform/issue-summary-content.ts +132 -0
  137. package/lib/platform/issues.ts +0 -2
  138. package/lib/platform/operation-coordinator.ts +4 -2
  139. package/lib/platform/pr-change-report.ts +165 -25
  140. package/lib/platform/pr-checks.ts +1 -10
  141. package/lib/platform/pr-review.ts +1 -1
  142. package/lib/platform/pr-summary-content.ts +60 -0
  143. package/lib/platform/pr-summary.ts +364 -257
  144. package/lib/platform/provider-bridge.ts +0 -1
  145. package/lib/platform/provider-loader.ts +1 -5
  146. package/lib/platform/provider-validation.ts +1 -49
  147. package/lib/platform/pull-requests.ts +64 -99
  148. package/lib/platform/releases.ts +1 -40
  149. package/lib/platform/summary-content-pipeline.ts +23 -0
  150. package/lib/platform/verification-required.ts +0 -2
  151. package/lib/platform/verification-sync.ts +0 -94
  152. package/lib/process-data/normalize.ts +1 -186
  153. package/lib/process-data/privacy.ts +2 -19
  154. package/lib/process-data/sources.ts +3 -283
  155. package/lib/render.ts +0 -15
  156. package/lib/run/index.ts +13 -7
  157. package/lib/run/skills.ts +0 -4
  158. package/lib/sandbox/commands/create.ts +37 -74
  159. package/lib/sandbox/commands/list-running.ts +0 -19
  160. package/lib/sandbox/commands/start.ts +7 -10
  161. package/lib/sandbox/constants.ts +0 -8
  162. package/lib/sandbox/control/client.ts +0 -1
  163. package/lib/sandbox/control/container-identity.ts +1 -16
  164. package/lib/sandbox/control/executor.ts +1 -5
  165. package/lib/sandbox/control/identity-sentinel.ts +0 -8
  166. package/lib/sandbox/control/lifecycle.ts +18 -51
  167. package/lib/sandbox/control/native-file-lock.ts +0 -8
  168. package/lib/sandbox/control/protocol.ts +0 -2
  169. package/lib/sandbox/control/server.ts +13 -39
  170. package/lib/sandbox/control/state.ts +1 -10
  171. package/lib/sandbox/dockerfile.ts +0 -11
  172. package/lib/sandbox/engine.ts +0 -17
  173. package/lib/sandbox/engines/docker-exact-discovery.ts +1 -5
  174. package/lib/sandbox/engines/wsl2-paths.ts +0 -4
  175. package/lib/sandbox/recovery.ts +24 -26
  176. package/lib/sandbox/removal.ts +58 -687
  177. package/lib/sandbox/shell.ts +1 -1
  178. package/lib/sandbox/task-resolver.ts +0 -48
  179. package/lib/sandbox/tools.ts +1 -5
  180. package/lib/sandbox/workspace-view.ts +2 -4
  181. package/lib/server/display.ts +0 -14
  182. package/lib/server/process-control.ts +1 -1
  183. package/lib/task/activity-intent.ts +36 -44
  184. package/lib/task/activity-log.ts +9 -22
  185. package/lib/task/artifact-command.ts +1 -1
  186. package/lib/task/artifact-lifecycle.ts +58 -67
  187. package/lib/task/artifact-name.ts +0 -7
  188. package/lib/task/artifact-operations.ts +3 -3
  189. package/lib/task/capabilities.ts +5 -6
  190. package/lib/task/commands/log.ts +0 -7
  191. package/lib/task/commands/status.ts +14 -79
  192. package/lib/task/commit-operation.ts +29 -51
  193. package/lib/task/completion-facts.ts +45 -42
  194. package/lib/task/control-authority.ts +27 -317
  195. package/lib/task/control-recovery.ts +2 -5
  196. package/lib/task/create.ts +2 -5
  197. package/lib/task/decision-intents.ts +5 -5
  198. package/lib/task/delivery-target.ts +0 -40
  199. package/lib/task/events.ts +89 -123
  200. package/lib/task/finalization.ts +52 -15
  201. package/lib/task/ledger-intents.ts +1 -1
  202. package/lib/task/lifecycle-execution.ts +37 -89
  203. package/lib/task/lifecycle.ts +48 -44
  204. package/lib/task/local-artifact-finalization.ts +0 -7
  205. package/lib/task/manual-validation-evidence.ts +1 -47
  206. package/lib/task/platform-operation-recovery.ts +117 -104
  207. package/lib/task/pr-delivery-fact.ts +2 -11
  208. package/lib/task/qualification-confirmation.ts +6 -6
  209. package/lib/task/resolve-ref.ts +0 -23
  210. package/lib/task/review-command.ts +2 -2
  211. package/lib/task/review-finalization.ts +1 -27
  212. package/lib/task/review-fingerprint.ts +0 -8
  213. package/lib/task/secure-fs.ts +0 -42
  214. package/lib/task/short-id.ts +0 -43
  215. package/lib/task/skill-scope.ts +0 -1
  216. package/lib/task/verification-engine.ts +56 -287
  217. package/lib/task/verification.ts +5 -5
  218. package/lib/task/write.ts +12 -1
  219. package/package.json +2 -2
  220. package/templates/.agents/README.en.md +1 -3
  221. package/templates/.agents/README.zh-CN.md +0 -2
  222. package/templates/.agents/rules/README.en.md +0 -1
  223. package/templates/.agents/rules/README.zh-CN.md +0 -1
  224. package/templates/.agents/rules/commit-and-pr.en.md +1 -1
  225. package/templates/.agents/rules/commit-and-pr.zh-CN.md +1 -1
  226. package/templates/.agents/rules/no-mid-flow-questions.en.md +0 -10
  227. package/templates/.agents/rules/no-mid-flow-questions.zh-CN.md +0 -10
  228. package/templates/.agents/rules/pr-sync.en.md +4 -2
  229. package/templates/.agents/rules/pr-sync.zh-CN.md +6 -9
  230. package/templates/.agents/rules/task-management.en.md +3 -3
  231. package/templates/.agents/rules/task-management.zh-CN.md +3 -3
  232. package/templates/.agents/skills/analyze-task/SKILL.en.md +3 -3
  233. package/templates/.agents/skills/analyze-task/SKILL.zh-CN.md +3 -3
  234. package/templates/.agents/skills/cancel-task/SKILL.en.md +2 -2
  235. package/templates/.agents/skills/cancel-task/SKILL.zh-CN.md +2 -2
  236. package/templates/.agents/skills/code-task/SKILL.en.md +2 -2
  237. package/templates/.agents/skills/code-task/SKILL.zh-CN.md +4 -4
  238. package/templates/.agents/skills/commit/SKILL.en.md +2 -2
  239. package/templates/.agents/skills/commit/SKILL.zh-CN.md +2 -2
  240. package/templates/.agents/skills/commit/reference/commit-orchestration.en.md +6 -6
  241. package/templates/.agents/skills/commit/reference/commit-orchestration.zh-CN.md +6 -6
  242. package/templates/.agents/skills/commit/reference/pr-summary-sync.en.md +1 -1
  243. package/templates/.agents/skills/commit/reference/pr-summary-sync.zh-CN.md +1 -1
  244. package/templates/.agents/skills/complete-manual-validation/reference/summary-update.en.md +2 -2
  245. package/templates/.agents/skills/complete-manual-validation/reference/summary-update.zh-CN.md +2 -2
  246. package/templates/.agents/skills/complete-task/SKILL.en.md +10 -25
  247. package/templates/.agents/skills/complete-task/SKILL.zh-CN.md +11 -26
  248. package/templates/.agents/skills/create-pr/SKILL.en.md +1 -1
  249. package/templates/.agents/skills/create-pr/SKILL.zh-CN.md +1 -1
  250. package/templates/.agents/skills/create-pr/reference/change-report.en.md +9 -2
  251. package/templates/.agents/skills/create-pr/reference/change-report.zh-CN.md +9 -2
  252. package/templates/.agents/skills/create-pr/reference/comment-publish.en.md +2 -2
  253. package/templates/.agents/skills/create-pr/reference/comment-publish.zh-CN.md +2 -2
  254. package/templates/.agents/skills/create-task/SKILL.en.md +0 -18
  255. package/templates/.agents/skills/create-task/SKILL.zh-CN.md +0 -18
  256. package/templates/.agents/skills/plan-task/SKILL.en.md +2 -2
  257. package/templates/.agents/skills/plan-task/SKILL.zh-CN.md +2 -2
  258. package/templates/.agents/skills/review-analysis/SKILL.en.md +3 -3
  259. package/templates/.agents/skills/review-analysis/SKILL.zh-CN.md +3 -3
  260. package/templates/.agents/skills/review-code/SKILL.en.md +5 -5
  261. package/templates/.agents/skills/review-code/SKILL.zh-CN.md +5 -5
  262. package/templates/.agents/skills/review-plan/SKILL.en.md +3 -3
  263. package/templates/.agents/skills/review-plan/SKILL.zh-CN.md +3 -3
  264. package/templates/.agents/skills/review-pr/SKILL.en.md +4 -4
  265. package/templates/.agents/skills/review-pr/SKILL.zh-CN.md +4 -4
  266. package/templates/.agents/skills/run-manual-validation/SKILL.en.md +1 -1
  267. package/templates/.agents/skills/run-manual-validation/SKILL.zh-CN.md +1 -1
  268. package/templates/.agents/skills/update-agent-infra/scripts/sync-templates.js +3 -75
  269. package/templates/.agents/skills/watch-pr/SKILL.en.md +1 -1
  270. package/templates/.agents/skills/watch-pr/SKILL.zh-CN.md +1 -1
  271. package/templates/.agents/skills/watch-pr/reference/monitor-and-heal.en.md +3 -3
  272. package/templates/.agents/skills/watch-pr/reference/monitor-and-heal.zh-CN.md +3 -3
  273. package/templates/.agents/templates/task.en.md +1 -0
  274. package/templates/.agents/templates/task.zh-CN.md +1 -0
  275. package/templates/.claude/settings.json +0 -24
  276. package/templates/.codex/hooks.json +0 -50
  277. package/dist/lib/agent-clients/adapters/codex-lifecycle/app-server.js +0 -582
  278. package/dist/lib/agent-clients/adapters/codex-lifecycle/binding.js +0 -114
  279. package/dist/lib/agent-clients/adapters/codex-lifecycle/build-identity.js +0 -237
  280. package/dist/lib/agent-clients/adapters/codex-lifecycle/cli.js +0 -443
  281. package/dist/lib/agent-clients/adapters/codex-lifecycle/evidence.js +0 -236
  282. package/dist/lib/agent-clients/adapters/codex-lifecycle/recovery.js +0 -292
  283. package/dist/lib/agent-clients/adapters/codex-lifecycle/store.js +0 -267
  284. package/dist/lib/agent-clients/adapters/codex-orchestration.js +0 -466
  285. package/dist/lib/internal/task-orchestration.js +0 -71
  286. package/dist/lib/platform/verification.js +0 -6
  287. package/dist/lib/run/prompt.js +0 -2
  288. package/dist/lib/sandbox/engines/authority.js +0 -289
  289. package/dist/lib/task/delegation-receipts.js +0 -410
  290. package/dist/lib/task/orchestration.js +0 -1233
  291. package/dist/lib/task/verification-checks.js +0 -9
  292. package/dist/lib/task/workspace-snapshot.js +0 -121
  293. package/dist/lifecycle-build-manifest.json +0 -6
  294. package/lib/agent-clients/adapters/codex-lifecycle/app-server.ts +0 -688
  295. package/lib/agent-clients/adapters/codex-lifecycle/binding.ts +0 -147
  296. package/lib/agent-clients/adapters/codex-lifecycle/build-identity.ts +0 -349
  297. package/lib/agent-clients/adapters/codex-lifecycle/cli.ts +0 -506
  298. package/lib/agent-clients/adapters/codex-lifecycle/evidence.ts +0 -385
  299. package/lib/agent-clients/adapters/codex-lifecycle/manifest-files.json +0 -41
  300. package/lib/agent-clients/adapters/codex-lifecycle/recovery.ts +0 -418
  301. package/lib/agent-clients/adapters/codex-lifecycle/store.ts +0 -354
  302. package/lib/agent-clients/adapters/codex-orchestration.ts +0 -630
  303. package/lib/internal/task-orchestration.ts +0 -74
  304. package/lib/platform/verification.ts +0 -11
  305. package/lib/run/prompt.ts +0 -1
  306. package/lib/sandbox/engines/authority.ts +0 -365
  307. package/lib/task/delegation-receipts.ts +0 -547
  308. package/lib/task/orchestration.ts +0 -1651
  309. package/lib/task/verification-checks.ts +0 -10
  310. package/lib/task/workspace-snapshot.ts +0 -144
  311. package/templates/.agents/hooks/lifecycle-delegation.js +0 -140
  312. package/templates/.agents/rules/lifecycle-orchestration.en.md +0 -44
  313. package/templates/.agents/rules/lifecycle-orchestration.zh-CN.md +0 -44
  314. package/templates/.agents/skills/run-task/SKILL.en.md +0 -29
  315. package/templates/.agents/skills/run-task/SKILL.zh-CN.md +0 -29
  316. package/templates/.agents/skills/run-task/config/verify.en.json +0 -10
  317. package/templates/.agents/skills/run-task/config/verify.zh-CN.json +0 -10
  318. package/templates/.agents/skills/run-task/reference/host-validation.en.md +0 -24
  319. package/templates/.agents/skills/run-task/reference/host-validation.zh-CN.md +0 -24
  320. package/templates/.claude/agents/agent-infra-lifecycle-executor.en.md +0 -6
  321. package/templates/.claude/agents/agent-infra-lifecycle-executor.zh-CN.md +0 -6
  322. package/templates/.claude/agents/agent-infra-lifecycle-reviewer.en.md +0 -6
  323. package/templates/.claude/agents/agent-infra-lifecycle-reviewer.zh-CN.md +0 -6
  324. package/templates/.claude/commands/run-task.en.md +0 -8
  325. package/templates/.claude/commands/run-task.zh-CN.md +0 -8
  326. package/templates/.codex/agents/agent-infra-lifecycle-executor.en.toml +0 -3
  327. package/templates/.codex/agents/agent-infra-lifecycle-executor.zh-CN.toml +0 -3
  328. package/templates/.codex/agents/agent-infra-lifecycle-reviewer.en.toml +0 -3
  329. package/templates/.codex/agents/agent-infra-lifecycle-reviewer.zh-CN.toml +0 -3
  330. package/templates/.opencode/commands/run-task.en.md +0 -11
  331. 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, manifestPath, request, operation, terminalResult, payload?.stdout ?? null);
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
- const terminalResult = writeSandboxControlTerminalResult(manifest, {
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, manifestPath: string, broker: BrokerOwner, brokerOwns: () => boolean): Promise<boolean> {
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, manifestPath, request, resultEvidence, payload, terminalResult!);
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, manifestPath, broker, brokerOwns)) return;
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 if (observation.state === 'unknown') {
860
- containerReasonCode = 'SANDBOX_CONTROL_CONTAINER_UNKNOWN';
861
- appendDiagnosticAudit(manifest, 'container-heartbeat-unknown', { reason: observation.reason });
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
- }
@@ -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 = options.authority
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
  }
@@ -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: params.row.name,
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: params.row.name, identity: params.workspace
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: params.row.name,
1315
+ container: container,
1318
1316
  taskId: params.workspace.taskId,
1319
1317
  start: startFn
1320
1318
  });
1321
1319
  } else {
1322
- startFn(params.engine, params.row.name);
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: params.row.name,
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: params.row.name,
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: params.row.name,
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: params.row.name,
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: params.row.name,
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: params.row.name,
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: params.row.name, path: 'recovered', warnings };
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: params.row.name,
1393
+ container: container,
1396
1394
  deps
1397
1395
  });
1398
1396
  if (initial.findings.length === 0) {
1399
- return { container: params.row.name, path: 'healthy', warnings };
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: params.row.name,
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: params.row.name,
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: params.row.name,
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: params.row.name,
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: params.row.name, path: 'recovered', warnings };
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 ${params.row.name} bash /usr/local/bin/sandbox-tmux-entry`,
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: ${params.row.name}; branch: ${params.branch}.`,
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.',