@sema-agent/server 7.125.1 → 7.127.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.
Files changed (275) hide show
  1. package/MIGRATION.md +229 -2
  2. package/README.md +2 -2
  3. package/README.zh-CN.md +2 -2
  4. package/USAGE.md +346 -145
  5. package/deploy/sema-up/README.md +1 -1
  6. package/deploy/sema-up/chart/templates/networkpolicy-sandbox.yaml +57 -0
  7. package/deploy/sema-up/chart/templates/sandbox-rbac.yaml +32 -1
  8. package/deploy/sema-up/chart/templates/server-v4pro.yaml +3 -2
  9. package/deploy/sema-up/chart/templates/server.yaml +2 -1
  10. package/deploy/sema-up/chart/values.yaml +22 -0
  11. package/deploy/sema-up/cluster-up.sh +10 -10
  12. package/deploy/sema-up/kube-up.sh +20 -13
  13. package/deploy/sema-up/lib/dataroot.sh +1 -1
  14. package/deploy/sema-up/lib/envf.sh +5 -5
  15. package/deploy/sema-up/lib/flagshape.sh +5 -5
  16. package/deploy/sema-up/lib/lanes.py +1 -1
  17. package/deploy/sema-up/lib/node-addrs.sh +42 -0
  18. package/deploy/sema-up/lib/parse-machines.py +2 -2
  19. package/deploy/sema-up/lib/shell-access.sh +1 -1
  20. package/deploy/sema-up/preflight.sh +4 -4
  21. package/deploy/sema-up/sema-up.sh +33 -33
  22. package/deploy/sema-up/smoke.sh +3 -3
  23. package/deploy/sema-up/stack/compose.yaml +1 -1
  24. package/deploy/sema-up/stack/sema-stack-cluster.yaml +26 -3
  25. package/dist/approval-card.d.ts +20 -4
  26. package/dist/approval-content-kind.d.ts +38 -22
  27. package/dist/approval-content-kind.js +20 -4
  28. package/dist/audit.js +3 -0
  29. package/dist/bench/s1/arms.d.ts +9 -37
  30. package/dist/bench/s1/arms.js +4 -61
  31. package/dist/bench/s1/live-deps.d.ts +4 -10
  32. package/dist/bench/s1/live-deps.js +1 -222
  33. package/dist/bench/s1/oracle.d.ts +1 -1
  34. package/dist/bench/s1/reviewer.d.ts +1 -1
  35. package/dist/bench/s1/row.d.ts +5 -7
  36. package/dist/bench/s1/row.js +0 -2
  37. package/dist/bench/s1/run-firm.d.ts +2 -2
  38. package/dist/bench/s1/run-firm.js +1 -4
  39. package/dist/bench/s1/runner-ctx.d.ts +17 -29
  40. package/dist/bench/s1/runner-ctx.js +3 -7
  41. package/dist/bench/s1/tasks.d.ts +9 -46
  42. package/dist/bench/s1/tasks.js +4 -63
  43. package/dist/boot/execution-env.d.ts +38 -26
  44. package/dist/boot/execution-env.js +87 -41
  45. package/dist/boot/leader.d.ts +2 -1
  46. package/dist/boot/memory-boundary.d.ts +1 -1
  47. package/dist/boot/memory-consolidation.d.ts +37 -3
  48. package/dist/boot/memory-consolidation.js +18 -2
  49. package/dist/boot/parked-revive-gate.d.ts +0 -3
  50. package/dist/boot/parked-revive-gate.js +2 -2
  51. package/dist/boot/resolve-spec.d.ts +0 -2
  52. package/dist/boot/resolve-spec.js +12 -17
  53. package/dist/boot/retention-lane.d.ts +12 -1
  54. package/dist/boot/retention-lane.js +2 -0
  55. package/dist/boot/runner-deps.d.ts +7 -6
  56. package/dist/boot/runner-deps.js +5 -16
  57. package/dist/boot/session-faces.d.ts +7 -2
  58. package/dist/boot/session-faces.js +37 -1
  59. package/dist/boot/stage-03-store-backend.d.ts +1 -0
  60. package/dist/boot/stage-03-store-backend.js +2 -2
  61. package/dist/boot/stage-04-stores.d.ts +1 -0
  62. package/dist/boot/stage-05-execution-env.d.ts +2 -2
  63. package/dist/boot/stage-05-execution-env.js +7 -4
  64. package/dist/boot/stage-06-runners.d.ts +2 -3
  65. package/dist/boot/stage-06-runners.js +13 -9
  66. package/dist/boot/stage-07-capability-layer.d.ts +2 -3
  67. package/dist/boot/stage-07-capability-layer.js +3 -4
  68. package/dist/boot/stage-08-reapers.d.ts +2 -3
  69. package/dist/boot/stage-08-reapers.js +2 -2
  70. package/dist/boot/stage-09-leader.d.ts +2 -3
  71. package/dist/boot/stage-09-leader.js +2 -1
  72. package/dist/boot/stage-10-http-server.d.ts +2 -3
  73. package/dist/boot/stage-10-http-server.js +2 -2
  74. package/dist/boot/stores.d.ts +1 -0
  75. package/dist/boot/stores.js +4 -3
  76. package/dist/boot/web-admin.d.ts +5 -0
  77. package/dist/boot/web-admin.js +28 -14
  78. package/dist/brain.d.ts +2 -2
  79. package/dist/brain.js +1 -1
  80. package/dist/capabilities/builtin-tools.d.ts +2 -1
  81. package/dist/capabilities/composite-members.d.ts +1 -1
  82. package/dist/capabilities/composite-members.js +1 -1
  83. package/dist/capabilities/hands-lane.d.ts +9 -6
  84. package/dist/capabilities/hands-lane.js +2 -2
  85. package/dist/capabilities/memory-notice.d.ts +27 -22
  86. package/dist/capabilities/memory-notice.js +15 -17
  87. package/dist/capabilities/scenarios.d.ts +9 -14
  88. package/dist/capabilities/scenarios.js +5 -50
  89. package/dist/capability-facts.d.ts +22 -11
  90. package/dist/capability-facts.js +13 -6
  91. package/dist/config-catalog.js +14 -5
  92. package/dist/config-provider.d.ts +5 -1
  93. package/dist/config-provider.js +23 -4
  94. package/dist/config-types.d.ts +19 -2
  95. package/dist/config.js +41 -6
  96. package/dist/deployment-governance.d.ts +19 -21
  97. package/dist/deployment-governance.js +7 -8
  98. package/dist/env-name-allowlist-knobs.d.ts +5 -5
  99. package/dist/env-name-allowlist-knobs.js +1 -0
  100. package/dist/execution-lane-caps.d.ts +12 -0
  101. package/dist/execution-lane-caps.js +18 -4
  102. package/dist/fleet/subagent-tail-bus.js +15 -5
  103. package/dist/hooks/hook-runner.d.ts +84 -30
  104. package/dist/hooks/hook-runner.js +74 -41
  105. package/dist/http/admission.js +17 -10
  106. package/dist/http/durable-run-leg.d.ts +5 -4
  107. package/dist/http/durable-run-leg.js +2 -4
  108. package/dist/http/idempotency.d.ts +28 -6
  109. package/dist/http/idempotency.js +10 -2
  110. package/dist/http/principal-gate.d.ts +14 -0
  111. package/dist/http/principal-gate.js +7 -0
  112. package/dist/http/request-guards.d.ts +2 -1
  113. package/dist/http/request-guards.js +14 -14
  114. package/dist/http/resume-legs.d.ts +2 -2
  115. package/dist/http/resume-legs.js +20 -10
  116. package/dist/http/route-ctx.d.ts +15 -7
  117. package/dist/http/routes/a2a-serve.js +11 -7
  118. package/dist/http/routes/approvals-assistant.js +18 -3
  119. package/dist/http/routes/background.d.ts +1 -1
  120. package/dist/http/routes/background.js +1 -1
  121. package/dist/http/routes/capabilities.js +10 -2
  122. package/dist/http/routes/mcp-reconnect.js +1 -1
  123. package/dist/http/routes/runs.d.ts +4 -3
  124. package/dist/http/routes/runs.js +35 -14
  125. package/dist/http/routes/session-sync.js +14 -11
  126. package/dist/http/routes/sessions.js +9 -9
  127. package/dist/http/routes/side-query.js +6 -19
  128. package/dist/http/routes/tasks.js +29 -19
  129. package/dist/http/routes/workflows.js +8 -0
  130. package/dist/http/server.d.ts +4 -0
  131. package/dist/http/server.js +3 -5
  132. package/dist/http/submit-replay.d.ts +15 -8
  133. package/dist/http/submit-replay.js +6 -0
  134. package/dist/http/wire-types.d.ts +7 -9
  135. package/dist/index.d.ts +1 -1
  136. package/dist/index.js +1 -1
  137. package/dist/internal-run-env.d.ts +30 -0
  138. package/dist/internal-run-env.js +11 -0
  139. package/dist/leader/wire.js +3 -2
  140. package/dist/lsp/manager.js +1 -1
  141. package/dist/memory-scope.d.ts +19 -7
  142. package/dist/memory-scope.js +25 -8
  143. package/dist/observability/fail-open.d.ts +31 -3
  144. package/dist/observability/fail-open.js +31 -3
  145. package/dist/observability/metrics.d.ts +0 -1
  146. package/dist/observability/metrics.js +1 -4
  147. package/dist/observability/run-terminal.js +72 -4
  148. package/dist/permission-rule-vocab.d.ts +3 -2
  149. package/dist/permission-rule-vocab.js +1 -1
  150. package/dist/plan-cache-probe.d.ts +3 -2
  151. package/dist/plugins/approval-ask-store-sql.d.ts +1 -1
  152. package/dist/plugins/caching-session-store.d.ts +42 -22
  153. package/dist/plugins/caching-session-store.js +19 -9
  154. package/dist/plugins/checkpoint-store-sql.d.ts +42 -28
  155. package/dist/plugins/checkpoint-store-sql.js +57 -11
  156. package/dist/plugins/file-run-store.d.ts +25 -21
  157. package/dist/plugins/file-run-store.js +70 -34
  158. package/dist/plugins/k8s-exec-protocol.js +3 -0
  159. package/dist/plugins/local-checkpoint-store.d.ts +8 -5
  160. package/dist/plugins/local-checkpoint-store.js +5 -15
  161. package/dist/plugins/local-session-store.d.ts +66 -7
  162. package/dist/plugins/local-session-store.js +168 -101
  163. package/dist/plugins/mailbox-recipient-lifecycle.d.ts +1 -1
  164. package/dist/plugins/memory-run-store.d.ts +19 -3
  165. package/dist/plugins/memory-run-store.js +38 -3
  166. package/dist/plugins/one-time-migrations.d.ts +165 -39
  167. package/dist/plugins/one-time-migrations.js +51 -144
  168. package/dist/plugins/pg-pool.js +11 -1
  169. package/dist/plugins/pg-session-storage.d.ts +2 -0
  170. package/dist/plugins/pg-session-storage.js +9 -5
  171. package/dist/plugins/remote-env-adb.d.ts +3 -0
  172. package/dist/plugins/remote-env-adb.js +1 -0
  173. package/dist/plugins/remote-env-device.d.ts +3 -0
  174. package/dist/plugins/remote-env-device.js +1 -0
  175. package/dist/plugins/remote-env-e2b.d.ts +4 -0
  176. package/dist/plugins/remote-env-e2b.js +2 -1
  177. package/dist/plugins/remote-env-host.d.ts +23 -1
  178. package/dist/plugins/remote-env-host.js +20 -2
  179. package/dist/plugins/remote-env-k8s.d.ts +264 -41
  180. package/dist/plugins/remote-env-k8s.js +551 -82
  181. package/dist/plugins/remote-env-local-docker.d.ts +4 -0
  182. package/dist/plugins/remote-env-local-docker.js +2 -1
  183. package/dist/plugins/remote-env-ssh.d.ts +3 -0
  184. package/dist/plugins/remote-env-ssh.js +1 -0
  185. package/dist/plugins/retention-store-sql.d.ts +4 -1
  186. package/dist/plugins/retention-store-sql.js +11 -9
  187. package/dist/plugins/run-store-sql.d.ts +44 -6
  188. package/dist/plugins/run-store-sql.js +92 -27
  189. package/dist/plugins/session-capture-record-store-sql.d.ts +2 -3
  190. package/dist/plugins/session-store.d.ts +4 -3
  191. package/dist/plugins/session-store.js +1 -1
  192. package/dist/plugins/sql-driver.d.ts +2 -1
  193. package/dist/plugins/store-backend.d.ts +12 -5
  194. package/dist/plugins/store-backend.js +13 -4
  195. package/dist/plugins/store-contracts.d.ts +20 -3
  196. package/dist/plugins/store-open-wait.js +3 -0
  197. package/dist/plugins/tidb-pool.js +15 -3
  198. package/dist/plugins/tidb-session-storage.js +3 -2
  199. package/dist/plugins/tidb-session-store.d.ts +2 -0
  200. package/dist/plugins/tidb-session-store.js +6 -2
  201. package/dist/request-key-closure.d.ts +32 -7
  202. package/dist/request-key-closure.js +25 -9
  203. package/dist/router/route-orchestration.d.ts +3 -11
  204. package/dist/router/route-orchestration.js +0 -4
  205. package/dist/rule-entry-list.js +0 -4
  206. package/dist/rules-consent.js +3 -0
  207. package/dist/run-acceptance.d.ts +51 -0
  208. package/dist/run-acceptance.js +27 -0
  209. package/dist/run-local.d.ts +5 -4
  210. package/dist/run-local.js +23 -17
  211. package/dist/runs.d.ts +7 -11
  212. package/dist/runs.js +6 -16
  213. package/dist/sandbox-egress-policy.d.ts +61 -0
  214. package/dist/sandbox-egress-policy.js +235 -0
  215. package/dist/security.d.ts +7 -0
  216. package/dist/security.js +5 -0
  217. package/dist/server-secret-env.d.ts +10 -4
  218. package/dist/server-secret-env.js +4 -1
  219. package/dist/session-error-wire.d.ts +2 -2
  220. package/dist/session-incarnation.d.ts +46 -2
  221. package/dist/session-incarnation.js +14 -3
  222. package/dist/session-sync-kernel.d.ts +10 -3
  223. package/dist/session-titler.d.ts +5 -3
  224. package/dist/spec-fields.d.ts +24 -8
  225. package/dist/spec-fields.js +21 -2
  226. package/dist/task-workflow.d.ts +6 -4
  227. package/dist/task-workflow.js +3 -2
  228. package/dist/tool-approval.d.ts +78 -6
  229. package/dist/tool-approval.js +7 -3
  230. package/dist/trace/core-keyset-guard.d.ts +6 -5
  231. package/dist/trace/engine-notice-wire.d.ts +26 -1
  232. package/dist/trace/engine-notice-wire.js +7 -2
  233. package/dist/trace/ledger-events.d.ts +9 -3
  234. package/dist/trace/ledger-sink.d.ts +7 -0
  235. package/dist/trace/ledger-sink.js +14 -4
  236. package/dist/trace/project.d.ts +57 -11
  237. package/dist/trace/project.js +54 -8
  238. package/dist/trace/self-minted-wire.d.ts +94 -2
  239. package/dist/trace/self-minted-wire.js +28 -0
  240. package/dist/trace/tool-output-media.d.ts +26 -0
  241. package/dist/trace/tool-output-media.js +57 -0
  242. package/dist/trace/wire-projection-faces.d.ts +7 -1
  243. package/dist/trace/wire-projection-faces.js +2 -1
  244. package/dist/web-admin-client/apply-effective.d.ts +13 -7
  245. package/dist/web-admin-client/apply-effective.js +11 -26
  246. package/dist/web-admin-client/apply-ledger.d.ts +2 -2
  247. package/dist/web-admin-client/candidate-gate.d.ts +39 -4
  248. package/dist/web-admin-client/candidate-gate.js +9 -2
  249. package/dist/web-admin-client/facade.d.ts +2 -2
  250. package/dist/web-admin-client/http-client.d.ts +3 -1
  251. package/dist/web-admin-client/http-client.js +4 -3
  252. package/dist/web-admin-client/read-warnings.d.ts +33 -5
  253. package/dist/web-admin-client/read-warnings.js +41 -6
  254. package/dist/web-admin-client/types.d.ts +11 -5
  255. package/dist/workspace-cache.d.ts +45 -0
  256. package/dist/workspace-cache.js +30 -0
  257. package/dist/workspace-space-commit.d.ts +116 -0
  258. package/dist/workspace-space-commit.js +117 -0
  259. package/dist/workspace-space.d.ts +75 -9
  260. package/dist/workspace-space.js +52 -1
  261. package/package.json +4 -4
  262. package/dist/boot/session-incarnation-seat.d.ts +0 -41
  263. package/dist/boot/session-incarnation-seat.js +0 -69
  264. package/dist/capabilities/code-review-council.d.ts +0 -49
  265. package/dist/capabilities/code-review-council.js +0 -111
  266. package/dist/capabilities/collab-wire.d.ts +0 -36
  267. package/dist/capabilities/collab-wire.js +0 -2
  268. package/dist/capabilities/collab-workflows.d.ts +0 -47
  269. package/dist/capabilities/collab-workflows.js +0 -90
  270. package/dist/capabilities/prompts/code-review.d.ts +0 -25
  271. package/dist/capabilities/prompts/code-review.js +0 -39
  272. package/dist/capabilities/prompts/team.d.ts +0 -10
  273. package/dist/capabilities/prompts/team.js +0 -6
  274. package/dist/capabilities/team.d.ts +0 -113
  275. package/dist/capabilities/team.js +0 -70
