@sema-agent/server 7.146.0 → 7.148.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (850) hide show
  1. package/MIGRATION.md +1423 -24
  2. package/README.md +21 -8
  3. package/README.zh-CN.md +15 -9
  4. package/USAGE.md +537 -216
  5. package/deploy/facts/lanes.json +7 -0
  6. package/deploy/sema-up/README.md +18 -7
  7. package/deploy/sema-up/chart/templates/NOTES.txt +1 -1
  8. package/deploy/sema-up/chart/templates/_helpers.tpl +42 -4
  9. package/deploy/sema-up/chart/templates/server-v4pro.yaml +5 -4
  10. package/deploy/sema-up/chart/templates/server.yaml +5 -4
  11. package/deploy/sema-up/chart/values.yaml +4 -3
  12. package/deploy/sema-up/cluster-up.sh +75 -176
  13. package/deploy/sema-up/kube-up.sh +29 -49
  14. package/deploy/sema-up/lib/chart-run.sh +23 -0
  15. package/deploy/sema-up/lib/dataroot.sh +3 -3
  16. package/deploy/sema-up/lib/flagshape.sh +4 -0
  17. package/deploy/sema-up/lib/health.sh +62 -13
  18. package/deploy/sema-up/lib/helm-values-cluster.py +18 -0
  19. package/deploy/sema-up/lib/helm-values-kube.py +35 -0
  20. package/deploy/sema-up/lib/lanes.json +2 -5
  21. package/deploy/sema-up/lib/regcred.py +8 -0
  22. package/deploy/sema-up/lib/remote/helm-install.sh +3 -0
  23. package/deploy/sema-up/lib/remote/image-import.sh +6 -0
  24. package/deploy/sema-up/lib/remote/machine-precheck.sh +11 -0
  25. package/deploy/sema-up/lib/remote/region-probe.sh +3 -0
  26. package/deploy/sema-up/lib/remote/stack-ready.sh +26 -0
  27. package/deploy/sema-up/lib/remote/vxlan-guard.sh +8 -0
  28. package/deploy/sema-up/lib/render-stack.py +17 -0
  29. package/deploy/sema-up/lib/shell-text.sh +87 -0
  30. package/deploy/sema-up/lib/usage-flags.txt +10 -0
  31. package/deploy/sema-up/lib/usage-head.txt +1 -0
  32. package/deploy/sema-up/lib/usage-tail.txt +13 -0
  33. package/deploy/sema-up/preflight.sh +10 -8
  34. package/deploy/sema-up/sema-up.sh +26 -48
  35. package/deploy/sema-up/smoke.sh +7 -6
  36. package/deploy/sema-up/stack/compose.dataroot.yaml +3 -0
  37. package/deploy/sema-up/stack/compose.yaml +18 -5
  38. package/deploy/sema-up/stack/sema-stack-cluster.yaml +25 -3
  39. package/dist/adoption/plan.d.ts +24 -0
  40. package/dist/adoption/plan.js +53 -1
  41. package/dist/adoption/runner.d.ts +10 -1
  42. package/dist/adoption/runner.js +36 -16
  43. package/dist/adoption/wire.d.ts +3 -3
  44. package/dist/approval-card.d.ts +32 -34
  45. package/dist/approval-gate-currency.js +3 -2
  46. package/dist/approval-reconciler.d.ts +4 -13
  47. package/dist/approval-reconciler.js +2 -2
  48. package/dist/approval.d.ts +16 -14
  49. package/dist/approval.js +3 -3
  50. package/dist/audit.d.ts +10 -3
  51. package/dist/audit.js +17 -9
  52. package/dist/auth-bridge.d.ts +0 -14
  53. package/dist/auth-bridge.js +0 -7
  54. package/dist/auto-mode-face.d.ts +10 -7
  55. package/dist/auto-mode-face.js +7 -4
  56. package/dist/background-agent-name.d.ts +19 -1
  57. package/dist/background-agent-name.js +12 -2
  58. package/dist/background-session-reap.d.ts +1 -1
  59. package/dist/bake-runner/main.js +9 -6
  60. package/dist/bench/s1/arms.js +6 -5
  61. package/dist/bench/s1/live-deps.js +8 -3
  62. package/dist/bench/s1/run-firm.js +6 -5
  63. package/dist/bind-host.d.ts +25 -0
  64. package/dist/bind-host.js +25 -0
  65. package/dist/boot/adoption.d.ts +3 -0
  66. package/dist/boot/adoption.js +1 -0
  67. package/dist/boot/crash-last.js +2 -1
  68. package/dist/boot/deployment-mods.d.ts +1 -1
  69. package/dist/boot/device-lane.js +5 -5
  70. package/dist/boot/engine-lease.d.ts +12 -11
  71. package/dist/boot/execution-env.d.ts +19 -8
  72. package/dist/boot/execution-env.js +80 -62
  73. package/dist/boot/execution-lane.d.ts +37 -9
  74. package/dist/boot/execution-lane.js +74 -20
  75. package/dist/boot/exit-boundary.d.ts +3 -3
  76. package/dist/boot/exit-boundary.js +6 -5
  77. package/dist/boot/exit-last.js +2 -1
  78. package/dist/boot/fatal-exit.d.ts +3 -5
  79. package/dist/boot/fatal-exit.js +2 -2
  80. package/dist/boot/governance-seams.d.ts +2 -2
  81. package/dist/boot/leader.d.ts +15 -0
  82. package/dist/boot/leader.js +18 -16
  83. package/dist/boot/memory-boundary.d.ts +11 -11
  84. package/dist/boot/memory-boundary.js +3 -3
  85. package/dist/boot/memory-consolidation.d.ts +50 -53
  86. package/dist/boot/memory-consolidation.js +11 -18
  87. package/dist/boot/org-memory.js +4 -3
  88. package/dist/boot/parked-revive-gate.d.ts +1 -1
  89. package/dist/boot/parked-revive-gate.js +3 -3
  90. package/dist/boot/reapers.d.ts +4 -3
  91. package/dist/boot/reapers.js +20 -17
  92. package/dist/boot/resolve-spec.d.ts +5 -3
  93. package/dist/boot/resolve-spec.js +133 -165
  94. package/dist/boot/retention-lane.d.ts +7 -45
  95. package/dist/boot/retention-lane.js +2 -2
  96. package/dist/boot/runner-deps.d.ts +28 -7
  97. package/dist/boot/runner-deps.js +11 -4
  98. package/dist/boot/runtime-caps.d.ts +2 -2
  99. package/dist/boot/runtime-caps.js +16 -2
  100. package/dist/boot/session-faces.d.ts +17 -7
  101. package/dist/boot/session-faces.js +122 -96
  102. package/dist/boot/shutdown.d.ts +5 -4
  103. package/dist/boot/shutdown.js +6 -4
  104. package/dist/boot/stage-01-config.d.ts +1 -1
  105. package/dist/boot/stage-01-config.js +14 -2
  106. package/dist/boot/stage-02-web-admin-pull.d.ts +2 -1
  107. package/dist/boot/stage-02-web-admin-pull.js +15 -8
  108. package/dist/boot/stage-03-store-backend.d.ts +4 -1
  109. package/dist/boot/stage-03-store-backend.js +4 -3
  110. package/dist/boot/stage-04-stores.d.ts +3 -1
  111. package/dist/boot/stage-04-stores.js +2 -2
  112. package/dist/boot/stage-05-execution-env.d.ts +9 -5
  113. package/dist/boot/stage-05-execution-env.js +5 -5
  114. package/dist/boot/stage-06-runners.d.ts +13 -15
  115. package/dist/boot/stage-06-runners.js +24 -18
  116. package/dist/boot/stage-07-capability-layer.d.ts +14 -11
  117. package/dist/boot/stage-07-capability-layer.js +9 -12
  118. package/dist/boot/stage-08-reapers.d.ts +14 -11
  119. package/dist/boot/stage-08-reapers.js +3 -3
  120. package/dist/boot/stage-09-leader.d.ts +16 -18
  121. package/dist/boot/stage-09-leader.js +12 -4
  122. package/dist/boot/stage-10-http-server.d.ts +16 -18
  123. package/dist/boot/stage-10-http-server.js +9 -5
  124. package/dist/boot/store-evidence.d.ts +20 -0
  125. package/dist/boot/store-evidence.js +13 -0
  126. package/dist/boot/stores.d.ts +12 -0
  127. package/dist/boot/stores.js +39 -17
  128. package/dist/boot/task-list-lane.d.ts +4 -4
  129. package/dist/boot/web-admin.d.ts +4 -2
  130. package/dist/boot/web-admin.js +58 -38
  131. package/dist/boot/webfetch-summarize-lane.d.ts +1 -1
  132. package/dist/boot-reclaim.d.ts +3 -1
  133. package/dist/boot-reclaim.js +1 -1
  134. package/dist/brain.d.ts +7 -18
  135. package/dist/brain.js +5 -17
  136. package/dist/budget.js +6 -6
  137. package/dist/capabilities/center-plugins.d.ts +9 -1
  138. package/dist/capabilities/center-plugins.js +37 -11
  139. package/dist/capabilities/center-wiring.js +1 -1
  140. package/dist/capabilities/composite-members.d.ts +3 -2
  141. package/dist/capabilities/composite-members.js +3 -2
  142. package/dist/capabilities/execution-lane.d.ts +7 -7
  143. package/dist/capabilities/execution-lane.js +2 -2
  144. package/dist/capabilities/hands-lane.d.ts +1 -1
  145. package/dist/capabilities/repo-tools.d.ts +2 -0
  146. package/dist/capabilities/repo-tools.js +14 -12
  147. package/dist/capabilities/scenarios.d.ts +38 -33
  148. package/dist/capabilities/scenarios.js +24 -25
  149. package/dist/capabilities/settings-contract.d.ts +29 -0
  150. package/dist/capabilities/settings-contract.js +14 -0
  151. package/dist/capabilities/skills.d.ts +6 -6
  152. package/dist/capabilities/tool-defer.d.ts +1 -1
  153. package/dist/capability-facts.d.ts +69 -4
  154. package/dist/capability-facts.js +77 -5
  155. package/dist/card-void.d.ts +4 -4
  156. package/dist/card-void.js +1 -1
  157. package/dist/center-credential-renewer.d.ts +6 -2
  158. package/dist/center-credential-renewer.js +10 -5
  159. package/dist/config-catalog.d.ts +16 -1
  160. package/dist/config-catalog.js +68 -61
  161. package/dist/config-dir-trust.d.ts +37 -4
  162. package/dist/config-dir-trust.js +88 -44
  163. package/dist/config-invariants.d.ts +58 -4
  164. package/dist/config-invariants.js +104 -23
  165. package/dist/config-lkg.d.ts +24 -2
  166. package/dist/config-lkg.js +22 -9
  167. package/dist/config-provider.d.ts +9 -9
  168. package/dist/config-provider.js +25 -108
  169. package/dist/config-pull-failure.d.ts +50 -0
  170. package/dist/config-pull-failure.js +48 -0
  171. package/dist/config-types.d.ts +215 -202
  172. package/dist/config.d.ts +69 -14
  173. package/dist/config.js +188 -96
  174. package/dist/degenerate-instrument.js +1 -1
  175. package/dist/delegated-session-owner.d.ts +1 -1
  176. package/dist/deleted-session-ids.d.ts +3 -2
  177. package/dist/deploy-facts.js +3 -2
  178. package/dist/deployment-governance.d.ts +3 -3
  179. package/dist/deployment-shape.d.ts +51 -16
  180. package/dist/deployment-shape.js +31 -6
  181. package/dist/egress-redirect.d.ts +25 -7
  182. package/dist/egress-redirect.js +20 -2
  183. package/dist/elicitation.d.ts +6 -5
  184. package/dist/elicitation.js +23 -22
  185. package/dist/engine-identity.d.ts +28 -0
  186. package/dist/engine-identity.js +10 -0
  187. package/dist/entry-problems.d.ts +5 -7
  188. package/dist/entry-problems.js +1 -1
  189. package/dist/env-facts.d.ts +7 -5
  190. package/dist/env-facts.js +12 -7
  191. package/dist/env-witness.d.ts +7 -0
  192. package/dist/env-witness.js +16 -0
  193. package/dist/execution-config-root.d.ts +5 -5
  194. package/dist/execution-config-root.js +5 -5
  195. package/dist/execution-env-purpose.d.ts +14 -0
  196. package/dist/execution-env-purpose.js +29 -0
  197. package/dist/execution-lane-caps.d.ts +53 -103
  198. package/dist/execution-lane-caps.js +51 -83
  199. package/dist/execution-placement.d.ts +65 -9
  200. package/dist/execution-placement.js +58 -0
  201. package/dist/field-conflict.d.ts +7 -11
  202. package/dist/field-conflict.js +3 -3
  203. package/dist/file-history-capture.d.ts +3 -3
  204. package/dist/file-history-disclosure.d.ts +2 -2
  205. package/dist/file-history-disclosure.js +1 -0
  206. package/dist/fleet/drain-entry.d.ts +17 -10
  207. package/dist/fleet/drain-entry.js +1 -1
  208. package/dist/fleet/fleet-bus.d.ts +21 -3
  209. package/dist/fleet/fleet-bus.js +35 -25
  210. package/dist/fleet/fleet-reconciler.js +2 -2
  211. package/dist/fleet/serving-lease.js +6 -7
  212. package/dist/fleet-client.js +3 -3
  213. package/dist/fleet-lease.d.ts +0 -1
  214. package/dist/fleet-lease.js +4 -5
  215. package/dist/history-anchor.d.ts +42 -0
  216. package/dist/history-anchor.js +34 -0
  217. package/dist/hitl-delivery.d.ts +90 -0
  218. package/dist/hitl-delivery.js +98 -0
  219. package/dist/hooks/classic-stations.d.ts +8 -11
  220. package/dist/hooks/classic-stations.js +0 -7
  221. package/dist/hooks/command-spawn.d.ts +1 -4
  222. package/dist/hooks/command-spawn.js +0 -11
  223. package/dist/hooks/hook-llm.d.ts +5 -1
  224. package/dist/hooks/hook-llm.js +24 -15
  225. package/dist/hooks/hook-runner.d.ts +119 -65
  226. package/dist/hooks/hook-runner.js +415 -217
  227. package/dist/host-lsp-manager.d.ts +22 -8
  228. package/dist/host-lsp-manager.js +4 -1
  229. package/dist/http/active-run-conflict.d.ts +2 -43
  230. package/dist/http/active-run-conflict.js +3 -7
  231. package/dist/http/admission.d.ts +4 -18
  232. package/dist/http/admission.js +75 -78
  233. package/dist/http/approval-sweeps.d.ts +5 -8
  234. package/dist/http/approval-sweeps.js +55 -30
  235. package/dist/http/caller-trust.d.ts +8 -10
  236. package/dist/http/caller-trust.js +1 -2
  237. package/dist/http/checkpoint-ctx.d.ts +17 -0
  238. package/dist/http/checkpoint-ctx.js +6 -0
  239. package/dist/http/claim-heartbeat.d.ts +49 -0
  240. package/dist/http/claim-heartbeat.js +46 -0
  241. package/dist/http/claim-latency.d.ts +10 -0
  242. package/dist/http/claim-latency.js +12 -0
  243. package/dist/http/claimed-run.d.ts +4 -3
  244. package/dist/http/dispatch.d.ts +8 -1
  245. package/dist/http/dispatch.js +77 -31
  246. package/dist/http/durable-run-leg.d.ts +3 -3
  247. package/dist/http/durable-run-leg.js +18 -12
  248. package/dist/http/execution-context.d.ts +18 -42
  249. package/dist/http/execution-context.js +11 -5
  250. package/dist/http/health-reader.d.ts +36 -0
  251. package/dist/http/health-reader.js +21 -0
  252. package/dist/http/health-self-report.d.ts +9 -9
  253. package/dist/http/health-self-report.js +4 -4
  254. package/dist/http/idempotency.d.ts +9 -5
  255. package/dist/http/idempotency.js +4 -4
  256. package/dist/http/memory-compliance-failure-reply.d.ts +15 -16
  257. package/dist/http/memory-compliance-failure-reply.js +7 -2
  258. package/dist/http/memory-face-fault-reply.d.ts +67 -0
  259. package/dist/http/memory-face-fault-reply.js +71 -0
  260. package/dist/http/memory-store-refusal-reply.d.ts +3 -3
  261. package/dist/http/memory-store-refusal-reply.js +6 -0
  262. package/dist/http/owner-access.d.ts +391 -56
  263. package/dist/http/owner-access.js +372 -33
  264. package/dist/http/principal-gate.d.ts +26 -94
  265. package/dist/http/principal-gate.js +24 -81
  266. package/dist/http/refusal-body.d.ts +35 -2
  267. package/dist/http/refusal-body.js +34 -0
  268. package/dist/http/request-guards.d.ts +10 -14
  269. package/dist/http/request-guards.js +34 -68
  270. package/dist/http/resume-composition.d.ts +37 -0
  271. package/dist/http/resume-composition.js +18 -0
  272. package/dist/http/resume-ctx-read.d.ts +35 -12
  273. package/dist/http/resume-ctx-read.js +25 -6
  274. package/dist/http/resume-legs.d.ts +24 -24
  275. package/dist/http/resume-legs.js +260 -171
  276. package/dist/http/retired-skill-manifest.d.ts +1 -1
  277. package/dist/http/rewind-files-reply.d.ts +34 -0
  278. package/dist/http/rewind-files-reply.js +36 -0
  279. package/dist/http/route-ctx.d.ts +56 -47
  280. package/dist/http/route-table.js +2 -0
  281. package/dist/http/routes/a2a-serve.d.ts +43 -5
  282. package/dist/http/routes/a2a-serve.js +58 -37
  283. package/dist/http/routes/admin-config-refresh.js +2 -2
  284. package/dist/http/routes/admin-drain.js +2 -2
  285. package/dist/http/routes/admin-memory-optout.js +4 -3
  286. package/dist/http/routes/adoption.d.ts +3 -0
  287. package/dist/http/routes/adoption.js +17 -10
  288. package/dist/http/routes/agents-roster.js +13 -7
  289. package/dist/http/routes/approvals-assistant.js +73 -88
  290. package/dist/http/routes/attachments.js +2 -2
  291. package/dist/http/routes/background.d.ts +3 -3
  292. package/dist/http/routes/background.js +9 -17
  293. package/dist/http/routes/capabilities.js +23 -20
  294. package/dist/http/routes/config-catalog.js +2 -2
  295. package/dist/http/routes/devices.d.ts +3 -3
  296. package/dist/http/routes/devices.js +5 -5
  297. package/dist/http/routes/diagnostics.d.ts +27 -3
  298. package/dist/http/routes/diagnostics.js +27 -21
  299. package/dist/http/routes/engine.js +2 -2
  300. package/dist/http/routes/fleet.js +5 -3
  301. package/dist/http/routes/images.js +10 -6
  302. package/dist/http/routes/leader.d.ts +7 -2
  303. package/dist/http/routes/leader.js +12 -3
  304. package/dist/http/routes/mcp-reconnect.d.ts +1 -1
  305. package/dist/http/routes/mcp-reconnect.js +7 -15
  306. package/dist/http/routes/memory-bundle.js +4 -7
  307. package/dist/http/routes/memory-compliance.js +4 -4
  308. package/dist/http/routes/memory-consolidation.js +6 -9
  309. package/dist/http/routes/memory-origin.d.ts +3 -1
  310. package/dist/http/routes/memory-origin.js +7 -8
  311. package/dist/http/routes/memory-policy.js +17 -12
  312. package/dist/http/routes/notify-wake.js +12 -20
  313. package/dist/http/routes/observability.js +3 -3
  314. package/dist/http/routes/principal-inbox.d.ts +1 -1
  315. package/dist/http/routes/principal-inbox.js +2 -2
  316. package/dist/http/routes/projects.d.ts +70 -0
  317. package/dist/http/routes/projects.js +87 -0
  318. package/dist/http/routes/retention-ops.js +6 -9
  319. package/dist/http/routes/rules.js +50 -7
  320. package/dist/http/routes/run-memory-capture.d.ts +2 -2
  321. package/dist/http/routes/run-memory-capture.js +6 -12
  322. package/dist/http/routes/run-permission-mode.d.ts +2 -2
  323. package/dist/http/routes/run-permission-mode.js +10 -17
  324. package/dist/http/routes/runs.js +148 -233
  325. package/dist/http/routes/session-memory-sync.d.ts +2 -2
  326. package/dist/http/routes/session-memory-sync.js +7 -13
  327. package/dist/http/routes/session-sync.d.ts +4 -2
  328. package/dist/http/routes/session-sync.js +48 -30
  329. package/dist/http/routes/sessions-list.d.ts +3 -3
  330. package/dist/http/routes/sessions-list.js +9 -9
  331. package/dist/http/routes/sessions.d.ts +7 -1
  332. package/dist/http/routes/sessions.js +177 -112
  333. package/dist/http/routes/shared-memory.js +6 -6
  334. package/dist/http/routes/side-query.js +2 -2
  335. package/dist/http/routes/tasks.js +144 -122
  336. package/dist/http/routes/trace-usage.d.ts +0 -12
  337. package/dist/http/routes/trace-usage.js +40 -46
  338. package/dist/http/routes/workflows.d.ts +39 -4
  339. package/dist/http/routes/workflows.js +42 -14
  340. package/dist/http/run-concurrency-cap.d.ts +20 -12
  341. package/dist/http/run-concurrency-cap.js +39 -26
  342. package/dist/http/run-read-face.d.ts +3 -5
  343. package/dist/http/run-read-face.js +8 -13
  344. package/dist/http/send.d.ts +12 -3
  345. package/dist/http/send.js +42 -6
  346. package/dist/http/server.d.ts +63 -50
  347. package/dist/http/server.js +52 -16
  348. package/dist/http/sse-log.d.ts +17 -10
  349. package/dist/http/sse-log.js +7 -7
  350. package/dist/http/stored-body-replay.d.ts +17 -3
  351. package/dist/http/stored-body-replay.js +11 -2
  352. package/dist/http/submit-ctx.d.ts +16 -8
  353. package/dist/http/submit-ctx.js +6 -2
  354. package/dist/http/submit-replay.d.ts +19 -6
  355. package/dist/http/submit-replay.js +18 -6
  356. package/dist/http/sync-submit-body.d.ts +3 -4
  357. package/dist/http/sync-submit-body.js +4 -5
  358. package/dist/http/wire-types.d.ts +23 -13
  359. package/dist/identity-source.d.ts +36 -5
  360. package/dist/identity-source.js +27 -0
  361. package/dist/index.d.ts +3 -2
  362. package/dist/index.js +2 -1
  363. package/dist/instruction-source-notice.d.ts +1 -1
  364. package/dist/key-resolver.d.ts +32 -0
  365. package/dist/key-resolver.js +23 -9
  366. package/dist/leader/diffup.js +2 -1
  367. package/dist/leader/endpoint.d.ts +26 -5
  368. package/dist/leader/endpoint.js +154 -14
  369. package/dist/leader/fanout.d.ts +3 -0
  370. package/dist/leader/fanout.js +78 -63
  371. package/dist/leader/leader.d.ts +16 -0
  372. package/dist/leader/leader.js +43 -3
  373. package/dist/leader/merge.d.ts +9 -1
  374. package/dist/leader/merge.js +16 -1
  375. package/dist/leader/repair-wire.js +1 -1
  376. package/dist/leader/wire.d.ts +36 -3
  377. package/dist/leader/wire.js +59 -18
  378. package/dist/lsp-evict.d.ts +6 -4
  379. package/dist/lsp-evict.js +2 -3
  380. package/dist/memory-embedder-reembed.d.ts +38 -0
  381. package/dist/memory-embedder-reembed.js +20 -0
  382. package/dist/memory-incident-sink.d.ts +0 -28
  383. package/dist/memory-incident-sink.js +5 -0
  384. package/dist/memory-operator-faces.d.ts +5 -4
  385. package/dist/memory-operator-faces.js +1 -1
  386. package/dist/memory-scope.d.ts +31 -4
  387. package/dist/memory-scope.js +65 -16
  388. package/dist/memory-store-refusal.d.ts +20 -4
  389. package/dist/memory-store-refusal.js +1 -1
  390. package/dist/memory-sync-client.d.ts +5 -2
  391. package/dist/memory-sync-client.js +19 -14
  392. package/dist/memory-sync.js +1 -1
  393. package/dist/model-compat.d.ts +51 -28
  394. package/dist/model-compat.js +55 -23
  395. package/dist/model-context-window.d.ts +18 -0
  396. package/dist/model-context-window.js +2 -0
  397. package/dist/model-entry-headers.d.ts +46 -4
  398. package/dist/model-entry-headers.js +2 -2
  399. package/dist/model-entry-refusal.d.ts +46 -17
  400. package/dist/model-entry-refusal.js +47 -27
  401. package/dist/model-plane-face.d.ts +19 -11
  402. package/dist/model-plane-face.js +9 -1
  403. package/dist/model-plane-probe.d.ts +2 -0
  404. package/dist/model-plane-probe.js +17 -0
  405. package/dist/model-provider.d.ts +3 -3
  406. package/dist/model-route-endpoint.d.ts +9 -5
  407. package/dist/model-route-endpoint.js +29 -7
  408. package/dist/model-select.d.ts +16 -0
  409. package/dist/model-select.js +4 -0
  410. package/dist/mountinfo.d.ts +37 -0
  411. package/dist/mountinfo.js +47 -0
  412. package/dist/namespaced-rule-name.d.ts +28 -2
  413. package/dist/namespaced-rule-name.js +10 -1
  414. package/dist/net-address.d.ts +1 -1
  415. package/dist/observability/corrupt-read-seat.d.ts +4 -4
  416. package/dist/observability/corrupt-read-seat.js +5 -3
  417. package/dist/observability/fail-open.d.ts +75 -47
  418. package/dist/observability/fail-open.js +77 -47
  419. package/dist/observability/logger.d.ts +22 -1
  420. package/dist/observability/logger.js +89 -12
  421. package/dist/observability/metrics.d.ts +2 -0
  422. package/dist/observability/metrics.js +5 -4
  423. package/dist/observability/otel-exporter.js +2 -1
  424. package/dist/observability/principal-context.d.ts +14 -7
  425. package/dist/observability/principal-context.js +8 -3
  426. package/dist/observability/run-terminal.d.ts +7 -1
  427. package/dist/observability/run-terminal.js +5 -2
  428. package/dist/observability/secret-env-scrub.d.ts +30 -4
  429. package/dist/observability/secret-env-scrub.js +15 -3
  430. package/dist/orchestration/hardened-vm-runner.d.ts +1 -0
  431. package/dist/orchestration/hardened-vm-runner.js +11 -5
  432. package/dist/orchestration/hardened-vm-worker-runner.d.ts +0 -14
  433. package/dist/orchestration/hardened-vm-worker-runner.js +5 -0
  434. package/dist/orchestration/hardened-vm-worker.js +2 -1
  435. package/dist/orchestration/workflow-agent-session-index.d.ts +7 -12
  436. package/dist/orchestration/workflow-agent-session-index.js +1 -6
  437. package/dist/orchestration/workflow-completion-inbox.d.ts +29 -9
  438. package/dist/orchestration/workflow-completion-inbox.js +65 -46
  439. package/dist/org-delivery-gate.d.ts +5 -4
  440. package/dist/org-delivery-gate.js +7 -6
  441. package/dist/org-memory-admission.d.ts +5 -2
  442. package/dist/org-memory-admission.js +25 -10
  443. package/dist/outbound-dispatcher.d.ts +1 -1
  444. package/dist/outbound-dispatcher.js +6 -12
  445. package/dist/owner-brands.d.ts +81 -0
  446. package/dist/owner-brands.js +42 -0
  447. package/dist/owner-faces.d.ts +531 -0
  448. package/dist/owner-faces.js +126 -0
  449. package/dist/parked-decide.d.ts +100 -31
  450. package/dist/parked-decide.js +162 -48
  451. package/dist/parked-revive-surface.d.ts +14 -4
  452. package/dist/parked-revive-surface.js +5 -4
  453. package/dist/peer-directory.d.ts +6 -8
  454. package/dist/peer-directory.js +3 -2
  455. package/dist/permission-rule-vocab.d.ts +53 -8
  456. package/dist/permission-rule-vocab.js +30 -2
  457. package/dist/plugins/adoption-log-sql.d.ts +0 -22
  458. package/dist/plugins/adoption-log-sql.js +5 -3
  459. package/dist/plugins/approval-ask-retired-delete-by-task-m50.d.ts +7 -0
  460. package/dist/plugins/approval-ask-retired-delete-by-task-m50.js +17 -0
  461. package/dist/plugins/approval-ask-store-file.d.ts +28 -9
  462. package/dist/plugins/approval-ask-store-file.js +74 -18
  463. package/dist/plugins/approval-ask-store-memory.d.ts +17 -7
  464. package/dist/plugins/approval-ask-store-memory.js +35 -12
  465. package/dist/plugins/approval-ask-store-sql.d.ts +42 -20
  466. package/dist/plugins/approval-ask-store-sql.js +44 -11
  467. package/dist/plugins/approval-exemption-skill-m46.d.ts +20 -0
  468. package/dist/plugins/approval-exemption-skill-m46.js +25 -0
  469. package/dist/plugins/approval-exemption-store.d.ts +6 -1
  470. package/dist/plugins/approval-exemption-store.js +14 -0
  471. package/dist/plugins/approval-nonce-store.d.ts +39 -12
  472. package/dist/plugins/approval-nonce-store.js +72 -23
  473. package/dist/plugins/blob-backend.d.ts +40 -195
  474. package/dist/plugins/blob-backend.js +41 -234
  475. package/dist/plugins/caching-session-store.d.ts +22 -5
  476. package/dist/plugins/caching-session-store.js +43 -4
  477. package/dist/plugins/checkpoint-index-columns.d.ts +33 -6
  478. package/dist/plugins/checkpoint-index-columns.js +39 -3
  479. package/dist/plugins/checkpoint-store-face.d.ts +84 -11
  480. package/dist/plugins/checkpoint-store-face.js +18 -1
  481. package/dist/plugins/device-store-sql.d.ts +2 -2
  482. package/dist/plugins/device-store-sql.js +6 -10
  483. package/dist/plugins/ensure-index.d.ts +13 -1
  484. package/dist/plugins/ensure-index.js +154 -21
  485. package/dist/plugins/ensure-schema-lock-policy.d.ts +0 -15
  486. package/dist/plugins/ensure-schema-lock-policy.js +3 -2
  487. package/dist/plugins/execution-lane-rename-m40.d.ts +20 -0
  488. package/dist/plugins/execution-lane-rename-m40.js +10 -0
  489. package/dist/plugins/execution-placement-sql.d.ts +63 -88
  490. package/dist/plugins/execution-placement-sql.js +94 -54
  491. package/dist/plugins/file-run-store.d.ts +89 -35
  492. package/dist/plugins/file-run-store.js +197 -142
  493. package/dist/plugins/host-platform.d.ts +24 -3
  494. package/dist/plugins/host-platform.js +15 -1
  495. package/dist/plugins/image-bake-store-sql.js +2 -0
  496. package/dist/plugins/imported-layer-root-retirement.d.ts +19 -10
  497. package/dist/plugins/imported-layer-root-retirement.js +4 -8
  498. package/dist/plugins/inbox-payload-column.d.ts +14 -0
  499. package/dist/plugins/inbox-payload-column.js +13 -0
  500. package/dist/plugins/k8s-pod-reaper.d.ts +1 -3
  501. package/dist/plugins/k8s-pod-reaper.js +0 -1
  502. package/dist/plugins/leader-run-store-sql.d.ts +22 -0
  503. package/dist/plugins/leader-run-store-sql.js +34 -4
  504. package/dist/plugins/local-checkpoint-store.d.ts +63 -23
  505. package/dist/plugins/local-checkpoint-store.js +204 -81
  506. package/dist/plugins/local-data-dir-modes-m39.d.ts +48 -0
  507. package/dist/plugins/local-data-dir-modes-m39.js +183 -0
  508. package/dist/plugins/local-docker-capacity.d.ts +93 -0
  509. package/dist/plugins/local-docker-capacity.js +194 -0
  510. package/dist/plugins/local-docker-reaper.d.ts +92 -0
  511. package/dist/plugins/local-docker-reaper.js +102 -0
  512. package/dist/plugins/local-engine-high-water.d.ts +13 -0
  513. package/dist/plugins/local-engine-high-water.js +62 -0
  514. package/dist/plugins/local-session-store.d.ts +442 -143
  515. package/dist/plugins/local-session-store.js +941 -289
  516. package/dist/plugins/local-session-window.d.ts +3 -2
  517. package/dist/plugins/local-session-window.js +3 -2
  518. package/dist/plugins/local-sidecar-quarantine.js +3 -2
  519. package/dist/plugins/local-task-attachment-store.d.ts +20 -1
  520. package/dist/plugins/local-task-attachment-store.js +32 -12
  521. package/dist/plugins/memory-embedder-fingerprint.d.ts +33 -10
  522. package/dist/plugins/memory-embedder-fingerprint.js +52 -12
  523. package/dist/plugins/memory-embedder.d.ts +1 -1
  524. package/dist/plugins/memory-embedder.js +11 -9
  525. package/dist/plugins/memory-engine-pg.d.ts +7 -5
  526. package/dist/plugins/memory-engine-pg.js +18 -9
  527. package/dist/plugins/memory-engine-sql-apply.d.ts +21 -8
  528. package/dist/plugins/memory-engine-sql-apply.js +7 -9
  529. package/dist/plugins/memory-engine-tidb.d.ts +12 -7
  530. package/dist/plugins/memory-engine-tidb.js +18 -10
  531. package/dist/plugins/memory-optout-grant-store-sql.d.ts +1 -1
  532. package/dist/plugins/memory-optout-grant-store-sql.js +3 -3
  533. package/dist/plugins/memory-run-store.d.ts +39 -27
  534. package/dist/plugins/memory-run-store.js +72 -70
  535. package/dist/plugins/one-time-migration-marker.d.ts +10 -0
  536. package/dist/plugins/one-time-migration-marker.js +7 -0
  537. package/dist/plugins/one-time-migrations.d.ts +325 -74
  538. package/dist/plugins/one-time-migrations.js +705 -230
  539. package/dist/plugins/org-delivery-quota-store.js +2 -1
  540. package/dist/plugins/owner-only-file-mode.d.ts +29 -0
  541. package/dist/plugins/owner-only-file-mode.js +141 -0
  542. package/dist/plugins/permission-rule-store-file.d.ts +11 -11
  543. package/dist/plugins/permission-rule-store-file.js +14 -2
  544. package/dist/plugins/permission-rule-store-sql.d.ts +4 -63
  545. package/dist/plugins/permission-rule-store-sql.js +6 -86
  546. package/dist/plugins/pg-pool.d.ts +3 -32
  547. package/dist/plugins/pg-pool.js +27 -11
  548. package/dist/plugins/release-version.d.ts +20 -0
  549. package/dist/plugins/release-version.js +28 -0
  550. package/dist/plugins/remote-env-adb.d.ts +20 -4
  551. package/dist/plugins/remote-env-adb.js +39 -11
  552. package/dist/plugins/remote-env-e2b.d.ts +19 -28
  553. package/dist/plugins/remote-env-e2b.js +40 -29
  554. package/dist/plugins/remote-env-host.d.ts +11 -10
  555. package/dist/plugins/remote-env-host.js +40 -27
  556. package/dist/plugins/remote-env-k8s.d.ts +45 -47
  557. package/dist/plugins/remote-env-k8s.js +122 -62
  558. package/dist/plugins/remote-env-local-docker.d.ts +152 -15
  559. package/dist/plugins/remote-env-local-docker.js +370 -75
  560. package/dist/plugins/remote-env-ssh.d.ts +8 -2
  561. package/dist/plugins/remote-env-ssh.js +26 -24
  562. package/dist/plugins/remote-scratchpad.js +4 -0
  563. package/dist/plugins/remote-shell.d.ts +59 -30
  564. package/dist/plugins/remote-shell.js +175 -62
  565. package/dist/plugins/retention-declaration.d.ts +37 -0
  566. package/dist/plugins/retention-declaration.js +9 -0
  567. package/dist/plugins/retention-deployment.d.ts +158 -0
  568. package/dist/plugins/retention-deployment.js +119 -0
  569. package/dist/plugins/retention-lane-store-sql.d.ts +74 -4
  570. package/dist/plugins/retention-lane-store-sql.js +103 -1
  571. package/dist/plugins/retention-sql.d.ts +29 -0
  572. package/dist/plugins/retention-sql.js +8 -0
  573. package/dist/plugins/run-preview-m45.d.ts +11 -0
  574. package/dist/plugins/run-preview-m45.js +19 -0
  575. package/dist/plugins/run-store-sql.d.ts +56 -68
  576. package/dist/plugins/run-store-sql.js +127 -116
  577. package/dist/plugins/s3-answer.d.ts +2 -1
  578. package/dist/plugins/sandbox-reaper.d.ts +26 -0
  579. package/dist/plugins/sandbox-reaper.js +2 -0
  580. package/dist/plugins/scenario-prefix-switch-m42.d.ts +54 -0
  581. package/dist/plugins/scenario-prefix-switch-m42.js +55 -0
  582. package/dist/plugins/scheduler-support.d.ts +16 -1
  583. package/dist/plugins/scheduler-support.js +22 -2
  584. package/dist/plugins/schema-consistency.d.ts +42 -15
  585. package/dist/plugins/schema-consistency.js +213 -13
  586. package/dist/plugins/schema-drift-sentence.d.ts +4 -1
  587. package/dist/plugins/schema-drift-sentence.js +4 -4
  588. package/dist/plugins/schema-ensure-legs.d.ts +10 -1
  589. package/dist/plugins/schema-ensure-legs.js +12 -2
  590. package/dist/plugins/schema-indexes.js +3 -0
  591. package/dist/plugins/schema-live-columns.d.ts +14 -5
  592. package/dist/plugins/schema-live-columns.js +10 -10
  593. package/dist/plugins/send-user-file.js +2 -1
  594. package/dist/plugins/session-birth.d.ts +37 -0
  595. package/dist/plugins/session-birth.js +38 -0
  596. package/dist/plugins/session-epoch-anchor.d.ts +40 -12
  597. package/dist/plugins/session-epoch-anchor.js +33 -11
  598. package/dist/plugins/session-ext-table.d.ts +98 -0
  599. package/dist/plugins/session-ext-table.js +134 -0
  600. package/dist/plugins/session-fork.d.ts +16 -2
  601. package/dist/plugins/session-fork.js +3 -0
  602. package/dist/plugins/session-ownership.d.ts +1 -1
  603. package/dist/plugins/session-placement.d.ts +22 -16
  604. package/dist/plugins/session-placement.js +15 -12
  605. package/dist/plugins/session-row-sql.d.ts +20 -7
  606. package/dist/plugins/session-row-sql.js +16 -8
  607. package/dist/plugins/session-run-rollup.d.ts +29 -0
  608. package/dist/plugins/session-run-rollup.js +40 -0
  609. package/dist/plugins/session-store-sql.d.ts +157 -0
  610. package/dist/plugins/session-store-sql.js +398 -0
  611. package/dist/plugins/session-withdraw-sql.d.ts +36 -0
  612. package/dist/plugins/session-withdraw-sql.js +42 -0
  613. package/dist/plugins/session-workspace-cell.d.ts +2 -2
  614. package/dist/plugins/session-workspace-cell.js +2 -2
  615. package/dist/plugins/shared-memory-store-sql.d.ts +10 -69
  616. package/dist/plugins/shared-memory-store-sql.js +15 -14
  617. package/dist/plugins/shell-sentinel-owner-m48.d.ts +20 -0
  618. package/dist/plugins/shell-sentinel-owner-m48.js +3 -0
  619. package/dist/plugins/snapshot-bucket-presence.d.ts +2 -1
  620. package/dist/plugins/snapshot-bucket-presence.js +1 -1
  621. package/dist/plugins/sql-driver.d.ts +24 -8
  622. package/dist/plugins/sql-driver.js +43 -9
  623. package/dist/plugins/sql-errors.d.ts +35 -5
  624. package/dist/plugins/sql-errors.js +55 -3
  625. package/dist/plugins/sql-json-column.d.ts +8 -7
  626. package/dist/plugins/sql-json-column.js +10 -6
  627. package/dist/plugins/store-backend.d.ts +114 -18
  628. package/dist/plugins/store-backend.js +340 -87
  629. package/dist/plugins/store-contracts.d.ts +97 -30
  630. package/dist/plugins/store-contracts.js +23 -1
  631. package/dist/plugins/store-fault.d.ts +28 -2
  632. package/dist/plugins/store-fault.js +20 -2
  633. package/dist/plugins/task-attachment-store.d.ts +21 -11
  634. package/dist/plugins/task-attachment-store.js +37 -19
  635. package/dist/plugins/task-list-store-sql.d.ts +1 -1
  636. package/dist/plugins/text-column-capacity.d.ts +21 -0
  637. package/dist/plugins/text-column-capacity.js +5 -0
  638. package/dist/plugins/tidb-pool.d.ts +3 -2
  639. package/dist/plugins/tidb-pool.js +42 -39
  640. package/dist/plugins/user-input-ledger-sql.d.ts +1 -1
  641. package/dist/plugins/web-search.js +5 -3
  642. package/dist/plugins/workflow-run-store-sql.d.ts +6 -1
  643. package/dist/plugins/workflow-run-store-sql.js +11 -5
  644. package/dist/principal-jwt.d.ts +4 -4
  645. package/dist/principal-jwt.js +20 -5
  646. package/dist/principal-shape.d.ts +41 -0
  647. package/dist/principal-shape.js +19 -0
  648. package/dist/question.d.ts +13 -23
  649. package/dist/question.js +21 -39
  650. package/dist/read-face-posture.d.ts +6 -6
  651. package/dist/read-face-posture.js +2 -2
  652. package/dist/request-declaration-refusal.d.ts +35 -12
  653. package/dist/request-declaration-refusal.js +21 -9
  654. package/dist/request-form.d.ts +58 -0
  655. package/dist/request-form.js +72 -0
  656. package/dist/request-image-urls.d.ts +8 -2
  657. package/dist/request-image-urls.js +2 -1
  658. package/dist/request-images.d.ts +20 -0
  659. package/dist/request-images.js +59 -0
  660. package/dist/request-key-closure.d.ts +6 -7
  661. package/dist/request-key-closure.js +15 -2
  662. package/dist/request-value-closure.d.ts +5 -5
  663. package/dist/request-value-closure.js +1 -1
  664. package/dist/resource-suspend.d.ts +7 -16
  665. package/dist/resource-suspend.js +1 -1
  666. package/dist/retired-name-host-notice.d.ts +21 -0
  667. package/dist/retired-name-host-notice.js +12 -0
  668. package/dist/rule-entry-list.d.ts +2 -2
  669. package/dist/rule-entry-list.js +3 -4
  670. package/dist/rule-issue-reading.d.ts +58 -0
  671. package/dist/rule-issue-reading.js +14 -0
  672. package/dist/rules-consent.d.ts +46 -16
  673. package/dist/rules-consent.js +102 -53
  674. package/dist/run-acceptance.d.ts +3 -1
  675. package/dist/run-acceptance.js +3 -0
  676. package/dist/run-local.d.ts +14 -6
  677. package/dist/run-local.js +109 -93
  678. package/dist/run-stale-default.d.ts +7 -0
  679. package/dist/run-stale-default.js +2 -0
  680. package/dist/runs.d.ts +73 -44
  681. package/dist/runs.js +65 -43
  682. package/dist/runtime-caps-resolver.d.ts +36 -14
  683. package/dist/runtime-caps-resolver.js +31 -14
  684. package/dist/runtime-governance.d.ts +2 -2
  685. package/dist/runtime-governance.js +5 -3
  686. package/dist/sealed-key-layout.d.ts +12 -6
  687. package/dist/sealed-key-layout.js +5 -1
  688. package/dist/sealed-key.d.ts +12 -2
  689. package/dist/sealed-key.js +116 -26
  690. package/dist/security.d.ts +133 -161
  691. package/dist/security.js +163 -59
  692. package/dist/sema-config-dir.d.ts +20 -0
  693. package/dist/sema-config-dir.js +27 -2
  694. package/dist/server-secret-env.d.ts +23 -5
  695. package/dist/server-secret-env.js +14 -4
  696. package/dist/service-version.d.ts +2 -1
  697. package/dist/service-version.js +2 -2
  698. package/dist/session-children-retire.d.ts +7 -5
  699. package/dist/session-children-retire.js +7 -2
  700. package/dist/session-deletion.d.ts +88 -0
  701. package/dist/session-deletion.js +8 -0
  702. package/dist/session-erase.d.ts +145 -0
  703. package/dist/session-erase.js +115 -0
  704. package/dist/session-error-wire.d.ts +6 -6
  705. package/dist/session-error-wire.js +1 -1
  706. package/dist/session-incarnation.d.ts +60 -10
  707. package/dist/session-incarnation.js +19 -2
  708. package/dist/session-policy-wire.d.ts +6 -3
  709. package/dist/session-policy-wire.js +11 -1
  710. package/dist/session-resident-background.d.ts +29 -47
  711. package/dist/session-resident-background.js +77 -8
  712. package/dist/session-row.d.ts +3 -2
  713. package/dist/session-rules-seat.d.ts +12 -0
  714. package/dist/session-rules-seat.js +19 -0
  715. package/dist/session-sync-kernel.d.ts +1 -1
  716. package/dist/session-titler.d.ts +7 -15
  717. package/dist/session-titler.js +1 -1
  718. package/dist/session-workspace.d.ts +11 -2
  719. package/dist/session-workspace.js +5 -0
  720. package/dist/sighup-idle.d.ts +1 -1
  721. package/dist/spec-fields.d.ts +57 -3
  722. package/dist/spec-fields.js +72 -51
  723. package/dist/store-posture.d.ts +138 -21
  724. package/dist/store-posture.js +188 -3
  725. package/dist/stored-request-hooks-m20.d.ts +3 -2
  726. package/dist/stored-request-hooks-m20.js +21 -16
  727. package/dist/stores-sql/background-agent-store-sql.d.ts +11 -2
  728. package/dist/stores-sql/background-agent-store-sql.js +73 -20
  729. package/dist/stores-sql/blob-index-sql.d.ts +148 -0
  730. package/dist/stores-sql/blob-index-sql.js +154 -0
  731. package/dist/stores-sql/checkpoint-store-sql.d.ts +34 -29
  732. package/dist/stores-sql/checkpoint-store-sql.js +86 -71
  733. package/dist/{plugins → stores-sql}/file-history-store-sql.d.ts +23 -11
  734. package/dist/{plugins → stores-sql}/file-history-store-sql.js +23 -18
  735. package/dist/stores-sql/mailbox-store-sql.d.ts +7 -4
  736. package/dist/stores-sql/mailbox-store-sql.js +31 -32
  737. package/dist/{plugins → stores-sql}/pg-session-storage.d.ts +30 -81
  738. package/dist/{plugins → stores-sql}/pg-session-storage.js +123 -244
  739. package/dist/{plugins → stores-sql}/retention-store-sql.d.ts +197 -223
  740. package/dist/{plugins → stores-sql}/retention-store-sql.js +148 -207
  741. package/dist/{plugins → stores-sql}/session-event-payload.d.ts +1 -1
  742. package/dist/{plugins → stores-sql}/session-event-payload.js +1 -1
  743. package/dist/stores-sql/session-policy-store-sql.d.ts +33 -11
  744. package/dist/stores-sql/session-policy-store-sql.js +44 -36
  745. package/dist/stores-sql/session-write-hooks.d.ts +65 -0
  746. package/dist/stores-sql/session-write-hooks.js +2 -0
  747. package/dist/{plugins → stores-sql}/tidb-session-storage.d.ts +14 -15
  748. package/dist/{plugins → stores-sql}/tidb-session-storage.js +22 -28
  749. package/dist/{plugins → stores-sql}/tidb-session-store.d.ts +67 -138
  750. package/dist/{plugins → stores-sql}/tidb-session-store.js +130 -200
  751. package/dist/stores-sql/tool-result-store-sql.d.ts +1 -1
  752. package/dist/stores-sql/tool-result-store-sql.js +1 -1
  753. package/dist/stores-sql/windowed-session-storage.d.ts +61 -0
  754. package/dist/stores-sql/windowed-session-storage.js +70 -0
  755. package/dist/submission-exit.d.ts +50 -0
  756. package/dist/submission-exit.js +108 -0
  757. package/dist/task-a2a.d.ts +7 -1
  758. package/dist/task-a2a.js +18 -17
  759. package/dist/task-cwd.d.ts +31 -3
  760. package/dist/task-cwd.js +25 -1
  761. package/dist/task-mcp.d.ts +11 -3
  762. package/dist/task-mcp.js +16 -19
  763. package/dist/task-settings.d.ts +23 -14
  764. package/dist/task-settings.js +35 -13
  765. package/dist/terminal.d.ts +25 -43
  766. package/dist/terminal.js +31 -11
  767. package/dist/tool-approval.d.ts +152 -137
  768. package/dist/tool-approval.js +199 -199
  769. package/dist/trace/core-keyset-guard.d.ts +22 -9
  770. package/dist/trace/core-vocab-wire.d.ts +95 -0
  771. package/dist/trace/core-vocab-wire.js +15 -0
  772. package/dist/trace/engine-notice-wire.d.ts +1 -1
  773. package/dist/trace/engine-notice-wire.js +2 -0
  774. package/dist/trace/exit-seat.d.ts +52 -4
  775. package/dist/trace/exit-seat.js +43 -36
  776. package/dist/trace/extension-call-face.d.ts +3 -2
  777. package/dist/trace/extension-call-face.js +3 -1
  778. package/dist/trace/ledger-events.d.ts +4 -7
  779. package/dist/trace/ledger-sink.d.ts +1 -30
  780. package/dist/trace/ledger-sink.js +0 -11
  781. package/dist/trace/model-segment.d.ts +5 -5
  782. package/dist/trace/model-segment.js +5 -5
  783. package/dist/trace/project.d.ts +88 -58
  784. package/dist/trace/project.js +64 -28
  785. package/dist/trace/redact.d.ts +124 -28
  786. package/dist/trace/redact.js +936 -328
  787. package/dist/trace/self-minted-wire.d.ts +750 -29
  788. package/dist/trace/self-minted-wire.js +262 -25
  789. package/dist/trace/sema-provenance.d.ts +45 -41
  790. package/dist/trace/sema-provenance.js +81 -10
  791. package/dist/trace/task-notification-facets.d.ts +70 -2
  792. package/dist/trace/task-notification-facets.js +71 -1
  793. package/dist/trace/wire-projection-faces.d.ts +43 -8
  794. package/dist/trace/wire-projection-faces.js +28 -3
  795. package/dist/unread-request-members.d.ts +66 -0
  796. package/dist/unread-request-members.js +41 -0
  797. package/dist/upstream-body.d.ts +23 -0
  798. package/dist/upstream-body.js +16 -0
  799. package/dist/url-refusal.d.ts +3 -3
  800. package/dist/url-refusal.js +11 -4
  801. package/dist/user-authored-text.d.ts +1 -1
  802. package/dist/user-input-ledger.d.ts +7 -8
  803. package/dist/user-input-ledger.js +1 -1
  804. package/dist/web-admin-client/apply-effective.d.ts +6 -3
  805. package/dist/web-admin-client/apply-effective.js +33 -40
  806. package/dist/web-admin-client/apply-ledger.d.ts +16 -7
  807. package/dist/web-admin-client/apply-ledger.js +5 -2
  808. package/dist/web-admin-client/candidate-gate.d.ts +35 -3
  809. package/dist/web-admin-client/candidate-gate.js +53 -5
  810. package/dist/web-admin-client/center-request.d.ts +6 -3
  811. package/dist/web-admin-client/center-request.js +17 -16
  812. package/dist/web-admin-client/effective-keys.d.ts +1 -1
  813. package/dist/web-admin-client/effective-keys.js +1 -2
  814. package/dist/web-admin-client/entry-metadata.d.ts +8 -0
  815. package/dist/web-admin-client/entry-metadata.js +13 -0
  816. package/dist/web-admin-client/facade.d.ts +1 -1
  817. package/dist/web-admin-client/http-client.d.ts +2 -1
  818. package/dist/web-admin-client/http-client.js +40 -13
  819. package/dist/web-admin-client/mcp-revocation.d.ts +1 -1
  820. package/dist/web-admin-client/mcp-revocation.js +2 -1
  821. package/dist/web-admin-client/read-warnings.d.ts +1 -0
  822. package/dist/web-admin-client/read-warnings.js +1 -0
  823. package/dist/web-admin-client/restart-signal.js +13 -6
  824. package/dist/web-admin-client/skills-mcp.d.ts +22 -8
  825. package/dist/web-admin-client/skills-mcp.js +26 -21
  826. package/dist/web-admin-client/types.d.ts +35 -51
  827. package/dist/workspace-space.d.ts +3 -2
  828. package/docs/DEVICE-EXECUTOR-PROTOCOL.md +4 -4
  829. package/package.json +16 -12
  830. package/scripts/drain-check-local.mjs +118 -173
  831. package/scripts/drain-check.mysql.sql +20 -16
  832. package/scripts/drain-check.pg.sql +20 -16
  833. package/wire-changes/server@7.147.0.json +813 -0
  834. package/wire-changes/server@7.148.0.json +1517 -0
  835. package/dist/http/memory-control-plane-corrupt-reply.d.ts +0 -25
  836. package/dist/http/memory-control-plane-corrupt-reply.js +0 -19
  837. package/dist/http/memory-layer-reply.d.ts +0 -30
  838. package/dist/http/memory-layer-reply.js +0 -24
  839. package/dist/lsp/e2b-bridge.d.ts +0 -57
  840. package/dist/lsp/e2b-bridge.js +0 -139
  841. package/dist/lsp/e2b-manager.d.ts +0 -93
  842. package/dist/lsp/e2b-manager.js +0 -178
  843. package/dist/lsp/lsp-frames.d.ts +0 -14
  844. package/dist/lsp/lsp-frames.js +0 -25
  845. package/dist/lsp/manager.d.ts +0 -129
  846. package/dist/lsp/manager.js +0 -127
  847. package/dist/lsp/types.d.ts +0 -12
  848. package/dist/lsp/types.js +0 -2
  849. package/dist/lsp/ws-transport.d.ts +0 -40
  850. package/dist/lsp/ws-transport.js +0 -210
