@opengeni/worker-bundle 1.0.0-canary.1 → 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
@@ -5,12 +5,16 @@ import type {
5
5
  RunCredentialsRequest,
6
6
  Session,
7
7
  SessionTurn,
8
+ ToolRef,
8
9
  } from "@opengeni/contracts";
10
+ import type { Settings } from "@opengeni/config";
9
11
  import { getSessionRootId, type Database } from "@opengeni/db";
10
12
  import {
11
13
  normalizeRunCredentialsResolution,
14
+ selectedSessionRemoteMcpTargets,
12
15
  type NormalizedRunCredentialMaterial,
13
16
  } from "@opengeni/runtime";
17
+ import { workspaceCredentialProviderResolver } from "./workspace-credential-provider";
14
18
 
15
19
  export type RunCredentialResolutionContext = {
16
20
  db: Database;
@@ -18,10 +22,17 @@ export type RunCredentialResolutionContext = {
18
22
  accountId: string;
19
23
  workspaceId: string;
20
24
  session: Session;
21
- turn: SessionTurn;
25
+ turn: SessionTurn & { initiatingHumanSubjectId?: string | null };
22
26
  attemptId: string;
23
27
  effectiveSandboxBackend: SandboxBackend;
24
28
  variableSet: { id: string; name: string } | null;
29
+ /** Enables the workspace's configured HTTP credential provider. */
30
+ settings?: Settings;
31
+ initiatingHumanSubjectId?: string | null;
32
+ /** Installed in-process API routes must never enter a product callback. */
33
+ localMcpServerIds?: readonly string[];
34
+ /** Exact execution selection, resolved once at the turn policy boundary. */
35
+ effectiveTools: readonly ToolRef[];
25
36
  };
26
37
 
27
38
  export type BoundRunCredentialResolver = {
@@ -32,7 +43,10 @@ export type BoundRunCredentialResolver = {
32
43
  };
33
44
 
34
45
  export function buildRunCredentialsRequest(
35
- input: Omit<RunCredentialResolutionContext, "db" | "connectionCredentials"> & {
46
+ input: Omit<
47
+ RunCredentialResolutionContext,
48
+ "db" | "connectionCredentials" | "settings" | "initiatingHumanSubjectId" | "effectiveTools"
49
+ > & {
36
50
  rootSessionId: string;
37
51
  purpose: "provision" | "renewal";
38
52
  forceRefresh: boolean;
@@ -95,11 +109,36 @@ export function runCredentialModelNote(
95
109
  * Freeze the provider-neutral host credential request to this exact admitted
96
110
  * turn. The host selects connections and material; the worker never infers a
97
111
  * provider from repositories, environment names, or an OpenGeni variable set.
112
+ * A workspace that configured its own HTTP credential provider uses it in
113
+ * place of the deployment's injected port.
98
114
  */
99
115
  export async function bindRunCredentialResolver(
100
116
  input: RunCredentialResolutionContext,
101
117
  ): Promise<BoundRunCredentialResolver | null> {
102
- const resolver = input.connectionCredentials?.runCredentials;
118
+ // Connected Machines own their credentials. Even provider lookup/callback
119
+ // must not be performed for a turn executing on the user's machine.
120
+ if (input.effectiveSandboxBackend === "selfhosted") return null;
121
+ const workspaceResolver = input.settings
122
+ ? await workspaceCredentialProviderResolver(
123
+ input.db,
124
+ input.settings,
125
+ { accountId: input.accountId, workspaceId: input.workspaceId },
126
+ input.turn.initiatingHumanSubjectId ?? null,
127
+ {
128
+ mcpServers: selectedSessionRemoteMcpTargets(
129
+ input.settings,
130
+ input.session.mcpServers ?? [],
131
+ input.effectiveTools,
132
+ (input.localMcpServerIds ?? []).map((id) => ({ id })),
133
+ ),
134
+ },
135
+ )
136
+ : null;
137
+ const resolver =
138
+ workspaceResolver ??
139
+ (input.effectiveSandboxBackend === "none"
140
+ ? undefined
141
+ : input.connectionCredentials?.runCredentials);
103
142
  if (!resolver) return null;
104
143
  const rootSessionId = await getSessionRootId(input.db, input.workspaceId, input.session.id);
105
144
  if (!rootSessionId) {
@@ -110,22 +149,25 @@ export async function bindRunCredentialResolver(
110
149
  workspaceId: input.workspaceId,
111
150
  sessionId: input.session.id,
112
151
  };
152
+ // A renewable resolver belongs to one admitted turn, even if its caller
153
+ // subsequently replaces or mutates an in-memory session/turn projection.
154
+ const frozenRequest = structuredClone(
155
+ buildRunCredentialsRequest({
156
+ accountId: input.accountId,
157
+ workspaceId: input.workspaceId,
158
+ session: input.session,
159
+ turn: input.turn,
160
+ attemptId: input.attemptId,
161
+ effectiveSandboxBackend: input.effectiveSandboxBackend,
162
+ variableSet: input.variableSet,
163
+ rootSessionId,
164
+ purpose: "provision",
165
+ forceRefresh: false,
166
+ }),
167
+ );
113
168
  return {
114
169
  resolve: async ({ purpose, forceRefresh }) => {
115
- const resolution = await resolver(
116
- buildRunCredentialsRequest({
117
- accountId: input.accountId,
118
- workspaceId: input.workspaceId,
119
- session: input.session,
120
- turn: input.turn,
121
- attemptId: input.attemptId,
122
- effectiveSandboxBackend: input.effectiveSandboxBackend,
123
- variableSet: input.variableSet,
124
- rootSessionId,
125
- purpose,
126
- forceRefresh,
127
- }),
128
- );
170
+ const resolution = await resolver({ ...frozenRequest, purpose, forceRefresh });
129
171
  return normalizeRunCredentialsResolution(resolution, scope);
130
172
  },
131
173
  };
@@ -304,19 +304,13 @@ function attachmentRefsFromItem(item: Record<string, unknown>): FileResourceRef[
304
304
  return refs;
305
305
  }
306
306
 
307
- function attachmentReceiptText(ref: FileResourceRef, file: FileAsset | undefined): string {
308
- if (!file) {
309
- return (
310
- `[Earlier attachment: fileId=${ref.fileId}; mountDirectory=${resourceMountPath(ref)}. ` +
311
- `Use the existing file there, or call files__files_get_download_url with this fileId and ` +
312
- `download it with the shell.]`
313
- );
314
- }
315
- const path = sandboxFilePath(ref, file);
307
+ function attachmentReceiptText(ref: FileResourceRef): string {
308
+ // The durable reference is immutable; live metadata/authority must not rewrite
309
+ // old receipt text. Pixel delivery remains subject to current file authority.
316
310
  return (
317
- `[Attachment: ${file.safeFilename}; fileId=${file.id}; type=${file.contentType}; ` +
318
- `bytes=${file.sizeBytes}; path=${path}. If the local path is absent, call ` +
319
- `files__files_get_download_url with this fileId and download it with the shell.]`
311
+ `[Attachment: fileId=${ref.fileId}; mountDirectory=${resourceMountPath(ref)}. ` +
312
+ `Use the existing file there, or call files__files_get_download_url with this fileId and ` +
313
+ `download it with the shell.]`
320
314
  );
321
315
  }
322
316
 
@@ -434,7 +428,7 @@ export function createModelHistoryAttachmentProjector(
434
428
  const attachment = currentFile ? contentById.get(ref.fileId) : undefined;
435
429
  const receipt = {
436
430
  type: "input_text",
437
- text: attachmentReceiptText(ref, currentFile),
431
+ text: attachmentReceiptText(ref),
438
432
  };
439
433
  if (!attachment || attachment.kind !== "image") {
440
434
  return [receipt];
@@ -458,12 +452,21 @@ export function withCurrentUserAttachmentRefs(
458
452
  refs: FileResourceRef[],
459
453
  ): Array<Record<string, unknown>> {
460
454
  if (refs.length === 0) return historyItems;
455
+ // Compaction can put a catalog after the triggering user message. A ref
456
+ // already retained anywhere in canonical history must not be copied onto
457
+ // that older catalog (and then disappear when the next turn replays it).
458
+ const retainedIds = new Set(
459
+ historyItems.flatMap((item) => attachmentRefsFromItem(item).map((ref) => ref.fileId)),
460
+ );
461
+ const missing = refs.filter((ref) => !retainedIds.has(ref.fileId));
462
+ if (missing.length === 0) return historyItems;
461
463
  for (let index = historyItems.length - 1; index >= 0; index -= 1) {
462
464
  const item = historyItems[index]!;
465
+ if (item[MODEL_ATTACHMENT_CATALOG_MARKER] === true) continue;
463
466
  if (item.type !== "message" || item.role !== "user") continue;
464
467
  const existing = attachmentRefsFromItem(item);
465
468
  const existingIds = new Set(existing.map((ref) => ref.fileId));
466
- const additions = refs.filter((ref) => !existingIds.has(ref.fileId));
469
+ const additions = missing.filter((ref) => !existingIds.has(ref.fileId));
467
470
  if (additions.length === 0) return historyItems;
468
471
  const projected = [...historyItems];
469
472
  projected[index] = { ...item, [MODEL_ATTACHMENT_REFS_FIELD]: [...existing, ...additions] };
@@ -552,8 +555,14 @@ export async function turnInput(
552
555
  options,
553
556
  );
554
557
  }
555
- if (trigger.type === "system.update.delivered") {
556
- if (updates.length === 0) {
558
+ // Maintenance has no user message or delivered-update batch. It still needs
559
+ // the ordinary history/projection path so SDK preparation can capture the
560
+ // same model request prefix before the queued compaction stops inference.
561
+ if (
562
+ trigger.type === "system.update.delivered" ||
563
+ trigger.type === "session.context.compaction.requested"
564
+ ) {
565
+ if (trigger.type === "system.update.delivered" && updates.length === 0) {
557
566
  throw new Error("Internal update inference has no delivered updates");
558
567
  }
559
568
  return await messageInput(
@@ -1,7 +1,6 @@
1
1
  export {
2
2
  resolveRigProviderImageSelection,
3
3
  rigProviderImageSourceImage,
4
- settingsWithPackSandboxImage,
5
4
  settingsWithRigImage,
6
5
  settingsWithRigProviderImage,
7
6
  type RigProviderImageSelectionReason,