@@ -29,16 +29,16 @@ unset _self _hops _dir
29
29
  # <<< 自身目录
30
30
  # `.env` 文法(写口 envf_representable + envf_encode / 读口 envf_canonical_line)的唯一定义 —— 写读两半从这一处取判据。
31
31
  . "$HERE/lib/envf.sh"
32
- # 数据根归属(S-851)与「壳怎么接」的渲染(S-850)各一处定义;preflight / kube-up / cluster-up 读同一份。
32
+ # 数据根归属与「壳怎么接」的渲染各一处定义;preflight / kube-up / cluster-up 读同一份。
33
33
  . "$HERE/lib/dataroot.sh"
34
34
  . "$HERE/lib/shell-access.sh"
35
- # 取值旗的形(S-621):判据与词表(--profile / --users / --region / --git / --kube)的唯一定义;--help 的词表也从这里渲。
35
+ # 取值旗的形:判据与词表(--profile / --users / --region / --git / --kube)的唯一定义;--help 的词表也从这里渲。
36
36
  . "$HERE/lib/flagshape.sh"
37
37
  # 对象存储桶的唯一表(kube-up.sh / cluster-up.sh / smoke.sh 同读这一张)。
38
38
  . "$HERE/lib/buckets.sh"
39
39
  # 日志一律打到 stderr(stdout 留给 --interactive=json 的协议行)。定义在最前面:参数一解析完就要判形,那时下面的函数都还没定义。
40
40
  log() { printf '[sema-up] %s\n' "$*" >&2; }
41
- # 执行车道表的唯一读者(S-599)。定义在**最前面**:`--help` 的词表也从表渲(手抄的词表会在加一条
41
+ # 执行车道表的唯一读者。定义在**最前面**:`--help` 的词表也从表渲(手抄的词表会在加一条
42
42
  # 车道时静默分叉),而 `-h` 在参数循环里就被处理,那时后面的函数还没定义。
43
43
  lanes() { python3 "$HERE/lib/lanes.py" "$@"; }
44
44
  MODE_INTERACTIVE="tty" # tty | json | none(--yes)
@@ -148,14 +148,14 @@ if [ -n "$CONF" ]; then
148
148
  esac
149
149
  fi
150
150
 
151
- # ── 取值旗的形(S-621;判据与词表单一属主 lib/flagshape.sh)─────────────────────────────────────────────
151
+ # ── 取值旗的形(判据与词表单一属主 lib/flagshape.sh)─────────────────────────────────────────────
152
152
  # 一条规则:每只取值旗都过形判,在建任何目录、写任何文件之前(工作目录 ~/.sema-up/<project> 就建在这一段的下一行)。
