@sema-agent/server 7.148.0 → 7.150.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 (360) hide show
  1. package/MIGRATION.md +551 -9
  2. package/README.md +17 -2
  3. package/README.zh-CN.md +5 -1
  4. package/USAGE.md +126 -68
  5. package/dist/adoption/wire.d.ts +3 -3
  6. package/dist/approval-card.d.ts +33 -33
  7. package/dist/approval-gate-currency.d.ts +1 -1
  8. package/dist/approval-leg-origin.d.ts +33 -0
  9. package/dist/approval-leg-origin.js +4 -0
  10. package/dist/audit.d.ts +1 -1
  11. package/dist/audit.js +2 -2
  12. package/dist/auth-bridge.d.ts +9 -1
  13. package/dist/auth-bridge.js +4 -4
  14. package/dist/auth-keys.d.ts +10 -1
  15. package/dist/auth-keys.js +8 -0
  16. package/dist/background-session-reap.d.ts +1 -1
  17. package/dist/boot/deferred-sandbox-path-env.d.ts +5 -3
  18. package/dist/boot/deferred-sandbox-path-env.js +1 -2
  19. package/dist/boot/execution-env.js +10 -11
  20. package/dist/boot/execution-lane.d.ts +6 -4
  21. package/dist/boot/execution-lane.js +3 -1
  22. package/dist/boot/org-delivery.d.ts +3 -2
  23. package/dist/boot/parked-revive-gate.d.ts +5 -5
  24. package/dist/boot/parked-revive-gate.js +2 -3
  25. package/dist/boot/resolve-spec.d.ts +4 -5
  26. package/dist/boot/resolve-spec.js +66 -28
  27. package/dist/boot/retention-lane.d.ts +1 -1
  28. package/dist/boot/runner-deps.js +3 -1
  29. package/dist/boot/session-faces.js +21 -21
  30. package/dist/boot/stage-01-config.d.ts +1 -0
  31. package/dist/boot/stage-01-config.js +4 -3
  32. package/dist/boot/stage-02-web-admin-pull.d.ts +1 -0
  33. package/dist/boot/stage-02-web-admin-pull.js +10 -2
  34. package/dist/boot/stage-03-store-backend.d.ts +1 -0
  35. package/dist/boot/stage-03-store-backend.js +4 -4
  36. package/dist/boot/stage-04-stores.d.ts +1 -0
  37. package/dist/boot/stage-05-execution-env.d.ts +1 -0
  38. package/dist/boot/stage-06-runners.d.ts +2 -1
  39. package/dist/boot/stage-06-runners.js +1 -2
  40. package/dist/boot/stage-07-capability-layer.d.ts +2 -1
  41. package/dist/boot/stage-07-capability-layer.js +1 -1
  42. package/dist/boot/stage-08-reapers.d.ts +2 -1
  43. package/dist/boot/stage-09-leader.d.ts +2 -1
  44. package/dist/boot/stage-10-http-server.d.ts +35 -2
  45. package/dist/boot/stage-10-http-server.js +9 -4
  46. package/dist/boot/stores.d.ts +3 -0
  47. package/dist/boot/stores.js +22 -19
  48. package/dist/boot/web-admin.d.ts +1 -1
  49. package/dist/capabilities/tool-defer.d.ts +1 -1
  50. package/dist/capability-facts.d.ts +70 -60
  51. package/dist/capability-facts.js +45 -49
  52. package/dist/card-settle-stored-scope.d.ts +56 -0
  53. package/dist/card-settle-stored-scope.js +27 -0
  54. package/dist/card-void.d.ts +7 -12
  55. package/dist/card-void.js +2 -7
  56. package/dist/config-catalog.d.ts +12 -0
  57. package/dist/config-catalog.js +37 -33
  58. package/dist/config-invariants.d.ts +5 -4
  59. package/dist/config-invariants.js +4 -4
  60. package/dist/config-types.d.ts +49 -16
  61. package/dist/config.d.ts +6 -5
  62. package/dist/config.js +35 -24
  63. package/dist/context-window-notice.d.ts +31 -0
  64. package/dist/context-window-notice.js +28 -0
  65. package/dist/deployment-governance.d.ts +7 -28
  66. package/dist/deployment-governance.js +1 -14
  67. package/dist/deployment-shape.d.ts +20 -11
  68. package/dist/deployment-shape.js +1 -0
  69. package/dist/device-ws-hub.d.ts +1 -0
  70. package/dist/device-ws-hub.js +64 -28
  71. package/dist/device-ws-protocol.d.ts +20 -6
  72. package/dist/device-ws-protocol.js +9 -2
  73. package/dist/engine-identity.d.ts +7 -1
  74. package/dist/engine-identity.js +5 -0
  75. package/dist/env-name-allowlist-knobs.d.ts +6 -5
  76. package/dist/env-name-allowlist-knobs.js +5 -0
  77. package/dist/execution-lane-caps.d.ts +20 -5
  78. package/dist/execution-lane-caps.js +18 -4
  79. package/dist/field-conflict.d.ts +2 -2
  80. package/dist/fleet/engine-signal.d.ts +14 -1
  81. package/dist/fleet/engine-signal.js +5 -1
  82. package/dist/fleet/fleet-reconciler.d.ts +1 -1
  83. package/dist/fleet/serving-lease.d.ts +18 -3
  84. package/dist/fleet/serving-lease.js +81 -35
  85. package/dist/fleet-client.d.ts +13 -11
  86. package/dist/fleet-client.js +53 -33
  87. package/dist/history-anchor.js +1 -1
  88. package/dist/hitl-delivery.d.ts +1 -3
  89. package/dist/hitl-delivery.js +1 -1
  90. package/dist/hooks/command-spawn.d.ts +7 -2
  91. package/dist/hooks/command-spawn.js +13 -6
  92. package/dist/hooks/hook-runner.d.ts +5 -0
  93. package/dist/hooks/hook-runner.js +11 -7
  94. package/dist/http/active-run-conflict.d.ts +3 -7
  95. package/dist/http/active-run-conflict.js +2 -2
  96. package/dist/http/admission.js +5 -5
  97. package/dist/http/approval-sweeps.js +5 -3
  98. package/dist/http/caller-trust.d.ts +2 -2
  99. package/dist/http/caller-trust.js +3 -3
  100. package/dist/http/checkpoint-ctx.d.ts +18 -63
  101. package/dist/http/checkpoint-ctx.js +1 -24
  102. package/dist/http/claim-heartbeat.d.ts +6 -6
  103. package/dist/http/claim-heartbeat.js +6 -6
  104. package/dist/http/claimed-run.d.ts +16 -9
  105. package/dist/http/claimed-run.js +8 -0
  106. package/dist/http/dispatch.js +7 -5
  107. package/dist/http/durable-run-leg.d.ts +8 -1
  108. package/dist/http/durable-run-leg.js +34 -15
  109. package/dist/http/execution-context.d.ts +115 -14
  110. package/dist/http/execution-context.js +130 -40
  111. package/dist/http/owner-access.d.ts +246 -21
  112. package/dist/http/owner-access.js +186 -8
  113. package/dist/http/principal-gate.d.ts +18 -11
  114. package/dist/http/principal-gate.js +3 -1
  115. package/dist/http/readiness.d.ts +4 -2
  116. package/dist/http/resume-ctx-read.d.ts +14 -3
  117. package/dist/http/resume-ctx-read.js +24 -3
  118. package/dist/http/resume-legs.d.ts +35 -3
  119. package/dist/http/resume-legs.js +262 -106
  120. package/dist/http/route-ctx.d.ts +29 -11
  121. package/dist/http/routes/a2a-serve.js +17 -14
  122. package/dist/http/routes/approvals-assistant.d.ts +3 -2
  123. package/dist/http/routes/approvals-assistant.js +11 -11
  124. package/dist/http/routes/capabilities.js +5 -4
  125. package/dist/http/routes/config-catalog.d.ts +1 -1
  126. package/dist/http/routes/diagnostics.d.ts +3 -1
  127. package/dist/http/routes/diagnostics.js +30 -5
  128. package/dist/http/routes/mcp-reconnect.js +2 -2
  129. package/dist/http/routes/memory-origin.d.ts +1 -1
  130. package/dist/http/routes/notify-wake.js +2 -3
  131. package/dist/http/routes/principal-inbox.d.ts +3 -1
  132. package/dist/http/routes/principal-inbox.js +3 -2
  133. package/dist/http/routes/projects.d.ts +1 -0
  134. package/dist/http/routes/projects.js +5 -3
  135. package/dist/http/routes/retention-ops.d.ts +1 -1
  136. package/dist/http/routes/run-permission-mode.d.ts +1 -1
  137. package/dist/http/routes/run-permission-mode.js +2 -2
  138. package/dist/http/routes/runs.d.ts +1 -1
  139. package/dist/http/routes/runs.js +33 -37
  140. package/dist/http/routes/session-memory-sync.js +4 -5
  141. package/dist/http/routes/session-sync.d.ts +24 -5
  142. package/dist/http/routes/session-sync.js +45 -37
  143. package/dist/http/routes/sessions-list.d.ts +1 -1
  144. package/dist/http/routes/sessions.d.ts +1 -1
  145. package/dist/http/routes/sessions.js +18 -44
  146. package/dist/http/routes/tasks.js +136 -101
  147. package/dist/http/routes/trace-usage.js +14 -14
  148. package/dist/http/routes/workflows.d.ts +1 -0
  149. package/dist/http/routes/workflows.js +20 -38
  150. package/dist/http/server.d.ts +12 -9
  151. package/dist/http/server.js +35 -6
  152. package/dist/http/stored-body-replay.d.ts +3 -24
  153. package/dist/http/stored-body-replay.js +2 -12
  154. package/dist/http/submit-ctx.d.ts +2 -2
  155. package/dist/http/submit-ctx.js +5 -5
  156. package/dist/http/submit-replay.d.ts +15 -2
  157. package/dist/http/submit-replay.js +10 -4
  158. package/dist/http/wire-types.d.ts +6 -3
  159. package/dist/index.d.ts +3 -1
  160. package/dist/index.js +1 -0
  161. package/dist/leader/endpoint.js +9 -8
  162. package/dist/leg-facts.d.ts +13 -2
  163. package/dist/leg-facts.js +2 -0
  164. package/dist/local-store-declaration.d.ts +54 -0
  165. package/dist/local-store-declaration.js +59 -0
  166. package/dist/mcp-assertion-header.d.ts +1 -1
  167. package/dist/mcp-assertion-header.js +1 -1
  168. package/dist/mcp-authorization-face.d.ts +18 -14
  169. package/dist/mcp-authorization-face.js +3 -2
  170. package/dist/memory-project-layer.js +1 -1
  171. package/dist/memory-scope.d.ts +4 -4
  172. package/dist/memory-scope.js +4 -4
  173. package/dist/memory-store-refusal.d.ts +1 -1
  174. package/dist/memory-sync-client.js +2 -2
  175. package/dist/model-context-window.d.ts +50 -11
  176. package/dist/model-context-window.js +20 -1
  177. package/dist/model-entry-refusal.d.ts +5 -4
  178. package/dist/model-entry-refusal.js +17 -3
  179. package/dist/model-reach-scope.d.ts +2 -1
  180. package/dist/observability/corrupt-read-seat.d.ts +1 -1
  181. package/dist/observability/fail-open.d.ts +19 -7
  182. package/dist/observability/fail-open.js +19 -7
  183. package/dist/observability/logger.d.ts +7 -0
  184. package/dist/observability/logger.js +3 -1
  185. package/dist/observability/metrics.js +1 -1
  186. package/dist/observability/run-terminal.d.ts +1 -1
  187. package/dist/observability/run-terminal.js +1 -0
  188. package/dist/observability/secret-env-scrub.d.ts +1 -1
  189. package/dist/observability/secret-env-scrub.js +1 -1
  190. package/dist/org-delivery-gate.d.ts +31 -6
  191. package/dist/org-delivery-gate.js +7 -4
  192. package/dist/owner-faces.d.ts +30 -5
  193. package/dist/owner-faces.js +2 -0
  194. package/dist/park-row-commit.d.ts +67 -0
  195. package/dist/park-row-commit.js +76 -0
  196. package/dist/parked-decide.d.ts +9 -7
  197. package/dist/parked-decide.js +25 -6
  198. package/dist/peer-directory.d.ts +1 -1
  199. package/dist/peer-seat.d.ts +1 -1
  200. package/dist/peer-seat.js +52 -59
  201. package/dist/plugins/adoption-log-sql.d.ts +3 -3
  202. package/dist/plugins/adoption-log-sql.js +19 -19
  203. package/dist/plugins/approval-ask-store-sql.d.ts +1 -1
  204. package/dist/plugins/approval-ask-store-sql.js +3 -5
  205. package/dist/plugins/approval-exemption-skill-cutoff.d.ts +64 -0
  206. package/dist/plugins/approval-exemption-skill-cutoff.js +122 -0
  207. package/dist/plugins/approval-exemption-skill-m46.d.ts +0 -6
  208. package/dist/plugins/approval-exemption-skill-m46.js +6 -10
  209. package/dist/plugins/approval-exemption-store.d.ts +26 -1
  210. package/dist/plugins/approval-exemption-store.js +28 -19
  211. package/dist/plugins/ensure-schema-lock-policy.d.ts +36 -3
  212. package/dist/plugins/ensure-schema-lock-policy.js +75 -9
  213. package/dist/plugins/exec-path-law.d.ts +34 -0
  214. package/dist/plugins/exec-path-law.js +13 -0
  215. package/dist/plugins/file-run-store.d.ts +22 -9
  216. package/dist/plugins/file-run-store.js +51 -23
  217. package/dist/plugins/local-checkpoint-store.d.ts +8 -1
  218. package/dist/plugins/local-checkpoint-store.js +5 -1
  219. package/dist/plugins/local-data-root-admission.d.ts +52 -0
  220. package/dist/plugins/local-data-root-admission.js +100 -0
  221. package/dist/plugins/local-engine-high-water.d.ts +28 -7
  222. package/dist/plugins/local-engine-high-water.js +27 -22
  223. package/dist/plugins/local-session-store.d.ts +134 -49
  224. package/dist/plugins/local-session-store.js +149 -108
  225. package/dist/plugins/memory-run-store.d.ts +14 -9
  226. package/dist/plugins/memory-run-store.js +48 -22
  227. package/dist/plugins/one-time-migration-marker.d.ts +19 -3
  228. package/dist/plugins/one-time-migration-marker.js +7 -1
  229. package/dist/plugins/one-time-migrations.d.ts +110 -59
  230. package/dist/plugins/one-time-migrations.js +224 -136
  231. package/dist/plugins/org-delivery-quota-store.d.ts +34 -11
  232. package/dist/plugins/org-delivery-quota-store.js +29 -14
  233. package/dist/plugins/permission-rule-store-sql.d.ts +1 -1
  234. package/dist/plugins/permission-rule-store-sql.js +5 -9
  235. package/dist/plugins/pg-pool.d.ts +1 -1
  236. package/dist/plugins/pg-pool.js +14 -12
  237. package/dist/plugins/posix-shell-fs.js +4 -2
  238. package/dist/plugins/remote-env-adb.js +3 -2
  239. package/dist/plugins/remote-env-device.d.ts +3 -2
  240. package/dist/plugins/remote-env-device.js +8 -6
  241. package/dist/plugins/remote-env-e2b.d.ts +4 -8
  242. package/dist/plugins/remote-env-e2b.js +21 -15
  243. package/dist/plugins/remote-env-host.d.ts +51 -10
  244. package/dist/plugins/remote-env-host.js +97 -31
  245. package/dist/plugins/remote-env-k8s.js +7 -4
  246. package/dist/plugins/remote-env-local-docker.d.ts +6 -3
  247. package/dist/plugins/remote-env-local-docker.js +11 -25
  248. package/dist/plugins/remote-env-ssh.js +4 -3
  249. package/dist/plugins/remote-shell.d.ts +3 -1
  250. package/dist/plugins/remote-shell.js +3 -3
  251. package/dist/plugins/replica-registration.d.ts +35 -0
  252. package/dist/plugins/replica-registration.js +48 -0
  253. package/dist/plugins/retention-lane-store-sql.d.ts +1 -1
  254. package/dist/plugins/run-store-sql.d.ts +27 -8
  255. package/dist/plugins/run-store-sql.js +46 -18
  256. package/dist/plugins/scenario-prefix-switch-m42.d.ts +8 -12
  257. package/dist/plugins/scenario-prefix-switch-m42.js +9 -6
  258. package/dist/plugins/schema-consistency.d.ts +91 -5
  259. package/dist/plugins/schema-consistency.js +189 -7
  260. package/dist/plugins/schema-drift-sentence.d.ts +6 -5
  261. package/dist/plugins/schema-drift-sentence.js +13 -5
  262. package/dist/plugins/serving-requirement.d.ts +49 -0
  263. package/dist/plugins/serving-requirement.js +53 -0
  264. package/dist/plugins/session-placement.d.ts +5 -4
  265. package/dist/plugins/shell-sentinel-owner-m48.d.ts +22 -0
  266. package/dist/plugins/shell-sentinel-owner-m48.js +6 -0
  267. package/dist/plugins/stop-then-start-sentence.d.ts +55 -0
  268. package/dist/plugins/stop-then-start-sentence.js +51 -0
  269. package/dist/plugins/store-backend.d.ts +23 -9
  270. package/dist/plugins/store-backend.js +58 -24
  271. package/dist/plugins/store-contracts.d.ts +45 -5
  272. package/dist/plugins/store-contracts.js +19 -0
  273. package/dist/plugins/tidb-pool.d.ts +11 -6
  274. package/dist/plugins/tidb-pool.js +22 -12
  275. package/dist/plugins/workspace-custody.d.ts +44 -0
  276. package/dist/plugins/workspace-custody.js +47 -0
  277. package/dist/process-instance.d.ts +3 -0
  278. package/dist/process-instance.js +7 -0
  279. package/dist/project-context.d.ts +66 -0
  280. package/dist/project-context.js +70 -0
  281. package/dist/project-identity.d.ts +8 -7
  282. package/dist/project-identity.js +40 -17
  283. package/dist/project-layer-key.d.ts +13 -2
  284. package/dist/project-layer-key.js +9 -1
  285. package/dist/question.d.ts +9 -21
  286. package/dist/question.js +28 -19
  287. package/dist/read-deny-floor-notice.d.ts +36 -0
  288. package/dist/read-deny-floor-notice.js +40 -0
  289. package/dist/{plain-string-record.d.ts → request-declaration-disposition.d.ts} +9 -23
  290. package/dist/request-declaration-disposition.js +39 -0
  291. package/dist/run-cancel-card.d.ts +28 -0
  292. package/dist/run-cancel-card.js +20 -0
  293. package/dist/run-cancel-context.d.ts +10 -0
  294. package/dist/run-cancel-context.js +1 -0
  295. package/dist/run-local.js +28 -13
  296. package/dist/runs.d.ts +31 -7
  297. package/dist/runs.js +34 -16
  298. package/dist/security.d.ts +3 -3
  299. package/dist/server-secret-env.d.ts +34 -20
  300. package/dist/server-secret-env.js +61 -18
  301. package/dist/session-agent.d.ts +4 -12
  302. package/dist/session-agent.js +0 -6
  303. package/dist/session-children-retire.d.ts +6 -3
  304. package/dist/session-children-retire.js +2 -5
  305. package/dist/session-incarnation.d.ts +18 -4
  306. package/dist/session-incarnation.js +4 -1
  307. package/dist/session-notify-door.d.ts +4 -4
  308. package/dist/session-notify-door.js +5 -6
  309. package/dist/session-rules-seat.d.ts +4 -3
  310. package/dist/session-rules-seat.js +3 -11
  311. package/dist/session-sync.js +3 -3
  312. package/dist/session-workspace.d.ts +3 -3
  313. package/dist/store-admission.d.ts +33 -0
  314. package/dist/store-admission.js +49 -0
  315. package/dist/store-posture.d.ts +5 -0
  316. package/dist/store-posture.js +18 -1
  317. package/dist/stores-sql/checkpoint-store-sql.d.ts +22 -3
  318. package/dist/stores-sql/checkpoint-store-sql.js +109 -23
  319. package/dist/stores-sql/file-history-store-sql.d.ts +1 -1
  320. package/dist/stores-sql/file-history-store-sql.js +3 -5
  321. package/dist/stores-sql/retention-store-sql.d.ts +1 -1
  322. package/dist/stores-sql/tool-result-store-sql.d.ts +1 -1
  323. package/dist/stores-sql/tool-result-store-sql.js +4 -6
  324. package/dist/task-a2a.d.ts +3 -8
  325. package/dist/task-a2a.js +25 -27
  326. package/dist/task-cwd.d.ts +27 -10
  327. package/dist/task-cwd.js +3 -0
  328. package/dist/task-mcp.d.ts +3 -3
  329. package/dist/task-mcp.js +1 -1
  330. package/dist/task-settings.d.ts +13 -0
  331. package/dist/task-settings.js +14 -7
  332. package/dist/terminal.d.ts +2 -0
  333. package/dist/terminal.js +21 -6
  334. package/dist/tool-approval.d.ts +50 -41
  335. package/dist/tool-approval.js +96 -73
  336. package/dist/trace/engine-notice-wire.d.ts +38 -21
  337. package/dist/trace/engine-notice-wire.js +25 -4
  338. package/dist/trace/ledger-sink.d.ts +3 -1
  339. package/dist/trace/project.d.ts +8 -5
  340. package/dist/trace/project.js +11 -9
  341. package/dist/trace/projection-table.d.ts +33 -2
  342. package/dist/trace/redact.d.ts +12 -0
  343. package/dist/trace/redact.js +5 -1
  344. package/dist/trace/self-minted-wire.d.ts +268 -56
  345. package/dist/trace/self-minted-wire.js +110 -40
  346. package/dist/trace/tool-card.d.ts +3 -0
  347. package/dist/trace/tool-card.js +24 -0
  348. package/dist/trace/tool-output-media.d.ts +2 -1
  349. package/dist/unattended-permission-mode.d.ts +1 -1
  350. package/dist/web-admin-client/apply-effective.d.ts +1 -1
  351. package/dist/web-admin-client/apply-effective.js +22 -9
  352. package/dist/web-admin-client/effective-keys.d.ts +1 -1
  353. package/dist/web-admin-client/skills-mcp.d.ts +1 -1
  354. package/docs/DEVICE-EXECUTOR-PROTOCOL.md +57 -29
  355. package/docs/error-text-lexicon.json +317 -0
  356. package/package.json +4 -2
  357. package/scripts/embed-minimal.mjs +183 -0
  358. package/wire-changes/server@7.149.0.json +372 -0
  359. package/wire-changes/server@7.150.0.json +335 -0
  360. package/dist/plain-string-record.js +0 -70
