@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
@@ -75,24 +75,39 @@ an inherited `SHELL` environment override from the parent process.
75
75
 
76
76
  These probes MUST run asynchronously and MUST NOT block the host process's
77
77
  event loop: a parent that spawns a roster of sessions must not serialize their
78
- preflights on a single thread. Elwood reads each adapter's `--version` at most
79
- once per parent process — concurrent first reads share a single subprocess, and
80
- later reads reuse the cached result — mirroring the once-per-process autoupdate
81
- dedupe (C-LIFE-09). The cached version and adapter-capability reads are invalidated
82
- after every coordinated update attempt, including a failed or peer-owned attempt,
83
- because a failed installer may still have partially changed the binary. When
84
- `autoupdate` is set, concurrent callers share one update and all validate the same
85
- post-attempt version, so no caller proceeds on a stale pre-update version or races
86
- a second update. This mutual exclusion also applies across separate Elwood parent
78
+ preflights on a single thread. Version, Codex capability, update and verification
79
+ probes start in the validated launch directory. Version and capability answers are
80
+ cached per adapter, directory path and observed device/inode (C-PERF-02). Concurrent
81
+ reads for one key share a subprocess. Each cache keeps the 32 most recently used
82
+ successful settled answers; in-flight reads are shared without counting toward
83
+ that bound. Version results are retained only when both stdout and stderr contain
84
+ at most 65,536 UTF-16 code units; larger results are returned unchanged but not
85
+ retained. Capability caching retains only the derived boolean, not the help text.
86
+ A result is retained only if directory identities observed before and after its
87
+ read match. These bounded snapshots can miss a replacement restored between checks;
88
+ they do not track executable changes or PATH changes within the same directory.
89
+ The cached version and adapter-capability reads are invalidated after every
90
+ coordinated update attempt, including a failed or peer-owned attempt, because a
91
+ failed installer may still have partially changed the binary. Update coordination
92
+ remains once per parent process and adapter across workspaces (C-LIFE-09): its
93
+ owner verifies and updates from that caller's captured directory, and each caller
94
+ validates its own workspace's post-attempt version without racing a second update. This mutual exclusion also applies across separate Elwood parent
87
95
  processes for the same macOS user and adapter: an atomic lease names the adapter in
88
96
  a stable per-account cache independent of `TMPDIR`; contenders wait without
89
97
  blocking the event loop, then invalidate their local caches and continue without
90
- running a duplicate update. Contender waiting is bounded to 60 seconds; an owner
91
- that has not finished by then causes the contender to skip its update and warn,
92
- without deleting the owner's lease. This warning uses `errorCode: "update_active"`
98
+ running a duplicate update. Contender waiting is bounded to 165 seconds: the owner
99
+ runs two probes under the lease, a `--version` read confirming the CLI exists and then
100
+ the update, each allowed 75 seconds by its launch and command bounds (§9.2), and the
101
+ rest covers their abort cleanup. An owner that has not finished by then causes the
102
+ contender to skip its update and warn, without deleting the owner's lease. This warning uses `errorCode: "update_active"`
93
103
  and a canonical message explaining that the update was skipped because another
94
104
  updater is still active; no local update command ran, so it carries no exit status
95
- or stderr. The lease records the owner's process id and a unique
105
+ or stderr. Completion publication atomically replaces the marker's token file. A contender
106
+ pins its baseline file before observing the owner, then compares the pinned token
107
+ with the current pathname after acquisition; recovered owner generations remain
108
+ completion evidence. Concurrent older Elwood writers that modify a marker inode
109
+ in place retain the earlier snapshot race; its token payload remains compatible.
110
+ The lease records the owner's process id and a unique
96
111
  generation. Cleanup removes only the generation it owns, a live owner is never
97
112
  evicted solely because the stale bound elapsed, and recovery of a dead owner's
98
113
  lease is itself serialized before removal, so neither cleanup nor concurrent stale
@@ -140,9 +155,48 @@ rejected result: a later caller re-attempts rather than inheriting the prior
140
155
  failure.
141
156
 
142
157
  Each probe is bounded so a broken or hostile CLI on PATH cannot hang or flood
