@sema-agent/server 7.131.0 → 7.133.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 (509) hide show
  1. package/MIGRATION.md +575 -0
  2. package/README.md +12 -9
  3. package/README.zh-CN.md +9 -6
  4. package/USAGE.md +326 -98
  5. package/deploy/sema-up/README.md +19 -1
  6. package/deploy/sema-up/chart/templates/server-v4pro.yaml +5 -2
  7. package/deploy/sema-up/chart/templates/server.yaml +5 -2
  8. package/deploy/sema-up/stack/compose.yaml +3 -0
  9. package/deploy/sema-up/stack/sema-stack-cluster.yaml +4 -2
  10. package/dist/adoption/plan.d.ts +3 -2
  11. package/dist/adoption/plan.js +7 -5
  12. package/dist/adoption/runner.js +3 -10
  13. package/dist/adoption/sql.d.ts +3 -2
  14. package/dist/adoption/sql.js +3 -5
  15. package/dist/adoption/wire.d.ts +4 -1
  16. package/dist/adoption/wire.js +1 -0
  17. package/dist/approval-ask-audit-store.d.ts +31 -13
  18. package/dist/approval-ask-audit-store.js +272 -74
  19. package/dist/approval-ask-machine.d.ts +15 -0
  20. package/dist/approval-ask-machine.js +6 -0
  21. package/dist/approval-ask-retention.d.ts +136 -0
  22. package/dist/approval-ask-retention.js +102 -0
  23. package/dist/approval-card.d.ts +82 -20
  24. package/dist/approval-card.js +46 -16
  25. package/dist/approval-deny-reasons.d.ts +1 -1
  26. package/dist/approval.d.ts +9 -0
  27. package/dist/approval.js +24 -3
  28. package/dist/audit.d.ts +33 -19
  29. package/dist/audit.js +12 -16
  30. package/dist/auth-bridge.d.ts +4 -0
  31. package/dist/auth-bridge.js +10 -11
  32. package/dist/bake-runner/main.js +3 -2
  33. package/dist/boot/deferred-sandbox-path-env.js +1 -1
  34. package/dist/boot/deployment-mods.d.ts +31 -0
  35. package/dist/boot/deployment-mods.js +26 -0
  36. package/dist/boot/execution-env.d.ts +1 -1
  37. package/dist/boot/execution-env.js +27 -12
  38. package/dist/boot/execution-lane.js +11 -0
  39. package/dist/boot/leader.js +2 -0
  40. package/dist/boot/memory-boundary.d.ts +2 -2
  41. package/dist/boot/memory-boundary.js +2 -2
  42. package/dist/boot/memory-consolidation.d.ts +5 -4
  43. package/dist/boot/memory-consolidation.js +7 -6
  44. package/dist/boot/org-delivery.d.ts +28 -0
  45. package/dist/boot/org-delivery.js +20 -0
  46. package/dist/boot/read-deny-anchor-audit.d.ts +17 -0
  47. package/dist/boot/read-deny-anchor-audit.js +36 -0
  48. package/dist/boot/reapers.d.ts +3 -0
  49. package/dist/boot/reapers.js +21 -1
  50. package/dist/boot/resolve-spec.d.ts +4 -5
  51. package/dist/boot/resolve-spec.js +74 -123
  52. package/dist/boot/runner-deps.d.ts +19 -8
  53. package/dist/boot/runner-deps.js +15 -2
  54. package/dist/boot/session-faces.d.ts +2 -7
  55. package/dist/boot/session-faces.js +4 -2
  56. package/dist/boot/stage-02-web-admin-pull.js +4 -1
  57. package/dist/boot/stage-03-store-backend.d.ts +1 -1
  58. package/dist/boot/stage-03-store-backend.js +2 -2
  59. package/dist/boot/stage-04-stores.d.ts +1 -1
  60. package/dist/boot/stage-05-execution-env.d.ts +4 -4
  61. package/dist/boot/stage-05-execution-env.js +7 -10
  62. package/dist/boot/stage-06-runners.d.ts +4 -2
  63. package/dist/boot/stage-06-runners.js +11 -7
  64. package/dist/boot/stage-07-capability-layer.d.ts +4 -2
  65. package/dist/boot/stage-07-capability-layer.js +27 -6
  66. package/dist/boot/stage-08-reapers.d.ts +4 -2
  67. package/dist/boot/stage-08-reapers.js +2 -2
  68. package/dist/boot/stage-09-leader.d.ts +6 -9
  69. package/dist/boot/stage-10-http-server.d.ts +6 -9
  70. package/dist/boot/stage-10-http-server.js +7 -9
  71. package/dist/boot/stores.d.ts +1 -1
  72. package/dist/boot/stores.js +7 -8
  73. package/dist/boot/web-admin.d.ts +4 -3
  74. package/dist/boot/web-admin.js +186 -98
  75. package/dist/boot/workflow-orchestration.d.ts +2 -0
  76. package/dist/boot/workflow-orchestration.js +2 -1
  77. package/dist/brain.js +25 -25
  78. package/dist/breaker-key.d.ts +6 -0
  79. package/dist/breaker-key.js +29 -0
  80. package/dist/budget.js +5 -4
  81. package/dist/caller-text-echo.d.ts +23 -0
  82. package/dist/caller-text-echo.js +21 -0
  83. package/dist/capabilities/brand-identity.d.ts +26 -0
  84. package/dist/capabilities/brand-identity.js +27 -0
  85. package/dist/capabilities/center-plugins.d.ts +7 -0
  86. package/dist/capabilities/center-plugins.js +1 -1
  87. package/dist/capabilities/center-prompts.d.ts +32 -59
  88. package/dist/capabilities/center-prompts.js +18 -32
  89. package/dist/capabilities/composite-members.d.ts +1 -1
  90. package/dist/capabilities/composite-members.js +1 -1
  91. package/dist/capabilities/engine-capabilities.js +2 -1
  92. package/dist/capabilities/execution-lane.js +2 -2
  93. package/dist/capabilities/hands-lane.d.ts +30 -6
  94. package/dist/capabilities/hands-lane.js +11 -1
  95. package/dist/capabilities/mcp-probe.d.ts +48 -3
  96. package/dist/capabilities/mcp-probe.js +47 -135
  97. package/dist/capabilities/scenarios.d.ts +95 -45
  98. package/dist/capabilities/scenarios.js +53 -38
  99. package/dist/capabilities/skills.d.ts +19 -4
  100. package/dist/capabilities/skills.js +30 -10
  101. package/dist/capability-facts.d.ts +34 -4
  102. package/dist/capability-facts.js +28 -2
  103. package/dist/center-config-tier.d.ts +69 -0
  104. package/dist/center-config-tier.js +42 -0
  105. package/dist/checkpoint-identity.d.ts +16 -0
  106. package/dist/checkpoint-identity.js +19 -0
  107. package/dist/config-catalog.d.ts +17 -10
  108. package/dist/config-catalog.js +47 -32
  109. package/dist/config-d-migration.d.ts +3 -1
  110. package/dist/config-d-migration.js +2 -2
  111. package/dist/config-dir-trust.d.ts +114 -0
  112. package/dist/config-dir-trust.js +388 -0
  113. package/dist/config-invariants.d.ts +18 -5
  114. package/dist/config-invariants.js +35 -3
  115. package/dist/config-lkg.d.ts +9 -9
  116. package/dist/config-lkg.js +20 -4
  117. package/dist/config-provider.d.ts +9 -2
  118. package/dist/config-provider.js +18 -6
  119. package/dist/config-types.d.ts +75 -20
  120. package/dist/config-types.js +8 -0
  121. package/dist/config.d.ts +13 -0
  122. package/dist/config.js +137 -62
  123. package/dist/delegated-session-owner.d.ts +185 -0
  124. package/dist/delegated-session-owner.js +119 -0
  125. package/dist/device-protocol.d.ts +5 -3
  126. package/dist/device-protocol.js +1 -1
  127. package/dist/device-ws-hub.js +21 -2
  128. package/dist/device-ws-protocol.d.ts +70 -6
  129. package/dist/device-ws-protocol.js +50 -22
  130. package/dist/elicitation.js +3 -2
  131. package/dist/entry-problems.d.ts +34 -0
  132. package/dist/entry-problems.js +14 -0
  133. package/dist/env-name-allowlist-knobs.d.ts +12 -2
  134. package/dist/env-name-allowlist-knobs.js +5 -4
  135. package/dist/exec-bounds.d.ts +15 -3
  136. package/dist/exec-bounds.js +4 -0
  137. package/dist/execution-lane-caps.d.ts +56 -10
  138. package/dist/execution-lane-caps.js +50 -0
  139. package/dist/field-conflict.d.ts +43 -0
  140. package/dist/field-conflict.js +20 -0
  141. package/dist/fleet/fleet-bus.d.ts +80 -6
  142. package/dist/fleet/fleet-bus.js +41 -9
  143. package/dist/hooks/classic-stations.d.ts +91 -0
  144. package/dist/hooks/classic-stations.js +27 -0
  145. package/dist/hooks/command-spawn.d.ts +57 -0
  146. package/dist/hooks/command-spawn.js +139 -0
  147. package/dist/hooks/hook-llm.d.ts +8 -5
  148. package/dist/hooks/hook-llm.js +79 -36
  149. package/dist/hooks/hook-runner.d.ts +349 -95
  150. package/dist/hooks/hook-runner.js +855 -568
  151. package/dist/hooks/hook-source.d.ts +44 -0
  152. package/dist/hooks/hook-source.js +40 -0
  153. package/dist/http/active-run-conflict.d.ts +5 -13
  154. package/dist/http/active-run-conflict.js +17 -27
  155. package/dist/http/admission.d.ts +8 -2
  156. package/dist/http/admission.js +188 -101
  157. package/dist/http/approval-sweeps.js +99 -21
  158. package/dist/http/caller-trust.d.ts +77 -0
  159. package/dist/http/caller-trust.js +143 -0
  160. package/dist/http/checkpoint-ctx.d.ts +41 -24
  161. package/dist/http/checkpoint-ctx.js +23 -16
  162. package/dist/http/claimed-run.d.ts +14 -0
  163. package/dist/http/claimed-run.js +15 -0
  164. package/dist/http/device-placement.d.ts +2 -4
  165. package/dist/http/device-placement.js +7 -11
  166. package/dist/http/dispatch.d.ts +0 -4
  167. package/dist/http/dispatch.js +15 -13
  168. package/dist/http/durable-run-leg.d.ts +6 -33
  169. package/dist/http/durable-run-leg.js +36 -10
  170. package/dist/http/health-self-report.d.ts +7 -5
  171. package/dist/http/health-self-report.js +4 -18
  172. package/dist/http/owner-access.d.ts +56 -0
  173. package/dist/http/owner-access.js +42 -0
  174. package/dist/http/principal-gate.d.ts +70 -28
  175. package/dist/http/principal-gate.js +61 -15
  176. package/dist/http/readiness.d.ts +11 -5
  177. package/dist/http/readiness.js +10 -3
  178. package/dist/http/refusal-body.d.ts +21 -0
  179. package/dist/http/refusal-body.js +4 -0
  180. package/dist/http/request-guards.d.ts +43 -23
  181. package/dist/http/request-guards.js +53 -17
  182. package/dist/http/resume-ctx-read.d.ts +2 -5
  183. package/dist/http/resume-ctx-read.js +7 -4
  184. package/dist/http/resume-legs.d.ts +28 -4
  185. package/dist/http/resume-legs.js +169 -91
  186. package/dist/http/retired-service-deps.d.ts +43 -0
  187. package/dist/http/retired-service-deps.js +18 -0
  188. package/dist/http/route-ctx.d.ts +44 -28
  189. package/dist/http/route-ctx.js +4 -0
  190. package/dist/http/route-table.js +2 -0
  191. package/dist/http/routes/a2a-serve.js +3 -4
  192. package/dist/http/routes/admin-config-refresh.js +1 -1
  193. package/dist/http/routes/admin-drain.js +1 -1
  194. package/dist/http/routes/admin-memory-optout.js +5 -1
  195. package/dist/http/routes/adoption.js +2 -9
  196. package/dist/http/routes/approvals-assistant.js +49 -48
  197. package/dist/http/routes/background.js +3 -2
  198. package/dist/http/routes/capabilities.js +21 -5
  199. package/dist/http/routes/config-catalog.d.ts +3 -3
  200. package/dist/http/routes/config-catalog.js +1 -1
  201. package/dist/http/routes/devices.js +3 -17
  202. package/dist/http/routes/diagnostics.js +6 -2
  203. package/dist/http/routes/images.js +6 -7
  204. package/dist/http/routes/leader.js +1 -8
  205. package/dist/http/routes/mcp-reconnect.d.ts +1 -1
  206. package/dist/http/routes/mcp-reconnect.js +3 -2
  207. package/dist/http/routes/memory-bundle.js +1 -1
  208. package/dist/http/routes/memory-compliance.js +1 -1
  209. package/dist/http/routes/memory-consolidation.js +1 -1
  210. package/dist/http/routes/memory-origin.js +1 -1
  211. package/dist/http/routes/memory-policy.d.ts +1 -1
  212. package/dist/http/routes/memory-policy.js +3 -2
  213. package/dist/http/routes/notify-wake.js +8 -21
  214. package/dist/http/routes/observability.js +2 -2
  215. package/dist/http/routes/principal-inbox.d.ts +39 -0
  216. package/dist/http/routes/principal-inbox.js +76 -0
  217. package/dist/http/routes/retention-ops.js +2 -9
  218. package/dist/http/routes/rules.js +5 -18
  219. package/dist/http/routes/runs.d.ts +5 -0
  220. package/dist/http/routes/runs.js +34 -107
  221. package/dist/http/routes/session-sync.js +15 -26
  222. package/dist/http/routes/sessions.js +30 -40
  223. package/dist/http/routes/shared-memory.js +2 -13
  224. package/dist/http/routes/side-query.js +8 -7
  225. package/dist/http/routes/tasks.js +67 -21
  226. package/dist/http/routes/workflows.d.ts +351 -0
  227. package/dist/http/routes/workflows.js +153 -119
  228. package/dist/http/send.d.ts +33 -10
  229. package/dist/http/send.js +21 -4
  230. package/dist/http/server.d.ts +27 -18
  231. package/dist/http/server.js +34 -6
  232. package/dist/http/stored-body-replay.js +17 -4
  233. package/dist/http/submit-ctx.d.ts +25 -0
  234. package/dist/http/submit-ctx.js +40 -0
  235. package/dist/http/submit-replay.d.ts +4 -3
  236. package/dist/http/submit-replay.js +5 -4
  237. package/dist/http/wire-types.d.ts +11 -8
  238. package/dist/index.d.ts +2 -2
  239. package/dist/index.js +1 -2
  240. package/dist/lane-home-probe.d.ts +112 -0
  241. package/dist/lane-home-probe.js +101 -0
  242. package/dist/leader/endpoint.d.ts +4 -1
  243. package/dist/leader/endpoint.js +11 -10
  244. package/dist/limit-refusal.d.ts +59 -0
  245. package/dist/limit-refusal.js +15 -0
  246. package/dist/main.js +1 -1
  247. package/dist/mcp-assertion-header.d.ts +32 -19
  248. package/dist/mcp-assertion-header.js +10 -9
  249. package/dist/mcp-tool-faces.d.ts +5 -0
  250. package/dist/mcp-tool-faces.js +6 -4
  251. package/dist/memory-project-layer.d.ts +37 -0
  252. package/dist/memory-project-layer.js +46 -0
  253. package/dist/memory-scope.d.ts +24 -17
  254. package/dist/memory-scope.js +24 -8
  255. package/dist/memory-sync-client.d.ts +27 -13
  256. package/dist/memory-sync-client.js +107 -18
  257. package/dist/model-entry-refusal.d.ts +9 -1
  258. package/dist/model-entry-refusal.js +6 -1
  259. package/dist/model-plane-face.d.ts +51 -0
  260. package/dist/model-plane-face.js +24 -0
  261. package/dist/model-provider.d.ts +44 -12
  262. package/dist/model-provider.js +21 -2
  263. package/dist/model-route-endpoint.d.ts +9 -12
  264. package/dist/model-route-endpoint.js +8 -11
  265. package/dist/model-route-env.d.ts +22 -0
  266. package/dist/model-route-env.js +2 -0
  267. package/dist/model-route-gap.d.ts +60 -30
  268. package/dist/model-route-gap.js +21 -15
  269. package/dist/observability/corrupt-read-seat.d.ts +7 -0
  270. package/dist/observability/corrupt-read-seat.js +9 -0
  271. package/dist/observability/cost-taxonomy.d.ts +7 -7
  272. package/dist/observability/err-text.d.ts +6 -0
  273. package/dist/observability/err-text.js +18 -4
  274. package/dist/observability/fail-open.d.ts +76 -14
  275. package/dist/observability/fail-open.js +76 -14
  276. package/dist/observability/metrics.js +4 -1
  277. package/dist/observability/prompt-manifest.d.ts +33 -82
  278. package/dist/observability/prompt-manifest.js +122 -17
  279. package/dist/observability/run-terminal.js +14 -6
  280. package/dist/observability/secret-env-scrub.d.ts +13 -1
  281. package/dist/observability/secret-env-scrub.js +13 -1
  282. package/dist/observability/tool-trace.d.ts +16 -21
  283. package/dist/observability/tool-trace.js +58 -49
  284. package/dist/operator-ask.d.ts +10 -0
  285. package/dist/operator-ask.js +3 -0
  286. package/dist/orchestration/workflow-agent-session-index.d.ts +12 -12
  287. package/dist/orchestration/workflow-agent-session-index.js +9 -13
  288. package/dist/orchestration/workflow-completion-inbox.d.ts +42 -15
  289. package/dist/orchestration/workflow-completion-inbox.js +13 -0
  290. package/dist/orchestration/workflow-notify-journal.d.ts +13 -32
  291. package/dist/orchestration/workflow-notify-journal.js +27 -34
  292. package/dist/orchestration/workflow-park-decision.d.ts +89 -0
  293. package/dist/orchestration/workflow-park-decision.js +118 -0
  294. package/dist/org-delivery-gate.d.ts +81 -0
  295. package/dist/org-delivery-gate.js +59 -0
  296. package/dist/panel-tool-names.d.ts +23 -0
  297. package/dist/panel-tool-names.js +8 -0
  298. package/dist/parked-decide.d.ts +39 -6
  299. package/dist/parked-decide.js +98 -51
  300. package/dist/parked-revive-surface.d.ts +9 -2
  301. package/dist/parked-revive-surface.js +11 -8
  302. package/dist/per-task-image.d.ts +7 -1
  303. package/dist/per-task-image.js +3 -3
  304. package/dist/permission-rule-list.d.ts +1 -1
  305. package/dist/permission-rule-list.js +2 -2
  306. package/dist/plain-string-record.d.ts +25 -0
  307. package/dist/plain-string-record.js +32 -0
  308. package/dist/plugins/approval-ask-store-file.d.ts +16 -1
  309. package/dist/plugins/approval-ask-store-file.js +21 -0
  310. package/dist/plugins/approval-ask-store-memory.d.ts +18 -1
  311. package/dist/plugins/approval-ask-store-memory.js +34 -2
  312. package/dist/plugins/approval-ask-store-sql.d.ts +25 -0
  313. package/dist/plugins/approval-ask-store-sql.js +37 -1
  314. package/dist/plugins/blob-backend.d.ts +83 -15
  315. package/dist/plugins/blob-backend.js +68 -15
  316. package/dist/plugins/breaker-state-sql.d.ts +2 -2
  317. package/dist/plugins/breaker-state-sql.js +4 -4
  318. package/dist/plugins/caching-session-store.d.ts +3 -0
  319. package/dist/plugins/caching-session-store.js +3 -0
  320. package/dist/plugins/checkpoint-store-sql.d.ts +28 -4
  321. package/dist/plugins/checkpoint-store-sql.js +59 -28
  322. package/dist/plugins/file-history-store-sql.d.ts +5 -2
  323. package/dist/plugins/file-history-store-sql.js +3 -1
  324. package/dist/plugins/file-run-store.d.ts +5 -13
  325. package/dist/plugins/file-run-store.js +9 -0
  326. package/dist/plugins/fork-routing-session-store.d.ts +9 -1
  327. package/dist/plugins/fork-routing-session-store.js +12 -1
  328. package/dist/plugins/host-platform.d.ts +2 -0
  329. package/dist/plugins/host-platform.js +2 -1
  330. package/dist/plugins/k8s-bg-scripts.d.ts +11 -0
  331. package/dist/plugins/k8s-bg-scripts.js +22 -0
  332. package/dist/plugins/local-checkpoint-store.d.ts +2 -0
  333. package/dist/plugins/local-checkpoint-store.js +11 -3
  334. package/dist/plugins/local-session-store.d.ts +1 -1
  335. package/dist/plugins/local-session-store.js +1 -1
  336. package/dist/plugins/local-session-window.d.ts +39 -0
  337. package/dist/plugins/local-session-window.js +54 -0
  338. package/dist/plugins/mailbox-recipient-lifecycle.d.ts +3 -2
  339. package/dist/plugins/mailbox-store-sql.d.ts +30 -48
  340. package/dist/plugins/mailbox-store-sql.js +77 -52
  341. package/dist/plugins/memory-embedder-fingerprint.js +2 -1
  342. package/dist/plugins/memory-run-store.d.ts +5 -13
  343. package/dist/plugins/memory-run-store.js +8 -0
  344. package/dist/plugins/one-time-migrations.d.ts +245 -93
  345. package/dist/plugins/one-time-migrations.js +668 -207
  346. package/dist/plugins/org-delivery-quota-store.d.ts +123 -0
  347. package/dist/plugins/org-delivery-quota-store.js +228 -0
  348. package/dist/plugins/permission-rule-store-sql.d.ts +13 -7
  349. package/dist/plugins/permission-rule-store-sql.js +4 -18
  350. package/dist/plugins/pg-pool.js +39 -7
  351. package/dist/plugins/pg-session-storage.d.ts +20 -8
  352. package/dist/plugins/pg-session-storage.js +34 -21
  353. package/dist/plugins/remote-env-adb.d.ts +12 -12
  354. package/dist/plugins/remote-env-adb.js +21 -6
  355. package/dist/plugins/remote-env-device.js +3 -0
  356. package/dist/plugins/remote-env-e2b.d.ts +1 -1
  357. package/dist/plugins/remote-env-e2b.js +21 -9
  358. package/dist/plugins/remote-env-host.d.ts +9 -9
  359. package/dist/plugins/remote-env-host.js +10 -32
  360. package/dist/plugins/remote-env-k8s.d.ts +103 -38
  361. package/dist/plugins/remote-env-k8s.js +288 -95
  362. package/dist/plugins/remote-env-local-docker.d.ts +27 -13
  363. package/dist/plugins/remote-env-local-docker.js +82 -11
  364. package/dist/plugins/remote-env-ssh.d.ts +21 -12
  365. package/dist/plugins/remote-env-ssh.js +117 -5
  366. package/dist/plugins/remote-shell.d.ts +0 -1
  367. package/dist/plugins/remote-shell.js +1 -2
  368. package/dist/plugins/retention-store-sql.js +6 -2
  369. package/dist/plugins/run-store-sql.d.ts +16 -14
  370. package/dist/plugins/run-store-sql.js +22 -2
  371. package/dist/plugins/schema-consistency.d.ts +54 -0
  372. package/dist/plugins/schema-consistency.js +52 -0
  373. package/dist/plugins/schema-indexes.js +2 -0
  374. package/dist/plugins/send-user-file.js +2 -2
  375. package/dist/plugins/session-epoch-anchor.d.ts +39 -0
  376. package/dist/plugins/session-epoch-anchor.js +22 -0
  377. package/dist/plugins/session-store.d.ts +18 -8
  378. package/dist/plugins/session-store.js +15 -4
  379. package/dist/plugins/shared-memory-store-sql.d.ts +9 -3
  380. package/dist/plugins/shared-memory-store-sql.js +5 -16
  381. package/dist/plugins/sql-driver.d.ts +205 -1
  382. package/dist/plugins/sql-driver.js +325 -13
  383. package/dist/plugins/sql-errors.d.ts +64 -0
  384. package/dist/plugins/sql-errors.js +57 -0
  385. package/dist/plugins/store-backend.d.ts +36 -1
  386. package/dist/plugins/store-backend.js +42 -15
  387. package/dist/plugins/store-contracts.d.ts +42 -0
  388. package/dist/plugins/store-contracts.js +1 -0
  389. package/dist/plugins/tidb-pool.d.ts +6 -1
  390. package/dist/plugins/tidb-pool.js +44 -10
  391. package/dist/plugins/tidb-session-storage.d.ts +8 -11
  392. package/dist/plugins/tidb-session-storage.js +6 -16
  393. package/dist/plugins/tidb-session-store.d.ts +24 -4
  394. package/dist/plugins/tidb-session-store.js +29 -5
  395. package/dist/plugins/workflow-journal-store-sql.d.ts +73 -19
  396. package/dist/plugins/workflow-journal-store-sql.js +19 -6
  397. package/dist/plugins/workflow-run-store-sql.d.ts +30 -8
  398. package/dist/plugins/workflow-run-store-sql.js +50 -9
  399. package/dist/posture-source.d.ts +18 -10
  400. package/dist/posture-source.js +4 -1
  401. package/dist/project-identity.d.ts +45 -6
  402. package/dist/project-identity.js +162 -8
  403. package/dist/project-layer-key.d.ts +28 -0
  404. package/dist/project-layer-key.js +29 -0
  405. package/dist/prompts-domain-validate.d.ts +17 -61
  406. package/dist/prompts-domain-validate.js +9 -119
  407. package/dist/question.js +3 -2
  408. package/dist/read-deny-entry.d.ts +25 -0
  409. package/dist/read-deny-entry.js +12 -0
  410. package/dist/read-face-posture.d.ts +37 -11
  411. package/dist/read-face-posture.js +32 -3
  412. package/dist/request-key-closure.d.ts +9 -2
  413. package/dist/request-key-closure.js +11 -5
  414. package/dist/request-value-closure.d.ts +5 -0
  415. package/dist/request-value-closure.js +11 -3
  416. package/dist/rule-entry-list.d.ts +38 -11
  417. package/dist/rule-entry-list.js +106 -30
  418. package/dist/rules-consent.js +3 -4
  419. package/dist/run-acceptance.d.ts +19 -3
  420. package/dist/run-acceptance.js +13 -1
  421. package/dist/run-local.js +54 -24
  422. package/dist/runs.d.ts +15 -8
  423. package/dist/runs.js +35 -1
  424. package/dist/runtime-caps-resolver.d.ts +16 -6
  425. package/dist/runtime-caps-resolver.js +18 -5
  426. package/dist/sandbox-pkg-source.d.ts +19 -1
  427. package/dist/sandbox-pkg-source.js +29 -7
  428. package/dist/security.d.ts +87 -9
  429. package/dist/security.js +52 -9
  430. package/dist/server-secret-env.d.ts +44 -18
  431. package/dist/server-secret-env.js +49 -8
  432. package/dist/session-error-wire.d.ts +19 -2
  433. package/dist/session-error-wire.js +5 -1
  434. package/dist/session-incarnation.d.ts +15 -5
  435. package/dist/session-incarnation.js +16 -9
  436. package/dist/session-titled-frame.d.ts +33 -0
  437. package/dist/session-titled-frame.js +4 -0
  438. package/dist/session-titler.d.ts +9 -1
  439. package/dist/session-titler.js +27 -6
  440. package/dist/spec-fields.d.ts +28 -16
  441. package/dist/spec-fields.js +66 -54
  442. package/dist/sql-engine-posture.d.ts +31 -4
  443. package/dist/sql-engine-posture.js +36 -1
  444. package/dist/stored-request-tool-axes-m19.d.ts +19 -4
  445. package/dist/stored-request-tool-axes-m19.js +30 -2
  446. package/dist/task-a2a.d.ts +9 -1
  447. package/dist/task-a2a.js +73 -47
  448. package/dist/task-cwd.d.ts +1 -1
  449. package/dist/task-mcp.d.ts +46 -58
  450. package/dist/task-mcp.js +82 -107
  451. package/dist/task-settings.d.ts +95 -108
  452. package/dist/task-settings.js +77 -98
  453. package/dist/text-bidi.d.ts +1 -48
  454. package/dist/text-bidi.js +3 -5
  455. package/dist/tighten-only-seats.d.ts +150 -0
  456. package/dist/tighten-only-seats.js +196 -0
  457. package/dist/tool-approval.d.ts +304 -88
  458. package/dist/tool-approval.js +623 -239
  459. package/dist/trace/core-keyset-guard.d.ts +122 -20
  460. package/dist/trace/engine-notice-wire.d.ts +11 -3
  461. package/dist/trace/engine-notice-wire.js +8 -1
  462. package/dist/trace/exit-seat.d.ts +28 -0
  463. package/dist/trace/exit-seat.js +76 -0
  464. package/dist/trace/ledger-events.d.ts +6 -3
  465. package/dist/trace/ledger-sink.js +4 -1
  466. package/dist/trace/model-segment.js +1 -1
  467. package/dist/trace/project.d.ts +98 -17
  468. package/dist/trace/project.js +98 -50
  469. package/dist/trace/projection-table.d.ts +100 -0
  470. package/dist/trace/projection-table.js +130 -0
  471. package/dist/trace/redact.d.ts +54 -0
  472. package/dist/trace/redact.js +778 -152
  473. package/dist/trace/self-minted-wire.d.ts +345 -1
  474. package/dist/trace/self-minted-wire.js +117 -1
  475. package/dist/trace/wire-projection-faces.d.ts +377 -3
  476. package/dist/trace/wire-projection-faces.js +164 -1
  477. package/dist/url-refusal.js +2 -0
  478. package/dist/web-admin-client/apply-effective.d.ts +12 -0
  479. package/dist/web-admin-client/apply-effective.js +56 -5
  480. package/dist/web-admin-client/candidate-gate.d.ts +6 -6
  481. package/dist/web-admin-client/candidate-gate.js +3 -3
  482. package/dist/web-admin-client/facade.d.ts +1 -1
  483. package/dist/web-admin-client/facade.js +1 -1
  484. package/dist/web-admin-client/http-client.js +0 -6
  485. package/dist/web-admin-client/read-face.js +5 -9
  486. package/dist/web-admin-client/read-warnings.d.ts +13 -0
  487. package/dist/web-admin-client/read-warnings.js +10 -0
  488. package/dist/web-admin-client/skills-mcp.d.ts +3 -0
  489. package/dist/web-admin-client/skills-mcp.js +11 -9
  490. package/dist/web-admin-client/types.d.ts +2 -3
  491. package/dist/workspace-cache.d.ts +35 -0
  492. package/dist/workspace-cache.js +36 -0
  493. package/dist/workspace-space.d.ts +3 -2
  494. package/dist/workspace-space.js +2 -0
  495. package/docs/DEVICE-EXECUTOR-PROTOCOL.md +65 -10
  496. package/package.json +8 -4
  497. package/scripts/drain-check-local.mjs +34 -1
  498. package/scripts/drain-check.mysql.sql +30 -2
  499. package/scripts/drain-check.pg.sql +29 -2
  500. package/dist/capabilities/memory-notice.d.ts +0 -138
  501. package/dist/capabilities/memory-notice.js +0 -64
  502. package/dist/capabilities/prompt.d.ts +0 -17
  503. package/dist/capabilities/prompt.js +0 -6
  504. package/dist/mcp-content-origin.d.ts +0 -34
  505. package/dist/mcp-content-origin.js +0 -10
  506. package/dist/tool-axis-words.d.ts +0 -27
  507. package/dist/tool-axis-words.js +0 -9
  508. package/dist/wire-name-bound.d.ts +0 -14
  509. package/dist/wire-name-bound.js +0 -13
