elanous 0.2.28 → 0.2.29

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 (609) 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/{y1ltt7oCZxVpC6zVPhZ2O → cIpv5nU9AycwYWZI9H589}/_buildManifest.js +1 -1
  4. package/apps/pwa/out/_next/static/chunks/{ab4d57c2.e90bc2cb31949045.js → 058a98ba.7eb28d5e6dc03565.js} +1 -1
  5. package/apps/pwa/out/_next/static/chunks/{4565-67e4c620597965c8.js → 1015-9cba22a5a4554797.js} +1 -1
  6. package/apps/pwa/out/_next/static/chunks/1084-4e66af7376a18db7.js +1 -0
  7. package/apps/pwa/out/_next/static/chunks/1106.3a6410b7b0c70ad4.js +1 -0
  8. package/apps/pwa/out/_next/static/chunks/1127.32fc642f70423506.js +8 -0
  9. package/apps/pwa/out/_next/static/chunks/{1516.83dd2c1b86b4e507.js → 1142.65d002789ab3af7d.js} +2 -2
  10. package/apps/pwa/out/_next/static/chunks/1189-d9b8e1995a831fae.js +1 -0
  11. package/apps/pwa/out/_next/static/chunks/1224.6da98c7ad0eb7dd8.js +34 -0
  12. package/apps/pwa/out/_next/static/chunks/1370.4e3e2558f111fd5d.js +1 -0
  13. package/apps/pwa/out/_next/static/chunks/1514-b7da377fdc4eb17a.js +1 -0
  14. package/apps/pwa/out/_next/static/chunks/1516.dfaceff3fd2d0e0d.js +1 -0
  15. package/apps/pwa/out/_next/static/chunks/1577.3c24c32584e10d70.js +286 -0
  16. package/apps/pwa/out/_next/static/chunks/161.130a569855c4d68c.js +24 -0
  17. package/apps/pwa/out/_next/static/chunks/1782-59db1b5aa06df38a.js +1 -0
  18. package/apps/pwa/out/_next/static/chunks/{1743.563d3168e95825ef.js → 1852.7f7b53991fcb99ef.js} +2 -2
  19. package/apps/pwa/out/_next/static/chunks/1864.16da9556e78a9236.js +1 -0
  20. package/apps/pwa/out/_next/static/chunks/1b6f6b2a.aff090122be3726e.js +1 -0
  21. package/apps/pwa/out/_next/static/chunks/2341.e8a9135e5b910dd5.js +36 -0
  22. package/apps/pwa/out/_next/static/chunks/257.10afdbe3520f2fc2.js +1 -0
  23. package/apps/pwa/out/_next/static/chunks/2658.87550e692dc493f6.js +64 -0
  24. package/apps/pwa/out/_next/static/chunks/2673.85e2f02efae7a85f.js +1 -0
  25. package/apps/pwa/out/_next/static/chunks/2766-bee623b37472ed63.js +1 -0
  26. package/apps/pwa/out/_next/static/chunks/2794.6d836872b0bf43e2.js +1 -0
  27. package/apps/pwa/out/_next/static/chunks/2806.eb57ced1a528ed39.js +1 -0
  28. package/apps/pwa/out/_next/static/chunks/283.7a121c4910e6dad7.js +1 -0
  29. package/apps/pwa/out/_next/static/chunks/{65ebff95.081daeff622d238e.js → 285adb1a.5654e605dddf86d2.js} +1 -1
  30. package/apps/pwa/out/_next/static/chunks/2870.1dc29aa5fc01f09f.js +115 -0
  31. package/apps/pwa/out/_next/static/chunks/293.fd38e77ce5d48103.js +1 -0
  32. package/apps/pwa/out/_next/static/chunks/2993-5952a1cd3fd5d441.js +1 -0
  33. package/apps/pwa/out/_next/static/chunks/3160-95c96f4d2a21dd26.js +1 -0
  34. package/apps/pwa/out/_next/static/chunks/32-a523427c5bd5ed00.js +1 -0
  35. package/apps/pwa/out/_next/static/chunks/3280.af38002a6424a905.js +90 -0
  36. package/apps/pwa/out/_next/static/chunks/328bb3ab-6628a1114fe3fb3b.js +1 -0
  37. package/apps/pwa/out/_next/static/chunks/3292-5ddffdb2f517b44f.js +1 -0
  38. package/apps/pwa/out/_next/static/chunks/{9917-9e26abc5f7772735.js → 3396-97b97928c49190c9.js} +1 -1
  39. package/apps/pwa/out/_next/static/chunks/{6196.34d6b229079e9e28.js → 3403.7199205e65124486.js} +1 -1
  40. package/apps/pwa/out/_next/static/chunks/3523.d3231daaf7aba993.js +1 -0
  41. package/apps/pwa/out/_next/static/chunks/3763.577de3181e1e6ea0.js +1 -0
  42. package/apps/pwa/out/_next/static/chunks/4138-cc56b0938ef72783.js +1 -0
  43. package/apps/pwa/out/_next/static/chunks/419.736c0d6f426249a7.js +1 -0
  44. package/apps/pwa/out/_next/static/chunks/4255-8350c43d307a8875.js +1 -0
  45. package/apps/pwa/out/_next/static/chunks/{6def8a8e.c81f9ca41028eccf.js → 425cfc4d.fb91158e3971c39f.js} +1 -1
  46. package/apps/pwa/out/_next/static/chunks/4352.a4954693499c2714.js +1 -0
  47. package/apps/pwa/out/_next/static/chunks/4421-f2dcbc6fd80ec013.js +1 -0
  48. package/apps/pwa/out/_next/static/chunks/4513-51b94aeee37c9905.js +1 -0
  49. package/apps/pwa/out/_next/static/chunks/{16e57f67.3ea19e893461e611.js → 46bd8bea.2f4b4099172fcdb7.js} +1 -1
  50. package/apps/pwa/out/_next/static/chunks/{5081.a240b63fad28663a.js → 4759.1f76713aefb87db5.js} +1 -1
  51. package/apps/pwa/out/_next/static/chunks/4928-c3b72f99aa588699.js +1 -0
  52. package/apps/pwa/out/_next/static/chunks/4986-f9fc0283fb325219.js +1 -0
  53. package/apps/pwa/out/_next/static/chunks/5014.671a7b9f69c2b7b1.js +94 -0
  54. package/apps/pwa/out/_next/static/chunks/5137.d398e24710b3feb6.js +1 -0
  55. package/apps/pwa/out/_next/static/chunks/5298.0bea74885cabe754.js +1 -0
  56. package/apps/pwa/out/_next/static/chunks/5315.74c53a39739b11c4.js +1 -0
  57. package/apps/pwa/out/_next/static/chunks/5317-8b1df8d02105cd07.js +1 -0
  58. package/apps/pwa/out/_next/static/chunks/5358-33051f41a2b239af.js +1 -0
  59. package/apps/pwa/out/_next/static/chunks/5388.a2ec02501f714ad5.js +62 -0
  60. package/apps/pwa/out/_next/static/chunks/5395.e6ac948a2d15058d.js +1 -0
  61. package/apps/pwa/out/_next/static/chunks/5409-f282bf533c151849.js +1 -0
  62. package/apps/pwa/out/_next/static/chunks/5466.d0f4aba9d52acfa8.js +27 -0
  63. package/apps/pwa/out/_next/static/chunks/5564.3d28b353470fe305.js +104 -0
  64. package/apps/pwa/out/_next/static/chunks/{9974.e77b4ff4884557b3.js → 5591.a35e7a217734a8b9.js} +2 -2
  65. package/apps/pwa/out/_next/static/chunks/569.b0cbfb4dee4a167a.js +93 -0
  66. package/apps/pwa/out/_next/static/chunks/5835-72465b73a8bb8d74.js +1 -0
  67. package/apps/pwa/out/_next/static/chunks/5941.045d6093139e1f7a.js +1 -0
  68. package/apps/pwa/out/_next/static/chunks/{5492-e05e26a033ba80d2.js → 6013-2f769370d8b4c2c6.js} +3 -3
  69. package/apps/pwa/out/_next/static/chunks/6228.47cabb83564dfe54.js +24 -0
  70. package/apps/pwa/out/_next/static/chunks/6457-8d1993002a87d0fe.js +1 -0
  71. package/apps/pwa/out/_next/static/chunks/6513.ef54cfae52351982.js +2 -0
  72. package/apps/pwa/out/_next/static/chunks/{5408.377c8c543635b81f.js → 6534.1ab00f370db7b105.js} +1 -1
  73. package/apps/pwa/out/_next/static/chunks/6582.13d245bf87df69f1.js +148 -0
  74. package/apps/pwa/out/_next/static/chunks/6655.c33f6acc2c61bb89.js +149 -0
  75. package/apps/pwa/out/_next/static/chunks/6731-9d7195af289c8d4c.js +1 -0
  76. package/apps/pwa/out/_next/static/chunks/6733.0be05b1db9279fc5.js +79 -0
  77. package/apps/pwa/out/_next/static/chunks/6742-90937146253a8b9e.js +1 -0
  78. package/apps/pwa/out/_next/static/chunks/{8578.dff22d988cc2b106.js → 6767.1fcfc9b8be83975f.js} +16 -16
  79. package/apps/pwa/out/_next/static/chunks/6776.06ff1e3b464cc607.js +1 -0
  80. package/apps/pwa/out/_next/static/chunks/{9311.24c8f5ea793253dd.js → 6853.cc5174a9dee59593.js} +1 -1
  81. package/apps/pwa/out/_next/static/chunks/687-816858f77a396a4e.js +1 -0
  82. package/apps/pwa/out/_next/static/chunks/6888.72c7b8cfb02a7e61.js +1 -0
  83. package/apps/pwa/out/_next/static/chunks/6993.c17c828ac3ef3253.js +1 -0
  84. package/apps/pwa/out/_next/static/chunks/7076.9f27ef666b0cefdd.js +1 -0
  85. package/apps/pwa/out/_next/static/chunks/7113.1403c5d451804e8c.js +287 -0
  86. package/apps/pwa/out/_next/static/chunks/7169.9dd603c726c2cd7c.js +1 -0
  87. package/apps/pwa/out/_next/static/chunks/7247-e3ec21f761f86710.js +1 -0
  88. package/apps/pwa/out/_next/static/chunks/7261-a47b72f96f5199df.js +1 -0
  89. package/apps/pwa/out/_next/static/chunks/7335-5cda81ac90310077.js +1 -0
  90. package/apps/pwa/out/_next/static/chunks/7356-c2e4af090546e2d4.js +1 -0
  91. package/apps/pwa/out/_next/static/chunks/{94.4cfed21c0b781a06.js → 7375.050ea0d72968e49f.js} +16 -16
  92. package/apps/pwa/out/_next/static/chunks/738-59518742078fda71.js +1 -0
  93. package/apps/pwa/out/_next/static/chunks/7385.a7375f10db73243a.js +77 -0
  94. package/apps/pwa/out/_next/static/chunks/7445.cf1cf2fe109bcd96.js +1 -0
  95. package/apps/pwa/out/_next/static/chunks/7505.a2057432ab6ef99a.js +1 -0
  96. package/apps/pwa/out/_next/static/chunks/7515.31f45fac1f9c70cb.js +74 -0
  97. package/apps/pwa/out/_next/static/chunks/7658-d4ce8c72a9548a91.js +1 -0
  98. package/apps/pwa/out/_next/static/chunks/7725-4f83d5541fbdb81b.js +1 -0
  99. package/apps/pwa/out/_next/static/chunks/8107-0b1ae46bc5bcb788.js +1 -0
  100. package/apps/pwa/out/_next/static/chunks/8132.bfea2f016ce8d992.js +1 -0
  101. package/apps/pwa/out/_next/static/chunks/8332.6f0f49df772e163b.js +23 -0
  102. package/apps/pwa/out/_next/static/chunks/{7483.ba01c6c209b81bba.js → 8398.73a19b39715eda04.js} +1 -1
  103. package/apps/pwa/out/_next/static/chunks/{2846.d6a433b8663819a5.js → 8471.8d2a8c74f09c36ff.js} +3 -3
  104. package/apps/pwa/out/_next/static/chunks/8672.e299832bc7d18ee2.js +1 -0
  105. package/apps/pwa/out/_next/static/chunks/8735.f1ef798a5f260f6f.js +226 -0
  106. package/apps/pwa/out/_next/static/chunks/{5785-ea8d2c633b6688e3.js → 8767-2f6a634f5abeaa01.js} +1 -1
  107. package/apps/pwa/out/_next/static/chunks/8774-88f67f7d8d53d299.js +1 -0
  108. package/apps/pwa/out/_next/static/chunks/8782.252e5a405d86e4ed.js +32 -0
  109. package/apps/pwa/out/_next/static/chunks/8795.32573a185af18c7b.js +41 -0
  110. package/apps/pwa/out/_next/static/chunks/909-9ed7aa0dba804316.js +1 -0
  111. package/apps/pwa/out/_next/static/chunks/9100.22b0301256827007.js +1 -0
  112. package/apps/pwa/out/_next/static/chunks/9140-dde77575570bc71e.js +1 -0
  113. package/apps/pwa/out/_next/static/chunks/{4593.10f5b9bd702d4a6c.js → 9143.ff14585db1d275ff.js} +1 -1
  114. package/apps/pwa/out/_next/static/chunks/9292-a7ad9a01c7044b93.js +1 -0
  115. package/apps/pwa/out/_next/static/chunks/9517.00627dc51b02821c.js +1 -0
  116. package/apps/pwa/out/_next/static/chunks/9725.dcbb585652d8e9c5.js +1 -0
  117. package/apps/pwa/out/_next/static/chunks/9761.a3ebf5c389c24ddc.js +1 -0
  118. package/apps/pwa/out/_next/static/chunks/{4204.a409ab6250c0f6a8.js → 9907.49be0fcadaf214b5.js} +1 -1
  119. package/apps/pwa/out/_next/static/chunks/9972.834d2b2b7d48f1ed.js +1 -0
  120. package/apps/pwa/out/_next/static/chunks/9995-1a90486f5ae01546.js +1 -0
  121. package/apps/pwa/out/_next/static/chunks/{973cbf1b.3bbcf2b41548eca7.js → a435ad95.577add051b4facb2.js} +1 -1
  122. package/apps/pwa/out/_next/static/chunks/app/_not-found/page-83372d8b5863ebf7.js +1 -0
  123. package/apps/pwa/out/_next/static/chunks/app/approvals/page-d69256d7613c140a.js +1 -0
  124. package/apps/pwa/out/_next/static/chunks/app/autopilot/page-352c5e9ba3f9b858.js +1 -0
  125. package/apps/pwa/out/_next/static/chunks/app/board/page-69f1d725524201a8.js +1 -0
  126. package/apps/pwa/out/_next/static/chunks/app/botlab/{page-fa46d4588e8442c2.js → page-a5635eba0d73b84e.js} +1 -1
  127. package/apps/pwa/out/_next/static/chunks/app/bots/page-ad9181d84285e4ea.js +1 -0
  128. package/apps/pwa/out/_next/static/chunks/app/ceo/{page-66ad46ed0279feb9.js → page-86feb08080261a2f.js} +1 -1
  129. package/apps/pwa/out/_next/static/chunks/app/chat/page-ffa15987e4756d03.js +1 -0
  130. package/apps/pwa/out/_next/static/chunks/app/consult/page-11a3ab44ac327cc1.js +1 -0
  131. package/apps/pwa/out/_next/static/chunks/app/control/page-6309b11c4264d24d.js +1 -0
  132. package/apps/pwa/out/_next/static/chunks/app/decisions/page-8800472079612e87.js +1 -0
  133. package/apps/pwa/out/_next/static/chunks/app/design-check/page-d387bf3f2301882a.js +1 -0
  134. package/apps/pwa/out/_next/static/chunks/app/editor/page-048f88d8c8658da6.js +1 -0
  135. package/apps/pwa/out/_next/static/chunks/app/exec/page-6c14f9739b7f6880.js +1 -0
  136. package/apps/pwa/out/_next/static/chunks/app/field/page-2834f44f64e98d74.js +1 -0
  137. package/apps/pwa/out/_next/static/chunks/app/healthz/route-83372d8b5863ebf7.js +1 -0
  138. package/apps/pwa/out/_next/static/chunks/app/inside/page-a13df6f88e824887.js +1 -0
  139. package/apps/pwa/out/_next/static/chunks/app/intake/page-8a4397248754cf2b.js +1 -0
  140. package/apps/pwa/out/_next/static/chunks/app/layout-daf0bd329360a336.js +1 -0
  141. package/apps/pwa/out/_next/static/chunks/app/live/page-f7ef1c28764cb476.js +1 -0
  142. package/apps/pwa/out/_next/static/chunks/app/live-run/page-61e74f28b9353dac.js +1 -0
  143. package/apps/pwa/out/_next/static/chunks/app/loops/{page-646b50f63b6fe732.js → page-8aaa6dedc4c10dfb.js} +1 -1
  144. package/apps/pwa/out/_next/static/chunks/app/market/page-294602ba649be829.js +1 -0
  145. package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-5fa5f41ed3fce323.js +1 -0
  146. package/apps/pwa/out/_next/static/chunks/app/morning/{page-6f131b51193a36f9.js → page-33bf667a5fb297bf.js} +1 -1
  147. package/apps/pwa/out/_next/static/chunks/app/not-found-5ae3cbd6e5dba515.js +1 -0
  148. package/apps/pwa/out/_next/static/chunks/app/observatory/page-eb867d16ad6fdede.js +1 -0
  149. package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-1ab789fa68682f7e.js +1 -0
  150. package/apps/pwa/out/_next/static/chunks/app/ops/release/page-6fd41b5b6ff13a71.js +1 -0
  151. package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-fb3d5f7642c99fba.js +1 -0
  152. package/apps/pwa/out/_next/static/chunks/app/outputs/page-70f705b2b5ed42ca.js +1 -0
  153. package/apps/pwa/out/_next/static/chunks/app/page-c9c93b358a7667b5.js +1 -0
  154. package/apps/pwa/out/_next/static/chunks/app/reflection/page-1563c556b81c96ed.js +1 -0
  155. package/apps/pwa/out/_next/static/chunks/app/scheduler/page-ce89c20c45b3a673.js +1 -0
  156. package/apps/pwa/out/_next/static/chunks/app/sessions/page-423ae63d786f4ee9.js +1 -0
  157. package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-591a5378a4c4447c.js +1 -0
  158. package/apps/pwa/out/_next/static/chunks/app/settings/page-a250496b19a5824b.js +1 -0
  159. package/apps/pwa/out/_next/static/chunks/app/setup/done/page-c36a9277febc5911.js +1 -0
  160. package/apps/pwa/out/_next/static/chunks/app/setup/layout-83372d8b5863ebf7.js +1 -0
  161. package/apps/pwa/out/_next/static/chunks/app/setup/page-29900ed0011b2c83.js +1 -0
  162. package/apps/pwa/out/_next/static/chunks/app/share/page-a5de57edc6d7f942.js +1 -0
  163. package/apps/pwa/out/_next/static/chunks/app/showroom/page-16bdd4c9f40498df.js +1 -0
  164. package/apps/pwa/out/_next/static/chunks/app/tasks/page-75e946e6e71cc6d8.js +1 -0
  165. package/apps/pwa/out/_next/static/chunks/app/term/page-9eb56166774eb256.js +1 -0
  166. package/apps/pwa/out/_next/static/chunks/app/today/page-1c5f9ef35dbb22c5.js +1 -0
  167. package/apps/pwa/out/_next/static/chunks/app/trace/page-657ff9985e508498.js +1 -0
  168. package/apps/pwa/out/_next/static/chunks/app/vault/page-22dc72499da68fb2.js +1 -0
  169. package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-9f92737b8766009a.js +1 -0
  170. package/apps/pwa/out/_next/static/chunks/app/workflows/page-094ad334e40f8169.js +1 -0
  171. package/apps/pwa/out/_next/static/chunks/app/workspace/page-8bcd379852ff6287.js +1 -0
  172. package/apps/pwa/out/_next/static/chunks/app/worktrees/page-6b04413f280cd344.js +1 -0
  173. package/apps/pwa/out/_next/static/chunks/{f4dfbfc0.a69fb12f854882aa.js → bc324b7c.02a09dd93f6a399b.js} +1 -1
  174. package/apps/pwa/out/_next/static/chunks/de70ab42-d28d47437208d458.js +1 -0
  175. package/apps/pwa/out/_next/static/chunks/f800c5e3.46dbd7f2af8c3fce.js +1 -0
  176. package/apps/pwa/out/_next/static/chunks/f8bc19ad.47579f6d684b0760.js +122 -0
  177. package/apps/pwa/out/_next/static/chunks/framework-ca9ac4609fb9fed8.js +1 -0
  178. package/apps/pwa/out/_next/static/chunks/main-app-0dd08d32d15a030f.js +1 -0
  179. package/apps/pwa/out/_next/static/chunks/main-f0399d33955c4e01.js +1 -0
  180. package/apps/pwa/out/_next/static/chunks/pages/_app-d42caca6f8ac2211.js +1 -0
  181. package/apps/pwa/out/_next/static/chunks/pages/_error-42e713c13aa41ca8.js +1 -0
  182. package/apps/pwa/out/_next/static/chunks/webpack-8fbf8f61a377aa16.js +1 -0
  183. package/apps/pwa/out/approvals/index.html +1 -1
  184. package/apps/pwa/out/approvals/index.txt +22 -22
  185. package/apps/pwa/out/autopilot/index.html +1 -1
  186. package/apps/pwa/out/autopilot/index.txt +22 -22
  187. package/apps/pwa/out/board/index.html +1 -1
  188. package/apps/pwa/out/board/index.txt +22 -22
  189. package/apps/pwa/out/botlab/index.html +1 -1
  190. package/apps/pwa/out/botlab/index.txt +21 -21
  191. package/apps/pwa/out/bots/index.html +1 -1
  192. package/apps/pwa/out/bots/index.txt +21 -21
  193. package/apps/pwa/out/ceo/index.html +1 -1
  194. package/apps/pwa/out/ceo/index.txt +22 -22
  195. package/apps/pwa/out/chat/index.html +1 -1
  196. package/apps/pwa/out/chat/index.txt +21 -21
  197. package/apps/pwa/out/consult/index.html +1 -1
  198. package/apps/pwa/out/consult/index.txt +22 -22
  199. package/apps/pwa/out/control/index.html +1 -1
  200. package/apps/pwa/out/control/index.txt +22 -22
  201. package/apps/pwa/out/decisions/index.html +1 -1
  202. package/apps/pwa/out/decisions/index.txt +21 -21
  203. package/apps/pwa/out/design-check/index.html +1 -1
  204. package/apps/pwa/out/design-check/index.txt +22 -22
  205. package/apps/pwa/out/editor/index.html +1 -1
  206. package/apps/pwa/out/editor/index.txt +22 -22
  207. package/apps/pwa/out/exec/index.html +1 -1
  208. package/apps/pwa/out/exec/index.txt +22 -22
  209. package/apps/pwa/out/field/index.html +1 -1
  210. package/apps/pwa/out/field/index.txt +22 -22
  211. package/apps/pwa/out/healthz +1 -1
  212. package/apps/pwa/out/index.html +1 -1
  213. package/apps/pwa/out/index.txt +21 -21
  214. package/apps/pwa/out/inside/index.html +1 -1
  215. package/apps/pwa/out/inside/index.txt +21 -21
  216. package/apps/pwa/out/intake/index.html +1 -1
  217. package/apps/pwa/out/intake/index.txt +22 -22
  218. package/apps/pwa/out/live/index.html +1 -1
  219. package/apps/pwa/out/live/index.txt +22 -22
  220. package/apps/pwa/out/live-run/index.html +1 -1
  221. package/apps/pwa/out/live-run/index.txt +22 -22
  222. package/apps/pwa/out/loops/index.html +1 -1
  223. package/apps/pwa/out/loops/index.txt +21 -21
  224. package/apps/pwa/out/market/index.html +1 -1
  225. package/apps/pwa/out/market/index.txt +21 -21
  226. package/apps/pwa/out/missions/placeholder/index.html +1 -1
  227. package/apps/pwa/out/missions/placeholder/index.txt +21 -21
  228. package/apps/pwa/out/morning/index.html +1 -1
  229. package/apps/pwa/out/morning/index.txt +22 -22
  230. package/apps/pwa/out/observatory/index.html +1 -1
  231. package/apps/pwa/out/observatory/index.txt +22 -22
  232. package/apps/pwa/out/ops/checklist/index.html +1 -1
  233. package/apps/pwa/out/ops/checklist/index.txt +21 -21
  234. package/apps/pwa/out/ops/release/index.html +1 -1
  235. package/apps/pwa/out/ops/release/index.txt +21 -21
  236. package/apps/pwa/out/ops/seats/index.html +1 -1
  237. package/apps/pwa/out/ops/seats/index.txt +21 -21
  238. package/apps/pwa/out/outputs/index.html +1 -1
  239. package/apps/pwa/out/outputs/index.txt +21 -21
  240. package/apps/pwa/out/reflection/index.html +1 -1
  241. package/apps/pwa/out/reflection/index.txt +22 -22
  242. package/apps/pwa/out/scheduler/index.html +1 -1
  243. package/apps/pwa/out/scheduler/index.txt +22 -22
  244. package/apps/pwa/out/sessions/index.html +1 -1
  245. package/apps/pwa/out/sessions/index.txt +21 -21
  246. package/apps/pwa/out/settings/devices/index.html +1 -1
  247. package/apps/pwa/out/settings/devices/index.txt +22 -22
  248. package/apps/pwa/out/settings/index.html +1 -1
  249. package/apps/pwa/out/settings/index.txt +22 -22
  250. package/apps/pwa/out/setup/done/index.html +1 -1
  251. package/apps/pwa/out/setup/done/index.txt +22 -22
  252. package/apps/pwa/out/setup/index.html +1 -1
  253. package/apps/pwa/out/setup/index.txt +22 -22
  254. package/apps/pwa/out/share/index.html +1 -1
  255. package/apps/pwa/out/share/index.txt +22 -22
  256. package/apps/pwa/out/showroom/index.html +1 -1
  257. package/apps/pwa/out/showroom/index.txt +21 -21
  258. package/apps/pwa/out/tasks/index.html +1 -1
  259. package/apps/pwa/out/tasks/index.txt +22 -22
  260. package/apps/pwa/out/term/index.html +1 -1
  261. package/apps/pwa/out/term/index.txt +22 -22
  262. package/apps/pwa/out/today/index.html +1 -1
  263. package/apps/pwa/out/today/index.txt +22 -22
  264. package/apps/pwa/out/trace/index.html +1 -1
  265. package/apps/pwa/out/trace/index.txt +22 -22
  266. package/apps/pwa/out/vault/index.html +1 -1
  267. package/apps/pwa/out/vault/index.txt +22 -22
  268. package/apps/pwa/out/workflows/chat-ui/index.html +1 -1
  269. package/apps/pwa/out/workflows/chat-ui/index.txt +22 -22
  270. package/apps/pwa/out/workflows/index.html +1 -1
  271. package/apps/pwa/out/workflows/index.txt +22 -22
  272. package/apps/pwa/out/workspace/index.html +1 -1
  273. package/apps/pwa/out/workspace/index.txt +22 -22
  274. package/apps/pwa/out/worktrees/index.html +1 -1
  275. package/apps/pwa/out/worktrees/index.txt +22 -22
  276. package/graphs/release/release-loop.yaml +6 -2
  277. package/package.json +1 -1
  278. package/plugins/agent-team/agents/research.md +1 -0
  279. package/scripts/ci-typecheck-changed.ts +3 -2
  280. package/scripts/coord-channel-watch.sh +26 -6
  281. package/scripts/coord-role-pack.ts +143 -0
  282. package/scripts/lib/morning-report-options.ts +41 -0
  283. package/scripts/pr-land-extra-remote-gates.ts +49 -0
  284. package/scripts/release-loop/gate-batch-safe.ts +23 -0
  285. package/scripts/release-loop/gate-history.ts +422 -0
  286. package/scripts/release-loop/gate-node.ts +310 -46
  287. package/scripts/release-loop/gate-triage-node.ts +190 -0
  288. package/scripts/release-loop/spawn-lane.ts +68 -0
  289. package/scripts/release-loop/tui-node-checks.ts +23 -0
  290. package/scripts/release-loop/version-node.ts +62 -4
  291. package/scripts/test-deterministic.ts +41 -12
  292. package/scripts/usage-rollup.ts +11 -3
  293. package/src/acp/core-turn-bridge.ts +98 -22
  294. package/src/acp/elanous-extensions.ts +2 -0
  295. package/src/acp/server.ts +2 -0
  296. package/src/agent/ref-grounding.ts +18 -0
  297. package/src/agent-substrate/pr-reviewer.ts +29 -21
  298. package/src/budget/pty-usage-reemit.ts +7 -0
  299. package/src/budget/run-usage-rollup.ts +9 -0
  300. package/src/budget/usage-daily-store.ts +98 -0
  301. package/src/capture/tui-self-report.ts +22 -4
  302. package/src/chat/index.ts +31 -10
  303. package/src/chat/pickers/modal-runtime.ts +1 -0
  304. package/src/chat/pickers/modals.ts +3 -1
  305. package/src/chat/turn-typeahead.ts +123 -16
  306. package/src/cli/dashboard-name-flag.ts +48 -0
  307. package/src/cli/doctor-cli.ts +80 -0
  308. package/src/cli/log-event-names.ts +12 -0
  309. package/src/cli/msg-cli.ts +45 -2
  310. package/src/cli/pr-cli.ts +382 -105
  311. package/src/cli/pr-land-heavy-remote.ts +233 -0
  312. package/src/cli/pr-land-overlap-evidence.ts +104 -5
  313. package/src/cli/pty-takeover-cli.ts +125 -16
  314. package/src/cli/release-cli.ts +44 -2
  315. package/src/cli/remote-resolve.ts +2 -1
  316. package/src/cli/seat-cli.ts +26 -16
  317. package/src/cli/tasks-cli.ts +8 -2
  318. package/src/cli/usage-cli.ts +146 -12
  319. package/src/cli/usage-daily-cli.ts +84 -0
  320. package/src/context-bus/context-now.ts +82 -5
  321. package/src/core-turn/auth-rejected-notice.ts +41 -0
  322. package/src/core-turn/run-core-turn.ts +13 -2
  323. package/src/core-turn/run-goal-loop.ts +17 -1
  324. package/src/core-turn/short-question.ts +45 -12
  325. package/src/core-turn/types.ts +7 -0
  326. package/src/dashboard/acp-active-model.ts +40 -0
  327. package/src/dashboard/auto-compact-runtime.ts +2 -0
  328. package/src/dashboard/boot-banner.ts +80 -0
  329. package/src/dashboard/dashboard-status-lines.ts +11 -0
  330. package/src/dashboard/detail-viewer-runtime.ts +15 -2
  331. package/src/dashboard/event-loop-stall-monitor.ts +4 -0
  332. package/src/dashboard/goal-loop-thinking.ts +16 -0
  333. package/src/dashboard/hitl-boot.ts +9 -4
  334. package/src/dashboard/index.ts +228 -387
  335. package/src/dashboard/input/chat-main-entry-runtime.ts +2 -0
  336. package/src/dashboard/input/chat-main-log-actions.ts +4 -0
  337. package/src/dashboard/input/chat-main-log-command.ts +12 -1
  338. package/src/dashboard/input/chat-main-plain-turn-runtime.ts +172 -3
  339. package/src/dashboard/input/chat-main-session.ts +6 -2
  340. package/src/dashboard/input/chat-main-slash-command.ts +7 -0
  341. package/src/dashboard/input/chat-main-turn.ts +2 -1
  342. package/src/dashboard/input/compact-prepass-recovery.ts +97 -0
  343. package/src/dashboard/input/dashboard-chord-actions.ts +10 -1
  344. package/src/dashboard/input/dashboard-chord-runtime.ts +2 -0
  345. package/src/dashboard/input/external-input-host.ts +45 -0
  346. package/src/dashboard/input/log-fold-binding.ts +18 -0
  347. package/src/dashboard/input/mouse-wiring.ts +17 -4
  348. package/src/dashboard/input/turn-steer-bridge.ts +94 -0
  349. package/src/dashboard/log-click-runtime.ts +5 -3
  350. package/src/dashboard/running-build-status.ts +74 -0
  351. package/src/dashboard/seat-boot-preamble.ts +113 -0
  352. package/src/dashboard/seat-local-instructions.ts +305 -0
  353. package/src/dashboard/slash-runtime/dashboard-handlers.ts +100 -28
  354. package/src/dashboard/slash-runtime/model-choices.ts +35 -0
  355. package/src/dashboard/term-slash-runtime.ts +15 -0
  356. package/src/dashboard/turn-preamble.ts +30 -2
  357. package/src/dashboard/turn-session-layers.ts +176 -0
  358. package/src/dashboard/turn-stream-formatter.ts +14 -6
  359. package/src/dashboard/turn-stream-presentation-applier.ts +8 -0
  360. package/src/domains/release-tool.ts +8 -9
  361. package/src/domains/surface-events.ts +4 -1
  362. package/src/domains/watch-default-scheduler.ts +8 -9
  363. package/src/fold-stack.ts +24 -1
  364. package/src/git-fs/dirty.ts +32 -4
  365. package/src/git-fs/index.ts +43 -1
  366. package/src/graph-runner/runner.ts +1 -0
  367. package/src/harness/harness-gc.ts +32 -5
  368. package/src/index.ts +14 -1
  369. package/src/input/external-input-queue.ts +219 -0
  370. package/src/interactive-terminal-modal.ts +13 -0
  371. package/src/llm/route-decision.ts +25 -0
  372. package/src/llm-stream-retry-display.ts +59 -0
  373. package/src/llm.ts +253 -55
  374. package/src/log-entry.ts +3 -3
  375. package/src/log-pane/search.ts +29 -4
  376. package/src/loops/agent-reply.ts +256 -0
  377. package/src/loops/budget.ts +37 -7
  378. package/src/loops/loop-cli.ts +3 -2
  379. package/src/loops/msg-address.ts +57 -0
  380. package/src/loops/msg-wake.ts +282 -0
  381. package/src/loops/orchestrator/inbox.ts +60 -3
  382. package/src/loops/orchestrator/tick.ts +24 -4
  383. package/src/loops/registry.ts +42 -4
  384. package/src/memory.ts +20 -5
  385. package/src/native-tool-catalog.ts +125 -0
  386. package/src/nexus/api/http-server.ts +5 -0
  387. package/src/nexus/api/ops-api.ts +2 -0
  388. package/src/nexus/api/project-autopsy.ts +127 -0
  389. package/src/nexus/api/terminals.ts +3 -0
  390. package/src/nexus/api/workflow-approvals.ts +2 -0
  391. package/src/nexus/onboarding/first-boot-wizard.ts +56 -2
  392. package/src/oauth/codex-account-store.ts +15 -3
  393. package/src/oauth/codex-billing-route.ts +31 -0
  394. package/src/ops/overview-collect.ts +19 -2
  395. package/src/panes/log-pane.ts +67 -8
  396. package/src/persona/presets.ts +44 -0
  397. package/src/plugins/maker/wizard-generate.ts +6 -4
  398. package/src/preview/terminal.ts +14 -1
  399. package/src/prompt-cache/types.ts +2 -0
  400. package/src/prompt-enhance/enhance.ts +24 -8
  401. package/src/prompt-library/universal-preamble.ts +273 -56
  402. package/src/pty-shell/pty-control-ipc.ts +4 -1
  403. package/src/pty-shell/pty-manifest.ts +77 -5
  404. package/src/pty-shell/registry.ts +19 -2
  405. package/src/pty-shell/tui-run-state.ts +253 -0
  406. package/src/release-loop/light-rc.ts +28 -3
  407. package/src/release-loop/rehearsal.ts +1 -1
  408. package/src/render.ts +5 -1
  409. package/src/seat-loop/seat-report.ts +42 -2
  410. package/src/self-dev/run-supervisor.ts +71 -5
  411. package/src/self-dev/shard-aggregate.ts +2 -0
  412. package/src/self-dev/shard-run.ts +23 -2
  413. package/src/self-health/signatures.ts +132 -0
  414. package/src/self-implement/doctor-visit.ts +118 -0
  415. package/src/self-implement/gate-cli.ts +11 -2
  416. package/src/self-implement/goal-author-decompose.ts +80 -16
  417. package/src/self-implement/goal-author.ts +114 -72
  418. package/src/self-implement/goal-authoring-grounding.ts +1 -1
  419. package/src/self-implement/goal-file-name.ts +65 -0
  420. package/src/self-implement/ground-goal.ts +2 -1
  421. package/src/self-implement/host-regate.ts +14 -0
  422. package/src/self-implement/review-mustfix-class.ts +115 -0
  423. package/src/self-implement/run-ledger.ts +111 -7
  424. package/src/self-implement/running-runs.ts +10 -6
  425. package/src/self-implement/self-implement-runtime.ts +32 -0
  426. package/src/session/pending-input.ts +62 -11
  427. package/src/session-runtime/index.ts +7 -1
  428. package/src/skills/tools/ops-ledger.ts +707 -0
  429. package/src/skills/tools/persistent-grounding.ts +47 -7
  430. package/src/skills/tools/shell.ts +117 -1
  431. package/src/status/bar.ts +32 -2
  432. package/src/status/status-provider-info.ts +58 -0
  433. package/src/task-agent/rejudge-on-head.ts +4 -1
  434. package/src/task-agent/remote-rejudge-bind.ts +34 -5
  435. package/src/task-agent/repair-cycle.ts +13 -0
  436. package/src/task-orchestrator/surfaces/kubectl-transient-retry.ts +51 -0
  437. package/src/task-orchestrator/surfaces/pod-command-job.ts +63 -7
  438. package/src/task-orchestrator/surfaces/pod-install-slots.ts +6 -11
  439. package/src/task-orchestrator/surfaces/pod-mirror-seed.ts +76 -0
  440. package/src/task-orchestrator/surfaces/self-implement-pod.ts +107 -33
  441. package/src/terminal/session-registry.ts +6 -0
  442. package/src/thinking-line.ts +12 -3
  443. package/src/tool-runtime/index.ts +4 -0
  444. package/src/tool-runtime/ops-ledger-runtimes.ts +84 -0
  445. package/src/tool-runtime/ref-consult-runtime.ts +17 -2
  446. package/src/tool-runtime/run-shell-runtime.ts +4 -1
  447. package/src/tool-runtime/self-cognition-runtimes.ts +5 -1
  448. package/src/tui.ts +5 -0
  449. package/src/user-config.ts +54 -6
  450. package/src/ux-sim/fake-llm.ts +29 -0
  451. package/src/ux-sim/in-process-cli.ts +175 -0
  452. package/src/version/packed-revision.json +1 -1
  453. package/apps/pwa/out/_next/static/chunks/1027.a0f04663d24c2779.js +0 -1
  454. package/apps/pwa/out/_next/static/chunks/1038.676007ae505822e7.js +0 -1
  455. package/apps/pwa/out/_next/static/chunks/1113.a37eadf7f740d955.js +0 -1
  456. package/apps/pwa/out/_next/static/chunks/112-fa7c526c20ce1405.js +0 -1
  457. package/apps/pwa/out/_next/static/chunks/1144.5fa1fa1d48dbcd12.js +0 -36
  458. package/apps/pwa/out/_next/static/chunks/1146.80d15ea7c6e6ee95.js +0 -1
  459. package/apps/pwa/out/_next/static/chunks/1157.f08bf2b70915e176.js +0 -148
  460. package/apps/pwa/out/_next/static/chunks/119b405e.8fdd0e44d1ff37aa.js +0 -1
  461. package/apps/pwa/out/_next/static/chunks/1296.04560d98e73fbf51.js +0 -1
  462. package/apps/pwa/out/_next/static/chunks/1314-f604ba013ec535b0.js +0 -1
  463. package/apps/pwa/out/_next/static/chunks/1454-29d1d773d5996a49.js +0 -1
  464. package/apps/pwa/out/_next/static/chunks/1464.f3209af0d8ae4ff2.js +0 -1
  465. package/apps/pwa/out/_next/static/chunks/1729-d73dd25e564679d4.js +0 -1
  466. package/apps/pwa/out/_next/static/chunks/1843.5924c24295243261.js +0 -27
  467. package/apps/pwa/out/_next/static/chunks/1987.e28149724b92918b.js +0 -1
  468. package/apps/pwa/out/_next/static/chunks/2066-5ca18ffa5a4be68b.js +0 -1
  469. package/apps/pwa/out/_next/static/chunks/2240.d10a66695155fd93.js +0 -1
  470. package/apps/pwa/out/_next/static/chunks/2391.e2cbc98d4abbb41a.js +0 -1
  471. package/apps/pwa/out/_next/static/chunks/2528.3868070ef1be69f9.js +0 -24
  472. package/apps/pwa/out/_next/static/chunks/2566-734cb83bbd405886.js +0 -1
  473. package/apps/pwa/out/_next/static/chunks/2697.76ca2ac3efef6f3b.js +0 -1
  474. package/apps/pwa/out/_next/static/chunks/275.0e6bad414729bfa0.js +0 -32
  475. package/apps/pwa/out/_next/static/chunks/2803-33bdae771855a8d1.js +0 -1
  476. package/apps/pwa/out/_next/static/chunks/3143.257997a5f1ed79df.js +0 -34
  477. package/apps/pwa/out/_next/static/chunks/3259-86f3be56e43eaf6a.js +0 -1
  478. package/apps/pwa/out/_next/static/chunks/3280-e177c33bfbdcfb0a.js +0 -1
  479. package/apps/pwa/out/_next/static/chunks/3294-2b6a6d45a46a6c1c.js +0 -1
  480. package/apps/pwa/out/_next/static/chunks/3309.364573ceedbdfd5f.js +0 -1
  481. package/apps/pwa/out/_next/static/chunks/3522.758840fc5e7fe630.js +0 -287
  482. package/apps/pwa/out/_next/static/chunks/3525-a7c989c1a661e880.js +0 -1
  483. package/apps/pwa/out/_next/static/chunks/3694.b1a66387756458c0.js +0 -1
  484. package/apps/pwa/out/_next/static/chunks/370.124f9e678a76fc01.js +0 -1
  485. package/apps/pwa/out/_next/static/chunks/3797-9643105335e660fe.js +0 -1
  486. package/apps/pwa/out/_next/static/chunks/4084.15ecaf4240bd9e77.js +0 -286
  487. package/apps/pwa/out/_next/static/chunks/4089-b3382b8843114eee.js +0 -1
  488. package/apps/pwa/out/_next/static/chunks/4293.928a8d573c16aab7.js +0 -1
  489. package/apps/pwa/out/_next/static/chunks/4402.f9238a3b18a7bd43.js +0 -1
  490. package/apps/pwa/out/_next/static/chunks/4490-9b090b0f9427f902.js +0 -1
  491. package/apps/pwa/out/_next/static/chunks/4548.13502d0ca3b4f862.js +0 -8
  492. package/apps/pwa/out/_next/static/chunks/4599-548bc96cda44a5a7.js +0 -1
  493. package/apps/pwa/out/_next/static/chunks/4625.206574e33a9e7ae8.js +0 -104
  494. package/apps/pwa/out/_next/static/chunks/4862-392c9a71f0d8dfb4.js +0 -1
  495. package/apps/pwa/out/_next/static/chunks/5054.2906d1b02542edc5.js +0 -149
  496. package/apps/pwa/out/_next/static/chunks/5102-c822bbbee5a022a4.js +0 -1
  497. package/apps/pwa/out/_next/static/chunks/5194-8c93f2e7e4b6f717.js +0 -1
  498. package/apps/pwa/out/_next/static/chunks/5305-bacd7eca0b9a5848.js +0 -1
  499. package/apps/pwa/out/_next/static/chunks/5311.9071ee3f44fd7ff5.js +0 -1
  500. package/apps/pwa/out/_next/static/chunks/5369.9f34353442daa421.js +0 -1
  501. package/apps/pwa/out/_next/static/chunks/589-49d730cb8138b397.js +0 -1
  502. package/apps/pwa/out/_next/static/chunks/5904-264a6412ae3c9028.js +0 -1
  503. package/apps/pwa/out/_next/static/chunks/5980.728531d5c566535c.js +0 -1
  504. package/apps/pwa/out/_next/static/chunks/599-56f2c0a5cc4a7295.js +0 -1
  505. package/apps/pwa/out/_next/static/chunks/6011.f525002e21bef0ac.js +0 -23
  506. package/apps/pwa/out/_next/static/chunks/6132.4381ab93683f1acf.js +0 -1
  507. package/apps/pwa/out/_next/static/chunks/6149.2e698635e454d8f6.js +0 -1
  508. package/apps/pwa/out/_next/static/chunks/6356-0afafc4230cf9767.js +0 -1
  509. package/apps/pwa/out/_next/static/chunks/6406.64756073f7df35b8.js +0 -77
  510. package/apps/pwa/out/_next/static/chunks/6479-16e62aedafa0e310.js +0 -1
  511. package/apps/pwa/out/_next/static/chunks/6599.b5246b46a2453329.js +0 -64
  512. package/apps/pwa/out/_next/static/chunks/6610.5c26eec011565acb.js +0 -1
  513. package/apps/pwa/out/_next/static/chunks/666.37d18474edc1c552.js +0 -2
  514. package/apps/pwa/out/_next/static/chunks/6904.a0b5b1ed4f2d2c20.js +0 -1
  515. package/apps/pwa/out/_next/static/chunks/7247-1f4aba94aba50d9f.js +0 -1
  516. package/apps/pwa/out/_next/static/chunks/7274-e71a7c5b7760cd02.js +0 -1
  517. package/apps/pwa/out/_next/static/chunks/7290.1fcaeef3adb5d0d4.js +0 -1
  518. package/apps/pwa/out/_next/static/chunks/7477-2c64e42760f82f33.js +0 -1
  519. package/apps/pwa/out/_next/static/chunks/7505-47002b76ff1aef6c.js +0 -1
  520. package/apps/pwa/out/_next/static/chunks/7600-11884ca4da68e5d9.js +0 -1
  521. package/apps/pwa/out/_next/static/chunks/7607.40d8bb3689697ccb.js +0 -62
  522. package/apps/pwa/out/_next/static/chunks/7752.5cbdd0b433c54af9.js +0 -1
  523. package/apps/pwa/out/_next/static/chunks/7763.f51fcc19ca1414ec.js +0 -1
  524. package/apps/pwa/out/_next/static/chunks/7785.846140c859b1adf6.js +0 -1
  525. package/apps/pwa/out/_next/static/chunks/7807-a0fdac6393e0bf36.js +0 -1
  526. package/apps/pwa/out/_next/static/chunks/7837-20a63b4b7e9342b1.js +0 -1
  527. package/apps/pwa/out/_next/static/chunks/800.7815414cf280545d.js +0 -1
  528. package/apps/pwa/out/_next/static/chunks/8085-1e5fce59500a2cc2.js +0 -1
  529. package/apps/pwa/out/_next/static/chunks/8100.415f2105faa63e97.js +0 -1
  530. package/apps/pwa/out/_next/static/chunks/8290.701aa42ed13aa767.js +0 -226
  531. package/apps/pwa/out/_next/static/chunks/83a80514-b897b64df43ce108.js +0 -1
  532. package/apps/pwa/out/_next/static/chunks/8444.d9c74214a3145a43.js +0 -93
  533. package/apps/pwa/out/_next/static/chunks/8569.98c915534928c7f9.js +0 -24
  534. package/apps/pwa/out/_next/static/chunks/8591.b1c7f876e5ec7cfb.js +0 -1
  535. package/apps/pwa/out/_next/static/chunks/8715-f63756021d3ab989.js +0 -1
  536. package/apps/pwa/out/_next/static/chunks/8879.776c2ec7732aa114.js +0 -115
  537. package/apps/pwa/out/_next/static/chunks/8881.ddca15b3c82c490c.js +0 -1
  538. package/apps/pwa/out/_next/static/chunks/8946.5da5c87f32a2e1a8.js +0 -41
  539. package/apps/pwa/out/_next/static/chunks/9117.080b9b75be90e14d.js +0 -74
  540. package/apps/pwa/out/_next/static/chunks/9167.f3ecb28f367d6e69.js +0 -94
  541. package/apps/pwa/out/_next/static/chunks/9224.66095370ee28c93b.js +0 -1
  542. package/apps/pwa/out/_next/static/chunks/9238-0682b013c83d6449.js +0 -1
  543. package/apps/pwa/out/_next/static/chunks/9449.d3ed795da4befb1c.js +0 -1
  544. package/apps/pwa/out/_next/static/chunks/949.1e7d45ccb71580aa.js +0 -90
  545. package/apps/pwa/out/_next/static/chunks/9638-d268329f2c6f4f8d.js +0 -1
  546. package/apps/pwa/out/_next/static/chunks/9842-d6644eb53d3dc6bf.js +0 -1
  547. package/apps/pwa/out/_next/static/chunks/9863.94ca3263e760696e.js +0 -1
  548. package/apps/pwa/out/_next/static/chunks/9938.b23e4d4dfa0114cd.js +0 -79
  549. package/apps/pwa/out/_next/static/chunks/app/_not-found/page-d9babd8795f396a5.js +0 -1
  550. package/apps/pwa/out/_next/static/chunks/app/approvals/page-5ab1e47978577c5e.js +0 -1
  551. package/apps/pwa/out/_next/static/chunks/app/autopilot/page-24453f6a302816b4.js +0 -1
  552. package/apps/pwa/out/_next/static/chunks/app/board/page-6c131d30bb1cf871.js +0 -1
  553. package/apps/pwa/out/_next/static/chunks/app/bots/page-dc0772b11861af51.js +0 -1
  554. package/apps/pwa/out/_next/static/chunks/app/chat/page-5159dc8752c6cd29.js +0 -1
  555. package/apps/pwa/out/_next/static/chunks/app/consult/page-c5a2478861c08b87.js +0 -1
  556. package/apps/pwa/out/_next/static/chunks/app/control/page-f722a9dec084e08b.js +0 -1
  557. package/apps/pwa/out/_next/static/chunks/app/decisions/page-256ffd365d32e100.js +0 -1
  558. package/apps/pwa/out/_next/static/chunks/app/design-check/page-e0de78ae7b99f01c.js +0 -1
  559. package/apps/pwa/out/_next/static/chunks/app/editor/page-cfbdc44b708d9801.js +0 -1
  560. package/apps/pwa/out/_next/static/chunks/app/exec/page-4c741eb760f2f77c.js +0 -1
  561. package/apps/pwa/out/_next/static/chunks/app/field/page-e9ba98f5f1440a21.js +0 -1
  562. package/apps/pwa/out/_next/static/chunks/app/healthz/route-d9babd8795f396a5.js +0 -1
  563. package/apps/pwa/out/_next/static/chunks/app/inside/page-dafc901bb1b72b5f.js +0 -1
  564. package/apps/pwa/out/_next/static/chunks/app/intake/page-2f6f303fa114ec24.js +0 -1
  565. package/apps/pwa/out/_next/static/chunks/app/layout-1634081c5272006c.js +0 -1
  566. package/apps/pwa/out/_next/static/chunks/app/live/page-ced0bcfc6542b3fc.js +0 -1
  567. package/apps/pwa/out/_next/static/chunks/app/live-run/page-bb1f05cd51c38944.js +0 -1
  568. package/apps/pwa/out/_next/static/chunks/app/market/page-db069b48a59c8c00.js +0 -1
  569. package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-f736324afa2117c1.js +0 -1
  570. package/apps/pwa/out/_next/static/chunks/app/not-found-435f5e2faf02bc01.js +0 -1
  571. package/apps/pwa/out/_next/static/chunks/app/observatory/page-497e0eedf20e7890.js +0 -1
  572. package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-a8d28fdf995e16ea.js +0 -1
  573. package/apps/pwa/out/_next/static/chunks/app/ops/release/page-8966452228753c5e.js +0 -1
  574. package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-fd5d18656cb432b6.js +0 -1
  575. package/apps/pwa/out/_next/static/chunks/app/outputs/page-5663779cb1a37609.js +0 -1
  576. package/apps/pwa/out/_next/static/chunks/app/page-66a67eb19ebd976b.js +0 -1
  577. package/apps/pwa/out/_next/static/chunks/app/reflection/page-3b492aa78cf3c4a6.js +0 -1
  578. package/apps/pwa/out/_next/static/chunks/app/scheduler/page-c71267e7681da982.js +0 -1
  579. package/apps/pwa/out/_next/static/chunks/app/sessions/page-a21d1e1797172692.js +0 -1
  580. package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-cb249e81ed339318.js +0 -1
  581. package/apps/pwa/out/_next/static/chunks/app/settings/page-781cfc5114e097da.js +0 -1
  582. package/apps/pwa/out/_next/static/chunks/app/setup/done/page-478157214db6a023.js +0 -1
  583. package/apps/pwa/out/_next/static/chunks/app/setup/layout-d9babd8795f396a5.js +0 -1
  584. package/apps/pwa/out/_next/static/chunks/app/setup/page-86141f12cf090b7f.js +0 -1
  585. package/apps/pwa/out/_next/static/chunks/app/share/page-7256c73bb1c36751.js +0 -1
  586. package/apps/pwa/out/_next/static/chunks/app/showroom/page-5c738ca7adef3de5.js +0 -1
  587. package/apps/pwa/out/_next/static/chunks/app/tasks/page-0138c8091ec17224.js +0 -1
  588. package/apps/pwa/out/_next/static/chunks/app/term/page-cc2f24f16d85e735.js +0 -1
  589. package/apps/pwa/out/_next/static/chunks/app/today/page-979d318a534e92da.js +0 -1
  590. package/apps/pwa/out/_next/static/chunks/app/trace/page-182d394f7e6e096b.js +0 -1
  591. package/apps/pwa/out/_next/static/chunks/app/vault/page-21050928a697ed7a.js +0 -1
  592. package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-44b9d807005a9030.js +0 -1
  593. package/apps/pwa/out/_next/static/chunks/app/workflows/page-601fb77340e63c9a.js +0 -1
  594. package/apps/pwa/out/_next/static/chunks/app/workspace/page-75d3fb5d47af0edf.js +0 -1
  595. package/apps/pwa/out/_next/static/chunks/app/worktrees/page-11bf9e5725a72c22.js +0 -1
  596. package/apps/pwa/out/_next/static/chunks/dcf24383-2f82e35f2d827393.js +0 -1
  597. package/apps/pwa/out/_next/static/chunks/e117f801.e92bf10242653497.js +0 -1
  598. package/apps/pwa/out/_next/static/chunks/e87d89b9.2e71c0ae475d28a1.js +0 -122
  599. package/apps/pwa/out/_next/static/chunks/framework-bf135b997155e90e.js +0 -1
  600. package/apps/pwa/out/_next/static/chunks/main-5571537543bea91c.js +0 -1
  601. package/apps/pwa/out/_next/static/chunks/main-app-25c51c7df7f3a442.js +0 -1
  602. package/apps/pwa/out/_next/static/chunks/pages/_app-e3b2c1f5d82abd65.js +0 -1
  603. package/apps/pwa/out/_next/static/chunks/pages/_error-083f2e23e9bc3641.js +0 -1
  604. package/apps/pwa/out/_next/static/chunks/webpack-e94d22b7a028217b.js +0 -1
  605. package/src/dashboard/bench-slash-runtime.ts +0 -40
  606. package/src/dashboard/input/search-modal-router.ts +0 -9
  607. package/src/dashboard/modals/pane-key-router.ts +0 -27
  608. package/src/dashboard/view-slash-runtime.ts +0 -48
  609. /package/apps/pwa/out/_next/static/{y1ltt7oCZxVpC6zVPhZ2O → cIpv5nU9AycwYWZI9H589}/_ssgManifest.js +0 -0
