@sema-agent/server 7.98.0 → 7.100.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 +19 -0
- package/README.md +1 -1
- package/README.zh-CN.md +1 -1
- package/USAGE.md +86 -60
- package/deploy/sema-up/lib/envf.sh +110 -42
- package/deploy/sema-up/sema-up.sh +76 -34
- package/dist/approval-ask-machine.d.ts +10 -0
- package/dist/approval-ask-machine.js +3 -0
- package/dist/approval-card.d.ts +74 -1
- package/dist/approval-card.js +41 -8
- package/dist/approval.d.ts +44 -20
- package/dist/approval.js +14 -6
- package/dist/boot/config-center.d.ts +16 -8
- package/dist/boot/config-center.js +206 -103
- package/dist/boot/execution-env.d.ts +1 -2
- package/dist/boot/execution-env.js +2 -2
- package/dist/boot/leader.js +12 -9
- package/dist/boot/memory-consolidation.d.ts +38 -0
- package/dist/boot/memory-consolidation.js +35 -0
- package/dist/boot/org-memory.d.ts +2 -1
- package/dist/boot/org-memory.js +9 -5
- package/dist/boot/resolve-spec.d.ts +0 -1
- package/dist/boot/resolve-spec.js +4 -3
- package/dist/boot/runner-deps.d.ts +2 -2
- package/dist/boot/runtime-caps.js +4 -4
- package/dist/boot/stage-05-execution-env.d.ts +1 -1
- package/dist/boot/stage-06-runners.d.ts +2 -2
- package/dist/boot/stage-06-runners.js +3 -3
- package/dist/boot/stage-07-capability-layer.d.ts +2 -3
- package/dist/boot/stage-07-capability-layer.js +6 -6
- package/dist/boot/stage-08-reapers.d.ts +3 -4
- package/dist/boot/stage-08-reapers.js +2 -2
- package/dist/boot/stage-09-leader.d.ts +2 -3
- package/dist/boot/stage-10-http-server.d.ts +2 -3
- package/dist/boot/stage-10-http-server.js +2 -2
- package/dist/capabilities/center-plugins.d.ts +14 -2
- package/dist/capabilities/center-plugins.js +13 -5
- package/dist/capabilities/center-prompts.d.ts +3 -0
- package/dist/capabilities/center-prompts.js +1 -1
- package/dist/capabilities/hands-lane.js +2 -1
- package/dist/capabilities/scenarios.js +18 -5
- package/dist/capabilities/tool-defer.d.ts +2 -2
- package/dist/center-credential.d.ts +112 -0
- package/dist/center-credential.js +131 -0
- package/dist/config-catalog.d.ts +2 -2
- package/dist/config-catalog.js +15 -15
- package/dist/config-center/apply-effective.d.ts +34 -39
- package/dist/config-center/apply-effective.js +100 -64
- package/dist/config-center/apply-ledger.d.ts +35 -16
- package/dist/config-center/apply-ledger.js +25 -18
- package/dist/config-center/center-request.d.ts +60 -0
- package/dist/config-center/center-request.js +71 -0
- package/dist/config-center/facade.d.ts +11 -5
- package/dist/config-center/facade.js +1 -1
- package/dist/config-center/hot-keys-registry.d.ts +11 -4
- package/dist/config-center/hot-keys-registry.js +11 -7
- package/dist/config-center/http-client.d.ts +17 -9
- package/dist/config-center/http-client.js +27 -36
- package/dist/config-center/restart-signal.d.ts +21 -14
- package/dist/config-center/restart-signal.js +16 -22
- package/dist/config-center/skills-mcp.d.ts +4 -1
- package/dist/config-center/skills-mcp.js +2 -2
- package/dist/config-center/types.d.ts +3 -3
- package/dist/config-invariants.d.ts +2 -2
- package/dist/config-invariants.js +0 -8
- package/dist/config-lkg.d.ts +47 -8
- package/dist/config-lkg.js +107 -20
- package/dist/config-provider.d.ts +8 -7
- package/dist/config-provider.js +5 -5
- package/dist/config-types.d.ts +30 -11
- package/dist/config.js +11 -13
- package/dist/cross-session-settings.js +1 -1
- package/dist/fleet-client.d.ts +8 -8
- package/dist/fleet-client.js +7 -7
- package/dist/fleet-lease.d.ts +11 -11
- package/dist/fleet-lease.js +17 -13
- package/dist/host-lsp-manager.d.ts +29 -0
- package/dist/host-lsp-manager.js +14 -0
- package/dist/hosted-posture.d.ts +49 -93
- package/dist/hosted-posture.js +1 -25
- package/dist/http/active-run-conflict.d.ts +2 -12
- package/dist/http/active-run-conflict.js +1 -6
- package/dist/http/admission.js +8 -0
- package/dist/http/resume-legs.d.ts +1 -1
- package/dist/http/resume-legs.js +14 -10
- package/dist/http/route-ctx.d.ts +2 -2
- package/dist/http/routes/approvals-assistant.d.ts +1 -1
- package/dist/http/routes/approvals-assistant.js +2 -2
- package/dist/http/routes/memory-compliance.js +5 -0
- package/dist/http/routes/memory-origin.js +5 -0
- package/dist/http/routes/sessions.js +6 -0
- package/dist/http/routes/tasks.js +7 -6
- package/dist/http/server.d.ts +6 -5
- package/dist/http/wire-types.d.ts +6 -3
- package/dist/leader/wire.d.ts +20 -12
- package/dist/leader/wire.js +7 -6
- package/dist/memory-layer-preflight.d.ts +46 -0
- package/dist/memory-layer-preflight.js +121 -0
- package/dist/memory-operator-faces.js +17 -1
- package/dist/observability/corrupt-read-seat.d.ts +21 -4
- package/dist/observability/corrupt-read-seat.js +31 -0
- package/dist/observability/fail-open.d.ts +8 -4
- package/dist/observability/fail-open.js +8 -4
- package/dist/observability/run-terminal.js +1 -0
- package/dist/observability/secret-env-scrub.d.ts +3 -26
- package/dist/observability/secret-env-scrub.js +3 -2
- package/dist/orchestration/workflow-completion-inbox.d.ts +31 -23
- package/dist/orchestration/workflow-completion-inbox.js +8 -3
- package/dist/plugins/approval-ask-store-file.d.ts +20 -2
- package/dist/plugins/approval-ask-store-file.js +21 -3
- package/dist/plugins/approval-ask-store-memory.d.ts +2 -0
- package/dist/plugins/approval-ask-store-memory.js +39 -13
- package/dist/plugins/approval-ask-store-sql.d.ts +24 -5
- package/dist/plugins/approval-ask-store-sql.js +27 -3
- package/dist/plugins/checkpoint-store-sql.d.ts +9 -3
- package/dist/plugins/checkpoint-store-sql.js +19 -2
- package/dist/plugins/local-checkpoint-store.js +2 -0
- package/dist/plugins/mailbox-store-sql.d.ts +7 -5
- package/dist/plugins/mailbox-store-sql.js +6 -4
- package/dist/plugins/permission-rule-store-file.js +3 -2
- package/dist/plugins/remote-env-host.d.ts +3 -1
- package/dist/plugins/remote-env-host.js +3 -2
- package/dist/plugins/sql-json-column.d.ts +16 -3
- package/dist/plugins/sql-json-column.js +15 -4
- package/dist/plugins/web-search.d.ts +42 -22
- package/dist/plugins/web-search.js +141 -49
- package/dist/project-memory.d.ts +28 -1
- package/dist/project-memory.js +22 -22
- package/dist/run-local.js +6 -7
- package/dist/runs.js +6 -5
- package/dist/runtime-caps-resolver.d.ts +8 -8
- package/dist/runtime-caps-resolver.js +16 -14
- package/dist/runtime-governance.d.ts +50 -3
- package/dist/runtime-governance.js +5 -0
- package/dist/sealed-key.js +3 -7
- package/dist/server-secret-env.d.ts +43 -0
- package/dist/server-secret-env.js +18 -0
- package/dist/task-settings.d.ts +1 -1
- package/dist/tool-approval.d.ts +144 -9
- package/dist/tool-approval.js +74 -18
- package/dist/trace/core-keyset-guard.d.ts +5 -5
- package/dist/trace/ledger-sink.js +2 -2
- package/dist/trace/project.d.ts +13 -0
- package/dist/trace/project.js +22 -5
- package/dist/trace/projection-drop.d.ts +2 -0
- package/dist/trace/projection-drop.js +6 -0
- package/dist/trace/sema-provenance.d.ts +4 -1
- package/dist/trace/sema-provenance.js +1 -1
- package/dist/trace/task-notification-facets.d.ts +65 -0
- package/dist/trace/task-notification-facets.js +31 -0
- package/dist/trace/wire-projection-faces.d.ts +3 -3
- package/dist/trace/wire-projection-faces.js +3 -3
- package/package.json +5 -4
package/dist/boot/leader.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { createLeaderEndpoint } from "../leader/endpoint.js";
|
|
2
2
|
import { createLeaderRunner } from "../leader/wire.js";
|
|
3
3
|
import { buildDeploymentPostureSeats } from "./runner-deps.js";
|
|
4
|
+
import { hasApprovalListIntent } from "../approval.js";
|
|
4
5
|
export function leaderK8sMinioGap(leaderEnabled, leaderProvider, hasS3) {
|
|
5
6
|
if (!(leaderEnabled && leaderProvider === "k8s" && !hasS3))
|
|
6
7
|
return null;
|
|
@@ -67,16 +68,18 @@ export function createLeaderFace(ctx) {
|
|
|
67
68
|
...(toolResultStore ? { toolResultStore } : {}),
|
|
68
69
|
...(leaderProvider === "k8s" ? { workspace: "/workspace" } : {}),
|
|
69
70
|
sessionStore,
|
|
70
|
-
...(checkpointStore
|
|
71
|
+
...(checkpointStore
|
|
71
72
|
? {
|
|
72
|
-
durable:
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
73
|
+
durable: () => hasApprovalListIntent(config)
|
|
74
|
+
? {
|
|
75
|
+
checkpointStore,
|
|
76
|
+
requireApproval: config.approvalRequire,
|
|
77
|
+
deny: config.approvalDeny,
|
|
78
|
+
autoBudget: config.approvalAutoBudget,
|
|
79
|
+
neverAuto: config.approvalNeverAuto,
|
|
80
|
+
...(config.approvalTimeoutSec > 0 ? { ttlMs: config.approvalTimeoutSec * 1000 } : {}),
|
|
81
|
+
}
|
|
82
|
+
: undefined,
|
|
80
83
|
}
|
|
81
84
|
: {}),
|
|
82
85
|
}), {
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { RestartSliceCtx } from "../config-center/restart-signal.js";
|
|
1
2
|
import { type ConsolidationDriverRunRow, type ConsolidationRunReceipt, type MemoryBackend, type MemoryConsolidationDriverDeps, type RunMemoryConsolidationOptions, type SessionCaptureRecordStore } from "@sema-agent/core";
|
|
2
3
|
/** D3 投影的座标签闭集。`role:<name>` 里的 name 只可能是 core 的 role 链两跳之一。 */
|
|
3
4
|
export type ConsolidationSeatLabel = "explicit" | "role:consolidate" | "role:summarize";
|
|
@@ -30,6 +31,43 @@ export interface ConsolidationDriverSeat {
|
|
|
30
31
|
* (探针只构造闭包、不发任何请求、无副作用。)
|
|
31
32
|
*/
|
|
32
33
|
export declare function resolveConsolidationDriverSeat(deps: MemoryConsolidationDriverDeps): ConsolidationDriverSeat;
|
|
34
|
+
/**
|
|
35
|
+
* S-668 波 0([ref] §3)—— 整理驱动席的 **restart 读数**。过渡件:**波 1 转热后删**(那时每轮 run 起手
|
|
36
|
+
* 现取当前代的席,不再有 boot 烤死的席,这只表也就没有要比的东西了)。
|
|
37
|
+
*
|
|
38
|
+
* ## 为什么要它
|
|
39
|
+
*
|
|
40
|
+
* 席位在 boot 期解析一次(本模块头注「座在启动期解析一次」),core 的解析器把它选中的那只 `Model` 对象焊进
|
|
41
|
+
* chat 闭包。refresh 拍对模型面的热换(`mutateInPlace` + `swapDeps`)换的是目录里的**值**,够不到那只对象
|
|
42
|
+
* ⇒ 中心改了 roles / 档位绑定 / 那条目录条目之后,整理跑仍打 boot 那一代。修前没有任何一片签它 —— 它唯一
|
|
43
|
+
* 沾边的 `models-tiers` 片在生产上恒被摘除(今已退役)—— 于是这块是「静默冷」:既不热应用、也不报重启。
|
|
44
|
+
*
|
|
45
|
+
* ## 读法:问 core 的**同一只**解析器,不抄它的 role 链
|
|
46
|
+
*
|
|
47
|
+
* 席位 = `consolidate → summarize(含 flash 档位缺省)` 那条链对「env 角色底 + 中心目录 + 档位表」解出来的
|
|
48
|
+
* 那只 Model;本层抄一份链就是第二真源({@link seatLabel} 注里同一条理由)。做法:拿活配置调
|
|
49
|
+
* `resolveMemoryConsolidationDriver`,brain 与 per-model 凭据席都换成探针,再调一次它交回的 `chat` ——
|
|
50
|
+
* core 的 chat 第一件事就是拿**它选中的那只 Model** 问凭据席(`deps.getApiKeyAndHeaders?.(resolved)`,在
|
|
51
|
+
* 第一个 await 之前同步求值),探针在那一刻记下它并抛停:零请求、零副作用。
|
|
52
|
+
* ⚠️ 这一步依赖 core chat 闭包的**行为次序**:哪天 core 改成先做别的再问凭据席,探针就截不到 —— 那一刻本函数
|
|
53
|
+
* **响亮抛**(boot 期抛 = 阀门开着的部署拒启,句子说清原因),不退化成「读不到就当没变」(那正是本件要消灭的
|
|
54
|
+
* 静默)。钉:test/memory-consolidation-driver.test.ts 的探针格对真 core 跑,提货批当场红。
|
|
55
|
+
*
|
|
56
|
+
* ## 指纹里有什么
|
|
57
|
+
*
|
|
58
|
+
* 整只 Model 减掉 `cost`:整理跑只读 usage 的 token 数、零处读价目(core 7.29.0 的 driver 实现零 `cost` /
|
|
59
|
+
* `pricing` 读点),纯改价不该造一次重启。解不出来(中心撤掉了 consolidate / summarize 两跳)⇒ 记成
|
|
60
|
+
* `{ unresolvable: <core 原句> }`,与 boot 那只不等 ⇒ 签重启;重启会在 D1 拒启、把同一句原句写进拒因 ——
|
|
61
|
+
* 那正是运维该看见的话,比「这台还在用一只中心已经撤掉的席」诚实。
|
|
62
|
+
*/
|
|
63
|
+
export interface ConsolidationSeatWatch {
|
|
64
|
+
/** boot 烤进去的席 vs 活配置此刻会解出的席(`restartReasons` 的 `memory-consolidation` 片两侧读数)。 */
|
|
65
|
+
read(): NonNullable<RestartSliceCtx["consolidationSeat"]>;
|
|
66
|
+
}
|
|
67
|
+
/** 解席的输入面 = boot 期真席用的同三件(活引用:refresh 就地换代,`read()` 每次现取)。 */
|
|
68
|
+
export type ConsolidationSeatPlane = Pick<MemoryConsolidationDriverDeps, "models" | "tiers" | "roles">;
|
|
69
|
+
/** `create*`:返回带捕获状态(boot 那只指纹)的活对象。须在真席解析的**同一时刻**调(同一份输入)。 */
|
|
70
|
+
export declare function createConsolidationSeatWatch(plane: () => ConsolidationSeatPlane): ConsolidationSeatWatch;
|
|
33
71
|
/**
|
|
34
72
|
* **每 scope 单飞**(codex 交叉复审 [high],验真后修)—— 同一 scope 上在飞的那一轮被后来者**并入**,
|
|
35
73
|
* 而不是各起一轮。`create*`:返回带状态的活对象。
|
|
@@ -16,6 +16,41 @@ export function resolveConsolidationDriverSeat(deps) {
|
|
|
16
16
|
}
|
|
17
17
|
return { options, seat: seatLabel(deps), model: options.model };
|
|
18
18
|
}
|
|
19
|
+
export function createConsolidationSeatWatch(plane) {
|
|
20
|
+
const baked = consolidationSeatFingerprint(plane());
|
|
21
|
+
return { read: () => ({ baked, current: consolidationSeatFingerprint(plane()) }) };
|
|
22
|
+
}
|
|
23
|
+
function consolidationSeatFingerprint(plane) {
|
|
24
|
+
const stop = new Error("consolidation seat probe: stopped before any request");
|
|
25
|
+
const refuse = () => {
|
|
26
|
+
throw stop;
|
|
27
|
+
};
|
|
28
|
+
const probeBrain = { stream: refuse, complete: refuse };
|
|
29
|
+
const seen = {};
|
|
30
|
+
let options;
|
|
31
|
+
try {
|
|
32
|
+
options = resolveMemoryConsolidationDriver({
|
|
33
|
+
...plane,
|
|
34
|
+
brain: probeBrain,
|
|
35
|
+
getApiKeyAndHeaders: (model) => {
|
|
36
|
+
seen.model = model;
|
|
37
|
+
throw stop;
|
|
38
|
+
},
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
catch (err) {
|
|
42
|
+
return { unresolvable: err instanceof Error ? err.message : String(err) };
|
|
43
|
+
}
|
|
44
|
+
void options.chat({ system: "", user: "", maxTokens: 1, temperature: 0 }).catch(() => undefined);
|
|
45
|
+
if (seen.model === undefined) {
|
|
46
|
+
throw new Error("MEMORY_CONSOLIDATION_DRIVER=on, but the consolidation seat's restart probe could not observe which model the " +
|
|
47
|
+
"engine's seat resolver chose (the resolved chat seat no longer asks the per-model credential seat before its " +
|
|
48
|
+
"first await) — refusing rather than leave this seat's restart signal blind. This is an engine-pickup defect " +
|
|
49
|
+
"in boot/memory-consolidation.ts (createConsolidationSeatWatch), not a deployment setting.");
|
|
50
|
+
}
|
|
51
|
+
const { cost: _cost, ...route } = seen.model;
|
|
52
|
+
return route;
|
|
53
|
+
}
|
|
19
54
|
function seatLabel(deps) {
|
|
20
55
|
if (deps.memoryConsolidationDriver?.chat !== undefined)
|
|
21
56
|
return "explicit";
|
|
@@ -54,7 +54,8 @@ export interface OrgMemoryAdmissionWiring {
|
|
|
54
54
|
/** §7 第二消费者收编:同一个目录实例也喂 memory-policy 面的 `org:` 属主门(`ServiceDeps.orgMemoryDirectory`)。
|
|
55
55
|
* **同实例**是这条收编的全部意义——「谁属于 org:acme」在一个进程里必须只有一个答案,两面共享同一份
|
|
56
56
|
* TTL 缓存/退避窗/gen 高水位;各建各的目录会让准入门与策略面在吊销窗内公开分歧。缺席=无目录源
|
|
57
|
-
* (单用户/无 center 且无 env 表)⇒ 策略面逐字保持收编前的 operator-only 行为。
|
|
57
|
+
* (单用户/无 center 且无 env 表)⇒ 策略面逐字保持收编前的 operator-only 行为。
|
|
58
|
+
* 远程腿的这一个实例内部按中心凭证身份分箱([ref] E-15):两面问到的是同一身份的同一箱。 */
|
|
58
59
|
directory: OrgMemoryDirectory | undefined;
|
|
59
60
|
}
|
|
60
61
|
/** 依赖收窄到真实消费面(warn/inc 各一手)——接口隔离让测试用真形字面量,零铸形([ref] §1)。 */
|
package/dist/boot/org-memory.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { fetchPrincipalOrgMemory } from "../config-center/http-client.js";
|
|
2
|
+
import { createIdentityBins } from "../center-credential.js";
|
|
2
3
|
import { createMemoryScopeAdmission, createOrgMemoryDirectory, parseOrgDirectoryStatic } from "../org-memory-admission.js";
|
|
3
4
|
const ORG_PREFIX = "org:";
|
|
4
5
|
function collectDeploymentOrgScopes(config) {
|
|
@@ -25,11 +26,14 @@ export function createOrgMemoryAdmissionWiring(opts) {
|
|
|
25
26
|
});
|
|
26
27
|
}
|
|
27
28
|
const directory = centerLeg !== undefined
|
|
28
|
-
?
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
29
|
+
? (() => {
|
|
30
|
+
const directoryNow = createIdentityBins(centerLeg.credential, (credential) => createOrgMemoryDirectory({
|
|
31
|
+
fetchSection: (principal) => fetchPrincipalOrgMemory({ baseUrl: centerLeg.baseUrl, credential }, principal, fetch, centerLeg.worker),
|
|
32
|
+
grantTtlMs: config.memoryOrgGrantTtlMs,
|
|
33
|
+
unavailableBackoffMs: config.memoryOrgUnavailableBackoffMs,
|
|
34
|
+
}));
|
|
35
|
+
return { lookup: (principal) => directoryNow().lookup(principal) };
|
|
36
|
+
})()
|
|
33
37
|
: staticJson !== undefined
|
|
34
38
|
? createOrgMemoryDirectory({
|
|
35
39
|
staticTable: parseOrgDirectoryStatic(staticJson),
|
|
@@ -79,7 +79,6 @@ export interface ResolveSpecCtx {
|
|
|
79
79
|
*/
|
|
80
80
|
approverSeat: RunnerDepsOnAsk | undefined;
|
|
81
81
|
approvalExemptionStore: ReturnType<StoreBackend["approvalExemption"]> | undefined;
|
|
82
|
-
singleUserAutoAcceptBaseline: boolean;
|
|
83
82
|
checkpointStore: ReturnType<NonNullable<StoreBackend["checkpoint"]>> | undefined;
|
|
84
83
|
deploymentHooks: NonNullable<RunnerDeps["hooks"]>;
|
|
85
84
|
imageIndex: ReturnType<NonNullable<StoreBackend["imageIndex"]>> | undefined;
|
|
@@ -10,6 +10,7 @@ import { stampHandsLane, toolPolicyForHands } from "../capabilities/hands-lane.j
|
|
|
10
10
|
import { buildNoticeLaneFacts, shouldDiscloseNoPersistentMemory, withNoPersistentMemoryNotice } from "../capabilities/memory-notice.js";
|
|
11
11
|
import { applyLongtailDefer } from "../capabilities/tool-defer.js";
|
|
12
12
|
import { assertGuardPatternsUsable, buildOnlySensitiveBaselineWarning, createApprovalBaselinePolicy, createDeploymentGovernanceInputs } from "../deployment-governance.js";
|
|
13
|
+
import { singleUserAutoAcceptBaselineApplies } from "../approval.js";
|
|
13
14
|
import { acceptShellScratchpadDir, buildEnvFacts, egressForRemoteExec, ensureScratchpadDir, resumeFactsForLane, scratchpadCoveringTaskRoot } from "../env-facts.js";
|
|
14
15
|
import { FleetEventBus } from "../fleet/fleet-bus.js";
|
|
15
16
|
import { composeHooks, createTaskHooks } from "../hooks/hook-runner.js";
|
|
@@ -40,9 +41,9 @@ import { executionLaneCaps, executionLaneHomeDir, executionLaneOf } from "../exe
|
|
|
40
41
|
import { effectiveMemoryPersistenceCapable } from "./memory-boundary.js";
|
|
41
42
|
import { memoryFaceMounted } from "../memory-scope.js";
|
|
42
43
|
export function createResolveSpec(ctx) {
|
|
43
|
-
const { config, logger, metrics, localRoot, scenarios, principalCaps, centerRuntimeCapsResolver, getCenterPrompts, getKeyResolver, taskAttachmentStore, perSessionCwd, setSessionCwd, setSessionShellEnv, fenceSessionOwner, hookLlm, hookAgent, fleetBus, hookWakeBus, noteSessionShellGate, resumeAnchorStore, ownerAware, taskLimitCaps, taskTimeoutSec, selectEnvTool, sendUserFileToolSpec, memoryEngine, durableEnabled, approvalExemptionStore,
|
|
44
|
+
const { config, logger, metrics, localRoot, scenarios, principalCaps, centerRuntimeCapsResolver, getCenterPrompts, getKeyResolver, taskAttachmentStore, perSessionCwd, setSessionCwd, setSessionShellEnv, fenceSessionOwner, hookLlm, hookAgent, fleetBus, hookWakeBus, noteSessionShellGate, resumeAnchorStore, ownerAware, taskLimitCaps, taskTimeoutSec, selectEnvTool, sendUserFileToolSpec, memoryEngine, durableEnabled, approvalExemptionStore, checkpointStore, deploymentHooks, imageIndex, perTaskImage, sessionEnvSelection, liveQuestionFace, approverSeat, lockedKeys, } = ctx;
|
|
44
45
|
assertGuardPatternsUsable(config);
|
|
45
|
-
const onlySensitiveBaseline = buildOnlySensitiveBaselineWarning(config, { durableEnabled, singleUserAutoAcceptBaseline });
|
|
46
|
+
const onlySensitiveBaseline = buildOnlySensitiveBaselineWarning(config, { durableEnabled, singleUserAutoAcceptBaseline: singleUserAutoAcceptBaselineApplies(config) });
|
|
46
47
|
const realTaskRootOf = (auth) => {
|
|
47
48
|
if (isSandboxPathAdjudicationLane(config.remoteExec?.provider))
|
|
48
49
|
return undefined;
|
|
@@ -421,7 +422,7 @@ export function createResolveSpec(ctx) {
|
|
|
421
422
|
}
|
|
422
423
|
: {}),
|
|
423
424
|
})
|
|
424
|
-
:
|
|
425
|
+
: singleUserAutoAcceptBaselineApplies(config)
|
|
425
426
|
? createApprovalBaselinePolicy(config)
|
|
426
427
|
: undefined),
|
|
427
428
|
...(durableEnabled
|
|
@@ -5,8 +5,8 @@
|
|
|
5
5
|
* `deps-literal-shape-gate` 的顶层条件展开门覆盖面不变);新增的只有 import 与包壳。
|
|
6
6
|
*
|
|
7
7
|
* ⚠️ **位置即契约**:必须晚于 stores/exec-env/coordinators/workflow 段(所有键都是它们的产物),
|
|
8
|
-
* 且早于 `new Runner(runnerDeps)` —— Runner
|
|
9
|
-
*
|
|
8
|
+
* 且早于 `new Runner(runnerDeps)` —— Runner 构造时展开 tier 表成私有目录副本(之后的换代经
|
|
9
|
+
* `Runner.swapDeps` 换进,见 boot/stage-08-reapers.ts)。
|
|
10
10
|
* `getRunStore()` 是唯一的晚绑取值(runStore 在本段之后才构造),原文靠同作用域前向引用。
|
|
11
11
|
*/
|
|
12
12
|
import { type CacheBreakFinding, type RunnerDeps, type WorkflowRunStore, type AskOutcome } from "@sema-agent/core";
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import { applyGovernedVerdictAbsenceWarning, applyLocalAutoModeDeny, applyMemoryOptOutGrant, applyObserverEnvOptIn, centerEntitlementSourceWired, createPrincipalEntitlementsClient,
|
|
1
|
+
import { applyGovernedVerdictAbsenceWarning, applyLocalAutoModeDeny, applyMemoryOptOutGrant, applyObserverEnvOptIn, centerEntitlementSourceWired, createPrincipalEntitlementsClient, } from "../runtime-caps-resolver.js";
|
|
2
|
+
import { scopedTokenNeedsWorker } from "../center-credential.js";
|
|
2
3
|
export function assertMemoryCapturePolicyWirable(input) {
|
|
3
4
|
if (input.policy !== "governed")
|
|
4
5
|
return;
|
|
@@ -36,15 +37,14 @@ export function createRuntimeCaps(ctx) {
|
|
|
36
37
|
reason: "MEMORY_CAPTURE_POLICY=governed with NO local memory_optout_grant table: the only verdict source is the config center, and `allowMemoryOptOut` is an OPTIONAL entitlement key — for any principal whose caps omit it the verdict is ABSENT and core refuses that session's memory.capture:\"off\" (memory.capture_optout_denied, fail-closed). ANONYMOUS/system runs are worse off still: the center source is per-principal and is never consulted without an identity, so on this shape a principal-less run can never obtain a verdict at all. Verify the center emits allowMemoryOptOut for every principal, or wire a SQL backend (DB_BACKEND=mysql|pg) so the grant table answers (its deployment-default row also covers anonymous runs).",
|
|
37
38
|
});
|
|
38
39
|
}
|
|
39
|
-
if (centerEntitlementSourceWired(config) && config.configCenter && scopedTokenNeedsWorker(config.configCenter.
|
|
40
|
+
if (centerEntitlementSourceWired(config) && config.configCenter && scopedTokenNeedsWorker(config.configCenter.credential.read(), config.configCenter.worker)) {
|
|
40
41
|
logger.warn("runtime_caps_scoped_token_no_worker", {
|
|
41
42
|
reason: "SEMA_REGISTRY_TOKEN is a worker-scoped wpt_ token but SEMA_REGISTRY_WORKER is unset → center 403s per-principal caps → ALL workflow self-orchestration will be fail-closed denied. Set SEMA_REGISTRY_WORKER (the orchestrator normally injects it) or use the full SERVICE_PULL_TOKEN.",
|
|
42
43
|
});
|
|
43
44
|
}
|
|
44
45
|
const principalCaps = centerEntitlementSourceWired(config) && config.configCenter
|
|
45
46
|
? createPrincipalEntitlementsClient({
|
|
46
|
-
|
|
47
|
-
token: config.configCenter.token,
|
|
47
|
+
center: config.configCenter,
|
|
48
48
|
...(config.configCenter.worker ? { worker: config.configCenter.worker } : {}),
|
|
49
49
|
onError: (err, principal) => logger.warn("runtime_caps_resolve_failed", { principal, err: String(err) }),
|
|
50
50
|
})
|
|
@@ -5,7 +5,7 @@ export declare function runStage05(ctx: Awaited<ReturnType<typeof runStage04>>):
|
|
|
5
5
|
dropSessionScoped: (sid: string) => void;
|
|
6
6
|
executionEnvFactory: import("@sema-agent/core").ExecutionEnvFactory | undefined;
|
|
7
7
|
fenceSessionOwner: (sid: string, owner: string | null) => void;
|
|
8
|
-
lspManager: import("
|
|
8
|
+
lspManager: import("@sema-agent/core").NodeLspManager | import("../lsp/manager.js").E2bLspManager | undefined;
|
|
9
9
|
perSessionCwd: Map<string, string>;
|
|
10
10
|
perTaskImage: import("../per-task-image.js").PerTaskImageRegistry;
|
|
11
11
|
sendUserFileTaskEnvs: import("../capabilities/sandbox-file-send.js").TaskEnvRegistry | undefined;
|
|
@@ -13,6 +13,7 @@ export declare function runStage06(ctx: Awaited<ReturnType<typeof runStage05>>):
|
|
|
13
13
|
approvalAskAudit: import("../approval-ask-audit-store.js").FileApprovalAskAuditStore | undefined;
|
|
14
14
|
centerRuntimeCapsResolver: ((principal: string | undefined) => Promise<import("@sema-agent/core").RuntimeCaps | undefined>) | undefined;
|
|
15
15
|
checkpointStore: import("../plugins/store-backend.js").CheckpointStoreFull | undefined;
|
|
16
|
+
consolidationSeatWatch: import("./memory-consolidation.js").ConsolidationSeatWatch | undefined;
|
|
16
17
|
durableEnabled: boolean;
|
|
17
18
|
elicitation: import("../elicitation.js").ElicitationCoordinator | undefined;
|
|
18
19
|
fleetBus: import("../fleet/fleet-bus.js").FleetEventBus;
|
|
@@ -33,7 +34,6 @@ export declare function runStage06(ctx: Awaited<ReturnType<typeof runStage05>>):
|
|
|
33
34
|
retentionLaneStore: import("../plugins/retention-lane-store-sql.js").RetentionLaneStore | undefined;
|
|
34
35
|
runner: Runner;
|
|
35
36
|
runnerDeps: import("@sema-agent/core").RunnerDeps;
|
|
36
|
-
runnerTierFrozen: boolean;
|
|
37
37
|
runtimeCapsPeekResolver: import("../runtime-caps-resolver.js").EntitlementsResolverFn | undefined;
|
|
38
38
|
sendFileLedger: import("../plugins/send-file-ledger.js").SendFileLedger | undefined;
|
|
39
39
|
sendUserFileEmitter: import("../capabilities/send-user-file-tool.js").SendUserFileEmitter | undefined;
|
|
@@ -66,7 +66,7 @@ export declare function runStage06(ctx: Awaited<ReturnType<typeof runStage05>>):
|
|
|
66
66
|
dropSessionScoped: (sid: string) => void;
|
|
67
67
|
executionEnvFactory: import("@sema-agent/core").ExecutionEnvFactory | undefined;
|
|
68
68
|
fenceSessionOwner: (sid: string, owner: string | null) => void;
|
|
69
|
-
lspManager: import("
|
|
69
|
+
lspManager: import("@sema-agent/core").NodeLspManager | import("../lsp/manager.js").E2bLspManager | undefined;
|
|
70
70
|
perSessionCwd: Map<string, string>;
|
|
71
71
|
perTaskImage: import("../per-task-image.js").PerTaskImageRegistry;
|
|
72
72
|
sendUserFileTaskEnvs: import("../capabilities/sandbox-file-send.js").TaskEnvRegistry | undefined;
|
|
@@ -10,7 +10,7 @@ import { workflowModelAllowlistFor } from "../task-workflow.js";
|
|
|
10
10
|
import { backendOwnsControlPlane } from "../memory-operator-faces.js";
|
|
11
11
|
import { createHookLlm, buildHookFailureText } from "../hooks/hook-llm.js";
|
|
12
12
|
import { assertRetentionLaneWirable } from "./retention-lane.js";
|
|
13
|
-
import { assertConsolidationDriverWirable, buildConsolidationValveAudit, createMemoryConsolidationFaces, resolveConsolidationDriverSeat } from "./memory-consolidation.js";
|
|
13
|
+
import { assertConsolidationDriverWirable, buildConsolidationValveAudit, createConsolidationSeatWatch, createMemoryConsolidationFaces, resolveConsolidationDriverSeat } from "./memory-consolidation.js";
|
|
14
14
|
import { createPerModelAuthSeat } from "./side-query-lane.js";
|
|
15
15
|
import { createWorkflowOrchestration } from "./workflow-orchestration.js";
|
|
16
16
|
import { createLiveCoordinators } from "./coordinators.js";
|
|
@@ -72,6 +72,7 @@ export function runStage06(ctx) {
|
|
|
72
72
|
getApiKeyAndHeaders: createPerModelAuthSeat(() => configCenter.getKeyResolver()),
|
|
73
73
|
})
|
|
74
74
|
: undefined;
|
|
75
|
+
const consolidationSeatWatch = consolidationSeat ? createConsolidationSeatWatch(() => ({ models: config.models, tiers: config.tiers, roles: config.roles })) : undefined;
|
|
75
76
|
const memoryConsolidationFaces = consolidationSeat && memoryEngine
|
|
76
77
|
? createMemoryConsolidationFaces(memoryEngine, {
|
|
77
78
|
seat: consolidationSeat,
|
|
@@ -130,7 +131,6 @@ export function runStage06(ctx) {
|
|
|
130
131
|
});
|
|
131
132
|
const runner = new Runner(runnerDeps);
|
|
132
133
|
const handslessRunner = new Runner(withoutExecutionEnv(runnerDeps));
|
|
133
|
-
const runnerTierFrozen = Object.keys(config.tiers).length > 0;
|
|
134
134
|
const { hookModelFor, hookLlm } = createHookLlm({ config, getKeyResolver: () => configCenter.getKeyResolver(), metrics });
|
|
135
135
|
const hookAgentRunner = new Runner({ ...runnerDeps, sessionStore: new TtlSessionStore({ defaultTtlDays: 1 / 24 }) });
|
|
136
136
|
const agentHookCall = async ({ prompt, model, timeoutMs, system }) => {
|
|
@@ -212,6 +212,6 @@ export function runStage06(ctx) {
|
|
|
212
212
|
};
|
|
213
213
|
const subRunner = new Runner(subRunnerDeps);
|
|
214
214
|
const handslessSubRunner = new Runner(withoutExecutionEnv(subRunnerDeps));
|
|
215
|
-
return { ...ctx, approvalAskAudit, centerRuntimeCapsResolver, checkpointStore, durableEnabled, elicitation, fleetBus, governanceSeams, handslessRunner, handslessSubRunner, hookAgent, hookAgentRunner, hookLlm, mcpRevocations, memoryConsolidationFaces, memoryOptOutGrantStore, orgMemoryAdmission, outcomeSink, principalCaps, question, retentionExecutor, retentionLaneStore, runner, runnerDeps,
|
|
215
|
+
return { ...ctx, approvalAskAudit, centerRuntimeCapsResolver, checkpointStore, consolidationSeatWatch, durableEnabled, elicitation, fleetBus, governanceSeams, handslessRunner, handslessSubRunner, hookAgent, hookAgentRunner, hookLlm, mcpRevocations, memoryConsolidationFaces, memoryOptOutGrantStore, orgMemoryAdmission, outcomeSink, principalCaps, question, retentionExecutor, retentionLaneStore, runner, runnerDeps, runtimeCapsPeekResolver, sendFileLedger, sendUserFileEmitter, sendUserFileToolSpec, sessionShellGateRegistry, sessionTitler, sharedMemoryStore, sqlWorkflowRunStore, streamApprovalGate, subRunner, subRunnerSessions, subagentSteerRegistry, toolApproval, workflowAgentRegistry, workflowAgentSessionIndex, workflowCompletionInbox, workflowJournalStore, workflowModelAllowlistSnapshot, workflowNotifyGate, workflowNotifyJournal, workflowRecoverOpts, workflowRunStore, workflowsCapable };
|
|
216
216
|
}
|
|
217
217
|
//# sourceMappingURL=stage-06-runners.js.map
|
|
@@ -17,7 +17,6 @@ export declare function runStage07(ctx: Awaited<ReturnType<typeof runStage06>>):
|
|
|
17
17
|
scenarioDetails: Record<string, import("../capabilities/scenarios.js").ScenarioDetail>;
|
|
18
18
|
scenarios: Record<string, import("../capabilities/scenarios.js").Scenario>;
|
|
19
19
|
selectEnvTool: import("@sema-agent/core").ToolSpec<import("@sema-agent/core").TSchema> | undefined;
|
|
20
|
-
singleUserAutoAcceptBaseline: boolean;
|
|
21
20
|
taskLimitCaps: {
|
|
22
21
|
timeoutSec: number | undefined;
|
|
23
22
|
maxOutputTokens: number | undefined;
|
|
@@ -28,6 +27,7 @@ export declare function runStage07(ctx: Awaited<ReturnType<typeof runStage06>>):
|
|
|
28
27
|
approvalAskAudit: import("../approval-ask-audit-store.js").FileApprovalAskAuditStore | undefined;
|
|
29
28
|
centerRuntimeCapsResolver: ((principal: string | undefined) => Promise<import("@sema-agent/core").RuntimeCaps | undefined>) | undefined;
|
|
30
29
|
checkpointStore: import("../plugins/store-backend.js").CheckpointStoreFull | undefined;
|
|
30
|
+
consolidationSeatWatch: import("./memory-consolidation.js").ConsolidationSeatWatch | undefined;
|
|
31
31
|
durableEnabled: boolean;
|
|
32
32
|
elicitation: import("../elicitation.js").ElicitationCoordinator | undefined;
|
|
33
33
|
fleetBus: import("../fleet/fleet-bus.js").FleetEventBus;
|
|
@@ -48,7 +48,6 @@ export declare function runStage07(ctx: Awaited<ReturnType<typeof runStage06>>):
|
|
|
48
48
|
retentionLaneStore: import("../plugins/retention-lane-store-sql.js").RetentionLaneStore | undefined;
|
|
49
49
|
runner: import("@sema-agent/core").Runner;
|
|
50
50
|
runnerDeps: import("@sema-agent/core").RunnerDeps;
|
|
51
|
-
runnerTierFrozen: boolean;
|
|
52
51
|
runtimeCapsPeekResolver: import("../runtime-caps-resolver.js").EntitlementsResolverFn | undefined;
|
|
53
52
|
sendFileLedger: import("../plugins/send-file-ledger.js").SendFileLedger | undefined;
|
|
54
53
|
sendUserFileEmitter: import("../capabilities/send-user-file-tool.js").SendUserFileEmitter | undefined;
|
|
@@ -81,7 +80,7 @@ export declare function runStage07(ctx: Awaited<ReturnType<typeof runStage06>>):
|
|
|
81
80
|
dropSessionScoped: (sid: string) => void;
|
|
82
81
|
executionEnvFactory: import("@sema-agent/core").ExecutionEnvFactory | undefined;
|
|
83
82
|
fenceSessionOwner: (sid: string, owner: string | null) => void;
|
|
84
|
-
lspManager: import("
|
|
83
|
+
lspManager: import("@sema-agent/core").NodeLspManager | import("../lsp/manager.js").E2bLspManager | undefined;
|
|
85
84
|
perSessionCwd: Map<string, string>;
|
|
86
85
|
perTaskImage: import("../per-task-image.js").PerTaskImageRegistry;
|
|
87
86
|
sendUserFileTaskEnvs: import("../capabilities/sandbox-file-send.js").TaskEnvRegistry | undefined;
|
|
@@ -6,7 +6,7 @@ import { parseCapEnv, parseNumOrFailNonNegative } from "../config.js";
|
|
|
6
6
|
import { ensureChildSessionDurableWithPromotion } from "../plugins/session-store.js";
|
|
7
7
|
import { webSearchConfigFromEnv, createWebSearchBackend, shouldProbeWebSearchOnBoot } from "../plugins/web-search.js";
|
|
8
8
|
import { createAuthorizer } from "../security.js";
|
|
9
|
-
import {
|
|
9
|
+
import { buildForceDurableGateInertNotice, buildNoResponderBootWarns, gateIntentUnserviceableReason, singleUserAutoAcceptBaselineApplies } from "../approval.js";
|
|
10
10
|
import { executionLaneOf } from "../execution-lane-caps.js";
|
|
11
11
|
import { loadDeploymentSkills } from "../capabilities/skills.js";
|
|
12
12
|
import { createRepoClient } from "../capabilities/repo-tools.js";
|
|
@@ -46,9 +46,9 @@ export async function runStage07(ctx) {
|
|
|
46
46
|
maxOutputTokens: capEnv("TASK_MAX_OUTPUT_TOKENS_MAX"),
|
|
47
47
|
maxTurns: capEnv("TASK_MAX_TURNS_MAX"),
|
|
48
48
|
};
|
|
49
|
-
const
|
|
50
|
-
|
|
51
|
-
|
|
49
|
+
const gateRefusal = gateIntentUnserviceableReason(config, checkpointStore !== undefined);
|
|
50
|
+
if (gateRefusal !== undefined)
|
|
51
|
+
throw new Error(gateRefusal);
|
|
52
52
|
await reclaimOrphansAtBoot(runStore, checkpointStore, logger);
|
|
53
53
|
const imageIndex = backend?.imageIndex ? backend.imageIndex() : undefined;
|
|
54
54
|
const selectEnvTool = config.selectEnvironmentTool && config.remoteExec?.provider === "k8s" && imageIndex
|
|
@@ -79,7 +79,7 @@ export async function runStage07(ctx) {
|
|
|
79
79
|
approvalFaceWired: toolApproval !== undefined || durableEnabled,
|
|
80
80
|
}))
|
|
81
81
|
logger.warn(w.event, w.fields);
|
|
82
|
-
if (
|
|
82
|
+
if (singleUserAutoAcceptBaselineApplies(config)) {
|
|
83
83
|
logger.info("tool_policy_single_user_default", {
|
|
84
84
|
posture: "adjudicated auto-accept — ALL write/hand/MCP tool surfaces auto-allowed (core per-surface UNGATED enumeration suppressed for single-user turnkey)",
|
|
85
85
|
tighten: "APPROVAL_REQUIRE / AUTONOMY / commandPolicy (re-surfaces + gates specific surfaces)",
|
|
@@ -155,6 +155,6 @@ export async function runStage07(ctx) {
|
|
|
155
155
|
const builtinScenarioNames = Object.keys(scenarioDetails);
|
|
156
156
|
configCenter.applyCenterScenarios({ scenarioDeps, scenarios, scenarioDetails, builtinScenarioNames });
|
|
157
157
|
logger.info("capabilities", { skills: skills.length, scenarios: Object.keys(scenarios), repoTools: Boolean(repoClient) });
|
|
158
|
-
return { ...ctx, approvalExemptionStore, approvalNonceStore, authorize, imageBakes, imageIndex, parkedReviveInheritedGate, parkedReviveTool, rateLimiter, resumeAnchorStore, runStore, scenarioDetails, scenarios, selectEnvTool,
|
|
158
|
+
return { ...ctx, approvalExemptionStore, approvalNonceStore, authorize, imageBakes, imageIndex, parkedReviveInheritedGate, parkedReviveTool, rateLimiter, resumeAnchorStore, runStore, scenarioDetails, scenarios, selectEnvTool, taskLimitCaps, taskTimeoutSec, webSearchProvider: webSearchCfg?.provider };
|
|
159
159
|
}
|
|
160
160
|
//# sourceMappingURL=stage-07-capability-layer.js.map
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* 装配第 8 段 —— **后台 reaper**(§3-8)。
|
|
3
3
|
* 维护 tick(startReapers)+ 托管留存 lane(独立定时器)+ OTLP 导出 + 限额座换代口 + 五只 boot Runner 的
|
|
4
4
|
* 原子换代闭包 + config-center 刷新环与 key resolver 首建。
|
|
5
|
-
* ⚠️ 位置即契约:刷新环必须在 `new Runner` 之后(
|
|
5
|
+
* ⚠️ 位置即契约:刷新环必须在 `new Runner` 之后(它要五只 boot Runner 的换代口 `swapRunnerDeps`);
|
|
6
6
|
* key resolver 首建读的必须是 boot apply 之后的 config。
|
|
7
7
|
* 🔴 `runDenySweep` 的 holder 住在 `late-binds.ts`(赋值点在第十段的 server 之后)。
|
|
8
8
|
*/
|
|
@@ -30,7 +30,6 @@ export declare function runStage08(ctx: Awaited<ReturnType<typeof runStage07>>):
|
|
|
30
30
|
scenarioDetails: Record<string, import("../capabilities/scenarios.js").ScenarioDetail>;
|
|
31
31
|
scenarios: Record<string, import("../index.js").Scenario>;
|
|
32
32
|
selectEnvTool: import("@sema-agent/core").ToolSpec<import("@sema-agent/core").TSchema> | undefined;
|
|
33
|
-
singleUserAutoAcceptBaseline: boolean;
|
|
34
33
|
taskLimitCaps: {
|
|
35
34
|
timeoutSec: number | undefined;
|
|
36
35
|
maxOutputTokens: number | undefined;
|
|
@@ -41,6 +40,7 @@ export declare function runStage08(ctx: Awaited<ReturnType<typeof runStage07>>):
|
|
|
41
40
|
approvalAskAudit: import("../approval-ask-audit-store.js").FileApprovalAskAuditStore | undefined;
|
|
42
41
|
centerRuntimeCapsResolver: ((principal: string | undefined) => Promise<import("@sema-agent/core").RuntimeCaps | undefined>) | undefined;
|
|
43
42
|
checkpointStore: import("../plugins/store-backend.js").CheckpointStoreFull | undefined;
|
|
43
|
+
consolidationSeatWatch: import("./memory-consolidation.js").ConsolidationSeatWatch | undefined;
|
|
44
44
|
durableEnabled: boolean;
|
|
45
45
|
elicitation: import("../elicitation.js").ElicitationCoordinator | undefined;
|
|
46
46
|
fleetBus: import("../fleet/fleet-bus.js").FleetEventBus;
|
|
@@ -61,7 +61,6 @@ export declare function runStage08(ctx: Awaited<ReturnType<typeof runStage07>>):
|
|
|
61
61
|
retentionLaneStore: import("../plugins/retention-lane-store-sql.js").RetentionLaneStore | undefined;
|
|
62
62
|
runner: Runner;
|
|
63
63
|
runnerDeps: import("@sema-agent/core").RunnerDeps;
|
|
64
|
-
runnerTierFrozen: boolean;
|
|
65
64
|
runtimeCapsPeekResolver: import("../runtime-caps-resolver.js").EntitlementsResolverFn | undefined;
|
|
66
65
|
sendFileLedger: import("../plugins/send-file-ledger.js").SendFileLedger | undefined;
|
|
67
66
|
sendUserFileEmitter: import("../capabilities/send-user-file-tool.js").SendUserFileEmitter | undefined;
|
|
@@ -94,7 +93,7 @@ export declare function runStage08(ctx: Awaited<ReturnType<typeof runStage07>>):
|
|
|
94
93
|
dropSessionScoped: (sid: string) => void;
|
|
95
94
|
executionEnvFactory: import("@sema-agent/core").ExecutionEnvFactory | undefined;
|
|
96
95
|
fenceSessionOwner: (sid: string, owner: string | null) => void;
|
|
97
|
-
lspManager: import("
|
|
96
|
+
lspManager: import("@sema-agent/core").NodeLspManager | import("../lsp/manager.js").E2bLspManager | undefined;
|
|
98
97
|
perSessionCwd: Map<string, string>;
|
|
99
98
|
perTaskImage: import("../per-task-image.js").PerTaskImageRegistry;
|
|
100
99
|
sendUserFileTaskEnvs: import("../capabilities/sandbox-file-send.js").TaskEnvRegistry | undefined;
|
|
@@ -5,7 +5,7 @@ import { startRetentionLane, RETENTION_LEASE_TTL_FACTOR } from "./retention-lane
|
|
|
5
5
|
import { createLimitSync } from "./limit-sync.js";
|
|
6
6
|
import { runDenySweep } from "./late-binds.js";
|
|
7
7
|
export function runStage08(ctx) {
|
|
8
|
-
const { approvalNonceStore, backend, backgroundAgentStore, ceilingVerdict, checkpointStore, config, configCenter, costQuota, fileHistoryErasure, handslessRunner, handslessSubRunner, hookAgentRunner, imageBakes, instanceId, localRoot, logger, mailboxStore, metrics, permissionRuleStores, pricing, rateLimiter, retentionExecutor, retentionLaneStore, rosterStore, runStore, runner,
|
|
8
|
+
const { approvalNonceStore, backend, backgroundAgentStore, ceilingVerdict, checkpointStore, config, configCenter, consolidationSeatWatch, costQuota, fileHistoryErasure, handslessRunner, handslessSubRunner, hookAgentRunner, imageBakes, instanceId, localRoot, logger, mailboxStore, metrics, permissionRuleStores, pricing, rateLimiter, retentionExecutor, retentionLaneStore, rosterStore, runStore, runner, sqlWorkflowRunStore, subRunner, taskAttachmentStore, toolApproval, toolResultStore, workflowJournalStore, workflowNotifyGate, workflowNotifyJournal, workflowRecoverOpts, worktreeReap } = ctx;
|
|
9
9
|
const reaper = startReapers({
|
|
10
10
|
config, logger, metrics, localRoot, backend, subRunner, runStore, checkpointStore,
|
|
11
11
|
rateLimiter, costQuota, toolResultStore, fileHistoryErasure, taskAttachmentStore, imageBakes, worktreeReap,
|
|
@@ -71,7 +71,7 @@ export function runStage08(ctx) {
|
|
|
71
71
|
}
|
|
72
72
|
}
|
|
73
73
|
};
|
|
74
|
-
configCenter.startRefreshLoop({
|
|
74
|
+
configCenter.startRefreshLoop({ pricing, limitSync, swapRunnerDeps, ceilingVerdict, checkpointStorePresent: checkpointStore !== undefined, ...(consolidationSeatWatch !== undefined ? { consolidationSeat: consolidationSeatWatch } : {}) });
|
|
75
75
|
configCenter.initKeyResolver();
|
|
76
76
|
return { ...ctx, otelExporter, reaper, retentionLaneStarted };
|
|
77
77
|
}
|
|
@@ -64,7 +64,6 @@ export declare function runStage09(ctx: Awaited<ReturnType<typeof runStage08>>):
|
|
|
64
64
|
scenarioDetails: Record<string, import("../capabilities/scenarios.js").ScenarioDetail>;
|
|
65
65
|
scenarios: Record<string, import("../index.js").Scenario>;
|
|
66
66
|
selectEnvTool: import("@sema-agent/core").ToolSpec<import("@sema-agent/core").TSchema> | undefined;
|
|
67
|
-
singleUserAutoAcceptBaseline: boolean;
|
|
68
67
|
taskLimitCaps: {
|
|
69
68
|
timeoutSec: number | undefined;
|
|
70
69
|
maxOutputTokens: number | undefined;
|
|
@@ -75,6 +74,7 @@ export declare function runStage09(ctx: Awaited<ReturnType<typeof runStage08>>):
|
|
|
75
74
|
approvalAskAudit: import("../approval-ask-audit-store.js").FileApprovalAskAuditStore | undefined;
|
|
76
75
|
centerRuntimeCapsResolver: ((principal: string | undefined) => Promise<import("@sema-agent/core").RuntimeCaps | undefined>) | undefined;
|
|
77
76
|
checkpointStore: import("../plugins/store-backend.js").CheckpointStoreFull | undefined;
|
|
77
|
+
consolidationSeatWatch: import("./memory-consolidation.js").ConsolidationSeatWatch | undefined;
|
|
78
78
|
durableEnabled: boolean;
|
|
79
79
|
elicitation: import("../elicitation.js").ElicitationCoordinator | undefined;
|
|
80
80
|
fleetBus: import("../fleet/fleet-bus.js").FleetEventBus;
|
|
@@ -95,7 +95,6 @@ export declare function runStage09(ctx: Awaited<ReturnType<typeof runStage08>>):
|
|
|
95
95
|
retentionLaneStore: import("../plugins/retention-lane-store-sql.js").RetentionLaneStore | undefined;
|
|
96
96
|
runner: import("@sema-agent/core").Runner;
|
|
97
97
|
runnerDeps: import("@sema-agent/core").RunnerDeps;
|
|
98
|
-
runnerTierFrozen: boolean;
|
|
99
98
|
runtimeCapsPeekResolver: import("../runtime-caps-resolver.js").EntitlementsResolverFn | undefined;
|
|
100
99
|
sendFileLedger: import("../plugins/send-file-ledger.js").SendFileLedger | undefined;
|
|
101
100
|
sendUserFileEmitter: import("../capabilities/send-user-file-tool.js").SendUserFileEmitter | undefined;
|
|
@@ -128,7 +127,7 @@ export declare function runStage09(ctx: Awaited<ReturnType<typeof runStage08>>):
|
|
|
128
127
|
dropSessionScoped: (sid: string) => void;
|
|
129
128
|
executionEnvFactory: import("@sema-agent/core").ExecutionEnvFactory | undefined;
|
|
130
129
|
fenceSessionOwner: (sid: string, owner: string | null) => void;
|
|
131
|
-
lspManager: import("
|
|
130
|
+
lspManager: import("@sema-agent/core").NodeLspManager | import("../lsp/manager.js").E2bLspManager | undefined;
|
|
132
131
|
perSessionCwd: Map<string, string>;
|
|
133
132
|
perTaskImage: import("../per-task-image.js").PerTaskImageRegistry;
|
|
134
133
|
sendUserFileTaskEnvs: import("../capabilities/sandbox-file-send.js").TaskEnvRegistry | undefined;
|
|
@@ -64,7 +64,6 @@ export declare function runStage10(ctx: Awaited<ReturnType<typeof runStage09>>):
|
|
|
64
64
|
scenarioDetails: Record<string, import("../capabilities/scenarios.js").ScenarioDetail>;
|
|
65
65
|
scenarios: Record<string, import("../index.js").Scenario>;
|
|
66
66
|
selectEnvTool: import("@sema-agent/core").ToolSpec<import("@sema-agent/core").TSchema> | undefined;
|
|
67
|
-
singleUserAutoAcceptBaseline: boolean;
|
|
68
67
|
taskLimitCaps: {
|
|
69
68
|
timeoutSec: number | undefined;
|
|
70
69
|
maxOutputTokens: number | undefined;
|
|
@@ -75,6 +74,7 @@ export declare function runStage10(ctx: Awaited<ReturnType<typeof runStage09>>):
|
|
|
75
74
|
approvalAskAudit: import("../approval-ask-audit-store.js").FileApprovalAskAuditStore | undefined;
|
|
76
75
|
centerRuntimeCapsResolver: ((principal: string | undefined) => Promise<import("@sema-agent/core").RuntimeCaps | undefined>) | undefined;
|
|
77
76
|
checkpointStore: import("../plugins/store-backend.js").CheckpointStoreFull | undefined;
|
|
77
|
+
consolidationSeatWatch: import("./memory-consolidation.js").ConsolidationSeatWatch | undefined;
|
|
78
78
|
durableEnabled: boolean;
|
|
79
79
|
elicitation: import("../elicitation.js").ElicitationCoordinator | undefined;
|
|
80
80
|
fleetBus: import("../fleet/fleet-bus.js").FleetEventBus;
|
|
@@ -95,7 +95,6 @@ export declare function runStage10(ctx: Awaited<ReturnType<typeof runStage09>>):
|
|
|
95
95
|
retentionLaneStore: import("../plugins/retention-lane-store-sql.js").RetentionLaneStore | undefined;
|
|
96
96
|
runner: import("@sema-agent/core").Runner;
|
|
97
97
|
runnerDeps: import("@sema-agent/core").RunnerDeps;
|
|
98
|
-
runnerTierFrozen: boolean;
|
|
99
98
|
runtimeCapsPeekResolver: import("../runtime-caps-resolver.js").EntitlementsResolverFn | undefined;
|
|
100
99
|
sendFileLedger: import("../plugins/send-file-ledger.js").SendFileLedger | undefined;
|
|
101
100
|
sendUserFileEmitter: import("../capabilities/send-user-file-tool.js").SendUserFileEmitter | undefined;
|
|
@@ -128,7 +127,7 @@ export declare function runStage10(ctx: Awaited<ReturnType<typeof runStage09>>):
|
|
|
128
127
|
dropSessionScoped: (sid: string) => void;
|
|
129
128
|
executionEnvFactory: import("@sema-agent/core").ExecutionEnvFactory | undefined;
|
|
130
129
|
fenceSessionOwner: (sid: string, owner: string | null) => void;
|
|
131
|
-
lspManager: import("
|
|
130
|
+
lspManager: import("@sema-agent/core").NodeLspManager | import("../lsp/manager.js").E2bLspManager | undefined;
|
|
132
131
|
perSessionCwd: Map<string, string>;
|
|
133
132
|
perTaskImage: import("../per-task-image.js").PerTaskImageRegistry;
|
|
134
133
|
sendUserFileTaskEnvs: import("../capabilities/sandbox-file-send.js").TaskEnvRegistry | undefined;
|
|
@@ -23,7 +23,7 @@ import { bindServerLateSeats } from "./late-binds.js";
|
|
|
23
23
|
import { serviceVersion } from "../service-version.js";
|
|
24
24
|
import { buildDisplaySafeUrl } from "../trace/redact.js";
|
|
25
25
|
export async function runStage10(ctx) {
|
|
26
|
-
const { approvalAskAudit, approvalExemptionStore, approvalNonceStore, authorize, backend, backgroundAgentStore, brain, breakerState, centerRuntimeCapsResolver, checkpointStore, config, configCenter, costQuota, deploymentHooks, deviceLane, drainState, durableEnabled, elicitation, fenceSessionOwner, fileHistoryStore, fleetBus, fleetLease, fleetUsage, governanceSeams, handslessRunner, hookAgent, hookLlm, hookWakeBus, imageBakes, imageIndex, instanceId, instrumentDegenerate, leaderEndpoint, localRoot, logger, lspManager, mcpRevocations, memoryBundleFaces, memoryComplianceFaces, memoryConsolidationFaces, memoryEngine, memoryExportBackend, memoryOptOutGrantStore, memoryOriginFaces, memoryPosture, memorySyncCursors, metrics, modelUsageTracker, orgMemoryAdmission, otelExporter, outcomeSink, ownerAware, parkedReviveInheritedGate, parkedReviveTool, perSessionCwd, perTaskImage, planCacheProbe, pricing, principalCaps, promptManifestTracker, purgeSession, question, rateLimiter, reaper, registryJwtVerifier, resumeAnchorStore, retentionLaneStarted, retentionLaneStore, ruleConsent, runStore, runner, runnerDeps, runtimeCapsPeekResolver, scenarioDetails, scenarios, selectEnvTool, sendFileLedger, sendUserFileEmitter, sendUserFileToolSpec, sessionAudit, sessionEnvSelection, sessionMemoryStatusFace, sessionPolicyStore, sessionShellGateRegistry, sessionTitler, sessionWatchRegistry, setSessionCwd, setSessionShellEnv, sharedMemoryStore, sideQueryAccounting,
|
|
26
|
+
const { approvalAskAudit, approvalExemptionStore, approvalNonceStore, authorize, backend, backgroundAgentStore, brain, breakerState, centerRuntimeCapsResolver, checkpointStore, config, configCenter, costQuota, deploymentHooks, deviceLane, drainState, durableEnabled, elicitation, fenceSessionOwner, fileHistoryStore, fleetBus, fleetLease, fleetUsage, governanceSeams, handslessRunner, hookAgent, hookLlm, hookWakeBus, imageBakes, imageIndex, instanceId, instrumentDegenerate, leaderEndpoint, localRoot, logger, lspManager, mcpRevocations, memoryBundleFaces, memoryComplianceFaces, memoryConsolidationFaces, memoryEngine, memoryExportBackend, memoryOptOutGrantStore, memoryOriginFaces, memoryPosture, memorySyncCursors, metrics, modelUsageTracker, orgMemoryAdmission, otelExporter, outcomeSink, ownerAware, parkedReviveInheritedGate, parkedReviveTool, perSessionCwd, perTaskImage, planCacheProbe, pricing, principalCaps, promptManifestTracker, purgeSession, question, rateLimiter, reaper, registryJwtVerifier, resumeAnchorStore, retentionLaneStarted, retentionLaneStore, ruleConsent, runStore, runner, runnerDeps, runtimeCapsPeekResolver, scenarioDetails, scenarios, selectEnvTool, sendFileLedger, sendUserFileEmitter, sendUserFileToolSpec, sessionAudit, sessionEnvSelection, sessionMemoryStatusFace, sessionPolicyStore, sessionShellGateRegistry, sessionTitler, sessionWatchRegistry, setSessionCwd, setSessionShellEnv, sharedMemoryStore, sideQueryAccounting, sqlEngineFacts, sqlWorkflowRunStore, staticWiring, storeBackendDegraded, subRunner, subagentSteerRegistry, taskAttachmentStore, taskLimitCaps, taskTimeoutSec, toolApproval, toolResultStore, usageWindowStore, webSearchProvider, workflowAgentRegistry, workflowAgentSessionIndex, workflowCompletionInbox, workflowJournalStore, workflowModelAllowlistSnapshot, workflowNotifyGate, workflowNotifyJournal, workflowRecoverOpts, workflowRunStore, workflowsCapable } = ctx;
|
|
27
27
|
const stores = {
|
|
28
28
|
runStore,
|
|
29
29
|
resumeAnchorStore: resumeAnchorStore ? resumeAnchorStore : undefined,
|
|
@@ -171,7 +171,7 @@ export async function runStage10(ctx) {
|
|
|
171
171
|
hookLlm, hookAgent, fleetBus, hookWakeBus, resumeAnchorStore, ownerAware, taskLimitCaps, taskTimeoutSec,
|
|
172
172
|
noteSessionShellGate: sessionShellGateRegistry.note,
|
|
173
173
|
selectEnvTool, sendUserFileToolSpec, memoryEngine, durableEnabled, approvalExemptionStore,
|
|
174
|
-
|
|
174
|
+
checkpointStore, deploymentHooks, imageIndex, perTaskImage,
|
|
175
175
|
sessionEnvSelection,
|
|
176
176
|
lockedKeys: governanceSeams.lockedKeys,
|
|
177
177
|
liveQuestionFace: question,
|
|
@@ -78,8 +78,20 @@ export interface ApplyPluginsResult {
|
|
|
78
78
|
/** 本轮拉取失败、沿用上次成功物化的插件名。 */
|
|
79
79
|
lkgUsed: string[];
|
|
80
80
|
}
|
|
81
|
-
/**
|
|
82
|
-
*
|
|
81
|
+
/**
|
|
82
|
+
* 装载器**会物化**的插件(按声明序)—— 每条声明过**同一只**判定 {@link validatePluginDecl},只留 `ok` 的
|
|
83
|
+
* `{name, url, sha?}`。restart 指纹(`config-center/restart-signal.ts` 的 skills 片,S-668 波 0)读的就是它:
|
|
84
|
+
* 装载器不读的字段(notes / version)、整条跳过的声明(`enabled:false` / marketplace 源 / 白名单外 host / 坏形)
|
|
85
|
+
* 在这里一并消失,于是「重启之后什么都不会变」的发布不签重启(codex 对抗复审 r1 [medium]);顺序保留 ——
|
|
86
|
+
* 撞名让位按声明序,对调两条是真变化。`allowHosts` 与装载时同一份(部署事实 `PLUGINS_ALLOW_HOSTS`)。
|
|
87
|
+
*/
|
|
88
|
+
export declare function materializablePlugins(eff: {
|
|
89
|
+
plugins?: unknown;
|
|
90
|
+
}, allowHosts: readonly string[]): Array<{
|
|
91
|
+
name: string;
|
|
92
|
+
url: string;
|
|
93
|
+
sha?: string;
|
|
94
|
+
}>;
|
|
83
95
|
export declare function applyCenterPlugins(baseline: LoadedSkill[], eff: {
|
|
84
96
|
plugins?: unknown;
|
|
85
97
|
}, opts: {
|
|
@@ -113,12 +113,20 @@ export function resolvePluginSkillsRoot(cloneRoot) {
|
|
|
113
113
|
}
|
|
114
114
|
return { ok: true, dir: candidate };
|
|
115
115
|
}
|
|
116
|
+
function declaredPlugins(eff) {
|
|
117
|
+
if (Array.isArray(eff.plugins))
|
|
118
|
+
return eff.plugins;
|
|
119
|
+
const wrapped = eff.plugins?.plugins;
|
|
120
|
+
return Array.isArray(wrapped) ? wrapped : [];
|
|
121
|
+
}
|
|
122
|
+
export function materializablePlugins(eff, allowHosts) {
|
|
123
|
+
return declaredPlugins(eff).flatMap((decl) => {
|
|
124
|
+
const v = validatePluginDecl(decl, allowHosts);
|
|
125
|
+
return v.ok ? [{ name: v.name, url: v.url, ...(v.sha !== undefined ? { sha: v.sha } : {}) }] : [];
|
|
126
|
+
});
|
|
127
|
+
}
|
|
116
128
|
export async function applyCenterPlugins(baseline, eff, opts) {
|
|
117
|
-
const declared =
|
|
118
|
-
? (eff.plugins)
|
|
119
|
-
: Array.isArray(eff.plugins?.plugins)
|
|
120
|
-
? (eff.plugins.plugins)
|
|
121
|
-
: [];
|
|
129
|
+
const declared = declaredPlugins(eff);
|
|
122
130
|
const out = { skills: [...baseline], failures: [], letGo: [], lkgUsed: [] };
|
|
123
131
|
if (declared.length === 0)
|
|
124
132
|
return out;
|
|
@@ -55,6 +55,9 @@ export declare function applyCatalogToSource(source: {
|
|
|
55
55
|
/** codex-2 F2(restart-owed disable):撤下写盘失败后重启,内存 prev 丢了但持久态还 active——
|
|
56
56
|
* 以 source 自身的 live candidate 为准判「欠 disable」,不是只看内存 prev。 */
|
|
57
57
|
current?(): unknown;
|
|
58
|
+
/** S-651(codex 修复验证轮 V1):本箱**持久记录**是 active —— 即使那份 artifact 此刻加载不出(活候选为空)。
|
|
59
|
+
* 「欠撤下」的真源是持久记录;活候选只是它能加载时的影子。缺席 = 调用方不掌握持久记录(沿用前两条判据)。 */
|
|
60
|
+
persistedActive?(): boolean;
|
|
58
61
|
}, next: PromptsDomainFaces | undefined, prev: PromptsDomainFaces | undefined, log: {
|
|
59
62
|
info: (msg: string, meta?: Record<string, unknown>) => void;
|
|
60
63
|
warn: (msg: string, meta?: Record<string, unknown>) => void;
|