@sema-agent/server 7.147.0 → 7.149.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (790) hide show
  1. package/MIGRATION.md +1468 -24
  2. package/README.md +35 -7
  3. package/README.zh-CN.md +18 -8
  4. package/USAGE.md +444 -193
  5. package/deploy/sema-up/README.md +16 -5
  6. package/deploy/sema-up/chart/templates/NOTES.txt +1 -1
  7. package/deploy/sema-up/chart/templates/_helpers.tpl +20 -4
  8. package/deploy/sema-up/chart/values.yaml +3 -2
  9. package/deploy/sema-up/cluster-up.sh +74 -176
  10. package/deploy/sema-up/kube-up.sh +29 -49
  11. package/deploy/sema-up/lib/chart-run.sh +23 -0
  12. package/deploy/sema-up/lib/dataroot.sh +3 -3
  13. package/deploy/sema-up/lib/health.sh +62 -13
  14. package/deploy/sema-up/lib/helm-values-cluster.py +18 -0
  15. package/deploy/sema-up/lib/helm-values-kube.py +35 -0
  16. package/deploy/sema-up/lib/regcred.py +8 -0
  17. package/deploy/sema-up/lib/remote/helm-install.sh +3 -0
  18. package/deploy/sema-up/lib/remote/image-import.sh +6 -0
  19. package/deploy/sema-up/lib/remote/machine-precheck.sh +11 -0
  20. package/deploy/sema-up/lib/remote/region-probe.sh +3 -0
  21. package/deploy/sema-up/lib/remote/stack-ready.sh +26 -0
  22. package/deploy/sema-up/lib/remote/vxlan-guard.sh +8 -0
  23. package/deploy/sema-up/lib/render-stack.py +17 -0
  24. package/deploy/sema-up/lib/shell-text.sh +87 -0
  25. package/deploy/sema-up/lib/usage-flags.txt +10 -0
  26. package/deploy/sema-up/lib/usage-head.txt +1 -0
  27. package/deploy/sema-up/lib/usage-tail.txt +13 -0
  28. package/deploy/sema-up/preflight.sh +10 -8
  29. package/deploy/sema-up/sema-up.sh +14 -39
  30. package/deploy/sema-up/smoke.sh +7 -6
  31. package/deploy/sema-up/stack/compose.dataroot.yaml +3 -0
  32. package/deploy/sema-up/stack/compose.yaml +13 -1
  33. package/deploy/sema-up/stack/sema-stack-cluster.yaml +21 -0
  34. package/dist/adoption/plan.d.ts +24 -0
  35. package/dist/adoption/plan.js +53 -1
  36. package/dist/adoption/runner.d.ts +10 -1
  37. package/dist/adoption/runner.js +36 -16
  38. package/dist/approval-card.d.ts +36 -38
  39. package/dist/approval-gate-currency.js +3 -2
  40. package/dist/approval-leg-origin.d.ts +33 -0
  41. package/dist/approval-leg-origin.js +4 -0
  42. package/dist/approval-reconciler.d.ts +4 -13
  43. package/dist/approval-reconciler.js +2 -2
  44. package/dist/approval.d.ts +13 -11
  45. package/dist/approval.js +3 -3
  46. package/dist/audit.d.ts +10 -3
  47. package/dist/audit.js +15 -7
  48. package/dist/auth-bridge.d.ts +9 -15
  49. package/dist/auth-bridge.js +4 -11
  50. package/dist/auth-keys.d.ts +10 -1
  51. package/dist/auth-keys.js +8 -0
  52. package/dist/auto-mode-face.d.ts +10 -7
  53. package/dist/auto-mode-face.js +7 -4
  54. package/dist/background-agent-name.d.ts +19 -1
  55. package/dist/background-agent-name.js +12 -2
  56. package/dist/background-session-reap.d.ts +1 -1
  57. package/dist/bake-runner/main.js +9 -6
  58. package/dist/bench/s1/arms.js +6 -5
  59. package/dist/bench/s1/live-deps.js +5 -2
  60. package/dist/bench/s1/run-firm.js +6 -5
  61. package/dist/bind-host.d.ts +25 -0
  62. package/dist/bind-host.js +25 -0
  63. package/dist/boot/adoption.d.ts +3 -0
  64. package/dist/boot/adoption.js +1 -0
  65. package/dist/boot/deployment-mods.d.ts +1 -1
  66. package/dist/boot/execution-env.d.ts +17 -7
  67. package/dist/boot/execution-env.js +47 -42
  68. package/dist/boot/execution-lane.d.ts +6 -4
  69. package/dist/boot/execution-lane.js +3 -1
  70. package/dist/boot/exit-boundary.d.ts +2 -2
  71. package/dist/boot/exit-boundary.js +6 -5
  72. package/dist/boot/fatal-exit.d.ts +3 -5
  73. package/dist/boot/fatal-exit.js +2 -2
  74. package/dist/boot/leader.d.ts +15 -0
  75. package/dist/boot/leader.js +17 -15
  76. package/dist/boot/memory-consolidation.d.ts +37 -29
  77. package/dist/boot/memory-consolidation.js +11 -5
  78. package/dist/boot/org-delivery.d.ts +3 -2
  79. package/dist/boot/org-memory.js +1 -1
  80. package/dist/boot/parked-revive-gate.js +2 -2
  81. package/dist/boot/reapers.d.ts +4 -3
  82. package/dist/boot/reapers.js +19 -16
  83. package/dist/boot/resolve-spec.d.ts +5 -3
  84. package/dist/boot/resolve-spec.js +60 -70
  85. package/dist/boot/retention-lane.d.ts +4 -4
  86. package/dist/boot/retention-lane.js +2 -2
  87. package/dist/boot/runner-deps.d.ts +28 -7
  88. package/dist/boot/runner-deps.js +14 -5
  89. package/dist/boot/runtime-caps.d.ts +2 -2
  90. package/dist/boot/runtime-caps.js +16 -2
  91. package/dist/boot/session-faces.d.ts +16 -7
  92. package/dist/boot/session-faces.js +114 -94
  93. package/dist/boot/shutdown.d.ts +5 -4
  94. package/dist/boot/shutdown.js +6 -4
  95. package/dist/boot/stage-01-config.d.ts +1 -0
  96. package/dist/boot/stage-01-config.js +13 -4
  97. package/dist/boot/stage-02-web-admin-pull.d.ts +2 -0
  98. package/dist/boot/stage-02-web-admin-pull.js +16 -3
  99. package/dist/boot/stage-03-store-backend.d.ts +4 -0
  100. package/dist/boot/stage-03-store-backend.js +4 -3
  101. package/dist/boot/stage-04-stores.d.ts +3 -0
  102. package/dist/boot/stage-04-stores.js +2 -2
  103. package/dist/boot/stage-05-execution-env.d.ts +8 -3
  104. package/dist/boot/stage-05-execution-env.js +2 -2
  105. package/dist/boot/stage-06-runners.d.ts +12 -13
  106. package/dist/boot/stage-06-runners.js +23 -15
  107. package/dist/boot/stage-07-capability-layer.d.ts +13 -9
  108. package/dist/boot/stage-07-capability-layer.js +5 -3
  109. package/dist/boot/stage-08-reapers.d.ts +13 -9
  110. package/dist/boot/stage-08-reapers.js +3 -3
  111. package/dist/boot/stage-09-leader.d.ts +14 -16
  112. package/dist/boot/stage-09-leader.js +12 -4
  113. package/dist/boot/stage-10-http-server.d.ts +14 -16
  114. package/dist/boot/stage-10-http-server.js +7 -4
  115. package/dist/boot/store-evidence.d.ts +20 -0
  116. package/dist/boot/store-evidence.js +13 -0
  117. package/dist/boot/stores.d.ts +6 -0
  118. package/dist/boot/stores.js +41 -27
  119. package/dist/boot/task-list-lane.d.ts +4 -4
  120. package/dist/boot/web-admin.d.ts +4 -2
  121. package/dist/boot/web-admin.js +55 -35
  122. package/dist/boot/webfetch-summarize-lane.d.ts +1 -1
  123. package/dist/boot-reclaim.d.ts +3 -1
  124. package/dist/boot-reclaim.js +1 -1
  125. package/dist/brain.d.ts +7 -18
  126. package/dist/brain.js +5 -17
  127. package/dist/budget.js +6 -6
  128. package/dist/capabilities/center-plugins.d.ts +7 -1
  129. package/dist/capabilities/center-plugins.js +32 -10
  130. package/dist/capabilities/center-wiring.js +1 -1
  131. package/dist/capabilities/composite-members.d.ts +2 -2
  132. package/dist/capabilities/composite-members.js +2 -2
  133. package/dist/capabilities/repo-tools.d.ts +2 -0
  134. package/dist/capabilities/repo-tools.js +14 -12
  135. package/dist/capabilities/scenarios.d.ts +6 -15
  136. package/dist/capabilities/scenarios.js +11 -16
  137. package/dist/capabilities/skills.d.ts +1 -1
  138. package/dist/capabilities/tool-defer.d.ts +1 -1
  139. package/dist/capability-facts.d.ts +39 -11
  140. package/dist/capability-facts.js +35 -7
  141. package/dist/card-settle-stored-scope.d.ts +56 -0
  142. package/dist/card-settle-stored-scope.js +27 -0
  143. package/dist/card-void.d.ts +8 -13
  144. package/dist/card-void.js +2 -7
  145. package/dist/center-credential-renewer.d.ts +6 -2
  146. package/dist/center-credential-renewer.js +7 -3
  147. package/dist/config-catalog.d.ts +28 -1
  148. package/dist/config-catalog.js +95 -85
  149. package/dist/config-dir-trust.d.ts +37 -4
  150. package/dist/config-dir-trust.js +88 -44
  151. package/dist/config-invariants.d.ts +43 -3
  152. package/dist/config-invariants.js +69 -5
  153. package/dist/config-lkg.d.ts +23 -1
  154. package/dist/config-lkg.js +17 -3
  155. package/dist/config-provider.d.ts +9 -9
  156. package/dist/config-provider.js +25 -110
  157. package/dist/config-pull-failure.d.ts +50 -0
  158. package/dist/config-pull-failure.js +48 -0
  159. package/dist/config-types.d.ts +62 -21
  160. package/dist/config.d.ts +14 -21
  161. package/dist/config.js +141 -64
  162. package/dist/context-window-notice.d.ts +31 -0
  163. package/dist/context-window-notice.js +28 -0
  164. package/dist/delegated-session-owner.d.ts +1 -1
  165. package/dist/deleted-session-ids.d.ts +3 -2
  166. package/dist/deployment-governance.d.ts +3 -3
  167. package/dist/deployment-shape.d.ts +46 -11
  168. package/dist/deployment-shape.js +8 -0
  169. package/dist/egress-redirect.d.ts +25 -7
  170. package/dist/egress-redirect.js +20 -2
  171. package/dist/elicitation.d.ts +6 -5
  172. package/dist/elicitation.js +23 -22
  173. package/dist/engine-identity.d.ts +28 -0
  174. package/dist/engine-identity.js +10 -0
  175. package/dist/entry-problems.d.ts +5 -7
  176. package/dist/entry-problems.js +1 -1
  177. package/dist/env-facts.js +2 -1
  178. package/dist/env-name-allowlist-knobs.d.ts +6 -5
  179. package/dist/env-name-allowlist-knobs.js +5 -0
  180. package/dist/env-witness.d.ts +7 -0
  181. package/dist/env-witness.js +16 -0
  182. package/dist/execution-lane-caps.d.ts +25 -23
  183. package/dist/execution-lane-caps.js +18 -26
  184. package/dist/execution-placement.d.ts +58 -18
  185. package/dist/execution-placement.js +41 -2
  186. package/dist/field-conflict.d.ts +7 -11
  187. package/dist/field-conflict.js +3 -3
  188. package/dist/file-history-capture.d.ts +3 -3
  189. package/dist/file-history-disclosure.js +1 -0
  190. package/dist/fleet/fleet-bus.d.ts +21 -3
  191. package/dist/fleet/fleet-bus.js +35 -25
  192. package/dist/fleet/fleet-reconciler.js +2 -2
  193. package/dist/fleet/serving-lease.js +3 -3
  194. package/dist/fleet-client.js +3 -3
  195. package/dist/fleet-lease.d.ts +0 -1
  196. package/dist/fleet-lease.js +4 -5
  197. package/dist/history-anchor.d.ts +23 -3
  198. package/dist/history-anchor.js +24 -4
  199. package/dist/hitl-delivery.d.ts +90 -0
  200. package/dist/hitl-delivery.js +98 -0
  201. package/dist/hooks/classic-stations.d.ts +8 -11
  202. package/dist/hooks/classic-stations.js +0 -7
  203. package/dist/hooks/command-spawn.d.ts +7 -2
  204. package/dist/hooks/command-spawn.js +13 -6
  205. package/dist/hooks/hook-llm.d.ts +5 -1
  206. package/dist/hooks/hook-llm.js +24 -15
  207. package/dist/hooks/hook-runner.d.ts +72 -57
  208. package/dist/hooks/hook-runner.js +271 -193
  209. package/dist/host-lsp-manager.d.ts +22 -8
  210. package/dist/host-lsp-manager.js +4 -1
  211. package/dist/http/active-run-conflict.d.ts +2 -43
  212. package/dist/http/active-run-conflict.js +3 -7
  213. package/dist/http/admission.d.ts +4 -18
  214. package/dist/http/admission.js +76 -79
  215. package/dist/http/approval-sweeps.d.ts +3 -3
  216. package/dist/http/approval-sweeps.js +56 -31
  217. package/dist/http/caller-trust.d.ts +8 -10
  218. package/dist/http/caller-trust.js +1 -2
  219. package/dist/http/claim-heartbeat.d.ts +49 -0
  220. package/dist/http/claim-heartbeat.js +46 -0
  221. package/dist/http/claimed-run.d.ts +16 -8
  222. package/dist/http/claimed-run.js +8 -0
  223. package/dist/http/dispatch.d.ts +8 -1
  224. package/dist/http/dispatch.js +78 -30
  225. package/dist/http/durable-run-leg.d.ts +11 -4
  226. package/dist/http/durable-run-leg.js +45 -21
  227. package/dist/http/execution-context.d.ts +122 -47
  228. package/dist/http/execution-context.js +135 -43
  229. package/dist/http/health-reader.d.ts +36 -0
  230. package/dist/http/health-reader.js +21 -0
  231. package/dist/http/health-self-report.d.ts +9 -9
  232. package/dist/http/health-self-report.js +4 -4
  233. package/dist/http/idempotency.d.ts +9 -5
  234. package/dist/http/idempotency.js +4 -4
  235. package/dist/http/memory-compliance-failure-reply.d.ts +15 -16
  236. package/dist/http/memory-compliance-failure-reply.js +4 -2
  237. package/dist/http/memory-face-fault-reply.d.ts +67 -0
  238. package/dist/http/memory-face-fault-reply.js +71 -0
  239. package/dist/http/memory-store-refusal-reply.d.ts +1 -1
  240. package/dist/http/memory-store-refusal-reply.js +3 -0
  241. package/dist/http/owner-access.d.ts +392 -67
  242. package/dist/http/owner-access.js +370 -35
  243. package/dist/http/principal-gate.d.ts +39 -89
  244. package/dist/http/principal-gate.js +26 -68
  245. package/dist/http/refusal-body.d.ts +35 -2
  246. package/dist/http/refusal-body.js +34 -0
  247. package/dist/http/request-guards.d.ts +9 -13
  248. package/dist/http/request-guards.js +34 -68
  249. package/dist/http/resume-composition.d.ts +37 -0
  250. package/dist/http/resume-composition.js +18 -0
  251. package/dist/http/resume-ctx-read.d.ts +46 -12
  252. package/dist/http/resume-ctx-read.js +31 -6
  253. package/dist/http/resume-legs.d.ts +54 -19
  254. package/dist/http/resume-legs.js +408 -196
  255. package/dist/http/retired-skill-manifest.d.ts +1 -1
  256. package/dist/http/route-ctx.d.ts +31 -32
  257. package/dist/http/routes/a2a-serve.d.ts +43 -5
  258. package/dist/http/routes/a2a-serve.js +60 -37
  259. package/dist/http/routes/admin-config-refresh.js +2 -2
  260. package/dist/http/routes/admin-drain.js +2 -2
  261. package/dist/http/routes/admin-memory-optout.js +4 -3
  262. package/dist/http/routes/adoption.d.ts +3 -0
  263. package/dist/http/routes/adoption.js +17 -10
  264. package/dist/http/routes/agents-roster.js +13 -7
  265. package/dist/http/routes/approvals-assistant.js +73 -67
  266. package/dist/http/routes/attachments.js +2 -2
  267. package/dist/http/routes/background.d.ts +3 -3
  268. package/dist/http/routes/background.js +9 -17
  269. package/dist/http/routes/capabilities.js +16 -19
  270. package/dist/http/routes/config-catalog.js +2 -2
  271. package/dist/http/routes/devices.d.ts +3 -3
  272. package/dist/http/routes/devices.js +4 -4
  273. package/dist/http/routes/diagnostics.d.ts +29 -3
  274. package/dist/http/routes/diagnostics.js +49 -18
  275. package/dist/http/routes/engine.js +2 -2
  276. package/dist/http/routes/fleet.js +5 -3
  277. package/dist/http/routes/images.js +10 -6
  278. package/dist/http/routes/leader.d.ts +7 -2
  279. package/dist/http/routes/leader.js +12 -3
  280. package/dist/http/routes/mcp-reconnect.d.ts +1 -1
  281. package/dist/http/routes/mcp-reconnect.js +7 -15
  282. package/dist/http/routes/memory-bundle.js +4 -7
  283. package/dist/http/routes/memory-compliance.js +4 -4
  284. package/dist/http/routes/memory-consolidation.js +6 -9
  285. package/dist/http/routes/memory-origin.d.ts +2 -0
  286. package/dist/http/routes/memory-origin.js +7 -8
  287. package/dist/http/routes/memory-policy.js +17 -12
  288. package/dist/http/routes/notify-wake.js +10 -19
  289. package/dist/http/routes/observability.js +3 -3
  290. package/dist/http/routes/principal-inbox.d.ts +4 -2
  291. package/dist/http/routes/principal-inbox.js +5 -4
  292. package/dist/http/routes/projects.d.ts +1 -1
  293. package/dist/http/routes/projects.js +3 -2
  294. package/dist/http/routes/retention-ops.js +6 -9
  295. package/dist/http/routes/rules.js +20 -5
  296. package/dist/http/routes/run-memory-capture.d.ts +2 -2
  297. package/dist/http/routes/run-memory-capture.js +6 -12
  298. package/dist/http/routes/run-permission-mode.d.ts +2 -2
  299. package/dist/http/routes/run-permission-mode.js +10 -17
  300. package/dist/http/routes/runs.js +155 -237
  301. package/dist/http/routes/session-memory-sync.d.ts +2 -2
  302. package/dist/http/routes/session-memory-sync.js +7 -13
  303. package/dist/http/routes/session-sync.d.ts +28 -7
  304. package/dist/http/routes/session-sync.js +63 -50
  305. package/dist/http/routes/sessions-list.d.ts +3 -3
  306. package/dist/http/routes/sessions-list.js +9 -9
  307. package/dist/http/routes/sessions.js +87 -124
  308. package/dist/http/routes/shared-memory.js +6 -6
  309. package/dist/http/routes/side-query.js +2 -2
  310. package/dist/http/routes/tasks.js +237 -187
  311. package/dist/http/routes/trace-usage.d.ts +0 -12
  312. package/dist/http/routes/trace-usage.js +40 -46
  313. package/dist/http/routes/workflows.d.ts +39 -4
  314. package/dist/http/routes/workflows.js +42 -14
  315. package/dist/http/run-concurrency-cap.d.ts +20 -12
  316. package/dist/http/run-concurrency-cap.js +39 -26
  317. package/dist/http/run-read-face.d.ts +3 -5
  318. package/dist/http/run-read-face.js +8 -13
  319. package/dist/http/send.d.ts +12 -3
  320. package/dist/http/send.js +42 -6
  321. package/dist/http/server.d.ts +43 -45
  322. package/dist/http/server.js +61 -11
  323. package/dist/http/sse-log.d.ts +17 -10
  324. package/dist/http/sse-log.js +7 -7
  325. package/dist/http/stored-body-replay.d.ts +12 -0
  326. package/dist/http/stored-body-replay.js +2 -2
  327. package/dist/http/submit-ctx.d.ts +17 -8
  328. package/dist/http/submit-ctx.js +8 -5
  329. package/dist/http/submit-replay.d.ts +19 -6
  330. package/dist/http/submit-replay.js +18 -6
  331. package/dist/http/sync-submit-body.d.ts +3 -4
  332. package/dist/http/sync-submit-body.js +4 -5
  333. package/dist/http/wire-types.d.ts +4 -3
  334. package/dist/identity-source.d.ts +36 -5
  335. package/dist/identity-source.js +27 -0
  336. package/dist/index.d.ts +4 -1
  337. package/dist/index.js +2 -0
  338. package/dist/key-resolver.d.ts +32 -0
  339. package/dist/key-resolver.js +23 -9
  340. package/dist/leader/diffup.js +2 -1
  341. package/dist/leader/endpoint.d.ts +26 -5
  342. package/dist/leader/endpoint.js +154 -14
  343. package/dist/leader/fanout.d.ts +3 -0
  344. package/dist/leader/fanout.js +78 -63
  345. package/dist/leader/leader.d.ts +16 -0
  346. package/dist/leader/leader.js +43 -3
  347. package/dist/leader/merge.d.ts +9 -1
  348. package/dist/leader/merge.js +16 -1
  349. package/dist/leader/repair-wire.js +1 -1
  350. package/dist/leader/wire.d.ts +36 -3
  351. package/dist/leader/wire.js +59 -18
  352. package/dist/leg-facts.d.ts +7 -2
  353. package/dist/leg-facts.js +1 -0
  354. package/dist/local-store-declaration.d.ts +54 -0
  355. package/dist/local-store-declaration.js +59 -0
  356. package/dist/lsp-evict.d.ts +6 -4
  357. package/dist/lsp-evict.js +2 -3
  358. package/dist/mcp-assertion-header.d.ts +1 -1
  359. package/dist/mcp-assertion-header.js +1 -1
  360. package/dist/memory-operator-faces.d.ts +5 -4
  361. package/dist/memory-operator-faces.js +1 -1
  362. package/dist/memory-project-layer.js +1 -1
  363. package/dist/memory-scope.d.ts +33 -6
  364. package/dist/memory-scope.js +68 -19
  365. package/dist/memory-store-refusal.d.ts +5 -2
  366. package/dist/memory-sync-client.d.ts +3 -2
  367. package/dist/memory-sync-client.js +8 -5
  368. package/dist/model-compat.d.ts +17 -8
  369. package/dist/model-compat.js +6 -2
  370. package/dist/model-context-window.d.ts +57 -0
  371. package/dist/model-context-window.js +21 -0
  372. package/dist/model-entry-headers.d.ts +46 -4
  373. package/dist/model-entry-headers.js +2 -2
  374. package/dist/model-entry-refusal.d.ts +40 -20
  375. package/dist/model-entry-refusal.js +57 -30
  376. package/dist/model-plane-face.d.ts +19 -11
  377. package/dist/model-plane-face.js +9 -1
  378. package/dist/model-plane-probe.d.ts +2 -0
  379. package/dist/model-plane-probe.js +17 -0
  380. package/dist/model-provider.d.ts +3 -3
  381. package/dist/model-reach-scope.d.ts +2 -1
  382. package/dist/model-route-endpoint.d.ts +9 -5
  383. package/dist/model-route-endpoint.js +29 -7
  384. package/dist/model-select.d.ts +16 -0
  385. package/dist/model-select.js +4 -0
  386. package/dist/mountinfo.d.ts +37 -0
  387. package/dist/mountinfo.js +47 -0
  388. package/dist/namespaced-rule-name.d.ts +23 -14
  389. package/dist/namespaced-rule-name.js +8 -11
  390. package/dist/net-address.d.ts +1 -1
  391. package/dist/observability/corrupt-read-seat.d.ts +4 -4
  392. package/dist/observability/corrupt-read-seat.js +5 -3
  393. package/dist/observability/fail-open.d.ts +72 -40
  394. package/dist/observability/fail-open.js +74 -40
  395. package/dist/observability/logger.d.ts +22 -1
  396. package/dist/observability/logger.js +89 -12
  397. package/dist/observability/metrics.js +4 -5
  398. package/dist/observability/otel-exporter.js +2 -1
  399. package/dist/observability/principal-context.d.ts +14 -7
  400. package/dist/observability/principal-context.js +8 -3
  401. package/dist/observability/run-terminal.d.ts +7 -1
  402. package/dist/observability/run-terminal.js +6 -2
  403. package/dist/observability/secret-env-scrub.d.ts +1 -1
  404. package/dist/observability/secret-env-scrub.js +1 -1
  405. package/dist/orchestration/hardened-vm-runner.d.ts +1 -0
  406. package/dist/orchestration/hardened-vm-runner.js +11 -5
  407. package/dist/orchestration/hardened-vm-worker-runner.d.ts +0 -14
  408. package/dist/orchestration/hardened-vm-worker-runner.js +5 -0
  409. package/dist/orchestration/hardened-vm-worker.js +2 -1
  410. package/dist/orchestration/workflow-completion-inbox.d.ts +3 -3
  411. package/dist/orchestration/workflow-completion-inbox.js +3 -2
  412. package/dist/org-delivery-gate.d.ts +36 -10
  413. package/dist/org-delivery-gate.js +12 -8
  414. package/dist/outbound-dispatcher.d.ts +1 -1
  415. package/dist/outbound-dispatcher.js +6 -12
  416. package/dist/owner-brands.d.ts +81 -0
  417. package/dist/owner-brands.js +42 -0
  418. package/dist/owner-faces.d.ts +532 -0
  419. package/dist/owner-faces.js +126 -0
  420. package/dist/park-row-commit.d.ts +67 -0
  421. package/dist/park-row-commit.js +76 -0
  422. package/dist/parked-decide.d.ts +76 -12
  423. package/dist/parked-decide.js +152 -11
  424. package/dist/parked-revive-surface.d.ts +14 -4
  425. package/dist/parked-revive-surface.js +5 -4
  426. package/dist/peer-directory.d.ts +7 -9
  427. package/dist/peer-directory.js +3 -2
  428. package/dist/permission-rule-vocab.d.ts +53 -8
  429. package/dist/permission-rule-vocab.js +30 -2
  430. package/dist/plugins/adoption-log-sql.d.ts +3 -25
  431. package/dist/plugins/adoption-log-sql.js +23 -21
  432. package/dist/plugins/approval-ask-retired-delete-by-task-m50.d.ts +7 -0
  433. package/dist/plugins/approval-ask-retired-delete-by-task-m50.js +17 -0
  434. package/dist/plugins/approval-ask-store-file.d.ts +18 -7
  435. package/dist/plugins/approval-ask-store-file.js +37 -14
  436. package/dist/plugins/approval-ask-store-memory.d.ts +12 -4
  437. package/dist/plugins/approval-ask-store-memory.js +24 -10
  438. package/dist/plugins/approval-ask-store-sql.d.ts +40 -21
  439. package/dist/plugins/approval-ask-store-sql.js +44 -15
  440. package/dist/plugins/approval-exemption-skill-cutoff.d.ts +64 -0
  441. package/dist/plugins/approval-exemption-skill-cutoff.js +122 -0
  442. package/dist/plugins/approval-exemption-skill-m46.d.ts +14 -0
  443. package/dist/plugins/approval-exemption-skill-m46.js +21 -0
  444. package/dist/plugins/approval-exemption-store.d.ts +32 -2
  445. package/dist/plugins/approval-exemption-store.js +42 -19
  446. package/dist/plugins/approval-nonce-store.d.ts +39 -12
  447. package/dist/plugins/approval-nonce-store.js +72 -23
  448. package/dist/plugins/blob-backend.d.ts +2 -0
  449. package/dist/plugins/blob-backend.js +9 -6
  450. package/dist/plugins/caching-session-store.d.ts +13 -1
  451. package/dist/plugins/caching-session-store.js +43 -4
  452. package/dist/plugins/checkpoint-index-columns.d.ts +32 -5
  453. package/dist/plugins/checkpoint-index-columns.js +36 -1
  454. package/dist/plugins/checkpoint-store-face.d.ts +83 -10
  455. package/dist/plugins/checkpoint-store-face.js +18 -1
  456. package/dist/plugins/device-store-sql.js +1 -0
  457. package/dist/plugins/ensure-index.d.ts +13 -1
  458. package/dist/plugins/ensure-index.js +154 -21
  459. package/dist/plugins/ensure-schema-lock-policy.d.ts +36 -18
  460. package/dist/plugins/ensure-schema-lock-policy.js +76 -9
  461. package/dist/plugins/file-run-store.d.ts +85 -32
  462. package/dist/plugins/file-run-store.js +177 -94
  463. package/dist/plugins/host-platform.d.ts +24 -3
  464. package/dist/plugins/host-platform.js +15 -1
  465. package/dist/plugins/image-bake-store-sql.js +2 -0
  466. package/dist/plugins/imported-layer-root-retirement.d.ts +2 -2
  467. package/dist/plugins/k8s-pod-reaper.d.ts +1 -3
  468. package/dist/plugins/k8s-pod-reaper.js +0 -1
  469. package/dist/plugins/leader-run-store-sql.d.ts +22 -0
  470. package/dist/plugins/leader-run-store-sql.js +34 -4
  471. package/dist/plugins/local-checkpoint-store.d.ts +62 -23
  472. package/dist/plugins/local-checkpoint-store.js +197 -77
  473. package/dist/plugins/local-data-dir-modes-m39.js +2 -1
  474. package/dist/plugins/local-data-root-admission.d.ts +52 -0
  475. package/dist/plugins/local-data-root-admission.js +100 -0
  476. package/dist/plugins/local-docker-capacity.d.ts +93 -0
  477. package/dist/plugins/local-docker-capacity.js +194 -0
  478. package/dist/plugins/local-docker-reaper.d.ts +92 -0
  479. package/dist/plugins/local-docker-reaper.js +102 -0
  480. package/dist/plugins/local-engine-high-water.d.ts +29 -6
  481. package/dist/plugins/local-engine-high-water.js +27 -19
  482. package/dist/plugins/local-session-store.d.ts +458 -140
  483. package/dist/plugins/local-session-store.js +906 -292
  484. package/dist/plugins/local-session-window.d.ts +3 -2
  485. package/dist/plugins/local-session-window.js +3 -2
  486. package/dist/plugins/local-sidecar-quarantine.js +3 -2
  487. package/dist/plugins/local-task-attachment-store.d.ts +18 -1
  488. package/dist/plugins/local-task-attachment-store.js +22 -1
  489. package/dist/plugins/memory-embedder.js +9 -7
  490. package/dist/plugins/memory-engine-pg.d.ts +3 -2
  491. package/dist/plugins/memory-engine-pg.js +14 -5
  492. package/dist/plugins/memory-engine-sql-apply.d.ts +8 -4
  493. package/dist/plugins/memory-engine-sql-apply.js +6 -8
  494. package/dist/plugins/memory-engine-tidb.d.ts +4 -2
  495. package/dist/plugins/memory-engine-tidb.js +11 -2
  496. package/dist/plugins/memory-optout-grant-store-sql.d.ts +1 -1
  497. package/dist/plugins/memory-optout-grant-store-sql.js +3 -3
  498. package/dist/plugins/memory-run-store.d.ts +53 -36
  499. package/dist/plugins/memory-run-store.js +116 -88
  500. package/dist/plugins/one-time-migration-marker.d.ts +26 -0
  501. package/dist/plugins/one-time-migration-marker.js +13 -0
  502. package/dist/plugins/one-time-migrations.d.ts +214 -47
  503. package/dist/plugins/one-time-migrations.js +481 -135
  504. package/dist/plugins/org-delivery-quota-store.d.ts +34 -11
  505. package/dist/plugins/org-delivery-quota-store.js +31 -15
  506. package/dist/plugins/permission-rule-store-file.d.ts +3 -3
  507. package/dist/plugins/permission-rule-store-sql.d.ts +5 -64
  508. package/dist/plugins/permission-rule-store-sql.js +11 -95
  509. package/dist/plugins/pg-pool.d.ts +2 -32
  510. package/dist/plugins/pg-pool.js +24 -17
  511. package/dist/plugins/remote-env-device.d.ts +3 -2
  512. package/dist/plugins/remote-env-e2b.d.ts +8 -32
  513. package/dist/plugins/remote-env-e2b.js +44 -32
  514. package/dist/plugins/remote-env-host.d.ts +51 -17
  515. package/dist/plugins/remote-env-host.js +111 -42
  516. package/dist/plugins/remote-env-k8s.d.ts +40 -45
  517. package/dist/plugins/remote-env-k8s.js +111 -60
  518. package/dist/plugins/remote-env-local-docker.d.ts +152 -15
  519. package/dist/plugins/remote-env-local-docker.js +352 -72
  520. package/dist/plugins/remote-scratchpad.js +4 -0
  521. package/dist/plugins/retention-deployment.d.ts +49 -17
  522. package/dist/plugins/retention-deployment.js +39 -8
  523. package/dist/plugins/run-preview-m45.d.ts +11 -0
  524. package/dist/plugins/run-preview-m45.js +19 -0
  525. package/dist/plugins/run-store-sql.d.ts +82 -75
  526. package/dist/plugins/run-store-sql.js +164 -125
  527. package/dist/plugins/s3-answer.d.ts +2 -1
  528. package/dist/plugins/sandbox-reaper.d.ts +26 -0
  529. package/dist/plugins/sandbox-reaper.js +2 -0
  530. package/dist/plugins/scenario-prefix-switch-m42.d.ts +56 -0
  531. package/dist/plugins/scenario-prefix-switch-m42.js +56 -0
  532. package/dist/plugins/scheduler-support.d.ts +16 -1
  533. package/dist/plugins/scheduler-support.js +22 -2
  534. package/dist/plugins/schema-consistency.d.ts +131 -14
  535. package/dist/plugins/schema-consistency.js +388 -18
  536. package/dist/plugins/schema-drift-sentence.d.ts +10 -6
  537. package/dist/plugins/schema-drift-sentence.js +15 -7
  538. package/dist/plugins/schema-ensure-legs.d.ts +9 -0
  539. package/dist/plugins/schema-ensure-legs.js +1 -1
  540. package/dist/plugins/schema-indexes.js +3 -0
  541. package/dist/plugins/schema-live-columns.d.ts +14 -5
  542. package/dist/plugins/schema-live-columns.js +10 -10
  543. package/dist/plugins/send-user-file.js +2 -1
  544. package/dist/plugins/session-birth.d.ts +37 -0
  545. package/dist/plugins/session-birth.js +38 -0
  546. package/dist/plugins/session-epoch-anchor.d.ts +40 -12
  547. package/dist/plugins/session-epoch-anchor.js +33 -11
  548. package/dist/plugins/session-ext-table.d.ts +27 -3
  549. package/dist/plugins/session-ext-table.js +19 -6
  550. package/dist/plugins/session-fork.d.ts +15 -1
  551. package/dist/plugins/session-fork.js +3 -0
  552. package/dist/plugins/session-ownership.d.ts +1 -1
  553. package/dist/plugins/session-placement.d.ts +27 -20
  554. package/dist/plugins/session-placement.js +15 -12
  555. package/dist/plugins/session-row-sql.d.ts +12 -0
  556. package/dist/plugins/session-row-sql.js +3 -3
  557. package/dist/plugins/session-run-rollup.d.ts +29 -0
  558. package/dist/plugins/session-run-rollup.js +40 -0
  559. package/dist/plugins/session-store-sql.d.ts +38 -12
  560. package/dist/plugins/session-store-sql.js +130 -30
  561. package/dist/plugins/session-withdraw-sql.d.ts +36 -0
  562. package/dist/plugins/session-withdraw-sql.js +42 -0
  563. package/dist/plugins/shared-memory-store-sql.d.ts +0 -69
  564. package/dist/plugins/shared-memory-store-sql.js +2 -1
  565. package/dist/plugins/shell-sentinel-owner-m48.d.ts +42 -0
  566. package/dist/plugins/shell-sentinel-owner-m48.js +9 -0
  567. package/dist/plugins/snapshot-bucket-presence.d.ts +2 -1
  568. package/dist/plugins/sql-driver.d.ts +1 -1
  569. package/dist/plugins/sql-driver.js +2 -1
  570. package/dist/plugins/sql-errors.d.ts +32 -5
  571. package/dist/plugins/sql-errors.js +55 -7
  572. package/dist/plugins/sql-json-column.d.ts +8 -7
  573. package/dist/plugins/sql-json-column.js +10 -6
  574. package/dist/plugins/stop-then-start-sentence.d.ts +16 -0
  575. package/dist/plugins/stop-then-start-sentence.js +7 -0
  576. package/dist/plugins/store-backend.d.ts +99 -16
  577. package/dist/plugins/store-backend.js +230 -65
  578. package/dist/plugins/store-contracts.d.ts +123 -33
  579. package/dist/plugins/store-contracts.js +38 -1
  580. package/dist/plugins/store-fault.d.ts +28 -2
  581. package/dist/plugins/store-fault.js +20 -2
  582. package/dist/plugins/task-attachment-store.d.ts +15 -3
  583. package/dist/plugins/task-attachment-store.js +22 -9
  584. package/dist/plugins/tidb-pool.d.ts +11 -6
  585. package/dist/plugins/tidb-pool.js +39 -18
  586. package/dist/plugins/web-search.js +5 -3
  587. package/dist/plugins/workflow-run-store-sql.d.ts +6 -1
  588. package/dist/plugins/workflow-run-store-sql.js +11 -5
  589. package/dist/plugins/workspace-custody.d.ts +44 -0
  590. package/dist/plugins/workspace-custody.js +47 -0
  591. package/dist/principal-jwt.d.ts +4 -4
  592. package/dist/principal-jwt.js +20 -5
  593. package/dist/principal-shape.d.ts +41 -0
  594. package/dist/principal-shape.js +19 -0
  595. package/dist/project-identity.d.ts +8 -7
  596. package/dist/project-identity.js +40 -17
  597. package/dist/project-layer-key.d.ts +13 -2
  598. package/dist/project-layer-key.js +9 -1
  599. package/dist/question.d.ts +13 -23
  600. package/dist/question.js +21 -39
  601. package/dist/read-deny-floor-notice.d.ts +36 -0
  602. package/dist/read-deny-floor-notice.js +40 -0
  603. package/dist/{plain-string-record.d.ts → request-declaration-disposition.d.ts} +9 -23
  604. package/dist/request-declaration-disposition.js +39 -0
  605. package/dist/request-declaration-refusal.d.ts +35 -12
  606. package/dist/request-declaration-refusal.js +21 -9
  607. package/dist/request-form.d.ts +58 -0
  608. package/dist/request-form.js +72 -0
  609. package/dist/request-image-urls.d.ts +8 -2
  610. package/dist/request-image-urls.js +2 -1
  611. package/dist/request-images.d.ts +20 -0
  612. package/dist/request-images.js +59 -0
  613. package/dist/request-key-closure.d.ts +6 -7
  614. package/dist/request-key-closure.js +15 -2
  615. package/dist/resource-suspend.d.ts +7 -16
  616. package/dist/resource-suspend.js +1 -1
  617. package/dist/retired-name-host-notice.d.ts +21 -0
  618. package/dist/retired-name-host-notice.js +12 -0
  619. package/dist/rule-entry-list.d.ts +2 -2
  620. package/dist/rule-entry-list.js +3 -4
  621. package/dist/rule-issue-reading.d.ts +58 -0
  622. package/dist/rule-issue-reading.js +14 -0
  623. package/dist/rules-consent.d.ts +5 -3
  624. package/dist/rules-consent.js +1 -0
  625. package/dist/run-acceptance.d.ts +3 -1
  626. package/dist/run-acceptance.js +3 -0
  627. package/dist/run-cancel-card.d.ts +28 -0
  628. package/dist/run-cancel-card.js +19 -0
  629. package/dist/run-cancel-context.d.ts +10 -0
  630. package/dist/run-cancel-context.js +1 -0
  631. package/dist/run-local.d.ts +14 -6
  632. package/dist/run-local.js +117 -90
  633. package/dist/run-stale-default.d.ts +7 -0
  634. package/dist/run-stale-default.js +2 -0
  635. package/dist/runs.d.ts +56 -21
  636. package/dist/runs.js +73 -43
  637. package/dist/runtime-caps-resolver.d.ts +21 -6
  638. package/dist/runtime-caps-resolver.js +17 -4
  639. package/dist/runtime-governance.d.ts +2 -2
  640. package/dist/runtime-governance.js +5 -3
  641. package/dist/sealed-key-layout.d.ts +12 -5
  642. package/dist/sealed-key-layout.js +5 -0
  643. package/dist/sealed-key.d.ts +12 -2
  644. package/dist/sealed-key.js +115 -27
  645. package/dist/security.d.ts +128 -158
  646. package/dist/security.js +163 -59
  647. package/dist/sema-config-dir.d.ts +20 -0
  648. package/dist/sema-config-dir.js +25 -0
  649. package/dist/server-secret-env.d.ts +55 -25
  650. package/dist/server-secret-env.js +75 -22
  651. package/dist/session-agent.d.ts +3 -2
  652. package/dist/session-children-retire.d.ts +13 -8
  653. package/dist/session-children-retire.js +9 -7
  654. package/dist/session-deletion.d.ts +88 -0
  655. package/dist/session-deletion.js +8 -0
  656. package/dist/session-erase.d.ts +145 -0
  657. package/dist/session-erase.js +115 -0
  658. package/dist/session-error-wire.d.ts +5 -5
  659. package/dist/session-error-wire.js +1 -1
  660. package/dist/session-incarnation.d.ts +52 -5
  661. package/dist/session-incarnation.js +19 -2
  662. package/dist/session-policy-wire.d.ts +6 -3
  663. package/dist/session-policy-wire.js +11 -1
  664. package/dist/session-resident-background.d.ts +0 -71
  665. package/dist/session-resident-background.js +4 -3
  666. package/dist/session-row.d.ts +2 -1
  667. package/dist/session-rules-seat.d.ts +12 -0
  668. package/dist/session-rules-seat.js +19 -0
  669. package/dist/session-titler.d.ts +7 -15
  670. package/dist/session-titler.js +1 -1
  671. package/dist/session-workspace.d.ts +3 -3
  672. package/dist/spec-fields.d.ts +57 -3
  673. package/dist/spec-fields.js +72 -51
  674. package/dist/store-admission.d.ts +33 -0
  675. package/dist/store-admission.js +49 -0
  676. package/dist/store-posture.d.ts +141 -20
  677. package/dist/store-posture.js +205 -3
  678. package/dist/stored-request-hooks-m20.js +2 -2
  679. package/dist/stores-sql/background-agent-store-sql.d.ts +11 -2
  680. package/dist/stores-sql/background-agent-store-sql.js +73 -20
  681. package/dist/stores-sql/checkpoint-store-sql.d.ts +34 -29
  682. package/dist/stores-sql/checkpoint-store-sql.js +78 -49
  683. package/dist/stores-sql/file-history-store-sql.d.ts +1 -1
  684. package/dist/stores-sql/file-history-store-sql.js +3 -5
  685. package/dist/stores-sql/mailbox-store-sql.d.ts +7 -4
  686. package/dist/stores-sql/mailbox-store-sql.js +31 -32
  687. package/dist/stores-sql/pg-session-storage.d.ts +7 -5
  688. package/dist/stores-sql/pg-session-storage.js +54 -46
  689. package/dist/stores-sql/retention-store-sql.d.ts +87 -19
  690. package/dist/stores-sql/retention-store-sql.js +92 -27
  691. package/dist/stores-sql/session-policy-store-sql.d.ts +32 -10
  692. package/dist/stores-sql/session-policy-store-sql.js +44 -36
  693. package/dist/stores-sql/session-write-hooks.d.ts +12 -6
  694. package/dist/stores-sql/tidb-session-storage.d.ts +4 -4
  695. package/dist/stores-sql/tidb-session-storage.js +13 -8
  696. package/dist/stores-sql/tidb-session-store.d.ts +36 -17
  697. package/dist/stores-sql/tidb-session-store.js +69 -39
  698. package/dist/stores-sql/tool-result-store-sql.d.ts +1 -1
  699. package/dist/stores-sql/tool-result-store-sql.js +4 -6
  700. package/dist/stores-sql/windowed-session-storage.d.ts +5 -0
  701. package/dist/stores-sql/windowed-session-storage.js +9 -0
  702. package/dist/submission-exit.d.ts +50 -0
  703. package/dist/submission-exit.js +108 -0
  704. package/dist/task-a2a.d.ts +3 -8
  705. package/dist/task-a2a.js +28 -30
  706. package/dist/task-cwd.d.ts +43 -7
  707. package/dist/task-cwd.js +11 -0
  708. package/dist/task-mcp.d.ts +3 -3
  709. package/dist/task-mcp.js +4 -4
  710. package/dist/task-settings.d.ts +14 -10
  711. package/dist/task-settings.js +19 -7
  712. package/dist/terminal.d.ts +27 -43
  713. package/dist/terminal.js +49 -14
  714. package/dist/tool-approval.d.ts +173 -163
  715. package/dist/tool-approval.js +247 -232
  716. package/dist/trace/core-keyset-guard.d.ts +13 -6
  717. package/dist/trace/core-vocab-wire.d.ts +95 -0
  718. package/dist/trace/core-vocab-wire.js +15 -0
  719. package/dist/trace/engine-notice-wire.d.ts +24 -21
  720. package/dist/trace/engine-notice-wire.js +7 -3
  721. package/dist/trace/exit-seat.d.ts +30 -4
  722. package/dist/trace/exit-seat.js +40 -36
  723. package/dist/trace/extension-call-face.d.ts +3 -2
  724. package/dist/trace/extension-call-face.js +3 -1
  725. package/dist/trace/ledger-events.d.ts +4 -7
  726. package/dist/trace/ledger-sink.d.ts +4 -31
  727. package/dist/trace/ledger-sink.js +0 -11
  728. package/dist/trace/model-segment.d.ts +5 -5
  729. package/dist/trace/model-segment.js +5 -5
  730. package/dist/trace/project.d.ts +59 -44
  731. package/dist/trace/project.js +60 -26
  732. package/dist/trace/redact.d.ts +135 -27
  733. package/dist/trace/redact.js +884 -260
  734. package/dist/trace/self-minted-wire.d.ts +567 -20
  735. package/dist/trace/self-minted-wire.js +205 -24
  736. package/dist/trace/wire-projection-faces.d.ts +5 -6
  737. package/dist/trace/wire-projection-faces.js +2 -2
  738. package/dist/upstream-body.d.ts +23 -0
  739. package/dist/upstream-body.js +16 -0
  740. package/dist/url-refusal.d.ts +3 -3
  741. package/dist/url-refusal.js +11 -4
  742. package/dist/user-authored-text.d.ts +1 -1
  743. package/dist/user-input-ledger.d.ts +7 -8
  744. package/dist/user-input-ledger.js +1 -1
  745. package/dist/web-admin-client/apply-effective.d.ts +6 -3
  746. package/dist/web-admin-client/apply-effective.js +33 -23
  747. package/dist/web-admin-client/apply-ledger.d.ts +16 -7
  748. package/dist/web-admin-client/apply-ledger.js +5 -2
  749. package/dist/web-admin-client/center-request.d.ts +2 -2
  750. package/dist/web-admin-client/center-request.js +15 -15
  751. package/dist/web-admin-client/effective-keys.d.ts +1 -1
  752. package/dist/web-admin-client/effective-keys.js +1 -1
  753. package/dist/web-admin-client/entry-metadata.d.ts +8 -0
  754. package/dist/web-admin-client/entry-metadata.js +13 -0
  755. package/dist/web-admin-client/http-client.d.ts +1 -1
  756. package/dist/web-admin-client/http-client.js +23 -4
  757. package/dist/web-admin-client/mcp-revocation.d.ts +1 -1
  758. package/dist/web-admin-client/mcp-revocation.js +2 -1
  759. package/dist/web-admin-client/read-warnings.d.ts +1 -0
  760. package/dist/web-admin-client/read-warnings.js +1 -0
  761. package/dist/web-admin-client/restart-signal.js +8 -4
  762. package/dist/web-admin-client/skills-mcp.d.ts +2 -2
  763. package/dist/web-admin-client/types.d.ts +1 -2
  764. package/dist/workspace-space.d.ts +3 -2
  765. package/docs/DEVICE-EXECUTOR-PROTOCOL.md +4 -4
  766. package/docs/error-text-lexicon.json +317 -0
  767. package/package.json +8 -3
  768. package/scripts/drain-check-local.mjs +118 -147
  769. package/scripts/drain-check.mysql.sql +22 -2
  770. package/scripts/drain-check.pg.sql +22 -2
  771. package/scripts/embed-minimal.mjs +183 -0
  772. package/wire-changes/server@7.148.0.json +1517 -0
  773. package/wire-changes/server@7.149.0.json +372 -0
  774. package/dist/http/memory-control-plane-corrupt-reply.d.ts +0 -25
  775. package/dist/http/memory-control-plane-corrupt-reply.js +0 -19
  776. package/dist/http/memory-layer-reply.d.ts +0 -30
  777. package/dist/http/memory-layer-reply.js +0 -24
  778. package/dist/lsp/e2b-bridge.d.ts +0 -57
  779. package/dist/lsp/e2b-bridge.js +0 -139
  780. package/dist/lsp/e2b-manager.d.ts +0 -93
  781. package/dist/lsp/e2b-manager.js +0 -178
  782. package/dist/lsp/lsp-frames.d.ts +0 -14
  783. package/dist/lsp/lsp-frames.js +0 -25
  784. package/dist/lsp/manager.d.ts +0 -129
  785. package/dist/lsp/manager.js +0 -127
  786. package/dist/lsp/types.d.ts +0 -12
  787. package/dist/lsp/types.js +0 -2
  788. package/dist/lsp/ws-transport.d.ts +0 -40
  789. package/dist/lsp/ws-transport.js +0 -210
  790. package/dist/plain-string-record.js +0 -70
