@sema-agent/server 7.105.0 → 7.106.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 +82 -0
- package/USAGE.md +134 -42
- package/deploy/sema-up/chart/templates/server-v4pro.yaml +2 -0
- package/deploy/sema-up/cluster-up.sh +15 -2
- package/deploy/sema-up/kube-up.sh +8 -3
- package/deploy/sema-up/lib/flagshape.sh +29 -0
- package/deploy/sema-up/lib/parse-machines.py +4 -1
- package/deploy/sema-up/sema-up.sh +11 -9
- package/deploy/sema-up/stack/sema-stack-cluster.yaml +3 -1
- package/dist/approval-card.d.ts +1 -1
- package/dist/approval.d.ts +6 -1
- package/dist/approval.js +4 -4
- package/dist/auth-bridge.d.ts +14 -0
- package/dist/auth-bridge.js +7 -0
- package/dist/auto-mode-face.d.ts +49 -40
- package/dist/auto-mode-face.js +6 -68
- package/dist/bench/s1/live-deps.d.ts +9 -2
- package/dist/bench/s1/live-deps.js +13 -8
- package/dist/boot/budget-tracing.js +3 -2
- package/dist/boot/config-center.d.ts +4 -0
- package/dist/boot/config-center.js +95 -37
- package/dist/boot/coordinators.d.ts +1 -0
- package/dist/boot/coordinators.js +3 -1
- package/dist/boot/device-lane.d.ts +2 -1
- package/dist/boot/execution-env.d.ts +11 -0
- package/dist/boot/execution-env.js +30 -6
- package/dist/boot/execution-lane.js +2 -3
- package/dist/boot/leader.d.ts +2 -1
- package/dist/boot/leader.js +2 -0
- package/dist/boot/parked-revive-gate.d.ts +10 -7
- package/dist/boot/parked-revive-gate.js +4 -11
- package/dist/boot/resolve-spec.d.ts +1 -4
- package/dist/boot/resolve-spec.js +44 -21
- package/dist/boot/runner-deps.d.ts +5 -8
- package/dist/boot/runner-deps.js +3 -9
- package/dist/boot/side-query-lane.d.ts +2 -2
- package/dist/boot/stage-03-store-backend.d.ts +1 -1
- package/dist/boot/stage-03-store-backend.js +2 -2
- package/dist/boot/stage-04-stores.d.ts +1 -1
- package/dist/boot/stage-05-execution-env.d.ts +2 -1
- package/dist/boot/stage-05-execution-env.js +2 -2
- package/dist/boot/stage-06-runners.d.ts +3 -2
- package/dist/boot/stage-06-runners.js +2 -5
- package/dist/boot/stage-07-capability-layer.d.ts +2 -2
- package/dist/boot/stage-07-capability-layer.js +1 -2
- package/dist/boot/stage-08-reapers.d.ts +2 -2
- package/dist/boot/stage-09-leader.d.ts +2 -2
- package/dist/boot/stage-09-leader.js +2 -2
- package/dist/boot/stage-10-http-server.d.ts +2 -2
- package/dist/boot/stage-10-http-server.js +11 -7
- package/dist/boot/stores.d.ts +1 -1
- package/dist/boot/stores.js +6 -4
- package/dist/brain.d.ts +24 -2
- package/dist/brain.js +29 -10
- package/dist/budget.js +3 -0
- package/dist/capabilities/center-wiring.d.ts +64 -0
- package/dist/capabilities/center-wiring.js +24 -0
- package/dist/capabilities/composite-members.d.ts +89 -0
- package/dist/capabilities/composite-members.js +20 -0
- package/dist/capabilities/execution-lane.d.ts +3 -0
- package/dist/capabilities/execution-lane.js +5 -2
- package/dist/config-catalog.d.ts +30 -5
- package/dist/config-catalog.js +75 -26
- package/dist/config-center/apply-effective.d.ts +1 -1
- package/dist/config-center/apply-effective.js +7 -8
- package/dist/config-center/apply-ledger.d.ts +17 -0
- package/dist/config-center/apply-ledger.js +5 -0
- package/dist/config-center/center-request.d.ts +17 -0
- package/dist/config-center/center-request.js +4 -0
- package/dist/config-center/pull-state.d.ts +29 -0
- package/dist/config-center/pull-state.js +2 -0
- package/dist/config-types.d.ts +41 -14
- package/dist/config-types.js +1 -0
- package/dist/config.d.ts +35 -0
- package/dist/config.js +69 -16
- package/dist/cross-session-settings.d.ts +1 -1
- package/dist/deployment-governance.d.ts +12 -1
- package/dist/deployment-governance.js +2 -0
- package/dist/execution-lane-caps.d.ts +30 -2
- package/dist/execution-lane-caps.js +12 -0
- package/dist/fleet-client.d.ts +18 -13
- package/dist/fleet-client.js +32 -22
- package/dist/fleet-lease.d.ts +72 -47
- package/dist/fleet-lease.js +66 -14
- package/dist/governance-http-status.d.ts +0 -1
- package/dist/governance-http-status.js +0 -1
- package/dist/hosted-posture.d.ts +6 -17
- package/dist/hosted-posture.js +11 -6
- package/dist/http/admission.js +14 -9
- package/dist/http/approval-sweeps.js +13 -1
- package/dist/http/dispatch.js +1 -1
- package/dist/http/durable-run-leg.js +2 -0
- package/dist/http/request-guards.d.ts +25 -0
- package/dist/http/request-guards.js +25 -5
- package/dist/http/resume-legs.js +19 -11
- package/dist/http/route-ctx.d.ts +9 -0
- package/dist/http/routes/approvals-assistant.js +0 -1
- package/dist/http/routes/capabilities.js +12 -11
- package/dist/http/routes/config-catalog.js +2 -1
- package/dist/http/routes/diagnostics.js +2 -0
- package/dist/http/routes/tasks.js +4 -1
- package/dist/http/server.d.ts +20 -4
- package/dist/http/session-inherit-env.d.ts +37 -0
- package/dist/http/session-inherit-env.js +6 -0
- package/dist/http/wire-types.d.ts +19 -28
- package/dist/index.d.ts +2 -1
- package/dist/index.js +2 -1
- package/dist/key-resolver.d.ts +74 -19
- package/dist/key-resolver.js +65 -7
- package/dist/leader/leader.d.ts +6 -0
- package/dist/leader/leader.js +2 -1
- package/dist/leader/repair-wire.js +2 -1
- package/dist/leader/wire.d.ts +9 -1
- package/dist/leader/wire.js +10 -6
- package/dist/observability/fail-open.d.ts +5 -1
- package/dist/observability/fail-open.js +5 -1
- package/dist/observability/metrics.js +2 -0
- package/dist/observability/permission-rule-events.d.ts +1 -1
- package/dist/observability/permission-rule-events.js +1 -1
- package/dist/observability/run-terminal.d.ts +38 -1
- package/dist/observability/run-terminal.js +2 -5
- package/dist/observability/secret-env-scrub.js +1 -1
- package/dist/observability/tool-trace.d.ts +2 -0
- package/dist/operator-ask.d.ts +29 -1
- package/dist/operator-ask.js +6 -0
- package/dist/parked-decide.d.ts +14 -1
- package/dist/parked-decide.js +8 -1
- package/dist/plugins/session-policy-store-sql.d.ts +38 -7
- package/dist/plugins/session-policy-store-sql.js +64 -22
- package/dist/plugins/sql-driver.d.ts +1 -1
- package/dist/plugins/store-backend.d.ts +12 -3
- package/dist/plugins/store-backend.js +16 -5
- package/dist/plugins/tidb-pool.js +1 -1
- package/dist/read-face-posture.d.ts +4 -4
- package/dist/request-key-closure.js +2 -2
- package/dist/request-value-closure.d.ts +17 -5
- package/dist/request-value-closure.js +12 -0
- package/dist/router/route-orchestration.d.ts +11 -0
- package/dist/router/route-orchestration.js +7 -6
- package/dist/run-local.js +4 -2
- package/dist/runs.d.ts +2 -1
- package/dist/runs.js +4 -4
- package/dist/runtime-caps-resolver.d.ts +4 -10
- package/dist/runtime-governance.d.ts +8 -11
- package/dist/runtime-governance.js +10 -41
- package/dist/sealed-key.d.ts +0 -40
- package/dist/sealed-key.js +0 -20
- package/dist/server-secret-env.d.ts +11 -12
- package/dist/session-policy-wire.d.ts +5 -3
- package/dist/session-titler.d.ts +11 -0
- package/dist/session-titler.js +6 -2
- package/dist/sql-engine-posture.d.ts +2 -2
- package/dist/store-posture.d.ts +53 -0
- package/dist/store-posture.js +32 -0
- package/dist/task-settings.d.ts +34 -45
- package/dist/task-settings.js +46 -25
- package/dist/tool-approval.d.ts +51 -22
- package/dist/tool-approval.js +44 -8
- package/dist/tool-declaration-http-status.d.ts +12 -0
- package/dist/tool-declaration-http-status.js +12 -0
- package/dist/trace/core-keyset-guard.d.ts +7 -7
- package/dist/trace/engine-notice-wire.d.ts +1 -1
- package/dist/trace/engine-notice-wire.js +5 -0
- package/dist/trace/project.d.ts +3 -2
- package/dist/trace/project.js +51 -3
- package/dist/trace/wire-projection-faces.d.ts +1 -1
- package/dist/trace/wire-projection-faces.js +1 -1
- package/dist/unattended-permission-mode.d.ts +110 -0
- package/dist/unattended-permission-mode.js +65 -0
- package/package.json +3 -3
- package/dist/boot/session-shell-gate-registry.d.ts +0 -39
- package/dist/boot/session-shell-gate-registry.js +0 -21
- package/dist/roster-bound-http-status.d.ts +0 -6
- package/dist/roster-bound-http-status.js +0 -6
package/MIGRATION.md
CHANGED
|
@@ -7,6 +7,88 @@
|
|
|
7
7
|
> ⚠️ 完整清单在仓库根 `CHANGELOG.md`——它**不随 npm tarball 出包**(本文件随包)。看完整迁移窗的
|
|
8
8
|
> 权威姿势是源码 tag diff:`git diff v<旧>..v<新>`(每版都推 `v<版本>` tag);npm 包页也镜像 CHANGELOG。
|
|
9
9
|
|
|
10
|
+
## 7.106.0(车QY,S-877 / S-881)—— `@sema-agent/core` 7.35.2(7.35.0 的全部变更 + #1206 新会话锁 + 看门狗 30s 等待披露):一只权限模式 · `approverPosture` / `taskApproverPosture` 删 · `MANUAL_MODE_SHELL_GATE=classify` 拒启 · 宿主子进程 env 按 CC 形剥(git 配置族与代理族原样到达)
|
|
11
|
+
|
|
12
|
+
- **🔴 wire:提交体 `approverPosture` 删,零别名。** 仍带它 ⇒ 400 `request.body_shape`(`unknownKeys:["approverPosture"]`)。**迁移**:删掉这个键;要「宿主自动答卡」的效果用
|
|
13
|
+
`permissionMode`(`acceptEdits` / `bypassPermissions`,后者在托管部署上 422 `request.host_posture_refused`)。能力位 `taskApproverPosture` 同删 —— 读它的探测改读 `taskWriteFaceOpen`
|
|
14
|
+
或直接看提交结果。
|
|
15
|
+
- **🔴 wire:审批卡 / inbox 行 / live `tool_approval` 帧的 `ruleStoreUnreadable` 删。** 规则店读不出时引擎按分区跳过那一读的行,并在会话流上发 `engine_notice`
|
|
16
|
+
`permission.rule_store_unavailable`(`detail.at` = `prepare` / `call`)。**迁移**:按那个通告码渲染「这一轮你的持久规则没生效」;删掉读 `ruleStoreUnreadable` 的分支。
|
|
17
|
+
- **🔴 env:`MANUAL_MODE_SHELL_GATE=classify` 拒启。** 引擎只剩 `always` 一个 shell 门词。**迁移**:改 `always`(整条 shell 进门)或不设 / `off`(不表态)。
|
|
18
|
+
- **行为面:没说模式的 HTTP run 按 `default` 跑**(非只读 shell 与写先问;无人应答 ⇒ 拒)。要免问写就显式 `permissionMode:"acceptEdits"`。
|
|
19
|
+
leader worker / leader 修复腿 / run-local 不走这一条:它们的模式由新旋钮 `UNATTENDED_PERMISSION_MODE` 给,缺省 `bypassPermissions`
|
|
20
|
+
且写面钉 `roots`;写保护表(源表 + `WRITE_PROTECTED_EXTRA` 等)在这些腿上**从问改成拒**(不再被 bypass 释放,候裁 18 D;leader worker 的 park 经 `/decide` 续跑时同样重挂)—— 写门 / 形状层与升级前同,
|
|
21
|
+
写保护不宽于升级前。⚠️ **窄于升级前的一处**(过渡形的已知过拒,fail-closed 方向):shell 从写保护目标**复制出来**(`cp .envrc envrc.bak`、`cp -r .devcontainer …`)
|
|
22
|
+
也被拒(core 路径拒座把 `cp` 的源也按写目标判,与 CC 同形),升级前照跑 —— 补偿 = 旋钮 `acceptEdits|default` + 审批席,或用读工具取内容。
|
|
23
|
+
🔴 **宽于升级前的六类**:根外读探针(`probe`)、MCP / A2A 工具标记、transcript 写、`rule_unreadable`(**规则店读不出时照放** —— 安全轴 fail-open 方向)、
|
|
24
|
+
`artifact_shared_read` —— 升级前这些腿上照问(无人答 ⇒ 拒),缺省旋钮下被释放。**补偿**:`UNATTENDED_PERMISSION_MODE=acceptEdits|default`,或给腿配审批席。
|
|
25
|
+
想更严设 `acceptEdits` / `default` / `dontAsk`,拼错即拒启。**过渡形**:`UNATTENDED_PERMISSION_MODE` 与写保护派生 deny 行是 7.106.0 过渡形;core 7.37.0 到货后(S-906,`AskRequest.askClass?` / `classes?`)退成 `default` + onAsk 按类作答,届时硬删旋钮(拒启点名)。客户端 `bypassPermissions` 不再放掉部署治理层(commandPolicy / 敏感写守卫)的 ask。`config.tool_mount_denied` 的 HTTP 档仍 400。
|
|
26
|
+
- **会话授权(`remember:"session"` / `allow_session`)对引擎的问也生效**:同会话下一次同工具不再出卡(Write / 非只读 Bash 在 `default` 下同此;
|
|
27
|
+
需要审批席 —— `TOOL_APPROVAL_ENABLED` 开,不要活卡再配 `STREAM_ASK_WINDOW_MS=0`)。`APPROVAL_NEVER_AUTO` / 耐久预算耗尽 / **治理层**
|
|
28
|
+
(`runtime.commandPolicy` 的 ask、`AUTONOMY` 折出的门、敏感写守卫集)的卡改成强制卡(`mandated:true`、`ruleOffersAbsence:"mandated"`,此前 `"shadowed"`),
|
|
29
|
+
remember / `allow_session` 只放行这一次。**零动作**(渲卡的壳按「强制卡」分支读这几类卡)。
|
|
30
|
+
- **读拒内建表出厂两档在岗**(`credentials` + 家目录锚定的 `agent-config`):未配置的部署读不到根内 `.ssh` / `.npmrc` / `.aws` 这类名字;**迁移**:要读就
|
|
31
|
+
`READ_DENY_BUILTIN_EXCLUDE` 点名那一行,或显式 `READ_DENY_BUILTIN_TIERS=none`。🔴 `READ_DENY_BUILTIN_EXCLUDE` 里写旧的 agent-config 行名 ⇒ 拒启,
|
|
32
|
+
改成 `~/…` 形;`SENSITIVE_WRITE_PATTERNS` / `WRITE_PROTECTED_EXTRA` / `WRITE_PROTECTED_REPLACE` 里 `~` 起头的项 ⇒ 拒启,去掉 `~/`。
|
|
33
|
+
- **行为面:请求说 `bypassPermissions` 的 run 不再为写保护路径 / MCP·A2A 工具标记 / transcript 写 / 规则店读不出 / 根外读出卡**(引擎直接放行,只留 `tool_end.gate.disposition.released`
|
|
34
|
+
与 `engine_notice` `permission.ask_released_by_mode`;写保护判不出目标的写仍拒);`auto` 下根外读先交分类器判。**迁移**:要这些问照出卡就别发 bypass(改 `acceptEdits` / `default`);
|
|
35
|
+
单用户部署的运维可设 `TASK_WRITE_FACE_ESCALATION=refuse` 让请求层 bypass 响亮 422(托管部署上本就 422)。
|
|
36
|
+
- **wire:`READ_FACE=roots` 面上 Read / Grep / Glob 读工作区外 = 一张卡**(`default` / `acceptEdits` / `plan`;`auto` 先交分类器、`bypassPermissions` 释放)(修前当场拒);新 `tool_end.errorCode` `read_unestablished`;`permission_denied_total`
|
|
37
|
+
的 `deniedBy` 标签 `plan_mode` → `mode`。
|
|
38
|
+
- **🔴 安全面(部署):git 的 env 配置族(`GIT_CONFIG_*` / `GIT_CONFIG_PARAMETERS`)与代理变量现在**连同凭据**原样到达宿主子进程(含模型可驱动的 host shell)。**
|
|
39
|
+
**迁移**:把凭据挪出服务进程 env 的这两族 —— git 走 credential helper 的配置文件、ssh key 文件或 `durableRemote` URL,代理按来源免密(`docs/DEPLOY-PREREQS.md`
|
|
40
|
+
「宿主子进程拿到的 env 改成参照实现的剥除形」节)。`SSH_AUTH_SOCK` 与 `OTEL_*` 自本版起不到宿主子进程:经 ssh-agent 推送的 leader 部署改 key 文件;
|
|
41
|
+
语言服务器 / bake-runner 要 OTel 用 `LSP_ENV_ALLOW` / `BAKE_ENV_ALLOW` 点名放回。`secret_env_scrubbed_total` 的 `kind` 标签换成 core 五词,按
|
|
42
|
+
`suffix-rule` / `family-rule` 写的告警规则改标签。
|
|
43
|
+
- **升级窗**:升级前把**耐久子代 park**(父链经过部署治理层的子代审批)答完或取消 —— 7.105.0 上 park 的这类行在 7.106.0 上可能拒 `resume.parent_constraint_mismatch`
|
|
44
|
+
(pre-CAS,行留 pending,可在旧版本上答完)。同一机制之后常驻:**挂起期间改部署治理 config(收紧或放松)⇒ 那些 park 赎不回**,改回 config 或让子代重新触发。
|
|
45
|
+
检查点行里的旧模式键由引擎一次性迁移(读不出的旧值拒 `resume.legacy_mode_seed`)。
|
|
46
|
+
同段第二件(7.106.0 合并复审 X6):**升级前把 leader worker 的 park 答完或取消** —— 7.105.0 上停放的 worker 行没有服务端写的无人值守标
|
|
47
|
+
(`CheckpointCtx.unattendedLeg`,7.106.0 起才写),升级后经 `/decide` 续跑时不重挂无人值守腿 ⇒ spec 不说模式、checkpoint 里也没有记下的模式 ⇒
|
|
48
|
+
引擎按 `default` 跑:这条 worker 每一次写 / 非只读命令再问一次(durable 部署上再 park,fail-closed,无人值守的 worker 卡住等人)。
|
|
49
|
+
没有 leader worker park 的部署零动作;已升级才发现的,逐条答完那些新卡即可(不会放宽)。
|
|
50
|
+
|
|
51
|
+
## 7.106.0(车QU,S-795 + S-810)—— 降级壳凭据按 boot 身份取值 · 部分应用的拍也签重启
|
|
52
|
+
|
|
53
|
+
- **行为面:反应式降级壳里目标的自有凭据按 boot 那一代的身份取值(S-795)。** 同名 env 变量换值照旧热;降级目标在目录里**换 key 的名字 / 重贴托管密钥**
|
|
54
|
+
要重启才进壳 —— `/health.restart.reasons` 会带 `degrade-route` 告诉编排器(托管密钥重贴 7.103.1 起不签,现在签)。候选部分应用(某组被整组拒)的拍现在
|
|
55
|
+
同样会签(S-810),但审批组 / 模型面组被拒的拍扣下(重启可能起不来),只出 warn `restart_signal_withheld_boot_may_refuse`。**迁移**:无需改配置;按信号
|
|
56
|
+
重启即可;盯着这条 warn 修被拒的组。
|
|
57
|
+
|
|
58
|
+
## 7.106.0(车QR,S-866 云模式波 B)—— 给了 SQL 坐标而没有腿会用它 ⇒ 拒启(点名 `DB_BACKEND` / `SESSION_BACKEND` 出路)· caps 顶层 `sql` 并入 `store.sql` · 目录七行座位与 `center.domainExists` 删除 · 多租租约连接级失败默认 503
|
|
59
|
+
|
|
60
|
+
- **🔴 行为面:给了 SQL 坐标而没有任何腿会用它 ⇒ 配置期拒启(S-866 ⑤b)。** 命中三形(修前都在**静默跑内存**):只设 `MYSQL_HOST` 而不设
|
|
61
|
+
`SESSION_BACKEND` / `DB_BACKEND`;只设 `PG_HOST` 而不设 `SESSION_BACKEND` / `DB_BACKEND`;只设 `PG_HOST` + `SESSION_BACKEND=auto`(引擎缺省 mysql,
|
|
62
|
+
PG 坐标没人用)。坐标被用到的形(`SESSION_BACKEND=mysql|auto` + MYSQL 坐标)不受影响。**迁移**:按拒句点名的出路改 —— 要持久 `DB_BACKEND=pg|mysql`;
|
|
63
|
+
要内存 去掉坐标或 `DB_BACKEND=memory`;要尽力而为 `SESSION_BACKEND=auto` 配对的 `DB_BACKEND`。
|
|
64
|
+
- **🔴 wire:`GET /v1/capabilities` 顶层 `sql` 删除,零别名(S-866 ①)。** 对象逐字搬进新键 `store.sql`(`store` = `{declared, backend, durable,
|
|
65
|
+
degradedReason?, sql?}`,附录 B)。**迁移**:读 `capabilities.sql` 的消费端改读 `capabilities.store?.sql`;`null` 那一义拆成 `store.backend`
|
|
66
|
+
(`memory` / `local` / 降级)与 `store.sql` 缺席。
|
|
67
|
+
- **🔴 wire:`GET /v1/config/catalog` 七行失去中心座位,全部行失去 `center.domainExists`(S-866 ⑤a)。** readFace 四键 / `PERMISSIONS_DISABLE_AUTO_MODE` /
|
|
68
|
+
`MODEL_DEGRADE_ON` / `MODEL_DEGRADE_REACTIVE` 不再带 `center` / `centerDomain` / `centerPath`,`writeLanes` 恒 `["env"]`;中心在管 models 时
|
|
69
|
+
`summary.centerManaged` −2。**迁移**:删掉读 `center.domainExists` 的分支 —— 有 `center` 块 ⇔ 中心可写。
|
|
70
|
+
- **行为面:多租部署(`REQUIRE_PRINCIPAL=true`)的租约连接级失败默认 503(S-866 ③)。** 新旋钮 `FLEET_LEASE_FAIL_CLOSED` 缺省随姿态派生(多租 true /
|
|
71
|
+
单用户 false):中心拒了本引擎的凭证、凭证文件读不出、中心不可达 / 5xx / 超时 / 坏体(以及中心答 404 / 429 / 3xx 这类 200 / 409 / 4xx 凭证码之外的状态)时,计费入口答 **503 `fleet.lease_unavailable`**(新族
|
|
72
|
+
`fleet.`,`Retry-After` 5,体 `reason`)而不是静默放行。**迁移**:要保留 7.105.0 的放行姿态就显式 `FLEET_LEASE_FAIL_CLOSED=false`;SDK / 壳把
|
|
73
|
+
`fleet.lease_unavailable` 当可重试。
|
|
74
|
+
- **行为面:接了中心而不设 `FLEET_ADVERTISE_ADDRESS` 的引擎开始上报用量(S-866 ④)。** 中心三件齐即每 60s `POST /api/fleet/usage`(不注册、不心跳)。
|
|
75
|
+
不想报就不配中心三件。
|
|
76
|
+
|
|
77
|
+
## 7.106.0(车QV,S-891)—— 会话规则 SQL 店:抹除遇计数读不出的行照删,那把键被封、要人恢复
|
|
78
|
+
|
|
79
|
+
- **行为面(只影响库被列外改过的 `DB_BACKEND=mysql|pg` 部署)。** 会话删除 / 2c `overwrite-dst` 抹除到一行计数读不出的 `session_policy`
|
|
80
|
+
行时不再拒 `corrupt`(7.105.0 的半程停),而是照删并**封键**:那把 `(session, principal)` 键之后的读和写都答 500 `corrupt`(与删之前同答;
|
|
81
|
+
这个 principal 在该会话上的新任务拒起,含该会话的 2c 导出),日志一条 `session_policy_erase_sealed_keys` 点名它。**迁移**:按 `USAGE.md` §9.11
|
|
82
|
+
「显式恢复」原地解封那条 `session_policy_rev_mark` 行(`rev` 归 0、`gen` + 1;不要删它);没有坏行的部署零动作。
|
|
83
|
+
|
|
84
|
+
## 7.106.0(车RA,S-895 / S-896 / S-897 / S-904 / S-885)—— 模型钥匙缺席不再借网关钥匙 · settings 权限桶超帽 / 坏项响亮拒 · SUP 路由的问带部署出身 · 新请求键 `inheritEnv` · 目录 `retired[]`
|
|
85
|
+
|
|
86
|
+
- **🔴 行为面:目录条目声明了 `apiKeyEnv` 而进程里没有这个变量 ⇒ 该模型钥匙中毒(S-896)。** 修前静默回落网关钥匙(别家服务的钥匙可能被送到错的端点);修后打这个模型的任务 `failed`、句点名变量名、网关钥匙零字节,`GET /v1/models` 配对标注 `unknown`,起服不受影响。**迁移**:给进程设上那个变量,或从条目删掉 `apiKeyEnv`(走网关钥匙就别声明)。包根类型面 `ModelKeyPoison*` 改名(零别名,tsc 红即通知)。
|
|
87
|
+
- **🔴 行为面:`settings.permissions.allow / deny / ask` 超过 1000 条或含非串 / 空串项 ⇒ 400 `request.field_invalid`(S-904)。** 修前静默截到 1000 条、静默丢坏项(仓库层写上千条规则就能把排在后面的托管 deny 挤出引擎视野);修后 fresh 面 400,体带 `field` / `reason`(`over_cap` | `bad_entry`)/ `count` + `cap` 或 `index`;续跑腿照判 ⇒ 409 `resume_blocked_by_policy` + `blockedBy` + 同组字段。**迁移**:合并规则前按桶去重、控制在 1000 条内;壳按 `errorCode` + `reason` 出句。
|
|
88
|
+
- **行为面:编排路由判到 supervisor 的 shell / 写工具问带 `authoredBy:"deployment"`(S-897;clay 裁定「supervisor 路由的 always 像部署治理钉一样打治理位」)。** 只在 `ROUTER_ENABLED` 开且判到 supervisor 时:这些问变成强制问(卡与 park 行 `mandated:true`),「本会话放行」退不掉、`auto` 下分类器不再替答、`bypassPermissions` 不再放行。**迁移**:无;壳侧 KNOWN-LIMITS 里「SUP 单个强制词被放行」的例外句可删。
|
|
89
|
+
- **additive:请求键 `inheritEnv: "all" | "scrub"`(S-895)** —— host 车道 ∧ 单用户部署(读数 `capabilities.projectContext`)才兑现 `"all"`;托管 × `"all"` ⇒ 422 `request.host_posture_refused`;非 host 车道 × `"all"` / 词表外 ⇒ 400 `request.field_invalid`(`"scrub"` 是缺省,任何车道受理);缺席 = 清洗且清掉该会话上一条声明。7.105.0 及以前发它 ⇒ 400 `request.body_shape`,壳按服务端版本闸发。
|
|
90
|
+
- **additive:`GET /v1/config/catalog` 顶层 `retired[]`(S-885)** —— 恒在场,从 `RETIRED_ENVS` 同一张表派生;包根只读导出 `RETIRED_ENVS`。消费端删手抄退役名单改读它。
|
|
91
|
+
|
|
10
92
|
## 7.105.0(车QQ 部分)—— 门前三族只读路要凭据(S-672)· 会话规则写口拒退役 / 无前缀工具名(S-800)· `ServiceDeps.runnerFor` 必填(S-175)
|
|
11
93
|
|
|
12
94
|
### wire:HTTP / 错误码
|
package/USAGE.md
CHANGED
|
@@ -37,7 +37,7 @@ docker compose up --build
|
|
|
37
37
|
> + TiDB 悲观事务模式(设不上就拒启),PG 腿 `READ COMMITTED`(同样是设了再验,不问服务器缺省 ——
|
|
38
38
|
> 把 PG 钉成 RR 或让部署把默认配成 RR/SERIALIZABLE,都会让每条 `FOR UPDATE` 变成 `40001`)。本仓所有
|
|
39
39
|
> `SELECT … FOR UPDATE` 的单赢家判据都以此为前提。运维读面:
|
|
40
|
-
> `GET /v1/diagnostics/wiring` 的 `sqlEngine` 段与 `GET /v1/capabilities` 的 `sql`
|
|
40
|
+
> `GET /v1/diagnostics/wiring` 的 `sqlEngine` 段与 `GET /v1/capabilities` 的 `store.sql` 位(7.106.0 起;此前顶层 `sql`,S-866 ①)。判据与升级句见
|
|
41
41
|
> `docs/DEPLOY-PREREQS.md`「事务读语义的结构保证」。
|
|
42
42
|
```bash
|
|
43
43
|
IMAGE_REGISTRY=<registry-namespace> \
|
|
@@ -46,6 +46,15 @@ MODEL_GATEWAY_BASEURL=… MODEL_ID=<your-model-name> REMOTE_EXEC=e2b E2B_API_KEY
|
|
|
46
46
|
docker compose up --build --scale service=4 # 4 个无状态 worker,nginx LB 扇发,TiDB 协调
|
|
47
47
|
```
|
|
48
48
|
|
|
49
|
+
> 🔴 **7.106.0 起(S-866 ⑤b)给了 SQL 坐标而当前配置没有任何腿会用它 ⇒ 配置期拒启**:`MYSQL_HOST` 或 `PG_HOST` 在场,而会话后端不是
|
|
50
|
+
> durable(没有 `DB_BACKEND=mysql|pg`、没有 `SESSION_BACKEND=mysql|auto`),或 `SESSION_BACKEND=auto` 探的那只引擎的主机键没设(只设 `PG_HOST`
|
|
51
|
+
> 而 `DB_BACKEND` 缺省 ⇒ 探的是 mysql)。修前这三形**静默跑内存**(什么都不设是 local 文件持久,加一族坐标反而落到内存)。坐标被用到的存量形
|
|
52
|
+
> (`SESSION_BACKEND=mysql|auto` + MYSQL 坐标、不写 `DB_BACKEND`)照旧起服;「不用坐标」是显式表态的(`DB_BACKEND=memory|local`、
|
|
53
|
+
> `SESSION_BACKEND=memory`)也不拒。拒句点名在场的坐标键、为什么没人用、三条出路:要持久 `DB_BACKEND=pg|mysql`(或 `SESSION_BACKEND=mysql`);
|
|
54
|
+
> 要内存 去掉坐标或 `DB_BACKEND=memory`;要尽力而为 `SESSION_BACKEND=auto` 并把引擎指对(`DB_BACKEND=pg` 配 `PG_HOST`)。本仓两份 compose
|
|
55
|
+
> 显式带 `DB_BACKEND=mysql`。同版:`DB_BACKEND=mysql|pg` 显式而 `SESSION_BACKEND` 不许降级时店打不开,拒句同样点名 `DB_BACKEND=<引擎>` 与
|
|
56
|
+
> `SESSION_BACKEND=auto` 出路(修前只有驱动的一句 `connect ECONNREFUSED …`)。持久化姿态读面:caps `store`(附录 B)。
|
|
57
|
+
|
|
49
58
|
> 🔴 7.96.0 起根 `docker-compose.yml` 的 `REMOTE_EXEC`(执行车道)是**必填**:不设 ⇒ `docker compose config` 当场失败(此前静默起成一个没有手的 worker)。单人自用 `REMOTE_EXEC=host`(手落在 worker 容器里);多人 / 生产选隔离车道 `e2b`(配 `E2B_API_KEY`)或 `k8s`(配 `K8S_SANDBOX_IMAGE`)。
|
|
50
59
|
|
|
51
60
|
> 🔴 **7.104.0 起多租户姿态不许跑不分租户的执行车道**:`REQUIRE_PRINCIPAL=true` ∧ 最终生效的车道在执行车道能力表上不分租户 ⇒ **拒启**。按表不按词,今天覆盖 `host` / `ssh` / `adb`(所有任务落同一个共享目标:worker 宿主 / 一台 SSH 对端 / 一台 ADB 设备)。判的是合成后的车道(env 的 `REMOTE_EXEC`、`CONFIG_PROVIDER=local` 而 `REMOTE_EXEC` 未设的隐式 host、local 形 `config.d/remote-exec.json` 的覆写,在中心拉取与任何配置应用之前合成)。拒因(逐字,以 host 为例):`REQUIRE_PRINCIPAL=true (multi-tenant posture) with the "host" execution lane runs every tenant's Bash on one shared target — this lane does not separate tenants; set REMOTE_EXEC to e2b / k8s / local-docker / device, or unset REQUIRE_PRINCIPAL for a single-user box`。车道 × 租户形:
|
|
@@ -230,7 +239,9 @@ MODEL_DEGRADE_ON=rate_limit,breaker_open # 可选,反应式触发器子集;词
|
|
|
230
239
|
`config.d/models.json` 或配置控制面的目录条目上,逐键盖过上面两根 env 缺省(BL-8:没写的键仍继承 env)。
|
|
231
240
|
**坏形/坏词/未知键 ⇒ 丢掉这条 `compat` 声明、模型本体保留**,并打一条 `model_compat_dropped`
|
|
232
241
|
点名 warn(引擎回落到自己的推断 = 今天的行为);一条写坏的声明**不会**让这只模型或整套目录消失。
|
|
233
|
-
- 反应式降级 brain 包在**最外层**;fallback brain 用自己的凭据(decorator 清掉主模型的 per-call key 防外泄给别的 provider)
|
|
242
|
+
- 反应式降级 brain 包在**最外层**;fallback brain 用自己的凭据(decorator 清掉主模型的 per-call key 防外泄给别的 provider)。**7.106.0+**(S-795):
|
|
243
|
+
降级目标的自有凭据按**启动那一代的身份**取值(env 变量名 / 托管密钥),与目标端点同代 —— 同名变量换值热生效;目录换 key 名字 / 重贴托管密钥 / 换端点
|
|
244
|
+
要按 `/health.restart.reasons ∋ degrade-route` 重启。**坑**:`MODEL_DEGRADE_TO` 最好别和被限流的是同一网关/账号,否则反应式切过去照样撞同一个 rate_limit。
|
|
234
245
|
- **定价怎么设**:`model.cost` 来自 `MODEL_COST_INPUT/OUTPUT/CACHE_READ/CACHE_WRITE`(**USD per 1M tokens**)。**四键一个都不设 = 未定价**:成本读面**缺席**(`result.stats.costMicroUsd` 整键不出、`costBreakdown` 不产、`/v1/capabilities.pricingConfigured=false`),不是 `$0` —— 消费端应渲成「未知」。设其中任一键 ⇒ 四键在场(未设的按 0)。本地自托管(qwen)真的没有 per-token 外部花费时,请**显式**把四键设成 `0`:那是一次「声明免费」,读面照常发 `costMicroUsd:0` 且 `pricingConfigured=true`。云模型(如 review-gw 的 deepseek-v4-flash)必须设真价,否则 spend 无从计算。字段名是 `costUsd`,**非美元计价的网关要先折算**(如 DeepSeek 官方 CNY ÷ 汇率)。配置控制面管的模型走 `CenterModel.cost`(中心存价、不存 secret;名册行不带 `cost` = 该模型未定价,同上)。
|
|
235
246
|
- **成本天花板要有价才咬得住**:`MAX_TASK_COST_USD` / `MAX_PRINCIPAL_COST_USD` 量的是 `costUsd`,未定价的模型算不出成本 ⇒ 这两道闸**永不触发**。目录里一只带价模型都没有却配了天花板时,boot 会打一条 `cost_ceiling_without_pricing` 告警(不拒启);token 轴的 `MAX_TASK_TOKENS` 不受影响。
|
|
236
247
|
- 成本计量**自动开**:从 config 的 `model.cost`(per-1M 绝对 USD)注入 `pricing`,core 算出权威的整数 `costMicroUsd`(避免浮点累计误差)。`/metrics` 新增:`model_cost_micro_usd_total{model}`(覆盖所有 brain 调用=主任务+异步+council 子任务的总花费)、`brain_first_token_ms`(网关 hang 早警)、`brain_call_latency_ms`、`tool_calls_total{name,ok}`、`budget_exceeded_total{code}`、`cost_quota_rejected_total`、`degraded_total{reason}`(1.40 降级)。
|
|
@@ -422,6 +433,9 @@ MODEL_CASCADE_LADDER=deepseek-flash,deepseek-pro # 目录里的模型名,cheap
|
|
|
422
433
|
`multi-tenant-shared-lane` / `device-durable-store` / `device-durable-approval`)自 7.104.0 起判在这一步,**不在** `loadConfig()` 里 ——
|
|
423
434
|
只调 `loadConfig()` 的装配对这几形照起。`ctx.configSource === "local"` 时它先读 `config.d/remote-exec.json` 覆写车道(`drivesFromFile`
|
|
424
435
|
= 你的装配驱动得了的文件车道),再判;不走文件覆写的装配直接调同一份判据 `assertExecutionLaneInvariants(config)`。
|
|
436
|
+
- **库形嵌入的 caps `store` 位**(7.106.0 起,S-866 ①;7.106.0 合并复审 X9 补一句):`createHttpServer` 的 `storePosture` dep **不传** ⇒ `GET /v1/capabilities` 的
|
|
437
|
+
`store` 取诚实下限 `{declared: <config.dbBackend>, backend: "memory", durable: false}`,且**没有 `store.sql`**(即使递了 `sqlEngineFacts`、真有 SQL 后端 ——
|
|
438
|
+
7.105.0 上这类嵌入方的顶层 `sql` 是有值的)。要 caps 说真话就把你装出来的后端事实经 `storePosture` 递进来(形 = `src/store-posture.ts` 的 `StorePosture`)。
|
|
425
439
|
- `/health` 身份字段承诺:`pid`(= 引擎进程)、`startedAt`(**7.67.0+**,= 引擎进程起点的 epoch ms,
|
|
426
440
|
一次铸)与 `dataRoot`(= 生效数据根,解析恒回退 `~/.ai-agent`,与 DB_BACKEND 无关)**恒在**——宿主用
|
|
427
441
|
它们验证「这个端口上的 /health 是不是我起的那个引擎」。`startedAt` 变了 = 这个端口后面换了一条命
|
|
@@ -447,6 +461,8 @@ MODEL_CASCADE_LADDER=deepseek-flash,deepseek-pro # 目录里的模型名,cheap
|
|
|
447
461
|
`ready` 同一只判(名册未落时心跳 `ready:false`,落地当刻即再报一次)。fleet 心跳另带 **`restart`**(**7.102.0+**,S-741):
|
|
448
462
|
与 `/health.restart` 同一只取值口、逐字同一个对象(形 = settings-schema `RestartSignal`:`reasons` / `version` / `since`;
|
|
449
463
|
在场即「须重启才能应用配置」,缺席即不需要 —— 中心整行替换);重启信号出现 / 消失 / 变化的当刻即再报一次,不等下一拍心跳。
|
|
464
|
+
**7.106.0+**(S-810):候选**部分应用**(某组被整组拒、其余组已提交)的拍也照同一律算这一信号 —— 修前那一拍不签;被拒的是审批组 / 模型面组时
|
|
465
|
+
(新进程 boot 重判可能拒启)信号扣下、只出 warn `restart_signal_withheld_boot_may_refuse`(点名组与差异)。
|
|
450
466
|
钉:`test/health-readyz.test.ts` / `test/health-readiness-single-source.test.ts`。
|
|
451
467
|
- 模型拒因(**7.103.0+**,S-768):`/health.modelRefusals` 与 fleet 心跳 `modelRefusals` 同一只取值口、同一个对象(形 = settings-schema
|
|
452
468
|
6.2.0 `ModelRefusalsSignal`:`entries` = 目录条目名 → 拒因码,`plane` = 模型面组拒码;值只码)。描述最近一次被判的中心候选目录;
|
|
@@ -616,9 +632,19 @@ SEMA_REGISTRY_TOKEN=<SERVICE_PULL_TOKEN 的值> # 取自配置控制面主机
|
|
|
616
632
|
# 用户 JWT 形(CLI 登录)⇒ skill 正文 / prompt 产物走 /api/v1/me/…;盘上 LKG 与 prompt 状态按「worker + 凭证身份」分箱。
|
|
617
633
|
SEMA_REGISTRY_DRY_RUN=true # 安全灰度:只 LOG 中心配置 vs env 推导的差异,不 apply
|
|
618
634
|
SEMA_REGISTRY_WORKER=<worker名> # 可选:拉取 /effective?worker=<名> 取该 worker 的 roster(reconciler 按 worker 注);不设=全局 roster(向后兼容)
|
|
619
|
-
FLEET_ADVERTISE_ADDRESS=http://<本机可达IP>:8090 #
|
|
635
|
+
FLEET_ADVERTISE_ADDRESS=http://<本机可达IP>:8090 # 可选:设了才启公告环(announce/heartbeat/注销:在中心注册成可路由实例)。
|
|
620
636
|
# 必须是可解析的 http(s) base URL——host:port 等坏形 5.13.0 起 boot 响亮拒
|
|
621
637
|
# (此前静默每拍 announce 400,worker 永不注册)。
|
|
638
|
+
# 🔴 7.106.0 起(S-866 ④)用量批报**不再**看本键:中心三件(URL + 凭证 + SEMA_REGISTRY_WORKER)
|
|
639
|
+
# 配齐即每 60s 向中心 POST /api/fleet/usage(不公告的引擎也报用量;中心据此对租约单调对账)。
|
|
640
|
+
# 不想报就不配中心三件。caps `centerWiring.usageReport` 可读。
|
|
641
|
+
# FLEET_LEASE_FAIL_CLOSED=true # S-866 ③(7.106.0):租约**连接级**失败(中心拒了本引擎的凭证 / 凭证文件读不出;中心
|
|
642
|
+
# 不可达 / 5xx / 超时 / 坏体;中心答 404 / 429 / 3xx 等 200·409·400·401·403 之外的
|
|
643
|
+
# 状态码同归此臂)时,计费入口答 503 `fleet.lease_unavailable`(Retry-After 5,
|
|
644
|
+
# 体 reason = auth-rejected | unreachable)而不是放行。缺省随部署姿态派生:REQUIRE_PRINCIPAL=true
|
|
645
|
+
# ⇒ true,单用户 ⇒ false;显式值压过派生。布尔八词,词表外拒启。409 not-lease 与耗尽 429 不受它管。
|
|
646
|
+
# false = 7.105.0 及以前的 AP 姿态(照旧放行,warn fleet_lease_*_fail_open + 计数)。
|
|
647
|
+
# 生效值 caps `centerWiring.failMode`;只在装了租约管理器的部署上有意义(lease:"absent" 不参与)。
|
|
622
648
|
```
|
|
623
649
|
- 中心**空/未发布** → `applyEffective` 回落 env + 内建 teams 并 warn `config_center_unpublished`,**不影响在跑的服务**(接了也安全)。
|
|
624
650
|
- **逐条容错**(S-704 ②,7.101.0 起):目录里一条条目不合形(如 `contextWindow:"abc"`)⇒ **只丢那一条**(warn `config_entry_dropped`,
|
|
@@ -808,6 +834,41 @@ UNATTENDED_APPROVAL_POLICY=park
|
|
|
808
834
|
不是 server 的 ask 行,「有 durable 设施但没开协议」正是 R-13 要救的那类部署)。要回到旧的「窗满即拒」
|
|
809
835
|
就配 `UNATTENDED_APPROVAL_POLICY=deny`。
|
|
810
836
|
|
|
837
|
+
**「本会话不再询问」对引擎的问也生效(7.106.0 起)**
|
|
838
|
+
|
|
839
|
+
- 审批面 `POST /v1/approvals/:sessionId/decide {decision:"approve", remember:"session"}` 与活卡的 `allow_session` 记下的放行,两处兑现:
|
|
840
|
+
本服务自己的问(`APPROVAL_REQUIRE` 名单、`run_workflow` 问句、acceptEdits 的域外写)在它们自己的层上不再问;**引擎自己的问**(`default`
|
|
841
|
+
模式下的每一次写、证不了只读的 shell 命令)由服务的**审批席**(工具审批协调器)在下一次到达时代答。后一半要审批席在场:
|
|
842
|
+
`TOOL_APPROVAL_ENABLED` 开(多租户缺省关);不想要活卡(纯 park 部署)再配 `STREAM_ASK_WINDOW_MS=0`。
|
|
843
|
+
- 代答不到的:`APPROVAL_DENY` / 敏感路径守卫(是拒,不是问);`APPROVAL_NEVER_AUTO` 与耐久预算耗尽的问(「恒问人」,回执 `rememberApplied:false`);
|
|
844
|
+
委派子代经父链继承到祖先席上的引擎问(引擎盖强制位,席依约不代答)。
|
|
845
|
+
|
|
846
|
+
**无人值守腿的权限模式(`UNATTENDED_PERMISSION_MODE`,7.106.0 起)**
|
|
847
|
+
|
|
848
|
+
```bash
|
|
849
|
+
# 词表 = 引擎的六个权限模式:default | acceptEdits | plan | auto | bypassPermissions | dontAsk。缺省 bypassPermissions。
|
|
850
|
+
# 拼错词**启动期响亮拒**(拒因列出六个合法词;不折大小写)
|
|
851
|
+
UNATTENDED_PERMISSION_MODE=bypassPermissions
|
|
852
|
+
```
|
|
853
|
+
- 管的是本服务**自己铸** spec、**没有调用方**能在请求上说模式、也**没有人**能答问句的三类腿:leader 的 worker、leader 的
|
|
854
|
+
修复腿(集成沙箱修复 / 模块门修复 / 单代理修复环)、`sema` 一次性 CLI(run-local)。`POST /v1/tasks|runs` **不读**本旋钮 ——
|
|
855
|
+
那里模式在请求上(`permissionMode` / `settings.permissions.defaultMode`),不说 = 引擎的 `default`。
|
|
856
|
+
- 为什么要有它:引擎(core 7.34.0)起「不说模式」= `default` —— 每一次写、每一条它证不了只读的 shell 命令先问人。上面三类腿
|
|
857
|
+
没有人可问 ⇒ 那一问当场拒,leader worker 会「跑完了,一个字都没写」。缺省 `bypassPermissions` 让写门 / 形状层回到 7.105.0 的样子
|
|
858
|
+
(写保护表在这些腿上从问改成拒,不随 bypass 放开;🔴 **根外读探针、MCP / A2A 工具标记、transcript 写、`rule_unreadable`、`artifact_shared_read` 六类会被放掉 —— 7.105.0 上它们照问**;
|
|
859
|
+
过渡形:core 7.37.0 到货后本旋钮退成 `default` + 按类作答的审批席并硬删):
|
|
860
|
+
普通问句不问。本旋钮**不增不减**这些腿上已经接着的运维门:运维写下的问(审批名单、治理层的问、hook 的问)在
|
|
861
|
+
`bypassPermissions` 下照问(没人答照旧 park 或拒),拒照拒 —— 它只决定引擎自己的「普通」问句由谁答。
|
|
862
|
+
- 🔴 写面不随它打开:这三类腿的写面恒是工作区根内(`roots`,与 7.105.0 同)—— `bypassPermissions` 在引擎模式表里自带的「根外也能写」
|
|
863
|
+
**不**随本旋钮进来。
|
|
864
|
+
- 想让这些腿更严:设 `acceptEdits`(根内写不问、非只读命令仍问 ⇒ 没人答即拒)、`default`(写与非只读命令都问)或 `dontAsk`
|
|
865
|
+
(凡是会问的一律拒)。run-local 有 TTY 时 `default` 会在终端里问你。
|
|
866
|
+
- `auto` 需要引擎的 auto 分类器席;leader / run-local 的 Runner 不挂它 ⇒ 引擎按「auto 不可用」折回 `default` 并发一条
|
|
867
|
+
`config.permission_mode_unavailable` 通告。中心下发的 `RuntimeCaps.bypassPermissions === false` 同样会把 `bypassPermissions`
|
|
868
|
+
折回 `default`(组织级拒优先)。
|
|
869
|
+
- 纯部署级:不看任何客户端表态,也不参与托管姿态判定(这些腿不是请求)。启动日志一行 `unattended_permission_mode`
|
|
870
|
+
(`value` + `source: env|default`)。
|
|
871
|
+
|
|
811
872
|
**可选 — 写保护名表(S-138;缺席=引擎缺省表在岗)**
|
|
812
873
|
|
|
813
874
|
```bash
|
|
@@ -866,7 +927,12 @@ READ_DENY_PATTERNS='[{"pattern":"**/secrets/**"},{"pattern":".ssh","caseSensitiv
|
|
|
866
927
|
升级后**读得到**根内的 `.npmrc` / `.ssh` / `.aws` / `.claude/settings.json` 这类名字,且整个递归读族
|
|
867
928
|
零卡执行。**要老姿态就显式写** `READ_DENY_BUILTIN_TIERS=credentials,browser,wallet,agent-config`
|
|
868
929
|
(运维面全文见 `docs/DEPLOY-PREREQS.md` 的 core 7.22.0 段)。`open` 与这张表仍是**两个并列机制**:
|
|
869
|
-
`open`
|
|
930
|
+
`open` 放开的是「工作区外」那道围栏,内建表判的是名字。
|
|
931
|
+
🔴 **7.106.0(S-877 / core 7.34.0 R-2)再翻一次**:未设 = **`credentials` + 家目录锚定的 `agent-config` 两档在岗**(`browser` / `wallet` /
|
|
932
|
+
`shell-history` 仍是选装;显式 `READ_DENY_BUILTIN_TIERS=none` 仍是空姿态)⇒ 未配置的机器升级后**读不到**根内的 `.npmrc` / `.ssh` / `.aws` 这类名字
|
|
933
|
+
(每种模式都拒、不出卡)。agent-config 的十五行改写成 `~/…`(`~/.claude/settings.json`、`~/.sema/settings.json` …)、只在执行环境的 home 正下方
|
|
934
|
+
命中 —— 工作区里的 `.claude/settings.json` 不再是内建行;🔴 `READ_DENY_BUILTIN_EXCLUDE` 里写旧行名(`.claude/settings.json`)的部署**起服拒**
|
|
935
|
+
(core 的拒句点名新行名),改写成 `~/.claude/settings.json`。
|
|
870
936
|
· 🔴 **命中这三张表的结局自 core 7.25.0 起是「拒」,不是「问」**(三只旋钮的名字 / 语义 / 缺席读法一字
|
|
871
937
|
未变,变的是结局词):一条命中拒表的读在**每张脸每个时刻**都被拒 —— 不出审批卡、持久 allow 规则
|
|
872
938
|
清不掉、值守的人点「同意」也放不掉。拒因在 `tool_end` 上:`errorCode` 与 `structured` 都是
|
|
@@ -941,11 +1007,9 @@ TASK_WRITE_FACE_ESCALATION=allow # 词表 allow|refuse;坏词启动期响亮
|
|
|
941
1007
|
⚠️ 反面是**全量召回缺口**:忘设 `REQUIRE_PRINCIPAL` 的团队机器按单用户运行、本门放行 —— 多租机器必须自己设它,
|
|
942
1008
|
后果与被排除的候选(`OPERATOR_PRINCIPALS`、`SERVICE_AUTH_TOKENS` 条目数、`DB_BACKEND`、`BIND_HOST`)逐条写在
|
|
943
1009
|
`docs/DEPLOY-PREREQS.md`。
|
|
944
|
-
-
|
|
945
|
-
|
|
946
|
-
|
|
947
|
-
`settings.env` 三条同姿势)。⚠️ 刻意**不拒**:它零授权,而续跑腿逐字重放盘上的体、调用方删不掉它 ⇒
|
|
948
|
-
拒会把一条 parked 任务永久砖死。
|
|
1010
|
+
- ⚰️ **提交体 `approverPosture` 7.106.0 退役**(S-877,core 7.34.0 的单键权限模式):7.93.0–7.105.0 上它是一句宿主姿态声明、托管形上被忽略并留声;
|
|
1011
|
+
core 7.34.0 起按名拒这个键,本仓整键删 —— fresh 提交体仍带它 ⇒ 400 `request.body_shape`(`unknownKeys:["approverPosture"]`);续跑腿重放不过受理门、
|
|
1012
|
+
盘上体里的该键零读点(惰性),parked 任务不因它砖死。能力位 `taskApproverPosture` 同批删。
|
|
949
1013
|
- **续跑腿**:一条在托管形机器上带着 `bypassPermissions` 的 parked 任务,赎回时被同一道门挡住,
|
|
950
1014
|
上层折成 `409 resume_blocked_by_policy`(`blockedBy: request.host_posture_refused`)。
|
|
951
1015
|
运维的解法是 `TASK_WRITE_FACE_ESCALATION=allow`。
|
|
@@ -1206,6 +1270,12 @@ invalid_using_default` 警告 + 退回缺省值」这条臂随词表放宽一并
|
|
|
1206
1270
|
`docs/DEPLOY-PREREQS.md`「带口令的出网代理」);语言服务器 / bake-runner 走各自的名单 `LSP_ENV_ALLOW` / `BAKE_ENV_ALLOW`;沙箱车道走
|
|
1207
1271
|
`E2B_SANDBOX_ENV` / `DOCKER_SANDBOX_ENV`。要不要给 host shell 加部署级名单属于能力面变更(安全轴),不在文档里顺手给。
|
|
1208
1272
|
|
|
1273
|
+
**请求级 `inheritEnv`(S-895,7.106.0 起)—— 调用方声明,不是部署旋钮**:提交体顶层键 `inheritEnv:"all"` 让**这一条请求**的模型驱动 host shell
|
|
1274
|
+
继承整份用户环境(CC 交互形,凭据形变量在内);`"scrub"` / 缺席 = 上面的缺省剥除。🔴 **`"all"` 只在单用户部署兑现**:`REQUIRE_PRINCIPAL=true`
|
|
1275
|
+
⇒ 422 `request.host_posture_refused`(射程与写容纳面那条腿同一只谓词,`TASK_WRITE_FACE_ESCALATION` 不管它);非 host 车道带键 ⇒ 400。部署方
|
|
1276
|
+
**没有**旋钮能替调用方打开它,也没有旋钮能在单用户部署上关掉它(单用户部署的用户把他自己的环境交给他自己驱动的 shell);起服一行 info
|
|
1277
|
+
`task_inherit_env_honored {honored}` 告诉你这台机器认不认。上面「部署级名单不给模型驱动 shell」那条不变 —— 两件事是两条轴(部署名单 vs 调用方 × 单用户射程)。
|
|
1278
|
+
|
|
1209
1279
|
**形状规则的精确名豁免(7.101.0 起,core 7.31.0 #1081)**:十个预算名(`MAX_NEW_TOKENS` `MAX_COMPLETION_TOKENS` `AIDER_MAP_TOKENS`
|
|
1210
1280
|
`AIDER_MAX_CHAT_HISTORY_TOKENS` `MAX_BATCH_PREFILL_TOKENS` `MAX_WAITING_TOKENS` `MAX_TOP_N_TOKENS` `RATE_LIMIT_TOKENS` `PROMPT_TOKENS`
|
|
1211
1281
|
`CONTEXT_TOKENS`)与两个开关(`DB_FOREIGN_KEYS` `JSON_SORT_KEYS`)不再被剥,三条子进程腿同时生效(7.100.0 上这五个 7.30.1 误剥的名
|
|
@@ -1412,7 +1482,7 @@ curl -N http://<host>:8090/v1/tasks/stream -H 'content-type: application/json' \
|
|
|
1412
1482
|
| `GET /v1/agents/roster` | 后台 agent **名册**(7.29 起,需 durable background-agent store,否则 501 `capability.background_agent_store_required`):调用方自己 scope 的 `a…` 行,新→旧。行只带 `handle`/`name`/`agentType`/`status`/`spawnedAt`/`updatedAt`/`settledAt`(content-free;子代产物正文走 `GET /v1/runs/<id>/subagents/<handle>/output`)。查询:`?limit=`(1..100,默认 20)、`?before=`(上一页的 `nextBefore` 游标)、`?status=`(running\|parked\|completed\|failed\|killed)、`?session=`(按会话树窄化)、`?scope=`(**仅** service-token/单用户形;带 principal 的调用方锁定自己)。回体 `{agents,total,nextBefore?,truncated?}`;`truncated:true` = 租户行数超过名册窗(500),`total` 此时是窗内数。非属主的行**不出现也不计数**(无存在性 oracle) |
|
|
1413
1483
|
| `GET /v1/capabilities/scenarios/<name>` | 单个场景的只读详情:工具面、提示词概览、**本部署现在跑不跑得动**(见下) |
|
|
1414
1484
|
| `POST /v1/admin/drain` `{"reason":"…"}` | **停机因由显式声明**(7.35.0+;operator-only —— principal 须在 `OPERATOR_PRINCIPALS` 内,空名单 = 谁都不是 operator ⇒ 恒 403)。设计给编排层(k8s `preStop` / systemd `ExecStop` 等)在发 SIGTERM **之前**调用声明因由;⚠️ **如实**:本仓四条消费树(server/cli/sdk/web-admin)与编排层脚本树 `sema-deploy` 里对它零调用,`sema-comms audits/.md:213` N-18 已把它书面登记为 declined(cli 判定这是 operator 面,不是壳自动打的口)—— 今天它是给**运维手动 curl**(或运维自己写的编排脚本)用的口,不是任何一个内置壳自动调用的。调用后 server 记进程内 `drainState.reason`,draining 期由 `/health` 的 `drainReason` 与 503 `draining` 体的 `reason` 透出(未声明 = 两面键缺席)。声明是**覆盖式**、无 TTL、随进程重启清零 ⇒ 每次停机流程内都要重新声明。`reason` 非空、trim 后 ≤256 字符,坏值 400。无 drain 面装配(嵌入宿主 / 测试)上声明无处可落 ⇒ 501 `capability.drain_state_required`。🔴 **写口是特权的,读口不是**:`/health` 免鉴权(见下一行)且缺省全网卡监听 —— 任何能连到这个端口的人都读得到你写的那句话。**别在 reason 里写工单号、内部主机名或任何内部标识**。 |
|
|
1415
|
-
| `GET /v1/config/catalog` | **配置目录自描述**(operator-only —— `explicitOperatorOk`,空名单=谁都不是)。逐 env 键一行:`{name, domain, type, semantics, writeLanes, effectiveLane, envHeld, envTiming, staticDefault?/derivedDefaultNote?, effectiveValue, valueClass, danger, center?{domain,path,precedence,timing,restartSlice?,
|
|
1485
|
+
| `GET /v1/config/catalog` | **配置目录自描述**(operator-only —— `explicitOperatorOk`,空名单=谁都不是)。逐 env 键一行:`{name, domain, type, semantics, writeLanes, effectiveLane, envHeld, envTiming, staticDefault?/derivedDefaultNote?, effectiveValue, valueClass, danger, center?{domain,path,precedence,timing,restartSlice?,managedNow,effectiveNow}}`(🔴 7.106.0 起 `center.domainExists` 删除:座位在加载期对契约 `DOMAIN_SCHEMAS` 核过域 + 路径,核不过即拒启 ⇒ 有 `center` 块 ⇔ 中心可写;readFace 四键 / `PERMISSIONS_DISABLE_AUTO_MODE` / `MODEL_DEGRADE_ON` / `_REACTIVE` 七行的座位随之删除,S-866 ⑤a);顶层带 `restartSlices`(重启片闭集)与 `centerDomains`(settings-schema 现行域表)。**两轴不混**:`writeLanes`=谁能写,`effectiveLane`=现在谁在生效(env-wins 族 env 占位 ⇒ center 腿 `effectiveNow:false`)。secret 类值**永不回传**(只回在场位;opaque 回在场位+长度;URL 剥 userinfo)。完备性由仓内 AST 双向对账门执法(分母=全 `src/` 生产 env 读取点)。旋钮 `CONFIG_CATALOG_ENABLED=false`(合规部署)⇒ 路径 404 + 能力位 `configCatalog:false`。响应 `Cache-Control: no-store`。**7.57.0 起**:`enum` 行的 `effectiveValue` **恒落在该行自己的 `enumValues` 闭集内**(仓内机器门执法)——此前 `SESSION_BACKEND` 回的是**内部标签** `tidb`(自 5.0.0 起是**退役公名**,写回去 boot 拒),现归一成公名 `mysql`;`MODEL_DEFAULT_THINKING` 补上一直被解析器接受、却漏在目录闭集外的 `xhigh`,并改为回**实算值**(`off`/未设 ⇒ `null`)而不是 env 原文。 |
|
|
1416
1486
|
| `POST /v1/admin/config/refresh` | **配置手动刷新**(operator-only,与上一行同门:空 `OPERATOR_PRINCIPALS` ⇒ 恒 403)。改完中心配置 / `config.d` 之后不想等 60s 轮询就调它:触发**一次既有**的 refresh 拍(在飞则汇入那一拍,绝不并发双拍),返回时该拍已落地。200 体 `{triggered:true,targetVersion,appliedVersion}` —— 两个世代号与 `/health` 的 `configTargetVersion`/`configAppliedVersion` 同源。本部署没有配置管道(纯 env worker:既没配 `CONFIG_CENTER`、也不是 `CONFIG_PROVIDER=local`)⇒ 409 `config.refresh_unavailable` 指路,不会回一个「触发了但什么都没发生」的 200。 |
|
|
1417
1487
|
| `GET /health` | 健康(无需鉴权)。**7.67.0+** 恒带 `startedAt`(引擎进程起点 epoch ms,一次铸;与 `pid` 并列的换代锚——值变了就是换了一条命)。7.37.0+ 配置管道在场时带世代账键:`configTargetVersion`(本副本**最后见到**的配置版本,身份标)、`configAppliedVersion`(最后一次真落地的版本)、`configTargetOrdinal`/`configAppliedOrdinal`(7.38.0-rc.2 起,**收货序数**——`CONFIG_PROVIDER=local` 下 version 是内容哈希不承诺序,「改了没生效」看序数对不对齐)、`configApplyStaleMs`(target≠applied **持续**时长;收敛时键缺席)—— 编排器据此摘掉「配置持续落后」的副本 |
|
|
1418
1488
|
| `GET /v1/sessions/:id/background` · `POST /v1/sessions/:id/background/stop` `{"includeRetained":true\|false}` | **会话后台任务的读口与停止口**(**7.102.0+**,S-745;能力位 `background.listFace` / `background.exitFaces`,老 server 404)。读口列**本会话**、**本副本**上的后台任务行(`{ rows: [{ id, description?, type, status, createdAt, sessionScoped, retained? }] }`,`retained:true` = 声明了保留的活服务,正常退出不会停它);停止口「软 → 等一次 `HOST_BG_KILL_GRACE_MS` → 硬」收掉本会话的后台 shell(SIGTERM 处理器先有一次宽限跑完,之后组 SIGKILL,屏蔽 SIGTERM 的循环也活不过去;有后台行时应答慢一次宽限)并逐字返回受据 `{ receipts: [{ id, outcome }] }`:`killed` / `already_gone` / `retained_skipped`(`includeRetained:false` 留下的活服务)/ `no_pgid`(远端 / 沙箱车道没有本机进程组可发,已派普通 kill,「可能还在跑」;host 车道的 `already_gone` 只由观察得出 —— 引擎已收割组长或内核答组已空,7.103.0 起,S-769;darwin 上梯子那一枪先落地、引擎还没收割的那一拍如实答 `no_pgid`,判「收掉没有」读进程)。`includeRetained` 必填:`true` = 连活服务一起停(壳的「Exit and stop tasks」),`false` = 活服务照留(`sema kill`)。鉴权 = 会话属主或显式 operator(未知与他人同 404);停止口在无凭据写门内(没配 service 凭证且未开 `ALLOW_UNAUTHED_WRITES` ⇒ 503 `auth.service_token_required`)。`DELETE /v1/sessions/:id` 走同一只收敛(`includeRetained:false`);run 取消(Esc)**不**收后台 shell。契约 §16 |
|
|
@@ -1739,7 +1809,7 @@ curl -N http://<host>:8090/v1/tasks/stream -H 'content-type: application/json' \
|
|
|
1739
1809
|
| HTTP `429` + `errorCode:"limit.cost_quota_exceeded"` | per-principal 累计成本配额越顶(`MAX_PRINCIPAL_COST_USD`;**进场门**,不打断在跑的 run) | 看 `Retry-After` / 体 `retryAfterSec` 退避;窗滚过或调高上限后放行 |
|
|
1740
1810
|
| HTTP `429` + `errorCode:"usage.window_exhausted"` | 部署级治理窗耗尽(`USAGE_WINDOWS`,token 或 $ 天花板先满者) | 看响应体 `retryAfterSec` 退避;窗滑动/桶到期后放行 |
|
|
1741
1811
|
| `terminal:{kind:"failed", code:"usage.window_exhausted"}` | 已受理的 run 在 **turn 边界**撞上治理窗且无法 durable 挂起 | 同上退避后重投;配好 checkpoint 基建则改为 `suspended` 等窗自动续跑 |
|
|
1742
|
-
| HTTP `501`(`/v1/runs`) | 内存模式不支持异步 |
|
|
1812
|
+
| HTTP `501`(`/v1/runs`) | 内存模式不支持异步 | 配持久存储(`DB_BACKEND=mysql` / `pg` + 坐标;7.106.0 起给了坐标必须点名 `DB_BACKEND`,S-866 ⑤b) |
|
|
1743
1813
|
| HTTP `500` + `errorCode:"corrupt_session"`(7.104.0 起;流式口在应答头之后则是 `done` 帧的 `result.terminal.code`,后台 run 是 run 行的 `errorCode`) | 这只会话的**存档读不出**、唤不醒(文件后端:会话日志没有会话头;SQL 后端:一行事件读不出)。这一轮没跑,一个 token 没烧。直接读这只会话的口(头探针 / 会话视图 / 导出 / 分叉 / 2c 同步)同答(契约 §17) | **别重试**(确定性失败)。运维看日志 `session_repo_corrupt_read`(带文件路径与跳过行号)修或移开那份存档;要继续工作就换一个新会话 |
|
|
1744
1814
|
| 流里一帧 `engine_notice` `code:"session.records_skipped"`,`detail:{ dropped, entriesKept, sessionId }`(7.104.0 起,只在文件后端) | 这只会话的存档打开时有 `dropped` 条记录读不出、被跳过了;这一轮**照跑**,但模型读到的历史只剩 `entriesKept` 条。存档没修好之前,每次真正打开这只会话都会再说一次(会话缓存命中的轮次不打开、不说;`SESSION_CACHE_TTL_SEC=0` 时每一轮都说) | 告诉用户「这段对话的一部分历史丢了」;运维按日志 `session_repo_corrupt_read` 查那份文件。非流式 `POST /v1/tasks` 收不到通告帧(只有日志) |
|
|
1745
1815
|
|
|
@@ -1857,14 +1927,13 @@ armed ⟺ 本次请求 permissionMode 是 "auto" ∧ 本部署装配了分类
|
|
|
1857
1927
|
|
|
1858
1928
|
| 旋钮 | 缺省 | 语义 |
|
|
1859
1929
|
|---|---|---|
|
|
1860
|
-
| `PERMISSIONS_DISABLE_AUTO_MODE` | `false`(opt-in) | CC/center/settings 键名 `permissions.disableAutoMode` 的 **env 腿**(
|
|
1930
|
+
| `PERMISSIONS_DISABLE_AUTO_MODE` | `false`(opt-in) | CC/center/settings 键名 `permissions.disableAutoMode` 的 **env 腿**(settings-schema 现无 `permissions` 域 ⇒ 7.106.0 起目录行**不带**中心座位,`writeLanes` 只有 `env`;S-866 ⑤a):**tighten-only** 棘轮 —— `true` ⇒ 本部署每个 principal 的 `caps.autoMode` 折成 `false`(center 授予 `true` **翻不回**);未设 ⇒ 不动 caps。布尔词表(`true/false/1/0/yes/no/on/off`),词表外的值**拒启**(安全轴旋钮不许静默回默认)。目录行见 `GET /v1/config/catalog`(approval 域,security 轴) |
|
|
1861
1931
|
| `AUTO_MODE_CLASSIFIER_TIMEOUT_MS` | 未设(⇒ core 缺省) | 7.102.0 起(S-757):auto 分类器**一级梯子**的判决上限(整数 ms)→ core `RunnerDeps.autoMode.timeoutMs`。一级到点没裁 ⇒ 走下一级(`AUTO_MODE_CLASSIFIER_FALLBACK` 决定有没有下一级),走完仍没裁 ⇒ 这次门控调用**整条拒**、不出卡;最坏等待 ≈ 级数 × 本值 + 一次装配。**自托管慢网关**(排队 + prefill 以分钟计)在缺省上限内答不出 ⇒ auto 下工具一律被拒 —— 按后端实测留足(如 `180000`)。未设 / 空串 ⇒ 本仓**不铸键**,由引擎落它自己的缺省(不复制上游数字);合法域 `[1000, 2147483647]` 内的十进制整数,`0`(本座没有「关」)/ 亚秒 / 小数 / `1e5` 这类拼法 / 越 Node 定时器上界一律**拒启**。旋钮无条件(与 auto 是否武装无关);不影响 `permissionModeAuto` 读面。目录行见 `GET /v1/config/catalog`(approval 域) |
|
|
1862
1932
|
| `CROSS_SESSION_INBOUND` | 未设 | 跨终端会话设计线:CC settings 键名 `crossSessionInbound` 的**部署/组织层**(引擎层形的 `managed` 层,CC `policySettings` 对位)—— 本部署对**入站跨会话消息**的治理四态(词表取自引擎闭集,core 7.30.0 起):`wake` 投递且**宿主**可在收件箱增长时起一个 turn / `next-turn` 在下一个 turn 边界投递 / `hold` 停在收件会话的待审队列(模型看不见、不能据此行动)/ `refuse` 本部署整体退出这条车道。⚠️ 本服务宿主**不起 turn**,所以在本服务上 `wake` 按引擎契约的降级臂读作 `next-turn`。🔴 **旧词 `accept` 自 7.100.0(core 7.30.0 提货)起拒启** —— 它的原义就是 `next-turn`,改成那个词即可(零别名,拒启即通告)。🔴 **未设 ≠ `next-turn`**:未设 = 这一层不表态,由其余层与引擎的 mode-parity 判定决定。词表外的值**拒启**。⚠️ **生效前提**:引擎的 peer 目录席(`RunnerDeps.peerDirectory`)在场 —— 7.91.0 起已接线(会话枚举面 ∧ mailbox 店 ∧ 收件人生命周期面三合取),缺任一合取项的部署上本旋钮仍「就位待命」;目录行见 `GET /v1/config/catalog`(approval 域,security 轴) |
|
|
1863
1933
|
| `CROSS_SESSION_DIALOG_EXPIRY` | 未设(⇒ 引擎缺省 `5m`) | 同族:CC settings 键名 `dialogExpiry` 的部署层 —— 被 hold 的跨会话消息等待人审多久后按**安全缺省**结算(过期丢弃,**带回执**告知发送方,不静默吞)。词表 `60s`/`5m`/`10m`/`never`(`never` = 不设期限);未设 ⇒ 本仓**不铸键**,由引擎落它自己的缺省(不复制上游缺省值)。词表外拒启。⚠️ 生效前提同上。另注:CC 的同名键还有第二个消费面(转发到远端客户端的审批对话框停靠时长),本旋钮**今天不驱动**那一面 |
|
|
1864
1934
|
|
|
1865
|
-
**自查读面**(`GET /v1/capabilities.permissionModeAuto`,壳的 `sema doctor permissions`
|
|
1866
|
-
`intentArming
|
|
1867
|
-
`intentArming:false, armed:false, reason:"deployment_incapable"`,见 `reason`/`intentArming` 条):
|
|
1935
|
+
**自查读面**(`GET /v1/capabilities.permissionModeAuto`,壳的 `sema doctor permissions` 消费;server 7.106.0 起引擎只剩一种武装极性,
|
|
1936
|
+
`intentArming` 恒 `true`,见该条):
|
|
1868
1937
|
|
|
1869
1938
|
```
|
|
1870
1939
|
GET /v1/capabilities?permissionMode=auto
|
|
@@ -1876,15 +1945,12 @@ GET /v1/capabilities?permissionMode=default
|
|
|
1876
1945
|
- `armed`:按上式此刻会不会武装(`?permissionMode=` 折进本次意图;查询串缺席 = 按 auto 意图答「若请求会不会武装」;
|
|
1877
1946
|
五词之外 400 `request.field_invalid`)。
|
|
1878
1947
|
- `reason`(未武装时,闭集**六词**,判序即武装式合取序):`mode_not_auto`(意图不是 auto)/ `deployment_incapable`
|
|
1879
|
-
(装配面没挂分类器席位——生产装配恒挂,桩与一次性 CLI
|
|
1880
|
-
|
|
1881
|
-
|
|
1882
|
-
|
|
1883
|
-
|
|
1884
|
-
|
|
1885
|
-
(npm core 7.2.0 下 `false`:此时 `armed` 仍是**当前真值**——center 授予了的 principal 答 `true`,因为它
|
|
1886
|
-
真在武装——且**不看查询串**,旧式 core 不读 permission mode,授予即武装,`mode_not_auto` 只在新式下出现;无 center
|
|
1887
|
-
的本地部署答 `false`/`deployment_incapable`)。
|
|
1948
|
+
(装配面没挂分类器席位——生产装配恒挂,桩与一次性 CLI 不挂)/ `org_denied`(`caps.autoMode === false`:center 显式 deny、
|
|
1949
|
+
center 硬失败 fail-closed 拒项)/ `local_denied`(本地旋钮 `PERMISSIONS_DISABLE_AUTO_MODE=true`,改本机 env)/ `settings_denied`
|
|
1950
|
+
(settings 层 `permissions.disableAutoMode:"disable"`——本面不产,归 run 级面)/ `resolver_fault`(per-principal resolver 抛错,
|
|
1951
|
+
引擎同形全拒)。
|
|
1952
|
+
- `intentArming`:7.106.0 起恒 `true`(引擎只剩意图武装式一种极性:无 center 也能 auto);≤7.105.0 由安装包探针答,`false` = 旧式
|
|
1953
|
+
「组织授予」极性。键名与值形不动,整键删除见 7.107.0。
|
|
1888
1954
|
- `model`:分类器**配置**路由(role 回落序 `classifier → summarize → default` 的 catalog 名),不是本次真用的模型。
|
|
1889
1955
|
- `entitlementSource` 仍只说「center 源在不在」;新武装式下它为 `false` **不再**意味着 auto 不武装。
|
|
1890
1956
|
- 读面按调用方身份解 per-principal caps(与引擎同一只 resolver,per-principal 缓存 60s;center 硬失败时受 8s
|
|
@@ -2029,23 +2095,15 @@ WebSearch 工具的 `tool_result` 错误文本,回到模型的对话里,**不是
|
|
|
2029
2095
|
| `LOG_LEVEL` | `info` | 日志档位 |
|
|
2030
2096
|
|
|
2031
2097
|
**子进程 env(7.103.0,S-684 残余)。** runner 起的每一只子进程组 —— `build.sh`,以及主机命令 `git fetch` / `docker push` /
|
|
2032
|
-
`docker image inspect` / `df` —— 拿到的 env = 本进程 env **剥密**:core
|
|
2033
|
-
服务配置目录里的 secret 名 ∘ 名单型旋钮原文。runner 自己的
|
|
2034
|
-
`secret_env_scrubbed`(warn,site = `server.bake-runner.spawn-env`,带 `allowed`
|
|
2035
|
-
|
|
2098
|
+
`docker image inspect` / `df` —— 拿到的 env = 本进程 env **剥密**:core 的一变量一判(7.106.0 起 = core 7.35.0 #1201,参照实现 CC 2.1.280 的形:
|
|
2099
|
+
凭据名表 / `OTEL_*` 前缀 / `SEMA_` 命名空间 / 名字形状 / 值里带凭据,动作恒为整只删)∘ 服务配置目录里的 secret 名 ∘ 名单型旋钮原文。runner 自己的
|
|
2100
|
+
`BAKE_RUNNER_TOKEN` 在内。剥了什么在第一次起组时记一行 `secret_env_scrubbed`(warn,site = `server.bake-runner.spawn-env`,带 `allowed` 与出路句;只键名,
|
|
2101
|
+
不带值)。`PATH` / `HOME` / `NO_PROXY` / `DOCKER_CONFIG` / `BAKE_IMAGE_REGISTRY` / `RECIPE_GITSHA` 这类非密钥键照常传。
|
|
2036
2102
|
docker 推送的鉴权走构建宿主上的 docker 凭据存储(`docker login`),不走 env,不受影响。
|
|
2037
|
-
git 的 env
|
|
2038
|
-
|
|
2039
|
-
`
|
|
2040
|
-
|
|
2041
|
-
`git config --list` 看得见一行 `sema.withheld=`),其余条目与 `GIT_CONFIG_COUNT` 原样(不重排、不改写)。被扣的成员进同一行 `secret_env_scrubbed`
|
|
2042
|
-
(`kind` = `family-rule`,只点名子进程没按原样拿到的名字)。COUNT 按 git 自己的读法读(` 2` / `+2` / `02` 照认;git 拒的写法原样交出,子进程里的 git 照样拒);
|
|
2043
|
-
POSIX 上只有大写成员名是 git 读的记录,别的拼写按普通变量另判。点名放回(`BAKE_ENV_ALLOW`)按名叠在剥除结果之上:一条被扣的配置把
|
|
2044
|
-
`GIT_CONFIG_KEY_<i>` 与 `GIT_CONFIG_VALUE_<i>` **两只一并点名** ⇒ 这一条原样交出(只点一只 = 与另一只的占位半条配成一对)。要被扣的那类配置稳定到达,
|
|
2045
|
-
改用文件型 git 配置(`~/.gitconfig`,不放凭据)。带口令的 `http_proxy` / `https_proxy` / `all_proxy` 与 `npm_config_https_proxy` / `npm_config_proxy` /
|
|
2046
|
-
`ftp_proxy`(大小写两形)同样不交(core 7.33.5 #1150 / 7.33.6 #1165),写死口令的 `GIT_SSH_COMMAND` / `GIT_PROXY_COMMAND` 也不交;配方真要带口令的代理 ⇒
|
|
2047
|
-
`BAKE_ENV_ALLOW` 点名放回 env 里**实际的拼写**(`HTTPS_PROXY` / `https_proxy`;走 `http://` 目标的工具只读小写 `http_proxy` —— curl(1)),或让代理
|
|
2048
|
-
按来源免密。运行时才拼出来的口令(`$(…)` / `$VAR` 取值)core 读不到、照原样交出 —— 凭据别放进 env。
|
|
2103
|
+
🔴 **git 的 env 配置族(`GIT_CONFIG_COUNT` / `GIT_CONFIG_PARAMETERS` / `GIT_CONFIG_KEY_<数字>` / `GIT_CONFIG_VALUE_<数字>`)与代理变量一族(`http(s)_proxy` /
|
|
2104
|
+
`all_proxy` / `no_proxy` / `npm_config_*proxy` …,任意大小写)是豁免族 —— 名与值都不读、原样交给子进程,凭据在内**(7.106.0 起;7.103.x–7.105.0 的逐条扣、
|
|
2105
|
+
原位占位 `sema.withheld`、代理 userinfo 扣全部退役)。⇒ 凭据别写进这几族:git 凭据走 credential helper 的配置文件、代理按来源免密。`SSH_AUTH_SOCK` 与
|
|
2106
|
+
每一只 `OTEL_*` 自同一版起扣;配方真要它们 ⇒ `BAKE_ENV_ALLOW` 点名放回。全文见 `docs/DEPLOY-PREREQS.md`「宿主子进程拿到的 env 改成参照实现的剥除形」节。
|
|
2049
2107
|
|
|
2050
2108
|
**`BAKE_ENV_ALLOW=NAME,NAME`。** 配方真要一枚密钥形 env(例如 build.sh 里自己做 registry 登录要 `REGISTRY_PASSWORD`,或
|
|
2051
2109
|
`git fetch` 的 askpass 读 `GIT_TOKEN`)⇒ 点名它,runner 把该键从本进程 env **原样**放回给每一只子进程组(部署方显式承担)。
|
|
@@ -2283,8 +2341,10 @@ const ciphertext = Buffer.from(sodium.crypto_box_seal(sodium.from_string(apiKey)
|
|
|
2283
2341
|
不是下面三种失败词之一。
|
|
2284
2342
|
|
|
2285
2343
|
**④ 与 `apiKeyEnv` 的关系(按代码行为)。** 同一条目两个都写 ⇒ **sealed 优先,`apiKeyEnv` 整条不看**:开箱成功就用开出来的 key;开箱失败 ⇒
|
|
2286
|
-
这只模型的每一次模型调用都失败(用它的任务响亮失败),**不退回 `apiKeyEnv`,也不退回网关 `MODEL_API_KEY
|
|
2287
|
-
|
|
2344
|
+
这只模型的每一次模型调用都失败(用它的任务响亮失败),**不退回 `apiKeyEnv`,也不退回网关 `MODEL_API_KEY`**。🔴 **7.106.0 起(S-896)两种写法
|
|
2345
|
+
「坏了之后」方向相同**:只写 `apiKeyEnv` 而本服务进程里那个 env 变量没设(或是空串)⇒ 这只模型的钥匙同样中毒 —— 起服照常,每一次模型调用都失败、
|
|
2346
|
+
拒句点名那个变量(理由 `env_missing`),**不退回网关 `MODEL_API_KEY`**(7.105.0 及以前在这里静默退回网关 key)。配置应用时仍有一行 warn
|
|
2347
|
+
`sema_registry_model_key_env_missing`(hint 说中毒与出路)。出路:在跑本服务的进程环境里设上那个变量并重启;真想让这只模型用网关 key,就从条目上删掉 `apiKeyEnv`。
|
|
2288
2348
|
|
|
2289
2349
|
**⑤ 三种失败词**(配置应用那一拍每只模型一行 warn;用这只模型的任务在模型调用处失败,错误句里带失败词与 `publicKeyId`):
|
|
2290
2350
|
|
|
@@ -2314,3 +2374,35 @@ env 变量没设 ⇒ 这只模型退回网关 key(配置应用时 warn `sema_reg
|
|
|
2314
2374
|
跨主机共享(`docs/DEPLOY-PREREQS.md`)。
|
|
2315
2375
|
- **走中心形**:接配置中心,执行侧公钥登记在中心(起服时带管理令牌自动上报,否则把公钥打印出来供手工登记),web 面对着登记的公钥封、中心存密文。
|
|
2316
2376
|
调用方不必逐台去问 caps;但同一个 worker 的多个副本各有各的保管店这件事中心形不改变 —— 要它们都开得了同一份密文,仍要共享保管目录。
|
|
2377
|
+
|
|
2378
|
+
### 9.11 会话规则店:抹除封键与显式恢复(7.106.0 起)
|
|
2379
|
+
|
|
2380
|
+
适用于 `DB_BACKEND=mysql|pg`(SQL 会话规则店;`DB_BACKEND=local` 用的是引擎自带的文件店,不在本节)。
|
|
2381
|
+
|
|
2382
|
+
**什么时候会封。** `DELETE /v1/sessions/:id` 或 2c `overwrite-dst` 导入抹除一个会话的规则时,如果某一行 `session_policy` 的
|
|
2383
|
+
计数读不出(`rev` 不是 ≥ 1 的安全整数,或 `gen` 不是 ≥ 0 的安全整数;生产写点不产生这种值,只可能来自手改、撕裂写或迁移脚本),
|
|
2384
|
+
那一行**照删**,但它的键在 `session_policy_rev_mark` 里留一条 `rev = 9007199254740991`(安全整数上界)的**封键记号**。同时日志里
|
|
2385
|
+
有一条 warn `session_policy_erase_sealed_keys`,点名 `sessionId`、每把被封的 `policyKey`(`sha256` 单向哈希)和那一行的原计数。
|
|
2386
|
+
删除本身照常成功。
|
|
2387
|
+
|
|
2388
|
+
**封着是什么样。** 那把 `(session, principal)` 键的读和写都答 500(`corrupt`),与这一行被删之前一样:`GET` / `PUT
|
|
2389
|
+
/v1/sessions/:id/policy`、2c 导入的规则重放、2c 导出(会话里只要有一把封着的键,整个会话的规则导出就拒)都拒;这个会话、这个
|
|
2390
|
+
principal 上的新任务在 prepare 读规则时被拒,不会以「没有规则」起跑。同一个会话 id 被重新登记后,新会话在同一把键上同样如此。
|
|
2391
|
+
列出所有被封的键:
|
|
2392
|
+
|
|
2393
|
+
```sql
|
|
2394
|
+
SELECT policy_key, session_id, gen, erased_at FROM session_policy_rev_mark WHERE rev = 9007199254740991;
|
|
2395
|
+
```
|
|
2396
|
+
|
|
2397
|
+
**为什么不自动解。** 这一行的号读不出来,不能拿它来结束这一行的血统(世代)。持有这一行变坏之前快照的读者包括在跑的任务、它们
|
|
2398
|
+
委派出去的子代,以及 checkpoint 里持久化了祖先规则、之后会被唤醒的 parked 子代,它们每道工具门都会重读规则。如果重建的行与这些
|
|
2399
|
+
快照同世代,读者会把重建的宽松规则读成延续,把收紧翻掉。这个情形已经被真实复现过:Bash 从 deny 变成了 allow。
|
|
2400
|
+
|
|
2401
|
+
**显式恢复(没有端点,一句 SQL)。** 按 warn 里的 `policyKey` 原地解封(MySQL 协议与 PG 同一句):
|
|
2402
|
+
|
|
2403
|
+
```sql
|
|
2404
|
+
UPDATE session_policy_rev_mark SET rev = 0, gen = gen + 1 WHERE policy_key = '<warn 里的 policyKey>' AND rev = 9007199254740991;
|
|
2405
|
+
```
|
|
2406
|
+
|
|
2407
|
+
解封之后这把键没有规则,下一次写从 `rev 1` 开始,世代是新的一代,持有旧快照的读者因此不会把它读成延续。**不要**删掉这条记号:
|
|
2408
|
+
删掉会把这把键的世代交回 0,正好与那些旧快照同代。要恢复规则,解封后照常 `PUT /v1/sessions/:id/policy`(或重跑那次 2c 导入)。
|
|
@@ -55,6 +55,8 @@ spec:
|
|
|
55
55
|
- { name: MODEL_ID, value: {{ required "serverV4pro.modelId is required" .Values.serverV4pro.modelId | quote }} }
|
|
56
56
|
- { name: MODEL_API_KEY, valueFrom: { secretKeyRef: { name: sema-server-env, key: MODEL_API_KEY } } }
|
|
57
57
|
- { name: MODEL_VISION, value: {{ .Values.server.modelVision | quote }} }
|
|
58
|
+
{{/* S-600:租户姿态与主 worker 同值(文件头「同 env 面」的承诺;修前缺席 ⇒ 主 worker 多租时本只仍单用户)。 */}}
|
|
59
|
+
- { name: REQUIRE_PRINCIPAL, value: {{ .Values.server.requirePrincipal | default "false" | quote }} }
|
|
58
60
|
- { name: SANDBOX_PKG_SOURCE, value: {{ .Values.server.sandboxPkgSource | quote }} }
|
|
59
61
|
- { name: REMOTE_EXEC, value: k8s }
|
|
60
62
|
{{/* S-599:车道点名了就显式表态「这台有手」——REQUIRE_EXECUTION_LANE 让「车道被谁改没了」
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
#
|
|
8
8
|
# 输入(sema-up.sh 解析 machines.yaml 后注入):
|
|
9
9
|
# MACHINE_COUNT + MACHINE_<i>_{HOST,USER,SSH_KEY,NAME,ROLE,PRIVATE_IP,PUBLIC_IFACE}
|
|
10
|
-
# WORK(状态目录,.env 在此)REGION PROJECT
|
|
10
|
+
# WORK(状态目录,.env 在此)REGION PROJECT USERS(single|multi,缺省 single;S-600:翻成主 worker 的 REQUIRE_PRINCIPAL)
|
|
11
11
|
# SEMA_SERVER_IMAGE(registry 引用)或 SEMA_SERVER_IMAGE_TAR(本地 docker save tar[.gz])二选一
|
|
12
12
|
# MODEL_GATEWAY_BASEURL MODEL_ID MODEL_API_KEY
|
|
13
13
|
# ALLOW_SMALL_CLUSTER=true 放行 <3 机(dev/CI 单节点验流程;生产必须 >=3 奇数)
|
|
@@ -30,11 +30,19 @@ CNPG_VERSION="${CNPG_VERSION:-1.30.0}" # ⚠ in-tree barman 1.31 移除;升版
|
|
|
30
30
|
LONGHORN_VERSION="${LONGHORN_VERSION:-1.10.0}"
|
|
31
31
|
KATA_VERSION="${KATA_VERSION:-3.21.0}"
|
|
32
32
|
STACK_ENGINE="${STACK_ENGINE:-render}" # sema-stack 装配引擎:render(as-built 渲染 apply,缺省)| helm
|
|
33
|
+
USERS_GIVEN="${USERS:+1}" # S-600:显式给没给(缺省之前记下;决策见下方 users_decide)
|
|
34
|
+
USERS="${USERS:-single}" # 租户形(S-600):经 principal_of_users 翻成 REQUIRE_PRINCIPAL,两条装配路径同一次翻译
|
|
33
35
|
NODEPORT=30890
|
|
34
36
|
|
|
35
37
|
# 取值旗的形(S-621)——在对任何一台机器发起 ssh 之前。修前:REGION=eu 当成「非 cn 非 global」、STACK_ENGINE=x 当成 render。
|
|
36
38
|
flag_enum "--region(REGION)" "$REGION" $FLAG_WORDS_REGION
|
|
37
39
|
flag_enum "STACK_ENGINE" "$STACK_ENGINE" $FLAG_WORDS_STACK_ENGINE
|
|
40
|
+
flag_enum "--users(USERS)" "$USERS" $FLAG_WORDS_USERS
|
|
41
|
+
# S-600:租户形 = 显式 USERS ∨ 上一次落下的部署事实 ∨ single(lib/flagshape.sh 的 users_decide)——在任何 ssh 之前判,
|
|
42
|
+
# 不带旗的重跑不会把多租部署降成单用户。
|
|
43
|
+
ENVF="$WORK/.env"
|
|
44
|
+
users_decide "$USERS_GIVEN"
|
|
45
|
+
log "租户形 users=$USERS(REQUIRE_PRINCIPAL=$(principal_of_users "$USERS"))"
|
|
38
46
|
|
|
39
47
|
# <3 机=建议不强求(clay 2026-07-12:有建议的 3 节点配置,仍能处理;某台机器过小才拦——
|
|
40
48
|
# 那个由 0/8 每机预检的 8G/40G 硬底线负责)。ALLOW_SMALL_CLUSTER 保留兼容,不再必需。
|
|
@@ -318,6 +326,7 @@ done
|
|
|
318
326
|
# A(S-618 续):`.env` 不 source —— 只回读本脚本自己落盘的两只凭据;输入键(MODEL_API_KEY / 网关 / 镜像……)
|
|
319
327
|
# 以本次传入的环境为准,不再被 .env 旧值覆盖。
|
|
320
328
|
envf_load MINIO_PASSWORD SERVICE_AUTH_TOKEN
|
|
329
|
+
resetk REQUIRE_PRINCIPAL "$(principal_of_users "$USERS")" # S-600:部署事实(下次不带旗重跑据此沿用租户形)
|
|
321
330
|
[ -n "${MODEL_API_KEY:-}" ] || die "需要 MODEL_API_KEY(-f 配置或 --model-key)"
|
|
322
331
|
# PG 实例数/反亲和/副本数按机器数缩放(<3 机=dev:preferred,required 会永久 Pending)
|
|
323
332
|
PG_INSTANCES=$(( MACHINE_COUNT >= 3 ? 3 : MACHINE_COUNT ))
|
|
@@ -334,6 +343,7 @@ if [ "$STACK_ENGINE" = "helm" ]; then
|
|
|
334
343
|
V_SERVER_IMAGE="$SERVER_IMAGE" V_PULL_POLICY="$PULL_POLICY" \
|
|
335
344
|
V_PKG_SOURCE="$([ "$REGION" = "global" ] && echo global || echo '')" \
|
|
336
345
|
V_PG_INSTANCES="$PG_INSTANCES" V_PG_AA="$PG_AA" V_REPLICAS="$SERVER_REPLICAS" \
|
|
346
|
+
V_REQ_PRINCIPAL="$(principal_of_users "$USERS")" \
|
|
337
347
|
python3 - > "$VALSF" <<'PY'
|
|
338
348
|
import json, os
|
|
339
349
|
e = os.environ
|
|
@@ -346,6 +356,7 @@ print(json.dumps({
|
|
|
346
356
|
"replicas": int(e["V_REPLICAS"]), "serviceAuthToken": e["V_SVC_TOKEN"],
|
|
347
357
|
"modelGatewayBaseurl": e["V_MODEL_GATEWAY"], "modelId": e["V_MODEL_ID"],
|
|
348
358
|
"modelApiKey": e["V_MODEL_KEY"], "sandboxPkgSource": e["V_PKG_SOURCE"],
|
|
359
|
+
"requirePrincipal": e["V_REQ_PRINCIPAL"],
|
|
349
360
|
},
|
|
350
361
|
# chart 0.3.0 起 registry.enabled 默认 true(单机档语义)——machines 多机路径的 registry/git
|
|
351
362
|
# 面还没接线,必须显式关,不然 helm 撞 registry.image required(2026-07-12 自查)
|
|
@@ -371,13 +382,15 @@ RENDERED="$WORK/sema-stack-cluster.rendered.yaml"
|
|
|
371
382
|
R_SERVER_IMAGE="$SERVER_IMAGE" R_PULL_POLICY="$PULL_POLICY" \
|
|
372
383
|
R_PKG_SOURCE="$([ "$REGION" = "global" ] && echo global || echo '')" \
|
|
373
384
|
R_PG_INSTANCES="$PG_INSTANCES" R_PG_AA="$PG_AA" R_REPLICAS="$SERVER_REPLICAS" \
|
|
385
|
+
R_REQ_PRINCIPAL="$(principal_of_users "$USERS")" \
|
|
374
386
|
python3 - "$HERE/stack/sema-stack-cluster.yaml" > "$RENDERED" <<'PY'
|
|
375
387
|
import os, sys
|
|
376
388
|
MAP = {"__MINIO_PW__":"R_MINIO_PW", "__SVC_TOKEN__":"R_SVC_TOKEN", "__MODEL_KEY__":"R_MODEL_KEY",
|
|
377
389
|
"__MODEL_GATEWAY__":"R_MODEL_GATEWAY", "__MODEL_ID__":"R_MODEL_ID",
|
|
378
390
|
"__SERVER_IMAGE__":"R_SERVER_IMAGE", "__SERVER_PULL_POLICY__":"R_PULL_POLICY",
|
|
379
391
|
"__PKG_SOURCE__":"R_PKG_SOURCE", "__PG_INSTANCES__":"R_PG_INSTANCES",
|
|
380
|
-
"__PG_ANTI_AFFINITY__":"R_PG_AA", "__SERVER_REPLICAS__":"R_REPLICAS"
|
|
392
|
+
"__PG_ANTI_AFFINITY__":"R_PG_AA", "__SERVER_REPLICAS__":"R_REPLICAS",
|
|
393
|
+
"__REQUIRE_PRINCIPAL__":"R_REQ_PRINCIPAL"}
|
|
381
394
|
t = open(sys.argv[1], encoding="utf-8").read()
|
|
382
395
|
for ph, env in MAP.items():
|
|
383
396
|
v = os.environ.get(env)
|
|
@@ -29,6 +29,7 @@ PROJECT="${PROJECT:-sema}"
|
|
|
29
29
|
REGION="${REGION:-global}"
|
|
30
30
|
KUBE_MODE="${KUBE_MODE:?KUBE_MODE 未设置(existing|k3s)}"
|
|
31
31
|
DRY_RUN="${DRY_RUN:-false}"
|
|
32
|
+
USERS_GIVEN="${USERS:+1}" # S-600:显式给没给(缺省 single 之前记下;决策见下方 users_decide)
|
|
32
33
|
USERS="${USERS:-single}"
|
|
33
34
|
REGISTRY_ENABLED="${REGISTRY_ENABLED:-true}"
|
|
34
35
|
GIT_MODE="${GIT_MODE:-none}"
|
|
@@ -45,6 +46,10 @@ flag_enum "--users(USERS)" "$USERS" $FLAG_WORDS_USERS
|
|
|
45
46
|
flag_bool "--registry(REGISTRY_ENABLED)" "$REGISTRY_ENABLED"
|
|
46
47
|
flag_enum "--git(GIT_MODE)" "$GIT_MODE" $FLAG_WORDS_GIT
|
|
47
48
|
flag_enum "--region(REGION)" "$REGION" $FLAG_WORDS_REGION
|
|
49
|
+
# S-600:租户形 = 显式 USERS ∨ 上一次落下的部署事实 ∨ single(规则与拒句在 lib/flagshape.sh 的 users_decide)——
|
|
50
|
+
# 在动集群之前判,不带旗的重跑不会把多租部署降成单用户。
|
|
51
|
+
ENVF="$WORK/.env"
|
|
52
|
+
users_decide "$USERS_GIVEN"
|
|
48
53
|
|
|
49
54
|
# ── 0. kubeconfig / 工具解析 ─────────────────────────────────────────────────────
|
|
50
55
|
if [ "$KUBE_MODE" = "k3s" ]; then
|
|
@@ -124,13 +129,12 @@ if [ "$REGISTRY_ENABLED" = "true" ] && [ -z "${SEMA_REGISTRY_IMAGE:-}" ]; then
|
|
|
124
129
|
die "registry=true(默认)需要 SEMA_REGISTRY_IMAGE。下一步:--registry-image=<仓>/sema-registry:<tag>,或 --registry=false"
|
|
125
130
|
fi
|
|
126
131
|
|
|
127
|
-
ENVF="$WORK/.env"
|
|
128
132
|
if [ "$DRY_RUN" = "true" ]; then
|
|
129
133
|
{
|
|
130
134
|
echo "══════ kube-up dry-run(不写文件、不动集群)══════"
|
|
131
135
|
echo " 集群: $NODES 节点(mode=$KUBE_MODE,kubeconfig=$KUBECONFIG)"
|
|
132
136
|
echo " SC: ${STORAGE_CLASS:-默认($DEFAULT_SC)} kata: $KATA_OK(否=沙箱 runc 降级)"
|
|
133
|
-
echo " 形态: pg×$PG_INSTANCES($PG_AA) server×$SERVER_REPLICAS registry=$REGISTRY_ENABLED git=$GIT_MODE"
|
|
137
|
+
echo " 形态: pg×$PG_INSTANCES($PG_AA) server×$SERVER_REPLICAS registry=$REGISTRY_ENABLED git=$GIT_MODE users=$USERS"
|
|
134
138
|
echo " 将执行: CNPG operator $CNPG_VERSION → helm upgrade --install sema-stack -n $NAMESPACE"
|
|
135
139
|
echo " → runner-token 复制 → MinIO 建桶 → $([ "$GIT_MODE" = provision ] && printf 'Gitea 引导(管理员/token/OAuth)→ ')smoke → summary"
|
|
136
140
|
echo " 凭据: $ENVF $([ -f "$ENVF" ] && echo '(已存在:只补缺不轮换)' || echo '(将新建)')"
|
|
@@ -158,6 +162,7 @@ mkdir -p "$WORK"; chmod 700 "$WORK" 2>/dev/null || true
|
|
|
158
162
|
touch "$ENVF"; chmod 600 "$ENVF"
|
|
159
163
|
setk MINIO_PASSWORD "$(openssl rand -hex 24)"
|
|
160
164
|
setk SERVICE_AUTH_TOKEN "$(openssl rand -hex 24)"
|
|
165
|
+
resetk REQUIRE_PRINCIPAL "$(principal_of_users "$USERS")" # S-600:部署事实(下次不带旗重跑据此沿用租户形)
|
|
161
166
|
NEW_REG_PW=false NEW_GIT_PW=false
|
|
162
167
|
if [ "$REGISTRY_ENABLED" = "true" ]; then
|
|
163
168
|
setk_new REGISTRY_ADMIN_PASSWORD "$(openssl rand -hex 24)" && NEW_REG_PW=true
|
|
@@ -191,7 +196,7 @@ helm_values() { # helm_values <giteaBaseUrl> <oauthId> <oauthSecret>
|
|
|
191
196
|
V_MODEL_GATEWAY="$MODEL_GATEWAY_BASEURL" V_MODEL_ID="$MODEL_ID" \
|
|
192
197
|
V_SERVER_IMAGE="$SEMA_SERVER_IMAGE" V_REPLICAS="$SERVER_REPLICAS" \
|
|
193
198
|
V_PG_INSTANCES="$PG_INSTANCES" V_PG_AA="$PG_AA" V_SC="$STORAGE_CLASS" \
|
|
194
|
-
V_RT_CLASS="$RUNTIME_CLASS" V_REQ_PRINCIPAL="$(
|
|
199
|
+
V_RT_CLASS="$RUNTIME_CLASS" V_REQ_PRINCIPAL="$(principal_of_users "$USERS")" \
|
|
195
200
|
V_PKG_SOURCE="$([ "$REGION" = "global" ] && echo global || echo '')" \
|
|
196
201
|
V_REG_ENABLED="$REGISTRY_ENABLED" V_REG_IMAGE="${SEMA_REGISTRY_IMAGE:-}" \
|
|
197
202
|
V_REG_PW="${REGISTRY_ADMIN_PASSWORD:-}" V_REG_SS="${REGISTRY_SESSION_SECRET:-}" V_REG_PT="${REGISTRY_PULL_TOKEN:-}" \
|