elanous 0.2.24 → 0.2.27

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 (601) 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/{Q-7iofoxOEv1WX18S35of → Ev2jivDMTSoEc-5rIXdcy}/_buildManifest.js +1 -1
  4. package/apps/pwa/out/_next/static/chunks/1027.a0f04663d24c2779.js +1 -0
  5. package/apps/pwa/out/_next/static/chunks/1038.676007ae505822e7.js +1 -0
  6. package/apps/pwa/out/_next/static/chunks/1113.a37eadf7f740d955.js +1 -0
  7. package/apps/pwa/out/_next/static/chunks/112-fa7c526c20ce1405.js +1 -0
  8. package/apps/pwa/out/_next/static/chunks/1144.5fa1fa1d48dbcd12.js +36 -0
  9. package/apps/pwa/out/_next/static/chunks/1146.80d15ea7c6e6ee95.js +1 -0
  10. package/apps/pwa/out/_next/static/chunks/1157.f08bf2b70915e176.js +148 -0
  11. package/apps/pwa/out/_next/static/chunks/119b405e.8fdd0e44d1ff37aa.js +1 -0
  12. package/apps/pwa/out/_next/static/chunks/1296.04560d98e73fbf51.js +1 -0
  13. package/apps/pwa/out/_next/static/chunks/1314-f604ba013ec535b0.js +1 -0
  14. package/apps/pwa/out/_next/static/chunks/1454-a9c338f5bb556f42.js +1 -0
  15. package/apps/pwa/out/_next/static/chunks/1464.f3209af0d8ae4ff2.js +1 -0
  16. package/apps/pwa/out/_next/static/chunks/{8532.a86e99acf9b761cb.js → 1516.83dd2c1b86b4e507.js} +2 -2
  17. package/apps/pwa/out/_next/static/chunks/{89849432.9eaa2f4c9c010965.js → 16e57f67.3ea19e893461e611.js} +3 -3
  18. package/apps/pwa/out/_next/static/chunks/1729-d73dd25e564679d4.js +1 -0
  19. package/apps/pwa/out/_next/static/chunks/{1505.5826671109111e75.js → 1743.563d3168e95825ef.js} +2 -2
  20. package/apps/pwa/out/_next/static/chunks/1843.5924c24295243261.js +27 -0
  21. package/apps/pwa/out/_next/static/chunks/1987.e28149724b92918b.js +1 -0
  22. package/apps/pwa/out/_next/static/chunks/2066-5ca18ffa5a4be68b.js +1 -0
  23. package/apps/pwa/out/_next/static/chunks/2240.d10a66695155fd93.js +1 -0
  24. package/apps/pwa/out/_next/static/chunks/2391.e2cbc98d4abbb41a.js +1 -0
  25. package/apps/pwa/out/_next/static/chunks/2528.3868070ef1be69f9.js +24 -0
  26. package/apps/pwa/out/_next/static/chunks/2566-734cb83bbd405886.js +1 -0
  27. package/apps/pwa/out/_next/static/chunks/2697.76ca2ac3efef6f3b.js +1 -0
  28. package/apps/pwa/out/_next/static/chunks/275.0e6bad414729bfa0.js +32 -0
  29. package/apps/pwa/out/_next/static/chunks/2803-33bdae771855a8d1.js +1 -0
  30. package/apps/pwa/out/_next/static/chunks/2846.d6a433b8663819a5.js +309 -0
  31. package/apps/pwa/out/_next/static/chunks/3143.257997a5f1ed79df.js +34 -0
  32. package/apps/pwa/out/_next/static/chunks/{5967-c0a80f8ffe5d4050.js → 3259-86f3be56e43eaf6a.js} +1 -1
  33. package/apps/pwa/out/_next/static/chunks/3280-e177c33bfbdcfb0a.js +1 -0
  34. package/apps/pwa/out/_next/static/chunks/3294-2b6a6d45a46a6c1c.js +1 -0
  35. package/apps/pwa/out/_next/static/chunks/3309.364573ceedbdfd5f.js +1 -0
  36. package/apps/pwa/out/_next/static/chunks/3522.758840fc5e7fe630.js +287 -0
  37. package/apps/pwa/out/_next/static/chunks/3525-a7c989c1a661e880.js +1 -0
  38. package/apps/pwa/out/_next/static/chunks/3694.b1a66387756458c0.js +1 -0
  39. package/apps/pwa/out/_next/static/chunks/370.124f9e678a76fc01.js +1 -0
  40. package/apps/pwa/out/_next/static/chunks/3797-9643105335e660fe.js +1 -0
  41. package/apps/pwa/out/_next/static/chunks/{5578.ac963634373b28c6.js → 4084.15ecaf4240bd9e77.js} +2 -2
  42. package/apps/pwa/out/_next/static/chunks/4089-b3382b8843114eee.js +1 -0
  43. package/apps/pwa/out/_next/static/chunks/{8438.ee7f0df3b3f6fcb4.js → 4204.a409ab6250c0f6a8.js} +1 -1
  44. package/apps/pwa/out/_next/static/chunks/4293.928a8d573c16aab7.js +1 -0
  45. package/apps/pwa/out/_next/static/chunks/4402.f9238a3b18a7bd43.js +1 -0
  46. package/apps/pwa/out/_next/static/chunks/4490-9b090b0f9427f902.js +1 -0
  47. package/apps/pwa/out/_next/static/chunks/4548.13502d0ca3b4f862.js +8 -0
  48. package/apps/pwa/out/_next/static/chunks/4565-67e4c620597965c8.js +1 -0
  49. package/apps/pwa/out/_next/static/chunks/{7905.b230b9d06cb4ad5d.js → 4593.10f5b9bd702d4a6c.js} +1 -1
  50. package/apps/pwa/out/_next/static/chunks/4599-548bc96cda44a5a7.js +1 -0
  51. package/apps/pwa/out/_next/static/chunks/4625.206574e33a9e7ae8.js +104 -0
  52. package/apps/pwa/out/_next/static/chunks/4862-392c9a71f0d8dfb4.js +1 -0
  53. package/apps/pwa/out/_next/static/chunks/5054.2906d1b02542edc5.js +149 -0
  54. package/apps/pwa/out/_next/static/chunks/{8569.b853a8daa8f31d12.js → 5081.a240b63fad28663a.js} +1 -1
  55. package/apps/pwa/out/_next/static/chunks/5102-c822bbbee5a022a4.js +1 -0
  56. package/apps/pwa/out/_next/static/chunks/5194-8c93f2e7e4b6f717.js +1 -0
  57. package/apps/pwa/out/_next/static/chunks/5305-bacd7eca0b9a5848.js +1 -0
  58. package/apps/pwa/out/_next/static/chunks/5311.9071ee3f44fd7ff5.js +1 -0
  59. package/apps/pwa/out/_next/static/chunks/5369.9f34353442daa421.js +1 -0
  60. package/apps/pwa/out/_next/static/chunks/{2528.0af5c0e1fad88df6.js → 5408.377c8c543635b81f.js} +1 -1
  61. package/apps/pwa/out/_next/static/chunks/{9502-32c5dc22e8f120f5.js → 5492-e05e26a033ba80d2.js} +3 -3
  62. package/apps/pwa/out/_next/static/chunks/5785-ea8d2c633b6688e3.js +1 -0
  63. package/apps/pwa/out/_next/static/chunks/589-49d730cb8138b397.js +1 -0
  64. package/apps/pwa/out/_next/static/chunks/5904-264a6412ae3c9028.js +1 -0
  65. package/apps/pwa/out/_next/static/chunks/5980.728531d5c566535c.js +1 -0
  66. package/apps/pwa/out/_next/static/chunks/599-a914cc0468f56143.js +1 -0
  67. package/apps/pwa/out/_next/static/chunks/6011.f525002e21bef0ac.js +23 -0
  68. package/apps/pwa/out/_next/static/chunks/6132.4381ab93683f1acf.js +1 -0
  69. package/apps/pwa/out/_next/static/chunks/6149.2e698635e454d8f6.js +1 -0
  70. package/apps/pwa/out/_next/static/chunks/{5974.360f8441eb0ac1ec.js → 6196.34d6b229079e9e28.js} +1 -1
  71. package/apps/pwa/out/_next/static/chunks/6356-0afafc4230cf9767.js +1 -0
  72. package/apps/pwa/out/_next/static/chunks/6406.64756073f7df35b8.js +77 -0
  73. package/apps/pwa/out/_next/static/chunks/6479-16e62aedafa0e310.js +1 -0
  74. package/apps/pwa/out/_next/static/chunks/6599.b5246b46a2453329.js +64 -0
  75. package/apps/pwa/out/_next/static/chunks/{ce383d63.d2ede338788ed18e.js → 65ebff95.081daeff622d238e.js} +1 -1
  76. package/apps/pwa/out/_next/static/chunks/6610.5c26eec011565acb.js +1 -0
  77. package/apps/pwa/out/_next/static/chunks/666.37d18474edc1c552.js +2 -0
  78. package/apps/pwa/out/_next/static/chunks/6904.a0b5b1ed4f2d2c20.js +1 -0
  79. package/apps/pwa/out/_next/static/chunks/{83cfc5c8.349535543c1548b6.js → 6def8a8e.c81f9ca41028eccf.js} +1 -1
  80. package/apps/pwa/out/_next/static/chunks/7247-1f4aba94aba50d9f.js +1 -0
  81. package/apps/pwa/out/_next/static/chunks/7274-e71a7c5b7760cd02.js +1 -0
  82. package/apps/pwa/out/_next/static/chunks/7290.1fcaeef3adb5d0d4.js +1 -0
  83. package/apps/pwa/out/_next/static/chunks/7477-2c64e42760f82f33.js +1 -0
  84. package/apps/pwa/out/_next/static/chunks/{2721.bc9a8f36bd85c07a.js → 7483.ba01c6c209b81bba.js} +1 -1
  85. package/apps/pwa/out/_next/static/chunks/7505-47002b76ff1aef6c.js +1 -0
  86. package/apps/pwa/out/_next/static/chunks/7600-11884ca4da68e5d9.js +1 -0
  87. package/apps/pwa/out/_next/static/chunks/7607.40d8bb3689697ccb.js +62 -0
  88. package/apps/pwa/out/_next/static/chunks/{6702.ebbd165d5e4a4a14.js → 7752.5cbdd0b433c54af9.js} +1 -1
  89. package/apps/pwa/out/_next/static/chunks/7763.f51fcc19ca1414ec.js +1 -0
  90. package/apps/pwa/out/_next/static/chunks/7785.846140c859b1adf6.js +1 -0
  91. package/apps/pwa/out/_next/static/chunks/7807-a0fdac6393e0bf36.js +1 -0
  92. package/apps/pwa/out/_next/static/chunks/7837-20a63b4b7e9342b1.js +1 -0
  93. package/apps/pwa/out/_next/static/chunks/800.7815414cf280545d.js +1 -0
  94. package/apps/pwa/out/_next/static/chunks/{8925-2abfb48af477fb7f.js → 8085-1e5fce59500a2cc2.js} +1 -1
  95. package/apps/pwa/out/_next/static/chunks/8100.415f2105faa63e97.js +1 -0
  96. package/apps/pwa/out/_next/static/chunks/8290.701aa42ed13aa767.js +226 -0
  97. package/apps/pwa/out/_next/static/chunks/{b4e12462-5fab4a813a63dadd.js → 83a80514-b897b64df43ce108.js} +1 -1
  98. package/apps/pwa/out/_next/static/chunks/8444.d9c74214a3145a43.js +93 -0
  99. package/apps/pwa/out/_next/static/chunks/8569.98c915534928c7f9.js +24 -0
  100. package/apps/pwa/out/_next/static/chunks/{8264.00e434fbd02e9311.js → 8578.dff22d988cc2b106.js} +3 -3
  101. package/apps/pwa/out/_next/static/chunks/8591.b1c7f876e5ec7cfb.js +1 -0
  102. package/apps/pwa/out/_next/static/chunks/8715-f63756021d3ab989.js +1 -0
  103. package/apps/pwa/out/_next/static/chunks/8879.776c2ec7732aa114.js +115 -0
  104. package/apps/pwa/out/_next/static/chunks/8881.ddca15b3c82c490c.js +1 -0
  105. package/apps/pwa/out/_next/static/chunks/8946.5da5c87f32a2e1a8.js +41 -0
  106. package/apps/pwa/out/_next/static/chunks/9117.080b9b75be90e14d.js +74 -0
  107. package/apps/pwa/out/_next/static/chunks/9167.f3ecb28f367d6e69.js +94 -0
  108. package/apps/pwa/out/_next/static/chunks/9224.66095370ee28c93b.js +1 -0
  109. package/apps/pwa/out/_next/static/chunks/9238-0682b013c83d6449.js +1 -0
  110. package/apps/pwa/out/_next/static/chunks/{7518.49161e8f5814abdb.js → 9311.24c8f5ea793253dd.js} +1 -1
  111. package/apps/pwa/out/_next/static/chunks/{9976.8f28864317639fe6.js → 94.4cfed21c0b781a06.js} +3 -3
  112. package/apps/pwa/out/_next/static/chunks/9449.d3ed795da4befb1c.js +1 -0
  113. package/apps/pwa/out/_next/static/chunks/949.1e7d45ccb71580aa.js +90 -0
  114. package/apps/pwa/out/_next/static/chunks/9638-d268329f2c6f4f8d.js +1 -0
  115. package/apps/pwa/out/_next/static/chunks/{0e3acd34.d42b2ef87fdf4234.js → 973cbf1b.3bbcf2b41548eca7.js} +1 -1
  116. package/apps/pwa/out/_next/static/chunks/9842-d6644eb53d3dc6bf.js +1 -0
  117. package/apps/pwa/out/_next/static/chunks/9863.94ca3263e760696e.js +1 -0
  118. package/apps/pwa/out/_next/static/chunks/{6571-926ddf024a6ad5df.js → 9917-9e26abc5f7772735.js} +1 -1
  119. package/apps/pwa/out/_next/static/chunks/9938.b23e4d4dfa0114cd.js +79 -0
  120. package/apps/pwa/out/_next/static/chunks/{740.90b31555290236a9.js → 9974.e77b4ff4884557b3.js} +2 -2
  121. package/apps/pwa/out/_next/static/chunks/{4c5e95ce.83e9b16add6fcd8c.js → ab4d57c2.e90bc2cb31949045.js} +7 -7
  122. package/apps/pwa/out/_next/static/chunks/app/_not-found/page-d9babd8795f396a5.js +1 -0
  123. package/apps/pwa/out/_next/static/chunks/app/approvals/page-a1ce306364f08da9.js +1 -0
  124. package/apps/pwa/out/_next/static/chunks/app/autopilot/page-07110da72c45e68f.js +1 -0
  125. package/apps/pwa/out/_next/static/chunks/app/board/page-d2d76d4a7eae91bd.js +1 -0
  126. package/apps/pwa/out/_next/static/chunks/app/botlab/page-30007380f2e2a3c1.js +1 -0
  127. package/apps/pwa/out/_next/static/chunks/app/bots/page-e5a9302c105725a3.js +1 -0
  128. package/apps/pwa/out/_next/static/chunks/app/ceo/page-b93c04b5311c97ec.js +1 -0
  129. package/apps/pwa/out/_next/static/chunks/app/chat/page-718a49e86bf25f9c.js +1 -0
  130. package/apps/pwa/out/_next/static/chunks/app/consult/page-20662900d6b4b455.js +1 -0
  131. package/apps/pwa/out/_next/static/chunks/app/control/page-f707a509515ac50c.js +1 -0
  132. package/apps/pwa/out/_next/static/chunks/app/decisions/page-6a16a48d1aa6e91f.js +1 -0
  133. package/apps/pwa/out/_next/static/chunks/app/design-check/{page-26345242e4049f55.js → page-fcb06e305f515527.js} +1 -1
  134. package/apps/pwa/out/_next/static/chunks/app/editor/page-6acf5ec4e6c6d1af.js +1 -0
  135. package/apps/pwa/out/_next/static/chunks/app/exec/page-39f82acf619cca23.js +1 -0
  136. package/apps/pwa/out/_next/static/chunks/app/field/page-7c2c8f81b185f9c0.js +1 -0
  137. package/apps/pwa/out/_next/static/chunks/app/healthz/route-d9babd8795f396a5.js +1 -0
  138. package/apps/pwa/out/_next/static/chunks/app/inside/page-ae7aff07e32676bb.js +1 -0
  139. package/apps/pwa/out/_next/static/chunks/app/intake/page-482c60c1bc540d0a.js +1 -0
  140. package/apps/pwa/out/_next/static/chunks/app/layout-7cb996c1aa08b6f5.js +1 -0
  141. package/apps/pwa/out/_next/static/chunks/app/live/page-623e08fe4477d606.js +1 -0
  142. package/apps/pwa/out/_next/static/chunks/app/live-run/page-db460cd8aecb8490.js +1 -0
  143. package/apps/pwa/out/_next/static/chunks/app/loops/page-ff27902d0b11ef4f.js +1 -0
  144. package/apps/pwa/out/_next/static/chunks/app/market/page-8397a5c6ca569bf4.js +1 -0
  145. package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-1917ea87ea71ab6b.js +1 -0
  146. package/apps/pwa/out/_next/static/chunks/app/morning/page-25a302273b054fd7.js +1 -0
  147. package/apps/pwa/out/_next/static/chunks/app/not-found-670510eda8b9443f.js +1 -0
  148. package/apps/pwa/out/_next/static/chunks/app/observatory/page-d73c3f1e00d93986.js +1 -0
  149. package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-65caacf54389081e.js +1 -0
  150. package/apps/pwa/out/_next/static/chunks/app/ops/release/page-4bb7556e2e97a750.js +1 -0
  151. package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-77e04b4f8762c666.js +1 -0
  152. package/apps/pwa/out/_next/static/chunks/app/outputs/{page-b92caddb5c715f30.js → page-15c0a4095baddfba.js} +1 -1
  153. package/apps/pwa/out/_next/static/chunks/app/page-4eb96fc7241c2456.js +1 -0
  154. package/apps/pwa/out/_next/static/chunks/app/reflection/page-63e272a4cd3b6634.js +1 -0
  155. package/apps/pwa/out/_next/static/chunks/app/scheduler/page-0d64ff212dc55d03.js +1 -0
  156. package/apps/pwa/out/_next/static/chunks/app/sessions/page-7f096248993fc2d4.js +1 -0
  157. package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-e47fc72049149a38.js +1 -0
  158. package/apps/pwa/out/_next/static/chunks/app/settings/page-f7d808e31e005895.js +1 -0
  159. package/apps/pwa/out/_next/static/chunks/app/setup/done/page-5c2b24b5496dad73.js +1 -0
  160. package/apps/pwa/out/_next/static/chunks/app/setup/layout-d9babd8795f396a5.js +1 -0
  161. package/apps/pwa/out/_next/static/chunks/app/setup/page-76cdb531668b5191.js +1 -0
  162. package/apps/pwa/out/_next/static/chunks/app/share/page-e2b63345bba1a11f.js +1 -0
  163. package/apps/pwa/out/_next/static/chunks/app/showroom/page-d376e0c83edc041a.js +1 -0
  164. package/apps/pwa/out/_next/static/chunks/app/tasks/page-d6db55fe2c04d128.js +1 -0
  165. package/apps/pwa/out/_next/static/chunks/app/term/page-87b88f551f421d8b.js +1 -0
  166. package/apps/pwa/out/_next/static/chunks/app/today/page-dab163b338e3b966.js +1 -0
  167. package/apps/pwa/out/_next/static/chunks/app/trace/page-08019efef111ed2e.js +1 -0
  168. package/apps/pwa/out/_next/static/chunks/app/vault/page-0260ffc7eda50db1.js +1 -0
  169. package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-980ce6fe36ad95eb.js +1 -0
  170. package/apps/pwa/out/_next/static/chunks/app/workflows/page-99c4e6c7345a9156.js +1 -0
  171. package/apps/pwa/out/_next/static/chunks/app/workspace/page-0ab42e0f05823013.js +1 -0
  172. package/apps/pwa/out/_next/static/chunks/app/worktrees/page-ad9220422d20ba33.js +1 -0
  173. package/apps/pwa/out/_next/static/chunks/dcf24383-2f82e35f2d827393.js +1 -0
  174. package/apps/pwa/out/_next/static/chunks/{53746282.1be36038d1abd949.js → e117f801.e92bf10242653497.js} +1 -1
  175. package/apps/pwa/out/_next/static/chunks/e87d89b9.2e71c0ae475d28a1.js +122 -0
  176. package/apps/pwa/out/_next/static/chunks/{0673cc54.8e2ef1c23e49e190.js → f4dfbfc0.a69fb12f854882aa.js} +1 -1
  177. package/apps/pwa/out/_next/static/chunks/framework-bf135b997155e90e.js +1 -0
  178. package/apps/pwa/out/_next/static/chunks/main-5571537543bea91c.js +1 -0
  179. package/apps/pwa/out/_next/static/chunks/main-app-25c51c7df7f3a442.js +1 -0
  180. package/apps/pwa/out/_next/static/chunks/pages/_app-e3b2c1f5d82abd65.js +1 -0
  181. package/apps/pwa/out/_next/static/chunks/pages/_error-083f2e23e9bc3641.js +1 -0
  182. package/apps/pwa/out/_next/static/chunks/webpack-e94d22b7a028217b.js +1 -0
  183. package/apps/pwa/out/approvals/index.html +1 -1
  184. package/apps/pwa/out/approvals/index.txt +22 -22
  185. package/apps/pwa/out/autopilot/index.html +1 -1
  186. package/apps/pwa/out/autopilot/index.txt +22 -22
  187. package/apps/pwa/out/board/index.html +1 -1
  188. package/apps/pwa/out/board/index.txt +22 -22
  189. package/apps/pwa/out/botlab/index.html +1 -1
  190. package/apps/pwa/out/botlab/index.txt +21 -21
  191. package/apps/pwa/out/bots/index.html +1 -1
  192. package/apps/pwa/out/bots/index.txt +21 -21
  193. package/apps/pwa/out/ceo/index.html +1 -1
  194. package/apps/pwa/out/ceo/index.txt +22 -22
  195. package/apps/pwa/out/chat/index.html +1 -1
  196. package/apps/pwa/out/chat/index.txt +21 -21
  197. package/apps/pwa/out/consult/index.html +1 -1
  198. package/apps/pwa/out/consult/index.txt +22 -22
  199. package/apps/pwa/out/control/index.html +1 -1
  200. package/apps/pwa/out/control/index.txt +22 -22
  201. package/apps/pwa/out/decisions/index.html +1 -1
  202. package/apps/pwa/out/decisions/index.txt +21 -21
  203. package/apps/pwa/out/design-check/index.html +1 -1
  204. package/apps/pwa/out/design-check/index.txt +22 -22
  205. package/apps/pwa/out/editor/index.html +1 -1
  206. package/apps/pwa/out/editor/index.txt +22 -22
  207. package/apps/pwa/out/exec/index.html +1 -1
  208. package/apps/pwa/out/exec/index.txt +22 -22
  209. package/apps/pwa/out/field/index.html +1 -1
  210. package/apps/pwa/out/field/index.txt +22 -22
  211. package/apps/pwa/out/healthz +1 -1
  212. package/apps/pwa/out/index.html +1 -1
  213. package/apps/pwa/out/index.txt +21 -21
  214. package/apps/pwa/out/inside/index.html +1 -1
  215. package/apps/pwa/out/inside/index.txt +21 -21
  216. package/apps/pwa/out/intake/index.html +1 -1
  217. package/apps/pwa/out/intake/index.txt +22 -22
  218. package/apps/pwa/out/live/index.html +1 -1
  219. package/apps/pwa/out/live/index.txt +22 -22
  220. package/apps/pwa/out/live-run/index.html +1 -1
  221. package/apps/pwa/out/live-run/index.txt +22 -22
  222. package/apps/pwa/out/loops/index.html +1 -1
  223. package/apps/pwa/out/loops/index.txt +21 -21
  224. package/apps/pwa/out/market/index.html +1 -1
  225. package/apps/pwa/out/market/index.txt +21 -21
  226. package/apps/pwa/out/missions/placeholder/index.html +1 -1
  227. package/apps/pwa/out/missions/placeholder/index.txt +21 -21
  228. package/apps/pwa/out/morning/index.html +1 -1
  229. package/apps/pwa/out/morning/index.txt +22 -22
  230. package/apps/pwa/out/observatory/index.html +1 -1
  231. package/apps/pwa/out/observatory/index.txt +22 -22
  232. package/apps/pwa/out/ops/checklist/index.html +1 -1
  233. package/apps/pwa/out/ops/checklist/index.txt +21 -21
  234. package/apps/pwa/out/ops/release/index.html +1 -1
  235. package/apps/pwa/out/ops/release/index.txt +21 -21
  236. package/apps/pwa/out/ops/seats/index.html +1 -1
  237. package/apps/pwa/out/ops/seats/index.txt +21 -21
  238. package/apps/pwa/out/outputs/index.html +1 -1
  239. package/apps/pwa/out/outputs/index.txt +21 -21
  240. package/apps/pwa/out/reflection/index.html +1 -1
  241. package/apps/pwa/out/reflection/index.txt +22 -22
  242. package/apps/pwa/out/scheduler/index.html +1 -1
  243. package/apps/pwa/out/scheduler/index.txt +22 -22
  244. package/apps/pwa/out/sessions/index.html +1 -1
  245. package/apps/pwa/out/sessions/index.txt +21 -21
  246. package/apps/pwa/out/settings/devices/index.html +1 -1
  247. package/apps/pwa/out/settings/devices/index.txt +22 -22
  248. package/apps/pwa/out/settings/index.html +1 -1
  249. package/apps/pwa/out/settings/index.txt +22 -22
  250. package/apps/pwa/out/setup/done/index.html +1 -1
  251. package/apps/pwa/out/setup/done/index.txt +22 -22
  252. package/apps/pwa/out/setup/index.html +1 -1
  253. package/apps/pwa/out/setup/index.txt +22 -22
  254. package/apps/pwa/out/share/index.html +1 -1
  255. package/apps/pwa/out/share/index.txt +22 -22
  256. package/apps/pwa/out/showroom/index.html +1 -1
  257. package/apps/pwa/out/showroom/index.txt +21 -21
  258. package/apps/pwa/out/tasks/index.html +1 -1
  259. package/apps/pwa/out/tasks/index.txt +22 -22
  260. package/apps/pwa/out/term/index.html +1 -1
  261. package/apps/pwa/out/term/index.txt +22 -22
  262. package/apps/pwa/out/today/index.html +1 -1
  263. package/apps/pwa/out/today/index.txt +22 -22
  264. package/apps/pwa/out/trace/index.html +1 -1
  265. package/apps/pwa/out/trace/index.txt +22 -22
  266. package/apps/pwa/out/vault/index.html +1 -1
  267. package/apps/pwa/out/vault/index.txt +22 -22
  268. package/apps/pwa/out/workflows/chat-ui/index.html +1 -1
  269. package/apps/pwa/out/workflows/chat-ui/index.txt +22 -22
  270. package/apps/pwa/out/workflows/index.html +1 -1
  271. package/apps/pwa/out/workflows/index.txt +22 -22
  272. package/apps/pwa/out/workspace/index.html +1 -1
  273. package/apps/pwa/out/workspace/index.txt +22 -22
  274. package/apps/pwa/out/worktrees/index.html +1 -1
  275. package/apps/pwa/out/worktrees/index.txt +22 -22
  276. package/graphs/release/release-loop.yaml +5 -5
  277. package/graphs/steward/recipes.yaml +4 -0
  278. package/graphs/steward/steward.yaml +10 -1
  279. package/package.json +1 -1
  280. package/scripts/bench-report.ts +46 -1
  281. package/scripts/ci-typecheck-changed.ts +88 -7
  282. package/scripts/coord-msg-bridge.ts +209 -0
  283. package/scripts/coord-post.sh +40 -7
  284. package/scripts/coord-requests-bridge.ts +10 -5
  285. package/scripts/expose-rubric-suggest.ts +1 -1
  286. package/scripts/measure-tsc-affected-roots.ts +10 -1
  287. package/scripts/release-loop/auto-approve-node.ts +6 -0
  288. package/scripts/release-loop/export-check-node.ts +8 -5
  289. package/scripts/release-loop/gate-closure.ts +286 -0
  290. package/scripts/release-loop/gate-node.ts +73 -13
  291. package/scripts/release-loop/gate-partial.ts +34 -6
  292. package/scripts/release-loop/node-verdict.ts +7 -2
  293. package/scripts/release-loop/ops-upgrade-node.ts +63 -42
  294. package/scripts/release-loop/publish-node.ts +6 -0
  295. package/scripts/release-loop/resume-release.ts +37 -10
  296. package/scripts/release-loop/resume.ts +69 -4
  297. package/scripts/tsc-baseline-cache.ts +28 -3
  298. package/scripts/usage-rollup.ts +27 -13
  299. package/scripts/ux-sim.ts +30 -1
  300. package/skills/youtube-master/scripts/main.ts +4 -1
  301. package/skills/youtube-master/src/obsidian.ts +9 -0
  302. package/src/agent/task-notification.ts +30 -1
  303. package/src/agent-substrate/acp-implementer.ts +14 -7
  304. package/src/agent-substrate/pr-reviewer.ts +30 -10
  305. package/src/agent-substrate/review-observation.ts +9 -2
  306. package/src/agent-substrate/self-review-cli.ts +154 -16
  307. package/src/boot/daemon-tools/self-implement.ts +72 -4
  308. package/src/budget/cost-tier-advisor.ts +91 -0
  309. package/src/budget/llm-cost.ts +5 -1
  310. package/src/budget/shadow-arms.ts +77 -0
  311. package/src/budget/types.ts +5 -3
  312. package/src/budget/unified-usage.ts +172 -8
  313. package/src/cli/control-cli.ts +29 -0
  314. package/src/cli/doctor-cli.ts +106 -3
  315. package/src/cli/friendly-errors.ts +113 -0
  316. package/src/cli/intake-cli.ts +3 -1
  317. package/src/cli/memory-cli.ts +182 -0
  318. package/src/cli/model-watch-cli.ts +4 -1
  319. package/src/cli/msg-cli.ts +15 -5
  320. package/src/cli/pr-cli.ts +53 -0
  321. package/src/cli/pr-land-overlap-evidence.ts +18 -10
  322. package/src/cli/pr-land-pod-shadow.ts +54 -0
  323. package/src/cli/release-cli.ts +41 -12
  324. package/src/cli/release-run-if-ready.ts +11 -0
  325. package/src/cli/resource-cli.ts +48 -0
  326. package/src/cli/retro-cli.ts +12 -3
  327. package/src/cli/seat-cli.ts +121 -0
  328. package/src/cli/seat-requests-cli.ts +25 -0
  329. package/src/cli/self-utterances-cli.ts +140 -0
  330. package/src/cli/tasks-cli.ts +168 -14
  331. package/src/cli/usage-cli.ts +3 -1
  332. package/src/compact/verify-probe.ts +23 -3
  333. package/src/context-card/cell.ts +40 -0
  334. package/src/context-card/index.ts +50 -0
  335. package/src/control/control-status.ts +30 -1
  336. package/src/dashboard/boot-timing.ts +35 -0
  337. package/src/dashboard/index.ts +86 -24
  338. package/src/dashboard/input/chat-main-plain-turn-runtime.ts +26 -0
  339. package/src/dashboard/slash-runtime/dashboard-handlers.ts +10 -138
  340. package/src/dashboard/slash-runtime/shell-slash.ts +145 -0
  341. package/src/debug/log-diet.ts +16 -4
  342. package/src/debug/log.ts +1 -1
  343. package/src/domains/morning-essential.ts +18 -3
  344. package/src/domains/release-tool.ts +29 -8
  345. package/src/domains/surface-events.ts +16 -0
  346. package/src/elanous-config-dir.ts +2 -2
  347. package/src/execution-loop/launch-gate.ts +158 -2
  348. package/src/fleet/host-doctor.ts +446 -0
  349. package/src/goals/judge.ts +20 -6
  350. package/src/graph-runner/runner.ts +12 -6
  351. package/src/graph-wizard/archetypes.ts +14 -8
  352. package/src/graph-wizard/generate.ts +77 -1
  353. package/src/grok.ts +13 -7
  354. package/src/harness/harness-cli-command.ts +102 -51
  355. package/src/harness/harness-stop.ts +93 -19
  356. package/src/index.ts +52 -179
  357. package/src/instance/current.ts +2 -6
  358. package/src/instance/resolve.ts +5 -6
  359. package/src/intake-plane/collect-github.ts +7 -2
  360. package/src/intake-plane/lens.ts +46 -4
  361. package/src/intake-plane/requirement-funnel.ts +53 -1
  362. package/src/intelligence-map/catalog-feed.ts +119 -0
  363. package/src/intelligence-map/model-watch-intake.ts +40 -0
  364. package/src/intelligence-map/model-watch-mission.ts +14 -1
  365. package/src/llm/open-weight-discipline.ts +21 -0
  366. package/src/llm/openai-sampling-fields.ts +89 -0
  367. package/src/llm/runtime-model-family.ts +61 -0
  368. package/src/llm/zai-coding-plan.ts +27 -1
  369. package/src/llm.ts +17 -97
  370. package/src/machines/machine-ledger.ts +31 -3
  371. package/src/maturity/cli-maturity.ts +13 -3
  372. package/src/maturity/feature-maturity.ts +1 -1
  373. package/src/msg/msg-store.ts +69 -7
  374. package/src/nexus/api/http-server.ts +22 -0
  375. package/src/oauth/codex-account-rotation.ts +4 -1
  376. package/src/oauth/codex-account-store.ts +20 -7
  377. package/src/oauth/codex-quota-policy.ts +33 -4
  378. package/src/ops/overview-collect.ts +3 -2
  379. package/src/ops/overview-owner.ts +29 -0
  380. package/src/plugin-hooks/shell-hook.ts +17 -2
  381. package/src/plugin-missions/evaluator-runner.ts +18 -2
  382. package/src/plugins/install/plugin-install.ts +11 -1
  383. package/src/preview/terminal.ts +15 -5
  384. package/src/project/project-store.ts +20 -0
  385. package/src/prompt-enhance/enhance.ts +11 -0
  386. package/src/release-loop/auto-start.ts +7 -5
  387. package/src/release-loop/checklist.ts +52 -5
  388. package/src/release-loop/feature-store.ts +10 -9
  389. package/src/release-loop/gate-shards.ts +4 -0
  390. package/src/release-loop/light-rc.ts +84 -13
  391. package/src/release-loop/merged-pr-checklist.ts +35 -5
  392. package/src/release-loop/rehearsal.ts +1 -1
  393. package/src/seat-loop/duty-ledger.ts +64 -0
  394. package/src/seat-loop/seat-loop.ts +5 -1
  395. package/src/self-dev/decompose.ts +37 -3
  396. package/src/self-dev/dev-pipeline.ts +32 -7
  397. package/src/self-dev/draft-residue.ts +16 -6
  398. package/src/self-dev/draft-sweep.ts +75 -18
  399. package/src/self-dev/fabric-decompose-adapter.ts +9 -2
  400. package/src/self-dev/orchestrate.ts +6 -2
  401. package/src/self-dev/run-supervisor.ts +72 -8
  402. package/src/self-implement/gate-cli.ts +29 -10
  403. package/src/self-implement/gate-remote.ts +4 -1
  404. package/src/self-implement/goal-author.ts +15 -29
  405. package/src/self-implement/goal-command-execution.ts +26 -0
  406. package/src/self-implement/goal-new-paths.ts +42 -0
  407. package/src/self-implement/host-regate.ts +124 -30
  408. package/src/self-implement/importer-test-index.ts +3 -1
  409. package/src/self-implement/l8-merge-queue.ts +80 -2
  410. package/src/self-implement/merge-train.ts +19 -0
  411. package/src/self-implement/off-diff-evidence.ts +40 -1
  412. package/src/self-implement/orchestrator.ts +90 -20
  413. package/src/self-implement/premise-review.ts +159 -0
  414. package/src/self-implement/pwa-import-graph.ts +194 -7
  415. package/src/self-implement/regate-detail.ts +79 -0
  416. package/src/self-implement/review-deferred-to-host.ts +21 -0
  417. package/src/self-implement/rework-budget-judgment.ts +23 -3
  418. package/src/self-implement/running-runs.ts +2 -2
  419. package/src/self-implement/scope-adjacency.ts +23 -0
  420. package/src/self-implement/seams.ts +42 -7
  421. package/src/self-implement/self-implement-runtime.ts +126 -21
  422. package/src/session/index.ts +14 -4
  423. package/src/session-runtime/index.ts +55 -11
  424. package/src/skills/tools/agent.ts +16 -1
  425. package/src/skills/tools/persistent-grounding.ts +11 -1
  426. package/src/skills/tools/shell.ts +33 -1
  427. package/src/steward/rejudge-tick.ts +142 -0
  428. package/src/task-agent/board.ts +92 -3
  429. package/src/task-agent/card-evidence.ts +88 -1
  430. package/src/task-agent/cover.ts +85 -1
  431. package/src/task-agent/live-moves.ts +14 -6
  432. package/src/task-agent/parent-host.ts +27 -3
  433. package/src/task-agent/rejudge-on-head.ts +370 -29
  434. package/src/task-agent/review-result-capture.ts +67 -2
  435. package/src/task-agent/shadow.ts +148 -21
  436. package/src/task-agent/task-hand.ts +22 -3
  437. package/src/task-orchestrator/surfaces/pod-command-job.ts +14 -0
  438. package/src/task-orchestrator/surfaces/pod-host-acp-review.ts +122 -0
  439. package/src/task-orchestrator/surfaces/pod-manifest-test-normalize.ts +23 -0
  440. package/src/task-orchestrator/surfaces/pod-pool.ts +53 -0
  441. package/src/task-orchestrator/surfaces/self-implement-pod.ts +236 -28
  442. package/src/tool-runtime/tool-search-runtime.ts +25 -0
  443. package/src/tui.ts +20 -1
  444. package/src/user-config.ts +21 -63
  445. package/src/ux-sim/fault-cred-expiry.ts +100 -0
  446. package/src/ux-sim/fault-pod-death.ts +74 -0
  447. package/src/ux-sim/fault-pool-cap.ts +81 -0
  448. package/src/version/packed-revision.json +1 -1
  449. package/src/webclone/qa-table.ts +22 -0
  450. package/apps/pwa/out/_next/static/chunks/0a09e062-34f747a17d8d8c2e.js +0 -1
  451. package/apps/pwa/out/_next/static/chunks/1168.a0fb3d9db76c00bd.js +0 -77
  452. package/apps/pwa/out/_next/static/chunks/1325-dc3f3c21eb181cb4.js +0 -1
  453. package/apps/pwa/out/_next/static/chunks/1357.a843c41d2cd7ec31.js +0 -34
  454. package/apps/pwa/out/_next/static/chunks/1430.53f49882b17607c2.js +0 -24
  455. package/apps/pwa/out/_next/static/chunks/1459-be6509b3419d8a9f.js +0 -1
  456. package/apps/pwa/out/_next/static/chunks/153.0a4e3cd516930491.js +0 -1
  457. package/apps/pwa/out/_next/static/chunks/1572.7bc291352e241a45.js +0 -1
  458. package/apps/pwa/out/_next/static/chunks/1593-d07ad068c120dfb0.js +0 -1
  459. package/apps/pwa/out/_next/static/chunks/1608.b7c900baa56cab32.js +0 -1
  460. package/apps/pwa/out/_next/static/chunks/1615-4d8156febaac4b35.js +0 -1
  461. package/apps/pwa/out/_next/static/chunks/1646.e03f0fbc26bc72f6.js +0 -1
  462. package/apps/pwa/out/_next/static/chunks/1669-da843ed73aa301f5.js +0 -1
  463. package/apps/pwa/out/_next/static/chunks/176.13ba0659e3e96fd4.js +0 -1
  464. package/apps/pwa/out/_next/static/chunks/1990.9c60f495ef33c070.js +0 -36
  465. package/apps/pwa/out/_next/static/chunks/2042e469.f86158dd5c1e51a1.js +0 -122
  466. package/apps/pwa/out/_next/static/chunks/2543-28ec6aeb80a5e1e1.js +0 -1
  467. package/apps/pwa/out/_next/static/chunks/2561.43c99d6ee914ee6a.js +0 -62
  468. package/apps/pwa/out/_next/static/chunks/2638.b39ab2f674caa1a5.js +0 -1
  469. package/apps/pwa/out/_next/static/chunks/272-0eed0fb0aab716b6.js +0 -1
  470. package/apps/pwa/out/_next/static/chunks/2778.67e0c1d484189ccf.js +0 -1
  471. package/apps/pwa/out/_next/static/chunks/2841.10ff309f6a3168af.js +0 -1
  472. package/apps/pwa/out/_next/static/chunks/2886-9639f97d523d752a.js +0 -1
  473. package/apps/pwa/out/_next/static/chunks/2978.57fb87ce21cc5a85.js +0 -1
  474. package/apps/pwa/out/_next/static/chunks/3664.15f968c39d15bd28.js +0 -149
  475. package/apps/pwa/out/_next/static/chunks/3786-935eb3fcde90e496.js +0 -1
  476. package/apps/pwa/out/_next/static/chunks/3813.df4a01ae89c6f63f.js +0 -1
  477. package/apps/pwa/out/_next/static/chunks/3961-aaae04ed1d32622f.js +0 -1
  478. package/apps/pwa/out/_next/static/chunks/3992.f79c70480e8c4077.js +0 -309
  479. package/apps/pwa/out/_next/static/chunks/40-413e8641de9ed1e5.js +0 -1
  480. package/apps/pwa/out/_next/static/chunks/4054-521f11a503daed64.js +0 -1
  481. package/apps/pwa/out/_next/static/chunks/4315.e7356f34c7d8ec79.js +0 -1
  482. package/apps/pwa/out/_next/static/chunks/4489-bf629de6f04f7681.js +0 -1
  483. package/apps/pwa/out/_next/static/chunks/4540.557733cc88c6a82b.js +0 -1
  484. package/apps/pwa/out/_next/static/chunks/462.0275b4338c5b6337.js +0 -1
  485. package/apps/pwa/out/_next/static/chunks/4658-7ed9266098a787e4.js +0 -1
  486. package/apps/pwa/out/_next/static/chunks/4945-0f4046cfc3228ea3.js +0 -1
  487. package/apps/pwa/out/_next/static/chunks/5105-18b4165c5d3a86b0.js +0 -1
  488. package/apps/pwa/out/_next/static/chunks/5205-6992210fe31f45f4.js +0 -1
  489. package/apps/pwa/out/_next/static/chunks/5287-72898b126d722457.js +0 -1
  490. package/apps/pwa/out/_next/static/chunks/5313.1697309c532b9856.js +0 -2
  491. package/apps/pwa/out/_next/static/chunks/5474.991b90688c3cb321.js +0 -1
  492. package/apps/pwa/out/_next/static/chunks/5544-871146192d095594.js +0 -1
  493. package/apps/pwa/out/_next/static/chunks/5935.d5e8ca3e096772e8.js +0 -1
  494. package/apps/pwa/out/_next/static/chunks/6006.84e8b418a7a0db97.js +0 -1
  495. package/apps/pwa/out/_next/static/chunks/6013-1267ba7454d6764b.js +0 -1
  496. package/apps/pwa/out/_next/static/chunks/6038-1e0f7ee1086da4cf.js +0 -1
  497. package/apps/pwa/out/_next/static/chunks/617.709dd0019fe99796.js +0 -1
  498. package/apps/pwa/out/_next/static/chunks/6261.fb9bf94947094636.js +0 -74
  499. package/apps/pwa/out/_next/static/chunks/6411.1966866fae31ffa9.js +0 -1
  500. package/apps/pwa/out/_next/static/chunks/6481-b829d99aa8d158f5.js +0 -1
  501. package/apps/pwa/out/_next/static/chunks/6541.2b7daa043100d0fa.js +0 -1
  502. package/apps/pwa/out/_next/static/chunks/6597.2d7a6d77ab485b27.js +0 -64
  503. package/apps/pwa/out/_next/static/chunks/67.5dd2dc543c2fa3de.js +0 -1
  504. package/apps/pwa/out/_next/static/chunks/6777-312496b0d774719b.js +0 -1
  505. package/apps/pwa/out/_next/static/chunks/681.0116f7036cfb4e8d.js +0 -32
  506. package/apps/pwa/out/_next/static/chunks/6871.30b2bf23b3126e36.js +0 -24
  507. package/apps/pwa/out/_next/static/chunks/6882.737d366d54e29d83.js +0 -1
  508. package/apps/pwa/out/_next/static/chunks/7035.54c2c535164b1c9b.js +0 -1
  509. package/apps/pwa/out/_next/static/chunks/7086-8bfa7e8f796a03d9.js +0 -1
  510. package/apps/pwa/out/_next/static/chunks/7126.5e5599f251726b67.js +0 -93
  511. package/apps/pwa/out/_next/static/chunks/7203-47ff0740a293e284.js +0 -1
  512. package/apps/pwa/out/_next/static/chunks/7268.017f49dafb5f0ff3.js +0 -1
  513. package/apps/pwa/out/_next/static/chunks/7355.5d65a87e9567ae08.js +0 -1
  514. package/apps/pwa/out/_next/static/chunks/7392.4018c2a62177f296.js +0 -1
  515. package/apps/pwa/out/_next/static/chunks/7471.3a3d1be50559cfb8.js +0 -148
  516. package/apps/pwa/out/_next/static/chunks/7500.73489a345cef2201.js +0 -226
  517. package/apps/pwa/out/_next/static/chunks/7565.c2f72a15c1ed0396.js +0 -27
  518. package/apps/pwa/out/_next/static/chunks/7651.6d1c984d3d8587a4.js +0 -1
  519. package/apps/pwa/out/_next/static/chunks/7713.7ab863ed59b2d661.js +0 -1
  520. package/apps/pwa/out/_next/static/chunks/7793.d7cd2026767ddd54.js +0 -115
  521. package/apps/pwa/out/_next/static/chunks/7837.c7c267e5dceadb11.js +0 -1
  522. package/apps/pwa/out/_next/static/chunks/7891.09266382daf70d1c.js +0 -1
  523. package/apps/pwa/out/_next/static/chunks/7990-cbf6a01bcbdcb7e6.js +0 -1
  524. package/apps/pwa/out/_next/static/chunks/8119-819c549e0c197786.js +0 -1
  525. package/apps/pwa/out/_next/static/chunks/8186-74ea19a3700d04a8.js +0 -1
  526. package/apps/pwa/out/_next/static/chunks/8267-e7b3262b735ae106.js +0 -1
  527. package/apps/pwa/out/_next/static/chunks/8386.86518e55b75f7cf5.js +0 -8
  528. package/apps/pwa/out/_next/static/chunks/8437.ba6eeeb29590042f.js +0 -23
  529. package/apps/pwa/out/_next/static/chunks/8469-1500be57e582296f.js +0 -1
  530. package/apps/pwa/out/_next/static/chunks/8483-7164cecdaf178ca6.js +0 -1
  531. package/apps/pwa/out/_next/static/chunks/8722-4c940f02c496ad36.js +0 -1
  532. package/apps/pwa/out/_next/static/chunks/887-41d0dcf5af48c628.js +0 -1
  533. package/apps/pwa/out/_next/static/chunks/9039.da86361496797522.js +0 -90
  534. package/apps/pwa/out/_next/static/chunks/905.d5745a25884754d4.js +0 -94
  535. package/apps/pwa/out/_next/static/chunks/9089-d909f3d4478b0628.js +0 -1
  536. package/apps/pwa/out/_next/static/chunks/9096.dc5c7a267f83790c.js +0 -41
  537. package/apps/pwa/out/_next/static/chunks/93.a567257b6bdb7fe4.js +0 -1
  538. package/apps/pwa/out/_next/static/chunks/9320.419acb9665b46597.js +0 -287
  539. package/apps/pwa/out/_next/static/chunks/9356.b8ceda6634612ff8.js +0 -79
  540. package/apps/pwa/out/_next/static/chunks/94.e9e1043b35cd3eed.js +0 -1
  541. package/apps/pwa/out/_next/static/chunks/9400-7498ea90b2e6ee8f.js +0 -1
  542. package/apps/pwa/out/_next/static/chunks/9930-58644af9c813d6e1.js +0 -1
  543. package/apps/pwa/out/_next/static/chunks/9932.367cf4725fedd6e2.js +0 -1
  544. package/apps/pwa/out/_next/static/chunks/9935.1628b904cdc8ce0e.js +0 -104
  545. package/apps/pwa/out/_next/static/chunks/app/_not-found/page-a2aa8709d193ee0d.js +0 -1
  546. package/apps/pwa/out/_next/static/chunks/app/approvals/page-3b9fc39362473ae7.js +0 -1
  547. package/apps/pwa/out/_next/static/chunks/app/autopilot/page-f2b62c19ca68fef8.js +0 -1
  548. package/apps/pwa/out/_next/static/chunks/app/board/page-d7602d489edf5f37.js +0 -1
  549. package/apps/pwa/out/_next/static/chunks/app/botlab/page-24282bf9f90031a5.js +0 -1
  550. package/apps/pwa/out/_next/static/chunks/app/bots/page-8b7c5ab6b5bc8d64.js +0 -1
  551. package/apps/pwa/out/_next/static/chunks/app/ceo/page-4eb84d454f8c3415.js +0 -1
  552. package/apps/pwa/out/_next/static/chunks/app/chat/page-b2e494bdad57fcb5.js +0 -1
  553. package/apps/pwa/out/_next/static/chunks/app/consult/page-c0ab229673a8b0eb.js +0 -1
  554. package/apps/pwa/out/_next/static/chunks/app/control/page-3e2b45f3c36dbac4.js +0 -1
  555. package/apps/pwa/out/_next/static/chunks/app/decisions/page-c22aa511b28743ad.js +0 -1
  556. package/apps/pwa/out/_next/static/chunks/app/editor/page-bf88c0f558d8ef54.js +0 -1
  557. package/apps/pwa/out/_next/static/chunks/app/exec/page-52fec523e5b5d3ad.js +0 -1
  558. package/apps/pwa/out/_next/static/chunks/app/field/page-67723dfdcde92b31.js +0 -1
  559. package/apps/pwa/out/_next/static/chunks/app/healthz/route-a2aa8709d193ee0d.js +0 -1
  560. package/apps/pwa/out/_next/static/chunks/app/inside/page-22725e2570f1126b.js +0 -1
  561. package/apps/pwa/out/_next/static/chunks/app/intake/page-1891335950d68b70.js +0 -1
  562. package/apps/pwa/out/_next/static/chunks/app/layout-3267af1ebdc73cf5.js +0 -1
  563. package/apps/pwa/out/_next/static/chunks/app/live/page-c314b75c11234998.js +0 -1
  564. package/apps/pwa/out/_next/static/chunks/app/live-run/page-9f9c85415f61782b.js +0 -1
  565. package/apps/pwa/out/_next/static/chunks/app/loops/page-c1d4276059085587.js +0 -1
  566. package/apps/pwa/out/_next/static/chunks/app/market/page-833aab587f26ad4c.js +0 -1
  567. package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-8526c17ae38e6a50.js +0 -1
  568. package/apps/pwa/out/_next/static/chunks/app/morning/page-f998637a8402115c.js +0 -1
  569. package/apps/pwa/out/_next/static/chunks/app/not-found-b7bb53828b17b335.js +0 -1
  570. package/apps/pwa/out/_next/static/chunks/app/observatory/page-1b1850de0257e46d.js +0 -1
  571. package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-6f23159fedb41f67.js +0 -1
  572. package/apps/pwa/out/_next/static/chunks/app/ops/release/page-1d809a87139dd024.js +0 -1
  573. package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-da9e570234d481fd.js +0 -1
  574. package/apps/pwa/out/_next/static/chunks/app/page-8ce3a38e210b810a.js +0 -1
  575. package/apps/pwa/out/_next/static/chunks/app/reflection/page-57ffeeb6019440fd.js +0 -1
  576. package/apps/pwa/out/_next/static/chunks/app/scheduler/page-abbb417bf514630b.js +0 -1
  577. package/apps/pwa/out/_next/static/chunks/app/sessions/page-2c2b3f29cec1efa4.js +0 -1
  578. package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-9369279f72fc7b51.js +0 -1
  579. package/apps/pwa/out/_next/static/chunks/app/settings/page-64861f14039499c3.js +0 -1
  580. package/apps/pwa/out/_next/static/chunks/app/setup/done/page-ddc4c93efd8ab94b.js +0 -1
  581. package/apps/pwa/out/_next/static/chunks/app/setup/layout-a2aa8709d193ee0d.js +0 -1
  582. package/apps/pwa/out/_next/static/chunks/app/setup/page-901a1391b81053bc.js +0 -1
  583. package/apps/pwa/out/_next/static/chunks/app/share/page-68d9bbaac9841a58.js +0 -1
  584. package/apps/pwa/out/_next/static/chunks/app/showroom/page-b5c0c996f329371e.js +0 -1
  585. package/apps/pwa/out/_next/static/chunks/app/tasks/page-89881ccbcf728978.js +0 -1
  586. package/apps/pwa/out/_next/static/chunks/app/term/page-0e87a803b3d7165e.js +0 -1
  587. package/apps/pwa/out/_next/static/chunks/app/today/page-58d4e5cb30ef4871.js +0 -1
  588. package/apps/pwa/out/_next/static/chunks/app/trace/page-02ce4c3b5f39e4d2.js +0 -1
  589. package/apps/pwa/out/_next/static/chunks/app/vault/page-e620d1bb8eadcec2.js +0 -1
  590. package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-acf868c64d77f950.js +0 -1
  591. package/apps/pwa/out/_next/static/chunks/app/workflows/page-54fa605fa6dba457.js +0 -1
  592. package/apps/pwa/out/_next/static/chunks/app/workspace/page-bc79f0833533fa84.js +0 -1
  593. package/apps/pwa/out/_next/static/chunks/app/worktrees/page-d5c4398eea03d8f3.js +0 -1
  594. package/apps/pwa/out/_next/static/chunks/cd39fa05.fac4545f42a3ef70.js +0 -1
  595. package/apps/pwa/out/_next/static/chunks/framework-b2763b10dc6b3836.js +0 -1
  596. package/apps/pwa/out/_next/static/chunks/main-app-27893e93b0ec193d.js +0 -1
  597. package/apps/pwa/out/_next/static/chunks/main-f280047194e1daf8.js +0 -1
  598. package/apps/pwa/out/_next/static/chunks/pages/_app-e90eff2d0b70564c.js +0 -1
  599. package/apps/pwa/out/_next/static/chunks/pages/_error-70f2d654b3435d34.js +0 -1
  600. package/apps/pwa/out/_next/static/chunks/webpack-4794f053bd5e4230.js +0 -1
  601. /package/apps/pwa/out/_next/static/{Q-7iofoxOEv1WX18S35of → Ev2jivDMTSoEc-5rIXdcy}/_ssgManifest.js +0 -0
