elanous 0.2.36 → 0.2.38

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 (741) 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/{uC-N0emedeNOFuaBQFv-I → RrjXTwz-urRAbChP1bX02}/_buildManifest.js +1 -1
  4. package/apps/pwa/out/_next/static/chunks/{9250-072df22eaadaa6b5.js → 1026-44010f405704050c.js} +1 -1
  5. package/apps/pwa/out/_next/static/chunks/1118.a8a74ea29aac3e46.js +27 -0
  6. package/apps/pwa/out/_next/static/chunks/1204-2aa830479adf80f4.js +1 -0
  7. package/apps/pwa/out/_next/static/chunks/1341-43b7d2dc77d45c9d.js +1 -0
  8. package/apps/pwa/out/_next/static/chunks/1440-c3ea8882badfd9bf.js +1 -0
  9. package/apps/pwa/out/_next/static/chunks/{4304.e9b2512834a9e23e.js → 1632.7d87f998e714bede.js} +1 -1
  10. package/apps/pwa/out/_next/static/chunks/1698-9c11cbf97f13717e.js +1 -0
  11. package/apps/pwa/out/_next/static/chunks/1770-3b1fc92253ef9f2f.js +1 -0
  12. package/apps/pwa/out/_next/static/chunks/1923-5c1695332240246a.js +1 -0
  13. package/apps/pwa/out/_next/static/chunks/1938.0e6c60ee91c4d7f5.js +148 -0
  14. package/apps/pwa/out/_next/static/chunks/{7784.1f0ac4a16d190cf4.js → 2104.70e086d5174a4736.js} +1 -1
  15. package/apps/pwa/out/_next/static/chunks/213-20675f20673ba22a.js +1 -0
  16. package/apps/pwa/out/_next/static/chunks/{6566.926a1d1b7c911442.js → 214.186a430da28338f1.js} +1 -1
  17. package/apps/pwa/out/_next/static/chunks/2277.3bd4c0ac7f1b5996.js +93 -0
  18. package/apps/pwa/out/_next/static/chunks/240.e09f433f71c78ff4.js +104 -0
  19. package/apps/pwa/out/_next/static/chunks/{5711.957b095705c12560.js → 2415.738b777642a02233.js} +1 -1
  20. package/apps/pwa/out/_next/static/chunks/2417.02151393605a7cd0.js +1 -0
  21. package/apps/pwa/out/_next/static/chunks/2463.cd2641a76daaa9ff.js +1 -0
  22. package/apps/pwa/out/_next/static/chunks/2576.b9e9c629c4b84c52.js +1 -0
  23. package/apps/pwa/out/_next/static/chunks/265-c021de53f0865bd9.js +1 -0
  24. package/apps/pwa/out/_next/static/chunks/2998-b1cc13956cd6a6e7.js +1 -0
  25. package/apps/pwa/out/_next/static/chunks/2e4782d3.ba2f0ab2b63a53e7.js +1 -0
  26. package/apps/pwa/out/_next/static/chunks/{4286.b70c4520306817e8.js → 3086.fb14b60ce98b53d3.js} +1 -1
  27. package/apps/pwa/out/_next/static/chunks/{3148-98efd4869d660a87.js → 3124-561f7f037943cde2.js} +1 -1
  28. package/apps/pwa/out/_next/static/chunks/3130.626b54382b4dc379.js +1 -0
  29. package/apps/pwa/out/_next/static/chunks/3221-1bb3f99a55088613.js +1 -0
  30. package/apps/pwa/out/_next/static/chunks/3280.24edb1ffd03a7f3f.js +24 -0
  31. package/apps/pwa/out/_next/static/chunks/3288-eb3c22a1cbf2ae68.js +1 -0
  32. package/apps/pwa/out/_next/static/chunks/{3727.7949ccaacaa71242.js → 3291.f6c1005387d514bd.js} +2 -2
  33. package/apps/pwa/out/_next/static/chunks/33.ef99e8374f96c6c4.js +36 -0
  34. package/apps/pwa/out/_next/static/chunks/3341-f09b9efbd7a82f70.js +1 -0
  35. package/apps/pwa/out/_next/static/chunks/3389.012c70767a872f9b.js +1 -0
  36. package/apps/pwa/out/_next/static/chunks/3410-d7c0f14b329d6fda.js +1 -0
  37. package/apps/pwa/out/_next/static/chunks/3421.c87d6313a7d670f7.js +287 -0
  38. package/apps/pwa/out/_next/static/chunks/3422-83a3953f9bd67e26.js +1 -0
  39. package/apps/pwa/out/_next/static/chunks/{8904.7d51af2dc033965c.js → 3528.e4b8ab70d339f965.js} +2 -2
  40. package/apps/pwa/out/_next/static/chunks/3587-002e24e368c515a9.js +1 -0
  41. package/apps/pwa/out/_next/static/chunks/3644.f12a7d821ab940af.js +1 -0
  42. package/apps/pwa/out/_next/static/chunks/3660.d7516588e2d875c3.js +1 -0
  43. package/apps/pwa/out/_next/static/chunks/3695.b82e2610f4cd4ea9.js +1 -0
  44. package/apps/pwa/out/_next/static/chunks/3858.ca1f5bc0f577eac9.js +94 -0
  45. package/apps/pwa/out/_next/static/chunks/3959-e6ac4a139d9d4bcc.js +1 -0
  46. package/apps/pwa/out/_next/static/chunks/3f0de3de-2340c532c00395db.js +1 -0
  47. package/apps/pwa/out/_next/static/chunks/4032.53f62176514ec0ea.js +1 -0
  48. package/apps/pwa/out/_next/static/chunks/{3031-85328a92fcce4da6.js → 4199-f7c6eb40cd0322f8.js} +1 -1
  49. package/apps/pwa/out/_next/static/chunks/4204-ef8484cbecd5d62f.js +1 -0
  50. package/apps/pwa/out/_next/static/chunks/4259-163129ca79913c4b.js +1 -0
  51. package/apps/pwa/out/_next/static/chunks/428-eaa77df3d0c85969.js +1 -0
  52. package/apps/pwa/out/_next/static/chunks/4432-97e400ffa1e161f5.js +1 -0
  53. package/apps/pwa/out/_next/static/chunks/449-aa427cf2cbb75f50.js +1 -0
  54. package/apps/pwa/out/_next/static/chunks/4491-39a0fd32bbaf3840.js +1 -0
  55. package/apps/pwa/out/_next/static/chunks/4588.b7cf06d382953979.js +1 -0
  56. package/apps/pwa/out/_next/static/chunks/4690.70ec8060825366ab.js +32 -0
  57. package/apps/pwa/out/_next/static/chunks/4804.6012b5cd33c22792.js +90 -0
  58. package/apps/pwa/out/_next/static/chunks/4881.e4d22d730e3b9df5.js +1 -0
  59. package/apps/pwa/out/_next/static/chunks/4937.ce2e340dc29cad3e.js +79 -0
  60. package/apps/pwa/out/_next/static/chunks/5-bb1c08d84bd71df3.js +1 -0
  61. package/apps/pwa/out/_next/static/chunks/5005.de98df23b37cdf3c.js +1 -0
  62. package/apps/pwa/out/_next/static/chunks/5035.dc64a89cad5573cc.js +74 -0
  63. package/apps/pwa/out/_next/static/chunks/5041-5aada92ca215ffdd.js +1 -0
  64. package/apps/pwa/out/_next/static/chunks/{528.38ce20ef8aa251ff.js → 5203.51e5d8b5f1dcfe53.js} +16 -16
  65. package/apps/pwa/out/_next/static/chunks/5207.1a224035455790fd.js +1 -0
  66. package/apps/pwa/out/_next/static/chunks/5255-1b60d50eabe9f057.js +1 -0
  67. package/apps/pwa/out/_next/static/chunks/5269.d0436ee6d773382a.js +286 -0
  68. package/apps/pwa/out/_next/static/chunks/5300.677c97e0393742e6.js +1 -0
  69. package/apps/pwa/out/_next/static/chunks/{2683.c9773a0c589b031b.js → 5307.d7328020227880c2.js} +4 -4
  70. package/apps/pwa/out/_next/static/chunks/5309.3367c4d50f52b489.js +1 -0
  71. package/apps/pwa/out/_next/static/chunks/552-689827d49780fa00.js +1 -0
  72. package/apps/pwa/out/_next/static/chunks/5539.34cc9d60622cb69b.js +8 -0
  73. package/apps/pwa/out/_next/static/chunks/5568.218dea0c00ca2ec7.js +1 -0
  74. package/apps/pwa/out/_next/static/chunks/{552.b7d061ad91eeac51.js → 5638.107314dc479e2f37.js} +2 -2
  75. package/apps/pwa/out/_next/static/chunks/5645.b7e3b055455a04ea.js +1 -0
  76. package/apps/pwa/out/_next/static/chunks/5662.18cc0f30353cbd96.js +1 -0
  77. package/apps/pwa/out/_next/static/chunks/5671.da24fc9dc5e98325.js +1 -0
  78. package/apps/pwa/out/_next/static/chunks/5b141171.324c40fd49cb6821.js +1 -0
  79. package/apps/pwa/out/_next/static/chunks/6142.913b44e260a3f925.js +64 -0
  80. package/apps/pwa/out/_next/static/chunks/6175-d4621f6a10b0cfab.js +1 -0
  81. package/apps/pwa/out/_next/static/chunks/6290.3eb53a20746b72ce.js +1 -0
  82. package/apps/pwa/out/_next/static/chunks/6415-9307f3eafa90837f.js +1 -0
  83. package/apps/pwa/out/_next/static/chunks/{6925.562d532110879886.js → 6493.27ad77de7aac7966.js} +1 -1
  84. package/apps/pwa/out/_next/static/chunks/6579-3de35d00aacd71b5.js +1 -0
  85. package/apps/pwa/out/_next/static/chunks/680-2f324c4e039a5b67.js +1 -0
  86. package/apps/pwa/out/_next/static/chunks/6845-331b3c7481da3ba3.js +1 -0
  87. package/apps/pwa/out/_next/static/chunks/7000.28157393caaf5343.js +62 -0
  88. package/apps/pwa/out/_next/static/chunks/{275-02ea4c2a33980422.js → 7161-8f22db3ec5ed005e.js} +3 -3
  89. package/apps/pwa/out/_next/static/chunks/7311-60a7ea80d23c7521.js +1 -0
  90. package/apps/pwa/out/_next/static/chunks/7401.525d0a12f7d02c06.js +1 -0
  91. package/apps/pwa/out/_next/static/chunks/7438.c2cf72b66dca6aa4.js +1 -0
  92. package/apps/pwa/out/_next/static/chunks/{3136.30aaaa5fa03662a3.js → 7488.966b116789f3d41a.js} +1 -1
  93. package/apps/pwa/out/_next/static/chunks/{4116.a84a92a2492c080e.js → 7524.ce973525d30b3d52.js} +1 -1
  94. package/apps/pwa/out/_next/static/chunks/7573.2376e13c9c21f1f8.js +77 -0
  95. package/apps/pwa/out/_next/static/chunks/7577.ea6e9ac72e035520.js +1 -0
  96. package/apps/pwa/out/_next/static/chunks/{3324.a09703033abcbd2f.js → 7628.6b16863ac3972333.js} +1 -1
  97. package/apps/pwa/out/_next/static/chunks/7657.8d1fb3d2f7ebe273.js +1 -0
  98. package/apps/pwa/out/_next/static/chunks/7903-1435d5d2f0dd7807.js +1 -0
  99. package/apps/pwa/out/_next/static/chunks/{3410.7f9af5ab77cbe65f.js → 7954.4f7a8832663ee979.js} +1 -1
  100. package/apps/pwa/out/_next/static/chunks/7978-30a91192c5dbe3c2.js +1 -0
  101. package/apps/pwa/out/_next/static/chunks/{771.c3cdb6c1f7f47c02.js → 8019.21ca554a821dad01.js} +16 -16
  102. package/apps/pwa/out/_next/static/chunks/8025-8795821525cf1a07.js +1 -0
  103. package/apps/pwa/out/_next/static/chunks/8191.3674a00f0b565c23.js +1 -0
  104. package/apps/pwa/out/_next/static/chunks/8217-604955d8885c5ef2.js +1 -0
  105. package/apps/pwa/out/_next/static/chunks/8298-eed6f5f2585a63f4.js +1 -0
  106. package/apps/pwa/out/_next/static/chunks/{4615.8525eb0add35eba6.js → 8487.291666583bebe640.js} +1 -1
  107. package/apps/pwa/out/_next/static/chunks/8509.3a54d4e61893d7cb.js +1 -0
  108. package/apps/pwa/out/_next/static/chunks/8758.ac421f726a189125.js +1 -0
  109. package/apps/pwa/out/_next/static/chunks/{6943.c6b24124853a47b2.js → 8879.ac06755bcf3e44a1.js} +1 -1
  110. package/apps/pwa/out/_next/static/chunks/891.d6c723a51a067b36.js +149 -0
  111. package/apps/pwa/out/_next/static/chunks/{575.d929793a53f27c4b.js → 8911.bf5e712acb25fb6c.js} +1 -1
  112. package/apps/pwa/out/_next/static/chunks/{9f31e478.fefcbcd3c388ebc5.js → 8994d93e.33ba491f95345fc2.js} +1 -1
  113. package/apps/pwa/out/_next/static/chunks/{da5ecc5c-b005ad8cac737d57.js → 89d6c04f-6b8ab341748e468a.js} +1 -1
  114. package/apps/pwa/out/_next/static/chunks/{599.c39c571b6733f2a2.js → 9223.cbcc88e0e9950426.js} +2 -2
  115. package/apps/pwa/out/_next/static/chunks/9299.24e2a7d9b6d1f91b.js +226 -0
  116. package/apps/pwa/out/_next/static/chunks/9317.6a9869039c231bb3.js +24 -0
  117. package/apps/pwa/out/_next/static/chunks/9383.e4755f275b3c11ff.js +1 -0
  118. package/apps/pwa/out/_next/static/chunks/{8037.e254fd797aa224d1.js → 9581.da63ddf41acfad46.js} +1 -1
  119. package/apps/pwa/out/_next/static/chunks/9715.8c5529a0a5c41a36.js +1 -0
  120. package/apps/pwa/out/_next/static/chunks/9817.3009d65f0889ef1f.js +2 -0
  121. package/apps/pwa/out/_next/static/chunks/{ceba0382.650712b56b85b582.js → 9fe1b809.738da85c8b17e3fb.js} +1 -1
  122. package/apps/pwa/out/_next/static/chunks/app/_not-found/page-76873dd80da4f715.js +1 -0
  123. package/apps/pwa/out/_next/static/chunks/app/approvals/page-ed32b6ec5dea8f23.js +1 -0
  124. package/apps/pwa/out/_next/static/chunks/app/autopilot/page-fdd40e15babf3d25.js +1 -0
  125. package/apps/pwa/out/_next/static/chunks/app/board/page-384efc78e85e400b.js +1 -0
  126. package/apps/pwa/out/_next/static/chunks/app/botlab/page-866aac5ff226a7f3.js +1 -0
  127. package/apps/pwa/out/_next/static/chunks/app/bots/page-d91809c5aeed319a.js +1 -0
  128. package/apps/pwa/out/_next/static/chunks/app/ceo/page-128f3522f89a81ab.js +1 -0
  129. package/apps/pwa/out/_next/static/chunks/app/chat/page-595961abf3b43ad1.js +1 -0
  130. package/apps/pwa/out/_next/static/chunks/app/consult/page-f41dccb76d8c0263.js +1 -0
  131. package/apps/pwa/out/_next/static/chunks/app/control/page-a3205c2e28b7d0d9.js +1 -0
  132. package/apps/pwa/out/_next/static/chunks/app/decisions/page-c39a80277814a3f4.js +1 -0
  133. package/apps/pwa/out/_next/static/chunks/app/design-check/page-1ab3f98194513195.js +1 -0
  134. package/apps/pwa/out/_next/static/chunks/app/editor/page-a5246f7e254d77d0.js +1 -0
  135. package/apps/pwa/out/_next/static/chunks/app/exec/page-0f92287bdb81217d.js +1 -0
  136. package/apps/pwa/out/_next/static/chunks/app/field/page-5a37131ff63793ef.js +1 -0
  137. package/apps/pwa/out/_next/static/chunks/app/healthz/route-76873dd80da4f715.js +1 -0
  138. package/apps/pwa/out/_next/static/chunks/app/inside/page-ac4bd14bb2348bfd.js +1 -0
  139. package/apps/pwa/out/_next/static/chunks/app/intake/page-c348a3959c5b5fc6.js +1 -0
  140. package/apps/pwa/out/_next/static/chunks/app/layout-2addd81c0d3e2906.js +1 -0
  141. package/apps/pwa/out/_next/static/chunks/app/live/page-da6b765f58a3eefb.js +1 -0
  142. package/apps/pwa/out/_next/static/chunks/app/live-run/page-0661e40f8780c32c.js +1 -0
  143. package/apps/pwa/out/_next/static/chunks/app/loops/page-b89af1b1c8e4875b.js +1 -0
  144. package/apps/pwa/out/_next/static/chunks/app/market/page-da8aeb82ba751cdb.js +1 -0
  145. package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-cc71317b239439db.js +1 -0
  146. package/apps/pwa/out/_next/static/chunks/app/morning/page-bde7fc1d64ffe369.js +1 -0
  147. package/apps/pwa/out/_next/static/chunks/app/not-found-e2797214f713fa58.js +1 -0
  148. package/apps/pwa/out/_next/static/chunks/app/observatory/page-2a35bcda70defaf6.js +1 -0
  149. package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-3af03deedde45032.js +1 -0
  150. package/apps/pwa/out/_next/static/chunks/app/ops/release/page-d1d1210f99f620ae.js +1 -0
  151. package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-46d1b5500885861d.js +1 -0
  152. package/apps/pwa/out/_next/static/chunks/app/outputs/{page-e7abc34a48a6f71e.js → page-291ab19fe2acb173.js} +1 -1
  153. package/apps/pwa/out/_next/static/chunks/app/page-7f569e533ddeecba.js +1 -0
  154. package/apps/pwa/out/_next/static/chunks/app/reflection/page-990129c9fee46d8f.js +1 -0
  155. package/apps/pwa/out/_next/static/chunks/app/scheduler/page-7737f785ebb1cdaf.js +1 -0
  156. package/apps/pwa/out/_next/static/chunks/app/sessions/page-9f3c73a4f7ffd2f8.js +1 -0
  157. package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-03be7fb347f01058.js +1 -0
  158. package/apps/pwa/out/_next/static/chunks/app/settings/page-96b0280625e4df2b.js +1 -0
  159. package/apps/pwa/out/_next/static/chunks/app/setup/done/page-56855545049eb56d.js +1 -0
  160. package/apps/pwa/out/_next/static/chunks/app/setup/layout-76873dd80da4f715.js +1 -0
  161. package/apps/pwa/out/_next/static/chunks/app/setup/page-79a909c9981f0338.js +1 -0
  162. package/apps/pwa/out/_next/static/chunks/app/share/page-a9d9a3e66459c1e0.js +1 -0
  163. package/apps/pwa/out/_next/static/chunks/app/showroom/page-c383cbf2013f7069.js +1 -0
  164. package/apps/pwa/out/_next/static/chunks/app/tasks/page-f57c6a2e54dbdca4.js +1 -0
  165. package/apps/pwa/out/_next/static/chunks/app/term/{page-c15958835534404b.js → page-6b140f77593576eb.js} +1 -1
  166. package/apps/pwa/out/_next/static/chunks/app/today/page-6b767ae2d9d0adfc.js +1 -0
  167. package/apps/pwa/out/_next/static/chunks/app/trace/page-116d6198d5da0e3d.js +1 -0
  168. package/apps/pwa/out/_next/static/chunks/app/vault/page-b9c9b778c7501370.js +1 -0
  169. package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-a6c78392ab8f6335.js +1 -0
  170. package/apps/pwa/out/_next/static/chunks/app/workflows/page-455183deb4ed0cfe.js +1 -0
  171. package/apps/pwa/out/_next/static/chunks/app/workspace/page-6a63e99526bd63d0.js +1 -0
  172. package/apps/pwa/out/_next/static/chunks/app/worktrees/page-31c22caafe788c08.js +1 -0
  173. package/apps/pwa/out/_next/static/chunks/{3a3d9966.cc4d4585a2708e7c.js → b7459770.6539b11860eb8a9c.js} +7 -7
  174. package/apps/pwa/out/_next/static/chunks/{053a429e.9a63436527cc751c.js → b7478fef.5917716286213fcc.js} +3 -3
  175. package/apps/pwa/out/_next/static/chunks/bb6987f9.3647e1a23b0e3217.js +122 -0
  176. package/apps/pwa/out/_next/static/chunks/{2812ca6a.3b9f4a7a08885744.js → de8b930d.d94c0f42acf807fc.js} +1 -1
  177. package/apps/pwa/out/_next/static/chunks/{873d6c12.09bd499f57171543.js → eaad0cba.771200940c529df7.js} +1 -1
  178. package/apps/pwa/out/_next/static/chunks/framework-4b12a946f352cee2.js +1 -0
  179. package/apps/pwa/out/_next/static/chunks/main-941155250ed2644b.js +1 -0
  180. package/apps/pwa/out/_next/static/chunks/main-app-f8b6765abed6d149.js +1 -0
  181. package/apps/pwa/out/_next/static/chunks/pages/_app-78432194c85388f9.js +1 -0
  182. package/apps/pwa/out/_next/static/chunks/pages/_error-cdf7390829512b1b.js +1 -0
  183. package/apps/pwa/out/_next/static/chunks/webpack-d5f0964a9c2e92d2.js +1 -0
  184. package/apps/pwa/out/_next/static/css/{b5d88eba78a3d7bf.css → be9019f696217521.css} +1 -1
  185. package/apps/pwa/out/approvals/index.html +1 -1
  186. package/apps/pwa/out/approvals/index.txt +23 -23
  187. package/apps/pwa/out/autopilot/index.html +1 -1
  188. package/apps/pwa/out/autopilot/index.txt +23 -23
  189. package/apps/pwa/out/board/index.html +1 -1
  190. package/apps/pwa/out/board/index.txt +23 -23
  191. package/apps/pwa/out/botlab/index.html +1 -1
  192. package/apps/pwa/out/botlab/index.txt +22 -22
  193. package/apps/pwa/out/bots/index.html +1 -1
  194. package/apps/pwa/out/bots/index.txt +22 -22
  195. package/apps/pwa/out/ceo/index.html +1 -1
  196. package/apps/pwa/out/ceo/index.txt +23 -23
  197. package/apps/pwa/out/chat/index.html +1 -1
  198. package/apps/pwa/out/chat/index.txt +22 -22
  199. package/apps/pwa/out/consult/index.html +1 -1
  200. package/apps/pwa/out/consult/index.txt +23 -23
  201. package/apps/pwa/out/control/index.html +1 -1
  202. package/apps/pwa/out/control/index.txt +23 -23
  203. package/apps/pwa/out/decisions/index.html +1 -1
  204. package/apps/pwa/out/decisions/index.txt +22 -22
  205. package/apps/pwa/out/design-check/index.html +1 -1
  206. package/apps/pwa/out/design-check/index.txt +23 -23
  207. package/apps/pwa/out/editor/index.html +1 -1
  208. package/apps/pwa/out/editor/index.txt +23 -23
  209. package/apps/pwa/out/exec/index.html +1 -1
  210. package/apps/pwa/out/exec/index.txt +23 -23
  211. package/apps/pwa/out/field/index.html +1 -1
  212. package/apps/pwa/out/field/index.txt +23 -23
  213. package/apps/pwa/out/healthz +1 -1
  214. package/apps/pwa/out/index.html +1 -1
  215. package/apps/pwa/out/index.txt +22 -22
  216. package/apps/pwa/out/inside/index.html +1 -1
  217. package/apps/pwa/out/inside/index.txt +22 -22
  218. package/apps/pwa/out/intake/index.html +1 -1
  219. package/apps/pwa/out/intake/index.txt +23 -23
  220. package/apps/pwa/out/live/index.html +1 -1
  221. package/apps/pwa/out/live/index.txt +23 -23
  222. package/apps/pwa/out/live-run/index.html +1 -1
  223. package/apps/pwa/out/live-run/index.txt +23 -23
  224. package/apps/pwa/out/loops/index.html +1 -1
  225. package/apps/pwa/out/loops/index.txt +22 -22
  226. package/apps/pwa/out/market/index.html +1 -1
  227. package/apps/pwa/out/market/index.txt +22 -22
  228. package/apps/pwa/out/missions/placeholder/index.html +1 -1
  229. package/apps/pwa/out/missions/placeholder/index.txt +22 -22
  230. package/apps/pwa/out/morning/index.html +1 -1
  231. package/apps/pwa/out/morning/index.txt +23 -23
  232. package/apps/pwa/out/observatory/index.html +1 -1
  233. package/apps/pwa/out/observatory/index.txt +23 -23
  234. package/apps/pwa/out/ops/checklist/index.html +1 -1
  235. package/apps/pwa/out/ops/checklist/index.txt +22 -22
  236. package/apps/pwa/out/ops/release/index.html +1 -1
  237. package/apps/pwa/out/ops/release/index.txt +22 -22
  238. package/apps/pwa/out/ops/seats/index.html +1 -1
  239. package/apps/pwa/out/ops/seats/index.txt +22 -22
  240. package/apps/pwa/out/outputs/index.html +1 -1
  241. package/apps/pwa/out/outputs/index.txt +22 -22
  242. package/apps/pwa/out/reflection/index.html +1 -1
  243. package/apps/pwa/out/reflection/index.txt +23 -23
  244. package/apps/pwa/out/scheduler/index.html +1 -1
  245. package/apps/pwa/out/scheduler/index.txt +23 -23
  246. package/apps/pwa/out/sessions/index.html +1 -1
  247. package/apps/pwa/out/sessions/index.txt +22 -22
  248. package/apps/pwa/out/settings/devices/index.html +1 -1
  249. package/apps/pwa/out/settings/devices/index.txt +23 -23
  250. package/apps/pwa/out/settings/index.html +1 -1
  251. package/apps/pwa/out/settings/index.txt +23 -23
  252. package/apps/pwa/out/setup/done/index.html +1 -1
  253. package/apps/pwa/out/setup/done/index.txt +23 -23
  254. package/apps/pwa/out/setup/index.html +1 -1
  255. package/apps/pwa/out/setup/index.txt +23 -23
  256. package/apps/pwa/out/share/index.html +1 -1
  257. package/apps/pwa/out/share/index.txt +23 -23
  258. package/apps/pwa/out/showroom/index.html +1 -1
  259. package/apps/pwa/out/showroom/index.txt +22 -22
  260. package/apps/pwa/out/tasks/index.html +1 -1
  261. package/apps/pwa/out/tasks/index.txt +23 -23
  262. package/apps/pwa/out/term/index.html +1 -1
  263. package/apps/pwa/out/term/index.txt +23 -23
  264. package/apps/pwa/out/today/index.html +1 -1
  265. package/apps/pwa/out/today/index.txt +23 -23
  266. package/apps/pwa/out/trace/index.html +1 -1
  267. package/apps/pwa/out/trace/index.txt +23 -23
  268. package/apps/pwa/out/vault/index.html +1 -1
  269. package/apps/pwa/out/vault/index.txt +23 -23
  270. package/apps/pwa/out/workflows/chat-ui/index.html +1 -1
  271. package/apps/pwa/out/workflows/chat-ui/index.txt +23 -23
  272. package/apps/pwa/out/workflows/index.html +1 -1
  273. package/apps/pwa/out/workflows/index.txt +23 -23
  274. package/apps/pwa/out/workspace/index.html +1 -1
  275. package/apps/pwa/out/workspace/index.txt +23 -23
  276. package/apps/pwa/out/worktrees/index.html +1 -1
  277. package/apps/pwa/out/worktrees/index.txt +23 -23
  278. package/graphs/drafts/recipes.yaml +27 -7
  279. package/graphs/release/recipes.yaml +9 -0
  280. package/graphs/release/release-loop.yaml +26 -18
  281. package/graphs/work/draft-close.yaml +54 -0
  282. package/graphs/work/green-close.yaml +37 -0
  283. package/graphs/work/recipes.yaml +46 -1
  284. package/graphs/work/run-research.yaml +35 -0
  285. package/package.json +1 -1
  286. package/scripts/__fixtures__/authoring-paths-10x3.json +32 -0
  287. package/scripts/ask-op-inbox-once.ts +17 -0
  288. package/scripts/boundary-proof-mapping-audit.ts +88 -0
  289. package/scripts/brand/check.ts +13 -4
  290. package/scripts/codex-fallback-live-probe.ts +17 -15
  291. package/scripts/fleet/node-setup.sh +32 -2
  292. package/scripts/fleet/run-light-worker.sh +9 -0
  293. package/scripts/gate-0226-accepted-remaining-90.txt +91 -0
  294. package/scripts/gate-0226-failure-census.ts +546 -0
  295. package/scripts/goals/authoring-metrics.ts +258 -0
  296. package/scripts/graph-units/draft-close-node.ts +222 -0
  297. package/scripts/hook-order-sweep.ts +7 -4
  298. package/scripts/intake-collect-telegram-saved-stage.ts +48 -0
  299. package/scripts/land-global-checks.ts +69 -1
  300. package/scripts/measure-nl-routing-corpus.ts +207 -2
  301. package/scripts/provision-export-redactions.ts +15 -0
  302. package/scripts/public-copy-lint.ts +122 -0
  303. package/scripts/public-export.ts +69 -2
  304. package/scripts/ratchets/next-tui-entry-budget.ts +124 -0
  305. package/scripts/ratchets/train-side-invariants.sh +7 -1
  306. package/scripts/release-loop/cut-branch.ts +61 -12
  307. package/scripts/release-loop/docs-node.ts +140 -0
  308. package/scripts/release-loop/gate-closure.ts +48 -0
  309. package/scripts/release-loop/gate-diff.ts +2 -1
  310. package/scripts/release-loop/gate-node.ts +161 -25
  311. package/scripts/release-loop/gate-partial.ts +82 -3
  312. package/scripts/release-loop/gate-prewarm-plan.ts +35 -0
  313. package/scripts/release-loop/gate-radius-live.ts +4 -2
  314. package/scripts/release-loop/known-issues-node.ts +6 -4
  315. package/scripts/release-loop/notes-repair.ts +216 -0
  316. package/scripts/release-loop/prepare-node.ts +61 -5
  317. package/scripts/release-loop/resume-cap.ts +2 -1
  318. package/scripts/release-loop/resume-release.ts +406 -7
  319. package/scripts/release-loop/resume-test-traffic.ts +10 -0
  320. package/scripts/release-loop/resume.ts +13 -5
  321. package/scripts/release-loop/traffic-node.ts +12 -4
  322. package/scripts/release-loop/traffic-transition.ts +53 -13
  323. package/scripts/release-loop/version-node.ts +109 -15
  324. package/scripts/train/green-leg.ts +176 -0
  325. package/scripts/tui-continue-real-evidence.ts +47 -0
  326. package/scripts/ux-sim.ts +1 -1
  327. package/scripts/video-pipeline.ts +2 -2
  328. package/src/acp/client.ts +31 -5
  329. package/src/acp/core-turn-bridge.ts +12 -1
  330. package/src/acp/stderr-summary.ts +49 -0
  331. package/src/agent/monad-agent-turn.ts +1 -0
  332. package/src/agent/run-context.ts +1 -1
  333. package/src/agent/task-notification.ts +3 -1
  334. package/src/agent/terminal-surface.ts +217 -0
  335. package/src/agent-substrate/pr-reviewer.ts +11 -3
  336. package/src/agent-substrate/review-observation.ts +10 -0
  337. package/src/agent-substrate/self-review-cli.ts +537 -57
  338. package/src/auto-research/question-ladder-contract.ts +137 -0
  339. package/src/auto-research/research-turn.ts +134 -0
  340. package/src/autopilot/discovery/doc-lint.ts +1 -1
  341. package/src/autopilot/lineage/sources.ts +1 -1
  342. package/src/autopilot/pr-manager.ts +64 -13
  343. package/src/boot/daemon-runtime.ts +35 -3
  344. package/src/boot/daemon-tools/pty-shell.ts +2 -1
  345. package/src/bots/screen-probe.ts +1 -1
  346. package/src/budget/run-usage-rollup.ts +12 -7
  347. package/src/budget/unified-usage.ts +20 -0
  348. package/src/capture/tui-self-report.ts +42 -5
  349. package/src/chat/index.ts +1 -0
  350. package/src/chat/tool-render/dispatch.ts +8 -1
  351. package/src/cli/autopilot-cli.ts +24 -9
  352. package/src/cli/decisions-cli.ts +7 -4
  353. package/src/cli/doctor-cli.ts +116 -7
  354. package/src/cli/guardian-cli.ts +3 -1
  355. package/src/cli/intake-cli.ts +48 -12
  356. package/src/cli/lesson-cli.ts +69 -9
  357. package/src/cli/logs-cli.ts +357 -2
  358. package/src/cli/memory-cli.ts +30 -1
  359. package/src/cli/msg-cli.ts +15 -11
  360. package/src/cli/pr-granularity.ts +5 -3
  361. package/src/cli/pr-land-overlap-evidence.ts +38 -5
  362. package/src/cli/pr-land-refusal.ts +1 -1
  363. package/src/cli/pty-takeover-cli.ts +58 -5
  364. package/src/cli/release-checklist-read-cli.ts +112 -4
  365. package/src/cli/release-cli.ts +89 -18
  366. package/src/cli/review-carry.ts +77 -0
  367. package/src/cli/self-update.ts +24 -6
  368. package/src/cli/self-utterances-cli.ts +13 -16
  369. package/src/cli/tasks-card-show.ts +31 -1
  370. package/src/cli/tasks-cli.ts +370 -33
  371. package/src/cli/tasks-read-cli.ts +13 -5
  372. package/src/cli/usage-cli.ts +12 -10
  373. package/src/context-bus/claude-memory-import.ts +99 -0
  374. package/src/context-bus/context-now.ts +86 -2
  375. package/src/context-bus/long-term-memory.ts +125 -0
  376. package/src/core-turn/run-core-turn.ts +9 -2
  377. package/src/core-turn/run-goal-loop.ts +5 -2
  378. package/src/core-turn/types.ts +5 -0
  379. package/src/dashboard/chat/acp-chat.ts +9 -0
  380. package/src/dashboard/index.ts +115 -30
  381. package/src/dashboard/input/agent-wake.ts +43 -0
  382. package/src/dashboard/input/chat-main-acp-dispatch.ts +21 -1
  383. package/src/dashboard/input/terminal-modal-router.ts +8 -159
  384. package/src/dashboard/replay-preview.ts +25 -0
  385. package/src/dashboard/side-basic-runtime.ts +61 -0
  386. package/src/dashboard/slash-runtime/dashboard-handlers.ts +19 -8
  387. package/src/dashboard/synchronized-frame-output.ts +74 -0
  388. package/src/dashboard/term-slash-runtime.ts +2 -0
  389. package/src/dashboard/turn-preamble.ts +28 -4
  390. package/src/display/coordinator.ts +45 -12
  391. package/src/display/resize-listener.ts +41 -20
  392. package/src/display/synchronized-output-region.ts +60 -0
  393. package/src/domains/guardian-tick.ts +9 -0
  394. package/src/domains/surface-events.ts +80 -1
  395. package/src/exec-requests/planner.ts +37 -2
  396. package/src/execution-loop/launch-gate.ts +4 -3
  397. package/src/git-fs/cli-stderr.ts +45 -0
  398. package/src/git-fs/gh-cli.ts +6 -3
  399. package/src/git-fs/git-cli.ts +11 -5
  400. package/src/git-fs/watcher.ts +27 -22
  401. package/src/git-fs/worktree.ts +19 -3
  402. package/src/graph-runner/graph-cli.ts +26 -2
  403. package/src/graph-runner/graph-grow.ts +37 -9
  404. package/src/graph-runner/graph-run-api.ts +3 -2
  405. package/src/graph-runner/runner.ts +34 -7
  406. package/src/graph-wizard/generate.ts +29 -6
  407. package/src/grok/credential.ts +107 -36
  408. package/src/harness/harness-cli-command.ts +179 -33
  409. package/src/harness/review-adapter.ts +26 -6
  410. package/src/hq/fence-wrapper.ts +1 -1
  411. package/src/hq/transfer.ts +1 -1
  412. package/src/index.ts +151 -18
  413. package/src/instance/test-write-guard-real-transport.fixture.ts +52 -0
  414. package/src/intake-plane/collect-telegram-saved.ts +54 -5
  415. package/src/interactive-terminal-modal.ts +3 -0
  416. package/src/keybindings.ts +17 -22
  417. package/src/llm/provider-credentials.ts +1 -1
  418. package/src/llm/route-decision.ts +13 -0
  419. package/src/llm-tool-name.ts +37 -0
  420. package/src/llm-tool-schema.ts +55 -0
  421. package/src/llm.ts +203 -21
  422. package/src/loops/checker.ts +100 -0
  423. package/src/loops/consensus.ts +26 -2
  424. package/src/loops/loop-cli.ts +9 -4
  425. package/src/loops/orchestrator/anomaly-cluster.ts +243 -0
  426. package/src/loops/orchestrator/inbox-once.ts +28 -0
  427. package/src/loops/orchestrator/inbox.ts +130 -1
  428. package/src/loops/orchestrator/tick.ts +55 -7
  429. package/src/maturity/feature-maturity.ts +1 -0
  430. package/src/model-tier/llm-tier-map.ts +12 -17
  431. package/src/msg/msg-store.ts +17 -0
  432. package/src/native-tool-catalog.ts +1 -1
  433. package/src/nexus/api/channel-ask-op.ts +96 -0
  434. package/src/nexus/api/discord-trigger-bot.ts +28 -1
  435. package/src/nexus/api/graph-wizard-api.ts +27 -2
  436. package/src/nexus/api/grid.ts +24 -4
  437. package/src/nexus/api/http-server.ts +1 -1
  438. package/src/nexus/api/ops-api.ts +14 -6
  439. package/src/nexus/api/telegram-trigger-bot.ts +24 -0
  440. package/src/nexus/api/terminals.ts +28 -6
  441. package/src/nexus/state/state.ts +7 -1
  442. package/src/oauth/codex-account-store.ts +34 -1
  443. package/src/ops/loops-map.ts +46 -0
  444. package/src/ops/overview-cache.ts +22 -4
  445. package/src/ops/overview.ts +41 -5
  446. package/src/patents/ledger.ts +18 -1
  447. package/src/policy/llm-policy.ts +3 -1
  448. package/src/preview/terminal.ts +4 -2
  449. package/src/prompt-cache/anthropic.ts +2 -0
  450. package/src/prompt-enhance/enhance.ts +9 -4
  451. package/src/pty-shell/availability.ts +7 -0
  452. package/src/pty-shell/herdr-agent-report.ts +40 -31
  453. package/src/pty-shell/herdr-prune-stale.ts +17 -0
  454. package/src/pty-shell/herdr-sequence-lease.ts +60 -0
  455. package/src/pty-shell/pty-control-ipc.ts +187 -18
  456. package/src/pty-shell/pty-manifest.ts +16 -2
  457. package/src/pty-shell/registry.ts +25 -15
  458. package/src/pty-shell/tui-run-state.ts +235 -1
  459. package/src/release-loop/checklist.ts +50 -5
  460. package/src/release-loop/feature-store.ts +9 -9
  461. package/src/release-loop/gate-shards.ts +61 -0
  462. package/src/release-loop/landed-but-yellow.ts +93 -12
  463. package/src/release-loop/light-rc.ts +7 -4
  464. package/src/release-loop/rehearsal.ts +1 -1
  465. package/src/repl/index.ts +18 -0
  466. package/src/research/axis-fanout.ts +133 -0
  467. package/src/research/edge-decision.ts +88 -0
  468. package/src/research/output-router.ts +127 -0
  469. package/src/research-bridge/format.ts +16 -1
  470. package/src/research-bridge/index.ts +1 -0
  471. package/src/research-bridge/invoke.ts +41 -5
  472. package/src/seat-loop/seat-report.ts +1 -0
  473. package/src/self-dev/ask-launch-flow.ts +86 -10
  474. package/src/self-dev/decompose-proposal.ts +29 -18
  475. package/src/self-dev/decompose.ts +45 -9
  476. package/src/self-dev/dev-pipeline.ts +29 -7
  477. package/src/self-dev/draft-residue.ts +221 -2
  478. package/src/self-dev/draft-sweep.ts +254 -16
  479. package/src/self-dev/draft-triage-rules.ts +19 -5
  480. package/src/self-dev/orchestrate.ts +1 -0
  481. package/src/self-dev/review-provider-fallback.ts +45 -7
  482. package/src/self-dev/run-supervisor.ts +22 -7
  483. package/src/self-dev/shard-plan.ts +48 -0
  484. package/src/self-dev/shard-run.ts +310 -6
  485. package/src/self-implement/comment-only-source.ts +54 -0
  486. package/src/self-implement/doctor-visit.ts +108 -0
  487. package/src/self-implement/gate-artifacts.ts +6 -2
  488. package/src/self-implement/gate-baseline.ts +99 -1
  489. package/src/self-implement/gate-cli.ts +231 -82
  490. package/src/self-implement/gate-failure-signature.ts +44 -0
  491. package/src/self-implement/gate-remote.ts +30 -4
  492. package/src/self-implement/gate-scope.ts +13 -1
  493. package/src/self-implement/goal-author.ts +407 -21
  494. package/src/self-implement/goal-doc/section.ts +22 -0
  495. package/src/self-implement/goal-supervisor-fill.ts +110 -27
  496. package/src/self-implement/importer-test-index.ts +215 -2
  497. package/src/self-implement/knowhow-pack.ts +125 -12
  498. package/src/self-implement/l8-merge-queue.ts +198 -32
  499. package/src/self-implement/off-diff-evidence.ts +23 -0
  500. package/src/self-implement/orchestrator.ts +369 -33
  501. package/src/self-implement/pod-inplace-worktree.ts +82 -0
  502. package/src/self-implement/pod-warm-pool-profile.ts +2 -2
  503. package/src/self-implement/premise-review.ts +7 -5
  504. package/src/self-implement/review-round-brief.ts +300 -0
  505. package/src/self-implement/rework-policy.ts +14 -0
  506. package/src/self-implement/run-ledger.ts +428 -6
  507. package/src/self-implement/run-stop.ts +1 -1
  508. package/src/self-implement/running-runs.ts +17 -3
  509. package/src/self-implement/seams.ts +45 -16
  510. package/src/self-implement/self-implement-cli.ts +26 -2
  511. package/src/self-implement/stop-autoheal.ts +1 -0
  512. package/src/self-implement/test-seams.ts +13 -1
  513. package/src/self-implement/train-reach-grouping.ts +8 -2
  514. package/src/session/channel-ask-op-envelope.ts +36 -0
  515. package/src/session/channel-op-reply-route.ts +200 -0
  516. package/src/session/chat.ts +10 -1
  517. package/src/session/id-prefix.ts +60 -0
  518. package/src/session/index.ts +6 -0
  519. package/src/session-runtime/index.ts +18 -23
  520. package/src/skills/runner.ts +7 -3
  521. package/src/skills/tools/dev-harness.ts +2 -2
  522. package/src/skills/tools/pty.ts +5 -0
  523. package/src/skills/tools/schedule-wakeup.ts +1 -6
  524. package/src/status/bar.ts +3 -3
  525. package/src/status/metrics.ts +12 -1
  526. package/src/steward/rejudge-tick.ts +12 -5
  527. package/src/steward/resync-tick.ts +31 -4
  528. package/src/storage/file-lock.ts +17 -4
  529. package/src/task-agent/actions.ts +199 -4
  530. package/src/task-agent/adopt-pr.ts +63 -2
  531. package/src/task-agent/boundary-proof-mapping.ts +12 -0
  532. package/src/task-agent/boundary-proof-producer.ts +147 -0
  533. package/src/task-agent/completion-evidence.ts +2 -1
  534. package/src/task-agent/evidence-command-normalize.ts +42 -0
  535. package/src/task-agent/export-redactions-provision.ts +43 -0
  536. package/src/task-agent/green-close-recipe.ts +239 -0
  537. package/src/task-agent/green-sweep.ts +64 -10
  538. package/src/task-agent/live-moves.ts +48 -3
  539. package/src/task-agent/map-host-adapter.ts +134 -0
  540. package/src/task-agent/map-reduce.ts +158 -0
  541. package/src/task-agent/map-run-ledger.ts +226 -0
  542. package/src/task-agent/parent-host.ts +74 -17
  543. package/src/task-agent/rejudge-on-head.ts +72 -5
  544. package/src/task-agent/repair-cycle.ts +108 -8
  545. package/src/task-agent/repair-next-move.ts +12 -2
  546. package/src/task-agent/repair-worker.ts +37 -1
  547. package/src/task-agent/review-prior-fix.ts +12 -2
  548. package/src/task-agent/shadow.ts +188 -5
  549. package/src/task-agent/task-hand.ts +253 -20
  550. package/src/task-agent/task-parent-role-llm.ts +9 -0
  551. package/src/task-agent/tier-split.ts +40 -5
  552. package/src/task-agent/work-order.ts +53 -2
  553. package/src/task-orchestrator/dispatcher.ts +46 -1
  554. package/src/task-orchestrator/generator-prompt.ts +6 -0
  555. package/src/task-orchestrator/surfaces/pod-artifact-return.ts +16 -6
  556. package/src/task-orchestrator/surfaces/pod-failure-reason.ts +31 -4
  557. package/src/task-orchestrator/surfaces/pod-ledger-collect.ts +8 -6
  558. package/src/task-orchestrator/surfaces/pod-ledger-events.ts +97 -0
  559. package/src/task-orchestrator/surfaces/pod-pool.ts +77 -8
  560. package/src/task-orchestrator/surfaces/pod-warm-worker-provider.ts +15 -9
  561. package/src/task-orchestrator/surfaces/self-implement-pod.ts +338 -79
  562. package/src/task-orchestrator/surfaces/self-implement.ts +37 -2
  563. package/src/terminal/session-registry.ts +1 -0
  564. package/src/terminal/terminal-modal-router.ts +156 -0
  565. package/src/testing/linux-env.ts +177 -0
  566. package/src/tool-hints/gate.ts +6 -4
  567. package/src/tool-hints/signals.ts +33 -1
  568. package/src/tui/chat/background-job-status.ts +8 -2
  569. package/src/tui/chat/goal-interim.ts +5 -1
  570. package/src/tui/entry.ts +722 -30
  571. package/src/tui/input/at-picker.ts +55 -0
  572. package/src/tui/sidetab/attach.ts +304 -0
  573. package/src/tui/sidetab/list.ts +176 -0
  574. package/src/tui/sidetab/nl-tool.ts +136 -0
  575. package/src/tui/slash/resume-command.ts +23 -0
  576. package/src/tui/slash/resume.ts +38 -35
  577. package/src/tui/slash/signals.ts +114 -0
  578. package/src/tui/slash/term-next.ts +72 -0
  579. package/src/tui-client/local-chat-turn.ts +31 -9
  580. package/src/user-config.ts +30 -3
  581. package/src/ux-sim/boot-daemon-tools-pty-shell-device.ts +136 -0
  582. package/src/ux-sim/classic-tui-seat-scenarios.ts +158 -4
  583. package/src/ux-sim/fake-gh.ts +174 -0
  584. package/src/ux-sim/fake-kubectl.ts +142 -0
  585. package/src/ux-sim/fake-llm.ts +17 -6
  586. package/src/ux-sim/next-tui-seat-scenarios.ts +176 -6
  587. package/src/ux-sim/resume-picker-device.ts +173 -0
  588. package/src/ux-sim/session-id-seed.ts +60 -0
  589. package/src/ux-sim/skills-tools-shell-device.ts +156 -0
  590. package/src/ux-sim/task-agent-parent-host-device.ts +264 -0
  591. package/src/ux-sim/task-agent-rejudge-on-head-device.ts +114 -0
  592. package/src/version/packed-revision.json +1 -1
  593. package/apps/pwa/out/_next/static/chunks/109.f196abf3484bb97f.js +0 -287
  594. package/apps/pwa/out/_next/static/chunks/1201.afbfc5b1c5e5cbe4.js +0 -1
  595. package/apps/pwa/out/_next/static/chunks/1517.9275b89572098ff3.js +0 -1
  596. package/apps/pwa/out/_next/static/chunks/1574.ad11f8db8396ab45.js +0 -1
  597. package/apps/pwa/out/_next/static/chunks/1614.7a8c5c40aee0261f.js +0 -1
  598. package/apps/pwa/out/_next/static/chunks/1871-f1eb29d8dbb4065b.js +0 -1
  599. package/apps/pwa/out/_next/static/chunks/190.285c832bd9626f8c.js +0 -64
  600. package/apps/pwa/out/_next/static/chunks/2193.0ea24c4a7aa1d004.js +0 -36
  601. package/apps/pwa/out/_next/static/chunks/223-ad865c1e80491d78.js +0 -1
  602. package/apps/pwa/out/_next/static/chunks/2265-f0d90b6dbec05f81.js +0 -1
  603. package/apps/pwa/out/_next/static/chunks/2267.eb4a62a209f09ec4.js +0 -149
  604. package/apps/pwa/out/_next/static/chunks/2341-86cd06c0cf01aa33.js +0 -1
  605. package/apps/pwa/out/_next/static/chunks/2352.9abc42422bade876.js +0 -1
  606. package/apps/pwa/out/_next/static/chunks/2397-c1653a816061842d.js +0 -1
  607. package/apps/pwa/out/_next/static/chunks/2500.cbc1257b774aae52.js +0 -1
  608. package/apps/pwa/out/_next/static/chunks/2709.8e1889034255fc5f.js +0 -24
  609. package/apps/pwa/out/_next/static/chunks/284.ac77c0db55bfd3a8.js +0 -1
  610. package/apps/pwa/out/_next/static/chunks/2941.3c3546f96bc6efa7.js +0 -1
  611. package/apps/pwa/out/_next/static/chunks/2976.b000698a3c6512dc.js +0 -24
  612. package/apps/pwa/out/_next/static/chunks/2986.45d7652e4f13557e.js +0 -2
  613. package/apps/pwa/out/_next/static/chunks/3155.2587a55196ecb394.js +0 -226
  614. package/apps/pwa/out/_next/static/chunks/3277.785db1cf09f98601.js +0 -1
  615. package/apps/pwa/out/_next/static/chunks/3320-f9c77381f85a2c0a.js +0 -1
  616. package/apps/pwa/out/_next/static/chunks/3386-91049feabff9a94e.js +0 -1
  617. package/apps/pwa/out/_next/static/chunks/339.80afb7e8839372af.js +0 -8
  618. package/apps/pwa/out/_next/static/chunks/3538.a445e50bb359d068.js +0 -32
  619. package/apps/pwa/out/_next/static/chunks/3540c645.2595a6af01a97672.js +0 -1
  620. package/apps/pwa/out/_next/static/chunks/3621.581b2054cc14bee4.js +0 -286
  621. package/apps/pwa/out/_next/static/chunks/3676.8c28d16fd84ca843.js +0 -1
  622. package/apps/pwa/out/_next/static/chunks/375-b84540853523fe52.js +0 -1
  623. package/apps/pwa/out/_next/static/chunks/3757-180308bc61021b05.js +0 -1
  624. package/apps/pwa/out/_next/static/chunks/379.ee262e37586fe1ae.js +0 -74
  625. package/apps/pwa/out/_next/static/chunks/3840-5825d56d46976a92.js +0 -1
  626. package/apps/pwa/out/_next/static/chunks/3969-81054381eaec4c4c.js +0 -1
  627. package/apps/pwa/out/_next/static/chunks/4067-bf9aa60547972937.js +0 -1
  628. package/apps/pwa/out/_next/static/chunks/4176.e5729c93c29151eb.js +0 -104
  629. package/apps/pwa/out/_next/static/chunks/4227-e6c84686bc8946ca.js +0 -1
  630. package/apps/pwa/out/_next/static/chunks/4327.b9e08a71c0009348.js +0 -1
  631. package/apps/pwa/out/_next/static/chunks/4946.bd106eafd668f248.js +0 -148
  632. package/apps/pwa/out/_next/static/chunks/5085-bce4904931767ca6.js +0 -1
  633. package/apps/pwa/out/_next/static/chunks/5125.2eb9968b83767193.js +0 -93
  634. package/apps/pwa/out/_next/static/chunks/5128-75b733fd74a9a1eb.js +0 -1
  635. package/apps/pwa/out/_next/static/chunks/5489f3fe.4bb1458b09f6dead.js +0 -122
  636. package/apps/pwa/out/_next/static/chunks/5560-2a4648f6a30f16e7.js +0 -1
  637. package/apps/pwa/out/_next/static/chunks/5772-e29e14f8ff127122.js +0 -1
  638. package/apps/pwa/out/_next/static/chunks/5887.5b2f5b44ce0f7e9a.js +0 -1
  639. package/apps/pwa/out/_next/static/chunks/5899-4c112a2d908cf97f.js +0 -1
  640. package/apps/pwa/out/_next/static/chunks/6041.1b65efb796ebc2a5.js +0 -79
  641. package/apps/pwa/out/_next/static/chunks/6057-765c0a26028c86b2.js +0 -1
  642. package/apps/pwa/out/_next/static/chunks/6142.f289e0d039f453a6.js +0 -1
  643. package/apps/pwa/out/_next/static/chunks/6199-6bcd61d2a3910e04.js +0 -1
  644. package/apps/pwa/out/_next/static/chunks/6236.cdf7293e710a9b2d.js +0 -1
  645. package/apps/pwa/out/_next/static/chunks/6387-237e079dac9a3ae6.js +0 -1
  646. package/apps/pwa/out/_next/static/chunks/6448-b6d272d074276e14.js +0 -1
  647. package/apps/pwa/out/_next/static/chunks/6466-92e65a48490b68a9.js +0 -1
  648. package/apps/pwa/out/_next/static/chunks/6580-cdc0e4a634ce4708.js +0 -1
  649. package/apps/pwa/out/_next/static/chunks/6659-b242dc31b20b3f29.js +0 -1
  650. package/apps/pwa/out/_next/static/chunks/6690.c5d9b321b1f79384.js +0 -1
  651. package/apps/pwa/out/_next/static/chunks/671-e9b6ad0c771c5514.js +0 -1
  652. package/apps/pwa/out/_next/static/chunks/6862.bcbf89dd0f4496b3.js +0 -27
  653. package/apps/pwa/out/_next/static/chunks/6912-7b375ee48732c767.js +0 -1
  654. package/apps/pwa/out/_next/static/chunks/727.7deb87749b0a343a.js +0 -1
  655. package/apps/pwa/out/_next/static/chunks/7481.39f7a4654907bf6e.js +0 -1
  656. package/apps/pwa/out/_next/static/chunks/7545.b1aa42cd15503319.js +0 -1
  657. package/apps/pwa/out/_next/static/chunks/7551-416d298c2dc4a9ab.js +0 -1
  658. package/apps/pwa/out/_next/static/chunks/7870-309de463786ac1fc.js +0 -1
  659. package/apps/pwa/out/_next/static/chunks/7888-e29b151bb6a3bb8b.js +0 -1
  660. package/apps/pwa/out/_next/static/chunks/7891.03f910124a737985.js +0 -1
  661. package/apps/pwa/out/_next/static/chunks/7905-6ba78d9234608f79.js +0 -1
  662. package/apps/pwa/out/_next/static/chunks/8207.f527886b7c464529.js +0 -1
  663. package/apps/pwa/out/_next/static/chunks/856.50bda61439d465e6.js +0 -62
  664. package/apps/pwa/out/_next/static/chunks/9031-92e9b487edb681ee.js +0 -1
  665. package/apps/pwa/out/_next/static/chunks/9060.5410d9f6a95f6287.js +0 -90
  666. package/apps/pwa/out/_next/static/chunks/914.8abefd48d579547b.js +0 -94
  667. package/apps/pwa/out/_next/static/chunks/9187-c87a2207d4ac5d46.js +0 -1
  668. package/apps/pwa/out/_next/static/chunks/9289.3e92f278821e18e0.js +0 -1
  669. package/apps/pwa/out/_next/static/chunks/9319.7816d3cc741cd34f.js +0 -1
  670. package/apps/pwa/out/_next/static/chunks/9327-e016bb9f1674d24f.js +0 -1
  671. package/apps/pwa/out/_next/static/chunks/9365.3de48bf75193ff9a.js +0 -77
  672. package/apps/pwa/out/_next/static/chunks/9383.5b5e9aa56b5fea97.js +0 -1
  673. package/apps/pwa/out/_next/static/chunks/9387-cb929573ef436f39.js +0 -1
  674. package/apps/pwa/out/_next/static/chunks/9489.c27becacc3283dec.js +0 -1
  675. package/apps/pwa/out/_next/static/chunks/9514.131c52cc75fe6439.js +0 -1
  676. package/apps/pwa/out/_next/static/chunks/9536.28962663c7734376.js +0 -1
  677. package/apps/pwa/out/_next/static/chunks/9686-12286f5bbf15a5a0.js +0 -1
  678. package/apps/pwa/out/_next/static/chunks/9776.289d40cc5a4c342a.js +0 -1
  679. package/apps/pwa/out/_next/static/chunks/9789.60f723d18097ec30.js +0 -1
  680. package/apps/pwa/out/_next/static/chunks/989.f0c17523c5e61f65.js +0 -1
  681. package/apps/pwa/out/_next/static/chunks/9972-1df393aa8d4f7d52.js +0 -1
  682. package/apps/pwa/out/_next/static/chunks/app/_not-found/page-96750aba7430959f.js +0 -1
  683. package/apps/pwa/out/_next/static/chunks/app/approvals/page-4105e5bbbb043024.js +0 -1
  684. package/apps/pwa/out/_next/static/chunks/app/autopilot/page-5d4fa75c2acb113e.js +0 -1
  685. package/apps/pwa/out/_next/static/chunks/app/board/page-a79a9bdb3b2142bf.js +0 -1
  686. package/apps/pwa/out/_next/static/chunks/app/botlab/page-f1c2047484992a35.js +0 -1
  687. package/apps/pwa/out/_next/static/chunks/app/bots/page-15ffc49b2d8c70e2.js +0 -1
  688. package/apps/pwa/out/_next/static/chunks/app/ceo/page-67d53a3fc8734135.js +0 -1
  689. package/apps/pwa/out/_next/static/chunks/app/chat/page-e30c8dc696491336.js +0 -1
  690. package/apps/pwa/out/_next/static/chunks/app/consult/page-2136e04fa77696e2.js +0 -1
  691. package/apps/pwa/out/_next/static/chunks/app/control/page-fecd2814790c2e12.js +0 -1
  692. package/apps/pwa/out/_next/static/chunks/app/decisions/page-280aa4a98fc5bb44.js +0 -1
  693. package/apps/pwa/out/_next/static/chunks/app/design-check/page-c14e96b65fb4b883.js +0 -1
  694. package/apps/pwa/out/_next/static/chunks/app/editor/page-187dac74825ed6bf.js +0 -1
  695. package/apps/pwa/out/_next/static/chunks/app/exec/page-6bc7246ea8c92448.js +0 -1
  696. package/apps/pwa/out/_next/static/chunks/app/field/page-083747f1d4518f61.js +0 -1
  697. package/apps/pwa/out/_next/static/chunks/app/healthz/route-96750aba7430959f.js +0 -1
  698. package/apps/pwa/out/_next/static/chunks/app/inside/page-15ca95a16ec96e1f.js +0 -1
  699. package/apps/pwa/out/_next/static/chunks/app/intake/page-a8ac031b3810eb64.js +0 -1
  700. package/apps/pwa/out/_next/static/chunks/app/layout-8835f93110494cda.js +0 -1
  701. package/apps/pwa/out/_next/static/chunks/app/live/page-e2de2e59111c9aad.js +0 -1
  702. package/apps/pwa/out/_next/static/chunks/app/live-run/page-f2b2e4bf6e981450.js +0 -1
  703. package/apps/pwa/out/_next/static/chunks/app/loops/page-5b92b7f75df20948.js +0 -1
  704. package/apps/pwa/out/_next/static/chunks/app/market/page-468eddf2b1a84ecb.js +0 -1
  705. package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-2af16e62c12f22df.js +0 -1
  706. package/apps/pwa/out/_next/static/chunks/app/morning/page-18b40867a77a5793.js +0 -1
  707. package/apps/pwa/out/_next/static/chunks/app/not-found-fe934f2979f5a4a2.js +0 -1
  708. package/apps/pwa/out/_next/static/chunks/app/observatory/page-3eec435537357170.js +0 -1
  709. package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-ff88cbfd2aa99fc8.js +0 -1
  710. package/apps/pwa/out/_next/static/chunks/app/ops/release/page-a5b39fb780c70ab5.js +0 -1
  711. package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-ae465dde1d1b3933.js +0 -1
  712. package/apps/pwa/out/_next/static/chunks/app/page-cab9674fde9ead26.js +0 -1
  713. package/apps/pwa/out/_next/static/chunks/app/reflection/page-1da49bc8712284d0.js +0 -1
  714. package/apps/pwa/out/_next/static/chunks/app/scheduler/page-5e8aa657551ac912.js +0 -1
  715. package/apps/pwa/out/_next/static/chunks/app/sessions/page-fcc36f36c6dc1fe2.js +0 -1
  716. package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-d22db22f2a7296ca.js +0 -1
  717. package/apps/pwa/out/_next/static/chunks/app/settings/page-d12dc7b1773878f0.js +0 -1
  718. package/apps/pwa/out/_next/static/chunks/app/setup/done/page-99debec9ea7fbec0.js +0 -1
  719. package/apps/pwa/out/_next/static/chunks/app/setup/layout-96750aba7430959f.js +0 -1
  720. package/apps/pwa/out/_next/static/chunks/app/setup/page-2a088a78bad7e924.js +0 -1
  721. package/apps/pwa/out/_next/static/chunks/app/share/page-2e8ed57db7e69993.js +0 -1
  722. package/apps/pwa/out/_next/static/chunks/app/showroom/page-4b3a16213c2ae8fe.js +0 -1
  723. package/apps/pwa/out/_next/static/chunks/app/tasks/page-f098747ddf38c98b.js +0 -1
  724. package/apps/pwa/out/_next/static/chunks/app/today/page-68279e3c843c1fd7.js +0 -1
  725. package/apps/pwa/out/_next/static/chunks/app/trace/page-a34a74453367a39d.js +0 -1
  726. package/apps/pwa/out/_next/static/chunks/app/vault/page-8767a7db2155a5bd.js +0 -1
  727. package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-bd5976683460d7f2.js +0 -1
  728. package/apps/pwa/out/_next/static/chunks/app/workflows/page-b7364835e7f2ef54.js +0 -1
  729. package/apps/pwa/out/_next/static/chunks/app/workspace/page-311af16b3ee0ffca.js +0 -1
  730. package/apps/pwa/out/_next/static/chunks/app/worktrees/page-fb670757274ae990.js +0 -1
  731. package/apps/pwa/out/_next/static/chunks/ccae1c4b-0cf414f5eff1b10d.js +0 -1
  732. package/apps/pwa/out/_next/static/chunks/f9a61e4d.1fc2c1dbdd49fe46.js +0 -1
  733. package/apps/pwa/out/_next/static/chunks/framework-6d497cbf1eef04c6.js +0 -1
  734. package/apps/pwa/out/_next/static/chunks/main-app-012f5edec932f337.js +0 -1
  735. package/apps/pwa/out/_next/static/chunks/main-da5aeb809edc94a2.js +0 -1
  736. package/apps/pwa/out/_next/static/chunks/pages/_app-5ee319af6f749dfe.js +0 -1
  737. package/apps/pwa/out/_next/static/chunks/pages/_error-4bc84653a718d6c6.js +0 -1
  738. package/apps/pwa/out/_next/static/chunks/webpack-8a96cf6775c73d6e.js +0 -1
  739. package/scripts/migrate-monad-to-elanous.ts +0 -195
  740. package/scripts/rebrand-elanous.ts +0 -242
  741. /package/apps/pwa/out/_next/static/{uC-N0emedeNOFuaBQFv-I → RrjXTwz-urRAbChP1bX02}/_ssgManifest.js +0 -0
