@sema-agent/server 7.141.0 → 7.142.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 (171) hide show
  1. package/MIGRATION.md +215 -0
  2. package/USAGE.md +67 -12
  3. package/dist/approval-ask-audit-store.d.ts +54 -38
  4. package/dist/approval-ask-audit-store.js +58 -39
  5. package/dist/approval-card.d.ts +8 -8
  6. package/dist/approval-crash-convergence.d.ts +17 -7
  7. package/dist/approval-crash-convergence.js +94 -22
  8. package/dist/approval-deny-reasons.d.ts +34 -30
  9. package/dist/approval-deny-reasons.js +21 -6
  10. package/dist/approval-policy-settlement.d.ts +1 -1
  11. package/dist/approval-reconciler.d.ts +33 -1
  12. package/dist/approval-reconciler.js +43 -40
  13. package/dist/auth-bridge.d.ts +9 -6
  14. package/dist/auth-bridge.js +9 -3
  15. package/dist/boot/adoption.js +2 -1
  16. package/dist/boot/budget-tracing.d.ts +16 -0
  17. package/dist/boot/budget-tracing.js +10 -6
  18. package/dist/boot/device-lane.d.ts +1 -1
  19. package/dist/boot/execution-env.d.ts +24 -4
  20. package/dist/boot/execution-env.js +26 -23
  21. package/dist/boot/execution-lane.js +2 -1
  22. package/dist/boot/exit-boundary.js +5 -4
  23. package/dist/boot/memory-consolidation.js +2 -1
  24. package/dist/boot/parked-revive-gate.js +2 -1
  25. package/dist/boot/permission-rules-audit.d.ts +0 -28
  26. package/dist/boot/permission-rules-audit.js +2 -1
  27. package/dist/boot/read-deny-anchor-audit.js +2 -1
  28. package/dist/boot/reapers.js +4 -3
  29. package/dist/boot/resolve-spec.js +11 -2
  30. package/dist/boot/retention-lane.js +5 -3
  31. package/dist/boot/runner-deps.js +16 -13
  32. package/dist/boot/runtime-caps.js +3 -2
  33. package/dist/boot/session-faces.js +4 -3
  34. package/dist/boot/shutdown.js +3 -2
  35. package/dist/boot/stage-04-stores.js +3 -2
  36. package/dist/boot/stage-05-execution-env.d.ts +1 -1
  37. package/dist/boot/stage-05-execution-env.js +8 -6
  38. package/dist/boot/stage-06-runners.d.ts +1 -1
  39. package/dist/boot/stage-06-runners.js +2 -1
  40. package/dist/boot/stage-07-capability-layer.d.ts +1 -1
  41. package/dist/boot/stage-07-capability-layer.js +2 -1
  42. package/dist/boot/stage-08-reapers.d.ts +1 -1
  43. package/dist/boot/stage-08-reapers.js +3 -2
  44. package/dist/boot/stage-09-leader.d.ts +1 -1
  45. package/dist/boot/stage-10-http-server.d.ts +1 -1
  46. package/dist/boot/stage-10-http-server.js +5 -4
  47. package/dist/boot/stores.js +3 -2
  48. package/dist/boot/web-admin.js +17 -17
  49. package/dist/boot/webfetch-summarize-lane.js +2 -1
  50. package/dist/boot/workflow-orchestration.js +3 -2
  51. package/dist/capabilities/builtin-tools.d.ts +2 -1
  52. package/dist/capabilities/builtin-tools.js +2 -4
  53. package/dist/capabilities/composite-members.d.ts +2 -1
  54. package/dist/capabilities/composite-members.js +2 -1
  55. package/dist/capability-facts.d.ts +24 -0
  56. package/dist/capability-facts.js +23 -0
  57. package/dist/config-catalog.js +1 -0
  58. package/dist/config-types.d.ts +15 -4
  59. package/dist/config.d.ts +6 -0
  60. package/dist/config.js +17 -3
  61. package/dist/execution-lane-caps.d.ts +2 -1
  62. package/dist/fleet/fleet-bus.d.ts +6 -3
  63. package/dist/hooks/hook-runner.d.ts +6 -0
  64. package/dist/hooks/hook-runner.js +30 -1
  65. package/dist/http/dispatch.js +4 -2
  66. package/dist/http/execution-context.d.ts +2 -2
  67. package/dist/http/idempotency.d.ts +1 -1
  68. package/dist/http/principal-gate.d.ts +3 -1
  69. package/dist/http/principal-gate.js +17 -8
  70. package/dist/http/resume-legs.js +5 -9
  71. package/dist/http/route-table.js +2 -0
  72. package/dist/http/routes/attachments.js +18 -0
  73. package/dist/http/routes/capabilities.js +5 -2
  74. package/dist/http/routes/memory-policy.js +26 -6
  75. package/dist/http/routes/runs.js +3 -3
  76. package/dist/http/routes/session-memory-sync.d.ts +63 -0
  77. package/dist/http/routes/session-memory-sync.js +157 -0
  78. package/dist/http/routes/sessions-list.d.ts +2 -1
  79. package/dist/http/routes/tasks.js +7 -5
  80. package/dist/http/run-read-face.d.ts +7 -0
  81. package/dist/http/run-read-face.js +9 -3
  82. package/dist/http/send.d.ts +5 -0
  83. package/dist/http/send.js +9 -2
  84. package/dist/http/server.d.ts +14 -8
  85. package/dist/http/server.js +2 -4
  86. package/dist/http/submit-replay.d.ts +4 -3
  87. package/dist/http/submit-replay.js +2 -2
  88. package/dist/http/sync-submit-body.d.ts +21 -4
  89. package/dist/http/sync-submit-body.js +13 -0
  90. package/dist/identity-source.d.ts +21 -2
  91. package/dist/identity-source.js +6 -0
  92. package/dist/memory-incident-sink.d.ts +19 -6
  93. package/dist/memory-incident-sink.js +8 -4
  94. package/dist/memory-sync-client.d.ts +21 -21
  95. package/dist/memory-sync-client.js +50 -42
  96. package/dist/memory-sync-identity.d.ts +24 -0
  97. package/dist/memory-sync-identity.js +57 -0
  98. package/dist/memory-sync.d.ts +7 -1
  99. package/dist/memory-sync.js +6 -3
  100. package/dist/observability/fail-open.d.ts +27 -10
  101. package/dist/observability/fail-open.js +20 -7
  102. package/dist/observability/run-terminal.d.ts +92 -34
  103. package/dist/observability/run-terminal.js +167 -162
  104. package/dist/plugins/approval-ask-store-file.d.ts +14 -4
  105. package/dist/plugins/approval-ask-store-file.js +48 -7
  106. package/dist/plugins/approval-ask-store-memory.d.ts +2 -1
  107. package/dist/plugins/approval-ask-store-memory.js +9 -8
  108. package/dist/plugins/approval-ask-store-sql.d.ts +42 -10
  109. package/dist/plugins/approval-ask-store-sql.js +49 -19
  110. package/dist/plugins/file-run-store.d.ts +6 -1
  111. package/dist/plugins/file-run-store.js +11 -1
  112. package/dist/plugins/local-session-store.d.ts +36 -7
  113. package/dist/plugins/local-session-store.js +76 -32
  114. package/dist/plugins/local-task-attachment-store.d.ts +12 -2
  115. package/dist/plugins/local-task-attachment-store.js +67 -43
  116. package/dist/plugins/memory-key-guards.d.ts +3 -3
  117. package/dist/plugins/memory-run-store.d.ts +6 -1
  118. package/dist/plugins/memory-run-store.js +11 -1
  119. package/dist/plugins/one-time-migrations.d.ts +27 -1
  120. package/dist/plugins/one-time-migrations.js +57 -3
  121. package/dist/plugins/remote-env-e2b.d.ts +23 -4
  122. package/dist/plugins/remote-env-e2b.js +111 -28
  123. package/dist/plugins/remote-env-k8s.d.ts +31 -5
  124. package/dist/plugins/remote-env-k8s.js +86 -19
  125. package/dist/plugins/remote-env-local-docker.d.ts +15 -3
  126. package/dist/plugins/remote-env-local-docker.js +40 -12
  127. package/dist/plugins/run-store-sql.d.ts +9 -1
  128. package/dist/plugins/run-store-sql.js +9 -1
  129. package/dist/plugins/store-backend.d.ts +10 -7
  130. package/dist/plugins/store-backend.js +1 -0
  131. package/dist/plugins/store-contracts.d.ts +26 -1
  132. package/dist/plugins/store-contracts.js +3 -0
  133. package/dist/plugins/task-attachment-store.d.ts +112 -14
  134. package/dist/plugins/task-attachment-store.js +221 -28
  135. package/dist/plugins/workspace-fill.d.ts +60 -0
  136. package/dist/plugins/workspace-fill.js +106 -0
  137. package/dist/project-bundle.d.ts +38 -0
  138. package/dist/project-bundle.js +609 -0
  139. package/dist/run-local.js +2 -8
  140. package/dist/runs.js +1 -2
  141. package/dist/sandbox-egress-policy.d.ts +4 -1
  142. package/dist/sandbox-egress-policy.js +3 -1
  143. package/dist/sandbox-git-plane.d.ts +31 -12
  144. package/dist/sandbox-git-plane.js +24 -4
  145. package/dist/security.d.ts +9 -0
  146. package/dist/security.js +8 -0
  147. package/dist/session-error-wire.d.ts +24 -0
  148. package/dist/session-error-wire.js +7 -0
  149. package/dist/task-settings.d.ts +10 -2
  150. package/dist/task-settings.js +15 -2
  151. package/dist/terminal.d.ts +39 -19
  152. package/dist/terminal.js +65 -22
  153. package/dist/tool-approval.d.ts +4 -3
  154. package/dist/tool-approval.js +12 -14
  155. package/dist/trace/core-keyset-guard.d.ts +123 -6
  156. package/dist/trace/engine-notice-wire.d.ts +8 -2
  157. package/dist/trace/engine-notice-wire.js +4 -2
  158. package/dist/trace/exit-seat.d.ts +2 -1
  159. package/dist/trace/ledger-sink.d.ts +8 -4
  160. package/dist/trace/ledger-sink.js +2 -2
  161. package/dist/trace/project.d.ts +18 -1
  162. package/dist/trace/project.js +16 -0
  163. package/dist/trace/self-minted-wire.d.ts +251 -2
  164. package/dist/trace/self-minted-wire.js +82 -0
  165. package/dist/trace/wire-projection-faces.d.ts +1 -1
  166. package/dist/trace/wire-projection-faces.js +1 -1
  167. package/dist/web-admin-client/apply-effective.js +21 -1
  168. package/dist/web-admin-client/effective-keys.js +2 -0
  169. package/dist/web-admin-client/types.d.ts +4 -0
  170. package/package.json +1 -1
  171. package/wire-changes/server@7.142.0.json +639 -0
