elanous 0.2.35 → 0.2.36

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (686) 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/{d06f9160.a3d9062f95de8ad7.js → 053a429e.9a63436527cc751c.js} +1 -1
  4. package/apps/pwa/out/_next/static/chunks/109.f196abf3484bb97f.js +287 -0
  5. package/apps/pwa/out/_next/static/chunks/{4346.8601952e73bf5803.js → 1201.afbfc5b1c5e5cbe4.js} +1 -1
  6. package/apps/pwa/out/_next/static/chunks/1517.9275b89572098ff3.js +1 -0
  7. package/apps/pwa/out/_next/static/chunks/1574.ad11f8db8396ab45.js +1 -0
  8. package/apps/pwa/out/_next/static/chunks/1614.7a8c5c40aee0261f.js +1 -0
  9. package/apps/pwa/out/_next/static/chunks/1871-f1eb29d8dbb4065b.js +1 -0
  10. package/apps/pwa/out/_next/static/chunks/190.285c832bd9626f8c.js +64 -0
  11. package/apps/pwa/out/_next/static/chunks/2193.0ea24c4a7aa1d004.js +36 -0
  12. package/apps/pwa/out/_next/static/chunks/223-ad865c1e80491d78.js +1 -0
  13. package/apps/pwa/out/_next/static/chunks/2265-f0d90b6dbec05f81.js +1 -0
  14. package/apps/pwa/out/_next/static/chunks/2267.eb4a62a209f09ec4.js +149 -0
  15. package/apps/pwa/out/_next/static/chunks/2341-86cd06c0cf01aa33.js +1 -0
  16. package/apps/pwa/out/_next/static/chunks/2352.9abc42422bade876.js +1 -0
  17. package/apps/pwa/out/_next/static/chunks/2397-c1653a816061842d.js +1 -0
  18. package/apps/pwa/out/_next/static/chunks/{3103.0df8da390948bb84.js → 2500.cbc1257b774aae52.js} +1 -1
  19. package/apps/pwa/out/_next/static/chunks/{7644.17e37ba6f1d4226e.js → 2683.c9773a0c589b031b.js} +3 -3
  20. package/apps/pwa/out/_next/static/chunks/2709.8e1889034255fc5f.js +24 -0
  21. package/apps/pwa/out/_next/static/chunks/{4718-17d2af636796a330.js → 275-02ea4c2a33980422.js} +3 -3
  22. package/apps/pwa/out/_next/static/chunks/2812ca6a.3b9f4a7a08885744.js +1 -0
  23. package/apps/pwa/out/_next/static/chunks/284.ac77c0db55bfd3a8.js +1 -0
  24. package/apps/pwa/out/_next/static/chunks/{8714.ff0b7ce3ec3e3ae2.js → 2941.3c3546f96bc6efa7.js} +1 -1
  25. package/apps/pwa/out/_next/static/chunks/2976.b000698a3c6512dc.js +24 -0
  26. package/apps/pwa/out/_next/static/chunks/{9214.63a510d39178e997.js → 2986.45d7652e4f13557e.js} +2 -2
  27. package/apps/pwa/out/_next/static/chunks/3031-85328a92fcce4da6.js +1 -0
  28. package/apps/pwa/out/_next/static/chunks/3136.30aaaa5fa03662a3.js +1 -0
  29. package/apps/pwa/out/_next/static/chunks/{3677-4215f826f6aa68e5.js → 3148-98efd4869d660a87.js} +1 -1
  30. package/apps/pwa/out/_next/static/chunks/3155.2587a55196ecb394.js +226 -0
  31. package/apps/pwa/out/_next/static/chunks/3277.785db1cf09f98601.js +1 -0
  32. package/apps/pwa/out/_next/static/chunks/3320-f9c77381f85a2c0a.js +1 -0
  33. package/apps/pwa/out/_next/static/chunks/3324.a09703033abcbd2f.js +34 -0
  34. package/apps/pwa/out/_next/static/chunks/3386-91049feabff9a94e.js +1 -0
  35. package/apps/pwa/out/_next/static/chunks/339.80afb7e8839372af.js +8 -0
  36. package/apps/pwa/out/_next/static/chunks/3410.7f9af5ab77cbe65f.js +115 -0
  37. package/apps/pwa/out/_next/static/chunks/3538.a445e50bb359d068.js +32 -0
  38. package/apps/pwa/out/_next/static/chunks/3540c645.2595a6af01a97672.js +1 -0
  39. package/apps/pwa/out/_next/static/chunks/3621.581b2054cc14bee4.js +286 -0
  40. package/apps/pwa/out/_next/static/chunks/3676.8c28d16fd84ca843.js +1 -0
  41. package/apps/pwa/out/_next/static/chunks/{9512.5a76207a730e0491.js → 3727.7949ccaacaa71242.js} +2 -2
  42. package/apps/pwa/out/_next/static/chunks/375-b84540853523fe52.js +1 -0
  43. package/apps/pwa/out/_next/static/chunks/{8557-e7898769499cd56f.js → 3757-180308bc61021b05.js} +1 -1
  44. package/apps/pwa/out/_next/static/chunks/379.ee262e37586fe1ae.js +74 -0
  45. package/apps/pwa/out/_next/static/chunks/{359-2250789a2d3499e7.js → 3840-5825d56d46976a92.js} +1 -1
  46. package/apps/pwa/out/_next/static/chunks/3969-81054381eaec4c4c.js +1 -0
  47. package/apps/pwa/out/_next/static/chunks/{da5176c6.6773b6c5994e1d99.js → 3a3d9966.cc4d4585a2708e7c.js} +1 -1
  48. package/apps/pwa/out/_next/static/chunks/4067-bf9aa60547972937.js +1 -0
  49. package/apps/pwa/out/_next/static/chunks/4116.a84a92a2492c080e.js +1 -0
  50. package/apps/pwa/out/_next/static/chunks/4176.e5729c93c29151eb.js +104 -0
  51. package/apps/pwa/out/_next/static/chunks/4227-e6c84686bc8946ca.js +1 -0
  52. package/apps/pwa/out/_next/static/chunks/{9952.5daf5f94063a2b3e.js → 4286.b70c4520306817e8.js} +1 -1
  53. package/apps/pwa/out/_next/static/chunks/4304.e9b2512834a9e23e.js +23 -0
  54. package/apps/pwa/out/_next/static/chunks/4327.b9e08a71c0009348.js +1 -0
  55. package/apps/pwa/out/_next/static/chunks/{938.66ad1ef0e5abae1c.js → 4615.8525eb0add35eba6.js} +1 -1
  56. package/apps/pwa/out/_next/static/chunks/4946.bd106eafd668f248.js +148 -0
  57. package/apps/pwa/out/_next/static/chunks/5085-bce4904931767ca6.js +1 -0
  58. package/apps/pwa/out/_next/static/chunks/5125.2eb9968b83767193.js +93 -0
  59. package/apps/pwa/out/_next/static/chunks/5128-75b733fd74a9a1eb.js +1 -0
  60. package/apps/pwa/out/_next/static/chunks/{6236.e18cced2d5ba6afb.js → 528.38ce20ef8aa251ff.js} +16 -16
  61. package/apps/pwa/out/_next/static/chunks/5489f3fe.4bb1458b09f6dead.js +122 -0
  62. package/apps/pwa/out/_next/static/chunks/{3408.21d1570602f4b6c0.js → 552.b7d061ad91eeac51.js} +2 -2
  63. package/apps/pwa/out/_next/static/chunks/5560-2a4648f6a30f16e7.js +1 -0
  64. package/apps/pwa/out/_next/static/chunks/5711.957b095705c12560.js +1 -0
  65. package/apps/pwa/out/_next/static/chunks/{1530.0e612369b6fd7ea0.js → 575.d929793a53f27c4b.js} +1 -1
  66. package/apps/pwa/out/_next/static/chunks/5772-e29e14f8ff127122.js +1 -0
  67. package/apps/pwa/out/_next/static/chunks/5887.5b2f5b44ce0f7e9a.js +1 -0
  68. package/apps/pwa/out/_next/static/chunks/5899-4c112a2d908cf97f.js +1 -0
  69. package/apps/pwa/out/_next/static/chunks/599.c39c571b6733f2a2.js +41 -0
  70. package/apps/pwa/out/_next/static/chunks/6041.1b65efb796ebc2a5.js +79 -0
  71. package/apps/pwa/out/_next/static/chunks/6057-765c0a26028c86b2.js +1 -0
  72. package/apps/pwa/out/_next/static/chunks/6142.f289e0d039f453a6.js +1 -0
  73. package/apps/pwa/out/_next/static/chunks/6199-6bcd61d2a3910e04.js +1 -0
  74. package/apps/pwa/out/_next/static/chunks/6236.cdf7293e710a9b2d.js +1 -0
  75. package/apps/pwa/out/_next/static/chunks/6387-237e079dac9a3ae6.js +1 -0
  76. package/apps/pwa/out/_next/static/chunks/6448-b6d272d074276e14.js +1 -0
  77. package/apps/pwa/out/_next/static/chunks/6466-92e65a48490b68a9.js +1 -0
  78. package/apps/pwa/out/_next/static/chunks/6566.926a1d1b7c911442.js +1 -0
  79. package/apps/pwa/out/_next/static/chunks/6580-cdc0e4a634ce4708.js +1 -0
  80. package/apps/pwa/out/_next/static/chunks/6659-b242dc31b20b3f29.js +1 -0
  81. package/apps/pwa/out/_next/static/chunks/6690.c5d9b321b1f79384.js +1 -0
  82. package/apps/pwa/out/_next/static/chunks/671-e9b6ad0c771c5514.js +1 -0
  83. package/apps/pwa/out/_next/static/chunks/6862.bcbf89dd0f4496b3.js +27 -0
  84. package/apps/pwa/out/_next/static/chunks/6912-7b375ee48732c767.js +1 -0
  85. package/apps/pwa/out/_next/static/chunks/6925.562d532110879886.js +1 -0
  86. package/apps/pwa/out/_next/static/chunks/{7385.50a308a477bdfc21.js → 6943.c6b24124853a47b2.js} +1 -1
  87. package/apps/pwa/out/_next/static/chunks/{630.fe5a46428d63b013.js → 727.7deb87749b0a343a.js} +1 -1
  88. package/apps/pwa/out/_next/static/chunks/{2018.a741297bce759490.js → 7481.39f7a4654907bf6e.js} +1 -1
  89. package/apps/pwa/out/_next/static/chunks/7545.b1aa42cd15503319.js +1 -0
  90. package/apps/pwa/out/_next/static/chunks/7551-416d298c2dc4a9ab.js +1 -0
  91. package/apps/pwa/out/_next/static/chunks/{8444.4c26b379ca2b9596.js → 771.c3cdb6c1f7f47c02.js} +17 -17
  92. package/apps/pwa/out/_next/static/chunks/7784.1f0ac4a16d190cf4.js +1 -0
  93. package/apps/pwa/out/_next/static/chunks/7870-309de463786ac1fc.js +1 -0
  94. package/apps/pwa/out/_next/static/chunks/7888-e29b151bb6a3bb8b.js +1 -0
  95. package/apps/pwa/out/_next/static/chunks/{3589.5444a06bcf6e775c.js → 7891.03f910124a737985.js} +1 -1
  96. package/apps/pwa/out/_next/static/chunks/7905-6ba78d9234608f79.js +1 -0
  97. package/apps/pwa/out/_next/static/chunks/8037.e254fd797aa224d1.js +1 -0
  98. package/apps/pwa/out/_next/static/chunks/8207.f527886b7c464529.js +1 -0
  99. package/apps/pwa/out/_next/static/chunks/856.50bda61439d465e6.js +62 -0
  100. package/apps/pwa/out/_next/static/chunks/{b2f6ba4d.fb56fdbbf798df33.js → 873d6c12.09bd499f57171543.js} +1 -1
  101. package/apps/pwa/out/_next/static/chunks/{5101.e32282718f99ed6f.js → 8904.7d51af2dc033965c.js} +2 -2
  102. package/apps/pwa/out/_next/static/chunks/9031-92e9b487edb681ee.js +1 -0
  103. package/apps/pwa/out/_next/static/chunks/9060.5410d9f6a95f6287.js +90 -0
  104. package/apps/pwa/out/_next/static/chunks/{5637.281e5dec4ea6ecf1.js → 914.8abefd48d579547b.js} +2 -2
  105. package/apps/pwa/out/_next/static/chunks/9187-c87a2207d4ac5d46.js +1 -0
  106. package/apps/pwa/out/_next/static/chunks/{4705-194e64e47ca0fbdb.js → 9250-072df22eaadaa6b5.js} +1 -1
  107. package/apps/pwa/out/_next/static/chunks/9289.3e92f278821e18e0.js +1 -0
  108. package/apps/pwa/out/_next/static/chunks/9319.7816d3cc741cd34f.js +1 -0
  109. package/apps/pwa/out/_next/static/chunks/9327-e016bb9f1674d24f.js +1 -0
  110. package/apps/pwa/out/_next/static/chunks/9365.3de48bf75193ff9a.js +77 -0
  111. package/apps/pwa/out/_next/static/chunks/9383.5b5e9aa56b5fea97.js +1 -0
  112. package/apps/pwa/out/_next/static/chunks/9387-cb929573ef436f39.js +1 -0
  113. package/apps/pwa/out/_next/static/chunks/9489.c27becacc3283dec.js +1 -0
  114. package/apps/pwa/out/_next/static/chunks/{8637.47f5b35afcae5e6b.js → 9514.131c52cc75fe6439.js} +1 -1
  115. package/apps/pwa/out/_next/static/chunks/9536.28962663c7734376.js +1 -0
  116. package/apps/pwa/out/_next/static/chunks/9686-12286f5bbf15a5a0.js +1 -0
  117. package/apps/pwa/out/_next/static/chunks/9776.289d40cc5a4c342a.js +1 -0
  118. package/apps/pwa/out/_next/static/chunks/{1674.2a65fd5668e1cc5f.js → 9789.60f723d18097ec30.js} +1 -1
  119. package/apps/pwa/out/_next/static/chunks/989.f0c17523c5e61f65.js +1 -0
  120. package/apps/pwa/out/_next/static/chunks/9972-1df393aa8d4f7d52.js +1 -0
  121. package/apps/pwa/out/_next/static/chunks/9f31e478.fefcbcd3c388ebc5.js +1 -0
  122. package/apps/pwa/out/_next/static/chunks/app/_not-found/page-96750aba7430959f.js +1 -0
  123. package/apps/pwa/out/_next/static/chunks/app/approvals/page-4105e5bbbb043024.js +1 -0
  124. package/apps/pwa/out/_next/static/chunks/app/autopilot/page-5d4fa75c2acb113e.js +1 -0
  125. package/apps/pwa/out/_next/static/chunks/app/board/page-a79a9bdb3b2142bf.js +1 -0
  126. package/apps/pwa/out/_next/static/chunks/app/botlab/page-f1c2047484992a35.js +1 -0
  127. package/apps/pwa/out/_next/static/chunks/app/bots/page-15ffc49b2d8c70e2.js +1 -0
  128. package/apps/pwa/out/_next/static/chunks/app/ceo/page-67d53a3fc8734135.js +1 -0
  129. package/apps/pwa/out/_next/static/chunks/app/chat/page-e30c8dc696491336.js +1 -0
  130. package/apps/pwa/out/_next/static/chunks/app/consult/page-2136e04fa77696e2.js +1 -0
  131. package/apps/pwa/out/_next/static/chunks/app/control/page-fecd2814790c2e12.js +1 -0
  132. package/apps/pwa/out/_next/static/chunks/app/decisions/page-280aa4a98fc5bb44.js +1 -0
  133. package/apps/pwa/out/_next/static/chunks/app/design-check/page-c14e96b65fb4b883.js +1 -0
  134. package/apps/pwa/out/_next/static/chunks/app/editor/page-187dac74825ed6bf.js +1 -0
  135. package/apps/pwa/out/_next/static/chunks/app/exec/page-6bc7246ea8c92448.js +1 -0
  136. package/apps/pwa/out/_next/static/chunks/app/field/page-083747f1d4518f61.js +1 -0
  137. package/apps/pwa/out/_next/static/chunks/app/healthz/route-96750aba7430959f.js +1 -0
  138. package/apps/pwa/out/_next/static/chunks/app/inside/page-15ca95a16ec96e1f.js +1 -0
  139. package/apps/pwa/out/_next/static/chunks/app/intake/page-a8ac031b3810eb64.js +1 -0
  140. package/apps/pwa/out/_next/static/chunks/app/layout-8835f93110494cda.js +1 -0
  141. package/apps/pwa/out/_next/static/chunks/app/live/page-e2de2e59111c9aad.js +1 -0
  142. package/apps/pwa/out/_next/static/chunks/app/live-run/page-f2b2e4bf6e981450.js +1 -0
  143. package/apps/pwa/out/_next/static/chunks/app/loops/page-5b92b7f75df20948.js +1 -0
  144. package/apps/pwa/out/_next/static/chunks/app/market/page-468eddf2b1a84ecb.js +1 -0
  145. package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-2af16e62c12f22df.js +1 -0
  146. package/apps/pwa/out/_next/static/chunks/app/morning/page-18b40867a77a5793.js +1 -0
  147. package/apps/pwa/out/_next/static/chunks/app/not-found-fe934f2979f5a4a2.js +1 -0
  148. package/apps/pwa/out/_next/static/chunks/app/observatory/page-3eec435537357170.js +1 -0
  149. package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-ff88cbfd2aa99fc8.js +1 -0
  150. package/apps/pwa/out/_next/static/chunks/app/ops/release/page-a5b39fb780c70ab5.js +1 -0
  151. package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-ae465dde1d1b3933.js +1 -0
  152. package/apps/pwa/out/_next/static/chunks/app/outputs/page-e7abc34a48a6f71e.js +1 -0
  153. package/apps/pwa/out/_next/static/chunks/app/page-cab9674fde9ead26.js +1 -0
  154. package/apps/pwa/out/_next/static/chunks/app/reflection/page-1da49bc8712284d0.js +1 -0
  155. package/apps/pwa/out/_next/static/chunks/app/scheduler/page-5e8aa657551ac912.js +1 -0
  156. package/apps/pwa/out/_next/static/chunks/app/sessions/page-fcc36f36c6dc1fe2.js +1 -0
  157. package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-d22db22f2a7296ca.js +1 -0
  158. package/apps/pwa/out/_next/static/chunks/app/settings/page-d12dc7b1773878f0.js +1 -0
  159. package/apps/pwa/out/_next/static/chunks/app/setup/done/page-99debec9ea7fbec0.js +1 -0
  160. package/apps/pwa/out/_next/static/chunks/app/setup/layout-96750aba7430959f.js +1 -0
  161. package/apps/pwa/out/_next/static/chunks/app/setup/page-2a088a78bad7e924.js +1 -0
  162. package/apps/pwa/out/_next/static/chunks/app/share/page-2e8ed57db7e69993.js +1 -0
  163. package/apps/pwa/out/_next/static/chunks/app/showroom/page-4b3a16213c2ae8fe.js +1 -0
  164. package/apps/pwa/out/_next/static/chunks/app/tasks/page-f098747ddf38c98b.js +1 -0
  165. package/apps/pwa/out/_next/static/chunks/app/term/page-c15958835534404b.js +1 -0
  166. package/apps/pwa/out/_next/static/chunks/app/today/page-68279e3c843c1fd7.js +1 -0
  167. package/apps/pwa/out/_next/static/chunks/app/trace/page-a34a74453367a39d.js +1 -0
  168. package/apps/pwa/out/_next/static/chunks/app/vault/page-8767a7db2155a5bd.js +1 -0
  169. package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-bd5976683460d7f2.js +1 -0
  170. package/apps/pwa/out/_next/static/chunks/app/workflows/page-b7364835e7f2ef54.js +1 -0
  171. package/apps/pwa/out/_next/static/chunks/app/workspace/page-311af16b3ee0ffca.js +1 -0
  172. package/apps/pwa/out/_next/static/chunks/app/worktrees/page-fb670757274ae990.js +1 -0
  173. package/apps/pwa/out/_next/static/chunks/{0368f25d-ad84af92fefee68f.js → ccae1c4b-0cf414f5eff1b10d.js} +1 -1
  174. package/apps/pwa/out/_next/static/chunks/{cbe38a15.5a032598e39970c6.js → ceba0382.650712b56b85b582.js} +1 -1
  175. package/apps/pwa/out/_next/static/chunks/{b6705a4f-b9a9047de9eecfd0.js → da5ecc5c-b005ad8cac737d57.js} +1 -1
  176. package/apps/pwa/out/_next/static/chunks/{56d372f2.681ab4ec4c998fae.js → f9a61e4d.1fc2c1dbdd49fe46.js} +1 -1
  177. package/apps/pwa/out/_next/static/chunks/framework-6d497cbf1eef04c6.js +1 -0
  178. package/apps/pwa/out/_next/static/chunks/main-app-012f5edec932f337.js +1 -0
  179. package/apps/pwa/out/_next/static/chunks/main-da5aeb809edc94a2.js +1 -0
  180. package/apps/pwa/out/_next/static/chunks/pages/_app-5ee319af6f749dfe.js +1 -0
  181. package/apps/pwa/out/_next/static/chunks/pages/_error-4bc84653a718d6c6.js +1 -0
  182. package/apps/pwa/out/_next/static/chunks/webpack-8a96cf6775c73d6e.js +1 -0
  183. package/apps/pwa/out/_next/static/{T1mBQqmkwKDLGtyisDCOd → uC-N0emedeNOFuaBQFv-I}/_buildManifest.js +1 -1
  184. package/apps/pwa/out/approvals/index.html +1 -1
  185. package/apps/pwa/out/approvals/index.txt +22 -22
  186. package/apps/pwa/out/autopilot/index.html +1 -1
  187. package/apps/pwa/out/autopilot/index.txt +22 -22
  188. package/apps/pwa/out/board/index.html +1 -1
  189. package/apps/pwa/out/board/index.txt +22 -22
  190. package/apps/pwa/out/botlab/index.html +1 -1
  191. package/apps/pwa/out/botlab/index.txt +21 -21
  192. package/apps/pwa/out/bots/index.html +1 -1
  193. package/apps/pwa/out/bots/index.txt +21 -21
  194. package/apps/pwa/out/ceo/index.html +1 -1
  195. package/apps/pwa/out/ceo/index.txt +22 -22
  196. package/apps/pwa/out/chat/index.html +1 -1
  197. package/apps/pwa/out/chat/index.txt +21 -21
  198. package/apps/pwa/out/consult/index.html +1 -1
  199. package/apps/pwa/out/consult/index.txt +22 -22
  200. package/apps/pwa/out/control/index.html +1 -1
  201. package/apps/pwa/out/control/index.txt +22 -22
  202. package/apps/pwa/out/decisions/index.html +1 -1
  203. package/apps/pwa/out/decisions/index.txt +21 -21
  204. package/apps/pwa/out/design-check/index.html +1 -1
  205. package/apps/pwa/out/design-check/index.txt +22 -22
  206. package/apps/pwa/out/editor/index.html +1 -1
  207. package/apps/pwa/out/editor/index.txt +22 -22
  208. package/apps/pwa/out/exec/index.html +1 -1
  209. package/apps/pwa/out/exec/index.txt +22 -22
  210. package/apps/pwa/out/field/index.html +1 -1
  211. package/apps/pwa/out/field/index.txt +22 -22
  212. package/apps/pwa/out/healthz +1 -1
  213. package/apps/pwa/out/index.html +1 -1
  214. package/apps/pwa/out/index.txt +21 -21
  215. package/apps/pwa/out/inside/index.html +1 -1
  216. package/apps/pwa/out/inside/index.txt +21 -21
  217. package/apps/pwa/out/intake/index.html +1 -1
  218. package/apps/pwa/out/intake/index.txt +22 -22
  219. package/apps/pwa/out/live/index.html +1 -1
  220. package/apps/pwa/out/live/index.txt +22 -22
  221. package/apps/pwa/out/live-run/index.html +1 -1
  222. package/apps/pwa/out/live-run/index.txt +22 -22
  223. package/apps/pwa/out/loops/index.html +1 -1
  224. package/apps/pwa/out/loops/index.txt +21 -21
  225. package/apps/pwa/out/market/index.html +1 -1
  226. package/apps/pwa/out/market/index.txt +21 -21
  227. package/apps/pwa/out/missions/placeholder/index.html +1 -1
  228. package/apps/pwa/out/missions/placeholder/index.txt +21 -21
  229. package/apps/pwa/out/morning/index.html +1 -1
  230. package/apps/pwa/out/morning/index.txt +22 -22
  231. package/apps/pwa/out/observatory/index.html +1 -1
  232. package/apps/pwa/out/observatory/index.txt +22 -22
  233. package/apps/pwa/out/ops/checklist/index.html +1 -1
  234. package/apps/pwa/out/ops/checklist/index.txt +21 -21
  235. package/apps/pwa/out/ops/release/index.html +1 -1
  236. package/apps/pwa/out/ops/release/index.txt +21 -21
  237. package/apps/pwa/out/ops/seats/index.html +1 -1
  238. package/apps/pwa/out/ops/seats/index.txt +21 -21
  239. package/apps/pwa/out/outputs/index.html +1 -1
  240. package/apps/pwa/out/outputs/index.txt +21 -21
  241. package/apps/pwa/out/reflection/index.html +1 -1
  242. package/apps/pwa/out/reflection/index.txt +22 -22
  243. package/apps/pwa/out/scheduler/index.html +1 -1
  244. package/apps/pwa/out/scheduler/index.txt +22 -22
  245. package/apps/pwa/out/sessions/index.html +1 -1
  246. package/apps/pwa/out/sessions/index.txt +21 -21
  247. package/apps/pwa/out/settings/devices/index.html +1 -1
  248. package/apps/pwa/out/settings/devices/index.txt +22 -22
  249. package/apps/pwa/out/settings/index.html +1 -1
  250. package/apps/pwa/out/settings/index.txt +22 -22
  251. package/apps/pwa/out/setup/done/index.html +1 -1
  252. package/apps/pwa/out/setup/done/index.txt +22 -22
  253. package/apps/pwa/out/setup/index.html +1 -1
  254. package/apps/pwa/out/setup/index.txt +22 -22
  255. package/apps/pwa/out/share/index.html +1 -1
  256. package/apps/pwa/out/share/index.txt +22 -22
  257. package/apps/pwa/out/showroom/index.html +1 -1
  258. package/apps/pwa/out/showroom/index.txt +21 -21
  259. package/apps/pwa/out/tasks/index.html +1 -1
  260. package/apps/pwa/out/tasks/index.txt +22 -22
  261. package/apps/pwa/out/term/index.html +1 -1
  262. package/apps/pwa/out/term/index.txt +22 -22
  263. package/apps/pwa/out/today/index.html +1 -1
  264. package/apps/pwa/out/today/index.txt +22 -22
  265. package/apps/pwa/out/trace/index.html +1 -1
  266. package/apps/pwa/out/trace/index.txt +22 -22
  267. package/apps/pwa/out/vault/index.html +1 -1
  268. package/apps/pwa/out/vault/index.txt +22 -22
  269. package/apps/pwa/out/workflows/chat-ui/index.html +1 -1
  270. package/apps/pwa/out/workflows/chat-ui/index.txt +22 -22
  271. package/apps/pwa/out/workflows/index.html +1 -1
  272. package/apps/pwa/out/workflows/index.txt +22 -22
  273. package/apps/pwa/out/workspace/index.html +1 -1
  274. package/apps/pwa/out/workspace/index.txt +22 -22
  275. package/apps/pwa/out/worktrees/index.html +1 -1
  276. package/apps/pwa/out/worktrees/index.txt +22 -22
  277. package/docs/goal-context/05-authoring-lessons.jsonl +47 -0
  278. package/docs/goal-context/README.md +3 -0
  279. package/graphs/default-loop.yaml +6 -1
  280. package/graphs/implement-loop.yaml +24 -0
  281. package/graphs/release/recipes.yaml +6 -0
  282. package/graphs/release/release-loop.yaml +17 -4
  283. package/graphs/wizard/recipes.yaml +44 -0
  284. package/graphs/wizard/wizard-loop.yaml +44 -0
  285. package/graphs/work/research-report.yaml +2 -0
  286. package/package.json +1 -1
  287. package/scripts/ci-typecheck-changed.ts +139 -5
  288. package/scripts/coord-role-pack.ts +1 -1
  289. package/scripts/first10-gate.ts +416 -0
  290. package/scripts/fleet/wsl-node-setup.sh +432 -0
  291. package/scripts/release-loop/docs-node.ts +204 -8
  292. package/scripts/release-loop/gate-node.ts +249 -53
  293. package/scripts/release-loop/node-verdict.ts +2 -0
  294. package/scripts/release-loop/resume-cap.ts +14 -34
  295. package/scripts/release-loop/resume-release.ts +37 -11
  296. package/scripts/release-loop/traffic-node.ts +59 -0
  297. package/scripts/release-loop/traffic-transition.ts +159 -0
  298. package/scripts/rhythm/daily.ts +137 -3
  299. package/scripts/ux-sim.ts +53 -0
  300. package/skills/README.md +1 -0
  301. package/src/acp/core-turn-bridge.ts +48 -6
  302. package/src/agent/delegate-hint.ts +16 -0
  303. package/src/agent/runner.ts +82 -2
  304. package/src/agent/task-notification.ts +56 -10
  305. package/src/agent/types.ts +4 -0
  306. package/src/agent-substrate/pr-reviewer.ts +55 -3
  307. package/src/agent-substrate/review-intent.ts +29 -2
  308. package/src/agent-substrate/review-observation.ts +3 -0
  309. package/src/agent-substrate/self-review-cli.ts +168 -16
  310. package/src/autopilot/mission-codebase-gate.ts +141 -12
  311. package/src/autopilot/pr-manager.ts +25 -5
  312. package/src/boot/daemon-tools/self-implement.ts +1 -0
  313. package/src/budget/usage-outcomes.ts +8 -4
  314. package/src/capture/tui-self-report.ts +102 -0
  315. package/src/chat/goal-continue-verdict.ts +41 -0
  316. package/src/chat/index.ts +30 -4
  317. package/src/chat/internal-turn-origin.ts +1 -0
  318. package/src/chat/paste-fold.ts +86 -0
  319. package/src/chat/tool-render/block.ts +32 -0
  320. package/src/chat/tool-render/dispatch.ts +2 -20
  321. package/src/chat/tool-render/result-text.ts +98 -0
  322. package/src/chat/turn-typeahead.ts +70 -7
  323. package/src/cli/config-audit.ts +119 -0
  324. package/src/cli/doctor-cli.ts +22 -0
  325. package/src/cli/guardian-cli.ts +10 -0
  326. package/src/cli/herdr-cli.ts +34 -0
  327. package/src/cli/light-entry-route.ts +6 -3
  328. package/src/cli/log-event-names.ts +2 -0
  329. package/src/cli/make-cli.ts +247 -11
  330. package/src/cli/msg-cli.ts +117 -3
  331. package/src/cli/pr-cli.ts +29 -16
  332. package/src/cli/pr-land-base-read.ts +11 -2
  333. package/src/cli/pr-land-heavy-remote.ts +6 -3
  334. package/src/cli/pr-land-overlap-evidence.ts +23 -4
  335. package/src/cli/pr-land-recovery.ts +117 -1
  336. package/src/cli/pty-takeover-cli.ts +8 -7
  337. package/src/cli/release-cli.ts +21 -5
  338. package/src/cli/release-single-flight.ts +1 -1
  339. package/src/cli/tasks-card-show.ts +162 -0
  340. package/src/cli/tasks-cli.ts +574 -356
  341. package/src/cli/tasks-read-cli.ts +197 -0
  342. package/src/core-turn/run-core-turn.ts +4 -2
  343. package/src/core-turn/run-goal-loop.ts +73 -16
  344. package/src/core-turn/types.ts +6 -1
  345. package/src/dashboard/context/keys.ts +8 -31
  346. package/src/dashboard/index.ts +202 -49
  347. package/src/dashboard/input/agent-wake.ts +7 -1
  348. package/src/dashboard/input/chat-main-plain-turn-runtime.ts +146 -3
  349. package/src/dashboard/input/chat-main-slash-command.ts +4 -2
  350. package/src/dashboard/input/goal-continue.ts +210 -0
  351. package/src/dashboard/input/goal-interim.ts +2 -0
  352. package/src/dashboard/input/internal-turn.ts +2 -8
  353. package/src/dashboard/input/seat-autowake.ts +9 -7
  354. package/src/dashboard/input/turn-autoheal.ts +52 -0
  355. package/src/dashboard/seat-boot-preamble.ts +132 -5
  356. package/src/dashboard/slash-runtime/chat-persona.ts +65 -8
  357. package/src/dashboard/slash-runtime/dashboard-handlers.ts +3 -2
  358. package/src/dashboard/slash-runtime/model-choices.ts +15 -0
  359. package/src/dashboard/stale-install-check.ts +3 -99
  360. package/src/debug/batch-queue.ts +119 -0
  361. package/src/debug/tui-log-tag.ts +67 -0
  362. package/src/display/agent-surface.ts +7 -0
  363. package/src/domains/standalone-log-sink.ts +15 -2
  364. package/src/esc-abort-gate.ts +69 -0
  365. package/src/git-fs/worktree.ts +95 -1
  366. package/src/graph-runner/graph-cli.ts +18 -0
  367. package/src/graph-runner/runner.ts +20 -11
  368. package/src/graph-wizard/generate.ts +108 -4
  369. package/src/graph-wizard/steps.ts +15 -0
  370. package/src/grounding/proactive-ground.ts +86 -0
  371. package/src/harness/control-inbox.ts +49 -1
  372. package/src/harness/harness-cli-command.ts +51 -7
  373. package/src/harness/harness-incidents.ts +52 -1
  374. package/src/harness/pod-control-send.ts +33 -5
  375. package/src/harness/self-send-remote.ts +69 -0
  376. package/src/harness/self-send-routing-guard.ts +6 -0
  377. package/src/harness/self-send-target.ts +4 -3
  378. package/src/index.ts +327 -12
  379. package/src/input-core/context-key-runtime.ts +21 -0
  380. package/src/light-cli.ts +6 -1
  381. package/src/llm-wellformed.ts +70 -0
  382. package/src/llm.ts +35 -4
  383. package/src/loops/msg-wake.ts +35 -39
  384. package/src/loops/orchestrator/inbox.ts +59 -11
  385. package/src/loops/orchestrator/knowhow-pack.ts +364 -0
  386. package/src/loops/orchestrator/tick.ts +5 -1
  387. package/src/maturity/feature-maturity.ts +1 -1
  388. package/src/models/prompts.ts +17 -2
  389. package/src/msg/msg-post-office.ts +116 -0
  390. package/src/mss/logging/log-store.ts +79 -22
  391. package/src/nexus/api/decisions-route.ts +38 -18
  392. package/src/nexus/api/graph-wizard-api.ts +20 -2
  393. package/src/nexus/boot/register-mcp-clients.ts +263 -38
  394. package/src/nexus/onboarding/first-boot-wizard.ts +56 -8
  395. package/src/onboarding/first-run.ts +37 -6
  396. package/src/onboarding/web-first.ts +43 -11
  397. package/src/ops/overview-collect.ts +12 -6
  398. package/src/ops/overview.ts +3 -3
  399. package/src/persona/loader.ts +11 -0
  400. package/src/persona/types.ts +8 -0
  401. package/src/prompt-library/session-guidance.ts +14 -0
  402. package/src/provider-summary.ts +8 -0
  403. package/src/pty-shell/herdr-agent-report.ts +118 -9
  404. package/src/pty-shell/herdr-prompt.ts +266 -0
  405. package/src/pty-shell/pty-control-ipc.ts +151 -8
  406. package/src/pty-shell/pty-special-keys.ts +42 -2
  407. package/src/pty-shell/stale-install-check.ts +99 -0
  408. package/src/pty-shell/tui-run-state.ts +14 -2
  409. package/src/release-loop/auto-start.ts +20 -2
  410. package/src/release-loop/checklist.ts +76 -4
  411. package/src/release-loop/rehearsal.ts +36 -20
  412. package/src/repl/index.ts +19 -1
  413. package/src/seat-loop/knowhow-lint.ts +1 -1
  414. package/src/self-dev/decompose-proposal.ts +172 -20
  415. package/src/self-dev/decompose.ts +61 -0
  416. package/src/self-dev/dev-cli.ts +37 -3
  417. package/src/self-dev/dev-pipeline.ts +8 -2
  418. package/src/self-dev/draft-triage-rules.ts +31 -0
  419. package/src/self-dev/glm-credential-guard.ts +77 -0
  420. package/src/self-dev/graph-journey-nodes.ts +1 -0
  421. package/src/self-dev/graph-journey-route.ts +12 -2
  422. package/src/self-dev/orchestrate-cli.ts +68 -3
  423. package/src/self-dev/orchestrate.ts +116 -17
  424. package/src/self-dev/run-supervisor.ts +55 -2
  425. package/src/self-dev/run-types.ts +1 -1
  426. package/src/self-health/autoheal.ts +153 -0
  427. package/src/self-health/signatures.ts +6 -0
  428. package/src/self-implement/device-first.ts +116 -0
  429. package/src/self-implement/doctor-visit.ts +239 -1
  430. package/src/self-implement/evidence-command-budget.ts +80 -0
  431. package/src/self-implement/goal-author-cli.ts +1 -0
  432. package/src/self-implement/goal-author-decompose.ts +265 -4
  433. package/src/self-implement/goal-author.ts +33 -8
  434. package/src/self-implement/goal-elaborate.ts +176 -22
  435. package/src/self-implement/goal-refine.ts +3 -0
  436. package/src/self-implement/graph-variant.ts +40 -6
  437. package/src/self-implement/headless-elanous-driver.ts +19 -3
  438. package/src/self-implement/off-diff-evidence.ts +58 -6
  439. package/src/self-implement/orchestrator.ts +222 -21
  440. package/src/self-implement/pod-warm-pool-profile.ts +1 -0
  441. package/src/self-implement/pwa-import-graph.ts +1 -1
  442. package/src/self-implement/rework-policy.ts +30 -0
  443. package/src/self-implement/run-ledger.ts +108 -0
  444. package/src/self-implement/run-ttl.ts +38 -24
  445. package/src/self-implement/scope-adjacency.ts +3 -1
  446. package/src/self-implement/seams.ts +60 -4
  447. package/src/self-implement/wiring-check.ts +358 -0
  448. package/src/shell-env-bootstrap.ts +11 -4
  449. package/src/skills/runner.ts +4 -2
  450. package/src/skills/tools/agent.ts +290 -48
  451. package/src/skills/tools/schedule-wakeup.ts +23 -4
  452. package/src/skills/tools/shell.ts +61 -6
  453. package/src/skills/tools/terminal-modal-inject.ts +1 -2
  454. package/src/skills/tools/terminal-modal.ts +10 -8
  455. package/src/skills/url-router.ts +41 -1
  456. package/src/smart-wizard/run.ts +66 -0
  457. package/src/status/bar.ts +34 -6
  458. package/src/status/status-provider-info.ts +37 -6
  459. package/src/steward/rejudge-tick.ts +10 -2
  460. package/src/steward/ta-repair-event-collect.ts +17 -6
  461. package/src/task-agent/actions.ts +3 -1
  462. package/src/task-agent/land-queue.ts +21 -8
  463. package/src/task-agent/live-moves.ts +22 -6
  464. package/src/task-agent/mission.ts +30 -0
  465. package/src/task-agent/rejudge-on-head.ts +15 -0
  466. package/src/task-agent/repair-cycle.ts +138 -32
  467. package/src/task-agent/repair-next-move.ts +31 -3
  468. package/src/task-agent/repair-outcomes.ts +29 -0
  469. package/src/task-agent/repair-worker.ts +14 -4
  470. package/src/task-agent/shadow.ts +41 -3
  471. package/src/task-agent/task-card-prefix.ts +2 -0
  472. package/src/task-agent/task-hand.ts +477 -22
  473. package/src/task-agent/task-parent-role-llm.ts +36 -0
  474. package/src/task-agent/tier-split.ts +78 -9
  475. package/src/task-orchestrator/surfaces/pod-account-broker.ts +9 -0
  476. package/src/task-orchestrator/surfaces/pod-child-reuse.ts +146 -0
  477. package/src/task-orchestrator/surfaces/pod-command-job.ts +86 -5
  478. package/src/task-orchestrator/surfaces/pod-failure-reason.ts +215 -3
  479. package/src/task-orchestrator/surfaces/pod-launch-history.ts +133 -0
  480. package/src/task-orchestrator/surfaces/pod-manifest-test-normalize.ts +11 -0
  481. package/src/task-orchestrator/surfaces/pod-pool.ts +76 -4
  482. package/src/task-orchestrator/surfaces/pod-provenance.ts +8 -2
  483. package/src/task-orchestrator/surfaces/pod-repair-commit.ts +18 -3
  484. package/src/task-orchestrator/surfaces/pod-si-warm-entry.ts +16 -0
  485. package/src/task-orchestrator/surfaces/pod-si-warm-host.ts +224 -0
  486. package/src/task-orchestrator/surfaces/pod-si-warm-protocol.ts +201 -0
  487. package/src/task-orchestrator/surfaces/pod-si-warm-provider.ts +444 -0
  488. package/src/task-orchestrator/surfaces/pod-si-warm-runner.ts +387 -0
  489. package/src/task-orchestrator/surfaces/pod-si-warm-transport.ts +157 -0
  490. package/src/task-orchestrator/surfaces/pod-warm-worker-protocol.ts +4 -0
  491. package/src/task-orchestrator/surfaces/pod-warm-worker-provider.ts +485 -36
  492. package/src/task-orchestrator/surfaces/pod-warm-worker-runtime.ts +3 -0
  493. package/src/task-orchestrator/surfaces/self-implement-pod.ts +396 -19
  494. package/src/task-orchestrator/surfaces/self-implement.ts +42 -2
  495. package/src/tool-runtime/index.ts +15 -2
  496. package/src/tool-runtime/mcp-proxy-bootstrap.ts +29 -0
  497. package/src/tty-foreground.ts +155 -0
  498. package/src/tui/chat/goal-interim.ts +173 -0
  499. package/src/tui/chat/log-view.ts +205 -18
  500. package/src/tui/chat/self-health-status.ts +232 -0
  501. package/src/tui/entry.ts +370 -81
  502. package/src/tui/input/composer.ts +8 -1
  503. package/src/tui/slash/compact-command.ts +7 -0
  504. package/src/tui/slash/compact.ts +1 -7
  505. package/src/tui/slash/resume.ts +75 -0
  506. package/src/tui-client/local-chat-turn.ts +45 -2
  507. package/src/tui-client/next-dashboard-runtime.ts +8 -0
  508. package/src/tui-client/next-loop-command.ts +70 -0
  509. package/src/tui-client/next-wakeup.ts +191 -0
  510. package/src/tui.ts +37 -0
  511. package/src/ui/modal-adapter.ts +2 -2
  512. package/src/ux-sim/classic-tui-seat-scenarios.ts +516 -0
  513. package/src/ux-sim/cli-config-audit-device.ts +121 -0
  514. package/src/ux-sim/dashboard-event-loop-stall-monitor-device.ts +238 -0
  515. package/src/ux-sim/event-monkey.ts +3 -2
  516. package/src/ux-sim/fake-bin.ts +45 -0
  517. package/src/ux-sim/fake-herdr.ts +238 -0
  518. package/src/ux-sim/fake-llm.ts +111 -6
  519. package/src/ux-sim/fault-glm-no-credential.ts +116 -0
  520. package/src/ux-sim/fault-nextmove-dispatch.ts +102 -1
  521. package/src/ux-sim/fault-scope-escape-lift.ts +33 -6
  522. package/src/ux-sim/fault-tui-400-autoheal.ts +297 -0
  523. package/src/ux-sim/goal-device.ts +619 -0
  524. package/src/ux-sim/in-process-cli.ts +22 -5
  525. package/src/ux-sim/mock-authoring-first-run-child.ts +35 -0
  526. package/src/ux-sim/mock-authoring-first-run.ts +97 -0
  527. package/src/ux-sim/mock-seat-pty-frame-child.ts +29 -0
  528. package/src/ux-sim/mock-seat-pty-frame.ts +297 -0
  529. package/src/ux-sim/mock-seat-pty-sequence-child.ts +21 -0
  530. package/src/ux-sim/mock-seat-pty-sequence.ts +206 -0
  531. package/src/ux-sim/next-tui-seat-scenarios.ts +631 -0
  532. package/src/ux-sim/onboarding-first-run-device.ts +269 -0
  533. package/src/ux-sim/pty-key-modifiers-device.ts +85 -0
  534. package/src/ux-sim/subagent-tools-device.ts +81 -0
  535. package/src/ux-sim/task-orchestrator-surfaces-self-implement-pod-device.ts +250 -0
  536. package/src/ux-sim/tty-foreground-steal-child.ts +21 -0
  537. package/src/version/packed-revision.json +1 -1
  538. package/apps/pwa/out/_next/static/chunks/1165.bad13fc9151a7288.js +0 -1
  539. package/apps/pwa/out/_next/static/chunks/13.02a07436dec15f89.js +0 -32
  540. package/apps/pwa/out/_next/static/chunks/1540.af38731fa7c4a3e0.js +0 -41
  541. package/apps/pwa/out/_next/static/chunks/1850.f2b470ba5a471da0.js +0 -24
  542. package/apps/pwa/out/_next/static/chunks/193.62da94cd0b88323b.js +0 -74
  543. package/apps/pwa/out/_next/static/chunks/1975.260f6d249fac5f7c.js +0 -1
  544. package/apps/pwa/out/_next/static/chunks/1982-67cd8dfe8682325f.js +0 -1
  545. package/apps/pwa/out/_next/static/chunks/1993-c0007b7ad0c0ef41.js +0 -1
  546. package/apps/pwa/out/_next/static/chunks/1999-bb415351c8a2846c.js +0 -1
  547. package/apps/pwa/out/_next/static/chunks/1c735de4.f993a30bbd3c57c4.js +0 -1
  548. package/apps/pwa/out/_next/static/chunks/1dc5a567.9b092bfae3d7099b.js +0 -1
  549. package/apps/pwa/out/_next/static/chunks/2085.8f950b4bda1cbbc7.js +0 -1
  550. package/apps/pwa/out/_next/static/chunks/2159-6179a961376956b9.js +0 -1
  551. package/apps/pwa/out/_next/static/chunks/216.b5c2a421aa1d28a5.js +0 -1
  552. package/apps/pwa/out/_next/static/chunks/2251.49fbe369f74c372c.js +0 -148
  553. package/apps/pwa/out/_next/static/chunks/2286-2939577360d3dcc0.js +0 -1
  554. package/apps/pwa/out/_next/static/chunks/2625.5d870aa999f33db1.js +0 -34
  555. package/apps/pwa/out/_next/static/chunks/2668.34d21539e62bf111.js +0 -77
  556. package/apps/pwa/out/_next/static/chunks/2833-0fe47af99ed13c29.js +0 -1
  557. package/apps/pwa/out/_next/static/chunks/2930.d0edb4f108787ef7.js +0 -1
  558. package/apps/pwa/out/_next/static/chunks/2973.77318e7d85f59477.js +0 -62
  559. package/apps/pwa/out/_next/static/chunks/3123.2bee9ba15d320bd2.js +0 -90
  560. package/apps/pwa/out/_next/static/chunks/3162-6cf652bf7124d8cf.js +0 -1
  561. package/apps/pwa/out/_next/static/chunks/3577-7340009f7007a795.js +0 -1
  562. package/apps/pwa/out/_next/static/chunks/3618.f514792d6c59d7fd.js +0 -36
  563. package/apps/pwa/out/_next/static/chunks/3669.343f9119aa276001.js +0 -1
  564. package/apps/pwa/out/_next/static/chunks/3736.c2efad489604cc3b.js +0 -79
  565. package/apps/pwa/out/_next/static/chunks/3817.f9aeab2bb6675d73.js +0 -1
  566. package/apps/pwa/out/_next/static/chunks/3f7c4ee5.3dde54f01a816613.js +0 -122
  567. package/apps/pwa/out/_next/static/chunks/4182-0b9b1251c29cc0cf.js +0 -1
  568. package/apps/pwa/out/_next/static/chunks/4441-875b97f5821ed58a.js +0 -1
  569. package/apps/pwa/out/_next/static/chunks/4582.bd68683c076649e3.js +0 -286
  570. package/apps/pwa/out/_next/static/chunks/4605-6e623f55aec77422.js +0 -1
  571. package/apps/pwa/out/_next/static/chunks/4607.5cc27468628eb4bf.js +0 -1
  572. package/apps/pwa/out/_next/static/chunks/4627.f07508b3936fd6c0.js +0 -24
  573. package/apps/pwa/out/_next/static/chunks/4747-c22262c093e46807.js +0 -1
  574. package/apps/pwa/out/_next/static/chunks/4775-178215aed0daba61.js +0 -1
  575. package/apps/pwa/out/_next/static/chunks/4815-6ffb8c3c991cc45d.js +0 -1
  576. package/apps/pwa/out/_next/static/chunks/4834-beca8b47ad29a898.js +0 -1
  577. package/apps/pwa/out/_next/static/chunks/5023-fb4802b6d2492b02.js +0 -1
  578. package/apps/pwa/out/_next/static/chunks/5154.a118f3957ed14e36.js +0 -1
  579. package/apps/pwa/out/_next/static/chunks/5210-a2e0015e3d4d5d9c.js +0 -1
  580. package/apps/pwa/out/_next/static/chunks/5356.84ac712cc15928bf.js +0 -1
  581. package/apps/pwa/out/_next/static/chunks/5401.22352141b6fd336e.js +0 -23
  582. package/apps/pwa/out/_next/static/chunks/5483-dd5d7697f6bdb106.js +0 -1
  583. package/apps/pwa/out/_next/static/chunks/5662.02eaa029af05ad46.js +0 -1
  584. package/apps/pwa/out/_next/static/chunks/5760.22456f433c6f42c0.js +0 -1
  585. package/apps/pwa/out/_next/static/chunks/5852.db1f7449f4f74612.js +0 -287
  586. package/apps/pwa/out/_next/static/chunks/5891-0f11a7d7362a9072.js +0 -1
  587. package/apps/pwa/out/_next/static/chunks/5943.264d14a44ca32513.js +0 -1
  588. package/apps/pwa/out/_next/static/chunks/604-1b3c39df083c02aa.js +0 -1
  589. package/apps/pwa/out/_next/static/chunks/6121-5f97072330738caf.js +0 -1
  590. package/apps/pwa/out/_next/static/chunks/6193.07d8ca5af4b09086.js +0 -1
  591. package/apps/pwa/out/_next/static/chunks/6203-b3fea3a60d69ff14.js +0 -1
  592. package/apps/pwa/out/_next/static/chunks/6286.d638fb5953e2e757.js +0 -8
  593. package/apps/pwa/out/_next/static/chunks/6301.ae0245f507e4395e.js +0 -1
  594. package/apps/pwa/out/_next/static/chunks/6673.fbbe5699f6ea5991.js +0 -27
  595. package/apps/pwa/out/_next/static/chunks/6777-f6d301efb5de828d.js +0 -1
  596. package/apps/pwa/out/_next/static/chunks/6786.423f24c88de034c7.js +0 -93
  597. package/apps/pwa/out/_next/static/chunks/6854-cef64a948c5e122d.js +0 -1
  598. package/apps/pwa/out/_next/static/chunks/6866-79aa5b4e47cac6aa.js +0 -1
  599. package/apps/pwa/out/_next/static/chunks/6b89c8bd.24df687a820500b3.js +0 -1
  600. package/apps/pwa/out/_next/static/chunks/7037-fe27f001db30d323.js +0 -1
  601. package/apps/pwa/out/_next/static/chunks/7080.2d826860534fd88e.js +0 -1
  602. package/apps/pwa/out/_next/static/chunks/7118.8731be28c3ebb14b.js +0 -1
  603. package/apps/pwa/out/_next/static/chunks/7196.44241bc1df3e26fe.js +0 -149
  604. package/apps/pwa/out/_next/static/chunks/7235.c7c4e6cb5c693c2d.js +0 -104
  605. package/apps/pwa/out/_next/static/chunks/7706-58bfb1546637f217.js +0 -1
  606. package/apps/pwa/out/_next/static/chunks/7839.5b91455338c9fd3f.js +0 -1
  607. package/apps/pwa/out/_next/static/chunks/7857-31f13ee96f4011aa.js +0 -1
  608. package/apps/pwa/out/_next/static/chunks/81.f74cb60312fe4001.js +0 -1
  609. package/apps/pwa/out/_next/static/chunks/8219.baa715d1deee80e2.js +0 -1
  610. package/apps/pwa/out/_next/static/chunks/8256.e3ac8421a71f82f4.js +0 -1
  611. package/apps/pwa/out/_next/static/chunks/8310-444a6a895c402f12.js +0 -1
  612. package/apps/pwa/out/_next/static/chunks/8423.f7dda8aca4fcaae5.js +0 -1
  613. package/apps/pwa/out/_next/static/chunks/8437-8d5492094b166cfa.js +0 -1
  614. package/apps/pwa/out/_next/static/chunks/8496.75649af8652c74f4.js +0 -226
  615. package/apps/pwa/out/_next/static/chunks/8576.65bb654b524f3614.js +0 -1
  616. package/apps/pwa/out/_next/static/chunks/8609.558ce2f8f9aea2be.js +0 -64
  617. package/apps/pwa/out/_next/static/chunks/8614.caec96cfb91f4ae7.js +0 -1
  618. package/apps/pwa/out/_next/static/chunks/8732.367f44a916202353.js +0 -1
  619. package/apps/pwa/out/_next/static/chunks/9141-7fd1f73a5400bdc2.js +0 -1
  620. package/apps/pwa/out/_next/static/chunks/921.c4267d0d69a65404.js +0 -1
  621. package/apps/pwa/out/_next/static/chunks/9261.3962c3321b047691.js +0 -115
  622. package/apps/pwa/out/_next/static/chunks/936-26efd1a0efdd44d3.js +0 -1
  623. package/apps/pwa/out/_next/static/chunks/9627-4b9efe616b27e2e2.js +0 -1
  624. package/apps/pwa/out/_next/static/chunks/967-2aa39b2d04b4c690.js +0 -1
  625. package/apps/pwa/out/_next/static/chunks/9734.40eb1e558c29ccea.js +0 -1
  626. package/apps/pwa/out/_next/static/chunks/9908.3aa54f7a586a73dc.js +0 -1
  627. package/apps/pwa/out/_next/static/chunks/9954-ca8d29752bdbb45a.js +0 -1
  628. package/apps/pwa/out/_next/static/chunks/9974-507fa67cb94066dd.js +0 -1
  629. package/apps/pwa/out/_next/static/chunks/app/_not-found/page-ce9e00f7fb45506a.js +0 -1
  630. package/apps/pwa/out/_next/static/chunks/app/approvals/page-fa59d6d17daa3389.js +0 -1
  631. package/apps/pwa/out/_next/static/chunks/app/autopilot/page-53f68bbe7bd4b774.js +0 -1
  632. package/apps/pwa/out/_next/static/chunks/app/board/page-1c500fbb9f4a7a04.js +0 -1
  633. package/apps/pwa/out/_next/static/chunks/app/botlab/page-99d72673aa5c307c.js +0 -1
  634. package/apps/pwa/out/_next/static/chunks/app/bots/page-d2d5adc1e9484c88.js +0 -1
  635. package/apps/pwa/out/_next/static/chunks/app/ceo/page-c607c5aae637f1cc.js +0 -1
  636. package/apps/pwa/out/_next/static/chunks/app/chat/page-fa8c23596d555c0f.js +0 -1
  637. package/apps/pwa/out/_next/static/chunks/app/consult/page-bdab8c5e855c8416.js +0 -1
  638. package/apps/pwa/out/_next/static/chunks/app/control/page-406b47745b53f269.js +0 -1
  639. package/apps/pwa/out/_next/static/chunks/app/decisions/page-a4276386b7051f50.js +0 -1
  640. package/apps/pwa/out/_next/static/chunks/app/design-check/page-8a26bab9ad375f25.js +0 -1
  641. package/apps/pwa/out/_next/static/chunks/app/editor/page-775f48aa1dc7a2d5.js +0 -1
  642. package/apps/pwa/out/_next/static/chunks/app/exec/page-1c4dd5f959d0c558.js +0 -1
  643. package/apps/pwa/out/_next/static/chunks/app/field/page-c48938a8377c9f70.js +0 -1
  644. package/apps/pwa/out/_next/static/chunks/app/healthz/route-ce9e00f7fb45506a.js +0 -1
  645. package/apps/pwa/out/_next/static/chunks/app/inside/page-c6e7905859425aa9.js +0 -1
  646. package/apps/pwa/out/_next/static/chunks/app/intake/page-c280f4252452e830.js +0 -1
  647. package/apps/pwa/out/_next/static/chunks/app/layout-cf8c57498f20970a.js +0 -1
  648. package/apps/pwa/out/_next/static/chunks/app/live/page-ca3a17caf409fc83.js +0 -1
  649. package/apps/pwa/out/_next/static/chunks/app/live-run/page-26e6c18a1a750cf6.js +0 -1
  650. package/apps/pwa/out/_next/static/chunks/app/loops/page-3abc872cc6aeee39.js +0 -1
  651. package/apps/pwa/out/_next/static/chunks/app/market/page-f7481b7b2174fe3d.js +0 -1
  652. package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-1ae7ef8077680337.js +0 -1
  653. package/apps/pwa/out/_next/static/chunks/app/morning/page-47c5d4db587266bd.js +0 -1
  654. package/apps/pwa/out/_next/static/chunks/app/not-found-415f1e243c7ccb13.js +0 -1
  655. package/apps/pwa/out/_next/static/chunks/app/observatory/page-73f380f17b76f95c.js +0 -1
  656. package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-2991073ad66ee2d9.js +0 -1
  657. package/apps/pwa/out/_next/static/chunks/app/ops/release/page-1f5a60f70cb4dd0c.js +0 -1
  658. package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-fbad60d1e358fb2c.js +0 -1
  659. package/apps/pwa/out/_next/static/chunks/app/outputs/page-bac7dee94e5eae4a.js +0 -1
  660. package/apps/pwa/out/_next/static/chunks/app/page-398047d6949e8ca5.js +0 -1
  661. package/apps/pwa/out/_next/static/chunks/app/reflection/page-2d33a2231540ca89.js +0 -1
  662. package/apps/pwa/out/_next/static/chunks/app/scheduler/page-5bf1e6bf70bcb96c.js +0 -1
  663. package/apps/pwa/out/_next/static/chunks/app/sessions/page-ba59c19376a0917d.js +0 -1
  664. package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-111f187139add30f.js +0 -1
  665. package/apps/pwa/out/_next/static/chunks/app/settings/page-acaae197d5be5779.js +0 -1
  666. package/apps/pwa/out/_next/static/chunks/app/setup/done/page-0df20b0f546a0d7d.js +0 -1
  667. package/apps/pwa/out/_next/static/chunks/app/setup/layout-ce9e00f7fb45506a.js +0 -1
  668. package/apps/pwa/out/_next/static/chunks/app/setup/page-27e1202d24b8fe35.js +0 -1
  669. package/apps/pwa/out/_next/static/chunks/app/share/page-bda78c50a78363e5.js +0 -1
  670. package/apps/pwa/out/_next/static/chunks/app/showroom/page-da592691293d9c9f.js +0 -1
  671. package/apps/pwa/out/_next/static/chunks/app/tasks/page-f832994317a2e9f0.js +0 -1
  672. package/apps/pwa/out/_next/static/chunks/app/term/page-dc0a532f5b9196ec.js +0 -1
  673. package/apps/pwa/out/_next/static/chunks/app/today/page-cfccbbeae0473404.js +0 -1
  674. package/apps/pwa/out/_next/static/chunks/app/trace/page-527e2073af84c81b.js +0 -1
  675. package/apps/pwa/out/_next/static/chunks/app/vault/page-bac86e9112671357.js +0 -1
  676. package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-6d59dff410e9d76a.js +0 -1
  677. package/apps/pwa/out/_next/static/chunks/app/workflows/page-53a61f8be09f02d2.js +0 -1
  678. package/apps/pwa/out/_next/static/chunks/app/workspace/page-db8f559e763c17f9.js +0 -1
  679. package/apps/pwa/out/_next/static/chunks/app/worktrees/page-c02aa4cc66455093.js +0 -1
  680. package/apps/pwa/out/_next/static/chunks/framework-50e6acebc630849b.js +0 -1
  681. package/apps/pwa/out/_next/static/chunks/main-7a1ae342d5ed75e6.js +0 -1
  682. package/apps/pwa/out/_next/static/chunks/main-app-7ad7d505ba1f92b4.js +0 -1
  683. package/apps/pwa/out/_next/static/chunks/pages/_app-02edba75232cb235.js +0 -1
  684. package/apps/pwa/out/_next/static/chunks/pages/_error-97d6ebae3e8eee4a.js +0 -1
  685. package/apps/pwa/out/_next/static/chunks/webpack-e986adaa429163e8.js +0 -1
  686. /package/apps/pwa/out/_next/static/{T1mBQqmkwKDLGtyisDCOd → uC-N0emedeNOFuaBQFv-I}/_ssgManifest.js +0 -0
