elanous 0.2.36 → 0.2.37

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (630) hide show
  1. package/apps/pwa/out/404/index.html +1 -1
  2. package/apps/pwa/out/404.html +1 -1
  3. package/apps/pwa/out/_next/static/{uC-N0emedeNOFuaBQFv-I → 8kITumG9GAZ1LwT9POrAR}/_buildManifest.js +1 -1
  4. package/apps/pwa/out/_next/static/chunks/1041-5841aae848fb6403.js +1 -0
  5. package/apps/pwa/out/_next/static/chunks/1087.3177e54f672dc526.js +1 -0
  6. package/apps/pwa/out/_next/static/chunks/1105.efe1e13503ac7a33.js +1 -0
  7. package/apps/pwa/out/_next/static/chunks/1224.2ceca6c180d5130b.js +62 -0
  8. package/apps/pwa/out/_next/static/chunks/{4286.b70c4520306817e8.js → 1262.a89bb27a5b2f844e.js} +1 -1
  9. package/apps/pwa/out/_next/static/chunks/1417-1768233ac92f8a5d.js +1 -0
  10. package/apps/pwa/out/_next/static/chunks/1612.81bbc19af06af16c.js +1 -0
  11. package/apps/pwa/out/_next/static/chunks/{3410.7f9af5ab77cbe65f.js → 1746.3563617ea64023a3.js} +1 -1
  12. package/apps/pwa/out/_next/static/chunks/1766.728d42053070bb2d.js +1 -0
  13. package/apps/pwa/out/_next/static/chunks/1773.d38e945481e04125.js +1 -0
  14. package/apps/pwa/out/_next/static/chunks/1974-c12f9600da3d3c26.js +1 -0
  15. package/apps/pwa/out/_next/static/chunks/1ed5e8af.cf424815c7c0efad.js +1 -0
  16. package/apps/pwa/out/_next/static/chunks/{9250-072df22eaadaa6b5.js → 2002-a43a3f380df873ec.js} +1 -1
  17. package/apps/pwa/out/_next/static/chunks/2061.7232dc9dc058417f.js +1 -0
  18. package/apps/pwa/out/_next/static/chunks/210.90b2cbd64926cf34.js +32 -0
  19. package/apps/pwa/out/_next/static/chunks/{3727.7949ccaacaa71242.js → 2283.edd9627b7bdfb546.js} +2 -2
  20. package/apps/pwa/out/_next/static/chunks/2318-450e75d07605b8fe.js +1 -0
  21. package/apps/pwa/out/_next/static/chunks/{4615.8525eb0add35eba6.js → 2375.bf364c85dbb6f085.js} +1 -1
  22. package/apps/pwa/out/_next/static/chunks/244-a810d282a20f1783.js +1 -0
  23. package/apps/pwa/out/_next/static/chunks/2479-fe7e188bd9402d14.js +1 -0
  24. package/apps/pwa/out/_next/static/chunks/2514.03b60f266531a015.js +148 -0
  25. package/apps/pwa/out/_next/static/chunks/2526-a657538869888604.js +1 -0
  26. package/apps/pwa/out/_next/static/chunks/2533-6f0341ff075809e9.js +1 -0
  27. package/apps/pwa/out/_next/static/chunks/2676.e7994c695ef0f30d.js +1 -0
  28. package/apps/pwa/out/_next/static/chunks/2734.3ffdf54254fb6f99.js +27 -0
  29. package/apps/pwa/out/_next/static/chunks/2770-23252bf3a37880b9.js +1 -0
  30. package/apps/pwa/out/_next/static/chunks/2969.66b8b545139d1544.js +1 -0
  31. package/apps/pwa/out/_next/static/chunks/3128.a9210d08800ea6a8.js +1 -0
  32. package/apps/pwa/out/_next/static/chunks/{5711.957b095705c12560.js → 3199.6a1a9b0e6cd01dc6.js} +1 -1
  33. package/apps/pwa/out/_next/static/chunks/3212.12179fd3eee8cef1.js +1 -0
  34. package/apps/pwa/out/_next/static/chunks/{2986.45d7652e4f13557e.js → 3578.4e9f9948a9a6f2f4.js} +2 -2
  35. package/apps/pwa/out/_next/static/chunks/3760-2909ddb9279281cd.js +1 -0
  36. package/apps/pwa/out/_next/static/chunks/3825.1921b5901bf33dce.js +36 -0
  37. package/apps/pwa/out/_next/static/chunks/3994-63eb884ed0547011.js +1 -0
  38. package/apps/pwa/out/_next/static/chunks/4036.d54e55e1ebf5acdc.js +90 -0
  39. package/apps/pwa/out/_next/static/chunks/4115.5b438b99f0ae729f.js +226 -0
  40. package/apps/pwa/out/_next/static/chunks/4269.d8f9f34bb0fc6c43.js +287 -0
  41. package/apps/pwa/out/_next/static/chunks/431-4eed5bd2c5fe1719.js +1 -0
  42. package/apps/pwa/out/_next/static/chunks/{7481.39f7a4654907bf6e.js → 4313.76f232c304a15bde.js} +1 -1
  43. package/apps/pwa/out/_next/static/chunks/4324.c99ba3e83eb1b691.js +1 -0
  44. package/apps/pwa/out/_next/static/chunks/4337e36d.f42c3b391b3d8f20.js +122 -0
  45. package/apps/pwa/out/_next/static/chunks/{6943.c6b24124853a47b2.js → 4383.18e5c54db3a22c88.js} +1 -1
  46. package/apps/pwa/out/_next/static/chunks/4599-96eff3f2a9c242c1.js +1 -0
  47. package/apps/pwa/out/_next/static/chunks/{3757-180308bc61021b05.js → 4725-34bed25720cc326b.js} +1 -1
  48. package/apps/pwa/out/_next/static/chunks/4825-a9d9d4e9f5892309.js +1 -0
  49. package/apps/pwa/out/_next/static/chunks/4833-7934c592c5569f00.js +1 -0
  50. package/apps/pwa/out/_next/static/chunks/4879-68518f547a207aff.js +1 -0
  51. package/apps/pwa/out/_next/static/chunks/4896.f9b70285363b27b2.js +24 -0
  52. package/apps/pwa/out/_next/static/chunks/{771.c3cdb6c1f7f47c02.js → 4931.95cc6dbd230774ca.js} +3 -3
  53. package/apps/pwa/out/_next/static/chunks/4937-28d437999b77c9dd.js +1 -0
  54. package/apps/pwa/out/_next/static/chunks/49aa54ab.80f39398e0ed0f30.js +1 -0
  55. package/apps/pwa/out/_next/static/chunks/{552.b7d061ad91eeac51.js → 5046.7fd5cbd859299448.js} +2 -2
  56. package/apps/pwa/out/_next/static/chunks/5056.482687319b82638e.js +104 -0
  57. package/apps/pwa/out/_next/static/chunks/506.16b83d56a437a9ee.js +1 -0
  58. package/apps/pwa/out/_next/static/chunks/5260-20593b0a25d0afbc.js +1 -0
  59. package/apps/pwa/out/_next/static/chunks/5404.cc4e9fec26fd5925.js +1 -0
  60. package/apps/pwa/out/_next/static/chunks/576.485e83e3f3dec19a.js +1 -0
  61. package/apps/pwa/out/_next/static/chunks/5832-a6be14e663f65726.js +1 -0
  62. package/apps/pwa/out/_next/static/chunks/5854-56648a9fe646b9a0.js +1 -0
  63. package/apps/pwa/out/_next/static/chunks/{9f31e478.fefcbcd3c388ebc5.js → 58edce7d.f1b0c72acf13b123.js} +1 -1
  64. package/apps/pwa/out/_next/static/chunks/5925.3b1f8b135710249b.js +93 -0
  65. package/apps/pwa/out/_next/static/chunks/{3136.30aaaa5fa03662a3.js → 5952.294fc574a8625184.js} +1 -1
  66. package/apps/pwa/out/_next/static/chunks/{da5ecc5c-b005ad8cac737d57.js → 5f6af561-f90b7a67f4f75d13.js} +1 -1
  67. package/apps/pwa/out/_next/static/chunks/6168.17749aa3905fa073.js +74 -0
  68. package/apps/pwa/out/_next/static/chunks/{3324.a09703033abcbd2f.js → 6252.240578f10952e091.js} +1 -1
  69. package/apps/pwa/out/_next/static/chunks/6416.5d50b8ec9986ca98.js +1 -0
  70. package/apps/pwa/out/_next/static/chunks/{8904.7d51af2dc033965c.js → 6680.6a693c28aae4cd19.js} +2 -2
  71. package/apps/pwa/out/_next/static/chunks/{275-02ea4c2a33980422.js → 6745-5a63492933959dd9.js} +3 -3
  72. package/apps/pwa/out/_next/static/chunks/6758.e7fbf532953c0783.js +1 -0
  73. package/apps/pwa/out/_next/static/chunks/6795.0cb8a59730d99703.js +149 -0
  74. package/apps/pwa/out/_next/static/chunks/{528.38ce20ef8aa251ff.js → 6819.be5c9c4d67f22922.js} +3 -3
  75. package/apps/pwa/out/_next/static/chunks/6877-84d47b7e85d0c41e.js +1 -0
  76. package/apps/pwa/out/_next/static/chunks/6971-fb5f9dc0a2cb5d2d.js +1 -0
  77. package/apps/pwa/out/_next/static/chunks/{3a3d9966.cc4d4585a2708e7c.js → 709a918c.4fd3b4e2a32cb4e3.js} +1 -1
  78. package/apps/pwa/out/_next/static/chunks/717.522b08685979b814.js +1 -0
  79. package/apps/pwa/out/_next/static/chunks/7191.e41eb8f455c7f089.js +41 -0
  80. package/apps/pwa/out/_next/static/chunks/7233.8e744b7513119409.js +1 -0
  81. package/apps/pwa/out/_next/static/chunks/7238-97c2226f80504bd8.js +1 -0
  82. package/apps/pwa/out/_next/static/chunks/7285.307963afcf7e7660.js +24 -0
  83. package/apps/pwa/out/_next/static/chunks/7299-fbe4b8c47a87614a.js +1 -0
  84. package/apps/pwa/out/_next/static/chunks/7314.df0d95930b0c3f50.js +1 -0
  85. package/apps/pwa/out/_next/static/chunks/7406.c0589fdf2ee66629.js +1 -0
  86. package/apps/pwa/out/_next/static/chunks/{4304.e9b2512834a9e23e.js → 7424.c0fe2a595d4232b5.js} +1 -1
  87. package/apps/pwa/out/_next/static/chunks/752-90e3e7daad3d8e39.js +1 -0
  88. package/apps/pwa/out/_next/static/chunks/7524-bcd3d9928c6842d9.js +1 -0
  89. package/apps/pwa/out/_next/static/chunks/7549.9a4de3bf231cfc52.js +1 -0
  90. package/apps/pwa/out/_next/static/chunks/757-4fbaf50942b8c424.js +1 -0
  91. package/apps/pwa/out/_next/static/chunks/765.76ae970ceb597b5b.js +1 -0
  92. package/apps/pwa/out/_next/static/chunks/{2683.c9773a0c589b031b.js → 7867.e8725745ddd1d940.js} +4 -4
  93. package/apps/pwa/out/_next/static/chunks/{6466-92e65a48490b68a9.js → 7893-e444a1b0809cd1e4.js} +1 -1
  94. package/apps/pwa/out/_next/static/chunks/7956-33748cabb3a05562.js +1 -0
  95. package/apps/pwa/out/_next/static/chunks/{ccae1c4b-0cf414f5eff1b10d.js → 7c5ed21f-f286708e57cf88f7.js} +1 -1
  96. package/apps/pwa/out/_next/static/chunks/8030-aa66b478b53dbfca.js +1 -0
  97. package/apps/pwa/out/_next/static/chunks/8051.c88c07dacbbc5f21.js +8 -0
  98. package/apps/pwa/out/_next/static/chunks/{3840-5825d56d46976a92.js → 8080-40d781e7704d3671.js} +1 -1
  99. package/apps/pwa/out/_next/static/chunks/8149.80e402d4345e8dae.js +77 -0
  100. package/apps/pwa/out/_next/static/chunks/8205.50a5268f4e12ba0b.js +1 -0
  101. package/apps/pwa/out/_next/static/chunks/8231.a128feaa6f8b6079.js +1 -0
  102. package/apps/pwa/out/_next/static/chunks/85.4ddb1dda2ea3ffa2.js +286 -0
  103. package/apps/pwa/out/_next/static/chunks/8537.26517a09e8247beb.js +1 -0
  104. package/apps/pwa/out/_next/static/chunks/8595-e9b7081ab773a61f.js +1 -0
  105. package/apps/pwa/out/_next/static/chunks/8821-30cc65a61a60951f.js +1 -0
  106. package/apps/pwa/out/_next/static/chunks/8905.b3385aadb7b133e6.js +79 -0
  107. package/apps/pwa/out/_next/static/chunks/8983.246bb3a1ac38f50f.js +1 -0
  108. package/apps/pwa/out/_next/static/chunks/{873d6c12.09bd499f57171543.js → 8c58d09b.e8724a299658d86f.js} +1 -1
  109. package/apps/pwa/out/_next/static/chunks/9072.18342f5941a1f3ec.js +1 -0
  110. package/apps/pwa/out/_next/static/chunks/9123.9df04866b2d6e00f.js +1 -0
  111. package/apps/pwa/out/_next/static/chunks/{575.d929793a53f27c4b.js → 9151.a2c51e93f9156dae.js} +1 -1
  112. package/apps/pwa/out/_next/static/chunks/9175-7d383df15a82e2be.js +1 -0
  113. package/apps/pwa/out/_next/static/chunks/9181-bf89c07ce5b8f599.js +1 -0
  114. package/apps/pwa/out/_next/static/chunks/920-429bbc4504b45f71.js +1 -0
  115. package/apps/pwa/out/_next/static/chunks/9207.625edf45d656151c.js +1 -0
  116. package/apps/pwa/out/_next/static/chunks/9378.d2575c6ffd6dd756.js +94 -0
  117. package/apps/pwa/out/_next/static/chunks/957.db5b5c4d32a35240.js +1 -0
  118. package/apps/pwa/out/_next/static/chunks/{190.285c832bd9626f8c.js → 958.53a8dcf4729e6997.js} +1 -1
  119. package/apps/pwa/out/_next/static/chunks/9647.8f0cd0898c592a29.js +1 -0
  120. package/apps/pwa/out/_next/static/chunks/9665-26abb02665704c2c.js +1 -0
  121. package/apps/pwa/out/_next/static/chunks/9703.e7d81b6faef1050a.js +1 -0
  122. package/apps/pwa/out/_next/static/chunks/9882-7a9164b3c2dacbe5.js +1 -0
  123. package/apps/pwa/out/_next/static/chunks/9998.b74e033efadecd10.js +1 -0
  124. package/apps/pwa/out/_next/static/chunks/app/_not-found/page-c604fb980a634d88.js +1 -0
  125. package/apps/pwa/out/_next/static/chunks/app/approvals/page-ec2d8a4979ca9075.js +1 -0
  126. package/apps/pwa/out/_next/static/chunks/app/autopilot/page-cb6add08ad3c7660.js +1 -0
  127. package/apps/pwa/out/_next/static/chunks/app/board/page-e2eaa321ec223fe6.js +1 -0
  128. package/apps/pwa/out/_next/static/chunks/app/botlab/page-5b8a09c475b5f844.js +1 -0
  129. package/apps/pwa/out/_next/static/chunks/app/bots/page-91a77daedfbac191.js +1 -0
  130. package/apps/pwa/out/_next/static/chunks/app/ceo/page-f37fc5e974bda39b.js +1 -0
  131. package/apps/pwa/out/_next/static/chunks/app/chat/page-91429a0b78415a94.js +1 -0
  132. package/apps/pwa/out/_next/static/chunks/app/consult/page-b95798b58263b910.js +1 -0
  133. package/apps/pwa/out/_next/static/chunks/app/control/page-763d53e175e17aa1.js +1 -0
  134. package/apps/pwa/out/_next/static/chunks/app/decisions/page-d55023204055b12f.js +1 -0
  135. package/apps/pwa/out/_next/static/chunks/app/design-check/page-89d2140d78abc810.js +1 -0
  136. package/apps/pwa/out/_next/static/chunks/app/editor/page-82dc069abfe27f55.js +1 -0
  137. package/apps/pwa/out/_next/static/chunks/app/exec/page-25d9eee7beb552c0.js +1 -0
  138. package/apps/pwa/out/_next/static/chunks/app/field/page-770b4594c713ee97.js +1 -0
  139. package/apps/pwa/out/_next/static/chunks/app/healthz/route-c604fb980a634d88.js +1 -0
  140. package/apps/pwa/out/_next/static/chunks/app/inside/page-ba8e0dcae4f83985.js +1 -0
  141. package/apps/pwa/out/_next/static/chunks/app/intake/page-5c112c6d7c33656e.js +1 -0
  142. package/apps/pwa/out/_next/static/chunks/app/layout-09788e1aa9a87db6.js +1 -0
  143. package/apps/pwa/out/_next/static/chunks/app/live/{page-e2de2e59111c9aad.js → page-3337c6a1328c2674.js} +1 -1
  144. package/apps/pwa/out/_next/static/chunks/app/live-run/{page-f2b2e4bf6e981450.js → page-89acd5d68c0bc560.js} +1 -1
  145. package/apps/pwa/out/_next/static/chunks/app/loops/page-5c13e2c76371d797.js +1 -0
  146. package/apps/pwa/out/_next/static/chunks/app/market/page-653a9f18642825c6.js +1 -0
  147. package/apps/pwa/out/_next/static/chunks/app/missions/[id]/{page-2af16e62c12f22df.js → page-fe986fe79b107546.js} +1 -1
  148. package/apps/pwa/out/_next/static/chunks/app/morning/page-1e5da297557d2354.js +1 -0
  149. package/apps/pwa/out/_next/static/chunks/app/not-found-91ea9f5869a40943.js +1 -0
  150. package/apps/pwa/out/_next/static/chunks/app/observatory/page-7824e21b999962e2.js +1 -0
  151. package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-53d00a60cc75a922.js +1 -0
  152. package/apps/pwa/out/_next/static/chunks/app/ops/release/page-88a1edbff62eaf1d.js +1 -0
  153. package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-4e931248b3f9574b.js +1 -0
  154. package/apps/pwa/out/_next/static/chunks/app/outputs/page-443364c9e4a23b31.js +1 -0
  155. package/apps/pwa/out/_next/static/chunks/app/page-b9af2ac1c4737ce8.js +1 -0
  156. package/apps/pwa/out/_next/static/chunks/app/reflection/page-25ab9c614c14129b.js +1 -0
  157. package/apps/pwa/out/_next/static/chunks/app/scheduler/page-dbcdcfac0a395a8a.js +1 -0
  158. package/apps/pwa/out/_next/static/chunks/app/sessions/page-bf1de6645089ec58.js +1 -0
  159. package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-c4201761a5e839c9.js +1 -0
  160. package/apps/pwa/out/_next/static/chunks/app/settings/page-c304f469ea5d70e4.js +1 -0
  161. package/apps/pwa/out/_next/static/chunks/app/setup/done/page-8e5a238cf5e50c9c.js +1 -0
  162. package/apps/pwa/out/_next/static/chunks/app/setup/layout-c604fb980a634d88.js +1 -0
  163. package/apps/pwa/out/_next/static/chunks/app/setup/page-32b526069ee50b3c.js +1 -0
  164. package/apps/pwa/out/_next/static/chunks/app/share/page-fb9e639c107f5f72.js +1 -0
  165. package/apps/pwa/out/_next/static/chunks/app/showroom/page-84220c776608cedc.js +1 -0
  166. package/apps/pwa/out/_next/static/chunks/app/tasks/page-e475618cbfd5ca2b.js +1 -0
  167. package/apps/pwa/out/_next/static/chunks/app/term/page-ac2c1e6169cfce57.js +1 -0
  168. package/apps/pwa/out/_next/static/chunks/app/today/page-fccd3020af2f8806.js +1 -0
  169. package/apps/pwa/out/_next/static/chunks/app/trace/page-9c0d7198ff7b5a91.js +1 -0
  170. package/apps/pwa/out/_next/static/chunks/app/vault/page-d54b1ec9b9c6430d.js +1 -0
  171. package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-8c4bef1791d732ca.js +1 -0
  172. package/apps/pwa/out/_next/static/chunks/app/workflows/page-46fcc0b0bbc6fbfe.js +1 -0
  173. package/apps/pwa/out/_next/static/chunks/app/workspace/page-c1c80e345fa9d6f5.js +1 -0
  174. package/apps/pwa/out/_next/static/chunks/app/worktrees/page-7dfda00afd172f5b.js +1 -0
  175. package/apps/pwa/out/_next/static/chunks/{053a429e.9a63436527cc751c.js → d9815f84.4918f682a45a8502.js} +1 -1
  176. package/apps/pwa/out/_next/static/chunks/{ceba0382.650712b56b85b582.js → de8446d3.31b73eb239fecd7b.js} +1 -1
  177. package/apps/pwa/out/_next/static/chunks/f21fd540.63ac75328926ed30.js +1 -0
  178. package/apps/pwa/out/_next/static/chunks/framework-77fdcc873519a6cd.js +1 -0
  179. package/apps/pwa/out/_next/static/chunks/main-app-d0d620d2ce235713.js +1 -0
  180. package/apps/pwa/out/_next/static/chunks/main-e0ef79c79337ba90.js +1 -0
  181. package/apps/pwa/out/_next/static/chunks/pages/_app-84b1bc71e3f9ce6a.js +1 -0
  182. package/apps/pwa/out/_next/static/chunks/pages/_error-2acb61f1363128cb.js +1 -0
  183. package/apps/pwa/out/_next/static/chunks/webpack-462ff5727ceb7824.js +1 -0
  184. package/apps/pwa/out/_next/static/css/{b5d88eba78a3d7bf.css → be9019f696217521.css} +1 -1
  185. package/apps/pwa/out/approvals/index.html +1 -1
  186. package/apps/pwa/out/approvals/index.txt +23 -23
  187. package/apps/pwa/out/autopilot/index.html +1 -1
  188. package/apps/pwa/out/autopilot/index.txt +23 -23
  189. package/apps/pwa/out/board/index.html +1 -1
  190. package/apps/pwa/out/board/index.txt +23 -23
  191. package/apps/pwa/out/botlab/index.html +1 -1
  192. package/apps/pwa/out/botlab/index.txt +22 -22
  193. package/apps/pwa/out/bots/index.html +1 -1
  194. package/apps/pwa/out/bots/index.txt +22 -22
  195. package/apps/pwa/out/ceo/index.html +1 -1
  196. package/apps/pwa/out/ceo/index.txt +23 -23
  197. package/apps/pwa/out/chat/index.html +1 -1
  198. package/apps/pwa/out/chat/index.txt +22 -22
  199. package/apps/pwa/out/consult/index.html +1 -1
  200. package/apps/pwa/out/consult/index.txt +23 -23
  201. package/apps/pwa/out/control/index.html +1 -1
  202. package/apps/pwa/out/control/index.txt +23 -23
  203. package/apps/pwa/out/decisions/index.html +1 -1
  204. package/apps/pwa/out/decisions/index.txt +22 -22
  205. package/apps/pwa/out/design-check/index.html +1 -1
  206. package/apps/pwa/out/design-check/index.txt +23 -23
  207. package/apps/pwa/out/editor/index.html +1 -1
  208. package/apps/pwa/out/editor/index.txt +23 -23
  209. package/apps/pwa/out/exec/index.html +1 -1
  210. package/apps/pwa/out/exec/index.txt +23 -23
  211. package/apps/pwa/out/field/index.html +1 -1
  212. package/apps/pwa/out/field/index.txt +23 -23
  213. package/apps/pwa/out/healthz +1 -1
  214. package/apps/pwa/out/index.html +1 -1
  215. package/apps/pwa/out/index.txt +22 -22
  216. package/apps/pwa/out/inside/index.html +1 -1
  217. package/apps/pwa/out/inside/index.txt +22 -22
  218. package/apps/pwa/out/intake/index.html +1 -1
  219. package/apps/pwa/out/intake/index.txt +23 -23
  220. package/apps/pwa/out/live/index.html +1 -1
  221. package/apps/pwa/out/live/index.txt +23 -23
  222. package/apps/pwa/out/live-run/index.html +1 -1
  223. package/apps/pwa/out/live-run/index.txt +23 -23
  224. package/apps/pwa/out/loops/index.html +1 -1
  225. package/apps/pwa/out/loops/index.txt +22 -22
  226. package/apps/pwa/out/market/index.html +1 -1
  227. package/apps/pwa/out/market/index.txt +22 -22
  228. package/apps/pwa/out/missions/placeholder/index.html +1 -1
  229. package/apps/pwa/out/missions/placeholder/index.txt +22 -22
  230. package/apps/pwa/out/morning/index.html +1 -1
  231. package/apps/pwa/out/morning/index.txt +23 -23
  232. package/apps/pwa/out/observatory/index.html +1 -1
  233. package/apps/pwa/out/observatory/index.txt +23 -23
  234. package/apps/pwa/out/ops/checklist/index.html +1 -1
  235. package/apps/pwa/out/ops/checklist/index.txt +22 -22
  236. package/apps/pwa/out/ops/release/index.html +1 -1
  237. package/apps/pwa/out/ops/release/index.txt +22 -22
  238. package/apps/pwa/out/ops/seats/index.html +1 -1
  239. package/apps/pwa/out/ops/seats/index.txt +22 -22
  240. package/apps/pwa/out/outputs/index.html +1 -1
  241. package/apps/pwa/out/outputs/index.txt +22 -22
  242. package/apps/pwa/out/reflection/index.html +1 -1
  243. package/apps/pwa/out/reflection/index.txt +23 -23
  244. package/apps/pwa/out/scheduler/index.html +1 -1
  245. package/apps/pwa/out/scheduler/index.txt +23 -23
  246. package/apps/pwa/out/sessions/index.html +1 -1
  247. package/apps/pwa/out/sessions/index.txt +22 -22
  248. package/apps/pwa/out/settings/devices/index.html +1 -1
  249. package/apps/pwa/out/settings/devices/index.txt +23 -23
  250. package/apps/pwa/out/settings/index.html +1 -1
  251. package/apps/pwa/out/settings/index.txt +23 -23
  252. package/apps/pwa/out/setup/done/index.html +1 -1
  253. package/apps/pwa/out/setup/done/index.txt +23 -23
  254. package/apps/pwa/out/setup/index.html +1 -1
  255. package/apps/pwa/out/setup/index.txt +23 -23
  256. package/apps/pwa/out/share/index.html +1 -1
  257. package/apps/pwa/out/share/index.txt +23 -23
  258. package/apps/pwa/out/showroom/index.html +1 -1
  259. package/apps/pwa/out/showroom/index.txt +22 -22
  260. package/apps/pwa/out/tasks/index.html +1 -1
  261. package/apps/pwa/out/tasks/index.txt +23 -23
  262. package/apps/pwa/out/term/index.html +1 -1
  263. package/apps/pwa/out/term/index.txt +23 -23
  264. package/apps/pwa/out/today/index.html +1 -1
  265. package/apps/pwa/out/today/index.txt +23 -23
  266. package/apps/pwa/out/trace/index.html +1 -1
  267. package/apps/pwa/out/trace/index.txt +23 -23
  268. package/apps/pwa/out/vault/index.html +1 -1
  269. package/apps/pwa/out/vault/index.txt +23 -23
  270. package/apps/pwa/out/workflows/chat-ui/index.html +1 -1
  271. package/apps/pwa/out/workflows/chat-ui/index.txt +23 -23
  272. package/apps/pwa/out/workflows/index.html +1 -1
  273. package/apps/pwa/out/workflows/index.txt +23 -23
  274. package/apps/pwa/out/workspace/index.html +1 -1
  275. package/apps/pwa/out/workspace/index.txt +23 -23
  276. package/apps/pwa/out/worktrees/index.html +1 -1
  277. package/apps/pwa/out/worktrees/index.txt +23 -23
  278. package/graphs/drafts/recipes.yaml +27 -7
  279. package/graphs/work/draft-close.yaml +54 -0
  280. package/graphs/work/green-close.yaml +37 -0
  281. package/graphs/work/recipes.yaml +46 -1
  282. package/graphs/work/run-research.yaml +35 -0
  283. package/package.json +1 -1
  284. package/scripts/__fixtures__/authoring-paths-10x3.json +32 -0
  285. package/scripts/boundary-proof-mapping-audit.ts +88 -0
  286. package/scripts/codex-fallback-live-probe.ts +17 -15
  287. package/scripts/fleet/node-setup.sh +32 -2
  288. package/scripts/fleet/run-light-worker.sh +9 -0
  289. package/scripts/gate-0226-failure-census.ts +507 -0
  290. package/scripts/goals/authoring-metrics.ts +258 -0
  291. package/scripts/graph-units/draft-close-node.ts +222 -0
  292. package/scripts/hook-order-sweep.ts +7 -4
  293. package/scripts/land-global-checks.ts +69 -1
  294. package/scripts/measure-nl-routing-corpus.ts +207 -2
  295. package/scripts/release-loop/docs-node.ts +140 -0
  296. package/scripts/release-loop/gate-closure.ts +48 -0
  297. package/scripts/release-loop/gate-diff.ts +2 -1
  298. package/scripts/release-loop/known-issues-node.ts +6 -4
  299. package/scripts/release-loop/notes-repair.ts +216 -0
  300. package/scripts/release-loop/prepare-node.ts +61 -5
  301. package/scripts/release-loop/resume-release.ts +114 -4
  302. package/scripts/release-loop/resume-test-traffic.ts +10 -0
  303. package/scripts/release-loop/version-node.ts +81 -12
  304. package/scripts/train/green-leg.ts +176 -0
  305. package/scripts/tui-continue-real-evidence.ts +47 -0
  306. package/scripts/ux-sim.ts +1 -1
  307. package/src/acp/client.ts +31 -5
  308. package/src/acp/core-turn-bridge.ts +6 -0
  309. package/src/acp/stderr-summary.ts +49 -0
  310. package/src/agent/monad-agent-turn.ts +1 -0
  311. package/src/agent/terminal-surface.ts +217 -0
  312. package/src/agent-substrate/pr-reviewer.ts +11 -3
  313. package/src/agent-substrate/self-review-cli.ts +343 -31
  314. package/src/autopilot/lineage/sources.ts +1 -1
  315. package/src/autopilot/pr-manager.ts +64 -13
  316. package/src/boot/daemon-runtime.ts +35 -3
  317. package/src/boot/daemon-tools/pty-shell.ts +2 -1
  318. package/src/budget/run-usage-rollup.ts +12 -7
  319. package/src/budget/unified-usage.ts +20 -0
  320. package/src/capture/tui-self-report.ts +32 -3
  321. package/src/cli/autopilot-cli.ts +24 -9
  322. package/src/cli/decisions-cli.ts +7 -4
  323. package/src/cli/doctor-cli.ts +116 -7
  324. package/src/cli/logs-cli.ts +357 -2
  325. package/src/cli/memory-cli.ts +30 -1
  326. package/src/cli/msg-cli.ts +15 -11
  327. package/src/cli/pr-granularity.ts +5 -3
  328. package/src/cli/release-checklist-read-cli.ts +109 -4
  329. package/src/cli/release-cli.ts +43 -10
  330. package/src/cli/self-update.ts +23 -5
  331. package/src/cli/self-utterances-cli.ts +13 -16
  332. package/src/cli/tasks-cli.ts +309 -11
  333. package/src/cli/usage-cli.ts +12 -10
  334. package/src/context-bus/claude-memory-import.ts +99 -0
  335. package/src/context-bus/long-term-memory.ts +125 -0
  336. package/src/core-turn/run-goal-loop.ts +5 -2
  337. package/src/core-turn/types.ts +2 -0
  338. package/src/dashboard/chat/acp-chat.ts +9 -0
  339. package/src/dashboard/index.ts +97 -13
  340. package/src/dashboard/input/agent-wake.ts +43 -0
  341. package/src/dashboard/input/chat-main-acp-dispatch.ts +21 -1
  342. package/src/dashboard/replay-preview.ts +25 -0
  343. package/src/dashboard/slash-runtime/dashboard-handlers.ts +17 -8
  344. package/src/dashboard/synchronized-frame-output.ts +74 -0
  345. package/src/display/coordinator.ts +45 -12
  346. package/src/display/resize-listener.ts +41 -20
  347. package/src/display/synchronized-output-region.ts +60 -0
  348. package/src/domains/surface-events.ts +80 -1
  349. package/src/exec-requests/planner.ts +37 -2
  350. package/src/execution-loop/launch-gate.ts +4 -3
  351. package/src/git-fs/cli-stderr.ts +45 -0
  352. package/src/git-fs/gh-cli.ts +6 -3
  353. package/src/git-fs/git-cli.ts +11 -5
  354. package/src/graph-runner/graph-cli.ts +26 -2
  355. package/src/graph-runner/graph-run-api.ts +3 -2
  356. package/src/graph-runner/runner.ts +17 -5
  357. package/src/graph-wizard/generate.ts +29 -6
  358. package/src/harness/harness-cli-command.ts +179 -33
  359. package/src/harness/review-adapter.ts +26 -6
  360. package/src/index.ts +116 -13
  361. package/src/instance/test-write-guard-real-transport.fixture.ts +52 -0
  362. package/src/llm/route-decision.ts +13 -0
  363. package/src/llm-tool-name.ts +37 -0
  364. package/src/llm-tool-schema.ts +35 -0
  365. package/src/llm.ts +123 -11
  366. package/src/loops/checker.ts +100 -0
  367. package/src/loops/consensus.ts +26 -2
  368. package/src/loops/loop-cli.ts +9 -4
  369. package/src/loops/orchestrator/anomaly-cluster.ts +243 -0
  370. package/src/loops/orchestrator/tick.ts +49 -4
  371. package/src/model-tier/llm-tier-map.ts +12 -17
  372. package/src/msg/msg-store.ts +17 -0
  373. package/src/native-tool-catalog.ts +1 -1
  374. package/src/nexus/api/graph-wizard-api.ts +27 -2
  375. package/src/nexus/api/grid.ts +24 -4
  376. package/src/nexus/api/http-server.ts +1 -1
  377. package/src/nexus/api/ops-api.ts +14 -6
  378. package/src/nexus/state/state.ts +7 -1
  379. package/src/oauth/codex-account-store.ts +34 -1
  380. package/src/ops/loops-map.ts +46 -0
  381. package/src/ops/overview-cache.ts +22 -4
  382. package/src/ops/overview.ts +41 -5
  383. package/src/policy/llm-policy.ts +3 -1
  384. package/src/prompt-enhance/enhance.ts +4 -4
  385. package/src/pty-shell/availability.ts +7 -0
  386. package/src/pty-shell/herdr-agent-report.ts +40 -31
  387. package/src/pty-shell/herdr-prune-stale.ts +17 -0
  388. package/src/pty-shell/herdr-sequence-lease.ts +60 -0
  389. package/src/pty-shell/pty-control-ipc.ts +187 -18
  390. package/src/pty-shell/registry.ts +25 -15
  391. package/src/pty-shell/tui-run-state.ts +235 -1
  392. package/src/release-loop/checklist.ts +50 -5
  393. package/src/release-loop/feature-store.ts +9 -9
  394. package/src/release-loop/landed-but-yellow.ts +93 -12
  395. package/src/repl/index.ts +8 -0
  396. package/src/seat-loop/seat-report.ts +1 -0
  397. package/src/self-dev/ask-launch-flow.ts +86 -10
  398. package/src/self-dev/decompose-proposal.ts +29 -18
  399. package/src/self-dev/dev-pipeline.ts +29 -7
  400. package/src/self-dev/draft-sweep.ts +241 -16
  401. package/src/self-dev/draft-triage-rules.ts +19 -5
  402. package/src/self-dev/review-provider-fallback.ts +45 -7
  403. package/src/self-dev/shard-plan.ts +48 -0
  404. package/src/self-dev/shard-run.ts +50 -3
  405. package/src/self-implement/doctor-visit.ts +83 -0
  406. package/src/self-implement/gate-artifacts.ts +6 -2
  407. package/src/self-implement/gate-baseline.ts +64 -1
  408. package/src/self-implement/gate-cli.ts +93 -9
  409. package/src/self-implement/gate-remote.ts +28 -4
  410. package/src/self-implement/gate-scope.ts +13 -1
  411. package/src/self-implement/goal-author.ts +333 -18
  412. package/src/self-implement/goal-supervisor-fill.ts +75 -26
  413. package/src/self-implement/importer-test-index.ts +215 -2
  414. package/src/self-implement/knowhow-pack.ts +5 -5
  415. package/src/self-implement/orchestrator.ts +318 -25
  416. package/src/self-implement/review-round-brief.ts +300 -0
  417. package/src/self-implement/rework-policy.ts +14 -0
  418. package/src/self-implement/run-ledger.ts +170 -6
  419. package/src/self-implement/run-stop.ts +1 -1
  420. package/src/self-implement/running-runs.ts +17 -3
  421. package/src/self-implement/seams.ts +12 -6
  422. package/src/self-implement/stop-autoheal.ts +1 -0
  423. package/src/self-implement/test-seams.ts +13 -1
  424. package/src/self-implement/train-reach-grouping.ts +8 -2
  425. package/src/session/chat.ts +7 -1
  426. package/src/session/id-prefix.ts +60 -0
  427. package/src/session/index.ts +4 -0
  428. package/src/session-runtime/index.ts +9 -1
  429. package/src/skills/tools/pty.ts +5 -0
  430. package/src/status/metrics.ts +12 -1
  431. package/src/steward/rejudge-tick.ts +12 -5
  432. package/src/steward/resync-tick.ts +31 -4
  433. package/src/task-agent/actions.ts +199 -4
  434. package/src/task-agent/boundary-proof-mapping.ts +12 -0
  435. package/src/task-agent/boundary-proof-producer.ts +147 -0
  436. package/src/task-agent/completion-evidence.ts +2 -1
  437. package/src/task-agent/green-close-recipe.ts +239 -0
  438. package/src/task-agent/green-sweep.ts +64 -10
  439. package/src/task-agent/live-moves.ts +48 -3
  440. package/src/task-agent/map-host-adapter.ts +134 -0
  441. package/src/task-agent/map-reduce.ts +158 -0
  442. package/src/task-agent/map-run-ledger.ts +226 -0
  443. package/src/task-agent/parent-host.ts +21 -11
  444. package/src/task-agent/rejudge-on-head.ts +72 -5
  445. package/src/task-agent/repair-cycle.ts +41 -0
  446. package/src/task-agent/repair-next-move.ts +12 -2
  447. package/src/task-agent/review-prior-fix.ts +12 -2
  448. package/src/task-agent/shadow.ts +188 -5
  449. package/src/task-agent/task-hand.ts +158 -13
  450. package/src/task-agent/task-parent-role-llm.ts +9 -0
  451. package/src/task-agent/tier-split.ts +4 -3
  452. package/src/task-agent/work-order.ts +53 -2
  453. package/src/task-orchestrator/dispatcher.ts +46 -1
  454. package/src/task-orchestrator/generator-prompt.ts +6 -0
  455. package/src/task-orchestrator/surfaces/pod-artifact-return.ts +16 -6
  456. package/src/task-orchestrator/surfaces/pod-ledger-collect.ts +8 -6
  457. package/src/task-orchestrator/surfaces/pod-ledger-events.ts +97 -0
  458. package/src/task-orchestrator/surfaces/pod-pool.ts +50 -4
  459. package/src/task-orchestrator/surfaces/pod-warm-worker-provider.ts +15 -9
  460. package/src/task-orchestrator/surfaces/self-implement-pod.ts +217 -36
  461. package/src/task-orchestrator/surfaces/self-implement.ts +4 -0
  462. package/src/testing/linux-env.ts +177 -0
  463. package/src/tui/chat/goal-interim.ts +5 -1
  464. package/src/tui/entry.ts +258 -4
  465. package/src/tui/input/at-picker.ts +55 -0
  466. package/src/tui/slash/resume.ts +35 -12
  467. package/src/tui/slash/signals.ts +114 -0
  468. package/src/tui/slash/term-next.ts +71 -0
  469. package/src/tui-client/local-chat-turn.ts +4 -3
  470. package/src/user-config.ts +19 -1
  471. package/src/ux-sim/boot-daemon-tools-pty-shell-device.ts +136 -0
  472. package/src/ux-sim/classic-tui-seat-scenarios.ts +158 -4
  473. package/src/ux-sim/fake-gh.ts +174 -0
  474. package/src/ux-sim/fake-kubectl.ts +142 -0
  475. package/src/ux-sim/fake-llm.ts +6 -1
  476. package/src/ux-sim/next-tui-seat-scenarios.ts +124 -6
  477. package/src/ux-sim/resume-picker-device.ts +173 -0
  478. package/src/ux-sim/session-id-seed.ts +60 -0
  479. package/src/ux-sim/skills-tools-shell-device.ts +156 -0
  480. package/src/ux-sim/task-agent-parent-host-device.ts +264 -0
  481. package/src/ux-sim/task-agent-rejudge-on-head-device.ts +114 -0
  482. package/src/version/packed-revision.json +1 -1
  483. package/apps/pwa/out/_next/static/chunks/109.f196abf3484bb97f.js +0 -287
  484. package/apps/pwa/out/_next/static/chunks/1201.afbfc5b1c5e5cbe4.js +0 -1
  485. package/apps/pwa/out/_next/static/chunks/1517.9275b89572098ff3.js +0 -1
  486. package/apps/pwa/out/_next/static/chunks/1574.ad11f8db8396ab45.js +0 -1
  487. package/apps/pwa/out/_next/static/chunks/1614.7a8c5c40aee0261f.js +0 -1
  488. package/apps/pwa/out/_next/static/chunks/1871-f1eb29d8dbb4065b.js +0 -1
  489. package/apps/pwa/out/_next/static/chunks/2193.0ea24c4a7aa1d004.js +0 -36
  490. package/apps/pwa/out/_next/static/chunks/223-ad865c1e80491d78.js +0 -1
  491. package/apps/pwa/out/_next/static/chunks/2265-f0d90b6dbec05f81.js +0 -1
  492. package/apps/pwa/out/_next/static/chunks/2267.eb4a62a209f09ec4.js +0 -149
  493. package/apps/pwa/out/_next/static/chunks/2341-86cd06c0cf01aa33.js +0 -1
  494. package/apps/pwa/out/_next/static/chunks/2352.9abc42422bade876.js +0 -1
  495. package/apps/pwa/out/_next/static/chunks/2397-c1653a816061842d.js +0 -1
  496. package/apps/pwa/out/_next/static/chunks/2500.cbc1257b774aae52.js +0 -1
  497. package/apps/pwa/out/_next/static/chunks/2709.8e1889034255fc5f.js +0 -24
  498. package/apps/pwa/out/_next/static/chunks/2812ca6a.3b9f4a7a08885744.js +0 -1
  499. package/apps/pwa/out/_next/static/chunks/284.ac77c0db55bfd3a8.js +0 -1
  500. package/apps/pwa/out/_next/static/chunks/2941.3c3546f96bc6efa7.js +0 -1
  501. package/apps/pwa/out/_next/static/chunks/2976.b000698a3c6512dc.js +0 -24
  502. package/apps/pwa/out/_next/static/chunks/3031-85328a92fcce4da6.js +0 -1
  503. package/apps/pwa/out/_next/static/chunks/3148-98efd4869d660a87.js +0 -1
  504. package/apps/pwa/out/_next/static/chunks/3155.2587a55196ecb394.js +0 -226
  505. package/apps/pwa/out/_next/static/chunks/3277.785db1cf09f98601.js +0 -1
  506. package/apps/pwa/out/_next/static/chunks/3320-f9c77381f85a2c0a.js +0 -1
  507. package/apps/pwa/out/_next/static/chunks/3386-91049feabff9a94e.js +0 -1
  508. package/apps/pwa/out/_next/static/chunks/339.80afb7e8839372af.js +0 -8
  509. package/apps/pwa/out/_next/static/chunks/3538.a445e50bb359d068.js +0 -32
  510. package/apps/pwa/out/_next/static/chunks/3540c645.2595a6af01a97672.js +0 -1
  511. package/apps/pwa/out/_next/static/chunks/3621.581b2054cc14bee4.js +0 -286
  512. package/apps/pwa/out/_next/static/chunks/3676.8c28d16fd84ca843.js +0 -1
  513. package/apps/pwa/out/_next/static/chunks/375-b84540853523fe52.js +0 -1
  514. package/apps/pwa/out/_next/static/chunks/379.ee262e37586fe1ae.js +0 -74
  515. package/apps/pwa/out/_next/static/chunks/3969-81054381eaec4c4c.js +0 -1
  516. package/apps/pwa/out/_next/static/chunks/4067-bf9aa60547972937.js +0 -1
  517. package/apps/pwa/out/_next/static/chunks/4116.a84a92a2492c080e.js +0 -1
  518. package/apps/pwa/out/_next/static/chunks/4176.e5729c93c29151eb.js +0 -104
  519. package/apps/pwa/out/_next/static/chunks/4227-e6c84686bc8946ca.js +0 -1
  520. package/apps/pwa/out/_next/static/chunks/4327.b9e08a71c0009348.js +0 -1
  521. package/apps/pwa/out/_next/static/chunks/4946.bd106eafd668f248.js +0 -148
  522. package/apps/pwa/out/_next/static/chunks/5085-bce4904931767ca6.js +0 -1
  523. package/apps/pwa/out/_next/static/chunks/5125.2eb9968b83767193.js +0 -93
  524. package/apps/pwa/out/_next/static/chunks/5128-75b733fd74a9a1eb.js +0 -1
  525. package/apps/pwa/out/_next/static/chunks/5489f3fe.4bb1458b09f6dead.js +0 -122
  526. package/apps/pwa/out/_next/static/chunks/5560-2a4648f6a30f16e7.js +0 -1
  527. package/apps/pwa/out/_next/static/chunks/5772-e29e14f8ff127122.js +0 -1
  528. package/apps/pwa/out/_next/static/chunks/5887.5b2f5b44ce0f7e9a.js +0 -1
  529. package/apps/pwa/out/_next/static/chunks/5899-4c112a2d908cf97f.js +0 -1
  530. package/apps/pwa/out/_next/static/chunks/599.c39c571b6733f2a2.js +0 -41
  531. package/apps/pwa/out/_next/static/chunks/6041.1b65efb796ebc2a5.js +0 -79
  532. package/apps/pwa/out/_next/static/chunks/6057-765c0a26028c86b2.js +0 -1
  533. package/apps/pwa/out/_next/static/chunks/6142.f289e0d039f453a6.js +0 -1
  534. package/apps/pwa/out/_next/static/chunks/6199-6bcd61d2a3910e04.js +0 -1
  535. package/apps/pwa/out/_next/static/chunks/6236.cdf7293e710a9b2d.js +0 -1
  536. package/apps/pwa/out/_next/static/chunks/6387-237e079dac9a3ae6.js +0 -1
  537. package/apps/pwa/out/_next/static/chunks/6448-b6d272d074276e14.js +0 -1
  538. package/apps/pwa/out/_next/static/chunks/6566.926a1d1b7c911442.js +0 -1
  539. package/apps/pwa/out/_next/static/chunks/6580-cdc0e4a634ce4708.js +0 -1
  540. package/apps/pwa/out/_next/static/chunks/6659-b242dc31b20b3f29.js +0 -1
  541. package/apps/pwa/out/_next/static/chunks/6690.c5d9b321b1f79384.js +0 -1
  542. package/apps/pwa/out/_next/static/chunks/671-e9b6ad0c771c5514.js +0 -1
  543. package/apps/pwa/out/_next/static/chunks/6862.bcbf89dd0f4496b3.js +0 -27
  544. package/apps/pwa/out/_next/static/chunks/6912-7b375ee48732c767.js +0 -1
  545. package/apps/pwa/out/_next/static/chunks/6925.562d532110879886.js +0 -1
  546. package/apps/pwa/out/_next/static/chunks/727.7deb87749b0a343a.js +0 -1
  547. package/apps/pwa/out/_next/static/chunks/7545.b1aa42cd15503319.js +0 -1
  548. package/apps/pwa/out/_next/static/chunks/7551-416d298c2dc4a9ab.js +0 -1
  549. package/apps/pwa/out/_next/static/chunks/7784.1f0ac4a16d190cf4.js +0 -1
  550. package/apps/pwa/out/_next/static/chunks/7870-309de463786ac1fc.js +0 -1
  551. package/apps/pwa/out/_next/static/chunks/7888-e29b151bb6a3bb8b.js +0 -1
  552. package/apps/pwa/out/_next/static/chunks/7891.03f910124a737985.js +0 -1
  553. package/apps/pwa/out/_next/static/chunks/7905-6ba78d9234608f79.js +0 -1
  554. package/apps/pwa/out/_next/static/chunks/8037.e254fd797aa224d1.js +0 -1
  555. package/apps/pwa/out/_next/static/chunks/8207.f527886b7c464529.js +0 -1
  556. package/apps/pwa/out/_next/static/chunks/856.50bda61439d465e6.js +0 -62
  557. package/apps/pwa/out/_next/static/chunks/9031-92e9b487edb681ee.js +0 -1
  558. package/apps/pwa/out/_next/static/chunks/9060.5410d9f6a95f6287.js +0 -90
  559. package/apps/pwa/out/_next/static/chunks/914.8abefd48d579547b.js +0 -94
  560. package/apps/pwa/out/_next/static/chunks/9187-c87a2207d4ac5d46.js +0 -1
  561. package/apps/pwa/out/_next/static/chunks/9289.3e92f278821e18e0.js +0 -1
  562. package/apps/pwa/out/_next/static/chunks/9319.7816d3cc741cd34f.js +0 -1
  563. package/apps/pwa/out/_next/static/chunks/9327-e016bb9f1674d24f.js +0 -1
  564. package/apps/pwa/out/_next/static/chunks/9365.3de48bf75193ff9a.js +0 -77
  565. package/apps/pwa/out/_next/static/chunks/9383.5b5e9aa56b5fea97.js +0 -1
  566. package/apps/pwa/out/_next/static/chunks/9387-cb929573ef436f39.js +0 -1
  567. package/apps/pwa/out/_next/static/chunks/9489.c27becacc3283dec.js +0 -1
  568. package/apps/pwa/out/_next/static/chunks/9514.131c52cc75fe6439.js +0 -1
  569. package/apps/pwa/out/_next/static/chunks/9536.28962663c7734376.js +0 -1
  570. package/apps/pwa/out/_next/static/chunks/9686-12286f5bbf15a5a0.js +0 -1
  571. package/apps/pwa/out/_next/static/chunks/9776.289d40cc5a4c342a.js +0 -1
  572. package/apps/pwa/out/_next/static/chunks/9789.60f723d18097ec30.js +0 -1
  573. package/apps/pwa/out/_next/static/chunks/989.f0c17523c5e61f65.js +0 -1
  574. package/apps/pwa/out/_next/static/chunks/9972-1df393aa8d4f7d52.js +0 -1
  575. package/apps/pwa/out/_next/static/chunks/app/_not-found/page-96750aba7430959f.js +0 -1
  576. package/apps/pwa/out/_next/static/chunks/app/approvals/page-4105e5bbbb043024.js +0 -1
  577. package/apps/pwa/out/_next/static/chunks/app/autopilot/page-5d4fa75c2acb113e.js +0 -1
  578. package/apps/pwa/out/_next/static/chunks/app/board/page-a79a9bdb3b2142bf.js +0 -1
  579. package/apps/pwa/out/_next/static/chunks/app/botlab/page-f1c2047484992a35.js +0 -1
  580. package/apps/pwa/out/_next/static/chunks/app/bots/page-15ffc49b2d8c70e2.js +0 -1
  581. package/apps/pwa/out/_next/static/chunks/app/ceo/page-67d53a3fc8734135.js +0 -1
  582. package/apps/pwa/out/_next/static/chunks/app/chat/page-e30c8dc696491336.js +0 -1
  583. package/apps/pwa/out/_next/static/chunks/app/consult/page-2136e04fa77696e2.js +0 -1
  584. package/apps/pwa/out/_next/static/chunks/app/control/page-fecd2814790c2e12.js +0 -1
  585. package/apps/pwa/out/_next/static/chunks/app/decisions/page-280aa4a98fc5bb44.js +0 -1
  586. package/apps/pwa/out/_next/static/chunks/app/design-check/page-c14e96b65fb4b883.js +0 -1
  587. package/apps/pwa/out/_next/static/chunks/app/editor/page-187dac74825ed6bf.js +0 -1
  588. package/apps/pwa/out/_next/static/chunks/app/exec/page-6bc7246ea8c92448.js +0 -1
  589. package/apps/pwa/out/_next/static/chunks/app/field/page-083747f1d4518f61.js +0 -1
  590. package/apps/pwa/out/_next/static/chunks/app/healthz/route-96750aba7430959f.js +0 -1
  591. package/apps/pwa/out/_next/static/chunks/app/inside/page-15ca95a16ec96e1f.js +0 -1
  592. package/apps/pwa/out/_next/static/chunks/app/intake/page-a8ac031b3810eb64.js +0 -1
  593. package/apps/pwa/out/_next/static/chunks/app/layout-8835f93110494cda.js +0 -1
  594. package/apps/pwa/out/_next/static/chunks/app/loops/page-5b92b7f75df20948.js +0 -1
  595. package/apps/pwa/out/_next/static/chunks/app/market/page-468eddf2b1a84ecb.js +0 -1
  596. package/apps/pwa/out/_next/static/chunks/app/morning/page-18b40867a77a5793.js +0 -1
  597. package/apps/pwa/out/_next/static/chunks/app/not-found-fe934f2979f5a4a2.js +0 -1
  598. package/apps/pwa/out/_next/static/chunks/app/observatory/page-3eec435537357170.js +0 -1
  599. package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-ff88cbfd2aa99fc8.js +0 -1
  600. package/apps/pwa/out/_next/static/chunks/app/ops/release/page-a5b39fb780c70ab5.js +0 -1
  601. package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-ae465dde1d1b3933.js +0 -1
  602. package/apps/pwa/out/_next/static/chunks/app/outputs/page-e7abc34a48a6f71e.js +0 -1
  603. package/apps/pwa/out/_next/static/chunks/app/page-cab9674fde9ead26.js +0 -1
  604. package/apps/pwa/out/_next/static/chunks/app/reflection/page-1da49bc8712284d0.js +0 -1
  605. package/apps/pwa/out/_next/static/chunks/app/scheduler/page-5e8aa657551ac912.js +0 -1
  606. package/apps/pwa/out/_next/static/chunks/app/sessions/page-fcc36f36c6dc1fe2.js +0 -1
  607. package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-d22db22f2a7296ca.js +0 -1
  608. package/apps/pwa/out/_next/static/chunks/app/settings/page-d12dc7b1773878f0.js +0 -1
  609. package/apps/pwa/out/_next/static/chunks/app/setup/done/page-99debec9ea7fbec0.js +0 -1
  610. package/apps/pwa/out/_next/static/chunks/app/setup/layout-96750aba7430959f.js +0 -1
  611. package/apps/pwa/out/_next/static/chunks/app/setup/page-2a088a78bad7e924.js +0 -1
  612. package/apps/pwa/out/_next/static/chunks/app/share/page-2e8ed57db7e69993.js +0 -1
  613. package/apps/pwa/out/_next/static/chunks/app/showroom/page-4b3a16213c2ae8fe.js +0 -1
  614. package/apps/pwa/out/_next/static/chunks/app/tasks/page-f098747ddf38c98b.js +0 -1
  615. package/apps/pwa/out/_next/static/chunks/app/term/page-c15958835534404b.js +0 -1
  616. package/apps/pwa/out/_next/static/chunks/app/today/page-68279e3c843c1fd7.js +0 -1
  617. package/apps/pwa/out/_next/static/chunks/app/trace/page-a34a74453367a39d.js +0 -1
  618. package/apps/pwa/out/_next/static/chunks/app/vault/page-8767a7db2155a5bd.js +0 -1
  619. package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-bd5976683460d7f2.js +0 -1
  620. package/apps/pwa/out/_next/static/chunks/app/workflows/page-b7364835e7f2ef54.js +0 -1
  621. package/apps/pwa/out/_next/static/chunks/app/workspace/page-311af16b3ee0ffca.js +0 -1
  622. package/apps/pwa/out/_next/static/chunks/app/worktrees/page-fb670757274ae990.js +0 -1
  623. package/apps/pwa/out/_next/static/chunks/f9a61e4d.1fc2c1dbdd49fe46.js +0 -1
  624. package/apps/pwa/out/_next/static/chunks/framework-6d497cbf1eef04c6.js +0 -1
  625. package/apps/pwa/out/_next/static/chunks/main-app-012f5edec932f337.js +0 -1
  626. package/apps/pwa/out/_next/static/chunks/main-da5aeb809edc94a2.js +0 -1
  627. package/apps/pwa/out/_next/static/chunks/pages/_app-5ee319af6f749dfe.js +0 -1
  628. package/apps/pwa/out/_next/static/chunks/pages/_error-4bc84653a718d6c6.js +0 -1
  629. package/apps/pwa/out/_next/static/chunks/webpack-8a96cf6775c73d6e.js +0 -1
  630. /package/apps/pwa/out/_next/static/{uC-N0emedeNOFuaBQFv-I → 8kITumG9GAZ1LwT9POrAR}/_ssgManifest.js +0 -0