153
153
  # 判的是**生效值**:命令行旗 ∪ -f 配置(env 形的 -f 在命令行之后 source,同名变量盖过旗 ⇒ 称呼里连变量名一起报)。
154
154
  # bool / enum 的空 = 没给(走缺省或询问);命令行上写了 `--旗=` 却没给值 ⇒ 不是没给,照判(空串不在任何闭集里)。
155
155
  # 交互答案由 ask() 判(必须是那道题的选项之一)。自由文本旗(URL / 镜像引用 / 路径 / 凭据 / 模型 id)不判,盘点见 README。
156
156
  _empty_flags=" "; for a in "$@"; do case "$a" in --*=) _empty_flags="$_empty_flags${a%=} " ;; esac; done
157
157
  flag_given() { case "$_empty_flags" in *" $1 "*) return 0 ;; esac; [ -n "$2" ]; }
158
- # 项目名是 compose 项目名,也是工作目录与自动数据根的一段路径(S-851):`..` / `/` / 空串会把两者指到别处。
158
+ # 项目名是 compose 项目名,也是工作目录与自动数据根的一段路径:`..` / `/` / 空串会把两者指到别处。
159
159
  flag_project "--project(PROJECT)" "$PROJECT"
160
160
  if flag_given --profile "$PROFILE"; then flag_enum "--profile(PROFILE)" "$PROFILE" $FLAG_WORDS_PROFILE; fi
161
161
  if flag_given --users "$USERS"; then flag_enum "--users(USERS)" "$USERS" $FLAG_WORDS_USERS; fi
@@ -182,8 +182,8 @@ flag_bool "--teardown-volumes(TEARDOWN_VOLUMES)" "$TEARDOWN_VOLUMES"
182
182
  flag_bool "--skip-preflight(SKIP_PREFLIGHT)" "$SKIP_PREFLIGHT"
183
183
  flag_enum "--interactive=json / --yes(MODE_INTERACTIVE)" "$MODE_INTERACTIVE" $FLAG_WORDS_INTERACTIVE
184
184
  WORK="$HOME/.sema-up/$PROJECT"; mkdir -p "$WORK"; chmod 700 "$HOME/.sema-up" "$WORK"
185
- # 凭据/配置文件的坐标(S-599 提到这里:车道决策要在模型面之前读既有 .env)。**读写原语全在 lib/envf.sh**
186
- # (envf_get / envf_has / envf_load / envf_put / setk / setk_new / resetk,S-618):决策键严格读口、写口序列化、
185
+ # 凭据/配置文件的坐标(提到这里:车道决策要在模型面之前读既有 .env)。**读写原语全在 lib/envf.sh**
186
+ # (envf_get / envf_has / envf_load / envf_put / setk / setk_new / resetk):决策键严格读口、写口序列化、
187
187
  # 数据版回读都是那一处的同一套文法;本脚本只调用,不再自带任何一份。物理行假设由 up 之前的
188
188
  # `reconcile_render`(`docker compose config` 渲染对账,compose 唯一属主)兜底。
189
189
  ENVF="$WORK/.env"