@@ -6,10 +6,12 @@
6
6
  import { readFileSync, writeFileSync, existsSync, mkdirSync } from 'fs';
7
7
  import { join } from 'path';
8
8
  import { fileURLToPath } from 'node:url';
9
+ import { createRunningBuildStatus } from './running-build-status.js';
10
+ import { reportTuiTurn } from '../pty-shell/tui-run-state.js';
9
11
  import { createStaleInstallCheck, formatStaleInstallNotice, readCurrentInstalledCommit, readDashboardBootCommit, STALE_INSTALL_CHECK_INTERVAL_MS, versionedDashboardInstallDir } from './stale-install-check.js';
10
12
  import { spawn, spawnSync } from 'node:child_process';
11
13
  import { $ } from 'bun';
12
- import { LOCAL_SKILLS_DIR, SERVICE_NAMES, DATA_DIR, OBSIDIAN_VAULT } from '../config.js';
14
+ import { LOCAL_SKILLS_DIR, DATA_DIR, OBSIDIAN_VAULT } from '../config.js';
13
15
  import { dispatchDashboardSessionRuntimeTool } from './session-runtime-dispatch.js';
14
16
  import { nextChatScrollOffset } from '../chat/log-scroll-key.js';
15
17
  import { suggestProjectForFolder } from '../project/project-store.js';
