@sema-agent/server 7.140.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 +505 -0
- package/README.md +1 -1
- package/README.zh-CN.md +1 -1
- package/USAGE.md +142 -25
- package/dist/approval-ask-audit-store.d.ts +54 -38
- package/dist/approval-ask-audit-store.js +58 -39
- package/dist/approval-batch-census.d.ts +27 -0
- package/dist/approval-batch-census.js +27 -0
- package/dist/approval-card.d.ts +39 -24
- package/dist/approval-card.js +6 -3
- 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/approval.d.ts +15 -0
- package/dist/approval.js +10 -0
- package/dist/audit.d.ts +4 -2
- package/dist/audit.js +2 -2
- 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 +11 -0
- package/dist/boot/device-lane.js +16 -0
- package/dist/boot/engine-lease.d.ts +24 -3
- package/dist/boot/engine-lease.js +9 -2
- package/dist/boot/execution-env.d.ts +24 -4
- package/dist/boot/execution-env.js +34 -27
- package/dist/boot/execution-lane.js +2 -1
- package/dist/boot/exit-boundary.js +5 -4
- package/dist/boot/memory-boundary.d.ts +2 -2
- package/dist/boot/memory-consolidation.d.ts +1 -1
- package/dist/boot/memory-consolidation.js +3 -2
- 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.d.ts +2 -2
- package/dist/boot/reapers.js +4 -3
- package/dist/boot/resolve-spec.js +18 -6
- 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.d.ts +1 -1
- package/dist/boot/session-faces.js +8 -6
- package/dist/boot/shutdown.js +8 -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 +11 -7
- package/dist/boot/stage-06-runners.d.ts +1 -3
- package/dist/boot/stage-06-runners.js +3 -2
- package/dist/boot/stage-07-capability-layer.d.ts +1 -2
- package/dist/boot/stage-07-capability-layer.js +10 -11
- package/dist/boot/stage-08-reapers.d.ts +1 -2
- package/dist/boot/stage-08-reapers.js +3 -2
- package/dist/boot/stage-09-leader.d.ts +1 -2
- package/dist/boot/stage-10-http-server.d.ts +1 -2
- package/dist/boot/stage-10-http-server.js +6 -4
- package/dist/boot/stores.js +13 -6
- package/dist/boot/web-admin.js +18 -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/capabilities/scenarios.d.ts +1 -1
- package/dist/capability-facts.d.ts +33 -0
- package/dist/capability-facts.js +32 -0
- package/dist/card-void.d.ts +38 -0
- package/dist/card-void.js +23 -0
- package/dist/config-catalog.js +12 -8
- package/dist/config-provider.d.ts +13 -13
- package/dist/config-provider.js +19 -33
- package/dist/config-types.d.ts +39 -10
- package/dist/config.d.ts +6 -0
- package/dist/config.js +72 -49
- package/dist/delegated-session-owner.d.ts +21 -19
- package/dist/delegated-session-owner.js +1 -1
- package/dist/device-store.d.ts +7 -0
- package/dist/device-store.js +3 -0
- package/dist/execution-config-root.d.ts +22 -0
- package/dist/execution-config-root.js +35 -0
- package/dist/execution-lane-caps.d.ts +50 -2
- package/dist/execution-lane-caps.js +90 -13
- package/dist/execution-placement.d.ts +3 -0
- package/dist/execution-placement.js +7 -0
- package/dist/fleet/drain-entry.d.ts +3 -0
- 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/hosted-posture.d.ts +8 -0
- package/dist/hosted-posture.js +4 -0
- package/dist/http/admission.js +3 -3
- package/dist/http/caller-trust.d.ts +3 -2
- package/dist/http/caller-trust.js +2 -1
- package/dist/http/dispatch.js +8 -2
- package/dist/http/execution-context.d.ts +2 -2
- package/dist/http/idempotency.d.ts +1 -1
- package/dist/http/live-frame.d.ts +24 -0
- package/dist/http/live-frame.js +16 -0
- package/dist/http/principal-gate.d.ts +3 -1
- package/dist/http/principal-gate.js +17 -8
- package/dist/http/resume-legs.js +42 -29
- package/dist/http/route-table.js +4 -0
- package/dist/http/routes/approvals-assistant.js +1 -0
- package/dist/http/routes/attachments.js +18 -0
- package/dist/http/routes/capabilities.js +10 -6
- package/dist/http/routes/diagnostics.d.ts +0 -19
- package/dist/http/routes/diagnostics.js +16 -2
- package/dist/http/routes/memory-bundle.d.ts +2 -2
- package/dist/http/routes/memory-bundle.js +1 -1
- package/dist/http/routes/memory-compliance.js +1 -1
- package/dist/http/routes/memory-policy.js +27 -7
- package/dist/http/routes/run-permission-mode.d.ts +75 -0
- package/dist/http/routes/run-permission-mode.js +170 -0
- 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/session-sync.d.ts +3 -6
- package/dist/http/routes/session-sync.js +7 -2
- package/dist/http/routes/sessions-list.d.ts +2 -1
- package/dist/http/routes/sessions.js +5 -4
- package/dist/http/routes/tasks.js +70 -71
- package/dist/http/run-read-face.d.ts +7 -0
- package/dist/http/run-read-face.js +10 -4
- package/dist/http/send.d.ts +6 -1
- package/dist/http/send.js +10 -3
- package/dist/http/server.d.ts +20 -7
- package/dist/http/server.js +2 -4
- package/dist/http/sse-log.d.ts +3 -8
- package/dist/http/stored-body-replay.d.ts +3 -3
- package/dist/http/stored-body-replay.js +3 -1
- 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/instruction-source-notice.d.ts +7 -0
- package/dist/instruction-source-notice.js +6 -6
- package/dist/mcp-assertion-header.d.ts +4 -0
- package/dist/mcp-assertion-header.js +5 -0
- package/dist/memory-incident-sink.d.ts +19 -6
- package/dist/memory-incident-sink.js +8 -4
- package/dist/memory-posture.d.ts +1 -1
- package/dist/memory-scope.d.ts +4 -4
- package/dist/memory-scope.js +1 -1
- package/dist/memory-sync-client.d.ts +35 -23
- package/dist/memory-sync-client.js +122 -52
- 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 +57 -12
- package/dist/observability/fail-open.js +50 -9
- package/dist/observability/metrics.js +0 -1
- package/dist/observability/run-terminal.d.ts +93 -31
- package/dist/observability/run-terminal.js +175 -171
- package/dist/observability/secret-env-scrub.d.ts +20 -1
- package/dist/observability/secret-env-scrub.js +14 -0
- package/dist/orchestration/workflow-completion-inbox.d.ts +5 -2
- package/dist/orchestration/workflow-completion-inbox.js +13 -5
- package/dist/orchestration/workflow-notify-journal.d.ts +5 -3
- package/dist/orchestration/workflow-notify-journal.js +2 -1
- package/dist/permission-mode-admission.d.ts +68 -0
- package/dist/permission-mode-admission.js +23 -0
- package/dist/permission-rule-list.d.ts +55 -6
- package/dist/permission-rule-list.js +52 -5
- 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/caching-session-store.d.ts +6 -0
- package/dist/plugins/caching-session-store.js +3 -0
- package/dist/plugins/checkpoint-store-sql.d.ts +65 -17
- package/dist/plugins/checkpoint-store-sql.js +74 -3
- package/dist/plugins/device-store-sql.d.ts +5 -2
- package/dist/plugins/device-store-sql.js +4 -1
- package/dist/plugins/execution-placement-sql.d.ts +11 -1
- package/dist/plugins/execution-placement-sql.js +12 -1
- package/dist/plugins/file-run-store.d.ts +7 -2
- package/dist/plugins/file-run-store.js +12 -2
- package/dist/plugins/fork-routing-session-store.d.ts +10 -32
- package/dist/plugins/fork-routing-session-store.js +2 -61
- package/dist/plugins/k8s-exec-protocol.d.ts +4 -1
- package/dist/plugins/k8s-exec-protocol.js +6 -1
- package/dist/plugins/local-checkpoint-store.d.ts +10 -1
- package/dist/plugins/local-checkpoint-store.js +22 -0
- package/dist/plugins/local-session-store.d.ts +260 -39
- package/dist/plugins/local-session-store.js +582 -57
- package/dist/plugins/local-session-window.d.ts +17 -3
- package/dist/plugins/local-session-window.js +7 -13
- 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 +7 -2
- package/dist/plugins/memory-run-store.js +12 -2
- package/dist/plugins/one-time-migrations.d.ts +68 -2
- package/dist/plugins/one-time-migrations.js +120 -4
- package/dist/plugins/pg-pool.js +3 -2
- package/dist/plugins/pg-session-storage.d.ts +2 -0
- package/dist/plugins/pg-session-storage.js +3 -2
- package/dist/plugins/remote-env-e2b.d.ts +47 -7
- package/dist/plugins/remote-env-e2b.js +242 -46
- package/dist/plugins/remote-env-k8s.d.ts +51 -6
- package/dist/plugins/remote-env-k8s.js +234 -44
- package/dist/plugins/remote-env-local-docker.d.ts +40 -14
- package/dist/plugins/remote-env-local-docker.js +127 -33
- package/dist/plugins/run-store-sql.d.ts +11 -3
- package/dist/plugins/run-store-sql.js +13 -4
- package/dist/plugins/sandbox-read-floor.d.ts +273 -0
- package/dist/plugins/sandbox-read-floor.js +608 -0
- package/dist/plugins/session-ownership.d.ts +2 -1
- package/dist/plugins/session-placement.d.ts +17 -4
- package/dist/plugins/session-placement.js +2 -1
- package/dist/plugins/session-store.d.ts +18 -20
- package/dist/plugins/session-store.js +4 -12
- package/dist/plugins/store-backend.d.ts +41 -7
- package/dist/plugins/store-backend.js +22 -4
- package/dist/plugins/store-contracts.d.ts +35 -3
- 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/tidb-pool.js +2 -1
- package/dist/plugins/tidb-session-store.d.ts +4 -1
- package/dist/plugins/tidb-session-store.js +3 -2
- 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-cancel-context.d.ts +34 -0
- package/dist/run-cancel-context.js +7 -0
- package/dist/run-local.js +2 -8
- package/dist/runs.d.ts +39 -12
- package/dist/runs.js +69 -55
- 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 +11 -2
- package/dist/security.js +8 -0
- package/dist/server-secret-env.d.ts +2 -1
- package/dist/server-secret-env.js +2 -4
- package/dist/session-error-wire.d.ts +46 -4
- package/dist/session-error-wire.js +23 -0
- package/dist/session-incarnation.d.ts +9 -3
- package/dist/session-sync-kernel.d.ts +42 -1
- package/dist/session-sync-kernel.js +17 -0
- package/dist/session-sync.js +16 -4
- package/dist/sql-engine-coordinates.d.ts +49 -0
- package/dist/sql-engine-coordinates.js +27 -0
- package/dist/standing-answer-grant.d.ts +31 -2
- package/dist/standing-answer-grant.js +14 -2
- package/dist/store-posture.d.ts +1 -1
- package/dist/task-a2a.d.ts +1 -1
- package/dist/task-mcp.d.ts +1 -1
- package/dist/task-settings.d.ts +62 -27
- package/dist/task-settings.js +105 -29
- package/dist/terminal.d.ts +97 -20
- package/dist/terminal.js +107 -18
- package/dist/tool-approval.d.ts +4 -3
- package/dist/tool-approval.js +12 -14
- package/dist/trace/core-keyset-guard.d.ts +196 -2
- 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 +9 -1
- package/dist/trace/exit-seat.js +1 -0
- package/dist/trace/ledger-sink.d.ts +8 -4
- package/dist/trace/ledger-sink.js +2 -2
- package/dist/trace/model-segment.d.ts +2 -2
- package/dist/trace/project.d.ts +18 -1
- package/dist/trace/project.js +16 -0
- package/dist/trace/redact.js +323 -90
- package/dist/trace/self-minted-wire.d.ts +419 -4
- package/dist/trace/self-minted-wire.js +145 -0
- package/dist/trace/wire-projection-faces.d.ts +1 -1
- package/dist/trace/wire-projection-faces.js +1 -1
- package/dist/verifier-pause-card.d.ts +8 -0
- package/dist/verifier-pause-card.js +19 -0
- package/dist/web-admin-client/apply-effective.d.ts +5 -7
- package/dist/web-admin-client/apply-effective.js +22 -2
- package/dist/web-admin-client/candidate-gate.d.ts +1 -1
- package/dist/web-admin-client/effective-keys.js +2 -0
- package/dist/web-admin-client/read-warnings.d.ts +2 -2
- package/dist/web-admin-client/types.d.ts +4 -0
- package/docs/DEVICE-EXECUTOR-PROTOCOL.md +3 -2
- package/package.json +2 -2
- package/wire-changes/server@7.141.0.json +367 -0
- 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
|
}),
|
|
@@ -16,7 +16,7 @@ import type { Logger } from "../observability/logger.js";
|
|
|
16
16
|
import type { Metrics } from "../observability/metrics.js";
|
|
17
17
|
import type { WorkflowCompletionInbox } from "../orchestration/workflow-completion-inbox.js";
|
|
18
18
|
import { PlanCacheProbe } from "../plan-cache-probe.js";
|
|
19
|
-
import type
|
|
19
|
+
import { type CheckpointStoreFull, type StoreBackend, type ToolResultStoreFull } from "../plugins/store-backend.js";
|
|
20
20
|
import type { createSessionStore } from "../plugins/session-store.js";
|
|
21
21
|
import type { TaskAttachmentStore } from "../plugins/task-attachment-store.js";
|
|
22
22
|
import type { FileHistoryErasureFace } from "../file-history-capture.js";
|
|
@@ -2,6 +2,7 @@ import { buildRewindHandles, buildSessionAudit, buildSessionAuditLocal, buildSes
|
|
|
2
2
|
import { makeDegenerateInstrument } from "../degenerate-instrument.js";
|
|
3
3
|
import { PlanCacheProbe } from "../plan-cache-probe.js";
|
|
4
4
|
import { purgeScratchpadDir } from "../env-facts.js";
|
|
5
|
+
import { localSessionRowsOf } from "../plugins/store-backend.js";
|
|
5
6
|
import { setLeafAdvanceListener } from "../session-leaf-bus.js";
|
|
6
7
|
import { SessionWatchRegistry, posIntEnv } from "../session-watch.js";
|
|
7
8
|
import { defaultTaskRegistry, peerSessionBoxHandle } from "@sema-agent/core";
|
|
@@ -10,21 +11,22 @@ import { probeSessionChildren, retireSessionChildren, sessionChildrenScope, Sess
|
|
|
10
11
|
import { SessionActiveRunError } from "../execution-placement.js";
|
|
11
12
|
import { headReadOf, redactIncarnations } from "../session-incarnation.js";
|
|
12
13
|
import { recordFailOpen } from "../observability/fail-open.js";
|
|
14
|
+
import { seatText } from "../trace/exit-seat.js";
|
|
13
15
|
export function createSessionFaces(ctx) {
|
|
14
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;
|
|
15
17
|
const mysqlPool = backend?.mysqlPool();
|
|
16
18
|
const auditPgPool = backend?.pgPool();
|
|
17
|
-
const
|
|
19
|
+
const auditLocalRows = localSessionRowsOf(backend);
|
|
18
20
|
const ownerAware = sessionStore;
|
|
19
21
|
const headOf = headReadOf(sessionStore);
|
|
20
|
-
const sessionAudit = mysqlPool || auditPgPool ||
|
|
22
|
+
const sessionAudit = mysqlPool || auditPgPool || auditLocalRows
|
|
21
23
|
? async (sessionId, opts) => {
|
|
22
24
|
const handles = opts !== undefined && resumeAnchorStore !== undefined ? buildRewindHandles(await resumeAnchorStore.listBySession(sessionId), opts.reader) : undefined;
|
|
23
25
|
const audit = mysqlPool
|
|
24
26
|
? await buildSessionAudit(mysqlPool, sessionId, handles)
|
|
25
27
|
: auditPgPool
|
|
26
28
|
? await buildSessionAuditPg(auditPgPool, sessionId, handles)
|
|
27
|
-
: await buildSessionAuditLocal(
|
|
29
|
+
: await buildSessionAuditLocal(auditLocalRows, sessionId, handles);
|
|
28
30
|
if (!audit)
|
|
29
31
|
return undefined;
|
|
30
32
|
const [head, placement] = await Promise.all([headOf?.(sessionId), opts !== undefined ? ownerAware.placementOf?.(sessionId) : undefined]);
|
|
@@ -105,7 +107,7 @@ export function createSessionFaces(ctx) {
|
|
|
105
107
|
}
|
|
106
108
|
}
|
|
107
109
|
if (workflowCompletionInbox)
|
|
108
|
-
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)) }));
|
|
109
111
|
const peerBox = mailboxStore !== undefined && mailboxRecipientLifecycle !== undefined
|
|
110
112
|
? { store: mailboxStore, lifecycle: mailboxRecipientLifecycle, scope: owner ?? "default", handle: peerSessionBoxHandle(sessionId) }
|
|
111
113
|
: undefined;
|
|
@@ -117,7 +119,7 @@ export function createSessionFaces(ctx) {
|
|
|
117
119
|
await reapSessionBackgroundHard(sessionId, owner ?? "default", { includeRetained: false, reason: "session_deleted" }, logger);
|
|
118
120
|
}
|
|
119
121
|
catch (err) {
|
|
120
|
-
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)) });
|
|
121
123
|
}
|
|
122
124
|
if (peerBox !== undefined)
|
|
123
125
|
await peerBox.store.drop(peerBox.scope, peerBox.handle);
|
|
@@ -137,7 +139,7 @@ export function createSessionFaces(ctx) {
|
|
|
137
139
|
logger.warn("workspace_space_reclaim_failed", {
|
|
138
140
|
sessionId,
|
|
139
141
|
stage: "seat_threw",
|
|
140
|
-
error: redactIncarnations(String(err)),
|
|
142
|
+
error: seatText("operator-log-text", redactIncarnations(String(err))),
|
|
141
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",
|
|
142
144
|
});
|
|
143
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) {
|
|
@@ -74,6 +75,7 @@ export function installShutdownHandlers(ctx) {
|
|
|
74
75
|
let closingAt = 0;
|
|
75
76
|
let parentWatch;
|
|
76
77
|
let engineLease;
|
|
78
|
+
let leaseFactsReader;
|
|
77
79
|
const hardShutdown = () => {
|
|
78
80
|
if (closing)
|
|
79
81
|
return;
|
|
@@ -90,7 +92,7 @@ export function installShutdownHandlers(ctx) {
|
|
|
90
92
|
for (const p of uncommittedParks)
|
|
91
93
|
logger.warn("approval_park_uncommitted_at_shutdown", { approvalId: p.approvalId, taskId: p.taskId });
|
|
92
94
|
})
|
|
93
|
-
.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)) }));
|
|
94
96
|
clearInterval(reaper);
|
|
95
97
|
clearInterval(fleetReconcile.timer);
|
|
96
98
|
const retentionTeardown = retentionLane === undefined
|
|
@@ -106,7 +108,7 @@ export function installShutdownHandlers(ctx) {
|
|
|
106
108
|
engineLease?.stop();
|
|
107
109
|
storeLiveProbe?.stop();
|
|
108
110
|
servingLease?.stop();
|
|
109
|
-
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)) }));
|
|
110
112
|
webAdmin?.stopRefreshLoop();
|
|
111
113
|
otelExporter?.stop();
|
|
112
114
|
breakerState?.stop();
|
|
@@ -280,6 +282,8 @@ export function installShutdownHandlers(ctx) {
|
|
|
280
282
|
: {}),
|
|
281
283
|
log: (event, fields) => logger.info(event, fields),
|
|
282
284
|
});
|
|
285
|
+
leaseFactsReader = () => engineLease?.facts;
|
|
286
|
+
drainState.engineLease = leaseFactsReader;
|
|
283
287
|
}
|
|
284
288
|
let disposed = false;
|
|
285
289
|
return {
|
|
@@ -302,6 +306,8 @@ export function installShutdownHandlers(ctx) {
|
|
|
302
306
|
engineLease?.stop();
|
|
303
307
|
if (drainState.enter === enterByRequest)
|
|
304
308
|
drainState.enter = undefined;
|
|
309
|
+
if (leaseFactsReader !== undefined && drainState.engineLease === leaseFactsReader)
|
|
310
|
+
drainState.engineLease = undefined;
|
|
305
311
|
},
|
|
306
312
|
};
|
|
307
313
|
}
|
|
@@ -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;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { assembleDeploymentMods } from "./deployment-mods.js";
|
|
2
2
|
import { isBrandedDeployment } from "../capabilities/brand-identity.js";
|
|
3
|
-
import { assertDeviceLaneWired, createDeviceLane } from "./device-lane.js";
|
|
3
|
+
import { assertDeviceLaneWired, createDeviceLane, noteDeviceRelayBindings } from "./device-lane.js";
|
|
4
4
|
import { assertWorkspaceSpaceReadable, createExecutionEnv } from "./execution-env.js";
|
|
5
5
|
import { headReadOf } from "../session-incarnation.js";
|
|
6
6
|
import * as facts from "../capability-facts.js";
|
|
@@ -13,16 +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
|
+
if (deviceLane !== undefined && config.remoteExec?.provider === "device")
|
|
19
|
+
await noteDeviceRelayBindings(config.remoteExec.relay, deviceLane.store, logger);
|
|
18
20
|
assertWorkspaceSpaceReadable(facts.workspaceSpace(config), { headOf, spaceCommits }, facts.workspaceCache(config), sessionStoreLabelOf(config.sessionBackend, backend?.kind));
|
|
19
21
|
if (sandboxSecretSeatGate !== undefined)
|
|
20
22
|
await sandboxSecretSeatGate();
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
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] });
|
|
26
30
|
}
|
|
27
31
|
if (config.toolTrace)
|
|
28
32
|
logger.info("tool_trace_enabled", {});
|
|
@@ -7,7 +7,6 @@
|
|
|
7
7
|
* 🔴 `runStore` / `parkedAskRedeem` 经 `late-binds.ts` 的晚绑 cell 读(原文同作用域前向引用/晚绑 holder)。
|
|
8
8
|
*/
|
|
9
9
|
import { Runner } from "@sema-agent/core";
|
|
10
|
-
import { ForkRoutingSessionStore } from "../plugins/fork-routing-session-store.js";
|
|
11
10
|
import type { runStage05 } from "./stage-05-execution-env.js";
|
|
12
11
|
export declare function runStage06(ctx: Awaited<ReturnType<typeof runStage05>>): Promise<{
|
|
13
12
|
approvalAskAudit: import("../approval-ask-audit-store.js").FileApprovalAskAuditStore | undefined;
|
|
@@ -44,7 +43,6 @@ export declare function runStage06(ctx: Awaited<ReturnType<typeof runStage05>>):
|
|
|
44
43
|
sqlWorkflowRunStore: import("@sema-agent/core").WorkflowRunStore | undefined;
|
|
45
44
|
streamApprovalGate: import("../tool-approval.js").StreamApprovalGate<import("../approval-gate-currency.js").GateCurrencyStore>;
|
|
46
45
|
subRunner: Runner;
|
|
47
|
-
subRunnerSessions: ForkRoutingSessionStore;
|
|
48
46
|
subagentSteerRegistry: import("../orchestration/subagent-steer.js").SubagentSteerRegistry;
|
|
49
47
|
toolApproval: import("../tool-approval.js").ToolApprovalCoordinator | undefined;
|
|
50
48
|
workflowAgentRegistry: import("../orchestration/workflow-agent-steer.js").WorkflowAgentRegistry | undefined;
|
|
@@ -73,7 +71,7 @@ export declare function runStage06(ctx: Awaited<ReturnType<typeof runStage05>>):
|
|
|
73
71
|
lspManager: import("@sema-agent/core").NodeLspManager | import("../lsp/manager.js").E2bLspManager | undefined;
|
|
74
72
|
spaceReclaimer: import("../workspace-space.js").SpaceReclaimer | undefined;
|
|
75
73
|
sandboxPodReaper: import("../plugins/k8s-pod-reaper.js").SandboxPodReaper | undefined;
|
|
76
|
-
sandboxGitPlane: import("../sandbox-git-plane.js").SandboxGitPlane;
|
|
74
|
+
sandboxGitPlane: () => import("../sandbox-git-plane.js").SandboxGitPlane;
|
|
77
75
|
perSessionCwd: Map<string, string>;
|
|
78
76
|
perTaskImage: import("../per-task-image.js").PerTaskImageRegistry;
|
|
79
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 }),
|
|
@@ -230,6 +231,6 @@ export async function runStage06(ctx) {
|
|
|
230
231
|
onError: runnerDeps.onError ? runnerDeps.onError : undefined,
|
|
231
232
|
};
|
|
232
233
|
const subRunner = new Runner(subRunnerDeps);
|
|
233
|
-
return { ...ctx, approvalAskAudit, approvalExemptionStore, centerRuntimeCapsResolver, checkpointStore, checkpointCtxSealing, parkCommits, durableEnabled, elicitation, fleetBus, governanceSeams, handslessRunner, hookAgent, hookAgentRunner, hookLlm, mcpRevocations, memoryConsolidationFaces, memoryOptOutGrantStore, orgMemoryAdmission, outcomeSink, principalCaps, question, retentionExecutor, retentionLaneStore, runner, runnerDeps, runtimeCapsPeekResolver, sendFileLedger, sendUserFileEmitter, sendUserFileToolSpec, sessionTitler, sharedMemoryStore, sqlWorkflowRunStore, streamApprovalGate, subRunner,
|
|
234
|
+
return { ...ctx, approvalAskAudit, approvalExemptionStore, centerRuntimeCapsResolver, checkpointStore, checkpointCtxSealing, parkCommits, durableEnabled, elicitation, fleetBus, governanceSeams, handslessRunner, hookAgent, hookAgentRunner, hookLlm, mcpRevocations, memoryConsolidationFaces, memoryOptOutGrantStore, orgMemoryAdmission, outcomeSink, principalCaps, question, retentionExecutor, retentionLaneStore, runner, runnerDeps, runtimeCapsPeekResolver, sendFileLedger, sendUserFileEmitter, sendUserFileToolSpec, sessionTitler, sharedMemoryStore, sqlWorkflowRunStore, streamApprovalGate, subRunner, subagentSteerRegistry, toolApproval, workflowAgentRegistry, workflowAgentSessionIndex, workflowCompletionInbox, workflowJournalStore, workflowModelAllowlistSnapshot, workflowParkDecisions, workflowNotifyGate, workflowNotifyJournal, workflowRecoverOpts, workflowRunStore, workflowsCapable, orgDeliveryGate };
|
|
234
235
|
}
|
|
235
236
|
//# sourceMappingURL=stage-06-runners.js.map
|
|
@@ -60,7 +60,6 @@ export declare function runStage07(ctx: Awaited<ReturnType<typeof runStage06>>):
|
|
|
60
60
|
sqlWorkflowRunStore: import("@sema-agent/core").WorkflowRunStore | undefined;
|
|
61
61
|
streamApprovalGate: import("../tool-approval.js").StreamApprovalGate<import("../approval-gate-currency.js").GateCurrencyStore>;
|
|
62
62
|
subRunner: import("@sema-agent/core").Runner;
|
|
63
|
-
subRunnerSessions: import("../plugins/fork-routing-session-store.js").ForkRoutingSessionStore;
|
|
64
63
|
subagentSteerRegistry: import("../orchestration/subagent-steer.js").SubagentSteerRegistry;
|
|
65
64
|
toolApproval: import("../tool-approval.js").ToolApprovalCoordinator | undefined;
|
|
66
65
|
workflowAgentRegistry: import("../orchestration/workflow-agent-steer.js").WorkflowAgentRegistry | undefined;
|
|
@@ -89,7 +88,7 @@ export declare function runStage07(ctx: Awaited<ReturnType<typeof runStage06>>):
|
|
|
89
88
|
lspManager: import("@sema-agent/core").NodeLspManager | import("../lsp/manager.js").E2bLspManager | undefined;
|
|
90
89
|
spaceReclaimer: import("../workspace-space.js").SpaceReclaimer | undefined;
|
|
91
90
|
sandboxPodReaper: import("../plugins/k8s-pod-reaper.js").SandboxPodReaper | undefined;
|
|
92
|
-
sandboxGitPlane: import("../sandbox-git-plane.js").SandboxGitPlane;
|
|
91
|
+
sandboxGitPlane: () => import("../sandbox-git-plane.js").SandboxGitPlane;
|
|
93
92
|
perSessionCwd: Map<string, string>;
|
|
94
93
|
perTaskImage: import("../per-task-image.js").PerTaskImageRegistry;
|
|
95
94
|
sendUserFileTaskEnvs: import("../capabilities/sandbox-file-send.js").TaskEnvRegistry | undefined;
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { DEFAULT_MODEL_REF } from "../model-select.js";
|
|
2
|
-
import { probeSearchBackend, uuidv7 } from "@sema-agent/core";
|
|
2
|
+
import { probeSearchBackend, resolveSubagentTranscriptTier, uuidv7 } from "@sema-agent/core";
|
|
3
3
|
import { selectEnvironmentTool } from "../capabilities/select-environment-tool.js";
|
|
4
4
|
import { subagentSendUserFileExtraTools } from "../capabilities/send-user-file-tool.js";
|
|
5
5
|
import { parseCapEnv, parseNumOrFailNonNegative } from "../config.js";
|
|
6
|
-
import {
|
|
6
|
+
import { attestChildSessionDurable } from "../plugins/session-store.js";
|
|
7
7
|
import { webSearchConfigFromEnv, createWebSearchBackend, shouldProbeWebSearchOnBoot } from "../plugins/web-search.js";
|
|
8
8
|
import { createAuthorizer } from "../security.js";
|
|
9
|
-
import { buildForceDurableGateInertNotice, buildNoResponderBootWarns, gateIntentUnserviceableReason, singleUserAutoAcceptBaselineApplies } from "../approval.js";
|
|
9
|
+
import { buildForceDurableGateInertNotice, buildNoResponderBootWarns, buildSingleUserDefaultPostureNotice, gateIntentUnserviceableReason, singleUserAutoAcceptBaselineApplies } from "../approval.js";
|
|
10
10
|
import { executionLaneOf, laneWiresExecutionEnv } from "../execution-lane-caps.js";
|
|
11
11
|
import { loadDeploymentSkills } from "../capabilities/skills.js";
|
|
12
12
|
import { createRepoClient } from "../capabilities/repo-tools.js";
|
|
@@ -28,8 +28,9 @@ 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
|
-
const { approvalAskAudit, approvalExemptionStore, backend, backgroundAgentStore, brain, checkpointStore, config, webAdmin, counterDegradeHook, peerDesk, durableEnabled, instanceId, localRoot, logger, question, runner, runnerDeps, sendUserFileToolSpec, sessionEnvSelection, sessionStore, subRunner,
|
|
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);
|
|
34
35
|
const runStore = backend ? backend.run() : undefined;
|
|
35
36
|
bindRunStore(runStore);
|
|
@@ -126,10 +127,8 @@ export async function runStage07(ctx) {
|
|
|
126
127
|
}))
|
|
127
128
|
logger.warn(w.event, w.fields);
|
|
128
129
|
if (singleUserAutoAcceptBaselineApplies(config)) {
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
tighten: "APPROVAL_REQUIRE / AUTONOMY / commandPolicy (re-surfaces + gates specific surfaces)",
|
|
132
|
-
});
|
|
130
|
+
const posture = buildSingleUserDefaultPostureNotice();
|
|
131
|
+
logger.info(posture.event, posture.fields);
|
|
133
132
|
}
|
|
134
133
|
if (config.directDoorActive)
|
|
135
134
|
logger.info("direct_door_active", { iss: config.principalJwtIss, aud: config.principalJwtAud, operators: config.operatorPrincipals.length });
|
|
@@ -167,10 +166,10 @@ export async function runStage07(ctx) {
|
|
|
167
166
|
else
|
|
168
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." });
|
|
169
168
|
})
|
|
170
|
-
.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)) }));
|
|
171
170
|
}
|
|
172
|
-
const ensureChildSessionDurable = checkpointStore &&
|
|
173
|
-
? (sessionId, root) =>
|
|
171
|
+
const ensureChildSessionDurable = checkpointStore && resolveSubagentTranscriptTier(backgroundAgentStore !== undefined, sessionStore) === "full"
|
|
172
|
+
? (sessionId, root) => attestChildSessionDurable(sessionStore, sessionId, root, logger)
|
|
174
173
|
: undefined;
|
|
175
174
|
const webFetchSummarize = createWebFetchSummarizeLane({ brain, config, getKeyResolver: () => webAdmin.getKeyResolver(), logger });
|
|
176
175
|
const scenarioDeps = {
|
|
@@ -73,7 +73,6 @@ export declare function runStage08(ctx: Awaited<ReturnType<typeof runStage07>>):
|
|
|
73
73
|
sqlWorkflowRunStore: import("@sema-agent/core").WorkflowRunStore | undefined;
|
|
74
74
|
streamApprovalGate: import("../tool-approval.js").StreamApprovalGate<import("../approval-gate-currency.js").GateCurrencyStore>;
|
|
75
75
|
subRunner: Runner;
|
|
76
|
-
subRunnerSessions: import("../plugins/fork-routing-session-store.js").ForkRoutingSessionStore;
|
|
77
76
|
subagentSteerRegistry: import("../orchestration/subagent-steer.js").SubagentSteerRegistry;
|
|
78
77
|
toolApproval: import("../tool-approval.js").ToolApprovalCoordinator | undefined;
|
|
79
78
|
workflowAgentRegistry: import("../orchestration/workflow-agent-steer.js").WorkflowAgentRegistry | undefined;
|
|
@@ -102,7 +101,7 @@ export declare function runStage08(ctx: Awaited<ReturnType<typeof runStage07>>):
|
|
|
102
101
|
lspManager: import("@sema-agent/core").NodeLspManager | import("../lsp/manager.js").E2bLspManager | undefined;
|
|
103
102
|
spaceReclaimer: import("../workspace-space.js").SpaceReclaimer | undefined;
|
|
104
103
|
sandboxPodReaper: import("../plugins/k8s-pod-reaper.js").SandboxPodReaper | undefined;
|
|
105
|
-
sandboxGitPlane: import("../sandbox-git-plane.js").SandboxGitPlane;
|
|
104
|
+
sandboxGitPlane: () => import("../sandbox-git-plane.js").SandboxGitPlane;
|
|
106
105
|
perSessionCwd: Map<string, string>;
|
|
107
106
|
perTaskImage: import("../per-task-image.js").PerTaskImageRegistry;
|
|
108
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
|
}
|
|
@@ -97,7 +97,6 @@ export declare function runStage09(ctx: Awaited<ReturnType<typeof runStage08>>):
|
|
|
97
97
|
sqlWorkflowRunStore: import("@sema-agent/core").WorkflowRunStore | undefined;
|
|
98
98
|
streamApprovalGate: import("../tool-approval.js").StreamApprovalGate<import("../approval-gate-currency.js").GateCurrencyStore>;
|
|
99
99
|
subRunner: import("@sema-agent/core").Runner;
|
|
100
|
-
subRunnerSessions: import("../plugins/fork-routing-session-store.js").ForkRoutingSessionStore;
|
|
101
100
|
subagentSteerRegistry: import("../orchestration/subagent-steer.js").SubagentSteerRegistry;
|
|
102
101
|
toolApproval: import("../tool-approval.js").ToolApprovalCoordinator | undefined;
|
|
103
102
|
workflowAgentRegistry: import("../orchestration/workflow-agent-steer.js").WorkflowAgentRegistry | undefined;
|
|
@@ -126,7 +125,7 @@ export declare function runStage09(ctx: Awaited<ReturnType<typeof runStage08>>):
|
|
|
126
125
|
lspManager: import("@sema-agent/core").NodeLspManager | import("../lsp/manager.js").E2bLspManager | undefined;
|
|
127
126
|
spaceReclaimer: import("../workspace-space.js").SpaceReclaimer | undefined;
|
|
128
127
|
sandboxPodReaper: import("../plugins/k8s-pod-reaper.js").SandboxPodReaper | undefined;
|
|
129
|
-
sandboxGitPlane: import("../sandbox-git-plane.js").SandboxGitPlane;
|
|
128
|
+
sandboxGitPlane: () => import("../sandbox-git-plane.js").SandboxGitPlane;
|
|
130
129
|
perSessionCwd: Map<string, string>;
|
|
131
130
|
perTaskImage: import("../per-task-image.js").PerTaskImageRegistry;
|
|
132
131
|
sendUserFileTaskEnvs: import("../capabilities/sandbox-file-send.js").TaskEnvRegistry | undefined;
|
|
@@ -96,7 +96,6 @@ export declare function runStage10(ctx: Awaited<ReturnType<typeof runStage09>>):
|
|
|
96
96
|
sqlWorkflowRunStore: import("@sema-agent/core").WorkflowRunStore | undefined;
|
|
97
97
|
streamApprovalGate: import("../tool-approval.js").StreamApprovalGate<import("../approval-gate-currency.js").GateCurrencyStore>;
|
|
98
98
|
subRunner: import("@sema-agent/core").Runner;
|
|
99
|
-
subRunnerSessions: import("../plugins/fork-routing-session-store.js").ForkRoutingSessionStore;
|
|
100
99
|
subagentSteerRegistry: import("../orchestration/subagent-steer.js").SubagentSteerRegistry;
|
|
101
100
|
toolApproval: import("../tool-approval.js").ToolApprovalCoordinator | undefined;
|
|
102
101
|
workflowAgentRegistry: import("../orchestration/workflow-agent-steer.js").WorkflowAgentRegistry | undefined;
|
|
@@ -125,7 +124,7 @@ export declare function runStage10(ctx: Awaited<ReturnType<typeof runStage09>>):
|
|
|
125
124
|
lspManager: import("@sema-agent/core").NodeLspManager | import("../lsp/manager.js").E2bLspManager | undefined;
|
|
126
125
|
spaceReclaimer: import("../workspace-space.js").SpaceReclaimer | undefined;
|
|
127
126
|
sandboxPodReaper: import("../plugins/k8s-pod-reaper.js").SandboxPodReaper | undefined;
|
|
128
|
-
sandboxGitPlane: import("../sandbox-git-plane.js").SandboxGitPlane;
|
|
127
|
+
sandboxGitPlane: () => import("../sandbox-git-plane.js").SandboxGitPlane;
|
|
129
128
|
perSessionCwd: Map<string, string>;
|
|
130
129
|
perTaskImage: import("../per-task-image.js").PerTaskImageRegistry;
|
|
131
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 = {
|
|
@@ -96,6 +97,7 @@ export async function runStage10(ctx) {
|
|
|
96
97
|
memoryCompliance: memoryComplianceFaces,
|
|
97
98
|
memoryOriginFace: memoryOriginFaces,
|
|
98
99
|
sessionMemoryStatus: sessionMemoryStatusFace,
|
|
100
|
+
memorySyncLeg: memorySyncRunner,
|
|
99
101
|
memoryAutoConsolidationArmed: autoRunOnRecommendationEffective(runnerDeps),
|
|
100
102
|
memoryConsolidationValve: consolidationValve,
|
|
101
103
|
memoryConsolidation: memoryConsolidationFaces,
|
|
@@ -131,7 +133,7 @@ export async function runStage10(ctx) {
|
|
|
131
133
|
classifierModel: () => {
|
|
132
134
|
const route = classifierRouteFor(runnerDeps);
|
|
133
135
|
if (route.fault !== undefined)
|
|
134
|
-
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) });
|
|
135
137
|
return route.id;
|
|
136
138
|
},
|
|
137
139
|
},
|
|
@@ -256,7 +258,7 @@ export async function runStage10(ctx) {
|
|
|
256
258
|
bindHost: bindHost ?? "0.0.0.0/::(all interfaces)",
|
|
257
259
|
...(config.bindHostSource ? { bindHostSource: config.bindHostSource } : {}),
|
|
258
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)." } : {}),
|
|
259
|
-
error: e instanceof Error ? e.message : String(e),
|
|
261
|
+
error: seatText("operator-log-text", e instanceof Error ? e.message : String(e)),
|
|
260
262
|
});
|
|
261
263
|
throw e;
|
|
262
264
|
}
|
|
@@ -266,7 +268,7 @@ export async function runStage10(ctx) {
|
|
|
266
268
|
}
|
|
267
269
|
server.on("error", (e) => {
|
|
268
270
|
logger.error("server_error", {
|
|
269
|
-
error: e.message,
|
|
271
|
+
error: seatText("operator-log-text", e.message),
|
|
270
272
|
...("code" in e ? { code: String(e.code) } : {}),
|
|
271
273
|
});
|
|
272
274
|
});
|
|
@@ -323,7 +325,7 @@ export async function runStage10(ctx) {
|
|
|
323
325
|
void workflowNotifyGate
|
|
324
326
|
.recover(workflowRecoverOpts)
|
|
325
327
|
.then((tally) => logger.info("workflow_notify_recovered", tally))
|
|
326
|
-
.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)) }))
|
|
327
329
|
.finally(() => resolveFleetRecovery());
|
|
328
330
|
}
|
|
329
331
|
else {
|