elanous 0.2.36 → 0.2.37

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 (630) 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/{uC-N0emedeNOFuaBQFv-I → 8kITumG9GAZ1LwT9POrAR}/_buildManifest.js +1 -1
  4. package/apps/pwa/out/_next/static/chunks/1041-5841aae848fb6403.js +1 -0
  5. package/apps/pwa/out/_next/static/chunks/1087.3177e54f672dc526.js +1 -0
  6. package/apps/pwa/out/_next/static/chunks/1105.efe1e13503ac7a33.js +1 -0
  7. package/apps/pwa/out/_next/static/chunks/1224.2ceca6c180d5130b.js +62 -0
  8. package/apps/pwa/out/_next/static/chunks/{4286.b70c4520306817e8.js → 1262.a89bb27a5b2f844e.js} +1 -1
  9. package/apps/pwa/out/_next/static/chunks/1417-1768233ac92f8a5d.js +1 -0
  10. package/apps/pwa/out/_next/static/chunks/1612.81bbc19af06af16c.js +1 -0
  11. package/apps/pwa/out/_next/static/chunks/{3410.7f9af5ab77cbe65f.js → 1746.3563617ea64023a3.js} +1 -1
  12. package/apps/pwa/out/_next/static/chunks/1766.728d42053070bb2d.js +1 -0
  13. package/apps/pwa/out/_next/static/chunks/1773.d38e945481e04125.js +1 -0
  14. package/apps/pwa/out/_next/static/chunks/1974-c12f9600da3d3c26.js +1 -0
  15. package/apps/pwa/out/_next/static/chunks/1ed5e8af.cf424815c7c0efad.js +1 -0
  16. package/apps/pwa/out/_next/static/chunks/{9250-072df22eaadaa6b5.js → 2002-a43a3f380df873ec.js} +1 -1
  17. package/apps/pwa/out/_next/static/chunks/2061.7232dc9dc058417f.js +1 -0
  18. package/apps/pwa/out/_next/static/chunks/210.90b2cbd64926cf34.js +32 -0
  19. package/apps/pwa/out/_next/static/chunks/{3727.7949ccaacaa71242.js → 2283.edd9627b7bdfb546.js} +2 -2
  20. package/apps/pwa/out/_next/static/chunks/2318-450e75d07605b8fe.js +1 -0
  21. package/apps/pwa/out/_next/static/chunks/{4615.8525eb0add35eba6.js → 2375.bf364c85dbb6f085.js} +1 -1
  22. package/apps/pwa/out/_next/static/chunks/244-a810d282a20f1783.js +1 -0
  23. package/apps/pwa/out/_next/static/chunks/2479-fe7e188bd9402d14.js +1 -0
  24. package/apps/pwa/out/_next/static/chunks/2514.03b60f266531a015.js +148 -0
  25. package/apps/pwa/out/_next/static/chunks/2526-a657538869888604.js +1 -0
  26. package/apps/pwa/out/_next/static/chunks/2533-6f0341ff075809e9.js +1 -0
  27. package/apps/pwa/out/_next/static/chunks/2676.e7994c695ef0f30d.js +1 -0
  28. package/apps/pwa/out/_next/static/chunks/2734.3ffdf54254fb6f99.js +27 -0
  29. package/apps/pwa/out/_next/static/chunks/2770-23252bf3a37880b9.js +1 -0
  30. package/apps/pwa/out/_next/static/chunks/2969.66b8b545139d1544.js +1 -0
  31. package/apps/pwa/out/_next/static/chunks/3128.a9210d08800ea6a8.js +1 -0
  32. package/apps/pwa/out/_next/static/chunks/{5711.957b095705c12560.js → 3199.6a1a9b0e6cd01dc6.js} +1 -1
  33. package/apps/pwa/out/_next/static/chunks/3212.12179fd3eee8cef1.js +1 -0
  34. package/apps/pwa/out/_next/static/chunks/{2986.45d7652e4f13557e.js → 3578.4e9f9948a9a6f2f4.js} +2 -2
  35. package/apps/pwa/out/_next/static/chunks/3760-2909ddb9279281cd.js +1 -0
  36. package/apps/pwa/out/_next/static/chunks/3825.1921b5901bf33dce.js +36 -0
  37. package/apps/pwa/out/_next/static/chunks/3994-63eb884ed0547011.js +1 -0
  38. package/apps/pwa/out/_next/static/chunks/4036.d54e55e1ebf5acdc.js +90 -0
  39. package/apps/pwa/out/_next/static/chunks/4115.5b438b99f0ae729f.js +226 -0
  40. package/apps/pwa/out/_next/static/chunks/4269.d8f9f34bb0fc6c43.js +287 -0
  41. package/apps/pwa/out/_next/static/chunks/431-4eed5bd2c5fe1719.js +1 -0
  42. package/apps/pwa/out/_next/static/chunks/{7481.39f7a4654907bf6e.js → 4313.76f232c304a15bde.js} +1 -1
  43. package/apps/pwa/out/_next/static/chunks/4324.c99ba3e83eb1b691.js +1 -0
  44. package/apps/pwa/out/_next/static/chunks/4337e36d.f42c3b391b3d8f20.js +122 -0
  45. package/apps/pwa/out/_next/static/chunks/{6943.c6b24124853a47b2.js → 4383.18e5c54db3a22c88.js} +1 -1
  46. package/apps/pwa/out/_next/static/chunks/4599-96eff3f2a9c242c1.js +1 -0
  47. package/apps/pwa/out/_next/static/chunks/{3757-180308bc61021b05.js → 4725-34bed25720cc326b.js} +1 -1
  48. package/apps/pwa/out/_next/static/chunks/4825-a9d9d4e9f5892309.js +1 -0
  49. package/apps/pwa/out/_next/static/chunks/4833-7934c592c5569f00.js +1 -0
  50. package/apps/pwa/out/_next/static/chunks/4879-68518f547a207aff.js +1 -0
  51. package/apps/pwa/out/_next/static/chunks/4896.f9b70285363b27b2.js +24 -0
  52. package/apps/pwa/out/_next/static/chunks/{771.c3cdb6c1f7f47c02.js → 4931.95cc6dbd230774ca.js} +3 -3
  53. package/apps/pwa/out/_next/static/chunks/4937-28d437999b77c9dd.js +1 -0
  54. package/apps/pwa/out/_next/static/chunks/49aa54ab.80f39398e0ed0f30.js +1 -0
  55. package/apps/pwa/out/_next/static/chunks/{552.b7d061ad91eeac51.js → 5046.7fd5cbd859299448.js} +2 -2
  56. package/apps/pwa/out/_next/static/chunks/5056.482687319b82638e.js +104 -0
  57. package/apps/pwa/out/_next/static/chunks/506.16b83d56a437a9ee.js +1 -0
  58. package/apps/pwa/out/_next/static/chunks/5260-20593b0a25d0afbc.js +1 -0
  59. package/apps/pwa/out/_next/static/chunks/5404.cc4e9fec26fd5925.js +1 -0
  60. package/apps/pwa/out/_next/static/chunks/576.485e83e3f3dec19a.js +1 -0
  61. package/apps/pwa/out/_next/static/chunks/5832-a6be14e663f65726.js +1 -0
  62. package/apps/pwa/out/_next/static/chunks/5854-56648a9fe646b9a0.js +1 -0
  63. package/apps/pwa/out/_next/static/chunks/{9f31e478.fefcbcd3c388ebc5.js → 58edce7d.f1b0c72acf13b123.js} +1 -1
  64. package/apps/pwa/out/_next/static/chunks/5925.3b1f8b135710249b.js +93 -0
  65. package/apps/pwa/out/_next/static/chunks/{3136.30aaaa5fa03662a3.js → 5952.294fc574a8625184.js} +1 -1
  66. package/apps/pwa/out/_next/static/chunks/{da5ecc5c-b005ad8cac737d57.js → 5f6af561-f90b7a67f4f75d13.js} +1 -1
  67. package/apps/pwa/out/_next/static/chunks/6168.17749aa3905fa073.js +74 -0
  68. package/apps/pwa/out/_next/static/chunks/{3324.a09703033abcbd2f.js → 6252.240578f10952e091.js} +1 -1
  69. package/apps/pwa/out/_next/static/chunks/6416.5d50b8ec9986ca98.js +1 -0
  70. package/apps/pwa/out/_next/static/chunks/{8904.7d51af2dc033965c.js → 6680.6a693c28aae4cd19.js} +2 -2
  71. package/apps/pwa/out/_next/static/chunks/{275-02ea4c2a33980422.js → 6745-5a63492933959dd9.js} +3 -3
  72. package/apps/pwa/out/_next/static/chunks/6758.e7fbf532953c0783.js +1 -0
  73. package/apps/pwa/out/_next/static/chunks/6795.0cb8a59730d99703.js +149 -0
  74. package/apps/pwa/out/_next/static/chunks/{528.38ce20ef8aa251ff.js → 6819.be5c9c4d67f22922.js} +3 -3
  75. package/apps/pwa/out/_next/static/chunks/6877-84d47b7e85d0c41e.js +1 -0
  76. package/apps/pwa/out/_next/static/chunks/6971-fb5f9dc0a2cb5d2d.js +1 -0
  77. package/apps/pwa/out/_next/static/chunks/{3a3d9966.cc4d4585a2708e7c.js → 709a918c.4fd3b4e2a32cb4e3.js} +1 -1
  78. package/apps/pwa/out/_next/static/chunks/717.522b08685979b814.js +1 -0
  79. package/apps/pwa/out/_next/static/chunks/7191.e41eb8f455c7f089.js +41 -0
  80. package/apps/pwa/out/_next/static/chunks/7233.8e744b7513119409.js +1 -0
  81. package/apps/pwa/out/_next/static/chunks/7238-97c2226f80504bd8.js +1 -0
  82. package/apps/pwa/out/_next/static/chunks/7285.307963afcf7e7660.js +24 -0
  83. package/apps/pwa/out/_next/static/chunks/7299-fbe4b8c47a87614a.js +1 -0
  84. package/apps/pwa/out/_next/static/chunks/7314.df0d95930b0c3f50.js +1 -0
  85. package/apps/pwa/out/_next/static/chunks/7406.c0589fdf2ee66629.js +1 -0
  86. package/apps/pwa/out/_next/static/chunks/{4304.e9b2512834a9e23e.js → 7424.c0fe2a595d4232b5.js} +1 -1
  87. package/apps/pwa/out/_next/static/chunks/752-90e3e7daad3d8e39.js +1 -0
  88. package/apps/pwa/out/_next/static/chunks/7524-bcd3d9928c6842d9.js +1 -0
  89. package/apps/pwa/out/_next/static/chunks/7549.9a4de3bf231cfc52.js +1 -0
  90. package/apps/pwa/out/_next/static/chunks/757-4fbaf50942b8c424.js +1 -0
  91. package/apps/pwa/out/_next/static/chunks/765.76ae970ceb597b5b.js +1 -0
  92. package/apps/pwa/out/_next/static/chunks/{2683.c9773a0c589b031b.js → 7867.e8725745ddd1d940.js} +4 -4
  93. package/apps/pwa/out/_next/static/chunks/{6466-92e65a48490b68a9.js → 7893-e444a1b0809cd1e4.js} +1 -1
  94. package/apps/pwa/out/_next/static/chunks/7956-33748cabb3a05562.js +1 -0
  95. package/apps/pwa/out/_next/static/chunks/{ccae1c4b-0cf414f5eff1b10d.js → 7c5ed21f-f286708e57cf88f7.js} +1 -1
  96. package/apps/pwa/out/_next/static/chunks/8030-aa66b478b53dbfca.js +1 -0
  97. package/apps/pwa/out/_next/static/chunks/8051.c88c07dacbbc5f21.js +8 -0
  98. package/apps/pwa/out/_next/static/chunks/{3840-5825d56d46976a92.js → 8080-40d781e7704d3671.js} +1 -1
  99. package/apps/pwa/out/_next/static/chunks/8149.80e402d4345e8dae.js +77 -0
  100. package/apps/pwa/out/_next/static/chunks/8205.50a5268f4e12ba0b.js +1 -0
  101. package/apps/pwa/out/_next/static/chunks/8231.a128feaa6f8b6079.js +1 -0
  102. package/apps/pwa/out/_next/static/chunks/85.4ddb1dda2ea3ffa2.js +286 -0
  103. package/apps/pwa/out/_next/static/chunks/8537.26517a09e8247beb.js +1 -0
  104. package/apps/pwa/out/_next/static/chunks/8595-e9b7081ab773a61f.js +1 -0
  105. package/apps/pwa/out/_next/static/chunks/8821-30cc65a61a60951f.js +1 -0
  106. package/apps/pwa/out/_next/static/chunks/8905.b3385aadb7b133e6.js +79 -0
  107. package/apps/pwa/out/_next/static/chunks/8983.246bb3a1ac38f50f.js +1 -0
  108. package/apps/pwa/out/_next/static/chunks/{873d6c12.09bd499f57171543.js → 8c58d09b.e8724a299658d86f.js} +1 -1
  109. package/apps/pwa/out/_next/static/chunks/9072.18342f5941a1f3ec.js +1 -0
  110. package/apps/pwa/out/_next/static/chunks/9123.9df04866b2d6e00f.js +1 -0
  111. package/apps/pwa/out/_next/static/chunks/{575.d929793a53f27c4b.js → 9151.a2c51e93f9156dae.js} +1 -1
  112. package/apps/pwa/out/_next/static/chunks/9175-7d383df15a82e2be.js +1 -0
  113. package/apps/pwa/out/_next/static/chunks/9181-bf89c07ce5b8f599.js +1 -0
  114. package/apps/pwa/out/_next/static/chunks/920-429bbc4504b45f71.js +1 -0
  115. package/apps/pwa/out/_next/static/chunks/9207.625edf45d656151c.js +1 -0
  116. package/apps/pwa/out/_next/static/chunks/9378.d2575c6ffd6dd756.js +94 -0
  117. package/apps/pwa/out/_next/static/chunks/957.db5b5c4d32a35240.js +1 -0
  118. package/apps/pwa/out/_next/static/chunks/{190.285c832bd9626f8c.js → 958.53a8dcf4729e6997.js} +1 -1
  119. package/apps/pwa/out/_next/static/chunks/9647.8f0cd0898c592a29.js +1 -0
  120. package/apps/pwa/out/_next/static/chunks/9665-26abb02665704c2c.js +1 -0
  121. package/apps/pwa/out/_next/static/chunks/9703.e7d81b6faef1050a.js +1 -0
  122. package/apps/pwa/out/_next/static/chunks/9882-7a9164b3c2dacbe5.js +1 -0
  123. package/apps/pwa/out/_next/static/chunks/9998.b74e033efadecd10.js +1 -0
  124. package/apps/pwa/out/_next/static/chunks/app/_not-found/page-c604fb980a634d88.js +1 -0
  125. package/apps/pwa/out/_next/static/chunks/app/approvals/page-ec2d8a4979ca9075.js +1 -0
  126. package/apps/pwa/out/_next/static/chunks/app/autopilot/page-cb6add08ad3c7660.js +1 -0
  127. package/apps/pwa/out/_next/static/chunks/app/board/page-e2eaa321ec223fe6.js +1 -0
  128. package/apps/pwa/out/_next/static/chunks/app/botlab/page-5b8a09c475b5f844.js +1 -0
  129. package/apps/pwa/out/_next/static/chunks/app/bots/page-91a77daedfbac191.js +1 -0
  130. package/apps/pwa/out/_next/static/chunks/app/ceo/page-f37fc5e974bda39b.js +1 -0
  131. package/apps/pwa/out/_next/static/chunks/app/chat/page-91429a0b78415a94.js +1 -0
  132. package/apps/pwa/out/_next/static/chunks/app/consult/page-b95798b58263b910.js +1 -0
  133. package/apps/pwa/out/_next/static/chunks/app/control/page-763d53e175e17aa1.js +1 -0
  134. package/apps/pwa/out/_next/static/chunks/app/decisions/page-d55023204055b12f.js +1 -0
  135. package/apps/pwa/out/_next/static/chunks/app/design-check/page-89d2140d78abc810.js +1 -0
  136. package/apps/pwa/out/_next/static/chunks/app/editor/page-82dc069abfe27f55.js +1 -0
  137. package/apps/pwa/out/_next/static/chunks/app/exec/page-25d9eee7beb552c0.js +1 -0
  138. package/apps/pwa/out/_next/static/chunks/app/field/page-770b4594c713ee97.js +1 -0
  139. package/apps/pwa/out/_next/static/chunks/app/healthz/route-c604fb980a634d88.js +1 -0
  140. package/apps/pwa/out/_next/static/chunks/app/inside/page-ba8e0dcae4f83985.js +1 -0
  141. package/apps/pwa/out/_next/static/chunks/app/intake/page-5c112c6d7c33656e.js +1 -0
  142. package/apps/pwa/out/_next/static/chunks/app/layout-09788e1aa9a87db6.js +1 -0
  143. package/apps/pwa/out/_next/static/chunks/app/live/{page-e2de2e59111c9aad.js → page-3337c6a1328c2674.js} +1 -1
  144. package/apps/pwa/out/_next/static/chunks/app/live-run/{page-f2b2e4bf6e981450.js → page-89acd5d68c0bc560.js} +1 -1
  145. package/apps/pwa/out/_next/static/chunks/app/loops/page-5c13e2c76371d797.js +1 -0
  146. package/apps/pwa/out/_next/static/chunks/app/market/page-653a9f18642825c6.js +1 -0
  147. package/apps/pwa/out/_next/static/chunks/app/missions/[id]/{page-2af16e62c12f22df.js → page-fe986fe79b107546.js} +1 -1
  148. package/apps/pwa/out/_next/static/chunks/app/morning/page-1e5da297557d2354.js +1 -0
  149. package/apps/pwa/out/_next/static/chunks/app/not-found-91ea9f5869a40943.js +1 -0
  150. package/apps/pwa/out/_next/static/chunks/app/observatory/page-7824e21b999962e2.js +1 -0
  151. package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-53d00a60cc75a922.js +1 -0
  152. package/apps/pwa/out/_next/static/chunks/app/ops/release/page-88a1edbff62eaf1d.js +1 -0
  153. package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-4e931248b3f9574b.js +1 -0
  154. package/apps/pwa/out/_next/static/chunks/app/outputs/page-443364c9e4a23b31.js +1 -0
  155. package/apps/pwa/out/_next/static/chunks/app/page-b9af2ac1c4737ce8.js +1 -0
  156. package/apps/pwa/out/_next/static/chunks/app/reflection/page-25ab9c614c14129b.js +1 -0
  157. package/apps/pwa/out/_next/static/chunks/app/scheduler/page-dbcdcfac0a395a8a.js +1 -0
  158. package/apps/pwa/out/_next/static/chunks/app/sessions/page-bf1de6645089ec58.js +1 -0
  159. package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-c4201761a5e839c9.js +1 -0
  160. package/apps/pwa/out/_next/static/chunks/app/settings/page-c304f469ea5d70e4.js +1 -0
  161. package/apps/pwa/out/_next/static/chunks/app/setup/done/page-8e5a238cf5e50c9c.js +1 -0
  162. package/apps/pwa/out/_next/static/chunks/app/setup/layout-c604fb980a634d88.js +1 -0
  163. package/apps/pwa/out/_next/static/chunks/app/setup/page-32b526069ee50b3c.js +1 -0
  164. package/apps/pwa/out/_next/static/chunks/app/share/page-fb9e639c107f5f72.js +1 -0
  165. package/apps/pwa/out/_next/static/chunks/app/showroom/page-84220c776608cedc.js +1 -0
  166. package/apps/pwa/out/_next/static/chunks/app/tasks/page-e475618cbfd5ca2b.js +1 -0
  167. package/apps/pwa/out/_next/static/chunks/app/term/page-ac2c1e6169cfce57.js +1 -0
  168. package/apps/pwa/out/_next/static/chunks/app/today/page-fccd3020af2f8806.js +1 -0
  169. package/apps/pwa/out/_next/static/chunks/app/trace/page-9c0d7198ff7b5a91.js +1 -0
  170. package/apps/pwa/out/_next/static/chunks/app/vault/page-d54b1ec9b9c6430d.js +1 -0
  171. package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-8c4bef1791d732ca.js +1 -0
  172. package/apps/pwa/out/_next/static/chunks/app/workflows/page-46fcc0b0bbc6fbfe.js +1 -0
  173. package/apps/pwa/out/_next/static/chunks/app/workspace/page-c1c80e345fa9d6f5.js +1 -0
  174. package/apps/pwa/out/_next/static/chunks/app/worktrees/page-7dfda00afd172f5b.js +1 -0
  175. package/apps/pwa/out/_next/static/chunks/{053a429e.9a63436527cc751c.js → d9815f84.4918f682a45a8502.js} +1 -1
  176. package/apps/pwa/out/_next/static/chunks/{ceba0382.650712b56b85b582.js → de8446d3.31b73eb239fecd7b.js} +1 -1
  177. package/apps/pwa/out/_next/static/chunks/f21fd540.63ac75328926ed30.js +1 -0
  178. package/apps/pwa/out/_next/static/chunks/framework-77fdcc873519a6cd.js +1 -0
  179. package/apps/pwa/out/_next/static/chunks/main-app-d0d620d2ce235713.js +1 -0
  180. package/apps/pwa/out/_next/static/chunks/main-e0ef79c79337ba90.js +1 -0
  181. package/apps/pwa/out/_next/static/chunks/pages/_app-84b1bc71e3f9ce6a.js +1 -0
  182. package/apps/pwa/out/_next/static/chunks/pages/_error-2acb61f1363128cb.js +1 -0
  183. package/apps/pwa/out/_next/static/chunks/webpack-462ff5727ceb7824.js +1 -0
  184. package/apps/pwa/out/_next/static/css/{b5d88eba78a3d7bf.css → be9019f696217521.css} +1 -1
  185. package/apps/pwa/out/approvals/index.html +1 -1
  186. package/apps/pwa/out/approvals/index.txt +23 -23
  187. package/apps/pwa/out/autopilot/index.html +1 -1
  188. package/apps/pwa/out/autopilot/index.txt +23 -23
  189. package/apps/pwa/out/board/index.html +1 -1
  190. package/apps/pwa/out/board/index.txt +23 -23
  191. package/apps/pwa/out/botlab/index.html +1 -1
  192. package/apps/pwa/out/botlab/index.txt +22 -22
  193. package/apps/pwa/out/bots/index.html +1 -1
  194. package/apps/pwa/out/bots/index.txt +22 -22
  195. package/apps/pwa/out/ceo/index.html +1 -1
  196. package/apps/pwa/out/ceo/index.txt +23 -23
  197. package/apps/pwa/out/chat/index.html +1 -1
  198. package/apps/pwa/out/chat/index.txt +22 -22
  199. package/apps/pwa/out/consult/index.html +1 -1
  200. package/apps/pwa/out/consult/index.txt +23 -23
  201. package/apps/pwa/out/control/index.html +1 -1
  202. package/apps/pwa/out/control/index.txt +23 -23
  203. package/apps/pwa/out/decisions/index.html +1 -1
  204. package/apps/pwa/out/decisions/index.txt +22 -22
  205. package/apps/pwa/out/design-check/index.html +1 -1
  206. package/apps/pwa/out/design-check/index.txt +23 -23
  207. package/apps/pwa/out/editor/index.html +1 -1
  208. package/apps/pwa/out/editor/index.txt +23 -23
  209. package/apps/pwa/out/exec/index.html +1 -1
  210. package/apps/pwa/out/exec/index.txt +23 -23
  211. package/apps/pwa/out/field/index.html +1 -1
  212. package/apps/pwa/out/field/index.txt +23 -23
  213. package/apps/pwa/out/healthz +1 -1
  214. package/apps/pwa/out/index.html +1 -1
  215. package/apps/pwa/out/index.txt +22 -22
  216. package/apps/pwa/out/inside/index.html +1 -1
  217. package/apps/pwa/out/inside/index.txt +22 -22
  218. package/apps/pwa/out/intake/index.html +1 -1
  219. package/apps/pwa/out/intake/index.txt +23 -23
  220. package/apps/pwa/out/live/index.html +1 -1
  221. package/apps/pwa/out/live/index.txt +23 -23
  222. package/apps/pwa/out/live-run/index.html +1 -1
  223. package/apps/pwa/out/live-run/index.txt +23 -23
  224. package/apps/pwa/out/loops/index.html +1 -1
  225. package/apps/pwa/out/loops/index.txt +22 -22
  226. package/apps/pwa/out/market/index.html +1 -1
  227. package/apps/pwa/out/market/index.txt +22 -22
  228. package/apps/pwa/out/missions/placeholder/index.html +1 -1
  229. package/apps/pwa/out/missions/placeholder/index.txt +22 -22
  230. package/apps/pwa/out/morning/index.html +1 -1
  231. package/apps/pwa/out/morning/index.txt +23 -23
  232. package/apps/pwa/out/observatory/index.html +1 -1
  233. package/apps/pwa/out/observatory/index.txt +23 -23
  234. package/apps/pwa/out/ops/checklist/index.html +1 -1
  235. package/apps/pwa/out/ops/checklist/index.txt +22 -22
  236. package/apps/pwa/out/ops/release/index.html +1 -1
  237. package/apps/pwa/out/ops/release/index.txt +22 -22
  238. package/apps/pwa/out/ops/seats/index.html +1 -1
  239. package/apps/pwa/out/ops/seats/index.txt +22 -22
  240. package/apps/pwa/out/outputs/index.html +1 -1
  241. package/apps/pwa/out/outputs/index.txt +22 -22
  242. package/apps/pwa/out/reflection/index.html +1 -1
  243. package/apps/pwa/out/reflection/index.txt +23 -23
  244. package/apps/pwa/out/scheduler/index.html +1 -1
  245. package/apps/pwa/out/scheduler/index.txt +23 -23
  246. package/apps/pwa/out/sessions/index.html +1 -1
  247. package/apps/pwa/out/sessions/index.txt +22 -22
  248. package/apps/pwa/out/settings/devices/index.html +1 -1
  249. package/apps/pwa/out/settings/devices/index.txt +23 -23
  250. package/apps/pwa/out/settings/index.html +1 -1
  251. package/apps/pwa/out/settings/index.txt +23 -23
  252. package/apps/pwa/out/setup/done/index.html +1 -1
  253. package/apps/pwa/out/setup/done/index.txt +23 -23
  254. package/apps/pwa/out/setup/index.html +1 -1
  255. package/apps/pwa/out/setup/index.txt +23 -23
  256. package/apps/pwa/out/share/index.html +1 -1
  257. package/apps/pwa/out/share/index.txt +23 -23
  258. package/apps/pwa/out/showroom/index.html +1 -1
  259. package/apps/pwa/out/showroom/index.txt +22 -22
  260. package/apps/pwa/out/tasks/index.html +1 -1
  261. package/apps/pwa/out/tasks/index.txt +23 -23
  262. package/apps/pwa/out/term/index.html +1 -1
  263. package/apps/pwa/out/term/index.txt +23 -23
  264. package/apps/pwa/out/today/index.html +1 -1
  265. package/apps/pwa/out/today/index.txt +23 -23
  266. package/apps/pwa/out/trace/index.html +1 -1
  267. package/apps/pwa/out/trace/index.txt +23 -23
  268. package/apps/pwa/out/vault/index.html +1 -1
  269. package/apps/pwa/out/vault/index.txt +23 -23
  270. package/apps/pwa/out/workflows/chat-ui/index.html +1 -1
  271. package/apps/pwa/out/workflows/chat-ui/index.txt +23 -23
  272. package/apps/pwa/out/workflows/index.html +1 -1
  273. package/apps/pwa/out/workflows/index.txt +23 -23
  274. package/apps/pwa/out/workspace/index.html +1 -1
  275. package/apps/pwa/out/workspace/index.txt +23 -23
  276. package/apps/pwa/out/worktrees/index.html +1 -1
  277. package/apps/pwa/out/worktrees/index.txt +23 -23
  278. package/graphs/drafts/recipes.yaml +27 -7
  279. package/graphs/work/draft-close.yaml +54 -0
  280. package/graphs/work/green-close.yaml +37 -0
  281. package/graphs/work/recipes.yaml +46 -1
  282. package/graphs/work/run-research.yaml +35 -0
  283. package/package.json +1 -1
  284. package/scripts/__fixtures__/authoring-paths-10x3.json +32 -0
  285. package/scripts/boundary-proof-mapping-audit.ts +88 -0
  286. package/scripts/codex-fallback-live-probe.ts +17 -15
  287. package/scripts/fleet/node-setup.sh +32 -2
  288. package/scripts/fleet/run-light-worker.sh +9 -0
  289. package/scripts/gate-0226-failure-census.ts +507 -0
  290. package/scripts/goals/authoring-metrics.ts +258 -0
  291. package/scripts/graph-units/draft-close-node.ts +222 -0
  292. package/scripts/hook-order-sweep.ts +7 -4
  293. package/scripts/land-global-checks.ts +69 -1
  294. package/scripts/measure-nl-routing-corpus.ts +207 -2
  295. package/scripts/release-loop/docs-node.ts +140 -0
  296. package/scripts/release-loop/gate-closure.ts +48 -0
  297. package/scripts/release-loop/gate-diff.ts +2 -1
  298. package/scripts/release-loop/known-issues-node.ts +6 -4
  299. package/scripts/release-loop/notes-repair.ts +216 -0
  300. package/scripts/release-loop/prepare-node.ts +61 -5
  301. package/scripts/release-loop/resume-release.ts +114 -4
  302. package/scripts/release-loop/resume-test-traffic.ts +10 -0
  303. package/scripts/release-loop/version-node.ts +81 -12
  304. package/scripts/train/green-leg.ts +176 -0
  305. package/scripts/tui-continue-real-evidence.ts +47 -0
  306. package/scripts/ux-sim.ts +1 -1
  307. package/src/acp/client.ts +31 -5
  308. package/src/acp/core-turn-bridge.ts +6 -0
  309. package/src/acp/stderr-summary.ts +49 -0
  310. package/src/agent/monad-agent-turn.ts +1 -0
  311. package/src/agent/terminal-surface.ts +217 -0
  312. package/src/agent-substrate/pr-reviewer.ts +11 -3
  313. package/src/agent-substrate/self-review-cli.ts +343 -31
  314. package/src/autopilot/lineage/sources.ts +1 -1
  315. package/src/autopilot/pr-manager.ts +64 -13
  316. package/src/boot/daemon-runtime.ts +35 -3
  317. package/src/boot/daemon-tools/pty-shell.ts +2 -1
  318. package/src/budget/run-usage-rollup.ts +12 -7
  319. package/src/budget/unified-usage.ts +20 -0
  320. package/src/capture/tui-self-report.ts +32 -3
  321. package/src/cli/autopilot-cli.ts +24 -9
  322. package/src/cli/decisions-cli.ts +7 -4
  323. package/src/cli/doctor-cli.ts +116 -7
  324. package/src/cli/logs-cli.ts +357 -2
  325. package/src/cli/memory-cli.ts +30 -1
  326. package/src/cli/msg-cli.ts +15 -11
  327. package/src/cli/pr-granularity.ts +5 -3
  328. package/src/cli/release-checklist-read-cli.ts +109 -4
  329. package/src/cli/release-cli.ts +43 -10
  330. package/src/cli/self-update.ts +23 -5
  331. package/src/cli/self-utterances-cli.ts +13 -16
  332. package/src/cli/tasks-cli.ts +309 -11
  333. package/src/cli/usage-cli.ts +12 -10
  334. package/src/context-bus/claude-memory-import.ts +99 -0
  335. package/src/context-bus/long-term-memory.ts +125 -0
  336. package/src/core-turn/run-goal-loop.ts +5 -2
  337. package/src/core-turn/types.ts +2 -0
  338. package/src/dashboard/chat/acp-chat.ts +9 -0
  339. package/src/dashboard/index.ts +97 -13
  340. package/src/dashboard/input/agent-wake.ts +43 -0
  341. package/src/dashboard/input/chat-main-acp-dispatch.ts +21 -1
  342. package/src/dashboard/replay-preview.ts +25 -0
  343. package/src/dashboard/slash-runtime/dashboard-handlers.ts +17 -8
  344. package/src/dashboard/synchronized-frame-output.ts +74 -0
  345. package/src/display/coordinator.ts +45 -12
  346. package/src/display/resize-listener.ts +41 -20
  347. package/src/display/synchronized-output-region.ts +60 -0
  348. package/src/domains/surface-events.ts +80 -1
  349. package/src/exec-requests/planner.ts +37 -2
  350. package/src/execution-loop/launch-gate.ts +4 -3
  351. package/src/git-fs/cli-stderr.ts +45 -0
  352. package/src/git-fs/gh-cli.ts +6 -3
  353. package/src/git-fs/git-cli.ts +11 -5
  354. package/src/graph-runner/graph-cli.ts +26 -2
  355. package/src/graph-runner/graph-run-api.ts +3 -2
  356. package/src/graph-runner/runner.ts +17 -5
  357. package/src/graph-wizard/generate.ts +29 -6
  358. package/src/harness/harness-cli-command.ts +179 -33
  359. package/src/harness/review-adapter.ts +26 -6
  360. package/src/index.ts +116 -13
  361. package/src/instance/test-write-guard-real-transport.fixture.ts +52 -0
  362. package/src/llm/route-decision.ts +13 -0
  363. package/src/llm-tool-name.ts +37 -0
  364. package/src/llm-tool-schema.ts +35 -0
  365. package/src/llm.ts +123 -11
  366. package/src/loops/checker.ts +100 -0
  367. package/src/loops/consensus.ts +26 -2
  368. package/src/loops/loop-cli.ts +9 -4
  369. package/src/loops/orchestrator/anomaly-cluster.ts +243 -0
  370. package/src/loops/orchestrator/tick.ts +49 -4
  371. package/src/model-tier/llm-tier-map.ts +12 -17
  372. package/src/msg/msg-store.ts +17 -0
  373. package/src/native-tool-catalog.ts +1 -1
  374. package/src/nexus/api/graph-wizard-api.ts +27 -2
  375. package/src/nexus/api/grid.ts +24 -4
  376. package/src/nexus/api/http-server.ts +1 -1
  377. package/src/nexus/api/ops-api.ts +14 -6
  378. package/src/nexus/state/state.ts +7 -1
  379. package/src/oauth/codex-account-store.ts +34 -1
  380. package/src/ops/loops-map.ts +46 -0
  381. package/src/ops/overview-cache.ts +22 -4
  382. package/src/ops/overview.ts +41 -5
  383. package/src/policy/llm-policy.ts +3 -1
  384. package/src/prompt-enhance/enhance.ts +4 -4
  385. package/src/pty-shell/availability.ts +7 -0
  386. package/src/pty-shell/herdr-agent-report.ts +40 -31
  387. package/src/pty-shell/herdr-prune-stale.ts +17 -0
  388. package/src/pty-shell/herdr-sequence-lease.ts +60 -0
  389. package/src/pty-shell/pty-control-ipc.ts +187 -18
  390. package/src/pty-shell/registry.ts +25 -15
  391. package/src/pty-shell/tui-run-state.ts +235 -1
  392. package/src/release-loop/checklist.ts +50 -5
  393. package/src/release-loop/feature-store.ts +9 -9
  394. package/src/release-loop/landed-but-yellow.ts +93 -12
  395. package/src/repl/index.ts +8 -0
  396. package/src/seat-loop/seat-report.ts +1 -0
  397. package/src/self-dev/ask-launch-flow.ts +86 -10
  398. package/src/self-dev/decompose-proposal.ts +29 -18
  399. package/src/self-dev/dev-pipeline.ts +29 -7
  400. package/src/self-dev/draft-sweep.ts +241 -16
  401. package/src/self-dev/draft-triage-rules.ts +19 -5
  402. package/src/self-dev/review-provider-fallback.ts +45 -7
  403. package/src/self-dev/shard-plan.ts +48 -0
  404. package/src/self-dev/shard-run.ts +50 -3
  405. package/src/self-implement/doctor-visit.ts +83 -0
  406. package/src/self-implement/gate-artifacts.ts +6 -2
  407. package/src/self-implement/gate-baseline.ts +64 -1
  408. package/src/self-implement/gate-cli.ts +93 -9
  409. package/src/self-implement/gate-remote.ts +28 -4
  410. package/src/self-implement/gate-scope.ts +13 -1
  411. package/src/self-implement/goal-author.ts +333 -18
  412. package/src/self-implement/goal-supervisor-fill.ts +75 -26
  413. package/src/self-implement/importer-test-index.ts +215 -2
  414. package/src/self-implement/knowhow-pack.ts +5 -5
  415. package/src/self-implement/orchestrator.ts +318 -25
  416. package/src/self-implement/review-round-brief.ts +300 -0
  417. package/src/self-implement/rework-policy.ts +14 -0
  418. package/src/self-implement/run-ledger.ts +170 -6
  419. package/src/self-implement/run-stop.ts +1 -1
  420. package/src/self-implement/running-runs.ts +17 -3
  421. package/src/self-implement/seams.ts +12 -6
  422. package/src/self-implement/stop-autoheal.ts +1 -0
  423. package/src/self-implement/test-seams.ts +13 -1
  424. package/src/self-implement/train-reach-grouping.ts +8 -2
  425. package/src/session/chat.ts +7 -1
  426. package/src/session/id-prefix.ts +60 -0
  427. package/src/session/index.ts +4 -0
  428. package/src/session-runtime/index.ts +9 -1
  429. package/src/skills/tools/pty.ts +5 -0
  430. package/src/status/metrics.ts +12 -1
  431. package/src/steward/rejudge-tick.ts +12 -5
  432. package/src/steward/resync-tick.ts +31 -4
  433. package/src/task-agent/actions.ts +199 -4
  434. package/src/task-agent/boundary-proof-mapping.ts +12 -0
  435. package/src/task-agent/boundary-proof-producer.ts +147 -0
  436. package/src/task-agent/completion-evidence.ts +2 -1
  437. package/src/task-agent/green-close-recipe.ts +239 -0
  438. package/src/task-agent/green-sweep.ts +64 -10
  439. package/src/task-agent/live-moves.ts +48 -3
  440. package/src/task-agent/map-host-adapter.ts +134 -0
  441. package/src/task-agent/map-reduce.ts +158 -0
  442. package/src/task-agent/map-run-ledger.ts +226 -0
  443. package/src/task-agent/parent-host.ts +21 -11
  444. package/src/task-agent/rejudge-on-head.ts +72 -5
  445. package/src/task-agent/repair-cycle.ts +41 -0
  446. package/src/task-agent/repair-next-move.ts +12 -2
  447. package/src/task-agent/review-prior-fix.ts +12 -2
  448. package/src/task-agent/shadow.ts +188 -5
  449. package/src/task-agent/task-hand.ts +158 -13
  450. package/src/task-agent/task-parent-role-llm.ts +9 -0
  451. package/src/task-agent/tier-split.ts +4 -3
  452. package/src/task-agent/work-order.ts +53 -2
  453. package/src/task-orchestrator/dispatcher.ts +46 -1
  454. package/src/task-orchestrator/generator-prompt.ts +6 -0
  455. package/src/task-orchestrator/surfaces/pod-artifact-return.ts +16 -6
  456. package/src/task-orchestrator/surfaces/pod-ledger-collect.ts +8 -6
  457. package/src/task-orchestrator/surfaces/pod-ledger-events.ts +97 -0
  458. package/src/task-orchestrator/surfaces/pod-pool.ts +50 -4
  459. package/src/task-orchestrator/surfaces/pod-warm-worker-provider.ts +15 -9
  460. package/src/task-orchestrator/surfaces/self-implement-pod.ts +217 -36
  461. package/src/task-orchestrator/surfaces/self-implement.ts +4 -0
  462. package/src/testing/linux-env.ts +177 -0
  463. package/src/tui/chat/goal-interim.ts +5 -1
  464. package/src/tui/entry.ts +258 -4
  465. package/src/tui/input/at-picker.ts +55 -0
  466. package/src/tui/slash/resume.ts +35 -12
  467. package/src/tui/slash/signals.ts +114 -0
  468. package/src/tui/slash/term-next.ts +71 -0
  469. package/src/tui-client/local-chat-turn.ts +4 -3
  470. package/src/user-config.ts +19 -1
  471. package/src/ux-sim/boot-daemon-tools-pty-shell-device.ts +136 -0
  472. package/src/ux-sim/classic-tui-seat-scenarios.ts +158 -4
  473. package/src/ux-sim/fake-gh.ts +174 -0
  474. package/src/ux-sim/fake-kubectl.ts +142 -0
  475. package/src/ux-sim/fake-llm.ts +6 -1
  476. package/src/ux-sim/next-tui-seat-scenarios.ts +124 -6
  477. package/src/ux-sim/resume-picker-device.ts +173 -0
  478. package/src/ux-sim/session-id-seed.ts +60 -0
  479. package/src/ux-sim/skills-tools-shell-device.ts +156 -0
  480. package/src/ux-sim/task-agent-parent-host-device.ts +264 -0
  481. package/src/ux-sim/task-agent-rejudge-on-head-device.ts +114 -0
  482. package/src/version/packed-revision.json +1 -1
  483. package/apps/pwa/out/_next/static/chunks/109.f196abf3484bb97f.js +0 -287
  484. package/apps/pwa/out/_next/static/chunks/1201.afbfc5b1c5e5cbe4.js +0 -1
  485. package/apps/pwa/out/_next/static/chunks/1517.9275b89572098ff3.js +0 -1
  486. package/apps/pwa/out/_next/static/chunks/1574.ad11f8db8396ab45.js +0 -1
  487. package/apps/pwa/out/_next/static/chunks/1614.7a8c5c40aee0261f.js +0 -1
  488. package/apps/pwa/out/_next/static/chunks/1871-f1eb29d8dbb4065b.js +0 -1
  489. package/apps/pwa/out/_next/static/chunks/2193.0ea24c4a7aa1d004.js +0 -36
  490. package/apps/pwa/out/_next/static/chunks/223-ad865c1e80491d78.js +0 -1
  491. package/apps/pwa/out/_next/static/chunks/2265-f0d90b6dbec05f81.js +0 -1
  492. package/apps/pwa/out/_next/static/chunks/2267.eb4a62a209f09ec4.js +0 -149
  493. package/apps/pwa/out/_next/static/chunks/2341-86cd06c0cf01aa33.js +0 -1
  494. package/apps/pwa/out/_next/static/chunks/2352.9abc42422bade876.js +0 -1
  495. package/apps/pwa/out/_next/static/chunks/2397-c1653a816061842d.js +0 -1
  496. package/apps/pwa/out/_next/static/chunks/2500.cbc1257b774aae52.js +0 -1
  497. package/apps/pwa/out/_next/static/chunks/2709.8e1889034255fc5f.js +0 -24
  498. package/apps/pwa/out/_next/static/chunks/2812ca6a.3b9f4a7a08885744.js +0 -1
  499. package/apps/pwa/out/_next/static/chunks/284.ac77c0db55bfd3a8.js +0 -1
  500. package/apps/pwa/out/_next/static/chunks/2941.3c3546f96bc6efa7.js +0 -1
  501. package/apps/pwa/out/_next/static/chunks/2976.b000698a3c6512dc.js +0 -24
  502. package/apps/pwa/out/_next/static/chunks/3031-85328a92fcce4da6.js +0 -1
  503. package/apps/pwa/out/_next/static/chunks/3148-98efd4869d660a87.js +0 -1
  504. package/apps/pwa/out/_next/static/chunks/3155.2587a55196ecb394.js +0 -226
  505. package/apps/pwa/out/_next/static/chunks/3277.785db1cf09f98601.js +0 -1
  506. package/apps/pwa/out/_next/static/chunks/3320-f9c77381f85a2c0a.js +0 -1
  507. package/apps/pwa/out/_next/static/chunks/3386-91049feabff9a94e.js +0 -1
  508. package/apps/pwa/out/_next/static/chunks/339.80afb7e8839372af.js +0 -8
  509. package/apps/pwa/out/_next/static/chunks/3538.a445e50bb359d068.js +0 -32
  510. package/apps/pwa/out/_next/static/chunks/3540c645.2595a6af01a97672.js +0 -1
  511. package/apps/pwa/out/_next/static/chunks/3621.581b2054cc14bee4.js +0 -286
  512. package/apps/pwa/out/_next/static/chunks/3676.8c28d16fd84ca843.js +0 -1
  513. package/apps/pwa/out/_next/static/chunks/375-b84540853523fe52.js +0 -1
  514. package/apps/pwa/out/_next/static/chunks/379.ee262e37586fe1ae.js +0 -74
  515. package/apps/pwa/out/_next/static/chunks/3969-81054381eaec4c4c.js +0 -1
  516. package/apps/pwa/out/_next/static/chunks/4067-bf9aa60547972937.js +0 -1
  517. package/apps/pwa/out/_next/static/chunks/4116.a84a92a2492c080e.js +0 -1
  518. package/apps/pwa/out/_next/static/chunks/4176.e5729c93c29151eb.js +0 -104
  519. package/apps/pwa/out/_next/static/chunks/4227-e6c84686bc8946ca.js +0 -1
  520. package/apps/pwa/out/_next/static/chunks/4327.b9e08a71c0009348.js +0 -1
  521. package/apps/pwa/out/_next/static/chunks/4946.bd106eafd668f248.js +0 -148
  522. package/apps/pwa/out/_next/static/chunks/5085-bce4904931767ca6.js +0 -1
  523. package/apps/pwa/out/_next/static/chunks/5125.2eb9968b83767193.js +0 -93
  524. package/apps/pwa/out/_next/static/chunks/5128-75b733fd74a9a1eb.js +0 -1
  525. package/apps/pwa/out/_next/static/chunks/5489f3fe.4bb1458b09f6dead.js +0 -122
  526. package/apps/pwa/out/_next/static/chunks/5560-2a4648f6a30f16e7.js +0 -1
  527. package/apps/pwa/out/_next/static/chunks/5772-e29e14f8ff127122.js +0 -1
  528. package/apps/pwa/out/_next/static/chunks/5887.5b2f5b44ce0f7e9a.js +0 -1
  529. package/apps/pwa/out/_next/static/chunks/5899-4c112a2d908cf97f.js +0 -1
  530. package/apps/pwa/out/_next/static/chunks/599.c39c571b6733f2a2.js +0 -41
  531. package/apps/pwa/out/_next/static/chunks/6041.1b65efb796ebc2a5.js +0 -79
  532. package/apps/pwa/out/_next/static/chunks/6057-765c0a26028c86b2.js +0 -1
  533. package/apps/pwa/out/_next/static/chunks/6142.f289e0d039f453a6.js +0 -1
  534. package/apps/pwa/out/_next/static/chunks/6199-6bcd61d2a3910e04.js +0 -1
  535. package/apps/pwa/out/_next/static/chunks/6236.cdf7293e710a9b2d.js +0 -1
  536. package/apps/pwa/out/_next/static/chunks/6387-237e079dac9a3ae6.js +0 -1
  537. package/apps/pwa/out/_next/static/chunks/6448-b6d272d074276e14.js +0 -1
  538. package/apps/pwa/out/_next/static/chunks/6566.926a1d1b7c911442.js +0 -1
  539. package/apps/pwa/out/_next/static/chunks/6580-cdc0e4a634ce4708.js +0 -1
  540. package/apps/pwa/out/_next/static/chunks/6659-b242dc31b20b3f29.js +0 -1
  541. package/apps/pwa/out/_next/static/chunks/6690.c5d9b321b1f79384.js +0 -1
  542. package/apps/pwa/out/_next/static/chunks/671-e9b6ad0c771c5514.js +0 -1
  543. package/apps/pwa/out/_next/static/chunks/6862.bcbf89dd0f4496b3.js +0 -27
  544. package/apps/pwa/out/_next/static/chunks/6912-7b375ee48732c767.js +0 -1
  545. package/apps/pwa/out/_next/static/chunks/6925.562d532110879886.js +0 -1
  546. package/apps/pwa/out/_next/static/chunks/727.7deb87749b0a343a.js +0 -1
  547. package/apps/pwa/out/_next/static/chunks/7545.b1aa42cd15503319.js +0 -1
  548. package/apps/pwa/out/_next/static/chunks/7551-416d298c2dc4a9ab.js +0 -1
  549. package/apps/pwa/out/_next/static/chunks/7784.1f0ac4a16d190cf4.js +0 -1
  550. package/apps/pwa/out/_next/static/chunks/7870-309de463786ac1fc.js +0 -1
  551. package/apps/pwa/out/_next/static/chunks/7888-e29b151bb6a3bb8b.js +0 -1
  552. package/apps/pwa/out/_next/static/chunks/7891.03f910124a737985.js +0 -1
  553. package/apps/pwa/out/_next/static/chunks/7905-6ba78d9234608f79.js +0 -1
  554. package/apps/pwa/out/_next/static/chunks/8037.e254fd797aa224d1.js +0 -1
  555. package/apps/pwa/out/_next/static/chunks/8207.f527886b7c464529.js +0 -1
  556. package/apps/pwa/out/_next/static/chunks/856.50bda61439d465e6.js +0 -62
  557. package/apps/pwa/out/_next/static/chunks/9031-92e9b487edb681ee.js +0 -1
  558. package/apps/pwa/out/_next/static/chunks/9060.5410d9f6a95f6287.js +0 -90
  559. package/apps/pwa/out/_next/static/chunks/914.8abefd48d579547b.js +0 -94
  560. package/apps/pwa/out/_next/static/chunks/9187-c87a2207d4ac5d46.js +0 -1
  561. package/apps/pwa/out/_next/static/chunks/9289.3e92f278821e18e0.js +0 -1
  562. package/apps/pwa/out/_next/static/chunks/9319.7816d3cc741cd34f.js +0 -1
  563. package/apps/pwa/out/_next/static/chunks/9327-e016bb9f1674d24f.js +0 -1
  564. package/apps/pwa/out/_next/static/chunks/9365.3de48bf75193ff9a.js +0 -77
  565. package/apps/pwa/out/_next/static/chunks/9383.5b5e9aa56b5fea97.js +0 -1
  566. package/apps/pwa/out/_next/static/chunks/9387-cb929573ef436f39.js +0 -1
  567. package/apps/pwa/out/_next/static/chunks/9489.c27becacc3283dec.js +0 -1
  568. package/apps/pwa/out/_next/static/chunks/9514.131c52cc75fe6439.js +0 -1
  569. package/apps/pwa/out/_next/static/chunks/9536.28962663c7734376.js +0 -1
  570. package/apps/pwa/out/_next/static/chunks/9686-12286f5bbf15a5a0.js +0 -1
  571. package/apps/pwa/out/_next/static/chunks/9776.289d40cc5a4c342a.js +0 -1
  572. package/apps/pwa/out/_next/static/chunks/9789.60f723d18097ec30.js +0 -1
  573. package/apps/pwa/out/_next/static/chunks/989.f0c17523c5e61f65.js +0 -1
  574. package/apps/pwa/out/_next/static/chunks/9972-1df393aa8d4f7d52.js +0 -1
  575. package/apps/pwa/out/_next/static/chunks/app/_not-found/page-96750aba7430959f.js +0 -1
  576. package/apps/pwa/out/_next/static/chunks/app/approvals/page-4105e5bbbb043024.js +0 -1
  577. package/apps/pwa/out/_next/static/chunks/app/autopilot/page-5d4fa75c2acb113e.js +0 -1
  578. package/apps/pwa/out/_next/static/chunks/app/board/page-a79a9bdb3b2142bf.js +0 -1
  579. package/apps/pwa/out/_next/static/chunks/app/botlab/page-f1c2047484992a35.js +0 -1
  580. package/apps/pwa/out/_next/static/chunks/app/bots/page-15ffc49b2d8c70e2.js +0 -1
  581. package/apps/pwa/out/_next/static/chunks/app/ceo/page-67d53a3fc8734135.js +0 -1
  582. package/apps/pwa/out/_next/static/chunks/app/chat/page-e30c8dc696491336.js +0 -1
  583. package/apps/pwa/out/_next/static/chunks/app/consult/page-2136e04fa77696e2.js +0 -1
  584. package/apps/pwa/out/_next/static/chunks/app/control/page-fecd2814790c2e12.js +0 -1
  585. package/apps/pwa/out/_next/static/chunks/app/decisions/page-280aa4a98fc5bb44.js +0 -1
  586. package/apps/pwa/out/_next/static/chunks/app/design-check/page-c14e96b65fb4b883.js +0 -1
  587. package/apps/pwa/out/_next/static/chunks/app/editor/page-187dac74825ed6bf.js +0 -1
  588. package/apps/pwa/out/_next/static/chunks/app/exec/page-6bc7246ea8c92448.js +0 -1
  589. package/apps/pwa/out/_next/static/chunks/app/field/page-083747f1d4518f61.js +0 -1
  590. package/apps/pwa/out/_next/static/chunks/app/healthz/route-96750aba7430959f.js +0 -1
  591. package/apps/pwa/out/_next/static/chunks/app/inside/page-15ca95a16ec96e1f.js +0 -1
  592. package/apps/pwa/out/_next/static/chunks/app/intake/page-a8ac031b3810eb64.js +0 -1
  593. package/apps/pwa/out/_next/static/chunks/app/layout-8835f93110494cda.js +0 -1
  594. package/apps/pwa/out/_next/static/chunks/app/loops/page-5b92b7f75df20948.js +0 -1
  595. package/apps/pwa/out/_next/static/chunks/app/market/page-468eddf2b1a84ecb.js +0 -1
  596. package/apps/pwa/out/_next/static/chunks/app/morning/page-18b40867a77a5793.js +0 -1
  597. package/apps/pwa/out/_next/static/chunks/app/not-found-fe934f2979f5a4a2.js +0 -1
  598. package/apps/pwa/out/_next/static/chunks/app/observatory/page-3eec435537357170.js +0 -1
  599. package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-ff88cbfd2aa99fc8.js +0 -1
  600. package/apps/pwa/out/_next/static/chunks/app/ops/release/page-a5b39fb780c70ab5.js +0 -1
  601. package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-ae465dde1d1b3933.js +0 -1
  602. package/apps/pwa/out/_next/static/chunks/app/outputs/page-e7abc34a48a6f71e.js +0 -1
  603. package/apps/pwa/out/_next/static/chunks/app/page-cab9674fde9ead26.js +0 -1
  604. package/apps/pwa/out/_next/static/chunks/app/reflection/page-1da49bc8712284d0.js +0 -1
  605. package/apps/pwa/out/_next/static/chunks/app/scheduler/page-5e8aa657551ac912.js +0 -1
  606. package/apps/pwa/out/_next/static/chunks/app/sessions/page-fcc36f36c6dc1fe2.js +0 -1
  607. package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-d22db22f2a7296ca.js +0 -1
  608. package/apps/pwa/out/_next/static/chunks/app/settings/page-d12dc7b1773878f0.js +0 -1
  609. package/apps/pwa/out/_next/static/chunks/app/setup/done/page-99debec9ea7fbec0.js +0 -1
  610. package/apps/pwa/out/_next/static/chunks/app/setup/layout-96750aba7430959f.js +0 -1
  611. package/apps/pwa/out/_next/static/chunks/app/setup/page-2a088a78bad7e924.js +0 -1
  612. package/apps/pwa/out/_next/static/chunks/app/share/page-2e8ed57db7e69993.js +0 -1
  613. package/apps/pwa/out/_next/static/chunks/app/showroom/page-4b3a16213c2ae8fe.js +0 -1
  614. package/apps/pwa/out/_next/static/chunks/app/tasks/page-f098747ddf38c98b.js +0 -1
  615. package/apps/pwa/out/_next/static/chunks/app/term/page-c15958835534404b.js +0 -1
  616. package/apps/pwa/out/_next/static/chunks/app/today/page-68279e3c843c1fd7.js +0 -1
  617. package/apps/pwa/out/_next/static/chunks/app/trace/page-a34a74453367a39d.js +0 -1
  618. package/apps/pwa/out/_next/static/chunks/app/vault/page-8767a7db2155a5bd.js +0 -1
  619. package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-bd5976683460d7f2.js +0 -1
  620. package/apps/pwa/out/_next/static/chunks/app/workflows/page-b7364835e7f2ef54.js +0 -1
  621. package/apps/pwa/out/_next/static/chunks/app/workspace/page-311af16b3ee0ffca.js +0 -1
  622. package/apps/pwa/out/_next/static/chunks/app/worktrees/page-fb670757274ae990.js +0 -1
  623. package/apps/pwa/out/_next/static/chunks/f9a61e4d.1fc2c1dbdd49fe46.js +0 -1
  624. package/apps/pwa/out/_next/static/chunks/framework-6d497cbf1eef04c6.js +0 -1
  625. package/apps/pwa/out/_next/static/chunks/main-app-012f5edec932f337.js +0 -1
  626. package/apps/pwa/out/_next/static/chunks/main-da5aeb809edc94a2.js +0 -1
  627. package/apps/pwa/out/_next/static/chunks/pages/_app-5ee319af6f749dfe.js +0 -1
  628. package/apps/pwa/out/_next/static/chunks/pages/_error-4bc84653a718d6c6.js +0 -1
  629. package/apps/pwa/out/_next/static/chunks/webpack-8a96cf6775c73d6e.js +0 -1
  630. /package/apps/pwa/out/_next/static/{uC-N0emedeNOFuaBQFv-I → 8kITumG9GAZ1LwT9POrAR}/_ssgManifest.js +0 -0
