@sema-agent/server 7.147.0 → 7.148.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 (725) hide show
  1. package/MIGRATION.md +1039 -24
  2. package/README.md +20 -7
  3. package/README.zh-CN.md +14 -8
  4. package/USAGE.md +380 -163
  5. package/deploy/sema-up/README.md +16 -5
  6. package/deploy/sema-up/chart/templates/NOTES.txt +1 -1
  7. package/deploy/sema-up/chart/templates/_helpers.tpl +20 -4
  8. package/deploy/sema-up/chart/values.yaml +3 -2
  9. package/deploy/sema-up/cluster-up.sh +74 -176
  10. package/deploy/sema-up/kube-up.sh +29 -49
  11. package/deploy/sema-up/lib/chart-run.sh +23 -0
  12. package/deploy/sema-up/lib/dataroot.sh +3 -3
  13. package/deploy/sema-up/lib/health.sh +62 -13
  14. package/deploy/sema-up/lib/helm-values-cluster.py +18 -0
  15. package/deploy/sema-up/lib/helm-values-kube.py +35 -0
  16. package/deploy/sema-up/lib/regcred.py +8 -0
  17. package/deploy/sema-up/lib/remote/helm-install.sh +3 -0
  18. package/deploy/sema-up/lib/remote/image-import.sh +6 -0
  19. package/deploy/sema-up/lib/remote/machine-precheck.sh +11 -0
  20. package/deploy/sema-up/lib/remote/region-probe.sh +3 -0
  21. package/deploy/sema-up/lib/remote/stack-ready.sh +26 -0
  22. package/deploy/sema-up/lib/remote/vxlan-guard.sh +8 -0
  23. package/deploy/sema-up/lib/render-stack.py +17 -0
  24. package/deploy/sema-up/lib/shell-text.sh +87 -0
  25. package/deploy/sema-up/lib/usage-flags.txt +10 -0
  26. package/deploy/sema-up/lib/usage-head.txt +1 -0
  27. package/deploy/sema-up/lib/usage-tail.txt +13 -0
  28. package/deploy/sema-up/preflight.sh +10 -8
  29. package/deploy/sema-up/sema-up.sh +14 -39
  30. package/deploy/sema-up/smoke.sh +7 -6
  31. package/deploy/sema-up/stack/compose.dataroot.yaml +3 -0
  32. package/deploy/sema-up/stack/compose.yaml +13 -1
  33. package/deploy/sema-up/stack/sema-stack-cluster.yaml +21 -0
  34. package/dist/adoption/plan.d.ts +24 -0
  35. package/dist/adoption/plan.js +53 -1
  36. package/dist/adoption/runner.d.ts +10 -1
  37. package/dist/adoption/runner.js +36 -16
  38. package/dist/adoption/wire.d.ts +3 -3
  39. package/dist/approval-card.d.ts +28 -30
  40. package/dist/approval-gate-currency.js +3 -2
  41. package/dist/approval-reconciler.d.ts +4 -13
  42. package/dist/approval-reconciler.js +2 -2
  43. package/dist/approval.d.ts +13 -11
  44. package/dist/approval.js +3 -3
  45. package/dist/audit.d.ts +10 -3
  46. package/dist/audit.js +15 -7
  47. package/dist/auth-bridge.d.ts +0 -14
  48. package/dist/auth-bridge.js +0 -7
  49. package/dist/auto-mode-face.d.ts +10 -7
  50. package/dist/auto-mode-face.js +7 -4
  51. package/dist/background-agent-name.d.ts +19 -1
  52. package/dist/background-agent-name.js +12 -2
  53. package/dist/background-session-reap.d.ts +1 -1
  54. package/dist/bake-runner/main.js +9 -6
  55. package/dist/bench/s1/arms.js +6 -5
  56. package/dist/bench/s1/live-deps.js +5 -2
  57. package/dist/bench/s1/run-firm.js +6 -5
  58. package/dist/bind-host.d.ts +25 -0
  59. package/dist/bind-host.js +25 -0
  60. package/dist/boot/adoption.d.ts +3 -0
  61. package/dist/boot/adoption.js +1 -0
  62. package/dist/boot/deployment-mods.d.ts +1 -1
  63. package/dist/boot/execution-env.d.ts +17 -7
  64. package/dist/boot/execution-env.js +37 -31
  65. package/dist/boot/exit-boundary.d.ts +2 -2
  66. package/dist/boot/exit-boundary.js +6 -5
  67. package/dist/boot/fatal-exit.d.ts +3 -5
  68. package/dist/boot/fatal-exit.js +2 -2
  69. package/dist/boot/leader.d.ts +15 -0
  70. package/dist/boot/leader.js +17 -15
  71. package/dist/boot/memory-consolidation.d.ts +37 -29
  72. package/dist/boot/memory-consolidation.js +11 -5
  73. package/dist/boot/org-memory.js +1 -1
  74. package/dist/boot/parked-revive-gate.js +2 -2
  75. package/dist/boot/reapers.d.ts +4 -3
  76. package/dist/boot/reapers.js +19 -16
  77. package/dist/boot/resolve-spec.d.ts +5 -3
  78. package/dist/boot/resolve-spec.js +55 -67
  79. package/dist/boot/retention-lane.d.ts +4 -4
  80. package/dist/boot/retention-lane.js +2 -2
  81. package/dist/boot/runner-deps.d.ts +28 -7
  82. package/dist/boot/runner-deps.js +11 -4
  83. package/dist/boot/runtime-caps.d.ts +2 -2
  84. package/dist/boot/runtime-caps.js +16 -2
  85. package/dist/boot/session-faces.d.ts +16 -7
  86. package/dist/boot/session-faces.js +114 -94
  87. package/dist/boot/shutdown.d.ts +5 -4
  88. package/dist/boot/shutdown.js +6 -4
  89. package/dist/boot/stage-01-config.js +9 -1
  90. package/dist/boot/stage-02-web-admin-pull.d.ts +1 -0
  91. package/dist/boot/stage-02-web-admin-pull.js +6 -1
  92. package/dist/boot/stage-03-store-backend.d.ts +3 -0
  93. package/dist/boot/stage-03-store-backend.js +4 -3
  94. package/dist/boot/stage-04-stores.d.ts +2 -0
  95. package/dist/boot/stage-04-stores.js +2 -2
  96. package/dist/boot/stage-05-execution-env.d.ts +7 -3
  97. package/dist/boot/stage-05-execution-env.js +2 -2
  98. package/dist/boot/stage-06-runners.d.ts +10 -12
  99. package/dist/boot/stage-06-runners.js +23 -15
  100. package/dist/boot/stage-07-capability-layer.d.ts +11 -8
  101. package/dist/boot/stage-07-capability-layer.js +5 -3
  102. package/dist/boot/stage-08-reapers.d.ts +11 -8
  103. package/dist/boot/stage-08-reapers.js +3 -3
  104. package/dist/boot/stage-09-leader.d.ts +12 -15
  105. package/dist/boot/stage-09-leader.js +12 -4
  106. package/dist/boot/stage-10-http-server.d.ts +12 -15
  107. package/dist/boot/stage-10-http-server.js +7 -4
  108. package/dist/boot/store-evidence.d.ts +20 -0
  109. package/dist/boot/store-evidence.js +13 -0
  110. package/dist/boot/stores.d.ts +3 -0
  111. package/dist/boot/stores.js +21 -10
  112. package/dist/boot/task-list-lane.d.ts +4 -4
  113. package/dist/boot/web-admin.d.ts +4 -2
  114. package/dist/boot/web-admin.js +55 -35
  115. package/dist/boot/webfetch-summarize-lane.d.ts +1 -1
  116. package/dist/boot-reclaim.d.ts +3 -1
  117. package/dist/boot-reclaim.js +1 -1
  118. package/dist/brain.d.ts +7 -18
  119. package/dist/brain.js +5 -17
  120. package/dist/budget.js +6 -6
  121. package/dist/capabilities/center-plugins.d.ts +7 -1
  122. package/dist/capabilities/center-plugins.js +32 -10
  123. package/dist/capabilities/center-wiring.js +1 -1
  124. package/dist/capabilities/composite-members.d.ts +2 -2
  125. package/dist/capabilities/composite-members.js +2 -2
  126. package/dist/capabilities/repo-tools.d.ts +2 -0
  127. package/dist/capabilities/repo-tools.js +14 -12
  128. package/dist/capabilities/scenarios.d.ts +6 -15
  129. package/dist/capabilities/scenarios.js +11 -16
  130. package/dist/capabilities/skills.d.ts +1 -1
  131. package/dist/capabilities/tool-defer.d.ts +1 -1
  132. package/dist/capability-facts.d.ts +38 -11
  133. package/dist/capability-facts.js +47 -8
  134. package/dist/card-void.d.ts +4 -4
  135. package/dist/card-void.js +1 -1
  136. package/dist/center-credential-renewer.d.ts +6 -2
  137. package/dist/center-credential-renewer.js +7 -3
  138. package/dist/config-catalog.d.ts +16 -1
  139. package/dist/config-catalog.js +62 -56
  140. package/dist/config-dir-trust.d.ts +37 -4
  141. package/dist/config-dir-trust.js +88 -44
  142. package/dist/config-invariants.d.ts +42 -3
  143. package/dist/config-invariants.js +69 -5
  144. package/dist/config-lkg.d.ts +23 -1
  145. package/dist/config-lkg.js +17 -3
  146. package/dist/config-provider.d.ts +9 -9
  147. package/dist/config-provider.js +25 -110
  148. package/dist/config-pull-failure.d.ts +50 -0
  149. package/dist/config-pull-failure.js +48 -0
  150. package/dist/config-types.d.ts +26 -17
  151. package/dist/config.d.ts +8 -16
  152. package/dist/config.js +113 -47
  153. package/dist/delegated-session-owner.d.ts +1 -1
  154. package/dist/deleted-session-ids.d.ts +3 -2
  155. package/dist/deployment-governance.d.ts +3 -3
  156. package/dist/deployment-shape.d.ts +30 -4
  157. package/dist/deployment-shape.js +7 -0
  158. package/dist/egress-redirect.d.ts +25 -7
  159. package/dist/egress-redirect.js +20 -2
  160. package/dist/elicitation.d.ts +6 -5
  161. package/dist/elicitation.js +23 -22
  162. package/dist/engine-identity.d.ts +28 -0
  163. package/dist/engine-identity.js +10 -0
  164. package/dist/entry-problems.d.ts +5 -7
  165. package/dist/entry-problems.js +1 -1
  166. package/dist/env-facts.js +2 -1
  167. package/dist/env-witness.d.ts +7 -0
  168. package/dist/env-witness.js +16 -0
  169. package/dist/execution-lane-caps.d.ts +5 -18
  170. package/dist/execution-lane-caps.js +0 -22
  171. package/dist/execution-placement.d.ts +58 -18
  172. package/dist/execution-placement.js +41 -2
  173. package/dist/field-conflict.d.ts +7 -11
  174. package/dist/field-conflict.js +3 -3
  175. package/dist/file-history-capture.d.ts +3 -3
  176. package/dist/file-history-disclosure.js +1 -0
  177. package/dist/fleet/fleet-bus.d.ts +21 -3
  178. package/dist/fleet/fleet-bus.js +35 -25
  179. package/dist/fleet/fleet-reconciler.js +2 -2
  180. package/dist/fleet/serving-lease.js +3 -3
  181. package/dist/fleet-client.js +3 -3
  182. package/dist/fleet-lease.d.ts +0 -1
  183. package/dist/fleet-lease.js +4 -5
  184. package/dist/history-anchor.d.ts +23 -3
  185. package/dist/history-anchor.js +24 -4
  186. package/dist/hitl-delivery.d.ts +90 -0
  187. package/dist/hitl-delivery.js +98 -0
  188. package/dist/hooks/classic-stations.d.ts +8 -11
  189. package/dist/hooks/classic-stations.js +0 -7
  190. package/dist/hooks/hook-llm.d.ts +5 -1
  191. package/dist/hooks/hook-llm.js +24 -15
  192. package/dist/hooks/hook-runner.d.ts +67 -57
  193. package/dist/hooks/hook-runner.js +260 -186
  194. package/dist/host-lsp-manager.d.ts +22 -8
  195. package/dist/host-lsp-manager.js +4 -1
  196. package/dist/http/active-run-conflict.d.ts +2 -43
  197. package/dist/http/active-run-conflict.js +3 -7
  198. package/dist/http/admission.d.ts +4 -18
  199. package/dist/http/admission.js +75 -78
  200. package/dist/http/approval-sweeps.d.ts +3 -3
  201. package/dist/http/approval-sweeps.js +54 -30
  202. package/dist/http/caller-trust.d.ts +8 -10
  203. package/dist/http/caller-trust.js +1 -2
  204. package/dist/http/claim-heartbeat.d.ts +49 -0
  205. package/dist/http/claim-heartbeat.js +46 -0
  206. package/dist/http/claimed-run.d.ts +4 -3
  207. package/dist/http/dispatch.d.ts +8 -1
  208. package/dist/http/dispatch.js +76 -30
  209. package/dist/http/durable-run-leg.d.ts +3 -3
  210. package/dist/http/durable-run-leg.js +17 -12
  211. package/dist/http/execution-context.d.ts +17 -43
  212. package/dist/http/execution-context.js +7 -5
  213. package/dist/http/health-reader.d.ts +36 -0
  214. package/dist/http/health-reader.js +21 -0
  215. package/dist/http/health-self-report.d.ts +9 -9
  216. package/dist/http/health-self-report.js +4 -4
  217. package/dist/http/idempotency.d.ts +9 -5
  218. package/dist/http/idempotency.js +4 -4
  219. package/dist/http/memory-compliance-failure-reply.d.ts +15 -16
  220. package/dist/http/memory-compliance-failure-reply.js +4 -2
  221. package/dist/http/memory-face-fault-reply.d.ts +67 -0
  222. package/dist/http/memory-face-fault-reply.js +71 -0
  223. package/dist/http/memory-store-refusal-reply.d.ts +1 -1
  224. package/dist/http/memory-store-refusal-reply.js +3 -0
  225. package/dist/http/owner-access.d.ts +391 -67
  226. package/dist/http/owner-access.js +371 -35
  227. package/dist/http/principal-gate.d.ts +24 -81
  228. package/dist/http/principal-gate.js +24 -68
  229. package/dist/http/refusal-body.d.ts +35 -2
  230. package/dist/http/refusal-body.js +34 -0
  231. package/dist/http/request-guards.d.ts +9 -13
  232. package/dist/http/request-guards.js +34 -68
  233. package/dist/http/resume-composition.d.ts +37 -0
  234. package/dist/http/resume-composition.js +18 -0
  235. package/dist/http/resume-ctx-read.d.ts +35 -12
  236. package/dist/http/resume-ctx-read.js +25 -6
  237. package/dist/http/resume-legs.d.ts +21 -18
  238. package/dist/http/resume-legs.js +189 -129
  239. package/dist/http/retired-skill-manifest.d.ts +1 -1
  240. package/dist/http/route-ctx.d.ts +25 -32
  241. package/dist/http/routes/a2a-serve.d.ts +43 -5
  242. package/dist/http/routes/a2a-serve.js +58 -37
  243. package/dist/http/routes/admin-config-refresh.js +2 -2
  244. package/dist/http/routes/admin-drain.js +2 -2
  245. package/dist/http/routes/admin-memory-optout.js +4 -3
  246. package/dist/http/routes/adoption.d.ts +3 -0
  247. package/dist/http/routes/adoption.js +17 -10
  248. package/dist/http/routes/agents-roster.js +13 -7
  249. package/dist/http/routes/approvals-assistant.js +70 -65
  250. package/dist/http/routes/attachments.js +2 -2
  251. package/dist/http/routes/background.d.ts +3 -3
  252. package/dist/http/routes/background.js +9 -17
  253. package/dist/http/routes/capabilities.js +15 -18
  254. package/dist/http/routes/config-catalog.js +2 -2
  255. package/dist/http/routes/devices.d.ts +3 -3
  256. package/dist/http/routes/devices.js +4 -4
  257. package/dist/http/routes/diagnostics.d.ts +27 -3
  258. package/dist/http/routes/diagnostics.js +27 -21
  259. package/dist/http/routes/engine.js +2 -2
  260. package/dist/http/routes/fleet.js +5 -3
  261. package/dist/http/routes/images.js +10 -6
  262. package/dist/http/routes/leader.d.ts +7 -2
  263. package/dist/http/routes/leader.js +12 -3
  264. package/dist/http/routes/mcp-reconnect.d.ts +1 -1
  265. package/dist/http/routes/mcp-reconnect.js +7 -15
  266. package/dist/http/routes/memory-bundle.js +4 -7
  267. package/dist/http/routes/memory-compliance.js +4 -4
  268. package/dist/http/routes/memory-consolidation.js +6 -9
  269. package/dist/http/routes/memory-origin.d.ts +2 -0
  270. package/dist/http/routes/memory-origin.js +7 -8
  271. package/dist/http/routes/memory-policy.js +17 -12
  272. package/dist/http/routes/notify-wake.js +10 -19
  273. package/dist/http/routes/observability.js +3 -3
  274. package/dist/http/routes/principal-inbox.d.ts +1 -1
  275. package/dist/http/routes/principal-inbox.js +2 -2
  276. package/dist/http/routes/projects.d.ts +1 -1
  277. package/dist/http/routes/projects.js +3 -2
  278. package/dist/http/routes/retention-ops.js +6 -9
  279. package/dist/http/routes/rules.js +20 -5
  280. package/dist/http/routes/run-memory-capture.d.ts +2 -2
  281. package/dist/http/routes/run-memory-capture.js +6 -12
  282. package/dist/http/routes/run-permission-mode.d.ts +2 -2
  283. package/dist/http/routes/run-permission-mode.js +10 -17
  284. package/dist/http/routes/runs.js +146 -231
  285. package/dist/http/routes/session-memory-sync.d.ts +2 -2
  286. package/dist/http/routes/session-memory-sync.js +7 -13
  287. package/dist/http/routes/session-sync.d.ts +4 -2
  288. package/dist/http/routes/session-sync.js +21 -20
  289. package/dist/http/routes/sessions-list.d.ts +3 -3
  290. package/dist/http/routes/sessions-list.js +9 -9
  291. package/dist/http/routes/sessions.js +87 -124
  292. package/dist/http/routes/shared-memory.js +6 -6
  293. package/dist/http/routes/side-query.js +2 -2
  294. package/dist/http/routes/tasks.js +136 -120
  295. package/dist/http/routes/trace-usage.d.ts +0 -12
  296. package/dist/http/routes/trace-usage.js +40 -46
  297. package/dist/http/routes/workflows.d.ts +39 -4
  298. package/dist/http/routes/workflows.js +42 -14
  299. package/dist/http/run-concurrency-cap.d.ts +20 -12
  300. package/dist/http/run-concurrency-cap.js +39 -26
  301. package/dist/http/run-read-face.d.ts +3 -5
  302. package/dist/http/run-read-face.js +8 -13
  303. package/dist/http/send.d.ts +12 -3
  304. package/dist/http/send.js +42 -6
  305. package/dist/http/server.d.ts +39 -40
  306. package/dist/http/server.js +36 -11
  307. package/dist/http/sse-log.d.ts +17 -10
  308. package/dist/http/sse-log.js +7 -7
  309. package/dist/http/stored-body-replay.d.ts +12 -0
  310. package/dist/http/stored-body-replay.js +2 -2
  311. package/dist/http/submit-ctx.d.ts +16 -8
  312. package/dist/http/submit-ctx.js +6 -2
  313. package/dist/http/submit-replay.d.ts +19 -6
  314. package/dist/http/submit-replay.js +18 -6
  315. package/dist/http/sync-submit-body.d.ts +3 -4
  316. package/dist/http/sync-submit-body.js +4 -5
  317. package/dist/http/wire-types.d.ts +4 -3
  318. package/dist/identity-source.d.ts +36 -5
  319. package/dist/identity-source.js +27 -0
  320. package/dist/index.d.ts +1 -0
  321. package/dist/index.js +1 -0
  322. package/dist/key-resolver.d.ts +32 -0
  323. package/dist/key-resolver.js +23 -9
  324. package/dist/leader/diffup.js +2 -1
  325. package/dist/leader/endpoint.d.ts +26 -5
  326. package/dist/leader/endpoint.js +154 -14
  327. package/dist/leader/fanout.d.ts +3 -0
  328. package/dist/leader/fanout.js +78 -63
  329. package/dist/leader/leader.d.ts +16 -0
  330. package/dist/leader/leader.js +43 -3
  331. package/dist/leader/merge.d.ts +9 -1
  332. package/dist/leader/merge.js +16 -1
  333. package/dist/leader/repair-wire.js +1 -1
  334. package/dist/leader/wire.d.ts +36 -3
  335. package/dist/leader/wire.js +59 -18
  336. package/dist/lsp-evict.d.ts +6 -4
  337. package/dist/lsp-evict.js +2 -3
  338. package/dist/memory-operator-faces.d.ts +5 -4
  339. package/dist/memory-operator-faces.js +1 -1
  340. package/dist/memory-scope.d.ts +29 -2
  341. package/dist/memory-scope.js +64 -15
  342. package/dist/memory-store-refusal.d.ts +5 -2
  343. package/dist/memory-sync-client.d.ts +3 -2
  344. package/dist/memory-sync-client.js +6 -3
  345. package/dist/model-compat.d.ts +17 -8
  346. package/dist/model-compat.js +6 -2
  347. package/dist/model-context-window.d.ts +18 -0
  348. package/dist/model-context-window.js +2 -0
  349. package/dist/model-entry-headers.d.ts +46 -4
  350. package/dist/model-entry-headers.js +2 -2
  351. package/dist/model-entry-refusal.d.ts +35 -16
  352. package/dist/model-entry-refusal.js +40 -27
  353. package/dist/model-plane-face.d.ts +19 -11
  354. package/dist/model-plane-face.js +9 -1
  355. package/dist/model-plane-probe.d.ts +2 -0
  356. package/dist/model-plane-probe.js +17 -0
  357. package/dist/model-provider.d.ts +3 -3
  358. package/dist/model-route-endpoint.d.ts +9 -5
  359. package/dist/model-route-endpoint.js +29 -7
  360. package/dist/model-select.d.ts +16 -0
  361. package/dist/model-select.js +4 -0
  362. package/dist/mountinfo.d.ts +37 -0
  363. package/dist/mountinfo.js +47 -0
  364. package/dist/namespaced-rule-name.d.ts +23 -14
  365. package/dist/namespaced-rule-name.js +8 -11
  366. package/dist/net-address.d.ts +1 -1
  367. package/dist/observability/corrupt-read-seat.d.ts +4 -4
  368. package/dist/observability/corrupt-read-seat.js +5 -3
  369. package/dist/observability/fail-open.d.ts +58 -38
  370. package/dist/observability/fail-open.js +60 -38
  371. package/dist/observability/logger.d.ts +22 -1
  372. package/dist/observability/logger.js +89 -12
  373. package/dist/observability/metrics.js +3 -4
  374. package/dist/observability/otel-exporter.js +2 -1
  375. package/dist/observability/principal-context.d.ts +14 -7
  376. package/dist/observability/principal-context.js +8 -3
  377. package/dist/observability/run-terminal.d.ts +7 -1
  378. package/dist/observability/run-terminal.js +5 -2
  379. package/dist/orchestration/hardened-vm-runner.d.ts +1 -0
  380. package/dist/orchestration/hardened-vm-runner.js +11 -5
  381. package/dist/orchestration/hardened-vm-worker-runner.d.ts +0 -14
  382. package/dist/orchestration/hardened-vm-worker-runner.js +5 -0
  383. package/dist/orchestration/hardened-vm-worker.js +2 -1
  384. package/dist/orchestration/workflow-completion-inbox.d.ts +3 -3
  385. package/dist/orchestration/workflow-completion-inbox.js +3 -2
  386. package/dist/org-delivery-gate.d.ts +5 -4
  387. package/dist/org-delivery-gate.js +7 -6
  388. package/dist/outbound-dispatcher.d.ts +1 -1
  389. package/dist/outbound-dispatcher.js +6 -12
  390. package/dist/owner-brands.d.ts +81 -0
  391. package/dist/owner-brands.js +42 -0
  392. package/dist/owner-faces.d.ts +531 -0
  393. package/dist/owner-faces.js +126 -0
  394. package/dist/parked-decide.d.ts +67 -5
  395. package/dist/parked-decide.js +127 -5
  396. package/dist/parked-revive-surface.d.ts +14 -4
  397. package/dist/parked-revive-surface.js +5 -4
  398. package/dist/peer-directory.d.ts +6 -8
  399. package/dist/peer-directory.js +3 -2
  400. package/dist/permission-rule-vocab.d.ts +53 -8
  401. package/dist/permission-rule-vocab.js +30 -2
  402. package/dist/plugins/adoption-log-sql.d.ts +0 -22
  403. package/dist/plugins/adoption-log-sql.js +5 -3
  404. package/dist/plugins/approval-ask-retired-delete-by-task-m50.d.ts +7 -0
  405. package/dist/plugins/approval-ask-retired-delete-by-task-m50.js +17 -0
  406. package/dist/plugins/approval-ask-store-file.d.ts +18 -7
  407. package/dist/plugins/approval-ask-store-file.js +37 -14
  408. package/dist/plugins/approval-ask-store-memory.d.ts +12 -4
  409. package/dist/plugins/approval-ask-store-memory.js +24 -10
  410. package/dist/plugins/approval-ask-store-sql.d.ts +39 -20
  411. package/dist/plugins/approval-ask-store-sql.js +41 -10
  412. package/dist/plugins/approval-exemption-skill-m46.d.ts +20 -0
  413. package/dist/plugins/approval-exemption-skill-m46.js +25 -0
  414. package/dist/plugins/approval-exemption-store.d.ts +6 -1
  415. package/dist/plugins/approval-exemption-store.js +14 -0
  416. package/dist/plugins/approval-nonce-store.d.ts +39 -12
  417. package/dist/plugins/approval-nonce-store.js +72 -23
  418. package/dist/plugins/blob-backend.d.ts +2 -0
  419. package/dist/plugins/blob-backend.js +9 -6
  420. package/dist/plugins/caching-session-store.d.ts +13 -1
  421. package/dist/plugins/caching-session-store.js +43 -4
  422. package/dist/plugins/checkpoint-index-columns.d.ts +32 -5
  423. package/dist/plugins/checkpoint-index-columns.js +36 -1
  424. package/dist/plugins/checkpoint-store-face.d.ts +83 -10
  425. package/dist/plugins/checkpoint-store-face.js +18 -1
  426. package/dist/plugins/device-store-sql.js +1 -0
  427. package/dist/plugins/ensure-index.d.ts +13 -1
  428. package/dist/plugins/ensure-index.js +154 -21
  429. package/dist/plugins/ensure-schema-lock-policy.d.ts +0 -15
  430. package/dist/plugins/ensure-schema-lock-policy.js +3 -2
  431. package/dist/plugins/file-run-store.d.ts +63 -23
  432. package/dist/plugins/file-run-store.js +138 -83
  433. package/dist/plugins/host-platform.d.ts +24 -3
  434. package/dist/plugins/host-platform.js +15 -1
  435. package/dist/plugins/image-bake-store-sql.js +2 -0
  436. package/dist/plugins/imported-layer-root-retirement.d.ts +2 -2
  437. package/dist/plugins/k8s-pod-reaper.d.ts +1 -3
  438. package/dist/plugins/k8s-pod-reaper.js +0 -1
  439. package/dist/plugins/leader-run-store-sql.d.ts +22 -0
  440. package/dist/plugins/leader-run-store-sql.js +34 -4
  441. package/dist/plugins/local-checkpoint-store.d.ts +58 -23
  442. package/dist/plugins/local-checkpoint-store.js +195 -76
  443. package/dist/plugins/local-data-dir-modes-m39.js +2 -1
  444. package/dist/plugins/local-docker-capacity.d.ts +93 -0
  445. package/dist/plugins/local-docker-capacity.js +194 -0
  446. package/dist/plugins/local-docker-reaper.d.ts +92 -0
  447. package/dist/plugins/local-docker-reaper.js +102 -0
  448. package/dist/plugins/local-engine-high-water.d.ts +4 -2
  449. package/dist/plugins/local-engine-high-water.js +4 -1
  450. package/dist/plugins/local-session-store.d.ts +358 -125
  451. package/dist/plugins/local-session-store.js +824 -251
  452. package/dist/plugins/local-session-window.d.ts +3 -2
  453. package/dist/plugins/local-session-window.js +3 -2
  454. package/dist/plugins/local-sidecar-quarantine.js +3 -2
  455. package/dist/plugins/local-task-attachment-store.d.ts +18 -1
  456. package/dist/plugins/local-task-attachment-store.js +22 -1
  457. package/dist/plugins/memory-embedder.js +9 -7
  458. package/dist/plugins/memory-engine-pg.d.ts +3 -2
  459. package/dist/plugins/memory-engine-pg.js +14 -5
  460. package/dist/plugins/memory-engine-sql-apply.d.ts +8 -4
  461. package/dist/plugins/memory-engine-sql-apply.js +6 -8
  462. package/dist/plugins/memory-engine-tidb.d.ts +4 -2
  463. package/dist/plugins/memory-engine-tidb.js +11 -2
  464. package/dist/plugins/memory-optout-grant-store-sql.d.ts +1 -1
  465. package/dist/plugins/memory-optout-grant-store-sql.js +3 -3
  466. package/dist/plugins/memory-run-store.d.ts +39 -27
  467. package/dist/plugins/memory-run-store.js +72 -70
  468. package/dist/plugins/one-time-migration-marker.d.ts +10 -0
  469. package/dist/plugins/one-time-migration-marker.js +7 -0
  470. package/dist/plugins/one-time-migrations.d.ts +186 -45
  471. package/dist/plugins/one-time-migrations.js +442 -119
  472. package/dist/plugins/org-delivery-quota-store.js +2 -1
  473. package/dist/plugins/permission-rule-store-file.d.ts +3 -3
  474. package/dist/plugins/permission-rule-store-sql.d.ts +4 -63
  475. package/dist/plugins/permission-rule-store-sql.js +6 -86
  476. package/dist/plugins/pg-pool.d.ts +1 -31
  477. package/dist/plugins/pg-pool.js +16 -7
  478. package/dist/plugins/remote-env-e2b.d.ts +7 -25
  479. package/dist/plugins/remote-env-e2b.js +34 -25
  480. package/dist/plugins/remote-env-host.d.ts +2 -9
  481. package/dist/plugins/remote-env-host.js +34 -22
  482. package/dist/plugins/remote-env-k8s.d.ts +40 -45
  483. package/dist/plugins/remote-env-k8s.js +107 -58
  484. package/dist/plugins/remote-env-local-docker.d.ts +148 -14
  485. package/dist/plugins/remote-env-local-docker.js +367 -72
  486. package/dist/plugins/remote-scratchpad.js +4 -0
  487. package/dist/plugins/retention-deployment.d.ts +49 -17
  488. package/dist/plugins/retention-deployment.js +39 -8
  489. package/dist/plugins/run-preview-m45.d.ts +11 -0
  490. package/dist/plugins/run-preview-m45.js +19 -0
  491. package/dist/plugins/run-store-sql.d.ts +56 -68
  492. package/dist/plugins/run-store-sql.js +127 -116
  493. package/dist/plugins/s3-answer.d.ts +2 -1
  494. package/dist/plugins/sandbox-reaper.d.ts +26 -0
  495. package/dist/plugins/sandbox-reaper.js +2 -0
  496. package/dist/plugins/scenario-prefix-switch-m42.d.ts +54 -0
  497. package/dist/plugins/scenario-prefix-switch-m42.js +55 -0
  498. package/dist/plugins/scheduler-support.d.ts +16 -1
  499. package/dist/plugins/scheduler-support.js +22 -2
  500. package/dist/plugins/schema-consistency.d.ts +42 -9
  501. package/dist/plugins/schema-consistency.js +212 -11
  502. package/dist/plugins/schema-drift-sentence.d.ts +4 -1
  503. package/dist/plugins/schema-drift-sentence.js +4 -4
  504. package/dist/plugins/schema-ensure-legs.d.ts +9 -0
  505. package/dist/plugins/schema-ensure-legs.js +1 -1
  506. package/dist/plugins/schema-indexes.js +3 -0
  507. package/dist/plugins/schema-live-columns.d.ts +14 -5
  508. package/dist/plugins/schema-live-columns.js +10 -10
  509. package/dist/plugins/send-user-file.js +2 -1
  510. package/dist/plugins/session-birth.d.ts +37 -0
  511. package/dist/plugins/session-birth.js +38 -0
  512. package/dist/plugins/session-epoch-anchor.d.ts +40 -12
  513. package/dist/plugins/session-epoch-anchor.js +33 -11
  514. package/dist/plugins/session-ext-table.d.ts +27 -3
  515. package/dist/plugins/session-ext-table.js +19 -6
  516. package/dist/plugins/session-fork.d.ts +15 -1
  517. package/dist/plugins/session-fork.js +3 -0
  518. package/dist/plugins/session-ownership.d.ts +1 -1
  519. package/dist/plugins/session-placement.d.ts +22 -16
  520. package/dist/plugins/session-placement.js +15 -12
  521. package/dist/plugins/session-row-sql.d.ts +12 -0
  522. package/dist/plugins/session-row-sql.js +3 -3
  523. package/dist/plugins/session-run-rollup.d.ts +29 -0
  524. package/dist/plugins/session-run-rollup.js +40 -0
  525. package/dist/plugins/session-store-sql.d.ts +38 -12
  526. package/dist/plugins/session-store-sql.js +130 -30
  527. package/dist/plugins/session-withdraw-sql.d.ts +36 -0
  528. package/dist/plugins/session-withdraw-sql.js +42 -0
  529. package/dist/plugins/shared-memory-store-sql.d.ts +0 -69
  530. package/dist/plugins/shared-memory-store-sql.js +2 -1
  531. package/dist/plugins/shell-sentinel-owner-m48.d.ts +20 -0
  532. package/dist/plugins/shell-sentinel-owner-m48.js +3 -0
  533. package/dist/plugins/snapshot-bucket-presence.d.ts +2 -1
  534. package/dist/plugins/sql-driver.d.ts +1 -1
  535. package/dist/plugins/sql-driver.js +2 -1
  536. package/dist/plugins/sql-errors.d.ts +32 -5
  537. package/dist/plugins/sql-errors.js +55 -7
  538. package/dist/plugins/sql-json-column.d.ts +8 -7
  539. package/dist/plugins/sql-json-column.js +10 -6
  540. package/dist/plugins/store-backend.d.ts +84 -15
  541. package/dist/plugins/store-backend.js +186 -55
  542. package/dist/plugins/store-contracts.d.ts +90 -30
  543. package/dist/plugins/store-contracts.js +22 -1
  544. package/dist/plugins/store-fault.d.ts +28 -2
  545. package/dist/plugins/store-fault.js +20 -2
  546. package/dist/plugins/task-attachment-store.d.ts +15 -3
  547. package/dist/plugins/task-attachment-store.js +22 -9
  548. package/dist/plugins/tidb-pool.js +23 -8
  549. package/dist/plugins/web-search.js +5 -3
  550. package/dist/plugins/workflow-run-store-sql.d.ts +6 -1
  551. package/dist/plugins/workflow-run-store-sql.js +11 -5
  552. package/dist/principal-jwt.d.ts +4 -4
  553. package/dist/principal-jwt.js +20 -5
  554. package/dist/principal-shape.d.ts +41 -0
  555. package/dist/principal-shape.js +19 -0
  556. package/dist/question.d.ts +13 -23
  557. package/dist/question.js +21 -39
  558. package/dist/request-declaration-refusal.d.ts +35 -12
  559. package/dist/request-declaration-refusal.js +21 -9
  560. package/dist/request-form.d.ts +58 -0
  561. package/dist/request-form.js +72 -0
  562. package/dist/request-image-urls.d.ts +8 -2
  563. package/dist/request-image-urls.js +2 -1
  564. package/dist/request-images.d.ts +20 -0
  565. package/dist/request-images.js +59 -0
  566. package/dist/request-key-closure.d.ts +6 -7
  567. package/dist/request-key-closure.js +15 -2
  568. package/dist/resource-suspend.d.ts +7 -16
  569. package/dist/resource-suspend.js +1 -1
  570. package/dist/retired-name-host-notice.d.ts +21 -0
  571. package/dist/retired-name-host-notice.js +12 -0
  572. package/dist/rule-entry-list.d.ts +2 -2
  573. package/dist/rule-entry-list.js +3 -4
  574. package/dist/rule-issue-reading.d.ts +58 -0
  575. package/dist/rule-issue-reading.js +14 -0
  576. package/dist/rules-consent.d.ts +5 -3
  577. package/dist/rules-consent.js +1 -0
  578. package/dist/run-acceptance.d.ts +3 -1
  579. package/dist/run-acceptance.js +3 -0
  580. package/dist/run-local.d.ts +14 -6
  581. package/dist/run-local.js +92 -80
  582. package/dist/run-stale-default.d.ts +7 -0
  583. package/dist/run-stale-default.js +2 -0
  584. package/dist/runs.d.ts +26 -15
  585. package/dist/runs.js +39 -27
  586. package/dist/runtime-caps-resolver.d.ts +21 -6
  587. package/dist/runtime-caps-resolver.js +17 -4
  588. package/dist/runtime-governance.d.ts +2 -2
  589. package/dist/runtime-governance.js +5 -3
  590. package/dist/sealed-key-layout.d.ts +12 -5
  591. package/dist/sealed-key-layout.js +5 -0
  592. package/dist/sealed-key.d.ts +12 -2
  593. package/dist/sealed-key.js +115 -27
  594. package/dist/security.d.ts +128 -158
  595. package/dist/security.js +163 -59
  596. package/dist/sema-config-dir.d.ts +20 -0
  597. package/dist/sema-config-dir.js +25 -0
  598. package/dist/server-secret-env.d.ts +21 -5
  599. package/dist/server-secret-env.js +14 -4
  600. package/dist/session-children-retire.d.ts +7 -5
  601. package/dist/session-children-retire.js +7 -2
  602. package/dist/session-deletion.d.ts +88 -0
  603. package/dist/session-deletion.js +8 -0
  604. package/dist/session-erase.d.ts +145 -0
  605. package/dist/session-erase.js +115 -0
  606. package/dist/session-error-wire.d.ts +5 -5
  607. package/dist/session-error-wire.js +1 -1
  608. package/dist/session-incarnation.d.ts +52 -5
  609. package/dist/session-incarnation.js +19 -2
  610. package/dist/session-policy-wire.d.ts +6 -3
  611. package/dist/session-policy-wire.js +11 -1
  612. package/dist/session-resident-background.d.ts +0 -71
  613. package/dist/session-resident-background.js +4 -3
  614. package/dist/session-row.d.ts +2 -1
  615. package/dist/session-rules-seat.d.ts +12 -0
  616. package/dist/session-rules-seat.js +19 -0
  617. package/dist/session-titler.d.ts +7 -15
  618. package/dist/session-titler.js +1 -1
  619. package/dist/spec-fields.d.ts +57 -3
  620. package/dist/spec-fields.js +72 -51
  621. package/dist/store-posture.d.ts +136 -20
  622. package/dist/store-posture.js +188 -3
  623. package/dist/stored-request-hooks-m20.js +2 -2
  624. package/dist/stores-sql/background-agent-store-sql.d.ts +11 -2
  625. package/dist/stores-sql/background-agent-store-sql.js +73 -20
  626. package/dist/stores-sql/checkpoint-store-sql.d.ts +33 -28
  627. package/dist/stores-sql/checkpoint-store-sql.js +75 -44
  628. package/dist/stores-sql/mailbox-store-sql.d.ts +7 -4
  629. package/dist/stores-sql/mailbox-store-sql.js +31 -32
  630. package/dist/stores-sql/pg-session-storage.d.ts +7 -5
  631. package/dist/stores-sql/pg-session-storage.js +54 -46
  632. package/dist/stores-sql/retention-store-sql.d.ts +87 -19
  633. package/dist/stores-sql/retention-store-sql.js +92 -27
  634. package/dist/stores-sql/session-policy-store-sql.d.ts +32 -10
  635. package/dist/stores-sql/session-policy-store-sql.js +44 -36
  636. package/dist/stores-sql/session-write-hooks.d.ts +12 -6
  637. package/dist/stores-sql/tidb-session-storage.d.ts +4 -4
  638. package/dist/stores-sql/tidb-session-storage.js +13 -8
  639. package/dist/stores-sql/tidb-session-store.d.ts +36 -17
  640. package/dist/stores-sql/tidb-session-store.js +69 -39
  641. package/dist/stores-sql/windowed-session-storage.d.ts +5 -0
  642. package/dist/stores-sql/windowed-session-storage.js +9 -0
  643. package/dist/submission-exit.d.ts +50 -0
  644. package/dist/submission-exit.js +108 -0
  645. package/dist/task-a2a.d.ts +1 -1
  646. package/dist/task-a2a.js +3 -3
  647. package/dist/task-cwd.d.ts +20 -0
  648. package/dist/task-cwd.js +8 -0
  649. package/dist/task-mcp.d.ts +1 -1
  650. package/dist/task-mcp.js +3 -3
  651. package/dist/task-settings.d.ts +14 -10
  652. package/dist/task-settings.js +18 -7
  653. package/dist/terminal.d.ts +25 -43
  654. package/dist/terminal.js +31 -11
  655. package/dist/tool-approval.d.ts +131 -129
  656. package/dist/tool-approval.js +189 -193
  657. package/dist/trace/core-keyset-guard.d.ts +13 -6
  658. package/dist/trace/core-vocab-wire.d.ts +95 -0
  659. package/dist/trace/core-vocab-wire.js +15 -0
  660. package/dist/trace/exit-seat.d.ts +30 -4
  661. package/dist/trace/exit-seat.js +40 -36
  662. package/dist/trace/extension-call-face.d.ts +3 -2
  663. package/dist/trace/extension-call-face.js +3 -1
  664. package/dist/trace/ledger-events.d.ts +4 -7
  665. package/dist/trace/ledger-sink.d.ts +1 -30
  666. package/dist/trace/ledger-sink.js +0 -11
  667. package/dist/trace/model-segment.d.ts +5 -5
  668. package/dist/trace/model-segment.js +5 -5
  669. package/dist/trace/project.d.ts +55 -42
  670. package/dist/trace/project.js +52 -19
  671. package/dist/trace/redact.d.ts +123 -27
  672. package/dist/trace/redact.js +880 -260
  673. package/dist/trace/self-minted-wire.d.ts +487 -19
  674. package/dist/trace/self-minted-wire.js +172 -23
  675. package/dist/trace/wire-projection-faces.d.ts +5 -6
  676. package/dist/trace/wire-projection-faces.js +2 -2
  677. package/dist/upstream-body.d.ts +23 -0
  678. package/dist/upstream-body.js +16 -0
  679. package/dist/url-refusal.d.ts +3 -3
  680. package/dist/url-refusal.js +11 -4
  681. package/dist/user-authored-text.d.ts +1 -1
  682. package/dist/user-input-ledger.d.ts +7 -8
  683. package/dist/user-input-ledger.js +1 -1
  684. package/dist/web-admin-client/apply-effective.d.ts +6 -3
  685. package/dist/web-admin-client/apply-effective.js +13 -16
  686. package/dist/web-admin-client/apply-ledger.d.ts +16 -7
  687. package/dist/web-admin-client/apply-ledger.js +5 -2
  688. package/dist/web-admin-client/center-request.d.ts +2 -2
  689. package/dist/web-admin-client/center-request.js +15 -15
  690. package/dist/web-admin-client/effective-keys.d.ts +1 -1
  691. package/dist/web-admin-client/effective-keys.js +1 -1
  692. package/dist/web-admin-client/entry-metadata.d.ts +8 -0
  693. package/dist/web-admin-client/entry-metadata.js +13 -0
  694. package/dist/web-admin-client/http-client.d.ts +1 -1
  695. package/dist/web-admin-client/http-client.js +23 -4
  696. package/dist/web-admin-client/mcp-revocation.d.ts +1 -1
  697. package/dist/web-admin-client/mcp-revocation.js +2 -1
  698. package/dist/web-admin-client/read-warnings.d.ts +1 -0
  699. package/dist/web-admin-client/read-warnings.js +1 -0
  700. package/dist/web-admin-client/restart-signal.js +8 -4
  701. package/dist/web-admin-client/skills-mcp.d.ts +2 -2
  702. package/dist/web-admin-client/types.d.ts +1 -2
  703. package/dist/workspace-space.d.ts +3 -2
  704. package/docs/DEVICE-EXECUTOR-PROTOCOL.md +4 -4
  705. package/package.json +6 -3
  706. package/scripts/drain-check-local.mjs +118 -147
  707. package/scripts/drain-check.mysql.sql +22 -2
  708. package/scripts/drain-check.pg.sql +22 -2
  709. package/wire-changes/server@7.148.0.json +1517 -0
  710. package/dist/http/memory-control-plane-corrupt-reply.d.ts +0 -25
  711. package/dist/http/memory-control-plane-corrupt-reply.js +0 -19
  712. package/dist/http/memory-layer-reply.d.ts +0 -30
  713. package/dist/http/memory-layer-reply.js +0 -24
  714. package/dist/lsp/e2b-bridge.d.ts +0 -57
  715. package/dist/lsp/e2b-bridge.js +0 -139
  716. package/dist/lsp/e2b-manager.d.ts +0 -93
  717. package/dist/lsp/e2b-manager.js +0 -178
  718. package/dist/lsp/lsp-frames.d.ts +0 -14
  719. package/dist/lsp/lsp-frames.js +0 -25
  720. package/dist/lsp/manager.d.ts +0 -129
  721. package/dist/lsp/manager.js +0 -127
  722. package/dist/lsp/types.d.ts +0 -12
  723. package/dist/lsp/types.js +0 -2
  724. package/dist/lsp/ws-transport.d.ts +0 -40
  725. package/dist/lsp/ws-transport.js +0 -210
