@sema-agent/server 7.147.0 → 7.149.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 (790) hide show
  1. package/MIGRATION.md +1468 -24
  2. package/README.md +35 -7
  3. package/README.zh-CN.md +18 -8
  4. package/USAGE.md +444 -193
  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/approval-card.d.ts +36 -38
  39. package/dist/approval-gate-currency.js +3 -2
  40. package/dist/approval-leg-origin.d.ts +33 -0
  41. package/dist/approval-leg-origin.js +4 -0
  42. package/dist/approval-reconciler.d.ts +4 -13
  43. package/dist/approval-reconciler.js +2 -2
  44. package/dist/approval.d.ts +13 -11
  45. package/dist/approval.js +3 -3
  46. package/dist/audit.d.ts +10 -3
  47. package/dist/audit.js +15 -7
  48. package/dist/auth-bridge.d.ts +9 -15
  49. package/dist/auth-bridge.js +4 -11
  50. package/dist/auth-keys.d.ts +10 -1
  51. package/dist/auth-keys.js +8 -0
  52. package/dist/auto-mode-face.d.ts +10 -7
  53. package/dist/auto-mode-face.js +7 -4
  54. package/dist/background-agent-name.d.ts +19 -1
  55. package/dist/background-agent-name.js +12 -2
  56. package/dist/background-session-reap.d.ts +1 -1
  57. package/dist/bake-runner/main.js +9 -6
  58. package/dist/bench/s1/arms.js +6 -5
  59. package/dist/bench/s1/live-deps.js +5 -2
  60. package/dist/bench/s1/run-firm.js +6 -5
  61. package/dist/bind-host.d.ts +25 -0
  62. package/dist/bind-host.js +25 -0
  63. package/dist/boot/adoption.d.ts +3 -0
  64. package/dist/boot/adoption.js +1 -0
  65. package/dist/boot/deployment-mods.d.ts +1 -1
  66. package/dist/boot/execution-env.d.ts +17 -7
  67. package/dist/boot/execution-env.js +47 -42
  68. package/dist/boot/execution-lane.d.ts +6 -4
  69. package/dist/boot/execution-lane.js +3 -1
  70. package/dist/boot/exit-boundary.d.ts +2 -2
  71. package/dist/boot/exit-boundary.js +6 -5
  72. package/dist/boot/fatal-exit.d.ts +3 -5
  73. package/dist/boot/fatal-exit.js +2 -2
  74. package/dist/boot/leader.d.ts +15 -0
  75. package/dist/boot/leader.js +17 -15
  76. package/dist/boot/memory-consolidation.d.ts +37 -29
  77. package/dist/boot/memory-consolidation.js +11 -5
  78. package/dist/boot/org-delivery.d.ts +3 -2
  79. package/dist/boot/org-memory.js +1 -1
  80. package/dist/boot/parked-revive-gate.js +2 -2
  81. package/dist/boot/reapers.d.ts +4 -3
  82. package/dist/boot/reapers.js +19 -16
  83. package/dist/boot/resolve-spec.d.ts +5 -3
  84. package/dist/boot/resolve-spec.js +60 -70
  85. package/dist/boot/retention-lane.d.ts +4 -4
  86. package/dist/boot/retention-lane.js +2 -2
  87. package/dist/boot/runner-deps.d.ts +28 -7
  88. package/dist/boot/runner-deps.js +14 -5
  89. package/dist/boot/runtime-caps.d.ts +2 -2
  90. package/dist/boot/runtime-caps.js +16 -2
  91. package/dist/boot/session-faces.d.ts +16 -7
  92. package/dist/boot/session-faces.js +114 -94
  93. package/dist/boot/shutdown.d.ts +5 -4
  94. package/dist/boot/shutdown.js +6 -4
  95. package/dist/boot/stage-01-config.d.ts +1 -0
  96. package/dist/boot/stage-01-config.js +13 -4
  97. package/dist/boot/stage-02-web-admin-pull.d.ts +2 -0
  98. package/dist/boot/stage-02-web-admin-pull.js +16 -3
  99. package/dist/boot/stage-03-store-backend.d.ts +4 -0
  100. package/dist/boot/stage-03-store-backend.js +4 -3
  101. package/dist/boot/stage-04-stores.d.ts +3 -0
  102. package/dist/boot/stage-04-stores.js +2 -2
  103. package/dist/boot/stage-05-execution-env.d.ts +8 -3
  104. package/dist/boot/stage-05-execution-env.js +2 -2
  105. package/dist/boot/stage-06-runners.d.ts +12 -13
  106. package/dist/boot/stage-06-runners.js +23 -15
  107. package/dist/boot/stage-07-capability-layer.d.ts +13 -9
  108. package/dist/boot/stage-07-capability-layer.js +5 -3
  109. package/dist/boot/stage-08-reapers.d.ts +13 -9
  110. package/dist/boot/stage-08-reapers.js +3 -3
  111. package/dist/boot/stage-09-leader.d.ts +14 -16
  112. package/dist/boot/stage-09-leader.js +12 -4
  113. package/dist/boot/stage-10-http-server.d.ts +14 -16
  114. package/dist/boot/stage-10-http-server.js +7 -4
  115. package/dist/boot/store-evidence.d.ts +20 -0
  116. package/dist/boot/store-evidence.js +13 -0
  117. package/dist/boot/stores.d.ts +6 -0
  118. package/dist/boot/stores.js +41 -27
  119. package/dist/boot/task-list-lane.d.ts +4 -4
  120. package/dist/boot/web-admin.d.ts +4 -2
  121. package/dist/boot/web-admin.js +55 -35
  122. package/dist/boot/webfetch-summarize-lane.d.ts +1 -1
  123. package/dist/boot-reclaim.d.ts +3 -1
  124. package/dist/boot-reclaim.js +1 -1
  125. package/dist/brain.d.ts +7 -18
  126. package/dist/brain.js +5 -17
  127. package/dist/budget.js +6 -6
  128. package/dist/capabilities/center-plugins.d.ts +7 -1
  129. package/dist/capabilities/center-plugins.js +32 -10
  130. package/dist/capabilities/center-wiring.js +1 -1
  131. package/dist/capabilities/composite-members.d.ts +2 -2
  132. package/dist/capabilities/composite-members.js +2 -2
  133. package/dist/capabilities/repo-tools.d.ts +2 -0
  134. package/dist/capabilities/repo-tools.js +14 -12
  135. package/dist/capabilities/scenarios.d.ts +6 -15
  136. package/dist/capabilities/scenarios.js +11 -16
  137. package/dist/capabilities/skills.d.ts +1 -1
  138. package/dist/capabilities/tool-defer.d.ts +1 -1
  139. package/dist/capability-facts.d.ts +39 -11
  140. package/dist/capability-facts.js +35 -7
  141. package/dist/card-settle-stored-scope.d.ts +56 -0
  142. package/dist/card-settle-stored-scope.js +27 -0
  143. package/dist/card-void.d.ts +8 -13
  144. package/dist/card-void.js +2 -7
  145. package/dist/center-credential-renewer.d.ts +6 -2
  146. package/dist/center-credential-renewer.js +7 -3
  147. package/dist/config-catalog.d.ts +28 -1
  148. package/dist/config-catalog.js +95 -85
  149. package/dist/config-dir-trust.d.ts +37 -4
  150. package/dist/config-dir-trust.js +88 -44
  151. package/dist/config-invariants.d.ts +43 -3
  152. package/dist/config-invariants.js +69 -5
  153. package/dist/config-lkg.d.ts +23 -1
  154. package/dist/config-lkg.js +17 -3
  155. package/dist/config-provider.d.ts +9 -9
  156. package/dist/config-provider.js +25 -110
  157. package/dist/config-pull-failure.d.ts +50 -0
  158. package/dist/config-pull-failure.js +48 -0
  159. package/dist/config-types.d.ts +62 -21
  160. package/dist/config.d.ts +14 -21
  161. package/dist/config.js +141 -64
  162. package/dist/context-window-notice.d.ts +31 -0
  163. package/dist/context-window-notice.js +28 -0
  164. package/dist/delegated-session-owner.d.ts +1 -1
  165. package/dist/deleted-session-ids.d.ts +3 -2
  166. package/dist/deployment-governance.d.ts +3 -3
  167. package/dist/deployment-shape.d.ts +46 -11
  168. package/dist/deployment-shape.js +8 -0
  169. package/dist/egress-redirect.d.ts +25 -7
  170. package/dist/egress-redirect.js +20 -2
  171. package/dist/elicitation.d.ts +6 -5
  172. package/dist/elicitation.js +23 -22
  173. package/dist/engine-identity.d.ts +28 -0
  174. package/dist/engine-identity.js +10 -0
  175. package/dist/entry-problems.d.ts +5 -7
  176. package/dist/entry-problems.js +1 -1
  177. package/dist/env-facts.js +2 -1
  178. package/dist/env-name-allowlist-knobs.d.ts +6 -5
  179. package/dist/env-name-allowlist-knobs.js +5 -0
  180. package/dist/env-witness.d.ts +7 -0
  181. package/dist/env-witness.js +16 -0
  182. package/dist/execution-lane-caps.d.ts +25 -23
  183. package/dist/execution-lane-caps.js +18 -26
  184. package/dist/execution-placement.d.ts +58 -18
  185. package/dist/execution-placement.js +41 -2
  186. package/dist/field-conflict.d.ts +7 -11
  187. package/dist/field-conflict.js +3 -3
  188. package/dist/file-history-capture.d.ts +3 -3
  189. package/dist/file-history-disclosure.js +1 -0
  190. package/dist/fleet/fleet-bus.d.ts +21 -3
  191. package/dist/fleet/fleet-bus.js +35 -25
  192. package/dist/fleet/fleet-reconciler.js +2 -2
  193. package/dist/fleet/serving-lease.js +3 -3
  194. package/dist/fleet-client.js +3 -3
  195. package/dist/fleet-lease.d.ts +0 -1
  196. package/dist/fleet-lease.js +4 -5
  197. package/dist/history-anchor.d.ts +23 -3
  198. package/dist/history-anchor.js +24 -4
  199. package/dist/hitl-delivery.d.ts +90 -0
  200. package/dist/hitl-delivery.js +98 -0
  201. package/dist/hooks/classic-stations.d.ts +8 -11
  202. package/dist/hooks/classic-stations.js +0 -7
  203. package/dist/hooks/command-spawn.d.ts +7 -2
  204. package/dist/hooks/command-spawn.js +13 -6
  205. package/dist/hooks/hook-llm.d.ts +5 -1
  206. package/dist/hooks/hook-llm.js +24 -15
  207. package/dist/hooks/hook-runner.d.ts +72 -57
  208. package/dist/hooks/hook-runner.js +271 -193
  209. package/dist/host-lsp-manager.d.ts +22 -8
  210. package/dist/host-lsp-manager.js +4 -1
  211. package/dist/http/active-run-conflict.d.ts +2 -43
  212. package/dist/http/active-run-conflict.js +3 -7
  213. package/dist/http/admission.d.ts +4 -18
  214. package/dist/http/admission.js +76 -79
  215. package/dist/http/approval-sweeps.d.ts +3 -3
  216. package/dist/http/approval-sweeps.js +56 -31
  217. package/dist/http/caller-trust.d.ts +8 -10
  218. package/dist/http/caller-trust.js +1 -2
  219. package/dist/http/claim-heartbeat.d.ts +49 -0
  220. package/dist/http/claim-heartbeat.js +46 -0
  221. package/dist/http/claimed-run.d.ts +16 -8
  222. package/dist/http/claimed-run.js +8 -0
  223. package/dist/http/dispatch.d.ts +8 -1
  224. package/dist/http/dispatch.js +78 -30
  225. package/dist/http/durable-run-leg.d.ts +11 -4
  226. package/dist/http/durable-run-leg.js +45 -21
  227. package/dist/http/execution-context.d.ts +122 -47
  228. package/dist/http/execution-context.js +135 -43
  229. package/dist/http/health-reader.d.ts +36 -0
  230. package/dist/http/health-reader.js +21 -0
  231. package/dist/http/health-self-report.d.ts +9 -9
  232. package/dist/http/health-self-report.js +4 -4
  233. package/dist/http/idempotency.d.ts +9 -5
  234. package/dist/http/idempotency.js +4 -4
  235. package/dist/http/memory-compliance-failure-reply.d.ts +15 -16
  236. package/dist/http/memory-compliance-failure-reply.js +4 -2
  237. package/dist/http/memory-face-fault-reply.d.ts +67 -0
  238. package/dist/http/memory-face-fault-reply.js +71 -0
  239. package/dist/http/memory-store-refusal-reply.d.ts +1 -1
  240. package/dist/http/memory-store-refusal-reply.js +3 -0
  241. package/dist/http/owner-access.d.ts +392 -67
  242. package/dist/http/owner-access.js +370 -35
  243. package/dist/http/principal-gate.d.ts +39 -89
  244. package/dist/http/principal-gate.js +26 -68
  245. package/dist/http/refusal-body.d.ts +35 -2
  246. package/dist/http/refusal-body.js +34 -0
  247. package/dist/http/request-guards.d.ts +9 -13
  248. package/dist/http/request-guards.js +34 -68
  249. package/dist/http/resume-composition.d.ts +37 -0
  250. package/dist/http/resume-composition.js +18 -0
  251. package/dist/http/resume-ctx-read.d.ts +46 -12
  252. package/dist/http/resume-ctx-read.js +31 -6
  253. package/dist/http/resume-legs.d.ts +54 -19
  254. package/dist/http/resume-legs.js +408 -196
  255. package/dist/http/retired-skill-manifest.d.ts +1 -1
  256. package/dist/http/route-ctx.d.ts +31 -32
  257. package/dist/http/routes/a2a-serve.d.ts +43 -5
  258. package/dist/http/routes/a2a-serve.js +60 -37
  259. package/dist/http/routes/admin-config-refresh.js +2 -2
  260. package/dist/http/routes/admin-drain.js +2 -2
  261. package/dist/http/routes/admin-memory-optout.js +4 -3
  262. package/dist/http/routes/adoption.d.ts +3 -0
  263. package/dist/http/routes/adoption.js +17 -10
  264. package/dist/http/routes/agents-roster.js +13 -7
  265. package/dist/http/routes/approvals-assistant.js +73 -67
  266. package/dist/http/routes/attachments.js +2 -2
  267. package/dist/http/routes/background.d.ts +3 -3
  268. package/dist/http/routes/background.js +9 -17
  269. package/dist/http/routes/capabilities.js +16 -19
  270. package/dist/http/routes/config-catalog.js +2 -2
  271. package/dist/http/routes/devices.d.ts +3 -3
  272. package/dist/http/routes/devices.js +4 -4
  273. package/dist/http/routes/diagnostics.d.ts +29 -3
  274. package/dist/http/routes/diagnostics.js +49 -18
  275. package/dist/http/routes/engine.js +2 -2
  276. package/dist/http/routes/fleet.js +5 -3
  277. package/dist/http/routes/images.js +10 -6
  278. package/dist/http/routes/leader.d.ts +7 -2
  279. package/dist/http/routes/leader.js +12 -3
  280. package/dist/http/routes/mcp-reconnect.d.ts +1 -1
  281. package/dist/http/routes/mcp-reconnect.js +7 -15
  282. package/dist/http/routes/memory-bundle.js +4 -7
  283. package/dist/http/routes/memory-compliance.js +4 -4
  284. package/dist/http/routes/memory-consolidation.js +6 -9
  285. package/dist/http/routes/memory-origin.d.ts +2 -0
  286. package/dist/http/routes/memory-origin.js +7 -8
  287. package/dist/http/routes/memory-policy.js +17 -12
  288. package/dist/http/routes/notify-wake.js +10 -19
  289. package/dist/http/routes/observability.js +3 -3
  290. package/dist/http/routes/principal-inbox.d.ts +4 -2
  291. package/dist/http/routes/principal-inbox.js +5 -4
  292. package/dist/http/routes/projects.d.ts +1 -1
  293. package/dist/http/routes/projects.js +3 -2
  294. package/dist/http/routes/retention-ops.js +6 -9
  295. package/dist/http/routes/rules.js +20 -5
  296. package/dist/http/routes/run-memory-capture.d.ts +2 -2
  297. package/dist/http/routes/run-memory-capture.js +6 -12
  298. package/dist/http/routes/run-permission-mode.d.ts +2 -2
  299. package/dist/http/routes/run-permission-mode.js +10 -17
  300. package/dist/http/routes/runs.js +155 -237
  301. package/dist/http/routes/session-memory-sync.d.ts +2 -2
  302. package/dist/http/routes/session-memory-sync.js +7 -13
  303. package/dist/http/routes/session-sync.d.ts +28 -7
  304. package/dist/http/routes/session-sync.js +63 -50
  305. package/dist/http/routes/sessions-list.d.ts +3 -3
  306. package/dist/http/routes/sessions-list.js +9 -9
  307. package/dist/http/routes/sessions.js +87 -124
  308. package/dist/http/routes/shared-memory.js +6 -6
  309. package/dist/http/routes/side-query.js +2 -2
  310. package/dist/http/routes/tasks.js +237 -187
  311. package/dist/http/routes/trace-usage.d.ts +0 -12
  312. package/dist/http/routes/trace-usage.js +40 -46
  313. package/dist/http/routes/workflows.d.ts +39 -4
  314. package/dist/http/routes/workflows.js +42 -14
  315. package/dist/http/run-concurrency-cap.d.ts +20 -12
  316. package/dist/http/run-concurrency-cap.js +39 -26
  317. package/dist/http/run-read-face.d.ts +3 -5
  318. package/dist/http/run-read-face.js +8 -13
  319. package/dist/http/send.d.ts +12 -3
  320. package/dist/http/send.js +42 -6
  321. package/dist/http/server.d.ts +43 -45
  322. package/dist/http/server.js +61 -11
  323. package/dist/http/sse-log.d.ts +17 -10
  324. package/dist/http/sse-log.js +7 -7
  325. package/dist/http/stored-body-replay.d.ts +12 -0
  326. package/dist/http/stored-body-replay.js +2 -2
  327. package/dist/http/submit-ctx.d.ts +17 -8
  328. package/dist/http/submit-ctx.js +8 -5
  329. package/dist/http/submit-replay.d.ts +19 -6
  330. package/dist/http/submit-replay.js +18 -6
  331. package/dist/http/sync-submit-body.d.ts +3 -4
  332. package/dist/http/sync-submit-body.js +4 -5
  333. package/dist/http/wire-types.d.ts +4 -3
  334. package/dist/identity-source.d.ts +36 -5
  335. package/dist/identity-source.js +27 -0
  336. package/dist/index.d.ts +4 -1
  337. package/dist/index.js +2 -0
  338. package/dist/key-resolver.d.ts +32 -0
  339. package/dist/key-resolver.js +23 -9
  340. package/dist/leader/diffup.js +2 -1
  341. package/dist/leader/endpoint.d.ts +26 -5
  342. package/dist/leader/endpoint.js +154 -14
  343. package/dist/leader/fanout.d.ts +3 -0
  344. package/dist/leader/fanout.js +78 -63
  345. package/dist/leader/leader.d.ts +16 -0
  346. package/dist/leader/leader.js +43 -3
  347. package/dist/leader/merge.d.ts +9 -1
  348. package/dist/leader/merge.js +16 -1
  349. package/dist/leader/repair-wire.js +1 -1
  350. package/dist/leader/wire.d.ts +36 -3
  351. package/dist/leader/wire.js +59 -18
  352. package/dist/leg-facts.d.ts +7 -2
  353. package/dist/leg-facts.js +1 -0
  354. package/dist/local-store-declaration.d.ts +54 -0
  355. package/dist/local-store-declaration.js +59 -0
  356. package/dist/lsp-evict.d.ts +6 -4
  357. package/dist/lsp-evict.js +2 -3
  358. package/dist/mcp-assertion-header.d.ts +1 -1
  359. package/dist/mcp-assertion-header.js +1 -1
  360. package/dist/memory-operator-faces.d.ts +5 -4
  361. package/dist/memory-operator-faces.js +1 -1
  362. package/dist/memory-project-layer.js +1 -1
  363. package/dist/memory-scope.d.ts +33 -6
  364. package/dist/memory-scope.js +68 -19
  365. package/dist/memory-store-refusal.d.ts +5 -2
  366. package/dist/memory-sync-client.d.ts +3 -2
  367. package/dist/memory-sync-client.js +8 -5
  368. package/dist/model-compat.d.ts +17 -8
  369. package/dist/model-compat.js +6 -2
  370. package/dist/model-context-window.d.ts +57 -0
  371. package/dist/model-context-window.js +21 -0
  372. package/dist/model-entry-headers.d.ts +46 -4
  373. package/dist/model-entry-headers.js +2 -2
  374. package/dist/model-entry-refusal.d.ts +40 -20
  375. package/dist/model-entry-refusal.js +57 -30
  376. package/dist/model-plane-face.d.ts +19 -11
  377. package/dist/model-plane-face.js +9 -1
  378. package/dist/model-plane-probe.d.ts +2 -0
  379. package/dist/model-plane-probe.js +17 -0
  380. package/dist/model-provider.d.ts +3 -3
  381. package/dist/model-reach-scope.d.ts +2 -1
  382. package/dist/model-route-endpoint.d.ts +9 -5
  383. package/dist/model-route-endpoint.js +29 -7
  384. package/dist/model-select.d.ts +16 -0
  385. package/dist/model-select.js +4 -0
  386. package/dist/mountinfo.d.ts +37 -0
  387. package/dist/mountinfo.js +47 -0
  388. package/dist/namespaced-rule-name.d.ts +23 -14
  389. package/dist/namespaced-rule-name.js +8 -11
  390. package/dist/net-address.d.ts +1 -1
  391. package/dist/observability/corrupt-read-seat.d.ts +4 -4
  392. package/dist/observability/corrupt-read-seat.js +5 -3
  393. package/dist/observability/fail-open.d.ts +72 -40
  394. package/dist/observability/fail-open.js +74 -40
  395. package/dist/observability/logger.d.ts +22 -1
  396. package/dist/observability/logger.js +89 -12
  397. package/dist/observability/metrics.js +4 -5
  398. package/dist/observability/otel-exporter.js +2 -1
  399. package/dist/observability/principal-context.d.ts +14 -7
  400. package/dist/observability/principal-context.js +8 -3
  401. package/dist/observability/run-terminal.d.ts +7 -1
  402. package/dist/observability/run-terminal.js +6 -2
  403. package/dist/observability/secret-env-scrub.d.ts +1 -1
  404. package/dist/observability/secret-env-scrub.js +1 -1
  405. package/dist/orchestration/hardened-vm-runner.d.ts +1 -0
  406. package/dist/orchestration/hardened-vm-runner.js +11 -5
  407. package/dist/orchestration/hardened-vm-worker-runner.d.ts +0 -14
  408. package/dist/orchestration/hardened-vm-worker-runner.js +5 -0
  409. package/dist/orchestration/hardened-vm-worker.js +2 -1
  410. package/dist/orchestration/workflow-completion-inbox.d.ts +3 -3
  411. package/dist/orchestration/workflow-completion-inbox.js +3 -2
  412. package/dist/org-delivery-gate.d.ts +36 -10
  413. package/dist/org-delivery-gate.js +12 -8
  414. package/dist/outbound-dispatcher.d.ts +1 -1
  415. package/dist/outbound-dispatcher.js +6 -12
  416. package/dist/owner-brands.d.ts +81 -0
  417. package/dist/owner-brands.js +42 -0
  418. package/dist/owner-faces.d.ts +532 -0
  419. package/dist/owner-faces.js +126 -0
  420. package/dist/park-row-commit.d.ts +67 -0
  421. package/dist/park-row-commit.js +76 -0
  422. package/dist/parked-decide.d.ts +76 -12
  423. package/dist/parked-decide.js +152 -11
  424. package/dist/parked-revive-surface.d.ts +14 -4
  425. package/dist/parked-revive-surface.js +5 -4
  426. package/dist/peer-directory.d.ts +7 -9
  427. package/dist/peer-directory.js +3 -2
  428. package/dist/permission-rule-vocab.d.ts +53 -8
  429. package/dist/permission-rule-vocab.js +30 -2
  430. package/dist/plugins/adoption-log-sql.d.ts +3 -25
  431. package/dist/plugins/adoption-log-sql.js +23 -21
  432. package/dist/plugins/approval-ask-retired-delete-by-task-m50.d.ts +7 -0
  433. package/dist/plugins/approval-ask-retired-delete-by-task-m50.js +17 -0
  434. package/dist/plugins/approval-ask-store-file.d.ts +18 -7
  435. package/dist/plugins/approval-ask-store-file.js +37 -14
  436. package/dist/plugins/approval-ask-store-memory.d.ts +12 -4
  437. package/dist/plugins/approval-ask-store-memory.js +24 -10
  438. package/dist/plugins/approval-ask-store-sql.d.ts +40 -21
  439. package/dist/plugins/approval-ask-store-sql.js +44 -15
  440. package/dist/plugins/approval-exemption-skill-cutoff.d.ts +64 -0
  441. package/dist/plugins/approval-exemption-skill-cutoff.js +122 -0
  442. package/dist/plugins/approval-exemption-skill-m46.d.ts +14 -0
  443. package/dist/plugins/approval-exemption-skill-m46.js +21 -0
  444. package/dist/plugins/approval-exemption-store.d.ts +32 -2
  445. package/dist/plugins/approval-exemption-store.js +42 -19
  446. package/dist/plugins/approval-nonce-store.d.ts +39 -12
  447. package/dist/plugins/approval-nonce-store.js +72 -23
  448. package/dist/plugins/blob-backend.d.ts +2 -0
  449. package/dist/plugins/blob-backend.js +9 -6
  450. package/dist/plugins/caching-session-store.d.ts +13 -1
  451. package/dist/plugins/caching-session-store.js +43 -4
  452. package/dist/plugins/checkpoint-index-columns.d.ts +32 -5
  453. package/dist/plugins/checkpoint-index-columns.js +36 -1
  454. package/dist/plugins/checkpoint-store-face.d.ts +83 -10
  455. package/dist/plugins/checkpoint-store-face.js +18 -1
  456. package/dist/plugins/device-store-sql.js +1 -0
  457. package/dist/plugins/ensure-index.d.ts +13 -1
  458. package/dist/plugins/ensure-index.js +154 -21
  459. package/dist/plugins/ensure-schema-lock-policy.d.ts +36 -18
  460. package/dist/plugins/ensure-schema-lock-policy.js +76 -9
  461. package/dist/plugins/file-run-store.d.ts +85 -32
  462. package/dist/plugins/file-run-store.js +177 -94
  463. package/dist/plugins/host-platform.d.ts +24 -3
  464. package/dist/plugins/host-platform.js +15 -1
  465. package/dist/plugins/image-bake-store-sql.js +2 -0
  466. package/dist/plugins/imported-layer-root-retirement.d.ts +2 -2
  467. package/dist/plugins/k8s-pod-reaper.d.ts +1 -3
  468. package/dist/plugins/k8s-pod-reaper.js +0 -1
  469. package/dist/plugins/leader-run-store-sql.d.ts +22 -0
  470. package/dist/plugins/leader-run-store-sql.js +34 -4
  471. package/dist/plugins/local-checkpoint-store.d.ts +62 -23
  472. package/dist/plugins/local-checkpoint-store.js +197 -77
  473. package/dist/plugins/local-data-dir-modes-m39.js +2 -1
  474. package/dist/plugins/local-data-root-admission.d.ts +52 -0
  475. package/dist/plugins/local-data-root-admission.js +100 -0
  476. package/dist/plugins/local-docker-capacity.d.ts +93 -0
  477. package/dist/plugins/local-docker-capacity.js +194 -0
  478. package/dist/plugins/local-docker-reaper.d.ts +92 -0
  479. package/dist/plugins/local-docker-reaper.js +102 -0
  480. package/dist/plugins/local-engine-high-water.d.ts +29 -6
  481. package/dist/plugins/local-engine-high-water.js +27 -19
  482. package/dist/plugins/local-session-store.d.ts +458 -140
  483. package/dist/plugins/local-session-store.js +906 -292
  484. package/dist/plugins/local-session-window.d.ts +3 -2
  485. package/dist/plugins/local-session-window.js +3 -2
  486. package/dist/plugins/local-sidecar-quarantine.js +3 -2
  487. package/dist/plugins/local-task-attachment-store.d.ts +18 -1
  488. package/dist/plugins/local-task-attachment-store.js +22 -1
  489. package/dist/plugins/memory-embedder.js +9 -7
  490. package/dist/plugins/memory-engine-pg.d.ts +3 -2
  491. package/dist/plugins/memory-engine-pg.js +14 -5
  492. package/dist/plugins/memory-engine-sql-apply.d.ts +8 -4
  493. package/dist/plugins/memory-engine-sql-apply.js +6 -8
  494. package/dist/plugins/memory-engine-tidb.d.ts +4 -2
  495. package/dist/plugins/memory-engine-tidb.js +11 -2
  496. package/dist/plugins/memory-optout-grant-store-sql.d.ts +1 -1
  497. package/dist/plugins/memory-optout-grant-store-sql.js +3 -3
  498. package/dist/plugins/memory-run-store.d.ts +53 -36
  499. package/dist/plugins/memory-run-store.js +116 -88
  500. package/dist/plugins/one-time-migration-marker.d.ts +26 -0
  501. package/dist/plugins/one-time-migration-marker.js +13 -0
  502. package/dist/plugins/one-time-migrations.d.ts +214 -47
  503. package/dist/plugins/one-time-migrations.js +481 -135
  504. package/dist/plugins/org-delivery-quota-store.d.ts +34 -11
  505. package/dist/plugins/org-delivery-quota-store.js +31 -15
  506. package/dist/plugins/permission-rule-store-file.d.ts +3 -3
  507. package/dist/plugins/permission-rule-store-sql.d.ts +5 -64
  508. package/dist/plugins/permission-rule-store-sql.js +11 -95
  509. package/dist/plugins/pg-pool.d.ts +2 -32
  510. package/dist/plugins/pg-pool.js +24 -17
  511. package/dist/plugins/remote-env-device.d.ts +3 -2
  512. package/dist/plugins/remote-env-e2b.d.ts +8 -32
  513. package/dist/plugins/remote-env-e2b.js +44 -32
  514. package/dist/plugins/remote-env-host.d.ts +51 -17
  515. package/dist/plugins/remote-env-host.js +111 -42
  516. package/dist/plugins/remote-env-k8s.d.ts +40 -45
  517. package/dist/plugins/remote-env-k8s.js +111 -60
  518. package/dist/plugins/remote-env-local-docker.d.ts +152 -15
  519. package/dist/plugins/remote-env-local-docker.js +352 -72
  520. package/dist/plugins/remote-scratchpad.js +4 -0
  521. package/dist/plugins/retention-deployment.d.ts +49 -17
  522. package/dist/plugins/retention-deployment.js +39 -8
  523. package/dist/plugins/run-preview-m45.d.ts +11 -0
  524. package/dist/plugins/run-preview-m45.js +19 -0
  525. package/dist/plugins/run-store-sql.d.ts +82 -75
  526. package/dist/plugins/run-store-sql.js +164 -125
  527. package/dist/plugins/s3-answer.d.ts +2 -1
  528. package/dist/plugins/sandbox-reaper.d.ts +26 -0
  529. package/dist/plugins/sandbox-reaper.js +2 -0
  530. package/dist/plugins/scenario-prefix-switch-m42.d.ts +56 -0
  531. package/dist/plugins/scenario-prefix-switch-m42.js +56 -0
  532. package/dist/plugins/scheduler-support.d.ts +16 -1
  533. package/dist/plugins/scheduler-support.js +22 -2
  534. package/dist/plugins/schema-consistency.d.ts +131 -14
  535. package/dist/plugins/schema-consistency.js +388 -18
  536. package/dist/plugins/schema-drift-sentence.d.ts +10 -6
  537. package/dist/plugins/schema-drift-sentence.js +15 -7
  538. package/dist/plugins/schema-ensure-legs.d.ts +9 -0
  539. package/dist/plugins/schema-ensure-legs.js +1 -1
  540. package/dist/plugins/schema-indexes.js +3 -0
  541. package/dist/plugins/schema-live-columns.d.ts +14 -5
  542. package/dist/plugins/schema-live-columns.js +10 -10
  543. package/dist/plugins/send-user-file.js +2 -1
  544. package/dist/plugins/session-birth.d.ts +37 -0
  545. package/dist/plugins/session-birth.js +38 -0
  546. package/dist/plugins/session-epoch-anchor.d.ts +40 -12
  547. package/dist/plugins/session-epoch-anchor.js +33 -11
  548. package/dist/plugins/session-ext-table.d.ts +27 -3
  549. package/dist/plugins/session-ext-table.js +19 -6
  550. package/dist/plugins/session-fork.d.ts +15 -1
  551. package/dist/plugins/session-fork.js +3 -0
  552. package/dist/plugins/session-ownership.d.ts +1 -1
  553. package/dist/plugins/session-placement.d.ts +27 -20
  554. package/dist/plugins/session-placement.js +15 -12
  555. package/dist/plugins/session-row-sql.d.ts +12 -0
  556. package/dist/plugins/session-row-sql.js +3 -3
  557. package/dist/plugins/session-run-rollup.d.ts +29 -0
  558. package/dist/plugins/session-run-rollup.js +40 -0
  559. package/dist/plugins/session-store-sql.d.ts +38 -12
  560. package/dist/plugins/session-store-sql.js +130 -30
  561. package/dist/plugins/session-withdraw-sql.d.ts +36 -0
  562. package/dist/plugins/session-withdraw-sql.js +42 -0
  563. package/dist/plugins/shared-memory-store-sql.d.ts +0 -69
  564. package/dist/plugins/shared-memory-store-sql.js +2 -1
  565. package/dist/plugins/shell-sentinel-owner-m48.d.ts +42 -0
  566. package/dist/plugins/shell-sentinel-owner-m48.js +9 -0
  567. package/dist/plugins/snapshot-bucket-presence.d.ts +2 -1
  568. package/dist/plugins/sql-driver.d.ts +1 -1
  569. package/dist/plugins/sql-driver.js +2 -1
  570. package/dist/plugins/sql-errors.d.ts +32 -5
  571. package/dist/plugins/sql-errors.js +55 -7
  572. package/dist/plugins/sql-json-column.d.ts +8 -7
  573. package/dist/plugins/sql-json-column.js +10 -6
  574. package/dist/plugins/stop-then-start-sentence.d.ts +16 -0
  575. package/dist/plugins/stop-then-start-sentence.js +7 -0
  576. package/dist/plugins/store-backend.d.ts +99 -16
  577. package/dist/plugins/store-backend.js +230 -65
  578. package/dist/plugins/store-contracts.d.ts +123 -33
  579. package/dist/plugins/store-contracts.js +38 -1
  580. package/dist/plugins/store-fault.d.ts +28 -2
  581. package/dist/plugins/store-fault.js +20 -2
  582. package/dist/plugins/task-attachment-store.d.ts +15 -3
  583. package/dist/plugins/task-attachment-store.js +22 -9
  584. package/dist/plugins/tidb-pool.d.ts +11 -6
  585. package/dist/plugins/tidb-pool.js +39 -18
  586. package/dist/plugins/web-search.js +5 -3
  587. package/dist/plugins/workflow-run-store-sql.d.ts +6 -1
  588. package/dist/plugins/workflow-run-store-sql.js +11 -5
  589. package/dist/plugins/workspace-custody.d.ts +44 -0
  590. package/dist/plugins/workspace-custody.js +47 -0
  591. package/dist/principal-jwt.d.ts +4 -4
  592. package/dist/principal-jwt.js +20 -5
  593. package/dist/principal-shape.d.ts +41 -0
  594. package/dist/principal-shape.js +19 -0
  595. package/dist/project-identity.d.ts +8 -7
  596. package/dist/project-identity.js +40 -17
  597. package/dist/project-layer-key.d.ts +13 -2
  598. package/dist/project-layer-key.js +9 -1
  599. package/dist/question.d.ts +13 -23
  600. package/dist/question.js +21 -39
  601. package/dist/read-deny-floor-notice.d.ts +36 -0
  602. package/dist/read-deny-floor-notice.js +40 -0
  603. package/dist/{plain-string-record.d.ts → request-declaration-disposition.d.ts} +9 -23
  604. package/dist/request-declaration-disposition.js +39 -0
  605. package/dist/request-declaration-refusal.d.ts +35 -12
  606. package/dist/request-declaration-refusal.js +21 -9
  607. package/dist/request-form.d.ts +58 -0
  608. package/dist/request-form.js +72 -0
  609. package/dist/request-image-urls.d.ts +8 -2
  610. package/dist/request-image-urls.js +2 -1
  611. package/dist/request-images.d.ts +20 -0
  612. package/dist/request-images.js +59 -0
  613. package/dist/request-key-closure.d.ts +6 -7
  614. package/dist/request-key-closure.js +15 -2
  615. package/dist/resource-suspend.d.ts +7 -16
  616. package/dist/resource-suspend.js +1 -1
  617. package/dist/retired-name-host-notice.d.ts +21 -0
  618. package/dist/retired-name-host-notice.js +12 -0
  619. package/dist/rule-entry-list.d.ts +2 -2
  620. package/dist/rule-entry-list.js +3 -4
  621. package/dist/rule-issue-reading.d.ts +58 -0
  622. package/dist/rule-issue-reading.js +14 -0
  623. package/dist/rules-consent.d.ts +5 -3
  624. package/dist/rules-consent.js +1 -0
  625. package/dist/run-acceptance.d.ts +3 -1
  626. package/dist/run-acceptance.js +3 -0
  627. package/dist/run-cancel-card.d.ts +28 -0
  628. package/dist/run-cancel-card.js +19 -0
  629. package/dist/run-cancel-context.d.ts +10 -0
  630. package/dist/run-cancel-context.js +1 -0
  631. package/dist/run-local.d.ts +14 -6
  632. package/dist/run-local.js +117 -90
  633. package/dist/run-stale-default.d.ts +7 -0
  634. package/dist/run-stale-default.js +2 -0
  635. package/dist/runs.d.ts +56 -21
  636. package/dist/runs.js +73 -43
  637. package/dist/runtime-caps-resolver.d.ts +21 -6
  638. package/dist/runtime-caps-resolver.js +17 -4
  639. package/dist/runtime-governance.d.ts +2 -2
  640. package/dist/runtime-governance.js +5 -3
  641. package/dist/sealed-key-layout.d.ts +12 -5
  642. package/dist/sealed-key-layout.js +5 -0
  643. package/dist/sealed-key.d.ts +12 -2
  644. package/dist/sealed-key.js +115 -27
  645. package/dist/security.d.ts +128 -158
  646. package/dist/security.js +163 -59
  647. package/dist/sema-config-dir.d.ts +20 -0
  648. package/dist/sema-config-dir.js +25 -0
  649. package/dist/server-secret-env.d.ts +55 -25
  650. package/dist/server-secret-env.js +75 -22
  651. package/dist/session-agent.d.ts +3 -2
  652. package/dist/session-children-retire.d.ts +13 -8
  653. package/dist/session-children-retire.js +9 -7
  654. package/dist/session-deletion.d.ts +88 -0
  655. package/dist/session-deletion.js +8 -0
  656. package/dist/session-erase.d.ts +145 -0
  657. package/dist/session-erase.js +115 -0
  658. package/dist/session-error-wire.d.ts +5 -5
  659. package/dist/session-error-wire.js +1 -1
  660. package/dist/session-incarnation.d.ts +52 -5
  661. package/dist/session-incarnation.js +19 -2
  662. package/dist/session-policy-wire.d.ts +6 -3
  663. package/dist/session-policy-wire.js +11 -1
  664. package/dist/session-resident-background.d.ts +0 -71
  665. package/dist/session-resident-background.js +4 -3
  666. package/dist/session-row.d.ts +2 -1
  667. package/dist/session-rules-seat.d.ts +12 -0
  668. package/dist/session-rules-seat.js +19 -0
  669. package/dist/session-titler.d.ts +7 -15
  670. package/dist/session-titler.js +1 -1
  671. package/dist/session-workspace.d.ts +3 -3
  672. package/dist/spec-fields.d.ts +57 -3
  673. package/dist/spec-fields.js +72 -51
  674. package/dist/store-admission.d.ts +33 -0
  675. package/dist/store-admission.js +49 -0
  676. package/dist/store-posture.d.ts +141 -20
  677. package/dist/store-posture.js +205 -3
  678. package/dist/stored-request-hooks-m20.js +2 -2
  679. package/dist/stores-sql/background-agent-store-sql.d.ts +11 -2
  680. package/dist/stores-sql/background-agent-store-sql.js +73 -20
  681. package/dist/stores-sql/checkpoint-store-sql.d.ts +34 -29
  682. package/dist/stores-sql/checkpoint-store-sql.js +78 -49
  683. package/dist/stores-sql/file-history-store-sql.d.ts +1 -1
  684. package/dist/stores-sql/file-history-store-sql.js +3 -5
  685. package/dist/stores-sql/mailbox-store-sql.d.ts +7 -4
  686. package/dist/stores-sql/mailbox-store-sql.js +31 -32
  687. package/dist/stores-sql/pg-session-storage.d.ts +7 -5
  688. package/dist/stores-sql/pg-session-storage.js +54 -46
  689. package/dist/stores-sql/retention-store-sql.d.ts +87 -19
  690. package/dist/stores-sql/retention-store-sql.js +92 -27
  691. package/dist/stores-sql/session-policy-store-sql.d.ts +32 -10
  692. package/dist/stores-sql/session-policy-store-sql.js +44 -36
  693. package/dist/stores-sql/session-write-hooks.d.ts +12 -6
  694. package/dist/stores-sql/tidb-session-storage.d.ts +4 -4
  695. package/dist/stores-sql/tidb-session-storage.js +13 -8
  696. package/dist/stores-sql/tidb-session-store.d.ts +36 -17
  697. package/dist/stores-sql/tidb-session-store.js +69 -39
  698. package/dist/stores-sql/tool-result-store-sql.d.ts +1 -1
  699. package/dist/stores-sql/tool-result-store-sql.js +4 -6
  700. package/dist/stores-sql/windowed-session-storage.d.ts +5 -0
  701. package/dist/stores-sql/windowed-session-storage.js +9 -0
  702. package/dist/submission-exit.d.ts +50 -0
  703. package/dist/submission-exit.js +108 -0
  704. package/dist/task-a2a.d.ts +3 -8
  705. package/dist/task-a2a.js +28 -30
  706. package/dist/task-cwd.d.ts +43 -7
  707. package/dist/task-cwd.js +11 -0
  708. package/dist/task-mcp.d.ts +3 -3
  709. package/dist/task-mcp.js +4 -4
  710. package/dist/task-settings.d.ts +14 -10
  711. package/dist/task-settings.js +19 -7
  712. package/dist/terminal.d.ts +27 -43
  713. package/dist/terminal.js +49 -14
  714. package/dist/tool-approval.d.ts +173 -163
  715. package/dist/tool-approval.js +247 -232
  716. package/dist/trace/core-keyset-guard.d.ts +13 -6
  717. package/dist/trace/core-vocab-wire.d.ts +95 -0
  718. package/dist/trace/core-vocab-wire.js +15 -0
  719. package/dist/trace/engine-notice-wire.d.ts +24 -21
  720. package/dist/trace/engine-notice-wire.js +7 -3
  721. package/dist/trace/exit-seat.d.ts +30 -4
  722. package/dist/trace/exit-seat.js +40 -36
  723. package/dist/trace/extension-call-face.d.ts +3 -2
  724. package/dist/trace/extension-call-face.js +3 -1
  725. package/dist/trace/ledger-events.d.ts +4 -7
  726. package/dist/trace/ledger-sink.d.ts +4 -31
  727. package/dist/trace/ledger-sink.js +0 -11
  728. package/dist/trace/model-segment.d.ts +5 -5
  729. package/dist/trace/model-segment.js +5 -5
  730. package/dist/trace/project.d.ts +59 -44
  731. package/dist/trace/project.js +60 -26
  732. package/dist/trace/redact.d.ts +135 -27
  733. package/dist/trace/redact.js +884 -260
  734. package/dist/trace/self-minted-wire.d.ts +567 -20
  735. package/dist/trace/self-minted-wire.js +205 -24
  736. package/dist/trace/wire-projection-faces.d.ts +5 -6
  737. package/dist/trace/wire-projection-faces.js +2 -2
  738. package/dist/upstream-body.d.ts +23 -0
  739. package/dist/upstream-body.js +16 -0
  740. package/dist/url-refusal.d.ts +3 -3
  741. package/dist/url-refusal.js +11 -4
  742. package/dist/user-authored-text.d.ts +1 -1
  743. package/dist/user-input-ledger.d.ts +7 -8
  744. package/dist/user-input-ledger.js +1 -1
  745. package/dist/web-admin-client/apply-effective.d.ts +6 -3
  746. package/dist/web-admin-client/apply-effective.js +33 -23
  747. package/dist/web-admin-client/apply-ledger.d.ts +16 -7
  748. package/dist/web-admin-client/apply-ledger.js +5 -2
  749. package/dist/web-admin-client/center-request.d.ts +2 -2
  750. package/dist/web-admin-client/center-request.js +15 -15
  751. package/dist/web-admin-client/effective-keys.d.ts +1 -1
  752. package/dist/web-admin-client/effective-keys.js +1 -1
  753. package/dist/web-admin-client/entry-metadata.d.ts +8 -0
  754. package/dist/web-admin-client/entry-metadata.js +13 -0
  755. package/dist/web-admin-client/http-client.d.ts +1 -1
  756. package/dist/web-admin-client/http-client.js +23 -4
  757. package/dist/web-admin-client/mcp-revocation.d.ts +1 -1
  758. package/dist/web-admin-client/mcp-revocation.js +2 -1
  759. package/dist/web-admin-client/read-warnings.d.ts +1 -0
  760. package/dist/web-admin-client/read-warnings.js +1 -0
  761. package/dist/web-admin-client/restart-signal.js +8 -4
  762. package/dist/web-admin-client/skills-mcp.d.ts +2 -2
  763. package/dist/web-admin-client/types.d.ts +1 -2
  764. package/dist/workspace-space.d.ts +3 -2
  765. package/docs/DEVICE-EXECUTOR-PROTOCOL.md +4 -4
  766. package/docs/error-text-lexicon.json +317 -0
  767. package/package.json +8 -3
  768. package/scripts/drain-check-local.mjs +118 -147
  769. package/scripts/drain-check.mysql.sql +22 -2
  770. package/scripts/drain-check.pg.sql +22 -2
  771. package/scripts/embed-minimal.mjs +183 -0
  772. package/wire-changes/server@7.148.0.json +1517 -0
  773. package/wire-changes/server@7.149.0.json +372 -0
  774. package/dist/http/memory-control-plane-corrupt-reply.d.ts +0 -25
  775. package/dist/http/memory-control-plane-corrupt-reply.js +0 -19
  776. package/dist/http/memory-layer-reply.d.ts +0 -30
  777. package/dist/http/memory-layer-reply.js +0 -24
  778. package/dist/lsp/e2b-bridge.d.ts +0 -57
  779. package/dist/lsp/e2b-bridge.js +0 -139
  780. package/dist/lsp/e2b-manager.d.ts +0 -93
  781. package/dist/lsp/e2b-manager.js +0 -178
  782. package/dist/lsp/lsp-frames.d.ts +0 -14
  783. package/dist/lsp/lsp-frames.js +0 -25
  784. package/dist/lsp/manager.d.ts +0 -129
  785. package/dist/lsp/manager.js +0 -127
  786. package/dist/lsp/types.d.ts +0 -12
  787. package/dist/lsp/types.js +0 -2
  788. package/dist/lsp/ws-transport.d.ts +0 -40
  789. package/dist/lsp/ws-transport.js +0 -210
  790. package/dist/plain-string-record.js +0 -70