package/dist/config.d.ts CHANGED
@@ -235,22 +235,23 @@ export declare function configKnobTable(): ConfigKnobRecord[];
235
235
  export declare const hostBackgroundShellEnabled: () => boolean;
236
236
  /** The `host` exec lane's spool-file stdio form; false ⇒ the pre-1.226 pipe fallback (read per exec). */
237
237
  export declare const hostExecSpoolEnabled: () => boolean;
238
- /** 名单在活配置里的落点(服务进程四只旋钮;bake-runner 那只在它自己的进程里,不在 `ServiceConfig`)。 */
239
- export type EnvNameAllowlistSeats = Pick<ServiceConfig, "lspEnvAllow" | "remoteExec">;
238
+ /** 名单在活配置里的落点(服务进程五只旋钮;bake-runner 那只在它自己的进程里,不在 `ServiceConfig`)。 */
239
+ export type EnvNameAllowlistSeats = Pick<ServiceConfig, "lspEnvAllow" | "hookEnvAllow" | "remoteExec">;
240
240
  /**
241
241
  * 沙箱名单(表列 `channel: "sandbox-grant"` 的服务侧旋钮,表派生)此刻交出去的名 —— 起服行 `remote_exec_enabled.sandboxEnvKeys` 读它(`boot/execution-env.ts`,
242
242
  * 排序后只出键名)。只有被选中车道的那一只有落点;e2b / k8s 报的是名单点到的键,不含 `SANDBOX_PKG_SOURCE` 推导出的包源变量(那一组是区域常量,装配点另并)。
243
243
  */