@@ -1,4 +1,5 @@
1
1
  import { type SshHostKeyPolicy } from "../ssh-host-key.js";
2
+ import { type LaneLogger } from "./remote-shell.js";
2
3
  import { FileError, ExecutionError, RemoteExecutionError, type ExecutionEnv, type RemoteExecutionEnv, type WorkspaceHandle, type FileInfo, type Result, type SymlinkChain, type OutputChunk, type ExecStreamOptions, type RemoteConnectConfig, type SnapshotId, type SessionToken, type VmLifecycleOptions, type ExecutionEnvFactory } from "@sema-agent/core";
3
4
  import { type LaneHomeConfig } from "../lane-home-probe.js";
4
5
  type ExecOpts = Parameters<ExecutionEnv["exec"]>[1];
@@ -36,6 +37,8 @@ export interface SshEnvConfig extends LaneHomeConfig {
36
37
  };
37
38
  /** [ref] / [ref]:主机密钥校验策略(两旋钮,语义见 {@link SshHostKeyPolicy});缺席 = 两旋钮都没配。 */
38
39
  hostKey?: SshHostKeyPolicy;
40
+ /** 运维日志座(起服装配递本服务的 logger):暂存写「已有目标的权限位没带过去」那一行经它(缺席 ⇒ 暂存编排自建一只,见 `remote-shell.ts` `StagedWriteLane.logger`)。 */
41
+ logger?: LaneLogger;
39
42
  }