@@ -52,8 +52,9 @@ export declare class LocalSessionWindow extends BaseSessionStorage {
52
52
  private constructor();
53
53
  appendEntry(): Promise<void>;
54
54
  setLeafId(): Promise<void>;
55
- /** `SessionStorage.getEpochAnchor?()` — the nearest carrier on the branch below the floor, as stored ({@link scanEpochAnchor}).
56
- * A row's `seq` is its position on the branch; the whole branch is in memory, so one page holds every row. */
55
+ /** `SessionStorage.getEpochAnchor?()` — the nearest carrier on the branch below the floor, as stored ({@link scanEpochAnchor}: the floor's
56
+ * parent chain, the one walk every windowed storage shares). A row's `seq` is its position on the branch; the whole branch is in memory,
57
+ * so one page holds every row (every one of them on the walk). */
57
58
  getEpochAnchor(): Promise<unknown>;
58
59
  /** Wake the window of `sessionId` from the local session store's rows; `null` if there is no such session. */
59
60
  static wake(rows: LocalSessionRows, sessionId: string): Promise<LocalSessionWindow | null>;
@@ -1,5 +1,5 @@
1
1
  import { BaseSessionStorage, InMemorySessionStorage, SessionError, boundedTail } from "@sema-agent/core";
2
- import { scanEpochAnchor } from "./session-epoch-anchor.js";
2
+ import { epochFloorOf, scanEpochAnchor } from "./session-epoch-anchor.js";
3
3
  export class LocalSessionWindow extends BaseSessionStorage {
4
4
  below;
5
5
  constructor(metadata, window, leafId, floorEntryId, below) {
@@ -13,7 +13,8 @@ export class LocalSessionWindow extends BaseSessionStorage {
13
13
  throw new SessionError("storage", "LocalSessionWindow is a read-only view of a session — write through the session store");
14
14
  }
15
15
  async getEpochAnchor() {
16
- return scanEpochAnchor(this.below.length, async (beforeSeq) => this.below.slice(0, beforeSeq).map((entry, seq) => ({ seq, entry })).reverse(), (row) => row.entry);
16
+ const floorId = this.getFloorId();
17
+ return scanEpochAnchor(epochFloorOf(this.below.length, floorId === null ? undefined : await this.getEntry(floorId)), async (beforeSeq) => this.below.slice(0, beforeSeq).map((entry, seq) => ({ seq, id: entry.id, parentId: entry.parentId ?? null, type: entry.type, entry })).reverse(), (row) => row.entry);
17
18
  }
18
19
  static async wake(rows, sessionId) {
19
20
  const log = await rows.exportEntries(sessionId);
@@ -1,3 +1,4 @@
1
+ import { writeLogText } from "../observability/logger.js";
1
2
  import { renameSync } from "node:fs";
2
3
  export function quarantineUnreadableSidecar(path, what, reason) {
3
4
  const target = `${path}.corrupt-${Date.now()}-${process.pid}`;
@@ -5,11 +6,11 @@ export function quarantineUnreadableSidecar(path, what, reason) {
5
6
  renameSync(path, target);
6
7
  }
7
8
  catch (e) {
8
- console.warn(`${what}: ${path} is unreadable (${reason}) and could NOT be quarantined (${e instanceof Error ? e.message : String(e)}) — ` +
9
+ writeLogText("stderr", `${what}: ${path} is unreadable (${reason}) and could NOT be quarantined (${e instanceof Error ? e.message : String(e)}) — ` +
9
10
  `the bytes are still at that path; a later write to it may replace them`);
10
11
  return undefined;
11
12
  }
12
- console.warn(`${what}: ${path} is unreadable (${reason}) — quarantined at ${target} so the next write cannot replace it`);
13
+ writeLogText("stderr", `${what}: ${path} is unreadable (${reason}) — quarantined at ${target} so the next write cannot replace it`);
13
14
  return target;
14
15
  }
15
16
  //# sourceMappingURL=local-sidecar-quarantine.js.map
@@ -1,4 +1,5 @@
1
1
  import { type AttachmentStoreBindOutcome, type TaskAttachmentStore, type TaskAttachmentRecord } from "./task-attachment-store.js";
2
+ import type { LocalSessionStore } from "./local-session-store.js";
2
3
  /** 附件店在数据根下的目录(构造器与一次性迁移 M39 的名册同读这一只)。 */
3
4
  export declare function attachmentStoreDirFor(rootDir: string): string;
4
5
  export declare class LocalTaskAttachmentStore implements TaskAttachmentStore {
@@ -7,7 +8,17 @@ export declare class LocalTaskAttachmentStore implements TaskAttachmentStore {
7
8
  private hydration;
8
9
  /** 变更串行段的尾(见 `serialized`):每只变更口排在上一只的落盘与合回之后。本店唯一一只。 */
9
10
  private mutationTail;
10
- constructor(rootDir: string);
11
+ /**
12
+ * 客户端写计数口(同一数据根上的 local 会话店;提交出口撤回一只刚铸会话之前读这只计数,`session-birth.ts`):绑定在这只会话的根行锁里判、真绑上行时先 +1 再落盘。
13
+ * 缺席 = 本店的绑定不计数 —— 撤回就可能删掉一只已绑附件的会话,所以带会话店的装配必须交它(只测附件店的用例不交)。
14
+ */
15
+ private readonly clientWrites;
16
+ constructor(rootDir: string, opts?: {
17
+ readonly clientWrites?: Pick<LocalSessionStore, "withClientWrite">;
18
+ });
19
+ /** 一次性迁移 **M42 的 local 附件腿**(场景前缀的切换检查;窗口见 `plugins/one-time-migrations.ts` 登记表):属主以保留前缀开头的附件数。
20
+ * 附件可以先于任何会话 / run 上传(属主不经那两只店)⇒ 本店自己一处来源。水合那一读,零写;读不出的 meta 照水合同一条跳过臂。 */
21
+ scenarioPrefixOwnerRowsM42(): Promise<number>;
11
22
  private hydrate;
12
23
  /**
13
24
  * 本店**唯一**的变更串行段:凡改 `this.metas` 或删盘上行的口(put / bind / delete / deleteBySession / reapUnbound)把**整条操作**
@@ -23,10 +34,16 @@ export declare class LocalTaskAttachmentStore implements TaskAttachmentStore {
23
34
  getContent(owner: string, id: string): Promise<Uint8Array | null>;
24
35
  private persistMeta;
25
36
  bind(owner: string, ids: readonly string[], sessionId: string, boundAtMs: number): Promise<AttachmentStoreBindOutcome>;
37
+ /** {@link bind} 的串行段一形(`count` = 客户端写计数,真绑上行时在落盘之前调;缺 = 不计)。 */
38
+ private bindSerialized;
26
39
  listBySession(sessionId: string): Promise<TaskAttachmentRecord[]>;
27
40
  /** 删一行(meta + bytes + 内存索引)。只在 `serialized` 的操作体里调用。 */
28
41
  private removeRow;
29
42
  delete(owner: string, id: string): Promise<boolean>;
43
+ /** local 形一行一份字节(不跨行共享,行删即字节删,见 `removeRow`)⇒ 给不出「行已删、字节还在」的哈希:local 执行体回执里的附件哈希恒空,这一口无字节可放。 */
44
+ releaseBytes(_shas: readonly string[]): Promise<{
45
+ readonly failed: readonly string[];
46
+ }>;
30
47
  deleteBySession(sessionId: string): Promise<number>;
31
48
  reapUnbound(olderThanMs: number): Promise<number>;
32
49
  }
@@ -1,3 +1,4 @@
1
+ import { SCENARIO_SUBJECT_PREFIX } from "../owner-brands.js";
1
2
  import { promises as fsp } from "node:fs";
2
3
  import { join } from "node:path";
3
4
  import { ensureDir } from "@sema-agent/core";
@@ -14,8 +15,17 @@ export class LocalTaskAttachmentStore {
14
15
  metas;
15
16
  hydration;
16
17
  mutationTail = Promise.resolve();
17
- constructor(rootDir) {
18
+ clientWrites;
19
+ constructor(rootDir, opts) {
18
20
  this.dir = attachmentStoreDirFor(rootDir);
21
+ this.clientWrites = opts?.clientWrites;
22
+ }
23
+ async scenarioPrefixOwnerRowsM42() {
24
+ let n = 0;
25
+ for (const meta of (await this.hydrate()).values())
26
+ if (meta.owner.startsWith(SCENARIO_SUBJECT_PREFIX))
27
+ n += 1;
28
+ return n;
19
29
  }
20
30
  hydrate() {
21
31
  this.hydration ??= (async () => {
@@ -77,6 +87,12 @@ export class LocalTaskAttachmentStore {
77
87
  await atomicWriteFileAsync(join(this.dir, `${m.id}.json`), JSON.stringify(m), { durability: "best-effort" });
78
88
  }
79
89
  bind(owner, ids, sessionId, boundAtMs) {
90
+ const gate = this.clientWrites;
91
+ if (gate === undefined)
92
+ return this.bindSerialized(owner, ids, sessionId, boundAtMs, undefined);
93
+ return gate.withClientWrite(sessionId, (count) => this.bindSerialized(owner, ids, sessionId, boundAtMs, count));
94
+ }
95
+ bindSerialized(owner, ids, sessionId, boundAtMs, count) {
80
96
  return this.serialized(async () => {
81
97
  const metas = await this.hydrate();
82
98
  const draft = new Map(metas);
@@ -86,6 +102,8 @@ export class LocalTaskAttachmentStore {
86
102
  draft.set(id, { ...row });
87
103
  }
88
104
  const { outcome, claimed } = bindRowsInProcess(draft, owner, ids, sessionId, boundAtMs);
105
+ if (claimed.length > 0 && count !== undefined)
106
+ await count();
89
107
  const landed = [];
90
108
  try {
91
109
  for (const m of claimed) {
@@ -121,6 +139,9 @@ export class LocalTaskAttachmentStore {
121
139
  return true;
122
140
  });
123
141
  }
142
+ async releaseBytes(_shas) {
143
+ return { failed: [] };
144
+ }
124
145
  deleteBySession(sessionId) {
125
146
  return this.serialized(async () => {
126
147
  const metas = await this.hydrate();
@@ -1,7 +1,11 @@
1
1
  import { joinRequestUrl } from "@sema-agent/core";
2
2
  import { z } from "zod";
3
- import { egressRedirectRefusal } from "../egress-redirect.js";
3
+ import { EgressRedirectRefusedError, createEgressFetch } from "../egress-redirect.js";
4
4
  import { buildDisplaySafeRefusal, buildDisplaySafeUrl } from "../trace/redact.js";
5
+ import { createLogger } from "../observability/logger.js";
6
+ import { errorText } from "../observability/err-text.js";
7
+ const MEMORY_EMBEDDER_HOOK_THREW = "memory_embedder_observability_hook_threw";
8
+ const embedderLog = createLogger();
5
9
  const EmbeddingsResponse = z.object({
6
10
  data: z.array(z.object({ embedding: z.array(z.number()) })).min(1),
7
11
  });
@@ -28,7 +32,7 @@ function credentialsInQuery(endpoint) {
28
32
  export function createOpenAiCompatEmbedder(opts) {
29
33
  const url = embeddingsUrl(opts.endpoint);
30
34
  const shownUrl = buildDisplaySafeUrl(url);
31
- const fetchImpl = opts.fetchImpl ?? fetch;
35
+ const fetchImpl = createEgressFetch("declare the final endpoint as MEMORY_EMBEDDER_ENDPOINT", opts.fetchImpl);
32
36
  const { model, dimensions, timeoutMs, apiKey, onFailure } = opts;
33
37
  const secrets = [...(apiKey !== undefined ? [apiKey] : []), ...credentialsInQuery(opts.endpoint)];
34
38
  const scrub = (raw) => secrets.reduce((acc, s) => acc.replaceAll(s, "***"), raw);
@@ -44,15 +48,13 @@ export function createOpenAiCompatEmbedder(opts) {
44
48
  },
45
49
  body: JSON.stringify({ model, input: text }),
46
50
  signal: AbortSignal.timeout(timeoutMs),
47
- redirect: "manual",
48
51
  });
49
52
  }
50
53
  catch (transportErr) {
54
+ if (transportErr instanceof EgressRedirectRefusedError)
55
+ throw new Error(`memory embedder POST ${shownUrl}: ${transportErr.message}`);
51
56
  throw new Error(`memory embedder POST ${shownUrl}: transport failure — ${safeSlice(String(transportErr))}`);
52
57
  }
53
- const redirected = egressRedirectRefusal(res, "declare the final endpoint as MEMORY_EMBEDDER_ENDPOINT");
54
- if (redirected !== undefined)
55
- throw new Error(`memory embedder POST ${shownUrl}: ${redirected}`);
56
58
  const raw = await res.text().catch((readErr) => {
57
59
  throw new Error(`memory embedder POST ${shownUrl}: response body unreadable — ${safeSlice(String(readErr))}`);
58
60
  });
@@ -86,7 +88,7 @@ export function createOpenAiCompatEmbedder(opts) {
86
88
  onFailure?.(err);
87
89
  }
88
90
  catch (hookErr) {
89
- process.emitWarning(`memory embedder onFailure hook threw: ${String(hookErr)}`, "MemoryEmbedderObservabilityWarning");
91
+ embedderLog.warn(MEMORY_EMBEDDER_HOOK_THREW, { err: errorText(hookErr) });
90
92
  }
91
93
  throw err;
92
94
  }
@@ -41,7 +41,7 @@ export interface PgMemoryEngineBackendOptions {
41
41
  * connections, so a true transaction would require refactoring the constructor to a client-checkout
42
42
  * seam (breaks the origin-core@3071dd3 minimal-diff move-in discipline).
43
43
  * Chosen trade-off: entry write commits first, history append is BEST-EFFORT
44
- * (failure = swallow + console.warn) — history is the AUDIT face, not the correctness face: a lost
44
+ * (failure = swallow + a log-seam warn line) — history is the AUDIT face, not the correctness face: a lost
45
45
  * history row loses an audit line, never data (the entries table stays the single truth). */
46
46
  history?: {
47
47
  appendHistory(rows: readonly MemoryHistoryAppendRow[]): Promise<void>;
@@ -93,7 +93,8 @@ export declare class PgMemoryEngineBackend implements MemoryBackend {
93
93
  */
94
94
  private writeAdd;
95
95
  /** update:条件 = 判过的 rev **且**判过的投影(rev 是内容哈希、不含 scope / slug)。零行 ⇒ 现读:内容未变而投影变了 = `moved`;其余 =
96
- * CAS 冲突,currentRev 报现值(行没了 ⇒ 判时的值)。 */
96
+ * CAS 冲突,currentRev 报现值(行没了 ⇒ 判时的值)。撞唯一键:主键 `id` 不变,能撞的只有 `(scope, slug)` —— 目标名在判之后被别的 id 占了
97
+ * ⇒ `slug-taken`(与 add 口同一结局词;驱动器重判,判当场判成冲突)。 */
97
98
  private writeUpdate;
98
99
  /** delete:条件同 update。 */
99
100
  private writeDelete;
@@ -1,3 +1,4 @@
1
+ import { writeLogText } from "../observability/logger.js";
1
2
  import { cosineDistance, jaccardDistance, termSet } from "@sema-agent/core";
2
3
  import { isUniqueViolation, readEmbeddingColumn, readFrontmatterColumn } from "./memory-engine-vector-util.js";
3
4
  import { decodeJsonColumn, decodeNullableJsonColumn, foldJsonColumn, isJsonColumnBodyProblem, jsonColumnText } from "./sql-json-column.js";
@@ -250,10 +251,18 @@ export class PgMemoryEngineBackend {
250
251
  async writeUpdate({ entry, rev, currentRev, current, baseRev }, embedding, confirm) {
251
252
  const params = [entry.id, entry.scope, entry.slug, pgSafeJsonStringify(entry.frontmatter), entry.body, rev, this.clock(), Buffer.byteLength(serializeEntryFile(entry), "utf8"), embedding, currentRev, current.scope, current.slug];
252
253
  confirm();
253
- const res = await this.query(`UPDATE ${PG_MEMORY_ENGINE_TABLES.entry}
254
- SET scope = $2, slug = $3, frontmatter = $4, body = $5, rev = $6, mtime_ms = $7, size_bytes = $8, embedding = $9
255
- WHERE id = $1 AND rev = $10 AND scope = $11 AND slug = $12
256
- RETURNING id`, params);
254
+ let res;
255
+ try {
256
+ res = await this.query(`UPDATE ${PG_MEMORY_ENGINE_TABLES.entry}
257
+ SET scope = $2, slug = $3, frontmatter = $4, body = $5, rev = $6, mtime_ms = $7, size_bytes = $8, embedding = $9
258
+ WHERE id = $1 AND rev = $10 AND scope = $11 AND slug = $12
259
+ RETURNING id`, params);
260
+ }
261
+ catch (err) {
262
+ if (isUniqueViolation(err))
263
+ return { kind: "slug-taken" };
264
+ throw err;
265
+ }
257
266
  if (res.rows.length > 0)
258
267
  return { kind: "committed" };
259
268
  const fresh = await this.freshRow(entry.id);
@@ -279,7 +288,7 @@ export class PgMemoryEngineBackend {
279
288
  }
280
289
  catch (err) {
281
290
  this.historyRowsLost += rows.length;
282
- console.warn(`PgMemoryEngineBackend: best-effort history append failed (${rows.length} row(s) lost, ${this.historyRowsLost} cumulative — audit face only, entries committed): ${err instanceof Error ? err.message : String(err)}`);
291
+ writeLogText("stderr", `PgMemoryEngineBackend: best-effort history append failed (${rows.length} row(s) lost, ${this.historyRowsLost} cumulative — audit face only, entries committed): ${err instanceof Error ? err.message : String(err)}`);
283
292
  }
284
293
  }
285
294
  async getConsolidationCursor(scope) {
@@ -24,15 +24,19 @@
24
24
  * · LANDING = 一个 patch 写下或移走的每个拼写 `{ id, scope, slug }`:add 的终拼(含撞名后缀)、同 scope 改名留下的旧拼、update 的目标
25
25
  * 与移走的旧拼、delete 移走的拼。
26
26
  * · 写语句把**计划的投影**也绑进条件(rev 是内容哈希、不含 scope / slug,单靠 `WHERE id AND rev` 绑不住落点):行在计划之后被挪到别的拼写
27
- * ⇒ 写不落,方言写口按现读答 `moved`,驱动器重判(新拼写同样要问过才写);名被占(唯一键冲突)⇒ `slug-taken`,重判从下一个后缀起
28
- * (与改前「撞键即退下一个后缀」同一序列)。
27
+ * ⇒ 写不落,方言写口按现读答 `moved`,驱动器重判(新拼写同样要问过才写);名被占(唯一键 `(scope, slug)` 冲突,add 与 update 两口同译)
28
+ * ⇒ `slug-taken`,一条律:这一 patch 的候选起格越过被拒的那个拼写、驱动器重判 —— add 从下一个后缀起(与改前「撞键即退下一个后缀」同一序列);
29
+ * update 只有一个候选(目标拼写)⇒ 越过即没有候选,判成冲突(被库拒过的拼写本次 apply 不再重写:对手在拒之后腾出名也一样,重写留给下次 apply ——
30
+ * 否则「每条写前占名、拒后腾名」的对手能让同一计划无界重写)。
31
+ * · 「目标名被别的 id 占着」只在判里判一处({@link planSqlPatch} 的 update 支):计划阶段就看得见的占名在那里直接判成冲突(一句、方言无关、
32
+ * 零写语句、不产落点);写语句那一刻才撞上的占名经 `slug-taken` 推过候选起格、回到同一处判。所以这一冲突两条路同一句,且都不是「可能写过」。
29
33
  * · 问的次数有上限(core `MAX_LANDING_ADMISSION_ROUNDS`),超了 core 抛 `memory.landing_unstable`(此时恒一字未写)。
30
34
  * · `confirm` = 调用方的最后一句话:方言写口在**每条** entry 写语句发出之前同步调它(与写语句之间没有 await)。SQL 腿不持事务锁 ——
31
35
  * confirm 与写语句之间仍有一段竞争窗,这是两腿「单语句 CAS、无事务」的既有结构事实(MIGRATION / USAGE 的已知限制一句)。
32
36
  * · 抛错分诊:per-patch 的 catch 只把读 / 写 I/O 失败记成 `io error` 冲突(改前同);`confirm` 的抛被包成 {@link CallerThrow} 越过这道
33
37
  * catch,出驱动器时还原成调用方抛出的**同一个值**;`admit` 根本不在 catch 内。已提交 patch 的 history 在 `finally` 里照冲刷。
34
38
  * · 「已经写过」按**可能写过**算:一条写语句发出之后以 I/O 失败收场,库里落没落不知道 ⇒ 当作写过(此后不再问),否则后面一次被拒的重问
35
- * 就可能发生在一笔其实已落下的写之后。写语句的三种「没落」结局(唯一键冲突 / 零行 + 现读)是库给的确答,不算写过。
39
+ * 就可能发生在一笔其实已落下的写之后。写语句的「没落」结局(唯一键冲突 —— add 与 update 两口 / 零行 + 现读)是库给的确答,不算写过。
36
40
  * · 不传 opts ⇒ 没有计划阶段、`confirm` 是空操作;常规路径与改前逐字同。只在并发竞争路径上收紧:行在判与写之间被挪走 ⇒ 按现状重判
37
41
  * 再写(此前按 id 盲写);同 id 的行在判与写之间被别的副本插入或改写 ⇒ 重判(guard / 跨 scope 拒照判,此前按 id 盲覆盖)。
38
42
  * · 写条件只有一条律:写语句绑住**判据用到的那一份** —— update / delete 判的是 rev(CAS)与投影 ⇒ 两者都绑;add 覆盖判的是投影
@@ -91,7 +95,7 @@ export interface SqlDeleteWrite {
91
95
  readonly baseRev: string | undefined;
92
96
  }
93
97
  /**
94
- * 一次写的结局:`committed` = 落了;`slug-taken` = 唯一键 `(scope, slug)` 冲突(名在计划之后被别的副本占了);`moved` = 写不落而现读显示
98
+ * 一次写的结局:`committed` = 落了;`slug-taken` = 唯一键 `(scope, slug)` 冲突(名在计划之后被别的副本占了;add 与 update 两口同译);`moved` = 写不落而现读显示
95
99
  * 这个 id 的行已不在计划的投影上(或计划时没有、现在有了);`lost` = rev CAS 输了(冲突里的 currentRev 是现值)。
96
100
  */
97
101
  export type SqlWriteOutcome = {
@@ -138,6 +138,9 @@ async function planSqlPatch(patch, reads, baseline, claims, unstorableReason, su
138
138
  return conflict({ op: "update", id: patch.id, reason: unstorableReason });
139
139
  }
140
140
  const moves = current.scope !== entry.scope || current.slug !== entry.slug;
141
+ if (moves && (suffixFrom > FIRST_SUFFIX_STEP || (await reads.idsAt(entry.scope, entry.slug)).some((holder) => holder !== patch.id))) {
142
+ return conflict({ op: "update", id: patch.id, reason: `update target ${JSON.stringify(`${entry.scope}/${entry.slug}`)} is held by another entry (unique (scope, slug)); not written` });
143
+ }
141
144
  return {
142
145
  kind: "update",
143
146
  entry,
@@ -145,6 +148,7 @@ async function planSqlPatch(patch, reads, baseline, claims, unstorableReason, su
145
148
  currentRev: current.rev,
146
149
  current: at,
147
150
  baseRev: patch.baseRev,
151
+ suffixAt: FIRST_SUFFIX_STEP,
148
152
  landings: [...(moves ? [{ id: patch.id, ...at }] : []), { id: entry.id, scope: entry.scope, slug: entry.slug }],
149
153
  };
150
154
  }
@@ -187,13 +191,8 @@ async function predictLandings(patches, from, duplicateAt, reads, unstorableReas
187
191
  if (duplicateAt.has(i))
188
192
  continue;
189
193
  let plan;
190
- let targetHeld = false;
191
194
  try {
192
195
  plan = await planSqlPatch(patches[i], view, scratchBaseline, scratchClaims, unstorableReason, suffixFloor.get(i) ?? FIRST_SUFFIX_STEP);
193
- if (plan.kind === "update") {
194
- const { id, scope, slug } = plan.entry;
195
- targetHeld = (await view.idsAt(scope, slug)).some((holder) => holder !== id);
196
- }
197
196
  }
198
197
  catch {
199
198
  continue;
@@ -206,8 +205,7 @@ async function predictLandings(patches, from, duplicateAt, reads, unstorableReas
206
205
  scratchClaims.add(slugKey(plan.stored.scope, plan.stored.slug));
207
206
  }
208
207
  else if (plan.kind === "update") {
209
- if (!targetHeld)
210
- overlay.set(plan.entry.id, { scope: plan.entry.scope, slug: plan.entry.slug, rev: plan.rev, frontmatter: plan.entry.frontmatter });
208
+ overlay.set(plan.entry.id, { scope: plan.entry.scope, slug: plan.entry.slug, rev: plan.rev, frontmatter: plan.entry.frontmatter });
211
209
  }
212
210
  else {
213
211
  overlay.set(plan.id, null);
@@ -302,7 +300,7 @@ export async function applySqlPatches(patches, opts, leg) {
302
300
  report.conflicts.push(outcome.conflict);
303
301
  return [];
304
302
  case "slug-taken":
305
- if (plan.kind === "add")
303
+ if (plan.kind !== "delete")
306
304
  suffixFloor.set(k, plan.suffixAt + 1);
307
305
  continue;
308
306
  case "moved":
@@ -27,7 +27,7 @@ export interface TiDBMemoryEngineBackendOptions {
27
27
  * entry plane itself is deliberately NON-transactional (single-statement CAS is the correctness
28
28
  * mechanism), and the Pg twin's bare-PgQueryFn seam cannot cheaply transact — wrapping only the
29
29
  * TiDB side would fork the twins' semantics. Chosen trade-off on BOTH dialects: entry write commits
30
- * first, history append is BEST-EFFORT (failure = swallow + console.warn) — history is the AUDIT
30
+ * first, history append is BEST-EFFORT (failure = swallow + a log-seam warn line) — history is the AUDIT
31
31
  * face, not the correctness face: a lost history row loses an audit line, never data. */
32
32
  history?: {
33
33
  appendHistory(rows: readonly MemoryHistoryAppendRow[]): Promise<void>;
@@ -84,7 +84,9 @@ export declare class TiDBMemoryEngineBackend implements MemoryBackend {
84
84
  * 这是零行唯一能是 applied 的形 —— 目标 rev 与判过的 rev 不同的 update 一定改动行(rev 列本身变了),零行即未匹配;
85
85
  * 行被对手改走又改回判过的 rev 时,按 rev 它没变过(与 File 腿的比对、与共享判里「A→B→A 让 stale baseRev 重新当前」同一读法),这一条本来就是什么都没改 ⇒ 照样已落;
86
86
  * · 内容未变而投影变了 = `moved`;其余 = CAS 冲突,`currentRev` 报现值。
87
- * 🔴 行存在性是承重的:判与写之间行被并发删掉时 affectedRows 也是 0,现读对没了的行答 undefined ⇒ 落冲突(逐字相同的 update 也一样),两方言同答。 */
87
+ * 🔴 行存在性是承重的:判与写之间行被并发删掉时 affectedRows 也是 0,现读对没了的行答 undefined ⇒ 落冲突(逐字相同的 update 也一样),两方言同答。
88
+ * 撞唯一键(ER_DUP_ENTRY):主键 `id` 不变,能撞的只有 `(scope, slug)` —— 目标名在判之后被别的 id 占了 ⇒ `slug-taken`(与 add 口、PG 孪生同一结局词;
89
+ * 驱动器重判,判当场判成冲突)。 */
88
90
  private writeUpdate;
89
91
  /** delete:条件同 update;DELETE 的 affectedRows 数的是删掉的行(FOUND_ROWS 只影响 UPDATE):0 = 行变了 / 挪了 / 没了。 */
90
92
  private writeDelete;
@@ -1,3 +1,4 @@
1
+ import { writeLogText } from "../observability/logger.js";
1
2
  import { jaccardDistance, termSet } from "@sema-agent/core";
2
3
  import { readFrontmatterColumn } from "./memory-engine-vector-util.js";
3
4
  import { decodeJsonColumn, foldJsonColumn, jsonColumnText } from "./sql-json-column.js";
@@ -214,7 +215,15 @@ export class TiDBMemoryEngineBackend {
214
215
  async writeUpdate({ entry, rev, currentRev, current, baseRev }, _prepared, confirm) {
215
216
  const params = [entry.scope, entry.slug, JSON.stringify(entry.frontmatter), entry.body, rev, this.clock(), Buffer.byteLength(serializeEntryFile(entry), "utf8"), entry.id, currentRev, current.scope, current.slug];
216
217
  confirm();
217
- const res = await this.write(`UPDATE ${TIDB_MEMORY_ENGINE_TABLES.entry} SET scope = ?, slug = ?, frontmatter = ?, body = ?, rev = ?, mtime_ms = ?, size_bytes = ?, embedding = NULL WHERE id = ? AND rev = ? AND ${AT_PLANNED_PROJECTION}`, params);
218
+ let res;
219
+ try {
220
+ res = await this.write(`UPDATE ${TIDB_MEMORY_ENGINE_TABLES.entry} SET scope = ?, slug = ?, frontmatter = ?, body = ?, rev = ?, mtime_ms = ?, size_bytes = ?, embedding = NULL WHERE id = ? AND rev = ? AND ${AT_PLANNED_PROJECTION}`, params);
221
+ }
222
+ catch (err) {
223
+ if (isDupEntry(err))
224
+ return { kind: "slug-taken" };
225
+ throw err;
226
+ }
218
227
  if (res.affectedRows > 0)
219
228
  return { kind: "committed" };
220
229
  const fresh = await this.freshRow(entry.id);
@@ -244,7 +253,7 @@ export class TiDBMemoryEngineBackend {
244
253
  }
245
254
  catch (err) {
246
255
  this.historyRowsLost += rows.length;
247
- console.warn(`TiDBMemoryEngineBackend: best-effort history append failed (${rows.length} row(s) lost, ${this.historyRowsLost} cumulative — audit face only, entries committed): ${err instanceof Error ? err.message : String(err)}`);
256
+ writeLogText("stderr", `TiDBMemoryEngineBackend: best-effort history append failed (${rows.length} row(s) lost, ${this.historyRowsLost} cumulative — audit face only, entries committed): ${err instanceof Error ? err.message : String(err)}`);
248
257
  }
249
258
  }
250
259
  async getConsolidationCursor(scope) {
@@ -6,7 +6,7 @@
6
6
  *
7
7
  * ── 数据形([ref] §1.1 的施工形;**稿偏离如实记**)────────────────────────────────────────────────
8
8
  * [ref] 稿写的是 `PRIMARY KEY (org_id, principal)` + `principal=''` 为 org 级缺省哨兵行。亲读本仓
9
- * (侦察 2026-08-30):server **没有 org 身份维** —— 租户维 = 单 `principal`(`gatedPrincipal` 供给),
9
+ * (侦察 2026-08-30):server **没有 org 身份维** —— 租户维 = 单 `principal`(`gatedSubject` 供给),
10
10
  * `org` 只是记忆 scope 目录里的一个词(`org-memory-admission.ts`:授权目录三态,不是 principal 的属性),
11
11
  * 任何 SQL 表都没有 `org_id` 列。给表铸一根没人能填的 `org_id` 就是编数据(「不编」律)。所以:
12
12
  * · **一台 worker = 一个租户面**,稿中「org 级缺省行」落成**部署级缺省行**(同一哨兵 `principal=''`);
@@ -1,5 +1,5 @@
1
1
  import { mysqlDriver, pgDriver } from "./sql-driver.js";
2
- import { RESERVED_PRINCIPALS, RESERVED_PRINCIPAL_PREFIXES } from "../security.js";
2
+ import { PRINCIPAL_MAX_BYTES, RESERVED_PRINCIPALS, RESERVED_PRINCIPAL_PREFIXES } from "../principal-shape.js";
3
3
  export const MEMORY_OPTOUT_GRANT_TABLE = "memory_optout_grant";
4
4
  export const MEMORY_OPTOUT_DEFAULT_PRINCIPAL = "";
5
5
  export function buildMemoryOptOutVerdict(rows, principal) {
@@ -16,8 +16,8 @@ export function buildMemoryOptOutVerdict(rows, principal) {
16
16
  export function memoryOptOutPrincipalShapeProblem(principal) {
17
17
  if (principal.length === 0)
18
18
  return "principal is empty (the empty string is the deployment-default sentinel row, not an addressable principal)";
19
- if (principal.length > 190)
20
- return "principal exceeds the 190-char column width";
19
+ if (Buffer.byteLength(principal, "utf8") > PRINCIPAL_MAX_BYTES)
20
+ return `principal exceeds ${PRINCIPAL_MAX_BYTES} UTF-8 bytes (the principal length every identity column holds)`;
21
21
  if (/^\s|\s$/u.test(principal))
22
22
  return "principal has leading/trailing whitespace (rejected at the boundary: MySQL-protocol PAD SPACE collation would fold it onto another principal's row)";
23
23
  if (/[\u0000-\u001f\u007f]/u.test(principal))
@@ -1,6 +1,6 @@
1
1
  import { type UsageRow } from "../usage-analytics.js";
2
2
  import type { TaskStatus } from "@sema-agent/core";
3
- import { type FenceLanded, type FencedRun, type InProcessClaimFence, type CreateRunOutcome, type NewRunMeta, type RunIdemBinding, type RunListQuery, type RunRecord, type SessionSummary, type RunEvent, type PersistedTaskResult, type LatestRunRef, type SettledLegMemoryObservation } from "./store-contracts.js";
3
+ import { type RunStallWiring, type SessionRootRows, type FenceLanded, type FencedRun, type InProcessClaimFence, type CreateRunOutcome, type NewRunMeta, type RunIdemBinding, type RunListQuery, type RunRecord, type SessionRunRollup, type RunEvent, type PersistedTaskResult, type LatestRunRef, type SettledLegMemoryObservation } from "./store-contracts.js";
4
4
  import type { LedgerEventType } from "../trace/ledger-events.js";
5
5
  import { type SpaceCommitClaim, type SpaceCommitReading, type SpaceCommitState } from "../workspace-space-commit.js";
6
6
  /**
@@ -35,6 +35,17 @@ export declare class MemoryRunStore implements InProcessClaimFence {
35
35
  /** spaceKey → row — the twin of `workspace_space_commit` (the k8s workspace space's commit fence, `workspace-space-commit.ts`). */
36
36
  private readonly spaceCommitRecords;
37
37
  private readonly spaceCommits;
38
+ /**
39
+ * 规则 L 的根行面(可选;文件孪生同形同读法,见 `FileRunStore` 的同名字段):在场 ⇒ `createRun` 先在它的锁里判根行在不在(不在 ⇒ `sessionAbsent`),再认领 ——
40
+ * 测试装配「内存 run 店 + 同一只 local 会话店」的撤回与认领因此排在同一把根锁上。缺席(只测 run 店、或配引擎内存会话店的装配:那种店没有根行)⇒ 不判根行,行为与修前同。
41
+ */
42
+ private readonly rootRows;
43
+ /** 落死亡判决的窗与计数(构造时拿到;SQL 孪生同注,见 {@link RunStallWiring})。 */
44
+ private readonly stall;
45
+ constructor(opts?: {
46
+ readonly rootRows?: () => SessionRootRows;
47
+ readonly stall?: RunStallWiring;
48
+ });
38
49
  /** The k8s workspace space's commit fence rows (SQL twin: `workspace_space_commit`; the rule: `workspace-space-commit.ts`). */
39
50
  readSpaceCommit(spaceKey: string): Promise<SpaceCommitReading | undefined>;
40
51
  claimSpaceCommit(spaceKey: string, taskId: string, state: SpaceCommitState, claim: SpaceCommitClaim): Promise<boolean>;
@@ -46,11 +57,24 @@ export declare class MemoryRunStore implements InProcessClaimFence {
46
57
  /** Create a run iff no submission key of this request names a row (idemKey first, then a caller-minted taskId —
47
58
  * OBSERVED, see {@link CreateRunOutcome}) and the session has no active run (the task_active unique-key claim). */
48
59
  createRun(taskId: string, sessionId: string, owner: string | null, instanceId: string, meta?: NewRunMeta): Promise<CreateRunOutcome>;
60
+ /** {@link createRun} 的认领一半(根行已判过在 —— 或本店不接根行面)。同步判、同步写(没有让出点:两只并发认领不交错)。 */
61
+ private createRunClaimed;
62
+ /**
63
+ * 提交出口条件撤回的 run 半(`local-session-store.ts` 的 `SessionRunWithdrawSource`;文件孪生同名方法同判序):本会话有 `ownTaskId` 之外的 run 行 ⇒ `{ keep: "runs" }`;
64
+ * 否则删本次 run(事件 / 幂等键 / 行)。调用方持根行锁 —— 不取锁、不让出事件循环。`ownTaskId` 那一行不属于这只会话 ⇒ 响亮抛。
65
+ */
66
+ withdrawRunsOf(sessionId: string, ownTaskId: string | undefined): "proceed" | {
67
+ readonly keep: "runs";
68
+ };
69
+ /** 撤回本请求铸的这一条 run(SQL / 文件孪生同判,律见 SQL 孪生头注):行上的持有腿不是 `legId` ⇒ 不是本腿的行,一个字节不动;是 ⇒ 行仍在跑 ⇒ 删事件、幂等键、行,放本行持有的认领;已终局 ⇒ 行零删、只放它上面的提交幂等键;停驻 ⇒ 一个字节不动。交回删没删。 */
70
+ withdrawMintedRun(taskId: string, legId: string): Promise<boolean>;
49
71
  /** Undo THIS submission's binding (key + body fingerprint → null) — called only where the submit surface refuses the submission
50
72
  * before any work and terminalizes the row it just claimed (the sync leg's zero-work refusal, an execution-placement reject):
51
73
  * the error answer invites a retry, and a retry with the same key must run, not replay the refusal. The row stays (it
52
74
  * is the refusal's record); only the binding is freed. */
53
75
  releaseIdemKey(taskId: string): Promise<void>;
76
+ /** 放一条行上的提交幂等键绑定(`releaseIdemKey` 与 `withdrawMintedRun` 的非在跑臂同读)。 */
77
+ private dropIdemBinding;
54
78
  /** The body fingerprint this row's binding of `idem.key` holds — binding `idem.bodyFingerprint` first when it holds none (first
55
79
  * arrival binds, everyone after reads; the twin of the SQL conditional UPDATE). `null` = no such row, or the row is not bound to
56
80
  * this key (never written). */
@@ -63,7 +87,8 @@ export declare class MemoryRunStore implements InProcessClaimFence {
63
87
  isCancelRequested(taskId: string, owner: string | null): Promise<boolean>;
64
88
  requestPreempt(taskId: string, owner: string | null): Promise<boolean>;
65
89
  isPreemptRequested(taskId: string, owner: string | null): Promise<boolean>;
66
- heartbeat(taskId: string, owner: string | null): Promise<void>;
90
+ /** 心跳:刷新并交回「行还在 running 吗」(持有者据它停腿;SQL 孪生同注)。 */
91
+ heartbeat(taskId: string, owner: string | null): Promise<boolean>;
67
92
  appendEvent(taskId: string, seq: number, type: LedgerEventType, data: unknown): Promise<void>;
68
93
  maxSeq(taskId: string): Promise<number>;
69
94
  retainedFrom(taskId: string): Promise<number>;
@@ -74,15 +99,16 @@ export declare class MemoryRunStore implements InProcessClaimFence {
74
99
  /** The terminal write's one synchronous section (SQL twin: one transaction): the k8s space's pending commit row (when
75
100
  * offered) → the terminal row → the active-run slot release. Returns whether the pending row is now this run's. */
76
101
  private writeTerminal;
77
- /** Durable F4: park NON-terminal `suspended`, KEEP the task_active claim. CAS on running/suspended (reaper-revert guard).
78
- * [ref]:同时落 `result` —— 封口脱敏后的投影(`sealRunRowResult`,凭据不落;`null` = 没观察到 park 结果),SQL 孪生同注。 */
79
- setSuspended(taskId: string, result: PersistedTaskResult | null): Promise<void>;
80
- /** [ref] D-B: park NON-terminal `needs_review`, KEEP the claim. CAS on running/needs_review.
81
- * [ref]:同 {@link setSuspended} 落封口脱敏后的 `result`。 */
82
- setNeedsReview(taskId: string, result: PersistedTaskResult | null): Promise<void>;
83
- /** Durable F4 resume: flip suspended/needs_review → running (CAS) + reset cancel/preempt flags.
84
- * [ref](codex R1 [medium]):认领 = 接管 `instanceId`(= 当前持有副本;SQL 孪生同注)。CAS 输不改。 */
85
- markResuming(taskId: string, instanceId: string): Promise<boolean>;
102
+ /** Durable F4: park NON-terminal `suspended`, KEEP the task_active claim. CAS = 行仍归 `legId` ∧ running / suspended ∧ 没挂取消请求(三件的理由见 SQL 孪生)。
103
+ * [ref]:同时落 `result` —— 封口脱敏后的投影(`sealRunRowResult`,凭据不落;`null` = 没观察到 park 结果),SQL 孪生同注。
104
+ * 交回 CAS 的答:`true` ⇔ 这一写之后行停在这个词上;`false` ⇔ 三件有一件不成立(或行不在)—— 写不动它。判与写同一个同步段。 */
105
+ setSuspended(taskId: string, result: PersistedTaskResult | null, legId: string): Promise<boolean>;
106
+ /** [ref] D-B: park NON-terminal `needs_review`, KEEP the claim. CAS = {@link setSuspended} 的三件(词换成 needs_review)。
107
+ * [ref]:同 {@link setSuspended} 落封口脱敏后的 `result`;CAS 的答同 {@link setSuspended}。 */
108
+ setNeedsReview(taskId: string, result: PersistedTaskResult | null, legId: string): Promise<boolean>;
109
+ /** Durable F4 resume: flip suspended/needs_review → running (CAS);认领 = 换持有腿(铸新的 `legId` 交回)+ 两面请求旗随旧腿清零(SQL 孪生同注)。
110
+ * [ref](codex R1 [medium]):认领 = 接管 `instanceId`(= 当前持有副本;SQL 孪生同注)。CAS 输不改、交回 `undefined`。 */
111
+ markResuming(taskId: string, instanceId: string): Promise<string | undefined>;
86
112
  getActiveTaskId(sessionId: string): Promise<string | undefined>;
87
113
  /** 认领当写栅栏用(契约 = `store-contracts.ts` 的 `InProcessClaimFence`):判、刷新活性与 `write` 是同一个同步段。 */
88
114
  whileHoldingClaim(sessionId: string, taskId: string, write: (run: FencedRun) => FenceLanded): boolean;
@@ -91,7 +117,7 @@ export declare class MemoryRunStore implements InProcessClaimFence {
91
117
  listRuns(opts: RunListQuery): Promise<RunRecord[]>;
92
118
  /**
93
119
  * [ref] —— 这个会话**最近一条腿**的窄指针({@link SqlRunStore.latestRunForSession} 的孪生:同一个排序口径
94
- * `createdAt DESC, taskId DESC`,与本店 {@link MemoryRunStore.listSessions} 挑 `rn=1` 那一行的比较器逐字同一份)。
120
+ * `createdAt DESC, taskId DESC`,与本店窄读面 {@link MemoryRunStore.sessionRunRollups} 挑最新一条的比较器同一口径 —— `session-run-rollup.ts` 的 `newer`)。
95
121
  */
96
122
  latestRunForSession(sessionId: string): Promise<LatestRunRef | undefined>;
97
123
  /**
@@ -99,32 +125,17 @@ export declare class MemoryRunStore implements InProcessClaimFence {
99
125
  * {@link SqlRunStore.latestMemoryObservationForSession} 的孪生:同一只已结谓词(`isTerminalRunStatus`)、同一个排序口径 —— 与本店 {@link MemoryRunStore.latestRunForSession} 的比较器逐字同一份)。
100
126
  */
101
127
  latestMemoryObservationForSession(sessionId: string): Promise<SettledLegMemoryObservation | undefined>;
102
- /** DISTINCT sessions newest-first by last activity (the CC /resume picker): latest run's preview/status + first/last/count. */
103
- listSessions(opts: {
104
- owner?: string;
105
- includeUnowned?: boolean;
106
- cursor?: {
107
- lastActivityAt: string;
108
- sessionId: string;
109
- };
110
- limit: number;
111
- q?: string;
112
- }): Promise<SessionSummary[]>;
128
+ /** 会话枚举面读 run 账的窄读面(`SessionRunRollupSource`;规则 = 共用纯函数 {@link buildSessionRunRollups},与文件孪生、SQL 会话店的列表子查询同读)。 */
129
+ sessionRunRollups(opts?: {
130
+ readonly q?: string;
131
+ }): Promise<ReadonlyMap<string, SessionRunRollup>>;
113
132
  /**
114
133
  * E21 (§0.5 delete) — purge the runs ledger for one session, scoped by `session_id` ALONE (per-row owner is the
115
- * submitting principal and diverges from the session owner — full 判据 see the SQL twin's head-note, F-A);
116
- * aborts (returns {active}) if a run is live.
117
- *
118
- * `expectedSessionOwner` 是 SQL 双生的**化身围栏**入参(事务内复核 `session_meta.owner`,防「A 验权后 A' 删完、
119
- * 别人用同一 uuid 重新登记」那一形)。本孪生**执行不了**它:local 车道的会话表在另一只店里,这只账本没有
120
- * session_meta 可读 —— 参数只作契约对齐(签名不齐会让 RunStore 联合类型的调用点直接不可调)。local 的替代
121
- * 围栏是两条:①协调器在本调用**紧前**复读一次 canonical owner(不齐即整条中止);②数据根的独占 BootLock
122
- * 保证一个数据根恒一个进程,交错只可能发生在同进程的 await 缝里。这条不对称是**明写**的,不是遗漏。
134
+ * submitting principal and diverges from the session owner — full 判据 see the SQL twin's head-note, F-A)。
135
+ * **不判认领**:与 File / SQL 孪生同一条(唯一调用点 = 删除协调器的账本腿,围栏之后才调;律在 `src/session-deletion.ts`)。
123
136
  */
124
- deleteBySession(sessionId: string, expectedSessionOwner: string | null): Promise<{
137
+ deleteBySession(sessionId: string): Promise<{
125
138
  removed: number;
126
- } | {
127
- active: string;
128
139
  }>;
129
140
  /** 用量扫窗——in-memory 腿:遍历窗内行,投影同 usage-analytics 纯函数(SQL 孪生 parity)。 */
130
141
  usageScan(fromMs: number, toMs: number, opts?: {
@@ -139,8 +150,14 @@ export declare class MemoryRunStore implements InProcessClaimFence {
139
150
  status: string;
140
151
  count: number;
141
152
  }>>;
142
- /** Fail stale `running` rows (crashed-run backstop) + release task_active for any now-terminal row. */
143
- reapStale(olderThanMs: number): Promise<number>;
153
+ /** 收割器(全表形;SQL 孪生同注):心跳过期的 `running` 行判死 + 放掉终局行的认领。窗读构造时拿到的 getter。 */
154
+ reapStale(): Promise<number>;
155
+ /** 死亡判决的那一笔(收割器 / 观察口 / 认领冲突同一只;SQL 孪生的 `landStallVerdicts`):行 `due` ⇒ 翻 `failed`(`run.stalled`)、交回 `true`;否则不动。认领由调用方放。 */
156
+ private landStallVerdict;
157
+ /** 认领冲突的持有者落判决(SQL 孪生同判):`due` ⇒ 判死、放它的认领、交回 `true`(调用方照常认领)。 */
158
+ private settleDueHolder;
159
+ /** 观察口(落判决的三处之一;SQL 孪生同注):属主门之后的那条行 —— `due` ⇒ 判死、放认领、交回当前行;否则原样。 */
160
+ observeRun(row: RunRecord): Promise<RunRecord>;
144
161
  /** [ref] shared tail of both suspended-run reapers: flip one parked row → failed('approval.expired'), the
145
162
  * in-memory twin of the SQL UPDATE (`error`/`error_code` set directly — no result blob to derive from; [ref]: the park-time `result` is cleared, same as the SQL `result = NULL`). */
146
163
  private failExpiredPark;