@@ -0,0 +1,432 @@
1
+ #!/usr/bin/env bash
2
+ # One WSL worker at a time. Default is an offline plan; --apply requires SSH.
3
+ # MANUAL-windows-wsl-worker-setup-2026-10-11.md is the operational contract.
4
+ set -euo pipefail
5
+ usage() { echo 'usage: wsl-node-setup.sh <a2|a2b|b1|b2|b3|b4|b5|b6|b7|b8|b8b|train-route|side-env> --host <wsl> --distro <d> --win-user <u> [--mem 40GB] [--pod-cap 4] [--side-pid <live bun PID>] [--dry-run|--apply]' >&2; exit 2; }
6
+ [[ $# -ge 1 ]] || usage
7
+ STAGE=$1; shift
8
+ HOST='' DISTRO='' WIN_USER='' MEM=40GB POD_CAP=4 MODE=dry-run MEM_SET=0 POD_CAP_SET=0 SIDE_PID=''
9
+ while (( $# )); do
10
+ case $1 in
11
+ --host|--distro|--win-user|--mem|--pod-cap|--side-pid)
12
+ (( $# >= 2 )) || usage
13
+ case $1 in --host) HOST=$2;; --distro) DISTRO=$2;; --win-user) WIN_USER=$2;; --mem) MEM=$2; MEM_SET=1;; --pod-cap) POD_CAP=$2; POD_CAP_SET=1;; --side-pid) SIDE_PID=$2;; esac
14
+ shift 2;;
15
+ --dry-run) MODE=dry-run; shift;;
16
+ --apply) MODE=apply; shift;;
17
+ *) usage;;
18
+ esac
19
+ done
20
+ [[ $STAGE =~ ^(a2|a2b|b1|b2|b3|b4|b5|b6|b7|b8|b8b|train-route|side-env)$ ]] || usage
21
+ if [[ $STAGE == train-route && $MODE == apply ]]; then
22
+ echo 'train-route is a registration proposal only; --apply is unavailable' >&2
23
+ exit 2
24
+ fi
25
+ [[ $HOST =~ ^[a-zA-Z][a-zA-Z0-9-]*$ && $DISTRO =~ ^[a-zA-Z][a-zA-Z0-9._-]*$ && $WIN_USER =~ ^[a-zA-Z][a-zA-Z0-9._-]*$ ]] || usage
26
+ [[ $MEM =~ ^[1-9][0-9]*GB$ && $POD_CAP =~ ^[1-9][0-9]*$ ]] || usage
27
+ if [[ $MODE == apply && ( $STAGE == a2 || $STAGE == b7 ) && $MEM_SET != 1 ]] || [[ $MODE == apply && $STAGE == b7 && $POD_CAP_SET != 1 ]]; then
28
+ echo "--apply $STAGE requires explicit --mem (and --pod-cap for b7); dry-run defaults are planning examples only" >&2
29
+ exit 2
30
+ fi
31
+ [[ -z $SIDE_PID || $SIDE_PID =~ ^[1-9][0-9]*$ ]] || usage
32
+ ROOT=$(cd "$(dirname "$0")/../.." && pwd)
33
+ CTX=pool-$HOST
34
+ PIN=$(cd /tmp && eln config get harness.imageCommit 2>/dev/null | tr -d '"[:space:]' || true)
35
+ if [[ $PIN =~ ^[0-9a-f]{12,40}$ ]]; then PIN=${PIN:0:12}
36
+ elif [[ $MODE == apply && ( $STAGE == b4 || $STAGE == b5 ) ]]; then echo 'image pin unreadable; refusing apply' >&2; exit 1
37
+ else PIN=unmeasured; fi
38
+ BUN_VER=$(bun --version 2>/dev/null || true)
39
+ CODEX_VER=$(codex --version 2>/dev/null | awk '{print $NF}' || true)
40
+ [[ -z $BUN_VER || $BUN_VER =~ ^[0-9][0-9A-Za-z.+-]*$ ]] || { echo 'invalid local bun version' >&2; exit 1; }
41
+ [[ -z $CODEX_VER || $CODEX_VER =~ ^[0-9][0-9A-Za-z.+-]*$ ]] || { echo 'invalid local codex version' >&2; exit 1; }
42
+
43
+ plan() {
44
+ case $STAGE in
45
+ a2) echo 'CHECK Windows profile/Startup keepalive and .wslconfig; APPLY idempotent startup .cmd and [wsl2] memory/vmIdleTimeout; RECHECK files. No WSL shutdown.';;
46
+ a2b) echo 'CHECK Windows power settings, S4U boot task and unattended Tailscale; APPLY requires human elevated Windows PowerShell, then RECHECK. No reboot.';;
47
+ b1) echo 'CHECK docker-ce-cli/systemd, node, k3d and checksum-verified kubectl; APPLY Ubuntu packages and binaries; RECHECK. Refuse Docker Desktop shim.';;
48
+ b2) echo 'CHECK bun/codex versions, noninteractive links, main bare mirror, loopback registry and k3d cluster; APPLY missing parts; RECHECK.';;
49
+ b3) human_b3;;
50
+ b4) echo 'CHECK parent clone at installed pin, disabled error reports and elanous CLI; APPLY mirror clone, pinned install/config; RECHECK. Credentials remain human-only.';;
51
+ b5) echo 'CHECK amd64 image tag and remote image pin; APPLY build only from clean pinned checkout, smoke Pod, then pin; RECHECK.';;
52
+ b6) echo 'CHECK docker/pool/policies/usage/Secret names/GitHub/CLI/image; execution is read-only verification; RECHECK. Refuse B7 unless all pass.';;
53
+ b7) echo "CHECK parentHost entry; APPLY atomic backed-up config update with podPool k3d-elanous-pool:$POD_CAP; RECHECK.";;
54
+ b8) echo 'CHECK rail follow+pin hooks; APPLY backed-up idempotent host hooks; RECHECK. Rail process restart is OP-controlled.';;
55
+ b8b) echo 'CHECK autopsy host scan and run-ledger CLI; APPLY backed-up host list edit; RECHECK. Watcher restart is OP-controlled.';;
56
+ train-route) echo 'CHECK new host routing needs HOSTS, --free-host, fixed 8-shard WSL policy and disk-free; dry-run registration proposal only until host is reachable.';;
57
+ side-env) echo 'After a real side-pr.sh job starts, --apply --side-pid <live bun PID> audits that gate child /proc environment; before then UNMEASURED.';;
58
+ esac
59
+ }
60
+ human_b3() {
61
+ local mac_user; mac_user=$(id -un)
62
+ [[ $mac_user =~ ^[a-zA-Z][a-zA-Z0-9._-]*$ ]] || { echo 'Mac user unreadable' >&2; exit 1; }
63
+ cat <<'B3_COMMANDS' | sed "s/<wsl>/$HOST/g; s/<u>/$mac_user/g"
64
+ B3: 사람만 실행 · 값은 출력하지 않음(대표 승인 뒤 프롬프트의 ! 명령):
65
+ ! for k in openrouter_api_key zai_api_key; do ssh <wsl> "umask 077; mkdir -p ~/.cache; cat > ~/.cache/$k" < ~/.cache/$k; done
66
+ ! ssh <wsl> 'umask 077; mkdir -p ~/.grok; cat > ~/.grok/auth.json' < ~/.grok/auth.json
67
+ ! jq '{providers: (.providers | with_entries(select(.key|startswith("openai-codex"))))}' ~/.elanous/auth.json | ssh <wsl> 'umask 077; mkdir -p ~/.elanous; f=~/.elanous/auth.json; t=$(mktemp); cat > "$t"; if [ -f "$f" ]; then cp -p "$f" "$f.bak"; jq -s ".[0] * .[1]" "$f" "$t" > "$f.new"; else cp "$t" "$f.new"; fi; mv "$f.new" "$f"; rm -f "$t"; chmod 600 "$f"'
68
+ ! for d in .codex .codex-new .codex-third; do ssh <wsl> "umask 077; mkdir -p ~/$d; cat > ~/$d/auth.json" < ~/$d/auth.json; done
69
+ ! ssh <wsl> 'u=$(id -un); sed -i "s#/Users/<u>/#/home/$u/#g" ~/.elanous/auth.json'
70
+ GitHub device login: ssh <wsl> 'printf "\n\n\n" | BROWSER=/bin/true gh auth login -h github.com -p https -w' → 사람이 승인.
71
+ B3_COMMANDS
72
+ }
73
+ if [[ $MODE == dry-run || $STAGE == b3 || $STAGE == train-route ]]; then
74
+ mem_label=$MEM; cap_label=$POD_CAP
75
+ [[ $MEM_SET == 1 ]] || mem_label="$MEM(default example)"
76
+ [[ $POD_CAP_SET == 1 ]] || cap_label="$POD_CAP(default example)"
77
+ printf 'DRY-RUN %s host=%s distro=%s win-user=%s mem=%s pod-cap=%s pin=%s\n' "$STAGE" "$HOST" "$DISTRO" "$WIN_USER" "$mem_label" "$cap_label" "$PIN"
78
+ plan
79
+ if [[ $STAGE == train-route ]]; then
80
+ printf 'train-route.py: HOSTS+=(%s), disk-free %s, route --free-%s, fixed WSL policy 8 shards; train-loop free/occupancy and side-pr PATH/host branches must join the same change. Child environment remains unmeasured until a real side job.\n' "$HOST" "$HOST" "$HOST"
81
+ fi
82
+ exit 0
83
+ fi
84
+ if [[ $STAGE == side-env && -z $SIDE_PID ]]; then
85
+ echo 'UNMEASURED: run an actual side-pr.sh job, find its live bun gate child PID, then rerun side-env --apply --side-pid <PID>.' >&2
86
+ exit 12
87
+ fi
88
+ ssh -o BatchMode=yes -o ConnectTimeout=8 "$HOST" true >/dev/null || { echo "SSH unavailable: $HOST; no changes" >&2; exit 1; }
89
+ WSL_USER=$(ssh -o BatchMode=yes -o ConnectTimeout=8 "$HOST" id -un)
90
+ [[ $WSL_USER =~ ^[a-zA-Z][a-zA-Z0-9._-]*$ ]] || { echo 'WSL POSIX user unreadable' >&2; exit 1; }
91
+ if [[ $STAGE == side-env ]]; then
92
+ side="$HOME/elanous-hq/seat-state/OP/tools/train-1016/night-train/side-pr.sh"
93
+ rg -Fq 'env -i HOME=' "$side" || { echo 'side-pr.sh lacks env -i HOME contract' >&2; exit 1; }
94
+ ssh -o BatchMode=yes "$HOST" "python3 - '$SIDE_PID'" <<'PY'
95
+ import pathlib,sys
96
+ pid=sys.argv[1]
97
+ p=pathlib.Path('/proc')/pid
98
+ try:
99
+ command=(p/'cmdline').read_bytes().replace(b'\0',b' ')
100
+ executable=(p/'exe').resolve().name
101
+ names=[v.split(b'=',1)[0] for v in (p/'environ').read_bytes().split(b'\0') if b'=' in v]
102
+ except (FileNotFoundError,PermissionError) as e:
103
+ print(f'UNMEASURED: live gate child unavailable: {e}',file=sys.stderr);sys.exit(12)
104
+ if executable != 'bun' or b'bin/elanous.mjs' not in command or b'self gate --changed' not in command:
105
+ print('UNMEASURED: PID is not the bun side gate child',file=sys.stderr);sys.exit(12)
106
+ leaked=[n for n in names if n.startswith((b'ELANOUS_',b'XDG_'))]
107
+ if leaked:
108
+ print(f'FAIL: live side gate child contains {len(leaked)} ELANOUS_*/XDG_* names',file=sys.stderr);sys.exit(1)
109
+ print(f'PASS: live side gate child pid={pid} ELANOUS_*=0 XDG_*=0')
110
+ PY
111
+ exit $?
112
+ fi
113
+
114
+ remote() {
115
+ local phase=$1
116
+ ssh -o BatchMode=yes -o ConnectTimeout=10 "$HOST" "bash -s -- '$STAGE' '$phase' '$DISTRO' '$WIN_USER' '$MEM' '$POD_CAP' '$PIN' '$BUN_VER' '$CODEX_VER' '$HOST'" <<'REMOTE'
117
+ set -euo pipefail
118
+ stage=$1; phase=$2; distro=$3; win_user=$4; mem=$5; cap=$6; pin=$7; bun_ver=$8; codex_ver=$9; wsl_host=${10}
119
+ need() { echo "MISSING $stage: $*"; exit 10; }
120
+ if [[ $stage == a2 || $stage == a2b ]]; then
121
+ [[ $(cmd.exe /c echo %USERNAME% | tr -d '\r') == "$win_user" ]] || { echo 'Windows profile differs from --win-user'; exit 1; }
122
+ fi
123
+ case $stage:$phase in
124
+ a2:check)
125
+ profile=$(cmd.exe /c echo %USERPROFILE% | tr -d '\r'); p=$(wslpath "$profile")
126
+ appdata=$(cmd.exe /c echo %APPDATA% | tr -d '\r'); s=$(wslpath "$appdata")/Microsoft/Windows/Start\ Menu/Programs/Startup/elanous-wsl-keepalive.cmd
127
+ [[ -f $p/.wslconfig && -f $s ]] || need 'keepalive files'
128
+ content=$(printf 'wsl.exe -d %s --exec /bin/true\r\npowershell -WindowStyle Hidden -Command "Start-Process wsl.exe -ArgumentList '\''-d'\'','\''%s'\'','\''--exec'\'','\''/bin/sleep'\'','\''infinity'\'' -WindowStyle Hidden"\r\n' "$distro" "$distro")
129
+ grep -Fqx "memory=$mem" "$p/.wslconfig" && grep -Fqx 'vmIdleTimeout=-1' "$p/.wslconfig" && cmp -s "$s" <(printf '%s' "$content") || need 'keepalive content';;
130
+ a2:apply)
131
+ profile=$(cmd.exe /c echo %USERPROFILE% | tr -d '\r'); p=$(wslpath "$profile")
132
+ appdata=$(cmd.exe /c echo %APPDATA% | tr -d '\r'); s=$(wslpath "$appdata")/Microsoft/Windows/Start\ Menu/Programs/Startup
133
+ mkdir -p "$s"
134
+ python3 - "$p/.wslconfig" "$mem" <<'PY'
135
+ from pathlib import Path
136
+ import sys
137
+ p=Path(sys.argv[1]); mem=sys.argv[2]
138
+ old=p.read_text() if p.exists() else ''
139
+ lines=old.splitlines(); out=[]; in_wsl=False; found=False
140
+ for line in lines:
141
+ if line.strip().startswith('[') and line.strip().endswith(']'):
142
+ if in_wsl: out.extend([f'memory={mem}','vmIdleTimeout=-1'])
143
+ in_wsl=line.strip().lower()=='[wsl2]'; found |= in_wsl
144
+ if in_wsl and line.strip().split('=',1)[0].strip().lower() in ('memory','vmidletimeout'): continue
145
+ out.append(line)
146
+ if in_wsl: out.extend([f'memory={mem}','vmIdleTimeout=-1'])
147
+ if not found: out.extend(['[wsl2]',f'memory={mem}','vmIdleTimeout=-1'])
148
+ new='\n'.join(out)+'\n'
149
+ if new!=old:
150
+ if p.exists():
151
+ import datetime
152
+ stamp=datetime.datetime.now().strftime('%Y%m%d%H%M%S')
153
+ p.with_name(p.name+'.bak-elanous-'+stamp).write_text(old)
154
+ p.write_text(new)
155
+ PY
156
+ f="$s/elanous-wsl-keepalive.cmd"
157
+ content=$(printf 'wsl.exe -d %s --exec /bin/true\r\npowershell -WindowStyle Hidden -Command "Start-Process wsl.exe -ArgumentList '\''-d'\'','\''%s'\'','\''--exec'\'','\''/bin/sleep'\'','\''infinity'\'' -WindowStyle Hidden"\r\n' "$distro" "$distro")
158
+ [[ -f $f ]] && cmp -s "$f" <(printf '%s' "$content") || printf '%s' "$content" > "$f";;
159
+ a2b:check)
160
+ powershell.exe -NoProfile -Command '(Get-ScheduledTask -TaskName elanous-wsl-keepalive -ErrorAction SilentlyContinue).State' | tr -d '\r' | grep -Eq 'Ready|Running' || need 'S4U task'
161
+ for key in 'SUB_SLEEP STANDBYIDLE' 'SUB_SLEEP HIBERNATEIDLE' 'SUB_DISK DISKIDLE'; do
162
+ ac=$(/mnt/c/Windows/System32/powercfg.exe /query SCHEME_CURRENT $key | tr -d '\r' | grep -oE '0x[0-9a-fA-F]{8}' | tail -2 | head -1)
163
+ [[ $ac == 0x00000000 ]] || need "AC power $key"
164
+ done
165
+ /mnt/c/Windows/System32/reg.exe query 'HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Power' /v HiberbootEnabled | tr -d '\r' | grep -Eq 'HiberbootEnabled.*0x0$' || need 'fast startup off'
166
+ /mnt/c/Windows/System32/reg.exe query 'HKLM\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU' /v NoAutoRebootWithLoggedOnUsers | tr -d '\r' | grep -Eq 'NoAutoRebootWithLoggedOnUsers.*0x1$' || need 'update reboot policy'
167
+ /mnt/c/Windows/System32/sc.exe qc sshd | tr -d '\r' | grep -q AUTO_START || need 'sshd auto start'
168
+ /mnt/c/Windows/System32/sc.exe qc Tailscale | tr -d '\r' | grep -q AUTO_START || need 'Tailscale auto start'
169
+ '/mnt/c/Program Files/Tailscale/tailscale.exe' debug prefs | grep -q 'ForceDaemon.*true' || need 'unattended Tailscale';;
170
+ a2b:apply)
171
+ ps=$(cat <<'PS'
172
+ $ErrorActionPreference='Stop'
173
+ powercfg /hibernate off
174
+ powercfg /change standby-timeout-ac 0
175
+ powercfg /change hibernate-timeout-ac 0
176
+ powercfg /change disk-timeout-ac 0
177
+ reg add 'HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Power' /v HiberbootEnabled /t REG_DWORD /d 0 /f | Out-Null
178
+ reg add 'HKLM\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU' /v NoAutoRebootWithLoggedOnUsers /t REG_DWORD /d 1 /f | Out-Null
179
+ Set-Service -Name sshd -StartupType Automatic
180
+ Set-Service -Name Tailscale -StartupType Automatic
181
+ & 'C:\Program Files\Tailscale\tailscale.exe' set --unattended=true | Out-Null
182
+ $distroName='__DISTRO__'
183
+ $a=New-ScheduledTaskAction -Execute 'C:\Windows\System32\wsl.exe' -Argument "-d $distroName --exec /bin/sleep infinity"
184
+ $t=New-ScheduledTaskTrigger -AtStartup
185
+ $s=New-ScheduledTaskSettingsSet -ExecutionTimeLimit 0 -RestartCount 3 -RestartInterval (New-TimeSpan -Minutes 1) -AllowStartIfOnBatteries -DontStopIfGoingOnBatteries
186
+ $p=New-ScheduledTaskPrincipal -UserId $env:USERNAME -LogonType S4U -RunLevel Highest
187
+ Register-ScheduledTask -TaskName elanous-wsl-keepalive -Action $a -Trigger $t -Settings $s -Principal $p -Force | Out-Null
188
+ PS
189
+ )
190
+ ps=${ps//__DISTRO__/$distro}
191
+ if ! cmd.exe /c net session >/dev/null 2>&1; then
192
+ profile=$(cmd.exe /c echo %USERPROFILE% | tr -d '\r'); p=$(wslpath "$profile")
193
+ script="$p/elanous-a2b-admin.ps1"
194
+ printf '%s\n' "$ps" > "$script"
195
+ echo "ADMIN_ACTION_REQUIRED: open elevated Windows PowerShell as $win_user and run: powershell.exe -NoProfile -ExecutionPolicy Bypass -File '$profile\\elanous-a2b-admin.ps1'" >&2
196
+ echo 'After that, rerun a2b --apply for the check/recheck; no privileged change was attempted over SSH.' >&2
197
+ exit 12
198
+ fi
199
+ encoded=$(printf '%s' "$ps" | iconv -f UTF-8 -t UTF-16LE | base64 -w0)
200
+ powershell.exe -NoProfile -EncodedCommand "$encoded" >/dev/null
201
+ ;;
202
+ b1:check)
203
+ dpkg -S /usr/bin/docker | grep -q docker-ce-cli || need 'docker-ce-cli (Docker Desktop shim refused)'
204
+ systemctl is-active --quiet docker containerd || need 'docker/containerd active'
205
+ command -v node >/dev/null && command -v k3d >/dev/null && command -v kubectl >/dev/null || need 'node/k3d/kubectl'
206
+ kubectl version --client -o json 2>/dev/null | python3 -c 'import json,sys;sys.exit(0 if json.load(sys.stdin)["clientVersion"]["gitVersion"]=="v1.36.4" else 1)' || need 'kubectl version';;
207
+ b1:apply)
208
+ if [[ -e /usr/bin/docker ]] && ! dpkg -S /usr/bin/docker | grep -q docker-ce-cli; then echo 'Docker Desktop shim/other owner: refuse'; exit 1; fi
209
+ sudo apt-get install -y -qq ca-certificates curl && sudo install -m 0755 -d /etc/apt/keyrings
210
+ sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
211
+ sudo chmod a+r /etc/apt/keyrings/docker.asc
212
+ . /etc/os-release
213
+ printf 'Types: deb\nURIs: https://download.docker.com/linux/ubuntu\nSuites: %s\nComponents: stable\nArchitectures: %s\nSigned-By: /etc/apt/keyrings/docker.asc\n' "$VERSION_CODENAME" "$(dpkg --print-architecture)" | sudo tee /etc/apt/sources.list.d/docker.sources >/dev/null
214
+ sudo apt-get update -qq
215
+ sudo apt-get install -y -qq docker-ce docker-ce-cli containerd.io docker-buildx-plugin nodejs
216
+ sudo systemctl enable --now docker containerd
217
+ sudo usermod -aG docker "$USER"
218
+ command -v k3d >/dev/null || curl -fsSL https://raw.githubusercontent.com/k3d-io/k3d/main/install.sh | sudo bash
219
+ if ! command -v kubectl >/dev/null; then
220
+ cd /tmp; curl -fsSLO https://dl.k8s.io/release/v1.36.4/bin/linux/amd64/kubectl
221
+ curl -fsSLO https://dl.k8s.io/release/v1.36.4/bin/linux/amd64/kubectl.sha256
222
+ echo "$(cat kubectl.sha256) kubectl" | sha256sum --check
223
+ sudo install -m 0755 kubectl /usr/local/bin/kubectl
224
+ fi;;
225
+ b2:check)
226
+ [[ -n $bun_ver && -n $codex_ver ]] || { echo 'local bun/codex version unknown' >&2; exit 1; }
227
+ [[ $(/usr/local/bin/bun --version 2>/dev/null) == "$bun_ver" ]] || need 'bun version'
228
+ [[ $(/usr/local/bin/codex --version 2>/dev/null | awk '{print $NF}') == "$codex_ver" ]] || need 'codex version'
229
+ [[ -d $HOME/mirror/elanous-agent.git ]] || need 'bare mirror'
230
+ docker port k3d-elanous-registry 5000/tcp 2>/dev/null | grep -q '^127.0.0.1:5050$' || need 'loopback registry'
231
+ k3d cluster list elanous-pool | grep -q elanous-pool || need 'cluster'
232
+ docker exec k3d-elanous-pool-server-0 test -d /mirror-host/elanous-agent.git || need 'mirror mount'
233
+ docker exec k3d-elanous-pool-server-0 grep -q k3d-elanous-registry /etc/rancher/k3s/registries.yaml || need 'registry wiring'
234
+ docker network inspect k3d-elanous-pool | grep -q k3d-elanous-registry || need 'registry network';;
235
+ b2:apply)
236
+ [[ -n $bun_ver && -n $codex_ver ]] || { echo 'local bun/codex version unknown'; exit 1; }
237
+ [[ $(~/.bun/bin/bun --version 2>/dev/null) == "$bun_ver" ]] || curl -fsSL https://bun.sh/install | bash -s "bun-v$bun_ver"
238
+ [[ $(~/.bun/bin/codex --version 2>/dev/null | awk '{print $NF}') == "$codex_ver" ]] || ~/.bun/bin/bun add -g "@openai/codex@$codex_ver"
239
+ sudo ln -sf "$HOME/.bun/bin/bun" /usr/local/bin/bun
240
+ sudo ln -sf "$HOME/.bun/bin/codex" /usr/local/bin/codex
241
+ mkdir -p ~/mirror
242
+ [[ -d ~/mirror/elanous-agent.git ]] || git init -q --bare -b main ~/mirror/elanous-agent.git
243
+ mkdir -p ~/.docker-fleet
244
+ [[ -f ~/.docker-fleet/config.json ]] || printf '{"currentContext":""}\n' > ~/.docker-fleet/config.json
245
+ docker inspect k3d-elanous-registry >/dev/null 2>&1 || k3d registry create elanous-registry --port 127.0.0.1:5050
246
+ if ! k3d cluster list elanous-pool | grep -q elanous-pool; then
247
+ fqdn=$(tailscale status --self --json | python3 -c 'import json,sys;print(json.load(sys.stdin)["Self"]["DNSName"].rstrip("."))')
248
+ tail_ip=$(tailscale ip -4)
249
+ [[ $tail_ip =~ ^[0-9.]+$ ]] || { echo 'Tailscale IPv4 unavailable'; exit 1; }
250
+ k3d cluster create elanous-pool --image rancher/k3s:v1.36.4-k3s1 --no-lb --api-port "$tail_ip:6550" \
251
+ --k3s-arg "--tls-san=$wsl_host@server:0" --k3s-arg "--tls-san=$fqdn@server:0" \
252
+ --registry-use k3d-elanous-registry:5050 --volume "$HOME/mirror:/mirror-host:ro@server:0" --wait --timeout 300s
253
+ fi
254
+ docker network connect k3d-elanous-pool k3d-elanous-registry 2>/dev/null || true;;
255
+ b4:check)
256
+ [[ -d ~/source/elanous-agent/.git ]] || need 'parent clone'
257
+ [[ $(git -C ~/source/elanous-agent rev-parse HEAD 2>/dev/null) == "$pin"* ]] || need 'parent commit'
258
+ [[ $(readlink ~/.local/share/elanous/current 2>/dev/null) == *"$pin" ]] || need 'installed pin'
259
+ grep -q '"enabled"[[:space:]]*:[[:space:]]*false' ~/.elanous/config.json || need 'error reports disabled';;
260
+ b4:apply)
261
+ [[ -d ~/source/elanous-agent/.git ]] || git clone ~/mirror/elanous-agent.git ~/source/elanous-agent
262
+ mkdir -p ~/.elanous
263
+ [[ -f ~/.elanous/config.json ]] || printf '{"errorReports":{"enabled":false}}\n' > ~/.elanous/config.json
264
+ cd ~/source/elanous-agent
265
+ git fetch -q origin main
266
+ git checkout --detach "$pin"
267
+ /usr/local/bin/bun install --frozen-lockfile
268
+ (cd apps/pwa && /usr/local/bin/bun install --frozen-lockfile)
269
+ bash scripts/install.sh --no-modify-path --no-setup --yes
270
+ jq '.errorReports.enabled=false | .llm += {fallbackChain:["codex-rotate","grok","codex-credits"], zaiCodingPlan:{overage:"openrouter",maxConcurrent:3}}' ~/.elanous/config.json > ~/.elanous/config.json.new
271
+ mv ~/.elanous/config.json.new ~/.elanous/config.json;;
272
+ *) echo "remote stage not implemented: $stage/$phase" >&2; exit 1;;
273
+ esac
274
+ REMOTE
275
+ }
276
+
277
+ ensure_context() (
278
+ if kubectl config get-contexts -o name 2>/dev/null | grep -qx "$CTX" && kubectl --context "$CTX" version --request-timeout=8s >/dev/null 2>&1; then return 0; fi
279
+ local tmp; tmp=$(mktemp -d); trap 'rm -rf "$tmp"' EXIT
280
+ ssh -o BatchMode=yes "$HOST" 'k3d kubeconfig get elanous-pool' > "$tmp/kc.yaml"
281
+ python3 - "$tmp/kc.yaml" "$HOST" <<'PY'
282
+ from pathlib import Path
283
+ import re,sys
284
+ p=Path(sys.argv[1]); h=sys.argv[2]
285
+ s=p.read_text(); s=re.sub(r'server: https://[^\n]+',f'server: https://{h}:6550',s)
286
+ p.write_text(s.replace('k3d-elanous-pool',f'pool-{h}'))
287
+ PY
288
+ mkdir -p ~/.kube
289
+ if [[ -f ~/.kube/config ]]; then cp -p ~/.kube/config ~/.kube/config.bak-wsl-"$HOST"-"$(date +%Y%m%d%H%M%S)"; fi
290
+ KUBECONFIG="$HOME/.kube/config:$tmp/kc.yaml" kubectl config view --flatten > "$tmp/merged.yaml"
291
+ chmod 600 "$tmp/merged.yaml"; mv "$tmp/merged.yaml" ~/.kube/config
292
+ kubectl --context "$CTX" version --request-timeout=8s >/dev/null
293
+ )
294
+ check_local() {
295
+ case $STAGE in
296
+ b5)
297
+ ssh -o BatchMode=yes "$HOST" "curl -fsS http://localhost:5050/v2/elanous-harness/tags/list" | python3 -c 'import json,sys; sys.exit(0 if sys.argv[1] in json.load(sys.stdin).get("tags",[]) else 10)' "$PIN" || return 10
298
+ [[ $(ssh -o BatchMode=yes "$HOST" "~/.local/share/elanous/bin/elanous config get harness.imageCommit" | tr -d '"[:space:]') == "$PIN" ]] || return 10;;
299
+ b6)
300
+ bash "$ROOT/scripts/fleet/node-setup.sh" "$HOST" --check >/dev/null || return 10
301
+ ssh -o BatchMode=yes "$HOST" 'dpkg -S /usr/bin/docker' | grep -q docker-ce-cli || return 10
302
+ kubectl --context "$CTX" get nodes -o jsonpath='{.items[0].status.conditions[?(@.type=="Ready")].status}' | grep -qx True || return 10
303
+ kubectl --context "$CTX" diff -f "$ROOT/docker/h1/base.yaml" -f "$ROOT/docker/h1/policy-internet.yaml" -f "$ROOT/docker/h1/policy-bedrock.yaml" -f "$ROOT/docker/h1/policy-zai.yaml" >/dev/null || return 10
304
+ kubectl --context "$CTX" -n elanous-test get secret elanous-bedrock-aws elanous-zai-coding-plan >/dev/null || return 10
305
+ ssh -o BatchMode=yes "$HOST" 'gh auth status >/dev/null 2>&1 && ~/.local/share/elanous/bin/elanous --version >/dev/null && ~/.local/share/elanous/bin/elanous usage >/tmp/elanous-wsl-usage-check.txt && ! grep -E "codex.*error|grok.*error|openrouter.*error|zai.*error" /tmp/elanous-wsl-usage-check.txt' || return 10
306
+ check_local_b5 || return 10;;
307
+ b7)
308
+ python3 - "$HOST" "$WSL_USER" "$POD_CAP" <<'PY'
309
+ import json,sys
310
+ from pathlib import Path
311
+ p=Path.home()/'.elanous/config.json'; d=json.loads(p.read_text())
312
+ want={'host':sys.argv[1],'cwd':f'/home/{sys.argv[2]}/source/elanous-agent','podPool':f'k3d-elanous-pool:{sys.argv[3]}'}
313
+ sys.exit(0 if sum(row.get('host')==want['host'] and row==want for row in d.get('taskAgent',{}).get('parentHost',[]))==1 else 10)
314
+ PY
315
+ ;;
316
+ b8)
317
+ local rail="$HOME/elanous-hq/seat-state/OP/tools/rail-hourly-1008.sh"
318
+ rg -Fq 'wsl2_follow()' "$rail" && rg -Fq 'wsl2_pin()' "$rail" &&
319
+ rg -Fq "$HOST 따라감" "$rail" && rg -Fq 'wsl2_follow ${want}' "$rail" &&
320
+ rg -Fq 'wsl2_pin $c' "$rail" || return 10;;
321
+ b8b)
322
+ rg -q "for h in mbp node-b node-c host-e-wsl $HOST; do" "$HOME/elanous-hq/seat-state/OP/tools/autopsy-watch.sh" || return 10
323
+ ssh -o BatchMode=yes "$HOST" '~/.local/share/elanous/bin/elanous self run-ledger --help >/dev/null' || return 10;;
324
+ esac
325
+ }
326
+ check_local_b5() { local old=$STAGE; STAGE=b5; check_local; local rc=$?; STAGE=$old; return $rc; }
327
+ apply_local() {
328
+ case $STAGE in
329
+ b5)
330
+ kubectl --context "$CTX" get nodes -o jsonpath='{.items[0].status.conditions[?(@.type=="Ready")].status}' | grep -qx True || { echo 'B5 requires a Ready WSL pool' >&2; return 1; }
331
+ local image_root cleanup_image=0
332
+ if [[ $(git -C "$ROOT" rev-parse HEAD) == "$PIN"* && -z $(git -C "$ROOT" status --porcelain --untracked-files=no) ]]; then image_root=$ROOT
333
+ else
334
+ image_root=$(mktemp -d /tmp/elanous-wsl-image-XXXXXX)
335
+ eln git -C "$ROOT" worktree add --detach "$image_root/repo" "$PIN"
336
+ image_root=$image_root/repo; cleanup_image=1
337
+ fi
338
+ if ! (cd "$image_root" && ELANOUS_BUILD_REMOTE="$HOST" bash docker/harness/build.sh); then
339
+ if (( cleanup_image )); then eln git -C "$ROOT" worktree remove --force "$image_root"; rmdir "${image_root%/repo}"; fi
340
+ return 1
341
+ fi
342
+ if (( cleanup_image )); then eln git -C "$ROOT" worktree remove "$image_root"; rmdir "${image_root%/repo}"; fi
343
+ ssh -o BatchMode=yes "$HOST" "curl -fsS http://localhost:5050/v2/elanous-harness/tags/list" | python3 -c 'import json,sys; sys.exit(0 if sys.argv[1] in json.load(sys.stdin).get("tags",[]) else 1)' "$PIN" || { echo 'remote registry tag missing after build' >&2; return 1; }
344
+ local smoke=img-smoke-$$
345
+ kubectl --context "$CTX" -n elanous-test run "$smoke" --image="k3d-elanous-registry:5050/elanous-harness:$PIN" --restart=Never --command -- sh -c 'uname -m; elanous --version'
346
+ if ! kubectl --context "$CTX" -n elanous-test wait --for=jsonpath='{.status.phase}=Succeeded' "pod/$smoke" --timeout=120s || ! kubectl --context "$CTX" -n elanous-test logs "$smoke" | grep -q x86_64; then
347
+ kubectl --context "$CTX" -n elanous-test logs "$smoke" >&2 || true
348
+ kubectl --context "$CTX" -n elanous-test delete pod "$smoke" --ignore-not-found=true --wait=false >/dev/null || true
349
+ return 1
350
+ fi
351
+ kubectl --context "$CTX" -n elanous-test delete pod "$smoke" --wait=false
352
+ ssh -o BatchMode=yes "$HOST" "~/.local/share/elanous/bin/elanous config set harness.imageCommit '$PIN' --config-dir ~/.elanous" >/dev/null;;
353
+ b6)
354
+ # B6 only verifies. Missing credentials/Secrets require the human B3 boundary.
355
+ echo 'B6 is verification-only; apply A2..B5 and human B3, then recheck' >&2; return 1;;
356
+ b7)
357
+ local old=$STAGE; STAGE=b6; check_local || { STAGE=$old; echo 'B6 not green; parentHost insertion refused' >&2; return 1; }; STAGE=$old
358
+ python3 - "$HOST" "$WSL_USER" "$POD_CAP" <<'PY'
359
+ import json,os,sys,tempfile,time
360
+ from pathlib import Path
361
+ p=Path.home()/'.elanous/config.json'; d=json.loads(p.read_text())
362
+ want={'host':sys.argv[1],'cwd':f'/home/{sys.argv[2]}/source/elanous-agent','podPool':f'k3d-elanous-pool:{sys.argv[3]}'}
363
+ parent=d.setdefault('taskAgent',{}).setdefault('parentHost',[])
364
+ parent[:]=[row for row in parent if row.get('host')!=want['host']]+[want]
365
+ backup=p.with_name(p.name+f'.bak-wsl-{time.strftime("%Y%m%d%H%M%S")}'); backup.write_bytes(p.read_bytes())
366
+ fd,tmp=tempfile.mkstemp(dir=p.parent,prefix=p.name+'.tmp.'); os.fchmod(fd,0o600)
367
+ with os.fdopen(fd,'w') as f: json.dump(d,f,ensure_ascii=False,indent=2); f.write('\n')
368
+ os.replace(tmp,p)
369
+ PY
370
+ ;;
371
+ b8)
372
+ local old=$STAGE; STAGE=b7; check_local || { STAGE=$old; echo 'B8 requires parentHost B7' >&2; return 1; }; STAGE=$old
373
+ python3 - "$HOST" <<'PY'
374
+ from pathlib import Path
375
+ import sys,time
376
+ h=sys.argv[1]; p=Path.home()/'elanous-hq/seat-state/OP/tools/rail-hourly-1008.sh'; s=p.read_text()
377
+ if 'wsl2_follow()' not in s:
378
+ if s.count('wsl_follow() {')!=1 or s.count('\nwsl_pin() {')!=1 or s.count('\n# 10-09 20:5x')!=1 or s.count(' wsl_pin $c\n')!=1 or s.count('wsl_follow ${want}; image_pin ${want}')!=1:
379
+ raise SystemExit('rail anchor missing/ambiguous; no edit')
380
+ start=s.index('wsl_follow() {'); middle=s.index('\nwsl_pin() {',start); end=s.index('\n# 10-09 20:5x',middle)
381
+ original=s[start:end]
382
+ if original.count('host-e-wsl')<3: raise SystemExit('rail WSL host references missing; no edit')
383
+ block=original.replace('wsl_follow()', 'wsl2_follow()').replace('wsl_pin()', 'wsl2_pin()').replace('host-e-wsl',h)
384
+ if 'host-e-wsl' in block or block.count(h)<3: raise SystemExit('new rail host references incomplete; no edit')
385
+ s=s[:end]+'\n# second WSL worker installed by wsl-node-setup.sh\n'+block+'\n'+s[end:]
386
+ s=s.replace(' wsl_pin $c\n',' wsl_pin $c\n wsl2_pin $c\n',1)
387
+ s=s.replace('wsl_follow ${want}; image_pin ${want}', 'wsl_follow ${want}; wsl2_follow ${want}; image_pin ${want}',1)
388
+ backup=p.with_name(p.name+'.bak-wsl-'+time.strftime('%Y%m%d%H%M%S')); backup.write_text(p.read_text())
389
+ p.write_text(s)
390
+ PY
391
+ zsh -n "$HOME/elanous-hq/seat-state/OP/tools/rail-hourly-1008.sh"
392
+ echo 'rail script changed; OP restarts its recorded PID after release window' >&2;;
393
+ b8b)
394
+ local old=$STAGE; STAGE=b7; check_local || { STAGE=$old; echo 'B8b requires parentHost B7' >&2; return 1; }; STAGE=$old
395
+ ssh -o BatchMode=yes "$HOST" '~/.local/share/elanous/bin/elanous self run-ledger --help >/dev/null' || return 1
396
+ python3 - "$HOST" <<'PY'
397
+ from pathlib import Path
398
+ import sys,time
399
+ h=sys.argv[1]; p=Path.home()/'elanous-hq/seat-state/OP/tools/autopsy-watch.sh'; s=p.read_text()
400
+ old='for h in mbp node-b node-c host-e-wsl; do'; new=f'for h in mbp node-b node-c host-e-wsl {h}; do'
401
+ if new not in s:
402
+ if s.count(old)!=1: raise SystemExit('autopsy host anchor missing/ambiguous')
403
+ backup=p.with_name(p.name+'.bak-wsl-'+time.strftime('%Y%m%d%H%M%S')); backup.write_text(s)
404
+ p.write_text(s.replace(old,new,1))
405
+ PY
406
+ zsh -n "$HOME/elanous-hq/seat-state/OP/tools/autopsy-watch.sh"
407
+ echo 'autopsy script changed; OP restarts its exact PID after release window' >&2;;
408
+ *) echo "local apply unavailable: $STAGE" >&2; return 1;;
409
+ esac
410
+ }
411
+
412
+ case $STAGE in
413
+ a2|a2b|b1|b2|b4)
414
+ if remote check; then echo "✓ $STAGE remote ready"
415
+ else
416
+ rc=$?; [[ $rc == 10 ]] || { echo "✗ $STAGE check failed rc=$rc" >&2; exit 1; }
417
+ echo "→ $STAGE apply"; remote apply
418
+ remote check || { echo "✗ $STAGE recheck failed" >&2; exit 1; }
419
+ fi
420
+ if [[ $STAGE == b2 ]]; then
421
+ eln git -C "$ROOT" push "ssh://$HOST/home/$WSL_USER/mirror/elanous-agent.git" origin/main:refs/heads/main
422
+ ssh -o BatchMode=yes "$HOST" 'git -C ~/mirror/elanous-agent.git symbolic-ref HEAD refs/heads/main'
423
+ ensure_context
424
+ kubectl --context "$CTX" apply -f "$ROOT/docker/h1/base.yaml" -f "$ROOT/docker/h1/policy-internet.yaml" -f "$ROOT/docker/h1/policy-bedrock.yaml" -f "$ROOT/docker/h1/policy-zai.yaml"
425
+ fi
426
+ echo "✓ $STAGE ready";;
427
+ b5|b6|b7|b8|b8b)
428
+ if check_local; then echo "✓ $STAGE already ready"; exit 0; fi
429
+ echo "→ $STAGE apply"; apply_local
430
+ check_local || { echo "✗ $STAGE recheck failed" >&2; exit 1; }
431
+ echo "✓ $STAGE ready";;
432
+ esac