elanous 0.2.35 → 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 (827) 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/{T1mBQqmkwKDLGtyisDCOd → 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/{9952.5daf5f94063a2b3e.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/1746.3563617ea64023a3.js +115 -0
  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/{1dc5a567.9b092bfae3d7099b.js → 1ed5e8af.cf424815c7c0efad.js} +1 -1
  16. package/apps/pwa/out/_next/static/chunks/{4705-194e64e47ca0fbdb.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/{13.02a07436dec15f89.js → 210.90b2cbd64926cf34.js} +1 -1
  19. package/apps/pwa/out/_next/static/chunks/{9512.5a76207a730e0491.js → 2283.edd9627b7bdfb546.js} +2 -2
  20. package/apps/pwa/out/_next/static/chunks/{6866-79aa5b4e47cac6aa.js → 2318-450e75d07605b8fe.js} +1 -1
  21. package/apps/pwa/out/_next/static/chunks/{938.66ad1ef0e5abae1c.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/3199.6a1a9b0e6cd01dc6.js +1 -0
  33. package/apps/pwa/out/_next/static/chunks/3212.12179fd3eee8cef1.js +1 -0
  34. package/apps/pwa/out/_next/static/chunks/{9214.63a510d39178e997.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/{2018.a741297bce759490.js → 4313.76f232c304a15bde.js} +1 -1
  43. package/apps/pwa/out/_next/static/chunks/{1165.bad13fc9151a7288.js → 4324.c99ba3e83eb1b691.js} +1 -1
  44. package/apps/pwa/out/_next/static/chunks/{3f7c4ee5.3dde54f01a816613.js → 4337e36d.f42c3b391b3d8f20.js} +1 -1
  45. package/apps/pwa/out/_next/static/chunks/{7385.50a308a477bdfc21.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/{8557-e7898769499cd56f.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/{5483-dd5d7697f6bdb106.js → 4833-7934c592c5569f00.js} +1 -1
  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/{8444.4c26b379ca2b9596.js → 4931.95cc6dbd230774ca.js} +17 -17
  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/{3408.21d1570602f4b6c0.js → 5046.7fd5cbd859299448.js} +1 -1
  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/58edce7d.f1b0c72acf13b123.js +1 -0
  64. package/apps/pwa/out/_next/static/chunks/5925.3b1f8b135710249b.js +93 -0
  65. package/apps/pwa/out/_next/static/chunks/5952.294fc574a8625184.js +1 -0
  66. package/apps/pwa/out/_next/static/chunks/{b6705a4f-b9a9047de9eecfd0.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/6252.240578f10952e091.js +34 -0
  69. package/apps/pwa/out/_next/static/chunks/6416.5d50b8ec9986ca98.js +1 -0
  70. package/apps/pwa/out/_next/static/chunks/{5101.e32282718f99ed6f.js → 6680.6a693c28aae4cd19.js} +1 -1
  71. package/apps/pwa/out/_next/static/chunks/{4718-17d2af636796a330.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/{6236.e18cced2d5ba6afb.js → 6819.be5c9c4d67f22922.js} +16 -16
  75. package/apps/pwa/out/_next/static/chunks/6877-84d47b7e85d0c41e.js +1 -0
  76. package/apps/pwa/out/_next/static/chunks/{2833-0fe47af99ed13c29.js → 6971-fb5f9dc0a2cb5d2d.js} +1 -1
  77. package/apps/pwa/out/_next/static/chunks/{da5176c6.6773b6c5994e1d99.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/7424.c0fe2a595d4232b5.js +23 -0
  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/{7644.17e37ba6f1d4226e.js → 7867.e8725745ddd1d940.js} +4 -4
  93. package/apps/pwa/out/_next/static/chunks/7893-e444a1b0809cd1e4.js +1 -0
  94. package/apps/pwa/out/_next/static/chunks/7956-33748cabb3a05562.js +1 -0
  95. package/apps/pwa/out/_next/static/chunks/{0368f25d-ad84af92fefee68f.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/{359-2250789a2d3499e7.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/{b2f6ba4d.fb56fdbbf798df33.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/{1530.0e612369b6fd7ea0.js → 9151.a2c51e93f9156dae.js} +1 -1
  112. package/apps/pwa/out/_next/static/chunks/{4441-875b97f5821ed58a.js → 9175-7d383df15a82e2be.js} +1 -1
  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/958.53a8dcf4729e6997.js +64 -0
  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-3337c6a1328c2674.js +1 -0
  144. package/apps/pwa/out/_next/static/chunks/app/live-run/page-89acd5d68c0bc560.js +1 -0
  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-fe986fe79b107546.js +1 -0
  148. package/apps/pwa/out/_next/static/chunks/app/morning/{page-47c5d4db587266bd.js → page-1e5da297557d2354.js} +1 -1
  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-1f5a60f70cb4dd0c.js → page-88a1edbff62eaf1d.js} +1 -1
  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-bac7dee94e5eae4a.js → page-443364c9e4a23b31.js} +1 -1
  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-dc0a532f5b9196ec.js → page-ac2c1e6169cfce57.js} +1 -1
  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/{d06f9160.a3d9062f95de8ad7.js → d9815f84.4918f682a45a8502.js} +1 -1
  176. package/apps/pwa/out/_next/static/chunks/{cbe38a15.5a032598e39970c6.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/docs/goal-context/05-authoring-lessons.jsonl +47 -0
  279. package/docs/goal-context/README.md +3 -0
  280. package/graphs/default-loop.yaml +6 -1
  281. package/graphs/drafts/recipes.yaml +27 -7
  282. package/graphs/implement-loop.yaml +24 -0
  283. package/graphs/release/recipes.yaml +6 -0
  284. package/graphs/release/release-loop.yaml +17 -4
  285. package/graphs/wizard/recipes.yaml +44 -0
  286. package/graphs/wizard/wizard-loop.yaml +44 -0
  287. package/graphs/work/draft-close.yaml +54 -0
  288. package/graphs/work/green-close.yaml +37 -0
  289. package/graphs/work/recipes.yaml +46 -1
  290. package/graphs/work/research-report.yaml +2 -0
  291. package/graphs/work/run-research.yaml +35 -0
  292. package/package.json +1 -1
  293. package/scripts/__fixtures__/authoring-paths-10x3.json +32 -0
  294. package/scripts/boundary-proof-mapping-audit.ts +88 -0
  295. package/scripts/ci-typecheck-changed.ts +139 -5
  296. package/scripts/codex-fallback-live-probe.ts +17 -15
  297. package/scripts/coord-role-pack.ts +1 -1
  298. package/scripts/first10-gate.ts +416 -0
  299. package/scripts/fleet/node-setup.sh +32 -2
  300. package/scripts/fleet/run-light-worker.sh +9 -0
  301. package/scripts/fleet/wsl-node-setup.sh +432 -0
  302. package/scripts/gate-0226-failure-census.ts +507 -0
  303. package/scripts/goals/authoring-metrics.ts +258 -0
  304. package/scripts/graph-units/draft-close-node.ts +222 -0
  305. package/scripts/hook-order-sweep.ts +7 -4
  306. package/scripts/land-global-checks.ts +69 -1
  307. package/scripts/measure-nl-routing-corpus.ts +207 -2
  308. package/scripts/release-loop/docs-node.ts +344 -8
  309. package/scripts/release-loop/gate-closure.ts +48 -0
  310. package/scripts/release-loop/gate-diff.ts +2 -1
  311. package/scripts/release-loop/gate-node.ts +249 -53
  312. package/scripts/release-loop/known-issues-node.ts +6 -4
  313. package/scripts/release-loop/node-verdict.ts +2 -0
  314. package/scripts/release-loop/notes-repair.ts +216 -0
  315. package/scripts/release-loop/prepare-node.ts +61 -5
  316. package/scripts/release-loop/resume-cap.ts +14 -34
  317. package/scripts/release-loop/resume-release.ts +151 -15
  318. package/scripts/release-loop/resume-test-traffic.ts +10 -0
  319. package/scripts/release-loop/traffic-node.ts +59 -0
  320. package/scripts/release-loop/traffic-transition.ts +159 -0
  321. package/scripts/release-loop/version-node.ts +81 -12
  322. package/scripts/rhythm/daily.ts +137 -3
  323. package/scripts/train/green-leg.ts +176 -0
  324. package/scripts/tui-continue-real-evidence.ts +47 -0
  325. package/scripts/ux-sim.ts +53 -0
  326. package/skills/README.md +1 -0
  327. package/src/acp/client.ts +31 -5
  328. package/src/acp/core-turn-bridge.ts +54 -6
  329. package/src/acp/stderr-summary.ts +49 -0
  330. package/src/agent/delegate-hint.ts +16 -0
  331. package/src/agent/monad-agent-turn.ts +1 -0
  332. package/src/agent/runner.ts +82 -2
  333. package/src/agent/task-notification.ts +56 -10
  334. package/src/agent/terminal-surface.ts +217 -0
  335. package/src/agent/types.ts +4 -0
  336. package/src/agent-substrate/pr-reviewer.ts +64 -4
  337. package/src/agent-substrate/review-intent.ts +29 -2
  338. package/src/agent-substrate/review-observation.ts +3 -0
  339. package/src/agent-substrate/self-review-cli.ts +490 -26
  340. package/src/autopilot/lineage/sources.ts +1 -1
  341. package/src/autopilot/mission-codebase-gate.ts +141 -12
  342. package/src/autopilot/pr-manager.ts +89 -18
  343. package/src/boot/daemon-runtime.ts +35 -3
  344. package/src/boot/daemon-tools/pty-shell.ts +2 -1
  345. package/src/boot/daemon-tools/self-implement.ts +1 -0
  346. package/src/budget/run-usage-rollup.ts +12 -7
  347. package/src/budget/unified-usage.ts +20 -0
  348. package/src/budget/usage-outcomes.ts +8 -4
  349. package/src/capture/tui-self-report.ts +132 -1
  350. package/src/chat/goal-continue-verdict.ts +41 -0
  351. package/src/chat/index.ts +30 -4
  352. package/src/chat/internal-turn-origin.ts +1 -0
  353. package/src/chat/paste-fold.ts +86 -0
  354. package/src/chat/tool-render/block.ts +32 -0
  355. package/src/chat/tool-render/dispatch.ts +2 -20
  356. package/src/chat/tool-render/result-text.ts +98 -0
  357. package/src/chat/turn-typeahead.ts +70 -7
  358. package/src/cli/autopilot-cli.ts +24 -9
  359. package/src/cli/config-audit.ts +119 -0
  360. package/src/cli/decisions-cli.ts +7 -4
  361. package/src/cli/doctor-cli.ts +137 -6
  362. package/src/cli/guardian-cli.ts +10 -0
  363. package/src/cli/herdr-cli.ts +34 -0
  364. package/src/cli/light-entry-route.ts +6 -3
  365. package/src/cli/log-event-names.ts +2 -0
  366. package/src/cli/logs-cli.ts +357 -2
  367. package/src/cli/make-cli.ts +247 -11
  368. package/src/cli/memory-cli.ts +30 -1
  369. package/src/cli/msg-cli.ts +132 -14
  370. package/src/cli/pr-cli.ts +29 -16
  371. package/src/cli/pr-granularity.ts +5 -3
  372. package/src/cli/pr-land-base-read.ts +11 -2
  373. package/src/cli/pr-land-heavy-remote.ts +6 -3
  374. package/src/cli/pr-land-overlap-evidence.ts +23 -4
  375. package/src/cli/pr-land-recovery.ts +117 -1
  376. package/src/cli/pty-takeover-cli.ts +8 -7
  377. package/src/cli/release-checklist-read-cli.ts +109 -4
  378. package/src/cli/release-cli.ts +64 -15
  379. package/src/cli/release-single-flight.ts +1 -1
  380. package/src/cli/self-update.ts +23 -5
  381. package/src/cli/self-utterances-cli.ts +13 -16
  382. package/src/cli/tasks-card-show.ts +162 -0
  383. package/src/cli/tasks-cli.ts +868 -352
  384. package/src/cli/tasks-read-cli.ts +197 -0
  385. package/src/cli/usage-cli.ts +12 -10
  386. package/src/context-bus/claude-memory-import.ts +99 -0
  387. package/src/context-bus/long-term-memory.ts +125 -0
  388. package/src/core-turn/run-core-turn.ts +4 -2
  389. package/src/core-turn/run-goal-loop.ts +76 -16
  390. package/src/core-turn/types.ts +8 -1
  391. package/src/dashboard/chat/acp-chat.ts +9 -0
  392. package/src/dashboard/context/keys.ts +8 -31
  393. package/src/dashboard/index.ts +299 -62
  394. package/src/dashboard/input/agent-wake.ts +50 -1
  395. package/src/dashboard/input/chat-main-acp-dispatch.ts +21 -1
  396. package/src/dashboard/input/chat-main-plain-turn-runtime.ts +146 -3
  397. package/src/dashboard/input/chat-main-slash-command.ts +4 -2
  398. package/src/dashboard/input/goal-continue.ts +210 -0
  399. package/src/dashboard/input/goal-interim.ts +2 -0
  400. package/src/dashboard/input/internal-turn.ts +2 -8
  401. package/src/dashboard/input/seat-autowake.ts +9 -7
  402. package/src/dashboard/input/turn-autoheal.ts +52 -0
  403. package/src/dashboard/replay-preview.ts +25 -0
  404. package/src/dashboard/seat-boot-preamble.ts +132 -5
  405. package/src/dashboard/slash-runtime/chat-persona.ts +65 -8
  406. package/src/dashboard/slash-runtime/dashboard-handlers.ts +20 -10
  407. package/src/dashboard/slash-runtime/model-choices.ts +15 -0
  408. package/src/dashboard/stale-install-check.ts +3 -99
  409. package/src/dashboard/synchronized-frame-output.ts +74 -0
  410. package/src/debug/batch-queue.ts +119 -0
  411. package/src/debug/tui-log-tag.ts +67 -0
  412. package/src/display/agent-surface.ts +7 -0
  413. package/src/display/coordinator.ts +45 -12
  414. package/src/display/resize-listener.ts +41 -20
  415. package/src/display/synchronized-output-region.ts +60 -0
  416. package/src/domains/standalone-log-sink.ts +15 -2
  417. package/src/domains/surface-events.ts +80 -1
  418. package/src/esc-abort-gate.ts +69 -0
  419. package/src/exec-requests/planner.ts +37 -2
  420. package/src/execution-loop/launch-gate.ts +4 -3
  421. package/src/git-fs/cli-stderr.ts +45 -0
  422. package/src/git-fs/gh-cli.ts +6 -3
  423. package/src/git-fs/git-cli.ts +11 -5
  424. package/src/git-fs/worktree.ts +95 -1
  425. package/src/graph-runner/graph-cli.ts +44 -2
  426. package/src/graph-runner/graph-run-api.ts +3 -2
  427. package/src/graph-runner/runner.ts +37 -16
  428. package/src/graph-wizard/generate.ts +131 -4
  429. package/src/graph-wizard/steps.ts +15 -0
  430. package/src/grounding/proactive-ground.ts +86 -0
  431. package/src/harness/control-inbox.ts +49 -1
  432. package/src/harness/harness-cli-command.ts +230 -40
  433. package/src/harness/harness-incidents.ts +52 -1
  434. package/src/harness/pod-control-send.ts +33 -5
  435. package/src/harness/review-adapter.ts +26 -6
  436. package/src/harness/self-send-remote.ts +69 -0
  437. package/src/harness/self-send-routing-guard.ts +6 -0
  438. package/src/harness/self-send-target.ts +4 -3
  439. package/src/index.ts +443 -25
  440. package/src/input-core/context-key-runtime.ts +21 -0
  441. package/src/instance/test-write-guard-real-transport.fixture.ts +52 -0
  442. package/src/light-cli.ts +6 -1
  443. package/src/llm/route-decision.ts +13 -0
  444. package/src/llm-tool-name.ts +37 -0
  445. package/src/llm-tool-schema.ts +35 -0
  446. package/src/llm-wellformed.ts +70 -0
  447. package/src/llm.ts +158 -15
  448. package/src/loops/checker.ts +100 -0
  449. package/src/loops/consensus.ts +26 -2
  450. package/src/loops/loop-cli.ts +9 -4
  451. package/src/loops/msg-wake.ts +35 -39
  452. package/src/loops/orchestrator/anomaly-cluster.ts +243 -0
  453. package/src/loops/orchestrator/inbox.ts +59 -11
  454. package/src/loops/orchestrator/knowhow-pack.ts +364 -0
  455. package/src/loops/orchestrator/tick.ts +54 -5
  456. package/src/maturity/feature-maturity.ts +1 -1
  457. package/src/model-tier/llm-tier-map.ts +12 -17
  458. package/src/models/prompts.ts +17 -2
  459. package/src/msg/msg-post-office.ts +116 -0
  460. package/src/msg/msg-store.ts +17 -0
  461. package/src/mss/logging/log-store.ts +79 -22
  462. package/src/native-tool-catalog.ts +1 -1
  463. package/src/nexus/api/decisions-route.ts +38 -18
  464. package/src/nexus/api/graph-wizard-api.ts +46 -3
  465. package/src/nexus/api/grid.ts +24 -4
  466. package/src/nexus/api/http-server.ts +1 -1
  467. package/src/nexus/api/ops-api.ts +14 -6
  468. package/src/nexus/boot/register-mcp-clients.ts +263 -38
  469. package/src/nexus/onboarding/first-boot-wizard.ts +56 -8
  470. package/src/nexus/state/state.ts +7 -1
  471. package/src/oauth/codex-account-store.ts +34 -1
  472. package/src/onboarding/first-run.ts +37 -6
  473. package/src/onboarding/web-first.ts +43 -11
  474. package/src/ops/loops-map.ts +46 -0
  475. package/src/ops/overview-cache.ts +22 -4
  476. package/src/ops/overview-collect.ts +12 -6
  477. package/src/ops/overview.ts +44 -8
  478. package/src/persona/loader.ts +11 -0
  479. package/src/persona/types.ts +8 -0
  480. package/src/policy/llm-policy.ts +3 -1
  481. package/src/prompt-enhance/enhance.ts +4 -4
  482. package/src/prompt-library/session-guidance.ts +14 -0
  483. package/src/provider-summary.ts +8 -0
  484. package/src/pty-shell/availability.ts +7 -0
  485. package/src/pty-shell/herdr-agent-report.ts +155 -37
  486. package/src/pty-shell/herdr-prompt.ts +266 -0
  487. package/src/pty-shell/herdr-prune-stale.ts +17 -0
  488. package/src/pty-shell/herdr-sequence-lease.ts +60 -0
  489. package/src/pty-shell/pty-control-ipc.ts +327 -15
  490. package/src/pty-shell/pty-special-keys.ts +42 -2
  491. package/src/pty-shell/registry.ts +25 -15
  492. package/src/pty-shell/stale-install-check.ts +99 -0
  493. package/src/pty-shell/tui-run-state.ts +249 -3
  494. package/src/release-loop/auto-start.ts +20 -2
  495. package/src/release-loop/checklist.ts +126 -9
  496. package/src/release-loop/feature-store.ts +9 -9
  497. package/src/release-loop/landed-but-yellow.ts +93 -12
  498. package/src/release-loop/rehearsal.ts +36 -20
  499. package/src/repl/index.ts +27 -1
  500. package/src/seat-loop/knowhow-lint.ts +1 -1
  501. package/src/seat-loop/seat-report.ts +1 -0
  502. package/src/self-dev/ask-launch-flow.ts +86 -10
  503. package/src/self-dev/decompose-proposal.ts +183 -20
  504. package/src/self-dev/decompose.ts +61 -0
  505. package/src/self-dev/dev-cli.ts +37 -3
  506. package/src/self-dev/dev-pipeline.ts +37 -9
  507. package/src/self-dev/draft-sweep.ts +241 -16
  508. package/src/self-dev/draft-triage-rules.ts +50 -5
  509. package/src/self-dev/glm-credential-guard.ts +77 -0
  510. package/src/self-dev/graph-journey-nodes.ts +1 -0
  511. package/src/self-dev/graph-journey-route.ts +12 -2
  512. package/src/self-dev/orchestrate-cli.ts +68 -3
  513. package/src/self-dev/orchestrate.ts +116 -17
  514. package/src/self-dev/review-provider-fallback.ts +45 -7
  515. package/src/self-dev/run-supervisor.ts +55 -2
  516. package/src/self-dev/run-types.ts +1 -1
  517. package/src/self-dev/shard-plan.ts +48 -0
  518. package/src/self-dev/shard-run.ts +50 -3
  519. package/src/self-health/autoheal.ts +153 -0
  520. package/src/self-health/signatures.ts +6 -0
  521. package/src/self-implement/device-first.ts +116 -0
  522. package/src/self-implement/doctor-visit.ts +322 -1
  523. package/src/self-implement/evidence-command-budget.ts +80 -0
  524. package/src/self-implement/gate-artifacts.ts +6 -2
  525. package/src/self-implement/gate-baseline.ts +64 -1
  526. package/src/self-implement/gate-cli.ts +93 -9
  527. package/src/self-implement/gate-remote.ts +28 -4
  528. package/src/self-implement/gate-scope.ts +13 -1
  529. package/src/self-implement/goal-author-cli.ts +1 -0
  530. package/src/self-implement/goal-author-decompose.ts +265 -4
  531. package/src/self-implement/goal-author.ts +366 -26
  532. package/src/self-implement/goal-elaborate.ts +176 -22
  533. package/src/self-implement/goal-refine.ts +3 -0
  534. package/src/self-implement/goal-supervisor-fill.ts +75 -26
  535. package/src/self-implement/graph-variant.ts +40 -6
  536. package/src/self-implement/headless-elanous-driver.ts +19 -3
  537. package/src/self-implement/importer-test-index.ts +215 -2
  538. package/src/self-implement/knowhow-pack.ts +5 -5
  539. package/src/self-implement/off-diff-evidence.ts +58 -6
  540. package/src/self-implement/orchestrator.ts +536 -42
  541. package/src/self-implement/pod-warm-pool-profile.ts +1 -0
  542. package/src/self-implement/pwa-import-graph.ts +1 -1
  543. package/src/self-implement/review-round-brief.ts +300 -0
  544. package/src/self-implement/rework-policy.ts +44 -0
  545. package/src/self-implement/run-ledger.ts +278 -6
  546. package/src/self-implement/run-stop.ts +1 -1
  547. package/src/self-implement/run-ttl.ts +38 -24
  548. package/src/self-implement/running-runs.ts +17 -3
  549. package/src/self-implement/scope-adjacency.ts +3 -1
  550. package/src/self-implement/seams.ts +72 -10
  551. package/src/self-implement/stop-autoheal.ts +1 -0
  552. package/src/self-implement/test-seams.ts +13 -1
  553. package/src/self-implement/train-reach-grouping.ts +8 -2
  554. package/src/self-implement/wiring-check.ts +358 -0
  555. package/src/session/chat.ts +7 -1
  556. package/src/session/id-prefix.ts +60 -0
  557. package/src/session/index.ts +4 -0
  558. package/src/session-runtime/index.ts +9 -1
  559. package/src/shell-env-bootstrap.ts +11 -4
  560. package/src/skills/runner.ts +4 -2
  561. package/src/skills/tools/agent.ts +290 -48
  562. package/src/skills/tools/pty.ts +5 -0
  563. package/src/skills/tools/schedule-wakeup.ts +23 -4
  564. package/src/skills/tools/shell.ts +61 -6
  565. package/src/skills/tools/terminal-modal-inject.ts +1 -2
  566. package/src/skills/tools/terminal-modal.ts +10 -8
  567. package/src/skills/url-router.ts +41 -1
  568. package/src/smart-wizard/run.ts +66 -0
  569. package/src/status/bar.ts +34 -6
  570. package/src/status/metrics.ts +12 -1
  571. package/src/status/status-provider-info.ts +37 -6
  572. package/src/steward/rejudge-tick.ts +22 -7
  573. package/src/steward/resync-tick.ts +31 -4
  574. package/src/steward/ta-repair-event-collect.ts +17 -6
  575. package/src/task-agent/actions.ts +202 -5
  576. package/src/task-agent/boundary-proof-mapping.ts +12 -0
  577. package/src/task-agent/boundary-proof-producer.ts +147 -0
  578. package/src/task-agent/completion-evidence.ts +2 -1
  579. package/src/task-agent/green-close-recipe.ts +239 -0
  580. package/src/task-agent/green-sweep.ts +64 -10
  581. package/src/task-agent/land-queue.ts +21 -8
  582. package/src/task-agent/live-moves.ts +70 -9
  583. package/src/task-agent/map-host-adapter.ts +134 -0
  584. package/src/task-agent/map-reduce.ts +158 -0
  585. package/src/task-agent/map-run-ledger.ts +226 -0
  586. package/src/task-agent/mission.ts +30 -0
  587. package/src/task-agent/parent-host.ts +21 -11
  588. package/src/task-agent/rejudge-on-head.ts +87 -5
  589. package/src/task-agent/repair-cycle.ts +179 -32
  590. package/src/task-agent/repair-next-move.ts +42 -4
  591. package/src/task-agent/repair-outcomes.ts +29 -0
  592. package/src/task-agent/repair-worker.ts +14 -4
  593. package/src/task-agent/review-prior-fix.ts +12 -2
  594. package/src/task-agent/shadow.ts +229 -8
  595. package/src/task-agent/task-card-prefix.ts +2 -0
  596. package/src/task-agent/task-hand.ts +630 -30
  597. package/src/task-agent/task-parent-role-llm.ts +45 -0
  598. package/src/task-agent/tier-split.ts +80 -10
  599. package/src/task-agent/work-order.ts +53 -2
  600. package/src/task-orchestrator/dispatcher.ts +46 -1
  601. package/src/task-orchestrator/generator-prompt.ts +6 -0
  602. package/src/task-orchestrator/surfaces/pod-account-broker.ts +9 -0
  603. package/src/task-orchestrator/surfaces/pod-artifact-return.ts +16 -6
  604. package/src/task-orchestrator/surfaces/pod-child-reuse.ts +146 -0
  605. package/src/task-orchestrator/surfaces/pod-command-job.ts +86 -5
  606. package/src/task-orchestrator/surfaces/pod-failure-reason.ts +215 -3
  607. package/src/task-orchestrator/surfaces/pod-launch-history.ts +133 -0
  608. package/src/task-orchestrator/surfaces/pod-ledger-collect.ts +8 -6
  609. package/src/task-orchestrator/surfaces/pod-ledger-events.ts +97 -0
  610. package/src/task-orchestrator/surfaces/pod-manifest-test-normalize.ts +11 -0
  611. package/src/task-orchestrator/surfaces/pod-pool.ts +126 -8
  612. package/src/task-orchestrator/surfaces/pod-provenance.ts +8 -2
  613. package/src/task-orchestrator/surfaces/pod-repair-commit.ts +18 -3
  614. package/src/task-orchestrator/surfaces/pod-si-warm-entry.ts +16 -0
  615. package/src/task-orchestrator/surfaces/pod-si-warm-host.ts +224 -0
  616. package/src/task-orchestrator/surfaces/pod-si-warm-protocol.ts +201 -0
  617. package/src/task-orchestrator/surfaces/pod-si-warm-provider.ts +444 -0
  618. package/src/task-orchestrator/surfaces/pod-si-warm-runner.ts +387 -0
  619. package/src/task-orchestrator/surfaces/pod-si-warm-transport.ts +157 -0
  620. package/src/task-orchestrator/surfaces/pod-warm-worker-protocol.ts +4 -0
  621. package/src/task-orchestrator/surfaces/pod-warm-worker-provider.ts +491 -36
  622. package/src/task-orchestrator/surfaces/pod-warm-worker-runtime.ts +3 -0
  623. package/src/task-orchestrator/surfaces/self-implement-pod.ts +612 -54
  624. package/src/task-orchestrator/surfaces/self-implement.ts +46 -2
  625. package/src/testing/linux-env.ts +177 -0
  626. package/src/tool-runtime/index.ts +15 -2
  627. package/src/tool-runtime/mcp-proxy-bootstrap.ts +29 -0
  628. package/src/tty-foreground.ts +155 -0
  629. package/src/tui/chat/goal-interim.ts +177 -0
  630. package/src/tui/chat/log-view.ts +205 -18
  631. package/src/tui/chat/self-health-status.ts +232 -0
  632. package/src/tui/entry.ts +623 -80
  633. package/src/tui/input/at-picker.ts +55 -0
  634. package/src/tui/input/composer.ts +8 -1
  635. package/src/tui/slash/compact-command.ts +7 -0
  636. package/src/tui/slash/compact.ts +1 -7
  637. package/src/tui/slash/resume.ts +98 -0
  638. package/src/tui/slash/signals.ts +114 -0
  639. package/src/tui/slash/term-next.ts +71 -0
  640. package/src/tui-client/local-chat-turn.ts +49 -5
  641. package/src/tui-client/next-dashboard-runtime.ts +8 -0
  642. package/src/tui-client/next-loop-command.ts +70 -0
  643. package/src/tui-client/next-wakeup.ts +191 -0
  644. package/src/tui.ts +37 -0
  645. package/src/ui/modal-adapter.ts +2 -2
  646. package/src/user-config.ts +19 -1
  647. package/src/ux-sim/boot-daemon-tools-pty-shell-device.ts +136 -0
  648. package/src/ux-sim/classic-tui-seat-scenarios.ts +670 -0
  649. package/src/ux-sim/cli-config-audit-device.ts +121 -0
  650. package/src/ux-sim/dashboard-event-loop-stall-monitor-device.ts +238 -0
  651. package/src/ux-sim/event-monkey.ts +3 -2
  652. package/src/ux-sim/fake-bin.ts +45 -0
  653. package/src/ux-sim/fake-gh.ts +174 -0
  654. package/src/ux-sim/fake-herdr.ts +238 -0
  655. package/src/ux-sim/fake-kubectl.ts +142 -0
  656. package/src/ux-sim/fake-llm.ts +116 -6
  657. package/src/ux-sim/fault-glm-no-credential.ts +116 -0
  658. package/src/ux-sim/fault-nextmove-dispatch.ts +102 -1
  659. package/src/ux-sim/fault-scope-escape-lift.ts +33 -6
  660. package/src/ux-sim/fault-tui-400-autoheal.ts +297 -0
  661. package/src/ux-sim/goal-device.ts +619 -0
  662. package/src/ux-sim/in-process-cli.ts +22 -5
  663. package/src/ux-sim/mock-authoring-first-run-child.ts +35 -0
  664. package/src/ux-sim/mock-authoring-first-run.ts +97 -0
  665. package/src/ux-sim/mock-seat-pty-frame-child.ts +29 -0
  666. package/src/ux-sim/mock-seat-pty-frame.ts +297 -0
  667. package/src/ux-sim/mock-seat-pty-sequence-child.ts +21 -0
  668. package/src/ux-sim/mock-seat-pty-sequence.ts +206 -0
  669. package/src/ux-sim/next-tui-seat-scenarios.ts +749 -0
  670. package/src/ux-sim/onboarding-first-run-device.ts +269 -0
  671. package/src/ux-sim/pty-key-modifiers-device.ts +85 -0
  672. package/src/ux-sim/resume-picker-device.ts +173 -0
  673. package/src/ux-sim/session-id-seed.ts +60 -0
  674. package/src/ux-sim/skills-tools-shell-device.ts +156 -0
  675. package/src/ux-sim/subagent-tools-device.ts +81 -0
  676. package/src/ux-sim/task-agent-parent-host-device.ts +264 -0
  677. package/src/ux-sim/task-agent-rejudge-on-head-device.ts +114 -0
  678. package/src/ux-sim/task-orchestrator-surfaces-self-implement-pod-device.ts +250 -0
  679. package/src/ux-sim/tty-foreground-steal-child.ts +21 -0
  680. package/src/version/packed-revision.json +1 -1
  681. package/apps/pwa/out/_next/static/chunks/1540.af38731fa7c4a3e0.js +0 -41
  682. package/apps/pwa/out/_next/static/chunks/1674.2a65fd5668e1cc5f.js +0 -1
  683. package/apps/pwa/out/_next/static/chunks/1850.f2b470ba5a471da0.js +0 -24
  684. package/apps/pwa/out/_next/static/chunks/193.62da94cd0b88323b.js +0 -74
  685. package/apps/pwa/out/_next/static/chunks/1975.260f6d249fac5f7c.js +0 -1
  686. package/apps/pwa/out/_next/static/chunks/1982-67cd8dfe8682325f.js +0 -1
  687. package/apps/pwa/out/_next/static/chunks/1993-c0007b7ad0c0ef41.js +0 -1
  688. package/apps/pwa/out/_next/static/chunks/1999-bb415351c8a2846c.js +0 -1
  689. package/apps/pwa/out/_next/static/chunks/1c735de4.f993a30bbd3c57c4.js +0 -1
  690. package/apps/pwa/out/_next/static/chunks/2085.8f950b4bda1cbbc7.js +0 -1
  691. package/apps/pwa/out/_next/static/chunks/2159-6179a961376956b9.js +0 -1
  692. package/apps/pwa/out/_next/static/chunks/216.b5c2a421aa1d28a5.js +0 -1
  693. package/apps/pwa/out/_next/static/chunks/2251.49fbe369f74c372c.js +0 -148
  694. package/apps/pwa/out/_next/static/chunks/2286-2939577360d3dcc0.js +0 -1
  695. package/apps/pwa/out/_next/static/chunks/2625.5d870aa999f33db1.js +0 -34
  696. package/apps/pwa/out/_next/static/chunks/2668.34d21539e62bf111.js +0 -77
  697. package/apps/pwa/out/_next/static/chunks/2930.d0edb4f108787ef7.js +0 -1
  698. package/apps/pwa/out/_next/static/chunks/2973.77318e7d85f59477.js +0 -62
  699. package/apps/pwa/out/_next/static/chunks/3103.0df8da390948bb84.js +0 -1
  700. package/apps/pwa/out/_next/static/chunks/3123.2bee9ba15d320bd2.js +0 -90
  701. package/apps/pwa/out/_next/static/chunks/3162-6cf652bf7124d8cf.js +0 -1
  702. package/apps/pwa/out/_next/static/chunks/3577-7340009f7007a795.js +0 -1
  703. package/apps/pwa/out/_next/static/chunks/3589.5444a06bcf6e775c.js +0 -1
  704. package/apps/pwa/out/_next/static/chunks/3618.f514792d6c59d7fd.js +0 -36
  705. package/apps/pwa/out/_next/static/chunks/3669.343f9119aa276001.js +0 -1
  706. package/apps/pwa/out/_next/static/chunks/3677-4215f826f6aa68e5.js +0 -1
  707. package/apps/pwa/out/_next/static/chunks/3736.c2efad489604cc3b.js +0 -79
  708. package/apps/pwa/out/_next/static/chunks/3817.f9aeab2bb6675d73.js +0 -1
  709. package/apps/pwa/out/_next/static/chunks/4182-0b9b1251c29cc0cf.js +0 -1
  710. package/apps/pwa/out/_next/static/chunks/4346.8601952e73bf5803.js +0 -1
  711. package/apps/pwa/out/_next/static/chunks/4582.bd68683c076649e3.js +0 -286
  712. package/apps/pwa/out/_next/static/chunks/4605-6e623f55aec77422.js +0 -1
  713. package/apps/pwa/out/_next/static/chunks/4607.5cc27468628eb4bf.js +0 -1
  714. package/apps/pwa/out/_next/static/chunks/4627.f07508b3936fd6c0.js +0 -24
  715. package/apps/pwa/out/_next/static/chunks/4747-c22262c093e46807.js +0 -1
  716. package/apps/pwa/out/_next/static/chunks/4775-178215aed0daba61.js +0 -1
  717. package/apps/pwa/out/_next/static/chunks/4815-6ffb8c3c991cc45d.js +0 -1
  718. package/apps/pwa/out/_next/static/chunks/4834-beca8b47ad29a898.js +0 -1
  719. package/apps/pwa/out/_next/static/chunks/5023-fb4802b6d2492b02.js +0 -1
  720. package/apps/pwa/out/_next/static/chunks/5154.a118f3957ed14e36.js +0 -1
  721. package/apps/pwa/out/_next/static/chunks/5210-a2e0015e3d4d5d9c.js +0 -1
  722. package/apps/pwa/out/_next/static/chunks/5356.84ac712cc15928bf.js +0 -1
  723. package/apps/pwa/out/_next/static/chunks/5401.22352141b6fd336e.js +0 -23
  724. package/apps/pwa/out/_next/static/chunks/5637.281e5dec4ea6ecf1.js +0 -94
  725. package/apps/pwa/out/_next/static/chunks/5662.02eaa029af05ad46.js +0 -1
  726. package/apps/pwa/out/_next/static/chunks/56d372f2.681ab4ec4c998fae.js +0 -1
  727. package/apps/pwa/out/_next/static/chunks/5760.22456f433c6f42c0.js +0 -1
  728. package/apps/pwa/out/_next/static/chunks/5852.db1f7449f4f74612.js +0 -287
  729. package/apps/pwa/out/_next/static/chunks/5891-0f11a7d7362a9072.js +0 -1
  730. package/apps/pwa/out/_next/static/chunks/5943.264d14a44ca32513.js +0 -1
  731. package/apps/pwa/out/_next/static/chunks/604-1b3c39df083c02aa.js +0 -1
  732. package/apps/pwa/out/_next/static/chunks/6121-5f97072330738caf.js +0 -1
  733. package/apps/pwa/out/_next/static/chunks/6193.07d8ca5af4b09086.js +0 -1
  734. package/apps/pwa/out/_next/static/chunks/6203-b3fea3a60d69ff14.js +0 -1
  735. package/apps/pwa/out/_next/static/chunks/6286.d638fb5953e2e757.js +0 -8
  736. package/apps/pwa/out/_next/static/chunks/630.fe5a46428d63b013.js +0 -1
  737. package/apps/pwa/out/_next/static/chunks/6301.ae0245f507e4395e.js +0 -1
  738. package/apps/pwa/out/_next/static/chunks/6673.fbbe5699f6ea5991.js +0 -27
  739. package/apps/pwa/out/_next/static/chunks/6777-f6d301efb5de828d.js +0 -1
  740. package/apps/pwa/out/_next/static/chunks/6786.423f24c88de034c7.js +0 -93
  741. package/apps/pwa/out/_next/static/chunks/6854-cef64a948c5e122d.js +0 -1
  742. package/apps/pwa/out/_next/static/chunks/6b89c8bd.24df687a820500b3.js +0 -1
  743. package/apps/pwa/out/_next/static/chunks/7037-fe27f001db30d323.js +0 -1
  744. package/apps/pwa/out/_next/static/chunks/7080.2d826860534fd88e.js +0 -1
  745. package/apps/pwa/out/_next/static/chunks/7118.8731be28c3ebb14b.js +0 -1
  746. package/apps/pwa/out/_next/static/chunks/7196.44241bc1df3e26fe.js +0 -149
  747. package/apps/pwa/out/_next/static/chunks/7235.c7c4e6cb5c693c2d.js +0 -104
  748. package/apps/pwa/out/_next/static/chunks/7706-58bfb1546637f217.js +0 -1
  749. package/apps/pwa/out/_next/static/chunks/7839.5b91455338c9fd3f.js +0 -1
  750. package/apps/pwa/out/_next/static/chunks/7857-31f13ee96f4011aa.js +0 -1
  751. package/apps/pwa/out/_next/static/chunks/81.f74cb60312fe4001.js +0 -1
  752. package/apps/pwa/out/_next/static/chunks/8219.baa715d1deee80e2.js +0 -1
  753. package/apps/pwa/out/_next/static/chunks/8256.e3ac8421a71f82f4.js +0 -1
  754. package/apps/pwa/out/_next/static/chunks/8310-444a6a895c402f12.js +0 -1
  755. package/apps/pwa/out/_next/static/chunks/8423.f7dda8aca4fcaae5.js +0 -1
  756. package/apps/pwa/out/_next/static/chunks/8437-8d5492094b166cfa.js +0 -1
  757. package/apps/pwa/out/_next/static/chunks/8496.75649af8652c74f4.js +0 -226
  758. package/apps/pwa/out/_next/static/chunks/8576.65bb654b524f3614.js +0 -1
  759. package/apps/pwa/out/_next/static/chunks/8609.558ce2f8f9aea2be.js +0 -64
  760. package/apps/pwa/out/_next/static/chunks/8614.caec96cfb91f4ae7.js +0 -1
  761. package/apps/pwa/out/_next/static/chunks/8637.47f5b35afcae5e6b.js +0 -1
  762. package/apps/pwa/out/_next/static/chunks/8714.ff0b7ce3ec3e3ae2.js +0 -1
  763. package/apps/pwa/out/_next/static/chunks/8732.367f44a916202353.js +0 -1
  764. package/apps/pwa/out/_next/static/chunks/9141-7fd1f73a5400bdc2.js +0 -1
  765. package/apps/pwa/out/_next/static/chunks/921.c4267d0d69a65404.js +0 -1
  766. package/apps/pwa/out/_next/static/chunks/9261.3962c3321b047691.js +0 -115
  767. package/apps/pwa/out/_next/static/chunks/936-26efd1a0efdd44d3.js +0 -1
  768. package/apps/pwa/out/_next/static/chunks/9627-4b9efe616b27e2e2.js +0 -1
  769. package/apps/pwa/out/_next/static/chunks/967-2aa39b2d04b4c690.js +0 -1
  770. package/apps/pwa/out/_next/static/chunks/9734.40eb1e558c29ccea.js +0 -1
  771. package/apps/pwa/out/_next/static/chunks/9908.3aa54f7a586a73dc.js +0 -1
  772. package/apps/pwa/out/_next/static/chunks/9954-ca8d29752bdbb45a.js +0 -1
  773. package/apps/pwa/out/_next/static/chunks/9974-507fa67cb94066dd.js +0 -1
  774. package/apps/pwa/out/_next/static/chunks/app/_not-found/page-ce9e00f7fb45506a.js +0 -1
  775. package/apps/pwa/out/_next/static/chunks/app/approvals/page-fa59d6d17daa3389.js +0 -1
  776. package/apps/pwa/out/_next/static/chunks/app/autopilot/page-53f68bbe7bd4b774.js +0 -1
  777. package/apps/pwa/out/_next/static/chunks/app/board/page-1c500fbb9f4a7a04.js +0 -1
  778. package/apps/pwa/out/_next/static/chunks/app/botlab/page-99d72673aa5c307c.js +0 -1
  779. package/apps/pwa/out/_next/static/chunks/app/bots/page-d2d5adc1e9484c88.js +0 -1
  780. package/apps/pwa/out/_next/static/chunks/app/ceo/page-c607c5aae637f1cc.js +0 -1
  781. package/apps/pwa/out/_next/static/chunks/app/chat/page-fa8c23596d555c0f.js +0 -1
  782. package/apps/pwa/out/_next/static/chunks/app/consult/page-bdab8c5e855c8416.js +0 -1
  783. package/apps/pwa/out/_next/static/chunks/app/control/page-406b47745b53f269.js +0 -1
  784. package/apps/pwa/out/_next/static/chunks/app/decisions/page-a4276386b7051f50.js +0 -1
  785. package/apps/pwa/out/_next/static/chunks/app/design-check/page-8a26bab9ad375f25.js +0 -1
  786. package/apps/pwa/out/_next/static/chunks/app/editor/page-775f48aa1dc7a2d5.js +0 -1
  787. package/apps/pwa/out/_next/static/chunks/app/exec/page-1c4dd5f959d0c558.js +0 -1
  788. package/apps/pwa/out/_next/static/chunks/app/field/page-c48938a8377c9f70.js +0 -1
  789. package/apps/pwa/out/_next/static/chunks/app/healthz/route-ce9e00f7fb45506a.js +0 -1
  790. package/apps/pwa/out/_next/static/chunks/app/inside/page-c6e7905859425aa9.js +0 -1
  791. package/apps/pwa/out/_next/static/chunks/app/intake/page-c280f4252452e830.js +0 -1
  792. package/apps/pwa/out/_next/static/chunks/app/layout-cf8c57498f20970a.js +0 -1
  793. package/apps/pwa/out/_next/static/chunks/app/live/page-ca3a17caf409fc83.js +0 -1
  794. package/apps/pwa/out/_next/static/chunks/app/live-run/page-26e6c18a1a750cf6.js +0 -1
  795. package/apps/pwa/out/_next/static/chunks/app/loops/page-3abc872cc6aeee39.js +0 -1
  796. package/apps/pwa/out/_next/static/chunks/app/market/page-f7481b7b2174fe3d.js +0 -1
  797. package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-1ae7ef8077680337.js +0 -1
  798. package/apps/pwa/out/_next/static/chunks/app/not-found-415f1e243c7ccb13.js +0 -1
  799. package/apps/pwa/out/_next/static/chunks/app/observatory/page-73f380f17b76f95c.js +0 -1
  800. package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-2991073ad66ee2d9.js +0 -1
  801. package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-fbad60d1e358fb2c.js +0 -1
  802. package/apps/pwa/out/_next/static/chunks/app/page-398047d6949e8ca5.js +0 -1
  803. package/apps/pwa/out/_next/static/chunks/app/reflection/page-2d33a2231540ca89.js +0 -1
  804. package/apps/pwa/out/_next/static/chunks/app/scheduler/page-5bf1e6bf70bcb96c.js +0 -1
  805. package/apps/pwa/out/_next/static/chunks/app/sessions/page-ba59c19376a0917d.js +0 -1
  806. package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-111f187139add30f.js +0 -1
  807. package/apps/pwa/out/_next/static/chunks/app/settings/page-acaae197d5be5779.js +0 -1
  808. package/apps/pwa/out/_next/static/chunks/app/setup/done/page-0df20b0f546a0d7d.js +0 -1
  809. package/apps/pwa/out/_next/static/chunks/app/setup/layout-ce9e00f7fb45506a.js +0 -1
  810. package/apps/pwa/out/_next/static/chunks/app/setup/page-27e1202d24b8fe35.js +0 -1
  811. package/apps/pwa/out/_next/static/chunks/app/share/page-bda78c50a78363e5.js +0 -1
  812. package/apps/pwa/out/_next/static/chunks/app/showroom/page-da592691293d9c9f.js +0 -1
  813. package/apps/pwa/out/_next/static/chunks/app/tasks/page-f832994317a2e9f0.js +0 -1
  814. package/apps/pwa/out/_next/static/chunks/app/today/page-cfccbbeae0473404.js +0 -1
  815. package/apps/pwa/out/_next/static/chunks/app/trace/page-527e2073af84c81b.js +0 -1
  816. package/apps/pwa/out/_next/static/chunks/app/vault/page-bac86e9112671357.js +0 -1
  817. package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-6d59dff410e9d76a.js +0 -1
  818. package/apps/pwa/out/_next/static/chunks/app/workflows/page-53a61f8be09f02d2.js +0 -1
  819. package/apps/pwa/out/_next/static/chunks/app/workspace/page-db8f559e763c17f9.js +0 -1
  820. package/apps/pwa/out/_next/static/chunks/app/worktrees/page-c02aa4cc66455093.js +0 -1
  821. package/apps/pwa/out/_next/static/chunks/framework-50e6acebc630849b.js +0 -1
  822. package/apps/pwa/out/_next/static/chunks/main-7a1ae342d5ed75e6.js +0 -1
  823. package/apps/pwa/out/_next/static/chunks/main-app-7ad7d505ba1f92b4.js +0 -1
  824. package/apps/pwa/out/_next/static/chunks/pages/_app-02edba75232cb235.js +0 -1
  825. package/apps/pwa/out/_next/static/chunks/pages/_error-97d6ebae3e8eee4a.js +0 -1
  826. package/apps/pwa/out/_next/static/chunks/webpack-e986adaa429163e8.js +0 -1
  827. /package/apps/pwa/out/_next/static/{T1mBQqmkwKDLGtyisDCOd → 8kITumG9GAZ1LwT9POrAR}/_ssgManifest.js +0 -0
package/src/index.ts CHANGED
@@ -241,6 +241,10 @@ const registerReleaseCommands = (INDEX_FAST_ROOT && INDEX_FAST_ROOT !== 'release
241
241
  const registerFreezeCommands = (INDEX_FAST_ROOT && INDEX_FAST_ROOT !== 'freeze'
242
242
  ? (() => undefined)
243
243
  : (require('./cli/freeze-cli.js') as typeof import('./cli/freeze-cli.js')).registerFreezeCommands) as typeof import('./cli/freeze-cli.js').registerFreezeCommands;
244
+ // TUI-HERDR-NAMED-AGENT (10-22): `herdr prompt` — herdr agent prompt rejects custom-reported agents.
245
+ const registerHerdrCommands = (INDEX_FAST_ROOT && INDEX_FAST_ROOT !== '__full__'
246
+ ? (() => undefined)
247
+ : (require('./cli/herdr-cli.js') as typeof import('./cli/herdr-cli.js')).registerHerdrCommands) as typeof import('./cli/herdr-cli.js').registerHerdrCommands;
244
248
  const registerFlowCommands = (INDEX_FAST_ROOT && INDEX_FAST_ROOT !== 'flow'
245
249
  ? (() => undefined)
246
250
  : (require('./cli/flow-cli.js') as typeof import('./cli/flow-cli.js')).registerFlowCommands) as typeof import('./cli/flow-cli.js').registerFlowCommands;
@@ -439,6 +443,7 @@ program.command('preview <target>')
439
443
  export { SELF_SEND_RECENT_FRAME_WINDOW_MS, SELF_SEND_STALE_HEARTBEAT_MS, formatSelfSendCandidateDisplay } from './harness/self-send-decide.js';
440
444
  export type { SelfSendCandidate, SelfSendCandidateDisplay } from './harness/self-send-decide.js';
441
445
  import { decideSelfSend, type SelfSendCandidate } from './harness/self-send-decide.js';
446
+ import { mayLookupRemotePodRun } from './harness/self-send-routing-guard.js';
442
447
  type RunDevAskBuildDevCliSpec = typeof import('./self-dev/dev-cli.js')['buildDevCliSpec'];
443
448
  type RunDevAskExecuteDevSelfRun = typeof import('./self-dev/dev-cli.js')['executeDevSelfRun'];
444
449
  type RunDevAskStartDraftTriage = typeof import('./self-dev/dev-cli.js')['startDraftTriage'];
@@ -1250,6 +1255,7 @@ registerKnowCommand(program);
1250
1255
  registerNotifyCommand(program);
1251
1256
  registerAwayCommand(program);
1252
1257
  registerFreezeCommands(program);
1258
+ registerHerdrCommands(program);
1253
1259
  registerFlowCommands(program);
1254
1260
  // HQ-HB · HQ-FENCE (10-04): one writer across mbp · node-b · cloud-vm — lease on the arbiter, 2-of-3 quorum, generation fencing.
1255
1261
  const hqCmd = program.command('hq').description('본부 임대 — 하트비트·중재·단일 작성자 래퍼');
@@ -3913,8 +3919,11 @@ selfCmd
3913
3919
  .option('--json', '한 줄에 한 항목으로 재직렬화해 출력한다(원문 공백·빈 줄은 보존되지 않는다)')
3914
3920
  .option('--all', 'logs와 같은 전 인스턴스 연합 원장 조회를 한다')
3915
3921
  .option('--include-test', '--all 연합에 격리 test 인스턴스도 포함한다')
3916
- .action(async (runId: string, opts: { json?: boolean; all?: boolean; includeTest?: boolean }) => {
3917
- const { describeFederatedMissingRunLedger, describeMissingRunLedger, lookupRunLedger, renderRunLedger } = await import('./self-implement/run-ledger.js');
3922
+ // ⛔⭐ 합성 exit 를 «쓰지» 않고 enter/exit/orphan 만 대조한다 — 원장을 읽기만 하는 분류다.
3923
+ // 중단된 런이 exit 없이 남긴 graph.unit 방문을 «완료»로 오해하지 않게 CLI 에서 직접 잰다.
3924
+ .option('--unit-visits', 'graph.unit enter/exit/orphan 대조만 출력한다(원장은 읽기만 한다)')
3925
+ .action(async (runId: string, opts: { json?: boolean; all?: boolean; includeTest?: boolean; unitVisits?: boolean }) => {
3926
+ const { classifyGraphUnitVisits, describeFederatedMissingRunLedger, describeMissingRunLedger, lookupRunLedger, renderRunLedger } = await import('./self-implement/run-ledger.js');
3918
3927
  try {
3919
3928
  const lookup = lookupRunLedger(runId, { all: opts.all, ...(opts.includeTest === undefined ? {} : { includeTest: opts.includeTest }) });
3920
3929
  if (lookup.matches.length === 0) {
@@ -3941,6 +3950,18 @@ selfCmd
3941
3950
  const match = lookup.matches[0]!;
3942
3951
  if (opts.json && match.skippedTrailingBytes !== undefined) console.error(`skipped incomplete trailing run ledger line: ${match.skippedTrailingBytes} bytes`);
3943
3952
  if (opts.all && !opts.json) console.log(`run ledger found in universe: ${match.targetName ?? 'current'} (${match.ledgerDirectory})`);
3953
+ if (opts.unitVisits) {
3954
+ const classification = classifyGraphUnitVisits(match.entries);
3955
+ if (opts.json) {
3956
+ await writeStdoutJson(JSON.stringify(classification) + '\n');
3957
+ return;
3958
+ }
3959
+ console.log(`graph.unit enter=${classification.enterCount} exit=${classification.exitCount} orphan=${classification.orphanCount}`);
3960
+ for (const visit of classification.orphanUnitVisits) {
3961
+ console.log(`orphan unit=${visit.unit ?? '-'} node=${visit.nodeId ?? '-'} childRunId=${visit.childRunId ?? '-'} enteredAt=${visit.enteredAt ?? '-'}`);
3962
+ }
3963
+ return;
3964
+ }
3944
3965
  if (opts.json) await writeStdoutJson(match.entries.map((entry) => JSON.stringify(entry)).join('\n') + '\n');
3945
3966
  else console.log(renderRunLedger(match.entries));
3946
3967
  } catch (error) {
@@ -4195,12 +4216,17 @@ selfCmd
4195
4216
  selfCmd
4196
4217
  .command('running-runs')
4197
4218
  .description('원장과 살아 있는 PTY를 함께 읽어 현재 자율 런 판정을 출력한다')
4219
+ .argument('[runId]', '같은 ID로 단일 런의 원본 완료 결과(kind·reason·next)를 재조회한다 (생략 시 전체)')
4198
4220
  .option('--json', '구조화된 JSON으로 출력한다')
4199
4221
  .option('--include-test', '연합 관측에 격리 test 인스턴스도 포함한다')
4200
- .action(async (opts: { json?: boolean; includeTest?: boolean }) => {
4222
+ .action(async (runId: string | undefined, opts: { json?: boolean; includeTest?: boolean }) => {
4201
4223
  try {
4202
4224
  const { queryRunningRuns, renderRunningRuns } = await import('./self-implement/running-runs.js');
4203
- const result = queryRunningRuns({ includeTest: opts.includeTest, caller: 'cli' });
4225
+ const result = queryRunningRuns({
4226
+ includeTest: opts.includeTest,
4227
+ caller: 'cli',
4228
+ ...(runId === undefined ? {} : { runIds: [runId] }),
4229
+ });
4204
4230
  const output = `${opts.json ? JSON.stringify(result) : renderRunningRuns(result)}\n`;
4205
4231
  await writeStdoutJson(output);
4206
4232
  } catch (error) {
@@ -4455,6 +4481,9 @@ selfCmd
4455
4481
  try {
4456
4482
  const { runGoalAuthorCli, formatGoalAuthorSelfInspection, formatGoalInterviewRound } = await import('./self-implement/goal-author-cli.js');
4457
4483
  // 설정 졸업 1-c(2026-09-26): 되묻기 자동 답변은 늘 켠다 — `harness ask/say` 와 같은 동작(옵션 없음).
4484
+ // Production self author → runGoalAuthorCli → writeAuthoredGoal → tracedPathsSection:
4485
+ // missing traced paths are corrected or skipped; a required correction ledger write
4486
+ // failure propagates through this call to the error handler instead of reporting success.
4458
4487
  const result = await runGoalAuthorCli(parts, { ...opts, selfResolveClarifications: true });
4459
4488
  console.log(result.path);
4460
4489
  // ⭐ grounding 상태를 함께 알린다 — 이 장치의 알려진 약점이 여기서 드러나야 한다.
@@ -4712,10 +4741,17 @@ selfCmd
4712
4741
  .option('--remote [host]', 'GATE-REMOTE — 같은 커밋을 원격 호스트(기본 config gateRemote.host=node-b)에서 돌리고 결과만 가져온다(깨끗한 트리 · --pr 은 로컬)')
4713
4742
  .option('--local', '원격 실행을 끄고 명시적으로 로컬에서 돌린다')
4714
4743
  .option('--artifact-dir <dir>', '조각별 지금/기준 JUnit ⊕ summary.json 을 이 디렉토리에 남긴다(판정 불변 · JUnit 은 --shards 경로만 · 원격 실행이면 그 호스트에서 가져온다)')
4715
- .action(async (opts: { changed?: boolean; base?: string; pr?: string; shards?: string | boolean; fixedShardDistribution?: boolean; includeImporters?: boolean; remote?: string | boolean; local?: boolean; artifactDir?: string }) => {
4744
+ .option('--orchestration-id <id>', 'GATE-REMOTE-SHARD-PLAN — 조각 오케스트레이션 id. --shard-id · --shard-position 와 세벌 세트로만 쓰고 원격 명령줄에 그대로 실린다')
4745
+ .option('--shard-id <id>', 'GATE-REMOTE-SHARD-PLAN — 조각 id(예: <orchestration-id>/shard-2). 원격 명령줄에 그대로 실린다')
4746
+ .option('--shard-position <n>', 'GATE-REMOTE-SHARD-PLAN — 조각 위치(1부터 정수). 원격 명령줄에 그대로 실린다')
4747
+ .option('--shard-plan <path>', 'GATE-REMOTE-SHARD-PLAN — 조각 계획 파일 경로. 주면 원격 명령줄에 --shard-plan 으로 실린다')
4748
+ .action(async (opts: { changed?: boolean; base?: string; pr?: string; shards?: string | boolean; fixedShardDistribution?: boolean; includeImporters?: boolean; remote?: string | boolean; local?: boolean; artifactDir?: string; orchestrationId?: string; shardId?: string; shardPosition?: string; shardPlan?: string }) => {
4716
4749
  if (!opts.changed && opts.shards === undefined) { ui.error('self gate requires --changed or --shards'); process.exitCode = 2; return; }
4717
4750
  if (opts.fixedShardDistribution && opts.shards === undefined) { ui.error('self gate: --fixed-shard-distribution requires --shards <n>'); process.exitCode = 2; return; }
4718
4751
  if (opts.artifactDir !== undefined && !opts.artifactDir.trim()) { ui.error('self gate: --artifact-dir needs a non-empty directory'); process.exitCode = 2; return; }
4752
+ const shardIdentityFlags = [opts.orchestrationId, opts.shardId, opts.shardPosition].filter((value) => value !== undefined).length;
4753
+ if (shardIdentityFlags !== 0 && shardIdentityFlags !== 3) { ui.error('self gate: --orchestration-id, --shard-id and --shard-position are used as a set'); process.exitCode = 2; return; }
4754
+ if (opts.shardPosition !== undefined && !/^[1-9]\d*$/.test(opts.shardPosition)) { ui.error('self gate: --shard-position needs a positive integer'); process.exitCode = 2; return; }
4719
4755
  // The root strips `--local` from argv anywhere (remote-bookmark attach · src/cli/remote-resolve.ts) before Commander
4720
4756
  // sees it, so this subcommand reads it from the untouched process.argv.
4721
4757
  opts.local = !!opts.local || process.argv.slice(2).includes('--local');
@@ -4760,12 +4796,23 @@ selfCmd
4760
4796
  remoteArtifacts = remoteCommitSupportsArtifactDir(repo) ? { dir: newRemoteArtifactDir() } : { unsupported: true };
4761
4797
  }
4762
4798
  // origin/main is pinned to this machine's origin/main on the host; any other base is passed as its resolved sha.
4763
- const remoteArgv = (sha: (ref: string) => string) => remoteSelfGateArgv({
4764
- changed: opts.changed, base: opts.base, shards, fixedShardDistribution: opts.fixedShardDistribution,
4765
- includeImporters: opts.includeImporters,
4766
- // A measured commit without this option rejects it (exit ≠ 0) — read as not passed, never as a silent measured run.
4767
- artifactDir: remoteArtifacts && 'dir' in remoteArtifacts ? remoteArtifacts.dir : undefined,
4768
- }, sha);
4799
+ const remoteArgv = (sha: (ref: string) => string) => {
4800
+ const argv = remoteSelfGateArgv({
4801
+ changed: opts.changed, base: opts.base, shards, fixedShardDistribution: opts.fixedShardDistribution,
4802
+ includeImporters: opts.includeImporters,
4803
+ // A measured commit without this option rejects it (exit ≠ 0) — read as not passed, never as a silent measured run.
4804
+ artifactDir: remoteArtifacts && 'dir' in remoteArtifacts ? remoteArtifacts.dir : undefined,
4805
+ }, sha);
4806
+ // GATE-REMOTE-SHARD-PLAN — the shard identity rides the remote command line so each host run is attributable to its
4807
+ // shard. A measured commit without these options rejects them (exit ≠ 0): unmeasured, never a silent pass.
4808
+ if (opts.orchestrationId === undefined) return argv;
4809
+ const { remoteShardArgArgs } = require('./self-dev/shard-run.js') as typeof import('./self-dev/shard-run.js');
4810
+ return [...argv, ...remoteShardArgArgs({
4811
+ orchestrationId: opts.orchestrationId, shardId: opts.shardId!,
4812
+ totalShards: typeof shards === 'number' && Number.isSafeInteger(shards) && shards >= 1 ? shards : 1,
4813
+ position: Number(opts.shardPosition),
4814
+ }, { planFile: opts.shardPlan })];
4815
+ };
4769
4816
  const { gateHostReservationRoot } = await import('./release-loop/gate-host-reservation.js');
4770
4817
  process.exitCode = await dispatchHeavyCheck({
4771
4818
  tool: 'self-gate', repo, installPwa: true, remoteArgv, refs: opts.base ? [opts.base] : [], reservationRoot: gateHostReservationRoot(),
@@ -5205,7 +5252,7 @@ const selfOrchestrateCmd = selfCmd
5205
5252
  let podSpawn: import('./task-orchestrator/surfaces/self-implement.js').SelfImplementJobSpawn | undefined;
5206
5253
  let podTargets: { context: string; namespace: string }[] | undefined;
5207
5254
  if (substrate === 'pod') {
5208
- const { podSelfImplementSpawn, podSubstrateReady, defaultKubectl } = await import('./task-orchestrator/surfaces/self-implement-pod.js');
5255
+ const { podSubstrateReady, defaultKubectl } = await import('./task-orchestrator/surfaces/self-implement-pod.js');
5209
5256
  const poolMod = await import('./task-orchestrator/surfaces/pod-pool.js');
5210
5257
  const { harnessLaunchPolicyConfig } = await import('./harness/harness-substrate-default.js');
5211
5258
  const launchPolicy = harnessLaunchPolicyConfig();
@@ -5580,7 +5627,8 @@ const selfOrchestrateCmd = selfCmd
5580
5627
  const { benchPodSpawn } = await import('./task-orchestrator/surfaces/self-implement-pod.js');
5581
5628
  podSpawn = benchPodSpawn(benchArms, podBase);
5582
5629
  } else {
5583
- podSpawn = podSelfImplementSpawn(podBase);
5630
+ podSpawn = await (await import('./task-orchestrator/surfaces/pod-si-warm-entry.js'))
5631
+ .podSpawnWithSiWarm(podBase);
5584
5632
  }
5585
5633
  podTargets = poolMembers.length > 0
5586
5634
  ? poolMembers.map(({ context }) => ({ context, namespace: 'elanous-test' }))
@@ -5854,6 +5902,34 @@ selfCmd
5854
5902
  .option('--include-stale', '모호한 대상 목록에 오래된 마지막 프레임 후보도 표시')
5855
5903
  .option('--read-wait <seconds>', '--memo·--stop 뒤 자식이 읽을 때까지 기다리는 최대 초(0 = 기다리지 않음)', '10')
5856
5904
  .action(async (space: string | undefined, opts: { stop?: boolean; memo?: string; run?: string; includeStale?: boolean; readWait?: string }) => {
5905
+ let remoteLookupFailure = '';
5906
+ let remoteChildUnconfirmed = false;
5907
+ // A TA parent lives on its recorded host. Its Pod fragment and control inbox are
5908
+ // deliberately absent from HQ state, so a local screen lookup cannot route it.
5909
+ if (opts.run !== undefined && space === undefined && mayLookupRemotePodRun(process.env)) {
5910
+ const { findRemotePodCardForRun, remotePodControlForOptions, RemotePodOwnershipAmbiguousError, sendRemotePodRun } = await import('./harness/self-send-remote.js');
5911
+ let card: ReturnType<typeof findRemotePodCardForRun>['card'] = null;
5912
+ try {
5913
+ ({ card, remoteChildUnconfirmed } = findRemotePodCardForRun(opts.run));
5914
+ } catch (error) {
5915
+ if (error instanceof RemotePodOwnershipAmbiguousError) {
5916
+ process.stderr.write(`${error.message}\n`);
5917
+ process.exit(1);
5918
+ }
5919
+ remoteLookupFailure = error instanceof Error ? error.message : String(error);
5920
+ }
5921
+ if (card) {
5922
+ try {
5923
+ const result = sendRemotePodRun(card, opts.run, remotePodControlForOptions(opts));
5924
+ if (result.stderr) process.stderr.write(result.stderr);
5925
+ process.stdout.write(result.stdout);
5926
+ return;
5927
+ } catch (error) {
5928
+ process.stderr.write(`${error instanceof Error ? error.message : String(error)}\n`);
5929
+ process.exit(1);
5930
+ }
5931
+ }
5932
+ }
5857
5933
  const { classifyRunScreenMissing, queryRunScreenKey, listRunLedgers } = await import('./self-implement/run-ledger.js');
5858
5934
  const { getPtyManifest, listPtyManifestRows } = await import('./pty-shell/pty-manifest.js');
5859
5935
  const { readPodFragment, podFragmentFinished, listPodFragmentsForRun, dispatchPodSelfSend, resolveSelfSendTarget } = await import('./harness/self-send-target.js');
@@ -5887,6 +5963,8 @@ selfCmd
5887
5963
  });
5888
5964
  if (decision.kind === 'refuse') {
5889
5965
  process.stderr.write(decision.message);
5966
+ if (remoteLookupFailure) process.stderr.write(`원격 TA 카드 조회 실패: ${remoteLookupFailure}\n`);
5967
+ else if (remoteChildUnconfirmed) process.stderr.write(`원격 Pod 자식 소유 미확인: ${opts.run}의 카드 연결은 HQ 미러에서 확인되지 않았습니다. 활성 원격 카드 하나에 자식 ID가 없으므로 그 카드의 부모 runId 또는 미러 동기화를 확인하세요.\n`);
5890
5968
  process.exit(decision.exitCode);
5891
5969
  }
5892
5970
  const target = decision.spaceId;
@@ -5897,9 +5975,18 @@ selfCmd
5897
5975
  if (hasMemo) {
5898
5976
  if (!opts.memo || /[\r\n]/.test(opts.memo)) throw new Error('control inbox memo must be a non-empty single line');
5899
5977
  const urgent = opts.memo.startsWith('[urgent] ');
5900
- dispatchPodSelfSend(target, { memo: { version: 1, kind: 'supervisor', urgency: urgent ? 'urgent' : 'normal', body: urgent ? opts.memo.slice('[urgent] '.length) : opts.memo } });
5901
- } else dispatchPodSelfSend(target, { stop: true });
5902
- ui.info(`Pod 조각에 ${hasMemo ? '감독 메모' : 'soft stop'} 기록: ${target} (${record?.job ?? 'finished'})`);
5978
+ const { parsePodReadWait } = await import('./harness/pod-control-send.js');
5979
+ const boundedWait = parsePodReadWait(opts.readWait ?? '10');
5980
+ const receipt = dispatchPodSelfSend(target, { memo: { version: 1, kind: 'supervisor', urgency: urgent ? 'urgent' : 'normal', body: urgent ? opts.memo.slice('[urgent] '.length) : opts.memo } }, undefined, undefined, boundedWait);
5981
+ if (!receipt) throw new Error(`self send 대상 Pod 조각 기록 없음: ${target}`);
5982
+ ui.info(`Pod 조각에 감독 메모 기록: ${target} (${record?.job ?? 'finished'})`);
5983
+ ui.info(receipt?.memoRecord
5984
+ ? `${receipt.read ? '자식이 메모 기록을 수거함' : boundedWait > 0 ? '대기 중 읽음 미관측' : '읽음 미관측 (대기 0초)'}: ${receipt.memoRecord}`
5985
+ : 'Pod 메모 전송 확인 · 읽음 미관측 (원격 응답에 record id 없음)');
5986
+ } else {
5987
+ if (!dispatchPodSelfSend(target, { stop: true })) throw new Error(`self send 대상 Pod 조각 기록 없음: ${target}`);
5988
+ ui.info(`Pod 조각에 soft stop 기록: ${target} (${record?.job ?? 'finished'})`);
5989
+ }
5903
5990
  return;
5904
5991
  } catch (error) {
5905
5992
  process.stderr.write(`${error instanceof Error ? error.message : String(error)}\n`);
@@ -6237,6 +6324,7 @@ selfCmd
6237
6324
  return { status: r.status, stdout: r.stdout ?? '', stderr: r.stderr ?? '' };
6238
6325
  },
6239
6326
  reviewPullRequest,
6327
+ reviewRepositoryPath: process.cwd(),
6240
6328
  readReferencedFile: createRepositoryReferencedFileReader(process.cwd()),
6241
6329
  renderReview,
6242
6330
  // ⛔⭐ 하드코딩 금지(🩸 2026-09-23 실측: 여기 'medium' 이 박혀 있었다) — 무인 리뷰와 «같은» 규칙.
@@ -7852,6 +7940,16 @@ const selfDevCmd = program
7852
7940
  // ⭐ 저작 «전»에 끊는다 — 100초를 쓰지 않는다. 우회는 --force-preflight 로 그대로 열려 있다.
7853
7941
  throw new DevPipelineError('저작 전 예비 검사에서 막혔다 — 위 이름을 확인하라 (우회: --force-preflight)');
7854
7942
  }
7943
+ if (flowResult.kind === 'stopped-by-timebox') {
7944
+ // ⭐⭐ AUTHOR-TIMEBOX NOT-GROUNDED — 저작 결과 줄은 흐름이 이미 썼다. 발사하지 않고 여기서 끝낸다.
7945
+ releaseAuthoringLease();
7946
+ if (opts.json) {
7947
+ const terminalResult = { kind: 'self', ok: false, stage: 'author-timebox-not-grounded', goalFile: flowResult.goalFile };
7948
+ await writeStdoutJson(`${JSON.stringify(terminalResult)}\n`);
7949
+ }
7950
+ completionGuard.conclude();
7951
+ process.exit(1);
7952
+ }
7855
7953
  askAuthoredFile = flowResult.goalFile;
7856
7954
  if (flowResult.kind === 'stopped-by-preflight') {
7857
7955
  releaseAuthoringLease();
@@ -8402,7 +8500,9 @@ configCmd
8402
8500
  }
8403
8501
  // IMAGE-LEDGER-TAGS: the baseline pin (the rail sets it through this command) goes into the image ledger.
8404
8502
  if (recordImagePinFromConfigSet(path, parsed) === 'recorded') ui.info(`image ledger: baseline ${String(parsed).slice(0, 12)} · keep=pin`);
8405
- ui.info(`set ${path} = ${JSON.stringify(parsed)}`);
8503
+ // CFG-STORE2-HISTORY-REVERT — set 줄도 «가림 자»를 지난다: 비밀 경로·비밀 모양 값은 MASK(원문 미노출).
8504
+ // 비밀이 아닌 값의 출력은 종전 그대로(JSON.stringify(parsed) == JSON.stringify(maskDeep(parsed))).
8505
+ ui.info(`set ${path} = ${JSON.stringify((await import('./cli/config-audit.js')).maskConfigDisplayValue(path, parsed))}`);
8406
8506
  });
8407
8507
 
8408
8508
  configCmd
@@ -8431,6 +8531,70 @@ configCmd
8431
8531
  ui.info(`unset ${path}`);
8432
8532
  });
8433
8533
 
8534
+ // ── config audit history / revert (CFG-STORE2-HISTORY-REVERT · 0.2.36 · 2026-10-22) ──
8535
+ // CFG-STORE2 가 set/unset 마다 남긴 원장을 «읽어서» 되돌린다. 원장은 append 전용 —
8536
+ // 되돌림도 새 행 하나(why='config revert')로만 남고, 이전 행은 절대 고치지 않는다.
8537
+ // 계산 = src/cli/config-audit.ts(planConfigRevert · formatConfigHistory · configDomainOf).
8538
+ configCmd
8539
+ .command('history <path>')
8540
+ .description('CFG-STORE2 — 한 키의 감사 이력(변경 전후 값·by·why). 비밀은 가려서 보여준다.')
8541
+ .option('--json', 'JSON 출력')
8542
+ .action(async (path: string, opts: { json?: boolean }) => {
8543
+ const { configDomainOf, formatConfigHistory, readConfigHistory } = await import('./cli/config-audit.js');
8544
+ const rows = readConfigHistory(path);
8545
+ if (opts.json) {
8546
+ await writeStdoutJson(`${JSON.stringify({ key: path, domain: configDomainOf(path), rows }, null, 2)}\n`);
8547
+ return;
8548
+ }
8549
+ await writeStdoutJson(`${formatConfigHistory(path, rows)}\n`);
8550
+ });
8551
+
8552
+ configCmd
8553
+ .command('revert <path>')
8554
+ .description('CFG-STORE2 — 그 키의 마지막 변경을 되돌린다(원장은 지우지 않고 새 행을 append).')
8555
+ .option('--no-backup', "Don't write config.json.bak before saving")
8556
+ .option('--json', 'JSON 출력')
8557
+ .action(async (path: string, opts: { backup?: boolean; json?: boolean }) => {
8558
+ const { configDomainOf, containsMaskValue, MASK, planConfigRevert, recordConfigRevert } = await import('./cli/config-audit.js');
8559
+ const plan = planConfigRevert(path);
8560
+ if (plan.status === 'no-history') {
8561
+ ui.error(`revert ${path} — 감사 이력 없음(되돌릴 변경이 없다)`);
8562
+ process.exit(1);
8563
+ }
8564
+ if (plan.status === 'masked') {
8565
+ ui.error(`revert ${path} — 이전 값이 ${MASK} 라 원문 복원 불가(원문은 원장에 남기지 않는다). 그 키를 직접 set 하라.`);
8566
+ process.exit(1);
8567
+ }
8568
+ if (plan.status === 'already') {
8569
+ ui.info(`revert ${path} — 마지막 변경이 값 변화 없음 (no-op)`);
8570
+ return;
8571
+ }
8572
+ const cfg = getUserConfig() as unknown as Record<string, unknown>;
8573
+ const prev = getConfigPath(cfg, path); // 되돌림도 한 번의 변경 — 그 «전» 값을 남긴다
8574
+ if (opts.backup !== false) backupUserConfig(userConfigPath());
8575
+ if (plan.value === undefined) unsetConfigPath(cfg, path);
8576
+ else setConfigPath(cfg, path, plan.value);
8577
+ saveUserConfig(cfg as unknown as ReturnType<typeof getUserConfig>);
8578
+ reloadUserConfig();
8579
+ // set/unset 과 대칭 — 저장 후 재읽기로 «실제로 복원됐는지» 검증(조용한 성공 금지).
8580
+ // 가림 자가 값으로 되쓰였는지도 본다: 오염값끼리는 직렬화 비교가 같아 조용히 통과한다.
8581
+ const after = getConfigPath(getUserConfig() as unknown as Record<string, unknown>, path);
8582
+ if (containsMaskValue(after)) {
8583
+ console.error(`⚠️ revert ${path} — 복원 값에 가림 자(${MASK})가 섞였다(원문 복원 불가). 그 키를 직접 set 하라.`);
8584
+ process.exit(1);
8585
+ }
8586
+ if (JSON.stringify(after) !== JSON.stringify(plan.value)) {
8587
+ console.error(`⚠️ revert ${path} — 저장 후 값 미반영(직렬화 드롭). 읽힌값=${JSON.stringify(after)}`);
8588
+ process.exit(1);
8589
+ }
8590
+ const row = recordConfigRevert({ key: path, prev, next: plan.value, why: 'config revert' });
8591
+ if (opts.json) {
8592
+ await writeStdoutJson(`${JSON.stringify({ key: path, domain: configDomainOf(path), row }, null, 2)}\n`);
8593
+ return;
8594
+ }
8595
+ ui.info(`revert ${path} = ${JSON.stringify(plan.value ?? null)} (domain=${configDomainOf(path)})`);
8596
+ });
8597
+
8434
8598
  // ── config drift / explain (CFG-STORE1 · 0.2.20 · 2026-10-08) — 읽기 전용 «유효 config ⊕ 출처» ──
8435
8599
  // 집(~/.elanous)과 파생 시험 우주(<트리>/.elanous-test) config 사본의 드리프트를 한 명령으로.
8436
8600
  // ⛔ 쓰기 0 · 못 읽음 ≠ 같음 · 비밀 값 가림. 계산 = src/cli/config-drift.ts.
@@ -9585,6 +9749,14 @@ program
9585
9749
  }
9586
9750
  const cfg = getUserConfig();
9587
9751
  if ((await import('./onboarding.js')).needsOnboarding(cfg)) {
9752
+ // Machine mode contract: stdout carries JSONL only. An onboarding
9753
+ // banner there corrupts the stream (`invalid REPL JSONL response`
9754
+ // in the TUI parent). Fail fast on stderr instead of launching an
9755
+ // interactive wizard on a pipe.
9756
+ if (opts.json === true || opts.stdinJsonl === true) {
9757
+ process.stderr.write('No config yet — run `elanous` once interactively (onboarding) before using repl --json / --stdin-jsonl.\n');
9758
+ process.exit(2);
9759
+ }
9588
9760
  if (cfg.onboarding.webFirst === false) ui.info('No config yet — launching setup wizard first.');
9589
9761
  if (!await runFirstSetupForCli(cfg, true)) return;
9590
9762
  }
@@ -12039,6 +12211,54 @@ export function rootResumeIdAt(rawArgs: readonly string[], resumeFlagIdx: number
12039
12211
  return next !== undefined && !next.startsWith('-') ? next : undefined;
12040
12212
  }
12041
12213
 
12214
+ /** TUI-CONTINUE-SESSION (0.2.35) — `--continue` 가 «어느 세션» 을 이어받나를 정하는 조회 창구. */
12215
+ export interface ContinueSessionLookup {
12216
+ /** cwd 가 속한 프로젝트 id — 매칭 없으면 null. */
12217
+ projectIdForCwd: (cwd: string) => string | null;
12218
+ /** 그 프로젝트의 최신 세션 id — 없으면 null. */
12219
+ latestForProject: (projectId: string) => string | null;
12220
+ /** 전역 최신 세션 id — 없으면 null. */
12221
+ latestGlobal: () => string | null;
12222
+ /** 지금 활성 표지가 가리키는 세션 id — 없으면 null. */
12223
+ activeSessionId: () => string | null;
12224
+ }
12225
+
12226
+ const realContinueSessionLookup: ContinueSessionLookup = {
12227
+ projectIdForCwd: (cwd) => suggestProjectForFolder(cwd)?.id ?? null,
12228
+ latestForProject: (projectId) => listSessions({ limit: 1, projectId })[0]?.id ?? null,
12229
+ latestGlobal: () => listSessions({ limit: 1 })[0]?.id ?? null,
12230
+ activeSessionId: () => getActiveSessionId(),
12231
+ };
12232
+
12233
+ /**
12234
+ * TUI-CONTINUE-SESSION (0.2.35) — `--continue`(id 없는 `--resume`)의 «최근 세션» 을 cwd 기준으로
12235
+ * 먼저 좁힌다: cwd 가 속한 프로젝트(`primaryFolder` 또는 그 하위 디렉토리)의 최신 세션 id.
12236
+ * 매칭 프로젝트가 없거나 그 프로젝트에 세션이 하나도 없으면 전역 최신으로 폴백한다 —
12237
+ * 프로젝트와 무관한 디렉토리·화면의 이어가기 동작은 종전 그대로다.
12238
+ */
12239
+ export function latestSessionIdForContinue(
12240
+ cwd: string = process.cwd(),
12241
+ lookup: ContinueSessionLookup = realContinueSessionLookup,
12242
+ ): string | null {
12243
+ const projectId = lookup.projectIdForCwd(cwd);
12244
+ const localId = projectId ? lookup.latestForProject(projectId) : null;
12245
+ return localId ?? lookup.latestGlobal();
12246
+ }
12247
+
12248
+ /**
12249
+ * cwd 가 프로젝트 안이면 활성 표지보다 cwd 프로젝트의 최신 세션 선택을 우선한다.
12250
+ * 프로젝트 밖에서는 종전처럼 활성 표지가 전역 최신보다 우선한다.
12251
+ */
12252
+ export function activeSessionIdForContinue(
12253
+ cwd: string = process.cwd(),
12254
+ lookup: ContinueSessionLookup = realContinueSessionLookup,
12255
+ ): string | null {
12256
+ const active = lookup.activeSessionId();
12257
+ if (!active) return null;
12258
+ const cwdProjectId = lookup.projectIdForCwd(cwd);
12259
+ return cwdProjectId ? null : active;
12260
+ }
12261
+
12042
12262
  export function filterDashboardArgs(rawArgs: readonly string[], resumeFlagIdx?: number): string[] {
12043
12263
  const rootResumeFlagIdx = resumeFlagIdx ?? rawArgs.findIndex((arg, index) =>
12044
12264
  // ⛔ `-r` 은 «더 이상» resume 의 별칭이 아니다 — 원격 북마크(`--remote`)의 단축형이다.
@@ -12059,6 +12279,12 @@ export function filterDashboardArgs(rawArgs: readonly string[], resumeFlagIdx?:
12059
12279
  }
12060
12280
 
12061
12281
  async function main(): Promise<void> {
12282
+ // TUI-BOOT-TIMING-HOLES — «프로세스→sink» 구간(10:40 실측 9.3s). 그 9.3s 의 대부분은 이 모듈이
12283
+ // import 되는 동안(모듈 로드) 흐르므로, main() 진입만 재면 구간을 잘라 먹는다. `performance.now()`
12284
+ // 의 기준점은 프로세스 시작(`performance.timeOrigin`)이라 sink 등록 직전의 «절대값» 이 곧
12285
+ // 프로세스→sink 다. main() 진입 시각은 그 안에서 «어느 몫이 엔트리 코드인지» 가르는 두 번째 값.
12286
+ // 발행은 sink 등록 뒤로 미룬다(등록 전 debug.log 는 no-op).
12287
+ const bootMainEnteredAt = performance.now();
12062
12288
  // WD1 — seed the session working directory from the launch cwd.
12063
12289
  // Every later-phase subsystem reads via getSessionCwd() instead of
12064
12290
  // process.cwd(). Subcommand dispatch (program.parseAsync) runs
@@ -12281,8 +12507,11 @@ async function main(): Promise<void> {
12281
12507
  // 명시 인자가 있으면 env 를 «읽지도» 않는다(폐기 경고가 명시 이어하기에 섞이지 않게).
12282
12508
  readEnvId: () => readDeprecatedEnvForResume('ELANOUS_RESUME_SESSION').value ?? null,
12283
12509
  latest: () => resolveLatestSessionId({
12284
- activeSessionId: () => getActiveSessionId(),
12285
- latestSessionId: () => listSessions({ limit: 1 })[0]?.id ?? null,
12510
+ // TUI-CONTINUE-SESSION (0.2.35) — 활성 표지가 «다른 프로젝트» 세션이면 버리고 cwd 기준으로 고른다.
12511
+ activeSessionId: () => activeSessionIdForContinue(),
12512
+ // TUI-CONTINUE-SESSION (0.2.35) — «지금 이 디렉토리» 의 프로젝트 최근 세션을 먼저 본다.
12513
+ // 그 프로젝트에 세션이 없으면 종전대로 전역 최신으로 폴백(다른 화면 동작 보존).
12514
+ latestSessionId: () => latestSessionIdForContinue(),
12286
12515
  // TUI-H8-FOLLOW ① — 활성 표지가 사라진 세션이면 최신 세션으로(#28509 리뷰 should-fix).
12287
12516
  sessionExists: (id) => loadSession(id) !== null,
12288
12517
  }),
@@ -12433,7 +12662,20 @@ async function main(): Promise<void> {
12433
12662
  // PR#4622(self utterance CLI)·session-cli 미러. fail-open·비블로킹.
12434
12663
  const bootTimer = (await import('./dashboard/boot-timing.js')).createBootTimer();
12435
12664
  bootTimer.begin();
12665
+ // 창은 sink 등록 «직전» 에 닫는다(등록 전 debug.log 는 no-op 이라 발행은 등록 뒤).
12666
+ const procToLogSinkMs = performance.now();
12667
+ const mainEnterToLogSinkMs = procToLogSinkMs - bootMainEnteredAt;
12436
12668
  try { await (await import('./domains/standalone-log-sink.js')).registerStandaloneLogSink('tui'); } catch { /* fail-open */ }
12669
+ debug.log('tui.boot', 'phase', {
12670
+ phase: 'proc-to-log-sink',
12671
+ ms: Math.round(procToLogSinkMs),
12672
+ from: 'process-start',
12673
+ });
12674
+ debug.log('tui.boot', 'phase', {
12675
+ phase: 'main-enter-to-log-sink',
12676
+ ms: Math.round(mainEnterToLogSinkMs),
12677
+ from: 'main-entry',
12678
+ });
12437
12679
  bootTimer.phase('log-sink');
12438
12680
  // P3(대표 2026-07-26) — footgun 관측을 logs.db 에 도달시킨다. 초반(arg 파싱 前) warnProdSpawnFootgun 은
12439
12681
  // StoreSink 등록 前이라 debug.log 가 logs.db 미도달이었다(순서 갭). sink 등록 직후 관측만 재발행(stderr 중복 X).
@@ -12479,6 +12721,12 @@ async function main(): Promise<void> {
12479
12721
  const { showDashboard } = await import('./dashboard/index.js');
12480
12722
  await showDashboard({
12481
12723
  ...dashboardOpts,
12724
+ // TUI-BOOT-TIMING-HOLES — show 동기 셋업(2.3s)은 종전 첫 프레임 신호 하나에 묶여 안 보였다.
12725
+ // bootTimer 는 createBootTimer 시점부터 재므로, dashboard 가 잰 «진입~첫 프레임» 값을 그대로
12726
+ // 이벤트로 남긴다(요약 phase 회계는 종전 그대로 보존).
12727
+ onSyncSetupComplete: (ms: number) => {
12728
+ debug.log('tui.boot', 'show-dashboard-setup', { ms: Math.round(ms) });
12729
+ },
12482
12730
  onFirstFrameRendered: () => {
12483
12731
  bootTimer.phase('show-dashboard');
12484
12732
  bootTimer.done();
@@ -12486,12 +12734,182 @@ async function main(): Promise<void> {
12486
12734
  });
12487
12735
  closeTui();
12488
12736
  }
12489
- // Force exit: the dashboard starts background timers (clipboard
12490
- // poller, shimmer/blink animations) that keep the Bun event loop
12491
- // alive even after the TUI tears down. Without this hard exit,
12492
- // `q` / Ctrl+Q would leave the user staring at a wedged terminal
12493
- // until they sent SIGINT.
12494
- process.exit(0);
12737
+ // TUI-H9-ACTIVE-SESSION-ID — 기동 뒤 설치본/체크아웃이 움직였으면 «이 TUI 가 지금 보여 주던 대화»
12738
+ // 로 스스로 다시 뜬다. 확인이 안 되면 다시 뜨지 않고 이유를 남긴다(전역 최신·기동 resume 으로 메우지 않는다).
12739
+ await exitTuiRun();
12740
+ }
12741
+
12742
+ // ── TUI-H9-ACTIVE-SESSION-ID · 0.2.36 — 재기동은 «이 TUI 의 활성 대화» 로만 ──
12743
+ //
12744
+ // #30046 의 H9 배선은 재기동 세션을 `resumeSessionId ?? getActiveSessionId() ?? listSessions()[0]?.id`
12745
+ // 로 골랐다 — 기동 때의 resume 값이 이후의 활성 세션보다 우선했고, 활성 id 가 없으면 전역 최신(다른
12746
+ // 자리의 맥락일 수 있다)을 집어 왔다. 여기서는 ①이 TUI 가 화면으로 확인한 대화(tui-self-report 의
12747
+ // 소유 기록)와 ②지금 집중된 활성 id 가 «같고» ③그 대화가 저장소에 실재할 때만 재기동한다. 하나라도
12748
+ // 어긋나면 다시 뜨지 않고 이유를 남긴다 — 비슷한 id 로 메우지 않는다.
12749
+
12750
+ /**
12751
+ * TUI 종료 경계 — 재기동 «요청»(`requestTuiSelfRestart`)이 있고 판이 낡았으면 «이 TUI 의 활성 대화» 로
12752
+ * 자식을 띄우고, 부모는 그 종료 코드로 끝난다. 요청이 없으면(사용자 `q`/Ctrl+Q) 낡음을 재지도 않고
12753
+ * 지금처럼 0 으로 끝난다 — 종료 의도를 재기동으로 바꾸지 않는다.
12754
+ * 강제 종료는 그대로다: 대시보드의 배경 타이머(clipboard poller·shimmer/blink)가 Bun 이벤트 루프를
12755
+ * 붙잡아 `q`/Ctrl+Q 뒤에도 터미널이 멈춘 채 남는다.
12756
+ */
12757
+ export async function exitTuiRun(
12758
+ deps: TuiSelfRestartDeps & {
12759
+ readonly exit?: (code: number) => never;
12760
+ /** 재기동 요청 — 기본 = `takeTuiSelfRestartRequest()`(한 번 읽고 지운다). */
12761
+ readonly takeRestartRequest?: () => { readonly reason: string } | null;
12762
+ } = {},
12763
+ ): Promise<void> {
12764
+ const exit = deps.exit ?? ((code: number): never => process.exit(code));
12765
+ const take = deps.takeRestartRequest
12766
+ ?? (await import('./capture/tui-self-report.js')).takeTuiSelfRestartRequest;
12767
+ const request = take();
12768
+ if (!request) {
12769
+ try {
12770
+ (deps.log ?? ((event: string, detail: Record<string, unknown>) => debug.log('tui.self-restart', event, detail)))(
12771
+ 'skip', { reason: 'no-restart-request' },
12772
+ );
12773
+ } catch { /* 관측 실패가 종료를 막지 않는다 */ }
12774
+ exit(0);
12775
+ }
12776
+ const selfRestart = await runTuiSelfRestartOnStaleBuild(deps);
12777
+ if (selfRestart.outcome === 'relaunch') {
12778
+ // 자식이 화면을 이어받았다 — 부모는 자식 종료 코드로 끝난다.
12779
+ exit(selfRestart.exitCode ?? 0);
12780
+ }
12781
+ exit(0);
12782
+ }
12783
+
12784
+ export interface TuiSelfRestartResult {
12785
+ readonly outcome: 'skip' | 'blocked' | 'relaunch';
12786
+ readonly reason: string;
12787
+ readonly sessionId?: string;
12788
+ readonly argv?: readonly string[];
12789
+ readonly exitCode?: number;
12790
+ }
12791
+
12792
+ export interface TuiSelfRestartDeps {
12793
+ /** 재기동 자식의 스크립트 경로 — 기본 = `process.argv[1]`(배포 엔트리). */
12794
+ readonly scriptPath?: string;
12795
+ /** 사용자 인자 — 기본 = `process.argv.slice(2)`. 이전 `--resume`/`--continue` 는 걷어내고 우리 id 만 싣는다. */
12796
+ readonly args?: readonly string[];
12797
+ /** 낡음 판정 — 기본 = `judgeBuildStaleness(runningBuild ⊕ readCurrentInstallRecord ⊕ readCheckoutHead)`. */
12798
+ readonly stale?: () => { readonly stale: boolean | null; readonly reason: string };
12799
+ /** 이 TUI 가 화면으로 확인한 대화 — 기본 = 소유 기록(`getTuiOwnedSession`). */
12800
+ readonly owned?: () => { readonly sessionId: string; readonly at: number } | null;
12801
+ /** 지금 집중된 활성 대화 id — 기본 = `getActiveSessionId()`. */
12802
+ readonly liveActiveSessionId?: () => string | null;
12803
+ /** 그 id 의 대화가 실재하나 — 기본 = `loadSession(id) !== null`. */
12804
+ readonly sessionExists?: (sessionId: string) => boolean;
12805
+ /** 관측 전용 — «전역 최신»이 무엇이든 재기동 id 는 여기서 고르지 않는다(로그·사유 문면에만 적는다). */
12806
+ readonly globalLatestSessionId?: () => string | null;
12807
+ readonly spawnChild?: (command: string, argv: readonly string[], env: Record<string, string>) => Promise<number>;
12808
+ readonly log?: (event: string, detail: Record<string, unknown>) => void;
12809
+ }
12810
+
12811
+ /** 한 런의 재기동 세대 상한 — 재기동한 자식이 또 낡아도 여기서 멈춘다(무한 재기동 방지). */
12812
+ const TUI_SELF_RESTART_MAX_GENERATION = 3;
12813
+
12814
+ /** 재기동 자식에게 넘길 argv — 이 TUI 의 활성 대화만 `--resume` 으로 싣는다. */
12815
+ export function planTuiRestartArgv(input: {
12816
+ readonly scriptPath: string;
12817
+ readonly args: readonly string[];
12818
+ readonly sessionId: string;
12819
+ }): string[] {
12820
+ const kept: string[] = [];
12821
+ for (let i = 0; i < input.args.length; i += 1) {
12822
+ const arg = input.args[i]!;
12823
+ if (arg === '--resume') {
12824
+ // 값 없는 `--resume` 뒤에 오는 플래그는 값이 아니다 — 삼키지 않는다.
12825
+ const next = input.args[i + 1];
12826
+ if (next !== undefined && !next.startsWith('-')) i += 1;
12827
+ continue;
12828
+ }
12829
+ if (arg === '--continue' || arg.startsWith('--resume=') || arg.startsWith('--continue=')) continue;
12830
+ kept.push(arg);
12831
+ }
12832
+ return [input.scriptPath, ...kept, '--resume', input.sessionId];
12833
+ }
12834
+
12835
+ /**
12836
+ * 낡은 판에서 TUI 를 스스로 다시 띄운다 — 이 TUI 가 보여 주던 대화로만.
12837
+ * 확인 실패는 «재기동 안 함» 이고 그 이유가 로그·stderr 로 남는다.
12838
+ */
12839
+ export async function runTuiSelfRestartOnStaleBuild(deps: TuiSelfRestartDeps = {}): Promise<TuiSelfRestartResult> {
12840
+ const report = deps.log ?? ((event: string, detail: Record<string, unknown>) => debug.log('tui.self-restart', event, detail));
12841
+ const { judgeBuildStaleness, readCheckoutHead, readCurrentInstallRecord, runningBuild } = await import('./pty-shell/tui-run-state.js');
12842
+ const staleness = (deps.stale ?? (() => {
12843
+ const build = runningBuild();
12844
+ const checkoutHead = build.source === 'checkout' && build.codeRoot ? readCheckoutHead(build.codeRoot) : undefined;
12845
+ return judgeBuildStaleness({ build, installed: readCurrentInstallRecord(), ...(checkoutHead ? { checkoutHead } : {}) });
12846
+ }))();
12847
+ if (staleness.stale !== true) {
12848
+ report('skip', { reason: staleness.reason });
12849
+ return { outcome: 'skip', reason: staleness.reason };
12850
+ }
12851
+ const generation = Number.parseInt(process.env.ELANOUS_TUI_RESTART_GEN ?? '0', 10) || 0;
12852
+ const tuiReport = await import('./capture/tui-self-report.js');
12853
+ const store = await import('./session/index.js');
12854
+ const owned = (deps.owned ?? tuiReport.getTuiOwnedSession)();
12855
+ const liveActiveSessionId = (deps.liveActiveSessionId ?? store.getActiveSessionId)();
12856
+ const globalLatestSessionId = (deps.globalLatestSessionId
12857
+ ?? (() => { try { return store.listSessions({ limit: 1 })[0]?.id ?? null; } catch { return null; } }))();
12858
+ if (generation >= TUI_SELF_RESTART_MAX_GENERATION) {
12859
+ report('blocked', { reason: 'generation-limit', generation, staleReason: staleness.reason });
12860
+ console.error(`elanous: 설치본이 바뀌었지만 이 런은 이미 ${generation}번 다시 떴다 — 자동 재기동을 멈춘다(수동으로 다시 열어라).`);
12861
+ return { outcome: 'blocked', reason: 'generation-limit' };
12862
+ }
12863
+ const decision = tuiReport.decideTuiRestartSession({
12864
+ owned,
12865
+ liveActiveSessionId,
12866
+ sessionExists: deps.sessionExists ?? ((id: string) => { try { return store.loadSession(id) !== null; } catch { return false; } }),
12867
+ });
12868
+ if (!decision.ok) {
12869
+ report('blocked', {
12870
+ reason: decision.reason,
12871
+ staleReason: staleness.reason,
12872
+ ownedSessionId: owned?.sessionId ?? null,
12873
+ liveActiveSessionId,
12874
+ globalLatestSessionId,
12875
+ generation,
12876
+ });
12877
+ console.error(`elanous: 설치본이 바뀌었지만 이 TUI 의 활성 대화를 확인하지 못해 다시 뜨지 않았다(${decision.reason}) — 다시 열면 지금 화면의 대화로 이어진다.`);
12878
+ return { outcome: 'blocked', reason: decision.reason };
12879
+ }
12880
+ const argv = planTuiRestartArgv({
12881
+ scriptPath: deps.scriptPath ?? process.argv[1] ?? '',
12882
+ args: deps.args ?? process.argv.slice(2),
12883
+ sessionId: decision.sessionId,
12884
+ });
12885
+ const env: Record<string, string> = {};
12886
+ for (const [key, value] of Object.entries(process.env)) if (typeof value === 'string') env[key] = value;
12887
+ env.ELANOUS_TUI_RESTART_GEN = String(generation + 1);
12888
+ report('relaunch', {
12889
+ sessionId: decision.sessionId,
12890
+ claimedAt: decision.claimedAt,
12891
+ staleReason: staleness.reason,
12892
+ generation,
12893
+ argv,
12894
+ globalLatestSessionId,
12895
+ });
12896
+ console.error(`elanous: 설치본이 바뀌어 이 TUI 의 대화(${decision.sessionId})로 다시 뜬다${globalLatestSessionId && globalLatestSessionId !== decision.sessionId ? ` — 전역 최신 ${globalLatestSessionId} 은 싣지 않는다` : ''}.`);
12897
+ const exitCode = await (deps.spawnChild ?? defaultTuiSelfRestartSpawn)(process.execPath, argv, env);
12898
+ return { outcome: 'relaunch', reason: staleness.reason, sessionId: decision.sessionId, argv, exitCode };
12899
+ }
12900
+
12901
+ /** 재기동 자식 — 같은 터미널(stdio inherit)을 물려받는다. 부모는 자식 종료를 기다린 뒤 그 코드로 끝난다. */
12902
+ async function defaultTuiSelfRestartSpawn(command: string, argv: readonly string[], env: Record<string, string>): Promise<number> {
12903
+ const childProcess = await import('node:child_process');
12904
+ const child: import('node:child_process').ChildProcess = childProcess.spawn(
12905
+ command,
12906
+ [...argv],
12907
+ { stdio: 'inherit', env: env as NodeJS.ProcessEnv },
12908
+ );
12909
+ return await new Promise<number>((resolve) => {
12910
+ child.on('error', () => resolve(1));
12911
+ child.on('exit', (code, signal) => resolve(typeof code === 'number' ? code : signal ? 1 : 0));
12912
+ });
12495
12913
  }
12496
12914
 
12497
12915
  /**