@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.
- package/MIGRATION.md +215 -0
- package/USAGE.md +67 -12
- package/dist/approval-ask-audit-store.d.ts +54 -38
- package/dist/approval-ask-audit-store.js +58 -39
- package/dist/approval-card.d.ts +8 -8
- package/dist/approval-crash-convergence.d.ts +17 -7
- package/dist/approval-crash-convergence.js +94 -22
- package/dist/approval-deny-reasons.d.ts +34 -30
- package/dist/approval-deny-reasons.js +21 -6
- package/dist/approval-policy-settlement.d.ts +1 -1
- package/dist/approval-reconciler.d.ts +33 -1
- package/dist/approval-reconciler.js +43 -40
- package/dist/auth-bridge.d.ts +9 -6
- package/dist/auth-bridge.js +9 -3
- package/dist/boot/adoption.js +2 -1
- package/dist/boot/budget-tracing.d.ts +16 -0
- package/dist/boot/budget-tracing.js +10 -6
- package/dist/boot/device-lane.d.ts +1 -1
- package/dist/boot/execution-env.d.ts +24 -4
- package/dist/boot/execution-env.js +26 -23
- package/dist/boot/execution-lane.js +2 -1
- package/dist/boot/exit-boundary.js +5 -4
- package/dist/boot/memory-consolidation.js +2 -1
- package/dist/boot/parked-revive-gate.js +2 -1
- package/dist/boot/permission-rules-audit.d.ts +0 -28
- package/dist/boot/permission-rules-audit.js +2 -1
- package/dist/boot/read-deny-anchor-audit.js +2 -1
- package/dist/boot/reapers.js +4 -3
- package/dist/boot/resolve-spec.js +11 -2
- package/dist/boot/retention-lane.js +5 -3
- package/dist/boot/runner-deps.js +16 -13
- package/dist/boot/runtime-caps.js +3 -2
- package/dist/boot/session-faces.js +4 -3
- package/dist/boot/shutdown.js +3 -2
- package/dist/boot/stage-04-stores.js +3 -2
- package/dist/boot/stage-05-execution-env.d.ts +1 -1
- package/dist/boot/stage-05-execution-env.js +8 -6
- package/dist/boot/stage-06-runners.d.ts +1 -1
- package/dist/boot/stage-06-runners.js +2 -1
- package/dist/boot/stage-07-capability-layer.d.ts +1 -1
- package/dist/boot/stage-07-capability-layer.js +2 -1
- package/dist/boot/stage-08-reapers.d.ts +1 -1
- package/dist/boot/stage-08-reapers.js +3 -2
- package/dist/boot/stage-09-leader.d.ts +1 -1
- package/dist/boot/stage-10-http-server.d.ts +1 -1
- package/dist/boot/stage-10-http-server.js +5 -4
- package/dist/boot/stores.js +3 -2
- package/dist/boot/web-admin.js +17 -17
- package/dist/boot/webfetch-summarize-lane.js +2 -1
- package/dist/boot/workflow-orchestration.js +3 -2
- package/dist/capabilities/builtin-tools.d.ts +2 -1
- package/dist/capabilities/builtin-tools.js +2 -4
- package/dist/capabilities/composite-members.d.ts +2 -1
- package/dist/capabilities/composite-members.js +2 -1
- package/dist/capability-facts.d.ts +24 -0
- package/dist/capability-facts.js +23 -0
- package/dist/config-catalog.js +1 -0
- package/dist/config-types.d.ts +15 -4
- package/dist/config.d.ts +6 -0
- package/dist/config.js +17 -3
- package/dist/execution-lane-caps.d.ts +2 -1
- package/dist/fleet/fleet-bus.d.ts +6 -3
- package/dist/hooks/hook-runner.d.ts +6 -0
- package/dist/hooks/hook-runner.js +30 -1
- package/dist/http/dispatch.js +4 -2
- package/dist/http/execution-context.d.ts +2 -2
- package/dist/http/idempotency.d.ts +1 -1
- package/dist/http/principal-gate.d.ts +3 -1
- package/dist/http/principal-gate.js +17 -8
- package/dist/http/resume-legs.js +5 -9
- package/dist/http/route-table.js +2 -0
- package/dist/http/routes/attachments.js +18 -0
- package/dist/http/routes/capabilities.js +5 -2
- package/dist/http/routes/memory-policy.js +26 -6
- package/dist/http/routes/runs.js +3 -3
- package/dist/http/routes/session-memory-sync.d.ts +63 -0
- package/dist/http/routes/session-memory-sync.js +157 -0
- package/dist/http/routes/sessions-list.d.ts +2 -1
- package/dist/http/routes/tasks.js +7 -5
- package/dist/http/run-read-face.d.ts +7 -0
- package/dist/http/run-read-face.js +9 -3
- package/dist/http/send.d.ts +5 -0
- package/dist/http/send.js +9 -2
- package/dist/http/server.d.ts +14 -8
- package/dist/http/server.js +2 -4
- package/dist/http/submit-replay.d.ts +4 -3
- package/dist/http/submit-replay.js +2 -2
- package/dist/http/sync-submit-body.d.ts +21 -4
- package/dist/http/sync-submit-body.js +13 -0
- package/dist/identity-source.d.ts +21 -2
- package/dist/identity-source.js +6 -0
- package/dist/memory-incident-sink.d.ts +19 -6
- package/dist/memory-incident-sink.js +8 -4
- package/dist/memory-sync-client.d.ts +21 -21
- package/dist/memory-sync-client.js +50 -42
- package/dist/memory-sync-identity.d.ts +24 -0
- package/dist/memory-sync-identity.js +57 -0
- package/dist/memory-sync.d.ts +7 -1
- package/dist/memory-sync.js +6 -3
- package/dist/observability/fail-open.d.ts +27 -10
- package/dist/observability/fail-open.js +20 -7
- package/dist/observability/run-terminal.d.ts +92 -34
- package/dist/observability/run-terminal.js +167 -162
- package/dist/plugins/approval-ask-store-file.d.ts +14 -4
- package/dist/plugins/approval-ask-store-file.js +48 -7
- package/dist/plugins/approval-ask-store-memory.d.ts +2 -1
- package/dist/plugins/approval-ask-store-memory.js +9 -8
- package/dist/plugins/approval-ask-store-sql.d.ts +42 -10
- package/dist/plugins/approval-ask-store-sql.js +49 -19
- package/dist/plugins/file-run-store.d.ts +6 -1
- package/dist/plugins/file-run-store.js +11 -1
- package/dist/plugins/local-session-store.d.ts +36 -7
- package/dist/plugins/local-session-store.js +76 -32
- package/dist/plugins/local-task-attachment-store.d.ts +12 -2
- package/dist/plugins/local-task-attachment-store.js +67 -43
- package/dist/plugins/memory-key-guards.d.ts +3 -3
- package/dist/plugins/memory-run-store.d.ts +6 -1
- package/dist/plugins/memory-run-store.js +11 -1
- package/dist/plugins/one-time-migrations.d.ts +27 -1
- package/dist/plugins/one-time-migrations.js +57 -3
- package/dist/plugins/remote-env-e2b.d.ts +23 -4
- package/dist/plugins/remote-env-e2b.js +111 -28
- package/dist/plugins/remote-env-k8s.d.ts +31 -5
- package/dist/plugins/remote-env-k8s.js +86 -19
- package/dist/plugins/remote-env-local-docker.d.ts +15 -3
- package/dist/plugins/remote-env-local-docker.js +40 -12
- package/dist/plugins/run-store-sql.d.ts +9 -1
- package/dist/plugins/run-store-sql.js +9 -1
- package/dist/plugins/store-backend.d.ts +10 -7
- package/dist/plugins/store-backend.js +1 -0
- package/dist/plugins/store-contracts.d.ts +26 -1
- package/dist/plugins/store-contracts.js +3 -0
- package/dist/plugins/task-attachment-store.d.ts +112 -14
- package/dist/plugins/task-attachment-store.js +221 -28
- package/dist/plugins/workspace-fill.d.ts +60 -0
- package/dist/plugins/workspace-fill.js +106 -0
- package/dist/project-bundle.d.ts +38 -0
- package/dist/project-bundle.js +609 -0
- package/dist/run-local.js +2 -8
- package/dist/runs.js +1 -2
- package/dist/sandbox-egress-policy.d.ts +4 -1
- package/dist/sandbox-egress-policy.js +3 -1
- package/dist/sandbox-git-plane.d.ts +31 -12
- package/dist/sandbox-git-plane.js +24 -4
- package/dist/security.d.ts +9 -0
- package/dist/security.js +8 -0
- package/dist/session-error-wire.d.ts +24 -0
- package/dist/session-error-wire.js +7 -0
- package/dist/task-settings.d.ts +10 -2
- package/dist/task-settings.js +15 -2
- package/dist/terminal.d.ts +39 -19
- package/dist/terminal.js +65 -22
- package/dist/tool-approval.d.ts +4 -3
- package/dist/tool-approval.js +12 -14
- package/dist/trace/core-keyset-guard.d.ts +123 -6
- package/dist/trace/engine-notice-wire.d.ts +8 -2
- package/dist/trace/engine-notice-wire.js +4 -2
- package/dist/trace/exit-seat.d.ts +2 -1
- package/dist/trace/ledger-sink.d.ts +8 -4
- package/dist/trace/ledger-sink.js +2 -2
- package/dist/trace/project.d.ts +18 -1
- package/dist/trace/project.js +16 -0
- package/dist/trace/self-minted-wire.d.ts +251 -2
- package/dist/trace/self-minted-wire.js +82 -0
- package/dist/trace/wire-projection-faces.d.ts +1 -1
- package/dist/trace/wire-projection-faces.js +1 -1
- package/dist/web-admin-client/apply-effective.js +21 -1
- package/dist/web-admin-client/effective-keys.js +2 -0
- package/dist/web-admin-client/types.d.ts +4 -0
- package/package.json +1 -1
- package/wire-changes/server@7.142.0.json +639 -0
package/dist/boot/runner-deps.js
CHANGED
|
@@ -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
|
-
|
|
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
|
-
...
|
|
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
|
-
...
|
|
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
|
});
|
package/dist/boot/shutdown.js
CHANGED
|
@@ -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: (
|
|
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: (
|
|
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,
|
|
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
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
logger.info("credential_plane_sandbox_git", { state: "
|
|
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: (
|
|
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 {
|
package/dist/boot/stores.js
CHANGED
|
@@ -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)
|
|
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(
|
|
281
|
+
taskAttachmentStore = new PgTaskAttachmentStore(pgPool, bytes);
|
|
281
282
|
}
|
|
282
283
|
else {
|
|
283
284
|
await ensureTiDBTaskAttachmentSchema(mysqlPool);
|
package/dist/boot/web-admin.js
CHANGED
|
@@ -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 {
|
|
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"}: ${
|
|
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
|
})();
|