40
43
  type ConnectResult = {
41
44
  ok: true;
@@ -172,13 +175,16 @@ export declare class RemoteSshExecutionEnv implements RemoteExecutionEnv {
172
175
  }): Promise<Result<string[], FileError>>;
173
176
  readBinaryFile(p: string, abortSignal?: AbortSignal): Promise<Result<Uint8Array, FileError>>;
174
177
  /** 暂存写的两只面(规则与提交脚本的唯一属主 = `remote-shell.ts` `writeFileStaged` / `appendFileStaged`;父目录与私有暂存目录由编排的准备那一步建):
175
- * 上传 = sftp 整份写到私有目录里的暂存件;提交 = 文件面探针 exec。两者同一身份(sftp 子系统与 exec 都是这条连接的登录用户)。
178
+ * 上传 = sftp 整份写到私有目录里的暂存件(阶段一 = 拿 sftp 通道,见 {@link prepareSftp};阶段二 = 写);提交 = 文件面探针 exec。两者同一身份(sftp 子系统与 exec 都是这条连接的登录用户)。
176
179
  * sftp 写不收取消信号 ⇒ 取消在传输结束之后、提交之前生效(目标未碰)。 */
177
180
  private stagedLane;
181
+ /** 阶段一(备件):拿 sftp 通道 —— 连接断了在这里懒重连,取消落在这里 ⇒ `aborted`、没有一个字节发出;阶段二:`write` 把整份字节经这条通道写到 `dest`
182
+ * (sftp 写不收取消信号:一旦发出就写完,答成功)。`abs` = 目标路径(阶段一失败的错误点名它)。 */
183
+ private prepareSftp;
178
184
  /** 整旧或整新(暂存 → 一次 `mv -f`)。修前 `sftp.writeFile(abs)` 就地 O_TRUNC:传输中途断 ⇒ 目标 = 半份新件。 */