244
244
  export declare function sandboxEnvNamesInForce(seats: EnvNameAllowlistSeats): readonly string[];
245
- /** 声明增长后重判的一处命中:哪只旋钮、它交出去的哪个名、判官的拒因({@link ownCredentialNameProblem} 那一句,只回显名)。 */
245
+ /** 声明增长后重判的一处命中:哪只旋钮、它交出去的哪个名、判官的拒因({@link ownCredentialProblem} 那一句,只回显名)。 */
246
246
  export interface OwnCredentialInForce {
247
247
  readonly knob: ServerEnvNameAllowlistKnob;
248
248
  readonly name: string;
249
249
  readonly problem: string;
250
250
  }
251
251
  /**
252
- * 解析器头注 ② 那条不变量在**声明增长**那一刻的半边:对活配置里每只名单此刻交出去的名问**同一只**判官({@link ownCredentialNameProblem} → 引擎
253
- * `inheritEnvPolicyProblem`,读引擎此刻的声明)。读活配置的落点,不重读 env(名单是起服输入;解析那一刻已判过形与当时的声明)。返回每一处命中,空 = 不相交。
252
+ * 解析器头注 ② 那条不变量在**声明增长**那一刻的半边:对活配置里每只名单此刻交出去的名问**同一只**判官({@link ownCredentialProblem} → `ownCredentialVariable`,
253
+ * 读引擎此刻的声明:增长并进的名,与增长并进的值 —— 新条目 `apiKeyEnv` 的值等于名单交出去的某个变量的值,同样命中)。读活配置的落点(名单是起服输入;
254
+ * 解析那一刻已判过形与当时的声明)。返回每一处命中,空 = 不相交。
254
255
  * 调用点只有一处 = 声明增长的那一处(`apply-effective.ts` 的换代声明,真声明之后、席位换装之前)。
255
256
  */
256
257
  export declare function ownCredentialHitsInForce(seats: EnvNameAllowlistSeats): OwnCredentialInForce[];
package/dist/config.js CHANGED
@@ -4,9 +4,9 @@ import { DEFAULT_AT_MENTION, DEFAULT_MODEL_REF, mintCapabilityKeys } from "./mod
4
4
  import { homedir } from "node:os";
5
5
  import { isAbsolute, join, posix as posixPath } from "node:path";
6
6
  import { fileURLToPath } from "node:url";
