@sema-agent/server 7.142.0 → 7.144.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 +608 -0
- package/USAGE.md +63 -36
- package/dist/adoption/plan.js +22 -0
- package/dist/approval-ask-audit-store.d.ts +7 -5
- package/dist/approval-ask-audit-store.js +12 -6
- package/dist/approval-ask-machine.d.ts +15 -7
- package/dist/approval-ask-machine.js +10 -4
- package/dist/approval-card.d.ts +155 -39
- package/dist/approval-card.js +111 -31
- package/dist/approval-queue-kind.d.ts +27 -0
- package/dist/approval-queue-kind.js +6 -0
- package/dist/approval-reconciler.d.ts +8 -8
- package/dist/approval-reconciler.js +3 -3
- package/dist/audit.js +4 -2
- package/dist/boot/budget-tracing.d.ts +1 -1
- package/dist/boot/execution-env.js +1 -1
- package/dist/boot/governance-seams.d.ts +26 -41
- package/dist/boot/governance-seams.js +61 -28
- package/dist/boot/late-binds.d.ts +7 -4
- package/dist/boot/late-binds.js +3 -1
- package/dist/boot/leader.js +2 -4
- package/dist/boot/memory-consolidation.d.ts +0 -8
- package/dist/boot/memory-consolidation.js +3 -3
- package/dist/boot/reapers.js +5 -4
- package/dist/boot/resolve-spec.d.ts +1 -1
- package/dist/boot/resolve-spec.js +8 -8
- package/dist/boot/runner-deps.d.ts +14 -6
- package/dist/boot/runner-deps.js +6 -17
- package/dist/boot/shutdown.d.ts +9 -0
- package/dist/boot/shutdown.js +18 -2
- package/dist/boot/stage-01-config.js +2 -0
- package/dist/boot/stage-02-web-admin-pull.js +3 -0
- package/dist/boot/stage-03-store-backend.d.ts +4 -1
- package/dist/boot/stage-03-store-backend.js +1 -2
- package/dist/boot/stage-04-stores.d.ts +5 -2
- package/dist/boot/stage-04-stores.js +3 -5
- package/dist/boot/stage-05-execution-env.d.ts +5 -2
- package/dist/boot/stage-06-runners.d.ts +5 -2
- package/dist/boot/stage-06-runners.js +1 -3
- package/dist/boot/stage-07-capability-layer.d.ts +5 -2
- package/dist/boot/stage-07-capability-layer.js +6 -2
- package/dist/boot/stage-08-reapers.d.ts +5 -2
- package/dist/boot/stage-09-leader.d.ts +5 -2
- package/dist/boot/stage-10-http-server.d.ts +5 -2
- package/dist/boot/stage-10-http-server.js +4 -1
- package/dist/boot/stores.d.ts +5 -2
- package/dist/boot/stores.js +7 -7
- package/dist/boot/web-admin.d.ts +5 -1
- package/dist/boot/web-admin.js +31 -19
- package/dist/capabilities/hands-lane.d.ts +9 -39
- package/dist/capabilities/hands-lane.js +8 -13
- package/dist/capabilities/mcp-probe.d.ts +3 -2
- package/dist/capabilities/scenarios.d.ts +23 -17
- package/dist/capabilities/scenarios.js +2 -2
- package/dist/capabilities/skills.d.ts +1 -17
- package/dist/capabilities/skills.js +0 -8
- package/dist/capability-facts.d.ts +8 -8
- package/dist/capability-facts.js +4 -4
- package/dist/card-void.d.ts +6 -9
- package/dist/config-catalog.js +1 -1
- package/dist/config-d-migration.d.ts +2 -0
- package/dist/config-dir-trust.js +58 -29
- package/dist/config-invariants.d.ts +7 -1
- package/dist/config-invariants.js +7 -0
- package/dist/config-provider.d.ts +10 -0
- package/dist/config-provider.js +15 -4
- package/dist/config-root-migration.d.ts +13 -0
- package/dist/config-root-migration.js +99 -0
- package/dist/config-types.d.ts +5 -5
- package/dist/config.d.ts +4 -3
- package/dist/config.js +1 -1
- package/dist/delegated-session-owner.d.ts +35 -151
- package/dist/delegated-session-owner.js +1 -83
- package/dist/device-ws-protocol.d.ts +1 -0
- package/dist/device-ws-protocol.js +2 -1
- package/dist/entry-mode-clamp-notice.d.ts +1 -1
- package/dist/env-model-table-gate.d.ts +53 -0
- package/dist/env-model-table-gate.js +53 -0
- package/dist/execution-placement.d.ts +7 -4
- package/dist/fleet/fleet-bus.d.ts +28 -52
- package/dist/fleet/fleet-bus.js +35 -100
- package/dist/fleet/fleet-reconciler.d.ts +4 -4
- package/dist/fleet/fleet-reconciler.js +1 -1
- package/dist/fleet/subagent-tail-bus.d.ts +14 -11
- package/dist/fleet/subagent-tail-bus.js +15 -28
- package/dist/hooks/classic-stations.d.ts +3 -1
- package/dist/hooks/classic-stations.js +2 -0
- package/dist/hooks/hook-runner.js +28 -7
- package/dist/host-decision.d.ts +54 -20
- package/dist/host-decision.js +42 -14
- package/dist/http/admission.d.ts +1 -1
- package/dist/http/admission.js +7 -3
- package/dist/http/approval-sweeps.js +11 -8
- package/dist/http/caller-trust.d.ts +1 -1
- package/dist/http/durable-run-leg.js +2 -2
- package/dist/http/engine-refusal.d.ts +16 -0
- package/dist/http/engine-refusal.js +17 -0
- package/dist/http/memory-compliance-failure-reply.d.ts +1 -3
- package/dist/http/memory-compliance-failure-reply.js +4 -6
- package/dist/http/owner-access.d.ts +11 -0
- package/dist/http/owner-access.js +13 -0
- package/dist/http/principal-gate.d.ts +1 -1
- package/dist/http/refusal-body.d.ts +7 -3
- package/dist/http/refusal-body.js +1 -0
- package/dist/http/resume-legs.d.ts +21 -7
- package/dist/http/resume-legs.js +82 -53
- package/dist/http/resume-restatement.d.ts +39 -0
- package/dist/http/resume-restatement.js +25 -0
- package/dist/http/route-ctx.d.ts +35 -10
- package/dist/http/route-ctx.js +1 -1
- package/dist/http/routes/approvals-assistant.d.ts +9 -1
- package/dist/http/routes/approvals-assistant.js +143 -31
- package/dist/http/routes/capabilities.js +11 -2
- package/dist/http/routes/memory-policy.d.ts +2 -2
- package/dist/http/routes/memory-policy.js +1 -1
- package/dist/http/routes/notify-wake.js +23 -25
- package/dist/http/routes/rules.js +48 -13
- package/dist/http/routes/runs.js +9 -8
- package/dist/http/routes/session-memory-sync.d.ts +34 -6
- package/dist/http/routes/session-memory-sync.js +27 -10
- package/dist/http/routes/session-sync.js +13 -20
- package/dist/http/routes/sessions.d.ts +2 -2
- package/dist/http/routes/sessions.js +22 -23
- package/dist/http/routes/tasks.js +27 -49
- package/dist/http/server.d.ts +13 -7
- package/dist/http/server.js +2 -2
- package/dist/http/stored-body-replay.js +15 -4
- package/dist/http/wire-types.d.ts +17 -7
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/dist/lane-home-probe.d.ts +15 -0
- package/dist/lane-home-probe.js +4 -0
- package/dist/leader/leader.js +5 -2
- package/dist/leader/wire.d.ts +7 -1
- package/dist/leader/wire.js +6 -5
- package/dist/leg-facts.d.ts +37 -0
- package/dist/leg-facts.js +15 -0
- package/dist/memory-bundle-engine.d.ts +1 -4
- package/dist/memory-bundle-engine.js +2 -2
- package/dist/memory-operator-faces.d.ts +30 -66
- package/dist/memory-operator-faces.js +17 -88
- package/dist/memory-scope-stores.d.ts +38 -40
- package/dist/memory-scope-stores.js +51 -36
- package/dist/memory-scope.d.ts +0 -9
- package/dist/memory-scope.js +0 -9
- package/dist/memory-sync-client.js +14 -3
- package/dist/memory-sync.d.ts +20 -4
- package/dist/memory-sync.js +23 -4
- package/dist/model-plane-face.d.ts +13 -7
- package/dist/model-plane-face.js +2 -1
- package/dist/observability/corrupt-read-seat.d.ts +5 -9
- package/dist/observability/corrupt-read-seat.js +1 -2
- package/dist/observability/fail-open.d.ts +30 -10
- package/dist/observability/fail-open.js +27 -10
- package/dist/observability/run-terminal.d.ts +1 -1
- package/dist/observability/run-terminal.js +6 -2
- package/dist/orchestration/workflow-completion-inbox.d.ts +5 -19
- package/dist/orchestration/workflow-completion-inbox.js +0 -12
- package/dist/orchestration/workflow-notify-journal.d.ts +3 -2
- package/dist/orchestration/workflow-park-decision.d.ts +8 -3
- package/dist/orchestration/workflow-park-decision.js +5 -3
- package/dist/org-delivery-gate.d.ts +11 -0
- package/dist/org-delivery-gate.js +19 -1
- package/dist/parked-decide.d.ts +13 -9
- package/dist/parked-decide.js +7 -7
- package/dist/parked-revive-surface.d.ts +6 -7
- package/dist/parked-revive-surface.js +1 -1
- package/dist/peer-inbound-face.d.ts +122 -0
- package/dist/peer-inbound-face.js +123 -0
- package/dist/permission-rule-list.d.ts +13 -9
- package/dist/permission-rule-list.js +7 -3
- package/dist/plugins/approval-ask-store-file.js +18 -6
- package/dist/plugins/approval-ask-store-memory.js +8 -6
- package/dist/plugins/approval-ask-store-sql.d.ts +28 -13
- package/dist/plugins/approval-ask-store-sql.js +30 -11
- package/dist/plugins/caching-session-store.d.ts +0 -3
- package/dist/plugins/caching-session-store.js +0 -3
- package/dist/plugins/checkpoint-store-sql.d.ts +45 -38
- package/dist/plugins/checkpoint-store-sql.js +108 -45
- package/dist/plugins/file-history-store-sql.d.ts +24 -18
- package/dist/plugins/file-history-store-sql.js +24 -19
- package/dist/plugins/file-run-store.d.ts +29 -0
- package/dist/plugins/file-run-store.js +97 -8
- package/dist/plugins/fork-routing-session-store.d.ts +8 -1
- package/dist/plugins/fork-routing-session-store.js +6 -0
- package/dist/plugins/imported-layer-root-retirement.d.ts +82 -0
- package/dist/plugins/imported-layer-root-retirement.js +96 -0
- package/dist/plugins/local-checkpoint-store.d.ts +6 -8
- package/dist/plugins/local-checkpoint-store.js +5 -4
- package/dist/plugins/local-session-store.d.ts +69 -30
- package/dist/plugins/local-session-store.js +133 -57
- package/dist/plugins/local-session-window.d.ts +4 -2
- package/dist/plugins/mailbox-recipient-lifecycle.d.ts +9 -31
- package/dist/plugins/mailbox-recipient-lifecycle.js +4 -0
- package/dist/plugins/mailbox-store-sql.d.ts +12 -8
- package/dist/plugins/mailbox-store-sql.js +76 -7
- package/dist/plugins/memory-sync-store-pg.d.ts +15 -0
- package/dist/plugins/memory-sync-store-pg.js +21 -0
- package/dist/plugins/memory-sync-store-tidb.d.ts +2 -0
- package/dist/plugins/memory-sync-store-tidb.js +13 -1
- package/dist/plugins/one-time-migrations.d.ts +44 -14
- package/dist/plugins/one-time-migrations.js +118 -15
- package/dist/plugins/org-delivery-quota-store.d.ts +1 -1
- package/dist/plugins/org-delivery-quota-store.js +2 -12
- package/dist/plugins/park-commit-watch.d.ts +1 -1
- package/dist/plugins/permission-rule-store-file.d.ts +10 -1
- package/dist/plugins/permission-rule-store-file.js +15 -2
- package/dist/plugins/permission-rule-store-sql.d.ts +31 -1
- package/dist/plugins/permission-rule-store-sql.js +35 -2
- package/dist/plugins/pg-session-storage.d.ts +1 -9
- package/dist/plugins/pg-session-storage.js +2 -19
- package/dist/plugins/remote-env-device.d.ts +8 -11
- package/dist/plugins/remote-env-device.js +6 -3
- package/dist/plugins/remote-env-host.d.ts +8 -4
- package/dist/plugins/remote-env-host.js +7 -9
- package/dist/plugins/remote-env-k8s.d.ts +37 -24
- package/dist/plugins/remote-env-k8s.js +50 -17
- package/dist/plugins/remote-shell.js +12 -2
- package/dist/plugins/retention-store-sql.d.ts +2 -2
- package/dist/plugins/sandbox-read-floor.d.ts +5 -7
- package/dist/plugins/sandbox-read-floor.js +2 -7
- package/dist/plugins/schema-consistency.d.ts +5 -1
- package/dist/plugins/session-fork.d.ts +1 -1
- package/dist/plugins/session-ownership.d.ts +9 -0
- package/dist/plugins/session-ownership.js +6 -0
- package/dist/plugins/session-store.d.ts +13 -16
- package/dist/plugins/session-store.js +9 -10
- package/dist/plugins/sql-errors.d.ts +10 -1
- package/dist/plugins/sql-errors.js +13 -0
- package/dist/plugins/sql-json-column.d.ts +24 -2
- package/dist/plugins/sql-json-column.js +38 -3
- package/dist/plugins/store-backend.d.ts +23 -28
- package/dist/plugins/store-backend.js +12 -3
- package/dist/plugins/store-contracts.d.ts +29 -5
- package/dist/plugins/store-contracts.js +4 -1
- package/dist/plugins/task-attachment-store.d.ts +2 -2
- package/dist/plugins/task-attachment-store.js +37 -52
- package/dist/plugins/tidb-session-store.d.ts +2 -14
- package/dist/plugins/tidb-session-store.js +2 -20
- package/dist/plugins/tool-result-store-sql.d.ts +9 -8
- package/dist/plugins/tool-result-store-sql.js +23 -2
- package/dist/plugins/wiring-section-codec.d.ts +32 -0
- package/dist/plugins/wiring-section-codec.js +55 -0
- package/dist/plugins/workspace-fill.d.ts +1 -1
- package/dist/rule-entry-list.d.ts +3 -2
- package/dist/rule-entry-list.js +5 -1
- package/dist/rules-consent.d.ts +28 -5
- package/dist/rules-consent.js +40 -28
- package/dist/run-local.js +11 -6
- package/dist/runs.d.ts +12 -8
- package/dist/runs.js +10 -7
- package/dist/runtime-governance.d.ts +1 -1
- package/dist/security.d.ts +0 -4
- package/dist/server-secret-env.d.ts +4 -0
- package/dist/session-error-wire.d.ts +34 -23
- package/dist/session-error-wire.js +8 -3
- package/dist/session-incarnation.d.ts +3 -3
- package/dist/session-notify-door.d.ts +106 -0
- package/dist/session-notify-door.js +97 -0
- package/dist/session-sync.d.ts +9 -14
- package/dist/session-sync.js +5 -5
- package/dist/session-workspace.d.ts +3 -13
- package/dist/session-workspace.js +0 -9
- package/dist/standing-answer-grant.d.ts +5 -0
- package/dist/standing-answer-grant.js +10 -0
- package/dist/stores-sql/session-policy-store-sql.d.ts +4 -2
- package/dist/stores-sql/session-policy-store-sql.js +3 -13
- package/dist/task-mcp.d.ts +1 -1
- package/dist/task-settings.d.ts +11 -8
- package/dist/task-settings.js +31 -11
- package/dist/tool-approval.d.ts +55 -35
- package/dist/tool-approval.js +112 -74
- package/dist/trace/core-keyset-guard.d.ts +12 -9
- package/dist/trace/engine-notice-wire.d.ts +1 -1
- package/dist/trace/engine-notice-wire.js +4 -2
- package/dist/trace/exit-seat.d.ts +7 -1
- package/dist/trace/exit-seat.js +1 -0
- package/dist/trace/ledger-sink.d.ts +2 -2
- package/dist/trace/ledger-sink.js +12 -4
- package/dist/trace/model-segment.d.ts +74 -25
- package/dist/trace/model-segment.js +141 -32
- package/dist/trace/project.d.ts +15 -6
- package/dist/trace/project.js +12 -4
- package/dist/trace/redact.d.ts +72 -9
- package/dist/trace/redact.js +1509 -471
- package/dist/trace/self-minted-wire.d.ts +598 -47
- package/dist/trace/self-minted-wire.js +190 -20
- 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 +33 -5
- package/dist/verifier-pause-card.js +15 -10
- package/dist/web-admin-client/apply-effective.d.ts +12 -16
- package/dist/web-admin-client/apply-effective.js +90 -10
- package/dist/workspace-space.d.ts +19 -3
- package/dist/workspace-space.js +8 -4
- package/docs/DEVICE-EXECUTOR-PROTOCOL.md +3 -1
- package/package.json +3 -2
- package/wire-changes/server@7.143.0.json +1167 -0
- package/wire-changes/server@7.144.0.json +291 -0
- package/dist/session-records-skipped-notice.d.ts +0 -21
- package/dist/session-records-skipped-notice.js +0 -27
|
@@ -23,8 +23,10 @@ import { createUserInputLedgerAtBoot, writerGoneEvidenceFor } from "../user-inpu
|
|
|
23
23
|
import { createParkedReviveInheritedGate } from "./parked-revive-gate.js";
|
|
24
24
|
import { createParkedReviveSurface } from "../parked-revive-surface.js";
|
|
25
25
|
import { createWebFetchSummarizeLane } from "./webfetch-summarize-lane.js";
|
|
26
|
+
import { assertGovernanceAssemblable } from "./governance-seams.js";
|
|
26
27
|
import { createRunnerDepsOnAsk } from "./runner-deps.js";
|
|
27
|
-
import { bindRateLimiter, bindRunStore } from "./late-binds.js";
|
|
28
|
+
import { bindRateLimiter, bindRunStore, sessionNotifyDoor } from "./late-binds.js";
|
|
29
|
+
import { createBackgroundCompletionRelay } from "../session-notify-door.js";
|
|
28
30
|
import { buildDisplaySafeUrl } from "../trace/redact.js";
|
|
29
31
|
import * as facts from "../capability-facts.js";
|
|
30
32
|
import { WEB_ADMIN_ENV } from "@sema-agent/settings-schema";
|
|
@@ -153,6 +155,7 @@ export async function runStage07(ctx) {
|
|
|
153
155
|
bindRateLimiter(rateLimiter);
|
|
154
156
|
let skills = loadDeploymentSkills(config, logger);
|
|
155
157
|
skills = await webAdmin.applyCenterCapabilities(skills, peerDesk, peerDesk.lease("roster"));
|
|
158
|
+
assertGovernanceAssemblable(config);
|
|
156
159
|
const repoClient = config.gitApiBaseUrl ? createRepoClient(config.gitApiKind, config.gitApiBaseUrl, config.gitApiToken) : undefined;
|
|
157
160
|
const webSearchCfg = webSearchConfigFromEnv();
|
|
158
161
|
const webSearch = webSearchCfg ? createWebSearchBackend(webSearchCfg) : undefined;
|
|
@@ -169,7 +172,7 @@ export async function runStage07(ctx) {
|
|
|
169
172
|
.catch((e) => logger.warn("web_search_probe_failed", { provider: webSearchCfg.provider, error: seatText("operator-log-text", e instanceof Error ? e.message : String(e)) }));
|
|
170
173
|
}
|
|
171
174
|
const ensureChildSessionDurable = checkpointStore && resolveSubagentTranscriptTier(backgroundAgentStore !== undefined, sessionStore) === "full"
|
|
172
|
-
? (sessionId,
|
|
175
|
+
? (sessionId, given) => attestChildSessionDurable(sessionStore, sessionId, given)
|
|
173
176
|
: undefined;
|
|
174
177
|
const webFetchSummarize = createWebFetchSummarizeLane({ brain, config, getKeyResolver: () => webAdmin.getKeyResolver(), logger });
|
|
175
178
|
const scenarioDeps = {
|
|
@@ -181,6 +184,7 @@ export async function runStage07(ctx) {
|
|
|
181
184
|
ensureChildSessionDurable: ensureChildSessionDurable ? ensureChildSessionDurable : undefined,
|
|
182
185
|
taskListStoreFor: taskListLane.storeFor,
|
|
183
186
|
subagentExtraTools: sendUserFileToolSpec ? subagentSendUserFileExtraTools({ spec: sendUserFileToolSpec }) : undefined,
|
|
187
|
+
backgroundCompletionSinkFor: createBackgroundCompletionRelay({ door: () => sessionNotifyDoor, logger }),
|
|
184
188
|
};
|
|
185
189
|
const scenarios = buildScenarios(scenarioDeps);
|
|
186
190
|
const builtinDefaultScenario = scenarios.default;
|
|
@@ -138,14 +138,17 @@ export declare function runStage08(ctx: Awaited<ReturnType<typeof runStage07>>):
|
|
|
138
138
|
sessionMemoryStatusFace: import("../memory-operator-faces.js").SessionMemoryStatusFace | undefined;
|
|
139
139
|
sessionPolicyStore: import("@sema-agent/core").SessionPolicyStore | undefined;
|
|
140
140
|
sideQueryAccounting: import("../budget.js").SideQueryAccounting;
|
|
141
|
-
toolResultStore: import("
|
|
141
|
+
toolResultStore: import("@sema-agent/core").ToolResultStore | undefined;
|
|
142
142
|
tracer: import("@sema-agent/core").TracerHook;
|
|
143
143
|
backend: import("../index.js").StoreBackend | undefined;
|
|
144
144
|
backgroundAgentStore: import("@sema-agent/core").BackgroundAgentStore | undefined;
|
|
145
145
|
breakerState: import("../plugins/breaker-state-sql.js").TiDBBreakerState | import("../plugins/breaker-state-sql.js").PgBreakerState | undefined;
|
|
146
146
|
engineDataRoot: string;
|
|
147
147
|
instanceId: string;
|
|
148
|
-
mailboxRecipientLifecycle:
|
|
148
|
+
mailboxRecipientLifecycle: Readonly<{
|
|
149
|
+
retireRecipient: NonNullable<import("@sema-agent/core").MailboxStore["retireRecipient"]>;
|
|
150
|
+
listRetiredRecipients: NonNullable<import("@sema-agent/core").MailboxStore["listRetiredRecipients"]>;
|
|
151
|
+
}> | undefined;
|
|
149
152
|
mailboxStore: import("@sema-agent/core").MailboxStore | undefined;
|
|
150
153
|
memoryEngine: import("../memory-scope-stores.js").MemoryScopeStores | undefined;
|
|
151
154
|
memoryExportStores: import("../memory-scope-stores.js").MemoryScopeStores | undefined;
|
|
@@ -162,14 +162,17 @@ export declare function runStage09(ctx: Awaited<ReturnType<typeof runStage08>>):
|
|
|
162
162
|
sessionMemoryStatusFace: import("../memory-operator-faces.js").SessionMemoryStatusFace | undefined;
|
|
163
163
|
sessionPolicyStore: import("@sema-agent/core").SessionPolicyStore | undefined;
|
|
164
164
|
sideQueryAccounting: import("../budget.js").SideQueryAccounting;
|
|
165
|
-
toolResultStore: import("
|
|
165
|
+
toolResultStore: import("@sema-agent/core").ToolResultStore | undefined;
|
|
166
166
|
tracer: import("@sema-agent/core").TracerHook;
|
|
167
167
|
backend: import("../index.js").StoreBackend | undefined;
|
|
168
168
|
backgroundAgentStore: import("@sema-agent/core").BackgroundAgentStore | undefined;
|
|
169
169
|
breakerState: import("../plugins/breaker-state-sql.js").TiDBBreakerState | import("../plugins/breaker-state-sql.js").PgBreakerState | undefined;
|
|
170
170
|
engineDataRoot: string;
|
|
171
171
|
instanceId: string;
|
|
172
|
-
mailboxRecipientLifecycle:
|
|
172
|
+
mailboxRecipientLifecycle: Readonly<{
|
|
173
|
+
retireRecipient: NonNullable<import("@sema-agent/core").MailboxStore["retireRecipient"]>;
|
|
174
|
+
listRetiredRecipients: NonNullable<import("@sema-agent/core").MailboxStore["listRetiredRecipients"]>;
|
|
175
|
+
}> | undefined;
|
|
173
176
|
mailboxStore: import("@sema-agent/core").MailboxStore | undefined;
|
|
174
177
|
memoryEngine: import("../memory-scope-stores.js").MemoryScopeStores | undefined;
|
|
175
178
|
memoryExportStores: import("../memory-scope-stores.js").MemoryScopeStores | undefined;
|
|
@@ -161,14 +161,17 @@ export declare function runStage10(ctx: Awaited<ReturnType<typeof runStage09>>):
|
|
|
161
161
|
sessionMemoryStatusFace: import("../memory-operator-faces.js").SessionMemoryStatusFace | undefined;
|
|
162
162
|
sessionPolicyStore: import("@sema-agent/core").SessionPolicyStore | undefined;
|
|
163
163
|
sideQueryAccounting: import("../budget.js").SideQueryAccounting;
|
|
164
|
-
toolResultStore: import("
|
|
164
|
+
toolResultStore: import("@sema-agent/core").ToolResultStore | undefined;
|
|
165
165
|
tracer: import("@sema-agent/core").TracerHook;
|
|
166
166
|
backend: import("../plugins/store-backend.js").StoreBackend | undefined;
|
|
167
167
|
backgroundAgentStore: import("@sema-agent/core").BackgroundAgentStore | undefined;
|
|
168
168
|
breakerState: import("../plugins/breaker-state-sql.js").TiDBBreakerState | import("../plugins/breaker-state-sql.js").PgBreakerState | undefined;
|
|
169
169
|
engineDataRoot: string;
|
|
170
170
|
instanceId: string;
|
|
171
|
-
mailboxRecipientLifecycle:
|
|
171
|
+
mailboxRecipientLifecycle: Readonly<{
|
|
172
|
+
retireRecipient: NonNullable<import("@sema-agent/core").MailboxStore["retireRecipient"]>;
|
|
173
|
+
listRetiredRecipients: NonNullable<import("@sema-agent/core").MailboxStore["listRetiredRecipients"]>;
|
|
174
|
+
}> | undefined;
|
|
172
175
|
mailboxStore: import("@sema-agent/core").MailboxStore | undefined;
|
|
173
176
|
memoryEngine: import("../memory-scope-stores.js").MemoryScopeStores | undefined;
|
|
174
177
|
memoryExportStores: import("../memory-scope-stores.js").MemoryScopeStores | undefined;
|
|
@@ -13,6 +13,7 @@ import { backgroundAgentOutput, taskHandleOutput, taskHandleStop } from "../runs
|
|
|
13
13
|
import { createStoreLiveProbe } from "../store-live-probe.js";
|
|
14
14
|
import { counterStoreLabel } from "../plugins/store-backend.js";
|
|
15
15
|
import { sessionStoreLabelOf } from "../store-posture.js";
|
|
16
|
+
import { defaultPeerInboundFace } from "../peer-inbound-face.js";
|
|
16
17
|
import { startFleetClientFromConfig } from "../fleet-client.js";
|
|
17
18
|
import { createCenterWiringReader } from "../capabilities/center-wiring.js";
|
|
18
19
|
import { mintEngineSignal } from "../fleet/engine-signal.js";
|
|
@@ -187,6 +188,7 @@ export async function runStage10(ctx) {
|
|
|
187
188
|
centerIdentityNoticeState: () => webAdmin.centerIdentityNoticeState(),
|
|
188
189
|
modelRefusalsState: () => webAdmin.modelRefusalsState(),
|
|
189
190
|
candidateRejectionState: () => webAdmin.candidateRejectionState(),
|
|
191
|
+
latestPlaneRefusalState: () => webAdmin.latestPlaneRefusalState(),
|
|
190
192
|
configHandoffState: () => webAdmin.configHandoffState(),
|
|
191
193
|
mcpRevocations,
|
|
192
194
|
mcpRevocationState: () => webAdmin.mcpRevocationState(),
|
|
@@ -225,7 +227,7 @@ export async function runStage10(ctx) {
|
|
|
225
227
|
...(runStore ? { runs: runStore } : {}),
|
|
226
228
|
...(workflowRunStore ? { workflows: workflowRunStore } : {}),
|
|
227
229
|
agents: backgroundAgentStore,
|
|
228
|
-
hasPendingAsk: toolApproval ? (
|
|
230
|
+
hasPendingAsk: toolApproval ? (names) => toolApproval.hasLivePendingFromLeg(names) : undefined,
|
|
229
231
|
instanceId,
|
|
230
232
|
logger,
|
|
231
233
|
metrics,
|
|
@@ -342,6 +344,7 @@ export async function runStage10(ctx) {
|
|
|
342
344
|
retentionLane: retentionLaneStarted,
|
|
343
345
|
releaseRetentionLease: retentionLaneStore !== undefined ? () => retentionLaneStore.release(instanceId) : undefined,
|
|
344
346
|
servingLease,
|
|
347
|
+
peerInbound: defaultPeerInboundFace,
|
|
345
348
|
});
|
|
346
349
|
servingLease?.resumeStickyDenial();
|
|
347
350
|
return { ...ctx };
|
package/dist/boot/stores.d.ts
CHANGED
|
@@ -3,7 +3,6 @@ import { type MemorySyncRunner } from "../memory-sync-client.js";
|
|
|
3
3
|
import type { Logger } from "../observability/logger.js";
|
|
4
4
|
import type { Metrics } from "../observability/metrics.js";
|
|
5
5
|
import { type MemorySyncStore } from "../plugins/memory-sync-store-pg.js";
|
|
6
|
-
import { type MailboxRecipientLifecycle } from "../plugins/mailbox-recipient-lifecycle.js";
|
|
7
6
|
import { type TaskAttachmentStore } from "../plugins/task-attachment-store.js";
|
|
8
7
|
import { type StoreBackend } from "../plugins/store-backend.js";
|
|
9
8
|
import { type MemoryScopeStores } from "../memory-scope-stores.js";
|
|
@@ -29,7 +28,10 @@ export declare function openStores(ctx: OpenStoresCtx): Promise<{
|
|
|
29
28
|
memorySyncCursors: MemorySyncStore | undefined;
|
|
30
29
|
rosterStore: import("@sema-agent/core").RosterStore | undefined;
|
|
31
30
|
backgroundAgentStore: import("@sema-agent/core").BackgroundAgentStore | undefined;
|
|
32
|
-
mailboxRecipientLifecycle:
|
|
31
|
+
mailboxRecipientLifecycle: Readonly<{
|
|
32
|
+
retireRecipient: NonNullable<import("@sema-agent/core").MailboxStore["retireRecipient"]>;
|
|
33
|
+
listRetiredRecipients: NonNullable<import("@sema-agent/core").MailboxStore["listRetiredRecipients"]>;
|
|
34
|
+
}> | undefined;
|
|
33
35
|
taskAttachmentStore: TaskAttachmentStore | undefined;
|
|
34
36
|
mailboxStore: import("@sema-agent/core").MailboxStore | undefined;
|
|
35
37
|
memoryExportStores: MemoryScopeStores | undefined;
|
|
@@ -40,5 +42,6 @@ export declare function openStores(ctx: OpenStoresCtx): Promise<{
|
|
|
40
42
|
memoryPosture: import("../memory-posture.js").MemoryPosture;
|
|
41
43
|
taskListLane: import("./task-list-lane.js").TaskListLane;
|
|
42
44
|
sqlEngine: import("../plugins/sql-driver.js").SqlEngineReading | undefined;
|
|
45
|
+
sessionCaptureRecords: import("../plugins/store-backend.js").SessionCaptureRecordSource | undefined;
|
|
43
46
|
}>;
|
|
44
47
|
//# sourceMappingURL=stores.d.ts.map
|
package/dist/boot/stores.js
CHANGED
|
@@ -12,7 +12,7 @@ import { MinioBlobBackend } from "../plugins/blob-backend.js";
|
|
|
12
12
|
import { ensureSnapshotBuckets } from "../plugins/snapshot-bucket-presence.js";
|
|
13
13
|
import { PgBackgroundAgentStore, TiDBBackgroundAgentStore, ensurePgBackgroundAgentSchema, ensureTiDBBackgroundAgentSchema } from "../stores-sql/background-agent-store-sql.js";
|
|
14
14
|
import { PgMailboxStore, TiDBMailboxStore, ensurePgMailboxSchema, ensureTiDBMailboxSchema } from "../plugins/mailbox-store-sql.js";
|
|
15
|
-
import {
|
|
15
|
+
import { recipientLifecycleOf } from "../plugins/mailbox-recipient-lifecycle.js";
|
|
16
16
|
import { PgUsageWindowStore, TiDBUsageWindowStore, ensurePgUsageWindowSchema, ensureTiDBUsageWindowSchema } from "../stores-sql/usage-window-store-sql.js";
|
|
17
17
|
import { PgRosterStore, TiDBRosterStore, ensurePgRosterSchema, ensureTiDBRosterSchema } from "../plugins/roster-store-sql.js";
|
|
18
18
|
import { LocalTaskAttachmentStore } from "../plugins/local-task-attachment-store.js";
|
|
@@ -29,7 +29,7 @@ import { assertCloudSnapshotBlobPosture, openStoreBackendWithFallback } from "..
|
|
|
29
29
|
import { createMemoryEngineIncidentSink } from "../memory-incident-sink.js";
|
|
30
30
|
import { announceLockedLegacyMemoryLayers } from "../memory-layer-legacy-lock.js";
|
|
31
31
|
import { createEngineNoticeForwarder } from "./runner-deps.js";
|
|
32
|
-
import { buildMemoryRemoteLaneWarn, memoryEngineBackendFor, memoryEngineRemoteLanePosture, memoryEngineRootFor,
|
|
32
|
+
import { buildMemoryRemoteLaneWarn, memoryEngineBackendFor, memoryEngineRemoteLanePosture, memoryEngineRootFor, memoryMountRootOf } from "../memory-scope.js";
|
|
33
33
|
import { createMemoryScopeStores } from "../memory-scope-stores.js";
|
|
34
34
|
import { assertToolResultProvenanceSchema } from "../plugins/tool-result-store-sql.js";
|
|
35
35
|
import { assertPermissionRuleApprovalSchema, assertPermissionRuleTicketSchema } from "../plugins/permission-rule-store-sql.js";
|
|
@@ -124,7 +124,8 @@ export async function openStores(ctx) {
|
|
|
124
124
|
let memoryEngine;
|
|
125
125
|
const engineDataRoot = memoryEngineRootFor(config, localRoot);
|
|
126
126
|
const memoryEngineIncident = createMemoryEngineIncidentSink({ logger, metrics });
|
|
127
|
-
const
|
|
127
|
+
const sessionCaptureRecords = backend?.sessionCaptureRecords();
|
|
128
|
+
const scopeStoresOver = (deployment) => createMemoryScopeStores({ backend: deployment, root: engineDataRoot, onIncident: memoryEngineIncident, ...(sessionCaptureRecords !== undefined ? { captureRecords: sessionCaptureRecords } : {}) });
|
|
128
129
|
let memorySyncCursors;
|
|
129
130
|
let vectorMode;
|
|
130
131
|
if (config.memoryEngineBackend !== "file" && config.memoryEngineEnabled) {
|
|
@@ -301,20 +302,19 @@ export async function openStores(ctx) {
|
|
|
301
302
|
await ensurePgMailboxSchema(async (text, params) => pgPool.query(text, params));
|
|
302
303
|
const store = new PgMailboxStore(pgPool, logger);
|
|
303
304
|
mailboxStore = store;
|
|
304
|
-
mailboxRecipientLifecycle = store;
|
|
305
305
|
}
|
|
306
306
|
else if (mysqlPool) {
|
|
307
307
|
await ensureTiDBMailboxSchema(mysqlPool);
|
|
308
308
|
const store = new TiDBMailboxStore(mysqlPool, logger);
|
|
309
309
|
mailboxStore = store;
|
|
310
|
-
mailboxRecipientLifecycle = store;
|
|
311
310
|
}
|
|
312
311
|
else if (backend?.kind === "local") {
|
|
313
312
|
mailboxStore = new FileMailboxStore(config.localDataRoot ?? localRoot, {
|
|
314
313
|
onCorruptRead: createCorruptReadFailOpenSeat("server.mailbox.corrupt-record-skipped"),
|
|
315
314
|
});
|
|
316
|
-
mailboxRecipientLifecycle = createDropOnlyRecipientLifecycle(mailboxStore);
|
|
317
315
|
}
|
|
316
|
+
if (mailboxStore)
|
|
317
|
+
mailboxRecipientLifecycle = recipientLifecycleOf(mailboxStore);
|
|
318
318
|
if (mailboxStore) {
|
|
319
319
|
const laneVerdict = mailboxCrossProcessMountVerdict(mailboxStore);
|
|
320
320
|
logger.info("mailbox_store_enabled", {
|
|
@@ -439,7 +439,7 @@ export async function openStores(ctx) {
|
|
|
439
439
|
return {
|
|
440
440
|
backend, storePosture, memoryEngine, engineDataRoot, memorySyncCursors, rosterStore, backgroundAgentStore, mailboxRecipientLifecycle,
|
|
441
441
|
taskAttachmentStore, mailboxStore, memoryExportStores, memorySyncRunner, sessionStore, breakerState,
|
|
442
|
-
usageWindowStore, memoryPosture, taskListLane, sqlEngine,
|
|
442
|
+
usageWindowStore, memoryPosture, taskListLane, sqlEngine, sessionCaptureRecords,
|
|
443
443
|
};
|
|
444
444
|
}
|
|
445
445
|
//# sourceMappingURL=stores.js.map
|
package/dist/boot/web-admin.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type ModelRefusalsSignal } from "@sema-agent/settings-schema";
|
|
1
|
+
import { type ModelPlaneRefusalCode, type ModelRefusalsSignal } from "@sema-agent/settings-schema";
|
|
2
2
|
import { CenterPromptSource, type SwappableDeps } from "@sema-agent/core";
|
|
3
3
|
import { buildPricing } from "../budget.js";
|
|
4
4
|
import { type Scenario, type ScenarioDeps, type ScenarioDetail } from "../capabilities/scenarios.js";
|
|
@@ -128,6 +128,10 @@ export interface WebAdminRuntime {
|
|
|
128
128
|
* 名 → 码 + 组拒码)。描述**最近一次被判的那份中心候选目录**(每次候选 apply 的报告 `ApplyReport.modelRefusals` 投影;组拒时就是被拒
|
|
129
129
|
* 的那份 —— 引擎自己的拒因表不换代)。没有可报的拒 / 没有配置管道 / 还没判过候选 ⇒ `undefined`(键缺席)。值变了 ⇒ 通知自报订阅者。 */
|
|
130
130
|
modelRefusalsState(): ModelRefusalsSignal | undefined;
|
|
131
|
+
/** `GET /v1/models.modelPlane` 的 `planeRefusalCode` 与 `catalog` 的模型面那一半的**同一只**取值口:**最新到达**的目录候选被模型面组拒的码。
|
|
132
|
+
* 在场 ⇔ 模型拒因信号带 `plane` ∧ 落下它的那次 apply 是最新一次到达(到达计数相等,不按收货序数比 —— 本地腿只改决定文件时同一序数再到达)。
|
|
133
|
+
* 与 {@link modelRefusalsState} 的 `plane` 分两个主语:那一键 = 最近一份**被 stage 判过**的模型面的组拒判决(不随更新的到达撤);本口随每一次更新的到达撤。 */
|
|
134
|
+
latestPlaneRefusalState(): ModelPlaneRefusalCode | undefined;
|
|
131
135
|
/** [ref]:`GET /v1/models.candidateRejected` 的取值口 —— 最近一次候选被判官整拒的结论(`candidateRejection` 座;域集就是判官交出的 `rejected.domains`)。
|
|
132
136
|
* present-iff 当前生效的配置是因判官整拒了最近一份候选而回落的那一份:后来的候选被判 clean 即撤下;还没判过候选 / 没有配置管道 ⇒ `undefined`(键缺席)。
|
|
133
137
|
* dry-run 姿势(`webAdmin.dryRun`,compare-only)恒 `undefined`:候选从不被应用,生效配置恒是 env,拒判是预演读数(日志行照响),不是配置没换的原因。 */
|
package/dist/boot/web-admin.js
CHANGED
|
@@ -18,6 +18,7 @@ import { createCenterConfigTier } from "../center-config-tier.js";
|
|
|
18
18
|
import { buildCenterCredentialHealthView, createCenterCredentialRenewer } from "../center-credential-renewer.js";
|
|
19
19
|
import { centerManagedConfigKeys } from "../web-admin-client/apply-effective.js";
|
|
20
20
|
import { configSourceKind, createConfigProvider, raceBootFetch, BOOT_FETCH_DEFERRED } from "../config-provider.js";
|
|
21
|
+
import { REMOTE_CATALOG_SOURCE } from "../env-model-table-gate.js";
|
|
21
22
|
import { ConfigDirUntrustedError } from "../config-dir-trust.js";
|
|
22
23
|
import { createKeyResolver } from "../key-resolver.js";
|
|
23
24
|
import { buildSealedKeyPublicFace, ensureCheckpointCtxSealing, ensureSealedKeyStore, reportExecutionPublicKey } from "../sealed-key.js";
|
|
@@ -55,11 +56,14 @@ export async function createWebAdminRuntime(ctx) {
|
|
|
55
56
|
let latestEffective;
|
|
56
57
|
let candidateRejection;
|
|
57
58
|
let judgedOrdinal = 0;
|
|
58
|
-
|
|
59
|
+
let arrivalSeq = 0;
|
|
60
|
+
const admitArrival = (ordinal, rejection) => {
|
|
59
61
|
if (ordinal < judgedOrdinal)
|
|
60
|
-
return;
|
|
62
|
+
return { seq: undefined };
|
|
61
63
|
judgedOrdinal = ordinal;
|
|
62
64
|
candidateRejection = rejection;
|
|
65
|
+
arrivalSeq += 1;
|
|
66
|
+
return { seq: arrivalSeq };
|
|
63
67
|
};
|
|
64
68
|
const applyLedger = createConfigApplyLedger();
|
|
65
69
|
let lastPull = "none";
|
|
@@ -88,6 +92,7 @@ export async function createWebAdminRuntime(ctx) {
|
|
|
88
92
|
let bootSkillStale = false;
|
|
89
93
|
let pendingRestart;
|
|
90
94
|
let modelRefusals;
|
|
95
|
+
let modelRefusalsArrival;
|
|
91
96
|
const cc = config.webAdmin;
|
|
92
97
|
const bootCredential = cc?.credential.read();
|
|
93
98
|
const bootVerdict = bootCredential === undefined ? undefined : judgeCenterCredentialAtBoot(bootCredential);
|
|
@@ -208,7 +213,7 @@ export async function createWebAdminRuntime(ctx) {
|
|
|
208
213
|
const domains = verdict.domains.join(",");
|
|
209
214
|
if (candidateRejection?.version === r.effective.version && candidateRejection.domains.join(",") === domains)
|
|
210
215
|
return;
|
|
211
|
-
|
|
216
|
+
admitArrival(ordinal, candidateRejectionOf(r, verdict, candidateSource().kind, Date.now()));
|
|
212
217
|
logger.warn("config_candidate_rejected", buildCandidateRejectedFields(r, verdict, leg, { lkgVersion: latestEffective?.version ?? "(env)", ...localDirField }));
|
|
213
218
|
};
|
|
214
219
|
const noteSourceAtApplied = () => {
|
|
@@ -217,7 +222,7 @@ export async function createWebAdminRuntime(ctx) {
|
|
|
217
222
|
if (rejected === undefined || rejected.version === appliedVersion)
|
|
218
223
|
return;
|
|
219
224
|
const gen = generationOf(appliedVersion);
|
|
220
|
-
|
|
225
|
+
admitArrival(gen, undefined);
|
|
221
226
|
if (!cc?.dryRun)
|
|
222
227
|
applyLedger.applied(gen, appliedVersion);
|
|
223
228
|
logger.info("config_source_back_to_applied", {
|
|
@@ -258,8 +263,9 @@ export async function createWebAdminRuntime(ctx) {
|
|
|
258
263
|
if (!same)
|
|
259
264
|
notifySelfReport("model_refusals");
|
|
260
265
|
};
|
|
261
|
-
const recordApply = (rep) => {
|
|
266
|
+
const recordApply = (rep, ticket) => {
|
|
262
267
|
applyLedger.recordApply(rep);
|
|
268
|
+
modelRefusalsArrival = ticket.seq;
|
|
263
269
|
publishModelRefusals(buildModelRefusalsSignal(rep.modelRefusals));
|
|
264
270
|
};
|
|
265
271
|
let adoptedArtifact;
|
|
@@ -518,19 +524,21 @@ export async function createWebAdminRuntime(ctx) {
|
|
|
518
524
|
const lkgEffective = read.lkg.effective;
|
|
519
525
|
candidateIdentity.set(lkgEffective, identity);
|
|
520
526
|
bindValidator(read.lkg.etag, identity);
|
|
521
|
-
return { effective: lkgEffective, ...(read.lkg.etag !== undefined ? { etag: read.lkg.etag } : {}), prompts: read.prompts };
|
|
527
|
+
return { effective: lkgEffective, ...(read.lkg.etag !== undefined ? { etag: read.lkg.etag } : {}), prompts: read.prompts, catalogSource: REMOTE_CATALOG_SOURCE };
|
|
522
528
|
};
|
|
523
529
|
const bootApplyLkgInline = async (lkgR) => {
|
|
524
530
|
const lkgGen = generationOf(lkgR.effective.version);
|
|
525
531
|
applyLedger.seenTarget(lkgGen, lkgR.effective.version);
|
|
532
|
+
const lkgArrival = admitArrival(lkgGen, undefined);
|
|
526
533
|
let lkgReport;
|
|
527
534
|
applyEffective(config, lkgR.effective, logger, {
|
|
528
535
|
leg: "boot",
|
|
536
|
+
catalogSource: lkgR.catalogSource,
|
|
529
537
|
sealedKeys,
|
|
530
538
|
generation: lkgGen,
|
|
531
539
|
report: (rep) => {
|
|
532
540
|
lkgReport = rep;
|
|
533
|
-
recordApply(rep);
|
|
541
|
+
recordApply(rep, lkgArrival);
|
|
534
542
|
},
|
|
535
543
|
});
|
|
536
544
|
const lkgIdentity = candidateIdentityOf(lkgR.effective);
|
|
@@ -613,7 +621,7 @@ export async function createWebAdminRuntime(ctx) {
|
|
|
613
621
|
}
|
|
614
622
|
else {
|
|
615
623
|
warnReadNotices(r, "boot");
|
|
616
|
-
logEffectiveDiff(config, r.effective, logger);
|
|
624
|
+
logEffectiveDiff(config, r.effective, r.catalogSource, logger);
|
|
617
625
|
ccEtag = r.etag;
|
|
618
626
|
}
|
|
619
627
|
}
|
|
@@ -631,14 +639,16 @@ export async function createWebAdminRuntime(ctx) {
|
|
|
631
639
|
warnReadNotices(r, "boot");
|
|
632
640
|
const bootGen = generationOf(r.effective.version);
|
|
633
641
|
applyLedger.seenTarget(bootGen, r.effective.version);
|
|
642
|
+
const bootArrival = admitArrival(bootGen, undefined);
|
|
634
643
|
let bootReport;
|
|
635
644
|
applyEffective(config, r.effective, logger, {
|
|
636
645
|
leg: "boot",
|
|
646
|
+
catalogSource: r.catalogSource,
|
|
637
647
|
sealedKeys,
|
|
638
648
|
generation: bootGen,
|
|
639
649
|
report: (rep) => {
|
|
640
650
|
bootReport = rep;
|
|
641
|
-
recordApply(rep);
|
|
651
|
+
recordApply(rep, bootArrival);
|
|
642
652
|
},
|
|
643
653
|
});
|
|
644
654
|
markApplied(bootGen, r.effective);
|
|
@@ -651,7 +661,7 @@ export async function createWebAdminRuntime(ctx) {
|
|
|
651
661
|
const lkgPlane = await bootFromLkg("boot candidate's model plane was refused", "model-plane");
|
|
652
662
|
if (lkgPlane) {
|
|
653
663
|
let planeReport;
|
|
654
|
-
applyEffective(config, withModelPlaneOf(r.effective, lkgPlane.effective), logger, { leg: "boot", sealedKeys, generation: bootGen, report: (rep) => (planeReport = rep) });
|
|
664
|
+
applyEffective(config, withModelPlaneOf(r.effective, lkgPlane.effective), logger, { leg: "boot", catalogSource: lkgPlane.catalogSource, sealedKeys, generation: bootGen, report: (rep) => (planeReport = rep) });
|
|
655
665
|
if (modelPlaneCommitted(planeReport)) {
|
|
656
666
|
bootPlaneEff = lkgPlane.effective;
|
|
657
667
|
logger.warn("config_model_plane_from_lkg", { version: r.effective.version, lkgVersion: lkgPlane.effective.version, note: "the live candidate's model plane was refused at boot — serving the LKG's model plane (the catalog and what rides with it) with the live candidate's other groups; the refresh cadence re-judges the candidate" });
|
|
@@ -746,6 +756,7 @@ export async function createWebAdminRuntime(ctx) {
|
|
|
746
756
|
restartState: () => buildRestartSignal(pendingRestart, planeDeferredNoHandoff),
|
|
747
757
|
configHandoffState: () => (configProvider === undefined || configProvider.kind === "local" || !lkgSurvivesRestart ? undefined : buildConfigHandoff(latchHandoff(), handoffMissingSince)),
|
|
748
758
|
modelRefusalsState: () => modelRefusals,
|
|
759
|
+
latestPlaneRefusalState: () => (modelRefusals?.plane !== undefined && modelRefusalsArrival !== undefined && modelRefusalsArrival === arrivalSeq ? modelRefusals.plane : undefined),
|
|
749
760
|
candidateRejectionState: () => (cc?.dryRun ? undefined : candidateRejection),
|
|
750
761
|
configApplyState: () => (configProvider ? applyLedger.view() : undefined),
|
|
751
762
|
centerPullState: () => {
|
|
@@ -905,11 +916,12 @@ export async function createWebAdminRuntime(ctx) {
|
|
|
905
916
|
const committed = applyEffective(config, eff, logger, {
|
|
906
917
|
leg: "hot",
|
|
907
918
|
checkpointStorePresent,
|
|
919
|
+
catalogSource: c.catalogSource,
|
|
908
920
|
sealedKeys,
|
|
909
921
|
generation: gen,
|
|
910
922
|
report: (rep) => {
|
|
911
923
|
report = rep;
|
|
912
|
-
recordApply(rep);
|
|
924
|
+
recordApply(rep, c.arrival);
|
|
913
925
|
},
|
|
914
926
|
...(planeChanged ? { swapPlane: swapRunnerDeps } : {}),
|
|
915
927
|
});
|
|
@@ -937,14 +949,14 @@ export async function createWebAdminRuntime(ctx) {
|
|
|
937
949
|
const demoteToNoCenter = async (awaiting) => {
|
|
938
950
|
const gen = reserveArrivalGeneration();
|
|
939
951
|
applyLedger.seenTarget(gen, NO_CENTER_EFFECTIVE.version);
|
|
940
|
-
const
|
|
952
|
+
const arrival = admitArrival(gen, undefined);
|
|
953
|
+
const hot = await commitHot({ eff: NO_CENTER_EFFECTIVE, catalogSource: REMOTE_CATALOG_SOURCE, prompts: undefined, gen, arrival, phase: "no-center" });
|
|
941
954
|
if (!hot.committed) {
|
|
942
955
|
throw new Error("the no-center tier was refused (the Runners did not accept the env model table) — the previous account's center configuration is still in force; retried next tick");
|
|
943
956
|
}
|
|
944
957
|
if (hot.report !== undefined && !hot.report.fullyApplied) {
|
|
945
958
|
logger.warn("center_identity_demotion_partial", { groups: refusedGroups(hot.report).map((g) => g.group), note: "a group of the no-center tier was refused — that group keeps its previous values (loud; the env base for that group could not be applied)" });
|
|
946
959
|
}
|
|
947
|
-
noteCandidateVerdict(gen, undefined);
|
|
948
960
|
latestEffective = undefined;
|
|
949
961
|
ccEtag = undefined;
|
|
950
962
|
announceTier(tier.demote(awaiting, hot.report !== undefined ? refusedGroups(hot.report).map((g) => g.group) : []));
|
|
@@ -1013,14 +1025,14 @@ export async function createWebAdminRuntime(ctx) {
|
|
|
1013
1025
|
announceCandidateRejected(r, verdict, arrival !== undefined ? "late-boot" : "refresh", tickGen);
|
|
1014
1026
|
return "ok";
|
|
1015
1027
|
}
|
|
1016
|
-
|
|
1028
|
+
const tickArrival = admitArrival(tickGen, undefined);
|
|
1017
1029
|
warnReadNotices(r, "refresh");
|
|
1018
1030
|
if (ccRef?.dryRun) {
|
|
1019
|
-
logEffectiveDiff(config, r.effective, logger);
|
|
1031
|
+
logEffectiveDiff(config, r.effective, r.catalogSource, logger);
|
|
1020
1032
|
ccEtag = r.etag;
|
|
1021
1033
|
}
|
|
1022
1034
|
else {
|
|
1023
|
-
const hot = await commitHot({ eff: r.effective, prompts: verdict.prompts, gen: tickGen, phase: "refresh" });
|
|
1035
|
+
const hot = await commitHot({ eff: r.effective, catalogSource: r.catalogSource, prompts: verdict.prompts, gen: tickGen, arrival: tickArrival, phase: "refresh" });
|
|
1024
1036
|
if (!hot.committed)
|
|
1025
1037
|
return "ok";
|
|
1026
1038
|
const applyReport = hot.report;
|
|
@@ -1127,14 +1139,14 @@ export async function createWebAdminRuntime(ctx) {
|
|
|
1127
1139
|
announceCandidateRejected(r, lateVerdict, "late-boot", lateGen);
|
|
1128
1140
|
return;
|
|
1129
1141
|
}
|
|
1130
|
-
|
|
1142
|
+
const lateArrival = admitArrival(lateGen, undefined);
|
|
1131
1143
|
warnReadNotices(r, "boot-deferred");
|
|
1132
1144
|
if (ccRef?.dryRun) {
|
|
1133
|
-
logEffectiveDiff(config, r.effective, logger);
|
|
1145
|
+
logEffectiveDiff(config, r.effective, r.catalogSource, logger);
|
|
1134
1146
|
ccEtag = r.etag;
|
|
1135
1147
|
return;
|
|
1136
1148
|
}
|
|
1137
|
-
const hotLate = await commitHot({ eff: r.effective, prompts: lateVerdict.prompts, gen: lateGen, phase: "boot-deferred" });
|
|
1149
|
+
const hotLate = await commitHot({ eff: r.effective, catalogSource: r.catalogSource, prompts: lateVerdict.prompts, gen: lateGen, arrival: lateArrival, phase: "boot-deferred" });
|
|
1138
1150
|
if (!hotLate.committed)
|
|
1139
1151
|
return;
|
|
1140
1152
|
const applyReportLate = hotLate.report;
|
|
@@ -12,8 +12,8 @@
|
|
|
12
12
|
* 不是静默继承 full(词表闭集纪律)。
|
|
13
13
|
* ② {@link HANDS_EXCLUSIVE_TOOL_NAMES} + {@link handsDenyPolicy} —— 纵深:hands=none 的任务即便被误接到
|
|
14
14
|
* 有手 Runner 上,手独占名单逐一 deny。**不是**主保证(主保证是根本不挂 factory ⇒ 工具面不可见)。
|
|
15
|
-
* ③ {@link
|
|
16
|
-
*
|
|
15
|
+
* ③ {@link createHandsRunnerSelector} —— 车道是这条腿的部署事实(`leg-facts.ts`:装配器出口铸一次,两只漏斗以装配输出调选路器时读一次),
|
|
16
|
+
* **缺席即拒**(不是回落最宽车道)。
|
|
17
17
|
*/
|
|
18
18
|
import { type Runner, type TaskSpec, type ToolPolicy } from "@sema-agent/core";
|
|
19
19
|
/** 场景对手带工具面的表态(闭集)。`full` = core 手带 band 照常 mount;`none` = 不挂 executionEnvFactory 的 Runner。 */
|
|
@@ -114,32 +114,7 @@ export declare function tightenWithHandsDeny(base: ToolPolicy | undefined): Tool
|
|
|
114
114
|
/** 装配点的取用形:`full` 原样放行基线,`none` 叠 deny。**穷举 switch**,无缺省臂。 */
|
|
115
115
|
export declare function toolPolicyForHands(hands: ScenarioHands, base: ToolPolicy | undefined): ToolPolicy | undefined;
|
|
116
116
|
/**
|
|
117
|
-
*
|
|
118
|
-
*
|
|
119
|
-
* 为什么是 symbol 而不是字符串键:`TaskSpec` 是**上游 core 的类型面**,一个字符串键会进
|
|
120
|
-
* `Object.keys` / `JSON.stringify` / core 自己的键审计,等于 server 在别人的契约上私自加一个键;
|
|
121
|
-
* symbol 键随 spread(`{...spec}`)与 rest 解构(`const {objective, ...taskConfig} = spec`)结构性
|
|
122
|
-
* 地跟着走,却对上游的键面**不可见**(结构化克隆与 JSON 同样跳过 symbol 键)。于是「车道是 spec 上
|
|
123
|
-
* 的一个字段、复制 spec 不丢车道」与「不污染上游契约」两件事同时成立。
|
|
124
|
-
*
|
|
125
|
-
* 修前的旁表要求「从 resolveSpec 出来的那一只对象必须一路原样活到执行点」——一条**隐形**的对象身份
|
|
126
|
-
* 契约:任何一次 `{...spec}` 都会静默把车道降级成最宽的 `full`(实测:登记 `none` 的 spec 复制后
|
|
127
|
-
* `laneOf` 答 `full`)。字段化把那条隐形要求整条删掉。
|
|
128
|
-
*/
|
|
129
|
-
export declare const HANDS_LANE_FIELD: unique symbol;
|
|
130
|
-
/** 已铸车道的 TaskSpec。铸点唯一(`boot/resolve-spec.ts` 的 resolveSpec 出口),读点唯一({@link handsLaneOf})。 */
|
|
131
|
-
export type LanedTaskSpec = TaskSpec & {
|
|
132
|
-
readonly [HANDS_LANE_FIELD]: ScenarioHands;
|
|
133
|
-
};
|
|
134
|
-
/**
|
|
135
|
-
* 铸车道(**单一属主**:只允许 resolveSpec 的出口调用)。
|
|
136
|
-
*
|
|
137
|
-
* 字段是 `enumerable`(所以复制得走)、`writable:false` + `configurable:false`(所以同一只 spec 被
|
|
138
|
-
* 第二次铸车道会当场 TypeError —— 两个写者是漂移的成因,响亮好过后到者悄悄赢)。
|
|
139
|
-
*/
|
|
140
|
-
export declare function stampHandsLane<T extends TaskSpec>(spec: T, hands: ScenarioHands): T & LanedTaskSpec;
|
|
141
|
-
/**
|
|
142
|
-
* 车道字段缺席的拒因 —— 具名类,便于调用点/测试按类型判,而不是嗅文案。
|
|
117
|
+
* 车道读不到的拒因 —— 具名类,便于调用点/测试按类型判,而不是嗅文案。
|
|
143
118
|
*
|
|
144
119
|
* 🔴 **刻意不是 `HttpError`、刻意不铸新的 wire 错误码**:它落到 `http/server.ts` 的兜底 catch,
|
|
145
120
|
* wire 上是 500 `internal.error`(内部文本不回显,只进 `request_error` 日志行)。理由两条:
|
|
@@ -153,19 +128,14 @@ export declare class HandsLaneUnstampedError extends Error {
|
|
|
153
128
|
constructor();
|
|
154
129
|
}
|
|
155
130
|
/**
|
|
156
|
-
*
|
|
157
|
-
*
|
|
131
|
+
* 装配点的选路席:`{full, handsless}` 两只 Runner + 这条腿的车道 ⇒ 本任务跑哪一只。公共缝 `runnerFor(spec)` 的生产实现;
|
|
132
|
+
* 两只漏斗(受理 / 续跑)以**装配器输出的那一只对象**调它(`leg-facts.ts`:读在 `stampSpecRoot` 复制之前)。
|
|
158
133
|
*
|
|
159
|
-
*
|
|
160
|
-
*
|
|
161
|
-
*
|
|
162
|
-
*/
|
|
163
|
-
export declare function handsLaneOf(spec: TaskSpec): ScenarioHands;
|
|
164
|
-
/**
|
|
165
|
-
* 装配点的选路席:`{full, handsless}` 两只 Runner + 车道字段 ⇒ 本任务跑哪一只。
|
|
134
|
+
* 车道读不到 ⇒ **缺席即拒**([ref] P 类:车道选择是保护型量,fail-closed;`observability/fail-open.ts` 头注把「车道选择」逐字列在
|
|
135
|
+
* 「正解是 fail-closed,不是留痕后继续放行」那一族里)。读不到的两种来路:嵌入方自带的 `resolveSpec`(不铸本仓的腿事实),
|
|
136
|
+
* 或有人把复制品交了进来(读晚了)—— 都整只拒(500 + 日志留原句),绝不把一个未经裁定的任务放进最宽的有手车道。
|
|
166
137
|
*
|
|
167
|
-
* 具名工厂而不是在 main.ts 手搓闭包:选路规则(
|
|
168
|
-
* 测试与生产装配拿的是同一只(手搓等价闭包 = 第二真源,正是本件要删的那一类)。
|
|
138
|
+
* 具名工厂而不是在 main.ts 手搓闭包:选路规则(读车道 → 穷举 switch)于是只有**一份实现**,测试与生产装配拿的是同一只。
|
|
169
139
|
*/
|
|
170
140
|
export declare function createHandsRunnerSelector(pair: HandsRunnerPair): (spec: TaskSpec) => Runner;
|
|
171
141
|
//# sourceMappingURL=hands-lane.d.ts.map
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { handBandEffects, judgeRuleToolName, combinePolicies, createAllowDenyPolicy } from "@sema-agent/core";
|
|
2
|
+
import { legFactsOf } from "../leg-facts.js";
|
|
2
3
|
import { TOOL_NAME_ROSTER } from "../namespaced-rule-name.js";
|
|
3
4
|
export function withoutHands(deps) {
|
|
4
5
|
const { executionEnvFactory: _handsDropped, ...rest } = deps;
|
|
@@ -29,7 +30,7 @@ export const HANDS_BAND_TOOL_NAMES = Object.freeze([
|
|
|
29
30
|
"ExitWorktree",
|
|
30
31
|
"ListAgents",
|
|
31
32
|
].filter((n, i, all) => judgeRuleToolName(n, TOOL_NAME_ROSTER).kind === "current" && all.indexOf(n) === i));
|
|
32
|
-
export const HANDS_DUAL_USE_TOOL_NAMES = Object.freeze(["
|
|
33
|
+
export const HANDS_DUAL_USE_TOOL_NAMES = Object.freeze(["TaskStop", "SendMessage", "AgentTranscript", "ListAgents"]);
|
|
33
34
|
export const HANDS_EXCLUSIVE_TOOL_NAMES = Object.freeze(HANDS_BAND_TOOL_NAMES.filter((n) => !HANDS_DUAL_USE_TOOL_NAMES.includes(n)));
|
|
34
35
|
export const OFFICE_KEPT_HAND_TOOL_NAMES = Object.freeze(["Read", "Glob", "Grep"]);
|
|
35
36
|
export const OFFICE_EXCLUDED_TOOL_NAMES = Object.freeze(HANDS_EXCLUSIVE_TOOL_NAMES.filter((n) => !OFFICE_KEPT_HAND_TOOL_NAMES.includes(n)));
|
|
@@ -48,24 +49,18 @@ export function toolPolicyForHands(hands, base) {
|
|
|
48
49
|
return tightenWithHandsDeny(base);
|
|
49
50
|
}
|
|
50
51
|
}
|
|
51
|
-
export const HANDS_LANE_FIELD = Symbol("sema-server.handsLane");
|
|
52
|
-
export function stampHandsLane(spec, hands) {
|
|
53
|
-
Object.defineProperty(spec, HANDS_LANE_FIELD, { value: hands, enumerable: true, writable: false, configurable: false });
|
|
54
|
-
return spec;
|
|
55
|
-
}
|
|
56
52
|
export class HandsLaneUnstampedError extends Error {
|
|
57
53
|
constructor() {
|
|
58
54
|
super("execution lane is not stamped on this task spec — refusing to run it rather than falling back to the widest (full-hands) lane");
|
|
59
55
|
this.name = "HandsLaneUnstampedError";
|
|
60
56
|
}
|
|
61
57
|
}
|
|
62
|
-
export function handsLaneOf(spec) {
|
|
63
|
-
const lane = spec[HANDS_LANE_FIELD];
|
|
64
|
-
if (lane === undefined)
|
|
65
|
-
throw new HandsLaneUnstampedError();
|
|
66
|
-
return lane;
|
|
67
|
-
}
|
|
68
58
|
export function createHandsRunnerSelector(pair) {
|
|
69
|
-
return (spec) =>
|
|
59
|
+
return (spec) => {
|
|
60
|
+
const hands = legFactsOf(spec)?.hands;
|
|
61
|
+
if (hands === undefined)
|
|
62
|
+
throw new HandsLaneUnstampedError();
|
|
63
|
+
return pickHandsRunner(hands, pair);
|
|
64
|
+
};
|
|
70
65
|
}
|
|
71
66
|
//# sourceMappingURL=hands-lane.js.map
|
|
@@ -354,8 +354,9 @@ export declare function buildMcpProbeInflightRefusal(): McpProbeRefusal;
|
|
|
354
354
|
* 在任何传输被触碰**之前**就被拒)。
|
|
355
355
|
*
|
|
356
356
|
* 异源复核 [medium]:修前这一形在两条口上都被抛给分派器尾 ⇒ `500 internal.error`。可自带申报那一口的申报
|
|
357
|
-
* 是**调用方**写的,把它答成 500
|
|
358
|
-
*
|
|
357
|
+
* 是**调用方**写的,把它答成 500 是把调用方的错说成这台机器故障 ⇒ 自带申报那一口答 400 `request.field_invalid`(本句)。
|
|
358
|
+
* 中心申报那一口**不走本句**:那是部署方写的、部署上挂不起来,引擎的拒按同步提交腿读的同一张「码 → 状态」表读成应答
|
|
359
|
+
* (409 `config.mcp_server_name_collision` + 引擎原句,`http/engine-refusal.ts`),与同一份声明集在提交腿上的答复同码同状态同句。
|
|
359
360
|
*
|
|
360
361
|
* 🔴 **不回显因由**:那句话来自申报集本身,可能带调用方的内情(名字、地址形)。调用方手里有自己的体,
|
|
361
362
|
* 点名「两台撞了命名空间」就够他自己找;原文留在那一层的日志里。
|