@sema-agent/server 7.56.0 → 7.57.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/README.md +3 -2
- package/README.zh-CN.md +2 -2
- package/USAGE.md +101 -9
- package/dist/approval-ask-audit-store.d.ts +100 -1
- package/dist/approval-ask-audit-store.js +103 -2
- package/dist/approval-card.d.ts +148 -13
- package/dist/approval-card.js +82 -13
- package/dist/approval.d.ts +31 -0
- package/dist/approval.js +18 -0
- package/dist/auto-mode-face.d.ts +111 -0
- package/dist/auto-mode-face.js +99 -0
- package/dist/bench/s1/arms.js +5 -5
- package/dist/bench/s1/live-deps.js +11 -11
- package/dist/bench/s1/run-firm.js +3 -0
- package/dist/bench/s1/runner-ctx.d.ts +4 -0
- package/dist/bench/s1/runner-ctx.js +7 -0
- package/dist/boot/config-center.js +23 -1
- package/dist/boot/coordinators.js +13 -1
- package/dist/boot/parked-revive-gate.d.ts +7 -2
- package/dist/boot/parked-revive-gate.js +12 -1
- package/dist/boot/resolve-spec.d.ts +3 -0
- package/dist/boot/resolve-spec.js +3 -1
- package/dist/boot/runner-deps.d.ts +12 -0
- package/dist/boot/runner-deps.js +28 -3
- package/dist/boot/runtime-caps.d.ts +19 -9
- package/dist/boot/runtime-caps.js +49 -21
- package/dist/boot/session-shell-gate-registry.d.ts +39 -0
- package/dist/boot/session-shell-gate-registry.js +21 -0
- package/dist/config-catalog.js +14 -5
- package/dist/config-types.d.ts +41 -10
- package/dist/config.d.ts +21 -0
- package/dist/config.js +40 -5
- package/dist/http/route-ctx.d.ts +75 -0
- package/dist/http/routes/a2a-serve.js +5 -3
- package/dist/http/routes/approvals-assistant.js +19 -6
- package/dist/http/routes/capabilities.js +21 -4
- package/dist/http/routes/memory-origin.d.ts +2 -2
- package/dist/http/routes/rules.js +3 -2
- package/dist/http/routes/runs.d.ts +0 -14
- package/dist/http/routes/runs.js +20 -8
- package/dist/http/routes/tasks.js +34 -8
- package/dist/http/routes/workflows.js +19 -4
- package/dist/http/server.d.ts +11 -1
- package/dist/http/server.js +215 -43
- package/dist/http/wire-types.d.ts +9 -4
- package/dist/leader/diffout.js +2 -1
- package/dist/leader/endpoint.js +45 -12
- package/dist/leader/fanout.js +6 -5
- package/dist/leader/leader.js +17 -14
- package/dist/leader/merge.js +17 -12
- package/dist/leader/planner.js +3 -2
- package/dist/leader/repair-oracle.js +6 -4
- package/dist/leader/repair-wire.js +5 -3
- package/dist/leader/wire.d.ts +30 -1
- package/dist/leader/wire.js +36 -19
- package/dist/main.js +43 -7
- package/dist/observability/err-text.d.ts +6 -0
- package/dist/observability/err-text.js +10 -0
- package/dist/observability/fail-open.d.ts +40 -0
- package/dist/observability/fail-open.js +19 -0
- package/dist/observability/metrics.js +1 -1
- package/dist/observability/run-terminal-log.d.ts +120 -0
- package/dist/observability/run-terminal-log.js +360 -0
- package/dist/orchestration/workflow-completion-inbox.d.ts +9 -0
- package/dist/orchestration/workflow-completion-inbox.js +8 -0
- package/dist/permission-rule-vocab.d.ts +40 -0
- package/dist/permission-rule-vocab.js +17 -0
- package/dist/plugins/checkpoint-store-sql.d.ts +14 -0
- package/dist/plugins/checkpoint-store-sql.js +19 -3
- package/dist/plugins/file-run-store.d.ts +3 -34
- package/dist/plugins/file-run-store.js +19 -0
- package/dist/plugins/local-checkpoint-store.d.ts +10 -0
- package/dist/plugins/local-checkpoint-store.js +3 -0
- package/dist/plugins/memory-run-store.d.ts +3 -15
- package/dist/plugins/memory-run-store.js +19 -0
- package/dist/plugins/permission-rule-store-file.js +8 -3
- package/dist/plugins/permission-rule-store-sql.js +16 -10
- package/dist/plugins/remote-scratchpad.js +3 -2
- package/dist/plugins/run-store-sql.d.ts +3 -42
- package/dist/plugins/run-store-sql.js +30 -1
- package/dist/plugins/store-backend.d.ts +1 -1
- package/dist/plugins/store-contracts.d.ts +66 -1
- package/dist/plugins/workflow-run-store-sql.d.ts +5 -0
- package/dist/plugins/workflow-run-store-sql.js +10 -2
- package/dist/rules-consent.js +20 -13
- package/dist/run-cancel-context.d.ts +13 -0
- package/dist/run-cancel-context.js +15 -0
- package/dist/run-local.js +2 -2
- package/dist/runs.d.ts +4 -1
- package/dist/runs.js +41 -10
- package/dist/runtime-caps-resolver.d.ts +133 -17
- package/dist/runtime-caps-resolver.js +41 -3
- package/dist/task-settings.d.ts +57 -3
- package/dist/task-settings.js +78 -5
- package/dist/task-workflow.d.ts +32 -2
- package/dist/task-workflow.js +8 -3
- package/dist/tool-approval.d.ts +26 -3
- package/dist/tool-approval.js +96 -13
- package/dist/trace/core-keyset-guard.d.ts +2 -2
- package/dist/trace/ledger-sink.d.ts +13 -4
- package/dist/trace/ledger-sink.js +14 -6
- package/dist/trace/project.d.ts +13 -0
- package/dist/trace/project.js +10 -1
- package/dist/trace/redact.d.ts +22 -11
- package/dist/trace/redact.js +655 -20
- package/dist/trace/sema-provenance.d.ts +26 -0
- package/dist/trace/sema-provenance.js +11 -0
- package/dist/turn-activity.d.ts +32 -2
- package/dist/turn-activity.js +29 -4
- package/package.json +2 -2
package/dist/approval-card.d.ts
CHANGED
|
@@ -49,30 +49,76 @@ export declare const MAX_RULE_OFFERS = 4;
|
|
|
49
49
|
* 几条规则),混成一个数会让「上游把 batch 放宽到 6 条成员」误伤到 offer 条数这条无关轴。
|
|
50
50
|
*/
|
|
51
51
|
export declare const MAX_RULE_OFFER_BATCH_MEMBERS = 8;
|
|
52
|
+
/**
|
|
53
|
+
* **一条**「不再询问」OFFER 的形(core 5.58.0 / [ref] §3.1 —— **BREAKING**,取代退役的
|
|
54
|
+
* `RuleSuggestion`)。同步腿(`ApprovalCardSchema.ruleOffers` / `card_json`)与耐久腿(durable park 行的
|
|
55
|
+
* `PendingCheckpoint.ruleOffers`,由 `plugins/checkpoint-store-sql.ts` 窄读)**共用这一份**。
|
|
56
|
+
*
|
|
57
|
+
* 🔴 单一属主(宪法 [ref]「schema 单一属主禁复制」):两条腿投的是 core 的**同一个** `RuleOffer`
|
|
58
|
+
* (同步腿 = `AskRequest.ruleOffers`,耐久腿 = `PendingAction.ruleOffers`,core
|
|
59
|
+
* `checkpoint-store.d.ts` 明写「CONTRACT (same as the synchronous `AskRequest.ruleOffers`)」)。
|
|
60
|
+
* 各写一份 zod 必然漂——闭词表 `match`/`kind` 加词、上限改口径,只改一处就出两种形。
|
|
61
|
+
*
|
|
62
|
+
* 🔴 **闭集判别联合,`kind` 是判别位**(core d.ts 逐字:"A CLOSED discriminated union"):
|
|
63
|
+
* · `single` —— 一条覆盖**整串**命令的规则(exact 精确形,或简单命令的 reviewed prefix 形);
|
|
64
|
+
* · `batch` —— 复合命令的**逐段合取**批:选它 = **一次对全部 `rules` 说 yes**,批内**无**逐条子选择。
|
|
65
|
+
* 成员是判别联合([ref] B3:`command` 逐段 Bash 规则 | `directoryRead` cd 段铸的目录只读授权)。
|
|
66
|
+
* `uncoveredSegments` 是铸批时刻的**诚实溢出披露**(既不被本批覆盖、也不被卡的覆盖快照覆盖的段数),
|
|
67
|
+
* `0` 读作「这批兑完,这条复合命令在那份快照的眼里就全覆盖了」;`uncoveredDetail`(§3.5,additive)
|
|
68
|
+
* 逐段说**为什么**还没被覆盖(闭三词集),行数恒等于 count(count 是真源,明细缺席不是断言)。
|
|
69
|
+
*
|
|
70
|
+
* 🔴 **序即契约**(core 逐字,消费端可以依赖):至多 2 条;whole-string exact single 在场时**恒 index 0**;
|
|
71
|
+
* batch 至多一条、**恒末位**。所以本仓一切截断都必须是**取前缀**(保序、保原始下标),绝不重排。
|
|
72
|
+
*/
|
|
73
|
+
/**
|
|
74
|
+
* [ref] §3.5 —— `uncoveredDetail` **行数**的 server 容忍帽(理由与 {@link MAX_RULE_OFFER_BATCH_MEMBERS}
|
|
75
|
+
* 同源:纯展示轴上的一条改坏/放宽的上游不该把一行撑爆)。⚠️ 超帽的处置是**丢整座**而不是截断:core 契约
|
|
76
|
+
* 明写「`uncoveredDetail.length === uncoveredSegments` whenever the seat is present」且「count 座是真源、
|
|
77
|
+
* 明细缺席不是断言」——截过的座会让一个按契约校验等式的消费端把整只 batch 判假,缺席则只是少一行解释。
|
|
78
|
+
*/
|
|
79
|
+
export declare const MAX_UNCOVERED_DETAIL_ROWS = 32;
|
|
52
80
|
export declare const RuleOfferSchema: z.ZodUnion<readonly [z.ZodObject<{
|
|
53
81
|
kind: z.ZodLiteral<"single">;
|
|
54
82
|
rule: z.ZodString;
|
|
55
83
|
match: z.ZodEnum<{
|
|
56
84
|
exact: "exact";
|
|
57
85
|
prefix: "prefix";
|
|
86
|
+
wildcard: "wildcard";
|
|
87
|
+
subpath: "subpath";
|
|
58
88
|
}>;
|
|
59
89
|
command: z.ZodString;
|
|
60
90
|
}, z.core.$strict>, z.ZodObject<{
|
|
61
91
|
kind: z.ZodLiteral<"batch">;
|
|
62
|
-
rules: z.ZodArray<z.ZodObject<{
|
|
92
|
+
rules: z.ZodArray<z.ZodUnion<readonly [z.ZodObject<{
|
|
93
|
+
kind: z.ZodLiteral<"command">;
|
|
63
94
|
rule: z.ZodString;
|
|
64
95
|
match: z.ZodEnum<{
|
|
65
96
|
exact: "exact";
|
|
66
97
|
prefix: "prefix";
|
|
98
|
+
wildcard: "wildcard";
|
|
99
|
+
subpath: "subpath";
|
|
67
100
|
}>;
|
|
68
101
|
command: z.ZodString;
|
|
69
102
|
segment: z.ZodString;
|
|
70
|
-
}, z.core.$strict
|
|
103
|
+
}, z.core.$strict>, z.ZodObject<{
|
|
104
|
+
kind: z.ZodLiteral<"directoryRead">;
|
|
105
|
+
rule: z.ZodString;
|
|
106
|
+
directory: z.ZodString;
|
|
107
|
+
segment: z.ZodString;
|
|
108
|
+
}, z.core.$strict>]>>;
|
|
71
109
|
uncoveredSegments: z.ZodNumber;
|
|
110
|
+
uncoveredDetail: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
111
|
+
segment: z.ZodString;
|
|
112
|
+
reason: z.ZodEnum<{
|
|
113
|
+
redirection: "redirection";
|
|
114
|
+
no_rule_form: "no_rule_form";
|
|
115
|
+
cap_overflow: "cap_overflow";
|
|
116
|
+
}>;
|
|
117
|
+
}, z.core.$strict>>>;
|
|
72
118
|
}, z.core.$strict>]>;
|
|
73
119
|
/**
|
|
74
|
-
* {@link RuleOfferSchema} 的**不限长**孪生 —— 只判**结构**(闭词表 `kind`/`match` + 若干字符串)
|
|
75
|
-
*
|
|
120
|
+
* {@link RuleOfferSchema} 的**不限长**孪生 —— 只判**结构**(闭词表 `kind`/`match`/`reason` + 若干字符串),
|
|
121
|
+
* 长度由调用方在**脱敏之后**自己截。
|
|
76
122
|
*
|
|
77
123
|
* 🔴 为什么必须有它(codex 交叉复审 [medium],验真后修):`redactSecrets` **会变长**(一条
|
|
78
124
|
* `password=…` 换成更长的遮蔽标记)。拿带 `.max()` 的形去校验**脱敏前**的原文,再脱敏,产出的就可能是
|
|
@@ -100,7 +146,11 @@ export declare const RuleOfferSchema: z.ZodUnion<readonly [z.ZodObject<{
|
|
|
100
146
|
* 落库/读回的 {@link ApprovalCardSchema} 仍 `.strict()`(投影只写已知键,多余键根本到不了那一层)。
|
|
101
147
|
*
|
|
102
148
|
* 🔴 **判别联合上的 strip 要逐臂加**(zod 4:`z.union` 自己没有 unknownKeys 政策,政策在成员上)——
|
|
103
|
-
* 两臂各自 `.strip()
|
|
149
|
+
* 两臂各自 `.strip()`,batch 成员的两臂亦然,否则对 additive 加键仍是 strict 的,而那正是本注要拆的雷。
|
|
150
|
+
*
|
|
151
|
+
* 🔴 **闭词表不在放宽之列**([ref] B3 与 [ref] 词表纪律):`kind`(offer 与成员两级)/`match`/`reason`
|
|
152
|
+
* 是闭集 —— 集外词 = 判假 = 整只 offer 丢(成员级的未知 `kind` 丢的是整只 batch,不是那一个成员;理由见
|
|
153
|
+
* {@link RuleOfferBatchMemberSchema} 顶注)。「additive 加键照收」与「闭集加词即拒」是两条轴,别混。
|
|
104
154
|
*/
|
|
105
155
|
export declare const RuleOfferRawSchema: z.ZodUnion<readonly [z.ZodObject<{
|
|
106
156
|
kind: z.ZodLiteral<"single">;
|
|
@@ -108,25 +158,69 @@ export declare const RuleOfferRawSchema: z.ZodUnion<readonly [z.ZodObject<{
|
|
|
108
158
|
match: z.ZodEnum<{
|
|
109
159
|
exact: "exact";
|
|
110
160
|
prefix: "prefix";
|
|
161
|
+
wildcard: "wildcard";
|
|
162
|
+
subpath: "subpath";
|
|
111
163
|
}>;
|
|
112
164
|
command: z.ZodString;
|
|
113
165
|
}, z.core.$strip>, z.ZodObject<{
|
|
114
166
|
kind: z.ZodLiteral<"batch">;
|
|
115
|
-
rules: z.ZodArray<z.ZodObject<{
|
|
167
|
+
rules: z.ZodArray<z.ZodUnion<readonly [z.ZodObject<{
|
|
168
|
+
kind: z.ZodLiteral<"command">;
|
|
116
169
|
rule: z.ZodString;
|
|
117
170
|
match: z.ZodEnum<{
|
|
118
171
|
exact: "exact";
|
|
119
172
|
prefix: "prefix";
|
|
173
|
+
wildcard: "wildcard";
|
|
174
|
+
subpath: "subpath";
|
|
120
175
|
}>;
|
|
121
176
|
command: z.ZodString;
|
|
122
177
|
segment: z.ZodString;
|
|
123
|
-
}, z.core.$strip
|
|
178
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
179
|
+
kind: z.ZodLiteral<"directoryRead">;
|
|
180
|
+
rule: z.ZodString;
|
|
181
|
+
directory: z.ZodString;
|
|
182
|
+
segment: z.ZodString;
|
|
183
|
+
}, z.core.$strip>]>>;
|
|
124
184
|
uncoveredSegments: z.ZodNumber;
|
|
185
|
+
uncoveredDetail: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
186
|
+
segment: z.ZodString;
|
|
187
|
+
reason: z.ZodEnum<{
|
|
188
|
+
redirection: "redirection";
|
|
189
|
+
no_rule_form: "no_rule_form";
|
|
190
|
+
cap_overflow: "cap_overflow";
|
|
191
|
+
}>;
|
|
192
|
+
}, z.core.$strip>>>;
|
|
125
193
|
}, z.core.$strip>]>;
|
|
194
|
+
/** {@link RuleOfferRawSchema} 的输出形(结构已判、文本未限长)—— 素材铸点在它上面做派生一致性与座尺两道后判。 */
|
|
195
|
+
export type RuleOfferRaw = z.infer<typeof RuleOfferRawSchema>;
|
|
196
|
+
/**
|
|
197
|
+
* [ref] §3.5 —— `uncoveredDetail` 明细座的**座级**预筛,两条腿在 {@link RuleOfferRawSchema} 判形之前
|
|
198
|
+
* 各调一次。
|
|
199
|
+
*
|
|
200
|
+
* 为什么要在整体判形之前单独筛这一座:core 明写「ABSENCE(an older minter, a degraded consumer's re-emit)
|
|
201
|
+
* is not a claim」且 count 座是真源 —— 一座坏掉的明细(集外 reason / 非数组 / 与 count 不等 / 超帽)是
|
|
202
|
+
* **展示轴**上的损坏,正确处置是「丢这一座、留 batch 本体」;让它把整只 batch 判假会把一条真可兑的合取批
|
|
203
|
+
* 从卡上抹掉(方向反了:少一行解释是难看,少一只可兑的 offer 是把人的选项吃掉)。
|
|
204
|
+
* 座被丢**必须留痕**([ref]:F 类 fail-open 走 `recordFailOpen`,计数 + 一次 warn)。
|
|
205
|
+
* 只做浅层判别(不校验成员、不解构别的键),判形权威仍只有 zod 一处。
|
|
206
|
+
*/
|
|
207
|
+
export declare function screenUncoveredDetailSeat(item: unknown): unknown;
|
|
208
|
+
/**
|
|
209
|
+
* [ref] B3 的**前一形**:pre-7.2 的 batch 成员没有 `kind`(那一形只有一种成员 —— 逐段 Bash 规则的四键),
|
|
210
|
+
* 而本仓的耐久腿在 park 行 `pendingAction.ruleOffers` 里**已经落了**这种成员(`checkpoint.rule_suggestions`
|
|
211
|
+
* 列),同步腿在 core 7.1.0 npm 字节下(本分支落 main 候 7.2.x)收到的也是它。B3 的降级臂说的是「`kind`
|
|
212
|
+
* 不识 ⇒ 丢整批」;一个**缺席**的 `kind` 不是「不识」——旧形恰好只有一种成员,缺席就是 `command`,零歧义。
|
|
213
|
+
* 所以这里做的是**已知旧形的 additive 回填**(浅层:仅当成员是对象、无 `kind` 键、且四个文本键在场时补
|
|
214
|
+
* `kind:"command"`),不是放宽闭集:带着一个陌生 `kind` 值的成员一个字节不动,照旧在 zod 处判假丢整批。
|
|
215
|
+
* 不回填的代价是真实的:滚动升级窗里,老二进制铸的每一条 park 行在新二进制的读面上整只 batch 消失
|
|
216
|
+
* (「有供给」谎报成「无供给」,本键存在理由的反面)。
|
|
217
|
+
*/
|
|
218
|
+
export declare function backfillLegacyBatchMemberKind(item: unknown): unknown;
|
|
126
219
|
/**
|
|
127
220
|
* 卡面/帧面共用的 offer **投影型**(= {@link RuleOfferSchema} 的输出形)。判别位 `kind` 上闭集,
|
|
128
|
-
* 消费端(SDK/cli 渲染)按 core 契约分臂;`batch.rules`
|
|
129
|
-
*
|
|
221
|
+
* 消费端(SDK/cli 渲染)按 core 契约分臂;`batch.rules` 成员是判别联合(`command` | `directoryRead`),
|
|
222
|
+
* 各自带 `segment` 渲染座(core 明写「渲染座、永不参与裁决」,与 rule/command/directory 同为
|
|
223
|
+
* UNTRUSTED-for-display);`uncoveredDetail` additive 明细座。
|
|
130
224
|
*/
|
|
131
225
|
export type RuleOfferProjection = z.infer<typeof RuleOfferSchema>;
|
|
132
226
|
/**
|
|
@@ -134,6 +228,11 @@ export type RuleOfferProjection = z.infer<typeof RuleOfferSchema>;
|
|
|
134
228
|
* 分臂,抽成具名函数)。为什么不 `structuredClone`/展开:显式逐键投影是本模块对「上游 additive
|
|
135
229
|
* 加键」的免疫层(见 {@link RuleOfferRawSchema} 顶注)——加键到不了 `card_json`,strip 语义在
|
|
136
230
|
* 投影处兑现,不靠 schema 层兜。
|
|
231
|
+
*
|
|
232
|
+
* 到这里的素材已经过素材铸点的结构窄读(`tool-approval.ts` `boundRuleOfferTexts` 拿 {@link RuleOfferRawSchema}
|
|
233
|
+
* 判过形)⇒ 两级 `kind` 的运行期 `default` 臂在健康进程里不可达;它们守的是「本仓 dist 与 core 版本不同步」
|
|
234
|
+
* 那一形([ref] 词表范式:core 加臂 ⇒ `satisfies never` 编译红由人裁投影形;运行期撞到未知臂响亮抛,绝不把一个
|
|
235
|
+
* 不认识的臂当 batch/command 硬投)。
|
|
137
236
|
*/
|
|
138
237
|
export declare function copyRuleOffer(o: RuleOffer): RuleOfferProjection;
|
|
139
238
|
/**
|
|
@@ -242,20 +341,38 @@ export declare const ApprovalCardSchema: z.ZodObject<{
|
|
|
242
341
|
match: z.ZodEnum<{
|
|
243
342
|
exact: "exact";
|
|
244
343
|
prefix: "prefix";
|
|
344
|
+
wildcard: "wildcard";
|
|
345
|
+
subpath: "subpath";
|
|
245
346
|
}>;
|
|
246
347
|
command: z.ZodString;
|
|
247
348
|
}, z.core.$strict>, z.ZodObject<{
|
|
248
349
|
kind: z.ZodLiteral<"batch">;
|
|
249
|
-
rules: z.ZodArray<z.ZodObject<{
|
|
350
|
+
rules: z.ZodArray<z.ZodUnion<readonly [z.ZodObject<{
|
|
351
|
+
kind: z.ZodLiteral<"command">;
|
|
250
352
|
rule: z.ZodString;
|
|
251
353
|
match: z.ZodEnum<{
|
|
252
354
|
exact: "exact";
|
|
253
355
|
prefix: "prefix";
|
|
356
|
+
wildcard: "wildcard";
|
|
357
|
+
subpath: "subpath";
|
|
254
358
|
}>;
|
|
255
359
|
command: z.ZodString;
|
|
256
360
|
segment: z.ZodString;
|
|
257
|
-
}, z.core.$strict
|
|
361
|
+
}, z.core.$strict>, z.ZodObject<{
|
|
362
|
+
kind: z.ZodLiteral<"directoryRead">;
|
|
363
|
+
rule: z.ZodString;
|
|
364
|
+
directory: z.ZodString;
|
|
365
|
+
segment: z.ZodString;
|
|
366
|
+
}, z.core.$strict>]>>;
|
|
258
367
|
uncoveredSegments: z.ZodNumber;
|
|
368
|
+
uncoveredDetail: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
369
|
+
segment: z.ZodString;
|
|
370
|
+
reason: z.ZodEnum<{
|
|
371
|
+
redirection: "redirection";
|
|
372
|
+
no_rule_form: "no_rule_form";
|
|
373
|
+
cap_overflow: "cap_overflow";
|
|
374
|
+
}>;
|
|
375
|
+
}, z.core.$strict>>>;
|
|
259
376
|
}, z.core.$strict>]>>>;
|
|
260
377
|
ruleOffersAbsence: z.ZodOptional<z.ZodEnum<{
|
|
261
378
|
mandated: "mandated";
|
|
@@ -323,20 +440,38 @@ export declare const ApprovalCardEnvelopeSchema: z.ZodObject<{
|
|
|
323
440
|
match: z.ZodEnum<{
|
|
324
441
|
exact: "exact";
|
|
325
442
|
prefix: "prefix";
|
|
443
|
+
wildcard: "wildcard";
|
|
444
|
+
subpath: "subpath";
|
|
326
445
|
}>;
|
|
327
446
|
command: z.ZodString;
|
|
328
447
|
}, z.core.$strict>, z.ZodObject<{
|
|
329
448
|
kind: z.ZodLiteral<"batch">;
|
|
330
|
-
rules: z.ZodArray<z.ZodObject<{
|
|
449
|
+
rules: z.ZodArray<z.ZodUnion<readonly [z.ZodObject<{
|
|
450
|
+
kind: z.ZodLiteral<"command">;
|
|
331
451
|
rule: z.ZodString;
|
|
332
452
|
match: z.ZodEnum<{
|
|
333
453
|
exact: "exact";
|
|
334
454
|
prefix: "prefix";
|
|
455
|
+
wildcard: "wildcard";
|
|
456
|
+
subpath: "subpath";
|
|
335
457
|
}>;
|
|
336
458
|
command: z.ZodString;
|
|
337
459
|
segment: z.ZodString;
|
|
338
|
-
}, z.core.$strict
|
|
460
|
+
}, z.core.$strict>, z.ZodObject<{
|
|
461
|
+
kind: z.ZodLiteral<"directoryRead">;
|
|
462
|
+
rule: z.ZodString;
|
|
463
|
+
directory: z.ZodString;
|
|
464
|
+
segment: z.ZodString;
|
|
465
|
+
}, z.core.$strict>]>>;
|
|
339
466
|
uncoveredSegments: z.ZodNumber;
|
|
467
|
+
uncoveredDetail: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
468
|
+
segment: z.ZodString;
|
|
469
|
+
reason: z.ZodEnum<{
|
|
470
|
+
redirection: "redirection";
|
|
471
|
+
no_rule_form: "no_rule_form";
|
|
472
|
+
cap_overflow: "cap_overflow";
|
|
473
|
+
}>;
|
|
474
|
+
}, z.core.$strict>>>;
|
|
340
475
|
}, z.core.$strict>]>>>;
|
|
341
476
|
ruleOffersAbsence: z.ZodOptional<z.ZodEnum<{
|
|
342
477
|
mandated: "mandated";
|
package/dist/approval-card.js
CHANGED
|
@@ -1,38 +1,97 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
import { ASK_EVIDENCE_ABSENCE_VALUES, MAX_RULE_TEXT_CHARS } from "@sema-agent/core";
|
|
3
3
|
import { redactSecrets } from "./trace/redact.js";
|
|
4
|
+
import { recordFailOpen } from "./observability/fail-open.js";
|
|
5
|
+
import { PERSISTED_RULE_MATCHES, UNCOVERED_SEGMENT_REASONS } from "./permission-rule-vocab.js";
|
|
4
6
|
export const MAX_AGENT_NAME = 200;
|
|
5
7
|
const MAX_IDENT = 200;
|
|
6
8
|
export const MAX_RULE_OFFERS = 4;
|
|
7
9
|
export const MAX_RULE_OFFER_BATCH_MEMBERS = 8;
|
|
8
|
-
const
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
10
|
+
export const MAX_UNCOVERED_DETAIL_ROWS = 32;
|
|
11
|
+
const RuleMatchSchema = z.enum(PERSISTED_RULE_MATCHES);
|
|
12
|
+
const UncoveredReasonSchema = z.enum(UNCOVERED_SEGMENT_REASONS);
|
|
13
|
+
const RuleOfferBatchMemberSchema = z.union([
|
|
14
|
+
z
|
|
15
|
+
.object({
|
|
16
|
+
kind: z.literal("command"),
|
|
17
|
+
rule: z.string().max(MAX_RULE_TEXT_CHARS),
|
|
18
|
+
match: RuleMatchSchema,
|
|
19
|
+
command: z.string().max(MAX_RULE_TEXT_CHARS),
|
|
20
|
+
segment: z.string().max(MAX_RULE_TEXT_CHARS),
|
|
21
|
+
})
|
|
22
|
+
.strict(),
|
|
23
|
+
z
|
|
24
|
+
.object({
|
|
25
|
+
kind: z.literal("directoryRead"),
|
|
26
|
+
rule: z.string().max(MAX_RULE_TEXT_CHARS),
|
|
27
|
+
directory: z.string().max(MAX_RULE_TEXT_CHARS),
|
|
28
|
+
segment: z.string().max(MAX_RULE_TEXT_CHARS),
|
|
29
|
+
})
|
|
30
|
+
.strict(),
|
|
31
|
+
]);
|
|
32
|
+
const UncoveredSegmentDetailSchema = z.object({ segment: z.string().max(MAX_RULE_TEXT_CHARS), reason: UncoveredReasonSchema }).strict();
|
|
33
|
+
const UncoveredSegmentDetailRawSchema = z.object({ segment: z.string(), reason: UncoveredReasonSchema }).strip();
|
|
16
34
|
export const RuleOfferSchema = z.union([
|
|
17
|
-
z.object({ kind: z.literal("single"), rule: z.string().max(MAX_RULE_TEXT_CHARS), match:
|
|
35
|
+
z.object({ kind: z.literal("single"), rule: z.string().max(MAX_RULE_TEXT_CHARS), match: RuleMatchSchema, command: z.string().max(MAX_RULE_TEXT_CHARS) }).strict(),
|
|
18
36
|
z
|
|
19
37
|
.object({
|
|
20
38
|
kind: z.literal("batch"),
|
|
21
|
-
rules: z.array(
|
|
39
|
+
rules: z.array(RuleOfferBatchMemberSchema).min(1).max(MAX_RULE_OFFER_BATCH_MEMBERS),
|
|
22
40
|
uncoveredSegments: z.number().int().nonnegative().safe(),
|
|
41
|
+
uncoveredDetail: z.array(UncoveredSegmentDetailSchema).max(MAX_UNCOVERED_DETAIL_ROWS).optional(),
|
|
23
42
|
})
|
|
24
43
|
.strict(),
|
|
25
44
|
]);
|
|
26
45
|
export const RuleOfferRawSchema = z.union([
|
|
27
|
-
z.object({ kind: z.literal("single"), rule: z.string(), match:
|
|
46
|
+
z.object({ kind: z.literal("single"), rule: z.string(), match: RuleMatchSchema, command: z.string() }).strip(),
|
|
28
47
|
z
|
|
29
48
|
.object({
|
|
30
49
|
kind: z.literal("batch"),
|
|
31
|
-
rules: z
|
|
50
|
+
rules: z
|
|
51
|
+
.array(z.union([
|
|
52
|
+
z.object({ kind: z.literal("command"), rule: z.string(), match: RuleMatchSchema, command: z.string(), segment: z.string() }).strip(),
|
|
53
|
+
z.object({ kind: z.literal("directoryRead"), rule: z.string(), directory: z.string(), segment: z.string() }).strip(),
|
|
54
|
+
]))
|
|
55
|
+
.min(1),
|
|
32
56
|
uncoveredSegments: z.number().int().nonnegative().safe(),
|
|
57
|
+
uncoveredDetail: z.array(UncoveredSegmentDetailRawSchema).optional(),
|
|
33
58
|
})
|
|
34
59
|
.strip(),
|
|
35
60
|
]);
|
|
61
|
+
export function screenUncoveredDetailSeat(item) {
|
|
62
|
+
if (typeof item !== "object" || item === null)
|
|
63
|
+
return item;
|
|
64
|
+
const candidate = item;
|
|
65
|
+
if (candidate.kind !== "batch" || !("uncoveredDetail" in candidate) || candidate.uncoveredDetail === undefined)
|
|
66
|
+
return item;
|
|
67
|
+
const rows = candidate.uncoveredDetail;
|
|
68
|
+
const wellFormed = Array.isArray(rows) &&
|
|
69
|
+
rows.length <= MAX_UNCOVERED_DETAIL_ROWS &&
|
|
70
|
+
rows.length === candidate.uncoveredSegments &&
|
|
71
|
+
rows.every((r) => UncoveredSegmentDetailRawSchema.safeParse(r).success);
|
|
72
|
+
if (wellFormed)
|
|
73
|
+
return item;
|
|
74
|
+
recordFailOpen("server.rule-offers.uncovered-detail-dropped", Array.isArray(rows) ? `rows=${rows.length} count=${String(candidate.uncoveredSegments)}` : `seat is ${typeof rows}`);
|
|
75
|
+
const { uncoveredDetail: _dropped, ...rest } = candidate;
|
|
76
|
+
return rest;
|
|
77
|
+
}
|
|
78
|
+
export function backfillLegacyBatchMemberKind(item) {
|
|
79
|
+
if (typeof item !== "object" || item === null)
|
|
80
|
+
return item;
|
|
81
|
+
const candidate = item;
|
|
82
|
+
if (candidate.kind !== "batch" || !Array.isArray(candidate.rules))
|
|
83
|
+
return item;
|
|
84
|
+
const isLegacy = (m) => typeof m === "object" &&
|
|
85
|
+
m !== null &&
|
|
86
|
+
!("kind" in m) &&
|
|
87
|
+
typeof m.rule === "string" &&
|
|
88
|
+
typeof m.match === "string" &&
|
|
89
|
+
typeof m.command === "string" &&
|
|
90
|
+
typeof m.segment === "string";
|
|
91
|
+
if (!candidate.rules.some(isLegacy))
|
|
92
|
+
return item;
|
|
93
|
+
return { ...candidate, rules: candidate.rules.map((m) => (isLegacy(m) ? { kind: "command", ...m } : m)) };
|
|
94
|
+
}
|
|
36
95
|
export function copyRuleOffer(o) {
|
|
37
96
|
switch (o.kind) {
|
|
38
97
|
case "single":
|
|
@@ -40,8 +99,18 @@ export function copyRuleOffer(o) {
|
|
|
40
99
|
case "batch":
|
|
41
100
|
return {
|
|
42
101
|
kind: "batch",
|
|
43
|
-
rules: o.rules.map((r) =>
|
|
102
|
+
rules: o.rules.map((r) => {
|
|
103
|
+
switch (r.kind) {
|
|
104
|
+
case "command":
|
|
105
|
+
return { kind: "command", rule: r.rule, match: r.match, command: r.command, segment: r.segment };
|
|
106
|
+
case "directoryRead":
|
|
107
|
+
return { kind: "directoryRead", rule: r.rule, directory: r.directory, segment: r.segment };
|
|
108
|
+
default:
|
|
109
|
+
throw new Error(`unknown rule-offer batch member kind: ${JSON.stringify(r)}`);
|
|
110
|
+
}
|
|
111
|
+
}),
|
|
44
112
|
uncoveredSegments: o.uncoveredSegments,
|
|
113
|
+
...(o.uncoveredDetail !== undefined ? { uncoveredDetail: o.uncoveredDetail.map((d) => ({ segment: d.segment, reason: d.reason })) } : {}),
|
|
45
114
|
};
|
|
46
115
|
default:
|
|
47
116
|
throw new Error(`unknown rule-offer kind: ${JSON.stringify(o)}`);
|
package/dist/approval.d.ts
CHANGED
|
@@ -36,6 +36,37 @@ export declare function assertGateIntentServiceable(config: {
|
|
|
36
36
|
approvalNeverAuto: readonly string[];
|
|
37
37
|
durableApproval: boolean;
|
|
38
38
|
}, checkpointStorePresent: boolean): void;
|
|
39
|
+
/**
|
|
40
|
+
* [ref] 件⑩ —— **center 的 `forceDurableGate` 在无 checkpoint 店的部署上会静默 inert**,补一条 boot 披露。
|
|
41
|
+
*
|
|
42
|
+
* 事实链(core 7.2.0 亲读):`RuntimeCaps.forceDurableGate:true` 让引擎**合成**一个
|
|
43
|
+
* `durableApproval{scope: principal}`(`dist/core/types.d.ts:5279-5283`),好让 policy 的 `ask` 挂到
|
|
44
|
+
* durable wire 上。但「挂得上去」的前提是这台 worker 真有 checkpoint 店 —— 而本仓的构造条件逐字是
|
|
45
|
+
* `backend?.checkpoint && config.durableApproval`(main.ts)。`DURABLE_APPROVAL` 关 ⇒ 店缺席 ⇒ 合成出来
|
|
46
|
+
* 的那把锁**没有锁孔**:core 侧退化成非 durable 的 ask 链,center 那条「fleet-wide interactive runs gate」
|
|
47
|
+
* 的授权在这台机器上**一个字节都没兑现**,且两侧都不出声(core 侧归 core 的 C-22)。
|
|
48
|
+
*
|
|
49
|
+
* 为什么是 warn 不是拒启:`forceDurableGate` 是 **per-principal** 的授权,boot 期没有 principal,判不出
|
|
50
|
+
* 「今天真的会有人被下发」——能判的只有「这台机器的下发口开着(有 entitlement 源)而承接面关着」。
|
|
51
|
+
* 拿一个**可能**的下发去挡死一台本来跑得好好的 worker,是本条诊断带来的新故障,不是它治的病
|
|
52
|
+
* (与 `noticeAutoCompactAboveWindow` 的同一条取舍)。所以:响亮一行,不拒启。
|
|
53
|
+
*
|
|
54
|
+
* 为什么在 **boot** 判而不是 resolve 时判:两个入参都是**部署级**的(entitlement 源在不在、durable 门开
|
|
55
|
+
* 不开),per-principal 的那一半改变不了结论;放 resolve 里就得自己造去重,而 boot 天然只跑一次。
|
|
56
|
+
*
|
|
57
|
+
* 纯函数(返回一行或 undefined,不自己写日志)= 红先测得动;调用点在 main.ts 的
|
|
58
|
+
* {@link assertGateIntentServiceable} 之后(同一段门装配)。
|
|
59
|
+
*/
|
|
60
|
+
export declare function buildForceDurableGateInertNotice(input: {
|
|
61
|
+
/** center per-principal entitlement 源在不在(`centerEntitlementSourceWired` 的结果 —— 判据单源在那里)。 */
|
|
62
|
+
entitlementSourceWired: boolean;
|
|
63
|
+
/** 本进程真建出 checkpoint 店了吗(= `backend?.checkpoint && DURABLE_APPROVAL`)。 */
|
|
64
|
+
checkpointStorePresent: boolean;
|
|
65
|
+
durableApproval: boolean;
|
|
66
|
+
}): {
|
|
67
|
+
event: string;
|
|
68
|
+
fields: Record<string, unknown>;
|
|
69
|
+
} | undefined;
|
|
39
70
|
/**
|
|
40
71
|
* Durable approval policy (core 1.67 / [ref]): returns three-state **`ask`** for gated tools instead of
|
|
41
72
|
* polling. With `TaskSpec.durableApproval` set + a `checkpointStore` on the Runner, core turns that `ask` into
|
package/dist/approval.js
CHANGED
|
@@ -13,6 +13,24 @@ export function assertGateIntentServiceable(config, checkpointStorePresent) {
|
|
|
13
13
|
}
|
|
14
14
|
throw new Error("DURABLE_APPROVAL=true but no checkpoint store is available — the configured DB backend has no checkpoint face (or no backend is configured). Wire a MySQL-protocol/PostgreSQL/file backend, or unset DURABLE_APPROVAL.");
|
|
15
15
|
}
|
|
16
|
+
export function buildForceDurableGateInertNotice(input) {
|
|
17
|
+
if (!input.entitlementSourceWired || input.checkpointStorePresent)
|
|
18
|
+
return undefined;
|
|
19
|
+
return {
|
|
20
|
+
event: "center_force_durable_gate_inert",
|
|
21
|
+
fields: {
|
|
22
|
+
durableApproval: input.durableApproval,
|
|
23
|
+
note: "this deployment resolves per-principal entitlements from config-center, but it has NO checkpoint store " +
|
|
24
|
+
(input.durableApproval
|
|
25
|
+
? "(DURABLE_APPROVAL=true, yet the configured backend exposes no checkpoint face)"
|
|
26
|
+
: "(DURABLE_APPROVAL is off)") +
|
|
27
|
+
" — a center-issued RuntimeCaps.forceDurableGate=true will be INERT here: the engine synthesizes a " +
|
|
28
|
+
"durableApproval scope, but with no store to suspend into, gated asks fall back to the non-durable chain " +
|
|
29
|
+
"and the fleet-wide interactive-runs mandate is NOT enforced on this worker. Set DURABLE_APPROVAL=true with " +
|
|
30
|
+
"a backend that has a checkpoint face (MySQL-protocol / PostgreSQL / file), or stop issuing forceDurableGate for these principals.",
|
|
31
|
+
},
|
|
32
|
+
};
|
|
33
|
+
}
|
|
16
34
|
function createNameSetMatcher(names) {
|
|
17
35
|
const exact = new Set(names);
|
|
18
36
|
const covering = names.filter(isNamespacedCoveringRuleName);
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import { type Model, type ModelRoles, type RuntimeCaps } from "@sema-agent/core";
|
|
2
|
+
import type { SettingsPermissionMode } from "./task-settings.js";
|
|
3
|
+
/**
|
|
4
|
+
* 分类器**配置**的模型路由 —— 直接复用 core 的 `resolveTaskModel({ modelRole: "classifier" })`(prepare-task 武装时
|
|
5
|
+
* 走的同一函数:role 回落链 `classifier → summarize → default`,且 `{select}` 形 RoleSpec 按目录选型)。
|
|
6
|
+
* codex r4 [medium] 验真后改:首版按名字级自算,遇 center 下发的 `{select:{tier}}` 形会错落到 summarize/default,
|
|
7
|
+
* 对 `sema doctor permissions` 报另一个模型。答的是「配置了什么」;运行期 `derivedRouteFallsBack` 的回落不在射程
|
|
8
|
+
* (那是 core 状态座的事)。什么都解不出 ⇒ `{id:undefined, fault}`(core 的拒句当数据交出,读面不写 model 键):
|
|
9
|
+
* 本面是纯披露、不是执法——读面 500 掉整张能力表比少一个 model 键更伤。
|
|
10
|
+
*/
|
|
11
|
+
export declare function classifierRouteFor(deps: {
|
|
12
|
+
models?: Record<string, Model>;
|
|
13
|
+
roles?: ModelRoles;
|
|
14
|
+
}): ClassifierRoute;
|
|
15
|
+
/** `classifierRouteFor` 的答:解出 ⇒ `{id}`;解不出 ⇒ `{id:undefined, fault}`(core 的拒句原文,不吞)。 */
|
|
16
|
+
export type ClassifierRoute = {
|
|
17
|
+
readonly id: string;
|
|
18
|
+
readonly fault?: undefined;
|
|
19
|
+
} | {
|
|
20
|
+
readonly id: undefined;
|
|
21
|
+
readonly fault: string;
|
|
22
|
+
};
|
|
23
|
+
/** core [ref] seam ⑤ 的未武装原因闭集(六词,[ref] 加 settings_denied;顺序 = 判序)。 */
|
|
24
|
+
export declare const AUTO_MODE_UNARMED_REASONS: readonly ["mode_not_auto", "deployment_incapable", "org_denied", "local_denied", "settings_denied", "resolver_fault"];
|
|
25
|
+
export type AutoModeUnarmedReason = (typeof AUTO_MODE_UNARMED_REASONS)[number];
|
|
26
|
+
/** 锁步表:词表与语义一一对应(加员/删员任一侧不同步 = tsc 红)。语义只供文档/测试,不上 wire。 */
|
|
27
|
+
export declare const AUTO_MODE_UNARMED_REASON_SEMANTICS: {
|
|
28
|
+
readonly mode_not_auto: "本次意图不是 auto(壳发的 permissionMode 不是 \"auto\";座缺席)——只属意图武装式,旧式 core 不读模式";
|
|
29
|
+
readonly deployment_incapable: "装配面没挂 RunnerDeps.autoMode 分类器席位(本部署/本进程形不具备分类器);旧式 core 下另含「无 center 源 = 零授予路径」";
|
|
30
|
+
readonly org_denied: "per-principal caps.autoMode === false 且本地 deny 未设:center 显式 deny / center 硬失败 fail-closed 拒项;旧式 core 下另含「center 在场但未授予」";
|
|
31
|
+
readonly local_denied: "本地 catalog 键 PERMISSIONS_DISABLE_AUTO_MODE=true(center/settings 键名 permissions.disableAutoMode)把 caps.autoMode 折成 false";
|
|
32
|
+
readonly settings_denied: "settings 层 permissions.disableAutoMode 取 disable 或 true(两套已发布拼写同义;用户/managed 层 kill-switch)把本 run 折成非 auto —— capabilities 查询串不带 settings,本词由 run 级面产([6128] PM 裁定第六员)";
|
|
33
|
+
readonly resolver_fault: "per-principal caps resolver 抛错/答非记录(core 同形全拒:autoMode:false + onError phase config)";
|
|
34
|
+
};
|
|
35
|
+
/**
|
|
36
|
+
* 安装包探针:**这台机器上装的 core 用哪套武装极性**。
|
|
37
|
+
*
|
|
38
|
+
* 判据([ref] 改,原先用「854b202b 同批的运行时导出 `mailboxCrossProcessMountVerdict`」作代理 —— 那是 385 片2a 的
|
|
39
|
+
* mailbox 面,与 auto 武装**语义无关**,只是恰好同一个 dist;core 若把 [ref] 单独发一个补丁版,代理就答错):
|
|
40
|
+
*
|
|
41
|
+
* · **主判(语义精确)= [ref] 自己的座**:武装点 `dist/core/runner/prepare-task.js` 里是否出现 `autoModeRequested`。
|
|
42
|
+
* 亲验(2026-09-03,`git grep autoModeRequested` 两 ref 对拍):v7.2.0 全树**零**处提及,854b202b 起 prepare-task
|
|
43
|
+
* 有 8 处 —— 单调、且探的就是「武装点读不读意图座」这件事本身。dist 未 mangle(属性名从不被 tsc/esbuild 改名),
|
|
44
|
+
* d.ts 不参与判断(类型面运行期探不到,读 js 才是「引擎真这么跑」)。
|
|
45
|
+
* · **佐证(只在主判为 false 时读)= 同批到货的运行时导出** `mailboxCrossProcessMountVerdict`(包内随发的
|
|
46
|
+
* `node_modules/@sema-agent/core/test/export-surface.snapshot.json`(core 包内随发),core `files` 字段含它 —— 消费账本门 A 的同一真源)。
|
|
47
|
+
* - 座缺席 ∧ 标记缺席 ⇒ 就是 npm 7.2.0 那一档 ⇒ `false`(旧式臂,兼容形);
|
|
48
|
+
* - 座缺席 ∧ 标记**在场** ⇒ **矛盾**:dist 已是 854b202b 之后,而武装点不再提这个座名(core 重构/换文件)
|
|
49
|
+
* ⇒ 判据失效,**抛**(不猜。静默回落旧式臂正是「854 之后的部署悄悄退回 org 授予极性」那一形)。
|
|
50
|
+
* - 座在场 ⇒ `true`,不看佐证([ref] 单发的补丁版合法)。
|
|
51
|
+
*
|
|
52
|
+
* 🔴 不用 `import * as core`(消费账本门禁命名空间导入:每个消费名必须可按名对账);两个文件都经主入口 resolve
|
|
53
|
+
* 定位(package `exports` 映射不暴露这些子路径)。**任何读不到 = 抛**,由 boot 装配点承接成拒启(见
|
|
54
|
+
* {@link coreArmsAutoOnIntent})。
|
|
55
|
+
*
|
|
56
|
+
* @param distDir 测试注入的假 `dist/` 根;生产不传(从安装的 core 主入口解)。
|
|
57
|
+
*/
|
|
58
|
+
export declare function coreArmsAutoOnIntentProbe(distDir?: string): boolean;
|
|
59
|
+
/**
|
|
60
|
+
* {@link coreArmsAutoOnIntentProbe} 的**惰性记忆化**访问器 —— 生产装配点(`main.ts` 的 `autoModeFace` 组装,
|
|
61
|
+
* 早于 `server.listen`)调一次,探针抛就是**boot 期响亮拒启**并带指路。
|
|
62
|
+
*
|
|
63
|
+
* 🔴 为什么必须惰性([ref]):此前是模块顶层 `const … = coreArmsAutoOnIntentProbe()`,而 `main.ts` 顶部 import 本模块
|
|
64
|
+
* ⇒ 探针在 **import 期**求值,读不到快照就在任何日志器/诊断存在之前把整台 server 抛死(一个 npm 安装瑕疵 =
|
|
65
|
+
* 一台起不来且没有遗言的机器)。惰性之后,同一条失败落在 boot 装配点,遗言完整、退出码照旧。
|
|
66
|
+
*/
|
|
67
|
+
export declare function coreArmsAutoOnIntent(): boolean;
|
|
68
|
+
/** 装配面交给读面的四件事实(`main.ts` 从 runnerDeps / 合成后的 caps resolver / 到货位取,读面不自算)。 */
|
|
69
|
+
export interface AutoModeFaceDeps {
|
|
70
|
+
/** `RunnerDeps.autoMode !== undefined`——**读**装配点那一位,不写字面 true(与 parked-revive 的
|
|
71
|
+
* `autoModeSeatMounted` 同一纪律:席位哪天改成有条件挂载,这里不能静默错供)。 */
|
|
72
|
+
readonly seatMounted: boolean;
|
|
73
|
+
/** {@link coreArmsAutoOnIntent}(生产装配递探针访问器;测试可递 true 走正控)。false ⇒ `deployment_incapable`。 */
|
|
74
|
+
readonly engineArmsOnIntent: boolean;
|
|
75
|
+
/** 合成后的 per-principal caps resolver(= 递给 `RunnerDeps.runtimeCapsResolver` 的同一只:center 客户端
|
|
76
|
+
* → observer env 基线 → memory grant → 本地 auto deny,单一属主 boot/runtime-caps.ts)。缺席 = 无任何
|
|
77
|
+
* per-principal 源(无 center、无本地 deny)⇒ caps undefined ⇒ 三态之「缺席=不阻」。 */
|
|
78
|
+
readonly resolveCaps?: ((principal: string | undefined) => RuntimeCaps | undefined | Promise<RuntimeCaps | undefined>) | undefined;
|
|
79
|
+
/** 分类器**配置**的模型路由(server 侧按 core 的 role 回落序 `classifier → summarize → default` 从
|
|
80
|
+
* `config.roles` 读到的 catalog 名)。这是「配置了什么」,不是「这次真用了什么」——core 的
|
|
81
|
+
* `derivedRouteFallsBack` 可能在运行期回落到主模型;真值候 core 状态座。
|
|
82
|
+
* 🔴 codex r3 [medium]:是 **getter** 不是快照——config-center 会原地热更新 `config.roles`(Runner 每任务从活引用
|
|
83
|
+
* 重解),boot 期铸的字符串会在热切换后永久陈旧;生产装配递的 getter 调 `classifierRouteFor({ models: config.models, roles: config.roles })` 并把 fault 记 debug。 */
|
|
84
|
+
readonly classifierModel?: (() => string | undefined) | undefined;
|
|
85
|
+
}
|
|
86
|
+
export type AutoModeVerdict = {
|
|
87
|
+
readonly armed: true;
|
|
88
|
+
readonly model?: string;
|
|
89
|
+
readonly fault?: undefined;
|
|
90
|
+
} | {
|
|
91
|
+
readonly armed: false;
|
|
92
|
+
readonly reason: AutoModeUnarmedReason;
|
|
93
|
+
readonly model?: string; /** 仅 resolver_fault 臂:错误原文(不上 wire,路由记 warn)。 */
|
|
94
|
+
readonly fault?: string;
|
|
95
|
+
};
|
|
96
|
+
/**
|
|
97
|
+
* 三项合取的 server 侧裁决。`requestedMode` 缺席 = 按 auto 意图答(「若请求会不会武装」);`principal` =
|
|
98
|
+
* 调用方经门验证的身份(匿名 ⇒ undefined ⇒ center 客户端答 undefined,本地 deny 层照样罩)。
|
|
99
|
+
*
|
|
100
|
+
* 🔴 resolver 抛错**不吞**:合成腿的每一层都自带 fail-closed/缺席臂(center 客户端 catch-all、grant 腿 onFault),
|
|
101
|
+
* 走到这里还在抛 = 装配缺陷,读面 500 比一句编出来的 reason 诚实。
|
|
102
|
+
*/
|
|
103
|
+
export declare function judgeAutoModeArming(face: AutoModeFaceDeps | undefined, input: {
|
|
104
|
+
readonly requestedMode: SettingsPermissionMode | undefined;
|
|
105
|
+
readonly principal: string | undefined;
|
|
106
|
+
readonly entitlementSource: boolean;
|
|
107
|
+
/** 本地 `PERMISSIONS_DISABLE_AUTO_MODE`(= catalog/settings 键 `permissions.disableAutoMode`)是否置 true —— caps false 时分词
|
|
108
|
+
* `local_denied` / `org_denied`(seam ⑤;两者对壳的指路不同:改本机 env vs 找组织)。 */
|
|
109
|
+
readonly localDeny: boolean;
|
|
110
|
+
}): Promise<AutoModeVerdict>;
|
|
111
|
+
//# sourceMappingURL=auto-mode-face.d.ts.map
|