@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
@@ -131,14 +131,44 @@ session-owned coordinator gives each observed dialog generation its own
131
131
  reservation and bounded five-second deadline, beginning at first candidate
132
132
  observation. Partial first paints receive that interval without an immediate
133
133
  `blocked` transition. Numbered and cursor layouts share the same safety checks:
134
- before every number, arrow, Enter, and retry, the session must still be live and
135
- the same generation, native header, and exact affirmative choice must remain
136
- valid. Cursor selection movement and completion of native option rows do not
134
+ before every number, selection, confirmation, and retry, the session must still
135
+ be live and the same generation, native header, and exact affirmative choice must
136
+ remain valid. Cursor selection movement and completion of native option rows do not
137
137
  alone replace a generation. Clearing and reappearance do. An older completion
138
138
  cannot release or settle a newer generation's reservation.
139
139
 
140
- Numbered confirmations retry at bounded intervals when the native input loop
141
- has not consumed them; cursor navigation likewise waits for verified progress.
140
+ A numbered answer's first write types its number. A frame that still shows the
141
+ gate does not prove the CLI ignored that write: under load a CLI can take it and
142
+ paint its next screen after the retry interval, and the number typed again would
143
+ be submitted from its composer as a user message. Retries therefore never type
144
+ the number on that evidence alone. Codex's answer retries, at bounded intervals,
145
+ as Enter alone while the rendered caret is on the affirmative: on the gate Enter confirms that option, and
146
+ on Codex's empty composer it submits nothing. Otherwise (any Claude layout, or a
147
+ caret on another option) the number is typed again only after a frame rendered
148
+ from output received after the last write still shows the gate. Once Elwood has
149
+ started writing a gate's number, every later attempt at that gate retries the
150
+ same way, even when that write or a retry was rejected (a rejected write may
151
+ still have reached the CLI), until another complete dialog replaces the gate and
152
+ the CLI draws it afresh. A cursor layout never receives a relative arrow or a bare
153
+ Enter: Elwood selects the affirmative by its absolute row (Home, then one Down
154
+ per option above it), repeats that selection while the rendered cursor is
155
+ elsewhere, and sends Enter only in the same write as the selection, once the
156
+ rendered cursor is on the affirmative. A delayed, duplicated, or lost key, or a
157
+ CLI that resets its own selection after Elwood read the frame, therefore cannot
158
+ confirm another option.
159
+ Raw input through `sendKeys`, `terminal.sendInput`, or `xterm.input` while a
160
+ trust dialog generation is on screen hands that generation to the caller. Its
161
+ attempt is cancelled before the caller's keys are written, and Elwood writes
162
+ nothing more to it, even if it repaints or outlives its five-second deadline
163
+ (it then falls back to `blocked` as below). The frame Elwood reads can trail
164
+ the CLI, so a retry typed after the caller's keys could land in the composer
165
+ and submit them. A later dialog generation is answered as usual. The same raw
166
+ input ends a running Codex update-skip attempt before the caller's keys are
167
+ written, so none of its retries follow them. A Codex update prompt that is on
168
+ screen, or that left the screen without positive native composer clearance,
169
+ then belongs to the caller: Elwood writes no skip to it, even when its frame
170
+ loses and regains the prompt, until positive native composer clearance. An
171
+ update prompt appearing after that clearance is handled as usual.
142
172
  An unambiguous changed versioned Codex update banner, a bannered replacement with
143
173
  changed or removed safe-option bindings and a valid safe choice, or a fresh unambiguous
144
174
  banner with a valid current safe choice after update eligibility was revoked,
@@ -153,8 +183,16 @@ that a key was written or that the prompt was answered.
153
183
 
154
184
  With a live frame reader, `startup_prompt` is emitted only after a fulfilled
155
185
  confirmation and a verified native composer or distinct native successor gate.