143
- the host: a probe that does not exit within a default timeout (15 seconds) or
144
- whose captured output exceeds a per-stream byte cap (1,000,000 bytes) is
145
- killed, and its captured output is truncated to the cap. Abort cleanup has an
158
+ the host. A probe runs through the user's interactive login shell (§4.2), and
159
+ loading that shell's startup files is the user's profile, not the CLI: under
160
+ concurrent launches on a loaded machine the profile alone can outlast the CLI's
161
+ bound while the CLI itself answers in milliseconds. The two phases are therefore
162
+ bounded separately. After the startup files load, and before the probe
163
+ command runs, the probe shell writes a start line of Elwood's own, ending in a random
164
+ token chosen once per parent process so that no startup file's output can pass for it,
165
+ on a private channel that is neither stdout nor stderr, so a startup file that
166
+ redirects either cannot hide the line. A shell that closed that channel at startup (macOS's bash 3.2,
167
+ started as an interactive login shell, closes every inherited descriptor above
168
+ stderr) writes the line on stdout instead. Not stderr, which a startup file may
169
+ discard or merge into stdout: a startup file that hid stdout would also hide the
170
+ command's own output. Elwood removes the line from captured stdout, so on either
171
+ channel the probe's captured output is exactly the shell's and the command's.
172
+ The private channel stays open past the start line, for the e2e home guard's stop
173
+ line (§12), and closes before the command, which never inherits it.
174
+ After the start line and before the command, the probe script removes the user's
175
+ not-found handlers, zsh's `command_not_found_handler` and bash's
176
+ `command_not_found_handle`, under the command's bound, which starts at the line. A
177
+ Version probes explicitly check command lookup after removing those handlers. A
178
+ failed lookup emits a private random marker over the existing control channel
179
+ (or stdout fallback) and exits 127. Only that conclusive lookup signal or native
180
+ `ENOENT` reports a CLI as not found; numeric status 127 alone is insufficient. A
181
+ resolved CLI exiting 127 reports `*_start_failed` with its stderr and exit status.
182
+ Lookup markers are removed from captured output, and no handler output is captured.
183
+ The shell has 60 seconds from spawn to write that line (the launch bound),
184
+ and the probe command then has a default timeout of 15 seconds from that line until
185
+ it exits. A probe that
186
+ exceeds either bound, or whose captured output exceeds a per-stream byte cap
187
+ (1,000,000 bytes), is killed, and its captured output is truncated to the cap.
188
+ Either timeout reports `ETIMEDOUT`. Once the probe command has started, a probe whose
189
+ process dies of a signal Elwood did not send reports the status a shell would, 128 plus
190
+ the signal's number; a login shell that dies before then is a login-shell failure, as
191
+ follows. A login shell that misses the launch bound, or
192
+ exits without writing the start line (a startup file that `exec`s another program,
193
+ say), never ran the probe command, so the probe fails as a login-shell failure
194
+ rather than reporting the shell's exit status as the command's: its cause names the
195
+ login shell, and its typed error details carry `phase: "login_shell"`. Its captured
196
+ stderr is only the user's startup output, which can hold expanded secrets, so it is
197
+ withheld: `details.stderr` is empty. A best-effort update probe that fails this way
198
+ surfaces the `agent_update_failed` warning with `errorCode: "login_shell_failed"` and
199
+ an empty `raw`. Abort cleanup has an
146
200
  additional one-second bound: an aborted probe retries process-group termination,
147
201
  falls back to terminating the direct child once group signals have kept failing,
148
202
  and awaits exit within that window. A process-group id is signaled only while the
@@ -169,14 +223,21 @@ non-PTY probe — `--version`, `--help` capability detection, and
169
223
  otherwise) surfaces through that probe's existing public error name —
170
224
  `claude_start_failed` / `codex_start_failed` — with the underlying reason
171
225
  preserved in the error `details` as `cause` (and `errno`, e.g. `ETIMEDOUT` on
172
- timeout or `E2BIG` on overflow) alongside any `stderr`. An UPDATE failure
226
+ timeout or `E2BIG` on overflow) alongside any `stderr`, and the status the probe
227
+ reported, if any, as `exitStatus`. An UPDATE failure
173
228
  (`claude update` / `codex update`), being best-effort maintenance, does NOT
174
229
  surface as a start-blocking error; it is contained and surfaces as the live
