elanous 0.2.35 → 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 (827) 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/{T1mBQqmkwKDLGtyisDCOd → 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/{9952.5daf5f94063a2b3e.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/1746.3563617ea64023a3.js +115 -0
  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/{1dc5a567.9b092bfae3d7099b.js → 1ed5e8af.cf424815c7c0efad.js} +1 -1
  16. package/apps/pwa/out/_next/static/chunks/{4705-194e64e47ca0fbdb.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/{13.02a07436dec15f89.js → 210.90b2cbd64926cf34.js} +1 -1
  19. package/apps/pwa/out/_next/static/chunks/{9512.5a76207a730e0491.js → 2283.edd9627b7bdfb546.js} +2 -2
  20. package/apps/pwa/out/_next/static/chunks/{6866-79aa5b4e47cac6aa.js → 2318-450e75d07605b8fe.js} +1 -1
  21. package/apps/pwa/out/_next/static/chunks/{938.66ad1ef0e5abae1c.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/3199.6a1a9b0e6cd01dc6.js +1 -0
  33. package/apps/pwa/out/_next/static/chunks/3212.12179fd3eee8cef1.js +1 -0
  34. package/apps/pwa/out/_next/static/chunks/{9214.63a510d39178e997.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/{2018.a741297bce759490.js → 4313.76f232c304a15bde.js} +1 -1
  43. package/apps/pwa/out/_next/static/chunks/{1165.bad13fc9151a7288.js → 4324.c99ba3e83eb1b691.js} +1 -1
  44. package/apps/pwa/out/_next/static/chunks/{3f7c4ee5.3dde54f01a816613.js → 4337e36d.f42c3b391b3d8f20.js} +1 -1
  45. package/apps/pwa/out/_next/static/chunks/{7385.50a308a477bdfc21.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/{8557-e7898769499cd56f.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/{5483-dd5d7697f6bdb106.js → 4833-7934c592c5569f00.js} +1 -1
  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/{8444.4c26b379ca2b9596.js → 4931.95cc6dbd230774ca.js} +17 -17
  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/{3408.21d1570602f4b6c0.js → 5046.7fd5cbd859299448.js} +1 -1
  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/58edce7d.f1b0c72acf13b123.js +1 -0
  64. package/apps/pwa/out/_next/static/chunks/5925.3b1f8b135710249b.js +93 -0
  65. package/apps/pwa/out/_next/static/chunks/5952.294fc574a8625184.js +1 -0
  66. package/apps/pwa/out/_next/static/chunks/{b6705a4f-b9a9047de9eecfd0.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/6252.240578f10952e091.js +34 -0
  69. package/apps/pwa/out/_next/static/chunks/6416.5d50b8ec9986ca98.js +1 -0
  70. package/apps/pwa/out/_next/static/chunks/{5101.e32282718f99ed6f.js → 6680.6a693c28aae4cd19.js} +1 -1
  71. package/apps/pwa/out/_next/static/chunks/{4718-17d2af636796a330.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/{6236.e18cced2d5ba6afb.js → 6819.be5c9c4d67f22922.js} +16 -16
  75. package/apps/pwa/out/_next/static/chunks/6877-84d47b7e85d0c41e.js +1 -0
  76. package/apps/pwa/out/_next/static/chunks/{2833-0fe47af99ed13c29.js → 6971-fb5f9dc0a2cb5d2d.js} +1 -1
  77. package/apps/pwa/out/_next/static/chunks/{da5176c6.6773b6c5994e1d99.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/7424.c0fe2a595d4232b5.js +23 -0
  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/{7644.17e37ba6f1d4226e.js → 7867.e8725745ddd1d940.js} +4 -4
  93. package/apps/pwa/out/_next/static/chunks/7893-e444a1b0809cd1e4.js +1 -0
  94. package/apps/pwa/out/_next/static/chunks/7956-33748cabb3a05562.js +1 -0
  95. package/apps/pwa/out/_next/static/chunks/{0368f25d-ad84af92fefee68f.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/{359-2250789a2d3499e7.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/{b2f6ba4d.fb56fdbbf798df33.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/{1530.0e612369b6fd7ea0.js → 9151.a2c51e93f9156dae.js} +1 -1
  112. package/apps/pwa/out/_next/static/chunks/{4441-875b97f5821ed58a.js → 9175-7d383df15a82e2be.js} +1 -1
  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/958.53a8dcf4729e6997.js +64 -0
  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-3337c6a1328c2674.js +1 -0
  144. package/apps/pwa/out/_next/static/chunks/app/live-run/page-89acd5d68c0bc560.js +1 -0
  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-fe986fe79b107546.js +1 -0
  148. package/apps/pwa/out/_next/static/chunks/app/morning/{page-47c5d4db587266bd.js → page-1e5da297557d2354.js} +1 -1
  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-1f5a60f70cb4dd0c.js → page-88a1edbff62eaf1d.js} +1 -1
  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-bac7dee94e5eae4a.js → page-443364c9e4a23b31.js} +1 -1
  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-dc0a532f5b9196ec.js → page-ac2c1e6169cfce57.js} +1 -1
  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/{d06f9160.a3d9062f95de8ad7.js → d9815f84.4918f682a45a8502.js} +1 -1
  176. package/apps/pwa/out/_next/static/chunks/{cbe38a15.5a032598e39970c6.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/docs/goal-context/05-authoring-lessons.jsonl +47 -0
  279. package/docs/goal-context/README.md +3 -0
  280. package/graphs/default-loop.yaml +6 -1
  281. package/graphs/drafts/recipes.yaml +27 -7
  282. package/graphs/implement-loop.yaml +24 -0
  283. package/graphs/release/recipes.yaml +6 -0
  284. package/graphs/release/release-loop.yaml +17 -4
  285. package/graphs/wizard/recipes.yaml +44 -0
  286. package/graphs/wizard/wizard-loop.yaml +44 -0
  287. package/graphs/work/draft-close.yaml +54 -0
  288. package/graphs/work/green-close.yaml +37 -0
  289. package/graphs/work/recipes.yaml +46 -1
  290. package/graphs/work/research-report.yaml +2 -0
  291. package/graphs/work/run-research.yaml +35 -0
  292. package/package.json +1 -1
  293. package/scripts/__fixtures__/authoring-paths-10x3.json +32 -0
  294. package/scripts/boundary-proof-mapping-audit.ts +88 -0
  295. package/scripts/ci-typecheck-changed.ts +139 -5
  296. package/scripts/codex-fallback-live-probe.ts +17 -15
  297. package/scripts/coord-role-pack.ts +1 -1
  298. package/scripts/first10-gate.ts +416 -0
  299. package/scripts/fleet/node-setup.sh +32 -2
  300. package/scripts/fleet/run-light-worker.sh +9 -0
  301. package/scripts/fleet/wsl-node-setup.sh +432 -0
  302. package/scripts/gate-0226-failure-census.ts +507 -0
  303. package/scripts/goals/authoring-metrics.ts +258 -0
  304. package/scripts/graph-units/draft-close-node.ts +222 -0
  305. package/scripts/hook-order-sweep.ts +7 -4
  306. package/scripts/land-global-checks.ts +69 -1
  307. package/scripts/measure-nl-routing-corpus.ts +207 -2
  308. package/scripts/release-loop/docs-node.ts +344 -8
  309. package/scripts/release-loop/gate-closure.ts +48 -0
  310. package/scripts/release-loop/gate-diff.ts +2 -1
  311. package/scripts/release-loop/gate-node.ts +249 -53
  312. package/scripts/release-loop/known-issues-node.ts +6 -4
  313. package/scripts/release-loop/node-verdict.ts +2 -0
  314. package/scripts/release-loop/notes-repair.ts +216 -0
  315. package/scripts/release-loop/prepare-node.ts +61 -5
  316. package/scripts/release-loop/resume-cap.ts +14 -34
  317. package/scripts/release-loop/resume-release.ts +151 -15
  318. package/scripts/release-loop/resume-test-traffic.ts +10 -0
  319. package/scripts/release-loop/traffic-node.ts +59 -0
  320. package/scripts/release-loop/traffic-transition.ts +159 -0
  321. package/scripts/release-loop/version-node.ts +81 -12
  322. package/scripts/rhythm/daily.ts +137 -3
  323. package/scripts/train/green-leg.ts +176 -0
  324. package/scripts/tui-continue-real-evidence.ts +47 -0
  325. package/scripts/ux-sim.ts +53 -0
  326. package/skills/README.md +1 -0
  327. package/src/acp/client.ts +31 -5
  328. package/src/acp/core-turn-bridge.ts +54 -6
  329. package/src/acp/stderr-summary.ts +49 -0
  330. package/src/agent/delegate-hint.ts +16 -0
  331. package/src/agent/monad-agent-turn.ts +1 -0
  332. package/src/agent/runner.ts +82 -2
  333. package/src/agent/task-notification.ts +56 -10
  334. package/src/agent/terminal-surface.ts +217 -0
  335. package/src/agent/types.ts +4 -0
  336. package/src/agent-substrate/pr-reviewer.ts +64 -4
  337. package/src/agent-substrate/review-intent.ts +29 -2
  338. package/src/agent-substrate/review-observation.ts +3 -0
  339. package/src/agent-substrate/self-review-cli.ts +490 -26
  340. package/src/autopilot/lineage/sources.ts +1 -1
  341. package/src/autopilot/mission-codebase-gate.ts +141 -12
  342. package/src/autopilot/pr-manager.ts +89 -18
  343. package/src/boot/daemon-runtime.ts +35 -3
  344. package/src/boot/daemon-tools/pty-shell.ts +2 -1
  345. package/src/boot/daemon-tools/self-implement.ts +1 -0
  346. package/src/budget/run-usage-rollup.ts +12 -7
  347. package/src/budget/unified-usage.ts +20 -0
  348. package/src/budget/usage-outcomes.ts +8 -4
  349. package/src/capture/tui-self-report.ts +132 -1
  350. package/src/chat/goal-continue-verdict.ts +41 -0
  351. package/src/chat/index.ts +30 -4
  352. package/src/chat/internal-turn-origin.ts +1 -0
  353. package/src/chat/paste-fold.ts +86 -0
  354. package/src/chat/tool-render/block.ts +32 -0
  355. package/src/chat/tool-render/dispatch.ts +2 -20
  356. package/src/chat/tool-render/result-text.ts +98 -0
  357. package/src/chat/turn-typeahead.ts +70 -7
  358. package/src/cli/autopilot-cli.ts +24 -9
  359. package/src/cli/config-audit.ts +119 -0
  360. package/src/cli/decisions-cli.ts +7 -4
  361. package/src/cli/doctor-cli.ts +137 -6
  362. package/src/cli/guardian-cli.ts +10 -0
  363. package/src/cli/herdr-cli.ts +34 -0
  364. package/src/cli/light-entry-route.ts +6 -3
  365. package/src/cli/log-event-names.ts +2 -0
  366. package/src/cli/logs-cli.ts +357 -2
  367. package/src/cli/make-cli.ts +247 -11
  368. package/src/cli/memory-cli.ts +30 -1
  369. package/src/cli/msg-cli.ts +132 -14
  370. package/src/cli/pr-cli.ts +29 -16
  371. package/src/cli/pr-granularity.ts +5 -3
  372. package/src/cli/pr-land-base-read.ts +11 -2
  373. package/src/cli/pr-land-heavy-remote.ts +6 -3
  374. package/src/cli/pr-land-overlap-evidence.ts +23 -4
  375. package/src/cli/pr-land-recovery.ts +117 -1
  376. package/src/cli/pty-takeover-cli.ts +8 -7
  377. package/src/cli/release-checklist-read-cli.ts +109 -4
  378. package/src/cli/release-cli.ts +64 -15
  379. package/src/cli/release-single-flight.ts +1 -1
  380. package/src/cli/self-update.ts +23 -5
  381. package/src/cli/self-utterances-cli.ts +13 -16
  382. package/src/cli/tasks-card-show.ts +162 -0
  383. package/src/cli/tasks-cli.ts +868 -352
  384. package/src/cli/tasks-read-cli.ts +197 -0
  385. package/src/cli/usage-cli.ts +12 -10
  386. package/src/context-bus/claude-memory-import.ts +99 -0
  387. package/src/context-bus/long-term-memory.ts +125 -0
  388. package/src/core-turn/run-core-turn.ts +4 -2
  389. package/src/core-turn/run-goal-loop.ts +76 -16
  390. package/src/core-turn/types.ts +8 -1
  391. package/src/dashboard/chat/acp-chat.ts +9 -0
  392. package/src/dashboard/context/keys.ts +8 -31
  393. package/src/dashboard/index.ts +299 -62
  394. package/src/dashboard/input/agent-wake.ts +50 -1
  395. package/src/dashboard/input/chat-main-acp-dispatch.ts +21 -1
  396. package/src/dashboard/input/chat-main-plain-turn-runtime.ts +146 -3
  397. package/src/dashboard/input/chat-main-slash-command.ts +4 -2
  398. package/src/dashboard/input/goal-continue.ts +210 -0
  399. package/src/dashboard/input/goal-interim.ts +2 -0
  400. package/src/dashboard/input/internal-turn.ts +2 -8
  401. package/src/dashboard/input/seat-autowake.ts +9 -7
  402. package/src/dashboard/input/turn-autoheal.ts +52 -0
  403. package/src/dashboard/replay-preview.ts +25 -0
  404. package/src/dashboard/seat-boot-preamble.ts +132 -5
  405. package/src/dashboard/slash-runtime/chat-persona.ts +65 -8
  406. package/src/dashboard/slash-runtime/dashboard-handlers.ts +20 -10
  407. package/src/dashboard/slash-runtime/model-choices.ts +15 -0
  408. package/src/dashboard/stale-install-check.ts +3 -99
  409. package/src/dashboard/synchronized-frame-output.ts +74 -0
  410. package/src/debug/batch-queue.ts +119 -0
  411. package/src/debug/tui-log-tag.ts +67 -0
  412. package/src/display/agent-surface.ts +7 -0
  413. package/src/display/coordinator.ts +45 -12
  414. package/src/display/resize-listener.ts +41 -20
  415. package/src/display/synchronized-output-region.ts +60 -0
  416. package/src/domains/standalone-log-sink.ts +15 -2
  417. package/src/domains/surface-events.ts +80 -1
  418. package/src/esc-abort-gate.ts +69 -0
  419. package/src/exec-requests/planner.ts +37 -2
  420. package/src/execution-loop/launch-gate.ts +4 -3
  421. package/src/git-fs/cli-stderr.ts +45 -0
  422. package/src/git-fs/gh-cli.ts +6 -3
  423. package/src/git-fs/git-cli.ts +11 -5
  424. package/src/git-fs/worktree.ts +95 -1
  425. package/src/graph-runner/graph-cli.ts +44 -2
  426. package/src/graph-runner/graph-run-api.ts +3 -2
  427. package/src/graph-runner/runner.ts +37 -16
  428. package/src/graph-wizard/generate.ts +131 -4
  429. package/src/graph-wizard/steps.ts +15 -0
  430. package/src/grounding/proactive-ground.ts +86 -0
  431. package/src/harness/control-inbox.ts +49 -1
  432. package/src/harness/harness-cli-command.ts +230 -40
  433. package/src/harness/harness-incidents.ts +52 -1
  434. package/src/harness/pod-control-send.ts +33 -5
  435. package/src/harness/review-adapter.ts +26 -6
  436. package/src/harness/self-send-remote.ts +69 -0
  437. package/src/harness/self-send-routing-guard.ts +6 -0
  438. package/src/harness/self-send-target.ts +4 -3
  439. package/src/index.ts +443 -25
  440. package/src/input-core/context-key-runtime.ts +21 -0
  441. package/src/instance/test-write-guard-real-transport.fixture.ts +52 -0
  442. package/src/light-cli.ts +6 -1
  443. package/src/llm/route-decision.ts +13 -0
  444. package/src/llm-tool-name.ts +37 -0
  445. package/src/llm-tool-schema.ts +35 -0
  446. package/src/llm-wellformed.ts +70 -0
  447. package/src/llm.ts +158 -15
  448. package/src/loops/checker.ts +100 -0
  449. package/src/loops/consensus.ts +26 -2
  450. package/src/loops/loop-cli.ts +9 -4
  451. package/src/loops/msg-wake.ts +35 -39
  452. package/src/loops/orchestrator/anomaly-cluster.ts +243 -0
  453. package/src/loops/orchestrator/inbox.ts +59 -11
  454. package/src/loops/orchestrator/knowhow-pack.ts +364 -0
  455. package/src/loops/orchestrator/tick.ts +54 -5
  456. package/src/maturity/feature-maturity.ts +1 -1
  457. package/src/model-tier/llm-tier-map.ts +12 -17
  458. package/src/models/prompts.ts +17 -2
  459. package/src/msg/msg-post-office.ts +116 -0
  460. package/src/msg/msg-store.ts +17 -0
  461. package/src/mss/logging/log-store.ts +79 -22
  462. package/src/native-tool-catalog.ts +1 -1
  463. package/src/nexus/api/decisions-route.ts +38 -18
  464. package/src/nexus/api/graph-wizard-api.ts +46 -3
  465. package/src/nexus/api/grid.ts +24 -4
  466. package/src/nexus/api/http-server.ts +1 -1
  467. package/src/nexus/api/ops-api.ts +14 -6
  468. package/src/nexus/boot/register-mcp-clients.ts +263 -38
  469. package/src/nexus/onboarding/first-boot-wizard.ts +56 -8
  470. package/src/nexus/state/state.ts +7 -1
  471. package/src/oauth/codex-account-store.ts +34 -1
  472. package/src/onboarding/first-run.ts +37 -6
  473. package/src/onboarding/web-first.ts +43 -11
  474. package/src/ops/loops-map.ts +46 -0
  475. package/src/ops/overview-cache.ts +22 -4
  476. package/src/ops/overview-collect.ts +12 -6
  477. package/src/ops/overview.ts +44 -8
  478. package/src/persona/loader.ts +11 -0
  479. package/src/persona/types.ts +8 -0
  480. package/src/policy/llm-policy.ts +3 -1
  481. package/src/prompt-enhance/enhance.ts +4 -4
  482. package/src/prompt-library/session-guidance.ts +14 -0
  483. package/src/provider-summary.ts +8 -0
  484. package/src/pty-shell/availability.ts +7 -0
  485. package/src/pty-shell/herdr-agent-report.ts +155 -37
  486. package/src/pty-shell/herdr-prompt.ts +266 -0
  487. package/src/pty-shell/herdr-prune-stale.ts +17 -0
  488. package/src/pty-shell/herdr-sequence-lease.ts +60 -0
  489. package/src/pty-shell/pty-control-ipc.ts +327 -15
  490. package/src/pty-shell/pty-special-keys.ts +42 -2
  491. package/src/pty-shell/registry.ts +25 -15
  492. package/src/pty-shell/stale-install-check.ts +99 -0
  493. package/src/pty-shell/tui-run-state.ts +249 -3
  494. package/src/release-loop/auto-start.ts +20 -2
  495. package/src/release-loop/checklist.ts +126 -9
  496. package/src/release-loop/feature-store.ts +9 -9
  497. package/src/release-loop/landed-but-yellow.ts +93 -12
  498. package/src/release-loop/rehearsal.ts +36 -20
  499. package/src/repl/index.ts +27 -1
  500. package/src/seat-loop/knowhow-lint.ts +1 -1
  501. package/src/seat-loop/seat-report.ts +1 -0
  502. package/src/self-dev/ask-launch-flow.ts +86 -10
  503. package/src/self-dev/decompose-proposal.ts +183 -20
  504. package/src/self-dev/decompose.ts +61 -0
  505. package/src/self-dev/dev-cli.ts +37 -3
  506. package/src/self-dev/dev-pipeline.ts +37 -9
  507. package/src/self-dev/draft-sweep.ts +241 -16
  508. package/src/self-dev/draft-triage-rules.ts +50 -5
  509. package/src/self-dev/glm-credential-guard.ts +77 -0
  510. package/src/self-dev/graph-journey-nodes.ts +1 -0
  511. package/src/self-dev/graph-journey-route.ts +12 -2
  512. package/src/self-dev/orchestrate-cli.ts +68 -3
  513. package/src/self-dev/orchestrate.ts +116 -17
  514. package/src/self-dev/review-provider-fallback.ts +45 -7
  515. package/src/self-dev/run-supervisor.ts +55 -2
  516. package/src/self-dev/run-types.ts +1 -1
  517. package/src/self-dev/shard-plan.ts +48 -0
  518. package/src/self-dev/shard-run.ts +50 -3
  519. package/src/self-health/autoheal.ts +153 -0
  520. package/src/self-health/signatures.ts +6 -0
  521. package/src/self-implement/device-first.ts +116 -0
  522. package/src/self-implement/doctor-visit.ts +322 -1
  523. package/src/self-implement/evidence-command-budget.ts +80 -0
  524. package/src/self-implement/gate-artifacts.ts +6 -2
  525. package/src/self-implement/gate-baseline.ts +64 -1
  526. package/src/self-implement/gate-cli.ts +93 -9
  527. package/src/self-implement/gate-remote.ts +28 -4
  528. package/src/self-implement/gate-scope.ts +13 -1
  529. package/src/self-implement/goal-author-cli.ts +1 -0
  530. package/src/self-implement/goal-author-decompose.ts +265 -4
  531. package/src/self-implement/goal-author.ts +366 -26
  532. package/src/self-implement/goal-elaborate.ts +176 -22
  533. package/src/self-implement/goal-refine.ts +3 -0
  534. package/src/self-implement/goal-supervisor-fill.ts +75 -26
  535. package/src/self-implement/graph-variant.ts +40 -6
  536. package/src/self-implement/headless-elanous-driver.ts +19 -3
  537. package/src/self-implement/importer-test-index.ts +215 -2
  538. package/src/self-implement/knowhow-pack.ts +5 -5
  539. package/src/self-implement/off-diff-evidence.ts +58 -6
  540. package/src/self-implement/orchestrator.ts +536 -42
  541. package/src/self-implement/pod-warm-pool-profile.ts +1 -0
  542. package/src/self-implement/pwa-import-graph.ts +1 -1
  543. package/src/self-implement/review-round-brief.ts +300 -0
  544. package/src/self-implement/rework-policy.ts +44 -0
  545. package/src/self-implement/run-ledger.ts +278 -6
  546. package/src/self-implement/run-stop.ts +1 -1
  547. package/src/self-implement/run-ttl.ts +38 -24
  548. package/src/self-implement/running-runs.ts +17 -3
  549. package/src/self-implement/scope-adjacency.ts +3 -1
  550. package/src/self-implement/seams.ts +72 -10
  551. package/src/self-implement/stop-autoheal.ts +1 -0
  552. package/src/self-implement/test-seams.ts +13 -1
  553. package/src/self-implement/train-reach-grouping.ts +8 -2
  554. package/src/self-implement/wiring-check.ts +358 -0
  555. package/src/session/chat.ts +7 -1
  556. package/src/session/id-prefix.ts +60 -0
  557. package/src/session/index.ts +4 -0
  558. package/src/session-runtime/index.ts +9 -1
  559. package/src/shell-env-bootstrap.ts +11 -4
  560. package/src/skills/runner.ts +4 -2
  561. package/src/skills/tools/agent.ts +290 -48
  562. package/src/skills/tools/pty.ts +5 -0
  563. package/src/skills/tools/schedule-wakeup.ts +23 -4
  564. package/src/skills/tools/shell.ts +61 -6
  565. package/src/skills/tools/terminal-modal-inject.ts +1 -2
  566. package/src/skills/tools/terminal-modal.ts +10 -8
  567. package/src/skills/url-router.ts +41 -1
  568. package/src/smart-wizard/run.ts +66 -0
  569. package/src/status/bar.ts +34 -6
  570. package/src/status/metrics.ts +12 -1
  571. package/src/status/status-provider-info.ts +37 -6
  572. package/src/steward/rejudge-tick.ts +22 -7
  573. package/src/steward/resync-tick.ts +31 -4
  574. package/src/steward/ta-repair-event-collect.ts +17 -6
  575. package/src/task-agent/actions.ts +202 -5
  576. package/src/task-agent/boundary-proof-mapping.ts +12 -0
  577. package/src/task-agent/boundary-proof-producer.ts +147 -0
  578. package/src/task-agent/completion-evidence.ts +2 -1
  579. package/src/task-agent/green-close-recipe.ts +239 -0
  580. package/src/task-agent/green-sweep.ts +64 -10
  581. package/src/task-agent/land-queue.ts +21 -8
  582. package/src/task-agent/live-moves.ts +70 -9
  583. package/src/task-agent/map-host-adapter.ts +134 -0
  584. package/src/task-agent/map-reduce.ts +158 -0
  585. package/src/task-agent/map-run-ledger.ts +226 -0
  586. package/src/task-agent/mission.ts +30 -0
  587. package/src/task-agent/parent-host.ts +21 -11
  588. package/src/task-agent/rejudge-on-head.ts +87 -5
  589. package/src/task-agent/repair-cycle.ts +179 -32
  590. package/src/task-agent/repair-next-move.ts +42 -4
  591. package/src/task-agent/repair-outcomes.ts +29 -0
  592. package/src/task-agent/repair-worker.ts +14 -4
  593. package/src/task-agent/review-prior-fix.ts +12 -2
  594. package/src/task-agent/shadow.ts +229 -8
  595. package/src/task-agent/task-card-prefix.ts +2 -0
  596. package/src/task-agent/task-hand.ts +630 -30
  597. package/src/task-agent/task-parent-role-llm.ts +45 -0
  598. package/src/task-agent/tier-split.ts +80 -10
  599. package/src/task-agent/work-order.ts +53 -2
  600. package/src/task-orchestrator/dispatcher.ts +46 -1
  601. package/src/task-orchestrator/generator-prompt.ts +6 -0
  602. package/src/task-orchestrator/surfaces/pod-account-broker.ts +9 -0
  603. package/src/task-orchestrator/surfaces/pod-artifact-return.ts +16 -6
  604. package/src/task-orchestrator/surfaces/pod-child-reuse.ts +146 -0
  605. package/src/task-orchestrator/surfaces/pod-command-job.ts +86 -5
  606. package/src/task-orchestrator/surfaces/pod-failure-reason.ts +215 -3
  607. package/src/task-orchestrator/surfaces/pod-launch-history.ts +133 -0
  608. package/src/task-orchestrator/surfaces/pod-ledger-collect.ts +8 -6
  609. package/src/task-orchestrator/surfaces/pod-ledger-events.ts +97 -0
  610. package/src/task-orchestrator/surfaces/pod-manifest-test-normalize.ts +11 -0
  611. package/src/task-orchestrator/surfaces/pod-pool.ts +126 -8
  612. package/src/task-orchestrator/surfaces/pod-provenance.ts +8 -2
  613. package/src/task-orchestrator/surfaces/pod-repair-commit.ts +18 -3
  614. package/src/task-orchestrator/surfaces/pod-si-warm-entry.ts +16 -0
  615. package/src/task-orchestrator/surfaces/pod-si-warm-host.ts +224 -0
  616. package/src/task-orchestrator/surfaces/pod-si-warm-protocol.ts +201 -0
  617. package/src/task-orchestrator/surfaces/pod-si-warm-provider.ts +444 -0
  618. package/src/task-orchestrator/surfaces/pod-si-warm-runner.ts +387 -0
  619. package/src/task-orchestrator/surfaces/pod-si-warm-transport.ts +157 -0
  620. package/src/task-orchestrator/surfaces/pod-warm-worker-protocol.ts +4 -0
  621. package/src/task-orchestrator/surfaces/pod-warm-worker-provider.ts +491 -36
  622. package/src/task-orchestrator/surfaces/pod-warm-worker-runtime.ts +3 -0
  623. package/src/task-orchestrator/surfaces/self-implement-pod.ts +612 -54
  624. package/src/task-orchestrator/surfaces/self-implement.ts +46 -2
  625. package/src/testing/linux-env.ts +177 -0
  626. package/src/tool-runtime/index.ts +15 -2
  627. package/src/tool-runtime/mcp-proxy-bootstrap.ts +29 -0
  628. package/src/tty-foreground.ts +155 -0
  629. package/src/tui/chat/goal-interim.ts +177 -0
  630. package/src/tui/chat/log-view.ts +205 -18
  631. package/src/tui/chat/self-health-status.ts +232 -0
  632. package/src/tui/entry.ts +623 -80
  633. package/src/tui/input/at-picker.ts +55 -0
  634. package/src/tui/input/composer.ts +8 -1
  635. package/src/tui/slash/compact-command.ts +7 -0
  636. package/src/tui/slash/compact.ts +1 -7
  637. package/src/tui/slash/resume.ts +98 -0
  638. package/src/tui/slash/signals.ts +114 -0
  639. package/src/tui/slash/term-next.ts +71 -0
  640. package/src/tui-client/local-chat-turn.ts +49 -5
  641. package/src/tui-client/next-dashboard-runtime.ts +8 -0
  642. package/src/tui-client/next-loop-command.ts +70 -0
  643. package/src/tui-client/next-wakeup.ts +191 -0
  644. package/src/tui.ts +37 -0
  645. package/src/ui/modal-adapter.ts +2 -2
  646. package/src/user-config.ts +19 -1
  647. package/src/ux-sim/boot-daemon-tools-pty-shell-device.ts +136 -0
  648. package/src/ux-sim/classic-tui-seat-scenarios.ts +670 -0
  649. package/src/ux-sim/cli-config-audit-device.ts +121 -0
  650. package/src/ux-sim/dashboard-event-loop-stall-monitor-device.ts +238 -0
  651. package/src/ux-sim/event-monkey.ts +3 -2
  652. package/src/ux-sim/fake-bin.ts +45 -0
  653. package/src/ux-sim/fake-gh.ts +174 -0
  654. package/src/ux-sim/fake-herdr.ts +238 -0
  655. package/src/ux-sim/fake-kubectl.ts +142 -0
  656. package/src/ux-sim/fake-llm.ts +116 -6
  657. package/src/ux-sim/fault-glm-no-credential.ts +116 -0
  658. package/src/ux-sim/fault-nextmove-dispatch.ts +102 -1
  659. package/src/ux-sim/fault-scope-escape-lift.ts +33 -6
  660. package/src/ux-sim/fault-tui-400-autoheal.ts +297 -0
  661. package/src/ux-sim/goal-device.ts +619 -0
  662. package/src/ux-sim/in-process-cli.ts +22 -5
  663. package/src/ux-sim/mock-authoring-first-run-child.ts +35 -0
  664. package/src/ux-sim/mock-authoring-first-run.ts +97 -0
  665. package/src/ux-sim/mock-seat-pty-frame-child.ts +29 -0
  666. package/src/ux-sim/mock-seat-pty-frame.ts +297 -0
  667. package/src/ux-sim/mock-seat-pty-sequence-child.ts +21 -0
  668. package/src/ux-sim/mock-seat-pty-sequence.ts +206 -0
  669. package/src/ux-sim/next-tui-seat-scenarios.ts +749 -0
  670. package/src/ux-sim/onboarding-first-run-device.ts +269 -0
  671. package/src/ux-sim/pty-key-modifiers-device.ts +85 -0
  672. package/src/ux-sim/resume-picker-device.ts +173 -0
  673. package/src/ux-sim/session-id-seed.ts +60 -0
  674. package/src/ux-sim/skills-tools-shell-device.ts +156 -0
  675. package/src/ux-sim/subagent-tools-device.ts +81 -0
  676. package/src/ux-sim/task-agent-parent-host-device.ts +264 -0
  677. package/src/ux-sim/task-agent-rejudge-on-head-device.ts +114 -0
  678. package/src/ux-sim/task-orchestrator-surfaces-self-implement-pod-device.ts +250 -0
  679. package/src/ux-sim/tty-foreground-steal-child.ts +21 -0
  680. package/src/version/packed-revision.json +1 -1
  681. package/apps/pwa/out/_next/static/chunks/1540.af38731fa7c4a3e0.js +0 -41
  682. package/apps/pwa/out/_next/static/chunks/1674.2a65fd5668e1cc5f.js +0 -1
  683. package/apps/pwa/out/_next/static/chunks/1850.f2b470ba5a471da0.js +0 -24
  684. package/apps/pwa/out/_next/static/chunks/193.62da94cd0b88323b.js +0 -74
  685. package/apps/pwa/out/_next/static/chunks/1975.260f6d249fac5f7c.js +0 -1
  686. package/apps/pwa/out/_next/static/chunks/1982-67cd8dfe8682325f.js +0 -1
  687. package/apps/pwa/out/_next/static/chunks/1993-c0007b7ad0c0ef41.js +0 -1
  688. package/apps/pwa/out/_next/static/chunks/1999-bb415351c8a2846c.js +0 -1
  689. package/apps/pwa/out/_next/static/chunks/1c735de4.f993a30bbd3c57c4.js +0 -1
  690. package/apps/pwa/out/_next/static/chunks/2085.8f950b4bda1cbbc7.js +0 -1
  691. package/apps/pwa/out/_next/static/chunks/2159-6179a961376956b9.js +0 -1
  692. package/apps/pwa/out/_next/static/chunks/216.b5c2a421aa1d28a5.js +0 -1
  693. package/apps/pwa/out/_next/static/chunks/2251.49fbe369f74c372c.js +0 -148
  694. package/apps/pwa/out/_next/static/chunks/2286-2939577360d3dcc0.js +0 -1
  695. package/apps/pwa/out/_next/static/chunks/2625.5d870aa999f33db1.js +0 -34
  696. package/apps/pwa/out/_next/static/chunks/2668.34d21539e62bf111.js +0 -77
  697. package/apps/pwa/out/_next/static/chunks/2930.d0edb4f108787ef7.js +0 -1
  698. package/apps/pwa/out/_next/static/chunks/2973.77318e7d85f59477.js +0 -62
  699. package/apps/pwa/out/_next/static/chunks/3103.0df8da390948bb84.js +0 -1
  700. package/apps/pwa/out/_next/static/chunks/3123.2bee9ba15d320bd2.js +0 -90
  701. package/apps/pwa/out/_next/static/chunks/3162-6cf652bf7124d8cf.js +0 -1
  702. package/apps/pwa/out/_next/static/chunks/3577-7340009f7007a795.js +0 -1
  703. package/apps/pwa/out/_next/static/chunks/3589.5444a06bcf6e775c.js +0 -1
  704. package/apps/pwa/out/_next/static/chunks/3618.f514792d6c59d7fd.js +0 -36
  705. package/apps/pwa/out/_next/static/chunks/3669.343f9119aa276001.js +0 -1
  706. package/apps/pwa/out/_next/static/chunks/3677-4215f826f6aa68e5.js +0 -1
  707. package/apps/pwa/out/_next/static/chunks/3736.c2efad489604cc3b.js +0 -79
  708. package/apps/pwa/out/_next/static/chunks/3817.f9aeab2bb6675d73.js +0 -1
  709. package/apps/pwa/out/_next/static/chunks/4182-0b9b1251c29cc0cf.js +0 -1
  710. package/apps/pwa/out/_next/static/chunks/4346.8601952e73bf5803.js +0 -1
  711. package/apps/pwa/out/_next/static/chunks/4582.bd68683c076649e3.js +0 -286
  712. package/apps/pwa/out/_next/static/chunks/4605-6e623f55aec77422.js +0 -1
  713. package/apps/pwa/out/_next/static/chunks/4607.5cc27468628eb4bf.js +0 -1
  714. package/apps/pwa/out/_next/static/chunks/4627.f07508b3936fd6c0.js +0 -24
  715. package/apps/pwa/out/_next/static/chunks/4747-c22262c093e46807.js +0 -1
  716. package/apps/pwa/out/_next/static/chunks/4775-178215aed0daba61.js +0 -1
  717. package/apps/pwa/out/_next/static/chunks/4815-6ffb8c3c991cc45d.js +0 -1
  718. package/apps/pwa/out/_next/static/chunks/4834-beca8b47ad29a898.js +0 -1
  719. package/apps/pwa/out/_next/static/chunks/5023-fb4802b6d2492b02.js +0 -1
  720. package/apps/pwa/out/_next/static/chunks/5154.a118f3957ed14e36.js +0 -1
  721. package/apps/pwa/out/_next/static/chunks/5210-a2e0015e3d4d5d9c.js +0 -1
  722. package/apps/pwa/out/_next/static/chunks/5356.84ac712cc15928bf.js +0 -1
  723. package/apps/pwa/out/_next/static/chunks/5401.22352141b6fd336e.js +0 -23
  724. package/apps/pwa/out/_next/static/chunks/5637.281e5dec4ea6ecf1.js +0 -94
  725. package/apps/pwa/out/_next/static/chunks/5662.02eaa029af05ad46.js +0 -1
  726. package/apps/pwa/out/_next/static/chunks/56d372f2.681ab4ec4c998fae.js +0 -1
  727. package/apps/pwa/out/_next/static/chunks/5760.22456f433c6f42c0.js +0 -1
  728. package/apps/pwa/out/_next/static/chunks/5852.db1f7449f4f74612.js +0 -287
  729. package/apps/pwa/out/_next/static/chunks/5891-0f11a7d7362a9072.js +0 -1
  730. package/apps/pwa/out/_next/static/chunks/5943.264d14a44ca32513.js +0 -1
  731. package/apps/pwa/out/_next/static/chunks/604-1b3c39df083c02aa.js +0 -1
  732. package/apps/pwa/out/_next/static/chunks/6121-5f97072330738caf.js +0 -1
  733. package/apps/pwa/out/_next/static/chunks/6193.07d8ca5af4b09086.js +0 -1
  734. package/apps/pwa/out/_next/static/chunks/6203-b3fea3a60d69ff14.js +0 -1
  735. package/apps/pwa/out/_next/static/chunks/6286.d638fb5953e2e757.js +0 -8
  736. package/apps/pwa/out/_next/static/chunks/630.fe5a46428d63b013.js +0 -1
  737. package/apps/pwa/out/_next/static/chunks/6301.ae0245f507e4395e.js +0 -1
  738. package/apps/pwa/out/_next/static/chunks/6673.fbbe5699f6ea5991.js +0 -27
  739. package/apps/pwa/out/_next/static/chunks/6777-f6d301efb5de828d.js +0 -1
  740. package/apps/pwa/out/_next/static/chunks/6786.423f24c88de034c7.js +0 -93
  741. package/apps/pwa/out/_next/static/chunks/6854-cef64a948c5e122d.js +0 -1
  742. package/apps/pwa/out/_next/static/chunks/6b89c8bd.24df687a820500b3.js +0 -1
  743. package/apps/pwa/out/_next/static/chunks/7037-fe27f001db30d323.js +0 -1
  744. package/apps/pwa/out/_next/static/chunks/7080.2d826860534fd88e.js +0 -1
  745. package/apps/pwa/out/_next/static/chunks/7118.8731be28c3ebb14b.js +0 -1
  746. package/apps/pwa/out/_next/static/chunks/7196.44241bc1df3e26fe.js +0 -149
  747. package/apps/pwa/out/_next/static/chunks/7235.c7c4e6cb5c693c2d.js +0 -104
  748. package/apps/pwa/out/_next/static/chunks/7706-58bfb1546637f217.js +0 -1
  749. package/apps/pwa/out/_next/static/chunks/7839.5b91455338c9fd3f.js +0 -1
  750. package/apps/pwa/out/_next/static/chunks/7857-31f13ee96f4011aa.js +0 -1
  751. package/apps/pwa/out/_next/static/chunks/81.f74cb60312fe4001.js +0 -1
  752. package/apps/pwa/out/_next/static/chunks/8219.baa715d1deee80e2.js +0 -1
  753. package/apps/pwa/out/_next/static/chunks/8256.e3ac8421a71f82f4.js +0 -1
  754. package/apps/pwa/out/_next/static/chunks/8310-444a6a895c402f12.js +0 -1
  755. package/apps/pwa/out/_next/static/chunks/8423.f7dda8aca4fcaae5.js +0 -1
  756. package/apps/pwa/out/_next/static/chunks/8437-8d5492094b166cfa.js +0 -1
  757. package/apps/pwa/out/_next/static/chunks/8496.75649af8652c74f4.js +0 -226
  758. package/apps/pwa/out/_next/static/chunks/8576.65bb654b524f3614.js +0 -1
  759. package/apps/pwa/out/_next/static/chunks/8609.558ce2f8f9aea2be.js +0 -64
  760. package/apps/pwa/out/_next/static/chunks/8614.caec96cfb91f4ae7.js +0 -1
  761. package/apps/pwa/out/_next/static/chunks/8637.47f5b35afcae5e6b.js +0 -1
  762. package/apps/pwa/out/_next/static/chunks/8714.ff0b7ce3ec3e3ae2.js +0 -1
  763. package/apps/pwa/out/_next/static/chunks/8732.367f44a916202353.js +0 -1
  764. package/apps/pwa/out/_next/static/chunks/9141-7fd1f73a5400bdc2.js +0 -1
  765. package/apps/pwa/out/_next/static/chunks/921.c4267d0d69a65404.js +0 -1
  766. package/apps/pwa/out/_next/static/chunks/9261.3962c3321b047691.js +0 -115
  767. package/apps/pwa/out/_next/static/chunks/936-26efd1a0efdd44d3.js +0 -1
  768. package/apps/pwa/out/_next/static/chunks/9627-4b9efe616b27e2e2.js +0 -1
  769. package/apps/pwa/out/_next/static/chunks/967-2aa39b2d04b4c690.js +0 -1
  770. package/apps/pwa/out/_next/static/chunks/9734.40eb1e558c29ccea.js +0 -1
  771. package/apps/pwa/out/_next/static/chunks/9908.3aa54f7a586a73dc.js +0 -1
  772. package/apps/pwa/out/_next/static/chunks/9954-ca8d29752bdbb45a.js +0 -1
  773. package/apps/pwa/out/_next/static/chunks/9974-507fa67cb94066dd.js +0 -1
  774. package/apps/pwa/out/_next/static/chunks/app/_not-found/page-ce9e00f7fb45506a.js +0 -1
  775. package/apps/pwa/out/_next/static/chunks/app/approvals/page-fa59d6d17daa3389.js +0 -1
  776. package/apps/pwa/out/_next/static/chunks/app/autopilot/page-53f68bbe7bd4b774.js +0 -1
  777. package/apps/pwa/out/_next/static/chunks/app/board/page-1c500fbb9f4a7a04.js +0 -1
  778. package/apps/pwa/out/_next/static/chunks/app/botlab/page-99d72673aa5c307c.js +0 -1
  779. package/apps/pwa/out/_next/static/chunks/app/bots/page-d2d5adc1e9484c88.js +0 -1
  780. package/apps/pwa/out/_next/static/chunks/app/ceo/page-c607c5aae637f1cc.js +0 -1
  781. package/apps/pwa/out/_next/static/chunks/app/chat/page-fa8c23596d555c0f.js +0 -1
  782. package/apps/pwa/out/_next/static/chunks/app/consult/page-bdab8c5e855c8416.js +0 -1
  783. package/apps/pwa/out/_next/static/chunks/app/control/page-406b47745b53f269.js +0 -1
  784. package/apps/pwa/out/_next/static/chunks/app/decisions/page-a4276386b7051f50.js +0 -1
  785. package/apps/pwa/out/_next/static/chunks/app/design-check/page-8a26bab9ad375f25.js +0 -1
  786. package/apps/pwa/out/_next/static/chunks/app/editor/page-775f48aa1dc7a2d5.js +0 -1
  787. package/apps/pwa/out/_next/static/chunks/app/exec/page-1c4dd5f959d0c558.js +0 -1
  788. package/apps/pwa/out/_next/static/chunks/app/field/page-c48938a8377c9f70.js +0 -1
  789. package/apps/pwa/out/_next/static/chunks/app/healthz/route-ce9e00f7fb45506a.js +0 -1
  790. package/apps/pwa/out/_next/static/chunks/app/inside/page-c6e7905859425aa9.js +0 -1
  791. package/apps/pwa/out/_next/static/chunks/app/intake/page-c280f4252452e830.js +0 -1
  792. package/apps/pwa/out/_next/static/chunks/app/layout-cf8c57498f20970a.js +0 -1
  793. package/apps/pwa/out/_next/static/chunks/app/live/page-ca3a17caf409fc83.js +0 -1
  794. package/apps/pwa/out/_next/static/chunks/app/live-run/page-26e6c18a1a750cf6.js +0 -1
  795. package/apps/pwa/out/_next/static/chunks/app/loops/page-3abc872cc6aeee39.js +0 -1
  796. package/apps/pwa/out/_next/static/chunks/app/market/page-f7481b7b2174fe3d.js +0 -1
  797. package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-1ae7ef8077680337.js +0 -1
  798. package/apps/pwa/out/_next/static/chunks/app/not-found-415f1e243c7ccb13.js +0 -1
  799. package/apps/pwa/out/_next/static/chunks/app/observatory/page-73f380f17b76f95c.js +0 -1
  800. package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-2991073ad66ee2d9.js +0 -1
  801. package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-fbad60d1e358fb2c.js +0 -1
  802. package/apps/pwa/out/_next/static/chunks/app/page-398047d6949e8ca5.js +0 -1
  803. package/apps/pwa/out/_next/static/chunks/app/reflection/page-2d33a2231540ca89.js +0 -1
  804. package/apps/pwa/out/_next/static/chunks/app/scheduler/page-5bf1e6bf70bcb96c.js +0 -1
  805. package/apps/pwa/out/_next/static/chunks/app/sessions/page-ba59c19376a0917d.js +0 -1
  806. package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-111f187139add30f.js +0 -1
  807. package/apps/pwa/out/_next/static/chunks/app/settings/page-acaae197d5be5779.js +0 -1
  808. package/apps/pwa/out/_next/static/chunks/app/setup/done/page-0df20b0f546a0d7d.js +0 -1
  809. package/apps/pwa/out/_next/static/chunks/app/setup/layout-ce9e00f7fb45506a.js +0 -1
  810. package/apps/pwa/out/_next/static/chunks/app/setup/page-27e1202d24b8fe35.js +0 -1
  811. package/apps/pwa/out/_next/static/chunks/app/share/page-bda78c50a78363e5.js +0 -1
  812. package/apps/pwa/out/_next/static/chunks/app/showroom/page-da592691293d9c9f.js +0 -1
  813. package/apps/pwa/out/_next/static/chunks/app/tasks/page-f832994317a2e9f0.js +0 -1
  814. package/apps/pwa/out/_next/static/chunks/app/today/page-cfccbbeae0473404.js +0 -1
  815. package/apps/pwa/out/_next/static/chunks/app/trace/page-527e2073af84c81b.js +0 -1
  816. package/apps/pwa/out/_next/static/chunks/app/vault/page-bac86e9112671357.js +0 -1
  817. package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-6d59dff410e9d76a.js +0 -1
  818. package/apps/pwa/out/_next/static/chunks/app/workflows/page-53a61f8be09f02d2.js +0 -1
  819. package/apps/pwa/out/_next/static/chunks/app/workspace/page-db8f559e763c17f9.js +0 -1
  820. package/apps/pwa/out/_next/static/chunks/app/worktrees/page-c02aa4cc66455093.js +0 -1
  821. package/apps/pwa/out/_next/static/chunks/framework-50e6acebc630849b.js +0 -1
  822. package/apps/pwa/out/_next/static/chunks/main-7a1ae342d5ed75e6.js +0 -1
  823. package/apps/pwa/out/_next/static/chunks/main-app-7ad7d505ba1f92b4.js +0 -1
  824. package/apps/pwa/out/_next/static/chunks/pages/_app-02edba75232cb235.js +0 -1
  825. package/apps/pwa/out/_next/static/chunks/pages/_error-97d6ebae3e8eee4a.js +0 -1
  826. package/apps/pwa/out/_next/static/chunks/webpack-e986adaa429163e8.js +0 -1
  827. /package/apps/pwa/out/_next/static/{T1mBQqmkwKDLGtyisDCOd → 8kITumG9GAZ1LwT9POrAR}/_ssgManifest.js +0 -0
@@ -0,0 +1,52 @@
1
+ // TUI-400-AUTOHEAL-FALLBACK — classic TUI(대시보드)의 자동 회복 배선 한 곳.
2
+ //
3
+ // plain-turn 런타임(`chat-main-plain-turn-runtime`)이 «언제·몇 번» 을 정하고, 여기는 «무엇으로» 만 준다:
4
+ // ① 새 백엔드 세션 = `DashboardSession.renew`(= `/session new` 의 ACP 갱신과 같은 호출)
5
+ // ① 직전 요약 = 이미 있는 압축 요약 `compactConversation` ⊕ 실패 시 `buildCompactTranscript` 꼬리
6
+ // ② 다음 공급자 = 턴 안 폴백과 같은 `llm.fallbackChain` 해석(`nextTurnFallbackProvider`)
7
+ // ⛔ 원격 데몬 세션은 ② 를 못 한다(공급자 결정이 데몬 쪽 · 서버 다리는 in-process 만 표지를 읽는다) — ① 만.
8
+ // ⭐ 대시보드와 결함 주입 장치(`ux-sim/fault-tui-400-autoheal`)가 «같은» 이 함수를 쓴다(재구현 0).
9
+
10
+ import { nextTurnFallbackProvider, resolveDefaultProvider, type LLMMessage } from '../../llm.js';
11
+ import type { DashboardTurnAutoheal } from './chat-main-plain-turn-runtime.js';
12
+ import { summarizeForAutoheal } from '../../self-health/autoheal.js';
13
+
14
+ export interface DashboardTurnAutohealDeps {
15
+ /** ACP 세션 — `renew(cwd)` 가 새 백엔드 세션 id 를 돌려준다. */
16
+ session: { renew(cwd: string): Promise<string> };
17
+ getCwd(): string;
18
+ /** 새 세션 id 를 대시보드 상태(acpSessionIdRef 등)에 반영. */
19
+ onRenewed?(sessionId: string): void;
20
+ /** 원격 데몬에 붙은 세션이면 true — ② 를 건너뛴다. */
21
+ remote: boolean;
22
+ /** 이 턴 모델(공급자 해석의 힌트) — 다리의 `resolveModel` 과 같은 값. */
23
+ activeModel(): string | undefined;
24
+ /** 시험 seam — 요약 시간 상한(ms). */
25
+ summaryTimeoutMs?: number;
26
+ }
27
+
28
+ export function createDashboardTurnAutoheal(deps: DashboardTurnAutohealDeps): DashboardTurnAutoheal {
29
+ return {
30
+ async renewBackendSession() {
31
+ const renewed = await deps.session.renew(deps.getCwd());
32
+ deps.onRenewed?.(renewed);
33
+ return renewed;
34
+ },
35
+ async summarizeHistory(prior) {
36
+ const { compactConversation, buildCompactTranscript } = await import('../../compact/index.js');
37
+ const history = prior as readonly LLMMessage[];
38
+ const { summary } = await summarizeForAutoheal(history, {
39
+ compact: (h) => compactConversation(h),
40
+ transcript: (h) => buildCompactTranscript(h),
41
+ ...(deps.summaryTimeoutMs !== undefined ? { timeoutMs: deps.summaryTimeoutMs } : {}),
42
+ });
43
+ return summary;
44
+ },
45
+ peekFallbackProvider() {
46
+ if (deps.remote) return null;
47
+ // 다리(core-turn-bridge)가 ② 에서 고를 것과 «같은» 해석 — 화면 한 줄의 이름과 실제 공급자가 어긋나지 않게.
48
+ const failed = resolveDefaultProvider(deps.activeModel()).name;
49
+ return nextTurnFallbackProvider([failed])?.name ?? null;
50
+ },
51
+ };
52
+ }
@@ -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
+ }
@@ -8,13 +8,13 @@
8
8
  // 턴 경로에서 컨텍스트 버스를 읽지 않는다).
9
9
  // - 대시보드의 ACP sessionId 는 TUI 수명 내내 같다 ⇒ `/session new`·`/session clear` 는
10
10
  // `startSeatBootConversation` 으로 카드 캐시를 비워 «새 대화 = 새 카드»를 만든다.
11
- // 관측: `dashboard.seat-boot` card-injected / card-skipped / conversation-start.
11
+ // 관측: `dashboard.seat-boot` card-injected / card-skipped / conversation-start / memory-recall(직전 인계 회상 한 줄).
12
12
 
13
- import { statSync } from 'node:fs';
13
+ import { closeSync, lstatSync, openSync, readdirSync, readSync, statSync } from 'node:fs';
14
14
  import { homedir } from 'node:os';
15
- import { join } from 'node:path';
15
+ import { basename, join } from 'node:path';
16
16
  import type { LLMMessage } from '../llm.js';
17
- import { debug } from '../debug/log.js';
17
+ import { debug, redactSecretText } from '../debug/log.js';
18
18
  import { collectSeatBootSections, renderSeatBootCard } from '../cli/seat-cli.js';
19
19
  import { defaultMsgStorePath } from '../msg/msg-store.js';
20
20
 
@@ -70,6 +70,120 @@ export function resetSeatBootCacheForTest(): void {
70
70
  cardCache.clear();
71
71
  }
72
72
 
73
+ /** 🧭 의도 승격 흐름(TUI-SELFIMPLEMENT-UNDERUSE-MEASURE · 대표 10-22 «확인도 결국 하다 보면 원인이 나오고 자연스럽게
74
+ * 구현이 나오게끔») — 10-22 prod 자리 세션 셋(UX GLM i57ey0 · UX Luna 7x2rxn · OPT Luna 7d3o49)은 노출된 SelfImplement·
75
+ * tasks hand 를 한 번도 안 불렀다. 끊긴 자리 = 처방까지 세우고 «다음 턴에 SelfImplement 로 발사»·«TA 발사 보류 · 재점검
76
+ * 예약» 으로 턴을 닫거나, 구현을 자리에서 Edit 로 직접 했다(격리 실물 전: SelfImplement 0 · Edit/Write 직접).
77
+ * 자리 카드에 실어 «자리 대화의 매 턴» 이 같은 흐름을 본다(사람 대화 TUI 에는 안 실린다). */
78
+ export const SEAT_INTENT_ESCALATION_FLOW =
79
+ '## 일의 흐름 — 확인에서 구현 골까지 한 흐름\n' +
80
+ '확인 → 원인 발견 → 조사 → 처방 확정 → 구현 골 넘기기 를 «이 턴 안에서» 잇는다. 확인·조사 지시도 원인을 찾으면 여기서 멈추지 않는다.\n' +
81
+ '- 원인과 처방이 섰으면 «다음 턴에»·«보고 뒤에»·«재점검 예약» 으로 미루지 말고 바로 구현 골로 넘긴다 — TUI 에서는 SelfImplement 도구(자리 규칙이 손 발사를 정했으면 `eln tasks hand`). 넘긴 뒤 보고는 한 줄.\n' +
82
+ '- 자리에서 기능·수정·여러 파일 구현을 Edit/Write 로 직접 하지 않는다 — 한 줄 설정·문서·오타만 예외.\n' +
83
+ '- 원인이 없으면 «원인 없음 · 근거(무엇을 봤나)» 한 줄로 끝낸다. 넘기지 못하면(권한·선행 조건) 막힌 이유와 필요한 판단 하나를 적는다.';
84
+
85
+ /** 🧠 직전 인계 회상 한 줄(TUI-SEAT-MEMORY-RECALL · COMPARE ④ · 대표 «메모리»).
86
+ * S: 10-22 prod 자리 세션 셋(UX GLM · UX Luna · OPT Luna)이 memory_recall·self_recall 을 한 번도 안 불렀다 — 기억 도구가
87
+ * «있는데 안 씀». codex 는 AGENTS.md 를, Claude Code 는 자동 메모리를 턴 머리에 스스로 싣는다.
88
+ * A: 소스를 «하나»로 잰다 — `seat-state/<자리>/HANDOFF-*.md` 중 mtime 이 가장 최근인 손 인계. 없으면 줄 없음
89
+ * (`HANDOFF.md` 는 자동 갱신 카드이고 카드 «HANDOFF» 절이 이미 제목을 싣는다 — 본문은 싣지 않는 그 계약을 지킨다).
90
+ * memory_recall·self_recall 은 자리 구분 없는 전역 원장(surface_events·knowledge.db)이라 «이 자리의 직전 인계»를
91
+ * 못 고르고, 우편 결정은 원장 질의가 필요하다 — 자리마다 이미 있는 HANDOFF 가 가장 작은 1급 소스다.
92
+ * 손 인계(HANDOFF-*.md)는 카드 어디에도 안 실렸다 — 그 제목·첫 줄이 여기 실린다.
93
+ * 줄 = 머리말 · 파일 · 갱신 시각 · 제목 · 첫 본문 줄 · 전문 경로 · 더 넓은 회상 도구. 상한 `SEAT_MEMORY_RECALL_MAX_CHARS`.
94
+ * 실패는 줄 없음(fail-soft) — 카드·턴을 막지 않는다. */
95
+ export const SEAT_MEMORY_RECALL_PREFIX = '🧠 직전 인계 회상:';
96
+ export const SEAT_MEMORY_RECALL_MAX_CHARS = 360;
97
+ const RECALL_READ_BYTES = 16_384;
98
+ /** 발췌(제목 — 첫 줄)에 남길 최소 글자 — 이보다 모자라면 전문 경로를 짧은 꼴로 바꾼다. */
99
+ const RECALL_MIN_EXCERPT = 60;
100
+ /** 줄에 싣는 파일명 최대 글자. */
101
+ const RECALL_MAX_NAME = 80;
102
+
103
+ interface SeatMemoryRecall { line: string | null; source: string | null }
104
+
105
+ /** 제어 문자·줄 구분자 — 하나라도 섞이면 «한 줄» 계약이 깨진다(파일명·경로·본문 모두). */
106
+ const LINE_BREAKING = /[\u0000-\u001f\u007f\u0085\u2028\u2029]/;
107
+ /** 셸 문자 — 카드 HANDOFF 절과 같은 안전 규칙. 본문 줄뿐 아니라 파일명·경로에도 적용한다(r4). */
108
+ const SHELL_CHARS = /[`$;|<>]/;
109
+ const oneLine = (text: string): string => redactSecretText(text.replace(new RegExp(LINE_BREAKING.source, 'g'), ' ').replace(/\s+/g, ' ').trim());
110
+
111
+ /** 앞 `RECALL_READ_BYTES` 만 읽는다 — 큰 인계 파일도 턴 시작을 막지 않는다. */
112
+ function readHead(path: string): string {
113
+ const fd = openSync(path, 'r');
114
+ try {
115
+ const buf = Buffer.alloc(RECALL_READ_BYTES);
116
+ const n = readSync(fd, buf, 0, RECALL_READ_BYTES, 0);
117
+ return buf.subarray(0, n).toString('utf8');
118
+ } finally { closeSync(fd); }
119
+ }
120
+
121
+ function newestHandoff(seatDir: string): { path: string; mtime: Date } | null {
122
+ if (LINE_BREAKING.test(seatDir)) return null;
123
+ const pick = (names: string[]): { path: string; mtime: Date } | null => {
124
+ let best: { path: string; mtime: Date } | null = null;
125
+ for (const name of names) {
126
+ const path = join(seatDir, name);
127
+ try {
128
+ const st = lstatSync(path);
129
+ if (!st.isFile()) continue; // 디렉터리·링크는 건너뛴다
130
+ if (!best || st.mtimeMs > best.mtime.getTime()) best = { path, mtime: st.mtime };
131
+ } catch { /* 사라진 후보 — 건너뛴다 */ }
132
+ }
133
+ return best;
134
+ };
135
+ // 제어 문자가 든 파일명은 후보에서 뺀다 — 이름·경로를 줄에 그대로 싣기 때문이다.
136
+ // 파일명은 안전 문자만(영숫자 · . _ -) — 셸 문자·제어 문자가 든 이름은 후보에서 뺀다(이름을 줄에 그대로 싣는다).
137
+ return pick(readdirSync(seatDir).filter((name) => /^HANDOFF-[A-Za-z0-9._-]+\.md$/.test(name)));
138
+ }
139
+
140
+ /** 자리의 직전 인계 회상 한 줄. 소스가 없거나 읽을 수 없으면 `line: null`.
141
+ * 카드 HANDOFF 절과 같은 안전 규칙 — 셸 문자(`` ` `` `$` `;` `|` `<` `>`)가 든 줄은 싣지 않는다 · 비밀은 가린다. */
142
+ function buildSeatMemoryRecall(seatDir: string): SeatMemoryRecall {
143
+ const found = newestHandoff(seatDir);
144
+ if (!found) return { line: null, source: null };
145
+ const raw = readHead(found.path).split(/\r\n|[\n\r\u0085\u2028\u2029]/)
146
+ .map((line) => line.trim()).filter((line) => line && !/[`$;|<>]/.test(line));
147
+ const title = raw.find((line) => /^#{1,6}\s/.test(line))?.replace(/^#{1,6}\s*/, '') ?? '';
148
+ const first = raw.find((line) => !/^#{1,6}\s/.test(line))?.replace(/^[-*]\s*/, '') ?? '';
149
+ const excerpt = oneLine([title, first].filter(Boolean).join(' — '));
150
+ if (!excerpt) return { line: null, source: found.path };
151
+ const fullName = found.path.slice(seatDir.length + 1);
152
+ // 파일명은 머리에 한 번만, 길면 앞 RECALL_MAX_NAME 자로 자른다 — 이름 길이가 발췌를 밀어내지 않는다.
153
+ const name = fullName.length > RECALL_MAX_NAME ? `${fullName.slice(0, RECALL_MAX_NAME - 1)}…` : fullName;
154
+ const head = `${SEAT_MEMORY_RECALL_PREFIX} ${name}(갱신 ${found.mtime.toISOString()}) `;
155
+ // 경로가 길어 발췌 자리가 모자라면 전문 경로 대신 «자리 폴더(seat-state/<자리>/)»만 가리킨다 — 줄을 버리지 않는다.
156
+ const tools = ' · 더 넓게는 self_recall·memory_recall';
157
+ // 경로·자리 폴더 이름에 셸 문자가 있으면 싣지 않는다(본문 줄과 같은 규칙) · 비밀은 가린다.
158
+ const pathSafe = !SHELL_CHARS.test(found.path);
159
+ const seatName = basename(seatDir);
160
+ const seatSafe = !SHELL_CHARS.test(seatName);
161
+ const fullTail = pathSafe ? ` · 전문 ${redactSecretText(found.path)}${tools}` : '';
162
+ const shortTail = seatSafe
163
+ ? ` · 전문은 seat-state/${redactSecretText(seatName).slice(0, 64)}/ 의 같은 파일${tools}`
164
+ : ` · 전문은 이 자리 seat-state 폴더의 같은 파일${tools}`;
165
+ const tail = fullTail && SEAT_MEMORY_RECALL_MAX_CHARS - head.length - fullTail.length >= RECALL_MIN_EXCERPT ? fullTail : shortTail;
166
+ // 머리(≤ ~130)·짧은 꼬리(≤ ~120)의 상한 덕에 발췌 자리는 늘 남는다 — 아래는 상수가 바뀔 때의 안전망.
167
+ const room = SEAT_MEMORY_RECALL_MAX_CHARS - head.length - tail.length;
168
+ if (room < 8) return { line: null, source: found.path };
169
+ const body = excerpt.length > room ? `${excerpt.slice(0, room - 1)}…` : excerpt;
170
+ return { line: `${head}${body}${tail}`, source: found.path };
171
+ }
172
+
173
+ function seatMemoryRecallLine(seatDir: string): string | null {
174
+ let recall: SeatMemoryRecall = { line: null, source: null };
175
+ let failed = false;
176
+ try { recall = buildSeatMemoryRecall(seatDir); }
177
+ catch { failed = true; }
178
+ debug.log('dashboard.seat-boot', 'memory-recall', {
179
+ source: recall.source,
180
+ chars: recall.line?.length ?? 0,
181
+ hit: recall.line !== null,
182
+ ...(failed ? { reason: 'error' } : {}),
183
+ });
184
+ return recall.line;
185
+ }
186
+
73
187
  function buildCardMessages(cwd: string, deps: SeatBootDeps): { messages: LLMMessage[]; observed: Record<string, unknown> } {
74
188
  const detection = detectSeat(cwd, deps.env ?? process.env);
75
189
  if (!detection) return { messages: [], observed: { reason: 'no-seat' } };
@@ -81,10 +195,14 @@ function buildCardMessages(cwd: string, deps: SeatBootDeps): { messages: LLMMess
81
195
  const { sections, unread } = collectSeatBootSections(detection.seat, { home, msgPath: deps.msgPath ?? defaultMsgStorePath() });
82
196
  const card = renderSeatBootCard(detection.seat, sections, null);
83
197
  const at = (deps.now?.() ?? new Date()).toISOString();
198
+ const recall = seatMemoryRecallLine(seatDir);
84
199
  const content =
85
200
  `## 자리 부트 카드 — 너는 이 작업 디렉터리의 ${detection.seat} 자리에서 일한다\n` +
86
201
  `(판정: ${detection.source === 'cwd' ? `cwd 의 /seats/${detection.seat}` : 'COORD_ID'} · 세션 시작 스냅샷 ${at} · 이후 바뀐 값은 다시 조회하라)\n` +
87
- `사람이 다른 일을 먼저 시키지 않았다면, 첫 답에서 자리 이름·'자리 역할' 절의 역할·안 읽은 우편 수를 각각 명시하고 처리할 일을 제안하라. 역할이 미관측이면 추측하지 말고 미관측이라고 말하라.\n\n` +
202
+ `사람이 다른 일을 먼저 시키지 않았다면, 첫 답에서 자리 이름·'자리 역할' 절의 역할·안 읽은 우편 수를 각각 명시하고 처리할 일을 제안하라. 역할이 미관측이면 추측하지 말고 미관측이라고 말하라.\n` +
203
+ (recall ? `${recall}\n` : '') +
204
+ '\n' +
205
+ `${SEAT_INTENT_ESCALATION_FLOW}\n\n` +
88
206
  card;
89
207
  return {
90
208
  messages: [{ role: 'system', content }],
@@ -103,6 +221,15 @@ function conversationCard(cwd: string, deps: SeatBootDeps, sessionId?: string):
103
221
  sessionId: sessionId ?? null,
104
222
  ...entry.observed,
105
223
  });
224
+ // 🧭 이 대화에 «확인 → … → 구현 골 넘기기» 흐름을 실었다 — 단계·근거·다음 행동(넘김 도구). 대화마다 한 번.
225
+ if (entry.messages.length) {
226
+ debug.log('dashboard.seat-boot', 'intent.escalate', {
227
+ stage: 'guidance',
228
+ evidence: { seat: entry.observed.seat, source: entry.observed.source },
229
+ next: ['SelfImplement', 'eln tasks hand'],
230
+ sessionId: sessionId ?? null,
231
+ });
232
+ }
106
233
  } catch (err) {
107
234
  // 부트 카드가 턴을 막지 않는다 — 실패는 관측만.
108
235
  debug.log('dashboard.seat-boot', 'card-skipped', { cwd, reason: 'error', error: err instanceof Error ? err.message : String(err) });
@@ -2,16 +2,24 @@ import { awaitGlobalPersonaLoad, getGlobalPersonaRegistry } from '../../persona/
2
2
  import { resolvePersonaAddress } from '../../intake-plane/persona-answer.js';
3
3
  import { loadSession, updateSessionMeta } from '../../session/index.js';
4
4
  import { assemblePersonaPrompt } from '../../persona/prompt-assembler.js';
5
+ import type { PromptSource } from '../../persona/prompt-assembler.js';
5
6
  import type { LLMMessage } from '../../llm.js';
6
7
 
7
8
  /** Unattached conversations use a dashboard-local id; attached sessions use persisted metadata. */
8
9
  export class TuiChatPersonaSelection {
9
10
  private readonly selected = new Map<string, string>();
11
+ /** 적용 시점 캡처 스냅샷 — registry와 별개 저장소, 조회는 이 값을 반환한다. */
12
+ private readonly applied = new Map<string, TuiChatPersonaAppliedSource>();
10
13
 
11
14
  get(sessionId: string): string | undefined {
12
15
  return loadSession(sessionId)?.meta.chatPersonaId ?? this.selected.get(sessionId);
13
16
  }
14
17
 
18
+ /** Application-time source snapshot; survives later registry replacement. */
19
+ appliedSource(sessionId: string): TuiChatPersonaAppliedSource | undefined {
20
+ return this.applied.get(sessionId);
21
+ }
22
+
15
23
  set(sessionId: string, personaId: string | undefined): void {
16
24
  const meta = updateSessionMeta(sessionId, (m) => {
17
25
  if (personaId) m.chatPersonaId = personaId;
@@ -23,6 +31,22 @@ export class TuiChatPersonaSelection {
23
31
  } else {
24
32
  this.selected.delete(sessionId);
25
33
  }
34
+ if (!personaId) {
35
+ this.applied.delete(sessionId);
36
+ return;
37
+ }
38
+ const persona = getGlobalPersonaRegistry().get(personaId);
39
+ if (!persona) {
40
+ this.applied.delete(sessionId);
41
+ return;
42
+ }
43
+ const { systemPrompt, sources } = assemblePersonaPrompt(persona, '');
44
+ this.applied.set(sessionId, {
45
+ personaId: persona.personaId,
46
+ displayName: persona.displayName,
47
+ sources,
48
+ systemPrompt,
49
+ });
26
50
  }
27
51
  }
28
52
 
@@ -41,8 +65,10 @@ export async function handleTuiChatPersona(
41
65
  if (!args.length) {
42
66
  const selected = selection.get(sessionId);
43
67
  const personas = registry.list().sort((a, b) => a.displayName.localeCompare(b.displayName));
44
- const current = personas.find(p => p.personaId === selected);
45
- return `이 대화의 페르소나: ${current ? `${current.displayName} (${current.personaId})` : '없음'}\n고를 수 있는 페르소나: ${personas.map(p => `${p.displayName} (${p.personaId})${p.personaId === selected ? ' (지금)' : ''}`).join(' · ') || '없음'}\n고르기: /persona <이름> · 빼기: /persona -`;
68
+ // 조각 7/9 출처 보존 — 지금 적용된 출처는 적용 시점 스냅샷으로 보여준다.
69
+ // registry 가 이후 교체·오염돼도 이 대화에 적용된 출처는 그대로다.
70
+ const applied = tuiChatPersonaSources(sessionId, selection);
71
+ return `이 대화의 페르소나: ${applied ? `${applied.displayName} (${applied.personaId})` : '없음'}\n고를 수 있는 페르소나: ${personas.map(p => `${p.displayName} (${p.personaId})${p.personaId === selected ? ' (지금)' : ''}`).join(' · ') || '없음'}\n고르기: /persona <이름> · 빼기: /persona -`;
46
72
  }
47
73
  const name = args.join(' ');
48
74
  const persona = resolvePersonaAddress(name, registry);
@@ -54,13 +80,44 @@ export async function handleTuiChatPersona(
54
80
  }
55
81
  }
56
82
 
57
- export function tuiChatPersonaMessages(
83
+ /** Applied persona source captured at application time (조각 7/9 출처 보존).
84
+ * The snapshot lives in a store separate from the registry — the session
85
+ * meta `chatPersonaId` holds the applied id durably, and this
86
+ * application-time snapshot holds displayName, sources and systemPrompt —
87
+ * so replacing or contaminating the registry after the apply cannot
88
+ * rewrite what this conversation applied. */
89
+ export interface TuiChatPersonaAppliedSource {
90
+ /** Source identifier — string-identical to the loader personaId. */
91
+ readonly personaId: string;
92
+ /** Display name as loaded when the persona was applied. */
93
+ readonly displayName: string;
94
+ /** Source breakdown from prompt assembly, captured at apply time. */
95
+ readonly sources: readonly PromptSource[];
96
+ /** System prompt assembled when the persona was applied. */
97
+ readonly systemPrompt: string;
98
+ }
99
+
100
+ /** Resolve the applied persona source (조각 7/9 출처 보존). Serves the
101
+ * application-time snapshot captured in the selection — per-call registry
102
+ * re-derivation is not preservation. Falls back to the persisted session
103
+ * meta `chatPersonaId` plus a registry lookup only when no snapshot exists
104
+ * yet, e.g. a fresh process restoring a persisted session. */
105
+ export function tuiChatPersonaSources(
58
106
  sessionId: string, selection: TuiChatPersonaSelection,
59
- ): LLMMessage[] {
107
+ ): TuiChatPersonaAppliedSource | undefined {
108
+ const captured = selection.appliedSource(sessionId);
109
+ if (captured) return captured;
60
110
  const id = selection.get(sessionId);
61
- if (!id) return [];
111
+ if (!id) return undefined;
62
112
  const persona = getGlobalPersonaRegistry().get(id);
63
- if (!persona) return [];
64
- const prompt = assemblePersonaPrompt(persona, '').systemPrompt;
65
- return prompt ? [{ role: 'system', content: prompt }] : [];
113
+ if (!persona) return undefined;
114
+ const { systemPrompt, sources } = assemblePersonaPrompt(persona, '');
115
+ return { personaId: id, displayName: persona.displayName, sources, systemPrompt };
116
+ }
117
+
118
+ export function tuiChatPersonaMessages(
119
+ sessionId: string, selection: TuiChatPersonaSelection,
120
+ ): LLMMessage[] {
121
+ const applied = tuiChatPersonaSources(sessionId, selection);
122
+ return applied?.systemPrompt ? [{ role: 'system', content: applied.systemPrompt }] : [];
66
123
  }
@@ -344,7 +344,8 @@ import { termSize, stripAnsi } from '../../tui.js';
344
344
  import { SLASH_COMMANDS } from '../../chat/index.js';
345
345
  import { buildEssentialHelpLines } from './help-from-registry.js';
346
346
  import { registerDashboardLogSlash } from './dashboard-log-slash.js';
347
- import { HUMAN_MODEL_WORDS, MODEL_CODE_NAMES, humanWordForModel, modelChangeLine, modelOverviewLines, modelScopeLine, modelSwitchScope, parseModelSlashArgs, resolveModelChoice } from './model-choices.js';
347
+ import { HUMAN_MODEL_WORDS, MODEL_CODE_NAMES, humanWordForModel, modelActualNote, modelChangeLine, modelOverviewLines, modelScopeLine, modelSwitchScope, parseModelSlashArgs, resolveModelChoice } from './model-choices.js';
348
+ import { statusModelActual } from '../../status/status-provider-info.js';
348
349
  import type { FoldMode } from '../../log-entry.js';
349
350
  import { debug } from '../../debug/log.js';
350
351
  import { observeSessionStart } from '../../session/session-start.js';
@@ -363,13 +364,15 @@ import {
363
364
  attachTelegramBinding as sessionAttachTelegram,
364
365
  listBoundSessions as sessionListBound,
365
366
  } from '../../session/index.js';
367
+ import { idPrefixCell, sessionIdPrefixes, sessionListTime } from '../../session/id-prefix.js';
366
368
  import { safeReadLock as telegramSafeReadLock, defaultLockPath as telegramDefaultLockPath } from '../../telegram-lock.js';
367
369
  import { userConfigPath as userConfigPathFn } from '../../user-config.js';
368
370
  import { dirname as pathDirname, relative, resolve as resolvePath } from 'node:path';
369
371
  import { existsSync, readFileSync, statSync, writeFileSync } from 'node:fs';
370
372
  import { installPlugin, listInstalledPlugins, type InstalledPlugin } from '../../plugins/install/plugin-install.js';
371
373
  import type { SurfaceUx } from '../../agent/surface-ux/types.js';
372
- import { renderReplayPreviewLines } from '../replay-preview.js';
374
+ import { renderRestoredTranscriptLines } from '../replay-preview.js';
375
+ import { noteRestoredContext } from '../../status/metrics.js';
373
376
  import {
374
377
  deriveDaemonHttpBase,
375
378
  fetchDaemonSessionList,
@@ -2394,6 +2397,8 @@ export function buildDashboardSlashRegistry(nowDeps?: ContextNowDeps, decideLedg
2394
2397
  }
2395
2398
  } else if (result.kind === 'stopped-before-authoring') {
2396
2399
  ctx.chatLines.push(ctx.error(' ⛔ 저작 «전» 예비 검사에서 막혔다 — 위 이름을 확인하라'));
2400
+ } else if (result.kind === 'stopped-by-timebox') {
2401
+ ctx.chatLines.push(ctx.error(` ⛔ AUTHOR-TIMEBOX 초과로 접지 없이 끝났다 — 골은 남아 있다: ${result.goalFile}`));
2397
2402
  } else {
2398
2403
  ctx.chatLines.push(ctx.error(` ⛔ 전제 검사에서 막혔다 — 골은 남아 있다: ${result.goalFile}`));
2399
2404
  }
@@ -2601,6 +2606,8 @@ export function buildDashboardSlashRegistry(nowDeps?: ContextNowDeps, decideLedg
2601
2606
  if (seSub === 'list' || seSub === 'ls') {
2602
2607
  const limit = args[1] ? Math.max(1, Math.min(50, Number(args[1]) || 10)) : 10;
2603
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));
2604
2611
  // Tier 1 daemon merge — when attached to a remote daemon w/ a
2605
2612
  // derivable HTTP base, fetch the daemon's session list too so
2606
2613
  // the user sees web/PWA/other-client sessions alongside their
@@ -2627,9 +2634,9 @@ export function buildDashboardSlashRegistry(nowDeps?: ContextNowDeps, decideLedg
2627
2634
  if (m.bindings?.telegram) binds.push(`tg:${m.bindings.telegram.chatId}`);
2628
2635
  if (m.bindings?.discord) binds.push(`dc:${m.bindings.discord.channelId}`);
2629
2636
  const bindStr = binds.length > 0 ? ctx.subtext(`[${binds.join(' ')}]`) : '';
2630
- const ts = m.updatedAt.slice(5, 16).replace('T', ' ');
2637
+ const ts = sessionListTime(m.updatedAt);
2631
2638
  const title = (m.title || '(no title)').slice(0, 48);
2632
- 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}`);
2633
2640
  }
2634
2641
  }
2635
2642
  if (daemonRows.length > 0) {
@@ -2733,13 +2740,14 @@ export function buildDashboardSlashRegistry(nowDeps?: ContextNowDeps, decideLedg
2733
2740
  }
2734
2741
  ctx.setAttachedSessionId(match.id);
2735
2742
  try { sessionSetActiveId(match.id); } catch { /* best-effort */ }
2743
+ noteRestoredContext(chatHistory);
2736
2744
  ctx.chatLines.push('');
2737
2745
  ctx.chatLines.push(ctx.success(` ✓ swapped to daemon session ${match.id}`));
2738
2746
  if (past && past.length > 0) {
2739
- 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:`));
2740
2748
  const swapPreviewWidth = Math.max(40, termSize().cols - 8);
2741
2749
  const swapPreviewWrap = getUserConfig().chat.rendering.wrap;
2742
- const swapPreviewLines = renderReplayPreviewLines(past, {
2750
+ const swapPreviewLines = renderRestoredTranscriptLines(past, {
2743
2751
  maxWidth: swapPreviewWidth,
2744
2752
  wrapOpts: swapPreviewWrap,
2745
2753
  });
@@ -2791,11 +2799,13 @@ export function buildDashboardSlashRegistry(nowDeps?: ContextNowDeps, decideLedg
2791
2799
  // side /attach (no-arg) picks up the same session automatically.
2792
2800
  try { sessionSetActiveId(resolvedId); } catch { /* best-effort */ }
2793
2801
  ctx.chatLines.push('');
2794
- ctx.chatLines.push(ctx.success(` ✓ loaded session ${resolvedId.slice(0, 8)} (${loaded.meta.title || '(no title)'})`));
2795
- 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 });
2796
2806
  const loadPreviewWidth = Math.max(40, termSize().cols - 8);
2797
2807
  const loadPreviewWrap = getUserConfig().chat.rendering.wrap;
2798
- const loadPreviewLines = renderReplayPreviewLines(loaded.history, {
2808
+ const loadPreviewLines = renderRestoredTranscriptLines(loaded.history, {
2799
2809
  maxWidth: loadPreviewWidth,
2800
2810
  wrapOpts: loadPreviewWrap,
2801
2811
  });
@@ -4800,7 +4810,7 @@ export function buildDashboardSlashRegistry(nowDeps?: ContextNowDeps, decideLedg
4800
4810
  const [, codes] = modelOverviewLines(curProvider, curModel, curReasoning);
4801
4811
  // A model outside the 빠름/보통/깊음 map (codename or custom) says so explicitly instead of dropping the tier slot.
4802
4812
  const tierName = humanWordForModel(curProvider, curModel, curReasoning) ?? '단계 밖';
4803
- ctx.chatLines.push(`지금: ${curModel?.trim() || '기본 모델'} (${tierName} · 생각 ${curReasoning}${pin ? ' · 이 세션 핀' : ''}) · 고르기: /model ${HUMAN_MODEL_WORDS.join(' | ')}`);
4813
+ ctx.chatLines.push(`지금: ${curModel?.trim() || '기본 모델'} (${tierName} · 생각 ${curReasoning}${pin ? ' · 이 세션 핀' : ''})${modelActualNote(curModel, statusModelActual('dashboard'))} · 고르기: /model ${HUMAN_MODEL_WORDS.join(' | ')}`);
4804
4814
  ctx.chatLines.push(ctx.muted(codes));
4805
4815
  ctx.setChatScrollOffset(-1);
4806
4816
  return;
@@ -8,6 +8,7 @@
8
8
  import type { LLMProviderName, ReasoningLevel } from '../../user-config.js';
9
9
  import { lookupLlmTierSpec } from '../../model-tier/index.js';
10
10
  import type { ModelTier } from '../../model-tier/types.js';
11
+ import type { ModelExecutionActual } from '../../status/bar.js';
11
12
 
12
13
  export interface ModelTarget {
13
14
  readonly model: string;
@@ -72,6 +73,20 @@ export function resolveModelChoice(rawArg: string, currentProvider: LLMProviderN
72
73
  return { kind: 'unknown', arg };
73
74
  }
74
75
 
76
+ /** `/model` «지금:» 에 덧붙는 «이번 턴 실제» (TUI-MODEL-BADGE-ACTUAL · 10-16 · #24·#66).
77
+ * 상태줄 배지와 «같은» 원천(`statusModelActual`)을 쓰므로 두 화면이 다른 말을 하지 않는다.
78
+ * 이번 턴 실행이 없거나 이미 보이는 모델과 같으면 '' — 꾸미지 않는다(기본 출력 보존). */
79
+ export function modelActualNote(
80
+ shownModel: string | null | undefined,
81
+ actual: ModelExecutionActual | null | undefined,
82
+ ): string {
83
+ const model = actual?.model?.trim();
84
+ if (!model) return '';
85
+ const from = actual?.fallbackFrom?.trim();
86
+ if (!from && model === shownModel?.trim()) return '';
87
+ return ` · 이번 턴 실제: ${from ? `${from} → ${model}` : model}`;
88
+ }
89
+
75
90
  /**
76
91
  * The human word for (`model`, `reasoning`) on `provider`: an exact tier match first; without a reasoning
77
92
  * level (or no exact match) only a model that names a single tier counts — an ambiguous model gets no word.
@@ -1,99 +1,3 @@
1
- import { realpathSync } from 'node:fs';
2
- import { homedir } from 'node:os';
3
- import { basename, dirname, join, resolve } from 'node:path';
4
-
5
- import { readInstallMetadataCommit } from '../version/code-revision.js';
6
-
7
- export type StaleInstallResult = {
8
- state: 'same' | 'changed' | 'unknown' | 'not-installed';
9
- bootCommit: string | undefined;
10
- installedCommit: string | undefined;
11
- };
12
-
13
- export const STALE_INSTALL_CHECK_INTERVAL_MS = 60_000;
14
-
15
- /**
16
- * Builds the command that relaunches the TUI on the same daemon session: `elanous --resume <id>` boots the dashboard,
17
- * loads that session (ACP session/load) and replays its turns (src/index.ts resumeSessionId · dashboard acp-boot).
18
- * The user-facing hint and its key binding land with the dashboard wiring slice (`r` is the render toggle today).
19
- * Intentional wiring boundary: the dashboard owns the key binding and executes this command;
20
- * this scoped helper only constructs it and does not spawn a child process.
21
- */
22
- export function buildStaleInstallRelaunchCommand(sessionId: string): string {
23
- return `elanous --resume ${JSON.stringify(sessionId)}`;
24
- }
25
-
26
- export function formatStaleInstallNotice(result: StaleInstallResult, notifiedCount: number): string {
27
- const message = `새 판이 깔렸습니다 (부팅 판 ${result.bootCommit!.slice(0, 7)} → 지금 ${result.installedCommit!.slice(0, 7)}) · TUI 를 다시 띄우면 새 판으로 돕니다`;
28
- return notifiedCount >= 2 ? `${message} · 이 TUI 가 뜬 뒤 ${notifiedCount}번째 새 판` : message;
29
- }
30
-
31
- /** Identify the immutable installed version containing this module, never the session cwd. */
32
- export function versionedDashboardInstallDir(
33
- codeRoot: string,
34
- installRoot = join(homedir(), '.local', 'share', 'elanous'),
35
- ): string | undefined {
36
- try {
37
- const packageRoot = realpathSync(codeRoot);
38
- if (basename(packageRoot) !== 'elanous' || basename(dirname(packageRoot)) !== 'node_modules') return undefined;
39
- const versionDir = dirname(dirname(packageRoot));
40
- let canonicalInstallRoot: string;
41
- try { canonicalInstallRoot = realpathSync(installRoot); }
42
- catch { canonicalInstallRoot = resolve(installRoot); }
43
- if (dirname(versionDir) !== join(canonicalInstallRoot, 'versions')) return undefined;
44
- const requestedVersionDir = dirname(dirname(resolve(codeRoot)));
45
- return dirname(requestedVersionDir) === resolve(installRoot, 'versions')
46
- && realpathSync(requestedVersionDir) === versionDir
47
- ? requestedVersionDir : versionDir;
48
- } catch {
49
- return undefined;
50
- }
51
- }
52
-
53
- export function createStaleInstallCheck(input: {
54
- bootCommit: string | undefined;
55
- readInstalledCommit: () => string | undefined;
56
- now: () => number;
57
- codeRoot?: string;
58
- installRoot?: string;
59
- }) {
60
- const installed = input.codeRoot === undefined
61
- || versionedDashboardInstallDir(input.codeRoot, input.installRoot) !== undefined;
62
- const notifiedCommits = new Set<string>();
63
- let lastReadAt = -Infinity;
64
- let lastResult: StaleInstallResult | undefined;
65
- const check = (): StaleInstallResult => {
66
- if (!installed) return { state: 'not-installed', bootCommit: input.bootCommit, installedCommit: undefined };
67
- const time = input.now();
68
- if (lastResult && time - lastReadAt < STALE_INSTALL_CHECK_INTERVAL_MS) return lastResult;
69
- lastReadAt = time;
70
- let installedCommit: string | undefined;
71
- try { installedCommit = input.readInstalledCommit(); } catch { /* unreadable metadata */ }
72
- const result: StaleInstallResult = {
73
- state: !input.bootCommit || !installedCommit
74
- ? 'unknown'
75
- : input.bootCommit === installedCommit ? 'same' : 'changed',
76
- bootCommit: input.bootCommit,
77
- installedCommit,
78
- };
79
- lastResult = result;
80
- return result;
81
- };
82
- return {
83
- check,
84
- shouldNotify(result: StaleInstallResult): boolean {
85
- if (result.state !== 'changed' || !result.installedCommit || notifiedCommits.has(result.installedCommit)) return false;
86
- notifiedCommits.add(result.installedCommit);
87
- return true;
88
- },
89
- };
90
- }
91
-
92
- /** Only the current pointer is polled; boot metadata is read once from the immutable version. */
93
- export function readDashboardBootCommit(versionDir: string): string | undefined {
94
- return readInstallMetadataCommit(join(versionDir, 'install.json'));
95
- }
96
-
97
- export function readCurrentInstalledCommit(installRoot = join(homedir(), '.local', 'share', 'elanous')): string | undefined {
98
- return readInstallMetadataCommit(join(installRoot, 'current', 'install.json'));
99
- }
1
+ // Dashboard compatibility entry. The implementation is kept in pty-shell so
2
+ // non-dashboard observers can read install state without loading dashboard code.
3
+ export * from '../pty-shell/stale-install-check.js';