@opengeni/worker-bundle 1.0.0-canary.0 → 1.0.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.
Files changed (244) hide show
  1. package/dist/activities/agent-run-admission.d.ts +3 -1
  2. package/dist/activities/agent-turn/admission.d.ts +24 -3
  3. package/dist/activities/agent-turn/agent-build.d.ts +4 -0
  4. package/dist/activities/agent-turn/claude-usage-observer.d.ts +58 -0
  5. package/dist/activities/agent-turn/code-search.d.ts +60 -0
  6. package/dist/activities/agent-turn/codex-capacity.d.ts +13 -0
  7. package/dist/activities/agent-turn/codex-plan-entitlement.d.ts +105 -0
  8. package/dist/activities/agent-turn/codex.d.ts +3 -2
  9. package/dist/activities/agent-turn/compaction-prep.d.ts +21 -5
  10. package/dist/activities/agent-turn/credential-leases.d.ts +19 -33
  11. package/dist/activities/agent-turn/credential-restriction.d.ts +3 -0
  12. package/dist/activities/agent-turn/errors.d.ts +82 -11
  13. package/dist/activities/agent-turn/failure-settlement.d.ts +6 -3
  14. package/dist/activities/agent-turn/final-reply.d.ts +18 -0
  15. package/dist/activities/agent-turn/finalization-monitor.d.ts +17 -0
  16. package/dist/activities/agent-turn/finalization.d.ts +4 -2
  17. package/dist/activities/agent-turn/github-repository-bindings.d.ts +2 -0
  18. package/dist/activities/agent-turn/governance-model.d.ts +9 -2
  19. package/dist/activities/agent-turn/history-sink.d.ts +2 -0
  20. package/dist/activities/agent-turn/history.d.ts +2 -0
  21. package/dist/activities/agent-turn/input-wait-reply.d.ts +41 -0
  22. package/dist/activities/agent-turn/media-artifacts.d.ts +5 -3
  23. package/dist/activities/agent-turn/model-call-admission.d.ts +15 -0
  24. package/dist/activities/agent-turn/model-usage.d.ts +6 -0
  25. package/dist/activities/agent-turn/model-wire-dispatch.d.ts +15 -0
  26. package/dist/activities/agent-turn/optional-repositories.d.ts +59 -0
  27. package/dist/activities/agent-turn/provider-dispatch-barrier.d.ts +12 -1
  28. package/dist/activities/agent-turn/quiescence.d.ts +7 -7
  29. package/dist/activities/agent-turn/recovery-warning.d.ts +9 -0
  30. package/dist/activities/agent-turn/refresh-credentials.d.ts +6 -0
  31. package/dist/activities/agent-turn/run-credentials.d.ts +8 -3
  32. package/dist/activities/agent-turn/sandbox-establish.d.ts +2 -1
  33. package/dist/activities/agent-turn/sandbox-provision.d.ts +3 -1
  34. package/dist/activities/agent-turn/sandbox-route.d.ts +3 -20
  35. package/dist/activities/agent-turn/sandbox-runtime.d.ts +2 -2
  36. package/dist/activities/agent-turn/session-title.d.ts +34 -2
  37. package/dist/activities/agent-turn/skill-checkout.d.ts +25 -6
  38. package/dist/activities/agent-turn/skill-read.d.ts +70 -2
  39. package/dist/activities/agent-turn/skill-remove.d.ts +14 -0
  40. package/dist/activities/agent-turn/skill-search.d.ts +3 -1
  41. package/dist/activities/agent-turn/skill-tools.d.ts +15 -2
  42. package/dist/activities/agent-turn/skill-transfer.d.ts +18 -6
  43. package/dist/activities/agent-turn/stream-attempt.d.ts +7 -3
  44. package/dist/activities/agent-turn/subscription-lease.d.ts +38 -0
  45. package/dist/activities/agent-turn/tool-environment.d.ts +56 -6
  46. package/dist/activities/agent-turn/tool-policy.d.ts +43 -0
  47. package/dist/activities/agent-turn/turn-context.d.ts +29 -0
  48. package/dist/activities/agent-turn/turn-sandbox-access.d.ts +3 -0
  49. package/dist/activities/agent-turn/xai-capacity.d.ts +2 -1
  50. package/dist/activities/automations.d.ts +3 -1
  51. package/dist/activities/browser-deadline-checkpoint.d.ts +29 -0
  52. package/dist/activities/codemode-dispatcher.d.ts +9 -2
  53. package/dist/activities/codex-capacity.d.ts +18 -2
  54. package/dist/activities/codex-rotation.d.ts +7 -1
  55. package/dist/activities/context-compaction.d.ts +16 -2
  56. package/dist/activities/gmail-files.d.ts +32 -0
  57. package/dist/activities/goals.d.ts +8 -0
  58. package/dist/activities/knowledge-indexing.d.ts +19 -0
  59. package/dist/activities/mcp-account-routes.d.ts +3 -0
  60. package/dist/activities/mcp-credentials.d.ts +12 -13
  61. package/dist/activities/mcp-operation-authority.d.ts +0 -5
  62. package/dist/activities/model-call-fact-reconciler.d.ts +34 -0
  63. package/dist/activities/open-suffix-resume.d.ts +13 -0
  64. package/dist/activities/parent-wake.d.ts +6 -12
  65. package/dist/activities/retained-screenshots.d.ts +7 -2
  66. package/dist/activities/rig-verification.d.ts +2 -3
  67. package/dist/activities/run-credential-renewal.d.ts +1 -0
  68. package/dist/activities/run-credentials.d.ts +15 -3
  69. package/dist/activities/sandbox-images.d.ts +1 -1
  70. package/dist/activities/sandbox-lease.d.ts +47 -9
  71. package/dist/activities/scheduled-tasks.d.ts +4 -35
  72. package/dist/activities/session-state.d.ts +70 -3
  73. package/dist/activities/types.d.ts +55 -6
  74. package/dist/activities/workspace-capture.d.ts +2 -0
  75. package/dist/activities/workspace-credential-provider.d.ts +46 -0
  76. package/dist/{activities-control-HMFGSKC5.js → activities-control-BNPTRTOE.js} +1896 -418
  77. package/dist/activities-control-BNPTRTOE.js.map +1 -0
  78. package/dist/activities-control.d.ts +182 -4
  79. package/dist/{activities-turn-AP67JADS.js → activities-turn-5LGZOSVU.js} +4476 -1327
  80. package/dist/activities-turn-5LGZOSVU.js.map +1 -0
  81. package/dist/activities.d.ts +182 -4
  82. package/dist/artifact-materializer-entry.js +5 -2
  83. package/dist/artifact-materializer-entry.js.map +1 -1
  84. package/dist/artifact-outbox-entry.js +5 -2
  85. package/dist/artifact-outbox-entry.js.map +1 -1
  86. package/dist/browser-deadline-checkpoint-contract.d.ts +2 -0
  87. package/dist/{chunk-A4XQWVZK.js → chunk-3ZTRWDMN.js} +307 -4
  88. package/dist/chunk-3ZTRWDMN.js.map +1 -0
  89. package/dist/{chunk-RAMNYSAW.js → chunk-4ER3YXOT.js} +22 -4
  90. package/dist/chunk-4ER3YXOT.js.map +1 -0
  91. package/dist/{chunk-CYITU5UH.js → chunk-LJX7Z2KP.js} +1445 -343
  92. package/dist/chunk-LJX7Z2KP.js.map +1 -0
  93. package/dist/editable-artifact-materializer-service.d.ts +2 -2
  94. package/dist/editable-artifact-outbox-service.d.ts +2 -2
  95. package/dist/host-export-pump.d.ts +3 -1
  96. package/dist/host-export.d.ts +1 -1
  97. package/dist/host-export.js +1 -1
  98. package/dist/http.d.ts +1 -1
  99. package/dist/index.d.ts +95 -3
  100. package/dist/index.js +137 -43
  101. package/dist/index.js.map +1 -1
  102. package/dist/observability-metrics.d.ts +118 -8
  103. package/dist/retained-process-diagnostics.d.ts +4 -0
  104. package/dist/retained-process-retry.d.ts +7 -0
  105. package/dist/sandbox-resume.d.ts +55 -13
  106. package/dist/sandbox-routing.d.ts +5 -3
  107. package/dist/sandbox-snapshot-diagnostics.d.ts +20 -0
  108. package/dist/session-event-fanout.d.ts +6 -0
  109. package/dist/warm-capture-holder.d.ts +3 -0
  110. package/dist/worker-service-lifecycle.d.ts +12 -0
  111. package/dist/workflow-bundle.js +273 -41
  112. package/dist/workflows/activities.d.ts +1 -1
  113. package/dist/workflows/browser-deadline-checkpoint.d.ts +9 -0
  114. package/dist/workflows/scheduled-tasks.d.ts +4 -0
  115. package/dist/workflows/session.d.ts +36 -0
  116. package/dist/workflows.d.ts +1 -0
  117. package/package.json +21 -19
  118. package/src/activities/agent-run-admission.ts +17 -1
  119. package/src/activities/agent-turn/admission.ts +66 -3
  120. package/src/activities/agent-turn/agent-build.ts +84 -10
  121. package/src/activities/agent-turn/claim.ts +186 -43
  122. package/src/activities/agent-turn/claude-usage-observer.ts +221 -0
  123. package/src/activities/agent-turn/code-search.ts +275 -0
  124. package/src/activities/agent-turn/codex-capacity.ts +172 -8
  125. package/src/activities/agent-turn/codex-plan-entitlement.ts +254 -0
  126. package/src/activities/agent-turn/codex.ts +13 -5
  127. package/src/activities/agent-turn/compaction-prep.ts +170 -102
  128. package/src/activities/agent-turn/credential-leases.ts +122 -216
  129. package/src/activities/agent-turn/credential-restriction.ts +14 -0
  130. package/src/activities/agent-turn/errors.ts +647 -48
  131. package/src/activities/agent-turn/failure-settlement.ts +682 -130
  132. package/src/activities/agent-turn/final-reply.ts +46 -0
  133. package/src/activities/agent-turn/finalization-monitor.ts +120 -0
  134. package/src/activities/agent-turn/finalization.ts +146 -43
  135. package/src/activities/agent-turn/github-repository-bindings.ts +3 -1
  136. package/src/activities/agent-turn/governance-model.ts +69 -28
  137. package/src/activities/agent-turn/history-sink.ts +16 -2
  138. package/src/activities/agent-turn/history.ts +38 -11
  139. package/src/activities/agent-turn/input-wait-reply.ts +103 -0
  140. package/src/activities/agent-turn/knowledge-source-tools.ts +2 -0
  141. package/src/activities/agent-turn/media-artifacts.ts +2 -1
  142. package/src/activities/agent-turn/model-call-admission.ts +94 -0
  143. package/src/activities/agent-turn/model-usage.ts +64 -3
  144. package/src/activities/agent-turn/model-wire-dispatch.ts +27 -0
  145. package/src/activities/agent-turn/optional-repositories.ts +224 -0
  146. package/src/activities/agent-turn/provider-dispatch-barrier.ts +22 -0
  147. package/src/activities/agent-turn/quiescence.ts +10 -7
  148. package/src/activities/agent-turn/recovery-warning.ts +16 -0
  149. package/src/activities/agent-turn/refresh-credentials.ts +44 -0
  150. package/src/activities/agent-turn/run-credentials.ts +116 -55
  151. package/src/activities/agent-turn/run.ts +320 -93
  152. package/src/activities/agent-turn/sandbox-establish.ts +84 -8
  153. package/src/activities/agent-turn/sandbox-provision.ts +3 -1
  154. package/src/activities/agent-turn/sandbox-route.ts +4 -21
  155. package/src/activities/agent-turn/sandbox-runtime.ts +343 -18
  156. package/src/activities/agent-turn/session-title.ts +81 -5
  157. package/src/activities/agent-turn/skill-checkout.ts +111 -24
  158. package/src/activities/agent-turn/skill-install.ts +1 -1
  159. package/src/activities/agent-turn/skill-read.ts +374 -28
  160. package/src/activities/agent-turn/skill-remove.ts +46 -0
  161. package/src/activities/agent-turn/skill-save.ts +1 -1
  162. package/src/activities/agent-turn/skill-search.ts +10 -1
  163. package/src/activities/agent-turn/skill-selection.ts +4 -0
  164. package/src/activities/agent-turn/skill-tools.ts +112 -18
  165. package/src/activities/agent-turn/skill-transfer.ts +68 -23
  166. package/src/activities/agent-turn/stream-attempt.ts +313 -77
  167. package/src/activities/agent-turn/subscription-lease.ts +115 -0
  168. package/src/activities/agent-turn/tool-environment.ts +316 -167
  169. package/src/activities/agent-turn/tool-policy.ts +80 -1
  170. package/src/activities/agent-turn/turn-context.ts +35 -0
  171. package/src/activities/agent-turn/turn-sandbox-access.ts +7 -1
  172. package/src/activities/agent-turn/xai-capacity.ts +94 -51
  173. package/src/activities/automations.ts +76 -4
  174. package/src/activities/browser-deadline-checkpoint.ts +279 -0
  175. package/src/activities/capabilities.ts +108 -11
  176. package/src/activities/codemode-dispatcher.ts +36 -8
  177. package/src/activities/codex-capacity.ts +60 -25
  178. package/src/activities/codex-rotation.ts +39 -17
  179. package/src/activities/context-compaction.ts +75 -18
  180. package/src/activities/gmail-files.ts +88 -0
  181. package/src/activities/goals.ts +116 -121
  182. package/src/activities/google-drive-publication.ts +1 -3
  183. package/src/activities/image-generation-operation.ts +1 -1
  184. package/src/activities/knowledge-indexing.ts +269 -15
  185. package/src/activities/knowledge-source-sync.ts +10 -0
  186. package/src/activities/mcp-account-routes.ts +17 -0
  187. package/src/activities/mcp-credentials.ts +83 -194
  188. package/src/activities/mcp-operation-authority.ts +16 -41
  189. package/src/activities/model-call-fact-reconciler.ts +112 -0
  190. package/src/activities/open-suffix-resume.ts +15 -2
  191. package/src/activities/parent-wake.ts +46 -21
  192. package/src/activities/retained-screenshots.ts +82 -11
  193. package/src/activities/rig-verification.ts +38 -37
  194. package/src/activities/run-credential-renewal.ts +13 -1
  195. package/src/activities/run-credentials.ts +59 -17
  196. package/src/activities/run-input.ts +25 -16
  197. package/src/activities/sandbox-images.ts +0 -1
  198. package/src/activities/sandbox-lease.ts +798 -82
  199. package/src/activities/scheduled-tasks.ts +550 -178
  200. package/src/activities/session-state.ts +245 -6
  201. package/src/activities/site-auth-maintenance.ts +3 -0
  202. package/src/activities/types.ts +72 -5
  203. package/src/activities/workflow-wake.ts +2 -17
  204. package/src/activities/workspace-capture.ts +13 -2
  205. package/src/activities/workspace-credential-provider.ts +283 -0
  206. package/src/activities-control.ts +4 -0
  207. package/src/activities-turn.ts +5 -0
  208. package/src/activities.ts +13 -0
  209. package/src/activity-services.ts +16 -4
  210. package/src/browser-deadline-checkpoint-contract.ts +5 -0
  211. package/src/editable-artifact-hint-broker.ts +3 -0
  212. package/src/editable-artifact-materializer-service.ts +7 -3
  213. package/src/editable-artifact-outbox-service.ts +4 -4
  214. package/src/github-rest-mcp.ts +1 -2
  215. package/src/host-export-pump.ts +26 -4
  216. package/src/host-export.ts +3 -0
  217. package/src/http.ts +4 -2
  218. package/src/index.ts +99 -37
  219. package/src/observability-metrics.ts +510 -5
  220. package/src/personal-github-git-credentials.ts +2 -1
  221. package/src/pr-review-credentials.ts +1 -3
  222. package/src/retained-process-diagnostics.ts +50 -0
  223. package/src/retained-process-retry.ts +36 -0
  224. package/src/sandbox-resume.ts +388 -101
  225. package/src/sandbox-routing.ts +150 -25
  226. package/src/sandbox-snapshot-diagnostics.ts +112 -0
  227. package/src/session-event-fanout.ts +23 -0
  228. package/src/warm-capture-holder.ts +15 -0
  229. package/src/worker-service-lifecycle.ts +53 -0
  230. package/src/workflows/activities.ts +16 -1
  231. package/src/workflows/browser-deadline-checkpoint.ts +50 -0
  232. package/src/workflows/file-upload-reaper.ts +2 -0
  233. package/src/workflows/scheduled-tasks.ts +26 -13
  234. package/src/workflows/session.ts +242 -22
  235. package/src/workflows.ts +4 -0
  236. package/dist/activities/agent-turn/knowledge-sources.d.ts +0 -20
  237. package/dist/activities/packs.d.ts +0 -55
  238. package/dist/activities-control-HMFGSKC5.js.map +0 -1
  239. package/dist/activities-turn-AP67JADS.js.map +0 -1
  240. package/dist/chunk-A4XQWVZK.js.map +0 -1
  241. package/dist/chunk-CYITU5UH.js.map +0 -1
  242. package/dist/chunk-RAMNYSAW.js.map +0 -1
  243. package/src/activities/agent-turn/knowledge-sources.ts +0 -86
  244. package/src/activities/packs.ts +0 -166
