@sema-agent/core 5.45.0 → 5.46.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 (69) hide show
  1. package/CHANGELOG.md +56 -0
  2. package/dist/agents/subagent.js +1 -1
  3. package/dist/core/checkpoint-store.d.ts +12 -0
  4. package/dist/core/hooks.d.ts +9 -2
  5. package/dist/core/hooks.js +6 -5
  6. package/dist/core/memory-engine/content-origin.d.ts +3 -1
  7. package/dist/core/memory-engine/engine.d.ts +50 -3
  8. package/dist/core/memory-engine/engine.js +194 -32
  9. package/dist/core/memory-engine/export-bundle.d.ts +10 -1
  10. package/dist/core/memory-engine/export-bundle.js +21 -0
  11. package/dist/core/memory-engine/file-backend.d.ts +33 -4
  12. package/dist/core/memory-engine/file-backend.js +165 -39
  13. package/dist/core/memory-engine/frontmatter.d.ts +42 -1
  14. package/dist/core/memory-engine/frontmatter.js +141 -1
  15. package/dist/core/memory-engine/header-hints.d.ts +17 -0
  16. package/dist/core/memory-engine/header-hints.js +6 -0
  17. package/dist/core/memory-engine/index.d.ts +4 -3
  18. package/dist/core/memory-engine/index.js +3 -2
  19. package/dist/core/memory-engine/layout.d.ts +25 -2
  20. package/dist/core/memory-engine/layout.js +25 -12
  21. package/dist/core/memory-engine/memory-backend-contract.js +65 -0
  22. package/dist/core/memory-engine/sync-client.d.ts +1 -1
  23. package/dist/core/memory-engine/sync-client.js +33 -1
  24. package/dist/core/memory-engine/tools.d.ts +7 -0
  25. package/dist/core/memory-engine/tools.js +3 -0
  26. package/dist/core/memory-engine/types.d.ts +75 -1
  27. package/dist/core/memory-engine/types.js +1 -1
  28. package/dist/core/reminder-mint.d.ts +70 -0
  29. package/dist/core/reminder-mint.js +25 -0
  30. package/dist/core/runner/git-status-frame.d.ts +3 -14
  31. package/dist/core/runner/git-status-frame.js +39 -14
  32. package/dist/core/runner/prepare-config-doors.d.ts +4 -0
  33. package/dist/core/runner/prepare-config-doors.js +15 -0
  34. package/dist/core/runner/prepare-hands-readface.d.ts +5 -11
  35. package/dist/core/runner/prepare-hands-readface.js +26 -0
  36. package/dist/core/runner/prepare-memory.d.ts +11 -0
  37. package/dist/core/runner/prepare-memory.js +12 -10
  38. package/dist/core/runner/prepare-task.d.ts +22 -1
  39. package/dist/core/runner/prepare-task.js +48 -13
  40. package/dist/core/runner/runtask.js +62 -55
  41. package/dist/core/side-query.d.ts +11 -1
  42. package/dist/core/side-query.js +3 -0
  43. package/dist/core/types.d.ts +47 -7
  44. package/dist/engine/harness/types.d.ts +46 -1
  45. package/dist/engine/harness/types.js +11 -0
  46. package/dist/engine/session/import-validate.js +6 -1
  47. package/dist/engine/session/session.d.ts +20 -0
  48. package/dist/engine/session/session.js +26 -1
  49. package/dist/index.d.ts +2 -1
  50. package/dist/index.js +2 -1
  51. package/dist/orchestration/run-workflow-tool.d.ts +16 -0
  52. package/dist/orchestration/run-workflow-tool.js +23 -3
  53. package/dist/orchestration/workflow-governance.d.ts +8 -1
  54. package/dist/prompt-assembly/epoch.js +2 -0
  55. package/dist/prompt-assembly/types.d.ts +6 -0
  56. package/dist/prompts/default.d.ts +13 -1
  57. package/dist/prompts/default.js +5 -1
  58. package/dist/tools/fs/fs-bash.d.ts +4 -0
  59. package/dist/tools/fs/fs-bash.js +1 -1
  60. package/dist/tools/fs/fs-read.d.ts +1 -1
  61. package/dist/tools/fs/fs-read.js +8 -7
  62. package/dist/tools/fs/fs-shared.d.ts +10 -4
  63. package/dist/tools/fs/fs-shared.js +6 -3
  64. package/dist/tools/fs/gh-rate-limit.d.ts +4 -1
  65. package/dist/tools/fs/gh-rate-limit.js +3 -2
  66. package/dist/tools/fs/index.d.ts +10 -2
  67. package/dist/tools/fs/index.js +2 -1
  68. package/package.json +1 -1
  69. package/test/export-surface.snapshot.json +12 -1
