@with-logic/elwood 0.2.1 → 0.2.2

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 (871) hide show
  1. package/CHANGELOG.md +565 -1
  2. package/CONTRIBUTING.md +3 -0
  3. package/README.md +4 -2
  4. package/dist/bridge/socket-release.d.ts +15 -0
  5. package/dist/bridge/socket-release.d.ts.map +1 -0
  6. package/dist/bridge/socket-release.js +22 -0
  7. package/dist/bridge/socket-release.js.map +1 -0
  8. package/dist/claude/composer/border.d.ts +12 -0
  9. package/dist/claude/composer/border.d.ts.map +1 -0
  10. package/dist/claude/composer/border.js +12 -0
  11. package/dist/claude/composer/border.js.map +1 -0
  12. package/dist/claude/composer/empty-input.d.ts +15 -0
  13. package/dist/claude/composer/empty-input.d.ts.map +1 -1
  14. package/dist/claude/composer/empty-input.js +30 -11
  15. package/dist/claude/composer/empty-input.js.map +1 -1
  16. package/dist/claude/composer/footer.d.ts +26 -2
  17. package/dist/claude/composer/footer.d.ts.map +1 -1
  18. package/dist/claude/composer/footer.js +29 -2
  19. package/dist/claude/composer/footer.js.map +1 -1
  20. package/dist/claude/composer/idle.d.ts +14 -0
  21. package/dist/claude/composer/idle.d.ts.map +1 -0
  22. package/dist/claude/composer/idle.js +17 -0
  23. package/dist/claude/composer/idle.js.map +1 -0
  24. package/dist/claude/composer/last.d.ts +2 -0
  25. package/dist/claude/composer/last.d.ts.map +1 -0
  26. package/dist/claude/composer/last.js +15 -0
  27. package/dist/claude/composer/last.js.map +1 -0
  28. package/dist/claude/composer/staged-input.d.ts.map +1 -1
  29. package/dist/claude/composer/staged-input.js +2 -1
  30. package/dist/claude/composer/staged-input.js.map +1 -1
  31. package/dist/claude/hooks/stop-failure.d.ts +15 -2
  32. package/dist/claude/hooks/stop-failure.d.ts.map +1 -1
  33. package/dist/claude/hooks/stop-failure.js +32 -9
  34. package/dist/claude/hooks/stop-failure.js.map +1 -1
  35. package/dist/claude/login/stages.d.ts.map +1 -1
  36. package/dist/claude/login/stages.js +2 -2
  37. package/dist/claude/login/stages.js.map +1 -1
  38. package/dist/claude/model-picker.d.ts +1 -1
  39. package/dist/claude/model-picker.d.ts.map +1 -1
  40. package/dist/claude/model-picker.js +27 -10
  41. package/dist/claude/model-picker.js.map +1 -1
  42. package/dist/claude/preflight.d.ts +1 -1
  43. package/dist/claude/preflight.d.ts.map +1 -1
  44. package/dist/claude/preflight.js +18 -12
  45. package/dist/claude/preflight.js.map +1 -1
  46. package/dist/claude/questions/navigation.d.ts.map +1 -1
  47. package/dist/claude/questions/navigation.js +1 -2
  48. package/dist/claude/questions/navigation.js.map +1 -1
  49. package/dist/claude/questions/screen.d.ts.map +1 -1
  50. package/dist/claude/questions/screen.js +10 -2
  51. package/dist/claude/questions/screen.js.map +1 -1
  52. package/dist/claude/screen-table.d.ts +8 -5
  53. package/dist/claude/screen-table.d.ts.map +1 -1
  54. package/dist/claude/screen-table.js +20 -12
  55. package/dist/claude/screen-table.js.map +1 -1
  56. package/dist/claude/session/bridge.d.ts +2 -1
  57. package/dist/claude/session/bridge.d.ts.map +1 -1
  58. package/dist/claude/session/bridge.js +3 -1
  59. package/dist/claude/session/bridge.js.map +1 -1
  60. package/dist/claude/session/build.d.ts.map +1 -1
  61. package/dist/claude/session/build.js +13 -11
  62. package/dist/claude/session/build.js.map +1 -1
  63. package/dist/claude/session/cleanup.d.ts +18 -0
  64. package/dist/claude/session/cleanup.d.ts.map +1 -0
  65. package/dist/claude/session/cleanup.js +10 -0
  66. package/dist/claude/session/cleanup.js.map +1 -0
  67. package/dist/claude/session/index.d.ts.map +1 -1
  68. package/dist/claude/session/index.js +27 -13
  69. package/dist/claude/session/index.js.map +1 -1
  70. package/dist/claude/session/instance.d.ts +7 -8
  71. package/dist/claude/session/instance.d.ts.map +1 -1
  72. package/dist/claude/session/instance.js +9 -13
  73. package/dist/claude/session/instance.js.map +1 -1
  74. package/dist/claude/session/resume.d.ts.map +1 -1
  75. package/dist/claude/session/resume.js +14 -5
  76. package/dist/claude/session/resume.js.map +1 -1
  77. package/dist/claude/session/transcript.js +2 -2
  78. package/dist/claude/session/transcript.js.map +1 -1
  79. package/dist/claude/simple.d.ts +1 -1
  80. package/dist/claude/simple.d.ts.map +1 -1
  81. package/dist/claude/simple.js +3 -3
  82. package/dist/claude/simple.js.map +1 -1
  83. package/dist/claude/startup-prompts.d.ts +2 -0
  84. package/dist/claude/startup-prompts.d.ts.map +1 -1
  85. package/dist/claude/startup-prompts.js +5 -1
  86. package/dist/claude/startup-prompts.js.map +1 -1
  87. package/dist/claude/transcript/cursor-io.d.ts +1 -1
  88. package/dist/claude/transcript/cursor-io.d.ts.map +1 -1
  89. package/dist/claude/transcript/cursor-io.js +1 -1
  90. package/dist/claude/transcript/cursor-io.js.map +1 -1
  91. package/dist/claude/transcript/cursor.d.ts +5 -3
  92. package/dist/claude/transcript/cursor.d.ts.map +1 -1
  93. package/dist/claude/transcript/cursor.js +18 -8
  94. package/dist/claude/transcript/cursor.js.map +1 -1
  95. package/dist/claude/transcript/drain-context.d.ts +4 -3
  96. package/dist/claude/transcript/drain-context.d.ts.map +1 -1
  97. package/dist/claude/transcript/drain-context.js.map +1 -1
  98. package/dist/claude/transcript/emit.d.ts +2 -1
  99. package/dist/claude/transcript/emit.d.ts.map +1 -1
  100. package/dist/claude/transcript/emit.js +1 -0
  101. package/dist/claude/transcript/emit.js.map +1 -1
  102. package/dist/claude/transcript/index.d.ts.map +1 -1
  103. package/dist/claude/transcript/index.js +2 -2
  104. package/dist/claude/transcript/index.js.map +1 -1
  105. package/dist/claude/transcript/warnings.d.ts +2 -1
  106. package/dist/claude/transcript/warnings.d.ts.map +1 -1
  107. package/dist/claude/transcript/warnings.js +3 -2
  108. package/dist/claude/transcript/warnings.js.map +1 -1
  109. package/dist/cli/config/effective.d.ts +2 -2
  110. package/dist/cli/config/effective.d.ts.map +1 -1
  111. package/dist/cli/config/effective.js +0 -2
  112. package/dist/cli/config/effective.js.map +1 -1
  113. package/dist/cli/interactive/spawn.d.ts +0 -2
  114. package/dist/cli/interactive/spawn.d.ts.map +1 -1
  115. package/dist/cli/interactive/spawn.js +27 -24
  116. package/dist/cli/interactive/spawn.js.map +1 -1
  117. package/dist/cli/lifecycle/index.d.ts.map +1 -1
  118. package/dist/cli/lifecycle/index.js +5 -3
  119. package/dist/cli/lifecycle/index.js.map +1 -1
  120. package/dist/cli/main-failure.d.ts.map +1 -1
  121. package/dist/cli/main-failure.js +5 -2
  122. package/dist/cli/main-failure.js.map +1 -1
  123. package/dist/cli/models/combined.d.ts.map +1 -1
  124. package/dist/cli/models/combined.js +3 -2
  125. package/dist/cli/models/combined.js.map +1 -1
  126. package/dist/cli/models/render.d.ts.map +1 -1
  127. package/dist/cli/models/render.js +2 -1
  128. package/dist/cli/models/render.js.map +1 -1
  129. package/dist/cli/output/cleanup-error.d.ts +22 -0
  130. package/dist/cli/output/cleanup-error.d.ts.map +1 -0
  131. package/dist/cli/output/cleanup-error.js +67 -0
  132. package/dist/cli/output/cleanup-error.js.map +1 -0
  133. package/dist/cli/output/types.d.ts +6 -2
  134. package/dist/cli/output/types.d.ts.map +1 -1
  135. package/dist/cli/request/agent-detect.d.ts +6 -2
  136. package/dist/cli/request/agent-detect.d.ts.map +1 -1
  137. package/dist/cli/request/agent-detect.js +14 -6
  138. package/dist/cli/request/agent-detect.js.map +1 -1
  139. package/dist/cli/request/finalize.d.ts +1 -1
  140. package/dist/cli/request/finalize.d.ts.map +1 -1
  141. package/dist/cli/request/finalize.js +4 -25
  142. package/dist/cli/request/finalize.js.map +1 -1
  143. package/dist/cli/request/index.d.ts.map +1 -1
  144. package/dist/cli/request/index.js +11 -5
  145. package/dist/cli/request/index.js.map +1 -1
  146. package/dist/cli/request/path-replacement.d.ts +27 -0
  147. package/dist/cli/request/path-replacement.d.ts.map +1 -0
  148. package/dist/cli/request/path-replacement.js +79 -0
  149. package/dist/cli/request/path-replacement.js.map +1 -0
  150. package/dist/cli/request/workspace.d.ts +8 -0
  151. package/dist/cli/request/workspace.d.ts.map +1 -0
  152. package/dist/cli/request/workspace.js +50 -0
  153. package/dist/cli/request/workspace.js.map +1 -0
  154. package/dist/cli/run/output.d.ts.map +1 -1
  155. package/dist/cli/run/output.js +2 -1
  156. package/dist/cli/run/output.js.map +1 -1
  157. package/dist/cli/run/subscribe.d.ts.map +1 -1
  158. package/dist/cli/run/subscribe.js +1 -1
  159. package/dist/cli/run/subscribe.js.map +1 -1
  160. package/dist/cli/session/index.d.ts +4 -4
  161. package/dist/cli/session/index.d.ts.map +1 -1
  162. package/dist/cli/session/index.js +5 -5
  163. package/dist/cli/session/index.js.map +1 -1
  164. package/dist/cli/session/launch.d.ts +2 -2
  165. package/dist/cli/session/launch.d.ts.map +1 -1
  166. package/dist/cli/session/launch.js +12 -3
  167. package/dist/cli/session/launch.js.map +1 -1
  168. package/dist/cli/session/turn-readers.d.ts +14 -0
  169. package/dist/cli/session/turn-readers.d.ts.map +1 -0
  170. package/dist/cli/session/turn-readers.js +13 -0
  171. package/dist/cli/session/turn-readers.js.map +1 -0
  172. package/dist/codex/config/default-model.d.ts +24 -0
  173. package/dist/codex/config/default-model.d.ts.map +1 -0
  174. package/dist/codex/config/default-model.js +133 -0
  175. package/dist/codex/config/default-model.js.map +1 -0
  176. package/dist/codex/config/home.d.ts +35 -0
  177. package/dist/codex/config/home.d.ts.map +1 -0
  178. package/dist/codex/config/home.js +122 -0
  179. package/dist/codex/config/home.js.map +1 -0
  180. package/dist/codex/config/lock.d.ts +17 -11
  181. package/dist/codex/config/lock.d.ts.map +1 -1
  182. package/dist/codex/config/lock.js +102 -11
  183. package/dist/codex/config/lock.js.map +1 -1
  184. package/dist/codex/config/read.d.ts +16 -0
  185. package/dist/codex/config/read.d.ts.map +1 -0
  186. package/dist/codex/config/read.js +75 -0
  187. package/dist/codex/config/read.js.map +1 -0
  188. package/dist/codex/config/restore.d.ts +17 -7
  189. package/dist/codex/config/restore.d.ts.map +1 -1
  190. package/dist/codex/config/restore.js +33 -20
  191. package/dist/codex/config/restore.js.map +1 -1
  192. package/dist/codex/config/transaction.d.ts +6 -4
  193. package/dist/codex/config/transaction.d.ts.map +1 -1
  194. package/dist/codex/config/transaction.js +4 -3
  195. package/dist/codex/config/transaction.js.map +1 -1
  196. package/dist/codex/images/clipboard-copies.d.ts +39 -0
  197. package/dist/codex/images/clipboard-copies.d.ts.map +1 -0
  198. package/dist/codex/images/clipboard-copies.js +91 -0
  199. package/dist/codex/images/clipboard-copies.js.map +1 -0
  200. package/dist/codex/model-picker.d.ts +1 -1
  201. package/dist/codex/model-picker.d.ts.map +1 -1
  202. package/dist/codex/model-picker.js +16 -6
  203. package/dist/codex/model-picker.js.map +1 -1
  204. package/dist/codex/preflight.d.ts +2 -2
  205. package/dist/codex/preflight.d.ts.map +1 -1
  206. package/dist/codex/preflight.js +28 -21
  207. package/dist/codex/preflight.js.map +1 -1
  208. package/dist/codex/pty.d.ts +25 -3
  209. package/dist/codex/pty.d.ts.map +1 -1
  210. package/dist/codex/pty.js +53 -7
  211. package/dist/codex/pty.js.map +1 -1
  212. package/dist/codex/questions/candidates.d.ts.map +1 -1
  213. package/dist/codex/questions/candidates.js +4 -5
  214. package/dist/codex/questions/candidates.js.map +1 -1
  215. package/dist/codex/questions/driver.js +2 -2
  216. package/dist/codex/questions/driver.js.map +1 -1
  217. package/dist/codex/questions/records.d.ts +1 -1
  218. package/dist/codex/questions/records.d.ts.map +1 -1
  219. package/dist/codex/questions/records.js +1 -3
  220. package/dist/codex/questions/records.js.map +1 -1
  221. package/dist/codex/screen/clearance.d.ts +6 -0
  222. package/dist/codex/screen/clearance.d.ts.map +1 -1
  223. package/dist/codex/screen/clearance.js +10 -0
  224. package/dist/codex/screen/clearance.js.map +1 -1
  225. package/dist/codex/screen-table.d.ts.map +1 -1
  226. package/dist/codex/screen-table.js +6 -2
  227. package/dist/codex/screen-table.js.map +1 -1
  228. package/dist/codex/session/bridge.d.ts +1 -0
  229. package/dist/codex/session/bridge.d.ts.map +1 -1
  230. package/dist/codex/session/bridge.js +3 -1
  231. package/dist/codex/session/bridge.js.map +1 -1
  232. package/dist/codex/session/build.d.ts.map +1 -1
  233. package/dist/codex/session/build.js +14 -12
  234. package/dist/codex/session/build.js.map +1 -1
  235. package/dist/codex/session/cleanup.d.ts +2 -2
  236. package/dist/codex/session/cleanup.d.ts.map +1 -1
  237. package/dist/codex/session/cleanup.js +8 -11
  238. package/dist/codex/session/cleanup.js.map +1 -1
  239. package/dist/codex/session/config-switch.d.ts +20 -0
  240. package/dist/codex/session/config-switch.d.ts.map +1 -0
  241. package/dist/codex/session/config-switch.js +42 -0
  242. package/dist/codex/session/config-switch.js.map +1 -0
  243. package/dist/codex/session/hooks.d.ts.map +1 -1
  244. package/dist/codex/session/hooks.js +7 -0
  245. package/dist/codex/session/hooks.js.map +1 -1
  246. package/dist/codex/session/index.d.ts.map +1 -1
  247. package/dist/codex/session/index.js +34 -16
  248. package/dist/codex/session/index.js.map +1 -1
  249. package/dist/codex/session/instance.d.ts +10 -12
  250. package/dist/codex/session/instance.d.ts.map +1 -1
  251. package/dist/codex/session/instance.js +42 -37
  252. package/dist/codex/session/instance.js.map +1 -1
  253. package/dist/codex/session/readiness.d.ts +11 -0
  254. package/dist/codex/session/readiness.d.ts.map +1 -0
  255. package/dist/codex/session/readiness.js +22 -0
  256. package/dist/codex/session/readiness.js.map +1 -0
  257. package/dist/codex/session/resume.d.ts.map +1 -1
  258. package/dist/codex/session/resume.js +9 -4
  259. package/dist/codex/session/resume.js.map +1 -1
  260. package/dist/codex/session/transcript.d.ts.map +1 -1
  261. package/dist/codex/session/transcript.js +12 -1
  262. package/dist/codex/session/transcript.js.map +1 -1
  263. package/dist/codex/session/turn-commit.d.ts +58 -0
  264. package/dist/codex/session/turn-commit.d.ts.map +1 -0
  265. package/dist/codex/session/turn-commit.js +97 -0
  266. package/dist/codex/session/turn-commit.js.map +1 -0
  267. package/dist/codex/session/warnings.d.ts +13 -6
  268. package/dist/codex/session/warnings.d.ts.map +1 -1
  269. package/dist/codex/session/warnings.js +36 -9
  270. package/dist/codex/session/warnings.js.map +1 -1
  271. package/dist/codex/startup-prompts.d.ts +3 -0
  272. package/dist/codex/startup-prompts.d.ts.map +1 -1
  273. package/dist/codex/startup-prompts.js +20 -13
  274. package/dist/codex/startup-prompts.js.map +1 -1
  275. package/dist/codex/startup-warnings.d.ts +2 -0
  276. package/dist/codex/startup-warnings.d.ts.map +1 -1
  277. package/dist/codex/startup-warnings.js +6 -0
  278. package/dist/codex/startup-warnings.js.map +1 -1
  279. package/dist/codex/transcript/payload.d.ts +8 -0
  280. package/dist/codex/transcript/payload.d.ts.map +1 -0
  281. package/dist/codex/transcript/payload.js +11 -0
  282. package/dist/codex/transcript/payload.js.map +1 -0
  283. package/dist/codex/transcript/rejection.d.ts +15 -0
  284. package/dist/codex/transcript/rejection.d.ts.map +1 -0
  285. package/dist/codex/transcript/rejection.js +44 -0
  286. package/dist/codex/transcript/rejection.js.map +1 -0
  287. package/dist/codex/transcript/turn-end.d.ts +8 -0
  288. package/dist/codex/transcript/turn-end.d.ts.map +1 -0
  289. package/dist/codex/transcript/turn-end.js +17 -0
  290. package/dist/codex/transcript/turn-end.js.map +1 -0
  291. package/dist/codex/transcript/watcher.d.ts +5 -2
  292. package/dist/codex/transcript/watcher.d.ts.map +1 -1
  293. package/dist/codex/transcript/watcher.js +11 -6
  294. package/dist/codex/transcript/watcher.js.map +1 -1
  295. package/dist/codex/trust-retry.d.ts +12 -0
  296. package/dist/codex/trust-retry.d.ts.map +1 -0
  297. package/dist/codex/trust-retry.js +12 -0
  298. package/dist/codex/trust-retry.js.map +1 -0
  299. package/dist/codex/update/skip-attempt.d.ts +2 -0
  300. package/dist/codex/update/skip-attempt.d.ts.map +1 -1
  301. package/dist/codex/update/skip-attempt.js +4 -0
  302. package/dist/codex/update/skip-attempt.js.map +1 -1
  303. package/dist/codex/update/tracker.d.ts +2 -0
  304. package/dist/codex/update/tracker.d.ts.map +1 -1
  305. package/dist/codex/update/tracker.js +4 -0
  306. package/dist/codex/update/tracker.js.map +1 -1
  307. package/dist/core/delay.d.ts +3 -2
  308. package/dist/core/delay.d.ts.map +1 -1
  309. package/dist/core/delay.js +3 -2
  310. package/dist/core/delay.js.map +1 -1
  311. package/dist/core/errors.d.ts +33 -4
  312. package/dist/core/errors.d.ts.map +1 -1
  313. package/dist/core/errors.js +51 -7
  314. package/dist/core/errors.js.map +1 -1
  315. package/dist/core/images/materialize.d.ts +13 -4
  316. package/dist/core/images/materialize.d.ts.map +1 -1
  317. package/dist/core/images/materialize.js +48 -11
  318. package/dist/core/images/materialize.js.map +1 -1
  319. package/dist/core/input/abort.d.ts +15 -0
  320. package/dist/core/input/abort.d.ts.map +1 -1
  321. package/dist/core/input/abort.js +18 -2
  322. package/dist/core/input/abort.js.map +1 -1
  323. package/dist/core/input/constants.d.ts +4 -1
  324. package/dist/core/input/constants.d.ts.map +1 -1
  325. package/dist/core/input/constants.js +4 -1
  326. package/dist/core/input/constants.js.map +1 -1
  327. package/dist/core/input/index.d.ts +1 -1
  328. package/dist/core/input/index.d.ts.map +1 -1
  329. package/dist/core/input/index.js +1 -1
  330. package/dist/core/input/index.js.map +1 -1
  331. package/dist/core/models/clearance.d.ts +38 -0
  332. package/dist/core/models/clearance.d.ts.map +1 -0
  333. package/dist/core/models/clearance.js +38 -0
  334. package/dist/core/models/clearance.js.map +1 -0
  335. package/dist/core/models/close-wait.d.ts +17 -0
  336. package/dist/core/models/close-wait.d.ts.map +1 -0
  337. package/dist/core/models/close-wait.js +44 -0
  338. package/dist/core/models/close-wait.js.map +1 -0
  339. package/dist/core/models/dialog-region.d.ts +18 -3
  340. package/dist/core/models/dialog-region.d.ts.map +1 -1
  341. package/dist/core/models/dialog-region.js +29 -40
  342. package/dist/core/models/dialog-region.js.map +1 -1
  343. package/dist/core/models/input.d.ts +10 -1
  344. package/dist/core/models/input.d.ts.map +1 -1
  345. package/dist/core/models/input.js +15 -2
  346. package/dist/core/models/input.js.map +1 -1
  347. package/dist/core/models/intervention.d.ts +2 -2
  348. package/dist/core/models/intervention.d.ts.map +1 -1
  349. package/dist/core/models/intervention.js +6 -3
  350. package/dist/core/models/intervention.js.map +1 -1
  351. package/dist/core/models/own-picker.d.ts +21 -0
  352. package/dist/core/models/own-picker.d.ts.map +1 -0
  353. package/dist/core/models/own-picker.js +21 -0
  354. package/dist/core/models/own-picker.js.map +1 -0
  355. package/dist/core/models/picker.d.ts +34 -4
  356. package/dist/core/models/picker.d.ts.map +1 -1
  357. package/dist/core/models/picker.js +50 -44
  358. package/dist/core/models/picker.js.map +1 -1
  359. package/dist/core/models/row-block.d.ts +66 -0
  360. package/dist/core/models/row-block.d.ts.map +1 -0
  361. package/dist/core/models/row-block.js +87 -0
  362. package/dist/core/models/row-block.js.map +1 -0
  363. package/dist/core/models/rows.d.ts +32 -3
  364. package/dist/core/models/rows.d.ts.map +1 -1
  365. package/dist/core/models/rows.js +48 -20
  366. package/dist/core/models/rows.js.map +1 -1
  367. package/dist/core/models/tui-screen.d.ts +6 -1
  368. package/dist/core/models/tui-screen.d.ts.map +1 -1
  369. package/dist/core/models/tui-screen.js +25 -10
  370. package/dist/core/models/tui-screen.js.map +1 -1
  371. package/dist/core/models/window.d.ts +49 -0
  372. package/dist/core/models/window.d.ts.map +1 -0
  373. package/dist/core/models/window.js +105 -0
  374. package/dist/core/models/window.js.map +1 -0
  375. package/dist/core/path-trust.d.ts +11 -0
  376. package/dist/core/path-trust.d.ts.map +1 -0
  377. package/dist/core/path-trust.js +21 -0
  378. package/dist/core/path-trust.js.map +1 -0
  379. package/dist/core/screen-facts.d.ts +3 -1
  380. package/dist/core/screen-facts.d.ts.map +1 -1
  381. package/dist/core/screen-facts.js +1 -0
  382. package/dist/core/screen-facts.js.map +1 -1
  383. package/dist/core/simple/boundary-signal.d.ts +41 -6
  384. package/dist/core/simple/boundary-signal.d.ts.map +1 -1
  385. package/dist/core/simple/boundary-signal.js +43 -3
  386. package/dist/core/simple/boundary-signal.js.map +1 -1
  387. package/dist/core/simple/close.d.ts +2 -1
  388. package/dist/core/simple/close.d.ts.map +1 -1
  389. package/dist/core/simple/close.js +10 -2
  390. package/dist/core/simple/close.js.map +1 -1
  391. package/dist/core/simple/turn-boundary.d.ts +2 -0
  392. package/dist/core/simple/turn-boundary.d.ts.map +1 -1
  393. package/dist/core/simple/turn-boundary.js +1 -1
  394. package/dist/core/simple/turn-boundary.js.map +1 -1
  395. package/dist/core/simple/turn-types.d.ts +9 -3
  396. package/dist/core/simple/turn-types.d.ts.map +1 -1
  397. package/dist/core/simple/turn-types.js +10 -2
  398. package/dist/core/simple/turn-types.js.map +1 -1
  399. package/dist/core/simple/turn.d.ts +2 -0
  400. package/dist/core/simple/turn.d.ts.map +1 -1
  401. package/dist/core/simple/turn.js +11 -5
  402. package/dist/core/simple/turn.js.map +1 -1
  403. package/dist/core/terminal-options.d.ts +17 -1
  404. package/dist/core/terminal-options.d.ts.map +1 -1
  405. package/dist/core/terminal-options.js +20 -8
  406. package/dist/core/terminal-options.js.map +1 -1
  407. package/dist/core/transcript/cursor-io.d.ts +8 -0
  408. package/dist/core/transcript/cursor-io.d.ts.map +1 -1
  409. package/dist/core/transcript/cursor-io.js +11 -5
  410. package/dist/core/transcript/cursor-io.js.map +1 -1
  411. package/dist/core/transcript/cursor.d.ts +28 -4
  412. package/dist/core/transcript/cursor.d.ts.map +1 -1
  413. package/dist/core/transcript/cursor.js +53 -7
  414. package/dist/core/transcript/cursor.js.map +1 -1
  415. package/dist/core/transcript/drain.d.ts +43 -0
  416. package/dist/core/transcript/drain.d.ts.map +1 -0
  417. package/dist/core/transcript/drain.js +67 -0
  418. package/dist/core/transcript/drain.js.map +1 -0
  419. package/dist/core/trust/abortable.d.ts +12 -0
  420. package/dist/core/trust/abortable.d.ts.map +1 -0
  421. package/dist/core/trust/abortable.js +48 -0
  422. package/dist/core/trust/abortable.js.map +1 -0
  423. package/dist/core/trust/allowlist.d.ts +2 -0
  424. package/dist/core/trust/allowlist.d.ts.map +1 -1
  425. package/dist/core/trust/allowlist.js +4 -1
  426. package/dist/core/trust/allowlist.js.map +1 -1
  427. package/dist/core/trust/blocking.d.ts +11 -0
  428. package/dist/core/trust/blocking.d.ts.map +1 -1
  429. package/dist/core/trust/blocking.js +5 -4
  430. package/dist/core/trust/blocking.js.map +1 -1
  431. package/dist/core/trust/copy.d.ts.map +1 -1
  432. package/dist/core/trust/copy.js +7 -1
  433. package/dist/core/trust/copy.js.map +1 -1
  434. package/dist/core/trust/deadline.d.ts +24 -0
  435. package/dist/core/trust/deadline.d.ts.map +1 -0
  436. package/dist/core/trust/deadline.js +56 -0
  437. package/dist/core/trust/deadline.js.map +1 -0
  438. package/dist/core/trust/dialog.d.ts +11 -2
  439. package/dist/core/trust/dialog.d.ts.map +1 -1
  440. package/dist/core/trust/dialog.js +12 -3
  441. package/dist/core/trust/dialog.js.map +1 -1
  442. package/dist/core/trust/options.d.ts +5 -1
  443. package/dist/core/trust/options.d.ts.map +1 -1
  444. package/dist/core/trust/options.js +8 -2
  445. package/dist/core/trust/options.js.map +1 -1
  446. package/dist/core/trust/prompts.d.ts +3 -0
  447. package/dist/core/trust/prompts.d.ts.map +1 -1
  448. package/dist/core/trust/prompts.js +2 -1
  449. package/dist/core/trust/prompts.js.map +1 -1
  450. package/dist/core/trust/responder.d.ts +10 -5
  451. package/dist/core/trust/responder.d.ts.map +1 -1
  452. package/dist/core/trust/responder.js +37 -33
  453. package/dist/core/trust/responder.js.map +1 -1
  454. package/dist/core/trust/step.d.ts +67 -0
  455. package/dist/core/trust/step.d.ts.map +1 -0
  456. package/dist/core/trust/step.js +45 -0
  457. package/dist/core/trust/step.js.map +1 -0
  458. package/dist/core/trust/types.d.ts +21 -1
  459. package/dist/core/trust/types.d.ts.map +1 -1
  460. package/dist/core/trust/types.js +25 -1
  461. package/dist/core/trust/types.js.map +1 -1
  462. package/dist/core/trust/view.d.ts +2 -0
  463. package/dist/core/trust/view.d.ts.map +1 -1
  464. package/dist/core/trust/view.js +3 -0
  465. package/dist/core/trust/view.js.map +1 -1
  466. package/dist/core/trust/write.d.ts +31 -6
  467. package/dist/core/trust/write.d.ts.map +1 -1
  468. package/dist/core/trust/write.js +95 -80
  469. package/dist/core/trust/write.js.map +1 -1
  470. package/dist/core/turn-state.d.ts +18 -4
  471. package/dist/core/turn-state.d.ts.map +1 -1
  472. package/dist/core/turn-state.js +47 -25
  473. package/dist/core/turn-state.js.map +1 -1
  474. package/dist/core/warnings/images.d.ts +22 -0
  475. package/dist/core/warnings/images.d.ts.map +1 -0
  476. package/dist/core/warnings/images.js +3 -0
  477. package/dist/core/warnings/images.js.map +1 -0
  478. package/dist/core/warnings/index.d.ts +3 -2
  479. package/dist/core/warnings/index.d.ts.map +1 -1
  480. package/dist/core/warnings/lifecycle.d.ts +35 -4
  481. package/dist/core/warnings/lifecycle.d.ts.map +1 -1
  482. package/dist/core/warnings/lifecycle.js +1 -1
  483. package/dist/core/warnings/update.d.ts +8 -4
  484. package/dist/core/warnings/update.d.ts.map +1 -1
  485. package/dist/core/warnings/update.js +21 -6
  486. package/dist/core/warnings/update.js.map +1 -1
  487. package/dist/pty/exit-latch.d.ts +28 -0
  488. package/dist/pty/exit-latch.d.ts.map +1 -0
  489. package/dist/pty/exit-latch.js +50 -0
  490. package/dist/pty/exit-latch.js.map +1 -0
  491. package/dist/runtime/exit-status.d.ts +7 -0
  492. package/dist/runtime/exit-status.d.ts.map +1 -0
  493. package/dist/runtime/exit-status.js +13 -0
  494. package/dist/runtime/exit-status.js.map +1 -0
  495. package/dist/runtime/home-guard/index.d.ts +45 -0
  496. package/dist/runtime/home-guard/index.d.ts.map +1 -0
  497. package/dist/runtime/home-guard/index.js +69 -0
  498. package/dist/runtime/home-guard/index.js.map +1 -0
  499. package/dist/runtime/loop-restore.d.ts +9 -9
  500. package/dist/runtime/loop-restore.d.ts.map +1 -1
  501. package/dist/runtime/loop-restore.js +10 -10
  502. package/dist/runtime/loop-restore.js.map +1 -1
  503. package/dist/runtime/probe/capped-buffer.d.ts +16 -0
  504. package/dist/runtime/probe/capped-buffer.d.ts.map +1 -0
  505. package/dist/runtime/probe/capped-buffer.js +38 -0
  506. package/dist/runtime/probe/capped-buffer.js.map +1 -0
  507. package/dist/runtime/probe/capture.d.ts +55 -0
  508. package/dist/runtime/probe/capture.d.ts.map +1 -0
  509. package/dist/runtime/probe/capture.js +71 -0
  510. package/dist/runtime/probe/capture.js.map +1 -0
  511. package/dist/runtime/{probe-cleanup.d.ts → probe/cleanup.d.ts} +2 -2
  512. package/dist/runtime/probe/cleanup.d.ts.map +1 -0
  513. package/dist/runtime/{probe-cleanup.js → probe/cleanup.js} +3 -3
  514. package/dist/runtime/probe/cleanup.js.map +1 -0
  515. package/dist/runtime/probe/directory-key.d.ts +26 -0
  516. package/dist/runtime/probe/directory-key.d.ts.map +1 -0
  517. package/dist/runtime/probe/directory-key.js +46 -0
  518. package/dist/runtime/probe/directory-key.js.map +1 -0
  519. package/dist/runtime/probe/index.d.ts +25 -0
  520. package/dist/runtime/probe/index.d.ts.map +1 -0
  521. package/dist/runtime/probe/index.js +153 -0
  522. package/dist/runtime/probe/index.js.map +1 -0
  523. package/dist/runtime/probe/lookup.d.ts +12 -0
  524. package/dist/runtime/probe/lookup.d.ts.map +1 -0
  525. package/dist/runtime/probe/lookup.js +29 -0
  526. package/dist/runtime/probe/lookup.js.map +1 -0
  527. package/dist/runtime/probe/named-pipes.d.ts +35 -0
  528. package/dist/runtime/probe/named-pipes.d.ts.map +1 -0
  529. package/dist/runtime/probe/named-pipes.js +167 -0
  530. package/dist/runtime/probe/named-pipes.js.map +1 -0
  531. package/dist/runtime/probe/private-directory.d.ts +14 -0
  532. package/dist/runtime/probe/private-directory.d.ts.map +1 -0
  533. package/dist/runtime/probe/private-directory.js +50 -0
  534. package/dist/runtime/probe/private-directory.js.map +1 -0
  535. package/dist/runtime/probe/results.d.ts +14 -0
  536. package/dist/runtime/probe/results.d.ts.map +1 -0
  537. package/dist/runtime/probe/results.js +38 -0
  538. package/dist/runtime/probe/results.js.map +1 -0
  539. package/dist/runtime/probe/slots.d.ts +17 -0
  540. package/dist/runtime/probe/slots.d.ts.map +1 -0
  541. package/dist/runtime/probe/slots.js +35 -0
  542. package/dist/runtime/probe/slots.js.map +1 -0
  543. package/dist/runtime/probe/start.d.ts +64 -0
  544. package/dist/runtime/probe/start.d.ts.map +1 -0
  545. package/dist/runtime/probe/start.js +80 -0
  546. package/dist/runtime/probe/start.js.map +1 -0
  547. package/dist/runtime/probe-cache.d.ts +19 -0
  548. package/dist/runtime/probe-cache.d.ts.map +1 -0
  549. package/dist/runtime/probe-cache.js +56 -0
  550. package/dist/runtime/probe-cache.js.map +1 -0
  551. package/dist/runtime/readiness/initial-ready.d.ts +31 -5
  552. package/dist/runtime/readiness/initial-ready.d.ts.map +1 -1
  553. package/dist/runtime/readiness/initial-ready.js +64 -18
  554. package/dist/runtime/readiness/initial-ready.js.map +1 -1
  555. package/dist/runtime/seams.d.ts +14 -2
  556. package/dist/runtime/seams.d.ts.map +1 -1
  557. package/dist/runtime/seams.js +2 -2
  558. package/dist/runtime/seams.js.map +1 -1
  559. package/dist/runtime/session/base.d.ts.map +1 -1
  560. package/dist/runtime/session/base.js +6 -5
  561. package/dist/runtime/session/base.js.map +1 -1
  562. package/dist/runtime/session/commands.d.ts +5 -3
  563. package/dist/runtime/session/commands.d.ts.map +1 -1
  564. package/dist/runtime/session/commands.js +5 -2
  565. package/dist/runtime/session/commands.js.map +1 -1
  566. package/dist/runtime/session/frames.d.ts +12 -2
  567. package/dist/runtime/session/frames.d.ts.map +1 -1
  568. package/dist/runtime/session/frames.js +10 -3
  569. package/dist/runtime/session/frames.js.map +1 -1
  570. package/dist/runtime/session/image-attach.js +7 -2
  571. package/dist/runtime/session/image-attach.js.map +1 -1
  572. package/dist/runtime/session/launch-directory.d.ts +33 -0
  573. package/dist/runtime/session/launch-directory.d.ts.map +1 -0
  574. package/dist/runtime/session/launch-directory.js +84 -0
  575. package/dist/runtime/session/launch-directory.js.map +1 -0
  576. package/dist/runtime/session/lifecycle.d.ts +3 -3
  577. package/dist/runtime/session/lifecycle.d.ts.map +1 -1
  578. package/dist/runtime/session/lifecycle.js +1 -5
  579. package/dist/runtime/session/lifecycle.js.map +1 -1
  580. package/dist/runtime/session/loops.d.ts +1 -1
  581. package/dist/runtime/session/loops.d.ts.map +1 -1
  582. package/dist/runtime/session/loops.js +6 -3
  583. package/dist/runtime/session/loops.js.map +1 -1
  584. package/dist/runtime/session/picker-cleanup.d.ts +6 -21
  585. package/dist/runtime/session/picker-cleanup.d.ts.map +1 -1
  586. package/dist/runtime/session/picker-cleanup.js +19 -31
  587. package/dist/runtime/session/picker-cleanup.js.map +1 -1
  588. package/dist/runtime/session/picker-hold.d.ts +24 -0
  589. package/dist/runtime/session/picker-hold.d.ts.map +1 -0
  590. package/dist/runtime/session/picker-hold.js +42 -0
  591. package/dist/runtime/session/picker-hold.js.map +1 -0
  592. package/dist/runtime/session/picker.d.ts +13 -11
  593. package/dist/runtime/session/picker.d.ts.map +1 -1
  594. package/dist/runtime/session/picker.js +46 -24
  595. package/dist/runtime/session/picker.js.map +1 -1
  596. package/dist/runtime/session/prepare-state.d.ts +6 -0
  597. package/dist/runtime/session/prepare-state.d.ts.map +1 -0
  598. package/dist/runtime/session/prepare-state.js +14 -0
  599. package/dist/runtime/session/prepare-state.js.map +1 -0
  600. package/dist/runtime/session/questions.d.ts +2 -2
  601. package/dist/runtime/session/questions.d.ts.map +1 -1
  602. package/dist/runtime/session/questions.js.map +1 -1
  603. package/dist/runtime/session/readiness.d.ts +14 -5
  604. package/dist/runtime/session/readiness.d.ts.map +1 -1
  605. package/dist/runtime/session/readiness.js +22 -6
  606. package/dist/runtime/session/readiness.js.map +1 -1
  607. package/dist/runtime/session/reap.d.ts +11 -7
  608. package/dist/runtime/session/reap.d.ts.map +1 -1
  609. package/dist/runtime/session/reap.js +16 -10
  610. package/dist/runtime/session/reap.js.map +1 -1
  611. package/dist/runtime/session/runtime-cleanup.d.ts +18 -0
  612. package/dist/runtime/session/runtime-cleanup.d.ts.map +1 -0
  613. package/dist/runtime/session/runtime-cleanup.js +18 -0
  614. package/dist/runtime/session/runtime-cleanup.js.map +1 -0
  615. package/dist/runtime/session/session-input.d.ts +32 -0
  616. package/dist/runtime/session/session-input.d.ts.map +1 -0
  617. package/dist/runtime/session/{picker-input.js → session-input.js} +35 -7
  618. package/dist/runtime/session/session-input.js.map +1 -0
  619. package/dist/runtime/session/shutdown-binding.d.ts +12 -1
  620. package/dist/runtime/session/shutdown-binding.d.ts.map +1 -1
  621. package/dist/runtime/session/shutdown-binding.js +33 -1
  622. package/dist/runtime/session/shutdown-binding.js.map +1 -1
  623. package/dist/runtime/session/shutdown-cleanup.d.ts +17 -0
  624. package/dist/runtime/session/shutdown-cleanup.d.ts.map +1 -0
  625. package/dist/runtime/session/shutdown-cleanup.js +49 -0
  626. package/dist/runtime/session/shutdown-cleanup.js.map +1 -0
  627. package/dist/runtime/session/shutdown.d.ts +3 -2
  628. package/dist/runtime/session/shutdown.d.ts.map +1 -1
  629. package/dist/runtime/session/shutdown.js +13 -24
  630. package/dist/runtime/session/shutdown.js.map +1 -1
  631. package/dist/runtime/shell-quote.d.ts +8 -0
  632. package/dist/runtime/shell-quote.d.ts.map +1 -0
  633. package/dist/runtime/shell-quote.js +10 -0
  634. package/dist/runtime/shell-quote.js.map +1 -0
  635. package/dist/runtime/shell.d.ts +36 -12
  636. package/dist/runtime/shell.d.ts.map +1 -1
  637. package/dist/runtime/shell.js +90 -14
  638. package/dist/runtime/shell.js.map +1 -1
  639. package/dist/runtime/shutdown/coalesce.d.ts +15 -0
  640. package/dist/runtime/shutdown/coalesce.d.ts.map +1 -0
  641. package/dist/runtime/shutdown/coalesce.js +42 -0
  642. package/dist/runtime/shutdown/coalesce.js.map +1 -0
  643. package/dist/runtime/shutdown/detached-sweep/failures.d.ts +24 -0
  644. package/dist/runtime/shutdown/detached-sweep/failures.d.ts.map +1 -0
  645. package/dist/runtime/shutdown/detached-sweep/failures.js +32 -0
  646. package/dist/runtime/shutdown/detached-sweep/failures.js.map +1 -0
  647. package/dist/runtime/shutdown/detached-sweep/index.d.ts +55 -0
  648. package/dist/runtime/shutdown/detached-sweep/index.d.ts.map +1 -0
  649. package/dist/runtime/shutdown/detached-sweep/index.js +129 -0
  650. package/dist/runtime/shutdown/detached-sweep/index.js.map +1 -0
  651. package/dist/runtime/shutdown/detached-sweep/kill.d.ts +37 -0
  652. package/dist/runtime/shutdown/detached-sweep/kill.d.ts.map +1 -0
  653. package/dist/runtime/shutdown/detached-sweep/kill.js +87 -0
  654. package/dist/runtime/shutdown/detached-sweep/kill.js.map +1 -0
  655. package/dist/runtime/shutdown/detached-sweep/record.d.ts +67 -0
  656. package/dist/runtime/shutdown/detached-sweep/record.d.ts.map +1 -0
  657. package/dist/runtime/shutdown/detached-sweep/record.js +111 -0
  658. package/dist/runtime/shutdown/detached-sweep/record.js.map +1 -0
  659. package/dist/runtime/shutdown/detached-sweep/rounds.d.ts +78 -0
  660. package/dist/runtime/shutdown/detached-sweep/rounds.d.ts.map +1 -0
  661. package/dist/runtime/shutdown/detached-sweep/rounds.js +116 -0
  662. package/dist/runtime/shutdown/detached-sweep/rounds.js.map +1 -0
  663. package/dist/runtime/shutdown/detached-sweep/survivors.d.ts +40 -0
  664. package/dist/runtime/shutdown/detached-sweep/survivors.d.ts.map +1 -0
  665. package/dist/runtime/shutdown/detached-sweep/survivors.js +112 -0
  666. package/dist/runtime/shutdown/detached-sweep/survivors.js.map +1 -0
  667. package/dist/runtime/shutdown/leader-group.d.ts +29 -0
  668. package/dist/runtime/shutdown/leader-group.d.ts.map +1 -0
  669. package/dist/runtime/shutdown/leader-group.js +35 -0
  670. package/dist/runtime/shutdown/leader-group.js.map +1 -0
  671. package/dist/runtime/shutdown/native-read-admission.d.ts +13 -0
  672. package/dist/runtime/shutdown/native-read-admission.d.ts.map +1 -0
  673. package/dist/runtime/shutdown/native-read-admission.js +64 -0
  674. package/dist/runtime/shutdown/native-read-admission.js.map +1 -0
  675. package/dist/runtime/shutdown/process-table.d.ts +80 -0
  676. package/dist/runtime/shutdown/process-table.d.ts.map +1 -0
  677. package/dist/runtime/shutdown/process-table.js +147 -0
  678. package/dist/runtime/shutdown/process-table.js.map +1 -0
  679. package/dist/runtime/shutdown/process-tree-ops.d.ts +39 -0
  680. package/dist/runtime/shutdown/process-tree-ops.d.ts.map +1 -0
  681. package/dist/runtime/shutdown/process-tree-ops.js +73 -0
  682. package/dist/runtime/shutdown/process-tree-ops.js.map +1 -0
  683. package/dist/runtime/shutdown/read-timeout.d.ts +4 -0
  684. package/dist/runtime/shutdown/read-timeout.d.ts.map +1 -0
  685. package/dist/runtime/shutdown/read-timeout.js +6 -0
  686. package/dist/runtime/shutdown/read-timeout.js.map +1 -0
  687. package/dist/runtime/shutdown/reap-queue.d.ts +10 -0
  688. package/dist/runtime/shutdown/reap-queue.d.ts.map +1 -0
  689. package/dist/runtime/shutdown/reap-queue.js +29 -0
  690. package/dist/runtime/shutdown/reap-queue.js.map +1 -0
  691. package/dist/runtime/shutdown/reap-tree.d.ts +42 -32
  692. package/dist/runtime/shutdown/reap-tree.d.ts.map +1 -1
  693. package/dist/runtime/shutdown/reap-tree.js +78 -71
  694. package/dist/runtime/shutdown/reap-tree.js.map +1 -1
  695. package/dist/runtime/shutdown/shared-daemon.d.ts +59 -0
  696. package/dist/runtime/shutdown/shared-daemon.d.ts.map +1 -0
  697. package/dist/runtime/shutdown/shared-daemon.js +139 -0
  698. package/dist/runtime/shutdown/shared-daemon.js.map +1 -0
  699. package/dist/runtime/shutdown/teardown.d.ts +15 -0
  700. package/dist/runtime/shutdown/teardown.d.ts.map +1 -1
  701. package/dist/runtime/shutdown/teardown.js +19 -6
  702. package/dist/runtime/shutdown/teardown.js.map +1 -1
  703. package/dist/runtime/shutdown/terminate.d.ts +21 -1
  704. package/dist/runtime/shutdown/terminate.d.ts.map +1 -1
  705. package/dist/runtime/shutdown/terminate.js +83 -56
  706. package/dist/runtime/shutdown/terminate.js.map +1 -1
  707. package/dist/runtime/startup/buffer.d.ts +26 -7
  708. package/dist/runtime/startup/buffer.d.ts.map +1 -1
  709. package/dist/runtime/startup/buffer.js +42 -19
  710. package/dist/runtime/startup/buffer.js.map +1 -1
  711. package/dist/runtime/startup/cleanup.d.ts +37 -11
  712. package/dist/runtime/startup/cleanup.d.ts.map +1 -1
  713. package/dist/runtime/startup/cleanup.js +55 -25
  714. package/dist/runtime/startup/cleanup.js.map +1 -1
  715. package/dist/runtime/startup/index.d.ts +13 -1
  716. package/dist/runtime/startup/index.d.ts.map +1 -1
  717. package/dist/runtime/startup/index.js +38 -6
  718. package/dist/runtime/startup/index.js.map +1 -1
  719. package/dist/runtime/stream-marker.d.ts +17 -0
  720. package/dist/runtime/stream-marker.d.ts.map +1 -0
  721. package/dist/runtime/stream-marker.js +35 -0
  722. package/dist/runtime/stream-marker.js.map +1 -0
  723. package/dist/runtime/update/acquire.d.ts +16 -0
  724. package/dist/runtime/update/acquire.d.ts.map +1 -0
  725. package/dist/runtime/update/acquire.js +62 -0
  726. package/dist/runtime/update/acquire.js.map +1 -0
  727. package/dist/runtime/update/completion.d.ts +12 -0
  728. package/dist/runtime/update/completion.d.ts.map +1 -0
  729. package/dist/runtime/update/completion.js +50 -0
  730. package/dist/runtime/update/completion.js.map +1 -0
  731. package/dist/runtime/update/lock.d.ts +1 -1
  732. package/dist/runtime/update/lock.d.ts.map +1 -1
  733. package/dist/runtime/update/lock.js +21 -38
  734. package/dist/runtime/update/lock.js.map +1 -1
  735. package/dist/runtime/update/once.d.ts +16 -13
  736. package/dist/runtime/update/once.d.ts.map +1 -1
  737. package/dist/runtime/update/once.js +41 -31
  738. package/dist/runtime/update/once.js.map +1 -1
  739. package/dist/runtime/update/owner.js +1 -1
  740. package/dist/runtime/update/retained-lease.js +1 -1
  741. package/dist/runtime/update/waiting.d.ts +14 -1
  742. package/dist/runtime/update/waiting.d.ts.map +1 -1
  743. package/dist/runtime/update/waiting.js +20 -12
  744. package/dist/runtime/update/waiting.js.map +1 -1
  745. package/dist/state/canonical-path.d.ts +5 -0
  746. package/dist/state/canonical-path.d.ts.map +1 -1
  747. package/dist/state/canonical-path.js +11 -5
  748. package/dist/state/canonical-path.js.map +1 -1
  749. package/dist/state/directories.d.ts +31 -1
  750. package/dist/state/directories.d.ts.map +1 -1
  751. package/dist/state/directories.js +75 -13
  752. package/dist/state/directories.js.map +1 -1
  753. package/dist/state/files.d.ts +3 -3
  754. package/dist/state/files.d.ts.map +1 -1
  755. package/dist/state/files.js +4 -10
  756. package/dist/state/files.js.map +1 -1
  757. package/dist/state/launch-ownership.d.ts +4 -2
  758. package/dist/state/launch-ownership.d.ts.map +1 -1
  759. package/dist/state/launch-ownership.js +18 -10
  760. package/dist/state/launch-ownership.js.map +1 -1
  761. package/dist/state/launch-publication.d.ts +7 -1
  762. package/dist/state/launch-publication.d.ts.map +1 -1
  763. package/dist/state/launch-publication.js +14 -2
  764. package/dist/state/launch-publication.js.map +1 -1
  765. package/dist/state/loop-store.d.ts +15 -4
  766. package/dist/state/loop-store.d.ts.map +1 -1
  767. package/dist/state/loop-store.js +13 -7
  768. package/dist/state/loop-store.js.map +1 -1
  769. package/dist/state/preparation/created-directories.d.ts +13 -0
  770. package/dist/state/preparation/created-directories.d.ts.map +1 -0
  771. package/dist/state/preparation/created-directories.js +45 -0
  772. package/dist/state/preparation/created-directories.js.map +1 -0
  773. package/dist/state/preparation/ignore-sync.d.ts +9 -0
  774. package/dist/state/preparation/ignore-sync.d.ts.map +1 -0
  775. package/dist/state/preparation/ignore-sync.js +47 -0
  776. package/dist/state/preparation/ignore-sync.js.map +1 -0
  777. package/dist/state/preparation/index.d.ts +25 -0
  778. package/dist/state/preparation/index.d.ts.map +1 -0
  779. package/dist/state/preparation/index.js +31 -0
  780. package/dist/state/preparation/index.js.map +1 -0
  781. package/dist/state/preparation/install-ignore.d.ts +6 -0
  782. package/dist/state/preparation/install-ignore.d.ts.map +1 -0
  783. package/dist/state/preparation/install-ignore.js +87 -0
  784. package/dist/state/preparation/install-ignore.js.map +1 -0
  785. package/dist/state/preparation/rollback-parent.d.ts +3 -0
  786. package/dist/state/preparation/rollback-parent.d.ts.map +1 -0
  787. package/dist/state/preparation/rollback-parent.js +18 -0
  788. package/dist/state/preparation/rollback-parent.js.map +1 -0
  789. package/dist/state/preparation/root-trust.d.ts +3 -0
  790. package/dist/state/preparation/root-trust.d.ts.map +1 -0
  791. package/dist/state/preparation/root-trust.js +70 -0
  792. package/dist/state/preparation/root-trust.js.map +1 -0
  793. package/dist/state/private-session.d.ts +5 -2
  794. package/dist/state/private-session.d.ts.map +1 -1
  795. package/dist/state/private-session.js +21 -9
  796. package/dist/state/private-session.js.map +1 -1
  797. package/dist/state/root.d.ts +25 -0
  798. package/dist/state/root.d.ts.map +1 -0
  799. package/dist/state/root.js +84 -0
  800. package/dist/state/root.js.map +1 -0
  801. package/dist/state/runtime-paths.d.ts +5 -4
  802. package/dist/state/runtime-paths.d.ts.map +1 -1
  803. package/dist/state/runtime-paths.js +5 -4
  804. package/dist/state/runtime-paths.js.map +1 -1
  805. package/dist/state/setup-failure.d.ts +3 -0
  806. package/dist/state/setup-failure.d.ts.map +1 -0
  807. package/dist/state/setup-failure.js +13 -0
  808. package/dist/state/setup-failure.js.map +1 -0
  809. package/dist/state/socket-home.d.ts +17 -12
  810. package/dist/state/socket-home.d.ts.map +1 -1
  811. package/dist/state/socket-home.js +31 -14
  812. package/dist/state/socket-home.js.map +1 -1
  813. package/dist/state/store.d.ts +1 -3
  814. package/dist/state/store.d.ts.map +1 -1
  815. package/dist/state/store.js +3 -18
  816. package/dist/state/store.js.map +1 -1
  817. package/dist/terminal/headless.d.ts +1 -1
  818. package/dist/terminal/headless.d.ts.map +1 -1
  819. package/dist/terminal/headless.js +1 -3
  820. package/dist/terminal/headless.js.map +1 -1
  821. package/docs/cli-behavior.md +1218 -28
  822. package/docs/cli.md +2 -0
  823. package/docs/codex/cli.md +4 -2
  824. package/package.json +4 -4
  825. package/prd/04-architecture.md +32 -0
  826. package/prd/05-api/5.1-starting-claude.md +17 -1
  827. package/prd/05-api/5.2-resuming-claude.md +5 -0
  828. package/prd/05-api/5.3-claude-session-api.md +267 -40
  829. package/prd/05-api/5.4-events.md +77 -10
  830. package/prd/05-api/5.5-starting-codex.md +3 -1
  831. package/prd/05-api/5.6-resuming-codex.md +4 -1
  832. package/prd/05-api/5.7-codex-session-api.md +87 -5
  833. package/prd/05-api/5.8-session-api.md +32 -1
  834. package/prd/06-claude-hook-bridge.md +2 -0
  835. package/prd/07a-codex-hook-bridge.md +5 -0
  836. package/prd/08-state.md +63 -7
  837. package/prd/09-lifecycle.md +126 -35
  838. package/prd/10-errors.md +11 -4
  839. package/prd/12-e2e.md +81 -0
  840. package/prd/12a-cli.md +63 -9
  841. package/prd/14-conformance.md +52 -35
  842. package/prd/16-maintainer-review.md +11 -0
  843. package/dist/claude/model-composer.d.ts +0 -2
  844. package/dist/claude/model-composer.d.ts.map +0 -1
  845. package/dist/claude/model-composer.js +0 -12
  846. package/dist/claude/model-composer.js.map +0 -1
  847. package/dist/claude/transcript/drain.d.ts +0 -33
  848. package/dist/claude/transcript/drain.d.ts.map +0 -1
  849. package/dist/claude/transcript/drain.js +0 -56
  850. package/dist/claude/transcript/drain.js.map +0 -1
  851. package/dist/codex/session/cli-exit.d.ts +0 -24
  852. package/dist/codex/session/cli-exit.d.ts.map +0 -1
  853. package/dist/codex/session/cli-exit.js +0 -43
  854. package/dist/codex/session/cli-exit.js.map +0 -1
  855. package/dist/codex/transcript/drain.d.ts +0 -30
  856. package/dist/codex/transcript/drain.d.ts.map +0 -1
  857. package/dist/codex/transcript/drain.js +0 -48
  858. package/dist/codex/transcript/drain.js.map +0 -1
  859. package/dist/runtime/probe-cleanup.d.ts.map +0 -1
  860. package/dist/runtime/probe-cleanup.js.map +0 -1
  861. package/dist/runtime/probe.d.ts +0 -11
  862. package/dist/runtime/probe.d.ts.map +0 -1
  863. package/dist/runtime/probe.js +0 -113
  864. package/dist/runtime/probe.js.map +0 -1
  865. package/dist/runtime/session/foreign-picker.d.ts +0 -8
  866. package/dist/runtime/session/foreign-picker.d.ts.map +0 -1
  867. package/dist/runtime/session/foreign-picker.js +0 -18
  868. package/dist/runtime/session/foreign-picker.js.map +0 -1
  869. package/dist/runtime/session/picker-input.d.ts +0 -17
  870. package/dist/runtime/session/picker-input.d.ts.map +0 -1
  871. package/dist/runtime/session/picker-input.js.map +0 -1