179
185
  writeFile(p: string, content: string | Uint8Array, abortSignal?: AbortSignal): Promise<Result<void, FileError>>;
180
186
  /** 追加(暂存要加的字节 → 一次 `cat >>`;inode 不换、已有字节不重写)。修前 = 读旧 + 拼 + 整份就地重写(O(文件);中途断 ⇒ 半份)。
181
- * 目录不收新名字 / 私有目录收不成私有时的退路 = sftp 直接追加到目标。 */
187
+ * 目录不收新名字 / 私有目录收不成私有时的退路 = sftp 直接追加到目标(拿通道是备件阶段:取消落在那里 ⇒ `aborted`、目标未碰;追加那一步不收取消,发出就写完)。 */
182
188
  appendFile(p: string, content: string | Uint8Array, abortSignal?: AbortSignal): Promise<Result<void, FileError>>;
183
189
  fileInfo(p: string, abortSignal?: AbortSignal): Promise<Result<FileInfo, FileError>>;
184
190
  listDir(p: string, abortSignal?: AbortSignal): Promise<Result<FileInfo[], FileError>>;
@@ -51,6 +51,7 @@ export class RemoteSshExecutionEnv {
51
51
  dataTimeoutMs: config.dataTimeoutMs ?? 5 * 60_000,
52
52
  retry: { maxAttempts: config.retry?.maxAttempts ?? 3, backoffMs: config.retry?.backoffMs ?? 500 },
53
53
  hostKey: config.hostKey,
54
+ logger: config.logger,
54
55
  };
