@sema-agent/server 7.137.0 → 7.138.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 +328 -139
- package/README.md +1 -0
- package/README.zh-CN.md +1 -0
- package/USAGE.md +67 -20
- package/dist/approval-card.d.ts +21 -14
- package/dist/approval-card.js +1 -0
- package/dist/audit.js +1 -0
- package/dist/background-agent-name.d.ts +5 -0
- package/dist/background-agent-name.js +5 -0
- package/dist/boot/budget-tracing.d.ts +1 -12
- package/dist/boot/deployment-mods.d.ts +46 -16
- package/dist/boot/deployment-mods.js +82 -6
- package/dist/boot/governance-seams.d.ts +10 -17
- package/dist/boot/governance-seams.js +5 -17
- package/dist/boot/leader.d.ts +3 -0
- package/dist/boot/leader.js +1 -0
- package/dist/boot/org-delivery.js +15 -2
- package/dist/boot/resolve-spec.d.ts +3 -0
- package/dist/boot/resolve-spec.js +23 -12
- package/dist/boot/retention-lane.d.ts +11 -5
- package/dist/boot/retention-lane.js +2 -2
- package/dist/boot/runner-deps.d.ts +7 -3
- package/dist/boot/runner-deps.js +1 -0
- package/dist/boot/stage-04-stores.d.ts +1 -12
- package/dist/boot/stage-05-execution-env.d.ts +3 -12
- package/dist/boot/stage-05-execution-env.js +7 -4
- package/dist/boot/stage-06-runners.d.ts +3 -12
- package/dist/boot/stage-06-runners.js +5 -2
- package/dist/boot/stage-07-capability-layer.d.ts +3 -12
- package/dist/boot/stage-07-capability-layer.js +2 -2
- package/dist/boot/stage-08-reapers.d.ts +3 -12
- package/dist/boot/stage-09-leader.d.ts +3 -12
- package/dist/boot/stage-09-leader.js +2 -2
- package/dist/boot/stage-10-http-server.d.ts +3 -12
- package/dist/boot/stage-10-http-server.js +4 -2
- package/dist/boot/web-admin.d.ts +5 -2
- package/dist/boot/web-admin.js +3 -3
- package/dist/brain.js +5 -5
- package/dist/budget.d.ts +17 -15
- package/dist/budget.js +2 -2
- package/dist/capabilities/mcp-probe.d.ts +36 -11
- package/dist/capabilities/mcp-probe.js +44 -5
- package/dist/capability-facts.d.ts +6 -0
- package/dist/capability-facts.js +5 -0
- package/dist/checkpoint-identity.d.ts +13 -6
- package/dist/config-catalog.js +7 -1
- package/dist/config-types.d.ts +15 -7
- package/dist/config.js +8 -5
- package/dist/deployment-shape.d.ts +6 -6
- package/dist/gate-settlement.d.ts +71 -0
- package/dist/gate-settlement.js +40 -0
- package/dist/hooks/classic-stations.d.ts +1 -0
- package/dist/hooks/classic-stations.js +1 -0
- package/dist/hooks/command-spawn.d.ts +2 -2
- package/dist/hooks/hook-runner.js +14 -14
- package/dist/http/admission.js +4 -2
- package/dist/http/dispatch.d.ts +4 -0
- package/dist/http/dispatch.js +3 -0
- package/dist/http/durable-run-leg.js +4 -2
- package/dist/http/memory-compliance-failure-reply.js +3 -0
- package/dist/http/resume-legs.d.ts +5 -11
- package/dist/http/resume-legs.js +136 -91
- package/dist/http/route-ctx.d.ts +30 -51
- package/dist/http/route-ctx.js +2 -5
- package/dist/http/routes/a2a-serve.js +10 -4
- package/dist/http/routes/agents-roster.d.ts +1 -1
- package/dist/http/routes/agents-roster.js +5 -1
- package/dist/http/routes/approvals-assistant.js +6 -6
- package/dist/http/routes/capabilities.js +12 -10
- package/dist/http/routes/mcp-reconnect.d.ts +3 -2
- package/dist/http/routes/mcp-reconnect.js +7 -5
- package/dist/http/routes/memory-consolidation.d.ts +1 -1
- package/dist/http/routes/memory-origin.d.ts +1 -1
- package/dist/http/routes/rules.js +3 -3
- package/dist/http/routes/runs.js +11 -7
- package/dist/http/routes/sessions.js +6 -4
- package/dist/http/routes/side-query.js +2 -3
- package/dist/http/routes/tasks.js +792 -780
- package/dist/http/server.d.ts +31 -25
- package/dist/http/wire-types.d.ts +14 -6
- package/dist/identity-source.d.ts +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.js +1 -0
- package/dist/leader/wire.d.ts +7 -0
- package/dist/leader/wire.js +5 -4
- package/dist/mcp-assertion-header.d.ts +51 -40
- package/dist/mcp-assertion-header.js +10 -11
- package/dist/mcp-authorization-face.d.ts +27 -0
- package/dist/mcp-authorization-face.js +15 -0
- package/dist/memory-operator-faces.d.ts +13 -4
- package/dist/memory-operator-faces.js +1 -17
- package/dist/memory-sync-client.js +72 -57
- package/dist/memory-sync.d.ts +1 -1
- package/dist/model-route-gap.d.ts +6 -22
- package/dist/model-route-gap.js +7 -5
- package/dist/mods-declaration.d.ts +110 -0
- package/dist/mods-declaration.js +109 -0
- package/dist/observability/err-text.d.ts +5 -0
- package/dist/observability/err-text.js +9 -0
- package/dist/observability/fail-open.d.ts +5 -1
- package/dist/observability/fail-open.js +5 -1
- package/dist/observability/secret-env-scrub.d.ts +1 -1
- package/dist/observability/secret-env-scrub.js +1 -1
- package/dist/parked-decide.d.ts +15 -2
- package/dist/parked-decide.js +14 -8
- package/dist/peer-seat.d.ts +150 -0
- package/dist/peer-seat.js +239 -0
- package/dist/permission-rule-vocab.d.ts +7 -7
- package/dist/permission-rule-vocab.js +3 -3
- package/dist/plain-string-record.d.ts +38 -0
- package/dist/plain-string-record.js +38 -0
- package/dist/plugins/background-agent-store-sql.js +6 -3
- package/dist/plugins/caching-session-store.d.ts +5 -0
- package/dist/plugins/caching-session-store.js +6 -0
- package/dist/plugins/checkpoint-store-sql.d.ts +15 -20
- package/dist/plugins/checkpoint-store-sql.js +8 -8
- package/dist/plugins/file-history-store-sql.js +3 -2
- package/dist/plugins/k8s-pod-reaper.d.ts +2 -8
- package/dist/plugins/k8s-pod-reaper.js +3 -3
- package/dist/plugins/local-checkpoint-store.d.ts +1 -11
- package/dist/plugins/local-checkpoint-store.js +0 -1
- package/dist/plugins/local-session-store.d.ts +66 -27
- package/dist/plugins/local-session-store.js +60 -28
- package/dist/plugins/mailbox-store-sql.d.ts +11 -3
- package/dist/plugins/mailbox-store-sql.js +103 -15
- package/dist/plugins/memory-sync-store-pg.d.ts +16 -5
- package/dist/plugins/memory-sync-store-tidb.d.ts +3 -3
- package/dist/plugins/one-time-migrations.d.ts +6 -3
- package/dist/plugins/one-time-migrations.js +3 -4
- package/dist/plugins/permission-rule-store-sql.js +21 -13
- package/dist/plugins/pg-session-storage.d.ts +10 -2
- package/dist/plugins/pg-session-storage.js +18 -5
- package/dist/plugins/remote-env-adb.d.ts +3 -1
- package/dist/plugins/remote-env-adb.js +1 -1
- package/dist/plugins/remote-env-device.d.ts +3 -1
- package/dist/plugins/remote-env-device.js +1 -1
- package/dist/plugins/remote-env-e2b.d.ts +2 -0
- package/dist/plugins/remote-env-e2b.js +1 -1
- package/dist/plugins/remote-env-host.d.ts +3 -1
- package/dist/plugins/remote-env-host.js +1 -1
- package/dist/plugins/remote-env-k8s.d.ts +3 -1
- package/dist/plugins/remote-env-k8s.js +1 -1
- package/dist/plugins/remote-env-local-docker.d.ts +2 -0
- package/dist/plugins/remote-env-local-docker.js +1 -1
- package/dist/plugins/remote-env-ssh.d.ts +3 -1
- package/dist/plugins/remote-env-ssh.js +1 -1
- package/dist/plugins/retention-store-sql.d.ts +14 -2
- package/dist/plugins/retention-store-sql.js +6 -0
- package/dist/plugins/session-fork.d.ts +10 -13
- package/dist/plugins/session-fork.js +5 -25
- package/dist/plugins/session-ownership.d.ts +7 -0
- package/dist/plugins/session-ownership.js +5 -0
- package/dist/plugins/session-workspace-cell.d.ts +17 -0
- package/dist/plugins/session-workspace-cell.js +38 -0
- package/dist/plugins/store-backend.js +7 -7
- package/dist/plugins/tidb-pool.js +6 -0
- package/dist/plugins/tidb-session-store.d.ts +17 -2
- package/dist/plugins/tidb-session-store.js +16 -5
- package/dist/plugins/tool-result-store-sql.d.ts +13 -6
- package/dist/plugins/tool-result-store-sql.js +8 -7
- package/dist/plugins/worktree-isolation.d.ts +3 -2
- package/dist/plugins/worktree-isolation.js +1 -7
- package/dist/project-identity.d.ts +1 -14
- package/dist/project-identity.js +0 -4
- package/dist/rules-consent.js +6 -4
- package/dist/run-local.js +12 -6
- package/dist/runs.d.ts +7 -1
- package/dist/runs.js +6 -1
- package/dist/sandbox-git-plane.d.ts +2 -2
- package/dist/server-secret-env.d.ts +6 -3
- package/dist/server-secret-env.js +4 -2
- package/dist/session-incarnation.d.ts +4 -5
- package/dist/session-incarnation.js +2 -2
- package/dist/session-workspace.d.ts +130 -0
- package/dist/session-workspace.js +83 -0
- package/dist/spec-fields.d.ts +1 -1
- package/dist/standing-answer-grant.d.ts +2 -13
- package/dist/standing-answer-grant.js +0 -7
- package/dist/task-a2a.d.ts +44 -14
- package/dist/task-a2a.js +46 -20
- package/dist/task-mcp.d.ts +33 -20
- package/dist/task-mcp.js +46 -22
- package/dist/tool-approval.d.ts +32 -8
- package/dist/tool-approval.js +49 -12
- package/dist/trace/core-keyset-guard.d.ts +33 -18
- package/dist/trace/engine-notice-wire.d.ts +1 -1
- package/dist/trace/engine-notice-wire.js +2 -0
- package/dist/trace/exit-seat.d.ts +20 -1
- package/dist/trace/exit-seat.js +3 -0
- package/dist/trace/extension-call-face.d.ts +33 -0
- package/dist/trace/extension-call-face.js +39 -0
- package/dist/trace/project.d.ts +25 -7
- package/dist/trace/project.js +29 -3
- package/dist/trace/redact.js +42 -13
- package/dist/trace/self-minted-wire.d.ts +129 -10
- package/dist/trace/self-minted-wire.js +62 -3
- package/dist/trace/wire-projection-faces.d.ts +6 -6
- package/dist/trace/wire-projection-faces.js +6 -5
- package/dist/user-authored-text.d.ts +2 -2
- package/dist/user-authored-text.js +16 -1
- package/dist/web-admin-client/center-request.d.ts +3 -2
- package/dist/web-admin-client/center-request.js +2 -3
- package/dist/web-admin-client/skills-mcp.d.ts +8 -4
- package/dist/web-admin-client/skills-mcp.js +31 -18
- package/dist/web-admin-client/types.d.ts +5 -0
- package/package.json +3 -3
- package/wire-changes/server@7.138.0.json +446 -0
- package/dist/http/mcp-remote-text.d.ts +0 -5
- package/dist/http/mcp-remote-text.js +0 -7
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import type { runStage04 } from "./stage-04-stores.js";
|
|
2
2
|
export declare function runStage05(ctx: Awaited<ReturnType<typeof runStage04>>): Promise<{
|
|
3
3
|
deploymentMods: readonly import("@sema-agent/core").ModRegistration<import("@sema-agent/core").EngineDollar>[];
|
|
4
|
+
deploymentModsLoaded: readonly import("./deployment-mods.js").LoadedModPackage[];
|
|
4
5
|
deviceLane: import("./device-lane.js").DeviceLane | undefined;
|
|
6
|
+
peerDesk: import("../peer-seat.js").PeerDesk;
|
|
5
7
|
dropSessionScoped: (sid: string) => void;
|
|
6
8
|
executionEnvFactory: import("@sema-agent/core").ExecutionEnvFactory | undefined;
|
|
7
9
|
fenceSessionOwner: (sid: string, owner: string | null) => void;
|
|
@@ -44,18 +46,7 @@ export declare function runStage05(ctx: Awaited<ReturnType<typeof runStage04>>):
|
|
|
44
46
|
ruleConsent: import("../rules-consent.js").RuleConsentLane | undefined;
|
|
45
47
|
sessionMemoryStatusFace: import("../memory-operator-faces.js").SessionMemoryStatusFace | undefined;
|
|
46
48
|
sessionPolicyStore: import("@sema-agent/core").SessionPolicyStore | undefined;
|
|
47
|
-
sideQueryAccounting: (
|
|
48
|
-
model: string;
|
|
49
|
-
usage?: {
|
|
50
|
-
input?: number;
|
|
51
|
-
output?: number;
|
|
52
|
-
cacheRead?: number;
|
|
53
|
-
cacheWrite?: number;
|
|
54
|
-
cost?: {
|
|
55
|
-
total?: number;
|
|
56
|
-
};
|
|
57
|
-
};
|
|
58
|
-
}) => void;
|
|
49
|
+
sideQueryAccounting: import("../budget.js").SideQueryAccounting;
|
|
59
50
|
toolResultStore: import("../plugins/store-backend.js").ToolResultStoreFull | undefined;
|
|
60
51
|
tracer: import("@sema-agent/core").TracerHook;
|
|
61
52
|
backend: import("../index.js").StoreBackend | undefined;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { assembleDeploymentMods } from "./deployment-mods.js";
|
|
2
2
|
import { isBrandedDeployment } from "../capabilities/brand-identity.js";
|
|
3
3
|
import { assertDeviceLaneWired, createDeviceLane } from "./device-lane.js";
|
|
4
4
|
import { assertWorkspaceSpaceReadable, createExecutionEnv } from "./execution-env.js";
|
|
@@ -7,6 +7,7 @@ import * as facts from "../capability-facts.js";
|
|
|
7
7
|
import { sessionStoreLabelOf } from "../store-posture.js";
|
|
8
8
|
import { runStore } from "./late-binds.js";
|
|
9
9
|
import { SANDBOX_GIT_PLANE_OFF_TEXT } from "../sandbox-git-plane.js";
|
|
10
|
+
import { createPeerDesk } from "../peer-seat.js";
|
|
10
11
|
export async function runStage05(ctx) {
|
|
11
12
|
const { backend, config, instanceId, logger, metrics, sessionStore, taskAttachmentStore } = ctx;
|
|
12
13
|
const deviceLane = config.remoteExec?.provider === "device" ? createDeviceLane({ config, logger, metrics, backend, replicaId: instanceId }) : undefined;
|
|
@@ -23,10 +24,12 @@ export async function runStage05(ctx) {
|
|
|
23
24
|
else if (sandboxGitPlane.reason !== "single_user" && sandboxGitPlane.reason !== "lane_without_boundary") {
|
|
24
25
|
logger.info("credential_plane_sandbox_git", { state: "off", reason: sandboxGitPlane.reason, why: SANDBOX_GIT_PLANE_OFF_TEXT[sandboxGitPlane.reason] });
|
|
25
26
|
}
|
|
26
|
-
const deploymentMods = createDeploymentMods({ metrics, ...(config.toolTrace ? { traceLogger: logger } : {}), brandIdentity: isBrandedDeployment(config) });
|
|
27
27
|
if (config.toolTrace)
|
|
28
28
|
logger.info("tool_trace_enabled", {});
|
|
29
|
-
await
|
|
30
|
-
|
|
29
|
+
const { registrations: deploymentMods, loaded: deploymentModsLoaded } = await assembleDeploymentMods({ metrics, ...(config.toolTrace ? { traceLogger: logger } : {}), brandIdentity: isBrandedDeployment(config), declaration: config.modsDeclaration, logger });
|
|
30
|
+
const peerDesk = createPeerDesk({ log: logger });
|
|
31
|
+
metrics.dynamicGauge("peer_registry_entries", "Peer desk entries (declared peer credentials registered for in-flight legs and the roster)", () => peerDesk.size().entries);
|
|
32
|
+
metrics.dynamicGauge("peer_registry_holders", "Peer desk host leases holding entries, summed across entries", () => peerDesk.size().holders);
|
|
33
|
+
return { ...ctx, deploymentMods, deploymentModsLoaded, deviceLane, peerDesk, dropSessionScoped, executionEnvFactory, fenceSessionOwner, lspManager, spaceReclaimer, sandboxPodReaper, sandboxGitPlane, perSessionCwd, perTaskImage, sendUserFileTaskEnvs, sessionEnvSelection, setSessionCwd, setSessionInheritEnv, setSessionShellEnv, worktreeReap };
|
|
31
34
|
}
|
|
32
35
|
//# sourceMappingURL=stage-05-execution-env.js.map
|
|
@@ -64,7 +64,9 @@ export declare function runStage06(ctx: Awaited<ReturnType<typeof runStage05>>):
|
|
|
64
64
|
workflowsCapable: boolean;
|
|
65
65
|
orgDeliveryGate: import("@sema-agent/core").OrgDeliveryGate | undefined;
|
|
66
66
|
deploymentMods: readonly import("@sema-agent/core").ModRegistration<import("@sema-agent/core").EngineDollar>[];
|
|
67
|
+
deploymentModsLoaded: readonly import("./deployment-mods.js").LoadedModPackage[];
|
|
67
68
|
deviceLane: import("./device-lane.js").DeviceLane | undefined;
|
|
69
|
+
peerDesk: import("../peer-seat.js").PeerDesk;
|
|
68
70
|
dropSessionScoped: (sid: string) => void;
|
|
69
71
|
executionEnvFactory: import("@sema-agent/core").ExecutionEnvFactory | undefined;
|
|
70
72
|
fenceSessionOwner: (sid: string, owner: string | null) => void;
|
|
@@ -107,18 +109,7 @@ export declare function runStage06(ctx: Awaited<ReturnType<typeof runStage05>>):
|
|
|
107
109
|
ruleConsent: import("../rules-consent.js").RuleConsentLane | undefined;
|
|
108
110
|
sessionMemoryStatusFace: import("../memory-operator-faces.js").SessionMemoryStatusFace | undefined;
|
|
109
111
|
sessionPolicyStore: import("@sema-agent/core").SessionPolicyStore | undefined;
|
|
110
|
-
sideQueryAccounting: (
|
|
111
|
-
model: string;
|
|
112
|
-
usage?: {
|
|
113
|
-
input?: number;
|
|
114
|
-
output?: number;
|
|
115
|
-
cacheRead?: number;
|
|
116
|
-
cacheWrite?: number;
|
|
117
|
-
cost?: {
|
|
118
|
-
total?: number;
|
|
119
|
-
};
|
|
120
|
-
};
|
|
121
|
-
}) => void;
|
|
112
|
+
sideQueryAccounting: import("../budget.js").SideQueryAccounting;
|
|
122
113
|
toolResultStore: import("../plugins/store-backend.js").ToolResultStoreFull | undefined;
|
|
123
114
|
tracer: import("@sema-agent/core").TracerHook;
|
|
124
115
|
backend: import("../index.js").StoreBackend | undefined;
|
|
@@ -28,8 +28,9 @@ import { createSharedMemoryScopeAuthorizer } from "../shared-memory-scope-author
|
|
|
28
28
|
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
|
+
import { retentionSweepRuns } from "../plugins/retention-store-sql.js";
|
|
31
32
|
export async function runStage06(ctx) {
|
|
32
|
-
const { backend, backgroundAgentStore, brain, engineDataRoot, config, webAdmin, consolidationValve, deploymentMods, executionEnvFactory, fileHistoryStore, localRoot, logger, lspManager, mailboxRecipientLifecycle, mailboxStore, memoryEngine, memorySyncRunner, metrics, perSessionCwd, permissionRuleProvider, pricing, rosterStore, ruleConsent, sendUserFileTaskEnvs, sessionCaptureRecordStore, sessionCaptureRecords, sessionPolicyStore, sessionStore, taskAttachmentStore, taskListLane, toolResultStore, tracer, usageWindowStore } = ctx;
|
|
33
|
+
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, sessionCaptureRecordStore, sessionCaptureRecords, sessionPolicyStore, sessionStore, taskAttachmentStore, taskListLane, toolResultStore, tracer, usageWindowStore } = ctx;
|
|
33
34
|
const { sqlWorkflowRunStore, workflowNotifyJournal, workflowCompletionInbox, deliverWorkflowCompletion, workflowNotifyGate, fleetBus, workflowRunStore, workflowJournalStore, outcomeSink, workflowRecoverOpts, workflowAgentRegistry, subagentSteerRegistry, workflowAgentSessionIndex, workflowParkDecisions, } = createWorkflowOrchestration({ config, logger, metrics, localRoot, backend, getRunStore: () => runStore });
|
|
34
35
|
const parkCommitted = backend?.checkpoint && config.durableApproval ? createParkCommitWatch(backend.checkpoint(logger)) : undefined;
|
|
35
36
|
const checkpointStore = parkCommitted?.store;
|
|
@@ -125,7 +126,7 @@ export async function runStage06(ctx) {
|
|
|
125
126
|
{ name: "checkpointStore", store: checkpointStore },
|
|
126
127
|
{ name: "toolResultStore", store: runnerOffloadStore },
|
|
127
128
|
],
|
|
128
|
-
|
|
129
|
+
retentionExecutor: retentionSweepRuns(config.retentionSweep) ? (retentionExecutor ?? null) : null,
|
|
129
130
|
});
|
|
130
131
|
const mcpRevocations = webAdmin.takeMcpRevocations();
|
|
131
132
|
const workflowModelAllowlistSnapshot = workflowModelAllowlistFor(config) ?? [];
|
|
@@ -136,6 +137,7 @@ export async function runStage06(ctx) {
|
|
|
136
137
|
config, logger, metrics, localRoot, promptSource: webAdmin.promptSource, rosterStore, backgroundAgentStore, mailboxStore, mailboxRecipientLifecycle, usageWindowStore, brain,
|
|
137
138
|
pricing, tracer, outcomeSink, elicitation, question, toolApproval, sessionStore, memoryEngine,
|
|
138
139
|
engineDataRoot,
|
|
140
|
+
peerDesk,
|
|
139
141
|
sessionCaptureRecords,
|
|
140
142
|
memorySyncRunner, toolResultStore: runnerOffloadStore, checkpointStore, sessionPolicyStore, runtimeCapsResolver, fileHistoryStore,
|
|
141
143
|
permissionRuleStore: permissionRuleProvider,
|
|
@@ -220,6 +222,7 @@ export async function runStage06(ctx) {
|
|
|
220
222
|
governanceSeams,
|
|
221
223
|
sharedMemoryStores: sharedMemoryStore ? sharedMemoryStore : undefined,
|
|
222
224
|
engineDataRoot,
|
|
225
|
+
peerDesk,
|
|
223
226
|
}),
|
|
224
227
|
sessionStore: subRunnerSessions,
|
|
225
228
|
onBackgroundChildEvent: runnerDeps.onBackgroundChildEvent ? runnerDeps.onBackgroundChildEvent : undefined,
|
|
@@ -80,7 +80,9 @@ export declare function runStage07(ctx: Awaited<ReturnType<typeof runStage06>>):
|
|
|
80
80
|
workflowsCapable: boolean;
|
|
81
81
|
orgDeliveryGate: import("@sema-agent/core").OrgDeliveryGate | undefined;
|
|
82
82
|
deploymentMods: readonly import("@sema-agent/core").ModRegistration<import("@sema-agent/core").EngineDollar>[];
|
|
83
|
+
deploymentModsLoaded: readonly import("./deployment-mods.js").LoadedModPackage[];
|
|
83
84
|
deviceLane: import("./device-lane.js").DeviceLane | undefined;
|
|
85
|
+
peerDesk: import("../peer-seat.js").PeerDesk;
|
|
84
86
|
dropSessionScoped: (sid: string) => void;
|
|
85
87
|
executionEnvFactory: import("@sema-agent/core").ExecutionEnvFactory | undefined;
|
|
86
88
|
fenceSessionOwner: (sid: string, owner: string | null) => void;
|
|
@@ -123,18 +125,7 @@ export declare function runStage07(ctx: Awaited<ReturnType<typeof runStage06>>):
|
|
|
123
125
|
ruleConsent: import("../rules-consent.js").RuleConsentLane | undefined;
|
|
124
126
|
sessionMemoryStatusFace: import("../memory-operator-faces.js").SessionMemoryStatusFace | undefined;
|
|
125
127
|
sessionPolicyStore: import("@sema-agent/core").SessionPolicyStore | undefined;
|
|
126
|
-
sideQueryAccounting: (
|
|
127
|
-
model: string;
|
|
128
|
-
usage?: {
|
|
129
|
-
input?: number;
|
|
130
|
-
output?: number;
|
|
131
|
-
cacheRead?: number;
|
|
132
|
-
cacheWrite?: number;
|
|
133
|
-
cost?: {
|
|
134
|
-
total?: number;
|
|
135
|
-
};
|
|
136
|
-
};
|
|
137
|
-
}) => void;
|
|
128
|
+
sideQueryAccounting: import("../budget.js").SideQueryAccounting;
|
|
138
129
|
toolResultStore: import("../plugins/store-backend.js").ToolResultStoreFull | undefined;
|
|
139
130
|
tracer: import("@sema-agent/core").TracerHook;
|
|
140
131
|
backend: import("../index.js").StoreBackend | undefined;
|
|
@@ -29,7 +29,7 @@ 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
31
|
export async function runStage07(ctx) {
|
|
32
|
-
const { approvalAskAudit, approvalExemptionStore, backend, backgroundAgentStore, brain, checkpointStore, config, webAdmin, counterDegradeHook, durableEnabled, instanceId, localRoot, logger, question, runner, runnerDeps, sendUserFileToolSpec, sessionEnvSelection, sessionStore, subRunner, subRunnerSessions, taskListLane, toolApproval } = ctx;
|
|
32
|
+
const { approvalAskAudit, approvalExemptionStore, backend, backgroundAgentStore, brain, checkpointStore, config, webAdmin, counterDegradeHook, peerDesk, durableEnabled, instanceId, localRoot, logger, question, runner, runnerDeps, sendUserFileToolSpec, sessionEnvSelection, sessionStore, subRunner, subRunnerSessions, taskListLane, toolApproval } = ctx;
|
|
33
33
|
const authorize = createAuthorizer(config, sessionStore);
|
|
34
34
|
const runStore = backend ? backend.run() : undefined;
|
|
35
35
|
bindRunStore(runStore);
|
|
@@ -153,7 +153,7 @@ export async function runStage07(ctx) {
|
|
|
153
153
|
: new RateLimiter(config.rateLimitPerMin);
|
|
154
154
|
bindRateLimiter(rateLimiter);
|
|
155
155
|
let skills = loadDeploymentSkills(config, logger);
|
|
156
|
-
skills = await webAdmin.applyCenterCapabilities(skills);
|
|
156
|
+
skills = await webAdmin.applyCenterCapabilities(skills, peerDesk, peerDesk.lease("roster"));
|
|
157
157
|
const repoClient = config.gitApiBaseUrl ? createRepoClient(config.gitApiKind, config.gitApiBaseUrl, config.gitApiToken) : undefined;
|
|
158
158
|
const webSearchCfg = webSearchConfigFromEnv();
|
|
159
159
|
const webSearch = webSearchCfg ? createWebSearchBackend(webSearchCfg) : undefined;
|
|
@@ -93,7 +93,9 @@ export declare function runStage08(ctx: Awaited<ReturnType<typeof runStage07>>):
|
|
|
93
93
|
workflowsCapable: boolean;
|
|
94
94
|
orgDeliveryGate: import("@sema-agent/core").OrgDeliveryGate | undefined;
|
|
95
95
|
deploymentMods: readonly import("@sema-agent/core").ModRegistration<import("@sema-agent/core").EngineDollar>[];
|
|
96
|
+
deploymentModsLoaded: readonly import("./deployment-mods.js").LoadedModPackage[];
|
|
96
97
|
deviceLane: import("./device-lane.js").DeviceLane | undefined;
|
|
98
|
+
peerDesk: import("../peer-seat.js").PeerDesk;
|
|
97
99
|
dropSessionScoped: (sid: string) => void;
|
|
98
100
|
executionEnvFactory: import("@sema-agent/core").ExecutionEnvFactory | undefined;
|
|
99
101
|
fenceSessionOwner: (sid: string, owner: string | null) => void;
|
|
@@ -136,18 +138,7 @@ export declare function runStage08(ctx: Awaited<ReturnType<typeof runStage07>>):
|
|
|
136
138
|
ruleConsent: import("../rules-consent.js").RuleConsentLane | undefined;
|
|
137
139
|
sessionMemoryStatusFace: import("../memory-operator-faces.js").SessionMemoryStatusFace | undefined;
|
|
138
140
|
sessionPolicyStore: import("@sema-agent/core").SessionPolicyStore | undefined;
|
|
139
|
-
sideQueryAccounting: (
|
|
140
|
-
model: string;
|
|
141
|
-
usage?: {
|
|
142
|
-
input?: number;
|
|
143
|
-
output?: number;
|
|
144
|
-
cacheRead?: number;
|
|
145
|
-
cacheWrite?: number;
|
|
146
|
-
cost?: {
|
|
147
|
-
total?: number;
|
|
148
|
-
};
|
|
149
|
-
};
|
|
150
|
-
}) => void;
|
|
141
|
+
sideQueryAccounting: import("../budget.js").SideQueryAccounting;
|
|
151
142
|
toolResultStore: import("../plugins/store-backend.js").ToolResultStoreFull | undefined;
|
|
152
143
|
tracer: import("@sema-agent/core").TracerHook;
|
|
153
144
|
backend: import("../index.js").StoreBackend | undefined;
|
|
@@ -117,7 +117,9 @@ export declare function runStage09(ctx: Awaited<ReturnType<typeof runStage08>>):
|
|
|
117
117
|
workflowsCapable: boolean;
|
|
118
118
|
orgDeliveryGate: import("@sema-agent/core").OrgDeliveryGate | undefined;
|
|
119
119
|
deploymentMods: readonly import("@sema-agent/core").ModRegistration<import("@sema-agent/core").EngineDollar>[];
|
|
120
|
+
deploymentModsLoaded: readonly import("./deployment-mods.js").LoadedModPackage[];
|
|
120
121
|
deviceLane: import("./device-lane.js").DeviceLane | undefined;
|
|
122
|
+
peerDesk: import("../peer-seat.js").PeerDesk;
|
|
121
123
|
dropSessionScoped: (sid: string) => void;
|
|
122
124
|
executionEnvFactory: import("@sema-agent/core").ExecutionEnvFactory | undefined;
|
|
123
125
|
fenceSessionOwner: (sid: string, owner: string | null) => void;
|
|
@@ -160,18 +162,7 @@ export declare function runStage09(ctx: Awaited<ReturnType<typeof runStage08>>):
|
|
|
160
162
|
ruleConsent: import("../rules-consent.js").RuleConsentLane | undefined;
|
|
161
163
|
sessionMemoryStatusFace: import("../memory-operator-faces.js").SessionMemoryStatusFace | undefined;
|
|
162
164
|
sessionPolicyStore: import("@sema-agent/core").SessionPolicyStore | undefined;
|
|
163
|
-
sideQueryAccounting: (
|
|
164
|
-
model: string;
|
|
165
|
-
usage?: {
|
|
166
|
-
input?: number;
|
|
167
|
-
output?: number;
|
|
168
|
-
cacheRead?: number;
|
|
169
|
-
cacheWrite?: number;
|
|
170
|
-
cost?: {
|
|
171
|
-
total?: number;
|
|
172
|
-
};
|
|
173
|
-
};
|
|
174
|
-
}) => void;
|
|
165
|
+
sideQueryAccounting: import("../budget.js").SideQueryAccounting;
|
|
175
166
|
toolResultStore: import("../plugins/store-backend.js").ToolResultStoreFull | undefined;
|
|
176
167
|
tracer: import("@sema-agent/core").TracerHook;
|
|
177
168
|
backend: import("../index.js").StoreBackend | undefined;
|
|
@@ -6,7 +6,7 @@ import { createLeaderFace } from "./leader.js";
|
|
|
6
6
|
import { assertStaticWiringConsistent } from "../http/routes/diagnostics.js";
|
|
7
7
|
import { buildDisplaySafeUrl } from "../trace/redact.js";
|
|
8
8
|
export function runStage09(ctx) {
|
|
9
|
-
const { approvalExemptionStore, backend, backgroundAgentStore, brain, checkpointStore, checkpointCtxSealing, config, webAdmin, deviceLane, dropSessionScoped, durableEnabled, executionEnvFactory, fileHistoryErasure, governanceSeams, localRoot, logger, mailboxRecipientLifecycle, mailboxStore, metrics, pricing, resumeAnchorStore, runStore, runnerDeps, sessionPolicyStore, sessionStore, streamApprovalGate, taskAttachmentStore, spaceReclaimer, taskListLane, toolResultStore, tracer, usageWindowStore, userInputLedgerStore, workflowCompletionInbox } = ctx;
|
|
9
|
+
const { approvalExemptionStore, backend, backgroundAgentStore, brain, checkpointStore, checkpointCtxSealing, config, webAdmin, deploymentMods, deviceLane, dropSessionScoped, durableEnabled, executionEnvFactory, fileHistoryErasure, governanceSeams, localRoot, logger, mailboxRecipientLifecycle, mailboxStore, metrics, pricing, resumeAnchorStore, runStore, runnerDeps, sessionPolicyStore, sessionStore, streamApprovalGate, taskAttachmentStore, spaceReclaimer, taskListLane, toolResultStore, tracer, usageWindowStore, userInputLedgerStore, workflowCompletionInbox } = ctx;
|
|
10
10
|
const { ownerAware, sessionAudit, sessionWatchRegistry, purgeSession, instrumentDegenerate, planCacheProbe } = createSessionFaces({
|
|
11
11
|
deviceStore: deviceLane?.store,
|
|
12
12
|
dropSessionScoped,
|
|
@@ -17,7 +17,7 @@ export function runStage09(ctx) {
|
|
|
17
17
|
userInputLedgerStore,
|
|
18
18
|
...(spaceReclaimer !== undefined ? { spaceReclaimer } : {}),
|
|
19
19
|
});
|
|
20
|
-
const leaderEndpoint = createLeaderFace({ config, logger, brain, pricing, executionEnvFactory, toolResultStore, sessionStore, checkpointStore, checkpointCtxSealing, governanceSeams, backend, tracer, usageWindowStore, promptSource: webAdmin.promptSource, onError: runnerDeps.onError });
|
|
20
|
+
const leaderEndpoint = createLeaderFace({ config, logger, brain, pricing, executionEnvFactory, toolResultStore, sessionStore, checkpointStore, checkpointCtxSealing, governanceSeams, backend, tracer, usageWindowStore, promptSource: webAdmin.promptSource, onError: runnerDeps.onError, deploymentMods });
|
|
21
21
|
const drainState = { draining: false };
|
|
22
22
|
const authBridgeIssuer = authBridgeIssuerOf(config)?.issuer;
|
|
23
23
|
const webAdminJwtVerifier = authBridgeIssuer
|
|
@@ -116,7 +116,9 @@ export declare function runStage10(ctx: Awaited<ReturnType<typeof runStage09>>):
|
|
|
116
116
|
workflowsCapable: boolean;
|
|
117
117
|
orgDeliveryGate: import("@sema-agent/core").OrgDeliveryGate | undefined;
|
|
118
118
|
deploymentMods: readonly import("@sema-agent/core").ModRegistration<import("@sema-agent/core").EngineDollar>[];
|
|
119
|
+
deploymentModsLoaded: readonly import("./deployment-mods.js").LoadedModPackage[];
|
|
119
120
|
deviceLane: import("./device-lane.js").DeviceLane | undefined;
|
|
121
|
+
peerDesk: import("../peer-seat.js").PeerDesk;
|
|
120
122
|
dropSessionScoped: (sid: string) => void;
|
|
121
123
|
executionEnvFactory: import("@sema-agent/core").ExecutionEnvFactory | undefined;
|
|
122
124
|
fenceSessionOwner: (sid: string, owner: string | null) => void;
|
|
@@ -159,18 +161,7 @@ export declare function runStage10(ctx: Awaited<ReturnType<typeof runStage09>>):
|
|
|
159
161
|
ruleConsent: import("../rules-consent.js").RuleConsentLane | undefined;
|
|
160
162
|
sessionMemoryStatusFace: import("../memory-operator-faces.js").SessionMemoryStatusFace | undefined;
|
|
161
163
|
sessionPolicyStore: import("@sema-agent/core").SessionPolicyStore | undefined;
|
|
162
|
-
sideQueryAccounting: (
|
|
163
|
-
model: string;
|
|
164
|
-
usage?: {
|
|
165
|
-
input?: number;
|
|
166
|
-
output?: number;
|
|
167
|
-
cacheRead?: number;
|
|
168
|
-
cacheWrite?: number;
|
|
169
|
-
cost?: {
|
|
170
|
-
total?: number;
|
|
171
|
-
};
|
|
172
|
-
};
|
|
173
|
-
}) => void;
|
|
164
|
+
sideQueryAccounting: import("../budget.js").SideQueryAccounting;
|
|
174
165
|
toolResultStore: import("../plugins/store-backend.js").ToolResultStoreFull | undefined;
|
|
175
166
|
tracer: import("@sema-agent/core").TracerHook;
|
|
176
167
|
backend: import("../plugins/store-backend.js").StoreBackend | undefined;
|
|
@@ -29,7 +29,7 @@ import { bindServerLateSeats } from "./late-binds.js";
|
|
|
29
29
|
import { serviceVersion } from "../service-version.js";
|
|
30
30
|
import { buildDisplaySafeUrl } from "../trace/redact.js";
|
|
31
31
|
export async function runStage10(ctx) {
|
|
32
|
-
const { approvalAskAudit, approvalExemptionStore, approvalNonceStore, authorize, backend, backgroundAgentStore, brain, breakerState, centerRuntimeCapsResolver, checkpointStore, checkpointCtxSealing, parkCommits, config, webAdmin, consolidationValve, costQuota, 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, memoryExportBackend, 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;
|
|
32
|
+
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, memoryExportBackend, 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;
|
|
33
33
|
const stores = {
|
|
34
34
|
runStore,
|
|
35
35
|
resumeAnchorStore: resumeAnchorStore ? resumeAnchorStore : undefined,
|
|
@@ -169,6 +169,7 @@ export async function runStage10(ctx) {
|
|
|
169
169
|
webSearchProvider,
|
|
170
170
|
sealedKeyPublic: webAdmin.sealedKeyPublic,
|
|
171
171
|
sandboxGitPlane,
|
|
172
|
+
deploymentModPackages: deploymentModsLoaded.length,
|
|
172
173
|
instanceId,
|
|
173
174
|
capabilities: {
|
|
174
175
|
version: serviceVersion(),
|
|
@@ -199,6 +200,7 @@ export async function runStage10(ctx) {
|
|
|
199
200
|
};
|
|
200
201
|
const resolveSpec = createResolveSpec({
|
|
201
202
|
config, logger, metrics, localRoot, scenarios, loadedSkills, principalCaps, centerRuntimeCapsResolver,
|
|
203
|
+
peerDesk,
|
|
202
204
|
getKeyResolver: () => webAdmin.getKeyResolver(),
|
|
203
205
|
taskAttachmentStore, perSessionCwd, setSessionCwd, setSessionShellEnv, fenceSessionOwner,
|
|
204
206
|
hookLlm, hookAgent, fleetBus, hookWakeBus, resumeAnchorStore, ownerAware, taskLimitCaps, taskTimeoutSec,
|
|
@@ -212,7 +214,7 @@ export async function runStage10(ctx) {
|
|
|
212
214
|
const runnerFor = createHandsRunnerSelector({ full: runner, handsless: handslessRunner });
|
|
213
215
|
const sideQuery = createSideQueryLane({ brain, config, getKeyResolver: () => webAdmin.getKeyResolver() });
|
|
214
216
|
const scenarioGate = createScenarioGate({ config, scenarios, principalCaps, logger }, "peek");
|
|
215
|
-
const server = createHttpServer({ runner, runnerFor, sideQuery, scenarioGate, config, resolveSpec, stores, coordinators, seams, observability, governance, deployment, knobs });
|
|
217
|
+
const server = createHttpServer({ runner, runnerFor, sideQuery, scenarioGate, peerDesk, config, resolveSpec, stores, coordinators, seams, observability, governance, deployment, knobs });
|
|
216
218
|
bindServerLateSeats({ config, logger, server });
|
|
217
219
|
const fleetReconcile = startFleetReconciler({
|
|
218
220
|
bus: fleetBus,
|
package/dist/boot/web-admin.d.ts
CHANGED
|
@@ -20,6 +20,7 @@ import { type CandidateRejection } from "../web-admin-client/candidate-gate.js";
|
|
|
20
20
|
import { type ConfigApplyLedgerView } from "../web-admin-client/apply-ledger.js";
|
|
21
21
|
import type { CenterPullView } from "../web-admin-client/pull-state.js";
|
|
22
22
|
import type { LimitSync } from "./limit-sync.js";
|
|
23
|
+
import type { PeerDesk, PeerLease } from "../peer-seat.js";
|
|
23
24
|
export interface WebAdminRuntimeCtx {
|
|
24
25
|
config: ServiceConfig;
|
|
25
26
|
logger: Logger;
|
|
@@ -53,8 +54,10 @@ export interface WebAdminRuntime {
|
|
|
53
54
|
readonly checkpointCtxSealing: CheckpointCtxSealing | undefined;
|
|
54
55
|
/** core `CenterPromptSource`(RunnerDeps / subRunner 必须同实例)。 */
|
|
55
56
|
readonly promptSource: CenterPromptSource;
|
|
56
|
-
/** center skills overlay → plugins 消费 → boot LKG 落盘/skill-stale 判定 → mcp 解析。返回新的 skills 表。
|
|
57
|
-
|
|
57
|
+
/** center skills overlay → plugins 消费 → boot LKG 落盘/skill-stale 判定 → mcp / a2a 解析。返回新的 skills 表。
|
|
58
|
+
* 名册(mcp / a2a 两域)条目的件在 `rosterLease`(起服开一只、进程寿命不放)下登记进 `desk`,`config.mcpServers` / `config.a2aPeers`
|
|
59
|
+
* 里是带引用、不带件值的声明。 */
|
|
60
|
+
applyCenterCapabilities(skills: LoadedSkill[], desk: Pick<PeerDesk, "declare">, rosterLease: PeerLease): Promise<LoadedSkill[]>;
|
|
58
61
|
/** center 声明场景 overlay(就地写进传入的两张表)。 */
|
|
59
62
|
applyCenterScenarios(t: CenterScenarioOverlayTargets): void;
|
|
60
63
|
/** per-model key resolver 首建(原位调用,见文件头注 5)。 */
|
package/dist/boot/web-admin.js
CHANGED
|
@@ -735,7 +735,7 @@ export async function createWebAdminRuntime(ctx) {
|
|
|
735
735
|
return "not-wired";
|
|
736
736
|
return (await manualRefresh()) === "failed" ? "failed" : "triggered";
|
|
737
737
|
},
|
|
738
|
-
async applyCenterCapabilities(skills) {
|
|
738
|
+
async applyCenterCapabilities(skills, desk, rosterLease) {
|
|
739
739
|
if (effective?.skills)
|
|
740
740
|
skills = await applySkillsManifest(skills, effective.skills, candidateSource(), logger);
|
|
741
741
|
if (effective?.plugins !== undefined) {
|
|
@@ -775,10 +775,10 @@ export async function createWebAdminRuntime(ctx) {
|
|
|
775
775
|
}
|
|
776
776
|
}
|
|
777
777
|
if (effective?.mcp)
|
|
778
|
-
config.mcpServers = resolveMcpServers(effective.mcp, logger);
|
|
778
|
+
config.mcpServers = resolveMcpServers(effective.mcp, desk, rosterLease, logger);
|
|
779
779
|
mcpRevocations.applyEnabledEntries(enabledMcpEntries(effective?.mcp), { isBaseline: true });
|
|
780
780
|
if (effective?.a2a)
|
|
781
|
-
config.a2aPeers = resolveA2aPeers(effective.a2a, logger);
|
|
781
|
+
config.a2aPeers = resolveA2aPeers(effective.a2a, desk, rosterLease, logger);
|
|
782
782
|
return skills;
|
|
783
783
|
},
|
|
784
784
|
applyCenterScenarios(t) {
|
package/dist/brain.js
CHANGED
|
@@ -6,7 +6,7 @@ import { createHash } from "node:crypto";
|
|
|
6
6
|
import { isModelKeyPoison, modelKeyPoisonIdentity } from "./key-resolver.js";
|
|
7
7
|
import { anthropicRouteRoot, brainLaneFor, mountRoutes, routeTableOf } from "./model-provider.js";
|
|
8
8
|
import { openaiRouteBaseUrl } from "./model-route-endpoint.js";
|
|
9
|
-
import { anthropicLaneCredentialOf } from "./model-route-gap.js";
|
|
9
|
+
import { anthropicLaneCredentialOf, declaredCredential } from "./model-route-gap.js";
|
|
10
10
|
import { catalogEntryFingerprint } from "./web-admin-client/restart-signal.js";
|
|
11
11
|
import { buildDisplaySafeRefusal, buildDisplaySafeUrl } from "./trace/redact.js";
|
|
12
12
|
import { createModelReachBrain } from "./model-unreachable-notice.js";
|
|
@@ -26,10 +26,10 @@ function breakerRoutesOf(config, r) {
|
|
|
26
26
|
return r.circuitBreaker ? deploymentGatewayRoots(config).slice(0, -1) : [];
|
|
27
27
|
}
|
|
28
28
|
function deploymentGatewayKey(config) {
|
|
29
|
-
return config.gatewayBaseUrl !== undefined ? config.gatewayApiKey : undefined;
|
|
29
|
+
return config.gatewayBaseUrl !== undefined ? declaredCredential(config.gatewayApiKey) : undefined;
|
|
30
30
|
}
|
|
31
31
|
function degradeDeclaredRoot(fallbackBaseUrl, config) {
|
|
32
|
-
const armed =
|
|
32
|
+
const armed = deploymentGatewayKey(config) !== undefined && isOffDeploymentRoot(fallbackBaseUrl, config);
|
|
33
33
|
return armed ? config.gatewayBaseUrl : openaiRouteBaseUrl(fallbackBaseUrl, config.gatewayBaseUrl);
|
|
34
34
|
}
|
|
35
35
|
export const FAST_FAIL_MAX_RETRIES = 2;
|
|
@@ -110,7 +110,7 @@ export function createBrainAssembly(config, deps = {}) {
|
|
|
110
110
|
brainRoutes.anthropic
|
|
111
111
|
: constructRouteBrain(`degrade target "${degradeTo}"`, [fallbackModel.baseUrl, config.gatewayBaseUrl], () => createOpenAIBrain({
|
|
112
112
|
...(fbDeclaredRoot !== undefined ? { baseUrl: fbDeclaredRoot } : {}),
|
|
113
|
-
...(fbDeploymentKey ? { apiKey: fbDeploymentKey } : {}),
|
|
113
|
+
...(fbDeploymentKey !== undefined ? { apiKey: fbDeploymentKey } : {}),
|
|
114
114
|
...(config.gatewayMaxRetries !== undefined ? { maxRetries: config.gatewayMaxRetries } : {}),
|
|
115
115
|
fetchImpl,
|
|
116
116
|
...timeouts,
|
|
@@ -240,7 +240,7 @@ export function brainSummary(config) {
|
|
|
240
240
|
if (declaresOwnCredential) {
|
|
241
241
|
return { reactiveDegradeRoutePairing: "per-model-declared", reactiveDegradeRouteRefusal: null };
|
|
242
242
|
}
|
|
243
|
-
const verdict = adjudicateModelRoute({ id: target.id, baseUrl: target.baseUrl }, resolveRouteCredential(((key) => (key ? { configApiKey: key } : {}))(deploymentGatewayKey(config))), { baseUrl: degradeDeclaredRoot(target.baseUrl, config) });
|
|
243
|
+
const verdict = adjudicateModelRoute({ id: target.id, baseUrl: target.baseUrl }, resolveRouteCredential(((key) => (key !== undefined ? { configApiKey: key } : {}))(deploymentGatewayKey(config))), { baseUrl: degradeDeclaredRoot(target.baseUrl, config) });
|
|
244
244
|
return verdict.ok
|
|
245
245
|
? { reactiveDegradeRoutePairing: `ok:${verdict.posture}`, reactiveDegradeRouteRefusal: null }
|
|
246
246
|
: {
|
package/dist/budget.d.ts
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* ④ createTracer — core's content-free TraceEvents → /metrics (spend, first-token, tool calls).
|
|
6
6
|
* ⑤ cappedCeiling — clamp a caller's requested per-task budget DOWN to the operator ceiling.
|
|
7
7
|
*/
|
|
8
|
-
import { type Model, type ModelPricing, type TracerHook } from "@sema-agent/core";
|
|
8
|
+
import { type AccountRow, type Model, type ModelPricing, type TracerHook } from "@sema-agent/core";
|
|
9
9
|
import type { Metrics } from "./observability/metrics.js";
|
|
10
10
|
import type { QuotaTracker } from "./observability/cost-quota.js";
|
|
11
11
|
import type { FleetUsageBins } from "./fleet-client.js";
|
|
@@ -116,23 +116,25 @@ export declare function createTracer(metrics: Pick<Metrics, "inc" | "observe">,
|
|
|
116
116
|
* (tokens×quotaWeight,weight-at-burn 固化)、micro-USD 同轴。装配点与 createTracer 同一处(main.ts),
|
|
117
117
|
* 传同一组实例——两臂永不分家。
|
|
118
118
|
*
|
|
119
|
-
*
|
|
120
|
-
*
|
|
121
|
-
* (
|
|
119
|
+
* 金额源 = 引擎定价的账行 `SideQueryResult.account.costMicroUsd`(core 7.59.0:与 run 的旁路调用同一只定价函数、
|
|
120
|
+
* 按部署价表、按实际作答的模型)—— 与 tracer 的 `e.costMicroUsd` 同一口径;缺席 = 那只模型没有价表 = **未知**(不编 0)。
|
|
121
|
+
* 适配器自报的 `usage.cost.total`(cache 命中按全价)不是金额源(7.58.x 及更早读它,cache-heavy 时多收)。model 标签 /
|
|
122
122
|
* weight 键用**路由身份 r.model**(池配置有界)非 servedModel(provider 上报,无界)。
|
|
123
123
|
*/
|
|
124
|
-
export
|
|
125
|
-
model: string;
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
total?: number;
|
|
133
|
-
};
|
|
124
|
+
export interface SideQueryAccountingInput {
|
|
125
|
+
readonly model: string;
|
|
126
|
+
/** 引擎归一的计数(`input` 已是 uncached 量,见函数体 [ref] 注)。 */
|
|
127
|
+
readonly usage?: {
|
|
128
|
+
readonly input?: number;
|
|
129
|
+
readonly output?: number;
|
|
130
|
+
readonly cacheRead?: number;
|
|
131
|
+
readonly cacheWrite?: number;
|
|
134
132
|
};
|
|
135
|
-
|
|
133
|
+
/** 引擎定价的账行(`origin: "side_query"`);只读它的 `costMicroUsd`。 */
|
|
134
|
+
readonly account?: AccountRow;
|
|
135
|
+
}
|
|
136
|
+
export type SideQueryAccounting = (principal: string | undefined, r: SideQueryAccountingInput) => void;
|
|
137
|
+
export declare function createSideQueryAccountant(metrics: Pick<Metrics, "inc">, costQuota?: QuotaTracker, fleetUsage?: Pick<FleetUsageBins, "record">, fleetLease?: Pick<FleetLeaseManager, "recordSpend">, quotaWeightFor?: (model: string) => number): SideQueryAccounting;
|
|
136
138
|
/**
|
|
137
139
|
* ⑤ Resolve a per-task budget: honor the caller's requested value but never let it EXCEED the operator
|
|
138
140
|
* ceiling. `0`/unset ceiling = no limit (returns the caller's value, or undefined). A non-positive /
|
package/dist/budget.js
CHANGED
|
@@ -144,8 +144,8 @@ export function createSideQueryAccountant(metrics, costQuota, fleetUsage, fleetL
|
|
|
144
144
|
const cacheRead = typeof r.usage?.cacheRead === "number" ? r.usage.cacheRead : 0;
|
|
145
145
|
const cacheWrite = typeof r.usage?.cacheWrite === "number" ? r.usage.cacheWrite : 0;
|
|
146
146
|
const promptTokens = input + cacheRead + cacheWrite;
|
|
147
|
-
const
|
|
148
|
-
const micro =
|
|
147
|
+
const costMicro = r.account?.costMicroUsd;
|
|
148
|
+
const micro = typeof costMicro === "number" && Number.isFinite(costMicro) ? Math.round(costMicro) : undefined;
|
|
149
149
|
if (micro !== undefined && micro > 0) {
|
|
150
150
|
metrics.inc("model_cost_micro_usd_total", { model: r.model }, micro);
|
|
151
151
|
if (principal)
|
|
@@ -34,6 +34,7 @@
|
|
|
34
34
|
*/
|
|
35
35
|
import { type McpServerSpec } from "@sema-agent/core";
|
|
36
36
|
import type { DeclarationRefusal } from "../request-declaration-refusal.js";
|
|
37
|
+
import { type McpDraft, type PeerDesk } from "../peer-seat.js";
|
|
37
38
|
/**
|
|
38
39
|
* 本面的**拒码闭集**(设计稿 §2 的四枚)。闭集写成型,是为了让 {@link MCP_PROBE_HTTP_STATUS} 那张表
|
|
39
40
|
* 「漏一枚 = 编译红」—— [ref] 的安全轴纪律:词表是闭集,未处置的成员必须是编译错误而不是运行期惊喜。
|
|
@@ -163,25 +164,29 @@ export interface McpProbeRefusal {
|
|
|
163
164
|
readonly facts?: DeclarationRefusal["facts"];
|
|
164
165
|
}
|
|
165
166
|
/**
|
|
166
|
-
* `POST …/probe` 的体读器:闭形、逐条点名、零静默丢。成功 ⇒
|
|
167
|
-
*
|
|
167
|
+
* `POST …/probe` 的体读器:闭形、逐条点名、零静默丢。成功 ⇒ 每条申报的**草稿**(被读出来的条目经 `toMcpDraft` 拆成声明 + 件,
|
|
168
|
+
* 声明里 `McpServerSpec` 的可选键一个都不重写 —— 重写就是在 core 的型上做第二次投影)。
|
|
168
169
|
*
|
|
169
170
|
* ## 申报「能不能原样用」:问提交腿 fresh 门**同一只**回答者,不另判
|
|
170
171
|
* 本面只判自己那一层(体是对象、顶层只受理 `mcpServers`、这个键必填);`mcpServers` 本身 —— 列表的形、上限、每条的键名与键值 —— 全部交给
|
|
171
172
|
* `task-mcp.ts` 的 `requestMcpDeclarationRefusal`,拒(码 + 句 + `unknownKeys` + 撞帽 / url 带凭据两形的机读位)原样转述:同一份申报在两扇门上只有一个答案,零拨号之前就给。
|
|
172
|
-
* 回答者受理的申报由**同一只**读器(`validateRequestMcp`)交回,读器的产物就是申报本身(只差判官自己的合法归一),经 `
|
|
173
|
-
*
|
|
174
|
-
* (`source` 写坏的 F 类丢弃)不会在一次被拒的探测上虚记。
|
|
173
|
+
* 回答者受理的申报由**同一只**读器(`validateRequestMcp`)交回,读器的产物就是申报本身(只差判官自己的合法归一),经 `toMcpDraft`
|
|
174
|
+
* 拆出的草稿就是一条任务提交会交给铸点的那一份 —— 走查在自己的租约下铸它(见 {@link createMcpProbeWalk}),本面拨的正是铸出的声明。读器只在回答者受理之后才跑,
|
|
175
|
+
* 所以它对重放存量 body 才有的降级留痕(`source` 写坏的 F 类丢弃)不会在一次被拒的探测上虚记。
|
|
175
176
|
*
|
|
176
|
-
* ## 唯一一处按门分的后果:声明了 `assertionHeader`(
|
|
177
|
+
* ## 唯一一处按门分的后果:声明了 `assertionHeader`(本部署的对端座对断言一种引用恒拒、没有断言来源)
|
|
177
178
|
* 事实只有一个、读它的谓词只有一只(`specWithholdsMcpAssertionHeader`,读发送开关 `MCP_ASSERTION_HEADER_SENT`):这台 server 声明的断言头本版**承载、不发送**,交给引擎的规格里没有它。
|
|
178
179
|
* 新提交照挂并给运维一行 info(`mcp_assertion_header_not_sent`;settings 面同读法);本面**整条拒** —— 拨出去的不是申报的那一份,一台握手放行、
|
|
179
180
|
* 调用才要断言的对端会被答成 connected,而它的调用会被拒。判据同一只、后果按门分(与重放腿对同一组身份头「降级到升级前读法」同一个姿势);
|
|
180
|
-
*
|
|
181
|
+
* 开关与它的退役门在 `mcp-assertion-header.ts`(押在对端座上)。
|
|
182
|
+
*
|
|
183
|
+
* ## 带件的申报(`transport.headers` / `transport.env`):与任务提交同一条路
|
|
184
|
+
* 件进草稿、不进声明;走查在自己的宿主租约下把件登记进部署的对端座,交给引擎的声明只带一只引用,引擎在起子进程 / 发请求时向同一只座要 ——
|
|
185
|
+
* 拨出去的就是申报的那一份,件形的判(多行值、协议自有头名 …)也是任务那一份判。
|
|
181
186
|
*/
|
|
182
187
|
export declare function readMcpProbeBody(raw: unknown): {
|
|
183
188
|
ok: true;
|
|
184
|
-
|
|
189
|
+
drafts: McpDraft[];
|
|
185
190
|
} | {
|
|
186
191
|
ok: false;
|
|
187
192
|
refusal: McpProbeRefusal;
|
|
@@ -194,8 +199,28 @@ export declare function readMcpProbeBody(raw: unknown): {
|
|
|
194
199
|
* 无 principal(单用户部署上恒如此)折成 `local`:那台机器上只有一个人。
|
|
195
200
|
*/
|
|
196
201
|
export declare function buildMcpProbeIdentity(principal: string | undefined): string;
|
|
197
|
-
/**
|
|
198
|
-
|
|
202
|
+
/**
|
|
203
|
+
* 一次探测问的是什么 —— 两条口各一臂,**谁写的申报**就是判别位:
|
|
204
|
+
* · `deployment`(`GET /v1/capabilities/mcp`)= 本部署名册里这个场景挂的声明。它们起服时已在名册租约下铸过(件在对端座里、声明只带引用),
|
|
205
|
+
* 走查直接拨、不开租约、不再登记;
|
|
206
|
+
* · `caller`(`POST …/probe`)= 调用方自带申报的草稿(声明 + 件)。走查在自己的宿主租约下经唯一铸点登记件,见 {@link createMcpProbeWalk}。
|
|
207
|
+
* 两臂的声明都由同一只座作答。缓存键、走查、失败归属(谁写的申报谁的错)都读这一只输入。
|
|
208
|
+
*/
|
|
209
|
+
export type McpProbeInput = {
|
|
210
|
+
readonly declaredBy: "deployment";
|
|
211
|
+
readonly specs: readonly McpServerSpec[];
|
|
212
|
+
} | {
|
|
213
|
+
readonly declaredBy: "caller";
|
|
214
|
+
readonly drafts: readonly McpDraft[];
|
|
215
|
+
};
|
|
216
|
+
/** 这次探测申报了几台(零台 ⇒ 诚实空面,不进缓存、不占限速、不开租约)。 */
|
|
217
|
+
export declare function countMcpProbeDeclarations(input: McpProbeInput): number;
|
|
218
|
+
/**
|
|
219
|
+
* 缓存键 = `(身份, sha256(规范化的整份输入))`。**对输入算**:键在缓存命中 / 在途帽 / 限速三道前置拒里就要用,那时还没有登记任何件(登记在走查里),
|
|
220
|
+
* 所以只能对问的那一份算 —— 调用方臂的件在键内(只差凭据的两份申报是两次走查,与件写在声明里时同义),申报方也在键内(同一份声明在两臂上是两件事)。
|
|
221
|
+
* 部署臂的声明带的是引用,同一进程同内容同 id,换了名册的件就换了 id。键只在进程内的表里用,不出门。**纯数据** ⇒ `build*`。
|
|
222
|
+
*/
|
|
223
|
+
export declare function buildMcpProbeCacheKey(principal: string | undefined, input: McpProbeInput): string;
|
|
199
224
|
/** 限速键(设计稿 §3:`mcp-probe:<身份>`)。**纯数据** ⇒ `build*`。 */
|
|
200
225
|
export declare function buildMcpProbeRateKey(principal: string | undefined): string;
|
|
201
226
|
/** 本域独占的运行期状态(每 server 实例一份 —— 模块级会把缓存与限速窗跨实例串味)。 */
|
|
@@ -281,7 +306,7 @@ export interface McpProbeWalk {
|
|
|
281
306
|
readonly answer: Promise<McpProbeFaceBody>;
|
|
282
307
|
readonly dials: Promise<unknown>;
|
|
283
308
|
}
|
|
284
|
-
export declare function createMcpProbeWalk(
|
|
309
|
+
export declare function createMcpProbeWalk(input: McpProbeInput, principal: string | undefined, desk: PeerDesk, now?: () => number): McpProbeWalk;
|
|
285
310
|
/**
|
|
286
311
|
* 下标对齐的**内部断言**没过(行数 ≠ 申报数,或读数条数 ≠ 行数):core 的 `@contract mcp.probe.index_aligned` 在今天结构上保证它不发生,
|
|
287
312
|
* 所以它一旦发生,是**这台服务内部的读数违约**,不是调用方的申报写错 —— 修申报修不好它。**具名型**而不是按文案或按「非 Incomplete 的 reject」分诊:
|