@@ -12,7 +12,8 @@ import { baseVersion, isReleaseVersion, isStableVersion, prereleaseKind } from '
12
12
  type Kind = 'release' | 'dev-bump';
13
13
  type Output = { outcome: 'ok' | 'error'; kind: Kind | null; version: string | null; commit: string | null; pr: number | null; files?: string[]; worktree?: string; error?: string;
14
14
  /** RELEASE-BRANCH: the release branch the cut lives on and the main commit it was cut from. */
15
- branch?: string; base?: string; existing?: boolean; skipped?: string };
15
+ branch?: string; base?: string; existing?: boolean; skipped?: string;
16
+ artifactOwner?: { runId: string; attempt: number } };
16
17
 
17
18
  export function nextDevVersion(version: string): string {
18
19
  const match = /^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)$/.exec(isReleaseVersion(version) ? baseVersion(version) : version);
@@ -147,6 +148,57 @@ export interface BranchCutDeps {
147
148
  freeze?: () => LandingFreeze | null;
148
149
  /** `--force-freeze`: cut while a freeze is on (recorded). */
149
150
  forceFreeze?: boolean;
151
+ /** Identity of the graph run cutting this branch. A direct legacy call may omit it. */
152
+ runId?: string;
153
+ /** Release run ledger universe; defaults to the active instance root. */
154
+ root?: string;
155
+ }
156
+
157
+ function releaseOwner(version: string, deps: BranchCutDeps): { runId: string; attempt: number } | undefined {
158
+ if (!deps.runId) return undefined;
159
+ const runId = deps.runId;
160
+ if (!/^[A-Za-z0-9][A-Za-z0-9._-]*$/.test(runId) || runId === '.' || runId === '..') throw new Error(`invalid release run id: ${runId}`);
161
+ const path = join(deps.root ?? effectiveInstanceRoot(), 'release', version, 'resume-attempts', `${runId}.json`);
162
+ if (!existsSync(path)) return { runId, attempt: 0 };
163
+ const saved = JSON.parse(readFileSync(path, 'utf8')) as { version?: unknown; runId?: unknown; attempts?: unknown };
164
+ if (saved.version !== version || saved.runId !== runId || !Array.isArray(saved.attempts)
165
+ || saved.attempts.some((value) => typeof value !== 'string' || !Number.isFinite(Date.parse(value))))
166
+ throw new Error(`invalid resume attempts: ${path}`);
167
+ return { runId, attempt: saved.attempts.length };
168
+ }
169
+
170
+ function recordedBranchOwner(repo: string, tip: string): { runId: string; attempt: number } | undefined {
171
+ // An owner's trailer inherited from main is not evidence that this release branch belongs to that run.
172
+ const fork = git(repo, 'merge-base', 'origin/main', tip);
173
+ const messages = git(repo, 'log', '--first-parent', '--format=%B', '-n', '100', `${fork}..${tip}`);
174
+ const match = /^Elanous-Release-Run: ([A-Za-z0-9][A-Za-z0-9._-]*)\nElanous-Release-Attempt: (0|[1-9][0-9]*)$/m.exec(messages);
175
+ return match ? { runId: match[1]!, attempt: Number(match[2]) } : undefined;
176
+ }
177
+
178
+ function priorRunOwnsTip(version: string, tip: string, owner: { runId: string; attempt: number }, root: string): boolean {
179
+ const path = join(root, 'graph-runs', 'release-loop', `${owner.runId}.json`);
180
+ if (!existsSync(path)) return false;
181
+ const state = JSON.parse(readFileSync(path, 'utf8')) as { graphId?: unknown; runId?: unknown; input?: { version?: unknown; branchCut?: unknown };
182
+ nodes?: Array<{ nodeId?: unknown; ok?: unknown; output?: unknown }> };
183
+ if (state.graphId !== 'release-loop' || state.runId !== owner.runId || state.input?.version !== version || state.input?.branchCut !== true) return false;
184
+ return state.nodes?.some((node) => {
185
+ if (node.nodeId !== 'version-release' || node.ok !== true || typeof node.output !== 'string') return false;
186
+ try {
187
+ const result = JSON.parse(node.output.trim().split('\n').at(-1)!) as { commit?: unknown; branch?: unknown };
188
+ return result.commit === tip && result.branch === `release/${version}`;
189
+ } catch { return false; }
190
+ }) ?? false;
191
+ }
192
+
193
+ function preserveForeignBranch(repo: string, version: string, tip: string): string {
194
+ const backupBranch = `release-backup/${version}/${tip}`;
195
+ const ref = `refs/heads/${backupBranch}`;
196
+ const existing = git(repo, 'ls-remote', '--heads', 'origin', ref).split(/\s+/)[0] ?? '';
197
+ if (existing && existing !== tip) throw new Error(`${backupBranch} points to another commit — refusing to replace release branch`);
198
+ if (!existing) git(repo, 'push', '--porcelain', `--force-with-lease=${ref}:`, 'origin', `${tip}:${ref}`);
199
+ const preserved = git(repo, 'ls-remote', '--heads', 'origin', ref).split(/\s+/)[0] ?? '';
200
+ if (preserved !== tip) throw new Error(`${backupBranch} backup verification failed — refusing to replace release branch`);
201
+ return backupBranch;
150
202
  }
