elanous 0.2.31 → 0.2.34

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 (715) 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/{LSXfY0u9QtfDbejY0Ukf_ → L04y73dlwKeTW-GetaTF3}/_buildManifest.js +1 -1
  4. package/apps/pwa/out/_next/static/chunks/1162.c69abda138c7ce43.js +79 -0
  5. package/apps/pwa/out/_next/static/chunks/1449-1fede62af84c3e43.js +1 -0
  6. package/apps/pwa/out/_next/static/chunks/1598-13fc845935e816df.js +1 -0
  7. package/apps/pwa/out/_next/static/chunks/1639.62c5e16fa20d242f.js +94 -0
  8. package/apps/pwa/out/_next/static/chunks/{4174.92ed04922709ac9e.js → 1644.35dd25240ae24e4b.js} +2 -2
  9. package/apps/pwa/out/_next/static/chunks/1661-adb8b2babc9aaf8c.js +1 -0
  10. package/apps/pwa/out/_next/static/chunks/{2940-619bfd8ef337c611.js → 1895-60ed0e341c658bd4.js} +1 -1
  11. package/apps/pwa/out/_next/static/chunks/{5525.86debf231e181813.js → 2124.ed5bf480cea7f85b.js} +1 -1
  12. package/apps/pwa/out/_next/static/chunks/2147.107c0fc6146fb15a.js +23 -0
  13. package/apps/pwa/out/_next/static/chunks/2202-ef1c9b000c3074fc.js +1 -0
  14. package/apps/pwa/out/_next/static/chunks/2247.1e326638ee43e672.js +115 -0
  15. package/apps/pwa/out/_next/static/chunks/2268.56e1e3d58180abae.js +8 -0
  16. package/apps/pwa/out/_next/static/chunks/2469-606819c812414021.js +1 -0
  17. package/apps/pwa/out/_next/static/chunks/{6092.a7f99e68b188ca66.js → 2547.dd27303624cb4da8.js} +1 -1
  18. package/apps/pwa/out/_next/static/chunks/{2213.2ccbada92c33ea0f.js → 2554.3b5e200f5f5cfcd6.js} +16 -16
  19. package/apps/pwa/out/_next/static/chunks/2593.e53c1620c0bb3599.js +1 -0
  20. package/apps/pwa/out/_next/static/chunks/2690.e96671114222676a.js +1 -0
  21. package/apps/pwa/out/_next/static/chunks/2898-79ee1a5cc0cd9d13.js +1 -0
  22. package/apps/pwa/out/_next/static/chunks/298.26099a9f65e5c8ff.js +1 -0
  23. package/apps/pwa/out/_next/static/chunks/{5173-233188df2f42c626.js → 2987-30cf9c2eb7b8bdd5.js} +1 -1
  24. package/apps/pwa/out/_next/static/chunks/2992.51fc2a7295bd8139.js +1 -0
  25. package/apps/pwa/out/_next/static/chunks/{3541-ce3a5424ed5ad7f1.js → 3001-5a52788c813b6113.js} +1 -1
  26. package/apps/pwa/out/_next/static/chunks/3014-291245fba9df7b5b.js +1 -0
  27. package/apps/pwa/out/_next/static/chunks/3068.ee78201f0251a18d.js +1 -0
  28. package/apps/pwa/out/_next/static/chunks/3083.cd399a17e9365f78.js +1 -0
  29. package/apps/pwa/out/_next/static/chunks/3103.84470c8445962f04.js +34 -0
  30. package/apps/pwa/out/_next/static/chunks/{6433.fc573af22bbc9ab7.js → 3110.0a7065f25c841818.js} +17 -17
  31. package/apps/pwa/out/_next/static/chunks/3117-e1c474683fd1f824.js +1 -0
  32. package/apps/pwa/out/_next/static/chunks/3121.779fafe3e44612c5.js +1 -0
  33. package/apps/pwa/out/_next/static/chunks/3251-2c17bd5a91f8de2e.js +1 -0
  34. package/apps/pwa/out/_next/static/chunks/326.3fb32322bb2ddf6d.js +1 -0
  35. package/apps/pwa/out/_next/static/chunks/3411-f87314c6c66ebc73.js +1 -0
  36. package/apps/pwa/out/_next/static/chunks/{6157.0c9af021de4fb31b.js → 3414.172ad4ca2d9b08e8.js} +2 -2
  37. package/apps/pwa/out/_next/static/chunks/3421-7ff7fbaa156985a7.js +1 -0
  38. package/apps/pwa/out/_next/static/chunks/{4745.67d6f99c245af3f7.js → 3498.cf2a15a8a9e5b926.js} +3 -3
  39. package/apps/pwa/out/_next/static/chunks/381.f55dc63ea87735e6.js +1 -0
  40. package/apps/pwa/out/_next/static/chunks/3819.163d4777f0a597f6.js +32 -0
  41. package/apps/pwa/out/_next/static/chunks/{5543.a438b8ab5a13ea47.js → 3837.722e053fb9f321ad.js} +1 -1
  42. package/apps/pwa/out/_next/static/chunks/4129-ab0a6189f1778633.js +1 -0
  43. package/apps/pwa/out/_next/static/chunks/4361.93d14ba594b3a035.js +104 -0
  44. package/apps/pwa/out/_next/static/chunks/4364.7a7eb19cceb67d2f.js +286 -0
  45. package/apps/pwa/out/_next/static/chunks/4406.d71f506f7c3ee9d3.js +149 -0
  46. package/apps/pwa/out/_next/static/chunks/4461.2ad1514180ae7e29.js +148 -0
  47. package/apps/pwa/out/_next/static/chunks/4479.bd309cbe0e3842ee.js +64 -0
  48. package/apps/pwa/out/_next/static/chunks/4522-05966f777d66d13b.js +1 -0
  49. package/apps/pwa/out/_next/static/chunks/4543-9a3e9812e845de65.js +1 -0
  50. package/apps/pwa/out/_next/static/chunks/4557.f8f1d84a0d90d590.js +74 -0
  51. package/apps/pwa/out/_next/static/chunks/4589-79b11542179ef58c.js +1 -0
  52. package/apps/pwa/out/_next/static/chunks/4633-9f8f9f88ffbb8f5c.js +1 -0
  53. package/apps/pwa/out/_next/static/chunks/4831.23af4d10c0697b5e.js +1 -0
  54. package/apps/pwa/out/_next/static/chunks/4983.5951b85724f61f2a.js +1 -0
  55. package/apps/pwa/out/_next/static/chunks/{b313b242.cb1265eea908db61.js → 4fa33ebd.21c1bd5b294496e6.js} +1 -1
  56. package/apps/pwa/out/_next/static/chunks/{997ce8a5-2ad501927003b41b.js → 5014f970-22bef0b5210f7d60.js} +1 -1
  57. package/apps/pwa/out/_next/static/chunks/{2112-e4efc21a6505d5bc.js → 5028-f0722e6114c313e7.js} +1 -1
  58. package/apps/pwa/out/_next/static/chunks/{2898.fd781bc7cf01a7b7.js → 5249.96a848656b582a93.js} +1 -1
  59. package/apps/pwa/out/_next/static/chunks/5311.16e0ffbfa5468b80.js +62 -0
  60. package/apps/pwa/out/_next/static/chunks/{9407.e49124dedf0f5e72.js → 5446.edf141cff9ef647d.js} +1 -1
  61. package/apps/pwa/out/_next/static/chunks/{9002.e5658224e3dc1b6f.js → 5489.ec2dd1b5272a19dc.js} +1 -1
  62. package/apps/pwa/out/_next/static/chunks/{1335-6731f392c35216eb.js → 5576-82d3703636d5c4b9.js} +3 -3
  63. package/apps/pwa/out/_next/static/chunks/559.df87695df637920c.js +1 -0
  64. package/apps/pwa/out/_next/static/chunks/5618-5c88f2f70178c4ad.js +1 -0
  65. package/apps/pwa/out/_next/static/chunks/5764.05487bf0b73ddb6b.js +1 -0
  66. package/apps/pwa/out/_next/static/chunks/5930.e678826c3f831aab.js +1 -0
  67. package/apps/pwa/out/_next/static/chunks/5dfb57f7.f2e3305326202474.js +1 -0
  68. package/apps/pwa/out/_next/static/chunks/6053-d893974de92e6198.js +1 -0
  69. package/apps/pwa/out/_next/static/chunks/{2985.39ccdecd36848b12.js → 6086.913a69e6fa3e4a8b.js} +4 -4
  70. package/apps/pwa/out/_next/static/chunks/6200-cefd6f33f59d765e.js +1 -0
  71. package/apps/pwa/out/_next/static/chunks/6314-edeba650ae686ac9.js +1 -0
  72. package/apps/pwa/out/_next/static/chunks/6316-bc9a9b74d7842d79.js +1 -0
  73. package/apps/pwa/out/_next/static/chunks/6476-13b9779b73528008.js +1 -0
  74. package/apps/pwa/out/_next/static/chunks/666-04db3ac4c8e3c66f.js +1 -0
  75. package/apps/pwa/out/_next/static/chunks/670.682e55106ef915a6.js +77 -0
  76. package/apps/pwa/out/_next/static/chunks/{7862.30a8d6482bb238eb.js → 6740.43de73fc427c9fe2.js} +1 -1
  77. package/apps/pwa/out/_next/static/chunks/6816.b7ba9d0a1a4a46a7.js +1 -0
  78. package/apps/pwa/out/_next/static/chunks/690-fbbcc777f189af37.js +1 -0
  79. package/apps/pwa/out/_next/static/chunks/6989.0d3d4020e5cb3df6.js +90 -0
  80. package/apps/pwa/out/_next/static/chunks/{2871.0bca6137343b3f76.js → 7005.1623d2aea78eb85f.js} +1 -1
  81. package/apps/pwa/out/_next/static/chunks/7193-cf355cca5ba6c5d5.js +1 -0
  82. package/apps/pwa/out/_next/static/chunks/7217-d17393fe7af78fa6.js +1 -0
  83. package/apps/pwa/out/_next/static/chunks/7232.24edbd938a69c8d0.js +1 -0
  84. package/apps/pwa/out/_next/static/chunks/7295cd1e.b4b557908888eeee.js +1 -0
  85. package/apps/pwa/out/_next/static/chunks/7323.adb02de21991883c.js +1 -0
  86. package/apps/pwa/out/_next/static/chunks/7386.5d8e7e42e818dfb6.js +287 -0
  87. package/apps/pwa/out/_next/static/chunks/{7502.ccd5b8065545edd0.js → 7431.3051e9b8a4372d2d.js} +2 -2
  88. package/apps/pwa/out/_next/static/chunks/{3583.a05e88cc8d594628.js → 7448.478958ffbbba0ac0.js} +1 -1
  89. package/apps/pwa/out/_next/static/chunks/7537.ba2208c5c656b8a3.js +1 -0
  90. package/apps/pwa/out/_next/static/chunks/7562.948255cbc3e79d33.js +41 -0
  91. package/apps/pwa/out/_next/static/chunks/7596-962ae6db6cfc9c83.js +1 -0
  92. package/apps/pwa/out/_next/static/chunks/7671.cff51beac212a2ba.js +1 -0
  93. package/apps/pwa/out/_next/static/chunks/7883.3916734ee16d3e58.js +27 -0
  94. package/apps/pwa/out/_next/static/chunks/{9989.3694300e5f000b14.js → 7952.b192c31b6a0e00cc.js} +1 -1
  95. package/apps/pwa/out/_next/static/chunks/801.5b24e81eded22d1b.js +1 -0
  96. package/apps/pwa/out/_next/static/chunks/8176.8c9a8613f5a01ac1.js +36 -0
  97. package/apps/pwa/out/_next/static/chunks/819e78a6.fa3dd7f7da19bf61.js +1 -0
  98. package/apps/pwa/out/_next/static/chunks/8220-78978450c3183d8d.js +1 -0
  99. package/apps/pwa/out/_next/static/chunks/8221-eb60b5bc692a3361.js +1 -0
  100. package/apps/pwa/out/_next/static/chunks/826.e9a26064f474949e.js +1 -0
  101. package/apps/pwa/out/_next/static/chunks/{5307.60f2209e809bd627.js → 8368.014caa8de2f5af34.js} +1 -1
  102. package/apps/pwa/out/_next/static/chunks/8459-a351487a4480f584.js +1 -0
  103. package/apps/pwa/out/_next/static/chunks/8482-75823d513a4ce151.js +1 -0
  104. package/apps/pwa/out/_next/static/chunks/8488.8da515248cda3f3a.js +1 -0
  105. package/apps/pwa/out/_next/static/chunks/{9221.7d22eaf353a2d4e7.js → 8548.036c344973968847.js} +1 -1
  106. package/apps/pwa/out/_next/static/chunks/8584.388a1779d9b203af.js +1 -0
  107. package/apps/pwa/out/_next/static/chunks/8637.a55e098e61ffefb8.js +1 -0
  108. package/apps/pwa/out/_next/static/chunks/8817.61bb7ffbba502ecb.js +1 -0
  109. package/apps/pwa/out/_next/static/chunks/{9398-6aed28f0a96d0d6f.js → 9131-fce7256c4180c4a5.js} +1 -1
  110. package/apps/pwa/out/_next/static/chunks/9207-8e6a12db30373f32.js +1 -0
  111. package/apps/pwa/out/_next/static/chunks/9263-00ae932c62696a86.js +1 -0
  112. package/apps/pwa/out/_next/static/chunks/9318.caafc3a130e8769c.js +1 -0
  113. package/apps/pwa/out/_next/static/chunks/932.da3fb55951882562.js +93 -0
  114. package/apps/pwa/out/_next/static/chunks/9433.002f8426ac75b6b7.js +1 -0
  115. package/apps/pwa/out/_next/static/chunks/9464.dd631a5a14b1d660.js +24 -0
  116. package/apps/pwa/out/_next/static/chunks/{3278.2e5d15b53a4091c8.js → 9550.d5f76828f972058c.js} +2 -2
  117. package/apps/pwa/out/_next/static/chunks/{2534.e85ae21ad0dac829.js → 9739.8d5f36ac67a3b236.js} +1 -1
  118. package/apps/pwa/out/_next/static/chunks/9743.beeabb9d5f86abe4.js +1 -0
  119. package/apps/pwa/out/_next/static/chunks/9843-a23d3f32dc43f715.js +1 -0
  120. package/apps/pwa/out/_next/static/chunks/994-28211077c7c587d5.js +1 -0
  121. package/apps/pwa/out/_next/static/chunks/{7a1887c4.f36b88fba31da8fd.js → 9a8cb466.cc9fc9e6e46038aa.js} +1 -1
  122. package/apps/pwa/out/_next/static/chunks/{0bb0ff36.b8d418980951e5ba.js → 9b48c871.204d5d13e7809bd0.js} +7 -7
  123. package/apps/pwa/out/_next/static/chunks/{409f1e57.d0649fc47691ebfe.js → abb4b98b.163e0f56e84ae35d.js} +1 -1
  124. package/apps/pwa/out/_next/static/chunks/app/_not-found/page-3b4c947f174e33d8.js +1 -0
  125. package/apps/pwa/out/_next/static/chunks/app/approvals/page-369d5ce99483f859.js +1 -0
  126. package/apps/pwa/out/_next/static/chunks/app/autopilot/page-63c0ed0eb26e5fce.js +1 -0
  127. package/apps/pwa/out/_next/static/chunks/app/board/page-62802c6003bc85cc.js +1 -0
  128. package/apps/pwa/out/_next/static/chunks/app/botlab/page-ecb41560d4e77be9.js +1 -0
  129. package/apps/pwa/out/_next/static/chunks/app/bots/page-7b65ad8130c93e95.js +1 -0
  130. package/apps/pwa/out/_next/static/chunks/app/ceo/page-8755477c15a9060c.js +1 -0
  131. package/apps/pwa/out/_next/static/chunks/app/chat/page-5725447dd972c471.js +1 -0
  132. package/apps/pwa/out/_next/static/chunks/app/consult/page-b979de0591a69375.js +1 -0
  133. package/apps/pwa/out/_next/static/chunks/app/control/page-6d0796bf4633751a.js +1 -0
  134. package/apps/pwa/out/_next/static/chunks/app/decisions/page-59c31dc0394e67b4.js +1 -0
  135. package/apps/pwa/out/_next/static/chunks/app/design-check/page-12dfc95f6cc5c718.js +1 -0
  136. package/apps/pwa/out/_next/static/chunks/app/editor/page-25788244e66aa4dd.js +1 -0
  137. package/apps/pwa/out/_next/static/chunks/app/exec/page-a2555dc705466322.js +1 -0
  138. package/apps/pwa/out/_next/static/chunks/app/field/page-4fb31eb476dcbad3.js +1 -0
  139. package/apps/pwa/out/_next/static/chunks/app/healthz/route-3b4c947f174e33d8.js +1 -0
  140. package/apps/pwa/out/_next/static/chunks/app/inside/page-578729adbeaa40cb.js +1 -0
  141. package/apps/pwa/out/_next/static/chunks/app/intake/page-a1d20fffbec35205.js +1 -0
  142. package/apps/pwa/out/_next/static/chunks/app/layout-4a558f94516b8004.js +1 -0
  143. package/apps/pwa/out/_next/static/chunks/app/live/page-9e3834705b86145e.js +1 -0
  144. package/apps/pwa/out/_next/static/chunks/app/live-run/page-d7bff0f0905a662c.js +1 -0
  145. package/apps/pwa/out/_next/static/chunks/app/loops/page-cb1c5fe746ea4014.js +1 -0
  146. package/apps/pwa/out/_next/static/chunks/app/market/page-9ee320507356582a.js +1 -0
  147. package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-66fd183b74835886.js +1 -0
  148. package/apps/pwa/out/_next/static/chunks/app/morning/page-3272a064a01a9927.js +1 -0
  149. package/apps/pwa/out/_next/static/chunks/app/not-found-f281b7a7f6ef2529.js +1 -0
  150. package/apps/pwa/out/_next/static/chunks/app/observatory/page-d45a65f8b7124fcd.js +1 -0
  151. package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-e9c1fe684dd19a66.js +1 -0
  152. package/apps/pwa/out/_next/static/chunks/app/ops/release/page-b8322932fc6e34de.js +1 -0
  153. package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-82c66d9af2290575.js +1 -0
  154. package/apps/pwa/out/_next/static/chunks/app/outputs/page-63c6752009c97b05.js +1 -0
  155. package/apps/pwa/out/_next/static/chunks/app/page-bb33d42ebc358aec.js +1 -0
  156. package/apps/pwa/out/_next/static/chunks/app/reflection/page-7e4c9379197d7214.js +1 -0
  157. package/apps/pwa/out/_next/static/chunks/app/scheduler/page-38bf1e9a7001732b.js +1 -0
  158. package/apps/pwa/out/_next/static/chunks/app/sessions/page-2e5b752012389d56.js +1 -0
  159. package/apps/pwa/out/_next/static/chunks/app/settings/devices/{page-0a07363b130182a1.js → page-398c0faa173203f7.js} +1 -1
  160. package/apps/pwa/out/_next/static/chunks/app/settings/page-002f53a965b6445c.js +1 -0
  161. package/apps/pwa/out/_next/static/chunks/app/setup/done/page-7f75997f61a26269.js +1 -0
  162. package/apps/pwa/out/_next/static/chunks/app/setup/layout-3b4c947f174e33d8.js +1 -0
  163. package/apps/pwa/out/_next/static/chunks/app/setup/page-05631753294f23fb.js +1 -0
  164. package/apps/pwa/out/_next/static/chunks/app/share/page-edd700fd2cc3d7f8.js +1 -0
  165. package/apps/pwa/out/_next/static/chunks/app/showroom/page-105f83ecb4594365.js +1 -0
  166. package/apps/pwa/out/_next/static/chunks/app/tasks/page-5823e87d2017f19c.js +1 -0
  167. package/apps/pwa/out/_next/static/chunks/app/term/page-df3445b207ceceab.js +1 -0
  168. package/apps/pwa/out/_next/static/chunks/app/today/page-b51ca09566c03de7.js +1 -0
  169. package/apps/pwa/out/_next/static/chunks/app/trace/page-8aacd5ded5dbac60.js +1 -0
  170. package/apps/pwa/out/_next/static/chunks/app/vault/page-bae3365a0b3c6a8e.js +1 -0
  171. package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-9ed52b48ff1aa7fd.js +1 -0
  172. package/apps/pwa/out/_next/static/chunks/app/workflows/page-b6f8cad35fe00946.js +1 -0
  173. package/apps/pwa/out/_next/static/chunks/app/workspace/page-6d25ceda500d2457.js +1 -0
  174. package/apps/pwa/out/_next/static/chunks/app/worktrees/page-b6401a5f2c962fe8.js +1 -0
  175. package/apps/pwa/out/_next/static/chunks/ebf6cf5e.0d2f887b040e80fb.js +122 -0
  176. package/apps/pwa/out/_next/static/chunks/f09ec7d7-d29abe23edcbb193.js +1 -0
  177. package/apps/pwa/out/_next/static/chunks/{ebc7d829.264a0bcb6c750b50.js → ffdc3a04.b9c23c1b28dd4a96.js} +1 -1
  178. package/apps/pwa/out/_next/static/chunks/framework-9322cb8a56ac081c.js +1 -0
  179. package/apps/pwa/out/_next/static/chunks/main-2fbab294e49a1561.js +1 -0
  180. package/apps/pwa/out/_next/static/chunks/main-app-f36729f56621a8f3.js +1 -0
  181. package/apps/pwa/out/_next/static/chunks/pages/_app-2a62e450b47c6114.js +1 -0
  182. package/apps/pwa/out/_next/static/chunks/pages/_error-5e17f7b445f34d43.js +1 -0
  183. package/apps/pwa/out/_next/static/chunks/webpack-b4263e2190ea7adf.js +1 -0
  184. package/apps/pwa/out/_next/static/css/b5d88eba78a3d7bf.css +1 -0
  185. package/apps/pwa/out/approvals/index.html +1 -1
  186. package/apps/pwa/out/approvals/index.txt +23 -23
  187. package/apps/pwa/out/autopilot/index.html +1 -1
  188. package/apps/pwa/out/autopilot/index.txt +23 -23
  189. package/apps/pwa/out/board/index.html +1 -1
  190. package/apps/pwa/out/board/index.txt +23 -23
  191. package/apps/pwa/out/botlab/index.html +1 -1
  192. package/apps/pwa/out/botlab/index.txt +22 -22
  193. package/apps/pwa/out/bots/index.html +1 -1
  194. package/apps/pwa/out/bots/index.txt +22 -22
  195. package/apps/pwa/out/ceo/index.html +1 -1
  196. package/apps/pwa/out/ceo/index.txt +23 -23
  197. package/apps/pwa/out/chat/index.html +1 -1
  198. package/apps/pwa/out/chat/index.txt +22 -22
  199. package/apps/pwa/out/consult/index.html +1 -1
  200. package/apps/pwa/out/consult/index.txt +23 -23
  201. package/apps/pwa/out/control/index.html +1 -1
  202. package/apps/pwa/out/control/index.txt +23 -23
  203. package/apps/pwa/out/decisions/index.html +1 -1
  204. package/apps/pwa/out/decisions/index.txt +22 -22
  205. package/apps/pwa/out/design-check/index.html +1 -1
  206. package/apps/pwa/out/design-check/index.txt +23 -23
  207. package/apps/pwa/out/editor/index.html +1 -1
  208. package/apps/pwa/out/editor/index.txt +23 -23
  209. package/apps/pwa/out/exec/index.html +1 -1
  210. package/apps/pwa/out/exec/index.txt +23 -23
  211. package/apps/pwa/out/field/index.html +1 -1
  212. package/apps/pwa/out/field/index.txt +23 -23
  213. package/apps/pwa/out/healthz +1 -1
  214. package/apps/pwa/out/index.html +1 -1
  215. package/apps/pwa/out/index.txt +22 -22
  216. package/apps/pwa/out/inside/index.html +1 -1
  217. package/apps/pwa/out/inside/index.txt +22 -22
  218. package/apps/pwa/out/intake/index.html +1 -1
  219. package/apps/pwa/out/intake/index.txt +23 -23
  220. package/apps/pwa/out/live/index.html +1 -1
  221. package/apps/pwa/out/live/index.txt +26 -23
  222. package/apps/pwa/out/live-run/index.html +1 -1
  223. package/apps/pwa/out/live-run/index.txt +23 -23
  224. package/apps/pwa/out/loops/index.html +1 -1
  225. package/apps/pwa/out/loops/index.txt +22 -22
  226. package/apps/pwa/out/market/index.html +1 -1
  227. package/apps/pwa/out/market/index.txt +22 -22
  228. package/apps/pwa/out/missions/placeholder/index.html +1 -1
  229. package/apps/pwa/out/missions/placeholder/index.txt +22 -22
  230. package/apps/pwa/out/morning/index.html +1 -1
  231. package/apps/pwa/out/morning/index.txt +23 -23
  232. package/apps/pwa/out/observatory/index.html +1 -1
  233. package/apps/pwa/out/observatory/index.txt +23 -23
  234. package/apps/pwa/out/ops/checklist/index.html +1 -1
  235. package/apps/pwa/out/ops/checklist/index.txt +22 -22
  236. package/apps/pwa/out/ops/release/index.html +1 -1
  237. package/apps/pwa/out/ops/release/index.txt +22 -22
  238. package/apps/pwa/out/ops/seats/index.html +1 -1
  239. package/apps/pwa/out/ops/seats/index.txt +22 -22
  240. package/apps/pwa/out/outputs/index.html +1 -1
  241. package/apps/pwa/out/outputs/index.txt +22 -22
  242. package/apps/pwa/out/reflection/index.html +1 -1
  243. package/apps/pwa/out/reflection/index.txt +23 -23
  244. package/apps/pwa/out/scheduler/index.html +1 -1
  245. package/apps/pwa/out/scheduler/index.txt +23 -23
  246. package/apps/pwa/out/sessions/index.html +1 -1
  247. package/apps/pwa/out/sessions/index.txt +22 -22
  248. package/apps/pwa/out/settings/devices/index.html +1 -1
  249. package/apps/pwa/out/settings/devices/index.txt +23 -23
  250. package/apps/pwa/out/settings/index.html +1 -1
  251. package/apps/pwa/out/settings/index.txt +23 -23
  252. package/apps/pwa/out/setup/done/index.html +1 -1
  253. package/apps/pwa/out/setup/done/index.txt +23 -23
  254. package/apps/pwa/out/setup/index.html +1 -1
  255. package/apps/pwa/out/setup/index.txt +23 -23
  256. package/apps/pwa/out/share/index.html +1 -1
  257. package/apps/pwa/out/share/index.txt +23 -23
  258. package/apps/pwa/out/showroom/index.html +1 -1
  259. package/apps/pwa/out/showroom/index.txt +22 -22
  260. package/apps/pwa/out/tasks/index.html +1 -1
  261. package/apps/pwa/out/tasks/index.txt +23 -23
  262. package/apps/pwa/out/term/index.html +1 -1
  263. package/apps/pwa/out/term/index.txt +23 -23
  264. package/apps/pwa/out/today/index.html +1 -1
  265. package/apps/pwa/out/today/index.txt +23 -23
  266. package/apps/pwa/out/trace/index.html +1 -1
  267. package/apps/pwa/out/trace/index.txt +23 -23
  268. package/apps/pwa/out/vault/index.html +1 -1
  269. package/apps/pwa/out/vault/index.txt +23 -23
  270. package/apps/pwa/out/workflows/chat-ui/index.html +1 -1
  271. package/apps/pwa/out/workflows/chat-ui/index.txt +23 -23
  272. package/apps/pwa/out/workflows/index.html +1 -1
  273. package/apps/pwa/out/workflows/index.txt +23 -23
  274. package/apps/pwa/out/workspace/index.html +1 -1
  275. package/apps/pwa/out/workspace/index.txt +23 -23
  276. package/apps/pwa/out/worktrees/index.html +1 -1
  277. package/apps/pwa/out/worktrees/index.txt +23 -23
  278. package/bin/elanous.mjs +9 -2
  279. package/docs/goal-context/README.md +1 -0
  280. package/graphs/default-loop.yaml +20 -3
  281. package/graphs/document-loop.yaml +21 -2
  282. package/graphs/implement-loop.yaml +11 -0
  283. package/graphs/journey/SCENARIOS.md +33 -0
  284. package/graphs/journey/recipes.yaml +1 -0
  285. package/graphs/journey/ta-journey.yaml +84 -0
  286. package/graphs/journey/units/author/author.yaml +20 -0
  287. package/graphs/journey/units/author/recipes.yaml +2 -0
  288. package/graphs/journey/units/green/green.yaml +20 -0
  289. package/graphs/journey/units/green/recipes.yaml +2 -0
  290. package/graphs/journey/units/pr/pr.yaml +20 -0
  291. package/graphs/journey/units/pr/recipes.yaml +2 -0
  292. package/graphs/journey/units/remember/recipes.yaml +2 -0
  293. package/graphs/journey/units/remember/remember.yaml +20 -0
  294. package/graphs/operate-loop.yaml +21 -2
  295. package/graphs/overlays/stop-heal-ladder.yaml +1 -1
  296. package/graphs/release-rehearsal/recipes.yaml +1 -1
  297. package/graphs/release-rehearsal/release-rehearsal.yaml +2 -2
  298. package/graphs/research-loop.yaml +23 -2
  299. package/graphs/units/dispatch-pod/dispatch-pod.yaml +50 -0
  300. package/graphs/units/dispatch-pod/recipes.yaml +14 -0
  301. package/graphs/units/entry/entry.yaml +50 -0
  302. package/graphs/units/entry/recipes.yaml +14 -0
  303. package/graphs/units/harvest/harvest.yaml +25 -0
  304. package/graphs/units/harvest/recipes.yaml +4 -0
  305. package/graphs/units/land/land.yaml +45 -0
  306. package/graphs/units/land/recipes.yaml +3 -0
  307. package/graphs/units/recipes.yaml +7 -0
  308. package/graphs/units/recover.yaml +39 -0
  309. package/graphs/units/reflect/recipes.yaml +3 -0
  310. package/graphs/units/reflect/reflect.yaml +15 -0
  311. package/graphs/units/task-agent-recover-review.yaml +17 -0
  312. package/graphs/units/task-agent-recover-wait.yaml +17 -0
  313. package/graphs/units/verbs/make-doc.yaml +34 -0
  314. package/graphs/units/verbs/recipes.yaml +33 -0
  315. package/graphs/units/verbs/verify.yaml +55 -0
  316. package/graphs/work/recipes.yaml +2 -0
  317. package/graphs/work/research-report.yaml +28 -0
  318. package/package.json +1 -1
  319. package/scripts/ci-typecheck-changed.ts +95 -17
  320. package/scripts/docs/generate-graph-anatomy.ts +19 -2
  321. package/scripts/graph-harvest-unit.ts +22 -0
  322. package/scripts/graph-units/journey-stub.ts +6 -0
  323. package/scripts/graph-units/land-enqueue.ts +78 -0
  324. package/scripts/graph-units/recover-plan.ts +15 -0
  325. package/scripts/graph-units/reflect-node.ts +88 -0
  326. package/scripts/graph-units/ta-journey-observe.ts +109 -0
  327. package/scripts/graph-units/verbs/headless-goal-loop.ts +152 -0
  328. package/scripts/graph-units/verbs/verify-stage.ts +75 -0
  329. package/scripts/graph-units/verbs-envelope.ts +139 -0
  330. package/scripts/hq/standby-snapshot.ts +25 -0
  331. package/scripts/measure-si-task-cpu.ts +143 -0
  332. package/scripts/public-export.ts +43 -1
  333. package/scripts/ratchets/test-interference-patterns.allowlist.txt +0 -2
  334. package/scripts/ratchets/train-side-invariants.sh +45 -0
  335. package/scripts/release-loop/auto-approve-node.ts +30 -16
  336. package/scripts/release-loop/gate-closure.ts +5 -1
  337. package/scripts/release-loop/gate-diff.ts +1 -1
  338. package/scripts/release-loop/gate-node.ts +498 -31
  339. package/scripts/release-loop/gate-partial.ts +3 -3
  340. package/scripts/release-loop/gate-radius-shadow.ts +138 -0
  341. package/scripts/release-loop/gate-traffic-mode.ts +128 -0
  342. package/scripts/release-loop/gate-triage-node.ts +5 -2
  343. package/scripts/release-loop/known-issues-0.2.33-approved.json +194 -0
  344. package/scripts/release-loop/known-issues-node.ts +77 -8
  345. package/scripts/release-loop/preflight.ts +93 -7
  346. package/scripts/release-loop/prepare-node.ts +102 -4
  347. package/scripts/release-loop/publish-node.ts +60 -9
  348. package/scripts/release-loop/resume-cap.ts +56 -0
  349. package/scripts/release-loop/resume-release.ts +114 -15
  350. package/scripts/release-loop/resume.ts +24 -1
  351. package/scripts/release-loop/tui-sim-node.ts +8 -2
  352. package/scripts/release-loop/unattended-release.ts +8 -2
  353. package/src/acp/core-turn-bridge.ts +36 -9
  354. package/src/acp/elanous-extensions.ts +3 -0
  355. package/src/acp/reasoning-thought-buffer.ts +45 -0
  356. package/src/acp/server.ts +3 -0
  357. package/src/acp/tool-trace.ts +186 -11
  358. package/src/agent/self-ambient-cache.ts +156 -0
  359. package/src/agent/self-ambient.ts +8 -1
  360. package/src/agent/task-notification.ts +5 -0
  361. package/src/agent-substrate/acp-reviewer.ts +52 -12
  362. package/src/agent-substrate/pr-reviewer.ts +3 -1
  363. package/src/agent-substrate/review-finding-key.ts +53 -0
  364. package/src/agent-substrate/self-review-cli.ts +126 -5
  365. package/src/ask-user-question/pending-questions.ts +1 -1
  366. package/src/ask-user-question/tool.ts +22 -0
  367. package/src/autopilot/build/llm-conflict-merge.ts +56 -10
  368. package/src/autopilot/pr-manager.ts +213 -46
  369. package/src/capture/frame-state-detect.ts +39 -0
  370. package/src/capture/tui-self-report.ts +134 -6
  371. package/src/chat/index.ts +61 -15
  372. package/src/chat/pickers/modal-runtime.ts +6 -0
  373. package/src/chat/pickers/modals.ts +8 -2
  374. package/src/chat/tool-render/dispatch.ts +62 -10
  375. package/src/cli/ask-bare.ts +1 -0
  376. package/src/cli/control-cli.ts +24 -7
  377. package/src/cli/guardian-cli.ts +10 -0
  378. package/src/cli/import-cli.ts +12 -0
  379. package/src/cli/light-entry-route.ts +35 -0
  380. package/src/cli/llm-detect-cli.ts +23 -1
  381. package/src/cli/log-event-names.ts +10 -0
  382. package/src/cli/msg-cli.ts +1 -0
  383. package/src/cli/pod-cli.ts +14 -3
  384. package/src/cli/pr-cli.ts +140 -41
  385. package/src/cli/pr-land-base-read.ts +36 -0
  386. package/src/cli/pr-land-heavy-remote.ts +81 -25
  387. package/src/cli/pr-land-overlap-evidence.ts +200 -18
  388. package/src/cli/pr-land-pod-shadow-job.ts +26 -3
  389. package/src/cli/pr-land-recovery.ts +64 -0
  390. package/src/cli/pr-land-refusal.ts +20 -5
  391. package/src/cli/pty-takeover-cli.ts +94 -19
  392. package/src/cli/release-cli.ts +120 -33
  393. package/src/cli/release-run-if-ready.ts +29 -28
  394. package/src/cli/release-single-flight.ts +178 -0
  395. package/src/cli/seat-cli.ts +37 -0
  396. package/src/cli/setup-cli.ts +40 -1
  397. package/src/cli/sim-cli.ts +18 -0
  398. package/src/cli/tasks-cli.ts +149 -5
  399. package/src/context-bus/ops-events.ts +6 -2
  400. package/src/control/control-status.ts +8 -3
  401. package/src/control-plane/ledger.ts +5 -3
  402. package/src/control-plane/server.ts +5 -3
  403. package/src/core-turn/run-core-turn.ts +1 -0
  404. package/src/core-turn/run-goal-loop.ts +21 -0
  405. package/src/core-turn/short-question.ts +5 -1
  406. package/src/core-turn/types.ts +3 -0
  407. package/src/dashboard/acp-active-model.ts +42 -1
  408. package/src/dashboard/background-jobs-status.ts +66 -0
  409. package/src/dashboard/index.ts +153 -111
  410. package/src/dashboard/input/agent-wake.ts +242 -0
  411. package/src/dashboard/input/chat-main-entry-runtime.ts +5 -0
  412. package/src/dashboard/input/chat-main-plain-turn-runtime.ts +3 -0
  413. package/src/dashboard/input/dashboard-plain-turn-stream.ts +4 -0
  414. package/src/dashboard/input/external-input-host.ts +23 -9
  415. package/src/dashboard/input/mouse-wiring.ts +108 -11
  416. package/src/dashboard/input/seat-autowake.ts +56 -3
  417. package/src/dashboard/log-click-runtime.ts +118 -2
  418. package/src/dashboard/seat-boot-preamble.ts +1 -1
  419. package/src/dashboard/slash-runtime/ask-clarification.ts +48 -0
  420. package/src/dashboard/slash-runtime/dashboard-delegated-slashes.ts +68 -0
  421. package/src/dashboard/slash-runtime/dashboard-handlers.ts +62 -322
  422. package/src/dashboard/slash-runtime/dashboard-log-slash.ts +208 -0
  423. package/src/dashboard/turn-preamble.ts +163 -41
  424. package/src/dashboard/turn-session-layers.ts +4 -2
  425. package/src/dashboard/turn-start-segments.ts +222 -0
  426. package/src/dashboard/turn-stream-formatter.ts +34 -1
  427. package/src/dashboard/turn-stream-runtime.ts +2 -0
  428. package/src/dashboard/turn-typeahead-prompt-zone.ts +67 -0
  429. package/src/display/prompt-row-owner.ts +146 -0
  430. package/src/display/resize-listener.ts +33 -2
  431. package/src/domains/guardian-tick.ts +54 -2
  432. package/src/domains/outbound-alert.ts +3 -2
  433. package/src/extractors.ts +3 -1
  434. package/src/fold-stack.ts +4 -2
  435. package/src/git-fs/index.ts +263 -36
  436. package/src/git-fs/retry.ts +4 -0
  437. package/src/git-fs/runner.ts +2 -0
  438. package/src/graph-runner/runner.ts +114 -44
  439. package/src/grok/credential.ts +5 -0
  440. package/src/harness/gate-reserve.ts +87 -0
  441. package/src/harness/harness-cli-command.ts +39 -10
  442. package/src/harness/harness-incidents.ts +17 -0
  443. package/src/harness/harness-pod-dispatch.ts +38 -1
  444. package/src/harness/harness-queue.ts +15 -0
  445. package/src/harness/harness-salvage-cli.ts +14 -2
  446. package/src/index.ts +198 -12
  447. package/src/input/external-input-queue.ts +34 -9
  448. package/src/intake-plane/already-built-hint.ts +89 -0
  449. package/src/knowhow/pack.ts +199 -0
  450. package/src/light-cli.ts +95 -0
  451. package/src/llm/route-decision.ts +36 -0
  452. package/src/llm/tool-loop-steered-rejection.ts +8 -0
  453. package/src/llm-request-shape.ts +209 -0
  454. package/src/llm.ts +221 -276
  455. package/src/loops/budget.ts +95 -0
  456. package/src/loops/msg-wake.ts +8 -2
  457. package/src/loops/orchestrator/tick.ts +24 -2
  458. package/src/loops/orchestrator/traffic.ts +132 -1
  459. package/src/maturity/feature-maturity.ts +1 -1
  460. package/src/mss/logging/log-store.ts +4 -5
  461. package/src/mss/logging/render-categories.ts +5 -0
  462. package/src/nexus/api/graphs-api.ts +22 -3
  463. package/src/nexus/api/http-server.ts +1 -1
  464. package/src/nexus/api/ops-api.ts +12 -0
  465. package/src/oauth/claude-pty-maturity.ts +66 -0
  466. package/src/oauth/codex-access-mirror.ts +55 -0
  467. package/src/oauth/fallback-chain.ts +1 -1
  468. package/src/onboarding/first-run.ts +5 -3
  469. package/src/onboarding/non-interactive.ts +64 -13
  470. package/src/onboarding.ts +10 -2
  471. package/src/ops/overview-collect.ts +36 -1
  472. package/src/ops/overview.ts +70 -2
  473. package/src/pr-tool/census.ts +41 -8
  474. package/src/pr-tool/inflight-registry.ts +296 -0
  475. package/src/prompt-library/gpt6-family-addendum.ts +14 -1
  476. package/src/pty-shell/herdr-agent-report.ts +442 -0
  477. package/src/pty-shell/pty-control-ipc.ts +5 -5
  478. package/src/pty-shell/pty-manifest.ts +12 -3
  479. package/src/pty-shell/pty-write-outcome.ts +24 -6
  480. package/src/pty-shell/tui-run-state.ts +151 -6
  481. package/src/release-loop/checklist.ts +79 -5
  482. package/src/release-loop/feature-store.ts +19 -2
  483. package/src/release-loop/placement.ts +10 -3
  484. package/src/release-loop/rehearsal.ts +205 -25
  485. package/src/release-loop/rubric.ts +16 -2
  486. package/src/seat-loop/traffic-signal.ts +2 -1
  487. package/src/self-dev/ask-launch-flow.ts +13 -0
  488. package/src/self-dev/draft-residue.ts +243 -24
  489. package/src/self-dev/draft-sweep.ts +52 -3
  490. package/src/self-dev/graph-journey-nodes.ts +10 -6
  491. package/src/self-dev/graph-journey-route.ts +60 -6
  492. package/src/self-dev/orchestrate.ts +79 -3
  493. package/src/self-dev/run-supervisor.ts +107 -12
  494. package/src/self-dev/run-types.ts +5 -1
  495. package/src/self-dev/shard-plan.ts +11 -3
  496. package/src/self-dev/shard-run.ts +103 -10
  497. package/src/self-implement/elanous-tui-spawn.ts +14 -0
  498. package/src/self-implement/follow-up-placement.ts +79 -0
  499. package/src/self-implement/gate-artifacts.ts +15 -4
  500. package/src/self-implement/gate-baseline.ts +145 -10
  501. package/src/self-implement/gate-cli.ts +7 -2
  502. package/src/self-implement/gate-remote.ts +35 -6
  503. package/src/self-implement/goal-author-identity.ts +66 -0
  504. package/src/self-implement/goal-author-preservation-obligation.ts +35 -0
  505. package/src/self-implement/goal-author.ts +4 -120
  506. package/src/self-implement/graph-overlay-yaml.ts +17 -2
  507. package/src/self-implement/graph-unit-flatten.ts +103 -0
  508. package/src/self-implement/graph-unit-resolver.ts +107 -0
  509. package/src/self-implement/graph-yaml.ts +151 -1
  510. package/src/self-implement/headless-elanous-driver.ts +1 -0
  511. package/src/self-implement/host-regate.ts +36 -4
  512. package/src/self-implement/knowhow-pack.ts +103 -0
  513. package/src/self-implement/orchestrator.ts +109 -11
  514. package/src/self-implement/pod-warm-pool-profile.ts +45 -0
  515. package/src/self-implement/review-mustfix-class.ts +203 -0
  516. package/src/self-implement/run-ledger.ts +16 -14
  517. package/src/self-implement/run-stop.ts +8 -2
  518. package/src/self-implement/seams.ts +32 -1
  519. package/src/self-implement/stop-autoheal.ts +25 -1
  520. package/src/session/chat.ts +27 -0
  521. package/src/session-runtime/index.ts +22 -267
  522. package/src/session-runtime/retry-policy.ts +2 -1
  523. package/src/shell-runner/background-surface.ts +15 -5
  524. package/src/skills/tools/agent.ts +39 -6
  525. package/src/skills/tools/list-dir.ts +11 -0
  526. package/src/skills/tools/schedule-wakeup.ts +457 -0
  527. package/src/skills/tools/shell.ts +245 -3
  528. package/src/status/bar.ts +26 -0
  529. package/src/steward/digest-delivery.ts +118 -0
  530. package/src/steward/hold-hygiene.ts +120 -0
  531. package/src/steward/release-day.ts +7 -3
  532. package/src/steward/triage.ts +47 -4
  533. package/src/surface/shell-runner-boot.ts +5 -2
  534. package/src/task-agent/harvest-unit.ts +141 -0
  535. package/src/task-agent/live-moves.ts +98 -12
  536. package/src/task-agent/parent-host.ts +93 -3
  537. package/src/task-agent/postland-card.ts +80 -1
  538. package/src/task-agent/rejudge-on-head.ts +112 -26
  539. package/src/task-agent/repair-branch-cas.ts +4 -1
  540. package/src/task-agent/repair-cycle.ts +16 -3
  541. package/src/task-agent/run-identity.ts +4 -3
  542. package/src/task-agent/shadow.ts +12 -2
  543. package/src/task-agent/task-hand.ts +76 -5
  544. package/src/task-agent/work-order-build.ts +22 -0
  545. package/src/task-orchestrator/surfaces/pod-account-broker.ts +39 -3
  546. package/src/task-orchestrator/surfaces/pod-command-job.ts +67 -12
  547. package/src/task-orchestrator/surfaces/pod-lease.ts +98 -0
  548. package/src/task-orchestrator/surfaces/pod-ledger-events.ts +1 -1
  549. package/src/task-orchestrator/surfaces/pod-lifecycle-stages.ts +86 -8
  550. package/src/task-orchestrator/surfaces/pod-pool.ts +76 -18
  551. package/src/task-orchestrator/surfaces/pod-reuse-cleanup.ts +10 -6
  552. package/src/task-orchestrator/surfaces/pod-source-receive.ts +54 -4
  553. package/src/task-orchestrator/surfaces/pod-warm-worker-pod.ts +548 -0
  554. package/src/task-orchestrator/surfaces/pod-warm-worker-provider.ts +389 -0
  555. package/src/task-orchestrator/surfaces/pod-warm-worker-runner.ts +90 -0
  556. package/src/task-orchestrator/surfaces/pod-warm-worker-runtime.ts +158 -3
  557. package/src/task-orchestrator/surfaces/self-implement-pod.ts +230 -43
  558. package/src/task-orchestrator/surfaces/self-implement.ts +83 -2
  559. package/src/tool-runtime/truncation-store.ts +4 -0
  560. package/src/tui/chat/execution-badge.ts +5 -1
  561. package/src/tui/input-lag-probe.ts +230 -0
  562. package/src/tui-client/dashboard-session.ts +10 -1
  563. package/src/tui.ts +4 -0
  564. package/src/user-config/coercion.ts +36 -0
  565. package/src/user-config.ts +18 -41
  566. package/src/ux-sim/scenario.ts +314 -0
  567. package/src/version/packed-revision.json +1 -1
  568. package/apps/pwa/out/_next/static/chunks/1034-8b639cee57b8e4a8.js +0 -1
  569. package/apps/pwa/out/_next/static/chunks/1085-6c2d35526f11f840.js +0 -1
  570. package/apps/pwa/out/_next/static/chunks/1220.1ff7d5cdc34b1ae5.js +0 -27
  571. package/apps/pwa/out/_next/static/chunks/1247.5884ec81b39fe2e7.js +0 -287
  572. package/apps/pwa/out/_next/static/chunks/1302.87681521a7a4661e.js +0 -62
  573. package/apps/pwa/out/_next/static/chunks/1324-59dae3002413623b.js +0 -1
  574. package/apps/pwa/out/_next/static/chunks/1343-f40b5870ac1eda5a.js +0 -1
  575. package/apps/pwa/out/_next/static/chunks/146-b6cd56be11dda017.js +0 -1
  576. package/apps/pwa/out/_next/static/chunks/1654.32de4b324981a188.js +0 -23
  577. package/apps/pwa/out/_next/static/chunks/1834-50625904996a8fa8.js +0 -1
  578. package/apps/pwa/out/_next/static/chunks/1849.1ce38efa6c527d9a.js +0 -149
  579. package/apps/pwa/out/_next/static/chunks/1913.7cc6fb6055b1ed3f.js +0 -41
  580. package/apps/pwa/out/_next/static/chunks/2001.6c7e0fd02190886c.js +0 -1
  581. package/apps/pwa/out/_next/static/chunks/2030.41fae98c7e907304.js +0 -1
  582. package/apps/pwa/out/_next/static/chunks/2099-08b2f2dfba742c9b.js +0 -1
  583. package/apps/pwa/out/_next/static/chunks/2134.ecee03a550ee7250.js +0 -1
  584. package/apps/pwa/out/_next/static/chunks/2236.66061832181cb745.js +0 -1
  585. package/apps/pwa/out/_next/static/chunks/2422.b0bd272e7020d7e6.js +0 -1
  586. package/apps/pwa/out/_next/static/chunks/3040.92ff9ffc9f971cb9.js +0 -115
  587. package/apps/pwa/out/_next/static/chunks/3144.6861096c7b4edef7.js +0 -64
  588. package/apps/pwa/out/_next/static/chunks/3267c0e6.d34854e7b3984a6e.js +0 -1
  589. package/apps/pwa/out/_next/static/chunks/3771.e928edf2867d28c0.js +0 -1
  590. package/apps/pwa/out/_next/static/chunks/3902.e1e71aaac850a045.js +0 -34
  591. package/apps/pwa/out/_next/static/chunks/4063-03284b5de59965f3.js +0 -1
  592. package/apps/pwa/out/_next/static/chunks/4111.2bfedbb233ad206b.js +0 -1
  593. package/apps/pwa/out/_next/static/chunks/4300-c7ec4eeabbb5f3f7.js +0 -1
  594. package/apps/pwa/out/_next/static/chunks/4483.646d5065199e1b55.js +0 -36
  595. package/apps/pwa/out/_next/static/chunks/4519.28199ff26b2fd80d.js +0 -1
  596. package/apps/pwa/out/_next/static/chunks/4581.ef2443578054544f.js +0 -1
  597. package/apps/pwa/out/_next/static/chunks/4608-8d894e9cbe4f08bf.js +0 -1
  598. package/apps/pwa/out/_next/static/chunks/4639.ae48a01d1bb50a93.js +0 -286
  599. package/apps/pwa/out/_next/static/chunks/4739.08742ac668aada67.js +0 -77
  600. package/apps/pwa/out/_next/static/chunks/4882-16cef71d6a1a32be.js +0 -1
  601. package/apps/pwa/out/_next/static/chunks/4999.c064a4000c2a9e94.js +0 -79
  602. package/apps/pwa/out/_next/static/chunks/5260-69f35419bca263e7.js +0 -1
  603. package/apps/pwa/out/_next/static/chunks/5272.b92d1b72a15c25fe.js +0 -1
  604. package/apps/pwa/out/_next/static/chunks/5304.04d24756f242a094.js +0 -148
  605. package/apps/pwa/out/_next/static/chunks/5415-997980f828667736.js +0 -1
  606. package/apps/pwa/out/_next/static/chunks/5458-16cd7a2b51b74c8c.js +0 -1
  607. package/apps/pwa/out/_next/static/chunks/5572-42c9084f27ca761e.js +0 -1
  608. package/apps/pwa/out/_next/static/chunks/5661-80470aac963d9f36.js +0 -1
  609. package/apps/pwa/out/_next/static/chunks/5723.421338408b5c30c4.js +0 -74
  610. package/apps/pwa/out/_next/static/chunks/5809.64c3664267c50bce.js +0 -1
  611. package/apps/pwa/out/_next/static/chunks/6000.64bc21ac8627f2f5.js +0 -94
  612. package/apps/pwa/out/_next/static/chunks/6013.39459b9c68eabf5f.js +0 -1
  613. package/apps/pwa/out/_next/static/chunks/607-06466dff012b03ef.js +0 -1
  614. package/apps/pwa/out/_next/static/chunks/60fb96c9.360b01d8d4927b7b.js +0 -1
  615. package/apps/pwa/out/_next/static/chunks/6192.a190b989b81e9743.js +0 -1
  616. package/apps/pwa/out/_next/static/chunks/6323.8672b4817a306928.js +0 -1
  617. package/apps/pwa/out/_next/static/chunks/6444.7d1fdcb9b09ae71c.js +0 -1
  618. package/apps/pwa/out/_next/static/chunks/6517.4147878ac06d584d.js +0 -90
  619. package/apps/pwa/out/_next/static/chunks/6532.e34302010b2f0b68.js +0 -32
  620. package/apps/pwa/out/_next/static/chunks/6544cb48.a87fe20ddf137be2.js +0 -1
  621. package/apps/pwa/out/_next/static/chunks/6546.74bc4ed82f19016d.js +0 -104
  622. package/apps/pwa/out/_next/static/chunks/6684-e7523ce7c2fad075.js +0 -1
  623. package/apps/pwa/out/_next/static/chunks/6726.ebdc82feb161431e.js +0 -1
  624. package/apps/pwa/out/_next/static/chunks/6739.00fb6f892e5e392b.js +0 -1
  625. package/apps/pwa/out/_next/static/chunks/6745.934c4921bf15513a.js +0 -1
  626. package/apps/pwa/out/_next/static/chunks/6767.ea607cf0c20a25af.js +0 -24
  627. package/apps/pwa/out/_next/static/chunks/6843.67bfd020da0926c5.js +0 -93
  628. package/apps/pwa/out/_next/static/chunks/6948.1062d4594652b5bf.js +0 -1
  629. package/apps/pwa/out/_next/static/chunks/7138-eaf841fc1dc03463.js +0 -1
  630. package/apps/pwa/out/_next/static/chunks/7174-cda29ee13d7790e7.js +0 -1
  631. package/apps/pwa/out/_next/static/chunks/7304-3c07583f4e405f4f.js +0 -1
  632. package/apps/pwa/out/_next/static/chunks/7371.80c05c653b08e907.js +0 -1
  633. package/apps/pwa/out/_next/static/chunks/7391.ebae168025c91b6a.js +0 -1
  634. package/apps/pwa/out/_next/static/chunks/7557.e325503a090a4310.js +0 -8
  635. package/apps/pwa/out/_next/static/chunks/7569-9ce9432c7f10989f.js +0 -1
  636. package/apps/pwa/out/_next/static/chunks/7886-55854585fadeded1.js +0 -1
  637. package/apps/pwa/out/_next/static/chunks/7947-d0759430f8042240.js +0 -1
  638. package/apps/pwa/out/_next/static/chunks/8018.a32663f04a6fc5f9.js +0 -1
  639. package/apps/pwa/out/_next/static/chunks/8097-92f87bd108322f66.js +0 -1
  640. package/apps/pwa/out/_next/static/chunks/8215-1661812b6e9ad71f.js +0 -1
  641. package/apps/pwa/out/_next/static/chunks/8260-19c921a51ca8ec3e.js +0 -1
  642. package/apps/pwa/out/_next/static/chunks/8440.3a5cf5c85aa76db8.js +0 -1
  643. package/apps/pwa/out/_next/static/chunks/8519-4599be2249161e68.js +0 -1
  644. package/apps/pwa/out/_next/static/chunks/8547.b028b90c5c01ace6.js +0 -1
  645. package/apps/pwa/out/_next/static/chunks/8587-cbe02a953a7f4990.js +0 -1
  646. package/apps/pwa/out/_next/static/chunks/877-2b977259c4b15655.js +0 -1
  647. package/apps/pwa/out/_next/static/chunks/9019-0a4b40c50c7314fb.js +0 -1
  648. package/apps/pwa/out/_next/static/chunks/9138.b6e80031afb1d973.js +0 -1
  649. package/apps/pwa/out/_next/static/chunks/9188-d36e4fc869ddc166.js +0 -1
  650. package/apps/pwa/out/_next/static/chunks/9230.44f5039e796e4ab4.js +0 -1
  651. package/apps/pwa/out/_next/static/chunks/9279-d28c5b7754d010ae.js +0 -1
  652. package/apps/pwa/out/_next/static/chunks/939.336acce73e98482c.js +0 -1
  653. package/apps/pwa/out/_next/static/chunks/9610.c07cce4bfcc14ed7.js +0 -1
  654. package/apps/pwa/out/_next/static/chunks/9667-ce78c2ce91050ff9.js +0 -1
  655. package/apps/pwa/out/_next/static/chunks/app/_not-found/page-339fabb3499da0e1.js +0 -1
  656. package/apps/pwa/out/_next/static/chunks/app/approvals/page-bf3634a117322df7.js +0 -1
  657. package/apps/pwa/out/_next/static/chunks/app/autopilot/page-3535a4a69f1fafaa.js +0 -1
  658. package/apps/pwa/out/_next/static/chunks/app/board/page-b9f51447f757fbf2.js +0 -1
  659. package/apps/pwa/out/_next/static/chunks/app/botlab/page-2ebb8fd59b9461f9.js +0 -1
  660. package/apps/pwa/out/_next/static/chunks/app/bots/page-a2fc4e49a4fa4ba8.js +0 -1
  661. package/apps/pwa/out/_next/static/chunks/app/ceo/page-5a503541353e60a8.js +0 -1
  662. package/apps/pwa/out/_next/static/chunks/app/chat/page-6025101384e361a5.js +0 -1
  663. package/apps/pwa/out/_next/static/chunks/app/consult/page-f4b630cc8b5273cd.js +0 -1
  664. package/apps/pwa/out/_next/static/chunks/app/control/page-a645f00a06483e9a.js +0 -1
  665. package/apps/pwa/out/_next/static/chunks/app/decisions/page-61ac22cbab1ee4ec.js +0 -1
  666. package/apps/pwa/out/_next/static/chunks/app/design-check/page-e9bab7413b028b28.js +0 -1
  667. package/apps/pwa/out/_next/static/chunks/app/editor/page-c992eafe028b642e.js +0 -1
  668. package/apps/pwa/out/_next/static/chunks/app/exec/page-e547e6ce55f1fb33.js +0 -1
  669. package/apps/pwa/out/_next/static/chunks/app/field/page-d27e1b9850fd54bf.js +0 -1
  670. package/apps/pwa/out/_next/static/chunks/app/healthz/route-339fabb3499da0e1.js +0 -1
  671. package/apps/pwa/out/_next/static/chunks/app/inside/page-805ac2e137b7a121.js +0 -1
  672. package/apps/pwa/out/_next/static/chunks/app/intake/page-0fec29c7ba01894b.js +0 -1
  673. package/apps/pwa/out/_next/static/chunks/app/layout-339a07410cd6f36b.js +0 -1
  674. package/apps/pwa/out/_next/static/chunks/app/live/page-349f2752d8cd37ad.js +0 -1
  675. package/apps/pwa/out/_next/static/chunks/app/live-run/page-d5c6dcf31c25cecc.js +0 -1
  676. package/apps/pwa/out/_next/static/chunks/app/loops/page-2fd93ed8c9f16580.js +0 -1
  677. package/apps/pwa/out/_next/static/chunks/app/market/page-9b564dbff0fefc35.js +0 -1
  678. package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-62f4475d3c38fb9b.js +0 -1
  679. package/apps/pwa/out/_next/static/chunks/app/morning/page-814ba51385225776.js +0 -1
  680. package/apps/pwa/out/_next/static/chunks/app/not-found-397d479626e5a459.js +0 -1
  681. package/apps/pwa/out/_next/static/chunks/app/observatory/page-af1bba4e3251b728.js +0 -1
  682. package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-3ad3be5e7d3fdce9.js +0 -1
  683. package/apps/pwa/out/_next/static/chunks/app/ops/release/page-f219ccdbc0bf27df.js +0 -1
  684. package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-4da93ad35d4a8d28.js +0 -1
  685. package/apps/pwa/out/_next/static/chunks/app/outputs/page-456666766e5ce6fc.js +0 -1
  686. package/apps/pwa/out/_next/static/chunks/app/page-7404e377e8adb8c5.js +0 -1
  687. package/apps/pwa/out/_next/static/chunks/app/reflection/page-14456240ed2a36ad.js +0 -1
  688. package/apps/pwa/out/_next/static/chunks/app/scheduler/page-3a658d5fa6d16a25.js +0 -1
  689. package/apps/pwa/out/_next/static/chunks/app/sessions/page-0157de6e85f8bb6b.js +0 -1
  690. package/apps/pwa/out/_next/static/chunks/app/settings/page-841d73d4ac44ed49.js +0 -1
  691. package/apps/pwa/out/_next/static/chunks/app/setup/done/page-6f43a3d1146e6377.js +0 -1
  692. package/apps/pwa/out/_next/static/chunks/app/setup/layout-339fabb3499da0e1.js +0 -1
  693. package/apps/pwa/out/_next/static/chunks/app/setup/page-521ee23ac8c0abfa.js +0 -1
  694. package/apps/pwa/out/_next/static/chunks/app/share/page-a9992ee285efaa83.js +0 -1
  695. package/apps/pwa/out/_next/static/chunks/app/showroom/page-3d48e85fa89ec04f.js +0 -1
  696. package/apps/pwa/out/_next/static/chunks/app/tasks/page-d2ced71132fac9b2.js +0 -1
  697. package/apps/pwa/out/_next/static/chunks/app/term/page-f08358bdf251adb9.js +0 -1
  698. package/apps/pwa/out/_next/static/chunks/app/today/page-233c71cd5f68f0d7.js +0 -1
  699. package/apps/pwa/out/_next/static/chunks/app/trace/page-70151d78de2f375e.js +0 -1
  700. package/apps/pwa/out/_next/static/chunks/app/vault/page-dcac33a3e2cb72c0.js +0 -1
  701. package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-149dc1caba411bb9.js +0 -1
  702. package/apps/pwa/out/_next/static/chunks/app/workflows/page-0448145ccd5c45c1.js +0 -1
  703. package/apps/pwa/out/_next/static/chunks/app/workspace/page-9cb0c444903da65d.js +0 -1
  704. package/apps/pwa/out/_next/static/chunks/app/worktrees/page-17e504c396e0e389.js +0 -1
  705. package/apps/pwa/out/_next/static/chunks/e5012ffe.f727e23c231f4342.js +0 -122
  706. package/apps/pwa/out/_next/static/chunks/ea695e3c-1f1d70d740cf3031.js +0 -1
  707. package/apps/pwa/out/_next/static/chunks/framework-906af9bd029e166c.js +0 -1
  708. package/apps/pwa/out/_next/static/chunks/main-a24847f9f684d469.js +0 -1
  709. package/apps/pwa/out/_next/static/chunks/main-app-7bdcd8aa7c8397d3.js +0 -1
  710. package/apps/pwa/out/_next/static/chunks/pages/_app-6ba46a5066fc226d.js +0 -1
  711. package/apps/pwa/out/_next/static/chunks/pages/_error-a8dc6d07591f2a25.js +0 -1
  712. package/apps/pwa/out/_next/static/chunks/webpack-f13df28c15c55eee.js +0 -1
  713. package/apps/pwa/out/_next/static/css/3f5fc6f96e2cf7b2.css +0 -1
  714. package/src/cli/g6a-registration-probe.ts +0 -16
  715. /package/apps/pwa/out/_next/static/{LSXfY0u9QtfDbejY0Ukf_ → L04y73dlwKeTW-GetaTF3}/_ssgManifest.js +0 -0