@@ -12,7 +12,7 @@ import { applyCenterArtifact, centerSourceOnError, withPromptArtifactBackfill }
12
12
  import { centerScenarios, centerScenarioDetails } from "../capabilities/scenarios.js";
13
13
  import { isRosterGateArmed } from "../config.js";
14
14
  import { DEPLOYMENT_SHAPE_PREDICATES } from "../deployment-shape.js";
15
- import { defaultLkgPath, defaultSkillCacheDir, saveLkg, loadLkg } from "../config-lkg.js";
15
+ import { defaultLkgPath, defaultSkillCacheDir, saveLkg, loadLkg, preIdentityLkgLeftover, PRE_IDENTITY_LKG_REASON } from "../config-lkg.js";
16
16
  import { answerStillCurrent, centerStateBin, credentialIdentityNow, judgeCenterCredentialAtBoot } from "../center-credential.js";
17
17
  import { createCenterConfigTier } from "../center-config-tier.js";
18
18
  import { buildCenterCredentialHealthView, createCenterCredentialRenewer } from "../center-credential-renewer.js";
@@ -20,8 +20,10 @@ import { centerManagedConfigKeys } from "../web-admin-client/apply-effective.js"
20
20
  import { configSourceKind, createConfigProvider, raceBootFetch, BOOT_FETCH_DEFERRED } from "../config-provider.js";