@@ -1,3 +1,44 @@
1
+ /**
2
+ * [ref](7.108.0;cli [ref] [ref],server [ref] ② 认领)—— 模型目录条目 `headers`:**部署 ↔ 供应商**的附加请求头。
3
+ * 本模块是它的**唯一判据点**(白名单 + 形)与**唯一铸点**(铸进 core `Model.headers` 的那张袋)。
4
+ *
5
+ * ## 病
6
+ * core 的三只一方 brain 早有附加头的座(构造项 `headers` 与 per-model 的 `Model.headers`,三只 adapter 都按
7
+ * `mergeHeaders(model.headers, config.headers, options.headers)` 合并;anthropic 腿再把 `anthropic-beta` 与它自己的 beta
8
+ * 按 core [ref] 的读并合并律并成一个头),本仓零读点 ⇒ 壳的 `--betas` / `ANTHROPIC_BETAS`(开 1M 上下文等 beta)进不了引擎发出的请求。
9
+ *
10
+ * ## 座位:per-model(`Model.headers`),不是 per-route(brain 构造项 `headers`)
11
+ * 目录条目是**一只模型**的声明;brain 构造项的那个袋是**整条路由**共享的(一台部署一只 anthropic brain,所有 anthropic 条目都走它)——
12
+ * 放在那里会把一条条目的 beta 发给同路由的每一只模型。core 的 per-model 座就是为这件事开的(`Model.headers`,core 型面注:
13
+ * 「Cannot override auth / content-type / version」—— 鉴权头与结构头在合并之后由 brain 硬锁)。
14
+ *
15
+ * ## 白名单:闭集,每个名字带「读它的线路」({@link CATALOG_ENTRY_HEADER_LANES})
16
+ * · 名字闭集 —— 表外一律拒。这不是洁癖,是**凭据轴**:`Model.headers` 上的 `authorization` / `x-api-key` 会被 core 的配对法读成
17
+ * per-model 凭据(「构造即配对」,off-root 也放行),等于在托管钥匙(`sealedApiKey` / `apiKeyEnv`)之外开一条明文凭据的路;
18
+ * 路由 / 追踪类头同理是部署的事,要一条一条想清楚再进表。
19
+ * · 只认**规范拼写**(小写):HTTP 头名大小写不敏感,两种拼法并存 = 同一只袋里两个写者;`Anthropic-Beta` 按表外拒(拒句给出规范拼写)。
20
+ * · 名字带线路:`anthropic-beta` 只有 Anthropic Messages 线路读(`api: "anthropic-messages"`)。声明在不读它的条目上 ⇒ 拒 ——
21
+ * 否则运维以为开了 1M 上下文、请求发出去什么都没变(一个只声明不生效的旋钮,正是本仓 `model_compat_dropped` 那一族立案的病)。
22
+ * · 值:可见 ASCII(首尾非空白,中间可有空格),≤ {@link MAX_HEADER_VALUE_CHARS} —— CR / LF / NUL 这类会让传输层在每次请求时才抛的值
23
+ * 在配置期就拒;值**逐字**透传(不改大小写、不去重 —— 合并是 core 的事)。
24
+ *
25
+ * ## 坏声明的方向:条目整条不可用(`config.model_entry_invalid`),不是「丢头、条目照常」
26
+ * 与 `compat` 的降级通道刻意分歧:本座一半是凭据轴(表外名字里有鉴权头),另一半是「运维以为生效了」—— 丢头照常服务正是修前的病形。
27
+ * 执法点 = [ref] 的逐条判据 `judgeCatalogEntry`(同一个码、同一条 warn、同一条「显式选中它 ⇒ `request.model_unavailable`」的路),
28
+ * 其余条目照常服务。拒因与 warn **只回显名字**(过 {@link displayHeaderName}),从不回显值。
29
+ *
30
+ * ## 两条读腿今天到不了这里(候裁「settings-schema `ModelEntry` 加 `headers`」,[ref] 字段归 server 自持)
31
+ * settings-schema 6.3.0 的 `ModelEntry` 没有这个键 ⇒ 远端 `readEffectiveWire` 与本地 `FileConfigStore` 都 strip 它(并报未知键)。
32
+ * 本模块服务的输入今天只有绕过读腿的那几条(盘上 LKG / 手写 effective);字段进 schema 之日,`config-provider.ts` 的本地投影加一行即通,
33
+ * `test/catalog-entry-headers.test.ts` 的 🚧 [ref]-schema 两格翻红逼销账。**词表不在 schema 里另抄一份**:schema 的那个键应当是
34
+ * 承载形(与 `compat` 同一种 parse-transparent + 自由形安全判),判据仍是本模块这一处 —— 或者整张表搬进 schema、本仓 import;
35
+ * 二选一候裁,不许两处各有一份。
36
+ *
37
+ * 依赖纪律:叶(只 type-import core、值引 `trace/redact.ts` 的名字回显尺)。
38
+ */
39
+ import type { Model } from "@sema-agent/core";
40
+ /** 条目的线路词(core `Model["api"]`,不手抄)。 */
41
+ type ModelApi = Model["api"];
1
42
  /**
2
43
  * 白名单 = 名字 → 读它的线路(闭集;**加一个名字 = 加一行并写明哪条线路读它、为什么是部署的事**)。
3
44
  * `anthropic-beta`:Anthropic Messages 的 beta 开关(逗号分隔的 beta 名;core anthropic 腿会把自己的 beta 并进同一个头)。
@@ -28,17 +69,18 @@ export type CatalogEntryHeadersVerdict = {
28
69
  readonly issue: string;
29
70
  };
30
71
  /**
31
- * **唯一判据**:条目的 `headers` 原值(`unknown`:承载形,不信类型)+ 条目的线路词原值(`api`;两条读腿恒补齐它,
32
- * 绕过读腿的输入缺它 ⇒ 按「没有线路读它」拒 —— 判据与铸点读同一个原值,不另补一份 schema 缺省)。
72
+ * **唯一判据**:条目的 `headers`(`unknown`:承载形,不信类型)+ 条目的线路词(`api`)—— 两者都取判官那一次 settings-schema 解析的读数
73
+ * (缺席的 `api` 即 schema 的缺省),判据与铸点读同一只值,见 `judgeCatalogEntry`。
33
74
  * 整只判:任一名字 / 值不合 ⇒ 整只不收(留下好的那几个 = 让运维以为整袋生效了)。坏字段逐个列出(`headers.<名>`)。
34
75
  */
