@with-logic/elwood 0.1.3 → 0.2.1

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 (1201) hide show
  1. package/CHANGELOG.md +389 -2
  2. package/CONTRIBUTING.md +29 -18
  3. package/README.md +34 -7
  4. package/dist/bridge/parse.d.ts.map +1 -1
  5. package/dist/bridge/parse.js +2 -1
  6. package/dist/bridge/parse.js.map +1 -1
  7. package/dist/bridge/server.d.ts.map +1 -1
  8. package/dist/bridge/server.js +6 -2
  9. package/dist/bridge/server.js.map +1 -1
  10. package/dist/claude/attach-images.d.ts +3 -1
  11. package/dist/claude/attach-images.d.ts.map +1 -1
  12. package/dist/claude/attach-images.js +11 -10
  13. package/dist/claude/attach-images.js.map +1 -1
  14. package/dist/claude/composer/empty-input.d.ts +4 -0
  15. package/dist/claude/composer/empty-input.d.ts.map +1 -0
  16. package/dist/claude/composer/empty-input.js +28 -0
  17. package/dist/claude/composer/empty-input.js.map +1 -0
  18. package/dist/claude/composer/footer.d.ts +3 -0
  19. package/dist/claude/composer/footer.d.ts.map +1 -0
  20. package/dist/claude/composer/footer.js +3 -0
  21. package/dist/claude/composer/footer.js.map +1 -0
  22. package/dist/claude/composer/staged-input.d.ts +7 -0
  23. package/dist/claude/composer/staged-input.d.ts.map +1 -0
  24. package/dist/claude/composer/staged-input.js +18 -0
  25. package/dist/claude/composer/staged-input.js.map +1 -0
  26. package/dist/claude/hooks/common-result.d.ts +5 -0
  27. package/dist/claude/hooks/common-result.d.ts.map +1 -0
  28. package/dist/claude/hooks/common-result.js +3 -0
  29. package/dist/claude/hooks/common-result.js.map +1 -0
  30. package/dist/claude/hooks/dispatch.d.ts +2 -1
  31. package/dist/claude/hooks/dispatch.d.ts.map +1 -1
  32. package/dist/claude/hooks/dispatch.js +3 -1
  33. package/dist/claude/hooks/dispatch.js.map +1 -1
  34. package/dist/claude/hooks/events-extra.d.ts +5 -4
  35. package/dist/claude/hooks/events-extra.d.ts.map +1 -1
  36. package/dist/claude/hooks/index.d.ts +10 -10
  37. package/dist/claude/hooks/index.d.ts.map +1 -1
  38. package/dist/claude/hooks/index.js +1 -4
  39. package/dist/claude/hooks/index.js.map +1 -1
  40. package/dist/claude/hooks/inputs/control.d.ts +25 -0
  41. package/dist/claude/hooks/inputs/control.d.ts.map +1 -0
  42. package/dist/claude/hooks/inputs/control.js +3 -0
  43. package/dist/claude/hooks/inputs/control.js.map +1 -0
  44. package/dist/claude/hooks/stop-failure.d.ts +10 -0
  45. package/dist/claude/hooks/stop-failure.d.ts.map +1 -0
  46. package/dist/claude/hooks/stop-failure.js +18 -0
  47. package/dist/claude/hooks/stop-failure.js.map +1 -0
  48. package/dist/claude/hooks/tool-types.d.ts +12 -10
  49. package/dist/claude/hooks/tool-types.d.ts.map +1 -1
  50. package/dist/claude/login/notice.d.ts +3 -0
  51. package/dist/claude/login/notice.d.ts.map +1 -0
  52. package/dist/claude/login/notice.js +3 -0
  53. package/dist/claude/login/notice.js.map +1 -0
  54. package/dist/claude/login/renewal.d.ts +13 -0
  55. package/dist/claude/login/renewal.d.ts.map +1 -0
  56. package/dist/claude/login/renewal.js +97 -0
  57. package/dist/claude/login/renewal.js.map +1 -0
  58. package/dist/claude/model-composer.d.ts +2 -0
  59. package/dist/claude/model-composer.d.ts.map +1 -0
  60. package/dist/claude/model-composer.js +12 -0
  61. package/dist/claude/model-composer.js.map +1 -0
  62. package/dist/claude/model-picker.d.ts.map +1 -1
  63. package/dist/claude/model-picker.js +42 -8
  64. package/dist/claude/model-picker.js.map +1 -1
  65. package/dist/claude/model-switch-confirmation.d.ts +6 -0
  66. package/dist/claude/model-switch-confirmation.d.ts.map +1 -1
  67. package/dist/claude/model-switch-confirmation.js +77 -4
  68. package/dist/claude/model-switch-confirmation.js.map +1 -1
  69. package/dist/claude/preflight.d.ts.map +1 -1
  70. package/dist/claude/preflight.js +2 -4
  71. package/dist/claude/preflight.js.map +1 -1
  72. package/dist/claude/questions/answer.d.ts +9 -0
  73. package/dist/claude/questions/answer.d.ts.map +1 -0
  74. package/dist/claude/questions/answer.js +84 -0
  75. package/dist/claude/questions/answer.js.map +1 -0
  76. package/dist/claude/questions/bind-answers.d.ts +14 -0
  77. package/dist/claude/questions/bind-answers.d.ts.map +1 -0
  78. package/dist/claude/questions/bind-answers.js +36 -0
  79. package/dist/claude/questions/bind-answers.js.map +1 -0
  80. package/dist/claude/questions/candidate.d.ts +23 -0
  81. package/dist/claude/questions/candidate.d.ts.map +1 -0
  82. package/dist/claude/questions/candidate.js +47 -0
  83. package/dist/claude/questions/candidate.js.map +1 -0
  84. package/dist/claude/questions/correlation.d.ts +15 -0
  85. package/dist/claude/questions/correlation.d.ts.map +1 -0
  86. package/dist/claude/questions/correlation.js +23 -0
  87. package/dist/claude/questions/correlation.js.map +1 -0
  88. package/dist/claude/questions/hook-decisions.d.ts +19 -0
  89. package/dist/claude/questions/hook-decisions.d.ts.map +1 -0
  90. package/dist/claude/questions/hook-decisions.js +52 -0
  91. package/dist/claude/questions/hook-decisions.js.map +1 -0
  92. package/dist/claude/questions/index.d.ts +27 -0
  93. package/dist/claude/questions/index.d.ts.map +1 -0
  94. package/dist/claude/questions/index.js +161 -0
  95. package/dist/claude/questions/index.js.map +1 -0
  96. package/dist/claude/questions/navigation.d.ts +24 -0
  97. package/dist/claude/questions/navigation.d.ts.map +1 -0
  98. package/dist/claude/questions/navigation.js +37 -0
  99. package/dist/claude/questions/navigation.js.map +1 -0
  100. package/dist/claude/questions/rows.d.ts +19 -0
  101. package/dist/claude/questions/rows.d.ts.map +1 -0
  102. package/dist/claude/questions/rows.js +64 -0
  103. package/dist/claude/questions/rows.js.map +1 -0
  104. package/dist/claude/questions/screen.d.ts +29 -0
  105. package/dist/claude/questions/screen.d.ts.map +1 -0
  106. package/dist/claude/questions/screen.js +103 -0
  107. package/dist/claude/questions/screen.js.map +1 -0
  108. package/dist/claude/screen-table.d.ts +19 -2
  109. package/dist/claude/screen-table.d.ts.map +1 -1
  110. package/dist/claude/screen-table.js +48 -4
  111. package/dist/claude/screen-table.js.map +1 -1
  112. package/dist/claude/serialize.d.ts.map +1 -1
  113. package/dist/claude/serialize.js +22 -6
  114. package/dist/claude/serialize.js.map +1 -1
  115. package/dist/claude/session/build.d.ts +1 -12
  116. package/dist/claude/session/build.d.ts.map +1 -1
  117. package/dist/claude/session/build.js +42 -55
  118. package/dist/claude/session/build.js.map +1 -1
  119. package/dist/claude/session/hook-handler.d.ts +3 -2
  120. package/dist/claude/session/hook-handler.d.ts.map +1 -1
  121. package/dist/claude/session/hook-handler.js +44 -18
  122. package/dist/claude/session/hook-handler.js.map +1 -1
  123. package/dist/claude/session/index.d.ts +2 -1
  124. package/dist/claude/session/index.d.ts.map +1 -1
  125. package/dist/claude/session/index.js +23 -8
  126. package/dist/claude/session/index.js.map +1 -1
  127. package/dist/claude/session/instance.d.ts +17 -5
  128. package/dist/claude/session/instance.d.ts.map +1 -1
  129. package/dist/claude/session/instance.js +25 -12
  130. package/dist/claude/session/instance.js.map +1 -1
  131. package/dist/claude/session/interface.d.ts +2 -1
  132. package/dist/claude/session/interface.d.ts.map +1 -1
  133. package/dist/claude/session/questions.d.ts +9 -0
  134. package/dist/claude/session/questions.d.ts.map +1 -0
  135. package/dist/claude/session/questions.js +19 -0
  136. package/dist/claude/session/questions.js.map +1 -0
  137. package/dist/claude/session/resume.d.ts.map +1 -1
  138. package/dist/claude/session/resume.js +35 -26
  139. package/dist/claude/session/resume.js.map +1 -1
  140. package/dist/claude/session/runtime.d.ts +10 -0
  141. package/dist/claude/session/runtime.d.ts.map +1 -1
  142. package/dist/claude/session/runtime.js +8 -5
  143. package/dist/claude/session/runtime.js.map +1 -1
  144. package/dist/claude/session/startup-warnings.d.ts +5 -0
  145. package/dist/claude/session/startup-warnings.d.ts.map +1 -0
  146. package/dist/claude/session/startup-warnings.js +7 -0
  147. package/dist/claude/session/startup-warnings.js.map +1 -0
  148. package/dist/claude/session/transcript.d.ts +2 -0
  149. package/dist/claude/session/transcript.d.ts.map +1 -1
  150. package/dist/claude/session/transcript.js +21 -3
  151. package/dist/claude/session/transcript.js.map +1 -1
  152. package/dist/claude/startup-prompts.d.ts +35 -3
  153. package/dist/claude/startup-prompts.d.ts.map +1 -1
  154. package/dist/claude/startup-prompts.js +81 -15
  155. package/dist/claude/startup-prompts.js.map +1 -1
  156. package/dist/claude/transcript/index.d.ts.map +1 -1
  157. package/dist/claude/transcript/index.js +3 -2
  158. package/dist/claude/transcript/index.js.map +1 -1
  159. package/dist/claude/validate/event-fields.d.ts +6 -0
  160. package/dist/claude/validate/event-fields.d.ts.map +1 -0
  161. package/dist/claude/validate/event-fields.js +103 -0
  162. package/dist/claude/validate/event-fields.js.map +1 -0
  163. package/dist/claude/validate/input.d.ts.map +1 -1
  164. package/dist/claude/validate/input.js +12 -41
  165. package/dist/claude/validate/input.js.map +1 -1
  166. package/dist/claude/validate/shapes.d.ts +1 -1
  167. package/dist/claude/validate/shapes.d.ts.map +1 -1
  168. package/dist/claude/validate/shapes.js +1 -1
  169. package/dist/claude/validate/shapes.js.map +1 -1
  170. package/dist/claude/validate/tool-shapes.d.ts +102 -0
  171. package/dist/claude/validate/tool-shapes.d.ts.map +1 -0
  172. package/dist/claude/validate/tool-shapes.js +83 -0
  173. package/dist/claude/validate/tool-shapes.js.map +1 -0
  174. package/dist/claude/validate/tool-update.d.ts +2 -11
  175. package/dist/claude/validate/tool-update.d.ts.map +1 -1
  176. package/dist/claude/validate/tool-update.js +11 -112
  177. package/dist/claude/validate/tool-update.js.map +1 -1
  178. package/dist/claude/validate/tool-values.d.ts +7 -0
  179. package/dist/claude/validate/tool-values.d.ts.map +1 -0
  180. package/dist/claude/validate/tool-values.js +30 -0
  181. package/dist/claude/validate/tool-values.js.map +1 -0
  182. package/dist/cli/args/options.d.ts.map +1 -1
  183. package/dist/cli/args/options.js +1 -0
  184. package/dist/cli/args/options.js.map +1 -1
  185. package/dist/cli/args-commands.d.ts.map +1 -1
  186. package/dist/cli/args-commands.js +3 -0
  187. package/dist/cli/args-commands.js.map +1 -1
  188. package/dist/cli/config/store.d.ts.map +1 -1
  189. package/dist/cli/config/store.js +2 -1
  190. package/dist/cli/config/store.js.map +1 -1
  191. package/dist/cli/help.d.ts +1 -1
  192. package/dist/cli/help.d.ts.map +1 -1
  193. package/dist/cli/help.js +2 -1
  194. package/dist/cli/help.js.map +1 -1
  195. package/dist/cli/interactive/effort.d.ts +5 -0
  196. package/dist/cli/interactive/effort.d.ts.map +1 -0
  197. package/dist/cli/interactive/effort.js +13 -0
  198. package/dist/cli/interactive/effort.js.map +1 -0
  199. package/dist/cli/interactive/launch.d.ts.map +1 -1
  200. package/dist/cli/interactive/launch.js +1 -1
  201. package/dist/cli/interactive/launch.js.map +1 -1
  202. package/dist/cli/lifecycle/index.d.ts +3 -6
  203. package/dist/cli/lifecycle/index.d.ts.map +1 -1
  204. package/dist/cli/lifecycle/index.js +6 -13
  205. package/dist/cli/lifecycle/index.js.map +1 -1
  206. package/dist/cli/models/settings.d.ts +2 -0
  207. package/dist/cli/models/settings.d.ts.map +1 -1
  208. package/dist/cli/request/index.d.ts.map +1 -1
  209. package/dist/cli/request/index.js +1 -0
  210. package/dist/cli/request/index.js.map +1 -1
  211. package/dist/cli/run/index.d.ts.map +1 -1
  212. package/dist/cli/run/index.js +3 -1
  213. package/dist/cli/run/index.js.map +1 -1
  214. package/dist/cli/run/output.d.ts.map +1 -1
  215. package/dist/cli/run/output.js +1 -0
  216. package/dist/cli/run/output.js.map +1 -1
  217. package/dist/cli/run/subscribe.js +1 -1
  218. package/dist/cli/run/subscribe.js.map +1 -1
  219. package/dist/cli/session/index.d.ts +2 -0
  220. package/dist/cli/session/index.d.ts.map +1 -1
  221. package/dist/cli/session/index.js +3 -0
  222. package/dist/cli/session/index.js.map +1 -1
  223. package/dist/cli/session/launch.d.ts +0 -3
  224. package/dist/cli/session/launch.d.ts.map +1 -1
  225. package/dist/cli/session/launch.js +0 -11
  226. package/dist/cli/session/launch.js.map +1 -1
  227. package/dist/cli/sessions/list.d.ts.map +1 -1
  228. package/dist/cli/sessions/list.js +5 -4
  229. package/dist/cli/sessions/list.js.map +1 -1
  230. package/dist/cli/types.d.ts +2 -0
  231. package/dist/cli/types.d.ts.map +1 -1
  232. package/dist/cli/update-attention.d.ts +2 -1
  233. package/dist/cli/update-attention.d.ts.map +1 -1
  234. package/dist/cli/update-attention.js +11 -2
  235. package/dist/cli/update-attention.js.map +1 -1
  236. package/dist/codex/accepted-turn.d.ts +4 -0
  237. package/dist/codex/accepted-turn.d.ts.map +1 -0
  238. package/dist/codex/accepted-turn.js +17 -0
  239. package/dist/codex/accepted-turn.js.map +1 -0
  240. package/dist/codex/config/transaction.d.ts +22 -0
  241. package/dist/codex/config/transaction.d.ts.map +1 -1
  242. package/dist/codex/config/transaction.js +61 -31
  243. package/dist/codex/config/transaction.js.map +1 -1
  244. package/dist/codex/hooks/index.d.ts +6 -1
  245. package/dist/codex/hooks/index.d.ts.map +1 -1
  246. package/dist/codex/hooks/validate-result.d.ts.map +1 -1
  247. package/dist/codex/hooks/validate-result.js +2 -1
  248. package/dist/codex/hooks/validate-result.js.map +1 -1
  249. package/dist/codex/hooks/validate.d.ts.map +1 -1
  250. package/dist/codex/hooks/validate.js +1 -3
  251. package/dist/codex/hooks/validate.js.map +1 -1
  252. package/dist/codex/hooks/values.d.ts +3 -0
  253. package/dist/codex/hooks/values.d.ts.map +1 -0
  254. package/dist/codex/hooks/values.js +5 -0
  255. package/dist/codex/hooks/values.js.map +1 -0
  256. package/dist/codex/images/attach.d.ts +3 -1
  257. package/dist/codex/images/attach.d.ts.map +1 -1
  258. package/dist/codex/images/attach.js +10 -11
  259. package/dist/codex/images/attach.js.map +1 -1
  260. package/dist/codex/images/clipboard.d.ts.map +1 -1
  261. package/dist/codex/images/clipboard.js +11 -3
  262. package/dist/codex/images/clipboard.js.map +1 -1
  263. package/dist/codex/model-picker.d.ts.map +1 -1
  264. package/dist/codex/model-picker.js +23 -5
  265. package/dist/codex/model-picker.js.map +1 -1
  266. package/dist/codex/preflight.d.ts.map +1 -1
  267. package/dist/codex/preflight.js +2 -2
  268. package/dist/codex/preflight.js.map +1 -1
  269. package/dist/codex/questions/acceptance.d.ts +18 -0
  270. package/dist/codex/questions/acceptance.d.ts.map +1 -0
  271. package/dist/codex/questions/acceptance.js +70 -0
  272. package/dist/codex/questions/acceptance.js.map +1 -0
  273. package/dist/codex/questions/adapter.d.ts +26 -0
  274. package/dist/codex/questions/adapter.d.ts.map +1 -0
  275. package/dist/codex/questions/adapter.js +163 -0
  276. package/dist/codex/questions/adapter.js.map +1 -0
  277. package/dist/codex/questions/candidate-acceptance.d.ts +5 -0
  278. package/dist/codex/questions/candidate-acceptance.d.ts.map +1 -0
  279. package/dist/codex/questions/candidate-acceptance.js +8 -0
  280. package/dist/codex/questions/candidate-acceptance.js.map +1 -0
  281. package/dist/codex/questions/candidate-authority.d.ts +10 -0
  282. package/dist/codex/questions/candidate-authority.d.ts.map +1 -0
  283. package/dist/codex/questions/candidate-authority.js +25 -0
  284. package/dist/codex/questions/candidate-authority.js.map +1 -0
  285. package/dist/codex/questions/candidate-disable.d.ts +5 -0
  286. package/dist/codex/questions/candidate-disable.d.ts.map +1 -0
  287. package/dist/codex/questions/candidate-disable.js +14 -0
  288. package/dist/codex/questions/candidate-disable.js.map +1 -0
  289. package/dist/codex/questions/candidate-publication.d.ts +7 -0
  290. package/dist/codex/questions/candidate-publication.d.ts.map +1 -0
  291. package/dist/codex/questions/candidate-publication.js +8 -0
  292. package/dist/codex/questions/candidate-publication.js.map +1 -0
  293. package/dist/codex/questions/candidate-reservation.d.ts +6 -0
  294. package/dist/codex/questions/candidate-reservation.d.ts.map +1 -0
  295. package/dist/codex/questions/candidate-reservation.js +7 -0
  296. package/dist/codex/questions/candidate-reservation.js.map +1 -0
  297. package/dist/codex/questions/candidate-store.d.ts +53 -0
  298. package/dist/codex/questions/candidate-store.d.ts.map +1 -0
  299. package/dist/codex/questions/candidate-store.js +188 -0
  300. package/dist/codex/questions/candidate-store.js.map +1 -0
  301. package/dist/codex/questions/candidate.d.ts +40 -0
  302. package/dist/codex/questions/candidate.d.ts.map +1 -0
  303. package/dist/codex/questions/candidate.js +39 -0
  304. package/dist/codex/questions/candidate.js.map +1 -0
  305. package/dist/codex/questions/candidates.d.ts +16 -0
  306. package/dist/codex/questions/candidates.d.ts.map +1 -0
  307. package/dist/codex/questions/candidates.js +113 -0
  308. package/dist/codex/questions/candidates.js.map +1 -0
  309. package/dist/codex/questions/chrome.d.ts +10 -0
  310. package/dist/codex/questions/chrome.d.ts.map +1 -0
  311. package/dist/codex/questions/chrome.js +21 -0
  312. package/dist/codex/questions/chrome.js.map +1 -0
  313. package/dist/codex/questions/definitions.d.ts +19 -0
  314. package/dist/codex/questions/definitions.d.ts.map +1 -0
  315. package/dist/codex/questions/definitions.js +86 -0
  316. package/dist/codex/questions/definitions.js.map +1 -0
  317. package/dist/codex/questions/draft.d.ts +25 -0
  318. package/dist/codex/questions/draft.d.ts.map +1 -0
  319. package/dist/codex/questions/draft.js +76 -0
  320. package/dist/codex/questions/draft.js.map +1 -0
  321. package/dist/codex/questions/driver-support.d.ts +6 -0
  322. package/dist/codex/questions/driver-support.d.ts.map +1 -0
  323. package/dist/codex/questions/driver-support.js +7 -0
  324. package/dist/codex/questions/driver-support.js.map +1 -0
  325. package/dist/codex/questions/driver.d.ts +10 -0
  326. package/dist/codex/questions/driver.d.ts.map +1 -0
  327. package/dist/codex/questions/driver.js +139 -0
  328. package/dist/codex/questions/driver.js.map +1 -0
  329. package/dist/codex/questions/frame.d.ts +36 -0
  330. package/dist/codex/questions/frame.d.ts.map +1 -0
  331. package/dist/codex/questions/frame.js +138 -0
  332. package/dist/codex/questions/frame.js.map +1 -0
  333. package/dist/codex/questions/labels.d.ts +6 -0
  334. package/dist/codex/questions/labels.d.ts.map +1 -0
  335. package/dist/codex/questions/labels.js +6 -0
  336. package/dist/codex/questions/labels.js.map +1 -0
  337. package/dist/codex/questions/limits.d.ts +18 -0
  338. package/dist/codex/questions/limits.d.ts.map +1 -0
  339. package/dist/codex/questions/limits.js +61 -0
  340. package/dist/codex/questions/limits.js.map +1 -0
  341. package/dist/codex/questions/native-pending.d.ts +7 -0
  342. package/dist/codex/questions/native-pending.d.ts.map +1 -0
  343. package/dist/codex/questions/native-pending.js +37 -0
  344. package/dist/codex/questions/native-pending.js.map +1 -0
  345. package/dist/codex/questions/owned-editor.d.ts +12 -0
  346. package/dist/codex/questions/owned-editor.d.ts.map +1 -0
  347. package/dist/codex/questions/owned-editor.js +37 -0
  348. package/dist/codex/questions/owned-editor.js.map +1 -0
  349. package/dist/codex/questions/pending-submissions.d.ts +12 -0
  350. package/dist/codex/questions/pending-submissions.d.ts.map +1 -0
  351. package/dist/codex/questions/pending-submissions.js +42 -0
  352. package/dist/codex/questions/pending-submissions.js.map +1 -0
  353. package/dist/codex/questions/records.d.ts +29 -0
  354. package/dist/codex/questions/records.d.ts.map +1 -0
  355. package/dist/codex/questions/records.js +113 -0
  356. package/dist/codex/questions/records.js.map +1 -0
  357. package/dist/codex/questions/selection.d.ts +3 -0
  358. package/dist/codex/questions/selection.d.ts.map +1 -0
  359. package/dist/codex/questions/selection.js +18 -0
  360. package/dist/codex/questions/selection.js.map +1 -0
  361. package/dist/codex/questions/session.d.ts +6 -0
  362. package/dist/codex/questions/session.d.ts.map +1 -0
  363. package/dist/codex/questions/session.js +21 -0
  364. package/dist/codex/questions/session.js.map +1 -0
  365. package/dist/codex/screen/clearance.d.ts +17 -0
  366. package/dist/codex/screen/clearance.d.ts.map +1 -0
  367. package/dist/codex/screen/clearance.js +170 -0
  368. package/dist/codex/screen/clearance.js.map +1 -0
  369. package/dist/codex/screen/empty-input.d.ts +4 -0
  370. package/dist/codex/screen/empty-input.d.ts.map +1 -0
  371. package/dist/codex/screen/empty-input.js +10 -0
  372. package/dist/codex/screen/empty-input.js.map +1 -0
  373. package/dist/codex/screen/live-clearance.d.ts +6 -0
  374. package/dist/codex/screen/live-clearance.d.ts.map +1 -0
  375. package/dist/codex/screen/live-clearance.js +34 -0
  376. package/dist/codex/screen/live-clearance.js.map +1 -0
  377. package/dist/codex/screen/retained-clearance.d.ts +19 -0
  378. package/dist/codex/screen/retained-clearance.d.ts.map +1 -0
  379. package/dist/codex/screen/retained-clearance.js +67 -0
  380. package/dist/codex/screen/retained-clearance.js.map +1 -0
  381. package/dist/codex/screen/staged-input.d.ts +7 -0
  382. package/dist/codex/screen/staged-input.d.ts.map +1 -0
  383. package/dist/codex/screen/staged-input.js +40 -0
  384. package/dist/codex/screen/staged-input.js.map +1 -0
  385. package/dist/codex/screen/working.d.ts +4 -0
  386. package/dist/codex/screen/working.d.ts.map +1 -0
  387. package/dist/codex/screen/working.js +5 -0
  388. package/dist/codex/screen/working.js.map +1 -0
  389. package/dist/codex/screen-table.d.ts +4 -1
  390. package/dist/codex/screen-table.d.ts.map +1 -1
  391. package/dist/codex/screen-table.js +44 -11
  392. package/dist/codex/screen-table.js.map +1 -1
  393. package/dist/codex/session/build.d.ts +1 -0
  394. package/dist/codex/session/build.d.ts.map +1 -1
  395. package/dist/codex/session/build.js +62 -68
  396. package/dist/codex/session/build.js.map +1 -1
  397. package/dist/codex/session/caller-input.d.ts +18 -0
  398. package/dist/codex/session/caller-input.d.ts.map +1 -0
  399. package/dist/codex/session/caller-input.js +50 -0
  400. package/dist/codex/session/caller-input.js.map +1 -0
  401. package/dist/codex/session/cleanup.d.ts +2 -1
  402. package/dist/codex/session/cleanup.d.ts.map +1 -1
  403. package/dist/codex/session/cleanup.js +3 -2
  404. package/dist/codex/session/cleanup.js.map +1 -1
  405. package/dist/codex/session/cli-exit.d.ts +24 -0
  406. package/dist/codex/session/cli-exit.d.ts.map +1 -0
  407. package/dist/codex/session/cli-exit.js +43 -0
  408. package/dist/codex/session/cli-exit.js.map +1 -0
  409. package/dist/codex/session/hooks.d.ts +3 -0
  410. package/dist/codex/session/hooks.d.ts.map +1 -1
  411. package/dist/codex/session/hooks.js +66 -13
  412. package/dist/codex/session/hooks.js.map +1 -1
  413. package/dist/codex/session/index.d.ts +2 -1
  414. package/dist/codex/session/index.d.ts.map +1 -1
  415. package/dist/codex/session/index.js +23 -8
  416. package/dist/codex/session/index.js.map +1 -1
  417. package/dist/codex/session/initial-ready.d.ts +6 -0
  418. package/dist/codex/session/initial-ready.d.ts.map +1 -0
  419. package/dist/codex/session/initial-ready.js +9 -0
  420. package/dist/codex/session/initial-ready.js.map +1 -0
  421. package/dist/codex/session/instance.d.ts +19 -4
  422. package/dist/codex/session/instance.d.ts.map +1 -1
  423. package/dist/codex/session/instance.js +60 -30
  424. package/dist/codex/session/instance.js.map +1 -1
  425. package/dist/codex/session/resume.d.ts.map +1 -1
  426. package/dist/codex/session/resume.js +35 -26
  427. package/dist/codex/session/resume.js.map +1 -1
  428. package/dist/codex/session/runtime.d.ts.map +1 -1
  429. package/dist/codex/session/runtime.js +1 -2
  430. package/dist/codex/session/runtime.js.map +1 -1
  431. package/dist/codex/session/startup-warnings.d.ts +11 -0
  432. package/dist/codex/session/startup-warnings.d.ts.map +1 -0
  433. package/dist/codex/session/startup-warnings.js +9 -0
  434. package/dist/codex/session/startup-warnings.js.map +1 -0
  435. package/dist/codex/session/transcript.d.ts +3 -1
  436. package/dist/codex/session/transcript.d.ts.map +1 -1
  437. package/dist/codex/session/transcript.js +51 -8
  438. package/dist/codex/session/transcript.js.map +1 -1
  439. package/dist/codex/session/types.d.ts +4 -3
  440. package/dist/codex/session/types.d.ts.map +1 -1
  441. package/dist/codex/session/update-attention.d.ts +4 -0
  442. package/dist/codex/session/update-attention.d.ts.map +1 -0
  443. package/dist/codex/session/update-attention.js +18 -0
  444. package/dist/codex/session/update-attention.js.map +1 -0
  445. package/dist/codex/session/warnings.d.ts +2 -1
  446. package/dist/codex/session/warnings.d.ts.map +1 -1
  447. package/dist/codex/session/warnings.js +2 -1
  448. package/dist/codex/session/warnings.js.map +1 -1
  449. package/dist/codex/simple.d.ts +1 -0
  450. package/dist/codex/simple.d.ts.map +1 -1
  451. package/dist/codex/simple.js +2 -0
  452. package/dist/codex/simple.js.map +1 -1
  453. package/dist/codex/startup-prompts.d.ts +29 -14
  454. package/dist/codex/startup-prompts.d.ts.map +1 -1
  455. package/dist/codex/startup-prompts.js +113 -93
  456. package/dist/codex/startup-prompts.js.map +1 -1
  457. package/dist/codex/startup-warnings.d.ts +10 -0
  458. package/dist/codex/startup-warnings.d.ts.map +1 -0
  459. package/dist/codex/startup-warnings.js +65 -0
  460. package/dist/codex/startup-warnings.js.map +1 -0
  461. package/dist/codex/transcript/summary.d.ts +1 -1
  462. package/dist/codex/transcript/summary.d.ts.map +1 -1
  463. package/dist/codex/transcript/summary.js +18 -7
  464. package/dist/codex/transcript/summary.js.map +1 -1
  465. package/dist/codex/transcript/types.d.ts +23 -12
  466. package/dist/codex/transcript/types.d.ts.map +1 -1
  467. package/dist/codex/transcript/watcher.d.ts.map +1 -1
  468. package/dist/codex/transcript/watcher.js +2 -1
  469. package/dist/codex/transcript/watcher.js.map +1 -1
  470. package/dist/codex/update/classification.d.ts +27 -0
  471. package/dist/codex/update/classification.d.ts.map +1 -0
  472. package/dist/codex/update/classification.js +28 -0
  473. package/dist/codex/update/classification.js.map +1 -0
  474. package/dist/codex/update/evidence.d.ts +22 -0
  475. package/dist/codex/update/evidence.d.ts.map +1 -0
  476. package/dist/codex/update/evidence.js +69 -0
  477. package/dist/codex/update/evidence.js.map +1 -0
  478. package/dist/codex/update/layout.d.ts +7 -0
  479. package/dist/codex/update/layout.d.ts.map +1 -0
  480. package/dist/codex/update/layout.js +65 -0
  481. package/dist/codex/update/layout.js.map +1 -0
  482. package/dist/codex/update/recognition.d.ts +3 -0
  483. package/dist/codex/update/recognition.d.ts.map +1 -0
  484. package/dist/codex/update/recognition.js +7 -0
  485. package/dist/codex/update/recognition.js.map +1 -0
  486. package/dist/codex/update/selection.d.ts +7 -0
  487. package/dist/codex/update/selection.d.ts.map +1 -0
  488. package/dist/codex/update/selection.js +10 -0
  489. package/dist/codex/update/selection.js.map +1 -0
  490. package/dist/codex/update/skip-attempt.d.ts +25 -0
  491. package/dist/codex/update/skip-attempt.d.ts.map +1 -0
  492. package/dist/codex/update/skip-attempt.js +64 -0
  493. package/dist/codex/update/skip-attempt.js.map +1 -0
  494. package/dist/codex/update/tracker.d.ts +37 -0
  495. package/dist/codex/update/tracker.d.ts.map +1 -0
  496. package/dist/codex/update/tracker.js +156 -0
  497. package/dist/codex/update/tracker.js.map +1 -0
  498. package/dist/codex/update-identity.d.ts +23 -0
  499. package/dist/codex/update-identity.d.ts.map +1 -0
  500. package/dist/codex/update-identity.js +46 -0
  501. package/dist/codex/update-identity.js.map +1 -0
  502. package/dist/codex/update-prompt.d.ts +26 -17
  503. package/dist/codex/update-prompt.d.ts.map +1 -1
  504. package/dist/codex/update-prompt.js +65 -62
  505. package/dist/codex/update-prompt.js.map +1 -1
  506. package/dist/core/activity/index.d.ts +24 -3
  507. package/dist/core/activity/index.d.ts.map +1 -1
  508. package/dist/core/activity/index.js.map +1 -1
  509. package/dist/core/activity/meta.d.ts +6 -1
  510. package/dist/core/activity/meta.d.ts.map +1 -1
  511. package/dist/core/activity/meta.js.map +1 -1
  512. package/dist/core/activity/transcript.d.ts +4 -1
  513. package/dist/core/activity/transcript.d.ts.map +1 -1
  514. package/dist/core/activity/transcript.js +28 -18
  515. package/dist/core/activity/transcript.js.map +1 -1
  516. package/dist/core/agent-session.d.ts +2 -1
  517. package/dist/core/agent-session.d.ts.map +1 -1
  518. package/dist/core/async-mutex.d.ts +14 -8
  519. package/dist/core/async-mutex.d.ts.map +1 -1
  520. package/dist/core/async-mutex.js +48 -12
  521. package/dist/core/async-mutex.js.map +1 -1
  522. package/dist/core/attention.d.ts +6 -2
  523. package/dist/core/attention.d.ts.map +1 -1
  524. package/dist/core/attention.js +23 -9
  525. package/dist/core/attention.js.map +1 -1
  526. package/dist/core/control-queue/admission-scan.d.ts +10 -0
  527. package/dist/core/control-queue/admission-scan.d.ts.map +1 -0
  528. package/dist/core/control-queue/admission-scan.js +28 -0
  529. package/dist/core/control-queue/admission-scan.js.map +1 -0
  530. package/dist/core/control-queue/admission.d.ts +15 -0
  531. package/dist/core/control-queue/admission.d.ts.map +1 -0
  532. package/dist/core/control-queue/admission.js +70 -0
  533. package/dist/core/control-queue/admission.js.map +1 -0
  534. package/dist/core/control-queue/budget.d.ts +15 -0
  535. package/dist/core/control-queue/budget.d.ts.map +1 -0
  536. package/dist/core/control-queue/budget.js +33 -0
  537. package/dist/core/control-queue/budget.js.map +1 -0
  538. package/dist/core/control-queue/index.d.ts +6 -3
  539. package/dist/core/control-queue/index.d.ts.map +1 -1
  540. package/dist/core/control-queue/index.js +52 -28
  541. package/dist/core/control-queue/index.js.map +1 -1
  542. package/dist/core/control-queue/scan.d.ts +10 -0
  543. package/dist/core/control-queue/scan.d.ts.map +1 -0
  544. package/dist/core/control-queue/scan.js +24 -0
  545. package/dist/core/control-queue/scan.js.map +1 -0
  546. package/dist/core/control-queue/state.d.ts +19 -3
  547. package/dist/core/control-queue/state.d.ts.map +1 -1
  548. package/dist/core/control-queue/state.js +87 -15
  549. package/dist/core/control-queue/state.js.map +1 -1
  550. package/dist/core/control-queue/submission.d.ts +8 -0
  551. package/dist/core/control-queue/submission.d.ts.map +1 -0
  552. package/dist/core/control-queue/submission.js +41 -0
  553. package/dist/core/control-queue/submission.js.map +1 -0
  554. package/dist/core/control-queue/traits.d.ts +6 -9
  555. package/dist/core/control-queue/traits.d.ts.map +1 -1
  556. package/dist/core/control-queue/traits.js +2 -15
  557. package/dist/core/control-queue/traits.js.map +1 -1
  558. package/dist/core/control-queue/types.d.ts +28 -2
  559. package/dist/core/control-queue/types.d.ts.map +1 -1
  560. package/dist/core/errors.d.ts +7 -2
  561. package/dist/core/errors.d.ts.map +1 -1
  562. package/dist/core/errors.js +7 -0
  563. package/dist/core/errors.js.map +1 -1
  564. package/dist/core/freeze-hook-event.d.ts +6 -0
  565. package/dist/core/freeze-hook-event.d.ts.map +1 -0
  566. package/dist/core/freeze-hook-event.js +16 -0
  567. package/dist/core/freeze-hook-event.js.map +1 -0
  568. package/dist/core/hook-dispatch.d.ts +3 -2
  569. package/dist/core/hook-dispatch.d.ts.map +1 -1
  570. package/dist/core/hook-dispatch.js +14 -6
  571. package/dist/core/hook-dispatch.js.map +1 -1
  572. package/dist/core/hook-observation.d.ts +24 -0
  573. package/dist/core/hook-observation.d.ts.map +1 -0
  574. package/dist/core/hook-observation.js +68 -0
  575. package/dist/core/hook-observation.js.map +1 -0
  576. package/dist/core/hook-result.d.ts +12 -2
  577. package/dist/core/hook-result.d.ts.map +1 -1
  578. package/dist/core/hook-result.js +10 -9
  579. package/dist/core/hook-result.js.map +1 -1
  580. package/dist/core/hook-timeout.d.ts.map +1 -1
  581. package/dist/core/hook-timeout.js +3 -2
  582. package/dist/core/hook-timeout.js.map +1 -1
  583. package/dist/core/images/capture.d.ts +14 -0
  584. package/dist/core/images/capture.d.ts.map +1 -0
  585. package/dist/core/images/capture.js +35 -0
  586. package/dist/core/images/capture.js.map +1 -0
  587. package/dist/core/images/chip-wait.d.ts +14 -16
  588. package/dist/core/images/chip-wait.d.ts.map +1 -1
  589. package/dist/core/images/chip-wait.js +31 -34
  590. package/dist/core/images/chip-wait.js.map +1 -1
  591. package/dist/core/images/queued-budget.d.ts +18 -0
  592. package/dist/core/images/queued-budget.d.ts.map +1 -0
  593. package/dist/core/images/queued-budget.js +41 -0
  594. package/dist/core/images/queued-budget.js.map +1 -0
  595. package/dist/core/inert-record.d.ts +3 -0
  596. package/dist/core/inert-record.d.ts.map +1 -0
  597. package/dist/core/inert-record.js +6 -0
  598. package/dist/core/inert-record.js.map +1 -0
  599. package/dist/core/input/abort.d.ts +33 -2
  600. package/dist/core/input/abort.d.ts.map +1 -1
  601. package/dist/core/input/abort.js +42 -2
  602. package/dist/core/input/abort.js.map +1 -1
  603. package/dist/core/input/clear-ack.d.ts +10 -0
  604. package/dist/core/input/clear-ack.d.ts.map +1 -0
  605. package/dist/core/input/clear-ack.js +26 -0
  606. package/dist/core/input/clear-ack.js.map +1 -0
  607. package/dist/core/input/composer-cleanup.d.ts +33 -0
  608. package/dist/core/input/composer-cleanup.d.ts.map +1 -0
  609. package/dist/core/input/composer-cleanup.js +127 -0
  610. package/dist/core/input/composer-cleanup.js.map +1 -0
  611. package/dist/core/input/constants.d.ts +12 -0
  612. package/dist/core/input/constants.d.ts.map +1 -0
  613. package/dist/core/input/constants.js +12 -0
  614. package/dist/core/input/constants.js.map +1 -0
  615. package/dist/core/input/empty-frame.d.ts +4 -0
  616. package/dist/core/input/empty-frame.d.ts.map +1 -0
  617. package/dist/core/input/empty-frame.js +15 -0
  618. package/dist/core/input/empty-frame.js.map +1 -0
  619. package/dist/core/input/index.d.ts +8 -25
  620. package/dist/core/input/index.d.ts.map +1 -1
  621. package/dist/core/input/index.js +67 -102
  622. package/dist/core/input/index.js.map +1 -1
  623. package/dist/core/input/paste-guard.d.ts +34 -0
  624. package/dist/core/input/paste-guard.d.ts.map +1 -0
  625. package/dist/core/input/paste-guard.js +2 -0
  626. package/dist/core/input/paste-guard.js.map +1 -0
  627. package/dist/core/input/paste-nudge.d.ts +10 -0
  628. package/dist/core/input/paste-nudge.d.ts.map +1 -0
  629. package/dist/core/input/paste-nudge.js +91 -0
  630. package/dist/core/input/paste-nudge.js.map +1 -0
  631. package/dist/core/input/render-observation.d.ts +3 -0
  632. package/dist/core/input/render-observation.d.ts.map +1 -0
  633. package/dist/core/input/render-observation.js +38 -0
  634. package/dist/core/input/render-observation.js.map +1 -0
  635. package/dist/core/input/render-wakeup.d.ts +10 -0
  636. package/dist/core/input/render-wakeup.d.ts.map +1 -0
  637. package/dist/core/input/render-wakeup.js +45 -0
  638. package/dist/core/input/render-wakeup.js.map +1 -0
  639. package/dist/core/input/sanitize.d.ts +11 -0
  640. package/dist/core/input/sanitize.d.ts.map +1 -0
  641. package/dist/core/input/sanitize.js +19 -0
  642. package/dist/core/input/sanitize.js.map +1 -0
  643. package/dist/core/input/staged-composer.d.ts +12 -0
  644. package/dist/core/input/staged-composer.d.ts.map +1 -0
  645. package/dist/core/input/staged-composer.js +56 -0
  646. package/dist/core/input/staged-composer.js.map +1 -0
  647. package/dist/core/input/submission-cancel.d.ts +6 -0
  648. package/dist/core/input/submission-cancel.d.ts.map +1 -0
  649. package/dist/core/input/submission-cancel.js +18 -0
  650. package/dist/core/input/submission-cancel.js.map +1 -0
  651. package/dist/core/json-shape.d.ts +2 -0
  652. package/dist/core/json-shape.d.ts.map +1 -0
  653. package/dist/core/json-shape.js +6 -0
  654. package/dist/core/json-shape.js.map +1 -0
  655. package/dist/core/json-snapshot.d.ts +10 -0
  656. package/dist/core/json-snapshot.d.ts.map +1 -0
  657. package/dist/core/json-snapshot.js +84 -0
  658. package/dist/core/json-snapshot.js.map +1 -0
  659. package/dist/core/loops/scheduler.d.ts +1 -1
  660. package/dist/core/loops/scheduler.d.ts.map +1 -1
  661. package/dist/core/loops/scheduler.js +1 -2
  662. package/dist/core/loops/scheduler.js.map +1 -1
  663. package/dist/core/models/dialog-region.d.ts +16 -0
  664. package/dist/core/models/dialog-region.d.ts.map +1 -0
  665. package/dist/core/models/dialog-region.js +133 -0
  666. package/dist/core/models/dialog-region.js.map +1 -0
  667. package/dist/core/models/input.d.ts +1 -1
  668. package/dist/core/models/input.d.ts.map +1 -1
  669. package/dist/core/models/input.js.map +1 -1
  670. package/dist/core/models/intervention.d.ts +3 -0
  671. package/dist/core/models/intervention.d.ts.map +1 -0
  672. package/dist/core/models/intervention.js +12 -0
  673. package/dist/core/models/intervention.js.map +1 -0
  674. package/dist/core/models/picker.d.ts +14 -1
  675. package/dist/core/models/picker.d.ts.map +1 -1
  676. package/dist/core/models/picker.js +27 -6
  677. package/dist/core/models/picker.js.map +1 -1
  678. package/dist/core/models/rows.d.ts +42 -2
  679. package/dist/core/models/rows.d.ts.map +1 -1
  680. package/dist/core/models/rows.js +30 -3
  681. package/dist/core/models/rows.js.map +1 -1
  682. package/dist/core/models/tui-screen.d.ts +11 -1
  683. package/dist/core/models/tui-screen.d.ts.map +1 -1
  684. package/dist/core/models/tui-screen.js +22 -4
  685. package/dist/core/models/tui-screen.js.map +1 -1
  686. package/dist/core/module-require.d.ts +1 -1
  687. package/dist/core/module-require.js +1 -1
  688. package/dist/core/persona.d.ts +5 -4
  689. package/dist/core/persona.d.ts.map +1 -1
  690. package/dist/core/persona.js +18 -3
  691. package/dist/core/persona.js.map +1 -1
  692. package/dist/core/predicates.d.ts +9 -1
  693. package/dist/core/predicates.d.ts.map +1 -1
  694. package/dist/core/predicates.js +12 -2
  695. package/dist/core/predicates.js.map +1 -1
  696. package/dist/core/questions/abort.d.ts +2 -0
  697. package/dist/core/questions/abort.d.ts.map +1 -0
  698. package/dist/core/questions/abort.js +21 -0
  699. package/dist/core/questions/abort.js.map +1 -0
  700. package/dist/core/questions/activity-fields.d.ts +5 -0
  701. package/dist/core/questions/activity-fields.d.ts.map +1 -0
  702. package/dist/core/questions/activity-fields.js +15 -0
  703. package/dist/core/questions/activity-fields.js.map +1 -0
  704. package/dist/core/questions/activity.d.ts +6 -0
  705. package/dist/core/questions/activity.d.ts.map +1 -0
  706. package/dist/core/questions/activity.js +2 -0
  707. package/dist/core/questions/activity.js.map +1 -0
  708. package/dist/core/questions/adapter.d.ts +15 -0
  709. package/dist/core/questions/adapter.d.ts.map +1 -0
  710. package/dist/core/questions/adapter.js +2 -0
  711. package/dist/core/questions/adapter.js.map +1 -0
  712. package/dist/core/questions/attempt.d.ts +26 -0
  713. package/dist/core/questions/attempt.d.ts.map +1 -0
  714. package/dist/core/questions/attempt.js +85 -0
  715. package/dist/core/questions/attempt.js.map +1 -0
  716. package/dist/core/questions/controller.d.ts +24 -0
  717. package/dist/core/questions/controller.d.ts.map +1 -0
  718. package/dist/core/questions/controller.js +83 -0
  719. package/dist/core/questions/controller.js.map +1 -0
  720. package/dist/core/questions/correlation.d.ts +8 -0
  721. package/dist/core/questions/correlation.d.ts.map +1 -0
  722. package/dist/core/questions/correlation.js +11 -0
  723. package/dist/core/questions/correlation.js.map +1 -0
  724. package/dist/core/questions/cursor-provenance.d.ts +12 -0
  725. package/dist/core/questions/cursor-provenance.d.ts.map +1 -0
  726. package/dist/core/questions/cursor-provenance.js +19 -0
  727. package/dist/core/questions/cursor-provenance.js.map +1 -0
  728. package/dist/core/questions/deadline.d.ts +2 -0
  729. package/dist/core/questions/deadline.d.ts.map +1 -0
  730. package/dist/core/questions/deadline.js +11 -0
  731. package/dist/core/questions/deadline.js.map +1 -0
  732. package/dist/core/questions/dispatch.d.ts +17 -0
  733. package/dist/core/questions/dispatch.d.ts.map +1 -0
  734. package/dist/core/questions/dispatch.js +46 -0
  735. package/dist/core/questions/dispatch.js.map +1 -0
  736. package/dist/core/questions/errors.d.ts +8 -0
  737. package/dist/core/questions/errors.d.ts.map +1 -0
  738. package/dist/core/questions/errors.js +10 -0
  739. package/dist/core/questions/errors.js.map +1 -0
  740. package/dist/core/questions/input.d.ts +13 -0
  741. package/dist/core/questions/input.d.ts.map +1 -0
  742. package/dist/core/questions/input.js +93 -0
  743. package/dist/core/questions/input.js.map +1 -0
  744. package/dist/core/questions/io.d.ts +23 -0
  745. package/dist/core/questions/io.d.ts.map +1 -0
  746. package/dist/core/questions/io.js +2 -0
  747. package/dist/core/questions/io.js.map +1 -0
  748. package/dist/core/questions/notification-errors.d.ts +14 -0
  749. package/dist/core/questions/notification-errors.d.ts.map +1 -0
  750. package/dist/core/questions/notification-errors.js +45 -0
  751. package/dist/core/questions/notification-errors.js.map +1 -0
  752. package/dist/core/questions/observers.d.ts +17 -0
  753. package/dist/core/questions/observers.d.ts.map +1 -0
  754. package/dist/core/questions/observers.js +57 -0
  755. package/dist/core/questions/observers.js.map +1 -0
  756. package/dist/core/questions/registry.d.ts +35 -0
  757. package/dist/core/questions/registry.d.ts.map +1 -0
  758. package/dist/core/questions/registry.js +158 -0
  759. package/dist/core/questions/registry.js.map +1 -0
  760. package/dist/core/questions/transaction.d.ts +23 -0
  761. package/dist/core/questions/transaction.d.ts.map +1 -0
  762. package/dist/core/questions/transaction.js +97 -0
  763. package/dist/core/questions/transaction.js.map +1 -0
  764. package/dist/core/questions/types.d.ts +62 -0
  765. package/dist/core/questions/types.d.ts.map +1 -0
  766. package/dist/core/questions/types.js +2 -0
  767. package/dist/core/questions/types.js.map +1 -0
  768. package/dist/core/questions/validate.d.ts +16 -0
  769. package/dist/core/questions/validate.d.ts.map +1 -0
  770. package/dist/core/questions/validate.js +95 -0
  771. package/dist/core/questions/validate.js.map +1 -0
  772. package/dist/core/rendered-observers.d.ts +7 -2
  773. package/dist/core/rendered-observers.d.ts.map +1 -1
  774. package/dist/core/rendered-observers.js +44 -10
  775. package/dist/core/rendered-observers.js.map +1 -1
  776. package/dist/core/screen-facts.d.ts +8 -3
  777. package/dist/core/screen-facts.d.ts.map +1 -1
  778. package/dist/core/screen-facts.js +6 -3
  779. package/dist/core/screen-facts.js.map +1 -1
  780. package/dist/core/simple/boundary-observer.d.ts +30 -0
  781. package/dist/core/simple/boundary-observer.d.ts.map +1 -0
  782. package/dist/core/simple/boundary-observer.js +111 -0
  783. package/dist/core/simple/boundary-observer.js.map +1 -0
  784. package/dist/core/simple/boundary-signal.d.ts +31 -0
  785. package/dist/core/simple/boundary-signal.d.ts.map +1 -0
  786. package/dist/core/simple/boundary-signal.js +19 -0
  787. package/dist/core/simple/boundary-signal.js.map +1 -0
  788. package/dist/core/simple/captured-input.d.ts +19 -0
  789. package/dist/core/simple/captured-input.d.ts.map +1 -0
  790. package/dist/core/simple/captured-input.js +78 -0
  791. package/dist/core/simple/captured-input.js.map +1 -0
  792. package/dist/core/simple/close.d.ts +6 -0
  793. package/dist/core/simple/close.d.ts.map +1 -0
  794. package/dist/core/simple/close.js +20 -0
  795. package/dist/core/simple/close.js.map +1 -0
  796. package/dist/core/simple/events.d.ts +2 -2
  797. package/dist/core/simple/events.js +2 -2
  798. package/dist/core/simple/loop-boundary.d.ts +12 -0
  799. package/dist/core/simple/loop-boundary.d.ts.map +1 -0
  800. package/dist/core/simple/loop-boundary.js +68 -0
  801. package/dist/core/simple/loop-boundary.js.map +1 -0
  802. package/dist/core/simple/loop-hold.d.ts +7 -0
  803. package/dist/core/simple/loop-hold.d.ts.map +1 -0
  804. package/dist/core/simple/loop-hold.js +9 -0
  805. package/dist/core/simple/loop-hold.js.map +1 -0
  806. package/dist/core/simple/native-boundary.d.ts +15 -0
  807. package/dist/core/simple/native-boundary.d.ts.map +1 -0
  808. package/dist/core/simple/native-boundary.js +18 -0
  809. package/dist/core/simple/native-boundary.js.map +1 -0
  810. package/dist/core/simple/native-idle.d.ts +17 -0
  811. package/dist/core/simple/native-idle.d.ts.map +1 -0
  812. package/dist/core/simple/native-idle.js +25 -0
  813. package/dist/core/simple/native-idle.js.map +1 -0
  814. package/dist/core/simple/observe-boundary.d.ts +28 -0
  815. package/dist/core/simple/observe-boundary.d.ts.map +1 -0
  816. package/dist/core/simple/observe-boundary.js +13 -0
  817. package/dist/core/simple/observe-boundary.js.map +1 -0
  818. package/dist/core/simple/owned-loop.d.ts +8 -0
  819. package/dist/core/simple/owned-loop.d.ts.map +1 -0
  820. package/dist/core/simple/owned-loop.js +42 -0
  821. package/dist/core/simple/owned-loop.js.map +1 -0
  822. package/dist/core/simple/session.d.ts +7 -7
  823. package/dist/core/simple/session.d.ts.map +1 -1
  824. package/dist/core/simple/session.js +20 -33
  825. package/dist/core/simple/session.js.map +1 -1
  826. package/dist/core/simple/submission-context.d.ts +13 -0
  827. package/dist/core/simple/submission-context.d.ts.map +1 -0
  828. package/dist/core/simple/submission-context.js +35 -0
  829. package/dist/core/simple/submission-context.js.map +1 -0
  830. package/dist/core/simple/turn/bounds.d.ts +22 -0
  831. package/dist/core/simple/turn/bounds.d.ts.map +1 -0
  832. package/dist/core/simple/turn/bounds.js +22 -0
  833. package/dist/core/simple/turn/bounds.js.map +1 -0
  834. package/dist/core/simple/turn/defaults.d.ts +24 -0
  835. package/dist/core/simple/turn/defaults.d.ts.map +1 -0
  836. package/dist/core/simple/turn/defaults.js +34 -0
  837. package/dist/core/simple/turn/defaults.js.map +1 -0
  838. package/dist/core/simple/turn-acceptance.d.ts +20 -3
  839. package/dist/core/simple/turn-acceptance.d.ts.map +1 -1
  840. package/dist/core/simple/turn-acceptance.js +55 -5
  841. package/dist/core/simple/turn-acceptance.js.map +1 -1
  842. package/dist/core/simple/turn-boundary.d.ts +7 -2
  843. package/dist/core/simple/turn-boundary.d.ts.map +1 -1
  844. package/dist/core/simple/turn-boundary.js +17 -5
  845. package/dist/core/simple/turn-boundary.js.map +1 -1
  846. package/dist/core/simple/turn-gate.d.ts.map +1 -1
  847. package/dist/core/simple/turn-gate.js +1 -11
  848. package/dist/core/simple/turn-gate.js.map +1 -1
  849. package/dist/core/simple/turn-identity.d.ts +28 -0
  850. package/dist/core/simple/turn-identity.d.ts.map +1 -0
  851. package/dist/core/simple/turn-identity.js +74 -0
  852. package/dist/core/simple/turn-identity.js.map +1 -0
  853. package/dist/core/simple/turn-types.d.ts +11 -4
  854. package/dist/core/simple/turn-types.d.ts.map +1 -1
  855. package/dist/core/simple/turn-types.js +1 -6
  856. package/dist/core/simple/turn-types.js.map +1 -1
  857. package/dist/core/simple/turn.d.ts +7 -30
  858. package/dist/core/simple/turn.d.ts.map +1 -1
  859. package/dist/core/simple/turn.js +75 -75
  860. package/dist/core/simple/turn.js.map +1 -1
  861. package/dist/core/startup/barrier.d.ts +37 -0
  862. package/dist/core/startup/barrier.d.ts.map +1 -0
  863. package/dist/core/startup/barrier.js +59 -0
  864. package/dist/core/startup/barrier.js.map +1 -0
  865. package/dist/core/startup/frame.d.ts +2 -0
  866. package/dist/core/startup/frame.d.ts.map +1 -1
  867. package/dist/core/startup/frame.js +12 -0
  868. package/dist/core/startup/frame.js.map +1 -1
  869. package/dist/core/startup/warnings.d.ts +5 -0
  870. package/dist/core/startup/warnings.d.ts.map +1 -0
  871. package/dist/core/startup/warnings.js +14 -0
  872. package/dist/core/startup/warnings.js.map +1 -0
  873. package/dist/core/startup/write.d.ts +13 -11
  874. package/dist/core/startup/write.d.ts.map +1 -1
  875. package/dist/core/startup/write.js +12 -5
  876. package/dist/core/startup/write.js.map +1 -1
  877. package/dist/core/stop-input.d.ts +19 -0
  878. package/dist/core/stop-input.d.ts.map +1 -0
  879. package/dist/core/stop-input.js +47 -0
  880. package/dist/core/stop-input.js.map +1 -0
  881. package/dist/core/terminal-options.d.ts +13 -3
  882. package/dist/core/terminal-options.d.ts.map +1 -1
  883. package/dist/core/terminal-options.js +17 -7
  884. package/dist/core/terminal-options.js.map +1 -1
  885. package/dist/core/terminal-replay.d.ts +1 -0
  886. package/dist/core/terminal-replay.d.ts.map +1 -1
  887. package/dist/core/terminal-replay.js +6 -0
  888. package/dist/core/terminal-replay.js.map +1 -1
  889. package/dist/core/timers.d.ts +15 -0
  890. package/dist/core/timers.d.ts.map +1 -0
  891. package/dist/core/timers.js +17 -0
  892. package/dist/core/timers.js.map +1 -0
  893. package/dist/core/trust/allowlist.d.ts +24 -1
  894. package/dist/core/trust/allowlist.d.ts.map +1 -1
  895. package/dist/core/trust/allowlist.js +39 -12
  896. package/dist/core/trust/allowlist.js.map +1 -1
  897. package/dist/core/trust/blocking.d.ts +21 -10
  898. package/dist/core/trust/blocking.d.ts.map +1 -1
  899. package/dist/core/trust/blocking.js +64 -18
  900. package/dist/core/trust/blocking.js.map +1 -1
  901. package/dist/core/trust/clearance.d.ts +20 -0
  902. package/dist/core/trust/clearance.d.ts.map +1 -0
  903. package/dist/core/trust/clearance.js +25 -0
  904. package/dist/core/trust/clearance.js.map +1 -0
  905. package/dist/core/trust/copy.d.ts +19 -0
  906. package/dist/core/trust/copy.d.ts.map +1 -0
  907. package/dist/core/trust/copy.js +23 -0
  908. package/dist/core/trust/copy.js.map +1 -0
  909. package/dist/core/trust/dialog.d.ts +28 -0
  910. package/dist/core/trust/dialog.d.ts.map +1 -0
  911. package/dist/core/trust/dialog.js +96 -0
  912. package/dist/core/trust/dialog.js.map +1 -0
  913. package/dist/core/trust/options.d.ts +9 -0
  914. package/dist/core/trust/options.d.ts.map +1 -0
  915. package/dist/core/trust/options.js +9 -0
  916. package/dist/core/trust/options.js.map +1 -0
  917. package/dist/core/trust/prompts.d.ts +16 -37
  918. package/dist/core/trust/prompts.d.ts.map +1 -1
  919. package/dist/core/trust/prompts.js +10 -18
  920. package/dist/core/trust/prompts.js.map +1 -1
  921. package/dist/core/trust/responder.d.ts +27 -45
  922. package/dist/core/trust/responder.d.ts.map +1 -1
  923. package/dist/core/trust/responder.js +178 -108
  924. package/dist/core/trust/responder.js.map +1 -1
  925. package/dist/core/trust/types.d.ts +36 -0
  926. package/dist/core/trust/types.d.ts.map +1 -0
  927. package/dist/core/trust/types.js +17 -0
  928. package/dist/core/trust/types.js.map +1 -0
  929. package/dist/core/trust/view.d.ts +31 -0
  930. package/dist/core/trust/view.d.ts.map +1 -0
  931. package/dist/core/trust/view.js +52 -0
  932. package/dist/core/trust/view.js.map +1 -0
  933. package/dist/core/trust/write.d.ts +31 -0
  934. package/dist/core/trust/write.d.ts.map +1 -0
  935. package/dist/core/trust/write.js +148 -0
  936. package/dist/core/trust/write.js.map +1 -0
  937. package/dist/core/turn-state.d.ts +6 -0
  938. package/dist/core/turn-state.d.ts.map +1 -1
  939. package/dist/core/turn-state.js +31 -1
  940. package/dist/core/turn-state.js.map +1 -1
  941. package/dist/core/types.d.ts +4 -2
  942. package/dist/core/types.d.ts.map +1 -1
  943. package/dist/core/warnings/auth.d.ts +25 -0
  944. package/dist/core/warnings/auth.d.ts.map +1 -0
  945. package/dist/core/warnings/auth.js +2 -0
  946. package/dist/core/warnings/auth.js.map +1 -0
  947. package/dist/core/warnings/index.d.ts +9 -16
  948. package/dist/core/warnings/index.d.ts.map +1 -1
  949. package/dist/core/warnings/index.js +2 -3
  950. package/dist/core/warnings/index.js.map +1 -1
  951. package/dist/core/warnings/lifecycle.d.ts +25 -1
  952. package/dist/core/warnings/lifecycle.d.ts.map +1 -1
  953. package/dist/core/warnings/lifecycle.js +1 -1
  954. package/dist/core/warnings/questions.d.ts +23 -0
  955. package/dist/core/warnings/questions.d.ts.map +1 -0
  956. package/dist/core/warnings/questions.js +2 -0
  957. package/dist/core/warnings/questions.js.map +1 -0
  958. package/dist/core/warnings/session.d.ts +3 -2
  959. package/dist/core/warnings/session.d.ts.map +1 -1
  960. package/dist/core/warnings/session.js +3 -2
  961. package/dist/core/warnings/session.js.map +1 -1
  962. package/dist/core/warnings/transcript.d.ts +12 -0
  963. package/dist/core/warnings/transcript.d.ts.map +1 -0
  964. package/dist/core/warnings/transcript.js +2 -0
  965. package/dist/core/warnings/transcript.js.map +1 -0
  966. package/dist/core/warnings/update.d.ts +11 -2
  967. package/dist/core/warnings/update.d.ts.map +1 -1
  968. package/dist/core/warnings/update.js +27 -4
  969. package/dist/core/warnings/update.js.map +1 -1
  970. package/dist/events/emitter.d.ts +18 -2
  971. package/dist/events/emitter.d.ts.map +1 -1
  972. package/dist/events/emitter.js +61 -14
  973. package/dist/events/emitter.js.map +1 -1
  974. package/dist/events/observer-errors.d.ts +9 -0
  975. package/dist/events/observer-errors.d.ts.map +1 -0
  976. package/dist/events/observer-errors.js +68 -0
  977. package/dist/events/observer-errors.js.map +1 -0
  978. package/dist/index.d.ts +1 -0
  979. package/dist/index.d.ts.map +1 -1
  980. package/dist/pty/node.d.ts.map +1 -1
  981. package/dist/pty/node.js +4 -0
  982. package/dist/pty/node.js.map +1 -1
  983. package/dist/pty/types.d.ts +5 -0
  984. package/dist/pty/types.d.ts.map +1 -1
  985. package/dist/runtime/probe-cleanup.d.ts +34 -0
  986. package/dist/runtime/probe-cleanup.d.ts.map +1 -0
  987. package/dist/runtime/probe-cleanup.js +139 -0
  988. package/dist/runtime/probe-cleanup.js.map +1 -0
  989. package/dist/runtime/probe.d.ts.map +1 -1
  990. package/dist/runtime/probe.js +18 -25
  991. package/dist/runtime/probe.js.map +1 -1
  992. package/dist/runtime/readiness/initial-ready.d.ts +13 -11
  993. package/dist/runtime/readiness/initial-ready.d.ts.map +1 -1
  994. package/dist/runtime/readiness/initial-ready.js +23 -18
  995. package/dist/runtime/readiness/initial-ready.js.map +1 -1
  996. package/dist/runtime/seams.d.ts +2 -1
  997. package/dist/runtime/seams.d.ts.map +1 -1
  998. package/dist/runtime/seams.js.map +1 -1
  999. package/dist/runtime/session/attention-clearance.d.ts +5 -0
  1000. package/dist/runtime/session/attention-clearance.d.ts.map +1 -0
  1001. package/dist/runtime/session/attention-clearance.js +20 -0
  1002. package/dist/runtime/session/attention-clearance.js.map +1 -0
  1003. package/dist/runtime/session/base.d.ts +17 -4
  1004. package/dist/runtime/session/base.d.ts.map +1 -1
  1005. package/dist/runtime/session/base.js +70 -14
  1006. package/dist/runtime/session/base.js.map +1 -1
  1007. package/dist/runtime/session/commands.d.ts +17 -3
  1008. package/dist/runtime/session/commands.d.ts.map +1 -1
  1009. package/dist/runtime/session/commands.js +60 -13
  1010. package/dist/runtime/session/commands.js.map +1 -1
  1011. package/dist/runtime/session/foreign-picker.d.ts +8 -0
  1012. package/dist/runtime/session/foreign-picker.d.ts.map +1 -0
  1013. package/dist/runtime/session/foreign-picker.js +18 -0
  1014. package/dist/runtime/session/foreign-picker.js.map +1 -0
  1015. package/dist/runtime/session/frames.d.ts +27 -0
  1016. package/dist/runtime/session/frames.d.ts.map +1 -0
  1017. package/dist/runtime/session/frames.js +80 -0
  1018. package/dist/runtime/session/frames.js.map +1 -0
  1019. package/dist/runtime/session/image-attach.d.ts +3 -15
  1020. package/dist/runtime/session/image-attach.d.ts.map +1 -1
  1021. package/dist/runtime/session/image-attach.js +9 -27
  1022. package/dist/runtime/session/image-attach.js.map +1 -1
  1023. package/dist/runtime/session/lifecycle.d.ts +20 -14
  1024. package/dist/runtime/session/lifecycle.d.ts.map +1 -1
  1025. package/dist/runtime/session/lifecycle.js +49 -47
  1026. package/dist/runtime/session/lifecycle.js.map +1 -1
  1027. package/dist/runtime/session/loops.d.ts +10 -1
  1028. package/dist/runtime/session/loops.d.ts.map +1 -1
  1029. package/dist/runtime/session/loops.js +61 -19
  1030. package/dist/runtime/session/loops.js.map +1 -1
  1031. package/dist/runtime/session/native-submission.d.ts +10 -0
  1032. package/dist/runtime/session/native-submission.d.ts.map +1 -0
  1033. package/dist/runtime/session/native-submission.js +62 -0
  1034. package/dist/runtime/session/native-submission.js.map +1 -0
  1035. package/dist/runtime/session/not-running.d.ts +13 -0
  1036. package/dist/runtime/session/not-running.d.ts.map +1 -0
  1037. package/dist/runtime/session/not-running.js +28 -0
  1038. package/dist/runtime/session/not-running.js.map +1 -0
  1039. package/dist/runtime/session/paste-recovery.d.ts +15 -0
  1040. package/dist/runtime/session/paste-recovery.d.ts.map +1 -0
  1041. package/dist/runtime/session/paste-recovery.js +30 -0
  1042. package/dist/runtime/session/paste-recovery.js.map +1 -0
  1043. package/dist/runtime/session/picker-cleanup.d.ts +56 -0
  1044. package/dist/runtime/session/picker-cleanup.d.ts.map +1 -0
  1045. package/dist/runtime/session/picker-cleanup.js +126 -0
  1046. package/dist/runtime/session/picker-cleanup.js.map +1 -0
  1047. package/dist/runtime/session/picker-input.d.ts +17 -0
  1048. package/dist/runtime/session/picker-input.d.ts.map +1 -0
  1049. package/dist/runtime/session/picker-input.js +74 -0
  1050. package/dist/runtime/session/picker-input.js.map +1 -0
  1051. package/dist/runtime/session/picker.d.ts +56 -0
  1052. package/dist/runtime/session/picker.d.ts.map +1 -0
  1053. package/dist/runtime/session/picker.js +143 -0
  1054. package/dist/runtime/session/picker.js.map +1 -0
  1055. package/dist/runtime/session/questions.d.ts +23 -0
  1056. package/dist/runtime/session/questions.d.ts.map +1 -0
  1057. package/dist/runtime/session/questions.js +25 -0
  1058. package/dist/runtime/session/questions.js.map +1 -0
  1059. package/dist/runtime/session/readiness.d.ts +6 -3
  1060. package/dist/runtime/session/readiness.d.ts.map +1 -1
  1061. package/dist/runtime/session/readiness.js +19 -8
  1062. package/dist/runtime/session/readiness.js.map +1 -1
  1063. package/dist/runtime/session/shutdown-binding.d.ts +9 -0
  1064. package/dist/runtime/session/shutdown-binding.d.ts.map +1 -1
  1065. package/dist/runtime/session/shutdown-binding.js +57 -8
  1066. package/dist/runtime/session/shutdown-binding.js.map +1 -1
  1067. package/dist/runtime/session/shutdown.d.ts +2 -5
  1068. package/dist/runtime/session/shutdown.d.ts.map +1 -1
  1069. package/dist/runtime/session/shutdown.js +12 -13
  1070. package/dist/runtime/session/shutdown.js.map +1 -1
  1071. package/dist/runtime/session/status-wiring.d.ts +9 -4
  1072. package/dist/runtime/session/status-wiring.d.ts.map +1 -1
  1073. package/dist/runtime/session/status-wiring.js +8 -5
  1074. package/dist/runtime/session/status-wiring.js.map +1 -1
  1075. package/dist/runtime/session/stop-completion.d.ts +23 -0
  1076. package/dist/runtime/session/stop-completion.d.ts.map +1 -0
  1077. package/dist/runtime/session/stop-completion.js +32 -0
  1078. package/dist/runtime/session/stop-completion.js.map +1 -0
  1079. package/dist/runtime/session/turn-submission.d.ts +9 -0
  1080. package/dist/runtime/session/turn-submission.d.ts.map +1 -0
  1081. package/dist/runtime/session/turn-submission.js +19 -0
  1082. package/dist/runtime/session/turn-submission.js.map +1 -0
  1083. package/dist/runtime/shutdown/terminal.d.ts +10 -0
  1084. package/dist/runtime/shutdown/terminal.d.ts.map +1 -0
  1085. package/dist/runtime/shutdown/terminal.js +38 -0
  1086. package/dist/runtime/shutdown/terminal.js.map +1 -0
  1087. package/dist/runtime/startup/buffer.d.ts +1 -1
  1088. package/dist/runtime/startup/buffer.d.ts.map +1 -1
  1089. package/dist/runtime/startup/buffer.js +14 -8
  1090. package/dist/runtime/startup/buffer.js.map +1 -1
  1091. package/dist/runtime/status-evidence.d.ts +7 -3
  1092. package/dist/runtime/status-evidence.d.ts.map +1 -1
  1093. package/dist/runtime/status-evidence.js +12 -10
  1094. package/dist/runtime/status-evidence.js.map +1 -1
  1095. package/dist/runtime/update/lock.d.ts +7 -0
  1096. package/dist/runtime/update/lock.d.ts.map +1 -1
  1097. package/dist/runtime/update/lock.js +102 -121
  1098. package/dist/runtime/update/lock.js.map +1 -1
  1099. package/dist/runtime/update/owner.d.ts +54 -0
  1100. package/dist/runtime/update/owner.d.ts.map +1 -0
  1101. package/dist/runtime/update/owner.js +131 -0
  1102. package/dist/runtime/update/owner.js.map +1 -0
  1103. package/dist/runtime/update/retained-lease.d.ts +13 -0
  1104. package/dist/runtime/update/retained-lease.d.ts.map +1 -0
  1105. package/dist/runtime/update/retained-lease.js +40 -0
  1106. package/dist/runtime/update/retained-lease.js.map +1 -0
  1107. package/dist/runtime/update/waiting.d.ts +4 -0
  1108. package/dist/runtime/update/waiting.d.ts.map +1 -0
  1109. package/dist/runtime/update/waiting.js +95 -0
  1110. package/dist/runtime/update/waiting.js.map +1 -0
  1111. package/dist/state/canonical-path.d.ts +2 -0
  1112. package/dist/state/canonical-path.d.ts.map +1 -0
  1113. package/dist/state/canonical-path.js +22 -0
  1114. package/dist/state/canonical-path.js.map +1 -0
  1115. package/dist/state/launch-ownership.d.ts +21 -0
  1116. package/dist/state/launch-ownership.d.ts.map +1 -0
  1117. package/dist/state/launch-ownership.js +154 -0
  1118. package/dist/state/launch-ownership.js.map +1 -0
  1119. package/dist/state/launch-publication.d.ts +7 -0
  1120. package/dist/state/launch-publication.d.ts.map +1 -0
  1121. package/dist/state/launch-publication.js +53 -0
  1122. package/dist/state/launch-publication.js.map +1 -0
  1123. package/dist/state/private-read.js +2 -1
  1124. package/dist/state/private-read.js.map +1 -1
  1125. package/dist/state/private-session.d.ts +1 -1
  1126. package/dist/state/private-session.d.ts.map +1 -1
  1127. package/dist/state/private-session.js +4 -1
  1128. package/dist/state/private-session.js.map +1 -1
  1129. package/dist/state/runtime-paths.d.ts +10 -9
  1130. package/dist/state/runtime-paths.d.ts.map +1 -1
  1131. package/dist/state/runtime-paths.js +14 -12
  1132. package/dist/state/runtime-paths.js.map +1 -1
  1133. package/dist/state/socket-home.d.ts +8 -4
  1134. package/dist/state/socket-home.d.ts.map +1 -1
  1135. package/dist/state/socket-home.js +31 -7
  1136. package/dist/state/socket-home.js.map +1 -1
  1137. package/dist/state/startup-ownership.d.ts +4 -0
  1138. package/dist/state/startup-ownership.d.ts.map +1 -0
  1139. package/dist/state/startup-ownership.js +14 -0
  1140. package/dist/state/startup-ownership.js.map +1 -0
  1141. package/dist/state/store.d.ts +1 -1
  1142. package/dist/state/store.d.ts.map +1 -1
  1143. package/dist/state/store.js +2 -2
  1144. package/dist/state/store.js.map +1 -1
  1145. package/dist/terminal/coordinates.d.ts +7 -0
  1146. package/dist/terminal/coordinates.d.ts.map +1 -0
  1147. package/dist/terminal/coordinates.js +6 -0
  1148. package/dist/terminal/coordinates.js.map +1 -0
  1149. package/dist/terminal/cursor.d.ts +40 -0
  1150. package/dist/terminal/cursor.d.ts.map +1 -0
  1151. package/dist/terminal/cursor.js +151 -0
  1152. package/dist/terminal/cursor.js.map +1 -0
  1153. package/dist/terminal/headless.d.ts +7 -5
  1154. package/dist/terminal/headless.d.ts.map +1 -1
  1155. package/dist/terminal/headless.js +47 -35
  1156. package/dist/terminal/headless.js.map +1 -1
  1157. package/dist/terminal/pty-output.d.ts +37 -0
  1158. package/dist/terminal/pty-output.d.ts.map +1 -0
  1159. package/dist/terminal/pty-output.js +109 -0
  1160. package/dist/terminal/pty-output.js.map +1 -0
  1161. package/dist/terminal/render-queue.d.ts +30 -0
  1162. package/dist/terminal/render-queue.d.ts.map +1 -0
  1163. package/dist/terminal/render-queue.js +105 -0
  1164. package/dist/terminal/render-queue.js.map +1 -0
  1165. package/dist/terminal/snapshot.d.ts +5 -0
  1166. package/dist/terminal/snapshot.d.ts.map +1 -0
  1167. package/dist/terminal/snapshot.js +13 -0
  1168. package/dist/terminal/snapshot.js.map +1 -0
  1169. package/docs/api.md +8 -1
  1170. package/docs/cli-behavior.md +930 -43
  1171. package/docs/cli-output.md +4 -0
  1172. package/docs/cli.md +15 -9
  1173. package/docs/codex/cli.md +44 -0
  1174. package/docs/embedding.md +7 -0
  1175. package/docs/login-recovery.md +24 -0
  1176. package/docs/native-question-proofs.md +57 -0
  1177. package/docs/performance/terminal-engines.md +88 -0
  1178. package/docs/performance.md +193 -0
  1179. package/docs/questions.md +181 -0
  1180. package/package.json +1 -1
  1181. package/prd/04-architecture.md +15 -0
  1182. package/prd/05-api/5.1-starting-claude.md +11 -1
  1183. package/prd/05-api/5.10-questions.md +117 -0
  1184. package/prd/05-api/5.3-claude-session-api.md +293 -24
  1185. package/prd/05-api/5.4-events.md +159 -32
  1186. package/prd/05-api/5.5-starting-codex.md +85 -18
  1187. package/prd/05-api/5.7-codex-session-api.md +143 -5
  1188. package/prd/05-api/5.8-session-api.md +58 -6
  1189. package/prd/05-api/5.9-loops.md +11 -1
  1190. package/prd/05-api/README.md +2 -0
  1191. package/prd/06-claude-hook-bridge.md +115 -0
  1192. package/prd/07-claude-policy.md +2 -0
  1193. package/prd/07a-codex-hook-bridge.md +90 -0
  1194. package/prd/08-state.md +51 -10
  1195. package/prd/09-lifecycle.md +79 -3
  1196. package/prd/10-errors.md +9 -2
  1197. package/prd/12a-cli.md +13 -7
  1198. package/prd/13-latitude.md +89 -0
  1199. package/prd/14-conformance.md +84 -30
  1200. package/prd/16-maintainer-review.md +75 -0
  1201. package/prd/README.md +1 -0