@@ -26,6 +26,7 @@ import { findAdmittingRule, suggestRulesForCommand } from "../permission-rule-mo
26
26
  import { ActiveSkillScope, createActiveSkillScopePolicy } from "./active-skill-scope.js";
27
27
  import { CHANGED_FILES_MTIME_EPS_MS, fenceMcpServerInstructions, renderAgentListingDelta } from "./turn-attachments.js";
28
28
  import { inlineUntrusted } from "../untrusted-text.js";
29
+ import { isValidReminderMark, mintReminderMark, reminderMarkDeclaration } from "../reminder-mint.js";
29
30
  import { policyAskClassOf } from "../ask-class.js";
30
31
  import { emitTrace } from "../trace.js";
31
32
  import { createSessionRulePolicy, PATH_CONFINABLE_WRITE_TOOLS } from "./session-rule-policy.js";
@@ -333,7 +334,7 @@ function cwdConflictsRestoreError(requestedCwd) {
333
334
  export async function prepareTask(spec, deps, sessions, resume, internals, runnerSelf) {
334
335
  const doors = prepareConfigDoors({ spec, deps, sessions, resume, internals });
335
336
  spec = doors.spec;
336
- const { toolFaceSnapshot, promptProfile, lockedPreflight, resolvedInteractionPosture, resolvedRole, model, thinking, compModel, fableMitigations, memoryDelegationEvidence, usageWindows, brainCallGuardrailRef, brainCallGuardrailMs } = doors;
337
+ const { toolFaceSnapshot, promptProfile, lockedPreflight, resolvedInteractionPosture, resolvedRole, model, thinking, compModel, fableMitigations, memoryDelegationEvidence, memoryProvenance, usageWindows, brainCallGuardrailRef, brainCallGuardrailMs } = doors;
337
338
  announceToolModelGate(deps.onNotice, model.id, doors.modelGate);
338
339
  const { toolEffects, egressTools, irreversibleTools, irreversibilityTier, axisExplicitNegatives, reversibilityProbes, ownToolNames } = prepareSafetyScan({ spec, deps });
339
340
  let shellGatedBash = false;
@@ -351,6 +352,30 @@ export async function prepareTask(spec, deps, sessions, resume, internals, runne
351
352
  const taskScope = internals?.registryScope ?? spec.principal ?? "default";
352
353
  internals?.peerSelfRef?.addAxis("s", sessionId);
353
354
  internals?.peerSelfRef?.addAxis("t", hostTaskId);
355
+ const sessionReminderMark = await (async () => {
356
+ try {
357
+ return await session.getReminderMark();
358
+ }
359
+ catch (err) {
360
+ deps.onError?.(err instanceof Error ? err : new Error(String(err)), { phase: "config", sessionId });
361
+ return undefined;
362
+ }
363
+ })();
364
+ const reminderMark = isValidReminderMark(resume?.seed.reminderMark)
365
+ ? resume.seed.reminderMark
366
+ : isValidReminderMark(internals?.reminderMark)
367
+ ? internals.reminderMark
368
+ : isValidReminderMark(sessionReminderMark)
369
+ ? sessionReminderMark
370
+ : mintReminderMark();
371
+ if (reminderMark !== sessionReminderMark) {
372
+ try {
373
+ await session.appendReminderMark(reminderMark);
374
+ }
375
+ catch (err) {
376
+ deps.onError?.(err instanceof Error ? err : new Error(String(err)), { phase: "config", sessionId });
377
+ }
378
+ }
354
379
  const offloadScope = spec.principal ?? "default";
355
380
  if (internals?.registryScope !== undefined && internals.registryScope !== offloadScope) {
356
381
  deps.onError?.(new Error(`offload/tool-result namespace note: this run mounts in registry domain "${internals.registryScope}" but its offloaded tool results live under the TRUST identity "${offloadScope}" (principal${spec.principal === undefined ? " absent → default" : ""}). Before 2.13.0 the registry domain named this namespace too; if a deployment used registryScope as its ref-tenancy boundary, that boundary is now the principal — pass one, or read refs under "${offloadScope}".`), { phase: "config", sessionId });
@@ -797,6 +822,7 @@ export async function prepareTask(spec, deps, sessions, resume, internals, runne
797
822
  ...(spec.memoryPersistenceCapable !== undefined ? { memoryPersistenceCapable: spec.memoryPersistenceCapable } : {}),
798
823
  getApiKeyAndHeaders: spec.getApiKeyAndHeaders,
799
824
  parentCwd: taskRootFinal,
825
+ reminderMark,
800
826
  ...(centerAdoption !== undefined ? { centerArtifactDigest: centerAdoption.artifact.artifactDigest } : {}),
801
827
  ...(centerAdoption?.sourceRevision !== undefined ? { centerSourceRevision: centerAdoption.sourceRevision } : {}),
802
828
  activeSkillScope: () => skillScope.active(),
@@ -983,6 +1009,7 @@ export async function prepareTask(spec, deps, sessions, resume, internals, runne
983
1009
  sourceTaskId: hostTaskId,
984
1010
  parentModel: () => harnessRef.current?.getModel(),
985
1011
  ...(spec.getApiKeyAndHeaders !== undefined ? { parentGetApiKeyAndHeaders: spec.getApiKeyAndHeaders } : {}),
1012
+ ...(frozenOnAsk !== undefined ? { parentOnAsk: frozenOnAsk } : {}),
986
1013
  principal: spec.principal,
987
1014
  oneShot: spec.oneShot,
988
1015
  ...(resolvedInteractionPosture !== undefined ? { parentInteractionPosture: resolvedInteractionPosture } : {}),
@@ -1198,7 +1225,7 @@ export async function prepareTask(spec, deps, sessions, resume, internals, runne
1198
1225
  foldProtocolAxes(a2a.toolAxes, "A2A");
1199
1226
  const callIssuedAtRef = {};
1200
1227
  const memoryWriteGateRef = {};
1201
- const handsReadFaceInput = { handsEnabled, executionEnv, taskRootFinal, rebaseRestoredPath, resume, session, sessionId, hostTaskId, taskScope, fullShellReachable, effectiveShellGate, toolFaceSnapshot, model, spec, deps, internals, memoryWriteGateRef, firstPartyOffload, tools, egressTools, irreversibilityTier, irreversibleTools, reversibilityProbes };
1228
+ const handsReadFaceInput = { handsEnabled, executionEnv, taskRootFinal, rebaseRestoredPath, resume, session, sessionId, hostTaskId, taskScope, fullShellReachable, effectiveShellGate, toolFaceSnapshot, model, spec, deps, internals, memoryWriteGateRef, firstPartyOffload, tools, egressTools, irreversibilityTier, irreversibleTools, reversibilityProbes, reminderMark };
1202
1229
  const handsReadFace = handsEnabled ? await prepareHandsMount(handsReadFaceInput) : resolveHandsLessReadFace(handsReadFaceInput);
1203
1230
  const { readFileStateForCheckpoint, seedContextFiles, handsCwdRef, workspaceStateSettle, wsSnapshot, rebaseWsPath, backgroundTaskToolsActive, additionalRootsCanonical, additionalReadRootsCanonical, attachmentRootCanonical, readDenyMatcher } = handsReadFace;
1204
1231
  resolvedReadFace = handsReadFace.resolvedReadFace;
@@ -1439,9 +1466,11 @@ export async function prepareTask(spec, deps, sessions, resume, internals, runne
1439
1466
  sessionId,
1440
1467
  taskRootPath: taskRootFinal,
1441
1468
  memoryWriteGateRef,
1469
+ reminderMark,
1442
1470
  writeToolsMounted: tools.some((t) => t.name === "Write") &&
1443
1471
  !(toolFaceSnapshot.exclude?.includes("Write") ?? false) &&
1444
1472
  !(handsEnabled && isRemoteExecutionEnv(executionEnv) && spec.memoryPersistenceCapable !== true),
1473
+ memoryProvenance,
1445
1474
  memoryPersistenceDeclared: spec.memoryPersistenceCapable,
1446
1475
  rosterCanPersist: spec.memoryPersistenceCapable ??
1447
1476
  tools.some((t) => {
@@ -1644,6 +1673,7 @@ export async function prepareTask(spec, deps, sessions, resume, internals, runne
1644
1673
  policyEnabled: promptPolicyEnabled,
1645
1674
  hooksEnabled: promptHooksEnabled,
1646
1675
  isolationEnabled: isIsolated(executionEnv),
1676
+ reminderMark,
1647
1677
  readFaceOpen: resolvedReadFace === "open",
1648
1678
  orchestrationEnabled: selfOrchestrationActive,
1649
1679
  orchestrationDeferred: selfOrchestrationActive && (toolFaceSnapshot.defer?.includes("Workflow") ?? false),
@@ -1904,9 +1934,9 @@ export async function prepareTask(spec, deps, sessions, resume, internals, runne
1904
1934
  continue;
1905
1935
  }
1906
1936
  const inner = t.execute.bind(t);
1907
- const mark = (reason) => {
1937
+ const mark = (reason, cause) => {
1908
1938
  try {
1909
- pollution?.markPolluted(reason);
1939
+ pollution?.markPolluted(reason, cause);
1910
1940
  }
1911
1941
  catch {
1912
1942
  }
@@ -1915,7 +1945,7 @@ export async function prepareTask(spec, deps, sessions, resume, internals, runne
1915
1945
  ...t,
1916
1946
  execute: async (toolCallId, params, signal, onUpdate) => {
1917
1947
  if (pollutes) {
1918
- mark(`tool "${t.name}" (${origin} content class) was invoked in this session`);
1948
+ mark(`tool "${t.name}" (${origin} content class) was invoked in this session`, "observed");
1919
1949
  recordExternal();
1920
1950
  }
1921
1951
  if (!isDelegation)
@@ -1931,7 +1961,7 @@ export async function prepareTask(spec, deps, sessions, resume, internals, runne
1931
1961
  const att = readCardAttestation(result?.details);
1932
1962
  if (att === "external") {
1933
1963
  mark(`tool "${t.name}" returned the output of a delegated agent that invoked an external-content-class tool at runtime` +
1934
- (typeof requested === "string" ? ` (subagent_type "${requested}")` : ""));
1964
+ (typeof requested === "string" ? ` (subagent_type "${requested}")` : ""), "observed");
1935
1965
  recordExternal();
1936
1966
  }
1937
1967
  else if (att !== "clean") {
@@ -1939,7 +1969,7 @@ export async function prepareTask(spec, deps, sessions, resume, internals, runne
1939
1969
  const staticFaceReason = `tool "${t.name}" returned the output of a delegated agent whose tool face can reach external content` +
1940
1970
  (typeof requested === "string" ? ` (subagent_type "${requested}")` : " (no subagent_type named — classified fail-closed)");
1941
1971
  if (!delegationEvidenceAttestedOnly) {
1942
- mark(staticFaceReason);
1972
+ mark(staticFaceReason, "static");
1943
1973
  }
1944
1974
  else if (pollution !== undefined && !staticMarkWaiverAnnounced) {
1945
1975
  staticMarkWaiverAnnounced = true;
@@ -2043,6 +2073,9 @@ export async function prepareTask(spec, deps, sessions, resume, internals, runne
2043
2073
  centerAdoption = undefined;
2044
2074
  }
2045
2075
  let systemPrompt = assembled.systemPrompt;
2076
+ if (!systemPrompt.includes(reminderMarkDeclaration(reminderMark))) {
2077
+ deps.onError?.(new Error("reminder-mark declaration missing from the assembled system prompt: this run's PromptProvider owns the prompt and did not render the mark declaration, so engine <system-reminder> tags carry a mark the model is never told about (the impersonation defense is inactive for this deployment). Render `reminderMarkDeclaration(ctx.reminderMark)` (exported; the value rides StablePromptContext.reminderMark) in the provider, or accept the disclosure."), { phase: "config", sessionId });
2078
+ }
2046
2079
  const renderWithDate = assembled.renderWithDate
2047
2080
  ? (date) => {
2048
2081
  systemPrompt = assembled.renderWithDate(date);
@@ -3406,6 +3439,7 @@ export async function prepareTask(spec, deps, sessions, resume, internals, runne
3406
3439
  consolidationNotes: undefined,
3407
3440
  readFileState: readFileStateForCheckpoint ? [...readFileStateForCheckpoint.entries()] : undefined,
3408
3441
  readFace: faceCheckpointSection(),
3442
+ reminderMark,
3409
3443
  repairBundle: repairBundleForCheckpoint(parkedSpendMicroUsd),
3410
3444
  workspaceHandle,
3411
3445
  handsCwd: handsCwdRef?.current,
@@ -4069,7 +4103,7 @@ export async function prepareTask(spec, deps, sessions, resume, internals, runne
4069
4103
  if (notifyPermissionDenied) {
4070
4104
  await notifyPermissionDenied({ toolName: e.toolName, input: cloneObserverInput(e.input), toolCallId: e.toolCallId, reason: complianceDeny, source: "safety", identity: hookIdentity });
4071
4105
  }
4072
- return { block: true, reason: formatHookFeedback(complianceDeny), preToolContext: [] };
4106
+ return { block: true, reason: formatHookFeedback(complianceDeny, reminderMark), preToolContext: [] };
4073
4107
  }
4074
4108
  }
4075
4109
  if (planModeRef.active && (toolEffects.get(e.toolName) ?? "write") !== "read") {
@@ -4082,7 +4116,7 @@ export async function prepareTask(spec, deps, sessions, resume, internals, runne
4082
4116
  }
4083
4117
  return {
4084
4118
  block: true,
4085
- reason: formatHookFeedback(planDenyReason),
4119
+ reason: formatHookFeedback(planDenyReason, reminderMark),
4086
4120
  preToolContext: [],
4087
4121
  };
4088
4122
  }
@@ -4092,6 +4126,7 @@ export async function prepareTask(spec, deps, sessions, resume, internals, runne
4092
4126
  onNotifyError: (f) => emitTrace(deps.tracer, () => ({ kind: "observer.notify_failed", version: 1, taskId: spec.taskId ?? sessionId, site: f.site, message: f.error.message, ts: Date.now() })),
4093
4127
  event: e,
4094
4128
  identity: hookIdentity,
4129
+ reminderMark,
4095
4130
  preToolUse: ownGatePreToolUse,
4096
4131
  ...(hookEnvFace !== undefined ? { hookEnv: hookEnvFace } : {}),
4097
4132
  adjudicate,
@@ -4208,7 +4243,7 @@ export async function prepareTask(spec, deps, sessions, resume, internals, runne
4208
4243
  details: clonedDetails,
4209
4244
  }, { toolCallId: e.toolCallId, toolName: e.toolName, ...(hookEnvFace !== undefined ? { env: hookEnvFace } : {}), identity: hookIdentity });
4210
4245
  if (patch?.additionalContext) {
4211
- content = [...content, { type: "text", text: formatHookFeedback(patch.additionalContext) }];
4246
+ content = [...content, { type: "text", text: formatHookFeedback(patch.additionalContext, reminderMark) }];
4212
4247
  changed = true;
4213
4248
  }
4214
4249
  }
@@ -4220,14 +4255,14 @@ export async function prepareTask(spec, deps, sessions, resume, internals, runne
4220
4255
  changed = true;
4221
4256
  }
4222
4257
  if (patch?.additionalContext) {
4223
- content = [...content, { type: "text", text: formatHookFeedback(patch.additionalContext) }];
4258
+ content = [...content, { type: "text", text: formatHookFeedback(patch.additionalContext, reminderMark) }];
4224
4259
  changed = true;
4225
4260
  }
4226
4261
  }
4227
4262
  const pre = preToolContexts.get(e.toolCallId);
4228
4263
  if (pre) {
4229
4264
  preToolContexts.delete(e.toolCallId);
4230
- content = [...content, ...pre.map((t) => ({ type: "text", text: formatHookFeedback(t) }))];
4265
+ content = [...content, ...pre.map((t) => ({ type: "text", text: formatHookFeedback(t, reminderMark) }))];
4231
4266
  changed = true;
4232
4267
  }
4233
4268
  return changed ? { content } : undefined;
@@ -4501,7 +4536,7 @@ export async function prepareTask(spec, deps, sessions, resume, internals, runne
4501
4536
  const effectiveReadFaceObserved = carrierReadFace();
4502
4537
  const effectiveReadDenyObserved = readDenyAdditionsNormalized.length > 0 ? readDenyAdditionsNormalized.map((e) => ({ ...e })) : undefined;
4503
4538
  const preparedHolder = {};
4504
- const buildPrepared = () => ({ harness, session, sessionId, taskRootPath: taskRootFinal, model, thinking, compModel, mcp: mcp, ...(a2a !== undefined && a2a.tools.length > 0 ? { a2a } : {}), blockedRef, outputRef, abortController, conflictRef, blockedToolCalls, approvalSettlement, nestedStats, ...(rewindNotes.length > 0 ? { rewindNotes } : {}), ...(effectiveReadFaceObserved !== undefined ? { effectiveReadFace: effectiveReadFaceObserved } : {}), ...(effectiveReadDenyObserved !== undefined ? { effectiveReadDenyPatterns: effectiveReadDenyObserved } : {}), effectiveMemoryScopes: memoryEffectiveScopes, cwdRef: handsCwdRef, ...(worktreeSessionRef !== undefined ? { worktreeSessionRef } : {}), ...(workspaceStateSettle !== undefined ? { workspaceStateSettle } : {}), denyNarrowingPolicy, ...(basePolicyForResumeEdit !== undefined ? { basePolicyForResumeEdit } : {}), ...(permissionRuleOrgLane !== undefined ? { permissionRuleOrg: permissionRuleOrgLane } : {}), releaseSignal, settleContentAskBindings, cacheBreakDetector, cacheFingerprint, wiringManifest, promptManifest, epochDeclaredSections, activeTools, ...(deferred.size > 0 ? { deferredToolNames: deferred } : {}), toolMaterializeStatic, deferDirectCall, ...(staticFaceForRef.current !== undefined ? { staticFaceFor: staticFaceForRef.current } : {}), ownedEnv, suspendRef, suspendProgressRef, reviewRef, remoteEnvFailures, reviewRequestRef, suspendLoopRef, suspendForResource, ...(suspendForPlatformLimit !== undefined ? { suspendForPlatformLimit } : {}), ...(envLifetimeSuspendAt !== undefined ? { envLifetimeSuspendAt } : {}), ...(usageGovernance !== undefined ? { usageGovernance } : {}), callIssuedAtRef, brainCallGuardrailRef, suspendForReview, resourceLedger: priorLedger, liveSpendRef, humanReviewRef, now, tools, toolEffects, wakeRecovered, promptOverheadTokens, lastBrainContext, readTaskFile, recentlyReadFiles, normalizeAttachmentPath, isDedupStubResult, ...(onCompactionApplied ? { onCompactionApplied } : {}), compactionReuseRef, trimPressureRef, ...(memoryEngineSession ? { memoryEngineSession } : {}), ...(subagentRetain ? { subagentRetain } : {}), ...(lspDiagnostics && nudgeLspOnEdit ? { lspDiagnostics: { registry: lspDiagnostics, nudge: nudgeLspOnEdit, runIdent: lspRunIdent } } : {}), planModeRef, ...(dateChange ? { dateChange } : {}), ...(instructionSources ? { instructionSources } : {}), ...(workflowSizeGuideline ? { workflowSizeGuideline } : {}), ...(detectExternalChanges ? { detectExternalChanges } : {}), ...(toolsDeltaRef ? { toolsDeltaRef } : {}), ...(agentListing ? { agentListing } : {}), ...(skillsListing ? { skillsListing } : {}), announcedListingsRef, gitStatusRef, listBackgroundTasks, hookIdentity, ...(turnSnapshotRef.current !== undefined ? { turnSnapshot: turnSnapshotRef.current } : {}), ...(centerCompactionCandidate !== undefined ? { centerCompactionCandidate } : {}) });
4539
+ const buildPrepared = () => ({ harness, session, sessionId, reminderMark, taskRootPath: taskRootFinal, model, thinking, compModel, mcp: mcp, ...(a2a !== undefined && a2a.tools.length > 0 ? { a2a } : {}), blockedRef, outputRef, abortController, conflictRef, blockedToolCalls, approvalSettlement, nestedStats, ...(rewindNotes.length > 0 ? { rewindNotes } : {}), ...(effectiveReadFaceObserved !== undefined ? { effectiveReadFace: effectiveReadFaceObserved } : {}), ...(effectiveReadDenyObserved !== undefined ? { effectiveReadDenyPatterns: effectiveReadDenyObserved } : {}), effectiveMemoryScopes: memoryEffectiveScopes, cwdRef: handsCwdRef, ...(worktreeSessionRef !== undefined ? { worktreeSessionRef } : {}), ...(workspaceStateSettle !== undefined ? { workspaceStateSettle } : {}), denyNarrowingPolicy, ...(basePolicyForResumeEdit !== undefined ? { basePolicyForResumeEdit } : {}), ...(permissionRuleOrgLane !== undefined ? { permissionRuleOrg: permissionRuleOrgLane } : {}), releaseSignal, settleContentAskBindings, cacheBreakDetector, cacheFingerprint, wiringManifest, promptManifest, epochDeclaredSections, activeTools, ...(deferred.size > 0 ? { deferredToolNames: deferred } : {}), toolMaterializeStatic, deferDirectCall, ...(staticFaceForRef.current !== undefined ? { staticFaceFor: staticFaceForRef.current } : {}), ownedEnv, suspendRef, suspendProgressRef, reviewRef, remoteEnvFailures, reviewRequestRef, suspendLoopRef, suspendForResource, ...(suspendForPlatformLimit !== undefined ? { suspendForPlatformLimit } : {}), ...(envLifetimeSuspendAt !== undefined ? { envLifetimeSuspendAt } : {}), ...(usageGovernance !== undefined ? { usageGovernance } : {}), callIssuedAtRef, brainCallGuardrailRef, suspendForReview, resourceLedger: priorLedger, liveSpendRef, humanReviewRef, now, tools, toolEffects, wakeRecovered, promptOverheadTokens, lastBrainContext, readTaskFile, recentlyReadFiles, normalizeAttachmentPath, isDedupStubResult, ...(onCompactionApplied ? { onCompactionApplied } : {}), compactionReuseRef, trimPressureRef, ...(memoryEngineSession ? { memoryEngineSession } : {}), ...(subagentRetain ? { subagentRetain } : {}), ...(lspDiagnostics && nudgeLspOnEdit ? { lspDiagnostics: { registry: lspDiagnostics, nudge: nudgeLspOnEdit, runIdent: lspRunIdent } } : {}), planModeRef, ...(dateChange ? { dateChange } : {}), ...(instructionSources ? { instructionSources } : {}), ...(workflowSizeGuideline ? { workflowSizeGuideline } : {}), ...(detectExternalChanges ? { detectExternalChanges } : {}), ...(toolsDeltaRef ? { toolsDeltaRef } : {}), ...(agentListing ? { agentListing } : {}), ...(skillsListing ? { skillsListing } : {}), announcedListingsRef, gitStatusRef, listBackgroundTasks, hookIdentity, ...(turnSnapshotRef.current !== undefined ? { turnSnapshot: turnSnapshotRef.current } : {}), ...(centerCompactionCandidate !== undefined ? { centerCompactionCandidate } : {}) });
4505
4540
  const prepared = buildPrepared();
4506
4541
  preparedHolder.current = prepared;
4507
4542
  return prepared;