elanous 0.2.34 → 0.2.36

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 (802) 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/chunks/{abb4b98b.163e0f56e84ae35d.js → 053a429e.9a63436527cc751c.js} +1 -1
  4. package/apps/pwa/out/_next/static/chunks/109.f196abf3484bb97f.js +287 -0
  5. package/apps/pwa/out/_next/static/chunks/1201.afbfc5b1c5e5cbe4.js +1 -0
  6. package/apps/pwa/out/_next/static/chunks/1517.9275b89572098ff3.js +1 -0
  7. package/apps/pwa/out/_next/static/chunks/1574.ad11f8db8396ab45.js +1 -0
  8. package/apps/pwa/out/_next/static/chunks/1614.7a8c5c40aee0261f.js +1 -0
  9. package/apps/pwa/out/_next/static/chunks/1871-f1eb29d8dbb4065b.js +1 -0
  10. package/apps/pwa/out/_next/static/chunks/190.285c832bd9626f8c.js +64 -0
  11. package/apps/pwa/out/_next/static/chunks/2193.0ea24c4a7aa1d004.js +36 -0
  12. package/apps/pwa/out/_next/static/chunks/223-ad865c1e80491d78.js +1 -0
  13. package/apps/pwa/out/_next/static/chunks/2265-f0d90b6dbec05f81.js +1 -0
  14. package/apps/pwa/out/_next/static/chunks/2267.eb4a62a209f09ec4.js +149 -0
  15. package/apps/pwa/out/_next/static/chunks/2341-86cd06c0cf01aa33.js +1 -0
  16. package/apps/pwa/out/_next/static/chunks/2352.9abc42422bade876.js +1 -0
  17. package/apps/pwa/out/_next/static/chunks/2397-c1653a816061842d.js +1 -0
  18. package/apps/pwa/out/_next/static/chunks/2500.cbc1257b774aae52.js +1 -0
  19. package/apps/pwa/out/_next/static/chunks/{6086.913a69e6fa3e4a8b.js → 2683.c9773a0c589b031b.js} +4 -4
  20. package/apps/pwa/out/_next/static/chunks/2709.8e1889034255fc5f.js +24 -0
  21. package/apps/pwa/out/_next/static/chunks/{5576-82d3703636d5c4b9.js → 275-02ea4c2a33980422.js} +3 -3
  22. package/apps/pwa/out/_next/static/chunks/{ffdc3a04.b9c23c1b28dd4a96.js → 2812ca6a.3b9f4a7a08885744.js} +1 -1
  23. package/apps/pwa/out/_next/static/chunks/284.ac77c0db55bfd3a8.js +1 -0
  24. package/apps/pwa/out/_next/static/chunks/2941.3c3546f96bc6efa7.js +1 -0
  25. package/apps/pwa/out/_next/static/chunks/2976.b000698a3c6512dc.js +24 -0
  26. package/apps/pwa/out/_next/static/chunks/{9550.d5f76828f972058c.js → 2986.45d7652e4f13557e.js} +2 -2
  27. package/apps/pwa/out/_next/static/chunks/3031-85328a92fcce4da6.js +1 -0
  28. package/apps/pwa/out/_next/static/chunks/{8817.61bb7ffbba502ecb.js → 3136.30aaaa5fa03662a3.js} +1 -1
  29. package/apps/pwa/out/_next/static/chunks/{9131-fce7256c4180c4a5.js → 3148-98efd4869d660a87.js} +1 -1
  30. package/apps/pwa/out/_next/static/chunks/{3498.cf2a15a8a9e5b926.js → 3155.2587a55196ecb394.js} +3 -3
  31. package/apps/pwa/out/_next/static/chunks/3277.785db1cf09f98601.js +1 -0
  32. package/apps/pwa/out/_next/static/chunks/3320-f9c77381f85a2c0a.js +1 -0
  33. package/apps/pwa/out/_next/static/chunks/{3103.84470c8445962f04.js → 3324.a09703033abcbd2f.js} +1 -1
  34. package/apps/pwa/out/_next/static/chunks/3386-91049feabff9a94e.js +1 -0
  35. package/apps/pwa/out/_next/static/chunks/339.80afb7e8839372af.js +8 -0
  36. package/apps/pwa/out/_next/static/chunks/3410.7f9af5ab77cbe65f.js +115 -0
  37. package/apps/pwa/out/_next/static/chunks/{3819.163d4777f0a597f6.js → 3538.a445e50bb359d068.js} +2 -2
  38. package/apps/pwa/out/_next/static/chunks/3540c645.2595a6af01a97672.js +1 -0
  39. package/apps/pwa/out/_next/static/chunks/3621.581b2054cc14bee4.js +286 -0
  40. package/apps/pwa/out/_next/static/chunks/3676.8c28d16fd84ca843.js +1 -0
  41. package/apps/pwa/out/_next/static/chunks/{3414.172ad4ca2d9b08e8.js → 3727.7949ccaacaa71242.js} +2 -2
  42. package/apps/pwa/out/_next/static/chunks/375-b84540853523fe52.js +1 -0
  43. package/apps/pwa/out/_next/static/chunks/3757-180308bc61021b05.js +1 -0
  44. package/apps/pwa/out/_next/static/chunks/379.ee262e37586fe1ae.js +74 -0
  45. package/apps/pwa/out/_next/static/chunks/3840-5825d56d46976a92.js +1 -0
  46. package/apps/pwa/out/_next/static/chunks/3969-81054381eaec4c4c.js +1 -0
  47. package/apps/pwa/out/_next/static/chunks/{9b48c871.204d5d13e7809bd0.js → 3a3d9966.cc4d4585a2708e7c.js} +1 -1
  48. package/apps/pwa/out/_next/static/chunks/4067-bf9aa60547972937.js +1 -0
  49. package/apps/pwa/out/_next/static/chunks/4116.a84a92a2492c080e.js +1 -0
  50. package/apps/pwa/out/_next/static/chunks/4176.e5729c93c29151eb.js +104 -0
  51. package/apps/pwa/out/_next/static/chunks/4227-e6c84686bc8946ca.js +1 -0
  52. package/apps/pwa/out/_next/static/chunks/{6740.43de73fc427c9fe2.js → 4286.b70c4520306817e8.js} +1 -1
  53. package/apps/pwa/out/_next/static/chunks/4304.e9b2512834a9e23e.js +23 -0
  54. package/apps/pwa/out/_next/static/chunks/4327.b9e08a71c0009348.js +1 -0
  55. package/apps/pwa/out/_next/static/chunks/{8548.036c344973968847.js → 4615.8525eb0add35eba6.js} +1 -1
  56. package/apps/pwa/out/_next/static/chunks/4946.bd106eafd668f248.js +148 -0
  57. package/apps/pwa/out/_next/static/chunks/{3411-f87314c6c66ebc73.js → 5085-bce4904931767ca6.js} +1 -1
  58. package/apps/pwa/out/_next/static/chunks/5125.2eb9968b83767193.js +93 -0
  59. package/apps/pwa/out/_next/static/chunks/5128-75b733fd74a9a1eb.js +1 -0
  60. package/apps/pwa/out/_next/static/chunks/{3110.0a7065f25c841818.js → 528.38ce20ef8aa251ff.js} +16 -16
  61. package/apps/pwa/out/_next/static/chunks/5489f3fe.4bb1458b09f6dead.js +122 -0
  62. package/apps/pwa/out/_next/static/chunks/{1644.35dd25240ae24e4b.js → 552.b7d061ad91eeac51.js} +2 -2
  63. package/apps/pwa/out/_next/static/chunks/5560-2a4648f6a30f16e7.js +1 -0
  64. package/apps/pwa/out/_next/static/chunks/{3837.722e053fb9f321ad.js → 5711.957b095705c12560.js} +1 -1
  65. package/apps/pwa/out/_next/static/chunks/{2124.ed5bf480cea7f85b.js → 575.d929793a53f27c4b.js} +1 -1
  66. package/apps/pwa/out/_next/static/chunks/5772-e29e14f8ff127122.js +1 -0
  67. package/apps/pwa/out/_next/static/chunks/5887.5b2f5b44ce0f7e9a.js +1 -0
  68. package/apps/pwa/out/_next/static/chunks/5899-4c112a2d908cf97f.js +1 -0
  69. package/apps/pwa/out/_next/static/chunks/{7562.948255cbc3e79d33.js → 599.c39c571b6733f2a2.js} +2 -2
  70. package/apps/pwa/out/_next/static/chunks/6041.1b65efb796ebc2a5.js +79 -0
  71. package/apps/pwa/out/_next/static/chunks/6057-765c0a26028c86b2.js +1 -0
  72. package/apps/pwa/out/_next/static/chunks/6142.f289e0d039f453a6.js +1 -0
  73. package/apps/pwa/out/_next/static/chunks/6199-6bcd61d2a3910e04.js +1 -0
  74. package/apps/pwa/out/_next/static/chunks/6236.cdf7293e710a9b2d.js +1 -0
  75. package/apps/pwa/out/_next/static/chunks/6387-237e079dac9a3ae6.js +1 -0
  76. package/apps/pwa/out/_next/static/chunks/6448-b6d272d074276e14.js +1 -0
  77. package/apps/pwa/out/_next/static/chunks/6466-92e65a48490b68a9.js +1 -0
  78. package/apps/pwa/out/_next/static/chunks/6566.926a1d1b7c911442.js +1 -0
  79. package/apps/pwa/out/_next/static/chunks/6580-cdc0e4a634ce4708.js +1 -0
  80. package/apps/pwa/out/_next/static/chunks/6659-b242dc31b20b3f29.js +1 -0
  81. package/apps/pwa/out/_next/static/chunks/6690.c5d9b321b1f79384.js +1 -0
  82. package/apps/pwa/out/_next/static/chunks/671-e9b6ad0c771c5514.js +1 -0
  83. package/apps/pwa/out/_next/static/chunks/6862.bcbf89dd0f4496b3.js +27 -0
  84. package/apps/pwa/out/_next/static/chunks/6912-7b375ee48732c767.js +1 -0
  85. package/apps/pwa/out/_next/static/chunks/{5446.edf141cff9ef647d.js → 6925.562d532110879886.js} +1 -1
  86. package/apps/pwa/out/_next/static/chunks/{7005.1623d2aea78eb85f.js → 6943.c6b24124853a47b2.js} +1 -1
  87. package/apps/pwa/out/_next/static/chunks/727.7deb87749b0a343a.js +1 -0
  88. package/apps/pwa/out/_next/static/chunks/{8368.014caa8de2f5af34.js → 7481.39f7a4654907bf6e.js} +1 -1
  89. package/apps/pwa/out/_next/static/chunks/7545.b1aa42cd15503319.js +1 -0
  90. package/apps/pwa/out/_next/static/chunks/7551-416d298c2dc4a9ab.js +1 -0
  91. package/apps/pwa/out/_next/static/chunks/{2554.3b5e200f5f5cfcd6.js → 771.c3cdb6c1f7f47c02.js} +16 -16
  92. package/apps/pwa/out/_next/static/chunks/7784.1f0ac4a16d190cf4.js +1 -0
  93. package/apps/pwa/out/_next/static/chunks/7870-309de463786ac1fc.js +1 -0
  94. package/apps/pwa/out/_next/static/chunks/7888-e29b151bb6a3bb8b.js +1 -0
  95. package/apps/pwa/out/_next/static/chunks/{3121.779fafe3e44612c5.js → 7891.03f910124a737985.js} +1 -1
  96. package/apps/pwa/out/_next/static/chunks/7905-6ba78d9234608f79.js +1 -0
  97. package/apps/pwa/out/_next/static/chunks/8037.e254fd797aa224d1.js +1 -0
  98. package/apps/pwa/out/_next/static/chunks/8207.f527886b7c464529.js +1 -0
  99. package/apps/pwa/out/_next/static/chunks/856.50bda61439d465e6.js +62 -0
  100. package/apps/pwa/out/_next/static/chunks/{9a8cb466.cc9fc9e6e46038aa.js → 873d6c12.09bd499f57171543.js} +1 -1
  101. package/apps/pwa/out/_next/static/chunks/{7431.3051e9b8a4372d2d.js → 8904.7d51af2dc033965c.js} +2 -2
  102. package/apps/pwa/out/_next/static/chunks/9031-92e9b487edb681ee.js +1 -0
  103. package/apps/pwa/out/_next/static/chunks/9060.5410d9f6a95f6287.js +90 -0
  104. package/apps/pwa/out/_next/static/chunks/914.8abefd48d579547b.js +94 -0
  105. package/apps/pwa/out/_next/static/chunks/9187-c87a2207d4ac5d46.js +1 -0
  106. package/apps/pwa/out/_next/static/chunks/{1895-60ed0e341c658bd4.js → 9250-072df22eaadaa6b5.js} +1 -1
  107. package/apps/pwa/out/_next/static/chunks/9289.3e92f278821e18e0.js +1 -0
  108. package/apps/pwa/out/_next/static/chunks/9319.7816d3cc741cd34f.js +1 -0
  109. package/apps/pwa/out/_next/static/chunks/9327-e016bb9f1674d24f.js +1 -0
  110. package/apps/pwa/out/_next/static/chunks/9365.3de48bf75193ff9a.js +77 -0
  111. package/apps/pwa/out/_next/static/chunks/9383.5b5e9aa56b5fea97.js +1 -0
  112. package/apps/pwa/out/_next/static/chunks/9387-cb929573ef436f39.js +1 -0
  113. package/apps/pwa/out/_next/static/chunks/9489.c27becacc3283dec.js +1 -0
  114. package/apps/pwa/out/_next/static/chunks/{2547.dd27303624cb4da8.js → 9514.131c52cc75fe6439.js} +1 -1
  115. package/apps/pwa/out/_next/static/chunks/9536.28962663c7734376.js +1 -0
  116. package/apps/pwa/out/_next/static/chunks/9686-12286f5bbf15a5a0.js +1 -0
  117. package/apps/pwa/out/_next/static/chunks/9776.289d40cc5a4c342a.js +1 -0
  118. package/apps/pwa/out/_next/static/chunks/9789.60f723d18097ec30.js +1 -0
  119. package/apps/pwa/out/_next/static/chunks/989.f0c17523c5e61f65.js +1 -0
  120. package/apps/pwa/out/_next/static/chunks/9972-1df393aa8d4f7d52.js +1 -0
  121. package/apps/pwa/out/_next/static/chunks/9f31e478.fefcbcd3c388ebc5.js +1 -0
  122. package/apps/pwa/out/_next/static/chunks/app/_not-found/page-96750aba7430959f.js +1 -0
  123. package/apps/pwa/out/_next/static/chunks/app/approvals/page-4105e5bbbb043024.js +1 -0
  124. package/apps/pwa/out/_next/static/chunks/app/autopilot/page-5d4fa75c2acb113e.js +1 -0
  125. package/apps/pwa/out/_next/static/chunks/app/board/page-a79a9bdb3b2142bf.js +1 -0
  126. package/apps/pwa/out/_next/static/chunks/app/botlab/page-f1c2047484992a35.js +1 -0
  127. package/apps/pwa/out/_next/static/chunks/app/bots/page-15ffc49b2d8c70e2.js +1 -0
  128. package/apps/pwa/out/_next/static/chunks/app/ceo/page-67d53a3fc8734135.js +1 -0
  129. package/apps/pwa/out/_next/static/chunks/app/chat/page-e30c8dc696491336.js +1 -0
  130. package/apps/pwa/out/_next/static/chunks/app/consult/page-2136e04fa77696e2.js +1 -0
  131. package/apps/pwa/out/_next/static/chunks/app/control/page-fecd2814790c2e12.js +1 -0
  132. package/apps/pwa/out/_next/static/chunks/app/decisions/page-280aa4a98fc5bb44.js +1 -0
  133. package/apps/pwa/out/_next/static/chunks/app/design-check/page-c14e96b65fb4b883.js +1 -0
  134. package/apps/pwa/out/_next/static/chunks/app/editor/page-187dac74825ed6bf.js +1 -0
  135. package/apps/pwa/out/_next/static/chunks/app/exec/page-6bc7246ea8c92448.js +1 -0
  136. package/apps/pwa/out/_next/static/chunks/app/field/{page-4fb31eb476dcbad3.js → page-083747f1d4518f61.js} +1 -1
  137. package/apps/pwa/out/_next/static/chunks/app/healthz/route-96750aba7430959f.js +1 -0
  138. package/apps/pwa/out/_next/static/chunks/app/inside/page-15ca95a16ec96e1f.js +1 -0
  139. package/apps/pwa/out/_next/static/chunks/app/intake/page-a8ac031b3810eb64.js +1 -0
  140. package/apps/pwa/out/_next/static/chunks/app/layout-8835f93110494cda.js +1 -0
  141. package/apps/pwa/out/_next/static/chunks/app/live/page-e2de2e59111c9aad.js +1 -0
  142. package/apps/pwa/out/_next/static/chunks/app/live-run/page-f2b2e4bf6e981450.js +1 -0
  143. package/apps/pwa/out/_next/static/chunks/app/loops/page-5b92b7f75df20948.js +1 -0
  144. package/apps/pwa/out/_next/static/chunks/app/market/page-468eddf2b1a84ecb.js +1 -0
  145. package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-2af16e62c12f22df.js +1 -0
  146. package/apps/pwa/out/_next/static/chunks/app/morning/page-18b40867a77a5793.js +1 -0
  147. package/apps/pwa/out/_next/static/chunks/app/not-found-fe934f2979f5a4a2.js +1 -0
  148. package/apps/pwa/out/_next/static/chunks/app/observatory/page-3eec435537357170.js +1 -0
  149. package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-ff88cbfd2aa99fc8.js +1 -0
  150. package/apps/pwa/out/_next/static/chunks/app/ops/release/page-a5b39fb780c70ab5.js +1 -0
  151. package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-ae465dde1d1b3933.js +1 -0
  152. package/apps/pwa/out/_next/static/chunks/app/outputs/page-e7abc34a48a6f71e.js +1 -0
  153. package/apps/pwa/out/_next/static/chunks/app/page-cab9674fde9ead26.js +1 -0
  154. package/apps/pwa/out/_next/static/chunks/app/reflection/page-1da49bc8712284d0.js +1 -0
  155. package/apps/pwa/out/_next/static/chunks/app/scheduler/page-5e8aa657551ac912.js +1 -0
  156. package/apps/pwa/out/_next/static/chunks/app/sessions/page-fcc36f36c6dc1fe2.js +1 -0
  157. package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-d22db22f2a7296ca.js +1 -0
  158. package/apps/pwa/out/_next/static/chunks/app/settings/page-d12dc7b1773878f0.js +1 -0
  159. package/apps/pwa/out/_next/static/chunks/app/setup/done/page-99debec9ea7fbec0.js +1 -0
  160. package/apps/pwa/out/_next/static/chunks/app/setup/layout-96750aba7430959f.js +1 -0
  161. package/apps/pwa/out/_next/static/chunks/app/setup/page-2a088a78bad7e924.js +1 -0
  162. package/apps/pwa/out/_next/static/chunks/app/share/page-2e8ed57db7e69993.js +1 -0
  163. package/apps/pwa/out/_next/static/chunks/app/showroom/page-4b3a16213c2ae8fe.js +1 -0
  164. package/apps/pwa/out/_next/static/chunks/app/tasks/page-f098747ddf38c98b.js +1 -0
  165. package/apps/pwa/out/_next/static/chunks/app/term/page-c15958835534404b.js +1 -0
  166. package/apps/pwa/out/_next/static/chunks/app/today/page-68279e3c843c1fd7.js +1 -0
  167. package/apps/pwa/out/_next/static/chunks/app/trace/page-a34a74453367a39d.js +1 -0
  168. package/apps/pwa/out/_next/static/chunks/app/vault/page-8767a7db2155a5bd.js +1 -0
  169. package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-bd5976683460d7f2.js +1 -0
  170. package/apps/pwa/out/_next/static/chunks/app/workflows/page-b7364835e7f2ef54.js +1 -0
  171. package/apps/pwa/out/_next/static/chunks/app/workspace/page-311af16b3ee0ffca.js +1 -0
  172. package/apps/pwa/out/_next/static/chunks/app/worktrees/page-fb670757274ae990.js +1 -0
  173. package/apps/pwa/out/_next/static/chunks/{5014f970-22bef0b5210f7d60.js → ccae1c4b-0cf414f5eff1b10d.js} +1 -1
  174. package/apps/pwa/out/_next/static/chunks/{4fa33ebd.21c1bd5b294496e6.js → ceba0382.650712b56b85b582.js} +1 -1
  175. package/apps/pwa/out/_next/static/chunks/da5ecc5c-b005ad8cac737d57.js +1 -0
  176. package/apps/pwa/out/_next/static/chunks/f9a61e4d.1fc2c1dbdd49fe46.js +1 -0
  177. package/apps/pwa/out/_next/static/chunks/framework-6d497cbf1eef04c6.js +1 -0
  178. package/apps/pwa/out/_next/static/chunks/main-app-012f5edec932f337.js +1 -0
  179. package/apps/pwa/out/_next/static/chunks/main-da5aeb809edc94a2.js +1 -0
  180. package/apps/pwa/out/_next/static/chunks/pages/_app-5ee319af6f749dfe.js +1 -0
  181. package/apps/pwa/out/_next/static/chunks/pages/_error-4bc84653a718d6c6.js +1 -0
  182. package/apps/pwa/out/_next/static/chunks/webpack-8a96cf6775c73d6e.js +1 -0
  183. package/apps/pwa/out/_next/static/{L04y73dlwKeTW-GetaTF3 → uC-N0emedeNOFuaBQFv-I}/_buildManifest.js +1 -1
  184. package/apps/pwa/out/approvals/index.html +1 -1
  185. package/apps/pwa/out/approvals/index.txt +22 -22
  186. package/apps/pwa/out/autopilot/index.html +1 -1
  187. package/apps/pwa/out/autopilot/index.txt +22 -22
  188. package/apps/pwa/out/board/index.html +1 -1
  189. package/apps/pwa/out/board/index.txt +22 -22
  190. package/apps/pwa/out/botlab/index.html +1 -1
  191. package/apps/pwa/out/botlab/index.txt +21 -21
  192. package/apps/pwa/out/bots/index.html +1 -1
  193. package/apps/pwa/out/bots/index.txt +21 -21
  194. package/apps/pwa/out/ceo/index.html +1 -1
  195. package/apps/pwa/out/ceo/index.txt +22 -22
  196. package/apps/pwa/out/chat/index.html +1 -1
  197. package/apps/pwa/out/chat/index.txt +21 -21
  198. package/apps/pwa/out/consult/index.html +1 -1
  199. package/apps/pwa/out/consult/index.txt +22 -22
  200. package/apps/pwa/out/control/index.html +1 -1
  201. package/apps/pwa/out/control/index.txt +22 -22
  202. package/apps/pwa/out/decisions/index.html +1 -1
  203. package/apps/pwa/out/decisions/index.txt +21 -21
  204. package/apps/pwa/out/design-check/index.html +1 -1
  205. package/apps/pwa/out/design-check/index.txt +22 -22
  206. package/apps/pwa/out/editor/index.html +1 -1
  207. package/apps/pwa/out/editor/index.txt +22 -22
  208. package/apps/pwa/out/exec/index.html +1 -1
  209. package/apps/pwa/out/exec/index.txt +22 -22
  210. package/apps/pwa/out/field/index.html +1 -1
  211. package/apps/pwa/out/field/index.txt +22 -22
  212. package/apps/pwa/out/healthz +1 -1
  213. package/apps/pwa/out/index.html +1 -1
  214. package/apps/pwa/out/index.txt +21 -21
  215. package/apps/pwa/out/inside/index.html +1 -1
  216. package/apps/pwa/out/inside/index.txt +21 -21
  217. package/apps/pwa/out/intake/index.html +1 -1
  218. package/apps/pwa/out/intake/index.txt +22 -22
  219. package/apps/pwa/out/live/index.html +1 -1
  220. package/apps/pwa/out/live/index.txt +22 -22
  221. package/apps/pwa/out/live-run/index.html +1 -1
  222. package/apps/pwa/out/live-run/index.txt +22 -22
  223. package/apps/pwa/out/loops/index.html +1 -1
  224. package/apps/pwa/out/loops/index.txt +21 -21
  225. package/apps/pwa/out/market/index.html +1 -1
  226. package/apps/pwa/out/market/index.txt +21 -21
  227. package/apps/pwa/out/missions/placeholder/index.html +1 -1
  228. package/apps/pwa/out/missions/placeholder/index.txt +21 -21
  229. package/apps/pwa/out/morning/index.html +1 -1
  230. package/apps/pwa/out/morning/index.txt +22 -22
  231. package/apps/pwa/out/observatory/index.html +1 -1
  232. package/apps/pwa/out/observatory/index.txt +22 -22
  233. package/apps/pwa/out/ops/checklist/index.html +1 -1
  234. package/apps/pwa/out/ops/checklist/index.txt +21 -21
  235. package/apps/pwa/out/ops/release/index.html +1 -1
  236. package/apps/pwa/out/ops/release/index.txt +21 -21
  237. package/apps/pwa/out/ops/seats/index.html +1 -1
  238. package/apps/pwa/out/ops/seats/index.txt +21 -21
  239. package/apps/pwa/out/outputs/index.html +1 -1
  240. package/apps/pwa/out/outputs/index.txt +21 -21
  241. package/apps/pwa/out/reflection/index.html +1 -1
  242. package/apps/pwa/out/reflection/index.txt +22 -22
  243. package/apps/pwa/out/scheduler/index.html +1 -1
  244. package/apps/pwa/out/scheduler/index.txt +22 -22
  245. package/apps/pwa/out/sessions/index.html +1 -1
  246. package/apps/pwa/out/sessions/index.txt +21 -21
  247. package/apps/pwa/out/settings/devices/index.html +1 -1
  248. package/apps/pwa/out/settings/devices/index.txt +22 -22
  249. package/apps/pwa/out/settings/index.html +1 -1
  250. package/apps/pwa/out/settings/index.txt +22 -22
  251. package/apps/pwa/out/setup/done/index.html +1 -1
  252. package/apps/pwa/out/setup/done/index.txt +22 -22
  253. package/apps/pwa/out/setup/index.html +1 -1
  254. package/apps/pwa/out/setup/index.txt +22 -22
  255. package/apps/pwa/out/share/index.html +1 -1
  256. package/apps/pwa/out/share/index.txt +22 -22
  257. package/apps/pwa/out/showroom/index.html +1 -1
  258. package/apps/pwa/out/showroom/index.txt +21 -21
  259. package/apps/pwa/out/tasks/index.html +1 -1
  260. package/apps/pwa/out/tasks/index.txt +22 -22
  261. package/apps/pwa/out/term/index.html +1 -1
  262. package/apps/pwa/out/term/index.txt +22 -22
  263. package/apps/pwa/out/today/index.html +1 -1
  264. package/apps/pwa/out/today/index.txt +22 -22
  265. package/apps/pwa/out/trace/index.html +1 -1
  266. package/apps/pwa/out/trace/index.txt +22 -22
  267. package/apps/pwa/out/vault/index.html +1 -1
  268. package/apps/pwa/out/vault/index.txt +22 -22
  269. package/apps/pwa/out/workflows/chat-ui/index.html +1 -1
  270. package/apps/pwa/out/workflows/chat-ui/index.txt +22 -22
  271. package/apps/pwa/out/workflows/index.html +1 -1
  272. package/apps/pwa/out/workflows/index.txt +22 -22
  273. package/apps/pwa/out/workspace/index.html +1 -1
  274. package/apps/pwa/out/workspace/index.txt +22 -22
  275. package/apps/pwa/out/worktrees/index.html +1 -1
  276. package/apps/pwa/out/worktrees/index.txt +22 -22
  277. package/bin/elanous.mjs +3 -2
  278. package/catalog/providers/opengateway.yaml +25 -0
  279. package/docs/goal-context/01-goal-authoring-checks.md +8 -0
  280. package/docs/goal-context/03-verification-menu.md +24 -0
  281. package/docs/goal-context/04-mock-scenarios.md +100 -0
  282. package/docs/goal-context/05-authoring-lessons.jsonl +47 -0
  283. package/docs/goal-context/README.md +7 -0
  284. package/graphs/catalog/catalog.yaml +1 -1
  285. package/graphs/default-loop.yaml +63 -4
  286. package/graphs/document-loop.yaml +51 -3
  287. package/graphs/implement-loop.yaml +77 -4
  288. package/graphs/journey/ta-journey.yaml +11 -1
  289. package/graphs/journey/units/author-dialogue/author-dialogue.yaml +42 -0
  290. package/graphs/journey/units/author-dialogue/observe.ts +96 -0
  291. package/graphs/journey/units/author-dialogue/recipes.yaml +10 -0
  292. package/graphs/operate-loop.yaml +51 -3
  293. package/graphs/release/recipes.yaml +6 -0
  294. package/graphs/release/release-loop.yaml +17 -4
  295. package/graphs/research-loop.yaml +137 -3
  296. package/graphs/test-diet/test-diet.yaml +3 -0
  297. package/graphs/wizard/recipes.yaml +44 -0
  298. package/graphs/wizard/wizard-loop.yaml +44 -0
  299. package/graphs/work/research-report.yaml +2 -0
  300. package/package.json +1 -1
  301. package/scripts/ci-typecheck-changed.ts +139 -5
  302. package/scripts/coord-role-pack.ts +19 -6
  303. package/scripts/first10-gate.ts +416 -0
  304. package/scripts/fleet/wsl-node-setup.sh +432 -0
  305. package/scripts/hq/standby-snapshot.ts +17 -12
  306. package/scripts/release-loop/docs-land-node.ts +21 -5
  307. package/scripts/release-loop/docs-node.ts +204 -8
  308. package/scripts/release-loop/gate-baseline-receipt.ts +155 -0
  309. package/scripts/release-loop/gate-node.ts +427 -72
  310. package/scripts/release-loop/gate-partial.ts +65 -11
  311. package/scripts/release-loop/gate-radius-live.ts +177 -0
  312. package/scripts/release-loop/gate-radius-shadow.ts +1 -1
  313. package/scripts/release-loop/node-verdict.ts +14 -1
  314. package/scripts/release-loop/npm-publish-node.ts +66 -12
  315. package/scripts/release-loop/probe-pod-host-dirs-live.ts +5 -0
  316. package/scripts/release-loop/pwa-remote.ts +166 -0
  317. package/scripts/release-loop/pwa-scenarios-node.ts +19 -3
  318. package/scripts/release-loop/resume-cap.ts +14 -34
  319. package/scripts/release-loop/resume-release.ts +78 -15
  320. package/scripts/release-loop/traffic-node.ts +59 -0
  321. package/scripts/release-loop/traffic-transition.ts +159 -0
  322. package/scripts/release-loop/unattended-release.ts +2 -0
  323. package/scripts/rhythm/daily.ts +137 -3
  324. package/scripts/test-diet/lib.ts +6 -1
  325. package/scripts/test-diet/node.ts +194 -13
  326. package/scripts/ux-sim.ts +92 -0
  327. package/skills/README.md +1 -0
  328. package/src/acp/core-turn-bridge.ts +48 -6
  329. package/src/agent/delegate-hint.ts +16 -0
  330. package/src/agent/runner.ts +82 -2
  331. package/src/agent/self-ambient-cache.ts +8 -0
  332. package/src/agent/task-notification.ts +56 -10
  333. package/src/agent/types.ts +4 -0
  334. package/src/agent-substrate/acp-reviewer.ts +39 -4
  335. package/src/agent-substrate/pr-reviewer.ts +72 -3
  336. package/src/agent-substrate/review-intent.ts +29 -2
  337. package/src/agent-substrate/review-observation.ts +3 -0
  338. package/src/agent-substrate/self-review-cli.ts +229 -28
  339. package/src/autopilot/mission-codebase-gate.ts +141 -12
  340. package/src/autopilot/pr-manager.ts +240 -41
  341. package/src/boot/daemon-tools/self-implement.ts +1 -0
  342. package/src/budget/run-usage-rollup.ts +1 -0
  343. package/src/budget/usage-outcomes.ts +8 -4
  344. package/src/capture/tui-self-report.ts +102 -0
  345. package/src/chat/goal-continue-verdict.ts +41 -0
  346. package/src/chat/index.ts +30 -6
  347. package/src/chat/internal-turn-origin.ts +1 -0
  348. package/src/chat/paste-fold.ts +86 -0
  349. package/src/chat/pickers/modal-runtime.ts +10 -27
  350. package/src/chat/tool-render/block.ts +32 -0
  351. package/src/chat/tool-render/dispatch.ts +2 -20
  352. package/src/chat/tool-render/result-text.ts +98 -0
  353. package/src/chat/turn-typeahead.ts +70 -7
  354. package/src/cli/agent-cli.ts +13 -2
  355. package/src/cli/config-audit.ts +119 -0
  356. package/src/cli/doctor-cli.ts +26 -1
  357. package/src/cli/guardian-cli.ts +10 -0
  358. package/src/cli/herdr-cli.ts +34 -0
  359. package/src/cli/light-entry-route.ts +50 -7
  360. package/src/cli/log-event-names.ts +2 -0
  361. package/src/cli/make-cli.ts +247 -11
  362. package/src/cli/msg-cli.ts +117 -3
  363. package/src/cli/pod-cli.ts +77 -3
  364. package/src/cli/pr-cli.ts +34 -18
  365. package/src/cli/pr-land-base-read.ts +11 -2
  366. package/src/cli/pr-land-heavy-remote.ts +6 -3
  367. package/src/cli/pr-land-overlap-evidence.ts +23 -4
  368. package/src/cli/pr-land-pod-shadow-job.ts +3 -0
  369. package/src/cli/pr-land-recovery.ts +117 -1
  370. package/src/cli/pty-takeover-cli.ts +8 -7
  371. package/src/cli/release-checklist-read-cli.ts +79 -0
  372. package/src/cli/release-cli.ts +92 -106
  373. package/src/cli/release-single-flight.ts +1 -1
  374. package/src/cli/remote-resolve.ts +1 -1
  375. package/src/cli/root-tui-entry.ts +48 -0
  376. package/src/cli/sim-cli.ts +22 -0
  377. package/src/cli/tasks-card-show.ts +162 -0
  378. package/src/cli/tasks-cli.ts +1065 -338
  379. package/src/cli/tasks-read-cli.ts +197 -0
  380. package/src/cli/usage-cli.ts +13 -11
  381. package/src/clipboard/history.ts +179 -13
  382. package/src/config.ts +8 -1
  383. package/src/core-turn/run-core-turn.ts +4 -2
  384. package/src/core-turn/run-goal-loop.ts +73 -16
  385. package/src/core-turn/types.ts +6 -1
  386. package/src/dashboard/chat/acp-chat.ts +8 -0
  387. package/src/dashboard/context/keys.ts +8 -31
  388. package/src/dashboard/index.ts +280 -59
  389. package/src/dashboard/input/agent-wake.ts +7 -1
  390. package/src/dashboard/input/chat-main-plain-turn-runtime.ts +146 -3
  391. package/src/dashboard/input/chat-main-slash-command.ts +4 -2
  392. package/src/dashboard/input/goal-continue.ts +210 -0
  393. package/src/dashboard/input/goal-interim.ts +2 -0
  394. package/src/dashboard/input/internal-turn.ts +2 -8
  395. package/src/dashboard/input/seat-autowake.ts +9 -7
  396. package/src/dashboard/input/turn-autoheal.ts +52 -0
  397. package/src/dashboard/render/theme-resolver.ts +33 -4
  398. package/src/dashboard/seat-boot-preamble.ts +132 -5
  399. package/src/dashboard/slash-runtime/chat-persona.ts +65 -8
  400. package/src/dashboard/slash-runtime/dashboard-handlers.ts +3 -2
  401. package/src/dashboard/slash-runtime/model-choices.ts +15 -0
  402. package/src/dashboard/stale-install-check.ts +3 -99
  403. package/src/debug/batch-queue.ts +119 -0
  404. package/src/debug/tui-log-tag.ts +67 -0
  405. package/src/display/agent-surface.ts +7 -0
  406. package/src/domains/schedule-registry.ts +16 -2
  407. package/src/domains/standalone-log-sink.ts +15 -2
  408. package/src/esc-abort-gate.ts +69 -0
  409. package/src/git-fs/idle-refresh.ts +76 -0
  410. package/src/git-fs/index.ts +18 -7
  411. package/src/git-fs/worktree.ts +137 -5
  412. package/src/graph-kinds/registry.ts +2 -2
  413. package/src/graph-runner/graph-cli.ts +18 -0
  414. package/src/graph-runner/runner.ts +173 -21
  415. package/src/graph-wizard/generate.ts +108 -4
  416. package/src/graph-wizard/steps.ts +15 -0
  417. package/src/grok/credential.ts +10 -3
  418. package/src/grounding/proactive-ground.ts +86 -0
  419. package/src/harness/control-inbox.ts +49 -1
  420. package/src/harness/harness-cli-command.ts +163 -35
  421. package/src/harness/harness-incidents.ts +85 -1
  422. package/src/harness/launch-utterance-ledger.ts +208 -0
  423. package/src/harness/pod-control-send.ts +33 -5
  424. package/src/harness/self-send-remote.ts +69 -0
  425. package/src/harness/self-send-routing-guard.ts +6 -0
  426. package/src/harness/self-send-target.ts +4 -3
  427. package/src/impl-discipline/detector.ts +16 -4
  428. package/src/impl-discipline/system-prompt.ts +11 -0
  429. package/src/impl-discipline/types.ts +2 -2
  430. package/src/index.ts +822 -154
  431. package/src/input-core/context-key-runtime.ts +21 -0
  432. package/src/intake-plane/already-built-hint.ts +4 -2
  433. package/src/intake-plane/requirement-funnel.ts +29 -1
  434. package/src/light-cli.ts +32 -11
  435. package/src/llm/opengateway-models.ts +11 -0
  436. package/src/llm/provider-credentials.ts +14 -0
  437. package/src/llm/provider-detect.ts +8 -1
  438. package/src/llm/runtime-model-family.ts +2 -1
  439. package/src/llm-wellformed.ts +70 -0
  440. package/src/llm.ts +247 -59
  441. package/src/loops/msg-wake.ts +35 -39
  442. package/src/loops/orchestrator/inbox.ts +59 -11
  443. package/src/loops/orchestrator/knowhow-pack.ts +364 -0
  444. package/src/loops/orchestrator/tick.ts +5 -1
  445. package/src/maturity/feature-maturity.ts +1 -1
  446. package/src/model-tier/llm-tier-map.ts +15 -1
  447. package/src/models/prompts.ts +17 -2
  448. package/src/msg/msg-post-office.ts +116 -0
  449. package/src/mss/logging/log-store.ts +79 -22
  450. package/src/native-tool-catalog.ts +15 -1
  451. package/src/nexus/api/decisions-route.ts +38 -18
  452. package/src/nexus/api/graph-wizard-api.ts +20 -2
  453. package/src/nexus/api/loop-resources.ts +13 -1
  454. package/src/nexus/boot/register-mcp-clients.ts +263 -38
  455. package/src/nexus/onboarding/first-boot-wizard.ts +56 -8
  456. package/src/oauth/codex.ts +7 -0
  457. package/src/onboarding/first-run.ts +37 -6
  458. package/src/onboarding/web-first.ts +43 -11
  459. package/src/ops/overview-collect.ts +30 -9
  460. package/src/ops/overview.ts +22 -9
  461. package/src/persona/loader.ts +11 -0
  462. package/src/persona/types.ts +8 -0
  463. package/src/pr-tool/census.ts +261 -27
  464. package/src/prompt-library/session-guidance.ts +14 -0
  465. package/src/provider-summary.ts +8 -0
  466. package/src/pty-shell/herdr-agent-report.ts +118 -9
  467. package/src/pty-shell/herdr-prompt.ts +266 -0
  468. package/src/pty-shell/pty-control-ipc.ts +151 -8
  469. package/src/pty-shell/pty-manifest.ts +7 -0
  470. package/src/pty-shell/pty-special-keys.ts +42 -2
  471. package/src/pty-shell/stale-install-check.ts +99 -0
  472. package/src/pty-shell/tui-run-state.ts +14 -2
  473. package/src/release-loop/auto-start.ts +20 -2
  474. package/src/release-loop/checklist.ts +100 -4
  475. package/src/release-loop/landed-but-yellow.ts +129 -5
  476. package/src/release-loop/light-rc.ts +1 -0
  477. package/src/release-loop/rehearsal.ts +37 -21
  478. package/src/repl/index.ts +192 -17
  479. package/src/repl/ops-msg-bridge.ts +32 -0
  480. package/src/seat-loop/knowhow-lint.ts +1 -1
  481. package/src/self-dev/ask-launch-flow.ts +44 -5
  482. package/src/self-dev/cli-help-text.ts +17 -0
  483. package/src/self-dev/decompose-proposal.ts +172 -20
  484. package/src/self-dev/decompose.ts +61 -0
  485. package/src/self-dev/dev-cli.ts +48 -12
  486. package/src/self-dev/dev-pipeline.ts +8 -2
  487. package/src/self-dev/draft-residue.ts +37 -1
  488. package/src/self-dev/draft-sweep.ts +137 -11
  489. package/src/self-dev/draft-triage-rules.ts +138 -0
  490. package/src/self-dev/fleet-reduce.ts +3 -2
  491. package/src/self-dev/glm-credential-guard.ts +77 -0
  492. package/src/self-dev/graph-front-nodes.ts +112 -0
  493. package/src/self-dev/graph-journey-nodes.ts +2 -0
  494. package/src/self-dev/graph-journey-route.ts +12 -2
  495. package/src/self-dev/harness-run-cli.ts +3 -15
  496. package/src/self-dev/orchestrate-cli-text.ts +10 -0
  497. package/src/self-dev/orchestrate-cli.ts +68 -3
  498. package/src/self-dev/orchestrate.ts +116 -17
  499. package/src/self-dev/review-provider-fallback.ts +35 -1
  500. package/src/self-dev/run-supervisor.ts +55 -2
  501. package/src/self-dev/run-types.ts +1 -1
  502. package/src/self-dev/self-orchestrate-runtime.ts +1 -11
  503. package/src/self-dev/shard-aggregate.ts +42 -5
  504. package/src/self-dev/shard-run.ts +8 -1
  505. package/src/self-health/autoheal.ts +153 -0
  506. package/src/self-health/signatures.ts +6 -0
  507. package/src/self-implement/blocked-draft-policy.ts +20 -0
  508. package/src/self-implement/classify-shadow.ts +3 -7
  509. package/src/self-implement/device-first.ts +116 -0
  510. package/src/self-implement/doctor-visit.ts +257 -2
  511. package/src/self-implement/evidence-command-budget.ts +80 -0
  512. package/src/self-implement/gate-baseline.ts +56 -17
  513. package/src/self-implement/gate-cli.ts +1 -0
  514. package/src/self-implement/gate-remote.ts +31 -20
  515. package/src/self-implement/goal-author-cli.ts +1 -0
  516. package/src/self-implement/goal-author-decompose.ts +534 -45
  517. package/src/self-implement/goal-author.ts +282 -7
  518. package/src/self-implement/goal-elaborate.ts +449 -0
  519. package/src/self-implement/goal-refine.ts +273 -0
  520. package/src/self-implement/graph-overlay-yaml.ts +14 -3
  521. package/src/self-implement/graph-variant.ts +40 -6
  522. package/src/self-implement/headless-elanous-driver.ts +19 -3
  523. package/src/self-implement/off-diff-evidence.ts +58 -6
  524. package/src/self-implement/orchestrator.ts +370 -62
  525. package/src/self-implement/pod-warm-pool-profile.ts +1 -0
  526. package/src/self-implement/pwa-import-graph.ts +1 -1
  527. package/src/self-implement/rework-budget-judgment.ts +5 -8
  528. package/src/self-implement/rework-policy.ts +30 -0
  529. package/src/self-implement/run-ledger.ts +108 -0
  530. package/src/self-implement/run-stop.ts +10 -1
  531. package/src/self-implement/run-ttl.ts +38 -24
  532. package/src/self-implement/running-runs.ts +29 -1
  533. package/src/self-implement/scope-adjacency.ts +115 -0
  534. package/src/self-implement/seams.ts +187 -28
  535. package/src/self-implement/stop-autoheal.ts +87 -1
  536. package/src/self-implement/wiring-check.ts +358 -0
  537. package/src/session-runtime/index.ts +1 -1
  538. package/src/setup/llm-env-detect.ts +5 -0
  539. package/src/shell-env-bootstrap.ts +11 -4
  540. package/src/skills/runner.ts +4 -2
  541. package/src/skills/tools/agent.ts +408 -40
  542. package/src/skills/tools/msg-ask.ts +100 -0
  543. package/src/skills/tools/ops-ledger.ts +2 -1
  544. package/src/skills/tools/schedule-wakeup.ts +23 -4
  545. package/src/skills/tools/shell.ts +61 -6
  546. package/src/skills/tools/terminal-modal-inject.ts +1 -2
  547. package/src/skills/tools/terminal-modal.ts +10 -8
  548. package/src/skills/url-router.ts +41 -1
  549. package/src/smart-wizard/run.ts +66 -0
  550. package/src/status/bar.ts +34 -6
  551. package/src/status/status-provider-info.ts +37 -6
  552. package/src/steward/hold-hygiene.ts +24 -6
  553. package/src/steward/rejudge-tick.ts +10 -2
  554. package/src/steward/ta-repair-event-collect.ts +17 -6
  555. package/src/steward/triage-budget.ts +194 -0
  556. package/src/steward/triage.ts +20 -3
  557. package/src/task-agent/actions.ts +72 -2
  558. package/src/task-agent/green-sweep.ts +4 -0
  559. package/src/task-agent/land-queue.ts +21 -8
  560. package/src/task-agent/live-moves.ts +182 -10
  561. package/src/task-agent/mission.ts +30 -0
  562. package/src/task-agent/parent-host.ts +123 -3
  563. package/src/task-agent/rejudge-on-head.ts +15 -0
  564. package/src/task-agent/repair-cycle.ts +138 -32
  565. package/src/task-agent/repair-next-move.ts +31 -3
  566. package/src/task-agent/repair-outcomes.ts +29 -0
  567. package/src/task-agent/repair-worker.ts +14 -4
  568. package/src/task-agent/shadow.ts +48 -4
  569. package/src/task-agent/task-card-prefix.ts +2 -0
  570. package/src/task-agent/task-hand.ts +525 -57
  571. package/src/task-agent/task-parent-role-llm.ts +36 -0
  572. package/src/task-agent/tier-split.ts +196 -0
  573. package/src/task-agent/work-order-build.ts +2 -0
  574. package/src/task-agent/work-order.ts +3 -2
  575. package/src/task-orchestrator/generator-prompt.ts +60 -11
  576. package/src/task-orchestrator/surfaces/pod-account-broker.ts +42 -0
  577. package/src/task-orchestrator/surfaces/pod-child-providers.ts +1 -1
  578. package/src/task-orchestrator/surfaces/pod-child-reuse.ts +146 -0
  579. package/src/task-orchestrator/surfaces/pod-command-job.ts +130 -11
  580. package/src/task-orchestrator/surfaces/pod-failure-reason.ts +215 -3
  581. package/src/task-orchestrator/surfaces/pod-image-source.ts +89 -1
  582. package/src/task-orchestrator/surfaces/pod-launch-history.ts +133 -0
  583. package/src/task-orchestrator/surfaces/pod-lease.ts +17 -8
  584. package/src/task-orchestrator/surfaces/pod-manifest-test-normalize.ts +19 -2
  585. package/src/task-orchestrator/surfaces/pod-pool.ts +76 -4
  586. package/src/task-orchestrator/surfaces/pod-provenance.ts +82 -0
  587. package/src/task-orchestrator/surfaces/pod-repair-commit.ts +18 -3
  588. package/src/task-orchestrator/surfaces/pod-si-warm-entry.ts +16 -0
  589. package/src/task-orchestrator/surfaces/pod-si-warm-host.ts +224 -0
  590. package/src/task-orchestrator/surfaces/pod-si-warm-protocol.ts +201 -0
  591. package/src/task-orchestrator/surfaces/pod-si-warm-provider.ts +444 -0
  592. package/src/task-orchestrator/surfaces/pod-si-warm-runner.ts +387 -0
  593. package/src/task-orchestrator/surfaces/pod-si-warm-transport.ts +157 -0
  594. package/src/task-orchestrator/surfaces/pod-source-receive.ts +18 -0
  595. package/src/task-orchestrator/surfaces/pod-warm-provenance.ts +81 -0
  596. package/src/task-orchestrator/surfaces/pod-warm-worker-pod.ts +6 -2
  597. package/src/task-orchestrator/surfaces/pod-warm-worker-protocol.ts +7 -0
  598. package/src/task-orchestrator/surfaces/pod-warm-worker-provider.ts +521 -40
  599. package/src/task-orchestrator/surfaces/pod-warm-worker-runtime.ts +3 -0
  600. package/src/task-orchestrator/surfaces/self-implement-pod.ts +759 -50
  601. package/src/task-orchestrator/surfaces/self-implement.ts +65 -2
  602. package/src/tool-runtime/index.ts +15 -2
  603. package/src/tool-runtime/mcp-proxy-bootstrap.ts +29 -0
  604. package/src/tool-runtime/ops-ledger-runtimes.ts +10 -2
  605. package/src/tty-foreground.ts +155 -0
  606. package/src/tui/README.md +2 -0
  607. package/src/tui/chat/background-job-status.ts +54 -0
  608. package/src/tui/chat/goal-interim.ts +173 -0
  609. package/src/tui/chat/log-view.ts +267 -0
  610. package/src/tui/chat/self-health-status.ts +232 -0
  611. package/src/tui/entry.ts +695 -0
  612. package/src/tui/input/composer.ts +151 -0
  613. package/src/tui/seat-mail-boot.ts +59 -0
  614. package/src/tui/slash/compact-command.ts +7 -0
  615. package/src/tui/slash/compact.ts +94 -0
  616. package/src/tui/slash/new-session.ts +35 -0
  617. package/src/tui/slash/resume.ts +75 -0
  618. package/src/tui-client/local-chat-turn.ts +282 -0
  619. package/src/tui-client/local-harness-command.ts +63 -0
  620. package/src/tui-client/local-provider-command.ts +184 -0
  621. package/src/tui-client/next-dashboard-runtime.ts +8 -0
  622. package/src/tui-client/next-loop-command.ts +70 -0
  623. package/src/tui-client/next-wakeup.ts +191 -0
  624. package/src/tui.ts +37 -0
  625. package/src/ui/modal-adapter.ts +2 -2
  626. package/src/user-config.ts +4 -2
  627. package/src/ux-sim/classic-tui-seat-scenarios.ts +516 -0
  628. package/src/ux-sim/cli-config-audit-device.ts +121 -0
  629. package/src/ux-sim/dashboard-event-loop-stall-monitor-device.ts +238 -0
  630. package/src/ux-sim/event-monkey.ts +379 -0
  631. package/src/ux-sim/fake-bin.ts +87 -7
  632. package/src/ux-sim/fake-herdr.ts +238 -0
  633. package/src/ux-sim/fake-llm.ts +111 -6
  634. package/src/ux-sim/fault-glm-no-credential.ts +116 -0
  635. package/src/ux-sim/fault-nextmove-dispatch.ts +367 -0
  636. package/src/ux-sim/fault-pod-codex-503.ts +211 -0
  637. package/src/ux-sim/fault-scope-escape-lift.ts +216 -0
  638. package/src/ux-sim/fault-tui-400-autoheal.ts +297 -0
  639. package/src/ux-sim/goal-device.ts +619 -0
  640. package/src/ux-sim/in-process-cli.ts +22 -5
  641. package/src/ux-sim/mock-authoring-first-run-child.ts +35 -0
  642. package/src/ux-sim/mock-authoring-first-run.ts +97 -0
  643. package/src/ux-sim/mock-seat-pty-frame-child.ts +29 -0
  644. package/src/ux-sim/mock-seat-pty-frame.ts +297 -0
  645. package/src/ux-sim/mock-seat-pty-sequence-child.ts +21 -0
  646. package/src/ux-sim/mock-seat-pty-sequence.ts +206 -0
  647. package/src/ux-sim/next-tui-seat-scenarios.ts +631 -0
  648. package/src/ux-sim/onboarding-first-run-device.ts +269 -0
  649. package/src/ux-sim/pty-key-modifiers-device.ts +85 -0
  650. package/src/ux-sim/subagent-tools-device.ts +81 -0
  651. package/src/ux-sim/task-orchestrator-surfaces-self-implement-pod-device.ts +250 -0
  652. package/src/ux-sim/tty-foreground-steal-child.ts +21 -0
  653. package/src/version/packed-revision.json +1 -1
  654. package/apps/pwa/out/_next/static/chunks/1162.c69abda138c7ce43.js +0 -79
  655. package/apps/pwa/out/_next/static/chunks/1449-1fede62af84c3e43.js +0 -1
  656. package/apps/pwa/out/_next/static/chunks/1598-13fc845935e816df.js +0 -1
  657. package/apps/pwa/out/_next/static/chunks/1639.62c5e16fa20d242f.js +0 -94
  658. package/apps/pwa/out/_next/static/chunks/1661-adb8b2babc9aaf8c.js +0 -1
  659. package/apps/pwa/out/_next/static/chunks/2147.107c0fc6146fb15a.js +0 -23
  660. package/apps/pwa/out/_next/static/chunks/2202-ef1c9b000c3074fc.js +0 -1
  661. package/apps/pwa/out/_next/static/chunks/2247.1e326638ee43e672.js +0 -115
  662. package/apps/pwa/out/_next/static/chunks/2268.56e1e3d58180abae.js +0 -8
  663. package/apps/pwa/out/_next/static/chunks/2469-606819c812414021.js +0 -1
  664. package/apps/pwa/out/_next/static/chunks/2593.e53c1620c0bb3599.js +0 -1
  665. package/apps/pwa/out/_next/static/chunks/2690.e96671114222676a.js +0 -1
  666. package/apps/pwa/out/_next/static/chunks/2898-79ee1a5cc0cd9d13.js +0 -1
  667. package/apps/pwa/out/_next/static/chunks/298.26099a9f65e5c8ff.js +0 -1
  668. package/apps/pwa/out/_next/static/chunks/2987-30cf9c2eb7b8bdd5.js +0 -1
  669. package/apps/pwa/out/_next/static/chunks/2992.51fc2a7295bd8139.js +0 -1
  670. package/apps/pwa/out/_next/static/chunks/3001-5a52788c813b6113.js +0 -1
  671. package/apps/pwa/out/_next/static/chunks/3014-291245fba9df7b5b.js +0 -1
  672. package/apps/pwa/out/_next/static/chunks/3068.ee78201f0251a18d.js +0 -1
  673. package/apps/pwa/out/_next/static/chunks/3083.cd399a17e9365f78.js +0 -1
  674. package/apps/pwa/out/_next/static/chunks/3117-e1c474683fd1f824.js +0 -1
  675. package/apps/pwa/out/_next/static/chunks/3251-2c17bd5a91f8de2e.js +0 -1
  676. package/apps/pwa/out/_next/static/chunks/326.3fb32322bb2ddf6d.js +0 -1
  677. package/apps/pwa/out/_next/static/chunks/3421-7ff7fbaa156985a7.js +0 -1
  678. package/apps/pwa/out/_next/static/chunks/381.f55dc63ea87735e6.js +0 -1
  679. package/apps/pwa/out/_next/static/chunks/4129-ab0a6189f1778633.js +0 -1
  680. package/apps/pwa/out/_next/static/chunks/4361.93d14ba594b3a035.js +0 -104
  681. package/apps/pwa/out/_next/static/chunks/4364.7a7eb19cceb67d2f.js +0 -286
  682. package/apps/pwa/out/_next/static/chunks/4406.d71f506f7c3ee9d3.js +0 -149
  683. package/apps/pwa/out/_next/static/chunks/4461.2ad1514180ae7e29.js +0 -148
  684. package/apps/pwa/out/_next/static/chunks/4479.bd309cbe0e3842ee.js +0 -64
  685. package/apps/pwa/out/_next/static/chunks/4522-05966f777d66d13b.js +0 -1
  686. package/apps/pwa/out/_next/static/chunks/4543-9a3e9812e845de65.js +0 -1
  687. package/apps/pwa/out/_next/static/chunks/4557.f8f1d84a0d90d590.js +0 -74
  688. package/apps/pwa/out/_next/static/chunks/4589-79b11542179ef58c.js +0 -1
  689. package/apps/pwa/out/_next/static/chunks/4633-9f8f9f88ffbb8f5c.js +0 -1
  690. package/apps/pwa/out/_next/static/chunks/4831.23af4d10c0697b5e.js +0 -1
  691. package/apps/pwa/out/_next/static/chunks/4983.5951b85724f61f2a.js +0 -1
  692. package/apps/pwa/out/_next/static/chunks/5028-f0722e6114c313e7.js +0 -1
  693. package/apps/pwa/out/_next/static/chunks/5249.96a848656b582a93.js +0 -1
  694. package/apps/pwa/out/_next/static/chunks/5311.16e0ffbfa5468b80.js +0 -62
  695. package/apps/pwa/out/_next/static/chunks/5489.ec2dd1b5272a19dc.js +0 -24
  696. package/apps/pwa/out/_next/static/chunks/559.df87695df637920c.js +0 -1
  697. package/apps/pwa/out/_next/static/chunks/5618-5c88f2f70178c4ad.js +0 -1
  698. package/apps/pwa/out/_next/static/chunks/5764.05487bf0b73ddb6b.js +0 -1
  699. package/apps/pwa/out/_next/static/chunks/5930.e678826c3f831aab.js +0 -1
  700. package/apps/pwa/out/_next/static/chunks/5dfb57f7.f2e3305326202474.js +0 -1
  701. package/apps/pwa/out/_next/static/chunks/6053-d893974de92e6198.js +0 -1
  702. package/apps/pwa/out/_next/static/chunks/6200-cefd6f33f59d765e.js +0 -1
  703. package/apps/pwa/out/_next/static/chunks/6314-edeba650ae686ac9.js +0 -1
  704. package/apps/pwa/out/_next/static/chunks/6316-bc9a9b74d7842d79.js +0 -1
  705. package/apps/pwa/out/_next/static/chunks/6476-13b9779b73528008.js +0 -1
  706. package/apps/pwa/out/_next/static/chunks/666-04db3ac4c8e3c66f.js +0 -1
  707. package/apps/pwa/out/_next/static/chunks/670.682e55106ef915a6.js +0 -77
  708. package/apps/pwa/out/_next/static/chunks/6816.b7ba9d0a1a4a46a7.js +0 -1
  709. package/apps/pwa/out/_next/static/chunks/690-fbbcc777f189af37.js +0 -1
  710. package/apps/pwa/out/_next/static/chunks/6989.0d3d4020e5cb3df6.js +0 -90
  711. package/apps/pwa/out/_next/static/chunks/7193-cf355cca5ba6c5d5.js +0 -1
  712. package/apps/pwa/out/_next/static/chunks/7217-d17393fe7af78fa6.js +0 -1
  713. package/apps/pwa/out/_next/static/chunks/7232.24edbd938a69c8d0.js +0 -1
  714. package/apps/pwa/out/_next/static/chunks/7295cd1e.b4b557908888eeee.js +0 -1
  715. package/apps/pwa/out/_next/static/chunks/7323.adb02de21991883c.js +0 -1
  716. package/apps/pwa/out/_next/static/chunks/7386.5d8e7e42e818dfb6.js +0 -287
  717. package/apps/pwa/out/_next/static/chunks/7448.478958ffbbba0ac0.js +0 -1
  718. package/apps/pwa/out/_next/static/chunks/7537.ba2208c5c656b8a3.js +0 -1
  719. package/apps/pwa/out/_next/static/chunks/7596-962ae6db6cfc9c83.js +0 -1
  720. package/apps/pwa/out/_next/static/chunks/7671.cff51beac212a2ba.js +0 -1
  721. package/apps/pwa/out/_next/static/chunks/7883.3916734ee16d3e58.js +0 -27
  722. package/apps/pwa/out/_next/static/chunks/7952.b192c31b6a0e00cc.js +0 -1
  723. package/apps/pwa/out/_next/static/chunks/801.5b24e81eded22d1b.js +0 -1
  724. package/apps/pwa/out/_next/static/chunks/8176.8c9a8613f5a01ac1.js +0 -36
  725. package/apps/pwa/out/_next/static/chunks/819e78a6.fa3dd7f7da19bf61.js +0 -1
  726. package/apps/pwa/out/_next/static/chunks/8220-78978450c3183d8d.js +0 -1
  727. package/apps/pwa/out/_next/static/chunks/8221-eb60b5bc692a3361.js +0 -1
  728. package/apps/pwa/out/_next/static/chunks/826.e9a26064f474949e.js +0 -1
  729. package/apps/pwa/out/_next/static/chunks/8459-a351487a4480f584.js +0 -1
  730. package/apps/pwa/out/_next/static/chunks/8482-75823d513a4ce151.js +0 -1
  731. package/apps/pwa/out/_next/static/chunks/8488.8da515248cda3f3a.js +0 -1
  732. package/apps/pwa/out/_next/static/chunks/8584.388a1779d9b203af.js +0 -1
  733. package/apps/pwa/out/_next/static/chunks/8637.a55e098e61ffefb8.js +0 -1
  734. package/apps/pwa/out/_next/static/chunks/9207-8e6a12db30373f32.js +0 -1
  735. package/apps/pwa/out/_next/static/chunks/9263-00ae932c62696a86.js +0 -1
  736. package/apps/pwa/out/_next/static/chunks/9318.caafc3a130e8769c.js +0 -1
  737. package/apps/pwa/out/_next/static/chunks/932.da3fb55951882562.js +0 -93
  738. package/apps/pwa/out/_next/static/chunks/9433.002f8426ac75b6b7.js +0 -1
  739. package/apps/pwa/out/_next/static/chunks/9464.dd631a5a14b1d660.js +0 -24
  740. package/apps/pwa/out/_next/static/chunks/9739.8d5f36ac67a3b236.js +0 -1
  741. package/apps/pwa/out/_next/static/chunks/9743.beeabb9d5f86abe4.js +0 -1
  742. package/apps/pwa/out/_next/static/chunks/9843-a23d3f32dc43f715.js +0 -1
  743. package/apps/pwa/out/_next/static/chunks/994-28211077c7c587d5.js +0 -1
  744. package/apps/pwa/out/_next/static/chunks/app/_not-found/page-3b4c947f174e33d8.js +0 -1
  745. package/apps/pwa/out/_next/static/chunks/app/approvals/page-369d5ce99483f859.js +0 -1
  746. package/apps/pwa/out/_next/static/chunks/app/autopilot/page-63c0ed0eb26e5fce.js +0 -1
  747. package/apps/pwa/out/_next/static/chunks/app/board/page-62802c6003bc85cc.js +0 -1
  748. package/apps/pwa/out/_next/static/chunks/app/botlab/page-ecb41560d4e77be9.js +0 -1
  749. package/apps/pwa/out/_next/static/chunks/app/bots/page-7b65ad8130c93e95.js +0 -1
  750. package/apps/pwa/out/_next/static/chunks/app/ceo/page-8755477c15a9060c.js +0 -1
  751. package/apps/pwa/out/_next/static/chunks/app/chat/page-5725447dd972c471.js +0 -1
  752. package/apps/pwa/out/_next/static/chunks/app/consult/page-b979de0591a69375.js +0 -1
  753. package/apps/pwa/out/_next/static/chunks/app/control/page-6d0796bf4633751a.js +0 -1
  754. package/apps/pwa/out/_next/static/chunks/app/decisions/page-59c31dc0394e67b4.js +0 -1
  755. package/apps/pwa/out/_next/static/chunks/app/design-check/page-12dfc95f6cc5c718.js +0 -1
  756. package/apps/pwa/out/_next/static/chunks/app/editor/page-25788244e66aa4dd.js +0 -1
  757. package/apps/pwa/out/_next/static/chunks/app/exec/page-a2555dc705466322.js +0 -1
  758. package/apps/pwa/out/_next/static/chunks/app/healthz/route-3b4c947f174e33d8.js +0 -1
  759. package/apps/pwa/out/_next/static/chunks/app/inside/page-578729adbeaa40cb.js +0 -1
  760. package/apps/pwa/out/_next/static/chunks/app/intake/page-a1d20fffbec35205.js +0 -1
  761. package/apps/pwa/out/_next/static/chunks/app/layout-4a558f94516b8004.js +0 -1
  762. package/apps/pwa/out/_next/static/chunks/app/live/page-9e3834705b86145e.js +0 -1
  763. package/apps/pwa/out/_next/static/chunks/app/live-run/page-d7bff0f0905a662c.js +0 -1
  764. package/apps/pwa/out/_next/static/chunks/app/loops/page-cb1c5fe746ea4014.js +0 -1
  765. package/apps/pwa/out/_next/static/chunks/app/market/page-9ee320507356582a.js +0 -1
  766. package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-66fd183b74835886.js +0 -1
  767. package/apps/pwa/out/_next/static/chunks/app/morning/page-3272a064a01a9927.js +0 -1
  768. package/apps/pwa/out/_next/static/chunks/app/not-found-f281b7a7f6ef2529.js +0 -1
  769. package/apps/pwa/out/_next/static/chunks/app/observatory/page-d45a65f8b7124fcd.js +0 -1
  770. package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-e9c1fe684dd19a66.js +0 -1
  771. package/apps/pwa/out/_next/static/chunks/app/ops/release/page-b8322932fc6e34de.js +0 -1
  772. package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-82c66d9af2290575.js +0 -1
  773. package/apps/pwa/out/_next/static/chunks/app/outputs/page-63c6752009c97b05.js +0 -1
  774. package/apps/pwa/out/_next/static/chunks/app/page-bb33d42ebc358aec.js +0 -1
  775. package/apps/pwa/out/_next/static/chunks/app/reflection/page-7e4c9379197d7214.js +0 -1
  776. package/apps/pwa/out/_next/static/chunks/app/scheduler/page-38bf1e9a7001732b.js +0 -1
  777. package/apps/pwa/out/_next/static/chunks/app/sessions/page-2e5b752012389d56.js +0 -1
  778. package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-398c0faa173203f7.js +0 -1
  779. package/apps/pwa/out/_next/static/chunks/app/settings/page-002f53a965b6445c.js +0 -1
  780. package/apps/pwa/out/_next/static/chunks/app/setup/done/page-7f75997f61a26269.js +0 -1
  781. package/apps/pwa/out/_next/static/chunks/app/setup/layout-3b4c947f174e33d8.js +0 -1
  782. package/apps/pwa/out/_next/static/chunks/app/setup/page-05631753294f23fb.js +0 -1
  783. package/apps/pwa/out/_next/static/chunks/app/share/page-edd700fd2cc3d7f8.js +0 -1
  784. package/apps/pwa/out/_next/static/chunks/app/showroom/page-105f83ecb4594365.js +0 -1
  785. package/apps/pwa/out/_next/static/chunks/app/tasks/page-5823e87d2017f19c.js +0 -1
  786. package/apps/pwa/out/_next/static/chunks/app/term/page-df3445b207ceceab.js +0 -1
  787. package/apps/pwa/out/_next/static/chunks/app/today/page-b51ca09566c03de7.js +0 -1
  788. package/apps/pwa/out/_next/static/chunks/app/trace/page-8aacd5ded5dbac60.js +0 -1
  789. package/apps/pwa/out/_next/static/chunks/app/vault/page-bae3365a0b3c6a8e.js +0 -1
  790. package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-9ed52b48ff1aa7fd.js +0 -1
  791. package/apps/pwa/out/_next/static/chunks/app/workflows/page-b6f8cad35fe00946.js +0 -1
  792. package/apps/pwa/out/_next/static/chunks/app/workspace/page-6d25ceda500d2457.js +0 -1
  793. package/apps/pwa/out/_next/static/chunks/app/worktrees/page-b6401a5f2c962fe8.js +0 -1
  794. package/apps/pwa/out/_next/static/chunks/ebf6cf5e.0d2f887b040e80fb.js +0 -122
  795. package/apps/pwa/out/_next/static/chunks/f09ec7d7-d29abe23edcbb193.js +0 -1
  796. package/apps/pwa/out/_next/static/chunks/framework-9322cb8a56ac081c.js +0 -1
  797. package/apps/pwa/out/_next/static/chunks/main-2fbab294e49a1561.js +0 -1
  798. package/apps/pwa/out/_next/static/chunks/main-app-f36729f56621a8f3.js +0 -1
  799. package/apps/pwa/out/_next/static/chunks/pages/_app-2a62e450b47c6114.js +0 -1
  800. package/apps/pwa/out/_next/static/chunks/pages/_error-5e17f7b445f34d43.js +0 -1
  801. package/apps/pwa/out/_next/static/chunks/webpack-b4263e2190ea7adf.js +0 -1
  802. /package/apps/pwa/out/_next/static/{L04y73dlwKeTW-GetaTF3 → uC-N0emedeNOFuaBQFv-I}/_ssgManifest.js +0 -0