@@ -160,8 +162,8 @@ function loadLastSelection(): LastSelection | null {
160
162
  }
161
163
  import { getLocalSkills, executeSync } from '../sync.js';
162
164
  import { computeDiff } from '../smart.js';
163
- import { analyzeDiff, summarizeDiff, isAnalyzerAvailable } from '../grok.js';
164
- import { C, ICONS, ansi, initTui, closeTui, setExitNotice, readKey, setKeyTracer, render, resetRenderCache, termSize, pad, stripAnsi, timeSince, hLine, showHelp, invalidateRenderCacheRow, wrapAnsiByWidth, injectKey } from '../tui.js';
165
+ import { summarizeDiff, isAnalyzerAvailable } from '../grok.js';
166
+ import { C, ICONS, ansi, initTui, closeTui, setExitNotice, readKey, setKeyTracer, render, termSize, pad, stripAnsi, hLine, showHelp, invalidateRenderCacheRow, wrapAnsiByWidth, injectKey } from '../tui.js';
165
167
  import { paintCursor, type CursorState } from '../display/cursor-state.js';
166
168
  import type { CursorDecision } from '../display/cursor-owner.js';
167
169
  import type { Key, RenderOptions } from '../tui.js';
@@ -169,7 +171,6 @@ import {
169
171
  createTurnTypeaheadState,
170
172
  applyTurnTypeaheadKey,
171
173
  renderTurnTypeaheadQueueRow,
172
- drainTurnTypeaheadOnce,
173
174
  renderTurnTypeaheadEcho,
174
175
  } from '../chat/turn-typeahead.js';
