@sema-agent/server 7.145.0 → 7.147.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 (526) hide show
  1. package/MIGRATION.md +876 -0
  2. package/README.md +1 -1
  3. package/README.zh-CN.md +1 -1
  4. package/USAGE.md +374 -99
  5. package/deploy/facts/CHANGES.json +25 -0
  6. package/deploy/facts/README.md +57 -0
  7. package/deploy/facts/lanes.json +61 -0
  8. package/deploy/facts/lanes.schema.json +57 -0
  9. package/deploy/facts/sandbox-rbac.json +113 -0
  10. package/deploy/facts/sandbox-rbac.schema.json +74 -0
  11. package/deploy/facts/sealed-key.json +9 -0
  12. package/deploy/facts/sealed-key.schema.json +52 -0
  13. package/deploy/sema-up/README.md +2 -2
  14. package/deploy/sema-up/chart/templates/_helpers.tpl +41 -0
  15. package/deploy/sema-up/chart/templates/sandbox-rbac.yaml +47 -7
  16. package/deploy/sema-up/chart/templates/server-v4pro.yaml +9 -4
  17. package/deploy/sema-up/chart/templates/server.yaml +9 -4
  18. package/deploy/sema-up/chart/values.yaml +8 -1
  19. package/deploy/sema-up/cluster-up.sh +2 -1
  20. package/deploy/sema-up/lib/flagshape.sh +4 -0
  21. package/deploy/sema-up/lib/lanes.json +2 -5
  22. package/deploy/sema-up/sema-up.sh +12 -9
  23. package/deploy/sema-up/stack/compose.yaml +5 -4
  24. package/deploy/sema-up/stack/sema-stack-cluster.yaml +34 -17
  25. package/dist/adoption/import-limits.d.ts +6 -0
  26. package/dist/adoption/import-limits.js +7 -0
  27. package/dist/adoption/import.d.ts +62 -0
  28. package/dist/adoption/import.js +107 -0
  29. package/dist/adoption/wire.d.ts +52 -0
  30. package/dist/adoption/wire.js +9 -0
  31. package/dist/approval-ask-machine.d.ts +2 -2
  32. package/dist/approval-card.d.ts +7 -16
  33. package/dist/approval-card.js +0 -4
  34. package/dist/approval-gate-currency.d.ts +1 -1
  35. package/dist/approval-gate-currency.js +1 -1
  36. package/dist/approval-reconciler.d.ts +1 -1
  37. package/dist/approval.d.ts +3 -3
  38. package/dist/audit.js +2 -2
  39. package/dist/bench/s1/live-deps.js +3 -1
  40. package/dist/boot/crash-last.js +2 -1
  41. package/dist/boot/deployment-mods.d.ts +11 -1
  42. package/dist/boot/deployment-mods.js +15 -2
  43. package/dist/boot/device-lane.js +7 -5
  44. package/dist/boot/engine-lease.d.ts +195 -22
  45. package/dist/boot/engine-lease.js +146 -20
  46. package/dist/boot/execution-env.d.ts +5 -0
  47. package/dist/boot/execution-env.js +57 -33
  48. package/dist/boot/execution-lane.d.ts +37 -9
  49. package/dist/boot/execution-lane.js +74 -20
  50. package/dist/boot/exit-boundary.d.ts +50 -0
  51. package/dist/boot/exit-boundary.js +32 -0
  52. package/dist/boot/exit-last.d.ts +20 -4
  53. package/dist/boot/exit-last.js +23 -5
  54. package/dist/boot/governance-seams.d.ts +2 -2
  55. package/dist/boot/governance-seams.js +1 -0
  56. package/dist/boot/leader.js +1 -1
  57. package/dist/boot/memory-boundary.d.ts +11 -11
  58. package/dist/boot/memory-boundary.js +3 -3
  59. package/dist/boot/memory-consolidation.d.ts +42 -41
  60. package/dist/boot/memory-consolidation.js +26 -28
  61. package/dist/boot/org-memory.js +3 -2
  62. package/dist/boot/parked-revive-gate.d.ts +1 -1
  63. package/dist/boot/parked-revive-gate.js +1 -1
  64. package/dist/boot/reapers.d.ts +12 -4
  65. package/dist/boot/reapers.js +40 -16
  66. package/dist/boot/resolve-spec.d.ts +2 -0
  67. package/dist/boot/resolve-spec.js +126 -123
  68. package/dist/boot/retention-lane.d.ts +4 -42
  69. package/dist/boot/runner-deps.js +1 -1
  70. package/dist/boot/session-faces.d.ts +1 -0
  71. package/dist/boot/session-faces.js +11 -3
  72. package/dist/boot/shutdown.js +27 -9
  73. package/dist/boot/stage-01-config.d.ts +1 -1
  74. package/dist/boot/stage-01-config.js +7 -3
  75. package/dist/boot/stage-02-web-admin-pull.d.ts +1 -1
  76. package/dist/boot/stage-02-web-admin-pull.js +10 -8
  77. package/dist/boot/stage-03-store-backend.d.ts +2 -1
  78. package/dist/boot/stage-03-store-backend.js +2 -2
  79. package/dist/boot/stage-04-stores.d.ts +2 -1
  80. package/dist/boot/stage-05-execution-env.d.ts +4 -1
  81. package/dist/boot/stage-05-execution-env.js +6 -6
  82. package/dist/boot/stage-06-runners.d.ts +5 -2
  83. package/dist/boot/stage-06-runners.js +12 -13
  84. package/dist/boot/stage-07-capability-layer.d.ts +5 -2
  85. package/dist/boot/stage-07-capability-layer.js +7 -7
  86. package/dist/boot/stage-08-reapers.d.ts +5 -2
  87. package/dist/boot/stage-08-reapers.js +3 -3
  88. package/dist/boot/stage-09-leader.d.ts +6 -2
  89. package/dist/boot/stage-10-http-server.d.ts +6 -2
  90. package/dist/boot/stage-10-http-server.js +5 -3
  91. package/dist/boot/stores.d.ts +10 -0
  92. package/dist/boot/stores.js +53 -26
  93. package/dist/boot/web-admin.js +3 -3
  94. package/dist/boot/workflow-orchestration.d.ts +1 -1
  95. package/dist/boot/workflow-orchestration.js +2 -1
  96. package/dist/capabilities/center-plugins.d.ts +2 -0
  97. package/dist/capabilities/center-plugins.js +6 -2
  98. package/dist/capabilities/composite-members.d.ts +4 -1
  99. package/dist/capabilities/composite-members.js +4 -1
  100. package/dist/capabilities/execution-lane.d.ts +7 -7
  101. package/dist/capabilities/execution-lane.js +2 -2
  102. package/dist/capabilities/hands-lane.d.ts +1 -1
  103. package/dist/capabilities/scenarios.d.ts +34 -20
  104. package/dist/capabilities/scenarios.js +13 -9
  105. package/dist/capabilities/settings-contract.d.ts +29 -0
  106. package/dist/capabilities/settings-contract.js +14 -0
  107. package/dist/capabilities/skills.d.ts +5 -5
  108. package/dist/capability-facts.d.ts +56 -1
  109. package/dist/capability-facts.js +59 -8
  110. package/dist/center-credential-renewer.js +3 -2
  111. package/dist/checkpoint-ctx-seal-m28.d.ts +1 -1
  112. package/dist/config-catalog.js +19 -9
  113. package/dist/config-invariants.d.ts +18 -3
  114. package/dist/config-invariants.js +36 -19
  115. package/dist/config-lkg.d.ts +1 -1
  116. package/dist/config-lkg.js +5 -6
  117. package/dist/config-provider.d.ts +2 -2
  118. package/dist/config-provider.js +2 -0
  119. package/dist/config-types.d.ts +228 -185
  120. package/dist/config.d.ts +74 -6
  121. package/dist/config.js +146 -64
  122. package/dist/degenerate-instrument.js +1 -1
  123. package/dist/deleted-session-ids.d.ts +19 -0
  124. package/dist/deleted-session-ids.js +26 -0
  125. package/dist/deploy-facts.d.ts +155 -0
  126. package/dist/deploy-facts.js +95 -0
  127. package/dist/deployment-shape.d.ts +21 -12
  128. package/dist/deployment-shape.js +24 -6
  129. package/dist/device-ws-hub.d.ts +48 -3
  130. package/dist/device-ws-hub.js +48 -2
  131. package/dist/env-facts.d.ts +7 -5
  132. package/dist/env-facts.js +10 -6
  133. package/dist/error-code-family.d.ts +35 -0
  134. package/dist/error-code-family.js +26 -0
  135. package/dist/execution-config-root.d.ts +5 -5
  136. package/dist/execution-config-root.js +5 -5
  137. package/dist/execution-env-purpose.d.ts +14 -0
  138. package/dist/execution-env-purpose.js +29 -0
  139. package/dist/execution-lane-caps.d.ts +49 -86
  140. package/dist/execution-lane-caps.js +52 -62
  141. package/dist/execution-placement.d.ts +18 -2
  142. package/dist/execution-placement.js +19 -0
  143. package/dist/file-history-disclosure.d.ts +2 -2
  144. package/dist/fleet/drain-entry.d.ts +46 -3
  145. package/dist/fleet/drain-entry.js +6 -0
  146. package/dist/fleet/fleet-bus.d.ts +2 -1
  147. package/dist/fleet/serving-lease.js +3 -4
  148. package/dist/history-anchor.d.ts +22 -0
  149. package/dist/history-anchor.js +14 -0
  150. package/dist/hooks/branch-transcript.d.ts +1 -1
  151. package/dist/hooks/branch-transcript.js +1 -0
  152. package/dist/hooks/classic-stations.d.ts +25 -8
  153. package/dist/hooks/classic-stations.js +29 -3
  154. package/dist/hooks/command-spawn.d.ts +1 -4
  155. package/dist/hooks/command-spawn.js +0 -11
  156. package/dist/hooks/hook-runner.d.ts +85 -24
  157. package/dist/hooks/hook-runner.js +326 -109
  158. package/dist/hooks/hook-source.d.ts +14 -2
  159. package/dist/hooks/hook-source.js +8 -0
  160. package/dist/http/active-run-conflict.d.ts +1 -1
  161. package/dist/http/active-run-conflict.js +1 -1
  162. package/dist/http/admission.js +11 -1
  163. package/dist/http/approval-sweeps.d.ts +2 -5
  164. package/dist/http/approval-sweeps.js +3 -2
  165. package/dist/http/checkpoint-ctx.d.ts +76 -71
  166. package/dist/http/checkpoint-ctx.js +40 -40
  167. package/dist/http/claim-latency.d.ts +10 -0
  168. package/dist/http/claim-latency.js +12 -0
  169. package/dist/http/dispatch.js +19 -3
  170. package/dist/http/durable-run-leg.d.ts +5 -0
  171. package/dist/http/durable-run-leg.js +3 -1
  172. package/dist/http/execution-context.d.ts +7 -1
  173. package/dist/http/execution-context.js +13 -0
  174. package/dist/http/health-self-report.d.ts +6 -2
  175. package/dist/http/health-self-report.js +3 -2
  176. package/dist/http/memory-compliance-failure-reply.d.ts +2 -2
  177. package/dist/http/memory-compliance-failure-reply.js +5 -15
  178. package/dist/http/memory-control-plane-corrupt-reply.d.ts +25 -0
  179. package/dist/http/memory-control-plane-corrupt-reply.js +19 -0
  180. package/dist/http/memory-store-refusal-reply.d.ts +3 -3
  181. package/dist/http/memory-store-refusal-reply.js +3 -0
  182. package/dist/http/owner-access.d.ts +11 -0
  183. package/dist/http/owner-access.js +7 -4
  184. package/dist/http/principal-gate.d.ts +28 -16
  185. package/dist/http/principal-gate.js +10 -19
  186. package/dist/http/request-guards.d.ts +2 -2
  187. package/dist/http/request-guards.js +5 -5
  188. package/dist/http/resume-legs.d.ts +29 -10
  189. package/dist/http/resume-legs.js +94 -56
  190. package/dist/http/rewind-files-reply.d.ts +34 -0
  191. package/dist/http/rewind-files-reply.js +36 -0
  192. package/dist/http/route-ctx.d.ts +43 -26
  193. package/dist/http/route-table.js +4 -0
  194. package/dist/http/routes/adoption.d.ts +11 -0
  195. package/dist/http/routes/adoption.js +80 -6
  196. package/dist/http/routes/agents-roster.js +1 -0
  197. package/dist/http/routes/approvals-assistant.js +7 -26
  198. package/dist/http/routes/background.js +1 -0
  199. package/dist/http/routes/capabilities.js +12 -3
  200. package/dist/http/routes/devices.js +1 -1
  201. package/dist/http/routes/diagnostics.d.ts +9 -14
  202. package/dist/http/routes/diagnostics.js +10 -20
  203. package/dist/http/routes/engine.d.ts +31 -0
  204. package/dist/http/routes/engine.js +81 -0
  205. package/dist/http/routes/memory-bundle.js +3 -0
  206. package/dist/http/routes/memory-consolidation.js +3 -5
  207. package/dist/http/routes/memory-origin.d.ts +2 -2
  208. package/dist/http/routes/memory-origin.js +2 -4
  209. package/dist/http/routes/memory-policy.js +5 -1
  210. package/dist/http/routes/notify-wake.js +2 -1
  211. package/dist/http/routes/observability.js +3 -6
  212. package/dist/http/routes/projects.d.ts +70 -0
  213. package/dist/http/routes/projects.js +86 -0
  214. package/dist/http/routes/rules.js +30 -2
  215. package/dist/http/routes/runs.js +15 -11
  216. package/dist/http/routes/session-sync.js +39 -35
  217. package/dist/http/routes/sessions-list.d.ts +1 -1
  218. package/dist/http/routes/sessions.d.ts +7 -1
  219. package/dist/http/routes/sessions.js +108 -2
  220. package/dist/http/routes/tasks.js +32 -8
  221. package/dist/http/routes/trace-usage.js +1 -1
  222. package/dist/http/run-concurrency-cap.d.ts +86 -0
  223. package/dist/http/run-concurrency-cap.js +54 -0
  224. package/dist/http/server.d.ts +31 -14
  225. package/dist/http/server.js +29 -3
  226. package/dist/http/stored-body-replay.d.ts +12 -7
  227. package/dist/http/stored-body-replay.js +28 -5
  228. package/dist/http/wire-types.d.ts +27 -13
  229. package/dist/index.d.ts +2 -2
  230. package/dist/index.js +1 -1
  231. package/dist/instruction-source-notice.d.ts +1 -1
  232. package/dist/json-body-limit.d.ts +8 -0
  233. package/dist/json-body-limit.js +2 -0
  234. package/dist/leader/diffout.d.ts +1 -1
  235. package/dist/local-data-root.d.ts +2 -2
  236. package/dist/memory-embedder-reembed.d.ts +38 -0
  237. package/dist/memory-embedder-reembed.js +20 -0
  238. package/dist/memory-incident-sink.d.ts +0 -28
  239. package/dist/memory-incident-sink.js +5 -0
  240. package/dist/memory-operator-faces.d.ts +9 -4
  241. package/dist/memory-scope-stores.d.ts +9 -7
  242. package/dist/memory-scope-stores.js +3 -14
  243. package/dist/memory-scope.d.ts +38 -2
  244. package/dist/memory-scope.js +33 -2
  245. package/dist/memory-store-refusal.d.ts +17 -4
  246. package/dist/memory-store-refusal.js +1 -1
  247. package/dist/memory-sync-client.d.ts +2 -0
  248. package/dist/memory-sync-client.js +13 -11
  249. package/dist/memory-sync.js +1 -1
  250. package/dist/model-compat.d.ts +35 -21
  251. package/dist/model-compat.js +49 -21
  252. package/dist/model-entry-refusal.d.ts +11 -1
  253. package/dist/model-entry-refusal.js +7 -0
  254. package/dist/namespaced-rule-name.d.ts +18 -1
  255. package/dist/namespaced-rule-name.js +12 -0
  256. package/dist/net-address.d.ts +53 -0
  257. package/dist/net-address.js +111 -0
  258. package/dist/observability/fail-open.d.ts +29 -17
  259. package/dist/observability/fail-open.js +29 -17
  260. package/dist/observability/metrics.d.ts +2 -0
  261. package/dist/observability/metrics.js +2 -0
  262. package/dist/observability/secret-env-scrub.d.ts +30 -4
  263. package/dist/observability/secret-env-scrub.js +15 -3
  264. package/dist/orchestration/workflow-agent-session-index.d.ts +7 -12
  265. package/dist/orchestration/workflow-agent-session-index.js +1 -6
  266. package/dist/orchestration/workflow-completion-inbox.d.ts +26 -6
  267. package/dist/orchestration/workflow-completion-inbox.js +63 -45
  268. package/dist/orchestration/workflow-notify-journal.js +2 -3
  269. package/dist/org-delivery-gate.js +1 -1
  270. package/dist/org-memory-admission.d.ts +5 -2
  271. package/dist/org-memory-admission.js +25 -10
  272. package/dist/parked-decide.d.ts +33 -26
  273. package/dist/parked-decide.js +36 -44
  274. package/dist/peer-directory.d.ts +6 -12
  275. package/dist/peer-directory.js +5 -1
  276. package/dist/plugins/approval-ask-store-file.d.ts +10 -2
  277. package/dist/plugins/approval-ask-store-file.js +37 -4
  278. package/dist/plugins/approval-ask-store-memory.d.ts +5 -3
  279. package/dist/plugins/approval-ask-store-memory.js +11 -2
  280. package/dist/plugins/approval-ask-store-sql.d.ts +3 -0
  281. package/dist/plugins/approval-ask-store-sql.js +3 -1
  282. package/dist/plugins/blob-backend.d.ts +38 -195
  283. package/dist/plugins/blob-backend.js +33 -229
  284. package/dist/plugins/caching-session-store.d.ts +12 -5
  285. package/dist/plugins/caching-session-store.js +3 -0
  286. package/dist/plugins/checkpoint-index-columns.d.ts +1 -1
  287. package/dist/plugins/checkpoint-index-columns.js +3 -2
  288. package/dist/plugins/checkpoint-store-face.d.ts +426 -0
  289. package/dist/plugins/checkpoint-store-face.js +152 -0
  290. package/dist/plugins/device-store-sql.d.ts +2 -2
  291. package/dist/plugins/device-store-sql.js +5 -10
  292. package/dist/plugins/execution-lane-rename-m40.d.ts +20 -0
  293. package/dist/plugins/execution-lane-rename-m40.js +10 -0
  294. package/dist/plugins/execution-placement-sql.d.ts +63 -88
  295. package/dist/plugins/execution-placement-sql.js +94 -54
  296. package/dist/plugins/file-run-store.d.ts +26 -18
  297. package/dist/plugins/file-run-store.js +64 -75
  298. package/dist/plugins/fork-routing-session-store.d.ts +6 -2
  299. package/dist/plugins/fork-routing-session-store.js +2 -2
  300. package/dist/plugins/imported-layer-root-retirement.d.ts +22 -11
  301. package/dist/plugins/imported-layer-root-retirement.js +4 -8
  302. package/dist/plugins/inbox-payload-column.d.ts +14 -0
  303. package/dist/plugins/inbox-payload-column.js +13 -0
  304. package/dist/plugins/local-checkpoint-store.d.ts +7 -2
  305. package/dist/plugins/local-checkpoint-store.js +13 -8
  306. package/dist/plugins/local-data-dir-modes-m39.d.ts +48 -0
  307. package/dist/plugins/local-data-dir-modes-m39.js +182 -0
  308. package/dist/plugins/local-engine-high-water.d.ts +11 -0
  309. package/dist/plugins/local-engine-high-water.js +59 -0
  310. package/dist/plugins/local-session-store.d.ts +119 -30
  311. package/dist/plugins/local-session-store.js +156 -53
  312. package/dist/plugins/local-task-attachment-store.d.ts +2 -0
  313. package/dist/plugins/local-task-attachment-store.js +10 -11
  314. package/dist/plugins/memory-embedder-fingerprint.d.ts +33 -10
  315. package/dist/plugins/memory-embedder-fingerprint.js +52 -12
  316. package/dist/plugins/memory-embedder.d.ts +1 -1
  317. package/dist/plugins/memory-embedder.js +2 -2
  318. package/dist/plugins/memory-engine-pg.d.ts +30 -6
  319. package/dist/plugins/memory-engine-pg.js +96 -214
  320. package/dist/plugins/memory-engine-sql-apply.d.ts +130 -0
  321. package/dist/plugins/memory-engine-sql-apply.js +358 -0
  322. package/dist/plugins/memory-engine-tidb.d.ts +38 -9
  323. package/dist/plugins/memory-engine-tidb.js +99 -230
  324. package/dist/plugins/memory-key-guards.d.ts +1 -1
  325. package/dist/plugins/memory-origin-law.d.ts +3 -3
  326. package/dist/plugins/one-time-migrations.d.ts +169 -83
  327. package/dist/plugins/one-time-migrations.js +295 -235
  328. package/dist/plugins/owner-only-file-mode.d.ts +29 -0
  329. package/dist/plugins/owner-only-file-mode.js +141 -0
  330. package/dist/plugins/permission-rule-store-file.d.ts +17 -3
  331. package/dist/plugins/permission-rule-store-file.js +20 -1
  332. package/dist/plugins/pg-pool.d.ts +2 -1
  333. package/dist/plugins/pg-pool.js +12 -5
  334. package/dist/plugins/release-version.d.ts +20 -0
  335. package/dist/plugins/release-version.js +28 -0
  336. package/dist/plugins/remote-env-adb.d.ts +20 -4
  337. package/dist/plugins/remote-env-adb.js +39 -11
  338. package/dist/plugins/remote-env-e2b.d.ts +12 -3
  339. package/dist/plugins/remote-env-e2b.js +6 -4
  340. package/dist/plugins/remote-env-host.d.ts +9 -1
  341. package/dist/plugins/remote-env-host.js +6 -5
  342. package/dist/plugins/remote-env-k8s.d.ts +5 -2
  343. package/dist/plugins/remote-env-k8s.js +15 -4
  344. package/dist/plugins/remote-env-local-docker.d.ts +4 -1
  345. package/dist/plugins/remote-env-local-docker.js +3 -3
  346. package/dist/plugins/remote-env-ssh.d.ts +8 -2
  347. package/dist/plugins/remote-env-ssh.js +26 -24
  348. package/dist/plugins/remote-shell.d.ts +59 -30
  349. package/dist/plugins/remote-shell.js +175 -62
  350. package/dist/plugins/retention-declaration.d.ts +37 -0
  351. package/dist/plugins/retention-declaration.js +9 -0
  352. package/dist/plugins/retention-deployment.d.ts +126 -0
  353. package/dist/plugins/retention-deployment.js +88 -0
  354. package/dist/plugins/retention-lane-store-sql.d.ts +74 -4
  355. package/dist/plugins/retention-lane-store-sql.js +103 -1
  356. package/dist/plugins/retention-sql.d.ts +29 -0
  357. package/dist/plugins/retention-sql.js +8 -0
  358. package/dist/plugins/run-store-sql.js +2 -2
  359. package/dist/plugins/schema-consistency.d.ts +0 -6
  360. package/dist/plugins/schema-consistency.js +1 -2
  361. package/dist/plugins/schema-ensure-legs.d.ts +1 -1
  362. package/dist/plugins/schema-ensure-legs.js +13 -3
  363. package/dist/plugins/session-ext-table.d.ts +74 -0
  364. package/dist/plugins/session-ext-table.js +121 -0
  365. package/dist/plugins/session-fork.d.ts +31 -9
  366. package/dist/plugins/session-fork.js +3 -2
  367. package/dist/plugins/session-placement.d.ts +4 -2
  368. package/dist/plugins/session-row-sql.d.ts +8 -7
  369. package/dist/plugins/session-row-sql.js +15 -7
  370. package/dist/plugins/session-store-sql.d.ts +131 -0
  371. package/dist/plugins/session-store-sql.js +298 -0
  372. package/dist/plugins/session-workspace-cell.d.ts +2 -2
  373. package/dist/plugins/session-workspace-cell.js +2 -2
  374. package/dist/plugins/shared-memory-store-sql.d.ts +10 -0
  375. package/dist/plugins/shared-memory-store-sql.js +13 -13
  376. package/dist/plugins/snapshot-bucket-presence.js +1 -1
  377. package/dist/plugins/sql-driver.d.ts +23 -7
  378. package/dist/plugins/sql-driver.js +41 -8
  379. package/dist/plugins/sql-errors.d.ts +5 -2
  380. package/dist/plugins/sql-errors.js +4 -0
  381. package/dist/plugins/sql-json-column.d.ts +5 -1
  382. package/dist/plugins/store-backend.d.ts +46 -16
  383. package/dist/plugins/store-backend.js +192 -69
  384. package/dist/plugins/store-contracts.d.ts +10 -13
  385. package/dist/plugins/store-contracts.js +1 -9
  386. package/dist/plugins/store-sweep.d.ts +63 -0
  387. package/dist/plugins/store-sweep.js +48 -0
  388. package/dist/plugins/task-attachment-store.d.ts +6 -8
  389. package/dist/plugins/task-attachment-store.js +15 -10
  390. package/dist/plugins/task-list-store-sql.d.ts +1 -1
  391. package/dist/plugins/text-column-capacity.d.ts +21 -0
  392. package/dist/plugins/text-column-capacity.js +5 -0
  393. package/dist/plugins/tidb-pool.d.ts +3 -2
  394. package/dist/plugins/tidb-pool.js +20 -32
  395. package/dist/plugins/user-input-ledger-sql.d.ts +1 -1
  396. package/dist/prompt-screen.d.ts +6 -9
  397. package/dist/prompt-screen.js +2 -5
  398. package/dist/read-face-posture.d.ts +6 -6
  399. package/dist/read-face-posture.js +2 -2
  400. package/dist/request-value-closure.d.ts +5 -5
  401. package/dist/request-value-closure.js +1 -1
  402. package/dist/rules-consent.d.ts +48 -27
  403. package/dist/rules-consent.js +147 -23
  404. package/dist/run-cancel-context.d.ts +4 -1
  405. package/dist/run-cancel-context.js +2 -1
  406. package/dist/run-local.js +17 -13
  407. package/dist/runs.d.ts +48 -30
  408. package/dist/runs.js +27 -17
  409. package/dist/runtime-caps-resolver.d.ts +15 -8
  410. package/dist/runtime-caps-resolver.js +14 -10
  411. package/dist/sandbox-egress-policy.js +6 -11
  412. package/dist/sandbox-rbac-rules.d.ts +88 -0
  413. package/dist/sandbox-rbac-rules.js +80 -0
  414. package/dist/sealed-key-layout.d.ts +16 -0
  415. package/dist/sealed-key-layout.js +3 -0
  416. package/dist/sealed-key.js +8 -6
  417. package/dist/security.d.ts +43 -9
  418. package/dist/security.js +9 -2
  419. package/dist/sema-config-dir.js +2 -2
  420. package/dist/server-secret-env.d.ts +2 -0
  421. package/dist/service-version.d.ts +2 -1
  422. package/dist/service-version.js +2 -2
  423. package/dist/session-error-wire.d.ts +1 -1
  424. package/dist/session-incarnation.d.ts +8 -5
  425. package/dist/session-notify-door.d.ts +5 -3
  426. package/dist/session-resident-background.d.ts +110 -0
  427. package/dist/session-resident-background.js +88 -0
  428. package/dist/session-row.d.ts +1 -1
  429. package/dist/session-sync-kernel.d.ts +53 -14
  430. package/dist/session-sync-kernel.js +70 -1
  431. package/dist/session-sync.d.ts +5 -3
  432. package/dist/session-workspace.d.ts +12 -2
  433. package/dist/session-workspace.js +6 -0
  434. package/dist/sighup-idle.d.ts +9 -7
  435. package/dist/sighup-idle.js +4 -5
  436. package/dist/spec-fields.d.ts +16 -0
  437. package/dist/spec-fields.js +7 -0
  438. package/dist/store-posture.d.ts +2 -1
  439. package/dist/stored-request-env-credentials-m38.d.ts +3 -0
  440. package/dist/stored-request-env-credentials-m38.js +8 -0
  441. package/dist/stored-request-hooks-m20.d.ts +3 -2
  442. package/dist/stored-request-hooks-m20.js +19 -14
  443. package/dist/stored-request-prompt-profile-m30.d.ts +1 -1
  444. package/dist/stores-sql/blob-index-sql.d.ts +148 -0
  445. package/dist/stores-sql/blob-index-sql.js +154 -0
  446. package/dist/{plugins → stores-sql}/checkpoint-store-sql.d.ts +14 -428
  447. package/dist/{plugins → stores-sql}/checkpoint-store-sql.js +43 -220
  448. package/dist/{plugins → stores-sql}/file-history-store-sql.d.ts +23 -11
  449. package/dist/{plugins → stores-sql}/file-history-store-sql.js +23 -18
  450. package/dist/{plugins → stores-sql}/mailbox-store-sql.d.ts +2 -2
  451. package/dist/{plugins → stores-sql}/mailbox-store-sql.js +4 -4
  452. package/dist/{plugins → stores-sql}/pg-session-storage.d.ts +27 -67
  453. package/dist/{plugins → stores-sql}/pg-session-storage.js +82 -207
  454. package/dist/{plugins → stores-sql}/retention-store-sql.d.ts +123 -217
  455. package/dist/{plugins → stores-sql}/retention-store-sql.js +66 -190
  456. package/dist/{plugins → stores-sql}/roster-store-sql.d.ts +2 -2
  457. package/dist/{plugins → stores-sql}/roster-store-sql.js +1 -1
  458. package/dist/{plugins → stores-sql}/session-event-payload.d.ts +1 -1
  459. package/dist/{plugins → stores-sql}/session-event-payload.js +1 -1
  460. package/dist/stores-sql/session-policy-store-sql.d.ts +1 -1
  461. package/dist/stores-sql/session-write-hooks.d.ts +59 -0
  462. package/dist/stores-sql/session-write-hooks.js +2 -0
  463. package/dist/{plugins → stores-sql}/tidb-session-storage.d.ts +10 -11
  464. package/dist/{plugins → stores-sql}/tidb-session-storage.js +10 -21
  465. package/dist/{plugins → stores-sql}/tidb-session-store.d.ts +35 -112
  466. package/dist/{plugins → stores-sql}/tidb-session-store.js +73 -169
  467. package/dist/{plugins → stores-sql}/tool-result-store-sql.d.ts +3 -3
  468. package/dist/{plugins → stores-sql}/tool-result-store-sql.js +6 -6
  469. package/dist/stores-sql/windowed-session-storage.d.ts +56 -0
  470. package/dist/stores-sql/windowed-session-storage.js +61 -0
  471. package/dist/{plugins → stores-sql}/workflow-journal-store-sql.d.ts +7 -12
  472. package/dist/{plugins → stores-sql}/workflow-journal-store-sql.js +3 -8
  473. package/dist/task-a2a.d.ts +7 -1
  474. package/dist/task-a2a.js +15 -14
  475. package/dist/task-cwd.d.ts +11 -3
  476. package/dist/task-cwd.js +17 -1
  477. package/dist/task-mcp.d.ts +10 -2
  478. package/dist/task-mcp.js +13 -16
  479. package/dist/task-settings.d.ts +68 -8
  480. package/dist/task-settings.js +63 -6
  481. package/dist/tool-approval.d.ts +23 -10
  482. package/dist/tool-approval.js +10 -6
  483. package/dist/trace/core-keyset-guard.d.ts +17 -10
  484. package/dist/trace/engine-notice-wire.d.ts +1 -1
  485. package/dist/trace/engine-notice-wire.js +4 -0
  486. package/dist/trace/exit-seat.d.ts +29 -1
  487. package/dist/trace/exit-seat.js +4 -0
  488. package/dist/trace/project.d.ts +33 -16
  489. package/dist/trace/project.js +21 -9
  490. package/dist/trace/redact.d.ts +13 -2
  491. package/dist/trace/redact.js +347 -78
  492. package/dist/trace/self-minted-wire.d.ts +587 -16
  493. package/dist/trace/self-minted-wire.js +215 -9
  494. package/dist/trace/sema-provenance.d.ts +45 -41
  495. package/dist/trace/sema-provenance.js +81 -10
  496. package/dist/trace/task-notification-facets.d.ts +70 -2
  497. package/dist/trace/task-notification-facets.js +71 -1
  498. package/dist/trace/wire-projection-faces.d.ts +39 -3
  499. package/dist/trace/wire-projection-faces.js +27 -2
  500. package/dist/unread-request-members.d.ts +66 -0
  501. package/dist/unread-request-members.js +41 -0
  502. package/dist/usage-analytics.d.ts +4 -0
  503. package/dist/user-input-ledger.d.ts +2 -2
  504. package/dist/web-admin-client/apply-effective.js +22 -26
  505. package/dist/web-admin-client/candidate-gate.d.ts +35 -3
  506. package/dist/web-admin-client/candidate-gate.js +53 -5
  507. package/dist/web-admin-client/center-request.d.ts +4 -1
  508. package/dist/web-admin-client/center-request.js +2 -1
  509. package/dist/web-admin-client/effective-keys.js +0 -1
  510. package/dist/web-admin-client/facade.d.ts +1 -1
  511. package/dist/web-admin-client/http-client.d.ts +1 -0
  512. package/dist/web-admin-client/http-client.js +17 -9
  513. package/dist/web-admin-client/restart-signal.js +5 -2
  514. package/dist/web-admin-client/skills-mcp.d.ts +20 -6
  515. package/dist/web-admin-client/skills-mcp.js +26 -21
  516. package/dist/web-admin-client/types.d.ts +34 -49
  517. package/docs/DEVICE-EXECUTOR-PROTOCOL.md +2 -2
  518. package/package.json +22 -13
  519. package/scripts/drain-check-local.mjs +8 -55
  520. package/scripts/drain-check.mysql.sql +3 -40
  521. package/scripts/drain-check.pg.sql +3 -40
  522. package/skills/update-config.md +1 -1
  523. package/wire-changes/server@7.146.0.json +3221 -0
  524. package/wire-changes/server@7.147.0.json +813 -0
  525. package/dist/approval-batch-census.d.ts +0 -27
  526. package/dist/approval-batch-census.js +0 -27