@@ -328,6 +328,7 @@ import { composeDashboardKeyHandlers, dispatchDashboardKey } from './input/key-d
328
328
  import { runDashboardChatMainEntry } from './input/chat-main-entry-runtime.js';
329
329
  import { createMirrorDrawThrottle } from './mirror-draw-throttle.js';
330
330
  import { runDashboardChatMainPlainTurn } from './input/chat-main-plain-turn-runtime.js';
331
+ import { createDashboardTurnAutoheal } from './input/turn-autoheal.js';
331
332
  import {
332
333
  createDashboardChatMainTurnSubmit,
333
334
  runDashboardChatMainSubmitIntent,
@@ -451,7 +452,7 @@ import { FoldStack } from '../fold-stack.js';
451
452
  import { getSkillIndex, reloadSkillIndex, applySkillFilter, skillIndexProblems } from '../skills/index.js';
452
453
  import { skillRepairNotice } from '../skills/repair.js';
453
454
  import type { DetectResult } from '../skills/router.js';
454
- import { detectUrlRoute } from '../skills/url-router.js';
455
+ import { detectUrlRoute, extractUrls, workContextGuardReason } from '../skills/url-router.js';
455
456
  import {
456
457
  observeDevRequestRouteFailSoft,
457
458
  type DevRequestRoutingConfig,
@@ -541,6 +542,54 @@ export function settleEscAbortPendingLines(lines: string[], fromIndex: number):
541
542
  }
542
543
  }
