elanous 0.2.34 → 0.2.35

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 (611) 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/{L04y73dlwKeTW-GetaTF3 → T1mBQqmkwKDLGtyisDCOd}/_buildManifest.js +1 -1
  4. package/apps/pwa/out/_next/static/chunks/{5014f970-22bef0b5210f7d60.js → 0368f25d-ad84af92fefee68f.js} +1 -1
  5. package/apps/pwa/out/_next/static/chunks/1165.bad13fc9151a7288.js +1 -0
  6. package/apps/pwa/out/_next/static/chunks/13.02a07436dec15f89.js +32 -0
  7. package/apps/pwa/out/_next/static/chunks/{2124.ed5bf480cea7f85b.js → 1530.0e612369b6fd7ea0.js} +1 -1
  8. package/apps/pwa/out/_next/static/chunks/1540.af38731fa7c4a3e0.js +41 -0
  9. package/apps/pwa/out/_next/static/chunks/1674.2a65fd5668e1cc5f.js +1 -0
  10. package/apps/pwa/out/_next/static/chunks/1850.f2b470ba5a471da0.js +24 -0
  11. package/apps/pwa/out/_next/static/chunks/193.62da94cd0b88323b.js +74 -0
  12. package/apps/pwa/out/_next/static/chunks/1975.260f6d249fac5f7c.js +1 -0
  13. package/apps/pwa/out/_next/static/chunks/1982-67cd8dfe8682325f.js +1 -0
  14. package/apps/pwa/out/_next/static/chunks/1993-c0007b7ad0c0ef41.js +1 -0
  15. package/apps/pwa/out/_next/static/chunks/1999-bb415351c8a2846c.js +1 -0
  16. package/apps/pwa/out/_next/static/chunks/1c735de4.f993a30bbd3c57c4.js +1 -0
  17. package/apps/pwa/out/_next/static/chunks/1dc5a567.9b092bfae3d7099b.js +1 -0
  18. package/apps/pwa/out/_next/static/chunks/{8368.014caa8de2f5af34.js → 2018.a741297bce759490.js} +1 -1
  19. package/apps/pwa/out/_next/static/chunks/2085.8f950b4bda1cbbc7.js +1 -0
  20. package/apps/pwa/out/_next/static/chunks/2159-6179a961376956b9.js +1 -0
  21. package/apps/pwa/out/_next/static/chunks/216.b5c2a421aa1d28a5.js +1 -0
  22. package/apps/pwa/out/_next/static/chunks/2251.49fbe369f74c372c.js +148 -0
  23. package/apps/pwa/out/_next/static/chunks/2286-2939577360d3dcc0.js +1 -0
  24. package/apps/pwa/out/_next/static/chunks/2625.5d870aa999f33db1.js +34 -0
  25. package/apps/pwa/out/_next/static/chunks/2668.34d21539e62bf111.js +77 -0
  26. package/apps/pwa/out/_next/static/chunks/2833-0fe47af99ed13c29.js +1 -0
  27. package/apps/pwa/out/_next/static/chunks/2930.d0edb4f108787ef7.js +1 -0
  28. package/apps/pwa/out/_next/static/chunks/2973.77318e7d85f59477.js +62 -0
  29. package/apps/pwa/out/_next/static/chunks/3103.0df8da390948bb84.js +1 -0
  30. package/apps/pwa/out/_next/static/chunks/3123.2bee9ba15d320bd2.js +90 -0
  31. package/apps/pwa/out/_next/static/chunks/3162-6cf652bf7124d8cf.js +1 -0
  32. package/apps/pwa/out/_next/static/chunks/{1644.35dd25240ae24e4b.js → 3408.21d1570602f4b6c0.js} +2 -2
  33. package/apps/pwa/out/_next/static/chunks/3577-7340009f7007a795.js +1 -0
  34. package/apps/pwa/out/_next/static/chunks/{3121.779fafe3e44612c5.js → 3589.5444a06bcf6e775c.js} +1 -1
  35. package/apps/pwa/out/_next/static/chunks/359-2250789a2d3499e7.js +1 -0
  36. package/apps/pwa/out/_next/static/chunks/3618.f514792d6c59d7fd.js +36 -0
  37. package/apps/pwa/out/_next/static/chunks/3669.343f9119aa276001.js +1 -0
  38. package/apps/pwa/out/_next/static/chunks/{9131-fce7256c4180c4a5.js → 3677-4215f826f6aa68e5.js} +1 -1
  39. package/apps/pwa/out/_next/static/chunks/3736.c2efad489604cc3b.js +79 -0
  40. package/apps/pwa/out/_next/static/chunks/3817.f9aeab2bb6675d73.js +1 -0
  41. package/apps/pwa/out/_next/static/chunks/3f7c4ee5.3dde54f01a816613.js +122 -0
  42. package/apps/pwa/out/_next/static/chunks/4182-0b9b1251c29cc0cf.js +1 -0
  43. package/apps/pwa/out/_next/static/chunks/4346.8601952e73bf5803.js +1 -0
  44. package/apps/pwa/out/_next/static/chunks/{6053-d893974de92e6198.js → 4441-875b97f5821ed58a.js} +1 -1
  45. package/apps/pwa/out/_next/static/chunks/4582.bd68683c076649e3.js +286 -0
  46. package/apps/pwa/out/_next/static/chunks/4605-6e623f55aec77422.js +1 -0
  47. package/apps/pwa/out/_next/static/chunks/4607.5cc27468628eb4bf.js +1 -0
  48. package/apps/pwa/out/_next/static/chunks/4627.f07508b3936fd6c0.js +24 -0
  49. package/apps/pwa/out/_next/static/chunks/{1895-60ed0e341c658bd4.js → 4705-194e64e47ca0fbdb.js} +1 -1
  50. package/apps/pwa/out/_next/static/chunks/{5576-82d3703636d5c4b9.js → 4718-17d2af636796a330.js} +3 -3
  51. package/apps/pwa/out/_next/static/chunks/4747-c22262c093e46807.js +1 -0
  52. package/apps/pwa/out/_next/static/chunks/4775-178215aed0daba61.js +1 -0
  53. package/apps/pwa/out/_next/static/chunks/4815-6ffb8c3c991cc45d.js +1 -0
  54. package/apps/pwa/out/_next/static/chunks/4834-beca8b47ad29a898.js +1 -0
  55. package/apps/pwa/out/_next/static/chunks/5023-fb4802b6d2492b02.js +1 -0
  56. package/apps/pwa/out/_next/static/chunks/{7431.3051e9b8a4372d2d.js → 5101.e32282718f99ed6f.js} +2 -2
  57. package/apps/pwa/out/_next/static/chunks/5154.a118f3957ed14e36.js +1 -0
  58. package/apps/pwa/out/_next/static/chunks/5210-a2e0015e3d4d5d9c.js +1 -0
  59. package/apps/pwa/out/_next/static/chunks/5356.84ac712cc15928bf.js +1 -0
  60. package/apps/pwa/out/_next/static/chunks/5401.22352141b6fd336e.js +23 -0
  61. package/apps/pwa/out/_next/static/chunks/{2987-30cf9c2eb7b8bdd5.js → 5483-dd5d7697f6bdb106.js} +1 -1
  62. package/apps/pwa/out/_next/static/chunks/5637.281e5dec4ea6ecf1.js +94 -0
  63. package/apps/pwa/out/_next/static/chunks/5662.02eaa029af05ad46.js +1 -0
  64. package/apps/pwa/out/_next/static/chunks/56d372f2.681ab4ec4c998fae.js +1 -0
  65. package/apps/pwa/out/_next/static/chunks/5760.22456f433c6f42c0.js +1 -0
  66. package/apps/pwa/out/_next/static/chunks/{7386.5d8e7e42e818dfb6.js → 5852.db1f7449f4f74612.js} +2 -2
  67. package/apps/pwa/out/_next/static/chunks/5891-0f11a7d7362a9072.js +1 -0
  68. package/apps/pwa/out/_next/static/chunks/5943.264d14a44ca32513.js +1 -0
  69. package/apps/pwa/out/_next/static/chunks/604-1b3c39df083c02aa.js +1 -0
  70. package/apps/pwa/out/_next/static/chunks/6121-5f97072330738caf.js +1 -0
  71. package/apps/pwa/out/_next/static/chunks/6193.07d8ca5af4b09086.js +1 -0
  72. package/apps/pwa/out/_next/static/chunks/6203-b3fea3a60d69ff14.js +1 -0
  73. package/apps/pwa/out/_next/static/chunks/{3110.0a7065f25c841818.js → 6236.e18cced2d5ba6afb.js} +3 -3
  74. package/apps/pwa/out/_next/static/chunks/6286.d638fb5953e2e757.js +8 -0
  75. package/apps/pwa/out/_next/static/chunks/630.fe5a46428d63b013.js +1 -0
  76. package/apps/pwa/out/_next/static/chunks/6301.ae0245f507e4395e.js +1 -0
  77. package/apps/pwa/out/_next/static/chunks/6673.fbbe5699f6ea5991.js +27 -0
  78. package/apps/pwa/out/_next/static/chunks/6777-f6d301efb5de828d.js +1 -0
  79. package/apps/pwa/out/_next/static/chunks/6786.423f24c88de034c7.js +93 -0
  80. package/apps/pwa/out/_next/static/chunks/6854-cef64a948c5e122d.js +1 -0
  81. package/apps/pwa/out/_next/static/chunks/6866-79aa5b4e47cac6aa.js +1 -0
  82. package/apps/pwa/out/_next/static/chunks/6b89c8bd.24df687a820500b3.js +1 -0
  83. package/apps/pwa/out/_next/static/chunks/7037-fe27f001db30d323.js +1 -0
  84. package/apps/pwa/out/_next/static/chunks/7080.2d826860534fd88e.js +1 -0
  85. package/apps/pwa/out/_next/static/chunks/7118.8731be28c3ebb14b.js +1 -0
  86. package/apps/pwa/out/_next/static/chunks/7196.44241bc1df3e26fe.js +149 -0
  87. package/apps/pwa/out/_next/static/chunks/7235.c7c4e6cb5c693c2d.js +104 -0
  88. package/apps/pwa/out/_next/static/chunks/{7005.1623d2aea78eb85f.js → 7385.50a308a477bdfc21.js} +1 -1
  89. package/apps/pwa/out/_next/static/chunks/{6086.913a69e6fa3e4a8b.js → 7644.17e37ba6f1d4226e.js} +4 -4
  90. package/apps/pwa/out/_next/static/chunks/7706-58bfb1546637f217.js +1 -0
  91. package/apps/pwa/out/_next/static/chunks/7839.5b91455338c9fd3f.js +1 -0
  92. package/apps/pwa/out/_next/static/chunks/7857-31f13ee96f4011aa.js +1 -0
  93. package/apps/pwa/out/_next/static/chunks/81.f74cb60312fe4001.js +1 -0
  94. package/apps/pwa/out/_next/static/chunks/8219.baa715d1deee80e2.js +1 -0
  95. package/apps/pwa/out/_next/static/chunks/8256.e3ac8421a71f82f4.js +1 -0
  96. package/apps/pwa/out/_next/static/chunks/8310-444a6a895c402f12.js +1 -0
  97. package/apps/pwa/out/_next/static/chunks/8423.f7dda8aca4fcaae5.js +1 -0
  98. package/apps/pwa/out/_next/static/chunks/{7193-cf355cca5ba6c5d5.js → 8437-8d5492094b166cfa.js} +1 -1
  99. package/apps/pwa/out/_next/static/chunks/{2554.3b5e200f5f5cfcd6.js → 8444.4c26b379ca2b9596.js} +4 -4
  100. package/apps/pwa/out/_next/static/chunks/8496.75649af8652c74f4.js +226 -0
  101. package/apps/pwa/out/_next/static/chunks/8557-e7898769499cd56f.js +1 -0
  102. package/apps/pwa/out/_next/static/chunks/8576.65bb654b524f3614.js +1 -0
  103. package/apps/pwa/out/_next/static/chunks/8609.558ce2f8f9aea2be.js +64 -0
  104. package/apps/pwa/out/_next/static/chunks/8614.caec96cfb91f4ae7.js +1 -0
  105. package/apps/pwa/out/_next/static/chunks/{2547.dd27303624cb4da8.js → 8637.47f5b35afcae5e6b.js} +1 -1
  106. package/apps/pwa/out/_next/static/chunks/8714.ff0b7ce3ec3e3ae2.js +1 -0
  107. package/apps/pwa/out/_next/static/chunks/8732.367f44a916202353.js +1 -0
  108. package/apps/pwa/out/_next/static/chunks/9141-7fd1f73a5400bdc2.js +1 -0
  109. package/apps/pwa/out/_next/static/chunks/921.c4267d0d69a65404.js +1 -0
  110. package/apps/pwa/out/_next/static/chunks/{9550.d5f76828f972058c.js → 9214.63a510d39178e997.js} +2 -2
  111. package/apps/pwa/out/_next/static/chunks/9261.3962c3321b047691.js +115 -0
  112. package/apps/pwa/out/_next/static/chunks/936-26efd1a0efdd44d3.js +1 -0
  113. package/apps/pwa/out/_next/static/chunks/{8548.036c344973968847.js → 938.66ad1ef0e5abae1c.js} +1 -1
  114. package/apps/pwa/out/_next/static/chunks/{3414.172ad4ca2d9b08e8.js → 9512.5a76207a730e0491.js} +2 -2
  115. package/apps/pwa/out/_next/static/chunks/9627-4b9efe616b27e2e2.js +1 -0
  116. package/apps/pwa/out/_next/static/chunks/967-2aa39b2d04b4c690.js +1 -0
  117. package/apps/pwa/out/_next/static/chunks/9734.40eb1e558c29ccea.js +1 -0
  118. package/apps/pwa/out/_next/static/chunks/9908.3aa54f7a586a73dc.js +1 -0
  119. package/apps/pwa/out/_next/static/chunks/{6740.43de73fc427c9fe2.js → 9952.5daf5f94063a2b3e.js} +1 -1
  120. package/apps/pwa/out/_next/static/chunks/9954-ca8d29752bdbb45a.js +1 -0
  121. package/apps/pwa/out/_next/static/chunks/9974-507fa67cb94066dd.js +1 -0
  122. package/apps/pwa/out/_next/static/chunks/app/_not-found/page-ce9e00f7fb45506a.js +1 -0
  123. package/apps/pwa/out/_next/static/chunks/app/approvals/page-fa59d6d17daa3389.js +1 -0
  124. package/apps/pwa/out/_next/static/chunks/app/autopilot/page-53f68bbe7bd4b774.js +1 -0
  125. package/apps/pwa/out/_next/static/chunks/app/board/page-1c500fbb9f4a7a04.js +1 -0
  126. package/apps/pwa/out/_next/static/chunks/app/botlab/page-99d72673aa5c307c.js +1 -0
  127. package/apps/pwa/out/_next/static/chunks/app/bots/page-d2d5adc1e9484c88.js +1 -0
  128. package/apps/pwa/out/_next/static/chunks/app/ceo/page-c607c5aae637f1cc.js +1 -0
  129. package/apps/pwa/out/_next/static/chunks/app/chat/page-fa8c23596d555c0f.js +1 -0
  130. package/apps/pwa/out/_next/static/chunks/app/consult/page-bdab8c5e855c8416.js +1 -0
  131. package/apps/pwa/out/_next/static/chunks/app/control/page-406b47745b53f269.js +1 -0
  132. package/apps/pwa/out/_next/static/chunks/app/decisions/page-a4276386b7051f50.js +1 -0
  133. package/apps/pwa/out/_next/static/chunks/app/design-check/page-8a26bab9ad375f25.js +1 -0
  134. package/apps/pwa/out/_next/static/chunks/app/editor/page-775f48aa1dc7a2d5.js +1 -0
  135. package/apps/pwa/out/_next/static/chunks/app/exec/page-1c4dd5f959d0c558.js +1 -0
  136. package/apps/pwa/out/_next/static/chunks/app/field/page-c48938a8377c9f70.js +1 -0
  137. package/apps/pwa/out/_next/static/chunks/app/healthz/route-ce9e00f7fb45506a.js +1 -0
  138. package/apps/pwa/out/_next/static/chunks/app/inside/page-c6e7905859425aa9.js +1 -0
  139. package/apps/pwa/out/_next/static/chunks/app/intake/page-c280f4252452e830.js +1 -0
  140. package/apps/pwa/out/_next/static/chunks/app/layout-cf8c57498f20970a.js +1 -0
  141. package/apps/pwa/out/_next/static/chunks/app/live/page-ca3a17caf409fc83.js +1 -0
  142. package/apps/pwa/out/_next/static/chunks/app/live-run/{page-d7bff0f0905a662c.js → page-26e6c18a1a750cf6.js} +1 -1
  143. package/apps/pwa/out/_next/static/chunks/app/loops/page-3abc872cc6aeee39.js +1 -0
  144. package/apps/pwa/out/_next/static/chunks/app/market/page-f7481b7b2174fe3d.js +1 -0
  145. package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-1ae7ef8077680337.js +1 -0
  146. package/apps/pwa/out/_next/static/chunks/app/morning/page-47c5d4db587266bd.js +1 -0
  147. package/apps/pwa/out/_next/static/chunks/app/not-found-415f1e243c7ccb13.js +1 -0
  148. package/apps/pwa/out/_next/static/chunks/app/observatory/page-73f380f17b76f95c.js +1 -0
  149. package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-2991073ad66ee2d9.js +1 -0
  150. package/apps/pwa/out/_next/static/chunks/app/ops/release/page-1f5a60f70cb4dd0c.js +1 -0
  151. package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-fbad60d1e358fb2c.js +1 -0
  152. package/apps/pwa/out/_next/static/chunks/app/outputs/page-bac7dee94e5eae4a.js +1 -0
  153. package/apps/pwa/out/_next/static/chunks/app/page-398047d6949e8ca5.js +1 -0
  154. package/apps/pwa/out/_next/static/chunks/app/reflection/page-2d33a2231540ca89.js +1 -0
  155. package/apps/pwa/out/_next/static/chunks/app/scheduler/page-5bf1e6bf70bcb96c.js +1 -0
  156. package/apps/pwa/out/_next/static/chunks/app/sessions/page-ba59c19376a0917d.js +1 -0
  157. package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-111f187139add30f.js +1 -0
  158. package/apps/pwa/out/_next/static/chunks/app/settings/page-acaae197d5be5779.js +1 -0
  159. package/apps/pwa/out/_next/static/chunks/app/setup/done/page-0df20b0f546a0d7d.js +1 -0
  160. package/apps/pwa/out/_next/static/chunks/app/setup/layout-ce9e00f7fb45506a.js +1 -0
  161. package/apps/pwa/out/_next/static/chunks/app/setup/page-27e1202d24b8fe35.js +1 -0
  162. package/apps/pwa/out/_next/static/chunks/app/share/page-bda78c50a78363e5.js +1 -0
  163. package/apps/pwa/out/_next/static/chunks/app/showroom/page-da592691293d9c9f.js +1 -0
  164. package/apps/pwa/out/_next/static/chunks/app/tasks/page-f832994317a2e9f0.js +1 -0
  165. package/apps/pwa/out/_next/static/chunks/app/term/{page-df3445b207ceceab.js → page-dc0a532f5b9196ec.js} +1 -1
  166. package/apps/pwa/out/_next/static/chunks/app/today/page-cfccbbeae0473404.js +1 -0
  167. package/apps/pwa/out/_next/static/chunks/app/trace/page-527e2073af84c81b.js +1 -0
  168. package/apps/pwa/out/_next/static/chunks/app/vault/page-bac86e9112671357.js +1 -0
  169. package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-6d59dff410e9d76a.js +1 -0
  170. package/apps/pwa/out/_next/static/chunks/app/workflows/page-53a61f8be09f02d2.js +1 -0
  171. package/apps/pwa/out/_next/static/chunks/app/workspace/page-db8f559e763c17f9.js +1 -0
  172. package/apps/pwa/out/_next/static/chunks/app/worktrees/page-c02aa4cc66455093.js +1 -0
  173. package/apps/pwa/out/_next/static/chunks/{9a8cb466.cc9fc9e6e46038aa.js → b2f6ba4d.fb56fdbbf798df33.js} +1 -1
  174. package/apps/pwa/out/_next/static/chunks/b6705a4f-b9a9047de9eecfd0.js +1 -0
  175. package/apps/pwa/out/_next/static/chunks/{4fa33ebd.21c1bd5b294496e6.js → cbe38a15.5a032598e39970c6.js} +1 -1
  176. package/apps/pwa/out/_next/static/chunks/{abb4b98b.163e0f56e84ae35d.js → d06f9160.a3d9062f95de8ad7.js} +1 -1
  177. package/apps/pwa/out/_next/static/chunks/{9b48c871.204d5d13e7809bd0.js → da5176c6.6773b6c5994e1d99.js} +1 -1
  178. package/apps/pwa/out/_next/static/chunks/framework-50e6acebc630849b.js +1 -0
  179. package/apps/pwa/out/_next/static/chunks/main-7a1ae342d5ed75e6.js +1 -0
  180. package/apps/pwa/out/_next/static/chunks/main-app-7ad7d505ba1f92b4.js +1 -0
  181. package/apps/pwa/out/_next/static/chunks/pages/_app-02edba75232cb235.js +1 -0
  182. package/apps/pwa/out/_next/static/chunks/pages/_error-97d6ebae3e8eee4a.js +1 -0
  183. package/apps/pwa/out/_next/static/chunks/webpack-e986adaa429163e8.js +1 -0
  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/README.md +4 -0
  283. package/graphs/catalog/catalog.yaml +1 -1
  284. package/graphs/default-loop.yaml +57 -3
  285. package/graphs/document-loop.yaml +51 -3
  286. package/graphs/implement-loop.yaml +53 -4
  287. package/graphs/journey/ta-journey.yaml +11 -1
  288. package/graphs/journey/units/author-dialogue/author-dialogue.yaml +42 -0
  289. package/graphs/journey/units/author-dialogue/observe.ts +96 -0
  290. package/graphs/journey/units/author-dialogue/recipes.yaml +10 -0
  291. package/graphs/operate-loop.yaml +51 -3
  292. package/graphs/research-loop.yaml +137 -3
  293. package/graphs/test-diet/test-diet.yaml +3 -0
  294. package/package.json +1 -1
  295. package/scripts/coord-role-pack.ts +19 -6
  296. package/scripts/hq/standby-snapshot.ts +17 -12
  297. package/scripts/release-loop/docs-land-node.ts +21 -5
  298. package/scripts/release-loop/gate-baseline-receipt.ts +155 -0
  299. package/scripts/release-loop/gate-node.ts +181 -22
  300. package/scripts/release-loop/gate-partial.ts +65 -11
  301. package/scripts/release-loop/gate-radius-live.ts +177 -0
  302. package/scripts/release-loop/gate-radius-shadow.ts +1 -1
  303. package/scripts/release-loop/node-verdict.ts +12 -1
  304. package/scripts/release-loop/npm-publish-node.ts +66 -12
  305. package/scripts/release-loop/probe-pod-host-dirs-live.ts +5 -0
  306. package/scripts/release-loop/pwa-remote.ts +166 -0
  307. package/scripts/release-loop/pwa-scenarios-node.ts +19 -3
  308. package/scripts/release-loop/resume-release.ts +41 -4
  309. package/scripts/release-loop/unattended-release.ts +2 -0
  310. package/scripts/test-diet/lib.ts +6 -1
  311. package/scripts/test-diet/node.ts +194 -13
  312. package/scripts/ux-sim.ts +39 -0
  313. package/src/agent/self-ambient-cache.ts +8 -0
  314. package/src/agent-substrate/acp-reviewer.ts +39 -4
  315. package/src/agent-substrate/pr-reviewer.ts +17 -0
  316. package/src/agent-substrate/self-review-cli.ts +62 -13
  317. package/src/autopilot/pr-manager.ts +215 -36
  318. package/src/budget/run-usage-rollup.ts +1 -0
  319. package/src/chat/index.ts +0 -2
  320. package/src/chat/pickers/modal-runtime.ts +10 -27
  321. package/src/cli/agent-cli.ts +13 -2
  322. package/src/cli/doctor-cli.ts +4 -1
  323. package/src/cli/light-entry-route.ts +46 -6
  324. package/src/cli/pod-cli.ts +77 -3
  325. package/src/cli/pr-cli.ts +5 -2
  326. package/src/cli/pr-land-pod-shadow-job.ts +3 -0
  327. package/src/cli/release-checklist-read-cli.ts +79 -0
  328. package/src/cli/release-cli.ts +72 -102
  329. package/src/cli/remote-resolve.ts +1 -1
  330. package/src/cli/root-tui-entry.ts +48 -0
  331. package/src/cli/sim-cli.ts +22 -0
  332. package/src/cli/tasks-cli.ts +540 -31
  333. package/src/cli/usage-cli.ts +13 -11
  334. package/src/clipboard/history.ts +179 -13
  335. package/src/config.ts +8 -1
  336. package/src/dashboard/chat/acp-chat.ts +8 -0
  337. package/src/dashboard/index.ts +78 -10
  338. package/src/dashboard/render/theme-resolver.ts +33 -4
  339. package/src/domains/schedule-registry.ts +16 -2
  340. package/src/git-fs/idle-refresh.ts +76 -0
  341. package/src/git-fs/index.ts +18 -7
  342. package/src/git-fs/worktree.ts +42 -4
  343. package/src/graph-kinds/registry.ts +2 -2
  344. package/src/graph-runner/runner.ts +153 -10
  345. package/src/grok/credential.ts +10 -3
  346. package/src/harness/harness-cli-command.ts +112 -28
  347. package/src/harness/harness-incidents.ts +33 -0
  348. package/src/harness/launch-utterance-ledger.ts +208 -0
  349. package/src/impl-discipline/detector.ts +16 -4
  350. package/src/impl-discipline/system-prompt.ts +11 -0
  351. package/src/impl-discipline/types.ts +2 -2
  352. package/src/index.ts +496 -143
  353. package/src/intake-plane/already-built-hint.ts +4 -2
  354. package/src/intake-plane/requirement-funnel.ts +29 -1
  355. package/src/light-cli.ts +27 -11
  356. package/src/llm/opengateway-models.ts +11 -0
  357. package/src/llm/provider-credentials.ts +14 -0
  358. package/src/llm/provider-detect.ts +8 -1
  359. package/src/llm/runtime-model-family.ts +2 -1
  360. package/src/llm.ts +213 -56
  361. package/src/model-tier/llm-tier-map.ts +15 -1
  362. package/src/native-tool-catalog.ts +15 -1
  363. package/src/nexus/api/loop-resources.ts +13 -1
  364. package/src/oauth/codex.ts +7 -0
  365. package/src/ops/overview-collect.ts +18 -3
  366. package/src/ops/overview.ts +20 -7
  367. package/src/pr-tool/census.ts +261 -27
  368. package/src/pty-shell/pty-manifest.ts +7 -0
  369. package/src/release-loop/checklist.ts +24 -0
  370. package/src/release-loop/landed-but-yellow.ts +129 -5
  371. package/src/release-loop/light-rc.ts +1 -0
  372. package/src/release-loop/rehearsal.ts +2 -2
  373. package/src/repl/index.ts +174 -17
  374. package/src/repl/ops-msg-bridge.ts +32 -0
  375. package/src/self-dev/ask-launch-flow.ts +44 -5
  376. package/src/self-dev/cli-help-text.ts +17 -0
  377. package/src/self-dev/dev-cli.ts +11 -9
  378. package/src/self-dev/draft-residue.ts +37 -1
  379. package/src/self-dev/draft-sweep.ts +137 -11
  380. package/src/self-dev/draft-triage-rules.ts +107 -0
  381. package/src/self-dev/fleet-reduce.ts +3 -2
  382. package/src/self-dev/graph-front-nodes.ts +112 -0
  383. package/src/self-dev/graph-journey-nodes.ts +1 -0
  384. package/src/self-dev/harness-run-cli.ts +3 -15
  385. package/src/self-dev/orchestrate-cli-text.ts +10 -0
  386. package/src/self-dev/review-provider-fallback.ts +35 -1
  387. package/src/self-dev/self-orchestrate-runtime.ts +1 -11
  388. package/src/self-dev/shard-aggregate.ts +42 -5
  389. package/src/self-dev/shard-run.ts +8 -1
  390. package/src/self-implement/blocked-draft-policy.ts +20 -0
  391. package/src/self-implement/classify-shadow.ts +3 -7
  392. package/src/self-implement/doctor-visit.ts +18 -1
  393. package/src/self-implement/gate-baseline.ts +56 -17
  394. package/src/self-implement/gate-cli.ts +1 -0
  395. package/src/self-implement/gate-remote.ts +31 -20
  396. package/src/self-implement/goal-author-decompose.ts +275 -47
  397. package/src/self-implement/goal-author.ts +250 -0
  398. package/src/self-implement/goal-elaborate.ts +295 -0
  399. package/src/self-implement/goal-refine.ts +270 -0
  400. package/src/self-implement/graph-overlay-yaml.ts +14 -3
  401. package/src/self-implement/orchestrator.ts +152 -45
  402. package/src/self-implement/rework-budget-judgment.ts +5 -8
  403. package/src/self-implement/run-stop.ts +10 -1
  404. package/src/self-implement/running-runs.ts +29 -1
  405. package/src/self-implement/scope-adjacency.ts +113 -0
  406. package/src/self-implement/seams.ts +127 -24
  407. package/src/self-implement/stop-autoheal.ts +87 -1
  408. package/src/session-runtime/index.ts +1 -1
  409. package/src/setup/llm-env-detect.ts +5 -0
  410. package/src/skills/tools/agent.ts +140 -14
  411. package/src/skills/tools/msg-ask.ts +100 -0
  412. package/src/skills/tools/ops-ledger.ts +2 -1
  413. package/src/steward/hold-hygiene.ts +24 -6
  414. package/src/steward/triage-budget.ts +194 -0
  415. package/src/steward/triage.ts +20 -3
  416. package/src/task-agent/actions.ts +69 -1
  417. package/src/task-agent/green-sweep.ts +4 -0
  418. package/src/task-agent/live-moves.ts +160 -4
  419. package/src/task-agent/parent-host.ts +123 -3
  420. package/src/task-agent/shadow.ts +7 -1
  421. package/src/task-agent/task-hand.ts +54 -41
  422. package/src/task-agent/tier-split.ts +127 -0
  423. package/src/task-agent/work-order-build.ts +2 -0
  424. package/src/task-agent/work-order.ts +3 -2
  425. package/src/task-orchestrator/generator-prompt.ts +60 -11
  426. package/src/task-orchestrator/surfaces/pod-account-broker.ts +33 -0
  427. package/src/task-orchestrator/surfaces/pod-child-providers.ts +1 -1
  428. package/src/task-orchestrator/surfaces/pod-command-job.ts +45 -7
  429. package/src/task-orchestrator/surfaces/pod-image-source.ts +89 -1
  430. package/src/task-orchestrator/surfaces/pod-lease.ts +17 -8
  431. package/src/task-orchestrator/surfaces/pod-manifest-test-normalize.ts +8 -2
  432. package/src/task-orchestrator/surfaces/pod-provenance.ts +76 -0
  433. package/src/task-orchestrator/surfaces/pod-source-receive.ts +18 -0
  434. package/src/task-orchestrator/surfaces/pod-warm-provenance.ts +81 -0
  435. package/src/task-orchestrator/surfaces/pod-warm-worker-pod.ts +6 -2
  436. package/src/task-orchestrator/surfaces/pod-warm-worker-protocol.ts +3 -0
  437. package/src/task-orchestrator/surfaces/pod-warm-worker-provider.ts +37 -5
  438. package/src/task-orchestrator/surfaces/self-implement-pod.ts +368 -36
  439. package/src/task-orchestrator/surfaces/self-implement.ts +23 -0
  440. package/src/tool-runtime/ops-ledger-runtimes.ts +10 -2
  441. package/src/tui/README.md +2 -0
  442. package/src/tui/chat/background-job-status.ts +54 -0
  443. package/src/tui/chat/log-view.ts +80 -0
  444. package/src/tui/entry.ts +406 -0
  445. package/src/tui/input/composer.ts +144 -0
  446. package/src/tui/seat-mail-boot.ts +59 -0
  447. package/src/tui/slash/compact.ts +100 -0
  448. package/src/tui/slash/new-session.ts +35 -0
  449. package/src/tui-client/local-chat-turn.ts +239 -0
  450. package/src/tui-client/local-harness-command.ts +63 -0
  451. package/src/tui-client/local-provider-command.ts +184 -0
  452. package/src/user-config.ts +4 -2
  453. package/src/ux-sim/event-monkey.ts +378 -0
  454. package/src/ux-sim/fake-bin.ts +42 -7
  455. package/src/ux-sim/fault-nextmove-dispatch.ts +266 -0
  456. package/src/ux-sim/fault-pod-codex-503.ts +211 -0
  457. package/src/ux-sim/fault-scope-escape-lift.ts +189 -0
  458. package/src/version/packed-revision.json +1 -1
  459. package/apps/pwa/out/_next/static/chunks/1162.c69abda138c7ce43.js +0 -79
  460. package/apps/pwa/out/_next/static/chunks/1449-1fede62af84c3e43.js +0 -1
  461. package/apps/pwa/out/_next/static/chunks/1598-13fc845935e816df.js +0 -1
  462. package/apps/pwa/out/_next/static/chunks/1639.62c5e16fa20d242f.js +0 -94
  463. package/apps/pwa/out/_next/static/chunks/1661-adb8b2babc9aaf8c.js +0 -1
  464. package/apps/pwa/out/_next/static/chunks/2147.107c0fc6146fb15a.js +0 -23
  465. package/apps/pwa/out/_next/static/chunks/2202-ef1c9b000c3074fc.js +0 -1
  466. package/apps/pwa/out/_next/static/chunks/2247.1e326638ee43e672.js +0 -115
  467. package/apps/pwa/out/_next/static/chunks/2268.56e1e3d58180abae.js +0 -8
  468. package/apps/pwa/out/_next/static/chunks/2469-606819c812414021.js +0 -1
  469. package/apps/pwa/out/_next/static/chunks/2593.e53c1620c0bb3599.js +0 -1
  470. package/apps/pwa/out/_next/static/chunks/2690.e96671114222676a.js +0 -1
  471. package/apps/pwa/out/_next/static/chunks/2898-79ee1a5cc0cd9d13.js +0 -1
  472. package/apps/pwa/out/_next/static/chunks/298.26099a9f65e5c8ff.js +0 -1
  473. package/apps/pwa/out/_next/static/chunks/2992.51fc2a7295bd8139.js +0 -1
  474. package/apps/pwa/out/_next/static/chunks/3001-5a52788c813b6113.js +0 -1
  475. package/apps/pwa/out/_next/static/chunks/3014-291245fba9df7b5b.js +0 -1
  476. package/apps/pwa/out/_next/static/chunks/3068.ee78201f0251a18d.js +0 -1
  477. package/apps/pwa/out/_next/static/chunks/3083.cd399a17e9365f78.js +0 -1
  478. package/apps/pwa/out/_next/static/chunks/3103.84470c8445962f04.js +0 -34
  479. package/apps/pwa/out/_next/static/chunks/3117-e1c474683fd1f824.js +0 -1
  480. package/apps/pwa/out/_next/static/chunks/3251-2c17bd5a91f8de2e.js +0 -1
  481. package/apps/pwa/out/_next/static/chunks/326.3fb32322bb2ddf6d.js +0 -1
  482. package/apps/pwa/out/_next/static/chunks/3411-f87314c6c66ebc73.js +0 -1
  483. package/apps/pwa/out/_next/static/chunks/3421-7ff7fbaa156985a7.js +0 -1
  484. package/apps/pwa/out/_next/static/chunks/3498.cf2a15a8a9e5b926.js +0 -226
  485. package/apps/pwa/out/_next/static/chunks/381.f55dc63ea87735e6.js +0 -1
  486. package/apps/pwa/out/_next/static/chunks/3819.163d4777f0a597f6.js +0 -32
  487. package/apps/pwa/out/_next/static/chunks/3837.722e053fb9f321ad.js +0 -1
  488. package/apps/pwa/out/_next/static/chunks/4129-ab0a6189f1778633.js +0 -1
  489. package/apps/pwa/out/_next/static/chunks/4361.93d14ba594b3a035.js +0 -104
  490. package/apps/pwa/out/_next/static/chunks/4364.7a7eb19cceb67d2f.js +0 -286
  491. package/apps/pwa/out/_next/static/chunks/4406.d71f506f7c3ee9d3.js +0 -149
  492. package/apps/pwa/out/_next/static/chunks/4461.2ad1514180ae7e29.js +0 -148
  493. package/apps/pwa/out/_next/static/chunks/4479.bd309cbe0e3842ee.js +0 -64
  494. package/apps/pwa/out/_next/static/chunks/4522-05966f777d66d13b.js +0 -1
  495. package/apps/pwa/out/_next/static/chunks/4543-9a3e9812e845de65.js +0 -1
  496. package/apps/pwa/out/_next/static/chunks/4557.f8f1d84a0d90d590.js +0 -74
  497. package/apps/pwa/out/_next/static/chunks/4589-79b11542179ef58c.js +0 -1
  498. package/apps/pwa/out/_next/static/chunks/4633-9f8f9f88ffbb8f5c.js +0 -1
  499. package/apps/pwa/out/_next/static/chunks/4831.23af4d10c0697b5e.js +0 -1
  500. package/apps/pwa/out/_next/static/chunks/4983.5951b85724f61f2a.js +0 -1
  501. package/apps/pwa/out/_next/static/chunks/5028-f0722e6114c313e7.js +0 -1
  502. package/apps/pwa/out/_next/static/chunks/5249.96a848656b582a93.js +0 -1
  503. package/apps/pwa/out/_next/static/chunks/5311.16e0ffbfa5468b80.js +0 -62
  504. package/apps/pwa/out/_next/static/chunks/5446.edf141cff9ef647d.js +0 -1
  505. package/apps/pwa/out/_next/static/chunks/5489.ec2dd1b5272a19dc.js +0 -24
  506. package/apps/pwa/out/_next/static/chunks/559.df87695df637920c.js +0 -1
  507. package/apps/pwa/out/_next/static/chunks/5618-5c88f2f70178c4ad.js +0 -1
  508. package/apps/pwa/out/_next/static/chunks/5764.05487bf0b73ddb6b.js +0 -1
  509. package/apps/pwa/out/_next/static/chunks/5930.e678826c3f831aab.js +0 -1
  510. package/apps/pwa/out/_next/static/chunks/5dfb57f7.f2e3305326202474.js +0 -1
  511. package/apps/pwa/out/_next/static/chunks/6200-cefd6f33f59d765e.js +0 -1
  512. package/apps/pwa/out/_next/static/chunks/6314-edeba650ae686ac9.js +0 -1
  513. package/apps/pwa/out/_next/static/chunks/6316-bc9a9b74d7842d79.js +0 -1
  514. package/apps/pwa/out/_next/static/chunks/6476-13b9779b73528008.js +0 -1
  515. package/apps/pwa/out/_next/static/chunks/666-04db3ac4c8e3c66f.js +0 -1
  516. package/apps/pwa/out/_next/static/chunks/670.682e55106ef915a6.js +0 -77
  517. package/apps/pwa/out/_next/static/chunks/6816.b7ba9d0a1a4a46a7.js +0 -1
  518. package/apps/pwa/out/_next/static/chunks/690-fbbcc777f189af37.js +0 -1
  519. package/apps/pwa/out/_next/static/chunks/6989.0d3d4020e5cb3df6.js +0 -90
  520. package/apps/pwa/out/_next/static/chunks/7217-d17393fe7af78fa6.js +0 -1
  521. package/apps/pwa/out/_next/static/chunks/7232.24edbd938a69c8d0.js +0 -1
  522. package/apps/pwa/out/_next/static/chunks/7295cd1e.b4b557908888eeee.js +0 -1
  523. package/apps/pwa/out/_next/static/chunks/7323.adb02de21991883c.js +0 -1
  524. package/apps/pwa/out/_next/static/chunks/7448.478958ffbbba0ac0.js +0 -1
  525. package/apps/pwa/out/_next/static/chunks/7537.ba2208c5c656b8a3.js +0 -1
  526. package/apps/pwa/out/_next/static/chunks/7562.948255cbc3e79d33.js +0 -41
  527. package/apps/pwa/out/_next/static/chunks/7596-962ae6db6cfc9c83.js +0 -1
  528. package/apps/pwa/out/_next/static/chunks/7671.cff51beac212a2ba.js +0 -1
  529. package/apps/pwa/out/_next/static/chunks/7883.3916734ee16d3e58.js +0 -27
  530. package/apps/pwa/out/_next/static/chunks/7952.b192c31b6a0e00cc.js +0 -1
  531. package/apps/pwa/out/_next/static/chunks/801.5b24e81eded22d1b.js +0 -1
  532. package/apps/pwa/out/_next/static/chunks/8176.8c9a8613f5a01ac1.js +0 -36
  533. package/apps/pwa/out/_next/static/chunks/819e78a6.fa3dd7f7da19bf61.js +0 -1
  534. package/apps/pwa/out/_next/static/chunks/8220-78978450c3183d8d.js +0 -1
  535. package/apps/pwa/out/_next/static/chunks/8221-eb60b5bc692a3361.js +0 -1
  536. package/apps/pwa/out/_next/static/chunks/826.e9a26064f474949e.js +0 -1
  537. package/apps/pwa/out/_next/static/chunks/8459-a351487a4480f584.js +0 -1
  538. package/apps/pwa/out/_next/static/chunks/8482-75823d513a4ce151.js +0 -1
  539. package/apps/pwa/out/_next/static/chunks/8488.8da515248cda3f3a.js +0 -1
  540. package/apps/pwa/out/_next/static/chunks/8584.388a1779d9b203af.js +0 -1
  541. package/apps/pwa/out/_next/static/chunks/8637.a55e098e61ffefb8.js +0 -1
  542. package/apps/pwa/out/_next/static/chunks/8817.61bb7ffbba502ecb.js +0 -1
  543. package/apps/pwa/out/_next/static/chunks/9207-8e6a12db30373f32.js +0 -1
  544. package/apps/pwa/out/_next/static/chunks/9263-00ae932c62696a86.js +0 -1
  545. package/apps/pwa/out/_next/static/chunks/9318.caafc3a130e8769c.js +0 -1
  546. package/apps/pwa/out/_next/static/chunks/932.da3fb55951882562.js +0 -93
  547. package/apps/pwa/out/_next/static/chunks/9433.002f8426ac75b6b7.js +0 -1
  548. package/apps/pwa/out/_next/static/chunks/9464.dd631a5a14b1d660.js +0 -24
  549. package/apps/pwa/out/_next/static/chunks/9739.8d5f36ac67a3b236.js +0 -1
  550. package/apps/pwa/out/_next/static/chunks/9743.beeabb9d5f86abe4.js +0 -1
  551. package/apps/pwa/out/_next/static/chunks/9843-a23d3f32dc43f715.js +0 -1
  552. package/apps/pwa/out/_next/static/chunks/994-28211077c7c587d5.js +0 -1
  553. package/apps/pwa/out/_next/static/chunks/app/_not-found/page-3b4c947f174e33d8.js +0 -1
  554. package/apps/pwa/out/_next/static/chunks/app/approvals/page-369d5ce99483f859.js +0 -1
  555. package/apps/pwa/out/_next/static/chunks/app/autopilot/page-63c0ed0eb26e5fce.js +0 -1
  556. package/apps/pwa/out/_next/static/chunks/app/board/page-62802c6003bc85cc.js +0 -1
  557. package/apps/pwa/out/_next/static/chunks/app/botlab/page-ecb41560d4e77be9.js +0 -1
  558. package/apps/pwa/out/_next/static/chunks/app/bots/page-7b65ad8130c93e95.js +0 -1
  559. package/apps/pwa/out/_next/static/chunks/app/ceo/page-8755477c15a9060c.js +0 -1
  560. package/apps/pwa/out/_next/static/chunks/app/chat/page-5725447dd972c471.js +0 -1
  561. package/apps/pwa/out/_next/static/chunks/app/consult/page-b979de0591a69375.js +0 -1
  562. package/apps/pwa/out/_next/static/chunks/app/control/page-6d0796bf4633751a.js +0 -1
  563. package/apps/pwa/out/_next/static/chunks/app/decisions/page-59c31dc0394e67b4.js +0 -1
  564. package/apps/pwa/out/_next/static/chunks/app/design-check/page-12dfc95f6cc5c718.js +0 -1
  565. package/apps/pwa/out/_next/static/chunks/app/editor/page-25788244e66aa4dd.js +0 -1
  566. package/apps/pwa/out/_next/static/chunks/app/exec/page-a2555dc705466322.js +0 -1
  567. package/apps/pwa/out/_next/static/chunks/app/field/page-4fb31eb476dcbad3.js +0 -1
  568. package/apps/pwa/out/_next/static/chunks/app/healthz/route-3b4c947f174e33d8.js +0 -1
  569. package/apps/pwa/out/_next/static/chunks/app/inside/page-578729adbeaa40cb.js +0 -1
  570. package/apps/pwa/out/_next/static/chunks/app/intake/page-a1d20fffbec35205.js +0 -1
  571. package/apps/pwa/out/_next/static/chunks/app/layout-4a558f94516b8004.js +0 -1
  572. package/apps/pwa/out/_next/static/chunks/app/live/page-9e3834705b86145e.js +0 -1
  573. package/apps/pwa/out/_next/static/chunks/app/loops/page-cb1c5fe746ea4014.js +0 -1
  574. package/apps/pwa/out/_next/static/chunks/app/market/page-9ee320507356582a.js +0 -1
  575. package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-66fd183b74835886.js +0 -1
  576. package/apps/pwa/out/_next/static/chunks/app/morning/page-3272a064a01a9927.js +0 -1
  577. package/apps/pwa/out/_next/static/chunks/app/not-found-f281b7a7f6ef2529.js +0 -1
  578. package/apps/pwa/out/_next/static/chunks/app/observatory/page-d45a65f8b7124fcd.js +0 -1
  579. package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-e9c1fe684dd19a66.js +0 -1
  580. package/apps/pwa/out/_next/static/chunks/app/ops/release/page-b8322932fc6e34de.js +0 -1
  581. package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-82c66d9af2290575.js +0 -1
  582. package/apps/pwa/out/_next/static/chunks/app/outputs/page-63c6752009c97b05.js +0 -1
  583. package/apps/pwa/out/_next/static/chunks/app/page-bb33d42ebc358aec.js +0 -1
  584. package/apps/pwa/out/_next/static/chunks/app/reflection/page-7e4c9379197d7214.js +0 -1
  585. package/apps/pwa/out/_next/static/chunks/app/scheduler/page-38bf1e9a7001732b.js +0 -1
  586. package/apps/pwa/out/_next/static/chunks/app/sessions/page-2e5b752012389d56.js +0 -1
  587. package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-398c0faa173203f7.js +0 -1
  588. package/apps/pwa/out/_next/static/chunks/app/settings/page-002f53a965b6445c.js +0 -1
  589. package/apps/pwa/out/_next/static/chunks/app/setup/done/page-7f75997f61a26269.js +0 -1
  590. package/apps/pwa/out/_next/static/chunks/app/setup/layout-3b4c947f174e33d8.js +0 -1
  591. package/apps/pwa/out/_next/static/chunks/app/setup/page-05631753294f23fb.js +0 -1
  592. package/apps/pwa/out/_next/static/chunks/app/share/page-edd700fd2cc3d7f8.js +0 -1
  593. package/apps/pwa/out/_next/static/chunks/app/showroom/page-105f83ecb4594365.js +0 -1
  594. package/apps/pwa/out/_next/static/chunks/app/tasks/page-5823e87d2017f19c.js +0 -1
  595. package/apps/pwa/out/_next/static/chunks/app/today/page-b51ca09566c03de7.js +0 -1
  596. package/apps/pwa/out/_next/static/chunks/app/trace/page-8aacd5ded5dbac60.js +0 -1
  597. package/apps/pwa/out/_next/static/chunks/app/vault/page-bae3365a0b3c6a8e.js +0 -1
  598. package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-9ed52b48ff1aa7fd.js +0 -1
  599. package/apps/pwa/out/_next/static/chunks/app/workflows/page-b6f8cad35fe00946.js +0 -1
  600. package/apps/pwa/out/_next/static/chunks/app/workspace/page-6d25ceda500d2457.js +0 -1
  601. package/apps/pwa/out/_next/static/chunks/app/worktrees/page-b6401a5f2c962fe8.js +0 -1
  602. package/apps/pwa/out/_next/static/chunks/ebf6cf5e.0d2f887b040e80fb.js +0 -122
  603. package/apps/pwa/out/_next/static/chunks/f09ec7d7-d29abe23edcbb193.js +0 -1
  604. package/apps/pwa/out/_next/static/chunks/ffdc3a04.b9c23c1b28dd4a96.js +0 -1
  605. package/apps/pwa/out/_next/static/chunks/framework-9322cb8a56ac081c.js +0 -1
  606. package/apps/pwa/out/_next/static/chunks/main-2fbab294e49a1561.js +0 -1
  607. package/apps/pwa/out/_next/static/chunks/main-app-f36729f56621a8f3.js +0 -1
  608. package/apps/pwa/out/_next/static/chunks/pages/_app-2a62e450b47c6114.js +0 -1
  609. package/apps/pwa/out/_next/static/chunks/pages/_error-5e17f7b445f34d43.js +0 -1
  610. package/apps/pwa/out/_next/static/chunks/webpack-b4263e2190ea7adf.js +0 -1
  611. /package/apps/pwa/out/_next/static/{L04y73dlwKeTW-GetaTF3 → T1mBQqmkwKDLGtyisDCOd}/_ssgManifest.js +0 -0
