elanous 0.2.36 → 0.2.37

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 (630) 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 → 8kITumG9GAZ1LwT9POrAR}/_buildManifest.js +1 -1
  4. package/apps/pwa/out/_next/static/chunks/1041-5841aae848fb6403.js +1 -0
  5. package/apps/pwa/out/_next/static/chunks/1087.3177e54f672dc526.js +1 -0
  6. package/apps/pwa/out/_next/static/chunks/1105.efe1e13503ac7a33.js +1 -0
  7. package/apps/pwa/out/_next/static/chunks/1224.2ceca6c180d5130b.js +62 -0
  8. package/apps/pwa/out/_next/static/chunks/{4286.b70c4520306817e8.js → 1262.a89bb27a5b2f844e.js} +1 -1
  9. package/apps/pwa/out/_next/static/chunks/1417-1768233ac92f8a5d.js +1 -0
  10. package/apps/pwa/out/_next/static/chunks/1612.81bbc19af06af16c.js +1 -0
  11. package/apps/pwa/out/_next/static/chunks/{3410.7f9af5ab77cbe65f.js → 1746.3563617ea64023a3.js} +1 -1
  12. package/apps/pwa/out/_next/static/chunks/1766.728d42053070bb2d.js +1 -0
  13. package/apps/pwa/out/_next/static/chunks/1773.d38e945481e04125.js +1 -0
  14. package/apps/pwa/out/_next/static/chunks/1974-c12f9600da3d3c26.js +1 -0
  15. package/apps/pwa/out/_next/static/chunks/1ed5e8af.cf424815c7c0efad.js +1 -0
  16. package/apps/pwa/out/_next/static/chunks/{9250-072df22eaadaa6b5.js → 2002-a43a3f380df873ec.js} +1 -1
  17. package/apps/pwa/out/_next/static/chunks/2061.7232dc9dc058417f.js +1 -0
  18. package/apps/pwa/out/_next/static/chunks/210.90b2cbd64926cf34.js +32 -0
  19. package/apps/pwa/out/_next/static/chunks/{3727.7949ccaacaa71242.js → 2283.edd9627b7bdfb546.js} +2 -2
  20. package/apps/pwa/out/_next/static/chunks/2318-450e75d07605b8fe.js +1 -0
  21. package/apps/pwa/out/_next/static/chunks/{4615.8525eb0add35eba6.js → 2375.bf364c85dbb6f085.js} +1 -1
  22. package/apps/pwa/out/_next/static/chunks/244-a810d282a20f1783.js +1 -0
  23. package/apps/pwa/out/_next/static/chunks/2479-fe7e188bd9402d14.js +1 -0
  24. package/apps/pwa/out/_next/static/chunks/2514.03b60f266531a015.js +148 -0
  25. package/apps/pwa/out/_next/static/chunks/2526-a657538869888604.js +1 -0
  26. package/apps/pwa/out/_next/static/chunks/2533-6f0341ff075809e9.js +1 -0
  27. package/apps/pwa/out/_next/static/chunks/2676.e7994c695ef0f30d.js +1 -0
  28. package/apps/pwa/out/_next/static/chunks/2734.3ffdf54254fb6f99.js +27 -0
  29. package/apps/pwa/out/_next/static/chunks/2770-23252bf3a37880b9.js +1 -0
  30. package/apps/pwa/out/_next/static/chunks/2969.66b8b545139d1544.js +1 -0
  31. package/apps/pwa/out/_next/static/chunks/3128.a9210d08800ea6a8.js +1 -0
  32. package/apps/pwa/out/_next/static/chunks/{5711.957b095705c12560.js → 3199.6a1a9b0e6cd01dc6.js} +1 -1
  33. package/apps/pwa/out/_next/static/chunks/3212.12179fd3eee8cef1.js +1 -0
  34. package/apps/pwa/out/_next/static/chunks/{2986.45d7652e4f13557e.js → 3578.4e9f9948a9a6f2f4.js} +2 -2
  35. package/apps/pwa/out/_next/static/chunks/3760-2909ddb9279281cd.js +1 -0
  36. package/apps/pwa/out/_next/static/chunks/3825.1921b5901bf33dce.js +36 -0
  37. package/apps/pwa/out/_next/static/chunks/3994-63eb884ed0547011.js +1 -0
  38. package/apps/pwa/out/_next/static/chunks/4036.d54e55e1ebf5acdc.js +90 -0
  39. package/apps/pwa/out/_next/static/chunks/4115.5b438b99f0ae729f.js +226 -0
  40. package/apps/pwa/out/_next/static/chunks/4269.d8f9f34bb0fc6c43.js +287 -0
  41. package/apps/pwa/out/_next/static/chunks/431-4eed5bd2c5fe1719.js +1 -0
  42. package/apps/pwa/out/_next/static/chunks/{7481.39f7a4654907bf6e.js → 4313.76f232c304a15bde.js} +1 -1
  43. package/apps/pwa/out/_next/static/chunks/4324.c99ba3e83eb1b691.js +1 -0
  44. package/apps/pwa/out/_next/static/chunks/4337e36d.f42c3b391b3d8f20.js +122 -0
  45. package/apps/pwa/out/_next/static/chunks/{6943.c6b24124853a47b2.js → 4383.18e5c54db3a22c88.js} +1 -1
  46. package/apps/pwa/out/_next/static/chunks/4599-96eff3f2a9c242c1.js +1 -0
  47. package/apps/pwa/out/_next/static/chunks/{3757-180308bc61021b05.js → 4725-34bed25720cc326b.js} +1 -1
  48. package/apps/pwa/out/_next/static/chunks/4825-a9d9d4e9f5892309.js +1 -0
  49. package/apps/pwa/out/_next/static/chunks/4833-7934c592c5569f00.js +1 -0
  50. package/apps/pwa/out/_next/static/chunks/4879-68518f547a207aff.js +1 -0
  51. package/apps/pwa/out/_next/static/chunks/4896.f9b70285363b27b2.js +24 -0
  52. package/apps/pwa/out/_next/static/chunks/{771.c3cdb6c1f7f47c02.js → 4931.95cc6dbd230774ca.js} +3 -3
  53. package/apps/pwa/out/_next/static/chunks/4937-28d437999b77c9dd.js +1 -0
  54. package/apps/pwa/out/_next/static/chunks/49aa54ab.80f39398e0ed0f30.js +1 -0
  55. package/apps/pwa/out/_next/static/chunks/{552.b7d061ad91eeac51.js → 5046.7fd5cbd859299448.js} +2 -2
  56. package/apps/pwa/out/_next/static/chunks/5056.482687319b82638e.js +104 -0
  57. package/apps/pwa/out/_next/static/chunks/506.16b83d56a437a9ee.js +1 -0
  58. package/apps/pwa/out/_next/static/chunks/5260-20593b0a25d0afbc.js +1 -0
  59. package/apps/pwa/out/_next/static/chunks/5404.cc4e9fec26fd5925.js +1 -0
  60. package/apps/pwa/out/_next/static/chunks/576.485e83e3f3dec19a.js +1 -0
  61. package/apps/pwa/out/_next/static/chunks/5832-a6be14e663f65726.js +1 -0
  62. package/apps/pwa/out/_next/static/chunks/5854-56648a9fe646b9a0.js +1 -0
  63. package/apps/pwa/out/_next/static/chunks/{9f31e478.fefcbcd3c388ebc5.js → 58edce7d.f1b0c72acf13b123.js} +1 -1
  64. package/apps/pwa/out/_next/static/chunks/5925.3b1f8b135710249b.js +93 -0
  65. package/apps/pwa/out/_next/static/chunks/{3136.30aaaa5fa03662a3.js → 5952.294fc574a8625184.js} +1 -1
  66. package/apps/pwa/out/_next/static/chunks/{da5ecc5c-b005ad8cac737d57.js → 5f6af561-f90b7a67f4f75d13.js} +1 -1
  67. package/apps/pwa/out/_next/static/chunks/6168.17749aa3905fa073.js +74 -0
  68. package/apps/pwa/out/_next/static/chunks/{3324.a09703033abcbd2f.js → 6252.240578f10952e091.js} +1 -1
  69. package/apps/pwa/out/_next/static/chunks/6416.5d50b8ec9986ca98.js +1 -0
  70. package/apps/pwa/out/_next/static/chunks/{8904.7d51af2dc033965c.js → 6680.6a693c28aae4cd19.js} +2 -2
  71. package/apps/pwa/out/_next/static/chunks/{275-02ea4c2a33980422.js → 6745-5a63492933959dd9.js} +3 -3
  72. package/apps/pwa/out/_next/static/chunks/6758.e7fbf532953c0783.js +1 -0
  73. package/apps/pwa/out/_next/static/chunks/6795.0cb8a59730d99703.js +149 -0
  74. package/apps/pwa/out/_next/static/chunks/{528.38ce20ef8aa251ff.js → 6819.be5c9c4d67f22922.js} +3 -3
  75. package/apps/pwa/out/_next/static/chunks/6877-84d47b7e85d0c41e.js +1 -0
  76. package/apps/pwa/out/_next/static/chunks/6971-fb5f9dc0a2cb5d2d.js +1 -0
  77. package/apps/pwa/out/_next/static/chunks/{3a3d9966.cc4d4585a2708e7c.js → 709a918c.4fd3b4e2a32cb4e3.js} +1 -1
  78. package/apps/pwa/out/_next/static/chunks/717.522b08685979b814.js +1 -0
  79. package/apps/pwa/out/_next/static/chunks/7191.e41eb8f455c7f089.js +41 -0
  80. package/apps/pwa/out/_next/static/chunks/7233.8e744b7513119409.js +1 -0
  81. package/apps/pwa/out/_next/static/chunks/7238-97c2226f80504bd8.js +1 -0
  82. package/apps/pwa/out/_next/static/chunks/7285.307963afcf7e7660.js +24 -0
  83. package/apps/pwa/out/_next/static/chunks/7299-fbe4b8c47a87614a.js +1 -0
  84. package/apps/pwa/out/_next/static/chunks/7314.df0d95930b0c3f50.js +1 -0
  85. package/apps/pwa/out/_next/static/chunks/7406.c0589fdf2ee66629.js +1 -0
  86. package/apps/pwa/out/_next/static/chunks/{4304.e9b2512834a9e23e.js → 7424.c0fe2a595d4232b5.js} +1 -1
  87. package/apps/pwa/out/_next/static/chunks/752-90e3e7daad3d8e39.js +1 -0
  88. package/apps/pwa/out/_next/static/chunks/7524-bcd3d9928c6842d9.js +1 -0
  89. package/apps/pwa/out/_next/static/chunks/7549.9a4de3bf231cfc52.js +1 -0
  90. package/apps/pwa/out/_next/static/chunks/757-4fbaf50942b8c424.js +1 -0
  91. package/apps/pwa/out/_next/static/chunks/765.76ae970ceb597b5b.js +1 -0
  92. package/apps/pwa/out/_next/static/chunks/{2683.c9773a0c589b031b.js → 7867.e8725745ddd1d940.js} +4 -4
  93. package/apps/pwa/out/_next/static/chunks/{6466-92e65a48490b68a9.js → 7893-e444a1b0809cd1e4.js} +1 -1
  94. package/apps/pwa/out/_next/static/chunks/7956-33748cabb3a05562.js +1 -0
  95. package/apps/pwa/out/_next/static/chunks/{ccae1c4b-0cf414f5eff1b10d.js → 7c5ed21f-f286708e57cf88f7.js} +1 -1
  96. package/apps/pwa/out/_next/static/chunks/8030-aa66b478b53dbfca.js +1 -0
  97. package/apps/pwa/out/_next/static/chunks/8051.c88c07dacbbc5f21.js +8 -0
  98. package/apps/pwa/out/_next/static/chunks/{3840-5825d56d46976a92.js → 8080-40d781e7704d3671.js} +1 -1
  99. package/apps/pwa/out/_next/static/chunks/8149.80e402d4345e8dae.js +77 -0
  100. package/apps/pwa/out/_next/static/chunks/8205.50a5268f4e12ba0b.js +1 -0
  101. package/apps/pwa/out/_next/static/chunks/8231.a128feaa6f8b6079.js +1 -0
  102. package/apps/pwa/out/_next/static/chunks/85.4ddb1dda2ea3ffa2.js +286 -0
  103. package/apps/pwa/out/_next/static/chunks/8537.26517a09e8247beb.js +1 -0
  104. package/apps/pwa/out/_next/static/chunks/8595-e9b7081ab773a61f.js +1 -0
  105. package/apps/pwa/out/_next/static/chunks/8821-30cc65a61a60951f.js +1 -0
  106. package/apps/pwa/out/_next/static/chunks/8905.b3385aadb7b133e6.js +79 -0
  107. package/apps/pwa/out/_next/static/chunks/8983.246bb3a1ac38f50f.js +1 -0
  108. package/apps/pwa/out/_next/static/chunks/{873d6c12.09bd499f57171543.js → 8c58d09b.e8724a299658d86f.js} +1 -1
  109. package/apps/pwa/out/_next/static/chunks/9072.18342f5941a1f3ec.js +1 -0
  110. package/apps/pwa/out/_next/static/chunks/9123.9df04866b2d6e00f.js +1 -0
  111. package/apps/pwa/out/_next/static/chunks/{575.d929793a53f27c4b.js → 9151.a2c51e93f9156dae.js} +1 -1
  112. package/apps/pwa/out/_next/static/chunks/9175-7d383df15a82e2be.js +1 -0
  113. package/apps/pwa/out/_next/static/chunks/9181-bf89c07ce5b8f599.js +1 -0
  114. package/apps/pwa/out/_next/static/chunks/920-429bbc4504b45f71.js +1 -0
  115. package/apps/pwa/out/_next/static/chunks/9207.625edf45d656151c.js +1 -0
  116. package/apps/pwa/out/_next/static/chunks/9378.d2575c6ffd6dd756.js +94 -0
  117. package/apps/pwa/out/_next/static/chunks/957.db5b5c4d32a35240.js +1 -0
  118. package/apps/pwa/out/_next/static/chunks/{190.285c832bd9626f8c.js → 958.53a8dcf4729e6997.js} +1 -1
  119. package/apps/pwa/out/_next/static/chunks/9647.8f0cd0898c592a29.js +1 -0
  120. package/apps/pwa/out/_next/static/chunks/9665-26abb02665704c2c.js +1 -0
  121. package/apps/pwa/out/_next/static/chunks/9703.e7d81b6faef1050a.js +1 -0
  122. package/apps/pwa/out/_next/static/chunks/9882-7a9164b3c2dacbe5.js +1 -0
  123. package/apps/pwa/out/_next/static/chunks/9998.b74e033efadecd10.js +1 -0
  124. package/apps/pwa/out/_next/static/chunks/app/_not-found/page-c604fb980a634d88.js +1 -0
  125. package/apps/pwa/out/_next/static/chunks/app/approvals/page-ec2d8a4979ca9075.js +1 -0
  126. package/apps/pwa/out/_next/static/chunks/app/autopilot/page-cb6add08ad3c7660.js +1 -0
  127. package/apps/pwa/out/_next/static/chunks/app/board/page-e2eaa321ec223fe6.js +1 -0
  128. package/apps/pwa/out/_next/static/chunks/app/botlab/page-5b8a09c475b5f844.js +1 -0
  129. package/apps/pwa/out/_next/static/chunks/app/bots/page-91a77daedfbac191.js +1 -0
  130. package/apps/pwa/out/_next/static/chunks/app/ceo/page-f37fc5e974bda39b.js +1 -0
  131. package/apps/pwa/out/_next/static/chunks/app/chat/page-91429a0b78415a94.js +1 -0
  132. package/apps/pwa/out/_next/static/chunks/app/consult/page-b95798b58263b910.js +1 -0
  133. package/apps/pwa/out/_next/static/chunks/app/control/page-763d53e175e17aa1.js +1 -0
  134. package/apps/pwa/out/_next/static/chunks/app/decisions/page-d55023204055b12f.js +1 -0
  135. package/apps/pwa/out/_next/static/chunks/app/design-check/page-89d2140d78abc810.js +1 -0
  136. package/apps/pwa/out/_next/static/chunks/app/editor/page-82dc069abfe27f55.js +1 -0
  137. package/apps/pwa/out/_next/static/chunks/app/exec/page-25d9eee7beb552c0.js +1 -0
  138. package/apps/pwa/out/_next/static/chunks/app/field/page-770b4594c713ee97.js +1 -0
  139. package/apps/pwa/out/_next/static/chunks/app/healthz/route-c604fb980a634d88.js +1 -0
  140. package/apps/pwa/out/_next/static/chunks/app/inside/page-ba8e0dcae4f83985.js +1 -0
  141. package/apps/pwa/out/_next/static/chunks/app/intake/page-5c112c6d7c33656e.js +1 -0
  142. package/apps/pwa/out/_next/static/chunks/app/layout-09788e1aa9a87db6.js +1 -0
  143. package/apps/pwa/out/_next/static/chunks/app/live/{page-e2de2e59111c9aad.js → page-3337c6a1328c2674.js} +1 -1
  144. package/apps/pwa/out/_next/static/chunks/app/live-run/{page-f2b2e4bf6e981450.js → page-89acd5d68c0bc560.js} +1 -1
  145. package/apps/pwa/out/_next/static/chunks/app/loops/page-5c13e2c76371d797.js +1 -0
  146. package/apps/pwa/out/_next/static/chunks/app/market/page-653a9f18642825c6.js +1 -0
  147. package/apps/pwa/out/_next/static/chunks/app/missions/[id]/{page-2af16e62c12f22df.js → page-fe986fe79b107546.js} +1 -1
  148. package/apps/pwa/out/_next/static/chunks/app/morning/page-1e5da297557d2354.js +1 -0
  149. package/apps/pwa/out/_next/static/chunks/app/not-found-91ea9f5869a40943.js +1 -0
  150. package/apps/pwa/out/_next/static/chunks/app/observatory/page-7824e21b999962e2.js +1 -0
  151. package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-53d00a60cc75a922.js +1 -0
  152. package/apps/pwa/out/_next/static/chunks/app/ops/release/page-88a1edbff62eaf1d.js +1 -0
  153. package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-4e931248b3f9574b.js +1 -0
  154. package/apps/pwa/out/_next/static/chunks/app/outputs/page-443364c9e4a23b31.js +1 -0
  155. package/apps/pwa/out/_next/static/chunks/app/page-b9af2ac1c4737ce8.js +1 -0
  156. package/apps/pwa/out/_next/static/chunks/app/reflection/page-25ab9c614c14129b.js +1 -0
  157. package/apps/pwa/out/_next/static/chunks/app/scheduler/page-dbcdcfac0a395a8a.js +1 -0
  158. package/apps/pwa/out/_next/static/chunks/app/sessions/page-bf1de6645089ec58.js +1 -0
  159. package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-c4201761a5e839c9.js +1 -0
  160. package/apps/pwa/out/_next/static/chunks/app/settings/page-c304f469ea5d70e4.js +1 -0
  161. package/apps/pwa/out/_next/static/chunks/app/setup/done/page-8e5a238cf5e50c9c.js +1 -0
  162. package/apps/pwa/out/_next/static/chunks/app/setup/layout-c604fb980a634d88.js +1 -0
  163. package/apps/pwa/out/_next/static/chunks/app/setup/page-32b526069ee50b3c.js +1 -0
  164. package/apps/pwa/out/_next/static/chunks/app/share/page-fb9e639c107f5f72.js +1 -0
  165. package/apps/pwa/out/_next/static/chunks/app/showroom/page-84220c776608cedc.js +1 -0
  166. package/apps/pwa/out/_next/static/chunks/app/tasks/page-e475618cbfd5ca2b.js +1 -0
  167. package/apps/pwa/out/_next/static/chunks/app/term/page-ac2c1e6169cfce57.js +1 -0
  168. package/apps/pwa/out/_next/static/chunks/app/today/page-fccd3020af2f8806.js +1 -0
  169. package/apps/pwa/out/_next/static/chunks/app/trace/page-9c0d7198ff7b5a91.js +1 -0
  170. package/apps/pwa/out/_next/static/chunks/app/vault/page-d54b1ec9b9c6430d.js +1 -0
  171. package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-8c4bef1791d732ca.js +1 -0
  172. package/apps/pwa/out/_next/static/chunks/app/workflows/page-46fcc0b0bbc6fbfe.js +1 -0
  173. package/apps/pwa/out/_next/static/chunks/app/workspace/page-c1c80e345fa9d6f5.js +1 -0
  174. package/apps/pwa/out/_next/static/chunks/app/worktrees/page-7dfda00afd172f5b.js +1 -0
  175. package/apps/pwa/out/_next/static/chunks/{053a429e.9a63436527cc751c.js → d9815f84.4918f682a45a8502.js} +1 -1
  176. package/apps/pwa/out/_next/static/chunks/{ceba0382.650712b56b85b582.js → de8446d3.31b73eb239fecd7b.js} +1 -1
  177. package/apps/pwa/out/_next/static/chunks/f21fd540.63ac75328926ed30.js +1 -0
  178. package/apps/pwa/out/_next/static/chunks/framework-77fdcc873519a6cd.js +1 -0
  179. package/apps/pwa/out/_next/static/chunks/main-app-d0d620d2ce235713.js +1 -0
  180. package/apps/pwa/out/_next/static/chunks/main-e0ef79c79337ba90.js +1 -0
  181. package/apps/pwa/out/_next/static/chunks/pages/_app-84b1bc71e3f9ce6a.js +1 -0
  182. package/apps/pwa/out/_next/static/chunks/pages/_error-2acb61f1363128cb.js +1 -0
  183. package/apps/pwa/out/_next/static/chunks/webpack-462ff5727ceb7824.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/work/draft-close.yaml +54 -0
  280. package/graphs/work/green-close.yaml +37 -0
  281. package/graphs/work/recipes.yaml +46 -1
  282. package/graphs/work/run-research.yaml +35 -0
  283. package/package.json +1 -1
  284. package/scripts/__fixtures__/authoring-paths-10x3.json +32 -0
  285. package/scripts/boundary-proof-mapping-audit.ts +88 -0
  286. package/scripts/codex-fallback-live-probe.ts +17 -15
  287. package/scripts/fleet/node-setup.sh +32 -2
  288. package/scripts/fleet/run-light-worker.sh +9 -0
  289. package/scripts/gate-0226-failure-census.ts +507 -0
  290. package/scripts/goals/authoring-metrics.ts +258 -0
  291. package/scripts/graph-units/draft-close-node.ts +222 -0
  292. package/scripts/hook-order-sweep.ts +7 -4
  293. package/scripts/land-global-checks.ts +69 -1
  294. package/scripts/measure-nl-routing-corpus.ts +207 -2
  295. package/scripts/release-loop/docs-node.ts +140 -0
  296. package/scripts/release-loop/gate-closure.ts +48 -0
  297. package/scripts/release-loop/gate-diff.ts +2 -1
  298. package/scripts/release-loop/known-issues-node.ts +6 -4
  299. package/scripts/release-loop/notes-repair.ts +216 -0
  300. package/scripts/release-loop/prepare-node.ts +61 -5
  301. package/scripts/release-loop/resume-release.ts +114 -4
  302. package/scripts/release-loop/resume-test-traffic.ts +10 -0
  303. package/scripts/release-loop/version-node.ts +81 -12
  304. package/scripts/train/green-leg.ts +176 -0
  305. package/scripts/tui-continue-real-evidence.ts +47 -0
  306. package/scripts/ux-sim.ts +1 -1
  307. package/src/acp/client.ts +31 -5
  308. package/src/acp/core-turn-bridge.ts +6 -0
  309. package/src/acp/stderr-summary.ts +49 -0
  310. package/src/agent/monad-agent-turn.ts +1 -0
  311. package/src/agent/terminal-surface.ts +217 -0
  312. package/src/agent-substrate/pr-reviewer.ts +11 -3
  313. package/src/agent-substrate/self-review-cli.ts +343 -31
  314. package/src/autopilot/lineage/sources.ts +1 -1
  315. package/src/autopilot/pr-manager.ts +64 -13
  316. package/src/boot/daemon-runtime.ts +35 -3
  317. package/src/boot/daemon-tools/pty-shell.ts +2 -1
  318. package/src/budget/run-usage-rollup.ts +12 -7
  319. package/src/budget/unified-usage.ts +20 -0
  320. package/src/capture/tui-self-report.ts +32 -3
  321. package/src/cli/autopilot-cli.ts +24 -9
  322. package/src/cli/decisions-cli.ts +7 -4
  323. package/src/cli/doctor-cli.ts +116 -7
  324. package/src/cli/logs-cli.ts +357 -2
  325. package/src/cli/memory-cli.ts +30 -1
  326. package/src/cli/msg-cli.ts +15 -11
  327. package/src/cli/pr-granularity.ts +5 -3
  328. package/src/cli/release-checklist-read-cli.ts +109 -4
  329. package/src/cli/release-cli.ts +43 -10
  330. package/src/cli/self-update.ts +23 -5
  331. package/src/cli/self-utterances-cli.ts +13 -16
  332. package/src/cli/tasks-cli.ts +309 -11
  333. package/src/cli/usage-cli.ts +12 -10
  334. package/src/context-bus/claude-memory-import.ts +99 -0
  335. package/src/context-bus/long-term-memory.ts +125 -0
  336. package/src/core-turn/run-goal-loop.ts +5 -2
  337. package/src/core-turn/types.ts +2 -0
  338. package/src/dashboard/chat/acp-chat.ts +9 -0
  339. package/src/dashboard/index.ts +97 -13
  340. package/src/dashboard/input/agent-wake.ts +43 -0
  341. package/src/dashboard/input/chat-main-acp-dispatch.ts +21 -1
  342. package/src/dashboard/replay-preview.ts +25 -0
  343. package/src/dashboard/slash-runtime/dashboard-handlers.ts +17 -8
  344. package/src/dashboard/synchronized-frame-output.ts +74 -0
  345. package/src/display/coordinator.ts +45 -12
  346. package/src/display/resize-listener.ts +41 -20
  347. package/src/display/synchronized-output-region.ts +60 -0
  348. package/src/domains/surface-events.ts +80 -1
  349. package/src/exec-requests/planner.ts +37 -2
  350. package/src/execution-loop/launch-gate.ts +4 -3
  351. package/src/git-fs/cli-stderr.ts +45 -0
  352. package/src/git-fs/gh-cli.ts +6 -3
  353. package/src/git-fs/git-cli.ts +11 -5
  354. package/src/graph-runner/graph-cli.ts +26 -2
  355. package/src/graph-runner/graph-run-api.ts +3 -2
  356. package/src/graph-runner/runner.ts +17 -5
  357. package/src/graph-wizard/generate.ts +29 -6
  358. package/src/harness/harness-cli-command.ts +179 -33
  359. package/src/harness/review-adapter.ts +26 -6
  360. package/src/index.ts +116 -13
  361. package/src/instance/test-write-guard-real-transport.fixture.ts +52 -0
  362. package/src/llm/route-decision.ts +13 -0
  363. package/src/llm-tool-name.ts +37 -0
  364. package/src/llm-tool-schema.ts +35 -0
  365. package/src/llm.ts +123 -11
  366. package/src/loops/checker.ts +100 -0
  367. package/src/loops/consensus.ts +26 -2
  368. package/src/loops/loop-cli.ts +9 -4
  369. package/src/loops/orchestrator/anomaly-cluster.ts +243 -0
  370. package/src/loops/orchestrator/tick.ts +49 -4
  371. package/src/model-tier/llm-tier-map.ts +12 -17
  372. package/src/msg/msg-store.ts +17 -0
  373. package/src/native-tool-catalog.ts +1 -1
  374. package/src/nexus/api/graph-wizard-api.ts +27 -2
  375. package/src/nexus/api/grid.ts +24 -4
  376. package/src/nexus/api/http-server.ts +1 -1
  377. package/src/nexus/api/ops-api.ts +14 -6
  378. package/src/nexus/state/state.ts +7 -1
  379. package/src/oauth/codex-account-store.ts +34 -1
  380. package/src/ops/loops-map.ts +46 -0
  381. package/src/ops/overview-cache.ts +22 -4
  382. package/src/ops/overview.ts +41 -5
  383. package/src/policy/llm-policy.ts +3 -1
  384. package/src/prompt-enhance/enhance.ts +4 -4
  385. package/src/pty-shell/availability.ts +7 -0
  386. package/src/pty-shell/herdr-agent-report.ts +40 -31
  387. package/src/pty-shell/herdr-prune-stale.ts +17 -0
  388. package/src/pty-shell/herdr-sequence-lease.ts +60 -0
  389. package/src/pty-shell/pty-control-ipc.ts +187 -18
  390. package/src/pty-shell/registry.ts +25 -15
  391. package/src/pty-shell/tui-run-state.ts +235 -1
  392. package/src/release-loop/checklist.ts +50 -5
  393. package/src/release-loop/feature-store.ts +9 -9
  394. package/src/release-loop/landed-but-yellow.ts +93 -12
  395. package/src/repl/index.ts +8 -0
  396. package/src/seat-loop/seat-report.ts +1 -0
  397. package/src/self-dev/ask-launch-flow.ts +86 -10
  398. package/src/self-dev/decompose-proposal.ts +29 -18
  399. package/src/self-dev/dev-pipeline.ts +29 -7
  400. package/src/self-dev/draft-sweep.ts +241 -16
  401. package/src/self-dev/draft-triage-rules.ts +19 -5
  402. package/src/self-dev/review-provider-fallback.ts +45 -7
  403. package/src/self-dev/shard-plan.ts +48 -0
  404. package/src/self-dev/shard-run.ts +50 -3
  405. package/src/self-implement/doctor-visit.ts +83 -0
  406. package/src/self-implement/gate-artifacts.ts +6 -2
  407. package/src/self-implement/gate-baseline.ts +64 -1
  408. package/src/self-implement/gate-cli.ts +93 -9
  409. package/src/self-implement/gate-remote.ts +28 -4
  410. package/src/self-implement/gate-scope.ts +13 -1
  411. package/src/self-implement/goal-author.ts +333 -18
  412. package/src/self-implement/goal-supervisor-fill.ts +75 -26
  413. package/src/self-implement/importer-test-index.ts +215 -2
  414. package/src/self-implement/knowhow-pack.ts +5 -5
  415. package/src/self-implement/orchestrator.ts +318 -25
  416. package/src/self-implement/review-round-brief.ts +300 -0
  417. package/src/self-implement/rework-policy.ts +14 -0
  418. package/src/self-implement/run-ledger.ts +170 -6
  419. package/src/self-implement/run-stop.ts +1 -1
  420. package/src/self-implement/running-runs.ts +17 -3
  421. package/src/self-implement/seams.ts +12 -6
  422. package/src/self-implement/stop-autoheal.ts +1 -0
  423. package/src/self-implement/test-seams.ts +13 -1
  424. package/src/self-implement/train-reach-grouping.ts +8 -2
  425. package/src/session/chat.ts +7 -1
  426. package/src/session/id-prefix.ts +60 -0
  427. package/src/session/index.ts +4 -0
  428. package/src/session-runtime/index.ts +9 -1
  429. package/src/skills/tools/pty.ts +5 -0
  430. package/src/status/metrics.ts +12 -1
  431. package/src/steward/rejudge-tick.ts +12 -5
  432. package/src/steward/resync-tick.ts +31 -4
  433. package/src/task-agent/actions.ts +199 -4
  434. package/src/task-agent/boundary-proof-mapping.ts +12 -0
  435. package/src/task-agent/boundary-proof-producer.ts +147 -0
  436. package/src/task-agent/completion-evidence.ts +2 -1
  437. package/src/task-agent/green-close-recipe.ts +239 -0
  438. package/src/task-agent/green-sweep.ts +64 -10
  439. package/src/task-agent/live-moves.ts +48 -3
  440. package/src/task-agent/map-host-adapter.ts +134 -0
  441. package/src/task-agent/map-reduce.ts +158 -0
  442. package/src/task-agent/map-run-ledger.ts +226 -0
  443. package/src/task-agent/parent-host.ts +21 -11
  444. package/src/task-agent/rejudge-on-head.ts +72 -5
  445. package/src/task-agent/repair-cycle.ts +41 -0
  446. package/src/task-agent/repair-next-move.ts +12 -2
  447. package/src/task-agent/review-prior-fix.ts +12 -2
  448. package/src/task-agent/shadow.ts +188 -5
  449. package/src/task-agent/task-hand.ts +158 -13
  450. package/src/task-agent/task-parent-role-llm.ts +9 -0
  451. package/src/task-agent/tier-split.ts +4 -3
  452. package/src/task-agent/work-order.ts +53 -2
  453. package/src/task-orchestrator/dispatcher.ts +46 -1
  454. package/src/task-orchestrator/generator-prompt.ts +6 -0
  455. package/src/task-orchestrator/surfaces/pod-artifact-return.ts +16 -6
  456. package/src/task-orchestrator/surfaces/pod-ledger-collect.ts +8 -6
  457. package/src/task-orchestrator/surfaces/pod-ledger-events.ts +97 -0
  458. package/src/task-orchestrator/surfaces/pod-pool.ts +50 -4
  459. package/src/task-orchestrator/surfaces/pod-warm-worker-provider.ts +15 -9
  460. package/src/task-orchestrator/surfaces/self-implement-pod.ts +217 -36
  461. package/src/task-orchestrator/surfaces/self-implement.ts +4 -0
  462. package/src/testing/linux-env.ts +177 -0
  463. package/src/tui/chat/goal-interim.ts +5 -1
  464. package/src/tui/entry.ts +258 -4
  465. package/src/tui/input/at-picker.ts +55 -0
  466. package/src/tui/slash/resume.ts +35 -12
  467. package/src/tui/slash/signals.ts +114 -0
  468. package/src/tui/slash/term-next.ts +71 -0
  469. package/src/tui-client/local-chat-turn.ts +4 -3
  470. package/src/user-config.ts +19 -1
  471. package/src/ux-sim/boot-daemon-tools-pty-shell-device.ts +136 -0
  472. package/src/ux-sim/classic-tui-seat-scenarios.ts +158 -4
  473. package/src/ux-sim/fake-gh.ts +174 -0
  474. package/src/ux-sim/fake-kubectl.ts +142 -0
  475. package/src/ux-sim/fake-llm.ts +6 -1
  476. package/src/ux-sim/next-tui-seat-scenarios.ts +124 -6
  477. package/src/ux-sim/resume-picker-device.ts +173 -0
  478. package/src/ux-sim/session-id-seed.ts +60 -0
  479. package/src/ux-sim/skills-tools-shell-device.ts +156 -0
  480. package/src/ux-sim/task-agent-parent-host-device.ts +264 -0
  481. package/src/ux-sim/task-agent-rejudge-on-head-device.ts +114 -0
  482. package/src/version/packed-revision.json +1 -1
  483. package/apps/pwa/out/_next/static/chunks/109.f196abf3484bb97f.js +0 -287
  484. package/apps/pwa/out/_next/static/chunks/1201.afbfc5b1c5e5cbe4.js +0 -1
  485. package/apps/pwa/out/_next/static/chunks/1517.9275b89572098ff3.js +0 -1
  486. package/apps/pwa/out/_next/static/chunks/1574.ad11f8db8396ab45.js +0 -1
  487. package/apps/pwa/out/_next/static/chunks/1614.7a8c5c40aee0261f.js +0 -1
  488. package/apps/pwa/out/_next/static/chunks/1871-f1eb29d8dbb4065b.js +0 -1
  489. package/apps/pwa/out/_next/static/chunks/2193.0ea24c4a7aa1d004.js +0 -36
  490. package/apps/pwa/out/_next/static/chunks/223-ad865c1e80491d78.js +0 -1
  491. package/apps/pwa/out/_next/static/chunks/2265-f0d90b6dbec05f81.js +0 -1
  492. package/apps/pwa/out/_next/static/chunks/2267.eb4a62a209f09ec4.js +0 -149
  493. package/apps/pwa/out/_next/static/chunks/2341-86cd06c0cf01aa33.js +0 -1
  494. package/apps/pwa/out/_next/static/chunks/2352.9abc42422bade876.js +0 -1
  495. package/apps/pwa/out/_next/static/chunks/2397-c1653a816061842d.js +0 -1
  496. package/apps/pwa/out/_next/static/chunks/2500.cbc1257b774aae52.js +0 -1
  497. package/apps/pwa/out/_next/static/chunks/2709.8e1889034255fc5f.js +0 -24
  498. package/apps/pwa/out/_next/static/chunks/2812ca6a.3b9f4a7a08885744.js +0 -1
  499. package/apps/pwa/out/_next/static/chunks/284.ac77c0db55bfd3a8.js +0 -1
  500. package/apps/pwa/out/_next/static/chunks/2941.3c3546f96bc6efa7.js +0 -1
  501. package/apps/pwa/out/_next/static/chunks/2976.b000698a3c6512dc.js +0 -24
  502. package/apps/pwa/out/_next/static/chunks/3031-85328a92fcce4da6.js +0 -1
  503. package/apps/pwa/out/_next/static/chunks/3148-98efd4869d660a87.js +0 -1
  504. package/apps/pwa/out/_next/static/chunks/3155.2587a55196ecb394.js +0 -226
  505. package/apps/pwa/out/_next/static/chunks/3277.785db1cf09f98601.js +0 -1
  506. package/apps/pwa/out/_next/static/chunks/3320-f9c77381f85a2c0a.js +0 -1
  507. package/apps/pwa/out/_next/static/chunks/3386-91049feabff9a94e.js +0 -1
  508. package/apps/pwa/out/_next/static/chunks/339.80afb7e8839372af.js +0 -8
  509. package/apps/pwa/out/_next/static/chunks/3538.a445e50bb359d068.js +0 -32
  510. package/apps/pwa/out/_next/static/chunks/3540c645.2595a6af01a97672.js +0 -1
  511. package/apps/pwa/out/_next/static/chunks/3621.581b2054cc14bee4.js +0 -286
  512. package/apps/pwa/out/_next/static/chunks/3676.8c28d16fd84ca843.js +0 -1
  513. package/apps/pwa/out/_next/static/chunks/375-b84540853523fe52.js +0 -1
  514. package/apps/pwa/out/_next/static/chunks/379.ee262e37586fe1ae.js +0 -74
  515. package/apps/pwa/out/_next/static/chunks/3969-81054381eaec4c4c.js +0 -1
  516. package/apps/pwa/out/_next/static/chunks/4067-bf9aa60547972937.js +0 -1
  517. package/apps/pwa/out/_next/static/chunks/4116.a84a92a2492c080e.js +0 -1
  518. package/apps/pwa/out/_next/static/chunks/4176.e5729c93c29151eb.js +0 -104
  519. package/apps/pwa/out/_next/static/chunks/4227-e6c84686bc8946ca.js +0 -1
  520. package/apps/pwa/out/_next/static/chunks/4327.b9e08a71c0009348.js +0 -1
  521. package/apps/pwa/out/_next/static/chunks/4946.bd106eafd668f248.js +0 -148
  522. package/apps/pwa/out/_next/static/chunks/5085-bce4904931767ca6.js +0 -1
  523. package/apps/pwa/out/_next/static/chunks/5125.2eb9968b83767193.js +0 -93
  524. package/apps/pwa/out/_next/static/chunks/5128-75b733fd74a9a1eb.js +0 -1
  525. package/apps/pwa/out/_next/static/chunks/5489f3fe.4bb1458b09f6dead.js +0 -122
  526. package/apps/pwa/out/_next/static/chunks/5560-2a4648f6a30f16e7.js +0 -1
  527. package/apps/pwa/out/_next/static/chunks/5772-e29e14f8ff127122.js +0 -1
  528. package/apps/pwa/out/_next/static/chunks/5887.5b2f5b44ce0f7e9a.js +0 -1
  529. package/apps/pwa/out/_next/static/chunks/5899-4c112a2d908cf97f.js +0 -1
  530. package/apps/pwa/out/_next/static/chunks/599.c39c571b6733f2a2.js +0 -41
  531. package/apps/pwa/out/_next/static/chunks/6041.1b65efb796ebc2a5.js +0 -79
  532. package/apps/pwa/out/_next/static/chunks/6057-765c0a26028c86b2.js +0 -1
  533. package/apps/pwa/out/_next/static/chunks/6142.f289e0d039f453a6.js +0 -1
  534. package/apps/pwa/out/_next/static/chunks/6199-6bcd61d2a3910e04.js +0 -1
  535. package/apps/pwa/out/_next/static/chunks/6236.cdf7293e710a9b2d.js +0 -1
  536. package/apps/pwa/out/_next/static/chunks/6387-237e079dac9a3ae6.js +0 -1
  537. package/apps/pwa/out/_next/static/chunks/6448-b6d272d074276e14.js +0 -1
  538. package/apps/pwa/out/_next/static/chunks/6566.926a1d1b7c911442.js +0 -1
  539. package/apps/pwa/out/_next/static/chunks/6580-cdc0e4a634ce4708.js +0 -1
  540. package/apps/pwa/out/_next/static/chunks/6659-b242dc31b20b3f29.js +0 -1
  541. package/apps/pwa/out/_next/static/chunks/6690.c5d9b321b1f79384.js +0 -1
  542. package/apps/pwa/out/_next/static/chunks/671-e9b6ad0c771c5514.js +0 -1
  543. package/apps/pwa/out/_next/static/chunks/6862.bcbf89dd0f4496b3.js +0 -27
  544. package/apps/pwa/out/_next/static/chunks/6912-7b375ee48732c767.js +0 -1
  545. package/apps/pwa/out/_next/static/chunks/6925.562d532110879886.js +0 -1
  546. package/apps/pwa/out/_next/static/chunks/727.7deb87749b0a343a.js +0 -1
  547. package/apps/pwa/out/_next/static/chunks/7545.b1aa42cd15503319.js +0 -1
  548. package/apps/pwa/out/_next/static/chunks/7551-416d298c2dc4a9ab.js +0 -1
  549. package/apps/pwa/out/_next/static/chunks/7784.1f0ac4a16d190cf4.js +0 -1
  550. package/apps/pwa/out/_next/static/chunks/7870-309de463786ac1fc.js +0 -1
  551. package/apps/pwa/out/_next/static/chunks/7888-e29b151bb6a3bb8b.js +0 -1
  552. package/apps/pwa/out/_next/static/chunks/7891.03f910124a737985.js +0 -1
  553. package/apps/pwa/out/_next/static/chunks/7905-6ba78d9234608f79.js +0 -1
  554. package/apps/pwa/out/_next/static/chunks/8037.e254fd797aa224d1.js +0 -1
  555. package/apps/pwa/out/_next/static/chunks/8207.f527886b7c464529.js +0 -1
  556. package/apps/pwa/out/_next/static/chunks/856.50bda61439d465e6.js +0 -62
  557. package/apps/pwa/out/_next/static/chunks/9031-92e9b487edb681ee.js +0 -1
  558. package/apps/pwa/out/_next/static/chunks/9060.5410d9f6a95f6287.js +0 -90
  559. package/apps/pwa/out/_next/static/chunks/914.8abefd48d579547b.js +0 -94
  560. package/apps/pwa/out/_next/static/chunks/9187-c87a2207d4ac5d46.js +0 -1
  561. package/apps/pwa/out/_next/static/chunks/9289.3e92f278821e18e0.js +0 -1
  562. package/apps/pwa/out/_next/static/chunks/9319.7816d3cc741cd34f.js +0 -1
  563. package/apps/pwa/out/_next/static/chunks/9327-e016bb9f1674d24f.js +0 -1
  564. package/apps/pwa/out/_next/static/chunks/9365.3de48bf75193ff9a.js +0 -77
  565. package/apps/pwa/out/_next/static/chunks/9383.5b5e9aa56b5fea97.js +0 -1
  566. package/apps/pwa/out/_next/static/chunks/9387-cb929573ef436f39.js +0 -1
  567. package/apps/pwa/out/_next/static/chunks/9489.c27becacc3283dec.js +0 -1
  568. package/apps/pwa/out/_next/static/chunks/9514.131c52cc75fe6439.js +0 -1
  569. package/apps/pwa/out/_next/static/chunks/9536.28962663c7734376.js +0 -1
  570. package/apps/pwa/out/_next/static/chunks/9686-12286f5bbf15a5a0.js +0 -1
  571. package/apps/pwa/out/_next/static/chunks/9776.289d40cc5a4c342a.js +0 -1
  572. package/apps/pwa/out/_next/static/chunks/9789.60f723d18097ec30.js +0 -1
  573. package/apps/pwa/out/_next/static/chunks/989.f0c17523c5e61f65.js +0 -1
  574. package/apps/pwa/out/_next/static/chunks/9972-1df393aa8d4f7d52.js +0 -1
  575. package/apps/pwa/out/_next/static/chunks/app/_not-found/page-96750aba7430959f.js +0 -1
  576. package/apps/pwa/out/_next/static/chunks/app/approvals/page-4105e5bbbb043024.js +0 -1
  577. package/apps/pwa/out/_next/static/chunks/app/autopilot/page-5d4fa75c2acb113e.js +0 -1
  578. package/apps/pwa/out/_next/static/chunks/app/board/page-a79a9bdb3b2142bf.js +0 -1
  579. package/apps/pwa/out/_next/static/chunks/app/botlab/page-f1c2047484992a35.js +0 -1
  580. package/apps/pwa/out/_next/static/chunks/app/bots/page-15ffc49b2d8c70e2.js +0 -1
  581. package/apps/pwa/out/_next/static/chunks/app/ceo/page-67d53a3fc8734135.js +0 -1
  582. package/apps/pwa/out/_next/static/chunks/app/chat/page-e30c8dc696491336.js +0 -1
  583. package/apps/pwa/out/_next/static/chunks/app/consult/page-2136e04fa77696e2.js +0 -1
  584. package/apps/pwa/out/_next/static/chunks/app/control/page-fecd2814790c2e12.js +0 -1
  585. package/apps/pwa/out/_next/static/chunks/app/decisions/page-280aa4a98fc5bb44.js +0 -1
  586. package/apps/pwa/out/_next/static/chunks/app/design-check/page-c14e96b65fb4b883.js +0 -1
  587. package/apps/pwa/out/_next/static/chunks/app/editor/page-187dac74825ed6bf.js +0 -1
  588. package/apps/pwa/out/_next/static/chunks/app/exec/page-6bc7246ea8c92448.js +0 -1
  589. package/apps/pwa/out/_next/static/chunks/app/field/page-083747f1d4518f61.js +0 -1
  590. package/apps/pwa/out/_next/static/chunks/app/healthz/route-96750aba7430959f.js +0 -1
  591. package/apps/pwa/out/_next/static/chunks/app/inside/page-15ca95a16ec96e1f.js +0 -1
  592. package/apps/pwa/out/_next/static/chunks/app/intake/page-a8ac031b3810eb64.js +0 -1
  593. package/apps/pwa/out/_next/static/chunks/app/layout-8835f93110494cda.js +0 -1
  594. package/apps/pwa/out/_next/static/chunks/app/loops/page-5b92b7f75df20948.js +0 -1
  595. package/apps/pwa/out/_next/static/chunks/app/market/page-468eddf2b1a84ecb.js +0 -1
  596. package/apps/pwa/out/_next/static/chunks/app/morning/page-18b40867a77a5793.js +0 -1
  597. package/apps/pwa/out/_next/static/chunks/app/not-found-fe934f2979f5a4a2.js +0 -1
  598. package/apps/pwa/out/_next/static/chunks/app/observatory/page-3eec435537357170.js +0 -1
  599. package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-ff88cbfd2aa99fc8.js +0 -1
  600. package/apps/pwa/out/_next/static/chunks/app/ops/release/page-a5b39fb780c70ab5.js +0 -1
  601. package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-ae465dde1d1b3933.js +0 -1
  602. package/apps/pwa/out/_next/static/chunks/app/outputs/page-e7abc34a48a6f71e.js +0 -1
  603. package/apps/pwa/out/_next/static/chunks/app/page-cab9674fde9ead26.js +0 -1
  604. package/apps/pwa/out/_next/static/chunks/app/reflection/page-1da49bc8712284d0.js +0 -1
  605. package/apps/pwa/out/_next/static/chunks/app/scheduler/page-5e8aa657551ac912.js +0 -1
  606. package/apps/pwa/out/_next/static/chunks/app/sessions/page-fcc36f36c6dc1fe2.js +0 -1
  607. package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-d22db22f2a7296ca.js +0 -1
  608. package/apps/pwa/out/_next/static/chunks/app/settings/page-d12dc7b1773878f0.js +0 -1
  609. package/apps/pwa/out/_next/static/chunks/app/setup/done/page-99debec9ea7fbec0.js +0 -1
  610. package/apps/pwa/out/_next/static/chunks/app/setup/layout-96750aba7430959f.js +0 -1
  611. package/apps/pwa/out/_next/static/chunks/app/setup/page-2a088a78bad7e924.js +0 -1
  612. package/apps/pwa/out/_next/static/chunks/app/share/page-2e8ed57db7e69993.js +0 -1
  613. package/apps/pwa/out/_next/static/chunks/app/showroom/page-4b3a16213c2ae8fe.js +0 -1
  614. package/apps/pwa/out/_next/static/chunks/app/tasks/page-f098747ddf38c98b.js +0 -1
  615. package/apps/pwa/out/_next/static/chunks/app/term/page-c15958835534404b.js +0 -1
  616. package/apps/pwa/out/_next/static/chunks/app/today/page-68279e3c843c1fd7.js +0 -1
  617. package/apps/pwa/out/_next/static/chunks/app/trace/page-a34a74453367a39d.js +0 -1
  618. package/apps/pwa/out/_next/static/chunks/app/vault/page-8767a7db2155a5bd.js +0 -1
  619. package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-bd5976683460d7f2.js +0 -1
  620. package/apps/pwa/out/_next/static/chunks/app/workflows/page-b7364835e7f2ef54.js +0 -1
  621. package/apps/pwa/out/_next/static/chunks/app/workspace/page-311af16b3ee0ffca.js +0 -1
  622. package/apps/pwa/out/_next/static/chunks/app/worktrees/page-fb670757274ae990.js +0 -1
  623. package/apps/pwa/out/_next/static/chunks/f9a61e4d.1fc2c1dbdd49fe46.js +0 -1
  624. package/apps/pwa/out/_next/static/chunks/framework-6d497cbf1eef04c6.js +0 -1
  625. package/apps/pwa/out/_next/static/chunks/main-app-012f5edec932f337.js +0 -1
  626. package/apps/pwa/out/_next/static/chunks/main-da5aeb809edc94a2.js +0 -1
  627. package/apps/pwa/out/_next/static/chunks/pages/_app-5ee319af6f749dfe.js +0 -1
  628. package/apps/pwa/out/_next/static/chunks/pages/_error-4bc84653a718d6c6.js +0 -1
  629. package/apps/pwa/out/_next/static/chunks/webpack-8a96cf6775c73d6e.js +0 -1
  630. /package/apps/pwa/out/_next/static/{uC-N0emedeNOFuaBQFv-I → 8kITumG9GAZ1LwT9POrAR}/_ssgManifest.js +0 -0