543
544
 
545
+ export interface EscAbortPendingSoftStopDeps {
546
+ /** Live foreground harness space for this turn — null when unidentified or multiple runs. */
547
+ getActiveHarnessSpace: () => string | null;
548
+ /** Push a line into the chat transcript. */
549
+ pushChatLine: (line: string) => void;
550
+ /** Self-implement hint line; returns true when it consumed the event. */
551
+ showHarnessEscHint: (targets: readonly string[]) => boolean;
552
+ }
553
+
554
+ export type EscAbortPendingSoftStopOutcome = 'stopped' | 'failed' | 'hint' | 'waiting';
555
+
556
+ export interface EscAbortPendingSoftStopResult {
557
+ outcome: EscAbortPendingSoftStopOutcome;
558
+ /** Harness space that received the durable stop marker, when any. */
559
+ stoppedHarnessSpace: string | null;
560
+ }
561
+
562
+ /**
563
+ * ⭐ TUI-ESC-EXIT production seam — the ESC soft-stop callback that
564
+ * `attachChatStreamingKeys` wires into `createEscAbortGate`'s
565
+ * `onAbortPending`, extracted as a directly callable export so the incident
566
+ * test (test/esc-harness-stop.test.ts) exercises the same function the
567
+ * dashboard executes. Identified foreground harness space → enqueue the real
568
+ * durable soft-stop marker (`enqueueSoftStop`) and verify it
569
+ * (`readSoftStopRequestStatus`), pushing the Korean stopped/failure line;
570
+ * unidentified/multiple-run falls back to the self-implement hint, else the
571
+ * caller paints the waiting line (`waiting`).
572
+ */
573
+ export function runEscAbortPendingSoftStop(
574
+ targets: readonly string[],
575
+ deps: EscAbortPendingSoftStopDeps,
576
+ ): EscAbortPendingSoftStopResult {
577
+ const spaceId = deps.getActiveHarnessSpace();
578
+ if (spaceId) {
579
+ try {
580
+ enqueueSoftStop(spaceId);
581
+ if (readSoftStopRequestStatus(spaceId).status !== 'present') throw new Error('soft-stop marker not persisted');
582
+ deps.pushChatLine(' ⏹ 멈췄다 — 해당 하니스 런에 중단 요청을 보냈습니다.');
583
+ return { outcome: 'stopped', stoppedHarnessSpace: spaceId };
584
+ } catch {
585
+ deps.pushChatLine(' ⚠ 하니스 런 중단 요청을 보내지 못했습니다. /harness runs 에서 확인해 주세요.');
586
+ return { outcome: 'failed', stoppedHarnessSpace: null };
587
+ }
588
+ }
589
+ if (deps.showHarnessEscHint(targets)) return { outcome: 'hint', stoppedHarnessSpace: null };
590
+ return { outcome: 'waiting', stoppedHarnessSpace: null };
591
+ }
592
+
544
593
  export type DashboardToolDispatchSignalSource = 'parent-turn' | 'fallback';