@@ -194,7 +194,7 @@ ENVF="$WORK/.env"
194
194
  deploy_fact() {
195
195
  local k="$1" fenv fsh shsrc shset
196
196
  fenv="$(envf_get "$k")" || exit 1
197
- # C(S-618):shell **导出为空串** ≠ shell 未设。compose 插值里 shell(即便是空串)优先于 --env-file,
197
+ # shell **导出为空串** ≠ shell 未设。compose 插值里 shell(即便是空串)优先于 --env-file,
198
198
  # 所以导出空会**盖掉** .env 的值 —— 必须按「有值 = 空」参与冲突判定,不许当缺席。`${k+x}` 区分两者。
199
199
  if eval "[ \"\${$k+x}\" = x ]"; then shset=1; eval "fsh=\"\${$k}\""; else shset=0; fsh=""; fi
200
200
  shsrc="${CONF:+-f $CONF / }shell 环境"
@@ -236,13 +236,13 @@ dc_argv() {
236
236
  }
237
237
  dc() { dc_argv; "${DC_ARGV[@]}" "$@"; }
238
238
  # compose 的全局参数(-p / --env-file / -f)只在这里拼一次(相对 `$HERE/stack`):up / config 走 compose()、teardown 的
239
- # down、渲染对账给运维的复现命令,都从同一张 COMPOSE_GLOBALS 取(S-646 ④:复现命令曾是手抄的第二份,漏了
239
+ # down、渲染对账给运维的复现命令,都从同一张 COMPOSE_GLOBALS 取(复现命令曾是手抄的第二份,漏了
240
240
  # -f compose.dataroot.yaml 与 profile;teardown 是第三份)。数据根由调用方先定好 DATA_ROOT。
241
241
  compose_globals() {
242
242
  COMPOSE_GLOBALS=(--project-name "$PROJECT" --env-file "$ENVF" -f compose.yaml)
243
243
  if [ -n "$DATA_ROOT" ]; then COMPOSE_GLOBALS+=(-f compose.dataroot.yaml); fi
244
244
  }
245
- # compose 路径的「壳接入」(S-850):引擎口在这台机的回环上直连,别的机器 ssh 隧道到它的回环。dry-run 计划与汇总调同一只;
245
+ # compose 路径的「壳接入」:引擎口在这台机的回环上直连,别的机器 ssh 隧道到它的回环。dry-run 计划与汇总调同一只;
246
246
  # 文本与 json 两形的接法同源(lib/shell-access.sh 渲)。<端口> = 这台部署真会用的引擎口。
247
247
  compose_shell_access_text() {
248
248
  shell_access_text "$ENVF" "引擎这台机上:" "" "http://127.0.0.1:$1" \
@@ -304,7 +304,7 @@ ask() {
304
304
  log "⛔ 选项 $ans 在本机不可行:${infpart%%|*};建议:${infpart#*|}"; exit 1
305
305
  fi
306
306
  done
307
- # 有选项的题,答案必须是选项之一(S-621,与取值旗同一条规则:不在闭集里的词一律拒,不会落进「别的那一臂」)。
307
+ # 有选项的题,答案必须是选项之一(与取值旗同一条规则:不在闭集里的词一律拒,不会落进「别的那一臂」)。
308
308
  # 没有选项的题(网关 / 模型 id / 地址 / 凭据)是自由文本。
309
309
  if [ "$#" -gt 0 ]; then
310
310
  local hit=false words=""
@@ -320,7 +320,7 @@ emit() { [ "$MODE_INTERACTIVE" = "json" ] && printf '%s\n' "$1" >&3 || log "$2";
320
320
  if $TEARDOWN; then
321
321
  cd "$HERE/stack"
322
322
  if [ -f "$ENVF" ]; then
323
- # 读 .env 一律经 lib 的严格读口(S-618 续):裸 grep|cut 会连编码形的单引号一起读出来。
323
+ # 读 .env 一律经 lib 的严格读口:裸 grep|cut 会连编码形的单引号一起读出来。
324
324
  # 数据根以 .env 登记的为准(卸载的是首装那一份,不看本次 --data-root);全局参数与 up 同一张表(compose_globals)。
325
325
  DATA_ROOT="$(envf_get DATA_ROOT_DIR)" || exit 1
326
326
  # 全 profile down 会对未启用服务也做 config 校验——.env 缺 SEMA_*_IMAGE(该面没开过)时
@@ -336,7 +336,7 @@ if $TEARDOWN; then
336
336
  fi
337
337
  log "已卸载 project=$PROJECT $($TEARDOWN_VOLUMES && echo '(含数据卷)' || echo '(数据卷保留:pgdata/miniodata/registrydata/gitdata)')"
338
338
  if $TEARDOWN_VOLUMES && [ -n "$DATA_ROOT" ]; then
339
- # 删不删盘上文件看这条根归谁(S-851:标记是别的项目 / 没有标记 ⇒ 不教 rm -rf)。
339
+ # 删不删盘上文件看这条根归谁(标记是别的项目 / 没有标记 ⇒ 不教 rm -rf)。
340
340
  dataroot_teardown_hint "$DATA_ROOT"
341
341
  fi
342
342
  else log "没有找到 $ENVF,无可卸载"; fi
@@ -354,18 +354,18 @@ fi
354
354
  "local-plus:本机只跑 agent,连一个已经部署好的 data-center 数据面")
355
355
  # ── 两个决策(租户形 / 车道)同一条规则:决策 = 显式旗 ∨ 部署事实 ∨ 表缺省 ─────────────────────
356
356
  # 「部署事实」= 同一只 `$WORK/.env`:compose 的 agent 档由本脚本写,full-cluster 由 kube-up / cluster-up 在写凭据的同一处
357
- # 写(S-600;修前 kube 两条路径不落这条事实 ⇒ 不带旗重跑拿缺省 single 把多租部署降回单用户);data-center 不起 agent。事实 → 决策词只经属主翻译,本脚本不抄第二份:
357
+ # 写(修前 kube 两条路径不落这条事实 ⇒ 不带旗重跑拿缺省 single 把多租部署降回单用户);data-center 不起 agent。事实 → 决策词只经属主翻译,本脚本不抄第二份:
358
358
  # · REQUIRE_PRINCIPAL → --users:只认 sema-up 自己写出的两形 true / false(别的写法 ⇒ 拒;不复刻 server 的布尔词表);
359
359
  # · REMOTE_EXEC → --sandbox:`lanes choice-of`(车道表是唯一属主;表里没有的落盘值 ⇒ 拒并列在役词),见车道块。
360
360
  # 不带旗重跑 ⇒ 沿用事实(多租部署重跑不必再带 --users=multi);显式旗与事实不一致 ⇒ fact_conflict 拒并点名两处。
361
361
  # 🔴 为什么缺省不能先于事实(合并复审两条真案):把表缺省当成意图去和事实比,合法的无旗重跑就被拒;
362
362
  # 反过来若只比不拒,保留的多租 `.env` 在缺省 single 下会被车道表判成 host —— 容器拿到 REQUIRE_PRINCIPAL=true ∧ host。
363
- # 租户形 ⇒ 容器上 REQUIRE_PRINCIPAL 的值:`principal_of_users`(lib/flagshape.sh,三只脚本共用的唯一定义;S-600 起 kube-up /
363
+ # 租户形 ⇒ 容器上 REQUIRE_PRINCIPAL 的值:`principal_of_users`(lib/flagshape.sh,三只脚本共用的唯一定义;kube-up /
364
364
  # cluster-up 也调它)。正向(生成段 setk、事实核对)与反向(事实 → --users 缺省)都经它:反向是拿两个租户词逐个过这只函数去比,
365
365
  # 不另写一张反表(与车道的 `lanes choice-of` 同一姿势)。
366
366
  USERS_DEF="single" RP_FACT="" RP_FACT_SRC=""
367
367
  case "$PROFILE" in
368
- # S-600:full-cluster 也读 —— kube-up / cluster-up 在写凭据的同一处把 REQUIRE_PRINCIPAL 落进同一只 .env(它们自己
368
+ # full-cluster 也读 —— kube-up / cluster-up 在写凭据的同一处把 REQUIRE_PRINCIPAL 落进同一只 .env(它们自己
369
369
  # 单独跑时也按同一条规则判,见 lib/flagshape.sh 的 users_decide)。
370
370
  full-single|local-plus|full-cluster)
371
371
  deploy_fact REQUIRE_PRINCIPAL; RP_FACT="$FACT_VAL" RP_FACT_SRC="$FACT_SRC"
@@ -403,7 +403,7 @@ if [ "$GIT_MODE" = "connect" ]; then
403
403
  [ -z "$GIT_TOKEN" ] && { [ "$MODE_INTERACTIVE" = "none" ] && { log "⛔ --git=connect 需要 --git-token(该服务的 access token)"; exit 1; } || GIT_TOKEN=$(ask git_token "该服务的 access token?" "" "验证连通用;Gitea 还会用它自动建 OAuth 登录应用"); }
404
404
  fi
405
405
 
406
- # ── 执行车道(S-599;单一属主 = lib/lanes.json,本脚本里零车道词字面量)──────────────────────
406
+ # ── 执行车道(单一属主 = lib/lanes.json,本脚本里零车道词字面量)──────────────────────
407
407
  # 病:compose 路径的 `kata` / `runc` 对**执行运行时零接线**(有 KVM 时 kata 还是默认值)⇒ .env 里
408
408
  # 压根不出现 `REMOTE_EXEC` ⇒ core 落 StubExecutionEnv ⇒ 起来的 worker 一只手都没有,而三条部署
409
409
  # 路径没有任何一处会红。现在:词表 / 默认 / 退役指路 / 落 .env 的键值**全部**从表渲,拒一律非零退出。
@@ -486,7 +486,7 @@ if [ "$PROFILE" = "full-cluster" ]; then
486
486
  machines)
487
487
  [ "${MACHINE_COUNT:-0}" -ge 1 ] || { log "⛔ --kube=machines 需要 -f machines.yaml(机器清单);模板见 deploy/sema-up/machines.example.yaml"; exit 1; }
488
488
  $DRY_RUN && { log "dry-run:将经 cluster-up.sh 对 ${MACHINE_COUNT} 台机器做 k3s HA 装配(ssh)+ helm/render 装栈(users=$USERS);不执行"; exit 0; }
489
- # S-600:租户形交给 cluster-up(修前不传 ⇒ 这条路径上的主 worker 恒单用户姿态,--users=multi 被静默丢)。
489
+ # 租户形交给 cluster-up(修前不传 ⇒ 这条路径上的主 worker 恒单用户姿态,--users=multi 被静默丢)。
490
490
  WORK="$WORK" REGION="$REGION" PROJECT="$PROJECT" USERS="$USERS" \
491
491
  MODEL_GATEWAY_BASEURL="$GATEWAY" MODEL_ID="$MODEL" MODEL_API_KEY="${MODEL_KEY:-${MODEL_API_KEY:-}}" \
492
492
  exec "$HERE/cluster-up.sh"
@@ -565,13 +565,13 @@ if [ "$REGION" = "auto" ]; then
565
565
  REGION=$(awk -v a="$t_cn" -v b="$t_gl" 'BEGIN{print (a<b)?"cn":"global"}')
566
566
  fi
567
567
  HOSTIP=$(host_ip)
568
- # E(S-618):进度日志只打**已校验的决策词**,不回显未过校验的原始输入(曾把带标记的 --registry 值抢先泄进 stderr,
569
- # test srv796 实测 NEW-5)。7.104.0 起(S-621)REGISTRY_ENABLED 在建工作目录之前已过形判(只会是 true / false,或空 =
568
+ # 进度日志只打**已校验的决策词**,不回显未过校验的原始输入(曾把带标记的 --registry 值抢先泄进 stderr,
569
+ # test srv796 实测 NEW-5)。7.104.0 起REGISTRY_ENABLED 在建工作目录之前已过形判(只会是 true / false,或空 =
570
570
  # 走档位缺省,缺省在上面已落定),registry 仍收成 on/off 决策词。region/profile/users/lane/git 到这里都已定死
571
571
  # (形判在参数解析之后、交互答案在 ask() 里、车道在车道块)。
572
572
  log "region=$REGION profile=$PROFILE users=$USERS sandbox=${SANDBOX_LANE:-n/a} lane=${LANE_REMOTE_EXEC:-n/a} registry=$([ "$REGISTRY_ENABLED" = "true" ] && echo on || echo off) git=$GIT_MODE"
573
573
 
574
- # ── 数据根(S-851:一条规则 —— 数据根归一个项目所有;判据全在 lib/dataroot.sh)───────────────────────────
574
+ # ── 数据根(一条规则 —— 数据根归一个项目所有;判据全在 lib/dataroot.sh)───────────────────────────
575
575
  # 取哪条根:`.env` 首装值(已装的项目不漂移,不搬数据)∨ --data-root / -f 的 DATA_ROOT ∨ 多盘机自动选大容量盘
576
576
  # (<盘>/sema-data/<project>;macOS 不自动 —— bind 要经 VM 挂载,显式给了才用)。换盘 = 先 --teardown-volumes 迁数据,
577
577
  # 删掉 .env 的 DATA_ROOT_DIR 行,再带新 --data-root 重装。
@@ -707,7 +707,7 @@ if [ "$PROFILE" = "full-single" ] || [ "$PROFILE" = "local-plus" ]; then
707
707
  setk REQUIRE_PRINCIPAL "$REQUIRE_PRINCIPAL_WANT"
708
708
  setk SANDBOX_PKG_SOURCE "$([ "$REGION" = "global" ] && echo global || echo '')"
709
709
  [ -n "${SEMA_SERVER_IMAGE:-}" ] && setk SEMA_SERVER_IMAGE "$SEMA_SERVER_IMAGE"
710
- # 执行车道落 .env(S-599:从上面 `lanes resolve` 的结果渲,脚本里零车道词)。
710
+ # 执行车道落 .env(从上面 `lanes resolve` 的结果渲,脚本里零车道词)。
711
711
  # **resetk 不是 setk**:`setk` 见键在就不改,而升级路径上最常见的既有值恰是空串 `REMOTE_EXEC=`
712
712
  # (旧 compose 的 `${REMOTE_EXEC:-}` 渲出来的)——用 setk 就永远修不好那批无手部署。冲突检测在
713
713
  # 上面的车道块里已做过(非空且不同 ⇒ 早已拒),所以这里的重写只会落在「空串 / 同值」两种情形上。
@@ -781,13 +781,13 @@ elif [ "$GIT_MODE" = "connect" ]; then
781
781
  fi
782
782
 
783
783
  # DATA_ROOT 落定(根在上面「数据根」块里已定、已判归属;首装写 .env 后为准 —— 重跑换值会造出一套空卷,数据看似丢失)。
784
- # 首装值经严格读口解码回读(S-618 续:路径含空格时写口落整值单引号形)。建根 / 卷目录 / 写项目标记都在 dataroot_settle 里。
784
+ # 首装值经严格读口解码回读(路径含空格时写口落整值单引号形)。建根 / 卷目录 / 写项目标记都在 dataroot_settle 里。
785
785
  if [ -n "$DATA_ROOT" ]; then
786
786
  [ -n "$_stored" ] || setk DATA_ROOT_DIR "$DATA_ROOT"
787
787
  dataroot_settle "$DATA_ROOT"
788
788
  fi
789
789
 
790
- # A(S-618):`.env` 生成完毕 —— 把 setk 持久化的**生效端口**回读进 shell 变量(替代旧 source 的这半)。
790
+ # `.env` 生成完毕 —— 把 setk 持久化的**生效端口**回读进 shell 变量(替代旧 source 的这半)。
791
791
  # 重跑省略端口旗时,容器绑定的是首装端口(.env),本脚本后续的 API 调用 / 健康检查 / 汇总必须用同一份;
792
792
  # 首装(或 .env 无该键)时回读跳过、保留 shell 缺省。凭据在各自用点单独回读(见下 envf_load)。
793
793
  envf_load SERVER_PORT PG_PORT MINIO_PORT MINIO_CONSOLE_PORT REGISTRY_PORT GIT_HTTP_PORT GIT_SSH_PORT
@@ -797,7 +797,7 @@ compose() { compose_globals; ( cd "$HERE/stack" && dc "${COMPOSE_GLOBALS[@]}" "$
797
797
  # shq —— 单引号引用一个词(复现命令要能原样粘贴:路径里可能有空格)。
798
798
  shq() { printf "'%s'" "$(printf '%s' "$1" | sed "s/'/'\\\\''/g")"; }
799
799
 
800
- # ── D:渲染对账(S-618 的类闭环;生成 .env 之后、compose up 之前)──────────────────────────────────
800
+ # ── 渲染对账(生成 .env 之后、compose up 之前)──────────────────────────────────
801
801
  # .env 的写口 / 读口都按物理行判,认不出 compose dotenv 的跨行引号值等边角;唯一能确知「容器真正拿到
802
802
  # 什么」的是 compose 自己。所以在 up 之前跑一次 `compose config`——与 up **同一组 -f / profile / 同一 shell
803
803
  # 环境**(于是运维导出的空串等也算进来)——从渲染结果取 agent 服务的 REQUIRE_PRINCIPAL / REMOTE_EXEC /
@@ -805,7 +805,7 @@ shq() { printf "'%s'" "$(printf '%s' "$1" | sed "s/'/'\\\\''/g")"; }
805
805
  # docker 不可达在上面 `command -v docker` 那道已 fail-loud 拦下;config 本身失败(YAML/插值坏)也拒,
806
806
  # 不新铸降级臂:未经对账就不 up。只有 agent 面有这三个决策键,别的档跳过。
807
807
  #
808
- # 拒因分两种、各给各的出路(S-656;7.98.0 曾把 stderr 并进 stdout 当 JSON 解析 ⇒ compose 的任何警告都让它 traceback,
808
+ # 拒因分两种、各给各的出路(7.98.0 曾把 stderr 并进 stdout 当 JSON 解析 ⇒ compose 的任何警告都让它 traceback,
809
809
  # 拒因还冒充「不一致」):
810
810
  # · 渲染结果解析失败 —— compose 退出码非零,或退出 0 但 stdout 不是可解析的 compose JSON:没拿到渲染值,谈不上比对;
811
811
  # · 渲染值与决策值不一致 —— 拿到了、逐值比对不上。
@@ -887,7 +887,7 @@ GIT_MANUAL_NOTES=()
887
887
  if [ "$GIT_MODE" = "provision" ]; then
888
888
  log "git 面:先起 Gitea(引导管理员/token/OAuth 要在 registry 之前)"
889
889
  COMPOSE_PROFILES=git compose up -d --wait git || { log "⛔ Gitea 起不来。下一步:docker compose -p $PROJECT logs git;镜像拉不动时 --gitea-image=<可达镜像仓>/gitea:1.24"; exit 1; }
890
- # A(S-618):不 source .env —— 回读 sema-up 自己生成、没进 shell 变量的凭据(管理员账号/口令)。
890
+ # 不 source .env —— 回读 sema-up 自己生成、没进 shell 变量的凭据(管理员账号/口令)。
891
891
  envf_load GIT_ADMIN_USER GIT_ADMIN_PASSWORD
892
892
  GIT_CTR="${PROJECT}-git-1"
893
893
  GIT_API="http://127.0.0.1:${GIT_HTTP_PORT}/api/v1"
@@ -910,7 +910,7 @@ except Exception: print("")')
910
910
  [ -n "$TOK" ] || { log "⛔ Gitea access token 生成失败。下一步:curl -u <admin> $GIT_API/users/$GIT_ADMIN_USER/tokens 手查;或看 docker compose -p $PROJECT logs git"; exit 1; }
911
911
  setk GIT_ADMIN_TOKEN "$TOK"
912
912
  fi
913
- envf_load GIT_ADMIN_TOKEN # A:回读刚生成/已存的 token,不 source .env
913
+ envf_load GIT_ADMIN_TOKEN # 回读刚生成/已存的 token,不 source .env
914
914
  # OAuth 接线只对它被创建时的 git 目标有效(锚 = REGISTRY_GITEA_BASE_URL):目标变了 ⇒ 上一目标的接线作废、
915
915
  # 本次重建(建不成 = registry 走表单登录),不把旧身份源静默带进这一次(车MH codex r2 [high],两条路径同一条规则)。
916
916
  envf_invalidate_unless REGISTRY_GITEA_BASE_URL "http://$HOSTIP:$GIT_HTTP_PORT" REGISTRY_GITEA_OAUTH_ID REGISTRY_GITEA_OAUTH_SECRET
@@ -937,7 +937,7 @@ except Exception: print("")')
937
937
  fi
938
938
  fi
939
939
  elif [ "$GIT_MODE" = "connect" ]; then
940
- # A(S-618):不 source .env —— GIT_URL / GIT_TOKEN 就是本次命令行/‑f 传进来的 shell 变量,直接用。
940
+ # 不 source .env —— GIT_URL / GIT_TOKEN 就是本次命令行/‑f 传进来的 shell 变量,直接用。
941
941
  # (旧代码 source 是历史遗留:那时 source 会拿 .env 旧值盖掉命令行新值,故先 resetk 再 source 找回;
942
942
  # 不 source 之后新值本就在 shell 里,连这道找回都不需要了。)
943
943
  # 连通验证(fail-loud:接不上就别继续,别部署完才发现 git 面是死的)。
@@ -1004,12 +1004,12 @@ except Exception: print("")')
1004
1004
  fi
1005
1005
 
1006
1006
  # ── 装配(Layer 1 compose;profiles 映射形态) ────────────────────────────────────────────────
1007
- # D(S-618):up 之前先 `compose config` 渲染对账 —— 容器真正拿到的决策键与本次决策逐值对齐才 up。
1007
+ # up 之前先 `compose config` 渲染对账 —— 容器真正拿到的决策键与本次决策逐值对齐才 up。
1008
1008
  reconcile_render
1009
1009
  log "装配:docker compose profiles=$COMPOSE_PROFILES project=$PROJECT"
1010
1010
  # 建桶(幂等,一次性动作归 Layer 0;只对本地 MinIO——外接 S3 已在连接检测时确保)。🔴 排在**全栈 up 之前**:引擎起服会核快照桶在不在
1011
1011
  # (缺则拒启),而 `up --wait` 要等引擎健康 —— 桶建在 up 之后,新数据卷上就是引擎等桶、compose 等引擎的互等。所以先只起 MinIO(`--wait` 等它健康)、建桶,再起全栈。
1012
- envf_load MINIO_PASSWORD # A:回读生成的 MinIO 口令(建桶用),不 source .env
1012
+ envf_load MINIO_PASSWORD # 回读生成的 MinIO 口令(建桶用),不 source .env
1013
1013
  case ",$COMPOSE_PROFILES," in *,s3,*)
1014
1014
  COMPOSE_PROFILES="$COMPOSE_PROFILES" compose up -d --wait minio \
1015
1015
  || { log "⛔ MinIO 启动失败。下一步:docker compose -p $PROJECT logs minio(常见:镜像拉取失败→检查镜像引用/docker login)"; exit 1; }
@@ -1019,7 +1019,7 @@ COMPOSE_PROFILES="$COMPOSE_PROFILES" compose up -d --wait --remove-orphans \
1019
1019
  || { log "⛔ compose up 失败。下一步:docker compose -p $PROJECT logs(常见:镜像拉取失败→检查镜像引用/docker login;端口占用→--port 换口)"; exit 1; }
1020
1020
 
1021
1021
  # ── 验证(装后即验,§3d smoke 的子集;全量随时可跑 smoke.sh --project=$PROJECT)──────────────
1022
- # A:回读验证 / 汇总要用的凭据与登记值(不 source .env);缺的键回读成空,由下游 :- 缺省处置。
1022
+ # 回读验证 / 汇总要用的凭据与登记值(不 source .env);缺的键回读成空,由下游 :- 缺省处置。
1023
1023
  envf_load MINIO_PASSWORD REGISTRY_ADMIN_USER REGISTRY_ADMIN_PASSWORD REGISTRY_GITEA_BASE_URL GIT_ADMIN_USER GIT_ADMIN_PASSWORD
1024
1024
  V_PG="n/a" V_BK="n/a"
1025
1025
  case ",$COMPOSE_PROFILES," in *,pg,*)
@@ -1045,7 +1045,7 @@ fi
1045
1045
 
1046
1046
  # ── 汇总(凭据打印一次;文件 0600 常驻;一屏读完)────────────────────────────────────────────
1047
1047
  if [ "$MODE_INTERACTIVE" = "json" ]; then
1048
- # 整行经 json.dumps 铸(S-850 同批):此前 printf 拼 JSON —— `health` 塞的是 /health 响应体的前 60 字节(自带双引号)、
1048
+ # 整行经 json.dumps 铸:此前 printf 拼 JSON —— `health` 塞的是 /health 响应体的前 60 字节(自带双引号)、
1049
1049
  # 路径 / URL 里的引号与反斜杠也不转义 ⇒ 带 agent 的档这一行恒不是合法 JSON(本批加 `shellAccess` 时红格读出)。
1050
1050
  # 键名与取值口径逐字不变;`buckets` 是数字时仍是 JSON 数字(没建桶的档是串 "n/a",此前那一形同样不合法);
1051
1051
  # `shellAccess` = 壳接入(没有引擎的档为 null)。
@@ -18,9 +18,9 @@ done
18
18
  HERE="$(cd "$(dirname "$_self")" && pwd)"
19
19
  unset _self _hops _dir
20
20
  # <<< 自身目录
21
- # `.env` 的文法与读原语只在 lib/envf.sh 定义(S-618 续):本脚本读 `.env` 只经 envf_load,不 source。
21
+ # `.env` 的文法与读原语只在 lib/envf.sh 定义:本脚本读 `.env` 只经 envf_load,不 source。
22
22
  . "$HERE/lib/envf.sh"
23
- # 取值旗的形(S-621):判据同 sema-up.sh 一处定义。
23
+ # 取值旗的形:判据同 sema-up.sh 一处定义。
24
24
  . "$HERE/lib/flagshape.sh"
25
25
  # 引擎 /health 体里「落在哪个后端」的读法与期望值(kube-up / cluster-up 的验收同一只)。
26
26
  . "$HERE/lib/health.sh"
@@ -44,7 +44,7 @@ fail() { printf '[FAIL] %s — %s\n ↳ 建议:%s\n' "$1" "$2" "$3"; FAILS=
44
44
  if [ -n "$PROJECT" ]; then
45
45
  ENVF="$HOME/.sema-up/$PROJECT/.env"
46
46
  [ -r "$ENVF" ] || { echo "找不到 $ENVF(先跑 sema-up.sh)"; exit 1; }
47
- # A(S-618 续):不 source .env(值里的 $() / 反引号 / ; 是数据,不是代码)—— 只经严格读口取本脚本用到的键;
47
+ # 不 source .env(值里的 $() / 反引号 / ; 是数据,不是代码)—— 只经严格读口取本脚本用到的键;
48
48
  # 读到非规范行(比如旧写口留下的裸 `$(…)`)⇒ 响亮拒并点名行号,不猜、不执行。
49
49
  envf_load SERVICE_AUTH_TOKEN DEPLOY_PROFILE SERVER_PORT MINIO_PASSWORD \
50
50
  AGENT_PG_HOST AGENT_PG_USER PG_PASSWORD AGENT_PG_PORT AGENT_PG_DATABASE AGENT_MINIO_ENDPOINT AGENT_MINIO_USER \
@@ -96,7 +96,7 @@ services:
96
96
  SANDBOX_PKG_SOURCE: ${SANDBOX_PKG_SOURCE:-}
97
97
  # 执行车道:值由 sema-up.sh 从 lib/lanes.json 渲进 .env(resetk,每次重写)。
98
98
  # `REQUIRE_EXECUTION_LANE` 缺省 true —— 手工起这份 compose 而没点名车道时,server 拒启
99
- # 并说「没有手」,而不是安静地起成一个什么都干不了的 worker(S-599)。
99
+ # 并说「没有手」,而不是安静地起成一个什么都干不了的 worker。
100
100
  REMOTE_EXEC: ${REMOTE_EXEC:-}
101
101
  REQUIRE_EXECUTION_LANE: ${REQUIRE_EXECUTION_LANE:-true}
102
102
  E2B_API_KEY: ${E2B_API_KEY:-}
@@ -92,7 +92,7 @@ kind: Service
92
92
  metadata: { name: sema-minio, namespace: sema }
93
93
  spec: { selector: { app: sema-minio }, ports: [{ name: s3, port: 9000 }, { name: console, port: 9001 }] }
94
94
  ---
95
- # ── 沙箱 lane RBAC(k8s+kata;测试机同款五动词)────────────────────────────────
95
+ # ── 沙箱 lane RBAC(k8s+kata;测试机同款五动词 + 缓存卷 + 出网自检两只只读)────────────────────────────────
96
96
  apiVersion: v1
97
97
  kind: ServiceAccount
98
98
  metadata: { name: sema-runner, namespace: sema-sandbox }
@@ -118,6 +118,14 @@ rules:
118
118
  - apiGroups: [""]
119
119
  resources: [pods/log]
120
120
  verbs: [get]
121
+ # 按工作区空间的构建缓存卷(WORKSPACE_CACHE=volume):连沙箱时按名读、没有就建;空间结束(会话删除 / 留存 sweep)按标签回收
122
+ - apiGroups: [""]
123
+ resources: [persistentvolumeclaims]
124
+ verbs: [get, create, delete, deletecollection]
125
+ # 起服的出网自检读本 ns 的 NetworkPolicy(只读)
126
+ - apiGroups: [networking.k8s.io]
127
+ resources: [networkpolicies]
128
+ verbs: [get, list]
121
129
  ---
122
130
  apiVersion: rbac.authorization.k8s.io/v1
123
131
  kind: RoleBinding
@@ -125,6 +133,21 @@ metadata: { name: sema-runner, namespace: sema-sandbox }
125
133
  roleRef: { apiGroup: rbac.authorization.k8s.io, kind: Role, name: sema-runner }
126
134
  subjects: [{ kind: ServiceAccount, name: sema-runner, namespace: sema-sandbox }]
127
135
  ---
136
+ # 出网自检读节点表(集群级对象 ⇒ ClusterRole;只读两动词)。与 chart 的 sandbox-rbac.yaml 同形。
137
+ apiVersion: rbac.authorization.k8s.io/v1
138
+ kind: ClusterRole
139
+ metadata: { name: sema-runner-nodes-sema-sandbox }
140
+ rules:
141
+ - apiGroups: [""]
142
+ resources: [nodes]
143
+ verbs: [get, list]
144
+ ---
145
+ apiVersion: rbac.authorization.k8s.io/v1
146
+ kind: ClusterRoleBinding
147
+ metadata: { name: sema-runner-nodes-sema-sandbox }
148
+ roleRef: { apiGroup: rbac.authorization.k8s.io, kind: ClusterRole, name: sema-runner-nodes-sema-sandbox }
149
+ subjects: [{ kind: ServiceAccount, name: sema-runner, namespace: sema-sandbox }]
150
+ ---
128
151
  # ── 引擎(3 副本跨机打散;镜像=节点预灌 sema-server:local,imagePullPolicy Never
129
152
  # ⚠ k3s-uninstall.sh 会连 containerd 镜像一起清,重装过的节点必须补灌)──────────
130
153
  apiVersion: v1
@@ -172,11 +195,11 @@ spec:
172
195
  - { name: MODEL_ID, value: "__MODEL_ID__" }
173
196
  - { name: MODEL_API_KEY, valueFrom: { secretKeyRef: { name: sema-server-env, key: MODEL_API_KEY } } }
174
197
  - { name: MODEL_VISION, value: "false" }
175
- # S-600:租户姿态与 chart 主 worker 同值(cluster-up 由 --users 渲:multi ⇒ true,否则 false);修前整块缺席 ⇒ 恒单用户
198
+ # 租户姿态与 chart 主 worker 同值(cluster-up 由 --users 渲:multi ⇒ true,否则 false);修前整块缺席 ⇒ 恒单用户
176
199
  - { name: REQUIRE_PRINCIPAL, value: "__REQUIRE_PRINCIPAL__" }
177
200
  - { name: SANDBOX_PKG_SOURCE, value: "__PKG_SOURCE__" }
178
201
  - { name: REMOTE_EXEC, value: k8s }
179
- # S-599:显式表态「这台有手」(车道被改没了 ⇒ 拒启,不是安静的无手 worker)
202
+ # 显式表态「这台有手」(车道被改没了 ⇒ 拒启,不是安静的无手 worker)
180
203
  - { name: REQUIRE_EXECUTION_LANE, value: "true" }
181
204
  - { name: K8S_API_URL, value: "https://kubernetes.default.svc" }
182
205
  - { name: K8S_INSECURE_TLS, value: "true" }
@@ -83,11 +83,13 @@ export declare const RuleOfferSchema: z.ZodUnion<readonly [z.ZodObject<{
83
83
  match: z.ZodEnum<{
84
84
  name: "name";
85
85
  path: "path";
86
+ host: "host";
86
87
  exact: "exact";
87
88
  prefix: "prefix";
88
89
  wildcard: "wildcard";
89
90
  subpath: "subpath";
90
91
  name_prefix: "name_prefix";
92
+ subdomain: "subdomain";
91
93
  }>;
92
94
  command: z.ZodString;
93
95
  }, z.core.$strict>, z.ZodObject<{
@@ -98,11 +100,13 @@ export declare const RuleOfferSchema: z.ZodUnion<readonly [z.ZodObject<{
98
100
  match: z.ZodEnum<{
99
101
  name: "name";
100
102
  path: "path";
103
+ host: "host";
101
104
  exact: "exact";
102
105
  prefix: "prefix";
103
106
  wildcard: "wildcard";
104
107
  subpath: "subpath";
105
108
  name_prefix: "name_prefix";
109
+ subdomain: "subdomain";
106
110
  }>;
107
111
  command: z.ZodString;
108
112
  segment: z.ZodString;
@@ -164,11 +168,13 @@ export declare const RuleOfferRawSchema: z.ZodUnion<readonly [z.ZodObject<{
164
168
  match: z.ZodEnum<{
165
169
  name: "name";
166
170
  path: "path";
171
+ host: "host";
167
172
  exact: "exact";
168
173
  prefix: "prefix";
169
174
  wildcard: "wildcard";
170
175
  subpath: "subpath";
171
176
  name_prefix: "name_prefix";
177
+ subdomain: "subdomain";
172
178
  }>;
173
179
  command: z.ZodString;
174
180
  }, z.core.$strip>, z.ZodObject<{
@@ -179,11 +185,13 @@ export declare const RuleOfferRawSchema: z.ZodUnion<readonly [z.ZodObject<{
179
185
  match: z.ZodEnum<{
180
186
  name: "name";
181
187
  path: "path";
188
+ host: "host";
182
189
  exact: "exact";
183
190
  prefix: "prefix";
184
191
  wildcard: "wildcard";
185
192
  subpath: "subpath";
186
193
  name_prefix: "name_prefix";
194
+ subdomain: "subdomain";
187
195
  }>;
188
196
  command: z.ZodString;
189
197
  segment: z.ZodString;
@@ -617,11 +625,13 @@ export declare const ApprovalCardSchema: z.ZodObject<{
617
625
  match: z.ZodEnum<{
618
626
  name: "name";
619
627
  path: "path";
628
+ host: "host";
620
629
  exact: "exact";
621
630
  prefix: "prefix";
622
631
  wildcard: "wildcard";
623
632
  subpath: "subpath";
624
633
  name_prefix: "name_prefix";
634
+ subdomain: "subdomain";
625
635
  }>;
626
636
  command: z.ZodString;
627
637
  }, z.core.$strict>, z.ZodObject<{
@@ -632,11 +642,13 @@ export declare const ApprovalCardSchema: z.ZodObject<{
632
642
  match: z.ZodEnum<{
633
643
  name: "name";
634
644
  path: "path";
645
+ host: "host";
635
646
  exact: "exact";
636
647
  prefix: "prefix";
637
648
  wildcard: "wildcard";
638
649
  subpath: "subpath";
639
650
  name_prefix: "name_prefix";
651
+ subdomain: "subdomain";
640
652
  }>;
641
653
  command: z.ZodString;
642
654
  segment: z.ZodString;
@@ -695,8 +707,8 @@ export declare const ApprovalCardSchema: z.ZodObject<{
695
707
  }, z.core.$strict>>>;
696
708
  personalRuleDotsAbsent: z.ZodOptional<z.ZodCustom<AskEvidenceAbsence, AskEvidenceAbsence>>;
697
709
  }, z.core.$strict>>;
698
- askClass: z.ZodOptional<z.ZodCustom<"mode" | "hook" | "org_rule" | "write_protection" | "write_protection_unresolved" | "content_question" | "ask_rule" | "denial_limit_fallback" | "ancestor" | "dangerous_delete" | "unverifiable_delete" | "transcript_write" | "governance_unavailable" | "rule_unreadable" | "classifier_no_ruling" | "requires_user_interaction" | "operator_forced" | "shell_floor" | "probe" | "tool_marks_mcp" | "tool_marks_a2a" | "policy_rra" | "artifact_shared_read" | "unstated" | "ordinary", "mode" | "hook" | "org_rule" | "write_protection" | "write_protection_unresolved" | "content_question" | "ask_rule" | "denial_limit_fallback" | "ancestor" | "dangerous_delete" | "unverifiable_delete" | "transcript_write" | "governance_unavailable" | "rule_unreadable" | "classifier_no_ruling" | "requires_user_interaction" | "operator_forced" | "shell_floor" | "probe" | "tool_marks_mcp" | "tool_marks_a2a" | "policy_rra" | "artifact_shared_read" | "unstated" | "ordinary">>;
699
- classes: z.ZodOptional<z.ZodArray<z.ZodCustom<"mode" | "hook" | "org_rule" | "write_protection" | "write_protection_unresolved" | "content_question" | "ask_rule" | "denial_limit_fallback" | "ancestor" | "dangerous_delete" | "unverifiable_delete" | "transcript_write" | "governance_unavailable" | "rule_unreadable" | "classifier_no_ruling" | "requires_user_interaction" | "operator_forced" | "shell_floor" | "probe" | "tool_marks_mcp" | "tool_marks_a2a" | "policy_rra" | "artifact_shared_read" | "unstated" | "ordinary", "mode" | "hook" | "org_rule" | "write_protection" | "write_protection_unresolved" | "content_question" | "ask_rule" | "denial_limit_fallback" | "ancestor" | "dangerous_delete" | "unverifiable_delete" | "transcript_write" | "governance_unavailable" | "rule_unreadable" | "classifier_no_ruling" | "requires_user_interaction" | "operator_forced" | "shell_floor" | "probe" | "tool_marks_mcp" | "tool_marks_a2a" | "policy_rra" | "artifact_shared_read" | "unstated" | "ordinary">>>;
710
+ askClass: z.ZodOptional<z.ZodCustom<"mode" | "hook" | "org_rule" | "write_protection" | "target_unresolved" | "content_question" | "ask_rule" | "denial_limit_fallback" | "ancestor" | "dangerous_delete" | "unverifiable_delete" | "unverifiable_shell_text" | "transcript_write" | "governance_unavailable" | "rule_unreadable" | "classifier_no_ruling" | "requires_user_interaction" | "operator_forced" | "shell_floor" | "probe" | "tool_marks_mcp" | "tool_marks_a2a" | "policy_rra" | "artifact_shared_read" | "unstated" | "ordinary", "mode" | "hook" | "org_rule" | "write_protection" | "target_unresolved" | "content_question" | "ask_rule" | "denial_limit_fallback" | "ancestor" | "dangerous_delete" | "unverifiable_delete" | "unverifiable_shell_text" | "transcript_write" | "governance_unavailable" | "rule_unreadable" | "classifier_no_ruling" | "requires_user_interaction" | "operator_forced" | "shell_floor" | "probe" | "tool_marks_mcp" | "tool_marks_a2a" | "policy_rra" | "artifact_shared_read" | "unstated" | "ordinary">>;
711
+ classes: z.ZodOptional<z.ZodArray<z.ZodCustom<"mode" | "hook" | "org_rule" | "write_protection" | "target_unresolved" | "content_question" | "ask_rule" | "denial_limit_fallback" | "ancestor" | "dangerous_delete" | "unverifiable_delete" | "unverifiable_shell_text" | "transcript_write" | "governance_unavailable" | "rule_unreadable" | "classifier_no_ruling" | "requires_user_interaction" | "operator_forced" | "shell_floor" | "probe" | "tool_marks_mcp" | "tool_marks_a2a" | "policy_rra" | "artifact_shared_read" | "unstated" | "ordinary", "mode" | "hook" | "org_rule" | "write_protection" | "target_unresolved" | "content_question" | "ask_rule" | "denial_limit_fallback" | "ancestor" | "dangerous_delete" | "unverifiable_delete" | "unverifiable_shell_text" | "transcript_write" | "governance_unavailable" | "rule_unreadable" | "classifier_no_ruling" | "requires_user_interaction" | "operator_forced" | "shell_floor" | "probe" | "tool_marks_mcp" | "tool_marks_a2a" | "policy_rra" | "artifact_shared_read" | "unstated" | "ordinary">>>;
700
712
  fromSubagent: z.ZodOptional<z.ZodLiteral<true>>;
701
713
  sourceTaskId: z.ZodOptional<z.ZodString>;
702
714
  sourceAgentName: z.ZodOptional<z.ZodString>;
@@ -747,11 +759,13 @@ export declare const ApprovalCardEnvelopeSchema: z.ZodObject<{
747
759
  match: z.ZodEnum<{
748
760
  name: "name";
749
761
  path: "path";
762
+ host: "host";
750
763
  exact: "exact";
751
764
  prefix: "prefix";
752
765
  wildcard: "wildcard";
753
766
  subpath: "subpath";
754
767
  name_prefix: "name_prefix";
768
+ subdomain: "subdomain";
755
769
  }>;
756
770
  command: z.ZodString;
757
771
  }, z.core.$strict>, z.ZodObject<{
@@ -762,11 +776,13 @@ export declare const ApprovalCardEnvelopeSchema: z.ZodObject<{
762
776
  match: z.ZodEnum<{
763
777
  name: "name";
764
778
  path: "path";
779
+ host: "host";
765
780
  exact: "exact";
766
781
  prefix: "prefix";
767
782
  wildcard: "wildcard";
768
783
  subpath: "subpath";
769
784
  name_prefix: "name_prefix";
785
+ subdomain: "subdomain";
770
786
  }>;
771
787
  command: z.ZodString;
772
788
  segment: z.ZodString;
@@ -825,8 +841,8 @@ export declare const ApprovalCardEnvelopeSchema: z.ZodObject<{
825
841
  }, z.core.$strict>>>;
826
842
  personalRuleDotsAbsent: z.ZodOptional<z.ZodCustom<AskEvidenceAbsence, AskEvidenceAbsence>>;
827
843
  }, z.core.$strict>>;
828
- askClass: z.ZodOptional<z.ZodCustom<"mode" | "hook" | "org_rule" | "write_protection" | "write_protection_unresolved" | "content_question" | "ask_rule" | "denial_limit_fallback" | "ancestor" | "dangerous_delete" | "unverifiable_delete" | "transcript_write" | "governance_unavailable" | "rule_unreadable" | "classifier_no_ruling" | "requires_user_interaction" | "operator_forced" | "shell_floor" | "probe" | "tool_marks_mcp" | "tool_marks_a2a" | "policy_rra" | "artifact_shared_read" | "unstated" | "ordinary", "mode" | "hook" | "org_rule" | "write_protection" | "write_protection_unresolved" | "content_question" | "ask_rule" | "denial_limit_fallback" | "ancestor" | "dangerous_delete" | "unverifiable_delete" | "transcript_write" | "governance_unavailable" | "rule_unreadable" | "classifier_no_ruling" | "requires_user_interaction" | "operator_forced" | "shell_floor" | "probe" | "tool_marks_mcp" | "tool_marks_a2a" | "policy_rra" | "artifact_shared_read" | "unstated" | "ordinary">>;
829
- classes: z.ZodOptional<z.ZodArray<z.ZodCustom<"mode" | "hook" | "org_rule" | "write_protection" | "write_protection_unresolved" | "content_question" | "ask_rule" | "denial_limit_fallback" | "ancestor" | "dangerous_delete" | "unverifiable_delete" | "transcript_write" | "governance_unavailable" | "rule_unreadable" | "classifier_no_ruling" | "requires_user_interaction" | "operator_forced" | "shell_floor" | "probe" | "tool_marks_mcp" | "tool_marks_a2a" | "policy_rra" | "artifact_shared_read" | "unstated" | "ordinary", "mode" | "hook" | "org_rule" | "write_protection" | "write_protection_unresolved" | "content_question" | "ask_rule" | "denial_limit_fallback" | "ancestor" | "dangerous_delete" | "unverifiable_delete" | "transcript_write" | "governance_unavailable" | "rule_unreadable" | "classifier_no_ruling" | "requires_user_interaction" | "operator_forced" | "shell_floor" | "probe" | "tool_marks_mcp" | "tool_marks_a2a" | "policy_rra" | "artifact_shared_read" | "unstated" | "ordinary">>>;
844
+ askClass: z.ZodOptional<z.ZodCustom<"mode" | "hook" | "org_rule" | "write_protection" | "target_unresolved" | "content_question" | "ask_rule" | "denial_limit_fallback" | "ancestor" | "dangerous_delete" | "unverifiable_delete" | "unverifiable_shell_text" | "transcript_write" | "governance_unavailable" | "rule_unreadable" | "classifier_no_ruling" | "requires_user_interaction" | "operator_forced" | "shell_floor" | "probe" | "tool_marks_mcp" | "tool_marks_a2a" | "policy_rra" | "artifact_shared_read" | "unstated" | "ordinary", "mode" | "hook" | "org_rule" | "write_protection" | "target_unresolved" | "content_question" | "ask_rule" | "denial_limit_fallback" | "ancestor" | "dangerous_delete" | "unverifiable_delete" | "unverifiable_shell_text" | "transcript_write" | "governance_unavailable" | "rule_unreadable" | "classifier_no_ruling" | "requires_user_interaction" | "operator_forced" | "shell_floor" | "probe" | "tool_marks_mcp" | "tool_marks_a2a" | "policy_rra" | "artifact_shared_read" | "unstated" | "ordinary">>;
845
+ classes: z.ZodOptional<z.ZodArray<z.ZodCustom<"mode" | "hook" | "org_rule" | "write_protection" | "target_unresolved" | "content_question" | "ask_rule" | "denial_limit_fallback" | "ancestor" | "dangerous_delete" | "unverifiable_delete" | "unverifiable_shell_text" | "transcript_write" | "governance_unavailable" | "rule_unreadable" | "classifier_no_ruling" | "requires_user_interaction" | "operator_forced" | "shell_floor" | "probe" | "tool_marks_mcp" | "tool_marks_a2a" | "policy_rra" | "artifact_shared_read" | "unstated" | "ordinary", "mode" | "hook" | "org_rule" | "write_protection" | "target_unresolved" | "content_question" | "ask_rule" | "denial_limit_fallback" | "ancestor" | "dangerous_delete" | "unverifiable_delete" | "unverifiable_shell_text" | "transcript_write" | "governance_unavailable" | "rule_unreadable" | "classifier_no_ruling" | "requires_user_interaction" | "operator_forced" | "shell_floor" | "probe" | "tool_marks_mcp" | "tool_marks_a2a" | "policy_rra" | "artifact_shared_read" | "unstated" | "ordinary">>>;
830
846
  fromSubagent: z.ZodOptional<z.ZodLiteral<true>>;
831
847
  sourceTaskId: z.ZodOptional<z.ZodString>;
832
848
  sourceAgentName: z.ZodOptional<z.ZodString>;
@@ -1,28 +1,44 @@
1
1
  /**
2
- * [ref]:`contentKind` 投影键的**单一词属主**(server 侧)。
2
+ * 审批卡的**卡词**读口(server 侧唯一一处)与保留问答工具名的再导出。
3
3
  *
4
- * core 在 `summarizeCheckpoint`(dist/core/checkpoint-store.js)对 tool_approval 门铸
5
- * `contentKind: "content_ask"`,判据一行:`tool.toolName === ASK_USER_QUESTION_TOOL_NAME`。
6
- * 该常量 **core 从包根导出**(`@sema-agent/core` 的 `index.d.ts`;声明在 `dist/core/ask-question.d.ts`,
7
- * 值 `"AskUserQuestion"`)⇒ 本仓 **re-export 那一枚**,一个字节都不自铸。
8
- * (S-213①:此处旧注曾写「该常量未从 core 包根导出」并据此在全仓手抄了 13 处同字面量 —— 那句前提
9
- * 失实,而每一份手抄都是一个独立写者:core 哪天改了保留工具名,手抄的那些当场与引擎分岔且全部静默。)
10
- * 三条 server 投影面(SQL `listPending` 列读 / LOCAL `listPending` blob 读 / live `listLivePending`)
11
- * 全部经 {@link contentKindOf} 派生,恒与 core 的 summarize 面同词 —— 词漂移由 parity 钉看住
12
- * (`test/local-checkpoint-store.test.ts` [ref] parity 格:core `summarizeCheckpoint` 对 AskUserQuestion
13
- * checkpoint 的铸值必须逐字等于本函数的答案;同文件 S-213① 格再普查「src/ 里零第二份手抄字面量」)。
4
+ * ── 规则(core 7.49.0 #1414 / #1468 A-S4)────────────────────────────────────────────────────────────
5
+ * 「这一问 / 这一行用哪张卡」只有一个事实源 = **引擎铸的 `approvalCard`**(闭集 core `TOOL_APPROVAL_CARDS`):活 ask 上是
6
+ * `AskRequest.approvalCard`,停驻行上是门的 `gate.approvalCard`(core `summarizeCheckpoint` 投给 `CheckpointSummary.approvalCard`
7
+ * 的同一个词)。停驻行到期走哪条路只有一个判官 = core `facetOf(gate)`(问答卡 ⇒ `B`,到期作废;其余审批门 ⇒ `A`,SLA 拒扫腿 deny)。
8
+ * 本仓**不从工具名回推卡**:此前的 `contentKindOf`(工具名 ⇒ `"content_ask"`)、两只店里按 `tool_name` 判问答的 SQL 字面臂与 LOCAL
9
+ * 比较,以及 wire 上的第二个卡词 `contentKind`,随 #1414 整删(零别名、零双读)。
14
10
  *
15
- * 🔴 与 `hasBidiControls` 的「server 不重算」纪律**不冲突**:那一位是有界扫描的结果(重算可分家),
16
- * 而 contentKind 是行上 core 铸的 `toolName` 的**全函数**(一行确定性判)——派生 ≠ 重扫。
17
- * 🔴 OMIT 契约与同族键一致(`boundCallId`/`gateKind`/`hasBidiControls` 的纪律):
18
- * `"content_ask"` 或**缺席**,恒不铸 `null`/`false`;缺席 = 不是内容问句门(普通工具门 / 非工具 park /
19
- * toolName 缺席的存量行)。展示/分诊/渲染分型用,永不参与 resume / gate / CAS。
11
+ * ── 存量行(7.49.0 之前的引擎停驻、门上没有卡)────────────────────────────────────────────────────────
12
+ * 按 core 的读法:**无卡 = 不是一问**(core 不从名字回推,本仓也不)。持久数据面不留第二种读法 —— 按工具名回退的臂一旦留下,
13
+ * 就是与 core `facetOf` 对同一张行答两样的第二个判官(本仓说「问答、作废」,core 收 `sla_timeout` 判 deny)。用户可见后果见
14
+ * 本仓 CHANGELOG 对应条目:旧问答行在队列上不带卡词;过了 deadline 走 SLA 拒扫腿(模型拿到一次「拒」),不再作废整条 run。
15
+ *
16
+ * ── 为什么保留工具名常量 ────────────────────────────────────────────────────────────────────────────
17
+ * `ASK_USER_QUESTION_TOOL_NAME` 是 core 根导出的那一枚(S-213①:本仓一个字节都不自铸),仍有**决断面**的读者(回决时「批准问答必须
18
+ * 带答」、问答不可记为会话放行、durable 问答门的政策臂)—— 那几处与 core 自己的答案绑定(`engineCardOf`,按 wire 名)同读法,
19
+ * 不是卡的渲染读法,不在本模块的规则里。
20
20
  */
21
21
  export { ASK_USER_QUESTION_TOOL_NAME } from "@sema-agent/core";
22
- /** 保留工具名的 **SQL 字面量**形(单引号已包)。SQL 里也不许再手抄那个词:片段从同一枚常量派生,
23
- * 与 `tool-approval.ts` 的 `APPROVAL_GATE_KINDS_SQL_IN`(闭集数组 → IN 片段)同一属主纪律。
24
- * 值来自 core 的常量(标识符形,无引号/反斜杠),故直接内插不产生注入面。 */
25
- export declare const ASK_USER_QUESTION_SQL_LITERAL = "'AskUserQuestion'";
26
- /** 三读面共用的派生:AskUserQuestion 工具门 ⇒ `"content_ask"`;其余(含 null/缺席)⇒ undefined(键缺席)。 */
27
- export declare function contentKindOf(toolName: string | null | undefined): "content_ask" | undefined;
22
+ import { type ToolApprovalCard } from "@sema-agent/core";
23
+ /**
24
+ * 一格卡词的**闭集窄读**(三个载体共用这一只:活 ask、LOCAL 店的停驻门、SQL 店读出的门子树)。成员 ⇒ 那个词;缺席 ⇒ `undefined`(不计);
25
+ * 在场却不是成员(世代差 —— 新引擎加了卡词而本版没跟上 —— 或手改行)⇒ `undefined` + 计一次 `server.approval-card.closed-word-out-of-set`
26
+ * (detail 前缀 `approvalCard=`;与 core 投影同答:集外词不是卡)。判据 = core 导出的闭集本身,本仓不抄词表。
27
+ */
28
+ export declare function readApprovalCard(raw: unknown): ToolApprovalCard | undefined;
29
+ /** 停驻行上的门(两只店读出来的形;字段都是 `unknown`,形由下面两只函数判)。 */
30
+ export interface ParkedGateFace {
31
+ readonly kind?: unknown;
32
+ readonly approvalCard?: unknown;
33
+ }
34
+ /**
35
+ * 停驻行的卡 = core `summarizeCheckpoint` 投给 `CheckpointSummary.approvalCard` 的那一个词:只在审批门(门型的寄存臂是
36
+ * `tool_approval`,读 core `PAUSE_REGISTRY`)上读,词经 {@link readApprovalCard}。非审批门(计划审阅 / 资源 / 收尾)恒无卡。
37
+ */
38
+ export declare function parkedApprovalCard(gate: ParkedGateFace | undefined): ToolApprovalCard | undefined;
39
+ /**
40
+ * 停驻行到期的读法 = core `facetOf(gate)`(唯一判官;本仓零自写判据):`A` ⇒ SLA 拒扫腿 deny,`B` / `-` ⇒ 到期作废。
41
+ * 门型不是 core 登记的门(存量行无门型 / 手改)⇒ `undefined`,调用方按「不是 `A`」处置(与无门型存量行的既有作废路同向)。
42
+ */
43
+ export declare function parkedFacetOf(gate: ParkedGateFace | undefined): "A" | "B" | "-" | undefined;
28
44
  //# sourceMappingURL=approval-content-kind.d.ts.map
@@ -1,7 +1,23 @@
1
1
  export { ASK_USER_QUESTION_TOOL_NAME } from "@sema-agent/core";
2
- import { ASK_USER_QUESTION_TOOL_NAME } from "@sema-agent/core";
3
- export const ASK_USER_QUESTION_SQL_LITERAL = `'${ASK_USER_QUESTION_TOOL_NAME}'`;
4
- export function contentKindOf(toolName) {
5
- return toolName === ASK_USER_QUESTION_TOOL_NAME ? "content_ask" : undefined;
2
+ import { PAUSE_REGISTRY, TOOL_APPROVAL_CARDS, facetOf, isGateKind } from "@sema-agent/core";
3
+ import { recordFailOpen } from "./observability/fail-open.js";
4
+ import { redactSecrets } from "./trace/redact.js";
5
+ export function readApprovalCard(raw) {
6
+ if (raw === undefined)
7
+ return undefined;
8
+ const cards = TOOL_APPROVAL_CARDS;
9
+ if (cards.includes(raw))
10
+ return raw;
11
+ const shape = typeof raw === "string" ? redactSecrets(raw).slice(0, 40) : `<${raw === null ? "null" : Array.isArray(raw) ? "array" : typeof raw}>`;
12
+ recordFailOpen("server.approval-card.closed-word-out-of-set", `approvalCard=${shape}`);
13
+ return undefined;
14
+ }
15
+ export function parkedApprovalCard(gate) {
16
+ if (gate === undefined || !isGateKind(gate.kind) || PAUSE_REGISTRY[gate.kind].pending !== "tool_approval")
17
+ return undefined;
18
+ return readApprovalCard(gate.approvalCard);
19
+ }
20
+ export function parkedFacetOf(gate) {
21
+ return gate !== undefined && isGateKind(gate.kind) ? facetOf({ kind: gate.kind, approvalCard: gate.approvalCard }) : undefined;
6
22
  }
7
23
  //# sourceMappingURL=approval-content-kind.js.map