package/src/index.ts CHANGED
@@ -1,22 +1,13 @@
1
1
  #!/usr/bin/env bun
2
2
  // cron/launchd 최소 PATH 에서도 내부 gh/git subprocess 를 찾도록 PATH 를 먼저 보강(무음실패 근본·2026-07-25).
3
3
  import './ensure-bin-path.js';
4
+ import './instance/resolve.js';
4
5
  import { WORKFLOW_NODE_VARIANT_KEYS } from './workflow-runtime/schema.js';
5
6
  import { accessSync, constants as fsConstants, existsSync, lstatSync, readFileSync, readlinkSync, realpathSync, statSync } from 'node:fs';
6
7
  import type { SelfDevRunParticipant, SelfDevRunState } from './self-dev/run-store.js';
7
8
  import { applyConfigDirFlagFromArgv } from './cli/config-dir-flag.js';
8
9
  import { LOGS_SINCE_OPTION, registerLogsCommands } from './cli/logs-cli.js';
9
- import { registerDocsCommands } from './cli/docs-cli.js';
10
- import { registerBenchCommands } from './cli/bench-cli.js';
11
- import { registerRetroCommands } from './cli/retro-cli.js';
12
- import { registerMemoryCommands } from './cli/memory-cli.js';
13
- import { registerA2ACommands } from './cli/a2a-cli.js';
14
- import { registerPluginCommands } from './cli/plugin-cli.js';
15
- import { registerMakeCommand } from './cli/make-cli.js';
16
- import { registerConnectCommand, registerSkillsCommands } from './cli/skills-cli.js';
17
- import { registerImportCommand } from './cli/import-cli.js';
18
- import { registerPersonaCommands } from './cli/persona-cli.js';
19
- import { registerFleetCommands } from './cli/fleet-cli.js';
10
+
20
11
  import { readPipedStdin } from './cli/piped-stdin.js';