@@ -77,20 +77,52 @@ export declare function modelBrainLane(provider: ModelProvider): ModelBrainLane;
77
77
  */
78
78
  export declare function catalogBrainLane(provider: string | undefined): ModelBrainLane;
79
79
  /**
80
- * 🔴 S-623 —— 一条目录条目在**本部署**上真正落哪条 brain 腿(= `createBrain` 的组装事实,不是词面)。
80
+ * 🔴 **本部署装上的路由表的唯一铸法**(core 7.53.0 #1842;S-623 的「词 ∧ 路由装上」合取由此收成「问表」)。
81
81
  *
82
- * `createBrain` 只在 anthropic 路由**装上**(`ANTHROPIC_API_KEY` / `ANTHROPIC_AUTH_TOKEN` 在场 ⇒
83
- * `config.anthropic` 在场)时才铸 `createRoutingBrain({anthropic}, {fallback: gatewayStack})`;没装时整台机器
84
- * 只有网关栈这一只 brain,**一切**条目(包括 `provider:"anthropic"` 的)都落 openai 兼容腿 ——
85
- * `apply-effective.ts` 那条 `web_admin_model_no_brain` warn 说的「mis-routes to the gateway brain」即此。
82
+ * 键 = `createRoutingBrain` 选线读的那个词(`model.provider`),值 = 那条路由上的东西 —— `createBrain` 铸 brain 交给路由器,判词侧(启动摘要、端点判官、
83
+ * hook 选线)铸路由自己的配置交给 {@link brainLaneFor}(core 的判官从不读值,只问 `Object.hasOwn(routes, word)`)。两侧走同一只函数 ⇒ 同一组键,
84
+ * 「哪条路由装上了」只有这里一处写法。
86
85
  *
87
- * 所以「这条路由要不要一个 openai 端点」的判据必须同时看词与装配:词判 {@link catalogBrainLane},
88
- * 装配判路由在不在。本函数是这一合取的**唯一**写法 —— 端点判官(`model-route-endpoint.ts`)、降级腿与
89
- * 启动摘要(`brain.ts`)都调它,不再各写一个 `=== "anthropic" && config.anthropic`。
86
+ * `anthropic` 键在场 ⇔ anthropic 路由装上(`ANTHROPIC_API_KEY` / `ANTHROPIC_AUTH_TOKEN` 在场 ⇒ `config.anthropic` 在场);没装时**键缺席**,
87
+ * 绝不写成 `{ anthropic: undefined }` —— core 7.53.0 起「装上的键而值不是 brain」是一条坏线路(该请求 error terminal),不再回落网关
88
+ * (core CHANGELOG #1842「the key must be absent, not `undefined`」)。视图上 `anthropic` 的自有键带 `undefined`(配置对象的形)照样读成没装。
89
+ */
90
+ export declare function mountRoutes<R extends object, T>(view: {
91
+ readonly anthropic?: R | undefined;
92
+ }, mount: (route: R) => T): Readonly<Record<string, T>>;
93
+ /**
94
+ * 🔴 **anthropic 路由的请求根** —— 唯一读法(S-1655 / core 7.53.0 #1905)。声明了 `ANTHROPIC_BASE_URL` ⇒ 它;没声明 ⇒ core 包根导出的 `ANTHROPIC_DEFAULT_BASE_URL`
95
+ * (引擎的 Anthropic brain 的请求根与配对律的车道缺省、`fable5Model` 预设的 `baseUrl` 读的同一只常量)。「没声明」按引擎的读法:缺席、空串、纯空白都是没声明
96
+ * (core 原话:「nothing, an empty string and whitespace read as undeclared」)。修前本仓两处手抄字面量:主路由的声明根(`brain.ts`,`??`)与 hook 的 anthropic 腿根
97
+ * (`hooks/hook-llm.ts`,`||`)—— 一个根、两份拷贝、两种合取。
98
+ */
99
+ export declare function anthropicRouteRoot(route: {
100
+ readonly baseUrl?: string | undefined;
101
+ }): string;
102
+ /**
103
+ * **请求根「算不算声明了」的唯一尺**:缺席、空串、纯空白都是没声明(core 原话 "nothing, an empty string and whitespace read as undeclared"),声明了就原样带回。
104
+ * anthropic 路由的请求根({@link anthropicRouteRoot})、openai 兼容路由的有效端点(`model-route-endpoint.ts` 的 `openaiRouteBaseUrl`)与 env 值级端口的 `endpointDeclared` 读同一只。
105
+ */
106
+ export declare function declaredRootUrl(url: string | undefined): string | undefined;
107
+ /** 判词侧的路由表:值 = 路由自己的配置({@link mountRoutes} 的恒等铸法 —— 判官不读值,只问键)。 */
108
+ export declare function routeTableOf<R extends object>(view: {
109
+ readonly anthropic?: R | undefined;
110
+ }): Readonly<Record<string, R>>;
111
+ /**
112
+ * 🔴 **一条目录条目在本部署上真正落哪条 brain 腿**(= 引擎路由器对同一只表的答案,不是词面)—— 唯一判词。
113
+ *
114
+ * 判据是 core 包根导出的 `brainLaneOf({ provider }, routes)`(core 7.53.0 #1842):`createRoutingBrain` 对每个请求问的正是它,所以引擎主路由与本仓的
115
+ * 四处调用点(主路由降级腿与启动摘要在 `brain.ts`、端点判官 `model-route-endpoint.ts`、hook 选线 `hooks/hook-llm.ts`)读**一个**答案。修前本仓自写一只
116
+ * 合取 `dispatchBrainLane(provider, anthropicRouteMounted)`(`catalogBrainLane(provider) === "anthropic" ∧ 路由装上`)—— 两份写法,S-1630 那次真病
117
+ * (hook 面按词面判线、主路由按装配判线)就是两份写法分叉的样子。
118
+ *
119
+ * core 的答案是路由名或 `undefined`(网关 fallback 服务它:词下没装路由,或没有 string 词)。本部署只装 `anthropic` 一条路由(表的唯一铸法 {@link mountRoutes}),
120
+ * 所以答案映到本仓两词闭集:`"anthropic"` ⇒ anthropic 腿,`undefined` ⇒ 网关腿;别的名字结构上不可能(表里没有那个键),真撞上 ⇒ **响亮抛**([ref]:运行期
121
+ * miss 臂必须说出来,不静默折网关)。
90
122
  *
91
- * 🔴 S-704(7.101.0):**目录条目**已到不了「anthropic 词、路由没装」这一格 —— 模型面 stage 的逐条判据把它判成不可用
92
- * (`config.model_no_brain`,不进 `config.models`)。这一格今天只剩 **env 腿**:`MODEL_PROVIDER=anthropic` 而没配 anthropic
93
- * 凭据的部署,env 模型落网关腿、用的是网关自己的 `MODEL_API_KEY`(凭据与端点同属网关,不越界;是否也该拒启另车)。
123
+ * S-704(7.101.0):**目录条目**到不了「anthropic 词、路由没装」这一格 —— 模型面 stage 的逐条判据把它判成不可用(`config.model_no_brain`,那一判问的是
124
+ * 「词想要的腿装没装」,{@link catalogBrainLane},与本判词是两个问题)。这一格今天只剩 **env 腿**:`MODEL_PROVIDER=anthropic` 而没配 anthropic 凭据的部署,
125
+ * env 模型落网关腿、用的是网关自己的 `MODEL_API_KEY`(凭据与端点同属网关,不越界)。
94
126
  */
