elanous 0.2.38 → 0.2.41

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 (712) hide show
  1. package/README.md +7 -7
  2. package/apps/pwa/out/404/index.html +1 -1
  3. package/apps/pwa/out/404.html +1 -1
  4. package/apps/pwa/out/_next/static/{RrjXTwz-urRAbChP1bX02 → GiOLWmt4MqDZePubBjA4Q}/_buildManifest.js +1 -1
  5. package/apps/pwa/out/_next/static/chunks/1115.434ae2ecb0ad986d.js +149 -0
  6. package/apps/pwa/out/_next/static/chunks/1121.667cec0bcdbb3fdb.js +36 -0
  7. package/apps/pwa/out/_next/static/chunks/1178.1aa9cad0e7695427.js +1 -0
  8. package/apps/pwa/out/_next/static/chunks/1197-54da59d250a6e476.js +1 -0
  9. package/apps/pwa/out/_next/static/chunks/{5203.51e5d8b5f1dcfe53.js → 1219.7e17964e0e7cd8e5.js} +3 -3
  10. package/apps/pwa/out/_next/static/chunks/1245.1cfd13b26dbd71d6.js +287 -0
  11. package/apps/pwa/out/_next/static/chunks/1494-f93046ff5c5a124d.js +1 -0
  12. package/apps/pwa/out/_next/static/chunks/1609.2b312797599b8e45.js +1 -0
  13. package/apps/pwa/out/_next/static/chunks/1661.0dd330f3d89f73f3.js +1 -0
  14. package/apps/pwa/out/_next/static/chunks/167-0c121e4b47e0f9da.js +1 -0
  15. package/apps/pwa/out/_next/static/chunks/1700.cdc2bf8cc685e221.js +90 -0
  16. package/apps/pwa/out/_next/static/chunks/1703-78e46acad29f3cfc.js +1 -0
  17. package/apps/pwa/out/_next/static/chunks/{7573.2376e13c9c21f1f8.js → 1765.679b29625c8e88d4.js} +2 -2
  18. package/apps/pwa/out/_next/static/chunks/{3528.e4b8ab70d339f965.js → 1800.f7ff51dc4978a958.js} +1 -1
  19. package/apps/pwa/out/_next/static/chunks/1971-7efb628c471dc5a0.js +1 -0
  20. package/apps/pwa/out/_next/static/chunks/1999-8de7b7bb36801913.js +1 -0
  21. package/apps/pwa/out/_next/static/chunks/2073.689dcb2680113d76.js +1 -0
  22. package/apps/pwa/out/_next/static/chunks/2198-557d49184104d165.js +1 -0
  23. package/apps/pwa/out/_next/static/chunks/221-440ce67fa9f5c839.js +1 -0
  24. package/apps/pwa/out/_next/static/chunks/{8879.ac06755bcf3e44a1.js → 2263.e09b6edea33bad2d.js} +1 -1
  25. package/apps/pwa/out/_next/static/chunks/2427-8ed8e98624cbd664.js +1 -0
  26. package/apps/pwa/out/_next/static/chunks/2457-725c5827bc003795.js +1 -0
  27. package/apps/pwa/out/_next/static/chunks/2491-2718b15a5ccb75a5.js +1 -0
  28. package/apps/pwa/out/_next/static/chunks/2527-5c636a43c7cc5dde.js +1 -0
  29. package/apps/pwa/out/_next/static/chunks/2692-1027cb16fe4ccf49.js +1 -0
  30. package/apps/pwa/out/_next/static/chunks/2743.5d3f76948be32b34.js +41 -0
  31. package/apps/pwa/out/_next/static/chunks/2773.0e80b9d325fb5635.js +32 -0
  32. package/apps/pwa/out/_next/static/chunks/2873-0f3cb56c8e3528ea.js +1 -0
  33. package/apps/pwa/out/_next/static/chunks/{9fe1b809.738da85c8b17e3fb.js → 2fdf2931.b431eee4fb468bc3.js} +1 -1
  34. package/apps/pwa/out/_next/static/chunks/{eaad0cba.771200940c529df7.js → 2fe2c302.41b517f88d6fe502.js} +1 -1
  35. package/apps/pwa/out/_next/static/chunks/3097.864e92bdaa2f4d15.js +79 -0
  36. package/apps/pwa/out/_next/static/chunks/3136-d6870ba63300a93e.js +1 -0
  37. package/apps/pwa/out/_next/static/chunks/3173-0289113d434e83b7.js +1 -0
  38. package/apps/pwa/out/_next/static/chunks/3230-49298c3b73ef2268.js +1 -0
  39. package/apps/pwa/out/_next/static/chunks/325-dd9208a1a0ab7ce4.js +1 -0
  40. package/apps/pwa/out/_next/static/chunks/3283.528f430dd043fb4e.js +74 -0
  41. package/apps/pwa/out/_next/static/chunks/3295.cc8cb13b8f0dae1a.js +1 -0
  42. package/apps/pwa/out/_next/static/chunks/3688-86e3b88abf18cb3b.js +1 -0
  43. package/apps/pwa/out/_next/static/chunks/3804-7220467a5473a8df.js +1 -0
  44. package/apps/pwa/out/_next/static/chunks/3808.3e1e247ce7bdf889.js +1 -0
  45. package/apps/pwa/out/_next/static/chunks/{b7478fef.5917716286213fcc.js → 385e4574.e9886ab32759eda3.js} +3 -3
  46. package/apps/pwa/out/_next/static/chunks/3927.b5473ad109da44c5.js +1 -0
  47. package/apps/pwa/out/_next/static/chunks/3934-98ea94832e194796.js +1 -0
  48. package/apps/pwa/out/_next/static/chunks/4133.2056bb4d78f621af.js +1 -0
  49. package/apps/pwa/out/_next/static/chunks/4156.ba4de4a3664f04b4.js +1 -0
  50. package/apps/pwa/out/_next/static/chunks/4297-239ca82f293faab0.js +1 -0
  51. package/apps/pwa/out/_next/static/chunks/4320-dcc5a7734126f4c9.js +1 -0
  52. package/apps/pwa/out/_next/static/chunks/4434.94b4c552a2d91e69.js +148 -0
  53. package/apps/pwa/out/_next/static/chunks/{8911.bf5e712acb25fb6c.js → 4527.a69f2894d1bc9f4a.js} +1 -1
  54. package/apps/pwa/out/_next/static/chunks/4579.03e4092f73950965.js +226 -0
  55. package/apps/pwa/out/_next/static/chunks/{5307.d7328020227880c2.js → 4667.97e31aa38c95c475.js} +4 -4
  56. package/apps/pwa/out/_next/static/chunks/{6142.913b44e260a3f925.js → 4702.4a4adc1f16d7c93b.js} +1 -1
  57. package/apps/pwa/out/_next/static/chunks/4815.481501c57b3568d9.js +1 -0
  58. package/apps/pwa/out/_next/static/chunks/487-d16e698ef14662d9.js +1 -0
  59. package/apps/pwa/out/_next/static/chunks/4888-7a38bf522c9cc6fe.js +1 -0
  60. package/apps/pwa/out/_next/static/chunks/5034-30e429d6bb086881.js +1 -0
  61. package/apps/pwa/out/_next/static/chunks/5040-35c494e60dadd97d.js +1 -0
  62. package/apps/pwa/out/_next/static/chunks/50c6ab1e.81a96e419350909d.js +1 -0
  63. package/apps/pwa/out/_next/static/chunks/5154.4b6a836179356f30.js +94 -0
  64. package/apps/pwa/out/_next/static/chunks/{8487.291666583bebe640.js → 5159.115f1c2ca471386c.js} +1 -1
  65. package/apps/pwa/out/_next/static/chunks/5228-a8200df486278f2d.js +1 -0
  66. package/apps/pwa/out/_next/static/chunks/530.d26346e18089640a.js +115 -0
  67. package/apps/pwa/out/_next/static/chunks/5379.97af106d09566f69.js +8 -0
  68. package/apps/pwa/out/_next/static/chunks/{89d6c04f-6b8ab341748e468a.js → 53aeb4ee-51c92f8d683f5220.js} +1 -1
  69. package/apps/pwa/out/_next/static/chunks/{3291.f6c1005387d514bd.js → 5471.1e611302ed3a7c53.js} +2 -2
  70. package/apps/pwa/out/_next/static/chunks/5479-b6372e762719f92f.js +1 -0
  71. package/apps/pwa/out/_next/static/chunks/5534-699c5cbcbc96c5d7.js +1 -0
  72. package/apps/pwa/out/_next/static/chunks/{3086.fb14b60ce98b53d3.js → 5574.f35accf4f132b29d.js} +1 -1
  73. package/apps/pwa/out/_next/static/chunks/5701.9c4e8f250312eeee.js +24 -0
  74. package/apps/pwa/out/_next/static/chunks/{1632.7d87f998e714bede.js → 5744.b9415e18ad623100.js} +1 -1
  75. package/apps/pwa/out/_next/static/chunks/{5300.677c97e0393742e6.js → 5892.2526d962339662d8.js} +1 -1
  76. package/apps/pwa/out/_next/static/chunks/5937.c2df9e3447e1f667.js +1 -0
  77. package/apps/pwa/out/_next/static/chunks/5941.8210cc93c9202c0a.js +286 -0
  78. package/apps/pwa/out/_next/static/chunks/{7161-8f22db3ec5ed005e.js → 5947-135e26537d80a6b9.js} +3 -3
  79. package/apps/pwa/out/_next/static/chunks/{3124-561f7f037943cde2.js → 5964-7e21164a8f2cf0ce.js} +1 -1
  80. package/apps/pwa/out/_next/static/chunks/5975.4004f820ae3cecd5.js +1 -0
  81. package/apps/pwa/out/_next/static/chunks/6142-7ccd48795d7abd55.js +1 -0
  82. package/apps/pwa/out/_next/static/chunks/6160.bf9177b8c1bfb243.js +1 -0
  83. package/apps/pwa/out/_next/static/chunks/6398.71ba0690c8027555.js +27 -0
  84. package/apps/pwa/out/_next/static/chunks/6492.2bd5c10edc1a064e.js +1 -0
  85. package/apps/pwa/out/_next/static/chunks/6552.a3840aa7da35ad68.js +62 -0
  86. package/apps/pwa/out/_next/static/chunks/6736.1e36d3ac5fa5e41d.js +24 -0
  87. package/apps/pwa/out/_next/static/chunks/6874.d5cf7eb8edb2cabe.js +2 -0
  88. package/apps/pwa/out/_next/static/chunks/6900.3ccbe069bdd4556a.js +1 -0
  89. package/apps/pwa/out/_next/static/chunks/71327eb4.add50b365f94bf3a.js +122 -0
  90. package/apps/pwa/out/_next/static/chunks/7136.deca3e3a2ddaa374.js +1 -0
  91. package/apps/pwa/out/_next/static/chunks/7139-ee9f8ed2677a40b3.js +1 -0
  92. package/apps/pwa/out/_next/static/chunks/{2415.738b777642a02233.js → 7191.fdc955f7d96064a4.js} +1 -1
  93. package/apps/pwa/out/_next/static/chunks/7423-e0aa5d9e2962120e.js +1 -0
  94. package/apps/pwa/out/_next/static/chunks/7453.afc1ea7e05d56a8c.js +1 -0
  95. package/apps/pwa/out/_next/static/chunks/7503-5e6a3d7fe67e4a0c.js +1 -0
  96. package/apps/pwa/out/_next/static/chunks/7761-476fd7bf768abd34.js +1 -0
  97. package/apps/pwa/out/_next/static/chunks/7975.eafb12097a0a9e62.js +1 -0
  98. package/apps/pwa/out/_next/static/chunks/{1026-44010f405704050c.js → 8050-9b364bdef8f71927.js} +1 -1
  99. package/apps/pwa/out/_next/static/chunks/8152.64e253c35cccfaae.js +1 -0
  100. package/apps/pwa/out/_next/static/chunks/8190.620f0231b3924bcb.js +1 -0
  101. package/apps/pwa/out/_next/static/chunks/83184dcd-0ee6247ff41eb3f2.js +1 -0
  102. package/apps/pwa/out/_next/static/chunks/8448.45b6b1f1a99eeb35.js +104 -0
  103. package/apps/pwa/out/_next/static/chunks/8464-e24f10451b658aac.js +1 -0
  104. package/apps/pwa/out/_next/static/chunks/8477.e4c944bb3aa5d2f3.js +1 -0
  105. package/apps/pwa/out/_next/static/chunks/8710.ca385257d5ca422e.js +1 -0
  106. package/apps/pwa/out/_next/static/chunks/8830.627ccf294ec2465c.js +1 -0
  107. package/apps/pwa/out/_next/static/chunks/8880.64c445592f04acaf.js +1 -0
  108. package/apps/pwa/out/_next/static/chunks/8981.c706964c8ba27aff.js +1 -0
  109. package/apps/pwa/out/_next/static/chunks/{5638.107314dc479e2f37.js → 9048.212083de42d25be3.js} +2 -2
  110. package/apps/pwa/out/_next/static/chunks/9053.bd0fffaff8d3f836.js +1 -0
  111. package/apps/pwa/out/_next/static/chunks/9161-c66e723d7ec9d682.js +1 -0
  112. package/apps/pwa/out/_next/static/chunks/9185.1ecdf9b65c0bb684.js +1 -0
  113. package/apps/pwa/out/_next/static/chunks/9356.fccd5f58086b4ff5.js +1 -0
  114. package/apps/pwa/out/_next/static/chunks/9446.dc0406109371d329.js +1 -0
  115. package/apps/pwa/out/_next/static/chunks/9506.dcf25d467a42627e.js +1 -0
  116. package/apps/pwa/out/_next/static/chunks/{8019.21ca554a821dad01.js → 9507.7026657a2f47eb64.js} +16 -16
  117. package/apps/pwa/out/_next/static/chunks/9541.eb8e2f8480c7feca.js +93 -0
  118. package/apps/pwa/out/_next/static/chunks/9577.ed7582186efa5482.js +1 -0
  119. package/apps/pwa/out/_next/static/chunks/9579.4a8169600fff2058.js +1 -0
  120. package/apps/pwa/out/_next/static/chunks/9642-ff2e039eb62e3b92.js +1 -0
  121. package/apps/pwa/out/_next/static/chunks/9659-8f2323348113ad80.js +1 -0
  122. package/apps/pwa/out/_next/static/chunks/9724.4c5623af2db43153.js +34 -0
  123. package/apps/pwa/out/_next/static/chunks/{6493.27ad77de7aac7966.js → 9834.63ab2bbc3153172e.js} +1 -1
  124. package/apps/pwa/out/_next/static/chunks/{3389.012c70767a872f9b.js → 9869.81a1e24ca682d5a0.js} +1 -1
  125. package/apps/pwa/out/_next/static/chunks/{8994d93e.33ba491f95345fc2.js → a0a01613.6d1cca322238d7fe.js} +1 -1
  126. package/apps/pwa/out/_next/static/chunks/{de8b930d.d94c0f42acf807fc.js → addc2b32.8c4ff8f0aefe987d.js} +1 -1
  127. package/apps/pwa/out/_next/static/chunks/app/_not-found/page-8d9d76ea322d855c.js +1 -0
  128. package/apps/pwa/out/_next/static/chunks/app/approvals/page-ed2c4e59f9f1fe21.js +1 -0
  129. package/apps/pwa/out/_next/static/chunks/app/autopilot/page-2dc99e03c5d76ca0.js +1 -0
  130. package/apps/pwa/out/_next/static/chunks/app/board/page-b5a3a788330e920f.js +1 -0
  131. package/apps/pwa/out/_next/static/chunks/app/botlab/{page-866aac5ff226a7f3.js → page-14949db884bfa672.js} +1 -1
  132. package/apps/pwa/out/_next/static/chunks/app/bots/page-ea76c85b36388a97.js +1 -0
  133. package/apps/pwa/out/_next/static/chunks/app/ceo/page-01716d20af62d325.js +1 -0
  134. package/apps/pwa/out/_next/static/chunks/app/chat/page-62baf6881a64b1e9.js +1 -0
  135. package/apps/pwa/out/_next/static/chunks/app/consult/page-f89ba590c2af8afa.js +1 -0
  136. package/apps/pwa/out/_next/static/chunks/app/control/page-22f8b0f78d9637e5.js +1 -0
  137. package/apps/pwa/out/_next/static/chunks/app/decisions/page-817f9d7e6820be80.js +1 -0
  138. package/apps/pwa/out/_next/static/chunks/app/design-check/page-ffb9bc0d2650249a.js +1 -0
  139. package/apps/pwa/out/_next/static/chunks/app/editor/page-f6d0e64873c0f629.js +1 -0
  140. package/apps/pwa/out/_next/static/chunks/app/exec/page-8bfa0d4ba23a209d.js +1 -0
  141. package/apps/pwa/out/_next/static/chunks/app/field/page-f5060462249e32c7.js +1 -0
  142. package/apps/pwa/out/_next/static/chunks/app/healthz/route-8d9d76ea322d855c.js +1 -0
  143. package/apps/pwa/out/_next/static/chunks/app/inside/page-b2049f8b1ef79117.js +1 -0
  144. package/apps/pwa/out/_next/static/chunks/app/intake/page-1446c5fa93907f11.js +1 -0
  145. package/apps/pwa/out/_next/static/chunks/app/layout-b48a7a07c5204156.js +1 -0
  146. package/apps/pwa/out/_next/static/chunks/app/live/page-e974b8c4ca47614c.js +1 -0
  147. package/apps/pwa/out/_next/static/chunks/app/live-run/page-8a919b869bd28594.js +1 -0
  148. package/apps/pwa/out/_next/static/chunks/app/loops/page-d31b8de6bfcd72ed.js +1 -0
  149. package/apps/pwa/out/_next/static/chunks/app/market/page-64765f817909db29.js +1 -0
  150. package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-d128c8569a36ee9b.js +1 -0
  151. package/apps/pwa/out/_next/static/chunks/app/morning/page-b2679d357e9b9270.js +1 -0
  152. package/apps/pwa/out/_next/static/chunks/app/not-found-6fabec98a9e7b269.js +1 -0
  153. package/apps/pwa/out/_next/static/chunks/app/observatory/page-048f30149dcf1349.js +1 -0
  154. package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-9113181d6b5a2725.js +1 -0
  155. package/apps/pwa/out/_next/static/chunks/app/ops/release/page-40f9e19149024298.js +1 -0
  156. package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-1e7a755a13227611.js +1 -0
  157. package/apps/pwa/out/_next/static/chunks/app/outputs/page-3c8f8b67a203cf07.js +1 -0
  158. package/apps/pwa/out/_next/static/chunks/app/page-18032f5437215062.js +1 -0
  159. package/apps/pwa/out/_next/static/chunks/app/reflection/page-da3b739192fd0ee3.js +1 -0
  160. package/apps/pwa/out/_next/static/chunks/app/scheduler/page-d332545571bd6fd1.js +1 -0
  161. package/apps/pwa/out/_next/static/chunks/app/sessions/page-5237aa5b3f3b8ec5.js +1 -0
  162. package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-a142dfb0331a05f5.js +1 -0
  163. package/apps/pwa/out/_next/static/chunks/app/settings/page-d16e56c3989c147e.js +1 -0
  164. package/apps/pwa/out/_next/static/chunks/app/setup/done/page-6b6593600869e2cd.js +1 -0
  165. package/apps/pwa/out/_next/static/chunks/app/setup/layout-8d9d76ea322d855c.js +1 -0
  166. package/apps/pwa/out/_next/static/chunks/app/setup/page-29e8b8a8396b55cb.js +1 -0
  167. package/apps/pwa/out/_next/static/chunks/app/share/page-b3414d856a1a7e2f.js +1 -0
  168. package/apps/pwa/out/_next/static/chunks/app/showroom/page-c3affa52b7ce961b.js +1 -0
  169. package/apps/pwa/out/_next/static/chunks/app/tasks/page-f21dddf9f95b6fab.js +1 -0
  170. package/apps/pwa/out/_next/static/chunks/app/term/page-f5a30a24745bf088.js +1 -0
  171. package/apps/pwa/out/_next/static/chunks/app/today/page-8c8569a09b4d4e34.js +1 -0
  172. package/apps/pwa/out/_next/static/chunks/app/trace/page-2ce32722c0243483.js +1 -0
  173. package/apps/pwa/out/_next/static/chunks/app/vault/page-4767b0d9c0a98c6c.js +1 -0
  174. package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-116ee1339c387a75.js +1 -0
  175. package/apps/pwa/out/_next/static/chunks/app/workflows/page-35e8c50ca4ef7ffc.js +1 -0
  176. package/apps/pwa/out/_next/static/chunks/app/workspace/page-52e17113356bb891.js +1 -0
  177. package/apps/pwa/out/_next/static/chunks/app/worktrees/page-7458ae05ed2ac1a0.js +1 -0
  178. package/apps/pwa/out/_next/static/chunks/b2271e54.c1de3347976e90b0.js +1 -0
  179. package/apps/pwa/out/_next/static/chunks/{b7459770.6539b11860eb8a9c.js → c0c1a699.0ba79f97005965d4.js} +7 -7
  180. package/apps/pwa/out/_next/static/chunks/framework-ad6c9dd524ad6ef8.js +1 -0
  181. package/apps/pwa/out/_next/static/chunks/main-app-2ddd1f2b44d6aa59.js +1 -0
  182. package/apps/pwa/out/_next/static/chunks/main-e3d82bdc358d20c5.js +1 -0
  183. package/apps/pwa/out/_next/static/chunks/pages/_app-71d5aa3896e1655f.js +1 -0
  184. package/apps/pwa/out/_next/static/chunks/pages/_error-03ffc54e00438546.js +1 -0
  185. package/apps/pwa/out/_next/static/chunks/webpack-56bb89af5a611d0b.js +1 -0
  186. package/apps/pwa/out/approvals/index.html +1 -1
  187. package/apps/pwa/out/approvals/index.txt +22 -22
  188. package/apps/pwa/out/autopilot/index.html +1 -1
  189. package/apps/pwa/out/autopilot/index.txt +22 -22
  190. package/apps/pwa/out/board/index.html +1 -1
  191. package/apps/pwa/out/board/index.txt +22 -22
  192. package/apps/pwa/out/botlab/index.html +1 -1
  193. package/apps/pwa/out/botlab/index.txt +21 -21
  194. package/apps/pwa/out/bots/index.html +1 -1
  195. package/apps/pwa/out/bots/index.txt +21 -21
  196. package/apps/pwa/out/ceo/index.html +1 -1
  197. package/apps/pwa/out/ceo/index.txt +22 -22
  198. package/apps/pwa/out/chat/index.html +1 -1
  199. package/apps/pwa/out/chat/index.txt +21 -21
  200. package/apps/pwa/out/consult/index.html +1 -1
  201. package/apps/pwa/out/consult/index.txt +22 -22
  202. package/apps/pwa/out/control/index.html +1 -1
  203. package/apps/pwa/out/control/index.txt +22 -22
  204. package/apps/pwa/out/decisions/index.html +1 -1
  205. package/apps/pwa/out/decisions/index.txt +21 -21
  206. package/apps/pwa/out/design-check/index.html +1 -1
  207. package/apps/pwa/out/design-check/index.txt +22 -22
  208. package/apps/pwa/out/editor/index.html +1 -1
  209. package/apps/pwa/out/editor/index.txt +22 -22
  210. package/apps/pwa/out/exec/index.html +1 -1
  211. package/apps/pwa/out/exec/index.txt +22 -22
  212. package/apps/pwa/out/field/index.html +1 -1
  213. package/apps/pwa/out/field/index.txt +22 -22
  214. package/apps/pwa/out/healthz +1 -1
  215. package/apps/pwa/out/index.html +1 -1
  216. package/apps/pwa/out/index.txt +21 -21
  217. package/apps/pwa/out/inside/index.html +1 -1
  218. package/apps/pwa/out/inside/index.txt +21 -21
  219. package/apps/pwa/out/intake/index.html +1 -1
  220. package/apps/pwa/out/intake/index.txt +22 -22
  221. package/apps/pwa/out/live/index.html +1 -1
  222. package/apps/pwa/out/live/index.txt +22 -22
  223. package/apps/pwa/out/live-run/index.html +1 -1
  224. package/apps/pwa/out/live-run/index.txt +22 -22
  225. package/apps/pwa/out/loops/index.html +1 -1
  226. package/apps/pwa/out/loops/index.txt +21 -21
  227. package/apps/pwa/out/market/index.html +1 -1
  228. package/apps/pwa/out/market/index.txt +21 -21
  229. package/apps/pwa/out/missions/placeholder/index.html +1 -1
  230. package/apps/pwa/out/missions/placeholder/index.txt +21 -21
  231. package/apps/pwa/out/morning/index.html +1 -1
  232. package/apps/pwa/out/morning/index.txt +22 -22
  233. package/apps/pwa/out/observatory/index.html +1 -1
  234. package/apps/pwa/out/observatory/index.txt +22 -22
  235. package/apps/pwa/out/ops/checklist/index.html +1 -1
  236. package/apps/pwa/out/ops/checklist/index.txt +21 -21
  237. package/apps/pwa/out/ops/release/index.html +1 -1
  238. package/apps/pwa/out/ops/release/index.txt +21 -21
  239. package/apps/pwa/out/ops/seats/index.html +1 -1
  240. package/apps/pwa/out/ops/seats/index.txt +21 -21
  241. package/apps/pwa/out/outputs/index.html +1 -1
  242. package/apps/pwa/out/outputs/index.txt +21 -21
  243. package/apps/pwa/out/reflection/index.html +1 -1
  244. package/apps/pwa/out/reflection/index.txt +22 -22
  245. package/apps/pwa/out/scheduler/index.html +1 -1
  246. package/apps/pwa/out/scheduler/index.txt +22 -22
  247. package/apps/pwa/out/sessions/index.html +1 -1
  248. package/apps/pwa/out/sessions/index.txt +21 -21
  249. package/apps/pwa/out/settings/devices/index.html +1 -1
  250. package/apps/pwa/out/settings/devices/index.txt +22 -22
  251. package/apps/pwa/out/settings/index.html +1 -1
  252. package/apps/pwa/out/settings/index.txt +22 -22
  253. package/apps/pwa/out/setup/done/index.html +1 -1
  254. package/apps/pwa/out/setup/done/index.txt +22 -22
  255. package/apps/pwa/out/setup/index.html +1 -1
  256. package/apps/pwa/out/setup/index.txt +22 -22
  257. package/apps/pwa/out/share/index.html +1 -1
  258. package/apps/pwa/out/share/index.txt +22 -22
  259. package/apps/pwa/out/showroom/index.html +1 -1
  260. package/apps/pwa/out/showroom/index.txt +21 -21
  261. package/apps/pwa/out/tasks/index.html +1 -1
  262. package/apps/pwa/out/tasks/index.txt +22 -22
  263. package/apps/pwa/out/term/index.html +1 -1
  264. package/apps/pwa/out/term/index.txt +22 -22
  265. package/apps/pwa/out/today/index.html +1 -1
  266. package/apps/pwa/out/today/index.txt +22 -22
  267. package/apps/pwa/out/trace/index.html +1 -1
  268. package/apps/pwa/out/trace/index.txt +22 -22
  269. package/apps/pwa/out/vault/index.html +1 -1
  270. package/apps/pwa/out/vault/index.txt +22 -22
  271. package/apps/pwa/out/workflows/chat-ui/index.html +1 -1
  272. package/apps/pwa/out/workflows/chat-ui/index.txt +22 -22
  273. package/apps/pwa/out/workflows/index.html +1 -1
  274. package/apps/pwa/out/workflows/index.txt +22 -22
  275. package/apps/pwa/out/workspace/index.html +1 -1
  276. package/apps/pwa/out/workspace/index.txt +22 -22
  277. package/apps/pwa/out/worktrees/index.html +1 -1
  278. package/apps/pwa/out/worktrees/index.txt +22 -22
  279. package/bin/elanous.mjs +6 -1
  280. package/catalog/models/openai/gpt-6.1-sol.yaml +16 -0
  281. package/catalog/models/openai/gpt-6.1-terra.yaml +16 -0
  282. package/graphs/demo/persona-marketer/fixtures/marketer-scenario.yaml +10 -0
  283. package/graphs/demo/persona-marketer/persona-marketer.yaml +25 -0
  284. package/graphs/demo/persona-marketer/recipes.yaml +19 -0
  285. package/graphs/demo/persona-teacher/lesson-pack.yaml +16 -0
  286. package/graphs/demo/persona-teacher/recipes.yaml +17 -0
  287. package/graphs/demo/persona-teacher/weekly-lesson.yaml +36 -0
  288. package/graphs/overlays/stop-heal-ladder.yaml +23 -2
  289. package/graphs/release/release-loop.yaml +3 -1
  290. package/graphs/units/gate/gate.yaml +20 -0
  291. package/graphs/units/git/git.yaml +26 -0
  292. package/graphs/units/implement/implement.yaml +19 -0
  293. package/graphs/units/landing/landing.yaml +18 -0
  294. package/graphs/units/review/review.yaml +20 -0
  295. package/graphs/units/verbs/recipes.yaml +3 -0
  296. package/graphs/units/verbs/research.yaml +20 -0
  297. package/graphs/video/explainer-line.yaml +4 -1
  298. package/graphs/work/research-report.yaml +11 -1
  299. package/package.json +1 -1
  300. package/scripts/dead-code/report.ts +169 -0
  301. package/scripts/disk-steward.ts +46 -0
  302. package/scripts/fleet/node-setup.sh +50 -0
  303. package/scripts/graph-units/verbs/research.ts +55 -0
  304. package/scripts/lib/morning-report-options.ts +3 -4
  305. package/scripts/lib/tui-regress-evidence.ts +56 -0
  306. package/scripts/llm-cost-ledger.ts +179 -8
  307. package/scripts/measure-nl-routing-corpus.ts +10 -2
  308. package/scripts/morning-report.ts +5 -1
  309. package/scripts/persona-teacher/weekly-lesson-node.ts +172 -0
  310. package/scripts/public-copy-lint.ts +163 -19
  311. package/scripts/public-export.ts +15 -7
  312. package/scripts/ratchets/train-side-invariants.sh +0 -1
  313. package/scripts/release-loop/export-check-node.ts +21 -3
  314. package/scripts/release-loop/gate-autoheal.ts +117 -0
  315. package/scripts/release-loop/gate-baseline-receipt.ts +8 -1
  316. package/scripts/release-loop/gate-diff.ts +22 -3
  317. package/scripts/release-loop/gate-node.ts +583 -64
  318. package/scripts/release-loop/gate-shard-dispatch.ts +128 -0
  319. package/scripts/release-loop/gate-shard-load-flaky.ts +256 -0
  320. package/scripts/release-loop/gate-shard-receipts.ts +89 -0
  321. package/scripts/release-loop/gate-triage-node.ts +70 -10
  322. package/scripts/release-loop/gate-wall.ts +5 -5
  323. package/scripts/release-loop/preflight.ts +6 -2
  324. package/scripts/release-loop/resume-release.ts +267 -20
  325. package/scripts/release-loop/resume.ts +48 -0
  326. package/scripts/release-loop/traffic-node.ts +6 -3
  327. package/scripts/release-loop/unattended-release.ts +4 -2
  328. package/scripts/release-loop/version-node.ts +7 -2
  329. package/scripts/release-story/draft.ts +1 -1
  330. package/scripts/research-bench/README.md +53 -0
  331. package/scripts/research-bench/questions.json +66 -0
  332. package/scripts/research-bench/rubric.md +33 -0
  333. package/scripts/research-bench/run.ts +523 -0
  334. package/scripts/shadow-authoring-probe.ts +20 -0
  335. package/scripts/tui-regress.ts +85 -10
  336. package/scripts/ux-sim.ts +19 -2
  337. package/src/acp/core-turn-bridge.ts +94 -4
  338. package/src/agent/autonomous-tools.ts +10 -3
  339. package/src/agent/monad-agent-turn.ts +4 -1
  340. package/src/agent/registry.ts +26 -2
  341. package/src/agent/shared-app-tools.ts +1 -1
  342. package/src/agent/surface-ux/build.ts +12 -3
  343. package/src/agent/surface-ux/types.ts +1 -1
  344. package/src/agent/task-notification.ts +75 -6
  345. package/src/agent/types.ts +3 -0
  346. package/src/agent-mission/driver.ts +29 -3
  347. package/src/agent-mission/mission-cli.ts +2 -1
  348. package/src/agent-substrate/review-context-pack.ts +365 -0
  349. package/src/agent-substrate/self-review-cli.ts +291 -20
  350. package/src/ask-user-question/index.ts +6 -0
  351. package/src/ask-user-question/inline-resolver.ts +49 -0
  352. package/src/auto-research/question-ladder-contract.ts +22 -3
  353. package/src/auto-research/research-turn.ts +359 -17
  354. package/src/autopilot/agent-loop.ts +1 -1
  355. package/src/autopilot/discovery/wiki-claim-proposer.ts +22 -1
  356. package/src/autopilot/pty-control-loop.ts +8 -1
  357. package/src/boot/daemon-tools/index.ts +4 -3
  358. package/src/boot/daemon-tools/self-implement.ts +312 -7
  359. package/src/boot/daemon-tools/types.ts +2 -0
  360. package/src/budget/llm-cost.ts +44 -5
  361. package/src/budget/shadow-arms.ts +52 -0
  362. package/src/budget/unified-usage.ts +17 -1
  363. package/src/capture/tui-self-report.ts +14 -0
  364. package/src/chat/index.ts +33 -7
  365. package/src/chat/pickers/state.ts +7 -1
  366. package/src/cli/agent-cli.ts +43 -8
  367. package/src/cli/intake-cli.ts +22 -1
  368. package/src/cli/lesson-cli.ts +19 -3
  369. package/src/cli/log-event-names.ts +6 -0
  370. package/src/cli/mcp-login.ts +8 -18
  371. package/src/cli/msg-cli.ts +57 -1
  372. package/src/cli/pod-cli.ts +17 -2
  373. package/src/cli/pr-land-heavy-remote.ts +15 -9
  374. package/src/cli/pty-takeover-cli.ts +67 -7
  375. package/src/cli/release-cli.ts +79 -7
  376. package/src/cli/repo-cli.ts +2 -1
  377. package/src/cli/sim-cli.ts +7 -1
  378. package/src/cli/tasks-cli.ts +41 -13
  379. package/src/codex/models.ts +30 -15
  380. package/src/control-plane/ledger.ts +21 -4
  381. package/src/core-turn/run-core-turn.ts +47 -3
  382. package/src/core-turn/run-goal-loop.ts +240 -10
  383. package/src/core-turn/types.ts +9 -0
  384. package/src/dashboard/acp-boot.ts +72 -3
  385. package/src/dashboard/chat/acp-chat.ts +2 -2
  386. package/src/dashboard/classic-sigquit.ts +16 -0
  387. package/src/dashboard/index.ts +327 -27
  388. package/src/dashboard/input/chat-main-interaction-opts.ts +3 -0
  389. package/src/dashboard/input/chat-main-plain-turn-runtime.ts +7 -2
  390. package/src/dashboard/input/chat-main-slash-command.ts +7 -0
  391. package/src/dashboard/input/dashboard-plain-turn-stream.ts +4 -0
  392. package/src/dashboard/input/dashboard-priority-key-route.ts +21 -5
  393. package/src/dashboard/input/external-input-host.ts +2 -0
  394. package/src/dashboard/sidetab-runtime.ts +228 -0
  395. package/src/dashboard/slash-runtime/ask-clarification.ts +7 -1
  396. package/src/dashboard/slash-runtime/dashboard-handlers.ts +20 -8
  397. package/src/dashboard/slash-runtime/help-from-registry.ts +2 -2
  398. package/src/dashboard/term-slash-runtime.ts +16 -18
  399. package/src/dashboard/turn-preamble.ts +14 -1
  400. package/src/disk-steward/judge.ts +73 -0
  401. package/src/disk-steward/ledger.ts +122 -0
  402. package/src/disk-steward/steward.ts +373 -0
  403. package/src/domains/guardian-tick.ts +191 -2
  404. package/src/domains/knowledge.ts +1 -1
  405. package/src/esc-abort-gate.ts +33 -1
  406. package/src/execution-loop/launch-gate.ts +206 -1
  407. package/src/graph-runner/graph-cli.ts +27 -4
  408. package/src/graph-runner/in-process-registry.ts +37 -0
  409. package/src/graph-runner/runner.ts +63 -11
  410. package/src/graph-wizard/generate.ts +16 -7
  411. package/src/graph-wizard/mission-compose.ts +201 -0
  412. package/src/grok/agent-search.ts +8 -2
  413. package/src/grok/credential.ts +5 -0
  414. package/src/grounding/ref-index.ts +30 -0
  415. package/src/grounding/ref-vector.ts +61 -0
  416. package/src/grounding/sources-cli.ts +11 -3
  417. package/src/grounding/sources.ts +15 -1
  418. package/src/harness/harness-cli-command.ts +305 -23
  419. package/src/harness/harness-incidents.ts +312 -7
  420. package/src/harness/harness-pod-dispatch.ts +7 -1
  421. package/src/harness/harness-space.ts +15 -1
  422. package/src/harness/progress-worker-entry.ts +59 -0
  423. package/src/harness/progress-worker-runtime.ts +11 -0
  424. package/src/index.ts +35 -5
  425. package/src/input/external-input-queue.ts +10 -0
  426. package/src/instance/dev-project.ts +25 -0
  427. package/src/intake-plane/collect-telegram-saved.ts +36 -1
  428. package/src/intake-plane/intake-to-tasks.ts +246 -3
  429. package/src/intelligence-map/model-alias.ts +6 -5
  430. package/src/intelligence-map/model-catalog.ts +59 -2
  431. package/src/lessons/friction-ledger.ts +154 -0
  432. package/src/live-supply/collector.ts +149 -0
  433. package/src/live-supply/probes.ts +52 -0
  434. package/src/live-supply/snapshot.ts +40 -0
  435. package/src/llm/model-defaults.ts +4 -4
  436. package/src/llm.ts +473 -87
  437. package/src/loops/orchestrator/tick.ts +56 -0
  438. package/src/mcp/mcp-oauth.ts +3 -1
  439. package/src/model-tier/llm-tier-map.ts +9 -9
  440. package/src/model-tier/turn-tier.ts +1 -1
  441. package/src/msg/msg-mirror-github.ts +80 -0
  442. package/src/msg/msg-mirror-policy.ts +61 -0
  443. package/src/msg/msg-mirror-runner.ts +219 -0
  444. package/src/msg/msg-mirror-state.ts +33 -0
  445. package/src/msg/msg-store.ts +11 -0
  446. package/src/nexus/api/harness-api.ts +2 -1
  447. package/src/output-truncation.ts +41 -12
  448. package/src/project/project-store.ts +48 -1
  449. package/src/pty/snapshot.py +132 -0
  450. package/src/pty-shell/pty-control-ipc.ts +29 -2
  451. package/src/pty-shell/pty-manifest.ts +59 -3
  452. package/src/pty-shell/registry.ts +2 -0
  453. package/src/pty-shell/tui-run-state.ts +80 -3
  454. package/src/release-loop/gate-host-reservation.ts +157 -4
  455. package/src/release-loop/gate-shard-ledger.ts +68 -0
  456. package/src/release-loop/merged-pr-checklist.ts +25 -2
  457. package/src/release-loop/rehearsal-shard-plan.ts +6 -1
  458. package/src/release-loop/rehearsal.ts +27 -0
  459. package/src/release-loop/release-schedule.ts +90 -1
  460. package/src/research/bloom-exemplars.ts +135 -0
  461. package/src/research/edge-decision.ts +124 -15
  462. package/src/research/gap-followup.ts +249 -0
  463. package/src/research/lenses/counter-evidence.ts +100 -0
  464. package/src/research/lenses/working-backwards.ts +89 -0
  465. package/src/research/plugin-discovery.ts +242 -0
  466. package/src/research-bridge/invoke.ts +4 -2
  467. package/src/research-bridge/types.ts +2 -0
  468. package/src/self-dev/ask-launch-flow.ts +73 -131
  469. package/src/self-dev/dev-cli.ts +19 -17
  470. package/src/self-dev/dev-pipeline.ts +8 -4
  471. package/src/self-dev/graph-front-nodes.ts +23 -0
  472. package/src/self-dev/graph-journey-route.ts +10 -2
  473. package/src/self-dev/launch-preflight-text.ts +2 -2
  474. package/src/self-dev/launch-preflight.ts +47 -11
  475. package/src/self-dev/orchestrate-cli.ts +1 -0
  476. package/src/self-dev/orchestrate.ts +15 -0
  477. package/src/self-dev/run-supervisor.ts +204 -3
  478. package/src/self-dev/run-types.ts +3 -0
  479. package/src/self-implement/device-first.ts +8 -2
  480. package/src/self-implement/doctor-visit.ts +76 -58
  481. package/src/self-implement/gate-artifacts.ts +16 -0
  482. package/src/self-implement/gate-baseline.ts +75 -4
  483. package/src/self-implement/gate-cli.ts +368 -30
  484. package/src/self-implement/gate-receipt-registry.ts +180 -0
  485. package/src/self-implement/gate-remote.ts +165 -24
  486. package/src/self-implement/goal-author-clarification.ts +205 -32
  487. package/src/self-implement/goal-author-decompose.ts +24 -15
  488. package/src/self-implement/goal-author.ts +86 -10
  489. package/src/self-implement/graph-stage-units.ts +172 -0
  490. package/src/self-implement/graph-templates.ts +162 -1
  491. package/src/self-implement/graph-variant.ts +37 -4
  492. package/src/self-implement/host-regate.ts +124 -49
  493. package/src/self-implement/impl-findings-feedback.ts +188 -0
  494. package/src/self-implement/knowhow-pack.ts +227 -10
  495. package/src/self-implement/off-diff-evidence.ts +124 -0
  496. package/src/self-implement/orchestrator.ts +320 -28
  497. package/src/self-implement/run-ledger.ts +110 -14
  498. package/src/self-implement/run-stop.ts +33 -2
  499. package/src/self-implement/running-runs.ts +35 -12
  500. package/src/self-implement/seams.ts +6 -3
  501. package/src/self-implement/self-implement-cli.ts +40 -6
  502. package/src/self-implement/stop-autoheal-operational.ts +43 -0
  503. package/src/self-implement/stop-autoheal.ts +15 -6
  504. package/src/session/chat.ts +66 -15
  505. package/src/session/request-size-guard.ts +123 -0
  506. package/src/session-runtime/provider-circuit.ts +140 -0
  507. package/src/shell-runner/file-engine.ts +1 -0
  508. package/src/shell-runner/types.ts +4 -0
  509. package/src/sidetab-core/model.ts +312 -0
  510. package/src/skills/tools/schedule-wakeup.ts +23 -1
  511. package/src/skills/tools/shell.ts +51 -5
  512. package/src/steward/directive-audit.ts +354 -0
  513. package/src/surface/child-process.ts +31 -0
  514. package/src/surface/tui-stderr-owner.ts +48 -0
  515. package/src/task-agent/cover.ts +30 -12
  516. package/src/task-agent/judge.ts +56 -0
  517. package/src/task-agent/parent-host.ts +14 -1
  518. package/src/task-agent/postland-card.ts +35 -2
  519. package/src/task-agent/rejudge-on-head.ts +46 -2
  520. package/src/task-agent/repair-cycle.ts +1 -1
  521. package/src/task-agent/task-hand.ts +133 -25
  522. package/src/task-agent/tier-split.ts +105 -21
  523. package/src/task-orchestrator/surfaces/pod-command-job.ts +330 -2
  524. package/src/task-orchestrator/surfaces/pod-config-snapshot.ts +123 -0
  525. package/src/task-orchestrator/surfaces/pod-failure-reason.ts +70 -2
  526. package/src/task-orchestrator/surfaces/pod-ledger-events.ts +29 -4
  527. package/src/task-orchestrator/surfaces/pod-mirror-seed.ts +11 -8
  528. package/src/task-orchestrator/surfaces/pod-si-warm-protocol.ts +1 -1
  529. package/src/task-orchestrator/surfaces/pod-source-receive.ts +74 -6
  530. package/src/task-orchestrator/surfaces/pod-warm-worker-pod.ts +2 -1
  531. package/src/task-orchestrator/surfaces/pod-warm-worker-provider.ts +56 -15
  532. package/src/task-orchestrator/surfaces/self-implement-pod.ts +298 -45
  533. package/src/task-orchestrator/surfaces/self-implement.ts +18 -0
  534. package/src/tool-runtime/skill-exec-runtime.ts +95 -5
  535. package/src/tui/entry.ts +25 -5
  536. package/src/tui/inline-choice.ts +188 -0
  537. package/src/tui/sidetab/list.ts +36 -165
  538. package/src/tui/sidetab/nl-tool.ts +2 -136
  539. package/src/tui/sidetab/peek.ts +52 -0
  540. package/src/tui/slash/term.ts +12 -1
  541. package/src/tui-client/dashboard-session.ts +10 -1
  542. package/src/user-config.ts +45 -9
  543. package/src/ux-sim/classic-tui-seat-scenarios.ts +1 -7
  544. package/src/ux-sim/fake-land-queue.ts +88 -0
  545. package/src/ux-sim/fault-needs-human-reason-repair.ts +107 -0
  546. package/src/ux-sim/fault-pod-child-result.ts +42 -0
  547. package/src/ux-sim/gate-shard-host-reroute.ts +82 -0
  548. package/src/ux-sim/goal-interim-trace.ts +24 -0
  549. package/src/ux-sim/next-tui-seat-scenarios.ts +8 -13
  550. package/src/ux-sim/release-sim-rig.ts +262 -0
  551. package/src/ux-sim/seminar-rehearsal.ts +109 -0
  552. package/src/ux-sim/subagent-tools-device.ts +2 -2
  553. package/src/ux-sim/task-orchestrator-surfaces-self-implement-pod-device.ts +4 -1
  554. package/src/version/packed-revision.json +1 -1
  555. package/src/video-pipeline/recipes/explainer.ts +54 -2
  556. package/src/web-search/grok.ts +32 -6
  557. package/src/web-search/index.ts +8 -7
  558. package/src/workflow-runtime/node-catalog.ts +53 -4
  559. package/apps/pwa/out/_next/static/chunks/1118.a8a74ea29aac3e46.js +0 -27
  560. package/apps/pwa/out/_next/static/chunks/1204-2aa830479adf80f4.js +0 -1
  561. package/apps/pwa/out/_next/static/chunks/1341-43b7d2dc77d45c9d.js +0 -1
  562. package/apps/pwa/out/_next/static/chunks/1440-c3ea8882badfd9bf.js +0 -1
  563. package/apps/pwa/out/_next/static/chunks/1698-9c11cbf97f13717e.js +0 -1
  564. package/apps/pwa/out/_next/static/chunks/1770-3b1fc92253ef9f2f.js +0 -1
  565. package/apps/pwa/out/_next/static/chunks/1923-5c1695332240246a.js +0 -1
  566. package/apps/pwa/out/_next/static/chunks/1938.0e6c60ee91c4d7f5.js +0 -148
  567. package/apps/pwa/out/_next/static/chunks/2104.70e086d5174a4736.js +0 -1
  568. package/apps/pwa/out/_next/static/chunks/213-20675f20673ba22a.js +0 -1
  569. package/apps/pwa/out/_next/static/chunks/214.186a430da28338f1.js +0 -1
  570. package/apps/pwa/out/_next/static/chunks/2277.3bd4c0ac7f1b5996.js +0 -93
  571. package/apps/pwa/out/_next/static/chunks/240.e09f433f71c78ff4.js +0 -104
  572. package/apps/pwa/out/_next/static/chunks/2417.02151393605a7cd0.js +0 -1
  573. package/apps/pwa/out/_next/static/chunks/2463.cd2641a76daaa9ff.js +0 -1
  574. package/apps/pwa/out/_next/static/chunks/2576.b9e9c629c4b84c52.js +0 -1
  575. package/apps/pwa/out/_next/static/chunks/265-c021de53f0865bd9.js +0 -1
  576. package/apps/pwa/out/_next/static/chunks/2998-b1cc13956cd6a6e7.js +0 -1
  577. package/apps/pwa/out/_next/static/chunks/2e4782d3.ba2f0ab2b63a53e7.js +0 -1
  578. package/apps/pwa/out/_next/static/chunks/3130.626b54382b4dc379.js +0 -1
  579. package/apps/pwa/out/_next/static/chunks/3221-1bb3f99a55088613.js +0 -1
  580. package/apps/pwa/out/_next/static/chunks/3280.24edb1ffd03a7f3f.js +0 -24
  581. package/apps/pwa/out/_next/static/chunks/3288-eb3c22a1cbf2ae68.js +0 -1
  582. package/apps/pwa/out/_next/static/chunks/33.ef99e8374f96c6c4.js +0 -36
  583. package/apps/pwa/out/_next/static/chunks/3341-f09b9efbd7a82f70.js +0 -1
  584. package/apps/pwa/out/_next/static/chunks/3410-d7c0f14b329d6fda.js +0 -1
  585. package/apps/pwa/out/_next/static/chunks/3421.c87d6313a7d670f7.js +0 -287
  586. package/apps/pwa/out/_next/static/chunks/3422-83a3953f9bd67e26.js +0 -1
  587. package/apps/pwa/out/_next/static/chunks/3587-002e24e368c515a9.js +0 -1
  588. package/apps/pwa/out/_next/static/chunks/3644.f12a7d821ab940af.js +0 -1
  589. package/apps/pwa/out/_next/static/chunks/3660.d7516588e2d875c3.js +0 -1
  590. package/apps/pwa/out/_next/static/chunks/3695.b82e2610f4cd4ea9.js +0 -1
  591. package/apps/pwa/out/_next/static/chunks/3858.ca1f5bc0f577eac9.js +0 -94
  592. package/apps/pwa/out/_next/static/chunks/3959-e6ac4a139d9d4bcc.js +0 -1
  593. package/apps/pwa/out/_next/static/chunks/3f0de3de-2340c532c00395db.js +0 -1
  594. package/apps/pwa/out/_next/static/chunks/4032.53f62176514ec0ea.js +0 -1
  595. package/apps/pwa/out/_next/static/chunks/4199-f7c6eb40cd0322f8.js +0 -1
  596. package/apps/pwa/out/_next/static/chunks/4204-ef8484cbecd5d62f.js +0 -1
  597. package/apps/pwa/out/_next/static/chunks/4259-163129ca79913c4b.js +0 -1
  598. package/apps/pwa/out/_next/static/chunks/428-eaa77df3d0c85969.js +0 -1
  599. package/apps/pwa/out/_next/static/chunks/4432-97e400ffa1e161f5.js +0 -1
  600. package/apps/pwa/out/_next/static/chunks/449-aa427cf2cbb75f50.js +0 -1
  601. package/apps/pwa/out/_next/static/chunks/4491-39a0fd32bbaf3840.js +0 -1
  602. package/apps/pwa/out/_next/static/chunks/4588.b7cf06d382953979.js +0 -1
  603. package/apps/pwa/out/_next/static/chunks/4690.70ec8060825366ab.js +0 -32
  604. package/apps/pwa/out/_next/static/chunks/4804.6012b5cd33c22792.js +0 -90
  605. package/apps/pwa/out/_next/static/chunks/4881.e4d22d730e3b9df5.js +0 -1
  606. package/apps/pwa/out/_next/static/chunks/4937.ce2e340dc29cad3e.js +0 -79
  607. package/apps/pwa/out/_next/static/chunks/5-bb1c08d84bd71df3.js +0 -1
  608. package/apps/pwa/out/_next/static/chunks/5005.de98df23b37cdf3c.js +0 -1
  609. package/apps/pwa/out/_next/static/chunks/5035.dc64a89cad5573cc.js +0 -74
  610. package/apps/pwa/out/_next/static/chunks/5041-5aada92ca215ffdd.js +0 -1
  611. package/apps/pwa/out/_next/static/chunks/5207.1a224035455790fd.js +0 -1
  612. package/apps/pwa/out/_next/static/chunks/5255-1b60d50eabe9f057.js +0 -1
  613. package/apps/pwa/out/_next/static/chunks/5269.d0436ee6d773382a.js +0 -286
  614. package/apps/pwa/out/_next/static/chunks/5309.3367c4d50f52b489.js +0 -1
  615. package/apps/pwa/out/_next/static/chunks/552-689827d49780fa00.js +0 -1
  616. package/apps/pwa/out/_next/static/chunks/5539.34cc9d60622cb69b.js +0 -8
  617. package/apps/pwa/out/_next/static/chunks/5568.218dea0c00ca2ec7.js +0 -1
  618. package/apps/pwa/out/_next/static/chunks/5645.b7e3b055455a04ea.js +0 -1
  619. package/apps/pwa/out/_next/static/chunks/5662.18cc0f30353cbd96.js +0 -1
  620. package/apps/pwa/out/_next/static/chunks/5671.da24fc9dc5e98325.js +0 -1
  621. package/apps/pwa/out/_next/static/chunks/5b141171.324c40fd49cb6821.js +0 -1
  622. package/apps/pwa/out/_next/static/chunks/6175-d4621f6a10b0cfab.js +0 -1
  623. package/apps/pwa/out/_next/static/chunks/6290.3eb53a20746b72ce.js +0 -1
  624. package/apps/pwa/out/_next/static/chunks/6415-9307f3eafa90837f.js +0 -1
  625. package/apps/pwa/out/_next/static/chunks/6579-3de35d00aacd71b5.js +0 -1
  626. package/apps/pwa/out/_next/static/chunks/680-2f324c4e039a5b67.js +0 -1
  627. package/apps/pwa/out/_next/static/chunks/6845-331b3c7481da3ba3.js +0 -1
  628. package/apps/pwa/out/_next/static/chunks/7000.28157393caaf5343.js +0 -62
  629. package/apps/pwa/out/_next/static/chunks/7311-60a7ea80d23c7521.js +0 -1
  630. package/apps/pwa/out/_next/static/chunks/7401.525d0a12f7d02c06.js +0 -1
  631. package/apps/pwa/out/_next/static/chunks/7438.c2cf72b66dca6aa4.js +0 -1
  632. package/apps/pwa/out/_next/static/chunks/7488.966b116789f3d41a.js +0 -1
  633. package/apps/pwa/out/_next/static/chunks/7524.ce973525d30b3d52.js +0 -1
  634. package/apps/pwa/out/_next/static/chunks/7577.ea6e9ac72e035520.js +0 -1
  635. package/apps/pwa/out/_next/static/chunks/7628.6b16863ac3972333.js +0 -34
  636. package/apps/pwa/out/_next/static/chunks/7657.8d1fb3d2f7ebe273.js +0 -1
  637. package/apps/pwa/out/_next/static/chunks/7903-1435d5d2f0dd7807.js +0 -1
  638. package/apps/pwa/out/_next/static/chunks/7954.4f7a8832663ee979.js +0 -115
  639. package/apps/pwa/out/_next/static/chunks/7978-30a91192c5dbe3c2.js +0 -1
  640. package/apps/pwa/out/_next/static/chunks/8025-8795821525cf1a07.js +0 -1
  641. package/apps/pwa/out/_next/static/chunks/8191.3674a00f0b565c23.js +0 -1
  642. package/apps/pwa/out/_next/static/chunks/8217-604955d8885c5ef2.js +0 -1
  643. package/apps/pwa/out/_next/static/chunks/8298-eed6f5f2585a63f4.js +0 -1
  644. package/apps/pwa/out/_next/static/chunks/8509.3a54d4e61893d7cb.js +0 -1
  645. package/apps/pwa/out/_next/static/chunks/8758.ac421f726a189125.js +0 -1
  646. package/apps/pwa/out/_next/static/chunks/891.d6c723a51a067b36.js +0 -149
  647. package/apps/pwa/out/_next/static/chunks/9223.cbcc88e0e9950426.js +0 -41
  648. package/apps/pwa/out/_next/static/chunks/9299.24e2a7d9b6d1f91b.js +0 -226
  649. package/apps/pwa/out/_next/static/chunks/9317.6a9869039c231bb3.js +0 -24
  650. package/apps/pwa/out/_next/static/chunks/9383.e4755f275b3c11ff.js +0 -1
  651. package/apps/pwa/out/_next/static/chunks/9581.da63ddf41acfad46.js +0 -1
  652. package/apps/pwa/out/_next/static/chunks/9715.8c5529a0a5c41a36.js +0 -1
  653. package/apps/pwa/out/_next/static/chunks/9817.3009d65f0889ef1f.js +0 -2
  654. package/apps/pwa/out/_next/static/chunks/app/_not-found/page-76873dd80da4f715.js +0 -1
  655. package/apps/pwa/out/_next/static/chunks/app/approvals/page-ed32b6ec5dea8f23.js +0 -1
  656. package/apps/pwa/out/_next/static/chunks/app/autopilot/page-fdd40e15babf3d25.js +0 -1
  657. package/apps/pwa/out/_next/static/chunks/app/board/page-384efc78e85e400b.js +0 -1
  658. package/apps/pwa/out/_next/static/chunks/app/bots/page-d91809c5aeed319a.js +0 -1
  659. package/apps/pwa/out/_next/static/chunks/app/ceo/page-128f3522f89a81ab.js +0 -1
  660. package/apps/pwa/out/_next/static/chunks/app/chat/page-595961abf3b43ad1.js +0 -1
  661. package/apps/pwa/out/_next/static/chunks/app/consult/page-f41dccb76d8c0263.js +0 -1
  662. package/apps/pwa/out/_next/static/chunks/app/control/page-a3205c2e28b7d0d9.js +0 -1
  663. package/apps/pwa/out/_next/static/chunks/app/decisions/page-c39a80277814a3f4.js +0 -1
  664. package/apps/pwa/out/_next/static/chunks/app/design-check/page-1ab3f98194513195.js +0 -1
  665. package/apps/pwa/out/_next/static/chunks/app/editor/page-a5246f7e254d77d0.js +0 -1
  666. package/apps/pwa/out/_next/static/chunks/app/exec/page-0f92287bdb81217d.js +0 -1
  667. package/apps/pwa/out/_next/static/chunks/app/field/page-5a37131ff63793ef.js +0 -1
  668. package/apps/pwa/out/_next/static/chunks/app/healthz/route-76873dd80da4f715.js +0 -1
  669. package/apps/pwa/out/_next/static/chunks/app/inside/page-ac4bd14bb2348bfd.js +0 -1
  670. package/apps/pwa/out/_next/static/chunks/app/intake/page-c348a3959c5b5fc6.js +0 -1
  671. package/apps/pwa/out/_next/static/chunks/app/layout-2addd81c0d3e2906.js +0 -1
  672. package/apps/pwa/out/_next/static/chunks/app/live/page-da6b765f58a3eefb.js +0 -1
  673. package/apps/pwa/out/_next/static/chunks/app/live-run/page-0661e40f8780c32c.js +0 -1
  674. package/apps/pwa/out/_next/static/chunks/app/loops/page-b89af1b1c8e4875b.js +0 -1
  675. package/apps/pwa/out/_next/static/chunks/app/market/page-da8aeb82ba751cdb.js +0 -1
  676. package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-cc71317b239439db.js +0 -1
  677. package/apps/pwa/out/_next/static/chunks/app/morning/page-bde7fc1d64ffe369.js +0 -1
  678. package/apps/pwa/out/_next/static/chunks/app/not-found-e2797214f713fa58.js +0 -1
  679. package/apps/pwa/out/_next/static/chunks/app/observatory/page-2a35bcda70defaf6.js +0 -1
  680. package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-3af03deedde45032.js +0 -1
  681. package/apps/pwa/out/_next/static/chunks/app/ops/release/page-d1d1210f99f620ae.js +0 -1
  682. package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-46d1b5500885861d.js +0 -1
  683. package/apps/pwa/out/_next/static/chunks/app/outputs/page-291ab19fe2acb173.js +0 -1
  684. package/apps/pwa/out/_next/static/chunks/app/page-7f569e533ddeecba.js +0 -1
  685. package/apps/pwa/out/_next/static/chunks/app/reflection/page-990129c9fee46d8f.js +0 -1
  686. package/apps/pwa/out/_next/static/chunks/app/scheduler/page-7737f785ebb1cdaf.js +0 -1
  687. package/apps/pwa/out/_next/static/chunks/app/sessions/page-9f3c73a4f7ffd2f8.js +0 -1
  688. package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-03be7fb347f01058.js +0 -1
  689. package/apps/pwa/out/_next/static/chunks/app/settings/page-96b0280625e4df2b.js +0 -1
  690. package/apps/pwa/out/_next/static/chunks/app/setup/done/page-56855545049eb56d.js +0 -1
  691. package/apps/pwa/out/_next/static/chunks/app/setup/layout-76873dd80da4f715.js +0 -1
  692. package/apps/pwa/out/_next/static/chunks/app/setup/page-79a909c9981f0338.js +0 -1
  693. package/apps/pwa/out/_next/static/chunks/app/share/page-a9d9a3e66459c1e0.js +0 -1
  694. package/apps/pwa/out/_next/static/chunks/app/showroom/page-c383cbf2013f7069.js +0 -1
  695. package/apps/pwa/out/_next/static/chunks/app/tasks/page-f57c6a2e54dbdca4.js +0 -1
  696. package/apps/pwa/out/_next/static/chunks/app/term/page-6b140f77593576eb.js +0 -1
  697. package/apps/pwa/out/_next/static/chunks/app/today/page-6b767ae2d9d0adfc.js +0 -1
  698. package/apps/pwa/out/_next/static/chunks/app/trace/page-116d6198d5da0e3d.js +0 -1
  699. package/apps/pwa/out/_next/static/chunks/app/vault/page-b9c9b778c7501370.js +0 -1
  700. package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-a6c78392ab8f6335.js +0 -1
  701. package/apps/pwa/out/_next/static/chunks/app/workflows/page-455183deb4ed0cfe.js +0 -1
  702. package/apps/pwa/out/_next/static/chunks/app/workspace/page-6a63e99526bd63d0.js +0 -1
  703. package/apps/pwa/out/_next/static/chunks/app/worktrees/page-31c22caafe788c08.js +0 -1
  704. package/apps/pwa/out/_next/static/chunks/bb6987f9.3647e1a23b0e3217.js +0 -122
  705. package/apps/pwa/out/_next/static/chunks/framework-4b12a946f352cee2.js +0 -1
  706. package/apps/pwa/out/_next/static/chunks/main-941155250ed2644b.js +0 -1
  707. package/apps/pwa/out/_next/static/chunks/main-app-f8b6765abed6d149.js +0 -1
  708. package/apps/pwa/out/_next/static/chunks/pages/_app-78432194c85388f9.js +0 -1
  709. package/apps/pwa/out/_next/static/chunks/pages/_error-cdf7390829512b1b.js +0 -1
  710. package/apps/pwa/out/_next/static/chunks/webpack-d5f0964a9c2e92d2.js +0 -1
  711. package/scripts/ratchets/next-tui-entry-budget.ts +0 -124
  712. /package/apps/pwa/out/_next/static/{RrjXTwz-urRAbChP1bX02 → GiOLWmt4MqDZePubBjA4Q}/_ssgManifest.js +0 -0