21
12
  import { writeStdoutJson } from './cli/stdout-json.js';
22
13
  import { writeStdoutFully } from './cli/stdout-flush.js';
@@ -28,77 +19,26 @@ import { ensureRunIdentity, getHarnessSpace, normalizeSpaceId } from './harness/
28
19
  // ⇒ «정적» import 로 올린다. 이 모듈은 부작용이 없어 부팅 비용이 사실상 0 이다.
29
20
  import { installDevCompletionGuard } from './self-dev/dev-completion-guard.js';
30
21
  import { formatOrchestrateResultLine } from './self-dev/orchestrate-summary-line.js';
31
- import { buildOrchestrateDecomposePrepareArgs, normalizeOrchestrateRequest, splitOrchestrateGoalTexts } from './self-dev/self-orchestrate-runtime.js';
22
+ import { normalizeOrchestrateRequest, splitOrchestrateGoalTexts } from './self-dev/orchestrate-cli-text.js';
23
+ import { DEV_PLAN_REPLACEMENT, formatDevPlanOptionHelp, HARNESS_RUN_DEPRECATION_HELP } from './self-dev/cli-help-text.js';
32
24
  import { CLI_ENTRANCE_BASELINE, evaluateCommandEntranceBaseline } from './self-dev/entrance-baseline.js';
33
25
  import { CLI_HARNESS_DOGFOOD_ENTRANCE, CLI_HARNESS_ORCHESTRATE_ENTRANCE, describeEntranceCommand, listEntrancesWithModelExposure, renderLaunchEntrances, summarizeEntrances, type EntranceId } from './self-dev/entrance-registry.js';
34
26
  import { isOldDoorInternalCall, refuseOldDoor } from './self-dev/old-door.js';
35
27
  import { collectCommandEntrances, renderCommandEntrances } from './self-dev/entrance-inventory.js';
36
28
  import { isGoalAuthorFileName } from './self-implement/goal-document.js';
37
29
  import { DEV_PIPELINE_SINK_SURFACE } from './self-implement/self-cli-sink-surface.js';
38
- import { registerPrivateLedgerCommands } from './cli/private-ledger-commands.js';
39
- import { registerKnowCommand } from './cli/know-cli.js';
40
- import { registerSeatRequestsCommands } from './cli/seat-requests-cli.js';
41
- import { registerSeatBootCommands } from './cli/seat-cli.js';
30
+
42
31
  import { applyTestStateDirFlagFromArgv } from './cli/test-state-dir-flag.js';
43
32
  import { applyTestFlagFromArgv, observeTestFlagOwnership, uncoveredTestFlagPaths, staleTestFlagPaths } from './cli/test-flag.js';