151
203
 
152
204
  function currentFreeze(): LandingFreeze | null {
@@ -189,15 +241,23 @@ export function cutReleaseBranchForRun(repo: string, version: string, deps: Bran
189
241
  if (!deps.forceFreeze) throw new Error(landingFreezeMessage(frozen));
190
242
  }
191
243
  fetchMain(repo);
244
+ const owner = releaseOwner(version, deps);
192
245
  const branch = `release/${version}`;
193
246
  const advertised = git(repo, 'ls-remote', '--heads', 'origin', `refs/heads/${branch}`).split(/\s+/)[0] ?? '';
194
247
  if (advertised) {
195
- // A prerelease number is used once: an existing rc branch is another run's cut, never this run's.
196
- if (prereleaseKind(version) !== null) throw new Error(`${branch} already exists — ${version} was cut by another run; run again for the next free number`);
197
248
  if (!/^[0-9a-f]{40}$/i.test(advertised)) throw new Error(`${branch} remote tip is not a commit SHA`);
198
249
  git(repo, 'fetch', 'origin', `+refs/heads/${branch}:refs/remotes/origin/${branch}`);
199
250
  const tip = git(repo, 'rev-parse', '--verify', `refs/remotes/origin/${branch}^{commit}`);
200
251
  if (tip !== advertised) throw new Error(`${branch} moved while it was read (${advertised} → ${tip})`);
252
+ const recordedOwner = owner ? recordedBranchOwner(repo, tip) : undefined;
253
+ const ledgerOwned = owner && !recordedOwner
254
+ ? priorRunOwnsTip(version, tip, owner, deps.root ?? effectiveInstanceRoot()) : false;
255
+ if (owner && recordedOwner?.runId !== owner.runId && !ledgerOwned) {
256
+ const backupBranch = preserveForeignBranch(repo, version, tip);
257
+ throw new Error(`${branch} belongs to ${recordedOwner?.runId ?? 'an unknown run'}; preserved ${tip} at ${backupBranch}; refusing to replace a foreign release branch`);
258
+ }
259
+ // Direct legacy calls retain the old prerelease number rule. A graph run may reuse only its own rc branch.
260
+ if (!owner && prereleaseKind(version) !== null) throw new Error(`${branch} already exists — ${version} was cut by another run; run again for the next free number`);
201
261
  const current = versionAt(repo, tip);
202
262
  if (current !== version) throw new Error(`${branch} tip ${tip} package.json version ${current} is not ${version}`);
203
263
  // The branch must be a cut of this release line: its fork point on main still carries <base>-dev.N (or <v>).
@@ -207,8 +267,10 @@ export function cutReleaseBranchForRun(repo: string, version: string, deps: Bran
207
267
  if (forkVersion !== version && !new RegExp(`^${stableLine.replaceAll('.', '\\.')}-dev\\.(0|[1-9][0-9]*)$`).test(forkVersion)) {
208
268
  throw new Error(`${branch} forks from main at ${fork} (version ${forkVersion}) — not a cut of ${stableLine}-dev.N`);
209
269
  }
210
- debug.log('release-loop.cut', 'chosen', { version, source: 'release-branch', commit: tip, branch, existing: true });
211
- return { outcome: 'ok', kind: 'release', version, commit: tip, pr: null, branch, existing: true };
270
+ // A legacy saved version-release node was the initial cut; later resume counts do not change its owner attempt.
271
+ const artifactOwner = recordedOwner ?? (ledgerOwned && owner ? { runId: owner.runId, attempt: 0 } : undefined);
272
+ debug.log('release-loop.cut', 'chosen', { version, source: 'release-branch', commit: tip, branch, existing: true, artifactOwner });
273
+ return { outcome: 'ok', kind: 'release', version, commit: tip, pr: null, branch, existing: true, ...(artifactOwner ? { artifactOwner } : {}) };
212
274
  }
213
275
  const base = git(repo, 'rev-parse', 'origin/main');
214
276
  const current = versionAt(repo, base);
@@ -229,8 +291,10 @@ export function cutReleaseBranchForRun(repo: string, version: string, deps: Bran
229
291
  if (files.length) {
230
292
  (deps.install ?? ((tree: string) => { run('bun', ['install', '--frozen-lockfile'], tree); }))(worktree);
231
293
  git(worktree, 'add', '-A');
232
- git(worktree, 'commit', '-m', `release: ${version}`, '-m', `Cut from main ${base}.`);
233
294
  }
295
+ // Even a no-op version bump needs a commit that records who owns this cut.
296
+ if (files.length || owner) git(worktree, 'commit', ...(files.length ? [] : ['--allow-empty']), '-m', `release: ${version}`,
297
+ '-m', `Cut from main ${base}.${owner ? `\n\nElanous-Release-Run: ${owner.runId}\nElanous-Release-Attempt: ${owner.attempt}` : ''}`);
234
298
  const commit = git(worktree, 'rev-parse', 'HEAD');
235
299
  // Create-only: an empty lease refuses to overwrite a branch someone else made meanwhile.
236
300
  const push = git(repo, 'push', '--porcelain', `--force-with-lease=refs/heads/${branch}:`, 'origin', `${commit}:refs/heads/${branch}`);
@@ -239,16 +303,16 @@ export function cutReleaseBranchForRun(repo: string, version: string, deps: Bran
239
303
  return flag === '*' && !!ref?.endsWith(`:refs/heads/${branch}`) && summary === '[new branch]';
240
304
  });
241
305
  if (!created) throw new Error(`${branch} was not created (push: ${push.replace(/\s+/g, ' ').trim() || 'no output'})`);
242
- debug.log('release-loop.cut', 'chosen', { version, source: 'release-branch', commit, branch, base, existing: false });
243
- return { outcome: 'ok', kind: 'release', version, commit, pr: null, branch, base, files };
306
+ debug.log('release-loop.cut', 'chosen', { version, source: 'release-branch', commit, branch, base, existing: false, artifactOwner: owner });
307
+ return { outcome: 'ok', kind: 'release', version, commit, pr: null, branch, base, files, ...(owner ? { artifactOwner: owner } : {}) };
244
308
  } finally {
245
309
  try { if (added) git(repo, 'worktree', 'remove', '--force', worktree); }
246
310
  finally { rmSync(temp, { recursive: true, force: true }); }
247
311
  }
248
312
  }