@@ -17,6 +17,7 @@ import { LaneHomeSeat, laneHomeRefusal } from "../lane-home-probe.js";
17
17
  import { composeHostSubprocessEnv, hostSubprocessEnv, withheldFromHostSubprocess } from "../server-secret-env.js";
18
18
  import { nameTooLongCode } from "./remote-env-file-error.js";
19
19
  import { trackEphemeralHostWorkspace, untrackEphemeralHostWorkspace } from "./host-workspace-registry.js";
20
+ import { OWNER_ONLY_FILE_MODE } from "./owner-only-file-mode.js";
20
21
  const PROVIDER = "host";
21
22
  const DEFAULT_COMMAND_TIMEOUT_MS = 30 * 60_000;
22
23
  const inflightFsDrainWaitMs = () => numEnvOr("HOST_FS_DRAIN_WAIT_MS", 10_000, 1);
@@ -250,8 +251,8 @@ export class RemoteHostExecutionEnv {
250
251
  await fs.mkdir(dir, { recursive: true });
251
252
  const outPath = path.join(dir, "out");
252
253
  const errPath = path.join(dir, "err");
253
- const outFh = await fs.open(outPath, "w");
254
- const errFh = await fs.open(errPath, "w");
254
+ const outFh = await fs.open(outPath, "w", OWNER_ONLY_FILE_MODE);
255
+ const errFh = await fs.open(errPath, "w", OWNER_ONLY_FILE_MODE);
255
256
  let child;
256
257
  try {
257
258
  const sh = hostShell();
@@ -530,10 +531,10 @@ export class RemoteHostExecutionEnv {
530
531
  mkdirSync(dir, { recursive: true });
531
532
  const outPath = path.join(dir, "out");
532
533
  const errPath = path.join(dir, "err");
533
- const fdOut = openSync(outPath, "ax", 0o600);
534
+ const fdOut = openSync(outPath, "ax", OWNER_ONLY_FILE_MODE);
534
535
  let fdErr;
535
536
  try {
536
- fdErr = openSync(errPath, "ax", 0o600);
537
+ fdErr = openSync(errPath, "ax", OWNER_ONLY_FILE_MODE);
537
538
  }
538
539
  catch (e) {
539
540
  try {
@@ -1314,7 +1315,7 @@ export class RemoteHostExecutionEnv {
1314
1315
  }
1315
1316
  childEnv(perCommand, spawnShell) {
1316
1317
  const base = spawnShell !== undefined
1317
- ? hostSubprocessEnv({ site: "server.remote-env-host.spawn-env", policy: this.cfg.inheritEnv, allow: [] })
1318
+ ? hostSubprocessEnv({ site: this.cfg.gitBase === true ? "server.remote-env-host.git-base" : "server.remote-env-host.spawn-env", policy: this.cfg.inheritEnv, allow: [] })
1318
1319
  : composeHostSubprocessEnv({ policy: this.cfg.inheritEnv, allow: [] });
1319
1320
  if (this.cfg.env)
1320
1321
  Object.assign(base, this.cfg.env);
@@ -857,10 +857,13 @@ export declare class RemoteK8sExecutionEnv implements RemoteExecutionEnv, Backgr
857
857
  abortSignal?: AbortSignal;
858
858
  }): Promise<Result<string[], FileError>>;
859
859
  writeFile(p: string, content: string | Uint8Array, abortSignal?: AbortSignal): Promise<Result<void, FileError>>;
860
- /** 暂存写的两只面(规则与提交脚本的唯一属主 = `remote-shell.ts`;父目录与私有暂存目录由编排的准备那一步建):上传 = 分块整份写进私有目录里的暂存件;
861
- * 提交 = 文件面探针 exec。两者同一身份(同一只容器里的 exec)。 */
860
+ /** 暂存写的两只面(规则与提交脚本的唯一属主 = `remote-shell.ts`;父目录与私有暂存目录由编排的准备那一步建):上传 = 分块整份写进私有目录里的暂存件
861
+ * (阶段一 = 建连,见 {@link prepareChunked};阶段二 = 分块写);提交 = 文件面探针 exec。两者同一身份(同一只容器里的 exec)。 */
862
862
  private stagedLane;
863
863
  appendFile(p: string, content: string | Uint8Array, abortSignal?: AbortSignal): Promise<Result<void, FileError>>;
864
+ /** 阶段一(备件):建连(懒连接;首块之前 —— 取消落在这里 ⇒ `aborted`、没有一块发出);阶段二:分块写({@link writeChunked}),每一块仍走 {@link execData}
865
+ * (它的 {@link ensureConnected} 在建好连之后只剩生命周期的准入判:`destroy` 开始之后,后面的块不再写)。 */
866
+ private prepareChunked;
864
867
  /**
865
868
  * Write `content` to `abs` via argv-embedded base64, chunked at WRITE_CHUNK_BYTES (no stdin on the exec
866
869
  * channel we use; v4 has no per-channel close). `truncateFirst` → the FIRST chunk uses `>` (overwrite),
@@ -445,7 +445,7 @@ export class RemoteK8sExecutionEnv {
445
445
  return r.ok ? { ok: true, exitCode: r.value.exitCode, stdout: r.value.stdout, stderr: r.value.stderr } : { ok: false, error: r.error.message };
446
446
  },
447
447
  write: async (abs, bytes) => {
448
- const w = await this.writeChunked(abs, bytes, true, undefined, exec);
448
+ const w = await this.writeChunked(abs, bytes, true, exec);
449
449
  return w.ok ? { ok: true } : { ok: false, error: w.error.message };
450
450
  },
451
451
  };
@@ -2175,13 +2175,24 @@ export class RemoteK8sExecutionEnv {
2175
2175
  return writeFileStaged(this.stagedLane(content), this.resolve(p), abortSignal);
2176
2176
  }
2177
2177
  stagedLane(content) {
2178
- return { upload: (dest, signal) => this.writeChunked(dest, content, true, signal), run: (cmd, signal) => this.fsExec(cmd, signal) };
2178
+ return { prepare: this.prepareChunked(content, true), run: (cmd, signal) => this.fsExec(cmd, signal), provider: PROVIDER, logger: this.logger };
2179
2179
  }
2180
2180
  async appendFile(p, content, abortSignal) {
2181
2181
  const abs = this.resolve(p);
2182
- return appendFileStaged(this.stagedLane(content), abs, abortSignal, (ctx) => ctx.inPlace((signal) => this.writeChunked(abs, content, false, signal)));
2182
+ return appendFileStaged(this.stagedLane(content), abs, abortSignal, this.prepareChunked(content, false));
2183
2183
  }
2184
- async writeChunked(abs, content, truncateFirst, abortSignal, exec = (command) => this.execData(command, abortSignal)) {
2184
+ prepareChunked(content, truncateFirst) {
2185
+ return async () => {
2186
+ const c = await this.ensureConnected();
2187
+ if (!c.ok)
2188
+ return { ok: false, error: fileErrorFromExec(c.error) };
2189
+ return {
2190
+ ok: true,
2191
+ value: { upload: (dest, signal) => this.writeChunked(dest, content, truncateFirst, (command) => this.execData(command, signal)) },
2192
+ };
2193
+ };
2194
+ }
2195
+ async writeChunked(abs, content, truncateFirst, exec) {
2185
2196
  const bytes = typeof content === "string" ? Buffer.from(content, "utf8") : Buffer.from(content);
2186
2197
  for (let off = 0, first = true; off < bytes.length || first; off += WRITE_CHUNK_BYTES, first = false) {
2187
2198
  const b64 = bytes.subarray(off, off + WRITE_CHUNK_BYTES).toString("base64");
@@ -1,5 +1,6 @@
1
1
  import { spawn } from "node:child_process";
2
2
  import { type LaneHomeConfig } from "../lane-home-probe.js";
3
+ import { type LaneLogger } from "./remote-shell.js";
3
4
  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, type ExecutionEnvCapabilities } from "@sema-agent/core";
4
5
  import { type SandboxReadFloorKnob } from "../execution-lane-caps.js";
5
6
  import { type SandboxReadFloor } from "./sandbox-read-floor.js";
@@ -62,6 +63,8 @@ export interface LocalDockerEnvConfig extends LaneHomeConfig {
62
63
  sandboxReadFloor?: SandboxReadFloorKnob;
63
64
  /** 恢复点的填充座(`workspace-fill.ts`;工厂按 run 装配):容器新建之后、交给本环境之前,经本适配器自己的 `docker exec` 往工作区里放内容。缺席 ⇒ 不放。 */
64
65
  workspaceFill?: WorkspaceFill;
66
+ /** 运维日志座(起服装配递本服务的 logger):暂存写「已有目标的权限位没带过去」那一行经它(缺席 ⇒ 暂存编排自建一只,见 `remote-shell.ts` `StagedWriteLane.logger`)。 */
67
+ logger?: LaneLogger;
65
68
  }
66
69
  /** Inject `spawn` for tests (a fake docker CLI). Defaults to node's child_process spawn. */
67
70
  export interface LocalDockerEnvDeps {
@@ -176,7 +179,7 @@ export declare class RemoteLocalDockerExecutionEnv implements RemoteExecutionEnv
176
179
  abortSignal?: AbortSignal;
177
180
  }): Promise<Result<string[], FileError>>;
178
181
  /** 暂存写的两只面(规则与提交脚本的唯一属主 = `remote-shell.ts` `writeFileStaged` / `appendFileStaged`;父目录与私有暂存目录由编排的准备那一步建):
179
- * 上传 = 容器内 `cat` 从 stdin 收整份字节落到私有目录里的暂存件({@link pipeIn});提交 = 容器内一次 shell 往返。两者同一身份 ——
182
+ * 上传 = 容器内 `cat` 从 stdin 收整份字节落到私有目录里的暂存件({@link pipeIn};阶段一无事可做 —— 传输调用本身就是起进程);提交 = 容器内一次 shell 往返。两者同一身份 ——
180
183
  * 同一只 argv 构造({@link startArgv}),都是镜像的用户。不用 `docker cp`:它由守护进程以 root 落盘,镜像用户 ≠ root 时暂存件属 root、
181
184
  * 提交方拿不走也清不掉,「目录不收新名字」也探不出来(root 哪里都写得进)。 */
182
185
  private stagedLane;
@@ -3,7 +3,7 @@ import { spawn } from "node:child_process";
3
3
  import { hostSubprocessEnv } from "../server-secret-env.js";
4
4
  import { LANE_HOME_PROBE_COMMAND, LaneHomeSeat } from "../lane-home-probe.js";
5
5
  import { randomBytes } from "node:crypto";
6
- import { shellQuote, armPipeDestroyGrace, appendFileStaged, writeFileStaged } from "./remote-shell.js";
6
+ import { shellQuote, armPipeDestroyGrace, appendFileStaged, readyUpload, writeFileStaged } from "./remote-shell.js";
7
7
  import { signalNumber } from "./host-platform.js";
8
8
  import { buildLivenessCut, commandBoundsOf } from "../exec-bounds.js";
9
9
  import { buildCapturedOutput, createCutError } from "../exec-cut.js";
@@ -420,7 +420,7 @@ export class RemoteLocalDockerExecutionEnv {
420
420
  return ok(lines);
421
421
  }
422
422
  stagedLane(content) {
423
- return { upload: (dest, signal) => this.pipeIn(content, dest, signal), run: (cmd, signal) => this.fsExec(cmd, signal) };
423
+ return { prepare: readyUpload((dest, signal) => this.pipeIn(content, dest, signal)), run: (cmd, signal) => this.fsExec(cmd, signal), provider: PROVIDER, logger: this.cfg.logger };
424
424
  }
425
425
  async writeFile(p, content, abortSignal) {
426
426
  const ready = await this.fsReady(p);
@@ -433,7 +433,7 @@ export class RemoteLocalDockerExecutionEnv {
433
433
  if (!ready.ok)
434
434
  return ready;
435
435
  const abs = this.resolve(p);
436
- return appendFileStaged(this.stagedLane(content), abs, abortSignal, (ctx) => ctx.inPlace((signal) => this.pipeIn(content, abs, signal, ">>")));
436
+ return appendFileStaged(this.stagedLane(content), abs, abortSignal, readyUpload((dest, signal) => this.pipeIn(content, dest, signal, ">>")));
437
437
  }
438
438
  async pipeIn(content, dest, abortSignal, redirect = ">") {
439
439
  const r = await this.fsExec(`cat ${redirect} ${shellQuote(dest)}`, abortSignal, typeof content === "string" ? Buffer.from(content, "utf8") : content);
@@ -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);
@@ -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