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
@@ -4,40 +4,276 @@ import { judge } from '../llm/judge-layer.js';
4
4
  import { runPluginMake } from './plugin-cli.js';
5
5
  import { workflowRun } from './workflow.js';
6
6
 
7
- type MakeKind = 'plugin' | 'workflow';
7
+ export type MakeKind = 'plugin' | 'workflow';
8
+
9
+ /** A cell the route ruled out, together with the evidence that ruled it out. */
10
+ export type MakeExclusion = { kind: MakeKind; reason: string };
11
+
12
+ /** A classify-judge answer. It only counts when the judge supplied BOTH
13
+ * rationales: a bare `{"kind":"workflow"}` carries no reason and no exclusion
14
+ * ground, so the route treats it as an unanswered (unmeasured) request. */
15
+ export type MakeJudgeVerdict = { kind: MakeKind; reason: string; excluded: string };
16
+
17
+ /** What the production `cli.make/route` path judged for one natural-language request. */
18
+ export type MakeRouteEvidence = {
19
+ request: string;
20
+ /** Selected cell, or null when the request carries no usable evidence. */
21
+ kind: MakeKind | null;
22
+ /** Which arm produced `kind`. */
23
+ decidedBy: 'request-evidence' | 'classify-judge' | 'none';
24
+ /** false means "unmeasured": no rationale existed for any cell. */
25
+ measured: boolean;
26
+ /** Why the selected cell won. Never empty; a judge row quotes the judge's own reason verbatim. */
27
+ reason: string;
28
+ /** Phrases from the request that support the selected cell. A judge-decided row
29
+ * carries a `judge:<kind>` marker instead: the request had no phrases to cite. */
30
+ signals: string[];
31
+ /** Every cell that was not selected, with the reason it was excluded. */
32
+ excluded: MakeExclusion[];
33
+ };
34
+
35
+ type JudgeCall = (args: { prompt: string; provider: string; model: string }) => Promise<{ text: string }>;
36
+
8
37
  type MakeDeps = {
9
- decide?: (request: string) => Promise<MakeKind | null>;
38
+ /** Test-only classify transport: only ever throws, so it can never deliver an answer. */
39
+ judgeCall?: JudgeCall;
10
40
  pluginMake?: (request: string) => Promise<void>;
11
41
  workflowMake?: (request: string) => Promise<number>;
12
42
  };
13
43
 
