elanous 0.2.24 → 0.2.25

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 (551) hide show
  1. package/apps/pwa/out/404/index.html +1 -1
  2. package/apps/pwa/out/404.html +1 -1
  3. package/apps/pwa/out/_next/static/chunks/1027.a0f04663d24c2779.js +1 -0
  4. package/apps/pwa/out/_next/static/chunks/1038.676007ae505822e7.js +1 -0
  5. package/apps/pwa/out/_next/static/chunks/1113.a37eadf7f740d955.js +1 -0
  6. package/apps/pwa/out/_next/static/chunks/112-fa7c526c20ce1405.js +1 -0
  7. package/apps/pwa/out/_next/static/chunks/1144.5fa1fa1d48dbcd12.js +36 -0
  8. package/apps/pwa/out/_next/static/chunks/1146.80d15ea7c6e6ee95.js +1 -0
  9. package/apps/pwa/out/_next/static/chunks/1157.f08bf2b70915e176.js +148 -0
  10. package/apps/pwa/out/_next/static/chunks/119b405e.8fdd0e44d1ff37aa.js +1 -0
  11. package/apps/pwa/out/_next/static/chunks/1296.04560d98e73fbf51.js +1 -0
  12. package/apps/pwa/out/_next/static/chunks/1314-f604ba013ec535b0.js +1 -0
  13. package/apps/pwa/out/_next/static/chunks/1454-37fd16f479f5554a.js +1 -0
  14. package/apps/pwa/out/_next/static/chunks/1464.f3209af0d8ae4ff2.js +1 -0
  15. package/apps/pwa/out/_next/static/chunks/{8532.a86e99acf9b761cb.js → 1516.83dd2c1b86b4e507.js} +2 -2
  16. package/apps/pwa/out/_next/static/chunks/{89849432.9eaa2f4c9c010965.js → 16e57f67.3ea19e893461e611.js} +3 -3
  17. package/apps/pwa/out/_next/static/chunks/1729-d73dd25e564679d4.js +1 -0
  18. package/apps/pwa/out/_next/static/chunks/{1505.5826671109111e75.js → 1743.563d3168e95825ef.js} +2 -2
  19. package/apps/pwa/out/_next/static/chunks/1843.5924c24295243261.js +27 -0
  20. package/apps/pwa/out/_next/static/chunks/1987.e28149724b92918b.js +1 -0
  21. package/apps/pwa/out/_next/static/chunks/2066-5ca18ffa5a4be68b.js +1 -0
  22. package/apps/pwa/out/_next/static/chunks/2240.d10a66695155fd93.js +1 -0
  23. package/apps/pwa/out/_next/static/chunks/2391.e2cbc98d4abbb41a.js +1 -0
  24. package/apps/pwa/out/_next/static/chunks/2528.3868070ef1be69f9.js +24 -0
  25. package/apps/pwa/out/_next/static/chunks/2566-734cb83bbd405886.js +1 -0
  26. package/apps/pwa/out/_next/static/chunks/2697.76ca2ac3efef6f3b.js +1 -0
  27. package/apps/pwa/out/_next/static/chunks/275.0e6bad414729bfa0.js +32 -0
  28. package/apps/pwa/out/_next/static/chunks/2803-33bdae771855a8d1.js +1 -0
  29. package/apps/pwa/out/_next/static/chunks/2846.d6a433b8663819a5.js +309 -0
  30. package/apps/pwa/out/_next/static/chunks/3143.257997a5f1ed79df.js +34 -0
  31. package/apps/pwa/out/_next/static/chunks/{5967-c0a80f8ffe5d4050.js → 3259-86f3be56e43eaf6a.js} +1 -1
  32. package/apps/pwa/out/_next/static/chunks/3280-e177c33bfbdcfb0a.js +1 -0
  33. package/apps/pwa/out/_next/static/chunks/3294-2b6a6d45a46a6c1c.js +1 -0
  34. package/apps/pwa/out/_next/static/chunks/3309.364573ceedbdfd5f.js +1 -0
  35. package/apps/pwa/out/_next/static/chunks/3522.758840fc5e7fe630.js +287 -0
  36. package/apps/pwa/out/_next/static/chunks/3525-a7c989c1a661e880.js +1 -0
  37. package/apps/pwa/out/_next/static/chunks/3694.b1a66387756458c0.js +1 -0
  38. package/apps/pwa/out/_next/static/chunks/370.124f9e678a76fc01.js +1 -0
  39. package/apps/pwa/out/_next/static/chunks/3797-9643105335e660fe.js +1 -0
  40. package/apps/pwa/out/_next/static/chunks/{5578.ac963634373b28c6.js → 4084.15ecaf4240bd9e77.js} +2 -2
  41. package/apps/pwa/out/_next/static/chunks/4089-b3382b8843114eee.js +1 -0
  42. package/apps/pwa/out/_next/static/chunks/{8438.ee7f0df3b3f6fcb4.js → 4204.a409ab6250c0f6a8.js} +1 -1
  43. package/apps/pwa/out/_next/static/chunks/4293.928a8d573c16aab7.js +1 -0
  44. package/apps/pwa/out/_next/static/chunks/4402.f9238a3b18a7bd43.js +1 -0
  45. package/apps/pwa/out/_next/static/chunks/4490-9b090b0f9427f902.js +1 -0
  46. package/apps/pwa/out/_next/static/chunks/4548.13502d0ca3b4f862.js +8 -0
  47. package/apps/pwa/out/_next/static/chunks/4565-67e4c620597965c8.js +1 -0
  48. package/apps/pwa/out/_next/static/chunks/{7905.b230b9d06cb4ad5d.js → 4593.10f5b9bd702d4a6c.js} +1 -1
  49. package/apps/pwa/out/_next/static/chunks/4599-548bc96cda44a5a7.js +1 -0
  50. package/apps/pwa/out/_next/static/chunks/4625.206574e33a9e7ae8.js +104 -0
  51. package/apps/pwa/out/_next/static/chunks/4862-392c9a71f0d8dfb4.js +1 -0
  52. package/apps/pwa/out/_next/static/chunks/5054.2906d1b02542edc5.js +149 -0
  53. package/apps/pwa/out/_next/static/chunks/{8569.b853a8daa8f31d12.js → 5081.a240b63fad28663a.js} +1 -1
  54. package/apps/pwa/out/_next/static/chunks/5102-c822bbbee5a022a4.js +1 -0
  55. package/apps/pwa/out/_next/static/chunks/5194-8c93f2e7e4b6f717.js +1 -0
  56. package/apps/pwa/out/_next/static/chunks/5305-bacd7eca0b9a5848.js +1 -0
  57. package/apps/pwa/out/_next/static/chunks/5311.9071ee3f44fd7ff5.js +1 -0
  58. package/apps/pwa/out/_next/static/chunks/5369.9f34353442daa421.js +1 -0
  59. package/apps/pwa/out/_next/static/chunks/{2528.0af5c0e1fad88df6.js → 5408.377c8c543635b81f.js} +1 -1
  60. package/apps/pwa/out/_next/static/chunks/{9502-32c5dc22e8f120f5.js → 5492-e05e26a033ba80d2.js} +3 -3
  61. package/apps/pwa/out/_next/static/chunks/5785-ea8d2c633b6688e3.js +1 -0
  62. package/apps/pwa/out/_next/static/chunks/589-49d730cb8138b397.js +1 -0
  63. package/apps/pwa/out/_next/static/chunks/5904-264a6412ae3c9028.js +1 -0
  64. package/apps/pwa/out/_next/static/chunks/5980.728531d5c566535c.js +1 -0
  65. package/apps/pwa/out/_next/static/chunks/599-a914cc0468f56143.js +1 -0
  66. package/apps/pwa/out/_next/static/chunks/6011.f525002e21bef0ac.js +23 -0
  67. package/apps/pwa/out/_next/static/chunks/6132.4381ab93683f1acf.js +1 -0
  68. package/apps/pwa/out/_next/static/chunks/6149.2e698635e454d8f6.js +1 -0
  69. package/apps/pwa/out/_next/static/chunks/{5974.360f8441eb0ac1ec.js → 6196.34d6b229079e9e28.js} +1 -1
  70. package/apps/pwa/out/_next/static/chunks/6356-0afafc4230cf9767.js +1 -0
  71. package/apps/pwa/out/_next/static/chunks/6406.64756073f7df35b8.js +77 -0
  72. package/apps/pwa/out/_next/static/chunks/6479-16e62aedafa0e310.js +1 -0
  73. package/apps/pwa/out/_next/static/chunks/6599.b5246b46a2453329.js +64 -0
  74. package/apps/pwa/out/_next/static/chunks/{ce383d63.d2ede338788ed18e.js → 65ebff95.081daeff622d238e.js} +1 -1
  75. package/apps/pwa/out/_next/static/chunks/6610.5c26eec011565acb.js +1 -0
  76. package/apps/pwa/out/_next/static/chunks/666.37d18474edc1c552.js +2 -0
  77. package/apps/pwa/out/_next/static/chunks/6904.a0b5b1ed4f2d2c20.js +1 -0
  78. package/apps/pwa/out/_next/static/chunks/{83cfc5c8.349535543c1548b6.js → 6def8a8e.c81f9ca41028eccf.js} +1 -1
  79. package/apps/pwa/out/_next/static/chunks/7247-1f4aba94aba50d9f.js +1 -0
  80. package/apps/pwa/out/_next/static/chunks/7274-e71a7c5b7760cd02.js +1 -0
  81. package/apps/pwa/out/_next/static/chunks/7290.1fcaeef3adb5d0d4.js +1 -0
  82. package/apps/pwa/out/_next/static/chunks/7477-2c64e42760f82f33.js +1 -0
  83. package/apps/pwa/out/_next/static/chunks/{2721.bc9a8f36bd85c07a.js → 7483.ba01c6c209b81bba.js} +1 -1
  84. package/apps/pwa/out/_next/static/chunks/7505-47002b76ff1aef6c.js +1 -0
  85. package/apps/pwa/out/_next/static/chunks/7600-11884ca4da68e5d9.js +1 -0
  86. package/apps/pwa/out/_next/static/chunks/7607.40d8bb3689697ccb.js +62 -0
  87. package/apps/pwa/out/_next/static/chunks/{6702.ebbd165d5e4a4a14.js → 7752.5cbdd0b433c54af9.js} +1 -1
  88. package/apps/pwa/out/_next/static/chunks/7763.f51fcc19ca1414ec.js +1 -0
  89. package/apps/pwa/out/_next/static/chunks/7785.846140c859b1adf6.js +1 -0
  90. package/apps/pwa/out/_next/static/chunks/7807-a0fdac6393e0bf36.js +1 -0
  91. package/apps/pwa/out/_next/static/chunks/7837-20a63b4b7e9342b1.js +1 -0
  92. package/apps/pwa/out/_next/static/chunks/800.7815414cf280545d.js +1 -0
  93. package/apps/pwa/out/_next/static/chunks/{8925-2abfb48af477fb7f.js → 8085-1e5fce59500a2cc2.js} +1 -1
  94. package/apps/pwa/out/_next/static/chunks/8100.415f2105faa63e97.js +1 -0
  95. package/apps/pwa/out/_next/static/chunks/8290.701aa42ed13aa767.js +226 -0
  96. package/apps/pwa/out/_next/static/chunks/{b4e12462-5fab4a813a63dadd.js → 83a80514-b897b64df43ce108.js} +1 -1
  97. package/apps/pwa/out/_next/static/chunks/8444.d9c74214a3145a43.js +93 -0
  98. package/apps/pwa/out/_next/static/chunks/8569.98c915534928c7f9.js +24 -0
  99. package/apps/pwa/out/_next/static/chunks/{8264.00e434fbd02e9311.js → 8578.dff22d988cc2b106.js} +3 -3
  100. package/apps/pwa/out/_next/static/chunks/8591.b1c7f876e5ec7cfb.js +1 -0
  101. package/apps/pwa/out/_next/static/chunks/8715-f63756021d3ab989.js +1 -0
  102. package/apps/pwa/out/_next/static/chunks/8879.776c2ec7732aa114.js +115 -0
  103. package/apps/pwa/out/_next/static/chunks/8881.ddca15b3c82c490c.js +1 -0
  104. package/apps/pwa/out/_next/static/chunks/8946.5da5c87f32a2e1a8.js +41 -0
  105. package/apps/pwa/out/_next/static/chunks/9117.080b9b75be90e14d.js +74 -0
  106. package/apps/pwa/out/_next/static/chunks/9167.f3ecb28f367d6e69.js +94 -0
  107. package/apps/pwa/out/_next/static/chunks/9224.66095370ee28c93b.js +1 -0
  108. package/apps/pwa/out/_next/static/chunks/9238-0682b013c83d6449.js +1 -0
  109. package/apps/pwa/out/_next/static/chunks/{7518.49161e8f5814abdb.js → 9311.24c8f5ea793253dd.js} +1 -1
  110. package/apps/pwa/out/_next/static/chunks/{9976.8f28864317639fe6.js → 94.4cfed21c0b781a06.js} +3 -3
  111. package/apps/pwa/out/_next/static/chunks/9449.d3ed795da4befb1c.js +1 -0
  112. package/apps/pwa/out/_next/static/chunks/949.1e7d45ccb71580aa.js +90 -0
  113. package/apps/pwa/out/_next/static/chunks/9638-d268329f2c6f4f8d.js +1 -0
  114. package/apps/pwa/out/_next/static/chunks/{0e3acd34.d42b2ef87fdf4234.js → 973cbf1b.3bbcf2b41548eca7.js} +1 -1
  115. package/apps/pwa/out/_next/static/chunks/9842-d6644eb53d3dc6bf.js +1 -0
  116. package/apps/pwa/out/_next/static/chunks/9863.94ca3263e760696e.js +1 -0
  117. package/apps/pwa/out/_next/static/chunks/{6571-926ddf024a6ad5df.js → 9917-9e26abc5f7772735.js} +1 -1
  118. package/apps/pwa/out/_next/static/chunks/9938.b23e4d4dfa0114cd.js +79 -0
  119. package/apps/pwa/out/_next/static/chunks/{740.90b31555290236a9.js → 9974.e77b4ff4884557b3.js} +2 -2
  120. package/apps/pwa/out/_next/static/chunks/{4c5e95ce.83e9b16add6fcd8c.js → ab4d57c2.e90bc2cb31949045.js} +7 -7
  121. package/apps/pwa/out/_next/static/chunks/app/_not-found/page-d9babd8795f396a5.js +1 -0
  122. package/apps/pwa/out/_next/static/chunks/app/approvals/page-9360b1285b2a346e.js +1 -0
  123. package/apps/pwa/out/_next/static/chunks/app/autopilot/page-f08f6529d09ffae1.js +1 -0
  124. package/apps/pwa/out/_next/static/chunks/app/board/page-f000d54d258f9ef6.js +1 -0
  125. package/apps/pwa/out/_next/static/chunks/app/botlab/{page-24282bf9f90031a5.js → page-b12149c51f7d04b1.js} +1 -1
  126. package/apps/pwa/out/_next/static/chunks/app/bots/page-22f674e7e4c2c9d5.js +1 -0
  127. package/apps/pwa/out/_next/static/chunks/app/ceo/page-8888733e40cea6d1.js +1 -0
  128. package/apps/pwa/out/_next/static/chunks/app/chat/page-9717ec6964b92276.js +1 -0
  129. package/apps/pwa/out/_next/static/chunks/app/consult/page-44eaad486bc98a45.js +1 -0
  130. package/apps/pwa/out/_next/static/chunks/app/control/page-97fa6cf3d34c7eb9.js +1 -0
  131. package/apps/pwa/out/_next/static/chunks/app/decisions/page-305cd294e754906e.js +1 -0
  132. package/apps/pwa/out/_next/static/chunks/app/design-check/page-dea4b795741126fd.js +1 -0
  133. package/apps/pwa/out/_next/static/chunks/app/editor/page-35e05d7450461a67.js +1 -0
  134. package/apps/pwa/out/_next/static/chunks/app/exec/page-45889e7070d11126.js +1 -0
  135. package/apps/pwa/out/_next/static/chunks/app/field/page-16a2e893f83ae4d0.js +1 -0
  136. package/apps/pwa/out/_next/static/chunks/app/healthz/route-d9babd8795f396a5.js +1 -0
  137. package/apps/pwa/out/_next/static/chunks/app/inside/page-b2638013c0bf7dfd.js +1 -0
  138. package/apps/pwa/out/_next/static/chunks/app/intake/page-56888bc744e08dac.js +1 -0
  139. package/apps/pwa/out/_next/static/chunks/app/layout-c44f93a41167536f.js +1 -0
  140. package/apps/pwa/out/_next/static/chunks/app/live/page-952c6ceec6d9de38.js +1 -0
  141. package/apps/pwa/out/_next/static/chunks/app/live-run/page-6d0202af568f4c63.js +1 -0
  142. package/apps/pwa/out/_next/static/chunks/app/loops/page-1b810474507f3702.js +1 -0
  143. package/apps/pwa/out/_next/static/chunks/app/market/page-74366ae2693a7d95.js +1 -0
  144. package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-4fb6fc34e20c07b7.js +1 -0
  145. package/apps/pwa/out/_next/static/chunks/app/morning/page-e9502921f4f01b1f.js +1 -0
  146. package/apps/pwa/out/_next/static/chunks/app/not-found-b6169ea2f09cf287.js +1 -0
  147. package/apps/pwa/out/_next/static/chunks/app/observatory/page-6a14333d1b1b3967.js +1 -0
  148. package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-8c91a9a66c9ec90a.js +1 -0
  149. package/apps/pwa/out/_next/static/chunks/app/ops/release/{page-1d809a87139dd024.js → page-4e634c5b98fd4e93.js} +1 -1
  150. package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-ed3070d637850548.js +1 -0
  151. package/apps/pwa/out/_next/static/chunks/app/outputs/{page-b92caddb5c715f30.js → page-b9cc8a10bc6078b4.js} +1 -1
  152. package/apps/pwa/out/_next/static/chunks/app/page-3d3fc73dd187ed52.js +1 -0
  153. package/apps/pwa/out/_next/static/chunks/app/reflection/page-128458c8d86fbb5f.js +1 -0
  154. package/apps/pwa/out/_next/static/chunks/app/scheduler/page-9c04dac0831c2bbb.js +1 -0
  155. package/apps/pwa/out/_next/static/chunks/app/sessions/page-cf0c2b0183991d09.js +1 -0
  156. package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-04de9ca6d52a3893.js +1 -0
  157. package/apps/pwa/out/_next/static/chunks/app/settings/page-62527677bbc2fdc4.js +1 -0
  158. package/apps/pwa/out/_next/static/chunks/app/setup/done/page-9a2e09c4a311764c.js +1 -0
  159. package/apps/pwa/out/_next/static/chunks/app/setup/layout-d9babd8795f396a5.js +1 -0
  160. package/apps/pwa/out/_next/static/chunks/app/setup/page-bfeb35d69e8b24bb.js +1 -0
  161. package/apps/pwa/out/_next/static/chunks/app/share/page-89cb33bced824e4a.js +1 -0
  162. package/apps/pwa/out/_next/static/chunks/app/showroom/page-b008aff96be56654.js +1 -0
  163. package/apps/pwa/out/_next/static/chunks/app/tasks/page-814394dcbae789b1.js +1 -0
  164. package/apps/pwa/out/_next/static/chunks/app/term/page-6a87325c87f09dd2.js +1 -0
  165. package/apps/pwa/out/_next/static/chunks/app/today/page-6445ac4cbb8dd869.js +1 -0
  166. package/apps/pwa/out/_next/static/chunks/app/trace/page-852170303c6cd755.js +1 -0
  167. package/apps/pwa/out/_next/static/chunks/app/vault/page-087ceeb975ef272b.js +1 -0
  168. package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-97c7361cc2a19319.js +1 -0
  169. package/apps/pwa/out/_next/static/chunks/app/workflows/page-20162174b77f96cf.js +1 -0
  170. package/apps/pwa/out/_next/static/chunks/app/workspace/page-8c6901833f897496.js +1 -0
  171. package/apps/pwa/out/_next/static/chunks/app/worktrees/page-05a4b2c9b91034aa.js +1 -0
  172. package/apps/pwa/out/_next/static/chunks/dcf24383-2f82e35f2d827393.js +1 -0
  173. package/apps/pwa/out/_next/static/chunks/{53746282.1be36038d1abd949.js → e117f801.e92bf10242653497.js} +1 -1
  174. package/apps/pwa/out/_next/static/chunks/e87d89b9.2e71c0ae475d28a1.js +122 -0
  175. package/apps/pwa/out/_next/static/chunks/{0673cc54.8e2ef1c23e49e190.js → f4dfbfc0.a69fb12f854882aa.js} +1 -1
  176. package/apps/pwa/out/_next/static/chunks/framework-bf135b997155e90e.js +1 -0
  177. package/apps/pwa/out/_next/static/chunks/main-5571537543bea91c.js +1 -0
  178. package/apps/pwa/out/_next/static/chunks/main-app-25c51c7df7f3a442.js +1 -0
  179. package/apps/pwa/out/_next/static/chunks/pages/_app-e3b2c1f5d82abd65.js +1 -0
  180. package/apps/pwa/out/_next/static/chunks/pages/_error-083f2e23e9bc3641.js +1 -0
  181. package/apps/pwa/out/_next/static/chunks/webpack-e94d22b7a028217b.js +1 -0
  182. package/apps/pwa/out/_next/static/{Q-7iofoxOEv1WX18S35of → dRS6lEhSRRBr1abbzp7fJ}/_buildManifest.js +1 -1
  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 +7 -5
  282. package/scripts/release-loop/auto-approve-node.ts +6 -0
  283. package/scripts/release-loop/gate-closure.ts +286 -0
  284. package/scripts/release-loop/gate-node.ts +73 -13
  285. package/scripts/release-loop/gate-partial.ts +34 -6
  286. package/scripts/release-loop/ops-upgrade-node.ts +63 -42
  287. package/scripts/release-loop/publish-node.ts +6 -0
  288. package/scripts/release-loop/resume-release.ts +37 -10
  289. package/scripts/release-loop/resume.ts +69 -4
  290. package/scripts/tsc-baseline-cache.ts +28 -3
  291. package/scripts/usage-rollup.ts +27 -13
  292. package/scripts/ux-sim.ts +30 -1
  293. package/skills/youtube-master/scripts/main.ts +4 -1
  294. package/skills/youtube-master/src/obsidian.ts +9 -0
  295. package/src/agent-substrate/acp-implementer.ts +14 -7
  296. package/src/agent-substrate/pr-reviewer.ts +30 -10
  297. package/src/agent-substrate/self-review-cli.ts +126 -10
  298. package/src/budget/cost-tier-advisor.ts +91 -0
  299. package/src/budget/shadow-arms.ts +77 -0
  300. package/src/budget/types.ts +5 -3
  301. package/src/budget/unified-usage.ts +172 -8
  302. package/src/cli/doctor-cli.ts +21 -0
  303. package/src/cli/friendly-errors.ts +113 -0
  304. package/src/cli/intake-cli.ts +3 -1
  305. package/src/cli/memory-cli.ts +182 -0
  306. package/src/cli/model-watch-cli.ts +4 -1
  307. package/src/cli/pr-land-pod-shadow.ts +54 -0
  308. package/src/cli/release-cli.ts +9 -7
  309. package/src/cli/release-run-if-ready.ts +11 -0
  310. package/src/cli/resource-cli.ts +48 -0
  311. package/src/cli/retro-cli.ts +12 -3
  312. package/src/cli/seat-requests-cli.ts +25 -0
  313. package/src/cli/tasks-cli.ts +31 -7
  314. package/src/cli/usage-cli.ts +3 -1
  315. package/src/compact/verify-probe.ts +23 -3
  316. package/src/context-card/index.ts +50 -0
  317. package/src/control/control-status.ts +30 -1
  318. package/src/dashboard/slash-runtime/dashboard-handlers.ts +4 -138
  319. package/src/dashboard/slash-runtime/shell-slash.ts +145 -0
  320. package/src/debug/log-diet.ts +16 -4
  321. package/src/domains/morning-essential.ts +18 -3
  322. package/src/domains/release-tool.ts +4 -0
  323. package/src/execution-loop/launch-gate.ts +158 -2
  324. package/src/fleet/host-doctor.ts +375 -0
  325. package/src/goals/judge.ts +20 -6
  326. package/src/graph-runner/runner.ts +9 -5
  327. package/src/graph-wizard/archetypes.ts +14 -8
  328. package/src/graph-wizard/generate.ts +77 -1
  329. package/src/grok.ts +13 -7
  330. package/src/harness/harness-cli-command.ts +56 -47
  331. package/src/harness/harness-stop.ts +82 -12
  332. package/src/index.ts +17 -175
  333. package/src/intake-plane/collect-github.ts +7 -2
  334. package/src/intake-plane/lens.ts +46 -4
  335. package/src/intake-plane/requirement-funnel.ts +53 -1
  336. package/src/intelligence-map/catalog-feed.ts +119 -0
  337. package/src/intelligence-map/model-watch-intake.ts +40 -0
  338. package/src/intelligence-map/model-watch-mission.ts +14 -1
  339. package/src/llm/open-weight-discipline.ts +21 -0
  340. package/src/llm.ts +4 -8
  341. package/src/maturity/feature-maturity.ts +1 -1
  342. package/src/nexus/api/http-server.ts +22 -0
  343. package/src/oauth/codex-account-rotation.ts +4 -1
  344. package/src/oauth/codex-account-store.ts +20 -7
  345. package/src/oauth/codex-quota-policy.ts +33 -4
  346. package/src/preview/terminal.ts +15 -5
  347. package/src/project/project-store.ts +20 -0
  348. package/src/release-loop/auto-start.ts +7 -5
  349. package/src/release-loop/checklist.ts +11 -1
  350. package/src/release-loop/gate-shards.ts +4 -0
  351. package/src/release-loop/light-rc.ts +84 -13
  352. package/src/release-loop/merged-pr-checklist.ts +35 -5
  353. package/src/release-loop/rehearsal.ts +1 -1
  354. package/src/seat-loop/duty-ledger.ts +64 -0
  355. package/src/self-dev/decompose.ts +37 -3
  356. package/src/self-dev/dev-pipeline.ts +32 -7
  357. package/src/self-dev/draft-residue.ts +16 -6
  358. package/src/self-dev/draft-sweep.ts +52 -4
  359. package/src/self-dev/fabric-decompose-adapter.ts +9 -2
  360. package/src/self-dev/run-supervisor.ts +37 -7
  361. package/src/self-implement/gate-cli.ts +29 -10
  362. package/src/self-implement/gate-remote.ts +4 -1
  363. package/src/self-implement/goal-author.ts +12 -2
  364. package/src/self-implement/goal-new-paths.ts +42 -0
  365. package/src/self-implement/host-regate.ts +124 -30
  366. package/src/self-implement/importer-test-index.ts +3 -1
  367. package/src/self-implement/l8-merge-queue.ts +80 -2
  368. package/src/self-implement/merge-train.ts +19 -0
  369. package/src/self-implement/off-diff-evidence.ts +40 -1
  370. package/src/self-implement/orchestrator.ts +88 -19
  371. package/src/self-implement/premise-review.ts +159 -0
  372. package/src/self-implement/regate-detail.ts +79 -0
  373. package/src/self-implement/review-deferred-to-host.ts +21 -0
  374. package/src/self-implement/rework-budget-judgment.ts +23 -3
  375. package/src/self-implement/running-runs.ts +2 -2
  376. package/src/self-implement/scope-adjacency.ts +23 -0
  377. package/src/self-implement/seams.ts +42 -7
  378. package/src/skills/tools/agent.ts +16 -1
  379. package/src/skills/tools/persistent-grounding.ts +11 -1
  380. package/src/skills/tools/shell.ts +33 -1
  381. package/src/steward/rejudge-tick.ts +142 -0
  382. package/src/task-agent/board.ts +92 -3
  383. package/src/task-agent/card-evidence.ts +88 -1
  384. package/src/task-agent/cover.ts +65 -0
  385. package/src/task-agent/parent-host.ts +27 -3
  386. package/src/task-agent/rejudge-on-head.ts +151 -7
  387. package/src/task-agent/review-result-capture.ts +3 -1
  388. package/src/task-agent/shadow.ts +12 -0
  389. package/src/task-agent/task-hand.ts +4 -1
  390. package/src/task-orchestrator/surfaces/pod-command-job.ts +14 -0
  391. package/src/task-orchestrator/surfaces/pod-host-acp-review.ts +122 -0
  392. package/src/task-orchestrator/surfaces/pod-manifest-test-normalize.ts +23 -0
  393. package/src/task-orchestrator/surfaces/pod-pool.ts +53 -0
  394. package/src/task-orchestrator/surfaces/self-implement-pod.ts +235 -28
  395. package/src/user-config.ts +18 -4
  396. package/src/ux-sim/fault-cred-expiry.ts +100 -0
  397. package/src/ux-sim/fault-pod-death.ts +74 -0
  398. package/src/ux-sim/fault-pool-cap.ts +81 -0
  399. package/src/version/packed-revision.json +1 -1
  400. package/src/webclone/qa-table.ts +22 -0
  401. package/apps/pwa/out/_next/static/chunks/0a09e062-34f747a17d8d8c2e.js +0 -1
  402. package/apps/pwa/out/_next/static/chunks/1168.a0fb3d9db76c00bd.js +0 -77
  403. package/apps/pwa/out/_next/static/chunks/1325-dc3f3c21eb181cb4.js +0 -1
  404. package/apps/pwa/out/_next/static/chunks/1357.a843c41d2cd7ec31.js +0 -34
  405. package/apps/pwa/out/_next/static/chunks/1430.53f49882b17607c2.js +0 -24
  406. package/apps/pwa/out/_next/static/chunks/1459-be6509b3419d8a9f.js +0 -1
  407. package/apps/pwa/out/_next/static/chunks/153.0a4e3cd516930491.js +0 -1
  408. package/apps/pwa/out/_next/static/chunks/1572.7bc291352e241a45.js +0 -1
  409. package/apps/pwa/out/_next/static/chunks/1593-d07ad068c120dfb0.js +0 -1
  410. package/apps/pwa/out/_next/static/chunks/1608.b7c900baa56cab32.js +0 -1
  411. package/apps/pwa/out/_next/static/chunks/1615-4d8156febaac4b35.js +0 -1
  412. package/apps/pwa/out/_next/static/chunks/1646.e03f0fbc26bc72f6.js +0 -1
  413. package/apps/pwa/out/_next/static/chunks/1669-da843ed73aa301f5.js +0 -1
  414. package/apps/pwa/out/_next/static/chunks/176.13ba0659e3e96fd4.js +0 -1
  415. package/apps/pwa/out/_next/static/chunks/1990.9c60f495ef33c070.js +0 -36
  416. package/apps/pwa/out/_next/static/chunks/2042e469.f86158dd5c1e51a1.js +0 -122
  417. package/apps/pwa/out/_next/static/chunks/2543-28ec6aeb80a5e1e1.js +0 -1
  418. package/apps/pwa/out/_next/static/chunks/2561.43c99d6ee914ee6a.js +0 -62
  419. package/apps/pwa/out/_next/static/chunks/2638.b39ab2f674caa1a5.js +0 -1
  420. package/apps/pwa/out/_next/static/chunks/272-0eed0fb0aab716b6.js +0 -1
  421. package/apps/pwa/out/_next/static/chunks/2778.67e0c1d484189ccf.js +0 -1
  422. package/apps/pwa/out/_next/static/chunks/2841.10ff309f6a3168af.js +0 -1
  423. package/apps/pwa/out/_next/static/chunks/2886-9639f97d523d752a.js +0 -1
  424. package/apps/pwa/out/_next/static/chunks/2978.57fb87ce21cc5a85.js +0 -1
  425. package/apps/pwa/out/_next/static/chunks/3664.15f968c39d15bd28.js +0 -149
  426. package/apps/pwa/out/_next/static/chunks/3786-935eb3fcde90e496.js +0 -1
  427. package/apps/pwa/out/_next/static/chunks/3813.df4a01ae89c6f63f.js +0 -1
  428. package/apps/pwa/out/_next/static/chunks/3961-aaae04ed1d32622f.js +0 -1
  429. package/apps/pwa/out/_next/static/chunks/3992.f79c70480e8c4077.js +0 -309
  430. package/apps/pwa/out/_next/static/chunks/40-413e8641de9ed1e5.js +0 -1
  431. package/apps/pwa/out/_next/static/chunks/4054-521f11a503daed64.js +0 -1
  432. package/apps/pwa/out/_next/static/chunks/4315.e7356f34c7d8ec79.js +0 -1
  433. package/apps/pwa/out/_next/static/chunks/4489-bf629de6f04f7681.js +0 -1
  434. package/apps/pwa/out/_next/static/chunks/4540.557733cc88c6a82b.js +0 -1
  435. package/apps/pwa/out/_next/static/chunks/462.0275b4338c5b6337.js +0 -1
  436. package/apps/pwa/out/_next/static/chunks/4658-7ed9266098a787e4.js +0 -1
  437. package/apps/pwa/out/_next/static/chunks/4945-0f4046cfc3228ea3.js +0 -1
  438. package/apps/pwa/out/_next/static/chunks/5105-18b4165c5d3a86b0.js +0 -1
  439. package/apps/pwa/out/_next/static/chunks/5205-6992210fe31f45f4.js +0 -1
  440. package/apps/pwa/out/_next/static/chunks/5287-72898b126d722457.js +0 -1
  441. package/apps/pwa/out/_next/static/chunks/5313.1697309c532b9856.js +0 -2
  442. package/apps/pwa/out/_next/static/chunks/5474.991b90688c3cb321.js +0 -1
  443. package/apps/pwa/out/_next/static/chunks/5544-871146192d095594.js +0 -1
  444. package/apps/pwa/out/_next/static/chunks/5935.d5e8ca3e096772e8.js +0 -1
  445. package/apps/pwa/out/_next/static/chunks/6006.84e8b418a7a0db97.js +0 -1
  446. package/apps/pwa/out/_next/static/chunks/6013-1267ba7454d6764b.js +0 -1
  447. package/apps/pwa/out/_next/static/chunks/6038-1e0f7ee1086da4cf.js +0 -1
  448. package/apps/pwa/out/_next/static/chunks/617.709dd0019fe99796.js +0 -1
  449. package/apps/pwa/out/_next/static/chunks/6261.fb9bf94947094636.js +0 -74
  450. package/apps/pwa/out/_next/static/chunks/6411.1966866fae31ffa9.js +0 -1
  451. package/apps/pwa/out/_next/static/chunks/6481-b829d99aa8d158f5.js +0 -1
  452. package/apps/pwa/out/_next/static/chunks/6541.2b7daa043100d0fa.js +0 -1
  453. package/apps/pwa/out/_next/static/chunks/6597.2d7a6d77ab485b27.js +0 -64
  454. package/apps/pwa/out/_next/static/chunks/67.5dd2dc543c2fa3de.js +0 -1
  455. package/apps/pwa/out/_next/static/chunks/6777-312496b0d774719b.js +0 -1
  456. package/apps/pwa/out/_next/static/chunks/681.0116f7036cfb4e8d.js +0 -32
  457. package/apps/pwa/out/_next/static/chunks/6871.30b2bf23b3126e36.js +0 -24
  458. package/apps/pwa/out/_next/static/chunks/6882.737d366d54e29d83.js +0 -1
  459. package/apps/pwa/out/_next/static/chunks/7035.54c2c535164b1c9b.js +0 -1
  460. package/apps/pwa/out/_next/static/chunks/7086-8bfa7e8f796a03d9.js +0 -1
  461. package/apps/pwa/out/_next/static/chunks/7126.5e5599f251726b67.js +0 -93
  462. package/apps/pwa/out/_next/static/chunks/7203-47ff0740a293e284.js +0 -1
  463. package/apps/pwa/out/_next/static/chunks/7268.017f49dafb5f0ff3.js +0 -1
  464. package/apps/pwa/out/_next/static/chunks/7355.5d65a87e9567ae08.js +0 -1
  465. package/apps/pwa/out/_next/static/chunks/7392.4018c2a62177f296.js +0 -1
  466. package/apps/pwa/out/_next/static/chunks/7471.3a3d1be50559cfb8.js +0 -148
  467. package/apps/pwa/out/_next/static/chunks/7500.73489a345cef2201.js +0 -226
  468. package/apps/pwa/out/_next/static/chunks/7565.c2f72a15c1ed0396.js +0 -27
  469. package/apps/pwa/out/_next/static/chunks/7651.6d1c984d3d8587a4.js +0 -1
  470. package/apps/pwa/out/_next/static/chunks/7713.7ab863ed59b2d661.js +0 -1
  471. package/apps/pwa/out/_next/static/chunks/7793.d7cd2026767ddd54.js +0 -115
  472. package/apps/pwa/out/_next/static/chunks/7837.c7c267e5dceadb11.js +0 -1
  473. package/apps/pwa/out/_next/static/chunks/7891.09266382daf70d1c.js +0 -1
  474. package/apps/pwa/out/_next/static/chunks/7990-cbf6a01bcbdcb7e6.js +0 -1
  475. package/apps/pwa/out/_next/static/chunks/8119-819c549e0c197786.js +0 -1
  476. package/apps/pwa/out/_next/static/chunks/8186-74ea19a3700d04a8.js +0 -1
  477. package/apps/pwa/out/_next/static/chunks/8267-e7b3262b735ae106.js +0 -1
  478. package/apps/pwa/out/_next/static/chunks/8386.86518e55b75f7cf5.js +0 -8
  479. package/apps/pwa/out/_next/static/chunks/8437.ba6eeeb29590042f.js +0 -23
  480. package/apps/pwa/out/_next/static/chunks/8469-1500be57e582296f.js +0 -1
  481. package/apps/pwa/out/_next/static/chunks/8483-7164cecdaf178ca6.js +0 -1
  482. package/apps/pwa/out/_next/static/chunks/8722-4c940f02c496ad36.js +0 -1
  483. package/apps/pwa/out/_next/static/chunks/887-41d0dcf5af48c628.js +0 -1
  484. package/apps/pwa/out/_next/static/chunks/9039.da86361496797522.js +0 -90
  485. package/apps/pwa/out/_next/static/chunks/905.d5745a25884754d4.js +0 -94
  486. package/apps/pwa/out/_next/static/chunks/9089-d909f3d4478b0628.js +0 -1
  487. package/apps/pwa/out/_next/static/chunks/9096.dc5c7a267f83790c.js +0 -41
  488. package/apps/pwa/out/_next/static/chunks/93.a567257b6bdb7fe4.js +0 -1
  489. package/apps/pwa/out/_next/static/chunks/9320.419acb9665b46597.js +0 -287
  490. package/apps/pwa/out/_next/static/chunks/9356.b8ceda6634612ff8.js +0 -79
  491. package/apps/pwa/out/_next/static/chunks/94.e9e1043b35cd3eed.js +0 -1
  492. package/apps/pwa/out/_next/static/chunks/9400-7498ea90b2e6ee8f.js +0 -1
  493. package/apps/pwa/out/_next/static/chunks/9930-58644af9c813d6e1.js +0 -1
  494. package/apps/pwa/out/_next/static/chunks/9932.367cf4725fedd6e2.js +0 -1
  495. package/apps/pwa/out/_next/static/chunks/9935.1628b904cdc8ce0e.js +0 -104
  496. package/apps/pwa/out/_next/static/chunks/app/_not-found/page-a2aa8709d193ee0d.js +0 -1
  497. package/apps/pwa/out/_next/static/chunks/app/approvals/page-3b9fc39362473ae7.js +0 -1
  498. package/apps/pwa/out/_next/static/chunks/app/autopilot/page-f2b62c19ca68fef8.js +0 -1
  499. package/apps/pwa/out/_next/static/chunks/app/board/page-d7602d489edf5f37.js +0 -1
  500. package/apps/pwa/out/_next/static/chunks/app/bots/page-8b7c5ab6b5bc8d64.js +0 -1
  501. package/apps/pwa/out/_next/static/chunks/app/ceo/page-4eb84d454f8c3415.js +0 -1
  502. package/apps/pwa/out/_next/static/chunks/app/chat/page-b2e494bdad57fcb5.js +0 -1
  503. package/apps/pwa/out/_next/static/chunks/app/consult/page-c0ab229673a8b0eb.js +0 -1
  504. package/apps/pwa/out/_next/static/chunks/app/control/page-3e2b45f3c36dbac4.js +0 -1
  505. package/apps/pwa/out/_next/static/chunks/app/decisions/page-c22aa511b28743ad.js +0 -1
  506. package/apps/pwa/out/_next/static/chunks/app/design-check/page-26345242e4049f55.js +0 -1
  507. package/apps/pwa/out/_next/static/chunks/app/editor/page-bf88c0f558d8ef54.js +0 -1
  508. package/apps/pwa/out/_next/static/chunks/app/exec/page-52fec523e5b5d3ad.js +0 -1
  509. package/apps/pwa/out/_next/static/chunks/app/field/page-67723dfdcde92b31.js +0 -1
  510. package/apps/pwa/out/_next/static/chunks/app/healthz/route-a2aa8709d193ee0d.js +0 -1
  511. package/apps/pwa/out/_next/static/chunks/app/inside/page-22725e2570f1126b.js +0 -1
  512. package/apps/pwa/out/_next/static/chunks/app/intake/page-1891335950d68b70.js +0 -1
  513. package/apps/pwa/out/_next/static/chunks/app/layout-3267af1ebdc73cf5.js +0 -1
  514. package/apps/pwa/out/_next/static/chunks/app/live/page-c314b75c11234998.js +0 -1
  515. package/apps/pwa/out/_next/static/chunks/app/live-run/page-9f9c85415f61782b.js +0 -1
  516. package/apps/pwa/out/_next/static/chunks/app/loops/page-c1d4276059085587.js +0 -1
  517. package/apps/pwa/out/_next/static/chunks/app/market/page-833aab587f26ad4c.js +0 -1
  518. package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-8526c17ae38e6a50.js +0 -1
  519. package/apps/pwa/out/_next/static/chunks/app/morning/page-f998637a8402115c.js +0 -1
  520. package/apps/pwa/out/_next/static/chunks/app/not-found-b7bb53828b17b335.js +0 -1
  521. package/apps/pwa/out/_next/static/chunks/app/observatory/page-1b1850de0257e46d.js +0 -1
  522. package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-6f23159fedb41f67.js +0 -1
  523. package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-da9e570234d481fd.js +0 -1
  524. package/apps/pwa/out/_next/static/chunks/app/page-8ce3a38e210b810a.js +0 -1
  525. package/apps/pwa/out/_next/static/chunks/app/reflection/page-57ffeeb6019440fd.js +0 -1
  526. package/apps/pwa/out/_next/static/chunks/app/scheduler/page-abbb417bf514630b.js +0 -1
  527. package/apps/pwa/out/_next/static/chunks/app/sessions/page-2c2b3f29cec1efa4.js +0 -1
  528. package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-9369279f72fc7b51.js +0 -1
  529. package/apps/pwa/out/_next/static/chunks/app/settings/page-64861f14039499c3.js +0 -1
  530. package/apps/pwa/out/_next/static/chunks/app/setup/done/page-ddc4c93efd8ab94b.js +0 -1
  531. package/apps/pwa/out/_next/static/chunks/app/setup/layout-a2aa8709d193ee0d.js +0 -1
  532. package/apps/pwa/out/_next/static/chunks/app/setup/page-901a1391b81053bc.js +0 -1
  533. package/apps/pwa/out/_next/static/chunks/app/share/page-68d9bbaac9841a58.js +0 -1
  534. package/apps/pwa/out/_next/static/chunks/app/showroom/page-b5c0c996f329371e.js +0 -1
  535. package/apps/pwa/out/_next/static/chunks/app/tasks/page-89881ccbcf728978.js +0 -1
  536. package/apps/pwa/out/_next/static/chunks/app/term/page-0e87a803b3d7165e.js +0 -1
  537. package/apps/pwa/out/_next/static/chunks/app/today/page-58d4e5cb30ef4871.js +0 -1
  538. package/apps/pwa/out/_next/static/chunks/app/trace/page-02ce4c3b5f39e4d2.js +0 -1
  539. package/apps/pwa/out/_next/static/chunks/app/vault/page-e620d1bb8eadcec2.js +0 -1
  540. package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-acf868c64d77f950.js +0 -1
  541. package/apps/pwa/out/_next/static/chunks/app/workflows/page-54fa605fa6dba457.js +0 -1
  542. package/apps/pwa/out/_next/static/chunks/app/workspace/page-bc79f0833533fa84.js +0 -1
  543. package/apps/pwa/out/_next/static/chunks/app/worktrees/page-d5c4398eea03d8f3.js +0 -1
  544. package/apps/pwa/out/_next/static/chunks/cd39fa05.fac4545f42a3ef70.js +0 -1
  545. package/apps/pwa/out/_next/static/chunks/framework-b2763b10dc6b3836.js +0 -1
  546. package/apps/pwa/out/_next/static/chunks/main-app-27893e93b0ec193d.js +0 -1
  547. package/apps/pwa/out/_next/static/chunks/main-f280047194e1daf8.js +0 -1
  548. package/apps/pwa/out/_next/static/chunks/pages/_app-e90eff2d0b70564c.js +0 -1
  549. package/apps/pwa/out/_next/static/chunks/pages/_error-70f2d654b3435d34.js +0 -1
  550. package/apps/pwa/out/_next/static/chunks/webpack-4794f053bd5e4230.js +0 -1
  551. /package/apps/pwa/out/_next/static/{Q-7iofoxOEv1WX18S35of → dRS6lEhSRRBr1abbzp7fJ}/_ssgManifest.js +0 -0