@@ -20,8 +20,34 @@ When a fact drives an implementation decision, the code and the matching PRD
20
20
  conformance criterion are cited. If you change behavior here, update `prd/`
21
21
  first (see `CLAUDE.md` / `AGENTS.md`), then this file.
22
22
 
23
+ ## Approval policy compatibility
24
+
25
+ Codex 0.155.1 rejects `--ask-for-approval untrusted`; its accepted values are
26
+ `on-request` and `never`. Real approval-flow tests on this version use `on-request`
27
+ with a read-only sandbox and a tool that needs to write, then approve the native
28
+ escalation dialog. An `untrusted` fixture exits before readiness and cannot test
29
+ working-dialog clearance. Verified from the installed CLI's argument error on
30
+ 2026-09-19 while exercising C-ATTN-02.
31
+
23
32
  ## Readiness
24
33
 
34
+ **Codex 0.159.2 adds a warning counter to its shortcuts footer.** A bounded
35
+ invalid-model cold-start probe on 2026-10-01 captured `? for shortcuts` followed
36
+ on the same row by `⚠ 3 warnings · f2 to view`, below the model footer and empty
37
+ `› Ask Codex to do anything` composer. Its animated welcome said “Follow the
38
+ white cursor.” The existing footer grammar rejects this captured row. The trace separately
39
+ showed a retained trust episode and a held 10-second readiness deadline; it did
40
+ not capture each observed frame, so it cannot attribute the original gate or
41
+ prove that this final snapshot was the frame at that deadline. No submission Enter or UserPromptSubmit occurred,
42
+ so the probe establishes startup layout/readiness evidence, not hook/transcript
43
+ ordering. Clearance accepts the bounded native warning-count suffix while still
44
+ requiring current settled frame, visible input cursor, native model chrome, and
45
+ absence of active dialogs or work. A follow-up probe with this grammar recorded
46
+ folder trust followed by the warning-bearing composer: the trust hold cleared,
47
+ and both cold and resumed sessions reached ready and delivered exactly one
48
+ invalid-model submission with one `UserPromptSubmit` each. No valid model was
49
+ used. C-API-28, C-TRUST-01.
50
+
25
51
  **Codex fires its `SessionStart` hook lazily — on the first turn, not at boot.**