@@ -7,7 +7,8 @@ import { readFileSync, writeFileSync, existsSync, mkdirSync } from 'fs';
7
7
  import { join } from 'path';
8
8
  import { fileURLToPath } from 'node:url';
9
9
  import { createRunningBuildStatus } from './running-build-status.js';
10
- import { reportTuiTurn } from '../pty-shell/tui-run-state.js';
10
+ import { reportTuiAbortRequested, reportTuiProgress, reportTuiTurn } from '../pty-shell/tui-run-state.js';
11
+ import { installTuiStderrOwner } from '../surface/tui-stderr-owner.js';
11
12
  import { logTurnThrew, runTurnTeardownStep } from './turn-busy-teardown.js';
12
13
  import { createStaleInstallCheck, formatStaleInstallNotice, readCurrentInstalledCommit, readDashboardBootCommit, STALE_INSTALL_CHECK_INTERVAL_MS, versionedDashboardInstallDir } from './stale-install-check.js';
13
14
  import { spawn, spawnSync } from 'node:child_process';
@@ -188,6 +189,7 @@ import {
188
189
  formatResponse,
189
190
  onEscAbort,
190
191
  attachStreamingKeys,
192
+ SLASH_COMMANDS,
191
193
  type InputResult,
192
194
  type TextInputExternalSubmitRequest,
193
195
  } from '../chat/index.js';