21
21
  import { REMOTE_CATALOG_SOURCE } from "../env-model-table-gate.js";
22
22
  import { ConfigDirUntrustedError } from "../config-dir-trust.js";
23
+ import { ConfigPullError, ConfigPullSupersededError, asConfigPullError, configPullFailureNote } from "../config-pull-failure.js";
23
24
  import { createKeyResolver } from "../key-resolver.js";
24
25
  import { buildSealedKeyPublicFace, ensureCheckpointCtxSealing, ensureSealedKeyStore, reportExecutionPublicKey } from "../sealed-key.js";
26
+ import { sealedKeyDirOf } from "../sealed-key-layout.js";
25
27
  import { anthropicLaneCredentialOf } from "../model-route-gap.js";
26
28
  import { applyEffective, applyCenterReadFace, buildReadFaceBaseline, buildReadFaceSwapCandidate, restoreReadFaceBaseline, mutateInPlace, logEffectiveDiff, applySkillsManifest, skillManifestEntriesNotInstalled, resolveMcpServers, resolveA2aPeers, restartReasons, modelPlaneChanged, withModelPlaneOf, fullyLandedForLkg, NO_CENTER_EFFECTIVE, isNoCenterEffective, fetchPromptArtifact } from "../web-admin-client/facade.js";