@@ -21,7 +21,9 @@ import { coreFileHistoryCaptureSeat } from "../file-history-capture.js";
21
21
  import { DEPLOYMENT_SHAPE_PREDICATES } from "../deployment-shape.js";
22
22
  import { rewindFailureCode } from "../file-history-disclosure.js";
23
23
  import { errorKindOf } from "../observability/err-text.js";
24
+ import { codeFieldOf } from "../terminal.js";
24
25
  import { buildShownUrlsInText } from "../url-refusal.js";
26
+ import { seatText } from "../trace/exit-seat.js";
25
27
  export function createRunnerDepsOnAsk(toolApproval) {
26
28
  if (!toolApproval)
27
29
  return undefined;
@@ -178,7 +180,7 @@ export function createRunnerDeps(ctx) {
178
180
  }
179
181
  }
180
182
  catch (err) {
181
- logger.warn("workflow_ack_served_failed", { runId: input.runId, err: String(err) });
183
+ logger.warn("workflow_ack_served_failed", { runId: input.runId, err: seatText("operator-log-text", String(err)) });
182
184
  }
183
185
  },
184
186
  },
@@ -199,7 +201,7 @@ export function createRunnerDeps(ctx) {
199
201
  onTaskOutcome: outcomeSink
200
202
  ? (o) => {
201
203
  metrics.inc("task_outcomes_total", { status: o.status, green: String(o.oracle?.green ?? "unknown") });
202
- void outcomeSink.recordCore(o).catch((err) => logger.warn("task_outcome_record_failed", { runId: o.runId, err: String(err) }));
204
+ void outcomeSink.recordCore(o).catch((err) => logger.warn("task_outcome_record_failed", { runId: o.runId, err: seatText("operator-log-text", String(err)) }));
203
205
  }
204
206
  : undefined,
205
207
  onElicit: elicitation ? elicitation.elicit : undefined,
@@ -249,17 +251,18 @@ export function createRunnerDeps(ctx) {
249
251
  : undefined,
250
252
  ...selfOrchestrationDeps,
251
253
  onError: (err, ctx) => {
254
+ const codeField = codeFieldOf(err);
252
255
  if (ctx.phase === "degraded") {
253
- logger.warn("task_degraded", { sessionId: ctx.sessionId, info: String(err) });
256
+ logger.warn("task_degraded", { sessionId: ctx.sessionId, ...codeField, info: seatText("operator-log-text", String(err)) });
254
257
  return;
255
258
  }
256
259
  if (ctx.phase === "prompt-constitution") {
257
- logger.warn("prompt_composition_warning", { sessionId: ctx.sessionId, info: String(err) });
260
+ logger.warn("prompt_composition_warning", { sessionId: ctx.sessionId, ...codeField, info: seatText("operator-log-text", String(err)) });
258
261
  return;
259
262
  }
260
263
  if (ctx.phase === "rewind") {
261
264
  const code = rewindFailureCode(err);
262
- logger.warn("rewind_snapshot_failed", { sessionId: ctx.sessionId, code, info: String(err) });
265
+ logger.warn("rewind_snapshot_failed", { sessionId: ctx.sessionId, code, info: seatText("operator-log-text", String(err)) });
263
266
  metrics.inc("rewind_snapshot_failed_total", { code });
264
267
  return;
265
268
  }
@@ -268,12 +271,12 @@ export function createRunnerDeps(ctx) {
268
271
  return;
269
272
  }
270
273
  if (ctx.phase === "mcp") {
271
- logger.warn("mcp_server_unavailable", { sessionId: ctx.sessionId, kind: errorKindOf(err), info: buildShownUrlsInText(String(err)) });
274
+ logger.warn("mcp_server_unavailable", { sessionId: ctx.sessionId, kind: errorKindOf(err), ...codeField, info: seatText("operator-log-text", buildShownUrlsInText(String(err))) });
272
275
  metrics.inc("mcp_server_unavailable_total");
273
276
  return;
274
277
  }
275
278
  if (ctx.phase === "a2a") {
276
- logger.warn("a2a_peer_unavailable", { sessionId: ctx.sessionId, kind: errorKindOf(err), info: buildShownUrlsInText(String(err)) });
279
+ logger.warn("a2a_peer_unavailable", { sessionId: ctx.sessionId, kind: errorKindOf(err), ...codeField, info: seatText("operator-log-text", buildShownUrlsInText(String(err))) });
277
280
  metrics.inc("a2a_peer_unavailable_total");
278
281
  return;
279
282
  }
@@ -285,7 +288,8 @@ export function createRunnerDeps(ctx) {
285
288
  sessionId: ctx.sessionId,
286
289
  confirmed: classification !== undefined,
287
290
  ...(classification !== undefined ? { classification, classificationKnown: causeLevel !== undefined } : {}),
288
- err: String(err),
291
+ ...codeField,
292
+ err: seatText("operator-log-text", String(err)),
289
293
  };
290
294
  metrics.inc("prompt_cache_low_hit_total", {
291
295
  ...(classification !== undefined ? { classification: causeLevel !== undefined ? classification : "unknown" } : {}),
@@ -298,25 +302,24 @@ export function createRunnerDeps(ctx) {
298
302
  return;
299
303
  }
300
304
  if (ctx.phase === "config") {
301
- const code = typeof err?.code === "string" ? err.code : undefined;
302
305
  const classification = ctx.classification;
303
306
  const classificationKnown = classification === undefined ? undefined : CONFIG_ADVISORY_CLASSIFICATIONS.has(classification);
304
307
  const fields = {
305
308
  sessionId: ctx.sessionId,
306
- ...(code !== undefined ? { code } : {}),
309
+ ...codeField,
307
310
  ...(classification !== undefined ? { classification, classificationKnown } : {}),
308
- info: String(err),
311
+ info: seatText("operator-log-text", String(err)),
309
312
  };
310
313
  logger.warn("runner_config_advisory", fields);
311
314
  metrics.inc("runner_config_advisory_total", {
312
- ...(code !== undefined ? { code } : {}),
315
+ ...codeField,
313
316
  ...(classification !== undefined ? { classification: classificationKnown ? classification : "unknown" } : {}),
314
317
  level: "warn",
315
318
  });
316
319
  return;
317
320
  }
318
321
  metrics.inc("runner_error_total", { phase: ctx.phase });
319
- logger.error("runner_error", { phase: ctx.phase, sessionId: ctx.sessionId, err: String(err) });
322
+ logger.error("runner_error", { phase: ctx.phase, sessionId: ctx.sessionId, ...codeField, err: seatText("operator-log-text", String(err)) });
320
323
  },
321
324
  ...(ctx.consolidationSeat !== undefined
322
325
  ? {
@@ -1,6 +1,7 @@
1
1
  import { applyGovernedVerdictAbsenceWarning, applyLocalAutoModeDeny, applyMemoryOptOutGrant, applyObserverEnvOptIn, centerEntitlementSourceWired, createPrincipalEntitlementsClient, } from "../runtime-caps-resolver.js";
2
2
  import { scopedTokenNeedsWorker } from "../center-credential.js";
3
3
  import { WEB_ADMIN_ENV } from "@sema-agent/settings-schema";
4
+ import { seatText } from "../trace/exit-seat.js";
4
5
  export function assertMemoryCapturePolicyWirable(input) {
5
6
  if (input.policy !== "governed")
6
7
  return;
@@ -47,7 +48,7 @@ export function createRuntimeCaps(ctx) {
47
48
  ? createPrincipalEntitlementsClient({
48
49
  center: config.webAdmin,
49
50
  ...(config.webAdmin.worker ? { worker: config.webAdmin.worker } : {}),
50
- onError: (err, principal) => logger.warn("runtime_caps_resolve_failed", { principal, err: String(err) }),
51
+ onError: (err, principal) => logger.warn("runtime_caps_resolve_failed", { principal, err: seatText("operator-log-text", String(err)) }),
51
52
  })
52
53
  : undefined;
53
54
  const centerRuntimeCapsResolver = principalCaps?.resolveRuntimeCaps;
@@ -60,7 +61,7 @@ export function createRuntimeCaps(ctx) {
60
61
  const withMemoryGrant = applyMemoryOptOutGrant(withObservers, ctx.memoryOptOutGrant, {
61
62
  onFault: (err, principal) => logger.warn("memory_optout_grant_resolve_failed", {
62
63
  principal,
63
- err: String(err),
64
+ err: seatText("operator-log-text", String(err)),
64
65
  ...(observability ? {} : { face: "capabilities-read" }),
65
66
  effect: "allowMemoryOptOut left ABSENT for this resolve (never coined as false): open posture ⇒ the opt-out takes effect; governed ⇒ core refuses the run (verdict absent)",
66
67
  }),
@@ -11,6 +11,7 @@ import { probeSessionChildren, retireSessionChildren, sessionChildrenScope, Sess
11
11
  import { SessionActiveRunError } from "../execution-placement.js";
12
12
  import { headReadOf, redactIncarnations } from "../session-incarnation.js";
13
13
  import { recordFailOpen } from "../observability/fail-open.js";
14
+ import { seatText } from "../trace/exit-seat.js";
14
15
  export function createSessionFaces(ctx) {
15
16
  const { config, logger, metrics, localRoot, backend, sessionStore, runStore, checkpointStore, toolResultStore, resumeAnchorStore, approvalExemptionStore, sessionPolicyStore, taskAttachmentStore, fileHistoryErasure, workflowCompletionInbox, taskListLane, dropSessionScoped, mailboxStore, mailboxRecipientLifecycle, backgroundAgentStore, userInputLedgerStore, spaceReclaimer, } = ctx;
16
17
  const mysqlPool = backend?.mysqlPool();
@@ -106,7 +107,7 @@ export function createSessionFaces(ctx) {
106
107
  }
107
108
  }
108
109
  if (workflowCompletionInbox)
109
- await workflowCompletionInbox.purge(sessionId, owner ?? null).catch((err) => logger.warn("workflow_completion_inbox_purge_failed", { sessionId, err: String(err) }));
110
+ await workflowCompletionInbox.purge(sessionId, owner ?? null).catch((err) => logger.warn("workflow_completion_inbox_purge_failed", { sessionId, err: seatText("operator-log-text", String(err)) }));
110
111
  const peerBox = mailboxStore !== undefined && mailboxRecipientLifecycle !== undefined
111
112
  ? { store: mailboxStore, lifecycle: mailboxRecipientLifecycle, scope: owner ?? "default", handle: peerSessionBoxHandle(sessionId) }
112
113
  : undefined;
@@ -118,7 +119,7 @@ export function createSessionFaces(ctx) {
118
119
  await reapSessionBackgroundHard(sessionId, owner ?? "default", { includeRetained: false, reason: "session_deleted" }, logger);
119
120
  }
120
121
  catch (err) {
121
- logger.warn("session_background_reap_failed", { sessionId, err: String(err) });
122
+ logger.warn("session_background_reap_failed", { sessionId, err: seatText("operator-log-text", String(err)) });
122
123
  }
123
124
  if (peerBox !== undefined)
124
125
  await peerBox.store.drop(peerBox.scope, peerBox.handle);
@@ -138,7 +139,7 @@ export function createSessionFaces(ctx) {
138
139
  logger.warn("workspace_space_reclaim_failed", {
139
140
  sessionId,
140
141
  stage: "seat_threw",
141
- error: redactIncarnations(String(err)),
142
+ error: seatText("operator-log-text", redactIncarnations(String(err))),
142
143
  effect: "the ended space's cache volume and snapshot objects may stay (the reclaim seat threw, which its contract forbids; the session delete went ahead) — the bucket's lifecycle rule is the fallback for objects, the volume is deleted by label sema.space",
143
144
  });
144
145
  });
@@ -9,6 +9,7 @@ import { createEngineLeaseTracker } from "./engine-lease.js";
9
9
  import { writeExitLast, readExitLast, clearExitLast } from "./exit-last.js";
10
10
  import { isScriptRealmRejection, describeRejectionReason } from "../orchestration/hardened-vm-runner.js";
11
11
  import { DRAIN_CAUSE_COUNTS_AS_FIRST_STOP_SIGNAL, HARD_STOP_ACTION_ID, drainDeadlineBeyondBound } from "../fleet/drain-entry.js";
12
+ import { seatText } from "../trace/exit-seat.js";
12
13
  const HARD_STOP_GRACE_MS = 10_000;
13
14
  const FINAL_EXIT_MS = 15_000;
14
15
  export function backgroundGraceRemainingMs(a) {
@@ -91,7 +92,7 @@ export function installShutdownHandlers(ctx) {
91
92
  for (const p of uncommittedParks)
92
93
  logger.warn("approval_park_uncommitted_at_shutdown", { approvalId: p.approvalId, taskId: p.taskId });
93
94
  })
94
- .catch((err) => logger.warn("approval_drain_for_shutdown_failed", { err: String(err) }));
95
+ .catch((err) => logger.warn("approval_drain_for_shutdown_failed", { err: seatText("operator-log-text", String(err)) }));
95
96
  clearInterval(reaper);
96
97
  clearInterval(fleetReconcile.timer);
97
98
  const retentionTeardown = retentionLane === undefined
@@ -107,7 +108,7 @@ export function installShutdownHandlers(ctx) {
107
108
  engineLease?.stop();
108
109
  storeLiveProbe?.stop();
109
110
  servingLease?.stop();
110
- void deviceHub?.close().catch((err) => logger.warn("device_hub_close_failed", { err: String(err) }));
111
+ void deviceHub?.close().catch((err) => logger.warn("device_hub_close_failed", { err: seatText("operator-log-text", String(err)) }));
111
112
  webAdmin?.stopRefreshLoop();
112
113
  otelExporter?.stop();
113
114
  breakerState?.stop();
@@ -6,18 +6,19 @@ import { auditDormantPermissionRules } from "./permission-rules-audit.js";
6
6
  import { createBudgetAndTracing } from "./budget-tracing.js";
7
7
  import { createRuleConsentLane } from "../rules-consent.js";
8
8
  import { createConsolidationValve } from "./memory-consolidation.js";
9
+ import { createOperatorFaceIncidentSink } from "../memory-incident-sink.js";
9
10
  export async function runStage04(ctx) {
10
11
  const { backend, breakerState, config, logger, memoryEngine, metrics, sessionCaptureRecords } = ctx;
11
12
  const memoryBundleFaces = memoryEngine ? createMemoryBundleFaces(memoryEngine, { ...(sessionCaptureRecords !== undefined ? { captureRecords: sessionCaptureRecords } : {}) }) : undefined;
12
13
  const memoryComplianceFaces = memoryEngine
13
14
  ? createMemoryComplianceFaces(memoryEngine, {
14
- onIncident: (err) => logger.warn("memory_compliance_incident", { code: err.code ?? null, detail: err.message }),
15
+ onIncident: createOperatorFaceIncidentSink({ logger }, "memory_compliance_incident"),
15
16
  ...(sessionCaptureRecords !== undefined ? { captureRecords: sessionCaptureRecords } : {}),
16
17
  })
17
18
  : undefined;
18
19
  const memoryOriginFaces = memoryEngine
19
20
  ? createMemoryOriginFaces(memoryEngine, {
20
- onIncident: (err) => logger.warn("memory_origin_incident", { code: err.code ?? null, detail: err.message }),
21
+ onIncident: createOperatorFaceIncidentSink({ logger }, "memory_origin_incident"),
21
22
  ...(sessionCaptureRecords !== undefined ? { captureRecords: sessionCaptureRecords } : {}),
22
23
  })
23
24
  : undefined;
@@ -10,7 +10,7 @@ export declare function runStage05(ctx: Awaited<ReturnType<typeof runStage04>>):
10
10
  lspManager: import("@sema-agent/core").NodeLspManager | import("../lsp/manager.js").E2bLspManager | undefined;
11
11
  spaceReclaimer: import("../workspace-space.js").SpaceReclaimer | undefined;
12
12
  sandboxPodReaper: import("../plugins/k8s-pod-reaper.js").SandboxPodReaper | undefined;
13
- sandboxGitPlane: import("../sandbox-git-plane.js").SandboxGitPlane;
13
+ sandboxGitPlane: () => import("../sandbox-git-plane.js").SandboxGitPlane;
14
14
  perSessionCwd: Map<string, string>;
15
15
  perTaskImage: import("../per-task-image.js").PerTaskImageRegistry;
16
16
  sendUserFileTaskEnvs: import("../capabilities/sandbox-file-send.js").TaskEnvRegistry | undefined;
@@ -13,18 +13,20 @@ export async function runStage05(ctx) {
13
13
  const deviceLane = config.remoteExec?.provider === "device" ? createDeviceLane({ config, logger, metrics, backend, seat: sessionStore.executionPlacement, replicaId: instanceId }) : undefined;
14
14
  const headOf = headReadOf(sessionStore);
15
15
  const spaceCommits = backend !== undefined ? () => runStore : undefined;
16
- const { perTaskImage, sessionEnvSelection, perSessionCwd, setSessionCwd, setSessionShellEnv, setSessionInheritEnv, fenceSessionOwner, dropSessionScoped, executionEnvFactory, worktreeReap, sendUserFileTaskEnvs, lspManager, spaceReclaimer, sandboxSecretSeatGate, sandboxPodReaper, readSandboxGitPlane, } = createExecutionEnv({ config, logger, metrics, taskAttachmentStore, ...(deviceLane ? { deviceLane } : {}), ...(spaceCommits !== undefined ? { spaceCommits } : {}), ...(headOf !== undefined ? { headOf } : {}), ...(backend !== undefined ? { runRows: () => runStore } : {}) });
16
+ const { perTaskImage, sessionEnvSelection, perSessionCwd, setSessionCwd, setSessionShellEnv, setSessionInheritEnv, fenceSessionOwner, dropSessionScoped, executionEnvFactory, worktreeReap, sendUserFileTaskEnvs, lspManager, spaceReclaimer, sandboxSecretSeatGate, sandboxPodReaper, sandboxGitPlane: sandboxGitPlaneSeat, } = createExecutionEnv({ config, logger, metrics, taskAttachmentStore, ...(deviceLane ? { deviceLane } : {}), ...(spaceCommits !== undefined ? { spaceCommits } : {}), ...(headOf !== undefined ? { headOf } : {}), ...(backend !== undefined ? { runRows: () => runStore } : {}) });
17
17
  assertDeviceLaneWired(config.remoteExec?.provider === "device", deviceLane, executionEnvFactory !== undefined);
18
18
  if (deviceLane !== undefined && config.remoteExec?.provider === "device")
19
19
  await noteDeviceRelayBindings(config.remoteExec.relay, deviceLane.store, logger);
20
20
  assertWorkspaceSpaceReadable(facts.workspaceSpace(config), { headOf, spaceCommits }, facts.workspaceCache(config), sessionStoreLabelOf(config.sessionBackend, backend?.kind));
21
21
  if (sandboxSecretSeatGate !== undefined)
22
22
  await sandboxSecretSeatGate();
23
- const sandboxGitPlane = await readSandboxGitPlane();
24
- if (sandboxGitPlane.state === "on")
25
- logger.info("credential_plane_sandbox_git", { state: "on", origins: sandboxGitPlane.origins });
26
- else if (sandboxGitPlane.reason !== "single_user" && sandboxGitPlane.reason !== "lane_without_boundary") {
27
- logger.info("credential_plane_sandbox_git", { state: "off", reason: sandboxGitPlane.reason, why: SANDBOX_GIT_PLANE_OFF_TEXT[sandboxGitPlane.reason] });
23
+ await sandboxGitPlaneSeat.settle();
24
+ const sandboxGitPlane = sandboxGitPlaneSeat.now;
25
+ const bootPlane = sandboxGitPlane();
26
+ if (bootPlane.state === "on")
27
+ logger.info("credential_plane_sandbox_git", { state: "on", origins: bootPlane.origins });
28
+ else if (bootPlane.reason !== "single_user" && bootPlane.reason !== "lane_without_boundary") {
29
+ logger.info("credential_plane_sandbox_git", { state: "off", reason: bootPlane.reason, why: SANDBOX_GIT_PLANE_OFF_TEXT[bootPlane.reason] });
28
30
  }
29
31
  if (config.toolTrace)
30
32
  logger.info("tool_trace_enabled", {});
@@ -71,7 +71,7 @@ export declare function runStage06(ctx: Awaited<ReturnType<typeof runStage05>>):
71
71
  lspManager: import("@sema-agent/core").NodeLspManager | import("../lsp/manager.js").E2bLspManager | undefined;
72
72
  spaceReclaimer: import("../workspace-space.js").SpaceReclaimer | undefined;
73
73
  sandboxPodReaper: import("../plugins/k8s-pod-reaper.js").SandboxPodReaper | undefined;
74
- sandboxGitPlane: import("../sandbox-git-plane.js").SandboxGitPlane;
74
+ sandboxGitPlane: () => import("../sandbox-git-plane.js").SandboxGitPlane;
75
75
  perSessionCwd: Map<string, string>;
76
76
  perTaskImage: import("../per-task-image.js").PerTaskImageRegistry;
77
77
  sendUserFileTaskEnvs: import("../capabilities/sandbox-file-send.js").TaskEnvRegistry | undefined;
@@ -29,6 +29,7 @@ import { mountOrgDeliveryGate } from "./org-delivery.js";
29
29
  import { parkedAskRedeem, runStore } from "./late-binds.js";
30
30
  import { withInternalRunEnvs } from "../internal-run-env.js";
31
31
  import { retentionSweepRuns } from "../plugins/retention-store-sql.js";
32
+ import { createOperatorFaceIncidentSink } from "../memory-incident-sink.js";
32
33
  export async function runStage06(ctx) {
33
34
  const { backend, backgroundAgentStore, brain, engineDataRoot, peerDesk, config, webAdmin, consolidationValve, deploymentMods, executionEnvFactory, fileHistoryStore, localRoot, logger, lspManager, mailboxRecipientLifecycle, mailboxStore, memoryEngine, memorySyncRunner, metrics, perSessionCwd, permissionRuleProvider, pricing, rosterStore, ruleConsent, sendUserFileTaskEnvs, sessionCaptureRecords, sessionPolicyStore, sessionStore, taskAttachmentStore, taskListLane, toolResultStore, tracer, usageWindowStore } = ctx;
34
35
  const { sqlWorkflowRunStore, workflowNotifyJournal, workflowCompletionInbox, deliverWorkflowCompletion, workflowNotifyGate, fleetBus, workflowRunStore, workflowJournalStore, outcomeSink, workflowRecoverOpts, workflowAgentRegistry, subagentSteerRegistry, workflowAgentSessionIndex, workflowParkDecisions, } = createWorkflowOrchestration({ config, logger, metrics, localRoot, backend, getRunStore: () => runStore });
@@ -92,7 +93,7 @@ export async function runStage06(ctx) {
92
93
  seat: consolidationSeat,
93
94
  scopes: config.memoryConsolidationDriver.scopes,
94
95
  ...(config.memoryProvenance !== undefined ? { provenance: config.memoryProvenance } : {}),
95
- onIncident: (err) => logger.warn("memory_consolidation_incident", { code: err.code ?? null, detail: err.message }),
96
+ onIncident: createOperatorFaceIncidentSink({ logger }, "memory_consolidation_incident"),
96
97
  onStopDetail: (audit) => logger.warn("memory_consolidation_stop_detail", audit),
97
98
  ...(sessionCaptureRecords !== undefined ? { captureRecords: sessionCaptureRecords } : {}),
98
99
  writeJudge: createOperatorValveWriteJudge({ ruleStoreProvider: permissionRuleProvider, config }),
@@ -88,7 +88,7 @@ export declare function runStage07(ctx: Awaited<ReturnType<typeof runStage06>>):
88
88
  lspManager: import("@sema-agent/core").NodeLspManager | import("../lsp/manager.js").E2bLspManager | undefined;
89
89
  spaceReclaimer: import("../workspace-space.js").SpaceReclaimer | undefined;
90
90
  sandboxPodReaper: import("../plugins/k8s-pod-reaper.js").SandboxPodReaper | undefined;
91
- sandboxGitPlane: import("../sandbox-git-plane.js").SandboxGitPlane;
91
+ sandboxGitPlane: () => import("../sandbox-git-plane.js").SandboxGitPlane;
92
92
  perSessionCwd: Map<string, string>;
93
93
  perTaskImage: import("../per-task-image.js").PerTaskImageRegistry;
94
94
  sendUserFileTaskEnvs: import("../capabilities/sandbox-file-send.js").TaskEnvRegistry | undefined;
@@ -28,6 +28,7 @@ import { bindRateLimiter, bindRunStore } from "./late-binds.js";
28
28
  import { buildDisplaySafeUrl } from "../trace/redact.js";
29
29
  import * as facts from "../capability-facts.js";
30
30
  import { WEB_ADMIN_ENV } from "@sema-agent/settings-schema";
31
+ import { seatText } from "../trace/exit-seat.js";
31
32
  export async function runStage07(ctx) {
32
33
  const { approvalAskAudit, approvalExemptionStore, backend, backgroundAgentStore, brain, checkpointStore, config, webAdmin, counterDegradeHook, peerDesk, durableEnabled, instanceId, localRoot, logger, question, runner, runnerDeps, sendUserFileToolSpec, sessionEnvSelection, sessionStore, subRunner, taskListLane, toolApproval } = ctx;
33
34
  const authorize = createAuthorizer(config, sessionStore);
@@ -165,7 +166,7 @@ export async function runStage07(ctx) {
165
166
  else
166
167
  logger.warn("web_search_probe_failed", { provider: webSearchCfg.provider, error: r.error, note: "WebSearch stays mounted — the tool will fail per-call until this is fixed; the service is not blocked by it." });
167
168
  })
168
- .catch((e) => logger.warn("web_search_probe_failed", { provider: webSearchCfg.provider, error: e instanceof Error ? e.message : String(e) }));
169
+ .catch((e) => logger.warn("web_search_probe_failed", { provider: webSearchCfg.provider, error: seatText("operator-log-text", e instanceof Error ? e.message : String(e)) }));
169
170
  }
170
171
  const ensureChildSessionDurable = checkpointStore && resolveSubagentTranscriptTier(backgroundAgentStore !== undefined, sessionStore) === "full"
171
172
  ? (sessionId, root) => attestChildSessionDurable(sessionStore, sessionId, root, logger)
@@ -101,7 +101,7 @@ export declare function runStage08(ctx: Awaited<ReturnType<typeof runStage07>>):
101
101
  lspManager: import("@sema-agent/core").NodeLspManager | import("../lsp/manager.js").E2bLspManager | undefined;
102
102
  spaceReclaimer: import("../workspace-space.js").SpaceReclaimer | undefined;
103
103
  sandboxPodReaper: import("../plugins/k8s-pod-reaper.js").SandboxPodReaper | undefined;
104
- sandboxGitPlane: import("../sandbox-git-plane.js").SandboxGitPlane;
104
+ sandboxGitPlane: () => import("../sandbox-git-plane.js").SandboxGitPlane;
105
105
  perSessionCwd: Map<string, string>;
106
106
  perTaskImage: import("../per-task-image.js").PerTaskImageRegistry;
107
107
  sendUserFileTaskEnvs: import("../capabilities/sandbox-file-send.js").TaskEnvRegistry | undefined;
@@ -4,6 +4,7 @@ import { startReapers } from "./reapers.js";
4
4
  import { startRetentionLane, RETENTION_LEASE_TTL_FACTOR } from "./retention-lane.js";
5
5
  import { createLimitSync } from "./limit-sync.js";
6
6
  import { runDenySweep } from "./late-binds.js";
7
+ import { seatText } from "../trace/exit-seat.js";
7
8
  export function runStage08(ctx) {
8
9
  const { approvalAskAudit, approvalNonceStore, backend, backgroundAgentStore, ceilingVerdict, checkpointStore, parkCommits, config, webAdmin, consolidationSeatWatch, costQuota, degradeRouteWatch, fileHistoryErasure, spaceReclaimer, sandboxPodReaper, handslessRunner, hookAgentRunner, imageBakes, instanceId, localRoot, logger, mailboxStore, metrics, permissionRuleStores, pricing, rateLimiter, retentionExecutor, retentionLaneStore, rosterStore, runStore, runner, sqlWorkflowRunStore, subRunner, taskAttachmentStore, toolApproval, toolResultStore, userInputLedger, workflowJournalStore, workflowNotifyGate, workflowNotifyJournal, workflowRecoverOpts, worktreeReap } = ctx;
9
10
  const reaper = startReapers({
@@ -48,7 +49,7 @@ export function runStage08(ctx) {
48
49
  const otelExporter = config.otel
49
50
  ? startOtlpExporter(metrics, {
50
51
  ...config.otel,
51
- onError: (err) => logger.warn("otel_export_failed", { err: String(err) }),
52
+ onError: (err) => logger.warn("otel_export_failed", { err: seatText("operator-log-text", String(err)) }),
52
53
  })
53
54
  : undefined;
54
55
  const limitSync = createLimitSync({ config, rateGate: rateLimiter, quota: costQuota, logger });
@@ -67,7 +68,7 @@ export function runStage08(ctx) {
67
68
  }
68
69
  catch (err) {
69
70
  if (i > 0)
70
- logger.error("runner_deps_swap_split", { failedAt: name, seats: Object.keys(next), swapped: bootRunners.slice(0, i).map(([n]) => n), err: String(err) });
71
+ logger.error("runner_deps_swap_split", { failedAt: name, seats: Object.keys(next), swapped: bootRunners.slice(0, i).map(([n]) => n), err: seatText("operator-log-text", String(err)) });
71
72
  throw err;
72
73
  }
73
74
  }
@@ -125,7 +125,7 @@ export declare function runStage09(ctx: Awaited<ReturnType<typeof runStage08>>):
125
125
  lspManager: import("@sema-agent/core").NodeLspManager | import("../lsp/manager.js").E2bLspManager | undefined;
126
126
  spaceReclaimer: import("../workspace-space.js").SpaceReclaimer | undefined;
127
127
  sandboxPodReaper: import("../plugins/k8s-pod-reaper.js").SandboxPodReaper | undefined;
128
- sandboxGitPlane: import("../sandbox-git-plane.js").SandboxGitPlane;
128
+ sandboxGitPlane: () => import("../sandbox-git-plane.js").SandboxGitPlane;
129
129
  perSessionCwd: Map<string, string>;
130
130
  perTaskImage: import("../per-task-image.js").PerTaskImageRegistry;
131
131
  sendUserFileTaskEnvs: import("../capabilities/sandbox-file-send.js").TaskEnvRegistry | undefined;
@@ -124,7 +124,7 @@ export declare function runStage10(ctx: Awaited<ReturnType<typeof runStage09>>):
124
124
  lspManager: import("@sema-agent/core").NodeLspManager | import("../lsp/manager.js").E2bLspManager | undefined;
125
125
  spaceReclaimer: import("../workspace-space.js").SpaceReclaimer | undefined;
126
126
  sandboxPodReaper: import("../plugins/k8s-pod-reaper.js").SandboxPodReaper | undefined;
127
- sandboxGitPlane: import("../sandbox-git-plane.js").SandboxGitPlane;
127
+ sandboxGitPlane: () => import("../sandbox-git-plane.js").SandboxGitPlane;
128
128
  perSessionCwd: Map<string, string>;
129
129
  perTaskImage: import("../per-task-image.js").PerTaskImageRegistry;
130
130
  sendUserFileTaskEnvs: import("../capabilities/sandbox-file-send.js").TaskEnvRegistry | undefined;
@@ -29,6 +29,7 @@ import { installShutdownHandlers } from "./shutdown.js";
29
29
  import { bindServerLateSeats } from "./late-binds.js";
30
30
  import { serviceVersion } from "../service-version.js";
31
31
  import { buildDisplaySafeUrl } from "../trace/redact.js";
32
+ import { seatText } from "../trace/exit-seat.js";
32
33
  export async function runStage10(ctx) {
33
34
  const { peerDesk, approvalAskAudit, approvalExemptionStore, approvalNonceStore, authorize, backend, backgroundAgentStore, brain, breakerState, centerRuntimeCapsResolver, checkpointStore, checkpointCtxSealing, parkCommits, config, webAdmin, consolidationValve, costQuota, deploymentModsLoaded, deviceLane, drainState, durableEnabled, elicitation, fenceSessionOwner, fileHistoryStore, fleetBus, fleetLease, fleetUsage, governanceSeams, handslessRunner, hookAgent, hookLlm, hookWakeBus, imageBakes, imageIndex, instanceId, instrumentDegenerate, leaderEndpoint, loadedSkills, localRoot, logger, lspManager, mcpRevocations, memoryBundleFaces, memoryComplianceFaces, memoryConsolidationFaces, memoryEngine, memoryExportStores, memoryOptOutGrantStore, memoryOriginFaces, memoryPosture, memorySyncCursors, memorySyncRunner, metrics, modelUsageTracker, orgMemoryAdmission, otelExporter, outcomeSink, ownerAware, parkedReviveInheritedGate, parkedReviveSurface, perSessionCwd, perTaskImage, planCacheProbe, pricing, principalCaps, promptManifestTracker, purgeSession, question, rateLimiter, reaper, webAdminJwtVerifier, resumeAnchorStore, retentionLaneStarted, retentionLaneStore, ruleConsent, runStore, runner, runnerDeps, runtimeCapsPeekResolver, sandboxGitPlane, scenarioDetails, scenarios, selectEnvTool, sendFileLedger, sendUserFileEmitter, sendUserFileToolSpec, sessionAudit, sessionEnvSelection, sessionMemoryStatusFace, sessionPolicyStore, sessionTitler, sessionWatchRegistry, setSessionCwd, setSessionInheritEnv, setSessionShellEnv, sharedMemoryStore, sideQueryAccounting, sqlEngine, sqlWorkflowRunStore, staticWiring, storePosture, subRunner, subagentSteerRegistry, taskAttachmentStore, taskLimitCaps, taskTimeoutSec, toolApproval, toolResultStore, usageWindowStore, userInputLedger, webSearchProvider, workflowAgentRegistry, workflowAgentSessionIndex, workflowParkDecisions, workflowCompletionInbox, workflowJournalStore, workflowModelAllowlistSnapshot, workflowNotifyGate, workflowNotifyJournal, workflowRecoverOpts, workflowRunStore, workflowsCapable, orgDeliveryGate } = ctx;
34
35
  const stores = {
@@ -132,7 +133,7 @@ export async function runStage10(ctx) {
132
133
  classifierModel: () => {
133
134
  const route = classifierRouteFor(runnerDeps);
134
135
  if (route.fault !== undefined)
135
- logger.debug("auto_mode_classifier_route_unresolved", { fault: route.fault });
136
+ logger.debug("auto_mode_classifier_route_unresolved", { fault: seatText("operator-log-text", route.fault) });
136
137
  return route.id;
137
138
  },
138
139
  },
@@ -257,7 +258,7 @@ export async function runStage10(ctx) {
257
258
  bindHost: bindHost ?? "0.0.0.0/::(all interfaces)",
258
259
  ...(config.bindHostSource ? { bindHostSource: config.bindHostSource } : {}),
259
260
  ...(config.bindHostSource === "HOST" ? { note: "bind failed for a host inherited from the HOST env var — set BIND_HOST explicitly (e.g. BIND_HOST=127.0.0.1)." } : {}),
260
- error: e instanceof Error ? e.message : String(e),
261
+ error: seatText("operator-log-text", e instanceof Error ? e.message : String(e)),
261
262
  });
262
263
  throw e;
263
264
  }
@@ -267,7 +268,7 @@ export async function runStage10(ctx) {
267
268
  }
268
269
  server.on("error", (e) => {
269
270
  logger.error("server_error", {
270
- error: e.message,
271
+ error: seatText("operator-log-text", e.message),
271
272
  ...("code" in e ? { code: String(e.code) } : {}),
272
273
  });
273
274
  });
@@ -324,7 +325,7 @@ export async function runStage10(ctx) {
324
325
  void workflowNotifyGate
325
326
  .recover(workflowRecoverOpts)
326
327
  .then((tally) => logger.info("workflow_notify_recovered", tally))
327
- .catch((err) => logger.warn("workflow_notify_recover_failed", { err: String(err) }))
328
+ .catch((err) => logger.warn("workflow_notify_recover_failed", { err: seatText("operator-log-text", String(err)) }))
328
329
  .finally(() => resolveFleetRecovery());
329
330
  }
330
331
  else {
@@ -42,6 +42,7 @@ import { buildMemoryPosture } from "../memory-posture.js";
42
42
  import { headReadOf } from "../session-incarnation.js";
43
43
  import { establishSqlEnginePosture, sqlPoolsOf } from "../sql-engine-posture.js";
44
44
  import { buildStorePosture } from "../store-posture.js";
45
+ import { seatText } from "../trace/exit-seat.js";
45
46
  const DARK_REASON_PROSE = {
46
47
  engine_off: () => "MEMORY_ENGINE=off",
47
48
  multi_tenant_file_backend: () => "multi-tenant on the FILE backend (no tenant isolation; set MEMORY_ENGINE_BACKEND=pg|mysql to light up)",
@@ -153,7 +154,7 @@ export async function openStores(ctx) {
153
154
  metrics.inc("memory_embed_failed_total", { backend: dialect });
154
155
  logger.warn("memory_embedder_failed", {
155
156
  model: config.memoryEmbedder?.model,
156
- err: String(err).slice(0, 300),
157
+ err: seatText("operator-log-text", String(err)),
157
158
  note: "memory writes for this batch report an io-error conflict and retrieval falls back to the lexical floor until the embedder recovers",
158
159
  });
159
160
  },
@@ -277,7 +278,7 @@ export async function openStores(ctx) {
277
278
  if (pgPool) {
278
279
  const q = async (text, params) => { const r = await pgPool.query(text, params); return { rows: r.rows }; };
279
280
  await ensurePgTaskAttachmentSchema(q);
280
- taskAttachmentStore = new PgTaskAttachmentStore(q, bytes);
281
+ taskAttachmentStore = new PgTaskAttachmentStore(pgPool, bytes);
281
282
  }
282
283
  else {
283
284
  await ensureTiDBTaskAttachmentSchema(mysqlPool);
@@ -30,7 +30,7 @@ import { CONFIG_DOMAIN_INVALID_NOTE, buildCandidateRejectedFields, candidateReje
30
30
  import { SHA256_HEX_RE } from "../digest-form.js";
31
31
  import { BOOT_REJUDGE_OF_REFUSED_GROUP, createConfigApplyLedger, modelPlaneCommitted, refusedGroups } from "../web-admin-client/apply-ledger.js";
32
32
  import { announceReadDenyRows, buildDeploymentPostureSeats } from "./runner-deps.js";
33
- import { echoCallerText } from "../caller-text-echo.js";
33
+ import { seatText } from "../trace/exit-seat.js";
34
34
  const MODELS_REJECTION_PHRASE = {
35
35
  domain_invalid: "models 域判形失败",
36
36
  empty: "读不出(空 / 纯空白:半写或截断)",
@@ -161,14 +161,14 @@ export async function createWebAdminRuntime(ctx) {
161
161
  `refusing to start rather than run with every sealed model unusable (no_key_store). Make that directory creatable, owned by ` +
162
162
  `the service user and chmod-able to 0700 on a writable filesystem, or unset SEALED_KEY_DIR to use <data root>/sealed-key.`);
163
163
  }
164
- logger.warn("sealed_key_store_unavailable", { err: String(err), note: "sealed api keys cannot be unsealed on this host — models carrying sealedApiKey will fail loud per-model" });
164
+ logger.warn("sealed_key_store_unavailable", { err: seatText("operator-log-text", String(err)), note: "sealed api keys cannot be unsealed on this host — models carrying sealedApiKey will fail loud per-model" });
165
165
  }
166
166
  let checkpointCtxSealing;
167
167
  try {
168
168
  checkpointCtxSealing = await ensureCheckpointCtxSealing(sealedKeyDir, logger);
169
169
  }
170
170
  catch (err) {
171
- logger.warn("checkpoint_ctx_sealing_unavailable", { err: err instanceof Error ? err.message : String(err), dir: join(sealedKeyDir, "checkpoint-ctx-keys"), note: "suspended tasks' request credentials cannot be sealed on this host; with durable approvals on the boot refuses — make that directory (under the sealed-key custody directory: SEALED_KEY_DIR, default <data root>/sealed-key) creatable and chmod-able by the service, or repair / remove a key file there whose public and private halves do not belong together" });
171
+ logger.warn("checkpoint_ctx_sealing_unavailable", { err: seatText("operator-log-text", err instanceof Error ? err.message : String(err)), dir: join(sealedKeyDir, "checkpoint-ctx-keys"), note: "suspended tasks' request credentials cannot be sealed on this host; with durable approvals on the boot refuses — make that directory (under the sealed-key custody directory: SEALED_KEY_DIR, default <data root>/sealed-key) creatable and chmod-able by the service, or repair / remove a key file there whose public and private halves do not belong together" });
172
172
  }
173
173
  const configProvider = configSourceKind(config) !== undefined
174
174
  ? createConfigProvider({
@@ -234,7 +234,7 @@ export async function createWebAdminRuntime(ctx) {
234
234
  listener(changed);
235
235
  }
236
236
  catch (err) {
237
- logger.warn("self_report_listener_failed", { changed, error: err instanceof Error ? err.message : String(err), note: "a self-report subscriber threw; the state change stands regardless and the next fleet heartbeat carries it" });
237
+ logger.warn("self_report_listener_failed", { changed, error: seatText("operator-log-text", err instanceof Error ? err.message : String(err)), note: "a self-report subscriber threw; the state change stands regardless and the next fleet heartbeat carries it" });
238
238
  }
239
239
  }
240
240
  };
@@ -326,7 +326,7 @@ export async function createWebAdminRuntime(ctx) {
326
326
  });
327
327
  }
328
328
  catch (e) {
329
- logger.warn("center_prompts_store_unwritable", { dir: promptEpochDir, err: String(e), note: "file-backed prompt-epoch store unavailable — memory fallback (the center candidate is not restart-durable); built-ins unaffected" });
329
+ logger.warn("center_prompts_store_unwritable", { dir: promptEpochDir, err: seatText("operator-log-text", String(e)), note: "file-backed prompt-epoch store unavailable — memory fallback (the center candidate is not restart-durable); built-ins unaffected" });
330
330
  return new CenterPromptSource({
331
331
  store: withByDigestBackfill(new MemoryPromptArtifactStore()),
332
332
  stateStore: recordingStateStore(binnedPromptStateStore(storePerBin(() => new MemoryPromptSourceStateStore()))),
@@ -349,7 +349,7 @@ export async function createWebAdminRuntime(ctx) {
349
349
  await promptSource.restore();
350
350
  }
351
351
  catch (e) {
352
- logger.warn("center_prompts_catalog_restore_failed", { phase, err: String(e), note: "the persisted center-layer state for this credential identity could not be loaded — the center candidate is absent until the next adopt; built-ins unaffected" });
352
+ logger.warn("center_prompts_catalog_restore_failed", { phase, err: seatText("operator-log-text", String(e)), note: "the persisted center-layer state for this credential identity could not be loaded — the center candidate is absent until the next adopt; built-ins unaffected" });
353
353
  }
354
354
  if (cc !== undefined && identity !== undefined && currentIdentity() !== identity) {
355
355
  promptStateIdentity = undefined;
@@ -474,7 +474,7 @@ export async function createWebAdminRuntime(ctx) {
474
474
  return lkgSurvivesRestart;
475
475
  }
476
476
  catch (err) {
477
- logger.warn("config_lkg_save_failed", { path: lkgPath, err: String(err), note: "durable persist failed — restart signal proceeds anyway (a dead disk + dead center double-fault can re-loop; fix the disk)" });
477
+ logger.warn("config_lkg_save_failed", { path: lkgPath, err: seatText("operator-log-text", String(err)), note: "durable persist failed — restart signal proceeds anyway (a dead disk + dead center double-fault can re-loop; fix the disk)" });
478
478
  return false;
479
479
  }
480
480
  };
@@ -511,7 +511,7 @@ export async function createWebAdminRuntime(ctx) {
511
511
  await saveLkg(lkgPath, cc?.worker, identity, read.lkg.effective, read.lkg.etag);
512
512
  }
513
513
  catch (err) {
514
- logger.warn("config_lkg_save_failed", { path: lkgPath, err: String(err), note: "the migrated LKG is used from memory this boot; the on-disk copy is migrated again on the next read-back and replaced by the next clean candidate" });
514
+ logger.warn("config_lkg_save_failed", { path: lkgPath, err: seatText("operator-log-text", String(err)), note: "the migrated LKG is used from memory this boot; the on-disk copy is migrated again on the next read-back and replaced by the next clean candidate" });
515
515
  }
516
516
  }
517
517
  logger.info("config_loaded_lkg", { path: lkgPath, savedAt: read.lkg.savedAt, why, scope, note: lkgReadNote(scope) });
@@ -562,7 +562,7 @@ export async function createWebAdminRuntime(ctx) {
562
562
  }
563
563
  catch (applyErr) {
564
564
  lkgBooted = false;
565
- logger.warn("config_lkg_apply_failed", { err: String(applyErr), note: "persisted LKG failed to apply — env fallback serves; the cache rewrites on the next clean candidate" });
565
+ logger.warn("config_lkg_apply_failed", { err: seatText("operator-log-text", String(applyErr)), note: "persisted LKG failed to apply — env fallback serves; the cache rewrites on the next clean candidate" });
566
566
  }
567
567
  };
568
568
  const warnLocalNoModels = (r, verdict) => {
@@ -681,10 +681,10 @@ export async function createWebAdminRuntime(ctx) {
681
681
  if (err instanceof ConfigDirUntrustedError)
682
682
  throw err;
683
683
  if (bootApplyPhase)
684
- logger.warn("config_apply_refused", { source: configProvider.kind, err: String(err), note: "the pulled candidate failed to apply at boot — falling back to the LKG / env; this is not a reachability failure" });
684
+ logger.warn("config_apply_refused", { source: configProvider.kind, err: seatText("operator-log-text", String(err)), note: "the pulled candidate failed to apply at boot — falling back to the LKG / env; this is not a reachability failure" });
685
685
  else
686
- logger.warn("config_source_unreachable_using_env", { source: configProvider.kind, err: String(err) });
687
- await bootFallBackWhole(`${bootApplyPhase ? "boot apply refused" : "boot fetch failed"}: ${echoCallerText(String(err), { maxChars: 120 })}`);
686
+ logger.warn("config_source_unreachable_using_env", { source: configProvider.kind, err: seatText("operator-log-text", String(err)) });
687
+ await bootFallBackWhole(`${bootApplyPhase ? "boot apply refused" : "boot fetch failed"}: ${seatText("operator-log-text", String(err))}`);
688
688
  }
689
689
  if (!dryRun && cc !== undefined && currentIdentity() !== promptStateIdentity)
690
690
  await rebasePromptState(currentIdentity(), "boot-end");
@@ -770,7 +770,7 @@ export async function createWebAdminRuntime(ctx) {
770
770
  toolsShareThisFilesystem: DEPLOYMENT_SHAPE_PREDICATES.toolsOnThisHost.holds(config),
771
771
  logger,
772
772
  }).catch((err) => {
773
- logger.warn("center_plugins_apply_failed", { error: err instanceof Error ? err.message : String(err) });
773
+ logger.warn("center_plugins_apply_failed", { error: seatText("operator-log-text", err instanceof Error ? err.message : String(err)) });
774
774
  return undefined;
775
775
  });
776
776
  if (pluginOut) {
@@ -782,7 +782,7 @@ export async function createWebAdminRuntime(ctx) {
782
782
  }
783
783
  if (bootLkgCandidate && lkgEnabled) {
784
784
  const bootPublished = await persistLkgDurable(bootLkgCandidate.effective, bootLkgCandidate.etag).catch((err) => {
785
- logger.warn("config_lkg_save_failed", { err: String(err), note: "boot LKG persist failed — retained for the per-tick retry" });
785
+ logger.warn("config_lkg_save_failed", { err: seatText("operator-log-text", String(err)), note: "boot LKG persist failed — retained for the per-tick retry" });
786
786
  return false;
787
787
  });
788
788
  {
@@ -1054,7 +1054,7 @@ export async function createWebAdminRuntime(ctx) {
1054
1054
  }
1055
1055
  }
1056
1056
  catch (err) {
1057
- logger.warn("web_admin_refresh_failed", { err: String(err), note: "etag NOT advanced — the same candidate is re-fetched and re-applied next poll" });
1057
+ logger.warn("web_admin_refresh_failed", { err: seatText("operator-log-text", String(err)), note: "etag NOT advanced — the same candidate is re-fetched and re-applied next poll" });
1058
1058
  return "failed";
1059
1059
  }
1060
1060
  finally {
@@ -1113,7 +1113,7 @@ export async function createWebAdminRuntime(ctx) {
1113
1113
  lastPull = "ok";
1114
1114
  }
1115
1115
  catch (err) {
1116
- logger.warn("web_admin_refresh_failed", { err: String(err), leg: "boot-deferred", note: "etag NOT advanced — the refresh cadence re-fetches and re-applies the same candidate" });
1116
+ logger.warn("web_admin_refresh_failed", { err: seatText("operator-log-text", String(err)), leg: "boot-deferred", note: "etag NOT advanced — the refresh cadence re-fetches and re-applies the same candidate" });
1117
1117
  }
1118
1118
  finally {
1119
1119
  refreshInFlight = false;
@@ -1164,7 +1164,7 @@ export async function createWebAdminRuntime(ctx) {
1164
1164
  void bootConfigPending.then((r) => {
1165
1165
  if (r !== null && configProvider.kind === "remote" && candidateIdentityOf(r.effective) !== currentIdentity()) {
1166
1166
  logger.warn("config_boot_arrival_identity_changed", { note: "the late boot pull landed under a center credential that is no longer current — not adopted; re-pulling once under the current credential" });
1167
- void pullEffective(configProvider, undefined).then(continueArrival, (err) => logger.warn("config_boot_arrival_repull_failed", { err: String(err), note: "the refresh cadence retries under the current credential" }));
1167
+ void pullEffective(configProvider, undefined).then(continueArrival, (err) => logger.warn("config_boot_arrival_repull_failed", { err: seatText("operator-log-text", String(err)), note: "the refresh cadence retries under the current credential" }));
1168
1168
  return;
1169
1169
  }
1170
1170
  continueArrival(r);
@@ -1,5 +1,6 @@
1
1
  import { createWebFetchSummarizer, resolveTaskModel as coreResolveTaskModel } from "@sema-agent/core";
2
2
  import { createPerModelAuthSeat } from "./side-query-lane.js";
3
+ import { seatText } from "../trace/exit-seat.js";
3
4
  export function createWebFetchSummarizeLane(ctx) {
4
5
  return async (content, prompt, signal) => {
5
6
  const model = (() => {
@@ -7,7 +8,7 @@ export function createWebFetchSummarizeLane(ctx) {
7
8
  return coreResolveTaskModel({ modelRole: "summarize" }, { models: ctx.config.models, roles: ctx.config.roles }).model;
8
9
  }
9
10
  catch (err) {
10
- ctx.logger.warn("webfetch_summarizer_model_unresolved", { err: String(err), note: "this fetch falls back to raw page content" });
11
+ ctx.logger.warn("webfetch_summarizer_model_unresolved", { err: seatText("operator-log-text", String(err)), note: "this fetch falls back to raw page content" });
11
12
  return undefined;
12
13
  }
13
14
  })();