@@ -397,6 +399,7 @@ import { resolveDashboardChatMainSubmitIntent } from './input/chat-main-submit-r
397
399
  import { maybeEmitDashboardSubmitQuickPass } from './input/chat-main-submit-control.js';
398
400
  import { attachDashboardQuickPassConsumers } from './input/control-signal-consumers.js';
399
401
  import { resolveDashboardChatMainSlashCommand } from './input/chat-main-slash-command.js';
402
+ import { isClassicSigquitChord, registerClassicSigquitHandler } from './classic-sigquit.js';
400
403
  import { TuiChatPersonaSelection, tuiChatPersonaMessages } from './slash-runtime/chat-persona.js';
401
404
  import { awaitGlobalPersonaLoad } from '../persona/global-registry.js';
402
405
  import { createDashboardInlineSetupFlow } from './setup-inline.js';
@@ -526,6 +529,41 @@ export function observeDashboardDevRequestRoute(
526
529
  observeDevRequestRouteFailSoft(text, cfg, { surface: 'dashboard' });
527
530
  }
528
531
 
532
+ export async function cancelDelegatedToolOnEscape(deps: {
533
+ abortCtrl: AbortController;
534
+ child: { pid: number; isAlive(): boolean; kill(signal?: NodeJS.Signals): void };
535
+ waitForExit(): Promise<void>;
536
+ pushChatLine(line: string): void;
537
+ }): Promise<boolean> {
538
+ abortTurnOnly(deps.abortCtrl);
539
+ try {
540
+ if (deps.child.isAlive()) deps.child.kill();
541
+ await deps.waitForExit();
542
+ if (deps.child.isAlive()) throw new Error('child still alive after exit acknowledgement');
543
+ debug.log('dashboard.esc-child', 'termination-confirmed', { pid: deps.child.pid });
544
+ deps.pushChatLine(' ⏹ 중단됨');
545
+ return true;
546
+ } catch (error) {
547
+ const reason = error instanceof Error ? error.message : String(error);
548
+ debug.log('dashboard.esc-child', 'termination-failed', { pid: deps.child.pid, reason });
549
+ deps.pushChatLine(` ✘ 종료 실패 — ${reason}`);
550
+ return false;
551
+ }
552
+ }
553
+
554
+ export function activeEscDelegatedPty(
555
+ toolState: EscAbortToolState,
556
+ ptyIdsByCallId: ReadonlyMap<string, string>,
557
+ getPtyById: (id: string) => { pid: number; isAlive(): boolean; kill(signal?: NodeJS.Signals): void } | undefined,
558
+ ): { pid: number; isAlive(): boolean; kill(signal?: NodeJS.Signals): void } | null {
559
+ const active = [...toolState.activeToolNamesByCallId];
560
+ if (active.length !== 1) return null;
561
+ const [callId, name] = active[0]!;
562
+ if (name !== 'PtyShellPoll' && name !== 'PtyShellSnapshot' && name !== 'PtyShellSend') return null;
563
+ const ptyId = ptyIdsByCallId.get(callId);
564
+ return ptyId ? getPtyById(ptyId) ?? null : null;
565
+ }
566
+
529
567
  export interface EscAbortToolState {
530
568
  activeToolNamesByCallId: Map<string, string>;
531
569
  }