26
52
  Any experiment that waits for a boot-time Codex hook *without running a turn* is
27
53
  invalid and will conclude the hook "never fires". (This once produced a false
@@ -106,6 +132,17 @@ misattributed to a CLI regression.)
106
132
 
107
133
  ## Turn boundaries (rendered TUI)
108
134
 
135
+ - **Claude 2.1.281 can use `◐ Claude Code` as its OSC working title.** A native
136
+ 173×35 capture on 2026-09-23 showed `✻ Wandering… (0s)` above a fenced empty
137
+ composer, with a visible cursor at column 2, row 15 (zero-based), and no
138
+ `esc to interrupt` footer. The preceding frame showed a running
139
+ `UserPromptSubmit` hook with the same title. The session later reached a usage
140
+ limit; this capture proves working-title geometry, not a successful answer.
141
+ `tests/fixtures/claude-2.1.281/working.txt` retains the nonempty captured rows
142
+ with the temporary directory normalized. The title matcher accepts the
143
+ observed `◐ ` prefix alongside the existing braille range; both screen facts
144
+ and live trust clearance share it. No other new spinner glyph is inferred.
145
+ C-TURN-05, C-TRUST-01.
109
146
  - Both CLIs render the literal `esc to interrupt` only while a turn is running
110
147
  (Claude footer, Codex "Working" spinner). Elwood's `TurnStateWatcher` keys off