156
- An unknown replacement is not successful clearance. Lost revalidation cancels
157
- that attempt quietly, retaining input ownership while clearance is unverified.
186
+ An unknown replacement is not successful clearance. Nor does a frame without the
187
+ gate end a fulfilled confirmation: once the confirming write fulfills, blank,
188
+ banner-only, or other dialog-free frames (the CLI erased the answered dialog and
189
+ is painting its next screen) neither settle nor cancel the attempt, which writes
190
+ nothing while the gate is absent. Later verified clearance reports it exactly
191
+ once; the same gate's return resumes answering within its remaining budget; a
192
+ changed gate, a complete off-allowlist gate (C-ATTN-03), expiry, and closing
193
+ cancel it without a report.
194
+ Lost revalidation before the confirmation fulfills cancels that attempt quietly,
195
+ retaining input ownership while clearance is unverified.
158
196
  Stop, kill, teardown, startup cleanup, and PTY exit cancel all trust attempts and
159
197
  timers before disposal; late completions emit neither success nor warnings.
160
198
  Only an actual rejected PTY write in a still-live matching attempt produces the
@@ -162,9 +200,19 @@ content-free `startup_prompt_write_failed` warning.
162
200
 
163
201
  If automation cannot safely clear the gate within five seconds, the live session
164
202
  MUST enter recoverable `blocked` status and emit the existing human `attention`
165
- activity, even without another terminal frame. Unsupported layouts and exhausted
166
- attempts use this same fallback; they never cause blind input or false write
167
- warnings. An unchanged redraw cannot restart an expired attempt indefinitely.
203
+ activity, even without another terminal frame. Those five seconds count only time
204
+ the gate is on the current rendered frame. A frame without it — the CLI erased an
205
+ answered dialog and is still painting its next screen — pauses the deadline, and
206
+ the same gate's return resumes the remainder rather than a fresh interval, so the
207
+ budget is five seconds of cumulative visible time. A gate that leaves the frame
208
+ before those five seconds are spent and stays absent until verified clearance
209
+ therefore never produces `blocked` or `attention`, however long the CLI then
210
+ takes to paint its composer: no prompt is left for a human to answer. A gate that
211
+ returns spends only what remains and falls back once its visible time reaches
212
+ five seconds. Its input hold is unchanged and lasts until verified clearance. Unsupported
213
+ layouts and exhausted attempts use this same fallback; they never cause blind
214
+ input or false write warnings. An unchanged redraw cannot restart an expired
215
+ attempt indefinitely.
168
216
  A newly valid layout or a new dialog generation re-arms bounded safe automation;
169
217
  once fallback has occurred, the public block remains until verified clearance.
170
218
  Raw `sendKeys` remains available for human recovery, while queued persona,
@@ -201,6 +249,18 @@ An exact-shaped native working row remains ambiguous even with a visible input
201
249
  cursor: Codex permits typing while running, and its title spinner is configurable.
202
250
  Such a row conservatively retains the hold, including an identical transcript quotation.
203
251
 