@@ -741,7 +779,7 @@ import { needsOnboarding, resetOnboardingMarker } from '../onboarding.js';
741
779
  import {
742
780
  getUserConfig, reloadUserConfig, saveUserConfig,
743
781
  rotateNextProvider, jumpToRotationEntry, rotationEntryLabel, applyRotationEntry,
744
- resolveAcpHopCapFromConfig,
782
+ resolveAcpHopCapFromConfig, resolveTuiUnattended,
745
783
  VOICE_HARDCODED_DEFAULTS,
746
784
  } from '../user-config.js';
747
785
  import { streamLLM, anyProviderAvailable, getProviderForConfig, nextReasoningLevel, reasoningLevelLabel, effectiveReasoningLevel, modelSupportsReasoning, type LLMMessage, type LLMToolSpec } from '../llm.js';
@@ -917,6 +955,7 @@ import {
917
955
  runDashboardScratchExportAction,
918
956
  } from './context-menu-action-runtime.js';
919
957
  import { createDashboardTerminalPopupRuntime } from './terminal-popup-runtime.js';
958
+ import { createDashboardSidetabRuntime } from './sidetab-runtime.js';
920
959
  import { toggleDashboardAssistantRenderState } from './assistant-render-state-runtime.js';
921
960
  import { bootDashboardAcpBgSweep } from './acp-bg-sweep-boot.js';