@@ -0,0 +1,45 @@
1
+ /** Record successful state-directory creations for bounded rollback (PRD §8.1, C-STATE-14). */
2
+ import { lstatSync, rmdirSync } from "node:fs";
3
+ import { errnoCode } from "../../core/errors.js";
4
+ import { trustedRollbackParent } from "./rollback-parent.js";
5
+ export class CreatedStateDirectories {
6
+ directories = new Map();
7
+ /** Called only after a single mkdir succeeded, never for an existing directory. */
8
+ record = (path) => {
9
+ const entry = lstatSync(path, { bigint: true });
10
+ if (!entry.isDirectory() || entry.uid !== BigInt(process.getuid()))
11
+ return;
12
+ // A recreated key belongs at its latest successful creation position.
13
+ this.directories.delete(path);
14
+ this.directories.set(path, { dev: entry.dev, ino: entry.ino, uid: entry.uid });
15
+ };
16
+ /**
17
+ * Remove only empty, still-matching owned entries. Retained shared default roots and
18
+ * sessions may already support another setup. Keep the first cleanup code without replacing
19
+ * the setup failure that caused rollback.
20
+ */
21
+ remove(retainedDirectories = new Set()) {
22
+ let failed;
23
+ // Parents are created first even when native aliases spell them differently.
24
+ const deepestFirst = [...this.directories].reverse();
25
+ for (const [path, made] of deepestFirst) {
26
+ if (retainedDirectories.has(path))
27
+ continue;
28
+ try {
29
+ if (!trustedRollbackParent(path))
30
+ continue;
31
+ const current = lstatSync(path, { bigint: true });
32
+ if (current.dev !== made.dev || current.ino !== made.ino || current.uid !== made.uid)
33
+ continue;
34
+ rmdirSync(path);
35
+ }
36
+ catch (error) {
37
+ const code = errnoCode(error);
38
+ if (code !== "ENOENT" && code !== "ENOTEMPTY")
39
+ failed ??= code;
40
+ }
41
+ }
42
+ return failed;
43
+ }
44
+ }
45
+ //# sourceMappingURL=created-directories.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"created-directories.js","sourceRoot":"","sources":["../../../src/state/preparation/created-directories.ts"],"names":[],"mappings":"AAAA,+FAA+F;AAC/F,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAK7D,MAAM,OAAO,uBAAuB;IACjB,WAAW,GAAG,IAAI,GAAG,EAA4B,CAAC;IAEnE,mFAAmF;IAC1E,MAAM,GAAmC,CAAC,IAAI,EAAE,EAAE;QACzD,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;QAChD,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,IAAI,KAAK,CAAC,GAAG,KAAK,MAAM,CAAC,OAAO,CAAC,MAAO,EAAE,CAAC;YAAE,OAAO;QAC5E,sEAAsE;QACtE,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC9B,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC;IACjF,CAAC,CAAC;IAEF;;;;OAIG;IACH,MAAM,CAAC,sBAA2C,IAAI,GAAG,EAAE;QACzD,IAAI,MAA0B,CAAC;QAC/B,6EAA6E;QAC7E,MAAM,YAAY,GAAG,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC,OAAO,EAAE,CAAC;QACrD,KAAK,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,YAAY,EAAE,CAAC;YACxC,IAAI,mBAAmB,CAAC,GAAG,CAAC,IAAI,CAAC;gBAAE,SAAS;YAC5C,IAAI,CAAC;gBACH,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC;oBAAE,SAAS;gBAC3C,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;gBAClD,IAAI,OAAO,CAAC,GAAG,KAAK,IAAI,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,KAAK,IAAI,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,KAAK,IAAI,CAAC,GAAG;oBAClF,SAAS;gBACX,SAAS,CAAC,IAAI,CAAC,CAAC;YAClB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;gBAC9B,IAAI,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,WAAW;oBAAE,MAAM,KAAK,IAAI,CAAC;YACjE,CAAC;QACH,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;CACF"}
@@ -0,0 +1,9 @@
1
+ /** Avoid repeated successful ignore-directory syncs within bounded observations (PRD §8.1). */
2
+ import { type Stats } from "node:fs";
3
+ /**
4
+ * Call only after validating the ignore afresh. This remembers durability work,
5
+ * never safety checks. Aliases have separate entries; changes restored between
6
+ * observations cannot be detected, so this is not an atomic filesystem guarantee.
7
+ */
8
+ export declare function syncIgnoreDirectory(path: string, info: Stats): void;
9
+ //# sourceMappingURL=ignore-sync.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ignore-sync.d.ts","sourceRoot":"","sources":["../../../src/state/preparation/ignore-sync.ts"],"names":[],"mappings":"AAAA,+FAA+F;AAC/F,OAAO,EAAE,KAAK,KAAK,EAAY,MAAM,SAAS,CAAC;AAsB/C;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,GAAG,IAAI,CAmBnE"}
@@ -0,0 +1,47 @@
1
+ /** Avoid repeated successful ignore-directory syncs within bounded observations (PRD §8.1). */
2
+ import { statSync } from "node:fs";
3
+ import { dirname, resolve } from "node:path";
4
+ import { fsyncDir } from "../files.js";
5
+ const MAX_SYNCED_IGNORES = 32;
6
+ const synced = new Map();
7
+ function observation(info) {
8
+ return [
9
+ info.dev,
10
+ info.ino,
11
+ info.mode,
12
+ info.nlink,
13
+ info.uid,
14
+ info.gid,
15
+ info.size,
16
+ info.mtimeMs,
17
+ info.ctimeMs,
18
+ info.birthtimeMs,
19
+ ].join(":");
20
+ }
21
+ /**
22
+ * Call only after validating the ignore afresh. This remembers durability work,
23
+ * never safety checks. Aliases have separate entries; changes restored between
24
+ * observations cannot be detected, so this is not an atomic filesystem guarantee.
25
+ */
26
+ export function syncIgnoreDirectory(path, info) {
27
+ const key = resolve(path);
28
+ const previous = synced.get(key);
29
+ synced.delete(key);
30
+ const parent = dirname(key);
31
+ const before = observation(statSync(parent));
32
+ const current = `${observation(info)}|${before}`;
33
+ if (previous !== current) {
34
+ fsyncDir(parent);
35
+ // A directory changed during the sync has not earned a reusable observation.
36
+ if (observation(statSync(parent)) !== before)
37
+ return;
38
+ }
39
+ synced.set(key, current);
40
+ if (synced.size > MAX_SYNCED_IGNORES) {
41
+ for (const oldest of synced.keys()) {
42
+ synced.delete(oldest);
43
+ break;
44
+ }
45
+ }
46
+ }
47
+ //# sourceMappingURL=ignore-sync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ignore-sync.js","sourceRoot":"","sources":["../../../src/state/preparation/ignore-sync.ts"],"names":[],"mappings":"AAAA,+FAA+F;AAC/F,OAAO,EAAc,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC/C,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEvC,MAAM,kBAAkB,GAAG,EAAE,CAAC;AAC9B,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;AAEzC,SAAS,WAAW,CAAC,IAAW;IAC9B,OAAO;QACL,IAAI,CAAC,GAAG;QACR,IAAI,CAAC,GAAG;QACR,IAAI,CAAC,IAAI;QACT,IAAI,CAAC,KAAK;QACV,IAAI,CAAC,GAAG;QACR,IAAI,CAAC,GAAG;QACR,IAAI,CAAC,IAAI;QACT,IAAI,CAAC,OAAO;QACZ,IAAI,CAAC,OAAO;QACZ,IAAI,CAAC,WAAW;KACjB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACd,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CAAC,IAAY,EAAE,IAAW;IAC3D,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACjC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACnB,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IAC5B,MAAM,MAAM,GAAG,WAAW,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;IAC7C,MAAM,OAAO,GAAG,GAAG,WAAW,CAAC,IAAI,CAAC,IAAI,MAAM,EAAE,CAAC;IACjD,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QACzB,QAAQ,CAAC,MAAM,CAAC,CAAC;QACjB,6EAA6E;QAC7E,IAAI,WAAW,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,KAAK,MAAM;YAAE,OAAO;IACvD,CAAC;IACD,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IACzB,IAAI,MAAM,CAAC,IAAI,GAAG,kBAAkB,EAAE,CAAC;QACrC,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;YACnC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YACtB,MAAM;QACR,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -0,0 +1,25 @@
1
+ /** State scaffolding for a checked launch, with ownership-aware undo (PRD §8.1, C-STATE-14). */
2
+ /** How a launch's state directory is set up. */
3
+ export type StateDirSetup = {
4
+ /**
5
+ * The caller omitted `stateDir`, so this is Elwood's default `<cwd>/.elwood`: readable by
6
+ * local tooling, and given a `.gitignore` of `*` when it has none (an existing one is kept as
7
+ * it is). An explicit `stateDir`, even one naming that same directory, is not.
8
+ */
9
+ readonly isImplicitDefaultStateDir?: boolean;
10
+ /** The session's working directory, which must exist and is never made (C-STATE-14). */
11
+ readonly cwd: string;
12
+ /**
13
+ * The session whose directory is made with the rest, so that another start's undo, which
14
+ * removes only empty directories, leaves this start's tree (C-STATE-14).
15
+ */
16
+ readonly elwoodSessionId?: string;
17
+ };
18
+ /**
19
+ * Makes the state directory, its `sessions` directory, and the session's own directory when
20
+ * one is named, only while the session's `cwd` exists. A root at or under `cwd` is made only
21
+ * below it; a root elsewhere gets its missing parents. Nothing below the root is ever made with
22
+ * parents.
23
+ */
24
+ export declare function prepareStateDir(stateDir: string, setup: StateDirSetup): void;
25
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/state/preparation/index.ts"],"names":[],"mappings":"AAAA,gGAAgG;AAQhG,gDAAgD;AAChD,MAAM,MAAM,aAAa,GAAG;IAC1B;;;;OAIG;IACH,QAAQ,CAAC,yBAAyB,CAAC,EAAE,OAAO,CAAC;IAC7C,wFAAwF;IACxF,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;CACnC,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,GAAG,IAAI,CAyB5E"}
@@ -0,0 +1,31 @@
1
+ /** State scaffolding for a checked launch, with ownership-aware undo (PRD §8.1, C-STATE-14). */
2
+ import { join, resolve } from "node:path";
3
+ import { assertStatePath, PRIVATE_STATE_MODE, SHARED_STATE_MODE } from "../directories.js";
4
+ import { safeSessionDir, secureMkdir } from "../files.js";
5
+ import { makeStateRoot, makeStateTree } from "../root.js";
6
+ import { installDefaultIgnore } from "./install-ignore.js";
7
+ /**
8
+ * Makes the state directory, its `sessions` directory, and the session's own directory when
9
+ * one is named, only while the session's `cwd` exists. A root at or under `cwd` is made only
10
+ * below it; a root elsewhere gets its missing parents. Nothing below the root is ever made with
11
+ * parents.
12
+ */
13
+ export function prepareStateDir(stateDir, setup) {
14
+ const root = resolve(stateDir);
15
+ assertStatePath(root);
16
+ assertStatePath(join(root, "sessions"));
17
+ const isDefault = setup.isImplicitDefaultStateDir === true;
18
+ const sessions = join(root, "sessions");
19
+ const id = setup.elwoodSessionId;
20
+ const session = id === undefined ? undefined : safeSessionDir(root, id);
21
+ makeStateTree(setup.cwd, (onDirectoryCreated) => {
22
+ makeStateRoot(root, isDefault ? SHARED_STATE_MODE : PRIVATE_STATE_MODE, setup.cwd, undefined, onDirectoryCreated);
23
+ // Publish named-session presence before accepting shared configuration.
24
+ secureMkdir(sessions, onDirectoryCreated);
25
+ if (session !== undefined)
26
+ secureMkdir(session, onDirectoryCreated);
27
+ if (isDefault)
28
+ installDefaultIgnore(join(root, ".gitignore"));
29
+ }, isDefault ? new Set([root, sessions]) : undefined);
30
+ }
31
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/state/preparation/index.ts"],"names":[],"mappings":"AAAA,gGAAgG;AAEhG,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAC3F,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC1D,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAmB3D;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAAC,QAAgB,EAAE,KAAoB;IACpE,MAAM,IAAI,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC/B,eAAe,CAAC,IAAI,CAAC,CAAC;IACtB,eAAe,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC;IACxC,MAAM,SAAS,GAAG,KAAK,CAAC,yBAAyB,KAAK,IAAI,CAAC;IAC3D,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IACxC,MAAM,EAAE,GAAG,KAAK,CAAC,eAAe,CAAC;IACjC,MAAM,OAAO,GAAG,EAAE,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,cAAc,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACxE,aAAa,CACX,KAAK,CAAC,GAAG,EACT,CAAC,kBAAkB,EAAE,EAAE;QACrB,aAAa,CACX,IAAI,EACJ,SAAS,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,kBAAkB,EAClD,KAAK,CAAC,GAAG,EACT,SAAS,EACT,kBAAkB,CACnB,CAAC;QACF,wEAAwE;QACxE,WAAW,CAAC,QAAQ,EAAE,kBAAkB,CAAC,CAAC;QAC1C,IAAI,OAAO,KAAK,SAAS;YAAE,WAAW,CAAC,OAAO,EAAE,kBAAkB,CAAC,CAAC;QACpE,IAAI,SAAS;YAAE,oBAAoB,CAAC,IAAI,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC,CAAC;IAChE,CAAC,EACD,SAAS,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAClD,CAAC;AACJ,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { type Stats } from "node:fs";
2
+ /** Remove only the path still naming the inode this operation opened. */
3
+ export declare function unlinkOwnedIgnore(path: string, owned: Stats): void;
4
+ /** Publish complete contents; a published ignore may already belong to another start. */
5
+ export declare function installDefaultIgnore(gitignorePath: string): Stats | undefined;
6
+ //# sourceMappingURL=install-ignore.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install-ignore.d.ts","sourceRoot":"","sources":["../../../src/state/preparation/install-ignore.ts"],"names":[],"mappings":"AAEA,OAAO,EASL,KAAK,KAAK,EAGX,MAAM,SAAS,CAAC;AAQjB,yEAAyE;AACzE,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,IAAI,CAOlE;AAgBD,yFAAyF;AACzF,wBAAgB,oBAAoB,CAAC,aAAa,EAAE,MAAM,GAAG,KAAK,GAAG,SAAS,CA2C7E"}
@@ -0,0 +1,87 @@
1
+ /** Publish a fully written ignore file without overwriting another writer (PRD §8.1, C-STATE-11). */
2
+ import { randomUUID } from "node:crypto";
3
+ import { closeSync, constants, fchmodSync, fstatSync, fsyncSync, linkSync, lstatSync, openSync, unlinkSync, writeFileSync, } from "node:fs";
4
+ import { dirname } from "node:path";
5
+ import { elwoodError, errnoCode, toError } from "../../core/errors.js";
6
+ import { fsyncDir } from "../files.js";
7
+ import { stateCleanupFailure } from "../setup-failure.js";
8
+ import { syncIgnoreDirectory } from "./ignore-sync.js";
9
+ import { assertTrustedIgnoreParent } from "./root-trust.js";
10
+ /** Remove only the path still naming the inode this operation opened. */
11
+ export function unlinkOwnedIgnore(path, owned) {
12
+ try {
13
+ const current = lstatSync(path);
14
+ if (current.dev === owned.dev && current.ino === owned.ino)
15
+ unlinkSync(path);
16
+ }
17
+ catch (error) {
18
+ if (errnoCode(error) !== "ENOENT")
19
+ throw error;
20
+ }
21
+ }
22
+ /** Validate and durably accept an existing ignore without changing its contents. */
23
+ function existingIgnore(path) {
24
+ try {
25
+ const info = lstatSync(path);
26
+ if (!info.isFile())
27
+ throw elwoodError("state_corrupt", `Default ignore must be a regular file: ${path}`);
28
+ syncIgnoreDirectory(path, info);
29
+ return true;
30
+ }
31
+ catch (error) {
32
+ if (errnoCode(error) !== "ENOENT")
33
+ throw error;
34
+ return false;
35
+ }
36
+ }
37
+ /** Publish complete contents; a published ignore may already belong to another start. */
38
+ export function installDefaultIgnore(gitignorePath) {
39
+ assertTrustedIgnoreParent(dirname(gitignorePath));
40
+ if (existingIgnore(gitignorePath))
41
+ return undefined;
42
+ const staging = `${gitignorePath}.${randomUUID()}.pending`;
43
+ const fd = openSync(staging, constants.O_WRONLY | constants.O_CREAT | constants.O_EXCL | constants.O_NOFOLLOW, 0o644);
44
+ let installed;
45
+ let failure;
46
+ try {
47
+ const owned = fstatSync(fd);
48
+ fchmodSync(fd, 0o644);
49
+ writeFileSync(fd, "*\n");
50
+ fsyncSync(fd);
51
+ try {
52
+ linkSync(staging, gitignorePath);
53
+ installed = owned;
54
+ }
55
+ catch (error) {
56
+ if (errnoCode(error) !== "EEXIST" || !existingIgnore(gitignorePath))
57
+ throw error;
58
+ }
59
+ unlinkOwnedIgnore(staging, owned);
60
+ if (installed !== undefined)
61
+ fsyncDir(dirname(gitignorePath));
62
+ }
63
+ catch (error) {
64
+ failure = toError(error);
65
+ try {
66
+ unlinkOwnedIgnore(staging, fstatSync(fd));
67
+ }
68
+ catch (cleanupError) {
69
+ failure = toError(stateCleanupFailure(failure, errnoCode(cleanupError)));
70
+ }
71
+ }
72
+ finally {
73
+ try {
74
+ closeSync(fd);
75
+ }
76
+ catch (closeError) {
77
+ failure =
78
+ failure === undefined
79
+ ? toError(closeError)
80
+ : toError(stateCleanupFailure(failure, errnoCode(closeError)));
81
+ }
82
+ }
83
+ if (failure !== undefined)
84
+ throw failure;
85
+ return installed;
86
+ }
87
+ //# sourceMappingURL=install-ignore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install-ignore.js","sourceRoot":"","sources":["../../../src/state/preparation/install-ignore.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ /** Preserve entries when another account can redirect lookup, or the parent is missing. */
2
+ export declare function trustedRollbackParent(path: string): boolean;
3
+ //# sourceMappingURL=rollback-parent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rollback-parent.d.ts","sourceRoot":"","sources":["../../../src/state/preparation/rollback-parent.ts"],"names":[],"mappings":"AAKA,2FAA2F;AAC3F,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAY3D"}
@@ -0,0 +1,18 @@
1
+ /** Trust rollback lookup parents using the existing mode/owner policy (PRD §8.1, C-STATE-14). */
2
+ import { dirname } from "node:path";
3
+ import { ElwoodError, errnoCode } from "../../core/errors.js";
4
+ import { assertTrustedIgnoreParent } from "./root-trust.js";
5
+ /** Preserve entries when another account can redirect lookup, or the parent is missing. */
6
+ export function trustedRollbackParent(path) {
7
+ try {
8
+ assertTrustedIgnoreParent(dirname(path));
9
+ return true;
10
+ }
11
+ catch (error) {
12
+ if (errnoCode(error) === "ENOENT" ||
13
+ (error instanceof ElwoodError && error.code === "state_corrupt"))
14
+ return false;
15
+ throw error;
16
+ }
17
+ }
18
+ //# sourceMappingURL=rollback-parent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rollback-parent.js","sourceRoot":"","sources":["../../../src/state/preparation/rollback-parent.ts"],"names":[],"mappings":"AAAA,iGAAiG;AACjG,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,yBAAyB,EAAE,MAAM,iBAAiB,CAAC;AAE5D,2FAA2F;AAC3F,MAAM,UAAU,qBAAqB,CAAC,IAAY;IAChD,IAAI,CAAC;QACH,yBAAyB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;QACzC,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IACE,SAAS,CAAC,KAAK,CAAC,KAAK,QAAQ;YAC7B,CAAC,KAAK,YAAY,WAAW,IAAI,KAAK,CAAC,IAAI,KAAK,eAAe,CAAC;YAEhE,OAAO,KAAK,CAAC;QACf,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC"}
@@ -0,0 +1,3 @@
1
+ /** `path` is the existing parent directory, e.g. dirname(gitignorePath); no trust is cached. */
2
+ export declare function assertTrustedIgnoreParent(path: string): void;
3
+ //# sourceMappingURL=root-trust.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"root-trust.d.ts","sourceRoot":"","sources":["../../../src/state/preparation/root-trust.ts"],"names":[],"mappings":"AAcA,gGAAgG;AAChG,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAoC5D"}
@@ -0,0 +1,70 @@
1
+ /**
2
+ * Checks the lexical and physical lookup namespaces of an existing ignore parent before
3
+ * staging/linking (PRD §8.1, C-STATE-11). Root/current-user entries and the CLI's mode-bit,
4
+ * private-group and sticky rules prevent other users redirecting those lookups. This
5
+ * is not same-user/root isolation, an ACL audit, or executable-selection authorization.
6
+ */
7
+ import { isUtf8 } from "node:buffer";
8
+ import { lstatSync, readlinkSync } from "node:fs";
9
+ import { dirname, isAbsolute, join } from "node:path";
10
+ import { elwoodError } from "../../core/errors.js";
11
+ import { lookupFault, ownerFault } from "../../core/path-trust.js";
12
+ const MAX_LINKS = 40;
13
+ /** `path` is the existing parent directory, e.g. dirname(gitignorePath); no trust is cached. */
14
+ export function assertTrustedIgnoreParent(path) {
15
+ const uid = process.getuid?.();
16
+ const gid = process.getgid?.();
17
+ if (uid === undefined || gid === undefined)
18
+ corrupt("POSIX path ownership could not be determined.");
19
+ // Do not resolve/normalize first: even a component followed by '..' must be trusted.
20
+ const absolute = isAbsolute(path) ? path : `${process.cwd()}/${path}`;
21
+ const user = { uid, gid };
22
+ let current = "/";
23
+ const pending = namesOf(absolute);
24
+ let links = 0;
25
+ assertDirectory(lstatSync(current), user, current);
26
+ for (let name = pending.pop(); name !== undefined; name = pending.pop()) {
27
+ if (name === "..") {
28
+ current = dirname(current);
29
+ continue;
30
+ }
31
+ const next = join(current, name);
32
+ const info = lstatSync(next);
33
+ if (info.isSymbolicLink()) {
34
+ const fault = ownerFault(info, user, next, "link");
35
+ if (fault !== undefined)
36
+ corrupt(fault);
37
+ if (++links > MAX_LINKS)
38
+ corrupt(`Too many symbolic links while inspecting '${next}'.`);
39
+ const target = readlinkSync(next, { encoding: "buffer" });
40
+ if (!isUtf8(target))
41
+ corrupt(`Symbolic link '${next}' has a non-UTF-8 target.`);
42
+ const text = target.toString("utf8");
43
+ pending.push(...namesOf(text));
44
+ if (isAbsolute(text)) {
45
+ current = "/";
46
+ assertDirectory(lstatSync(current), user, current);
47
+ }
48
+ continue;
49
+ }
50
+ assertDirectory(info, user, next);
51
+ current = next;
52
+ }
53
+ }
54
+ function assertDirectory(info, user, path) {
55
+ if (!info.isDirectory())
56
+ corrupt(`Ignore parent component is not a directory: ${path}`);
57
+ const fault = lookupFault(info, user, path);
58
+ if (fault !== undefined)
59
+ corrupt(fault);
60
+ }
61
+ function corrupt(reason) {
62
+ throw elwoodError("state_corrupt", `Cannot trust default ignore parent: ${reason}`);
63
+ }
64
+ function namesOf(path) {
65
+ return path
66
+ .split("/")
67
+ .filter((name) => name !== "" && name !== ".")
68
+ .reverse();
69
+ }
70
+ //# sourceMappingURL=root-trust.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"root-trust.js","sourceRoot":"","sources":["../../../src/state/preparation/root-trust.ts"],"names":[],"mappings":"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"}
@@ -5,8 +5,11 @@
5
5
  import type { FileOwner } from "./private-read.ts";