7
- import { hostOfUrl, HOST_UNREADABLE_SENTENCE, compileAllowList, inheritEnvPolicyProblem, BUILTIN_COMPLIANCE_DENIES, COMPLIANCE_CAPABILITIES, CROSS_SESSION_INBOUND_SETTINGS, CROSS_SESSION_DIALOG_EXPIRY_VALUES, compileReadDeny, resolveReadDenyBuiltins, isModelPriced, PROTOCOL_TABLE, RECOMMENDED_SENSITIVE_PATTERNS, judgeRuleToolName, resolveFileHistoryRetention, resolveLockedKeys, validatePermissionRules, WRITE_PROTECTED_DEFAULT_TABLE, resolveWriteProtectedTable, principalInboxConsumerOf, carriesCredential, isReplicableScope, resolveBashTimeoutCaps } from "@sema-agent/core";
7
+ import { hostOfUrl, HOST_UNREADABLE_SENTENCE, compileAllowList, BUILTIN_COMPLIANCE_DENIES, COMPLIANCE_CAPABILITIES, CROSS_SESSION_INBOUND_SETTINGS, CROSS_SESSION_DIALOG_EXPIRY_VALUES, compileReadDeny, resolveReadDenyBuiltins, isModelPriced, PROTOCOL_TABLE, RECOMMENDED_SENSITIVE_PATTERNS, judgeRuleToolName, resolveFileHistoryRetention, resolveLockedKeys, validatePermissionRules, WRITE_PROTECTED_DEFAULT_TABLE, resolveWriteProtectedTable, principalInboxConsumerOf, carriesCredential, isReplicableScope, resolveBashTimeoutCaps } from "@sema-agent/core";
8
8
  import { ROSTER_PRIMARY_ROLES, ROSTER_CHEAP_ROLES, WEB_ADMIN_ENV, retiredEnvRefusal, stripControlAndBidi } from "@sema-agent/settings-schema";
9
- import { parseApprovalHmacKeys, parsePrincipalJwks } from "./auth-keys.js";
9
+ import { parseApprovalHmacKeys, parsePrincipalJwks, parseServiceAuthTokens } from "./auth-keys.js";
10
10
  import { DEFAULT_ELICITATION_THROTTLE } from "./elicitation.js";
11
11
  import { buildRuleListJudgeOptions } from "./permission-rule-list.js";
12
12
  import { isV2ScopeKey, memoryReplicationCoverage, replicatesProjectLayersOf } from "./memory-scope.js";
@@ -27,7 +27,7 @@ import { resolveLocalDataRoot } from "./local-data-root.js";
27
27
  import { buildWriteProtectionPosture } from "./write-protection.js";
28
28
  import { RUN_STALE_SEC_DEFAULT } from "./run-stale-default.js";
29
29
  import { normalizeSshFingerprint } from "./ssh-host-key.js";
30
- import { ASSUMED_CONTEXT_WINDOW } from "./model-context-window.js";
30
+ import { resolveContextWindow } from "./model-context-window.js";
31
31
  import { MODEL_THINKING_LEVELS, THINKING_LEVELS, THINKING_FORMATS, buildModelCompat, isModelThinkingLevel, isThinkingFormat, isThinkingTier } from "./model-compat.js";
32
32
  import {} from "./posture-source.js";
33
33
  import { COST_QUOTA_WINDOW_SEC_RANGE, costQuotaWindowSecInRange } from "./observability/cost-quota.js";
@@ -41,6 +41,7 @@ import { laneLivenessOf } from "./exec-bounds.js";
41
41
  import { SANDBOX_IPV6_DEFAULT, SANDBOX_IPV6_WORDS } from "./sandbox-egress-policy.js";
42
42
  import { WORKSPACE_CACHE_DEFAULT, WORKSPACE_CACHE_MOUNT_DEFAULT, WORKSPACE_CACHE_MOUNT_RESERVED, WORKSPACE_CACHE_SIZE_DEFAULT, WORKSPACE_CACHE_WORDS, isK8sQuantity, mountsOverlap, reservedMountCollision } from "./workspace-cache.js";
43
43
  import { DEPLOYMENT_SHAPE_PREDICATES } from "./deployment-shape.js";
44
+ import { parseLocalStoreDurabilityWord } from "./local-store-declaration.js";
44
45
  import { sandboxForwardedEnvOf } from "./execution-config-root.js";
45
46
  import { SANDBOX_READ_FLOOR_DEFAULT, SANDBOX_READ_FLOOR_WORDS, laneMissingEnv, readDeclaredLaneTable } from "./execution-lane-caps.js";
46
47
  import { MEMORY_ENGINE_BACKENDS, SESSION_BACKENDS, STORE_BACKENDS } from "@sema-agent/settings-schema/execution-lanes";
@@ -61,7 +62,7 @@ import { echoCallerText } from "./caller-text-echo.js";
61
62
  import { PRINCIPAL_MAX_BYTES, principalShapeProblem } from "./principal-shape.js";
62
63
  import { buildDisplaySafeUrl, redactSecrets } from "./trace/redact.js";
63
64
  import { parseConfigLocalOwnerUid } from "./config-dir-trust.js";
64
- import { allowlistedEnv, ownCredentialDeclarationRefusal } from "./server-secret-env.js";
65
+ import { allowlistedEnv, ownCredentialDeclarationRefusal, ownCredentialVariable } from "./server-secret-env.js";
65
66
  import { ENV_NAME_ALLOWLIST_KNOBS, ENV_NAME_ALLOWLIST_KNOB_NAMES, describeAllowlistPostures } from "./env-name-allowlist-knobs.js";
66
67
  import { APPROVAL_ASK_RETENTION_DEFAULT_MS, APPROVAL_ASK_RETENTION_FLOOR_MS } from "./approval-ask-retention.js";
67
68
  import { parseModsDeclaration } from "./mods-declaration.js";
@@ -565,14 +566,18 @@ const OWN_CREDENTIAL_HANDOFF = {
565
566
  "host-put-back": { where: "a put-back list hands the named variable back, as written, to the child the engine withheld it from", whom: "that child" },
566
567
  "sandbox-grant": { where: "a sandbox list puts the named variable, as written, into a sandbox the model can read", whom: "the sandbox" },
567
568
  };
568
- function ownCredentialNameProblem(name, channel) {
569
- if (inheritEnvPolicyProblem([name]) === undefined)
569
+ function ownCredentialProblem(name, channel) {
570
+ const held = ownCredentialVariable(name);
571
+ if (held === undefined)
570
572
  return undefined;
571
573
  const { where, whom } = OWN_CREDENTIAL_HANDOFF[channel];
572
- return `this deployment's own credential — ${where}; give ${whom} a credential of its own (another name and another value) and list that name instead (the engine refuses it on any allow list)`;
574
+ const copy = held === "value" ? "a copy under another name (its value is one of this service's credentials); " : "";
575
+ const engine = held === "name" ? "the engine refuses it on any allow list" : "the engine withholds it from every child";
576
+ return `this deployment's own credential — ${copy}${where}; give ${whom} a credential of its own (another name and another value) and list that name instead (${engine})`;
573
577
  }
574
578
  const NAMES_IN_FORCE = {
575
579
  LSP_ENV_ALLOW: (c) => c.lspEnvAllow,
580
+ HOOK_ENV_ALLOW: (c) => c.hookEnvAllow,
576
581
  E2B_SANDBOX_ENV: (c) => (c.remoteExec.provider === "e2b" ? Object.keys(sandboxForwardedEnvOf(c)) : []),
577
582
  K8S_SANDBOX_ENV: (c) => (c.remoteExec.provider === "k8s" ? Object.keys(sandboxForwardedEnvOf(c)) : []),
578
583
  DOCKER_SANDBOX_ENV: (c) => (c.remoteExec.provider === "local-docker" ? Object.keys(sandboxForwardedEnvOf(c)) : []),
@@ -583,7 +588,7 @@ export function sandboxEnvNamesInForce(seats) {
583
588
  }
584
589
  export function ownCredentialHitsInForce(seats) {
585
590
  return SERVER_ENV_NAME_ALLOWLIST_KNOBS.flatMap((knob) => NAMES_IN_FORCE[knob](seats).flatMap((name) => {
586
- const problem = ownCredentialNameProblem(name, ENV_NAME_ALLOWLIST_KNOBS[knob].channel);
591
+ const problem = ownCredentialProblem(name, ENV_NAME_ALLOWLIST_KNOBS[knob].channel);
587
592
  return problem === undefined ? [] : [{ knob, name, problem }];
588
593
  }));
589
594
  }
@@ -600,7 +605,7 @@ export function parseEnvNameAllowlist(knob, singleUserTurnkey) {
600
605
  ? 'not an environment-variable name (letters, digits and "_", not starting with a digit)'
601
606
  : ENV_NAME_ALLOWLIST_KNOB_NAMES.has(seg.toUpperCase())
602
607
  ? `the name of a name-list knob (${[...ENV_NAME_ALLOWLIST_KNOB_NAMES].join(" / ")}: their raw text is withheld from every child process and sandbox; naming one would put that text back)`
603
- : ownCredentialNameProblem(seg, spec.channel);
608
+ : ownCredentialProblem(seg, spec.channel);
604
609
  if (problem === undefined)
605
610
  return;
606
611
  throw new Error(`env ${knob}: entry #${i + 1} of ${segments.length} is ${problem}` +
@@ -762,6 +767,7 @@ function optionalEnumKey(key, envName, raw, allowed) {
762
767
  }
763
768
  return { [key]: raw };
764
769
  }
770
+ const PRINCIPAL_INBOX_ECHO_CHARS = 96;
765
771
  function principalInboxAssistantKey(raw) {
766
772
  if (raw === undefined || raw === "")
767
773
  return {};
@@ -769,7 +775,9 @@ function principalInboxAssistantKey(raw) {
769
775
  principalInboxConsumerOf({ principalInboxConsumer: { assistant: raw } });
770
776
  }
771
777
  catch (err) {
772
- throw new Error(`env PRINCIPAL_INBOX_ASSISTANT must name the agent handle that consumes the principal inbox (or stay UNSET for no cross-principal delivery): ${err instanceof Error ? err.message : String(err)}`);
778
+ const shown = JSON.stringify(raw.length > PRINCIPAL_INBOX_ECHO_CHARS ? `${raw.slice(0, PRINCIPAL_INBOX_ECHO_CHARS)}…` : raw);
779
+ throw new Error(`env PRINCIPAL_INBOX_ASSISTANT must name the agent handle that consumes the principal inbox, or be unset or the empty string for no cross-principal delivery (a blank value is neither — whitespace is not "empty"): ` +
780
+ `the value ${shown} is refused — ${err instanceof Error ? err.message : String(err)}`);
773
781
  }
774
782
  return { principalInboxAssistant: raw };
775
783
  }
@@ -975,6 +983,7 @@ function parseStoreDomain(ctx) {
975
983
  return raw;
976
984
  })()),
977
985
  runStoreStrictHydrate: parseRunStoreStrictHydrate(process.env.RUN_STORE_STRICT_HYDRATE),
986
+ localStoreDurability: parseLocalStoreDurabilityWord(process.env.LOCAL_STORE_DURABILITY),
978
987
  tidb: needsDb && dbBackend === "mysql"
979
988
  ? {
980
989
  host: env("MYSQL_HOST"),
@@ -1085,7 +1094,7 @@ function parseModelDomain() {
1085
1094
  });
1086
1095
  const envCompat = envApi === "openai-completions" ? envCompatDeclared : undefined;
1087
1096
  const modelCapability = { reasoning: parseBoolWord("MODEL_REASONING", process.env.MODEL_REASONING), vision: parseBoolWord("MODEL_VISION", process.env.MODEL_VISION) };
1088
- const contextWindow = numEnv("MODEL_CONTEXT_WINDOW", String(ASSUMED_CONTEXT_WINDOW));
1097
+ const mainWindow = resolveContextWindow(optNumEnvStrict("MODEL_CONTEXT_WINDOW"));
1089
1098
  const model = {
1090
1099
  id: modelId,
1091
1100
  name: modelId,
@@ -1099,10 +1108,10 @@ function parseModelDomain() {
1099
1108
  cacheRead: costEnv("MODEL_COST_CACHE_READ", "unset"),
1100
1109
  cacheWrite: costEnv("MODEL_COST_CACHE_WRITE", "unset"),
1101
1110
  }, undefined)),