@@ -255,6 +255,62 @@ import {
255
255
  getDashboardContextMenuRegistry,
256
256
  } from './context-menu/registry.js';
257
257
  import { createTransientOverlayHost } from '../display/transient-overlay-host.js';
258
+ import { beginSynchronizedFrameOutput } from './synchronized-frame-output.js';
259
+ import type { SynchronizedFrameOutputDeps } from './synchronized-frame-output.js';
260
+ export {
261
+ beginSynchronizedFrameOutput,
262
+ SYNCHRONIZED_OUTPUT_BEGIN,
263
+ SYNCHRONIZED_OUTPUT_END,
264
+ } from './synchronized-frame-output.js';
265
+ export type {
266
+ SynchronizedFrameOutput,
267
+ SynchronizedFrameOutputDeps,
268
+ } from './synchronized-frame-output.js';
269
+
270
+ /**
271
+ * TUI-FLICKER-DRAW-INTEGRATION — the single synchronized-output owner that every
272
+ * dashboard draw entry goes through: BSU → draw body (frame + coordinator modal
273
+ * overlay + prompt repaint) → ESU. The finally keeps the region closed when the
274
+ * body throws, so a failed compose cannot leave a dangling BSU that swallows the
275
+ * next frame.
276
+ */
277
+ export function runSynchronizedFrameDraw<T>(
278
+ drawBody: () => T,
279
+ deps: SynchronizedFrameOutputDeps,
280
+ ): T {
281
+ const frame = beginSynchronizedFrameOutput(deps);
282
+ try {
283
+ return drawBody();
284
+ } finally {
285
+ frame.close();
286
+ }
287
+ }
288
+
289
+ export interface SynchronizedFrameDrawSink {
290
+ write: (chunk: string) => void;
291
+ /** Production passes `process.stdout.isTTY`: only a tty receives DEC 2026. */
292
+ isTTY?: boolean;
293
+ /** Environment for the `ELANOUS_SYNC_OUTPUT` escape hatch. Defaults to `process.env`. */
294
+ env?: Record<string, string | undefined>;
295
+ }
296
+
297
+ /**
298
+ * TUI-FLICKER-DRAW-INTEGRATION — production entry for a synchronized dashboard
299
+ * frame. `drawNow` (the single draw function both the force path and the queued
300
+ * microtask path call) hands its compose body to this function, so the tty gate
301
+ * and the BSU/ESU ownership live in exactly one place.
302
+ */
303
+ export function drawDashboardFrameSynchronized<T>(
304
+ drawBody: () => T,
305
+ sink: SynchronizedFrameDrawSink = process.stdout,
306
+ ): T {
307
+ return runSynchronizedFrameDraw(drawBody, {
308
+ write: (chunk) => { sink.write(chunk); },
309
+ supported: sink.isTTY === true,
310
+ env: sink.env,
311
+ });
312
+ }
313
+
258
314
  import { configureThemeIconsGetter } from '../theme/icons.js';