@@ -302,3 +302,128 @@ export async function condenseContextWindowWithReport(
302
302
  catch { /* Observation must not stop condensation. */ }
303
303
  return { cards, skipped, folded, droppedHarnessChild, funnel };
304
304
  }
305
+
306
+ // ─── Claude 자동 기억 가져오기 (MEMORY-IMPORT-CLAUDE · 대표 10-12) ──────────────────────────────
307
+ // `~/.claude/projects/<project>/memory/*.md` 의 frontmatter(name·description·type)를 엘라누스
308
+ // 장기 기억 레코드로 옮긴다. 파일 읽기·저장은 호출자 몫 — 여기는 순수 변환만 둔다(에이전트 무관).
309
+
310
+ /** Claude 기억 파일 frontmatter 의 type 값 — 큐레이션 기억 type 어휘와 같다. */
311
+ export type ClaudeMemoryType = 'user' | 'feedback' | 'project' | 'reference';
312
+
313
+ /** 가져온 기억이 앉는 신뢰 사다리 맨 아래 칸 — 승격된 카드·결정을 덮지 않는다. */
314
+ export const CLAUDE_MEMORY_TRUST = 'memory';
315
+
316
+ /** 가져온 기억의 seat 표식 — 어떤 에이전트(codex·elanous TUI)든 같은 자리에서 읽는다. */
317
+ export const CLAUDE_MEMORY_SEAT = 'claude-memory';
318
+
319
+ /** 디스크에서 읽은 Claude 기억 파일 하나(경로 ⊕ 원문). */
320
+ export interface ClaudeMemoryFile { path: string; text: string }
321
+
322
+ /** MemoryItem 계약에 파일 자신의 이름 3종(name·description·type)을 그대로 얹은 레코드. */
323
+ export interface ClaudeMemoryItem extends MemoryItem {
324
+ name: string;
325
+ description: string;
326
+ type: ClaudeMemoryType;
327
+ body: string;
328
+ trust: typeof CLAUDE_MEMORY_TRUST;
329
+ }
330
+
331
+ export type ClaudeMemorySkipReason = 'no-frontmatter' | 'no-name' | 'no-description' | 'unknown-type';
332
+
333
+ export interface ClaudeMemoryImport {
334
+ items: ClaudeMemoryItem[];
335
+ /** 같은 name 이 두 번 나오면 뒤 파일이 이긴다(덮어쓰기). */
336
+ overwritten: number;
337
+ skipped: Partial<Record<ClaudeMemorySkipReason, number>>;
338
+ }
339
+
340
+ const CLAUDE_MEMORY_TYPES: readonly ClaudeMemoryType[] = ['user', 'feedback', 'project', 'reference'];
341
+
342
+ /** 출처 표시 — 원장의 `^(https?://|elanous://)` 링크 계약을 넓히지 않고 그대로 만족한다. */
343
+ export function claudeMemorySource(name: string): string {
344
+ return `elanous://claude-memory/${encodeURIComponent(name.trim())}`;
345
+ }
346
+
347
+ /** 낡음 표시 — «10-14 기준» 처럼 기준일의 월-일을 남긴다. */
348
+ export function claudeMemoryStalenessNote(asOf: string): string {
349
+ return `«${claudeMemoryInstant(asOf).slice(5, 10)} 기준»`;
350
+ }
351
+
352
+ function claudeMemoryInstant(asOf: string): string {
353
+ const ms = Date.parse(asOf);
354
+ if (!Number.isFinite(ms)) throw new Error(`claude memory asOf is not a date: ${asOf}`);
355
+ return new Date(ms).toISOString();
356
+ }
357
+
358
+ function claudeFrontmatter(text: string): { fields: Record<string, string>; body: string } | undefined {
359
+ const normalized = text.replace(/^\uFEFF/, '').replace(/\r\n?/g, '\n');
360
+ if (!normalized.startsWith('---\n')) return undefined;
361
+ const close = normalized.indexOf('\n---', 3);
362
+ if (close < 0) return undefined;
363
+ const fields: Record<string, string> = {};
364
+ for (const line of normalized.slice(4, close).split('\n')) {
365
+ const match = /^([A-Za-z][\w-]*)\s*:\s*(.*)$/.exec(line);
366
+ if (match) fields[match[1]] = match[2].replace(/^(['"])([\s\S]*)\1$/, '$2').trim();
367
+ }
368
+ return { fields, body: normalized.slice(close + 4).replace(/^\n+/, '').trim() };
369
+ }
370
+
371
+ function claudeMemoryProject(path: string): string {
372
+ const parts = path.split(/[\\/]/).filter(Boolean);
373
+ const projectsAt = parts.indexOf('projects');
374
+ if (projectsAt >= 0 && parts[projectsAt + 2] === 'memory') return parts[projectsAt + 1];
375
+ const memoryAt = parts.lastIndexOf('memory');
376
+ return memoryAt > 0 ? parts[memoryAt - 1] : '(unknown)';
377
+ }
378
+
379
+ /**
380
+ * Claude 기억 파일 하나 → 장기 기억 레코드. 형식이 안 맞으면 이유와 함께 건너뛴다.
381
+ * claim 이 없는 레코드지만 source 가 `elanous://claude-memory/<name>` 링크라 원장 계약을 지킨다.
382
+ */
383
+ export function importClaudeMemory(
384
+ file: ClaudeMemoryFile,
385
+ options: { asOf: string },
386
+ ): { ok: true; item: ClaudeMemoryItem } | { ok: false; reason: ClaudeMemorySkipReason } {
387
+ const parsed = claudeFrontmatter(file.text);
388
+ if (!parsed) return { ok: false, reason: 'no-frontmatter' };
389
+ const name = (parsed.fields.name ?? '').trim();
390
+ if (!name) return { ok: false, reason: 'no-name' };
391
+ const description = (parsed.fields.description ?? '').trim();
392
+ if (!description) return { ok: false, reason: 'no-description' };
393
+ const type = (parsed.fields.type ?? '').trim().toLowerCase();
394
+ if (!CLAUDE_MEMORY_TYPES.includes(type as ClaudeMemoryType)) return { ok: false, reason: 'unknown-type' };
395
+ return { ok: true, item: {
396
+ project: claudeMemoryProject(file.path),
397
+ seat: CLAUDE_MEMORY_SEAT,
398
+ topic: name,
399
+ summary: `${claudeMemoryStalenessNote(options.asOf)} ${description}`,
400
+ source: claudeMemorySource(name),
401
+ updatedAt: claudeMemoryInstant(options.asOf),
402
+ status: 'active',
403
+ name,
404
+ description,
405
+ type: type as ClaudeMemoryType,
406
+ body: parsed.body,
407
+ trust: CLAUDE_MEMORY_TRUST,
408
+ } };
409
+ }
410
+
411
+ /** 여러 파일을 한 번에 — name 이 겹치면 뒤 파일이 이긴다(덮어쓰기). */
412
+ export function importClaudeMemories(
413
+ files: readonly ClaudeMemoryFile[],
414
+ options: { asOf: string },
415
+ ): ClaudeMemoryImport {
416
+ const byName = new Map<string, ClaudeMemoryItem>();
417
+ const skipped: Partial<Record<ClaudeMemorySkipReason, number>> = {};
418
+ let overwritten = 0;
419
+ for (const file of files) {
420
+ const outcome = importClaudeMemory(file, options);
421
+ if (!outcome.ok) {
422
+ skipped[outcome.reason] = (skipped[outcome.reason] ?? 0) + 1;
423
+ continue;
424
+ }
425
+ if (byName.has(outcome.item.name)) overwritten += 1;
426
+ byName.set(outcome.item.name, outcome.item);
427
+ }
428
+ return { items: [...byName.values()], overwritten, skipped };
429
+ }
@@ -185,7 +185,7 @@ export const GOAL_FINAL_ITERATION_NOTE =
185
185
  '[last iteration] 이번이 이 목표의 마지막 반복이다. 이번에 끝내지 못하면 답 끝에 최종 보고를 한 번 써라: 한 것 · 남은 것 · 확인한 증거.';
186
186
 
187
187
  /** 중간 답이 «최종 보고형»(미완 목록)인가 — 관측 전용(행동을 바꾸지 않는다). */
188
- const INTERIM_REPORT_SHAPED = /(?:보고할 수 없|하지 못했습니다|못했습니다|완료되지 않았|검증되지 않았|확인하지 못했|not (?:yet )?(?:verified|completed)|cannot report)/i;
188
+ const INTERIM_REPORT_SHAPED = /(?:보고할 수 없|하지\s?못했습니다|못\s?했습니다|완료되지 않았|검증되지 않았|확인하지 못했|not (?:yet )?(?:verified|completed)|cannot report)/i;
189
189
  export function isInterimReportShaped(text: string): boolean {
190
190
  return INTERIM_REPORT_SHAPED.test(text);
191
191
  }
@@ -631,12 +631,15 @@ export async function runGoalLoop(
631
631
  const reinject = (content: string): void => {
632
632
  if (iterations >= maxIterations) return;
633
633
  const lastIteration = iterations === maxIterations - 1;
634
+ const reportShaped = isInterimReportShaped(lastResult.finalText);
634
635
  try {
635
636
  debug.log('goal.loop', 'interim-reply', {
636
637
  sessionId: ctx.sessionId, ...runAttribution, iteration: iterations, lastIteration,
637
- reportShaped: isInterimReportShaped(lastResult.finalText), finalChars: lastResult.finalText.length,
638
+ reportShaped, finalChars: lastResult.finalText.length,
638
639
  }, { level: 'debug' });
639
640
  } catch { /* 관측 실패가 루프를 막지 않는다 */ }
641
+ // Only a real continuation is interim; terminal and last-iteration answers stay visible.
642
+ if (lastResult.finalText.trim()) ctx.callbacks?.onGoalInterim?.(lastResult.finalText, iterations);
640
643
  const nextIteration = iterations + 1;
641
644
  const toolBudget = ctx.maxToolTurns ?? TOOL_LOOP_MAX_TURNS_DEFAULT;
642
645
  const shouldAttachDelegateHint = shouldHintDelegate({
@@ -103,6 +103,8 @@ export interface CoreTurnCallbacks {
103
103
  * persist this into their history store so the next user turn
104
104
  * sees real tool evidence rather than a string summary. */
105
105
  onTurnComplete?(newMessages: LLMMessage[]): void;
106
+ /** A goal iteration has finished but the goal remains open. Display-only signal; never replaces the turn history. */
107
+ onGoalInterim?(text: string, iteration: number): void;
106
108
  /** Codex Responses API reasoning summary stream (gpt-5 family).
107
109
  * `summary_part_added` marks a paragraph break between successive
108
110
  * parts; `summary_delta` carries the streamed text. Only fires when
@@ -89,6 +89,8 @@ export interface AcpChatHandlers {
89
89
  /** Append streamed assistant text. Caller accumulates + redraws.
90
90
  * Receives each chunk exactly as the ACP agent emits it. */
91
91
  appendChunk: (delta: string) => void;
92
+ /** A goal iteration ended; fold only that interim reply in the visible pane. */
93
+ foldGoalInterim?: (text: string) => void;
92
94
  /** Called once per tool_call event with a rendered label like
93
95
  * "→ tool: read_file(/tmp/foo)". Dashboard writes these into the
94
96
  * log pane with a subdued style. */
@@ -430,6 +432,13 @@ export class DashboardAcpChat {
430
432
  private dispatchUpdate(update: SessionUpdate, handlers: AcpChatHandlers, sess: AcpChatSession): void {
431
433
  switch (update.sessionUpdate) {
432
434
  case 'agent_message_chunk': {
435
+ const interim = (update as typeof update & { _meta?: { goalInterim?: unknown } })._meta?.goalInterim;
436
+ if (typeof interim === 'string') {
437
+ this.closeStreamBuffer(sess, 'flush');
438
+ handlers.foldGoalInterim?.(interim);
439
+ handlers.redraw?.();
440
+ return;
441
+ }
433
442
  const c = update.content;
434
443
  if (c.type === 'text') {
435
444
  this.routeText(sess, c.text, handlers);
@@ -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
  }
@@ -11337,7 +11396,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
11337
11396
  try { mouseWiring.toasts().push({ text, kind, ttlMs: 1200 }); } catch { /* ignore */ }
11338
11397
  };
11339
11398
 
11340
- drawNow = ({ force: forceFromCoordinator = false } = {}) => {
11399
+ const drawFrameNow = ({ force: forceFromCoordinator = false } = {}) => {
11341
11400
  const { rows: termRows, cols } = termSize();
11342
11401
  const totalW = cols - 1;
11343
11402
 
@@ -11781,6 +11840,15 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
11781
11840
  if (overlay.length > 0) process.stdout.write(overlay);
11782
11841
  } catch { /* overlay must not crash main draw */ }
11783
11842
  };
11843
+ // TUI-FLICKER-DRAW-INTEGRATION — one synchronized-output owner for the whole
11844
+ // frame compose: BSU → frame (+ coordinator modal overlay) → prompt repaint →
11845
+ // ESU. Both draw entry paths (force and queued microtask) call this same
11846
+ // seam, and the finally keeps the region closed when a compose throws so the
11847
+ // next frame is not swallowed by a dangling BSU. `supported` is the tty gate:
11848
+ // piped/captured output keeps the bytes it had before this seam existed.
11849
+ drawNow = (opts = {}) => {
11850
+ drawDashboardFrameSynchronized(() => { drawFrameNow(opts); }, process.stdout);
11851
+ };
11784
11852
  draw = (opts = {}) => {
11785
11853
  if (debug.enabled) {
11786
11854
  const now = Date.now();
@@ -12645,7 +12713,8 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
12645
12713
  const disposeResizeListener = installResizeListener({
12646
12714
  draw: (opts) => draw(opts),
12647
12715
  promptCtl,
12648
- requestOverlayFrame: () => display.requestRender({ force: true }),
12716
+ requestOverlayFrame: () => display.requestRenderNow({ force: true }),
12717
+ withSynchronizedOutput: (paint) => display.withSynchronizedOutput(paint),
12649
12718
  });
12650
12719
  process.on('exit', disposeResizeListener);
12651
12720
  // 외부 주입(`pty text`)을 사용자 타이핑과 섞지 않고 별도 대기열로 — 결함 #6(10-14).
@@ -13267,14 +13336,16 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
13267
13336
  // ⭐ TUI-AGENT-IDLE-WAKE — 배경 자식(⊕ RunShell bg) 완료 큐의 «유일한» 구독(onEnqueue 구독 0 → 1).
13268
13337
  // 채팅 한 줄 «✓ 위임 끝: <이름> — 다음 턴에 결과» · 결과는 다음 턴 preamble 이 싣는다.
13269
13338
  // ⛔ 입력칸·injectKey·pty 주입 0(대표 비침투). dedupe·수명은 모듈, 여기선 배선만.
13270
- const agentWake = installAgentWake({
13339
+ const agentWake = installSeatedAgentWake({
13271
13340
  subscribe: (listener) => subscribeDashboardAgentResults(
13272
13341
  globalTaskNotificationQueue, listener, (line) => { pushChatLine(C.muted(line)); draw(); },
13273
13342
  ),
13274
13343
  // 그리기 실패는 삼키지 않는다 — 모듈이 잡아 notified{shown:false} 로 남긴다.
13275
13344
  notify: createDashboardAgentWakeNotify((line) => { chatLines.push(C.muted(line)); }, () => draw()),
13276
13345
  // 조각 2 — 자리 TUI ∧ 유휴면 H2 문으로 다음 턴(origin child-complete) · 판정은 모듈.
13277
- openTurn: { startTurnIfIdle: (text, opts) => internalTurnGate.startTurnIfIdle(text, opts), getCwd: () => workingDir.cwd, isPending: (taskId) => globalTaskNotificationQueue.has(taskId) },
13346
+ startTurnIfIdle: (text, opts) => internalTurnGate.startTurnIfIdle(text, opts),
13347
+ getCwd: () => workingDir.cwd,
13348
+ isPending: (taskId) => globalTaskNotificationQueue.has(taskId),
13278
13349
  });
13279
13350
  disposeDashboardAgentWake = () => agentWake.dispose();
13280
13351
 
@@ -15236,14 +15307,15 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
15236
15307
  chat.history.push(m as ChatMessage);
15237
15308
  }
15238
15309
  const turns = past.length;
15239
- chatLines.push(C.muted(` ${turns} turn${turns === 1 ? '' : 's'} restored. Preview of last 5:`));
15310
+ chatLines.push(C.muted(` ${turns} turn${turns === 1 ? '' : 's'} restored:`));
15311
+ noteRestoredContext(chat.history);
15240
15312
  // BACKLOG #1 — markdown-aware preview rendering. Replaces
15241
15313
  // the previous one-line `slice(0, 100)` snippet so tables
15242
15314
  // / bold / lists in replayed turns look the same as when
15243
15315
  // they were originally streamed (`formatResponse` path).
15244
15316
  const previewWidth = Math.max(40, termSize().cols - 8);
15245
15317
  const previewWrap = getUserConfig().chat.rendering.wrap;
15246
- const previewLines = renderReplayPreviewLines(past, {
15318
+ const previewLines = renderRestoredTranscriptLines(past, {
15247
15319
  maxWidth: previewWidth,
15248
15320
  wrapOpts: previewWrap,
15249
15321
  });
@@ -15285,7 +15357,16 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
15285
15357
  if (resume.repaired) {
15286
15358
  chatLines.push(C.muted(` 깨진 도구 호출·결과 짝을 잘라 이어받았다(호출 ${resume.repaired.removedCalls} · 결과 ${resume.repaired.removedResults})`));
15287
15359
  }
15288
- chatLines.push(C.muted(` ${resume.turns} turns restored. Next turn continues this conversation.`));
15360
+ // TUI-RESUME-PICKER ②③④ — `--resume` used to leave the chat log blank and ctx at 0, so the user could
15361
+ // not see that 379 messages had come back. Show the restored conversation and its size now.
15362
+ chatLines.push(C.muted(` ${resume.turns} turns restored:`));
15363
+ for (const line of renderRestoredTranscriptLines(chat.history, {
15364
+ maxWidth: Math.max(40, termSize().cols - 8),
15365
+ wrapOpts: getUserConfig().chat.rendering.wrap,
15366
+ })) chatLines.push(line);
15367
+ const restoredTokens = noteRestoredContext(chat.history);
15368
+ debug.log('chat.session.resume', 'restored', { sessionId: resume.sessionId, turns: resume.turns, estimatedContextTokens: restoredTokens });
15369
+ chatLines.push(C.muted(' Next turn continues this conversation.'));
15289
15370
  }
15290
15371
  }
15291
15372
  observeSessionStart({
@@ -17866,6 +17947,9 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
17866
17947
  },
17867
17948
  };
17868
17949
  const slashOutcome = await dashboardSlashRegistry.dispatch(cmdLower, args, slashCtx);
17950
+ if (cmdLower === 'mission') {
17951
+ debug.log('tui.legacy-slash-use', 'mission', { surface: 'classic', tuiSession: null });
17952
+ }
17869
17953
  if (debug.enabled) {
17870
17954
  debug.log('dashboard.slash.dispatch', cmdLower, {
17871
17955
  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();
@@ -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
+ }
@@ -364,13 +364,15 @@ import {
364
364
  attachTelegramBinding as sessionAttachTelegram,
365
365
  listBoundSessions as sessionListBound,
366
366
  } from '../../session/index.js';
367
+ import { idPrefixCell, sessionIdPrefixes, sessionListTime } from '../../session/id-prefix.js';
367
368
  import { safeReadLock as telegramSafeReadLock, defaultLockPath as telegramDefaultLockPath } from '../../telegram-lock.js';
368
369
  import { userConfigPath as userConfigPathFn } from '../../user-config.js';
369
370
  import { dirname as pathDirname, relative, resolve as resolvePath } from 'node:path';
370
371
  import { existsSync, readFileSync, statSync, writeFileSync } from 'node:fs';
371
372
  import { installPlugin, listInstalledPlugins, type InstalledPlugin } from '../../plugins/install/plugin-install.js';
372
373
  import type { SurfaceUx } from '../../agent/surface-ux/types.js';
373
- import { renderReplayPreviewLines } from '../replay-preview.js';
374
+ import { renderRestoredTranscriptLines } from '../replay-preview.js';
375
+ import { noteRestoredContext } from '../../status/metrics.js';
374
376
  import {
375
377
  deriveDaemonHttpBase,
376
378
  fetchDaemonSessionList,
@@ -2395,6 +2397,8 @@ export function buildDashboardSlashRegistry(nowDeps?: ContextNowDeps, decideLedg
2395
2397
  }
2396
2398
  } else if (result.kind === 'stopped-before-authoring') {
2397
2399
  ctx.chatLines.push(ctx.error(' ⛔ 저작 «전» 예비 검사에서 막혔다 — 위 이름을 확인하라'));
2400
+ } else if (result.kind === 'stopped-by-timebox') {
2401
+ ctx.chatLines.push(ctx.error(` ⛔ AUTHOR-TIMEBOX 초과로 접지 없이 끝났다 — 골은 남아 있다: ${result.goalFile}`));
2398
2402
  } else {
2399
2403
  ctx.chatLines.push(ctx.error(` ⛔ 전제 검사에서 막혔다 — 골은 남아 있다: ${result.goalFile}`));
2400
2404
  }
@@ -2602,6 +2606,8 @@ export function buildDashboardSlashRegistry(nowDeps?: ContextNowDeps, decideLedg
2602
2606
  if (seSub === 'list' || seSub === 'ls') {
2603
2607
  const limit = args[1] ? Math.max(1, Math.min(50, Number(args[1]) || 10)) : 10;
2604
2608
  const rows = sessionListSessions({ limit });
2609
+ // Unique prefixes, not a fixed 8 — `/session load <shown prefix>` must resolve (TUI-RESUME-PICKER).
2610
+ const idPrefixes = sessionIdPrefixes(rows.map((m) => m.id));
2605
2611
  // Tier 1 daemon merge — when attached to a remote daemon w/ a
2606
2612
  // derivable HTTP base, fetch the daemon's session list too so
2607
2613
  // the user sees web/PWA/other-client sessions alongside their
@@ -2628,9 +2634,9 @@ export function buildDashboardSlashRegistry(nowDeps?: ContextNowDeps, decideLedg
2628
2634
  if (m.bindings?.telegram) binds.push(`tg:${m.bindings.telegram.chatId}`);
2629
2635
  if (m.bindings?.discord) binds.push(`dc:${m.bindings.discord.channelId}`);
2630
2636
  const bindStr = binds.length > 0 ? ctx.subtext(`[${binds.join(' ')}]`) : '';
2631
- const ts = m.updatedAt.slice(5, 16).replace('T', ' ');
2637
+ const ts = sessionListTime(m.updatedAt);
2632
2638
  const title = (m.title || '(no title)').slice(0, 48);
2633
- ctx.chatLines.push(` ${marker} ${ctx.text(m.id.slice(0, 8))} ${ctx.muted(ts)} ${ctx.muted(`${m.messageCount}t`.padStart(4))} ${bindStr.padEnd(10)} ${title}`);
2639
+ ctx.chatLines.push(` ${marker} ${ctx.text(idPrefixCell(idPrefixes, m.id))} ${ctx.muted(ts)} ${ctx.muted(`${m.messageCount}t`.padStart(4))} ${bindStr.padEnd(10)} ${title}`);
2634
2640
  }
2635
2641
  }
2636
2642
  if (daemonRows.length > 0) {
@@ -2734,13 +2740,14 @@ export function buildDashboardSlashRegistry(nowDeps?: ContextNowDeps, decideLedg
2734
2740
  }
2735
2741
  ctx.setAttachedSessionId(match.id);
2736
2742
  try { sessionSetActiveId(match.id); } catch { /* best-effort */ }
2743
+ noteRestoredContext(chatHistory);
2737
2744
  ctx.chatLines.push('');
2738
2745
  ctx.chatLines.push(ctx.success(` ✓ swapped to daemon session ${match.id}`));
2739
2746
  if (past && past.length > 0) {
2740
- ctx.chatLines.push(ctx.muted(` ${past.length} turn${past.length === 1 ? '' : 's'} restored. Preview of last 5:`));
2747
+ ctx.chatLines.push(ctx.muted(` ${past.length} turn${past.length === 1 ? '' : 's'} restored:`));
2741
2748
  const swapPreviewWidth = Math.max(40, termSize().cols - 8);
2742
2749
  const swapPreviewWrap = getUserConfig().chat.rendering.wrap;
2743
- const swapPreviewLines = renderReplayPreviewLines(past, {
2750
+ const swapPreviewLines = renderRestoredTranscriptLines(past, {
2744
2751
  maxWidth: swapPreviewWidth,
2745
2752
  wrapOpts: swapPreviewWrap,
2746
2753
  });
@@ -2792,11 +2799,13 @@ export function buildDashboardSlashRegistry(nowDeps?: ContextNowDeps, decideLedg
2792
2799
  // side /attach (no-arg) picks up the same session automatically.
2793
2800
  try { sessionSetActiveId(resolvedId); } catch { /* best-effort */ }
2794
2801
  ctx.chatLines.push('');
2795
- ctx.chatLines.push(ctx.success(` ✓ loaded session ${resolvedId.slice(0, 8)} (${loaded.meta.title || '(no title)'})`));
2796
- ctx.chatLines.push(ctx.muted(` ${loaded.history.length} turns restored. Preview of last 5:`));
2802
+ ctx.chatLines.push(ctx.success(` ✓ loaded session ${sessionIdPrefixes([resolvedId]).get(resolvedId) ?? resolvedId} (${loaded.meta.title || '(no title)'})`));
2803
+ ctx.chatLines.push(ctx.muted(` ${loaded.history.length} turns restored:`));
2804
+ const restoredTokens = noteRestoredContext(chatHistory);
2805
+ debug.log('chat.session.load', 'restored', { sessionId: resolvedId, turns: loaded.history.length, estimatedContextTokens: restoredTokens });
2797
2806
  const loadPreviewWidth = Math.max(40, termSize().cols - 8);
2798
2807
  const loadPreviewWrap = getUserConfig().chat.rendering.wrap;
2799
- const loadPreviewLines = renderReplayPreviewLines(loaded.history, {
2808
+ const loadPreviewLines = renderRestoredTranscriptLines(loaded.history, {
2800
2809
  maxWidth: loadPreviewWidth,
2801
2810
  wrapOpts: loadPreviewWrap,
2802
2811
  });