922
961
  import { bootDashboardConfigTools } from './config-tools-boot.js';
@@ -1143,7 +1182,7 @@ import type { PlainTurnSubmit } from '../input/turn-submit.js';
1143
1182
  import { findBlock, logPaneContentHeight, maxLogPaneScroll, visibleSearchRowOffset } from '../panes/log-pane.js';
1144
1183
  import { createQuitConfirmationState, gracefulQuit, type QuitConfirmationState } from './graceful-quit.js';
1145
1184
  import { consumeTurnEndInterrupted, handoffTurnTypeaheadAtTurnEnd, releaseTurnTypeaheadPending, runTurnTypeaheadPushNow, steerLastTurnTypeaheadSubmission } from './input/turn-steer-bridge.js';
1146
- import { abortTurnOnly } from '../turn-abort-scope.js';
1185
+ import { abortAndKillChildren, abortTurnOnly } from '../turn-abort-scope.js';
1147
1186
  import { consumeInternalTurnYield, createInternalTurnGate, formatInternalTurnBanner, resolveInternalTurnSubmitIntent, type InternalTurnRequest } from './input/internal-turn.js';
1148
1187
  import { createClassicInterimFold } from './input/goal-interim.js';
1149
1188
  import { createSeatAutowake } from './input/seat-autowake.js';