@@ -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';
@@ -3715,143 +3716,8 @@ export function buildDashboardSlashRegistry(nowDeps?: ContextNowDeps, decideLedg
3715
3716
  ctx.setChatScrollOffset(-1);
3716
3717
  });
3717
3718
 
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
- });
3719
+
3720
+ registerShellSlash(registry);
3855
3721
 
3856
3722
  // ── B-3.b ─────────────────────────────────────────────────────────
3857
3723
 
@@ -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
 
@@ -7,6 +7,7 @@
7
7
 
8
8
  import { getUserConfig } from '../user-config.js';
9
9
  import { getProviderForConfig, anyProviderAvailable, textOnly, type LLMMessage } from '../llm.js';
10
+ import { debug } from '../debug/log.js';
10
11
  import { marketClock } from './finance.js';
11
12
  import { renderSemisEssential } from './kg-semis.js';
12
13
  import { feedBySource } from './morning-synthesis.js';
@@ -116,11 +117,25 @@ const ESSENTIAL_SYSTEM = `너는 Conatus 투자 아침 브리핑의 편집자다
116
117
  - 매매 지시(사라/팔라/비중 조절) 금지. 관찰과 유의점만. 최종 판단은 verify+HITL.
117
118
  - 담백하고 신중한 톤. 이모지 최소.`;