44
- import { registerPtyTakeoverCommands } from './cli/pty-takeover-cli.js';
45
- import { registerPtyRecordCommand } from './cli/pty-record-cli.js';
46
- import { registerLeaderCommands } from './cli/leader-cli.js';
47
- import { registerRepoCommands } from './cli/repo-cli.js';
48
- import { registerAgentCommands, runChatTurnCli, emitDetachedProgress } from './cli/agent-cli.js';
49
- export { runChatTurnCli, buildCliAgentTools, setCliAgentDispatchForTesting, emitDetachedProgress, emitHarnessFeedbackProgress } from './cli/agent-cli.js';
50
- import { registerOpsCommands } from './cli/ops-cli.js';
51
- import { registerOutputsCommands } from './cli/outputs-cli.js';
52
- import { registerPublishCommands } from './cli/publish-cli.js';
53
- import { registerAutopilotCommands } from './cli/autopilot-cli.js';
54
- import { registerRoleCommands } from './cli/role-cli.js';
55
- import { registerMachineCommands } from './cli/machine-cli.js';
33
+
56
34
  import { recordImagePinFromConfigSet, registerImageCommands } from './cli/image-cli.js';
57
- import { registerAgentEnvCommands } from './cli/agent-env-cli.js';
58
- import { registerScheduleCommands } from './cli/schedule-cli.js';
59
- import { registerGuardianCommands } from './cli/guardian-cli.js';
35
+
60
36
  export { runSchedule, scheduleCreatePlan } from './cli/schedule-cli.js';
61
37
  export type { ScheduleDispatch } from './cli/schedule-cli.js';
62
38
  import { registerReviewLoopOptions, buildReviewLoopOpts } from './agent-mission/review-loop-cli.js';
63
- import { registerCapabilitiesCommand } from './agent-mission/capabilities-cli.js';
64
- import { registerSupervisorMetricsCommand } from './agent-mission/supervisor-metrics-cli.js';
65
- import { agentBackendNames } from './agent-mission/driver.js';
66
- import { registerWhereCommand } from './cli/where-cli.js';
67
- import { registerShadowCommand } from './cli/shadow-cli.js';
68
- import { registerLlmDetectCommand } from './cli/llm-detect-cli.js';
69
- import { registerStorageDetectCommand } from './cli/storage-cli.js';
70
- import { registerPodCommands } from './cli/pod-cli.js';
71
- import { registerBrowserAnnotateCommand } from './cli/browser-annotate-cli.js';
72
- import { registerPendingQuestionsCommand } from './cli/pending-questions-cli.js';
73
- import { registerUsageCommand } from './cli/usage-cli.js';
74
- import { registerUsageDailyCommand } from './cli/usage-daily-cli.js';
75
- import { registerLiveCommands } from './cli/live-cli.js';
76
- import { registerResearchCommand } from './cli/research-cli.js';
77
- import { registerReleaseCommands } from './cli/release-cli.js';
78
- import { registerFreezeCommands } from './cli/freeze-cli.js';
79
- import { registerFlowCommands } from './cli/flow-cli.js';
80
- import { registerModelWatchCommand } from './cli/model-watch-cli.js';
81
- import { registerIntakeCommands } from './cli/intake-cli.js';
82
- import { registerTasksCommands } from './cli/tasks-cli.js';
83
- import { registerBriefCommands } from './cli/brief-cli.js';
84
- import { registerNotifyCommand } from './cli/notify-cli.js';
85
- import { registerAwayCommand } from './cli/away-cli.js';
86
- import { registerLabelsCommands } from './cli/labels-cli.js';
87
- import { registerMsgCommands } from './cli/msg-cli.js';
88
- import { registerDoctorCommand } from './cli/doctor-cli.js';
89
- import { registerProviderCommands } from './cli/provider-cli.js';
39
+
90
40
  export { buildCodexAccountImportGuidance, setCodexAccountLogSinkModuleForTesting } from './cli/provider-cli.js';
91
- import { registerControlCommands } from './cli/control-cli.js';
92
- import { registerHooksCommands } from './cli/hooks-cli.js';
93
- import { registerSetupCommand } from './cli/setup-cli.js';
94
- import { registerStartCommand } from './cli/start-cli.js';
95
- import { registerGroundingSourcesCli } from './grounding/sources-cli.js';
96
- import { registerGraphCommands } from './graph-runner/graph-cli.js';
97
- import { registerLoopCommands } from './loops/loop-cli.js';
98
- import { registerResourceCommands } from './cli/resource-cli.js';
99
- import { registerHqMovePlanCommand } from './hq/hq.js';
100
- import { registerCardCommand } from './task-cards/card-cli.js';
101
- import { registerLaunchHeadCommands } from './launch-head/launch-head-cli.js';
41
+
102
42
  import { acpServerHelpText } from './boot/acp-server-help.js';
103
43
  // IMPORTANT: parse `--config-dir <dir>` + `--test-state-dir <dir>`
104
44
  // BEFORE Commander loads — the resolvers are read at module-init
@@ -116,54 +56,310 @@ applyTestFlagFromArgv();
116
56
  // test-instance default so scoped storage commands stay inside that directory.
117
57
  applyConfigDirFlagFromArgv();
118
58
 