@@ -1293,6 +1332,7 @@ export function subscribeDashboardAgentResults(
1293
1332
  }
1294
1333
  }
1295
1334
  });
1335
+ queue.replayPendingWakes(listener);
1296
1336
  return () => { offWake(); offDrain(); };
1297
1337
  }
1298
1338
 
@@ -1451,6 +1491,9 @@ import {
1451
1491
  } from './input/space-longpress-detector.js';
1452
1492
  import { isAllowlistedDictationSurface } from './input/dictation-surface-allowlist.js';
1453
1493
  import { createDashboardExternalInputHost, stopTurnViaEscGate, updateDashboardExternalInputQueueNotice } from './input/external-input-host.js';
1494
+ import { registerTuiForceStopHandler } from '../capture/tui-self-report.js';
1495
+ import { createInlineAskUserQuestionResolver, resolveUnattendedInlineChoiceTimeoutMs, UNATTENDED_INLINE_CHOICE_TIMEOUT_MS } from '../ask-user-question/index.js';
1496
+ import { createInlineChoiceTurnEndCleanup, InlineChoiceBroker } from '../tui/inline-choice.js';
1454
1497
  import { registerExternalInputHost } from '../input/external-input-queue.js';
1455
1498
  // H3 #6 follow-up #3 — background sessions render as a distinct sidebar
1456
1499
  // kind with live state badge + tap-to-Join. Dashboard pulls BG records
@@ -2043,9 +2086,18 @@ export async function showDashboard(opts: ShowDashboardOptions = {}): Promise<Da
2043
2086
  let disposeDashboardEventLoopMonitor = (): void => {};
2044
2087
  // TUI-AGENT-IDLE-WAKE — 이 대시보드 «자기» 완료 알림 구독만 푼다(배선 지점에서 채운다).
2045
2088
  let disposeDashboardAgentWake = (): void => {};
2089
+ let disposeClassicSigquit = (): void => {};
2090
+ let closeClassicSidetabRuntime = (): void => {};
2091
+ let restoreTuiStderrOwner = (): void => {};
2046
2092
  const closeDashboardTui = (): void => {
2047
2093
  disposeDashboardEventLoopMonitor();
2048
2094
  try { disposeDashboardAgentWake(); } catch { /* never block exit */ }
2095
+ disposeClassicSigquit();
2096
+ disposeClassicSigquit = (): void => {};
2097
+ try { closeClassicSidetabRuntime(); } catch { /* never block exit */ }
2098
+ closeClassicSidetabRuntime = (): void => {};
2099
+ try { restoreTuiStderrOwner(); } catch { /* never block screen cleanup */ }
2100
+ restoreTuiStderrOwner = (): void => {};
2049
2101
  closeTui();
2050
2102
  };
2051
2103
  const exitDashboardTui = (): void => {
@@ -2582,6 +2634,15 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
2582
2634
  }
2583
2635
  chatScrollOffset = -1;
2584
2636
  };
2637
+ const inlineChoiceBroker = new InlineChoiceBroker({
2638
+ appendLines: (lines) => {
2639
+ for (const line of lines) pushChatLine(C.info(line));
2640
+ draw();
2641
+ },
2642
+ });
2643
+ const resolveInlineAskUserQuestion = createInlineAskUserQuestionResolver(inlineChoiceBroker, {
2644
+ timeoutMs: () => resolveUnattendedInlineChoiceTimeoutMs(getUserConfig()),
2645
+ });
2585
2646
  const liveTypeaheadEchoes: { at: number; lines: string[] }[] = [];
2586
2647
  const restoreLiveTypeaheadEchoes = (): void => {
2587
2648
  let after = 0;
@@ -3076,6 +3137,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
3076
3137
  let attachedSessionId: string | null = null;
3077
3138
  const chatPersonaSelection = new TuiChatPersonaSelection();
3078
3139
  let chatPersonaConversationId = crypto.randomUUID();
3140
+ const slashUsageRunId = crypto.randomUUID();
3079
3141
  const currentChatPersonaSessionId = () => attachedSessionId ?? chatPersonaConversationId;
3080
3142
  let attachedChatId: number | null = null;
3081
3143
  const forkableSessionHistory = (source: ChatMessage[] = chat.history): ForkableSessionTurn[] =>
@@ -5138,6 +5200,17 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
5138
5200
  };
5139
5201
  registerLogFoldInputBinding(toggleAllLogFolds);
5140
5202
 
5203
+ const showClassicSigquitGuidance = (): void => {
5204
+ debug.log('dashboard.signal', 'sigquit-guidance', { surface: 'classic', source: 'ctrl-backslash' });
5205
+ chatLines.push(C.warning(' classic 사이드탭: /side · /side new · /side attach <번호>'));
5206
+ chatScrollOffset = -1;
5207
+ draw({ force: true });
5208
+ };
5209
+
5210
+ restoreTuiStderrOwner = installTuiStderrOwner((line) => {
5211
+ chatLines.push(C.warning(`[stderr] ${line}`));
5212
+ draw({ force: true });
5213
+ });
5141
5214
  initTui(true);
5142
5215
 
5143
5216
  // ── Working-dir browser glyphs (shared between the list widget and
@@ -6748,6 +6821,11 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
6748
6821
  * this function is invoked.
6749
6822
  */
6750
6823
  const escAbortToolState = createEscAbortToolState();
6824
+ let escDelegatedTermination: Promise<boolean> | null = null;
6825
+ let delegatedTerminationPending = false;
6826
+ let delegatedTerminationFailed = false;
6827
+ const escDelegatedPtyIdsByCallId = new Map<string, string>();
6828
+ const escDelegatedShellResultsByCallId = new Map<string, Promise<unknown>>();
6751
6829
  const escHarnessSpacesByCallId = new Map<string, string>();
6752
6830
  setSelfImplementSoftStopSpaceObserver((callId, spaceId) => {
6753
6831
  const toolName = escAbortToolState.activeToolNamesByCallId.get(callId);
@@ -6768,6 +6846,12 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
6768
6846
  // the stream — the running count is visible in the HUD (T3-B1)
6769
6847
  // so the user can make an informed call.
6770
6848
  let abortGateModalId: string | null = null;
6849
+ const getDelegatedPty = () => activeEscDelegatedPty(escAbortToolState, escDelegatedPtyIdsByCallId, getPty);
6850
+ const getDelegatedShell = () => {
6851
+ const active = [...escAbortToolState.activeToolNamesByCallId];
6852
+ if (active.length !== 1 || (active[0]![1] !== 'Bash' && active[0]![1] !== 'RunShell')) return null;
6853
+ return escDelegatedShellResultsByCallId.get(active[0]![0]) ?? null;
6854
+ };
6771
6855
  const showHarnessEscHint = createHarnessEscHint((line) => pushChatLine(line));
6772
6856
  const activeHarnessSpace = (): string | null => activeEscHarnessSpace(escAbortToolState, escHarnessSpacesByCallId);
6773
6857
  // ⭐ TUI-ESC-EXIT — `createEscAbortPendingGate` is the production
@@ -6779,7 +6863,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
6779
6863
  runSoftStop: runEscAbortPendingSoftStop,
6780
6864
  formatWaitingTargets: formatEscAbortWaitingTargets,
6781
6865
  getActiveHarnessSpace: activeHarnessSpace,
6782
- pushChatLine: (line) => pushChatLine(line),
6866
+ pushChatLine: (line) => { if (!getDelegatedPty() && !getDelegatedShell() && !delegatedTerminationPending && !delegatedTerminationFailed) pushChatLine(line); },
6783
6867
  showHarnessEscHint,
6784
6868
  afterAbortEvent: () => { chatScrollOffset = -1; },
6785
6869
  });
@@ -6796,11 +6880,77 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
6796
6880
  requestRedraw: () => draw(),
6797
6881
  getTheme: () => currentThemeTokens(),
6798
6882
  getWaitingTargetNames: () => getEscAbortWaitingToolNames(escAbortToolState),
6799
- shouldAbortImmediately: () => activeHarnessSpace() !== null,
6883
+ shouldAbortImmediately: () => activeHarnessSpace() !== null || getDelegatedPty() !== null || getDelegatedShell() !== null,
6884
+ forceStopWithoutModal: () => resolveTuiUnattended(getUserConfig()),
6885
+ confirmStopInline: async () => {
6886
+ const result = await inlineChoiceBroker.ask({
6887
+ id: `stop-turn:${Date.now().toString(36)}`,
6888
+ question: '도는 작업과 하위 에이전트를 함께 중단할까요?',
6889
+ options: [
6890
+ { value: 'stop', label: '중단', description: '현재 턴과 자식 작업을 종료합니다.' },
6891
+ { value: 'continue', label: '계속', description: '현재 작업을 계속 실행합니다.' },
6892
+ ],
6893
+ includeOther: false,
6894
+ timeoutMs: UNATTENDED_INLINE_CHOICE_TIMEOUT_MS,
6895
+ });
6896
+ return !('cancelled' in result) && result.selected[0] === 'stop';
6897
+ },
6800
6898
  // ⭐ TUI-ESC-EXIT — `runEscAbortPendingSoftStop` is the production
6801
6899
  // soft-stop callback seam; the incident test in
6802
6900
  // test/esc-harness-stop.test.ts exercises this same function.