249
313
 
250
- function landing(repo: string, kind: Kind, releaseVersion: string, cut?: string, cutCommit?: string, forceFreeze = false, branchCut = false, devTarget?: string): Output {
251
- if (kind === 'release' && branchCut && cutCommit === undefined) return cutReleaseBranchForRun(repo, releaseVersion, { forceFreeze });
314
+ function landing(repo: string, kind: Kind, releaseVersion: string, cut?: string, cutCommit?: string, forceFreeze = false, branchCut = false, devTarget?: string, runId?: string): Output {
315
+ if (kind === 'release' && branchCut && cutCommit === undefined) return cutReleaseBranchForRun(repo, releaseVersion, { forceFreeze, runId });
252
316
  if (kind === 'dev-bump' && prereleaseKind(releaseVersion) !== null) {
253
317
  // A prerelease (rehearsal) never moves main: the next stable release still owns this -dev line.
254
318
  debug.log('release-loop.version-dev-bump', 'skipped', { version: releaseVersion, reason: 'prerelease' });
@@ -375,6 +439,7 @@ export function main(args: string[] = process.argv.slice(2), repo = process.cwd(
375
439
  let cutCommit: string | undefined;
376
440
  let forceFreeze = false;
377
441
  let branchCut = false;
442
+ let runId: string | undefined;
378
443
  try {
379
444
  if (args[0] !== 'release' && args[0] !== 'dev-bump') throw new Error('usage: version-node.ts <release|dev-bump> [--version <v>] [--cut <sha>] [--cut-commit <sha>] --json');
380
445
  kind = args[0];
@@ -388,7 +453,11 @@ export function main(args: string[] = process.argv.slice(2), repo = process.cwd(
388
453
  if (process.env.ELANOUS_GRAPH_CONTEXT) {
389
454
  const location = process.env.ELANOUS_GRAPH_CONTEXT;
390
455
  const context = JSON.parse(location.trimStart().startsWith('{') ? location : readFileSync(location, 'utf8')) as {
391
- input?: { version?: unknown; cutCommit?: unknown; forceFreeze?: unknown; branchCut?: unknown }; outputs?: Record<string, { commit?: unknown } | undefined> };
456
+ runId?: unknown; input?: { version?: unknown; cutCommit?: unknown; forceFreeze?: unknown; branchCut?: unknown }; outputs?: Record<string, { commit?: unknown } | undefined> };
457
+ if (context.runId !== undefined) {
458
+ if (typeof context.runId !== 'string') throw new Error('runId must be a string');
459
+ runId = context.runId;
460
+ }
392
461
  if (!version && typeof context.input?.version === 'string') version = context.input.version;
393
462
  forceFreeze = context.input?.forceFreeze === true;
394
463
  branchCut = context.input?.branchCut === true;
@@ -403,7 +472,7 @@ export function main(args: string[] = process.argv.slice(2), repo = process.cwd(
403
472
  if (!version) throw new Error('version required (--version or ELANOUS_GRAPH_CONTEXT.input.version)');
404
473
  nextDevVersion(version);
405
474
  if (kind === 'dev-bump' && cutCommit !== undefined) throw new Error('--cut-commit is only valid for release');
406
- return landing(resolve(repo), kind, version, cut, cutCommit, forceFreeze, branchCut);
475
+ return landing(resolve(repo), kind, version, cut, cutCommit, forceFreeze, branchCut, undefined, runId);
407
476
  } catch (error) {
408
477
  const message = error instanceof Error ? error.message : String(error);
409
478
  const worktree = /\[worktree: ([^\]]+)\]$/.exec(message)?.[1];
@@ -0,0 +1,176 @@
1
+ import { execFile as nodeExecFile, spawn } from 'node:child_process';
2
+ import { rm } from 'node:fs/promises';
3
+ import { tmpdir } from 'node:os';
4
+ import { join, resolve } from 'node:path';
5
+ import { promisify } from 'node:util';
6
+ import { execFileSync } from 'node:child_process';
7
+ import { validateGoalDoneEvidenceCommand } from '../../src/self-implement/goal-author.js';
8
+ import { listChecklist, setItemIfSnapshot } from '../../src/release-loop/checklist.js';
9
+
10
+ const execFile = promisify(nodeExecFile);
11
+ const OUTPUT_TAIL_CHARS = 8_000;
12
+ export interface CommandResult { command: string; rc: number | null; timedOut: boolean; outputTail: string; startedAt: string; endedAt: string }
13
+ export interface GreenLegInput { version: string; cellId: string; mergeSha: string; tree: string; timeoutMs?: number }
14
+ export interface GreenLegDeps {
15
+ run: (command: string, cwd: string, timeoutMs: number) => Promise<CommandResult>;
16
+ record: (input: GreenLegInput, evidence: string) => Promise<void>;
17
+ propose: (body: string) => Promise<void>;
18
+ now: () => string;
19
+ resolveLandedMerge?: (tree: string, mergeSha: string) => string;
20
+ getCell?: (version: string, cellId: string) => { title: string; status: string } | undefined;
21
+ }
22
+
23
+ /** Parse the train lane's required proof command and optional isolated E4 command. */
24
+ export function completionBoundaryCommands(title: string): { evidence?: string; real?: string; errors: string[] } {
25
+ const errors: string[] = [];
26
+ const read = (label: string, optional: boolean): string | undefined => {
27
+ const prefix = `- 완료 경계 ${label}:`;
28
+ const lines = title.split(/\r?\n/u).filter((line) => line.startsWith(prefix));
29
+ if (lines.length > 1) { errors.push(`${label}: 중복 선언`); return; }
30
+ const value = lines[0]?.slice(prefix.length).trim();
31
+ if (!value) {
32
+ if (!optional) errors.push(`${label}: 선언 없음`);
33
+ return;
34
+ }
35
+ const parsed = validateGoalDoneEvidenceCommand(value);
36
+ if (!parsed.command) { errors.push(`${label}: ${parsed.error ?? '잘못된 명령'}`); return; }
37
+ return parsed.command;
38
+ };
39
+ return { evidence: read('증거 명령', false), real: read('실물 명령', true), errors };
40
+ }
41
+
42
+ function tokenize(command: string): string[] | null {
43
+ const args: string[] = [];
44
+ let current = '', quote: '"' | "'" | undefined, escaped = false, active = false;
45
+ for (const char of command) {
46
+ if (escaped) { current += char; escaped = false; active = true; continue; }
47
+ if (char === '\\' && quote !== "'") { escaped = true; active = true; continue; }
48
+ if (quote) { if (char === quote) quote = undefined; else current += char; active = true; continue; }
49
+ if (char === '"' || char === "'") { quote = char; active = true; continue; }
50
+ if (/\s/u.test(char)) { if (active) args.push(current); current = ''; active = false; continue; }
51
+ current += char; active = true;
52
+ }
53
+ if (escaped || quote) return null;
54
+ if (active) args.push(current);
55
+ return args;
56
+ }
57
+
58
+ export function validateIsolatedTestCommand(command: string): { args?: string[]; error?: string } {
59
+ const args = tokenize(command);
60
+ if (!args) return { error: '인용부호가 닫히지 않은 명령' };
61
+ if (args[0] !== 'bun' || args[1] !== 'test' || args.length < 3) return { error: '격리 레인에서는 bun test <시험 경로>만 실행 가능' };
62
+ if (args.slice(2).some((arg) => arg.startsWith('-'))) return { error: '시험 경로 외 추가 옵션은 허용하지 않음' };
63
+ if (args.slice(2).some((arg) => arg.split('/').includes('..') || arg.startsWith('/') || arg.includes('\\'))) return { error: '시험 경로는 트리 내부 상대 경로여야 함' };
64
+ return { args };
65
+ }
66
+
67
+ export function runIsolatedTestCommand(command: string, cwd: string, timeoutMs: number): Promise<CommandResult> {
68
+ const parsed = validateIsolatedTestCommand(command);
69
+ const startedAt = new Date().toISOString();
70
+ if (!parsed.args) return Promise.resolve({ command, rc: null, timedOut: false, outputTail: `REJECTED: ${parsed.error}`, startedAt, endedAt: new Date().toISOString() });
71
+ return new Promise((resolveResult) => {
72
+ const dir = join(tmpdir(), `eln-green-leg-${process.pid}-${Date.now()}`);
73
+ const child = spawn(parsed.args![0]!, parsed.args!.slice(1), {
74
+ cwd, shell: false, detached: true, env: { ...process.env, ELANOUS_STATE_DIR: dir },
75
+ stdio: ['ignore', 'pipe', 'pipe'],
76
+ });
77
+ let output = '', timedOut = false, done = false;
78
+ let forceTimer: ReturnType<typeof setTimeout> | undefined;
79
+ const append = (chunk: Buffer): void => { output = (output + chunk.toString('utf8')).slice(-OUTPUT_TAIL_CHARS); };
80
+ child.stdout.on('data', append); child.stderr.on('data', append);
81
+ const killGroup = (signal: NodeJS.Signals): void => {
82
+ if (child.pid) { try { process.kill(-child.pid, signal); } catch { /* already exited */ } }
83
+ else child.kill(signal);
84
+ };
85
+ const timer = setTimeout(() => { timedOut = true; killGroup('SIGTERM'); forceTimer = setTimeout(() => killGroup('SIGKILL'), 2_000); forceTimer.unref(); }, timeoutMs);
86
+ const finish = (rc: number | null): void => {
87
+ if (done) return; done = true; clearTimeout(timer); if (forceTimer) clearTimeout(forceTimer);
88
+ void rm(dir, { recursive: true, force: true }).finally(() => resolveResult({ command, rc, timedOut, outputTail: output, startedAt, endedAt: new Date().toISOString() }));
89
+ };
90
+ child.on('error', (error) => { append(Buffer.from(`\nSPAWN ERROR: ${error.message}`)); finish(null); });
91
+ child.on('close', (code) => finish(code));
92
+ });
93
+ }
94
+
95
+ export async function runGreenLeg(input: GreenLegInput, deps: GreenLegDeps): Promise<{ passed: boolean; results: CommandResult[]; evidence: string }> {
96
+ const tree = resolve(input.tree);
97
+ let mergeSha: string;
98
+ try {
99
+ mergeSha = deps.resolveLandedMerge?.(tree, input.mergeSha) ?? resolveLandedMerge(tree, input.mergeSha);
100
+ } catch (error) {
101
+ const reason = error instanceof Error ? error.message : String(error);
102
+ const now = deps.now();
103
+ const evidence = [
104
+ `TRAIN-GREEN-LEG ${now}`,
105
+ `우주 표기(test:${tree})`,
106
+ `착지 merge SHA 검증 실패: ${input.mergeSha}`,
107
+ `검증 오류: ${reason}`,
108
+ '결과=미측정 · green 금지',
109
+ ].join('\n');
110
+ await deps.record(input, evidence);
111
+ await deps.propose(`evidence-only: ${input.version}/${input.cellId}; 착지 merge SHA 사전 검증 실패로 시험 미실행; 우주 test:${tree}; 입력 SHA ${input.mergeSha}; 체크리스트 상태는 변경하지 않았습니다.`);
112
+ return { passed: false, results: [], evidence };
113
+ }
114
+ const snapshot = deps.getCell?.(input.version, input.cellId) ?? listChecklist(input.version).items.find((item) => item.id === input.cellId);
115
+ if (!snapshot) throw new Error(`체크리스트 칸 없음: ${input.cellId}`);
116
+ if (snapshot.status !== 'yellow') throw new Error(`yellow가 아닌 칸에는 TRAIN-GREEN-LEG 실행 불가: ${snapshot.status}`);
117
+ const declarations = completionBoundaryCommands(snapshot.title);
118
+ const commands = [declarations.evidence, declarations.real].filter((value): value is string => Boolean(value));
119
+ const results: CommandResult[] = declarations.errors.length
120
+ ? [{ command: '', rc: null, timedOut: false, outputTail: `REJECTED: ${declarations.errors.join('; ')}`, startedAt: deps.now(), endedAt: deps.now() }]
121
+ : await runInOrder(commands, (command) => deps.run(command, tree, input.timeoutMs ?? 120_000));
122
+ const passed = declarations.errors.length === 0 && results.length > 0 && results.every((result) => result.rc === 0 && !result.timedOut);
123
+ const proposalReady = passed && Boolean(declarations.real);
124
+ const evidence = [
125
+ `TRAIN-GREEN-LEG ${deps.now()}`,
126
+ `우주 표기(test:${tree})`,
127
+ `착지 merge SHA ${mergeSha}`,
128
+ ...results.map((result) => `${result.command || '(선언 검증)'} | rc=${result.rc ?? 'spawn-error'} | timeout=${result.timedOut} | ${result.startedAt}..${result.endedAt}\n${result.outputTail}`),
129
+ `결과=${proposalReady ? '격리 E4 통과 · OP/OPT 판정 대기' : passed ? '증거 시험 통과 · 실물 E4 미선언 · human-collected 대기' : '미통과 또는 미측정 · green 금지'}`,
130
+ ].join('\n');
131
+ await deps.record(input, evidence);
132
+ await deps.propose(`${proposalReady ? 'propose-green' : 'evidence-only'}: ${input.version}/${input.cellId}; ${proposalReady ? '격리 E4 시험 명령 통과' : passed ? '증거 시험만 통과, 실물 E4는 human-collected 대기' : '명령 실패·시간초과·선언 거부 기록'}; 우주 test:${tree}; 착지 merge SHA ${mergeSha}. 체크리스트 상태는 변경하지 않았습니다.`);
133
+ return { passed, results, evidence };
134
+ }
135
+
136
+ function resolveLandedMerge(tree: string, sha: string): string {
137
+ if (!/^[0-9a-f]{40}$/iu.test(sha)) throw new Error('착지 merge SHA는 전체 40자리여야 합니다');
138
+ const full = execFileSync('git', ['-C', tree, 'rev-parse', '--verify', `${sha}^{commit}`], { encoding: 'utf8' }).trim();
139
+ execFileSync('git', ['-C', tree, 'merge-base', '--is-ancestor', full, 'HEAD']);
140
+ return full;
141
+ }
142
+
143
+ async function runInOrder<T>(items: readonly T[], run: (item: T) => Promise<CommandResult>): Promise<CommandResult[]> {
144
+ const results: CommandResult[] = [];
145
+ for (const item of items) results.push(await run(item));
146
+ return results;
147
+ }
148
+
149
+ export const defaultGreenLegDeps: GreenLegDeps = {
150
+ run: runIsolatedTestCommand,
151
+ now: () => new Date().toISOString(),
152
+ async record(input, evidence) {
153
+ const current = listChecklist(input.version).items.find((item) => item.id === input.cellId);
154
+ if (!current) throw new Error(`체크리스트 칸 없음: ${input.cellId}`);
155
+ if (current.status !== 'yellow') throw new Error(`yellow가 아닌 칸에는 TRAIN-GREEN-LEG 기록 불가: ${current.status}`);
156
+ setItemIfSnapshot(input.version, input.cellId, { evidence: [current.evidence, evidence].filter(Boolean).join('\n\n') }, 'MK', current);
157
+ },
158
+ async propose(body) { await execFile('eln', ['msg', 'post', '--from', 'MK', '--to', 'OPT', '--kind', 'report', '--body', body]); },
159
+ };
160
+
161
+ if (import.meta.main) {
162
+ const [version, cellId, mergeSha, tree] = process.argv.slice(2);
163
+ if (!version || !cellId || !mergeSha || !tree) {
164
+ console.error('usage: bun scripts/train/green-leg.ts <version> <cell-id> <landed-merge-sha> <test-tree>');
165
+ process.exitCode = 2;
166
+ } else {
167
+ try {
168
+ const result = await runGreenLeg({ version, cellId, mergeSha, tree }, defaultGreenLegDeps);
169
+ console.log(JSON.stringify({ passed: result.passed, results: result.results }, null, 2));
170
+ if (!result.passed) process.exitCode = 1;
171
+ } catch (error) {
172
+ console.error(error instanceof Error ? error.message : String(error));
173
+ process.exitCode = 1;
174
+ }
175
+ }
176
+ }
@@ -0,0 +1,47 @@
1
+ // 실물 증거: 생산 모듈(src/index.ts)이 쓰는 실제 세션 저장소에서 --continue 해석을 잰다.
2
+ // 픽스처 없음 — createProject/createSession 으로 진짜 스토어에 두 프로젝트·세션을 만든 뒤,
3
+ // 프로덕션 함수 latestSessionIdForContinue 를 호출해 "cwd 최근 세션" 이 이기는지 본다.
4
+ //
5
+ // bun scripts/tui-continue-real-evidence.ts
6
+ import { mkdirSync, mkdtempSync } from 'node:fs';
7
+ import { tmpdir } from 'node:os';
8
+ import { join } from 'node:path';
9
+
10
+ const root = mkdtempSync(join(tmpdir(), 'eln-continue-evidence-'));
11
+ process.env.ELANOUS_STATE_DIR = join(root, 'state');
12
+ process.env.ELANOUS_CONFIG_DIR = join(root, 'config');
13
+
14
+ const cwdA = join(root, 'projA');
15
+ const cwdB = join(root, 'projB');
16
+ mkdirSync(join(cwdA, 'nested'), { recursive: true });
17
+ mkdirSync(cwdB, { recursive: true });
18
+
19
+ const { createProject } = await import('../src/project/project-store');
20
+ const { createSession } = await import('../src/session/index');
21
+ const { latestSessionIdForContinue } = await import('../src/index');
22
+
23
+ const projectA = createProject({ name: 'evidence-A', primaryFolder: cwdA });
24
+ const projectB = createProject({ name: 'evidence-B', primaryFolder: cwdB });
25
+
26
+ const sessionA = createSession({ projectId: projectA.id, source: 'cli', title: 'A turn' });
27
+ await new Promise((resolve) => setTimeout(resolve, 20));
28
+ const sessionB = createSession({ projectId: projectB.id, source: 'cli', title: 'B turn' });
29
+
30
+ const fromNested = latestSessionIdForContinue(join(cwdA, 'nested'));
31
+ const fromNoProject = latestSessionIdForContinue(join(root, 'unassigned'));
32
+
33
+ console.log(JSON.stringify({
34
+ store: root,
35
+ globalNewest: sessionB.id,
36
+ pickedFromCwdA: fromNested,
37
+ pickedIsSessionA: fromNested === sessionA.id,
38
+ pickedIsGlobalNewest: fromNested === sessionB.id,
39
+ pickedFromUnassignedCwd: fromNoProject,
40
+ unassignedFallsBackToGlobal: fromNoProject === sessionB.id,
41
+ }, null, 2));
42
+
43
+ if (fromNested !== sessionA.id || fromNoProject !== sessionB.id) {
44
+ console.error('FAIL: --continue resolution did not follow cwd project');
45
+ process.exit(1);
46
+ }
47
+ console.log('PASS: --continue picks the cwd project session, falls back to global newest elsewhere');
package/scripts/ux-sim.ts CHANGED
@@ -69,7 +69,7 @@ if (argv[0] === 'emit') {
69
69
  }
70
70
 
71
71
  // ── N03 키 순서열 (TUI-NEXT E4) — 진짜 PTY 에 next TUI 를 fake LLM 으로 띄워 단계별 화면 ⊕ 격리 우주 logs ──
72
- // bun scripts/ux-sim.ts seat-seq <next-new-session|next-compact|next-queue|next-wakeup|next-paste|next-goal-continue|next-goal-interim|next-proactive-continue|classic-400-heal|classic-400-exhausted|classic-seat-boot|classic-typing-lag|classic-wakeup|classic-paste|classic-goal-continue|classic-goal-interim|classic-orphan-autostop> --root <빈 폴더> [--installed | --executable <bun> --entry <elanous.mjs>] [--expect-sha <sha256>] [--json]
72
+ // bun scripts/ux-sim.ts seat-seq <next-new-session|next-compact|next-queue|next-wakeup|next-paste|next-at-picker|next-goal-continue|next-goal-interim|next-proactive-continue|classic-400-heal|classic-400-exhausted|classic-seat-boot|classic-typing-lag|classic-wakeup|classic-paste|classic-goal-continue|classic-goal-interim|classic-orphan-autostop> --root <빈 폴더> [--installed | --executable <bun> --entry <elanous.mjs>] [--expect-sha <sha256>] [--json]
73
73
  // 기본 실행 = 이 트리 bin/elanous.mjs ⊕ 이 bun. --installed = ~/.local/share/elanous/current 의 elanous.mjs.
74
74
  // rc: 0 = 모든 checks 참 · 1 = 거짓이 있다 · 2 = 인자 오류
75
75
  if (argv[0] === 'seat-seq') {
package/src/acp/client.ts CHANGED
@@ -43,6 +43,7 @@ import { grokApiKeyEnvName } from './grok-auth-probe.js';
43
43
  import { grokAuthHint, isGrokAuthError } from './grok-auth.js';
44
44
  import { providerEnvKey } from '../llm/provider-credentials.js';
45
45
  import { getUserConfig } from '../user-config.js';
46
+ import { createAcpStderrSummarizer } from './stderr-summary.js';
46
47
  import {
47
48
  AcpForkSessionUnsupportedError,
48
49
  AcpListSessionsUnsupportedError,
@@ -548,16 +549,41 @@ export class AcpAgent {
548
549
  });
549
550
  await spawned;
550
551
 
551
- // Stderr from the agent is opaque text — log it so the operator
552
- // sees errors from the subprocess (auth, network, etc.) without
553
- // having to attach a debugger.
552
+ // Keep raw diagnostics in the debug log and coalesce the UI warning.
553
+ const stderrSummary = createAcpStderrSummarizer(({ kind, count }) => {
554
+ this.log(`stderr: ${kind} (${count}건)`);
555
+ });
556
+ const maxPendingStderrChars = 8 * 1024;
557
+ let pendingStderr = '';
558
+ const recordStderrLine = (line: string): void => {
559
+ const clean = line.trim();
560
+ if (!clean) return;
561
+ const redacted = redactSecretText(clean);
562
+ debug.log('acp.stderr', 'line', { backendId: this.spec.id, line: redacted });
563
+ stderrSummary.push(redacted);
564
+ };
554
565
  child.stderr.setEncoding('utf-8');
555
566
  child.stderr.on('data', (chunk: string) => {
556
- for (const line of chunk.split('\n')) {
557
- if (line.trim()) this.log(`stderr: ${line}`);
567
+ const lines = `${pendingStderr}${chunk}`.split('\n');
568
+ pendingStderr = lines.pop() ?? '';
569
+ for (const line of lines) recordStderrLine(line);
570
+ while (pendingStderr.length > maxPendingStderrChars) {
571
+ recordStderrLine(`${pendingStderr.slice(0, maxPendingStderrChars)} [continued]`);
572
+ pendingStderr = pendingStderr.slice(maxPendingStderrChars);
558
573
  }
559
574
  });
575
+ child.stderr.once('end', () => {
576
+ recordStderrLine(pendingStderr);
577
+ pendingStderr = '';
578
+ stderrSummary.flush();
579
+ });
580
+ child.stderr.once('error', () => {
581
+ recordStderrLine(pendingStderr);
582
+ pendingStderr = '';
583
+ stderrSummary.flush();
584
+ });
560
585
  child.on('exit', (code, signal) => {
586
+ stderrSummary.flush();
561
587
  this.log(`subprocess exited (code=${code}, signal=${signal})`);
562
588
  this.proc = null;
563
589
  this.connection = null;
@@ -429,6 +429,12 @@ export function bridgeCoreTurnToAcp(
429
429
  ...(maxToolTurns !== undefined ? { maxToolTurns } : {}),
430
430
  ...((!factQuestion || explicitMaxToolTurns !== undefined) && deps.budgetGrant !== undefined ? { budgetGrant: deps.budgetGrant } : {}),
431
431
  callbacks: {
432
+ onGoalInterim: (text) => {
433
+ void turnCtx.pushSessionUpdate(
434
+ { sessionUpdate: 'agent_message_chunk', content: { type: 'text', text: '' } },
435
+ { goalInterim: text },
436
+ );
437
+ },
432
438
  onText: (delta, full) => {
433
439
  // ⛔ 검증 보충이 붙은 최종 답의 재방출(`onText('', 답+보충)`)은 흘리지 않는다 — 빈 청크를 TUI 는
434
440
  // «확정(commit)»으로 읽어 이미 그린 답을 굳히고, 아래 onTurnComplete 재표면화가 같은 답을
@@ -0,0 +1,49 @@
1
+ export interface AcpStderrSummary {
2
+ kind: string;
3
+ count: number;
4
+ }
5
+
6
+ const MAX_KINDS_PER_WINDOW = 8;
7
+ const OTHER_KIND = 'other stderr messages';
8
+
9
+ function classify(line: string): string {
10
+ const clean = line.replace(/\u001b\[[0-?]*[ -/]*[@-~]/g, '').trim();
11
+ if (/Skipping MCP tool\b/i.test(clean)) {
12
+ return clean
13
+ .replace(/\bserver=\S+/gi, 'server=*')
14
+ .replace(/\btool=\S+/gi, 'tool=*')
15
+ .replace(/tool name .+? is invalid/i, 'tool name <name> is invalid')
16
+ .slice(0, 240);
17
+ }
18
+ return clean.slice(0, 240);
19
+ }
20
+
21
+ /** Collect stderr into bounded, one-second UI summaries while callers retain raw lines in debug logs. */
22
+ export function createAcpStderrSummarizer(
23
+ report: (summary: AcpStderrSummary) => void,
24
+ intervalMs = 1_000,
25
+ ): { push(line: string): void; flush(): void } {
26
+ const pending = new Map<string, number>();
27
+ let timer: ReturnType<typeof setTimeout> | undefined;
28
+
29
+ const flush = (): void => {
30
+ if (timer) clearTimeout(timer);
31
+ timer = undefined;
32
+ for (const [kind, count] of pending) report({ kind, count });
33
+ pending.clear();
34
+ };
35
+
36
+ return {
37
+ push(line): void {
38
+ const kind = classify(line);
39
+ if (!kind) return;
40
+ const key = pending.has(kind) || pending.size < MAX_KINDS_PER_WINDOW ? kind : OTHER_KIND;
41
+ pending.set(key, (pending.get(key) ?? 0) + 1);
42
+ if (!timer) {
43
+ timer = setTimeout(flush, intervalMs);
44
+ timer.unref?.();
45
+ }
46
+ },
47
+ flush,
48
+ };
49
+ }
@@ -172,6 +172,7 @@ export function makeElanousAgentRunTurn(cfg: UserConfig, surface: SessionSource,
172
172
  provider: cfg.llm.provider,
173
173
  configuredModel: cfg.llm.model,
174
174
  text: opts.userText,
175
+ surface,
175
176
  explicitModel: llmOpts?.model,
176
177
  routePolicy: cfg.llm.routePolicy,
177
178
  });