1102
- contextWindow,
1111
+ contextWindow: mainWindow.window,
1103
1112
  maxTokens: process.env.MODEL_MAX_TOKENS !== undefined && process.env.MODEL_MAX_TOKENS !== ""
1104
1113
  ? parseNumOrFail("MODEL_MAX_TOKENS", process.env.MODEL_MAX_TOKENS)
1105
- : Math.min(32000, contextWindow),
1114
+ : Math.min(32000, mainWindow.window),
1106
1115
  ...(optFinitePositiveEnv("MODEL_CHARS_PER_TOKEN") !== undefined ? { charsPerToken: optFinitePositiveEnv("MODEL_CHARS_PER_TOKEN") } : {}),
1107
1116
  params: { promptCacheFamily: envLaneWire.promptCacheFamily },
1108
1117
  ...(thinkingDefault ? { defaultThinking: thinkingDefault } : {}),
@@ -1138,6 +1147,8 @@ function parseModelDomain() {
1138
1147
  break;
1139
1148
  }
1140
1149
  const cheapMintedId = mintedCheapId(cheapSlot);
1150
+ const cheapDeclaredWindow = cheapMintedId === undefined ? undefined : optNumEnvStrict("MODEL_CHEAP_CONTEXT_WINDOW");
1151
+ const cheapWindow = resolveContextWindow(cheapDeclaredWindow, mainWindow);
1141
1152
  const cheapModel = cheapMintedId !== undefined
1142
1153
  ? {
1143
1154
  ...model,
@@ -1150,7 +1161,7 @@ function parseModelDomain() {
1150
1161
  cacheRead: costEnv("MODEL_CHEAP_COST_CACHE_READ", "declares-zero"),
1151
1162
  cacheWrite: costEnv("MODEL_CHEAP_COST_CACHE_WRITE", "declares-zero"),
1152
1163
  }, model.cost)),
1153
- contextWindow: numEnvOr("MODEL_CHEAP_CONTEXT_WINDOW", model.contextWindow),
1164
+ contextWindow: cheapWindow.window,
1154
1165
  maxTokens: numEnvOr("MODEL_CHEAP_MAX_TOKENS", model.maxTokens),
1155
1166
  ...(optFinitePositiveEnv("MODEL_CHEAP_CHARS_PER_TOKEN") !== undefined ? { charsPerToken: optFinitePositiveEnv("MODEL_CHEAP_CHARS_PER_TOKEN") } : {}),
1156
1167
  }