95
- export declare function dispatchBrainLane(provider: string | undefined, anthropicRouteMounted: boolean): ModelBrainLane;
127
+ export declare function brainLaneFor(provider: string | undefined, routes: Readonly<Record<string, unknown>>): ModelBrainLane;
96
128
  //# sourceMappingURL=model-provider.d.ts.map
@@ -1,3 +1,4 @@
1
+ import { ANTHROPIC_DEFAULT_BASE_URL, brainLaneOf } from "@sema-agent/core";
1
2
  export const MODEL_PROVIDER_WORDS = ["gateway", "vllm", "anthropic"];
2
3
  export function isModelProvider(word) {
3
4
  return word !== undefined && MODEL_PROVIDER_WORDS.includes(word);
@@ -23,7 +24,25 @@ export function modelBrainLane(provider) {
23
24
  export function catalogBrainLane(provider) {
24
25
  return isModelProvider(provider) ? modelBrainLane(provider) : "gateway";
25
26
  }
26
- export function dispatchBrainLane(provider, anthropicRouteMounted) {
27
- return anthropicRouteMounted && catalogBrainLane(provider) === "anthropic" ? "anthropic" : "gateway";
27
+ export function mountRoutes(view, mount) {
28
+ const route = view.anthropic;
29
+ return route !== undefined ? { anthropic: mount(route) } : {};
30
+ }
31
+ export function anthropicRouteRoot(route) {
32
+ return declaredRootUrl(route.baseUrl) ?? ANTHROPIC_DEFAULT_BASE_URL;
33
+ }
34
+ export function declaredRootUrl(url) {
35
+ return url !== undefined && url.trim() !== "" ? url : undefined;
36
+ }
37
+ export function routeTableOf(view) {
38
+ return mountRoutes(view, (route) => route);
39
+ }
40
+ export function brainLaneFor(provider, routes) {
41
+ const line = brainLaneOf({ provider }, routes);
42
+ if (line === undefined)
43
+ return "gateway";
44
+ if (line === "anthropic")
45
+ return "anthropic";
46
+ throw new Error(`brainLaneFor: the engine's route judge answered route "${line}", which this deployment never mounts (the route table holds only the anthropic route) — the table was built outside mountRoutes`);
28
47
  }
29
48
  //# sourceMappingURL=model-provider.js.map
@@ -20,8 +20,8 @@
20
20
  * 经 {@link judgeServedModelRoute}:目录被采纳 ⇒ 判目录表(目录视图),目录缺席 / 被整拒 / 没有启用条目 ⇒ 判 env 表(env 视图);
21
21
  * 严格名册布防(`isRosterGateArmed`)时 env 表是占位、从不被派发 ⇒ 不判它(备用网关那一条与表无关,照判)。
22
22
  * 不在 `loadConfig()`:那是目录应用**之前**,env 表还不知道会不会服务(目录一旦采纳就整张换掉它);
23
- * · 包根导出的 `judgeModelRouteGap(env)`(`model-route-gap.ts`)问的是**env 腿**:「这份 env 交给引擎、没有目录时起不起得来」—— 同一只判据的 env 视图,
24
- * 目录在场时起服以目录为准;
23
+ * · 壳 / 包问「这台引擎服务哪张表、起服判官怎么说」读 `GET /v1/models` 的 `modelPlane`(`model-plane-face.ts`,同一只 {@link judgeServedModelRoute});
24
+ * 起服前没有「将要服务的表」可判,所以没有起服前的预判口;
25
25
  * · 热路径:`web-admin-client/apply-effective.ts` 的模型面 stage ⇒ 模型面组拒(opus 腿 O3:同候选其余组照落)、上一代模型面继续服务(目录视图);
26
26
  * · run-local:配置源解析完之后按真要派发的表判(`run-local.ts`)—— 本入口没有名册门,不豁免占位;
27
27
  * · 登记:`config-invariants.ts` 的 `model-route-endpoint` 条(表的「不许有表外不变量」职责);
@@ -43,22 +43,19 @@ export declare const MODEL_ROUTE_ENDPOINT_MISSING_CODE = "config.model_route_end
43
43
  /** 同族第二码:备用网关设了、主网关没设。与上一码分开是因为出路不同(补主网关 / 撤备用 vs 补主网关 / 给条目 baseUrl)。 */
44
44
  export declare const GATEWAY_FALLBACK_WITHOUT_PRIMARY_CODE = "config.gateway_fallback_without_primary";
45
45
  /**
46
- * **路由缺口的出路轴**(闭集;{@link judgeModelRouteGap} 的 `gap` 词,包根导出 —— 壳 / 包在引擎起来之前问同一句)。
46
+ * **路由缺口的出路轴**(闭集;`GET /v1/models.modelPlane.gap` 的词,包根导出其型)。**只有缺口两词** —— 通过 = 判决为 `undefined`(没有第三个词可说「无缺口」)。
47
47
  *
48
48
  * 与上面的**码**是两根轴:码是组拒的机读词(`ModelPlaneRefusalCode`,settings-schema 属主),这里是**出路**:
49
49
  * · `endpoint_missing` —— 缺的是网关端点:openai 兼容腿上的条目解析不到 base URL(或备用网关设了、主网关没设);
50
50
  * 出路 = 设 `MODEL_GATEWAY_BASEURL`,或(目录视图)给条目自己的 `baseUrl` / (env 视图)挂 anthropic 路由、或不设 `MODEL_ID` 让目录缺省服务;
51
51
  * · `lane_credential_missing` —— 缺的是**车道凭据**:条目的 provider 词是 `anthropic`(用户选的是 anthropic 车道),
52
52
  * 却因 `ANTHROPIC_API_KEY` / `ANTHROPIC_AUTH_TOKEN` 都没有而没装上 anthropic 路由、落进了 openai 腿,那条腿又没有端点;
53
- * 出路 = 补那两把钥匙之一(设网关是另一条出路,拒因句一并给);
54
- * · `none` —— 这份配置能派发到的每一条 openai 兼容路由都解析得到端点。
53
+ * 出路 = 补那两把钥匙之一(设网关是另一条出路,拒因句一并给)。
55
54
  *
56
- * **声明序 = 语义序**(缺口两词在前,`none` 最后);加一词 ⇒ 所有穷举 switch 当场编译红。
55
+ * **声明序 = 语义序**;加一词 ⇒ 所有穷举 switch 当场编译红。
57
56
  */
58
- export declare const MODEL_ROUTE_GAP_WORDS: readonly ["endpoint_missing", "lane_credential_missing", "none"];
57
+ export declare const MODEL_ROUTE_GAP_WORDS: readonly ["endpoint_missing", "lane_credential_missing"];
59
58
  export type ModelRouteGap = (typeof MODEL_ROUTE_GAP_WORDS)[number];
60
- /** 有缺口的那两词(判决的结构化形只在有缺口时存在,`none` = 判决为 `undefined`)。 */
61
- export type ModelRouteGapBreach = Exclude<ModelRouteGap, "none">;
62
59
  /**
63
60
  * 拒因给出的**本机网关显式写法**。`src/` 里本机 8000 那个字面的**唯一**住处 —— 源码门钉在
64
61
  * `test/config-gateway-endpoint-required.test.ts` ⑧(出现在别处 = 有人又在铸缺省)。
@@ -97,7 +94,7 @@ export interface ModelRouteEndpointView {
97
94
  *
98
95
  * 判序即语义:
99
96
  * ① 备用网关设了、主网关没设 ⇒ `config.gateway_fallback_without_primary`(备用是主的镜像,这一条与条目无关,先说);
100
- * ② 逐条目:按 {@link dispatchBrainLane} 落 openai 腿、且 {@link openaiRouteBaseUrl} 解析不到 ⇒ 收集名字,
97
+ * ② 逐条目:按 {@link brainLaneFor}(引擎路由器对本部署路由表的答案)落 openai 腿、且 {@link openaiRouteBaseUrl} 解析不到 ⇒ 收集名字,
101
98
  * 一句话**全部点名**(运维一次改完,而不是改一个撞下一个)。
102
99
  *
103
100
  * `default` 键是目录里另一条的别名(env 腿 `{default: m, [m.id]: m}`、center 腿 `models.default = models[picked]`),
@@ -107,8 +104,8 @@ export declare function modelRouteEndpointRefusal(view: ModelRouteEndpointView,
107
104
  /** S-768:部署级判决的结构化形 —— 码与拒因句由**同一次**判决给出(一个不变量 id 两个码,组拒码在判决那刻当数据带出,不从句子里抠)。 */
108
105
  export interface ModelRouteEndpointVerdict {
109
106
  readonly code: typeof GATEWAY_FALLBACK_WITHOUT_PRIMARY_CODE | typeof MODEL_ROUTE_ENDPOINT_MISSING_CODE;
110
- /** 出路轴({@link MODEL_ROUTE_GAP_WORDS} 的缺口两词):同一次判决给出,不从句子或码里反推(`lane_credential_missing` 与 `endpoint_missing` 共用一个码)。 */
111
- readonly gap: ModelRouteGapBreach;
107
+ /** 出路轴({@link MODEL_ROUTE_GAP_WORDS}):同一次判决给出,不从句子或码里反推(`lane_credential_missing` 与 `endpoint_missing` 共用一个码)。 */
108
+ readonly gap: ModelRouteGap;
112
109
  readonly reason: string;
113
110
  }
114
111
  /**
@@ -1,17 +1,14 @@
1
- import { dispatchBrainLane } from "./model-provider.js";
1
+ import { brainLaneFor, catalogBrainLane, declaredRootUrl, routeTableOf } from "./model-provider.js";
2
2
  import { DEFAULT_MODEL_REF, servedModelTableLeg } from "./model-select.js";
3
3
  export const MODEL_ROUTE_ENDPOINT_MISSING_CODE = "config.model_route_endpoint_missing";
4
4
  export const GATEWAY_FALLBACK_WITHOUT_PRIMARY_CODE = "config.gateway_fallback_without_primary";
5
- export const MODEL_ROUTE_GAP_WORDS = ["endpoint_missing", "lane_credential_missing", "none"];
5
+ export const MODEL_ROUTE_GAP_WORDS = ["endpoint_missing", "lane_credential_missing"];
6
6
  export const LOCAL_GATEWAY_HINT = "MODEL_GATEWAY_BASEURL=http://127.0.0.1:8000/v1";
7
- function declared(url) {
8
- return url !== undefined && url.trim() !== "" ? url : undefined;
9
- }
10
7
  export function openaiRouteBaseUrl(routeBaseUrl, gatewayBaseUrl) {
11
- return declared(routeBaseUrl) ?? declared(gatewayBaseUrl);
8
+ return declaredRootUrl(routeBaseUrl) ?? declaredRootUrl(gatewayBaseUrl);
12
9
  }
13
10
  function unresolvedRouteLabel(name, provider) {
14
- return provider === "anthropic"
11
+ return catalogBrainLane(provider) === "anthropic"
15
12
  ? `"${name}" (provider "anthropic", but no Anthropic route is mounted — ANTHROPIC_API_KEY / ANTHROPIC_AUTH_TOKEN are unset — so it falls to the openai-compatible lane)`
16
13
  : `"${name}"`;
17
14
  }
@@ -23,7 +20,7 @@ export function modelRouteEndpointRefusal(view, leg) {
23
20
  return judgeModelRouteEndpoint(view, leg)?.reason;
24
21
  }
25
22
  export function judgeModelRouteEndpoint(view, leg) {
26
- const gateway = declared(view.gatewayBaseUrl);
23
+ const gateway = declaredRootUrl(view.gatewayBaseUrl);
27
24
  if (gateway === undefined && view.gatewayFallbackUrls.length > 0) {
28
25
  const reason = (`env MODEL_GATEWAY_FALLBACK_URLS is set but MODEL_GATEWAY_BASEURL is not [${GATEWAY_FALLBACK_WITHOUT_PRIMARY_CODE}] — ` +
29
26
  "the fallback URLs are mirrors of the primary gateway (same provider, same account, same key scope), tried only " +
@@ -32,18 +29,18 @@ export function judgeModelRouteEndpoint(view, leg) {
32
29
  "or unset MODEL_GATEWAY_FALLBACK_URLS.");
33
30
  return { code: GATEWAY_FALLBACK_WITHOUT_PRIMARY_CODE, gap: "endpoint_missing", reason };
34
31
  }
35
- const anthropicMounted = view.anthropic !== undefined;
32
+ const routes = routeTableOf(view);
36
33
  const entries = Object.entries(view.models ?? {});
37
34
  const unresolved = [];
38
35
  let laneCredentialMissing = false;
39
36
  for (const [name, m] of entries) {
40
37
  if (name === DEFAULT_MODEL_REF && entries.some(([k, other]) => k !== name && other === m))
41
38
  continue;
42
- if (dispatchBrainLane(m.provider, anthropicMounted) !== "gateway")
39
+ if (brainLaneFor(m.provider, routes) !== "gateway")
43
40
  continue;
44
41
  if (openaiRouteBaseUrl(m.baseUrl, gateway) !== undefined)
45
42
  continue;
46
- laneCredentialMissing ||= m.provider === "anthropic";
43
+ laneCredentialMissing ||= catalogBrainLane(m.provider) === "anthropic";
47
44
  unresolved.push(unresolvedRouteLabel(name, m.provider));
48
45
  }
49
46
  if (unresolved.length === 0)
@@ -0,0 +1,22 @@
1
+ /**
2
+ * `@sema-agent/server/model-route-env` —— 模型路由 env 读法的**精选入口**(纯数据 + 纯函数;import 不写文件、不起句柄、不装监听器、不出声 —— 依赖的包在装载时读自己的环境变量不在此列)。
3
+ *
4
+ * 为什么有这只文件:引擎(core)是 BYOM —— 它只吃调用方交的路由表与 `baseUrl` / `apiKey`,从不读 `MODEL_*` / `ANTHROPIC_*` 这些 env 键。
5
+ * 「env 里哪几把键是模型路由、空串算不算设了、provider 怎么推断、这只模型走哪条车道、这条车道的端点 / 凭据取哪一对键」的读法属本服务,
6
+ * 在引擎起之前就要答这句话的调用方(壳首启、客户端运行时、sdk 转口)读这一只,不各抄一份键名与车道判。
7
+ *
8
+ * 为什么是子路径而不是包根:包根的依赖闭包是整台服务(存储、HTTP、沙箱……),这里只需要一张键表和几只纯函数;
9
+ * 值依赖仅 `@sema-agent/core`(车道判词)与 `@sema-agent/settings-schema`,仓内只有四只纯叶(`test/model-route-env-port.test.ts` 钉死)。
10
+ *
11
+ * 为什么是精选而不是把 `model-route-gap.ts` 整只暴露:那个模块里还有起服自己的读法助手(逗号串分词、cheap 槽铸 id)。把它们变成公开面,等于替实现细节背上 semver。
12
+ * 要加名字 = 改这只文件 + 同批改 `test/model-route-env-port.test.ts` 的闭集(新增公开面必须是一次有意的动作)。
13
+ *
14
+ * · `MODEL_ROUTE_ENV_KEYS` —— 九把路由 env 键的闭表(字段名 → 键名);
15
+ * · `readModelRouteEnv(env)` —— 读口:`env` 交整张 `Record<string, string | undefined>`(`process.env` 或等价快照),只按表点名取值;
16
+ * · `envLaneTable(mainId, main, cheap)` —— env 腿的条目表(别名 `default` + 主槽 id + cheap 槽 id);
17
+ * · `laneAndEndpointFor(env, model, routes)` —— 值级端口:车道 + 端点 / 凭据的键名(不含任何 env 值)。
18
+ */
19
+ export { MODEL_ROUTE_ENV_KEYS, readModelRouteEnv, envLaneTable, laneAndEndpointFor } from "./model-route-gap.js";
20
+ export type { EnvCheapSlot, LaneAndEndpoint, ModelRouteEnv, ModelRouteEnvName, ModelRouteEnvReading, ModelRouteSubject } from "./model-route-gap.js";
21
+ export type { ModelBrainLane } from "./model-provider.js";
22
+ //# sourceMappingURL=model-route-env.d.ts.map
@@ -0,0 +1,2 @@
1
+ export { MODEL_ROUTE_ENV_KEYS, readModelRouteEnv, envLaneTable, laneAndEndpointFor } from "./model-route-gap.js";
2
+ //# sourceMappingURL=model-route-env.js.map
@@ -1,11 +1,33 @@
1
- import { type ModelRouteEndpointVerdict, type ModelRouteGapBreach } from "./model-route-endpoint.js";
2
1
  /**
3
- * 路由读数读的八把 env 键(**闭表**;`judgeModelRouteGap` 只碰这几把,测试用代理钉「读集 ⊆ 本表」)。
4
- * 配置目录的 D1 对账门把 {@link readModelRouteEnv} 的调用当作这八把键的读点(`test/config-catalog.test.ts` 的 `DELEGATED_ENV_READERS`,键集取本表,不手抄)。
2
+ * **env 模型路由读数的唯一读口**:`readModelRouteEnv(env)`、env 腿的条目表 `envLaneTable`,与车道值级端口 `laneAndEndpointFor`。
3
+ *
4
+ * ## 形(一只读口、一处调用)
5
+ * 「env 里哪几把键是模型路由、空串 = 未设、provider 的显式 / 推断 / 缺省、env 腿铸哪几个条目槽」的读法只在这里:
6
+ * · {@link readModelRouteEnv}:`parseModelDomain`(`config.ts`,起服铸 `ServiceConfig` 的路由字段)吃它的读数(`process.env` 与测试快照是同一个入参位);
7
+ * · {@link envLaneTable}:env 腿的条目名与键序(`parseModelDomain` 铸真 `Model` 表经它);
8
+ * · {@link laneAndEndpointFor}:值级端口 —— 「这只模型在这张路由表上走哪条车道、这条车道的端点 / 凭据取哪一对 env 键」。车道只经 `brainLaneFor`
9
+ * (core `brainLaneOf` 对路由表的答案)取,键名取 {@link MODEL_ROUTE_ENV_KEYS};**只交键名不交值**。
10
+ * 路由判据本身(「将要服务的那张表里每条 openai 兼容路由是否解析得到端点」)不在这里:唯一属主是 `model-route-endpoint.ts` 的 `judgeModelRouteEndpoint`,
11
+ * 起服段与 `GET /v1/models.modelPlane` 经 `judgeServedModelRoute` 问它 —— 它们判的是**将要服务的那张表**(env 表或目录表),不是本文件读出的 env 视图。
12
+ *
13
+ * ## 对外
14
+ * 本模块的精选再导出是子路径 `@sema-agent/server/model-route-env`(`src/model-route-env.ts`):引擎 core 是 BYOM(只吃调用方给的路由表,不读这些键),
15
+ * 别仓要在引擎起之前回答「走哪条车道、端点 / 凭据取哪一对键」,读这一只,不各抄一份键名与车道判。
16
+ *
17
+ * ## 纯
18
+ * 不读 `process.env`、不读文件、不枚举快照 —— 只按 {@link MODEL_ROUTE_ENV_KEYS} 点名取值(依赖闭包里没有 `node:*` / `process`,
19
+ * `test/model-route-env-reading.test.ts` 钉)。同入同出;返回值是新对象。provider 词域外的值在这里按引擎派发的口径读作网关腿(`brainLaneFor`:域外词的路由表里没有那个键 ⇒ 引擎路由器落网关 fallback),不在此拒(域外拒启是 `model-provider-word` 那条不变量的事)。
20
+ */
21
+ import { type ModelBrainLane } from "./model-provider.js";
22
+ /**
23
+ * 路由读数读的九把 env 键(**闭表**;{@link readModelRouteEnv} 只碰这几把,测试用代理钉「读集 ⊆ 本表」)。
24
+ * 配置目录的 D1 对账门把 {@link readModelRouteEnv} 的调用当作这九把键的读点(`test/config-catalog.test.ts` 的 `DELEGATED_ENV_READERS`,键集取本表,不手抄);
25
+ * 表与配置目录的 `modelPlane` 域同源(`test/model-route-env-port.test.ts` 对拍:表里每把键是目录的一行、目录里该域的端点 / 凭据行都在表里)。
5
26
  */
6
27
  export declare const MODEL_ROUTE_ENV_KEYS: {
7
28
  readonly gatewayBaseUrl: "MODEL_GATEWAY_BASEURL";
8
29
  readonly gatewayFallbackUrls: "MODEL_GATEWAY_FALLBACK_URLS";
30
+ readonly gatewayApiKey: "MODEL_API_KEY";
9
31
  readonly provider: "MODEL_PROVIDER";
10
32
  readonly mainId: "MODEL_ID";
11
33
  readonly cheapId: "MODEL_CHEAP_ID";
@@ -36,6 +58,12 @@ export interface ModelRouteEnvReading {
36
58
  readonly gatewayBaseUrl: string | undefined;
37
59
  /** `MODEL_GATEWAY_FALLBACK_URLS` 逐项 trim、丢空项。 */
38
60
  readonly gatewayFallbackUrls: string[];
61
+ /**
62
+ * `MODEL_API_KEY`(网关腿的部署级凭据):**原样**读 —— 与其余各把不同,空串**不**折成未设。brain 装配以**真值**判这把凭据发不发(空串部署一个凭据字节都不发),
63
+ * 起服铸的 `ServiceConfig.gatewayApiKey` 逐字保留空串(compose 的 `${VAR:-}` 模板与空 Secret 挂载天天产它);读数改折叠会改变那一位。
64
+ * 它只与网关端点配对(没有 {@link gatewayBaseUrl} 就不装载),配对由消费方判。
65
+ */
66
+ readonly gatewayApiKey: string | undefined;
39
67
  /** `ANTHROPIC_API_KEY` / `ANTHROPIC_AUTH_TOKEN` / `ANTHROPIC_BASE_URL`:空串 = 未设,别名各自独立(一个空别名不遮蔽另一个)。 */
40
68
  readonly anthropicApiKey: string | undefined;
41
69
  readonly anthropicAuthToken: string | undefined;
@@ -59,7 +87,7 @@ export interface ModelRouteEnvReading {
59
87
  export declare const csvOf: (raw: string | undefined) => string[];
60
88
  /**
61
89
  * **env 模型路由读数的唯一读口**(纯:按 {@link MODEL_ROUTE_ENV_KEYS} 点名取值,不读 `process.env`,不枚举入参)。
62
- * `parseModelDomain`(起服铸 `ServiceConfig`)与 {@link judgeModelRouteGap}(判官)吃同一份读数。
90
+ * `parseModelDomain`(起服铸 `ServiceConfig`)吃它的读数。
63
91
  */
64
92
  export declare function readModelRouteEnv(env: ModelRouteEnv): ModelRouteEnvReading;
65
93
  /**
@@ -69,36 +97,38 @@ export declare function readModelRouteEnv(env: ModelRouteEnv): ModelRouteEnvRead
69
97
  export declare function envLaneTable<M extends {
70
98
  readonly id: string;
71
99
  }>(mainId: string, main: M, cheap: M | undefined): Record<string, M>;
72
- /** {@link judgeModelRouteGap} 的旁路入参。 */
73
- export interface ModelRouteGapOptions {
100
+ /** 键表里的一把 env 键的名字(闭集字面量并集:加键 / 改名 ⇒ 消费方的穷举处编译红)。 */
101
+ export type ModelRouteEnvName = (typeof MODEL_ROUTE_ENV_KEYS)[keyof typeof MODEL_ROUTE_ENV_KEYS];
102
+ /** {@link laneAndEndpointFor} 问的那只模型:只读它的 route 词 `provider`(`Model` / 目录条目 / `{ provider }` 都结构满足)。 */
103
+ export interface ModelRouteSubject {
104
+ readonly provider?: string | undefined;
105
+ }
106
+ /** {@link laneAndEndpointFor} 的答案:**键名**与在场性,不含任何 env 值。 */
107
+ export interface LaneAndEndpoint {
108
+ /** 这只模型在这张路由表上落哪条 brain 腿(引擎路由器对同一只表的答案)。 */
109
+ readonly lane: ModelBrainLane;
110
+ /** 这条腿的端点那把 env 键:网关腿 `MODEL_GATEWAY_BASEURL`、anthropic 腿 `ANTHROPIC_BASE_URL`。值由调用方自己从 env 取。 */
111
+ readonly endpointEnvName: ModelRouteEnvName;
112
+ /**
113
+ * 这把端点键在 env 里声明了吗(缺席 / 空串 / 纯空白都是未设 —— 与引擎装配选请求根是同一把尺)。网关腿**没有出厂缺省端点**:未声明 = 这条腿此刻没有端点;
114
+ * anthropic 腿未声明 = 请求根落引擎的 Anthropic 官方缺省根。
115
+ */
116
+ readonly endpointDeclared: boolean;
74
117
  /**
75
- * env 腿的模型会不会被派发(缺省 `true`)。起服期严格名册布防(`CONFIG_REQUIRE_ROSTER=true` 且接了远程中心、非 dryRun)= 运维声明 env
76
- * `MODEL_ID` 是**占位**:名册落地前计费提交 503、落地后整表换装 ⇒ env 腿从不被派发,不在「配置能派发到的」射程里(备用网关那一条与派发
77
- * 无关,照判)。布防与否是中心接入的事实(不是路由键),快照读不出 ⇒ 由调用方给;壳问「本机引擎、配置在本机」那一形不用传。
118
+ * 这条腿此刻真会带上的凭据那把 env 键;没有会装载的凭据 ⇒ `undefined`。
119
+ * · anthropic 腿:`ANTHROPIC_AUTH_TOKEN` 压过 `ANTHROPIC_API_KEY`(引擎装配同序),空串别名不遮蔽另一把;
120
+ * · 网关腿:`MODEL_API_KEY`,**只在端点声明时**(凭据只与网关自己的根配对;没有网关就不装载),空串 = 没有凭据(keyless 部署)。
78
121
  */
79
- readonly envLaneDispatchable?: boolean;
122
+ readonly apiKeyEnvName: ModelRouteEnvName | undefined;
80
123
  }
81
124
  /**
82
- * 判官的读数(闭集三词,穷举 switch 消费):
83
- * · `none` —— 无缺口,仅此一键;
84
- * · 缺口两词 —— `code` = 机读码(与 `reason` 里的方括号码同一个词;`lane_credential_missing` 也带 `config.model_route_endpoint_missing`),
85
- * `reason` = 起服判官对 env 表拒启时的句子原文(env 视图:点名条目与三条 env 出路)。
86
- */
87
- export type ModelRouteGapReading = {
88
- readonly gap: "none";
89
- } | {
90
- [G in ModelRouteGapBreach]: {
91
- readonly gap: G;
92
- readonly code: ModelRouteEndpointVerdict["code"];
93
- readonly reason: string;
94
- };
95
- }[ModelRouteGapBreach];
96
- /**
97
- * **起服前可调的模型路由缺口纯判官**(与起服判官判 env 表时同一实现、同一句拒因;包根导出)。答的是 **env 腿**:没有目录在管时,这份 env 起不起得来
98
- * (目录在场时起服以目录为准,见文件头注)。
125
+ * **车道值级端口**:这只模型在这张路由表上走哪条车道,这条车道的端点 / 凭据取 env 的哪一对键。
126
+ *
127
+ * 车道 = `brainLaneFor(model.provider, routes)` —— core `brainLaneOf` 对路由表的答案(引擎路由器对每个请求问的那一只),不另写一份合取;
128
+ * 键名 = {@link MODEL_ROUTE_ENV_KEYS}。`routes` 是 core 路由表的原型(`Object.hasOwn(routes, 词)` 的表;`anthropic` 键在场 ⇔ anthropic 路由装上)。
129
+ * **只交键名不交值**:凭据与端点的值调用方自己从 env 取,本函数的答案里没有任何 env 值。
99
130
  *
100
- * @param env 一份 env 快照(只读 {@link MODEL_ROUTE_ENV_KEYS} 那八把键;`process.env` 也行)。
101
- * @returns 三词之一;有缺口时带 `code` 与 `reason`(见 {@link ModelRouteGapReading})。
131
+ * 纯:不读 `process.env`,只按键表点名取值、不枚举入参。路由表里有本部署从不装的键(表在 `mountRoutes` 之外铸)⇒ 抛(`brainLaneFor` 的响亮臂),不折网关。
102
132
  */
103
- export declare function judgeModelRouteGap(env: ModelRouteEnv, opts?: ModelRouteGapOptions): ModelRouteGapReading;
133
+ export declare function laneAndEndpointFor(env: ModelRouteEnv, model: ModelRouteSubject, routes: Readonly<Record<string, unknown>>): LaneAndEndpoint;
104
134
  //# sourceMappingURL=model-route-gap.d.ts.map
@@ -1,8 +1,9 @@
1
+ import { brainLaneFor, declaredRootUrl } from "./model-provider.js";
1
2
  import { DEFAULT_MODEL_REF } from "./model-select.js";
2
- import { judgeModelRouteEndpoint } from "./model-route-endpoint.js";
3
3
  export const MODEL_ROUTE_ENV_KEYS = {
4
4
  gatewayBaseUrl: "MODEL_GATEWAY_BASEURL",
5
5
  gatewayFallbackUrls: "MODEL_GATEWAY_FALLBACK_URLS",
6
+ gatewayApiKey: "MODEL_API_KEY",
6
7
  provider: "MODEL_PROVIDER",
7
8
  mainId: "MODEL_ID",
8
9
  cheapId: "MODEL_CHEAP_ID",
@@ -38,6 +39,7 @@ export function readModelRouteEnv(env) {
38
39
  return {
39
40
  gatewayBaseUrl: declaredValue(env[K.gatewayBaseUrl]),
40
41
  gatewayFallbackUrls: csvOf(env[K.gatewayFallbackUrls]),
42
+ gatewayApiKey: env[K.gatewayApiKey],
41
43
  anthropicApiKey,
42
44
  anthropicAuthToken,
43
45
  anthropicBaseUrl,
@@ -62,19 +64,23 @@ export function envLaneTable(mainId, main, cheap) {
62
64
  table[cheap.id] = cheap;
63
65
  return table;
64
66
  }
65
- export function judgeModelRouteGap(env, opts = {}) {
66
- const r = readModelRouteEnv(env);
67
- const slot = (id) => ({ id, baseUrl: "", provider: r.provider });
68
- const cheapId = mintedCheapId(r.cheapSlot);
69
- const models = opts.envLaneDispatchable === false ? {} : envLaneTable(r.mainId, slot(r.mainId), cheapId !== undefined ? slot(cheapId) : undefined);
70
- const verdict = judgeModelRouteEndpoint({
71
- gatewayBaseUrl: r.gatewayBaseUrl,
72
- gatewayFallbackUrls: r.gatewayFallbackUrls,
73
- anthropic: r.anthropicRouteMounted ? {} : undefined,
74
- models,
75
- }, "env");
76
- if (verdict === undefined)
77
- return { gap: "none" };
78
- return { gap: verdict.gap, code: verdict.code, reason: verdict.reason };
67
+ export function laneAndEndpointFor(env, model, routes) {
68
+ const K = MODEL_ROUTE_ENV_KEYS;
69
+ const reading = readModelRouteEnv(env);
70
+ const lane = brainLaneFor(model.provider, routes);
71
+ switch (lane) {
72
+ case "anthropic":
73
+ return {
74
+ lane,
75
+ endpointEnvName: K.anthropicBaseUrl,
76
+ endpointDeclared: declaredRootUrl(reading.anthropicBaseUrl) !== undefined,
77
+ apiKeyEnvName: reading.anthropicAuthToken !== undefined ? K.anthropicAuthToken : reading.anthropicApiKey !== undefined ? K.anthropicApiKey : undefined,
78
+ };
79
+ case "gateway": {
80
+ const endpointDeclared = declaredRootUrl(reading.gatewayBaseUrl) !== undefined;
81
+ const credentialLoaded = endpointDeclared && reading.gatewayApiKey !== undefined && reading.gatewayApiKey !== "";
82
+ return { lane, endpointEnvName: K.gatewayBaseUrl, endpointDeclared, apiKeyEnvName: credentialLoaded ? K.gatewayApiKey : undefined };
83
+ }
84
+ }
79
85
  }
80
86
  //# sourceMappingURL=model-route-gap.js.map
@@ -120,6 +120,13 @@ export declare const JSONL_REPLAY_SEATS: {
120
120
  readonly note: "S-582 fail-closed: an unreadable consume/release line would resurrect a claimed import ticket as unclaimed (one human consent redeemed twice). The face refuses every read and write until a person inspects the file.";
121
121
  readonly remedy: "the permission-rule lane is fail-closed until a person inspects the file (moving it aside restarts the lane with an empty log)";
122
122
  };
123
+ readonly "workflow-park-decisions": {
124
+ readonly direction: "fail-closed";
125
+ readonly event: "workflow_park_decisions_corrupt_read";
126
+ readonly face: "workflow park decision ledger";
127
+ readonly note: string;
128
+ readonly remedy: string;
129
+ };
123
130
  readonly "approval-ask-journal": {
124
131
  readonly direction: "fail-open";
125
132
  readonly tag: "server.approval-ask-journal.corrupt-record-skipped";
@@ -126,6 +126,15 @@ export const JSONL_REPLAY_SEATS = {
126
126
  note: "S-582 fail-closed: an unreadable consume/release line would resurrect a claimed import ticket as unclaimed (one human consent redeemed twice). The face refuses every read and write until a person inspects the file.",
127
127
  remedy: RULE_LANE_REMEDY,
128
128
  },
129
+ "workflow-park-decisions": {
130
+ direction: "fail-closed",
131
+ event: "workflow_park_decisions_corrupt_read",
132
+ face: "workflow park decision ledger",
133
+ note: "fail-closed: an unreadable line may be the decision that REPLACED an earlier one for the same approval — replaying the rest would bring the replaced decision back and hand it to the engine on the session's next run. " +
134
+ "Every decide on a workflow child's approval is refused until a person inspects the file; a run start reads the ledger as holding no decisions (counted under server.workflow-park-decision.store-unreadable) and starts without them.",
135
+ remedy: "deciding workflow child approvals on this deployment is refused until a person inspects the file (runs keep starting, without the held decisions). Moving it aside drops every held decision in it — " +
136
+ "the approvals they answered stay pending and can be decided again — so it is safe to move aside and restart",
137
+ },
129
138
  "approval-ask-journal": { direction: "fail-open", tag: "server.approval-ask-journal.corrupt-record-skipped" },
130
139
  "run-store": { direction: "fail-open", tag: "server.run-store.corrupt-record-skipped" },
131
140
  "resume-anchor": { direction: "fail-open", tag: "server.resume-anchor.corrupt-record-skipped" },
@@ -18,6 +18,7 @@
18
18
  * MODEL_COST_* — opt-in pricing). The per-run usage extraction (sandbox wall-clock from the run's remote-env
19
19
  * spans, tool-call count from the trace) is the data-source wiring fed in by the caller; this layer is the math.
20
20
  */
21
+ import type { TaskResult } from "@sema-agent/core";
21
22
  /** Deployment infra pricing (config; default 0 = not priced, mirrors MODEL_COST_*). */
22
23
  export interface InfraCostRates {
23
24
  /** $ (micro-USD) per tool invocation. */
@@ -40,13 +41,12 @@ export interface InfraCostBreakdown {
40
41
  egressMicroUsd: number;
41
42
  totalMicroUsd: number;
42
43
  }
43
- /** Core's LLM-family breakdown (mirror of core `Stats.costBreakdown`), accepted read-only for composition. */
44
- export interface LlmCostBreakdown {
45
- llmRootMicroUsd: number;
46
- nestedSubagentMicroUsd: number;
47
- memoryConsolidationMicroUsd: number;
48
- compactionMicroUsd: number;
49
- }
44
+ /**
45
+ * Core's LLM-family breakdown — core's own `TaskResult.stats.costBreakdown` type, accepted read-only for composition (S-1687: not a hand-copied
46
+ * mirror — core 7.52.0 added the `sideCallMicroUsd` "of which" line and a copy would have missed it). Its partition lines add up to core's
47
+ * `costMicroUsd`; `sideCallMicroUsd` (the classifier's and mods' model calls) is an "of which" line INSIDE `llmRootMicroUsd`, never added to them.
48
+ */
49
+ export type LlmCostBreakdown = NonNullable<TaskResult["stats"]["costBreakdown"]>;
50
50
  /** The combined supervisor cost surface: core's LLM axes + the service's infra axes + a reconciled grand total. */
51
51
  export interface SupervisorCostBreakdown {
52
52
  llm: LlmCostBreakdown | null;
@@ -3,4 +3,10 @@
3
3
  * 或 `Error` 实例的 message getter 返回带会抛 length getter 的非字符串——裸写 `e instanceof Error ? e.message : String(e)`
4
4
  * 在 catch 里自己抛,外层 catch 吞掉 setTerminal ⇒ run 卡 running、claim 悬挂到 reaper。这里**不抛、恒返字符串**。 */
5
5
  export declare function errorText(e: unknown): string;
6
+ /**
7
+ * 运维日志里一个错误的**类名**(`err.name`;非 Error 抛出物取 `typeof`)—— 日志只带类名、不带消息原文({@link errorText} 是原文那一只):
8
+ * 投递口 / 库连接上抛出的错误,消息可能带对端文本或库侧文本,类名足够回答「是哪一类故障」,原文留给抛出处自己的错误路径。
9
+ * `name` 的 getter 抛、或它交回的不是字符串(拼进模板串会抛的 Symbol 等)⇒ `<unreadable>`。
10
+ */
11
+ export declare function errorKindOf(err: unknown): string;
6
12
  //# sourceMappingURL=err-text.d.ts.map
@@ -1,10 +1,24 @@
1
- export function errorText(e) {
1
+ const KIND_UNREADABLE = "<unreadable>";
2
+ function readOr(read, marker) {
2
3
  try {
3
- const m = e instanceof Error ? e.message : e;
4
- return typeof m === "string" ? m : String(m);
4
+ return read();
5
5
  }
6
6
  catch {
7
- return "<unprintable>";
7
+ return marker;
8
8
  }
9
9
  }
10
+ export function errorText(e) {
11
+ return readOr(() => {
12
+ const m = e instanceof Error ? e.message : e;
13
+ return typeof m === "string" ? m : String(m);
14
+ }, "<unprintable>");
15
+ }
16
+ export function errorKindOf(err) {
17
+ return readOr(() => {
18
+ if (!(err instanceof Error))
19
+ return typeof err;
20
+ const name = err.name;
21
+ return typeof name === "string" ? name : KIND_UNREADABLE;
22
+ }, KIND_UNREADABLE);
23
+ }
10
24
  //# sourceMappingURL=err-text.js.map