175
176
  import { dispatchStreamingTurnTypeaheadSubmission } from './input/streaming-turn-typeahead.js';
@@ -180,13 +181,11 @@ import type { CoreTurnDispatchTool } from '../core-turn/index.js';
180
181
  // ACP pair (see `bootDashboardAcpSession`), which internally routes
181
182
  // to streamLLMWithTools via runCoreTurn.
182
183
  import {
183
- startSpinner,
184
184
  createChatState,
185
185
  buildContext,
186
186
  formatResponse,
187
187
  onEscAbort,
188
188
  attachStreamingKeys,
189
- SLASH_COMMANDS,
190
189
  type InputResult,
191
190
  type TextInputExternalSubmitRequest,
192
191
  } from '../chat/index.js';
@@ -198,6 +197,7 @@ import {
198
197
  } from '../chat/hud-segments-wire.js';
199
198
  import { PreviewTerminal } from '../preview/terminal.js';
200
199
  import { startThinking, startPinnedThinking, type ThinkingHandle } from '../thinking-line.js';
200
+ import { goalLoopIterationThinking } from './goal-loop-thinking.js';
201
201
  import { debug, getAmbientSessionId } from '../debug/log.js';
202
202
  import { startEventLoopStallMonitor, thinkingVerbFromFooter } from './event-loop-stall-monitor.js';
203
203
  import { getPushcutClient } from '../pushcut/client.js';