545
594
 
546
595
  export interface DashboardToolDispatchSignalObservation {
@@ -646,7 +695,7 @@ import { getModelFamily, getModelTier } from '../models/prompts.js';
646
695
  import { buildPromptInjection, getPromptBankStore } from '../prompt-bank/index.js';
647
696
  import { getInputHistoryStore } from '../input-history.js';
648
697
  import { inspectActiveProvider } from '../provider-summary.js';
649
- import { createStatusProviderInfoReader } from '../status/status-provider-info.js';
698
+ import { createStatusProviderInfoReader, statusModelActual } from '../status/status-provider-info.js';
650
699
  import { activeCodexAccountView } from '../oauth/codex-account-store.js';
651
700
  import { buildDashboardStatusLines, readDashboardSeatsNow, type DashboardStatusLinesInput } from './dashboard-status-lines.js';
652
701
  import { buildFirstScreenBand, resolveTuiDaemonLink, type TuiDaemonLink } from './first-screen-band.js';
@@ -889,7 +938,8 @@ import {
889
938
  refreshDirtyAsync as refreshGitDirtyAsync,
890
939
  refreshGitSnapshotAsync,
891
940
  } from '../git-fs/index.js';
892
- import { refreshSelfAmbientCache } from '../agent/self-ambient-cache.js';
941
+ import { createIdleGitPoll, dashboardIdleMs, gitDirtyRefreshIntervalMs } from '../git-fs/idle-refresh.js';
942
+ import { refreshSelfAmbientCache, selfAmbientKeepWarmIntervalMs } from '../agent/self-ambient-cache.js';
893
943
  import { getPty, listPty, requestPtyTakeover } from '../pty-shell/registry.js';
894
944
  import { listPtyManifestRowsAt } from '../pty-shell/pty-manifest.js';
895
945
  import { ptyManifestTargets } from '../domains/fleet.js';
@@ -1038,7 +1088,9 @@ import { createQuitConfirmationState, gracefulQuit, type QuitConfirmationState }
1038
1088
  import { consumeTurnEndInterrupted, handoffTurnTypeaheadAtTurnEnd, releaseTurnTypeaheadPending, runTurnTypeaheadPushNow, steerLastTurnTypeaheadSubmission } from './input/turn-steer-bridge.js';
1039
1089
  import { abortTurnOnly } from '../turn-abort-scope.js';
1040
1090
  import { consumeInternalTurnYield, createInternalTurnGate, formatInternalTurnBanner, resolveInternalTurnSubmitIntent, type InternalTurnRequest } from './input/internal-turn.js';
1091
+ import { createClassicInterimFold } from './input/goal-interim.js';
1041
1092
  import { createSeatAutowake } from './input/seat-autowake.js';
1093
+ import { createGoalContinue } from './input/goal-continue.js';
1042
1094
  import { createDashboardWakeupScheduler, registerScheduleWakeupHostTool } from '../skills/tools/schedule-wakeup.js';
1043
1095
  import { createAttachmentRowMap } from '../log-pane/attachment-row-map.js';
1044
1096
  import { createAttachmentPopup, type AttachmentPopupAction } from '../log-pane/attachment-popup.js';
@@ -1066,7 +1118,7 @@ import {
1066
1118
  AGENT_ACTIVITY_SEGMENT_KEY,
1067
1119
  PULSE_HALF_PERIOD_MS,
1068
1120
  } from '../agent-activity-hud.js';
1069
- import { DASHBOARD_CLARIFICATION_REQUEST, consumeStreamingTopModalEscape, createEscAbortGate, createHarnessEscHint, routeStreamingEscapeKey } from '../esc-abort-gate.js';
1121
+ import { DASHBOARD_CLARIFICATION_REQUEST, consumeStreamingTopModalEscape, createEscAbortGate, createEscAbortPendingGate, createHarnessEscHint, routeStreamingEscapeKey } from '../esc-abort-gate.js';
1070
1122
  import { enqueueSoftStop, readSoftStopRequestStatus } from '../harness/control-inbox.js';
1071
1123
  import { setSelfImplementSoftStopSpaceObserver } from '../self-implement/self-implement-runtime.js';
1072
1124
  import { createViEditor, type ViEditorHandle } from '../vi-editor.js';
@@ -1160,7 +1212,7 @@ import { agentBatchScratchTitle, renderAgentBatchScratch } from '../display/agen
1160
1212
  import { type ExecutionSurfaceHandle } from '../display/index.js';
1161
1213
  import { AgentSurfaceStore, renderAgentDetail, renderAgentRoster, type AgentSurfaceState } from '../display/agent-surface.js';
1162
1214
  import { globalAgentFlash } from '../display/agent-flash.js';
1163
- import { globalTaskNotificationQueue } from '../agent/task-notification.js';
1215
+ import { globalTaskNotificationQueue, type TaskNotificationQueue, type PendingTaskNotification } from '../agent/task-notification.js';
1164
1216
  import { createDashboardAgentWakeNotify, installAgentWake, wrapAgentWakePort } from './input/agent-wake.js';
1165
1217
  import { renderDebugEventDetail, renderDebugEventRows, renderDebugStack, renderPromptInjectionDebug } from '../display/debug-surface.js';
1166
1218
  import { buildDebugCallStack } from '../debug/call-stack.js';
@@ -1168,6 +1220,25 @@ import { buildAstGrepHostTool } from '../skills/tools/ast-grep.js';
1168
1220
  import { buildLspHostTool } from '../skills/tools/lsp/index.js';
1169
1221
  import { PluginHost } from '../plugins/core/host.js';
1170
1222
 
1223
+ /** Keep wake notifications immediate; display completed results only when a turn drains them. */
1224
+ export function subscribeDashboardAgentResults(
1225
+ queue: TaskNotificationQueue,
1226
+ listener: (notification: PendingTaskNotification) => void,
1227
+ pushHistoryLine: (line: string) => void,
1228
+ ): () => void {
1229
+ const offWake = queue.onEnqueue(listener);
1230
+ const offDrain = queue.onDrain((items) => {
1231
+ for (const notification of items) {
1232
+ if (notification.resultPath) {
1233
+ pushHistoryLine(` Agent result · full result: ${notification.resultPath} · summary: ${notification.output}`);
1234
+ } else if (notification.preservationError) {
1235
+ pushHistoryLine(` Agent result preservation failed: ${notification.preservationError} · ${notification.output}`);
1236
+ }
1237
+ }
1238
+ });
1239
+ return () => { offWake(); offDrain(); };
1240
+ }
1241
+
1171
1242
  /** Register the same L2 host tools used by the live TUI before each turn's catalog is assembled. */
1172
1243
  export function registerDashboardCoreHostTools(host: Pick<PluginHost, 'registerHostTool'>): void {
1173
1244
  const coreMod = require('../domains/core-tools.js') as typeof import('../domains/core-tools.js');
@@ -1183,7 +1254,7 @@ export function registerDashboardCoreHostTools(host: Pick<PluginHost, 'registerH
1183
1254
  }
1184
1255
  import { registerDashboardPaneHostTools } from './panes/host-tools.js';
1185
1256
  import { type ThemeTokens } from '../theme/tokens.js';
1186
- import { resolveActiveTheme } from './render/theme-resolver.js';
1257
+ import { getActiveThemeName, resolveActiveTheme } from './render/theme-resolver.js';
1187
1258
  import { getTheme } from '../themes/index.js';
1188
1259
  import type { PaneFocus, PreviewSource, WorkingDirView } from '../workspace-types.js';
1189
1260
  import type { DisplayMouseEvent } from '../display/types.js';
@@ -1402,6 +1473,10 @@ const isPluginBusy = (host: { active(): { plugin: { isBusy?: (s: any) => boolean
1402
1473
  // ── Main dashboard ──
1403
1474
 
1404
1475
  export interface ShowDashboardOptions {
1476
+ /** Internal startup timing signal for the completed synchronous setup: persona load,
1477
+ * input-core bootstrap, plugin discovery and the widget host. This is the pre-frame block
1478
+ * that `onFirstFrameRendered` used to hide behind one number. Elapsed ms since entry. */
1479
+ onSyncSetupComplete?: (elapsedMs: number) => void;
1405
1480
  /** Internal startup timing signal for the first successfully flushed dashboard frame. */
1406
1481
  onFirstFrameRendered?: () => void;
1407
1482
  /** Force debug sinks on at launch (file + mirror). Equivalent to
@@ -1876,7 +1951,34 @@ export function applyDashboardStreamingTypeaheadKey(
1876
1951
  return applyTurnTypeaheadKey(state, key, isImmediate);
1877
1952
  }
1878
1953
 
1954
+ /** TUI-BOOT-TIMING-HOLES — show-dashboard 동기 셋업 창(첫 프레임 직전) 계측기.
1955
+ * `finish()` 는 한 번만 보고하고, 보고가 던져도 부팅을 막지 않는다(fail-open). */
1956
+ export interface SyncSetupWindow {
1957
+ /** 셋업이 끝난 지점에서 호출 — 진입 이후 경과 ms 를 보고한다. */
1958
+ finish(): void;
1959
+ }
1960
+
1961
+ export function openSyncSetupWindow(
1962
+ report: ((elapsedMs: number) => void) | undefined,
1963
+ now: () => number = () => performance.now(),
1964
+ ): SyncSetupWindow {
1965
+ const startedAt = now();
1966
+ let finished = false;
1967
+ return {
1968
+ finish(): void {
1969
+ if (finished) return;
1970
+ finished = true;
1971
+ if (!report) return;
1972
+ try {
1973
+ report(now() - startedAt);
1974
+ } catch { /* timing signal must never break boot */ }
1975
+ },
1976
+ };
1977
+ }
1978
+
1879
1979
  export async function showDashboard(opts: ShowDashboardOptions = {}): Promise<DashboardAction> {
1980
+ // TUI-BOOT-TIMING-HOLES — 첫 프레임 직전 동기 셋업 구간을 여기서 연다(셋업 종료 지점에서 닫는다).
1981
+ const syncSetupWindow = openSyncSetupWindow(opts.onSyncSetupComplete);
1880
1982
  let firstDashboardFrameRendered = false;
1881
1983
  await awaitGlobalPersonaLoad().catch(() => {});
1882
1984
  const dashboardQuitConfirmationState = createQuitConfirmationState();
@@ -2876,6 +2978,11 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
2876
2978
  // current value so log analysis can filter "what keys fired while
2877
2979
  // a turn was in flight".
2878
2980
  let streamingInFlight = false;
2981
+ let noteClipboardActivity: () => void = () => {};
2982
+ let noteClipboardBusyChange: () => void = () => {};
2983
+ let noteClipboardPanelState: (active: boolean, reason: string) => void = () => {};
2984
+ let dashboardAcpIsBusy: () => boolean = () => false;
2985
+ let lastDashboardInputAt = Date.now();
2879
2986
  /** 지금 턴의 escGate 중단 — 외부 `/stop`(TUI-STOP-INPUT-BYPASS)이 대기열을 건너뛰어 부른다. 턴 밖이면 null. */
2880
2987
  let currentTurnExternalStop: (() => void) | null = null;
2881
2988
  const resolveTmuxStatusLabel = (): string | null => {
@@ -3351,7 +3458,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
3351
3458
  // ⭐ H2 내부 턴 문(TUI-H2-INTERNAL-TURN) — 자율 재개(H3·H4·H5)가 지나갈 «문 하나». 판정은 모듈,
3352
3459
  // 여기선 상태를 읽어 넘기기만 한다(⚠️ promptCtl·가시성 함수는 아래에서 선언 — 호출 시점엔 있다).
3353
3460
  const internalTurnGate = createInternalTurnGate({
3354
- isTurnRunning: () => streamingInFlight,
3461
+ isTurnRunning: () => streamingInFlight || dashboardAcpChat.isBusy() || internalTurnGate.isInternalTurnActive(),
3355
3462
  isInputForeground: () =>
3356
3463
  chatMainInputVisibilityState().inputOwnership?.owner === 'chat-main' && !topBlockingForegroundModal(),
3357
3464
  getBufferText: () => promptCtl.getBufferText?.(),
@@ -3367,7 +3474,21 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
3367
3474
  });
3368
3475
  // Set only by the failed-turn callback and consumed by that turn's streaming cleanup.
3369
3476
  let autowakeTurnFailureRaw: string | null = null;
3370
- const internalTurnYieldPort = wrapAgentWakePort(seatAutowake.wrapPort(internalTurnGate.port));
3477
+ // ⭐ TURN-END-BEFORE-GOAL 골 이어가기 — 답이 «…하겠습니다/해야 합니다» 로 끝났는데 결과물이 없으면 H2 문으로 한 턴 더.
3478
+ // 판정·상한은 모듈(goal-continue.ts), 여기선 배선만(입력칸 무접촉).
3479
+ const goalContinue = createGoalContinue({
3480
+ startTurnIfIdle: (text, opts) => internalTurnGate.startTurnIfIdle(text, opts),
3481
+ notify: (line) => { chatLines.push(C.muted(line)); draw(); },
3482
+ });
3483
+ const internalTurnYieldPort = wrapAgentWakePort(goalContinue.wrapPort(seatAutowake.wrapPort(internalTurnGate.port)));
3484
+ // ⭐ TUI-GOAL-INTERIM-QUIET — 이어가기 내부 턴이 열리면 «바로 앞» 중간 보고(못 했다·약속) 문단을 한 줄로 접는다.
3485
+ // 끼워 넣은 사람 에코가 있으면 줄 위치를 믿지 않고 접지 않는다(판정·관측은 goal-interim.ts).
3486
+ const goalInterimFold = createClassicInterimFold({ canFold: () => liveTypeaheadEchoes.length === 0 });
3487
+ /** 지금 턴의 스트림 런타임 — 턴 끝에 «마지막 답 블록» 시작을 읽는다(없으면 null → 접지 않는다). */
3488
+ let latestTurnStream: { getAssistantStart(): number } | null = null;
3489
+ const latestTurnReplyStart = (): number | null => {
3490
+ try { return latestTurnStream?.getAssistantStart() ?? null; } catch { return null; }
3491
+ };
3371
3492
  // ⭐ H5 자기 예약 깨움(TUI-H5-SCHEDULE-WAKEUP) — 프로세스 안 타이머가 그 시각에 H2 문으로 한 턴을 청한다.
3372
3493
  // 직전 회차 판정 = 그 예약이 연 내부 턴이 아직 도나. 도구 등록은 아래 host tool 자리(하니스 자식 제외).
3373
3494
  const wakeupScheduler = createDashboardWakeupScheduler(internalTurnGate, {
@@ -3735,7 +3856,8 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
3735
3856
  return mouseWiring.buildStatusLine({
3736
3857
  swd,
3737
3858
  gitState,
3738
- providerInfo: readStatusProviderInfo(activeAcpRuntimeModel()),
3859
+ // TUI-MODEL-BADGE-ACTUAL (10-16) — 배지의 «지금» 은 이번 턴 실제 실행(폴백이면 «처음 → 실제»).
3860
+ providerInfo: readStatusProviderInfo(activeAcpRuntimeModel(), statusModelActual('dashboard')),
3739
3861
  contextUsedTokens: metrics.lastContextUsed,
3740
3862
  tmuxLabel: tmuxStatusLabel,
3741
3863
  sshLabel: sshStatusLabel,
@@ -4049,6 +4171,8 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
4049
4171
  // makes the "*N" suffix tick up within the same frame so the
4050
4172
  // user sees feedback for their own action immediately.
4051
4173
  // TUI-TYPING-LAG — async probe: `git status` must not block key input.
4174
+ lastDashboardInputAt = Date.now();
4175
+ lastGitDirtyProbeAt = lastDashboardInputAt;
4052
4176
  void refreshGitDirtyAsync(getSessionCwd(), { force: true })
4053
4177
  .then(() => { try { draw(); } catch { /* TUI torn down */ } }, () => { /* noop */ });
4054
4178
  });
@@ -4073,9 +4197,11 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
4073
4197
  // extras.
4074
4198
  // 3. SWD flip → dispose + re-wire (fresh repo root).
4075
4199
  let gitUnsub: (() => void) | null = null;
4200
+ let lastGitDirtyProbeAt = Date.now();
4076
4201
  const wireGitForSwd = (): void => {
4077
4202
  if (gitUnsub) { try { gitUnsub(); } catch {} gitUnsub = null; }
4078
4203
  const swd = getSessionCwd();
4204
+ lastGitDirtyProbeAt = Date.now();
4079
4205
  gitUnsub = subscribeGitChanges(swd, () => {
4080
4206
  try { draw(); } catch { /* noop */ }
4081
4207
  });
@@ -4113,17 +4239,18 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
4113
4239
  // the git snapshot (async subprocesses) and the self-ambient store scan (worker thread). A turn
4114
4240
  // then serves them from cache instead of rebuilding synchronously on the turn path. Both are
4115
4241
  // no-ops while the cached value is younger than the threshold; failures are fail-soft.
4242
+ const currentDashboardIdleMs = (): number =>
4243
+ dashboardIdleMs(Date.now(), lastDashboardInputAt, streamingInFlight || dashboardAcpIsBusy());
4116
4244
  const warmTurnPreambleCaches = (): void => {
4117
- try { void refreshGitSnapshotAsync(getSessionCwd(), { ifOlderThanMs: 30_000 }); } catch { /* noop */ }
4118
- try { void refreshSelfAmbientCache({}, { ifOlderThanMs: 25_000 }); } catch { /* noop */ }
4245
+ const ambientCacheTtlMs = selfAmbientKeepWarmIntervalMs(currentDashboardIdleMs());
4246
+ try { void refreshSelfAmbientCache({}, { ifOlderThanMs: ambientCacheTtlMs }); } catch { /* noop */ }
4119
4247
  };
4120
- warmTurnPreambleCaches();
4121
- const gitDirtyTimer: ReturnType<typeof setInterval> = setInterval(() => {
4122
- warmTurnPreambleCaches();
4248
+ const probeGitDirty = (minIntervalMs: number): void => {
4249
+ lastGitDirtyProbeAt = Date.now();
4123
4250
  try {
4124
4251
  const before = getGitStatusView(getSessionCwd());
4125
4252
  // TUI-TYPING-LAG — the 5s probe ran `git status` synchronously (130ms+, hundreds under load).
4126
- void refreshGitDirtyAsync(getSessionCwd(), { minIntervalMs: 4_000 }).then((after) => {
4253
+ void refreshGitDirtyAsync(getSessionCwd(), { minIntervalMs }).then((after) => {
4127
4254
  if (
4128
4255
  (before.dirty?.total ?? -1) !== (after.dirty?.total ?? -1) ||
4129
4256
  (before.aheadBehind?.ahead ?? -1) !== (after.aheadBehind?.ahead ?? -1)
@@ -4132,6 +4259,26 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
4132
4259
  }
4133
4260
  }, () => { /* noop */ });
4134
4261
  } catch { /* noop */ }
4262
+ };
4263
+ // CLASSIC-IDLE-GIT-POLL — no git children while idle (2 min without input); the next key warms once
4264
+ // off the input path (deferred) and polling resumes. `git-fs.idle poll-state` records each flip.
4265
+ const gitIdlePoll = createIdleGitPoll({
4266
+ idleMs: currentDashboardIdleMs,
4267
+ poll: (idleMs) => {
4268
+ try { void refreshGitSnapshotAsync(getSessionCwd(), { ifOlderThanMs: 30_000 }); } catch { /* noop */ }
4269
+ if (Date.now() - lastGitDirtyProbeAt < gitDirtyRefreshIntervalMs(idleMs)) return;
4270
+ probeGitDirty(gitDirtyRefreshIntervalMs(idleMs));
4271
+ },
4272
+ warm: () => {
4273
+ try { void refreshGitSnapshotAsync(getSessionCwd(), { ifOlderThanMs: 30_000 }); } catch { /* noop */ }
4274
+ probeGitDirty(0);
4275
+ },
4276
+ });
4277
+ warmTurnPreambleCaches();
4278
+ try { void refreshGitSnapshotAsync(getSessionCwd(), { ifOlderThanMs: 30_000 }); } catch { /* noop */ }
4279
+ const gitDirtyTimer: ReturnType<typeof setInterval> = setInterval(() => {
4280
+ warmTurnPreambleCaches();
4281
+ gitIdlePoll.tick();
4135
4282
  }, 5_000);
4136
4283
  (gitDirtyTimer as unknown as { unref?: () => void }).unref?.();
4137
4284
  // The running module's installed version, not the user's working directory, is the baseline.
@@ -4546,6 +4693,8 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
4546
4693
  };
4547
4694
  let pluginHost: PluginHost;
4548
4695
  let lastThemeLoadError = '';
4696
+ let lastThemeResolutionName: string | null = null;
4697
+ let lastPluginThemeAppliedDebugKey: string | null = null;
4549
4698
  let iulThemePreviewOverride: string | null = null;
4550
4699
  let lastHostChromePolicyDebugKey = '';
4551
4700
  const observeEssentialFrameCursor = createDashboardEssentialCursorObserver({
@@ -4560,9 +4709,26 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
4560
4709
  const raw = iulThemePreviewOverride
4561
4710
  ? { ...(getUserConfig().dashboard.theme as object ?? {}), active: iulThemePreviewOverride }
4562
4711
  : getUserConfig().dashboard.theme;
4712
+ const activeThemeName = getActiveThemeName(raw);
4713
+ if (activeThemeName !== lastThemeResolutionName) {
4714
+ lastThemeResolutionName = activeThemeName;
4715
+ lastPluginThemeAppliedDebugKey = null;
4716
+ }
4563
4717
  return resolveActiveTheme({
4564
4718
  raw,
4565
- loadPlugin: (id) => pluginHost?.loadThemeTokens(id) ?? null,
4719
+ loadPlugin: (id) => {
4720
+ const tokens = pluginHost?.loadThemeTokens(id) ?? null;
4721
+ if (!tokens) lastPluginThemeAppliedDebugKey = null;
4722
+ return tokens;
4723
+ },
4724
+ onPluginApplied: (event) => {
4725
+ const key = `${event.id}:${event.tokensCount}:${event.source}`;
4726
+ if (key === lastPluginThemeAppliedDebugKey) return;
4727
+ try {
4728
+ debug.log('tui.theme', 'plugin-theme-applied', event);
4729
+ lastPluginThemeAppliedDebugKey = key;
4730
+ } catch { /* observation is best-effort */ }
4731
+ },
4566
4732
  onPluginError: (message) => {
4567
4733
  if (lastThemeLoadError !== message) {
4568
4734
  lastThemeLoadError = message;
@@ -6011,6 +6177,8 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
6011
6177
  }
6012
6178
  };
6013
6179
  const syncCompanionPopups = (): void => {
6180
+ // CLASSIC-IDLE-CLIPBOARD: every clipboard open/close/dock path ends here — keep it the only gate.
6181
+ noteClipboardPanelState(companionPopupHost.isActive('clipboard'), companionPopupHost.isDocked('clipboard') ? 'panel-docked' : companionPopupHost.isOpen('clipboard') ? 'panel-open' : 'panel-close');
6014
6182
  const { cols, rows } = termSize();
6015
6183
  const workspaceHost = display.workspaceHostAPI();
6016
6184
  const ownerId = companionPopupHost.ownerId;
@@ -6530,7 +6698,9 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
6530
6698
  });
6531
6699
  let clarificationModalId: string | null = null;
6532
6700
 
6533
- const attachChatStreamingKeys = (abortCtrl: AbortController): () => void => {
6701
+ // `turnEnd: false` — a phase inside a turn (skill-route detection) that attaches the same keys: its teardown is
6702
+ // not a turn end (TUI-ORPHAN-AUTO-RESUME-STOP E4 · 10-23: it reset seat-autowake's orphan-400 streak every turn).
6703
+ const attachChatStreamingKeys = (abortCtrl: AbortController, phase: { turnEnd?: boolean } = {}): () => void => {
6534
6704
  const chatLinesStartIndex = chatLines.length;
6535
6705
  userScrolledDuringStream = false;
6536
6706
  const SCROLL_KEYS = new Set(['j', 'k', 'down', 'up', 'pageup', 'pagedown', 'home', 'end', 'g', 'G']);
@@ -6540,8 +6710,20 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
6540
6710
  // so the user can make an informed call.
6541
6711
  let abortGateModalId: string | null = null;
6542
6712
  const showHarnessEscHint = createHarnessEscHint((line) => pushChatLine(line));
6543
- let stoppedHarnessSpace: string | null = null;
6544
6713
  const activeHarnessSpace = (): string | null => activeEscHarnessSpace(escAbortToolState, escHarnessSpacesByCallId);
6714
+ // ⭐ TUI-ESC-EXIT — `createEscAbortPendingGate` is the production
6715
+ // onAbortPending/onAbortRepeat seam shared with the incident test in
6716
+ // test/esc-harness-stop.test.ts; `runEscAbortPendingSoftStop` remains the
6717
+ // production soft-stop callback. The gate keeps an earlier successful
6718
+ // stopped space across later waiting/hint/failed callbacks.
6719
+ const escAbortPendingGate = createEscAbortPendingGate({
6720
+ runSoftStop: runEscAbortPendingSoftStop,
6721
+ formatWaitingTargets: formatEscAbortWaitingTargets,
6722
+ getActiveHarnessSpace: activeHarnessSpace,
6723
+ pushChatLine: (line) => pushChatLine(line),
6724
+ showHarnessEscHint,
6725
+ afterAbortEvent: () => { chatScrollOffset = -1; },
6726
+ });
6545
6727
  const escGate = createEscAbortGate({
6546
6728
  abortCtrl,
6547
6729
  getRunningCount: () => getEscAbortRunningCount(escAbortToolState),
@@ -6556,28 +6738,11 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
6556
6738
  getTheme: () => currentThemeTokens(),
6557
6739
  getWaitingTargetNames: () => getEscAbortWaitingToolNames(escAbortToolState),
6558
6740
  shouldAbortImmediately: () => activeHarnessSpace() !== null,
6559
- onAbortPending: ({ targets }) => {
6560
- const spaceId = activeHarnessSpace();
6561
- if (spaceId) {
6562
- try {
6563
- enqueueSoftStop(spaceId);
6564
- if (readSoftStopRequestStatus(spaceId).status !== 'present') throw new Error('soft-stop marker not persisted');
6565
- stoppedHarnessSpace = spaceId;
6566
- pushChatLine(' ⏹ 멈췄다 — 해당 하니스 런에 중단 요청을 보냈습니다.');
6567
- } catch {
6568
- pushChatLine(' ⚠ 하니스 런 중단 요청을 보내지 못했습니다. /harness runs 에서 확인해 주세요.');
6569
- }
6570
- } else if (!showHarnessEscHint(targets)) {
6571
- pushChatLine(` ⏳ 중단 요청됨 — ${formatEscAbortWaitingTargets(targets)} 종료를 기다리는 중입니다.`);
6572
- }
6573
- chatScrollOffset = -1;
6574
- },
6575
- onAbortRepeat: ({ repeat, targets }) => {
6576
- if (!stoppedHarnessSpace && !showHarnessEscHint(targets)) {
6577
- pushChatLine(` ⏳ ESC 재시도 ${repeat}회 — ${formatEscAbortWaitingTargets(targets)} 종료를 기다리는 중입니다.`);
6578
- }
6579
- chatScrollOffset = -1;
6580
- },
6741
+ // ⭐ TUI-ESC-EXIT — `runEscAbortPendingSoftStop` is the production
6742
+ // soft-stop callback seam; the incident test in
6743
+ // test/esc-harness-stop.test.ts exercises this same function.
6744
+ onAbortPending: escAbortPendingGate.onAbortPending,
6745
+ onAbortRepeat: escAbortPendingGate.onAbortRepeat,
6581
6746
  // ⭐⭐⭐ 턴을 멈추기 «전»에 살아남을 자식을 백그라운드 라우팅으로 넘긴다(`R4a` · 2026-08-19).
6582
6747
  // ⛔ 없으면 `R1` 이후 자식이 «고아»가 된다 — 살아 있는데 완료를 실어 나를 채널이 없다
6583
6748
  // (`task-notification` 은 background 만 본다 · 부모 툴 루프는 턴과 함께 사라졌다).
@@ -6822,6 +6987,8 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
6822
6987
  const r = applyDashboardStreamingTypeaheadKey(turnTypeaheadRef.state, k, isStreamingImmediateSlash);
6823
6988
  if (r.consumed) {
6824
6989
  turnTypeaheadRef.state = r.state;
6990
+ // TUI-PASTE-WHILE-STREAMING — 턴 중 붙여넣기를 버퍼가 받았다(종전엔 조용히 버려졌다).
6991
+ 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 */ } }
6825
6992
  if (r.submissionDisposition) {
6826
6993
  debug.log('dashboard.turn-typeahead', 'submission-classified', {
6827
6994
  length: (r.immediateSubmission ?? turnTypeaheadRef.state.queuedSubmissions.at(-1))?.length ?? 0,
@@ -7011,6 +7178,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
7011
7178
  };
7012
7179
 
7013
7180
  const cleanup = attachStreamingKeys(async (key) => {
7181
+ noteClipboardActivity();
7014
7182
  // ── Pre-dispatch gates ────────────────────────────────────
7015
7183
  //
7016
7184
  // These run BEFORE `routeInputEventAsync` because:
@@ -7108,6 +7276,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
7108
7276
  // ⛔ TUI-STALE-BUSY-MARKER — busy 는 «끄는 closure 를 돌려주기 직전»에 켠다. 위 준비(ESC 게이트·키 리스너)가
7109
7277
  // 던지면 호출자는 cleanup 을 못 받으므로, 먼저 켜 두면 아무도 못 끄는 busy 가 남는다(#37).
7110
7278
  streamingInFlight = true;
7279
+ noteClipboardBusyChange();
7111
7280
  reportTuiTurn('busy');
7112
7281
  const externalStop = (): void => { stopTurnViaEscGate(escGate); };
7113
7282
  currentTurnExternalStop = externalStop;
@@ -7117,7 +7286,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
7117
7286
  runTurnTeardownStep('stream-keys-detach', cleanup);
7118
7287
  runTurnTeardownStep('esc-gate-dispose', () => { escGate.dispose(); });
7119
7288
  try {
7120
- if (!stoppedHarnessSpace) settleEscAbortPendingLines(chatLines, chatLinesStartIndex);
7289
+ if (!escAbortPendingGate.getStoppedHarnessSpace()) settleEscAbortPendingLines(chatLines, chatLinesStartIndex);
7121
7290
  } catch (err) {
7122
7291
  const message = err instanceof Error ? err.message : String(err);
7123
7292
  const stackHead = err instanceof Error ? err.stack?.split('\n')[1]?.trim() : undefined;
@@ -7126,10 +7295,22 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
7126
7295
  } finally {
7127
7296
  userScrolledDuringStream = false;
7128
7297
  streamingInFlight = false;
7298
+ noteClipboardBusyChange();
7129
7299
  reportTuiTurn('idle');
7130
7300
  const failedTurnRaw = autowakeTurnFailureRaw;
7131
7301
  autowakeTurnFailureRaw = null;
7132
- seatAutowake.noteTurnEnded({ sessionId: currentChatPersonaSessionId(), lastLine: chatLines.at(-1) ?? '', errorDetail: failedTurnRaw ?? undefined });
7302
+ if (phase.turnEnd !== false) seatAutowake.noteTurnEnded({ sessionId: currentChatPersonaSessionId(), lastLine: chatLines.at(-1) ?? '', errorDetail: failedTurnRaw ?? undefined });
7303
+ try {
7304
+ // «이번 턴»이 그린 줄만 본다 — 앞 턴의 ✘·취소 표시가 이번 턴 판정에 새지 않게(r1 must-fix).
7305
+ const turnLines = chatLines.slice(chatLinesStartIndex);
7306
+ const tailLines = turnLines.slice(-16);
7307
+ // 실패(✘)·취소로 끝난 턴은 이어가지 않는다 — 사람이 판단할 자리다.
7308
+ const failed = failedTurnRaw !== null || turnLines.some((line) => /✘ 실패|응답 취소|취소됨/.test(line));
7309
+ // 마지막 답 블록만 — 스트림 applier 의 assistantStart(이번 턴 범위 안일 때). 도구 줄은 그 앞에 남는다.
7310
+ const replyStart = latestTurnReplyStart();
7311
+ goalInterimFold.noteTurnEnded(chatLines, replyStart !== null && replyStart >= chatLinesStartIndex ? replyStart : chatLines.length);
7312
+ goalContinue.noteTurnEnded({ lines: tailLines, failed });
7313
+ } catch { /* fail-soft: 골 이어가기는 턴 정리를 막지 않는다 */ }
7133
7314
  }
7134
7315
  };
7135
7316
  };
@@ -7196,6 +7377,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
7196
7377
  const dashboardAcpChat = new DashboardAcpChat({
7197
7378
  cwd: () => workingDir.cwd,
7198
7379
  log: (msg) => pushLog('debug', ` [acp] ${msg}`),
7380
+ onBusyChange: () => noteClipboardBusyChange(),
7199
7381
  // Follow-up #9 — wrap the modal approver so BG records flip to
7200
7382
  // `waiting_for_confirmation` even when the peer (codex-acp /
7201
7383
  // gemini-cli) doesn't emit the `tool_call_update.status` field.
@@ -7205,6 +7387,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
7205
7387
  globalBackgroundManager(),
7206
7388
  ),
7207
7389
  });
7390
+ dashboardAcpIsBusy = () => dashboardAcpChat.isBusy();
7208
7391
  activeAcpRuntimeModel = () => dashboardAcpChat.activeRuntimeModel();
7209
7392
 
7210
7393
  // Obsidian vault browser (Phase O3). Shares the FsEntry shape and
@@ -11495,8 +11678,16 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
11495
11678
  const frameCursorDecision = display.cursorDecision();
11496
11679
  renderDashboardFrame(baseLines, composeDashboardFrameWithCoordinatorModal(display, {
11497
11680
  onFrameWriteComplete: firstDashboardFrameRendered ? undefined : (error) => {
11498
- if (error || firstDashboardFrameRendered) return;
11681
+ if (firstDashboardFrameRendered) return;
11682
+ // TUI-BOOT-TIMING-HOLES — 셋업 창은 «첫 프레임 flush 완료» 에 닫는다(진입~flush).
11683
+ // 실패한 flush 도 창을 닫아 신호가 영영 오지 않는 일을 막는다(재시도 의미론은 그대로:
11684
+ // 첫 프레임 신호는 다음 성공 flush 가 낸다).
11685
+ if (error) {
11686
+ syncSetupWindow.finish();
11687
+ return;
11688
+ }
11499
11689
  firstDashboardFrameRendered = true;
11690
+ syncSetupWindow.finish();
11500
11691
  try { opts.onFirstFrameRendered?.(); } catch { /* timing must not break dashboard */ }
11501
11692
  },
11502
11693
  overlay: modalFrame,
@@ -12358,7 +12549,17 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
12358
12549
  // ticks every ~1.5s on Darwin and stores up to 50 unique text
12359
12550
  // snapshots. Stopped during dashboard teardown to avoid leaking
12360
12551
  // intervals if the host re-enters showDashboard.
12361
- const clipHistory: ClipboardHistory = startClipboardHistory({});
12552
+ // CLASSIC-IDLE-CLIPBOARD: dormant until the clipboard companion is open.
12553
+ const clipHistory: ClipboardHistory = startClipboardHistory({
12554
+ active: companionPopupHost.isActive('clipboard'),
12555
+ isBusy: () => streamingInFlight || dashboardAcpChat.isBusy(),
12556
+ });
12557
+ noteClipboardPanelState = (active, reason) => clipHistory.setActive(active, reason);
12558
+ noteClipboardActivity = () => {
12559
+ lastDashboardInputAt = Date.now();
12560
+ clipHistory.noteActivity();
12561
+ };
12562
+ noteClipboardBusyChange = () => clipHistory.noteBusyChange();
12362
12563
  process.once('beforeExit', () => { clipHistory.stop(); });
12363
12564
  // Re-render whenever the poller picks up a new entry — only when
12364
12565
  // we're actually showing the history viewer, otherwise the side-
@@ -13067,7 +13268,9 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
13067
13268
  // 채팅 한 줄 «✓ 위임 끝: <이름> — 다음 턴에 결과» · 결과는 다음 턴 preamble 이 싣는다.
13068
13269
  // ⛔ 입력칸·injectKey·pty 주입 0(대표 비침투). dedupe·수명은 모듈, 여기선 배선만.
13069
13270
  const agentWake = installAgentWake({
13070
- subscribe: (listener) => globalTaskNotificationQueue.onEnqueue(listener),
13271
+ subscribe: (listener) => subscribeDashboardAgentResults(
13272
+ globalTaskNotificationQueue, listener, (line) => { pushChatLine(C.muted(line)); draw(); },
13273
+ ),
13071
13274
  // 그리기 실패는 삼키지 않는다 — 모듈이 잡아 notified{shown:false} 로 남긴다.
13072
13275
  notify: createDashboardAgentWakeNotify((line) => { chatLines.push(C.muted(line)); }, () => draw()),
13073
13276
  // 조각 2 — 자리 TUI ∧ 유휴면 H2 문으로 다음 턴(origin child-complete) · 판정은 모듈.
@@ -14774,7 +14977,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
14774
14977
  let acpDispatchToolSelf: CoreTurnDispatchTool | null = null;
14775
14978
  let acpToolDispatchCount = 0;
14776
14979
  const trMod = await import('../tool-runtime/index.js');
14777
- trMod.registerAllDefaultToolRuntimes();
14980
+ trMod.registerAllDefaultToolRuntimes({ mcpLazyBoot: true });
14778
14981
  acpToolRuntime = trMod;
14779
14982
  acpPersistToolOutputPreview = (
14780
14983
  await import('../tool-runtime/truncation-store.js')
@@ -15160,6 +15363,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
15160
15363
  const key: import('../tui.js').Key = wdAutoInput
15161
15364
  ? { name: CHAT_MAIN_AUTO_ENTRY_KEY_NAME, ctrl: false, shift: false }
15162
15365
  : await readKey();
15366
+ if (!wdAutoInput) { noteClipboardActivity(); gitIdlePoll.noteActivity('input'); }
15163
15367
  const helpModal = currentTransientTerminalModal('dashboard-help');
15164
15368
  if (key.name === 'escape' && helpModal) {
15165
15369
  helpModal.dispose();
@@ -16172,6 +16376,8 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
16172
16376
  // those tokens into the initial buffer so the user can just type
16173
16377
  // their question next to the pre-filled [PDF #N] tokens.
16174
16378
  let nextInitial: string | undefined = inputEntry.initialText;
16379
+ // TUI-PASTE-WHILE-STREAMING — 턴 중 접은 붙여넣기 토큰의 원문(넘김 입력창이 넘겨받는다 · 글에 토큰이 없으면 버린다).
16380
+ let nextInitialPastes: Array<[string, string]> = [];
16175
16381
  let exitInputLoop = false;
16176
16382
  let lastTurnFinalStatus: 'completed' | 'interrupted' | 'failed' | undefined;
16177
16383
 
@@ -16203,6 +16409,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
16203
16409
  });
16204
16410
  lastTurnFinalStatus = undefined;
16205
16411
  nextInitial = drained.nextInitial;
16412
+ nextInitialPastes = [...nextInitialPastes, ...(drained.initialPastes ?? [])].filter(([token]) => nextInitial?.includes(token));
16206
16413
  const queuedTurnEndText = drained.injectEnter ? drained.nextInitial : undefined;
16207
16414
  if (interrupted && queuedBeforeDrain > 0) {
16208
16415
  debug.log('dashboard.turn-typeahead', 'restored-after-interrupt', { count: queuedBeforeDrain });
@@ -16242,6 +16449,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
16242
16449
  debugLog: debug.enabled ? (event, label, payload) => debug.log(event, label, payload) : undefined,
16243
16450
  textInputOpts: {
16244
16451
  internalTurnYield: internalTurnYieldPort,
16452
+ ...(nextInitialPastes.length ? { initialPastes: nextInitialPastes } : {}),
16245
16453
  onScrollKey: (name) => {
16246
16454
  const { rows } = termSize();
16247
16455
  const viewport = computePromptFrameLogViewportBounds(
@@ -16740,7 +16948,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
16740
16948
 
16741
16949
  // Save to durable input history. Up/down reads the in-memory
16742
16950
  // tail, while slash/LLM tools can search the full store.
16743
- if (!internalTurn) internalTurnGate.noteHumanTurn();
16951
+ if (!internalTurn) { internalTurnGate.noteHumanTurn(); goalContinue.noteHumanTurn(); goalInterimFold.noteHumanTurn(); }
16744
16952
  if (postTurn.historyRecord && !internalTurn) {
16745
16953
  inputHistoryStore.record(postTurn.historyRecord);
16746
16954
  refreshInputHistory();
@@ -17645,18 +17853,14 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
17645
17853
  setWorkingFocusPreview: () => { setWorkingFocus('preview', 'slash-term-move-preview'); },
17646
17854
  nextTerminalVwSlotId: (terminalId) => `term-slot:${terminalId}`,
17647
17855
  },
17648
- // TUI-LOOP-COMMAND — /loop <간격> <프롬프트> · 쉬는 동안만 발사
17649
- // (src/dashboard/loop-scheduler.ts · 판정: idle 발사 1 · busy 미룸 · stop 0).
17650
- // idle/busy 신호는 대시보드 루프가 이미 쓰는 것을 그대로 쓴다 —
17651
- // 스트리밍 턴(streamingInFlight · reportTuiTurn busy/idle) +
17652
- // ACP 세션 바쁨(dashboardAcpChat.isBusy()). 프롬프트 제출은
17653
- // 플러그인 submitDashboardText 와 같은 기존 제출 틈
17654
- // (dispatchDashboardSubmitText)으로 낸다 — 새 제출 경로를 만들지 않는다.
17856
+ // TUI-LOOP-COMMAND — the scheduler ticks; H2 alone judges whether
17857
+ // an internal turn can open. A rejection waits for the next tick.
17655
17858
  loopCommand: {
17656
- isIdle: () => !streamingInFlight && !dashboardAcpChat.isBusy(),
17859
+ isIdle: () => true,
17657
17860
  submitPrompt: (prompt: string) => {
17658
- if (dispatchDashboardSubmitText) dispatchDashboardSubmitText(prompt);
17659
- else chatLines.push(C.muted(' /loop: 입력 루프가 아직 제출을 받지 않는다 — 다음 틱을 기다린다'));
17861
+ const result = internalTurnGate.startTurnIfIdle(prompt, { origin: 'scheduled', reason: '/loop' });
17862
+ if (result.opened) debug.log('dashboard.loop', 'fired', { turnId: result.turnId });
17863
+ else debug.log('dashboard.loop', 'rejected', { reason: result.reason });
17660
17864
  },
17661
17865
  schedulerRef: dashboardLoopSchedulerRef,
17662
17866
  },
@@ -18108,6 +18312,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
18108
18312
  // array but doesn't paint until after the skill router's
18109
18313
  // classifier LLM call returns (~1-2s of visual silence).
18110
18314
  if (internalTurn) {
18315
+ try { goalInterimFold.foldBeforeInternalTurn(chatLines, internalTurn.origin, C.muted); } catch { /* fail-soft: 접기는 턴을 막지 않는다 */ }
18111
18316
  chatLines.push(C.muted(` ${formatInternalTurnBanner(internalTurn)}`));
18112
18317
  chatScrollOffset = -1;
18113
18318
  } else {
@@ -18153,6 +18358,10 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
18153
18358
  // through to keyword routing in those cases.
18154
18359
  {
18155
18360
  const urlDec = detectUrlRoute(tok.text, getUserConfig().skills.urlRouting);
18361
+ const urlGuard = urlDec ? null : workContextGuardReason(tok.text);
18362
+ if (urlGuard && extractUrls(tok.text).length > 0) {
18363
+ debug.log('skill.router', 'url-route-guarded', { reason: urlGuard, textLength: tok.text.length });
18364
+ }
18156
18365
  if (urlDec) {
18157
18366
  debug.log('skill.router', 'url-route', {
18158
18367
  kind: urlDec.kind, skill: urlDec.skill, absorb: urlDec.absorb,
@@ -18204,7 +18413,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
18204
18413
  const detectTier = getModelTier(getUserConfig().llm.provider, getUserConfig().llm.model);
18205
18414
  const routeStartedAt = Date.now();
18206
18415
  const route = await runAbortableDashboardSkillRoute({
18207
- attachKeys: attachChatStreamingKeys,
18416
+ attachKeys: (ctrl: AbortController) => attachChatStreamingKeys(ctrl, { turnEnd: false }),
18208
18417
  detect: (signal) => detectDashboardSkillRoute(tok.text, visibleIndex, {
18209
18418
  llmFallback: userCfg.llmFallback,
18210
18419
  keywordScoreThreshold: userCfg.keywordScoreThreshold,
@@ -18469,7 +18678,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
18469
18678
  return buildDashboardOptionalToolSpecs({
18470
18679
  userConfig: uc,
18471
18680
  termSize,
18472
- registerAllDefaultToolRuntimes: () => { toolRuntime.registerAllDefaultToolRuntimes(); },
18681
+ registerAllDefaultToolRuntimes: () => { toolRuntime.registerAllDefaultToolRuntimes({ mcpLazyBoot: true }); },
18473
18682
  setTerminalModalRuntimeDeps: (deps) => { toolRuntime.setTerminalModalRuntimeDeps(deps); },
18474
18683
  ...buildDefaultDashboardToolBuilders(),
18475
18684
  }) as unknown[];
@@ -18516,6 +18725,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
18516
18725
  renderedToolRuntime,
18517
18726
  brainIcon: ICONS.brain,
18518
18727
  });
18728
+ latestTurnStream = turnStreamRuntime;
18519
18729
  return {
18520
18730
  ...turnStreamRuntime,
18521
18731
  onText: (chunk, accumulated) => {
@@ -18574,6 +18784,17 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
18574
18784
  },
18575
18785
  resetAcpTurnRef: () => resetDashboardAcpTurnRef(acpTurnRef),
18576
18786
  acpSession: dashboardAcpSession,
18787
+ // TUI-400-AUTOHEAL-FALLBACK(대표 10-22) — 400(대화 기록 어긋남)이면 ① 새 세션 ⊕ 요약 ② 다음 공급자로 스스로 회복.
18788
+ autoheal: createDashboardTurnAutoheal({
18789
+ session: dashboardAcpSession,
18790
+ getCwd: getSessionCwd,
18791
+ onRenewed: (sessionId) => {
18792
+ acpSessionIdRef.current = sessionId;
18793
+ observeSessionStart({ surface: 'tui', origin: 'new', reason: 'autoheal-400', sessionId });
18794
+ },
18795
+ remote: daemonAttached,
18796
+ activeModel: () => resolveDashboardActiveModel(tok.text) ?? undefined,
18797
+ }),
18577
18798
  control: {
18578
18799
  signalBus: dashboardControlSignals,
18579
18800
  },