252
+ Claude's verified composer is the empty `❯` row between its two rules, plus native
253
+ chrome: the permission-mode footer as the very next row, or the `Claude Code v…`
254
+ version banner. The footer proves the composer in every permission mode the CLI
255
+ offers (manual, plan, accept edits, auto, don't ask, bypass permissions), with or
256
+ without vim's `-- INSERT --` prefix, the transient `← for agents` and `? for
257
+ shortcuts` hints, and the right-aligned token count or effort level. The banner
258
+ MUST NOT be required, because it scrolls out of the viewport in a long session.
259
+ Trust clearance, foreign model-picker release (C-API-55) and empty-input
260
+ observation (C-API-56) share this evidence. A footer quoted anywhere other than
261
+ directly under the composer's bottom rule is transcript, not chrome, and a footer
262
+ truncated on a narrow terminal does not prove the composer.
263
+
204
264
  An unrecognized gate behind a recognized native header prefix is hold-only
205
265
  under every `autotrust` value. The recognized prefixes are exactly the
206
266
  line-leading `Do you`, `Quick safety`, `Is this`, `Load this`, `Trust the`, `Trust this`,
@@ -224,6 +284,13 @@ NOT a general guarantee: a gate whose header starts with any other words, whose
224
284
  footer is not yet painted or not one of those rows, or that carries other rows
225
285
  below its options is outside this grammar and is not held.
226
286
 
287
+ Codex 0.164 draws two more footers when hook trust is not bypassed:
288
+ `enter continue · esc back` on its folder-access gate, whose decline then reads
289
+ `Back to Agent Command Center`, and `enter confirm · esc skip` on `Hooks need review`.
290
+ Neither is one of the rows above. Each ends a dialog only under the allowlisted gate
291
+ that draws it, with that gate's header, explanation, and options, so under any other
292
+ header or options, including conversation text, it makes no frame a trust gate.
293
+
227
294
  Two prompts are exceptions to the `autotrust` gate. Codex hook trust
228
295
  (`hook_trust`) is always enabled because the session requires its hook bridge.
229
296
  Codex's hook-trust bypass is session-wide: it trusts ALL configured hooks,
@@ -33,7 +33,9 @@ declare function startCodex(options: StartCodexOptions): Promise<CodexSessionApi
33
33
  ```
34
34
 
35
35
  Elwood sets the PTY working directory and also passes Codex `--cd <cwd>` so
36
- Codex's own session state and the shell's current directory agree.
36
+ Codex's own session state and the shell's current directory agree. `cwd` MUST
37
+ already be a directory, with the same `codex_start_failed` rejection, the same
38
+ check after preflight, and the same guarantees as `startClaude` (§5.1, C-API-61).
37
39
 
38
40
  `reasoningEffort`, when set, is forwarded as the Codex `-c
39
41
  model_reasoning_effort=<value>` config override so the session starts at the
@@ -26,7 +26,10 @@ Because the default state store is project-local, callers that resume from a
26
26
  different process working directory must pass the original `cwd` or the explicit
27
27
  `stateDir` used at start time. Calling `resumeCodex({ elwoodSessionId })`
28
28
  without `cwd` or `stateDir` uses the current process working directory to
29
- discover the project-local state store.
29
+ discover the project-local state store. Codex relaunches in the record's `cwd`
30
+ even when a `cwd` is given, since a given `cwd` only locates the state store.
31
+ The record's `cwd` must still be a directory, checked before and after
32
+ preflight as on start, and `details.cwd` names it (§5.1, C-API-61).
30
33
 
31
34
  `resumeCodex` must verify that the persisted Elwood session record belongs to
32
35
  the Codex adapter before launching. Passing a Claude session ID to `resumeCodex`
@@ -53,10 +53,14 @@ type ElwoodWarningEvent =
53
53
  // timeout/`errno`); never terminal transcripts, prompts, tokens, or secrets.
54
54
  // `errorCode: "update_active"` means no local update command ran: another
55
55
  // updater still held the adapter's lease after the bounded wait, or its
56
- // surviving process group still does (§9.2).
56
+ // surviving process group still does (§9.2). `errorCode: "login_shell_failed"`
57
+ // means the user's login shell failed before the update command ran (§9.2).
57
58
  readonly installedVersion: string;
58
59
  readonly errorCode: string;
59
60
  readonly raw: string;
61
+ // The update command's exit status, 128+n if a signal killed it; absent when
62
+ // it reported none (a timeout, an overflow, a login-shell failure, contention).
63
+ readonly exitStatus?: number;
60
64
  }
61
65
  | {
62
66
  readonly elwoodSessionId: string;
@@ -238,6 +242,32 @@ type ElwoodWarningEvent =
238
242
  readonly message: string;
239
243
  readonly raw: string;
240
244
  }