6
6
  import { type SessionRecord } from "./store.ts";
7
7
  export type SessionOwner = FileOwner;
8
- /** Create or validate the CLI state root without following a planted root symlink. */
9
- export declare function ensurePrivateStateRoot(stateDir: string, owner?: SessionOwner): void;
8
+ /**
9
+ * Create or validate the CLI state root for a session in `cwd` without following a planted
10
+ * root symlink. The root is made only while `cwd` exists, and never makes it (C-STATE-14).
11
+ */
12
+ export declare function ensurePrivateStateRoot(stateDir: string, cwd: string, owner?: SessionOwner): void;
10
13
  /**
11
14
  * Read one CLI-owned record without following links or trusting shared metadata: every
12
15
  * directory on the path must be a private directory owned by `owner`, and the record
@@ -1 +1 @@
1
- {"version":3,"file":"private-session.d.ts","sourceRoot":"","sources":["../../src/state/private-session.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAgBH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAEnD,OAAO,EAAyC,KAAK,aAAa,EAAE,MAAM,YAAY,CAAC;AAEvF,MAAM,MAAM,YAAY,GAAG,SAAS,CAAC;AAErC,sFAAsF;AACtF,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,MAAM,EAChB,KAAK,GAAE,YAAyC,GAC/C,IAAI,CAIN;AAiBD;;;;GAIG;AACH,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,MAAM,EAChB,EAAE,EAAE,MAAM,EACV,KAAK,GAAE,YAAyC,GAC/C,aAAa,CAsBf;AAED,+FAA+F;AAC/F,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,MAAM,EAChB,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,QAAQ,GAAG,OAAO,GAC1B,IAAI,CAON"}
1
+ {"version":3,"file":"private-session.d.ts","sourceRoot":"","sources":["../../src/state/private-session.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAQH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAGnD,OAAO,EAAyC,KAAK,aAAa,EAAE,MAAM,YAAY,CAAC;AAEvF,MAAM,MAAM,YAAY,GAAG,SAAS,CAAC;AAErC;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE,MAAM,EACX,KAAK,GAAE,YAAyC,GAC/C,IAAI,CAaN;AAmBD;;;;GAIG;AACH,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,MAAM,EAChB,EAAE,EAAE,MAAM,EACV,KAAK,GAAE,YAAyC,GAC/C,aAAa,CAsBf;AAED,+FAA+F;AAC/F,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,MAAM,EAChB,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,QAAQ,GAAG,OAAO,GAC1B,IAAI,CAON"}
@@ -2,30 +2,42 @@
2
2
  * Private, symlink-safe CLI session-record reads and identity cleanup.
3
3
  * Implements PRD §12A.2/§12A.5 and C-CLI-08/C-CLI-15/C-CLI-16.
4
4
  */