@@ -220,11 +220,6 @@ import {
220
220
  registerAction as inputCoreRegisterAction,
221
221
  addDefaultBinding as inputCoreAddDefaultBinding,
222
222
  initUserBindings as initInputCoreUserBindings,
223
- readAuditTail,
224
- isInputAuditEntry,
225
- formatAuditEntry,
226
- parseDuration as parseAuditDuration,
227
- runRebindCommand,
228
223
  type DispatchContext as InputCoreDispatchContext,
229
224
  type MouseInputEvent as InputCoreMouseInputEvent,
230
225
  type RouteCallbacks as InputCoreRouteCallbacks,
@@ -255,7 +250,6 @@ import { wireInputModeContextBridge } from '../input-core/mode-context-bridge.js
255
250
  import { getDashboardContextKeyService } from './context/keys.js';
256
251
  import {
257
252
  getDashboardContextMenuRegistry,
258
- handleForPill,
259
253
  } from './context-menu/registry.js';
260
254
  import { createTransientOverlayHost } from '../display/transient-overlay-host.js';
261
255
  import { configureThemeIconsGetter } from '../theme/icons.js';
@@ -267,7 +261,6 @@ import {
267
261
  } from '../log-pane/buffer-policy.js';
268
262
  import { publishFocusContextKeysFromService } from './context/focus-bridge.js';
269
263
  import {
270
- modalBlocksBackground,
271
264
  modalParticipatesInViewMode,
272
265
  renderModalStack,
273
266
  topBlockingForegroundModalSurface,
@@ -285,7 +278,6 @@ import {
285
278
  debugWorkbenchIndexForTarget,
286
279
  getDebugCompanionSpec,
287
280
  listDebugCompanionKeys,
288
- resolveDebugCompanionTargets,
289
281
  type DebugWorkbenchPane,
290
282
  } from '../window/debug-window-consumers.js';
291
283
  import {
@@ -295,7 +287,6 @@ import {
295
287
  } from '../window/tablet-workspace-policy.js';
296
288
  import {
297
289
  type PromptFrame,
298
- bottomFixedRowsForPromptFrame,
299
290
  resolvePromptFrame,
300
291
  } from '../display/prompt-frame.js';
301
292
  import { resolveBottomSlotBounds } from '../display/bottom-slot.js';
@@ -341,27 +332,8 @@ import { attachDashboardQuickPassConsumers } from './input/control-signal-consum
341
332
  import { resolveDashboardChatMainSlashCommand } from './input/chat-main-slash-command.js';
342
333
  import { TuiChatPersonaSelection, tuiChatPersonaMessages } from './slash-runtime/chat-persona.js';
343
334
  import { awaitGlobalPersonaLoad } from '../persona/global-registry.js';
344
- import { resolveDashboardChatMainCacheCommand } from './input/chat-main-cache-command.js';
345
- import {
346
- dashboardDeltaHelpLines,
347
- resolveDashboardChatMainDeltaCommand,
348
- } from './input/chat-main-delta-command.js';
349
- import {
350
- DASHBOARD_SETUP_STEPS,
351
- dashboardSetupHelpLines,
352
- resolveDashboardChatMainSetupCommand,
353
- } from './input/chat-main-setup-command.js';
354
335
  import { createDashboardInlineSetupFlow } from './setup-inline.js';
355
- import { resolveDashboardChatMainThemeCommand } from './input/chat-main-theme-command.js';
356
- import { resolveDashboardChatMainLogCommand } from './input/chat-main-log-command.js';
357
336
  import { noProviderReply } from './input/no-provider-reply.js';
358
- import {
359
- dashboardLogHelpLines,
360
- resolveDashboardLogFilterAction,
361
- resolveDashboardLogSearchAction,
362
- resolveDashboardLogSizeAction,
363
- resolveDashboardLogTurnAction,
364
- } from './input/chat-main-log-actions.js';
365
337
  import type { LogTurnSeparatorMode } from './log-turn-separator-mode.js';
366
338
  import { createDashboardChatMainInteractionOpts } from './input/chat-main-interaction-opts.js';
367
339
  import { createDashboardChatMainCompletionOpts } from './input/chat-main-completion-opts.js';
@@ -379,6 +351,7 @@ import {
379
351
  matchDashboardChordAction,
380
352
  } from './input/dashboard-chord-actions.js';
381
353
  import { createDashboardChordRuntime } from './input/dashboard-chord-runtime.js';
354
+ import { registerLogFoldInputBinding } from './input/log-fold-binding.js';
382
355
  import { handleDashboardDisplayKeyRoute } from './input/dashboard-display-key-route.js';
383
356
  import { routeDashboardPriorityKey } from './input/dashboard-priority-key-route.js';
384
357
  import { shouldPassthroughDashboardHostOwnedInputCoreAction } from './input/input-core-host-action.js';
@@ -425,7 +398,6 @@ import {
425
398
  } from './voice-host-boot.js';
426
399
  import {
427
400
  bootDashboardAutoTts,
428
- handleAutoTtsSlash,
429
401
  } from './auto-tts/auto-tts-host-boot.js';
430
402
  import {
431
403
  bootDashboardVoiceChat,
@@ -443,7 +415,6 @@ import {
443
415
  import {
444
416
  resolveLegacyForegroundModalFocusPlan,
445
417
  resolveLegacyForegroundModalDemotionTransition,
446
- resolveLegacyForegroundModalFallbackPane,
447
418
  } from './input/foreground-modal-focus.js';
448
419
  import {
449
420
  resolveDashboardInitialWorkingFocus,
@@ -460,18 +431,10 @@ import { addHint, listHints, removeHint, resetScope } from '../tool-hints/regist
460
431
  import { resetGateCache } from '../tool-hints/gate.js';
461
432
  import { collectSignals, signalsSummary } from '../tool-hints/signals.js';
462
433
  import { resetProbes } from '../tool-hints/probe.js';
463
- import {
464
- addAllowed,
465
- hostOf,
466
- listAllowed,
467
- rateLimitStatus,
468
- removeAllowed,
469
- } from '../tool-hints/api-allowlist.js';
470
434
  import type { HintScope } from '../tool-hints/types.js';
471
- import { listSkillNames, describeSkill } from '../skills/runner.js';
472
435
  import { globalAgentRegistry, type AgentToolCallEvent } from '../agent/registry.js';
473
436
  import { SELF_IMPLEMENT_TOOL_NAMES } from '../boot/daemon-tools/self-implement-names.js';
474
- import { FOLD_LIMITS, type FoldMode } from '../log-entry.js';
437
+ import { type FoldMode } from '../log-entry.js';
475
438
  import { renderToolCallEvent, renderToolResultVariants } from '../chat/tool-render/index.js';
476
439
  import { FoldStack } from '../fold-stack.js';
477
440
  import { getSkillIndex, reloadSkillIndex, applySkillFilter, skillIndexProblems } from '../skills/index.js';
@@ -546,7 +509,11 @@ export function formatEscAbortWaitingTargets(targets: readonly string[]): string
546
509
  export function settleEscAbortPendingLines(lines: string[], fromIndex: number): void {
547
510
  let settled = false;
548
511
  for (let index = fromIndex; index < lines.length;) {
549
- const line = lines[index]!;
512
+ const line = lines[index];
513
+ if (typeof line !== 'string') {
514
+ index += 1;
515
+ continue;
516
+ }
550
517
  const isAbortPending = line.startsWith(' ⏳ 중단 요청됨 — ');
551
518
  const isAbortRepeat = /^ ⏳ ESC 재시도 \d+회 — /.test(line);
552
519
  if (!isAbortPending && !isAbortRepeat) {
@@ -625,38 +592,33 @@ export function getEscAbortRunningCount(
625
592
  return Math.max(1, registeredRunning);
626
593
  }
627
594
  }
628
- import { resetOnboardingMarker } from '../onboarding.js';
595
+ import { needsOnboarding, resetOnboardingMarker } from '../onboarding.js';
629
596
  import {
630
597
  getUserConfig, reloadUserConfig, saveUserConfig,
631
598
  rotateNextProvider, jumpToRotationEntry, rotationEntryLabel, applyRotationEntry,
632
- currentRotationIndex, resolveAcpHopCapFromConfig,
599
+ resolveAcpHopCapFromConfig,
633
600
  VOICE_HARDCODED_DEFAULTS,
634
601
  } from '../user-config.js';
635
- import { listProviders, streamLLM, anyProviderAvailable, getProviderForConfig, REASONING_CYCLE, nextReasoningLevel, reasoningLevelLabel, effectiveReasoningLevel, modelSupportsReasoning, type LLMMessage, type LLMToolSpec } from '../llm.js';
636
- import { resolveRouteDecision, recordCurrentRouteDecision, currentRouteDecision, formatRouteDecisionSummary } from '../llm/route-decision.js';
637
- import type { ReasoningLevel } from '../user-config.js';
602
+ import { streamLLM, anyProviderAvailable, getProviderForConfig, nextReasoningLevel, reasoningLevelLabel, effectiveReasoningLevel, modelSupportsReasoning, type LLMMessage, type LLMToolSpec } from '../llm.js';
603
+ import { currentRouteDecision, formatRouteDecisionSummary } from '../llm/route-decision.js';
604
+ import { resolveDashboardActiveModel } from './acp-active-model.js';
638
605
  import { getModelFamily, getModelTier } from '../models/prompts.js';
639
606
  import { buildPromptInjection, getPromptBankStore } from '../prompt-bank/index.js';
640
- import { getInputHistoryStore, inputHistoryDbPath, inputHistoryJsonPath } from '../input-history.js';
607
+ import { getInputHistoryStore } from '../input-history.js';
641
608
  import { inspectActiveProvider } from '../provider-summary.js';
609
+ import { createStatusProviderInfoReader } from '../status/status-provider-info.js';
642
610
  import { activeCodexAccountView } from '../oauth/codex-account-store.js';
643
- import { buildDashboardStatusLines } from './dashboard-status-lines.js';
644
- import { readSlashContextNow, seatsNowLine } from '../context-bus/context-now-surfaces.js';
611
+ import { buildDashboardStatusLines, readDashboardSeatsNow, type DashboardStatusLinesInput } from './dashboard-status-lines.js';
645
612
  import { buildFirstScreenBand, resolveTuiDaemonLink, type TuiDaemonLink } from './first-screen-band.js';
646
613
  import { detectLocale } from '../expression/locale.js';
647
614
  import { runNexusShow, type NexusShowResult } from '../cli/nexus-show.js';
648
615
  import {
649
- workingDirSegment, sessionCwdSegment, modelSegment, gitSegment,
650
- ctxBarSegment, costSegment, speedSegment, elapsedSegment, cacheSegment,
651
- ptyShellCountSegment,
652
- voiceCostSegment,
653
616
  type GitSegmentState,
654
617
  } from '../status/bar.js';
655
618
  // PR-S1V.5 — voice month-to-date USD pill on the secondary status row.
656
619
  // The tracker is process-wide so the same singleton is read here and
657
620
  // updated by `voice-input-bridge.transcribe` (TUI path) + daemon REST
658
621
  // handler (PWA path).
659
- import { globalVoiceCostTracker } from '../voice/cost-tracker.js';
660
622
  import { createDashboardMouseWiring } from './input/mouse-wiring.js';
661
623
  import { createMouseConversationPopupRuntime } from './input/mouse-conversation-popup-runtime.js';
662
624
  import { createMouseModalHitRuntime } from './input/mouse-modal-hit-runtime.js';
@@ -740,7 +702,7 @@ import { createDashboardContextMenuFeedbackRuntime } from './context-menu-feedba
740
702
  import { createDashboardStatusFeedbackRuntime } from './status-feedback-runtime.js';
741
703
  import { createDashboardTransferFeedbackRuntime } from './transfer-feedback-runtime.js';
742
704
  import { createDashboardFinderFeedbackRuntime } from './finder-feedback-runtime.js';
743
- import { createDashboardTermSlashRuntime } from './term-slash-runtime.js';
705
+ import { createDashboardTermSlashRuntime, resolveTuiShellSeat } from './term-slash-runtime.js';
744
706
  import { createDashboardShellSlashRuntime } from './shell-slash-runtime.js';
745
707
  import { createDashboardRunSkillSlashRuntime } from './run-skill-slash-runtime.js';
746
708
  import { createDashboardSkillTriggersSlashRuntime } from './skill-triggers-slash-runtime.js';
@@ -790,7 +752,6 @@ import { createPfcScreenshotAttacher, type PfcScreenshotAttacher } from '../cond
790
752
  import { createStatusShellPostureRuntime } from './status-shell-posture-runtime.js';
791
753
  import { createTerminalHostFacade } from '../shell-runner/terminal-host-facade.js';
792
754
  import {
793
- buildTerminalMouseIntentEvent,
794
755
  interpretTerminalSurfaceIntent,
795
756
  } from './terminal-surface-intent.js';
796
757
  import {
@@ -821,15 +782,12 @@ import { bootDashboardApproverRuntimes } from './approver-runtime-boot.js';
821
782
  import { bootDashboardCaptureSourceProviders } from './capture-source-provider-boot.js';
822
783
  import { bootDashboardContextMenuProviders } from './context-menu-provider-boot.js';
823
784
  import { bootDashboardContextMenuRegistry } from './context-menu-registry-boot.js';
824
- import { buildPillMenu } from '../ui/context-menu-registry.js';
825
- import { createActionPickerRecipe } from '../mouse-action-recipes.js';
826
- import type { PopupPlacement } from '../ui/chrome/picker-popup-placement.js';
827
- import { deriveSubmenuPopupRoleTheme } from '../ui/submenu-popup-theme.js';
828
785
  import { bootDashboardContextRuntime } from './context-runtime-boot.js';
829
786
  import { bootDashboardContextWindowRuntime } from './context-window-runtime-boot.js';
830
787
  import { bootDashboardEagerTools } from './eager-tool-boot.js';
831
788
  import { bootDashboardEmbodiedTools } from './embodied-tools-boot.js';
832
789
  import { bootDashboardHitl } from './hitl-boot.js';
790
+ import { bootBannerStatusLines, normalizeBootBannerMode, renderMinimalBootBand, type BootBannerHeld } from './boot-banner.js';
833
791
  import { attachDashboardFilePathToken } from './file-path-attachment.js';
834
792
  import { bootDashboardSlashExecutor } from './slash-executor-boot.js';
835
793
  import { buildDashboardSlashRegistry, type DashboardSlashContext } from './slash-runtime/index.js';
@@ -880,14 +838,14 @@ import {
880
838
  } from '../dashboard-pane-context-menu.js';
881
839
  // writeClipboard imported below with other clipboard helpers (line ~185).
882
840
  import {
883
- renderPaneNav, paneAtColumn, paneNavLabel,
841
+ paneAtColumn, paneNavLabel,
884
842
  type PaneNavHitArea,
885
843
  } from './panes/nav.js';
886
844
  import { getSessionCwd, setSessionCwd, subscribeSessionCwd, pickSwdTargetFromBrowser } from '../session/working-dir.js';
887
845
  import {
888
846
  getGitStatusView,
889
847
  subscribeGitChanges,
890
- refreshDirty as refreshGitDirty,
848
+ refreshDirtyAsync as refreshGitDirtyAsync,
891
849
  } from '../git-fs/index.js';
892
850
  import { getPty, listPty, requestPtyTakeover } from '../pty-shell/registry.js';
893
851
  import { listPtyManifestRowsAt } from '../pty-shell/pty-manifest.js';
@@ -899,16 +857,13 @@ import { formatPtyCallLine, formatPtyResultLine } from '../pty-activity-log.js';
899
857
  import { getSessionMetrics } from '../status/metrics.js';
900
858
  import {
901
859
  createContextRegistry, tokenizeInput, pruneUnreferenced,
902
- addAttachment as ctxAdd,
903
860
  addAttachmentEx as ctxAddEx,
904
- clearAll as ctxClearAll, clearLarge as ctxClearLarge,
905
861
  dropAttachment as ctxDrop, listAttachments as ctxList,
906
862
  totalContextBytes as ctxTotalBytes,
907
- DEFAULT_LARGE_THRESHOLD_BYTES,
908
863
  type Attachment,
909
864
  } from '../context.js';
910
865
  import { loadAllAttachments } from '../extractors.js';
911
- import { grabClipboardImage, pruneOldPastes, isClipboardSupported, writeClipboard, writeClipboardDetailed, hasClipboardImage } from '../clipboard/index.js';
866
+ import { grabClipboardImage, pruneOldPastes, isClipboardSupported, writeClipboard, writeClipboardDetailed } from '../clipboard/index.js';
912
867
  import { startClipboardHistory, type ClipboardHistory } from '../clipboard/history.js';
913
868
  import { renderImagePreview } from '../image/preview.js';
914
869
  import { isKgpTerminal } from '../kgp/capabilities.js';
@@ -917,23 +872,19 @@ import { _internal as previewRouterInternal } from '../preview/router.js';
917
872
  import { showPreviewModal } from './modals/preview.js';
918
873
  import { terminalModalRouter } from './input/terminal-modal-router.js';
919
874
  import {
920
- computeDashboardViewMode,
921
875
  syncDashboardViewModeToContextKeys,
922
876
  type DashboardViewModeSignals,
923
877
  } from './runtime/view-mode.js';
924
878
  import { IDLE_VIEW_MODE, type ViewMode } from '../input-core/view-mode.js';
925
- import { createInteractiveTerminalModal } from '../interactive-terminal-modal.js';
926
879
  import { showToast } from './render/toast.js';
927
880
  import {
928
881
  browserWidgetInstanceIdForView,
929
- shortcutFor,
930
882
  } from './modals/pane.js';
931
883
  import { showTransientTerminalModal, currentTransientTerminalModal } from './modals/transient.js';
932
- import { showPaneMultiModal, showLivePaneMultiModal, currentPaneMultiModal, type PaneMultiModalHandle } from './modals/pane-multi.js';
884
+ import { showLivePaneMultiModal, type PaneMultiModalHandle } from './modals/pane-multi.js';
933
885
  import {
934
886
  resolveCompanionPopupChrome,
935
887
  resolveCompanionPopupTitleControls,
936
- resolveWindowScopedCompanionPopupChrome,
937
888
  } from './modals/companion-popup-chrome.js';
938
889
  import {
939
890
  resolveDebugPaneMultiChrome,
@@ -951,30 +902,22 @@ import {
951
902
  BroadcastBus,
952
903
  PreviewSlotAdapter,
953
904
  getChannelBus,
954
- type TerminalPlacement,
955
905
  } from '../terminal-matrix/index.js';
956
- import { resolveTerminalMoveDestination } from '../terminal-matrix/mobility.js';
957
906
  import { initElementObservability } from '../element-registry/index.js';
958
907
  import {
959
- armSessionQuickControl,
960
908
  createSearchPlannerState,
961
909
  buildSessionRuntimeToolSpecs,
962
910
  buildSessionDashboardStatusLines,
963
- buildSessionSurfaceStatusLines,
964
911
  consumeSessionQuickControl,
965
912
  createSessionPostureState,
966
913
  enterSessionControlMode,
967
914
  exitSessionControlMode,
968
915
  isSessionControlActive,
969
916
  routeDevHarnessSubmitIntent,
970
- parseSessionControlSlash,
971
- parseSessionSurfaceSlash,
972
917
  resolveSessionInputModeFromChatMode,
973
918
  resolveSessionModeSnapshot,
974
919
  resolveSessionSurfaceStatus,
975
- setSessionPreferredSurface,
976
920
  toggleSessionControlMode,
977
- type SearchPlannerState,
978
921
  } from '../session-runtime/index.js';
979
922
  import {
980
923
  initDashboardApprovers,
@@ -987,12 +930,13 @@ import {
987
930
  bootDashboardAcpSession,
988
931
  deriveDaemonHttpBase,
989
932
  fetchDaemonSessionHistory,
990
- fetchDaemonSessionList,
991
933
  } from './acp-boot.js';
992
934
  import { renderReplayPreviewLines } from './replay-preview.js';
993
935
  import {
994
936
  buildDashboardTurnPreamble,
995
937
  } from './turn-preamble.js';
938
+ import { describeSeatBoot, startSeatBootConversation } from './seat-boot-preamble.js';
939
+ import { ensureSeatLocalInstructions, installSeatSessionRecorder } from './seat-local-instructions.js';
996
940
  import type { DashboardSession } from '../tui-client/dashboard-session.js';
997
941
  import type { SessionTurnProfile } from '../session-runtime/index.js';
998
942
  import { createCompanionSurfaceHostRegistry } from './companion-surface-host-registry.js';
@@ -1021,7 +965,6 @@ import {
1021
965
  } from '../display/workspace-affinity.js';
1022
966
  import { initDashboardHitl, stopDashboardHitl } from './runtime/hitl.js';
1023
967
  import { openDashboardShellRollupPopup } from './shell-rollup-popup.js';
1024
- import { expandPromptReferences } from '../prompt/references.js';
1025
968
  import { spawnCodingAgent, CodingAgentBinaryMissing } from '../terminal/coding-agent.js';
1026
969
  import type { TerminalSession } from '../terminal/session-registry.js';
1027
970
  import { createSessionPickerModal } from '../session/picker-modal.js';
@@ -1031,15 +974,13 @@ import { listSessions as listChatSessionsForResume, adoptSession as adoptChatSes
1031
974
  // 영속은 세션 스토어(forkSessionFromHistory)가 담당한다.
1032
975
  import { userMessagePositions, truncateBeforeNthUser } from '../acp/session-fork.js';
1033
976
  import { resolveEscEscRewind } from '../chat/esc-esc-rewind.js';
1034
- import { wirePersistence, loadPersistedSessions } from '../terminal/session-persistence.js';
977
+ import { wirePersistence } from '../terminal/session-persistence.js';
1035
978
  import { renderMarkdown as renderMarkdownGlow } from '../markdown-preview.js';
1036
979
  import { basename, dirname } from 'path';
1037
980
  import { statSync } from 'fs';
1038
981
  import {
1039
- FIGURES, applyColor, toolHeader, toolResult, toolBlock,
1040
- renderTable, renderMarkdown, successLine, errorLine, warningLine,
1041
- sectionHeader, progressIndicator, renderTaskStatus,
1042
- type StatusColor, type TaskStatus,
982
+ FIGURES, toolHeader, toolResult,
983
+ renderMarkdown, successLine, errorLine, warningLine,
1043
984
  } from '../render.js';
1044
985
  import type { SyncMode } from '../types.js';
1045
986
  import type { ChatMessage } from '../chat/index.js';
@@ -1047,12 +988,12 @@ import type { PlainTurnSubmit } from '../input/turn-submit.js';
1047
988
  // U-4.2 · `renderLogPane` no longer called from dashboard directly —
1048
989
  // wd-log widget owns log rendering via renderLogViaWidget. Only
1049
990
  // `findBlock` still used here (chat-input block navigation).
1050
- import { findBlock } from '../panes/log-pane.js';
991
+ import { findBlock, logPaneContentHeight, maxLogPaneScroll, visibleSearchRowOffset } from '../panes/log-pane.js';
1051
992
  import { createQuitConfirmationState, gracefulQuit, type QuitConfirmationState } from './graceful-quit.js';
1052
- import { enqueuePendingUserInput } from '../session/pending-input.js';
993
+ import { handoffTurnTypeaheadAtTurnEnd, releaseTurnTypeaheadPending, steerLastTurnTypeaheadSubmission } from './input/turn-steer-bridge.js';
1053
994
  import { createAttachmentRowMap } from '../log-pane/attachment-row-map.js';
1054
995
  import { createAttachmentPopup, type AttachmentPopupAction } from '../log-pane/attachment-popup.js';
1055
- import { findLogMatches, type LogSearchResult } from '../log-pane/search.js';
996
+ import { findLogMatches, findVisibleLogMatches, type LogSearchResult } from '../log-pane/search.js';
1056
997
  import { createLogSearchModal, type LogSearchModalOpts } from '../log-pane/search-modal.js';
1057
998
  // U-4.3 · direct imports of tryAttachmentHitAtBodyRow /
1058
999
  // tryHandleLogAreaClick are gone · wd-log.onMouse owns the hit-test.
@@ -1111,7 +1052,6 @@ import {
1111
1052
  } from '../skills/tools/dashboard-config.js';
1112
1053
  import {
1113
1054
  initDashboardWidgetTools,
1114
- type WidgetInfo,
1115
1055
  } from '../skills/tools/dashboard-widget.js';
1116
1056
  import { initWidgetInspectorTools } from '../skills/tools/widget-inspector.js';
1117
1057
  import {
@@ -1124,7 +1064,6 @@ import {
1124
1064
  } from '../agent/spawn-embodied-agent-in-vw.js';
1125
1065
  import { findSessionObserver } from '../agent/observer-registry.js';
1126
1066
  import {
1127
- conversationHoverHudLabel,
1128
1067
  conversationModalTitle,
1129
1068
  conversationModalWidgetId,
1130
1069
  findConversationSessionEntry,
@@ -1170,10 +1109,10 @@ import {
1170
1109
  import { computeWorkingFocusSync } from '../display/working-focus-sync.js';
1171
1110
  import { dispatchPaneClick } from '../display/pane-click-dispatch.js';
1172
1111
  import { installResizeListener } from '../display/resize-listener.js';
1173
- import { isPtyForwardMouseEventType, type KeyEvent as DisplayKeyEvent } from '../display/types.js';
1112
+ import { isPtyForwardMouseEventType } from '../display/types.js';
1174
1113
  import { createDisplayEventBus } from '../display/events.js';
1175
1114
  import { agentBatchScratchTitle, renderAgentBatchScratch } from '../display/agent-batch.js';
1176
- import { createExecutionSurface, type ExecutionSurfaceHandle } from '../display/index.js';
1115
+ import { type ExecutionSurfaceHandle } from '../display/index.js';
1177
1116
  import { AgentSurfaceStore, renderAgentDetail, renderAgentRoster, type AgentSurfaceState } from '../display/agent-surface.js';
1178
1117
  import { globalAgentFlash } from '../display/agent-flash.js';
1179
1118
  import { renderDebugEventDetail, renderDebugEventRows, renderDebugStack, renderPromptInjectionDebug } from '../display/debug-surface.js';
@@ -1196,9 +1135,9 @@ export function registerDashboardCoreHostTools(host: Pick<PluginHost, 'registerH
1196
1135
  }
1197
1136
  }
1198
1137
  import { registerDashboardPaneHostTools } from './panes/host-tools.js';
1199
- import { DEFAULT_THEME_TOKENS, mergeThemeTokens, resolveThemeTokens, type ThemeTokenInput, type ThemeTokens } from '../theme/tokens.js';
1200
- import { resolveActiveTheme, setActivePresetInConfig } from './render/theme-resolver.js';
1201
- import { getTheme, listThemes } from '../themes/index.js';
1138
+ import { type ThemeTokens } from '../theme/tokens.js';
1139
+ import { resolveActiveTheme } from './render/theme-resolver.js';
1140
+ import { getTheme } from '../themes/index.js';
1202
1141
  import type { PaneFocus, PreviewSource, WorkingDirView } from '../workspace-types.js';
1203
1142
  import type { DisplayMouseEvent } from '../display/types.js';
1204
1143
  import type { Key as TuiKey } from '../tui.js';
@@ -1215,7 +1154,6 @@ import {
1215
1154
  readDirEntries,
1216
1155
  sortEntries,
1217
1156
  splitAtPrefix,
1218
- dirname as wdDirname,
1219
1157
  type WorkingDirState,
1220
1158
  type FsEntry,
1221
1159
  } from '../working-dir/index.js';
@@ -1225,8 +1163,6 @@ import {
1225
1163
  resolveBrowserActionContextFromHit,
1226
1164
  } from '../browser-pane/actions.js';
1227
1165
  import { resolveBrowserTransferCapability } from '../browser-pane/capabilities.js';
1228
- import { openBrowserPaneModal } from '../browser-pane/mount.js';
1229
- import { openPreviewPaneModal } from '../preview-pane/mount.js';
1230
1166
  import {
1231
1167
  cyclePreviewSourceForView,
1232
1168
  formatPreviewSourceLabel,
@@ -1239,7 +1175,7 @@ import {
1239
1175
  } from '../preview-pane/model.js';
1240
1176
  import { PreviewPaneRegistry } from '../preview-pane/registry.js';
1241
1177
  import { FileIndexCache, absolutize } from '../file-index.js';
1242
- import { firstPaneOfView, paneSetForView } from '../working-dir/focus.js';
1178
+ import { firstPaneOfView } from '../working-dir/focus.js';
1243
1179
  import { applyVisibleFocusRepair } from './focus-repair.js';
1244
1180
  import {
1245
1181
  nextVisiblePaneFocus,
@@ -1250,11 +1186,7 @@ import {
1250
1186
  } from '../views/pane-policy.js';
1251
1187
  import {
1252
1188
  autoTabletModeForViewport,
1253
- orderDashboardViewsForCompactMode,
1254
1189
  effectiveChatOnlyModeForViewport,
1255
- orderSurfaceCatalogForCompactMode,
1256
- pruneDashboardViewsForCompactMode,
1257
- pruneSurfaceCatalogForCompactMode,
1258
1190
  productCompactModeForViewport,
1259
1191
  } from '../views/product-compact-mode.js';
1260
1192
  import { readScopedRenderLogs, resolveRenderSuppressed, readScopedDebugLevel, resolveStartupDebugLevel, hotPathGateOpen } from '../mss/logging/scoped-level.js';
@@ -1265,7 +1197,6 @@ import {
1265
1197
  compileDashboardViewLayout,
1266
1198
  describeDashboardViewsForPrompt,
1267
1199
  findDashboardView,
1268
- nextDashboardView,
1269
1200
  panesForDashboardView,
1270
1201
  serializeDashboardViewsConfig,
1271
1202
  validateDashboardViewsConfig,
@@ -1345,6 +1276,8 @@ import {
1345
1276
  type SpaceLongPressDetector,
1346
1277
  } from './input/space-longpress-detector.js';
1347
1278
  import { isAllowlistedDictationSurface } from './input/dictation-surface-allowlist.js';
1279
+ import { createDashboardExternalInputHost } from './input/external-input-host.js';
1280
+ import { registerExternalInputHost } from '../input/external-input-queue.js';
1348
1281
  // H3 #6 follow-up #3 — background sessions render as a distinct sidebar
1349
1282
  // kind with live state badge + tap-to-Join. Dashboard pulls BG records
1350
1283
  // through backgroundToStub + maps state via bgStateToSessionStatus,
@@ -1932,6 +1865,17 @@ export function renderDashboardFirstScreenBand(input: {
1932
1865
  return Promise.all([linkPending, pwaPending]).then(() => {});
1933
1866
  }
1934
1867
 
1868
+ /** The /status reader used by the live dashboard slash callback. */
1869
+ export function renderDashboardStatusLines(input: Omit<DashboardStatusLinesInput, 'seatsNow'>, now = Date.now()): string[] {
1870
+ let seatsNow: string | null = null;
1871
+ try {
1872
+ seatsNow = readDashboardSeatsNow(now);
1873
+ } catch (error) {
1874
+ debug.log('dashboard.status', 'seats-unreadable', { error: String(error) });
1875
+ }
1876
+ return buildDashboardStatusLines({ ...input, seatsNow });
1877
+ }
1878
+
1935
1879
  export async function showDashboard(opts: ShowDashboardOptions = {}): Promise<DashboardAction> {
1936
1880
  let firstDashboardFrameRendered = false;
1937
1881
  await awaitGlobalPersonaLoad().catch(() => {});
@@ -2594,9 +2538,17 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
2594
2538
  };
2595
2539
  const clearLogFilter = (): void => {
2596
2540
  logFilterQuery = '';
2541
+ if (logSearchQuery) {
2542
+ logSearchResults = findLogMatches(chatLines, logSearchQuery);
2543
+ logSearchCursor = Math.min(logSearchCursor, Math.max(0, logSearchResults.length - 1));
2544
+ }
2597
2545
  };
2598
2546
  const applyLogFilter = (query: string): void => {
2599
2547
  logFilterQuery = query.trim();
2548
+ if (logSearchQuery) {
2549
+ logSearchResults = findVisibleLogMatches(chatLines, logSearchQuery, logFilterQuery);
2550
+ logSearchCursor = Math.min(logSearchCursor, Math.max(0, logSearchResults.length - 1));
2551
+ }
2600
2552
  if (debug.enabled) {
2601
2553
  debug.log('log-pane.filter.apply', `q="${logFilterQuery}"`, {
2602
2554
  active: logFilterQuery.length > 0,
@@ -2606,7 +2558,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
2606
2558
  const applyLogSearch = (query: string): void => {
2607
2559
  logSearchQuery = query.trim();
2608
2560
  logSearchResults = logSearchQuery
2609
- ? findLogMatches(chatLines, logSearchQuery)
2561
+ ? findVisibleLogMatches(chatLines, logSearchQuery, logFilterQuery)
2610
2562
  : [];
2611
2563
  logSearchCursor = 0;
2612
2564
  if (debug.enabled) {
@@ -2618,13 +2570,18 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
2618
2570
  /** Center the viewport on a search-result line. Sets chatScrollOffset
2619
2571
  * so the match row lands mid-pane when possible; clamps at bounds. */
2620
2572
  const scrollToSearchResult = (result: LogSearchResult): void => {
2573
+ // An explicit search may jump to output that arrived while the pane
2574
+ // was frozen. Release that snapshot before computing the row bound.
2575
+ if (logFrozenTailIndex !== null && result.lineIdx >= logFrozenTailIndex) {
2576
+ logFrozenTailIndex = null;
2577
+ }
2621
2578
  const { rows: tr } = termSize();
2622
2579
  const sH = computeLogH(tr);
2623
- const bodyH = Math.max(0, sH - 1);
2624
2580
  const hasFooter = chatFooterLine.current != null && chatFooterLine.current !== '';
2625
- const contentH = Math.max(0, bodyH - (hasFooter ? 2 : 0));
2626
- const target = Math.max(0, result.lineIdx - Math.floor(contentH / 2));
2627
- const maxScroll = Math.max(0, chatLines.length - contentH);
2581
+ const hasQueueRow = hasFooter && !!renderTurnTypeaheadQueueRow(turnTypeaheadRef.state, Math.max(20, termSize().cols - 6));
2582
+ const contentH = logPaneContentHeight(sH, hasFooter, hasQueueRow);
2583
+ const target = Math.max(0, visibleSearchRowOffset(chatLines, result, logFilterQuery) - Math.floor(contentH / 2));
2584
+ const maxScroll = logScrollMax(sH);
2628
2585
  chatScrollOffset = target >= maxScroll ? -1 : target;
2629
2586
  // Entering a scrolled state may set the freeze — the
2630
2587
  // handleLogPaneKey transition only fires for user keystrokes, so
@@ -3416,6 +3373,16 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
3416
3373
  // indicator below the scrolling log body. Mutated by startPinnedThinking
3417
3374
  // via this ref. `null` = no footer, body uses full log height.
3418
3375
  const chatFooterLine: { current: string | null } = { current: null };
3376
+ const logScrollMax = (height: number): number => {
3377
+ const hasFooter = chatFooterLine.current != null && chatFooterLine.current !== '';
3378
+ const hasQueueRow = hasFooter && !!renderTurnTypeaheadQueueRow(turnTypeaheadRef.state, Math.max(20, termSize().cols - 6));
3379
+ return maxLogPaneScroll(chatLines, height, {
3380
+ filterQuery: logFilterQuery,
3381
+ frozenTailIndex: logFrozenTailIndex,
3382
+ hasFooter,
3383
+ hasQueueRow,
3384
+ });
3385
+ };
3419
3386
  const disposeEventLoopStallMonitor = startEventLoopStallMonitor({
3420
3387
  getContext: () => ({
3421
3388
  streamingInFlight,
@@ -3538,21 +3505,11 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
3538
3505
  * actual view model instead of drifting toward an old 60/40 guess.
3539
3506
  */
3540
3507
  const dashboardState = new DashboardStateStore();
3541
- const getFallbackPromptFrame = (termRows: number) =>
3542
- dashboardState.getFallbackPromptFrame(termRows);
3543
3508
  const getLayoutPromptFrame = (termRows: number): PromptFrame =>
3544
3509
  dashboardState.getLayoutPromptFrame(termRows);
3545
3510
  const currentPromptFrame = (termRows = termSize().rows): PromptFrame =>
3546
3511
  dashboardState.getCurrentPromptFrame(termRows);
3547
3512
 
3548
- /** Rows taken up by everything BELOW the log zone (hud excluded — it
3549
- * sits between grid and log, and is reserved separately when the
3550
- * grid is present). Used to compute paneH below and to size the
3551
- * embedded grid when logEmbedded=true. Must match the number of
3552
- * rows pushed by zones 'input-divider-upper' through 'dock'. */
3553
- const bottomFixedRows = (inputHeight: number) =>
3554
- bottomFixedRowsForPromptFrame(inputHeight);
3555
-
3556
3513
  /** Compute paneH (height reserved for the top pane/grid in
3557
3514
  * non-chat-only, non-embedded modes) given termRows. Factored out
3558
3515
  * so layoutTools.getCurrentLayout can reuse the same math. */
@@ -3687,6 +3644,9 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
3687
3644
  // The ACP bridge is created later during dashboard boot. Keep status renders
3688
3645
  // safe before then, and bind this reader once the bridge exists.
3689
3646
  let activeAcpRuntimeModel = (): string | undefined => undefined;
3647
+ // 상태줄은 provider·model 만 쓴다 — 렌더마다 inspectActiveProvider(자격·authDetail 동기 읽기)를 안 부른다.
3648
+ const readStatusProviderInfo = createStatusProviderInfoReader();
3649
+ const runningBuildStatus = createRunningBuildStatus();
3690
3650
  /** Primary pill row — wd · git · provider/model · elapsed.
3691
3651
  * MX11b — delegates to mouseWiring.buildStatusLine so pill column
3692
3652
  * bounds are captured as a side effect; the return string is
@@ -3714,7 +3674,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
3714
3674
  return mouseWiring.buildStatusLine({
3715
3675
  swd,
3716
3676
  gitState,
3717
- providerInfo: inspectActiveProvider(undefined, activeAcpRuntimeModel()),
3677
+ providerInfo: readStatusProviderInfo(activeAcpRuntimeModel()),
3718
3678
  contextUsedTokens: metrics.lastContextUsed,
3719
3679
  tmuxLabel: tmuxStatusLabel,
3720
3680
  sshLabel: sshStatusLabel,
@@ -3736,44 +3696,12 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
3736
3696
  // dashboardVoiceChat.onPhaseChange). The status-bar pill is
3737
3697
  // intentionally null so we don't render the same state twice.
3738
3698
  voiceLabel: null,
3699
+ runningBuild: runningBuildStatus(),
3739
3700
  theme,
3740
3701
  });
3741
3702
  } catch { return ''; }
3742
3703
  };
3743
3704
 
3744
- /** Secondary metrics row — CTX bar · total cost · t/s · cache hit %.
3745
- * Reads from the session-metrics singleton populated by runTurn +
3746
- * dashboard streaming paths, plus the prompt-cache metrics
3747
- * singleton populated by onUsage. Renders an all-zero row when no
3748
- * turns have completed yet (matches Claude Code's "0k/N.Nk"
3749
- * placeholder). */
3750
- const buildSecondaryStatusLine = (): string => {
3751
- try {
3752
- const m = getSessionMetrics();
3753
- const theme = currentThemeTokens();
3754
- // Prompt-cache summary is ambient — import synchronously from a
3755
- // side-effect-free module; no fetch, no state beyond the session
3756
- // singleton that was already populated by onUsage events.
3757
- const { getSessionSummary } = require('../prompt-cache/metrics.js') as
3758
- typeof import('../prompt-cache/metrics.js');
3759
- const cachePct = getSessionSummary().hitRatePct;
3760
- // PR-S1V.5 — voice cost month-to-date pill. Reads the
3761
- // process-wide tracker that voice-input-bridge.transcribe and
3762
- // the daemon's /v1/voice/transcribe REST handler both write to,
3763
- // so the pill is the canonical view across surfaces. Empty
3764
- // string when nothing was spent this month.
3765
- const voiceMonthly = globalVoiceCostTracker().getMonthSummary().totalUsd;
3766
- const parts = [
3767
- ctxBarSegment(m.lastContextUsed, m.lastContextMax, 24),
3768
- costSegment(m.totalCostUsd, { theme }, m.unpricedTurns),
3769
- voiceCostSegment(voiceMonthly, { theme }),
3770
- speedSegment(m.lastTokensPerSec, { theme }),
3771
- cacheSegment(cachePct, { theme }),
3772
- ];
3773
- return parts.filter(Boolean).join(' ');
3774
- } catch { return ''; }
3775
- };
3776
-
3777
3705
  let draw: (opts?: { force?: boolean }) => void = () => {};
3778
3706
  let drawNow: (opts?: { force?: boolean }) => void = () => {};
3779
3707
  let drawQueued = false;
@@ -3930,9 +3858,6 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
3930
3858
  if (debug.enabled) {
3931
3859
  debug.log('status.shell-posture.boot', 'ready', statusShellPostureRuntime.current());
3932
3860
  }
3933
- const blankRows = (height: number, width: number): string[] => (
3934
- Array.from({ length: Math.max(0, height) }, () => ' '.repeat(Math.max(0, width)))
3935
- );
3936
3861
  // IUL Phase M (Bundle 1) → Phase S·a (Bundle 2) → Bundle 3 wiring.
3937
3862
  // Wraps the existing afterRender hook with composeIdentityHooks so
3938
3863
  // every modal-kind surface mount/dispose gets a stable ModalIdentity
@@ -4064,9 +3989,9 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
4064
3989
  // The 5s poll would eventually catch the change; forcing here
4065
3990
  // makes the "*N" suffix tick up within the same frame so the
4066
3991
  // user sees feedback for their own action immediately.
4067
- try {
4068
- refreshGitDirty(getSessionCwd(), { force: true });
4069
- } catch { /* noop */ }
3992
+ // TUI-TYPING-LAG — async probe: `git status` must not block key input.
3993
+ void refreshGitDirtyAsync(getSessionCwd(), { force: true })
3994
+ .then(() => { try { draw(); } catch { /* TUI torn down */ } }, () => { /* noop */ });
4070
3995
  });
4071
3996
  }
4072
3997
  // WD2 — session working directory subscription. Status bar pills
@@ -4098,10 +4023,8 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
4098
4023
  // Kick off the first dirty probe in the background so the
4099
4024
  // "*N" suffix appears on the first meaningful redraw. Throttle
4100
4025
  // handles repeated calls; we just fire-and-forget.
4101
- try {
4102
- refreshGitDirty(swd, { force: true });
4103
- try { draw(); } catch { /* noop */ }
4104
- } catch { /* noop */ }
4026
+ void refreshGitDirtyAsync(swd, { force: true })
4027
+ .then(() => { try { draw(); } catch { /* noop */ } }, () => { /* noop */ });
4105
4028
  };
4106
4029
  wireGitForSwd();
4107
4030
 
@@ -4130,14 +4053,15 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
4130
4053
  const gitDirtyTimer: ReturnType<typeof setInterval> = setInterval(() => {
4131
4054
  try {
4132
4055
  const before = getGitStatusView(getSessionCwd());
4133
- refreshGitDirty(getSessionCwd(), { minIntervalMs: 4_000 });
4134
- const after = getGitStatusView(getSessionCwd());
4135
- if (
4136
- (before.dirty?.total ?? -1) !== (after.dirty?.total ?? -1) ||
4137
- (before.aheadBehind?.ahead ?? -1) !== (after.aheadBehind?.ahead ?? -1)
4138
- ) {
4139
- try { draw(); } catch { /* noop */ }
4140
- }
4056
+ // TUI-TYPING-LAG — the 5s probe ran `git status` synchronously (130ms+, hundreds under load).
4057
+ void refreshGitDirtyAsync(getSessionCwd(), { minIntervalMs: 4_000 }).then((after) => {
4058
+ if (
4059
+ (before.dirty?.total ?? -1) !== (after.dirty?.total ?? -1) ||
4060
+ (before.aheadBehind?.ahead ?? -1) !== (after.aheadBehind?.ahead ?? -1)
4061
+ ) {
4062
+ try { draw(); } catch { /* noop */ }
4063
+ }
4064
+ }, () => { /* noop */ });
4141
4065
  } catch { /* noop */ }
4142
4066
  }, 5_000);
4143
4067
  (gitDirtyTimer as unknown as { unref?: () => void }).unref?.();
@@ -4398,6 +4322,9 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
4398
4322
  // requestConfirmation() / HitlConfirm tool reaches the iPhone.
4399
4323
  // Fire-and-forget: a listener start failure warns but doesn't
4400
4324
  // block dashboard init (HITL degrades to terminal-only / no-op).
4325
+ // #28 — the minimal boot banner holds healthy-boot rows for /status instead of the transcript.
4326
+ const bootBannerMode = normalizeBootBannerMode(getUserConfig().dashboard.bootBanner);
4327
+ const bootBannerHeld: BootBannerHeld = {};
4401
4328
  bootDashboardHitl({
4402
4329
  enabled: process.env['ELANOUS_HITL_DISABLE'] !== '1',
4403
4330
  initDashboardHitl,
@@ -4407,6 +4334,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
4407
4334
  try { return getPushcutClient().configured; } catch { return false; }
4408
4335
  },
4409
4336
  pushWarningLine: (message) => { chatLines.push(C.warning(message)); },
4337
+ holdWarningLine: bootBannerMode === 'minimal' ? (message) => { bootBannerHeld.hitl = message; } : undefined,
4410
4338
  draw: () => { draw(); },
4411
4339
  registerBeforeExit: (cb) => { process.once('beforeExit', cb); },
4412
4340
  warnConsole: (message) => { console.warn(message); },
@@ -4900,6 +4828,15 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
4900
4828
  inputCoreAddDefaultBinding({ matcher: 'ctrl+x s', actionId: 'mode.enter.sync' });
4901
4829
  inputCoreAddDefaultBinding({ matcher: 'ctrl+x c', actionId: 'mode.enter.control' });
4902
4830
  inputCoreAddDefaultBinding({ matcher: 'ctrl+x g', actionId: 'mode.enter.general' });
4831
+ // #19 — the log-pane `F` bulk fold toggle, shared by the input (`ctrl+x f`) and pane chords.
4832
+ const toggleAllLogFolds = (): void => {
4833
+ const changed = foldStack.toggleAll();
4834
+ debug.log('log.fold', 'toggle-all', { via: 'ctrl+x f', changed });
4835
+ if (changed === 0) pushDebugLine(C.muted('(nothing to fold/unfold)'));
4836
+ chatScrollOffset = -1;
4837
+ draw();
4838
+ };
4839
+ registerLogFoldInputBinding(toggleAllLogFolds);
4903
4840
 
4904
4841
  initTui(true);
4905
4842
 
@@ -6246,14 +6183,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
6246
6183
  const active = inspectActiveProvider(cfg);
6247
6184
  const reasoningProvider = (['openai-codex', 'openai', 'anthropic', 'gemini', 'grok', 'local', 'openrouter'] as const)
6248
6185
  .find(provider => active.provider === provider || active.provider === `auto:${provider}`);
6249
- let seatsNow: string | null = null;
6250
- try {
6251
- seatsNow = seatsNowLine(readSlashContextNow([]), Date.now());
6252
- } catch (error) {
6253
- debug.log('dashboard.status', 'seats-unreadable', { error: String(error) });
6254
- }
6255
- return buildDashboardStatusLines({
6256
- seatsNow,
6186
+ return renderDashboardStatusLines({
6257
6187
  provider: active.provider,
6258
6188
  model: active.model,
6259
6189
  reasoning: reasoningProvider
@@ -6263,6 +6193,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
6263
6193
  : undefined,
6264
6194
  daemonAddress: opts.remote?.url,
6265
6195
  daemonConnected: daemonAttached,
6196
+ bootHeld: bootBannerStatusLines(bootBannerHeld),
6266
6197
  accountName: active.provider === 'openai-codex' || active.provider === 'auto:openai-codex'
6267
6198
  ? activeCodexAccountView().name : undefined,
6268
6199
  sessionSurfaceLines: buildSessionDashboardStatusLines(resolveSessionSurfaceStatus({ chatModeState })),
@@ -6337,7 +6268,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
6337
6268
  const { rows: tr } = termSize();
6338
6269
  const sH = computeLogH(tr);
6339
6270
  const halfSH = Math.max(1, Math.floor(sH / 2));
6340
- const maxScr = Math.max(0, chatLines.length - sH);
6271
+ const maxScr = logScrollMax(sH);
6341
6272
  // Scroll keys → Scrollable behavior on wd-log. Sync pre/post.
6342
6273
  const SCROLL_KEYS = new Set([
6343
6274
  'j', 'k', 'down', 'up',
@@ -6528,6 +6459,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
6528
6459
  const chatLinesStartIndex = chatLines.length;
6529
6460
  userScrolledDuringStream = false;
6530
6461
  streamingInFlight = true;
6462
+ reportTuiTurn('busy');
6531
6463
  const SCROLL_KEYS = new Set(['j', 'k', 'down', 'up', 'pageup', 'pagedown', 'home', 'end', 'g', 'G']);
6532
6464
  // T3-B2: ESC abort gate. When the user hits Esc AND sub-agent
6533
6465
  // work is running, pop a confirmation modal before tearing down
@@ -6597,7 +6529,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
6597
6529
  const scrollLogBy = (delta: number): void => {
6598
6530
  const { rows: tr } = termSize();
6599
6531
  const sH = computeLogH(tr);
6600
- const maxScr = Math.max(0, chatLines.length - sH);
6532
+ const maxScr = logScrollMax(sH);
6601
6533
  const cur = chatScrollOffset < 0 ? maxScr : chatScrollOffset;
6602
6534
  let next = Math.max(0, Math.min(cur + delta, maxScr));
6603
6535
  if (delta > 0 && next >= maxScr) next = -1; // re-pin tail
@@ -6842,22 +6774,22 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
6842
6774
  },
6843
6775
  });
6844
6776
  if (queuedHistoryEntry) refreshInputHistory();
6845
- enqueuePendingUserInput(sid, queuedText, (drained) => {
6846
- // 배수된 만큼을 앞에서부터 떨어낸다(FIFO · 순서 보존).
6847
- const remaining = turnTypeaheadRef.state.queuedSubmissions.slice(drained.length);
6848
- turnTypeaheadRef.state = { ...turnTypeaheadRef.state, queuedSubmissions: remaining };
6849
- for (const text of drained) {
6777
+ // ⭐ 레지스트리 id 로 짝짓는다 — 배수·되꺼내기·턴 종료 승격이 같은 항목을 «한 번만» 보낸다.
6778
+ // ⛔ 슬래시는 안 넣는다(턴 종료 FIFO 로만 실행).
6779
+ steerLastTurnTypeaheadSubmission(turnTypeaheadRef, sid, ({ texts, remaining }) => {
6780
+ for (const text of texts) {
6850
6781
  echoSubmittedUserText(text, { live: true });
6851
6782
  debug.log('dashboard.turn-typeahead', 'echoed', { path: 'live', length: text.length });
6852
6783
  }
6853
- if (drained.length > 0) draw();
6784
+ if (texts.length > 0) draw();
6854
6785
  debug.log('dashboard.turn-typeahead', 'drained-into-live-turn', {
6855
- drained: drained.length, remaining: remaining.length,
6786
+ drained: texts.length, remaining,
6856
6787
  });
6857
6788
  });
6858
6789
  }
6859
6790
  }
6860
6791
  }
6792
+ if (r.releasedPendingIds) releaseTurnTypeaheadPending(r.releasedPendingIds, 'recalled');
6861
6793
  if (r.immediateSubmission) {
6862
6794
  turnTypeaheadRef.state = await dispatchStreamingTurnTypeaheadSubmission(
6863
6795
  turnTypeaheadRef.state,
@@ -7086,9 +7018,17 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
7086
7018
  return () => {
7087
7019
  cleanup();
7088
7020
  escGate.dispose();
7089
- if (!stoppedHarnessSpace) settleEscAbortPendingLines(chatLines, chatLinesStartIndex);
7090
- userScrolledDuringStream = false;
7091
- streamingInFlight = false;
7021
+ try {
7022
+ if (!stoppedHarnessSpace) settleEscAbortPendingLines(chatLines, chatLinesStartIndex);
7023
+ } catch (err) {
7024
+ const message = err instanceof Error ? err.message : String(err);
7025
+ const stackHead = err instanceof Error ? err.stack?.split('\n')[1]?.trim() : undefined;
7026
+ debug.log('dashboard.turn', 'settle-failed', { message, stackHead });
7027
+ } finally {
7028
+ userScrolledDuringStream = false;
7029
+ streamingInFlight = false;
7030
+ reportTuiTurn('idle');
7031
+ }
7092
7032
  };
7093
7033
  };
7094
7034
 
@@ -7332,9 +7272,6 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
7332
7272
  ?? viewRegistry.views[0]!;
7333
7273
  setActiveDashboardView(def);
7334
7274
  };
7335
- const reloadDashboardViews = (): void => {
7336
- applyDashboardViewsRuntime(getUserConfig().dashboard.views as any);
7337
- };
7338
7275
  const userClosedPanes = new Set<PaneFocus>();
7339
7276
  const closedPaneSet = (): ReadonlySet<PaneFocus> => {
7340
7277
  const closed = new Set(userClosedPanes);
@@ -8298,7 +8235,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
8298
8235
  }
8299
8236
  return;
8300
8237
  }
8301
- const maxScr = Math.max(0, chatLines.length - logViewport.height);
8238
+ const maxScr = logScrollMax(logViewport.height);
8302
8239
  const delta = m.type === 'scroll-up' ? -3 : 3;
8303
8240
  const before = chatScrollOffset;
8304
8241
  chatScrollOffset = Math.max(0, Math.min(
@@ -9367,24 +9304,6 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
9367
9304
  limit,
9368
9305
  });
9369
9306
  };
9370
- const describePaneStateForPrompt = (): string => {
9371
- const state = paneStateSnapshot();
9372
- const rows = state.panes.map(p => {
9373
- const bits = [
9374
- p.visible ? 'visible' : 'hidden',
9375
- p.closed ? 'closed' : '',
9376
- p.closeable ? 'closeable' : 'primary',
9377
- p.omittedReason ? `omitted=${p.omittedReason}` : '',
9378
- ].filter(Boolean).join(', ');
9379
- return `- ${p.pane}: ${bits}`;
9380
- });
9381
- return [
9382
- '## Dashboard Pane State',
9383
- '',
9384
- `Active view: ${state.activeViewId} "${state.viewLabel}" (baseView=${state.baseView}, compact=${state.compactLevel}, focus=${state.focused})`,
9385
- ...rows,
9386
- ].join('\n');
9387
- };
9388
9307
  // Surface-unification v2.2 V2.2-5 Part 2 (2026-05-11) — schedulerView
9389
9308
  // state · openSchedulerForm · activeSchedulerFormValue /
9390
9309
  // setActiveSchedulerFormValue · submitSchedulerForm 모두 폐기.
@@ -9446,11 +9365,6 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
9446
9365
  );
9447
9366
  };
9448
9367
 
9449
- // Plain row label used as the list widget's identity (selection
9450
- // matching, cursor display string). Kept ANSI-free so visibleWidth
9451
- // and the selected-set string lookup work correctly.
9452
- const fmtEntry = (e: FsEntry): string => e.isDir ? `${e.name}/` : e.name;
9453
-
9454
9368
  // Colored variant for the list widget's `items` array — yazi-style
9455
9369
  // accent for folders, per-extension fileColor for files. The list
9456
9370
  // widget renders these straight through when preserveAnsi is true.
@@ -9887,92 +9801,6 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
9887
9801
  );
9888
9802
  };
9889
9803
 
9890
- // ── Workspace context builder ──
9891
- // Emitted once per chat turn (prepended to the user message) so the
9892
- // LLM knows what widgets are currently on screen and how to write
9893
- // to them via layout_setWidgetState / layout_addWidget without
9894
- // having to probe layout_getState first. Kept compact — iteration
9895
- // order matches visual layout (top-to-bottom, left-to-right).
9896
- //
9897
- // Writable surfaces:
9898
- // wd-scratch — primary canvas for notes / reports. Persists
9899
- // until the user clears or switches to memo mode.
9900
- // wd-preview — secondary canvas. Persists until the user
9901
- // navigates to a different file in the browser
9902
- // (file nav overwrites, which is by design).
9903
- //
9904
- // Reserved (LLM writes rejected with a helpful error):
9905
- // wd-browser, wd-log — dashboard re-renders these every frame
9906
- // from its own buffers (file list, chat
9907
- // transcript). Use layout_addWidget to
9908
- // spawn a fresh widget the dashboard will
9909
- // NOT touch.
9910
- const buildWorkspaceContext = (): string => {
9911
- try {
9912
- const pluginLayout = pluginHost.activeLayout();
9913
- let layoutForCtx: Layout;
9914
- if (pluginLayout) {
9915
- layoutForCtx = pluginLayout;
9916
- } else {
9917
- const { cols, rows: tr } = termSize();
9918
- const promptFrame = getLayoutPromptFrame(tr);
9919
- const topHeight = computePromptFrameGridHeight(tr, promptFrame);
9920
- layoutForCtx = workingDirLayoutForView(cols - 1, topHeight);
9921
- }
9922
- const visibleWidgets: Array<{ id: string; type: string; title?: string }> = [];
9923
- for (const row of layoutForCtx.rows) {
9924
- for (const cell of row.cells) {
9925
- if (!cell.widgetInstanceId) continue;
9926
- const inst = widgetHost.get(cell.widgetInstanceId);
9927
- if (!inst) continue;
9928
- visibleWidgets.push({
9929
- id: inst.id,
9930
- type: inst.type,
9931
- title: inst.character || undefined,
9932
- });
9933
- }
9934
- }
9935
- if (visibleWidgets.length === 0) return '';
9936
- const rows = visibleWidgets.map(w => {
9937
- const tag =
9938
- w.id === 'wd-scratch' ? ' ← writable canvas; persistent'
9939
- : w.id === 'wd-preview' ? ' ← writable canvas; overwritten on file-nav'
9940
- : w.id === 'wd-browser' ? ' ← READ-ONLY (dashboard-managed file list)'
9941
- : w.id === 'wd-log' ? ' ← READ-ONLY (chat transcript)'
9942
- : w.id.startsWith('wd-debug-') ? ' ← READ-ONLY (debug event surface; use debug_* tools)'
9943
- : ' ← persistent (spawned by LLM)';
9944
- const label = w.title ? ` "${w.title}"` : '';
9945
- return `- ${w.id} (${w.type})${label}${tag}`;
9946
- }).join('\n');
9947
- return [
9948
- '## Current dashboard workspace',
9949
- '',
9950
- 'The following widgets are visible right now. You have three host-level tools to mutate the layout:',
9951
- '- `layout_getState` — refresh view of the grid.',
9952
- '- `layout_setWidgetState({id, patch})` — merge a patch into a widget\'s state. For markdown widgets patch `{text: "..."}`.',
9953
- '- `layout_addWidget({type, row, col, character, config})` — spawn a new widget; dashboard will NOT re-render its state.',
9954
- '',
9955
- rows,
9956
- '',
9957
- 'Writing rules:',
9958
- '- To SHOW the user multi-line output (notes, analyses, lists, reports), write to `wd-scratch` via `layout_setWidgetState({id:"wd-scratch", patch:{text:"<content>"}})`. The dashboard auto-reopens that pane if the user had it closed.',
9959
- '- For a secondary canvas (e.g. side-by-side comparison), write to `wd-preview` the same way.',
9960
- '- DO NOT write to `wd-browser` or `wd-log` — the dashboard rejects those patches with an error.',
9961
- '- DO NOT write to `wd-debug-*`; use `debug_getState`, `debug_getCallStack`, `debug_setLevel`, `debug_openView`, and `debug_selectEvent`.',
9962
- '- For your own persistent widget (won\'t be overwritten by anything), spawn with `layout_addWidget` and pick your own id.',
9963
- '',
9964
- describeDashboardViewsForPrompt(viewRegistry),
9965
- '',
9966
- describePaneStateForPrompt(),
9967
- ].join('\n');
9968
- } catch {
9969
- // Workspace snapshot is best-effort — a failure here must not
9970
- // break the chat turn. Return empty so the user message flows
9971
- // through unchanged.
9972
- return '';
9973
- }
9974
- };
9975
-
9976
9804
  // ── LLM layout tools (W5) ──
9977
9805
  // Host-level tools that let the chat LLM reshape the dashboard.
9978
9806
  // When a plugin is active the tools edit its layout directly; when
@@ -12811,43 +12639,6 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
12811
12639
  onContextMenuMouse: (ev) => ctxMenuWire.onMouse(ev),
12812
12640
  });
12813
12641
  };
12814
- const openBrowserOnlyModal = (): void => {
12815
- const { cols: tc, rows: tr } = termSize();
12816
- const liveMode = resolveBrowserPreviewModalLiveMode(process.env.ELANOUS_PANE_MODAL_LIVE);
12817
- void openBrowserPaneModal({
12818
- browserWidgetInstanceId: browserWidgetInstanceIdForView(workingDir.view),
12819
- liveMode,
12820
- browserPaneRegistry,
12821
- widgetHost,
12822
- coordinator: display,
12823
- termCols: tc,
12824
- termRows: tr,
12825
- captureSnapshot: () => captureDeferredPane('browser'),
12826
- theme: currentThemeTokens(),
12827
- fmtEntryColored,
12828
- iconForEntry,
12829
- onSubmit: dispatchSidebarSubmit,
12830
- onDispose: () => { draw(); },
12831
- onCancel: () => { draw(); },
12832
- });
12833
- };
12834
- const openPreviewOnlyModal = (): void => {
12835
- const { cols: tc, rows: tr } = termSize();
12836
- const liveMode = (process.env.ELANOUS_PANE_MODAL_LIVE ?? 'on').toLowerCase() !== 'off';
12837
- void openPreviewPaneModal({
12838
- preview: dockedPreview,
12839
- previewWidgetInstanceId: 'wd-preview',
12840
- liveMode,
12841
- widgetHost,
12842
- coordinator: display,
12843
- termCols: tc,
12844
- termRows: tr,
12845
- captureSnapshot: () => captureDeferredPane('preview'),
12846
- theme: currentThemeTokens(),
12847
- onDispose: () => { draw(); },
12848
- onCancel: () => { draw(); },
12849
- });
12850
- };
12851
12642
  registerDashboardGlobalKeys({
12852
12643
  enableSupplementalGlobalKeys: getUserConfig().dashboard.enableSupplementalGlobalKeys,
12853
12644
  register: (binding) => { display.registerKeyBinding(binding); },
@@ -13071,6 +12862,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
13071
12862
  repaint: () => void;
13072
12863
  insertAtCursor?: (text: string) => void;
13073
12864
  submit?: (request?: string | TextInputExternalSubmitRequest) => void;
12865
+ getBufferText?: () => string;
13074
12866
  } = { repaint: () => {} };
13075
12867
  repaintPromptAfterRender = () => {
13076
12868
  if (shouldSuppressDashboardBottomArea()) {
@@ -13094,6 +12886,13 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
13094
12886
  // safe. Dispose on process exit to keep the listener set clean.
13095
12887
  const disposeResizeListener = installResizeListener({ draw: (opts) => draw(opts), promptCtl });
13096
12888
  process.on('exit', disposeResizeListener);
12889
+ // 외부 주입(`pty text`)을 사용자 타이핑과 섞지 않고 별도 대기열로 — 결함 #6(10-14).
12890
+ const disposeExternalInputHost = registerExternalInputHost(createDashboardExternalInputHost({
12891
+ isTurnActive: () => streamingInFlight,
12892
+ promptCtl,
12893
+ pushNotice: (line) => { chatLines.push(C.muted(` ${line}`)); chatScrollOffset = -1; draw(); },
12894
+ }));
12895
+ process.on('exit', disposeExternalInputHost);
13097
12896
 
13098
12897
  const publishScratchSurface = (
13099
12898
  source: string,
@@ -13112,6 +12911,13 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
13112
12911
  const detailViewerRuntime = createDashboardDetailViewerRuntime({
13113
12912
  setOpen: (open) => { setCompanionPopupOpen('detail', open); },
13114
12913
  requestRender: () => { requestDashboardRender('detail'); },
12914
+ // 채팅 단독 화면에선 그리드 투영이 안 돌아 팝업이 «(no preview content)» 였다 — 그리기 전에 싣는다.
12915
+ project: (snapshot) => {
12916
+ const detailWidget = widgetHost.get('wd-detail') as WidgetInstance<Record<string, unknown>> | null;
12917
+ if (detailWidget?.state && typeof detailWidget.state === 'object') {
12918
+ companionWidgetRuntime.projectDetailWidget(detailWidget, snapshot);
12919
+ }
12920
+ },
13115
12921
  });
13116
12922
  const companionWidgetRuntime = createDashboardCompanionWidgetRuntime();
13117
12923
  const clipboardHistoryRuntime = createDashboardClipboardHistoryRuntime();
@@ -13801,6 +13607,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
13801
13607
  let session: TerminalSession;
13802
13608
  try {
13803
13609
  if (req.kind === 'shell') {
13610
+ const shellSeat = resolveTuiShellSeat(req.cwd, process.env.COORD_ID);
13804
13611
  session = sessionRegistry.spawn(
13805
13612
  {
13806
13613
  title: 'terminal',
@@ -13808,6 +13615,12 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
13808
13615
  command: req.command,
13809
13616
  env: req.env,
13810
13617
  kind: 'shell',
13618
+ useRegistry: true,
13619
+ registryKind: 'shell',
13620
+ registryNickname: `tui-shell:${req.cwd}`,
13621
+ registryOrigin: { originRoot: 'elanous-internal', controller: 'tui-shell' },
13622
+ registryPurpose: `tui-shell:${shellSeat}`,
13623
+ registrySeat: shellSeat,
13811
13624
  onExit: handleExit,
13812
13625
  onTitleAction: handleTitleAction,
13813
13626
  },
@@ -13899,8 +13712,8 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
13899
13712
  openInteractiveTerminalPopup,
13900
13713
  });
13901
13714
  const TerminalPopup = terminalPopupRuntime;
13902
- const spawnGlobalTerminalModal = (): void => {
13903
- terminalPopupRuntime.spawnGlobalTerminalModal(workingDir.cwd);
13715
+ const spawnGlobalTerminalModal = (command?: string): void => {
13716
+ openInteractiveTerminalPopup({ kind: 'shell', cwd: workingDir.cwd, command });
13904
13717
  };
13905
13718
 
13906
13719
  // E3 (2026-05-17) — copyLastAssistantTurnToClipboard /
@@ -14022,7 +13835,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
14022
13835
  },
14023
13836
  toggleLogZoom: () => { toggleChatOnlyLayout(); },
14024
13837
  copyLastBlock: copyLastAssistantTurnToClipboard,
14025
- spawnTerminalModal: spawnGlobalTerminalModal,
13838
+ spawnTerminalModal: () => spawnGlobalTerminalModal(),
14026
13839
  copyLogPane: copyLogPaneToClipboard,
14027
13840
  // Ctrl+L — 터미널 클리어 후 전체 강제 리페인트(resize 리스너와 동일 레시피).
14028
13841
  // 외부 출력/아티팩트로 더러워진 화면 복구용 · 대화(chatLines)는 보존.
@@ -14091,6 +13904,8 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
14091
13904
  },
14092
13905
  onPreviewTerminalExpandChanged: chordFeedbackRuntime.onPreviewTerminalExpandChanged,
14093
13906
  onMissingPreviewTerminal: chordFeedbackRuntime.onMissingPreviewTerminal,
13907
+ // #19 — Ctrl+X f from a pane; the input path is the `ctrl+x f` input-core binding.
13908
+ toggleAllFolds: toggleAllLogFolds,
14094
13909
  });
14095
13910
 
14096
13911
  // ══════════════════════════════════════════════════════════════
@@ -15369,6 +15184,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
15369
15184
  // adds turn concurrency must key this by turn (or session+turn) first.
15370
15185
  let acpTurnToolSpecs: LLMToolSpec[] = [];
15371
15186
  let acpDispatchToolSelf: CoreTurnDispatchTool | null = null;
15187
+ let acpToolDispatchCount = 0;
15372
15188
  const trMod = await import('../tool-runtime/index.js');
15373
15189
  trMod.registerAllDefaultToolRuntimes();
15374
15190
  acpToolRuntime = trMod;
@@ -15423,6 +15239,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
15423
15239
  modelFamily: getModelFamily(inspectActiveProvider().model),
15424
15240
  rich: false,
15425
15241
  enabledTools: tools.map(t => t.name),
15242
+ seatBoot: true,
15426
15243
  }),
15427
15244
  ];
15428
15245
  },
@@ -15452,35 +15269,16 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
15452
15269
  // Codex-first decision as every other surface. The core bridge now
15453
15270
  // supplies userText to resolveModel, preserving explicit pins and
15454
15271
  // making this the actual model override rather than a display hint.
15455
- getActiveModel: ({ userText }) => {
15456
- const cfg = getUserConfig();
15457
- const decision = resolveRouteDecision({
15458
- provider: cfg.llm.provider,
15459
- configuredModel: inspectActiveProvider().model,
15460
- text: userText,
15461
- routePolicy: cfg.llm.routePolicy,
15462
- });
15463
- // Badge truthfulness(2026-07-19 goal-exec) — resolveRouteDecision 의 codex
15464
- // tier-policy 브랜치는 curated effort(예: balanced=low)를 찍지만, codex provider 는
15465
- // 그 값을 wire 로 보내지 않는다: 실제 effort 는 effectiveReasoningLevel(cfg)(config
15466
- // 주도, reasoningLevel 미설정 시 model-default high). 그대로 두면 완료 뱃지가
15467
- // "terra(low)" 로 떠 사용자가 모델이 약하게 돈다고 오해한다(실제 high). 실제 wire
15468
- // effort 로 덮어써 뱃지를 진실하게. decision.effort 는 표시 전용이라 라우팅 무영향.
15469
- const trueEffort = effectiveReasoningLevel(cfg.llm, decision.provider, decision.model);
15470
- const badgedDecision = trueEffort && trueEffort !== 'off'
15471
- ? { ...decision, effort: trueEffort }
15472
- : decision;
15473
- recordCurrentRouteDecision('dashboard', badgedDecision);
15474
- if (debug.enabled) debug.log('llm.route-decision', 'dashboard-acp', {
15475
- provider: decision.provider, model: decision.model, mission: decision.mission, source: decision.source,
15476
- });
15477
- return decision.model || null;
15478
- },
15272
+ // 본체 = acp-active-model.ts(실물 경로를 시험이 그대로 부르도록 뺐다 · TUI-MODEL-SESSION-SCOPE).
15273
+ getActiveModel: ({ userText }) => resolveDashboardActiveModel(userText),
15479
15274
  // ⭐ The assignment is deliberate, not a typo: it captures a reference to
15480
15275
  // this very dispatcher so `agentDispatchTool` below can route a
15481
15276
  // sub-agent's tool calls back through it. A plain named const would need
15482
15277
  // the closure hoisted out of this literal; this keeps the diff local.
15483
15278
  dispatchTool: acpDispatchToolSelf = async (name, args, ctx) => {
15279
+ // Count at the server-side boundary, before any tool effect and
15280
+ // before the ACP notification can reach the TUI client.
15281
+ acpToolDispatchCount++;
15484
15282
  const runtime = acpToolRuntime;
15485
15283
  const persist = acpPersistToolOutputPreview;
15486
15284
  if (!runtime || !persist) {
@@ -15702,16 +15500,36 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
15702
15500
  }
15703
15501
  subscribeSessionCwd((state) => { pushProjectSuggestion(state.cwd); });
15704
15502
  chatScrollOffset = -1;
15705
- void renderDashboardFirstScreenBand({
15503
+ const firstScreenBandInput = {
15706
15504
  history: chat.history,
15707
15505
  lines: chatLines,
15708
15506
  width: Math.max(0, termSize().cols - 4),
15709
15507
  // The band ships ko/en only; any other detected locale keeps the English rows.
15710
- locale: detectLocale() === 'ko' ? 'ko' : 'en',
15508
+ locale: detectLocale() === 'ko' ? 'ko' as const : 'en' as const,
15711
15509
  draw: () => draw(),
15712
- observe: (data) => { try { debug.log('dashboard.first-screen-band', 'resolved', data); } catch { /* observation is best-effort */ } },
15713
- });
15510
+ observe: (data: { daemon: boolean; hasPwa: boolean; hasTailnet: boolean }) => { try { debug.log('dashboard.first-screen-band', 'resolved', data); } catch { /* observation is best-effort */ } },
15511
+ };
15512
+ void (bootBannerMode === 'full'
15513
+ ? renderDashboardFirstScreenBand(firstScreenBandInput)
15514
+ : renderMinimalBootBand({
15515
+ ...firstScreenBandInput,
15516
+ guidance: needsOnboarding(getUserConfig()),
15517
+ held: bootBannerHeld,
15518
+ show: () => runNexusShow({ format: 'json', out: { log: () => {}, error: () => {} } }),
15519
+ daemonLink: resolveTuiDaemonLink,
15520
+ styleFailure: (line) => C.warning(line),
15521
+ observeHeld: (data) => { try { debug.log('dashboard.first-screen-band', 'held', data); } catch { /* observation is best-effort */ } },
15522
+ }));
15714
15523
 
15524
+ // 🪪 L1 — 자리 부트(seat-boot-preamble.ts): 자리면 첫 화면에 한 줄.
15525
+ // 🪪 L2-lite(seat-local-instructions.ts): 자리 로컬 지시가 없으면 템플릿 생성(덮어쓰기 0) ⊕ 대화 끝 «지난 세션» 기록.
15526
+ const seatLocal = ensureSeatLocalInstructions(getSessionCwd());
15527
+ if (seatLocal.status === 'created') chatLines.push(C.muted(` 📝 자리 로컬 지시를 만들었다 — ${seatLocal.path} (사람이 고쳐도 된다)`));
15528
+ else if (seatLocal.status === 'exists' && seatLocal.missingPrinciple) chatLines.push(C.muted(` 💡 ${seatLocal.path} 에 제1원칙 절이 없다 — 넣을지 사람이 정한다(덮어쓰지 않음)`));
15529
+ installSeatSessionRecorder({ getCwd: () => getSessionCwd(), getHistory: () => chat.history });
15530
+ const seatBoot = describeSeatBoot(getSessionCwd());
15531
+ if (seatBoot) chatLines.push(C.muted(` 🪪 ${seatBoot.seat} 자리 · 안 읽은 우편 ${seatBoot.unread ?? '미관측'} — 부트 카드를 턴마다 싣는다`));
15532
+ if (dashboardAcpBootResult.mode !== 'resumed' && !opts.resumeSessionId) startSeatBootConversation({ reason: 'boot' });
15715
15533
  tuiSeatAskTimer = setInterval(pollTuiSeatAnswers, 10_000);
15716
15534
  tuiSeatAskTimer.unref();
15717
15535
  pollTuiSeatAnswers();
@@ -16696,7 +16514,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
16696
16514
  sync.cursors[sync.focus] = Math.max(0, Math.min(sync.cursors[sync.focus]! + delta, sync.lists[sync.focus]!.length - 1));
16697
16515
  } else if (mr > logViewport.startRow && mr <= logViewport.endRow) {
16698
16516
  // Scroll the log pane
16699
- const maxScr = Math.max(0, chatLines.length - logViewport.height);
16517
+ const maxScr = logScrollMax(logViewport.height);
16700
16518
  chatScrollOffset = Math.max(0, Math.min((chatScrollOffset < 0 ? maxScr : chatScrollOffset) + delta, maxScr));
16701
16519
  if (delta > 0 && chatScrollOffset >= maxScr) chatScrollOffset = -1;
16702
16520
  }
@@ -16771,17 +16589,19 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
16771
16589
  // 테스트가 그 순서를 다시 베껴야 하고, 베낀 테스트는 배선 회귀를 못 잡는다.
16772
16590
  const interrupted = lastTurnFinalStatus === 'interrupted';
16773
16591
  const queuedBeforeDrain = turnTypeaheadRef.state.queuedSubmissions.length;
16774
- const drained = drainTurnTypeaheadOnce(turnTypeaheadRef.state, nextInitial, { interrupted });
16592
+ // ⭐ 드레인 → 레지스트리 해제 → Enter 주입은 다리 모듈이 한 함수로 한다(시험이 같은 함수를 문다).
16593
+ const drained = handoffTurnTypeaheadAtTurnEnd(turnTypeaheadRef, nextInitial, { interrupted }, () => {
16594
+ injectKey({ name: 'enter', ctrl: false, shift: false });
16595
+ });
16775
16596
  lastTurnFinalStatus = undefined;
16776
- turnTypeaheadRef.state = drained.state;
16777
16597
  nextInitial = drained.nextInitial;
16778
16598
  const queuedTurnEndText = drained.injectEnter ? drained.nextInitial : undefined;
16779
16599
  if (interrupted && queuedBeforeDrain > 0) {
16780
16600
  debug.log('dashboard.turn-typeahead', 'restored-after-interrupt', { count: queuedBeforeDrain });
16781
16601
  }
16782
- if (drained.injectEnter) injectKey({ name: 'enter', ctrl: false, shift: false });
16783
16602
  draw();
16784
- const { cols: inputCols } = termSize();
16603
+ const getInputCols = () => termSize().cols;
16604
+ const inputCols = getInputCols();
16785
16605
  // Row is published by draw() via the `input-prompt` zone's
16786
16606
  // resolved geometry — no `termRows - N` math here anymore.
16787
16607
  // The composer is the single source of truth; if the layout
@@ -16792,6 +16612,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
16792
16612
  promptFrame: currentPromptFrame(termSize().rows),
16793
16613
  getPromptFrame: () => currentPromptFrame(termSize().rows),
16794
16614
  inputCols,
16615
+ getInputCols,
16795
16616
  surfaceRegistry: getSurfaceRegistry(),
16796
16617
  invalidateRenderCacheRow,
16797
16618
  buildPromptFrameDividerRows,
@@ -16805,8 +16626,9 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
16805
16626
  paintFrameNow: () => drawNow(),
16806
16627
  preferHistoryArrowKeys: slashQuickMode,
16807
16628
  history: inputHistory,
16629
+ // TUI-INPUT-PLACEHOLDER-OFF — provider 가 있으면 빈 입력창은 비워 둔다(대표 «불필요한 가이드 없애라»).
16808
16630
  placeholder: anyProviderAvailable()
16809
- ? '말 한 줄로 시작 — 질문하거나 «하니스로 구현 …» · /command · /path/to.pdf 첨부'
16631
+ ? ''
16810
16632
  : '/quit /clear (run `elanous setup` — no LLM provider available)',
16811
16633
  debugLog: debug.enabled ? (event, label, payload) => debug.log(event, label, payload) : undefined,
16812
16634
  textInputOpts: {
@@ -17662,7 +17484,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
17662
17484
  openDetailViewer: (title, lines) => { setDetailViewer(title, lines); },
17663
17485
  },
17664
17486
  undo: {
17665
- refreshGitDirty: () => { refreshGitDirty(getSessionCwd(), { force: true }); },
17487
+ refreshGitDirty: () => { void refreshGitDirtyAsync(getSessionCwd(), { force: true }).then(() => { try { draw(); } catch { /* noop */ } }, () => { /* noop */ }); },
17666
17488
  bold: C.bold,
17667
17489
  },
17668
17490
  delta: {
@@ -18048,6 +17870,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
18048
17870
  pushTurnSeparator: () => { pushTurnSeparator(); },
18049
17871
  getLogFoldMode: () => logFoldMode,
18050
17872
  setLogFoldMode: (mode) => { logFoldMode = mode; },
17873
+ setAllFolds: (expanded) => foldStack.setAll(expanded),
18051
17874
  copyEntireLog: async () => { await copyLogBlock(-1, 'all'); },
18052
17875
  returnFocusToInput: () => {
18053
17876
  const sourceFocus = workingDir.focus;
@@ -18145,6 +17968,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
18145
17968
  },
18146
17969
  termSlash: {
18147
17970
  slashRuntime: termSlashRuntime,
17971
+ openNewTerminal: spawnGlobalTerminalModal,
18148
17972
  sessionRegistry: sessionRegistry as unknown as DashboardSlashContext['termSlash']['sessionRegistry'],
18149
17973
  terminalMatrix: terminalMatrix as unknown as DashboardSlashContext['termSlash']['terminalMatrix'],
18150
17974
  vwRegistry: {
@@ -18950,10 +18774,11 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
18950
18774
  userConfig: args.userConfig,
18951
18775
  rich: false,
18952
18776
  enabledTools: tools.map(t => t.name),
18777
+ seatBoot: true,
18953
18778
  }),
18954
18779
  ];
18955
18780
  },
18956
- runAutoCompact: async ({ preamble, chatHistory, userMsg }) => {
18781
+ runAutoCompact: async ({ preamble, chatHistory, userMsg, onPrePassApplied }) => {
18957
18782
  const compactMod = await import('../compact/index.js');
18958
18783
  const { shouldAutoCompact, compactConversationPartial, compactConversation, runCompactPipeline, setVerifyProbeEnabled } = compactMod;
18959
18784
  const { renderCompactBoundary } = await import('../chat/compact-boundary.js');
@@ -18992,8 +18817,10 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
18992
18817
  getCompactProvider: () => getDefaultCompactProvider(),
18993
18818
  setVerifyProbeEnabled,
18994
18819
  sessionId: attachedSessionId ?? undefined,
18820
+ onPrePassApplied,
18995
18821
  });
18996
18822
  },
18823
+ readToolDispatchCount: () => opts.remote ? null : acpToolDispatchCount,
18997
18824
  attachChatStreamingKeys,
18998
18825
  createOptionalSpecs: async () => {
18999
18826
  const uc = (await import('../user-config.js')).getUserConfig();
@@ -19117,7 +18944,9 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
19117
18944
  recordTurnMetrics: async (fullResponse) => {
19118
18945
  await recordDashboardTurnMetrics({
19119
18946
  chatHistory: chat.history as ChatMessage[],
19120
- model: inspectActiveProvider().model,
18947
+ // 실제 턴 모델로 기록한다 — 설정 모델이면 ctx 최대치·단가가 다른 모델 것이 된다.
18948
+ // ACP 서버가 사용량에 실어 보낸 턴 모델 → 없으면 백엔드가 확인한 runtime 모델 → 설정.
18949
+ model: latestTurnUsage?.model ?? inspectActiveProvider(undefined, activeAcpRuntimeModel()).model,
19121
18950
  fullResponse,
19122
18951
  turnStartedAt,
19123
18952
  usage: latestTurnUsage,
@@ -19180,6 +19009,10 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
19180
19009
  },
19181
19010
  warningLine: (message) => C.warning(`${ICONS.warning} ${message}`),
19182
19011
  pushErrorLine: (message) => { chatLines.push(C.error(`Error: ${message}`)); },
19012
+ pushFailureNotice: (notice, raw) => {
19013
+ chatLines.push(C.warning(notice));
19014
+ detailViewerRuntime.stage('turn error', raw.split(/\r?\n/));
19015
+ },
19183
19016
  finalizeTurn: (finalStatus, finalError) => {
19184
19017
  lastTurnFinalStatus = finalStatus;
19185
19018
  clearEscAbortToolState(escAbortToolState);
@@ -19224,7 +19057,15 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
19224
19057
  }
19225
19058
  let goalLoopBudget = 100; // hard safety cap independent of /goal budget
19226
19059
  let lastTurnAborted = false;
19060
+ let goalLoopIteration = 0;
19227
19061
  do {
19062
+ // 앞 반복의 finalizeTurn 이 손잡이를 멈췄다 — 반복이 «실제로 시작될 때만» 새 표시를 단다(#5).
19063
+ thinking = goalLoopIterationThinking(goalLoopIteration++, thinking, () => startPinnedThinking({
19064
+ target: chatFooterLine,
19065
+ onFrame: () => { pinChatTail(); draw(); },
19066
+ message: 'Thinking',
19067
+ metrics: { startedAt: Date.now(), hint: 'esc 중단' },
19068
+ }));
19228
19069
  const turnText = goalLoopUserText ?? tok.text;
19229
19070
  await runDashboardChatMainSubmitIntent({
19230
19071
  submit: createDashboardChatMainTurnSubmit({