111
148
  this, and **arms only after initial readiness** because the Codex MCP boot
@@ -132,11 +169,95 @@ array of `{ type: "output_text", text }` entries. Only the assistant record with
132
169
  progress narration, and user/developer message records are inputs. Current
133
170
  sessions emit no legacy `agent_message` duplicate, so treating `content` as a
134
171
  plain string silently drops the reply text. The transcript adapter therefore
135
- extracts `output_text` only from assistant `final_answer` records while retaining
136
- legacy string/`agent_message` support. C-CODEX-16.
172
+ extracts assistant `final_answer` records as `assistant_message` and
173
+ `commentary` records as `assistant_progress`, while retaining legacy
174
+ string/final `agent_message` support. Explicit non-final legacy mirrors keep
175
+ only their raw observation. C-CODEX-16, C-CODEX-22.
137
176
 
138
177
  ## Model selection persistence
139
178
 
179
+ - **A configured legacy Codex model may be absent from `/model`.** On Codex
180
+ 0.154.0, `gpt-5.1-codex` still appeared in the session header but not in the
181
+ visible catalog; every returned row correctly had `isCurrent: false`.
182
+ Real picker tests should let the installed CLI choose its launch default,
183
+ rather than pinning a model that can disappear from the catalog.
184
+ - **A model dialog replaces the composer; nothing renders below it.** Full-viewport
185
+ captures from Claude 2.1.274 and Codex 0.154.0 (2026-09-17,
186
+ `tests/helpers/model-dialog-viewports.ts`) show the picker, Codex's reasoning
187
+ level, and Claude's cache warning each ending the viewport, while the closed
188
+ state puts the composer back (`❯` between rules; `› Ask Codex to do anything`).
189
+ Rows ABOVE the dialog are ordinary transcript: Claude keeps `❯ /model` and reply
190
+ rows (`⏺` on 2.1.274, `●` earlier) there, so provenance is "no conversation or
191
+ composer row BELOW the header", never "none above". Picker text quoted in a reply
192
+ always has the working row and composer beneath it, so it is not a live dialog
193
+ and must never receive an Escape, which would interrupt the running turn. Claude
194
+ 2.1.274's picker also carries an effort row (`◉ xHigh effort ←/→ to adjust`)
195
+ between its rows and footer. A closed Claude picker leaves only `❯ /model` /
196
+ `⎿ Kept model as …` behind, no header. Two more things are never a dialog: the
197
+ phrase on a reply or composer row itself (`❯ Select model` is staged input), and
198
+ a quoted picker above another dialog. Below its header a native dialog holds
199
+ exactly one contiguous block of picker rows (description column, numbered from 1,
200
+ at most one cursor); any other caret or numbered row (`❯ 1. Yes`, ` 1. Yes`, a
201
+ staged `❯ 1. fix this then that`) restarts the numbering, follows the blank or
202
+ rule that separates the composer, or lacks the column, and marks the region as
203
+ someone else's. The block must also be COMPLETE before Elwood treats it as live:
204
+ every captured picker and reasoning screen carries at least two numbered rows and
205
+ a closing hint row (`Esc to cancel`, `esc to go back`). A header with neither —
206
+ a transcript quoting `Select model` above a trust or hook prompt, or above a
207
+ reply's own numbered list — is a fragment, and Escaping it would dismiss the live
208
+ prompt underneath. The CURSOR is deliberately not required: a complete picker
209
+ still painting its cursor is live and must keep holding input, and `setPickerModel`
210
+ rejects the missing cursor on its own.
211
+ - **A live switch dialog is never hung directly off an agent reply row.** The warning
212
+ screen carries no closing hint row, so completeness cannot be judged the way the
213
+ picker's is. Indentation cannot judge it either — the title itself may sit at column
214
+ zero, so a column test passes a staged draft straight through. Nor can option ORDER:
215
+ `Yes` normally precedes `No`, but a real reordered layout exists where the cursor starts
216
+ on `No` above `Yes` (`claudeModelCacheConfirmationYesBelow`), so an affirmative-first
217
+ rule rejects a live dialog. What does hold is the separator: Claude replaces the composer
218
+ with the dialog, so a live one is preceded by its rule (or the blank line before it),
219
+ never by an agent reply bullet. `parseClaudeSwitchConfirmation` therefore rejects a title
220
+ sitting DIRECTLY under a reply row, and reads options only from the dialog's own
221
+ contiguous run of action rows, so a staged `❯ Yes, switch to Fable` below a quoted
222
+ warning cannot pair with a quoted `No, go back`. C-API-24, C-ATTN-04.
223
+ - **A picker's closing hint row TERMINATES its region.** Only blank lines and rules may
224
+ follow it. Otherwise a transcript quoting a complete picker — footer and all — above a
225
+ live trust or hook prompt still reads as a live picker, and Escaping it would dismiss
226
+ the human's prompt instead. For the same reason the header must be prose: a numbered
227
+ composer draft (`❯ 1. Select model draft` / `2. next text` / `Esc to cancel`)
228
+ otherwise satisfies the row and footer grammar entirely on its own. C-API-24.
229
+ - **A picker mid-repaint is briefly unrecognizable, so one clear frame proves nothing.**
230
+ This is the same shape as the resume-replay settling above, and the picker hold reuses
231
+ that measured value (5 frames) rather than inventing a smaller one: the replay's quiet
232
+ gaps were measured at one frame and 5 clears them with margin, while the picker's gap
233
+ length is NOT measured. The failure directions are asymmetric — too high delays
234
+ releasing the input hold, too low releases queued input into a repainting dialog where
235
+ Enter applies the highlighted model — so the conservative measured precedent wins until
236
+ someone captures real picker repaint frames. Cleanup uses a shorter streak on purpose
237
+ because it is bounded at one second and must send its Escapes inside that budget; it
238
+ hands off to the survivor hold, which applies the full streak, so nothing is released
239
+ early. `src/runtime/session/picker-cleanup.ts`, C-API-55.
240
+ - **Escape on a follow-up stage returns to the picker, not the composer.** On both
241
+ Claude 2.1.274 (cache warning) and Codex 0.154.0 (reasoning level) one Escape
242
+ reopens `Select model` / `Select Model and Effort`; a second closes it. Failure
243
+ cleanup therefore sends one Escape per stage and never repeats one: a second
244
+ Escape during a slow repaint would land on the composer. C-API-55.
245
+ - **Claude paints its cache warning over the picker, with one partial frame.** A
246
+ 5 ms frame capture on Claude 2.1.274 (2026-09-17) shows no idle composer between
247
+ the `s` key and the warning: 28 ms after the key one frame has `Switch model?`
248
+ and the cache copy above STALE picker rows (`❯ 1. Fable …`), with neither
249
+ `Select model` nor the Yes/No options; 7 ms later the dialog is complete
250
+ (numbered, cursor on `1. Yes, switch to …`). In that frame the title-only shell
251
+ cannot be told from a `PreModelSwitch` hook confirmation, so Elwood holds input on
252
+ it and never writes to it, and `setModel` does not treat a caret-only row
253
+ elsewhere in the viewport (a reply quoting the prompt) as the returned composer
254
+ while the shell is up. Before this, `setModel` resolved on that frame without
255
+ ever confirming the switch. C-API-24, C-API-55.
256
+ - **Picker text visible before `/model` is submitted is not Elwood's.** A closed
257
+ picker leaves no header behind, so `Select model` / `Select Model and Effort` /
258
+ `Select Reasoning Level` text that precedes the command is a human's dialog or a
259
+ transcript quote (which the unanchored open check would otherwise parse and
260
+ drive). The operation rejects without writing. C-API-55.
140
261
  - **Codex persists `/model` picker selections into the user `config.toml`.**
