@sema-agent/server 7.130.0 → 7.132.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 +396 -0
- package/README.md +13 -6
- package/README.zh-CN.md +9 -5
- package/USAGE.md +187 -50
- package/dist/approval-card.d.ts +3 -1
- package/dist/approval-card.js +2 -3
- package/dist/audit.d.ts +7 -10
- package/dist/audit.js +4 -1
- package/dist/auth-bridge.d.ts +4 -0
- package/dist/auth-bridge.js +10 -11
- package/dist/bench/s1/live-deps.js +2 -0
- package/dist/boot/deployment-mods.d.ts +31 -0
- package/dist/boot/deployment-mods.js +26 -0
- package/dist/boot/execution-env.d.ts +1 -1
- package/dist/boot/execution-env.js +19 -6
- package/dist/boot/memory-boundary.d.ts +2 -2
- package/dist/boot/read-deny-anchor-audit.d.ts +17 -0
- package/dist/boot/read-deny-anchor-audit.js +36 -0
- package/dist/boot/resolve-spec.d.ts +1 -5
- package/dist/boot/resolve-spec.js +56 -61
- package/dist/boot/runner-deps.d.ts +19 -8
- package/dist/boot/runner-deps.js +14 -2
- package/dist/boot/session-faces.d.ts +1 -7
- package/dist/boot/stage-02-web-admin-pull.js +9 -1
- 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 +4 -4
- package/dist/boot/stage-05-execution-env.js +7 -10
- package/dist/boot/stage-06-runners.d.ts +2 -2
- package/dist/boot/stage-06-runners.js +5 -4
- package/dist/boot/stage-07-capability-layer.d.ts +2 -2
- package/dist/boot/stage-07-capability-layer.js +3 -3
- package/dist/boot/stage-08-reapers.d.ts +2 -2
- package/dist/boot/stage-09-leader.d.ts +3 -9
- package/dist/boot/stage-10-http-server.d.ts +3 -9
- package/dist/boot/stage-10-http-server.js +12 -10
- package/dist/boot/stores.d.ts +1 -1
- package/dist/boot/stores.js +5 -6
- package/dist/boot/web-admin.d.ts +0 -3
- package/dist/boot/web-admin.js +35 -35
- package/dist/brain.js +17 -22
- package/dist/budget.js +5 -4
- package/dist/caller-text-echo.d.ts +20 -0
- package/dist/caller-text-echo.js +24 -0
- package/dist/capabilities/brand-identity.d.ts +26 -0
- package/dist/capabilities/brand-identity.js +27 -0
- package/dist/capabilities/builtin-tools.js +2 -1
- package/dist/capabilities/center-plugins.js +1 -1
- package/dist/capabilities/center-prompts.d.ts +32 -59
- package/dist/capabilities/center-prompts.js +18 -32
- package/dist/capabilities/composite-members.d.ts +1 -0
- package/dist/capabilities/composite-members.js +1 -0
- package/dist/capabilities/engine-capabilities.js +2 -1
- package/dist/capabilities/hands-lane.d.ts +9 -6
- package/dist/capabilities/hands-lane.js +3 -3
- package/dist/capabilities/host-tool-names.d.ts +17 -0
- package/dist/capabilities/host-tool-names.js +15 -0
- package/dist/capabilities/mcp-probe.d.ts +14 -1
- package/dist/capabilities/mcp-probe.js +22 -133
- package/dist/capabilities/repo-tools.js +4 -3
- package/dist/capabilities/scenarios.d.ts +42 -47
- package/dist/capabilities/scenarios.js +19 -35
- package/dist/capabilities/select-environment-tool.js +2 -1
- package/dist/capabilities/send-user-file-tool.d.ts +0 -1
- package/dist/capabilities/send-user-file-tool.js +2 -2
- package/dist/capabilities/skills.d.ts +19 -4
- package/dist/capabilities/skills.js +30 -10
- package/dist/capabilities/tool-defer.js +2 -1
- package/dist/config-catalog.js +22 -11
- package/dist/config-invariants.js +2 -2
- package/dist/config-lkg.d.ts +9 -9
- package/dist/config-lkg.js +20 -4
- package/dist/config-provider.d.ts +3 -1
- package/dist/config-provider.js +14 -6
- package/dist/config-types.d.ts +13 -9
- package/dist/config.d.ts +2 -2
- package/dist/config.js +34 -20
- package/dist/device-ws-protocol.d.ts +1 -1
- package/dist/device-ws-protocol.js +1 -0
- package/dist/elicitation.d.ts +7 -0
- package/dist/elicitation.js +20 -5
- package/dist/env-name-allowlist-knobs.d.ts +12 -2
- package/dist/env-name-allowlist-knobs.js +5 -4
- package/dist/exec-bounds.d.ts +15 -3
- package/dist/exec-bounds.js +4 -0
- package/dist/execution-lane-caps.d.ts +9 -2
- package/dist/execution-lane-caps.js +11 -0
- package/dist/hooks/classic-stations.d.ts +86 -0
- package/dist/hooks/classic-stations.js +27 -0
- package/dist/hooks/hook-llm.d.ts +8 -5
- package/dist/hooks/hook-llm.js +80 -37
- package/dist/hooks/hook-runner.d.ts +273 -75
- package/dist/hooks/hook-runner.js +293 -317
- package/dist/http/admission.d.ts +8 -2
- package/dist/http/admission.js +103 -59
- package/dist/http/approval-sweeps.js +59 -18
- package/dist/http/checkpoint-ctx.d.ts +36 -18
- package/dist/http/checkpoint-ctx.js +14 -10
- package/dist/http/claimed-run.d.ts +13 -0
- package/dist/http/claimed-run.js +15 -0
- package/dist/http/device-placement.js +5 -10
- package/dist/http/dispatch.d.ts +0 -4
- package/dist/http/dispatch.js +6 -10
- package/dist/http/durable-run-leg.d.ts +2 -1
- package/dist/http/durable-run-leg.js +5 -3
- package/dist/http/health-self-report.d.ts +7 -5
- package/dist/http/health-self-report.js +4 -18
- package/dist/http/principal-gate.d.ts +23 -6
- package/dist/http/principal-gate.js +24 -5
- package/dist/http/refusal-body.d.ts +21 -0
- package/dist/http/refusal-body.js +4 -0
- package/dist/http/request-guards.d.ts +27 -0
- package/dist/http/request-guards.js +24 -3
- package/dist/http/resume-legs.d.ts +25 -0
- package/dist/http/resume-legs.js +48 -26
- package/dist/http/routes/approvals-assistant.js +1 -1
- package/dist/http/routes/capabilities.js +7 -17
- package/dist/http/routes/diagnostics.js +1 -1
- package/dist/http/routes/rules.js +2 -2
- package/dist/http/routes/runs.js +13 -17
- package/dist/http/routes/session-sync.js +4 -2
- package/dist/http/routes/sessions.js +23 -11
- package/dist/http/routes/shared-memory.js +2 -13
- package/dist/http/routes/side-query.js +2 -3
- package/dist/http/routes/tasks.js +34 -19
- package/dist/http/scenario-read-face.d.ts +14 -0
- package/dist/http/scenario-read-face.js +5 -0
- package/dist/http/send.d.ts +13 -1
- package/dist/http/send.js +12 -1
- package/dist/http/server.d.ts +37 -23
- package/dist/http/server.js +30 -4
- package/dist/http/stored-body-replay.d.ts +10 -3
- package/dist/http/stored-body-replay.js +27 -6
- package/dist/http/submit-ctx.d.ts +25 -0
- package/dist/http/submit-ctx.js +39 -0
- package/dist/http/wire-types.d.ts +18 -5
- package/dist/index.d.ts +3 -2
- package/dist/index.js +3 -2
- package/dist/lane-home-probe.d.ts +43 -0
- package/dist/lane-home-probe.js +35 -0
- package/dist/limit-refusal.d.ts +47 -0
- package/dist/limit-refusal.js +12 -0
- package/dist/main.js +1 -1
- package/dist/mcp-assertion-header.d.ts +3 -11
- package/dist/mcp-assertion-header.js +3 -9
- package/dist/mcp-tool-faces.d.ts +5 -0
- package/dist/mcp-tool-faces.js +5 -1
- package/dist/memory-scope.d.ts +1 -1
- package/dist/model-entry-refusal.d.ts +1 -7
- package/dist/model-provider.d.ts +39 -12
- package/dist/model-provider.js +19 -2
- package/dist/model-route-endpoint.d.ts +52 -12
- package/dist/model-route-endpoint.js +48 -26
- package/dist/model-route-gap.d.ts +5 -4
- package/dist/model-route-gap.js +1 -1
- package/dist/model-select.d.ts +58 -0
- package/dist/model-select.js +31 -0
- package/dist/namespaced-rule-name.d.ts +7 -4
- package/dist/namespaced-rule-name.js +4 -3
- package/dist/observability/cost-taxonomy.d.ts +7 -7
- package/dist/observability/fail-open.d.ts +53 -12
- package/dist/observability/fail-open.js +47 -7
- package/dist/observability/metrics.js +3 -1
- package/dist/observability/prompt-manifest.d.ts +47 -82
- package/dist/observability/prompt-manifest.js +119 -17
- package/dist/observability/run-terminal.js +14 -6
- package/dist/observability/secret-env-scrub.d.ts +13 -1
- package/dist/observability/secret-env-scrub.js +13 -1
- package/dist/observability/tool-trace.d.ts +16 -21
- package/dist/observability/tool-trace.js +51 -42
- package/dist/per-task-image.d.ts +7 -1
- package/dist/per-task-image.js +3 -3
- package/dist/plain-string-record.d.ts +25 -0
- package/dist/plain-string-record.js +32 -0
- package/dist/plugins/blob-backend.d.ts +68 -13
- package/dist/plugins/blob-backend.js +53 -10
- package/dist/plugins/checkpoint-store-sql.d.ts +14 -4
- package/dist/plugins/checkpoint-store-sql.js +39 -26
- package/dist/plugins/k8s-bg-scripts.d.ts +11 -0
- package/dist/plugins/k8s-bg-scripts.js +22 -0
- package/dist/plugins/local-checkpoint-store.js +5 -2
- package/dist/plugins/local-session-store.js +3 -3
- package/dist/plugins/one-time-migrations.d.ts +147 -91
- package/dist/plugins/one-time-migrations.js +372 -208
- package/dist/plugins/permission-rule-store-sql.d.ts +13 -7
- package/dist/plugins/permission-rule-store-sql.js +4 -18
- package/dist/plugins/pg-session-storage.d.ts +4 -5
- package/dist/plugins/pg-session-storage.js +7 -17
- package/dist/plugins/remote-env-adb.d.ts +6 -0
- package/dist/plugins/remote-env-adb.js +9 -4
- package/dist/plugins/remote-env-device.js +3 -0
- package/dist/plugins/remote-env-e2b.d.ts +1 -1
- package/dist/plugins/remote-env-e2b.js +21 -9
- package/dist/plugins/remote-env-host.d.ts +9 -9
- package/dist/plugins/remote-env-host.js +10 -32
- package/dist/plugins/remote-env-k8s.d.ts +95 -26
- package/dist/plugins/remote-env-k8s.js +265 -90
- package/dist/plugins/remote-env-local-docker.d.ts +20 -1
- package/dist/plugins/remote-env-local-docker.js +77 -9
- package/dist/plugins/remote-env-ssh.d.ts +15 -0
- package/dist/plugins/remote-env-ssh.js +109 -3
- package/dist/plugins/remote-shell.d.ts +0 -1
- package/dist/plugins/remote-shell.js +1 -2
- package/dist/plugins/retention-store-sql.js +6 -2
- package/dist/plugins/schema-consistency.d.ts +54 -0
- package/dist/plugins/schema-consistency.js +52 -0
- package/dist/plugins/session-epoch-anchor.d.ts +13 -0
- package/dist/plugins/session-epoch-anchor.js +23 -0
- package/dist/plugins/shared-memory-store-sql.d.ts +9 -3
- package/dist/plugins/shared-memory-store-sql.js +5 -16
- package/dist/plugins/sql-driver.d.ts +141 -0
- package/dist/plugins/sql-driver.js +115 -1
- package/dist/plugins/sql-errors.d.ts +41 -0
- package/dist/plugins/sql-errors.js +36 -0
- package/dist/plugins/store-backend.js +2 -1
- package/dist/plugins/tidb-session-storage.d.ts +7 -11
- package/dist/plugins/tidb-session-storage.js +6 -16
- package/dist/plugins/tidb-session-store.js +1 -1
- package/dist/prompts-domain-validate.d.ts +17 -61
- package/dist/prompts-domain-validate.js +9 -119
- package/dist/question.d.ts +18 -9
- package/dist/question.js +21 -13
- package/dist/request-key-closure.d.ts +4 -4
- package/dist/request-key-closure.js +18 -13
- package/dist/rule-entry-list.d.ts +134 -24
- package/dist/rule-entry-list.js +162 -30
- package/dist/run-local.d.ts +3 -3
- package/dist/run-local.js +26 -25
- package/dist/runs.d.ts +48 -2
- package/dist/runs.js +61 -2
- package/dist/server-secret-env.d.ts +44 -18
- package/dist/server-secret-env.js +49 -8
- package/dist/session-incarnation.d.ts +15 -5
- package/dist/session-incarnation.js +16 -9
- package/dist/session-titler.js +12 -2
- package/dist/spec-fields.d.ts +34 -18
- package/dist/spec-fields.js +46 -53
- package/dist/sql-engine-posture.d.ts +29 -4
- package/dist/sql-engine-posture.js +36 -1
- package/dist/stored-request-hooks-m20.d.ts +23 -0
- package/dist/stored-request-hooks-m20.js +124 -0
- package/dist/stored-request-tool-axes-m19.d.ts +20 -5
- package/dist/stored-request-tool-axes-m19.js +30 -2
- package/dist/task-a2a.d.ts +9 -1
- package/dist/task-a2a.js +73 -47
- package/dist/task-mcp.d.ts +54 -102
- package/dist/task-mcp.js +194 -92
- package/dist/task-settings.d.ts +47 -25
- package/dist/task-settings.js +46 -61
- package/dist/text-bidi.d.ts +3 -46
- package/dist/text-bidi.js +3 -3
- package/dist/tool-approval.d.ts +1 -1
- package/dist/trace/core-keyset-guard.d.ts +24 -4
- package/dist/trace/engine-notice-wire.d.ts +11 -3
- package/dist/trace/engine-notice-wire.js +8 -1
- package/dist/trace/ledger-events.d.ts +3 -1
- package/dist/trace/ledger-sink.d.ts +29 -0
- package/dist/trace/ledger-sink.js +15 -1
- package/dist/trace/model-segment.js +1 -1
- package/dist/trace/project.d.ts +25 -6
- package/dist/trace/project.js +68 -22
- package/dist/trace/wire-projection-faces.d.ts +80 -2
- package/dist/trace/wire-projection-faces.js +23 -1
- package/dist/user-authored-text.d.ts +7 -0
- package/dist/user-authored-text.js +3 -0
- package/dist/web-admin-client/apply-effective.js +10 -5
- package/dist/web-admin-client/candidate-gate.d.ts +6 -6
- package/dist/web-admin-client/candidate-gate.js +3 -3
- package/dist/web-admin-client/http-client.js +0 -6
- package/dist/web-admin-client/read-warnings.d.ts +13 -0
- package/dist/web-admin-client/read-warnings.js +10 -0
- package/dist/web-admin-client/skills-mcp.d.ts +3 -0
- package/dist/web-admin-client/skills-mcp.js +9 -6
- package/dist/web-admin-client/types.d.ts +3 -4
- package/dist/workspace-cache.d.ts +35 -0
- package/dist/workspace-cache.js +36 -0
- package/dist/workspace-space.d.ts +3 -2
- package/dist/workspace-space.js +2 -0
- package/docs/DEVICE-EXECUTOR-PROTOCOL.md +8 -1
- package/package.json +4 -4
- package/scripts/drain-check-local.mjs +37 -3
- package/scripts/drain-check.mysql.sql +30 -2
- package/scripts/drain-check.pg.sql +29 -2
- package/dist/capabilities/memory-notice.d.ts +0 -138
- package/dist/capabilities/memory-notice.js +0 -64
- package/dist/capabilities/prompt.d.ts +0 -17
- package/dist/capabilities/prompt.js +0 -6
- package/dist/mcp-content-origin.d.ts +0 -34
- package/dist/mcp-content-origin.js +0 -10
- package/dist/tool-axis-words.d.ts +0 -27
- package/dist/tool-axis-words.js +0 -9
- package/dist/wire-name-bound.d.ts +0 -14
- package/dist/wire-name-bound.js +0 -13
|
@@ -11,9 +11,8 @@
|
|
|
11
11
|
* 占位日期)—— 不计到期;抬 `package.json` 到那一版的发布准备提交把两格回填成发布日 / +30 天。到期门同时是回填门:`package.json` 版本
|
|
12
12
|
* **≥** 某条未发布形的 `introducedIn` 而两格仍是 `null` ⇒ 红(发布准备提交就是回填时刻,忘了就当场红;版本更低 = 还在开发,不红)。
|
|
13
13
|
* 最后一条删掉时,整个文件连同 `StoreBackend.runOneTimeMigrations()`(npm 公面上的接口成员)、`NO_SQL_MIGRATIONS`、
|
|
14
|
-
* `logOneTimeMigrations` / `runAndLogOneTimeMigrations`、三只后端与两只测试夹具上的实现、`boot/stores.ts` 的调用点一起删 ——
|
|
15
|
-
* (
|
|
16
|
-
* 删最后一条的车要把它搬进启动期对账(`schema-consistency.ts` 一族)并保住它先于一切建表与改写的位置(现位:`store-backend.ts` 里 SQL 两后端的 `ensureSchema()` 自身,探针先于它的第一条 CREATE),不要随文件删掉。
|
|
14
|
+
* `logOneTimeMigrations` / `runAndLogOneTimeMigrations`、三只后端与两只测试夹具上的实现、`boot/stores.ts` 的调用点一起删 —— 零例外:本文件里只有带窗的迁移与它们自己的
|
|
15
|
+
* 帮手(两只在场探针、锁腿、方言适配器);没有窗的东西(跳版升级的库的拒启臂)住在起服对账一族(`schema-consistency.ts`),不在这里。
|
|
17
16
|
* 其余文件一律只写「窗口见本文件登记表」,不各写一个日期或版本 —— S-590 之前本文件头写死了一个删除版本号(7.75.0),
|
|
18
17
|
* 连同 11 个文件里的复述共 23 行;那一版过去了 28 个 minor 也没删,7.93.5 反倒往本文件里又加了 M4。
|
|
19
18
|
*
|
|
@@ -25,21 +24,10 @@
|
|
|
25
24
|
* ⇒ 换成本段:**升一次级把存量字节改完,兼容臂当场删干净**。代价是每一条在它的窗内每次启动都要跑一遍(第二次起全是
|
|
26
25
|
* 零命中的空转);收益是窗关之后可以把那一条连同它的 SQL 一起删,而读腿从引入那一版起就只有**一种**读法。
|
|
27
26
|
*
|
|
28
|
-
* ## 已退役的 M1–M3
|
|
27
|
+
* ## 已退役的 M1–M3
|
|
29
28
|
* 退役的整树快照索引表(M1)、退役的单座 steering 列(M2)、被上游改了名的闭集词 `unresolvable` → `ancestor_marked`(M3)三条的改写、计数与读数
|
|
30
|
-
*
|
|
31
|
-
*
|
|
32
|
-
* M3 当年的「本版是否已在这只库上跑过」标记本来就是这两件退役 schema 的在场(7.74.0 之前的每一版 DDL 都建表与列,7.74.0 起都不再建;能写下旧拼法的
|
|
33
|
-
* 7.64.0–7.71.0 恒带两者),所以**旧拼法不另扫**:一条对账本 `task_event` 的无索引整表扫正是当年被判不许成为每次启动固定开销的东西
|
|
34
|
-
* (账本是全站最大的表,PG 池级 `statement_timeout` 会把它切成拒启、每次启动重演)。两件任一在场 ⇒ 这只库没有经过带迁移的版本 ⇒ 旧拼法的改写同样没跑过 ⇒ 拒句一并点名。
|
|
35
|
-
* 出路:先在 7.125.x(最后一个带这三条迁移的版)上起服一次让它们跑完,再升。
|
|
36
|
-
* **判据一只、读一处**:判据只有 {@link assertRetiredSchemaAbsent} 一只,唯一的读处是**探针口**({@link assertRetiredSchemaAbsentOnPool}):库一连上就探,先于 `ensureSchema()`
|
|
37
|
-
* 发出的任何一条 CREATE —— 一次会拒的起服不许先在库里建出几十张本版新表(`task_run` 还带着新列),否则拒句里「没动过库」就是假话,而按拒句指路去 7.125.x 起服的人会撞上
|
|
38
|
-
* 「库比 7.125.x 新」的第二道拒。探针与建表的先后只写在 `store-backend.ts` 里 SQL 两后端的 `ensureSchema()` 自身(装配处包一次)。迁移段入口({@link runSqlOneTimeMigrations})**不再问**这一问:
|
|
39
|
-
* 它只在 `ensureSchema()` 之后被起服序列调用,一个事实不在两处各读一遍;嵌入方走公开序列 `createStoreBackend()` → `ensureSchema()` → `runOneTimeMigrations()` 即得到这一问,零动作。
|
|
40
|
-
* 残余(如实):运维在第一次起带迁移的版本之前就把两件退役 schema 都手工删掉的库,残留的旧拼法由门记录的读腿接住 —— 7.129.0 起(core 7.51.0 #1731)
|
|
41
|
-
* 那只读腿按 core 的档案读法读,`unresolvable` 是 core 退役词注册表里的词 ⇒ 记录原词原样读回、不改写(`trace/project.ts` `screenedGate`);local 文件车道
|
|
42
|
-
* 没有表与列,没有这一问的探针 —— 引擎 File 店里已决 checkpoint 的记录按契约物理不可变,本仓没有合法缝改写它们(下游不改上游盘上格式),同由那条读腿接住。
|
|
29
|
+
* 窗关后已全部删码,登记行一并删。跳过了它们直接升的库由起服对账一族的拒启臂接住(`schema-consistency.ts` 头注「第二道对账」一节:两件退役 schema
|
|
30
|
+
* 任一在场 ⇒ 拒启、点名出路;先于一切建表)—— 那一道没有窗,所以不在本文件里。本段入口({@link runSqlOneTimeMigrations})不问这一问。
|
|
43
31
|
*
|
|
44
32
|
* ## 窗内的迁移(逐条的失败方向刻意不同)
|
|
45
33
|
* · **M4 审计明细里的 JSON 文本 `null`** —— S-550 把 `device_audit.detail` 的读回收进唯一属主并判形之后,
|
|
@@ -134,19 +122,20 @@
|
|
|
134
122
|
* `readSessionRulesShape` 读成它自己的文法,`compileSessionRuleBucket` 在那种文法下编译 `toolAllow`,归 `earlier_grammar` 的条目(文法 0 里拼写不是它所指名字的条目
|
|
135
123
|
* —— `Bash(rm:*)` / `Edit(src/**)` / `Bash(*)`:什么都不放行,文法 1 里是一条放行规则)删掉,其余原样,盖 `grammar: SESSION_RULES_GRAMMAR` —— 文法 0 与 1 在引擎里只差
|
|
136
124
|
* 这一条子句,所以改写后的行是引擎对原行读法的逐调用同义重述(名单保持在场:删到空 = 在场的空名单,什么都不放行)。**每一行**都改写(只盖戳的也写):改写之后
|
|
137
|
-
*
|
|
138
|
-
* (
|
|
125
|
+
* 部署里零无戳行,除下一条留下的行(引擎 7.52.0 #1790 起文法 0 里的 `*` 也是 `earlier_grammar` 惰性条目、只作废它自己 —— 与别的读不出的 allow 条目同一条判:删、盖戳;7.129.0–7.131.x 引擎把带 `*` 的名单整张读成作废,本步对那种行曾不改写、只点名,那一臂随引擎修正退役)。
|
|
126
|
+
* **盖戳前先问引擎读者**(S-1691,引擎 7.52.0 [ref]):行的 `toolDeny` 里有 `unreadableDenyEntries` 答的条目(引擎在这一行的文法里读成「不是任何一条规则」:空串、`-deploy`、非 ASCII 名、`(` 前带不可见空白 ……
|
|
127
|
+
* 7.129.0–7.131.x 的写口收下过)⇒ 引擎对这一行的**每一次工具调用都拒**(读成更少的规则是 fail-open,引擎不这么读),并按行自带的旧文法通告(`config.session_rules_earlier_grammar`,只对戳早于当前文法的行发)。
|
|
128
|
+
* 盖成当前文法戳什么都解不开,只让那条通告消失 ⇒ **整行不改写、不盖戳、不删任何条目**(同行 toolAllow 里该删的条目也不动 —— 不盖戳的行不做半截改写),收据点名(键 / 会话 / 条目 + 引擎读者对每条的原因词),
|
|
129
|
+
* 一行一条 warn `session_rule_row_unreadable_deny`;出路是 operator 按新文法改写那一行或删会话(MIGRATION 写了)。**其余 `toolDeny` 一个字节不动、不点名**:引擎读得出的 deny 条目在每个文法下读法相同
|
|
130
|
+
* (含只是没有对应工具的名字,如 `BASH`:那是引擎名审计的事,不是读不出)。本仓只问、不判 —— 读者只有引擎的 `unreadableDenyEntries`,不复刻它的条目读法。
|
|
139
131
|
* 本仓零自铸文法判断、零 `readRuleEntry` 直调(修前的 `oldGrammarReadingOf` 按条目种类自铸三分类,是第二只文法读者)。按原文 CAS 回写(MySQL 协议两边
|
|
140
132
|
* `CAST(… AS BINARY)`),`rev` / `gen` 不动;有被删条目的行一条 warn `session_rule_row_old_grammar_entries`(键哈希 / 会话 / 被删的条目,过脱敏器)。
|
|
141
133
|
* 这一拍没有别的写者(旧副本找不到 `rules`,本版副本在起服锁上等)。
|
|
142
134
|
* **终名只在每一行都判完之后出现**:`rules` 先改成进行中的名 `rule_entries_old_grammar`(旧副本从此找不到列),判读在这个名下跑(幂等:已改写的行再判零动作),
|
|
143
135
|
* 判完才改成 `rule_entries`。于是判读没走完 —— 抛了、或进程被杀 —— 列都停在进行中的名,下一次起服从它续判(已带戳的行引擎按它的戳读:零 `earlier_grammar`、
|
|
144
136
|
* 已有戳 ⇒ 零动作);没有「改回」臂(一条自己也可能失败的补偿),也没有「改名即终名」的窄窗(被杀后下一次起服把没判的行当新文法行读)。
|
|
145
|
-
* **收据随提交落,不随成功落**:一行改写提交(CAS 命中)
|
|
146
|
-
*
|
|
147
|
-
* ({@link runAndLogOneTimeMigrations})。理由:被删的条目没有第二次被报出来的机会 —— 下一次起服续判时那一行已是新形、没有可删的条目,零命中。只盖戳的改写不记:
|
|
148
|
-
* 戳不丢任何信息,重来再判零动作。
|
|
149
|
-
* 如实的残余:改写与那一行日志之间进程被杀、或一条改写的确认在连接上丢了 —— 收据没有耐久载体(不为一条短命的迁移另建迁移账表,见 M4 一节的同一条论证)。
|
|
137
|
+
* **收据随提交落,不随成功落**:一行改写提交(CAS 命中)的那一刻,它被删的条目就记进本次起服的那一只收据账({@link MigrationReceipts},每一条迁移同一只,见「收据账」一节);
|
|
138
|
+
* 只盖戳的改写不记:戳不丢任何信息,重来再判零动作。
|
|
150
139
|
* ③ **存量命令桶只点名、不改写**:新文法写不出旧命令桶的拒 —— 旧桶(引擎 7.50.x 粗命令名策略,`defaultAction: "deny"`)对读不成「一条命令名」的命令行
|
|
151
140
|
* 一律拒(`/bin/rm …`、管道、`&&`),`Bash(rm:*)` 只按命令名判、放过 `/bin/rm`。任何改写都是放宽(`commandDeny`)或改变放行面(`commandAllow`),
|
|
152
141
|
* 不由本仓替人做。⇒ 退役桶**一个字节不动**,读回照旧 `corrupt`(引擎形读法点名那只桶;与引擎文件店对同一形同判 —— 每一种店一个结局),
|
|
@@ -179,8 +168,45 @@
|
|
|
179
168
|
* 窗 = 发布日 + 30 天 = 停驻行的终局兜底窗缺省(`APPROVAL_TERMINAL_BACKSTOP_MS` 缺省 30 天)—— 与 M7 / M12 同一条论证。没有起服读数(它不写库)。
|
|
180
169
|
* 窗按**发布日**算、停驻行的期限按**停驻时刻**算 ⇒ 三类部署会有升级前停驻的行活过窗、窗关后回到「整条不进」:发布后才升级的部署(发布日到它升级那天之间
|
|
181
170
|
* 停驻的行)、把 `APPROVAL_TERMINAL_BACKSTOP_MS` 调长的部署、滚动升级里仍跑 7.129.x 的副本在窗内新写的行。与 M7 / M18 一样如实登记,不为它们加长窗。
|
|
171
|
+
* **A2A 一面**(core 7.53.0 #1835 提货批,同一只重读座、同一个窗,不另立迁移号):请求体 `a2aPeers[].toolAxes` 的判官也换成了引擎的 `readToolAxes`,7.131.x 的 A2A 读者
|
|
172
|
+
* 对每只 skill 的记录只挑三个轴、多余成员静默忽略 ⇒ 续跑重放腿同一只重读座按 **7.131.x 的 A2A 读法**重读一次(重读座按面分读者:两面升级前的读法不同 ——
|
|
173
|
+
* 7.131.x 的 A2A 读者对已知轴写坏是整条丢对端,重读照旧整条丢,不把 7.131.x 当时没挂上的对端救活),真挂上的对端一行 `a2a_tool_axes_read_as_before_upgrade`。窗仍按 7.130.0 的发布日算 ——
|
|
174
|
+
* 7.131.x 停驻、窗关(2026-11-15)之后才续跑的 A2A 行回到「整条不进」,与上一句三类部署同一处如实登记。
|
|
182
175
|
* **它是上游字段标准的限时例外**:引擎对 `toolAxes` 的标准是「坏键不丢、坏词不默认」(core `mcp-server-spec.d.ts`),窗内这一臂恰恰剔坏留好 ——
|
|
183
176
|
* 依据是持久数据律(存量数据不能「变红」,只许一次性迁移、窗关删码),只对升级前已经按这种读法跑过的存量体,且对运维响亮。新提交与部署腿不受它影响。
|
|
177
|
+
* · **M20 续跑重放腿上的存量 `settings.hooks`**(7.131.0)—— hooks 配置的唯一读者是契约包的 `classifyHooksConfig`(经 `parseHooksConfig`);升级前的读者(12.x zod 面)对两形照收:
|
|
178
|
+
* 条目 / 匹配器上**契约不认识的字段里藏着守卫迹象**(未知字段被剥掉,同份里真在拦的 `PreToolUse` 钩子照拦)与 JSON 写出的 **`__proto__` 事件键**(被跳过)。现读者对这两形整份拒,
|
|
179
|
+
* 续跑重放腿重放的是升级前存下的体 ⇒ 停驻任务续跑后整份 hooks 不采纳、守卫不再拦。与 M19 同形:不改写存下的字节,是一只**窗内才生效的行为臂** —— 窗开着时(运行期读本表 M20 行的
|
|
180
|
+
* `removableAfter`,见 {@link migrationWindowOpen}),**只在续跑重放腿**、**只在会采纳 hooks 的单用户车道**、**只对读者拒因全部属这两形**的存体:把读者点名的那一块(条目 / 匹配器)里按类型确属未知的键
|
|
181
|
+
* 一次全剥(12.x 读者对一个条目本来就是剥掉全部未知字段、保留其余),剩下的文档**重新过同一只读者**,过了就采纳;整次重读恰一行运维 warn `hooks_read_as_before_upgrade`(点名 sessionId 与被剥的坐标)。
|
|
182
|
+
* **不复制旧读者**:`stored-request-hooks-m20.ts` 不判值形、不判整份是否合法(那是读者的答案),只做「读者点名了哪些块、这一块里哪些键按它的类型确属未知、整块剥掉再问一次,剥到读者受理为止」;
|
|
183
|
+
* 「确属未知」按该条目自己的 `type` 取契约字段名表(不用各型字段的并集,表由契约类型面穷举)。拒因里混进别的(真坏的守卫条目、点名了本型契约字段的拒因 …)⇒ 不迁移,整份照拒。
|
|
184
|
+
* 窗关之后 ⇒ 续跑整份不采纳,fail-open 登记 `server.hooks.resume-reader-refused` 照打(可见);fresh 腿不受影响(受理面照 400)。没有起服读数(它不写库)。
|
|
185
|
+
* 窗 = 发布日 + 30 天 = 停驻行的终局兜底窗缺省 —— 与 M19 同一条论证与同三类逃出窗的部署(发布后才升级的、调长了 `APPROVAL_TERMINAL_BACKSTOP_MS` 的、滚动升级里旧副本在窗内新写的行),如实登记。
|
|
186
|
+
* · **M21 停驻行补齐引擎今天在铸点写的两格**(7.132.0)—— 两件,同一次 pending 候选扫描、同一个窗:
|
|
187
|
+
* ① **问答卡词**:引擎 7.49.0(本仓 7.126.0 提货)起,问答工具的审批卡在门上带卡词 `gate.approvalCard: "question"`(引擎的规则:调用名是问答工具 ⇒ `question`);
|
|
188
|
+
* 之前停驻、升级时还挂着的问答行门上没有这个词。本仓「这一行是不是一问」有两个读者:到期分法与队列行读卡(core `facetOf`:无卡 ⇒ 不是一问 ⇒ SLA 拒扫、
|
|
189
|
+
* 显示通用卡),决断口读待决动作的工具名(是一问 ⇒ `approve` 必须带 `answer`)—— 同一行两处去向不一致。⇒ **一次性改写**:审批门型 ∧ 门上没有 `approvalCard`
|
|
190
|
+
* 这个键 ∧ 待决动作是问答工具的审批的 pending 行,门上补 `approvalCard: "question"`(就是引擎今天在铸点会写的那个词),其余字节原样;不留「无卡按工具名
|
|
191
|
+
* 回推」的长住读臂(那正是 core 拒绝的第二个判官)。**引擎行摘要封过的行一个字节不改写**(带 `requirementsDigest` 的 v10 行:`gate.approvalCard` 是摘要
|
|
192
|
+
* 覆盖的成员,改了 = 续跑判 `damaged`;7.49.0 起的引擎同版铸卡与摘要,封过的问答行按构造都已带卡)—— 计数 `parkedQuestionRowsLeftAsWritten`、不猜。
|
|
193
|
+
* ② **`gate_kind` 列**:每次停驻都把门型反范式成这一列(SLA 分法、门型绑定的取行都按它),NULL = 写入时没有门型 —— 自 7.x 的 checkpoint 重建与写口恒盖以来
|
|
194
|
+
* 按构造不可达;仍有的话从门子树回填 core 登记的门型,门子树里读不出登记门型的行引擎续不了(`pauseOf` 拒)⇒ 置 expired(与到期收割同一个终态)。之后
|
|
195
|
+
* 运维待批队列行的 `gateKind` **恒在场**(读口对 NULL 门型的行不列、计数 —— 与决断口同一个读法,不按缺键投出去)。
|
|
196
|
+
* 改写按原文 CAS(MySQL 协议两边 `CAST(… AS BINARY)`,PG `text` 等值)+ `status = 'pending'`,第二跑零命中。**够不到的一格(如实登记)**:local 车道的停驻行在
|
|
197
|
+
* 引擎自己的 File 店里(盘上格式归引擎,本仓没有合法缝改写)⇒ 那里的存量问答行照旧按「无卡」读(显示通用卡、到期 SLA 拒扫、决断口按工具名要 `answer`);
|
|
198
|
+
* 那一车道的队列行门型从文档读(引擎恒写),没有可回填的列。窗 = 发布日 + 30 天 = 停驻行的终局兜底窗缺省(与 M19 同一条论证与同三类逃出窗的部署)。
|
|
199
|
+
* · **M22 盘上 LKG 信封 formatVersion 4 → 5**(7.132.0)—— 不在店里(与 M13 / M15 同为非店迁移):中心提示层收成一种 wire 形(`{ schemaVersion: 2, artifact }`),
|
|
200
|
+
* 4 及更早的载荷若带 prompts,那是 13.x 的两轴 wire(引擎当期不读)。`config-lkg.ts` `loadLkg` 读回 4(及迁到 4 的 2 / 3)时:载荷带 prompts ⇒ 不读回
|
|
201
|
+
* (拒因点名版本与键);不带 ⇒ 载荷零改动读回,读回方按 5 写回原位,启动日志 `config_lkg_migrated` 一行。规则在 `config-lkg.ts` 顶注 formatVersion 5 一段与
|
|
202
|
+
* `migrateV4Lkg`。没有读数键(它不写库)。
|
|
203
|
+
*
|
|
204
|
+
* ## 收据账(一次起服一只,每一条迁移同一只)
|
|
205
|
+
* 每一步把它**已提交**的改写 / 删除与点名读数当场记进同一只收据账({@link MigrationReceipts}):计数随每次提交累加、行随每次提交追加、形读数在那一步落定时写。走完 ⇒
|
|
206
|
+
* 账就是读数,起服日志打一行 `one_time_migrations_applied` + 逐行的那几种;任何一步失败 ⇒ 账里有动过的格就随拒因交出({@link OneTimeMigrationInterruptedError}),起服日志在抛之前
|
|
207
|
+
* 用**同一只打印口**打一行 `one_time_migrations_interrupted`(读数键与读数行同一只投影)+ 逐行的那几种({@link runAndLogOneTimeMigrations})。理由:提交了的改写下一次起服再扫是
|
|
208
|
+
* 零命中 —— 被改写 / 被删的行、它们的计数只有「改写发生的那一拍」说得出。没有任何一格动过就失败 ⇒ 原错误原样抛。
|
|
209
|
+
* 如实的残余:提交与那一行日志之间进程被杀、或一条提交的确认在连接上丢了 —— 收据没有耐久载体(不为短命的迁移另建迁移账表,见 M4 一节的同一条论证)。
|
|
184
210
|
*
|
|
185
211
|
* ## 幂等
|
|
186
212
|
* 改写的几条都可重复跑(M4:`detail IS NOT NULL AND … = 'null'`;M5:列在场探针 + `WHERE incarnation = ''`;M6:`WHERE error_code IS NULL`;
|
|
@@ -188,7 +214,7 @@
|
|
|
188
214
|
*/
|
|
189
215
|
import type { Pool as MysqlPool } from "mysql2/promise";
|
|
190
216
|
import type { Pool as PgPool } from "pg";
|
|
191
|
-
import {
|
|
217
|
+
import { type AllowEntryInertReason, type GateKind } from "@sema-agent/core";
|
|
192
218
|
import { type UndurableScopeRuleRow, type UnreadableRuleBucket } from "./permission-rule-store-sql.js";
|
|
193
219
|
/** 迁移读数(启动日志一行写全;测试按它断言,不靠日志文本)。 */
|
|
194
220
|
export interface OneTimeMigrationReport {
|
|
@@ -224,13 +250,24 @@ export interface OneTimeMigrationReport {
|
|
|
224
250
|
readonly sessionRuleColumn: "renamed" | "current" | "no-table" | "file-store";
|
|
225
251
|
/** M17:带退役命令桶的行 —— 退役桶一个字节不动,读回 `corrupt`;一行一条 warn 点名(不带规则正文)。每次起服都报,直到有人改写或删掉它。 */
|
|
226
252
|
readonly sessionRuleRowsWithRetiredBuckets: readonly SessionRuleRowRetiredBuckets[];
|
|
227
|
-
/** M17:改名那一拍(`sessionRuleColumn: "renamed"`)按引擎的条目读法判过、两种文法下读法不同的行 —— toolAllow 里被剔的条目(行已按原文 CAS 回写)
|
|
228
|
-
*
|
|
253
|
+
/** M17:改名那一拍(`sessionRuleColumn: "renamed"`)按引擎的条目读法判过、两种文法下读法不同的行 —— toolAllow 里被剔的条目(行已按原文 CAS 回写);
|
|
254
|
+
* 一行一条 warn 点名。只在改名那一拍有;第二跑起恒空(列名已是新名,行由本版的写者按新文法写)。 */
|
|
229
255
|
readonly sessionRuleRowsWithOldGrammarEntries: readonly SessionRuleRowOldGrammarEntries[];
|
|
256
|
+
/** M17:改名那一拍(`sessionRuleColumn: "renamed"`)里 toolDeny 带引擎读成「不是任何一条规则」的条目的行 —— 整行**不改写、不盖戳**(原样留),一行一条 warn 点名(条目 + 引擎读者的原因词)。
|
|
257
|
+
* 只在改名那一拍有;第二跑起恒空。这种行引擎本来就每一次调用都拒、并按行自带的旧文法通告(`config.session_rules_earlier_grammar`);出路是 operator 改写或删会话。 */
|
|
258
|
+
readonly sessionRuleRowsWithUnreadableDeny: readonly SessionRuleRowUnreadableDeny[];
|
|
230
259
|
/** M18:本次把 `approval_ask.card_json` 上引擎 7.51.0 退役的两个词改写掉的卡行数(SQL 独有;local 恒 0)。非零 = 真写了存量行。 */
|
|
231
260
|
readonly retiredCardWordAskRowsRewritten: number;
|
|
232
261
|
/** M18:带字样、但 `approval_ask.card_json` 的 JSON 读不懂 ⇒ 没改写的卡行数(留给读者自己的坏行臂;非零 = 运维该看一眼这些行)。SQL 独有;local 恒 0。 */
|
|
233
262
|
readonly retiredCardWordRowsUnreadable: number;
|
|
263
|
+
/** M21:本次给门上没有卡词的存量问答停驻行写上 `question` 的行数(SQL 独有;local 恒 0)。非零 = 真写了存量行。 */
|
|
264
|
+
readonly parkedQuestionCardsWritten: number;
|
|
265
|
+
/** M21:该补卡词、却没补的问答停驻行数 —— 引擎行摘要封过(带 `requirementsDigest`,改了 = 续跑判 damaged)或整只文档读不懂;一个字节没动(非零 = 运维该看一眼)。SQL 独有;local 恒 0。 */
|
|
266
|
+
readonly parkedQuestionRowsLeftAsWritten: number;
|
|
267
|
+
/** M21:本次从门子树回填 `gate_kind` 列的停驻行数(SQL 独有;local 恒 0 —— 那一车道的门型从文档读)。非零 = 真写了存量行。 */
|
|
268
|
+
readonly parkedRowGateKindsBackfilled: number;
|
|
269
|
+
/** M21:`gate_kind` 为 NULL、门子树里读不出一只 core 登记门型的停驻行 —— 引擎续不了(`pauseOf` 拒)⇒ 置 expired 的行数(SQL 独有;local 恒 0)。非零 = 真改了存量行。 */
|
|
270
|
+
readonly parkedRowsUnresumableExpired: number;
|
|
234
271
|
}
|
|
235
272
|
/** 退役的两只命令桶(引擎 7.51.0 起不是桶;只给 M17 点名认)。 */
|
|
236
273
|
export type RetiredSessionRuleBucket = "commandAllow" | "commandDeny";
|
|
@@ -244,36 +281,54 @@ export interface SessionRuleRowRetiredBuckets {
|
|
|
244
281
|
export interface SessionRuleRowOldGrammarEntries {
|
|
245
282
|
readonly policyKey: string;
|
|
246
283
|
readonly sessionId: string;
|
|
247
|
-
/** toolAllow 里删掉的条目:引擎在行自己的文法(0)里读成 `earlier_grammar` ——
|
|
284
|
+
/** toolAllow 里删掉的条目:引擎在行自己的文法(0)里读成 `earlier_grammar` —— 拼写不是它所指的名字(或 `*`),什么都不放行;当前文法里是一条放行规则 ——
|
|
248
285
|
* 删掉后盖戳的行是引擎对原行读法的逐调用同义重述。 */
|
|
249
286
|
readonly toolAllowDropped: readonly string[];
|
|
250
|
-
/** 在场 = 这一行没改写也没盖戳:引擎在它的文法里把 toolAllow 整张读成作废(名单里有 `*`),其余条目的读法被遮住(见 {@link OldGrammarEntries.wildcardMasked})。 */
|
|
251
|
-
readonly wildcardMasked?: true;
|
|
252
287
|
}
|
|
253
|
-
/**
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
* · `renamed` —— 终名由本次起服发布了(下一次起服读到的是 `current`)。
|
|
258
|
-
*/
|
|
259
|
-
export interface SessionRuleReceipts {
|
|
260
|
-
rows: SessionRuleRowOldGrammarEntries[];
|
|
261
|
-
renamed: boolean;
|
|
288
|
+
/** 引擎 `unreadableDenyEntries` 的一条读数:条目原样 + 引擎读者的原因词(`earlier_grammar` = 行自带的文法早于引擎当前文法、当前文法读不出它;`grammar` = 当前文法读不出它)。 */
|
|
289
|
+
export interface UnreadableDenyEntry {
|
|
290
|
+
readonly entry: string;
|
|
291
|
+
readonly reason: AllowEntryInertReason;
|
|
262
292
|
}
|
|
263
|
-
/**
|
|
264
|
-
export
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
readonly
|
|
293
|
+
/** M17 被留下的一行(键是单向哈希;只带读不出的那几条 deny 条目,过本仓唯一脱敏器 —— 其余规则正文不出店)。 */
|
|
294
|
+
export interface SessionRuleRowUnreadableDeny {
|
|
295
|
+
readonly policyKey: string;
|
|
296
|
+
readonly sessionId: string;
|
|
297
|
+
/** toolDeny 里引擎读成「不是任何一条规则」的条目与读者的话。这一行没被改写、没盖戳:引擎对它每一次工具调用都拒,直到有人按新文法改写。 */
|
|
298
|
+
readonly toolDenyUnreadable: readonly UnreadableDenyEntry[];
|
|
299
|
+
/** 同一行还带的退役命令桶(同一只判据 {@link retiredSessionRuleBucketsOf};缺席 = 没有)。带桶的行会话规则的 `PUT` 读不了(读前快照读成 `corrupt`,operator 也一样),
|
|
300
|
+
* 出路只能是在库里按新文法改写那一行(`rev` / `gen` 不动)或删会话 —— 与退役桶那条点名同一条出路。 */
|
|
301
|
+
readonly retiredBuckets?: readonly RetiredSessionRuleBucket[];
|
|
269
302
|
}
|
|
303
|
+
/** 三个形读数(M5 列 / M9 主键 / M17 列名)—— 那一步**落定**之前收据账里缺席(读数行要它们齐;被打断的那一行只带已落定的)。 */
|
|
304
|
+
type ShapeReadingKey = "sessionIncarnationColumn" | "workflowParkIndexKey" | "sessionRuleColumn";
|
|
270
305
|
/**
|
|
271
|
-
*
|
|
272
|
-
*
|
|
306
|
+
* 读数的「已记下的那些」形:形读数可缺席(那一步还没落定),其余每一键与 {@link OneTimeMigrationReport} 同名同形。读数行({@link logOneTimeMigrations})与
|
|
307
|
+
* 被打断的那一行({@link logOneTimeMigrationsInterrupted})读同一只投影({@link readingFields}),拒因({@link OneTimeMigrationInterruptedError})带的也是这一形。
|
|
308
|
+
*/
|
|
309
|
+
export type OneTimeMigrationReadings = Omit<OneTimeMigrationReport, ShapeReadingKey> & Partial<Pick<OneTimeMigrationReport, ShapeReadingKey>>;
|
|
310
|
+
/** 只读数组 → 可追加数组(收据账的行表随提交追加)。 */
|
|
311
|
+
type Appendable<T> = {
|
|
312
|
+
-readonly [K in keyof T]: T[K] extends ReadonlyArray<infer E> ? E[] : T[K];
|
|
313
|
+
};
|
|
314
|
+
/**
|
|
315
|
+
* 🔴 S-1594 —— **一次起服的迁移收据账(唯一一只)**:每一步把它**已提交**的改写 / 删除与点名读数当场记进来 —— 计数随每次提交累加、行随每次提交追加、
|
|
316
|
+
* 形读数在那一步落定时写。走完 ⇒ 它就是读数({@link completedReport});任何一步抛 ⇒ 它随拒因交出({@link OneTimeMigrationInterruptedError}),
|
|
317
|
+
* 起服日志在抛之前用同一只打印口打出来({@link runAndLogOneTimeMigrations})。理由:提交了的改写下一次起服再扫是零命中 —— 被改写 / 被删的行、它们的计数
|
|
318
|
+
* 只有「改写发生的那一拍」说得出;只记成功的读数,等于让一次被打断的起服把这一拍之前全部提交的事实都丢掉。
|
|
319
|
+
* 只盖戳的 M17 改写不记(戳不丢信息,重来再判零动作)。如实的残余:提交与那一行日志之间进程被杀、或一条提交的确认在连接上丢了 —— 收据没有耐久载体
|
|
320
|
+
* (不为短命的迁移另建迁移账表,见头注 M4 一节的同一条论证)。
|
|
321
|
+
*/
|
|
322
|
+
export type MigrationReceipts = Appendable<OneTimeMigrationReadings>;
|
|
323
|
+
/** 一本空收据账(迁移段每次起服一本;每一步往里记)。 */
|
|
324
|
+
export declare function buildMigrationReceipts(): MigrationReceipts;
|
|
325
|
+
/**
|
|
326
|
+
* 一次起服的迁移在**已提交**一些改写之后失败了:原错误在 `cause` 与句子里原样在场,收据账抛那一刻的读数在 `receipts`(结构化,{@link OneTimeMigrationReadings})与句子尾
|
|
327
|
+
* (同一份读数的人读形)。收据账里没有任何一格动过就失败的路径不包这只错(原错误原样抛)。起服调用点({@link runAndLogOneTimeMigrations})在抛之前把 `receipts` 打进日志。
|
|
273
328
|
*/
|
|
274
329
|
export declare class OneTimeMigrationInterruptedError extends Error {
|
|
275
|
-
readonly receipts:
|
|
276
|
-
constructor(cause: unknown, receipts:
|
|
330
|
+
readonly receipts: OneTimeMigrationReadings;
|
|
331
|
+
constructor(cause: unknown, receipts: OneTimeMigrationReadings);
|
|
277
332
|
}
|
|
278
333
|
/**
|
|
279
334
|
* S-590 —— 一条一次性迁移的窗(登记表的一行;纯数据)。字段注写着每个值的取证方式,改一行之前照着重核。
|
|
@@ -306,27 +361,16 @@ export declare const ONE_TIME_MIGRATIONS: readonly OneTimeMigrationWindow[];
|
|
|
306
361
|
/**
|
|
307
362
|
* 一条登记行的窗**此刻**开着没有(`today` = UTC 日历日 YYYY-MM-DD):未发布形(`removableAfter: null`)⇒ 开;否则今天不晚于 `removableAfter` ⇒ 开
|
|
308
363
|
* (窗关当天仍开,与到期门「今天严格晚于才红」同一条边界)。
|
|
309
|
-
* 只给**窗内才生效的行为臂**用(M10 的认领、M19 的续跑重读):那种臂过了窗就停,不等删码车 —— 删码因此是零行为变化,而窗只写在本表这一处。
|
|
364
|
+
* 只给**窗内才生效的行为臂**用(M10 的认领、M19 / M20 的续跑重读):那种臂过了窗就停,不等删码车 —— 删码因此是零行为变化,而窗只写在本表这一处。
|
|
310
365
|
*/
|
|
311
366
|
export declare function migrationWindowOpen(window: Pick<OneTimeMigrationWindow, "removableAfter">, today: string): boolean;
|
|
312
|
-
/** local 车道上 SQL 独有的几条(M4 / M5 / M8 / M9 / M11 / M17 / M18)的读数(M6 两车道都有,local 腿的读数由 `LocalBackend.runOneTimeMigrations` 现算):那几张表 / 列在文件底座上从来不存在 ⇒ 如实答 absent / 0。 */
|
|
367
|
+
/** local 车道上 SQL 独有的几条(M4 / M5 / M8 / M9 / M11 / M17 / M18 / M21)的读数(M6 两车道都有,local 腿的读数由 `LocalBackend.runOneTimeMigrations` 现算):那几张表 / 列在文件底座上从来不存在 ⇒ 如实答 absent / 0。 */
|
|
313
368
|
export declare const NO_SQL_MIGRATIONS: Omit<OneTimeMigrationReport, "holderDeathCodeRowsBackfilled">;
|
|
314
369
|
/** 启动期的日志口(logger 的子集)。两级各有其用,见 {@link logOneTimeMigrations}。 */
|
|
315
370
|
export interface MigrationLogSink {
|
|
316
371
|
warn(msg: string, meta?: Record<string, unknown>): void;
|
|
317
372
|
info(msg: string, meta?: Record<string, unknown>): void;
|
|
318
373
|
}
|
|
319
|
-
/**
|
|
320
|
-
* 跳版升级的库的拒启:退役 schema(快照索引表 / 单座列)任一仍在。**具名类型**:锚类型不锚文案(日志消费端与测试按 `code` / 类型分派);
|
|
321
|
-
* 码取列册探针同一个 `config.schema_mismatch`,运维面一个拒启码一个读法。拒句点名在场的坐标、说明第三条(旧拼法改写)同样没跑过、给出路。
|
|
322
|
-
* 继承 {@link StoreBootRefusalError}:这是一句**确定**的拒启表态(再等也等不来另一个答案)—— `ensureSchema()` 里它不被 SQL 开库的等待窗重试、不被改写成「库打不开」的拒句。
|
|
323
|
-
*/
|
|
324
|
-
export declare class RetiredSchemaPresentError extends StoreBootRefusalError {
|
|
325
|
-
readonly found: readonly string[];
|
|
326
|
-
/** 机读码(与列册探针的拒启同一个)。 */
|
|
327
|
-
readonly code = "config.schema_mismatch";
|
|
328
|
-
constructor(found: readonly string[]);
|
|
329
|
-
}
|
|
330
374
|
/** 方言无关的最小查询口(两方言的返回形不同,由下面两只适配器收平)。`params` 只给带值的语句用(M5 的回填:会话 id 是
|
|
331
375
|
* 调用方自选的任意串,不许内插进 SQL 文本);占位符形由调用方按方言写(`?` / `$n`)。 */
|
|
332
376
|
export interface MigrationDb {
|
|
@@ -335,23 +379,6 @@ export interface MigrationDb {
|
|
|
335
379
|
/** 执行并回报受影响行数(DDL 返回 0)。 */
|
|
336
380
|
exec(sql: string, params?: readonly unknown[]): Promise<number>;
|
|
337
381
|
}
|
|
338
|
-
/** 探针口的池参数:方言与它的池一起走(判别联合 ⇒ 不靠调用方断言「这个池是哪种」)。 */
|
|
339
|
-
export type RetiredSchemaProbeTarget = {
|
|
340
|
-
readonly dialect: "tidb";
|
|
341
|
-
readonly pool: MysqlPool;
|
|
342
|
-
} | {
|
|
343
|
-
readonly dialect: "pg";
|
|
344
|
-
readonly pool: PgPool;
|
|
345
|
-
};
|
|
346
|
-
/**
|
|
347
|
-
* **探针口**(退役 schema 唯一的读处):库一连上、**任何 DDL 之前**探一遍,在场 ⇒ 抛 {@link RetiredSchemaPresentError}。本仓唯一调用点 =
|
|
348
|
-
* `store-backend.ts` 的 `withRetiredSchemaProbe`(SQL 两后端的 `ensureSchema()` 自身:探针先于建表的先后只写在那一处,不在两方言各写一遍)。**不在包根上**:
|
|
349
|
-
* 嵌入方经公开序列的 `ensureSchema()` 得到这一问,不需要自己排序列。
|
|
350
|
-
*
|
|
351
|
-
* 不取 `ensureSchema` 那把 advisory 锁:本口纯读(两条目录探针),不改任何东西,与别的副本正在跑的建表 / 迁移互不相干 —— 它们之间的先后不影响本口的判据
|
|
352
|
-
* (退役 schema 只会被 7.125.x 的迁移删去、不会被谁凭空建回)。用完即还连接,拒启时连接也已归还。
|
|
353
|
-
*/
|
|
354
|
-
export declare function assertRetiredSchemaAbsentOnPool(target: RetiredSchemaProbeTarget): Promise<void>;
|
|
355
382
|
/**
|
|
356
383
|
* SQL 两后端的一次性迁移。**调用点只有一个**(boot/stores.ts,在 `ensureSchema` 之后、任何路由装配
|
|
357
384
|
* 之前)—— 拒启在那一刻仍然是拒启(还没开始服务),而 `ensureSchema` 那条通道的契约是「只发 CREATE」
|
|
@@ -368,7 +395,7 @@ export declare function assertRetiredSchemaAbsentOnPool(target: RetiredSchemaPro
|
|
|
368
395
|
* 非破坏改写(M4–M9、M18:改值不丢信息 / 加法 DDL / 复制 + 换名)在前,破坏性步骤(M11 的删行)排在最后;
|
|
369
396
|
* M11 自己半途失败时,拒因自带已删的行(`purgeUndurableScopeRows`)—— 否则重试看不见已删的行,证据永久消失。
|
|
370
397
|
*
|
|
371
|
-
* 本函数**不问**退役 schema:带着它的库在更早处就被 `ensureSchema()` 自身拒掉了(
|
|
398
|
+
* 本函数**不问**退役 schema:带着它的库在更早处就被 `ensureSchema()` 自身拒掉了(起服对账一族 `schema-consistency.ts` 的探针口,先于建表);走公开序列
|
|
372
399
|
* `createStoreBackend()` → `ensureSchema()` → `runOneTimeMigrations()` 的嵌入方与本服务的起服序列一样,有这一问、零动作。
|
|
373
400
|
*/
|
|
374
401
|
export declare function runSqlOneTimeMigrations(dialect: "tidb" | "pg", pool: MysqlPool | PgPool): Promise<OneTimeMigrationReport>;
|
|
@@ -379,14 +406,14 @@ export declare function runSqlOneTimeMigrations(dialect: "tidb" | "pg", pool: My
|
|
|
379
406
|
export declare function retiredSessionRuleBucketsOf(body: unknown): readonly RetiredSessionRuleBucket[];
|
|
380
407
|
/** M17 —— 一份存量规则体按引擎在它自己的文法里的读法改写成当前文法的同一句话({@link oldGrammarEntriesOf} 的读数)。 */
|
|
381
408
|
export interface OldGrammarEntries {
|
|
382
|
-
/** toolAllow 里删掉的条目(引擎的 `earlier_grammar` 读数;见 {@link SessionRuleRowOldGrammarEntries.toolAllowDropped})。 */
|
|
409
|
+
/** toolAllow 里删掉的条目(引擎的 `earlier_grammar` 读数;见 {@link SessionRuleRowOldGrammarEntries.toolAllowDropped})。行因 {@link toolDenyUnreadable} 整行不动时恒空(没写 ⇒ 没删)。 */
|
|
383
410
|
readonly toolAllowDropped: readonly string[];
|
|
411
|
+
/** toolDeny 里引擎 `unreadableDenyEntries` 读成「不是任何一条规则」的条目(条目 + 引擎读者的原因词)。**非空 ⇒ 这一行不改写、不盖戳**({@link rewritten} 缺席):
|
|
412
|
+
* 这种行引擎对每一次工具调用都拒(读成更少的规则是 fail-open,引擎不这么读),并按行自带的旧文法通告;盖成当前文法戳只会让通告消失、行照旧拒一切。缺席 = 没有这样的条目。 */
|
|
413
|
+
readonly toolDenyUnreadable?: readonly UnreadableDenyEntry[];
|
|
384
414
|
/** 这一行要落的新体 —— 被删条目去掉、其余键原样(退役命令桶也原样)、`grammar: SESSION_RULES_GRAMMAR`;在场 = 要写。缺席 = 零动作:行已带戳且没有可删的条目
|
|
385
|
-
* (上一次没走完的判读已改写过的行)
|
|
415
|
+
* (上一次没走完的判读已改写过的行)。 */
|
|
386
416
|
readonly rewritten?: Record<string, unknown>;
|
|
387
|
-
/** 在场 = 引擎在这一行自己的文法里把 `toolAllow` 整张读成作废(`wildcard_all`:名单里有 `*`),遮住了其余条目在那种文法里各算什么 ——
|
|
388
|
-
* 本函数因此**不改写、不盖戳**(改写会把被遮住的条目定成当前文法的规则;引擎修正文法 0 的 `*` 读法后,留在原文法里的行自动读真),只点名。 */
|
|
389
|
-
readonly wildcardMasked?: true;
|
|
390
417
|
}
|
|
391
418
|
/**
|
|
392
419
|
* M17 —— 一行存量规则(体 + 它的 `rev`)的改写判读(纯函数,判据只有引擎的):
|
|
@@ -394,7 +421,9 @@ export interface OldGrammarEntries {
|
|
|
394
421
|
* 而改写的是同一行其余的桶 —— 人按出路删掉退役桶的那一刻,行已是当前文法的真话);
|
|
395
422
|
* · `toolAllow` 经 `compileSessionRuleBucket` 在那种文法下编译,归 `earlier_grammar` 的条目删掉(文法 0 与 1 在引擎里只差这一条子句:拼写不是它所指名字的 allow 条目
|
|
396
423
|
* 在文法 0 里什么都不放行、在文法 1 里是一条放行规则),名单**保持在场**(在场的空 `toolAllow` 引擎读作「什么都不放行」);别的桶一个字节不动;
|
|
397
|
-
* ·
|
|
424
|
+
* · **盖戳前先问引擎读者**(S-1691):行的 `toolDeny` 里有 `unreadableDenyEntries` 答的条目(引擎在这一行的文法里读成「不是任何一条规则」)⇒ **整行不改写、不盖戳、不删任何条目**,
|
|
425
|
+
* 条目与读者的原因词随 {@link OldGrammarEntries.toolDenyUnreadable} 交出(收据点名)。引擎对这种行本来就拒一切 —— 本函数只问、不判:不复刻引擎的条目读者,不替运维删条目或改写。
|
|
426
|
+
* · 新体盖 `grammar: SESSION_RULES_GRAMMAR`:无戳行每一行都写(改写之后部署里零无戳行 —— 除上一条留下的行);已带戳且没有可删条目的行零动作(幂等)。
|
|
398
427
|
* 读不出形(不是对象、有别的非桶键、桶不是一列字符串、坏戳 / 比引擎新的戳)⇒ `undefined`,不判(读回照旧 `corrupt`)。本函数零处读 / 比较戳的数值:
|
|
399
428
|
* 「有没有戳」是形读法自己判戳之前的同一问;条目在哪种文法下算什么只有引擎读。
|
|
400
429
|
*/
|
|
@@ -404,12 +433,13 @@ export declare function oldGrammarEntriesOf(body: unknown, rev: number): OldGram
|
|
|
404
433
|
* ① 旧名 `rules` 在 ⇒ 改成进行中的名 `rule_entries_old_grammar`(≤7.128.x 副本从此找不到列,响亮失败;MySQL 协议方言 `CHANGE COLUMN`,定义内插 `SESSION_RULES_COLUMN`
|
|
405
434
|
* 同一串;PG `RENAME COLUMN`);
|
|
406
435
|
* ② 进行中的名在 ⇒ 改写它下面的每一行({@link judgeOldGrammarRows}:这个名下的行只可能是 ≤7.128.x 写的无戳行,或上一次没走完的判读已改写过的带戳行 —— 再判零动作),
|
|
407
|
-
* 判完才改成终名 `rule_entries`;判读抛了 ⇒
|
|
436
|
+
* 判完才改成终名 `rule_entries`;判读抛了 ⇒ 原样上抛,列停在进行中的名,下一次起服从这里续。**收据随提交落**:有被删条目的改写提交的那一刻记进迁移段那一只收据账 ——
|
|
408
437
|
* 本函数之后的任何一步(含终名改名本身、其后的退役桶扫描、`migrateOn` 里排在它后面的迁移)失败,收据都由 `migrateOn` 外层随拒因带出去;
|
|
409
438
|
* ③ 带退役命令桶的行每次起服在终名下逐页扫、逐行点名(文字预筛 + {@link retiredSessionRuleBucketsOf} 精判)—— 退役桶一个字节不动(读回照旧 `corrupt`)。
|
|
410
|
-
*
|
|
439
|
+
* 读数都记在收据账上(`sessionRuleColumn` 在落定时写:表不在(中央 DDL 之前被调到)⇒ `no-table`,不编读数;`renamed` = 本次把终名发布出来(含从进行中的名续判到底的那一次),
|
|
440
|
+
* 终名改名提交之后才写;`current` = 起服时已是终名);点名的行随扫到追加。
|
|
411
441
|
*/
|
|
412
|
-
export declare function migrateSessionRuleGrammar(db: MigrationDb, dialect: "tidb" | "pg", receipts:
|
|
442
|
+
export declare function migrateSessionRuleGrammar(db: MigrationDb, dialect: "tidb" | "pg", receipts: MigrationReceipts): Promise<void>;
|
|
413
443
|
/** M8 一行改写的结论:改写后的文本 / 这一行不用动 / 读不懂(解析错误原样交出,调用方计数进读数)。 */
|
|
414
444
|
export type ShadowedRuleRewrite = {
|
|
415
445
|
readonly kind: "rewrite";
|
|
@@ -439,20 +469,46 @@ export type RetiredCardWordsRowRewrite = {
|
|
|
439
469
|
};
|
|
440
470
|
/** M18 —— `approval_ask.card_json` 一行的改写(纯函数;导出给钉用):信封里 `card` 两座上的退役词按 `retired-card-words.ts` 那一只改写。 */
|
|
441
471
|
export declare function migrateRetiredCardWordsInCardJson(text: string): RetiredCardWordsRowRewrite;
|
|
472
|
+
/** M21 一行的修补方案({@link parkedRowRepairOf} 的读数)。 */
|
|
473
|
+
export interface ParkedRowRepair {
|
|
474
|
+
/** 要回填进 `gate_kind` 列的门型:列是 NULL、门子树里有一只 core 登记的门型。缺席 = 不回填。 */
|
|
475
|
+
readonly gateKind?: GateKind;
|
|
476
|
+
/** 要给门写上问答卡词:审批门型 ∧ 门上没有 `approvalCard` 这个键 ∧ 待决动作是问答工具(按名,与决断口同一个名)的审批。 */
|
|
477
|
+
readonly questionCard: boolean;
|
|
478
|
+
/** 列是 NULL、门子树里读不出一只 core 登记的门型 —— 引擎续不了它(`pauseOf` 拒),也进不了任何一条按门型分的腿。 */
|
|
479
|
+
readonly unresumable: boolean;
|
|
480
|
+
}
|
|
481
|
+
/**
|
|
482
|
+
* M21 一行的判读(纯函数;导出给钉用)。输入 = 行上的 `gate_kind` 列、文档里的 `gate` / `pendingAction` 两棵子树(读不出 ⇒ `undefined`)。
|
|
483
|
+
* 门型取列(写入时从同一只门反范式下来的那一格);列是 NULL 才读门子树。门上已有任何卡词(含集外词)⇒ 不写:那不是「缺席」,集外词由读者自己的计数臂接住。
|
|
484
|
+
*/
|
|
485
|
+
export declare function parkedRowRepairOf(gateKindCell: unknown, gate: unknown, pendingAction: unknown): ParkedRowRepair;
|
|
486
|
+
/**
|
|
487
|
+
* M21 —— 停驻行补齐引擎今天在铸点写的两格(规则、为什么、够不到的一格见头注 M21 段)。只扫 `status = 'pending'` 的候选行(`gate_kind` 为 NULL,或审批门型且
|
|
488
|
+
* 待决工具列是问答工具 —— 两列都是写入时从同一份文档反范式下来的;列只做预筛,判读读文档的子树),按 `token` 键集分页,每行只看一次:
|
|
489
|
+
* · 回填门型:`UPDATE … SET gate_kind = ? WHERE token = ? AND status = 'pending' AND gate_kind IS NULL`(第二跑零命中);
|
|
490
|
+
* · 续不了(列 NULL ∧ 门子树里读不出登记门型):`UPDATE … SET status = 'expired', decided_at_ms = ?`,同一守卫 —— 与到期收割同一个终态(停驻的 run 行由既有收割腿收);
|
|
491
|
+
* · 补卡词:读整只文档一次 —— 带 `requirementsDigest`(引擎行摘要封过,`gate.approvalCard` 是它覆盖的成员)或读不懂 ⇒ 一个字节不动、计进 `parkedQuestionRowsLeftAsWritten`;
|
|
492
|
+
* 否则门上加 `approvalCard: "question"`、其余字节原样,经写腿的同一只编码器回写,按原文 CAS(MySQL 协议两边 `CAST(… AS BINARY)`,PG `text` 等值)+ `status = 'pending'`。
|
|
493
|
+
* 每一次提交当场记进收据账。
|
|
494
|
+
*/
|
|
495
|
+
export declare function repairParkedRows(db: MigrationDb, dialect: "tidb" | "pg", receipts: MigrationReceipts): Promise<void>;
|
|
442
496
|
/**
|
|
443
497
|
* 启动日志的读数行。零命中(第二跑起的常态)也照发 —— 「跑过了、什么都没改」与「压根没跑」必须可分辨。
|
|
444
498
|
*
|
|
445
|
-
* 🔴
|
|
499
|
+
* 🔴 **级别按「这次真动了没有」分**({@link changedAnything}):动了 ⇒ `warn`(有人的持久数据被改写/删除了,运维该看见一次);
|
|
446
500
|
* 没动 ⇒ `info`。把恒常的空转也发成 warn 会训练运维忽略 warn —— 那是在为了本段的可见性去损耗整条告警轴。
|
|
501
|
+
* 汇总行之后逐行的那几种由 {@link logReceiptRows} 打(被打断的起服走同一只)。
|
|
447
502
|
*/
|
|
448
503
|
export declare function logOneTimeMigrations(log: MigrationLogSink, backend: string, report: OneTimeMigrationReport): void;
|
|
449
504
|
/**
|
|
450
505
|
* **起服调用点用的那一只**(`boot/stores.ts`;嵌入方走公开序列自己调 `runOneTimeMigrations()` 时拿到的是 {@link OneTimeMigrationInterruptedError} 本身,收据在 `receipts`):
|
|
451
|
-
* 跑迁移、成功则打读数行({@link logOneTimeMigrations});被打断(
|
|
506
|
+
* 跑迁移、成功则打读数行({@link logOneTimeMigrations});被打断(已提交了改写)则**先把收据打进日志再抛**,抛的就是迁移段那只错。
|
|
452
507
|
* 其余失败原样抛、不多打一行。
|
|
453
508
|
*/
|
|
454
509
|
export declare function runAndLogOneTimeMigrations(log: MigrationLogSink, backend: {
|
|
455
510
|
readonly kind: string;
|
|
456
511
|
runOneTimeMigrations(): Promise<OneTimeMigrationReport>;
|
|
457
512
|
}): Promise<void>;
|
|
513
|
+
export {};
|
|
458
514
|
//# sourceMappingURL=one-time-migrations.d.ts.map
|