@@ -965,6 +965,7 @@ import {
965
965
  enterSessionControlMode,
966
966
  exitSessionControlMode,
967
967
  isSessionControlActive,
968
+ routeDevHarnessSubmitIntent,
968
969
  parseSessionControlSlash,
969
970
  parseSessionSurfaceSlash,
970
971
  resolveSessionInputModeFromChatMode,
@@ -1023,7 +1024,7 @@ import { expandPromptReferences } from '../prompt/references.js';
1023
1024
  import { spawnCodingAgent, CodingAgentBinaryMissing } from '../terminal/coding-agent.js';
1024
1025
  import type { TerminalSession } from '../terminal/session-registry.js';
1025
1026
  import { createSessionPickerModal } from '../session/picker-modal.js';
1026
- import { listSessions as listChatSessionsForResume } from '../session/index.js';
1027
+ import { listSessions as listChatSessionsForResume, adoptSession as adoptChatSession, setActiveSessionId as markActiveChatSession } from '../session/index.js';
1027
1028
  // TUI 부활 S-b — 타임트래블 포크 엔진 (codex ForkSnapshot 동형 · 2026-07-09
1028
1029
  // 이식 후 호출처 0 이던 방치 자산 회수). 순수 히스토리 절단 로직만 소비;
1029
1030
  // 영속은 세션 스토어(forkSessionFromHistory)가 담당한다.
@@ -1179,6 +1180,20 @@ import { buildDebugCallStack } from '../debug/call-stack.js';
1179
1180
  import { buildAstGrepHostTool } from '../skills/tools/ast-grep.js';
1180
1181
  import { buildLspHostTool } from '../skills/tools/lsp/index.js';
1181
1182
  import { PluginHost } from '../plugins/core/host.js';
1183
+
1184
+ /** Register the same L2 host tools used by the live TUI before each turn's catalog is assembled. */
1185
+ export function registerDashboardCoreHostTools(host: Pick<PluginHost, 'registerHostTool'>): void {
1186
+ const coreMod = require('../domains/core-tools.js') as typeof import('../domains/core-tools.js');
1187
+ const core = coreMod.buildCoreTools();
1188
+ for (const spec of core.specs) {
1189
+ host.registerHostTool({
1190
+ name: spec.name,
1191
+ description: spec.description,
1192
+ parameters: spec.parameters,
1193
+ handler: async (args) => core.dispatch(spec.name, args as Record<string, unknown>),
1194
+ });
1195
+ }
1196
+ }
1182
1197
  import { registerDashboardPaneHostTools } from './panes/host-tools.js';
1183
1198
  import { DEFAULT_THEME_TOKENS, mergeThemeTokens, resolveThemeTokens, type ThemeTokenInput, type ThemeTokens } from '../theme/tokens.js';
1184
1199
  import { resolveActiveTheme, setActivePresetInConfig } from './render/theme-resolver.js';
@@ -1407,6 +1422,8 @@ const isPluginBusy = (host: { active(): { plugin: { isBusy?: (s: any) => boolean
1407
1422
  // ── Main dashboard ──
1408
1423
 
1409
1424
  export interface ShowDashboardOptions {
1425
+ /** Internal startup timing signal for the first successfully flushed dashboard frame. */
1426
+ onFirstFrameRendered?: () => void;
1410
1427
  /** Force debug sinks on at launch (file + mirror). Equivalent to
1411
1428
  * typing `/debug on` immediately after startup. Paired with
1412
1429
  * chatOnly=true by the `elanous --debug` CLI flag so every traced
@@ -1501,6 +1518,16 @@ export function buildDashboardTurnTypeaheadPromptZone(input: TurnTypeaheadPrompt
1501
1518
  };
1502
1519
  }
1503
1520
 
1521
+ /** The chat-main submit branch calls this before any model dispatch. Keeping
1522
+ * the decision here lets the dashboard test execute the same entry point. */
1523
+ export function resolveDashboardHarnessSubmitIntent(
1524
+ text: string,
1525
+ options: Parameters<typeof resolveDashboardChatMainSubmitIntent>[1],
1526
+ resolveIntent: typeof resolveDashboardChatMainSubmitIntent = resolveDashboardChatMainSubmitIntent,
1527
+ ) {
1528
+ return routeDevHarnessSubmitIntent(resolveIntent(text, options));
1529
+ }
1530
+
1504
1531
  /** 프롬프트 zone 에 관측만 덧입힌다 — 렌더 산출은 `inner` 가 소유한다.
1505
1532
  *
1506
1533
  * ⭐ **왜 뽑았나**(무인 리뷰 must-fix · 2026-08-01): 종전엔 이 래퍼가 `zones.push({...})` 안에
@@ -1567,6 +1594,7 @@ export interface DashboardFrameInput {
1567
1594
  promptCaret: CursorState | null;
1568
1595
  suppressPromptArea: boolean;
1569
1596
  onEssentialFrameCursorDecision?: (observation: EssentialFrameCursorObservation) => void;
1597
+ onFrameWriteComplete?: (error?: Error | null) => void;
1570
1598
  }
1571
1599
 
1572
1600
  export interface EssentialFrameCursorObservation {
@@ -1612,6 +1640,7 @@ export function renderDashboardFrame(
1612
1640
  overlay: input.overlay,
1613
1641
  force: input.force,
1614
1642
  cursor: paintCursor(essentialDecision.cursor ?? input.coordinatorCursor ?? null),
1643
+ onWriteComplete: input.onFrameWriteComplete,
1615
1644
  });
1616
1645
  input.onEssentialFrameCursorDecision?.({
1617
1646
  caret: essentialDecision.cursor,
@@ -1901,6 +1930,7 @@ export function renderDashboardFirstScreenBand(input: {
1901
1930
  }
1902
1931
 
1903
1932
  export async function showDashboard(opts: ShowDashboardOptions = {}): Promise<DashboardAction> {
1933
+ let firstDashboardFrameRendered = false;
1904
1934
  await awaitGlobalPersonaLoad().catch(() => {});
1905
1935
  const dashboardQuitConfirmationState = createQuitConfirmationState();
1906
1936
  const signalQuitConfirmationState = createQuitConfirmationState();
@@ -1910,7 +1940,11 @@ export async function showDashboard(opts: ShowDashboardOptions = {}): Promise<Da
1910
1940
  closeTui();
1911
1941
  };
1912
1942
  const exitDashboardTui = (): void => {
1913
- closeDashboardForExit({ closeTui: closeDashboardTui, confirmationState: dashboardQuitConfirmationState });
1943
+ closeDashboardForExit({
1944
+ closeTui: closeDashboardTui,
1945
+ confirmationState: dashboardQuitConfirmationState,
1946
+ getSessionId: (): string | undefined => acpSessionIdRef.current ?? undefined,
1947
+ });
1914
1948
  };
1915
1949
  // ⭐⭐⭐ `N1` — 신호 경로(`SIGINT`/`SIGTERM`)와 저수준 `Ctrl+C` 도 같은 종료를 타게 «등록»한다.
1916
1950
  // ⛔ 종전엔 그 둘만 세션 안내를 «못 받았다»(일곱 경로 중 다섯만 받았다).
@@ -1920,6 +1954,7 @@ export async function showDashboard(opts: ShowDashboardOptions = {}): Promise<Da
1920
1954
  closeTui: () => { /* 신호 경로: cleanup() 이 이미 복원했다 */ },
1921
1955
  confirmationState: signalQuitConfirmationState,
1922
1956
  forceQuit: true,
1957
+ getSessionId: (): string | undefined => acpSessionIdRef.current ?? undefined,
1923
1958
  });
1924
1959
  });
1925
1960
  // E3 (§7.4 TS baseline reduction · 2026-05-17) — forward declarations
@@ -3342,6 +3377,8 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
3342
3377
  // ⛔ `attachedSessionId`(대화 세션)와 «다른 축»이다 — 루프는 ACP 세션으로 스코프를 연다.
3343
3378
  // ⚠️ 세션은 이 함수 «뒤»에서 만들어지므로 참조로 둔다(호출 시점엔 채워져 있다).
3344
3379
  const acpSessionIdRef: { current: string | null } = { current: null };
3380
+ const adoptedAcpSessionIds = new Set<string>();
3381
+ let activeAcpSessionId: string | null = null;
3345
3382
  const activeSessionIdForTypeahead = (): string | null => acpSessionIdRef.current;
3346
3383
  const paintTurnTypeaheadEcho = (): void => {
3347
3384
  const { rows: tr, cols: tc } = termSize();
@@ -10014,16 +10051,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
10014
10051
  // family(전 surface 기본) — 이로써 TUI 에서도 "P2 왜 실패?" 를 엘라누스가 툴로 상황판단한다.
10015
10052
  // fail-soft: 코어 도구 로드 실패가 대시보드 부팅을 막지 않는다.
10016
10053
  try {
10017
- const coreMod = require('../domains/core-tools.js') as typeof import('../domains/core-tools.js');
10018
- const core = coreMod.buildCoreTools();
10019
- for (const spec of core.specs) {
10020
- pluginHost.registerHostTool({
10021
- name: spec.name,
10022
- description: spec.description,
10023
- parameters: spec.parameters,
10024
- handler: async (args) => core.dispatch(spec.name, args as Record<string, unknown>),
10025
- });
10026
- }
10054
+ registerDashboardCoreHostTools(pluginHost);
10027
10055
  } catch { /* fail-soft */ }
10028
10056
  // LSP (Phase L3 of 내부 문서 `ROADMAP-lsp-integration`) — structural /
10029
10057
  // symbol-level source queries via typescript-language-server. Pool
@@ -11530,6 +11558,11 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
11530
11558
  // ⭐ Single flush: resolve the prompt caret after overlays.
11531
11559
  const frameCursorDecision = display.cursorDecision();
11532
11560
  renderDashboardFrame(baseLines, composeDashboardFrameWithCoordinatorModal(display, {
11561
+ onFrameWriteComplete: firstDashboardFrameRendered ? undefined : (error) => {
11562
+ if (error || firstDashboardFrameRendered) return;
11563
+ firstDashboardFrameRendered = true;
11564
+ try { opts.onFirstFrameRendered?.(); } catch { /* timing must not break dashboard */ }
11565
+ },
11533
11566
  overlay: modalFrame,
11534
11567
  force: forceFromCoordinator || modalKey !== lastModalKey,
11535
11568
  cursorOwner: frameCursorDecision.owner,
@@ -17422,7 +17455,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
17422
17455
  // resource_link blocks so dropped screenshots and PDFs flow
17423
17456
  // naturally to the agent. debug.log gates the snapshot so
17424
17457
  // off-state stays zero-cost.
17425
- const submitIntent = resolveDashboardChatMainSubmitIntent(input.text, {
17458
+ const submitIntent = resolveDashboardHarnessSubmitIntent(input.text, {
17426
17459
  stickyBackend: dashboardAcpChat.getSticky(),
17427
17460
  source: input.externalSubmitSource,
17428
17461
  });
@@ -17443,7 +17476,10 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
17443
17476
  }
17444
17477
  if (submitIntent.kind === 'submit-turn' && submitIntent.route === 'sticky-acp') {
17445
17478
  await runDashboardChatMainSubmitIntent({
17446
- submit: createDashboardChatMainTurnSubmit(submitIntent),
17479
+ submit: createDashboardChatMainTurnSubmit({
17480
+ ...submitIntent,
17481
+ sessionId: submitIntent.sessionId ?? dashboardAcpSession.currentSessionId,
17482
+ }),
17447
17483
  beforeExecute: (submit) => {
17448
17484
  maybeEmitDashboardSubmitQuickPass({
17449
17485
  submit,
@@ -19186,16 +19222,19 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
19186
19222
  do {
19187
19223
  const turnText = goalLoopUserText ?? tok.text;
19188
19224
  await runDashboardChatMainSubmitIntent({
19189
- submit: createDashboardChatMainTurnSubmit(
19190
- submitIntent.kind === 'submit-turn' && submitIntent.route === 'plain' && goalLoopUserText === null
19191
- ? submitIntent
19192
- : {
19193
- kind: 'submit-turn',
19194
- source: { kind: 'keyboard', surface: 'dashboard-chat-main' },
19195
- text: turnText,
19196
- route: goalLoopUserText === null ? 'plain' : 'plain',
19197
- },
19198
- ),
19225
+ submit: createDashboardChatMainTurnSubmit({
19226
+ ...(submitIntent.kind === 'submit-turn' && submitIntent.route === 'plain' && goalLoopUserText === null
19227
+ ? submitIntent
19228
+ : {
19229
+ kind: 'submit-turn' as const,
19230
+ source: { kind: 'keyboard' as const, surface: 'dashboard-chat-main' },
19231
+ text: turnText,
19232
+ route: 'plain' as const,
19233
+ }),
19234
+ sessionId: submitIntent.kind === 'submit-turn'
19235
+ ? submitIntent.sessionId ?? dashboardAcpSession.currentSessionId
19236
+ : dashboardAcpSession.currentSessionId,
19237
+ }),
19199
19238
  beforeExecute: (submit) => {
19200
19239
  maybeEmitDashboardSubmitQuickPass({
19201
19240
  submit,
@@ -19246,6 +19285,29 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
19246
19285
  }
19247
19286
  } while (goalLoopUserText !== null);
19248
19287
 
19288
+ // SESSION-RESUME-ISOLATED: 완료된 턴의 ACP 세션을 원장에 등록하고 active 로 지정한다.
19289
+ // 서버의 완료-채택(persistCompletedTuiAcpTurn)은 origin_session 메타가 실렸을 때만
19290
+ // 도는데, 격리 우주 첫 턴에는 origin 세션이 없어 메타가 안 실린다 — 여기가 그 갭을 닫는다.
19291
+ const completedAcpSessionId = dashboardAcpSession.currentSessionId;
19292
+ if (completedAcpSessionId) {
19293
+ acpSessionIdRef.current = completedAcpSessionId;
19294
+ // 원격 데몬 세션의 원장은 데몬이 소유한다. 로컬 등록은 세션마다 한 번만 한다.
19295
+ if (!daemonAttached && activeAcpSessionId !== completedAcpSessionId) {
19296
+ try {
19297
+ if (!adoptedAcpSessionIds.has(completedAcpSessionId)) {
19298
+ adoptChatSession(completedAcpSessionId, { source: 'tui', transport: 'acp' });
19299
+ adoptedAcpSessionIds.add(completedAcpSessionId);
19300
+ }
19301
+ markActiveChatSession(completedAcpSessionId);
19302
+ activeAcpSessionId = completedAcpSessionId;
19303
+ } catch (error) {
19304
+ // 등록 실패가 대화 흐름을 끊지 않되, 다음 턴 재시도 전 원인을 남긴다.
19305
+ debug.log('session.adopt', 'failed', { sessionId: completedAcpSessionId, error: String(error) });
19306
+ pushDebugLine(C.warning(`session adopt failed: ${String(error)}`));
19307
+ }
19308
+ }
19309
+ }
19310
+
19249
19311
  continue; // stay in input mode after chat
19250
19312
  } // end while (input mode loop)
19251
19313
  // Disarm the prompt-repaint hook: textInput's drawAll
@@ -191,10 +191,15 @@ export async function runDashboardChatMainPlainTurn(
191
191
  // 「사다리가 안 걸린 것」과 「걸렸는데 키가 딴 데로 간 것」을 ***원리상 못 갈랐다***.
192
192
  // ⭐ 이 한 줄이 그 둘을 가른다 — 이 이벤트가 «있는데» typeahead 가 0이면 후자다.
193
193
  // ⛔ 행동을 바꾸지 않는다(관측만). 처방은 `RFC-tui-mid-turn-input-queue-2026-08-19` §2 Q1.
194
+ const startedAtDate = new Date(deps.turnStartedAt);
195
+ const turnStartedAtIso = Number.isFinite(startedAtDate.getTime())
196
+ ? startedAtDate.toISOString()
197
+ : undefined;
194
198
  try {
195
199
  deps.debugLog?.('chat-main.plain-turn', 'streaming-keys-attached', {
196
200
  userTextBytes: Buffer.byteLength(userText ?? '', 'utf8'),
197
201
  turnStartedAt: deps.turnStartedAt,
202
+ turnStartedAtIso,
198
203
  });
199
204
  } catch { /* fail-soft — 관측이 턴을 막지 않는다 */ }
200
205
  let stage = 'streaming-keys-attached';
@@ -291,11 +296,32 @@ export async function runDashboardChatMainPlainTurn(
291
296
  });
292
297
 
293
298
  if (finishIfAborted()) return;
299
+ // TUI-FIRST-TURN-STALL — 09:48 표본에서 llm.stream consume-start 뒤
300
+ // first-token 이벤트가 0건이어서 「첫 토큰까지의 구간」을 잴 표면이 없었다.
301
+ // turnStartedAt 를 재사용해 첫 비어 있지 않은 text chunk 에 정확히 한 번
302
+ // chat.turn/first-token 을 남긴다. 도구 호출이 먼저 흘러도 text 가 도착해야
303
+ // 기록되므로 request→first-token 구간은 그대로 측정된다. ISO 시각 좌표는
304
+ // pty record 및 TUI-BOOT-TIME(src/index.ts) 부팅 계측과의 대응용이다.
305
+ let firstTokenLogged = false;
306
+ const logFirstToken = (chunk: string): void => {
307
+ if (firstTokenLogged || !chunk || abortCtrl.signal.aborted) return;
308
+ firstTokenLogged = true;
309
+ const firstTokenAt = Date.now();
310
+ try {
311
+ deps.debugLog?.('chat.turn', 'first-token', {
312
+ ms: firstTokenAt - deps.turnStartedAt,
313
+ turnStartedAt: deps.turnStartedAt,
314
+ turnStartedAtIso,
315
+ firstTokenAtIso: new Date(firstTokenAt).toISOString(),
316
+ });
317
+ } catch { /* fail-soft — 관측이 턴을 막지 않는다 */ }
318
+ };
294
319
  const streamResult = await runDashboardPlainTurnStream({
295
320
  userText,
296
321
  abortCtrl,
297
322
  acpSession: deps.acpSession,
298
323
  onText: (chunk, accumulated) => {
324
+ logFirstToken(chunk);
299
325
  turnStreamRuntime.onText(chunk, accumulated);
300
326
  },
301
327
  onToolCall: (call) => {
@@ -387,12 +387,13 @@ import {
387
387
  import { resolveLocalEndpoints, runLocalLLMCompat } from '../../local-llm-test.js';
388
388
  import { getShellRegistry } from '../../shell-runner/registry.js';
389
389
  import { renderHandleStatusChip, type HandleStatus } from '../../status/chip.js';
390
- import { decideAttach } from '../../shell-runner/attach-routing.js';
391
390
  import type { DashboardTermSlashRuntime } from '../term-slash-runtime.js';
392
391
  import { resolveTerminalMoveDestination } from '../../terminal-matrix/mobility.js';
393
392
  import { loadPersistedSessions } from '../../terminal/session-persistence.js';
394
393
  import { dispatchTerminalModalObserve } from '../../skills/tools/terminal-modal.js';
395
394
  import { SlashCommandRegistry } from './registry.js';
395
+ import { registerShellSlash } from './shell-slash.js';
396
+ export { registerShellSlash } from './shell-slash.js';
396
397
  import { cronSecondDueAt, filterLoopRows, formatLoopsTable, localLoopRows, type LoopsTableRow } from './loops-table.js';
397
398
  import { loopCronVerdict } from '../../loops/verdict.js';
398
399
  import { checklistBoardSlash } from '../../release-loop/checklist-board.js';
@@ -2489,6 +2490,12 @@ export function buildDashboardSlashRegistry(nowDeps?: ContextNowDeps, decideLedg
2489
2490
  });
2490
2491
  if (result.kind === 'launch') {
2491
2492
  ctx.chatLines.push(ctx.accent(` ✅ 전제 검사 통과 — 골: ${result.goalFile}`));
2493
+ const { resolveObserveOnlyDecision } = await import('../../self-implement/observe-only.js');
2494
+ if (resolveObserveOnlyDecision().enabled) {
2495
+ ctx.chatLines.push(ctx.muted(' 관측 전용이라 런을 발사하지 않았습니다 · 코드도 안 바꿨습니다'));
2496
+ ctx.chatLines.push(ctx.muted(' 조회: elanous logs --category self-implement --since 10m'));
2497
+ return;
2498
+ }
2492
2499
  // ⭐ 런을 «띄운다» — detached 라 이 TUI 를 닫아도 런은 산다.
2493
2500
  // ⛔ spawn 을 여기서 새로 쓰지 않는다 — `launchDevGoalFileDetached` «한 자리»가 인자·env 를 갖는다.
2494
2501
  // ⛔ 그리고 「띄웠다」와 「끝났다」는 다른 값이다 — 이 표면은 «띄운 것»까지만 말한다.
@@ -3715,143 +3722,8 @@ export function buildDashboardSlashRegistry(nowDeps?: ContextNowDeps, decideLedg
3715
3722
  ctx.setChatScrollOffset(-1);
3716
3723
  });
3717
3724
 
3718
- registry.register(['shell', 'sh'], async (args, ctx) => {
3719
- // SP-C — /shell list|kill|attach family. Talks to the
3720
- // ShellRegistry singleton (set up in the boot block in
3721
- // dashboard/index.ts). Kill uses prefix matching on id so users
3722
- // don't have to type the full slug; attach routes a vw-mode handle
3723
- // into the foreground via VW switch.
3724
- //
3725
- // getShellRegistry + renderHandleStatusChip + decideAttach hoisted
3726
- // from dynamic to static imports here. Host-local helpers
3727
- // (shellSlashRuntime + openShellRollupPopup + virtualWindows ops)
3728
- // come via ctx.shellSlash.
3729
- const sub = (args[0] ?? '').toLowerCase();
3730
- const reg = getShellRegistry();
3731
- if (!sub || sub === 'help') {
3732
- for (const line of ctx.shellSlash.slashRuntime.helpLines()) ctx.chatLines.push(line);
3733
- ctx.setChatScrollOffset(-1);
3734
- return;
3735
- }
3736
- const resolveHandle = (needle: string) => {
3737
- const want = needle.toLowerCase();
3738
- if (!want) return null;
3739
- const exact = reg.get(needle);
3740
- if (exact) return exact;
3741
- const all = reg.list();
3742
- const matches = all.filter(h => h.id.toLowerCase().startsWith(want));
3743
- if (matches.length === 1) return matches[0]!;
3744
- return matches.length > 1 ? { ambiguous: matches } as const : null;
3745
- };
3746
- if (sub === 'rollup') {
3747
- // N2 — same popup as the 🐚 pill click, openable from
3748
- // keyboard-only sessions (SSH / nested tmux).
3749
- await ctx.shellSlash.openRollupPopup();
3750
- return;
3751
- }
3752
- if (sub === 'list') {
3753
- // N3 — `/shell list all` bypasses the 30s settled TTL so users
3754
- // can audit everything. Default stays live-only.
3755
- const showSettled = (args[1] ?? '').toLowerCase() === 'all';
3756
- const all = reg.list(showSettled ? { includeSettled: true } : undefined);
3757
- ctx.chatLines.push('');
3758
- if (all.length === 0) {
3759
- ctx.chatLines.push(ctx.shellSlash.slashRuntime.emptyListLine(showSettled));
3760
- ctx.setChatScrollOffset(-1);
3761
- return;
3762
- }
3763
- ctx.chatLines.push(ctx.shellSlash.slashRuntime.listHeaderLine(all.length, showSettled));
3764
- for (const h of all) {
3765
- const chip = renderHandleStatusChip(h.status);
3766
- const label = reg.getVwLabel(h.id);
3767
- const idTail = h.id.length > 10 ? `…${h.id.slice(-8)}` : h.id;
3768
- ctx.chatLines.push(ctx.shellSlash.slashRuntime.listEntryLine({
3769
- idTail,
3770
- chip,
3771
- mode: h.mode,
3772
- label,
3773
- }));
3774
- }
3775
- ctx.setChatScrollOffset(-1);
3776
- return;
3777
- }
3778
- if (sub === 'kill') {
3779
- const needle = args[1] ?? '';
3780
- if (!needle) {
3781
- ctx.chatLines.push(ctx.shellSlash.slashRuntime.killUsageLine());
3782
- ctx.setChatScrollOffset(-1);
3783
- return;
3784
- }
3785
- const res = resolveHandle(needle);
3786
- if (!res) {
3787
- ctx.chatLines.push(ctx.shellSlash.slashRuntime.noHandleMatchesLine(needle));
3788
- } else if ('ambiguous' in res) {
3789
- ctx.chatLines.push(ctx.shellSlash.slashRuntime.ambiguousHeaderLine(needle));
3790
- for (const h of res.ambiguous) {
3791
- ctx.chatLines.push(ctx.shellSlash.slashRuntime.ambiguousEntryLine({ id: h.id }));
3792
- }
3793
- } else {
3794
- try {
3795
- res.kill();
3796
- ctx.chatLines.push(ctx.shellSlash.slashRuntime.killedLine(res.id));
3797
- } catch (err) {
3798
- ctx.chatLines.push(ctx.shellSlash.slashRuntime.killFailedLine(
3799
- err instanceof Error ? err.message : String(err),
3800
- ));
3801
- }
3802
- }
3803
- ctx.setChatScrollOffset(-1);
3804
- return;
3805
- }
3806
- if (sub === 'attach') {
3807
- const needle = args[1] ?? '';
3808
- if (!needle) {
3809
- ctx.chatLines.push(ctx.shellSlash.slashRuntime.attachUsageLine());
3810
- ctx.setChatScrollOffset(-1);
3811
- return;
3812
- }
3813
- const res = resolveHandle(needle);
3814
- if (!res) {
3815
- ctx.chatLines.push(ctx.shellSlash.slashRuntime.noHandleMatchesLine(needle));
3816
- ctx.setChatScrollOffset(-1);
3817
- return;
3818
- }
3819
- if ('ambiguous' in res) {
3820
- ctx.chatLines.push(ctx.shellSlash.slashRuntime.ambiguousHeaderLine(needle));
3821
- for (const h of res.ambiguous) {
3822
- ctx.chatLines.push(ctx.shellSlash.slashRuntime.ambiguousEntryLine({ id: h.id }));
3823
- }
3824
- ctx.setChatScrollOffset(-1);
3825
- return;
3826
- }
3827
- // SRF-2 — attach routing by mode, delegated to the pure
3828
- // decision fn in shell-runner/attach-routing.ts.
3829
- const outcome = decideAttach(res, {
3830
- getVwLabel: (id) => reg.getVwLabel(id),
3831
- resolveVwIdByLabel: (label) => ctx.shellSlash.resolveVwIdByLabel(label),
3832
- });
3833
- if (outcome.kind === 'switch-vw') {
3834
- ctx.shellSlash.virtualWindowsSwitchTo(outcome.windowId);
3835
- ctx.chatLines.push(ctx.shellSlash.slashRuntime.attachedLine(
3836
- outcome.windowId,
3837
- outcome.label,
3838
- outcome.mode,
3839
- ));
3840
- } else if (outcome.kind === 'bg') {
3841
- ctx.chatLines.push(ctx.shellSlash.slashRuntime.bgAttachWarningLine(outcome.status));
3842
- ctx.chatLines.push(ctx.shellSlash.slashRuntime.bgAttachHintLine());
3843
- } else if (outcome.kind === 'no-window') {
3844
- ctx.chatLines.push(ctx.shellSlash.slashRuntime.noWindowAttachWarningLine(outcome.reason));
3845
- ctx.chatLines.push(ctx.shellSlash.slashRuntime.noWindowAttachHintLine());
3846
- } else {
3847
- ctx.chatLines.push(ctx.shellSlash.slashRuntime.genericAttachWarningLine(outcome.reason));
3848
- }
3849
- ctx.setChatScrollOffset(-1);
3850
- return;
3851
- }
3852
- ctx.chatLines.push(ctx.shellSlash.slashRuntime.unknownSubcommandLine(sub));
3853
- ctx.setChatScrollOffset(-1);
3854
- });
3725
+
3726
+ registerShellSlash(registry);
3855
3727
 
3856
3728
  // ── B-3.b ─────────────────────────────────────────────────────────
3857
3729
 
@@ -0,0 +1,145 @@
1
+ import type { DashboardSlashContext, DashboardSlashReturn } from './dashboard-handlers.js';
2
+ import { getShellRegistry } from '../../shell-runner/registry.js';
3
+ import { renderHandleStatusChip } from '../../status/chip.js';
4
+ import { decideAttach } from '../../shell-runner/attach-routing.js';
5
+ import type { SlashCommandRegistry } from './registry.js';
6
+
7
+ export function registerShellSlash(registry: SlashCommandRegistry<DashboardSlashContext, DashboardSlashReturn>): void {
8
+ registry.register(['shell', 'sh'], async (args, ctx) => {
9
+ // SP-C — /shell list|kill|attach family. Talks to the
10
+ // ShellRegistry singleton (set up in the boot block in
11
+ // dashboard/index.ts). Kill uses prefix matching on id so users
12
+ // don't have to type the full slug; attach routes a vw-mode handle
13
+ // into the foreground via VW switch.
14
+ //
15
+ // getShellRegistry + renderHandleStatusChip + decideAttach hoisted
16
+ // from dynamic to static imports here. Host-local helpers
17
+ // (shellSlashRuntime + openShellRollupPopup + virtualWindows ops)
18
+ // come via ctx.shellSlash.
19
+ const sub = (args[0] ?? '').toLowerCase();
20
+ const reg = getShellRegistry();
21
+ if (!sub || sub === 'help') {
22
+ for (const line of ctx.shellSlash.slashRuntime.helpLines()) ctx.chatLines.push(line);
23
+ ctx.setChatScrollOffset(-1);
24
+ return;
25
+ }
26
+ const resolveHandle = (needle: string) => {
27
+ const want = needle.toLowerCase();
28
+ if (!want) return null;
29
+ const exact = reg.get(needle);
30
+ if (exact) return exact;
31
+ const all = reg.list();
32
+ const matches = all.filter(h => h.id.toLowerCase().startsWith(want));
33
+ if (matches.length === 1) return matches[0]!;
34
+ return matches.length > 1 ? { ambiguous: matches } as const : null;
35
+ };
36
+ if (sub === 'rollup') {
37
+ // N2 — same popup as the 🐚 pill click, openable from
38
+ // keyboard-only sessions (SSH / nested tmux).
39
+ await ctx.shellSlash.openRollupPopup();
40
+ return;
41
+ }
42
+ if (sub === 'list') {
43
+ // N3 — `/shell list all` bypasses the 30s settled TTL so users
44
+ // can audit everything. Default stays live-only.
45
+ const showSettled = (args[1] ?? '').toLowerCase() === 'all';
46
+ const all = reg.list(showSettled ? { includeSettled: true } : undefined);
47
+ ctx.chatLines.push('');
48
+ if (all.length === 0) {
49
+ ctx.chatLines.push(ctx.shellSlash.slashRuntime.emptyListLine(showSettled));
50
+ ctx.setChatScrollOffset(-1);
51
+ return;
52
+ }
53
+ ctx.chatLines.push(ctx.shellSlash.slashRuntime.listHeaderLine(all.length, showSettled));
54
+ for (const h of all) {
55
+ const chip = renderHandleStatusChip(h.status);
56
+ const label = reg.getVwLabel(h.id);
57
+ const idTail = h.id.length > 10 ? `…${h.id.slice(-8)}` : h.id;
58
+ ctx.chatLines.push(ctx.shellSlash.slashRuntime.listEntryLine({
59
+ idTail,
60
+ chip,
61
+ mode: h.mode,
62
+ label,
63
+ }));
64
+ }
65
+ ctx.setChatScrollOffset(-1);
66
+ return;
67
+ }
68
+ if (sub === 'kill') {
69
+ const needle = args[1] ?? '';
70
+ if (!needle) {
71
+ ctx.chatLines.push(ctx.shellSlash.slashRuntime.killUsageLine());
72
+ ctx.setChatScrollOffset(-1);
73
+ return;
74
+ }
75
+ const res = resolveHandle(needle);
76
+ if (!res) {
77
+ ctx.chatLines.push(ctx.shellSlash.slashRuntime.noHandleMatchesLine(needle));
78
+ } else if ('ambiguous' in res) {
79
+ ctx.chatLines.push(ctx.shellSlash.slashRuntime.ambiguousHeaderLine(needle));
80
+ for (const h of res.ambiguous) {
81
+ ctx.chatLines.push(ctx.shellSlash.slashRuntime.ambiguousEntryLine({ id: h.id }));
82
+ }
83
+ } else {
84
+ try {
85
+ res.kill();
86
+ ctx.chatLines.push(ctx.shellSlash.slashRuntime.killedLine(res.id));
87
+ } catch (err) {
88
+ ctx.chatLines.push(ctx.shellSlash.slashRuntime.killFailedLine(
89
+ err instanceof Error ? err.message : String(err),
90
+ ));
91
+ }
92
+ }
93
+ ctx.setChatScrollOffset(-1);
94
+ return;
95
+ }
96
+ if (sub === 'attach') {
97
+ const needle = args[1] ?? '';
98
+ if (!needle) {
99
+ ctx.chatLines.push(ctx.shellSlash.slashRuntime.attachUsageLine());
100
+ ctx.setChatScrollOffset(-1);
101
+ return;
102
+ }
103
+ const res = resolveHandle(needle);
104
+ if (!res) {
105
+ ctx.chatLines.push(ctx.shellSlash.slashRuntime.noHandleMatchesLine(needle));
106
+ ctx.setChatScrollOffset(-1);
107
+ return;
108
+ }
109
+ if ('ambiguous' in res) {
110
+ ctx.chatLines.push(ctx.shellSlash.slashRuntime.ambiguousHeaderLine(needle));
111
+ for (const h of res.ambiguous) {
112
+ ctx.chatLines.push(ctx.shellSlash.slashRuntime.ambiguousEntryLine({ id: h.id }));
113
+ }
114
+ ctx.setChatScrollOffset(-1);
115
+ return;
116
+ }
117
+ // SRF-2 — attach routing by mode, delegated to the pure
118
+ // decision fn in shell-runner/attach-routing.ts.
119
+ const outcome = decideAttach(res, {
120
+ getVwLabel: (id) => reg.getVwLabel(id),
121
+ resolveVwIdByLabel: (label) => ctx.shellSlash.resolveVwIdByLabel(label),
122
+ });
123
+ if (outcome.kind === 'switch-vw') {
124
+ ctx.shellSlash.virtualWindowsSwitchTo(outcome.windowId);
125
+ ctx.chatLines.push(ctx.shellSlash.slashRuntime.attachedLine(
126
+ outcome.windowId,
127
+ outcome.label,
128
+ outcome.mode,
129
+ ));
130
+ } else if (outcome.kind === 'bg') {
131
+ ctx.chatLines.push(ctx.shellSlash.slashRuntime.bgAttachWarningLine(outcome.status));
132
+ ctx.chatLines.push(ctx.shellSlash.slashRuntime.bgAttachHintLine());
133
+ } else if (outcome.kind === 'no-window') {
134
+ ctx.chatLines.push(ctx.shellSlash.slashRuntime.noWindowAttachWarningLine(outcome.reason));
135
+ ctx.chatLines.push(ctx.shellSlash.slashRuntime.noWindowAttachHintLine());
136
+ } else {
137
+ ctx.chatLines.push(ctx.shellSlash.slashRuntime.genericAttachWarningLine(outcome.reason));
138
+ }
139
+ ctx.setChatScrollOffset(-1);
140
+ return;
141
+ }
142
+ ctx.chatLines.push(ctx.shellSlash.slashRuntime.unknownSubcommandLine(sub));
143
+ ctx.setChatScrollOffset(-1);
144
+ });
145
+ }
@@ -23,6 +23,13 @@ export const LOG_DIET_KEYS: Readonly<Record<string, 'repeat' | 'consecutive'>> =
23
23
  // read it back from logs and count rows (`admissionCounts`) — it is a judgment-path event.
24
24
  };
25
25
 
26
+ /** LOG-DIET-2 — per-key fold windows (ms). "State echo" keys whose value rarely changes fold on a
27
+ * longer window than the default 60s, so a slow-rotation emitter (one row per question per tick)
28
+ * stays folded instead of re-admitting every window. Keys not listed here keep the guard default. */
29
+ export const LOG_DIET_KEY_WINDOW_MS: Readonly<Record<string, number>> = {
30
+ 'hitl.card-bridge/skipped': 30 * 60_000,
31
+ };
32
+
26
33
  export interface LogDietSummary {
27
34
  category: string;
28
35
  event: string;
@@ -44,6 +51,8 @@ interface Stream {
44
51
  sessionId?: string;
45
52
  value: string;
46
53
  lastEmittedAt: number;
54
+ /** Fold window pinned at stream creation: `keyWindowMs[key] ?? windowMs`. */
55
+ windowMs: number;
47
56
  count: number;
48
57
  firstSuppressedAt?: string;
49
58
  lastSuppressedAt?: string;
@@ -66,6 +75,7 @@ function stableValue(value: unknown): string {
66
75
 
67
76
  export class LogDietGuard {
68
77
  private readonly windowMs: number;
78
+ private readonly keyWindowMs: Readonly<Record<string, number>>;
69
79
  private readonly now: () => number;
70
80
  private readonly keys: Readonly<Record<string, Policy>>;
71
81
  private readonly maxStreams: number;
@@ -76,8 +86,9 @@ export class LogDietGuard {
76
86
  private lastSummaryReleaseAt = Number.NEGATIVE_INFINITY;
77
87
  private pendingStreams = 0;
78
88
 
79
- constructor(opts: { windowMs?: number; now?: () => number; keys?: Readonly<Record<string, Policy>>; maxStreams?: number; summaryMinIntervalMs?: number; summaryMaxPending?: number } = {}) {
89
+ constructor(opts: { windowMs?: number; keyWindowMs?: Readonly<Record<string, number>>; now?: () => number; keys?: Readonly<Record<string, Policy>>; maxStreams?: number; summaryMinIntervalMs?: number; summaryMaxPending?: number } = {}) {
80
90
  this.windowMs = opts.windowMs ?? LOG_DIET_WINDOW_MS;
91
+ this.keyWindowMs = opts.keyWindowMs ?? LOG_DIET_KEY_WINDOW_MS;
81
92
  this.now = opts.now ?? Date.now;
82
93
  this.keys = opts.keys ?? LOG_DIET_KEYS;
83
94
  this.maxStreams = Math.max(1, opts.maxStreams ?? 2000);
@@ -92,7 +103,7 @@ export class LogDietGuard {
92
103
  category: stream.category,
93
104
  event: stream.event,
94
105
  count: stream.count,
95
- windowMs: this.windowMs,
106
+ windowMs: stream.windowMs,
96
107
  firstSuppressedAt: stream.firstSuppressedAt!,
97
108
  lastSuppressedAt: stream.lastSuppressedAt!,
98
109
  ...(stream.runId !== undefined ? { runId: stream.runId } : {}),
@@ -121,12 +132,13 @@ export class LogDietGuard {
121
132
  ? [rec.category, rec.event, value]
122
133
  : [rec.category, rec.event, sessionId, runId]);
123
134
  const time = this.now();
135
+ const windowMs = this.keyWindowMs[`${rec.category}/${rec.event}`] ?? this.windowMs;
124
136
  const summaries: LogDietSummary[] = [];
125
137
  const stream = this.streams.get(key);
126
138
  if (stream) {
127
139
  this.streams.delete(key); // Evict the least recently observed flow.
128
140
  this.streams.set(key, stream);
129
- if ((policy === 'repeat' || stream.value === value) && time - stream.lastEmittedAt < this.windowMs) {
141
+ if ((policy === 'repeat' || stream.value === value) && time - stream.lastEmittedAt < stream.windowMs) {
130
142
  if (stream.count === 0) this.pendingStreams++;
131
143
  stream.count++;
132
144
  const at = new Date(time).toISOString();
@@ -154,7 +166,7 @@ export class LogDietGuard {
154
166
  this.streams.set(key, { category: rec.category, event: rec.event,
155
167
  ...(typeof runId === 'string' ? { runId } : {}),
156
168
  ...(sessionId !== undefined ? { sessionId } : {}),
157
- value, lastEmittedAt: time, count: 0 });
169
+ value, lastEmittedAt: time, windowMs, count: 0 });
158
170
  return { pass: true, summaries };
159
171
  }
160
172