55
56
  this.cwd = this.cfg.mountPath;
56
57
  this.homeSeat = new LaneHomeSeat(PROVIDER, config);
@@ -622,37 +623,38 @@ export class RemoteSshExecutionEnv {
622
623
  return { ok: false, error: this.fileError(e, abs) };
623
624
  }
624
625
  }
625
- stagedLane(data) {
626
- return {
627
- upload: async (dest, signal) => {
628
- try {
629
- const sftp = await this.sftp(signal);
630
- await new Promise((resolve, reject) => sftp.writeFile(dest, data, (err) => (err ? reject(err) : resolve())));
631
- return ok(undefined);
632
- }
633
- catch (e) {
634
- return { ok: false, error: this.fileError(e, dest) };
635
- }
636
- },
637
- run: (cmd, signal) => this.fsExec(cmd, signal),
638
- };
639
- }
640
- async writeFile(p, content, abortSignal) {
641
- return writeFileStaged(this.stagedLane(bytesOf(content)), this.resolve(p), abortSignal);
626
+ stagedLane(abs, data) {
627
+ return { prepare: this.prepareSftp(abs, (sftp, dest, done) => sftp.writeFile(dest, data, done)), run: (cmd, signal) => this.fsExec(cmd, signal), provider: PROVIDER, logger: this.cfg.logger };
642
628
  }
643
- async appendFile(p, content, abortSignal) {
644
- const abs = this.resolve(p);
645
- const data = bytesOf(content);
646
- return appendFileStaged(this.stagedLane(data), abs, abortSignal, (ctx) => ctx.inPlace(async (signal) => {
629
+ prepareSftp(abs, write) {
630
+ return async (signal) => {
647
631
  try {
648
632
  const sftp = await this.sftp(signal);
649
- await new Promise((resolve, reject) => sftp.appendFile(abs, data, (err) => (err ? reject(err) : resolve())));
650
- return ok(undefined);
633
+ return ok({
634
+ upload: async (dest) => {
635
+ try {
636
+ await new Promise((resolve, reject) => write(sftp, dest, (err) => (err ? reject(err) : resolve())));
637
+ return ok(undefined);
638
+ }
639
+ catch (e) {
640
+ return { ok: false, error: this.fileError(e, dest) };
641
+ }
642
+ },
643
+ });
651
644
  }
652
645
  catch (e) {
653
646
  return { ok: false, error: this.fileError(e, abs) };
654
647
  }
655
- }));
648
+ };
649
+ }
650
+ async writeFile(p, content, abortSignal) {
651
+ const abs = this.resolve(p);
652
+ return writeFileStaged(this.stagedLane(abs, bytesOf(content)), abs, abortSignal);
653
+ }
654
+ async appendFile(p, content, abortSignal) {
655
+ const abs = this.resolve(p);
656
+ const data = bytesOf(content);
657
+ return appendFileStaged(this.stagedLane(abs, data), abs, abortSignal, this.prepareSftp(abs, (sftp, dest, done) => sftp.appendFile(dest, data, done)));
656
658
  }
657
659
  async fileInfo(p, abortSignal) {
658
660
  const abs = this.resolve(p);
@@ -6,8 +6,11 @@ export function remoteScratchpadDirFor(sessionId) {
6
6
  return `/tmp/scratchpad/${sessionId}`;
7
7
  }
8
8
  export function withRemoteScratchpad(factory, logger) {
9
+ const decorated = new WeakSet();
9
10
  return async (ctx) => {
10
11
  const env = await factory(ctx);
12
+ if (decorated.has(env))
13
+ return env;
11
14
  const dir = remoteScratchpadDirFor(ctx.sessionId);
12
15
  if (dir === undefined) {
13
16
  if (ctx.sessionId)
@@ -17,6 +20,7 @@ export function withRemoteScratchpad(factory, logger) {
17
20
  const e = env;
18
21
  if (typeof e.exec !== "function")
19
22
  return env;
23
+ decorated.add(env);
20
24
  const origExec = e.exec.bind(e);
21
25
  let ensured;
22
26
  const ensure = () => (ensured ??= (async () => {
@@ -209,6 +209,12 @@ export declare function runSymlinkChain(absPath: string, run: ShellChainRun): Pr
209
209
  * 残留记录走 stdout、错误走 stderr:两条通道不混,分类器读到的 stderr 里没有路径文本。记录不改脚本的退出码:写照它自己的结局答,残留另行留痕。
210
210
  */
211
211
  export declare const STAGE_DIR_LEFT_MARK = "sema: staging directory left behind:";
212
+ /**
213
+ * 提交脚本往 stdout 写的另一种记录(与 {@link STAGE_DIR_LEFT_MARK} 同机制:`<记号> <值>` + NUL 收尾,同一只读口 {@link scriptRecordsOf}):已有目标的权限位**没带到**换上去的新件上
214
+ * ({@link carryMode} 读不出 / 读不懂 / `chmod` 被拒,而随后 `mv` 换上去了)—— 值 = 目标原来的模式串(读不出时为空)。`mv` 没成、落到就地拷入那一段时不写:原 inode 的模式本来就不变。
215
+ * 编排读到它 ⇒ 写照样成功 + 一行运维 warn `remote_env_file_mode_failed`(「传完之后设模式」全树一种策略:尽力而为 + 一行 warn;见 {@link landStaged})。
216
+ */
217
+ export declare const STAGE_MODE_NOT_CARRIED_MARK = "sema: file mode not carried:";
212
218
  /** 一次远端写的暂存位置(纯数据):`dir` = 目标目录下的私有目录,`file` = 其中那只暂存文件。 */
213
219
  export interface StagingPaths {
214
220
  readonly dir: string;
@@ -231,15 +237,20 @@ export declare function buildStagingPrepareCommand(stage: StagingPaths): string;
231
237
  * 整文件替换的提交脚本(POSIX sh,纯数据 ⇒ `build*`)。一次往返,**整条命令只有一个退出状态**(`{ …; }`,理由同
232
238
  * {@link buildSymlinkChainCommand} 头注)。`d` = 私有目录,`s` = 其中的暂存件,`t` = 目标。
233
239
  *
234
- * 1. 叶是符号链接 ⇒ 读**一跳**(`readlink`,不带 `-f`;相对目标锚在链接自己的目录,不折 `..`,与链视图同一词法;
235
- * 链接文本的结尾换行原样保留 —— `-n` 不加换行,`$(…)` 会吞掉结尾换行,所以输出后垫一个 `.` 再剥掉;`-n` 不被认 ⇒ 读不出一跳 ⇒ 第 3 步经链接就地写):那一跳是常规文件或还不存在
236
- * ⇒ 提交落到那一跳上(链接保持是链接);否则(链 / 非常规)⇒ 走第 3 步就地写。
240
+ * 1. 叶是符号链接 ⇒ 读**一跳**(`readlink`,不带 `-f` 也不带 `-n` —— `-n` 不在 POSIX 里;相对目标锚在链接自己的目录,不折 `..`,与链视图同一词法;
241
+ * 输出后垫一个 `.` 再剥掉 `.` 与 `readlink` 加的那一个换行:`$(…)` 会吞掉结尾换行,垫 `.` 才保得住)。**读到的链接文本只有核过才信**:那一跳是常规文件、且与链接解出来的是同一只文件
242
+ * (`[ -ef ]`:同设备同 inode),且同目录里没有「这个名字再加一个结尾换行」的另一个名字 ⇒ 提交落到那一跳上(链接保持是链接)。核这两道是因为不带 `-n` 时,结尾带换行的链接文本在有的实现(BSD)上
243
+ * 读不出与「少一个换行」的另一个名字的分别 —— 读错了,rename 会换掉另一只文件(或,两个名字是同一 inode 的硬链接时,`-ef` 也核得过,rename 换掉的却不是链接指的那个名字);核不上就不信。
244
+ * 核不上 / 读不出 / 悬空(那一跳还不存在,读到的文本无从核)/ 链 / 非常规 ⇒ 走第 3 步经链接就地写(目标正确,非原子)。
237
245
  * 2. 目标是常规文件或不存在 ⇒ 私有目录不在目标的目录里(跟了一跳)⇒ 先在目标目录里用**同一只私有目录名**、同样生来 0700、同样收紧过地**重新暂存**一份
238
- * (目标机本地拷贝,不过网络;拷成了就改用新的那只、删原私有目录;拷不成就删掉新建的那只、收紧不成就放弃它,用原暂存件 ——
246
+ * (目标机本地拷贝,不过网络;拷成了就改用新的那只、删原私有目录;拷不成就删掉新建的那只、用原暂存件;建不出来(目录不收新名字)同此;
247
+ * 新建的那只被放进了别人的 `data`(收紧之后核出)就放弃它、用原暂存件 ——
239
248
  * 删不掉的都写一条 {@link STAGE_DIR_LEFT_MARK} 记录),
240
249
  * 让 rename 不跨文件系统(与 core 把暂存放在最终目标旁边同形);
241
- * 已有文件的权限位带到暂存件上(`stat -c %a`,BSD 退到 `stat -f %Lp`;带不过去不拦)—— **在 `mv` 之前**,换上去的那一刻权限位已是目标的;
242
- * `mv -f` 换上去,成功 ⇒ 删私有目录(删不掉 ⇒ 一条 {@link STAGE_DIR_LEFT_MARK} 记录,仍 `exit 0`:目标已是新件)。
250
+ * **收不成私有**(同一只 {@link hardenPrivate} 不过)⇒ 放弃新建的那只、写 {@link RESTAGE_DIR_UNSEALED_MESSAGE}、**退出 {@link STAGE_DIR_UNSEALED_EXIT}**、目标未碰、原暂存件还在
251
+ * —— 与准备那一步的同名出口是同一条退路:编排清掉原暂存件、计 `stage-seal-fallback`、直接写目标(不再静默拿原暂存件 `mv` 过去:目标在另一个文件系统上时那是一次非原子的拷贝,且不留痕);
252
+ * 已有文件的权限位带到暂存件上({@link carryMode}:按 {@link readModeOwner} 读目标的模式串、换成八进制再 `chmod`,含 setuid / setgid / 粘滞位;带不过去不拦,记下读到的模式串)—— **在 `mv` 之前**,换上去的那一刻权限位已是目标的;
253
+ * `mv -f` 换上去,成功 ⇒ 带不过去时先写一条 {@link STAGE_MODE_NOT_CARRIED_MARK} 记录,再删私有目录(删不掉 ⇒ 一条 {@link STAGE_DIR_LEFT_MARK} 记录,仍 `exit 0`:目标已是新件)。
243
254
  * 3. 其余(链接链 / FIFO / 设备 / 目录 / `mv` 被拒,如单文件绑定挂载的 EBUSY)⇒ 已落定的暂存件就地拷进目标(与 core 的回落同形:
244
255
  * 非原子,但不再经过网络传输),见 {@link takeAndWrite}:先把暂存件**打开**(读不了 ⇒ 先补上属主读位,仍读不了 ⇒ 非零退出、目标未碰),
245
256
  * 再**删掉暂存名**(删不掉 ⇒ 非零退出、目标未碰,残留目录由脚本点名),然后才从已打开的那份拷进目标,最后关 fd、删私有目录(删不掉只记录)。于是
@@ -254,6 +265,26 @@ export declare function buildStagedCommitCommand(stage: StagingPaths, target: st
254
265
  export declare function buildStagedAppendCommand(stage: StagingPaths, target: string): string;
255
266
  /** 清掉一次写的私有目录({@link removalOf}:只删 `data` 与这只目录;不在 ⇒ 什么都不做;退出 0 ⇔ 不在了)。纯数据 ⇒ `build*`。 */
256
267
  export declare function buildStagingDiscardCommand(stage: StagingPaths): string;
268
+ /**
269
+ * 一次传输的两段 —— **取消的读法只看在哪一段**:
270
+ * · 阶段一 = 备件({@link PrepareUpload}):第一个字节发往目标机之前的一切 —— adb 在本机落的临时件、ssh 开 sftp 通道(含懒重连)、k8s 建连、追加退路里的读旧 + 拼。
271
+ * 这一段取消或失败 ⇒ 没有一个字节到过任何目的地(暂存也好、目标也好),照实答:`aborted` 就是 `aborted`、目标未碰。
272
+ * · 阶段二 = {@link PreparedUpload.upload}:字节真发出的那一段。暂存路上它被取消打断 ⇒ 暂存件被删、目标未碰(`aborted`);**退路(就地写目标)上**它被取消打断 ⇒ `unknown`
273
+ * (可能已有字节到了目标,见 {@link writeInPlace});它不收取消(ssh 的 sftp)⇒ 照样写完,结果照实。
274
+ * 阶段二只有编排调用(腿交出备好的 {@link PreparedUpload},自己不调它)—— 「哪一段包不包」不靠腿记得。
275
+ */
276
+ export interface PreparedUpload {
277
+ /** 阶段二:把备好的**整份**字节放到 `dest`(建或覆盖,追加退路的腿把它读作追加)。 */
278
+ upload(dest: string, abortSignal?: AbortSignal): Promise<Result<void, FileError>>;
279
+ /** 放掉阶段一造的东西(adb 的本机临时件)。编排对每一份备好的东西恰调一次(传完、传败、放弃都调);**不抛**。 */
280
+ release?(): Promise<void>;
281
+ }
282
+ /** 阶段一:备好要传的字节。取消或失败 ⇒ 没有字节到过任何目的地(见 {@link PreparedUpload});答成功 ⇒ 交出阶段二。 */
283
+ export type PrepareUpload = (abortSignal?: AbortSignal) => Promise<Result<PreparedUpload, FileError>>;
284
+ /**
285
+ * 阶段一无事可做的腿(local-docker:传输调用本身就是起进程;e2b:`files.write` 是一次调用)的 {@link PrepareUpload}:备件即刻就绪,`upload` 就是腿的传输。
286
+ */
287
+ export declare function readyUpload(upload: PreparedUpload["upload"]): PrepareUpload;
257
288
  /**
258
289
  * 一次暂存写交给 {@link writeFileStaged} / {@link appendFileStaged} 的两只面 —— 各腿的传输留在腿上,规则在这里。
259
290
  * 🔴 **`upload` 与 `run` 必须是同一个身份、在同一台机器上**:私有目录由 `run` 建(0700,属写入方),`upload` 要进得去;提交由 `run` 做,
@@ -261,44 +292,42 @@ export declare function buildStagingDiscardCommand(stage: StagingPaths): string;
261
292
  * 与 `run` 同一身份的传输,不能让编排迁就它。
262
293
  */
263
294
  export interface StagedWriteLane {
264
- /** 把**整份**字节放到 `dest`(新建;`dest` 的目录已在且是写入方的私有目录)—— 腿自己的传输(sftp / adb push / 容器内 `cat` 收 stdin / 分块 exec / provider 文件 API)。 */
265
- upload(dest: string, abortSignal?: AbortSignal): Promise<Result<void, FileError>>;
295
+ /** 腿的传输(两段,见 {@link PreparedUpload}):阶段一备好整份字节;阶段二 `upload(dest)` 把它放到 `dest`(新建;暂存路上 `dest` 的目录已在且是写入方的私有目录,退路上 `dest` 就是目标)。 */
296
+ prepare: PrepareUpload;
266
297
  /** 目标机上的一次 shell 往返(腿的文件面探针 exec:只用绝对路径,不进工作目录)。`abortSignal` 只有准备那一步带(提交一旦发出不再听取消)。 */
267
298
  run(cmd: string, abortSignal?: AbortSignal): ReturnType<ShellChainRun>;
299
+ /** 车道名(运维行的 `provider` 位,与各适配器自己的运维行同一个词)。 */
300
+ readonly provider: string;
301
+ /** 运维日志座(适配器递起服装配给它的那一只;缺席 ⇒ 编排自建一只 JSON 行 logger,见 {@link fallbackLaneLogger})。今天只有「权限位没带过去」那一行经它。 */
302
+ readonly logger?: LaneLogger | undefined;
268
303
  }
269
- /**
270
- * 退路拿到的两样(编排为每一次退路造一只,见 {@link createDirectContext}):`signal` = 这次写的取消信号;`inPlace(step)` = 把**写目标的那一步**包起来
271
- * (连同那一步自己的通道准备:ssh 在步内拿 sftp 通道)。取消的读法只看那一步有没有被包住:包住的那一步**答了** `aborted` ⇒ 改写成 `unknown`(可能已有字节到了目标,
272
- * 保守;通道准备里被取消也算在内);那一步开始之前取消已发生 ⇒ `aborted`、那一步不跑;那一步不收取消、照样写完(ssh 的 sftp)⇒ 结果照实(成功);
273
- * 没包的步骤(读旧)答的 `aborted` 原样透出(目标未碰)。编排不猜退路走到了哪儿。
274
- */
275
- export interface StagedDirectContext {
276
- readonly signal: AbortSignal | undefined;
277
- inPlace<T>(step: (abortSignal?: AbortSignal) => Promise<Result<T, FileError>>): Promise<Result<T, FileError>>;
304
+ /** 编排说话用的那一面(与各适配器的 logger 座同形)。 */
305
+ export interface LaneLogger {
306
+ warn(event: string, fields?: Record<string, unknown>): void;
278
307
  }
279
308
  /**
280
- * 不暂存时的退路 —— 目录不收新名字(建私有目录被 `permission_denied` 拒)或私有目录收不成私有:腿直接对目标做的那一步(core 同一条回落:文件本身可能可写)。
281
- * 两只文件面、五条腿**必传**:写面 = 腿的上传直落目标;追加面 = 能追加写的腿(ssh / local-docker / k8s)直接追加到目标,只能把整份文件落到一个路径上的腿
282
- * (e2b 的 `files.write`、adb 的 push)读旧 + 拼 + 整份写目标(adb 的这一形就是 7.138.x 的追加)。字节流向目标的那一步必须经 `ctx.inPlace`(读旧不包)。
309
+ * 不暂存时的退路 —— 目录不收新名字(建私有目录被 `permission_denied` 拒)或私有目录收不成私有:腿直接对目标做的那一次写(core 同一条回落:文件本身可能可写)。
310
+ * 与腿的传输同一个形({@link PrepareUpload}),编排以目标本身为 `dest` 调它的 `upload`。两只文件面、五条腿**必传**:写面 = 腿自己的传输({@link StagedWriteLane.prepare});
311
+ * 追加面 = 能追加写的腿(ssh / local-docker / k8s)阶段二直接追加到目标,只能把整份文件落到一个路径上的腿(e2b 的 `files.write`、adb 的 push)阶段一读旧 + 拼
312
+ * ({@link rewriteAppend}),阶段二整份写目标(adb 的这一形就是 7.138.x 的追加)。
283
313
  */
284
- export type StagedWriteDirect = (ctx: StagedDirectContext) => Promise<Result<void, FileError>>;
314
+ export type StagedWriteDirect = PrepareUpload;
285
315
  /**
286
- * 只能把整份文件落到一个路径上的腿(e2b 的 `files.write`、adb 的 push)在退路里的追加 —— 两腿共用这一只,各自只给读与写:
287
- * 读旧(`not_found` ⇒ 按空;别的读错原样透出、不写)+ 按字节拼(二进制安全)+ 整份写目标。读旧**不**经 `ctx.inPlace`(取消落在这里 ⇒ `aborted`、目标未碰),
288
- * 整份写经 `ctx.inPlace`(见 {@link StagedDirectContext})。adb 的这一形就是 7.138.x 的追加。
316
+ * 只能把整份文件落到一个路径上的腿(e2b 的 `files.write`、adb 的 push)在退路里的追加 —— 两腿共用这一只,各自只给读与「由拼好的整份字节造阶段一」:
317
+ * 阶段一 = 读旧(`not_found` ⇒ 按空;别的读错原样透出、不写)+ 按字节拼(二进制安全)+ 腿的备件;阶段二 = 整份写目标。adb 的这一形就是 7.138.x 的追加。
289
318
  */
290
- export declare function rewriteAppend(read: (abortSignal?: AbortSignal) => Promise<Result<Uint8Array, FileError>>, write: (bytes: Uint8Array, abortSignal?: AbortSignal) => Promise<Result<void, FileError>>, add: string | Uint8Array, ctx: StagedDirectContext): Promise<Result<void, FileError>>;
319
+ export declare function rewriteAppend(read: (abortSignal?: AbortSignal) => Promise<Result<Uint8Array, FileError>>, prepareOf: (merged: Uint8Array) => PrepareUpload, add: string | Uint8Array): PrepareUpload;
291
320
  /**
292
321
  * 远端整文件替换(ssh / adb / local-docker / k8s / e2b 五条腿调同一只;父目录由准备那一步建)。契约:成功 ⇒ 目标整份是新内容;传输失败 ⇒ 目标整份是旧内容;
293
- * `aborted` ⇒ 目标未碰。私有目录清不掉 ⇒ 错误消息点名残留的目录。目录不收新名字、或私有目录收不成私有 ⇒ 不暂存,腿的上传直接落目标一次(旧形,core 同一条回落;非原子)。
322
+ * `aborted` ⇒ 目标未碰。私有目录清不掉 ⇒ 错误消息点名残留的目录(含跟一跳重新暂存的那一只)。目录不收新名字、或私有目录收不成私有(含重新暂存的那一只)⇒ 不暂存,腿的传输直接落目标一次(旧形,core 同一条回落;非原子)。
294
323
  * 提交往返本身断了(传输层错误)⇒ 答 `unknown`,消息写明提交跑没跑不可知。
295
324
  */
296
325
  export declare function writeFileStaged(lane: StagedWriteLane, abs: string, abortSignal?: AbortSignal): Promise<Result<void, FileError>>;
297
326
  /**
298
- * 远端追加(五条腿调同一只;`lane.upload` 上传的是**要加的那几个字节**)。暂存那条路的契约:成功 ⇒ 目标 = 旧内容 + 新字节;传输失败 / `aborted` ⇒
299
- * 目标未碰;已有字节从不被重写、inode 不换。`direct` = 目录不收新名字 / 私有目录收不成私有时腿直接写目标的那一步(必传,见 {@link StagedWriteDirect}),
300
- * 不在上面的契约里:非原子 —— 中途断 ⇒ 目标可能只加上了一部分(整份写目标的 e2b / adb:已有字节被重写,目标可能没了或只剩半份);取消落在**写目标那一步开始之前**
301
- * (读旧)⇒ `aborted`、目标未碰;写目标那一步因取消中断 ⇒ `unknown`、目标可能只写了一半,那一步自己的通道准备算在步内(保守,见头注与 {@link StagedDirectContext})。
327
+ * 远端追加(五条腿调同一只;`lane.prepare` 备的是**要加的那几个字节**)。暂存那条路的契约:成功 ⇒ 目标 = 旧内容 + 新字节;传输失败 / `aborted` ⇒
328
+ * 目标未碰;已有字节从不被重写、inode 不换。`direct` = 目录不收新名字 / 私有目录收不成私有时腿直接写目标的那一次(必传,见 {@link StagedWriteDirect}),
329
+ * 不在上面的契约里:非原子 —— 中途断 ⇒ 目标可能只加上了一部分(整份写目标的 e2b / adb:已有字节被重写,目标可能没了或只剩半份);取消落在**备件阶段**(含读旧)
330
+ * ⇒ `aborted`、目标未碰;传输那一步因取消中断 ⇒ `unknown`、目标可能只写了一半(见 {@link PreparedUpload})。
302
331
  */
303
332
  export declare function appendFileStaged(lane: StagedWriteLane, abs: string, abortSignal: AbortSignal | undefined, direct: StagedWriteDirect): Promise<Result<void, FileError>>;
304
333
  //# sourceMappingURL=remote-shell.d.ts.map
@@ -1,6 +1,8 @@
1
1
  import { ExecutionError, FileError, SYMLINK_CHAIN_MAX_HOPS } from "@sema-agent/core";
2
2
  import { NAME_MAX_BYTES, classifyFsStderr, fileErrorFromExec } from "./remote-env-file-error.js";
3
3
  import { recordFailOpen } from "../observability/fail-open.js";
4
+ import { createLogger } from "../observability/logger.js";
5
+ import { seatText } from "../trace/exit-seat.js";
4
6
  import { randomBytes } from "node:crypto";
5
7
  export const EXEC_FORCE_SETTLE_GRACE_MS = 3000;
6
8
  export function armPipeDestroyGrace(child) {
@@ -157,8 +159,11 @@ export async function runSymlinkChain(absPath, run) {
157
159
  const STAGED_FILE = "data";
158
160
  const STAGE_DIR_REFUSED_EXIT = 3;
159
161
  const STAGE_DIR_UNSEALED_EXIT = 4;
160
- const STAGE_DIR_UNSEALED_MESSAGE = "sema: the private staging directory could not be made private (chmod 700 failed or did not take effect, the mode or owner read back differently, or an inherited ACL entry could not be removed or read on this platform — the filesystem ignores permission bits or the parent directory carries a default or inheritable ACL); nothing was staged";
162
+ const STAGE_DIR_UNSEALED_REASON = "chmod 700 failed or did not take effect, the mode or owner read back differently, or an inherited ACL entry could not be removed or read on this platform — the filesystem ignores permission bits or the parent directory carries a default or inheritable ACL";
163
+ const STAGE_DIR_UNSEALED_MESSAGE = `sema: the private staging directory could not be made private (${STAGE_DIR_UNSEALED_REASON}); nothing was staged`;
164
+ const RESTAGE_DIR_UNSEALED_MESSAGE = `sema: the private staging directory beside the link's target could not be made private (${STAGE_DIR_UNSEALED_REASON}); the target was not touched`;
161
165
  export const STAGE_DIR_LEFT_MARK = "sema: staging directory left behind:";
166
+ export const STAGE_MODE_NOT_CARRIED_MARK = "sema: file mode not carried:";
162
167
  export function buildStagingPaths(abs, nonce = randomBytes(6).toString("hex")) {
163
168
  const cut = abs.lastIndexOf("/");
164
169
  const parent = abs.slice(0, cut + 1);
@@ -172,9 +177,11 @@ export function buildStagingPaths(abs, nonce = randomBytes(6).toString("hex")) {
172
177
  function privateMkdir(dir) {
173
178
  return `(umask 077 && mkdir -- ${dir})`;
174
179
  }
180
+ function readModeOwner(path) {
181
+ return `l=$(ls -ldn -- ${path} 2>/dev/null) && set -f && set -- $l && [ -n "$3" ]`;
182
+ }
175
183
  function hardenPrivate(dir) {
176
- const statOf = (gnu, bsd) => `$(stat -c ${gnu} -- ${dir} 2>/dev/null || stat -f ${bsd} -- ${dir} 2>/dev/null)`;
177
- return `( chmod -- 700 ${dir} 2>/dev/null && m=${statOf("%a", "%Lp")} && u=${statOf("%u", "%u")} && case "$m" in 700|[1-7]700) [ "$u" = "$(id -u)" ];; *) false;; esac && ${aclCleared(dir)} )`;
184
+ return `( chmod -- 700 ${dir} 2>/dev/null && ${readModeOwner(dir)} && case "$1" in drw[xs]--[-S]--[-T]*) [ "$3" = "$(id -u)" ];; *) false;; esac && ${aclCleared(dir)} )`;
178
185
  }
179
186
  function aclCleared(dir) {
180
187
  const marker = `ls_out=$(cd ${dir} && ls -ld . 2>&1) && [ -z "$(printf '%s\\n' "$ls_out" | sed -n 2p)" ] && mode_word=\${ls_out%% *} && ` +
@@ -189,9 +196,6 @@ function aclCleared(dir) {
189
196
  function emptyPrivate(dir) {
190
197
  return `[ ! -e ${dir}/${STAGED_FILE} ] && [ ! -L ${dir}/${STAGED_FILE} ]`;
191
198
  }
192
- function sealPrivate(dir) {
193
- return `${hardenPrivate(dir)} && ${emptyPrivate(dir)}`;
194
- }
195
199
  function removalOf(dir) {
196
200
  return `{ [ ! -L ${dir} ] && rm -f -- ${dir}/${STAGED_FILE} && { rmdir -- ${dir} 2>/dev/null || [ ! -e ${dir} ]; }; }`;
197
201
  }
@@ -213,21 +217,31 @@ export function buildStagingPrepareCommand(stage) {
213
217
  }
214
218
  function takeAndWrite(redirect) {
215
219
  return (`[ -r "$s" ] || chmod -- u+r "$s" 2>/dev/null; exec 3< "$s" || exit 1; { [ ! -L "$d" ] && rm -f -- "$s"; } || { ${leftMark(`"$d"`)}; exit 1; }; ` +
216
- `cat <&3 ${redirect} "$t"; w=$?; exec 3<&-; ${removePrivate(`"$d"`)}; exit $w; `);
220
+ `cat <&3 ${redirect} "$t"; w=$?; [ "$w" -eq 0 ] || w=1; exec 3<&-; ${removePrivate(`"$d"`)}; exit $w; `);
221
+ }
222
+ function carryMode(src, dst) {
223
+ const digit = `perm_digit() { case "$1" in ---|--S|--T) echo 0;; --x|--s|--t) echo 1;; -w-|-wS|-wT) echo 2;; -wx|-ws|-wt) echo 3;; ` +
224
+ `r--|r-S|r-T) echo 4;; r-x|r-s|r-t) echo 5;; rw-|rwS|rwT) echo 6;; rwx|rws|rwt) echo 7;; *) return 1;; esac; }`;
225
+ const triples = `m=\${1#?} && pu=\${m%"\${m#???}"} && m=\${m#???} && pg=\${m%"\${m#???}"} && m=\${m#???} && po=\${m%"\${m#???}"}`;
226
+ const special = `sp=0; case "$pu" in ??[sS]) sp=4;; esac; case "$pg" in ??[sS]) sp=$((sp+2));; esac; case "$po" in ??[tT]) sp=$((sp+1));; esac`;
227
+ return (`( if ${readModeOwner(src)}; then ${digit} && ${triples} && du=$(perm_digit "$pu") && dg=$(perm_digit "$pg") && do_=$(perm_digit "$po") && ` +
228
+ `{ ${special}; chmod "$sp$du$dg$do_" ${dst}; } && exit 0; printf '%s' "$1"; fi; exit 1 ) 2>/dev/null`);
217
229
  }
218
230
  export function buildStagedCommitCommand(stage, target) {
219
231
  return (`{ d=${shellQuote(stage.dir)}; s="$d/${STAGED_FILE}"; t=${shellQuote(target)}; ` +
220
- `if [ -L "$t" ]; then h=$(readlink -n -- "$t" && printf .) || h=; h=\${h%.}; ` +
232
+ `if [ -L "$t" ]; then nl=$(printf '\\n.'); nl=\${nl%.}; h=$(readlink -- "$t" && printf .) || h=; h=\${h%.}; h=\${h%"$nl"}; ` +
221
233
  `case "$h" in "") ;; /*) ;; *) l="\${t%/*}"; case "$l" in "") h="/$h" ;; */) h="$l$h" ;; *) h="$l/$h" ;; esac ;; esac; ` +
222
- `if [ -n "$h" ] && [ ! -L "$h" ] && { [ ! -e "$h" ] || [ -f "$h" ]; }; then t="$h"; fi; fi; ` +
234
+ `if [ -n "$h" ] && [ ! -L "$h" ] && [ -f "$h" ] && [ ! -e "$h$nl" ] && [ ! -L "$h$nl" ] && [ "$h" -ef "$t" ]; then t="$h"; fi; fi; ` +
223
235
  `if [ ! -L "$t" ] && { [ ! -e "$t" ] || [ -f "$t" ]; }; then ` +
224
236
  `if [ "\${t%/*}" != "\${d%/*}" ]; then e="\${t%/*}/\${d##*/}"; ` +
225
237
  `if { ${privateMkdir(`"$e"`)}; } 2>/dev/null; then ` +
226
- `if { ${sealPrivate(`"$e"`)}; } 2>/dev/null; then ` +
238
+ `if { ${hardenPrivate(`"$e"`)}; } 2>/dev/null; then ` +
239
+ `if { ${emptyPrivate(`"$e"`)}; } 2>/dev/null; then ` +
227
240
  `if cat -- "$s" > "$e/${STAGED_FILE}" 2>/dev/null; then o="$d"; d="$e"; s="$e/${STAGED_FILE}"; ${removePrivate(`"$o"`)}; else ${removePrivate(`"$e"`)}; fi; ` +
228
- `else ${abandonPrivate(`"$e"`)}; fi; fi; fi; ` +
229
- `if [ -f "$t" ]; then m=$(stat -c %a -- "$t" 2>/dev/null || stat -f %Lp -- "$t" 2>/dev/null) && chmod "$m" "$s" 2>/dev/null; fi; ` +
230
- `if mv -f -- "$s" "$t" 2>/dev/null; then ${removePrivate(`"$d"`)}; exit 0; fi; fi; ` +
241
+ `else ${abandonPrivate(`"$e"`)}; fi; ` +
242
+ `else ${abandonPrivate(`"$e"`)}; printf '%s\\n' ${shellQuote(RESTAGE_DIR_UNSEALED_MESSAGE)} >&2; exit ${STAGE_DIR_UNSEALED_EXIT}; fi; fi; fi; ` +
243
+ `carry_mode() { ${carryMode('"$t"', '"$s"')}; }; cm=-; if [ -f "$t" ]; then cm=$(carry_mode) && cm=-; fi; ` +
244
+ `if mv -f -- "$s" "$t" 2>/dev/null; then [ "$cm" = - ] || printf '%s %s\\0' ${shellQuote(STAGE_MODE_NOT_CARRIED_MARK)} "$cm"; ${removePrivate(`"$d"`)}; exit 0; fi; fi; ` +
231
245
  `${takeAndWrite(">")}}`);
232
246
  }
233
247
  export function buildStagedAppendCommand(stage, target) {
@@ -236,14 +250,77 @@ export function buildStagedAppendCommand(stage, target) {
236
250
  export function buildStagingDiscardCommand(stage) {
237
251
  return removalOf(shellQuote(stage.dir));
238
252
  }
239
- async function discardStaged(lane, stage) {
240
- const r = await lane.run(buildStagingDiscardCommand(stage));
253
+ export function readyUpload(upload) {
254
+ return async () => ({ ok: true, value: { upload } });
255
+ }
256
+ async function cleanOnce(lane, cmd, fallbackWhy) {
257
+ const r = await lane.run(cmd);
241
258
  if (!r.ok)
242
259
  return r.error.message;
243
- return r.value.exitCode === 0 ? undefined : r.value.stderr.trim() || "it holds something this write did not put there, or it was replaced by a link";
260
+ return r.value.exitCode === 0 ? undefined : r.value.stderr.trim() || fallbackWhy;
261
+ }
262
+ function scriptRecordsOf(stdout) {
263
+ const heads = [
264
+ { kind: "left", head: `${STAGE_DIR_LEFT_MARK} ` },
265
+ { kind: "mode", head: `${STAGE_MODE_NOT_CARRIED_MARK} ` },
266
+ ];
267
+ const leftDirs = [];
268
+ let modeNotCarried;
269
+ for (const rec of stdout.split("\0")) {
270
+ let first;
271
+ for (const { kind, head } of heads) {
272
+ const at = rec.indexOf(head);
273
+ if (at >= 0 && (first === undefined || at < first.at))
274
+ first = { kind, at, head };
275
+ }
276
+ if (first === undefined)
277
+ continue;
278
+ const value = rec.slice(first.at + first.head.length);
279
+ switch (first.kind) {
280
+ case "left":
281
+ leftDirs.push(value);
282
+ break;
283
+ case "mode":
284
+ modeNotCarried = value;
285
+ break;
286
+ default: {
287
+ const unreachable = first.kind;
288
+ throw new Error(`unhandled script record kind ${String(unreachable)}`);
289
+ }
290
+ }
291
+ }
292
+ return { leftDirs, modeNotCarried };
293
+ }
294
+ async function settleStaging(lane, stage, named, discardOriginal) {
295
+ const todo = new Map();
296
+ if (discardOriginal)
297
+ todo.set(stage.dir, { cmd: buildStagingDiscardCommand(stage), why: "it holds something this write did not put there, or it was replaced by a link" });
298
+ const name = stage.dir.slice(stage.dir.lastIndexOf("/") + 1);
299
+ for (const dir of named) {
300
+ if (todo.has(dir))
301
+ continue;
302
+ const faithful = dir.endsWith(`/${name}`) && !dir.includes("\uFFFD");
303
+ todo.set(dir, faithful ? { cmd: reapCommandOf(dir), why: "it still holds an entry, or it was replaced by a link" } : { cmd: undefined, why: "the script named a directory that is not this write's staging directory under a path that can be trusted; left alone" });
304
+ }
305
+ const left = [];
306
+ for (const [dir, { cmd, why }] of todo) {
307
+ const still = cmd === undefined ? why : await cleanOnce(lane, cmd, why);
308
+ if (still === undefined)
309
+ continue;
310
+ left.push({ dir, why: still });
311
+ recordFailOpen("server.remote-write.staging-dir-left", dir);
312
+ }
313
+ return left;
244
314
  }
245
- function withResidue(e, stage, why) {
246
- return why === undefined ? e : new FileError(e.code, `${e.message} (the staging directory ${stage.dir} could not be removed: ${why})`, e.path, e);
315
+ function reapCommandOf(dir) {
316
+ const d = shellQuote(dir);
317
+ return `{ rmdir -- ${d} 2>/dev/null || { [ ! -e ${d} ] && [ ! -L ${d} ]; }; }`;
318
+ }
319
+ function withResidue(e, left) {
320
+ if (left.length === 0)
321
+ return e;
322
+ const named = left.length === 1 ? `the staging directory ${left[0].dir}` : `the staging directories ${left.map((l) => l.dir).join(", ")}`;
323
+ return new FileError(e.code, `${e.message} (${named} could not be removed: ${left.map((l) => l.why).join("; ")})`, e.path, e);
247
324
  }
248
325
  async function landStaged(lane, abs, abortSignal, commitOf, direct) {
249
326
  if (abortSignal?.aborted)
@@ -251,78 +328,114 @@ async function landStaged(lane, abs, abortSignal, commitOf, direct) {
251
328
  const stage = buildStagingPaths(abs);
252
329
  const prep = await lane.run(buildStagingPrepareCommand(stage), abortSignal);
253
330
  if (!prep.ok) {
254
- const left = await discardStaged(lane, stage);
255
- return { ok: false, error: withResidue(fileErrorFromExec(prep.error, abs), stage, left) };
331
+ const left = await settleStaging(lane, stage, [], true);
332
+ return { ok: false, error: withResidue(fileErrorFromExec(prep.error, abs), left) };
256
333
  }
257
334
  if (prep.value.exitCode !== 0) {
258
- noteLeftDirs(prep.value.stdout);
335
+ const left = await settleStaging(lane, stage, scriptRecordsOf(prep.value.stdout).leftDirs, false);
259
336
  if (abortSignal?.aborted)
260
- return { ok: false, error: new FileError("aborted", "aborted before the write started; the target was not touched", abs) };
337
+ return { ok: false, error: withResidue(new FileError("aborted", "aborted before the write started; the target was not touched", abs), left) };
261
338
  const e = classifyFsStderr(prep.value.stderr, abs, "unknown");
262
339
  if (prep.value.exitCode === STAGE_DIR_REFUSED_EXIT && e.code === "permission_denied")
263
- return direct(createDirectContext(abs, abortSignal, "the directory does not accept new names"));
340
+ return viaDirect(direct, abs, abortSignal, "the directory does not accept new names", left);
264
341
  if (prep.value.exitCode === STAGE_DIR_UNSEALED_EXIT) {
265
342
  recordFailOpen("server.remote-write.stage-seal-fallback", `${abs}: ${prep.value.stderr.trim()}`);
266
- return direct(createDirectContext(abs, abortSignal, "the private staging directory could not be made private"));
343
+ return viaDirect(direct, abs, abortSignal, "the private staging directory could not be made private", left);
267
344
  }
268
- return { ok: false, error: e };
345
+ return { ok: false, error: withResidue(e, left) };
269
346
  }
270
347
  if (abortSignal?.aborted) {
271
- const left = await discardStaged(lane, stage);
272
- return { ok: false, error: withResidue(new FileError("aborted", "aborted before the write started; the target was not touched", abs), stage, left) };
348
+ const left = await settleStaging(lane, stage, [], true);
349
+ return { ok: false, error: withResidue(new FileError("aborted", "aborted before the write started; the target was not touched", abs), left) };
350
+ }
351
+ const piece = await lane.prepare(abortSignal);
352
+ if (!piece.ok) {
353
+ const left = await settleStaging(lane, stage, [], true);
354
+ return { ok: false, error: withResidue(piece.error, left) };
355
+ }
356
+ let up;
357
+ try {
358
+ up = abortSignal?.aborted ? { ok: false, error: new FileError("aborted", "aborted before the write started; the target was not touched", abs) } : await piece.value.upload(stage.file, abortSignal);
359
+ }
360
+ finally {
361
+ await piece.value.release?.();
273
362
  }
274
- const up = await lane.upload(stage.file, abortSignal);
275
363
  if (!up.ok) {
276
- const left = await discardStaged(lane, stage);
277
- return { ok: false, error: withResidue(up.error, stage, left) };
364
+ const left = await settleStaging(lane, stage, [], true);
365
+ return { ok: false, error: withResidue(up.error, left) };
278
366
  }
279
367
  if (abortSignal?.aborted) {
280
- const left = await discardStaged(lane, stage);
281
- return { ok: false, error: withResidue(new FileError("aborted", "aborted before the commit; the target was not touched", abs), stage, left) };
368
+ const left = await settleStaging(lane, stage, [], true);
369
+ return { ok: false, error: withResidue(new FileError("aborted", "aborted before the commit; the target was not touched", abs), left) };
282
370
  }
283
371
  const c = await lane.run(commitOf(stage));
284
372
  if (!c.ok) {
285
- const left = await discardStaged(lane, stage);
373
+ const left = await settleStaging(lane, stage, [], true);
286
374
  const e = fileErrorFromExec(c.error, abs);
287
- return { ok: false, error: withResidue(new FileError("unknown", `${e.message} (the commit's round trip failed, so whether it ran is unknown — re-read the target before retrying)`, abs, e), stage, left) };
375
+ return { ok: false, error: withResidue(new FileError("unknown", `${e.message} (the commit's round trip failed, so whether it ran is unknown — re-read the target before retrying)`, abs, e), left) };
376
+ }
377
+ if (c.value.exitCode === STAGE_DIR_UNSEALED_EXIT) {
378
+ const left = await settleStaging(lane, stage, scriptRecordsOf(c.value.stdout).leftDirs, true);
379
+ if (abortSignal?.aborted)
380
+ return { ok: false, error: withResidue(new FileError("aborted", "aborted before the write started; the target was not touched", abs), left) };
381
+ recordFailOpen("server.remote-write.stage-seal-fallback", `${abs}: ${c.value.stderr.trim()}`);
382
+ return viaDirect(direct, abs, abortSignal, "the private staging directory could not be made private", left);
288
383
  }
289
- noteLeftDirs(c.value.stdout);
290
384
  if (c.value.exitCode !== 0) {
291
- const left = await discardStaged(lane, stage);
292
- return { ok: false, error: withResidue(classifyFsStderr(c.value.stderr, abs, "unknown"), stage, left) };
385
+ const left = await settleStaging(lane, stage, scriptRecordsOf(c.value.stdout).leftDirs, true);
386
+ return { ok: false, error: withResidue(classifyFsStderr(c.value.stderr, abs, "unknown"), left) };
387
+ }
388
+ const records = scriptRecordsOf(c.value.stdout);
389
+ await settleStaging(lane, stage, records.leftDirs, false);
390
+ if (records.modeNotCarried !== undefined) {
391
+ (lane.logger ?? fallbackLaneLogger()).warn("remote_env_file_mode_failed", {
392
+ provider: lane.provider,
393
+ path: seatText("operator-log-arg", abs),
394
+ ...(records.modeNotCarried !== "" ? { mode: seatText("operator-log-text", records.modeNotCarried) } : {}),
395
+ error: records.modeNotCarried !== "" ? "the target machine refused to set the target's mode on the replacement" : "the target's mode could not be read",
396
+ effect: "the new bytes are in place; the target's previous mode bits were not carried over, so it now has the mode the replacement was created with (setting the mode is best effort)",
397
+ });
293
398
  }
294
399
  return { ok: true, value: undefined };
295
400
  }
296
- function noteLeftDirs(stdout) {
297
- const head = `${STAGE_DIR_LEFT_MARK} `;
298
- for (const rec of stdout.split("\0")) {
299
- const at = rec.indexOf(head);
300
- if (at >= 0)
301
- recordFailOpen("server.remote-write.staging-dir-left", rec.slice(at + head.length));
401
+ let fallbackLogger;
402
+ function fallbackLaneLogger() {
403
+ return (fallbackLogger ??= createLogger());
404
+ }
405
+ async function viaDirect(direct, abs, abortSignal, why, left) {
406
+ const r = await writeInPlace(direct, abs, abortSignal, why);
407
+ return r.ok ? r : { ok: false, error: withResidue(r.error, left) };
408
+ }
409
+ async function writeInPlace(direct, abs, abortSignal, why) {
410
+ const abortedBefore = () => ({ ok: false, error: new FileError("aborted", `aborted before the in-place write started (${why}); the target was not touched`, abs) });
411
+ if (abortSignal?.aborted)
412
+ return abortedBefore();
413
+ const piece = await direct(abortSignal);
414
+ if (!piece.ok)
415
+ return piece;
416
+ try {
417
+ if (abortSignal?.aborted)
418
+ return abortedBefore();
419
+ const r = await piece.value.upload(abs, abortSignal);
420
+ if (r.ok || r.error.code !== "aborted")
421
+ return r;
422
+ return { ok: false, error: new FileError("unknown", `cancelled during an in-place write (${why}, so the bytes went straight to the target); the target may be partially written — re-read it before retrying`, abs, r.error) };
423
+ }
424
+ finally {
425
+ await piece.value.release?.();
302
426
  }
303
427
  }
304
- function createDirectContext(abs, abortSignal, why) {
305
- return {
306
- signal: abortSignal,
307
- inPlace: async (step) => {
308
- if (abortSignal?.aborted)
309
- return { ok: false, error: new FileError("aborted", `aborted before the in-place write started (${why}); the target was not touched`, abs) };
310
- const r = await step(abortSignal);
311
- if (r.ok || r.error.code !== "aborted")
312
- return r;
313
- return { ok: false, error: new FileError("unknown", `cancelled during an in-place write (${why}, so the bytes went straight to the target); the target may be partially written — re-read it before retrying`, abs, r.error) };
314
- },
428
+ export function rewriteAppend(read, prepareOf, add) {
429
+ return async (abortSignal) => {
430
+ const existing = await read(abortSignal);
431
+ if (!existing.ok && existing.error.code !== "not_found")
432
+ return existing;
433
+ const merged = Buffer.concat([existing.ok ? existing.value : new Uint8Array(0), typeof add === "string" ? Buffer.from(add, "utf8") : add]);
434
+ return prepareOf(merged)(abortSignal);
315
435
  };
316
436
  }
317
- export async function rewriteAppend(read, write, add, ctx) {
318
- const existing = await read(ctx.signal);
319
- if (!existing.ok && existing.error.code !== "not_found")
320
- return existing;
321
- const merged = Buffer.concat([existing.ok ? existing.value : new Uint8Array(0), typeof add === "string" ? Buffer.from(add, "utf8") : add]);
322
- return ctx.inPlace((signal) => write(merged, signal));
323
- }
324
437
  export function writeFileStaged(lane, abs, abortSignal) {
325
- return landStaged(lane, abs, abortSignal, (stage) => buildStagedCommitCommand(stage, abs), (ctx) => ctx.inPlace((signal) => lane.upload(abs, signal)));
438
+ return landStaged(lane, abs, abortSignal, (stage) => buildStagedCommitCommand(stage, abs), lane.prepare);
326
439
  }
327
440
  export function appendFileStaged(lane, abs, abortSignal, direct) {
328
441
  return landStaged(lane, abs, abortSignal, (stage) => buildStagedAppendCommand(stage, abs), direct);