245
+ | {
246
+ // Codex-only: once the CLI exited, Elwood could not remove a copy Codex saved of
247
+ // an image pasted into it (§5.3), so the copy is left for the OS to reap. At most
248
+ // one per session, before `terminal:exit`. Content-free: the first failure's errno
249
+ // token (such as `EPERM`), else `UnknownError`; never a path or image data.
250
+ readonly elwoodSessionId: string;
251
+ readonly agent: "codex";
252
+ readonly source: "lifecycle";
253
+ readonly code: "image_copy_removal_failed";
254
+ readonly severity: "warning";
255
+ readonly message: string;
256
+ readonly errorCode: string;
257
+ readonly raw: string;
258
+ }
259
+ | {
260
+ // Codex-only: `stop()`/`teardown()` saw no record of the turn its `Stop` hook
261
+ // ended within the full 2 seconds, and shutdown proceeds, so that turn may be
262
+ // lost. Emitted before the signal. A fixed, content-free message and raw token only.
263
+ readonly elwoodSessionId: string;
264
+ readonly agent: "codex";
265
+ readonly source: "lifecycle";
266
+ readonly code: "turn_commit_wait_expired";
267
+ readonly severity: "warning";
268
+ readonly message: string;
269
+ readonly raw: string;
270
+ }
241
271
  | {
242
272
  readonly elwoodSessionId: string;
243
273
  readonly agent: "claude" | "codex";
@@ -289,6 +319,18 @@ type ElwoodWarningEvent =
289
319
  readonly message: string;
290
320
  readonly raw: string;
291
321
  }
322
+ | {
323
+ // The initial-readiness backstop released readiness while the latest
324
+ // frame showed no configured composer (the model footer), for example after
325
+ // a footer layout change (§5.3, C-API-28). Content-free.
326
+ readonly elwoodSessionId: string;
327
+ readonly agent: "codex";
328
+ readonly source: "lifecycle";
329
+ readonly code: "initial_ready_backstop";
330
+ readonly severity: "warning";
331
+ readonly message: string;
332
+ readonly raw: string;
333
+ }
292
334
  };