14
- export async function classifyMakeRequest(request: string, call?: (args: { prompt: string; provider: string; model: string }) => Promise<{ text: string }>): Promise<MakeKind | null> {
44
+ const CELL_LABEL: Record<MakeKind, string> = { plugin: '플러그인', workflow: '워크플로' };
45
+
46
+ const OTHER_CELL: Record<MakeKind, MakeKind> = { plugin: 'workflow', workflow: 'plugin' };
47
+
48
+ /** A request that names a cell explicitly outranks every softer signal. */
49
+ const NAMED_CELL_WORDS: Record<MakeKind, readonly string[]> = {
50
+ plugin: ['플러그인', 'plugin'],
51
+ workflow: ['워크플로', 'workflow'],
52
+ };
53
+
54
+ /** Signal words that must not fire when every occurrence lives inside a longer
55
+ * compound: `메일` inside `이메일` is an email-domain word, not a mailing task,
56
+ * so '이메일 파싱 API' must not reach the workflow cell through it. */
57
+ const COMPOUND_GUARDS: ReadonlyArray<{ word: string; inside: string }> = [
58
+ { word: '메일', inside: '이메일' },
59
+ { word: '로드', inside: '업로드' },
60
+ ];
61
+
62
+ /** Request phrases that point at each cell. Workflow is the upper cell: a workflow
63
+ * may use a connector, so its signals win over connector signals.
64
+ *
65
+ * 판정 기준(위에서 아래로):
66
+ * 1. 이름 지목 — '플러그인/plugin', '워크플로/workflow' 가 직접 나오면 그 칸.
67
+ * 2. 합성어 가드 — 신호 단어가 더 긴 합성어 안에만 있으면(예: '메일' ⊂ '이메일')
68
+ * 그 단어는 신호로 치지 않는다. '이메일 파싱 API' 는 이메일 도메인 처리
69
+ * 요청이지 메일 발송 워크플로가 아니다.
70
+ * 3. 가드를 통과한 신호가 한쪽에만 있으면 그 칸을 채택한다.
71
+ * 4. 양쪽에 신호가 남아 있으면(충돌) 상위 칸 워크플로가 하위 칸 플러그인을
72
+ * 흡수한다 — 워크플로는 커넥터를 부품으로 쓸 수 있지만 그 반대는 안 된다. */
73
+ const CELL_WORDS: Record<MakeKind, readonly string[]> = {
74
+ plugin: [
75
+ '읽', '파싱', 'parse', '불러', 'load', '로드', '열어', '변환', 'convert', '추출', 'extract',
76
+ '연동', '연결', '커넥터', 'connector', '스킬', 'skill', '도구', 'tool', 'api', '조회',
77
+ 'ocr', 'hwp', 'pdf', 'xlsx', 'docx', 'csv', 'json', '이미지', '사진', '엑셀', '워드',
78
+ '번역', 'translate', '검색', 'search',
79
+ ],
80
+ workflow: [
81
+ '매일', '매주', '매월', '매년', '매시간', '매번', '정기', '주기적', '스케줄', 'schedule',
82
+ 'cron', '크론', '반복', 'daily', 'weekly', 'hourly', 'every ',
83
+ '올려', '올리', '게시', '발행', '포스팅', '업로드', 'upload', '배포', 'deploy', 'publish',
84
+ '보내', '전송', 'send', '알림', 'notify', '메일',
85
+ '하고 나서', '그다음', '순서대로', '단계별', '파이프라인', 'pipeline', '자동화', 'automation',
86
+ '자동으로', '일괄', 'batch', '모아', '수집해서', '시리즈',
87
+ ],
88
+ };
89
+
90
+ function countOccurrences(text: string, needle: string): number {
91
+ let count = 0;
92
+ let at = text.indexOf(needle);
93
+ while (at >= 0) {
94
+ count += 1;
95
+ at = text.indexOf(needle, at + needle.length);
96
+ }
97
+ return count;
98
+ }
99
+
100
+ function matchWords(text: string, words: readonly string[]): string[] {
101
+ const hits: string[] = [];
102
+ for (const word of words) {
103
+ if (!text.includes(word)) continue;
104
+ const guarded = COMPOUND_GUARDS.some(
105
+ g => g.word === word && countOccurrences(text, g.inside) >= countOccurrences(text, word),
106
+ );
107
+ if (!guarded) hits.push(word);
108
+ }
109
+ return hits;
110
+ }
111
+
112
+ /** Deterministic judgement over the request text: picks a cell and says why it won
113
+ * and why the sibling cell lost. Runs before any model call, so the route always
114
+ * has a rationale to report. */
115
+ function evidenceFromRequest(request: string): MakeRouteEvidence {
116
+ const text = request.toLowerCase();
117
+ const pluginWords = matchWords(text, CELL_WORDS.plugin);
118
+ const workflowWords = matchWords(text, CELL_WORDS.workflow);
119
+ const namedPlugin = matchWords(text, NAMED_CELL_WORDS.plugin);
120
+ const namedWorkflow = matchWords(text, NAMED_CELL_WORDS.workflow);
121
+ const named: MakeKind | null = namedPlugin.length && !namedWorkflow.length
122
+ ? 'plugin'
123
+ : namedWorkflow.length && !namedPlugin.length ? 'workflow' : null;
124
+
125
+ let kind: MakeKind | null = null;
126
+ let reason: string;
127
+ let signals: string[] = [];
128
+
129
+ if (named) {
130
+ kind = named;
131
+ signals = named === 'plugin' ? namedPlugin : namedWorkflow;
132
+ reason = `요청이 ${CELL_LABEL[named]} 칸을 이름으로 지목(${signals.join(', ')}) — 명시 지목이 최상위 근거`;
133
+ } else if (workflowWords.length) {
134
+ kind = 'workflow';
135
+ signals = workflowWords;
136
+ reason = `반복·게시·시퀀스 신호(${workflowWords.join(', ')}) — 상위 칸 워크플로 채택`;
137
+ } else if (pluginWords.length) {
138
+ kind = 'plugin';
139
+ signals = pluginWords;
140
+ reason = `커넥터·역량·형식 신호(${pluginWords.join(', ')}) — 하위 칸 플러그인 채택`;
141
+ } else {
142
+ reason = '필수 근거 없음 — 요청에서 플러그인·워크플로 신호를 찾지 못했다';
143
+ }
144
+
145
+ const excluded: MakeExclusion[] = [];
146
+ if (kind === 'workflow') {
147
+ excluded.push({
148
+ kind: 'plugin',
149
+ reason: [
150
+ named === 'workflow'
151
+ ? `요청이 워크플로를 이름으로 지목(${namedWorkflow.join(', ')})`
152
+ : `반복·게시·시퀀스 신호(${workflowWords.join(', ')})`,
153
+ pluginWords.length
154
+ ? `플러그인 신호(${pluginWords.join(', ')})는 커넥터 단품이라 상위 칸에 흡수`
155
+ : '플러그인 신호 0건',
156
+ ].join(' · '),
157
+ });
158
+ } else if (kind === 'plugin') {
159
+ excluded.push({
160
+ kind: 'workflow',
161
+ reason: [
162
+ named === 'plugin'
163
+ ? `요청이 플러그인을 이름으로 지목(${namedPlugin.join(', ')})`
164
+ : `커넥터·역량 신호(${pluginWords.join(', ')})`,
165
+ workflowWords.length
166
+ ? `워크플로 신호(${workflowWords.join(', ')})가 있으나 단품 칸이 채택`
167
+ : '워크플로 신호 0건',
168
+ ].join(' · '),
169
+ });
170
+ } else {
171
+ excluded.push(
172
+ { kind: 'plugin', reason: '플러그인 신호 0건 — 필수 근거 없음' },
173
+ { kind: 'workflow', reason: '워크플로 신호 0건 — 필수 근거 없음' },
174
+ );
175
+ }
176
+
177
+ return {
178
+ request,
179
+ kind,
180
+ decidedBy: kind ? 'request-evidence' : 'none',
181
+ measured: kind !== null,
182
+ reason,
183
+ signals,
184
+ excluded,
185
+ };
186
+ }
187
+
188
+ export async function classifyMakeRequest(request: string, call?: JudgeCall): Promise<MakeJudgeVerdict | null> {
15
189
  if (!request.trim()) return null;
16
- const result = await judge<MakeKind>({
190
+ const result = await judge<MakeJudgeVerdict>({
17
191
  site: 'cli.make',
18
192
  ...(call ? { call } : {}),
19
- prompt: `Classify this request for an Elanous creator. Choose "plugin" for a reusable connector, integration, skill, or capability (including reading a file format). Choose "workflow" for a sequence of jobs, recurring schedule, automation, or publishing task, even when it uses a connector. If you cannot decide, return {"kind":"unclear"}. Respond with JSON only, exactly {"kind":"plugin"} or {"kind":"workflow"} or {"kind":"unclear"}. Do not execute the request.\nRequest: ${JSON.stringify(request)}`,
193
+ prompt: `Classify this request for an Elanous creator. Choose "plugin" for a reusable connector, integration, skill, or capability (including reading a file format). Choose "workflow" for a sequence of jobs, recurring schedule, automation, or publishing task, even when it uses a connector. Respond with JSON only, exactly {"kind":"plugin"|"workflow","reason":"<한 문장: 이 칸을 고른 근거>","excluded":"<한 문장: 다른 칸을 뺀 근거>"}. Return {"kind":"unclear"} when you cannot decide. An answer missing either rationale field is rejected as unmeasured. Do not execute the request.\nRequest: ${JSON.stringify(request)}`,
20
194
  schema: value => {
21
195
  if (!value || typeof value !== 'object' || Array.isArray(value)) return null;
22
196
  const kind = (value as { kind?: unknown }).kind;
23
- return kind === 'plugin' || kind === 'workflow' ? kind : null;
197
+ if (kind !== 'plugin' && kind !== 'workflow') return null;
198
+ const reason = (value as { reason?: unknown }).reason;
199
+ const excluded = (value as { excluded?: unknown }).excluded;
200
+ if (typeof reason !== 'string' || !reason.trim()) return null;
201
+ if (typeof excluded !== 'string' || !excluded.trim()) return null;
202
+ return { kind, reason: reason.trim(), excluded: excluded.trim() };
24
203
  },
25
204
  });
26
205
  return result.ok ? result.value : null;
27
206
  }
28
207
 
208
+ /** Production judgement path for `elanous make`: request evidence first, the
209
+ * classify judge only when the request carries no evidence at all. A judge
210
+ * answer without both rationales is reported as unmeasured, never as success;
211
+ * `skipJudge` leaves the judge uncalled so --route-only dumps stay
212
+ * deterministic (no model call, no dispatch). */
213
+ export async function routeMakeRequest(
214
+ request: string,
215
+ opts: { call?: JudgeCall; skipJudge?: boolean } = {},
216
+ ): Promise<MakeRouteEvidence> {
217
+ const evidence = evidenceFromRequest(request);
218
+ if (evidence.measured) return evidence;
219
+
220
+ let verdict: MakeJudgeVerdict | null = null;
221
+ let note: string;
222
+ if (opts.skipJudge) {
223
+ note = '판정기 호출 생략(증거 전용 경로)';
224
+ } else {
225
+ try {
226
+ verdict = await classifyMakeRequest(request, opts.call);
227
+ note = verdict
228
+ ? `classify judge 가 ${CELL_LABEL[verdict.kind]} 를 근거와 함께 반환`
229
+ : 'classify judge 가 근거 있는 판정을 반환하지 않음';
230
+ } catch (err) {
231
+ note = `classify judge 호출 실패(${err instanceof Error ? err.message : String(err)})`;
232
+ }
233
+ }
234
+
235
+ if (!verdict) {
236
+ return { ...evidence, decidedBy: 'none', measured: false, reason: `${evidence.reason} · ${note}` };
237
+ }
238
+ const other = OTHER_CELL[verdict.kind];
239
+ return {
240
+ request,
241
+ kind: verdict.kind,
242
+ decidedBy: 'classify-judge',
243
+ measured: true,
244
+ reason: `요청 근거 없음(플러그인·워크플로 신호 0건) → ${note} — ${CELL_LABEL[verdict.kind]} 칸 채택 · 판정기 근거: ${verdict.reason}`,
245
+ signals: [`judge:${verdict.kind}`],
246
+ excluded: [{ kind: other, reason: `요청 근거 없음 · 판정기 배제 근거: ${verdict.excluded}` }],
247
+ };
248
+ }
249
+
29
250
  export function registerMakeCommand(program: Command, deps: MakeDeps = {}): void {
30
251
  program.command('make <request>')
31
252
  .description('Classify a one-line request and make a plugin or build a workflow')
32
- .action(async (request: string) => {
33
- const kind = await (deps.decide ?? classifyMakeRequest)(request).catch(() => null);
34
- debug.log('cli.make', 'route', { kind: kind ?? 'undecided' });
35
- if (!kind) {
253
+ .option('--route-only', 'print the cli.make/route evidence JSON and exit — no judge call, no plugin or workflow dispatch')
254
+ .action(async (request: string, opts: { routeOnly?: boolean }) => {
255
+ const evidence = await routeMakeRequest(request, {
256
+ ...(deps.judgeCall ? { call: deps.judgeCall } : {}),
257
+ ...(opts.routeOnly ? { skipJudge: true } : {}),
258
+ });
259
+ debug.log('cli.make', 'route', evidence);
260
+ if (!evidence.measured) {
261
+ debug.log('cli.make', 'route-unmeasured', {
262
+ request: evidence.request,
263
+ reason: evidence.reason,
264
+ excluded: evidence.excluded,
265
+ });
266
+ }
267
+ if (opts.routeOnly) {
268
+ console.log(JSON.stringify(evidence));
269
+ return;
270
+ }
271
+ if (!evidence.kind) {
36
272
  console.log('플러그인(커넥터·스킬)을 만들까요, 워크플로(잡)를 만들까요?');
37
273
  process.exitCode = 1;
38
274
  return;
39
275
  }
40
- if (kind === 'plugin') await (deps.pluginMake ?? runPluginMake)(request);
276
+ if (evidence.kind === 'plugin') await (deps.pluginMake ?? runPluginMake)(request);
41
277
  else process.exitCode = await (deps.workflowMake ?? ((text: string) => workflowRun('build-workflow', text)))(request);
42
278
  });
43
279
  }
@@ -1,9 +1,16 @@
1
1
  import type { Command } from 'commander';
2
2
  import { ensureAuthToken } from '../auth/acp-token.js';
3
+ import { elanousStateRoot } from '../autopilot/state-paths.js';
3
4
  import { canonicalSeatId, openMsgStore, openMsgStoreReadOnly, type Message, type MsgStore } from '../msg/msg-store.js';
5
+ import { clearPostOffice, ensurePostOffice, writePostOffice } from '../msg/msg-post-office.js';
4
6
  import { startMsgSseServer } from '../msg/msg-sse-server.js';
7
+ import type { AgentReplyAddress, AgentReplyInput, AgentReplyResult } from '../loops/agent-reply.js';
5
8
  import { messageRouteFor, noReplyBodyNotice, unsupportedLoopAddressNotice } from '../loops/msg-address.js';
6
9
  import { resolveWake, wakeRecipient, type WakeDeps, type WakeOutcome } from '../loops/msg-wake.js';
10
+ import type { RoleLlmSpec } from '../user-config.js';
11
+
12
+ /** The loop rows whose reply body is an LLM agent: `--agent-reply` picks one of these. */
13
+ const AGENT_REPLY_ROLES = { COORDINATOR: 'coordinator', GUARDIAN: 'guardian' } as const;
7
14
 
8
15
  export interface MsgCliDeps {
9
16
  openStore?: () => MsgStore;
@@ -21,6 +28,24 @@ export interface MsgCliDeps {
21
28
  registerLogSink?: () => Promise<unknown>;
22
29
  /** Wake the recipient after a durable post; never changes the post outcome. */
23
30
  wake?: (address: string, msgId: number, message: { from: string; kind?: string }, deps: WakeDeps) => Promise<WakeOutcome>;
31
+ /**
32
+ * Agent auto-reply producer (`--agent-reply`). The default resolves the selected role LLM, loads its pack,
33
+ * and calls the real `replyWithAgent`; the seams exist so a test still traverses that producer.
34
+ */
35
+ agentReply?: {
36
+ role?: RoleLlmSpec;
37
+ pack?: string;
38
+ /** Test seam: a fake turn still goes through `replyWithAgent` and its ledger transaction. */
39
+ runAgent?: AgentReplyInput['runAgent'];
40
+ /** Test seam for the role ladder — `undefined` means «역할 LLM 미설정». */
41
+ resolveRole?: (address: AgentReplyAddress) => RoleLlmSpec | undefined;
42
+ observationRoot?: string;
43
+ };
44
+ /** `msg serve --sse` discovery file root (default: the state root). `msg post` restarts a dead service found here. */
45
+ postOfficeStateRoot?: string;
46
+ postOfficeAlive?: (pid: number) => boolean;
47
+ postOfficeProbe?: (url: string) => Promise<boolean>;
48
+ postOfficeLaunch?: (input: { port: number }) => void;
24
49
  /** Test seams for the existing self-send transport and the selected task-card ledger. */
25
50
  readCard?: typeof import('../task-agent/task-hand.js').readTaskCard;
26
51
  podFragmentsForRun?: typeof import('../harness/self-send-target.js').listPodFragmentsForRun;
@@ -160,16 +185,94 @@ export function registerMsgCommands(program: Command, deps: MsgCliDeps = {}): vo
160
185
  if (json) out.log(JSON.stringify(value));
161
186
  else human();
162
187
  };
188
+ const officeRoot = () => deps.postOfficeStateRoot ?? elanousStateRoot();
189
+
190
+ /** `--agent-reply <address>` — only the loop rows that answer with an LLM body. */
191
+ const agentReplyAddress = (raw: string | undefined): AgentReplyAddress | null => {
192
+ if (raw === undefined) return null;
193
+ const name = raw.trim().toUpperCase();
194
+ if (!Object.hasOwn(AGENT_REPLY_ROLES, name)) throw new Error('--agent-reply must be COORDINATOR or GUARDIAN');
195
+ return name as AgentReplyAddress;
196
+ };
197
+ const requireAgentTarget = (address: AgentReplyAddress, to: string): void => {
198
+ if (address !== to) throw new Error(`--agent-reply ${address} requires --to ${address}`);
199
+ };
200
+
201
+ /**
202
+ * Human-free live conversation: the selected address's LLM body answers the message that was just saved.
203
+ * The durable ledger stays authoritative — `replyWithAgent` owns the one-reply-per-request transaction and
204
+ * its dedupe, so a retry finds the existing link instead of generating again. A failure never changes the
205
+ * post's exit code; it is reported as one line on stderr.
206
+ */
207
+ const autoReply = async (address: AgentReplyAddress, request: Message, json: boolean | undefined): Promise<void> => {
208
+ const seam = deps.agentReply;
209
+ let role = seam?.role;
210
+ if (role === undefined) {
211
+ if (seam?.resolveRole) role = seam.resolveRole(address);
212
+ else {
213
+ const { resolveConfiguredAgentRoleLlm } = await import('../user-config.js');
214
+ // Only an explicitly selected provider/tier/model starts an agent body; effort alone is not a selection.
215
+ role = resolveConfiguredAgentRoleLlm(AGENT_REPLY_ROLES[address]);
216
+ }
217
+ }
218
+ if (role === undefined) {
219
+ out.error(`msg: ${address} 역할 LLM 미설정 — 자동 답 없음`);
220
+ return;
221
+ }
222
+ let pack = seam?.pack;
223
+ if (pack === undefined) {
224
+ try {
225
+ const { loadAgentRolePack } = await import('../loops/agent-reply.js');
226
+ pack = loadAgentRolePack(AGENT_REPLY_ROLES[address]);
227
+ } catch (error) {
228
+ out.error(`msg: ${address} 역할 팩 없음 — 자동 답 없음: ${error instanceof Error ? error.message : String(error)}`);
229
+ return;
230
+ }
231
+ }
232
+ try {
233
+ const { replyWithAgent } = await import('../loops/agent-reply.js');
234
+ const store = open();
235
+ let result: AgentReplyResult;
236
+ try {
237
+ result = await replyWithAgent({ address, role, pack, store,
238
+ request: { id: request.id, from: request.from, body: request.body,
239
+ ...(request.kind === undefined ? {} : { kind: request.kind }) },
240
+ ...(seam?.runAgent ? { runAgent: seam.runAgent } : {}),
241
+ ...(seam?.observationRoot ? { observationRoot: seam.observationRoot } : {}) });
242
+ } finally { store.close(); }
243
+ emit({ agentReply: { address, requestId: request.id, ...result } }, json,
244
+ () => out.log(`자동 답 ${result.replyId === null ? '없음' : `#${result.replyId}`} (${address} → ${request.from})${result.posted ? '' : ' — 이미 있음'}`));
245
+ } catch (error) {
246
+ out.error(`msg: 자동 답 실패: ${error instanceof Error ? error.message : String(error)}`);
247
+ }
248
+ };
249
+
250
+ /**
251
+ * Installed post-office supervision: a registered `msg serve --sse` that no longer answers is restarted on
252
+ * its recorded port. Nothing is spawned when no service registered itself, so a plain post is unchanged.
253
+ */
254
+ const supervisePostOffice = async (): Promise<void> => {
255
+ const result = await ensurePostOffice({ stateRoot: officeRoot(),
256
+ ...(deps.postOfficeAlive ? { alive: deps.postOfficeAlive } : {}),
257
+ ...(deps.postOfficeProbe ? { probe: deps.postOfficeProbe } : {}),
258
+ ...(deps.postOfficeLaunch ? { launch: deps.postOfficeLaunch } : {}) });
259
+ if (result.state === 'restarted')
260
+ out.error(`msg: post office 재시작 (port ${result.port}) — 원장이 정본이라 저장된 글은 다시 밀린다`);
261
+ };
163
262
 
164
263
  msg.command('post [body]').description('Post a message; use - or omit body to read stdin')
165
264
  .option('--from <seat>').option('--to <seat>').option('--kind <kind>').option('--body <text>')
166
265
  .option('--reply-to <id>', 'point this reply at a question message ID')
266
+ .option('--agent-reply <address>', 'let this address\'s agent body (COORDINATOR · GUARDIAN) answer the saved message once')
167
267
  .option('--origin-key <key>', 'deduplicate a channel mirror by coord:<commentId>:<recipient>').option('--json')
168
- .action((body: string | undefined, opts: CommonOptions & { from?: string; to?: string; kind?: string; body?: string; replyTo?: string; originKey?: string }) => run(async () => {
268
+ .action((body: string | undefined, opts: CommonOptions & { from?: string; to?: string; kind?: string; body?: string; replyTo?: string; originKey?: string; agentReply?: string }) => run(async () => {
169
269
  const from = seat(opts.from, '--from');
170
270
  const unsupported = opts.to === undefined ? null : unsupportedLoopAddressNotice(opts.to);
171
271
  if (unsupported) out.error(unsupported);
172
272
  const to = seat(opts.to, '--to');
273
+ // Validate the auto-reply target before saving — a mismatched flag must not leave a stored message behind.
274
+ const agentAddress = agentReplyAddress(opts.agentReply);
275
+ if (agentAddress !== null) requireAgentTarget(agentAddress, to);
173
276
  if (body !== undefined && body !== '-' && opts.body !== undefined) throw new Error('provide body once (argument or --body)');
174
277
  const text = opts.body ?? (body !== undefined && body !== '-' ? body : await readStdin());
175
278
  const envelope = { from, to, body: text,
@@ -192,10 +295,14 @@ export function registerMsgCommands(program: Command, deps: MsgCliDeps = {}): vo
192
295
  new Promise<void>(resolve => { sinkTimer = setTimeout(resolve, 1000); }),
193
296
  ]).finally(() => clearTimeout(sinkTimer));
194
297
  } catch { /* observability is fail-open */ }
298
+ // 설치본을 갈아 끼우면 우편국(SSE)은 조용히 사라진다 — 등록해 둔 서비스가 응답하지 않으면 같은 포트로 다시 띄운다.
299
+ // 재시작도 관측도 post 의 성패를 바꾸지 않는다.
300
+ try { await supervisePostOffice(); } catch { /* post office is fail-open */ }
195
301
  try {
196
302
  await (deps.wake ?? wakeRecipient)(to, posted.id, { from, ...(opts.kind === undefined ? {} : { kind: opts.kind }) },
197
303
  { ...deps.wakeDeps, warn: noBody ? () => {} : line => out.error(line) });
198
304
  } catch { /* the wake outcome is logged by wakeRecipient; the post is already durable */ }
305
+ if (agentAddress !== null) await autoReply(agentAddress, posted, opts.json);
199
306
  })());
200
307
 
201
308
  msg.command('route <address>').description('Show how a post to this address is read (replyBody) and woken (wake)')
@@ -344,11 +451,14 @@ export function registerMsgCommands(program: Command, deps: MsgCliDeps = {}): vo
344
451
 
345
452
  msg.command('ask <recipient> <question>').description('Post a question and wait for its first reply')
346
453
  .option('--from <seat>', 'asking seat (required)').option('--wait <seconds>', 'seconds to wait for a reply (default 60)', '60')
454
+ .option('--agent-reply <address>', 'let this address\'s agent body (COORDINATOR · GUARDIAN) answer before waiting')
347
455
  .option('--json')
348
- .action((recipient: string, question: string, opts: CommonOptions & { from?: string; wait?: string }) => run(async () => {
456
+ .action((recipient: string, question: string, opts: CommonOptions & { from?: string; wait?: string; agentReply?: string }) => run(async () => {
349
457
  const from = seat(opts.from, '--from');
350
458
  const to = canonicalSeatId(recipient);
351
459
  const waitSeconds = integer(opts.wait, '--wait', 60, 0, 86400);
460
+ const agentAddress = agentReplyAddress(opts.agentReply);
461
+ if (agentAddress !== null) requireAgentTarget(agentAddress, to);
352
462
  const interrupt = deps.signal === undefined ? new AbortController() : undefined;
353
463
  const signal = deps.signal ?? interrupt!.signal;
354
464
  const onInterrupt = () => interrupt?.abort();
@@ -362,6 +472,8 @@ export function registerMsgCommands(program: Command, deps: MsgCliDeps = {}): vo
362
472
  emit(asked, opts.json, () => out.log(`#${asked.id}`));
363
473
  // msg ask uses the same saved-message handler before waiting for its linked reply.
364
474
  await handleTaMessage(asked);
475
+ // 사람 없는 live 대화: 답할 몸이 있으면 «기다리기 전»에 답을 원장에 남긴다 — 같은 대기 루프가 그 답을 집는다.
476
+ if (agentAddress !== null) await autoReply(agentAddress, asked, opts.json);
365
477
  const deadline = Date.now() + waitSeconds * 1000;
366
478
  let reply: Message | undefined;
367
479
  store = open();
@@ -419,8 +531,10 @@ export function registerMsgCommands(program: Command, deps: MsgCliDeps = {}): vo
419
531
  try {
420
532
  const service = startMsgSseServer({ store, token: (deps.authToken ?? (() => ensureAuthToken().token))(),
421
533
  port, hostname: opts.host });
534
+ // 발견 줄 — 설치본을 갈아 끼운 뒤 `msg post` 가 이 줄을 읽어 죽은 서비스를 같은 포트로 다시 띄운다.
535
+ writePostOffice(officeRoot(), { port: service.port });
422
536
  out.log(`msg SSE listening on ${opts.host}:${service.port}`);
423
- const stop = () => { service.stop(); store.close(); };
537
+ const stop = () => { service.stop(); store.close(); clearPostOffice(officeRoot()); };
424
538
  process.once('SIGINT', stop);
425
539
  process.once('SIGTERM', stop);
426
540
  } catch (error) { store.close(); throw error; }
package/src/cli/pr-cli.ts CHANGED
@@ -62,8 +62,8 @@ import { admitLandingMerge } from '../self-implement/frozen-merges.js';
62
62
  import { resolveOverlapEvidencePath, verifyAllSameHeadReviews, verifyAncestorAutoPass, verifyOverlapEvidence, verifyOverlapEvidenceVirtualRebase } from './pr-land-overlap-evidence.js';
63
63
  import type { VerifyOverlapEvidenceInput } from './pr-land-overlap-evidence.js';
64
64
  import { verifyVirtualRebasePatch } from './pr-land-virtual-rebase.js';
65
- import { observeDirectPrLandRefusal, observePrLandRefusal } from './pr-land-refusal.js';
66
- import { planPrLandRecovery } from './pr-land-recovery.js';
65
+ import { classifyPrLandRefusal, observeDirectPrLandRefusal, observePrLandRefusal } from './pr-land-refusal.js';
66
+ import { bindPrLandRefusalToRecover, PR_LAND_CARD_ID_ENV } from './pr-land-recovery.js';
67
67
  import { ensurePrLandHeavyRemote, type HeavyRemoteInput, type HeavyRemoteResult } from './pr-land-heavy-remote.js';
68
68
  import { readPrBaseNameWithRetry } from './pr-land-base-read.js';
69
69
  import { runHeavyOnPodShadow } from './pr-land-pod-shadow.js';
@@ -1319,26 +1319,39 @@ export async function runPrLand(opts: PrLandOpts = {}, deps: PrLandDeps = {}): P
1319
1319
  };
1320
1320
  // Observe actual merge refusals, including the measured remote gate and public export leak.
1321
1321
  // Option syntax and unmeasured prerequisite errors do not describe a recovery edge.
1322
+ // LAND-REFUSAL-EDGES — a pinned refusal is also bound to the recover@1 edge with its raw line and card.
1323
+ // The card arrives only through the child env set by TA defaultLand — never a shell export.
1324
+ const cardId = process.env[PR_LAND_CARD_ID_ENV]?.trim() || undefined;
1325
+ const bindRecover = (message: string, context: { isDraft?: boolean } = {}) => {
1326
+ const pr = Number(opts.pr);
1327
+ if (!Number.isSafeInteger(pr) || pr <= 0 || !opts.expectedHead) return undefined;
1328
+ try { return bindPrLandRefusalToRecover({ refusal: message, pr, head: opts.expectedHead, isDraft: context.isDraft, cardId }); }
1329
+ catch { return undefined; }
1330
+ };
1322
1331
  const refuse = (message: string, context: { isDraft?: boolean } = {}): void => {
1323
1332
  out.error(message);
1324
1333
  observePrLandRefusal(message, context);
1325
- const pr = Number(opts.pr);
1326
- if (Number.isSafeInteger(pr) && pr > 0 && opts.expectedHead) {
1327
- try {
1328
- const plan = planPrLandRecovery({ refusal: message, pr, head: opts.expectedHead, isDraft: context.isDraft });
1329
- debug.log('pr.land', 'recover-shadow', {
1330
- pr, head: opts.expectedHead, label: plan.evidence.label, route: plan.evidence.route,
1331
- outcome: plan.outcome, action: plan.result.action, reason: plan.result.reason,
1332
- delayMs: plan.result.delayMs ?? null, execution: 'none',
1333
- });
1334
- } catch {
1335
- // Recovery observation must never replace the original landing refusal.
1336
- }
1334
+ const plan = bindRecover(message, context);
1335
+ if (!plan) return;
1336
+ try {
1337
+ debug.log('pr.land', 'recover-shadow', {
1338
+ pr: Number(opts.pr), head: opts.expectedHead, label: plan.evidence.label, route: plan.evidence.route,
1339
+ outcome: plan.outcome, action: plan.result.action, reason: plan.result.reason,
1340
+ delayMs: plan.result.delayMs ?? null, execution: 'none',
1341
+ });
1342
+ } catch {
1343
+ // Recovery observation must never replace the original landing refusal.
1337
1344
  }
1338
1345
  };
1346
+ // A direct failure binds only when today's refusal shape is recognized — the same measured sample
1347
+ // as observeDirectPrLandRefusal (#28939). An unclassified direct error is not a landing refusal.
1348
+ const observeDirect = (message: string): void => {
1349
+ observeDirectPrLandRefusal(message);
1350
+ if (classifyPrLandRefusal(message) !== 'other') bindRecover(message);
1351
+ };
1339
1352
  const refuseDirect = (message: string): void => {
1340
1353
  out.error(message);
1341
- observeDirectPrLandRefusal(message);
1354
+ observeDirect(message);
1342
1355
  };
1343
1356
  if (opts.title !== undefined && opts.titleFile !== undefined) {
1344
1357
  out.error('✗ title: --title과 --title-file은 함께 사용할 수 없습니다.');
@@ -2043,7 +2056,7 @@ export async function runPrLand(opts: PrLandOpts = {}, deps: PrLandDeps = {}): P
2043
2056
  nextMdWarning(body ?? '', changedPaths, out);
2044
2057
  if (!conflictMarkerBlock(changedPaths, cwd, out)) return 1;
2045
2058
  publicLeakWarning(changedPaths, deps.runPublicLeakGate ?? ((files, sink) => runPrLandPublicLeakGate(files, sink, cwd, base)), out);
2046
- if (!exportLeakBlock(changedPaths, () => (deps.runExportLeakCheck ?? runPrLandExportLeakCheck)(changedPaths ?? [], cwd), opts.allowPublicLeak === true, out, cwd, observeDirectPrLandRefusal)) return 1;
2059
+ if (!exportLeakBlock(changedPaths, () => (deps.runExportLeakCheck ?? runPrLandExportLeakCheck)(changedPaths ?? [], cwd), opts.allowPublicLeak === true, out, cwd, observeDirect)) return 1;
2047
2060
  if (!await exportImportBlock(changedPaths, () => (deps.runExportImportCheck ?? runPrLandExportImportCheck)(changedPaths ?? [], cwd), out)) return 1;
2048
2061
  if (publicDocPaths(changedPaths, () => true).length > 0) {
2049
2062
  const top = run('git', ['rev-parse', '--show-toplevel'], { cwd });
@@ -1,7 +1,16 @@
1
1
  import type { CmdRunner } from '../autopilot/pr-manager.js';
2
2
 
3
3
  export const PR_LAND_BASE_READ_RETRIES = 2;
4
- export const PR_LAND_BASE_READ_RETRY_DELAY_MS = 100;
4
+ /** Increasing backoff: 1s after the first unreadable read, 3s after the second (OPT #24215). */
5
+ export const PR_LAND_BASE_READ_RETRY_DELAYS_MS = [1_000, 3_000] as const;
6
+ /** Fixed ceiling: no retry sleep ever exceeds the last scheduled delay. */
7
+ export const PR_LAND_BASE_READ_RETRY_DELAY_CAP_MS = 3_000;
8
+
9
+ /** Backoff for the sleep that follows `attempt`; the schedule stops growing at the cap. */
10
+ export function prLandBaseReadRetryDelayMs(attempt: number): number {
11
+ const index = Math.min(Math.max(attempt, 1), PR_LAND_BASE_READ_RETRY_DELAYS_MS.length) - 1;
12
+ return Math.min(PR_LAND_BASE_READ_RETRY_DELAYS_MS[index], PR_LAND_BASE_READ_RETRY_DELAY_CAP_MS);
13
+ }
5
14
 
6
15
  export interface PrBaseReadResult {
7
16
  baseRefName: string | null;
@@ -30,7 +39,7 @@ export async function readPrBaseNameWithRetry(input: {
30
39
 
31
40
  if (baseRefName !== null) return { baseRefName, attempts: attempt };
32
41
  input.onUnreadable?.(attempt, viewed.err);
33
- if (attempt <= PR_LAND_BASE_READ_RETRIES) await input.sleep(PR_LAND_BASE_READ_RETRY_DELAY_MS);
42
+ if (attempt <= PR_LAND_BASE_READ_RETRIES) await input.sleep(prLandBaseReadRetryDelayMs(attempt));
34
43
  }
35
44
  return { baseRefName: null, attempts: PR_LAND_BASE_READ_RETRIES + 1 };
36
45
  }
@@ -8,8 +8,11 @@ import { debug, redactSecretText } from '../debug/log.js';
8
8
  import { gateRemoteHostCap, realGateRemoteRunner, resolveGateRemoteSettings, runOnRemote, type GateRemoteRunner, type RemoteRunOutcome } from '../self-implement/gate-remote.js';
9
9
 
10
10
  const SHA = /^[0-9a-f]{40}$/i;
11
- // WSL is excluded until its push permissions and gate environment are proven stable.
12
- export const PR_LAND_HEAVY_HOSTS = ['node-b', 'node-c'] as const;
11
+ // WSL still lands last: its gate environment was repaired (WSL-GATE-ENV, 2026-10-17 — baselineWorkspaceRoot in
12
+ // scripts/ci-typecheck-changed.ts now picks the host disk /var/tmp instead of WSL's 20GiB tmpfs), so the host is
13
+ // allowlisted as the third slot while node-b/node-c keep discovery order — the recorded host order stays part of the
14
+ // evidence contract.
15
+ export const PR_LAND_HEAVY_HOSTS = ['node-b', 'node-c', 'host-e-wsl'] as const;
13
16
  export const PR_LAND_HEAVY_HOST = PR_LAND_HEAVY_HOSTS[0];
14
17
  export type PrLandHeavyHost = typeof PR_LAND_HEAVY_HOSTS[number];
15
18
  const allowedHost = (host: string): host is PrLandHeavyHost => PR_LAND_HEAVY_HOSTS.some((candidate) => candidate === host);
@@ -234,7 +237,7 @@ export function ensurePrLandHeavyRemote(input: HeavyRemoteInput, deps: HeavyRemo
234
237
  // A completed run or infrastructure failure is a verdict. Only a full host slot asks for another host.
235
238
  if (outcome.kind !== 'busy') break wait;
236
239
  }
237
- // Both allowlisted hosts were busy. Wait the same slotWaitSeconds window as self gate, then retry.
240
+ // Every allowlisted host was busy. Wait the same slotWaitSeconds window as self gate, then retry.
238
241
  debug.log('pr.land', 'host-busy', { host: selectedHost, occupied: outcome.occupied ?? null, slotWaitSeconds: settings.slotWaitSeconds });
239
242
  const left = deadline - now();
240
243
  if (left <= 0) break;