6803
- onAbortPending: escAbortPendingGate.onAbortPending,
6901
+ onAbortPending: (event) => {
6902
+ const child = getDelegatedPty();
6903
+ const shell = getDelegatedShell();
6904
+ if (!child && !shell) { escAbortPendingGate.onAbortPending(event); return; }
6905
+ if (shell && !child) {
6906
+ delegatedTerminationPending = true;
6907
+ pushChatLine(' ⏳ 중단 요청됨 — 위임 자식 종료를 확인하는 중입니다.');
6908
+ escDelegatedTermination = (async () => {
6909
+ abortTurnOnly(abortCtrl);
6910
+ try {
6911
+ const result = await Promise.race([shell, Bun.sleep(4_000).then(() => { throw new Error('shell child termination timeout'); })]);
6912
+ const status = result as { aborted?: boolean; outcome?: string; output?: string } | null;
6913
+ if (!status?.aborted && status?.outcome !== 'aborted'
6914
+ && !status?.output?.includes('[aborted]')) throw new Error('shell child exit not confirmed as aborted');
6915
+ debug.log('dashboard.esc-child', 'termination-confirmed', { tool: event.targets });
6916
+ const pendingIndex = chatLines.lastIndexOf(' ⏳ 중단 요청됨 — 위임 자식 종료를 확인하는 중입니다.');
6917
+ if (pendingIndex >= 0) chatLines.splice(pendingIndex, 1);
6918
+ pushChatLine(' ⏹ 중단됨');
6919
+ draw();
6920
+ return true;
6921
+ } catch (error) {
6922
+ delegatedTerminationFailed = true;
6923
+ const reason = error instanceof Error ? error.message : String(error);
6924
+ debug.log('dashboard.esc-child', 'termination-failed', { tool: event.targets, reason });
6925
+ const pendingIndex = chatLines.lastIndexOf(' ⏳ 중단 요청됨 — 위임 자식 종료를 확인하는 중입니다.');
6926
+ if (pendingIndex >= 0) chatLines.splice(pendingIndex, 1);
6927
+ pushChatLine(` ✘ 종료 실패 — ${reason}`);
6928
+ draw();
6929
+ return false;
6930
+ }
6931
+ })().finally(() => { delegatedTerminationPending = false; });
6932
+ return;
6933
+ }
6934
+ if (!child) return;
6935
+ delegatedTerminationPending = true;
6936
+ pushChatLine(' ⏳ 중단 요청됨 — 위임 자식 종료를 확인하는 중입니다.');
6937
+ escDelegatedTermination = cancelDelegatedToolOnEscape({
6938
+ abortCtrl,
6939
+ child,
6940
+ waitForExit: async () => {
6941
+ const deadline = Date.now() + 3_000;
6942
+ while (child.isAlive() && Date.now() < deadline) await Bun.sleep(50);
6943
+ if (child.isAlive()) throw new Error('PTY child termination timeout');
6944
+ },
6945
+ pushChatLine: (line) => {
6946
+ delegatedTerminationFailed = line.includes('종료 실패');
6947
+ const pendingIndex = chatLines.lastIndexOf(' ⏳ 중단 요청됨 — 위임 자식 종료를 확인하는 중입니다.');
6948
+ if (pendingIndex >= 0) chatLines.splice(pendingIndex, 1);
6949
+ pushChatLine(line);
6950
+ draw();
6951
+ },
6952
+ }).finally(() => { delegatedTerminationPending = false; });
6953
+ },
6804
6954
  onAbortRepeat: escAbortPendingGate.onAbortRepeat,
6805
6955
  // ⭐⭐⭐ 턴을 멈추기 «전»에 살아남을 자식을 백그라운드 라우팅으로 넘긴다(`R4a` · 2026-08-19).
6806
6956
  // ⛔ 없으면 `R1` 이후 자식이 «고아»가 된다 — 살아 있는데 완료를 실어 나를 채널이 없다
@@ -6818,6 +6968,15 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
6818
6968
  } catch { /* 관측·핸드오프가 중단을 막지 않는다 */ }
6819
6969
  },
6820
6970
  });
6971
+ const unregisterTuiForceStop = registerTuiForceStopHandler(() => {
6972
+ if (abortCtrl.signal.aborted) return false;
6973
+ debug.log('pty.stop-turn', 'force-requested', { targets: getEscAbortWaitingToolNames(escAbortToolState) });
6974
+ abortAndKillChildren(abortCtrl);
6975
+ pushChatLine(' ⏹ 강제 중단을 요청했습니다. 현재 턴과 자식 작업이 정리되면 유휴 상태로 돌아갑니다.');
6976
+ draw();
6977
+ return true;
6978
+ });
6979
+ const cancelInlineChoiceAtTurnEnd = createInlineChoiceTurnEndCleanup(inlineChoiceBroker);
6821
6980
 
6822
6981
  // Scroll the log pane by ±N rows from whatever the current tail-
6823
6982
  // relative offset resolves to. Shared by keyboard and mouse-wheel
@@ -7337,15 +7496,21 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
7337
7496
  streamingInFlight = true;
7338
7497
  noteClipboardBusyChange();
7339
7498
  reportTuiTurn('busy');
7340
- const externalStop = (): void => { stopTurnViaEscGate(escGate); };
7499
+ const externalStop = (): void => {
7500
+ // Esc 게이트가 턴 중단을 청하는 순간 — busy 가 이 뒤로 지속되면 abort-ignored 판정 재료가 된다.
7501
+ reportTuiAbortRequested();
7502
+ stopTurnViaEscGate(escGate);
7503
+ };
7341
7504
  currentTurnExternalStop = externalStop;
