elanous 0.2.37 → 0.2.40

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 (727) hide show
  1. package/apps/pwa/out/404/index.html +1 -1
  2. package/apps/pwa/out/404.html +1 -1
  3. package/apps/pwa/out/_next/static/{8kITumG9GAZ1LwT9POrAR → HjeK7zONHfR7op1hKXp4k}/_buildManifest.js +1 -1
  4. package/apps/pwa/out/_next/static/chunks/{1746.3563617ea64023a3.js → 1060.014f1f01a17aec26.js} +1 -1
  5. package/apps/pwa/out/_next/static/chunks/{9151.a2c51e93f9156dae.js → 1281.d81877e35b9068f4.js} +1 -1
  6. package/apps/pwa/out/_next/static/chunks/1350.59f40e39e02d91b1.js +1 -0
  7. package/apps/pwa/out/_next/static/chunks/1415.79821ec7ae99acdb.js +1 -0
  8. package/apps/pwa/out/_next/static/chunks/1452.162bb2d9d699e82a.js +1 -0
  9. package/apps/pwa/out/_next/static/chunks/147.f92f63bbc5e85fa5.js +286 -0
  10. package/apps/pwa/out/_next/static/chunks/1537-6bb97b5214928ea9.js +1 -0
  11. package/apps/pwa/out/_next/static/chunks/1661.fb425a1d8a065b72.js +149 -0
  12. package/apps/pwa/out/_next/static/chunks/1671-1c22b40b50b208f2.js +1 -0
  13. package/apps/pwa/out/_next/static/chunks/1758.0204d3f48783c49d.js +90 -0
  14. package/apps/pwa/out/_next/static/chunks/1806.027bf78b6a94d340.js +104 -0
  15. package/apps/pwa/out/_next/static/chunks/{3578.4e9f9948a9a6f2f4.js → 2047.8f23e210995d4548.js} +2 -2
  16. package/apps/pwa/out/_next/static/chunks/2061-7f2bbc53ae96c88b.js +1 -0
  17. package/apps/pwa/out/_next/static/chunks/{7424.c0fe2a595d4232b5.js → 2066.a77257c8c350770a.js} +1 -1
  18. package/apps/pwa/out/_next/static/chunks/2096-a938496bc996dcbd.js +1 -0
  19. package/apps/pwa/out/_next/static/chunks/{4931.95cc6dbd230774ca.js → 2177.df8547f9d7215c4e.js} +16 -16
  20. package/apps/pwa/out/_next/static/chunks/2200-9a453b8f99687d49.js +1 -0
  21. package/apps/pwa/out/_next/static/chunks/{6680.6a693c28aae4cd19.js → 2226.2cf61ec781827219.js} +2 -2
  22. package/apps/pwa/out/_next/static/chunks/2281-b8cede695c6c650e.js +1 -0
  23. package/apps/pwa/out/_next/static/chunks/2499.02fbfd18126c10c0.js +1 -0
  24. package/apps/pwa/out/_next/static/chunks/{6252.240578f10952e091.js → 2522.f2766b76d22c8bdf.js} +1 -1
  25. package/apps/pwa/out/_next/static/chunks/{1262.a89bb27a5b2f844e.js → 2566.beaffc3a5e1fcd2e.js} +1 -1
  26. package/apps/pwa/out/_next/static/chunks/261.0d471e8aded799f3.js +226 -0
  27. package/apps/pwa/out/_next/static/chunks/2615.3c9738153de3ef3f.js +1 -0
  28. package/apps/pwa/out/_next/static/chunks/2727.e703d99ac414916d.js +1 -0
  29. package/apps/pwa/out/_next/static/chunks/2752.7904b8df0254d0ae.js +27 -0
  30. package/apps/pwa/out/_next/static/chunks/2762-5051a862dfa40e99.js +1 -0
  31. package/apps/pwa/out/_next/static/chunks/2767-31784bfedf8e245d.js +1 -0
  32. package/apps/pwa/out/_next/static/chunks/{2318-450e75d07605b8fe.js → 2774-719820e3f5b2a3eb.js} +1 -1
  33. package/apps/pwa/out/_next/static/chunks/2812-f016aa0dda149287.js +1 -0
  34. package/apps/pwa/out/_next/static/chunks/{4725-34bed25720cc326b.js → 2829-734fe8bf2eee7347.js} +1 -1
  35. package/apps/pwa/out/_next/static/chunks/311-32dcac79970985e8.js +1 -0
  36. package/apps/pwa/out/_next/static/chunks/3175-f93f7495cd28253c.js +1 -0
  37. package/apps/pwa/out/_next/static/chunks/3184.8da993f5502d2140.js +1 -0
  38. package/apps/pwa/out/_next/static/chunks/3231-d7c981db0ff8bdcc.js +1 -0
  39. package/apps/pwa/out/_next/static/chunks/3250.151309c5176d6b4b.js +1 -0
  40. package/apps/pwa/out/_next/static/chunks/3330.7443183b7e6fdbdf.js +1 -0
  41. package/apps/pwa/out/_next/static/chunks/3517.a5aa1797a9dbf2ee.js +1 -0
  42. package/apps/pwa/out/_next/static/chunks/3567-45f676877ed9e8a5.js +1 -0
  43. package/apps/pwa/out/_next/static/chunks/3746-f80a78f220bf37b5.js +1 -0
  44. package/apps/pwa/out/_next/static/chunks/3819.8a1de79b2e8c7298.js +24 -0
  45. package/apps/pwa/out/_next/static/chunks/39.9b37b0be4c128a83.js +77 -0
  46. package/apps/pwa/out/_next/static/chunks/{4337e36d.f42c3b391b3d8f20.js → 3b355b3d.6f73c98bf6f9c749.js} +1 -1
  47. package/apps/pwa/out/_next/static/chunks/4023.a19045970a9ce16a.js +36 -0
  48. package/apps/pwa/out/_next/static/chunks/{58edce7d.f1b0c72acf13b123.js → 409c787b.e48c5bec8ec10456.js} +1 -1
  49. package/apps/pwa/out/_next/static/chunks/413-24c8284bda08241d.js +1 -0
  50. package/apps/pwa/out/_next/static/chunks/4135.e45d6ebc29e20647.js +1 -0
  51. package/apps/pwa/out/_next/static/chunks/4283.65502f5d0e6ff6c0.js +287 -0
  52. package/apps/pwa/out/_next/static/chunks/4305-4e28fa92a7b34a5b.js +1 -0
  53. package/apps/pwa/out/_next/static/chunks/4335-50efa61fd7613142.js +1 -0
  54. package/apps/pwa/out/_next/static/chunks/4351.0f37a6db2b34d50b.js +1 -0
  55. package/apps/pwa/out/_next/static/chunks/{5046.7fd5cbd859299448.js → 470.51a72a2348306455.js} +2 -2
  56. package/apps/pwa/out/_next/static/chunks/4720.ecbd1693fa151068.js +1 -0
  57. package/apps/pwa/out/_next/static/chunks/{2375.bf364c85dbb6f085.js → 4769.9fd582071301f382.js} +1 -1
  58. package/apps/pwa/out/_next/static/chunks/483.725e4a61be922788.js +1 -0
  59. package/apps/pwa/out/_next/static/chunks/{de8446d3.31b73eb239fecd7b.js → 4864a2ca.1c1c280a7772c5e5.js} +1 -1
  60. package/apps/pwa/out/_next/static/chunks/4969-4b209d7307410c00.js +1 -0
  61. package/apps/pwa/out/_next/static/chunks/5068-c7f53862f83c0917.js +1 -0
  62. package/apps/pwa/out/_next/static/chunks/5315.bc96711c24dfefe2.js +74 -0
  63. package/apps/pwa/out/_next/static/chunks/{4383.18e5c54db3a22c88.js → 5383.bdfa5d886e39a826.js} +1 -1
  64. package/apps/pwa/out/_next/static/chunks/5436.fdf6fa8ae3e9588d.js +64 -0
  65. package/apps/pwa/out/_next/static/chunks/5542.efbf14f16baed4dd.js +1 -0
  66. package/apps/pwa/out/_next/static/chunks/5622.94893f5aea7185d0.js +1 -0
  67. package/apps/pwa/out/_next/static/chunks/5644.8f401a25601d05fc.js +1 -0
  68. package/apps/pwa/out/_next/static/chunks/5658.35f70eb9871a54bf.js +1 -0
  69. package/apps/pwa/out/_next/static/chunks/5721.7bdc0e904c76ab51.js +8 -0
  70. package/apps/pwa/out/_next/static/chunks/5790-eef0ca20884a6bdf.js +1 -0
  71. package/apps/pwa/out/_next/static/chunks/5802.ef0d8598ca68fe84.js +62 -0
  72. package/apps/pwa/out/_next/static/chunks/5890.fb974729788dcb71.js +1 -0
  73. package/apps/pwa/out/_next/static/chunks/5924.5ef25cddd36d5dbf.js +1 -0
  74. package/apps/pwa/out/_next/static/chunks/5979-e59c099ebf8d1f35.js +1 -0
  75. package/apps/pwa/out/_next/static/chunks/6020.714cfeada2315e2e.js +94 -0
  76. package/apps/pwa/out/_next/static/chunks/6027-dfe0349d8c50f698.js +1 -0
  77. package/apps/pwa/out/_next/static/chunks/{6745-5a63492933959dd9.js → 6051-0ae955eedb10adb9.js} +3 -3
  78. package/apps/pwa/out/_next/static/chunks/6178.bc4730c86cf74536.js +1 -0
  79. package/apps/pwa/out/_next/static/chunks/{2283.edd9627b7bdfb546.js → 6257.c0037b8949239f5e.js} +2 -2
  80. package/apps/pwa/out/_next/static/chunks/6273.d808b0dcb3c2b155.js +1 -0
  81. package/apps/pwa/out/_next/static/chunks/6292.6ef1df64fa6a4c8a.js +1 -0
  82. package/apps/pwa/out/_next/static/chunks/647-af8dd920ba46533c.js +1 -0
  83. package/apps/pwa/out/_next/static/chunks/6541-170dc5c59e135c0c.js +1 -0
  84. package/apps/pwa/out/_next/static/chunks/6624.981ef7caeb680560.js +32 -0
  85. package/apps/pwa/out/_next/static/chunks/6742-a1ad4a94ba7bc37a.js +1 -0
  86. package/apps/pwa/out/_next/static/chunks/{6819.be5c9c4d67f22922.js → 6749.0744ce6eb08d40e9.js} +16 -16
  87. package/apps/pwa/out/_next/static/chunks/6836-493dc55c39187949.js +1 -0
  88. package/apps/pwa/out/_next/static/chunks/6856-53ac421c06039a18.js +1 -0
  89. package/apps/pwa/out/_next/static/chunks/6908.06008c67f6380ea9.js +148 -0
  90. package/apps/pwa/out/_next/static/chunks/6915.096931864206f522.js +1 -0
  91. package/apps/pwa/out/_next/static/chunks/6925.5e181fb7dcf90193.js +1 -0
  92. package/apps/pwa/out/_next/static/chunks/6cc1d1d6.9a98dd4622f1afc6.js +1 -0
  93. package/apps/pwa/out/_next/static/chunks/7203-800e11037adc41eb.js +1 -0
  94. package/apps/pwa/out/_next/static/chunks/7219-15bdd9a80661af8e.js +1 -0
  95. package/apps/pwa/out/_next/static/chunks/7279.6170f591105936bb.js +93 -0
  96. package/apps/pwa/out/_next/static/chunks/7349-373165c7fbdcc3df.js +1 -0
  97. package/apps/pwa/out/_next/static/chunks/7514-a533ba0ca1cae4f4.js +1 -0
  98. package/apps/pwa/out/_next/static/chunks/7515.1ad6efe157fa4448.js +1 -0
  99. package/apps/pwa/out/_next/static/chunks/7521.d919cc1fab80c1d9.js +24 -0
  100. package/apps/pwa/out/_next/static/chunks/7538.90e97bbdf9178cff.js +1 -0
  101. package/apps/pwa/out/_next/static/chunks/7611.85f045bf232053ac.js +1 -0
  102. package/apps/pwa/out/_next/static/chunks/7825-39203196a12579b2.js +1 -0
  103. package/apps/pwa/out/_next/static/chunks/7869.5e1a9a12fd70d6c7.js +1 -0
  104. package/apps/pwa/out/_next/static/chunks/8086.1ab9103c41be884f.js +1 -0
  105. package/apps/pwa/out/_next/static/chunks/8099.1cccf31c1baa7e1c.js +1 -0
  106. package/apps/pwa/out/_next/static/chunks/8179-e61fffbdb70f1152.js +1 -0
  107. package/apps/pwa/out/_next/static/chunks/8265.bdeb991b34db6a06.js +1 -0
  108. package/apps/pwa/out/_next/static/chunks/{2002-a43a3f380df873ec.js → 8272-025653884f9645d2.js} +1 -1
  109. package/apps/pwa/out/_next/static/chunks/{7867.e8725745ddd1d940.js → 8357.1aaa713b052a78b1.js} +4 -4
  110. package/apps/pwa/out/_next/static/chunks/8638-e42615f2166165b5.js +1 -0
  111. package/apps/pwa/out/_next/static/chunks/8639-92c11d069792429e.js +1 -0
  112. package/apps/pwa/out/_next/static/chunks/8691.54e22831d5e8ccf8.js +1 -0
  113. package/apps/pwa/out/_next/static/chunks/8d173e38.18a2f7b4e1848bdb.js +1 -0
  114. package/apps/pwa/out/_next/static/chunks/9069.657590a84afb8fac.js +41 -0
  115. package/apps/pwa/out/_next/static/chunks/9125-ae588d88a0293b93.js +1 -0
  116. package/apps/pwa/out/_next/static/chunks/{4313.76f232c304a15bde.js → 9175.2de5209a5ce6f68a.js} +1 -1
  117. package/apps/pwa/out/_next/static/chunks/9184.45afbf44fec87574.js +1 -0
  118. package/apps/pwa/out/_next/static/chunks/{8c58d09b.e8724a299658d86f.js → 9189505a.980427ac048c8c60.js} +1 -1
  119. package/apps/pwa/out/_next/static/chunks/9311.f9f641a46a508611.js +1 -0
  120. package/apps/pwa/out/_next/static/chunks/9371-a6fee8378ebfa3ee.js +1 -0
  121. package/apps/pwa/out/_next/static/chunks/9421-3aa9ff4fa7f63d8a.js +1 -0
  122. package/apps/pwa/out/_next/static/chunks/9992.07ce73c10bd5e6a1.js +79 -0
  123. package/apps/pwa/out/_next/static/chunks/app/_not-found/page-76394dc618d322c8.js +1 -0
  124. package/apps/pwa/out/_next/static/chunks/app/approvals/page-1b948637c37b3abd.js +1 -0
  125. package/apps/pwa/out/_next/static/chunks/app/autopilot/page-c63400f1bcf3e47c.js +1 -0
  126. package/apps/pwa/out/_next/static/chunks/app/board/page-95d0957267819586.js +1 -0
  127. package/apps/pwa/out/_next/static/chunks/app/botlab/page-ba957ff875a026a0.js +1 -0
  128. package/apps/pwa/out/_next/static/chunks/app/bots/page-bb6fd0714879cb87.js +1 -0
  129. package/apps/pwa/out/_next/static/chunks/app/ceo/page-8f9038520d2acbef.js +1 -0
  130. package/apps/pwa/out/_next/static/chunks/app/chat/page-d4b48397e05fce2c.js +1 -0
  131. package/apps/pwa/out/_next/static/chunks/app/consult/page-72d5744245dc0c27.js +1 -0
  132. package/apps/pwa/out/_next/static/chunks/app/control/page-37625dc8300fa43a.js +1 -0
  133. package/apps/pwa/out/_next/static/chunks/app/decisions/page-fbef9d160272dbc1.js +1 -0
  134. package/apps/pwa/out/_next/static/chunks/app/design-check/page-58424168df84928e.js +1 -0
  135. package/apps/pwa/out/_next/static/chunks/app/editor/page-72c12ba430ac57c0.js +1 -0
  136. package/apps/pwa/out/_next/static/chunks/app/exec/page-d53f3e9ed806d7e0.js +1 -0
  137. package/apps/pwa/out/_next/static/chunks/app/field/page-4d2fbd45feee0829.js +1 -0
  138. package/apps/pwa/out/_next/static/chunks/app/healthz/route-76394dc618d322c8.js +1 -0
  139. package/apps/pwa/out/_next/static/chunks/app/inside/page-8783dc0ed7590a2c.js +1 -0
  140. package/apps/pwa/out/_next/static/chunks/app/intake/page-3706cb390606e930.js +1 -0
  141. package/apps/pwa/out/_next/static/chunks/app/layout-9b0a86598e0111fd.js +1 -0
  142. package/apps/pwa/out/_next/static/chunks/app/live/{page-3337c6a1328c2674.js → page-4edb8df90f4537ce.js} +1 -1
  143. package/apps/pwa/out/_next/static/chunks/app/live-run/page-83d27757e2b8060a.js +1 -0
  144. package/apps/pwa/out/_next/static/chunks/app/loops/page-47398b9ba1cc5e1b.js +1 -0
  145. package/apps/pwa/out/_next/static/chunks/app/market/page-fb86f55cfe2e681d.js +1 -0
  146. package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-e22345fc8fd47b1b.js +1 -0
  147. package/apps/pwa/out/_next/static/chunks/app/morning/{page-1e5da297557d2354.js → page-fca2e59a81744d9e.js} +1 -1
  148. package/apps/pwa/out/_next/static/chunks/app/not-found-6e96bda63100b31e.js +1 -0
  149. package/apps/pwa/out/_next/static/chunks/app/observatory/page-4d17ad8e0db8cea4.js +1 -0
  150. package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-121f92766c33beaa.js +1 -0
  151. package/apps/pwa/out/_next/static/chunks/app/ops/release/page-43f14212c545f92d.js +1 -0
  152. package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-ccec2023e7a974ec.js +1 -0
  153. package/apps/pwa/out/_next/static/chunks/app/outputs/page-b04f33f548b89a94.js +1 -0
  154. package/apps/pwa/out/_next/static/chunks/app/page-c8792823c0917021.js +1 -0
  155. package/apps/pwa/out/_next/static/chunks/app/reflection/page-8c0e32782ceef4cb.js +1 -0
  156. package/apps/pwa/out/_next/static/chunks/app/scheduler/page-94bd3922eb230ce8.js +1 -0
  157. package/apps/pwa/out/_next/static/chunks/app/sessions/page-bca565887bafa03c.js +1 -0
  158. package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-ac1dffafe649fc6c.js +1 -0
  159. package/apps/pwa/out/_next/static/chunks/app/settings/page-52374edb5e23e455.js +1 -0
  160. package/apps/pwa/out/_next/static/chunks/app/setup/done/page-ad4ebca120d43ca7.js +1 -0
  161. package/apps/pwa/out/_next/static/chunks/app/setup/layout-76394dc618d322c8.js +1 -0
  162. package/apps/pwa/out/_next/static/chunks/app/setup/page-718b89ce4b4ae4e4.js +1 -0
  163. package/apps/pwa/out/_next/static/chunks/app/share/page-204eca33eeeaddec.js +1 -0
  164. package/apps/pwa/out/_next/static/chunks/app/showroom/page-e58ba9bcdb9ac0f9.js +1 -0
  165. package/apps/pwa/out/_next/static/chunks/app/tasks/page-98f6dd50bafd7734.js +1 -0
  166. package/apps/pwa/out/_next/static/chunks/app/term/{page-ac2c1e6169cfce57.js → page-139d722de1dcd6c1.js} +1 -1
  167. package/apps/pwa/out/_next/static/chunks/app/today/page-5a4bdd72bff27057.js +1 -0
  168. package/apps/pwa/out/_next/static/chunks/app/trace/page-6f6ab17d44f984ce.js +1 -0
  169. package/apps/pwa/out/_next/static/chunks/app/vault/page-aabb7bd15fb72da9.js +1 -0
  170. package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-e4322319164a4436.js +1 -0
  171. package/apps/pwa/out/_next/static/chunks/app/workflows/page-e9efc0c8f32e2371.js +1 -0
  172. package/apps/pwa/out/_next/static/chunks/app/workspace/{page-c1c80e345fa9d6f5.js → page-ccde99f07aaf71f7.js} +1 -1
  173. package/apps/pwa/out/_next/static/chunks/app/worktrees/page-80464aced9614390.js +1 -0
  174. package/apps/pwa/out/_next/static/chunks/{d9815f84.4918f682a45a8502.js → b84cad00.594027ebe0531fe2.js} +3 -3
  175. package/apps/pwa/out/_next/static/chunks/c696986b.5dc8bb1143af16d1.js +1 -0
  176. package/apps/pwa/out/_next/static/chunks/{709a918c.4fd3b4e2a32cb4e3.js → ca3702f8.2913182e73889fa2.js} +1 -1
  177. package/apps/pwa/out/_next/static/chunks/d5d3cefc-373c4eb722ed848b.js +1 -0
  178. package/apps/pwa/out/_next/static/chunks/{5f6af561-f90b7a67f4f75d13.js → d8de0de2-dd0f4ac8e5ab1832.js} +1 -1
  179. package/apps/pwa/out/_next/static/chunks/framework-002b472a66935d31.js +1 -0
  180. package/apps/pwa/out/_next/static/chunks/main-49b88d47292c0476.js +1 -0
  181. package/apps/pwa/out/_next/static/chunks/main-app-fff2549cb10a133f.js +1 -0
  182. package/apps/pwa/out/_next/static/chunks/pages/_app-32abbbba3f3b76b7.js +1 -0
  183. package/apps/pwa/out/_next/static/chunks/pages/_error-9d9cfef60c60dd7a.js +1 -0
  184. package/apps/pwa/out/_next/static/chunks/webpack-cc7f483fa294034a.js +1 -0
  185. package/apps/pwa/out/approvals/index.html +1 -1
  186. package/apps/pwa/out/approvals/index.txt +22 -22
  187. package/apps/pwa/out/autopilot/index.html +1 -1
  188. package/apps/pwa/out/autopilot/index.txt +22 -22
  189. package/apps/pwa/out/board/index.html +1 -1
  190. package/apps/pwa/out/board/index.txt +22 -22
  191. package/apps/pwa/out/botlab/index.html +1 -1
  192. package/apps/pwa/out/botlab/index.txt +21 -21
  193. package/apps/pwa/out/bots/index.html +1 -1
  194. package/apps/pwa/out/bots/index.txt +21 -21
  195. package/apps/pwa/out/ceo/index.html +1 -1
  196. package/apps/pwa/out/ceo/index.txt +22 -22
  197. package/apps/pwa/out/chat/index.html +1 -1
  198. package/apps/pwa/out/chat/index.txt +21 -21
  199. package/apps/pwa/out/consult/index.html +1 -1
  200. package/apps/pwa/out/consult/index.txt +22 -22
  201. package/apps/pwa/out/control/index.html +1 -1
  202. package/apps/pwa/out/control/index.txt +22 -22
  203. package/apps/pwa/out/decisions/index.html +1 -1
  204. package/apps/pwa/out/decisions/index.txt +21 -21
  205. package/apps/pwa/out/design-check/index.html +1 -1
  206. package/apps/pwa/out/design-check/index.txt +22 -22
  207. package/apps/pwa/out/editor/index.html +1 -1
  208. package/apps/pwa/out/editor/index.txt +22 -22
  209. package/apps/pwa/out/exec/index.html +1 -1
  210. package/apps/pwa/out/exec/index.txt +22 -22
  211. package/apps/pwa/out/field/index.html +1 -1
  212. package/apps/pwa/out/field/index.txt +22 -22
  213. package/apps/pwa/out/healthz +1 -1
  214. package/apps/pwa/out/index.html +1 -1
  215. package/apps/pwa/out/index.txt +21 -21
  216. package/apps/pwa/out/inside/index.html +1 -1
  217. package/apps/pwa/out/inside/index.txt +21 -21
  218. package/apps/pwa/out/intake/index.html +1 -1
  219. package/apps/pwa/out/intake/index.txt +22 -22
  220. package/apps/pwa/out/live/index.html +1 -1
  221. package/apps/pwa/out/live/index.txt +22 -22
  222. package/apps/pwa/out/live-run/index.html +1 -1
  223. package/apps/pwa/out/live-run/index.txt +22 -22
  224. package/apps/pwa/out/loops/index.html +1 -1
  225. package/apps/pwa/out/loops/index.txt +21 -21
  226. package/apps/pwa/out/market/index.html +1 -1
  227. package/apps/pwa/out/market/index.txt +21 -21
  228. package/apps/pwa/out/missions/placeholder/index.html +1 -1
  229. package/apps/pwa/out/missions/placeholder/index.txt +21 -21
  230. package/apps/pwa/out/morning/index.html +1 -1
  231. package/apps/pwa/out/morning/index.txt +22 -22
  232. package/apps/pwa/out/observatory/index.html +1 -1
  233. package/apps/pwa/out/observatory/index.txt +22 -22
  234. package/apps/pwa/out/ops/checklist/index.html +1 -1
  235. package/apps/pwa/out/ops/checklist/index.txt +21 -21
  236. package/apps/pwa/out/ops/release/index.html +1 -1
  237. package/apps/pwa/out/ops/release/index.txt +21 -21
  238. package/apps/pwa/out/ops/seats/index.html +1 -1
  239. package/apps/pwa/out/ops/seats/index.txt +21 -21
  240. package/apps/pwa/out/outputs/index.html +1 -1
  241. package/apps/pwa/out/outputs/index.txt +21 -21
  242. package/apps/pwa/out/reflection/index.html +1 -1
  243. package/apps/pwa/out/reflection/index.txt +22 -22
  244. package/apps/pwa/out/scheduler/index.html +1 -1
  245. package/apps/pwa/out/scheduler/index.txt +22 -22
  246. package/apps/pwa/out/sessions/index.html +1 -1
  247. package/apps/pwa/out/sessions/index.txt +21 -21
  248. package/apps/pwa/out/settings/devices/index.html +1 -1
  249. package/apps/pwa/out/settings/devices/index.txt +22 -22
  250. package/apps/pwa/out/settings/index.html +1 -1
  251. package/apps/pwa/out/settings/index.txt +22 -22
  252. package/apps/pwa/out/setup/done/index.html +1 -1
  253. package/apps/pwa/out/setup/done/index.txt +22 -22
  254. package/apps/pwa/out/setup/index.html +1 -1
  255. package/apps/pwa/out/setup/index.txt +22 -22
  256. package/apps/pwa/out/share/index.html +1 -1
  257. package/apps/pwa/out/share/index.txt +22 -22
  258. package/apps/pwa/out/showroom/index.html +1 -1
  259. package/apps/pwa/out/showroom/index.txt +21 -21
  260. package/apps/pwa/out/tasks/index.html +1 -1
  261. package/apps/pwa/out/tasks/index.txt +22 -22
  262. package/apps/pwa/out/term/index.html +1 -1
  263. package/apps/pwa/out/term/index.txt +22 -22
  264. package/apps/pwa/out/today/index.html +1 -1
  265. package/apps/pwa/out/today/index.txt +22 -22
  266. package/apps/pwa/out/trace/index.html +1 -1
  267. package/apps/pwa/out/trace/index.txt +22 -22
  268. package/apps/pwa/out/vault/index.html +1 -1
  269. package/apps/pwa/out/vault/index.txt +22 -22
  270. package/apps/pwa/out/workflows/chat-ui/index.html +1 -1
  271. package/apps/pwa/out/workflows/chat-ui/index.txt +22 -22
  272. package/apps/pwa/out/workflows/index.html +1 -1
  273. package/apps/pwa/out/workflows/index.txt +22 -22
  274. package/apps/pwa/out/workspace/index.html +1 -1
  275. package/apps/pwa/out/workspace/index.txt +22 -22
  276. package/apps/pwa/out/worktrees/index.html +1 -1
  277. package/apps/pwa/out/worktrees/index.txt +22 -22
  278. package/graphs/demo/persona-marketer/fixtures/marketer-scenario.yaml +10 -0
  279. package/graphs/demo/persona-marketer/persona-marketer.yaml +25 -0
  280. package/graphs/demo/persona-marketer/recipes.yaml +19 -0
  281. package/graphs/release/recipes.yaml +9 -0
  282. package/graphs/release/release-loop.yaml +26 -18
  283. package/graphs/video/explainer-line.yaml +4 -1
  284. package/package.json +1 -1
  285. package/scripts/ask-op-inbox-once.ts +17 -0
  286. package/scripts/brand/check.ts +13 -4
  287. package/scripts/dead-code/report.ts +169 -0
  288. package/scripts/gate-0226-accepted-remaining-90.txt +91 -0
  289. package/scripts/gate-0226-failure-census.ts +39 -0
  290. package/scripts/intake-collect-telegram-saved-stage.ts +48 -0
  291. package/scripts/lib/morning-report-options.ts +3 -4
  292. package/scripts/lib/tui-regress-evidence.ts +56 -0
  293. package/scripts/morning-report.ts +5 -1
  294. package/scripts/provision-export-redactions.ts +15 -0
  295. package/scripts/public-copy-lint.ts +122 -0
  296. package/scripts/public-export.ts +77 -2
  297. package/scripts/ratchets/next-tui-entry-budget.ts +124 -0
  298. package/scripts/ratchets/train-side-invariants.sh +7 -1
  299. package/scripts/release-loop/cut-branch.ts +61 -12
  300. package/scripts/release-loop/export-check-node.ts +21 -3
  301. package/scripts/release-loop/gate-node.ts +527 -60
  302. package/scripts/release-loop/gate-partial.ts +82 -3
  303. package/scripts/release-loop/gate-prewarm-plan.ts +35 -0
  304. package/scripts/release-loop/gate-radius-live.ts +4 -2
  305. package/scripts/release-loop/gate-shard-dispatch.ts +128 -0
  306. package/scripts/release-loop/gate-shard-receipts.ts +89 -0
  307. package/scripts/release-loop/gate-wall.ts +5 -5
  308. package/scripts/release-loop/preflight.ts +6 -2
  309. package/scripts/release-loop/resume-cap.ts +2 -1
  310. package/scripts/release-loop/resume-release.ts +317 -13
  311. package/scripts/release-loop/resume.ts +61 -5
  312. package/scripts/release-loop/traffic-node.ts +12 -4
  313. package/scripts/release-loop/traffic-transition.ts +53 -13
  314. package/scripts/release-loop/version-node.ts +35 -5
  315. package/scripts/release-story/draft.ts +1 -1
  316. package/scripts/research-bench/README.md +53 -0
  317. package/scripts/research-bench/questions.json +66 -0
  318. package/scripts/research-bench/rubric.md +33 -0
  319. package/scripts/research-bench/run.ts +523 -0
  320. package/scripts/tui-regress.ts +85 -10
  321. package/scripts/ux-sim.ts +1 -1
  322. package/scripts/video-pipeline.ts +2 -2
  323. package/src/acp/core-turn-bridge.ts +14 -1
  324. package/src/agent/autonomous-tools.ts +10 -3
  325. package/src/agent/monad-agent-turn.ts +4 -1
  326. package/src/agent/registry.ts +26 -2
  327. package/src/agent/run-context.ts +1 -1
  328. package/src/agent/shared-app-tools.ts +1 -1
  329. package/src/agent/surface-ux/build.ts +12 -3
  330. package/src/agent/surface-ux/types.ts +1 -1
  331. package/src/agent/task-notification.ts +78 -7
  332. package/src/agent/types.ts +3 -0
  333. package/src/agent-mission/driver.ts +29 -3
  334. package/src/agent-mission/mission-cli.ts +2 -1
  335. package/src/agent-substrate/review-context-pack.ts +365 -0
  336. package/src/agent-substrate/review-observation.ts +10 -0
  337. package/src/agent-substrate/self-review-cli.ts +419 -42
  338. package/src/ask-user-question/index.ts +6 -0
  339. package/src/ask-user-question/inline-resolver.ts +49 -0
  340. package/src/auto-research/question-ladder-contract.ts +156 -0
  341. package/src/auto-research/research-turn.ts +467 -0
  342. package/src/autopilot/agent-loop.ts +1 -1
  343. package/src/autopilot/discovery/doc-lint.ts +1 -1
  344. package/src/autopilot/pty-control-loop.ts +8 -1
  345. package/src/boot/daemon-tools/index.ts +4 -3
  346. package/src/boot/daemon-tools/self-implement.ts +270 -2
  347. package/src/boot/daemon-tools/types.ts +2 -0
  348. package/src/bots/screen-probe.ts +1 -1
  349. package/src/budget/llm-cost.ts +44 -5
  350. package/src/budget/unified-usage.ts +17 -1
  351. package/src/capture/tui-self-report.ts +24 -2
  352. package/src/chat/index.ts +34 -7
  353. package/src/chat/tool-render/dispatch.ts +8 -1
  354. package/src/cli/agent-cli.ts +43 -8
  355. package/src/cli/guardian-cli.ts +3 -1
  356. package/src/cli/intake-cli.ts +70 -13
  357. package/src/cli/lesson-cli.ts +86 -10
  358. package/src/cli/log-event-names.ts +1 -0
  359. package/src/cli/pod-cli.ts +17 -2
  360. package/src/cli/pr-land-overlap-evidence.ts +38 -5
  361. package/src/cli/pr-land-refusal.ts +1 -1
  362. package/src/cli/pty-takeover-cli.ts +125 -12
  363. package/src/cli/release-checklist-read-cli.ts +5 -2
  364. package/src/cli/release-cli.ts +99 -15
  365. package/src/cli/repo-cli.ts +2 -1
  366. package/src/cli/review-carry.ts +77 -0
  367. package/src/cli/self-update.ts +1 -1
  368. package/src/cli/tasks-card-show.ts +31 -1
  369. package/src/cli/tasks-cli.ts +98 -32
  370. package/src/cli/tasks-read-cli.ts +13 -5
  371. package/src/context-bus/context-now.ts +86 -2
  372. package/src/control-plane/ledger.ts +21 -4
  373. package/src/core-turn/run-core-turn.ts +51 -3
  374. package/src/core-turn/run-goal-loop.ts +152 -8
  375. package/src/core-turn/types.ts +12 -0
  376. package/src/dashboard/chat/acp-chat.ts +2 -2
  377. package/src/dashboard/classic-sigquit.ts +16 -0
  378. package/src/dashboard/index.ts +339 -44
  379. package/src/dashboard/input/chat-main-interaction-opts.ts +3 -0
  380. package/src/dashboard/input/chat-main-plain-turn-runtime.ts +7 -2
  381. package/src/dashboard/input/chat-main-slash-command.ts +7 -0
  382. package/src/dashboard/input/dashboard-plain-turn-stream.ts +4 -0
  383. package/src/dashboard/input/dashboard-priority-key-route.ts +21 -5
  384. package/src/dashboard/input/external-input-host.ts +2 -0
  385. package/src/dashboard/input/terminal-modal-router.ts +8 -159
  386. package/src/dashboard/side-basic-runtime.ts +61 -0
  387. package/src/dashboard/sidetab-runtime.ts +228 -0
  388. package/src/dashboard/slash-runtime/ask-clarification.ts +7 -1
  389. package/src/dashboard/slash-runtime/dashboard-handlers.ts +22 -8
  390. package/src/dashboard/slash-runtime/help-from-registry.ts +2 -2
  391. package/src/dashboard/term-slash-runtime.ts +18 -18
  392. package/src/dashboard/turn-preamble.ts +30 -4
  393. package/src/domains/guardian-tick.ts +9 -0
  394. package/src/domains/knowledge.ts +1 -1
  395. package/src/esc-abort-gate.ts +33 -1
  396. package/src/execution-loop/launch-gate.ts +206 -1
  397. package/src/git-fs/watcher.ts +27 -22
  398. package/src/git-fs/worktree.ts +19 -3
  399. package/src/graph-runner/graph-cli.ts +6 -4
  400. package/src/graph-runner/graph-grow.ts +37 -9
  401. package/src/graph-runner/runner.ts +48 -11
  402. package/src/graph-wizard/generate.ts +16 -7
  403. package/src/graph-wizard/mission-compose.ts +201 -0
  404. package/src/grok/agent-search.ts +8 -2
  405. package/src/grok/credential.ts +112 -36
  406. package/src/grounding/ref-index.ts +11 -0
  407. package/src/grounding/ref-vector.ts +61 -0
  408. package/src/grounding/sources-cli.ts +2 -2
  409. package/src/grounding/sources.ts +15 -1
  410. package/src/harness/harness-cli-command.ts +38 -9
  411. package/src/harness/harness-pod-dispatch.ts +7 -1
  412. package/src/hq/fence-wrapper.ts +1 -1
  413. package/src/hq/transfer.ts +1 -1
  414. package/src/index.ts +60 -16
  415. package/src/input/external-input-queue.ts +10 -0
  416. package/src/intake-plane/collect-telegram-saved.ts +90 -6
  417. package/src/intake-plane/intake-to-tasks.ts +246 -3
  418. package/src/interactive-terminal-modal.ts +3 -0
  419. package/src/keybindings.ts +17 -22
  420. package/src/lessons/friction-ledger.ts +154 -0
  421. package/src/live-supply/collector.ts +149 -0
  422. package/src/live-supply/probes.ts +52 -0
  423. package/src/live-supply/snapshot.ts +40 -0
  424. package/src/llm/provider-credentials.ts +1 -1
  425. package/src/llm-tool-schema.ts +20 -0
  426. package/src/llm.ts +486 -61
  427. package/src/loops/orchestrator/inbox-once.ts +28 -0
  428. package/src/loops/orchestrator/inbox.ts +130 -1
  429. package/src/loops/orchestrator/tick.ts +14 -3
  430. package/src/maturity/feature-maturity.ts +1 -0
  431. package/src/nexus/api/channel-ask-op.ts +96 -0
  432. package/src/nexus/api/discord-trigger-bot.ts +28 -1
  433. package/src/nexus/api/harness-api.ts +2 -1
  434. package/src/nexus/api/telegram-trigger-bot.ts +24 -0
  435. package/src/nexus/api/terminals.ts +28 -6
  436. package/src/patents/ledger.ts +18 -1
  437. package/src/preview/terminal.ts +4 -2
  438. package/src/prompt-cache/anthropic.ts +2 -0
  439. package/src/prompt-enhance/enhance.ts +5 -0
  440. package/src/pty/snapshot.py +132 -0
  441. package/src/pty-shell/pty-control-ipc.ts +29 -2
  442. package/src/pty-shell/pty-manifest.ts +75 -5
  443. package/src/pty-shell/registry.ts +2 -0
  444. package/src/pty-shell/tui-run-state.ts +80 -3
  445. package/src/release-loop/gate-host-reservation.ts +13 -4
  446. package/src/release-loop/gate-shard-ledger.ts +68 -0
  447. package/src/release-loop/gate-shards.ts +61 -0
  448. package/src/release-loop/light-rc.ts +7 -4
  449. package/src/release-loop/merged-pr-checklist.ts +25 -2
  450. package/src/release-loop/rehearsal-shard-plan.ts +6 -1
  451. package/src/release-loop/rehearsal.ts +28 -1
  452. package/src/repl/index.ts +10 -0
  453. package/src/research/axis-fanout.ts +133 -0
  454. package/src/research/edge-decision.ts +197 -0
  455. package/src/research/gap-followup.ts +249 -0
  456. package/src/research/lenses/counter-evidence.ts +100 -0
  457. package/src/research/lenses/working-backwards.ts +89 -0
  458. package/src/research/output-router.ts +127 -0
  459. package/src/research/plugin-discovery.ts +242 -0
  460. package/src/research-bridge/format.ts +16 -1
  461. package/src/research-bridge/index.ts +1 -0
  462. package/src/research-bridge/invoke.ts +45 -7
  463. package/src/research-bridge/types.ts +2 -0
  464. package/src/self-dev/ask-launch-flow.ts +34 -106
  465. package/src/self-dev/decompose.ts +45 -9
  466. package/src/self-dev/dev-cli.ts +2 -0
  467. package/src/self-dev/dev-pipeline.ts +8 -4
  468. package/src/self-dev/draft-residue.ts +221 -2
  469. package/src/self-dev/draft-sweep.ts +29 -16
  470. package/src/self-dev/graph-journey-route.ts +10 -2
  471. package/src/self-dev/launch-preflight-text.ts +2 -2
  472. package/src/self-dev/launch-preflight.ts +38 -7
  473. package/src/self-dev/orchestrate-cli.ts +1 -0
  474. package/src/self-dev/orchestrate.ts +1 -0
  475. package/src/self-dev/run-supervisor.ts +41 -7
  476. package/src/self-dev/shard-run.ts +260 -3
  477. package/src/self-implement/comment-only-source.ts +54 -0
  478. package/src/self-implement/device-first.ts +8 -2
  479. package/src/self-implement/doctor-visit.ts +100 -57
  480. package/src/self-implement/gate-artifacts.ts +5 -2
  481. package/src/self-implement/gate-baseline.ts +119 -13
  482. package/src/self-implement/gate-cli.ts +466 -93
  483. package/src/self-implement/gate-failure-signature.ts +44 -0
  484. package/src/self-implement/gate-receipt-registry.ts +180 -0
  485. package/src/self-implement/gate-remote.ts +147 -22
  486. package/src/self-implement/goal-author-clarification.ts +178 -24
  487. package/src/self-implement/goal-author-decompose.ts +24 -15
  488. package/src/self-implement/goal-author.ts +82 -7
  489. package/src/self-implement/goal-doc/section.ts +22 -0
  490. package/src/self-implement/goal-supervisor-fill.ts +38 -4
  491. package/src/self-implement/host-regate.ts +120 -45
  492. package/src/self-implement/impl-findings-feedback.ts +188 -0
  493. package/src/self-implement/knowhow-pack.ts +301 -9
  494. package/src/self-implement/l8-merge-queue.ts +198 -32
  495. package/src/self-implement/off-diff-evidence.ts +147 -0
  496. package/src/self-implement/orchestrator.ts +137 -16
  497. package/src/self-implement/pod-inplace-worktree.ts +82 -0
  498. package/src/self-implement/pod-warm-pool-profile.ts +2 -2
  499. package/src/self-implement/premise-review.ts +7 -5
  500. package/src/self-implement/run-ledger.ts +304 -8
  501. package/src/self-implement/run-stop.ts +12 -0
  502. package/src/self-implement/seams.ts +39 -13
  503. package/src/self-implement/self-implement-cli.ts +30 -4
  504. package/src/session/channel-ask-op-envelope.ts +36 -0
  505. package/src/session/channel-op-reply-route.ts +200 -0
  506. package/src/session/chat.ts +92 -15
  507. package/src/session/index.ts +2 -0
  508. package/src/session-runtime/index.ts +9 -22
  509. package/src/session-runtime/provider-circuit.ts +140 -0
  510. package/src/shell-runner/file-engine.ts +1 -0
  511. package/src/shell-runner/types.ts +4 -0
  512. package/src/sidetab-core/model.ts +176 -0
  513. package/src/skills/runner.ts +7 -3
  514. package/src/skills/tools/dev-harness.ts +2 -2
  515. package/src/skills/tools/schedule-wakeup.ts +24 -7
  516. package/src/skills/tools/shell.ts +51 -5
  517. package/src/status/bar.ts +3 -3
  518. package/src/steward/directive-audit.ts +354 -0
  519. package/src/storage/file-lock.ts +17 -4
  520. package/src/surface/child-process.ts +31 -0
  521. package/src/surface/tui-stderr-owner.ts +48 -0
  522. package/src/task-agent/adopt-pr.ts +63 -2
  523. package/src/task-agent/cover.ts +30 -12
  524. package/src/task-agent/evidence-command-normalize.ts +42 -0
  525. package/src/task-agent/export-redactions-provision.ts +43 -0
  526. package/src/task-agent/judge.ts +56 -0
  527. package/src/task-agent/parent-host.ts +59 -12
  528. package/src/task-agent/postland-card.ts +35 -2
  529. package/src/task-agent/rejudge-on-head.ts +46 -2
  530. package/src/task-agent/repair-cycle.ts +68 -9
  531. package/src/task-agent/repair-worker.ts +37 -1
  532. package/src/task-agent/task-hand.ts +226 -33
  533. package/src/task-agent/tier-split.ts +142 -24
  534. package/src/task-orchestrator/surfaces/pod-command-job.ts +330 -2
  535. package/src/task-orchestrator/surfaces/pod-config-snapshot.ts +123 -0
  536. package/src/task-orchestrator/surfaces/pod-failure-reason.ts +57 -5
  537. package/src/task-orchestrator/surfaces/pod-mirror-seed.ts +11 -8
  538. package/src/task-orchestrator/surfaces/pod-pool.ts +27 -4
  539. package/src/task-orchestrator/surfaces/pod-si-warm-protocol.ts +1 -1
  540. package/src/task-orchestrator/surfaces/pod-source-receive.ts +74 -6
  541. package/src/task-orchestrator/surfaces/pod-warm-worker-pod.ts +2 -1
  542. package/src/task-orchestrator/surfaces/pod-warm-worker-provider.ts +56 -15
  543. package/src/task-orchestrator/surfaces/self-implement-pod.ts +310 -79
  544. package/src/task-orchestrator/surfaces/self-implement.ts +33 -2
  545. package/src/terminal/session-registry.ts +1 -0
  546. package/src/terminal/terminal-modal-router.ts +156 -0
  547. package/src/tool-hints/gate.ts +6 -4
  548. package/src/tool-hints/signals.ts +33 -1
  549. package/src/tool-runtime/skill-exec-runtime.ts +95 -5
  550. package/src/tui/chat/background-job-status.ts +8 -2
  551. package/src/tui/entry.ts +483 -32
  552. package/src/tui/inline-choice.ts +188 -0
  553. package/src/tui/sidetab/attach.ts +304 -0
  554. package/src/tui/sidetab/list.ts +2 -0
  555. package/src/tui/sidetab/nl-tool.ts +136 -0
  556. package/src/tui/slash/resume-command.ts +23 -0
  557. package/src/tui/slash/resume.ts +3 -23
  558. package/src/tui/slash/term-next.ts +2 -1
  559. package/src/tui/slash/term.ts +12 -1
  560. package/src/tui-client/dashboard-session.ts +7 -1
  561. package/src/tui-client/local-chat-turn.ts +29 -8
  562. package/src/user-config.ts +42 -3
  563. package/src/ux-sim/classic-tui-seat-scenarios.ts +1 -7
  564. package/src/ux-sim/fake-land-queue.ts +88 -0
  565. package/src/ux-sim/fake-llm.ts +11 -5
  566. package/src/ux-sim/gate-shard-host-reroute.ts +82 -0
  567. package/src/ux-sim/goal-interim-trace.ts +24 -0
  568. package/src/ux-sim/next-tui-seat-scenarios.ts +61 -14
  569. package/src/ux-sim/task-orchestrator-surfaces-self-implement-pod-device.ts +4 -1
  570. package/src/version/packed-revision.json +1 -1
  571. package/src/video-pipeline/recipes/explainer.ts +54 -2
  572. package/src/web-search/grok.ts +32 -6
  573. package/src/web-search/index.ts +8 -7
  574. package/src/workflow-runtime/node-catalog.ts +53 -4
  575. package/apps/pwa/out/_next/static/chunks/1041-5841aae848fb6403.js +0 -1
  576. package/apps/pwa/out/_next/static/chunks/1087.3177e54f672dc526.js +0 -1
  577. package/apps/pwa/out/_next/static/chunks/1105.efe1e13503ac7a33.js +0 -1
  578. package/apps/pwa/out/_next/static/chunks/1224.2ceca6c180d5130b.js +0 -62
  579. package/apps/pwa/out/_next/static/chunks/1417-1768233ac92f8a5d.js +0 -1
  580. package/apps/pwa/out/_next/static/chunks/1612.81bbc19af06af16c.js +0 -1
  581. package/apps/pwa/out/_next/static/chunks/1766.728d42053070bb2d.js +0 -1
  582. package/apps/pwa/out/_next/static/chunks/1773.d38e945481e04125.js +0 -1
  583. package/apps/pwa/out/_next/static/chunks/1974-c12f9600da3d3c26.js +0 -1
  584. package/apps/pwa/out/_next/static/chunks/1ed5e8af.cf424815c7c0efad.js +0 -1
  585. package/apps/pwa/out/_next/static/chunks/2061.7232dc9dc058417f.js +0 -1
  586. package/apps/pwa/out/_next/static/chunks/210.90b2cbd64926cf34.js +0 -32
  587. package/apps/pwa/out/_next/static/chunks/244-a810d282a20f1783.js +0 -1
  588. package/apps/pwa/out/_next/static/chunks/2479-fe7e188bd9402d14.js +0 -1
  589. package/apps/pwa/out/_next/static/chunks/2514.03b60f266531a015.js +0 -148
  590. package/apps/pwa/out/_next/static/chunks/2526-a657538869888604.js +0 -1
  591. package/apps/pwa/out/_next/static/chunks/2533-6f0341ff075809e9.js +0 -1
  592. package/apps/pwa/out/_next/static/chunks/2676.e7994c695ef0f30d.js +0 -1
  593. package/apps/pwa/out/_next/static/chunks/2734.3ffdf54254fb6f99.js +0 -27
  594. package/apps/pwa/out/_next/static/chunks/2770-23252bf3a37880b9.js +0 -1
  595. package/apps/pwa/out/_next/static/chunks/2969.66b8b545139d1544.js +0 -1
  596. package/apps/pwa/out/_next/static/chunks/3128.a9210d08800ea6a8.js +0 -1
  597. package/apps/pwa/out/_next/static/chunks/3199.6a1a9b0e6cd01dc6.js +0 -1
  598. package/apps/pwa/out/_next/static/chunks/3212.12179fd3eee8cef1.js +0 -1
  599. package/apps/pwa/out/_next/static/chunks/3760-2909ddb9279281cd.js +0 -1
  600. package/apps/pwa/out/_next/static/chunks/3825.1921b5901bf33dce.js +0 -36
  601. package/apps/pwa/out/_next/static/chunks/3994-63eb884ed0547011.js +0 -1
  602. package/apps/pwa/out/_next/static/chunks/4036.d54e55e1ebf5acdc.js +0 -90
  603. package/apps/pwa/out/_next/static/chunks/4115.5b438b99f0ae729f.js +0 -226
  604. package/apps/pwa/out/_next/static/chunks/4269.d8f9f34bb0fc6c43.js +0 -287
  605. package/apps/pwa/out/_next/static/chunks/431-4eed5bd2c5fe1719.js +0 -1
  606. package/apps/pwa/out/_next/static/chunks/4324.c99ba3e83eb1b691.js +0 -1
  607. package/apps/pwa/out/_next/static/chunks/4599-96eff3f2a9c242c1.js +0 -1
  608. package/apps/pwa/out/_next/static/chunks/4825-a9d9d4e9f5892309.js +0 -1
  609. package/apps/pwa/out/_next/static/chunks/4833-7934c592c5569f00.js +0 -1
  610. package/apps/pwa/out/_next/static/chunks/4879-68518f547a207aff.js +0 -1
  611. package/apps/pwa/out/_next/static/chunks/4896.f9b70285363b27b2.js +0 -24
  612. package/apps/pwa/out/_next/static/chunks/4937-28d437999b77c9dd.js +0 -1
  613. package/apps/pwa/out/_next/static/chunks/49aa54ab.80f39398e0ed0f30.js +0 -1
  614. package/apps/pwa/out/_next/static/chunks/5056.482687319b82638e.js +0 -104
  615. package/apps/pwa/out/_next/static/chunks/506.16b83d56a437a9ee.js +0 -1
  616. package/apps/pwa/out/_next/static/chunks/5260-20593b0a25d0afbc.js +0 -1
  617. package/apps/pwa/out/_next/static/chunks/5404.cc4e9fec26fd5925.js +0 -1
  618. package/apps/pwa/out/_next/static/chunks/576.485e83e3f3dec19a.js +0 -1
  619. package/apps/pwa/out/_next/static/chunks/5832-a6be14e663f65726.js +0 -1
  620. package/apps/pwa/out/_next/static/chunks/5854-56648a9fe646b9a0.js +0 -1
  621. package/apps/pwa/out/_next/static/chunks/5925.3b1f8b135710249b.js +0 -93
  622. package/apps/pwa/out/_next/static/chunks/5952.294fc574a8625184.js +0 -1
  623. package/apps/pwa/out/_next/static/chunks/6168.17749aa3905fa073.js +0 -74
  624. package/apps/pwa/out/_next/static/chunks/6416.5d50b8ec9986ca98.js +0 -1
  625. package/apps/pwa/out/_next/static/chunks/6758.e7fbf532953c0783.js +0 -1
  626. package/apps/pwa/out/_next/static/chunks/6795.0cb8a59730d99703.js +0 -149
  627. package/apps/pwa/out/_next/static/chunks/6877-84d47b7e85d0c41e.js +0 -1
  628. package/apps/pwa/out/_next/static/chunks/6971-fb5f9dc0a2cb5d2d.js +0 -1
  629. package/apps/pwa/out/_next/static/chunks/717.522b08685979b814.js +0 -1
  630. package/apps/pwa/out/_next/static/chunks/7191.e41eb8f455c7f089.js +0 -41
  631. package/apps/pwa/out/_next/static/chunks/7233.8e744b7513119409.js +0 -1
  632. package/apps/pwa/out/_next/static/chunks/7238-97c2226f80504bd8.js +0 -1
  633. package/apps/pwa/out/_next/static/chunks/7285.307963afcf7e7660.js +0 -24
  634. package/apps/pwa/out/_next/static/chunks/7299-fbe4b8c47a87614a.js +0 -1
  635. package/apps/pwa/out/_next/static/chunks/7314.df0d95930b0c3f50.js +0 -1
  636. package/apps/pwa/out/_next/static/chunks/7406.c0589fdf2ee66629.js +0 -1
  637. package/apps/pwa/out/_next/static/chunks/752-90e3e7daad3d8e39.js +0 -1
  638. package/apps/pwa/out/_next/static/chunks/7524-bcd3d9928c6842d9.js +0 -1
  639. package/apps/pwa/out/_next/static/chunks/7549.9a4de3bf231cfc52.js +0 -1
  640. package/apps/pwa/out/_next/static/chunks/757-4fbaf50942b8c424.js +0 -1
  641. package/apps/pwa/out/_next/static/chunks/765.76ae970ceb597b5b.js +0 -1
  642. package/apps/pwa/out/_next/static/chunks/7893-e444a1b0809cd1e4.js +0 -1
  643. package/apps/pwa/out/_next/static/chunks/7956-33748cabb3a05562.js +0 -1
  644. package/apps/pwa/out/_next/static/chunks/7c5ed21f-f286708e57cf88f7.js +0 -1
  645. package/apps/pwa/out/_next/static/chunks/8030-aa66b478b53dbfca.js +0 -1
  646. package/apps/pwa/out/_next/static/chunks/8051.c88c07dacbbc5f21.js +0 -8
  647. package/apps/pwa/out/_next/static/chunks/8080-40d781e7704d3671.js +0 -1
  648. package/apps/pwa/out/_next/static/chunks/8149.80e402d4345e8dae.js +0 -77
  649. package/apps/pwa/out/_next/static/chunks/8205.50a5268f4e12ba0b.js +0 -1
  650. package/apps/pwa/out/_next/static/chunks/8231.a128feaa6f8b6079.js +0 -1
  651. package/apps/pwa/out/_next/static/chunks/85.4ddb1dda2ea3ffa2.js +0 -286
  652. package/apps/pwa/out/_next/static/chunks/8537.26517a09e8247beb.js +0 -1
  653. package/apps/pwa/out/_next/static/chunks/8595-e9b7081ab773a61f.js +0 -1
  654. package/apps/pwa/out/_next/static/chunks/8821-30cc65a61a60951f.js +0 -1
  655. package/apps/pwa/out/_next/static/chunks/8905.b3385aadb7b133e6.js +0 -79
  656. package/apps/pwa/out/_next/static/chunks/8983.246bb3a1ac38f50f.js +0 -1
  657. package/apps/pwa/out/_next/static/chunks/9072.18342f5941a1f3ec.js +0 -1
  658. package/apps/pwa/out/_next/static/chunks/9123.9df04866b2d6e00f.js +0 -1
  659. package/apps/pwa/out/_next/static/chunks/9175-7d383df15a82e2be.js +0 -1
  660. package/apps/pwa/out/_next/static/chunks/9181-bf89c07ce5b8f599.js +0 -1
  661. package/apps/pwa/out/_next/static/chunks/920-429bbc4504b45f71.js +0 -1
  662. package/apps/pwa/out/_next/static/chunks/9207.625edf45d656151c.js +0 -1
  663. package/apps/pwa/out/_next/static/chunks/9378.d2575c6ffd6dd756.js +0 -94
  664. package/apps/pwa/out/_next/static/chunks/957.db5b5c4d32a35240.js +0 -1
  665. package/apps/pwa/out/_next/static/chunks/958.53a8dcf4729e6997.js +0 -64
  666. package/apps/pwa/out/_next/static/chunks/9647.8f0cd0898c592a29.js +0 -1
  667. package/apps/pwa/out/_next/static/chunks/9665-26abb02665704c2c.js +0 -1
  668. package/apps/pwa/out/_next/static/chunks/9703.e7d81b6faef1050a.js +0 -1
  669. package/apps/pwa/out/_next/static/chunks/9882-7a9164b3c2dacbe5.js +0 -1
  670. package/apps/pwa/out/_next/static/chunks/9998.b74e033efadecd10.js +0 -1
  671. package/apps/pwa/out/_next/static/chunks/app/_not-found/page-c604fb980a634d88.js +0 -1
  672. package/apps/pwa/out/_next/static/chunks/app/approvals/page-ec2d8a4979ca9075.js +0 -1
  673. package/apps/pwa/out/_next/static/chunks/app/autopilot/page-cb6add08ad3c7660.js +0 -1
  674. package/apps/pwa/out/_next/static/chunks/app/board/page-e2eaa321ec223fe6.js +0 -1
  675. package/apps/pwa/out/_next/static/chunks/app/botlab/page-5b8a09c475b5f844.js +0 -1
  676. package/apps/pwa/out/_next/static/chunks/app/bots/page-91a77daedfbac191.js +0 -1
  677. package/apps/pwa/out/_next/static/chunks/app/ceo/page-f37fc5e974bda39b.js +0 -1
  678. package/apps/pwa/out/_next/static/chunks/app/chat/page-91429a0b78415a94.js +0 -1
  679. package/apps/pwa/out/_next/static/chunks/app/consult/page-b95798b58263b910.js +0 -1
  680. package/apps/pwa/out/_next/static/chunks/app/control/page-763d53e175e17aa1.js +0 -1
  681. package/apps/pwa/out/_next/static/chunks/app/decisions/page-d55023204055b12f.js +0 -1
  682. package/apps/pwa/out/_next/static/chunks/app/design-check/page-89d2140d78abc810.js +0 -1
  683. package/apps/pwa/out/_next/static/chunks/app/editor/page-82dc069abfe27f55.js +0 -1
  684. package/apps/pwa/out/_next/static/chunks/app/exec/page-25d9eee7beb552c0.js +0 -1
  685. package/apps/pwa/out/_next/static/chunks/app/field/page-770b4594c713ee97.js +0 -1
  686. package/apps/pwa/out/_next/static/chunks/app/healthz/route-c604fb980a634d88.js +0 -1
  687. package/apps/pwa/out/_next/static/chunks/app/inside/page-ba8e0dcae4f83985.js +0 -1
  688. package/apps/pwa/out/_next/static/chunks/app/intake/page-5c112c6d7c33656e.js +0 -1
  689. package/apps/pwa/out/_next/static/chunks/app/layout-09788e1aa9a87db6.js +0 -1
  690. package/apps/pwa/out/_next/static/chunks/app/live-run/page-89acd5d68c0bc560.js +0 -1
  691. package/apps/pwa/out/_next/static/chunks/app/loops/page-5c13e2c76371d797.js +0 -1
  692. package/apps/pwa/out/_next/static/chunks/app/market/page-653a9f18642825c6.js +0 -1
  693. package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-fe986fe79b107546.js +0 -1
  694. package/apps/pwa/out/_next/static/chunks/app/not-found-91ea9f5869a40943.js +0 -1
  695. package/apps/pwa/out/_next/static/chunks/app/observatory/page-7824e21b999962e2.js +0 -1
  696. package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-53d00a60cc75a922.js +0 -1
  697. package/apps/pwa/out/_next/static/chunks/app/ops/release/page-88a1edbff62eaf1d.js +0 -1
  698. package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-4e931248b3f9574b.js +0 -1
  699. package/apps/pwa/out/_next/static/chunks/app/outputs/page-443364c9e4a23b31.js +0 -1
  700. package/apps/pwa/out/_next/static/chunks/app/page-b9af2ac1c4737ce8.js +0 -1
  701. package/apps/pwa/out/_next/static/chunks/app/reflection/page-25ab9c614c14129b.js +0 -1
  702. package/apps/pwa/out/_next/static/chunks/app/scheduler/page-dbcdcfac0a395a8a.js +0 -1
  703. package/apps/pwa/out/_next/static/chunks/app/sessions/page-bf1de6645089ec58.js +0 -1
  704. package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-c4201761a5e839c9.js +0 -1
  705. package/apps/pwa/out/_next/static/chunks/app/settings/page-c304f469ea5d70e4.js +0 -1
  706. package/apps/pwa/out/_next/static/chunks/app/setup/done/page-8e5a238cf5e50c9c.js +0 -1
  707. package/apps/pwa/out/_next/static/chunks/app/setup/layout-c604fb980a634d88.js +0 -1
  708. package/apps/pwa/out/_next/static/chunks/app/setup/page-32b526069ee50b3c.js +0 -1
  709. package/apps/pwa/out/_next/static/chunks/app/share/page-fb9e639c107f5f72.js +0 -1
  710. package/apps/pwa/out/_next/static/chunks/app/showroom/page-84220c776608cedc.js +0 -1
  711. package/apps/pwa/out/_next/static/chunks/app/tasks/page-e475618cbfd5ca2b.js +0 -1
  712. package/apps/pwa/out/_next/static/chunks/app/today/page-fccd3020af2f8806.js +0 -1
  713. package/apps/pwa/out/_next/static/chunks/app/trace/page-9c0d7198ff7b5a91.js +0 -1
  714. package/apps/pwa/out/_next/static/chunks/app/vault/page-d54b1ec9b9c6430d.js +0 -1
  715. package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-8c4bef1791d732ca.js +0 -1
  716. package/apps/pwa/out/_next/static/chunks/app/workflows/page-46fcc0b0bbc6fbfe.js +0 -1
  717. package/apps/pwa/out/_next/static/chunks/app/worktrees/page-7dfda00afd172f5b.js +0 -1
  718. package/apps/pwa/out/_next/static/chunks/f21fd540.63ac75328926ed30.js +0 -1
  719. package/apps/pwa/out/_next/static/chunks/framework-77fdcc873519a6cd.js +0 -1
  720. package/apps/pwa/out/_next/static/chunks/main-app-d0d620d2ce235713.js +0 -1
  721. package/apps/pwa/out/_next/static/chunks/main-e0ef79c79337ba90.js +0 -1
  722. package/apps/pwa/out/_next/static/chunks/pages/_app-84b1bc71e3f9ce6a.js +0 -1
  723. package/apps/pwa/out/_next/static/chunks/pages/_error-2acb61f1363128cb.js +0 -1
  724. package/apps/pwa/out/_next/static/chunks/webpack-462ff5727ceb7824.js +0 -1
  725. package/scripts/migrate-monad-to-elanous.ts +0 -195
  726. package/scripts/rebrand-elanous.ts +0 -242
  727. /package/apps/pwa/out/_next/static/{8kITumG9GAZ1LwT9POrAR → HjeK7zONHfR7op1hKXp4k}/_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[] =>