118
119
 
120
+ /** synthesizeEssentialBrief 모델 자리(A/B 첫 조각) — 미지정이면 지금과 같은 기본 경로. */
121
+ export interface EssentialSynthOpts {
122
+ /** 지정하면 getProviderForConfig(cfg, model) 로 부른다. */
123
+ model?: string;
124
+ /** provider 주입(시험용). 미지정이면 getProviderForConfig. */
125
+ providerFor?: (cfg: ReturnType<typeof getUserConfig>, model?: string) => ReturnType<typeof getProviderForConfig>;
126
+ /** 가용성 주입(시험용). 미지정이면 anyProviderAvailable. */
127
+ available?: () => boolean;
128
+ }
129
+
119
130
  /** 상세 markdown 을 입력으로 LLM 시장서사 종합. provider 없거나 실패 시 ''(에센셜은 결정론만). */
120
- export async function synthesizeEssentialBrief(detailMarkdown: string): Promise<string> {
121
- if (!anyProviderAvailable()) return '';
131
+ export async function synthesizeEssentialBrief(detailMarkdown: string, opts: EssentialSynthOpts = {}): Promise<string> {
132
+ const { model, providerFor, available } = opts;
133
+ if (!(available ?? anyProviderAvailable)()) return '';
122
134
  try {
123
- const provider = getProviderForConfig(getUserConfig());
135
+ const cfg = getUserConfig();
136
+ if (model) debug.log('domains.llm', 'cron-model', { domain: 'morning-essential', model: model ?? null });
137
+ const resolve = providerFor ?? getProviderForConfig;
138
+ const provider = model ? resolve(cfg, model) : resolve(cfg);
124
139
  if (!provider.streamChat) return '';
125
140
  // 토큰 절약: 상세를 앞부분 위주로 트림(핵심 섹션이 상단).
126
141
  const digest = detailMarkdown.slice(0, 6000);
@@ -21,6 +21,7 @@ export const RELEASE_STATUS_SPEC: LLMToolSpec = {
21
21
  + 'topic=cell: id 칸 하나의 상태·근거와 살핀 판.\n'
22
22
  + 'topic=schedule: 발행 이후 판의 컷·착지·발행·동결 일정.\n'
23
23
  + 'topic=ops: 도는 런·발행·늦은 스케줄·자리·열린 결정의 출처 있는 개관.\n'
24
+ + 'topic 과 action 을 동시에 쓰지 않는다 — 둘 중 하나만: topic 은 읽을 대상, action 은 짧은 요약.\n'
24
25
  + '발행·버전·피처·체크리스트·칸·컷·일정·운영 상태 질문은 Grep·ListDir·파일 검색보다 이 도구를 먼저 부른다 — 그 답은 파일이 아니라 원장에 있다.',
25
26
  parameters: { type: 'object', properties: {
26
27
  version: { type: 'string', description: '조회할 판. 생략하면 개발 판과 다음 판.' },
@@ -121,6 +122,9 @@ function cellView(item: ChecklistItem) {
121
122
  export function dispatchReleaseStatus(args: Record<string, unknown>, deps: ReleaseToolDeps = {}): { text: string; structured: Record<string, unknown> } {
122
123
  const topic = args.topic === undefined ? 'status' : args.topic;
123
124
  if (typeof topic !== 'string' || !['status', 'features', 'cell', 'schedule', 'ops'].includes(topic)) throw new Error('topic 은 status, features, cell, schedule, ops 중 하나');
125
+ if (args.topic !== undefined && args.action !== undefined) {
126
+ throw new Error(`topic 과 action 을 동시에 보낼 수 없습니다 — 둘 중 하나만: topic=${topic} 는 읽을 대상, action 은 짧은 요약(schedule·blocked·landed)`);
127
+ }
124
128
  const requested = args.version;
125
129
  if (requested !== undefined && (typeof requested !== 'string' || !requested.trim())) throw new Error('판 이름이 필요합니다');
126
130
  const checklist = deps.checklist ?? listChecklist;
@@ -4,7 +4,8 @@ import { debug } from '../debug/log.js';
4
4
  import { extractVerbatimOriginalAsk } from '../self-implement/goal-author.js';
5
5
  import { loadRunLedger } from '../self-implement/run-ledger.js';
6
6
  import { queryRunningRuns, type QueriedRunningRunsResult } from '../self-implement/running-runs.js';
7
- import type { BudgetDecision } from '../self-implement/budget-gate.js';
7
+ import { CODEX_PROVIDER, GROK_PROVIDER, decideLaunchBudget, type BudgetAction, type BudgetDecision, type BudgetInputs } from '../self-implement/budget-gate.js';
8
+ import { DEFAULT_FALLBACK_CHAIN } from '../oauth/fallback-chain.js';
8
9
 
9
10
  export type ActiveRunsForGoal = readonly string[] | 'unknown';
10
11
 
@@ -87,9 +88,164 @@ export function activeRunsForGoal(goalId: string, deps: ActiveRunsForGoalDeps =
87
88
  }
88
89
  }
89
90
 
91
+ const LAUNCH_BUDGET_PROVIDER: Readonly<Record<string, string>> = { 'codex-rotate': CODEX_PROVIDER, grok: GROK_PROVIDER };
92
+
93
+ /**
94
+ * L6 발사 관문의 예산 입력 보정 — 발사 우주의 config 에 체인이 없으면(작업 트리 = 시험 우주) 막지 않고
95
+ * 코드 기본 체인으로 판단한다. `--child-llm-provider` 를 명시했으면 그것이 체인이다(예산 판정 밖 provider 는 통과).
96
+ */
97
+ export function harnessLaunchBudgetDecision(
98
+ inputs: BudgetInputs,
99
+ opts: { readonly childLlmProvider?: string; readonly childLlmModel?: string } = {},
100
+ ): { readonly decision: BudgetDecision; readonly warning?: string; readonly unmeasuredProvider?: string } {
101
+ const explicit = opts.childLlmProvider?.trim();
102
+ const judged = (selected: BudgetInputs) => {
103
+ const { decision, unmeasuredProvider } = decideLaunchBudget(selected);
104
+ return { decision, ...(unmeasuredProvider ? { unmeasuredProvider, warning: `budget: ${unmeasuredProvider} usage unmeasured — launching` } : {}) };
105
+ };
106
+ if (explicit) {
107
+ if (explicit !== CODEX_PROVIDER && explicit !== GROK_PROVIDER) {
108
+ return {
109
+ decision: { action: 'proceed', provider: explicit, ...(opts.childLlmModel ? { model: opts.childLlmModel } : {}), reasons: [`${explicit}: 명시 provider — 예산 판정 밖`] },
110
+ warning: `budget: ${explicit} is outside the budget gate — launched as requested`,
111
+ };
112
+ }
113
+ const chain = [{ provider: explicit, ...(opts.childLlmModel ? { model: opts.childLlmModel } : {}) }];
114
+ return judged({ ...inputs, preference: { ...inputs.preference, chain } });
115
+ }
116
+ if (inputs.preference.chain.length > 0) return judged(inputs);
117
+ const chain = DEFAULT_FALLBACK_CHAIN.map((step) => ({ provider: LAUNCH_BUDGET_PROVIDER[step] ?? step }));
118
+ const result = judged({ ...inputs, preference: { ...inputs.preference, chain } });
119
+ return {
120
+ ...result,
121
+ warning: `budget: no chain in this universe's config — judged with the code default ${DEFAULT_FALLBACK_CHAIN.join(',')}${result.warning ? ` · ${result.warning}` : ''}`,
122
+ };
123
+ }
124
+
125
+ /** Parent → Pod budget snapshot env. Numbers and names only — never a credential, never free-text reasons. */
126
+ export const BUDGET_SNAPSHOT_ENV = 'ELANOUS_BUDGET_SNAPSHOT';
127
+ export const BUDGET_SNAPSHOT_MAX_AGE_SEC = 15 * 60;
128
+ // Host and Pod clocks may differ slightly even when the Job carries a freshly measured verdict.
129
+ const BUDGET_SNAPSHOT_CLOCK_SKEW_SEC = 30;
130
+
131
+ /** The verdict the host's launch gate reached (chain ⊕ the user's caps) — the Pod follows it instead of judging again. */
132
+ export interface HostBudgetVerdict {
133
+ action: BudgetAction;
134
+ provider?: string;
135
+ model?: string;
136
+ }
137
+
138
+ export interface BudgetSnapshot {
139
+ /** The provider the host verdict picked, or the one asked for when nothing was picked. */
140
+ provider: string;
141
+ /** Percent of that provider's window still unspent (0–100) — observation only; absent when the host could not measure it. */
142
+ remaining?: number;
143
+ window: string;
144
+ /** Epoch milliseconds on the measuring host. */
145
+ measuredAt: number;
146
+ host: string;
147
+ /** The explicit child provider the host judged for (`--child-llm-provider`). Absent = the host's configured chain. */
148
+ requested?: string;
149
+ /** The host launch-gate verdict. Absent = the host reached none, and the Pod treats the budget as unmeasured. */
150
+ decision?: HostBudgetVerdict;
151
+ }
152
+
153
+ export type BudgetSource = 'snapshot' | 'local' | 'unmeasured';
154
+
155
+ export interface ResolvedLaunchBudget {
156
+ budget: BudgetDecision | 'unknown';
157
+ budgetSource: BudgetSource;
158
+ snapshotAgeSec?: number;
159
+ }
160
+
161
+ const BUDGET_ACTIONS: readonly BudgetAction[] = ['proceed', 'next-provider', 'wait-reset', 'stop'];
162
+
163
+ function canonicalBudgetProvider(name: string): string {
164
+ const id = name.trim();
165
+ return id === 'codex' || id === 'codex-rotate' ? 'openai-codex' : id;
166
+ }
167
+
168
+ function pickVerdict(value: unknown): HostBudgetVerdict | undefined {
169
+ if (!value || typeof value !== 'object') return undefined;
170
+ const { action, provider, model } = value as Record<string, unknown>;
171
+ if (typeof action !== 'string' || !(BUDGET_ACTIONS as readonly string[]).includes(action)) return undefined;
172
+ if (provider !== undefined && (typeof provider !== 'string' || !provider.trim())) return undefined;
173
+ if (model !== undefined && typeof model !== 'string') return undefined;
174
+ return { action: action as BudgetAction, ...(provider ? { provider: canonicalBudgetProvider(provider) } : {}), ...(model ? { model } : {}) };
175
+ }
176
+
177
+ export function encodeBudgetSnapshot(snapshot: BudgetSnapshot): string {
178
+ const { provider, remaining, window, measuredAt, host, requested, decision } = snapshot;
179
+ const verdict = pickVerdict(decision);
180
+ return JSON.stringify({
181
+ provider: canonicalBudgetProvider(provider),
182
+ ...(typeof remaining === 'number' && Number.isFinite(remaining) ? { remaining } : {}),
183
+ window, measuredAt, host,
184
+ ...(requested?.trim() ? { requested: canonicalBudgetProvider(requested) } : {}),
185
+ ...(verdict ? { decision: verdict } : {}),
186
+ });
187
+ }
188
+
189
+ function parseBudgetSnapshot(raw: string | undefined): BudgetSnapshot | undefined {
190
+ if (!raw?.trim()) return undefined;
191
+ try {
192
+ const value = JSON.parse(raw) as Record<string, unknown> | null;
193
+ if (!value || typeof value !== 'object') return undefined;
194
+ const { provider, remaining, window, measuredAt, host, requested, decision } = value;
195
+ if (typeof provider !== 'string' || !provider.trim() || typeof window !== 'string' || typeof host !== 'string') return undefined;
196
+ if (remaining !== undefined && (typeof remaining !== 'number' || !Number.isFinite(remaining) || remaining < 0 || remaining > 100)) return undefined;
197
+ if (typeof measuredAt !== 'number' || !Number.isFinite(measuredAt)) return undefined;
198
+ if (requested !== undefined && (typeof requested !== 'string' || !requested.trim())) return undefined;
199
+ const verdict = decision === undefined ? undefined : pickVerdict(decision);
200
+ if (decision !== undefined && !verdict) return undefined;
201
+ return {
202
+ provider: canonicalBudgetProvider(provider), ...(remaining !== undefined ? { remaining } : {}), window, measuredAt, host,
203
+ ...(requested ? { requested: canonicalBudgetProvider(requested) } : {}), ...(verdict ? { decision: verdict } : {}),
204
+ };
205
+ } catch { return undefined; }
206
+ }
207
+
208
+ /** The host's verdict as the Pod's decision — never re-judged with one provider or code-constant caps. */
209
+ function decisionFromSnapshot(snapshot: BudgetSnapshot, verdict: HostBudgetVerdict, ageSec: number): BudgetDecision {
210
+ const target = verdict.provider ? ` → ${verdict.provider}` : '';
211
+ const used = snapshot.remaining === undefined ? '' : ` · ${snapshot.provider} ${Math.round((100 - snapshot.remaining) * 100) / 100}% used (${snapshot.window})`;
212
+ return {
213
+ action: verdict.action,
214
+ ...(verdict.provider ? { provider: verdict.provider } : {}),
215
+ ...(verdict.model ? { model: verdict.model } : {}),
216
+ reasons: [`host ${snapshot.host} verdict ${verdict.action}${target}${used} · ${ageSec}s ago`],
217
+ };
218
+ }
219
+
220
+ export interface ResolveLaunchBudgetDeps {
221
+ env?: Readonly<Record<string, string | undefined>> | undefined;
222
+ now?: () => number;
223
+ /** The provider this launch will use, when named explicitly. */
224
+ provider?: string | undefined;
225
+ /** Host-side measurement. Never called inside a Pod. */
226
+ measureLocal: () => Promise<BudgetDecision | 'unknown'>;
227
+ }
228
+
229
+ /** A Pod has no subscription credential or usage cache, so it follows the parent's verdict ⊕ its age and never measures. */
230
+ export async function resolveLaunchBudget(deps: ResolveLaunchBudgetDeps): Promise<ResolvedLaunchBudget> {
231
+ const env = deps.env ?? process.env;
232
+ if (env.ELANOUS_SUBSTRATE !== 'pod') return { budget: await deps.measureLocal(), budgetSource: 'local' };
233
+ const snapshot = parseBudgetSnapshot(env[BUDGET_SNAPSHOT_ENV]);
234
+ if (!snapshot) return { budget: 'unknown', budgetSource: 'unmeasured' };
235
+ const ageSec = Math.round(((deps.now ?? Date.now)() - snapshot.measuredAt) / 1000);
236
+ const requested = deps.provider?.trim() ? canonicalBudgetProvider(deps.provider) : undefined;
237
+ // The verdict holds only for the question the host answered: the same explicit provider, or both on the configured chain.
238
+ if (!snapshot.decision || ageSec < -BUDGET_SNAPSHOT_CLOCK_SKEW_SEC || ageSec > BUDGET_SNAPSHOT_MAX_AGE_SEC || requested !== snapshot.requested) {
239
+ return { budget: 'unknown', budgetSource: 'unmeasured', snapshotAgeSec: ageSec };
240
+ }
241
+ return { budget: decisionFromSnapshot(snapshot, snapshot.decision, Math.max(0, ageSec)), budgetSource: 'snapshot', snapshotAgeSec: ageSec };
242
+ }
243
+
90
244
  export interface PreLaunchGateInput {
91
245
  goalId: string;
92
246
  budget?: BudgetDecision | 'unknown';
247
+ budgetSource?: BudgetSource;
248
+ snapshotAgeSec?: number;
93
249
  forceLaunch?: boolean;
94
250
  }
95
251
 
@@ -107,7 +263,7 @@ export interface PreLaunchGateDecision {
107
263
  /** Force bypasses only a duplicate observation, never an exhausted budget. */
108
264
  export function preLaunchGate(input: PreLaunchGateInput, deps: PreLaunchGateDeps = {}): PreLaunchGateDecision {
109
265
  const decision = decidePreLaunch(input, deps);
110
- debug.log('execution-loop.launch-gate', 'decision', { goalId: input.goalId, action: decision.action, sameGoalActiveRuns: decision.sameGoalActiveRuns, budget: decision.budget === 'unknown' ? 'unknown' : decision.budget.action, forceLaunch: input.forceLaunch === true, reason: decision.reason });
266
+ debug.log('execution-loop.launch-gate', 'decision', { goalId: input.goalId, action: decision.action, sameGoalActiveRuns: decision.sameGoalActiveRuns, budget: decision.budget === 'unknown' ? 'unknown' : decision.budget.action, forceLaunch: input.forceLaunch === true, reason: decision.reason, ...(input.budgetSource ? { budgetSource: input.budgetSource } : {}), ...(input.snapshotAgeSec !== undefined ? { snapshotAgeSec: input.snapshotAgeSec } : {}) });
111
267
  return decision;
112
268
  }
113
269