141
262
  `setModel` restores the prior default via compare-and-swap after switching
142
263
  (C-CODEX-14), skipping with a `codex_default_model_persisted` warning on a
@@ -191,6 +312,236 @@ select a destructive-rider affirmative, and never answer a specific-affirmative
191
312
  prompt (e.g. hook trust) with a generic "Yes". `src/core/trust/responder.ts`,
192
313
  `src/core/trust/prompts.ts`, verified by `tests/e2e/trust-prompt-claude.e2e.ts`.
193
314
 
315
+ **Codex 0.156.1 uses a new folder-access dialog.** A native PTY capture on
316
+ 2026-09-23 showed `Folder access`, the working directory, `Trust this folder?`,
317
+ the explanation beginning `Codex can read, edit, and run files here`, numbered
318
+ `Trust and continue` / `Quit` choices, and `enter continue · esc quit`. The question
319
+ and explanation share a row and wrap together. The previous grammar missed both
320
+ the question and footer, let startup report ready, and sent an image paste into
321
+ the unanswered dialog. Keep this layout as a separate exact-copy allowlist entry:
322
+ `autotrust` may select only `Trust and continue`; partial or changed copy must hold
323
+ input without approving it. The sanitized capture is
324
+ `tests/fixtures/codex-0.156.1/folder-access.txt`; parser and session regressions
325
+ cover both `autotrust` settings. A native rerun with this grammar answered the gate
326
+ and attached the first image; its later cancelled-draft cleanup failed separately,
327
+ so this is trust/attachment evidence, not a passing successor-cleanup run. C-TRUST-01.
328
+
329
+ ### Where the clearance grammar lives
330
+
331
+ "This frame is the CLI's own idle composer, so the gate cleared" is a per-CLI layout
332
+ fact, and both CLIs change their chrome independently. It therefore lives with each
333
+ adapter's other verified screen facts — `claudeTrustClearance` in
334
+ `src/claude/screen-table.ts`, `codexTrustClearance` in `src/codex/screen-table.ts` —
335
+ and is injected into the shared coordinator (`TrustPromptResponder`/`trustView`).
336
+ When a CLI's banner, status row, or composer placeholder changes, update that adapter's
337
+ predicate. Codex's text grammar lives in `src/codex/screen/clearance.ts` and checks
338
+ known placeholders plus a native model footer or complete welcome box. Text-only
339
+ callers conservatively reject approval-like rows; the live session additionally
340
+ uses the actual visible input cursor to identify the composer, so transcript
341
+ caret/numbered rows above that input remain legitimate history. Dialogs hide the
342
+ cursor or leave it outside the composer. A bare caret never proves clearance.
343
+ Controlled post-settlement fixtures show that indented approval/trust headers or
344
+ cursor-option blocks can coexist with a stale visible composer cursor. Clearance
345
+ shares native trust-header classification without expanding C-ATTN-03 reporting.
346
+ The captured 0.156.1 `Folder access` prelude holds before copy/choices finish;
347
+ a selected numbered choice still holds after the prelude erases. Fresh composer
348
+ replacement clears the gate. These fragments veto staged recovery and empty ACK.
349
+ Assistant quotations require a native non-working assistant row and contiguous
350
+ indentation; blank/column-zero rows end them. Wrapped user history requires a
351
+ column-zero prompt, indented/blank continuation, then a non-working assistant
352
+ reply as its next column-zero row. Unknown rows and native numbered-choice blocks
353
+ cannot establish provenance. Bounded completed numbered user history remains
354
+ valid regardless of its number or label. Selected numbered rows outside that
355
+ completed history or an assistant quotation hold even without siblings. Generic
356
+ quoted menus and caret prompts retain live-cursor history treatment; unquoted option
357
+ blocks hold regardless of labels. Arbitrary identical dialog/transcript text is
358
+ not claimed distinguishable from one frame.
359
+ Native working rows and the live OSC working title retain the hold; prose that
360
+ merely quotes `esc to interrupt` is not a native working row. The title, cursor,
361
+ and text are read synchronously from the same completed render, including during
362
+ trust-attempt polling. Raw PTY receipt invalidates the proof before batching.
363
+ Both adapters now apply the same received/rendered boundary to human trust
364
+ clearance and every retry read. A render failure permanently invalidates that
365
+ terminal view; an unavailable view withholds automation within its existing
366
+ deadline. This guards bytes already received, not future output the CLI has yet
367
+ to send. A completed snapshot is reused until its render or viewport changes.
368
+ That includes an oversized receipt's staged tail: completion of its first 64-KiB
369
+ batch alone is not a complete render. The native working row includes elapsed
370
+ time before the interrupt hint (seconds, minutes/seconds, or hours/minutes/seconds),
371
+ as rendered by [Codex 0.142.5's status widget](https://github.com/openai/codex/blob/rust-v0.142.5/codex-rs/tui/src/status_indicator_widget.rs).
372
+ Parenthesized transcript prose without that native status grammar is not work.
373
+ An exact-shaped quotation such as `• Thinking (3s • esc to interrupt)` is ambiguous
374
+ and retains the hold. A real Codex 0.155.1 rejected-model probe showed a visible
375
+ column-two input cursor throughout native working frames; typing remains possible
376
+ while a turn runs. The title spinner is configurable, and status location varies
377
+ with preview rows, so neither missing title animation nor editable input disproves
378
+ that exact native status. We do not promise to distinguish identical transcript
379
+ and status rows from text/cursor evidence alone.
380
+ Real 0.142.5 and 0.155.1 trust/model dialog captures start DEC2026 before painting,
381
+ then hide the cursor with DEC25l before ending DEC2026. A 0.155.1 command approval
382
+ under `read-only`/`on-request` uses the same ordering: its selected Yes row ends
383
+ with the cursor hidden, not left visible on an old composer. Replaying all 1,078
384
+ character prefixes of that actual approval paint retains the hold; Escape restores
385
+ the visible composer afterward. The raw capture is preserved in
386
+ `tests/fixtures/codex-command-approval-render.ts`. These observations apply to the
387
+ captured versions and dialog types; a new CLI renderer needs new verification.
388
+ Those native partial frames cannot combine settled rendering with a stale visible
389
+ composer cursor. Captured protocol regressions replay the native bytes through trust clearance,
390
+ staged recovery, and empty-input guards. They establish the synchronized/hidden
391
+ cursor barriers, not an observed settled-visible partial dialog. Controlled
392
+ actual-session fixtures separately exercise that post-settlement policy.
393
+ The Claude predicate uses `src/core/trust/clearance.ts` for its separate grammar.
394
+ A real Claude 2.1.278 classic-renderer capture hides the cursor during trust and
395
+ restores it at column two on the composer only at the end of its idle paint.
396
+ Unlike the captured Codex renderer, that Claude paint has no DEC2026 envelope.
397
+ Splitting its bytes immediately before the final DEC25h leaves complete-looking
398
+ composer chrome while native cursor restoration is still pending. Live Claude
399
+ clearance therefore also verifies the visible native cursor on its composer row;
400
+ receipt settlement alone cannot identify that native paint boundary.
401
+ The same Claude 2.1.278 capture hides its cursor with DEC25l before repainting
402
+ its model menu. After that complete control, all 1,241 remaining character prefixes
403
+ retain the live hold, including prefixes where old composer chrome still passes the
404
+ text-only grammar. `tests/fixtures/claude-model-dialog-render.ts` preserves that
405
+ menu repaint without user paths or conversation content, and
406
+ `tests/unit/claude-model-dialog-render.test.ts` replays every prefix. This evidence
407
+ covers the captured model dialog; it does not establish behavior for arbitrary
408
+ replacement prompts or future Claude renderers.
409
+
410
+ Claude 2.1.278 can paint the complete folder-trust dialog before accepting keyboard
411
+ navigation. In the real human-trust test, immediate Down/Enter writes left the
412
+ selection on "No, exit". Waiting for the selected "Yes, I trust this folder" repaint
413
+ before Enter cleared the dialog. The test records physical PTY writes and confirms
414
+ that queued caller input follows native cursor clearance; it does not require a
415
+ model response or available turn quota.
416
+
417
+ `tests/e2e/codex-live-clearance.e2e.ts` also exercises production `startCodex`
418
+ with a fresh isolated configuration: queued input stays held at the human-owned
419
+ directory gate, then one benign prompt reaches `UserPromptSubmit` after manual
420
+ trust and visible native cursor clearance. Verified against installed Codex
421
+ 0.155.1; the test cleans up the real session rather than waiting for model output.
422
+
423
+ A startup-only real PTY probe of Codex 0.142.5 on 2026-09-19 confirmed the
424
+ model-only `gpt-5.5 high` footer with `tui.status_line = ["model-with-reasoning"]`.
425
+ Its placeholder is randomized: observed `Use /skills to list available skills`,
426
+ `Find and fix a bug in @filename`, and `Implement {feature}` across launches.
427
+ The predicate recognizes the eight fixed placeholders in the version-tagged upstream
428
+ `chatwidget.rs` as well as the captured 0.154.0 default. It still requires native
429
+ footer or welcome-box evidence. The sanitized 100×30 capture and provenance are
430
+ in `tests/fixtures/codex-0.142.5/`; no model prompt was submitted.
431
+
432
+ ### Native regions and live confirmation
433
+
434
+ Claude 2.1.252 places `Accessing workspace:` and the workspace path **before**
435
+ the trust question. The question may wrap; its explanatory copy is:
436
+
437
+ ```
438
+ (Like your own code, a well-known open source project, or work from your team). If not,
439
+ take a moment to review what's in this folder first.
440
+ Claude Code'll be able to read, edit, and execute files here.
441
+ Security guide
442
+ ```
443
+
444
+ The 2.1.206 capture omits `, or work from your team`. Blank rows and wrapping
445
+ remain part of one dialog. Unknown explanatory text, titles, or option rows do
446
+ not authorize an answer. Conversation prefixes (`●`, `•`, user/composer markers)
447
+ remain provenance even when they precede an exact quoted trust question; slicing
448
+ at the question must not discard them.
449
+
450
+ Native Codex 0.154.0 captures at 100 columns (2026-09-16) place
451
+ `> You are in /absolute/project/path` before the directory question. The question
452
+ and explanation begin on the same row and wrap:
453
+
454
+ ```
455
+ Do you trust the contents of this directory? Working with untrusted contents comes with higher
456
+ risk of prompt injection. Trusting the directory allows project-local config, hooks, and exec
457
+ policies to load.
458
+ › 1. Yes, continue
459
+ 2. No, quit
460
+ Press enter to continue
461
+ ```
462
+
463
+ Its hook gate renders `Hooks need review`, `1 hook is new or changed.`, and
464
+ `Hooks can run outside the sandbox after you trust them.`, followed by
465
+ `Review hooks`, `Trust all and continue`, and
466
+ `Continue without trusting (hooks won't run)` as numbered choices. Its footer is
467
+ `Press enter to confirm or esc to go back` — accepting only `esc to cancel`
468
+ incorrectly rejects this real dialog. These PTY captures supersede the earlier
469
+ 0.144.4 binary-string evidence for those layouts. No captured path follows the
470
+ trust header; do not add generic path/prose acceptance based on that assumption.
471
+
472
+ The native Codex 0.154.0 input loop can swallow the first numbered confirmation:
473
+ the PTY write fulfills while the directory gate stays visible. In the 2026-09-16
474
+ high-trust probe, a manual repeat at eight seconds cleared that same gate; the
475
+ first write had already produced premature startup activity at roughly one second.
476
+ Numbered automation therefore retries every 250 ms for at most five seconds,
477
+ revalidates the same header and exact option identity before each write, and
478
+ reports answered only after the gate clears. A native directory-to-hook transition
479
+ confirms directory clearance without sending an old answer to the hook gate.
480
+ An observed clear-and-reappear generation cancels the old attempt.
481
+
482
+ Cursor navigation rereads between individual arrows and Enter. Both navigation
483
+ styles now belong to one session-owned coordinator: each observed dialog
484
+ generation owns its reservation, deadline, exact affirmative, and completion.
485
+ An old cancelled attempt cannot release or settle a reappeared gate. The five-
486
+ second bound starts at the first native-header candidate, including partial
487
+ painting. Candidate recognition holds input; only the stricter native-dialog
488
+ recognizer authorizes writes, and it requires the native explanatory copy above:
489
+ a bare header with affirmative rows (a forged or half-painted frame) is held and
490
+ never typed into. Every captured layout (Claude 2.1.206/2.1.252, the 2.1.274
491
+ binary's component, Codex 0.154.0) renders that copy with its header. Unknown replacement text is not clearance. Native
492
+ composer chrome or a verified successor gate confirms clearance; a bare caret
493
+ alone cannot distinguish a composer from a one-option dialog.
494
+
495
+ A stable unsupported or exhausted gate becomes recoverable `blocked` with the
496
+ existing attention rule id after five seconds, even when the terminal emits no
497
+ new data. This is the deliberate fallback approved for autotrust. A later valid
498
+ layout or new generation re-arms safe automation; an unchanged redraw does not
499
+ restart an expired loop. Once fallback is visible, the block remains until
500
+ verified clearance. Raw human keys remain available, while queued persona,
501
+ paste, and command input stays held. Stop, kill, teardown, startup cleanup and
502
+ PTY exit cancel pending automation and timers before disposal. Only a rejected
503
+ PTY write belonging to a still-live matching attempt emits
504
+ `startup_prompt_write_failed`; cancellation and late settlement stay quiet.
505
+
506
+ Both CLIs reword gates often, so an off-allowlist gate behind a recognized header
507
+ prefix fails closed: a header-shaped region (`headerStart` in
508
+ `src/core/trust/dialog.ts`) with real header text, selectable options, only
509
+ option rows and a frame-ending native footer beneath it, and no conversation row
510
+ above it holds input as `<agent>-unknown_gate-prompt` and is never written to. Both
511
+ CLIs paint the composer below conversation content, so quoted or model-written
512
+ question-plus-list prose fails that tail test. The footer is required because options
513
+ paint before it. A gate whose first words fall outside `headerStart` (e.g.
514
+ `Allow ...?`) is NOT held: a purely structural recognizer would also catch dialogs
515
+ Elwood drives itself (the Codex model picker ends in `Press enter to confirm or esc
516
+ to go back`).
517
+
518
+ A fulfilled write alone does not prove the gate cleared. Real-CLI checks use a
519
+ separate raw visibility oracle so production recognition failures cannot make
520
+ the tests report the gate absent. Sanitized native Claude 2.1.274 and Codex
521
+ 0.154.0 post-trust composer captures anchor the positive-clearance tests.
522
+ A no-model Codex resize probe at 100×12, 100×8 and 100×6 confirms that the welcome
523
+ box can scroll away while its composer and model/reasoning/path footer remain.
524
+ Those native rows also prove clearance; welcome presence is not required.
525
+
526
+ ### Native Codex startup warnings
527
+
528
+ Codex 0.154.0 normally collapses MCP failures to
529
+ `⚠ 1 MCP startup issue · ctrl + t for details`. Its Ctrl+T overlay retains the
530
+ canonical detailed MCP and login warning rows beneath the boxed welcome header.
531
+ The collapsed count cannot supply server names or recovery instructions; Elwood
532
+ does not send Ctrl+T automatically. Captures and the local failing-server/401
533
+ real-CLI test verify the detailed rows. The current welcome chrome and native
534
+ warning prefixes distinguish these banners from conversational quotations.
535
+
536
+ Native 0.154.0 startup renders no `•`/`●` row at any point: recorded frame by frame
537
+ (2026-09-17) through the directory gate, hooks gate, welcome, and composer with
538
+ both an MCP endpoint that fails at once and one that accepts the connection and
539
+ never answers (the collapsed warning appears after ~10 s with no boot spinner).
540
+ Warning recognition therefore ends at the first assistant-marker row or the
541
+ first caller-side write, whichever comes first; after that a copied welcome box
542
+ whose own marker has scrolled away is content. A CLI version that painted a `•`
543
+ boot spinner before its warnings would lose those warnings rather than forge any.
544
+
194
545
  ### Bypass-permissions acceptance dialog (`--high-trust`)
195
546
 
196
547
  Claude Code carries a one-time disclaimer for bypass mode. Its wording, taken
@@ -231,26 +582,26 @@ therefore version/account-gated, and Elwood must be correct in BOTH states:
231
582
  security reasons` is the CLI's own refusal; Elwood does not special-case it —
232
583
  it surfaces as the ordinary start failure with the CLI's message.
233
584
 
234
- **Do not equate `autotrust` with “not blocking” until the write clears the real
235
- screen.** Trust rules are omitted from human-blocking classification under
236
- `autotrust`, because automation owns the gate. If option parsing drifts and writes
237
- nothing, the 10 s initial-ready starvation deadline can otherwise report `ready`
238
- over a still-visible trust dialog. C-E2E-09 therefore requires both `ready` and a
239
- cleared trust screen; a complete but unanswerable real frame is a failure, not a
240
- skip.
241
-
242
- The responder emits one transient `attention` when a recognized header paints
243
- before its affirmative option. A headless owner must ignore that transient only
244
- when its trust policy already authorizes the exact allowlisted prompt; `--no-trust`
245
- and generic permission dialogs remain human blocks. The startup replay buffer can
585
+ **Do not equate `autotrust` with readiness until the real gate clears.** The
586
+ automation gate holds the 10 s initial-ready fallback and queued input from the
587
+ first native trust candidate. Successful bounded automation does not report a
588
+ human block; unsupported or exhausted attempts transfer to the recoverable block
589
+ above. C-E2E-09 requires both `ready` and a cleared trust screen; an unanswerable
590
+ real frame is a failure, not a skip.
591
+
592
+ The responder emits one transient `attention` when a recognized header and its
593
+ native body paint before the affirmative option. A header whose body has not
594
+ validated is held silently: it emits no transient `attention`, only the
595
+ five-second fallback if it never completes. A headless owner must ignore that
596
+ transient only when its trust policy already authorizes the exact allowlisted
597
+ prompt; `--no-trust` and generic permission dialogs remain human blocks. The startup replay buffer can
246
598
  deliver this attention after the responder has already continued, so treating
247
599
  every attention event as fatal produces a false `blocked_prompt`.
248
600
 
249
601
  ## Codex in-TUI update prompt (and the restart loop)
250
602
 
251
603
  Independent of the `autoupdate` preflight (`codex update` run before spawn), the
252
- Codex TUI can show its OWN "update available" prompt at launch. Elwood **always
253
- skips it** — it never selects "Update now" — because letting the live TUI update
604
+ Codex TUI can show its OWN "update available" prompt at launch. Elwood **only selects a verified safe skip choice** — it never selects "Update now" — because letting the live TUI update
254
605
  itself restarts Codex out from under the PTY session. The real update is the
255
606
  preflight; the in-TUI prompt is a nuisance to dismiss.
256
607
 
@@ -258,19 +609,37 @@ preflight; the in-TUI prompt is a nuisance to dismiss.
258
609
  "accepts" (or that Elwood used to leave latched) restarts Codex, the update does
259
610
  **not** take (a partial download, a managed install, contention), and the SAME
260
611
  update screen returns — an infinite loop stuck on the update screen. The fix is an
261
- **edge-triggered** skip: skip once per appearance, and RE-ARM the moment the update
262
- screen leaves the frame, so a reappearance after the restart is skipped again
263
- rather than sitting latched forever. Edge-detection mirrors the login watcher.
264
-
265
- Two version-coupled wrinkles this cost us:
266
-
267
- - The skip-attempt is gated by a per-session prompt tracker, even though the
268
- option is located in the accumulated buffer. Codex can split the distinctive
269
- versioned banner and its options across consecutive screen replacements; once
270
- the banner activates the tracker, a safe-option-only continuation remains the
271
- same blocking prompt. A definite non-update frame clears it. Matching the
272
- accumulated buffer alone lets benign later prose re-fire against a **stale
273
- buffered option** — a real bug we hit while building this. C-CODEX-12.
612
+ **edge-triggered** skip: skip once per appearance. Unknown or blank replacements
613
+ keep automation revoked until authoritative native composer clearance or fresh
614
+ first-party banner evidence permits a new appearance. A verified clear can re-arm
615
+ a new bannered appearance after the restart; retained composer text beneath a
616
+ replacement cannot. The old attempt stays revoked even when a new one is authorized.
617
+
618
+ Version-coupled behavior learned here:
619
+
620
+ - Every automated selection requires the current validated first-party banner and
621
+ its current safe numbered choice. All bannerless continuations are withheld,
622
+ including previously observed number/label bindings. The banner activates the
623
+ blocker before choices paint, and retained input remains held until positive
624
+ native composer clearance. Historical accumulated-buffer matching and later
625
+ safe-option-only continuation inference are no longer authorization rules.
626
+ The earlier 0.155.1 full-menu fixture captures preserve the banner at every
627
+ observed size; those fixtures do not establish a genuine bannerless repaint. C-CODEX-12.
628
+ - Captured Codex menus list `Update now` before safe choices. Selection respects
629
+ that ordering, excludes the update action, and compares the current bounded
630
+ option snapshot before each write. Removal or renumbering of a safe choice
631
+ invalidates the prior retry; a fresh bannered safe block gets a new appearance.
632
+ Old and new numbers are never accumulated into one authorized set.
633
+ - Update recognition and input blocking have different lifetimes. An unknown
634
+ replacement is no longer an update. Without a prior recognized update it does
635
+ not create a retained update hold, so queued paste and Enter remain eligible.
636
+ Once an update was recognized, the session retains its input hold until native
637
+ composer and visible cursor in one completed render prove clearance, with no
638
+ working-title signal. The title may be absent or an ordinary directory name. A
639
+ partial repaint or bare caret cannot release it. Specific trust rules keep their
640
+ own labels; otherwise an unowned retained hold reports `codex-unidentified-dialog`.
641
+ Pending automated trust owns its partial repaints and suppresses that generic
642
+ label until its input hold ends.
274
643
  - Option labels drift by version. Older codex (0.132/0.133) rendered a numbered
275
644
  dialog ("1. Update now / 2. Skip / 3. Skip until next version"). In the installed
276
645
  0.149.1 binary, the upgrade notice strings extracted from the native binary read
@@ -278,16 +647,18 @@ Two version-coupled wrinkles this cost us:
278
647
  `https://github.com/openai/codex for installation options.`) rather than a
279
648
  numbered dialog — so the interactive dialog is not guaranteed on every version.
280
649
  The skip is written ONLY when a numbered skip option is actually present
281
- (`findNumberedOption` → null ⇒ no write), so a passive banner is a harmless no-op.
650
+ (`safeUpdateOption` → `undefined` ⇒ no write), so a passive banner is a harmless no-op.
651
+ If the only skip-shaped choice precedes the update action, the helper also returns
652
+ `undefined` and no key is written.
282
653
  Every retry revalidates that the frame still belongs to the captured first-party
283
- update-prompt generation and uses the safe option's current number. This preserves
284
- the known safe-option-only continuation layout without letting a cleared/reappeared
285
- prompt or replacement dialog inherit a stale digit. A prompt that remains blocking
654
+ update-prompt generation and uses the safe option's current number. The current banner must remain visible; a bannerless repaint cannot inherit a
655
+ digit from a cleared/reappeared prompt. A prompt that remains blocking
286
656
  but cannot be safely answered becomes `blocked_prompt` after the bounded
287
657
  responder/grace window, including runs without a whole-invocation timeout.
288
- The match set (`src/codex/update-prompt.ts`) is unit-tested against captured
289
- layouts, NOT against a live update event (which requires an actually-stale binary
290
- to trigger). If Codex changes the dialog wording, this is the first thing to
658
+ The match set is unit-tested against captured
659
+ layouts; the pinned 0.155.1 native experiment below used controlled update metadata. `codex-update-selection.e2e.ts` also replays the documented option
660
+ layout and an adversarial reordered variant through a real PTY and emulator;
661
+ its child acknowledges the physical skip digit it received. If Codex changes the dialog wording, this is the first thing to
291
662
  re-capture.
292
663
 
293
664
  **Concurrent-start failure (verified against codex-cli 0.152.1, 2026-09):** the
@@ -299,11 +670,17 @@ therefore input-blocking facts, not only responder hints: readiness and paste
299
670
  submission remain suspended until the rendered update frame clears, even after
300
671
  the skip key is written. The prompt recognizer accepts the known first-party
301
672
  versioned banner before options paint, plus option-only frames when BOTH "Update
302
- now" and a safe skip/later choice are present. Once active, a safe-option-only
303
- continuation stays latched until a definite non-update frame. Generic agent prose
673
+ now" and a safe skip/later choice are present. Those bannerless blocks remain recognition evidence only. No bannerless frame
674
+ authorizes automation; the input hold lasts until positive native composer clearance. Generic agent prose
304
675
  containing "update available" and the actual 0.149.1 passive installation notice
305
676
  do not block.
306
677
 
678
+ A fulfilled update digit write is not clearance evidence. Update settlement uses
679
+ the same native composer, cursor, title, and completed-render predicate as the
680
+ retained input hold. It also reads the frame observer's existing hold when old
681
+ composer chrome survives beneath replacement text. Missing readers and replacement
682
+ dialogs cancel quietly.
683
+
307
684
  The preflight adds a second boundary because global installers can also race
308
685
  across separate Elwood parent processes. A per-user/per-adapter atomic lease in
309
686
  the account cache (independent of `TMPDIR`) surrounds the required existence check
@@ -340,6 +717,18 @@ C-CLAUDE-17/18. Verified against the banner text the field reported; there is no
340
717
  live-CLI e2e (it would mutate real auth), so the matchers are unit-tested against
341
718
  captured strings.
342
719
 
720
+ ## Claude login picker handshake (2026-09-23)
721
+
722
+ The `/login` command Enter and the method-picker selection Enter are distinct
723
+ writes in the production login driver. A fixture must await the command Enter
724
+ before painting the picker, then await the picker Enter before painting the auth
725
+ URL/code screen. Advancing on the first Enter can replace the picker before the
726
+ driver observes it. Reproduced through the real driver and fake PTY in
727
+ `tests/claude/session-login.test.ts` with a temporary 250 ms delay before the picker
728
+ stage: the old fixture missed the selection Enter; the corrected handshake passed.
729
+ This was a fixture reproduction, not a fresh native CLI authentication test; no
730
+ new CLI version or native capture was verified.
731
+
343
732
  ## Input / paste
344
733
 
345
734
  - Caller and LLM text sent via `sendPrompt`/`sendMessage`/`sendGuidance` is
@@ -347,13 +736,36 @@ captured strings.
347
736
  bracketed-paste markers (`ESC[200~`/`ESC[201~`) and C0/C1 controls except
348
737
  tab/nl/cr, so text can't escape bracketed paste and inject a dialog-confirming
349
738
  Enter. C-API-40.
350
- - A submission's Enter is **held while a blocking dialog is visible**
351
- (`waitWhileBlocked`), so a dialog appearing in the paste→Enter window can't be
352
- auto-confirmed by the pending Enter.
739
+ - Codex 0.156.1 renders each pasted tab as one space, regardless of column;
740
+ consecutive tabs remain consecutive spaces. Pasted CR and LF start new rows.
741
+ Verified in an isolated native PTY without submitting a model turn (2026-09-23).
742
+ Recovery checks must use the sanitized payload and its rendered final line,
743
+ otherwise removed controls or preserved tabs make a still-staged draft look absent.
744
+ - A submission's paste, Enter, and recovery Enters are **held while a blocking
745
+ dialog is visible** (`holdWhileUnsafe` / `writeUnsafe`, `src/core/input/abort.ts`),
746
+ so a dialog appearing in the paste→Enter window can't be auto-confirmed. "Visible"
747
+ means observed: each write first awaits `terminal.settled()`, because a dialog can
748
+ be received before it is rendered. xterm parses the first write after user input
749
+ synchronously and later ones on a timer, so that window is real and input-dependent.
353
750
  - **Writing a literal ESC byte in source is fragile** — it can be silently
354
751
  stripped by an editor/pipeline (this once neutered an interrupt e2e). Always
355
752
  write the escape sequence form (``), never a raw ESC character.
356
753
 
754
+ ## Hook bridge request FIN and delayed decisions
755
+
756
+ The generated bridge child calls `client.end(request)` after connecting. That FIN
757
+ ends the request stream while the child still awaits the parent's decision. A
758
+ local real-socket reproduction with a handler held for 100 ms showed the default
759
+ Node server closing its reply side first: the child received empty EOF and exited
760
+ fail-open before the blocking decision existed. `allowHalfOpen: true` keeps the
761
+ reply side available until the handler settles. The server still ends and destroys
762
+ the socket after flushing its reply; shutdown still destroys pending sockets.
763
+
764
+ The regression runs the actual generated child against `HookBridgeServer`, checking
765
+ both the delayed blocking output/exit code and delayed handler-failure diagnostics.
766
+ This is a local bridge/process proof, not a new Claude or Codex CLI capture. PRD
767
+ §6.2/§6.3, C-HOOK-16.
768
+
357
769
  ## Hook bridge socket path length (macOS ~104-byte cap)
358
770
 
359
771
  macOS caps a Unix domain socket path near 104 bytes (`sockaddr_un.sun_path`); binding
@@ -435,8 +847,9 @@ Four real-PTY edges were invisible to the unit fixtures:
435
847
  Run probes in a detached process session so they keep interactive PATH resolution
436
848
  without participating in the caller terminal's job control.
437
849
  - Current agent TUIs push Kitty keyboard enhancements with `CSI > flags u`. Head mode
438
- stops mirroring before agent teardown, so it cannot rely on the agent's matching
439
- cleanup sequence reaching the physical terminal. The defensive reset must emit
850
+ mirrors through session cleanup (so the drained final frames are shown), but an
851
+ agent signalled or force-killed there is not guaranteed to emit its matching
852
+ cleanup sequence, so head mode cannot rely on one reaching the physical terminal. The defensive reset must emit
440
853
  `CSI < u` before leaving the alternate screen; otherwise every later shell keystroke
441
854
  can remain encoded as a `CSI u` key event, making even a typed `reset` unusable.
442
855
 
@@ -502,3 +915,477 @@ side-effect-free signal. C-CLI-21 through C-CLI-24.
502
915
  - Per the testing pyramid in `CLAUDE.md`: anything that interfaces with the real
503
916
  CLI SHOULD have a real-CLI e2e. Every fact in this file is one a unit test could
504
917
  not have caught.
918
+
919
+ ### Codex commentary and final-answer phases (2026-10-20)
920
+
921
+ The reported completed `response_item` fixture retains assistant text in an
922
+ array-form `output_text` block with `phase: "commentary"`. The previous summarizer
923
+ discarded that phase. It now produces `assistant_progress`; final answers retain
924
+ `assistant_message`. Explicit non-final legacy `agent_message` mirrors remain raw
925
+ observations without normalized text, avoiding false final replies and duplicate
926
+ progress. Tests exercise mirrors before and after canonical response items, as
927
+ well as repeated genuine canonical updates.
928
+
929
+ An isolated real Codex 0.159.2 / `gpt-6-luna` low-effort turn passed
930
+ `tests/e2e/codex-commentary.e2e.ts`: one progress event preceded one final event,
931
+ progress observed `running`, the turn ended `ready`, and ergonomic `send()`
932
+ returned only final text. Exactly one paste and Enter were delivered, with zero
933
+ tools. The test uses a private Codex home and empty project, removes that home,
934
+ and checks the parent environment and Codex auth/config/hook file fingerprints.
935
+ Run explicitly with `ELWOOD_NATIVE_COMMENTARY_PROOF=1`; it consumes one small
936
+ valid-model turn. This pinned-version proof does not establish every future CLI
937
+ layout or guarantee that arbitrary prompts will cause a model to send commentary.
938
+
939
+ ### Model-picker dispatch and post-cancel composer (2026-09-19)
940
+
941
+ A serial native PTY probe on Codex 0.155.1 and Claude Code 2.1.278 typed
942
+ `/model`, waited 300 ms, then sent Enter. Neither CLI displayed its model picker
943
+ before Enter; both displayed it afterward. Model test drivers must therefore wait
944
+ for the command's submitting Enter before painting the picker. No model prompt was
945
+ submitted in this probe.
946
+
947
+ Codex returned to its known `Ask Codex to do anything` composer and model/effort
948
+ footer after Escape; automated `listModels` then returned five rows. Claude kept
949
+ `❯ /model` and `Kept model as …` in the transcript above its final fenced composer.
950
+ Its idle footer read `-- INSERT -- ⏵⏵ auto mode on (shift+tab to cycle) · ← for
951
+ agents`. A whole-screen clearance predicate that rejects every earlier caret
952
+ therefore rejects this genuine post-picker idle frame. Model clearance must use
953
+ the last composer, its enclosing rules, and its native footer; a bare caret or a
954
+ partial model dialog is insufficient. The sanitized Claude frame is retained in
955
+ `tests/fixtures/claude-2.1.278/model-cancelled.txt`. With this recognition fix,
956
+ Claude also completed automated `listModels` and returned five rows (C-API-55).
957
+
958
+
959
+ ### Cursor provenance for Codex trust clearance
960
+
961
+ Startup-only probes on 2026-09-19 checked Codex 0.142.5 and 0.155.1 at 100×30,
962
+ without submitting a model prompt. Both hide the cursor with DEC private mode 25
963
+ on the directory-trust and `/model` dialogs, leaving its coordinates on a footer.
964
+ Both show the cursor at column 2 on the native placeholder row after trust and
965
+ after dismissing the picker. Codex 0.155.1 retains this evidence at 100×6.
966
+ The 0.142.5 narrow resize leaves malformed chrome, so that frame is not used as a
967
+ positive fixture. Inspect cursor mode and coordinates together with the same
968
+ completed rendered text and title: an old composer or footer can remain during a
969
+ dialog repaint, and a transcript can contain identical caret/option text.
970
+
971
+ ### Cancelled native composer drafts (2026-09-20)
972
+
973
+ Claude Code 2.1.278 and codex-cli 0.155.1 both cleared a staged `[Image #1]` chip
974
+ and text draft when production cancellation cleanup sent Ctrl+U followed by Ctrl+K
975
+ through the real PTY. `tests/e2e/composer-cleanup.e2e.ts` waits for idle readiness,
976
+ observes the image and text, then cancels before Enter; it rejects any submitting
977
+ Enter and observes no `UserPromptSubmit` hook, so no model turn runs. Disabling
978
+ only the production clear write made both tests retain the image and text and fail.
979
+ This verifies an automation-owned idle composer, not cleanup across caller edits
980
+ or blocking dialogs. Codex clipboard text is restored after attachment.
981
+
982
+
983
+ Native startup protocol replies also emit xterm `onData`. The actual-session
984
+ image-cancellation proof exposed this on both adapters: treating those replies as
985
+ caller edits revoked cleanup before its first staged image. A real terminal's
986
+ cursor-position query (`CSI 6 n`) reproduces the revocation without any caller
987
+ input. Ownership now tracks `xterm.input` invocations; parser-generated replies
988
+ preserve authority, while caller keys still revoke it. Startup trust writers also
989
+ use that automation scope: both actual-session trust fixtures showed that writing
990
+ outside it revoked cleanup before the first caller submission.
991
+
992
+ The actual-session image queue also exposed a consumption race: writing the clear
993
+ keys did not establish that Claude had removed the staged image before successor
994
+ attachment. Cleanup therefore waits for a fresh completed empty native frame. A
995
+ bounded Claude probe then found a cleared frame with a visible input cursor at
996
+ column two, enclosing rules, and a version banner: existing whole-frame live
997
+ clearance accepted it, while the post-model-picker suffix predicate rejected it.
998
+ Cleanup accepts either existing positive Claude clearance path, preserving the
999
+ same completed-render and cursor checks. The suffix path remains useful when
1000
+ earlier conversation carets prevent whole-frame clearance.
1001
+
1002
+
1003
+ ### Capitalized Codex model footer (2026-09-23)
1004
+
1005
+ Codex 0.156.1 renders `GPT-6-Astra default` in the native footer, followed by
1006
+ its working directory and a right-aligned warning count. A 189×48 capture after
1007
+ staged-draft cleanup showed the empty `Ask Codex to do anything` placeholder with
1008
+ the input cursor at column 2, row 11 (zero-based), but the lowercase-only `gpt-`
1009
+ footer pattern rejected the completed native frame. Cleanup consequently reported
1010
+ `Could not clear the staged composer draft` after the CLI had already cleared it.
1011
+ The model prefix now accepts the captured `GPT-` spelling alongside `gpt-`;
1012
+ placeholder, footer layout, live cursor and blocking-overlay checks remain required.
1013
+ The captured nonempty rows are retained in
1014
+ `tests/fixtures/codex-0.156.1/cleared-composer.txt`; the regression replays them
1015
+ at their original viewport size, with temporary paths replaced by a stable `CAPTURE`
1016
+ placeholder. C-API-56, C-TRUST-01, PRD §5.4.
1017
+
1018
+ ### Native Codex updater layout (2026-09-23)
1019
+
1020
+ An authenticated Codex 0.155.1 binary, copied into an isolated `CODEX_HOME`
1021
+ standalone-release layout with fresh cached update metadata naming 0.156.1,
1022
+ rendered the actual updater without selecting any menu item. Native PTY resize
1023
+ captured the full menu at 100×30, banner plus the clipped first action at 100×6,
1024
+ banner only at 100×3, and the first safe choice at 100×8. The fixtures in
1025
+ `tests/fixtures/codex-0.155.1/update-*.txt` preserve the rendered text.
1026
+
1027
+ The banner begins with `✨` and a thin space. A release-notes link precedes the
1028
+ options. The `Update now` install command wraps onto an indented continuation
1029
+ row; `Press enter to continue` follows the option block. The parser accepts those
1030
+ observed rows while rejecting numbered scrollback before the banner and unknown
1031
+ text after the choices. Wrapped command fragments must form a prefix of the
1032
+ captured `sh -c 'curl -fsSL https://chatgpt.com/codex/install.sh | CODEX_NON_INTERACTIVE=1 sh'`
1033
+ action. Arbitrary indented replacement text is not a command continuation or safe choice.
1034
+
1035
+ These captures prove native renderer layout under controlled cached metadata,
1036
+ not an update execution or a genuine bannerless repaint. The banner remained
1037
+ visible in every captured resize. Adversarial replacement frames and shell-PTY
1038
+ proofs are separate constructed evidence; these fixtures alone do not prove
1039
+ queued-input suppression through a live Elwood session.
1040
+
1041
+ A controlled real-session probe passed on 2026-09-23: one test, one pass, no skips. It verified the pinned binary's
1042
+ version and login status, then started Elwood with normal automatic skip handling
1043
+ and a queued caller message. At 100×6 and 100×3, Elwood stayed `blocked` and emitted
1044
+ `codex-update-prompt` attention. Neither automation nor the queued message attempted
1045
+ an application write; the queue rejected on shutdown. The PTY interceptor recorded
1046
+ attempts before rejecting them, so it could not hide an incorrect selection. Only
1047
+ exact native terminal protocol replies were forwarded. `autoupdate: false`
1048
+ disabled installation, not startup-menu skipping. The temporary binary, config,
1049
+ version metadata, and credential copy were removed after teardown. This proves
1050
+ these narrow native layouts under controlled version metadata; it does not prove
1051
+ a bannerless continuation, run an updater, or submit a model turn.
1052
+
1053
+ ### Native updater resize to a bannerless empty viewport (2026-10-01)
1054
+
1055
+ A fresh isolated Codex 0.155.1 probe used the actual pinned standalone binary and
1056
+ private authenticated `CODEX_HOME`, with cached metadata naming 0.156.1. With
1057
+ normal startup-menu skipping enabled and one caller message queued, resizing
1058
+ 100×6 → 100×2 → 100×1 → 100×3 → 100×6 produced a genuinely empty viewport at one
1059
+ row. The two-row frame still contained the banner. The empty repaint remained
1060
+ `blocked`, emitted `codex-unidentified-dialog` attention, held the caller, and
1061
+ attempted zero application writes. Returning to three and six rows restored the
1062
+ banner and retained the hold. Shutdown rejected the queued message.
1063
+
1064
+ The run passed one test with no skips. Application writes were counted before
1065
+ being rejected by the interceptor; only exact terminal protocol replies reached
1066
+ the PTY. No updater action or model prompt was delivered, and the private binary,
1067
+ metadata and credential copy were removed afterward. This proves a genuine
1068
+ bannerless **empty** repaint, not a bannerless numbered-choice layout. The initial
1069
+ six-row layout had only the clipped update action, so that narrow phase alone
1070
+ establishes no live safe-choice selection.
1071
+
1072
+ The final proof also launches a second isolated session without a queued caller,
1073
+ then resizes its real updater from 100×6 to 100×30. Before every application write,
1074
+ the interceptor checks the current rendered first-party banner and parsed `2. Skip`
1075
+ choice; only the exact digit `2` is permitted. The measured run attempted and
1076
+ delivered exactly one `2`, reached `ready`, then closed without a model prompt.
1077
+ The combined test passed 1/1 with no skips (8.28 seconds); the narrow phase still
1078
+ had zero application attempts. The negative session is killed before this phase,
1079
+ so its held caller cannot become a model submission when the menu clears.
1080
+
1081
+ `tests/fixtures/codex-0.155.1/update-resize-100x1.json` preserves the actual frames.
1082
+ The opt-in `codex-native-update.e2e.ts` proof is repeatable with
1083
+ `ELWOOD_NATIVE_UPDATE_PROOF=1`; it verifies the pinned binary and login state before
1084
+ launch and never installs over the user's CLI. C-CODEX-12.
1085
+
1086
+ ### Empty input while a turn is active (2026-09-23)
1087
+
1088
+ The retained Claude 2.1.281 `working.txt` and `working-empty-input.json` captures
1089
+ contain `⚠ Your login expires in 1 day · run /login to renew` in the welcome
1090
+ region and the same notice without `⚠` below the native composer. A user report
1091
+ on 2.1.305 (2026-10-20) shows the same welcome wording with `3 days`. These
1092
+ observations underpin the `login_expiring` warning (C-CLAUDE-23); they are advance
1093
+ renewal notices, not the lapsed-authentication screens used by `login_expired`.
1094
+ No `/login` was driven to collect this evidence.
1095
+
1096
+ Native captures show that empty input and idle-turn clearance are different facts.
1097
+ Codex 0.156.1 kept its visible cursor at column 2 on `Ask Codex to do anything`
1098
+ while its working title and interrupt status were active. The bounded probe used
1099
+ an invalid model and reached rejection without model quota. Its model-only status
1100
+ line also carried a right-aligned `⚠ 3 warnings · f2 to view` badge.
1101
+
1102
+ Claude Code 2.1.281 kept a visible column-2 cursor on its empty fenced input while
1103
+ `Wandering… (0s)` and the `◐ Claude Code` title were active. A single synthetic
1104
+ `Reply exactly OK. Do not use tools.` request in an isolated workspace supplied
1105
+ this capture; the request later reached a usage limit, so it proves active input
1106
+ geometry, not a successful answer. The native manual-mode footer included the
1107
+ token count and a login-expiry notice. No further valid-model requests were made.
1108
+
1109
+ The sanitized `working-empty-input.json` fixtures retain these actual completed
1110
+ frames and cursor coordinates. Empty-input observers may use this geometry to
1111
+ confirm a consumed draft during work. They do not release trust, model-picker, or
1112
+ cleanup holds: those retain their stricter idle contract. Replay callers must
1113
+ also retain their existing dialog-blocking check and require a fresh frame after
1114
+ submission; an old empty frame does not prove acceptance.
1115
+
1116
+ The Claude observer also preserves the existing version-banner/fenced-input
1117
+ alternative and the documented 2.1.268 non-Vim bypass-permissions footer.
1118
+ Those compatibility cases are constructed regressions, not new working captures.
1119
+
1120
+ ## Native submission hooks end recovery (2026-09-24)
1121
+
1122
+ `tests/e2e/paste-recovery.e2e.ts` passed against Claude Code 2.1.281 and
1123
+ codex-cli 0.156.1: 2 tests, 2 passes, 0 failures, 0 skips, covering cold and
1124
+ resumed sessions for each adapter. Every phase physically delivered one Enter,
1125
+ emitted one `UserPromptSubmit`, and attempted no recovery Enter after native
1126
+ `user_message` activity during a further six-second observation.
1127
+
1128
+ Codex resume did attempt a recovery Enter before its hook arrived: first Enter
1129
+ at 151 ms, retry at 1155 ms, native activity at 1317 ms. The test counted that
1130
+ retry and intercepted it before delivery. This proves the hook-only guarantee;
1131
+ it does not prove safety in the interval before the hook, or isolate native
1132
+ working evidence. The other three phases each attempted only the first Enter.
1133
+
1134
+ Both CLIs rejected a nonexistent model before quota consumption. Since public
1135
+ resume options omit model, the test appended that same invalid native `--model`
1136
+ at the PTY launch seam. Native hooks, readiness, and input queues remained real.
1137
+ All processes and temporary credential copies were cleaned up. These observations
1138
+ do not establish successful model output or correlation of a hook to a prompt.
1139
+
1140
+ ## Live staged text and ambiguous working frames (2026-09-24)
1141
+
1142
+ The 2026-09-24 no-submission captures of Claude Code 2.1.281 and
1143
+ Codex 0.156.1 show the actual cursor inside collapsed or wrapped drafts. Codex
1144
+ continuations use two-space indentation and may cross a nonzero buffer base.
1145
+ Claude collapsed text uses the exact “paste again to expand” footer, with the
1146
+ separate `◐ medium · /effort` row observed again in the fresh recovery probe; Ctrl+Y
1147
+ can remain visible from an earlier draft. Those captures did not establish that
1148
+ Ctrl-U/K removed all earlier text, and are not a model-turn acceptance proof.
1149
+ Committed fixtures preserve geometry while replacing account/quota details and
1150
+ temporary workspace names.
1151
+
1152
+ Actual session/PTY tests distinguish the current cursor-owned composer from
1153
+ identical transcript text. Startup or resume replay and accepted native work can
1154
+ produce indistinguishable working frames before readiness. Recovery therefore
1155
+ withholds Enter during work without permanently inferring acceptance. A fresh
1156
+ positive empty input frame or native user-message activity ends that submission’s
1157
+ recovery; otherwise a later verified idle draft remains eligible within the
1158
+ four-observation/two-Enter bound. This is a conservative policy tested with
1159
+ controlled frames, not a newly observed native correlation guarantee.
1160
+
1161
+ A fresh bounded recovery probe on these same CLI versions passed for both
1162
+ adapters: an 18-line prompt remained staged, and the actual PTY writer attempted
1163
+ exactly the first Enter plus two recovery Enters, near 150/1150/2150 ms. All three
1164
+ Enters were intercepted before delivery; neither CLI emitted UserPromptSubmit,
1165
+ and neither ran a model turn. This proves native staged geometry and retry
1166
+ bounds, not acceptance or post-acceptance behavior. The temporary Codex auth
1167
+ copy was removed after teardown.
1168
+
1169
+
1170
+ ## Cached image recovery frames (2026-10-01)
1171
+
1172
+ The existing captured image-chip and staged-text layouts establish live composer
1173
+ geometry, not whether an Enter was accepted after the capture. A completed idle
1174
+ frame can remain cached until a later native repaint; a second Enter must not be
1175
+ authorized from that pre-attempt frame. Recovery now captures the render revision
1176
+ before each physical Enter attempt and requires later completed output plus the
1177
+ adapter's live idle-composer check. Resizing or scrolling changes snapshot geometry
1178
+ without establishing this output ordering. Native user-message activity retains
1179
+ its independent, permanent revocation of recovery.
1180
+
1181
+ The attachment-to-submission regressions use the real adapters and terminal parser,
1182
+ with controlled PTY output and a stubbed Codex platform clipboard. They retain the
1183
+ native Claude effort footer and distinguish fresh attached chips from history,
1184
+ hidden/working frames, and unchanged pre-Enter chips. This is deterministic ordering
1185
+ evidence, not a new native CLI acceptance measurement.
1186
+
1187
+ ## Codex whitespace-only staged input (2026-10-01)
1188
+
1189
+ Private copied Codex 0.159.2, auth and config rendered a bracketed paste of two
1190
+ spaces, a tab and a space as an apparently empty `›`. The completed 140×35 frame
1191
+ was ready with visible cursor at zero-based (6,31): trimming text cannot prove
1192
+ consumption. Fixture: `tests/fixtures/codex-0.159.2/whitespace-only-input.json`.
1193
+ Updates were disabled and the model nonexistent. Exactly one paste and two
1194
+ protocol replies occurred, with no Enter, UPS, clipboard operation or model turn.
1195
+ Private home cleanup and unchanged parent environment passed. This proves geometry,
1196
+ not acceptance. Controlled replay combines it with an older captured empty frame;
1197
+ image tests exercise adapter options with stubbed clipboard. No native Claude
1198
+ whitespace capture is claimed.
1199
+
1200
+ ## Codex 0.159.2 native acceptance ordering
1201
+
1202
+ A private-home Node 24.7.0 cold/resume probe used
1203
+ `gpt-elwood-nonexistent-acceptance-probe`, one Enter/UPS per phase and a one-second
1204
+ handler hold. The real generated bridge received its 38-byte response only after
1205
+ return (cold 1.353ms, resume 1.391ms), verifying half-close transport without a
1206
+ successful model/quota turn. Parent environment and global config were unchanged.
1207
+ Bounded pre-Enter discovery found no cold candidate, not proof no file existed.
1208
+ Resume used the persisted native ID with cold path memory cleared. Both UPS events
1209
+ had native task/turn-context metadata, but the new user record appeared only after
1210
+ ACK, absent at ingress and during the hold. Waiting for that record before ACK
1211
+ would deadlock the work ACK unblocks. This is ordering evidence, not a filesystem
1212
+ authority requirement for the authenticated per-launch hook channel.
1213
+
1214
+ Official `rust-v0.159.2` commit `ff6aec96948b70d94983af2641a6b67c94faeff5` explains it:
1215
+ `core/src/hook_runtime.rs::inspect_pending_input` supplies active
1216
+ `turn_context.sub_id` and awaits UPS; `core/src/session/turn.rs::run_hooks_and_record_inputs`
1217
+ records afterward. SessionStart hooks run earlier. Steering shares the active
1218
+ context, so Enter need not create a new turn ID. `core/src/tasks/regular.rs` runs
1219
+ input hooks on cancelled startup too: cancellation cannot rule out delayed prior
1220
+ UPS. Successors must retain predecessor boundaries, not claim unfamiliar IDs from
1221
+ matching text alone.
1222
+
1223
+ Opt-in `tests/e2e/codex-native-response.e2e.ts` passed on Codex 0.159.2 / Node 24.7.0,
1224
+ `gpt-6-luna`, low effort: two valid model turns in private home/empty workspace,
1225
+ cold `CodexSession.send` then `HeadlessCliSession.stream` using persisted Elwood
1226
+ record/native resume ID. Each returned its distinct exact synthetic token; resume
1227
+ excluded the old token. Each had one paste/Enter/UPS/Stop and zero tools. Private
1228
+ home removal and unchanged parent environment passed. This pinned-version response
1229
+ isolation proof is separate from bogus-model ACK ordering.
1230
+
1231
+ The pinned response fixture isolates both probe and PTY shell startup with a
1232
+ child-only `ZDOTDIR` pointing at its private home. An inherited interactive zsh
1233
+ profile timed out before `codex --version` at 15 seconds; the same pinned binary
1234
+ with an empty private profile directory returned its version in 52 ms. This
1235
+ preflight failure submitted no model turn. Parent environment values stay intact.
1236
+
1237
+ ## Claude question editor captures (2026-10-20)
1238
+
1239
+ Claude Code 2.1.305 accepts a single question on Enter. Grouped questions advance
1240
+ through tabs and end on a separate Review your answers / Submit answers page.
1241
+ Multi-select uses checkbox rows, Space to toggle, and a per-question Submit row.
1242
+
1243
+ The highlighted Type something row is already an editor: paste before Enter.
1244
+ An empty Enter there declines the request. A two-line bracketed paste preserved
1245
+ its newline. Choice rows start at column zero with a highlight or space, followed
1246
+ by one space. Other continuations are indented five spaces, so their numbered
1247
+ lists are text, not additional choices. The checkbox Submit row also uses five
1248
+ columns, but occurs only in the multi-select layout.
1249
+
1250
+ A native checkbox Submit highlight can have a hidden terminal cursor parked at
1251
+ column zero on the viewport's bottom blank row. A multiline Other answer places
1252
+ the visible cursor on its indented continuation. Neither necessarily sits on
1253
+ the highlighted option glyph. The captures used private configuration and
1254
+ authentication copies with synthetic prompts; see
1255
+ `tests/fixtures/claude-2.1.305/questions/`.
1256
+
1257
+ ### Claude question dialogs and manual composer (2026-10-20)
1258
+
1259
+ Claude Code 2.1.305 renders `AskUserQuestion` as a fenced questionnaire with
1260
+ checkbox headers, numbered choices, and a selected `❯` row. That caret belongs
1261
+ to the dialog, so the captured questionnaire is a blocking screen fact. The
1262
+ retained question and review frames are under
1263
+ `tests/fixtures/claude-2.1.305/questions/`.
1264
+
1265
+ After native submission the captured `accepted-manual-composer.json` contains
1266
+ `⏸ manual mode on · ? for shortcuts` below the fenced empty composer. Earlier
1267
+ question prompts remain above it. The footer is valid native composer chrome;
1268
+ clearance still requires the current visible cursor at column two on the empty
1269
+ input row. A hook candidate may arrive while the previous composer is still
1270
+ visible, so that old frame cannot retire it before its matching questionnaire has
1271
+ appeared. Matching uses the live panel’s tabs and prompt, rather than earlier
1272
+ question text or cancellation notices retained in history.
1273
+
1274
+ These captures establish the questionnaire and manual-footer additions on
1275
+ 2.1.305. They do not reverify every screen-table pattern from earlier versions.
1276
+
1277
+ The private adapter/controller tests retain native input ownership when a
1278
+ composer repaint precedes the matching completion hook. Successful submissions
1279
+ keep their request pending; a post-write abort retires the public ID while the
1280
+ native hold remains until matching completion, replacement or turn end. A
1281
+ predecessor review panel cannot publish a newly observed successor.
1282
+
1283
+ Live sessions connect this adapter to the session-owned question controller,
1284
+ completed terminal renders, hook routing and the ordinary-input gate. Claude's
1285
+ hook-decision gate resolves the exact caller hook outcome before publishing a
1286
+ request; direct answers and denials withdraw automation while retaining native
1287
+ ownership until matching completion, replacement or turn end. The captured frames
1288
+ establish the native layouts; the capture-specific version and screen-pattern
1289
+ limitations above still apply.
1290
+
1291
+ Structured answers use the session-owned transaction lane; request listing
1292
+ bypasses an active ergonomic turn. After uncertain dispatch, both physical write
1293
+ settlement and matching native closure are required before ordinary input resumes,
1294
+ regardless of their order. The live screen-fact rule also holds input while the
1295
+ questionnaire is visible.
1296
+
1297
+
1298
+ A final Enter rejected before physical dispatch, including by a current-frame or
1299
+ abort guard, does not count as submission. Once dispatch begins, a rejection or
1300
+ abort leaves delivery uncertain: the native identity and input hold survive an
1301
+ empty composer until matching native completion, replacement or turn end.
1302
+ A semantic replacement of a known questionnaire must show matching new choices
1303
+ before a retained composer can retire it.
1304
+
1305
+ ### Codex question panels, work pulses, and Plan footer (2026-10-20)
1306
+
1307
+ Codex 0.163.0's native queued-question UI can coexist with a working status
1308
+ that pulses between `•` and `◦`. Both glyphs retain the elapsed-time and
1309
+ `esc to interrupt` grammar; the lighter pulse does not end the running turn.
1310
+ A blocking question panel ends with its own navigation/submission footer and
1311
+ must hold ordinary input even though its selected option also uses `›`.
1312
+ The captured queued choice panel hides the native cursor and can leave its
1313
+ coordinates at the end of the working row above the panel. That position is
1314
+ valid only with hidden cursor, exact working-row geometry, and blank intervening
1315
+ rows; a visible or unrelated cursor does not establish panel ownership.
1316
+
1317
+ After a Plan mode question completes, the native model footer includes the exact
1318
+ right-aligned `Plan mode (⇧tab to cycle)` suffix. That suffix preserves empty
1319
+ composer evidence alongside the existing model/footer grammar, current visible
1320
+ cursor, and overlay checks.
1321
+
1322
+ The native `async-editor-first.txt` queued editor and `blocking-modal-first.txt`
1323
+ modal captures retain their exact header and terminal footer. The collapsed
1324
+ `? 1 question` badge is not an open editor and does not itself block ordinary input.
1325
+
1326
+ These captures establish the layouts in
1327
+ `tests/fixtures/codex-0.163.0/questions/`; they do not reverify all earlier
1328
+ Codex trust and update dialogs.
1329
+
1330
+ ### Native Codex editor provenance and clipped drafts (2026-10-21)
1331
+
1332
+ Two isolated Codex 0.163.0 captures distinguish an empty placeholder from a
1333
+ literal answer with the same text. In queued input, `Type your answer` starts
1334
+ with a dimmed cursor cell at column 2; typing that literal leaves a nondimmed
1335
+ cursor after it at column 18. Modal notes render ` › Add notes` in both states,
1336
+ with the empty dimmed cursor at column 4 and the typed cursor at column 13.
1337
+ Private question frames retain the actual cursor-cell dimming and the cell-derived
1338
+ prefix from the same completed render. Public terminal snapshots keep their shape.
1339
+
1340
+ The native editor manually wraps text without setting xterm `isWrapped`, clips
1341
+ long prefixes even at 140×45, and omits visible glyphs for interior trailing
1342
+ spaces that still survive submission. Both queued and modal answers trim outer
1343
+ whitespace on submission: a synthetic 764-character paste was accepted as its
1344
+ 760-character `trim()` result. A continuation containing an indented `›` remains
1345
+ answer text; it cannot replace the native notes start after the option block.
1346
+
1347
+ The snapshots, source hashes, expected inputs, and native acceptance evidence are
1348
+ in `tests/fixtures/codex-0.163.0/questions/editor/`. A viewport alone cannot establish
1349
+ complete logical equality of multirow or clipped drafts. Cursor-cell style and a
1350
+ physical row prefix are partial evidence, so they must not confirm unshown answer
1351
+ text. Full-answer verification must bind an owned paste to the native accepted
1352
+ payload rather than infer missing text from the screen.
1353
+
1354
+ ## Native interactive question records (2026-10-20)
1355
+
1356
+ Claude Code 2.1.305 exposes structured `AskUserQuestion` input in PreToolUse and
1357
+ PermissionRequest hooks. PermissionRequest can omit the native tool-use ID
1358
+ (`tool_use_id`). Direct hook answers may bypass the terminal editor. PostToolUse
1359
+ carries the accepted answers for the entire tool request. See
1360
+ [Claude question editor captures](#claude-question-editor-captures-2026-10-20)
1361
+ for the captured editor, navigation and submission behavior.
1362
+
1363
+ Codex 0.163.0 Plan-mode
1364
+ `request_user_input` groups questions in a modal and returns one function output
1365
+ with all answers. Every question needs nonempty options; a free-text-only tool
1366
+ call was rejected before any editor appeared. None of the above plus notes
1367
+ provides free text. `request_user_input_async` immediately returns accepted:true,
1368
+ then exposes independently answerable queued questions while work continues.
1369
+ Shift+Left opens the editor. Answering one leaves the others available, with a
1370
+ committed `send_user_message_question_reply` envelope identifying the exact
1371
+ question. The editor advances to a remaining question and stays expanded, so
1372
+ Elwood remains `blocked` even while the working row continues. This status does
1373
+ not complete the original `send()` turn. Ordinary composer input is not an
1374
+ equivalent answer route. Consecutive answer echoes can contain indented `›`
1375
+ inside multiline text before the final assistant response. Only that bounded
1376
+ response makes them transcript history for empty-composer recognition; an
1377
+ uncompleted user echo or numbered native option block still holds input.
1378
+
1379
+ Async question AgentMessage records can say phase:final_answer while work is
1380
+ still running. They are question metadata, not a final assistant reply. The
1381
+ paginated item_completed mirror uses type AgentMessage. Deduplicate these mirrors
1382
+ against the stable tool call. The native question ID encodes the call ID and
1383
+ question index. Ctrl+] locally skips the focused async question without an answer
1384
+ record; Esc from its editor can merely collapse it. Do not treat every Esc as a
1385
+ turn interruption.
1386
+
1387
+ Queued editors after the first use `⇧→ prev question`; only the first uses
1388
+ `⇧→ main prompt`. Keep this distinction in captured and scripted navigation
1389
+ frames. If a local skip and Esc collapse coalesce into one output render, the
1390
+ smaller badge does not identify the removed question. Preserve the prior focused
1391
+ editor count until a matching remaining editor confirms that removal.