59
+ // Only unambiguous root commands take the small registrar path. Root help,
60
+ // unknown commands and unrecognized global flags keep the complete tree.
61
+ const INDEX_FAST_ROOTS = new Set(['a2a', 'agent-env', 'away', 'bench', 'brief', 'card', 'connect', 'control', 'docs', 'doctor', 'fleet', 'flow', 'freeze', 'graph', 'guardian', 'import', 'intake', 'know', 'labels', 'launch-head', 'leader', 'live', 'llm', 'loop', 'machine', 'make', 'memory', 'msg', 'notify', 'ops', 'outputs', 'plugin', 'pod', 'provider', 'pty', 'publish', 'questions', 'relay', 'release', 'repo', 'research', 'resource', 'retro', 'role', 'schedule', 'seat', 'shadow', 'skills', 'start', 'storage', 'tasks', 'where']);
62
+ function selectedIndexFastRoot(args: readonly string[]): string | undefined {
63
+ if (process.env.ELANOUS_TEST_FLAG_AUDIT === '1') return undefined;
64
+ let index = 0;
65
+ while (index < args.length && args[index]?.startsWith('-')) {
66
+ const flag = args[index]!;
67
+ index++;
68
+ if (flag === '--test' || flag.startsWith('--test=')) continue;
69
+ if (flag === '--config-dir' || flag === '--test-state-dir') {
70
+ if (!args[index] || args[index]!.startsWith('-')) return undefined;
71
+ index++;
72
+ continue;
73
+ }
74
+ if (flag.startsWith('--config-dir=') || flag.startsWith('--test-state-dir=')) continue;
75
+ return undefined;
76
+ }
77
+ const root = args[index];
78
+ // We cannot know every registrar's local options before it is loaded. Keep
79
+ // only universally recognized help (and where's measured JSON action) on
80
+ // the small path; all other options take the complete parser.
81
+ const fastOptions = new Set(root === 'where' ? ['--help', '-h', '--json'] : ['--help', '-h']);
82
+ if (args.slice(index + 1).some((arg) => arg.startsWith('-') && !fastOptions.has(arg))) return undefined;
83
+ return root && INDEX_FAST_ROOTS.has(root) ? root : undefined;
84
+ }
85
+ // An explicit `--tui next` launch does not dispatch a CLI subcommand. Keep command
86
+ // registrars out of the first-frame path while retaining the full tree for
87
+ // help, unknown commands and unrecognized global flags.
88
+ function selectedIndexNextTuiRoot(args: readonly string[]): '__tui_next__' | undefined {
89
+ const rootTui = extractRootTuiEntry(args);
90
+ if (rootTui.error || rootTui.entry !== 'next') return undefined;
91
+ const remaining = rootTui.args.filter((arg) => arg !== '--test' && !arg.startsWith('--test='));
92
+ return remaining.length === 0 ? '__tui_next__' : undefined;
93
+ }
94
+ // Test files import this module to inspect the complete Commander tree. An
95
+ // empty test-runner argv also looks like a bare next launch, so only the real
96
+ // CLI entry may take the next-only registrar path.
97
+ const isCliEntry = import.meta.main || /[\\/]bin[\\/]elanous\.mjs$/.test(process.argv[1] ?? '');
98
+ const INDEX_FAST_ROOT = selectedIndexFastRoot(process.argv.slice(2))
99
+ ?? (isCliEntry ? selectedIndexNextTuiRoot(process.argv.slice(2)) : undefined);
100
+ // Keep the historical index exports without forcing the agent engine into
101
+ // unrelated CLI commands at module load time.
102
+ export const runChatTurnCli: typeof import('./cli/agent-cli.js').runChatTurnCli =
103
+ async (...args) => (await import('./cli/agent-cli.js')).runChatTurnCli(...args);
104
+ export const buildCliAgentTools: typeof import('./cli/agent-cli.js').buildCliAgentTools =
105
+ (...args) => (require('./cli/agent-cli.js') as typeof import('./cli/agent-cli.js')).buildCliAgentTools(...args);
106
+ export const setCliAgentDispatchForTesting: typeof import('./cli/agent-cli.js').setCliAgentDispatchForTesting =
107
+ (...args) => (require('./cli/agent-cli.js') as typeof import('./cli/agent-cli.js')).setCliAgentDispatchForTesting(...args);
108
+ export const emitDetachedProgress: typeof import('./cli/agent-cli.js').emitDetachedProgress =
109
+ (...args) => (require('./cli/agent-cli.js') as typeof import('./cli/agent-cli.js')).emitDetachedProgress(...args);
110
+ export const emitHarnessFeedbackProgress: typeof import('./cli/agent-cli.js').emitHarnessFeedbackProgress =
111
+ (...args) => (require('./cli/agent-cli.js') as typeof import('./cli/agent-cli.js')).emitHarnessFeedbackProgress(...args);
112
+
113
+ // Selected root imports only its registrar; complete help and unknown routes load all.
114
+ const registerDocsCommands = (INDEX_FAST_ROOT && INDEX_FAST_ROOT !== 'docs'
115
+ ? (() => undefined)
116
+ : (require('./cli/docs-cli.js') as typeof import('./cli/docs-cli.js')).registerDocsCommands) as typeof import('./cli/docs-cli.js').registerDocsCommands;
117
+ const registerBenchCommands = (INDEX_FAST_ROOT && INDEX_FAST_ROOT !== 'bench'
118
+ ? (() => undefined)
119
+ : (require('./cli/bench-cli.js') as typeof import('./cli/bench-cli.js')).registerBenchCommands) as typeof import('./cli/bench-cli.js').registerBenchCommands;
120
+ const registerRetroCommands = (INDEX_FAST_ROOT && INDEX_FAST_ROOT !== 'retro'
121
+ ? (() => undefined)
122
+ : (require('./cli/retro-cli.js') as typeof import('./cli/retro-cli.js')).registerRetroCommands) as typeof import('./cli/retro-cli.js').registerRetroCommands;
123
+ const registerMemoryCommands = (INDEX_FAST_ROOT && INDEX_FAST_ROOT !== 'memory'
124
+ ? (() => undefined)
125
+ : (require('./cli/memory-cli.js') as typeof import('./cli/memory-cli.js')).registerMemoryCommands) as typeof import('./cli/memory-cli.js').registerMemoryCommands;
126
+ const registerA2ACommands = (INDEX_FAST_ROOT && INDEX_FAST_ROOT !== 'a2a'
127
+ ? (() => undefined)
128
+ : (require('./cli/a2a-cli.js') as typeof import('./cli/a2a-cli.js')).registerA2ACommands) as typeof import('./cli/a2a-cli.js').registerA2ACommands;
129
+ const registerPluginCommands = (INDEX_FAST_ROOT && INDEX_FAST_ROOT !== 'plugin'
130
+ ? (() => undefined)
131
+ : (await import('./cli/plugin-cli.js')).registerPluginCommands) as typeof import('./cli/plugin-cli.js').registerPluginCommands;
132
+ const registerMakeCommand = (INDEX_FAST_ROOT && INDEX_FAST_ROOT !== 'make'
133
+ ? (() => undefined)
134
+ : (require('./cli/make-cli.js') as typeof import('./cli/make-cli.js')).registerMakeCommand) as typeof import('./cli/make-cli.js').registerMakeCommand;
135
+ const registerConnectCommand = (INDEX_FAST_ROOT && INDEX_FAST_ROOT !== 'connect'
136
+ ? (() => undefined)
137
+ : (require('./cli/skills-cli.js') as typeof import('./cli/skills-cli.js')).registerConnectCommand) as typeof import('./cli/skills-cli.js').registerConnectCommand;
138
+ const registerSkillsCommands = (INDEX_FAST_ROOT && INDEX_FAST_ROOT !== 'skills'
139
+ ? (() => undefined)
140
+ : (require('./cli/skills-cli.js') as typeof import('./cli/skills-cli.js')).registerSkillsCommands) as typeof import('./cli/skills-cli.js').registerSkillsCommands;
141
+ const registerImportCommand = (INDEX_FAST_ROOT && INDEX_FAST_ROOT !== 'import'
142
+ ? (() => undefined)
143
+ : (require('./cli/import-cli.js') as typeof import('./cli/import-cli.js')).registerImportCommand) as typeof import('./cli/import-cli.js').registerImportCommand;
144
+ const registerPersonaCommands = (INDEX_FAST_ROOT && INDEX_FAST_ROOT !== '__full__'
145
+ ? (() => undefined)
146
+ : (await import('./cli/persona-cli.js')).registerPersonaCommands) as typeof import('./cli/persona-cli.js').registerPersonaCommands;
147
+ const registerFleetCommands = (INDEX_FAST_ROOT && INDEX_FAST_ROOT !== 'fleet'
148
+ ? (() => undefined)
149
+ : (require('./cli/fleet-cli.js') as typeof import('./cli/fleet-cli.js')).registerFleetCommands) as typeof import('./cli/fleet-cli.js').registerFleetCommands;
150
+ const registerPrivateLedgerCommands = (INDEX_FAST_ROOT && INDEX_FAST_ROOT !== '__full__'
151
+ ? (() => undefined)
152
+ : (require('./cli/private-ledger-commands.js') as typeof import('./cli/private-ledger-commands.js')).registerPrivateLedgerCommands) as typeof import('./cli/private-ledger-commands.js').registerPrivateLedgerCommands;
153
+ const registerKnowCommand = (INDEX_FAST_ROOT && INDEX_FAST_ROOT !== 'know'
154
+ ? (() => undefined)
155
+ : (require('./cli/know-cli.js') as typeof import('./cli/know-cli.js')).registerKnowCommand) as typeof import('./cli/know-cli.js').registerKnowCommand;
156
+ const registerSeatRequestsCommands = (INDEX_FAST_ROOT && INDEX_FAST_ROOT !== 'seat'
157
+ ? (() => undefined)
158
+ : (require('./cli/seat-requests-cli.js') as typeof import('./cli/seat-requests-cli.js')).registerSeatRequestsCommands) as typeof import('./cli/seat-requests-cli.js').registerSeatRequestsCommands;
159
+ const registerSeatBootCommands = (INDEX_FAST_ROOT && INDEX_FAST_ROOT !== 'seat'
160
+ ? (() => undefined)
161
+ : (require('./cli/seat-cli.js') as typeof import('./cli/seat-cli.js')).registerSeatBootCommands) as typeof import('./cli/seat-cli.js').registerSeatBootCommands;
162
+ const registerPtyTakeoverCommands = (INDEX_FAST_ROOT && INDEX_FAST_ROOT !== 'pty'
163
+ ? (() => undefined)
164
+ : (require('./cli/pty-takeover-cli.js') as typeof import('./cli/pty-takeover-cli.js')).registerPtyTakeoverCommands) as typeof import('./cli/pty-takeover-cli.js').registerPtyTakeoverCommands;
165
+ const registerPtyRecordCommand = (INDEX_FAST_ROOT && INDEX_FAST_ROOT !== 'pty'
166
+ ? (() => undefined)
167
+ : (require('./cli/pty-record-cli.js') as typeof import('./cli/pty-record-cli.js')).registerPtyRecordCommand) as typeof import('./cli/pty-record-cli.js').registerPtyRecordCommand;
168
+ const registerLeaderCommands = (INDEX_FAST_ROOT && INDEX_FAST_ROOT !== 'leader'
169
+ ? (() => undefined)
170
+ : (require('./cli/leader-cli.js') as typeof import('./cli/leader-cli.js')).registerLeaderCommands) as typeof import('./cli/leader-cli.js').registerLeaderCommands;
171
+ const registerRepoCommands = (INDEX_FAST_ROOT && INDEX_FAST_ROOT !== 'repo'
172
+ ? (() => undefined)
173
+ : (require('./cli/repo-cli.js') as typeof import('./cli/repo-cli.js')).registerRepoCommands) as typeof import('./cli/repo-cli.js').registerRepoCommands;
174
+ const registerOpsCommands = (INDEX_FAST_ROOT && INDEX_FAST_ROOT !== 'ops'
175
+ ? (() => undefined)
176
+ : (require('./cli/ops-cli.js') as typeof import('./cli/ops-cli.js')).registerOpsCommands) as typeof import('./cli/ops-cli.js').registerOpsCommands;
177
+ const registerOutputsCommands = (INDEX_FAST_ROOT && INDEX_FAST_ROOT !== 'outputs'
178
+ ? (() => undefined)
179
+ : (require('./cli/outputs-cli.js') as typeof import('./cli/outputs-cli.js')).registerOutputsCommands) as typeof import('./cli/outputs-cli.js').registerOutputsCommands;
180
+ const registerPublishCommands = (INDEX_FAST_ROOT && INDEX_FAST_ROOT !== 'publish'
181
+ ? (() => undefined)
182
+ : (require('./cli/publish-cli.js') as typeof import('./cli/publish-cli.js')).registerPublishCommands) as typeof import('./cli/publish-cli.js').registerPublishCommands;
183
+ const registerAutopilotCommands = (INDEX_FAST_ROOT && INDEX_FAST_ROOT !== '__full__'
184
+ ? (() => undefined)
185
+ : (require('./cli/autopilot-cli.js') as typeof import('./cli/autopilot-cli.js')).registerAutopilotCommands) as typeof import('./cli/autopilot-cli.js').registerAutopilotCommands;
186
+ const registerRoleCommands = (INDEX_FAST_ROOT && INDEX_FAST_ROOT !== 'role'
187
+ ? (() => undefined)
188
+ : (require('./cli/role-cli.js') as typeof import('./cli/role-cli.js')).registerRoleCommands) as typeof import('./cli/role-cli.js').registerRoleCommands;
189
+ const registerMachineCommands = (INDEX_FAST_ROOT && INDEX_FAST_ROOT !== 'machine'
190
+ ? (() => undefined)
191
+ : (require('./cli/machine-cli.js') as typeof import('./cli/machine-cli.js')).registerMachineCommands) as typeof import('./cli/machine-cli.js').registerMachineCommands;
192
+ const registerAgentEnvCommands = (INDEX_FAST_ROOT && INDEX_FAST_ROOT !== 'agent-env'
193
+ ? (() => undefined)
194
+ : (require('./cli/agent-env-cli.js') as typeof import('./cli/agent-env-cli.js')).registerAgentEnvCommands) as typeof import('./cli/agent-env-cli.js').registerAgentEnvCommands;
195
+ const registerScheduleCommands = (INDEX_FAST_ROOT && INDEX_FAST_ROOT !== 'schedule'
196
+ ? (() => undefined)
197
+ : (require('./cli/schedule-cli.js') as typeof import('./cli/schedule-cli.js')).registerScheduleCommands) as typeof import('./cli/schedule-cli.js').registerScheduleCommands;
198
+ const registerGuardianCommands = (INDEX_FAST_ROOT && INDEX_FAST_ROOT !== 'guardian'
199
+ ? (() => undefined)
200
+ : (require('./cli/guardian-cli.js') as typeof import('./cli/guardian-cli.js')).registerGuardianCommands) as typeof import('./cli/guardian-cli.js').registerGuardianCommands;
201
+ const registerCapabilitiesCommand = (INDEX_FAST_ROOT && INDEX_FAST_ROOT !== '__full__'
202
+ ? (() => undefined)
203
+ : (require('./agent-mission/capabilities-cli.js') as typeof import('./agent-mission/capabilities-cli.js')).registerCapabilitiesCommand) as typeof import('./agent-mission/capabilities-cli.js').registerCapabilitiesCommand;
204
+ const registerSupervisorMetricsCommand = (INDEX_FAST_ROOT && INDEX_FAST_ROOT !== '__full__'
205
+ ? (() => undefined)
206
+ : (require('./agent-mission/supervisor-metrics-cli.js') as typeof import('./agent-mission/supervisor-metrics-cli.js')).registerSupervisorMetricsCommand) as typeof import('./agent-mission/supervisor-metrics-cli.js').registerSupervisorMetricsCommand;
207
+ const registerWhereCommand = (INDEX_FAST_ROOT && INDEX_FAST_ROOT !== 'where'
208
+ ? (() => undefined)
209
+ : (require('./cli/where-cli.js') as typeof import('./cli/where-cli.js')).registerWhereCommand) as typeof import('./cli/where-cli.js').registerWhereCommand;
210
+ const registerShadowCommand = (INDEX_FAST_ROOT && INDEX_FAST_ROOT !== 'shadow'
211
+ ? (() => undefined)
212
+ : (require('./cli/shadow-cli.js') as typeof import('./cli/shadow-cli.js')).registerShadowCommand) as typeof import('./cli/shadow-cli.js').registerShadowCommand;
213
+ const registerLlmDetectCommand = (INDEX_FAST_ROOT && INDEX_FAST_ROOT !== 'llm'
214
+ ? (() => undefined)
215
+ : (require('./cli/llm-detect-cli.js') as typeof import('./cli/llm-detect-cli.js')).registerLlmDetectCommand) as typeof import('./cli/llm-detect-cli.js').registerLlmDetectCommand;
216
+ const registerStorageDetectCommand = (INDEX_FAST_ROOT && INDEX_FAST_ROOT !== 'storage'
217
+ ? (() => undefined)
218
+ : (require('./cli/storage-cli.js') as typeof import('./cli/storage-cli.js')).registerStorageDetectCommand) as typeof import('./cli/storage-cli.js').registerStorageDetectCommand;
219
+ const registerPodCommands = (INDEX_FAST_ROOT && INDEX_FAST_ROOT !== 'pod'
220
+ ? (() => undefined)
221
+ : (require('./cli/pod-cli.js') as typeof import('./cli/pod-cli.js')).registerPodCommands) as typeof import('./cli/pod-cli.js').registerPodCommands;
222
+ const registerBrowserAnnotateCommand = (require('./cli/browser-annotate-cli.js') as typeof import('./cli/browser-annotate-cli.js')).registerBrowserAnnotateCommand;
223
+ const registerPendingQuestionsCommand = (INDEX_FAST_ROOT && INDEX_FAST_ROOT !== 'questions'
224
+ ? (() => undefined)
225
+ : (require('./cli/pending-questions-cli.js') as typeof import('./cli/pending-questions-cli.js')).registerPendingQuestionsCommand) as typeof import('./cli/pending-questions-cli.js').registerPendingQuestionsCommand;
226
+ const registerUsageCommand = (INDEX_FAST_ROOT && INDEX_FAST_ROOT !== '__full__'
227
+ ? (() => undefined)
228
+ : (require('./cli/usage-cli.js') as typeof import('./cli/usage-cli.js')).registerUsageCommand) as typeof import('./cli/usage-cli.js').registerUsageCommand;
229
+ const registerUsageDailyCommand = (INDEX_FAST_ROOT && INDEX_FAST_ROOT !== '__full__'
230
+ ? (() => undefined)
231
+ : (require('./cli/usage-daily-cli.js') as typeof import('./cli/usage-daily-cli.js')).registerUsageDailyCommand) as typeof import('./cli/usage-daily-cli.js').registerUsageDailyCommand;
232
+ const registerLiveCommands = (INDEX_FAST_ROOT && INDEX_FAST_ROOT !== 'live'
233
+ ? (() => undefined)
234
+ : (require('./cli/live-cli.js') as typeof import('./cli/live-cli.js')).registerLiveCommands) as typeof import('./cli/live-cli.js').registerLiveCommands;
235
+ const registerResearchCommand = (INDEX_FAST_ROOT && INDEX_FAST_ROOT !== 'research'
236
+ ? (() => undefined)
237
+ : (require('./cli/research-cli.js') as typeof import('./cli/research-cli.js')).registerResearchCommand) as typeof import('./cli/research-cli.js').registerResearchCommand;
238
+ const registerReleaseCommands = (INDEX_FAST_ROOT && INDEX_FAST_ROOT !== 'release'
239
+ ? (() => undefined)
240
+ : (require('./cli/release-cli.js') as typeof import('./cli/release-cli.js')).registerReleaseCommands) as typeof import('./cli/release-cli.js').registerReleaseCommands;
241
+ const registerFreezeCommands = (INDEX_FAST_ROOT && INDEX_FAST_ROOT !== 'freeze'
242
+ ? (() => undefined)
243
+ : (require('./cli/freeze-cli.js') as typeof import('./cli/freeze-cli.js')).registerFreezeCommands) as typeof import('./cli/freeze-cli.js').registerFreezeCommands;
244
+ const registerFlowCommands = (INDEX_FAST_ROOT && INDEX_FAST_ROOT !== 'flow'
245
+ ? (() => undefined)
246
+ : (require('./cli/flow-cli.js') as typeof import('./cli/flow-cli.js')).registerFlowCommands) as typeof import('./cli/flow-cli.js').registerFlowCommands;
247
+ const registerModelWatchCommand = (INDEX_FAST_ROOT && INDEX_FAST_ROOT !== '__full__'
248
+ ? (() => undefined)
249
+ : (require('./cli/model-watch-cli.js') as typeof import('./cli/model-watch-cli.js')).registerModelWatchCommand) as typeof import('./cli/model-watch-cli.js').registerModelWatchCommand;
250
+ const registerIntakeCommands = (INDEX_FAST_ROOT && INDEX_FAST_ROOT !== 'intake'
251
+ ? (() => undefined)
252
+ : (require('./cli/intake-cli.js') as typeof import('./cli/intake-cli.js')).registerIntakeCommands) as typeof import('./cli/intake-cli.js').registerIntakeCommands;
253
+ const registerTasksCommands = (INDEX_FAST_ROOT && INDEX_FAST_ROOT !== 'tasks'
254
+ ? (() => undefined)
255
+ : (require('./cli/tasks-cli.js') as typeof import('./cli/tasks-cli.js')).registerTasksCommands) as typeof import('./cli/tasks-cli.js').registerTasksCommands;
256
+ const registerBriefCommands = (INDEX_FAST_ROOT && INDEX_FAST_ROOT !== 'brief'
257
+ ? (() => undefined)
258
+ : (await import('./cli/brief-cli.js')).registerBriefCommands) as typeof import('./cli/brief-cli.js').registerBriefCommands;
259
+ const registerNotifyCommand = (INDEX_FAST_ROOT && INDEX_FAST_ROOT !== 'notify'
260
+ ? (() => undefined)
261
+ : (require('./cli/notify-cli.js') as typeof import('./cli/notify-cli.js')).registerNotifyCommand) as typeof import('./cli/notify-cli.js').registerNotifyCommand;
262
+ const registerAwayCommand = (INDEX_FAST_ROOT && INDEX_FAST_ROOT !== 'away'
263
+ ? (() => undefined)
264
+ : (await import('./cli/away-cli.js')).registerAwayCommand) as typeof import('./cli/away-cli.js').registerAwayCommand;
265
+ const registerLabelsCommands = (INDEX_FAST_ROOT && INDEX_FAST_ROOT !== 'labels'
266
+ ? (() => undefined)
267
+ : (require('./cli/labels-cli.js') as typeof import('./cli/labels-cli.js')).registerLabelsCommands) as typeof import('./cli/labels-cli.js').registerLabelsCommands;
268
+ const registerMsgCommands = (INDEX_FAST_ROOT && INDEX_FAST_ROOT !== 'msg'
269
+ ? (() => undefined)
270
+ : (require('./cli/msg-cli.js') as typeof import('./cli/msg-cli.js')).registerMsgCommands) as typeof import('./cli/msg-cli.js').registerMsgCommands;
271
+ const registerDoctorCommand = (INDEX_FAST_ROOT && INDEX_FAST_ROOT !== 'doctor'
272
+ ? (() => undefined)
273
+ : (require('./cli/doctor-cli.js') as typeof import('./cli/doctor-cli.js')).registerDoctorCommand) as typeof import('./cli/doctor-cli.js').registerDoctorCommand;
274
+ const registerProviderCommands = (INDEX_FAST_ROOT && INDEX_FAST_ROOT !== 'provider'
275
+ ? (() => undefined)
276
+ : (require('./cli/provider-cli.js') as typeof import('./cli/provider-cli.js')).registerProviderCommands) as typeof import('./cli/provider-cli.js').registerProviderCommands;
277
+ const registerAgentCommands = (INDEX_FAST_ROOT
278
+ ? (() => undefined)
279
+ : (require('./cli/agent-cli.js') as typeof import('./cli/agent-cli.js')).registerAgentCommands) as typeof import('./cli/agent-cli.js').registerAgentCommands;
280
+ const registerControlCommands = (INDEX_FAST_ROOT && INDEX_FAST_ROOT !== 'control'
281
+ ? (() => undefined)
282
+ : (require('./cli/control-cli.js') as typeof import('./cli/control-cli.js')).registerControlCommands) as typeof import('./cli/control-cli.js').registerControlCommands;
283
+ const registerHooksCommands = (INDEX_FAST_ROOT && INDEX_FAST_ROOT !== '__full__'
284
+ ? (() => undefined)
285
+ : (require('./cli/hooks-cli.js') as typeof import('./cli/hooks-cli.js')).registerHooksCommands) as typeof import('./cli/hooks-cli.js').registerHooksCommands;
286
+ const registerSetupCommand = (INDEX_FAST_ROOT === '__tui_next__'
287
+ ? (() => undefined)
288
+ : (require('./cli/setup-cli.js') as typeof import('./cli/setup-cli.js')).registerSetupCommand) as typeof import('./cli/setup-cli.js').registerSetupCommand;
289
+ const registerStartCommand = (INDEX_FAST_ROOT && INDEX_FAST_ROOT !== 'start'
290
+ ? (() => undefined)
291
+ : (require('./cli/start-cli.js') as typeof import('./cli/start-cli.js')).registerStartCommand) as typeof import('./cli/start-cli.js').registerStartCommand;
292
+ const registerGroundingSourcesCli = (INDEX_FAST_ROOT && INDEX_FAST_ROOT !== '__full__'
293
+ ? (() => undefined)
294
+ : (require('./grounding/sources-cli.js') as typeof import('./grounding/sources-cli.js')).registerGroundingSourcesCli) as typeof import('./grounding/sources-cli.js').registerGroundingSourcesCli;
295
+ const registerGraphCommands = (INDEX_FAST_ROOT && INDEX_FAST_ROOT !== 'graph'
296
+ ? (() => undefined)
297
+ : (require('./graph-runner/graph-cli.js') as typeof import('./graph-runner/graph-cli.js')).registerGraphCommands) as typeof import('./graph-runner/graph-cli.js').registerGraphCommands;
298
+ const registerLoopCommands = (INDEX_FAST_ROOT && INDEX_FAST_ROOT !== 'loop'
299
+ ? (() => undefined)
300
+ : (require('./loops/loop-cli.js') as typeof import('./loops/loop-cli.js')).registerLoopCommands) as typeof import('./loops/loop-cli.js').registerLoopCommands;
301
+ const registerResourceCommands = (INDEX_FAST_ROOT && INDEX_FAST_ROOT !== 'resource'
302
+ ? (() => undefined)
303
+ : (require('./cli/resource-cli.js') as typeof import('./cli/resource-cli.js')).registerResourceCommands) as typeof import('./cli/resource-cli.js').registerResourceCommands;
304
+ const registerHqMovePlanCommand = (INDEX_FAST_ROOT && INDEX_FAST_ROOT !== '__full__'
305
+ ? (() => undefined)
306
+ : (require('./hq/hq.js') as typeof import('./hq/hq.js')).registerHqMovePlanCommand) as typeof import('./hq/hq.js').registerHqMovePlanCommand;
307
+ const registerCardCommand = (INDEX_FAST_ROOT && INDEX_FAST_ROOT !== 'card'
308
+ ? (() => undefined)
309
+ : (require('./task-cards/card-cli.js') as typeof import('./task-cards/card-cli.js')).registerCardCommand) as typeof import('./task-cards/card-cli.js').registerCardCommand;
310
+ const registerLaunchHeadCommands = (INDEX_FAST_ROOT && INDEX_FAST_ROOT !== 'launch-head'
311
+ ? (() => undefined)
312
+ : (require('./launch-head/launch-head-cli.js') as typeof import('./launch-head/launch-head-cli.js')).registerLaunchHeadCommands) as typeof import('./launch-head/launch-head-cli.js').registerLaunchHeadCommands;
313
+ const registerIngestTokenCommands = (INDEX_FAST_ROOT && INDEX_FAST_ROOT !== '__full__'
314
+ ? (() => undefined)
315
+ : (require('./cli/ingest-token-cli.js') as typeof import('./cli/ingest-token-cli.js')).registerIngestTokenCommands) as typeof import('./cli/ingest-token-cli.js').registerIngestTokenCommands;
316
+ const registerMcpGatewayCommands = (INDEX_FAST_ROOT && INDEX_FAST_ROOT !== '__full__'
317
+ ? (() => undefined)
318
+ : (require('./cli/mcp-gateway-cli.js') as typeof import('./cli/mcp-gateway-cli.js')).registerMcpGatewayCommands) as typeof import('./cli/mcp-gateway-cli.js').registerMcpGatewayCommands;
319
+ const registerRelayCommand = (INDEX_FAST_ROOT && INDEX_FAST_ROOT !== 'relay'
320
+ ? (() => undefined)
321
+ : (require('./relay/relay-cli.js') as typeof import('./relay/relay-cli.js')).registerRelayCommand) as typeof import('./relay/relay-cli.js').registerRelayCommand;
322
+
323
+
119
324
  import { Command, Option } from 'commander';
120
325
  import { filterCliRootHelp } from './maturity/cli-maturity.js';
121
326
  import type { AdPipelinePlan, AdPipelineResult } from './ad-pipeline/run.js';
122
327
  import type { AcpPermissionApprover } from './acp/client.js';
123
328
  import { runGitCommand } from './git-fs/runner.js';
124
329
  import { debug, redactSecretText, redactSecrets } from './debug/log.js';
125
- import { installHarnessCliCommand, type HarnessAskSayChildLlmOptions, type HarnessAskSayOptions, type HarnessPlanOptions } from './harness/harness-cli-command.js';
330
+ import type { HarnessAskSayChildLlmOptions, HarnessAskSayOptions, HarnessPlanOptions } from './harness/harness-cli-command.js';
126
331
  import { CliUserError, formatCliUserError, isCliUserError } from './cli/cli-user-error.js';
127
332
  import { classifyFriendlyError, formatFriendlyError } from './cli/friendly-errors.js';
128
333
  import { detectLocale } from './expression/locale.js';
129
- import { dispatchSolveMission } from './skills/tools/solve-mission.js';
130
334
  import { performBrowserAction, type BrowserActionDeps, type BrowserActionResult } from './harness/browser-act.js';
131
335
  import { decideTypeAction, type TypeActionDecision, type TypeTarget } from './harness/browser-act-type.js';
132
- import { resolveSelfSendTarget } from './harness/self-send-target.js';
133
336
  import { awaitGlobalPersonaLoad, describeMissingPersona, getGlobalPersonaRegistry } from './persona/global-registry.js';
134
- import { HARNESS_RUN_DEPRECATION_HELP } from './self-dev/harness-run-cli.js';
135
- import { DEV_PLAN_REPLACEMENT, formatDevPlanOptionHelp } from './self-dev/dev-cli.js';
136
337
  import type { InventoryMeta, SortKey } from './llm/local-manager/benchmark/scores.js';
137
338
  import { syncServers, SERVICE_NAMES } from './config.js';
138
339
  import { getLocalSkills, executeSync } from './sync.js';
139
- import { showSyncSelector, showSyncProgress } from './selector.js'; // kept for CLI sync subcommand
140
340
  import { inspectRemote } from './inspect.js';
141
341
  import { showRecentHistory, showSessionDetail, showSkillDetail, showTargetDetail, showStatus } from './history.js';
142
- import { showDashboard } from './dashboard/index.js';
143
342
  import { initTui, closeTui } from './tui.js';
343
+ import { effectiveRootTuiEntry, extractRootTuiEntry } from './cli/root-tui-entry.js';
144
344
  import * as ui from './ui.js';
145
- import { DEFAULT_REVIEW_BACKEND } from './agent-substrate/acp-reviewer.js';
146
345
  import type { ReviewResult } from './agent-substrate/pr-reviewer.js';
