@sema-agent/server 7.140.0 → 7.141.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 +290 -0
- package/README.md +1 -1
- package/README.zh-CN.md +1 -1
- package/USAGE.md +75 -13
- package/dist/approval-batch-census.d.ts +27 -0
- package/dist/approval-batch-census.js +27 -0
- package/dist/approval-card.d.ts +31 -16
- package/dist/approval-card.js +6 -3
- package/dist/approval.d.ts +15 -0
- package/dist/approval.js +10 -0
- package/dist/audit.d.ts +4 -2
- package/dist/audit.js +2 -2
- package/dist/boot/device-lane.d.ts +11 -0
- package/dist/boot/device-lane.js +16 -0
- package/dist/boot/engine-lease.d.ts +24 -3
- package/dist/boot/engine-lease.js +9 -2
- package/dist/boot/execution-env.js +8 -4
- package/dist/boot/memory-boundary.d.ts +2 -2
- package/dist/boot/memory-consolidation.d.ts +1 -1
- package/dist/boot/memory-consolidation.js +1 -1
- package/dist/boot/reapers.d.ts +2 -2
- package/dist/boot/resolve-spec.js +7 -4
- package/dist/boot/session-faces.d.ts +1 -1
- package/dist/boot/session-faces.js +4 -3
- package/dist/boot/shutdown.js +5 -0
- package/dist/boot/stage-05-execution-env.js +3 -1
- package/dist/boot/stage-06-runners.d.ts +0 -2
- package/dist/boot/stage-06-runners.js +1 -1
- package/dist/boot/stage-07-capability-layer.d.ts +0 -1
- package/dist/boot/stage-07-capability-layer.js +8 -10
- package/dist/boot/stage-08-reapers.d.ts +0 -1
- package/dist/boot/stage-09-leader.d.ts +0 -1
- package/dist/boot/stage-10-http-server.d.ts +0 -1
- package/dist/boot/stage-10-http-server.js +1 -0
- package/dist/boot/stores.js +10 -4
- package/dist/boot/web-admin.js +1 -0
- package/dist/capabilities/scenarios.d.ts +1 -1
- package/dist/capability-facts.d.ts +9 -0
- package/dist/capability-facts.js +9 -0
- package/dist/card-void.d.ts +38 -0
- package/dist/card-void.js +23 -0
- package/dist/config-catalog.js +11 -8
- package/dist/config-provider.d.ts +13 -13
- package/dist/config-provider.js +19 -33
- package/dist/config-types.d.ts +26 -8
- package/dist/config.js +55 -46
- package/dist/delegated-session-owner.d.ts +21 -19
- package/dist/delegated-session-owner.js +1 -1
- package/dist/device-store.d.ts +7 -0
- package/dist/device-store.js +3 -0
- package/dist/execution-config-root.d.ts +22 -0
- package/dist/execution-config-root.js +35 -0
- package/dist/execution-lane-caps.d.ts +49 -2
- package/dist/execution-lane-caps.js +90 -13
- package/dist/execution-placement.d.ts +3 -0
- package/dist/execution-placement.js +7 -0
- package/dist/fleet/drain-entry.d.ts +3 -0
- package/dist/hosted-posture.d.ts +8 -0
- package/dist/hosted-posture.js +4 -0
- package/dist/http/admission.js +3 -3
- package/dist/http/caller-trust.d.ts +3 -2
- package/dist/http/caller-trust.js +2 -1
- package/dist/http/dispatch.js +4 -0
- package/dist/http/live-frame.d.ts +24 -0
- package/dist/http/live-frame.js +16 -0
- package/dist/http/resume-legs.js +37 -20
- package/dist/http/route-table.js +2 -0
- package/dist/http/routes/approvals-assistant.js +1 -0
- package/dist/http/routes/capabilities.js +5 -4
- package/dist/http/routes/diagnostics.d.ts +0 -19
- package/dist/http/routes/diagnostics.js +16 -2
- package/dist/http/routes/memory-bundle.d.ts +2 -2
- package/dist/http/routes/memory-bundle.js +1 -1
- package/dist/http/routes/memory-compliance.js +1 -1
- package/dist/http/routes/memory-policy.js +2 -2
- package/dist/http/routes/run-permission-mode.d.ts +75 -0
- package/dist/http/routes/run-permission-mode.js +170 -0
- package/dist/http/routes/session-sync.d.ts +3 -6
- package/dist/http/routes/session-sync.js +7 -2
- package/dist/http/routes/sessions.js +5 -4
- package/dist/http/routes/tasks.js +63 -66
- package/dist/http/run-read-face.js +3 -3
- package/dist/http/send.d.ts +1 -1
- package/dist/http/send.js +2 -2
- package/dist/http/server.d.ts +9 -2
- package/dist/http/sse-log.d.ts +3 -8
- package/dist/http/stored-body-replay.d.ts +3 -3
- package/dist/http/stored-body-replay.js +3 -1
- package/dist/instruction-source-notice.d.ts +7 -0
- package/dist/instruction-source-notice.js +6 -6
- package/dist/mcp-assertion-header.d.ts +4 -0
- package/dist/mcp-assertion-header.js +5 -0
- package/dist/memory-posture.d.ts +1 -1
- package/dist/memory-scope.d.ts +4 -4
- package/dist/memory-scope.js +1 -1
- package/dist/memory-sync-client.d.ts +14 -2
- package/dist/memory-sync-client.js +80 -18
- package/dist/observability/fail-open.d.ts +30 -2
- package/dist/observability/fail-open.js +30 -2
- package/dist/observability/metrics.js +0 -1
- package/dist/observability/run-terminal.d.ts +6 -2
- package/dist/observability/run-terminal.js +25 -26
- package/dist/observability/secret-env-scrub.d.ts +20 -1
- package/dist/observability/secret-env-scrub.js +14 -0
- package/dist/orchestration/workflow-completion-inbox.d.ts +5 -2
- package/dist/orchestration/workflow-completion-inbox.js +13 -5
- package/dist/orchestration/workflow-notify-journal.d.ts +5 -3
- package/dist/orchestration/workflow-notify-journal.js +2 -1
- package/dist/permission-mode-admission.d.ts +68 -0
- package/dist/permission-mode-admission.js +23 -0
- package/dist/permission-rule-list.d.ts +55 -6
- package/dist/permission-rule-list.js +52 -5
- package/dist/plugins/caching-session-store.d.ts +6 -0
- package/dist/plugins/caching-session-store.js +3 -0
- package/dist/plugins/checkpoint-store-sql.d.ts +65 -17
- package/dist/plugins/checkpoint-store-sql.js +74 -3
- package/dist/plugins/device-store-sql.d.ts +5 -2
- package/dist/plugins/device-store-sql.js +4 -1
- package/dist/plugins/execution-placement-sql.d.ts +11 -1
- package/dist/plugins/execution-placement-sql.js +12 -1
- package/dist/plugins/file-run-store.d.ts +2 -2
- package/dist/plugins/file-run-store.js +1 -1
- package/dist/plugins/fork-routing-session-store.d.ts +10 -32
- package/dist/plugins/fork-routing-session-store.js +2 -61
- package/dist/plugins/k8s-exec-protocol.d.ts +4 -1
- package/dist/plugins/k8s-exec-protocol.js +6 -1
- package/dist/plugins/local-checkpoint-store.d.ts +10 -1
- package/dist/plugins/local-checkpoint-store.js +22 -0
- package/dist/plugins/local-session-store.d.ts +227 -35
- package/dist/plugins/local-session-store.js +518 -37
- package/dist/plugins/local-session-window.d.ts +17 -3
- package/dist/plugins/local-session-window.js +7 -13
- package/dist/plugins/memory-run-store.d.ts +2 -2
- package/dist/plugins/memory-run-store.js +1 -1
- package/dist/plugins/one-time-migrations.d.ts +42 -2
- package/dist/plugins/one-time-migrations.js +65 -3
- package/dist/plugins/pg-pool.js +3 -2
- package/dist/plugins/pg-session-storage.d.ts +2 -0
- package/dist/plugins/pg-session-storage.js +3 -2
- package/dist/plugins/remote-env-e2b.d.ts +24 -3
- package/dist/plugins/remote-env-e2b.js +131 -18
- package/dist/plugins/remote-env-k8s.d.ts +20 -1
- package/dist/plugins/remote-env-k8s.js +148 -25
- package/dist/plugins/remote-env-local-docker.d.ts +25 -11
- package/dist/plugins/remote-env-local-docker.js +87 -21
- package/dist/plugins/run-store-sql.d.ts +3 -3
- package/dist/plugins/run-store-sql.js +4 -3
- package/dist/plugins/sandbox-read-floor.d.ts +273 -0
- package/dist/plugins/sandbox-read-floor.js +608 -0
- package/dist/plugins/session-ownership.d.ts +2 -1
- package/dist/plugins/session-placement.d.ts +17 -4
- package/dist/plugins/session-placement.js +2 -1
- package/dist/plugins/session-store.d.ts +18 -20
- package/dist/plugins/session-store.js +4 -12
- package/dist/plugins/store-backend.d.ts +31 -0
- package/dist/plugins/store-backend.js +21 -4
- package/dist/plugins/store-contracts.d.ts +9 -2
- package/dist/plugins/tidb-pool.js +2 -1
- package/dist/plugins/tidb-session-store.d.ts +4 -1
- package/dist/plugins/tidb-session-store.js +3 -2
- package/dist/run-cancel-context.d.ts +34 -0
- package/dist/run-cancel-context.js +7 -0
- package/dist/runs.d.ts +39 -12
- package/dist/runs.js +68 -53
- package/dist/security.d.ts +2 -2
- package/dist/server-secret-env.d.ts +2 -1
- package/dist/server-secret-env.js +2 -4
- package/dist/session-error-wire.d.ts +22 -4
- package/dist/session-error-wire.js +16 -0
- package/dist/session-incarnation.d.ts +9 -3
- package/dist/session-sync-kernel.d.ts +42 -1
- package/dist/session-sync-kernel.js +17 -0
- package/dist/session-sync.js +16 -4
- package/dist/sql-engine-coordinates.d.ts +49 -0
- package/dist/sql-engine-coordinates.js +27 -0
- package/dist/standing-answer-grant.d.ts +31 -2
- package/dist/standing-answer-grant.js +14 -2
- package/dist/store-posture.d.ts +1 -1
- package/dist/task-a2a.d.ts +1 -1
- package/dist/task-mcp.d.ts +1 -1
- package/dist/task-settings.d.ts +52 -25
- package/dist/task-settings.js +91 -28
- package/dist/terminal.d.ts +77 -20
- package/dist/terminal.js +66 -20
- package/dist/trace/core-keyset-guard.d.ts +79 -2
- package/dist/trace/exit-seat.d.ts +7 -0
- package/dist/trace/exit-seat.js +1 -0
- package/dist/trace/model-segment.d.ts +2 -2
- package/dist/trace/redact.js +323 -90
- package/dist/trace/self-minted-wire.d.ts +168 -2
- package/dist/trace/self-minted-wire.js +63 -0
- package/dist/verifier-pause-card.d.ts +8 -0
- package/dist/verifier-pause-card.js +19 -0
- package/dist/web-admin-client/apply-effective.d.ts +5 -7
- package/dist/web-admin-client/apply-effective.js +2 -2
- package/dist/web-admin-client/candidate-gate.d.ts +1 -1
- package/dist/web-admin-client/read-warnings.d.ts +2 -2
- package/docs/DEVICE-EXECUTOR-PROTOCOL.md +3 -2
- package/package.json +2 -2
- package/wire-changes/server@7.141.0.json +367 -0
package/MIGRATION.md
CHANGED
|
@@ -7,6 +7,296 @@
|
|
|
7
7
|
> ⚠️ 完整清单在仓库根 `CHANGELOG.md`——它**不随 npm tarball 出包**(本文件随包)。看完整迁移窗的
|
|
8
8
|
> 权威姿势是源码 tag diff:`git diff v<旧>..v<新>`(每版都推 `v<版本>` tag);npm 包页也镜像 CHANGELOG。
|
|
9
9
|
|
|
10
|
+
## 7.141.0 —— 起服自有凭据值被引擎拒收改发结构化 warn `own_credential_value_not_withheld`(运维面;日志形变更) · 两条用户面文案订正(起服行 `tool_policy_single_user_default` 的 `posture`、`SENSITIVE_WRITE_PATTERNS` 说明;文字,零行为变更) · `/decide` 续跑腿批准后被取消:终局文案改「已取消、不可再续」(行为面;文字;码不变) · 会话同步导入的 `anchors[]` 必须指向这次导入声明的条目(新提交 400;出口过滤存量悬空锚) · 流式口每帧带 `event:` 行(BREAKING)· 回退锚写入腿内落定(有界) · device 车道 `DEVICE_RELAY_URL` 必声明(URL 或 `none`;缺席拒起) · 显式 `DB_BACKEND=mysql|pg` 而该引擎的坐标缺席 ⇒ 起服拒,与 `SESSION_BACKEND` 怎么写无关(行为收紧,fail-closed;运维面) · 起服多一次只读普查:存量停驻行里带「无 `kind` 的 batch 成员」的行数(运维面;零动作;不改任何一行) · 🔴 local 后端数据根一次性迁移:会话的建档时刻与 fork 谱系搬进会话元数据边档、带属主戳的会话存档改写成匿名(本服务起服时自己改;升级前备份数据根、先停光旧进程;回滚只有恢复备份)· 仍带戳的存档 fork / 改日志推送答 409 `conflict`(行为收紧)· 先清后导之后建档时刻不变(行为修复) · 本机形(`DB_BACKEND=local`)后台子代的转录活过重启、随记录同亡;接线清单 `fleet.subagentTranscripts` 在 local 上改答 `full`、`rows` 档不再由本服务产出(行为变更;wire 值变化) · 记忆同步停驻:游标用不了的层只点名删游标一条出路,`GET /v1/sessions/:id/memory-status` 加性键 `memorySync`、停驻层的运维行改名 `memory_sync_layer_parked`(wire 加性;运维面日志形变更;订正 7.139.0 / 7.140.0 两节的处置句) · 在飞 run 的权限模式切档口 `POST /v1/runs/:id/permission-mode`(wire 加性;能力位 `permissionModeWrite` 按部署翻真) · `settings.permissions.deny` / `ask` 的条目可带出处层 `{ rule, layer }`:user 层的 `/` 形路径规则读在执行环境的配置根(wire 条目型放宽 + 能力位 `settings.permissions.layers`;端见位才发) · `GET /v1/runs/:id` 的 `heldBy` 终态行恒 `null`(一个条件:`null` = claim 已释放;wire 值域变化) · 运维队列行 / `/stream` `pending` 帧恰带授予绑定一臂,升级前停驻的卡投 `boundGrantAbsence: "unreadable"`(wire 值域变化) · 沙箱三车道读拒表字节地板的接线与新旋钮 `SANDBOX_READ_FLOOR`(keep | off,缺省 keep;本版地板模块不服务任何车道 ⇒ 三车道照旧不守,零行为变化;起服行多一个字段) · `REMOTE_EXEC` 是有序车道表,表里不止一条 ⇒ 起服拒(部署 env 形变 BREAKING;单词零变化) · `MEMORY_ENGINE_BACKEND=tidb` 改名 `mysql`(旧词拒启;`memoryEngine.backend` 值变化,BREAKING) · `config.d/remote-exec.json` 非空串字段只含空白 ⇒ 起服拒(行为收紧) · 契约包 settings-schema 16.0.0 的其余读点(设备入口拒句取契约 · 本地配置一次读、过深文档成被拒文档 `too_deep`) · SQL 后端(`DB_BACKEND=mysql|pg`)的主 runner 接线清单 `session.store` 由 `process_local` 改答 `declared_durable`(会话店补上顶层耐久声明;wire 值变化;只改读数) · `workflow_complete` 补投帧多可选键 `diagnostics`(引擎的诊断教学文本;过脱敏、有界;wire 加性;零 DDL;崩溃恢复补投不带) · `GET /v1/capabilities` 加能力位 `mcpTransportKinds`(请求面读器与引擎今天能拨的 MCP 传输种类;wire 加性;提交面不放宽)· `GET /health` 加性键 `engineLease: { lingerMs, tickMs }`(引擎附着租约窗上 wire;运维面)· 名单型 env 旋钮点到自有凭据名的起服拒句一句只用一套序号(文字;运维面)· 订正 7.139.0 节第 23 条 ⑤:服务进程被 `SIGKILL` 时暂存目录留在目标旁(文字订正) · 折码的运维 warn 行 `outward_failure_code_folded` 不再带失败句原文、读面同一原码只一行(运维面;日志形变更;安全) · 验证器自己停驻:恢复凭据不再外出、那张卡结算时作废、读面上不合本服务码形的存量失败码读作 `internal.store_error`(行为面;安全 / 修复) · 订正 7.140.0 节第 7 / 10 / 12 / 13 条的四处说法、第 8 条补一句(文字订正) · 契约包 settings-schema 16.0.0 · 引擎 7.60.0
|
|
11
|
+
|
|
12
|
+
1. **起服自有凭据值被引擎拒收改发结构化 warn(运维面;日志形变更;部署零动作)**:本进程自有凭据变量(配置目录 secret 名与模型条目 `apiKeyEnv`)的值被引擎判「不是凭据值」(空白 / 占位词 / 一个字符重复 / 不足 8 字符)时,
|
|
13
|
+
那一个值不按值扣、名照扣、不拒启(能力位 `inherit_env.own_credential_values_withheld` 答 false)—— 这件事此前是一行裸 stderr 文本,现在是日志器的一行 `warn`,事件名 `own_credential_value_not_withheld`,字段 `{ name, reason }`
|
|
14
|
+
(`reason` 是引擎拒句原文,不回显值;起服第一步日志器还没建时当拍以同一行形写 stderr,不缓冲;每个变量只一次)。
|
|
15
|
+
**谁受伤**:按旧裸文本(`own credential <名>: its value is not withheld by value …`)grep 的告警规则会失明。**出路**:改按事件名与 `name` 字段筛;给该变量一个真值(至少 8 字符、不是占位词)即可消掉这一行。扣留行为与能力位一字未动。
|
|
16
|
+
2. **两条用户面文案订正(文字;零行为变更)**:① 单用户 turnkey 起服行 `tool_policy_single_user_default`(info)的 `posture` 不再写「ALL write/hand/MCP tool surfaces auto-allowed」,改说「部署工具策略层是 allow-all 基线、不是逐调用放行 —— 每次调用仍由本次运行的权限模式与引擎写门裁」;
|
|
17
|
+
事件名 / 级别 / 字段名不变。② `SENSITIVE_WRITE_PATTERNS` 的说明(`GET /v1/config/catalog` 该行、README 两语、USAGE 9.4c)写出射程:守卫集拒文件工具(Write / Edit / NotebookEdit),shell 命令写同一路径不被它拒绝、走普通审批问。
|
|
18
|
+
**谁受伤**:按 `posture` 旧字面子串匹配的规则会失配(该字段是给人读的说明,不是机读位)。**出路**:无需动作。
|
|
19
|
+
3. **`/decide` 续跑腿(含计划审阅批准)在批过的动作开跑之前被取消:终局 `message` 改成「已取消、不可再续」(行为面;文字;码不变)**:此前 run 行与账本 `done` 行上是引擎的通用句「the checkpoint was REOPENED (pending): the same approval can be resumed again」,而本服务按取消语义已把这张卡 expire
|
|
20
|
+
(待办队列没有它、再决断 `404 not_found.plan_review`)。现在本服务亲手 expire 了一张 pending 的卡时,失败终局的 `message` 是 `Cancelled — the approved action never started, and the cancel settled this approval: it cannot be resumed (start a new run to continue)`;
|
|
21
|
+
`errorCode`(仍是 `resume.reopened_unstarted`)、`retriable`、待办队列、决断路由全部不变。`/wake` 的会话 park(取消后仍留着)与非取消的重开形里引擎原句原样。
|
|
22
|
+
**谁受伤**:按旧英文句子子串(`REOPENED`)判「可再续」的客户端 —— 请改读 `GET /v1/approvals` / 决断路由 / `retriable`。**已知限制**:码与文案分属两个来源(码名里的「重开」说的是引擎当时的动作);取消与引擎真失败赛跑且卡被 expire 的形,失败细节不再出现在 `message`(失败码保留)。取消落在引擎 claim 之前(`checkpoint.resume_aborted`)且卡被本服务 expire 时,行与账本终局行同样换成这一句(码仍是 `cancelled`)。
|
|
23
|
+
4. **会话同步导入(`POST /v1/sessions/:id/sync/import` 第一阶段)体里的 `anchors[]` 必须指向这次导入声明的条目 ⇒ 不在声明集里的锚整次导入 400;`GET …/sync/manifest` 先读锚再读条目 id,并不再交出存量里的悬空锚(行为收紧;wire 码不新)**:
|
|
24
|
+
每条锚必须是带串型 `eventId` 与串型 `entryId` 的对象,且 `entryId` 是体里 `entryIds` 的一员;第一条违例 ⇒ `400 request.field_invalid`,句子点名第几条锚与它的 `entryId`
|
|
25
|
+
(`anchors: [1].entryId "…" is not among the entryIds this import declares`;元素不是对象或缺串型字段时 `anchors: [1] must be an object with a string eventId and a string entryId`),
|
|
26
|
+
不回显其它锚、不回显声明集。判在分类(409 `conflict`)、执行格与活动的判(409)、补 mirror、开暂存之前:拒时不写锚 / 日志 / 会话行,不开暂存、不拿租约,执行格不动。
|
|
27
|
+
为什么「声明集」就是全部:导入落定的日志是体里声明的那份 —— 提交整段换装,`fresh` / `fast_forward` / `identical` 不留声明集没有的条目,`overwrite-dst` 的 `fork` / `stale` 把目的端独有的条目整段抹掉
|
|
28
|
+
(并先擦掉指向它们的旧锚),所以指向目的端独有条目的锚不是「已落日志的合法锚」,而是这次导入刚抹掉的条目的悬空锚;请求读完 id 之后别的写者才长出来的条目同样不在声明里,指向它的锚同样拒(保守方向)。
|
|
29
|
+
`owner` 仍不读(锚一律重钉到导入主体)。`anchors` 不是数组仍是 `400 request.body_shape`。
|
|
30
|
+
出口读序同改:manifest 先读锚、再读条目 id(锚是先有条目后落的、日志只增不减,先读锚得到的每条锚,后读的 id 列表里一定有它指向的条目);此前先读 id 后读锚,源端会话是活的时,
|
|
31
|
+
两次读之间一轮收尾就会让 manifest 交出指向比自己 id 列表更新的条目的锚。manifest 的形与键不变。
|
|
32
|
+
存量里的悬空锚(更早的版本在导入口收下过、指向 manifest 自己 `entryIds` 之外的锚)同样不出 manifest —— 导出按入口门的同一只谓词滤掉,逐条计数(指标 `fail_open_total` 的 tag `server.session-sync.dangling-anchor-export`)并在探针文件(`SEMA_FAILOPEN_PROBE`)留一行;店里的行不删、没有新动词
|
|
33
|
+
(累计计数 = 本进程导出时碰到存量悬空锚的次数;同一条行每次导出再数一次,现存多少读锚表)。此前它们随 manifest 出门,原样拼回推送体就被入口门拒,那只会话从此推不出去;现在往返自愈。
|
|
34
|
+
上一版:第一阶段只判 `anchors` 是数组,指向声明集外的锚照收并落库(续跑锚解到一个不存在的条目),`null` 元素在重放腿抛 TypeError 答 `500`,缺串型字段的元素把 `undefined` 递给锚店。本地文件店与 SQL 店同形(判在任何店调用之前)。
|
|
35
|
+
— **谁需要**:靠会话同步把续跑锚推上云端的壳 / 客户端 —— 经这个入口,云端的续跑锚不再被写成指向已抹条目或不存在条目的悬空锚。
|
|
36
|
+
— **谁受伤**:推送体里带一条指向声明集外的锚的调用方(自己拼体、`anchors` 与 `entryIds` 不是同一时刻读的;或源端锚表里有一条指向本次推送日志里没有的条目)—— 整单 400,不再受理。上一版已落库的悬空锚本版不删行(它们仍在锚表里、仍解不到条目),但不再随 manifest 出门;自己从别处拿到带着它们的体去推的调用方会被点名拒;
|
|
37
|
+
`overwrite-dst` 提交与随后的擦除步之间进程死掉的残余窗口也照旧(重试落 `identical` 臂,不再擦)。
|
|
38
|
+
— **补偿**:按句子里的下标核对那条锚 —— 它指向的条目不在你声明的 `entryIds` 里:要么那条锚本来就解不到条目(从 `anchors` 去掉,或在源端删掉),要么你的 `entryIds` 读旧了(重读 manifest 再推,**不要**删锚);
|
|
39
|
+
`overwrite-dst` 要保留的锚改指源端声明的条目。**回滚**:回到上一版即回到「悬空锚照收」(零数据面)。
|
|
40
|
+
5. **`POST /v1/tasks/stream` 的每一帧都带 `event: <type>` 行(BREAKING,wire;`data` 逐字不变)**:这条流上的引擎帧、终帧 `done`(正常 · 同键重放 · 在飞合流的跟随方 · 开流之后的拒)与开流时补投的完成帧
|
|
41
|
+
此前只有 `data:` 行,本版与 `meta` / 心跳 / 审批 · 提问 · 表单帧一样写成 `[id: <eventId>\n]event: <type>\ndata: <json>\n\n`(事件名 = 载荷 `type`;心跳 `event: heartbeat` + `data: {}`),
|
|
42
|
+
与 `GET /v1/runs/:id/events` 同一只帧形。
|
|
43
|
+
**谁受伤**:只读默认 `message` 通道的读者 —— 浏览器 `EventSource.onmessage` 经字节透传的中继、把无名帧落到 `message` 再按 `event:` 名分派的自写解析器:升级后收不到任何内容帧与 `done`。
|
|
44
|
+
按载荷 `type` 分派的读者(`@sema-agent/sdk` 的 `tasks.stream`,以及经它读本流的壳)与只解析 `data:` 行的读者零改。
|
|
45
|
+
**出路**:按事件名监听(`addEventListener("<type>", …)`),或按 `data:` 行解析、按载荷 `type` 分派。**回滚**:回到上一版即回到旧帧形(无存储格式变化)。
|
|
46
|
+
6. **回退锚写入:流式腿在 `done` 之前落定;计量 `resume_anchor_capture_failed` 退役(运维面)**:`POST /v1/tasks/stream` 的回退锚(`resumeAt` 用的 taskId 手柄)在 `done` 帧写出之前写完
|
|
47
|
+
(此前不等,读到 `done` 马上回退可能撞 `404 resume_at.unknown_event`),`done` 因此晚到一次锚店写的时长,至多 2 s(锚店挂住 ⇒ 到点放手、`done` 照发、那次提示词没有回退手柄)。三条腿(流式 / `POST /v1/runs` / 续跑)锚写失败或到期改记登记过的 fail-open:
|
|
48
|
+
计数 `fail_open_total{tag="server.resume-anchor.capture-failed",cls="F"}`、探针行 `leg=<stream|bg|resume> kind=<prompt|turn> reason=<error|timeout> …`、每进程一次 warn;run 照常收尾。
|
|
49
|
+
**谁受伤**:看板 / 告警读 `resume_anchor_capture_failed` 的部署 —— 这只计量不再出现。**出路**:改读 `fail_open_total{tag="server.resume-anchor.capture-failed"}`。
|
|
50
|
+
7. **device 车道:设备入口 `DEVICE_RELAY_URL` 必须声明 —— ws(s) URL 或字面 `none`,缺席 / 空串 / 只含空白起服拒(部署面,行为收紧,fail-closed;嵌入方类型面 BREAKING)**:
|
|
51
|
+
设备拨哪里只有运维知道,服务不再替运维把「没写」读成「直拨引擎地址」—— 那一读让撤掉中继声明与本来就直拨折成同一个值,撤声明而根会话上还有设备绑定时,
|
|
52
|
+
设备改拨引擎地址(入口已收窄则拨不到)、绑定却留在会话上,起服零信号。`REMOTE_EXEC=device` 而 `DEVICE_RELAY_URL` 缺席、空串或只含空白 ⇒ 起服拒,拒在车道必需 env 门(与其余车道的必需键同一句,点名键名);写了却不合文法 ⇒ 起服拒,拒句点名两种合法值。
|
|
53
|
+
两种合法值:ws(s) URL(逐字上 `GET /v1/capabilities` 的 `deviceExecutor.relayUrl`,形门不变)或字面 `none`(没有中继,设备按引擎地址 + `deviceExecutor.wsPath` 拨号,能力面不带 `relayUrl`)。
|
|
54
|
+
只认 `none` 这一拼法(`None` / `off` / `direct` 照旧被 URL 形门拒)。其它车道不读这根 env。
|
|
55
|
+
`none` 而根会话上还有设备绑定 ⇒ 起服 warn `device_relay_withdrawn_with_bindings`,`bindings` = 绑定条数(不带会话 id);没有绑定 ⇒ 不响。
|
|
56
|
+
**谁需要**:设备经托管入口(中继 / 网关)拨号的部署 —— 撤中继声明从此必须明说「设备改拨引擎地址」,不再静默困住已绑设备。
|
|
57
|
+
**谁受伤**:所有没写 `DEVICE_RELAY_URL` 的 device 车道部署(含设备一直直拨引擎地址的部署);`REMOTE_EXEC=device` 而 local 形 `config.d/remote-exec.json` 把车道换成别的车道的部署同样要写。
|
|
58
|
+
嵌入方:`ServiceConfig` 的 device 车道臂 `relayUrl?: string` 改为必填 `relay: { kind: "url"; url: string } | { kind: "none" }`;设备店接口多一个必填方法 `countDeviceBindings()`
|
|
59
|
+
(类型面,编译红即消费点清单,没有别名)。
|
|
60
|
+
**升级前做(出路)**:设备直拨引擎地址的部署在服务进程环境里加一行 `DEVICE_RELAY_URL=none`,即与升级前逐字同(能力面与拨号行为都不变);用中继的部署原样保留 URL,零动作。
|
|
61
|
+
用仓里两份根 compose 起服的部署:这两份已把 `DEVICE_RELAY_URL` 透传进服务容器,在 `.env` / 宿主环境里写这一行即可。
|
|
62
|
+
配置目录(`GET /v1/config/catalog`)的这一行带 `enumValues: ["none"]`,生效值 `none` 原样显示。
|
|
63
|
+
设备绑定数逐行过放置格的解码:有一行放置列不成形(设备在而属主列缺等)⇒ `none` 下起服拒、点名那一行(该行在别处读到时同样拒);URL 下不读。
|
|
64
|
+
**以后撤中继声明的顺序**:先恢复引擎自己的入口(设备拨得到引擎地址 + `wsPath`),再把值改成 `none`;起服那行 warn 会点名还有几条绑定押在这个入口上。**回滚**:回到上一版即恢复「缺席 = 直拨」,无数据面改动。
|
|
65
|
+
8. **显式 `DB_BACKEND=mysql|pg` 而该引擎的坐标缺席 ⇒ 起服拒,与 `SESSION_BACKEND` 怎么写无关(行为收紧,fail-closed;运维面)**:
|
|
66
|
+
修前同一个声明在不同的 `SESSION_BACKEND` 写法下走不同的路:`DB_BACKEND=pg` + `SESSION_BACKEND` 未设 / `mysql` + 没有 `PG_HOST` ⇒ 起服抛 `missing required env: PG_HOST`;
|
|
67
|
+
`DB_BACKEND=pg` + `SESSION_BACKEND=auto`(「坐标不在就不探测」)或 `SESSION_BACKEND=memory` + 零 `PG_*` ⇒ **起服成功、跑在内存里**,`/health` 照样 200,
|
|
68
|
+
能力位 `store` 报 `{ declared: "pg", backend: "memory", durable: false }` —— 一个自以为在持久化的部署其实重启即丢(`REQUIRE_PRINCIPAL=true` 同形)。
|
|
69
|
+
本版起显式 `DB_BACKEND=mysql|pg` 而该引擎的主机坐标(`MYSQL_HOST` / `PG_HOST`)缺席 ⇒ **配置期拒启**,上述各写法(以及 `REQUIRE_PRINCIPAL=true`)同一句拒句:
|
|
70
|
+
`DB_BACKEND=pg declares the PostgreSQL engine, but its connection coordinates are not set (missing: PG_HOST, PG_USER, PG_DATABASE) — … Refusing to boot rather than starting non-durable under that declaration (whatever SESSION_BACKEND says). To persist: set PG_HOST, PG_USER, PG_DATABASE …; to run without SQL: DB_BACKEND=local … or DB_BACKEND=memory.`
|
|
71
|
+
拒句点名缺的坐标键名(`MYSQL_HOST` / `MYSQL_USER` / `MYSQL_DATABASE` 同形),不回显任何值。
|
|
72
|
+
**谁受伤**:靠 `SESSION_BACKEND=auto` 静默内存起服过活的开发 / 预发环境(写了 `DB_BACKEND=pg|mysql`、没配坐标、一直跑内存而不自知),以及 `DB_BACKEND=pg|mysql` + `SESSION_BACKEND=memory` + 零坐标的部署 —— 升级后起服失败。
|
|
73
|
+
**升级前做(出路)**:要持久 ⇒ 补齐坐标(`PG_HOST` / `PG_USER` / `PG_DATABASE` · `MYSQL_*` 同形);要无 SQL 的部署 ⇒ 把 `DB_BACKEND` 改成 `local`(单用户文件店)或 `memory`(纯内存)一行。
|
|
74
|
+
坐标齐的部署、`DB_BACKEND=local|memory`、不写 `DB_BACKEND` 的部署(含 `SESSION_BACKEND=auto` 而零坐标的内存形)零变化;主机在场而 `*_USER` / `*_DATABASE` 缺的半配置仍是原来的 `missing required env`。
|
|
75
|
+
同族:`MEMORY_ENGINE_BACKEND=pg|tidb` 要绑的池没开而 `DB_BACKEND` 已点名该引擎时,拒句不再说「要 `DB_BACKEND=…`」(那指错了修法),改点名真正开店的条件(持久会话后端:`SESSION_BACKEND` 未设、`mysql` 或 `auto`,不是 `memory`;与必需的坐标键)。
|
|
76
|
+
**回滚**:回到上一版即恢复旧行为(静默内存),无数据面改动。
|
|
77
|
+
9. **起服多一次只读普查:SQL 后端的 `checkpoint` 表里还有几行存量停驻行,其规则提议带着「无 `kind` 的 batch 成员」(运维面;零动作;不改任何一行)**:
|
|
78
|
+
引擎的规则提议读者为一个旧形留着一条存量读臂 —— batch 成员没有 `kind`、只有四个命令文本键时读成 `command`;这条臂只有在「零行还靠它」时才能删。本版起每次起服(MySQL 协议与 PostgreSQL 同一份实现)
|
|
79
|
+
在后台(不挡起服就绪)只读扫一遍 `checkpoint` 表(所有状态的行;`rule_suggestions` 列与 blob 里的 `pendingAction.ruleOffers` 两个载体,各按它自己的读者读:列按本店回读口的窗,blob 按引擎整只数组),出一行 info `approval_batch_kindless_rows { count }`(零也出,是「已扫完且为零」的正面证据),
|
|
80
|
+
每个带旧形成员的行另在 `fail_open_total{tag="server.approval-batch.kindless-row"}` 记一次(探针行 `row=<行指纹> carriers=…`,行指纹不是令牌)。
|
|
81
|
+
**不翻行、不删臂、不改任何一行的读法**。读不出形的 cell(坏 JSON / 不是列该有的形)不计入行数,另出一行 warn `approval_batch_kindless_census_unreadable_cells { cells }`;扫失败(库抖 / 权限)只出一行 warn `approval_batch_kindless_census_failed`、不出 info、不拒启(半途读数不会冒充零)。
|
|
82
|
+
**谁受伤**:无 —— 零 wire、零 DDL、零写;代价是起服后台多一次按键集分页的只读扫描(列载体取 `IS NOT NULL` 的行、blob 载体 `LIKE` 预筛,没有提议的行不出库)。**升级前做**:无。**回滚**:无需。
|
|
83
|
+
范围(如实):只扫 SQL 后端的 `checkpoint` 表;`local` 文件账本、存卡 `approval_ask.card_json`、账本帧不扫;读数逐页读到、不是原子快照(页间别的副本的写入可以让一行被漏数或多数一行;滚动升级窗里仍停在旧版本的副本之后写下的旧形行,下次起服才数得到)。
|
|
84
|
+
|
|
85
|
+
10. **🔴 local 后端(`DB_BACKEND=local`,含缺省推导的 local)数据根一次性迁移:会话的建档时刻与 fork 谱系搬进会话元数据边档,带属主戳的会话存档改写成匿名(本服务起服时自己改;升级前备份数据根、先停光旧进程再起本版;回滚只有恢复备份)**:
|
|
86
|
+
local 店的行事实(属主 / 化身 / 执行放置 / 建档时刻 / fork 谱系)只住在数据根的 `session-incarnations.json`(每只会话一格);`sessions/*.jsonl` 里的会话存档只是匿名的对话内容 ——
|
|
87
|
+
本服务交给引擎的写不再带属主,交出的会话元数据(交给引擎的会话、`GET /v1/sessions/:id` 的 `createdAt`、列表行的 `firstActivityAt`)都取自那一格。
|
|
88
|
+
起服的一次性迁移(M33;窗 = 发布日 + 30 天,窗内每次起服都跑,第二次起零命中):① 每只会话存档的建档时刻与 fork 谱系补进它那一格(盘上有存档而没有格的,建一格);
|
|
89
|
+
② 存档首行仍带属主戳的(更早的版本导入 / 换装写下的,及其 fork 后代)改写成匿名 —— 条目逐条不变(含发言者归属);每只改写前先在数据根的 `session-archive-m33/` 下写一份快照、改写后删,
|
|
90
|
+
进程在半途被杀 ⇒ 下一次起服先从快照补完再做别的。改不了的存档原样留着、一行一条 warn 点名(`local_archive_kept_stamped`,`reason` = `invalid` 导入检查不收它的日志 /
|
|
91
|
+
`normalizes` 重导会改它的内容 / `records_skipped` 读它时跳过了读不出的记录);首行读不出的点名 `local_archive_unreadable`。读数在起服行 `one_time_migrations_applied` 的五个 `localArchive*` 字段
|
|
92
|
+
(嵌入方 `OneTimeMigrationReport` 多五键,BREAKING 类型面)。
|
|
93
|
+
**快照目录的常设拒启**:起服时 `session-archive-m33/` 里有消化不了的快照(或本条迁移删码之后那里仍有文件)⇒ 拒启 `config.local_archive_snapshot_present`,拒句点名文件与两条出路。
|
|
94
|
+
**仍带戳的存档**(迁移留着的,或跳过本条迁移所在的版本直接升上来的数据根):读、续跑、拉取照常;`POST /v1/sessions/:id/fork` 与改日志的推送(会话同步导入的提交)同答 `409 conflict`,句子「this session's stored archive still carries an owner stamp … delete the session and push it again」(什么都没写,行不动;从头再同步照样撞 —— 出路就是句里那一条)。
|
|
95
|
+
**行为修复**:`replaceEntries`(先清后导)之后列表行的 `firstActivityAt` 与会话视图的 `createdAt` 不再变成换装时刻。
|
|
96
|
+
— **谁需要**:local 部署上 fork / 推送更早版本导入过的会话的用户 —— 修前 fork 出来的子会话存档带着别人的戳,换装以存档自己的戳为写条件。
|
|
97
|
+
— **谁受伤**:① 回滚:上一版读本版写过的 `session-incarnations.json` 严格拒启(格里多了两键)—— 回滚只有恢复升级前的备份,备份之后的会话改动随之丢;
|
|
98
|
+
② 迁移留着的带戳存档:fork 与改日志的推送被拒;③ 数据根很大时第一次起服多花一次整档读写(每只带戳存档读一遍、写一遍)。
|
|
99
|
+
— **补偿**:升级前备份整个数据根(含 `sessions/` 与各 `session-*.json`);停光旧进程再起本版;按 warn 行点名的会话,删掉后重推(推到不存在的会话 = 新建)。
|
|
100
|
+
**窗**:迁移码在窗关之后的第一个小版本删除;跳过本版的升级,至少在窗内起一次本版。
|
|
101
|
+
11. **本机形(`DB_BACKEND=local`)的后台子代转录活过重启:它住进宿主会话店的委派分区,随后台记录同亡;接线清单 `fleet.subagentTranscripts` 在 local 上由 `rows` 改答 `full`,`rows` 档不再由本服务的任何装配产出;主 runner 的 `session.store` 在 local 上由 `process_local` 改答 `declared_durable`(行为变更;wire 值变化;HTTP 体的形不变)**:
|
|
102
|
+
此前 local 部署上后台子代(`run_in_background` 的 Agent 调用)的转录住在进程内的短 TTL 店(空闲 1 小时即清):后台记录(行 + 终态快照)活过重启,对话不活 —— 重启后对已结束的子代 `SendMessage` 续不上,
|
|
103
|
+
按帧上的 `transcriptId` 读子代转录答 `404`。现在 local 后端的会话店与 SQL 两种后端一样声明了委派分区,每只新派的后台子代的转录生来就是 `<数据根>/sessions/` 下的一只**分区会话**(存档行头记着它的委派元组:父会话、根会话、子代 id;首写不可变):
|
|
104
|
+
① 活过重启:重启后对已结束 / 失败的子代 `SendMessage` 在后台复活它,带着原上下文接着答(回执说 `was revived in the background with its prior context intact`);
|
|
105
|
+
② 属主读 `GET /v1/sessions/<transcriptId>` ⇒ `200`,体上带 `agent: { id, parentSessionId, rootSessionId }`(与 SQL 后端同一只读面);属主 = 发起它的那棵委派树的根会话的属主,在建行那一笔写下;
|
|
106
|
+
③ 不进会话列表(`GET /v1/sessions`、`/resume` 的列表),随后台记录同亡:记录被收割时(`BG_AGENT_RETENTION_MS`,缺省 7 天)转录一并删除;记录已不在的分区会话由分区孤儿腿按同一视界收(这条腿此前在 local 上不可用);
|
|
107
|
+
④ 会话同步往子代 id 上写(`POST /v1/sessions/<id>/sync/import` 的整段换装与两阶段提交,含「内容与店里相同」那一支)⇒ `409 conflict.session_placed` + 固定句 + `detail.placement_kind`(与 SQL 后端同码同体),子代的存档与边档一字不动;
|
|
108
|
+
⑤ 子代停在审批上时,停驻只核它的转录在不在宿主店、属主对不对得上;此前「停驻时把私店里的转录拷进宿主店」的做法退役(声明了分区的部署上,能停驻的后台子代生来就在宿主店)。
|
|
109
|
+
`subagent_type: "fork"` 的后台子代不进分区(各后端同):它的转录是从父会话分叉出来、住宿主会话店的一只普通会话,记录被收割时保留(归会话留存管),①–④ 不适用于它;
|
|
110
|
+
引擎也不复活它(重启前后都一样:`SendMessage` 的工具结果是错误,`revive.fork_unsupported`)。
|
|
111
|
+
`wiring_manifest` 帧与 `GET /v1/diagnostics/wiring` 的 `fleet.subagentTranscripts` 在 local 上由 `rows` 改答 `full`。本服务的装配从此只产出 `full`(`DB_BACKEND=mysql` / `pg` / `local`)与 `none`(没有后台记录店的 `DB_BACKEND=memory`);
|
|
112
|
+
`rows` 仍是引擎闭集里的词(调用方自挂的 runner 仍可能答它),开集读者照旧。主 runner 的 `session.store` 在 local 上由 `process_local` 改答 `declared_durable`(会话暖缓存层此前不转发内层店的耐久声明,本版转发),起服自检把 local 记作持久介质;
|
|
113
|
+
子代 runner 的那一格仍答 `process_local`(它的普通子任务会话本就住进程内的短 TTL 店);SQL 两种后端的 `session.store` 同样改答 `declared_durable`(本节第 24 条)。
|
|
114
|
+
**谁需要**:用本机 cli / TUI 跑长任务、会派后台子代的单用户 —— 重启、升级之后还能接着跟已结束的子代说话,还能读它的转录。
|
|
115
|
+
**谁受伤**:① 数据根变大:后台子代转录留到记录被收割为止(缺省 7 天),重度委派的用户 `sessions/` 目录会长;
|
|
116
|
+
② 本机会话店在每次收尾、登记、执行格读写与同步提交时都要判一次「这是不是分区会话」,判法是把那只会话的存档读一遍 —— 长会话每跑一次多一次整档读(引擎把这一读改成只读行头之后消失);
|
|
117
|
+
③ 升级前停驻时被拷进宿主店的子代转录仍是**普通会话**:出现在会话列表里、不随记录删除(不迁移);④ 升级前派出、转录还在私店里的子代照旧活不过这次重启(不迁移);
|
|
118
|
+
⑤ 带身份的本机部署上,升级前停驻时拷进宿主店、没有属主的子代转录,升级后批准再停驻会被否决(普通会话没有记录的委派树,不被认领);
|
|
119
|
+
⑥ 对子代 id 推会话同步的调用方从此收 `409`;⑦ 删掉根会话不连带删子代转录(子代转录跟着后台记录走)。
|
|
120
|
+
**补偿 / 出路**:① 调小 `BG_AGENT_RETENTION_MS` 即少留(行与转录一起);③ 不想留的旧子代转录 `DELETE /v1/sessions/<id>` 删掉;⑤ 升级前先把停驻待批的审批处理完;⑥ 换一个会话 id 推。
|
|
121
|
+
**回滚**:回到上一版后,本版写下的子代转录文件留在 `<数据根>/sessions/` 下(引擎的文件仓不把分区会话列进会话列表,上一版也不收割它们 —— 要清就删文件),后台子代回到私店形。
|
|
122
|
+
12. **记忆同步停驻:游标用不了的层只点名一条出路(删游标);停驻在用户面上读得到 —— `GET /v1/sessions/:id/memory-status` 加性键 `memorySync`;停驻层的运维行由 `memory_sync_layer_failed` 换成 `memory_sync_layer_parked`(wire 加性;运维面日志形变更;部署零动作)**:
|
|
123
|
+
一层的同步游标被同步引擎在 scope / 对端 / 店任一轴拒,或读不成游标 ⇒ 这一层停驻(零请求、文件不动,每一轮照样停,直到删掉它)。本服务对停驻只点名**删掉这一层的游标文件**这一条出路
|
|
124
|
+
(下一轮从空基线重收敛:拉中心这一层有的、推本店有的、不推删除;两边都改过的条目按冲突报)。这是**保守合并**:自上一轮以来本地删掉的条目会被中心拉回来,中心删掉的条目会被本地推回去 —— 不丢条目,但删除要重做。
|
|
125
|
+
本服务不写、不改、不删游标(不改绑、不做旧游标的迁移或自动绑定、没有确认旋钮),引擎游标拒句里的「改绑」不再出现在本服务的任何一句里;升级前写下的旧游标同属「用不了的游标」,同样停驻、同一条出路;
|
|
126
|
+
一次性搬迁搬不动的更早游标文件(`sync-cursor-central.json` 读不成对象或没有 scope)那一行 `memory_sync_cursor_not_relocated` 也只点名删掉它(上一版还说「从备份恢复」)。
|
|
127
|
+
运维行 `memory_sync_layer_parked`(warn)字段 `reason` / `scope` / `cursorPath` / `axis?` / `found?` / `wayOut` / `note`;瞬态失败(中心不可达、读游标文件的 I/O 错)仍是 `memory_sync_layer_failed`。
|
|
128
|
+
用户面:`memory-status` 的 `memorySync`(有同步腿 ⇔ 在场)= `{ parked: [{ scope, wayOut: "delete_cursor" }] }`,`parked: []` = 在同步;部署事实,不随会话、不随 `?scope=`;游标盘路径不上 wire。
|
|
129
|
+
**订正 7.139.0 节第 1 条 ①(文字)**:「中心没换 ⇒ 把游标的 `"peer"` 改成新身份」与随后「补 `store`」两步不再是本服务点名的处置 —— 处置只剩删游标(该条的 ②);
|
|
130
|
+
**订正 7.140.0 节第 5 条(文字)**:那一层停驻时出的是 `memory_sync_layer_parked`(本版起),不再是 `memory_sync_layer_failed`。
|
|
131
|
+
**谁受伤**:按 `memory_sync_layer_failed` 认游标被拒的告警会漏掉停驻;按引擎拒句子串(`cursor is for` / `two ways out`)匹配的规则失配;中心没换而走删游标的部署,自上一轮以来一侧删掉的条目会从另一侧回来(改 `peer` 本可保留它们)。
|
|
132
|
+
**出路**:告警改认 `memory_sync_layer_parked`(`scope` / `cursorPath` / `axis` / `found` 机读);删游标之前先把要删的条目在两侧删干净可减少回来的条目;握有那只游标文件可信备份的,换回备份仍可用(本服务不点名、不拦)。
|
|
133
|
+
**回滚**:回到上一版,停驻层的运维行回到 `memory_sync_layer_failed`(句子回到引擎的两条出路),`memorySync` 键消失;零数据面。
|
|
134
|
+
13. **在飞 run 的权限模式切档口 `POST /v1/runs/:id/permission-mode`(wire 加性;能力位 `permissionModeWrite` 由恒 false 改为按部署;部署零动作)**:
|
|
135
|
+
体 `{ mode }`(引擎模式闭集),直通引擎的切档动词,200 体原样带引擎回执 `permissionMode`(`{ requested?, effective, foldedBy? }`)、本服务折了词时另带 `admission`,以及 `persisted`(准入的词有没有写回这条 run 的存储体)。
|
|
136
|
+
切档口与提交口经**同一只受理判官**:运维 `AUTONOMY` 地板、托管写围栏、任务 settings 的 `disableAutoMode` 在两口上同折同拒(拒码 `422 request.host_posture_refused` 与提交口同句);提交口的答案与拒序与上一版逐字同。
|
|
137
|
+
能力位 = 持久 run 账面 ∧ checkpoint 店(`DURABLE_APPROVAL`);没有 checkpoint 店的部署位仍 false、那一口答 501。
|
|
138
|
+
写回走 run 的认领栅栏且认腿(停驻后被续跑的新腿接手 ⇒ 旧腿迟到的回写零写):SQL 后端在 `checkpoint_ctx` 既有行上一条 `UPDATE`(两方言同句),**零 DDL**;local 后端原子写既有档。
|
|
139
|
+
**谁需要**:回合内切档的壳 / 客户端。**谁受伤**:从严切松的调用(按部署折 / 拒,与提交口同答);切档与停驻同时到 ⇒ `persisted:false`,续跑回到切档前的词。
|
|
140
|
+
**壳 / 客户端**:先读能力位再渲可写开关;渲染引擎回执的 `effective`(不是自己发的词);`persisted:false` ⇒ 续跑后重切。老 server 没有这一口(位恒 false)。**回滚**:回到上一版即无此口,存储体里已写回的词按同一读法照读(零数据面迁移)。
|
|
141
|
+
|
|
142
|
+
14. **后台 run 与续跑腿停驻没落定就以失败收场 ⇒ 先作废手里那张卡、再放认领;后台 run 的计量一条腿只记一次(行为修复;零 wire、零 DDL;部署零动作)**:
|
|
143
|
+
① run 停在审批 / 计划审阅门上(卡已在 checkpoint 店里)而记这次停驻的账本写抛(停驻行 / 用量行 / 记停驻之前的清单行与缓冲文本),或 `/decide` 之后的续跑腿在后面的门上再停、写再停账本行抛:
|
|
144
|
+
此前 run 行收成 `failed`、会话认领释放,那张卡仍 pending(列在 `GET /v1/approvals` 与收件箱里,决定口照样受理,续跑在没有认领的会话上驱动、结局回不到 run);
|
|
145
|
+
现在这条腿**先**按卡自己的 scope 作废那张卡(它离开待决面,再决断答 404),**再**落 `failed` 行、放认领。不在本 run 会话上的卡(cascade 级上的停驻)照旧不动。
|
|
146
|
+
作废没做成(checkpoint 店读 / 写抛、卡的会话对不上)⇒ 照样 `failed`,`fail_open_total{tag="server.park.held-card-void-failed"}` 计一次(detail 带 `leg=bg|resume`)+ 一次 warn,卡回到此前的形(由审批兜底收割收走)。
|
|
147
|
+
② 后台 run 的计量只在腿收场那一拍记一次:结局已落定之后的账本写再抛(完成后的建议补全行、终帧之后流再抛)不再让 `tasks_total` 把这条 run 计两次、`runs_active` 多减一次(`GET /metrics/summary` 的 `runsActive` 不再为负)。
|
|
148
|
+
`runs_active` 的减一与 `task_duration_seconds` 的那一笔从「结局行写下」挪到「腿收场」:请求了 `suggestNextPrompts` 的 run 多算建议补全那一段。
|
|
149
|
+
**谁需要**:看待决列表 / 审批收件箱的人,按 `/metrics`、`/metrics/summary` 看 run 数的运维。**谁受伤**:想在那一形里接着批那张卡的人(此前批下去也回不到 run);按建议补全开关混看时长的看板有一段偏移。
|
|
150
|
+
**补偿**:同会话重新提交(对话还在,`failed` 行带原错误文案);时长按有无 `suggestNextPrompts` 分开看。**回滚**:回到上一版即回到此前的两形(零数据面)。
|
|
151
|
+
15. **`settings.permissions.deny` / `ask` 的条目可以带出处层:`{ "rule": "<规则>", "layer": "<来源>" }`(wire 条目型放宽 + 能力位 `settings.permissions.layers`;纯串照旧,读法不变)**:
|
|
152
|
+
来源词 = `userSettings` / `projectSettings` / `localSettings` / `flagSettings` / `policySettings` / `foreignProjectSettings`。只有 `/` 开头的路径规则随层变:`userSettings` 的读在执行环境的配置根
|
|
153
|
+
(host 车道 = `SEMA_CONFIG_DIR`,缺省 `~/.sema`;沙箱车道 = 转给沙箱的 `SEMA_CONFIG_DIR`,否则执行环境 home 下的 `.sema`,home 解不出 ⇒ 422 `home_unresolvable`),其余来源与纯串一样读在任务根;
|
|
154
|
+
`~/`、`//`、相对形在每一层读法相同。层只决定规则读在哪,不决定准入档。一桶仍至多 1000 条(带层条目与纯串同计)。
|
|
155
|
+
**之前**:user 层写的 `Read(/secret/**)` 被端折成 `settings.permissions.deny` 里的一个串,守的是任务根下的 `secret`,配置根(`SEMA_CONFIG_DIR`,缺省 `~/.sema`)下的 `secret` 照读。
|
|
156
|
+
**现在**:端把它作为带层条目 `{ "rule": "Read(/secret/**)", "layer": "userSettings" }` 发来时,它守配置根下的 `secret`、不再守任务根下的 —— 与参照实现读 user 层 `/` 的位置相同;别的层与纯串条目读法不变。
|
|
157
|
+
**出路**:要守每个项目自己的目录,把规则放进项目层,或写相对形 `secret/**`(工作目录下任意深度);固定位置写 `//` 绝对形。沙箱车道上配置根读不出时:往沙箱 env 名单里加 `SEMA_CONFIG_DIR`,或声明 `REMOTE_EXEC_HOME_DIR`。
|
|
158
|
+
**回滚 / 混版副本**:带层条目的请求交给本版之前的服务会被拒(新提交 400,续跑 409),不会被静默读丢;没有改动的端照旧发纯串,读法不变。
|
|
159
|
+
**已知限制**:`allow` 桶只收纯串(带层条目 400 `bad_entry`),user 层的 `/` 形 allow 今天仍按任务根放行;Windows 形 home 的 device 车道没有声明 home 的出路(`REMOTE_EXEC_HOME_DIR` 只收 `/` 开头),那里 user 层的 `/` 形规则请写成 `//` 绝对形。
|
|
160
|
+
16. **`GET /v1/runs/:id` 的 `heldBy`:一个条件 —— `null` = 这条 run 的 claim 已释放,非空 ⇔ 此刻有副本持有;终态行恒 `null`(行为变更;wire 值域变化;部署零动作)**:
|
|
161
|
+
此前终态行上 `heldBy` 仍是跑这条 run 的副本 id,契约写「变 `null` **或** 进终态 = 已释放」两读法。现在终态行(`completed` / `failed` / `blocked`,含 `errorCode` 为 `cancelled` /
|
|
162
|
+
`run.stalled` / `run.orphaned` / `approval.expired` 的收割落盘)投 `null`;`running`、`suspended`、`needs_review` 给持有副本的 id;读面把久未心跳的 `running` 折成 `failed`
|
|
163
|
+
(`errorCode:"run.stalled"`)的那一形照旧给失联副本的 id(盘上仍 `running`,claim 仍被占着),收割落盘之后 ⇒ `null`。
|
|
164
|
+
`GET /v1/runs?idempotencyKey=` 与提交面同键重放(`replay: true`)的体是同一个读面,同改。存储里的 `instance_id` 列不变。
|
|
165
|
+
**谁需要**:按 `heldBy === null` 判「claim 已释放」的客户端 —— 真引擎上终于读得到 `null`。**谁受伤**:把终态行的 `heldBy` 当「哪个副本跑完的」来读的调用方。
|
|
166
|
+
**补偿**:那条历史事实读部署日志 / 指标(按 `taskId`),或直接查存储行的 `instance_id` 列。**回滚**:回到上一版即回到终态行给 id(零数据面)。
|
|
167
|
+
17. **停驻的工具审批卡:运维队列行(`GET /v1/approvals` 的 `pending[]`)与 `/v1/approvals/stream` 的 `pending` 帧恰带 `boundGrantDigest` / `boundGrantAbsence` 之一(行为修复;wire 值域变化;部署零动作)**:
|
|
168
|
+
读法与助手收件箱行相同 —— 摘要是串 ⇒ 摘要;否则摘要键不在且行上的缺席词是闭集成员 ⇒ 那个词;否则 ⇒ `"unreadable"`。本服务 7.128.x 及以前写下、升级前停驻的卡(两者都不说)
|
|
169
|
+
此前在队列两面两键都不带、在收件箱行上是 `"unreadable"`;现在三面都是 `"unreadable"`(本文件 7.129.0 节「升级前停驻的卡两者都不说」说的是停驻行本身;读面上它们一律读作 `"unreadable"`)。
|
|
170
|
+
集外缺席词同读 `"unreadable"`(此前队列两面缺席);摘要在却不是串的行读 `"unreadable"`,即使行上另有 `not_bindable` —— 这种行的 `rememberRefused` 由缺席变 `true`,与 `/decide` 的回执对齐。
|
|
171
|
+
SQL 后端为技能卡清单多读的整行读失败时,行保留 `boundGrantDigest`(只丢清单与成因词)。本服务不改写任何一行。
|
|
172
|
+
**谁需要**:读队列行决卡的壳 / 运维台(只认一种形)。**谁受伤**:按「两键都不在」识别老卡的读者 —— 改读 `boundGrantAbsence === "unreadable"`。**补偿**:无需动作;读不出绑定的卡照旧可以批这一次(「本会话放行」记不住,与此前同)。
|
|
173
|
+
**回滚**:回到上一版即回到队列两面对这些卡两键皆缺(零数据面)。
|
|
174
|
+
18. **脱敏:私钥 armor 与 JSON 秘密字段的三处结构读法收紧(行为面,安全;部署零动作)**:① 不带引号、粘在起始栅栏前的值(`password=x-----BEGIN PRIVATE KEY-----`)吃掉栅栏开头一截时照起块,整块与被吃的值各自照遮(PEM / SSH2 / PuTTY 同);
|
|
175
|
+
② 体已经起了、文本里没有真收尾(上游截断)时,整段读法从起始栅栏遮到本段(到下一枚起始栅栏或窗尾)最后一段体形串(≥8 位 base64 串)之后 —— PEM 不设体上界,SSH2 在体上界之内;
|
|
176
|
+
JSON 读法下窗 = 栅栏所在的串值,兄弟键原样;体没起的起始栅栏(说明文字、代码里提到它)不动;有界日志行的读法不变;③ shell 命令串里内嵌的 JSON(`\"secret\":\"…\"`,以及再字符串化一层的 `\\\"` 形)的值照遮,记号两侧写回读到的引号形。
|
|
177
|
+
**谁受伤**:体起了、没收尾的私钥块之后(含文档里示例私钥体之后的正文)、本段最后一段体形串之前的说明文字在 trace / 读面里一并换成记号(有界日志行上一版即如此)。
|
|
178
|
+
**出路**:无需动作;要看原文读未脱敏的源。
|
|
179
|
+
19. **沙箱三车道(e2b / k8s / local-docker)读拒表字节地板:新旋钮 `SANDBOX_READ_FLOOR`(闭集 `keep | off`,缺省 `keep`;词外 / 空串拒启)· 起服行 `remote_exec_enabled.sandboxReadFloor`(运维面;本版零行为变化;部署零动作)**:
|
|
180
|
+
三条沙箱车道守不守读拒表的字节地板 = 读地板模块服务这条车道 ∧ 本键不是 `off`;本版模块不服务任何车道,三车道的 `keepsReadFloor` 仍是 `false`,沙箱里每一次起动的命令行 / 选项与上一版逐字同。
|
|
181
|
+
起服行 `remote_exec_enabled` 在这三条车道上多一个字段 `sandboxReadFloor`:`unserved`(模块还没服务这条车道)/ `off`(部署关了)/ `kept`(守)。别的车道上本键无作用、也不出这个字段。
|
|
182
|
+
将来某车道进服务集(那一版的 MIGRATION 写部署前提:内核、架构、非 root 的镜像用户、k8s 上 configmaps 的 create)时,不满足前提的沙箱上带读拒表的命令会被拒起(`spawn_error`,首句点名原因词);那时不想守的部署设 `SANDBOX_READ_FLOOR=off`。
|
|
183
|
+
**谁受伤**:本版部署无人;按 `remote_exec_enabled` 的字段全集做严格校验的日志管线会看到一个新字段。嵌入方:给 k8s 车道传 `podSpecPatch` 的,补丁里的卷名多两只保留名 `sema-floor-x86-64` / `sema-floor-aarch64`
|
|
184
|
+
(适配器给地板二进制自铸的卷),补丁用到它们 ⇒ 开 pod 时被拒,拒句点名保留名(部署 env 面没有这个入口)。**出路**:无需动作(嵌入方给补丁卷换个名)。**回滚**:回到上一版即无此键与字段(零数据面)。
|
|
185
|
+
20. **`REMOTE_EXEC` 的形是部署声明的有序车道表(逗号分隔、首项缺省);本引擎每个进程只装一条车道 ⇒ 表里不止一条起服拒(部署 env 形变,BREAKING;单词零变化)**:
|
|
186
|
+
契约包 16.0.0 把 worker 的执行车道由单值改为有序车道集 `runtime.execution.lanes`,渲成 env 是 `REMOTE_EXEC=<lanes 按序逗号连接>`。本服务读同一个形:逗号分段,每段逐字是一个车道词(不 trim、不折大小写),
|
|
187
|
+
不许空段、不许同一车道出现两次;写着契约退役车道值(`remote-docker`)⇒ 拒句给出契约的去向句。单词 = 一条车道的表,装配、必需 env 判与拒句都与上一版逐字同。
|
|
188
|
+
表里不止一条车道 ⇒ 起服拒:`REMOTE_EXEC="k8s,device" declares 2 execution lanes (k8s, device; the first is the default) — this engine wires exactly one execution lane per process, so device would never run anything while the deployment declares it. Refusing to start rather than serving "k8s" alone: declare one lane per engine (REMOTE_EXEC=k8s) and run a separate engine for each further lane.`
|
|
189
|
+
这一拒先于各车道的必需 env 判(缺件的多车道表也先说这一句)。
|
|
190
|
+
**谁受伤**:由中心(或自写渲染器)下发两条及以上车道的部署 —— 上一版同样拒启(整串被当成一个认不出的词),本版拒句换成上面这句。只写一个车道词的部署零动作。
|
|
191
|
+
接中心(`CONFIG_PROVIDER=remote`)的部署:中心答的 `workers` 行若仍是旧形单值 `runtime.execution.lane`,契约包的读法把它当墓碑拒、整份读不进 ⇒ 每一次拉取失败,
|
|
192
|
+
部署停在盘上 LKG / env,能力面 `centerWiring.effectivePull` 读作 `false`(拉取恢复前,中心改的配置到不了这台引擎)。
|
|
193
|
+
**出路**:一台引擎一条车道:`REMOTE_EXEC=<首项>`,其余车道各起一台引擎。接中心的部署的**升级序**:中心先把存下来的 `workers` 行跑一次契约包的一次性迁移
|
|
194
|
+
(`npx @sema-agent/settings-schema migrate <config.d 目录>`:`lane: L` ⇒ `lanes: [L]`,一元表与旧单值逐位同),再升本版引擎。**回滚**:回到上一版即回到单词读法(零数据面)。
|
|
195
|
+
21. **记忆持久面方言词 `MEMORY_ENGINE_BACKEND=tidb` 改名 `mysql`:旧词起服拒;`memoryEngine.backend` / `memoryPosture.backend` 在 MySQL 族部署上由 `"tidb"` 改报 `"mysql"`(部署 env 形变 BREAKING;wire 值变化)**:
|
|
196
|
+
MySQL 族那只 SQL 店只有一个字,与 `DB_BACKEND=mysql` 同字。`MEMORY_ENGINE_BACKEND=tidb` ⇒ 起服拒,拒句 `env MEMORY_ENGINE_BACKEND="tidb" must be one of: file, pg, mysql`。
|
|
197
|
+
池、表、行与记忆数据零改动(同一只池、同一组表);方言与店的配对规则不变(`mysql` 要 `DB_BACKEND=mysql`,`pg` 要 `DB_BACKEND=pg`)。
|
|
198
|
+
`GET /v1/capabilities` 的 `memoryEngine.backend` 与诊断面 `memoryPosture.backend` 在这类部署上答 `"mysql"`;`capability.memory_store_required` / `capability.memory_engine_required` 的 501 文案里的 `pg|tidb` / `pg/tidb` 同换(码不变)。
|
|
199
|
+
**谁受伤**:部署环境写着 `MEMORY_ENGINE_BACKEND=tidb` 的(拒启);按 `memoryEngine.backend === "tidb"` 分支的客户端;按 501 文案子串匹配的规则;
|
|
200
|
+
嵌入方:`ServiceConfig.memoryEngineBackend` 的值域由 `"file" | "pg" | "tidb"` 改为 `"file" | "pg" | "mysql"`(类型面 BREAKING,零别名;tsc 红即消费点清单)。
|
|
201
|
+
**出路**:升级前把部署环境改成 `MEMORY_ENGINE_BACKEND=mysql`(只此一处,数据零动作);中心存下来的配置行由契约包的一次性迁移改写(`npx @sema-agent/settings-schema migrate <config.d 目录>`)。客户端改认 `"mysql"`。
|
|
202
|
+
**回滚**:回到上一版前把这一行改回 `tidb`(上一版不认 `mysql` 作记忆方言)。
|
|
203
|
+
22. **`config.d/remote-exec.json`(本地配置模式的车道文件)里的非空串字段只含空白 = 空 ⇒ 起服拒(行为收紧,fail-closed;部署面)**:
|
|
204
|
+
沙箱镜像、命名空间、主机、用户名、设备序列号、工作目录、挂载路径等此前拒空串的字段,写成纯空白(空格 / 制表 / 换行 …)此前被收下、拿去起容器或拉 pod,起服之后才响。
|
|
205
|
+
现在与空串同一条拒、同一句话:起服拒,拒句 `config.d/remote-exec.json under <根> is invalid: … must not be empty or whitespace-only — give it a real value (an optional key can simply be left out)`(点名那一格,不回显值)。
|
|
206
|
+
文件在即判:这条车道由文件驱动还是由 env 驱动都一样。非空白的值(含前后带空白的)逐字承运,不 trim。
|
|
207
|
+
**谁受伤**:车道文件里有纯空白字段的部署(病态输入)。**出路**:删掉那一键(可选字段:缺席 = 缺省行为),或给真值(必填的镜像 / 命名空间 / 主机 / 用户名 / 序列号只能给真值)。**回滚**:回到上一版即收下空白(不建议)。
|
|
208
|
+
23. **契约包 16.0.0 的其余读点(运维面;部署零动作)**:① 设备入口 `DEVICE_RELAY_URL` 的字面 `none` 与值文法取自契约包:写了却不合文法 ⇒ 拒句 `env DEVICE_RELAY_URL <契约规则句> — found: <契约拒因词>; got <脱敏后的值>`(此前是本服务自己的句子);
|
|
209
|
+
缺席 / 空串 / 只含空白只由车道必需 env 门拒,拒句与其余车道必需键同一句(本节第 7 条已按此写);两份根 compose 的 `DEVICE_RELAY_URL` 透传行移进由车道表生成的区段(值与行为不变)。
|
|
210
|
+
② `CONFIG_PROVIDER=local` 的本地配置一次读完:读得出的树与被拒的树同一条路;一份文档嵌得过深(根下 199 层以上)⇒ 它是一份被拒文档,成因词 `too_deep`,与同树别的被拒文档一起交出(此前整份读抛,起服走「源不可达」、刷新拍记失败);
|
|
211
|
+
被拒的那一读也报目录里没人读的文件(此前被拒时不报)。模型面组拒的拒句表多一个 `too_deep` 句。③ 契约包退役组拒码 `config.summarize_model_missing`(本服务从未铸它,零行为)。
|
|
212
|
+
**谁受伤**:按设备入口旧拒句文字匹配的规则;按「被拒的本地读不报没人读的文件」写的告警(现在多报)。**出路**:无需动作。**回滚**:回到上一版即回到旧句子与旧读法(零数据面)。
|
|
213
|
+
24. **SQL 后端(`DB_BACKEND=mysql` / `pg`)的会话店补上顶层耐久声明:主 runner 的接线清单 `session.store` 由 `process_local` 改答 `declared_durable`(wire 值变化;只改读数,存取行为不变;部署零动作)**:
|
|
214
|
+
此前两种 SQL 会话店只声明了委派分区的耐久(子代转录),没有声明顶层的会话耐久;引擎对缺席的读法是进程内,于是真持久的 SQL 部署上,主 runner 的 `wiring_manifest` 帧与 `GET /v1/diagnostics/wiring` 的 `session.store`、
|
|
215
|
+
起服日志 `wiring_static` 的 `sessionDurability` 一律答 `process_local` —— 会话明明落在库里的两张真表上。现在 MySQL 协议与 PostgreSQL 两种会话店都声明 `durable`(与 local 后端、与委派分区的耐久读同一只常量),读数答 `declared_durable`;
|
|
216
|
+
会话暖缓存层(缺省 `SESSION_CACHE_TTL_SEC=300` 时包着真店)逐字转发内层声明,开不开缓存读数一样。起服自检的「声明持久 × 介质」对表在 `mysql` / `pg` 上零判决,不新增任何拒启。
|
|
217
|
+
引擎在续跑找不到会话(`resume.session_not_found`)时,于错误句末附的「装配说明」(检查点店声明持久而会话店不声明)此前在装了持久检查点店的 SQL 部署上是一句误报,现在不再附上;错误码与句子的其余部分不变。
|
|
218
|
+
不变的:子代 runner 的那一格仍答 `process_local`(它自己的普通子任务会话住进程内的短 TTL 店,委派分区的持久走分区声明、`fleet.subagentTranscripts` 照旧);会话店仍是进程内店的部署(`DB_BACKEND=memory`,或 `DB_BACKEND=mysql|pg` 而 `SESSION_BACKEND=memory`)仍答 `process_local`;HTTP 体的形、键集、会话的读写与重放一字未动。
|
|
219
|
+
**谁需要**:读清单判断「这台部署的会话重启后还在不在」的壳 / 控制台 / 运维面(此前对 SQL 部署读到的是错的)。**谁受伤**:无(数据面与存取行为不变);只有把「SQL 部署的 `session.store` 恒为 `process_local`」写死成分支的读者会改走 `declared_durable` 那一支,那一支才对应事实。
|
|
220
|
+
**补偿**:无需动作。**回滚**:回到上一版即回到旧读数(零数据面)。
|
|
221
|
+
25. **`workflow_complete` 补投帧(与 bg / 续跑账本行)多一只可选键 `diagnostics`:引擎在 workflow 完成通知上铸的诊断教学文本(wire 加性;行为面;部署零动作,零 DDL)**:
|
|
222
|
+
异步 workflow 跑完之后、下一次开流从会话收件补投的 `workflow_complete` 帧此前只带 `type · runId · status · summary`(7.135.0 起再加 `completionId`)。引擎在同一次完成的 live 通知上给一段诊断教学文本 ——
|
|
223
|
+
至多 5 行未完成 agent 的摘要、完整记录的读取手柄句、journal 坐标、续跑句 —— 补投路径却把它丢了;原腿已不在(断线重连 / 重启 / 空闲态到达)时,补投帧是它仅有的去处。
|
|
224
|
+
现在补投帧带它:键 `diagnostics`(串,非空才铸),是引擎为同一次完成铸的那段诊断文本(live `task_notification`〔`task_type:"workflow"`〕帧上同名键携同一段;
|
|
225
|
+
补投路径上引擎在交给本服务之前已按「人类读者」档抹过主机路径与 URL〔`[redacted-path]` / `[redacted-url]`,journal 坐标句里的部署路径因此可能已被抹〕,live 帧不经这一档,两张脸文字不保证逐字节相等;读取手柄句不含路径,不受影响)。
|
|
226
|
+
出门前过脱敏(与 live 帧上 `diagnostics` 同一个脱敏范围,入会话收件时洗一次,凭据形被遮成记号,店里只放洗过的字节),至多 4000 码元(超界从界上切,切点不落进本服务的 `«redacted:…»` 记号内部;引擎自己写进文本的 `[redacted…]` 记号若恰被界切开会留半枚,不露原值)。
|
|
227
|
+
收件条目的 `payload` 列(既有 TEXT 列)多放一个键,**零 DDL**:`workflow_complete` 的 `payload` 现在至多 `{"completionId"?, "diagnostics"?}` 两键。
|
|
228
|
+
**已知限制(如实)**:崩溃恢复补投(副本崩了、本服务重启后补投没来得及送达的完成)与本服务代为终结的孤儿 workflow **不带** `diagnostics` —— 引擎不把这段文本持久在 workflow 记录行上,本服务不编、不从别处拼;
|
|
229
|
+
这两条路上缺席读作「没有诊断文本」,`summary` 与按 `runId` 去重照旧。同一条路也包括「已入箱、尚未记作送达」时副本崩了的窄窗:恢复扫的重投按 `runId` 替换已入箱的那条(至少一次投递的既有语义),该条随之没有 `diagnostics`。
|
|
230
|
+
**谁需要**:渲染补投帧的壳 / SDK。**谁受伤**:无(additive)—— 唯一要留意的是对 `workflow_complete` 帧做封闭键集校验的一侧(多一只可选键);滚动升级窗里旧副本入箱的条目没有这一键(帧上缺席,照旧)。
|
|
231
|
+
**出路**:消费方按可选键读(缺席 = 这一条没有诊断文本,不是失败);封闭键集校验的一侧把 `diagnostics` 加进可选键。**回滚**:回到上一版即回到旧帧形(`payload` 列里已有的 `diagnostics` 被旧读法忽略,零数据面)。
|
|
232
|
+
|
|
233
|
+
26. **`GET /v1/capabilities` 加能力位 `mcpTransportKinds`:请求面读器与引擎今天能拨的 MCP 传输种类(wire 加性;提交面不放宽;部署零动作)**:
|
|
234
|
+
值是字符串数组,书写序,今天恒 `["stdio","http"]`,每种部署形都在场、不随部署形变。它**只回答**「语法 / 实现支持哪些传输种类」:本部署收不收调用方自带的 `mcpServers` 仍读 `mcpInjection`,「端到端可达」没有任何位承诺。
|
|
235
|
+
引擎自己还有一个 `host` 种类(要宿主回调席),请求面读器不收、本服务不装席,不在位里。
|
|
236
|
+
**提交面一字未动**:`mcpServers[].transport.kind` 不在位里的词(`host` / `sse` / `sdk` / `websocket` …)在新提交与 `POST /v1/capabilities/mcp/probe` 上照旧整次 `400`;位只是让客户端在**投影阶段**(拼 `mcpServers` 之前)
|
|
237
|
+
就知道某条目的目标传输读不读得了 —— 只拒那一台、其余照投,而不是整次提交挨 `400`。值的来源只有一处(契约包请求传输形 `kind` 联合型的两向编译钉),位不可能与读器的词表分叉。
|
|
238
|
+
**谁需要**:投影 `mcpServers` 的客户端(终端壳 / 客户端核心包)与要早知道某类条目进不来的 SDK 调用方。**谁受伤**:无 —— 加一个键;按「能力位键集严格相等」解码的客户端会多见一个键。
|
|
239
|
+
**客户端**:先读位再投影;位缺席 = 老 server,读作 `["stdio","http"]`(契约承诺的旧版下限 7.135.0);**位里出现不认识的词按「不支持该种类」处理,不让整份能力解析失败**(位以后会随新种类长词)。**回滚**:回到上一版即无此位(按上一句读)。
|
|
240
|
+
|
|
241
|
+
27. **`GET /health` 加性键 `engineLease: { lingerMs, tickMs }`:引擎附着租约窗上 wire(wire 加性;运维面;部署零动作)**:
|
|
242
|
+
装了自退腿(`ENGINE_AUTO_EXIT` 开,或 `SEMA_PARENT_PID` 在场)的引擎,`/health`(无鉴权)多一个对象键:`lingerMs` = 自退腿会执行的**最短**静默窗(父还活着的窗 `ENGINE_LINGER_MS` 与父死之后的孤儿窗
|
|
243
|
+
`ENGINE_ORPHAN_LINGER_MS` 取小;孤儿窗只在装了看门狗时存在),`tickMs` = 自退检查的采样拍(自退发生在**生效窗**满之后、至多再晚一拍;父还活着时生效的是较长的父活着的窗,所以实际自退可以比 `lingerMs` 晚得多 —— `lingerMs` 是安全节拍的上界(触点比它密,在任何状态下都先于自退),不是自退时刻的预言)。两个数是起服已解析的真值,与起服日志 `engine_lease_armed` 同一组窗,不是旋钮回声。
|
|
244
|
+
**取最短而不是「此刻生效」**:此刻生效的窗在父死那一拍从长窗掉到孤儿窗,按旧读数定节拍的壳会在下一次读 `/health` 之前被拆台;最短窗不随状态变,触点比它密,在任何状态下都留得住引擎
|
|
245
|
+
(附着着 SSE 流时本来就留得住,约束的是没有 SSE 的纯轮询壳)。
|
|
246
|
+
**在场 ⇔ 装了自退腿 ∧ 腿还在观察**:服务器形部署(两键都没设)、自退触发后、别的原因进入排空后腿收摊 ⇒ 键缺席(不补 0、不报 `null`)。自退判据与窗长一字未动。
|
|
247
|
+
**谁需要**:持租约的壳(以前只能按交给 spawn 的那份推节拍,别处起的短窗引擎窗长不上 wire,第二句仍会撞上已自退的引擎)。**谁受伤**:无(加一个键)。
|
|
248
|
+
**壳**:启动时读一次,触点节拍留余量(例如 `lingerMs` 的一半);键缺席 = 老 worker 或没装自退腿,按自己交给 spawn 的那份推。**回滚**:回到上一版键消失。
|
|
249
|
+
|
|
250
|
+
28. **名单型 env 旋钮点到本服务自有凭据名的起服拒句:一句只用一套序号(文字;运维面;零行为变更)**:
|
|
251
|
+
`LSP_ENV_ALLOW` / `BAKE_ENV_ALLOW` / `E2B_SANDBOX_ENV` / `DOCKER_SANDBOX_ENV` / `K8S_SANDBOX_ENV` 点到本服务自有凭据名而起服拒的那句话,此前把同一项报成两种数法:`env <旋钮>: entry #2 of 2 is …`(第几段,1 起)
|
|
252
|
+
后面又带引擎那一句 `inheritEnv[0] names <名>, which is …`(引擎自己入参数组的下标,这里每次只交一个名所以恒为 0)。现在句子只有一套序号 `entry #k of n`(k 从 1 起 = 名单里第 k 项),引擎只作判官
|
|
253
|
+
(它的拒句不再转述进来),句尾括号收成 `(the engine refuses it on any allow list)`;随引擎那一句回显过的「那个声明过的名」也不再出现(第 k 项就是你写的第 k 个名)。
|
|
254
|
+
同源的一处:模型目录换代时「名单正在交出的名被新条目的 `apiKeyEnv` 并进自有凭据」的候选整拒句(`env <旋钮> hands on <名>, which this candidate makes this deployment's own credential — …`)同样不再带 `inheritEnv[0] …` 一句。
|
|
255
|
+
其余起服拒因(空段 / 非变量名形 / 点到名单型旋钮名)的句子一字未动;拒不拒、码、出路都不变。
|
|
256
|
+
**谁受伤**:按旧句里引擎那一句的子串(`inheritEnv[0]` / `which is this deployment's own credential and cannot be inherited by a child`)匹配的告警 / 脚本会失配。
|
|
257
|
+
**出路**:改按句首 `env <旋钮>: entry #k of n is this deployment's own credential — ` 匹配(这一段不变)。**回滚**:回到上一版即回到旧句子。
|
|
258
|
+
|
|
259
|
+
29. **订正 7.139.0 节第 23 条 ⑤:暂存目录残留的第三因 —— 服务进程被 `SIGKILL`(文字订正;零行为变更)**:
|
|
260
|
+
7.139.0 节第 23 条 ⑤ 只列了两因(清理往返失败、文件系统为打开着的文件留了隐藏项)。漏了第三因:**服务进程被 `SIGKILL`**(`kill -9`、内存杀手、容器被强停)时没有活着的一方去清暂存 ——
|
|
261
|
+
正在传输的那次写在目标旁留下 `.<名>.stage-<12 位十六进制>/`,里面是在传的新内容(上传途中被杀只有前半截,传完才被杀则是整份);**目标逐字仍是旧内容**,整文件替换的保证不受影响。ssh 车道上被强杀的写都留下了;其余四条远端车道走同一段暂存脚本,同形。
|
|
262
|
+
host 车道的暂存是引擎的,同形的残留名是 `<目标>.tmp.<进程号>.<十六进制>`。这只目录确认没有另一个进程正在写同一个目标之后直接删;**本版不自动清**(下一次对同一目标的写不会扫陈旧暂存)。`Ctrl-C` 取消的那一次写不留。
|
|
263
|
+
已发的 7.139.0 节不改,订正记在这里;USAGE「文件写入的中断语义」一节同说。**谁受伤**:被强杀过的远端工作区里多出的隐藏目录(体积至多等于那次写的文件)。**出路**:手删。**回滚**:不适用(文字)。
|
|
264
|
+
|
|
265
|
+
30. **折码的运维 warn 行 `outward_failure_code_folded`:不再带失败句原文;读面上同一原码只一行(运维面;日志形变更;安全;部署零动作)**:
|
|
266
|
+
失败码不合本服务码形的失败折成 `internal.store_error` 时的那一行,旧形是 `[terminal] outward_failure_code_folded original=<码> outward=internal.store_error` 加第二个实参 `{ message: <原始失败句> }`;
|
|
267
|
+
新形只一个串实参:`[terminal] outward_failure_code_folded original=<码> outward=internal.store_error messageBytes=<失败句字节数> at=<exit | run.result | ev.done.result>`。
|
|
268
|
+
失败句只报字节数;码只在它是码(字母、数字与 `_ . : -`,不超过 64 字符)时报原值,否则报 `<not-a-code>`。`at=exit` 是结果第一次离开引擎,每折一次一行(与以前同);
|
|
269
|
+
`at=run.result` / `at=ev.done.result` 是存量行在读面上被再读,同一读面同一原码每进程只一行(进程重启后重新报一次;表有界,读过超过 1024 个不同原码时最早的那个再读会再报一行)。
|
|
270
|
+
**谁受伤**:按第二实参取失败句的日志规则 / 告警(那一位不在了);按「行尾是 `outward=…`」匹配的严格解析。**出路**:失败句读结果(`GET /v1/runs/:id → result.terminal.message`,`kind: "failed"` 那一臂,过脱敏);
|
|
271
|
+
规则改按句首 `[terminal] outward_failure_code_folded original=` 与 `key=value` 字段取;只关心新失败的告警加 `at=exit` 条件。**回滚**:回到上一版即回到旧句形(第二实参重新带原文)。
|
|
272
|
+
|
|
273
|
+
31. **验证器自己停驻时:恢复凭据不再外出 · 那张卡结算时当场作废 · 读面上不合本服务码形的存量失败码读作 `internal.store_error`(行为面;安全 / 修复;wire 值少一键(`verification.verifierPause.checkpointToken` 删键);部署零动作)**:
|
|
274
|
+
`verify:true` 任务里验证器那一腿自己停在耐久门上时,结果的 `verification.verifierPause`(`unverifiedReason: "verifier_paused"`)带着那张卡的恢复凭据 `checkpointToken`;
|
|
275
|
+
上一版它原样落 run 行、账本 `done` 行与 `POST /v1/tasks` 的 200 体,`GET /v1/runs/:id` 与 `GET /v1/runs/:id/events` 照样回放,同处的 `checkpointGate` 也没过门的脱敏。
|
|
276
|
+
本版这些出口(含续跑决定腿落的行与账本)经同一只出口封口:`verifierPause` 上不再有 `checkpointToken`,`checkpointGate` 的自由文本过脱敏,`status` / `sessionId` / `checkpointGate` 照常在;
|
|
277
|
+
升级前已落盘、仍带凭据的行本版不改写,读面上同样摘掉。
|
|
278
|
+
① **卡**:那张卡落在验证器自己的会话上,本服务续不回它(上一版对它决定答 `409 conflict.resume_context_unavailable`,只等兜底收割,缺省 30 天)。本版在结算时(后台提交腿、同步提交腿、续跑的 verify 臂)
|
|
279
|
+
按卡自己的 scope 当场作废:它不再出现在 `GET /v1/approvals` / `/v1/approvals/stream` / `/v1/assistant/inbox` 上,对那只会话决定答 `404`。不新增持久态,不新增码。
|
|
280
|
+
作废没做成(checkpoint 店出错)⇒ 卡回到上一版的形(列在待决面、到期收回),计数 `fail_open_total{tag="server.verifier-pause.card-void-failed"}` + 一次 warn。
|
|
281
|
+
② **读面折码**:更早落盘、失败码不合本服务码形(小写、`.` 分族;例:数据库驱动原码 `ER_BAD_FIELD_ERROR` / SQLSTATE `42703`)的存量行,`GET /v1/runs/:id` 与 events 回放上读作 `internal.store_error`(原码进 `message` 尾注),与新落盘的行同形;码不是串的形不合行原样交出,不折。折码的运维行按第 30 条的定形句出:读面上按(读面, 原码)每进程只一行(`at=run.result` / `at=ev.done.result`),写口每折一次一行(`at=exit`);行内只有 `original` / `outward` / `messageBytes` / `at` 四个字段,零自由文本(失败句只报字节数,码形座里装着文字的报 `<not-a-code>`)。
|
|
282
|
+
— **谁需要**:看待决列表的人与壳(那里不再躺着一张点不动的卡);读 run 行 / 账本 / 同步体的下游(恢复凭据不该出现在这些面上)。
|
|
283
|
+
— **谁受伤**:想让验证器把那一步做完的人(上一版也做不到;run 的判词照旧 `unverified` / `verifier_paused`);按旧失败码筛很老的 run 行的消费方(读面上那一码变成 `internal.store_error`,原码在 `message` 尾注里)。
|
|
284
|
+
— **补偿**:重新提交带 `verify` 的任务再验一次。
|
|
285
|
+
— **已知限制**:作废只结清卡,引擎为它钉住的验证器会话不在这里释放,留在副本内存里直到进程重启(引擎给出「作废并释放」的动词那一版收);编排(leader)路径上的验证器卡本版不作废(凭据同样不外出,卡留到兜底收割)。
|
|
286
|
+
— **回滚**:回到上一版即回到凭据随结果外出、卡挂在待决面上的形(零数据面迁移;本版作废掉的卡留在作废态)。
|
|
287
|
+
|
|
288
|
+
32. **订正 7.140.0 节第 7 / 10 / 12 / 13 条的四处说法,第 8 条补一句(文字订正;零行为变更)**:7.140.0 发出后的黑盒复跑读到下面四处与已发句子不符(①–④),另有一处已发句子没说全(⑤);读法以本条为准,已发的 7.140.0 节不改。
|
|
289
|
+
① **第 7 条与第 10 条「`GET /v1/runs/:id/events` 的尾帧是 `suspended` / `needs_review`」**:`verify:true` 任务停驻期间(审批门、计划审阅门、资源限)回放的最后一帧是一帧 `model_usage`,排在状态帧 `suspended` / `needs_review` 之后;
|
|
290
|
+
不带 `verify` 的停驻以状态帧收尾。按「最后一帧 = 当前状态」读事件流的客户端,在 verify 停驻上改读最后一只状态帧,或读 `GET /v1/runs/:id` 的 `status`。两形同序的修正不在本版。
|
|
291
|
+
② **第 7 条「同 `Idempotency-Key` 重放答同一份」**:`POST /v1/tasks` 同键重放与首答的 `taskId` / `sessionId` / `status` 三键同值,外层形不同 —— 首答是平铺的结果体加 `status`,重放是 `{ taskId, sessionId, status, result: {…} }`
|
|
292
|
+
(首答的 `result` 是串、重放的 `result` 是对象)。同步提交的重放外层形不同在上一版已有,不是第 7 条引入;按首答形解析重放的调用方只读那三键(两形同值)。重放回首答同一形的修正不在本版。
|
|
293
|
+
③ **第 12 条 ①(`adb`)与 ③(`host`)「对不上 ⇒ 首连拒 / 那只环境拒起(命令面 `shell_unavailable` …)」**:主张与环境里的 `$HOME` 对不上时,不带路径的命令答 `shell_unavailable`(拒句点名主张与实测值);
|
|
294
|
+
带路径的命令(读写相对路径、`cat ~/…`)先被读边界拒,答 `read_unestablished`,句子不点名家目录;两形都零命令执行。家目录对不上的部署上看到 `read_unestablished`,先按第 12 条 ① / ③ 核声明与 `$HOME`。首拒统一点名根因的修正不在本版。
|
|
295
|
+
④ **第 13 条 ②「operator 抹除点名个人层 —— 上一版 200(落在部署的店上,对个人层是空擦)」**:以 `select.ids` + `expectedScopes: ["<个人层键>"]` 构造的那一形,上一版(7.139.0)实答 `400 config.memory_erasure_scope`,不是 200 空擦;
|
|
296
|
+
7.140.0 起答 `409 memory.erasure_store_unjudged`,不变。其它点名个人层的构造的上一版答法本条不改述(未逐形复核)。
|
|
297
|
+
⑤ **第 8 条补一句**:`run-local`(一次性 CLI)设 `READ_DENY_FLOOR_REQUIRED=true` 时,除了在准备期拒(退出码 1、零模型调用),它自己的 stderr 上同样出那一行 warn `read_deny_floor_required_unkept`(与 HTTP 服务起服同一行)。
|
|
298
|
+
**谁受伤**:无(文字)。**出路**:按本条读。**回滚**:不适用(文字)。
|
|
299
|
+
|
|
10
300
|
## 7.140.0 —— 依赖方向门(测试门;零 wire、零行为) · `CONFIG_PROVIDER=local`:`config.d` 里读不出的文档成被拒文档,候选整拒、拒句点名文件与形(行为变更;运维面) · 脱敏:PEM 私钥 armor 体里夹着由别的凭据装着的假收尾 ⇒ 整块照遮(安全) · SQL 方言字 `"tidb"` → `"mysql"`(嵌入方类型面 BREAKING;起服日志的后端字同换) · 🔴 记忆同步:同步层是个人平面键的 file 部署,这一层改同步会话读写的那只店,旧游标升级后被拒一次(删游标,不改绑) · 记忆同步层引擎读不出 ⇒ 起服拒(行为收紧) · `verify:true` 任务停在审批 / 计划审阅门上:run 行停驻、会话保持占用(行为变更) · 新旋钮 `READ_DENY_FLOOR_REQUIRED`(缺省 false;安全) · `REMOTE_EXEC=host` 不再被代声明「记忆能持久」(行为面) · `verify:true` 任务撞资源限停驻(行为变更) · 请求自带的 MCP / A2A 声明写着引擎永远不发的头 ⇒ 新提交 400(行为收紧) · 执行环境的家目录在每只环境开起来时被对证,对不上 ⇒ 那只环境拒起(六条车道;行为收紧;安全) · 记忆诸口答在请求点名的层住的那只店上:两店部署上条目 id / 店级账本的请求带层座 `scope`、落到个人店的抹除 `409 memory.erasure_store_unjudged`(行为变更;wire 加性;嵌入方 `ServiceDeps.sessionMemoryStatus` 改形,BREAKING 类型面) · 订正 7.138.0 节第 23 条 ⑩:扣留次序是先记后判(文字订正) · 契约包 settings-schema 15.2.0 · 引擎 7.60.0
|
|
11
301
|
|
|
12
302
|
1. **依赖方向门(测试门;零 wire、零行为;部署与嵌入方零动作)**:`src/` 读引擎(`@sema-agent/core`)的方式进了一道本仓的测试门 —— 说明符闭集、禁深路径与沿文件系统走引擎安装目录、
|
package/README.md
CHANGED
|
@@ -206,7 +206,7 @@ The server is configured entirely through environment variables. The most import
|
|
|
206
206
|
| `CONFIG_PROVIDER` | unset | Config source: `local` (file-backed `config.d/`, single machine) / `remote` (registry control plane at `SEMA_WEB_ADMIN_URL` — `remote` without that URL refuses to boot). Unset = the center if `SEMA_WEB_ADMIN_URL` is set, else env only. Closed set, matched exactly (7.104.0+): any other value (wrong case, surrounding spaces) refuses to boot; empty = unset |
|
|
207
207
|
| `DEFAULT_SCENARIO` | `code` | Default scenario when the request body names none; must be a scenario this deployment has (boot refuses otherwise) |
|
|
208
208
|
| `SANDBOX_PKG_SOURCE` | `global` | Package sources inside sandboxes: `global` (official upstreams) / `cn` (China mirrors) / `custom` / `none` |
|
|
209
|
-
| `SENSITIVE_WRITE_PATTERNS` | core's recommended set | Sensitive-path write deny list; comma-separated value replaces the set, `off` **or an empty value** disables. Applied unconditionally at the governance layer (independent of client permission mode, lane or settings presence) — including on the `run-local` leg. A value that cannot compile into a guard set (e.g. `/`, a pattern with no path segment) refuses to start |
|
|
209
|
+
| `SENSITIVE_WRITE_PATTERNS` | core's recommended set | Sensitive-path write deny list; comma-separated value replaces the set, `off` **or an empty value** disables. Applied unconditionally at the governance layer (independent of client permission mode, lane or settings presence) — including on the `run-local` leg. Scope: it refuses the **file tools** (Write / Edit / NotebookEdit, by path); a shell command that writes the same path (redirection, `tee`, `cp` …) is not refused by this set — it is an ordinary approval ask, answered like any other shell write (a person, or the classifier under `auto`). A value that cannot compile into a guard set (e.g. `/`, a pattern with no path segment) refuses to start |
|
|
210
210
|
| `WRITE_PROTECTED_EXTRA` | unset (engine default table) | **Adds** rows to core's write-protection table (the literal-name table whose hit demotes a surviving `allow` to `ask` on Write/Edit/NotebookEdit). Comma-separated bare names (a bare name matches ANY path segment; a name containing `/` matches a consecutive segment run) or a JSON array of `"name"` strings / `{name, kind}` rows (`kind`: `basename` \| `segment` \| `segment-run`). The value is composed as `[...WRITE_PROTECTED_DEFAULT_TABLE, …]`, so **no default row can be lost**. Unset = no seat is wired = the engine's default table is in force (this server never copies that table). Form discrimination is by content, not by first character: a value containing any JSON structural character (`[ ] { } "`) is parsed as JSON and **must** be a top-level array (a missing pair of brackets refuses to start instead of being split into junk bare names). An empty value, a malformed entry (glob metacharacter, unknown kind, kind/name mismatch) or setting this together with `WRITE_PROTECTED_TABLE_REPLACE` **refuses to start**. Read faces: `GET /v1/capabilities` → `writeProtection.{armed,rows,replaced}`; `GET /v1/diagnostics/wiring` → `writeProtection.{rows,source,droppedDefaultRows}` (operator-only) |
|
|
211
211
|
| `WRITE_PROTECTED_TABLE_REPLACE` | unset (engine default table) | **Replaces the whole** write-protection table (core's seat is whole-table by contract). JSON array only — deliberately no comma shorthand, because a slipped bare string would swap 51 default rows for one. `[]` = the explicit "no write-protection table at all" posture. Replacing logs one **loud** boot line naming every default row you dropped (`write_protection_table_replaced`; the empty posture logs `write_protection_table_disabled`) — use `WRITE_PROTECTED_EXTRA` when you meant to ADD. Same refuse-to-start conditions as its sibling, plus: both knobs set = two writers on one surface = refuses to start |
|
|
212
212
|
| `MANUAL_MODE_SHELL_GATE` | unset | `always` — the operator floor: keep every `Bash` call under the engine's shape-tier approval question regardless of the client's permission mode, lane or settings (applied at the governance layer). **Unset is not "off"** and `off` is a no-op (the knob only tightens); `classify` was retired in 7.106.0 (core 7.34.0 folds the classifier into the engine's own mode arbitration) and now **refuses to boot** (the boot error names the retirement and the two remaining words; no error code — it is a config parse refusal, not a wire code). The catalog row (`GET /v1/config/catalog`) lists `enumValues: ["always","off"]`, `echoWords: ["always"]`. |
|
package/README.zh-CN.md
CHANGED
|
@@ -175,7 +175,7 @@ curl -s localhost:8090/v1/tasks -H "Authorization: Bearer <SERVICE_AUTH_TOKEN>"
|
|
|
175
175
|
| `CONFIG_PROVIDER` | 未设 | 配置来源:`local`(单机文件 `config.d/`)/ `remote`(`SEMA_WEB_ADMIN_URL` 那只 registry 控制面 —— 写了 `remote` 而没设这个地址拒启)。未设 = 设了 `SEMA_WEB_ADMIN_URL` 即中心,否则纯 env。闭集、逐字比较(7.104.0 起):其余任何值(大小写不同、带首尾空白)拒启;空串 = 未设 |
|
|
176
176
|
| `DEFAULT_SCENARIO` | `code` | 请求体未指定场景时的缺省场景;必须是本部署在册的场景名,否则拒启 |
|
|
177
177
|
| `SANDBOX_PKG_SOURCE` | `global` | 沙箱内装包源:`global`(官方源)/ `cn`(国内镜像)/ `custom` / `none` |
|
|
178
|
-
| `SENSITIVE_WRITE_PATTERNS` | core 推荐集 | 敏感路径写拒集;逗号分隔值为整体替换,`off` **或留空**关闭。在治理层无条件施加(与客户端权限模式/lane/settings 在场性无关),`run-local`
|
|
178
|
+
| `SENSITIVE_WRITE_PATTERNS` | core 推荐集 | 敏感路径写拒集;逗号分隔值为整体替换,`off` **或留空**关闭。在治理层无条件施加(与客户端权限模式/lane/settings 在场性无关),`run-local` 腿同样生效。射程:拒的是**文件工具**(Write / Edit / NotebookEdit,按路径);shell 命令写同一路径(重定向 / `tee` / `cp` …)**不被这个集拒绝**,是一条普通审批问,和别的 shell 写同一条出路(人答;`auto` 下交分类器);编译不出守卫集的值(如 `/`)启动即拒 |
|
|
179
179
|
| `WRITE_PROTECTED_EXTRA` | 未设(引擎缺省表) | 给 core 的**写保护名表**加行(字面名表:命中即把幸存的 `allow` 降级成 `ask`,作用于 Write/Edit/NotebookEdit)。逗号分隔裸名(裸名匹配**任意路径段**,含 `/` 的名匹配连续段)或 JSON 数组(`"name"` 串 / `{name, kind}` 行,`kind`:`basename` \| `segment` \| `segment-run`)。值按 `[...core 缺省表, …]` 组合,**丢不掉任何缺省行**。未设 = 不铸座 = 引擎缺省表在岗(本仓从不复制那张表)。两形按**内容**判而不是猜首字符:值里出现 JSON 结构字符(`[ ] { } "`)即按 JSON 解析,且顶层**必须是数组**(少写一对方括号 ⇒ 拒启,而不是被拆成垃圾裸名静默收下)。空值 / 坏值(通配符、未知 kind、kind 与名字段数矛盾)/ 与 `WRITE_PROTECTED_TABLE_REPLACE` 同时设置 ⇒ **启动即拒**。读面:`GET /v1/capabilities` 的 `writeProtection.{armed,rows,replaced}`;`GET /v1/diagnostics/wiring` 的 `writeProtection.{rows,source,droppedDefaultRows}`(operator-only) |
|
|
180
180
|
| `WRITE_PROTECTED_TABLE_REPLACE` | 未设(引擎缺省表) | **整表替换**写保护名表(core 的座按契约就是整表)。只收 JSON 数组 —— 刻意不给逗号简写:一个手滑的裸串会把 51 行换成 1 行。`[]` = 显式「完全不要这张表」。替换时 boot 期发一条**响亮**日志逐名列出被丢的缺省行(`write_protection_table_replaced`;空表走 `write_protection_table_disabled`)—— 想「加两行」请用 `WRITE_PROTECTED_EXTRA`。拒启条件同姊妹键,外加:两根同写 = 一条语义面两个写者 ⇒ 拒启 |
|
|
181
181
|
| `MODEL_FIRST_BYTE_TIMEOUT_MS` | 未设(core 缺省) | `fetch()` → 响应头的等待,毫秒(7.103.0 起;取代退役的 `MODEL_CONNECT_TIMEOUT_MS`,设了旧键**拒启** —— core 7.33.0 起建连(TCP + TLS)是传输层自己的钟)。未设 = 不传键,core 缺省当家(另加按请求体大小的上传宽限,到点 core 自有一次加宽重试)。`0` = 该段不设引擎钟、传输层的响应头 / 响应体钟也关(TCP + TLS 建连仍归传输层自己的钟)。须为 `[0, 2147483647]` 内整数,其余拒启。配了 `MODEL_GATEWAY_FALLBACK_URLS` 时每条网关路由同样是首窗 + 一次加宽重试之后才切备(server 不铸 core `firstByteRetries`:调用方可按请求关 failover,那一次身后没有备)。failover 拓扑须显式设:未设时接了连接却不回头的主网关要等 core 的首字节 lane(缺省窗 + 加宽重试)走完才切备,预算更短的调用(code-review council 镜头 180 s)在备网关被尝试之前就被取消;这类部署起服时打一条 `failover_first_byte_lane` warn |
|