27
29
  import { buildConfigHandoff, buildRestartSignal, configHandoffMissing } from "../fleet/engine-signal.js";
@@ -29,7 +31,7 @@ import { createMcpRevocationLedger, enabledMcpEntries } from "../web-admin-clien
29
31
  import { buildUnreadConfigFileFields, buildUnreadConfigKeyFields } from "../web-admin-client/read-warnings.js";
30
32
  import { CONFIG_DOMAIN_INVALID_NOTE, buildCandidateRejectedFields, candidateRejectionOf, judgeConfigCandidate } from "../web-admin-client/candidate-gate.js";
31
33
  import { SHA256_HEX_RE } from "../digest-form.js";
32
- import { BOOT_REJUDGE_OF_REFUSED_GROUP, createConfigApplyLedger, modelPlaneCommitted, refusedGroups } from "../web-admin-client/apply-ledger.js";
34
+ import { BOOT_REJUDGE_OF_REFUSED_GROUP, createConfigApplyLedger, modelPlaneOutcome, refusedGroups } from "../web-admin-client/apply-ledger.js";
33
35
  import { announceReadDenyRows, buildDeploymentPostureSeats } from "./runner-deps.js";
34
36
  import { seatText } from "../trace/exit-seat.js";
35
37
  const MODELS_REJECTION_PHRASE = {
@@ -133,6 +135,15 @@ export async function createWebAdminRuntime(ctx) {
133
135
  validatorIdentity.delete(oldest.value);
134
136
  };
135
137
  const pullEffective = async (provider, etag) => {
138
+ try {
139
+ return await pullEffectiveOnce(provider, etag);
140
+ }
141
+ catch (err) {
142
+ throw asConfigPullError(err);
143
+ }
144
+ };
145
+ const refreshFailureCause = (err) => (err instanceof ConfigPullError ? err.pullCause : "apply_refused");
146
+ const pullEffectiveOnce = async (provider, etag) => {
136
147
  if (provider.kind === "local")
137
148
  return provider.fetchEffective(etag);
138
149
  const before = currentIdentity();
@@ -140,7 +151,7 @@ export async function createWebAdminRuntime(ctx) {
140
151
  const r = await provider.fetchEffective(conditional);
141
152
  const used = r === null ? before : r.credentialIdentity;
142
153
  if (cc === undefined || !answerStillCurrent(cc.credential, used)) {
143
- throw new Error("center credential identity changed while the effective pull was in flight — response discarded; the next pull runs under the current credential");
154
+ throw new ConfigPullSupersededError("center credential identity changed while the effective pull was in flight — response discarded; the next pull runs under the current credential");
144
155
  }
145
156
  if (r !== null) {
146
157
  candidateIdentity.set(r.effective, used);
@@ -148,7 +159,7 @@ export async function createWebAdminRuntime(ctx) {
148
159
  }
149
160
  return r;
150
161
  };
151
- const sealedKeyDir = config.sealedKeyDir ?? join(config.localDataRoot ?? localRoot, "sealed-key");
162
+ const sealedKeyDir = sealedKeyDirOf(config, localRoot);
152
163
  let sealedKeys;
153
164
  try {
154
165
  sealedKeys = await ensureSealedKeyStore(sealedKeyDir, logger);
@@ -422,8 +433,7 @@ export async function createWebAdminRuntime(ctx) {
422
433
  handoff = { ...(applied !== undefined ? { applied } : {}), ...(durable !== undefined ? { durable } : {}) };
423
434
  latchHandoff();
424
435
  };
425
- const markApplied = (gen, eff) => {
426
- applyLedger.applied(gen, eff.version);
436
+ const markApplied = (eff) => {
427
437
  if (isNoCenterEffective(eff))
428
438
  noteHandoff({ noneApplied: true });
429
439
  else
@@ -432,6 +442,7 @@ export async function createWebAdminRuntime(ctx) {
432
442
  if (landed !== undefined)
433
443
  announceTier(landed);
434
444
  };
445
+ const closeApplied = (gen, eff) => applyLedger.applied(gen, eff.version);
435
446
  let lkgBooted = false;
436
447
  let bootLkgCandidate;
437
448
  let lastPrewarmBodiesVerified = false;
@@ -495,10 +506,13 @@ export async function createWebAdminRuntime(ctx) {
495
506
  return null;
496
507
  }
497
508
  const lkgPath = lkgPathFor(identity);
498
- const read = await loadLkg(lkgPath, cc?.worker, identity);
509
+ const read = await loadLkg(lkgPath, cc?.worker, identity, { declaredOwnerUid: config.configLocalOwnerUid });
499
510
  if (!read.lkg) {
500
511
  if (read.reason !== "absent")
501
512
  logger.warn("config_lkg_unusable", { path: lkgPath, reason: read.reason, note: "ignoring the on-disk LKG — env fallback serves; the cache rewrites on the next clean candidate" });
513
+ const leftover = read.reason === "absent" && config.configLkgPath === undefined ? preIdentityLkgLeftover(config, cc?.worker, lkgPath) : undefined;
514
+ if (leftover !== undefined)
515
+ logger.warn("config_lkg_unusable", { path: leftover, reason: PRE_IDENTITY_LKG_REASON, note: "a last-known-good written by 7.98.0 or earlier sits at the pre-identity default name and is never read — delete this file (a cache, not data); env fallback serves, and the next clean candidate writes this credential identity's own LKG" });
502
516
  return null;
503
517
  }
504
518
  if (currentIdentity() !== identity) {
@@ -544,9 +558,10 @@ export async function createWebAdminRuntime(ctx) {
544
558
  const lkgIdentity = candidateIdentityOf(lkgR.effective);
545
559
  if (lkgSurvivesRestart && lkgIdentity !== undefined)
546
560
  noteHandoff({ durable: { version: lkgR.effective.version, identity: lkgIdentity } });
547
- markApplied(lkgGen, lkgR.effective);
561
+ markApplied(lkgR.effective);
562
+ closeApplied(lkgGen, lkgR.effective);
548
563
  await adoptCenterPrompts(lkgR.effective, lkgR.prompts, "boot-lkg");
549
- const lkgPlane = modelPlaneCommitted(lkgReport);
564
+ const lkgPlane = modelPlaneOutcome(lkgReport) === "landed";
550
565
  if (lkgPlane)
551
566
  markRosterLanded(lkgR.effective);
552
567
  effective = lkgR.effective;
@@ -592,7 +607,6 @@ export async function createWebAdminRuntime(ctx) {
592
607
  : "config.d/models.json 空或 CONFIG_LOCAL_DIR 指错目录(选目录旋钮是 CONFIG_LOCAL_DIR,不是 LOCAL_DATA_ROOT)— 模型继续走 env 兜底",
593
608
  });
594
609
  };
595
- let bootApplyPhase = false;
596
610
  try {
597
611
  const bootFetch = pullEffective(configProvider, undefined);
598
612
  const raced = await raceBootFetch(bootFetch, config.configBootFetchBudgetMs);
@@ -611,7 +625,6 @@ export async function createWebAdminRuntime(ctx) {
611
625
  }
612
626
  const r = raced === BOOT_FETCH_DEFERRED ? null : raced;
613
627
  if (r) {
614
- bootApplyPhase = true;
615
628
  for (const de of r.domainErrors ?? [])
616
629
  logger.warn("config_domain_invalid", { domain: de.domain, error: de.error, note: CONFIG_DOMAIN_INVALID_NOTE });
617
630
  if (dryRun) {
@@ -651,18 +664,20 @@ export async function createWebAdminRuntime(ctx) {
651
664
  recordApply(rep, bootArrival);
652
665
  },
653
666
  });
654
- markApplied(bootGen, r.effective);
667
+ markApplied(r.effective);
668
+ closeApplied(bootGen, r.effective);
655
669
  const bootClean = fullyLandedForLkg(r, bootReport);
656
670
  if (bootClean)
657
671
  ccEtag = r.etag;
658
672
  await adoptCenterPrompts(r.effective, bootVerdict.prompts, "boot");
659
- let bootPlaneEff = modelPlaneCommitted(bootReport) ? r.effective : undefined;
660
- if (bootPlaneEff === undefined) {
673
+ const bootOutcome = modelPlaneOutcome(bootReport);
674
+ let bootPlaneEff = bootOutcome === "landed" ? r.effective : undefined;
675
+ if (bootOutcome === "refused" || bootOutcome === undefined) {
661
676
  const lkgPlane = await bootFromLkg("boot candidate's model plane was refused", "model-plane");
662
677
  if (lkgPlane) {
663
678
  let planeReport;
664
679
  applyEffective(config, withModelPlaneOf(r.effective, lkgPlane.effective), logger, { leg: "boot", catalogSource: lkgPlane.catalogSource, sealedKeys, generation: bootGen, report: (rep) => (planeReport = rep) });
665
- if (modelPlaneCommitted(planeReport)) {
680
+ if (modelPlaneOutcome(planeReport) === "landed") {
666
681
  bootPlaneEff = lkgPlane.effective;
667
682
  logger.warn("config_model_plane_from_lkg", { version: r.effective.version, lkgVersion: lkgPlane.effective.version, note: "the live candidate's model plane was refused at boot — serving the LKG's model plane (the catalog and what rides with it) with the live candidate's other groups; the refresh cadence re-judges the candidate" });
668
683
  }
@@ -690,11 +705,11 @@ export async function createWebAdminRuntime(ctx) {
690
705
  catch (err) {
691
706
  if (err instanceof ConfigDirUntrustedError)
692
707
  throw err;
693
- if (bootApplyPhase)
694
- logger.warn("config_apply_refused", { source: configProvider.kind, err: seatText("operator-log-text", String(err)), note: "the pulled candidate failed to apply at boot — falling back to the LKG / env; this is not a reachability failure" });
708
+ if (err instanceof ConfigPullError)
709
+ logger.warn("config_source_unreachable_using_env", { source: configProvider.kind, cause: err.pullCause, err: seatText("operator-log-text", String(err)), note: configPullFailureNote(err.pullCause) });
695
710
  else
696
- logger.warn("config_source_unreachable_using_env", { source: configProvider.kind, err: seatText("operator-log-text", String(err)) });
697
- await bootFallBackWhole(`${bootApplyPhase ? "boot apply refused" : "boot fetch failed"}: ${seatText("operator-log-text", String(err))}`);
711
+ logger.warn("config_apply_refused", { source: configProvider.kind, err: seatText("operator-log-text", String(err)), note: "the pulled candidate failed to apply at boot — falling back to the LKG / env; this is not a reachability failure" });
712
+ await bootFallBackWhole(`${err instanceof ConfigPullError ? "boot fetch failed" : "boot apply refused"}: ${seatText("operator-log-text", String(err))}`);
698
713
  }
699
714
  if (!dryRun && cc !== undefined && currentIdentity() !== promptStateIdentity)
700
715
  await rebasePromptState(currentIdentity(), "boot-end");
@@ -839,6 +854,7 @@ export async function createWebAdminRuntime(ctx) {
839
854
  startRefreshLoop(a) {
840
855
  const { pricing, limitSync, swapRunnerDeps, ceilingVerdict, consolidationSeat, degradeRoute, checkpointStorePresent } = a;
841
856
  const signalRestart = (c) => {
857
+ closeApplied(c.gen, c.effective);
842
858
  const reasons = restartReasons(c.baseline, c.effective, restartCtx(consolidationSeat?.read(), degradeRoute.read()));
843
859
  const skillsChangeDetected = reasons.includes("skills");
844
860
  if (bootSkillStale && !skillsChangeDetected)
@@ -934,8 +950,8 @@ export async function createWebAdminRuntime(ctx) {
934
950
  if (phase !== "boot-deferred")
935
951
  mcpRevocations.applyEnabledEntries(enabledMcpEntries(eff.mcp));
936
952
  applyLiveReadFace(eff, swapRunnerDeps, phase);
937
- markApplied(gen, eff);
938
- const planeCommitted = modelPlaneCommitted(report);
953
+ markApplied(eff);
954
+ const planeCommitted = modelPlaneOutcome(report) === "landed";
939
955
  if (planeCommitted)
940
956
  appliedPlaneEff = noCenter ? undefined : eff;
941
957
  planeDeferredNoHandoff = undefined;
@@ -954,6 +970,7 @@ export async function createWebAdminRuntime(ctx) {
954
970
  if (!hot.committed) {
955
971
  throw new Error("the no-center tier was refused (the Runners did not accept the env model table) — the previous account's center configuration is still in force; retried next tick");
956
972
  }
973
+ closeApplied(gen, NO_CENTER_EFFECTIVE);
957
974
  if (hot.report !== undefined && !hot.report.fullyApplied) {
958
975
  logger.warn("center_identity_demotion_partial", { groups: refusedGroups(hot.report).map((g) => g.group), note: "a group of the no-center tier was refused — that group keeps its previous values (loud; the env base for that group could not be applied)" });
959
976
  }
@@ -1045,7 +1062,7 @@ export async function createWebAdminRuntime(ctx) {
1045
1062
  groups: refused.map((g) => g.group),
1046
1063
  note: "a group of this candidate was refused — the live config keeps serving the prior values for it; the LKG and the ETag stay on the last FULLY applied generation (this tree is re-judged next tick)",
1047
1064
  });
1048
- const partialSignal = signalRestart({ applied: "partial", effective: r.effective, baseline: effective, refused: refused.map((g) => g.group) });
1065
+ const partialSignal = signalRestart({ applied: "partial", gen: tickGen, effective: r.effective, baseline: effective, refused: refused.map((g) => g.group) });
1049
1066
  logger.info("web_admin_refreshed", {
1050
1067
  version: r.effective.version,
1051
1068
  note: "partially applied — the refused group(s) keep their prior values (see config_candidate_partially_applied); the other groups hot-applied; restart fields as on a complete tick",
@@ -1054,7 +1071,7 @@ export async function createWebAdminRuntime(ctx) {
1054
1071
  return "ok";
1055
1072
  }
1056
1073
  const lkgPersisted = await persistLkgDurable(r.effective, r.etag);
1057
- const signal = signalRestart({ applied: "complete", effective: r.effective, ...(r.etag !== undefined ? { etag: r.etag } : {}), baseline: effective, lkgPersisted });
1074
+ const signal = signalRestart({ applied: "complete", gen: tickGen, effective: r.effective, ...(r.etag !== undefined ? { etag: r.etag } : {}), baseline: effective, lkgPersisted });
1058
1075
  logger.info("web_admin_refreshed", {
1059
1076
  version: r.effective.version,
1060
1077
  note: "runtime governance (incl. approvalRequire) + limits + models/roles/roster hot-applied; skills/mcp/a2a/scenarios are restart-to-apply",
@@ -1066,7 +1083,7 @@ export async function createWebAdminRuntime(ctx) {
1066
1083
  }
1067
1084
  }
1068
1085
  catch (err) {
1069
- logger.warn("web_admin_refresh_failed", { err: seatText("operator-log-text", String(err)), note: "etag NOT advanced — the same candidate is re-fetched and re-applied next poll" });
1086
+ logger.warn("web_admin_refresh_failed", { cause: refreshFailureCause(err), err: seatText("operator-log-text", String(err)), note: "etag NOT advanced — the same candidate is re-fetched and re-applied next poll" });
1070
1087
  return "failed";
1071
1088
  }
1072
1089
  finally {
@@ -1075,16 +1092,17 @@ export async function createWebAdminRuntime(ctx) {
1075
1092
  return "ok";
1076
1093
  };
1077
1094
  let inFlight;
1078
- const runTick = (arrival) => {
1095
+ const enterLane = (body) => {
1079
1096
  if (inFlight)
1080
1097
  return inFlight;
1081
- const p = refreshTick(arrival).finally(() => {
1098
+ const p = body().finally(() => {
1082
1099
  inFlight = undefined;
1083
1100
  afterLane();
1084
1101
  });
1085
1102
  inFlight = p;
1086
1103
  return p;
1087
1104
  };
1105
+ const runTick = (arrival) => enterLane(() => refreshTick(arrival));
1088
1106
  const requestTick = () => {
1089
1107
  if (ccTimer === undefined || ownRead)
1090
1108
  return;
@@ -1115,21 +1133,22 @@ export async function createWebAdminRuntime(ctx) {
1115
1133
  requestTick();
1116
1134
  const deferredBootApply = async (r, arrivalGen) => {
1117
1135
  if (!r)
1118
- return;
1136
+ return "ok";
1119
1137
  if (refreshInFlight)
1120
- return;
1138
+ return "ok";
1121
1139
  refreshInFlight = true;
1122
1140
  try {
1123
1141
  await deferredBootApplyInner(r, useArrivalGeneration(r.effective.version, arrivalGen));
1124
1142
  if (configProvider.kind === "remote")
1125
1143
  lastPull = "ok";
1144
+ return "ok";
1126
1145
  }
1127
1146
  catch (err) {
1128
- logger.warn("web_admin_refresh_failed", { err: seatText("operator-log-text", String(err)), leg: "boot-deferred", note: "etag NOT advanced — the refresh cadence re-fetches and re-applies the same candidate" });
1147
+ logger.warn("web_admin_refresh_failed", { cause: refreshFailureCause(err), err: seatText("operator-log-text", String(err)), leg: "boot-deferred", note: "etag NOT advanced — the refresh cadence re-fetches and re-applies the same candidate" });
1148
+ return "failed";
1129
1149
  }
1130
1150
  finally {
1131
1151
  refreshInFlight = false;
1132
- afterLane();
1133
1152
  }
1134
1153
  };
1135
1154
  const deferredBootApplyInner = async (r, lateGen) => {
@@ -1159,7 +1178,7 @@ export async function createWebAdminRuntime(ctx) {
1159
1178
  groups: refusedLate.map((g) => g.group),
1160
1179
  note: "late-boot candidate had a refused group — the LKG/ETag stay on the last FULLY applied generation; the refresh cadence re-judges the same tree",
1161
1180
  });
1162
- const partialSignalLate = signalRestart({ applied: "partial", effective: r.effective, baseline: undefined, refused: refusedLate.map((g) => g.group) });
1181
+ const partialSignalLate = signalRestart({ applied: "partial", gen: lateGen, effective: r.effective, baseline: undefined, refused: refusedLate.map((g) => g.group) });
1163
1182
  logger.info("config_loaded_deferred", { source: configProvider.kind, version: r.effective.version, models: (r.effective.models?.models ?? []).filter((m) => m.enabled !== false).length, ...restartLogFields(partialSignalLate) });
1164
1183
  return;
1165
1184
  }
@@ -1167,16 +1186,16 @@ export async function createWebAdminRuntime(ctx) {
1167
1186
  latestEffective = r.effective;
1168
1187
  ccEtag = r.etag;
1169
1188
  const lkgPersistedLate = await persistLkgDurable(r.effective, r.etag);
1170
- const signalLate = signalRestart({ applied: "complete", effective: r.effective, ...(r.etag !== undefined ? { etag: r.etag } : {}), baseline: undefined, lkgPersisted: lkgPersistedLate });
1189
+ const signalLate = signalRestart({ applied: "complete", gen: lateGen, effective: r.effective, ...(r.etag !== undefined ? { etag: r.etag } : {}), baseline: undefined, lkgPersisted: lkgPersistedLate });
1171
1190
  logger.info("config_loaded_deferred", { source: configProvider.kind, version: r.effective.version, models: (r.effective.models?.models ?? []).filter((m) => m.enabled !== false).length, ...restartLogFields(signalLate) });
1172
1191
  };
1173
1192
  if (bootConfigPending) {
1174
1193
  const arrivalGen = reserveArrivalGeneration();
1175
- const continueArrival = (r) => void (lkgBooted ? runTick({ result: r, ordinal: arrivalGen }) : deferredBootApply(r, arrivalGen));
1194
+ const continueArrival = (r) => void (lkgBooted ? runTick({ result: r, ordinal: arrivalGen }) : enterLane(() => deferredBootApply(r, arrivalGen)));
1176
1195
  void bootConfigPending.then((r) => {
1177
1196
  if (r !== null && configProvider.kind === "remote" && candidateIdentityOf(r.effective) !== currentIdentity()) {
1178
1197
  logger.warn("config_boot_arrival_identity_changed", { note: "the late boot pull landed under a center credential that is no longer current — not adopted; re-pulling once under the current credential" });
1179
- void pullEffective(configProvider, undefined).then(continueArrival, (err) => logger.warn("config_boot_arrival_repull_failed", { err: seatText("operator-log-text", String(err)), note: "the refresh cadence retries under the current credential" }));
1198
+ void pullEffective(configProvider, undefined).then(continueArrival, (err) => logger.warn("config_boot_arrival_repull_failed", { cause: refreshFailureCause(err), err: seatText("operator-log-text", String(err)), note: "the refresh cadence retries under the current credential" }));
1180
1199
  return;
1181
1200
  }
1182
1201
  continueArrival(r);
@@ -1189,9 +1208,10 @@ export async function createWebAdminRuntime(ctx) {
1189
1208
  clearInterval(ccTimer);
1190
1209
  ccTimer = undefined;
1191
1210
  }
1192
- credentialRenewer?.stop();
1211
+ const credentialSettled = credentialRenewer?.stop() ?? Promise.resolve();
1193
1212
  unwatchCredential?.();
1194
1213
  unwatchCredential = undefined;
1214
+ return credentialSettled;
1195
1215
  },
1196
1216
  centerCredentialState() {
1197
1217
  return cc === undefined ? undefined : buildCenterCredentialHealthView(cc.credential.health(), credentialRenewer);
@@ -24,7 +24,7 @@
24
24
  * 当年 core 的摘要器没有凭据座,只能在 brain 外面包一层注入 `options.apiKey`(`createPerModelKeyBrain`)。
25
25
  * core 7.51.0 起 `WebFetchSummarizerOptions.getApiKeyAndHeaders` 是与 `TaskSpec` / `SideQuerySpec` 同一签名的座
26
26
  * (每次摘要按摘要器的模型解一次,`{ apiKey, headers }` 两半都收)⇒ 那层包装退役:`RunnerDeps.brain` 原样交给
27
- * 摘要器,座位由与 side-query / 记忆整理**同一只**座位工厂(`createPerModelAuthSeat`)填充:
27
+ * 摘要器,座位由与 side-query **同一只**座位工厂(`createPerModelAuthSeat`)填充(两面都每次现取模型、不焊模型;记忆整理席焊住 Model,凭据随座冻结,见 `boot/memory-consolidation.ts`):
28
28
  * · 有 per-model key ⇒ 请求带模型自己的凭据;
29
29
  * · 无 ⇒ 座位回 `undefined` ⇒ 交回 core 按它自己的 key↔URL 配对法判(部署根上的模型带网关 key;
30
30
  * entry URL 不在部署根上 ⇒ `route.credential_mismatch` 响亮拒 —— core 7.51.0 起没有「未声明部署根」的
@@ -15,7 +15,9 @@ export interface ReclaimableRunStore {
15
15
  }
16
16
  /** A checkpoint store just enough to answer "is this session a resume-in-progress?" (pending checkpoint). */
17
17
  export interface ReclaimCheckpointProbe {
18
- findPendingTokenBySession: (sessionId: string) => Promise<unknown>;
18
+ findPendingTokenBySession: (sessionId: string, scope: undefined, binding: {
19
+ readonly axis: "run";
20
+ }) => Promise<unknown>;
19
21
  }
20
22
  /**
21
23
  * Reclaim runs orphaned by a previous host-lane engine process (flip orphaned `running` → failed + release their
@@ -3,7 +3,7 @@ export async function reclaimOrphansAtBoot(runStore, checkpointStore, logger) {
3
3
  if (typeof store?.reclaimOrphanedAtBoot !== "function")
4
4
  return 0;
5
5
  const isResumable = checkpointStore
6
- ? async (sid) => Boolean(await checkpointStore.findPendingTokenBySession(sid))
6
+ ? async (sid) => Boolean(await checkpointStore.findPendingTokenBySession(sid, undefined, { axis: "run" }))
7
7
  : undefined;
8
8
  const reclaimedCount = await store.reclaimOrphanedAtBoot(isResumable);
9
9
  if (reclaimedCount > 0)
package/dist/brain.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import { type Brain, type BreakerState, type Model } from "@sema-agent/core";
2
2
  import type { ServiceConfig } from "./config-types.js";
3
- import { type SealedCustodyPoison } from "./key-resolver.js";
3
+ import { type CredentialIdentity } from "./key-resolver.js";
4
4
  import { type RestartSliceCtx } from "./web-admin-client/restart-signal.js";
5
5
  /**
6
6
  * 配了快切层(failover ≥2 路 / 断路器)时,**每路**的重试上限。
@@ -62,24 +62,13 @@ export type DegradeRoutePlane = Pick<ServiceConfig, "degrade" | "models" | "gate
62
62
  */
63
63
  export declare function degradeTargetOf(config: Pick<ServiceConfig, "degrade" | "models">): Model | undefined;
64
64
  /**
65
- * [ref](R1):降级壳里目标自有凭据的**身份**(不是值)—— 与目标那只 Model 同一代,在 createBrain 组壳那一刻冻结。
66
- * · `apiKeyEnv` —— 那一代给目标配的 env 变量**名**;壳每跳按这个名字现读值(同名轮换仍热;变量被删 ⇒ [ref] 起 `env_missing` 毒丸,跳响亮拒 —— 7.105.0 及以前是「与自有凭据缺席同一臂」、落网关 key 档)。
67
- * · `sealed` —— 那一代托管密钥的解封产物(明文,或解不开时的毒丸;与 `config.modelApiKeys` 的值同型)。托管密钥的身份是它的密文;
68
- * 本进程的托管店在 boot 读一次、此后不变(`ensureSealedKeyStore`),同一密文恒解出同一产物 —— 所以持有那一代的产物就是持有
69
- * 那一代的身份(壳里没有密文与托管店,也不需要)。重贴 = 新 key = 新身份,要重启才进壳 —— `degrade-route` 指纹带它的身份摘要,
70
- * 所以重贴会签。🔴 明文是活秘密:只活在壳的闭包里,指纹只取摘要({@link degradeRouteFingerprint}),绝不进日志 / 序列化面。
71
- * 目标没有自有凭据 ⇒ `{}`。两张表至多一个条目有效(registry-core 互斥:带 sealedApiKey 的条目不落 modelApiKeyEnv)。
65
+ * [ref]:读出 `target`(降级壳焊的那只目标,{@link degradeTargetOf})此刻的凭据**身份**(不是值;读法是 key 链的 `credentialIdentityOf`,
66
+ * 与记忆整理席同一只)—— 唯一读法:createBrain 组壳时与目标 Model 一起冻结它,`degrade-route` 指纹的两侧读数与启动摘要同读它。
67
+ * 查的名字与序:目标真名、再 `degrade.to`(后者可能是 `default` 别名,两张 key 表按真名索引、env 车道的目录则反过来);每个名字上托管密钥压过 env 引用。
68
+ * 托管密钥重贴 = 新身份,要重启才进壳 —— 指纹带它的身份摘要,所以重贴会签。🔴 明文是活秘密:只活在壳的闭包里,指纹只取摘要,绝不进日志 / 序列化面。
69
+ * 目标没有自有凭据 ⇒ `{}`。
72
70
  */
73
- export interface DegradeCredentialIdentity {
74
- readonly apiKeyEnv?: string;
75
- readonly sealed?: string | SealedCustodyPoison;
76
- }
77
- /**
78
- * [ref]:读出 `target`(降级壳焊的那只目标,{@link degradeTargetOf})此刻的凭据身份 —— **唯一**读法:createBrain 组壳时冻结它,
79
- * `degrade-route` 指纹的两侧读数与启动摘要同读它。查表的键与序与修前 `fbOwnApiKey` 同:目标真名、再 `degrade.to`(后者可能是
80
- * `default` 别名,两张 key 表按真名索引、env 车道的目录则反过来);每个名字上托管密钥压过 env 引用(key-resolver 的序)。
81
- */
82
- export declare function degradeCredentialIdentityOf(config: Pick<ServiceConfig, "degrade" | "modelApiKeyEnv" | "modelApiKeys">, target: Pick<Model, "name">): DegradeCredentialIdentity;
71
+ export declare function degradeCredentialIdentityOf(config: Pick<ServiceConfig, "degrade" | "modelApiKeyEnv" | "modelApiKeys">, target: Pick<Model, "name">): CredentialIdentity;
83
72
  /**
84
73
  * [ref]:降级壳的**路由指纹**(纯数据)—— `degrade-route` 重启片 `baked` / `current` 两侧读数的唯一读法。
85
74
  *
package/dist/brain.js CHANGED
@@ -2,8 +2,7 @@ import { adjudicateModelRoute, createAnthropicBrain, createCircuitBreakerBrain,
2
2
  import { routeKeyOf } from "@sema-agent/core";
3
3
  import { buildDefaultResilience } from "./config-types.js";
4
4
  import { resolveModelApiKey } from "./key-resolver.js";
5
- import { createHash } from "node:crypto";
6
- import { isModelKeyPoison, modelKeyPoisonIdentity } from "./key-resolver.js";
5
+ import { credentialIdentityFingerprint, credentialIdentityOf } from "./key-resolver.js";
7
6
  import { anthropicRouteRoot, brainLaneFor, mountRoutes, routeTableOf } from "./model-provider.js";
8
7
  import { openaiRouteBaseUrl } from "./model-route-endpoint.js";
9
8
  import { anthropicLaneCredentialOf, declaredCredential } from "./model-route-gap.js";
@@ -156,12 +155,9 @@ export function degradeTargetOf(config) {
156
155
  }
157
156
  export function degradeCredentialIdentityOf(config, target) {
158
157
  for (const name of config.degrade === undefined ? [target.name] : [target.name, config.degrade.to]) {
159
- const sealed = config.modelApiKeys?.[name];
160
- if (sealed !== undefined)
161
- return { sealed };
162
- const apiKeyEnv = config.modelApiKeyEnv?.[name];
163
- if (apiKeyEnv !== undefined)
164
- return { apiKeyEnv };
158
+ const identity = credentialIdentityOf(config, name);
159
+ if (identity.sealed !== undefined || identity.apiKeyEnv !== undefined)
160
+ return identity;
165
161
  }
166
162
  return {};
167
163
  }
@@ -175,17 +171,9 @@ function degradeWeldFingerprint(config, target, credential) {
175
171
  return {
176
172
  model: catalogEntryFingerprint(target),
177
173
  endpoint: openaiRouteBaseUrl(target.baseUrl, config.gatewayBaseUrl) ?? null,
178
- apiKeyEnv: credential.apiKeyEnv ?? null,
179
- sealedKey: sealedIdentityFingerprint(credential.sealed),
174
+ ...credentialIdentityFingerprint(credential),
180
175
  };
181
176
  }
182
- function sealedIdentityFingerprint(sealed) {
183
- if (sealed === undefined)
184
- return null;
185
- if (isModelKeyPoison(sealed))
186
- return { poisoned: modelKeyPoisonIdentity(sealed), reason: sealed.reason };
187
- return { digest: createHash("sha256").update(sealed, "utf8").digest("hex").slice(0, 16) };
188
- }
189
177
  export function buildFailoverFirstByteNotice(config) {
190
178
  const r = config.resilience ?? DEFAULT_RESILIENCE;
191
179
  const fallbacks = config.gatewayFallbackUrls.length;
package/dist/budget.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import { isModelPriced, modelCostToPricing } from "@sema-agent/core";
2
- import { currentPrincipal } from "./observability/principal-context.js";
2
+ import { currentPerson } from "./observability/principal-context.js";
3
3
  import { isPermissionRuleEventKind, permissionRuleEventWordOf } from "./observability/permission-rule-events.js";
4
4
  import { promptManifestRecordOf, configAssembledRecordOf } from "./observability/prompt-manifest.js";
5
5
  import { crossBoundaryTaintEventData } from "./trace/project.js";
@@ -85,9 +85,9 @@ export function createTracer(metrics, costQuota, modelUsage, fleetUsage, fleetLe
85
85
  metrics.inc("brain_calls_total", { provider: providerName(e.provider ?? "unknown"), model: modelId(e.model) });
86
86
  if (e.costMicroUsd) {
87
87
  metrics.inc("model_cost_micro_usd_total", { model: modelId(e.model) }, e.costMicroUsd);
88
- const principal = currentPrincipal();
89
- if (principal)
90
- costQuota?.add(principal, e.costMicroUsd);
88
+ const person = currentPerson();
89
+ if (person)
90
+ costQuota?.add(person, e.costMicroUsd);
91
91
  }
92
92
  else if (e.costMicroUsd === undefined) {
93
93
  metrics.inc("brain_calls_unpriced_total", { model: modelId(e.model) });
@@ -96,8 +96,8 @@ export function createTracer(metrics, costQuota, modelUsage, fleetUsage, fleetLe
96
96
  const qwRaw = quotaWeightFor?.(e.model);
97
97
  const qw = typeof qwRaw === "number" && Number.isFinite(qwRaw) && qwRaw > 0 ? qwRaw : 1;
98
98
  const weightedTokens = Math.round((e.totalInputTokens + e.completionTokens) * qw);
99
- fleetUsage?.record(currentPrincipal(), e.model, e.taskId, { inputTokens: e.totalInputTokens, outputTokens: e.completionTokens, ...(e.costMicroUsd !== undefined ? { costMicroUsd: e.costMicroUsd } : {}), weightedTokens, quotaWeightAtUse: qw });
100
- fleetLease?.recordSpend(currentPrincipal(), { weightedTokens, ...(e.costMicroUsd !== undefined ? { costMicroUsd: e.costMicroUsd } : {}) });
99
+ fleetUsage?.record(currentPerson(), e.model, e.taskId, { inputTokens: e.totalInputTokens, outputTokens: e.completionTokens, ...(e.costMicroUsd !== undefined ? { costMicroUsd: e.costMicroUsd } : {}), weightedTokens, quotaWeightAtUse: qw });
100
+ fleetLease?.recordSpend(currentPerson(), { weightedTokens, ...(e.costMicroUsd !== undefined ? { costMicroUsd: e.costMicroUsd } : {}) });
101
101
  if (e.turn !== undefined) {
102
102
  if (e.firstTokenMs !== undefined)
103
103
  metrics.observe("brain_first_token_ms", e.firstTokenMs);
@@ -60,10 +60,16 @@ export declare const PLUGIN_MANIFEST_MAX_BYTES: number;
60
60
  * 布局同族)。返回 ok:true+dir:undefined = 插件没有 skills 目录(可以只有 commands——那是 cli 壳的
61
61
  * 半场,worker 装 0 个 skill 不算失败);ok:false = 路径逃逸/manifest 本体畸形,整条拒装。
62
62
  * manifest 臂分立(V2-⑦,原 broad-catch 是 fail-open):**不存在**=可选面,缺省 skills/;**存在但**
63
- * 本体逃逸根外/非普通文件/超界/读失败/JSON 坏 = ok:false 走既有 warning 面。 */
63
+ * 本体逃逸根外/非普通文件/超界/读失败/JSON 坏 = ok:false 走既有 warning 面。
64
+ *
65
+ * `hooksModule`(ok:true 时同一趟顺带回报,**不**第二次读 manifest):这个插件带不带 hooks 模块 —— 入口有两个,任一在场即真:
66
+ * ① manifest 本体是对象且**自有**顶层键 `hooks` 在场(内联对象或路径串都算;只判键在不在,值不判,嵌套里的 `hooks` 字样不算);
67
+ * ② `hooks/hooks.json` 条目在场({@link hooksFileEntryMayBePresent},只问条目、不读内容)。
68
+ * 只是一条事实交给调用方去响(不改上面的装载判定一字:manifest 是非对象 JSON 时照旧可装、缺省 skills/)。 */
64
69
  export declare function resolvePluginSkillsRoot(cloneRoot: string): {
65
70
  ok: true;
66
71
  dir?: string;
72
+ hooksModule: boolean;
67
73
  } | {
68
74
  ok: false;
69
75
  reason: string;
@@ -2,10 +2,11 @@ import { execFile } from "node:child_process";
2
2
  import { promisify } from "node:util";
3
3
  import { promises as fsp, realpathSync, existsSync, readFileSync, lstatSync, statSync } from "node:fs";
4
4
  import { join, resolve, isAbsolute, sep } from "node:path";
5
- import { ensureDir } from "@sema-agent/core";
5
+ import { ensureDir, hostOfUrl, HOST_UNREADABLE_SENTENCE } from "@sema-agent/core";
6
6
  import { assertConfined, loadSkills } from "./skills.js";
7
7
  import { buildDisplaySafeUrl, redactSecrets } from "../trace/redact.js";
8
8
  import { gitSubprocessEnv } from "../server-secret-env.js";
9
+ import { errorCodeOf } from "../observability/err-text.js";
9
10
  const execFileP = promisify(execFile);
10
11
  export const MAX_PLUGIN_SOURCE_URL_CHARS = 2048;
11
12
  export const DEFAULT_PLUGIN_ALLOW_HOSTS = ["github.com"];
@@ -36,14 +37,12 @@ export function validatePluginDecl(decl, allowHosts) {
36
37
  if (!/^https:\/\//i.test(url)) {
37
38
  return { ok: false, name, reason: `plugin source must be an https:// URL (contract: https-only; got ${buildDisplaySafeUrl(url)})` };
38
39
  }
39
- let host;
40
- try {
41
- host = new URL(url).hostname.toLowerCase();
42
- }
43
- catch {
44
- return { ok: false, name, reason: "https url does not parse" };
40
+ const reading = hostOfUrl(url);
41
+ if ("unreadable" in reading) {
42
+ return { ok: false, name, reason: `plugin source url names no host this allowlist can judge — ${HOST_UNREADABLE_SENTENCE[reading.unreadable]}` };
45
43
  }
46
- if (!allowHosts.some((h) => h.toLowerCase() === host)) {
44
+ const host = reading.host;
45
+ if (!allowHosts.some((h) => allowlistHostOf(h) === host)) {
47
46
  return { ok: false, name, reason: `host ${host} not in PLUGINS_ALLOW_HOSTS (default github.com; extend with a comma-separated https mirror domain list)` };
48
47
  }
49
48
  if (decl.sha !== undefined) {
@@ -54,6 +53,13 @@ export function validatePluginDecl(decl, allowHosts) {
54
53
  }
55
54
  return { ok: true, name, url };
56
55
  }
56
+ function allowlistHostOf(entry) {
57
+ const bare = !/[/?#@\\\s]/.test(entry) && (entry.startsWith("[") ? entry.endsWith("]") : !entry.includes(":"));
58
+ if (!bare || entry === "")
59
+ return undefined;
60
+ const reading = hostOfUrl(`https://${entry}/`);
61
+ return "host" in reading ? reading.host : undefined;
62
+ }
57
63
  export function gitClonePlan(o) {
58
64
  if (o.sha === undefined) {
59
65
  return { steps: [["clone", "--depth", "1", "--quiet", o.url, o.dest]] };
@@ -69,6 +75,7 @@ export function gitClonePlan(o) {
69
75
  export const PLUGIN_MANIFEST_MAX_BYTES = 64 * 1024;
70
76
  export function resolvePluginSkillsRoot(cloneRoot) {
71
77
  let skillsPath = "skills";
78
+ let manifestHasHooksKey = false;
72
79
  const rootReal = realpathSync(cloneRoot);
73
80
  const manifestPath = join(cloneRoot, ".claude-plugin", "plugin.json");
74
81
  let manifestPresent = false;
@@ -90,11 +97,13 @@ export function resolvePluginSkillsRoot(cloneRoot) {
90
97
  const manifest = JSON.parse(readFileSync(manifestPath, "utf8"));
91
98
  if (typeof manifest.skillsPath === "string" && manifest.skillsPath !== "")
92
99
  skillsPath = manifest.skillsPath;
100
+ manifestHasHooksKey = Object.hasOwn(manifest, "hooks");
93
101
  }
94
102
  catch (e) {
95
103
  return { ok: false, reason: `plugin manifest rejected: ${e instanceof Error ? e.message : String(e)}` };
96
104
  }
97
105
  }
106
+ const hooksModule = manifestHasHooksKey || hooksFileEntryMayBePresent(cloneRoot);
98
107
  if (isAbsolute(skillsPath))
99
108
  return { ok: false, reason: `skillsPath must be relative (got ${skillsPath})` };
100
109
  const candidate = resolve(rootReal, skillsPath);
@@ -102,12 +111,22 @@ export function resolvePluginSkillsRoot(cloneRoot) {
102
111
  return { ok: false, reason: `skillsPath escapes the plugin root (${skillsPath})` };
103
112
  }
104
113
  if (!existsSync(candidate))
105
- return { ok: true };
114
+ return { ok: true, hooksModule };
106
115
  const real = realpathSync(candidate);
107
116
  if (real !== rootReal && !real.startsWith(rootReal + sep)) {
108
117
  return { ok: false, reason: `skillsPath resolves outside the plugin root via symlink (${skillsPath})` };
109
118
  }
110
- return { ok: true, dir: candidate };
119
+ return { ok: true, dir: candidate, hooksModule };
120
+ }
121
+ function hooksFileEntryMayBePresent(cloneRoot) {
122
+ try {
123
+ lstatSync(join(cloneRoot, "hooks", "hooks.json"));
124
+ return true;
125
+ }
126
+ catch (e) {
127
+ const code = errorCodeOf(e);
128
+ return code !== "ENOENT" && code !== "ENOTDIR";
129
+ }
111
130
  }
112
131
  const PLUGINS_DOMAIN_FAILURE_NAME = "(plugins domain)";
113
132
  function declaredPlugins(eff) {
@@ -198,6 +217,9 @@ export async function applyCenterPlugins(baseline, eff, opts) {
198
217
  opts.logger?.warn("center_plugin_manifest_rejected", { plugin: v.name, reason: rootCheck.reason });
199
218
  continue;
200
219
  }
220
+ if (rootCheck.hooksModule) {
221
+ opts.logger?.warn("center_plugin_hooks_not_loaded", { plugin: v.name, note: `engine does not load the hooks module of center plugin ${v.name}; skills are loaded` });
222
+ }
201
223
  if (!rootCheck.dir)
202
224
  continue;
203
225
  const loaded = loadSkills(rootCheck.dir, { source: "center", confineTo: liveDir, toolsShareThisFilesystem: opts.toolsShareThisFilesystem, ...(opts.logger !== undefined ? { logger: opts.logger } : {}) });
@@ -1,4 +1,4 @@
1
- import { authBridgeIssuerOf } from "../auth-bridge.js";
1
+ import { authBridgeIssuerOf } from "../identity-source.js";
2
2
  import { isDisclosableIdentity } from "@sema-agent/settings-schema";
3
3
  export const CENTER_ISSUER_WORDS = ["explicit", "fallback"];
4
4
  export function buildCenterWiring(f) {
@@ -41,14 +41,14 @@ export declare const COMPOSITE_CAPABILITY_MEMBERS: {
41
41
  readonly deviceExecutor: readonly ["enabled", "protocolVersion", "maxInflightPerDevice", "wsPath", "management", "relayUrl"];
42
42
  readonly fleet: readonly ["stream", "sessionScope", "observe", "resume", "bgNotifyFailClosed", "steerPriority", "hookFailureNotice", "leaseClient", "generationEcho"];
43
43
  readonly memoryEngine: readonly ["backend", "vectorMode"];
44
- readonly store: readonly ["declared", "backend", "durable", "degradedReason", "sql"];
44
+ readonly store: readonly ["declared", "backend", "durability", "degradedReason", "sql"];
45
45
  readonly centerWiring: readonly ["effectivePull", "effectiveRevision", "lease", "leaseHealth", "failMode", "usageReport", "issuer", "worker", "caller"];
46
46
  readonly webSearch: readonly ["backend"];
47
47
  readonly background: readonly ["listFace", "exitFaces"];
48
48
  readonly taskSettings: readonly ["permissions", "permissionMode", "model", "outputStyle", "env", "hooks", "pluginHooks", "managedHookGroups", "httpHookAllowlists", "tightenOnlySeats", "approvalFrameFamilies", "autoCompactEnabled"];
49
49
  readonly settings: readonly ["permissions"];
50
50
  readonly settingsContract: readonly ["version", "hookEntryFields"];
51
- readonly permissionModeAuto: readonly ["accepted", "classifierSeat", "entitlementSource", "armed", "reason", "model"];
51
+ readonly permissionModeAuto: readonly ["accepted", "classifierSeat", "entitlementSource", "armed", "reason", "refusedBy", "model"];
52
52
  readonly writeProtection: readonly ["armed", "rows", "replaced"];
53
53
  readonly executionLane: readonly ["provider", "toolsOnThisHost", "isolated"];
54
54
  readonly retention: readonly ["mode", "maxAgeDays"];
@@ -2,14 +2,14 @@ export const COMPOSITE_CAPABILITY_MEMBERS = {
2
2
  deviceExecutor: ["enabled", "protocolVersion", "maxInflightPerDevice", "wsPath", "management", "relayUrl"],
3
3
  fleet: ["stream", "sessionScope", "observe", "resume", "bgNotifyFailClosed", "steerPriority", "hookFailureNotice", "leaseClient", "generationEcho"],
4
4
  memoryEngine: ["backend", "vectorMode"],
5
- store: ["declared", "backend", "durable", "degradedReason", "sql"],
5
+ store: ["declared", "backend", "durability", "degradedReason", "sql"],
6
6
  centerWiring: ["effectivePull", "effectiveRevision", "lease", "leaseHealth", "failMode", "usageReport", "issuer", "worker", "caller"],
7
7
  webSearch: ["backend"],
8
8
  background: ["listFace", "exitFaces"],
9
9
  taskSettings: ["permissions", "permissionMode", "model", "outputStyle", "env", "hooks", "pluginHooks", "managedHookGroups", "httpHookAllowlists", "tightenOnlySeats", "approvalFrameFamilies", "autoCompactEnabled"],
10
10
  settings: ["permissions"],
11
11
  settingsContract: ["version", "hookEntryFields"],
12
- permissionModeAuto: ["accepted", "classifierSeat", "entitlementSource", "armed", "reason", "model"],
12
+ permissionModeAuto: ["accepted", "classifierSeat", "entitlementSource", "armed", "reason", "refusedBy", "model"],
13
13
  writeProtection: ["armed", "rows", "replaced"],
14
14
  executionLane: ["provider", "toolsOnThisHost", "isolated"],
15
15
  retention: ["mode", "maxAgeDays"],