147
346
  import type { ReviewVerdict } from './agent-mission/review-loop.js';
148
347
  import type { SyncMode } from './types.js';
149
- import { runOnboarding, runOnboardingStep, runOnboardingNonInteractive, needsOnboarding, needsFirstRun, handleOnboardingRefusal, type OnboardingStepId } from './onboarding.js';
150
- import { firstChatGate } from './onboarding/first-chat-gate.js';
348
+ import type { OnboardingStepId } from './onboarding.js';
151
349
  import {
152
350
  getUserConfig, reloadUserConfig, userConfigPath, saveUserConfig,
153
351
  backupUserConfig, backupConfigPath, addRotationEntry, type RotationEntry,
154
352
  resolveRoleLlm,
155
353
  } from './user-config.js';
156
354
  import { reviewReasoningEffort } from './model-tier/review-effort.js';
157
- import { isKeylessProvider, resolveProviderCredential } from './llm/provider-credentials.js';
355
+ import { configuredOpenGatewayKeys, isKeylessProvider, resolveProviderCredential } from './llm/provider-credentials.js';
158
356
  import {
159
357
  listSessions, loadSession, deleteSession, resolveSessionId,
160
358
  setActiveSessionId, getActiveSessionId,
161
359
  lastConversationMessage, isSessionSource,
162
360
  } from './session/index.js';
163
361
  import { requestSessionTurnControl } from './session/session-turn-control.js';
164
- import { ensureCliSession, sessionBudget } from './session/chat.js';
165
362
  import { suggestProjectForFolder } from './project/project-store.js';
166
- import { botFromConfig, TelegramBot } from './telegram.js';
167
363
  import { acquireTelegramLock, TelegramLockError, defaultLockPath, safeReadLock } from './telegram-lock.js';
168
364
  import { basename, join as _joinPath, resolve } from 'node:path';
169
365
  import * as nodeReadline from 'node:readline/promises';
@@ -189,14 +385,13 @@ import { renderKeyHelp, CONTEXT_LABELS, type KeyContext } from './keybindings.js
189
385
  import { auditKeybindings, renderKeymapAudit } from './keymap-audit.js';
190
386
  import { runCodexSetup } from './codex/setup.js';
191
387
  import { renderAllModels } from './codex/models.js';
192
- import { realIO } from './onboarding.js';
193
388
  import { inspectActiveProvider, oneLineProvider } from './provider-summary.js';
194
389
  import { renderStatusLines, renderPrimaryStatus, renderSecondaryStatus } from './status/bar.js';
195
390
  import { initSessionWorkingDir } from './session/working-dir.js';
196
391
  import { rewriteBareNexusToStatus } from './cli/nexus-entry.js';
197
- import { registerIngestTokenCommands } from './cli/ingest-token-cli.js';
198
- import { registerMcpGatewayCommands } from './cli/mcp-gateway-cli.js';
199
- import { registerRelayCommand } from './relay/relay-cli.js';
392
+
393
+
394
+
200
395
  import type { ReviewImage } from './agent-substrate/pr-reviewer.js';
