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
@@ -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 {
@@ -328,6 +384,7 @@ import { composeDashboardKeyHandlers, dispatchDashboardKey } from './input/key-d
328
384
  import { runDashboardChatMainEntry } from './input/chat-main-entry-runtime.js';
329
385
  import { createMirrorDrawThrottle } from './mirror-draw-throttle.js';
330
386
  import { runDashboardChatMainPlainTurn } from './input/chat-main-plain-turn-runtime.js';
387
+ import { createDashboardTurnAutoheal } from './input/turn-autoheal.js';
331
388
  import {
332
389
  createDashboardChatMainTurnSubmit,
333
390
  runDashboardChatMainSubmitIntent,
@@ -451,7 +508,7 @@ import { FoldStack } from '../fold-stack.js';
451
508
  import { getSkillIndex, reloadSkillIndex, applySkillFilter, skillIndexProblems } from '../skills/index.js';
452
509
  import { skillRepairNotice } from '../skills/repair.js';
453
510
  import type { DetectResult } from '../skills/router.js';
454
- import { detectUrlRoute } from '../skills/url-router.js';
511
+ import { detectUrlRoute, extractUrls, workContextGuardReason } from '../skills/url-router.js';
455
512
  import {
456
513
  observeDevRequestRouteFailSoft,
457
514
  type DevRequestRoutingConfig,
@@ -541,6 +598,54 @@ export function settleEscAbortPendingLines(lines: string[], fromIndex: number):
541
598
  }
542
599
  }
543
600
 
601
+ export interface EscAbortPendingSoftStopDeps {
602
+ /** Live foreground harness space for this turn — null when unidentified or multiple runs. */
603
+ getActiveHarnessSpace: () => string | null;
604
+ /** Push a line into the chat transcript. */
605
+ pushChatLine: (line: string) => void;
606
+ /** Self-implement hint line; returns true when it consumed the event. */
607
+ showHarnessEscHint: (targets: readonly string[]) => boolean;
608
+ }
609
+
610
+ export type EscAbortPendingSoftStopOutcome = 'stopped' | 'failed' | 'hint' | 'waiting';
611
+
612
+ export interface EscAbortPendingSoftStopResult {
613
+ outcome: EscAbortPendingSoftStopOutcome;
614
+ /** Harness space that received the durable stop marker, when any. */
615
+ stoppedHarnessSpace: string | null;
616
+ }
617
+
618
+ /**
619
+ * ⭐ TUI-ESC-EXIT production seam — the ESC soft-stop callback that
620
+ * `attachChatStreamingKeys` wires into `createEscAbortGate`'s
621
+ * `onAbortPending`, extracted as a directly callable export so the incident
622
+ * test (test/esc-harness-stop.test.ts) exercises the same function the
623
+ * dashboard executes. Identified foreground harness space → enqueue the real
624
+ * durable soft-stop marker (`enqueueSoftStop`) and verify it
625
+ * (`readSoftStopRequestStatus`), pushing the Korean stopped/failure line;
626
+ * unidentified/multiple-run falls back to the self-implement hint, else the
627
+ * caller paints the waiting line (`waiting`).
628
+ */
629
+ export function runEscAbortPendingSoftStop(
630
+ targets: readonly string[],
631
+ deps: EscAbortPendingSoftStopDeps,
632
+ ): EscAbortPendingSoftStopResult {
633
+ const spaceId = deps.getActiveHarnessSpace();
634
+ if (spaceId) {
635
+ try {
636
+ enqueueSoftStop(spaceId);
637
+ if (readSoftStopRequestStatus(spaceId).status !== 'present') throw new Error('soft-stop marker not persisted');
638
+ deps.pushChatLine(' ⏹ 멈췄다 — 해당 하니스 런에 중단 요청을 보냈습니다.');
639
+ return { outcome: 'stopped', stoppedHarnessSpace: spaceId };
640
+ } catch {
641
+ deps.pushChatLine(' ⚠ 하니스 런 중단 요청을 보내지 못했습니다. /harness runs 에서 확인해 주세요.');
642
+ return { outcome: 'failed', stoppedHarnessSpace: null };
643
+ }
644
+ }
645
+ if (deps.showHarnessEscHint(targets)) return { outcome: 'hint', stoppedHarnessSpace: null };
646
+ return { outcome: 'waiting', stoppedHarnessSpace: null };
647
+ }
648
+
544
649
  export type DashboardToolDispatchSignalSource = 'parent-turn' | 'fallback';
545
650
 
546
651
  export interface DashboardToolDispatchSignalObservation {
@@ -646,7 +751,7 @@ import { getModelFamily, getModelTier } from '../models/prompts.js';
646
751
  import { buildPromptInjection, getPromptBankStore } from '../prompt-bank/index.js';
647
752
  import { getInputHistoryStore } from '../input-history.js';
648
753
  import { inspectActiveProvider } from '../provider-summary.js';
649
- import { createStatusProviderInfoReader } from '../status/status-provider-info.js';
754
+ import { createStatusProviderInfoReader, statusModelActual } from '../status/status-provider-info.js';
650
755
  import { activeCodexAccountView } from '../oauth/codex-account-store.js';
651
756
  import { buildDashboardStatusLines, readDashboardSeatsNow, type DashboardStatusLinesInput } from './dashboard-status-lines.js';
652
757
  import { buildFirstScreenBand, resolveTuiDaemonLink, type TuiDaemonLink } from './first-screen-band.js';
@@ -898,7 +1003,7 @@ import { runPtySnapshot, type PtyTakeoverCommandDeps } from '../cli/pty-takeover
898
1003
  import { requestRemotePtyControl } from '../pty-shell/pty-control-ipc.js';
899
1004
  import { getHarnessRunId } from '../harness/harness-space.js';
900
1005
  import { formatPtyCallLine, formatPtyResultLine } from '../pty-activity-log.js';
901
- import { getSessionMetrics } from '../status/metrics.js';
1006
+ import { getSessionMetrics, noteRestoredContext } from '../status/metrics.js';
902
1007
  import {
903
1008
  createContextRegistry, tokenizeInput, pruneUnreferenced,
904
1009
  addAttachmentEx as ctxAddEx,
@@ -975,7 +1080,7 @@ import {
975
1080
  deriveDaemonHttpBase,
976
1081
  fetchDaemonSessionHistory,
977
1082
  } from './acp-boot.js';
978
- import { renderReplayPreviewLines } from './replay-preview.js';
1083
+ import { renderRestoredTranscriptLines } from './replay-preview.js';
979
1084
  import {
980
1085
  buildDashboardTurnPreamble,
981
1086
  } from './turn-preamble.js';
@@ -1013,6 +1118,7 @@ import { spawnCodingAgent, CodingAgentBinaryMissing } from '../terminal/coding-a
1013
1118
  import type { TerminalSession } from '../terminal/session-registry.js';
1014
1119
  import { createSessionPickerModal } from '../session/picker-modal.js';
1015
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';
1016
1122
  // TUI 부활 S-b — 타임트래블 포크 엔진 (codex ForkSnapshot 동형 · 2026-07-09
1017
1123
  // 이식 후 호출처 0 이던 방치 자산 회수). 순수 히스토리 절단 로직만 소비;
1018
1124
  // 영속은 세션 스토어(forkSessionFromHistory)가 담당한다.
@@ -1039,7 +1145,9 @@ import { createQuitConfirmationState, gracefulQuit, type QuitConfirmationState }
1039
1145
  import { consumeTurnEndInterrupted, handoffTurnTypeaheadAtTurnEnd, releaseTurnTypeaheadPending, runTurnTypeaheadPushNow, steerLastTurnTypeaheadSubmission } from './input/turn-steer-bridge.js';
1040
1146
  import { abortTurnOnly } from '../turn-abort-scope.js';
1041
1147
  import { consumeInternalTurnYield, createInternalTurnGate, formatInternalTurnBanner, resolveInternalTurnSubmitIntent, type InternalTurnRequest } from './input/internal-turn.js';
1148
+ import { createClassicInterimFold } from './input/goal-interim.js';
1042
1149
  import { createSeatAutowake } from './input/seat-autowake.js';
1150
+ import { createGoalContinue } from './input/goal-continue.js';
1043
1151
  import { createDashboardWakeupScheduler, registerScheduleWakeupHostTool } from '../skills/tools/schedule-wakeup.js';
1044
1152
  import { createAttachmentRowMap } from '../log-pane/attachment-row-map.js';
1045
1153
  import { createAttachmentPopup, type AttachmentPopupAction } from '../log-pane/attachment-popup.js';
@@ -1067,7 +1175,7 @@ import {
1067
1175
  AGENT_ACTIVITY_SEGMENT_KEY,
1068
1176
  PULSE_HALF_PERIOD_MS,
1069
1177
  } from '../agent-activity-hud.js';
1070
- import { DASHBOARD_CLARIFICATION_REQUEST, consumeStreamingTopModalEscape, createEscAbortGate, createHarnessEscHint, routeStreamingEscapeKey } from '../esc-abort-gate.js';
1178
+ import { DASHBOARD_CLARIFICATION_REQUEST, consumeStreamingTopModalEscape, createEscAbortGate, createEscAbortPendingGate, createHarnessEscHint, routeStreamingEscapeKey } from '../esc-abort-gate.js';
1071
1179
  import { enqueueSoftStop, readSoftStopRequestStatus } from '../harness/control-inbox.js';
1072
1180
  import { setSelfImplementSoftStopSpaceObserver } from '../self-implement/self-implement-runtime.js';
1073
1181
  import { createViEditor, type ViEditorHandle } from '../vi-editor.js';
@@ -1161,14 +1269,33 @@ import { agentBatchScratchTitle, renderAgentBatchScratch } from '../display/agen
1161
1269
  import { type ExecutionSurfaceHandle } from '../display/index.js';
1162
1270
  import { AgentSurfaceStore, renderAgentDetail, renderAgentRoster, type AgentSurfaceState } from '../display/agent-surface.js';
1163
1271
  import { globalAgentFlash } from '../display/agent-flash.js';
1164
- import { globalTaskNotificationQueue } from '../agent/task-notification.js';
1165
- import { createDashboardAgentWakeNotify, installAgentWake, wrapAgentWakePort } from './input/agent-wake.js';
1272
+ import { globalTaskNotificationQueue, type TaskNotificationQueue, type PendingTaskNotification } from '../agent/task-notification.js';
1273
+ import { createDashboardAgentWakeNotify, installSeatedAgentWake, wrapAgentWakePort } from './input/agent-wake.js';
1166
1274
  import { renderDebugEventDetail, renderDebugEventRows, renderDebugStack, renderPromptInjectionDebug } from '../display/debug-surface.js';
1167
1275
  import { buildDebugCallStack } from '../debug/call-stack.js';
1168
1276
  import { buildAstGrepHostTool } from '../skills/tools/ast-grep.js';
1169
1277
  import { buildLspHostTool } from '../skills/tools/lsp/index.js';
1170
1278
  import { PluginHost } from '../plugins/core/host.js';
1171
1279
 
1280
+ /** Keep wake notifications immediate; display completed results only when a turn drains them. */
1281
+ export function subscribeDashboardAgentResults(
1282
+ queue: TaskNotificationQueue,
1283
+ listener: (notification: PendingTaskNotification) => void,
1284
+ pushHistoryLine: (line: string) => void,
1285
+ ): () => void {
1286
+ const offWake = queue.onEnqueue(listener);
1287
+ const offDrain = queue.onDrain((items) => {
1288
+ for (const notification of items) {
1289
+ if (notification.resultPath) {
1290
+ pushHistoryLine(` Agent result · full result: ${notification.resultPath} · summary: ${notification.output}`);
1291
+ } else if (notification.preservationError) {
1292
+ pushHistoryLine(` Agent result preservation failed: ${notification.preservationError} · ${notification.output}`);
1293
+ }
1294
+ }
1295
+ });
1296
+ return () => { offWake(); offDrain(); };
1297
+ }
1298
+
1172
1299
  /** Register the same L2 host tools used by the live TUI before each turn's catalog is assembled. */
1173
1300
  export function registerDashboardCoreHostTools(host: Pick<PluginHost, 'registerHostTool'>): void {
1174
1301
  const coreMod = require('../domains/core-tools.js') as typeof import('../domains/core-tools.js');
@@ -1403,6 +1530,10 @@ const isPluginBusy = (host: { active(): { plugin: { isBusy?: (s: any) => boolean
1403
1530
  // ── Main dashboard ──
1404
1531
 
1405
1532
  export interface ShowDashboardOptions {
1533
+ /** Internal startup timing signal for the completed synchronous setup: persona load,
1534
+ * input-core bootstrap, plugin discovery and the widget host. This is the pre-frame block
1535
+ * that `onFirstFrameRendered` used to hide behind one number. Elapsed ms since entry. */
1536
+ onSyncSetupComplete?: (elapsedMs: number) => void;
1406
1537
  /** Internal startup timing signal for the first successfully flushed dashboard frame. */
1407
1538
  onFirstFrameRendered?: () => void;
1408
1539
  /** Force debug sinks on at launch (file + mirror). Equivalent to
@@ -1877,7 +2008,34 @@ export function applyDashboardStreamingTypeaheadKey(
1877
2008
  return applyTurnTypeaheadKey(state, key, isImmediate);
1878
2009
  }
1879
2010
 
2011
+ /** TUI-BOOT-TIMING-HOLES — show-dashboard 동기 셋업 창(첫 프레임 직전) 계측기.
2012
+ * `finish()` 는 한 번만 보고하고, 보고가 던져도 부팅을 막지 않는다(fail-open). */
2013
+ export interface SyncSetupWindow {
2014
+ /** 셋업이 끝난 지점에서 호출 — 진입 이후 경과 ms 를 보고한다. */
2015
+ finish(): void;
2016
+ }
2017
+
2018
+ export function openSyncSetupWindow(
2019
+ report: ((elapsedMs: number) => void) | undefined,
2020
+ now: () => number = () => performance.now(),
2021
+ ): SyncSetupWindow {
2022
+ const startedAt = now();
2023
+ let finished = false;
2024
+ return {
2025
+ finish(): void {
2026
+ if (finished) return;
2027
+ finished = true;
2028
+ if (!report) return;
2029
+ try {
2030
+ report(now() - startedAt);
2031
+ } catch { /* timing signal must never break boot */ }
2032
+ },
2033
+ };
2034
+ }
2035
+
1880
2036
  export async function showDashboard(opts: ShowDashboardOptions = {}): Promise<DashboardAction> {
2037
+ // TUI-BOOT-TIMING-HOLES — 첫 프레임 직전 동기 셋업 구간을 여기서 연다(셋업 종료 지점에서 닫는다).
2038
+ const syncSetupWindow = openSyncSetupWindow(opts.onSyncSetupComplete);
1881
2039
  let firstDashboardFrameRendered = false;
1882
2040
  await awaitGlobalPersonaLoad().catch(() => {});
1883
2041
  const dashboardQuitConfirmationState = createQuitConfirmationState();
@@ -2651,16 +2809,18 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
2651
2809
  // Pickers share the composer bottom slot.
2652
2810
  const placement = resolveDecisionPickerPlacement({ height: 16 });
2653
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));
2654
2814
  const fmtRow = (m: (typeof rows)[number]): string => {
2655
2815
  const marker = m.id === attachedSessionId ? '▸ ' : ' ';
2656
- const ts = m.updatedAt.slice(5, 16).replace('T', ' ');
2816
+ const ts = sessionListTime(m.updatedAt);
2657
2817
  const binds: string[] = [];
2658
2818
  if (m.bindings?.cli) binds.push('cli');
2659
2819
  if (m.bindings?.telegram) binds.push('tg');
2660
2820
  if (m.bindings?.discord) binds.push('dc');
2661
2821
  const bindStr = binds.length > 0 ? `[${binds.join(',')}]` : '';
2662
2822
  const title = (m.title || '(no title)').slice(0, 42);
2663
- 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}`;
2664
2824
  };
2665
2825
  const handle = createSearchModal({
2666
2826
  id: `session-resume:${Date.now().toString(36)}`,
@@ -2687,7 +2847,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
2687
2847
  promptCtl.submit(`/session load ${id}`);
2688
2848
  } else {
2689
2849
  // 입력 루프 비활성 등으로 합성 submit 불가 — 수동 안내 폴백.
2690
- chatLines.push(C.muted(` /session load ${id.slice(0, 8)} 를 입력해 재개하세요`));
2850
+ chatLines.push(C.muted(` /session load ${idPrefixes.get(id) ?? id} 를 입력해 재개하세요`));
2691
2851
  chatScrollOffset = -1;
2692
2852
  draw();
2693
2853
  }
@@ -3357,7 +3517,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
3357
3517
  // ⭐ H2 내부 턴 문(TUI-H2-INTERNAL-TURN) — 자율 재개(H3·H4·H5)가 지나갈 «문 하나». 판정은 모듈,
3358
3518
  // 여기선 상태를 읽어 넘기기만 한다(⚠️ promptCtl·가시성 함수는 아래에서 선언 — 호출 시점엔 있다).
3359
3519
  const internalTurnGate = createInternalTurnGate({
3360
- isTurnRunning: () => streamingInFlight,
3520
+ isTurnRunning: () => streamingInFlight || dashboardAcpChat.isBusy() || internalTurnGate.isInternalTurnActive(),
3361
3521
  isInputForeground: () =>
3362
3522
  chatMainInputVisibilityState().inputOwnership?.owner === 'chat-main' && !topBlockingForegroundModal(),
3363
3523
  getBufferText: () => promptCtl.getBufferText?.(),
@@ -3373,7 +3533,21 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
3373
3533
  });
3374
3534
  // Set only by the failed-turn callback and consumed by that turn's streaming cleanup.
3375
3535
  let autowakeTurnFailureRaw: string | null = null;
3376
- const internalTurnYieldPort = wrapAgentWakePort(seatAutowake.wrapPort(internalTurnGate.port));
3536
+ // ⭐ TURN-END-BEFORE-GOAL 골 이어가기 — 답이 «…하겠습니다/해야 합니다» 로 끝났는데 결과물이 없으면 H2 문으로 한 턴 더.
3537
+ // 판정·상한은 모듈(goal-continue.ts), 여기선 배선만(입력칸 무접촉).
3538
+ const goalContinue = createGoalContinue({
3539
+ startTurnIfIdle: (text, opts) => internalTurnGate.startTurnIfIdle(text, opts),
3540
+ notify: (line) => { chatLines.push(C.muted(line)); draw(); },
3541
+ });
3542
+ const internalTurnYieldPort = wrapAgentWakePort(goalContinue.wrapPort(seatAutowake.wrapPort(internalTurnGate.port)));
3543
+ // ⭐ TUI-GOAL-INTERIM-QUIET — 이어가기 내부 턴이 열리면 «바로 앞» 중간 보고(못 했다·약속) 문단을 한 줄로 접는다.
3544
+ // 끼워 넣은 사람 에코가 있으면 줄 위치를 믿지 않고 접지 않는다(판정·관측은 goal-interim.ts).
3545
+ const goalInterimFold = createClassicInterimFold({ canFold: () => liveTypeaheadEchoes.length === 0 });
3546
+ /** 지금 턴의 스트림 런타임 — 턴 끝에 «마지막 답 블록» 시작을 읽는다(없으면 null → 접지 않는다). */
3547
+ let latestTurnStream: { getAssistantStart(): number } | null = null;
3548
+ const latestTurnReplyStart = (): number | null => {
3549
+ try { return latestTurnStream?.getAssistantStart() ?? null; } catch { return null; }
3550
+ };
3377
3551
  // ⭐ H5 자기 예약 깨움(TUI-H5-SCHEDULE-WAKEUP) — 프로세스 안 타이머가 그 시각에 H2 문으로 한 턴을 청한다.
3378
3552
  // 직전 회차 판정 = 그 예약이 연 내부 턴이 아직 도나. 도구 등록은 아래 host tool 자리(하니스 자식 제외).
3379
3553
  const wakeupScheduler = createDashboardWakeupScheduler(internalTurnGate, {
@@ -3741,7 +3915,8 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
3741
3915
  return mouseWiring.buildStatusLine({
3742
3916
  swd,
3743
3917
  gitState,
3744
- providerInfo: readStatusProviderInfo(activeAcpRuntimeModel()),
3918
+ // TUI-MODEL-BADGE-ACTUAL (10-16) — 배지의 «지금» 은 이번 턴 실제 실행(폴백이면 «처음 → 실제»).
3919
+ providerInfo: readStatusProviderInfo(activeAcpRuntimeModel(), statusModelActual('dashboard')),
3745
3920
  contextUsedTokens: metrics.lastContextUsed,
3746
3921
  tmuxLabel: tmuxStatusLabel,
3747
3922
  sshLabel: sshStatusLabel,
@@ -6582,7 +6757,9 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
6582
6757
  });
6583
6758
  let clarificationModalId: string | null = null;
6584
6759
 
6585
- const attachChatStreamingKeys = (abortCtrl: AbortController): () => void => {
6760
+ // `turnEnd: false` — a phase inside a turn (skill-route detection) that attaches the same keys: its teardown is
6761
+ // not a turn end (TUI-ORPHAN-AUTO-RESUME-STOP E4 · 10-23: it reset seat-autowake's orphan-400 streak every turn).
6762
+ const attachChatStreamingKeys = (abortCtrl: AbortController, phase: { turnEnd?: boolean } = {}): () => void => {
6586
6763
  const chatLinesStartIndex = chatLines.length;
6587
6764
  userScrolledDuringStream = false;
6588
6765
  const SCROLL_KEYS = new Set(['j', 'k', 'down', 'up', 'pageup', 'pagedown', 'home', 'end', 'g', 'G']);
@@ -6592,8 +6769,20 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
6592
6769
  // so the user can make an informed call.
6593
6770
  let abortGateModalId: string | null = null;
6594
6771
  const showHarnessEscHint = createHarnessEscHint((line) => pushChatLine(line));
6595
- let stoppedHarnessSpace: string | null = null;
6596
6772
  const activeHarnessSpace = (): string | null => activeEscHarnessSpace(escAbortToolState, escHarnessSpacesByCallId);
6773
+ // ⭐ TUI-ESC-EXIT — `createEscAbortPendingGate` is the production
6774
+ // onAbortPending/onAbortRepeat seam shared with the incident test in
6775
+ // test/esc-harness-stop.test.ts; `runEscAbortPendingSoftStop` remains the
6776
+ // production soft-stop callback. The gate keeps an earlier successful
6777
+ // stopped space across later waiting/hint/failed callbacks.
6778
+ const escAbortPendingGate = createEscAbortPendingGate({
6779
+ runSoftStop: runEscAbortPendingSoftStop,
6780
+ formatWaitingTargets: formatEscAbortWaitingTargets,
6781
+ getActiveHarnessSpace: activeHarnessSpace,
6782
+ pushChatLine: (line) => pushChatLine(line),
6783
+ showHarnessEscHint,
6784
+ afterAbortEvent: () => { chatScrollOffset = -1; },
6785
+ });
6597
6786
  const escGate = createEscAbortGate({
6598
6787
  abortCtrl,
6599
6788
  getRunningCount: () => getEscAbortRunningCount(escAbortToolState),
@@ -6608,28 +6797,11 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
6608
6797
  getTheme: () => currentThemeTokens(),
6609
6798
  getWaitingTargetNames: () => getEscAbortWaitingToolNames(escAbortToolState),
6610
6799
  shouldAbortImmediately: () => activeHarnessSpace() !== null,
6611
- onAbortPending: ({ targets }) => {
6612
- const spaceId = activeHarnessSpace();
6613
- if (spaceId) {
6614
- try {
6615
- enqueueSoftStop(spaceId);
6616
- if (readSoftStopRequestStatus(spaceId).status !== 'present') throw new Error('soft-stop marker not persisted');
6617
- stoppedHarnessSpace = spaceId;
6618
- pushChatLine(' ⏹ 멈췄다 — 해당 하니스 런에 중단 요청을 보냈습니다.');
6619
- } catch {
6620
- pushChatLine(' ⚠ 하니스 런 중단 요청을 보내지 못했습니다. /harness runs 에서 확인해 주세요.');
6621
- }
6622
- } else if (!showHarnessEscHint(targets)) {
6623
- pushChatLine(` ⏳ 중단 요청됨 — ${formatEscAbortWaitingTargets(targets)} 종료를 기다리는 중입니다.`);
6624
- }
6625
- chatScrollOffset = -1;
6626
- },
6627
- onAbortRepeat: ({ repeat, targets }) => {
6628
- if (!stoppedHarnessSpace && !showHarnessEscHint(targets)) {
6629
- pushChatLine(` ⏳ ESC 재시도 ${repeat}회 — ${formatEscAbortWaitingTargets(targets)} 종료를 기다리는 중입니다.`);
6630
- }
6631
- chatScrollOffset = -1;
6632
- },
6800
+ // ⭐ TUI-ESC-EXIT — `runEscAbortPendingSoftStop` is the production
6801
+ // soft-stop callback seam; the incident test in
6802
+ // test/esc-harness-stop.test.ts exercises this same function.
6803
+ onAbortPending: escAbortPendingGate.onAbortPending,
6804
+ onAbortRepeat: escAbortPendingGate.onAbortRepeat,
6633
6805
  // ⭐⭐⭐ 턴을 멈추기 «전»에 살아남을 자식을 백그라운드 라우팅으로 넘긴다(`R4a` · 2026-08-19).
6634
6806
  // ⛔ 없으면 `R1` 이후 자식이 «고아»가 된다 — 살아 있는데 완료를 실어 나를 채널이 없다
6635
6807
  // (`task-notification` 은 background 만 본다 · 부모 툴 루프는 턴과 함께 사라졌다).
@@ -6874,6 +7046,8 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
6874
7046
  const r = applyDashboardStreamingTypeaheadKey(turnTypeaheadRef.state, k, isStreamingImmediateSlash);
6875
7047
  if (r.consumed) {
6876
7048
  turnTypeaheadRef.state = r.state;
7049
+ // TUI-PASTE-WHILE-STREAMING — 턴 중 붙여넣기를 버퍼가 받았다(종전엔 조용히 버려졌다).
7050
+ if (r.pasted) { try { debug.log('tui.paste', r.pasted.folded ? 'folded' : 'kept', { during: 'streaming', lines: r.pasted.lines, chars: r.pasted.chars }); } catch { /* fail-soft */ } }
6877
7051
  if (r.submissionDisposition) {
6878
7052
  debug.log('dashboard.turn-typeahead', 'submission-classified', {
6879
7053
  length: (r.immediateSubmission ?? turnTypeaheadRef.state.queuedSubmissions.at(-1))?.length ?? 0,
@@ -7171,7 +7345,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
7171
7345
  runTurnTeardownStep('stream-keys-detach', cleanup);
7172
7346
  runTurnTeardownStep('esc-gate-dispose', () => { escGate.dispose(); });
7173
7347
  try {
7174
- if (!stoppedHarnessSpace) settleEscAbortPendingLines(chatLines, chatLinesStartIndex);
7348
+ if (!escAbortPendingGate.getStoppedHarnessSpace()) settleEscAbortPendingLines(chatLines, chatLinesStartIndex);
7175
7349
  } catch (err) {
7176
7350
  const message = err instanceof Error ? err.message : String(err);
7177
7351
  const stackHead = err instanceof Error ? err.stack?.split('\n')[1]?.trim() : undefined;
@@ -7184,7 +7358,18 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
7184
7358
  reportTuiTurn('idle');
7185
7359
  const failedTurnRaw = autowakeTurnFailureRaw;
7186
7360
  autowakeTurnFailureRaw = null;
7187
- seatAutowake.noteTurnEnded({ sessionId: currentChatPersonaSessionId(), lastLine: chatLines.at(-1) ?? '', errorDetail: failedTurnRaw ?? undefined });
7361
+ if (phase.turnEnd !== false) seatAutowake.noteTurnEnded({ sessionId: currentChatPersonaSessionId(), lastLine: chatLines.at(-1) ?? '', errorDetail: failedTurnRaw ?? undefined });
7362
+ try {
7363
+ // «이번 턴»이 그린 줄만 본다 — 앞 턴의 ✘·취소 표시가 이번 턴 판정에 새지 않게(r1 must-fix).
7364
+ const turnLines = chatLines.slice(chatLinesStartIndex);
7365
+ const tailLines = turnLines.slice(-16);
7366
+ // 실패(✘)·취소로 끝난 턴은 이어가지 않는다 — 사람이 판단할 자리다.
7367
+ const failed = failedTurnRaw !== null || turnLines.some((line) => /✘ 실패|응답 취소|취소됨/.test(line));
7368
+ // 마지막 답 블록만 — 스트림 applier 의 assistantStart(이번 턴 범위 안일 때). 도구 줄은 그 앞에 남는다.
7369
+ const replyStart = latestTurnReplyStart();
7370
+ goalInterimFold.noteTurnEnded(chatLines, replyStart !== null && replyStart >= chatLinesStartIndex ? replyStart : chatLines.length);
7371
+ goalContinue.noteTurnEnded({ lines: tailLines, failed });
7372
+ } catch { /* fail-soft: 골 이어가기는 턴 정리를 막지 않는다 */ }
7188
7373
  }
7189
7374
  };
7190
7375
  };
@@ -11211,7 +11396,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
11211
11396
  try { mouseWiring.toasts().push({ text, kind, ttlMs: 1200 }); } catch { /* ignore */ }
11212
11397
  };
11213
11398
 
11214
- drawNow = ({ force: forceFromCoordinator = false } = {}) => {
11399
+ const drawFrameNow = ({ force: forceFromCoordinator = false } = {}) => {
11215
11400
  const { rows: termRows, cols } = termSize();
11216
11401
  const totalW = cols - 1;
11217
11402
 
@@ -11552,8 +11737,16 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
11552
11737
  const frameCursorDecision = display.cursorDecision();
11553
11738
  renderDashboardFrame(baseLines, composeDashboardFrameWithCoordinatorModal(display, {
11554
11739
  onFrameWriteComplete: firstDashboardFrameRendered ? undefined : (error) => {
11555
- if (error || firstDashboardFrameRendered) return;
11740
+ if (firstDashboardFrameRendered) return;
11741
+ // TUI-BOOT-TIMING-HOLES — 셋업 창은 «첫 프레임 flush 완료» 에 닫는다(진입~flush).
11742
+ // 실패한 flush 도 창을 닫아 신호가 영영 오지 않는 일을 막는다(재시도 의미론은 그대로:
11743
+ // 첫 프레임 신호는 다음 성공 flush 가 낸다).
11744
+ if (error) {
11745
+ syncSetupWindow.finish();
11746
+ return;
11747
+ }
11556
11748
  firstDashboardFrameRendered = true;
11749
+ syncSetupWindow.finish();
11557
11750
  try { opts.onFirstFrameRendered?.(); } catch { /* timing must not break dashboard */ }
11558
11751
  },
11559
11752
  overlay: modalFrame,
@@ -11647,6 +11840,15 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
11647
11840
  if (overlay.length > 0) process.stdout.write(overlay);
11648
11841
  } catch { /* overlay must not crash main draw */ }
11649
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
+ };
11650
11852
  draw = (opts = {}) => {
11651
11853
  if (debug.enabled) {
11652
11854
  const now = Date.now();
@@ -12511,7 +12713,8 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
12511
12713
  const disposeResizeListener = installResizeListener({
12512
12714
  draw: (opts) => draw(opts),
12513
12715
  promptCtl,
12514
- requestOverlayFrame: () => display.requestRender({ force: true }),
12716
+ requestOverlayFrame: () => display.requestRenderNow({ force: true }),
12717
+ withSynchronizedOutput: (paint) => display.withSynchronizedOutput(paint),
12515
12718
  });
12516
12719
  process.on('exit', disposeResizeListener);
12517
12720
  // 외부 주입(`pty text`)을 사용자 타이핑과 섞지 않고 별도 대기열로 — 결함 #6(10-14).
@@ -13133,12 +13336,16 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
13133
13336
  // ⭐ TUI-AGENT-IDLE-WAKE — 배경 자식(⊕ RunShell bg) 완료 큐의 «유일한» 구독(onEnqueue 구독 0 → 1).
13134
13337
  // 채팅 한 줄 «✓ 위임 끝: <이름> — 다음 턴에 결과» · 결과는 다음 턴 preamble 이 싣는다.
13135
13338
  // ⛔ 입력칸·injectKey·pty 주입 0(대표 비침투). dedupe·수명은 모듈, 여기선 배선만.
13136
- const agentWake = installAgentWake({
13137
- subscribe: (listener) => globalTaskNotificationQueue.onEnqueue(listener),
13339
+ const agentWake = installSeatedAgentWake({
13340
+ subscribe: (listener) => subscribeDashboardAgentResults(
13341
+ globalTaskNotificationQueue, listener, (line) => { pushChatLine(C.muted(line)); draw(); },
13342
+ ),
13138
13343
  // 그리기 실패는 삼키지 않는다 — 모듈이 잡아 notified{shown:false} 로 남긴다.
13139
13344
  notify: createDashboardAgentWakeNotify((line) => { chatLines.push(C.muted(line)); }, () => draw()),
13140
13345
  // 조각 2 — 자리 TUI ∧ 유휴면 H2 문으로 다음 턴(origin child-complete) · 판정은 모듈.
13141
- 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),
13142
13349
  });
13143
13350
  disposeDashboardAgentWake = () => agentWake.dispose();
13144
13351
 
@@ -14841,7 +15048,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
14841
15048
  let acpDispatchToolSelf: CoreTurnDispatchTool | null = null;
14842
15049
  let acpToolDispatchCount = 0;
14843
15050
  const trMod = await import('../tool-runtime/index.js');
14844
- trMod.registerAllDefaultToolRuntimes();
15051
+ trMod.registerAllDefaultToolRuntimes({ mcpLazyBoot: true });
14845
15052
  acpToolRuntime = trMod;
14846
15053
  acpPersistToolOutputPreview = (
14847
15054
  await import('../tool-runtime/truncation-store.js')
@@ -15100,14 +15307,15 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
15100
15307
  chat.history.push(m as ChatMessage);
15101
15308
  }
15102
15309
  const turns = past.length;
15103
- 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);
15104
15312
  // BACKLOG #1 — markdown-aware preview rendering. Replaces
15105
15313
  // the previous one-line `slice(0, 100)` snippet so tables
15106
15314
  // / bold / lists in replayed turns look the same as when
15107
15315
  // they were originally streamed (`formatResponse` path).
15108
15316
  const previewWidth = Math.max(40, termSize().cols - 8);
15109
15317
  const previewWrap = getUserConfig().chat.rendering.wrap;
15110
- const previewLines = renderReplayPreviewLines(past, {
15318
+ const previewLines = renderRestoredTranscriptLines(past, {
15111
15319
  maxWidth: previewWidth,
15112
15320
  wrapOpts: previewWrap,
15113
15321
  });
@@ -15149,7 +15357,16 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
15149
15357
  if (resume.repaired) {
15150
15358
  chatLines.push(C.muted(` 깨진 도구 호출·결과 짝을 잘라 이어받았다(호출 ${resume.repaired.removedCalls} · 결과 ${resume.repaired.removedResults})`));
15151
15359
  }
15152
- 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.'));
15153
15370
  }
15154
15371
  }
15155
15372
  observeSessionStart({
@@ -16240,6 +16457,8 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
16240
16457
  // those tokens into the initial buffer so the user can just type
16241
16458
  // their question next to the pre-filled [PDF #N] tokens.
16242
16459
  let nextInitial: string | undefined = inputEntry.initialText;
16460
+ // TUI-PASTE-WHILE-STREAMING — 턴 중 접은 붙여넣기 토큰의 원문(넘김 입력창이 넘겨받는다 · 글에 토큰이 없으면 버린다).
16461
+ let nextInitialPastes: Array<[string, string]> = [];
16243
16462
  let exitInputLoop = false;
16244
16463
  let lastTurnFinalStatus: 'completed' | 'interrupted' | 'failed' | undefined;
16245
16464
 
@@ -16271,6 +16490,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
16271
16490
  });
16272
16491
  lastTurnFinalStatus = undefined;
16273
16492
  nextInitial = drained.nextInitial;
16493
+ nextInitialPastes = [...nextInitialPastes, ...(drained.initialPastes ?? [])].filter(([token]) => nextInitial?.includes(token));
16274
16494
  const queuedTurnEndText = drained.injectEnter ? drained.nextInitial : undefined;
16275
16495
  if (interrupted && queuedBeforeDrain > 0) {
16276
16496
  debug.log('dashboard.turn-typeahead', 'restored-after-interrupt', { count: queuedBeforeDrain });
@@ -16310,6 +16530,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
16310
16530
  debugLog: debug.enabled ? (event, label, payload) => debug.log(event, label, payload) : undefined,
16311
16531
  textInputOpts: {
16312
16532
  internalTurnYield: internalTurnYieldPort,
16533
+ ...(nextInitialPastes.length ? { initialPastes: nextInitialPastes } : {}),
16313
16534
  onScrollKey: (name) => {
16314
16535
  const { rows } = termSize();
16315
16536
  const viewport = computePromptFrameLogViewportBounds(
@@ -16808,7 +17029,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
16808
17029
 
16809
17030
  // Save to durable input history. Up/down reads the in-memory
16810
17031
  // tail, while slash/LLM tools can search the full store.
16811
- if (!internalTurn) internalTurnGate.noteHumanTurn();
17032
+ if (!internalTurn) { internalTurnGate.noteHumanTurn(); goalContinue.noteHumanTurn(); goalInterimFold.noteHumanTurn(); }
16812
17033
  if (postTurn.historyRecord && !internalTurn) {
16813
17034
  inputHistoryStore.record(postTurn.historyRecord);
16814
17035
  refreshInputHistory();
@@ -17713,23 +17934,22 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
17713
17934
  setWorkingFocusPreview: () => { setWorkingFocus('preview', 'slash-term-move-preview'); },
17714
17935
  nextTerminalVwSlotId: (terminalId) => `term-slot:${terminalId}`,
17715
17936
  },
17716
- // TUI-LOOP-COMMAND — /loop <간격> <프롬프트> · 쉬는 동안만 발사
17717
- // (src/dashboard/loop-scheduler.ts · 판정: idle 발사 1 · busy 미룸 · stop 0).
17718
- // idle/busy 신호는 대시보드 루프가 이미 쓰는 것을 그대로 쓴다 —
17719
- // 스트리밍 턴(streamingInFlight · reportTuiTurn busy/idle) +
17720
- // ACP 세션 바쁨(dashboardAcpChat.isBusy()). 프롬프트 제출은
17721
- // 플러그인 submitDashboardText 와 같은 기존 제출 틈
17722
- // (dispatchDashboardSubmitText)으로 낸다 — 새 제출 경로를 만들지 않는다.
17937
+ // TUI-LOOP-COMMAND — the scheduler ticks; H2 alone judges whether
17938
+ // an internal turn can open. A rejection waits for the next tick.
17723
17939
  loopCommand: {
17724
- isIdle: () => !streamingInFlight && !dashboardAcpChat.isBusy(),
17940
+ isIdle: () => true,
17725
17941
  submitPrompt: (prompt: string) => {
17726
- if (dispatchDashboardSubmitText) dispatchDashboardSubmitText(prompt);
17727
- else chatLines.push(C.muted(' /loop: 입력 루프가 아직 제출을 받지 않는다 — 다음 틱을 기다린다'));
17942
+ const result = internalTurnGate.startTurnIfIdle(prompt, { origin: 'scheduled', reason: '/loop' });
17943
+ if (result.opened) debug.log('dashboard.loop', 'fired', { turnId: result.turnId });
17944
+ else debug.log('dashboard.loop', 'rejected', { reason: result.reason });
17728
17945
  },
17729
17946
  schedulerRef: dashboardLoopSchedulerRef,
17730
17947
  },
17731
17948
  };
17732
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
+ }
17733
17953
  if (debug.enabled) {
17734
17954
  debug.log('dashboard.slash.dispatch', cmdLower, {
17735
17955
  argsCount: args.length,
@@ -18176,6 +18396,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
18176
18396
  // array but doesn't paint until after the skill router's
18177
18397
  // classifier LLM call returns (~1-2s of visual silence).
18178
18398
  if (internalTurn) {
18399
+ try { goalInterimFold.foldBeforeInternalTurn(chatLines, internalTurn.origin, C.muted); } catch { /* fail-soft: 접기는 턴을 막지 않는다 */ }
18179
18400
  chatLines.push(C.muted(` ${formatInternalTurnBanner(internalTurn)}`));
18180
18401
  chatScrollOffset = -1;
18181
18402
  } else {
@@ -18221,6 +18442,10 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
18221
18442
  // through to keyword routing in those cases.
18222
18443
  {
18223
18444
  const urlDec = detectUrlRoute(tok.text, getUserConfig().skills.urlRouting);
18445
+ const urlGuard = urlDec ? null : workContextGuardReason(tok.text);
18446
+ if (urlGuard && extractUrls(tok.text).length > 0) {
18447
+ debug.log('skill.router', 'url-route-guarded', { reason: urlGuard, textLength: tok.text.length });
18448
+ }
18224
18449
  if (urlDec) {
18225
18450
  debug.log('skill.router', 'url-route', {
18226
18451
  kind: urlDec.kind, skill: urlDec.skill, absorb: urlDec.absorb,
@@ -18272,7 +18497,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
18272
18497
  const detectTier = getModelTier(getUserConfig().llm.provider, getUserConfig().llm.model);
18273
18498
  const routeStartedAt = Date.now();
18274
18499
  const route = await runAbortableDashboardSkillRoute({
18275
- attachKeys: attachChatStreamingKeys,
18500
+ attachKeys: (ctrl: AbortController) => attachChatStreamingKeys(ctrl, { turnEnd: false }),
18276
18501
  detect: (signal) => detectDashboardSkillRoute(tok.text, visibleIndex, {
18277
18502
  llmFallback: userCfg.llmFallback,
18278
18503
  keywordScoreThreshold: userCfg.keywordScoreThreshold,
@@ -18537,7 +18762,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
18537
18762
  return buildDashboardOptionalToolSpecs({
18538
18763
  userConfig: uc,
18539
18764
  termSize,
18540
- registerAllDefaultToolRuntimes: () => { toolRuntime.registerAllDefaultToolRuntimes(); },
18765
+ registerAllDefaultToolRuntimes: () => { toolRuntime.registerAllDefaultToolRuntimes({ mcpLazyBoot: true }); },
18541
18766
  setTerminalModalRuntimeDeps: (deps) => { toolRuntime.setTerminalModalRuntimeDeps(deps); },
18542
18767
  ...buildDefaultDashboardToolBuilders(),
18543
18768
  }) as unknown[];
@@ -18584,6 +18809,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
18584
18809
  renderedToolRuntime,
18585
18810
  brainIcon: ICONS.brain,
18586
18811
  });
18812
+ latestTurnStream = turnStreamRuntime;
18587
18813
  return {
18588
18814
  ...turnStreamRuntime,
18589
18815
  onText: (chunk, accumulated) => {
@@ -18642,6 +18868,17 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
18642
18868
  },
18643
18869
  resetAcpTurnRef: () => resetDashboardAcpTurnRef(acpTurnRef),
18644
18870
  acpSession: dashboardAcpSession,
18871
+ // TUI-400-AUTOHEAL-FALLBACK(대표 10-22) — 400(대화 기록 어긋남)이면 ① 새 세션 ⊕ 요약 ② 다음 공급자로 스스로 회복.
18872
+ autoheal: createDashboardTurnAutoheal({
18873
+ session: dashboardAcpSession,
18874
+ getCwd: getSessionCwd,
18875
+ onRenewed: (sessionId) => {
18876
+ acpSessionIdRef.current = sessionId;
18877
+ observeSessionStart({ surface: 'tui', origin: 'new', reason: 'autoheal-400', sessionId });
18878
+ },
18879
+ remote: daemonAttached,
18880
+ activeModel: () => resolveDashboardActiveModel(tok.text) ?? undefined,
18881
+ }),
18645
18882
  control: {
18646
18883
  signalBus: dashboardControlSignals,
18647
18884
  },