293
335
  ```
294
336
 
@@ -321,6 +363,14 @@ away cannot regain authority. Every assistant-marker row ends recognition,
321
363
  including one that resembles a status spinner: recognition fails toward fewer
322
364
  warnings, never forged ones.
323
365
 
366
+ Codex 0.154 and later collapse these failures to a count: `⚠ 1 MCP startup issue ·
367
+ ctrl + t for details` in 0.154, and a `⚠ N warning(s) · f2 to view` badge at the end
368
+ of the composer footer in 0.164. A count names no server and no recovery command, so
369
+ it is not a warning source, and Elwood never opens the CLI's detail view (in 0.164, a
370
+ transcript overlay that also renders the conversation). On these versions a session
371
+ therefore emits no MCP startup warning, and the 0.164 badge reads as part of the
372
+ idle composer.
373
+
324
374
  A startup prompt Elwood auto-answers is marked settled and emits its
325
375
  `startup_prompt` activity ONLY after its PTY `sendInput` write actually fulfills.
326
376
  For trust prompts, live revalidation additionally confirms the native dialog has
@@ -369,8 +419,13 @@ budget — so aggregate terminal read work is watcher-bounded, not per-retire.
369
419
  Second, each individual drain call stops at a small wall-clock slice, so it
370
420
  returns to the event loop promptly instead of monopolizing it grinding a
371
421
  hundreds-of-MiB backlog; whatever is still unread when the shared budget or the
372
- slice is spent is accounted as a content-free drop. Termination and retirement
373
- therefore always complete in bounded-latency work — capped by both the shared
422
+ slice is spent is accounted as a content-free drop. The slice can stop a call's
423
+ read of a transcript only after its first unread chunk, for up to 16 transcripts a
424
+ call (what one live scan reads): a host too loaded to begin the drain within its
425
+ slice still reads what each of them committed since the last poll, up to one chunk,
426
+ and any bytes past that chunk may still be dropped as `"unread_backlog"`. A record
427
+ the bound cuts off is part of that drop, never reported as `"unparseable"`.
428
+ Termination and retirement therefore always complete in bounded-latency work — capped by both the shared
374
429
  budget and the per-call slice — rather than an unbounded synchronous drain.
375
430
 
376
431
  When the first hook to carry a transcript path is a turn-boundary hook, Elwood
@@ -388,7 +443,14 @@ than the recovery bound therefore never silently loses all of its committed
388
443
  activity. The `transcript_read_error`
389
444
  warning is emitted when a transcript filesystem read is contained (a
390
445
  rotation/removal/permission race): the watcher never crashes the host, but also
391
- does not swallow it silently. The `transcript_poll_stopped` warning is emitted
446
+ does not swallow it silently. A transcript that has not been created yet is not
447
+ a read race: Claude names its transcript in `SessionStart` before its first turn
448
+ writes the file, so until Elwood has seen the file exist, a missing file is
449
+ waited on silently. Once the file has existed, its removal still warns, and any
450
+ other read failure warns whether or not the file was ever seen. Both adapters'
451
+ transcripts follow these rules. A removed Codex transcript is therefore not read
452
+ as a truncated, empty one: each poll warns while it is missing, as does the final
453
+ flush if it is still missing. The `transcript_poll_stopped` warning is emitted
392
454
  when a programming error escapes the periodic transcript poll OR the final flush
393
455
  at PTY exit: the watcher stops itself and surfaces a bounded reason rather than
394
456
  letting the failure become an unhandled rejection or abort the exit path. A
@@ -504,7 +566,8 @@ that exceeds it is discarded through its next newline (so a pathological no-newl
504
566
  line can neither exhaust memory nor cause quadratic re-concatenation) and its bytes
505
567
  are accounted as an `"oversized"` drop. At teardown — the final flush at PTY exit —
506
568
  the reader drains to end only within a bounded chunk budget and a small wall-clock
507
- slice; whatever is still unread when that bound is spent is accounted as an
569
+ slice, which can end the drain only after its first unread chunk; whatever is still
570
+ unread when that bound is spent, including a record it cuts off, is accounted as an
508
571
  `"unread_backlog"` drop rather than read in a single unbounded synchronous loop, so
509
572
  the flush returns to the event loop promptly. Codex data loss is surfaced through
510
573
  the SAME content-free `transcript_records_dropped` warning as Claude's (now
@@ -560,4 +623,23 @@ status. Parent applications should not receive delayed transcript activity after
560
623
  the session has already emitted `terminal:exit`, `exited`, `stopped`, or
561
624
  `killed`.
562
625
 
626
+ Codex runs the `Stop` hook before it records the turn's completion
627
+ (`task_complete`) in its transcript, and Elwood reports `ready` from that hook. If
628
+ Codex is signaled after the hook returns but before it writes that record, it exits
629
+ without the record, and the resumed conversation then ends as interrupted. So once a
630
+ `Stop` hook with a `transcript_path` arrives, `stop()` and `teardown()` give Codex a
631
+ bounded time to record the turn before signaling the process, including when a hook
632
+ observer, hook handler, or `ready` listener calls them. The wait ends at the first of:
633
+ a transcript record of that turn's end (`task_complete`, `turn_complete`,
634
+ `turn_aborted`, or `turn_failed` carrying the hook's `turn_id`); a hook result that
635
+ blocks the stop, since the turn then continues; the CLI's exit; or 2 seconds. After 2
636
+ seconds shutdown proceeds, and a turn Codex has still not recorded can be lost; it is
637
+ not waited for again. The session first emits one `turn_commit_wait_expired` warning
638
+ (with its `activity`), even when `stop()` and `teardown()` overlap, so a host can tell
639
+ that stop from an ordinary one. The warning states only that Elwood saw no record in
640
+ time. Both calls still reject queued input and pause loops at once.
641
+ `kill()` never waits. With no such turn pending, shutdown starts in the same tick as
642
+ the call. A CLI that exits on its own during the wait reports `exited`, because Elwood
643
+ did not signal it (C-LIFE-13).
644
+
563
645
  Native question snapshots and answering are shared controls; see [§5.10](5.10-questions.md).
@@ -65,7 +65,7 @@ after `Stop` never clears an installed signal — so the adapter-neutral turn ru
65
65
  reads the normalized signal, never raw provider hook field names. Once `ready` is
66
66
  observed, the turn ends the instant the transcript-collected assistant text CONTAINS
67
67
  that expected text, so it waits exactly as long as the transcript needs. When no completeness signal is available for a turn — a pure-tool
68
- turn, or an empty/null `last_assistant_message` (e.g. `StopFailure`) — the turn falls
68
+ turn, or an empty/null `last_assistant_message` — the turn falls
69
69
  back to a bounded quiet-window settle after `ready` (no new content for a short
70
70
  window). When a NON-EMPTY expected text IS present but never appears in the
71
71
  transcript within `catchUpMs` of `ready`, the turn does NOT fall back to the quiet
@@ -133,6 +133,37 @@ collection. They refine causal serialization rather than authenticate caller-own
133
133
  configuration or unrelated host processes; Claude transcript activity carries no `turnId`, so for Claude the
134
134
  serialized-slot boundary is the sole isolation guarantee (which is why releasing the
135
135
  slot on the real agent boundary, not on consumer cancellation, is load-bearing).
136
+
137
+ **Rejected turn.** When Claude rejects a turn, the turn fails with `turn_failed` (§10):
138
+ `send` rejects and `stream` throws after yielding any events it already collected. The
139
+ evidence is a `StopFailure` hook (§6.1), which Claude fires instead of `Stop` when, for
140
+ example, the selected model does not exist. The hook counts only for the turn whose
141
+ own submission it rejects: the turn must already have observed its own
142
+ `UserPromptSubmit`, whose prompt is the submitted text as pasted, without the control
143
+ characters §5.3 removes, and when both hooks carry `prompt_id` the two must match. A
144
+ `StopFailure` that arrives before the turn's own submission hook, or that names
145
+ another `prompt_id`, belongs to an earlier turn whose hook arrived late and is
146
+ ignored. The error message is the bounded diagnostic of §6.1, never assistant text,
147
+ and `details.agentError` carries the hook's `error` name when one is present. When Codex
148
+ rejects a turn, it fires no `Stop` hook at all. Its evidence is the committed transcript's
149
+ `event_msg` `task_complete` record whose `error` is an object (§7A), and that record ends
150
+ the turn instead of `Stop`. The record counts only when its `turn_id` is the one the
151
+ turn's own `UserPromptSubmit` reported, so a record from another turn is ignored, and a
152
+ `task_complete` whose `error` is absent or `null` is not a rejection. The error message is
153
+ the record's `error.message`, bounded like the §6.1 diagnostic (2,000 characters). When that
154
+ message is absent or blank, the error message is a generic rejection, which names the
155
+ error kind when one is usable (`Codex rejected the turn: <kind>`) and otherwise is
156
+ `Codex rejected the turn.`
157
+ `details.agentError` is the `error.codex_error_info` kind: its string value (for example
158
+ `other`), or the single key of its object form (for example `http_connection_failed`).
159
+ A rejection is a consumer failure like any other: the serialized slot is still held
160
+ until the real `ready` or terminal boundary and its transcript drain, and acceptance
161
+ recovery never replays a rejected prompt. Only adapter failure evidence fails a turn;
162
+ an empty reply, a `Stop` with an empty `last_assistant_message`, and a pure-tool
163
+ turn still succeed. Rejection evidence that arrives after the turn has already
164
+ settled does not reopen it. The raw session API does not interpret rejection: it
165
+ emits the `StopFailure` `hook` event and its hook `activity`, or the Codex
166
+ `task_complete` `codex:transcript` event and its transcript `activity`, as before.
136
167
  Because a turn has no default timeout, its buffered state is BOUNDED: the oracle
137
168
  matches against a rolling window of recent assistant text (not the whole turn, and
138
169
  capped even when the Stop hook's expected text is itself huge), and a turn whose
@@ -40,6 +40,8 @@ input and fail open until first-class types are added. Elwood should add an
40
40
  unknown-but-safe event path before promising forward-compatible hook handling.
41
41
 
42
42
  `StopFailure` identifies a rejected Claude turn even when diagnostic fields drift.
43
+ Ergonomic `send`/`stream` turns and headless CLI runs fail such a turn with
44
+ `turn_failed` (§5.8, §12A.2).
43
45
  After validating the common hook envelope, ingress MUST admit missing or arbitrarily
44
46
  shaped `error`, `error_details`, and `last_assistant_message` fields. Their public
45
47
  TypeScript types are optional `unknown`; consumers must narrow them before use.
@@ -89,6 +89,11 @@ should read the committed live transcript data with one bounded per-pass scan
89
89
  reserved for PTY exit) so parent applications receive transcript-derived turn
90
90
  activity before the ready transition whenever Codex has already written it.
91
91
 
92
+ A turn Codex rejects (for example an unknown model) fires no `Stop`. Its only
93
+ evidence is the committed transcript's `event_msg` `task_complete` record whose
94
+ `error` is an object, tagged with the turn's `turn_id`. For ergonomic turns that
95
+ record is the turn's boundary instead of `Stop` (§5.8).
96
+
92
97
  ### 7A.4 Non-Hook Transcript Activity
93
98
 
94
99
  Current Codex hooks do not cover every TUI-visible activity. Reasoning/status
package/prd/08-state.md CHANGED
@@ -14,10 +14,52 @@ spellings address the same session store. When Elwood initializes the default
14
14
  project-local state directory, it should create `.elwood/.gitignore` when that
15
15
  file does not already exist. Elwood MUST NOT overwrite an existing gitignore
16
16
  file and MUST NOT create gitignore files in caller-provided custom state
17
- directories unless a future explicit option asks it to.
17
+ directories unless a future explicit option asks it to. The default ignore file is
18
+ fully written before installation, which must preserve a concurrently created
19
+ file. Failed installation must not leave an empty or partial default ignore. A complete
20
+ published ignore is retained if later installation cleanup or directory syncing
21
+ fails, since another start may already rely on it. Existing entries must be
22
+ regular files, never symlinks, and their directory is synced before setup accepts them. Successful syncs
23
+ may be reused for up to 32 unchanged file/parent observations per process; changed
24
+ observations and failed syncs are never retained. This does not cache safety checks.
25
+ The default ignore’s parent path must also pass the owner, mode-bit, sticky-bit,
26
+ and private-primary-group lookup checks used for CLI workspaces (§12A.5), including
27
+ link targets. These checks prevent replacement by other users; they do not inspect
28
+ ACLs or isolate another process running as the same user or root.
18
29
  The default `.elwood/` directory and generated `.elwood/.gitignore` should be
19
30
  readable by normal local tooling, while session-specific subdirectories remain
20
31
  private.
32
+ A state directory is made only while the session's `cwd` exists, and `cwd`
33
+ itself is never made. One at or under `cwd`, the default `.elwood/` or a
34
+ caller-provided `stateDir`, is made only below it, one directory at a time,
35
+ however either path is spelled (in another letter case on a case-insensitive
36
+ volume, or through a symlink). A caller-provided `stateDir` elsewhere is
37
+ created with its missing parents, and `cwd` is checked again once it, its
38
+ `sessions` directory, and the new session's directory are made: if `cwd` was
39
+ removed meanwhile, every directory that setup made is removed again, except one
40
+ another start has put its session directory in, and the start fails, with the
41
+ `cleanupErrorCode` of any directory that could not be removed. A start that
42
+ finds a directory removed under it by such a start makes it again while its own
43
+ `cwd` exists. The `sessions` directory, each session
44
+ directory, and every state file are made only inside their existing parent: a
45
+ missing parent fails the write with `ENOENT`. So a removed worktree, or a
46
+ removed state directory, is never recreated by a start, a resume, or a running
47
+ session's later writes. A start fails instead, before its agent is spawned, and
48
+ so does a write whose state directory is gone, as when it was in the removed
49
+ worktree; a running session whose state directory is elsewhere keeps writing
50
+ there (C-STATE-14). If state preparation fails, its empty owned scaffolding is removed.
51
+ The default shared state root and `sessions` directory are retained: another setup,
52
+ including one without a session ID yet, may already rely on them. Only the failed
53
+ attempt's empty named session directory is removed there. A complete published
54
+ default ignore is shared configuration and is never rolled back by that attempt.
55
+ Custom-state empty scaffolding remains eligible for removal. Cleanup attempts every
56
+ eligible directory and preserves the primary setup failure with its first cleanup
57
+ code, including inside typed error details.
58
+
59
+ Custom rollback preserves entries whose parent lookup crosses a foreign-owned or
60
+ non-sticky shared writable ancestor, using the existing mode-bit, private-group and
61
+ sticky-directory policy. Root-owned sticky `/tmp` remains eligible. These bounded
62
+ observations provide no same-user/root isolation or ACL audit.
21
63
 
22
64
  Before creating or changing state, Elwood MUST reject a symlink at the state
23
65
  root, sessions directory, or session directory, and reject user-owned symlink
@@ -43,12 +85,22 @@ reused; the socket path is a per-launch runtime value, embedded only in the gene
43
85
  private bridge script and never in the session record, so a
44
86
  recorded socket path can never be trusted. `teardown` removes the whole socket
45
87
  home (every launch's socket) along with the session directory, so no per-launch
46
- socket can leak undiscoverably across restart/resume cycles. Across separate Elwood
88
+ socket can leak undiscoverably across restart/resume cycles. Each Codex launch also
89
+ writes its `CODEX_HOME` report (§4.2) into the socket home, named after that
90
+ launch's socket file, so a failed first start leaves nothing in the session
91
+ directory. The report is removed when its launch's PTY exits, a failed start
92
+ included, and teardown removes any that remain with the home. A launch that ends
93
+ without teardown — `stop`, `kill`, the agent exiting, or a failed start — removes
94
+ its own socket file and then the socket home if that left it empty, so a session
95
+ that is never torn down leaves nothing in the OS temp dir; a home that still holds
96
+ another launch's socket is kept, and the session's next start or resume
97
+ recreates the home. Across separate Elwood
47
98
  processes, running two live sessions with the same full identity (`stateDir`,
48
99
  adapter, and session id) is unsupported: the processes share files and socket
49
100
  homes without a cross-process ownership protocol. Within one process, overlapping
50
101
  resume and cleanup follow the successor protocol below. A failed start removes
51
- only its own socket file, preserving any overlapping launch. `stateDir`
102
+ only its own socket file (and the home only once it is empty), preserving any
103
+ overlapping launch. `stateDir`
52
104
  length MUST NOT constrain whether a session can start.
53
105
 
54
106
  Within one Elwood process, a validated resume attempt revokes the prior launch's
@@ -64,8 +116,10 @@ committed successor keeps its state, while a failed successor permits the predec
64
116
  to finish the requested cleanup before its shutdown promise resolves. A pending
65
117
  successor does not activate loop timers. Successful activation rereads the latest
66
118
  durable loop definitions and revokes prior scheduling in the same synchronous commit,
67
- so a successful predecessor cancellation or creation is preserved. An activation
68
- read failure stops the built launch before ownership rolls back. If resume fails,
119
+ so a successful predecessor cancellation or creation is preserved. Activation prunes
120
+ loops that expired since the launch read them as part of the startup publication. An
121
+ activation read or prune failure stops the built launch before ownership rolls back,
122
+ and rollback restores that prune. If resume fails,
69
123
  ownership returns to the prior
70
124
  viable launch only when no newer reservation or launch has replaced that attempt.
71
125
  A failed overlapping launch therefore preserves the original live launch's cleanup
@@ -78,7 +132,8 @@ settings instead use fresh per-launch filenames permanently bound to that launch
78
132
  PTY. Pending or committed successors never redirect a predecessor's hook policy. A failed
79
133
  attempt restores each prior file only while it still owns the reservation and the
80
134
  file still contains that attempt's exact published bytes. A newer predecessor
81
- record update or newer generation is preserved. If a predecessor updates a file
135
+ record or loop update, even one whose bytes match the attempt's, or a newer
136
+ generation is preserved. If a predecessor updates a file
82
137
  between two pending-launch writes, that external version becomes the rollback
83
138
  baseline for the later write. Pending-launch hook record writes participate in the
84
139
  same transaction. Superseded or failed generations cannot publish metadata.
@@ -155,7 +210,8 @@ core state must not become a transcript store.
155
210
 
156
211
  ### 8.4 Cleanup
157
212
 
158
- Runtime files needed for resume/debugging are kept by default after `stop`.
213
+ Runtime files needed for resume/debugging are kept by default after `stop`. The
214
+ socket home is not among them: `stop` removes it once it is empty (§8.1).
159
215
  Loop definitions are likewise kept after `stop`, unexpected exit, or process
160
216
  failure. `kill` permanently removes all loop definitions while preserving the
161
217
  ordinary session record; a later resume has no loops.