175
- `agent_update_failed` warning carrying the same bounded diagnostics (exit status,
230
+ `agent_update_failed` warning carrying the same bounded diagnostics (`exitStatus`,
176
231
  `errno`, `stderr`), while startup continues through the compatibility gate. A
177
232
  killed probe is signaled only because Elwood aborted it; a probe that exits or
178
233
  fails to spawn on its own is not signaled.
179
234
 
235
+ At most 8 non-PTY probes run at once in a parent process, because each starts an
236
+ interactive login shell and a heavy profile slows every shell that runs beside it.
237
+ Further probes wait their turn in arrival order. A waiting probe has not started:
238
+ its launch bound begins when it runs, and a probe that fails frees its turn like
239
+ one that succeeds.
240
+
180
241
  After spawning the PTY, Elwood waits briefly for immediate process exits or
181
242
  known authentication/startup failure banners before reporting the session as
182
243
  running. The default wait must be long enough to catch typical local CLI startup
@@ -194,16 +255,32 @@ flush of any transcript diagnostics buffered before the session sink existed
194
255
  (emitted as live warnings), PTY-exit registration, the readiness/authentication
195
256
  assertion, and the startup-usable evidence. If ANY of them fails, Elwood tears
196
257
  down the now-live PTY, hook bridge, terminal, and transcript watcher before
197
- rejecting, so a failed `startClaude`/`startCodex` never leaks a live process, IPC
198
- endpoint, or file watcher. (The one-shot version/preflight warning is NOT part of
199
- this boundary — it is scheduled for delivery AFTER start resolves, per C-API-14.) Tearing down the PTY routes through the SAME one-shot
200
- process-group reap the normal exit path uses (§9.4, C-LIFE-10): the PTY is
201
- signaled, its exit is awaited within a bounded window, and the leader's process
202
- group is SIGKILLed on every path — even if the PTY signal throws — so a
203
- CLI-spawned descendant such as a hook-bridge grandchild (which POSIX reparents to
204
- PID 1 the instant the leader exits) cannot survive or reparent past a failed
205
- startup. The original startup error is preserved; a cleanup or reap failure is
206
- secondary and never replaces it.
258
+ rejecting. This teardown is best-effort: it stops the hook bridge and the transcript
259
+ watcher and disposes the terminal on every path, but a CLI process it could not confirm
260
+ reaped may remain (see below). (The one-shot version/preflight warning is NOT part of
261
+ this boundary — it is scheduled for delivery AFTER start resolves, per C-API-14.)
262
+ The session ends the PTY with the same one-shot process-group reaper its exit path
263
+ uses (§9.4, C-LIFE-10), so any successful group SIGKILL occurs at most once across paths.
264
+ If the session has already seen the PTY exit (for example, the CLI exited during
265
+ startup), the PTY is not signaled again: the leader's pid may already belong to an
266
+ unrelated process, so only that shared reaper runs. That reaper does nothing if the
267
+ exit's reap succeeded and retries it if it failed. Otherwise the PTY is signaled, its
268
+ exit is awaited within a bounded window, and the leader's process-group reap is attempted
269
+ on every path, even if the PTY signal throws. If the detached sweep confirms the entire
270
+ group gone, the final group SIGKILL is skipped, avoiding a signal to a possibly reused
271
+ numeric id; an earlier unresolved descendant-sweep failure still rejects. An eligible
272
+ group kill stops a CLI-spawned
273
+ descendant such as a hook-bridge grandchild, which POSIX reparents to PID 1 the instant
274
+ the leader exits. A leader that ignores the SIGTERM has its detached descendants
275
+ reaped before the escalating SIGKILL, as §5.3 specifies. The original startup error is
276
+ preserved; a cleanup or reap failure is secondary and never replaces it. When that PTY termination or group reap cannot be
277
+ confirmed, part of the CLI's process tree may still be running, and a typed startup
278
+ error keeps its code and message and gains two details. `cleanupErrorCode` is
279
+ content-free: the failed group reap's errno if there is one, else the termination's,
280
+ when that errno is on the reap allowlist; otherwise `UnknownError`.
281
+ `cleanupProcessGroupId` is the leader's group id, for diagnosis only: it may already
282
+ have been reissued to an unrelated group, so it must never be signaled. A startup error
283
+ that is not one of Elwood's typed errors is rethrown unchanged.
207
284
 
208
285
  ### 9.3 Resume
209
286
 
@@ -241,9 +318,12 @@ intentionally not persisted yet.
241
318
  For either adapter, resume validates the loop sidecar before starting the agent,
242
319
  silently removes definitions whose seven-day wall-clock expiry passed during
243
320
  downtime, and restores surviving definitions with the same IDs and persisted
244
- jitter. It restores no timer or due state: every surviving cadence starts fresh
245
- from the resumed session's first readiness, using that launch's current
246
- permissions and blocking-dialog posture, and no missed run is replayed.
321
+ jitter. That removal, and any at activation (§8.1), is part of the launch's startup
322
+ publication, so a resume that then fails restores the sidecar it found unless the
323
+ earlier launch has written it since. It restores no timer or due state: every
324
+ surviving cadence starts fresh from the resumed session's first readiness, using
325
+ that launch's current permissions and blocking-dialog posture, and no missed run is
326
+ replayed.
247
327
 
248
328
  ### 9.4 Exit
249
329
 
@@ -265,7 +345,12 @@ not delay the native process-exit notification, terminal status, or unconditiona
265
345
  process-group reap; the final `terminal:data` tail may therefore arrive after
266
346
  `terminal:exit`. A stalled renderer, or a PTY that never goes quiet, is disposed
267
347
  when the budget expires. Explicit direct `terminal.dispose()` does not wait for
268
- pending output.
348
+ pending output. Runtime cleanup also stops the hook bridge and finishes the
349
+ transcript watcher: one bounded final flush of what the transcript already holds,
350
+ then no more polling. So a PTY that outlives a failed shutdown produces no later
351
+ transcript activity, and its hook commands reach no handler: the stopped bridge
352
+ accepts no new request. A host hook handler already running when cleanup starts may
353
+ still finish and report its result.
269
354
 
270
355
  Reaping the leader's process group is unconditional on every exit path
271
356
  (C-LIFE-10). On an unsolicited PTY exit the terminal status is submitted first,
@@ -276,7 +361,11 @@ a live `reap_failed` warning rather than aborting the exit callback. An explicit
276
361
  survivor reap (it does not re-signal the dead PTY — node-pty does not replay the
277
362
  exit event, and the pid may already be recycled) and rejects with a typed
278
363
  `termination_failed` error if that reap fails, leaving the reap retryable by a
279
- later `teardown()`.
364
+ later `teardown()`. Every `stop()`/`kill()` attempt runs runtime cleanup after its
365
+ termination or survivor reap, even when that failed: the PTY could not be signaled,
366
+ did not exit, or its group could not be reaped. The call still rejects with that
367
+ failure, and a cleanup failure alongside it is kept as its message in
368
+ `details.cleanupError`.
280
369
 
281
370
  Overlapping `stop()`, `kill()`, and `teardown()` calls on one session are
282
371
  serialized so the PTY is signaled at most once. The first caller owns the in-flight
@@ -294,5 +383,7 @@ and (for teardown) remove files. A settled shutdown failure is not permanently
294
383
  sticky: because signal ownership is separate from the in-flight promise, a later
295
384
  `stop()`/`kill()`/`teardown()` after a failed one runs a fresh attempt that RETRIES
296
385
  the reap, runtime cleanup, and file removal — without re-signaling the PTY — rather
297
- than returning the earlier rejection forever (C-LIFE-10 retry posture). Each caller
298
- still observes its own operation's success or typed failure.
386
+ than returning the earlier rejection forever (C-LIFE-10 retry posture). The one
387
+ exception is a detached-descendant walk that could not complete (§5.3): with the
388
+ leader gone it cannot be retried, so every later call keeps rejecting for it. Each
389
+ caller still observes its own operation's success or typed failure.
package/prd/10-errors.md CHANGED
@@ -9,14 +9,14 @@ Initial required error names:
9
9
  |---|---|
10
10
  | `unsupported_platform` | The current OS is not supported by the implementation. |
11
11
  | `claude_not_found` | `claude` could not be resolved or spawned. |
12
- | `claude_start_failed` | Claude started but exited or failed before the session was usable. |
12
+ | `claude_start_failed` | Claude started but exited or failed before the session was usable, or the session's `cwd` is not an existing directory (C-API-61). |
13
13
  | `claude_update_failed` | `claude update` failed. Best-effort: contained by the autoupdate preflight and surfaced as the `agent_update_failed` warning (never thrown out of `startClaude` when the installed CLI meets the minimum). |
14
14
  | `claude_not_authenticated` | Startup output or status indicates Claude is not authenticated. |
15
15
  | `claude_version_unsupported` | Installed Claude version lacks required features. |
16
16
  | `claude_invalid_reasoning_effort` | `reasoningEffort` was not one of the valid `ClaudeReasoningEffort` values; rejected before spawn. |
17
17
  | `claude_high_trust_conflict` | `highTrust: true` was combined with an explicit `permissionMode`; rejected before spawn. |
18
18
  | `codex_not_found` | `codex` could not be resolved or spawned. |
19
- | `codex_start_failed` | Codex started but exited or failed before the session was usable. |
19
+ | `codex_start_failed` | Codex started but exited or failed before the session was usable, or the session's `cwd` is not an existing directory (C-API-61). |
20
20
  | `codex_update_failed` | `codex update` failed. Best-effort: contained by the autoupdate preflight and surfaced as the `agent_update_failed` warning (never thrown out of `startCodex` when the installed CLI meets the minimum). |
21
21
  | `codex_not_authenticated` | Startup output or status indicates Codex is not authenticated. |
22
22
  | `codex_version_unsupported` | Installed Codex version lacks required features. |
@@ -30,8 +30,8 @@ Initial required error names:
30
30
  | `hook_bridge_failed` | The hook bridge or IPC endpoint could not be initialized. |
31
31
  | `input_queue_full` | A live session control queue would exceed 1,024 outstanding operations or 8 MiB aggregate UTF-8 input text; no input or attachment is performed for the rejected operation. |
32
32
  | `session_not_running` | Operation requires a running process but the session is stopped. |
33
- | `termination_failed` | A stop/kill request did not observe process exit after escalation, or the PTY exited but its process group could not be confirmed reaped. |
34
- | `teardown_failed` | Elwood could not remove all owned session files. |
33
+ | `termination_failed` | A stop/kill request could not signal the PTY, did not observe process exit after escalation, or the PTY exited but its process group or its detached descendants could not be confirmed reaped. A PTY signaling failure keeps the underlying message as `cause` and any `errno`/`syscall`/`path` in `details`. When the PTY was not confirmed terminated and its group reap failed too, `details.reapError` keeps the reap's message and `details.reapErrno` its errno when it has one. A failed reap retry, in a `stop()`/`kill()` of an already-signaled or exited session or in `teardown()`, keeps the leader's process-group id as `details.processGroupId`. A retained detached-sweep failure after the leader group is confirmed gone is still reported as a detached-sweep failure. When the detached-descendant walk could not complete, its reason is the `cause` (or `details.sweepError` alongside another termination failure), and `details.unconfirmedProcessGroupIds` lists up to 16 ids of the process groups it could not confirm reaped, the leader's own included when its group was not confirmed stopped; like `processGroupId`, they are diagnostic only and may already belong to another group. Runtime cleanup runs after a failed termination too: a cleanup failure on its own is `termination_failed` with its message as `cause`, and one alongside another termination failure is kept as its message in `details.cleanupError`. When `close()` (§5.8) fails both its stop and its kill, it keeps each one's cleanup message too, as `details.cleanupError` and `details.killCleanupError`. |
34
+ | `teardown_failed` | A `teardown()` step failed: the PTY could not be terminated or its process tree, including detached descendants, confirmed reaped, runtime cleanup failed, or Elwood could not remove all owned session files. Every step still runs. `details.causes` lists each failed step's message, and `details.failures` lists each failed step as `{ message }`, adding `code` and `details` when the step failed with a typed Elwood error, so a `termination_failed`'s errno, its reap's, its `processGroupId`, and its `unconfirmedProcessGroupIds` survive teardown. |
35
35
  | `compact_failed` | A requested conversation compaction did not report completion in time. |
36
36
  | `interrupt_failed` | A requested turn interrupt did not return the session to ready in time. |
37
37
  | `model_automation_failed` | The adapter's model picker could not be recognized or driven to completion. |
@@ -40,12 +40,19 @@ Initial required error names:
40
40
  | `invalid_image` | An `images` input is not attachable: an unsupported/absent byte format, empty bytes, a path that is not a readable file, or a total image count/size beyond the documented limits (C-API-44). Raised before any partial input reaches the composer. |
41
41
  | `image_attach_failed` | An image could not be confirmed attached: the CLI's `[Image #N]` chip did not appear before the confirmation timeout, the OS clipboard could not be read/written, or terminal rendering permanently failed. No text is submitted afterward. (A session that TERMINATES mid-attach rejects with `session_not_running`, like any queued op.) (C-API-44/45/46) |
42
42
  | `wait_timeout` | A `waitForStatus`/`waitForActivity` call did not observe its condition before the timeout, the PTY rejected a staged-draft cleanup write before successor input, or raw input replaced an initial/replay ergonomic submission awaiting empty-input confirmation (§5.3). The same code rejects queue-backed input admitted from an expired Stop callback/observer context (§6.3), before terminal-state checks even after teardown. Cleanup failures retain the pending draft and use a bounded message without raw PTY diagnostics. |
43
+ | `turn_failed` | The agent itself rejected an ergonomic `send`/`stream` turn and reported it through its own failure evidence: a Claude `StopFailure` hook that rejects the turn's own submission (§5.8, §6.1), or a Codex transcript `task_complete` whose `error` names the turn's own `turn_id` (§5.8), such as an unknown model or an API error. The message is the bounded rejection diagnostic of §6.1, or Codex's bounded `error.message`; `details.agentError`, when present, is Claude's `error` name (e.g. `model_not_found`) or Codex's `codex_error_info` kind (e.g. `other`) and is diagnostic only. An empty or absent reply is never this error (§5.8). |
43
44
  | `invalid_loop` | A loop request or recognized `/loop` command violates the documented shape, interval, or UTF-8 message bounds. |
44
45
  | `loop_limit_reached` | Creating a loop would exceed 50 unexpired definitions; existing loops are unchanged. |
45
46
  | `loop_not_found` | Cancellation targeted an unknown or already-finished loop ID. |
46
47
  | `loop_persistence_failed` | A loop-sidecar write required by creation, cancellation, kill, expiry, or teardown did not complete safely. |
47
48
  | `loop_submission_failed` | Live loop scheduling or readiness-safe prompt submission failed; details identify only the loop ID. |
48
49
 
50
+ A confirmed command lookup failure reports `*_not_found` with `exitStatus: 127`,
51
+ the fixed cause ``The login shell found no `<command>` (status 127).``, and no
52
+ `stderr` field. Native `ENOENT` retains its native cause and diagnostic fields. A
53
+ resolved CLI returning 127 is `*_start_failed`, preserving its stderr and status;
54
+ a numeric exit status alone is never proof of failed command lookup.
55
+
49
56
  Hook handler failures are normally surfaced as `hookError` events, not thrown
50
57
  from the hook bridge path.
51
58
 
package/prd/12-e2e.md CHANGED
@@ -17,6 +17,87 @@ CLIs, it is intentionally separate from `npm run check`. E2E coverage should be
17
17
  reported separately and made as high as practical; unit/conformance tests remain
18
18
  responsible for hard-to-force error paths and 100% default coverage.
19
19
 
20
+ Neither gate may write the developer's own Codex home or read its state; the e2e
21
+ suite only copies its `auth.json`. By default, every `test:e2e` process runs with
22
+ `CODEX_HOME` pointed at a private directory seeded with only a 0600 copy of that file,
23
+ removed when the process exits. A single e2e file run on its own gets the same default.
24
+ A test that needs its own Codex config uses another private home, seeded the same way,
25
+ for its duration. Whichever private home is active receives the project trust entries,
26
+ model selections, sessions, and logs Codex persists while the suite drives it, so none
27
+ of them reach the developer's config. The default gate runs each test file with `HOME`
28
+ and `CODEX_HOME` pointed at a private directory. Both gates refuse to create these
29
+ homes when the temp directory is inside the developer's Codex home.
30
+
31
+ The e2e suite may not write the developer's own Claude config either. By default,
32
+ every `test:e2e` process, and a single e2e file run on its own, runs Claude with
33
+ `CLAUDE_CONFIG_DIR` pointed at a private directory, removed when the process exits.
34
+ It is seeded with three copies: a 0600 `.credentials.json` holding the developer's
35
+ Claude login without its refresh token, so the copy can never rotate and so
36
+ invalidate the developer's own login. The login is read from where the developer's
37
+ own Claude reads it. On macOS that is the keychain item Claude names for the developer's
38
+ `CLAUDE_SECURESTORAGE_CONFIG_DIR` when it is set, else for their `CLAUDE_CONFIG_DIR`,
39
+ set or not, and their `.credentials.json` only when there is no such item. On other
40
+ platforms it is the `.credentials.json`. The suite removes
41
+ `CLAUDE_SECURESTORAGE_CONFIG_DIR` from its own environment, so the Claude it runs
42
+ reads the private copy, never the developer's item. The second copy is the developer's
43
+ global config without its per-project entries, MCP servers, or bypass-permissions
44
+ acceptance, and the third is Claude's cached model catalog. The global-config
45
+ entry Claude writes for each scratch project, its transcripts, and its history land
46
+ there, never in the developer's `~/.claude.json` or `~/.claude/`, which are only read.
47
+ The private directory holds none of the developer's settings, so the suite runs Claude
48
+ with Claude's defaults rather than the developer's permission mode, hooks, or plugins.
49
+ The suite refuses to create it when the temp directory is inside the developer's Claude
50
+ config dir.
51
+ Each such process also points `CLAUDE_CODE_TMPDIR`, Claude's temp root, at a second
52
+ private directory, removed when the process exits. Claude otherwise keeps its temp files
53
+ under the shared `/tmp`: a directory per working directory, holding each session's
54
+ scratchpad, which outlives the session, and its messaging socket. So no scratch project
55
+ leaves a directory there. The suite keeps that variable when it drops the other
56
+ `CLAUDE_CODE_` variables a parent Claude session set.
57
+ A test that needs its own Claude config dir copies the login the same way, without the
58
+ refresh token.
59
+
60
+ Both CLIs start through the developer's login shell, whose startup files run after
61
+ Elwood hands over its environment and could replace, unset, or unexport `CODEX_HOME`,
62
+ `CLAUDE_CONFIG_DIR`, or `CLAUDE_CODE_TMPDIR`. So the suite registers each private CLI home
63
+ and Claude temp root it creates in
64
+ `ELWOOD_E2E_PRIVATE_HOMES`, a JSON array of absolute paths holding each home's given and
65
+ real path, which the Elwood processes it starts inherit. Each e2e process discards the
66
+ list it inherited and registers only the homes it creates, so an inherited entry, such as
67
+ the developer's own home, is never accepted. Each of these variables that
68
+ Elwood's own environment sets to a registered home is guarded. Every login shell Elwood
69
+ starts, for a session or a probe, checks after its startup files that each guarded
70
+ variable is still exported and that the real path of the directory it names, relative
71
+ names resolved against the shell's working directory, is a registered home. If one is
72
+ not, the shell writes a stop line with why and exits 97 before running its command, so
73
+ no CLI starts against another home, the developer's own included. A value that is not
74
+ such an array stops every launch the same way. Unset or empty, as outside the suite, the
75
+ variable changes nothing.
76
+
77
+ The stop line starts with a token Elwood draws once per process, so neither a startup
78
+ file nor a command can print it. It is never written to stderr, which a startup file can
79
+ redirect. A session's shell writes it to its terminal, which the session's PTY captures
80
+ however the startup files redirected the shell's input and output, and falls back to
81
+ stdout only when it cannot open the terminal. A probe's shell runs in a session of its
82
+ own, with no terminal, so it writes the line where it wrote its start line (§9.2): on the
83
+ probe's private channel, which a startup file's redirection of stdout cannot hide, or, from
84
+ a shell that closed that channel at startup, on stdout. In that shell, a startup file that
85
+ hid stdout hid the start line too, so the probe is the login shell's own failure.
86
+ Elwood counts a launch as stopped by the guard only when its shell exited 97 and wrote
87
+ that line. A command that itself exits 97 is the command's own failure. A session's
88
+ startup check (§9.1) finds the line however much startup output came before it. Since a
89
+ PTY's last output can arrive after its exit (§9.4), once the check sees a status-97 exit
90
+ of a launch the guard checks, it waits up to one second more for the line; a launch the
91
+ guard does not check fails at once.
92
+
93
+ A probe runs the check after its start line (§9.2). A probe the guard stops after that
94
+ line is a login-shell failure (C-PERF-05) whose only diagnostic is the guard's fixed
95
+ reason: like any login-shell failure, its stderr is withheld. A login shell that exits
96
+ before the start line is still the login shell's own failure. A session whose login
97
+ shell the guard stops during startup (§9.1) fails with the adapter's `*_start_failed`,
98
+ whose message names the guard instead of repeating the shell's output. A session stopped
99
+ later exits with status 97, its terminal showing the stop line and the guard's reason.
100
+
20
101
  The repository should also provide `npm run check:all`, an opt-in convenience
21
102
  gate that runs the default `npm run check` gate and then `npm run test:e2e`.
22
103
  `check:all` does not change the composition of `npm run check`; the default gate
package/prd/12a-cli.md CHANGED
@@ -28,7 +28,13 @@ A new session defaults to the invocation directory; `-C`/`--cwd` overrides it.
28
28
  When no flag, environment variable, or configuration key selects an agent, a
29
29
  new session auto-detects one: Elwood tries `claude` first, then `codex`, and
30
30
  uses the first whose command resolves in the user's login shell — the same
31
- resolution the agent launch itself uses (§4.2) — without running either agent.
31
+ resolution the agent launch itself uses (§4.2), from the effective workspace — without
32
+ running either agent.
33
+ Before this unselected new-session auto-detection, including `config effective`,
34
+ Elwood MUST validate the effective workspace under §12A.5, whether it comes from
35
+ `--cwd` or the invocation directory. A workspace usage error takes precedence over
36
+ `no_agent_found` or a probe failure. Explicit-agent and resume validation order is
37
+ unchanged; resume never probes.
32
38
  Both probes run concurrently; the order only decides the winner. The resolved
33
39
  agent reports the source `auto-detected`. When neither command resolves, the
34
40
  invocation fails before any launch with the stable code `no_agent_found` and
@@ -106,12 +112,27 @@ setup turn and discards that turn's response before observing the user turn. It
106
112
  is a real agent turn: tools and other side effects performed during persona setup
107
113
  remain even though its assistant response is omitted from CLI output. Explicit
108
114
  persona plus resume is a usage error. An agent process exit before
109
- CLI-requested cleanup is `agent_exited`, including a zero-status exit. Response
110
- data already collected remains available on later failure.
115
+ CLI-requested cleanup is `agent_exited`, including a zero-status exit. A Claude or Codex
116
+ turn the agent rejects (§5.8), including the persona setup turn, is `turn_failed`
117
+ rather than a successful result. Response data already collected remains
118
+ available on later failure.
111
119
 
112
120
  Cleanup runs exactly once. A cleanup failure never masks a primary usage,
113
121
  agent, timeout, or interruption outcome, and it changes an otherwise successful
114
- invocation to failure.
122
+ invocation to failure. Its diagnostic names only the typed Elwood failures behind
123
+ it. Each always appears as its error code, followed by its errno token and then
124
+ `reap` and its reap's errno token (§10 `termination_failed`) when those are valid
125
+ errno names, then `process groups` and the ids in its
126
+ `unconfirmedProcessGroupIds` (positive integers, at most 16) when it has any: for
127
+ example `Cleanup failed (termination_failed EPERM).`, `Cleanup failed
128
+ (termination_failed reap EPERM).`, or `Cleanup failed (termination_failed EAGAIN
129
+ process groups 4242 4243).` Those ids are for diagnosis only and may already
130
+ belong to other groups. For a failed teardown those are its failed
131
+ steps', in order (§10 `teardown_failed`). The diagnostic never carries their
132
+ messages or paths, and a failure with no typed cause reads `Cleanup failed.` In
133
+ text mode, a cleanup failure behind a different primary failure is its own stderr
134
+ line after the primary error's; a combined `models` listing (§12A.10) prefixes it
135
+ with the agent, as it does that agent's error.
115
136
 
116
137
  ### 12A.3 Output protocols
117
138
 
@@ -213,13 +234,18 @@ symlinks, non-regular files, wrong ownership, and non-private permissions.
213
234
  CLI-owned state defaults to `$XDG_STATE_HOME/elwood` when that base is absolute,
214
235
  otherwise `~/.local/state/elwood`. It never defaults to the invocation
215
236
  workspace. CLI state directories and records MUST be private, owner-matched,
216
- regular where applicable, symlink-safe, and atomically written. One session
237
+ regular where applicable, symlink-safe, and atomically written. A new session's
238
+ state root is made only while its workspace exists, and one at or under the
239
+ workspace only below it (§8.1, C-STATE-14). A workspace removed after it was
240
+ validated fails the launch with the adapter's `*_start_failed` (C-API-61)
241
+ instead of being recreated. One session
217
242
  identity supports at most one live owner; concurrent exact resumes may fail on
218
243
  the adapter's underlying startup conflict in v1.
219
244
 
220
- Exit status is 0 for success or consumer closure, 1 for agent or cleanup
221
- failure, 2 for usage or configuration failure, 124 for timeout, and 130 for
222
- interruption. A primary nonzero status survives cleanup failure. Text errors are
245
+ Exit status is 0 for success or consumer closure, 1 for agent failure
246
+ (including `agent_exited` and `turn_failed`) or cleanup failure, 2 for usage
247
+ or configuration failure, 124 for timeout, and 130 for interruption. A primary
248
+ nonzero status survives cleanup failure. Text errors are
223
249
  concise and go to stderr while structured protocols retain stable error codes.
224
250
  Unknown long options identify the token and suggest the nearest documented
225
251
  option when the match is unambiguous. Validation messages identify relevant
@@ -229,6 +255,29 @@ include sanitized event detail but never weakens §12A.3. Static arguments, envi
229
255
  compatibility MUST be validated before session creation whenever validation
230
256
  does not require a stored resume record.
231
257
 
258
+ The effective workspace, new or resumed, MUST be an absolute, existing directory
259
+ owned by the current user that no other user can replace before the agent
260
+ launches in it. An OS directory-search permission check MUST also confirm the
261
+ current user can enter it; refusal is a path-specific `invalid_arguments` usage
262
+ error. This is a bounded check, not an atomic launch guarantee.
263
+ Resolving its path as given, name by name and through every
264
+ symlink, every directory a name is looked up in MUST be owned by root or the
265
+ current user and MUST NOT be writable by group or others unless it is sticky,
266
+ and every directory and symlink passed MUST be owned by root or the current
267
+ user. A group-writable directory is accepted when its group is the user's
268
+ private group: the user's primary group, with the same number as the user, as
269
+ Debian, Ubuntu, and Fedora create it. Root's group 0 is a shared system group and
270
+ never counts as private, even for root. Anything else is a usage error that names
271
+ the directory or link and how to fix it. The replacement check reads owners and mode bits
272
+ only: an ACL that grants another user write access, or another member added to
273
+ the user's private group, is not detected, and where the platform reports no user
274
+ id neither the ownership nor this check applies. The path is launched and
275
+ stored as given. A link whose target is not UTF-8, or a path that follows more
276
+ than 40 links, fails as uninspectable, naming the link.
277
+ Workspaces under `/tmp` and the macOS temporary directories pass, those being
278
+ sticky or the user's own; `/tmp` itself, owned by root, fails the ownership
279
+ rule for every user but root.
280
+
232
281
  ### 12A.6 Same-terminal head mode
233
282
 
234
283
  `--head` is an opt-in, view-only terminal mirror for a run. It requires both a
@@ -402,7 +451,12 @@ Listing sessions resolves only state-directory and output settings. Adapter,
402
451
  model, permission, trust, and turn-lifecycle environment defaults are irrelevant
403
452
  and MUST NOT prevent listing. Config files still undergo strict schema decoding.
404
453
  Interactive foreground launches MUST resolve the executable in the same
405
- interactive login-shell environment used by auto-detection. If the shell exits
454
+ interactive login-shell environment and effective workspace used by auto-detection, through the same
455
+ bounded probe, so the user's startup files get the login shell's launch bound and
456
+ the lookup the command bound (§9.2, C-PERF-05). The frame carries the login
457
+ shell's own `$PATH`, printed by `/bin/sh`, which loads no startup file, so a
458
+ `printf` function or alias in the user's startup files cannot print another
459
+ PATH in its place. If the shell exits
406
460
  successfully without returning a complete PATH probe frame, the foreground
407
461
  launch MUST preserve the inherited PATH. A complete frame containing an empty
408
462
  PATH remains authoritative. C-CLI-24/25.