35
- export declare function readCatalogEntryHeaders(raw: unknown, api: unknown): CatalogEntryHeadersVerdict;
76
+ export declare function readCatalogEntryHeaders(raw: unknown, api: ModelApi): CatalogEntryHeadersVerdict;
36
77
  /**
37
78
  * **唯一铸点**(`toModel` 调):判过的袋 → `Model.headers` 的键。缺席 ⇒ 不铸键(一个 `undefined` 值的键也不铸:
38
79
  * 缺席只有一种拼法)。判不过 ⇒ **抛**:到这里的条目已经过 [ref] 逐条判据(判不过的进 `modelRefusals`、到不了 `toModel`),
39
80
  * 抛 = 两处判据分叉了,stage 整候选拒、响亮,不静默丢头。
40
81
  */
41
- export declare function buildModelHeadersKey(entryName: string, raw: unknown, api: unknown): {
82
+ export declare function buildModelHeadersKey(entryName: string, raw: unknown, api: ModelApi): {
42
83
  headers?: Record<string, string>;
43
84
  };
85
+ export {};
44
86
  //# sourceMappingURL=model-entry-headers.d.ts.map
@@ -35,9 +35,9 @@ export function readCatalogEntryHeaders(raw, api) {
35
35
  continue;
36
36
  }
37
37
  const lanes = CATALOG_ENTRY_HEADER_LANES[name];
38
- if (typeof api !== "string" || !lanes.includes(api)) {
38
+ if (!lanes.includes(api)) {
39
39
  fields.push(field);
40
- issues.push(`${field}: only read on the ${lanes.join(" / ")} lane — this entry ${typeof api === "string" ? `is api "${api}"` : "declares no api"}, where the header would be sent and do nothing`);
40
+ issues.push(`${field}: only read on the ${lanes.join(" / ")} lane — this entry is api "${api}", where the header would be sent and do nothing`);
41
41
  continue;
42
42
  }
43
43
  if (typeof value !== "string" || value.length > MAX_HEADER_VALUE_CHARS || !HEADER_VALUE_SHAPE.test(value)) {
@@ -1,4 +1,4 @@
1
- import { type ModelEntryRefusalCode, type ModelPlaneRefusalCode, type ModelRefusalsSignal } from "@sema-agent/settings-schema";
1
+ import { ModelEntry, type ModelEntryRefusalCode, type ModelPlaneRefusalCode, type ModelRefusalsSignal } from "@sema-agent/settings-schema";
2
2
  import { type DroppedCatalogEntry } from "./web-admin-client/read-warnings.js";
3
3
  import { type ModelTableLeg } from "./model-select.js";
4
4
  import type { CandidateRejectionNote } from "./web-admin-client/candidate-gate.js";
@@ -41,31 +41,38 @@ export interface CatalogEntryVerdictCtx {
41
41
  /** anthropic 路由装上了没有(= `config.anthropic` 在场,`createBrain` 同判)。 */
42
42
  readonly anthropicRouteMounted: boolean;
43
43
  }
44
- /** 条目最小读面(`CenterModel` 与本地投影都结构满足;形判走 settings-schema,不信这张型)。 */
44
+ /** 条目的承载形最小读面(`CenterModel` 与本地投影都结构满足)。判据只从 settings-schema 的那一次解析读条目;承载形上只读拒因的键
45
+ * (`name`)与形判不过时拒因句要的身份(`id` / `provider`,按 `typeof` 读,不信这张型)。 */
45
46
  export interface CatalogEntryLike {
46
47
  readonly name: string;
47
48
  readonly id: string;
48
49
  readonly provider: string;
49
- /** [ref]:线路词(`headers` 的线路判据读它;原值,不信这张型)。 */
50
- readonly api?: unknown;
51
- /** [ref]:供应商附加头的承载形(`unknown`:判据在 `model-entry-headers.ts`,不信这张型)。 */
52
- readonly headers?: unknown;
53
- /** 引擎已退役的每模型引导句(core 7.56.0 [ref];settings-schema 的 `ModelEntry` 仍收它)—— 只读在场与否,见 {@link judgeCatalogEntry}。 */
54
- readonly promptGuidance?: unknown;
55
50
  }
51
+ /** 一条条目的判决:可用 ⇒ 判官那一次 settings-schema 解析读出的条目(**铸点只从它铸 Model** —— 判与铸读同一只值);不可用 ⇒ 拒因。 */
52
+ export type CatalogEntryVerdict = {
53
+ readonly ok: true;
54
+ readonly entry: ModelEntry;
55
+ } | {
56
+ readonly ok: false;
57
+ readonly refusal: ModelEntryRefusal;
58
+ };
56
59
  /**
57
- * **逐条判据**:`undefined` = 本部署能完整服务它。判序即语义:先形(不合形的条目谈不上走哪条腿),再腿。
58
- * 形分两段、同一个码(`config.model_entry_invalid`):settings-schema 的 `ModelEntry`,再是 [ref] 的 `headers`(白名单 + 线路 + 值形,
60
+ * **逐条判据**:`ok` = 本部署能完整服务它(连同判出它的那一份读数)。判序即语义:先形(不合形的条目谈不上走哪条腿),再腿。
61
+ * 形分三段、同一个码(`config.model_entry_invalid`):settings-schema 的 `ModelEntry`,再是 [ref] 的名字(凭据形的名不收,见 {@link credentialNameRefusal}),再是 [ref] 的 `headers`(白名单 + 线路 + 值形,
59
62
  * 判据单属主 `model-entry-headers.ts`;settings-schema 6.3.0 的 `ModelEntry` 还没有这个键 —— 候裁加字段,届时词表不另抄)。
60
63
  *
61
- * 形判的属主是 settings-schema 的 `ModelEntry`(两条读腿用的就是它)—— 本仓不手抄任何一条字段规则;这里只是
62
- * 在第二道边界(绕过读腿的输入)上**再问一次同一个属主**,并把答案变成一条带码的拒因。只取 `success` 与 issue
63
- * 坐标,不取它的输出(输出会补缺省、剥扩展键,那是读腿的事)。
64
+ * 形判的属主是 settings-schema 的 `ModelEntry`(两条读腿用的就是它)—— 本仓不手抄任何一条字段规则;这里在第二道边界(绕过读腿的
65
+ * 输入)上**再问一次同一个属主**:不过 ⇒ 一条带码的拒因;过 ⇒ 它的输出就是这条条目**唯一的读数**,其后的每一判与铸点都读它。
66
+ *
67
+ * **一种读法**:两条读腿交来的条目本就是这份输出;绕过读腿的输入(盘上被手改的 LKG、手写 effective、夹具)在这里得到同一份 ——
68
+ * schema 补的缺省(`api` / `tier` / `provider` / `quotaWeight` …)随这一次读法进 Model,不存在「判按缺省、铸按原值」的第二读法
69
+ * (修前:缺 `api` 的条目形判放行、铸点按原值读 ⇒ 整只候选 stage 抛;缺 `tier` 的条目铸出无 `params.tier` 的 Model,按档位选的缺省选不中 ⇒ 模型面整组拒)。
64
70
  */
65
- export declare function judgeCatalogEntry(m: CatalogEntryLike, ctx: CatalogEntryVerdictCtx): ModelEntryRefusal | undefined;
71
+ export declare function judgeCatalogEntry(m: CatalogEntryLike, ctx: CatalogEntryVerdictCtx): CatalogEntryVerdict;
66
72
  /** 一批已启用条目的判决:可用的(保序)、不可用的(按 catalog name)、被丢目录条目的载体行(形对的,保序),以及形不对的载体行(坐标)。 */
67
- export interface CatalogEntriesVerdict<M extends CatalogEntryLike> {
68
- readonly usable: readonly M[];
73
+ export interface CatalogEntriesVerdict {
74
+ /** 可用条目判官那一次 schema 解析的读数(保序)—— 模型面 stage 只从这里铸 Model(承载形不再被读)。 */
75
+ readonly usable: readonly ModelEntry[];
69
76
  /** 键 = catalog name(**每一个**名,含秘密形 / 空串 / `__proto__`:引擎自己的判决保持完整 —— [ref] 不变量与选择面的「让出」都读它;
70
77
  * 名筛只在出口,见 {@link buildModelRefusalsSignal})。键以自有数据属性写入(`__proto__` 不走原型 setter)。 */
71
78
  readonly refused: Readonly<Record<string, ModelEntryRefusal>>;
@@ -76,6 +83,12 @@ export interface CatalogEntriesVerdict<M extends CatalogEntryLike> {
76
83
  /** [ref]:载体里形对的行(保序)—— 模型面 stage 把它与 `models` 同 commit 进 `config.droppedCatalogEntries`(`GET /v1/models.droppedEntries`
77
84
  * 的源):载体只在这里被判形、被读一次,墓碑与 wire 读的是同一批行。 */
78
85
  readonly dropped: readonly DroppedCatalogEntry[];
86
+ /**
87
+ * **这份候选管不管模型面** —— 唯一判决位(铸在这里一次;模型面 stage 的捷径、dry-run 的 `wouldOverrideModels`、世代账的模型面结局都读它,
88
+ * 墓碑判据与它读同一个行谓词 {@link droppedRowEnabled})。管 ⇔ 有一条启用条目(幸存的,或被读腿丢掉的 —— 有名无名都算),或载体形不对
89
+ * (改过的行原本代表谁说不清,按「管」判、随后组拒,fail-closed)。不管 ⇒ 上一代 / env 继续服务,不是拒。
90
+ */
91
+ readonly manages: boolean;
79
92
  }
80
93
  /**
81
94
  * 批量形(模型面 stage 与 dry-run 共用这一只 —— 报数与真 apply 永不撕裂)。
@@ -90,7 +103,7 @@ export interface CatalogEntriesVerdict<M extends CatalogEntryLike> {
90
103
  * 秘密形或非标识符,被扣下的名字无从被铸出;代价只是显式点它的请求拿到「未知模型」而不是 `request.model_unavailable`。
91
104
  * 与一条可用 / 已判不可用条目同名时不覆盖(可用条目仍可用;同名撞车由不变量 `refused-names-not-minted` 响亮拒)。
92
105
  */
93
- export declare function judgeCatalogEntries<M extends CatalogEntryLike>(enabled: readonly M[], ctx: CatalogEntryVerdictCtx, dropped?: unknown): CatalogEntriesVerdict<M>;
106
+ export declare function judgeCatalogEntries(enabled: readonly CatalogEntryLike[], ctx: CatalogEntryVerdictCtx, dropped?: unknown): CatalogEntriesVerdict;
94
107
  /** [ref]:一次 apply 对「最新交到手的那份候选目录」的模型拒因判决(纯数据;`ApplyReport.modelRefusals`)。 */
95
108
  export interface ModelRefusalVerdict {
96
109
  /** 那份候选的逐条判决(键 = catalog name,**完整**,未过名筛 —— 名筛在出口 {@link buildModelRefusalsSignal})。 */
@@ -101,9 +114,9 @@ export interface ModelRefusalVerdict {
101
114
  /**
102
115
  * [ref] —— 判决 → `/health.modelRefusals` 与 fleet 心跳 `modelRefusals` 的 wire 形(settings-schema `ModelRefusalsSignal`,纯投影):
103
116
  * 名 → 码,**值只码**(拒因事实里的上游 id / provider 词 / 坏字段键 / 出路句都不上 wire —— `entry_invalid` 行是没人验过的行,id / provider
104
- * 可能就是坏行原样;句子是给本机运维的散文,不是契约)。**名筛在这里、只在这里**:键过 settings-schema `isReportableRefusalName`(唯一判据,
105
- * import 不复制;6.3.0 起 = 标识符白名单 ∧ 无密钥形 ∧ 无 URL userinfo)—— 秘密形 / 空串 / `__proto__` / 不是标识符的串这类出不了门的名不进键、
106
- * 不计数;引擎内部的判决不受影响;本机日志 / 拒因句里的写名同样先问这一只([ref],{@link disclosableRefusalName}:不可披露的名只写码)。
117
+ * 可能就是坏行原样;句子是给本机运维的散文,不是契约)。**名筛在这里、只在这里**:键过 {@link disclosableRefusalName}([ref] 起 wire 出口与日志 / 拒因句同一个口:
118
+ * settings-schema `isReportableRefusalName`〔6.3.0 起 = 标识符白名单 ∧ 无密钥形 ∧ 无 URL userinfo,import 不复制〕∧ 脱敏器的强证据臂不认它是凭据)—— 秘密形 /
119
+ * 空串 / `__proto__` / 不是标识符的串这类出不了门的名不进键、不计数;引擎内部的判决不受影响;本机日志 / 拒因句里的写名同样先问这一个口([ref]:不可披露的名只写码)。
107
120
  * 逐条空且无组拒 ⇒ `undefined`(键缺席:「没有」只有一种拼法)。
108
121
  */
109
122
  export declare function buildModelRefusalsSignal(v: ModelRefusalVerdict | undefined): ModelRefusalsSignal | undefined;
@@ -131,8 +144,15 @@ export declare function echoModelRef(ref: string): string;
131
144
  * hook 选模型的失败文案 —— 各处同一句)。`field` = 调用方的通道名(`model` / `compactionModel` / `agents[0].model` /
132
145
  * `@-mention`),`requested` = 调用方发来的**原形**(name 或 id;本函数回显它时过 {@link echoModelRef},调用方不预先截)。
133
146
  * 别名段(`(catalog entry …)`)的判断读原形:ref 与条目名逐字相同 ⇒ 不带,不因回显截短而误判成「另有条目」。
147
+ * 别名段里的条目名过 {@link nameSlot}([ref]):调用方按上游 id 点中一条名字是凭据形的条目时,名字是**配置里的字**、不是调用方写的字,不可披露的名不原样回给他。
134
148
  */
135
149
  export declare function modelUnavailableMessage(field: string, requested: string, name: string, r: ModelEntryRefusal): string;
150
+ /**
151
+ * 一次**用户选择**(显式 ref / `@name` / `compactionModel`)落在 `models.atMention` 许可之外时的拒因句 —— HTTP `request.model_not_allowed` 的 `error`
152
+ * 与 run-local 的 stderr 同一句(与 {@link modelUnavailableMessage} 同一种铸法:`field` = 调用方的通道名,`requested` = 原形,本函数回显时过 {@link echoModelRef};
153
+ * `resolved` = 选择归一到的目录名,即这次真会跑的那只)。
154
+ */
155
+ export declare function modelNotAllowedMessage(field: string, requested: string, resolved: string): string;
136
156
  /** 缺省模型不变量读的切面(`ServiceConfig` 与 `CrossInvariantView` 都结构满足;可选成员缺席 = 没有被拒的候选)。 */
137
157
  export interface DefaultModelView {
138
158
  readonly models: Readonly<Record<string, unknown>>;
@@ -4,6 +4,7 @@ import { catalogBrainLane } from "./model-provider.js";
4
4
  import { readCatalogEntryHeaders } from "./model-entry-headers.js";
5
5
  import { DroppedCatalogEntryRow, describeSchemaIssueFields, describeSchemaIssues } from "./web-admin-client/read-warnings.js";
6
6
  import { echoCallerText } from "./caller-text-echo.js";
7
+ import { isCredentialShapedUnit } from "./trace/redact.js";
7
8
  import { DEFAULT_MODEL_REF } from "./model-select.js";
8
9
  export const ENTRY_REFUSAL_REASON_OF = {
9
10
  "config.model_no_brain": "no_brain",
@@ -26,36 +27,45 @@ export function judgeCatalogEntry(m, ctx) {
26
27
  const shape = ModelEntry.safeParse(m);
27
28
  if (!shape.success) {
28
29
  const fields = describeSchemaIssueFields(shape.error);
29
- return entryInvalidRefusal(typeof m.id === "string" ? m.id : "", typeof m.provider === "string" ? m.provider : "", fields, describeSchemaIssues(shape.error) ?? fields.join(", "));
30
+ return { ok: false, refusal: entryInvalidRefusal(typeof m.id === "string" ? m.id : "", typeof m.provider === "string" ? m.provider : "", fields, describeSchemaIssues(shape.error) ?? fields.join(", ")) };
30
31
  }
31
- const headers = readCatalogEntryHeaders(m.headers, m.api);
32
+ const e = shape.data;
33
+ if (isCredentialShapedUnit(e.name))
34
+ return { ok: false, refusal: credentialNameRefusal(e.id, e.provider) };
35
+ const headers = readCatalogEntryHeaders(e.headers, e.api);
32
36
  if (!headers.ok)
33
- return entryInvalidRefusal(m.id, m.provider, headers.fields, headers.issue);
34
- if (Array.isArray(m.promptGuidance) && m.promptGuidance.length > 0) {
37
+ return { ok: false, refusal: entryInvalidRefusal(e.id, e.provider, headers.fields, headers.issue) };
38
+ if (e.promptGuidance !== undefined && e.promptGuidance.length > 0) {
35
39
  return {
36
- ...refusalCause("config.model_entry_invalid"),
37
- id: m.id,
38
- provider: m.provider,
39
- fields: ["promptGuidance"],
40
- detail: "the catalog entry carries per-model guidance sentences (promptGuidance), which the engine no longer delivers — the entry is not served here " +
41
- "rather than served with its sentences silently dropped; move each sentence into a center or deployment prompt overlay on the behavior band " +
42
- "and remove promptGuidance from the entry to bring it back",
40
+ ok: false,
41
+ refusal: {
42
+ ...refusalCause("config.model_entry_invalid"),
43
+ id: e.id,
44
+ provider: e.provider,
45
+ fields: ["promptGuidance"],
46
+ detail: "the catalog entry carries per-model guidance sentences (promptGuidance), which the engine no longer delivers — the entry is not served here " +
47
+ "rather than served with its sentences silently dropped; move each sentence into a center or deployment prompt overlay on the behavior band " +
48
+ "and remove promptGuidance from the entry to bring it back",
49
+ },
43
50
  };
44
51
  }
45
- const lane = catalogBrainLane(m.provider);
52
+ const lane = catalogBrainLane(e.provider);
46
53
  const mount = laneMount(lane, ctx);
47
54
  if (!mount.mounted) {
48
55
  return {
49
- ...refusalCause("config.model_no_brain"),
50
- id: m.id,
51
- provider: m.provider,
52
- fields: [],
53
- detail: `provider "${m.provider}" rides the ${lane} brain, which is not mounted on this deployment — the entry is not served here ` +
54
- `(it is never routed to another brain with its own key); set ${mount.how}, ` +
55
- 'or change the entry\'s provider to an OpenAI-compatible route ("gateway" / "vllm") with its own baseUrl',
56
+ ok: false,
57
+ refusal: {
58
+ ...refusalCause("config.model_no_brain"),
59
+ id: e.id,
60
+ provider: e.provider,
61
+ fields: [],
62
+ detail: `provider "${e.provider}" rides the ${lane} brain, which is not mounted on this deployment — the entry is not served here ` +
63
+ `(it is never routed to another brain with its own key); set ${mount.how}, ` +
64
+ 'or change the entry\'s provider to an OpenAI-compatible route ("gateway" / "vllm") with its own baseUrl',
65
+ },
56
66
  };
57
67
  }
58
- return undefined;
68
+ return { ok: true, entry: e };
59
69
  }
60
70
  function entryInvalidRefusal(id, provider, fields, issues) {
61
71
  return {
@@ -67,6 +77,20 @@ function entryInvalidRefusal(id, provider, fields, issues) {
67
77
  "deployment's catalog on its own (the other entries keep serving) instead of being served with a value nothing validated; fix the entry to bring it back",
68
78
  };
69
79
  }
80
+ function credentialNameRefusal(id, provider) {
81
+ return {
82
+ ...refusalCause("config.model_entry_invalid"),
83
+ id,
84
+ provider,
85
+ fields: ["name"],
86
+ detail: "the catalog entry's name field is credential-shaped (the engine's secret scanner reads it as a credential) — an entry name is returned verbatim by GET /v1/models " +
87
+ "and serves as the @-mention handle, so the entry is not served rather than served under a name that every log line has to mask; rename the entry to a plain identifier " +
88
+ "to bring it back, and treat the credential as exposed if the name was pasted from a real one",
89
+ };
90
+ }
91
+ function droppedRowEnabled(row) {
92
+ return row.identity?.enabled !== false;
93
+ }
70
94
  const MALFORMED_CARRIER_NOT_A_LIST = "(droppedCatalogEntries is not a list)";
71
95
  export function judgeCatalogEntries(enabled, ctx, dropped) {
72
96
  const usable = [];
@@ -75,15 +99,15 @@ export function judgeCatalogEntries(enabled, ctx, dropped) {
75
99
  Object.defineProperty(refused, name, { value: r, enumerable: true, writable: true, configurable: true });
76
100
  };
77
101
  for (const m of enabled) {
78
- const r = judgeCatalogEntry(m, ctx);
79
- if (r === undefined)
80
- usable.push(m);
102
+ const v = judgeCatalogEntry(m, ctx);
103
+ if (v.ok)
104
+ usable.push(v.entry);
81
105
  else
82
- mint(String(m.name), r);
106
+ mint(String(m.name), v.refusal);
83
107
  }
84
108
  const rows = dropped === undefined ? [] : Array.isArray(dropped) ? dropped : undefined;
85
109
  if (rows === undefined)
86
- return { usable, refused, malformed: [MALFORMED_CARRIER_NOT_A_LIST], dropped: [] };
110
+ return { usable, refused, malformed: [MALFORMED_CARRIER_NOT_A_LIST], dropped: [], manages: true };
87
111
  const malformed = [];
88
112
  const carried = [];
89
113
  for (const d of rows) {
@@ -95,24 +119,24 @@ export function judgeCatalogEntries(enabled, ctx, dropped) {
95
119
  }
96
120
  carried.push(row.data);
97
121
  const { identity } = row.data;
98
- if (identity?.name === undefined || identity.enabled === false)
122
+ if (!droppedRowEnabled(row.data) || identity?.name === undefined)
99
123
  continue;
100
124
  if (Object.hasOwn(refused, identity.name))
101
125
  continue;
102
126
  mint(identity.name, entryInvalidRefusal(identity.id ?? "", "", row.data.fields, row.data.issues));
103
127
  }
104
- return { usable, refused, malformed, dropped: carried };
128
+ return { usable, refused, malformed, dropped: carried, manages: enabled.length > 0 || malformed.length > 0 || carried.some(droppedRowEnabled) };
105
129
  }
106
130
  export function buildModelRefusalsSignal(v) {
107
131
  if (v === undefined)
108
132
  return undefined;
109
- const entries = Object.fromEntries(Object.entries(v.entries).flatMap(([name, r]) => (isReportableRefusalName(name) ? [[name, r.code]] : [])));
133
+ const entries = Object.fromEntries(Object.entries(v.entries).flatMap(([name, r]) => (disclosableRefusalName(name) !== undefined ? [[name, r.code]] : [])));
110
134
  if (Object.keys(entries).length === 0 && v.plane === undefined)
111
135
  return undefined;
112
136
  return v.plane === undefined ? { entries } : { entries, plane: v.plane };
113
137
  }
114
138
  function disclosableRefusalName(name) {
115
- return isReportableRefusalName(name) ? name : undefined;
139
+ return isReportableRefusalName(name) && !isCredentialShapedUnit(name) ? name : undefined;
116
140
  }
117
141
  export function refusedNameLogField(key, name) {
118
142
  const shown = disclosableRefusalName(name);
@@ -149,9 +173,12 @@ export function echoModelRef(ref) {
149
173
  return echoCallerText(ref, { maxChars: MODEL_REF_ECHO_CHARS });
150
174
  }
151
175
  export function modelUnavailableMessage(field, requested, name, r) {
152
- const alias = requested === name ? "" : ` (catalog entry "${name}")`;
176
+ const alias = requested === name ? "" : ` (catalog entry ${nameSlot(name)})`;
153
177
  return `${field} "${echoModelRef(requested)}"${alias} is published in the catalog but unavailable on this deployment [${r.code}] — ${r.detail}`;
154
178
  }
179
+ export function modelNotAllowedMessage(field, requested, resolved) {
180
+ return `${field} "${echoModelRef(requested)}" is not @-mentionable on this deployment (it resolves to catalog model "${resolved}") — which models can be @-mentioned is configured by the operator (models.atMention)`;
181
+ }
155
182
  function candidateFellBackClause(notes) {
156
183
  if (notes === undefined || notes.length === 0)
157
184
  return "";
@@ -23,13 +23,18 @@
23
23
  * · `refusalCode` / `gap` —— **起服路由判官对当前 config 的判决**:`judgeServedModelRoute` 同一只函数(装配第 2 段与 `run-local` 调的就是它),通过 ⇒ 两键缺席。
24
24
  * 进程既然起来了,正常是缺席;测试夹具 / 自建装配 / 不拒启的入口可能在场 —— 如实投,不替它们编造通过。**不带句子**(拒因句只走日志与起服错误)。
25
25
  *
26
- * ## 只在起服后可答
27
- * 读面挂在运行中的进程上;判官必须在目录应用之后调(`judgeServedModelRoute` 头注),起服前没有「将要服务的表」,所以没有起服前的预判口。
26
+ * ## 两条读路,一只读口
27
+ * 判官必须在目录应用之后调(`judgeServedModelRoute` 头注):「将要服务的表」在装配第 2 段末才定形。读这一格的只有 {@link readModelPlaneFace} 一只,两条读路各调一次:
28
+ * · 起服后 —— `GET /v1/models` 的 `modelPlane`(`http/routes/capabilities.ts`;座经 `ServiceDeps` 的两只取值口转到 web-admin 运行时);
29
+ * · 起服前 —— 无监听探针 `model-plane-probe.ts`:跑**同一对**装配段(`runStage01` → `runStage02`)到模型表定形即停,同一只读口读同一个运行时的座,stdout 一行。
30
+ * 两路读同一批事实、同一只铸点 ⇒ 同一份部署配置、同一时点(第 2 段末;起服拉取超窗时那一份迟到的候选两路都还没采纳)两路的 JSON 字节同;
31
+ * 壳不再需要起服前的第二份判官。
28
32
  */
29
33
  import type { ModelPlaneRefusalCode } from "@sema-agent/settings-schema";
30
34
  import { type ModelRouteEndpointVerdict, type ModelRouteGap, type ServedModelRouteView } from "./model-route-endpoint.js";
31
35
  import { type ModelTableLeg } from "./model-select.js";
32
36
  import type { CandidateRejection } from "./web-admin-client/candidate-gate.js";
37
+ import { type ServiceConfig } from "./config.js";
33
38
  /** `modelPlane.catalog` 的闭集(消费方用穷举 switch —— 加一词不补臂 ⇒ 编译红)。 */
34
39
  export declare const CATALOG_STANCES: readonly ["absent", "adopted", "refused"];
35
40
  export type CatalogStance = (typeof CATALOG_STANCES)[number];
@@ -44,14 +49,17 @@ export interface ModelPlaneFace {
44
49
  /** 最新到达的目录候选被模型面组拒的码(见文件头;缺席 ⇔ 最新到达的候选没有被模型面组拒)。 */
45
50
  readonly planeRefusalCode?: ModelPlaneRefusalCode;
46
51
  }
47
- /** {@link buildModelPlaneFace} 读的进程事实(都由调用方从各自的座取,本函数不碰任何全局)。 */
48
- export interface ModelPlaneFacts {
49
- /** 严格名册布防(`isRosterGateArmed`):env 表是占位、不被判(装配第 2 段传的是同一只谓词)。 */
50
- readonly envTableIsPlaceholder: boolean;
51
- /** 候选判官最近一次整拒的结论座(`WebAdminRuntime.candidateRejectionState()`);座空 / 没有配置管道 ⇒ `undefined`。 */
52
- readonly candidateRejection: CandidateRejection | undefined;
53
- /** 最新到达的目录候选被模型面组拒的码(`WebAdminRuntime.latestPlaneRefusalState()`);没有 / 没有配置管道 ⇒ `undefined`。 */
54
- readonly latestPlaneRefusal: ModelPlaneRefusalCode | undefined;
52
+ /**
53
+ * 模型面读数取事实的两只座 —— 结构上就是 web-admin 运行时(`WebAdminRuntime`)的同名两只取值口:起服前探针递运行时本身,`GET /v1/models` 递 `ServiceDeps`
54
+ * (装配第 10 段把这两只接成 `() => webAdmin.<同名>()`)。没有配置管道的装配(纯 env 夹具 / 自建装配)两只都缺席 ⇒ 读作「没有整拒」。
55
+ */
56
+ export interface ModelPlaneSeats {
57
+ readonly candidateRejectionState?: () => CandidateRejection | undefined;
58
+ readonly latestPlaneRefusalState?: () => ModelPlaneRefusalCode | undefined;
55
59
  }
56
- export declare function buildModelPlaneFace(config: ServedModelRouteView, facts: ModelPlaneFacts): ModelPlaneFace;
60
+ /**
61
+ * `modelPlane` 的**唯一读口**(起服后的 HTTP 路由与起服前的探针各调一次,见文件头「两条读路,一只读口」):进程事实只在这里取齐 ——
62
+ * 名册布防读 `isRosterGateArmed(config.webAdmin)`(装配第 2 段的路由判官传的同一只谓词),两只座读调用方递来的运行时取值口 —— 再交铸点。
63
+ */
64
+ export declare function readModelPlaneFace(config: ServedModelRouteView & Pick<ServiceConfig, "webAdmin">, seats: ModelPlaneSeats): ModelPlaneFace;
57
65
  //# sourceMappingURL=model-plane-face.d.ts.map
@@ -1,5 +1,6 @@
1
1
  import { judgeServedModelRoute } from "./model-route-endpoint.js";
2
2
  import { servedModelTableLeg } from "./model-select.js";
3
+ import { isRosterGateArmed } from "./config.js";
3
4
  export const CATALOG_STANCES = ["absent", "adopted", "refused"];
4
5
  function catalogStanceOf(served, wholeRefused) {
5
6
  if (wholeRefused)
@@ -11,7 +12,14 @@ function catalogStanceOf(served, wholeRefused) {
11
12
  return "absent";
12
13
  }
13
14
  }
14
- export function buildModelPlaneFace(config, facts) {
15
+ export function readModelPlaneFace(config, seats) {
16
+ return buildModelPlaneFace(config, {
17
+ envTableIsPlaceholder: isRosterGateArmed(config.webAdmin),
18
+ candidateRejection: seats.candidateRejectionState?.(),
19
+ latestPlaneRefusal: seats.latestPlaneRefusalState?.(),
20
+ });
21
+ }
22
+ function buildModelPlaneFace(config, facts) {
15
23
  const servedTable = servedModelTableLeg(config);
16
24
  const wholeRefused = facts.candidateRejection !== undefined || facts.latestPlaneRefusal !== undefined;
17
25
  const verdict = judgeServedModelRoute(config, { envTableIsPlaceholder: facts.envTableIsPlaceholder });
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=model-plane-probe.d.ts.map
@@ -0,0 +1,17 @@
1
+ import { fatalExit } from "./boot/fatal-exit.js";
2
+ import { runStage01 } from "./boot/stage-01-config.js";
3
+ import { runStage02 } from "./boot/stage-02-web-admin-pull.js";
4
+ import { readModelPlaneFace } from "./model-plane-face.js";
5
+ import { reserveStdoutForAnswer, writeCliResult } from "./observability/logger.js";
6
+ async function probe() {
7
+ reserveStdoutForAnswer();
8
+ const s02 = await runStage02(runStage01());
9
+ const answer = JSON.stringify(readModelPlaneFace(s02.config, s02.webAdmin));
10
+ await s02.webAdmin.stopRefreshLoop();
11
+ await writeCliResult(answer);
12
+ process.exit(0);
13
+ }
14
+ void probe().catch((err) => {
15
+ fatalExit(err);
16
+ });
17
+ //# sourceMappingURL=model-plane-probe.js.map
@@ -120,9 +120,9 @@ export declare function routeTableOf<R extends object>(view: {
120
120
  * 所以答案映到本仓两词闭集:`"anthropic"` ⇒ anthropic 腿,`undefined` ⇒ 网关腿;别的名字结构上不可能(表里没有那个键),真撞上 ⇒ **响亮抛**([ref]:运行期
121
121
  * miss 臂必须说出来,不静默折网关)。
122
122
  *
123
- * [ref](7.101.0):**目录条目**到不了「anthropic 词、路由没装」这一格 —— 模型面 stage 的逐条判据把它判成不可用(`config.model_no_brain`,那一判问的是
124
- * 「词想要的腿装没装」,{@link catalogBrainLane},与本判词是两个问题)。这一格今天只剩 **env 腿**:`MODEL_PROVIDER=anthropic` 而没配 anthropic 凭据的部署,
125
- * env 模型落网关腿、用的是网关自己的 `MODEL_API_KEY`(凭据与端点同属网关,不越界)。
123
+ * 「词想要的腿」({@link catalogBrainLane})与本判词的答案不是同一条的那一格(anthropic 词、路由没装)**不被服务**:目录条目在模型面 stage 的逐条判据里判成
124
+ * 不可用(`config.model_no_brain`);env 表在起服路由判官那里整表拒(`model-route-endpoint.ts`,缺口 `lane_credential_missing`,网关在不在都拒)。
125
+ * 所以到得了派发面的条目,词与本判词恒同一条;这里把 `undefined` 读成网关腿,是引擎路由器 fallback 的逐字转写,不是对那一格的放行。
126
126
  */
127
127
  export declare function brainLaneFor(provider: string | undefined, routes: Readonly<Record<string, unknown>>): ModelBrainLane;
128
128
  //# sourceMappingURL=model-provider.d.ts.map
@@ -4,7 +4,8 @@
4
4
  * 两层,一只 `AsyncLocalStorage`:
5
5
  * · **腿层**(`withModelReachScope`,三条带用户面投递口的 run 腿各包一次:流式 `POST /v1/tasks/stream`、后台 `POST /v1/runs`、续跑):
6
6
  * 带着这条腿的两枚身份 —— `sessionId`(通告归属键)与 `taskId`(这条腿的 run 资源 id,= 本腿交给引擎的 `spec.taskId`;7.121.0)——
7
- * 与本腿已经说过的目标集合(去重单位 = 每腿每目标一次);
7
+ * 与本腿已经说过的目标集合(去重单位 = 每腿每目标一次);腿层的 `sessionId` 同时是读拒字节地板通告的归属键
8
+ * (`read-deny-floor-notice.ts` 的 `presentEngineNotice`:腿派出去的 run —— cascade 的级、验证器、子代 —— 的那一帧落在这条腿的流上);
8
9
  * · **调用层**(`createModelReachBrain` 每次模型调用包一次):一只可变的 {@link ModelCallReach},出网观察者
9
10
  * (`outbound-dispatcher.ts` 的 undici 诊断通道订阅)把这次调用发出的每一条请求的**结局**记在上面 —— 最后一条是
10
11
  * 「连上了、有了回答」还是「建连就失败了」。
@@ -13,6 +13,9 @@
13
13
  * **`MODEL_GATEWAY_BASEURL` 没有出厂缺省;配置能派发到的每一条 openai 兼容路由,都必须解析到一个显式配置的
14
14
  * base URL(路由自己的 `baseUrl`,或显式设了的网关),否则拒。** 附带一条同类:备用网关
15
15
  * (`MODEL_GATEWAY_FALLBACK_URLS`)是主网关的镜像,没有主就没有镜像 ⇒ 拒。
16
+ * 同一只判官的第二条:**一条条目的 provider 词想要的腿(`catalogBrainLane`)与引擎路由器对本部署路由表的答案(`brainLaneFor`)不是同一条 ⇒ 拒**
17
+ * (今天只有一形:`anthropic` 词而 anthropic 路由没装)—— 词与实际线路只许一种说法:不把它交给网关腿冒名服务(网关拿自己的钥匙、自己的线路格式与
18
+ * 缓存口径答它,而条目行上的 `api` / 缓存族仍按词写),网关在不在都一样。
16
19
  *
17
20
  * ## 执法点(判据只在这里,执法点在调用处 —— 与 [ref] `gateway-url-userinfo` 同形)
18
21
  * **判官只判「将要服务的那张表」,拒因句按视图说真话**(视图词 = {@link ModelTableLeg} 两词,进判据入参,不靠调用方拼句):
@@ -21,7 +24,7 @@
21
24
  * 严格名册布防(`isRosterGateArmed`)时 env 表是占位、从不被派发 ⇒ 不判它(备用网关那一条与表无关,照判)。
22
25
  * 不在 `loadConfig()`:那是目录应用**之前**,env 表还不知道会不会服务(目录一旦采纳就整张换掉它);
23
26
  * · 壳 / 包问「这台引擎服务哪张表、起服判官怎么说」读 `GET /v1/models` 的 `modelPlane`(`model-plane-face.ts`,同一只 {@link judgeServedModelRoute});
24
- * 起服前没有「将要服务的表」可判,所以没有起服前的预判口;
27
+ * 引擎起来之前读无监听探针(`model-plane-probe.ts`:跑同一对装配段到模型表定形即停,同一只读口)—— 不另设起服前的第二判官;
25
28
  * · 热路径:`web-admin-client/apply-effective.ts` 的模型面 stage ⇒ 模型面组拒(opus 腿 O3:同候选其余组照落)、上一代模型面继续服务(目录视图);
26
29
  * · run-local:配置源解析完之后按真要派发的表判(`run-local.ts`)—— 本入口没有名册门,不豁免占位;
27
30
  * · 登记:`config-invariants.ts` 的 `model-route-endpoint` 条(表的「不许有表外不变量」职责);
@@ -49,8 +52,8 @@ export declare const GATEWAY_FALLBACK_WITHOUT_PRIMARY_CODE = "config.gateway_fal
49
52
  * · `endpoint_missing` —— 缺的是网关端点:openai 兼容腿上的条目解析不到 base URL(或备用网关设了、主网关没设);
50
53
  * 出路 = 设 `MODEL_GATEWAY_BASEURL`,或(目录视图)给条目自己的 `baseUrl` / (env 视图)挂 anthropic 路由、或不设 `MODEL_ID` 让目录缺省服务;
51
54
  * · `lane_credential_missing` —— 缺的是**车道凭据**:条目的 provider 词是 `anthropic`(用户选的是 anthropic 车道),
52
- * 却因 `ANTHROPIC_API_KEY` / `ANTHROPIC_AUTH_TOKEN` 都没有而没装上 anthropic 路由、落进了 openai 腿,那条腿又没有端点;
53
- * 出路 = 补那两把钥匙之一(设网关是另一条出路,拒因句一并给)。
55
+ * 却因 `ANTHROPIC_API_KEY` / `ANTHROPIC_AUTH_TOKEN` 都没有而没装上 anthropic 路由 —— 词想要的腿与路由器会给的腿不是同一条,网关在不在都拒;
56
+ * 出路 = 补那两把钥匙之一,或把词改成 openai 兼容腿的词(env 视图:`MODEL_PROVIDER=gateway`;目录视图:条目的 provider),拒因句一并给。
54
57
  *
55
58
  * **声明序 = 语义序**;加一词 ⇒ 所有穷举 switch 当场编译红。
56
59
  */
@@ -94,8 +97,9 @@ export interface ModelRouteEndpointView {
94
97
  *
95
98
  * 判序即语义:
96
99
  * ① 备用网关设了、主网关没设 ⇒ `config.gateway_fallback_without_primary`(备用是主的镜像,这一条与条目无关,先说);
97
- * ② 逐条目:按 {@link brainLaneFor}(引擎路由器对本部署路由表的答案)落 openai 腿、且 {@link openaiRouteBaseUrl} 解析不到 ⇒ 收集名字,
98
- * 一句话**全部点名**(运维一次改完,而不是改一个撞下一个)。
100
+ * ② 逐条目:词想要的腿({@link catalogBrainLane})≠ 引擎路由器对本部署路由表的答案({@link brainLaneFor})⇒ 收进「车道没装」一组;
101
+ * 其余落 openai 腿、且 {@link openaiRouteBaseUrl} 解析不到 ⇒ 收进「端点缺」一组。两组一句话**全部点名**(运维一次改完,而不是改一个撞下一个),
102
+ * 车道没装的一组在前(缺口词 `lane_credential_missing`)。
99
103
  *
100
104
  * `default` 键是目录里另一条的别名(env 腿 `{default: m, [m.id]: m}`、center 腿 `models.default = models[picked]`),
101
105
  * 与别的键指同一只对象时不重复点名;只有它一个键时(手搓夹具)照样点名 `default`。
@@ -31,21 +31,43 @@ export function judgeModelRouteEndpoint(view, leg) {
31
31
  }
32
32
  const routes = routeTableOf(view);
33
33
  const entries = Object.entries(view.models ?? {});
34
+ const laneUnmounted = [];
34
35
  const unresolved = [];
35
- let laneCredentialMissing = false;
36
36
  for (const [name, m] of entries) {
37
37
  if (name === DEFAULT_MODEL_REF && entries.some(([k, other]) => k !== name && other === m))
38
38
  continue;
39
- if (brainLaneFor(m.provider, routes) !== "gateway")
39
+ const lane = brainLaneFor(m.provider, routes);
40
+ if (catalogBrainLane(m.provider) !== lane) {
41
+ laneUnmounted.push(`"${name}"`);
42
+ continue;
43
+ }
44
+ if (lane !== "gateway")
40
45
  continue;
41
46
  if (openaiRouteBaseUrl(m.baseUrl, gateway) !== undefined)
42
47
  continue;
43
- laneCredentialMissing ||= catalogBrainLane(m.provider) === "anthropic";
44
- unresolved.push(unresolvedRouteLabel(name, m.provider));
48
+ unresolved.push(`"${name}"`);
49
+ }
50
+ const endpointMissing = unresolved.length > 0 ? routeEndpointMissingRefusal(unresolved, leg) : undefined;
51
+ if (laneUnmounted.length > 0) {
52
+ const reason = laneUnmountedRefusal(laneUnmounted, leg) + (endpointMissing !== undefined ? ` Also: ${endpointMissing}` : "");
53
+ return { code: MODEL_ROUTE_ENDPOINT_MISSING_CODE, gap: "lane_credential_missing", reason };
54
+ }
55
+ return endpointMissing === undefined ? undefined : { code: MODEL_ROUTE_ENDPOINT_MISSING_CODE, gap: "endpoint_missing", reason: endpointMissing };
56
+ }
57
+ function laneUnmountedRefusal(quotedNames, leg) {
58
+ const one = quotedNames.length === 1;
59
+ const head = `${one ? `model ${quotedNames[0]} asks` : `models ${quotedNames.join(", ")} ask`} for the anthropic lane (provider "anthropic"), but no Anthropic route is mounted on this ` +
60
+ `deployment — ANTHROPIC_API_KEY and ANTHROPIC_AUTH_TOKEN are both unset [${MODEL_ROUTE_ENDPOINT_MISSING_CODE}]. ${one ? "It is" : "They are"} not served rather than ` +
61
+ "handed to the openai-compatible gateway under an anthropic label (that lane would answer with its own key, its own wire format and its own cache accounting). ";
62
+ switch (leg) {
63
+ case "env":
64
+ return (head +
65
+ "Pick one way out: (1) set ANTHROPIC_API_KEY or ANTHROPIC_AUTH_TOKEN (plus ANTHROPIC_BASE_URL for a non-default endpoint); " +
66
+ "(2) set MODEL_PROVIDER=gateway (or vllm) to serve the env model on the openai-compatible gateway; " +
67
+ "(3) leave MODEL_ID unset and let the default entry of a catalog (config.d/models.json, or the web-admin) serve — a catalog in force replaces the env model table.");
68
+ case "catalog":
69
+ return head + `Set ANTHROPIC_API_KEY or ANTHROPIC_AUTH_TOKEN in this service's env, or change ${one ? "the entry's" : "each named entry's"} provider to an OpenAI-compatible route ("gateway" / "vllm") with its own baseUrl.`;
45
70
  }
46
- if (unresolved.length === 0)
47
- return undefined;
48
- return { code: MODEL_ROUTE_ENDPOINT_MISSING_CODE, gap: laneCredentialMissing ? "lane_credential_missing" : "endpoint_missing", reason: routeEndpointMissingRefusal(unresolved, leg) };
49
71
  }
50
72
  function routeEndpointMissingRefusal(quotedNames, leg) {
51
73
  const one = quotedNames.length === 1;
@@ -84,6 +84,22 @@ export declare function resolveTaskModel(bodyModel: unknown, objective: string,
84
84
  notAllowed?: ModelNotAllowed;
85
85
  unavailable?: ModelUnavailable;
86
86
  };
87
+ /** 用户选择被判的那一份模型面(`ServiceConfig` 结构上满足):目录、档位绑定、不可用条目、本代 `atMention` —— 四件出自同一份配置。 */
88
+ export interface UserModelPlane<M> {
89
+ readonly models: Record<string, M>;
90
+ readonly tiers: Record<string, string> | undefined;
91
+ readonly modelRefusals: Readonly<Record<string, ModelEntryRefusal>> | undefined;
92
+ readonly atMention: AtMention;
93
+ }
94
+ /**
95
+ * 🔴 **用户选择的唯一入口**(请求面 `body.model` / `settings.model`、objective 内联 `@name`,每一条提交腿同调):在**可选目录**({@link selectableCatalog})上解析、
96
+ * 用本代 `atMention` 判许可({@link resolveTaskModel} → {@link isAtMentionable})。可选目录随结果交回(调用方其余显式选择通道 —— `compactionModel` /
97
+ * `agents[].model` / 未知模型拒体的 `available` —— 判的是同一张,不另铸)。哪张目录、哪份许可只在这里取,任何一条腿都没有「取契约缺省」的第二读法。
98
+ */
99
+ export declare function pickUserModel<M>(plane: UserModelPlane<M>, bodyModel: unknown, objective: string): {
100
+ selectable: Record<string, M>;
101
+ picked: ReturnType<typeof resolveTaskModel>;
102
+ };
87
103
  /**
88
104
  * [ref] 判别式拒因:这次**用户选择**点中的是一条已发布、但本部署不可用的目录条目(`config.modelRefusals`)。
89
105
  * 与 {@link ModelNotAllowed} 同一种处置口:本函数不 throw,调用点按 leg 分流(fresh 400 `request.model_unavailable` /
@@ -57,6 +57,10 @@ export function resolveTaskModel(bodyModel, objective, catalog, atMention, refus
57
57
  ...(unavailable ? { unavailable } : {}),
58
58
  };
59
59
  }
60
+ export function pickUserModel(plane, bodyModel, objective) {
61
+ const selectable = selectableCatalog(plane.models, plane.tiers, plane.modelRefusals);
62
+ return { selectable, picked: resolveTaskModel(bodyModel, objective, selectable, plane.atMention, plane.modelRefusals) };
63
+ }
60
64
  export function selectableCatalog(models, tiers, refusals) {
61
65
  const expanded = (expandTiers(models, tiers ?? {}) ?? models);
62
66
  const reserved = Object.keys(refusals ?? {}).filter((n) => Object.hasOwn(expanded, n) && !Object.hasOwn(models, n));