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
@@ -14,6 +14,7 @@ export interface RunDashboardChatMainEntryDeps {
14
14
  promptFrame: PromptFrame;
15
15
  getPromptFrame?: () => PromptFrame;
16
16
  inputCols: number;
17
+ getInputCols?: () => number;
17
18
  surfaceRegistry: SurfaceRegistry;
18
19
  invalidateRenderCacheRow: (row0: number) => void;
19
20
  buildPromptFrameDividerRows: (promptFrame: PromptFrame, divider: string) => Array<{ row: number; text: string }>;
@@ -61,6 +62,7 @@ export async function runDashboardChatMainEntry(
61
62
  promptFrame: deps.promptFrame,
62
63
  getPromptFrame,
63
64
  inputCols: deps.inputCols,
65
+ getInputCols: deps.getInputCols,
64
66
  surfaceRegistry: deps.surfaceRegistry,
65
67
  invalidateRenderCacheRow: deps.invalidateRenderCacheRow,
66
68
  buildPromptFrameDividerRows: deps.buildPromptFrameDividerRows,
@@ -12,6 +12,8 @@ export function dashboardLogHelpLines(): string[] {
12
12
  ' /log freeze Show scroll-freeze status + queued-line count.',
13
13
  ' /log turn <off|rule|time|both|now> Insert/toggle between-turn separator (rule + optional clock).',
14
14
  ' /log fold <line|task-unit|kind-unit> Set fold mode: line (budget), task-unit (tool headers), kind-unit (same-kind ops).',
15
+ ' /log unfold [all] Expand every folded block now (same as /log fold off).',
16
+ ' /log fold all Collapse every folded block back.',
15
17
  ' /log filter <query> Filter visible log rows by substring.',
16
18
  ' /log filter clear Clear the active visible-row filter.',
17
19
  ' /log search [query] Open search modal (no query) or jump to first match.',
@@ -30,6 +32,8 @@ export function dashboardLogHelpLines(): string[] {
30
32
  ' s Open in-pane search modal',
31
33
  ' n / Shift+N Next / previous match (after a search)',
32
34
  ' Esc Clear active search highlight',
35
+ ' f / F Toggle the latest folded block / every folded block',
36
+ ' Ctrl+X f (anywhere, incl. input) toggles every folded block.',
33
37
  ' Ctrl+L Clear log',
34
38
  ' Ctrl+\u2191/\u2193 (anywhere) also resizes; Ctrl+0 resets.',
35
39
  ];
@@ -8,6 +8,7 @@ export type DashboardChatMainLogCommand =
8
8
  | { kind: 'solo' }
9
9
  | { kind: 'turn'; arg: string }
10
10
  | { kind: 'fold'; mode: string }
11
+ | { kind: 'fold-all'; expanded: boolean }
11
12
  | { kind: 'copy-all' }
12
13
  | { kind: 'return-to-input' }
13
14
  | { kind: 'unknown'; subcommand: string };
@@ -24,7 +25,17 @@ export function resolveDashboardChatMainLogCommand(
24
25
  if (sub === 'freeze') return { kind: 'freeze' };
25
26
  if (sub === 'solo' || sub === 'maximize' || sub === 'zoom') return { kind: 'solo' };
26
27
  if (sub === 'turn') return { kind: 'turn', arg: (args[1] ?? '').toLowerCase().trim() };
27
- if (sub === 'fold') return { kind: 'fold', mode: (args[1] ?? '').toLowerCase().trim() };
28
+ if (sub === 'fold') {
29
+ const mode = (args[1] ?? '').toLowerCase().trim();
30
+ // #19 — bulk state, not a fold mode: `fold all` collapses every static fold, `fold off` opens them.
31
+ if (mode === 'all') return { kind: 'fold-all', expanded: false };
32
+ if (mode === 'off') return { kind: 'fold-all', expanded: true };
33
+ return { kind: 'fold', mode };
34
+ }
35
+ if (sub === 'unfold') {
36
+ const target = (args[1] ?? 'all').toLowerCase().trim();
37
+ return target === 'all' ? { kind: 'fold-all', expanded: true } : { kind: 'unknown', subcommand: `unfold ${target}` };
38
+ }
28
39
  if (sub === 'copy' || sub === 'all') return { kind: 'copy-all' };
29
40
  if (sub === 'input' || sub === 'return') return { kind: 'return-to-input' };
30
41
  return { kind: 'unknown', subcommand: sub };
@@ -8,6 +8,12 @@ import type { DashboardTurnBlockAttachLike } from '../turn-message-runtime.js';
8
8
  import type { DashboardAssistantRenderState } from '../turn-tail-runtime.js';
9
9
  import type { SearchPlannerState } from '../../session-runtime/index.js';
10
10
  import { runDashboardPlainTurnStream } from './dashboard-plain-turn-stream.js';
11
+ import {
12
+ formatFailureNotice, matchFailureText, recordFailureSignatureMatch,
13
+ } from '../../self-health/signatures.js';
14
+ import { isUnknownCodex400, repairCodexToolPairs, restoreRepairedHistory } from './compact-prepass-recovery.js';
15
+ import type { LLMMessage } from '../../llm.js';
16
+ import { isTuiRouteLine } from '../../core-turn/short-question.js';
11
17
 
12
18
  export interface DashboardChatMainPlainTurnRuntimeDeps {
13
19
  userText: string;
@@ -75,7 +81,10 @@ export interface DashboardChatMainPlainTurnRuntimeDeps {
75
81
  preamble: unknown[];
76
82
  chatHistory: unknown[];
77
83
  userMsg: unknown;
84
+ onPrePassApplied: () => void;
78
85
  }) => Promise<void>;
86
+ /** Null means the server-side dispatch boundary cannot be observed. */
87
+ readToolDispatchCount?: () => number | null;
79
88
 
80
89
  attachChatStreamingKeys: (abortCtrl: AbortController) => () => void;
81
90
  /** ⭐ 관측 심 — 형제 `chat-main-entry-runtime` 과 «같은 형태»다(재발명 0 · `OBS-T124`). */
@@ -141,6 +150,8 @@ export interface DashboardChatMainPlainTurnRuntimeDeps {
141
150
  runActionEffects: (outcome: unknown) => Promise<void>;
142
151
  warningLine: (message: string) => string;
143
152
  pushErrorLine: (message: string) => void;
153
+ /** 실패 지문이 맞은 오류: 화면엔 한국어 처방 한 줄, 원문은 여기(`/detail`)로. 없으면 원문을 그대로 낸다. */
154
+ pushFailureNotice?: (notice: string, raw: string) => void;
144
155
  finalizeTurn: (status: 'completed' | 'interrupted' | 'failed', error?: string) => void;
145
156
  }
146
157
 
@@ -172,6 +183,7 @@ export async function runDashboardChatMainPlainTurn(
172
183
  const userText = deps.intent?.text ?? deps.userText;
173
184
 
174
185
  let cleanupEsc = () => {};
186
+ let stage = 'streaming-keys-attached';
175
187
 
176
188
  try {
177
189
  const abortCtrl = new AbortController();
@@ -202,7 +214,6 @@ export async function runDashboardChatMainPlainTurn(
202
214
  turnStartedAtIso,
203
215
  });
204
216
  } catch { /* fail-soft — 관측이 턴을 막지 않는다 */ }
205
- let stage = 'streaming-keys-attached';
206
217
  const finishIfAborted = (): boolean => {
207
218
  if (!abortCtrl.signal.aborted) return false;
208
219
  finalStatus = 'interrupted';
@@ -237,6 +248,9 @@ export async function runDashboardChatMainPlainTurn(
237
248
  pushChatLine: deps.pushChatLine,
238
249
  });
239
250
  deps.chat.history.push(userMsg);
251
+ // Detect whether the pre-pass actually replaced history before considering
252
+ // a bounded pair repair. The copy is never replayed to the provider.
253
+ const beforeCompact = deps.chat.history.slice();
240
254
 
241
255
  await deps.beginCodeEditTurn(
242
256
  typeof userMsg.content === 'string' ? userMsg.content : '',
@@ -251,11 +265,15 @@ export async function runDashboardChatMainPlainTurn(
251
265
  userConfig,
252
266
  });
253
267
 
268
+ let prePassApplied = false;
254
269
  await deps.runAutoCompact({
255
270
  preamble,
256
271
  chatHistory: deps.chat.history,
257
272
  userMsg,
273
+ onPrePassApplied: () => { prePassApplied = true; },
258
274
  });
275
+ const compactChanged = prePassApplied && (deps.chat.history.length !== beforeCompact.length
276
+ || deps.chat.history.some((message, index) => message !== beforeCompact[index]));
259
277
  stage = 'runAutoCompact';
260
278
  if (finishIfAborted()) return;
261
279
 
@@ -316,10 +334,139 @@ export async function runDashboardChatMainPlainTurn(
316
334
  });
317
335
  } catch { /* fail-soft — 관측이 턴을 막지 않는다 */ }
318
336
  };
337
+ const recoverySend: typeof deps.acpSession = {
338
+ send: async (opts) => {
339
+ let lastError: unknown;
340
+ let pairReport: ReturnType<typeof repairCodexToolPairs> | null = null;
341
+ let inspectedHistory: string | null = null;
342
+ let initialAttemptEmitted = false;
343
+ let warned = false;
344
+ const manualRecovery = (reason: string): void => {
345
+ if (warned) return;
346
+ warned = true;
347
+ deps.debugLog?.('chat.compact-400-recovery', 'manual-recovery-required', {
348
+ reason, historyMessages: deps.chat.history.length,
349
+ });
350
+ deps.pushChatLine(deps.warningLine(
351
+ 'Codex 400으로 자동 복구를 멈췄습니다. 대화 이력을 확인한 뒤 /session new 로 새 세션을 시작하세요.',
352
+ ));
353
+ };
354
+ const dispatchCountBeforeSend = deps.readToolDispatchCount?.() ?? null;
355
+ const attempt = async (stage: string): Promise<boolean> => {
356
+ let emitted = false;
357
+ try {
358
+ await deps.acpSession.send({
359
+ ...opts,
360
+ // 라우팅 줄은 브리지가 모델 호출 «전»에 보낸다 — 모델 출력이 아니므로 재시도를 막지 않는다.
361
+ onText: (chunk) => {
362
+ if (!isTuiRouteLine(chunk)) { emitted = true; if (stage === 'initial') initialAttemptEmitted = true; }
363
+ opts.onText(chunk);
364
+ },
365
+ onToolCall: (call) => { emitted = true; if (stage === 'initial') initialAttemptEmitted = true; opts.onToolCall(call); },
366
+ onToolResult: (call) => { emitted = true; if (stage === 'initial') initialAttemptEmitted = true; opts.onToolResult(call); },
367
+ });
368
+ deps.debugLog?.('chat.compact-400-recovery', 'recovered', { stage });
369
+ return true;
370
+ } catch (err) {
371
+ const dispatchCountNow = deps.readToolDispatchCount?.() ?? null;
372
+ const dispatchUnknown = dispatchCountBeforeSend === null || dispatchCountNow === null;
373
+ const toolDispatched = dispatchCountNow !== dispatchCountBeforeSend;
374
+ const unknown400 = isUnknownCodex400(selectDashboardChatErrorDetail(err), err);
375
+ if (unknown400 && compactChanged) {
376
+ if (!pairReport) {
377
+ pairReport = repairCodexToolPairs(deps.chat.history as LLMMessage[]);
378
+ try { inspectedHistory = JSON.stringify(deps.chat.history); } catch { /* unsafe to retry */ }
379
+ deps.debugLog?.('chat.compact-400-recovery', 'pair-check', {
380
+ removedCalls: pairReport.removedCalls,
381
+ removedResults: pairReport.removedResults,
382
+ ambiguousCount: pairReport.ambiguousIds.length,
383
+ readOnly: true,
384
+ });
385
+ }
386
+ deps.debugLog?.('chat.compact-400-recovery', 'codex-400-unknown', {
387
+ stage, historyMessages: deps.chat.history.length,
388
+ emitted, dispatchUnknown, toolDispatched,
389
+ });
390
+ }
391
+ if (emitted || dispatchUnknown || toolDispatched || abortCtrl.signal.aborted || !compactChanged
392
+ || !unknown400) {
393
+ if (stage === 'pair-repair') manualRecovery('pair-repair-failed');
394
+ else if (unknown400 && compactChanged) manualRecovery('unsafe-retry');
395
+ throw err;
396
+ }
397
+ lastError = err;
398
+ return false;
399
+ }
400
+ };
401
+ if (await attempt('initial')) return;
402
+
403
+ const repaired = pairReport!;
404
+ let historyUnchanged = false;
405
+ try {
406
+ historyUnchanged = inspectedHistory !== null
407
+ && JSON.stringify(deps.chat.history) === inspectedHistory;
408
+ } catch { /* unsafe to retry */ }
409
+ if (!historyUnchanged) {
410
+ deps.debugLog?.('chat.compact-400-recovery', 'history-changed-after-pair-check', {
411
+ historyMessages: deps.chat.history.length,
412
+ });
413
+ manualRecovery('history-changed-after-pair-check');
414
+ throw lastError;
415
+ }
416
+ if (repaired.ambiguousIds.length === 0 && repaired.removedCalls + repaired.removedResults > 0) {
417
+ let beforeRepairValues: typeof deps.chat.history;
418
+ let expectedRepairedValues: typeof repaired.messages;
419
+ try {
420
+ beforeRepairValues = structuredClone(deps.chat.history);
421
+ expectedRepairedValues = structuredClone(repaired.messages);
422
+ } catch {
423
+ manualRecovery('history-snapshot-unavailable');
424
+ throw lastError;
425
+ }
426
+ const dispatchCountBeforeRepair = deps.readToolDispatchCount?.() ?? null;
427
+ let historyStillInspected = false;
428
+ try {
429
+ historyStillInspected = inspectedHistory !== null
430
+ && JSON.stringify(deps.chat.history) === inspectedHistory;
431
+ } catch { /* unsafe to retry */ }
432
+ if (dispatchCountBeforeSend === null || dispatchCountBeforeRepair === null
433
+ || dispatchCountBeforeRepair !== dispatchCountBeforeSend
434
+ || initialAttemptEmitted || abortCtrl.signal.aborted || !historyStillInspected) {
435
+ deps.debugLog?.('chat.compact-400-recovery', 'retry-gate-changed', {
436
+ dispatchUnknown: dispatchCountBeforeSend === null || dispatchCountBeforeRepair === null,
437
+ toolDispatched: dispatchCountBeforeRepair !== dispatchCountBeforeSend,
438
+ emitted: initialAttemptEmitted,
439
+ aborted: abortCtrl.signal.aborted,
440
+ historyChanged: !historyStillInspected,
441
+ });
442
+ manualRecovery('retry-gate-changed');
443
+ throw lastError;
444
+ }
445
+ deps.chat.history.splice(0, deps.chat.history.length, ...repaired.messages);
446
+ let recovered = false;
447
+ try {
448
+ recovered = await attempt('pair-repair');
449
+ if (recovered) return;
450
+ } finally {
451
+ if (!recovered) {
452
+ const restoration = restoreRepairedHistory(
453
+ deps.chat.history, beforeRepairValues, repaired.messages, expectedRepairedValues,
454
+ );
455
+ deps.debugLog?.('chat.compact-400-recovery', restoration.restored
456
+ ? 'history-restored' : 'history-restore-skipped', restoration);
457
+ }
458
+ }
459
+ }
460
+
461
+ manualRecovery(repaired.ambiguousIds.length > 0 ? 'ambiguous-tool-pairing'
462
+ : repaired.removedCalls + repaired.removedResults > 0 ? 'pair-repair-failed' : 'no-orphan-pairs');
463
+ throw lastError;
464
+ },
465
+ };
319
466
  const streamResult = await runDashboardPlainTurnStream({
320
467
  userText,
321
468
  abortCtrl,
322
- acpSession: deps.acpSession,
469
+ acpSession: recoverySend,
323
470
  onText: (chunk, accumulated) => {
324
471
  logFirstToken(chunk);
325
472
  turnStreamRuntime.onText(chunk, accumulated);
@@ -398,11 +545,33 @@ export async function runDashboardChatMainPlainTurn(
398
545
  } catch (err: any) {
399
546
  finalStatus = 'failed';
400
547
  const detail = selectDashboardChatErrorDetail(err);
548
+ const stackHead = typeof err?.stack === 'string'
549
+ ? err.stack.split('\n').slice(0, 4).join('\n')
550
+ : undefined;
551
+ deps.debugLog?.('chat-main.plain-turn', 'turn-failed', {
552
+ stage,
553
+ message: redactSecretText(detail),
554
+ stackHead: stackHead === undefined ? undefined : redactSecretText(stackHead),
555
+ });
401
556
  const firstLine = detail.split(/\r?\n/, 1)[0]?.trim() ?? '';
402
557
  finalError = detail === ''
403
558
  ? err?.message || String(err)
404
559
  : firstLine.length > 80 ? `${firstLine.slice(0, 80)}…` : firstLine;
405
- deps.pushErrorLine(detail);
560
+ const failure = deps.pushFailureNotice ? matchFailureText(detail) : null;
561
+ if (failure && deps.pushFailureNotice) {
562
+ recordFailureSignatureMatch(failure, 'turn-error');
563
+ finalError = failure.cause;
564
+ deps.pushFailureNotice(formatFailureNotice(failure, { rawHint: '/detail open' }), detail);
565
+ } else {
566
+ deps.pushErrorLine(detail);
567
+ }
568
+ // ⛔ #27452 400 복구 판정은 «원문» detail 로 — 지문 번역(finalError)으로 판정하면 복구가 안 걸린다.
569
+ if (isUnknownCodex400(detail)) {
570
+ // The normal finalizer also stops it, but freezing here closes the
571
+ // failure path even if an outer render callback throws afterward.
572
+ deps.thinking.stop({ status: 'failed', errorText: finalError });
573
+ deps.debugLog?.('chat.compact-400-recovery', 'thinking-stopped', { status: 'failed' });
574
+ }
406
575
  } finally {
407
576
  try {
408
577
  cleanupEsc();
@@ -6,6 +6,7 @@ export interface ChatMainInputSession {
6
6
  inputRow: number;
7
7
  getInputRow: () => number;
8
8
  inputWidth: number;
9
+ getInputWidth: () => number;
9
10
  paintChrome: () => void;
10
11
  shouldPaint: () => boolean;
11
12
  register: () => void;
@@ -16,6 +17,7 @@ export interface CreateChatMainInputSessionDeps {
16
17
  promptFrame: PromptFrame;
17
18
  getPromptFrame?: () => PromptFrame;
18
19
  inputCols: number;
20
+ getInputCols?: () => number;
19
21
  surfaceRegistry: SurfaceRegistry;
20
22
  invalidateRenderCacheRow: (row0: number) => void;
21
23
  buildPromptFrameDividerRows: (promptFrame: PromptFrame, divider: string) => Array<{ row: number; text: string }>;
@@ -36,9 +38,10 @@ export function createChatMainInputSession(
36
38
  // of the full-width divider, which reads like the border width
37
39
  // flickered when slash/search pickers appear.
38
40
  const inputWidth = deps.inputCols;
41
+ const getInputWidth = (): number => deps.getInputCols?.() ?? inputWidth;
39
42
 
40
43
  const paintChrome = () => {
41
- const divider = hLine(deps.inputCols);
44
+ const divider = hLine(getInputWidth());
42
45
  for (const row of deps.buildPromptFrameDividerRows(getPromptFrame(), divider)) {
43
46
  deps.invalidateRenderCacheRow(row.row - 1);
44
47
  process.stdout.write(ansi.moveTo(row.row, 1) + '\x1b[2K' + row.text);
@@ -57,7 +60,7 @@ export function createChatMainInputSession(
57
60
  deps.debugLog?.('input.surface.register', 'chat-main', {
58
61
  inputId: 'chat-main',
59
62
  row: getInputRow(),
60
- width: inputWidth,
63
+ width: getInputWidth(),
61
64
  });
62
65
  };
63
66
 
@@ -70,6 +73,7 @@ export function createChatMainInputSession(
70
73
  inputRow,
71
74
  getInputRow,
72
75
  inputWidth,
76
+ getInputWidth,
73
77
  paintChrome,
74
78
  shouldPaint,
75
79
  register,
@@ -10,6 +10,13 @@ export function resolveDashboardChatMainSlashCommand(
10
10
  let cmdLower = cmd?.toLowerCase() ?? '';
11
11
  let args: string[] = rawArgs.filter(Boolean);
12
12
 
13
+ // A terminal command is shell text: splitting and joining its words would
14
+ // collapse whitespace inside quotes (for example `sh -c 'echo a b'`).
15
+ if ((cmdLower === 'term' || cmdLower === 'terminal') && args[0]?.toLowerCase() === 'new') {
16
+ const command = /^\S+\s+\S+(?:\s+([\s\S]*))?$/.exec(commandText.slice(1))?.[1];
17
+ args = command === undefined ? ['new'] : ['new', command];
18
+ }
19
+
13
20
  // Top-level alias: `/resume <id>` → `/session load <id>`.
14
21
  // Reuses the existing /session subcommand handler so the resume
15
22
  // flow stays in one place.
@@ -4,7 +4,7 @@ import type { ChatMainInputSession } from './chat-main-session.js';
4
4
 
5
5
  export type ChatMainTextInputBaseOpts = Omit<
6
6
  Parameters<typeof textInput>[0],
7
- 'row' | 'getRow' | 'col' | 'width' | 'prompt' | 'maxLines' | 'initialText' | 'history' | 'onPaintChrome' | 'shouldPaint' | 'placeholder' | 'preferHistoryArrowKeys'
7
+ 'row' | 'getRow' | 'col' | 'width' | 'getWidth' | 'prompt' | 'maxLines' | 'initialText' | 'history' | 'onPaintChrome' | 'shouldPaint' | 'placeholder' | 'preferHistoryArrowKeys'
8
8
  >;
9
9
 
10
10
  export interface RunChatMainInputTurnDeps {
@@ -24,6 +24,7 @@ export function buildChatMainTextInputRequest(
24
24
  getRow: deps.session.getInputRow,
25
25
  col: 1,
26
26
  width: deps.session.inputWidth,
27
+ getWidth: deps.session.getInputWidth,
27
28
  prompt: '\u276f ',
28
29
  maxLines: 8,
29
30
  onPaintChrome: deps.session.paintChrome,
@@ -0,0 +1,97 @@
1
+ import type { ContentBlock, LLMMessage } from '../../llm.js';
2
+ import { isDeepStrictEqual } from 'node:util';
3
+
4
+ export function isUnknownCodex400(detail: string, error?: unknown): boolean {
5
+ if (error && typeof error === 'object' && 'status' in error && 'provider' in error
6
+ && error.status === 400 && error.provider === 'codex') return true;
7
+ return /\bCodex\s+API\s+400\b/i.test(detail.replace(/\s+/g, ' '));
8
+ }
9
+
10
+ /** Restore only the repaired prefix, retaining messages appended during the retry. */
11
+ export function restoreRepairedHistory<T>(
12
+ history: T[], originalValues: readonly T[], repaired: readonly T[], expectedRepairedValues: readonly T[],
13
+ ): { restored: boolean; preservedTail: number } {
14
+ if (history.length < repaired.length || repaired.some((message, index) => history[index] !== message)
15
+ || !isDeepStrictEqual(history.slice(0, repaired.length), expectedRepairedValues)) {
16
+ return { restored: false, preservedTail: Math.max(0, history.length - repaired.length) };
17
+ }
18
+ const preservedTail = history.length - repaired.length;
19
+ history.splice(0, repaired.length, ...originalValues);
20
+ return { restored: true, preservedTail };
21
+ }
22
+
23
+ /** Remove only protocol orphans; preserve every matched call/result and their order. */
24
+ export function repairCodexToolPairs(messages: readonly LLMMessage[]): {
25
+ messages: LLMMessage[];
26
+ removedCalls: number;
27
+ removedResults: number;
28
+ ambiguousIds: string[];
29
+ } {
30
+ const seenCalls = new Set<string>();
31
+ const seenResults = new Set<string>();
32
+ const ambiguousIds = new Set<string>();
33
+ for (const message of messages) {
34
+ if (!Array.isArray(message.content)) continue;
35
+ for (const block of message.content) {
36
+ if (block.type === 'tool_use' && block.id) {
37
+ if (seenCalls.has(block.id)) ambiguousIds.add(block.id);
38
+ seenCalls.add(block.id);
39
+ } else if (block.type === 'tool_result' && block.tool_use_id) {
40
+ if (seenResults.has(block.tool_use_id)) ambiguousIds.add(block.tool_use_id);
41
+ seenResults.add(block.tool_use_id);
42
+ }
43
+ }
44
+ }
45
+ // A repeated ID cannot be assigned to a unique call/result pair. Leave history intact.
46
+ if (ambiguousIds.size > 0) {
47
+ return { messages: [...messages], removedCalls: 0, removedResults: 0,
48
+ ambiguousIds: [...ambiguousIds] };
49
+ }
50
+ const pending = new Map<string, string>();
51
+ const completed = new Set<string>();
52
+ const dropped = new Set<string>();
53
+ let removedCalls = 0;
54
+ let removedResults = 0;
55
+ for (let messageIndex = 0; messageIndex < messages.length; messageIndex++) {
56
+ const content = messages[messageIndex]!.content;
57
+ if (!Array.isArray(content)) continue;
58
+ for (let blockIndex = 0; blockIndex < content.length; blockIndex++) {
59
+ const block = content[blockIndex]!;
60
+ const key = `${messageIndex}:${blockIndex}`;
61
+ if (block.type === 'tool_use') {
62
+ if (!block.id || pending.has(block.id) || completed.has(block.id)) {
63
+ dropped.add(key);
64
+ removedCalls++;
65
+ } else {
66
+ pending.set(block.id, key);
67
+ }
68
+ } else if (block.type === 'tool_result') {
69
+ if (!pending.has(block.tool_use_id)) {
70
+ dropped.add(key);
71
+ removedResults++;
72
+ } else {
73
+ pending.delete(block.tool_use_id);
74
+ completed.add(block.tool_use_id);
75
+ }
76
+ }
77
+ }
78
+ }
79
+ for (const key of pending.values()) {
80
+ dropped.add(key);
81
+ removedCalls++;
82
+ }
83
+ if (dropped.size === 0) return { messages: [...messages], removedCalls, removedResults, ambiguousIds: [] };
84
+ const repaired: LLMMessage[] = [];
85
+ for (let messageIndex = 0; messageIndex < messages.length; messageIndex++) {
86
+ const message = messages[messageIndex]!;
87
+ if (!Array.isArray(message.content)) {
88
+ repaired.push(message);
89
+ continue;
90
+ }
91
+ const blocks = message.content.filter((_block: ContentBlock, blockIndex: number) =>
92
+ !dropped.has(`${messageIndex}:${blockIndex}`));
93
+ if (blocks.length > 0) repaired.push({ ...message, content: blocks });
94
+ else if (message.content.length === 0) repaired.push(message);
95
+ }
96
+ return { messages: repaired, removedCalls, removedResults, ambiguousIds: [] };
97
+ }
@@ -12,7 +12,8 @@ export type DashboardChordAction =
12
12
  | { kind: 'open-pane-modal' }
13
13
  | { kind: 'toggle-log-zoom' }
14
14
  | { kind: 'open-preview-terminal' }
15
- | { kind: 'toggle-preview-terminal-expand' };
15
+ | { kind: 'toggle-preview-terminal-expand' }
16
+ | { kind: 'toggle-all-folds' };
16
17
 
17
18
  export function matchDashboardChordAction(key: Key): DashboardChordAction | null {
18
19
  if (key.ctrl && (key.name === 'w' || key.name === 'ㅈ')) {
@@ -54,6 +55,10 @@ export function matchDashboardChordAction(key: Key): DashboardChordAction | null
54
55
  if (key.name === 'e' || key.name === 'ㄷ') {
55
56
  return { kind: 'toggle-preview-terminal-expand' };
56
57
  }
58
+ // #19 — the log-pane `F` bulk fold toggle, reachable from the input (plain `F` types a letter there).
59
+ if (!key.ctrl && (key.name === 'f' || key.name === 'ㄹ')) {
60
+ return { kind: 'toggle-all-folds' };
61
+ }
57
62
  return null;
58
63
  }
59
64
 
@@ -70,6 +75,7 @@ export interface DashboardChordActionRunnerDeps<Pane> {
70
75
  toggleLogZoom: () => void | Promise<void>;
71
76
  openPreviewTerminal: () => void;
72
77
  togglePreviewTerminalExpand: () => void;
78
+ toggleAllFolds?: () => void;
73
79
  }
74
80
 
75
81
  export function createDashboardChordActionRunner<Pane>(
@@ -113,6 +119,9 @@ export function createDashboardChordActionRunner<Pane>(
113
119
  case 'toggle-preview-terminal-expand':
114
120
  deps.togglePreviewTerminalExpand();
115
121
  return;
122
+ case 'toggle-all-folds':
123
+ deps.toggleAllFolds?.();
124
+ return;
116
125
  }
117
126
  };
118
127
  }
@@ -31,6 +31,7 @@ export interface DashboardChordRuntimeDeps<Pane> {
31
31
  focusPreviewAfterTerminalExpand: () => void;
32
32
  onPreviewTerminalExpandChanged: (expanded: boolean) => void;
33
33
  onMissingPreviewTerminal: () => void;
34
+ toggleAllFolds?: () => void;
34
35
  }
35
36
 
36
37
  export function createDashboardChordRuntime<Pane>(
@@ -80,6 +81,7 @@ export function createDashboardChordRuntime<Pane>(
80
81
  },
81
82
  toggleLogZoom: deps.toggleLogZoom,
82
83
  openPreviewTerminal: deps.openPreviewTerminal,
84
+ toggleAllFolds: deps.toggleAllFolds,
83
85
  togglePreviewTerminalExpand: () => {
84
86
  const term = deps.getPreviewTerminal();
85
87
  if (term !== null && term.isAlive) {
@@ -0,0 +1,45 @@
1
+ // 대시보드 ↔ 외부 주입 대기열(`input/external-input-queue`) 배선. `index.ts` 는 이 함수를 한 번 부르기만 한다.
2
+ import type { TextInputExternalSubmitRequest } from '../../chat/index.js';
3
+ import { pendingKeyCount } from '../../tui.js';
4
+ import {
5
+ renderExternalInputQueueNotice,
6
+ type ExternalInputHost,
7
+ } from '../../input/external-input-queue.js';
8
+
9
+ export interface DashboardExternalInputHostDeps {
10
+ isTurnActive: () => boolean;
11
+ promptCtl: {
12
+ /** 합성 Enter 가 들어갔으면 true · 못 들어갔으면 false(옛 구현은 void). */
13
+ submit?: (request?: string | TextInputExternalSubmitRequest) => boolean | void;
14
+ getBufferText?: () => string;
15
+ };
16
+ /** 채팅 로그에 한 줄(표지)을 남기고 다시 그린다. */
17
+ pushNotice: (line: string) => void;
18
+ /** 미소비 키 수 — 기본 tui.ts 키 큐. */
19
+ pendingKeyCount?: () => number;
20
+ }
21
+
22
+ export function createDashboardExternalInputHost(deps: DashboardExternalInputHostDeps): ExternalInputHost {
23
+ // ⚠️ submit/insertAtCursor 는 textInput 이 내려간 뒤에도 남아 있다 — «composer 가 떠 있나»는
24
+ // getBufferText 유무로만 판단한다(내려가면 undefined).
25
+ const composerLive = (): boolean => typeof deps.promptCtl.getBufferText === 'function';
26
+ return {
27
+ isTurnActive: deps.isTurnActive,
28
+ composerText: () => deps.promptCtl.getBufferText?.(),
29
+ hasPendingKeys: () => (deps.pendingKeyCount ?? pendingKeyCount)() > 0,
30
+ submit: (text, source) => {
31
+ if (!composerLive() || !deps.promptCtl.submit) return false;
32
+ return deps.promptCtl.submit({ text, source }) !== false;
33
+ },
34
+ onQueueChange: (pending, event) => {
35
+ if (event === 'queued') {
36
+ const notice = renderExternalInputQueueNotice(pending);
37
+ if (notice) deps.pushNotice(notice);
38
+ return;
39
+ }
40
+ deps.pushNotice(pending.length > 0
41
+ ? `⤵ 외부 입력 1건 전송 · 남은 대기 ${pending.length}건`
42
+ : '⤵ 외부 입력 1건 전송');
43
+ },
44
+ };
45
+ }
@@ -0,0 +1,18 @@
1
+ import { addDefaultBinding, registerAction } from '../../input-core/index.js';
2
+
3
+ export const LOG_FOLD_TOGGLE_ALL_ACTION = 'log.fold.toggle-all';
4
+
5
+ /**
6
+ * #19 — `Ctrl+X f` from the input. Input focus never reaches the main-loop
7
+ * chord (`matchDashboardChordAction`); the textarea arms the input-core
8
+ * `ctrl+x` leader instead, so the binding lives here next to `ctrl+x s/c/g`.
9
+ */
10
+ export function registerLogFoldInputBinding(toggleAll: () => void): void {
11
+ registerAction({
12
+ id: LOG_FOLD_TOGGLE_ALL_ACTION,
13
+ description: 'Toggle every folded log block (same as log-pane F).',
14
+ handler: () => { toggleAll(); },
15
+ allowOverwrite: true,
16
+ });
17
+ addDefaultBinding({ matcher: 'ctrl+x f', actionId: LOG_FOLD_TOGGLE_ALL_ACTION });
18
+ }