5
- import { closeSync, constants, fstatSync, lstatSync, mkdirSync, openSync, } from "node:fs";
5
+ import { closeSync, constants, fstatSync, lstatSync, openSync } from "node:fs";
6
6
  import { join, resolve } from "node:path";
7
7
  import { ElwoodError, elwoodError, errnoCode } from "../core/errors.js";
8
- import { assertStatePath } from "./directories.js";
8
+ import { assertStatePath, makeStateDirectory, PRIVATE_STATE_MODE } from "./directories.js";
9
9
  import { assertSessionId, safeSessionDir } from "./files.js";
10
10
  import { hasLaunchOwner } from "./launch-ownership.js";
11
+ import { makeStateRoot, makeStateTree } from "./root.js";
11
12
  import { sessionSocketHome } from "./socket-home.js";
12
13
  import { readSessionRecord, removeSessionFiles } from "./store.js";
13
- /** Create or validate the CLI state root without following a planted root symlink. */
14
- export function ensurePrivateStateRoot(stateDir, owner = { uid: process.getuid() }) {
14
+ /**
15
+ * Create or validate the CLI state root for a session in `cwd` without following a planted
16
+ * root symlink. The root is made only while `cwd` exists, and never makes it (C-STATE-14).
17
+ */
18
+ export function ensurePrivateStateRoot(stateDir, cwd, owner = { uid: process.getuid() }) {
15
19
  const root = resolve(stateDir);
16
- ensurePrivateDirectory(root, owner);
17
- ensurePrivateDirectory(join(root, "sessions"), owner);
20
+ const sessions = join(root, "sessions");
21
+ makeStateTree(cwd, (onDirectoryCreated) => {
22
+ // Made without `prepareStateDirectory`'s chmod: an existing root keeps its mode, so a
23
+ // shared one is rejected below instead of being made private (C-CLI-15).
24
+ const makeRoot = () => makeStateRoot(root, PRIVATE_STATE_MODE, cwd, makeStateDirectory, onDirectoryCreated);
25
+ ensurePrivateDirectory(root, owner, makeRoot);
26
+ ensurePrivateDirectory(sessions, owner, () => makeStateDirectory(sessions, PRIVATE_STATE_MODE, "inside-parent", onDirectoryCreated));
27
+ });
18
28
  }
19
- function ensurePrivateDirectory(path, owner) {
29
+ /** Makes `path` with `make`, then requires a private directory `owner` owns. */
30
+ function ensurePrivateDirectory(path, owner, make) {
20
31
  let fd;
21
32
  try {
22
33
  assertStatePath(path);
23
- mkdirSync(path, { recursive: true, mode: 0o700 });
34
+ make();
24
35
  fd = openSync(path, constants.O_RDONLY | constants.O_DIRECTORY | constants.O_NOFOLLOW);
25
36
  assertPrivateDirectory(fstatSync(fd), owner);
26
37
  }
27
38
  catch (error) {
28
- if (error instanceof ElwoodError)
39
+ // ENOENT is a directory removed meanwhile, which `makeStateTree` retries or reports as such.
40
+ if (error instanceof ElwoodError || errnoCode(error) === "ENOENT")
29
41
  throw error;
30
42
  throw corrupt("root");
31
43
  }
@@ -1 +1 @@
1
- {"version":3,"file":"private-session.js","sourceRoot":"","sources":["../../src/state/private-session.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"private-session.js","sourceRoot":"","sources":["../../src/state/private-session.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Makes a state root without ever making the session's working directory. The root is made only
3
+ * while `cwd` exists; one at or under `cwd` is made only below it, one directory at a time, and
4
+ * a root elsewhere gets its missing parents, which are taken back if `cwd` is gone once they are
5
+ * made. Implements PRD §8.1 and C-STATE-14.
6
+ */
7
+ import { type StateDirectoryMode, type StateDirectoryPolicy } from "./directories.ts";
8
+ import { type StateDirectoryCreationObserver } from "./preparation/created-directories.ts";
9
+ /** What makes the root itself once its parents are in place. */
10
+ export type MakeRootDirectory = (path: string, mode: StateDirectoryMode, policy: StateDirectoryPolicy, onDirectoryCreated?: StateDirectoryCreationObserver) => void;
11
+ /**
12
+ * Makes the state root `root` with `mode` for a session in `cwd`, the root itself through
13
+ * `make`, which by default also checks it and gives it `mode`.
14
+ */
15
+ export declare function makeStateRoot(root: string, mode: StateDirectoryMode, cwd: string, make?: MakeRootDirectory, onDirectoryCreated?: StateDirectoryCreationObserver): void;
16
+ /**
17
+ * Runs `makeTree`, recording its successful directory creations for a session in `cwd`,
18
+ * then requires `cwd` to exist still. A `cwd` removed meanwhile fails with ENOENT, and the
19
+ * rollback removes only still-matching, owned, empty directories, deepest first (C-STATE-14).
20
+ * Replaced or unverifiable entries are preserved. Nonempty directories, including those
21
+ * another start has populated, stay in place; entries already gone need no cleanup.
22
+ * Explicitly retained shared directories can already support another setup.
23
+ */
24
+ export declare function makeStateTree(cwd: string, makeTree: (onDirectoryCreated: StateDirectoryCreationObserver) => void, retainedDirectories?: ReadonlySet<string>): void;
25
+ //# sourceMappingURL=root.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"root.d.ts","sourceRoot":"","sources":["../../src/state/root.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,EAKL,KAAK,kBAAkB,EACvB,KAAK,oBAAoB,EAC1B,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAEL,KAAK,8BAA8B,EACpC,MAAM,sCAAsC,CAAC;AAG9C,gEAAgE;AAChE,MAAM,MAAM,iBAAiB,GAAG,CAC9B,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,kBAAkB,EACxB,MAAM,EAAE,oBAAoB,EAC5B,kBAAkB,CAAC,EAAE,8BAA8B,KAChD,IAAI,CAAC;AAEV;;;GAGG;AACH,wBAAgB,aAAa,CAC3B,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,kBAAkB,EACxB,GAAG,EAAE,MAAM,EACX,IAAI,GAAE,iBAAyC,EAC/C,kBAAkB,CAAC,EAAE,8BAA8B,GAClD,IAAI,CAsBN;AAgBD;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAC3B,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,CAAC,kBAAkB,EAAE,8BAA8B,KAAK,IAAI,EACtE,mBAAmB,GAAE,WAAW,CAAC,MAAM,CAAa,GACnD,IAAI,CAiBN"}
@@ -0,0 +1,84 @@
1
+ /**
2
+ * Makes a state root without ever making the session's working directory. The root is made only
3
+ * while `cwd` exists; one at or under `cwd` is made only below it, one directory at a time, and
4
+ * a root elsewhere gets its missing parents, which are taken back if `cwd` is gone once they are
5
+ * made. Implements PRD §8.1 and C-STATE-14.
6
+ */
7
+ import { existsSync, realpathSync } from "node:fs";
8
+ import { isAbsolute, join, relative, sep } from "node:path";
9
+ import { errnoCode } from "../core/errors.js";
10
+ import { withRealAncestor } from "./canonical-path.js";
11
+ import { assertStatePath, makeStateDirectoryBelow, PRIVATE_STATE_MODE, prepareStateDirectory, } from "./directories.js";
12
+ import { CreatedStateDirectories, } from "./preparation/created-directories.js";
13
+ import { stateCleanupFailure } from "./setup-failure.js";
14
+ /**
15
+ * Makes the state root `root` with `mode` for a session in `cwd`, the root itself through
16
+ * `make`, which by default also checks it and gives it `mode`.
17
+ */
18
+ export function makeStateRoot(root, mode, cwd, make = prepareStateDirectory, onDirectoryCreated) {
19
+ // The root first: while `cwd` exists, its real path, spelled as on disk, leads the root's too,
20
+ // so the two compare exactly however the caller spelled them.
21
+ const target = withRealAncestor(root, realpathSync.native);
22
+ // A missing `cwd` fails here with ENOENT, before anything is made, wherever the root is.
23
+ const project = realpathSync.native(cwd);
24
+ const names = namesBelow(project, target);
25
+ if (names === undefined) {
26
+ make(root, mode, "with-parents", onDirectoryCreated);
27
+ return;
28
+ }
29
+ // Each directory is made inside its parent, so a `cwd` removed meanwhile fails the next one
30
+ // with ENOENT instead of coming back. Their path is checked for symlinks once, then each one
31
+ // only itself: checking every ancestor again at each level made a deep root quadratic.
32
+ let current = project;
33
+ const parents = names.slice(0, -1);
34
+ assertStatePath(join(project, ...parents));
35
+ for (const name of parents) {
36
+ current = join(current, name);
37
+ makeStateDirectoryBelow(current, PRIVATE_STATE_MODE, onDirectoryCreated);
38
+ }
39
+ make(root, mode, names.length === 0 ? "must-exist" : "inside-parent", onDirectoryCreated);
40
+ }
41
+ /** The names leading from `project` down to `path`, or `undefined` when it is not under it. */
42
+ function namesBelow(project, path) {
43
+ const below = relative(project, path);
44
+ if (below === "")
45
+ return [];
46
+ if (below === ".." || below.startsWith(`..${sep}`) || isAbsolute(below))
47
+ return undefined;
48
+ return below.split(sep);
49
+ }
50
+ /**
51
+ * How many times `makeTree` runs while `cwd` stays: another start's undo can remove a directory
52
+ * this one found already made, so making the next one inside it fails with ENOENT.
53
+ */
54
+ const maxStateTreeAttempts = 3;
55
+ /**
56
+ * Runs `makeTree`, recording its successful directory creations for a session in `cwd`,
57
+ * then requires `cwd` to exist still. A `cwd` removed meanwhile fails with ENOENT, and the
58
+ * rollback removes only still-matching, owned, empty directories, deepest first (C-STATE-14).
59
+ * Replaced or unverifiable entries are preserved. Nonempty directories, including those
60
+ * another start has populated, stay in place; entries already gone need no cleanup.
61
+ * Explicitly retained shared directories can already support another setup.
62
+ */
63
+ export function makeStateTree(cwd, makeTree, retainedDirectories = new Set()) {
64
+ const made = new CreatedStateDirectories();
65
+ try {
66
+ for (let attempt = 1;; attempt += 1) {
67
+ try {
68
+ makeTree(made.record);
69
+ break;
70
+ }
71
+ catch (error) {
72
+ const retry = errnoCode(error) === "ENOENT" && existsSync(cwd);
73
+ if (!retry || attempt === maxStateTreeAttempts)
74
+ throw error;
75
+ }
76
+ }
77
+ realpathSync.native(cwd);
78
+ }
79
+ catch (error) {
80
+ const cleanupErrorCode = made.remove(retainedDirectories);
81
+ throw stateCleanupFailure(error, cleanupErrorCode);
82
+ }
83
+ }
84
+ //# sourceMappingURL=root.js.map