7342
7505
  return () => {
7343
7506
  if (currentTurnExternalStop === externalStop) currentTurnExternalStop = null;
7344
7507
  // 단계마다 격리 — 앞 단계가 던져도 settle·idle 전이에 닿는다(키 층 유휴 ∧ 턴 층 busy 이원 판정 #55 차단).
7345
7508
  runTurnTeardownStep('stream-keys-detach', cleanup);
7509
+ runTurnTeardownStep('inline-choice-cancel', cancelInlineChoiceAtTurnEnd);
7510
+ runTurnTeardownStep('tui-force-stop-detach', unregisterTuiForceStop);
7346
7511
  runTurnTeardownStep('esc-gate-dispose', () => { escGate.dispose(); });
7347
7512
  try {
7348
- if (!escAbortPendingGate.getStoppedHarnessSpace()) settleEscAbortPendingLines(chatLines, chatLinesStartIndex);
7513
+ if (!escAbortPendingGate.getStoppedHarnessSpace() && !delegatedTerminationPending && !delegatedTerminationFailed) settleEscAbortPendingLines(chatLines, chatLinesStartIndex);
7349
7514
  } catch (err) {
7350
7515
  const message = err instanceof Error ? err.message : String(err);
7351
7516
  const stackHead = err instanceof Error ? err.stack?.split('\n')[1]?.trim() : undefined;
@@ -12734,6 +12899,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
12734
12899
  const disposeExternalInputHost = registerExternalInputHost(createDashboardExternalInputHost({
12735
12900
  isTurnActive: () => streamingInFlight,
12736
12901
  getTurnStop: () => currentTurnExternalStop,
12902
+ handleInlineChoice: (text) => inlineChoiceBroker.handleInput(text),
12737
12903
  promptCtl,
12738
12904
  pushNotice: (line) => { chatLines.push(C.muted(` ${line}`)); chatScrollOffset = -1; draw(); },
12739
12905
  setQueueNotice: setExternalInputQueueNotice,
@@ -13578,6 +13744,87 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
13578
13744
  const spawnGlobalTerminalModal = (command?: string): void => {
13579
13745
  openInteractiveTerminalPopup({ kind: 'shell', cwd: workingDir.cwd, command });
13580
13746
  };
13747
+ const classicSidetabRuntime = createDashboardSidetabRuntime({
13748
+ currentSessionId: () => currentChatPersonaSessionId(),
13749
+ termSize,
13750
+ pushModal: (surface) => {
13751
+ attachSurfaceToWorkspace(surface, currentWorkspaceOwnerId());
13752
+ const handle = display.pushModal(surface);
13753
+ draw();
13754
+ return { dispose: () => { handle.dispose(); draw(); } };
13755
+ },
13756
+ attach: (row) => {
13757
+ if (row.sessionId && sessionRegistry.get(row.sessionId)) {
13758
+ const { cols, rows } = termSize();
13759
+ const attached = sessionRegistry.attach(row.sessionId, { termCols: cols, termRows: rows });
13760
+ if (attached?.modal) {
13761
+ terminalModalRouter.set(attached.modal, {
13762
+ onClose: () => { sessionRegistry.detach(attached.id); draw(); },
13763
+ });
13764
+ draw();
13765
+ }
13766
+ return;
13767
+ }
13768
+ if (!row.ptyId) return;
13769
+ void requestRemotePtyControl(row.ptyId, 'snapshot', { ansi: false }, { timeoutMs: 450 })
13770
+ .then((result) => {
13771
+ if (result.status === 'success' && result.screen?.trim()) {
13772
+ chatLines.push(C.muted(` ${row.label} · 읽기 전용 snapshot (입력은 전달되지 않습니다)`));
13773
+ chatLines.push(...stripAnsi(result.screen).split('\n'));
13774
+ } else chatLines.push(C.warning(` PTY 화면 읽기 실패 · ${result.status}`));
13775
+ chatScrollOffset = -1;
13776
+ draw();
13777
+ })
13778
+ .catch((error) => {
13779
+ chatLines.push(C.warning(` PTY 화면 읽기 오류 · ${error instanceof Error ? error.message : String(error)}`));
13780
+ chatScrollOffset = -1;
13781
+ draw();
13782
+ });
13783
+ },
13784
+ spawnShell: () => { spawnGlobalTerminalModal(); },
13785
+ detach: (row) => {
13786
+ if (row?.currentProcess) {
13787
+ chatLines.push(C.muted(' 현재 classic TUI는 분리할 수 없습니다'));
13788
+ } else {
13789
+ const id = row?.sessionId ?? terminalModalRouter.current()?.id ?? sessionRegistry.foreground()?.id;
13790
+ if (!id) chatLines.push(C.muted(' 분리할 셸 세션이 없습니다'));
13791
+ else if (terminalModalRouter.current()?.id === id) terminalModalRouter.close();
13792
+ else sessionRegistry.detach(id);
13793
+ }
13794
+ chatScrollOffset = -1;
13795
+ draw();
13796
+ },
13797
+ kill: (row) => {
13798
+ if (row.sessionId && sessionRegistry.get(row.sessionId)) {
13799
+ if (terminalModalRouter.current()?.id === row.sessionId) terminalModalRouter.close();
13800
+ sessionRegistry.kill(row.sessionId);
13801
+ chatLines.push(C.muted(` ${row.label} 종료 요청 완료`));
13802
+ } else if (row.ptyId) {
13803
+ void requestRemotePtyControl(row.ptyId, 'terminate', undefined, { timeoutMs: 1_000 })
13804
+ .then((result) => chatLines.push(result.status === 'success'
13805
+ ? C.muted(` ${row.label} 종료 요청 완료`)
13806
+ : C.warning(` PTY 종료 거부 · ${result.status}`)))
13807
+ .catch((error) => chatLines.push(C.warning(` PTY 종료 오류 · ${error instanceof Error ? error.message : String(error)}`)))
13808
+ .finally(() => { chatScrollOffset = -1; draw(); });
13809
+ }
13810
+ chatScrollOffset = -1;
13811
+ draw();
13812
+ },
13813
+ returnToParent: () => {
13814
+ if (terminalModalRouter.current()) terminalModalRouter.close();
13815
+ setWorkingFocus('input', 'classic-sidetab-parent');
13816
+ draw();
13817
+ },
13818
+ status: (message) => {
13819
+ chatLines.push(C.muted(` ${message}`));
13820
+ chatScrollOffset = -1;
13821
+ draw();
13822
+ },
13823
+ });
13824
+ closeClassicSidetabRuntime = () => classicSidetabRuntime.close();
13825
+ disposeClassicSigquit = registerClassicSigquitHandler(() => {
13826
+ classicSidetabRuntime.beginPrefix();
13827
+ });
13581
13828
 
13582
13829
  // E3 (2026-05-17) — copyLastAssistantTurnToClipboard /
13583
13830
  // copyLastAssistantCodeToClipboard land into the outer-scoped
@@ -15147,20 +15394,21 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
15147
15394
  const contextUserText = ctx?.userText;
15148
15395
  const turnRefUserText = acpTurnRef.userText;
15149
15396
  const hasParentTurnAbortSignal = acpTurnRef.abortCtrl?.signal !== undefined;
15397
+ const turnSignal = acpTurnRef.abortCtrl?.signal ?? new AbortController().signal;
15150
15398
  observeDashboardToolDispatchSignal({
15151
15399
  toolName: name,
15152
15400
  turnIndex: ctx?.turnIndex ?? null,
15153
15401
  signalSource: hasParentTurnAbortSignal ? 'parent-turn' : 'fallback',
15154
15402
  hasParentTurnAbortSignal,
15155
- signalAlreadyAborted: (acpTurnRef.abortCtrl?.signal ?? new AbortController().signal).aborted,
15403
+ signalAlreadyAborted: turnSignal.aborted,
15156
15404
  });
15157
- const result = await dispatchDashboardSessionRuntimeTool(name, args, {
15405
+ const dispatchPromise = dispatchDashboardSessionRuntimeTool(name, args, {
15158
15406
  contextUserText,
15159
15407
  turnRefUserText,
15160
15408
  muted: C.muted,
15161
15409
  pushChatLine,
15162
15410
  draw,
15163
- signal: acpTurnRef.abortCtrl?.signal ?? new AbortController().signal,
15411
+ signal: turnSignal,
15164
15412
  toolCallId: ctx?.callId,
15165
15413
  // ⛔⭐ 폴백은 `''` 가 아니라 `undefined` 다 — 「안 넘김」과 「말했는데 어휘가 없음」은 «다른 값»이다.
15166
15414
  // harnessMentionState(session-runtime 소비처)는 `undefined → 'absent'` · `'' → 'not-matched'` 로
@@ -15187,7 +15435,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
15187
15435
  runtime.dispatchToolByName(toolName, input, {
15188
15436
  surface: 'tui',
15189
15437
  toolCallId,
15190
- signal: acpTurnRef.abortCtrl?.signal,
15438
+ signal: hasParentTurnAbortSignal ? turnSignal : undefined,
15191
15439
  // ⭐ Agent-family context. Without these two the sub-agent runs
15192
15440
  // text-only (see getTools above). `agentDispatchTool` routes the
15193
15441
  // child's calls back through THIS dispatcher so the child gets the
@@ -15206,6 +15454,10 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
15206
15454
  dispatchPluginTool: (toolName, input) =>
15207
15455
  pluginHost.dispatchTool(toolName, input),
15208
15456
  });
15457
+ if (ctx?.callId && (name === 'Bash' || name === 'RunShell')) {
15458
+ escDelegatedShellResultsByCallId.set(ctx.callId, dispatchPromise);
15459
+ }
15460
+ const result = await dispatchPromise;
15209
15461
  // Mirror the direct-path truncation wrapper at
15210
15462
  // dashboard/index.ts L19917-19932 so large tool outputs
15211
15463
  // land in the preview store + the LLM sees the short
@@ -15239,6 +15491,12 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
15239
15491
  pushTurnToolHistory: (msgs) => {
15240
15492
  for (const m of msgs) chat.history.push(m as ChatMessage);
15241
15493
  },
15494
+ // TUI-TOKEN-GUARD-WIRE — the request-size cap writes its compaction back here so the
15495
+ // next prompt reads the compacted history instead of reloading the original.
15496
+ replaceChatHistory: (msgs) => {
15497
+ chat.history.length = 0;
15498
+ for (const m of msgs) chat.history.push(m);
15499
+ },
15242
15500
  // F1 — Phase 3 · ACP `requestPermission` gateway. Routes
15243
15501
  // every inbound permission request to the dashboard's shared
15244
15502
  // approval modal so the UX matches direct-dispatch approvers
@@ -15655,6 +15913,12 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
15655
15913
 
15656
15914
  const priorityRoute = await routeDashboardPriorityKey(key, {
15657
15915
  inputOwner: chatMainVisibility.inputOwnership?.owner,
15916
+ routeClassicSigquitChord: (routeKey) => {
15917
+ if (classicSidetabRuntime.routeKey(routeKey)) return true;
15918
+ if (!isClassicSigquitChord(routeKey)) return false;
15919
+ showClassicSigquitGuidance();
15920
+ return true;
15921
+ },
15658
15922
  routeBellKey: async (routeKey) => {
15659
15923
  if (!bellOpen || routeKey.mouse) return false;
15660
15924
  const inst = widgetHost.get('wd-notification-bell');
@@ -15701,6 +15965,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
15701
15965
  draw();
15702
15966
  return true;
15703
15967
  },
15968
+ routeSidetabKey: (routeKey) => classicSidetabRuntime.routeKey(routeKey),
15704
15969
  dispatchPreKey: (routeKey, targetHandlerName) => {
15705
15970
  const questionViewHandler = {
15706
15971
  name: 'question-view',
@@ -15789,13 +16054,9 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
15789
16054
  return true;
15790
16055
  },
15791
16056
  // Step 0 force-quit — fires from anywhere (bell modal, popup
15792
- // terminal, drag, dashboard). Escape-hatch aliases:
15793
- // - Ctrl+Shift+Q
15794
- // - Ctrl+\
15795
- // The second alias is for terminal/VW-heavy contexts where
15796
- // Shift-modified control chords may get normalized away by the
15797
- // terminal emulator. Plain Ctrl+Q is still *not* the true
15798
- // force-quit because terminal-resident apps use it.
16057
+ // terminal, drag, dashboard). Ctrl+Shift+Q is the escape chord;
16058
+ // Ctrl+\ is reserved for classic side-tab guidance. Plain Ctrl+Q
16059
+ // remains available to terminal-resident apps.
15799
16060
  // Korean shifted ㅃ (Shift+ㅂ on 2-bul) accepts ctrl-only
15800
16061
  // because the shift bit may be implicit in the codepoint.
15801
16062
  isForceQuitChord: (routeKey) => {
@@ -15812,7 +16073,6 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
15812
16073
  });
15813
16074
  }
15814
16075
  if (!routeKey.ctrl) return false;
15815
- if (routeKey.name === '\\' || routeKey.name === 'backslash') return true;
15816
16076
  if (routeKey.shift && (routeKey.name === 'q' || routeKey.name === 'Q' || routeKey.name === 'ㅂ')) return true;
15817
16077
  if (routeKey.name === 'ㅃ') return true;
15818
16078
  return false;
@@ -16573,6 +16833,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
16573
16833
  chatMainInputVisibilityState().inputOwnership?.owner === 'chat-main',
16574
16834
  onPasteImage: attachClipboardImage,
16575
16835
  routeVoiceKey: async (routeKey) => {
16836
+ if (classicSidetabRuntime.routeKey(routeKey)) return 'consumed';
16576
16837
  // 2026-04-30 — voice-chat ESC: when the controller is
16577
16838
  // active and the user hits ESC inside chat-main, take
16578
16839
  // it as a "exit voice mode" gesture and DO NOT let
@@ -16825,6 +17086,12 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
16825
17086
  const outcome = await inputCoreRouteInputEventAsync(ev, ctx);
16826
17087
  return outcome === 'consumed' ? 'consumed' : 'passthrough';
16827
17088
  },
17089
+ routeQuitChord: (key) => {
17090
+ if (classicSidetabRuntime.routeKey(key)) return 'consumed';
17091
+ if (!isClassicSigquitChord(key)) return 'passthrough';
17092
+ showClassicSigquitGuidance();
17093
+ return 'consumed';
17094
+ },
16828
17095
  shouldRouteInputDispatcherKey: (key) => {
16829
17096
  const topModalId = display.modalStack().at(-1) ?? null;
16830
17097
  const topModal = topModalId ? display.surface(topModalId) : null;
@@ -17249,9 +17516,11 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
17249
17516
  // { return: DashboardAction }.
17250
17517
  const dashboardSlashSurfaceUx = resolveDashboardSlashSurfaceUx();
17251
17518
  const clarificationSurfaceUx = dashboardSlashSurfaceUx ? {
17252
- question: (request: Parameters<typeof dashboardSlashSurfaceUx.question>[0]) => {
17253
- const pending = dashboardSlashSurfaceUx.question(request);
17254
- if ((request as typeof request & { [DASHBOARD_CLARIFICATION_REQUEST]?: boolean })[DASHBOARD_CLARIFICATION_REQUEST]) {
17519
+ question: (request: Parameters<typeof dashboardSlashSurfaceUx.question>[0], options?: Parameters<typeof dashboardSlashSurfaceUx.question>[1]) => {
17520
+ const clarification = (request as typeof request & { [DASHBOARD_CLARIFICATION_REQUEST]?: boolean })[DASHBOARD_CLARIFICATION_REQUEST] === true;
17521
+ if (clarification && resolveTuiUnattended(getUserConfig())) return resolveInlineAskUserQuestion(request);
17522
+ const pending = dashboardSlashSurfaceUx.question(request, options);
17523
+ if (clarification) {
17255
17524
  const handle = approvalModalRouter.current();
17256
17525
  if (approvalModalRouter.currentKind() === 'askUser' && handle) {
17257
17526
  clarificationModalId = handle.surface.id;
@@ -17603,6 +17872,8 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
17603
17872
  pushModalSurface: (surface: import('../display/modal-stack.js').ModalSurface) => display.pushModal(surface),
17604
17873
  redraw: draw,
17605
17874
  onStatus: (line: string) => {
17875
+ // 상태 줄 = 진전 신호(SURVIVAL-PROGRESS-CLOCK) — 마지막 진전 시각을 올린다.
17876
+ reportTuiProgress();
17606
17877
  chatLines.push(C.muted(` ${line}`));
17607
17878
  chatScrollOffset = -1;
17608
17879
  },
@@ -17947,10 +18218,16 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
17947
18218
  schedulerRef: dashboardLoopSchedulerRef,
17948
18219
  },
17949
18220
  };
17950
- const slashOutcome = await dashboardSlashRegistry.dispatch(cmdLower, args, slashCtx);
17951
- if (cmdLower === 'mission') {
17952
- debug.log('tui.legacy-slash-use', 'mission', { surface: 'classic', tuiSession: null });
18221
+ const slashCommand = SLASH_COMMANDS.find((entry) => entry.name === cmdLower || entry.aliases?.includes(cmdLower));
18222
+ if (slashCommand) {
18223
+ debug.log('tui.slash-use', 'dispatch', {
18224
+ command: slashCommand.name,
18225
+ alias: cmdLower === slashCommand.name ? null : cmdLower,
18226
+ surface: 'classic',
18227
+ runId: slashUsageRunId,
18228
+ });
17953
18229
  }
18230
+ const slashOutcome = await dashboardSlashRegistry.dispatch(cmdLower, args, slashCtx);
17954
18231
  if (debug.enabled) {
17955
18232
  debug.log('dashboard.slash.dispatch', cmdLower, {
17956
18233
  argsCount: args.length,
@@ -17963,6 +18240,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
17963
18240
  if (slashOutcome.kind === 'return') return slashOutcome.value;
17964
18241
  if (slashOutcome.kind === 'continue') {
17965
18242
  if (exitInputLoop) break;
18243
+ draw();
17966
18244
  continue;
17967
18245
  }
17968
18246
  switch (cmdLower) {
@@ -18771,7 +19049,11 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
18771
19049
  createTurnStreamRuntime: (initialAssistantStart) => {
18772
19050
  latestTurnUsage = undefined;
18773
19051
  createDashboardTurnStreamRuntimeEscBoundary(escAbortToolState);
19052
+ delegatedTerminationPending = false;
19053
+ delegatedTerminationFailed = false;
18774
19054
  escHarnessSpacesByCallId.clear();
19055
+ escDelegatedPtyIdsByCallId.clear();
19056
+ escDelegatedShellResultsByCallId.clear();
18775
19057
  liveTypeaheadEchoes.length = 0;
18776
19058
  const toolRendering = {
18777
19059
  ...getUserConfig().chat.rendering.tool,
@@ -18814,19 +19096,31 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
18814
19096
  return {
18815
19097
  ...turnStreamRuntime,
18816
19098
  onText: (chunk, accumulated) => {
19099
+ // 스트림 텍스트 = 진전 신호(SURVIVAL-PROGRESS-CLOCK) — 마지막 진전 시각을 올린다.
19100
+ reportTuiProgress();
18817
19101
  turnStreamRuntime.onText(chunk, accumulated);
18818
19102
  restoreLiveTypeaheadEchoes();
18819
19103
  draw();
18820
19104
  },
18821
19105
  onToolCall: (call) => {
18822
19106
  const toolCall = call as DashboardTurnStreamCall;
19107
+ // 도구 시작 = 진전 신호 — 녹음기가 없으면(reportTuiProgress 계약) 아무 일도 안 한다.
19108
+ reportTuiProgress();
18823
19109
  trackEscAbortToolCall(escAbortToolState, toolCall);
19110
+ if ((toolCall.name === 'PtyShellPoll' || toolCall.name === 'PtyShellSnapshot' || toolCall.name === 'PtyShellSend')
19111
+ && typeof toolCall.args.process_id === 'string') {
19112
+ escDelegatedPtyIdsByCallId.set(toolCall.id, toolCall.args.process_id);
19113
+ }
18824
19114
  turnStreamRuntime.onToolCall(toolCall);
18825
19115
  },
18826
19116
  onToolResult: (call) => {
18827
19117
  const toolCall = call as DashboardTurnStreamCall;
19118
+ // 도구 끝 = 진전 신호 — 마지막 진전 시각을 올린다.
19119
+ reportTuiProgress();
18828
19120
  turnStreamRuntime.onToolResult(toolCall);
18829
19121
  settleEscAbortToolCall(escAbortToolState, toolCall);
19122
+ escDelegatedPtyIdsByCallId.delete(toolCall.id);
19123
+ escDelegatedShellResultsByCallId.delete(toolCall.id);
18830
19124
  escHarnessSpacesByCallId.delete(toolCall.id);
18831
19125
  },
18832
19126
  onThought: (text) => {
@@ -18968,7 +19262,13 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
18968
19262
  chatLines.push(C.warning(notice));
18969
19263
  detailViewerRuntime.stage('turn error', raw.split(/\r?\n/));
18970
19264
  },
18971
- finalizeTurn: (finalStatus, finalError) => {
19265
+ finalizeTurn: async (finalStatus, finalError) => {
19266
+ if (escDelegatedTermination) {
19267
+ const terminated = await escDelegatedTermination;
19268
+ finalStatus = terminated ? 'interrupted' : 'failed';
19269
+ if (!terminated) finalError = 'delegated PTY termination failed';
19270
+ escDelegatedTermination = null;
19271
+ }
18972
19272
  lastTurnFinalStatus = finalStatus;
18973
19273
  clearEscAbortToolState(escAbortToolState);
18974
19274
  finalizeDashboardTurn({