@@ -1,4 +1,5 @@
1
1
  import {
2
+ authorizeAutomaticSandboxCheckpointRecovery,
2
3
  getEnrollment,
3
4
  getSandbox,
4
5
  readActiveSandbox,
@@ -6,7 +7,10 @@ import {
6
7
  assertPersonalMachineForAttempt,
7
8
  type SandboxRecord,
8
9
  } from "@opengeni/db";
9
- import { sandboxOperationMetricObserver } from "@opengeni/observability";
10
+ import {
11
+ sandboxOperationMetricObserver,
12
+ sandboxCaptureWaitMetricObserver,
13
+ } from "@opengeni/observability";
10
14
  import {
11
15
  withRunCredentialsSession,
12
16
  runOwnedSandboxSetup,
@@ -29,10 +33,14 @@ import {
29
33
  type MintedRunGitCredentials,
30
34
  type SandboxCodemodeAuthority,
31
35
  } from "../environment";
32
- import { rigProviderImageSourceImage } from "../packs";
36
+ import { rigProviderImageSourceImage } from "../sandbox-images";
33
37
  import type { TurnActivityServices as ActivityServices, RunAgentTurnInput } from "../types";
34
38
  import type { currentActivityContext } from "../streaming";
35
- import { resumeBoxForTurn, type ResumedTurnSandbox } from "../../sandbox-resume";
39
+ import {
40
+ createFreshSandboxReadinessReplacementBudget,
41
+ resumeBoxForTurn,
42
+ type ResumedTurnSandbox,
43
+ } from "../../sandbox-resume";
36
44
  import {
37
45
  wrapTurnBoxWithRouting,
38
46
  wrapLazyTurnBoxWithRouting,
@@ -41,6 +49,8 @@ import {
41
49
  } from "../../sandbox-routing";
42
50
  import {
43
51
  makeMachineOpObserver,
52
+ recordSandboxAutomaticRecoverySelected,
53
+ sandboxAutomaticRecoveryOutcome,
44
54
  recordSandboxLogicalProvision,
45
55
  recordSandboxProvisionAttempt,
46
56
  recordSandboxSharedPreparation,
@@ -92,6 +102,7 @@ export type SandboxRouteOk = {
92
102
  machinePrimary: boolean;
93
103
  groupBoxBackend: Settings["sandboxBackend"];
94
104
  groupBoxImage: ReturnType<typeof rigProviderImageSourceImage>;
105
+ groupBoxImagePolicy: "new_creates_only";
95
106
  sandboxCreationBackend: Settings["sandboxBackend"];
96
107
  effectiveRunCredentialBackend: Settings["sandboxBackend"];
97
108
  };
@@ -289,12 +300,16 @@ export async function resolveSandboxRoute(deps: SandboxRouteDeps): Promise<Sandb
289
300
  machinePrimary,
290
301
  groupBoxBackend,
291
302
  groupBoxImage,
303
+ groupBoxImagePolicy: "new_creates_only",
292
304
  sandboxCreationBackend,
293
305
  effectiveRunCredentialBackend,
294
306
  };
295
307
  }
296
308
 
297
309
  export async function establishTurnSandbox(deps: EstablishTurnSandboxDeps): Promise<void> {
310
+ // One fresh-box readiness replacement per turn attempt, shared by the eager
311
+ // establish and every lazy provisioner retry of this attempt.
312
+ const freshSandboxReadinessReplacementBudget = createFreshSandboxReadinessReplacementBudget();
298
313
  const {
299
314
  input,
300
315
  settings,
@@ -328,6 +343,7 @@ export async function establishTurnSandbox(deps: EstablishTurnSandboxDeps): Prom
328
343
  machinePrimary,
329
344
  groupBoxBackend,
330
345
  groupBoxImage,
346
+ groupBoxImagePolicy,
331
347
  rigVersion,
332
348
  turnResources,
333
349
  } = deps;
@@ -368,7 +384,54 @@ export async function establishTurnSandbox(deps: EstablishTurnSandboxDeps): Prom
368
384
  ) {
369
385
  const sandboxEstablishStartedAt = performance.now();
370
386
  let sandboxEstablishOutcome: "completed" | "failed" = "completed";
387
+ // A committed system recovery decision is rematerialized in this turn even
388
+ // when the sandbox is otherwise on-demand: the decision pins group
389
+ // membership until publication, and the next turn must not dead-end.
390
+ let automaticRecoveryPending = false;
371
391
  try {
392
+ if (!machinePrimary && groupBoxBackend === "modal" && activeSandboxBackend !== "selfhosted") {
393
+ // This happens before buildTurnAgent reads the durable instruction
394
+ // tail, even for an on-demand sandbox. The DB admits only a provider-
395
+ // lost group with no unresolved workspace writers in ANY member: the
396
+ // latest verified checkpoint, or a new empty workspace when none is
397
+ // usable. Every group member receives its durable warning receipt.
398
+ const fallback = await authorizeAutomaticSandboxCheckpointRecovery(db, {
399
+ accountId: input.accountId,
400
+ workspaceId: input.workspaceId,
401
+ sessionId: input.sessionId,
402
+ attemptId: input.attemptId,
403
+ });
404
+ automaticRecoveryPending = fallback.status !== "not_eligible";
405
+ if (fallback.status === "authorized") {
406
+ try {
407
+ recordSandboxAutomaticRecoverySelected(
408
+ observability,
409
+ "modal",
410
+ sandboxAutomaticRecoveryOutcome(fallback),
411
+ );
412
+ } catch {
413
+ // Telemetry must not turn a committed recovery into another failure.
414
+ }
415
+ if (fallback.lane === "checkpoint") {
416
+ observability.warn("managed sandbox selected an older verified checkpoint", {
417
+ backend: "modal",
418
+ workspaceId: input.workspaceId,
419
+ sessionId: input.sessionId,
420
+ archiveGeneration: fallback.selection.archiveGeneration,
421
+ workspaceGeneration: fallback.selection.workspaceGeneration,
422
+ groupSessionCount: fallback.groupSessionCount,
423
+ });
424
+ } else {
425
+ observability.warn("managed sandbox continues on an empty workspace after loss", {
426
+ backend: "modal",
427
+ workspaceId: input.workspaceId,
428
+ sessionId: input.sessionId,
429
+ reason: fallback.reason,
430
+ groupSessionCount: fallback.groupSessionCount,
431
+ });
432
+ }
433
+ }
434
+ }
372
435
  const managedOwnership = managedSandboxOwnershipForTurn(
373
436
  machinePrimary,
374
437
  input.attemptId,
@@ -444,6 +507,7 @@ export async function establishTurnSandbox(deps: EstablishTurnSandboxDeps): Prom
444
507
  bus,
445
508
  onOp: machineOpObserver.observer,
446
509
  onSandboxOperation: sandboxOperationObserver,
510
+ onSandboxCaptureWait: sandboxCaptureWaitMetricObserver(observability),
447
511
  opJournal,
448
512
  },
449
513
  {
@@ -515,6 +579,7 @@ export async function establishTurnSandbox(deps: EstablishTurnSandboxDeps): Prom
515
579
  opJournal,
516
580
  onOp: machineOpObserver.observer,
517
581
  onSandboxOperation: sandboxOperationObserver,
582
+ onSandboxCaptureWait: sandboxCaptureWaitMetricObserver(observability),
518
583
  onHomeSandboxRebound,
519
584
  ...(runtimeCancellationSignal ? { waitSignal: runtimeCancellationSignal } : {}),
520
585
  },
@@ -587,8 +652,11 @@ export async function establishTurnSandbox(deps: EstablishTurnSandboxDeps): Prom
587
652
  logicalFallbackSettings: logicalSandboxSettings,
588
653
  cancellationSignal: sandboxResumeSignal,
589
654
  sandboxMetrics: runtimeMetricsHooksForObservability(observability),
655
+ observability,
656
+ freshSandboxReadinessReplacementBudget,
590
657
  onSandboxLost: publishSandboxLost,
591
658
  objectStorage,
659
+ bus,
592
660
  },
593
661
  {
594
662
  accountId: input.accountId,
@@ -601,6 +669,7 @@ export async function establishTurnSandbox(deps: EstablishTurnSandboxDeps): Prom
601
669
  ...(groupBoxImage
602
670
  ? {
603
671
  image: groupBoxImage,
672
+ imagePolicy: groupBoxImagePolicy,
604
673
  }
605
674
  : {}),
606
675
  // The lazy acquire must enforce the same frozen rig authority
@@ -619,6 +688,7 @@ export async function establishTurnSandbox(deps: EstablishTurnSandboxDeps): Prom
619
688
  hasRepositoryResources: turnResources.some(
620
689
  (resource) => resource.kind === "repository",
621
690
  ),
691
+ automaticRecoveryPending,
622
692
  })
623
693
  ) {
624
694
  startRunGitCredentialsMint();
@@ -662,8 +732,11 @@ export async function establishTurnSandbox(deps: EstablishTurnSandboxDeps): Prom
662
732
  logicalFallbackSettings: logicalSandboxSettings,
663
733
  cancellationSignal: sandboxResumeSignal,
664
734
  sandboxMetrics: runtimeMetricsHooksForObservability(observability),
735
+ observability,
736
+ freshSandboxReadinessReplacementBudget,
665
737
  onSandboxLost: publishSandboxLost,
666
738
  objectStorage,
739
+ bus,
667
740
  },
668
741
  {
669
742
  accountId: input.accountId,
@@ -677,17 +750,17 @@ export async function establishTurnSandbox(deps: EstablishTurnSandboxDeps): Prom
677
750
  backend: groupBoxBackend,
678
751
  os: groupBoxOs,
679
752
  environment: sandboxEnvironment,
680
- // IMAGE IS SHARED STATE (B3): the container image
681
- // this run resolves. The lease stamps it + conflicts on a live shared box
682
- // running a DIFFERENT image (solo → durable rotation; N-holders →
683
- // SandboxImageConflictError surfaced as an actionable turn error). Select
684
- // the image for the actual group-box backend; a configured Modal image must
753
+ // Deployment/workspace pins select NEW creates only. The lease
754
+ // retains a live group's image through between-turn repins, even
755
+ // with other holders; only rotation/reaping elects a new image.
756
+ // Select the image for the actual group-box backend; a configured Modal image must
685
757
  // never override a Docker run. The selfhosted branch
686
758
  // (establishSelfhostedTurnSession) NEVER passes
687
759
  // an image — B3 lives only on this managed-box branch.
688
760
  ...(groupBoxImage
689
761
  ? {
690
762
  image: groupBoxImage,
763
+ imagePolicy: groupBoxImagePolicy,
691
764
  }
692
765
  : {}),
693
766
  // RIG IS SHARED STATE (M3): stamp the frozen rig version so the lease
@@ -755,6 +828,7 @@ export async function establishTurnSandbox(deps: EstablishTurnSandboxDeps): Prom
755
828
  bus,
756
829
  opJournal,
757
830
  onSandboxOperation: sandboxOperationObserver,
831
+ onSandboxCaptureWait: sandboxCaptureWaitMetricObserver(observability),
758
832
  onHomeSandboxLost: publishSandboxLost,
759
833
  onHomeSandboxRebound,
760
834
  ...(runtimeCancellationSignal ? { waitSignal: runtimeCancellationSignal } : {}),
@@ -1004,6 +1078,7 @@ export async function bindLazySandboxProvisioner(
1004
1078
  {
1005
1079
  settings: runSettings,
1006
1080
  environment: sandboxEnvironment,
1081
+ recordLazyManifest: true,
1007
1082
  onRuntimeEvent: async (event) => {
1008
1083
  await eventing.publish?.([{ type: event.type, payload: event.payload }], true);
1009
1084
  },
@@ -1122,6 +1197,7 @@ export async function bindLazySandboxProvisioner(
1122
1197
  opJournal,
1123
1198
  onOp: machineOpObserver.observer,
1124
1199
  onSandboxOperation: sandboxOperationObserver,
1200
+ onSandboxCaptureWait: sandboxCaptureWaitMetricObserver(observability),
1125
1201
  onHomeSandboxLost: publishSandboxLost,
1126
1202
  onHomeSandboxRebound,
1127
1203
  ...(runtimeCancellationSignal ? { waitSignal: runtimeCancellationSignal } : {}),
@@ -570,8 +570,10 @@ export function createTurnSandboxProvisioner<T>(
570
570
  * - legacy/built-in OpenAI or Azure Responses fallback (resolvedModel null);
571
571
  * - resolved built-in OpenAI/Azure providers;
572
572
  * - ChatGPT/Codex subscription backend (its strict allowlist permits the field).
573
+ * - native Anthropic Messages (maps the internal key to Claude session identity;
574
+ * the OpenAI field is never sent on that wire).
573
575
  *
574
- * Registry API-key providers are intentionally excluded. Fireworks' prompt-cache
576
+ * Other registry API-key providers are intentionally excluded. Fireworks' prompt-cache
575
577
  * docs prescribe `user` or `x-session-affinity`, not `prompt_cache_key`; Z.AI/GLM
576
578
  * documents automatic context caching plus `user_id`. Sending OpenAI-only fields
577
579
  * to unknown OpenAI-compatible providers risks unsupported-parameter 400s.
@@ -142,13 +142,16 @@ export function shouldPrefetchManagedSandbox(input: {
142
142
  machinePrimary: boolean;
143
143
  groupBoxBackend: Settings["sandboxBackend"];
144
144
  hasRepositoryResources: boolean;
145
+ /** A committed automatic post-loss recovery decision still awaits its box.
146
+ * Rematerialize now instead of leaving the group pinned until a tool call. */
147
+ automaticRecoveryPending?: boolean;
145
148
  }): boolean {
146
149
  if (input.establishPolicy !== "on-demand") return false;
147
150
  if (input.machinePrimary) return false;
148
151
  if (input.groupBoxBackend === "none" || input.groupBoxBackend === "selfhosted") {
149
152
  return false;
150
153
  }
151
- return input.hasRepositoryResources;
154
+ return input.hasRepositoryResources || input.automaticRecoveryPending === true;
152
155
  }
153
156
 
154
157
  /**
@@ -268,15 +271,6 @@ export async function reconcileActiveSandboxPointer(
268
271
  return { pointer: reread, record: rereadRecord };
269
272
  }
270
273
 
271
- /**
272
- * Warm the Modal private-registry image for the image ref this turn actually
273
- * resolved, not only the deployment-global OPENGENI_MODAL_IMAGE_REF warmed at
274
- * worker boot. A provider-native modalImageId bypasses registry import and is
275
- * resolved by ModalImageSelector.fromId during create. Otherwise packs can
276
- * override `modalImageRef` per workspace/turn, so a private pack image must be
277
- * resolved before sandbox creation or Modal falls back to the unauthenticated
278
- * `fromTag` path.
279
- */
280
274
  export async function ensureTurnModalRegistryImage(
281
275
  runSettings: Settings,
282
276
  sandboxCreationBackend: Settings["sandboxBackend"] | undefined,
@@ -302,17 +296,6 @@ export type SandboxArtifactRuntimeAdmission = Readonly<{
302
296
  environment: Readonly<Record<string, string>>;
303
297
  }>;
304
298
 
305
- /**
306
- * Admit the optional native standalone-file runtime only for the deployment's
307
- * exact base sandbox image contract. A pack/rig image override is an
308
- * independent filesystem and therefore fails closed even when the deployment
309
- * base image is capable. Collaborative artifact skills are admitted separately
310
- * from the frozen canonical tool catalog.
311
- *
312
- * This keeps lazy provisioning intact: CI/release proves the image closure,
313
- * while a before-agent-start doctor verifies the actual box before any model
314
- * call. No speculative sandbox is created merely to populate the skill index.
315
- */
316
299
  export function sandboxArtifactRuntimeAdmission(
317
300
  deploymentSettings: Settings,
318
301
  runSettings: Settings,