@@ -1172,7 +1183,7 @@ function parseModelDomain() {
1172
1183
  if (cheapModel) {
1173
1184
  const cheapAct = optFinitePositiveEnv("MODEL_CHEAP_AUTO_COMPACT_TOKENS");
1174
1185
  if (applyAutoCompactWindow(cheapModel, cheapAct) === "removed-1m") {
1175
- const inherited = process.env.MODEL_CHEAP_CONTEXT_WINDOW === undefined || process.env.MODEL_CHEAP_CONTEXT_WINDOW === "";
1186
+ const inherited = cheapDeclaredWindow === undefined;
1176
1187
  CONFIG_NOTICES.push({
1177
1188
  level: "warn",
1178
1189
  event: "auto_compact_window_not_derived_1m",
@@ -1186,6 +1197,7 @@ function parseModelDomain() {
1186
1197
  noticeAutoCompactAboveWindow("cheap", "MODEL_CHEAP_AUTO_COMPACT_TOKENS", cheapModel);
1187
1198
  }
1188
1199
  const models = envLaneTable(modelId, model, cheapModel);
1200
+ const contextWindowSources = Object.fromEntries(Object.entries(envLaneTable(modelId, { id: model.id, source: mainWindow.source }, cheapModel !== undefined ? { id: cheapModel.id, source: cheapWindow.source } : undefined)).map(([name, slot]) => [name, slot.source]));
1189
1201
  const gatewayApiKey = route.gatewayApiKey;
1190
1202
  if (gatewayBaseUrl === undefined && declaredCredential(gatewayApiKey) !== undefined) {
1191
1203
  CONFIG_NOTICES.push({
@@ -1241,7 +1253,9 @@ function parseModelDomain() {
1241
1253
  },
1242
1254
  model,
1243
1255
  envModel: model,
1256
+ envModelContextWindowSource: mainWindow.source,
1244
1257
  models,
1258
+ contextWindowSources,
1245
1259
  modelApiKeyEnv: {},
1246
1260
  modelApiKeys: {},
1247
1261
  modelRefusals: {},
@@ -1980,12 +1994,7 @@ function parseAuthDomain(ctx) {
1980
1994
  const principalJwtIss = process.env.PRINCIPAL_JWT_ISS || undefined;
1981
1995
  const principalJwtAud = process.env.PRINCIPAL_JWT_AUD || undefined;
1982
1996
  const principalJwtMaxTtlSec = parseNumOrFailNonNegative("PRINCIPAL_JWT_MAX_TTL_SEC", env("PRINCIPAL_JWT_MAX_TTL_SEC", "120"));
1983
- const authTokens = Object.fromEntries((process.env.SERVICE_AUTH_TOKENS ?? "")
1984
- .split(",")
1985
- .map((s) => s.trim())
1986
- .filter((s) => s.includes("="))
1987
- .map((s) => [s.slice(0, s.indexOf("=")).trim(), s.slice(s.indexOf("=") + 1).trim()])
1988
- .filter(([tok, sys]) => tok.length > 0 && sys.length > 0));
1997
+ const authTokens = parseServiceAuthTokens(process.env.SERVICE_AUTH_TOKENS);
1989
1998
  return {
1990
1999
  bindHost: process.env.BIND_HOST || undefined,
1991
2000
  bindHostSource: process.env.BIND_HOST ? "BIND_HOST" : undefined,
@@ -2028,6 +2037,7 @@ function parseOrchestrationDomain(ctx) {
2028
2037
  const lspHostEnabled = boolEnv("LSP_HOST_ENABLED", true);
2029
2038
  const autoBackgroundOnTimeout = boolEnv("AUTO_BACKGROUND_ON_TIMEOUT", true);
2030
2039
  const lspEnvAllow = parseEnvNameAllowlist("LSP_ENV_ALLOW", singleUserTurnkey) ?? [];
2040
+ const hookEnvAllow = parseEnvNameAllowlist("HOOK_ENV_ALLOW", singleUserTurnkey) ?? [];
2031
2041
  const declaredLane = declaredExecutionLane(process.env.REMOTE_EXEC);
2032
2042
  const readFaceFacts = process.env.READ_FACE !== undefined
2033
2043
  ? { readFace: enumEnv("READ_FACE", "roots", ["open", "roots"]), readFaceSource: "env" }
@@ -2203,6 +2213,7 @@ function parseOrchestrationDomain(ctx) {
2203
2213
  lspHostEnabled,
2204
2214
  autoBackgroundOnTimeout,
2205
2215
  lspEnvAllow,
2216
+ hookEnvAllow,
2206
2217
  workflowAgentsReadOnly: boolEnv("WORKFLOW_AGENTS_READONLY", false),
2207
2218
  imageBakes: {
2208
2219
  enabled: boolEnv("IMAGE_BAKES_ENABLED", false),
@@ -2619,11 +2630,11 @@ function parseA2aServeAudience(v, at) {
2619
2630
  }
2620
2631
  const STORE_GROUP_KEYS = [
2621
2632
  "sessionBackend", "sessionCacheTtlSec", "storeProbeIntervalMs", "storeLockWaitMs", "dbBackend", "dbBackendExplicit", "localDataRoot", "sealedKeyDir",
2622
- "runStoreStrictHydrate",
2633
+ "runStoreStrictHydrate", "localStoreDurability",
2623
2634
  "tidb", "pg", "dbQueryTimeoutMs", "snapshotBlobStore", "snapshotBlobSqlMaxBytes", "snapshotBlobAllowSql", "fileHistory", "fileHistoryCapture", "sendUserFile",
2624
2635
  ];
2625
2636
  const MODEL_PLANE_GROUP_KEYS = [
2626
- "gatewayBaseUrl", "gatewayApiKey", "gatewayFallbackUrls", "gatewayMaxRetries", "anthropic", "resilience", "model", "envModel", "models",
2637
+ "gatewayBaseUrl", "gatewayApiKey", "gatewayFallbackUrls", "gatewayMaxRetries", "anthropic", "resilience", "model", "envModel", "envModelContextWindowSource", "models", "contextWindowSources",
2627
2638
  "modelApiKeyEnv", "modelApiKeys", "modelRefusals", "droppedCatalogEntries", "modelQuotaWeights", "tiers", "projects", "roles", "atMention", "cascadeLadder", "degrade",
2628
2639
  ];
2629
2640
  const APPROVAL_GROUP_KEYS = [
@@ -2650,7 +2661,7 @@ const ORCHESTRATION_GROUP_KEYS = [
2650
2661
  "workflowOrphanGraceMs", "workflowJournalRetentionMs", "workflowRunRetentionMs", "usageWindows", "workflowAgentsReadOnly",
2651
2662
  "workflowSizeGuideline", "backgroundAgentRetentionMs", "backgroundAgentStaleRunningMs", "backgroundAgentStallMs",
2652
2663
  "backgroundAgentParkClaimStaleMs", "delegationEntryCaps", "rosterRetentionMs", "leaderRunStaleMs", "scratchpadSweepTtlMs", "sandboxPkgSource", "sandboxPkgSourceCustom",
2653
- "sessionAutoTitle", "sessionAutoTitleSource", "selectEnvironmentTool", "envFactsEnabled", "toolDeferLongtail", "lspHostEnabled", "lspEnvAllow", "autoBackgroundOnTimeout",
2664
+ "sessionAutoTitle", "sessionAutoTitleSource", "selectEnvironmentTool", "envFactsEnabled", "toolDeferLongtail", "lspHostEnabled", "lspEnvAllow", "hookEnvAllow", "autoBackgroundOnTimeout",
2654
2665
  "imageBakes", "readFace", "readFaceSource", "taskWriteFaceEscalation", "readDenyPatterns", "readDenyBuiltinTiers", "readDenyBuiltinExclude", "readDenyFloorRequired", "sandboxReadFloor",
2655
2666
  "agentConfigDir", "configLkgPath", "configLkgEnabled",
2656
2667
  ];
@@ -0,0 +1,31 @@
1
+ /**
2
+ * 「这只模型的窗是假定的」运维通告的**唯一发声器**(行的形与事件名属 `model-context-window.ts` 的 `buildContextWindowAssumedNotice`)。
3
+ *
4
+ * ## 说什么
5
+ * **进程此刻服务的那张模型表**里,窗来源(`config.contextWindowSources`,与 `GET /v1/models` 行的 `contextWindowSource` 同一张表)是 `assumed` 的每只模型一行;
6
+ * 一个名每进程只说一次(同一份活配置一本账 —— 起服说过的名,目录落地 / 「无中心配置」档回到 env 表时不再说)。
7
+ *
8
+ * ## 在哪说(位置即判据,与「配了 $ 天花板但目录未定价」那一句同一条纪律)
9
+ * · 起服:模型表**定形之后**(装配第 2 段目录应用之后的不变量区末尾、run-local 配置源应用之后的同一位置)—— 不在 `loadConfig` 里说:那一拍只见 env 表,
10
+ * 目录随后在 boot 被采纳时 env 表整张不服务,在那里说就是对一只不会服务的模型报警(行里还会说 `GET /v1/models` 有它的行,而那一行并不存在)。
11
+ * · 运行中:每次模型面 commit 之后(目录换代、迟到的 boot 目录、「无中心配置」档回到 env 表 —— `applyEffective` 一处)。
12
+ * 严格名册布防时 env 表是占位、从不被派发(`isRosterGateArmed`;路由判官对它豁免的同一个事实)⇒ env 表在服时不说。
13
+ *
14
+ * ## 哪些名
15
+ * 别名(`default` 与某个本名指向同一只模型)不另说;目录里真有一条**叫** `default` 的条目(不是别名)照说。
16
+ */
17
+ import type { Model } from "@sema-agent/core";
18
+ import { type ContextWindowSource } from "./model-context-window.js";
19
+ /** 发声器读的那几格活配置(结构子集;`ServiceConfig` 满足)。 */
20
+ export interface AssumedWindowView {
21
+ readonly model: Model;
22
+ readonly envModel: Model;
23
+ readonly models: Readonly<Record<string, Model>>;
24
+ readonly contextWindowSources: Readonly<Record<string, ContextWindowSource>>;
25
+ }
26
+ export declare function warnAssumedContextWindows(config: AssumedWindowView, logger: {
27
+ warn(event: string, fields?: Record<string, unknown>): void;
28
+ } | undefined, opts: {
29
+ readonly envTableIsPlaceholder: boolean;
30
+ }): void;
31
+ //# sourceMappingURL=context-window-notice.d.ts.map
@@ -0,0 +1,28 @@
1
+ import { buildContextWindowAssumedNotice } from "./model-context-window.js";
2
+ import { DEFAULT_MODEL_REF, servedModelTableLeg } from "./model-select.js";
3
+ const assumedWindowNamesSaid = new WeakMap();
4
+ export function warnAssumedContextWindows(config, logger, opts) {
5
+ if (logger === undefined)
6
+ return;
7
+ const leg = servedModelTableLeg(config);
8
+ if (leg === "env" && opts.envTableIsPlaceholder)
9
+ return;
10
+ const said = assumedWindowNamesSaid.get(config) ?? new Set();
11
+ assumedWindowNamesSaid.set(config, said);
12
+ const named = new Set(Object.entries(config.models).filter(([name]) => name !== DEFAULT_MODEL_REF).map(([, m]) => m));
13
+ for (const [name, m] of Object.entries(config.models)) {
14
+ if (name === DEFAULT_MODEL_REF && named.has(m))
15
+ continue;
16
+ if (said.has(name) || config.contextWindowSources[name] !== "assumed")
17
+ continue;
18
+ said.add(name);
19
+ const declareAt = leg === "catalog"
20
+ ? "the catalog entry's contextWindow (or MODEL_CONTEXT_WINDOW, which every entry without one inherits)"
21
+ : m === config.envModel
22
+ ? "MODEL_CONTEXT_WINDOW"
23
+ : "MODEL_CHEAP_CONTEXT_WINDOW (or MODEL_CONTEXT_WINDOW, which the cheap slot inherits)";
24
+ const notice = buildContextWindowAssumedNotice({ model: name, window: m.contextWindow, declareAt });
25
+ logger.warn(notice.event, notice.fields);
26
+ }
27
+ }
28
+ //# sourceMappingURL=context-window-notice.js.map
@@ -58,15 +58,12 @@ export interface PathAdjudication {
58
58
  * `task-settings.ts` 的 `FsWriteGateWiring.taskHome`。 */
59
59
  readonly taskHome?: string;
60
60
  }
61
- /** [ref]([ref] 案二):durable 部署上的 AskUserQuestion 门的活体面探针(QuestionCoordinator 的切面)。 */
62
- export interface LiveQuestionFace {
63
- hasLiveContext(): boolean;
64
- }
65
61
  /**
66
62
  * [ref] —— 审批基线的**席**:这条腿上「一个名单产的 `ask` 由谁来服」。闭集三形,每条腿**显式**说出自己那一形
67
63
  * ({@link createApprovalBaselinePolicy} 的席参数必填、按 `kind` 穷举 —— 闭集 +1 = 编译红):
68
- * · `durable` —— checkpoint suspend/resume 服 ask(HTTP 腿 durable 开、park 赎回腿)。AskUserQuestion 的问答门
69
- * **只**叠在这一形上(它的 `ask` 语义就是 durable park)。
64
+ * · `durable` —— checkpoint suspend/resume 服 ask(HTTP 腿 durable 开、park 赎回腿)。core 的问答策略
65
+ * (`createDurableQuestionPolicy()`,原形逐字)**只**叠在这一形上:它对引擎的问题工具答 `ask`,落点归 core 的同步优先
66
+ * (有问题席 ⇒ 先投卡、席在窗内拿到答即交答;没拿到 ⇒ 停驻 —— 卡由活面呈出而窗走完的那一问除外:席抛,引擎的投递失败臂不停驻)。
70
67
  * · `live` —— Runner 的活 onAsk 席当场服 ask(run-local 的 `createLocalApprover`:TTY 问 y/N / 无 TTY 当场拒;
71
68
  * core `isLiveApproverSeat(onAsk)` 为真时 `suspendAsk` 早退,ask 落回调)。三张名单与 durable 席**同一只**策略。
72
69
  * · `absent` —— 没有谁服 ask ⇒ adjudicated allow-all;**只**服务零名单(HTTP 腿「durable 关 ∧ 单用户零意图」)。
@@ -79,11 +76,9 @@ export interface LiveQuestionFace {
79
76
  export type ApprovalSeat = DurableApprovalSeat | LiveApprovalSeat | AbsentApprovalSeat;
80
77
  /** 席的形名(补偿 warn 等只需要「哪一形」的读者读它,不必铸整只席)。 */
81
78
  export type ApprovalSeatKind = ApprovalSeat["kind"];
82
- /** durable 席:checkpoint suspend/resume 服 ask,问答门叠在名单策略上。 */
79
+ /** durable 席:checkpoint suspend/resume 服 ask,core 的问答策略叠在名单策略上。 */
83
80
  export interface DurableApprovalSeat {
84
81
  readonly kind: "durable";
85
- /** 活体问答面;`undefined` ⇒ 恒 durable park 的原形门。 */
86
- readonly question: LiveQuestionFace | undefined;
87
82
  /** 本会话的「本会话放行」读面(部署名单那一问的站着的答案;铸点 `approval.ts` 的 `createSessionExemptionRead`)。缺席 = 这条腿没有会话 / 没有豁免店 ⇒ 名单照问。 */
88
83
  readonly exemption?: SessionExemptionRead;
89
84
  }
@@ -95,23 +90,6 @@ export interface LiveApprovalSeat {
95
90
  export interface AbsentApprovalSeat {
96
91
  readonly kind: "absent";
97
92
  }
98
- /**
99
- * [ref]([ref] 案二):durable 部署上的 AskUserQuestion 门。活体面(QuestionCoordinator)缺席 ⇒ 原形
100
- * `createDurableQuestionPolicy()`(恒 ask ⇒ 恒 durable park)。在场 ⇒ **判决时**按活流上下文分腿:
101
- * 活流腿(bg/SSE,coordinator.runWithContext 包裹且投递面此刻可达,ALS 判)allow——工具执行落到
102
- * RunnerDeps.onQuestion 的 coordinator,问正在 tail 流的活人;无活流腿(sync /v1/tasks、verify/cascade、
103
- * durable resume 驱动、断连后的 detach 腿)ask——durable park 原语义逐字保留([ref] 后无活流腿放行执行
104
- * 也不会产出空答:coordinator 无 ALS ctx ⇒ 冻结 `{kind:"unavailable"}`(src/question.ts),永不悬挂;
105
- * park 仍是把问题送到人面前的唯一那条腿,正当性不变、只是反事实前提换了)。
106
- * 「是不是引擎的问题工具」不在本层判:core 7.56.0 [ref] 起本门**组合** core 原形的答(它读调用的脸 —— 引擎挂载点 + 目录契约 id,不读名字;
107
- * 它答 `ask` ⇒ 是;本层只在那之上按活流分腿)。决断口的 pre-CAS 守卫(「批准问答必须带答」)仍按保留名读(core 同版「Not changed here」那一条)。
108
- * ⚠️ **单一属主**(复审 A2):AskUserQuestion 的 durable 判决只有这一处。任何需要「同参重建」这条判决的
109
- * 地方(main.ts 的 parkedReviveInheritedGate 父约束链)必须调本工厂,不得自折 core 原形——两份拷贝里
110
- * 只改一份正是本条 finding 的成因。**登记豁免一处**:leader worker 腿(src/leader/wire.ts provisionWorker)
111
- * 自折 core 原形——该腿无活体问答面可装且 leader 不 import boot 层(分层),core 原形+sentinel 即其完整
112
- * 语义;豁免注在彼处互指,接活体面之日必须并回本工厂。
113
- */
114
- export declare function createDurableQuestionGate(live: LiveQuestionFace | undefined): ToolPolicy;
115
93
  /**
116
94
  * 沙箱 lane 上**相对形**写目标的守卫补层用 env(codex 交叉复审 round1 finding 1,红先复现)。
117
95
  *
@@ -266,8 +244,9 @@ export declare function buildApprovalGrantNotice(config: {
266
244
  * `undefined`**:治理层是 tighten-only 的叠加层,没有基线可叠时它自己也产不出「门在场」这件事。
267
245
  *
268
246
  * 三形,按席穷举([ref],席的定义见 {@link ApprovalSeat}):
269
- * · `durable` ⇒ AskUserQuestion 判决门 + 三张名单的审批门(deny/neverAuto/预算/本会话的豁免行全在
270
- * `createDurableAskPolicy` 里)。gated `ask` 由 core 变成 durable checkpoint suspend。
247
+ * · `durable` ⇒ core 的问答策略(原形逐字,不包)+ 三张名单的审批门(deny/neverAuto/预算/本会话的豁免行全在
248
+ * `createDurableAskPolicy` 里)。gated `ask` 由 core 变成 durable checkpoint suspend;问题族的 `ask` 先过 core 的同步优先
249
+ * (问题席在窗内拿到答 ⇒ 交答;没拿到 ⇒ 停驻;活面呈出而窗走完 ⇒ 投递失败臂)—— 「有没有人」本口不预判,唯一判官是那一次投递的结局。
271
250
  * · `live` ⇒ **同一只**三张名单审批门,不叠问答门。gated `ask` 由 core 交给 Runner 的活 onAsk 席
272
251
  * (本口**不**做 ask→deny 映射:无人可问时的拒由那只席说,判据与文案都归它)。
273
252
  * · `absent` ⇒ **adjudicated allow-all**(`createAllowDenyPolicy({})`):一条**在场的**、
@@ -1,19 +1,6 @@
1
1
  import { join, posix } from "node:path";
2
2
  import { FileError, StubExecutionEnv, combinePolicies, createAllowDenyPolicy, createDurableQuestionPolicy, createSensitivePathPolicy, createTranscriptIntegrityPolicy, err, isAbsoluteForFamily, isProtectedWrite, ok, pathTargetValue, protectivePathTargetOf, } from "@sema-agent/core";
3
3
  import { createDurableAskPolicy, hasApprovalListIntent } from "./approval.js";
4
- export function createDurableQuestionGate(live) {
5
- const durable = createDurableQuestionPolicy();
6
- if (live === undefined)
7
- return durable;
8
- return {
9
- async check(req) {
10
- const answer = await durable.check(req);
11
- if (answer.action !== "ask")
12
- return answer;
13
- return live.hasLiveContext() ? { action: "allow" } : answer;
14
- },
15
- };
16
- }
17
4
  export const SANDBOX_TREE_FAMILY = "posix";
18
5
  function writeTargetFormOf(req) {
19
6
  if (!isProtectedWrite(req))
@@ -125,7 +112,7 @@ export function buildApprovalGrantNotice(config) {
125
112
  export function createApprovalBaselinePolicy(config, seat) {
126
113
  switch (seat.kind) {
127
114
  case "durable":
128
- return combinePolicies(createDurableQuestionGate(seat.question), createApprovalListPolicy(config, seat.exemption));
115
+ return combinePolicies(createDurableQuestionPolicy(), createApprovalListPolicy(config, seat.exemption));
129
116
  case "live":
130
117
  return createApprovalListPolicy(config, undefined);
131
118
  case "absent":
@@ -105,36 +105,45 @@ export declare const DEPLOYMENT_SHAPE_PREDICATES: Readonly<{
105
105
  principalRequired: DeploymentShapePredicate<"principal">;
106
106
  /**
107
107
  * 「这台部署有没有身份边界」的问法 —— 有 = 请求里有东西替主体作保或拦在门外:声明了 `REQUIRE_PRINCIPAL`,或配置接了任一已验身份来源
108
- * (service 凭据 / 鉴权桥 issuer,含中心回退 / 直连门),或声明了只读 trace 凭据。没有 = dev-open:主体头是谁都能自报的标签。
108
+ * (service 凭据 / 鉴权桥 issuer,含中心回退 / 直连门),或声明了只读 trace 凭据。没有 = dev-open:主体头是谁都能自报的(不是认证;报了它的请求仍为那位主体)。
109
109
  * 只读配置(验签器在起服第 9 段按同一个配置读数建 ⇒「验签器在场」≡「配置里有桥」),所以先于验签器的起服段(第 3 段的一次性迁移)与请求面读到同一个答案。
110
- * 读者:请求面的 dev-open 判据(`http/principal-gate.ts` 的 `devOpenDeployment`:属主存取器的 fleet 一格与 `/metrics` 族的免凭据臂)、
110
+ * 读者:请求面的 dev-open 判据(`http/principal-gate.ts` 的 `devOpenDeployment`,`actsForDeployment` 的一臂:不报主体的调用方在属主存取器的 fleet 一格与 `/metrics` 族上代部署本人)、
111
111
  * 一次性迁移 M48 的输入(`plugins/store-backend.ts`:有边界 ⇒ 不改写哨兵属主)。
112
112
  */
113
- identityBoundary: DeploymentShapePredicate<"identity" | "principal">;
113
+ identityBoundary: DeploymentShapePredicate<"principal" | "identity">;
114
114
  /**
115
115
  * 租户轴的问法。今天与 {@link DEPLOYMENT_SHAPE_PREDICATES.principalRequired} 读**同一个声明**([ref] ①:托管 / 多租 ⇔ `REQUIRE_PRINCIPAL=true`,
116
116
  * 签发方配置是身份验签轴、不算租户证据)—— 两个问题、一根轴、一个读口;「鉴权必需」与「多租形」拆成两个声明时只改这一行的判官。
117
117
  */
118
118
  multiTenant: DeploymentShapePredicate<"principal">;
119
119
  /** 读能力表 `callerCwd` 位(host = 单主才开;device = 路径落在发起者自己的设备上,归属由根会话行执行格上的设备绑定验过,不要求单主)。 */
120
- callerCwd: DeploymentShapePredicate<"lane" | "principal">;
120
+ callerCwd: DeploymentShapePredicate<"principal" | "lane">;
121
121
  /** 调用方给的宿主绝对路径(附加目录 / 项目上下文 / 本机 SendUserFile / 指令文件探针)只在「手就在本 worker 的盘上 ∧ 单主」时指向调用方自己的东西;
122
- * 本机语言服务器(`createLspManager`:本机子进程、在 worker 盘上找根)同问这一句,读这一行 × `LSP_HOST_ENABLED`。 */
123
- callerOwnsWorkerDisk: DeploymentShapePredicate<"lane" | "principal">;
122
+ * 本机语言服务器(`createLspManager`:本机子进程、在 worker 盘上找根)同问这一句,读这一行 × `LSP_HOST_ENABLED`。
123
+ * local 店的声明(`local-store-declaration.ts` 的 `localStoreDeclarationOf`)同问这一句:店的数据根就在这块盘上,盘是调用方自己的且易失 ⇒ 部署不替他声明它活过替换。 */
124
+ callerOwnsWorkerDisk: DeploymentShapePredicate<"principal" | "lane">;
124
125
  /** wire `executionLane.toolsOnThisHost` 与出厂 / 中心技能的 `baseDir`:只问文件系统同一性,与租户无关(出厂内容每个租户拿到同一份)。 */
125
126
  toolsOnThisHost: DeploymentShapePredicate<"lane">;
126
127
  /** 无手形(声明 `none`;判据读执行环境块 `io`,不点名车道词)且单主:进程级消费者(hooks 命令、项目上下文本机读、卡批规则 root)看到的就是引擎自己的进程 cwd / env。 */
127
- noHandsSingleUser: DeploymentShapePredicate<"lane" | "principal">;
128
+ noHandsSingleUser: DeploymentShapePredicate<"principal" | "lane">;
128
129
  /** 任务层替部署声明宿主姿态(bypassPermissions 开写面 / host shell 继承整份环境)的射程:device 车道上跨租户宿主穿越结构性不存在(clay 裁定③)。 */
129
- taskHostPostureDeclarations: DeploymentShapePredicate<"lane" | "principal">;
130
+ taskHostPostureDeclarations: DeploymentShapePredicate<"principal" | "lane">;
130
131
  /** 写门走代理裁决(执行环境块 `hostLocalPaths` 为假:路径不是本 worker 盘上的文件);认不出的词 ⇒ 走代理(代理 slot 空 ⇒ 写门 fail-closed)。 */
131
132
  sandboxPathAdjudication: DeploymentShapePredicate<"lane">;
132
133
  /** 读能力表 `sandboxSendUserFile` 位(e2b / k8s 每任务一只沙箱 ⇒ 任何租户;ssh 共享一台真机 ⇒ 只单主)。 */
133
- sandboxSendUserFile: DeploymentShapePredicate<"lane" | "principal">;
134
+ sandboxSendUserFile: DeploymentShapePredicate<"principal" | "lane">;
134
135
  /** 读能力表 `remoteScratchpad` 位(`/tmp/scratchpad/<sessionId>` 远端约定)。 */
135
136
  remoteScratchpad: DeploymentShapePredicate<"lane">;
137
+ /**
138
+ * 读能力表 `backgroundShell` 位 —— 「这条车道的执行环境能不能开后台 shell(`run_in_background` / `BashOutput` / `KillShell`),含把运行中的前台命令领养成后台任务」的**唯一**答者:
139
+ * e2b / k8s 每任务一只沙箱 ⇒ 任何租户;host(命令落在 worker 宿主上的同一张进程表)⇒ 只单主;其余车道(含 none)没有后台 shell;认不出的车道 ⇒ 否。
140
+ * 读者(同读这一行,没有第二份判别式):三只声明后台 shell 的适配器的 `backgroundCapabilities`(`supported` 与 `supportsDetach` 是同一个答案)、
141
+ * host 适配器的装配点(`boot/execution-env.ts` / `run-local.ts` 把行的答案交给适配器的 `backgroundShell`)、能力事实 `autoBackgroundOnTimeout`(`/health.autoBackgroundOnTimeout`)。
142
+ * 全局关停开关 `HOST_BG_ENABLED` 不在行里 —— 它是旋钮不是部署形,host 适配器与事实在行之上各合取一次。
143
+ */
144
+ backgroundShell: DeploymentShapePredicate<"principal" | "lane">;
136
145
  /** 读能力表 `tenantSeparation` 位(值来自 settings-schema 车道词表正本);唯一读者 = 跨域不变量 `multi-tenant-shared-lane`。 */
137
- laneSeparatesTenants: DeploymentShapePredicate<"lane" | "principal">;
146
+ laneSeparatesTenants: DeploymentShapePredicate<"principal" | "lane">;
138
147
  /**
139
148
  * [ref] —— **VM 级**隔离强度(独立内核:e2b 的 Firecracker microVM;k8s 只在 Kata / gVisor 运行时类上)。与执行环境块 `isolation` 键
140
149
  * (OS 级边界,容器即算;wire `executionLane.isolated` 的属主 `laneIsolated`)是两个问题,所以不叫「isolated」。读者:A 值路由。
@@ -157,7 +166,7 @@ export declare const DEPLOYMENT_SHAPE_PREDICATES: Readonly<{
157
166
  * · `none`:没有执行环境(能力事实先判无手车道,这里照样表态)。
158
167
  * 读者:能力事实 `sessionRewindFiles`(能力位与该口的 501 同读这一行)。
159
168
  */
160
- rewindableWorkspace: DeploymentShapePredicate<"lane" | "principal">;
169
+ rewindableWorkspace: DeploymentShapePredicate<"principal" | "lane">;
161
170
  }>;
162
171
  export {};
163
172
  //# sourceMappingURL=deployment-shape.d.ts.map
@@ -63,6 +63,7 @@ export const DEPLOYMENT_SHAPE_PREDICATES = Object.freeze({
63
63
  sandboxPathAdjudication: createPredicate(["lane"], "车道:写门的路径事实要经代理到执行环境里取(文件平面不在本 worker 盘上;认不出的车道也走代理)。", ({ lane }) => lane.block === undefined || !lane.block.hostLocalPaths),
64
64
  sandboxSendUserFile: createPredicate(["lane", "principal"], "车道 × 租户:SendUserFile 的沙箱直传腿可以挂(沙箱盘 = 租户自己的任务工作区,或共享真机上的单主部署)。", ({ lane, principal }) => lane.caps !== undefined && capabilityHolds(lane.caps.sandboxSendUserFile, principal)),
65
65
  remoteScratchpad: createPredicate(["lane"], "车道:执行环境里按会话分的远端 scratchpad 约定适用。", ({ lane }) => lane.caps !== undefined && lane.caps.remoteScratchpad === "supported"),
66
+ backgroundShell: createPredicate(["lane", "principal"], "车道 × 租户:本车道的执行环境可以开后台 shell(含领养运行中的前台命令)—— e2b / k8s 任何租户,host 只单主,其余车道没有。", ({ lane, principal }) => lane.caps !== undefined && capabilityHolds(lane.caps.backgroundShell, principal)),
66
67
  laneSeparatesTenants: createPredicate(["lane", "principal"], "车道 × 租户:这条车道在这台部署上不让两个租户的命令落在同一个共享目标上(单主部署恒成立;认不出的车道不成立)。", ({ lane, principal }) => lane.caps !== undefined && capabilityHolds(lane.caps.tenantSeparation, principal)),
67
68
  vmIsolatedHands: createPredicate(["lane"], "车道 / 隔离强度:手跑在 VM 级边界里(独立内核);runc / 共享内核 / 真机 / 认不出 ⇒ 否。", ({ lane }) => {
68
69
  if (lane.lane === "e2b")
@@ -209,6 +209,7 @@ export interface DeviceWsHub {
209
209
  declaredSupports(deviceId: string): ReadonlySet<DeviceInstructionKind> | undefined;
210
210
  close(): Promise<void>;
211
211
  }
212
+ export declare const DEVICE_MAX_PAYLOAD_PART_BYTES: number;
212
213
  /** per-remote 帽键的来源(闭集;指标 `device_preauth_key_total{source}` 与 cap-hit 行 `keySource` 同一张表)。 */
213
214
  export declare const DEVICE_PREAUTH_KEY_SOURCES: readonly ["socket", "xff", "fallback"];
214
215
  export type DevicePreAuthKeySource = (typeof DEVICE_PREAUTH_KEY_SOURCES)[number];