package/src/index.ts CHANGED
@@ -3919,8 +3919,11 @@ selfCmd
3919
3919
  .option('--json', '한 줄에 한 항목으로 재직렬화해 출력한다(원문 공백·빈 줄은 보존되지 않는다)')
3920
3920
  .option('--all', 'logs와 같은 전 인스턴스 연합 원장 조회를 한다')
3921
3921
  .option('--include-test', '--all 연합에 격리 test 인스턴스도 포함한다')
3922
- .action(async (runId: string, opts: { json?: boolean; all?: boolean; includeTest?: boolean }) => {
3923
- 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');
3924
3927
  try {
3925
3928
  const lookup = lookupRunLedger(runId, { all: opts.all, ...(opts.includeTest === undefined ? {} : { includeTest: opts.includeTest }) });
3926
3929
  if (lookup.matches.length === 0) {
@@ -3947,6 +3950,18 @@ selfCmd
3947
3950
  const match = lookup.matches[0]!;
3948
3951
  if (opts.json && match.skippedTrailingBytes !== undefined) console.error(`skipped incomplete trailing run ledger line: ${match.skippedTrailingBytes} bytes`);
3949
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
+ }
3950
3965
  if (opts.json) await writeStdoutJson(match.entries.map((entry) => JSON.stringify(entry)).join('\n') + '\n');
3951
3966
  else console.log(renderRunLedger(match.entries));
3952
3967
  } catch (error) {
@@ -4201,12 +4216,17 @@ selfCmd
4201
4216
  selfCmd
4202
4217
  .command('running-runs')
4203
4218
  .description('원장과 살아 있는 PTY를 함께 읽어 현재 자율 런 판정을 출력한다')
4219
+ .argument('[runId]', '같은 ID로 단일 런의 원본 완료 결과(kind·reason·next)를 재조회한다 (생략 시 전체)')
4204
4220
  .option('--json', '구조화된 JSON으로 출력한다')
4205
4221
  .option('--include-test', '연합 관측에 격리 test 인스턴스도 포함한다')
4206
- .action(async (opts: { json?: boolean; includeTest?: boolean }) => {
4222
+ .action(async (runId: string | undefined, opts: { json?: boolean; includeTest?: boolean }) => {
4207
4223
  try {
4208
4224
  const { queryRunningRuns, renderRunningRuns } = await import('./self-implement/running-runs.js');
4209
- 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
+ });
4210
4230
  const output = `${opts.json ? JSON.stringify(result) : renderRunningRuns(result)}\n`;
4211
4231
  await writeStdoutJson(output);
4212
4232
  } catch (error) {
@@ -4461,6 +4481,9 @@ selfCmd
4461
4481
  try {
4462
4482
  const { runGoalAuthorCli, formatGoalAuthorSelfInspection, formatGoalInterviewRound } = await import('./self-implement/goal-author-cli.js');
4463
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.
4464
4487
  const result = await runGoalAuthorCli(parts, { ...opts, selfResolveClarifications: true });
4465
4488
  console.log(result.path);
4466
4489
  // ⭐ grounding 상태를 함께 알린다 — 이 장치의 알려진 약점이 여기서 드러나야 한다.
@@ -4718,10 +4741,17 @@ selfCmd
4718
4741
  .option('--remote [host]', 'GATE-REMOTE — 같은 커밋을 원격 호스트(기본 config gateRemote.host=node-b)에서 돌리고 결과만 가져온다(깨끗한 트리 · --pr 은 로컬)')
4719
4742
  .option('--local', '원격 실행을 끄고 명시적으로 로컬에서 돌린다')
4720
4743
  .option('--artifact-dir <dir>', '조각별 지금/기준 JUnit ⊕ summary.json 을 이 디렉토리에 남긴다(판정 불변 · JUnit 은 --shards 경로만 · 원격 실행이면 그 호스트에서 가져온다)')
4721
- .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 }) => {
4722
4749
  if (!opts.changed && opts.shards === undefined) { ui.error('self gate requires --changed or --shards'); process.exitCode = 2; return; }
4723
4750
  if (opts.fixedShardDistribution && opts.shards === undefined) { ui.error('self gate: --fixed-shard-distribution requires --shards <n>'); process.exitCode = 2; return; }
4724
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; }
4725
4755
  // The root strips `--local` from argv anywhere (remote-bookmark attach · src/cli/remote-resolve.ts) before Commander
4726
4756
  // sees it, so this subcommand reads it from the untouched process.argv.
4727
4757
  opts.local = !!opts.local || process.argv.slice(2).includes('--local');
@@ -4766,12 +4796,23 @@ selfCmd
4766
4796
  remoteArtifacts = remoteCommitSupportsArtifactDir(repo) ? { dir: newRemoteArtifactDir() } : { unsupported: true };
4767
4797
  }
4768
4798
  // origin/main is pinned to this machine's origin/main on the host; any other base is passed as its resolved sha.
4769
- const remoteArgv = (sha: (ref: string) => string) => remoteSelfGateArgv({
4770
- changed: opts.changed, base: opts.base, shards, fixedShardDistribution: opts.fixedShardDistribution,
4771
- includeImporters: opts.includeImporters,
4772
- // A measured commit without this option rejects it (exit ≠ 0) — read as not passed, never as a silent measured run.
4773
- artifactDir: remoteArtifacts && 'dir' in remoteArtifacts ? remoteArtifacts.dir : undefined,
4774
- }, 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
+ };
4775
4816
  const { gateHostReservationRoot } = await import('./release-loop/gate-host-reservation.js');
4776
4817
  process.exitCode = await dispatchHeavyCheck({
4777
4818
  tool: 'self-gate', repo, installPwa: true, remoteArgv, refs: opts.base ? [opts.base] : [], reservationRoot: gateHostReservationRoot(),
@@ -6283,6 +6324,7 @@ selfCmd
6283
6324
  return { status: r.status, stdout: r.stdout ?? '', stderr: r.stderr ?? '' };
6284
6325
  },
6285
6326
  reviewPullRequest,
6327
+ reviewRepositoryPath: process.cwd(),
6286
6328
  readReferencedFile: createRepositoryReferencedFileReader(process.cwd()),
6287
6329
  renderReview,
6288
6330
  // ⛔⭐ 하드코딩 금지(🩸 2026-09-23 실측: 여기 'medium' 이 박혀 있었다) — 무인 리뷰와 «같은» 규칙.
@@ -7898,6 +7940,16 @@ const selfDevCmd = program
7898
7940
  // ⭐ 저작 «전»에 끊는다 — 100초를 쓰지 않는다. 우회는 --force-preflight 로 그대로 열려 있다.
7899
7941
  throw new DevPipelineError('저작 전 예비 검사에서 막혔다 — 위 이름을 확인하라 (우회: --force-preflight)');
7900
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
+ }
7901
7953
  askAuthoredFile = flowResult.goalFile;
7902
7954
  if (flowResult.kind === 'stopped-by-preflight') {
7903
7955
  releaseAuthoringLease();
@@ -12159,6 +12211,54 @@ export function rootResumeIdAt(rawArgs: readonly string[], resumeFlagIdx: number
12159
12211
  return next !== undefined && !next.startsWith('-') ? next : undefined;
12160
12212
  }
12161
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
+
12162
12262
  export function filterDashboardArgs(rawArgs: readonly string[], resumeFlagIdx?: number): string[] {
12163
12263
  const rootResumeFlagIdx = resumeFlagIdx ?? rawArgs.findIndex((arg, index) =>
12164
12264
  // ⛔ `-r` 은 «더 이상» resume 의 별칭이 아니다 — 원격 북마크(`--remote`)의 단축형이다.
@@ -12407,8 +12507,11 @@ async function main(): Promise<void> {
12407
12507
  // 명시 인자가 있으면 env 를 «읽지도» 않는다(폐기 경고가 명시 이어하기에 섞이지 않게).
12408
12508
  readEnvId: () => readDeprecatedEnvForResume('ELANOUS_RESUME_SESSION').value ?? null,
12409
12509
  latest: () => resolveLatestSessionId({
12410
- activeSessionId: () => getActiveSessionId(),
12411
- 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(),
12412
12515
  // TUI-H8-FOLLOW ① — 활성 표지가 사라진 세션이면 최신 세션으로(#28509 리뷰 should-fix).
12413
12516
  sessionExists: (id) => loadSession(id) !== null,
12414
12517
  }),
@@ -0,0 +1,52 @@
1
+ // Child fixture for test-write-guard.test.ts (TEST-PROD-LEAK-2 ledger): call-through wrappers installed over
2
+ // the ORIGINAL spill and send functions must not soften the outbound-alert guard. spillLongContent gets a
3
+ // mock.module call-through wrapper (not a fake — it delegates to the original) that counts operational S3
4
+ // upload attempts, and the original curl send primitive gets a bare pass-through spy that counts external
5
+ // sends. The refusal must fire BEFORE spillLongContent runs, so the ledger prints 0 s3Uploads and 0
6
+ // curlCalls alongside the refusal reason. Prints {refused, refusalReason, curlCalls, s3Uploads}.
7
+ import { mock, spyOn } from 'bun:test';
8
+ import * as childProcess from 'node:child_process';
9
+
10
+ // Pass-through wrapper over the original external-send primitive (curl via execFileSync), installed before
11
+ // outbound-alert is imported so even the module-load capture of the «real» sender sees a wrapper, not a fake.
12
+ const sendWrapper = spyOn(childProcess, 'execFileSync');
13
+
14
+ const spill = await import('../storage/content-spill.js');
15
+ const originalSpill = spill.spillLongContent;
16
+ let s3Uploads = 0;
17
+ await mock.module('../storage/content-spill.js', () => ({
18
+ ...spill,
19
+ spillLongContent: (...args: Parameters<typeof originalSpill>) => {
20
+ s3Uploads += 1; // every spill that reaches the original is an operational S3 upload attempt
21
+ return originalSpill(...args);
22
+ },
23
+ }));
24
+
25
+ const { sendTelegramDirect } = await import('../domains/outbound-alert.js');
26
+ const { getUserConfig } = await import('../user-config.js');
27
+ const base = getUserConfig();
28
+ const config = { ...base, telegram: { ...base.telegram, channels: undefined, botToken: '2:fake', homeChannel: 2 } } as typeof base;
29
+ type DirectDeps = NonNullable<Parameters<typeof sendTelegramDirect>[2]>;
30
+ const deps = { config } as DirectDeps;
31
+ // LEAK2_INJECT_SENDRAW=1 also injects a real (non-test-double) send transport into the delivery deps — a
32
+ // plain curl-invoking function, no mock scaffolding — so the companion ledger proves the guard refuses an
33
+ // injected external transport, not merely an empty one.
34
+ if (process.env.LEAK2_INJECT_SENDRAW === '1') {
35
+ (deps as { sendRaw?: (url: string) => string }).sendRaw = (url) =>
36
+ childProcess.execFileSync('curl', ['-sS', url], { encoding: 'utf8' }) as string;
37
+ // An injected transport turns the external branch off (:710 — a test double cannot target the ops
38
+ // universe), so the companion ledger proves the ops-routed branch: the routing roots resolve inside the
39
+ // ops universe, exactly as production does, and the guard refuses it faked or not.
40
+ const { EXTRA_OPS_ROOTS_ENV } = await import('../instance/test-write-guard.js');
41
+ const { getElanousConfigDir } = await import('../elanous-config-dir.js');
42
+ process.env[EXTRA_OPS_ROOTS_ENV] = getElanousConfigDir();
43
+ }
44
+ let refused = false;
45
+ let refusalReason = '';
46
+ try {
47
+ sendTelegramDirect('private-alert-body', 'ops-alert', deps);
48
+ } catch (e) {
49
+ refused = true;
50
+ refusalReason = e instanceof Error ? `${e.name}: ${e.message}` : String(e);
51
+ }
52
+ console.log(JSON.stringify({ refused, refusalReason, curlCalls: sendWrapper.mock.calls.length, s3Uploads }));
@@ -8,6 +8,7 @@
8
8
 
9
9
  import type { LLMProviderName, ReasoningLevel, LlmRoutePolicyConfig } from '../user-config.js';
10
10
  import { classifyMissionTier1, type MissionKind } from './mission-router.js';
11
+ import type { SessionSource } from '../session/index.js';
11
12
  import { lookupLlmTierSpec } from '../model-tier/llm-tier-map.js';
12
13
 
13
14
  export type RouteDecisionSource = 'explicit-pin' | 'codex-tier-policy' | 'legacy-default' | 'active-provider-default' | 'execution-backend';
@@ -111,6 +112,8 @@ export interface ResolveRouteDecisionInput {
111
112
  provider: LLMProviderName;
112
113
  configuredModel?: string;
113
114
  text: string;
115
+ /** Telegram keeps its non-deep coding tier; other surfaces retain the configured quick model. */
116
+ surface?: SessionSource;
114
117
  /** A per-turn/slash/user model choice. It always wins. */
115
118
  explicitModel?: string;
116
119
  routePolicy?: LlmRoutePolicyConfig;
@@ -145,6 +148,16 @@ export function resolveRouteDecision(input: ResolveRouteDecisionInput): RouteDec
145
148
  };
146
149
  }
147
150
  const policyMode = input.routePolicy?.mode;
151
+ // Unspecified callers keep the configured quick model for compatibility; Telegram alone owns the coding-tier exception.
152
+ if (input.provider === 'openai-codex' && input.surface !== 'telegram' && policyMode === undefined && mission === 'quick' && input.configuredModel) {
153
+ return {
154
+ provider: input.provider,
155
+ model: input.configuredModel,
156
+ source: 'active-provider-default',
157
+ rationale: 'configured model preserved for quick mission',
158
+ mission,
159
+ };
160
+ }
148
161
  if (input.provider === 'openai-codex' && policyMode !== 'active-provider') {
149
162
  const deep = mission === 'plan' || mission === 'review';
150
163
  const tier = deep ? 'best' : 'better';
@@ -0,0 +1,37 @@
1
+ /** Provider wire names have a deliberately smaller alphabet than MCP names.
2
+ * Keep the source name in the TUI/tool catalog and use this reversible map
3
+ * only for one provider request and its returned tool calls. */
4
+ export interface ProviderToolNameMap {
5
+ toProviderName(name: string): string;
6
+ toOriginalName(name: string): string;
7
+ }
8
+
9
+ export function sanitizeProviderToolName(name: string): string {
10
+ const sanitized = name.replace(/[^a-zA-Z0-9_-]/g, '_');
11
+ return sanitized.length > 0 ? sanitized : 'tool';
12
+ }
13
+
14
+ /** Build a deterministic, collision-free mapping for the complete request
15
+ * namespace. Repeated source names intentionally share one wire name. */
16
+ export function createProviderToolNameMap(names: readonly string[]): ProviderToolNameMap {
17
+ const originalToProvider = new Map<string, string>();
18
+ const providerToOriginal = new Map<string, string>();
19
+
20
+ for (const original of names) {
21
+ if (originalToProvider.has(original)) continue;
22
+
23
+ const base = sanitizeProviderToolName(original);
24
+ let candidate = base;
25
+ let suffix = 2;
26
+ while (providerToOriginal.has(candidate)) {
27
+ candidate = `${base}__${suffix++}`;
28
+ }
29
+ originalToProvider.set(original, candidate);
30
+ providerToOriginal.set(candidate, original);
31
+ }
32
+
33
+ return {
34
+ toProviderName: (name) => originalToProvider.get(name) ?? sanitizeProviderToolName(name),
35
+ toOriginalName: (name) => providerToOriginal.get(name) ?? name,
36
+ };
37
+ }
@@ -0,0 +1,35 @@
1
+ /** Convert legacy JSON Schema tuple `items` arrays to the modern
2
+ * `prefixItems` form used by Grok's OpenAI-compatible tool validator.
3
+ * Other schema keywords, including min/maxItems and coordinate constraints,
4
+ * are preserved recursively. */
5
+ export function sanitizeToolSchemaForGrok(schema: unknown): unknown {
6
+ if (Array.isArray(schema)) return schema.map(sanitizeToolSchemaForGrok);
7
+ if (!schema || typeof schema !== 'object') return schema;
8
+
9
+ const record = schema as Record<string, unknown>;
10
+ const tupleItems = Array.isArray(record.items) ? record.items : undefined;
11
+ const hasPrefixItems = Array.isArray(record.prefixItems);
12
+ const hasAdditionalItems = Object.prototype.hasOwnProperty.call(record, 'additionalItems');
13
+ const output: Record<string, unknown> = {};
14
+
15
+ for (const [key, value] of Object.entries(record)) {
16
+ if (key === 'additionalItems' || (key === 'items' && tupleItems)) continue;
17
+ output[key] = sanitizeToolSchemaForGrok(value);
18
+ }
19
+
20
+ if (tupleItems) {
21
+ output.prefixItems = tupleItems.map(sanitizeToolSchemaForGrok);
22
+ }
23
+ if (hasAdditionalItems && (tupleItems || hasPrefixItems)) {
24
+ output.items = sanitizeToolSchemaForGrok(record.additionalItems);
25
+ }
26
+
27
+ return output;
28
+ }
29
+
30
+ /** OpenRouter model ids may include the provider prefix; callers can pass
31
+ * either the catalog id or the already-normalized wire id. */
32
+ export function isOpenRouterGrokModel(model: string): boolean {
33
+ const wireModel = model.replace(/^openrouter\//i, '');
34
+ return /^x-ai\/grok(?:[-/]|$)/i.test(wireModel);
35
+ }
package/src/llm.ts CHANGED
@@ -3,7 +3,7 @@
3
3
  // Auto-routes based on model name prefix, or picks the first available provider.
4
4
 
5
5
  import { wellFormedLLMMessages } from './llm-wellformed.js';
6
- import { createHash } from 'node:crypto';
6
+ import { createHash, randomUUID } from 'node:crypto';
7
7
  import { testFakeLlmEnabled, testFakeLlmProvider } from './ux-sim/fake-llm.js';
8
8
  import { realpathSync } from 'node:fs';
9
9
  import { resolve } from 'node:path';
@@ -61,6 +61,8 @@ import { resolveModelAlias } from './intelligence-map/model-alias.js';
61
61
  import { BUILTIN_CATALOG, reasoningEffortCeiling as reasoningEffortCeilingOf } from './intelligence-map/model-catalog.js';
62
62
  import { inferProviderFromModel as registryInferProviderFromModel } from './registry/normalize.js';
63
63
  import { closestMatches } from './tool-name-suggest.js';
64
+ import { createProviderToolNameMap } from './llm-tool-name.js';
65
+ import { isOpenRouterGrokModel, sanitizeToolSchemaForGrok } from './llm-tool-schema.js';
64
66
  import { undoTurnRuntime } from './tool-runtime/undo-turn-runtime.js';
65
67
  import { listSnapshots } from './undo-turn/index.js';
66
68
  // Zero-dep spec module (no tool-runtime registry) — safe for this hot path.
@@ -276,6 +278,61 @@ export interface LLMToolSpec {
276
278
  parameters: Record<string, unknown>; // JSONSchema
277
279
  }
278
280
 
281
+ function toolUseNames(messages: readonly LLMMessage[]): string[] {
282
+ return messages.flatMap((message) => Array.isArray(message.content)
283
+ ? message.content.flatMap((block) => block.type === 'tool_use' ? [block.name] : [])
284
+ : []);
285
+ }
286
+
287
+ function mapProviderToolNamesInMessages(
288
+ messages: readonly LLMMessage[],
289
+ mapName: (name: string) => string,
290
+ ): LLMMessage[] {
291
+ return messages.map((message) => {
292
+ if (!Array.isArray(message.content)) return message;
293
+ let changed = false;
294
+ const content = message.content.map((block) => {
295
+ if (block.type !== 'tool_use') return block;
296
+ const name = mapName(block.name);
297
+ if (name === block.name) return block;
298
+ changed = true;
299
+ return { ...block, name };
300
+ });
301
+ return changed ? { ...message, content } : message;
302
+ });
303
+ }
304
+
305
+ function restoreProviderToolCallNames(
306
+ events: AsyncIterable<LLMStreamEvent>,
307
+ mapName: (name: string) => string,
308
+ ): AsyncIterableIterator<LLMStreamEvent> {
309
+ // Forward cancellation directly to the provider iterator. An async
310
+ // generator wrapper waits for a pending `next()` before servicing
311
+ // `return()`, which can strand the idle watchdog on a hanging stream.
312
+ const iterator = events[Symbol.asyncIterator]();
313
+ const mapped: AsyncIterableIterator<LLMStreamEvent> = {
314
+ [Symbol.asyncIterator]() { return mapped; },
315
+ async next(value?: unknown) {
316
+ const result = await iterator.next(value);
317
+ if (result.done) return { done: true, value: result.value };
318
+ const event = result.value;
319
+ return {
320
+ done: false,
321
+ value: event.type === 'tool_call' ? { ...event, name: mapName(event.name) } : event,
322
+ };
323
+ },
324
+ async return(value?: void) {
325
+ if (iterator.return) return iterator.return(value);
326
+ return { done: true, value };
327
+ },
328
+ async throw(error?: unknown) {
329
+ if (iterator.throw) return iterator.throw(error);
330
+ throw error;
331
+ },
332
+ };
333
+ return mapped;
334
+ }
335
+
279
336
  /** Events produced by a streaming provider call. Text deltas arrive
280
337
  * incrementally; tool_call events are emitted as COMPLETE units once
281
338
  * the provider finishes streaming the tool_use block — callers don't
@@ -359,6 +416,8 @@ export interface LLMOpts {
359
416
  usageRole?: ModelRole;
360
417
  /** Optional per-call metering phase; absent calls keep the existing ledger shape. */
361
418
  usagePhase?: string;
419
+ /** Optional per-call self-dev job kind; absent calls keep the existing ledger shape. */
420
+ usageJobKind?: string;
362
421
  /** Optional streamLLM usage-ledger site override (defaults to "stream-llm"). */
363
422
  usageSite?: string;
364
423
  /**
@@ -2556,7 +2615,7 @@ export function sanitizeToolSchemaForKimi(schema: unknown): unknown {
2556
2615
  ]));
2557
2616
  }
2558
2617
 
2559
- export function toOpenAITools(tools: LLMToolSpec[] | undefined, kimi = false): any[] | undefined {
2618
+ export function toOpenAITools(tools: LLMToolSpec[] | undefined, kimi = false, grokTupleItems = false): any[] | undefined {
2560
2619
  const unique = dedupeToolsByName(tools);
2561
2620
  if (!unique || unique.length === 0) return undefined;
2562
2621
  return unique.map(t => ({
@@ -2565,7 +2624,9 @@ export function toOpenAITools(tools: LLMToolSpec[] | undefined, kimi = false): a
2565
2624
  name: t.name, description: t.description,
2566
2625
  parameters: kimi
2567
2626
  ? sanitizeToolSchemaForKimi(strictifyToolSchema(t.parameters))
2568
- : strictifyToolSchema(t.parameters),
2627
+ : grokTupleItems
2628
+ ? sanitizeToolSchemaForGrok(strictifyToolSchema(t.parameters))
2629
+ : strictifyToolSchema(t.parameters),
2569
2630
  },
2570
2631
  }));
2571
2632
  }
@@ -4868,7 +4929,7 @@ export async function streamLLM(
4868
4929
  if (consumed.ok) {
4869
4930
  if (consumed.usage !== 'unmeasured') {
4870
4931
  try {
4871
- logAgentTurnUsage(activeModel, consumed.usage, { providerName: activeProvider.name, site: opts.usageSite ?? 'stream-llm', role: opts.usageRole, phase: opts.usagePhase });
4932
+ logAgentTurnUsage(activeModel, consumed.usage, { providerName: activeProvider.name, site: opts.usageSite ?? 'stream-llm', role: opts.usageRole, phase: opts.usagePhase, jobKind: opts.usageJobKind });
4872
4933
  } catch { /* best-effort observation */ }
4873
4934
  }
4874
4935
  debug.log('llm', 'outcome', { provider: activeProvider.name, status: 'ok', kind: 'streamLLM', durationMs: Date.now() - started });
@@ -8104,17 +8165,19 @@ export function billingRouteForProvider(provider: string | undefined, model: str
8104
8165
  }
8105
8166
 
8106
8167
  /** Observe usage with optional site/role metadata; a provider-name string remains supported. */
8107
- export function logAgentTurnUsage(model: string, usage: LLMUsage, providerNameOrOptions?: string | { providerName?: string; site?: string; role?: ModelRole; phase?: string }): void {
8168
+ export function logAgentTurnUsage(model: string, usage: LLMUsage, providerNameOrOptions?: string | { providerName?: string; site?: string; role?: ModelRole; phase?: string; jobKind?: string }): void {
8108
8169
  try {
8109
8170
  const providerName = typeof providerNameOrOptions === 'string' ? providerNameOrOptions : providerNameOrOptions?.providerName;
8110
8171
  const site = (typeof providerNameOrOptions === 'string' ? undefined : providerNameOrOptions?.site) ?? 'agent-turn';
8111
8172
  const role = typeof providerNameOrOptions === 'string' ? undefined : providerNameOrOptions?.role;
8112
8173
  const phase = typeof providerNameOrOptions === 'string' ? undefined : providerNameOrOptions?.phase;
8174
+ const jobKind = typeof providerNameOrOptions === 'string' ? undefined : providerNameOrOptions?.jobKind;
8113
8175
  const billing = billingRouteForProvider(providerName, model);
8114
8176
  debug.log('llm.usage', 'llm-usage', {
8115
8177
  site,
8116
8178
  ...(role !== undefined ? { role } : {}),
8117
8179
  ...(phase !== undefined ? { phase } : {}),
8180
+ ...(jobKind !== undefined ? { jobKind } : {}),
8118
8181
  model,
8119
8182
  ...(usage.provider !== undefined && { provider: usage.provider }),
8120
8183
  // ⭐ `provider` 는 «선 어댑터»(openai/anthropic)다 — 과금 주체는 별칭 칸으로(BACKLOG B10).
@@ -8241,6 +8304,10 @@ function applyCodexBehaviorGuard(
8241
8304
  return enabled;
8242
8305
  }
8243
8306
 
8307
+ function orchestrationId(): string {
8308
+ return randomUUID();
8309
+ }
8310
+
8244
8311
  export async function streamLLMWithTools(
8245
8312
  messages: LLMMessage[],
8246
8313
  handlers: StreamWithToolsHandlers,
@@ -8261,10 +8328,13 @@ export async function streamLLMWithTools(
8261
8328
  let blockedProviders: ProviderFallbackAttempt[] = [];
8262
8329
  const effectiveModel = activeModel;
8263
8330
  const modelFamily = getModelFamily(effectiveModel);
8331
+ const orchestration = orchestrationId();
8332
+ const followupHardStopStats = { wouldBlock: 0, blocked: 0 };
8264
8333
  // Preserve pre-existing GPT-6 behavior while observing Codex-only sites.
8265
8334
  const codexBehaviorGuards = usesCodexBehaviorGuards(effectiveModel);
8266
8335
  const codexGuardCandidate = codexBehaviorGuards || isGpt6GenerationModel(effectiveModel);
8267
8336
  debug.log('llm.router', 'streamLLMWithTools', {
8337
+ orchestrationId: orchestration,
8268
8338
  provider: provider.name,
8269
8339
  model: effectiveModel,
8270
8340
  modelFamily,
@@ -8821,7 +8891,28 @@ export async function streamLLMWithTools(
8821
8891
  debug.log('llm.request', 'lone-surrogate-fixed', { site: 'tool-loop', provider: activeProvider.name, messages: wf.fixedMessages, strings: wf.fixedStrings }, { level: 'warn' });
8822
8892
  history.splice(0, history.length, ...wf.messages);
8823
8893
  }
8824
- streamIter = activeProvider.streamChat!(history, turnOpts)[Symbol.asyncIterator]();
8894
+ // Provider function names have a narrower wire alphabet than MCP
8895
+ // names. Keep catalog/history names canonical inside the tool loop,
8896
+ // and translate only this request plus the corresponding response.
8897
+ const nameMap = createProviderToolNameMap([
8898
+ ...(turnOpts.tools ?? []).map((tool) => tool.name),
8899
+ ...toolUseNames(history),
8900
+ ...(turnOpts.toolChoice && typeof turnOpts.toolChoice === 'object'
8901
+ ? [turnOpts.toolChoice.name]
8902
+ : []),
8903
+ ]);
8904
+ const providerOpts: LLMOpts = {
8905
+ ...turnOpts,
8906
+ tools: turnOpts.tools?.map((tool) => ({ ...tool, name: nameMap.toProviderName(tool.name) })),
8907
+ toolChoice: turnOpts.toolChoice && typeof turnOpts.toolChoice === 'object'
8908
+ ? { name: nameMap.toProviderName(turnOpts.toolChoice.name) }
8909
+ : turnOpts.toolChoice,
8910
+ };
8911
+ const providerMessages = mapProviderToolNamesInMessages(history, nameMap.toProviderName);
8912
+ streamIter = restoreProviderToolCallNames(
8913
+ activeProvider.streamChat!(providerMessages, providerOpts),
8914
+ nameMap.toOriginalName,
8915
+ )[Symbol.asyncIterator]();
8825
8916
  }
8826
8917
  step = await Promise.race([
8827
8918
  streamIter.next().then((r) => ({ idle: false as const, r })),
@@ -8998,7 +9089,7 @@ export async function streamLLMWithTools(
8998
9089
  // ⭐ 주 에이전트 턴의 토큰·비용을 «게이트 없이» 남긴다(2026-09-24 실측: 이 줄이 없어 3시간 `llm.usage`
8999
9090
  // 18행이 전부 곁가지 두 자리였고, 하니스 런 비용의 거의 전부가 관측 밖이었다). 곁가지와 같은 모양 ·
9000
9091
  // 모르는 모델은 금액 대신 `cost.kind='unknown'`. runId 는 debug.log 가 붙인다. 실패해도 턴은 계속.
9001
- logAgentTurnUsage(activeModel, ev.usage, { providerName: activeProvider.name, role: opts.usageRole, phase: opts.usagePhase });
9092
+ logAgentTurnUsage(activeModel, ev.usage, { providerName: activeProvider.name, role: opts.usageRole, phase: opts.usagePhase, jobKind: opts.usageJobKind });
9002
9093
  // Wave A1 (2026-05-04) — turn-level cache hit rate forensic.
9003
9094
  // Each provider's usage event carries inputTokens / outputTokens
9004
9095
  // / cacheReadInputTokens (when cache hit). Emit the per-turn
@@ -9388,13 +9479,23 @@ export async function streamLLMWithTools(
9388
9479
  // done, just write the answer" UX which we must not preempt.
9389
9480
  const codexImmediateInspectActionStop = followupInspectActionHeld && followupHardStopEnabled;
9390
9481
  if (followupHardStopHeld) {
9391
- noteGpt6CodexGuard('followup-hard-stop', effectiveModel,
9392
- (codexImmediateInspectStop && codexInspectSynthesisGrace <= 0)
9482
+ const followupHardStopBlocked = (codexImmediateInspectStop && codexInspectSynthesisGrace <= 0)
9393
9483
  || (codexImmediateRepairStop && codexRepairActionGrace <= 0)
9394
- || (codexImmediateInspectActionStop && codexInspectActionGrace <= 0));
9484
+ || (codexImmediateInspectActionStop && codexInspectActionGrace <= 0);
9485
+ noteGpt6CodexGuard('followup-hard-stop', effectiveModel, followupHardStopBlocked);
9486
+ if (isGpt6GenerationModel(effectiveModel)) {
9487
+ followupHardStopStats.wouldBlock++;
9488
+ if (followupHardStopBlocked) followupHardStopStats.blocked++;
9489
+ debug.log('llm.router', 'tool-loop.followup-hard-stop.guard-observed', {
9490
+ orchestrationId: orchestration,
9491
+ guard: 'followup-hard-stop',
9492
+ ...followupHardStopStats,
9493
+ });
9494
+ }
9395
9495
  }
9396
9496
  if (codexImmediateInspectStop && codexInspectSynthesisGrace <= 0) {
9397
9497
  debug.log('llm.router', 'tool-loop.inspect-synthesis-phase.codex-immediate-stop', {
9498
+ orchestrationId: orchestration,
9398
9499
  turn,
9399
9500
  maxTurns,
9400
9501
  autoNarrowedReadCount,
@@ -11399,7 +11500,12 @@ function makeOpenAICompatProvider(
11399
11500
  throw new Error(`${name} unavailable: configure apiKey via \`elanous setup\``);
11400
11501
  }
11401
11502
  const activeModel = opts.model || model;
11402
- const tools = toOpenAITools(opts.tools, name === 'openrouter' && openRouterNeedsKimiToolSchema(openRouterWireModel(activeModel)));
11503
+ const wireModel = name === 'openrouter' ? openRouterWireModel(activeModel) : activeModel;
11504
+ const tools = toOpenAITools(
11505
+ opts.tools,
11506
+ name === 'openrouter' && openRouterNeedsKimiToolSchema(wireModel),
11507
+ name === 'openrouter' && isOpenRouterGrokModel(wireModel),
11508
+ );
11403
11509
  const deepSeek = name === 'openrouter' && isOpenRouterDeepSeekWireModel(openRouterWireModel(activeModel));
11404
11510
  // OR-TOOLCHOICE-PASS (2026-10-10) — OpenRouter 경로만 호출자 toolChoice 를 싣는다.
11405
11511
  // ⛔ grok/openai 호환 경로는 손대지 않는다(무회귀). toolChoice 가 없거나 tools 가 없으면 키 자체를 안 싣는다.
@@ -12026,6 +12132,12 @@ const OPENROUTER_ROUTE_FOR_WIP_PROVIDER = {
12026
12132
  glm: 'openrouter/z-ai/glm-5.3',
12027
12133
  } as const;
12028
12134
 
12135
+ /** Resolve a review model shortcut before either provider inference or the wire call. */
12136
+ export function resolveReviewModelAlias(model: string): string {
12137
+ const resolved = resolveModelAlias(model.trim())!;
12138
+ return OPENROUTER_ROUTE_FOR_WIP_PROVIDER[resolved.toLowerCase() as keyof typeof OPENROUTER_ROUTE_FOR_WIP_PROVIDER] ?? resolved;
12139
+ }
12140
+
12029
12141
  /** Top-level resolver. Honors user-config first; falls through to
12030
12142
  * env-var / auto-detect when provider is 'auto'. */
12031
12143
  export function getProviderForConfig(