259
315
  import { configureModalAdapterTheme } from '../ui/modal-adapter.js';
260
316
  import {
@@ -947,7 +1003,7 @@ import { runPtySnapshot, type PtyTakeoverCommandDeps } from '../cli/pty-takeover
947
1003
  import { requestRemotePtyControl } from '../pty-shell/pty-control-ipc.js';
948
1004
  import { getHarnessRunId } from '../harness/harness-space.js';
949
1005
  import { formatPtyCallLine, formatPtyResultLine } from '../pty-activity-log.js';
950
- import { getSessionMetrics } from '../status/metrics.js';
1006
+ import { getSessionMetrics, noteRestoredContext } from '../status/metrics.js';
951
1007
  import {
952
1008
  createContextRegistry, tokenizeInput, pruneUnreferenced,
953
1009
  addAttachmentEx as ctxAddEx,
@@ -1024,7 +1080,7 @@ import {
1024
1080
  deriveDaemonHttpBase,
1025
1081
  fetchDaemonSessionHistory,
1026
1082
  } from './acp-boot.js';
1027
- import { renderReplayPreviewLines } from './replay-preview.js';
1083
+ import { renderRestoredTranscriptLines } from './replay-preview.js';
1028
1084
  import {
1029
1085
  buildDashboardTurnPreamble,
1030
1086
  } from './turn-preamble.js';
@@ -1062,6 +1118,7 @@ import { spawnCodingAgent, CodingAgentBinaryMissing } from '../terminal/coding-a
1062
1118
  import type { TerminalSession } from '../terminal/session-registry.js';
1063
1119
  import { createSessionPickerModal } from '../session/picker-modal.js';
1064
1120
  import { listSessions as listChatSessionsForResume, adoptSession as adoptChatSession, setActiveSessionId as markActiveChatSession } from '../session/index.js';
1121
+ import { idPrefixCell, sessionIdPrefixes, sessionListTime } from '../session/id-prefix.js';
1065
1122
  // TUI 부활 S-b — 타임트래블 포크 엔진 (codex ForkSnapshot 동형 · 2026-07-09
1066
1123
  // 이식 후 호출처 0 이던 방치 자산 회수). 순수 히스토리 절단 로직만 소비;
1067
1124
  // 영속은 세션 스토어(forkSessionFromHistory)가 담당한다.
@@ -1213,7 +1270,7 @@ import { type ExecutionSurfaceHandle } from '../display/index.js';
1213
1270
  import { AgentSurfaceStore, renderAgentDetail, renderAgentRoster, type AgentSurfaceState } from '../display/agent-surface.js';
1214
1271
  import { globalAgentFlash } from '../display/agent-flash.js';
1215
1272
  import { globalTaskNotificationQueue, type TaskNotificationQueue, type PendingTaskNotification } from '../agent/task-notification.js';
1216
- import { createDashboardAgentWakeNotify, installAgentWake, wrapAgentWakePort } from './input/agent-wake.js';
1273
+ import { createDashboardAgentWakeNotify, installSeatedAgentWake, wrapAgentWakePort } from './input/agent-wake.js';
1217
1274
  import { renderDebugEventDetail, renderDebugEventRows, renderDebugStack, renderPromptInjectionDebug } from '../display/debug-surface.js';
1218
1275
  import { buildDebugCallStack } from '../debug/call-stack.js';
1219
1276
  import { buildAstGrepHostTool } from '../skills/tools/ast-grep.js';
@@ -2752,16 +2809,18 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
2752
2809
  // Pickers share the composer bottom slot.
2753
2810
  const placement = resolveDecisionPickerPlacement({ height: 16 });
2754
2811
  const modalWidth = placement.width;
2812
+ // Unique prefixes, not a fixed 8 — two sessions sharing 8 characters used to look identical (TUI-RESUME-PICKER).
2813
+ const idPrefixes = sessionIdPrefixes(rows.map((m) => m.id));
2755
2814
  const fmtRow = (m: (typeof rows)[number]): string => {
2756
2815
  const marker = m.id === attachedSessionId ? '▸ ' : ' ';
2757
- const ts = m.updatedAt.slice(5, 16).replace('T', ' ');
2816
+ const ts = sessionListTime(m.updatedAt);
2758
2817
  const binds: string[] = [];
2759
2818
  if (m.bindings?.cli) binds.push('cli');
2760
2819
  if (m.bindings?.telegram) binds.push('tg');
2761
2820
  if (m.bindings?.discord) binds.push('dc');
2762
2821
  const bindStr = binds.length > 0 ? `[${binds.join(',')}]` : '';
2763
2822
  const title = (m.title || '(no title)').slice(0, 42);
2764
- return `${marker}${m.id.slice(0, 8)} ${ts} ${String(m.messageCount).padStart(3)}t ${bindStr.padEnd(9)} ${title}`;
2823
+ return `${marker}${idPrefixCell(idPrefixes, m.id)} ${ts} ${String(m.messageCount).padStart(3)}t ${bindStr.padEnd(9)} ${title}`;
2765
2824
  };
2766
2825
  const handle = createSearchModal({
2767
2826
  id: `session-resume:${Date.now().toString(36)}`,
@@ -2788,7 +2847,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
2788
2847
  promptCtl.submit(`/session load ${id}`);
2789
2848
  } else {
2790
2849
  // 입력 루프 비활성 등으로 합성 submit 불가 — 수동 안내 폴백.
2791
- chatLines.push(C.muted(` /session load ${id.slice(0, 8)} 를 입력해 재개하세요`));
2850
+ chatLines.push(C.muted(` /session load ${idPrefixes.get(id) ?? id} 를 입력해 재개하세요`));
2792
2851
  chatScrollOffset = -1;
2793
2852
  draw();
2794
2853
  }
@@ -5019,8 +5078,8 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
5019
5078
  };
5020
5079
 
5021
5080
  // P5 — register the mode-enter actions + default chord bindings so
5022
- // `Ctrl+B s` from input focus enters sync, `Ctrl+B c` enters
5023
- // control, `Ctrl+B g` returns to general. The `allowOverwrite`
5081
+ // `Ctrl+X s` from input focus enters sync, `Ctrl+X c` enters
5082
+ // control, `Ctrl+X g` returns to general. The `allowOverwrite`
5024
5083
  // flag is critical because this closure may re-run on hot-reload
5025
5084
  // scenarios (tests, plugin reinit) — the registry should be idempotent.
5026
5085
  // A2 — forward-declared toast hook. mouseWiring is initialized
@@ -5041,7 +5100,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
5041
5100
  handler: () => {
5042
5101
  enterSessionControlMode(chatModeState);
5043
5102
  void inputCoreSetMode(resolveSessionInputModeFromChatMode({ chatModeState }));
5044
- chatLines.push(C.error('-- CONTROL MODE —') + C.text(' (via ^B c chord)'));
5103
+ chatLines.push(C.error('-- CONTROL MODE —') + C.text(' (via ^X c chord)'));
5045
5104
  chatScrollOffset = -1;
5046
5105
  draw();
5047
5106
  pushModeToast('→ control mode', 'success');
@@ -7422,7 +7481,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
7422
7481
  // Scratch visibility (Phase S5). When closed, the workingDir
7423
7482
  // layouts drop the scratch cell so the remaining panes expand
7424
7483
  // to fill the reclaimed columns — useful on narrow terminals.
7425
- // Reopen via the ^B ^S chord.
7484
+ // Reopen via the ^X ^S chord.
7426
7485
  let scratchClosed = false;
7427
7486
  const dashboardViewRegistryOptions = () => ({
7428
7487
  extraPanes: pluginHost.activeDashboardPanes().map(p => p.paneId),
@@ -7617,10 +7676,9 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
7617
7676
  );
7618
7677
  };
7619
7678
 
7620
- // Prefix chord (Phase O6). tmux-style Ctrl+B arms the chord; the
7621
- // next key within the timeout window triggers a bound action
7622
- // (Ctrl+W / Ctrl+O for browser focus). HUD segment `chord` shows
7623
- // `[^B]` while armed so the user knows the terminal is waiting.
7679
+ // Prefix chord (Phase O6). Ctrl+X arms the chord; the next key
7680
+ // within the timeout window triggers a bound action. HUD segment
7681
+ // `chord` shows `[^X]` while armed.
7624
7682
  const chord: ChordState = createChord();
7625
7683
  const disarmChordHud = (): void => {
7626
7684
  disarmChord(chord);
@@ -7693,7 +7751,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
7693
7751
  let previewTerminalDims: { cols: number; rows: number } | null = null;
7694
7752
  // Phase T7 — when true, the preview widget swells to the full
7695
7753
  // top-row width, hiding browser / scratch / obsidian / skill
7696
- // siblings. Toggled by `^B e` / `^B ㄷ` (global chord) and by `e`
7754
+ // siblings. Toggled by `^X e` / `^X ㄷ` (pane chord) and by `e`
7697
7755
  // on the focused preview pane (muscle memory). Auto-clears when
7698
7756
  // the terminal session exits.
7699
7757
  let terminalExpanded = false;
@@ -7850,7 +7908,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
7850
7908
  };
7851
7909
 
7852
7910
  /** Shared helper for both the pane-level `t` key AND the global
7853
- * `Ctrl+B t` chord. Idempotent — calling while a session is
7911
+ * `Ctrl+X t` chord. Idempotent — calling while a session is
7854
7912
  * already alive just re-focuses the preview pane. Handles:
7855
7913
  * - view 4 (chat-only) → bounce to view 1 so wd-preview is visible
7856
7914
  * - wiring onUpdate / onExit callbacks with cleanup
@@ -8613,7 +8671,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
8613
8671
  widgetHost.register(planBoardWidget, 'builtin', 'src/widgets/plan-board.ts');
8614
8672
  }
8615
8673
  // NT4 — notification bell modal widget. Registered + spawned here
8616
- // so Ctrl+B b (NT5) can toggle without spawn latency. The bellOpen
8674
+ // so Ctrl+X b (NT5) can toggle without spawn latency. The bellOpen
8617
8675
  // flag + helpers live further down (after notificationStore is
8618
8676
  // created) because refreshBellInto reads from the store.
8619
8677
  widgetHost.register(bellModalWidget, 'builtin', 'src/notification-bell-modal.ts');
@@ -11337,7 +11395,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
11337
11395
  try { mouseWiring.toasts().push({ text, kind, ttlMs: 1200 }); } catch { /* ignore */ }
11338
11396
  };
11339
11397
 
11340
- drawNow = ({ force: forceFromCoordinator = false } = {}) => {
11398
+ const drawFrameNow = ({ force: forceFromCoordinator = false } = {}) => {
11341
11399
  const { rows: termRows, cols } = termSize();
11342
11400
  const totalW = cols - 1;
11343
11401
 
@@ -11781,6 +11839,15 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
11781
11839
  if (overlay.length > 0) process.stdout.write(overlay);
11782
11840
  } catch { /* overlay must not crash main draw */ }
11783
11841
  };
11842
+ // TUI-FLICKER-DRAW-INTEGRATION — one synchronized-output owner for the whole
11843
+ // frame compose: BSU → frame (+ coordinator modal overlay) → prompt repaint →
11844
+ // ESU. Both draw entry paths (force and queued microtask) call this same
11845
+ // seam, and the finally keeps the region closed when a compose throws so the
11846
+ // next frame is not swallowed by a dangling BSU. `supported` is the tty gate:
11847
+ // piped/captured output keeps the bytes it had before this seam existed.
11848
+ drawNow = (opts = {}) => {
11849
+ drawDashboardFrameSynchronized(() => { drawFrameNow(opts); }, process.stdout);
11850
+ };
11784
11851
  draw = (opts = {}) => {
11785
11852
  if (debug.enabled) {
11786
11853
  const now = Date.now();
@@ -12424,8 +12491,8 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
12424
12491
  }
12425
12492
 
12426
12493
  /** N2 — open the shell-runner rollup popup centered on the viewport.
12427
- * Shared entry point for `/shell rollup` slash + `^B S` chord so
12428
- * keyboard users can access the same UI mouse users get by clicking
12494
+ * Entry point for `/shell rollup` so keyboard users can access the
12495
+ * same UI mouse users get by clicking
12429
12496
  * the 🐚 status-bar pill. Anchored-to-pill placement stays in
12430
12497
  * dashboard-mouse-wiring; this path is explicitly center-placed so
12431
12498
  * it works with status row unknown. */
@@ -12645,7 +12712,8 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
12645
12712
  const disposeResizeListener = installResizeListener({
12646
12713
  draw: (opts) => draw(opts),
12647
12714
  promptCtl,
12648
- requestOverlayFrame: () => display.requestRender({ force: true }),
12715
+ requestOverlayFrame: () => display.requestRenderNow({ force: true }),
12716
+ withSynchronizedOutput: (paint) => display.withSynchronizedOutput(paint),
12649
12717
  });
12650
12718
  process.on('exit', disposeResizeListener);
12651
12719
  // 외부 주입(`pty text`)을 사용자 타이핑과 섞지 않고 별도 대기열로 — 결함 #6(10-14).
@@ -13267,14 +13335,16 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
13267
13335
  // ⭐ TUI-AGENT-IDLE-WAKE — 배경 자식(⊕ RunShell bg) 완료 큐의 «유일한» 구독(onEnqueue 구독 0 → 1).
13268
13336
  // 채팅 한 줄 «✓ 위임 끝: <이름> — 다음 턴에 결과» · 결과는 다음 턴 preamble 이 싣는다.
13269
13337
  // ⛔ 입력칸·injectKey·pty 주입 0(대표 비침투). dedupe·수명은 모듈, 여기선 배선만.
13270
- const agentWake = installAgentWake({
13338
+ const agentWake = installSeatedAgentWake({
13271
13339
  subscribe: (listener) => subscribeDashboardAgentResults(
13272
13340
  globalTaskNotificationQueue, listener, (line) => { pushChatLine(C.muted(line)); draw(); },
13273
13341
  ),
13274
13342
  // 그리기 실패는 삼키지 않는다 — 모듈이 잡아 notified{shown:false} 로 남긴다.
13275
13343
  notify: createDashboardAgentWakeNotify((line) => { chatLines.push(C.muted(line)); }, () => draw()),
13276
13344
  // 조각 2 — 자리 TUI ∧ 유휴면 H2 문으로 다음 턴(origin child-complete) · 판정은 모듈.
13277
- openTurn: { startTurnIfIdle: (text, opts) => internalTurnGate.startTurnIfIdle(text, opts), getCwd: () => workingDir.cwd, isPending: (taskId) => globalTaskNotificationQueue.has(taskId) },
13345
+ startTurnIfIdle: (text, opts) => internalTurnGate.startTurnIfIdle(text, opts),
13346
+ getCwd: () => workingDir.cwd,
13347
+ isPending: (taskId) => globalTaskNotificationQueue.has(taskId),
13278
13348
  });
13279
13349
  disposeDashboardAgentWake = () => agentWake.dispose();
13280
13350
 
@@ -13399,8 +13469,10 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
13399
13469
  try {
13400
13470
  if (req.kind === 'shell') {
13401
13471
  const shellSeat = resolveTuiShellSeat(req.cwd, process.env.COORD_ID);
13472
+ const terminalSessionId = crypto.randomUUID();
13402
13473
  session = sessionRegistry.spawn(
13403
13474
  {
13475
+ id: terminalSessionId,
13404
13476
  title: 'terminal',
13405
13477
  cwd: req.cwd,
13406
13478
  command: req.command,
@@ -13410,7 +13482,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
13410
13482
  registryKind: 'shell',
13411
13483
  registryNickname: `tui-shell:${req.cwd}`,
13412
13484
  registryOrigin: { originRoot: 'elanous-internal', controller: 'tui-shell' },
13413
- registryPurpose: `tui-shell:${shellSeat}`,
13485
+ registryPurpose: `tui-shell:${shellSeat}:session:${currentChatPersonaSessionId()}:terminal:${terminalSessionId}`,
13414
13486
  registrySeat: shellSeat,
13415
13487
  onExit: handleExit,
13416
13488
  onTitleAction: handleTitleAction,
@@ -14867,7 +14939,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
14867
14939
  chatScrollOffset = -1;
14868
14940
  break;
14869
14941
  // Phase T: spawn an embedded terminal in this pane. Same
14870
- // code path as the `Ctrl+B t` global chord.
14942
+ // code path as the `Ctrl+X t` pane chord.
14871
14943
  case 't': case 'ㅅ':
14872
14944
  openPreviewTerminal();
14873
14945
  break;
@@ -14883,7 +14955,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
14883
14955
  }
14884
14956
 
14885
14957
  // Ctrl+W (no chord armed — chord would have consumed the
14886
- // key earlier) closes the scratch pane. Reopen via the ^B ^S chord.
14958
+ // key earlier) closes the scratch pane. Reopen via the ^X ^S chord.
14887
14959
  if (key.ctrl && (key.name === 'w' || key.name === 'ㅈ')) {
14888
14960
  scratchClosed = true;
14889
14961
  userClosedPanes.add('scratch');
@@ -15236,14 +15308,15 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
15236
15308
  chat.history.push(m as ChatMessage);
15237
15309
  }
15238
15310
  const turns = past.length;
15239
- chatLines.push(C.muted(` ${turns} turn${turns === 1 ? '' : 's'} restored. Preview of last 5:`));
15311
+ chatLines.push(C.muted(` ${turns} turn${turns === 1 ? '' : 's'} restored:`));
15312
+ noteRestoredContext(chat.history);
15240
15313
  // BACKLOG #1 — markdown-aware preview rendering. Replaces
15241
15314
  // the previous one-line `slice(0, 100)` snippet so tables
15242
15315
  // / bold / lists in replayed turns look the same as when
15243
15316
  // they were originally streamed (`formatResponse` path).
15244
15317
  const previewWidth = Math.max(40, termSize().cols - 8);
15245
15318
  const previewWrap = getUserConfig().chat.rendering.wrap;
15246
- const previewLines = renderReplayPreviewLines(past, {
15319
+ const previewLines = renderRestoredTranscriptLines(past, {
15247
15320
  maxWidth: previewWidth,
15248
15321
  wrapOpts: previewWrap,
15249
15322
  });
@@ -15285,7 +15358,16 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
15285
15358
  if (resume.repaired) {
15286
15359
  chatLines.push(C.muted(` 깨진 도구 호출·결과 짝을 잘라 이어받았다(호출 ${resume.repaired.removedCalls} · 결과 ${resume.repaired.removedResults})`));
15287
15360
  }
15288
- chatLines.push(C.muted(` ${resume.turns} turns restored. Next turn continues this conversation.`));
15361
+ // TUI-RESUME-PICKER ②③④ — `--resume` used to leave the chat log blank and ctx at 0, so the user could
15362
+ // not see that 379 messages had come back. Show the restored conversation and its size now.
15363
+ chatLines.push(C.muted(` ${resume.turns} turns restored:`));
15364
+ for (const line of renderRestoredTranscriptLines(chat.history, {
15365
+ maxWidth: Math.max(40, termSize().cols - 8),
15366
+ wrapOpts: getUserConfig().chat.rendering.wrap,
15367
+ })) chatLines.push(line);
15368
+ const restoredTokens = noteRestoredContext(chat.history);
15369
+ debug.log('chat.session.resume', 'restored', { sessionId: resume.sessionId, turns: resume.turns, estimatedContextTokens: restoredTokens });
15370
+ chatLines.push(C.muted(' Next turn continues this conversation.'));
15289
15371
  }
15290
15372
  }
15291
15373
  observeSessionStart({
@@ -16152,7 +16234,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
16152
16234
  terminalExpanded = !terminalExpanded;
16153
16235
  previewTerminalDims = null;
16154
16236
  chatLines.push(C.muted(terminalExpanded
16155
- ? 'Terminal expanded. Ctrl+Shift+E or ^B e to restore.'
16237
+ ? 'Terminal expanded. Ctrl+Shift+E to restore.'
16156
16238
  : 'Terminal collapsed to preview slot.'));
16157
16239
  chatScrollOffset = -1;
16158
16240
  },
@@ -17866,6 +17948,9 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
17866
17948
  },
17867
17949
  };
17868
17950
  const slashOutcome = await dashboardSlashRegistry.dispatch(cmdLower, args, slashCtx);
17951
+ if (cmdLower === 'mission') {
17952
+ debug.log('tui.legacy-slash-use', 'mission', { surface: 'classic', tuiSession: null });
17953
+ }
17869
17954
  if (debug.enabled) {
17870
17955
  debug.log('dashboard.slash.dispatch', cmdLower, {
17871
17956
  argsCount: args.length,
@@ -13,6 +13,8 @@
13
13
  // 턴 중(NotIdle)·입력 중(HumanTyping)에 온 완료는 «대기»: 입력칸이 다시 뜰 때(`wrapAgentWakePort`) 그 결과가
14
14
  // 아직 큐에 남아 있으면(=어느 턴도 안 실었으면) 한 번만 다시 청한다. 이미 실렸으면(drain) 아무것도 안 한다.
15
15
  // ⛔ 같은 알림(taskId)은 한 번만 — 큐 `seen` 이 `clear()` 로 비워져도, 대시보드가 재진입해도 막는다.
16
+ // ⭐ 생산 조립은 `installSeatedAgentWake` «하나» — `src/dashboard/index.ts` 의 `showDashboard` 가 그 함수만
17
+ // 부르고, 이 파일의 무대 시험이 «같은 함수»를 지난다(문자열 배선 확인이 아니라 생산 호출 경로 증거).
16
18
  //
17
19
  // 세 얼굴:
18
20
  // 관측 = debug.log('tui.agent-wake', 'notified' | 'opened' | 'rejected' | 'deferred', { taskId, agent, state, seat, shown, reason })
@@ -240,6 +242,47 @@ export function installAgentWake(deps: Omit<AgentWakeDeps, 'handled'>): AgentWak
240
242
  return own;
241
243
  }
242
244
 
245
+ /** 대시보드가 넘기는 «생산 포트» — showDashboard 가 실제로 채우는 모양 그대로. */
246
+ export interface DashboardAgentWakePorts {
247
+ /** 큐 구독 — `subscribeDashboardAgentResults(globalTaskNotificationQueue, …)` 가 여기로 들어온다. */
248
+ subscribe: AgentWakeDeps['subscribe'];
249
+ /** 채팅 한 줄 — `createDashboardAgentWakeNotify(pushLine, draw)`. */
250
+ notify: AgentWakeDeps['notify'];
251
+ /** H2 문 — `internalTurnGate.startTurnIfIdle`. 자리 TUI ∧ 유휴일 때만 실제로 열린다. */
252
+ startTurnIfIdle: AgentWakeOpenTurnDeps['startTurnIfIdle'];
253
+ /** 지금 화면의 cwd(자리 판정 입력) — `() => workingDir.cwd`. */
254
+ getCwd: () => string;
255
+ /** 그 완료가 아직 어느 턴에도 안 실렸나 — `globalTaskNotificationQueue.has`. «대기» 재시도의 근거. */
256
+ isPending: (taskId: string) => boolean;
257
+ /** 시험·주입 자리(생산은 안 넘긴다 — 기본 `homedir()`·`detectSeatTui`·`setTimeout 0`). */
258
+ home?: string;
259
+ detectSeat?: AgentWakeOpenTurnDeps['detectSeat'];
260
+ defer?: AgentWakeOpenTurnDeps['defer'];
261
+ log?: AgentWakeDeps['log'];
262
+ }
263
+
264
+ /**
265
+ * 대시보드 생산 조립 — `showDashboard` 는 이 함수 «하나»만 부른다.
266
+ * 알림(조각 1)과 «자리 TUI ∧ 유휴 → H2 한 턴(origin child-complete)»(조각 2)을 같은 큐 구독에서 낸다.
267
+ * 중복 거부(같은 taskId 한 번)·DEFERRABLE 대기→입력칸 재시도·수명은 `createAgentWake` 몫이다.
268
+ */
269
+ export function installSeatedAgentWake(ports: DashboardAgentWakePorts): AgentWakeController {
270
+ const openTurn: AgentWakeOpenTurnDeps = {
271
+ startTurnIfIdle: ports.startTurnIfIdle,
272
+ getCwd: ports.getCwd,
273
+ isPending: ports.isPending,
274
+ ...(ports.home !== undefined ? { home: ports.home } : {}),
275
+ ...(ports.detectSeat !== undefined ? { detectSeat: ports.detectSeat } : {}),
276
+ ...(ports.defer !== undefined ? { defer: ports.defer } : {}),
277
+ };
278
+ return installAgentWake({
279
+ subscribe: ports.subscribe,
280
+ notify: ports.notify,
281
+ openTurn,
282
+ ...(ports.log !== undefined ? { log: ports.log } : {}),
283
+ });
284
+ }
285
+
243
286
  /** 시험 격리용 — 설치·공유 dedupe 를 비운다. */
244
287
  export function resetAgentWakeForTest(): void {
245
288
  installed?.dispose();
@@ -1,6 +1,7 @@
1
1
  import type { NormalizedAttachment } from '../../acp/content-blocks.js';
2
2
  import { debug } from '../../debug/log.js';
3
3
  import type { ControlSignalBus } from '../../input/control-signal.js';
4
+ import { classifyInterimReply, formatInterimFoldLine } from '../../tui/chat/goal-interim.js';
4
5
  import {
5
6
  createTurnOutputBundle,
6
7
  runTurnOutputBundleSettle,
@@ -76,6 +77,8 @@ export function dispatchDashboardChatMainAcpSend(
76
77
  let firstChunk = true;
77
78
  let assistantTextActive = false;
78
79
  let assistantBodyStart = -1;
80
+ let assistantBodyEnd = -1;
81
+ const interimBodyRanges: Array<{ start: number; end: number }> = [];
79
82
  let assistantBodyText = '';
80
83
  let assistantRunUsesPrefix = false;
81
84
 
@@ -91,6 +94,7 @@ export function dispatchDashboardChatMainAcpSend(
91
94
  if (firstChunk) firstChunk = false;
92
95
  assistantBodyText = '';
93
96
  assistantBodyStart = -1;
97
+ assistantBodyEnd = -1;
94
98
  assistantTextActive = true;
95
99
  }
96
100
  assistantBodyText += delta;
@@ -110,7 +114,7 @@ export function dispatchDashboardChatMainAcpSend(
110
114
  deps.autoTtsHooks?.pushChunk(delta);
111
115
  const rendered = deps.formatAssistantLines(assistantBodyText);
112
116
  if (assistantBodyStart < 0) assistantBodyStart = deps.chatLines.length;
113
- deps.chatLines.length = assistantBodyStart;
117
+ deps.chatLines.splice(assistantBodyStart, Math.max(0, assistantBodyEnd - assistantBodyStart));
114
118
  rendered.forEach((line, index) => {
115
119
  if (index === 0 && assistantRunUsesPrefix) {
116
120
  deps.chatLines.push(`${deps.formatAssistantPrefix(display)} ${line}`);
@@ -118,8 +122,24 @@ export function dispatchDashboardChatMainAcpSend(
118
122
  deps.chatLines.push(` ${line}`);
119
123
  }
120
124
  });
125
+ assistantBodyEnd = assistantBodyStart + rendered.length;
126
+ if (interimBodyRanges.at(-1)?.start === assistantBodyStart) interimBodyRanges[interimBodyRanges.length - 1]!.end = assistantBodyEnd;
127
+ else interimBodyRanges.push({ start: assistantBodyStart, end: assistantBodyEnd });
121
128
  deps.setChatScrollToTail();
122
129
  },
130
+ foldGoalInterim: (text) => {
131
+ const verdict = classifyInterimReply(text.split('\n'));
132
+ if (verdict.interim && interimBodyRanges.length > 0) {
133
+ const first = interimBodyRanges[0]!.start;
134
+ for (const { start, end } of [...interimBodyRanges].reverse()) deps.chatLines.splice(start, end - start);
135
+ deps.chatLines.splice(first, 0, ` ${formatInterimFoldLine(verdict.summary)}`);
136
+ deps.setChatScrollToTail();
137
+ }
138
+ interimBodyRanges.length = 0;
139
+ assistantTextActive = false;
140
+ assistantBodyStart = -1;
141
+ assistantBodyEnd = -1;
142
+ },
123
143
  pushToolCall: (tool) => {
124
144
  deps.chatLines.push(deps.formatToolLine(tool));
125
145
  deps.setChatScrollToTail();
@@ -1,159 +1,8 @@
1
- // Dashboard key routing for interactive terminal modals.
2
- //
3
- // Holds singleton state for "which interactive terminal modal is
4
- // currently foregrounded" + the key-intercept policy:
5
- //
6
- // • while a modal is present, ESC / Ctrl-G dispose it
7
- // • all other keys forward to modal.surface.onKey(ev) so the PTY
8
- // receives them without the chat readKey loop trying to
9
- // interpret them
10
- //
11
- // Kept as a standalone module so the policy is unit-testable
12
- // without standing up the full dashboard. dashboard.ts imports and
13
- // wires it into the top of its stdin handler in a follow-up commit.
14
- //
15
- // P10 will extend this with Ctrl-B prefix handling (d=detach,
16
- // s=switch, etc.) once a session registry exists to act on.
17
-
18
- import type { InteractiveTerminalModalHandle } from '../../interactive-terminal-modal.js';
19
- import type { KeyEvent } from '../../display/types.js';
20
- import { debug } from '../../debug/log.js';
21
-
22
- export type KeyRouteResult = 'consumed' | 'passthrough' | 'closed';
23
-
24
- export interface TerminalModalRouter {
25
- current(): InteractiveTerminalModalHandle | null;
26
- /** Install a modal handle. Optional closePolicy controls what
27
- * ESC/Ctrl-G does: 'kill' disposes the modal + PTY (default);
28
- * 'detach' calls handle.dispose({keepPreview:true}) so the PTY
29
- * survives for re-attach (session registry flow). An explicit
30
- * onClose hook wins over closePolicy — that's how dashboard
31
- * wires sessionRegistry.detach(session.id) on Esc. */
32
- set(
33
- handle: InteractiveTerminalModalHandle | null,
34
- opts?: { closePolicy?: 'kill' | 'detach'; onClose?: () => void },
35
- ): void;
36
- close(): void;
37
- handleKey(ev: KeyEvent): KeyRouteResult;
38
- }
39
-
40
- // `exit` typed cleanly + Enter closes the popup. claude / codex don't
41
- // recognize plain `exit` (their command is /exit or /quit), so a user
42
- // typing `exit\n` would otherwise be stuck — the popup stays open
43
- // because the child never exits, and the typed text just becomes chat
44
- // input. elanous intercepts the exact sequence at the router so:
45
- // • plain shell: same end result (we close before shell evaluates)
46
- // • claude / codex: popup closes as the user expected
47
- // Sequence is reset on any non-letter key (other than backspace, which
48
- // rewinds), Ctrl/Alt modifiers, or any character outside `e/x/i/t` —
49
- // so genuine words containing "exit" (e.g. typing "exit this loop"
50
- // into a claude prompt without Enter) DON'T trigger the close. The
51
- // trigger is specifically `e`, `x`, `i`, `t`, Enter with nothing else.
52
- const EXIT_CHARS = ['e', 'x', 'i', 't'] as const;
53
-
54
- export function createTerminalModalRouter(): TerminalModalRouter {
55
- let handle: InteractiveTerminalModalHandle | null = null;
56
- let closePolicy: 'kill' | 'detach' = 'kill';
57
- let onClose: (() => void) | null = null;
58
- let exitProgress = 0; // how many of EXIT_CHARS have been typed in order
59
-
60
- const close = (): void => {
61
- if (!handle) return;
62
- const h = handle;
63
- const cb = onClose;
64
- if (debug.enabled) debug.log('window.terminalModalRouter.close', h.id, { id: h.id, closePolicy, hasOnClose: !!cb });
65
- handle = null;
66
- onClose = null;
67
- exitProgress = 0;
68
- try {
69
- if (cb) cb();
70
- else if (closePolicy === 'detach') h.dispose({ keepPreview: true });
71
- else h.dispose();
72
- } catch { /* already disposed */ }
73
- closePolicy = 'kill';
74
- };
75
-
76
- return {
77
- current: () => handle,
78
- set: (h, opts) => {
79
- if (handle && h && handle.id !== h.id) close();
80
- handle = h;
81
- closePolicy = opts?.closePolicy ?? 'kill';
82
- onClose = opts?.onClose ?? null;
83
- exitProgress = 0;
84
- if (debug.enabled) {
85
- debug.log('window.terminalModalRouter.set', h?.id ?? '(null)', {
86
- id: h?.id ?? null,
87
- closePolicy,
88
- hasOnClose: !!onClose,
89
- });
90
- }
91
- },
92
- close,
93
- handleKey: (ev) => {
94
- if (!handle) return 'passthrough';
95
- const name = (ev.name ?? '').toLowerCase();
96
- // ESC must NOT close the modal — claude / codex inside the popup
97
- // use ESC to cancel an in-progress chat / tool turn. Closing the
98
- // wrapper window on ESC made the only-way-to-cancel kill the
99
- // whole popup. iTerm / ghostty don't close their own windows on
100
- // ESC either; the wrapper should match. Modal close is reserved
101
- // for: Ctrl+G (close + focus log), Ctrl+Shift+T (toggle off),
102
- // typed `exit\n`, and the child's own `exit`. ESC just forwards.
103
- if (ev.ctrl && (name === 'g' || name === 'ㅎ')) {
104
- if (debug.enabled) debug.log('window.terminalModalRouter.handleKey.close', 'ctrl-g', { id: handle.id });
105
- close();
106
- return 'closed';
107
- }
108
-
109
- // Track typed `exit` followed by Enter so the user's natural
110
- // mental model ("type exit to quit") works inside agent popups
111
- // (claude / codex) where the child app doesn't recognize a bare
112
- // `exit` command. See EXIT_CHARS comment above for false-positive
113
- // avoidance.
114
- const noMods = !ev.ctrl && !ev.alt;
115
- if (noMods && name === 'enter' && exitProgress === EXIT_CHARS.length) {
116
- if (debug.enabled) {
117
- debug.log('window.terminalModalRouter.handleKey.close', 'typed-exit', {
118
- id: handle.id,
119
- });
120
- }
121
- close();
122
- return 'closed';
123
- }
124
- if (noMods && name === 'backspace') {
125
- if (exitProgress > 0) exitProgress--;
126
- } else if (noMods && name.length === 1 && exitProgress < EXIT_CHARS.length && name === EXIT_CHARS[exitProgress]) {
127
- exitProgress++;
128
- } else if (noMods && name === 'enter') {
129
- // Enter without a complete `exit` prefix — reset and forward.
130
- exitProgress = 0;
131
- } else if (name.length === 1 || name === 'space' || ev.ctrl || ev.alt) {
132
- // Any other printable key OR a modifier keystroke breaks the
133
- // streak. Multi-char named keys (arrow / fn / etc.) leave the
134
- // streak alone — the child may consume them without affecting
135
- // the user's typed prompt buffer.
136
- exitProgress = 0;
137
- }
138
-
139
- if (debug.enabled) {
140
- debug.log('window.terminalModalRouter.handleKey.forward', name || '(empty)', {
141
- id: handle.id,
142
- name,
143
- ctrl: ev.ctrl ?? false,
144
- shift: ev.shift ?? false,
145
- alt: ev.alt ?? false,
146
- exitProgress,
147
- });
148
- }
149
- try {
150
- handle.surface.onKey?.(ev);
151
- } catch { /* surface disposed mid-event; treat as no-op */ }
152
- return 'consumed';
153
- },
154
- };
155
- }
156
-
157
- /** Singleton instance used by dashboard.ts. Exported as a separate
158
- * factory + singleton so tests can inject a fresh router per case. */
159
- export const terminalModalRouter = createTerminalModalRouter();
1
+ // Compatibility entry for dashboard-owned consumers. The routing policy is
2
+ // shared with the standalone Next TUI from src/terminal.
3
+ export {
4
+ createTerminalModalRouter,
5
+ terminalModalRouter,
6
+ type KeyRouteResult,
7
+ type TerminalModalRouter,
8
+ } from '../../terminal/terminal-modal-router.js';
@@ -105,3 +105,28 @@ export function renderReplayPreviewLines(
105
105
  }
106
106
  return lines;
107
107
  }
108
+
109
+ /** Restored transcripts longer than this show their tail plus one «earlier N messages» line. */
110
+ export const RESTORED_TRANSCRIPT_MAX_MESSAGES = 200;
111
+
112
+ /**
113
+ * The restored conversation in full (TUI-RESUME-PICKER ③): every user/assistant message, every line —
114
+ * not the 5-message, 2-line preview. Resuming used to leave the chat log blank but for that preview,
115
+ * so the user could not see what they were continuing. Very long sessions keep the last
116
+ * `maxMessages` and say how many were left out.
117
+ */
118
+ export function renderRestoredTranscriptLines(
119
+ messages: readonly ReplayPreviewMessage[],
120
+ opts: Omit<ReplayPreviewOpts, 'tail' | 'perMessageLines'> & { maxMessages?: number },
121
+ ): string[] {
122
+ const visible = messages.filter((m) => m.role !== 'system' && extractReplayText(m.content).length > 0);
123
+ const max = opts.maxMessages ?? RESTORED_TRANSCRIPT_MAX_MESSAGES;
124
+ const hidden = Math.max(0, visible.length - max);
125
+ const lines = hidden > 0 ? [C.muted(` … 앞 ${hidden}개 메시지 생략 (최근 ${max}개 표시)`)] : [];
126
+ return lines.concat(renderReplayPreviewLines(visible.slice(-max), {
127
+ maxWidth: opts.maxWidth,
128
+ ...(opts.wrapOpts ? { wrapOpts: opts.wrapOpts } : {}),
129
+ tail: max,
130
+ perMessageLines: Number.MAX_SAFE_INTEGER,
131
+ }));
132
+ }