@@ -5078,8 +5140,8 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
5078
5140
  };
5079
5141
 
5080
5142
  // P5 — register the mode-enter actions + default chord bindings so
5081
- // `Ctrl+B s` from input focus enters sync, `Ctrl+B c` enters
5082
- // control, `Ctrl+B g` returns to general. The `allowOverwrite`
5143
+ // `Ctrl+X s` from input focus enters sync, `Ctrl+X c` enters
5144
+ // control, `Ctrl+X g` returns to general. The `allowOverwrite`
5083
5145
  // flag is critical because this closure may re-run on hot-reload
5084
5146
  // scenarios (tests, plugin reinit) — the registry should be idempotent.
5085
5147
  // A2 — forward-declared toast hook. mouseWiring is initialized
@@ -5100,7 +5162,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
5100
5162
  handler: () => {
5101
5163
  enterSessionControlMode(chatModeState);
5102
5164
  void inputCoreSetMode(resolveSessionInputModeFromChatMode({ chatModeState }));
5103
- chatLines.push(C.error('-- CONTROL MODE —') + C.text(' (via ^B c chord)'));
5165
+ chatLines.push(C.error('-- CONTROL MODE —') + C.text(' (via ^X c chord)'));
5104
5166
  chatScrollOffset = -1;
5105
5167
  draw();
5106
5168
  pushModeToast('→ control mode', 'success');
@@ -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;
@@ -7481,7 +7646,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
7481
7646
  // Scratch visibility (Phase S5). When closed, the workingDir
7482
7647
  // layouts drop the scratch cell so the remaining panes expand
7483
7648
  // to fill the reclaimed columns — useful on narrow terminals.
7484
- // Reopen via the ^B ^S chord.
7649
+ // Reopen via the ^X ^S chord.
7485
7650
  let scratchClosed = false;
7486
7651
  const dashboardViewRegistryOptions = () => ({
7487
7652
  extraPanes: pluginHost.activeDashboardPanes().map(p => p.paneId),
@@ -7676,10 +7841,9 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
7676
7841
  );
7677
7842
  };
7678
7843
 
7679
- // Prefix chord (Phase O6). tmux-style Ctrl+B arms the chord; the
7680
- // next key within the timeout window triggers a bound action
7681
- // (Ctrl+W / Ctrl+O for browser focus). HUD segment `chord` shows
7682
- // `[^B]` while armed so the user knows the terminal is waiting.
7844
+ // Prefix chord (Phase O6). Ctrl+X arms the chord; the next key
7845
+ // within the timeout window triggers a bound action. HUD segment
7846
+ // `chord` shows `[^X]` while armed.
7683
7847
  const chord: ChordState = createChord();
7684
7848
  const disarmChordHud = (): void => {
7685
7849
  disarmChord(chord);
@@ -7752,7 +7916,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
7752
7916
  let previewTerminalDims: { cols: number; rows: number } | null = null;
7753
7917
  // Phase T7 — when true, the preview widget swells to the full
7754
7918
  // top-row width, hiding browser / scratch / obsidian / skill
7755
- // siblings. Toggled by `^B e` / `^B ㄷ` (global chord) and by `e`
7919
+ // siblings. Toggled by `^X e` / `^X ㄷ` (pane chord) and by `e`
7756
7920
  // on the focused preview pane (muscle memory). Auto-clears when
7757
7921
  // the terminal session exits.
7758
7922
  let terminalExpanded = false;
@@ -7909,7 +8073,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
7909
8073
  };
7910
8074
 
7911
8075
  /** Shared helper for both the pane-level `t` key AND the global
7912
- * `Ctrl+B t` chord. Idempotent — calling while a session is
8076
+ * `Ctrl+X t` chord. Idempotent — calling while a session is
7913
8077
  * already alive just re-focuses the preview pane. Handles:
7914
8078
  * - view 4 (chat-only) → bounce to view 1 so wd-preview is visible
7915
8079
  * - wiring onUpdate / onExit callbacks with cleanup
@@ -8672,7 +8836,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
8672
8836
  widgetHost.register(planBoardWidget, 'builtin', 'src/widgets/plan-board.ts');
8673
8837
  }
8674
8838
  // NT4 — notification bell modal widget. Registered + spawned here
8675
- // so Ctrl+B b (NT5) can toggle without spawn latency. The bellOpen
8839
+ // so Ctrl+X b (NT5) can toggle without spawn latency. The bellOpen
8676
8840
  // flag + helpers live further down (after notificationStore is
8677
8841
  // created) because refreshBellInto reads from the store.
8678
8842
  widgetHost.register(bellModalWidget, 'builtin', 'src/notification-bell-modal.ts');
@@ -12492,8 +12656,8 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
12492
12656
  }
12493
12657
 
12494
12658
  /** N2 — open the shell-runner rollup popup centered on the viewport.
12495
- * Shared entry point for `/shell rollup` slash + `^B S` chord so
12496
- * keyboard users can access the same UI mouse users get by clicking
12659
+ * Entry point for `/shell rollup` so keyboard users can access the
12660
+ * same UI mouse users get by clicking
12497
12661
  * the 🐚 status-bar pill. Anchored-to-pill placement stays in
12498
12662
  * dashboard-mouse-wiring; this path is explicitly center-placed so
12499
12663
  * it works with status row unknown. */
@@ -12735,6 +12899,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
12735
12899
  const disposeExternalInputHost = registerExternalInputHost(createDashboardExternalInputHost({
12736
12900
  isTurnActive: () => streamingInFlight,
12737
12901
  getTurnStop: () => currentTurnExternalStop,
12902
+ handleInlineChoice: (text) => inlineChoiceBroker.handleInput(text),
12738
12903
  promptCtl,
12739
12904
  pushNotice: (line) => { chatLines.push(C.muted(` ${line}`)); chatScrollOffset = -1; draw(); },
12740
12905
  setQueueNotice: setExternalInputQueueNotice,
@@ -13470,8 +13635,10 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
13470
13635
  try {
13471
13636
  if (req.kind === 'shell') {
13472
13637
  const shellSeat = resolveTuiShellSeat(req.cwd, process.env.COORD_ID);
13638
+ const terminalSessionId = crypto.randomUUID();
13473
13639
  session = sessionRegistry.spawn(
13474
13640
  {
13641
+ id: terminalSessionId,
13475
13642
  title: 'terminal',
13476
13643
  cwd: req.cwd,
13477
13644
  command: req.command,
@@ -13481,7 +13648,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
13481
13648
  registryKind: 'shell',
13482
13649
  registryNickname: `tui-shell:${req.cwd}`,
13483
13650
  registryOrigin: { originRoot: 'elanous-internal', controller: 'tui-shell' },
13484
- registryPurpose: `tui-shell:${shellSeat}`,
13651
+ registryPurpose: `tui-shell:${shellSeat}:session:${currentChatPersonaSessionId()}:terminal:${terminalSessionId}`,
13485
13652
  registrySeat: shellSeat,
13486
13653
  onExit: handleExit,
13487
13654
  onTitleAction: handleTitleAction,
@@ -13577,6 +13744,87 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
13577
13744
  const spawnGlobalTerminalModal = (command?: string): void => {
13578
13745
  openInteractiveTerminalPopup({ kind: 'shell', cwd: workingDir.cwd, command });
13579
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
+ });
13580
13828
 
13581
13829
  // E3 (2026-05-17) — copyLastAssistantTurnToClipboard /
13582
13830
  // copyLastAssistantCodeToClipboard land into the outer-scoped
@@ -14938,7 +15186,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
14938
15186
  chatScrollOffset = -1;
14939
15187
  break;
14940
15188
  // Phase T: spawn an embedded terminal in this pane. Same
14941
- // code path as the `Ctrl+B t` global chord.
15189
+ // code path as the `Ctrl+X t` pane chord.
14942
15190
  case 't': case 'ㅅ':
14943
15191
  openPreviewTerminal();
14944
15192
  break;
@@ -14954,7 +15202,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
14954
15202
  }
14955
15203
 
14956
15204
  // Ctrl+W (no chord armed — chord would have consumed the
14957
- // key earlier) closes the scratch pane. Reopen via the ^B ^S chord.
15205
+ // key earlier) closes the scratch pane. Reopen via the ^X ^S chord.
14958
15206
  if (key.ctrl && (key.name === 'w' || key.name === 'ㅈ')) {
14959
15207
  scratchClosed = true;
14960
15208
  userClosedPanes.add('scratch');
@@ -15146,20 +15394,21 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
15146
15394
  const contextUserText = ctx?.userText;
15147
15395
  const turnRefUserText = acpTurnRef.userText;
15148
15396
  const hasParentTurnAbortSignal = acpTurnRef.abortCtrl?.signal !== undefined;
15397
+ const turnSignal = acpTurnRef.abortCtrl?.signal ?? new AbortController().signal;
15149
15398
  observeDashboardToolDispatchSignal({
15150
15399
  toolName: name,
15151
15400
  turnIndex: ctx?.turnIndex ?? null,
15152
15401
  signalSource: hasParentTurnAbortSignal ? 'parent-turn' : 'fallback',
15153
15402
  hasParentTurnAbortSignal,
15154
- signalAlreadyAborted: (acpTurnRef.abortCtrl?.signal ?? new AbortController().signal).aborted,
15403
+ signalAlreadyAborted: turnSignal.aborted,
15155
15404
  });
15156
- const result = await dispatchDashboardSessionRuntimeTool(name, args, {
15405
+ const dispatchPromise = dispatchDashboardSessionRuntimeTool(name, args, {
15157
15406
  contextUserText,
15158
15407
  turnRefUserText,
15159
15408
  muted: C.muted,
15160
15409
  pushChatLine,
15161
15410
  draw,
15162
- signal: acpTurnRef.abortCtrl?.signal ?? new AbortController().signal,
15411
+ signal: turnSignal,
15163
15412
  toolCallId: ctx?.callId,
15164
15413
  // ⛔⭐ 폴백은 `''` 가 아니라 `undefined` 다 — 「안 넘김」과 「말했는데 어휘가 없음」은 «다른 값»이다.
15165
15414
  // harnessMentionState(session-runtime 소비처)는 `undefined → 'absent'` · `'' → 'not-matched'` 로
@@ -15186,7 +15435,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
15186
15435
  runtime.dispatchToolByName(toolName, input, {
15187
15436
  surface: 'tui',
15188
15437
  toolCallId,
15189
- signal: acpTurnRef.abortCtrl?.signal,
15438
+ signal: hasParentTurnAbortSignal ? turnSignal : undefined,
15190
15439
  // ⭐ Agent-family context. Without these two the sub-agent runs
15191
15440
  // text-only (see getTools above). `agentDispatchTool` routes the
15192
15441
  // child's calls back through THIS dispatcher so the child gets the
@@ -15205,6 +15454,10 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
15205
15454
  dispatchPluginTool: (toolName, input) =>
15206
15455
  pluginHost.dispatchTool(toolName, input),
15207
15456
  });
15457
+ if (ctx?.callId && (name === 'Bash' || name === 'RunShell')) {
15458
+ escDelegatedShellResultsByCallId.set(ctx.callId, dispatchPromise);
15459
+ }
15460
+ const result = await dispatchPromise;
15208
15461
  // Mirror the direct-path truncation wrapper at
15209
15462
  // dashboard/index.ts L19917-19932 so large tool outputs
15210
15463
  // land in the preview store + the LLM sees the short
@@ -15654,6 +15907,12 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
15654
15907
 
15655
15908
  const priorityRoute = await routeDashboardPriorityKey(key, {
15656
15909
  inputOwner: chatMainVisibility.inputOwnership?.owner,
15910
+ routeClassicSigquitChord: (routeKey) => {
15911
+ if (classicSidetabRuntime.routeKey(routeKey)) return true;
15912
+ if (!isClassicSigquitChord(routeKey)) return false;
15913
+ showClassicSigquitGuidance();
15914
+ return true;
15915
+ },
15657
15916
  routeBellKey: async (routeKey) => {
15658
15917
  if (!bellOpen || routeKey.mouse) return false;
15659
15918
  const inst = widgetHost.get('wd-notification-bell');
@@ -15700,6 +15959,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
15700
15959
  draw();
15701
15960
  return true;
15702
15961
  },
15962
+ routeSidetabKey: (routeKey) => classicSidetabRuntime.routeKey(routeKey),
15703
15963
  dispatchPreKey: (routeKey, targetHandlerName) => {
15704
15964
  const questionViewHandler = {
15705
15965
  name: 'question-view',
@@ -15788,13 +16048,9 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
15788
16048
  return true;
15789
16049
  },
15790
16050
  // Step 0 force-quit — fires from anywhere (bell modal, popup
15791
- // terminal, drag, dashboard). Escape-hatch aliases:
15792
- // - Ctrl+Shift+Q
15793
- // - Ctrl+\
15794
- // The second alias is for terminal/VW-heavy contexts where
15795
- // Shift-modified control chords may get normalized away by the
15796
- // terminal emulator. Plain Ctrl+Q is still *not* the true
15797
- // force-quit because terminal-resident apps use it.
16051
+ // terminal, drag, dashboard). Ctrl+Shift+Q is the escape chord;
16052
+ // Ctrl+\ is reserved for classic side-tab guidance. Plain Ctrl+Q
16053
+ // remains available to terminal-resident apps.
15798
16054
  // Korean shifted ㅃ (Shift+ㅂ on 2-bul) accepts ctrl-only
15799
16055
  // because the shift bit may be implicit in the codepoint.
15800
16056
  isForceQuitChord: (routeKey) => {
@@ -15811,7 +16067,6 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
15811
16067
  });
15812
16068
  }
15813
16069
  if (!routeKey.ctrl) return false;
15814
- if (routeKey.name === '\\' || routeKey.name === 'backslash') return true;
15815
16070
  if (routeKey.shift && (routeKey.name === 'q' || routeKey.name === 'Q' || routeKey.name === 'ㅂ')) return true;
15816
16071
  if (routeKey.name === 'ㅃ') return true;
15817
16072
  return false;
@@ -16233,7 +16488,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
16233
16488
  terminalExpanded = !terminalExpanded;
16234
16489
  previewTerminalDims = null;
16235
16490
  chatLines.push(C.muted(terminalExpanded
16236
- ? 'Terminal expanded. Ctrl+Shift+E or ^B e to restore.'
16491
+ ? 'Terminal expanded. Ctrl+Shift+E to restore.'
16237
16492
  : 'Terminal collapsed to preview slot.'));
16238
16493
  chatScrollOffset = -1;
16239
16494
  },
@@ -16572,6 +16827,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
16572
16827
  chatMainInputVisibilityState().inputOwnership?.owner === 'chat-main',
16573
16828
  onPasteImage: attachClipboardImage,
16574
16829
  routeVoiceKey: async (routeKey) => {
16830
+ if (classicSidetabRuntime.routeKey(routeKey)) return 'consumed';
16575
16831
  // 2026-04-30 — voice-chat ESC: when the controller is
16576
16832
  // active and the user hits ESC inside chat-main, take
16577
16833
  // it as a "exit voice mode" gesture and DO NOT let
@@ -16824,6 +17080,12 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
16824
17080
  const outcome = await inputCoreRouteInputEventAsync(ev, ctx);
16825
17081
  return outcome === 'consumed' ? 'consumed' : 'passthrough';
16826
17082
  },
17083
+ routeQuitChord: (key) => {
17084
+ if (classicSidetabRuntime.routeKey(key)) return 'consumed';
17085
+ if (!isClassicSigquitChord(key)) return 'passthrough';
17086
+ showClassicSigquitGuidance();
17087
+ return 'consumed';
17088
+ },
16827
17089
  shouldRouteInputDispatcherKey: (key) => {
16828
17090
  const topModalId = display.modalStack().at(-1) ?? null;
16829
17091
  const topModal = topModalId ? display.surface(topModalId) : null;
@@ -17248,9 +17510,11 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
17248
17510
  // { return: DashboardAction }.
17249
17511
  const dashboardSlashSurfaceUx = resolveDashboardSlashSurfaceUx();
17250
17512
  const clarificationSurfaceUx = dashboardSlashSurfaceUx ? {
17251
- question: (request: Parameters<typeof dashboardSlashSurfaceUx.question>[0]) => {
17252
- const pending = dashboardSlashSurfaceUx.question(request);
17253
- if ((request as typeof request & { [DASHBOARD_CLARIFICATION_REQUEST]?: boolean })[DASHBOARD_CLARIFICATION_REQUEST]) {
17513
+ question: (request: Parameters<typeof dashboardSlashSurfaceUx.question>[0], options?: Parameters<typeof dashboardSlashSurfaceUx.question>[1]) => {
17514
+ const clarification = (request as typeof request & { [DASHBOARD_CLARIFICATION_REQUEST]?: boolean })[DASHBOARD_CLARIFICATION_REQUEST] === true;
17515
+ if (clarification && resolveTuiUnattended(getUserConfig())) return resolveInlineAskUserQuestion(request);
17516
+ const pending = dashboardSlashSurfaceUx.question(request, options);
17517
+ if (clarification) {
17254
17518
  const handle = approvalModalRouter.current();
17255
17519
  if (approvalModalRouter.currentKind() === 'askUser' && handle) {
17256
17520
  clarificationModalId = handle.surface.id;
@@ -17602,6 +17866,8 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
17602
17866
  pushModalSurface: (surface: import('../display/modal-stack.js').ModalSurface) => display.pushModal(surface),
17603
17867
  redraw: draw,
17604
17868
  onStatus: (line: string) => {
17869
+ // 상태 줄 = 진전 신호(SURVIVAL-PROGRESS-CLOCK) — 마지막 진전 시각을 올린다.
17870
+ reportTuiProgress();
17605
17871
  chatLines.push(C.muted(` ${line}`));
17606
17872
  chatScrollOffset = -1;
17607
17873
  },
@@ -17946,10 +18212,16 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
17946
18212
  schedulerRef: dashboardLoopSchedulerRef,
17947
18213
  },
17948
18214
  };
17949
- const slashOutcome = await dashboardSlashRegistry.dispatch(cmdLower, args, slashCtx);
17950
- if (cmdLower === 'mission') {
17951
- debug.log('tui.legacy-slash-use', 'mission', { surface: 'classic', tuiSession: null });
18215
+ const slashCommand = SLASH_COMMANDS.find((entry) => entry.name === cmdLower || entry.aliases?.includes(cmdLower));
18216
+ if (slashCommand) {
18217
+ debug.log('tui.slash-use', 'dispatch', {
18218
+ command: slashCommand.name,
18219
+ alias: cmdLower === slashCommand.name ? null : cmdLower,
18220
+ surface: 'classic',
18221
+ runId: slashUsageRunId,
18222
+ });
17952
18223
  }
18224
+ const slashOutcome = await dashboardSlashRegistry.dispatch(cmdLower, args, slashCtx);
17953
18225
  if (debug.enabled) {
17954
18226
  debug.log('dashboard.slash.dispatch', cmdLower, {
17955
18227
  argsCount: args.length,
@@ -17962,6 +18234,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
17962
18234
  if (slashOutcome.kind === 'return') return slashOutcome.value;
17963
18235
  if (slashOutcome.kind === 'continue') {
17964
18236
  if (exitInputLoop) break;
18237
+ draw();
17965
18238
  continue;
17966
18239
  }
17967
18240
  switch (cmdLower) {
@@ -18770,7 +19043,11 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
18770
19043
  createTurnStreamRuntime: (initialAssistantStart) => {
18771
19044
  latestTurnUsage = undefined;
18772
19045
  createDashboardTurnStreamRuntimeEscBoundary(escAbortToolState);
19046
+ delegatedTerminationPending = false;
19047
+ delegatedTerminationFailed = false;
18773
19048
  escHarnessSpacesByCallId.clear();
19049
+ escDelegatedPtyIdsByCallId.clear();
19050
+ escDelegatedShellResultsByCallId.clear();
18774
19051
  liveTypeaheadEchoes.length = 0;
18775
19052
  const toolRendering = {
18776
19053
  ...getUserConfig().chat.rendering.tool,
@@ -18813,19 +19090,31 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
18813
19090
  return {
18814
19091
  ...turnStreamRuntime,
18815
19092
  onText: (chunk, accumulated) => {
19093
+ // 스트림 텍스트 = 진전 신호(SURVIVAL-PROGRESS-CLOCK) — 마지막 진전 시각을 올린다.
19094
+ reportTuiProgress();
18816
19095
  turnStreamRuntime.onText(chunk, accumulated);
18817
19096
  restoreLiveTypeaheadEchoes();
18818
19097
  draw();
18819
19098
  },
18820
19099
  onToolCall: (call) => {
18821
19100
  const toolCall = call as DashboardTurnStreamCall;
19101
+ // 도구 시작 = 진전 신호 — 녹음기가 없으면(reportTuiProgress 계약) 아무 일도 안 한다.
19102
+ reportTuiProgress();
18822
19103
  trackEscAbortToolCall(escAbortToolState, toolCall);
19104
+ if ((toolCall.name === 'PtyShellPoll' || toolCall.name === 'PtyShellSnapshot' || toolCall.name === 'PtyShellSend')
19105
+ && typeof toolCall.args.process_id === 'string') {
19106
+ escDelegatedPtyIdsByCallId.set(toolCall.id, toolCall.args.process_id);
19107
+ }
18823
19108
  turnStreamRuntime.onToolCall(toolCall);
18824
19109
  },
18825
19110
  onToolResult: (call) => {
18826
19111
  const toolCall = call as DashboardTurnStreamCall;
19112
+ // 도구 끝 = 진전 신호 — 마지막 진전 시각을 올린다.
19113
+ reportTuiProgress();
18827
19114
  turnStreamRuntime.onToolResult(toolCall);
18828
19115
  settleEscAbortToolCall(escAbortToolState, toolCall);
19116
+ escDelegatedPtyIdsByCallId.delete(toolCall.id);
19117
+ escDelegatedShellResultsByCallId.delete(toolCall.id);
18829
19118
  escHarnessSpacesByCallId.delete(toolCall.id);
18830
19119
  },
18831
19120
  onThought: (text) => {
@@ -18967,7 +19256,13 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
18967
19256
  chatLines.push(C.warning(notice));
18968
19257
  detailViewerRuntime.stage('turn error', raw.split(/\r?\n/));
18969
19258
  },
18970
- finalizeTurn: (finalStatus, finalError) => {
19259
+ finalizeTurn: async (finalStatus, finalError) => {
19260
+ if (escDelegatedTermination) {
19261
+ const terminated = await escDelegatedTermination;
19262
+ finalStatus = terminated ? 'interrupted' : 'failed';
19263
+ if (!terminated) finalError = 'delegated PTY termination failed';
19264
+ escDelegatedTermination = null;
19265
+ }
18971
19266
  lastTurnFinalStatus = finalStatus;
18972
19267
  clearEscAbortToolState(escAbortToolState);
18973
19268
  finalizeDashboardTurn({