package/src/chat/index.ts CHANGED
@@ -10,6 +10,7 @@ import type { ChatPickerKind } from './pickers/kinds.js';
10
10
  import { createPickerState, type BufferAction, type PickerBufferView } from './pickers/state.js';
11
11
  import { createChatPickerModalRuntime } from './pickers/modal-runtime.js';
12
12
  import type { ModalSurface } from '../display/modal-stack.js';
13
+ import type { PromptRowOwner } from '../display/prompt-row-owner.js';
13
14
  // Type-only import: avoids the runtime circular dep that streamGrok
14
15
  // below sidesteps with a dynamic `await import('../llm.js')`. Keeping
15
16
  // ChatMessage structurally compatible with LLMMessage lets the
@@ -35,6 +36,7 @@ import {
35
36
  } from '../input-core/index.js';
36
37
  import { applyInlineEditorKey } from '../input-core/inline-editor-key.js';
37
38
  import type { InputSourceRef } from '../input/input-source-kind.js';
39
+ import { routeRawPtyStop } from '../input/external-input-queue.js';
38
40
  import {
39
41
  multilineEditorBackspace,
40
42
  multilineEditorInsertLineBreak,
@@ -70,6 +72,7 @@ export interface ModalSink {
70
72
  * DisplayCoordinator that satisfies both. */
71
73
  export interface DisplaySink extends CursorSink, ModalSink {}
72
74
  import type { Key } from '../tui.js';
75
+ import { noteInputLagKey, noteInputLagPaint } from '../tui/input-lag-probe.js';
73
76
  import {
74
77
  createSpinner,
75
78
  createToolLoader,
@@ -173,6 +176,8 @@ function writeTerminal(chunk: string): void {
173
176
  process.stdout.write(chunk);
174
177
  // viaCoordinator=false — this is the bypass path /perf highlights.
175
178
  perf.recordStdoutWrite(chunk.length, false);
179
+ // 입력칸 키 echo 는 render() 가 아니라 이 직접 쓰기로 칠해진다 — 키→칠 관측의 칠 지점.
180
+ noteInputLagPaint();
176
181
  }
177
182
 
178
183
  /** textInput reports the current prompt's top row so writeTerminal
@@ -324,11 +329,16 @@ export function createTextInputRenderActions(opts: {
324
329
  * coordinator-owned cursor sinks re-show it at the final position. */
325
330
  hideCursorBeforePaint?: boolean;
326
331
  beforePaint?: () => void;
332
+ /** The frame renderer owns the prompt band (TUI-PROMPT-SINGLE-OWNER):
333
+ * `paint` only publishes, so there are no direct writes to wrap in
334
+ * synchronized output. */
335
+ frameOwned?: boolean;
327
336
  modalSink?: ModalSink;
328
337
  shouldRequestModalRender?: () => boolean;
329
338
  }): TextInputRenderActions {
330
- const paintAll = (synchronizedOutput = false) => {
339
+ const paintAll = (requestSynchronizedOutput = false) => {
331
340
  if (opts.shouldPaint?.() === false) return false;
341
+ const synchronizedOutput = requestSynchronizedOutput && !opts.frameOwned;
332
342
  if (synchronizedOutput) writeTerminal(SYNCHRONIZED_OUTPUT_BEGIN);
333
343
  try {
334
344
  if (opts.beforePaint) {
@@ -837,6 +847,10 @@ export async function textInput(opts: {
837
847
  * input is idle. */
838
848
  insertAtCursor?: (text: string) => void;
839
849
  };
850
+ /** TUI-PROMPT-SINGLE-OWNER — when supplied, the frame renderer owns
851
+ * the prompt band: drawInput publishes its rows/hint/caret here and
852
+ * writes nothing to the prompt rows itself (no direct `\x1b[2K`). */
853
+ promptRowOwner?: PromptRowOwner;
840
854
  /** P2.2.c — sink for cursor placement. When supplied, drawInput
841
855
  * routes its caret-position decision through this instead of
842
856
  * emitting `\\x1b[r;cH` directly. The coordinator owns the
@@ -1194,6 +1208,8 @@ export async function textInput(opts: {
1194
1208
  // from there as lines accumulate. `startOffset` is how many rows
1195
1209
  // up from `row` we start touching — zero when both current and
1196
1210
  // previous drew only one line.
1211
+ const promptRowOwner = opts.promptRowOwner;
1212
+ const ownedRows: string[] = [];
1197
1213
  for (let i = 0; i < rowsToTouch; i++) {
1198
1214
  const r = row - i; // i=0 → bottom row; i=1 → one row up; etc.
1199
1215
  if (r < 1) continue;
@@ -1212,8 +1228,9 @@ export async function textInput(opts: {
1212
1228
  ).display;
1213
1229
 
1214
1230
  const padded = display + ' '.repeat(Math.max(0, rowTextW - visibleWidth(display)));
1215
- writeTerminal(ansi.moveTo(r, col) + '\x1b[2K' + pfx + padded);
1216
- } else {
1231
+ if (promptRowOwner) ownedRows.unshift(pfx + padded);
1232
+ else writeTerminal(ansi.moveTo(r, col) + '\x1b[2K' + pfx + padded);
1233
+ } else if (!promptRowOwner) {
1217
1234
  // This row had content on the previous paint but doesn't anymore
1218
1235
  // (user deleted a line / shrank the input). Clear it so stale
1219
1236
  // text doesn't linger on what is now part of the log / divider
@@ -1223,7 +1240,9 @@ export async function textInput(opts: {
1223
1240
  }
1224
1241
  prevDrawnLines = visibleLines;
1225
1242
 
1226
- if (ctrlCHint) {
1243
+ if (promptRowOwner) {
1244
+ // The frame renders the hint row from the published paint.
1245
+ } else if (ctrlCHint) {
1227
1246
  writeTerminal(ansi.moveTo(row + 2, col) + '\x1b[2K' + C.muted(truncate(ctrlCHint, getWidth())));
1228
1247
  ctrlCHintPainted = true;
1229
1248
  } else if (ctrlCHintPainted) {
@@ -1244,6 +1263,12 @@ export async function textInput(opts: {
1244
1263
  const pfxW = lineIdx === 0 ? visibleWidth(prompt) : contPfxW;
1245
1264
  const { cursorCol } = inputLineWindow(lines[lineIdx]!, colIdx, textWFor(lineIdx));
1246
1265
  const curX = col + pfxW + cursorCol;
1266
+ promptRowOwner?.publish({
1267
+ rows: ownedRows,
1268
+ hint: ctrlCHint ? C.muted(truncate(ctrlCHint, getWidth())) : null,
1269
+ caret: curR >= 1 ? { row: curR, col: curX, visible: true } : null,
1270
+ source: 'text-input',
1271
+ });
1247
1272
  // P2.2.c — coordinator owns the cursor emit when wired; falls
1248
1273
  // back to direct stdout for non-coordinator callers (tests, non-dashboard
1249
1274
  // entry points) so the change is non-breaking.
@@ -1342,19 +1367,28 @@ export async function textInput(opts: {
1342
1367
  const display = prefix + result;
1343
1368
  const padded = display + ' '.repeat(Math.max(0, textW - visibleWidth(display)));
1344
1369
 
1345
- for (let i = 0; i < rowsToTouch; i++) {
1346
- const r = row - i;
1347
- if (r < 1) continue;
1348
- if (i === 0) {
1349
- writeTerminal(ansi.moveTo(searchRow, col) + '\x1b[2K' + promptStr + padded);
1350
- } else {
1351
- writeTerminal(ansi.moveTo(r, col) + '\x1b[2K');
1370
+ const curR = searchRow;
1371
+ const curX = col + promptW + visibleWidth(prefix);
1372
+ if (opts.promptRowOwner) {
1373
+ opts.promptRowOwner.publish({
1374
+ rows: [promptStr + padded],
1375
+ hint: null,
1376
+ caret: { row: curR, col: curX, visible: true },
1377
+ source: 'reverse-search',
1378
+ });
1379
+ } else {
1380
+ for (let i = 0; i < rowsToTouch; i++) {
1381
+ const r = row - i;
1382
+ if (r < 1) continue;
1383
+ if (i === 0) {
1384
+ writeTerminal(ansi.moveTo(searchRow, col) + '\x1b[2K' + promptStr + padded);
1385
+ } else {
1386
+ writeTerminal(ansi.moveTo(r, col) + '\x1b[2K');
1387
+ }
1352
1388
  }
1353
1389
  }
1354
1390
  prevDrawnLines = visibleLines;
1355
1391
 
1356
- const curR = searchRow;
1357
- const curX = col + promptW + visibleWidth(prefix);
1358
1392
  if (opts.cursorSink && (opts.canClaimCursor?.() ?? true)) {
1359
1393
  opts.cursorSink.setCursor({ row: curR, col: curX, visible: true });
1360
1394
  } else if (!opts.cursorSink) {
@@ -1389,11 +1423,16 @@ export async function textInput(opts: {
1389
1423
  syncActivePickerModal();
1390
1424
  drawInput();
1391
1425
  };
1426
+ // A frame-owned prompt band has no direct paint to hide the cursor
1427
+ // for, wrap in synchronized output, or re-assert divider chrome around:
1428
+ // the frame render does all three in its own single write.
1429
+ const frameOwnsPromptBand = opts.promptRowOwner !== undefined;
1392
1430
  const renderActions = createTextInputRenderActions({
1393
1431
  shouldPaint: opts.shouldPaint,
1394
- paintChrome: opts.onPaintChrome,
1432
+ paintChrome: frameOwnsPromptBand ? undefined : opts.onPaintChrome,
1395
1433
  paint: repaintPure,
1396
- beforePaint: () => {
1434
+ frameOwned: frameOwnsPromptBand,
1435
+ beforePaint: frameOwnsPromptBand ? () => {} : () => {
1397
1436
  const chunk = hideTextInputCursor(opts.cursorSink);
1398
1437
  if (chunk) writeTerminal(chunk);
1399
1438
  else if (opts.cursorSink) writeTerminal(paintCursorVisibility(false));
@@ -1407,6 +1446,7 @@ export async function textInput(opts: {
1407
1446
  const finalizeInput = (result: InputResult): InputResult => {
1408
1447
  // 외부 주입 라우터가 «composer 가 안 떠 있다»를 알 수 있게 내린다.
1409
1448
  if (hostControl) hostControl.getBufferText = undefined;
1449
+ opts.promptRowOwner?.clear();
1410
1450
  detachInternalTurnYield(result.yieldedToInternalTurn === true);
1411
1451
  clearPicker();
1412
1452
  writeTerminal(endTextInputCursor(opts.cursorSink));
@@ -1723,6 +1763,7 @@ export async function textInput(opts: {
1723
1763
  // input loop exits cleanly and the dashboard's pane dispatcher
1724
1764
  // picks up the keys.
1725
1765
  if (hostControl) hostControl.getBufferText = undefined;
1766
+ opts.promptRowOwner?.clear();
1726
1767
  detachInternalTurnYield();
1727
1768
  return { text: '', submitted: false, gotoPane: true };
1728
1769
  }
@@ -2066,7 +2107,12 @@ export function attachStreamingKeys(
2066
2107
  const listener = (data: string | Buffer) => {
2067
2108
  clearEscapeTimer();
2068
2109
  deliverInjected();
2110
+ // ⏹ TUI-STOP-RAW-PTY — 원시 pty 길로 한 청크에 온 `/stop⏎`·`/esc⏎` 는 typeahead 대기열 대신 지금 턴의 escGate 로.
2111
+ // 파서가 이스케이프·붙여넣기·UTF-8 조각을 쥐고 있으면 그 청크는 앞 입력의 이어짐이라 건드리지 않는다.
2112
+ if (!parser.hasPendingEscape() && !parser.hasPendingPaste() && !parser.hasPendingDecoderBytes()
2113
+ && routeRawPtyStop(typeof data === 'string' ? data : data.toString('utf8'))) return;
2069
2114
  const keys = parser.push(data);
2115
+ if (keys.length > 0) noteInputLagKey(keys.length);
2070
2116
  deliver(keys);
2071
2117
  // ⚠️ `unref()` — 이 타이머가 프로세스를 붙잡아 두면 안 된다(입력 대기는 stdin 의 몫).
2072
2118
  if (parser.hasPendingEscape()) {
@@ -146,6 +146,12 @@ export function createChatPickerModalRuntime(deps: ChatPickerModalRuntimeDeps):
146
146
  getInputZoneHeight: deps.getInputZoneHeight,
147
147
  width: deps.getBounds().width,
148
148
  getWidth: () => deps.getBounds().width,
149
+ // TUI-PICKER-RESIZE-SHRINK — follow the live prompt row, not the
150
+ // row captured when the family was created (stale after resize).
151
+ getAnchor: () => {
152
+ const b = deps.getBounds();
153
+ return { row: b.row, col: b.col };
154
+ },
149
155
  onKey: makePickerOnKey(kind),
150
156
  onRowClick: makePickerOnRowClick(kind),
151
157
  });
@@ -108,6 +108,10 @@ export interface ChatPickerModalBindings {
108
108
  getInputZoneHeight: () => number;
109
109
  width: number;
110
110
  getWidth?: () => number;
111
+ /** Live prompt anchor (input bottom row + col). When present it wins
112
+ * over the mount-time `bounds` snapshot, so a terminal resize moves
113
+ * an already-open picker with the prompt (TUI-PICKER-RESIZE-SHRINK). */
114
+ getAnchor?: () => { row: number; col: number };
111
115
  onKey?: PickerOnKey;
112
116
  onRowClick?: PickerOnRowClick;
113
117
  }
@@ -124,6 +128,7 @@ type FramedPickerSpec<T> = {
124
128
  getInputZoneHeight: () => number;
125
129
  width: number;
126
130
  getWidth?: () => number;
131
+ getAnchor?: () => { row: number; col: number };
127
132
  onKey?: PickerOnKey;
128
133
  onRowClick?: PickerOnRowClick;
129
134
  };
@@ -132,7 +137,8 @@ function createFramedPickerModal<T>(spec: FramedPickerSpec<T>): ModalSurface {
132
137
  const computeBounds = (): (ModalBounds & { startIdx: number; visibleCount: number }) | null => {
133
138
  const rows = spec.getRows();
134
139
  const inputZoneHeight = spec.getInputZoneHeight();
135
- const bottomRow = spec.bounds.row - inputZoneHeight;
140
+ const anchor = spec.getAnchor?.() ?? spec.bounds;
141
+ const bottomRow = anchor.row - inputZoneHeight;
136
142
  if (rows.length === 0 || bottomRow < 4) return null;
137
143
  const { visibleCount, startIdx } = pickerWindow(
138
144
  rows.length,
@@ -142,7 +148,7 @@ function createFramedPickerModal<T>(spec: FramedPickerSpec<T>): ModalSurface {
142
148
  if (visibleCount <= 0) return null;
143
149
  const height = visibleCount + 3;
144
150
  const row = bottomRow - height + 1;
145
- return { row, col: spec.bounds.col, width: spec.getWidth?.() ?? spec.width, height, startIdx, visibleCount };
151
+ return { row, col: anchor.col, width: spec.getWidth?.() ?? spec.width, height, startIdx, visibleCount };
146
152
  };
147
153
 
148
154
  /** Phase 4.5a (substrate Occam · §4-pre.7 · 2026-05-03) — update
@@ -18,7 +18,12 @@ import type {
18
18
  import { renderToolBlock } from './block.js';
19
19
  import { renderToolInline } from './inline.js';
20
20
 
21
- const SUPPORTED_TOOLS = new Set<ToolRenderName>([
21
+ /** 접힌 결과 요약 첫 조각은 `MsgPost` 하나뿐이라 이름 확장을 `dispatch.ts` 안에 둔다.
22
+ * `types.ts:ToolRenderName` 은 나머지 도구의 공용 계약 그대로 두고, 이 파일의 내부
23
+ * 시그니처만 넓힌다(블록·인라인 렌더는 `ToolRenderModel.kind` 문자열만 본다). */
24
+ type ToolRenderKind = ToolRenderName | 'MsgPost';
25
+
26
+ const SUPPORTED_TOOLS = new Set<ToolRenderKind>([
22
27
  'Bash',
23
28
  'Read',
24
29
  'Grep',
@@ -35,9 +40,10 @@ const SUPPORTED_TOOLS = new Set<ToolRenderName>([
35
40
  'WebSearch',
36
41
  'WebFetch',
37
42
  'GetDashboardState',
43
+ 'MsgPost',
38
44
  ]);
39
45
 
40
- export function isToolRenderSupported(name: string): name is ToolRenderName | 'update_plan' | 'update_goal' {
46
+ export function isToolRenderSupported(name: string): name is ToolRenderKind | 'update_plan' | 'update_goal' {
41
47
  return normalizeToolRenderName(name) !== null;
42
48
  }
43
49
 
@@ -48,6 +54,9 @@ export function renderToolCallEvent(
48
54
  if (config.displayMode !== 'inline-to-block') return null;
49
55
  const kind = normalizeToolRenderName(call.name);
50
56
  if (!kind) return null;
57
+ // Keep the generic running block: a MsgPost error must still fall back to
58
+ // the same generic result block that was used before this summary slice.
59
+ if (kind === 'MsgPost') return null;
51
60
  const model: ToolRenderModel = {
52
61
  kind,
53
62
  status: 'running',
@@ -75,9 +84,18 @@ export function renderToolResultVariants(
75
84
  if (config.displayMode !== 'inline-to-block') return null;
76
85
  const kind = normalizeToolRenderName(call.name);
77
86
  if (!kind) return null;
87
+ // Only successful MsgPost results enter the compact renderer. Returning
88
+ // null for errors lets the dashboard formatter use its existing generic
89
+ // result path, including its expanded argument/result view.
90
+ if (kind === 'MsgPost' && extractErrorText(call.result)) return null;
78
91
  const model = buildToolRenderModel(kind, call, config);
79
92
  const collapsed = renderToolBlock(model, config.blockMaxLines, config.foldMode, config.expandHint);
80
- const expanded = renderToolBlock(model, Number.POSITIVE_INFINITY);
93
+ // ⭐ MsgPost 는 접힌 행에서 본문을 빼고 펼친 행에서만 싣는다 ⇒ 같은 model 로는 두 변형을
94
+ // 만들 수 없어, 펼친 쪽만 본문 포함 model 을 따로 세운다(다른 도구는 종전과 동일 model).
95
+ const expandedModel = kind === 'MsgPost'
96
+ ? buildToolRenderModel(kind, call, config, { includeMsgPostBody: true })
97
+ : model;
98
+ const expanded = renderToolBlock(expandedModel, Number.POSITIVE_INFINITY);
81
99
  const variants: ToolRenderResultVariants = {
82
100
  collapsed,
83
101
  expanded: arraysEqual(collapsed, expanded) ? null : expanded,
@@ -88,22 +106,28 @@ export function renderToolResultVariants(
88
106
  return variants;
89
107
  }
90
108
 
91
- function normalizeToolRenderName(name: string): ToolRenderName | null {
109
+ interface ToolRenderModelOptions {
110
+ /** 펼친 변형만 `message.body` 를 싣는다 — 접힌 행에는 본문·전체 JSON 이 남지 않는다. */
111
+ includeMsgPostBody?: boolean;
112
+ }
113
+
114
+ function normalizeToolRenderName(name: string): ToolRenderKind | null {
92
115
  if (name === 'update_plan' || name === 'UpdatePlan') return 'UpdatePlan';
93
116
  if (name === 'update_goal' || name === 'UpdateGoal') return 'UpdateGoal';
94
- return SUPPORTED_TOOLS.has(name as ToolRenderName) ? (name as ToolRenderName) : null;
117
+ return SUPPORTED_TOOLS.has(name as ToolRenderKind) ? (name as ToolRenderKind) : null;
95
118
  }
96
119
 
97
120
  function buildToolRenderModel(
98
- kind: ToolRenderName,
121
+ kind: ToolRenderKind,
99
122
  call: ToolRenderResult,
100
123
  config?: ToolRenderConfig,
124
+ options?: ToolRenderModelOptions,
101
125
  ): ToolRenderModel {
102
126
  const resultRecord = asRecord(call.result);
103
127
  const errorText = extractErrorText(call.result);
104
128
  const bodyLines = errorText
105
129
  ? errorText.split('\n')
106
- : buildToolBodyLines(kind, call.args, call.result, resultRecord);
130
+ : buildToolBodyLines(kind, call.args, call.result, resultRecord, options);
107
131
  const status = errorText ? 'error' : 'success';
108
132
  const model: ToolRenderModel = {
109
133
  kind,
@@ -119,7 +143,7 @@ function buildToolRenderModel(
119
143
  }
120
144
 
121
145
  function summarizeCollapsedToolResult(
122
- kind: ToolRenderName,
146
+ kind: ToolRenderKind,
123
147
  status: 'success' | 'error',
124
148
  resultRecord: Record<string, unknown> | null,
125
149
  bodyLines: string[],
@@ -206,10 +230,12 @@ function summarizeCollapsedToolResult(
206
230
  }
207
231
 
208
232
  function summarizeToolCallForRender(
209
- kind: ToolRenderName,
233
+ kind: ToolRenderKind,
210
234
  args: Record<string, unknown>,
211
235
  result?: unknown,
212
236
  ): string {
237
+ // ⭐ MsgPost — 행위(`post`)·수신자·(결과가 있으면) id 셋만. 본문은 부르지도 읽지도 않는다.
238
+ if (kind === 'MsgPost') return summarizeMsgPostCall(args, result);
213
239
  if (kind === 'UpdatePlan') {
214
240
  const plan = Array.isArray(args.plan) ? args.plan : [];
215
241
  const current = plan.find((step) => asRecord(step)?.status === 'in_progress');
@@ -230,6 +256,29 @@ function summarizeToolCallForRender(
230
256
  return summarizeToolCall(kind, args);
231
257
  }
232
258
 
259
+ /** MsgPost 머리글 — 행위(`post`)·수신자·id. 펼치기 전에도 세 가지가 한 줄에 다 있다. */
260
+ function summarizeMsgPostCall(args: Record<string, unknown>, result?: unknown): string {
261
+ const to = typeof args.to === 'string' ? args.to.trim() : '';
262
+ const id = msgPostMessage(asRecord(result))?.id;
263
+ const route = to ? `post → ${to}` : 'post';
264
+ return typeof id === 'string' || typeof id === 'number' ? `${route} #${id}` : route;
265
+ }
266
+
267
+ /** 결과 페이로드의 `message` 레코드. 모양을 못 읽으면 `null` — 없는 필드를 지어내지 않는다. */
268
+ function msgPostMessage(resultRecord: Record<string, unknown> | null): Record<string, unknown> | null {
269
+ return asRecord(resultRecord?.message);
270
+ }
271
+
272
+ /** MsgPost 결과 본문. 접힌 행은 비우고 펼친 변형에는 원래 결과 전체를 한 번만 싣는다. */
273
+ function buildMsgPostBodyLines(
274
+ resultRecord: Record<string, unknown> | null,
275
+ includeMsgPostBody: boolean,
276
+ ): string[] {
277
+ if (!includeMsgPostBody) return [];
278
+ if (!resultRecord) return [];
279
+ return JSON.stringify(resultRecord, null, 2).split('\n');
280
+ }
281
+
233
282
  function summarizeSpecialToolCall(kind: ToolRenderName, args: Record<string, unknown>): string | null {
234
283
  if (kind === 'AstGrep') {
235
284
  const pattern = typeof args.pattern === 'string' ? args.pattern : '';
@@ -292,14 +341,17 @@ function summarizeStructuralSearchRender(kind: ToolRenderName, bodyText: string
292
341
  }
293
342
 
294
343
  function buildToolBodyLines(
295
- kind: ToolRenderName,
344
+ kind: ToolRenderKind,
296
345
  args: Record<string, unknown>,
297
346
  result: unknown,
298
347
  resultRecord: Record<string, unknown> | null,
348
+ options?: ToolRenderModelOptions,
299
349
  ): string[] {
300
350
  const syntheticGuard = extractSyntheticGuardSummary(result);
301
351
  if (syntheticGuard) return [syntheticGuard];
302
352
 
353
+ if (kind === 'MsgPost') return buildMsgPostBodyLines(resultRecord, options?.includeMsgPostBody === true);
354
+
303
355
  if (kind === 'Edit' || kind === 'Write') {
304
356
  const edit = resultRecord?.edit && isEditResult(resultRecord.edit) ? resultRecord.edit : null;
305
357
  const output = typeof resultRecord?.output === 'string' ? resultRecord.output : null;
@@ -37,6 +37,7 @@ export async function askBare({ text, provider, model, deps }: {
37
37
  ...(provider === undefined ? { initialProvider: chosenProvider } : { provider: chosenProvider }),
38
38
  ...(selected.model === '(none)' ? {} : { model: selected.model }),
39
39
  onResolvedProvider: (name, activeModel) => { resolvedProvider = name; resolvedModel = activeModel; },
40
+ usageSite: 'cli.ask-bare',
40
41
  });
41
42
  return { provider: resolvedProvider, model: resolvedModel, reply };
42
43
  }
@@ -13,7 +13,8 @@ import { RESOURCE_KINDS, type ResourceKind } from '../control-plane/ledger.js';
13
13
  import { runControlJoin, type ControlJoinOptions } from './control-join-cli.js';
14
14
  import type { ResourceView } from '../control-plane/ledger.js';
15
15
  import { issueMemberToken, revokeMemberToken, listMemberTokens } from '../control-plane/member-tokens.js';
16
- import { collectControlStatus } from '../control/control-status.js';
16
+ import { collectControlStatus, readControlHqLease } from '../control/control-status.js';
17
+ import { getUserConfig } from '../user-config.js';
17
18
 
18
19
  function controlPort(flag?: string): number {
19
20
  const raw = flag ?? (process.env.ELANOUS_CONTROL_PORT?.trim() || undefined);
@@ -97,8 +98,9 @@ export async function runResourcesQuery(options: { where?: string; kind?: string
97
98
  }
98
99
  }
99
100
 
100
- export async function runControlServe(options: { port?: string; host?: string; followLease?: boolean; bucket?: string;
101
+ export async function runControlServe(options: { port?: string; host?: string; followLease?: boolean; followHqLease?: boolean; bucket?: string;
101
102
  read?: (bucket: string) => RoleLeaseRead | Promise<RoleLeaseRead>; machine?: string;
103
+ readHq?: typeof readControlHqLease; hqHostName?: string;
102
104
  /** 시험 seam — 이 신호로 멈춘다. ⛔ 시험이 `process.emit('SIGTERM')` 로 멈추면 같은 프로세스의 다른 SIGTERM 처리기
103
105
  * (로그 저장소가 «남은 처리기가 없으면 자기에게 진짜 SIGTERM 을 다시 보낸다»)가 깨어 **시험 러너가 죽었다**
104
106
  * (📏 09-27 0.2.3 게이트: 전체 한 프로세스면 이 시험 자리에서 rc 143 · 조각으로 나누면 완주). */
@@ -108,12 +110,26 @@ export async function runControlServe(options: { port?: string; host?: string; f
108
110
  let bucket: string | undefined;
109
111
  try {
110
112
  port = controlPort(options.port);
113
+ if (options.followLease && options.followHqLease) throw new Error('GCS 임대와 HQ 임대는 동시에 따를 수 없음');
111
114
  if (options.followLease) bucket = resolveRoleBucket(options.bucket);
112
115
  } catch (error) { console.error(reasonFor(error)); process.exitCode = 2; return; }
113
- const machine = resolveMachineName({ option: options.machine }).machine;
114
- const leaseView = bucket === undefined ? undefined : createLeaseHolderView({
116
+ const machine = options.followHqLease ? '' : resolveMachineName({ option: options.machine }).machine;
117
+ // HQ's holder identity is hq.hostName. A caller-controlled role machine alias cannot grant primary writes.
118
+ let hqHostName: string | undefined;
119
+ if (options.followHqLease) {
120
+ try { hqHostName = options.hqHostName ?? getUserConfig().hq?.hostName; }
121
+ catch { /* Unknown local identity must remain fail closed at the write boundary. */ }
122
+ }
123
+ const leaseView = bucket !== undefined ? createLeaseHolderView({
115
124
  machine, read: () => (options.read ?? readRoleLeaseAsync)(bucket),
116
- });
125
+ }) : options.followHqLease ? createLeaseHolderView({
126
+ machine: hqHostName ?? '', read: () => {
127
+ const { record, expired } = (options.readHq ?? readControlHqLease)();
128
+ return hqHostName && record && expired === false
129
+ ? { kind: 'present' as const, doc: { holder: record.holder, generation: record.generation, state: 'held' as const, renewedAt: record.renewedAt } }
130
+ : { kind: 'unmeasured' as const, why: 'HQ lease missing or expired' };
131
+ },
132
+ }) : undefined;
117
133
  let server: ReturnType<typeof startControlServer>;
118
134
  try { server = startControlServer({ port, hostname: options.host, ...(leaseView ? { leaseView, requireKnownLeaseForWrites: true } : {}) }); }
119
135
  catch (error) { console.error(`관제부 시작 실패: ${reasonFor(error)}`); process.exitCode = 2; return; }
@@ -130,7 +146,7 @@ export async function runControlServe(options: { port?: string; host?: string; f
130
146
  if (options.signal.aborted) { stop(); return; }
131
147
  options.signal.addEventListener('abort', stop, { once: true });
132
148
  }
133
- console.log(`관제부 ${new URL(server.url).host} · 토큰 ${join(effectiveInstanceRoot(), 'control', 'tokens.json')}${bucket === undefined ? '' : ` · 임대 따름 · ${bucket} · 나=${machine}`}`);
149
+ console.log(`관제부 ${new URL(server.url).host} · 토큰 ${join(effectiveInstanceRoot(), 'control', 'tokens.json')}${bucket !== undefined ? ` · 임대 따름 · ${bucket} · 나=${machine}` : options.followHqLease ? ` · HQ 임대 따름 · 나=${hqHostName ?? '미확인'}` : ''}`);
134
150
  });
135
151
  }
136
152
 
@@ -199,8 +215,9 @@ export function registerControlCommands(program: Command): void {
199
215
  .option('--port <n>', '리스닝 포트(0=임시 포트)')
200
216
  .option('--host <addr>', '루프백 또는 tailnet 바인드 주소')
201
217
  .option('--follow-lease', '임대 보유자일 때만 쓰기')
218
+ .option('--follow-hq-lease', 'HQ 임대 보유자일 때만 쓰기')
202
219
  .option('--bucket <bucket>', 'GCS 임대 버킷')
203
- .action((options: { port?: string; host?: string; followLease?: boolean; bucket?: string }) => runControlServe(options));
220
+ .action((options: { port?: string; host?: string; followLease?: boolean; followHqLease?: boolean; bucket?: string }) => runControlServe(options));
204
221
  control.command('member').description('합류 기계의 자원을 포그라운드에서 등록·심박')
205
222
  .option('--resource <kind:name=url>', '등록할 자원', (value: string, previous: string[]) => [...previous, value], [] as string[])
206
223
  .option('--interval <seconds>', '심박 간격(초)')
@@ -19,6 +19,16 @@ async function guardianPlan(): Promise<{ db: Database; plan: GuardianPlan }> {
19
19
 
20
20
  export function registerGuardianCommands(program: Command): void {
21
21
  const guardian = program.command('guardian').description('크론 수호자 그림자 관측(기존 크론·알림 무변경)');
22
+ guardian.command('grok-expiry').description('현재 호스트 Grok 구독 만료 시각과 4시간 경보 상태 출력')
23
+ .action(async () => {
24
+ const { readGrokSubscriptionExpiry } = await import('../grok/credential.js');
25
+ const { grokExpiryAlertLine, grokExpiryStatusLine } = await import('../domains/guardian-tick.js');
26
+ const now = new Date();
27
+ const expiresAt = readGrokSubscriptionExpiry();
28
+ console.log(grokExpiryStatusLine({ now, expiresAt }));
29
+ const alert = grokExpiryAlertLine({ now, expiresAt });
30
+ if (alert) console.log(alert);
31
+ });
22
32
  guardian.command('tick').description('현재 시각에 발화했을 잡을 관측(잡은 실행하지 않음)')
23
33
  .action(async () => {
24
34
  const { guardianTick } = await import('../domains/guardian-tick.js');
@@ -21,8 +21,20 @@ export async function buildImportPlan(home = homedir()): Promise<ImportPlan> {
21
21
  }
22
22
 
23
23
  export function registerImportCommand(program: Command): void {
24
+ const publicContributionHelp = `
25
+ Public contribution (EC1 · 10-28 update; moved from 0.2.8 in the 10-01 release split):
26
+ Show HN / community: share a working import example and feedback; posting and replies remain with the human author.
27
+ CB1 contribution entry: open an issue or pull request at https://github.com/ElanvitalAI/elanous
28
+ Marketplace plugins: propose a plugin in plugins/ via pull request; inclusion in the signed marketplace is reviewed, not automatic.
29
+ Remaining drafts (not published): Show HN · 긱뉴스 · 3-minute install-to-first-result video
30
+ docs/marketing/DRAFT-ec1-show-hn-geeknews-and-3min-video-2026-10-01.md
31
+ Measure adoption separately: GitHub stars · installs · npm downloads (downloads are not unique users).
32
+ Historical positioning (§4, 2026-10-01; not current counts): elanous ★0 · OpenClaw ~390k · Hermes ~250k · Codex ~127k.
33
+ 10-03 baseline (not current results): stars 0 · npm 7-day downloads 790 (includes our own installs).
34
+ `;
24
35
  program.command('import')
25
36
  .description('Show what elanous can bring over from Claude Code, Codex, ~/.agents, OpenClaw and Hermes — a plan first; `--apply` registers skills in place and adds MCP switched off, `--undo` puts everything back')
37
+ .addHelpText('after', publicContributionHelp)
26
38
  .option('--json', 'Print the plan (or the apply result) as JSON')
27
39
  .option('--apply', 'Apply the plan: skills in place (ref) or as link/copy · MCP switched off · secrets and hooks only listed')
28
40
  .option('--mode <mode>', `How skills come over: ${IMPORT_MODES.join('|')} (default ref — nothing copied)`)
@@ -0,0 +1,35 @@
1
+ export type LightCliRoute = 'msg' | 'release' | 'tasks' | 'pty' | 'logs' | 'config';
2
+
3
+ const VALUE_FLAGS = new Set(['--config-dir', '--test-state-dir']);
4
+
5
+ /** Select only read-heavy command paths whose CLI module can stand alone. */
6
+ export function selectLightCliRoute(args: readonly string[]): LightCliRoute | undefined {
7
+ const command: string[] = [];
8
+ let index = 0;
9
+ while (index < args.length && args[index]!.startsWith('-')) {
10
+ const flag = args[index]!;
11
+ index += 1;
12
+ if ([...VALUE_FLAGS].some(value => flag.startsWith(`${value}=`))) continue;
13
+ if (VALUE_FLAGS.has(flag)) {
14
+ if (index >= args.length || args[index]!.startsWith('-')) return undefined;
15
+ index += 1;
16
+ continue;
17
+ }
18
+ // Only flags removed by the pre-import isolation helpers can safely
19
+ // precede a light route. Other root flags keep their original parser.
20
+ if (flag !== '--test' && !flag.startsWith('--test=')) return undefined;
21
+ }
22
+ for (const token of args.slice(index)) {
23
+ if (token.startsWith('-')) break;
24
+ command.push(token);
25
+ }
26
+
27
+ if (command[0] === 'msg' && (command[1] === 'list' || command[1] === 'ack' || command[1] === 'watch')) return 'msg';
28
+ // --reveal has an audit-log contract owned by the full CLI.
29
+ if (command[0] === 'config' && command[1] === 'get' && !args.some(arg => arg === '--reveal' || arg.startsWith('--reveal='))) return 'config';
30
+ if (command[0] === 'release' && command[1] === 'checklist' && command[2] === 'status') return 'release';
31
+ if (command[0] === 'tasks' && command[1] === 'show') return 'tasks';
32
+ if (command[0] === 'pty' && (command[1] === 'list' || command[1] === 'state')) return 'pty';
33
+ if (command[0] === 'logs') return 'logs';
34
+ return undefined;
35
+ }
@@ -2,6 +2,7 @@ import type { Command } from 'commander';
2
2
  import type { LLMProvider } from '../llm.js';
3
3
  import { detectProviders, type DetectedProvider } from '../llm/provider-detect.js';
4
4
  import { probeProvider, type ProviderProbeResult } from '../llm/provider-probe.js';
5
+ import { openrouterSource } from '../registry/discovery/sources/openrouter.js';
5
6
  import {
6
7
  getUserConfig, reloadUserConfig, saveUserConfig, userConfigPath,
7
8
  type UserConfig,
@@ -20,6 +21,7 @@ export interface LlmDetectDeps {
20
21
  config?: () => UserConfig;
21
22
  save?: (config: UserConfig) => void;
22
23
  output?: (line: string) => void;
24
+ discoverUpstageModels?: () => Promise<string[] | null>;
23
25
  }
24
26
 
25
27
  export interface LlmDetectResult {
@@ -29,6 +31,15 @@ export interface LlmDetectResult {
29
31
  /** Why a selected provider was not written (an explicit llm.provider is never overwritten). */
30
32
  notApplied?: string;
31
33
  error?: string;
34
+ /** OpenRouter /models candidates; null means discovery was unavailable, not an empty catalogue. */
35
+ upstageCandidates?: string[] | null;
36
+ }
37
+
38
+ async function discoverUpstageModels(): Promise<string[] | null> {
39
+ const result = await openrouterSource.run({ timeoutMs: 3_000 });
40
+ if (!result.ok) return null;
41
+ return result.models.map(({ id }) => id).filter((id) => /^upstage\/[^/]+$/.test(id))
42
+ .map((id) => `openrouter/${id}`).sort();
32
43
  }
33
44
 
34
45
  /** Discovery alone cannot validate credentials. Only a successful probe can select a provider. */
@@ -76,6 +87,13 @@ export async function runLlmDetect(
76
87
  }
77
88
  }
78
89
 
90
+ let upstageCandidates: string[] | null | undefined;
91
+ if (!options.apply && (!options.probe || selected === 'openrouter')
92
+ && rows.some((row) => row.provider === 'openrouter' && row.available && row.auth === 'apikey')) {
93
+ try { upstageCandidates = await (deps.discoverUpstageModels ?? discoverUpstageModels)(); }
94
+ catch { upstageCandidates = null; }
95
+ }
96
+
79
97
  let applied = false;
80
98
  let notApplied: string | undefined;
81
99
  const previous = config.llm?.provider ?? 'auto';
@@ -91,7 +109,8 @@ export async function runLlmDetect(
91
109
  }
92
110
  applied = true;
93
111
  }
94
- const result: LlmDetectResult = { candidates: rows, selected, applied, ...(notApplied ? { notApplied } : {}) };
112
+ const result: LlmDetectResult = { candidates: rows, selected, applied,
113
+ ...(upstageCandidates !== undefined ? { upstageCandidates } : {}), ...(notApplied ? { notApplied } : {}) };
95
114
  if (options.json) output(JSON.stringify(result));
96
115
  else {
97
116
  if (rows.length === 0) output('No LLM providers detected.');
@@ -111,6 +130,9 @@ export async function runLlmDetect(
111
130
  }
112
131
  }
113
132
  if (options.probe && !selected) output('No provider passed the probe; configuration unchanged.');
133
+ if (upstageCandidates !== undefined) output(upstageCandidates === null
134
+ ? 'Upstage candidates: catalogue unavailable'
135
+ : `Upstage candidates: ${upstageCandidates.join(', ') || '(none in OpenRouter /models)'}`);
114
136
  if (applied) output(`Applied llm.provider=${selected} — revert: elanous config set llm.provider auto`);
115
137
  if (notApplied) output(notApplied);
116
138
  }