201
396
  import {
202
397
  describeMissionRouting,
@@ -218,6 +413,8 @@ function resolveCliDirOption(dir: string): string {
218
413
  import { cliVersion, setInstallMetadataRootForTesting } from './version/code-revision.js';
219
414
  export { cliVersion, setInstallMetadataRootForTesting };
220
415
 
416
+
417
+
221
418
  export const program = new Command();
222
419
  program.enablePositionalOptions();
223
420
 
@@ -379,8 +576,12 @@ async function runDefaultAskFileLaunchFlow(
379
576
  import('node:path'),
380
577
  import('./self-dev/entrance-registry.js'),
381
578
  ]);
382
- const askText = readFileSync(askPath, 'utf8');
579
+ // Read the source bytes ONCE: the same bytes feed the ledger and the launch flow (a read failure → launch 0).
580
+ const askBytes = readFileSync(askPath);
581
+ const askText = askBytes.toString('utf8');
383
582
  if (!askText.trim()) throw new Error('--ask 파일 입력이 비었다');
583
+ const { newLaunchUtteranceId, recordLaunchUtterance } = await import('./harness/launch-utterance-ledger.js');
584
+ recordLaunchUtterance({ source: 'ask-file', utterance: askText, rawBytes: askBytes, launchId: newLaunchUtteranceId() });
384
585
  const askIo = await import('./self-dev/ask-launch-io.js');
385
586
  const askLogRows = await askIo.readAskPreflightLogRows();
386
587
  const askLaunchPrep = (await import('./self-dev/launch-preflight.js')).prepareAskLaunch(
@@ -401,7 +602,7 @@ async function runDefaultAskFileLaunchFlow(
401
602
  print: (line) => console.error(line),
402
603
  log: (event, data, level) => debug.log('dev-pipeline', event, data, { level }),
403
604
  readLine: (prompt) => readStdinLine(prompt),
404
- readFile: (file) => readFileSync(file, 'utf8'),
605
+ readFile: (file) => file === askPath ? askText : readFileSync(file, 'utf8'),
405
606
  writeFile: (file, data) => writeFileSync(file, data, 'utf8'),
406
607
  cwd: () => process.cwd(),
407
608
  now: () => Date.now(),
@@ -1383,14 +1584,16 @@ registerDoctorCommand(program);
1383
1584
  registerControlCommands(program);
1384
1585
  registerHooksCommands(program);
1385
1586
  registerSetupCommand(program);
1386
- program.commands.find(command => command.name() === 'setup')!
1387
- .option('--terminal', 'Run the terminal onboarding wizard')
1388
- .hook('preAction', async (_command, action) => {
1389
- if (action.name() === 'setup' && action.opts().terminal) {
1390
- const completed = await runOnboardingForCli();
1391
- process.exit(completed ? 0 : (process.exitCode || 2));
1392
- }
1393
- });
1587
+ if (INDEX_FAST_ROOT !== '__tui_next__') {
1588
+ program.commands.find(command => command.name() === 'setup')!
1589
+ .option('--terminal', 'Run the terminal onboarding wizard')
1590
+ .hook('preAction', async (_command, action) => {
1591
+ if (action.name() === 'setup' && action.opts().terminal) {
1592
+ const completed = await runOnboardingForCli();
1593
+ process.exit(completed ? 0 : (process.exitCode || 2));
1594
+ }
1595
+ });
1596
+ }
1394
1597
  registerStartCommand(program);
1395
1598
  registerGroundingSourcesCli(program);
1396
1599
  registerGraphCommands(program);
@@ -1601,6 +1804,8 @@ program
1601
1804
  )
1602
1805
  // Documentation-only — `readDashboardNameFlag` 가 Commander «전»에 argv 에서 걷어낸다.
1603
1806
  .option('--name <name>', '대시보드 TUI 의 PTY 행(tui:<pid>)에 별명을 달고 뜬다 — `elanous pty list` 에 보이고 `pty snapshot <name>` 으로 부른다. 뜬 뒤 바꾸려면 `elanous pty rename <ref> <name>`.')
1807
+ .option('--legacy', '기존 대시보드 TUI로 시작한다(--tui classic 의 짧은 표기). 기본 진입도 기존 대시보드이며 새 TUI는 --tui next 로만 연다.')
1808
+ .option('--tui <mode>', '루트 TUI를 명시한다(classic|next). 기본은 classic이고 새 TUI는 --tui next 로 연다. --legacy는 classic의 짧은 표기다.')
1604
1809
  .option('--help-all', '시스템 명령을 제외한 모든 최상위 명령 표시');
1605
1810
  program.addHelpText('after', acpServerHelpText());
1606
1811
 
@@ -2430,7 +2635,8 @@ async function runHarnessMissionLoop(
2430
2635
  }
2431
2636
  }
2432
2637
 
2433
- const harnessCmd = installHarnessCliCommand(program, {
2638
+ const harnessCmd = (INDEX_FAST_ROOT ? new Command('harness')
2639
+ : (require('./harness/harness-cli-command.js') as typeof import('./harness/harness-cli-command.js')).installHarnessCliCommand(program, {
2434
2640
  registerSink: async (surface) => { await (await import('./domains/standalone-log-sink.js')).registerStandaloneLogSink(surface); },
2435
2641
  resolveSurface: async () => {
2436
2642
  const { getHarnessSpace, harnessSpaceSurface } = await import('./harness/harness-space.js');
@@ -2444,9 +2650,65 @@ const harnessCmd = installHarnessCliCommand(program, {
2444
2650
  // (그 함수는 planStaged dispatch → 대표 2026-09-04 은퇴한 staged 하니스로 간다).
2445
2651
  // ⇒ 즉 이 «한 줄»이 은퇴를 되돌린다. 주입 자리는 시험용으로 남는다.
2446
2652
  mission: async (missionId, opts) => {
2447
- await dispatchSolveMission({ mission_id: missionId, ...opts });
2653
+ await (await import('./skills/tools/solve-mission.js')).dispatchSolveMission({ mission_id: missionId, ...opts });
2448
2654
  },
2449
2655
  missionLoop: runHarnessMissionLoop,
2656
+ }));
2657
+
2658
+ let podAskSnapshot: string | undefined;
2659
+ let podAskSnapshotCleanup: (() => void) | undefined;
2660
+ harnessCmd.hook('preAction', async (_parent, action) => {
2661
+ if (action.name() === 'ask' && action.opts().substrate === 'pod' && typeof action.args[0] === 'string' && !isGoalAuthorFileName(basename(action.args[0]))) {
2662
+ // Read the source once; onPod and its orchestrator consume the same private snapshot.
2663
+ const askBytes = readFileSync(action.args[0]!);
2664
+ const askText = askBytes.toString('utf8');
2665
+ if (!askText.trim()) throw new Error('--ask 파일 입력이 비었다');
2666
+ const { mkdtempSync, writeFileSync, rmSync } = await import('node:fs');
2667
+ const { tmpdir } = await import('node:os');
2668
+ const { join } = await import('node:path');
2669
+ const snapshotDir = mkdtempSync(join(tmpdir(), 'elanous-ask-snapshot-'));
2670
+ try {
2671
+ const snapshot = join(snapshotDir, basename(action.args[0]!));
2672
+ writeFileSync(snapshot, askBytes, { mode: 0o600 });
2673
+ podAskSnapshot = snapshotDir;
2674
+ podAskSnapshotCleanup = () => {
2675
+ try { rmSync(snapshotDir, { recursive: true, force: true }); }
2676
+ catch (error) { console.error(`[launch-utterance] snapshot cleanup failed: ${String(error)}`); }
2677
+ };
2678
+ process.once('exit', podAskSnapshotCleanup);
2679
+ action.processedArgs[0] = snapshot;
2680
+ } catch (error) {
2681
+ rmSync(snapshotDir, { recursive: true, force: true });
2682
+ throw error;
2683
+ }
2684
+ const { newLaunchUtteranceId, recordLaunchUtterance } = await import('./harness/launch-utterance-ledger.js');
2685
+ recordLaunchUtterance({ source: 'ask-file', utterance: askText, rawBytes: askBytes, launchId: newLaunchUtteranceId() });
2686
+ return;
2687
+ }
2688
+ if (action.name() !== 'say') return;
2689
+ try {
2690
+ const { consumeHandLaunchId, recordLaunchUtterance } = await import('./harness/launch-utterance-ledger.js');
2691
+ const argv = (action.args as string[]).map(String);
2692
+ if (argv.length === 0) return; // nothing was received — no empty start row
2693
+ // New ID per process; only the explicit hand→say pair (same sentence sha ⊕ same run) inherits, once —
2694
+ // and then records the hand's exact original text (recovers a failed hand-parent append in this instance).
2695
+ const { launchId, utterance } = consumeHandLaunchId(argv.join(' '), process.env);
2696
+ recordLaunchUtterance({ source: 'say', utterance, argv, launchId, dryRun: action.opts().dryRun === true });
2697
+ } catch (error) {
2698
+ try { debug.log('harness.launch-utterance', 'prepare-failed', { operation: 'say-hook', reason: String(error) }, { level: 'warn' }); } catch { /* fail-soft */ }
2699
+ }
2700
+ });
2701
+ harnessCmd.hook('postAction', async (_parent, action) => {
2702
+ if (action.name() !== 'ask' || !podAskSnapshot) return;
2703
+ try {
2704
+ const { rmSync } = await import('node:fs');
2705
+ rmSync(podAskSnapshot, { recursive: true, force: true });
2706
+ if (podAskSnapshotCleanup) process.removeListener('exit', podAskSnapshotCleanup);
2707
+ podAskSnapshot = undefined;
2708
+ podAskSnapshotCleanup = undefined;
2709
+ } catch (error) {
2710
+ console.error(`[launch-utterance] snapshot cleanup failed: ${String(error)}`);
2711
+ }
2450
2712
  });
2451
2713
 
2452
2714
  // (internal) 데몬이 dev-harness 를 subprocess 로 위임(#24 A) — 하니스 동기 op 가 데몬 이벤트루프를
@@ -2484,6 +2746,7 @@ harnessCmd
2484
2746
  try { process.stdout.write(line, () => process.exit(code)); }
2485
2747
  catch { process.exit(code); }
2486
2748
  };
2749
+ const { emitDetachedProgress } = await import('./cli/agent-cli.js');
2487
2750
  const detachedCtx = {
2488
2751
  cwd: process.cwd(),
2489
2752
  signal: new AbortController().signal,
@@ -3216,6 +3479,7 @@ export async function runHarnessOrchestrateExecution(
3216
3479
  const { prepareOrchestrateDecomposeGoals } = await import('./self-dev/self-orchestrate-runtime.js');
3217
3480
  return prepareOrchestrateDecomposeGoals(input as never) as Promise<HarnessOrchestratePreparedGoals>;
3218
3481
  });
3482
+ const { buildOrchestrateDecomposePrepareArgs } = await import('./self-dev/self-orchestrate-runtime.js');
3219
3483
  const prepared = await prepareGoals(buildOrchestrateDecomposePrepareArgs({
3220
3484
  request,
3221
3485
  goals,
@@ -4446,7 +4710,7 @@ selfCmd
4446
4710
  .option('--fixed-shard-distribution', '--shards N 과 함께만: RSS 사전 측정 없이 정렬된 파일을 N 조각에 라운드로빈 고정 배정한다(opt-in · 메모리 보증 아님 · 조각 타임아웃/OOM = unmeasured)')
4447
4711
  .option('--include-importers', '변경 모듈을 가져오는 importer 시험도 실행한다 (기본 caller 한도 밖까지)')
4448
4712
  .option('--remote [host]', 'GATE-REMOTE — 같은 커밋을 원격 호스트(기본 config gateRemote.host=node-b)에서 돌리고 결과만 가져온다(깨끗한 트리 · --pr 은 로컬)')
4449
- .option('--local', '원격 자동 분배(로컬 1분 부하 > gateRemote.loadThreshold=20)를 끄고 로컬에서 돌린다')
4713
+ .option('--local', '원격 실행을 끄고 명시적으로 로컬에서 돌린다')
4450
4714
  .option('--artifact-dir <dir>', '조각별 지금/기준 JUnit ⊕ summary.json 을 이 디렉토리에 남긴다(판정 불변 · JUnit 은 --shards 경로만 · 원격 실행이면 그 호스트에서 가져온다)')
4451
4715
  .action(async (opts: { changed?: boolean; base?: string; pr?: string; shards?: string | boolean; fixedShardDistribution?: boolean; includeImporters?: boolean; remote?: string | boolean; local?: boolean; artifactDir?: string }) => {
4452
4716
  if (!opts.changed && opts.shards === undefined) { ui.error('self gate requires --changed or --shards'); process.exitCode = 2; return; }
@@ -4482,8 +4746,8 @@ selfCmd
4482
4746
  if (topLevel.status !== 0) throw new Error(`git rev-parse --show-toplevel failed: ${topLevel.stderr.trim() || `rc=${topLevel.status}`}`);
4483
4747
  const repo = topLevel.stdout.trim();
4484
4748
  // Only a committed --base range is reproducible on another host: the default mode measures uncommitted files, --pr
4485
- // reads files through gh on this host, and the remote checkout runs from the repository root — automatic placement
4486
- // falls back locally; an explicit --remote reports that this check was not measured.
4749
+ // reads files through gh on this host, and the remote checkout runs from the repository root — these cases
4750
+ // fall back locally for automatic placement; an explicitly requested remote run is unmeasured.
4487
4751
  const { realpathSync } = await import('node:fs');
4488
4752
  const localOnlyReason = opts.pr ? 'self gate --pr reads PR files through gh on this host'
4489
4753
  : !opts.base ? 'self gate without --base measures uncommitted files on this host'
@@ -4516,7 +4780,7 @@ selfCmd
4516
4780
  if (outcome.kind === 'ran') {
4517
4781
  target.fetch = fetchRemoteGateArtifacts({ host, remoteDir: target.dir, localDir: resolveArtifactDir(opts.artifactDir!, process.cwd()), ssh: runner.ssh });
4518
4782
  } else if (outcome.kind === 'infra') {
4519
- // The run may have started before it broke — remove the host-side dir; automatic placement's local fallback writes its own.
4783
+ // The run may have started before it broke — remove the host-side dir; remote failure stays unmeasured.
4520
4784
  try { runner.ssh(host, remoteArtifactCleanupScript(target.dir), 30_000); } catch { /* best effort */ }
4521
4785
  }
4522
4786
  }) satisfies NonNullable<import('./self-implement/gate-remote.js').DispatchOptions['onRemoteOutcome']>,
@@ -4524,12 +4788,14 @@ selfCmd
4524
4788
  });
4525
4789
  } catch (error) {
4526
4790
  const reason = error instanceof Error ? error.message : String(error);
4527
- if (opts.remote !== undefined) {
4528
- ui.error(`self gate remote unmeasured — ${reason.replace(/\s+/g, ' ').trim()}`);
4529
- process.exitCode = 1;
4530
- } else {
4791
+ if (opts.local) {
4531
4792
  ui.error(`self gate dispatch failed: ${reason}`);
4532
4793
  process.exitCode = runLocal();
4794
+ } else {
4795
+ ui.error(opts.remote !== undefined
4796
+ ? `self gate remote unmeasured — ${reason.replace(/\s+/g, ' ').trim()}`
4797
+ : `self gate dispatch failed: ${reason}`);
4798
+ process.exitCode = 1;
4533
4799
  }
4534
4800
  }
4535
4801
  // 원격에서 돌았으면 그 호스트의 산출을 가져와 같은 꼴로 썼다 — 못 가져왔으면 «조용히» 비우지 않고 summary 에 이유를 적는다(판정 불변).
@@ -4756,7 +5022,7 @@ const selfOrchestrateCmd = selfCmd
4756
5022
  .option('--no-pod-rebuild', 'pod: 이미지 판(elanous.commit)이 HEAD 와 달라도 다시 굽지 않는다 — 측정은 «이미지 판»을 잰다')
4757
5023
  .option('--pod-pass-env <keys>', 'pod: 호스트 env 에서 Pod 로 넘길 키(쉼표) — 예 OPENROUTER_API_KEY,ANTHROPIC_API_KEY(벤치마크 과금 경로)')
4758
5024
  .option('--bench-arms <spec>', 'pod 벤치마크: 골 1개를 팔마다 «라벨 한 줄만 다르게» 복제해 동시에 — "id=provider[:model][@KEY+KEY];…" (예 codex=openai-codex;or-kimi=openrouter:openrouter/moonshotai/kimi-k3@OPENROUTER_API_KEY) · --auto-merge 거부 · RFC fleet 슈퍼바이저 §A3')
4759
- .addOption(new Option('--child-llm-provider <id>', 'pod: 구현 자식 LLM provider(openai-codex|grok|openrouter|anthropic|bedrock|glm) — 하니스 --child-llm-provider 가 이 자리로 온다(10-05)').hideHelp())
5025
+ .addOption(new Option('--child-llm-provider <id>', 'pod: 구현 자식 LLM provider(openai-codex|grok|openrouter|opengateway|anthropic|bedrock|glm) — 하니스 --child-llm-provider 가 이 자리로 온다(10-05)').hideHelp())
4760
5026
  .addOption(new Option('--child-llm-model <id>', 'pod: 구현 자식 LLM model(--child-llm-provider 와 함께)').hideHelp())
4761
5027
  .addOption(new Option('--child-llm-effort <level>', 'pod: 구현 자식 추론 노력(--child-llm-provider 와 함께)').hideHelp())
4762
5028
  .option('--help-all', '모든 orchestrate 옵션 표시')
@@ -4834,7 +5100,7 @@ const selfOrchestrateCmd = selfCmd
4834
5100
  let parentRequest: string | undefined;
4835
5101
  const request = normalizeOrchestrateRequest(joined);
4836
5102
  if (opts.decompose) parentRequest = request;
4837
- const { prepareOrchestrateDecomposeGoals } = await import('./self-dev/self-orchestrate-runtime.js');
5103
+ const { prepareOrchestrateDecomposeGoals, buildOrchestrateDecomposePrepareArgs } = await import('./self-dev/self-orchestrate-runtime.js');
4838
5104
  const prepared = await prepareOrchestrateDecomposeGoals(buildOrchestrateDecomposePrepareArgs({
4839
5105
  request,
4840
5106
  goals: goalTexts.map((feature) => ({ feature, ...promoteDefaults })),
@@ -5046,11 +5312,24 @@ const selfOrchestrateCmd = selfCmd
5046
5312
  const grokKeyNames = ['XAI_API_KEY', 'GROK_API_KEY', 'GROK_CODE_XAI_API_KEY'];
5047
5313
  // 명시 계정은 사람의 선택 — 공급자 폴백과 계정 브로커를 우회한다.
5048
5314
  const explicitPodAccount = (opts as { podAccount?: string }).podAccount;
5049
- const ownerMirrorAccount = process.env.ELANOUS_REMOTE_CODEX_ACCOUNT?.trim();
5315
+ const ownerMirrorRaw = process.env.ELANOUS_REMOTE_CODEX_ACCOUNTS;
5316
+ let ownerMirrorAccounts: import('./task-orchestrator/surfaces/pod-account-broker.js').OwnerCodexMirrorAccount[] | undefined;
5317
+ if (ownerMirrorRaw !== undefined) {
5318
+ try { ownerMirrorAccounts = (await import('./task-orchestrator/surfaces/pod-account-broker.js')).parseOwnerCodexMirrorAccounts(ownerMirrorRaw); }
5319
+ catch { ui.error('pod: HQ Codex 미러 계정 목록이 유효하지 않다'); process.exit(2); }
5320
+ const { freshOwnerCodexMirrorAccounts } = await import('./task-orchestrator/surfaces/pod-account-broker.js');
5321
+ const fresh = freshOwnerCodexMirrorAccounts(ownerMirrorAccounts);
5322
+ for (const { account } of ownerMirrorAccounts.filter(({ account }) => !fresh.some((item) => item.account === account))) {
5323
+ debug.log('self-implement.pod', 'owner-access-mirror-excluded', { account, reason: 'access-expiring' });
5324
+ }
5325
+ ownerMirrorAccounts = fresh;
5326
+ if (fresh.length === 0) { ui.error('pod: HQ Codex 미러 access token 이 모두 3시간 안에 만료된다'); process.exit(2); }
5327
+ }
5328
+ const ownerMirrorAccount = ownerMirrorAccounts?.[0]?.account ?? process.env.ELANOUS_REMOTE_CODEX_ACCOUNT?.trim();
5050
5329
  const childProvider = opts as { childLlmProvider?: string };
5051
5330
  const requestedChildProvider = childProvider.childLlmProvider?.trim();
5052
- if (ownerMirrorAccount && explicitPodAccount && explicitPodAccount !== ownerMirrorAccount) {
5053
- ui.error(`pod: HQ 미러 계정은 ${ownerMirrorAccount} 인데 --pod-account ${explicitPodAccount} 을 사용할 수 없다`);
5331
+ if (ownerMirrorAccount && explicitPodAccount && !(ownerMirrorAccounts?.some(({ account }) => account === explicitPodAccount) ?? explicitPodAccount === ownerMirrorAccount)) {
5332
+ ui.error(`pod: HQ 미러 계정 목록에 --pod-account ${explicitPodAccount} 이 없다`);
5054
5333
  process.exit(2);
5055
5334
  }
5056
5335
  if (ownerMirrorAccount && requestedChildProvider && requestedChildProvider !== 'openai-codex') {
@@ -5101,7 +5380,7 @@ const selfOrchestrateCmd = selfCmd
5101
5380
  ? 'pod: --child-llm-model/--child-llm-effort 는 --child-llm-provider 와 함께'
5102
5381
  : named && benchArms
5103
5382
  ? 'pod: --child-llm-provider 는 --bench-arms 와 함께 못 쓴다(팔마다 모델이 하나다)'
5104
- : (named === 'grok' || named === 'openrouter' || named === 'anthropic' || named === 'bedrock' || named === 'glm') && explicitPodAccount
5383
+ : (named === 'grok' || named === 'openrouter' || named === 'opengateway' || named === 'anthropic' || named === 'bedrock' || named === 'glm') && explicitPodAccount
5105
5384
  ? `pod: --child-llm-provider ${named} 은 --pod-account 와 함께 못 쓴다(그것은 codex 계정을 고정한다)`
5106
5385
  : undefined;
5107
5386
  if (refuse) { ui.error(refuse); debug.log('self-implement.pod', 'child-provider-refused', { provider: named ?? null, reason: refuse }); process.exit(2); }
@@ -5163,19 +5442,27 @@ const selfOrchestrateCmd = selfCmd
5163
5442
  if (namedChild === 'openrouter' && !openrouterKeyPresent) {
5164
5443
  try { openrouterKeyPresent = Boolean(readPodKeyFile(podJoin(podHome(), '.cache', 'openrouter_api_key'), 'utf8').trim()); } catch { /* missing host cache */ }
5165
5444
  }
5445
+ const openGatewayKeyPresent = namedChild === 'opengateway' && Boolean(
5446
+ (await import('./config.js')).getOpenGatewayApiKey()?.trim()
5447
+ || configuredOpenGatewayKeys(getUserConfig().llm).length);
5166
5448
  // POD-ANTHROPIC-PROVIDER — 제품 자격 해석(`getAnthropicApiKey` · 키 캐시 → env)으로 «있나»만 본다(값은 안 싣는다).
5167
5449
  const anthropicKeyPresent = namedChild === 'anthropic' && Boolean((await import('./config.js')).getAnthropicApiKey()?.trim());
5168
5450
  const namedChildDecision = podNamedChildProvider(namedChild, {
5169
5451
  grokSubscription: namedChild === 'grok' && credential?.kind === 'subscription' && (grokSubscriptionUsable || namedGrokUsable().usable),
5170
5452
  grokApiKey: credential?.kind === 'api_key' && grokApiKeyOptIn,
5171
5453
  openrouterKey: openrouterKeyPresent,
5454
+ openGatewayKey: openGatewayKeyPresent,
5172
5455
  anthropicKey: anthropicKeyPresent,
5173
5456
  }, (opts as { childLlmModel?: string }).childLlmModel);
5174
5457
  if (namedChildDecision.refuse) { ui.error(namedChildDecision.refuse); debug.log('self-implement.pod', 'child-provider-refused', { provider: namedChild, reason: namedChildDecision.refuse }); process.exit(2); }
5175
5458
  // A named codex child must stay codex — the plan may not fall back to grok (post-review must-fix).
5176
5459
  const namedCodex = namedChildDecision.provider === 'openai-codex';
5177
5460
  let planCandidates = inspectCodexRotation().candidates;
5178
- if (ownerMirrorAccount) {
5461
+ if (ownerMirrorAccounts) {
5462
+ const { selectOwnerCodexMirrorCandidates } = await import('./task-orchestrator/surfaces/pod-account-broker.js');
5463
+ try { planCandidates = selectOwnerCodexMirrorCandidates(planCandidates, ownerMirrorAccounts); }
5464
+ catch { ui.error('pod: HQ Codex 미러 계정 일부가 원격 auth-store 후보에 없다'); process.exit(2); }
5465
+ } else if (ownerMirrorAccount) {
5179
5466
  const used = process.env.ELANOUS_REMOTE_CODEX_USED_PERCENT;
5180
5467
  const parsedUsed = used && used !== 'unknown' ? Number(used) : undefined;
5181
5468
  const threshold = Number(process.env.ELANOUS_REMOTE_CODEX_THRESHOLD_PERCENT);
@@ -5187,12 +5474,14 @@ const selfOrchestrateCmd = selfCmd
5187
5474
  planCandidates = ownerCodexMirrorCandidate(planCandidates, ownerMirrorAccount, parsedUsed !== undefined && Number.isFinite(parsedUsed) ? parsedUsed : undefined);
5188
5475
  if (planCandidates.length === 0) { ui.error(`pod: HQ Codex 미러 계정 ${ownerMirrorAccount} 이 원격 auth-store 후보에 없다`); process.exit(2); }
5189
5476
  }
5190
- const plan: import('./task-orchestrator/surfaces/pod-account-broker.js').PodProviderPlan | null = namedChildDecision.provider === 'openrouter' || namedChildDecision.provider === 'anthropic' || namedChildDecision.provider === 'bedrock' || namedChildDecision.provider === 'glm' ? null : namedChildDecision.provider === 'grok'
5477
+ const plan: import('./task-orchestrator/surfaces/pod-account-broker.js').PodProviderPlan | null = namedChildDecision.provider === 'openrouter' || namedChildDecision.provider === 'opengateway' || namedChildDecision.provider === 'anthropic' || namedChildDecision.provider === 'bedrock' || namedChildDecision.provider === 'glm' ? null : namedChildDecision.provider === 'grok'
5191
5478
  ? { provider: 'grok', excluded: [], grokSubscriptionEligible: credential?.kind === 'subscription' }
5192
5479
  : planPodProvider({
5193
5480
  codexCandidates: planCandidates,
5194
5481
  // Per-account caps (대표 default:97) override the Pod default cap — without them default was dropped at 60%.
5195
- thresholdPercentByAccount: ownerMirrorAccount
5482
+ thresholdPercentByAccount: ownerMirrorAccounts
5483
+ ? Object.fromEntries(ownerMirrorAccounts.map(({ account, thresholdPercent }) => [account, thresholdPercent]))
5484
+ : ownerMirrorAccount
5196
5485
  ? { [ownerMirrorAccount]: Number(process.env.ELANOUS_REMOTE_CODEX_THRESHOLD_PERCENT) }
5197
5486
  : launchPolicy.llm?.codexAccountRotationThresholdPercentByAccount,
5198
5487
  // 대표 한도 정책 한 값(`llm.codexQuotaPolicy`) — 크레딧·폴백을 같이 정한다.
@@ -5213,7 +5502,7 @@ const selfOrchestrateCmd = selfCmd
5213
5502
  })() } : {}),
5214
5503
  });
5215
5504
  if (plan?.provider === null) { ui.error(`pod: 쓸 codex 계정이 없다 — ${plan.reasons.join(' · ')}${namedCodex ? ' · child provider 를 openai-codex 로 지정해 grok 으로 넘기지 않는다' : ''} · 계정을 명시하려면 --pod-account <이름>`); process.exit(2); }
5216
- podProvider = namedChildDecision.provider === 'openrouter' || namedChildDecision.provider === 'anthropic' || namedChildDecision.provider === 'bedrock' || namedChildDecision.provider === 'glm' ? namedChildDecision.provider : plan!.provider!;
5505
+ podProvider = namedChildDecision.provider === 'openrouter' || namedChildDecision.provider === 'opengateway' || namedChildDecision.provider === 'anthropic' || namedChildDecision.provider === 'bedrock' || namedChildDecision.provider === 'glm' ? namedChildDecision.provider : plan!.provider!;
5217
5506
  if (plan?.provider === 'openai-codex') {
5218
5507
  accountBroker = makePodAccountBroker({ usable: plan.accounts, excluded: plan.excluded });
5219
5508
  rotationAccounts = plan.accounts;
@@ -5226,6 +5515,10 @@ const selfOrchestrateCmd = selfCmd
5226
5515
  const model = (opts as { childLlmModel?: string }).childLlmModel!.trim();
5227
5516
  debug.log('self-implement.pod', 'provider-named', { provider: 'openrouter', model, openrouterKeyPresent: true });
5228
5517
  if (!opts.json) ui.info(`[pod] child provider = openrouter(모델 ${model}) — 발사 인자로 지정됨`);
5518
+ } else if (namedChildDecision.provider === 'opengateway') {
5519
+ const model = (opts as { childLlmModel?: string }).childLlmModel!.trim();
5520
+ debug.log('self-implement.pod', 'provider-named', { provider: 'opengateway', model, openGatewayKeyPresent: true, billing: 'api-key' });
5521
+ if (!opts.json) ui.info(`[pod] child provider = opengateway(모델 ${model}) — 발사 인자로 지정됨 · API 키 과금`);
5229
5522
  } else if (namedChildDecision.provider === 'anthropic') {
5230
5523
  const model = (opts as { childLlmModel?: string }).childLlmModel?.trim() || null;
5231
5524
  // ⓔ 과금 관측 — anthropic 은 API 키 과금(구독 아님). 새 예산 체계는 없다 · 관측 한 줄만.
@@ -5254,7 +5547,7 @@ const selfOrchestrateCmd = selfCmd
5254
5547
  if (!opts.json) ui.info(`[pod] 쓸 codex 계정 없음(${plan.excluded.map((x) => `${x.name}: ${x.why}`).join(' · ')}) → grok 으로(모델 ${model})`);
5255
5548
  }
5256
5549
  }
5257
- const passEnv = podProvider === 'grok' ? requestedPassEnv.filter((key) => !grokKeyNames.includes(key)) : podProvider === 'openrouter' ? [...new Set([...requestedPassEnv, 'OPENROUTER_API_KEY'])] : podProvider === 'anthropic' ? [...new Set([...requestedPassEnv, 'ANTHROPIC_API_KEY'])] : requestedPassEnv;
5550
+ const passEnv = podProvider === 'grok' ? requestedPassEnv.filter((key) => !grokKeyNames.includes(key)) : podProvider === 'openrouter' ? [...new Set([...requestedPassEnv, 'OPENROUTER_API_KEY'])] : podProvider === 'opengateway' ? [...new Set([...requestedPassEnv, 'OPENGATEWAY_API_KEY'])] : podProvider === 'anthropic' ? [...new Set([...requestedPassEnv, 'ANTHROPIC_API_KEY'])] : requestedPassEnv;
5258
5551
  const podSourceSpec = (opts as { podSource?: string }).podSource;
5259
5552
  const repairBaseHead = (opts as { repairCommitOnly?: string }).repairCommitOnly;
5260
5553
  if (repairBaseHead && (!/^pr:[1-9]\d*$/.test(podSourceSpec ?? '') || !/^[0-9a-f]{40}$/.test(repairBaseHead) || opts.autoMerge || opts.openPr || goalTexts.length !== 1)) {
@@ -5563,7 +5856,7 @@ selfCmd
5563
5856
  .action(async (space: string | undefined, opts: { stop?: boolean; memo?: string; run?: string; includeStale?: boolean; readWait?: string }) => {
5564
5857
  const { classifyRunScreenMissing, queryRunScreenKey, listRunLedgers } = await import('./self-implement/run-ledger.js');
5565
5858
  const { getPtyManifest, listPtyManifestRows } = await import('./pty-shell/pty-manifest.js');
5566
- const { readPodFragment, podFragmentFinished, listPodFragmentsForRun, dispatchPodSelfSend } = await import('./harness/self-send-target.js');
5859
+ const { readPodFragment, podFragmentFinished, listPodFragmentsForRun, dispatchPodSelfSend, resolveSelfSendTarget } = await import('./harness/self-send-target.js');
5567
5860
  const { listHarnessScreens, readHarnessHeartbeat } = await import('./harness/harness-screen.js');
5568
5861
  const decision = decideSelfSend({ space, opts, now: Date.now() }, {
5569
5862
  resolveRunScreen: (runId) => {
@@ -5892,7 +6185,7 @@ selfCmd
5892
6185
  .option('--acp', '⭐ ACP(독립 프로세스)로 리뷰 — API 대신 선택한 ACP 백엔드로 독립 리뷰')
5893
6186
  .option('--acp-model <alias>', 'ACP 모델 tier (지정 시 고정, 생략 시 선택한 백엔드 기본값)')
5894
6187
  .option('--acp-backend <id>', 'ACP 백엔드 id (기본: 설정 acp.reviewBackend, 없으면 공유 기본값)')
5895
- .option('--acp-timeout <sec>', 'ACP 리뷰 1턴 최대 대기 초(초과 시 cancel·기본 300)', '300')
6188
+ .option('--acp-timeout <sec>', 'ACP 리뷰 1턴 최대 대기 초(초과 시 cancel·기본 claude 600 · 그 외 300)')
5896
6189
  .option('--context <path>', '리뷰어가 함께 판단할 레포 상대 파일 경로(반복 가능)', (value: string, previous: string[] = []) => [...previous, value])
5897
6190
  .option('--context-text <text>', '리뷰어가 함께 판단할 텍스트(반복 가능)', (value: string, previous: string[] = []) => [...previous, value])
5898
6191
  .option('--json', '구조화 출력 {pr, verdict, mustFix, shouldFix, reviewed}')
@@ -5908,10 +6201,10 @@ selfCmd
5908
6201
  const { spawnSync } = await import('node:child_process');
5909
6202
  const { reviewPullRequest, renderReview } = await import('./agent-substrate/pr-reviewer.js');
5910
6203
  const { createRepositoryReferencedFileReader } = await import('./self-implement/goal-file-reader.js');
5911
- const { streamLLM, getProvider } = await import('./llm.js');
6204
+ const { streamLLM, getProvider, getProviderForConfig } = await import('./llm.js');
5912
6205
  const { registerStandaloneLogSink } = await import('./domains/standalone-log-sink.js');
5913
6206
  const { debug } = await import('./debug/log.js');
5914
- const { runSelfReviewCliCommand, reviewerContextArgs, selfReviewJsonLine } = await import('./agent-substrate/self-review-cli.js');
6207
+ const { apiReviewModelFromRoleSpec, runSelfReviewCliCommand, reviewerContextArgs, selfReviewJsonLine } = await import('./agent-substrate/self-review-cli.js');
5915
6208
  const { subscriptionReviewerAvailability } = await import('./self-dev/review-provider-fallback.js');
5916
6209
  const { makeLazyAcpReviewLLM: makeRoleAcpReviewLLM } = await import('./agent-substrate/acp-reviewer.js');
5917
6210
  const { getOpenRouterApiKey: getOpenRouterApiKeyForReview } = await import('./config.js');
@@ -5922,8 +6215,12 @@ selfCmd
5922
6215
  // The seam decides whether it applies (only without an explicit reviewer flag).
5923
6216
  const { loadLlmPolicy, resolveSubscriptionReviewer } = await import('./policy/llm-policy.js');
5924
6217
  const roleReviewerSelection = resolveSubscriptionReviewer(loadLlmPolicy(), getUserConfig().roleLlm);
6218
+ const reviewRoleSpec = getUserConfig().roleLlm?.review;
6219
+ const configuredReviewModel = apiReviewModelFromRoleSpec(reviewRoleSpec);
5925
6220
  const { results, failed } = await runSelfReviewCliCommand(prArgs, {
5926
6221
  ...opts,
6222
+ ...(configuredReviewModel ? { configuredReviewModel } : {}),
6223
+ ...(configuredReviewModel && reviewRoleSpec?.provider ? { configuredReviewProvider: reviewRoleSpec.provider } : {}),
5927
6224
  ...(configuredAcpBackend ? { configuredAcpBackend } : {}),
5928
6225
  ...(roleReviewerSelection ? { roleReviewer: roleReviewerSelection.spec } : {}),
5929
6226
  ...(contextOrder.length > 0 ? { contextOrder } : {}),
@@ -5947,15 +6244,29 @@ selfCmd
5947
6244
  // 명시 `--model` 이면 provider 를 그 모델의 것으로 «고정»한다 — 라우터 폴백(grok 등)으로 조용히 넘어가지 않고 오류로 낸다.
5948
6245
  makeApiLlm: (model, o) => {
5949
6246
  const effort = reviewReasoningEffort(resolveRoleLlm('review'));
5950
- return (prompt: string) =>
5951
- streamLLM([{ role: 'user', content: prompt }], () => {}, {
6247
+ return (prompt: string) => {
6248
+ let configuredProvider;
6249
+ if (o?.providerName) {
6250
+ try {
6251
+ const config = getUserConfig();
6252
+ configuredProvider = getProviderForConfig({ ...config, llm: { ...config.llm, provider: o.providerName } }, model);
6253
+ } catch (error) {
6254
+ debug.log('self-review', 'role-review-config-provider-error', {
6255
+ provider: o.providerName, model, source: 'roleLlm.review',
6256
+ reason: error instanceof Error ? error.message : String(error),
6257
+ }, { level: 'error' });
6258
+ throw error;
6259
+ }
6260
+ }
6261
+ return streamLLM([{ role: 'user', content: prompt }], () => {}, {
5952
6262
  model,
5953
6263
  // ⛔ 어댑터 기본 2048 은 리뷰 응답을 자른다(VERDICT/MUST-FIX 줄이 잘리면 reviewed=false 로 접힌다).
5954
6264
  maxTokens: 16_000,
5955
- ...(o?.pinProvider ? { provider: getProvider(model) } : {}),
6265
+ ...(configuredProvider ? { provider: configuredProvider } : o?.pinProvider ? { provider: getProvider(model) } : {}),
5956
6266
  ...(o?.onResolved ? { onResolvedProvider: o.onResolved } : {}),
5957
6267
  ...(effort ? { reasoningEffort: effort } : {}),
5958
6268
  });
6269
+ };
5959
6270
  },
5960
6271
  makeAcpLlm: (o) => {
5961
6272
  // ⚠️ 동기 팩토리라 여기서 동적 import 를 쓸 수 없다 — 지연 로드해 첫 호출에 붙인다.
@@ -6508,7 +6819,8 @@ program.command('env').description('환경 감지')
6508
6819
  // src/agent-mission/·관측 카테고리 agent-mission·U1 핸드오프 용어와 정합) — 최상위 `agent`(single-turn
6509
6820
  // chat-with-tools)가 이미 점유해 충돌하므로 그 이름은 못 쓴다. 기존 cron/스크립트(`elanous codex review-watch`
6510
6821
  // 등)는 commander alias 로 그대로 resolvable(하위호환 불변). 상태경로 codex-mission 은 별도로 보존(아래 락/DB).
6511
- const agentBackendHelpNames = agentBackendNames();
6822
+ const agentBackendHelpNames = INDEX_FAST_ROOT ? []
6823
+ : (require('./agent-mission/driver.js') as typeof import('./agent-mission/driver.js')).agentBackendNames();
6512
6824
  const agentBackendHelpList = agentBackendHelpNames.map((name, index) => index === 0 ? `${name}[디폴트]` : name).join('·');
6513
6825
  const agentCmd = program
6514
6826
  .command('agent-mission')
@@ -6896,7 +7208,7 @@ agentCmd
6896
7208
  let initialReviewer: ((pr: string) => Promise<{ verdict: import('./agent-mission/review-loop.js').ReviewVerdict; asks: string[] } | null>) | undefined;
6897
7209
  if (opts.autoInitialReview === true && opts.dryRun !== true) {
6898
7210
  const { reviewDiffBudgetObservation, reviewPullRequest } = await import('./agent-substrate/pr-reviewer.js');
6899
- const { makeAcpReviewLLM } = await import('./agent-substrate/acp-reviewer.js');
7211
+ const { makeAcpReviewLLM, DEFAULT_REVIEW_BACKEND } = await import('./agent-substrate/acp-reviewer.js');
6900
7212
  const { mapReviewToInjected } = await import('./agent-mission/pr-review-watch.js');
6901
7213
  const { execFileSync } = await import('node:child_process');
6902
7214
  const { lookupPrGoalAcceptance } = await import('./self-implement/run-ledger.js');
@@ -6958,6 +7270,7 @@ agentCmd
6958
7270
  .command('setup')
6959
7271
  .description('One command: OAuth / API-key auth + model picker + save config')
6960
7272
  .action(async () => {
7273
+ const { realIO } = await import('./onboarding.js');
6961
7274
  const io = realIO();
6962
7275
  try {
6963
7276
  await runCodexSetup({ io });
@@ -7758,7 +8071,7 @@ const selfDevCmd = program
7758
8071
  humanReadableOutput: !opts.json,
7759
8072
  gitResidueSnapshot: { path: gitResiduePath, observation: gitResidue },
7760
8073
  }, {
7761
- runChatTurn: (text, chat) => runChatTurnCli({
8074
+ runChatTurn: async (text, chat) => (await import('./cli/agent-cli.js')).runChatTurnCli({
7762
8075
  cfg: reloadUserConfig(),
7763
8076
  userText: text,
7764
8077
  explicitSessionId: chat.session,
@@ -8306,7 +8619,7 @@ program
8306
8619
  return;
8307
8620
  }
8308
8621
  const cfg = reloadUserConfig();
8309
- await runChatTurnCli({
8622
+ await (await import('./cli/agent-cli.js')).runChatTurnCli({
8310
8623
  cfg,
8311
8624
  userText: parts.join(' '),
8312
8625
  explicitSessionId: opts.session,
@@ -8426,6 +8739,7 @@ program
8426
8739
  .option('--config <path>', 'Load answers from a JSON answer file (overrides interactive prompts)')
8427
8740
  .option('--non-interactive', 'Run without prompts — resolve all answers from --config + env vars')
8428
8741
  .action(async (step: string | undefined, opts: { config?: string; nonInteractive?: boolean }) => {
8742
+ const { runOnboarding, runOnboardingStep, runOnboardingNonInteractive } = await import('./onboarding.js');
8429
8743
  // C-4e (cleanup ROADMAP 2026-05-08) restricted `elanous setup <step>`
8430
8744
  // to llm/skills/obsidian. Telegram/Discord setup migrated to NEXUS
8431
8745
  // — `elanous channel-setup --platform telegram|discord` (Track Q).
@@ -8699,7 +9013,8 @@ sessionCmd
8699
9013
  sessionCmd
8700
9014
  .command('new')
8701
9015
  .description('Create a fresh session and mark it active')
8702
- .action(() => {
9016
+ .action(async () => {
9017
+ const { ensureCliSession } = await import('./session/chat.js');
8703
9018
  const cfg = getUserConfig();
8704
9019
  const s = ensureCliSession(cfg);
8705
9020
  setActiveSessionId(s.id);
@@ -8728,7 +9043,8 @@ sessionCmd
8728
9043
  .command('show [prefix]')
8729
9044
  .description('Print the messages of a session (default: active)')
8730
9045
  .option('--include-tools', 'Include tool-call telemetry (role:tool · 실제 호출 도구·args·result 추적)')
8731
- .action((prefix: string | undefined, opts: { includeTools?: boolean }) => {
9046
+ .action(async (prefix: string | undefined, opts: { includeTools?: boolean }) => {
9047
+ const { sessionBudget } = await import('./session/chat.js');
8732
9048
  const id = prefix ? resolveSessionId(prefix) : getActiveSessionId();
8733
9049
  if (!id) { ui.error('no session'); process.exit(1); }
8734
9050
  const loaded = loadSession(id);
@@ -9147,6 +9463,7 @@ async function runFirstSetupForCli(cfg: ReturnType<typeof getUserConfig>, announ
9147
9463
  }
9148
9464
 
9149
9465
  async function runOnboardingForCli(): Promise<boolean> {
9466
+ const { runOnboarding, handleOnboardingRefusal } = await import('./onboarding.js');
9150
9467
  try {
9151
9468
  await runOnboarding();
9152
9469
  return true;
@@ -9191,7 +9508,7 @@ program
9191
9508
  }
9192
9509
  if (opts.tools) announceChatToolsCompatibility();
9193
9510
  const cfg = getUserConfig();
9194
- if (await firstChatGate(cfg, {
9511
+ if (await (await import('./onboarding/first-chat-gate.js')).firstChatGate(cfg, {
9195
9512
  isTTY: process.stdin.isTTY === true,
9196
9513
  runFirstRun: async (deps) => (await import('./onboarding/first-run.js')).runFirstRun(deps),
9197
9514
  runInteractive: () => {
@@ -9222,7 +9539,7 @@ program
9222
9539
  // 단일 턴 엔진(runChatTurnCli)은 cfg-바인딩 클로저로 주입(순환 회피). opts→DevChatOpts 매핑은 seam.
9223
9540
  const { runChatCliCommand } = await import('./chat/chat-cli.js');
9224
9541
  await runChatCliCommand(parts.join(' '), opts, {
9225
- runChatTurn: (text, chat) => runChatTurnCli({
9542
+ runChatTurn: async (text, chat) => (await import('./cli/agent-cli.js')).runChatTurnCli({
9226
9543
  cfg: refreshed,
9227
9544
  userText: text,
9228
9545
  explicitSessionId: chat.session,
@@ -9267,7 +9584,7 @@ program
9267
9584
  process.exit(2);
9268
9585
  }
9269
9586
  const cfg = getUserConfig();
9270
- if (needsOnboarding(cfg)) {
9587
+ if ((await import('./onboarding.js')).needsOnboarding(cfg)) {
9271
9588
  if (cfg.onboarding.webFirst === false) ui.info('No config yet — launching setup wizard first.');
9272
9589
  if (!await runFirstSetupForCli(cfg, true)) return;
9273
9590
  }
@@ -11613,6 +11930,7 @@ function writeSyncFailure(message: string): void {
11613
11930
  }
11614
11931
 
11615
11932
  async function runSyncFlow(fromDashboard: boolean): Promise<void> {
11933
+ const { showSyncSelector, showSyncProgress } = await import('./selector.js');
11616
11934
  let result: Awaited<ReturnType<typeof showSyncSelector>>;
11617
11935
  try {
11618
11936
  result = await showSyncSelector(fromDashboard);
@@ -11778,6 +12096,15 @@ async function main(): Promise<void> {
11778
12096
 
11779
12097
  let rawArgs = process.argv.slice(2);
11780
12098
 
12099
+ // The root flag can follow other launch options, but never a subcommand.
12100
+ const rootTui = extractRootTuiEntry(rawArgs);
12101
+ if (rootTui.error) {
12102
+ console.error(rootTui.error);
12103
+ process.exitCode = 1;
12104
+ return;
12105
+ }
12106
+ rawArgs = rootTui.args;
12107
+
11781
12108
  rawArgs = rewriteBareNexusToStatus({ rawArgs });
11782
12109
 
11783
12110
  // A leading --rich was a dashboard launch flag. The dashboard no longer
@@ -11921,6 +12248,9 @@ async function main(): Promise<void> {
11921
12248
  const resolved = await resolveRemoteTarget({});
11922
12249
  if (resolved) remote = resolved;
11923
12250
  }
12251
+ // Bare entry is classic. The next TUI has no remote transport yet;
12252
+ // an explicit --tui next still reports the unsupported combination below.
12253
+ const tuiEntry = effectiveRootTuiEntry(rootTui, Boolean(remote));
11924
12254
 
11925
12255
  // Root dashboard resume accepts `--resume`. Only a
11926
12256
  // leading launch flag is owned here: a subcommand's `-r` stays
@@ -11985,8 +12315,13 @@ async function main(): Promise<void> {
11985
12315
  // (e.g. `session watch --debug`), stripping them here would silently
11986
12316
  // eat that subcommand's own option before commander ever sees it.
11987
12317
  const args = filterDashboardArgs(rawArgs, resumeFlagIdx);
12318
+ if (tuiEntry === 'next' && rootTui.explicit && args.length > 0) {
12319
+ console.error('elanous: --tui next is a standalone TUI entry, not a subcommand option');
12320
+ process.exitCode = 1;
12321
+ return;
12322
+ }
11988
12323
 
11989
- // Bare `elanous` (no subcommand) → the dashboard, always. The former
12324
+ // Bare `elanous` (no subcommand) → classic dashboard; next TUI only via `--tui next`. The former
11990
12325
  // `global.entry.defaultMode` switch (which could route here to the
11991
12326
  // headless NEXUS daemon) was removed 2026-07-24: T3/T4 deleted the
11992
12327
  // NEXUS interactive TUI, so every non-dashboard route was a dead-end
@@ -12048,7 +12383,7 @@ async function main(): Promise<void> {
12048
12383
  // Bare entry only requires an LLM; detailed setup stays behind `eln setup`.
12049
12384
  const firstRunStartedAt = Date.now();
12050
12385
  const cfg = getUserConfig();
12051
- if (needsFirstRun(cfg)) {
12386
+ if ((await import('./onboarding.js')).needsFirstRun(cfg)) {
12052
12387
  if (cfg.onboarding.webFirst !== false) {
12053
12388
  const { runWebFirstSetup } = await import('./onboarding/web-first.js');
12054
12389
  if (await runWebFirstSetup({ config: cfg, startedAt: firstRunStartedAt, startIfMissing: false }) === 'link-shown') return;
@@ -12125,14 +12460,32 @@ async function main(): Promise<void> {
12125
12460
  }
12126
12461
  }
12127
12462
  bootTimer.begin();
12128
- await showDashboard({
12129
- ...dashboardOpts,
12130
- onFirstFrameRendered: () => {
12131
- bootTimer.phase('show-dashboard');
12132
- bootTimer.done();
12133
- },
12134
- });
12135
- closeTui();
12463
+ if (tuiEntry === 'next') {
12464
+ if (remote) {
12465
+ console.error('elanous: --tui next currently reads local sessions only; drop it (classic is the default) for remote attach');
12466
+ process.exitCode = 1;
12467
+ return;
12468
+ }
12469
+ if ((process.stdout.columns || 0) < 20 || (process.stdout.rows || 0) < 6) {
12470
+ console.error('elanous: --tui next requires at least 20 columns and 6 rows');
12471
+ process.exitCode = 1;
12472
+ return;
12473
+ }
12474
+ const { showNextTui } = await import('./tui/entry.js');
12475
+ await showNextTui({ resumeSessionId });
12476
+ bootTimer.phase('show-next');
12477
+ bootTimer.done();
12478
+ } else {
12479
+ const { showDashboard } = await import('./dashboard/index.js');
12480
+ await showDashboard({
12481
+ ...dashboardOpts,
12482
+ onFirstFrameRendered: () => {
12483
+ bootTimer.phase('show-dashboard');
12484
+ bootTimer.done();
12485
+ },
12486
+ });
12487
+ closeTui();
12488
+ }
12136
12489
  // Force exit: the dashboard starts background timers (clipboard
12137
12490
  // poller, shimmer/blink animations) that keep the Bun event loop
12138
12491
  // alive even after the TUI tears down. Without this hard exit,